From d5c0c691585affd3d775a93afe9773ac343ef1c3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Jan 2018 14:14:55 -0500 Subject: [PATCH 001/741] Updated docs --- .../Cryptography/WindowsSecureMimeContext.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 2fa96705d8..e13a6bb4da 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -638,12 +638,12 @@ DigitalSignatureCollection GetDigitalSignatures (SignedCms signed) /// -or- /// is null. /// - /// - /// An error occurred in the cryptographic message syntax subsystem. - /// /// /// The operation was cancelled via the cancellation token. /// + /// + /// An error occurred in the cryptographic message syntax subsystem. + /// public override DigitalSignatureCollection Verify (Stream content, Stream signatureData, CancellationToken cancellationToken = default (CancellationToken)) { if (content == null) @@ -675,12 +675,12 @@ DigitalSignatureCollection GetDigitalSignatures (SignedCms signed) /// -or- /// is null. /// - /// - /// An error occurred in the cryptographic message syntax subsystem. - /// /// /// The operation was cancelled via the cancellation token. /// + /// + /// An error occurred in the cryptographic message syntax subsystem. + /// public override async Task VerifyAsync (Stream content, Stream signatureData, CancellationToken cancellationToken = default (CancellationToken)) { if (content == null) @@ -713,12 +713,12 @@ DigitalSignatureCollection GetDigitalSignatures (SignedCms signed) /// /// The extracted content could not be parsed as a MIME entity. /// - /// - /// An error occurred in the cryptographic message syntax subsystem. - /// /// /// The operation was cancelled via the cancellation token. /// + /// + /// An error occurred in the cryptographic message syntax subsystem. + /// public override DigitalSignatureCollection Verify (Stream signedData, out MimeEntity entity, CancellationToken cancellationToken = default (CancellationToken)) { if (signedData == null) @@ -754,12 +754,12 @@ DigitalSignatureCollection GetDigitalSignatures (SignedCms signed) /// /// is null. /// - /// - /// An error occurred in the cryptographic message syntax subsystem. - /// /// /// The operation was cancelled via the cancellation token. /// + /// + /// An error occurred in the cryptographic message syntax subsystem. + /// public override Stream Verify (Stream signedData, out DigitalSignatureCollection signatures, CancellationToken cancellationToken = default (CancellationToken)) { if (signedData == null) @@ -1173,7 +1173,7 @@ public override void Import (Stream stream, string password) /// /// A certificate for one or more of the could not be found. /// - /// + /// /// An error occurred in the cryptographic message syntax subsystem. /// public override MimePart Export (IEnumerable mailboxes) From a5116b4ed085b456f234ee800b51ea9839247434 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Jan 2018 14:15:08 -0500 Subject: [PATCH 002/741] Fixed TemporarySecureMimeContext to key off the certificate's fingerprint --- .../TemporarySecureMimeContext.cs | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 6ea222a295..2bca025822 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -46,8 +46,8 @@ namespace MimeKit.Cryptography { /// public class TemporarySecureMimeContext : BouncyCastleSecureMimeContext { - readonly Dictionary capabilities; - readonly Dictionary keys; + readonly Dictionary capabilities; + readonly Dictionary keys; readonly List certificates; readonly List crls; @@ -59,8 +59,8 @@ public class TemporarySecureMimeContext : BouncyCastleSecureMimeContext /// public TemporarySecureMimeContext () { - capabilities = new Dictionary (); - keys = new Dictionary (); + capabilities = new Dictionary (); + keys = new Dictionary (); certificates = new List (); crls = new List (); } @@ -139,9 +139,10 @@ protected override X509Certificate GetCertificate (IX509Selector selector) protected override AsymmetricKeyParameter GetPrivateKey (IX509Selector selector) { foreach (var certificate in certificates) { + var fingerprint = certificate.GetFingerprint (); AsymmetricKeyParameter key; - if (!keys.TryGetValue (certificate, out key)) + if (!keys.TryGetValue (fingerprint, out key)) continue; if (selector != null && !selector.Match (certificate)) @@ -284,7 +285,7 @@ protected override CmsRecipient GetCmsRecipient (MailboxAddress mailbox) var recipient = new CmsRecipient (certificate); EncryptionAlgorithm[] algorithms; - if (capabilities.TryGetValue (certificate, out algorithms)) + if (capabilities.TryGetValue (certificate.GetFingerprint (), out algorithms)) recipient.EncryptionAlgorithms = algorithms; return recipient; @@ -303,12 +304,12 @@ X509Certificate GetCmsSignerCertificate (MailboxAddress mailbox, out AsymmetricK if (keyUsage != 0 && (keyUsage & DigitalSignatureKeyUsageFlags) == 0) continue; - if (!keys.TryGetValue (certificate, out key)) + var fingerprint = certificate.GetFingerprint (); + + if (!keys.TryGetValue (fingerprint, out key)) continue; if (secure != null) { - var fingerprint = certificate.GetFingerprint (); - if (!fingerprint.Equals (secure.Fingerprint, StringComparison.OrdinalIgnoreCase)) continue; } else { @@ -366,7 +367,7 @@ protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorit /// The timestamp. protected override void UpdateSecureMimeCapabilities (X509Certificate certificate, EncryptionAlgorithm[] algorithms, DateTime timestamp) { - capabilities[certificate] = algorithms; + capabilities[certificate.GetFingerprint ()] = algorithms; } /// @@ -400,7 +401,8 @@ public override void Import (Stream stream, string password) for (int i = 0; i < chain.Length; i++) certificates.Add (chain[i].Certificate); - keys.Add (chain[0].Certificate, entry.Key); + var fingerprint = chain[0].Certificate.GetFingerprint (); + keys.Add (fingerprint, entry.Key); } else if (pkcs12.IsCertificateEntry (alias)) { var entry = pkcs12.GetCertificate (alias); certificates.Add (entry.Certificate); From e02f0c3fec111b84053c33e02c526fb02ca80528 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Jan 2018 15:49:03 -0500 Subject: [PATCH 003/741] Updated docs --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index e13a6bb4da..683cc68b69 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -379,8 +379,9 @@ protected virtual RealCmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgo /// /// /// Updates the known S/MIME capabilities of the client used by the recipient that owns the specified certificate. - /// This method is called from , allowing custom implementations - /// to update the X.509 certificate records with the list of preferred encryption algorithms specified by the sending client. + /// This method is called when decoding digital signatures that include S/MIME capabilities in the metadata, allowing custom + /// implementations to update the X.509 certificate records with the list of preferred encryption algorithms specified by the + /// sending client. /// /// The certificate. /// The encryption algorithm capabilities of the client (in preferred order). From a37ab26b9fa704dc7be412f12837a7a47676b1ff Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Jan 2018 15:54:44 -0500 Subject: [PATCH 004/741] Updated copyright --- License.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/License.md b/License.md index 5810935a00..c5632184c0 100644 --- a/License.md +++ b/License.md @@ -1,6 +1,6 @@ ## License Information -MimeKit is Copyright (C) 2012-2016 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2018 Xamarin Inc. and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ea33b100be..5390c05cb9 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ How does your MIME parser compare? ## License Information -MimeKit is Copyright (C) 2012-2017 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2018 Xamarin Inc. and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From fd405f4e5df4e63c10b4c929b12819b89b924fc7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Jan 2018 20:36:59 -0500 Subject: [PATCH 005/741] Added MessageDeliveryStatus example docs --- .../Examples/MessageDeliveryStatusExample.cs | 86 +++++++++++++++++++ MimeKit/MessageDeliveryStatus.cs | 6 ++ MimeKit/MultipartReport.cs | 6 ++ 3 files changed, 98 insertions(+) create mode 100644 Documentation/Examples/MessageDeliveryStatusExample.cs diff --git a/Documentation/Examples/MessageDeliveryStatusExample.cs b/Documentation/Examples/MessageDeliveryStatusExample.cs new file mode 100644 index 0000000000..8658655842 --- /dev/null +++ b/Documentation/Examples/MessageDeliveryStatusExample.cs @@ -0,0 +1,86 @@ +// +// MessageDeliveryStatusExamples.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Linq; + +using MimeKit; + +namespace MimeKit.Examples { + public static class MessageDeliveryStatusExamples + { + #region ProcessDeliveryStatusNotification + public void ProcessDeliveryStatusNotification (MimeMessage message) + { + var report = message.Body as MultipartReport; + + if (report == null || report.ReportType == null || !report.ReportType.Equals ("delivery-status", StringComparison.OrdinalIgnoreCase)) { + // this is not a delivery status notification message... + return; + } + + // process the report + foreach (var mds in report.OfType ()) { + // process the status groups - each status group represents a different recipient + + // The first status group contains information about the message + var envelopeId = mds.StatusGroups[0]["Original-Envelope-Id"]; + + // all of the other status groups contain per-recipient information + for (int i = 1; i < mds.StatusGroups.Length; i++) { + var recipient = mds.StatusGroups[i]["Original-Recipient"]; + var action = mds.StatusGroups[i]["Action"]; + + if (recipient == null) + recipient = mds.StatusGroups[i]["Final-Recipient"]; + + // the recipient string should be in the form: "rfc822;user@domain.com" + var index = recipient.IndexOf (';'); + var address = recipient.Substring (index + 1); + + switch (action) { + case "failed": + Console.WriteLine ("Delivery of message {0} failed for {1}", envelopeId, address); + break; + case "delayed": + Console.WriteLine ("Delivery of message {0} has been delayed for {1}", envelopeId, address); + break; + case "delivered": + Console.WriteLine ("Delivery of message {0} has been delivered to {1}", envelopeId, address); + break; + case "relayed": + Console.WriteLine ("Delivery of message {0} has been relayed for {1}", envelopeId, address); + break; + case "expanded": + Console.WriteLine ("Delivery of message {0} has been delivered to {1} and relayed to the the expanded recipients", envelopeId, address); + break; + } + } + } + } + #endregion + } +} diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index 89764b5aed..2b2f6cd1ba 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -37,6 +37,9 @@ namespace MimeKit { /// delivery status of a message and has a MIME-type of message/delivery-status. /// For more information, see rfc3464. /// + /// + /// + /// public class MessageDeliveryStatus : MimePart { HeaderListCollection groups; @@ -79,6 +82,9 @@ public MessageDeliveryStatus () : base ("message", "delivery-status") /// Section 2.3 defines /// the per-recipient fields. /// + /// + /// + /// /// The fields. public HeaderListCollection StatusGroups { get { diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index 142b7a344d..c0eb02c1c2 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -34,6 +34,9 @@ namespace MimeKit { /// A multipart/related MIME entity is a general container part for electronic mail /// reports of any kind. /// + /// + /// + /// public class MultipartReport : Multipart { /// @@ -100,6 +103,9 @@ public MultipartReport (string reportType) : base ("report") /// The report type should be the subtype of the second /// of the multipart/report. /// + /// + /// + /// /// The type of the report. /// /// is null. From 963041dd2e5517311b7af56e5b6c92554423471e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Jan 2018 21:54:17 -0500 Subject: [PATCH 006/741] Added example code to a bunch more docs --- MimeKit/AttachmentCollection.cs | 6 ++ MimeKit/BodyBuilder.cs | 21 +++++++ MimeKit/ContentEncoding.cs | 56 ++++++------------- MimeKit/Cryptography/IDkimPublicKeyLocator.cs | 7 ++- MimeKit/Cryptography/SecureMailboxAddress.cs | 4 +- MimeKit/MessageDeliveryStatus.cs | 1 + MimeKit/MessageDispositionNotification.cs | 1 + MimeKit/MimeEntity.cs | 3 + MimeKit/MimeIterator.cs | 15 +++++ MimeKit/MultipartRelated.cs | 9 +++ MimeKit/MultipartReport.cs | 2 + 11 files changed, 81 insertions(+), 44 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index b4291440bd..1887b15a5a 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -39,6 +39,9 @@ namespace MimeKit { /// /// The is only used when building a message body with a . /// + /// + /// + /// public class AttachmentCollection : IList { readonly List attachments; @@ -406,6 +409,9 @@ public MimeEntity Add (string fileName, ContentType contentType) /// /// Adds the specified file as an attachment. /// + /// + /// + /// /// The newly added attachment . /// The name of the file. /// diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index 6b81e45052..f5c1118d58 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -33,6 +33,9 @@ namespace MimeKit { /// /// is a helper class for building common MIME body structures. /// + /// + /// + /// public class BodyBuilder { /// @@ -41,6 +44,9 @@ public class BodyBuilder /// /// Creates a new . /// + /// + /// + /// public BodyBuilder () { LinkedResources = new AttachmentCollection (true); @@ -53,6 +59,9 @@ public BodyBuilder () /// /// Represents a collection of file attachments that will be included in the message. /// + /// + /// + /// /// The attachments. public AttachmentCollection Attachments { get; private set; @@ -64,6 +73,9 @@ public AttachmentCollection Attachments { /// /// Linked resources are a special type of attachment which are linked to from the . /// + /// + /// + /// /// The linked resources. public AttachmentCollection LinkedResources { get; private set; @@ -75,6 +87,9 @@ public AttachmentCollection LinkedResources { /// /// Represents the plain-text formatted version of the message body. /// + /// + /// + /// /// The text body. public string TextBody { get; set; @@ -86,6 +101,9 @@ public string TextBody { /// /// Represents the html formatted version of the message body and may link to any of the . /// + /// + /// + /// /// The html body. public string HtmlBody { get; set; @@ -99,6 +117,9 @@ public string HtmlBody { /// and into the proper MIME structure suitable for display in many common /// mail clients. /// + /// + /// + /// /// The message body. public MimeEntity ToMessageBody () { diff --git a/MimeKit/ContentEncoding.cs b/MimeKit/ContentEncoding.cs index b2d30218d4..74e6d9e887 100644 --- a/MimeKit/ContentEncoding.cs +++ b/MimeKit/ContentEncoding.cs @@ -27,13 +27,13 @@ namespace MimeKit { /// /// An enumeration of all supported content transfer encodings. - /// . /// /// /// Some older mail software is unable to properly deal with /// data outside of the ASCII range, so it is sometimes /// necessary to encode the content of MIME entities. /// + /// public enum ContentEncoding { /// /// The default encoding (aka no encoding at all). @@ -41,65 +41,43 @@ public enum ContentEncoding { Default, /// - /// The 7bit content transfer encoding. - /// - /// - /// This encoding should be restricted to textual content + /// The 7bit content transfer encoding. This encoding should be restricted to textual content /// in the US-ASCII range. - /// + /// SevenBit, /// - /// The 8bit content transfer encoding. + /// The 8bit content transfer encoding. This encoding should be restricted to textual content + /// outside of the US-ASCII range but may not be supported by all transport services such as + /// older SMTP servers that do not support the 8BITMIME extension. /// - /// - /// This encoding should be restricted to textual content - /// outside of the US-ASCII range but may not be supported - /// by all transport services such as older SMTP servers - /// that do not support the 8BITMIME extension. - /// EightBit, /// - /// The binary content transfer encoding. + /// The binary content transfer encoding. This encoding is simply unencoded binary data. Typically + /// not supported by standard message transport services such as SMTP. /// - /// - /// This encoding is simply unencoded binary data. Typically not - /// supported by standard message transport services such as SMTP. - /// Binary, /// - /// The base64 content transfer encoding. - /// . + /// The base64 content transfer encoding. This encoding is typically used for encoding binary data + /// or textual content in a largely 8bit charset encoding and is supported by all message transport + /// services. /// - /// - /// This encoding is typically used for encoding binary data - /// or textual content in a largely 8bit charset encoding and - /// is supported by all message transport services. - /// Base64, /// - /// The quoted printable content transfer encoding. - /// . + /// The quoted-printable content transfer encoding. This encoding is used for textual content that + /// is in a charset that has a minority of characters outside of the US-ASCII range (such as + /// ISO-8859-1 and other single-byte charset encodings) and is supported by all message transport + /// services. /// - /// - /// This encoding is used for textual content that is in a charset - /// that has a minority of characters outside of the US-ASCII range - /// (such as ISO-8859-1 and other single-byte charset encodings) and - /// is supported by all message transport services. - /// QuotedPrintable, /// - /// The uuencode content transfer encoding. - /// . - /// - /// - /// This is an obsolete encoding meant for encoding binary + /// The uuencode content transfer encoding. This is an obsolete encoding meant for encoding binary /// data and has largely been superceeded by . - /// + /// UUEncode, } } diff --git a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs index 151ded7ad9..07b0628f43 100644 --- a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs +++ b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs @@ -37,11 +37,12 @@ namespace MimeKit.Cryptography { /// An interface for a service which locates and retrieves DKIM public keys (probably via DNS). /// Since MimeKit itself does not implement DNS, it is up to the client to implement public key lookups /// via DNS. - /// /// /// /// /// + /// + /// public interface IDkimPublicKeyLocator { /// @@ -49,11 +50,11 @@ public interface IDkimPublicKeyLocator /// /// /// Locates and retrieves the public key for the given domain and selector. - /// /// /// /// /// + /// /// The public key. /// A colon-separated list of query methods used to retrieve the public key. The default is "dns/txt". /// The domain. @@ -66,11 +67,11 @@ public interface IDkimPublicKeyLocator /// /// /// Locates and retrieves the public key for the given domain and selector. - /// /// /// /// /// + /// /// The public key. /// A colon-separated list of query methods used to retrieve the public key. The default is "dns/txt". /// The domain. diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index 0dec732e15..46b1999a68 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -206,13 +206,13 @@ static void ValidateFingerprint (string fingerprint) /// /// Gets the fingerprint of the certificate and/or key to use for signing or encrypting. - /// - /// /// /// /// A fingerprint is a SHA-1 hash of the raw certificate data and is often used /// as a unique identifier for a particular certificate in a certificate store. /// + /// + /// /// The fingerprint of the certificate. public string Fingerprint { get; private set; diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index 2b2f6cd1ba..35545b0f74 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -36,6 +36,7 @@ namespace MimeKit { /// A message delivery status MIME part is a machine readable notification denoting the /// delivery status of a message and has a MIME-type of message/delivery-status. /// For more information, see rfc3464. + /// /// /// /// diff --git a/MimeKit/MessageDispositionNotification.cs b/MimeKit/MessageDispositionNotification.cs index 7c71482d0d..2b9285f5d6 100644 --- a/MimeKit/MessageDispositionNotification.cs +++ b/MimeKit/MessageDispositionNotification.cs @@ -36,6 +36,7 @@ namespace MimeKit { /// A message disposition notification MIME part is a machine readable notification /// denoting the disposition of a message once it has been successfully delivered /// and has a MIME-type of message/disposition-notification. + /// /// public class MessageDispositionNotification : MimePart { diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 78881ea05b..243942f34b 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -1689,6 +1689,9 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// This method is mostly meant for use with APIs such as /// where the headers are parsed separately from the content. /// + /// + /// + /// /// The parsed MIME entity. /// The Content-Type of the stream. /// The content stream. diff --git a/MimeKit/MimeIterator.cs b/MimeKit/MimeIterator.cs index b4ce649cfe..bc4dafb93d 100644 --- a/MimeKit/MimeIterator.cs +++ b/MimeKit/MimeIterator.cs @@ -36,6 +36,9 @@ namespace MimeKit { /// /// Walks the MIME tree structure of a in depth-first order. /// + /// + /// + /// public class MimeIterator : IEnumerator { class MimeNode @@ -62,6 +65,9 @@ public MimeNode (MimeEntity entity, bool indexed) /// /// Creates a new for the specified message. /// + /// + /// + /// /// The message. /// /// is null. @@ -112,6 +118,9 @@ public MimeMessage Message { /// will be null; otherwise the parent will be either be a /// or a . /// + /// + /// + /// /// The parent entity. /// /// Either has not been called or @@ -137,6 +146,9 @@ public MimeEntity Parent { /// also throws a if the last call to /// returned false, which indicates the end of the message. /// + /// + /// + /// /// The current entity. /// /// Either has not been called or @@ -265,6 +277,9 @@ bool Pop () /// When the iterator is at this position, subsequent calls to MoveNext also return /// false until is called. /// + /// + /// + /// /// true if the iterator was successfully advanced to the next entity; otherwise, false. public bool MoveNext () { diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index de002e59ba..8f314ad84e 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -38,6 +38,9 @@ namespace MimeKit { /// A multipart/related MIME entity contains, as one might expect, inter-related MIME parts which /// typically reference each other via URIs based on the Content-Id and/or Content-Location headers. /// + /// + /// + /// public class MultipartRelated : Multipart { /// @@ -109,6 +112,9 @@ int GetRootIndex () /// When setting the root document MIME part, the Content-Type header of the multipart/related part is also /// updated with a appropriate "start" and "type" parameters. /// + /// + /// + /// /// The root MIME part. /// /// is null. @@ -205,6 +211,9 @@ public bool Contains (Uri uri) /// multipart/related part's Content-Base header in order to produce an absolute URI that can be /// compared with the provided absolute URI. /// + /// + /// + /// /// The index of the part matching the specified URI if found; otherwise -1. /// The URI of the MIME part. /// diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index c0eb02c1c2..fafdea10d3 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -33,6 +33,8 @@ namespace MimeKit { /// /// A multipart/related MIME entity is a general container part for electronic mail /// reports of any kind. + /// + /// /// /// /// From 8f8f3c6875c18334de1394bcce43d26fbfb9cc3c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Jan 2018 22:06:11 -0500 Subject: [PATCH 007/741] Fixed doc references --- ...iveryStatusExample.cs => MessageDeliveryStatusExamples.cs} | 0 MimeKit/MessageDeliveryStatus.cs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename Documentation/Examples/{MessageDeliveryStatusExample.cs => MessageDeliveryStatusExamples.cs} (100%) diff --git a/Documentation/Examples/MessageDeliveryStatusExample.cs b/Documentation/Examples/MessageDeliveryStatusExamples.cs similarity index 100% rename from Documentation/Examples/MessageDeliveryStatusExample.cs rename to Documentation/Examples/MessageDeliveryStatusExamples.cs diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index 35545b0f74..30e3571b61 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -39,7 +39,7 @@ namespace MimeKit { /// /// /// - /// + /// /// public class MessageDeliveryStatus : MimePart { @@ -84,7 +84,7 @@ public MessageDeliveryStatus () : base ("message", "delivery-status") /// the per-recipient fields. /// /// - /// + /// /// /// The fields. public HeaderListCollection StatusGroups { From 5626eda07601cb38dd553e8ea4019efdfb343fd9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Jan 2018 22:11:27 -0500 Subject: [PATCH 008/741] Fixed more references --- MimeKit/MultipartReport.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index fafdea10d3..7a2d82b106 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -37,7 +37,7 @@ namespace MimeKit { /// /// /// - /// + /// /// public class MultipartReport : Multipart { @@ -106,7 +106,7 @@ public MultipartReport (string reportType) : base ("report") /// of the multipart/report. /// /// - /// + /// /// /// The type of the report. /// From f01333f327b4b3ab0a459f9ccc3d499e83ef8063 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Jan 2018 20:47:10 -0500 Subject: [PATCH 009/741] Provide a better error message when the cert within a pkcs12 cannot digital sign Fixes issue #367 --- MimeKit/Cryptography/CmsSigner.cs | 37 ++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 9a3a8a51d2..cd3b9abbe6 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -65,11 +65,19 @@ public class CmsSigner DigestAlgorithm = DigestAlgorithm.Sha1; } - static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) + static bool CanSign (X509Certificate certificate) { var flags = certificate.GetKeyUsageFlags (); if (flags != X509KeyUsageFlags.None && (flags & SecureMimeContext.DigitalSignatureKeyUsageFlags) == 0) + return false; + + return true; + } + + static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) + { + if (!CanSign (certificate)) throw new ArgumentException ("The certificate cannot be used for signing."); } @@ -161,6 +169,7 @@ public CmsSigner (X509Certificate certificate, AsymmetricKeyParameter key) : thi void LoadPkcs12 (Stream stream, string password) { var pkcs12 = new Pkcs12Store (stream, password.ToCharArray ()); + bool hasPrivateKey = false; foreach (string alias in pkcs12.Aliases) { if (!pkcs12.IsKeyEntry (alias)) @@ -169,16 +178,14 @@ void LoadPkcs12 (Stream stream, string password) var chain = pkcs12.GetCertificateChain (alias); var key = pkcs12.GetKey (alias); - if (!key.Key.IsPrivate || chain.Length == 0) + if (!key.Key.IsPrivate) continue; - var flags = chain[0].Certificate.GetKeyUsageFlags (); + hasPrivateKey = true; - if (flags != X509KeyUsageFlags.None && (flags & SecureMimeContext.DigitalSignatureKeyUsageFlags) == 0) + if (chain.Length == 0 || !CanSign (chain[0].Certificate)) continue; - CheckCertificateCanBeUsedForSigning (chain[0].Certificate); - CertificateChain = new X509CertificateChain (); Certificate = chain[0].Certificate; PrivateKey = key.Key; @@ -186,11 +193,13 @@ void LoadPkcs12 (Stream stream, string password) foreach (var entry in chain) CertificateChain.Add (entry.Certificate); - break; + return; } - if (PrivateKey == null) + if (!hasPrivateKey) throw new ArgumentException ("The stream did not contain a private key.", nameof (stream)); + + throw new ArgumentException ("The stream did not contain a certificate that could be used to create digital signatures.", nameof (stream)); } /// @@ -212,7 +221,9 @@ void LoadPkcs12 (Stream stream, string password) /// is null. /// /// - /// does not contain a private key. + /// does not contain a private key. + /// -or- + /// does not contain a certificate that could be used for signing. /// /// /// An I/O error occurred. @@ -248,9 +259,13 @@ public CmsSigner (Stream stream, string password) : this () /// is null. /// /// - /// is a zero-length string, contains only white space, or + /// is a zero-length string, contains only white space, or /// contains one or more invalid characters as defined by - /// . + /// . + /// -or- + /// does not contain a private key. + /// -or- + /// does not contain a certificate that could be used for signing. /// /// /// is an invalid file path. From 53c82f6fbf3833d3a96a667d092fa0868c8f59d2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 29 Jan 2018 12:41:45 -0500 Subject: [PATCH 010/741] Fixed code formatting --- MimeKit/Encodings/Base64Encoder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Encodings/Base64Encoder.cs b/MimeKit/Encodings/Base64Encoder.cs index 70a60d86f4..71195c9543 100644 --- a/MimeKit/Encodings/Base64Encoder.cs +++ b/MimeKit/Encodings/Base64Encoder.cs @@ -277,7 +277,7 @@ unsafe int Flush (byte* input, int length, byte* output) *outptr++ = (byte) '\n'; Reset (); - + return (int) (outptr - output); } From 67b2b53cfd3c4f3526da1cb592d0b343a349e79e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 29 Jan 2018 14:14:37 -0500 Subject: [PATCH 011/741] Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. Works around an NRE bug in netcore2 - issue #370 --- MimeKit/Tnef/TnefPropertyReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index d8bbcbd443..4b3dc317ba 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -487,7 +487,7 @@ Encoding GetMessageEncoding () if (codepage != 0 && codepage != 1252) { try { - return Encoding.GetEncoding (codepage, new EncoderExceptionFallback (), new DecoderExceptionFallback ()); + return Encoding.GetEncoding (codepage); } catch { return DefaultEncoding; } From 5383403f83cc7c802932bb65c82652def96be1a7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 1 Feb 2018 21:08:22 -0500 Subject: [PATCH 012/741] Fixed links in FAQ.md --- FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index 613774e514..60ae193d52 100644 --- a/FAQ.md +++ b/FAQ.md @@ -113,7 +113,7 @@ builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics"); message.Body = builder.ToMessageBody (); ``` -For more information, see [Creating Messages](http://www.mimekit.net/docs/html/CreatingMessages.htm). +For more information, see [Creating Messages](http://www.mimekit.net/docs/html/Creating-Messages.htm). ### Q: How do I get the main body of a message? @@ -190,7 +190,7 @@ for this: [TextBody](http://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_Text appropriate body part with a `Content-Type` of `text/html` that can be interpreted as the message body. Likewise, the `TextBody` property can be used to get the `text/plain` version of the message body. -For more information, see [Working with Messages](http://www.mimekit.net/docs/html/WorkingWithMessages.htm). +For more information, see [Working with Messages](http://www.mimekit.net/docs/html/Working-With-Messages.htm). ### Q: How do I tell if a message has attachments? From 54b599ea4d3d259d7145fcf3be4fc5a13bf203e8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 1 Feb 2018 21:14:31 -0500 Subject: [PATCH 013/741] Removed the use of the word 'simply' in the docs --- Documentation/Content/FrequentlyAskedQuestions.aml | 4 ++-- Documentation/Content/GettingStarted.aml | 6 +++--- Documentation/Content/WorkingWithPGP.aml | 4 ++-- Documentation/Content/WorkingWithSMime.aml | 4 ++-- FAQ.md | 6 +++--- README.md | 8 ++++---- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Documentation/Content/FrequentlyAskedQuestions.aml b/Documentation/Content/FrequentlyAskedQuestions.aml index e477ba967b..11dd7bfeef 100644 --- a/Documentation/Content/FrequentlyAskedQuestions.aml +++ b/Documentation/Content/FrequentlyAskedQuestions.aml @@ -1,4 +1,4 @@ - + If you only care about getting a flattened list of the mailbox addresses in one of - the address headers, you can simply do something like this: + the address headers, you can do something like this: foreach (var mailbox in message.To.Mailboxes) diff --git a/Documentation/Content/GettingStarted.aml b/Documentation/Content/GettingStarted.aml index 85e326b79f..0b1e0491a4 100644 --- a/Documentation/Content/GettingStarted.aml +++ b/Documentation/Content/GettingStarted.aml @@ -1,4 +1,4 @@ - + Package Manager Console http://docs.nuget.org/docs/start-here/using-the-package-manager-console - , simply enter the following command: + , enter the following command: Install-Package MimeKit @@ -97,7 +97,7 @@ Once you've opened the appropriate MimeKit solution file in either Xamarin Studio or - Visual Studio (either will work), you can simply + Visual Studio (either will work), you can choose the Debug or Release build configuration and then build. diff --git a/Documentation/Content/WorkingWithPGP.aml b/Documentation/Content/WorkingWithPGP.aml index 2ed3759e1f..2b5026bb97 100644 --- a/Documentation/Content/WorkingWithPGP.aml +++ b/Documentation/Content/WorkingWithPGP.aml @@ -1,4 +1,4 @@ - + multipart/encrypted mime-type to encapsulate encrypted data. To encrypt any T:MimeKit.MimeEntity, - simply use the + use the Overload:MimeKit.Cryptography.MultipartEncrypted.Create diff --git a/Documentation/Content/WorkingWithSMime.aml b/Documentation/Content/WorkingWithSMime.aml index e6cdb0a169..e1222c1b98 100644 --- a/Documentation/Content/WorkingWithSMime.aml +++ b/Documentation/Content/WorkingWithSMime.aml @@ -1,4 +1,4 @@ - + multipart/encrypted MIME part to encapsulate encrypted content like OpenPGP, S/MIME uses application/pkcs7-mime. To encrypt any T:MimeKit.MimeEntity, - simply use the + use the Overload:MimeKit.Cryptography.ApplicationPkcs7Mime.Encrypt diff --git a/FAQ.md b/FAQ.md index 60ae193d52..264c8807ff 100644 --- a/FAQ.md +++ b/FAQ.md @@ -42,7 +42,7 @@ container which you'll then want to add the message body to first. Once you've a then add MIME parts to it that contain the content of the files you'd like to attach, being sure to set the `Content-Disposition` header value to attachment. You'll probably also want to set the `filename` parameter on the `Content-Disposition` header as well as the `name` parameter on the `Content-Type` -header. The most convenient way to do this is to simply use the +header. The most convenient way to do this is to use the [MimePart.FileName](http://www.mimekit.net/docs/html/P_MimeKit_MimePart_FileName.htm) property which will set both parameters for you as well as setting the `Content-Disposition` header value to `attachment` if it has not already been set to something else. @@ -614,7 +614,7 @@ To: John Smith ``` If you only care about getting a flattened list of the mailbox addresses in a `From`, `To`, or `Cc` -header, you can simply do something like this: +header, you can do something like this: ```csharp foreach (var mailbox in message.To.Mailboxes) @@ -1102,7 +1102,7 @@ public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IE } ``` -To forward a message by simply inlining the original message's text content, you can do something like this: +To forward a message by inlining the original message's text content, you can do something like this: ```csharp public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) diff --git a/README.md b/README.md index 5390c05cb9..5b1853621e 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ MimeKit is Copyright (C) 2012-2018 Xamarin Inc. and is licensed under the MIT li The easiest way to install MimeKit is via [NuGet](https://www.nuget.org/packages/MimeKit/). In Visual Studio's [Package Manager Console](http://docs.nuget.org/docs/start-here/using-the-package-manager-console), -simply enter the following command: +enter the following command: Install-Package MimeKit @@ -144,7 +144,7 @@ In the top-level MimeKit directory, there are a number of solution files; they a If you don't have the Xamarin products, you'll probably want to open the MimeKit.Net45.sln instead of MimeKit.sln. Once you've opened the appropriate MimeKit solution file in either [Xamarin Studio](https://www.xamarin.com/download) -or [Visual Studio 2017](https://www.visualstudio.com/downloads/), you can simply choose the **Debug** or **Release** +or [Visual Studio 2017](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** build configuration and then build. Note: The **Release** build will generate the xml API documentation, but the **Debug** build will not. @@ -731,7 +731,7 @@ would use an OpenPGP cryptography context. For example, you might use a subclass use `GnuPGContext` directly because it has no way of prompting the user for their passphrase). For the sake of this example, let's pretend that you've written a minimal subclass of -`MimeKit.Cryptography.GnuPGContext` that simply overrides the `GetPassword()` method and +`MimeKit.Cryptography.GnuPGContext` that only overrides the `GetPassword()` method and that this subclass is called `MyGnuPGContext`. ```csharp @@ -1052,7 +1052,7 @@ solution files are configured with the coding style used by MimeKit. If you use other editor, please try to maintain the existing coding style as best as you can. Once you've got some changes that you'd like to submit upstream to the official MimeKit repository, -simply send me a **Pull Request** and I will try to review your changes in a timely manner. +send me a **Pull Request** and I will try to review your changes in a timely manner. If you'd like to contribute but don't have any particular features in mind to work on, check out the issue tracker and look for something that might pique your interest! From 801ac4777902a6d104d9e1f76cf35f096d0b3a5a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Feb 2018 10:00:43 -0500 Subject: [PATCH 014/741] Make sure not to hang if the last header line is truncated before CRLF --- MimeKit/MimeParser.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 8dae1319fd..2e8d543c31 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -761,8 +761,17 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check if (inptr == inend) { // we don't have enough input data - left = (int) (inend - start); + int available = (int) (inend - start); + inputIndex = (int) (start - inbuf); + + if (left == available) { + state = MimeParserState.Error; + headerIndex = 0; + return false; + } + + left = available; needInput = true; break; } From fa83b8c26d5ac597f89c392bad32ae3f447ca94a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 15 Feb 2018 16:32:42 -0500 Subject: [PATCH 015/741] Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature() Fixes issue #374 --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 683cc68b69..ae3babd458 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -425,10 +425,10 @@ Stream Sign (RealCmsSigner signer, Stream content, bool detach) var signed = new SignedCms (contentInfo, detach); try { - signed.ComputeSignature (signer); + signed.ComputeSignature (signer, false); } catch (CryptographicException) { signer.IncludeOption = X509IncludeOption.EndCertOnly; - signed.ComputeSignature (signer); + signed.ComputeSignature (signer, false); } var signedData = signed.Encode (); From 6d878aaeb7cb9dc271045e8c38390967243a543c Mon Sep 17 00:00:00 2001 From: ZhluktenkoDmytro Date: Thu, 22 Feb 2018 19:08:23 +0200 Subject: [PATCH 016/741] Added support of epub files --- MimeKit/MimeTypes.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index 6fbcb584e8..e589ccfff2 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -143,11 +143,12 @@ static MimeTypes () mimeTypes.Add ("dwg", "application/acad"); mimeTypes.Add ("dxf", "application/dxf"); mimeTypes.Add ("dxr", "application/x-director"); - mimeTypes.Add ("elc", "application/x-elc"); mimeTypes.Add ("el", "text/x-script.elisp"); + mimeTypes.Add ("elc", "application/x-elc"); mimeTypes.Add ("eml", "message/rfc822"); mimeTypes.Add ("eot", "application/vnd.bw-fontobject"); mimeTypes.Add ("eps", "application/postscript"); + mimeTypes.Add ("epub", "application/epub+zip"); mimeTypes.Add ("es", "application/x-esrehber"); mimeTypes.Add ("etx", "text/x-setext"); mimeTypes.Add ("evy", "application/envoy"); From d581a110f4d76542717500d68d4f19aa8c46b299 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 23 Feb 2018 11:19:50 -0500 Subject: [PATCH 017/741] IDN encode/decode the local part of mailbox addresses as well Fixes https://github.com/jstedfast/MailKit/issues/649 --- MimeKit/MailboxAddress.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index b75a42ece1..bc8dc62b38 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -312,6 +312,9 @@ static string EncodeAddrspec (string addrspec, int at) var domain = addrspec.Substring (at + 1); var local = addrspec.Substring (0, at); + if (ParseUtils.IsInternational (local)) + local = ParseUtils.IdnEncode (local); + if (ParseUtils.IsInternational (domain)) domain = ParseUtils.IdnEncode (domain); @@ -361,6 +364,9 @@ static string DecodeAddrspec (string addrspec, int at) var domain = addrspec.Substring (at + 1); var local = addrspec.Substring (0, at); + if (ParseUtils.IsIdnEncoded (local)) + local = ParseUtils.IdnDecode (local); + if (ParseUtils.IsIdnEncoded (domain)) domain = ParseUtils.IdnDecode (domain); From e258b23eb372e88fbc9234501a511a0579ee7ac9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 28 Feb 2018 11:00:46 -0500 Subject: [PATCH 018/741] Updated Donation link --- README.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5b1853621e..3746c135f0 100644 --- a/README.md +++ b/README.md @@ -1060,16 +1060,13 @@ tracker and look for something that might pique your interest! ## Donate MimeKit is a personal open source project that I have put thousands of hours into perfecting with the -goal of making it not only the very best MIME parser framework for .NET, but the best MIME parser -framework for any programming language. I need your help to achieve this. +goal of making it the very best MIME parser framework for .NET. I need your help to achieve this. -Donating helps pay for things such as web hosting and licenses for developer tools such as a -performance profiler, memory profiler, a static code analysis tool, and more. +Donating helps pay for things such as web hosting, domain registration and licenses for developer tools +such as a performance profiler, memory profiler, a static code analysis tool, and more. - - Click here to lend your support to MimeKit and MailKit by making a donation via pledgie.com! + +Click here to lend your support to MimeKit and MailKit by making a donation! ## Reporting Bugs From 0d3892f6eddca2cd2adee3424b72f01e2de66102 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 28 Feb 2018 11:33:03 -0500 Subject: [PATCH 019/741] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 3746c135f0..51a81a13f9 100644 --- a/README.md +++ b/README.md @@ -1065,9 +1065,7 @@ goal of making it the very best MIME parser framework for .NET. I need your help Donating helps pay for things such as web hosting, domain registration and licenses for developer tools such as a performance profiler, memory profiler, a static code analysis tool, and more. - -Click here to lend your support to MimeKit and MailKit by making a donation! - +Click here to lend your support to MimeKit and MailKit by making a donation! ## Reporting Bugs From 09a3c984367d1e334d0bd16f2aac9eda14d64487 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 17 Mar 2018 09:29:03 -0400 Subject: [PATCH 020/741] Bumped version to 2.0.2 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 10 ++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 15 ++++++++------- nuget/MimeKitLite.nuspec | 7 +++++-- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index d01ec93c2d..d861cacea1 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.1 + 2.0.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 56e7b3f7e9..11d5ae1860 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.1 + 2.0.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 368c6d4835..f0a720cb52 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.1.0")] -[assembly: AssemblyFileVersion ("2.0.1.0")] +[assembly: AssemblyInformationalVersion ("2.0.2.0")] +[assembly: AssemblyFileVersion ("2.0.2.0")] [assembly: AssemblyVersion ("2.0.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index e4fbb7351d..31e59713c3 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,15 @@ # Release Notes +### MimeKit 2.0.2 + +* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) +* Added a record for .epub to the MimeTypes database. (issue #376) +* Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature(). (issue #374) +* Make sure the MimeParser does not hang if the last header line is truncated before CRLF. +* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370) +* Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue #367) +* Fixed TemporarySecureMimeContext to key off the certificate's fingerprint. + ### MimeKit 2.0.1 * Improved the HTML parser logic to better handle a number of edge cases. diff --git a/appveyor.yml b/appveyor.yml index d5d19583bf..90a9cc53f6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.1.{build} +version: 2.0.2.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index d8e948e7fd..7b0121fde2 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.1 + 2.0.2 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,12 +25,13 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Improved the HTML parser logic to better handle a number of edge cases. -* MimeKit will now automatically download CRLs based on the CRL Distribution Point certificate extension if any HTTP URLs are defined (LDAP and FTP are not yet supported) when verifying S/MIME digital signatures using a derivative of the BouncyCastleSecureMimeContext backend (the WindowsSecureMimeContext gets this for free from System.Security's CMS implementation). -* Fixed OpenPgpContext.RetrievePublicKeyRingAsync() to use the filtered stream. -* Added support for using the Blowfish encryption algorithm with S/MIME (only supported in the BouncyCastle backends). -* Added support for using the SEED encryption algorithm with S/MIME (also only supported in the BouncyCastle backends). -* Added an optional 'algorithm' argument to OpenPgpContext.GenerateKeyPair() to allow specifying the symmetric key algorithm to use in generating the key pair. This defaults to AES-256, which is the same value used in older versions of MimeKit. +* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) +* Added a record for .epub to the MimeTypes database. (issue #376) +* Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature(). (issue #374) +* Make sure the MimeParser does not hang if the last header line is truncated before CRLF. +* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370) +* Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue #367) +* Fixed TemporarySecureMimeContext to key off the certificate's fingerprint. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 3a896a1572..0744164d3a 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.1 + 2.0.2 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,7 +25,10 @@ An Open Source library for creating and parsing MIME messages. -* Improved the HTML parser logic to better handle a number of edge cases. +* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) +* Added a record for .epub to the MimeTypes database. (issue #376) +* Make sure the MimeParser does not hang if the last header line is truncated before CRLF. +* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370) Xamarin Inc. en-US From bdd2b600d373f6dab954a1d42d337b8255234844 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 18 Mar 2018 10:16:29 -0400 Subject: [PATCH 021/741] Updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 222d2364d8..53592fcac5 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -30,7 +30,7 @@ - ..\packages\MimeKit.2.0.1\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.2\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 4f7f950975..6c26d1cac5 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index a7161af351..c0d765019d 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.0.1\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.0.2\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.0.1\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.0.2\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 242eec6576..dafe3d9e1c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 3a091c7f28..a1adf0e2e3 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.0.1\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.0.2\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.0.1\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.0.2\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 47aec25145..07970356d9 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 788979e746..7e686f3955 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -37,7 +37,7 @@ True - ..\packages\MimeKit.2.0.1\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.2\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 4f53df1153..0fa4f2278e 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 610d94e2ded13bc1d54a294bef607c85b453621b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 23 Mar 2018 14:24:08 -0400 Subject: [PATCH 022/741] Fixed HTML entity encoder logic when a surrogate pair is at the end of the input Fixes issue #385 --- MimeKit/Text/HtmlUtils.cs | 2 +- UnitTests/Text/TextToHtmlTests.cs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/MimeKit/Text/HtmlUtils.cs b/MimeKit/Text/HtmlUtils.cs index 7ccb4a490b..8751096976 100644 --- a/MimeKit/Text/HtmlUtils.cs +++ b/MimeKit/Text/HtmlUtils.cs @@ -414,7 +414,7 @@ static void HtmlEncode (TextWriter output, ICharArray data, int startIndex, int } if (c > 255 && char.IsSurrogate (c)) { - if (index + 1 < endIndex && char.IsSurrogatePair (c, data[index])) { + if (index + 1 <= endIndex && char.IsSurrogatePair (c, data[index])) { unichar = char.ConvertToUtf32 (c, data[index]); index++; } else { diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index 80b5c4c091..4f3fe50407 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -28,6 +28,7 @@ using System.IO; using System.Text; +using MimeKit.Encodings; using MimeKit.Text; using NUnit.Framework; @@ -90,5 +91,21 @@ public void TestHeaderFooter () var result = converter.Convert (input); Assert.AreEqual (expected, result); } + + [Test] + public void TestEmoji () + { + var expected = "😱
"; + var buffer = Encoding.ASCII.GetBytes ("=F0=9F=98=B1"); + var decoder = new QuotedPrintableDecoder (); + var length = decoder.EstimateOutputLength (buffer.Length); + var decoded = new byte[length]; + var n = decoder.Decode (buffer, 0, buffer.Length, decoded); + var emoji = Encoding.UTF8.GetString (decoded, 0, n); + var converter = new TextToHtml (); + var result = converter.Convert (emoji); + + Assert.AreEqual (expected, result); + } } } From 71fcc1a2890adb1567feddd68f5d4f55b9e90cfd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 12 Apr 2018 10:19:34 -0400 Subject: [PATCH 023/741] Fixed AttachmentCollection.Add() to properly handle message/rfc822 attachments Fixes https://github.com/jstedfast/MailKit/issues/697 --- MimeKit/AttachmentCollection.cs | 40 ++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 1887b15a5a..d9672e4ffd 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -155,28 +155,42 @@ static ContentType GetMimeType (string fileName) return ContentType.Parse (mimeType); } - MimePart CreateAttachment (ContentType contentType, string fileName, Stream stream) + MimeEntity CreateAttachment (ContentType contentType, string fileName, Stream stream) { - MimePart attachment; + MimeEntity attachment; - if (contentType.IsMimeType ("text", "*")) { - attachment = new TextPart (contentType.MediaSubtype); - foreach (var param in contentType.Parameters) - attachment.ContentType.Parameters.Add (param); + if (contentType.IsMimeType ("message", "rfc822")) { + var message = MimeMessage.Load (stream); + var rfc822 = new MessagePart { Message = message }; - // TODO: should we try to auto-detect charsets if no charset parameter is specified? + rfc822.ContentDisposition = new ContentDisposition (linked ? ContentDisposition.Inline : ContentDisposition.Attachment); + rfc822.ContentDisposition.FileName = Path.GetFileName (fileName); + rfc822.ContentType.Name = Path.GetFileName (fileName); + + attachment = rfc822; } else { - attachment = new MimePart (contentType); - } + MimePart part; + + if (contentType.IsMimeType ("text", "*")) { + part = new TextPart (contentType.MediaSubtype); + foreach (var param in contentType.Parameters) + part.ContentType.Parameters.Add (param); + + // TODO: should we try to auto-detect charsets if no charset parameter is specified? + } else { + part = new MimePart (contentType); + } - attachment.FileName = Path.GetFileName (fileName); - attachment.IsAttachment = !linked; + part.FileName = Path.GetFileName (fileName); + part.IsAttachment = !linked; + + LoadContent (part, stream); + attachment = part; + } if (linked) attachment.ContentLocation = new Uri (Path.GetFileName (fileName), UriKind.Relative); - LoadContent (attachment, stream); - return attachment; } From 9ead9759d30236a129c57cb02f59ae73747a3ad3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 12 Apr 2018 10:35:32 -0400 Subject: [PATCH 024/741] Allow empty TextBody and HtmlBody properties for BodyBuilder Previously, setting these properties to string.Empty was treated the same as setting them to null. Fixes issue #391 --- MimeKit/BodyBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index f5c1118d58..d4802e82ff 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -126,7 +126,7 @@ public MimeEntity ToMessageBody () MultipartAlternative alternative = null; MimeEntity body = null; - if (!string.IsNullOrEmpty (TextBody)) { + if (TextBody != null) { var text = new TextPart ("plain"); text.Text = TextBody; @@ -139,7 +139,7 @@ public MimeEntity ToMessageBody () } } - if (!string.IsNullOrEmpty (HtmlBody)) { + if (HtmlBody != null) { var text = new TextPart ("html"); MimeEntity html; From 835b156e44ea20559676eaafc7dc6c4378689a51 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Apr 2018 12:50:32 -0400 Subject: [PATCH 025/741] Bumped version to 2.0.3 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 6 ++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 12 ++++-------- nuget/MimeKitLite.nuspec | 9 ++++----- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index d861cacea1..cbe7694b37 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.2 + 2.0.3 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 11d5ae1860..4849544d0a 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.2 + 2.0.3 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index f0a720cb52..60f0b026f7 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.2.0")] -[assembly: AssemblyFileVersion ("2.0.2.0")] +[assembly: AssemblyInformationalVersion ("2.0.3.0")] +[assembly: AssemblyFileVersion ("2.0.3.0")] [assembly: AssemblyVersion ("2.0.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 31e59713c3..ddc67c679e 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,11 @@ # Release Notes +### MimeKit 2.0.3 + +* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) +* Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. +* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385) + ### MimeKit 2.0.2 * IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) diff --git a/appveyor.yml b/appveyor.yml index 90a9cc53f6..8e92a72a7e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.2.{build} +version: 2.0.3.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 7b0121fde2..08b1fab365 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.2 + 2.0.3 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,13 +25,9 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) -* Added a record for .epub to the MimeTypes database. (issue #376) -* Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature(). (issue #374) -* Make sure the MimeParser does not hang if the last header line is truncated before CRLF. -* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370) -* Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue #367) -* Fixed TemporarySecureMimeContext to key off the certificate's fingerprint. +* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) +* Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. +* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 0744164d3a..0f1715a4be 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.2 + 2.0.3 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,10 +25,9 @@ An Open Source library for creating and parsing MIME messages. -* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) -* Added a record for .epub to the MimeTypes database. (issue #376) -* Make sure the MimeParser does not hang if the last header line is truncated before CRLF. -* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370) +* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) +* Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. +* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385) Xamarin Inc. en-US From 6669b0a82ee585fad882ccdb146f5912c3a55eb6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Apr 2018 09:47:48 -0400 Subject: [PATCH 026/741] Updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 9 +++++---- samples/DkimVerifier/DkimVerifier/packages.config | 4 ++-- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- .../MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/App.config | 10 +++++++++- .../MessageReader/MessageReader/MessageReader.csproj | 7 +++---- samples/MessageReader/MessageReader/packages.config | 4 ++-- 9 files changed, 27 insertions(+), 19 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 53592fcac5..065aa07075 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -29,16 +29,16 @@ x86 + + ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + - ..\packages\MimeKit.2.0.2\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.3\lib\net45\MimeKit.dll ..\packages\Heijden.Dns.2.0.0\lib\net35\Heijden.Dns.dll - - ..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll - @@ -49,6 +49,7 @@ + diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 6c26d1cac5..7011bdf33d 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -1,6 +1,6 @@  - + - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index c0d765019d..41b1254dfa 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.0.2\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.0.3\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.0.2\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.0.3\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index dafe3d9e1c..7f0902e101 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index a1adf0e2e3..f1aec72cef 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.0.2\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.0.3\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.0.2\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.0.3\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 07970356d9..f7227e4f55 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/App.config b/samples/MessageReader/MessageReader/App.config index 8e15646352..36809fb5bf 100644 --- a/samples/MessageReader/MessageReader/App.config +++ b/samples/MessageReader/MessageReader/App.config @@ -1,6 +1,14 @@ - + + + + + + + + + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 7e686f3955..d08cd773e8 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -32,12 +32,11 @@ 4 - - ..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll - True + + ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.2\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.3\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 0fa4f2278e..265cbe81df 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From e481f5eb796aa8d78649daa8318d25d3a307cfdb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 23 Apr 2018 16:55:08 -0400 Subject: [PATCH 027/741] Enable System.Net.Mail support for .NET Core 2.0 Fixes issue #393 --- MimeKit/MimeKit.NetStandard.csproj | 4 ++++ MimeKit/MimeKitLite.NetStandard.csproj | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index cbe7694b37..3ae230841d 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -30,6 +30,10 @@ true + + $(DefineConstants);ENABLE_SNM + + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 4849544d0a..856116a178 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -30,6 +30,10 @@ true + + $(DefineConstants);ENABLE_SNM + + From c188903004f069a2b0bdc8bb26bf3a69b8c46d2b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 7 May 2018 14:17:55 -0400 Subject: [PATCH 028/741] Added FormatOptions.EnsureNewLine property Partial fix for https://github.com/jstedfast/MailKit/issues/251 --- MimeKit/FormatOptions.cs | 28 ++++++++++++++++++++++++++++ MimeKit/MimeMessage.cs | 6 +++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index 56d99dd74b..cf590afb53 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -73,6 +73,7 @@ public class FormatOptions ParameterEncodingMethod parameterEncodingMethod; bool allowMixedHeaderCharsets; NewLineFormat newLineFormat; + bool ensureNewLine; bool international; /// @@ -118,6 +119,31 @@ public NewLineFormat NewLineFormat { } } + /// + /// Gets or sets whether the formatter should ensure that messages end with a new-line sequence. + /// + /// + /// By default, when writing a to a stream, the serializer attempts to + /// maintain byte-for-byte compatibility with the original stream that the message was parsed from. + /// This means that if the ogirinal message stream did not end with a new-line sequence, then the + /// output of writing the message back to a stream will also not end with a new-line sequence. + /// To override this behavior, you can set this property to true in order to ensure + /// that writing the message back to a stream will always end with a new-line sequence. + /// + /// true in order to ensure that the message will end with a new-line sequence; otherwise, false. + /// + /// cannot be changed. + /// + public bool EnsureNewLine { + get { return ensureNewLine; } + set { + if (this == Default) + throw new InvalidOperationException ("The default formatting options cannot be changed."); + + ensureNewLine = value; + } + } + internal IMimeFilter CreateNewLineFilter (bool ensureNewLine = false) { switch (NewLineFormat) { @@ -255,6 +281,7 @@ public FormatOptions () parameterEncodingMethod = ParameterEncodingMethod.Rfc2231; //maxLineLength = DefaultMaxLineLength; allowMixedHeaderCharsets = false; + ensureNewLine = false; international = false; if (Environment.NewLine.Length == 1) @@ -275,6 +302,7 @@ public FormatOptions Clone () var options = new FormatOptions (); //options.maxLineLength = maxLineLength; options.newLineFormat = newLineFormat; + options.ensureNewLine = ensureNewLine; options.HiddenHeaders = new HashSet (HiddenHeaders); options.allowMixedHeaderCharsets = allowMixedHeaderCharsets; options.parameterEncodingMethod = parameterEncodingMethod; diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 7922418d33..323934b7ba 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1109,7 +1109,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (!headersOnly) { try { - Body.EnsureNewLine = compliance == RfcComplianceMode.Strict; + Body.EnsureNewLine = compliance == RfcComplianceMode.Strict || options.EnsureNewLine; Body.WriteTo (options, stream, true, cancellationToken); } finally { Body.EnsureNewLine = false; @@ -1174,7 +1174,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (!headersOnly) { try { - Body.EnsureNewLine = compliance == RfcComplianceMode.Strict; + Body.EnsureNewLine = compliance == RfcComplianceMode.Strict || options.EnsureNewLine; await Body.WriteToAsync (options, stream, true, cancellationToken).ConfigureAwait (false); } finally { Body.EnsureNewLine = false; @@ -1664,7 +1664,7 @@ byte[] DkimHashBody (FormatOptions options, DkimSignatureAlgorithm signatureAlgo if (Body != null) { try { - Body.EnsureNewLine = compliance == RfcComplianceMode.Strict; + Body.EnsureNewLine = compliance == RfcComplianceMode.Strict || options.EnsureNewLine; Body.WriteTo (options, filtered, true, CancellationToken.None); } finally { Body.EnsureNewLine = false; From 7e9d59f493b502e25d109425d52b881caedbdc81 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 15 May 2018 16:06:51 -0400 Subject: [PATCH 029/741] code cleanup --- MimeKit/MimeParser.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 2e8d543c31..1e77b51d1a 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -135,8 +135,8 @@ public partial class MimeParser : IEnumerable long headerOffset; int headerIndex; - readonly List bounds; - readonly List
headers; + readonly List bounds = new List (); + readonly List
headers = new List
(); MimeParserState state; MimeFormat format; @@ -241,9 +241,6 @@ public MimeParser (ParserOptions options, Stream stream, bool persistent = false /// public MimeParser (ParserOptions options, Stream stream, MimeFormat format, bool persistent = false) { - bounds = new List (); - headers = new List
(); - SetStream (options, stream, format, persistent); } From 260558dd10e906290878265329941263895e2940 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 15 May 2018 16:10:04 -0400 Subject: [PATCH 030/741] Fixed parsing of header blocks that spam across read boundaries Fixes issue #395 as well as reverting commit 801ac47 and fixing it in a better way. --- MimeKit/AsyncMimeParser.cs | 34 ++++++++++++++++++--------- MimeKit/MimeParser.cs | 45 +++++++++++++++++++----------------- UnitTests/MimeParserTests.cs | 16 +++++++++++++ 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 70ee29bfde..ba6450dc88 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -132,20 +132,32 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) var available = await ReadAheadAsync (left + 1, 0, cancellationToken).ConfigureAwait (false); - if (available == 0) { + if (available == left) { // EOF reached before we reached the end of the headers... - if (left > 0) { - AppendRawHeaderData (inputIndex, left); - inputIndex = inputEnd; - } + if (scanningFieldName && left > 0) { + // EOF reached right in the middle of a header field name. Throw an error. + // + // See private email from Feb 8, 2018 which contained a sample message w/o + // any breaks between the header and message body. The file also did not + // end with a newline sequence. + state = MimeParserState.Error; + } else { + // EOF reached somewhere in the middle of the value. + // + // Append whatever data we've got left and pretend we found the end + // of the header value (and the header block). + // + // For more details, see https://github.com/jstedfast/MimeKit/pull/51 + // and https://github.com/jstedfast/MimeKit/issues/348 + if (left > 0) { + AppendRawHeaderData (inputIndex, left); + inputIndex = inputEnd; + } - ParseAndAppendHeader (); + ParseAndAppendHeader (); - // fail gracefully by pretending we found the end of the headers... - // - // For more details, see https://github.com/jstedfast/MimeKit/pull/51 - // and https://github.com/jstedfast/MimeKit/issues/348 - state = MimeParserState.Content; + state = MimeParserState.Content; + } return; } } while (true); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 1e77b51d1a..c7a2e3ec25 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -758,17 +758,8 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check if (inptr == inend) { // we don't have enough input data - int available = (int) (inend - start); - + left = (int) (inend - start); inputIndex = (int) (start - inbuf); - - if (left == available) { - state = MimeParserState.Error; - headerIndex = 0; - return false; - } - - left = available; needInput = true; break; } @@ -891,20 +882,32 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) var available = ReadAhead (left + 1, 0, cancellationToken); - if (available == 0) { + if (available == left) { // EOF reached before we reached the end of the headers... - if (left > 0) { - AppendRawHeaderData (inputIndex, left); - inputIndex = inputEnd; - } + if (scanningFieldName && left > 0) { + // EOF reached right in the middle of a header field name. Throw an error. + // + // See private email from Feb 8, 2018 which contained a sample message w/o + // any breaks between the header and message body. The file also did not + // end with a newline sequence. + state = MimeParserState.Error; + } else { + // EOF reached somewhere in the middle of the value. + // + // Append whatever data we've got left and pretend we found the end + // of the header value (and the header block). + // + // For more details, see https://github.com/jstedfast/MimeKit/pull/51 + // and https://github.com/jstedfast/MimeKit/issues/348 + if (left > 0) { + AppendRawHeaderData (inputIndex, left); + inputIndex = inputEnd; + } - ParseAndAppendHeader (); + ParseAndAppendHeader (); - // fail gracefully by pretending we found the end of the headers... - // - // For more details, see https://github.com/jstedfast/MimeKit/pull/51 - // and https://github.com/jstedfast/MimeKit/issues/348 - state = MimeParserState.Content; + state = MimeParserState.Content; + } return; } } while (true); diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index f7e4159109..f0bdea8e7a 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -131,6 +131,22 @@ public async void TestHeaderParserAsync () } } + [Test] + public void TestTruncatedHeaderName () + { + var bytes = Encoding.ASCII.GetBytes ("Header-1"); + + using (var memory = new MemoryStream (bytes, false)) { + try { + var headers = HeaderList.Load (memory); + Assert.Fail ("Parsing headers should fail."); + } catch (FormatException) { + } catch (Exception ex) { + Assert.Fail ("Failed to parse headers: {0}", ex); + } + } + } + [Test] public void TestTruncatedHeader () { From 412034dd5c0a77083a1da2f80e0acf7d642a0b6a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 May 2018 14:40:05 -0400 Subject: [PATCH 031/741] Properly wrap long mailbox names with quoted phrases --- MimeKit/Utils/StringBuilderExtensions.cs | 4 ++++ UnitTests/InternetAddressListTests.cs | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index 31c6fcf288..c49d5e8041 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -66,6 +66,10 @@ public static StringBuilder AppendFolded (this StringBuilder text, FormatOptions lwspIndex++; } } + + // consume the end-quote + if (lwspIndex < value.Length) + lwspIndex++; } else { // normal word while (lwspIndex < value.Length && !char.IsWhiteSpace (value[lwspIndex])) diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index 091444194d..de7546c82d 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -30,6 +30,7 @@ using NUnit.Framework; using MimeKit; +using MimeKit.Utils; namespace UnitTests { [TestFixture] @@ -551,6 +552,28 @@ public void TestEncodingSimpleAddressList () Assert.AreEqual (expectedEncoded, encoded, "Encoded value does not match the expected result: {0}", display); } + [Test] + public void TestEncodingLongNameMixedQuotingAndEncoding () + { + const string name = "Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx für xxxxxxxxxxxxx xxxx"; + const string encodedName = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx xxxx"; + const string encodedMailbox = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx\n xxxx "; + const string address = "x.xxxxx@xxxxxxx-xxxxxx.xx"; + var buffer = Rfc2047.EncodePhrase (Encoding.UTF8, name); + var result = Encoding.UTF8.GetString (buffer); + + Assert.AreEqual (encodedName, result); + + var mailbox = new MailboxAddress (name, address); + var list = new InternetAddressList (); + + list.Add (mailbox); + + result = list.ToString (true); + + Assert.AreEqual (encodedMailbox, result); + } + [Test] public void TestDecodedMailboxHasCorrectCharsetEncoding () { From 59a59f0f2fde0c3809fb9074d8b335cc9b9dfae6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 May 2018 13:33:35 -0400 Subject: [PATCH 032/741] Added security notice to BouncyCastleSecureMimeContext.CheckCertificateRevocation The remarks have been updated to mention potential security concerns regarding the automatic download of CRLs as discussed in the Efail security paper published in mid-May 2018. --- .../Cryptography/BouncyCastleSecureMimeContext.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 2d2aa6e867..7b2a543793 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -74,20 +74,24 @@ public abstract class BouncyCastleSecureMimeContext : SecureMimeContext /// protected BouncyCastleSecureMimeContext () { - CheckCertificateRevocation = true; client = new HttpClient (); } /// - /// Get or set whether or not certificate revocation should be checked when verifying signatures. + /// Get or set whether or not certificate revocation lists should be downloaded when verifying signatures. /// /// - /// Gets or sets whether or not certificate revocation should be checked when verifying signatures. + /// Gets or sets whether or not certificate revocation lists should be downloaded when verifying + /// signatures. /// If enabled, the will attempt to automatically download /// Certificate Revocation Lists (CRLs) from the internet based on the CRL Distribution Point extension on /// each certificate. + /// Enabling this feature opens the client up to potential privacy risks. An attacker + /// can generate a custom X.509 certificate containing a CRL Distribution Point or OCSP URL pointing to an + /// attacker-controlled server, thereby getting a notification when the user decrypts the message or verifies + /// its digital signature. /// - /// true if certificate revocation should be checked; otherwise, false. + /// true if CRLs should be downloaded automatically; otherwise, false. public bool CheckCertificateRevocation { get; set; } From d9cde6836d329354606a6835edb1148e92fcf02e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 May 2018 13:51:37 -0400 Subject: [PATCH 033/741] Updated unit tests --- UnitTests/Cryptography/DummySecureMimeContext.cs | 5 +++++ UnitTests/Cryptography/SecureMimeTests.cs | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/DummySecureMimeContext.cs b/UnitTests/Cryptography/DummySecureMimeContext.cs index 900629d34c..770c995ef0 100644 --- a/UnitTests/Cryptography/DummySecureMimeContext.cs +++ b/UnitTests/Cryptography/DummySecureMimeContext.cs @@ -46,6 +46,11 @@ public class DummySecureMimeContext : BouncyCastleSecureMimeContext internal readonly List certificates = new List (); internal readonly List crls = new List (); + public DummySecureMimeContext () + { + CheckCertificateRevocation = true; + } + /// /// Check whether or not a particular mailbox address can be used for signing. /// diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index d99cdd42da..25e3f1163e 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -899,7 +899,7 @@ public void TestSecureMimeImportExport () [TestFixture] public class SecureMimeTests : SecureMimeTestsBase { - readonly TemporarySecureMimeContext ctx = new TemporarySecureMimeContext (); + readonly TemporarySecureMimeContext ctx = new TemporarySecureMimeContext { CheckCertificateRevocation = true }; protected override SecureMimeContext CreateContext () { @@ -914,6 +914,7 @@ class MySecureMimeContext : DefaultSecureMimeContext { public MySecureMimeContext () : base ("smime.db", "no.secret") { + CheckCertificateRevocation = true; } } From 2b5555764b64a3fc19b765d36be7265eb8406bb4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 May 2018 14:09:09 -0400 Subject: [PATCH 034/741] Bumped BouncyCastle dependency to 1.8.2 --- MimeKit/MimeKit.Net45.project.json | 6 +++--- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKit.Portable.project.json | 2 +- MimeKit/MimeKit.WindowsUniversal81.project.json | 2 +- UnitTests/UnitTests.csproj | 10 +++++----- UnitTests/packages.config | 2 +- nuget/MimeKit.nuspec | 12 ++++++------ 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json index 8f6b4a8248..026a23dc25 100644 --- a/MimeKit/MimeKit.Net45.project.json +++ b/MimeKit/MimeKit.Net45.project.json @@ -1,4 +1,4 @@ -{ +{ "frameworks": { ".NETFramework,Version=v4.5": {} }, @@ -7,6 +7,6 @@ "win": {} }, "dependencies": { - "BouncyCastle": "1.8.1" + "BouncyCastle": "1.8.2" } -} +} \ No newline at end of file diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 3ae230841d..6d28a4a5ed 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -43,7 +43,7 @@ - + diff --git a/MimeKit/MimeKit.Portable.project.json b/MimeKit/MimeKit.Portable.project.json index b5d4cdf842..9dcf909e50 100644 --- a/MimeKit/MimeKit.Portable.project.json +++ b/MimeKit/MimeKit.Portable.project.json @@ -6,6 +6,6 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.1.3" + "Portable.BouncyCastle": "1.8.2" } } \ No newline at end of file diff --git a/MimeKit/MimeKit.WindowsUniversal81.project.json b/MimeKit/MimeKit.WindowsUniversal81.project.json index 68db0c76dc..c78145fc1b 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.project.json +++ b/MimeKit/MimeKit.WindowsUniversal81.project.json @@ -6,6 +6,6 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.1.3" + "Portable.BouncyCastle": "1.8.2" } } \ No newline at end of file diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 220f18becc..5c21e96148 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,4 +1,4 @@ - + Debug @@ -37,6 +37,9 @@ ..\MimeKit\mimekit.snk + + ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + @@ -44,9 +47,6 @@ ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - - ..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll @@ -256,4 +256,4 @@ - + \ No newline at end of file diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 33eec2a2ea..ee7e0bba61 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,6 +1,6 @@  - + diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 08b1fab365..6794cbf9c2 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -49,7 +49,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -87,13 +87,13 @@ - + - + - + From 7769060dee9f72268dd4619c6d04a6f28441a4c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 May 2018 14:10:46 -0400 Subject: [PATCH 035/741] Updated Newtownsoft.Json and System.Data.SQLite deps for Unit Tests --- UnitTests/UnitTests.csproj | 22 +++++++++++++++------- UnitTests/packages.config | 4 ++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 5c21e96148..118ace1b1e 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -10,6 +10,8 @@ UnitTests 8.0.30703 2.0 + + true @@ -40,19 +42,19 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + + ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + + ..\packages\System.Data.SQLite.Core.1.0.108.0\lib\net45\System.Data.SQLite.dll + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - ..\packages\System.Data.SQLite.Core.1.0.106.0\lib\net45\System.Data.SQLite.dll - @@ -255,5 +257,11 @@ - + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/UnitTests/packages.config b/UnitTests/packages.config index ee7e0bba61..311591bb68 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,7 +1,7 @@  - + - + \ No newline at end of file From ff3090dc39e9b6c5670af5500413a9a164fa1a94 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 21 May 2018 15:10:02 -0400 Subject: [PATCH 036/741] Bumped version to 2.0.4 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 11 +++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 12 +++++++----- nuget/MimeKitLite.nuspec | 9 +++++---- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 6d28a4a5ed..136f0b94fc 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.3 + 2.0.4 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 856116a178..9497d4d7fe 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.3 + 2.0.4 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 60f0b026f7..b85c19fa44 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.3.0")] -[assembly: AssemblyFileVersion ("2.0.3.0")] +[assembly: AssemblyInformationalVersion ("2.0.4.0")] +[assembly: AssemblyFileVersion ("2.0.4.0")] [assembly: AssemblyVersion ("2.0.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index ddc67c679e..4b03c02484 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,16 @@ # Release Notes +### MimeKit 2.0.4 + +* The default value of the `CheckCertificateRevocation` property located on the + `BouncyCastleSecureMimeContext` has been changed to `false` due to privacy concerns noted + in the Efail document published in May of 2018. Clients that + wish to continue automatic downloads of S/MIME CRLs can manually set the property to `true`. +* Properly wrap long mailbox names with quoted phrases. +* Fixed parsing of header blocks that span across read boundaries. (issue #395) +* Added FormatOptions.EnsureNewLine property (MailKit issue #251) +* Enable System.Net.Mail support for .NET Core 2.0. (issue #393) + ### MimeKit 2.0.3 * Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) diff --git a/appveyor.yml b/appveyor.yml index 8e92a72a7e..6f1dcf8bea 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.3.{build} +version: 2.0.4.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 6794cbf9c2..77f846126f 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.3 + 2.0.4 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,9 +25,11 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) -* Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. -* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385) +* The default value of the `CheckCertificateRevocation` property located on the `BouncyCastleSecureMimeContext` has been changed to `false` due to privacy concerns noted in the Efail document published in May of 2018. Clients that wish to continue automatic downloads of S/MIME CRLs can manually set the property to `true`. +* Properly wrap long mailbox names with quoted phrases. +* Fixed parsing of header blocks that span across read boundaries. (issue #395) +* Added FormatOptions.EnsureNewLine property (MailKit issue #251) +* Enable System.Net.Mail support for .NET Core 2.0. (issue #393) Xamarin Inc. en-US @@ -86,7 +88,7 @@ - + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 0f1715a4be..1e9e00b1ed 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.3 + 2.0.4 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,9 +25,10 @@ An Open Source library for creating and parsing MIME messages. -* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) -* Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. -* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385) +* Properly wrap long mailbox names with quoted phrases. +* Fixed parsing of header blocks that span across read boundaries. (issue #395) +* Added FormatOptions.EnsureNewLine property (MailKit issue #251) +* Enable System.Net.Mail support for .NET Core 2.0. (issue #393) Xamarin Inc. en-US From f2ff516968e02eb5e422f7a267cae4e8211685c1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 21 May 2018 15:24:33 -0400 Subject: [PATCH 037/741] Updated samples --- nuget/MimeKit.nuspec | 2 +- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 77f846126f..1b34bdd871 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -25,7 +25,7 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* The default value of the `CheckCertificateRevocation` property located on the `BouncyCastleSecureMimeContext` has been changed to `false` due to privacy concerns noted in the Efail document published in May of 2018. Clients that wish to continue automatic downloads of S/MIME CRLs can manually set the property to `true`. +* The default value of the `CheckCertificateRevocation` property located on the `BouncyCastleSecureMimeContext` has been changed to `false` due to privacy concerns noted in the Efail document published in May of 2018. Clients that wish to continue automatic downloads of S/MIME CRLs can manually set the property to `true`. * Properly wrap long mailbox names with quoted phrases. * Fixed parsing of header blocks that span across read boundaries. (issue #395) * Added FormatOptions.EnsureNewLine property (MailKit issue #251) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 065aa07075..f1af13777a 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.3\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.4\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 7011bdf33d..cc28e4dfb3 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 41b1254dfa..56e5c3ab53 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.0.3\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.0.4\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.0.3\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.0.4\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 7f0902e101..528d25304c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index f1aec72cef..6db4340678 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.0.3\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.0.4\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.0.3\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.0.4\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index f7227e4f55..cae6c43b8b 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index d08cd773e8..9d0bd6d7ec 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.3\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.4\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 265cbe81df..31c6af53cb 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 627460e2dd9c9d95c944eb3864df834efae078b8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 22 May 2018 21:16:07 -0400 Subject: [PATCH 038/741] Make sure messages created from SNM MailMessages have a Date header. Fixes https://github.com/jstedfast/MailKit/issues/710 --- MimeKit/MimeMessage.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 323934b7ba..8a9cebc58d 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -3539,6 +3539,9 @@ public static MimeMessage CreateFromMailMessage (MailMessage message) else msg.Subject = message.Subject ?? string.Empty; + if (!msg.Headers.Contains (HeaderId.Date)) + msg.Date = DateTimeOffset.Now; + switch (message.Priority) { case MailPriority.Normal: msg.Headers.RemoveAll (HeaderId.XMSMailPriority); From 5e8245473392c38afab80f1696e3e522a47bbe6b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 6 Jun 2018 19:54:30 -0700 Subject: [PATCH 039/741] Updated Makefile --- Makefile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 28679160d1..1528c44c9f 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,17 @@ -OUTDIR=MimeKit/bin/Release/lib/net40 +OUTDIR=MimeKit/bin/Release/lib/net45 ASSEMBLY=$(OUTDIR)/MimeKit.dll XMLDOCS=$(OUTDIR)/MimeKit.xml +SOLUTION=MimeKit.Net45.sln all: - xbuild /target:Build /p:Configuration=Release MimeKit.Net40.sln + msbuild /target:Build /p:Configuration=Release $(SOLUTION) debug: - xbuild /target:Build /p:Configuration=Debug MimeKit.Net40.sln + msbuild /target:Build /p:Configuration=Debug $(SOLUTION) clean: - xbuild /target:Clean /p:Configuration=Debug MimeKit.Net40.sln - xbuild /target:Clean /p:Configuration=Release MimeKit.Net40.sln + msbuild /target:Clean /p:Configuration=Debug $(SOLUTION) + msbuild /target:Clean /p:Configuration=Release $(SOLUTION) check-docs: @find docs/en -name "*.xml" -exec grep -l "To be added." {} \; From 84b71f53266e3dd1845554afd2ebc6c51fe32817 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 8 Jun 2018 14:13:27 -0700 Subject: [PATCH 040/741] Use a PayPal Donate button and move it to the top. --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 51a81a13f9..2bc0c4fafd 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,17 @@ MimeKit is a C# library which may be used for the creation and parsing of messages using the Multipurpose Internet Mail Extension (MIME), as defined by [numerous IETF specifications](https://github.com/jstedfast/MimeKit/blob/master/RFCs.md). +## Donate + +MimeKit is a personal open source project that I have put thousands of hours into perfecting with the +goal of making it the very best MIME parser framework for .NET. I need your help to achieve this. + +Donating helps pay for things such as web hosting, domain registration and licenses for developer tools +such as a performance profiler, memory profiler, a static code analysis tool, and more. It also helps +motivate me to continue working on the project. + +Click here to lend your support to MimeKit by making a donation! + ## History As a developer and user of email clients, I had come to realize that the vast majority of email client @@ -1057,16 +1068,6 @@ send me a **Pull Request** and I will try to review your changes in a timely man If you'd like to contribute but don't have any particular features in mind to work on, check out the issue tracker and look for something that might pique your interest! -## Donate - -MimeKit is a personal open source project that I have put thousands of hours into perfecting with the -goal of making it the very best MIME parser framework for .NET. I need your help to achieve this. - -Donating helps pay for things such as web hosting, domain registration and licenses for developer tools -such as a performance profiler, memory profiler, a static code analysis tool, and more. - -Click here to lend your support to MimeKit and MailKit by making a donation! - ## Reporting Bugs Have a bug or a feature request? [Please open a new issue](https://github.com/jstedfast/MimeKit/issues). From d33eb05f9b4bf9de5560b66b1d0cc8d835e8dd41 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 Jun 2018 06:39:37 -0400 Subject: [PATCH 041/741] Allow developers to pass in their own SecureRandom when generating PGP key pairs Fixes issue #404 --- MimeKit/Cryptography/OpenPgpContext.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index cdc3348fe3..6bdc416956 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -39,6 +39,7 @@ using Org.BouncyCastle.Math; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto.Prng; using Org.BouncyCastle.Bcpg.OpenPgp; using Org.BouncyCastle.Crypto.Parameters; @@ -1025,7 +1026,7 @@ void AddEncryptionKeyPair (PgpKeyRingGenerator keyRingGenerator, KeyGenerationPa keyRingGenerator.AddSubKey (keyPair, subpacketGenerator.Generate (), null); } - PgpKeyRingGenerator CreateKeyRingGenerator (MailboxAddress mailbox, EncryptionAlgorithm algorithm, long expirationTime, string password, DateTime now) + PgpKeyRingGenerator CreateKeyRingGenerator (MailboxAddress mailbox, EncryptionAlgorithm algorithm, long expirationTime, string password, DateTime now, SecureRandom random) { var enabledEncryptionAlgorithms = EnabledEncryptionAlgorithms; var enabledDigestAlgorithms = EnabledDigestAlgorithms; @@ -1037,7 +1038,7 @@ PgpKeyRingGenerator CreateKeyRingGenerator (MailboxAddress mailbox, EncryptionAl for (int i = 0; i < enabledDigestAlgorithms.Length; i++) digestAlgorithms[i] = (int) enabledDigestAlgorithms[i]; - var parameters = new RsaKeyGenerationParameters (BigInteger.ValueOf (0x10001), new SecureRandom (), 2048, 12); + var parameters = new RsaKeyGenerationParameters (BigInteger.ValueOf (0x10001), random, 2048, 12); var signingAlgorithm = PublicKeyAlgorithmTag.RsaSign; var keyPairGenerator = GeneratorUtilities.GetKeyPairGenerator ("RSA"); @@ -1067,7 +1068,7 @@ PgpKeyRingGenerator CreateKeyRingGenerator (MailboxAddress mailbox, EncryptionAl true, subpacketGenerator.Generate (), null, - new SecureRandom ()); + random); // Add the (optional) encryption subkey. AddEncryptionKeyPair (keyRingGenerator, parameters, PublicKeyAlgorithmTag.RsaGeneral, now, expirationTime, encryptionAlgorithms, digestAlgorithms); @@ -1085,6 +1086,7 @@ PgpKeyRingGenerator CreateKeyRingGenerator (MailboxAddress mailbox, EncryptionAl /// The password to be set on the secret key. /// The expiration date for the generated key pair. /// The symmetric key algorithm to use. + /// The source of randomness to use when generating the key pair. /// /// is null. /// -or- @@ -1093,7 +1095,7 @@ PgpKeyRingGenerator CreateKeyRingGenerator (MailboxAddress mailbox, EncryptionAl /// /// is not a date in the future. /// - public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? expirationDate = null, EncryptionAlgorithm algorithm = EncryptionAlgorithm.Aes256) + public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? expirationDate = null, EncryptionAlgorithm algorithm = EncryptionAlgorithm.Aes256, SecureRandom random = null) { var now = DateTime.UtcNow; long expirationTime = 0; @@ -1114,7 +1116,10 @@ public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? throw new ArgumentException ("expirationDate needs to be greater than DateTime.Now"); } - var generator = CreateKeyRingGenerator (mailbox, algorithm, expirationTime, password, now); + if (random == null) + random = new SecureRandom (new CryptoApiRandomGenerator ()); + + var generator = CreateKeyRingGenerator (mailbox, algorithm, expirationTime, password, now, random); Import (generator.GenerateSecretKeyRing ()); Import (generator.GeneratePublicKeyRing ()); From fb4823cb1a4c6921c6e05de283b1cda2667120e1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 18 Jun 2018 14:40:33 -0400 Subject: [PATCH 042/741] Use System.Buffers to potentially improve MemoryBlockStream Fixes https://github.com/jstedfast/MailKit/issues/725 --- MimeKit/IO/MemoryBlockStream.cs | 39 ++++++++++++++++--- MimeKit/MimeKit.Android.project.json | 7 +++- MimeKit/MimeKit.Net45.project.json | 3 +- MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.project.json | 3 +- .../MimeKit.WindowsUniversal81.project.json | 3 +- MimeKit/MimeKit.iOS.project.json | 5 ++- nuget/MimeKit.nuspec | 14 ++++++- 8 files changed, 62 insertions(+), 13 deletions(-) diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index f0d81e398e..2eadc5ccf0 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Buffers; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; @@ -48,6 +49,7 @@ public class MemoryBlockStream : Stream const long BlockSize = 2048; readonly List blocks = new List (); + readonly ArrayPool pool; long position, length; bool disposed; @@ -58,9 +60,28 @@ public class MemoryBlockStream : Stream /// Creates a new with an initial memory block /// of 2048 bytes. /// - public MemoryBlockStream () + public MemoryBlockStream () : this (ArrayPool.Shared) { - blocks.Add (new byte[BlockSize]); + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new with an initial memory block + /// of 2048 bytes. + /// + /// The memory pool to use for allocating blocks. + /// + /// is null. + /// + public MemoryBlockStream (ArrayPool pool) + { + if (pool == null) + throw new ArgumentNullException (nameof (pool)); + + blocks.Add (pool.Rent ((int) BlockSize)); + this.pool = pool; } /// @@ -327,7 +348,7 @@ public override void Write (byte[] buffer, int offset, int count) int nwritten = 0; while (capacity < position + count) { - blocks.Add (new byte[BlockSize]); + blocks.Add (pool.Rent ((int) BlockSize)); capacity += BlockSize; } @@ -501,12 +522,13 @@ public override void SetLength (long value) if (value > capacity) { do { - blocks.Add (new byte[BlockSize]); + blocks.Add (pool.Rent ((int) BlockSize)); capacity += BlockSize; } while (capacity < value); } else if (value < length) { // shed any blocks that are no longer needed while (capacity - value > BlockSize) { + pool.Return (blocks[blocks.Count - 1], true); blocks.RemoveAt (blocks.Count - 1); capacity -= BlockSize; } @@ -533,8 +555,15 @@ public override void SetLength (long value) /// false to release only the unmanaged resources. protected override void Dispose (bool disposing) { + if (disposing && !disposed) { + for (int i = 0; i < blocks.Count; i++) + pool.Return (blocks[i], true); + + blocks.Clear (); + disposed = true; + } + base.Dispose (disposing); - disposed = true; } } } diff --git a/MimeKit/MimeKit.Android.project.json b/MimeKit/MimeKit.Android.project.json index 22430247f9..ba2e203ff3 100644 --- a/MimeKit/MimeKit.Android.project.json +++ b/MimeKit/MimeKit.Android.project.json @@ -1,8 +1,11 @@ -{ +{ "frameworks": { "MonoAndroid,Version=v4.0.3": {} }, "runtimes": { "win-anycpu": {} + }, + "dependencies": { + "System.Buffers": "4.5.0" } -} +} \ No newline at end of file diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json index 026a23dc25..74388d1f83 100644 --- a/MimeKit/MimeKit.Net45.project.json +++ b/MimeKit/MimeKit.Net45.project.json @@ -7,6 +7,7 @@ "win": {} }, "dependencies": { - "BouncyCastle": "1.8.2" + "BouncyCastle": "1.8.2", + "System.Buffers": "4.5.0" } } \ No newline at end of file diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 136f0b94fc..32f8321cf4 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -43,6 +43,7 @@ + diff --git a/MimeKit/MimeKit.Portable.project.json b/MimeKit/MimeKit.Portable.project.json index 9dcf909e50..e1d2a7d1fe 100644 --- a/MimeKit/MimeKit.Portable.project.json +++ b/MimeKit/MimeKit.Portable.project.json @@ -6,6 +6,7 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.2", + "System.Buffers": "4.5.0" } } \ No newline at end of file diff --git a/MimeKit/MimeKit.WindowsUniversal81.project.json b/MimeKit/MimeKit.WindowsUniversal81.project.json index c78145fc1b..ab6e5d0de3 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.project.json +++ b/MimeKit/MimeKit.WindowsUniversal81.project.json @@ -6,6 +6,7 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.2", + "System.Buffers": "4.5.0" } } \ No newline at end of file diff --git a/MimeKit/MimeKit.iOS.project.json b/MimeKit/MimeKit.iOS.project.json index 4a7c8a5100..54d15b94b0 100644 --- a/MimeKit/MimeKit.iOS.project.json +++ b/MimeKit/MimeKit.iOS.project.json @@ -1,8 +1,11 @@ -{ +{ "frameworks": { "Xamarin.iOS,Version=v1.0": {} }, "runtimes": { "win-anycpu": {} + }, + "dependencies": { + "System.Buffers": "4.5.0" } } \ No newline at end of file diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 1b34bdd871..897832031e 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -51,10 +51,15 @@ + - - + + + + + + @@ -65,6 +70,7 @@ + @@ -77,6 +83,7 @@ + @@ -89,12 +96,15 @@ + + + From 33aa2c9e5c3782b9d6eb3c10686c39d510743575 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 19 Jun 2018 07:25:26 -0400 Subject: [PATCH 043/741] Use an ArrayPool tailored toward MemoryBlockStream instead Fixes https://github.com/jstedfast/MailKit/issues/725 --- MimeKit/IO/MemoryBlockStream.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index 2eadc5ccf0..e8cb08fb95 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -48,6 +48,8 @@ public class MemoryBlockStream : Stream const long MaxCapacity = int.MaxValue * BlockSize; const long BlockSize = 2048; + static readonly ArrayPool DefaultPool = ArrayPool.Create ((int) BlockSize, 200); + readonly List blocks = new List (); readonly ArrayPool pool; long position, length; @@ -60,7 +62,7 @@ public class MemoryBlockStream : Stream /// Creates a new with an initial memory block /// of 2048 bytes. /// - public MemoryBlockStream () : this (ArrayPool.Shared) + public MemoryBlockStream () : this (DefaultPool) { } From 5dfb61af4eb2f8f5018a303d18faa111f1664e13 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 20 Jun 2018 15:52:05 -0400 Subject: [PATCH 044/741] Use a custom BufferPool instead of System.Buffers' ArrayPool This allows us to not only avoid adding a dependency but also to use a more efficient data structure that doesn't waste space needed by ArrayPool's unused buckets. --- MimeKit/IO/MemoryBlockStream.cs | 44 ++--- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Android.project.json | 5 +- MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.Net45.project.json | 3 +- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.Portable.project.json | 5 +- MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + .../MimeKit.WindowsUniversal81.project.json | 5 +- MimeKit/MimeKit.iOS.csproj | 1 + MimeKit/MimeKit.iOS.project.json | 5 +- MimeKit/MimeKitLite.Android.csproj | 1 + MimeKit/MimeKitLite.Net45.csproj | 1 + MimeKit/MimeKitLite.NetStandard.csproj | 1 + MimeKit/MimeKitLite.Portable.csproj | 1 + MimeKit/MimeKitLite.WindowsUniversal81.csproj | 1 + MimeKit/MimeKitLite.iOS.csproj | 1 + MimeKit/Utils/BufferPool.cs | 177 ++++++++++++++++++ nuget/MimeKit.nuspec | 14 +- 23 files changed, 216 insertions(+), 58 deletions(-) create mode 100644 MimeKit/Utils/BufferPool.cs diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index e8cb08fb95..7ff4256335 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -26,10 +26,12 @@ using System; using System.IO; -using System.Buffers; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; +using System.Diagnostics; + +using MimeKit.Utils; namespace MimeKit.IO { /// @@ -48,10 +50,10 @@ public class MemoryBlockStream : Stream const long MaxCapacity = int.MaxValue * BlockSize; const long BlockSize = 2048; - static readonly ArrayPool DefaultPool = ArrayPool.Create ((int) BlockSize, 200); + static readonly BufferPool DefaultPool = new BufferPool ((int) BlockSize, 200); readonly List blocks = new List (); - readonly ArrayPool pool; + readonly BufferPool pool; long position, length; bool disposed; @@ -62,28 +64,10 @@ public class MemoryBlockStream : Stream /// Creates a new with an initial memory block /// of 2048 bytes. /// - public MemoryBlockStream () : this (DefaultPool) + public MemoryBlockStream () { - } - - /// - /// Initializes a new instance of the class. - /// - /// - /// Creates a new with an initial memory block - /// of 2048 bytes. - /// - /// The memory pool to use for allocating blocks. - /// - /// is null. - /// - public MemoryBlockStream (ArrayPool pool) - { - if (pool == null) - throw new ArgumentNullException (nameof (pool)); - - blocks.Add (pool.Rent ((int) BlockSize)); - this.pool = pool; + pool = DefaultPool; + blocks.Add (pool.Rent (Debugger.IsAttached)); } /// @@ -350,7 +334,7 @@ public override void Write (byte[] buffer, int offset, int count) int nwritten = 0; while (capacity < position + count) { - blocks.Add (pool.Rent ((int) BlockSize)); + blocks.Add (pool.Rent (Debugger.IsAttached)); capacity += BlockSize; } @@ -524,13 +508,13 @@ public override void SetLength (long value) if (value > capacity) { do { - blocks.Add (pool.Rent ((int) BlockSize)); + blocks.Add (pool.Rent (Debugger.IsAttached)); capacity += BlockSize; } while (capacity < value); } else if (value < length) { // shed any blocks that are no longer needed while (capacity - value > BlockSize) { - pool.Return (blocks[blocks.Count - 1], true); + pool.Return (blocks[blocks.Count - 1]); blocks.RemoveAt (blocks.Count - 1); capacity -= BlockSize; } @@ -558,8 +542,10 @@ public override void SetLength (long value) protected override void Dispose (bool disposing) { if (disposing && !disposed) { - for (int i = 0; i < blocks.Count; i++) - pool.Return (blocks[i], true); + for (int i = 0; i < blocks.Count; i++) { + pool.Return (blocks[i]); + blocks[i] = null; + } blocks.Clear (); disposed = true; diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index f9f43a3956..156405415b 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -202,6 +202,7 @@ + diff --git a/MimeKit/MimeKit.Android.project.json b/MimeKit/MimeKit.Android.project.json index ba2e203ff3..814017484f 100644 --- a/MimeKit/MimeKit.Android.project.json +++ b/MimeKit/MimeKit.Android.project.json @@ -4,8 +4,5 @@ }, "runtimes": { "win-anycpu": {} - }, - "dependencies": { - "System.Buffers": "4.5.0" } -} \ No newline at end of file +} diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 527863b331..8ed419c8cd 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -190,6 +190,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index dcdb130cce..ada246a95f 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -202,6 +202,7 @@ + diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json index 74388d1f83..026a23dc25 100644 --- a/MimeKit/MimeKit.Net45.project.json +++ b/MimeKit/MimeKit.Net45.project.json @@ -7,7 +7,6 @@ "win": {} }, "dependencies": { - "BouncyCastle": "1.8.2", - "System.Buffers": "4.5.0" + "BouncyCastle": "1.8.2" } } \ No newline at end of file diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 32f8321cf4..ee6a243751 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -43,7 +43,6 @@ - @@ -187,6 +186,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 544f7ee94a..0852f5b3fb 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -183,6 +183,7 @@ + diff --git a/MimeKit/MimeKit.Portable.project.json b/MimeKit/MimeKit.Portable.project.json index e1d2a7d1fe..d1b6aeb974 100644 --- a/MimeKit/MimeKit.Portable.project.json +++ b/MimeKit/MimeKit.Portable.project.json @@ -6,7 +6,6 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2", - "System.Buffers": "4.5.0" + "Portable.BouncyCastle": "1.8.2" } -} \ No newline at end of file +} diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 382e52aa9f..0dae278a08 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -183,6 +183,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 80ee16910d..d3c77614f9 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -189,6 +189,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index e140d40f74..4ba2f286a2 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -189,6 +189,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.project.json b/MimeKit/MimeKit.WindowsUniversal81.project.json index ab6e5d0de3..c32dd01cc1 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.project.json +++ b/MimeKit/MimeKit.WindowsUniversal81.project.json @@ -6,7 +6,6 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2", - "System.Buffers": "4.5.0" + "Portable.BouncyCastle": "1.8.2" } -} \ No newline at end of file +} diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 754bab7a33..25c1e18420 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -198,6 +198,7 @@ + diff --git a/MimeKit/MimeKit.iOS.project.json b/MimeKit/MimeKit.iOS.project.json index 54d15b94b0..cf98a9e75e 100644 --- a/MimeKit/MimeKit.iOS.project.json +++ b/MimeKit/MimeKit.iOS.project.json @@ -4,8 +4,5 @@ }, "runtimes": { "win-anycpu": {} - }, - "dependencies": { - "System.Buffers": "4.5.0" } -} \ No newline at end of file +} diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index 1529b3ed5e..1c46d1c723 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -137,6 +137,7 @@ + diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index 0726764d97..a057dc25c7 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -132,6 +132,7 @@ + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 9497d4d7fe..bac387be72 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -126,6 +126,7 @@ + diff --git a/MimeKit/MimeKitLite.Portable.csproj b/MimeKit/MimeKitLite.Portable.csproj index 4d213bc78f..0ff64011de 100644 --- a/MimeKit/MimeKitLite.Portable.csproj +++ b/MimeKit/MimeKitLite.Portable.csproj @@ -133,6 +133,7 @@ + diff --git a/MimeKit/MimeKitLite.WindowsUniversal81.csproj b/MimeKit/MimeKitLite.WindowsUniversal81.csproj index 88c0fab0d1..40844b918e 100644 --- a/MimeKit/MimeKitLite.WindowsUniversal81.csproj +++ b/MimeKit/MimeKitLite.WindowsUniversal81.csproj @@ -138,6 +138,7 @@ + diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj index b3e3386ae0..649bb5caf1 100644 --- a/MimeKit/MimeKitLite.iOS.csproj +++ b/MimeKit/MimeKitLite.iOS.csproj @@ -132,6 +132,7 @@ + diff --git a/MimeKit/Utils/BufferPool.cs b/MimeKit/Utils/BufferPool.cs new file mode 100644 index 0000000000..71e9707276 --- /dev/null +++ b/MimeKit/Utils/BufferPool.cs @@ -0,0 +1,177 @@ +// +// BufferPool.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Threading; +using System.Diagnostics; + +namespace MimeKit.Utils +{ + /// + /// Provides a pool of reusable buffers. + /// + /// + /// + /// Renting and returning buffers with a can increase performance + /// in situations where buffers are created and destroyed frequently, resulting in significant + /// memory pressure on the garbage collector. + /// + /// + /// This class is thread-safe. All members may be used by multiple threads concurrently. + /// + /// + class BufferPool + { + readonly byte[][] buffers; + SpinLock spinLock; + int index; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new buffer pool. + /// + /// The buffer size. + /// The maximum number of buffers that should be retained by the pool. + /// + /// is less than 1. + /// -or- + /// is less than 1. + /// + public BufferPool (int bufferSize, int maxBufferCount) + { + if (bufferSize < 1) + throw new ArgumentOutOfRangeException (nameof (bufferSize)); + + if (maxBufferCount < 1) + throw new ArgumentOutOfRangeException (nameof (maxBufferCount)); + + buffers = new byte[maxBufferCount][]; + MaxBufferCount = maxBufferCount; + BufferSize = bufferSize; + + spinLock = new SpinLock (Debugger.IsAttached); + } + + /// + /// Get the size of the buffers returned and/or retained by the pool. + /// + /// + /// Gets the size of the buffers returned and/or retained by the pool. + /// + /// The size of the buffer. + public int BufferSize { + get; private set; + } + + /// + /// Get the maximum number of buffers that the pool should retain. + /// + /// + /// Gets the maximum number of buffers that the pool should retain. + /// + /// The max buffer count. + public int MaxBufferCount { + get; private set; + } + + /// + /// Rent a buffer from the pool. + /// + /// + /// Returns a buffer from the pool. This buffer should later be returned back to the pool using + /// when the caller is finished using it so that it may be reused + /// in subsequent uses of . + /// + /// The rented buffer. + /// true if the buffer should be cleared; otherwise, false. + public byte[] Rent (bool clear = false) + { + byte[] buffer = null; + bool locked = false; + + try { + spinLock.Enter (ref locked); + + if (index < buffers.Length) { + buffer = buffers[index]; + buffers[index] = null; + index++; + } + } finally { + if (locked) + spinLock.Exit (false); + } + + if (buffer == null) + buffer = new byte[BufferSize]; + else if (clear) + Array.Clear (buffer, 0, BufferSize); + + return buffer; + } + + /// + /// Return the specified buffer to the pool. + /// + /// + /// Once a buffer has been returned to the pool, the caller gives up all ownership of the buffer + /// and must not use it. The reference returned from a given call to must + /// only be returned via once. The default + /// may hold onto the returned buffer in order to rent it again, or it may release the returned buffer + /// if it is determined that the pool already contains the maximum number of buffers as specified by + /// . + /// + /// The buffer. + /// + /// is null. + /// + /// + /// The size of the does not match . + /// + public void Return (byte[] buffer) + { + bool locked = false; + + if (buffer == null) + throw new ArgumentNullException (nameof (buffer)); + + if (buffer.Length != BufferSize) + throw new ArgumentException ("The size of the buffer does not match the size used by the pool.", nameof (buffer)); + + try { + spinLock.Enter (ref locked); + + if (index > 0) + buffers[--index] = buffer; + } finally { + if (locked) + spinLock.Exit (false); + } + } + } +} diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 897832031e..1b34bdd871 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -51,15 +51,10 @@ - - - - - - - + + @@ -70,7 +65,6 @@ - @@ -83,7 +77,6 @@ - @@ -96,15 +89,12 @@ - - - From a956d7d5117ef231eb5c6b98da4cc7c020fdb152 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 20 Jun 2018 16:59:21 -0400 Subject: [PATCH 045/741] Added note about the origin of BufferPool --- MimeKit/Utils/BufferPool.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MimeKit/Utils/BufferPool.cs b/MimeKit/Utils/BufferPool.cs index 71e9707276..8c92096fe1 100644 --- a/MimeKit/Utils/BufferPool.cs +++ b/MimeKit/Utils/BufferPool.cs @@ -24,6 +24,9 @@ // THE SOFTWARE. // +// Code based on Microsoft's System.Buffer.DefaultArrayPoolBucket class located at +// https://github.com/dotnet/corefx/blob/master/src/System.Buffers/src/System/Buffers/DefaultArrayPoolBucket.cs + using System; using System.Threading; using System.Diagnostics; From b214284762aa82c044861b21a859854660f1d114 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 Jun 2018 04:52:54 -0400 Subject: [PATCH 046/741] Fixed unit tests on Windows --- UnitTests/InternetAddressListTests.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index de7546c82d..1f766036ac 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -559,7 +559,11 @@ public void TestEncodingLongNameMixedQuotingAndEncoding () const string encodedName = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx xxxx"; const string encodedMailbox = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx\n xxxx "; const string address = "x.xxxxx@xxxxxxx-xxxxxx.xx"; - var buffer = Rfc2047.EncodePhrase (Encoding.UTF8, name); + var options = FormatOptions.Default.Clone (); + + options.NewLineFormat = NewLineFormat.Unix; + + var buffer = Rfc2047.EncodePhrase (options, Encoding.UTF8, name); var result = Encoding.UTF8.GetString (buffer); Assert.AreEqual (encodedName, result); From fb200db02c3eaa73a5ebc30eac403ccc07f7ddc1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 Jun 2018 05:23:46 -0400 Subject: [PATCH 047/741] Another unit test fix --- UnitTests/InternetAddressListTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index 1f766036ac..ca456d1a4a 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -573,7 +573,7 @@ public void TestEncodingLongNameMixedQuotingAndEncoding () list.Add (mailbox); - result = list.ToString (true); + result = list.ToString (options, true); Assert.AreEqual (encodedMailbox, result); } From f8736f1e5474fdd45e6117728a78e0597797745a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Jul 2018 10:25:22 -0400 Subject: [PATCH 048/741] Bumped version to 2.0.5 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 6 ++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 10 ++++------ nuget/MimeKitLite.nuspec | 8 +++----- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index ee6a243751..097d79d65c 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.4 + 2.0.5 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index bac387be72..7443c03ad5 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.4 + 2.0.5 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index b85c19fa44..ba49685ce5 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.4.0")] -[assembly: AssemblyFileVersion ("2.0.4.0")] +[assembly: AssemblyInformationalVersion ("2.0.5.0")] +[assembly: AssemblyFileVersion ("2.0.5.0")] [assembly: AssemblyVersion ("2.0.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 4b03c02484..dcf629e5d6 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,11 @@ # Release Notes +### MimeKit 2.0.5 + +* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) +* Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue #404) +* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725) + ### MimeKit 2.0.4 * The default value of the `CheckCertificateRevocation` property located on the diff --git a/appveyor.yml b/appveyor.yml index 6f1dcf8bea..61f7249907 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.4.{build} +version: 2.0.5.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 1b34bdd871..3e69b75857 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.4 + 2.0.5 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,11 +25,9 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* The default value of the `CheckCertificateRevocation` property located on the `BouncyCastleSecureMimeContext` has been changed to `false` due to privacy concerns noted in the Efail document published in May of 2018. Clients that wish to continue automatic downloads of S/MIME CRLs can manually set the property to `true`. -* Properly wrap long mailbox names with quoted phrases. -* Fixed parsing of header blocks that span across read boundaries. (issue #395) -* Added FormatOptions.EnsureNewLine property (MailKit issue #251) -* Enable System.Net.Mail support for .NET Core 2.0. (issue #393) +* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) +* Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue #404) +* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 1e9e00b1ed..f96c747b3d 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.4 + 2.0.5 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,10 +25,8 @@ An Open Source library for creating and parsing MIME messages. -* Properly wrap long mailbox names with quoted phrases. -* Fixed parsing of header blocks that span across read boundaries. (issue #395) -* Added FormatOptions.EnsureNewLine property (MailKit issue #251) -* Enable System.Net.Mail support for .NET Core 2.0. (issue #393) +* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) +* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725) Xamarin Inc. en-US From 0182a2bff908d2b578ef61ba2f6d64b95c47179a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Jul 2018 10:46:27 -0400 Subject: [PATCH 049/741] Fixed the build for netstandard1.3, netstandard1.6, and portable --- MimeKit/Cryptography/OpenPgpContext.cs | 7 ++++++- MimeKit/MimeKit.NetStandard.csproj | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 6bdc416956..98b18af4d5 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -1116,8 +1116,13 @@ public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? throw new ArgumentException ("expirationDate needs to be greater than DateTime.Now"); } - if (random == null) + if (random == null) { +#if (!NETSTANDARD || NETSTANDARD_2_0) && !PORTABLE random = new SecureRandom (new CryptoApiRandomGenerator ()); +#else + random = new SecureRandom (); +#endif + } var generator = CreateKeyRingGenerator (mailbox, algorithm, expirationTime, password, now, random); diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 097d79d65c..2d03624237 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -31,7 +31,7 @@ - $(DefineConstants);ENABLE_SNM + $(DefineConstants);NETSTANDARD_2_0;ENABLE_SNM From 52d739278d17812ef3c9609da5a8e630f1c2adaf Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Jul 2018 11:06:15 -0400 Subject: [PATCH 050/741] Updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index f1af13777a..478d5550f0 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.4\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.5\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index cc28e4dfb3..d6a41507d7 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 56e5c3ab53..29d4e32295 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.0.4\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.0.5\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.0.4\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.0.5\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 528d25304c..2e3f535fca 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 6db4340678..1166fb5ee5 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.0.4\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.0.5\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.0.4\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.0.5\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index cae6c43b8b..51de696b6e 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 9d0bd6d7ec..a4dc4b883f 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.4\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.5\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 31c6af53cb..bf54c5e44f 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 8cb80e86f9dbcf00e10da410eb782d7e97ca204d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 11 Jul 2018 08:28:14 -0400 Subject: [PATCH 051/741] Check TextPart content for a UTF-16 BOM and use a UTF-16 converter if found Fixes issue #417 Thanks to @ekalchev for this suggestion and initial patch --- MimeKit/TextPart.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 2fcb633688..f368b569bd 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -322,7 +322,14 @@ public string Text { if (encoding == null) { try { - return CharsetUtils.UTF8.GetString (content, 0, (int) memory.Length); + if (content.Length >= 2 && content[0] == 0xFF && content[1] == 0xFE) + encoding = Encoding.Unicode; // UTF-16LE + else if (content.Length >= 2 && content[0] == 0xFE && content[1] == 0xFF) + encoding = Encoding.BigEndianUnicode; // UTF-16BE + else + encoding = CharsetUtils.UTF8; + + return encoding.GetString (content, 0, (int) memory.Length); } catch (DecoderFallbackException) { // fall back to iso-8859-1 encoding = CharsetUtils.Latin1; From e5ee5488d5d08153aaa37c4492410c3a04d5bf0b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 22 Jul 2018 12:02:38 -0400 Subject: [PATCH 052/741] Fixed support for parsing mbox files using Content-Length --- MimeKit/AsyncMimeParser.cs | 7 +++++-- MimeKit/MimeParser.cs | 32 ++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index ba6450dc88..f2b9defe11 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -577,7 +577,7 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); if (format == MimeFormat.Mbox && options.RespectContentLength) { - bounds[0].ContentEnd = -1; + contentEnd = -1; for (int i = 0; i < headers.Count; i++) { if (!headers[i].Field.Equals ("Content-Length", StringComparison.OrdinalIgnoreCase)) @@ -586,12 +586,15 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat var value = headers[i].RawValue; int length, index = 0; + if (!ParseUtils.SkipWhiteSpace (value, ref index, value.Length)) + continue; + if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out length)) continue; long endOffset = GetOffset (inputIndex) + length; - bounds[0].ContentEnd = endOffset; + contentEnd = endOffset; break; } } diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index c7a2e3ec25..5bf048bc7b 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -58,7 +58,6 @@ class Boundary public int FinalLength { get { return Marker.Length; } } public int Length { get; private set; } public int MaxLength { get; private set; } - public long ContentEnd { get; set; } public Boundary (string boundary, int currentMaxLength) { @@ -66,7 +65,6 @@ public Boundary (string boundary, int currentMaxLength) Length = Marker.Length - 2; MaxLength = Math.Max (currentMaxLength, Marker.Length); - ContentEnd = -1; } Boundary () @@ -77,7 +75,6 @@ public static Boundary CreateMboxBoundary () { var boundary = new Boundary (); boundary.Marker = MboxFrom; - boundary.ContentEnd = -1; boundary.MaxLength = 5; boundary.Length = 5; return boundary; @@ -144,6 +141,7 @@ public partial class MimeParser : IEnumerable bool eos; ParserOptions options; + long contentEnd; Stream stream; long offset; @@ -1055,20 +1053,35 @@ static unsafe bool IsBoundary (byte* text, int length, byte[] boundary, int boun unsafe BoundaryType CheckBoundary (int startIndex, byte* start, int length) { + int count = bounds.Count; + if (!IsPossibleBoundary (start, length)) return BoundaryType.None; - long curOffset = GetOffset (startIndex); - for (int i = 0; i < bounds.Count; i++) { + if (format == MimeFormat.Mbox && options.RespectContentLength) { + // We'll need to special-case checking for the mbox From-marker when respecting Content-Length + count--; + } + + for (int i = 0; i < count; i++) { var boundary = bounds[i]; - if (curOffset >= boundary.ContentEnd && IsBoundary (start, length, boundary.Marker, boundary.FinalLength)) + if (IsBoundary (start, length, boundary.Marker, boundary.FinalLength)) return i == 0 ? BoundaryType.ImmediateEndBoundary : BoundaryType.ParentEndBoundary; if (IsBoundary (start, length, boundary.Marker, boundary.Length)) return i == 0 ? BoundaryType.ImmediateBoundary : BoundaryType.ParentBoundary; } + if (count < bounds.Count) { + // now it is time to check the mbox From-marker for the Content-Length case + long curOffset = GetOffset (startIndex); + var boundary = bounds[count]; + + if (curOffset >= contentEnd && IsBoundary (start, length, boundary.Marker, boundary.Length)) + return BoundaryType.ImmediateEndBoundary; + } + return BoundaryType.None; } @@ -1533,7 +1546,7 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); if (format == MimeFormat.Mbox && options.RespectContentLength) { - bounds[0].ContentEnd = -1; + contentEnd = -1; for (int i = 0; i < headers.Count; i++) { if (!headers[i].Field.Equals ("Content-Length", StringComparison.OrdinalIgnoreCase)) @@ -1542,12 +1555,15 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var value = headers[i].RawValue; int length, index = 0; + if (!ParseUtils.SkipWhiteSpace (value, ref index, value.Length)) + continue; + if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out length)) continue; long endOffset = GetOffset (inputIndex) + length; - bounds[0].ContentEnd = endOffset; + contentEnd = endOffset; break; } } From a0732b3bd0672a9daa749355020a32971af16fbe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 22 Jul 2018 12:05:34 -0400 Subject: [PATCH 053/741] Make use of HeaderId.ContentLength instead of string comparisons --- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/MimeParser.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index f2b9defe11..a585dbe1b6 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -580,7 +580,7 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat contentEnd = -1; for (int i = 0; i < headers.Count; i++) { - if (!headers[i].Field.Equals ("Content-Length", StringComparison.OrdinalIgnoreCase)) + if (headers[i].Id != HeaderId.ContentLength) continue; var value = headers[i].RawValue; diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 5bf048bc7b..a33fcd704d 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1549,7 +1549,7 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke contentEnd = -1; for (int i = 0; i < headers.Count; i++) { - if (!headers[i].Field.Equals ("Content-Length", StringComparison.OrdinalIgnoreCase)) + if (headers[i].Id != HeaderId.ContentLength) continue; var value = headers[i].RawValue; From 17805edccc4d3c0dde4055a52852ace4247bca21 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 22 Jul 2018 12:06:18 -0400 Subject: [PATCH 054/741] Don't need to quote ctrls in address names --- MimeKit/InternetAddress.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 187a5cd19a..a0af4aefb9 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -216,7 +216,7 @@ public int CompareTo (InternetAddress other) internal static string EncodeInternationalizedPhrase (string phrase) { for (int i = 0; i < phrase.Length; i++) { - if (char.IsControl (phrase[i]) || AtomSpecials.IndexOf (phrase[i]) != -1) + if (AtomSpecials.IndexOf (phrase[i]) != -1) return MimeUtils.Quote (phrase); } From efa85088cc68eb13f3877f42d80f13f8d61fb732 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Jul 2018 15:41:07 -0400 Subject: [PATCH 055/741] Use contentEnd = 0 insteadf of -1 --- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/MimeParser.cs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index a585dbe1b6..fc205b5404 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -577,7 +577,7 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); if (format == MimeFormat.Mbox && options.RespectContentLength) { - contentEnd = -1; + contentEnd = 0; for (int i = 0; i < headers.Count; i++) { if (headers[i].Id != HeaderId.ContentLength) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index a33fcd704d..1098b747cb 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -327,6 +327,7 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, mboxMarkerOffset = 0; mboxMarkerLength = 0; + contentEnd = 0; offset = stream.CanSeek ? stream.Position : 0; headers.Clear (); @@ -1058,7 +1059,7 @@ unsafe BoundaryType CheckBoundary (int startIndex, byte* start, int length) if (!IsPossibleBoundary (start, length)) return BoundaryType.None; - if (format == MimeFormat.Mbox && options.RespectContentLength) { + if (contentEnd > 0) { // We'll need to special-case checking for the mbox From-marker when respecting Content-Length count--; } @@ -1073,7 +1074,7 @@ unsafe BoundaryType CheckBoundary (int startIndex, byte* start, int length) return i == 0 ? BoundaryType.ImmediateBoundary : BoundaryType.ParentBoundary; } - if (count < bounds.Count) { + if (contentEnd > 0) { // now it is time to check the mbox From-marker for the Content-Length case long curOffset = GetOffset (startIndex); var boundary = bounds[count]; @@ -1546,7 +1547,7 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); if (format == MimeFormat.Mbox && options.RespectContentLength) { - contentEnd = -1; + contentEnd = 0; for (int i = 0; i < headers.Count; i++) { if (headers[i].Id != HeaderId.ContentLength) From 4044269ce078c7721eb0c2b1c790c70e0f40af70 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Jul 2018 15:42:27 -0400 Subject: [PATCH 056/741] Add more bounds checking for TryParseMailbox() Fixes issue #421 --- MimeKit/InternetAddress.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index a0af4aefb9..18f88a87df 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -425,6 +425,9 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st } while (index < endIndex && text[index] == '<'); } + if (index < endIndex && !ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + if (index >= endIndex) { if (throwOnError) throw new ParseException (string.Format ("Incomplete mailbox at offset {0}", startIndex), startIndex, index); @@ -432,9 +435,6 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st return false; } - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; - if (text[index] == (byte) '@') { // Note: we always pass 'false' as the throwOnError argument here so that we can throw a more informative exception on error if (!DomainList.TryParse (text, ref index, endIndex, false, out route)) { @@ -451,10 +451,18 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st return false; } + // skip over ':' index++; if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete mailbox at offset {0}", startIndex), startIndex, index); + + return false; + } } // Note: The only syntactically correct sentinel token here is the '>', but alas... to deal with the first example From 7d846aa1da782bfe49c5170eeee7536292e56997 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Jul 2018 15:50:57 -0400 Subject: [PATCH 057/741] Added unit test for previous commit --- UnitTests/InternetAddressListTests.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index ca456d1a4a..2f93fce88c 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -145,27 +145,32 @@ static void AssertTryParseFails (string text) { var buffer = Encoding.UTF8.GetBytes (text); InternetAddressList result; + bool success; try { - Assert.IsFalse (InternetAddressList.TryParse (text, out result), "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); + success = InternetAddressList.TryParse (text, out result); + Assert.IsFalse (success, "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); } catch (Exception ex) { Assert.Fail ("InternetAddressList.TryParse() should not throw an exception: {0}", ex); } try { - Assert.IsFalse (InternetAddressList.TryParse (buffer, out result), "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); + success = InternetAddressList.TryParse (buffer, out result); + Assert.IsFalse (success, "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); } catch (Exception ex) { Assert.Fail ("InternetAddressList.TryParse() should not throw an exception: {0}", ex); } try { - Assert.IsFalse (InternetAddressList.TryParse (buffer, 0, out result), "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); + success = InternetAddressList.TryParse (buffer, 0, out result); + Assert.IsFalse (success, "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); } catch (Exception ex) { Assert.Fail ("InternetAddressList.TryParse() should not throw an exception: {0}", ex); } try { - Assert.IsFalse (InternetAddressList.TryParse (buffer, 0, buffer.Length, out result), "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); + success = InternetAddressList.TryParse (buffer, 0, buffer.Length, out result); + Assert.IsFalse (success, "InternetAddressList.TryParse() should fail to parse \"{0}\".", text); } catch (Exception ex) { Assert.Fail ("InternetAddressList.TryParse() should not throw an exception: {0}", ex); } @@ -224,6 +229,13 @@ public void TestParseWhiteSpace () AssertParseAndTryParseFail (" "); } + [Test] + public void TestParseNameLessThan () + { + AssertParseFails ("\"Name\" <"); + AssertTryParse ("\"Name\" <", "", new InternetAddressList ()); + } + [Test] public void TestSimpleAddrSpec () { From 74bd0f1dc1951a5c03559d33d7446c2e7cc20983 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 30 Jul 2018 09:10:18 -0400 Subject: [PATCH 058/741] Removed app.config from DkimVerifier.csproj --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 478d5550f0..de131d692a 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -49,7 +49,6 @@ - From 0264ceacc9c5adb82eecae51f05fa35cab6ab6e7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 30 Jul 2018 09:12:01 -0400 Subject: [PATCH 059/741] Added ca.cnf --- UnitTests/TestData/smime/ca.cnf | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 UnitTests/TestData/smime/ca.cnf diff --git a/UnitTests/TestData/smime/ca.cnf b/UnitTests/TestData/smime/ca.cnf new file mode 100644 index 0000000000..a3d92c38e7 --- /dev/null +++ b/UnitTests/TestData/smime/ca.cnf @@ -0,0 +1,22 @@ +[ req_distinguished_name ] +countryName = US +countryName_min = 2 +countryName_max = 2 +stateOrProvinceName = Massachusetts +localityName = Boston +0.organizationName = Example Authority Inc. +organizationalUnitName = IT +commonName = Bruce Wayne +commonName_max = 64 +emailAddress = bruce.wayne@example.com +emailAddress_max = 64 + +[ req_attributes ] +challengePassword = no.secret +challengePassword_min = 4 +challengePassword_max = 20 + +[x509v3_CA] +req_extensions = v3_req # The extensions to add to a certificate request +keyUsage = keyCertSign, nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment + From 229905ce9d7f5623e6fca7a9ebb62a7d79138fc4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 30 Jul 2018 09:18:29 -0400 Subject: [PATCH 060/741] Regenerated S/MIME test certificates to replace expired ones --- UnitTests/Cryptography/SecureMimeTests.cs | 2 +- .../TestData/smime/certificate-authority.crt | 66 +++++---- .../TestData/smime/certificate-authority.key | 98 +++++++------- .../TestData/smime/certificate-authority.srl | 2 +- UnitTests/TestData/smime/chain.crt | 126 +++++++++--------- UnitTests/TestData/smime/intermediate.crt | 60 ++++----- UnitTests/TestData/smime/intermediate.csr | 50 +++---- UnitTests/TestData/smime/intermediate.key | 98 +++++++------- UnitTests/TestData/smime/smime.crt | 56 ++++---- UnitTests/TestData/smime/smime.csr | 50 +++---- UnitTests/TestData/smime/smime.key | 100 +++++++------- UnitTests/TestData/smime/smime.p12 | Bin 7397 -> 7141 bytes 12 files changed, 348 insertions(+), 360 deletions(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 25e3f1163e..81aa33f7b7 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -47,7 +47,7 @@ public abstract class SecureMimeTestsBase const string ExpiredCertificateMessage = "A required certificate is not within its validity period when verifying against the current system clock or the timestamp in the signed file.\r\n"; const string UntrustedRootCertificateMessage = "A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.\r\n"; const string ThunderbirdFingerprint = "354ea4dcf98166639b58ec5df06a65de0cd8a95c"; - const string MimeKitFingerprint = "2c29c66e281c9c515cc16a91ac87c4da988dbadf"; + const string MimeKitFingerprint = "4846fb5e27df6a23bb35a995443363e447d3426d"; const string ThunderbirdName = "fejj@gnome.org"; static readonly string[] CertificateAuthorities = { diff --git a/UnitTests/TestData/smime/certificate-authority.crt b/UnitTests/TestData/smime/certificate-authority.crt index 3ac3833b2e..189e8f3cd5 100644 --- a/UnitTests/TestData/smime/certificate-authority.crt +++ b/UnitTests/TestData/smime/certificate-authority.crt @@ -1,38 +1,32 @@ -----BEGIN CERTIFICATE----- -MIIGmDCCBICgAwIBAgIJAL1Tka1O620zMA0GCSqGSIb3DQEBBQUAMIGOMQswCQYD -VQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9u -MR8wHQYDVQQKExZFeGFtcGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVj -ZSBXYXluZTEfMB0GCSqGSIb3DQEJARYQcm9vdEBleGFtcGxlLmNvbTAeFw0xNzA2 -MzAwMTAzMzBaFw0xODA2MzAwMTAzMzBaMIGOMQswCQYDVQQGEwJVUzEWMBQGA1UE -CBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9uMR8wHQYDVQQKExZFeGFt -cGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVjZSBXYXluZTEfMB0GCSqG -SIb3DQEJARYQcm9vdEBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJr9a2EJ5qrut+xy6sT76oR064xh58oJruQJuT0p+Dw3b6Zx1Vor -RdAi/mwKwLyknkQm1vY0a3fl+z/epo3sD//HoP9NmFXbxV2VgIuMuZ+XBupPprzv -jjnds7ejsTC2Bssb8W5Q4PRpXushMjQcS/BWFQDAkxyMcyizJvLWK1ltLe5yle+N -3+T+1IdcA/Ucg+QfQ+DMU8DiLXVqmkfzK8stpjVhn0qEOlTs0el8x+3lCbHZbojJ -+4QTpUbcsXH9AdIxYOmRuREBXQMnF65gjwW4SIgN+1l5kJyEKHO/uj5BuFwJYm7s -IafxpNnXZX0VYtS7jtE1/SA2M6yJokvxwrmFdWWIpnM7ClowuZTnkhY8ey7/X8YJ -6o0rPHEAgAfutPTzBCudYx8d0eMPp5yxEGLoB/IQk4YgnX3Srz1BHmJri65MU28+ -oOAmWK4r+eakaD0EFRcrDaFYKagZtXJhHPYAZSILLvys90xawFS6Q0JZHtFq4d1Y -ofUZufknSVwKWO04NQVX+0JCN0cG6aPaQGYQCJlHkye4VnsEi3zFRaNpBuYhzrMF -jSW1ffsAc2s9HqJN1GpdYssMuobM/MRMGv27lWhmmPjTi1a8GKOtg8SS0EhNv96S -t/O7CVpBTwb6UVf0mtVmddSGpUdWaFGboYCfUhgsDfl57QawdEThhJaJAgMBAAGj -gfYwgfMwHQYDVR0OBBYEFKPy7nmCG9tPFt3HQvi8pT7TRRVdMIHDBgNVHSMEgbsw -gbiAFKPy7nmCG9tPFt3HQvi8pT7TRRVdoYGUpIGRMIGOMQswCQYDVQQGEwJVUzEW -MBQGA1UECBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9uMR8wHQYDVQQK -ExZFeGFtcGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVjZSBXYXluZTEf -MB0GCSqGSIb3DQEJARYQcm9vdEBleGFtcGxlLmNvbYIJAL1Tka1O620zMAwGA1Ud -EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAJkEGLCcY8GH/cFhSVa+Mo7hPvoo -kJf2CQMlt1YPPlV1KYjX2JdYVWbhaoM0Zjn6x4u9sUZ+brgRXJiuFtJzyMvtEr8e -nA5zsik1cw6zeWBkV0LVTgXCeLy51x/j6Mo/CBlzt3Ib8h/PSF3+UIMZwTKXEq1x -adCCoklqCBUERiYd3RHJlxIsdG1Yf1yO/auB7dG2Sgh31xPLh9cZxOUiok8zZmGE -rQ35bVPSHioaSKFBjKv1X+p0X8LZpoGpH2s3tDs5r6VlvUDMSKEZ+OUtkaikmXbx -+0+sxRm7MuY3wI62US06qQhvTaiQUkWN1WRhLhkYcxy4Sby8cwr9izETelfgIE/j -vCH2gKcPAx78QZ9/Z9qHp+y1EtQuk7r1ublg1DdLQqDzgz1qcq93iLD1BoKwnU6m -OdSaHjcMZszH3msPDUUbXtTHC0+8K8pPpbZqpaK1C+AVdrVTvbi7WdDvd7O02lLm -2IzZLCytYyx/kb68qxAF7wIVNmJh2VVTKgB/N4TIn60an0GZ1ZVmhJ3tVwxG9EkP -egCgE6Av09s9Cex1ER16Ximt4AWSiVoJucbRuE1Qi1YjdKmnmUPge69Da4GV4XTw -u8cbJ1FNr329EjjZdtbK4CifuOHhyE1FFHD6xxAiGodqH78fu2V3oqLHtocUKz1k -r2+37rbw2rtgjR8o +MIIFmjCCA4ICCQCoQQV4TRovnzANBgkqhkiG9w0BAQsFADCBjjELMAkGA1UEBhMC +VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G +A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 +bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx +MjQ4WhcNMTkwNzMwMTMxMjQ4WjCBjjELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h +c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB +dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxHzAdBgkqhkiG9w0B +CQEWEHJvb3RAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDukAcYsXsk1T3FnMw/6YgaaLekjNu528oqzuJx9sNYrdbgkkTivzc3AIS5 +uWywgKNvIgShqPycuSIuHbBaf43eUsBJJDJZhdHDGBxsq8WfPC9GuRhXFYnjNHLW +EhvgtPdkvaOab/FtzOCZ5EEbO/NraFytYOVapIlL6EjqH13ez7RjL0BQT2oKIs0f +OmNDMhR5RppTvYabOErkYFMD8zFfzyhhNj8oCM/GBUH8iEinlwN5OTz572SDP8xA +E/Aggm7vjtFBqsr4NE8zYhqN7ugfcTDM780eANxWhX0MBNPU2IaOGaUQohscbfRo +43kewIhgDRPboX9Jur+er0CL/Ged6jXwAh7AclPQ+diWfzXSqbx1F2/FYT0j9AAO +O2CGoxF3qVoSmQn6xCPbNqZfjy2Yl28UK7VWHNgFI8meoO4DhgWUiLziA35T7g1v +V+y/trzN8iHwyIMJ90W+8X7LbnhaYerZ2LHmdYMN6jsH1ZWsM0FVivu6t9cubR4j +gM1C3XVHBM6Tl6TUJ6OGNLcDHsLWBqcwiyYBE+t7ml5KMkLv2auR6nWGkSBe0jTD +VXHuBb+rYwWKZ4nHhMAO7rnnedLpp1O4Qdb+YwlTC665GN02zbFTMUH/SbRaOXkE +E6u9SWqzHttkYaqEPEKWs+Gzpd/YLRCSegK+elFIDOw7w0236QIDAQABMA0GCSqG +SIb3DQEBCwUAA4ICAQAl2fk3t9r/Ys7hH088FvqUG0k2pN5Mc+csWRdCFXRicm2I +a37DCiT/66L6uEX6yREphg8z6nSg1V8z2Q53uyEAlf5jaJRtqI8tMYZ4ldqAKpzp +pdIFi89DHJdx+GsAew/ijI8K6O3ClwtgGgHUxNpNon0jalxr00ZYb/c34UjnW1kd +Co734BW6lUvK0rR3wWtuYjqXCUVwTsQGAN+dDcIWI27oJIv6+4YdLv+lSwtXtJn5 +0FyZDwHuWbHz6o8M8xcXUCtv/NFYStxMYoHZ5KC5X1jsjTxfDXeiFLku/qsSC5sA +VulKgU39Ey80FMb11RQS/NlS8YFzPMc6qSFgsbEMXByQdtCj5CvSoYdU2hbac2QO +X4hjObQ76PCXKGni8JmsE8biDWQ7XvozMZYj8noZPwE7RGfYXsM4pr9JzdMWZaFY +tiN0yFopOk0f5Ym+CgK+UEwY/aVKk/EF5amcH7VYSoqD6hpRVrZVM9zv+X4fdYjD +HDlYJaGSR37drV969xW2TmEG/mxRF3beiPWhjwSfwE5+tUF7xFd2OZZ2kuYnK/nj +r6THrdSZ4FmD2LhXRb0hc73wwYvg/QvRQ+BvnnuN4ppBqcTV6P11zSa3CJ9fMs1j +uqaxR0ECuexDZI7l/JeVSc220XnvnhaPQe5kWfi8mGk2r3K7LVZlylCkgJvcWQ== -----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/certificate-authority.key b/UnitTests/TestData/smime/certificate-authority.key index b4e9de9b34..ee624082c4 100644 --- a/UnitTests/TestData/smime/certificate-authority.key +++ b/UnitTests/TestData/smime/certificate-authority.key @@ -1,51 +1,51 @@ -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/certificate-authority.srl b/UnitTests/TestData/smime/certificate-authority.srl index 88392afa16..4d72483732 100644 --- a/UnitTests/TestData/smime/certificate-authority.srl +++ b/UnitTests/TestData/smime/certificate-authority.srl @@ -1 +1 @@ -A68B9B780627A14D +A68B9B780627A14E diff --git a/UnitTests/TestData/smime/chain.crt b/UnitTests/TestData/smime/chain.crt index ed80f3557d..f4f9898e75 100644 --- a/UnitTests/TestData/smime/chain.crt +++ b/UnitTests/TestData/smime/chain.crt @@ -1,71 +1,65 @@ -----BEGIN CERTIFICATE----- -MIIFojCCA4oCCQCmi5t4BiehTTANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC -VVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjEfMB0G -A1UEChMWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAxMLQnJ1Y2UgV2F5 -bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTcwNjMwMDEw -MzMyWhcNMTgwNjMwMDEwMzMyWjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1h -c3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjEfMB0GA1UEChMWRXhhbXBsZSBB -dXRob3JpdHkgSW5jLjEUMBIGA1UEAxMLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B +MIIFojCCA4oCCQCmi5t4BiehTjANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC +VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G +A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 +bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx +MjU2WhcNMTkwNzMwMTMxMjU2WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h +c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB +dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B CQEWGGludGVybWVkaWF0ZUBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJx2WQPRH26XdXy13g98vCxn/Qo18IEsHbyfnY9KPJz1US/H -EbmGQI1mwEjk9n2mnk5ntGeCO5lwswfPtGhct5oVbWl/kkahdwhim2LU3wdigSwL -IMsrq6uH0rBe/P9owwO+STVolfwc6buG9MrIK8fnNL6eUC86/6MnPbwu3WnWX6cK -DILiWyHWAWqqWNa6y7qgOCjjfUMudodCJgWBsSZJGJDEi7YJ7mvQT8xQ98MN+88U -GDHJRuzPUy986PMa6UcS6IzIZp+sIzfjPPx4uxbKq23kXy0ZwjBkTWSozmAvX+Sf -6ZHPKCeBn4DECs2S0jpYbhhztxeLmmrn1Ry09JOYLxwmUJN5rZJq1SS7xPj0DMMA -Fb5++4zmYXxTB4m9itJMbikLfnOcO6CnZtlLV31G1VBEgOmCAInq0hUFfgObizwL -oCJzXwO6FOO/SOAnivP07aEC2Tc/KFkqZEnC6CR4stUIMMLUdSL5jdCFVyntzQmc -Uf33ccbqeI5BlFHJvoymXLOV4vjB6NnKvV9n2EeXS6f+vTyk6kq3G67RtkqCi1Aq -bHef66DGv1q1If9yYmOeh3Zi8hm7ZrhdbCKctyPr9LDKcEx4TdUOuyTi0m8/cF1Z -Z7JHwJ2uhVhh1XeUBgbJCUwDOrIyzTH3WCDXEmKEz/vt6vwQX52trEUGBODDAgMB -AAEwDQYJKoZIhvcNAQEFBQADggIBAANLYo8Ks+3ZonKyPYlT2TQYHIrkeIR6ONih -e4AOTWjyWyntEYniTx4gFHxxJeU8nwLd/EZG7Oy97GG4o4LljU78bB8aTeS2l4kR -JyJl8SkPXruKGKtJJ74B19RhofRRROO6KDuLt6IDqPrx9CDx+oQMN8I2kfPaZII+ -puOn77PwGqxWOauMbOjNgcBDM0cDOsNjx+cCOEULAYRT/V6ilmBbnDaFCZaQj0u2 -BNQ/oRa2avWVpT8WByGr7DXXrn3ad1KmLNEP6pFwGzjOP1/gAydm2YxxoYmGGFQt -ylRQvQygoUBnzQkdstnmbHmdmdOslZnOVuNttAUmlXRUH0atNFG12FUFK3Wi4wzn -9Kh5i/8fCyOxnzANixHOEB+MsYYJbxzb/fcA7wanjJd8Tz/uQbxOrTe1KCKHvAd0 -ZgIuUV9IPzRRiGDV5V2dJddki52qexQx24xhFCJbt7s0EQG/F1rdf+atEzhJFclL -AMvPH435Aqf/sI/CT99QcUGY0GNXtNQdUb1HiVQ2SWoFgZpeemkDmoRM/wFloVjH -Wc9RZBszI2PqBGs688EGHyGSD9cjdkxUj9Jpss+B0M64r7Ktu/DC0/VtZGq6CUDX -IHma7oUKs8wOUNpxn2ZJPWlQb5njpz5wSRDel0nTxgKrcjmvKIlewfc2p9BPnsap -S8tVo/sW +ggIPADCCAgoCggIBALi4vlwUhDHbjlX6YeDnPyAT3Cbq1TjPPAdC2L4xYDOhjxWS +qQOM2Ua2g/qQUhOZACuRyUjADwOL8XXJ/y3/AL+RKoDRdhdtD7QFZGoqOaYPsrkW +a424NBD9ULwiH3FpE74dNX86MOExrioWpc1MQyn5BuuNIjgjgOJlLw20qC6bJh/s +I8gHua3w1dohh+O53SFWwP6IzYvLYzPzBH+wUGjIr/csWudMP3ssm7P2Ze1KL2tP +D8Z6bZwCDY0HAC5D1oYJ27nGtgOF9/3DTxyr22gv+2A+l3u26LcAGpzyeX828StB +Py/bMrqVNVPcJDsub8UVmW/Dp+1xy5Jo1eVSCPh+Jm9Y+HjfMhRfgz01caQWpz+Q +TvYgWSWgg2KV1S/awoFHqa/dsmBs0KQn9GJnO573PlKXlh5jUUqbqKj2hvSMKWTK +lDIxJLKK/ZATqjlvDDGx8L0FiL08iUxy6aHsLhA8XaAK2TPMqjy44mnZG5F4fb8m +67BMkV66rVXdCfJs8GQimhykoM3zuKZKwJg1+1ZUJrx/r04llVTIT5Y9AmFQzrNr +4t7TR/VnKz215UI/U36plGWVs2Z3UuLoKQsHePnRYGjXOrFQFOuAj9eqthkoCQd3 +L3F2OhRSzJ5glm/h10gi/ej8ulq18SznNXGTjziTQMuZ31rr0YYApfBsz0w9AgMB +AAEwDQYJKoZIhvcNAQEFBQADggIBAOwLaBK2DqMHo/xgif+xlMIJk4rcjXnRk+oO +9GwzGrcFm+M5xodAV0/zLt2j+d+ir3vqjpp3NrJRyM2g4tOgXNj4vLy5hjYMxpaX +vvxdzV+PvUGlmucg1dTwKVlATXTcGCNgvG62+vyVmBJ3PVbIjw9mMi2uZZNgnJlL +uAxarbKEaNZ75BFTCmWeeOGTh3NaLppKVer7xBHC7Voy6eXUcrDD9CrwUUZ0M2tq +7jQwlIVldyFuJ1ccqBhVjtwXkaQer/eAdkcLXBGUMy4ZxibhxjnsV6INKqZiLDHO +S46F08O506IuY3/qdWuA7LOfMNekaHQwKuMdarNSiEGoAlYiEYaWE7HJ6SdUzzk9 +6BPHr8dRVSSGpGM3a3Vflq9uMldt8kBGnEP9Z+pqQurmIpcPk4lkNzUiHiKy4Uah +1yikEhroPtYL+pZqFf9AKHgligz3dqJfW4noyTsVrHwGC7iXg8keHVRpicVx7R8C +Ci9pvJaFfUhIldXjeRCS/9EbedtmnCti2Zo7UFbTkIk4Pg1oQlsO4aaFPj3Vkz3T +plzVIZQF0zOSPaSgvPyE60AQ0EwIgET9rkvo23EVaqQVN+aGTiGTihKtOwHY4NHy +JG/zdWxHUL61b2Zw6Xa/Zh063NJ6gsL/ZUUA5Qgg8OAKGUJYnXCgDWCVHpSeWu/e +fnYch7TL -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIGmDCCBICgAwIBAgIJAL1Tka1O620zMA0GCSqGSIb3DQEBBQUAMIGOMQswCQYD -VQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9u -MR8wHQYDVQQKExZFeGFtcGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVj -ZSBXYXluZTEfMB0GCSqGSIb3DQEJARYQcm9vdEBleGFtcGxlLmNvbTAeFw0xNzA2 -MzAwMTAzMzBaFw0xODA2MzAwMTAzMzBaMIGOMQswCQYDVQQGEwJVUzEWMBQGA1UE -CBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9uMR8wHQYDVQQKExZFeGFt -cGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVjZSBXYXluZTEfMB0GCSqG -SIb3DQEJARYQcm9vdEBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJr9a2EJ5qrut+xy6sT76oR064xh58oJruQJuT0p+Dw3b6Zx1Vor -RdAi/mwKwLyknkQm1vY0a3fl+z/epo3sD//HoP9NmFXbxV2VgIuMuZ+XBupPprzv -jjnds7ejsTC2Bssb8W5Q4PRpXushMjQcS/BWFQDAkxyMcyizJvLWK1ltLe5yle+N -3+T+1IdcA/Ucg+QfQ+DMU8DiLXVqmkfzK8stpjVhn0qEOlTs0el8x+3lCbHZbojJ -+4QTpUbcsXH9AdIxYOmRuREBXQMnF65gjwW4SIgN+1l5kJyEKHO/uj5BuFwJYm7s -IafxpNnXZX0VYtS7jtE1/SA2M6yJokvxwrmFdWWIpnM7ClowuZTnkhY8ey7/X8YJ -6o0rPHEAgAfutPTzBCudYx8d0eMPp5yxEGLoB/IQk4YgnX3Srz1BHmJri65MU28+ -oOAmWK4r+eakaD0EFRcrDaFYKagZtXJhHPYAZSILLvys90xawFS6Q0JZHtFq4d1Y -ofUZufknSVwKWO04NQVX+0JCN0cG6aPaQGYQCJlHkye4VnsEi3zFRaNpBuYhzrMF -jSW1ffsAc2s9HqJN1GpdYssMuobM/MRMGv27lWhmmPjTi1a8GKOtg8SS0EhNv96S -t/O7CVpBTwb6UVf0mtVmddSGpUdWaFGboYCfUhgsDfl57QawdEThhJaJAgMBAAGj -gfYwgfMwHQYDVR0OBBYEFKPy7nmCG9tPFt3HQvi8pT7TRRVdMIHDBgNVHSMEgbsw -gbiAFKPy7nmCG9tPFt3HQvi8pT7TRRVdoYGUpIGRMIGOMQswCQYDVQQGEwJVUzEW -MBQGA1UECBMNTWFzc2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9uMR8wHQYDVQQK -ExZFeGFtcGxlIEF1dGhvcml0eSBJbmMuMRQwEgYDVQQDEwtCcnVjZSBXYXluZTEf -MB0GCSqGSIb3DQEJARYQcm9vdEBleGFtcGxlLmNvbYIJAL1Tka1O620zMAwGA1Ud -EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAJkEGLCcY8GH/cFhSVa+Mo7hPvoo -kJf2CQMlt1YPPlV1KYjX2JdYVWbhaoM0Zjn6x4u9sUZ+brgRXJiuFtJzyMvtEr8e -nA5zsik1cw6zeWBkV0LVTgXCeLy51x/j6Mo/CBlzt3Ib8h/PSF3+UIMZwTKXEq1x -adCCoklqCBUERiYd3RHJlxIsdG1Yf1yO/auB7dG2Sgh31xPLh9cZxOUiok8zZmGE -rQ35bVPSHioaSKFBjKv1X+p0X8LZpoGpH2s3tDs5r6VlvUDMSKEZ+OUtkaikmXbx -+0+sxRm7MuY3wI62US06qQhvTaiQUkWN1WRhLhkYcxy4Sby8cwr9izETelfgIE/j -vCH2gKcPAx78QZ9/Z9qHp+y1EtQuk7r1ublg1DdLQqDzgz1qcq93iLD1BoKwnU6m -OdSaHjcMZszH3msPDUUbXtTHC0+8K8pPpbZqpaK1C+AVdrVTvbi7WdDvd7O02lLm -2IzZLCytYyx/kb68qxAF7wIVNmJh2VVTKgB/N4TIn60an0GZ1ZVmhJ3tVwxG9EkP -egCgE6Av09s9Cex1ER16Ximt4AWSiVoJucbRuE1Qi1YjdKmnmUPge69Da4GV4XTw -u8cbJ1FNr329EjjZdtbK4CifuOHhyE1FFHD6xxAiGodqH78fu2V3oqLHtocUKz1k -r2+37rbw2rtgjR8o +MIIFmjCCA4ICCQCoQQV4TRovnzANBgkqhkiG9w0BAQsFADCBjjELMAkGA1UEBhMC +VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G +A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 +bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx +MjQ4WhcNMTkwNzMwMTMxMjQ4WjCBjjELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h +c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB +dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxHzAdBgkqhkiG9w0B +CQEWEHJvb3RAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDukAcYsXsk1T3FnMw/6YgaaLekjNu528oqzuJx9sNYrdbgkkTivzc3AIS5 +uWywgKNvIgShqPycuSIuHbBaf43eUsBJJDJZhdHDGBxsq8WfPC9GuRhXFYnjNHLW +EhvgtPdkvaOab/FtzOCZ5EEbO/NraFytYOVapIlL6EjqH13ez7RjL0BQT2oKIs0f +OmNDMhR5RppTvYabOErkYFMD8zFfzyhhNj8oCM/GBUH8iEinlwN5OTz572SDP8xA +E/Aggm7vjtFBqsr4NE8zYhqN7ugfcTDM780eANxWhX0MBNPU2IaOGaUQohscbfRo +43kewIhgDRPboX9Jur+er0CL/Ged6jXwAh7AclPQ+diWfzXSqbx1F2/FYT0j9AAO +O2CGoxF3qVoSmQn6xCPbNqZfjy2Yl28UK7VWHNgFI8meoO4DhgWUiLziA35T7g1v +V+y/trzN8iHwyIMJ90W+8X7LbnhaYerZ2LHmdYMN6jsH1ZWsM0FVivu6t9cubR4j +gM1C3XVHBM6Tl6TUJ6OGNLcDHsLWBqcwiyYBE+t7ml5KMkLv2auR6nWGkSBe0jTD +VXHuBb+rYwWKZ4nHhMAO7rnnedLpp1O4Qdb+YwlTC665GN02zbFTMUH/SbRaOXkE +E6u9SWqzHttkYaqEPEKWs+Gzpd/YLRCSegK+elFIDOw7w0236QIDAQABMA0GCSqG +SIb3DQEBCwUAA4ICAQAl2fk3t9r/Ys7hH088FvqUG0k2pN5Mc+csWRdCFXRicm2I +a37DCiT/66L6uEX6yREphg8z6nSg1V8z2Q53uyEAlf5jaJRtqI8tMYZ4ldqAKpzp +pdIFi89DHJdx+GsAew/ijI8K6O3ClwtgGgHUxNpNon0jalxr00ZYb/c34UjnW1kd +Co734BW6lUvK0rR3wWtuYjqXCUVwTsQGAN+dDcIWI27oJIv6+4YdLv+lSwtXtJn5 +0FyZDwHuWbHz6o8M8xcXUCtv/NFYStxMYoHZ5KC5X1jsjTxfDXeiFLku/qsSC5sA +VulKgU39Ey80FMb11RQS/NlS8YFzPMc6qSFgsbEMXByQdtCj5CvSoYdU2hbac2QO +X4hjObQ76PCXKGni8JmsE8biDWQ7XvozMZYj8noZPwE7RGfYXsM4pr9JzdMWZaFY +tiN0yFopOk0f5Ym+CgK+UEwY/aVKk/EF5amcH7VYSoqD6hpRVrZVM9zv+X4fdYjD +HDlYJaGSR37drV969xW2TmEG/mxRF3beiPWhjwSfwE5+tUF7xFd2OZZ2kuYnK/nj +r6THrdSZ4FmD2LhXRb0hc73wwYvg/QvRQ+BvnnuN4ppBqcTV6P11zSa3CJ9fMs1j +uqaxR0ECuexDZI7l/JeVSc220XnvnhaPQe5kWfi8mGk2r3K7LVZlylCkgJvcWQ== -----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/intermediate.crt b/UnitTests/TestData/smime/intermediate.crt index cd1a33f096..1723acc510 100644 --- a/UnitTests/TestData/smime/intermediate.crt +++ b/UnitTests/TestData/smime/intermediate.crt @@ -1,33 +1,33 @@ -----BEGIN CERTIFICATE----- -MIIFojCCA4oCCQCmi5t4BiehTTANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC -VVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjEfMB0G -A1UEChMWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAxMLQnJ1Y2UgV2F5 -bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTcwNjMwMDEw -MzMyWhcNMTgwNjMwMDEwMzMyWjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1h -c3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjEfMB0GA1UEChMWRXhhbXBsZSBB -dXRob3JpdHkgSW5jLjEUMBIGA1UEAxMLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B +MIIFojCCA4oCCQCmi5t4BiehTjANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC +VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G +A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 +bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx +MjU2WhcNMTkwNzMwMTMxMjU2WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h +c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB +dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B CQEWGGludGVybWVkaWF0ZUBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJx2WQPRH26XdXy13g98vCxn/Qo18IEsHbyfnY9KPJz1US/H -EbmGQI1mwEjk9n2mnk5ntGeCO5lwswfPtGhct5oVbWl/kkahdwhim2LU3wdigSwL -IMsrq6uH0rBe/P9owwO+STVolfwc6buG9MrIK8fnNL6eUC86/6MnPbwu3WnWX6cK -DILiWyHWAWqqWNa6y7qgOCjjfUMudodCJgWBsSZJGJDEi7YJ7mvQT8xQ98MN+88U -GDHJRuzPUy986PMa6UcS6IzIZp+sIzfjPPx4uxbKq23kXy0ZwjBkTWSozmAvX+Sf -6ZHPKCeBn4DECs2S0jpYbhhztxeLmmrn1Ry09JOYLxwmUJN5rZJq1SS7xPj0DMMA -Fb5++4zmYXxTB4m9itJMbikLfnOcO6CnZtlLV31G1VBEgOmCAInq0hUFfgObizwL -oCJzXwO6FOO/SOAnivP07aEC2Tc/KFkqZEnC6CR4stUIMMLUdSL5jdCFVyntzQmc -Uf33ccbqeI5BlFHJvoymXLOV4vjB6NnKvV9n2EeXS6f+vTyk6kq3G67RtkqCi1Aq -bHef66DGv1q1If9yYmOeh3Zi8hm7ZrhdbCKctyPr9LDKcEx4TdUOuyTi0m8/cF1Z -Z7JHwJ2uhVhh1XeUBgbJCUwDOrIyzTH3WCDXEmKEz/vt6vwQX52trEUGBODDAgMB -AAEwDQYJKoZIhvcNAQEFBQADggIBAANLYo8Ks+3ZonKyPYlT2TQYHIrkeIR6ONih -e4AOTWjyWyntEYniTx4gFHxxJeU8nwLd/EZG7Oy97GG4o4LljU78bB8aTeS2l4kR -JyJl8SkPXruKGKtJJ74B19RhofRRROO6KDuLt6IDqPrx9CDx+oQMN8I2kfPaZII+ -puOn77PwGqxWOauMbOjNgcBDM0cDOsNjx+cCOEULAYRT/V6ilmBbnDaFCZaQj0u2 -BNQ/oRa2avWVpT8WByGr7DXXrn3ad1KmLNEP6pFwGzjOP1/gAydm2YxxoYmGGFQt -ylRQvQygoUBnzQkdstnmbHmdmdOslZnOVuNttAUmlXRUH0atNFG12FUFK3Wi4wzn -9Kh5i/8fCyOxnzANixHOEB+MsYYJbxzb/fcA7wanjJd8Tz/uQbxOrTe1KCKHvAd0 -ZgIuUV9IPzRRiGDV5V2dJddki52qexQx24xhFCJbt7s0EQG/F1rdf+atEzhJFclL -AMvPH435Aqf/sI/CT99QcUGY0GNXtNQdUb1HiVQ2SWoFgZpeemkDmoRM/wFloVjH -Wc9RZBszI2PqBGs688EGHyGSD9cjdkxUj9Jpss+B0M64r7Ktu/DC0/VtZGq6CUDX -IHma7oUKs8wOUNpxn2ZJPWlQb5njpz5wSRDel0nTxgKrcjmvKIlewfc2p9BPnsap -S8tVo/sW +ggIPADCCAgoCggIBALi4vlwUhDHbjlX6YeDnPyAT3Cbq1TjPPAdC2L4xYDOhjxWS +qQOM2Ua2g/qQUhOZACuRyUjADwOL8XXJ/y3/AL+RKoDRdhdtD7QFZGoqOaYPsrkW +a424NBD9ULwiH3FpE74dNX86MOExrioWpc1MQyn5BuuNIjgjgOJlLw20qC6bJh/s +I8gHua3w1dohh+O53SFWwP6IzYvLYzPzBH+wUGjIr/csWudMP3ssm7P2Ze1KL2tP +D8Z6bZwCDY0HAC5D1oYJ27nGtgOF9/3DTxyr22gv+2A+l3u26LcAGpzyeX828StB +Py/bMrqVNVPcJDsub8UVmW/Dp+1xy5Jo1eVSCPh+Jm9Y+HjfMhRfgz01caQWpz+Q +TvYgWSWgg2KV1S/awoFHqa/dsmBs0KQn9GJnO573PlKXlh5jUUqbqKj2hvSMKWTK +lDIxJLKK/ZATqjlvDDGx8L0FiL08iUxy6aHsLhA8XaAK2TPMqjy44mnZG5F4fb8m +67BMkV66rVXdCfJs8GQimhykoM3zuKZKwJg1+1ZUJrx/r04llVTIT5Y9AmFQzrNr +4t7TR/VnKz215UI/U36plGWVs2Z3UuLoKQsHePnRYGjXOrFQFOuAj9eqthkoCQd3 +L3F2OhRSzJ5glm/h10gi/ej8ulq18SznNXGTjziTQMuZ31rr0YYApfBsz0w9AgMB +AAEwDQYJKoZIhvcNAQEFBQADggIBAOwLaBK2DqMHo/xgif+xlMIJk4rcjXnRk+oO +9GwzGrcFm+M5xodAV0/zLt2j+d+ir3vqjpp3NrJRyM2g4tOgXNj4vLy5hjYMxpaX +vvxdzV+PvUGlmucg1dTwKVlATXTcGCNgvG62+vyVmBJ3PVbIjw9mMi2uZZNgnJlL +uAxarbKEaNZ75BFTCmWeeOGTh3NaLppKVer7xBHC7Voy6eXUcrDD9CrwUUZ0M2tq +7jQwlIVldyFuJ1ccqBhVjtwXkaQer/eAdkcLXBGUMy4ZxibhxjnsV6INKqZiLDHO +S46F08O506IuY3/qdWuA7LOfMNekaHQwKuMdarNSiEGoAlYiEYaWE7HJ6SdUzzk9 +6BPHr8dRVSSGpGM3a3Vflq9uMldt8kBGnEP9Z+pqQurmIpcPk4lkNzUiHiKy4Uah +1yikEhroPtYL+pZqFf9AKHgligz3dqJfW4noyTsVrHwGC7iXg8keHVRpicVx7R8C +Ci9pvJaFfUhIldXjeRCS/9EbedtmnCti2Zo7UFbTkIk4Pg1oQlsO4aaFPj3Vkz3T +plzVIZQF0zOSPaSgvPyE60AQ0EwIgET9rkvo23EVaqQVN+aGTiGTihKtOwHY4NHy +JG/zdWxHUL61b2Zw6Xa/Zh063NJ6gsL/ZUUA5Qgg8OAKGUJYnXCgDWCVHpSeWu/e +fnYch7TL -----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/intermediate.csr b/UnitTests/TestData/smime/intermediate.csr index a65375a2cf..c311bbd4a8 100644 --- a/UnitTests/TestData/smime/intermediate.csr +++ b/UnitTests/TestData/smime/intermediate.csr @@ -1,28 +1,28 @@ -----BEGIN CERTIFICATE REQUEST----- -MIIE3DCCAsQCAQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl -dHRzMQ8wDQYDVQQHEwZCb3N0b24xHzAdBgNVBAoTFkV4YW1wbGUgQXV0aG9yaXR5 -IEluYy4xFDASBgNVBAMTC0JydWNlIFdheW5lMScwJQYJKoZIhvcNAQkBFhhpbnRl +MIIE3DCCAsQCAQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNl +dHRzMQ8wDQYDVQQHDAZCb3N0b24xHzAdBgNVBAoMFkV4YW1wbGUgQXV0aG9yaXR5 +IEluYy4xFDASBgNVBAMMC0JydWNlIFdheW5lMScwJQYJKoZIhvcNAQkBFhhpbnRl cm1lZGlhdGVAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCcdlkD0R9ul3V8td4PfLwsZ/0KNfCBLB28n52PSjyc9VEvxxG5hkCNZsBI -5PZ9pp5OZ7RngjuZcLMHz7RoXLeaFW1pf5JGoXcIYpti1N8HYoEsCyDLK6urh9Kw -Xvz/aMMDvkk1aJX8HOm7hvTKyCvH5zS+nlAvOv+jJz28Lt1p1l+nCgyC4lsh1gFq -qljWusu6oDgo431DLnaHQiYFgbEmSRiQxIu2Ce5r0E/MUPfDDfvPFBgxyUbsz1Mv -fOjzGulHEuiMyGafrCM34zz8eLsWyqtt5F8tGcIwZE1kqM5gL1/kn+mRzygngZ+A -xArNktI6WG4Yc7cXi5pq59UctPSTmC8cJlCTea2SatUku8T49AzDABW+fvuM5mF8 -UweJvYrSTG4pC35znDugp2bZS1d9RtVQRIDpggCJ6tIVBX4Dm4s8C6Aic18DuhTj -v0jgJ4rz9O2hAtk3PyhZKmRJwugkeLLVCDDC1HUi+Y3QhVcp7c0JnFH993HG6niO -QZRRyb6MplyzleL4wejZyr1fZ9hHl0un/r08pOpKtxuu0bZKgotQKmx3n+ugxr9a -tSH/cmJjnod2YvIZu2a4XWwinLcj6/SwynBMeE3VDrsk4tJvP3BdWWeyR8CdroVY -YdV3lAYGyQlMAzqyMs0x91gg1xJihM/77er8EF+draxFBgTgwwIDAQABoAAwDQYJ -KoZIhvcNAQEFBQADggIBACgz7EpZwzpWyEwYa9XHCP0cBEXPtHgzQgrXcqS34XlS -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 -----END CERTIFICATE REQUEST----- diff --git a/UnitTests/TestData/smime/intermediate.key b/UnitTests/TestData/smime/intermediate.key index 9db2f4f8f4..f2c636fdaf 100644 --- a/UnitTests/TestData/smime/intermediate.key +++ b/UnitTests/TestData/smime/intermediate.key @@ -1,51 +1,51 @@ -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/smime.crt b/UnitTests/TestData/smime/smime.crt index 503c436117..71c75c0596 100644 --- a/UnitTests/TestData/smime/smime.crt +++ b/UnitTests/TestData/smime/smime.crt @@ -1,33 +1,33 @@ -----BEGIN TRUSTED CERTIFICATE----- MIIFgTCCA2kCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYD -VQQIEw1NYXNzYWNodXNldHRzMQ8wDQYDVQQHEwZCb3N0b24xHzAdBgNVBAoTFkV4 -YW1wbGUgQXV0aG9yaXR5IEluYy4xFDASBgNVBAMTC0JydWNlIFdheW5lMScwJQYJ -KoZIhvcNAQkBFhhpbnRlcm1lZGlhdGVAZXhhbXBsZS5jb20wHhcNMTcwNjMwMDEw -MzQyWhcNMTgwNjMwMDEwMzQyWjB2MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFz -c2FjaHVzZXR0czEPMA0GA1UEBxMGQm9zdG9uMRowGAYDVQQDExFNaW1lS2l0IFVu +VQQIDA1NYXNzYWNodXNldHRzMQ8wDQYDVQQHDAZCb3N0b24xHzAdBgNVBAoMFkV4 +YW1wbGUgQXV0aG9yaXR5IEluYy4xFDASBgNVBAMMC0JydWNlIFdheW5lMScwJQYJ +KoZIhvcNAQkBFhhpbnRlcm1lZGlhdGVAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx +MzE5WhcNMTkwNzMwMTMxMzE5WjB2MQswCQYDVQQGEwJVUzEWMBQGA1UECAwNTWFz +c2FjaHVzZXR0czEPMA0GA1UEBwwGQm9zdG9uMRowGAYDVQQDDBFNaW1lS2l0IFVu aXRUZXN0czEiMCAGCSqGSIb3DQEJARYTbWltZWtpdEBleGFtcGxlLmNvbTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALktT8OGfHalWgPzIrECgGamORzE -CJMA2/MI8HD2PLhA8sFhwyW+M0jUf2U61BtU9u7uyt/GIWHrFF2eBXYWozxGLeGA -dxZaZ0RHESaU+u4iyDpWQ+GJtPJ+JLefh3Hwx1lde70xTBXvQj9ADo4FyClNoTs7 -tqTtM2vz0uctfNBMuKW7wKi/qbrwwZCOZfWEn/DxAVJE26LfgWFlBPkzbAlJ8xmq -3I3y1D1ZM/vf6B8/w4FJDqP2nIMrLttBttM9ctH1zUPrQx8hEhRHjSn20FFzJkyg -hKNkn8gbpT3XXKABlc1niTas+MGbGMIXqA0RqZz1H9yUlfq+soCd8vyNpq3YKypd -RRHIpHtJ/0Vp4TC4llE316k5CGMlnQrQYzKSuc4A2/3F5zRA1eXm7tYkpuSjPCCd -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 -----END TRUSTED CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smime.csr b/UnitTests/TestData/smime/smime.csr index 2b6de09c20..0bc10bb835 100644 --- a/UnitTests/TestData/smime/smime.csr +++ b/UnitTests/TestData/smime/smime.csr @@ -1,28 +1,28 @@ -----BEGIN CERTIFICATE REQUEST----- -MIIEuzCCAqMCAQAwdjELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0 -dHMxDzANBgNVBAcTBkJvc3RvbjEaMBgGA1UEAxMRTWltZUtpdCBVbml0VGVzdHMx +MIIEuzCCAqMCAQAwdjELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0 +dHMxDzANBgNVBAcMBkJvc3RvbjEaMBgGA1UEAwwRTWltZUtpdCBVbml0VGVzdHMx IjAgBgkqhkiG9w0BCQEWE21pbWVraXRAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3 -DQEBAQUAA4ICDwAwggIKAoICAQC5LU/Dhnx2pVoD8yKxAoBmpjkcxAiTANvzCPBw -9jy4QPLBYcMlvjNI1H9lOtQbVPbu7srfxiFh6xRdngV2FqM8Ri3hgHcWWmdERxEm -lPruIsg6VkPhibTyfiS3n4dx8MdZXXu9MUwV70I/QA6OBcgpTaE7O7ak7TNr89Ln -LXzQTLilu8Cov6m68MGQjmX1hJ/w8QFSRNui34FhZQT5M2wJSfMZqtyN8tQ9WTP7 -3+gfP8OBSQ6j9pyDKy7bQbbTPXLR9c1D60MfIRIUR40p9tBRcyZMoISjZJ/IG6U9 -11ygAZXNZ4k2rPjBmxjCF6gNEamc9R/clJX6vrKAnfL8jaat2CsqXUURyKR7Sf9F -aeEwuJZRN9epOQhjJZ0K0GMykrnOANv9xec0QNXl5u7WJKbkozwgnZGTCKxjz14g -EUtdBaF0NdeD29hugE8EGaeO7JOdJSZoWNCpOa7dn/HaTB789NQ03Sfjwi8xo/E+ -/F/iFPBFeV3QclJcAjFFfnuetn98taXtvBewapvvlYHkRvkWCk0QmRRbLurK9C8y -B/sk+TxV3I1vRe3cZOQwuDBnGk4dVMOKm9fTIL+ulON+u0vBAPOSM6gDtLxVE/p7 -kVtH7+ao99uymI9u+W3FbpKt4v7Ae4eFUgersVNBJUeqGEMvYPBpjaRmsEWo8yC9 -gFPEjwIDAQABoAAwDQYJKoZIhvcNAQEFBQADggIBAFfDpHAmjrlxpMLaGrs7/2gH -l1vEh5myf9DohL7xcSmzPgoQ+T/oUrPgunVSDL4mpUCDitg0l7vnT/UKQFmA9WZc -cLqATPLMIL9KZj+/jlneqWHrxMW+HRYyyAkaZlpvd4Ofd2876fkLwRpWtBT+NFfA -jQMMl+YqjZKZBEoVHZysWBgwOr03Zpa2tULO+qEK7OviWXd8P2L8ZT2rU5UcjOKY -M5U0oDO9w7xjIVXdmLABiPLGaj5aJH53xx34Axn0QOeWKTCy/HML+M74cSzybVqW -COFJu+xcmDCYb0qeQjogpgcr83tRSnAQ/hreATrtTEqf5FutgjSCbdrFoicOHZex -+hM4hTi1I+T+OWZ7sD6nA2w+qQUaJTkZSxK341rBeHdY1OP20WOk2+l2OiZBQN/j -IUjRwl+I0VyuFcPsYfP0gs4qSbutAUdR6nGeaxXvUFziKwb1ZBtvFMDRQMeFboay -oTtidkcUqTL7ZtxICB92Kr1+fWDTU7DsqAjU8PvnSJqbcGtn3BTfReTbj7GNvcX9 -2KXi8zgLM9s/tP7+ndSWGN3w3gOuoRCHS28jF9z0Mv2EZOWVhCSkWVWx2QJ4oPXq -cQZXsU3CKekNRIc2Ip9+8vIQ4+mfNJxGlGNOuKfoYltDGGNwSBqJIriAM016oRgS -0TJYb0Bdb32TnxzfFsi4 +DQEBAQUAA4ICDwAwggIKAoICAQDVPs28TsItOiXMjlE2FmCDzD85nxelT2eMh56e +W8f5R5SbrgkDnDzGhvNIZy23/L47j7DhYUwh8/ijCNX3AaisBQXI3rakVN1sNi6v +F3LwaguDZJyw2bVPdP2bl8btnkDSeG3D7Ad58pR/uSIbe3z/ecNnb3QnILT4CveK +eGr/mumb6bu0s1hJr22nx/8P9CLP/w1lhragIEFT2Bc8J+QZZSwtuZ1uCxC7vfq+ +Ir+UOrSqa/zxs6dR1KixyH7WvkMlz/tgBWBqwcGJZJR6vDLMiYj0QYuPuS32YhE5 +gkzls6d9I1+2lPp9BaxK7VG6jGyWv1Thu8zPZX5nDI+dPSisVf5Zx3KaUZPUiYPG +yFdzRC5iE6g85RxGYU6z4WYQOo1GsChROnPRBXjHVAz0nuoEvsafTymAKlGj/HVu +5aPEsb5l+jJki6VN0qVKHH/tNYXW0RibzeGj+/9cd4hQ6P/VAZjEInL2Kn4q65/g +trBuUKardbL4AtwGV9cNiD6aBXny0hKQf6xdyxzRgeYI/zg7Cjf6Amq9oKLul7fE +gcYjr47RBFbIQSUqoOX/CKiS/OWWbD0HP3KFp3unWahD+XfCCHxV32gf0OQUMUaL +Q61RdLYzmdeqZ7ItTkewVc+996wBYaIL9M3FomikwD0eKgKt0t3ezcjyGkbVy7M/ +hY0CiwIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBAFvlTW26+fKokqHix2oe3RWO +s1h4LLx4hbDB8xtbJ2sow+Mc7Da/WIfmLWww/fX1kdVFW0Q8qdYQXNJSu2DXT/3O +QH3p9W+1nLVaG8njyxv0yhz/Yi+sAOWIUmcXQCGorjR5A+BFLPoOK8d/u0KpcrkA +9k/yPww96ZO2tRhI464FXLJSusxNqHWqtpEN6Xtxfq86KAKubcivtwfeMYc9yYLn +4DEOth0aFetuykxaBufjVankM+EEGfmX6/zmjUeFJHGDlmq+rbdFVtkRZINR7u7X +6Rtw/RezDSNTaK3UD2gh9XxRZ92YiO6zPAQVG1iYIPHh9fE579NceRpWN38tgBEl +MGzp4mGebimHf+gZyz8QIMV+fO6Wa8fldwcSNQXREcd3MBaKkIvLQGQi7zud8+xc +4IARlT9iAR+NlnvtLkkQASMKDNCUnV2AQ5eYiavNdRBraGmFjZTVm/3/BjK0JiJf +L2xm+8sPdF36hMjCezbalaEhK0P7aFUZYtEK9ZlahibvkyMuf8kJbv8iBm1G6Vo4 +Kzd5JXlg40yhSWFCRPA/D8Xf3DbSCYes/AEuXiYJWIGADmID3kGjEkNkxwcskzgj +8br5J3kWWlxuq0oSgIXvp7Jec2x7ChK65kOhpWBCFRYs+oK7Em7JsBRGnIg8ph3v +tfFFqqkww7IouZsjA1f2 -----END CERTIFICATE REQUEST----- diff --git a/UnitTests/TestData/smime/smime.key b/UnitTests/TestData/smime/smime.key index d8b5f56c6c..4e868e67fe 100644 --- a/UnitTests/TestData/smime/smime.key +++ b/UnitTests/TestData/smime/smime.key @@ -1,54 +1,54 @@ -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,940598E44C976B2F +DEK-Info: DES-EDE3-CBC,E47B0C7BA83374CD -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 -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/smime.p12 b/UnitTests/TestData/smime/smime.p12 index 3eca9711f7f3da4f06ab2ac93bd21c5b0265e885..298a656dae6503f3404855ce9a1bd0842ee2ccec 100644 GIT binary patch delta 7109 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 delta 7367 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 From e76025426a609345e9c31ab7afd28d28b008a19c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Aug 2018 06:36:05 -0400 Subject: [PATCH 061/741] Specify a StringComparer for all Dictionaries that use strings as keys Might help improve performance. --- MimeKit/Cryptography/GnuPGContext.cs | 4 ++-- MimeKit/Cryptography/TemporarySecureMimeContext.cs | 4 ++-- MimeKit/MimeMessage.cs | 4 ++-- MimeKit/ParserOptions.cs | 2 +- MimeKit/Text/UrlScanner.cs | 2 +- MimeKit/Utils/DateUtils.cs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index 1af582f2e0..7854873e9e 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -66,7 +66,7 @@ static GnuPGContext () SecretKeyRing = Path.Combine (gnupg, "secring.gpg"); Configuration = Path.Combine (gnupg, "gpg.conf"); - EncryptionAlgorithms = new Dictionary { + EncryptionAlgorithms = new Dictionary (StringComparer.Ordinal) { { "AES", EncryptionAlgorithm.Aes128 }, { "AES128", EncryptionAlgorithm.Aes128 }, { "AES192", EncryptionAlgorithm.Aes192 }, @@ -90,7 +90,7 @@ static GnuPGContext () // { "RSA", PublicKeyAlgorithm.RsaGeneral } //}; - DigestAlgorithms = new Dictionary { + DigestAlgorithms = new Dictionary (StringComparer.Ordinal) { { "RIPEMD160", DigestAlgorithm.RipeMD160 }, { "SHA1", DigestAlgorithm.Sha1 }, { "SHA224", DigestAlgorithm.Sha224 }, diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 2bca025822..376da0a839 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -59,8 +59,8 @@ public class TemporarySecureMimeContext : BouncyCastleSecureMimeContext /// public TemporarySecureMimeContext () { - capabilities = new Dictionary (); - keys = new Dictionary (); + capabilities = new Dictionary (StringComparer.Ordinal); + keys = new Dictionary (StringComparer.Ordinal); certificates = new List (); crls = new List (); } diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 8a9cebc58d..b45162b7ba 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1683,7 +1683,7 @@ byte[] DkimHashBody (FormatOptions options, DkimSignatureAlgorithm signatureAlgo void DkimWriteHeaders (FormatOptions options, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, Stream stream) { - var counts = new Dictionary (); + var counts = new Dictionary (StringComparer.Ordinal); for (int i = 0; i < fields.Count; i++) { var headers = fields[i].StartsWith ("Content-", StringComparison.OrdinalIgnoreCase) ? Body.Headers : Headers; @@ -1981,7 +1981,7 @@ static bool IsWhiteSpace (char c) static IDictionary ParseDkimSignature (string signature) { - var parameters = new Dictionary (); + var parameters = new Dictionary (MimeUtils.OrdinalIgnoreCase); foreach (var token in signature.Split (';')) { var value = new StringBuilder (); diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 45032de409..91c3f274c7 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -50,7 +50,7 @@ namespace MimeKit { /// public class ParserOptions { - readonly Dictionary mimeTypes = new Dictionary (); + readonly Dictionary mimeTypes = new Dictionary (StringComparer.Ordinal); static readonly Type[] ConstructorArgTypes = { typeof (MimeEntityConstructorArgs) }; /// diff --git a/MimeKit/Text/UrlScanner.cs b/MimeKit/Text/UrlScanner.cs index a3ef00c51c..a0566cd959 100644 --- a/MimeKit/Text/UrlScanner.cs +++ b/MimeKit/Text/UrlScanner.cs @@ -70,7 +70,7 @@ class UrlScanner const string AtomCharacters = "!#$%&'*+-/=?^_`{|}~"; const string UrlSafeCharacters = "$-_.+!*'(),{}|\\^~[]`#%\";/?:@&="; - readonly Dictionary patterns = new Dictionary (); + readonly Dictionary patterns = new Dictionary (StringComparer.Ordinal); readonly Trie trie = new Trie (true); public UrlScanner () diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index a1f8d34aff..ed7383527b 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -119,7 +119,7 @@ public static class DateUtils static DateUtils () { - timezones = new Dictionary { + timezones = new Dictionary (StringComparer.Ordinal) { { "UT", 0 }, { "UTC", 0 }, { "GMT", 0 }, { "EDT", -400 }, { "EST", -500 }, { "CDT", -500 }, { "CST", -600 }, From 2dcc6172e3e798d15b8035c13f21ac83bf31d843 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 4 Aug 2018 07:04:36 -0400 Subject: [PATCH 062/741] Bumped version to 2.0.6 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 10 ++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 9 +++++---- nuget/MimeKitLite.nuspec | 8 +++++--- 7 files changed, 25 insertions(+), 12 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 2d03624237..77ee8884ad 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.5 + 2.0.6 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 7443c03ad5..4f9ff4c42d 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.5 + 2.0.6 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index ba49685ce5..7340a62131 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.5.0")] -[assembly: AssemblyFileVersion ("2.0.5.0")] +[assembly: AssemblyInformationalVersion ("2.0.6.0")] +[assembly: AssemblyFileVersion ("2.0.6.0")] [assembly: AssemblyVersion ("2.0.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index dcf629e5d6..ecf59852ed 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,15 @@ # Release Notes +### MimeKit 2.0.6 + +* Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions + given an incomplete address like "Name <". (issue #421) +* Fixed support for parsing mbox files using Content-Length. +* Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate + UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to + iso-8859-1. (issue #417) +* Minor optimizations. + ### MimeKit 2.0.5 * Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) diff --git a/appveyor.yml b/appveyor.yml index 61f7249907..0a2d7fa10e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.5.{build} +version: 2.0.6.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 3e69b75857..619cf4ab98 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.5 + 2.0.6 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,9 +25,10 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) -* Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue #404) -* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725) +* Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions given an incomplete address like "Name <". (issue #421) +* Fixed support for parsing mbox files using Content-Length. +* Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to iso-8859-1. (issue #417) +* Minor optimizations. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index f96c747b3d..30806c9928 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.5 + 2.0.6 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,8 +25,10 @@ An Open Source library for creating and parsing MIME messages. -* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) -* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725) +* Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions given an incomplete address like "Name <". (issue #421) +* Fixed support for parsing mbox files using Content-Length. +* Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to iso-8859-1. (issue #417) +* Minor optimizations. Xamarin Inc. en-US From 5d970617c5f740593052cdfcb696ca1035e3f9a7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 4 Aug 2018 09:14:49 -0400 Subject: [PATCH 063/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/app.config | 11 +++++++++++ samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- .../MessageReader.iOS/packages.config | 2 +- .../MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 9 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 samples/DkimVerifier/DkimVerifier/app.config diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index de131d692a..d29cde6ce4 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.5\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.6\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/app.config b/samples/DkimVerifier/DkimVerifier/app.config new file mode 100644 index 0000000000..9a06ca7746 --- /dev/null +++ b/samples/DkimVerifier/DkimVerifier/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index d6a41507d7..8defaa2e3c 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 29d4e32295..df9377d477 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.0.5\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.0.6\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.0.5\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.0.6\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 2e3f535fca..4bfd8bcc0a 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 1166fb5ee5..1157d85b67 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.0.5\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.0.6\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.0.5\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.0.6\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 51de696b6e..2b285ead1f 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index a4dc4b883f..3ff3c3e774 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.5\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.6\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index bf54c5e44f..f154bb75ca 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 8f53a18c0e7c4a60306a42b7dc968d9ba3073e0c Mon Sep 17 00:00:00 2001 From: Marc Bruins Date: Wed, 15 Aug 2018 13:17:59 +0200 Subject: [PATCH 064/741] Update FAQ.md --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index 264c8807ff..4f8744808f 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1162,6 +1162,6 @@ MimeEntity ParseMultipartFormData (HttpWebResponse response) { var contentType = ContentType.Parse (response.ContentType); - return MimeEntity.Parse (contentType, response.GetResponseStream ()); + return MimeEntity.Load (contentType, response.GetResponseStream ()); } ``` From db325cffdf016be5e4a2f1c259e62e177db8bd7c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 22 Aug 2018 07:18:54 -0400 Subject: [PATCH 065/741] Use File.OpenRead() which allows read-only file sharing Fixes issue #426 --- MimeKit/Cryptography/OpenPgpContext.cs | 4 ++-- MimeKit/MimeEntity.cs | 4 ++-- MimeKit/MimeMessage.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 98b18af4d5..00698ee123 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -183,7 +183,7 @@ protected OpenPgpContext (string pubring, string secring) : this () SecretKeyRingPath = secring; if (File.Exists (pubring)) { - using (var file = File.Open (pubring, FileMode.Open, FileAccess.Read)) { + using (var file = File.OpenRead (pubring)) { PublicKeyRingBundle = new PgpPublicKeyRingBundle (file); } } else { @@ -191,7 +191,7 @@ protected OpenPgpContext (string pubring, string secring) : this () } if (File.Exists (secring)) { - using (var file = File.Open (secring, FileMode.Open, FileAccess.Read)) { + using (var file = File.OpenRead (secring)) { SecretKeyRingBundle = new PgpSecretKeyRingBundle (file); } } else { diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 243942f34b..22ba86382e 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -1440,7 +1440,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Open, FileAccess.Read)) + using (var stream = File.OpenRead (fileName)) return Load (options, stream, cancellationToken); } @@ -1491,7 +1491,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Open, FileAccess.Read)) + using (var stream = File.OpenRead (fileName)) return await LoadAsync (options, stream, cancellationToken).ConfigureAwait (false); } diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index b45162b7ba..fa8272d55f 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -3295,7 +3295,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Open, FileAccess.Read)) + using (var stream = File.OpenRead (fileName)) return Load (options, stream, cancellationToken); } @@ -3346,7 +3346,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Open, FileAccess.Read)) + using (var stream = File.OpenRead (fileName)) return await LoadAsync (options, stream, cancellationToken).ConfigureAwait (false); } From 4918354e9f33b7cb0cda9c7a50e00f6fcc1a2477 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 16 Sep 2018 08:24:08 -0400 Subject: [PATCH 066/741] Added issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 35 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 17 +++++++++++ 2 files changed, 52 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..b735373365 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,35 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..066b2d920a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 33f00dbb492251beb82c051ee5ca023d88d9f8ac Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 27 Sep 2018 07:34:49 -0400 Subject: [PATCH 067/741] Don't set the Content-Type name parameters when extracting tnef message bodies Fixes issue #435 --- MimeKit/Tnef/TnefPart.cs | 3 --- UnitTests/Tnef/TnefTests.cs | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 5e3219fea8..0eac202afa 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -142,7 +142,6 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB prop.PropertyTag.ValueTnefType == TnefPropertyType.Unicode || prop.PropertyTag.ValueTnefType == TnefPropertyType.Binary) { var rtf = new TextPart ("rtf"); - rtf.ContentType.Name = "body.rtf"; var converter = new RtfCompressedToRtf (); var content = new MemoryBlockStream (); @@ -167,7 +166,6 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB prop.PropertyTag.ValueTnefType == TnefPropertyType.Unicode || prop.PropertyTag.ValueTnefType == TnefPropertyType.Binary) { var html = new TextPart ("html"); - html.ContentType.Name = "body.html"; Encoding encoding; if (prop.PropertyTag.ValueTnefType != TnefPropertyType.Unicode) @@ -185,7 +183,6 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB prop.PropertyTag.ValueTnefType == TnefPropertyType.Unicode || prop.PropertyTag.ValueTnefType == TnefPropertyType.Binary) { var plain = new TextPart ("plain"); - plain.ContentType.Name = "body.txt"; Encoding encoding; if (prop.PropertyTag.ValueTnefType != TnefPropertyType.Unicode) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 3a7766968e..7f636e4b86 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -686,7 +686,22 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom bool found = false; foreach (var part in attachments.OfType ()) { - if (part.FileName == name) { + if (part is TextPart && string.IsNullOrEmpty (part.FileName)) { + var basename = Path.GetFileNameWithoutExtension (name); + var extension = Path.GetExtension (name); + string subtype; + + switch (extension) { + case ".html": subtype = "html"; break; + case ".rtf": subtype = "rtf"; break; + default: subtype = "plain"; break; + } + + if (basename == "body" && part.ContentType.IsMimeType ("text", subtype)) { + found = true; + break; + } + } else if (part.FileName == name) { found = true; break; } From 204c7c5aecd2d6706c27ac5de4e93c0d61d42541 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 15:35:15 -0400 Subject: [PATCH 068/741] Updated BouncyCastle[.Portable] package references --- MimeKit/MimeKit.Net45.csproj | 2 +- MimeKit/packages.MimeKit.Mac.config | 2 +- MimeKit/packages.MimeKit.Net45.config | 4 ++-- MimeKit/packages.MimeKit.Portable.config | 4 ++-- MimeKit/packages.MimeKit.TvOS.config | 2 +- MimeKit/packages.MimeKit.WatchOS.config | 2 +- MimeKit/packages.MimeKit.WindowsUniversal81.config | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index ada246a95f..209de720d9 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -53,7 +53,7 @@ - ..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll + ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll diff --git a/MimeKit/packages.MimeKit.Mac.config b/MimeKit/packages.MimeKit.Mac.config index 3baddc3a52..b1ee73e3b3 100644 --- a/MimeKit/packages.MimeKit.Mac.config +++ b/MimeKit/packages.MimeKit.Mac.config @@ -1,4 +1,4 @@ - + diff --git a/MimeKit/packages.MimeKit.Net45.config b/MimeKit/packages.MimeKit.Net45.config index 730a601e5f..d857d88161 100644 --- a/MimeKit/packages.MimeKit.Net45.config +++ b/MimeKit/packages.MimeKit.Net45.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/MimeKit/packages.MimeKit.Portable.config b/MimeKit/packages.MimeKit.Portable.config index 100af68f8f..6f017318d0 100644 --- a/MimeKit/packages.MimeKit.Portable.config +++ b/MimeKit/packages.MimeKit.Portable.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/MimeKit/packages.MimeKit.TvOS.config b/MimeKit/packages.MimeKit.TvOS.config index 3baddc3a52..b1ee73e3b3 100644 --- a/MimeKit/packages.MimeKit.TvOS.config +++ b/MimeKit/packages.MimeKit.TvOS.config @@ -1,4 +1,4 @@ - + diff --git a/MimeKit/packages.MimeKit.WatchOS.config b/MimeKit/packages.MimeKit.WatchOS.config index 3baddc3a52..b1ee73e3b3 100644 --- a/MimeKit/packages.MimeKit.WatchOS.config +++ b/MimeKit/packages.MimeKit.WatchOS.config @@ -1,4 +1,4 @@ - + diff --git a/MimeKit/packages.MimeKit.WindowsUniversal81.config b/MimeKit/packages.MimeKit.WindowsUniversal81.config index c56390c4e2..413444bbdc 100644 --- a/MimeKit/packages.MimeKit.WindowsUniversal81.config +++ b/MimeKit/packages.MimeKit.WindowsUniversal81.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + From 360c38ca3905f5d2f4e608fee0699486b3e2163c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 15:42:43 -0400 Subject: [PATCH 069/741] Updated BouncyCastle package references in project.json files --- MimeKit/MimeKit.Mac.project.json | 4 ++-- MimeKit/MimeKit.TvOS.project.json | 2 +- MimeKit/MimeKit.WatchOS.project.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MimeKit/MimeKit.Mac.project.json b/MimeKit/MimeKit.Mac.project.json index 49847c4d05..199db1832d 100644 --- a/MimeKit/MimeKit.Mac.project.json +++ b/MimeKit/MimeKit.Mac.project.json @@ -3,6 +3,6 @@ "Xamarin.Mac,Version=v2.0": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.1.2" + "Portable.BouncyCastle": "1.8.2" } -} \ No newline at end of file +} diff --git a/MimeKit/MimeKit.TvOS.project.json b/MimeKit/MimeKit.TvOS.project.json index 4a948eec57..83634941f9 100644 --- a/MimeKit/MimeKit.TvOS.project.json +++ b/MimeKit/MimeKit.TvOS.project.json @@ -3,6 +3,6 @@ "Xamarin.TVOS,Version=v1.0": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.1.2" + "Portable.BouncyCastle": "1.8.2" } } diff --git a/MimeKit/MimeKit.WatchOS.project.json b/MimeKit/MimeKit.WatchOS.project.json index 82a2acdacf..680aabf72c 100644 --- a/MimeKit/MimeKit.WatchOS.project.json +++ b/MimeKit/MimeKit.WatchOS.project.json @@ -3,6 +3,6 @@ "Xamarin.WatchOS,Version=v1.0": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.1.2" + "Portable.BouncyCastle": "1.8.2" } } From 01da7aea1d11c3b37d148a349673fe9f5265a673 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 16:07:59 -0400 Subject: [PATCH 070/741] Added FormatOptions unit tests --- UnitTests/FormatOptionsTests.cs | 55 +++++++++++++++++++++++++++++++++ UnitTests/UnitTests.csproj | 5 +-- 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 UnitTests/FormatOptionsTests.cs diff --git a/UnitTests/FormatOptionsTests.cs b/UnitTests/FormatOptionsTests.cs new file mode 100644 index 0000000000..90c9fe5f3f --- /dev/null +++ b/UnitTests/FormatOptionsTests.cs @@ -0,0 +1,55 @@ +// +// FormatOptionsTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using NUnit.Framework; + +using MimeKit; + +namespace UnitTests +{ + [TestFixture] + public class FormatOptionsTests + { + [Test] + public void TestArgumentExceptions () + { + var format = FormatOptions.Default.Clone (); + + Assert.Throws (() => format.ParameterEncodingMethod = (ParameterEncodingMethod) 100, "ParameterEncodingMethod"); + } + + [Test] + public void TestInvalidOperationExceptions () + { + Assert.Throws (() => FormatOptions.Default.EnsureNewLine = true, "EnsureNewLine"); + Assert.Throws (() => FormatOptions.Default.International = true, "International"); + Assert.Throws (() => FormatOptions.Default.AllowMixedHeaderCharsets = true, "AllowMixedHeaderCharsets"); + Assert.Throws (() => FormatOptions.Default.ParameterEncodingMethod = ParameterEncodingMethod.Rfc2047, "ParameterEncodingMethod"); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 118ace1b1e..4fce80dde5 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,4 +1,4 @@ - + Debug @@ -121,6 +121,7 @@ + @@ -264,4 +265,4 @@ - \ No newline at end of file + From 33294ccaf0a8440f0dda738fedd958689d72e209 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 16:44:52 -0400 Subject: [PATCH 071/741] Updated System.Data.SQLite package --- MimeKit.Net45.sln | 26 +++++++++++++++----------- UnitTests/UnitTests.csproj | 12 ++++++------ UnitTests/packages.config | 2 +- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/MimeKit.Net45.sln b/MimeKit.Net45.sln index de0208c582..02c144ce5e 100644 --- a/MimeKit.Net45.sln +++ b/MimeKit.Net45.sln @@ -1,6 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2019 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" @@ -18,10 +20,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.Build.0 = Release|Any CPU {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -30,12 +28,22 @@ Global {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.Build.0 = Release|Any CPU + {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B61AEE43-BAA2-43BA-B535-912223825C5B} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0 $0.StandardHeader = $1 $1.Text = @\n${FileName}\n \nAuthor: ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n - $0.TextStylePolicy = $2 + $0.TextStylePolicy = $4 $2.scope = text/plain $2.EolMarker = Unix $0.CSharpFormattingPolicy = $3 @@ -64,7 +72,6 @@ Global $3.NewLineForClausesInQuery = False $3.SpacingAfterMethodDeclarationName = True $3.SpaceAfterMethodCallName = True - $0.TextStylePolicy = $4 $4.FileWidth = 120 $4.TabsToSpaces = False $4.EolMarker = Unix @@ -72,7 +79,4 @@ Global $4.inheritsScope = text/plain $4.scope = text/plain EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection EndGlobal diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 4fce80dde5..020b7fde88 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,4 +1,4 @@ - + Debug @@ -46,8 +46,8 @@ ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - ..\packages\System.Data.SQLite.Core.1.0.108.0\lib\net45\System.Data.SQLite.dll + + ..\packages\System.Data.SQLite.Core.1.0.109.2\lib\net45\System.Data.SQLite.dll @@ -258,11 +258,11 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + - + \ No newline at end of file diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 311591bb68..f4a16e46a3 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file From 4f6bc46f5681fd531826c660099acef6035ce7bc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 17:05:29 -0400 Subject: [PATCH 072/741] Updated Coveralls package and AppVeyor config --- .nuget/packages.config | 2 +- appveyor.yml | 31 +------------------------------ 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/.nuget/packages.config b/.nuget/packages.config index eb80f3b1ce..ec1dea5adf 100644 --- a/.nuget/packages.config +++ b/.nuget/packages.config @@ -1,6 +1,6 @@ - + diff --git a/appveyor.yml b/appveyor.yml index 0a2d7fa10e..ebbf6fe0a8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,33 +36,4 @@ test_script: -output:opencover.xml ` } - $revision = git rev-parse HEAD - - $branch = git rev-parse --abbrev-ref HEAD - - $commitAuthor = git show --quiet --format="%aN" $revision - - $commitEmail = git show --quiet --format="%aE" $revision - - $commitMessage = git show --quiet --format="%s" $revision - - .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe ` - - --opencover -i opencover.xml ` - - --repoToken $Env:COVERALLS_REPO_TOKEN ` - - --commitId $revision ` - - --commitBranch $branch ` - - --commitAuthor $commitAuthor ` - - --commitEmail $commitEmail ` - - --commitMessage $commitMessage ` - - --useRelativePaths ` - - --basePath .\UnitTests\bin\Debug - + .\packages\coveralls.net.1.0.0\tools\netcoreapp2.1\any\csmacnz.Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From 7788b1ee6bc21b77b7e17f10ec3bd70bfa9791f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 18:34:55 -0400 Subject: [PATCH 073/741] Let's try this again --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ebbf6fe0a8..8755810a8d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,4 +36,4 @@ test_script: -output:opencover.xml ` } - .\packages\coveralls.net.1.0.0\tools\netcoreapp2.1\any\csmacnz.Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor + .\packages\coveralls.net.1.0.0\tools\netcoreapp2.1\any\csmacnz.Coveralls.dll --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From ed64e261e5f62a8bb935bdd49f9b3277caa026d2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 19:19:25 -0400 Subject: [PATCH 074/741] Revert back to coveralls.net 0.7.0 --- .nuget/packages.config | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.nuget/packages.config b/.nuget/packages.config index ec1dea5adf..eb80f3b1ce 100644 --- a/.nuget/packages.config +++ b/.nuget/packages.config @@ -1,6 +1,6 @@ - + diff --git a/appveyor.yml b/appveyor.yml index 8755810a8d..25ce00a876 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,4 +36,4 @@ test_script: -output:opencover.xml ` } - .\packages\coveralls.net.1.0.0\tools\netcoreapp2.1\any\csmacnz.Coveralls.dll --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor + .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From b46063b17260ca41de18b9c31b9fd8a7025e1447 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 20:06:33 -0400 Subject: [PATCH 075/741] Added more GroupAddress unit tests --- MimeKit/GroupAddress.cs | 6 ------ UnitTests/GroupAddressTests.cs | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 0e0a248904..96400a1b0d 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -132,12 +132,6 @@ public InternetAddressList Members { internal override void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) { - if (builder == null) - throw new ArgumentNullException (nameof (builder)); - - if (lineLength < 0) - throw new ArgumentOutOfRangeException (nameof (lineLength)); - if (!string.IsNullOrEmpty (Name)) { string name; diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 9011e8ed06..73e064d5c9 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -140,6 +140,28 @@ static void AssertParse (string text) } } + [Test] + public void TestClone () + { + const string encoded = "Group Name: First Name , Second Name ,\n Inner Group Name: First Inner Name , Second Inner Name\n\t;, Third Name ;"; + var options = FormatOptions.Default.Clone (); + options.International = true; + + var inner = new GroupAddress ("Inner Group Name"); + inner.Members.Add (new MailboxAddress ("First Inner Name", "first-inner@address.com")); + inner.Members.Add (new MailboxAddress ("Second Inner Name", "second-inner@address.com")); + + var group = new GroupAddress ("Group Name"); + group.Members.Add (new MailboxAddress ("First Name", "first@address.com")); + group.Members.Add (new MailboxAddress ("Second Name", "second@address.com")); + group.Members.Add (inner); + group.Members.Add (new MailboxAddress ("Third Name", "third@address.com")); + + var clone = group.Clone (); + + Assert.AreEqual (encoded, clone.ToString (options, true)); + } + [Test] public void TestParseEmpty () { From 0e482ece2e30b5f8eef0e9bd32d4557521f05333 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 20:37:40 -0400 Subject: [PATCH 076/741] Added unit tests for TextPart.Text --- MimeKit/TextPart.cs | 2 +- UnitTests/GroupAddressTests.cs | 3 +- UnitTests/TextPartTests.cs | 63 ++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index f368b569bd..5592eaa2a3 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -220,7 +220,7 @@ public TextPart () : base ("text", "plain") /// predecessor, text/richtext (not to be confused with text/rtf). /// /// true if the text is enriched; otherwise, false. - bool IsEnriched { + public bool IsEnriched { get { return ContentType.IsMimeType ("text", "enriched") || ContentType.IsMimeType ("text", "richtext"); } } diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 73e064d5c9..84505c7e20 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -159,7 +159,8 @@ public void TestClone () var clone = group.Clone (); - Assert.AreEqual (encoded, clone.ToString (options, true)); + Assert.AreEqual (0, group.CompareTo (clone), "CompareTo"); + Assert.AreEqual (encoded, clone.ToString (options, true), "Encode"); } [Test] diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index aab9893bc2..d07253c965 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -25,6 +25,7 @@ // using System; +using System.IO; using System.Text; using NUnit.Framework; @@ -66,25 +67,87 @@ public void TestFormat () Assert.IsTrue (text.IsHtml, "IsHtml"); Assert.IsFalse (text.IsPlain, "IsPlain"); Assert.IsFalse (text.IsFlowed, "IsFlowed"); + Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); text = new TextPart (TextFormat.Plain); Assert.IsFalse (text.IsHtml, "IsHtml"); Assert.IsTrue (text.IsPlain, "IsPlain"); Assert.IsFalse (text.IsFlowed, "IsFlowed"); + Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); text = new TextPart (TextFormat.Flowed); Assert.IsFalse (text.IsHtml, "IsHtml"); Assert.IsTrue (text.IsPlain, "IsPlain"); Assert.IsTrue (text.IsFlowed, "IsFlowed"); + Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); text = new TextPart (TextFormat.RichText); Assert.IsFalse (text.IsHtml, "IsHtml"); Assert.IsFalse (text.IsPlain, "IsPlain"); Assert.IsFalse (text.IsFlowed, "IsFlowed"); + Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsTrue (text.IsRichText, "IsRichText"); + + text = new TextPart (TextFormat.Enriched); + Assert.IsFalse (text.IsHtml, "IsHtml"); + Assert.IsFalse (text.IsPlain, "IsPlain"); + Assert.IsFalse (text.IsFlowed, "IsFlowed"); + Assert.IsTrue (text.IsEnriched, "IsEnriched"); + Assert.IsFalse (text.IsRichText, "IsRichText"); + } + + [Test] + public void TestLatin1 () + { + const string text = "This is some Låtín1 text."; + + var memory = new MemoryStream (); + var buffer = Encoding.GetEncoding ("iso-8859-1").GetBytes (text); + memory.Write (buffer, 0, buffer.Length); + memory.Position = 0; + + var part = new TextPart ("plain") { Content = new MimeContent (memory) }; + + Assert.AreEqual (text, part.Text); + } + + [Test] + public void TestUTF16BE () + { + const string text = "This is some UTF-16BE text."; + + var memory = new MemoryStream (); + memory.WriteByte (0xfe); + memory.WriteByte (0xff); + + var buffer = Encoding.BigEndianUnicode.GetBytes (text); + memory.Write (buffer, 0, buffer.Length); + memory.Position = 0; + + var part = new TextPart ("plain") { Content = new MimeContent (memory) }; + + Assert.AreEqual (text, part.Text.Substring (1)); + } + + [Test] + public void TestUTF16LE () + { + const string text = "This is some UTF-16LE text."; + + var memory = new MemoryStream (); + memory.WriteByte (0xff); + memory.WriteByte (0xfe); + + var buffer = Encoding.Unicode.GetBytes (text); + memory.Write (buffer, 0, buffer.Length); + memory.Position = 0; + + var part = new TextPart ("plain") { Content = new MimeContent (memory) }; + + Assert.AreEqual (text, part.Text.Substring (1)); } } } From 16af1bce3adbca8d1e15eb1af1e39373168b87ae Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Oct 2018 20:51:23 -0400 Subject: [PATCH 077/741] Added unit tests for TextPart.GetText() --- UnitTests/TextPartTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index d07253c965..0c062999ff 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -99,6 +99,20 @@ public void TestFormat () Assert.IsFalse (text.IsRichText, "IsRichText"); } + [Test] + public void TestGetText () + { + const string text = "This is some Låtín1 text."; + + var encoding = Encoding.GetEncoding ("iso-8859-1"); + var part = new TextPart ("plain"); + + part.SetText ("iso-8859-1", text); + + Assert.AreEqual (text, part.GetText ("iso-8859-1"), "charset"); + Assert.AreEqual (text, part.GetText (encoding), "encoding"); + } + [Test] public void TestLatin1 () { From d62dc92aa23856b4abb99039a700d709d4e5e92f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 09:48:54 -0400 Subject: [PATCH 078/741] Fixed some array bounds checking --- MimeKit/HeaderList.cs | 6 +++--- MimeKit/HeaderListCollection.cs | 4 ++-- MimeKit/ParameterList.cs | 2 +- UnitTests/ArgumentExceptionTests.cs | 1 + UnitTests/FormatOptionsTests.cs | 3 +-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index d8f0a396a9..56e6c72614 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -1077,7 +1077,7 @@ public void Insert (int index, Header header) /// public void RemoveAt (int index) { - if (index < 0 || index > Count) + if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); var header = headers[index]; @@ -1117,13 +1117,13 @@ public void RemoveAt (int index) /// public Header this [int index] { get { - if (index < 0 || index > Count) + if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); return headers[index]; } set { - if (index < 0 || index > Count) + if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (value == null) diff --git a/MimeKit/HeaderListCollection.cs b/MimeKit/HeaderListCollection.cs index 7e66aa7edb..1cb1827ae4 100644 --- a/MimeKit/HeaderListCollection.cs +++ b/MimeKit/HeaderListCollection.cs @@ -90,13 +90,13 @@ public bool IsReadOnly { /// public HeaderList this [int index] { get { - if (index < 0 || index > Count) + if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); return groups[index]; } set { - if (index < 0 || index > Count) + if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (value == null) diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 9adb4a5fc5..a9206a90f2 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -563,7 +563,7 @@ public Parameter this [int index] { return parameters[index]; } set { - if (index < 0 || index > Count) + if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException (nameof (index)); if (value == null) diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index 51523faccf..b198ec583b 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -411,6 +411,7 @@ public void TestHeaderListCollectionArguments () collection.Add (new HeaderList ()); Assert.Throws (() => collection[0] = null); + Assert.DoesNotThrow (() => collection[0] = new HeaderList ()); } [Test] diff --git a/UnitTests/FormatOptionsTests.cs b/UnitTests/FormatOptionsTests.cs index 90c9fe5f3f..b5b58cf664 100644 --- a/UnitTests/FormatOptionsTests.cs +++ b/UnitTests/FormatOptionsTests.cs @@ -30,8 +30,7 @@ using MimeKit; -namespace UnitTests -{ +namespace UnitTests { [TestFixture] public class FormatOptionsTests { From 081a5fc0ea05f4dc24ef7ef3e69cd98f58224480 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 11:14:47 -0400 Subject: [PATCH 079/741] Added unit tests for MimeIterator and fixed bug in MoveTo() --- MimeKit/MimeIterator.cs | 2 +- UnitTests/ArgumentExceptionTests.cs | 15 --- UnitTests/MimeIteratorTests.cs | 194 ++++++++++++++++++++++++++++ UnitTests/UnitTests.csproj | 5 +- 4 files changed, 198 insertions(+), 18 deletions(-) create mode 100644 UnitTests/MimeIteratorTests.cs diff --git a/MimeKit/MimeIterator.cs b/MimeKit/MimeIterator.cs index bc4dafb93d..9ab1581512 100644 --- a/MimeKit/MimeIterator.cs +++ b/MimeKit/MimeIterator.cs @@ -389,7 +389,7 @@ public bool MoveTo (string pathSpecifier) } } - if (i == path.Count && indexes[i] < index) + if (!moveFirst && indexes.Length < path.Count) Reset (); if (moveFirst && !MoveNext ()) diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index b198ec583b..8e18cdd798 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -413,20 +413,5 @@ public void TestHeaderListCollectionArguments () Assert.Throws (() => collection[0] = null); Assert.DoesNotThrow (() => collection[0] = new HeaderList ()); } - - [Test] - public void TestMimeIteratorArguments () - { - var iter = new MimeIterator (new MimeMessage { Body = new TextPart ("plain") }); - - Assert.Throws (() => new MimeIterator (null)); - Assert.Throws (() => { var x = iter.Depth; }); - Assert.Throws (() => { var x = iter.Current; }); - Assert.Throws (() => { var x = iter.Parent; }); - Assert.Throws (() => { var x = iter.PathSpecifier; }); - Assert.Throws (() => iter.MoveTo (null)); - Assert.Throws (() => iter.MoveTo (string.Empty)); - Assert.Throws (() => iter.MoveTo ("xyz")); - } } } diff --git a/UnitTests/MimeIteratorTests.cs b/UnitTests/MimeIteratorTests.cs new file mode 100644 index 0000000000..740e9e03ac --- /dev/null +++ b/UnitTests/MimeIteratorTests.cs @@ -0,0 +1,194 @@ +// +// MimeIteratorTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Collections.Generic; + +using NUnit.Framework; + +using MimeKit; + +namespace UnitTests { + [TestFixture] + public class MimeIteratorTests + { + [Test] + public void TestArgumentExceptions () + { + var iter = new MimeIterator (new MimeMessage { Body = new TextPart ("plain") }); + + Assert.Throws (() => new MimeIterator (null)); + Assert.Throws (() => { var x = iter.Depth; }); + Assert.Throws (() => { var x = iter.Current; }); + Assert.Throws (() => { var x = iter.Parent; }); + Assert.Throws (() => { var x = iter.PathSpecifier; }); + Assert.Throws (() => iter.MoveTo (null)); + Assert.Throws (() => iter.MoveTo (string.Empty)); + Assert.Throws (() => iter.MoveTo ("xyz")); + } + + static MessagePart CreateImapExampleMessageRfc822 (List parents) + { + var message = new MimeMessage (); + var mixed = new Multipart ("mixed"); + var rfc822 = new MessagePart { Message = message }; + + parents.Add (rfc822); + message.Body = mixed; + + parents.Add (mixed); + mixed.Add (new TextPart ("plain")); + + parents.Add (mixed); + mixed.Add (new MimePart ()); + + return rfc822; + } + + static MessagePart CreateImapExampleInnerMessageRfc822 (List parents) + { + var message = new MimeMessage (); + var mixed = new Multipart ("mixed"); + var alternative = new MultipartAlternative (); + var rfc822 = new MessagePart { Message = message }; + + parents.Add (rfc822); + message.Body = mixed; + + parents.Add (mixed); + mixed.Add (new TextPart ("plain")); + + parents.Add (mixed); + mixed.Add (alternative); + + parents.Add (alternative); + alternative.Add (new TextPart ("plain")); + + parents.Add (alternative); + alternative.Add (new TextPart ("richtext")); + + return rfc822; + } + + static Multipart CreateImapExampleInnerMultipart (List parents) + { + var mixed = new Multipart ("mixed"); + + parents.Add (mixed); + mixed.Add (new MimePart ("image", "gif")); + + parents.Add (mixed); + mixed.Add (CreateImapExampleInnerMessageRfc822 (parents)); + + return mixed; + } + + static MimeMessage CreateImapExampleMessage (List parents) + { + var message = new MimeMessage (); + var mixed = new Multipart ("mixed"); + + message.Body = mixed; + + parents.Add (mixed); + mixed.Add (new TextPart ("plain")); + + parents.Add (mixed); + mixed.Add (new MimePart ()); + + parents.Add (mixed); + mixed.Add (CreateImapExampleMessageRfc822 (parents)); + + parents.Add (mixed); + mixed.Add (CreateImapExampleInnerMultipart (parents)); + + return message; + } + + [Test] + public void TestPathSpecifiers () + { + var expectedTypes = new Type[] { typeof (Multipart), typeof (TextPart), typeof (MimePart), typeof (MessagePart), typeof (Multipart), typeof (TextPart), typeof (MimePart), typeof (Multipart), typeof (MimePart), typeof (MessagePart), typeof (Multipart), typeof (TextPart), typeof (MultipartAlternative), typeof (TextPart), typeof (TextPart) }; + var expectedPathSpecifiers = new string[] { "0", "1", "2", "3", "3.0", "3.1", "3.2", "4", "4.1", "4.2", "4.2.0", "4.2.1", "4.2.2", "4.2.2.1", "4.2.2.2" }; + var expectedDepths = new int[] { 0, 1, 1, 1, 2, 3, 3, 1, 2, 2, 3, 4, 4, 5, 5 }; + var expectedParents = new List { null }; + var message = CreateImapExampleMessage (expectedParents); + var iter = new MimeIterator (message); + int i = 0; + + Assert.IsTrue (iter.MoveNext (), "Initialize"); + do { + var current = iter.Current; + var parent = iter.Parent; + + Assert.AreEqual (expectedDepths[i], iter.Depth, "Depth #{0}", i); + Assert.AreEqual (expectedParents[i], parent, "Parent #{0}", i); + Assert.IsInstanceOf (expectedTypes[i], current, "Type #{0}", i); + Assert.AreEqual (expectedPathSpecifiers[i], iter.PathSpecifier, "PathSpecifier #{0}", i); + i++; + } while (iter.MoveNext ()); + + Assert.AreEqual (expectedTypes.Length, i); + + iter.Reset (); + i = 0; + + Assert.IsTrue (iter.MoveNext (), "Reset"); + do { + var current = iter.Current; + var parent = iter.Parent; + + Assert.AreEqual (expectedDepths[i], iter.Depth, "Reset Depth #{0}", i); + Assert.AreEqual (expectedParents[i], parent, "Reset Parent #{0}", i); + Assert.IsInstanceOf (expectedTypes[i], current, "Reset Type #{0}", i); + Assert.AreEqual (expectedPathSpecifiers[i], iter.PathSpecifier, "Reset PathSpecifier #{0}", i); + i++; + } while (iter.MoveNext ()); + } + + [Test] + public void TestMoveTo () + { + var expectedTypes = new Type[] { typeof (Multipart), typeof (TextPart), typeof (MimePart), typeof (MessagePart), typeof (Multipart), typeof (TextPart), typeof (MimePart), typeof (Multipart), typeof (MimePart), typeof (MessagePart), typeof (Multipart), typeof (TextPart), typeof (MultipartAlternative), typeof (TextPart), typeof (TextPart) }; + var expectedPathSpecifiers = new List { "0", "1", "2", "3", "3.0", "3.1", "3.2", "4", "4.1", "4.2", "4.2.0", "4.2.1", "4.2.2", "4.2.2.1", "4.2.2.2" }; + var paths = new string[] { "3.1", "3.2", "4", "4.2.1", "4.2.2.2", "4.2", "3.2" }; + var expectedDepths = new int[] { 0, 1, 1, 1, 2, 3, 3, 1, 2, 2, 3, 4, 4, 5, 5 }; + var expectedParents = new List { null }; + var message = CreateImapExampleMessage (expectedParents); + var iter = new MimeIterator (message); + + foreach (var path in paths) { + int i = expectedPathSpecifiers.IndexOf (path); + + Assert.IsTrue (iter.MoveTo (expectedPathSpecifiers[i]), "MoveTo {0}", expectedPathSpecifiers[i]); + Assert.AreEqual (expectedPathSpecifiers[i], iter.PathSpecifier, "PathSpecifier {0}", expectedPathSpecifiers[i]); + Assert.AreEqual (expectedParents[i], iter.Parent, "Parent {0}", expectedPathSpecifiers[i]); + Assert.IsInstanceOf (expectedTypes[i], iter.Current, "Type {0}", expectedPathSpecifiers[i]); + Assert.AreEqual (expectedDepths[i], iter.Depth, "Depth {0}", expectedPathSpecifiers[i]); + } + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 020b7fde88..5c942326f3 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,4 +1,4 @@ - + Debug @@ -133,6 +133,7 @@ + @@ -265,4 +266,4 @@ - \ No newline at end of file + From c9ef535346fb0bf9acedb79be021c5b4e14d40b5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 14:30:13 -0400 Subject: [PATCH 080/741] Added MultipartAlternative unit tests --- UnitTests/MultipartAlternativeTests.cs | 73 ++++++++++++++++++++++++++ UnitTests/UnitTests.csproj | 1 + 2 files changed, 74 insertions(+) create mode 100644 UnitTests/MultipartAlternativeTests.cs diff --git a/UnitTests/MultipartAlternativeTests.cs b/UnitTests/MultipartAlternativeTests.cs new file mode 100644 index 0000000000..fa98757ae0 --- /dev/null +++ b/UnitTests/MultipartAlternativeTests.cs @@ -0,0 +1,73 @@ +// +// MultipartAlternativeTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using NUnit.Framework; + +using MimeKit; +using MimeKit.Text; + +namespace UnitTests { + [TestFixture] + public class MultipartAlternativeTests + { + [Test] + public void TestArgumentExceptions () + { + var alternative = new MultipartAlternative (); + + Assert.Throws (() => new MultipartAlternative ((MimeEntityConstructorArgs) null)); + Assert.Throws (() => alternative.Accept (null)); + } + + [Test] + public void TestGetTextBody () + { + var alternative = new MultipartAlternative (); + var plain = new TextPart ("plain") { Text = "plain\n" }; + var flowed = new TextPart (TextFormat.Flowed) { Text = "flowed\n" }; + var richtext = new TextPart ("rtf") { Text = "rtf\n" }; + var html = new TextPart ("html") { Text = "html\n" }; + + alternative.Add (plain); + alternative.Add (richtext); + alternative.Add (html); + + Assert.AreEqual ("plain\n", alternative.TextBody, "TextBody"); + Assert.AreEqual ("html\n", alternative.HtmlBody, "HtmlBody"); + + alternative.Insert (1, flowed); + + // Note: GetTextBody (Plain) returns Flowed because Flowed is also Plain and is listed after the text/plain part + Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Plain), "Plain"); + Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Flowed), "Flowed"); + Assert.AreEqual ("rtf\n", alternative.GetTextBody (TextFormat.RichText), "RichText"); + Assert.AreEqual ("html\n", alternative.GetTextBody (TextFormat.Html), "Html"); + Assert.IsNull (alternative.GetTextBody (TextFormat.Enriched), "Enriched"); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 5c942326f3..5c9ecea1c2 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -139,6 +139,7 @@ + From 5272abbbe55bb3206f64149aaa51e66deea096e3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 15:21:43 -0400 Subject: [PATCH 081/741] Added AttachmentCollection unit tests --- MimeKit/AttachmentCollection.cs | 5 +- UnitTests/AttachmentCollectionTests.cs | 126 +++++++++++++++++++++++++ UnitTests/ConstructorTests.cs | 1 + UnitTests/MultipartReportTests.cs | 8 ++ 4 files changed, 136 insertions(+), 4 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index d9672e4ffd..da01b04bd7 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -172,11 +172,8 @@ MimeEntity CreateAttachment (ContentType contentType, string fileName, Stream st MimePart part; if (contentType.IsMimeType ("text", "*")) { - part = new TextPart (contentType.MediaSubtype); - foreach (var param in contentType.Parameters) - part.ContentType.Parameters.Add (param); - // TODO: should we try to auto-detect charsets if no charset parameter is specified? + part = new TextPart (contentType); } else { part = new MimePart (contentType); } diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index 335bfcfd3e..f8401c98c9 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -87,5 +87,131 @@ public void TestArgumentExceptions () Assert.Throws (() => attachments.Insert (0, null)); } } + + [Test] + public void TestAddFileName () + { + var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + attachment =(MimePart) attachments.Add (fileName); + Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } + + [Test] + public void TestAddFileNameContentType () + { + var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var contentType = new ContentType ("image", "gif"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + attachment = (MimePart) attachments.Add (fileName, contentType); + Assert.AreEqual (contentType.MimeType, attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } + + [Test] + public void TestAddData () + { + var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + attachment = (MimePart) attachments.Add (fileName, File.ReadAllBytes (fileName)); + Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } + + [Test] + public void TestAddDataContentType () + { + var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var contentType = new ContentType ("image", "gif"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + attachment = (MimePart) attachments.Add (fileName, File.ReadAllBytes (fileName), contentType); + Assert.AreEqual (contentType.MimeType, attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } + + [Test] + public void TestAddStream () + { + var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + using (var stream = File.OpenRead (fileName)) + attachment = (MimePart) attachments.Add (fileName, stream); + + Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } + + [Test] + public void TestAddStreamContentType () + { + var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var contentType = new ContentType ("image", "gif"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + using (var stream = File.OpenRead (fileName)) + attachment = (MimePart) attachments.Add (fileName, stream, contentType); + + Assert.AreEqual (contentType.MimeType, attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } + + [Test] + public void TestAddEmailMessage () + { + var fileName = Path.Combine ("..", "..", "TestData", "messages", "body.1.txt"); + var attachments = new AttachmentCollection (); + MimeEntity attachment; + + using (var stream = File.OpenRead (fileName)) + attachment = attachments.Add ("message.eml", stream); + + Assert.AreEqual ("message/rfc822", attachment.ContentType.MimeType); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Remove (attachment)); + Assert.AreEqual (0, attachments.Count); + } } } diff --git a/UnitTests/ConstructorTests.cs b/UnitTests/ConstructorTests.cs index a3c4e2c6c6..6353d39639 100644 --- a/UnitTests/ConstructorTests.cs +++ b/UnitTests/ConstructorTests.cs @@ -52,6 +52,7 @@ public void TestArgumentExceptions () Assert.Throws (() => new MessagePart ("rfc822", (object[]) null)); Assert.Throws (() => new MessagePart ("rfc822", message, null, message)); Assert.Throws (() => new MessagePart ("rfc822", 5)); + Assert.DoesNotThrow (() => new MessagePart ("rfc822", message)); Assert.Throws (() => new MimePart ("text", "plain", (object[]) null)); Assert.Throws (() => new MimePart ("text", "plain", body.Content, body.Content.Stream)); diff --git a/UnitTests/MultipartReportTests.cs b/UnitTests/MultipartReportTests.cs index 4f4bdb899e..80f4bb5279 100644 --- a/UnitTests/MultipartReportTests.cs +++ b/UnitTests/MultipartReportTests.cs @@ -48,6 +48,14 @@ public void TestArgumentExceptions () Assert.Throws (() => report.Accept (null)); } + + [Test] + public void TestParamCtor () + { + var report = new MultipartReport ("disposition-notification", new MimePart ()); + + Assert.AreEqual (1, report.Count); + } } } From 1ef1e2b9786c9aff6f2d1f6086dd96fad24858ba Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 17:12:24 -0400 Subject: [PATCH 082/741] Added more unit tests --- UnitTests/AttachmentCollectionTests.cs | 35 ++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index f8401c98c9..73cf310743 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -101,8 +101,11 @@ public void TestAddFileName () Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } [Test] @@ -119,8 +122,11 @@ public void TestAddFileNameContentType () Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } [Test] @@ -136,8 +142,11 @@ public void TestAddData () Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } [Test] @@ -154,8 +163,11 @@ public void TestAddDataContentType () Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } [Test] @@ -173,8 +185,11 @@ public void TestAddStream () Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } [Test] @@ -193,8 +208,11 @@ public void TestAddStreamContentType () Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } [Test] @@ -210,8 +228,11 @@ public void TestAddEmailMessage () Assert.AreEqual ("message/rfc822", attachment.ContentType.MimeType); Assert.AreEqual (1, attachments.Count); - Assert.IsTrue (attachments.Remove (attachment)); + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); Assert.AreEqual (0, attachments.Count); + attachments.Clear (); } } } From 25328ba2b66a6f3b97e76013457060f61071fe71 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 20:46:51 -0400 Subject: [PATCH 083/741] Added more ContentType unit tests --- MimeKit/ContentType.cs | 10 ---------- UnitTests/ContentTypeTests.cs | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index 382c01a79f..f052edbb60 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -73,16 +73,6 @@ public ContentType (string mediaType, string mediaSubtype) type = mediaType; } - static bool IsToken (byte c) - { - return c.IsToken (); - } - - static bool IsAsciiAtom (byte c) - { - return c.IsAsciiAtom (); - } - /// /// Gets or sets the type of the media. /// diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index 0e2bb56284..70fc9cf25f 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -539,5 +539,23 @@ public void TestProperties () type.Name = null; Assert.IsNull (type.Name); } + + [Test] + public void TestToString () + { + const string expected = "Content-Type: text/plain; format=\"flowed\"; charset=\"iso-8859-1\"; name=\"filename.txt\""; + var type = new ContentType ("text", "plain") { Format = "flowed", Charset = "iso-8859-1", Name = "filename.txt" }; + + Assert.AreEqual (expected, type.ToString ()); + } + + [Test] + public void TestToStringEncode () + { + const string expected = "Content-Type: text/plain; format=flowed; charset=utf-8;\n\tname*0*=utf-8''%D0%AD%D1%82%D0%BE%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE;\n\tname*1*=%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0.txt"; + var type = new ContentType ("text", "plain") { Format = "flowed", Charset = "utf-8", Name = "Это русское имя файла.txt" }; + + Assert.AreEqual (expected, type.ToString (Encoding.UTF8, true)); + } } } From 23e1547a94c51ce61626874931dbf443e7cf519d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Oct 2018 20:56:49 -0400 Subject: [PATCH 084/741] Added unit tests for rfc2047 encoding of parameter values --- UnitTests/ContentTypeTests.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index 70fc9cf25f..4360f67353 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -552,10 +552,21 @@ public void TestToString () [Test] public void TestToStringEncode () { - const string expected = "Content-Type: text/plain; format=flowed; charset=utf-8;\n\tname*0*=utf-8''%D0%AD%D1%82%D0%BE%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE;\n\tname*1*=%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0.txt"; + const string rfc2231 = "Content-Type: text/plain; format=flowed; charset=utf-8;\n\tname*0*=utf-8''%D0%AD%D1%82%D0%BE%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE;\n\tname*1*=%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0.txt"; + const string rfc2047 = "Content-Type: text/plain; format=flowed; charset=utf-8;\n\tname=\"=?utf-8?b?0K3RgtC+INGA0YPRgdGB0LrQvtC1INC40LzRjyDRhNCw0LnQu9CwLnR4?=\n\t=?utf-8?q?t?=\""; var type = new ContentType ("text", "plain") { Format = "flowed", Charset = "utf-8", Name = "Это русское имя файла.txt" }; - Assert.AreEqual (expected, type.ToString (Encoding.UTF8, true)); + Assert.AreEqual (rfc2231, type.ToString (Encoding.UTF8, true)); + + foreach (var parameter in type.Parameters) + parameter.EncodingMethod = ParameterEncodingMethod.Rfc2231; + + Assert.AreEqual (rfc2231, type.ToString (Encoding.UTF8, true)); + + foreach (var parameter in type.Parameters) + parameter.EncodingMethod = ParameterEncodingMethod.Rfc2047; + + Assert.AreEqual (rfc2047, type.ToString (Encoding.UTF8, true)); } } } From e7e86f3964827c2783738d85ea3e0c03a728a494 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Oct 2018 09:39:49 -0400 Subject: [PATCH 085/741] Fixed ContenType unit tests for Windows --- UnitTests/ContentTypeTests.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index 4360f67353..7a092b8483 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -545,8 +545,9 @@ public void TestToString () { const string expected = "Content-Type: text/plain; format=\"flowed\"; charset=\"iso-8859-1\"; name=\"filename.txt\""; var type = new ContentType ("text", "plain") { Format = "flowed", Charset = "iso-8859-1", Name = "filename.txt" }; + var value = type.ToString ().Replace ("\r\n", "\n"); - Assert.AreEqual (expected, type.ToString ()); + Assert.AreEqual (expected, value); } [Test] @@ -555,18 +556,22 @@ public void TestToStringEncode () const string rfc2231 = "Content-Type: text/plain; format=flowed; charset=utf-8;\n\tname*0*=utf-8''%D0%AD%D1%82%D0%BE%20%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE;\n\tname*1*=%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0.txt"; const string rfc2047 = "Content-Type: text/plain; format=flowed; charset=utf-8;\n\tname=\"=?utf-8?b?0K3RgtC+INGA0YPRgdGB0LrQvtC1INC40LzRjyDRhNCw0LnQu9CwLnR4?=\n\t=?utf-8?q?t?=\""; var type = new ContentType ("text", "plain") { Format = "flowed", Charset = "utf-8", Name = "Это русское имя файла.txt" }; + string value; - Assert.AreEqual (rfc2231, type.ToString (Encoding.UTF8, true)); + value = type.ToString (Encoding.UTF8, true).Replace ("\r\n", "\n"); + Assert.AreEqual (rfc2231, value, "Default"); foreach (var parameter in type.Parameters) parameter.EncodingMethod = ParameterEncodingMethod.Rfc2231; - Assert.AreEqual (rfc2231, type.ToString (Encoding.UTF8, true)); + value = type.ToString (Encoding.UTF8, true).Replace ("\r\n", "\n"); + Assert.AreEqual (rfc2231, value, "Rfc2231"); foreach (var parameter in type.Parameters) parameter.EncodingMethod = ParameterEncodingMethod.Rfc2047; - Assert.AreEqual (rfc2047, type.ToString (Encoding.UTF8, true)); + value = type.ToString (Encoding.UTF8, true).Replace ("\r\n", "\n"); + Assert.AreEqual (rfc2047, value, "Rfc2047"); } } } From 2273fd5d4413b7707d8479a6bfdc0f4664b24a93 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Oct 2018 10:33:05 -0400 Subject: [PATCH 086/741] Added a few more unit tests --- UnitTests/ParameterListTests.cs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/UnitTests/ParameterListTests.cs b/UnitTests/ParameterListTests.cs index c59a3f5f68..14c9df3855 100644 --- a/UnitTests/ParameterListTests.cs +++ b/UnitTests/ParameterListTests.cs @@ -60,6 +60,11 @@ public void TestArgumentExceptions () Assert.Throws (() => list.Add ("name", null)); Assert.Throws (() => list.Add (null)); + list.Add ("name", "x-value"); + Assert.Throws (() => list.Add ("name", "value")); + Assert.Throws (() => list.Add (new Parameter ("name", "value"))); + list.Clear (); + // Contains Assert.Throws (() => list.Contains ((Parameter) null)); Assert.Throws (() => list.Contains ((string) null)); @@ -73,7 +78,7 @@ public void TestArgumentExceptions () Assert.Throws (() => list.IndexOf ((string) null)); // Insert - list.Add ("name", "value"); + list.Add ("x-name", "value"); Assert.Throws (() => list.Insert (-1, new Parameter ("name", "value"))); Assert.Throws (() => list.Insert (-1, "field", "value")); Assert.Throws (() => list.Insert (0, null, "value")); @@ -81,6 +86,9 @@ public void TestArgumentExceptions () Assert.Throws (() => list.Insert (0, invalid, "value")); Assert.Throws (() => list.Insert (0, "name", null)); Assert.Throws (() => list.Insert (0, null)); + Assert.Throws (() => list.Insert (0, "x-name", "x-value")); + Assert.Throws (() => list.Insert (0, new Parameter ("x-name", "x-value"))); + list.Clear (); // Remove Assert.Throws (() => list.Remove ((Parameter) null)); @@ -94,12 +102,16 @@ public void TestArgumentExceptions () Assert.Throws (() => list.TryGetValue (null, out value)); // Indexers + list.Add ("name", "value"); + list.Add ("x-name", "x-value"); Assert.Throws (() => list[-1] = new Parameter ("name", "value")); Assert.Throws (() => param = list[-1]); Assert.Throws (() => list[0] = null); Assert.Throws (() => list[null] = "value"); Assert.Throws (() => value = list[null]); Assert.Throws (() => list["name"] = null); + Assert.Throws (() => list[1] = new Parameter ("name", "value")); + list.Clear (); } [Test] @@ -175,6 +187,14 @@ public void TestBasicFunctionality () Assert.AreEqual (3, list.Count); Assert.AreEqual ("; abc=\"0\"; def=\"1\"; ghi=\"2\"", list.ToString ()); + + list[0] = new Parameter ("abc", "replaced"); + + Assert.AreEqual ("; abc=\"replaced\"; def=\"1\"; ghi=\"2\"", list.ToString ()); + + list[0] = new Parameter ("xxx", "0"); + + Assert.AreEqual ("; xxx=\"0\"; def=\"1\"; ghi=\"2\"", list.ToString ()); } } } From ac6aaf624570557a0fdeb6c08cd844fbd44f4ea4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Oct 2018 12:52:08 -0400 Subject: [PATCH 087/741] Added more unit tests for ParameterList parsing --- MimeKit/ParameterList.cs | 8 ++--- UnitTests/ContentTypeTests.cs | 63 +++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index a9206a90f2..17af0c96c6 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -779,12 +779,10 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i } if (text[index] != (byte) '=') { - if (index >= endIndex) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + if (throwOnError) + throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); - return false; - } + return false; } index++; diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index 7a092b8483..2aeb0047f2 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -508,6 +508,69 @@ public void TestInvalidDataAfterMimeType () AssertParse (text, expected, false, 25, 25); } + [Test] + public void TestEmptyParameterName () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; ="; + + AssertParse (text, expected, false, 12, 12); + } + + [Test] + public void TestIncompleteParameterName () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; name"; + + AssertParse (text, expected, false, 12, 16); + } + + [Test] + public void TestIncompleteParameterNameWithStar () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; name*"; + + AssertParse (text, expected, false, 12, 17); + } + + [Test] + public void TestIncompleteParameterNameWithPartId () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; name*0"; + + AssertParse (text, expected, false, 12, 18); + } + + [Test] + public void TestIncompleteParameterNameWithPartIdStar () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; name*0*"; + + AssertParse (text, expected, false, 12, 19); + } + + [Test] + public void TestInvalidParameterNameWithPartId () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; name*0*x"; + + AssertParse (text, expected, false, 12, 19); + } + + [Test] + public void TestInncompleteParameterNameWithPartIdStarEqual () + { + var expected = new ContentType ("text", "plain"); + const string text = "text/plain; name*0*="; + + AssertParse (text, expected, false, 12, 20); + } + [Test] public void TestProperties () { From e7475d49c8b9ab351dbf6415b546026fafc7ed3a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Oct 2018 17:53:22 -0400 Subject: [PATCH 088/741] Added more tnef tests --- .../TestData/tnef/multi-value-attribute.list | 2 + .../TestData/tnef/multi-value-attribute.tnef | Bin 0 -> 18124 bytes .../TestData/tnef/unicode-mapi-attr-name.list | 4 ++ .../TestData/tnef/unicode-mapi-attr-name.tnef | Bin 0 -> 38632 bytes .../TestData/tnef/unicode-mapi-attr.list | 1 + .../TestData/tnef/unicode-mapi-attr.tnef | Bin 0 -> 5788 bytes UnitTests/Tnef/TnefTests.cs | 48 ++++++++++++++++++ UnitTests/UnitTests.csproj | 6 +++ 8 files changed, 61 insertions(+) create mode 100644 UnitTests/TestData/tnef/multi-value-attribute.list create mode 100644 UnitTests/TestData/tnef/multi-value-attribute.tnef create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name.list create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name.tnef create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr.list create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr.tnef diff --git a/UnitTests/TestData/tnef/multi-value-attribute.list b/UnitTests/TestData/tnef/multi-value-attribute.list new file mode 100644 index 0000000000..158799e55b --- /dev/null +++ b/UnitTests/TestData/tnef/multi-value-attribute.list @@ -0,0 +1,2 @@ +208225__5_seconds__Voice_Mail.mp3 +body.rtf diff --git a/UnitTests/TestData/tnef/multi-value-attribute.tnef b/UnitTests/TestData/tnef/multi-value-attribute.tnef new file mode 100644 index 0000000000000000000000000000000000000000..a8939b487b06e933456b76adea46e48587b665a4 GIT binary patch literal 18124 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 z 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 S@B*O+*Wd+04=o2T8Z7~fS#S*i literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/tnef/unicode-mapi-attr.list b/UnitTests/TestData/tnef/unicode-mapi-attr.list new file mode 100644 index 0000000000..e85b45dd75 --- /dev/null +++ b/UnitTests/TestData/tnef/unicode-mapi-attr.list @@ -0,0 +1 @@ +example.dat \ No newline at end of file diff --git a/UnitTests/TestData/tnef/unicode-mapi-attr.tnef b/UnitTests/TestData/tnef/unicode-mapi-attr.tnef new file mode 100644 index 0000000000000000000000000000000000000000..d09338405866a4ef5578f2d4aae4dc18c6d49391 GIT binary patch literal 5788 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 (() => tnef.Read (null, 0, buffer.Length)); + Assert.Throws (() => tnef.Read (buffer, -1, buffer.Length)); + Assert.Throws (() => tnef.Read (buffer, 0, -1)); + + Assert.Throws (() => tnef.Write (buffer, 0, buffer.Length)); + Assert.Throws (() => tnef.Seek (0, SeekOrigin.End)); + Assert.Throws (() => tnef.Flush ()); + Assert.Throws (() => tnef.SetLength (1024)); + + Assert.Throws (() => { var x = tnef.Position; }); + Assert.Throws (() => { tnef.Position = 0; }); + Assert.Throws (() => { var x = tnef.Length; }); + } + } + } + } } } diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 5c9ecea1c2..d128659a34 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -241,6 +241,8 @@ + + @@ -250,6 +252,10 @@ + + + + From 3238185212469a81aa77e607a2f2baf89acf899e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 7 Oct 2018 18:00:25 -0400 Subject: [PATCH 089/741] Test resetting RtfCompressedToRtf filter --- UnitTests/Tnef/TnefTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 4e687487cc..925426ad5c 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -192,6 +192,8 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB rtf.ContentType.Name = "body.rtf"; var converter = new RtfCompressedToRtf (); + converter.Reset (); + var content = new MemoryStream (); using (var filtered = new FilteredStream (content)) { From 956c5ca3299cbc69077d001339ac5deae4f0966f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 09:28:21 -0400 Subject: [PATCH 090/741] Added some RtfCompressedToRtf unit tests --- UnitTests/Tnef/TnefTests.cs | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 925426ad5c..c41a539fe4 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -868,5 +868,79 @@ public void TestTnefReaderStream () } } } + + [Test] + public void TestRtfCompressedToRtfUnknownCompressionType () + { + var input = new byte[] { 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', 0xff, 0xff, 0xff, 0xff }; + var filter = new RtfCompressedToRtf (); + int outputIndex, outputLength; + byte[] output; + + output = filter.Flush (input, 0, input.Length, out outputIndex, out outputLength); + + Assert.AreEqual (16, outputIndex, "outputIndex"); + Assert.AreEqual (0, outputLength, "outputLength"); + Assert.IsFalse (filter.IsValidCrc32, "IsValidCrc32"); + Assert.AreEqual ((RtfCompressionMode) 1145258561, filter.CompressionMode, "ComnpressionMode"); + } + + [Test] + public void TestRtfCompressedToRtfInvalidCrc () + { + var input = new byte[] { 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, (byte) 'L', (byte) 'Z', (byte) 'F', (byte) 'u', 0xff, 0xff, 0xff, 0xff }; + var filter = new RtfCompressedToRtf (); + int outputIndex, outputLength; + byte[] output; + + output = filter.Flush (input, 0, input.Length, out outputIndex, out outputLength); + + Assert.AreEqual (0, outputIndex, "outputIndex"); + Assert.AreEqual (0, outputLength, "outputLength"); + Assert.IsFalse (filter.IsValidCrc32, "IsValidCrc32"); + Assert.AreEqual (RtfCompressionMode.Compressed, filter.CompressionMode, "ComnpressionMode"); + } + + [Test] + public void TestRtfCompressedToRtf () + { + var input = new byte[] { (byte) '-', 0x00, 0x00, 0x00, (byte) '+', 0x00, 0x00, 0x00, (byte) 'L', (byte) 'Z', (byte) 'F', (byte) 'u', 0xf1, 0xc5, 0xc7, 0xa7, 0x03, 0x00, (byte) '\n', 0x00, (byte) 'r', (byte) 'c', (byte) 'p', (byte) 'g', (byte) '1', (byte) '2', (byte) '5', (byte) 'B', (byte) '2', (byte) '\n', 0xf3, (byte) ' ', (byte) 'h', (byte) 'e', (byte) 'l', (byte) '\t', 0x00, (byte) ' ', (byte) 'b', (byte) 'w', 0x05, 0xb0, (byte) 'l', (byte) 'd', (byte) '}', (byte) '\n', 0x80, 0x0f, 0xa0 }; + const string expected = "{\\rtf1\\ansi\\ansicpg1252\\pard hello world}\r\n"; + var filter = new RtfCompressedToRtf (); + int outputIndex, outputLength; + byte[] output; + + output = filter.Flush (input, 0, input.Length, out outputIndex, out outputLength); + + Assert.AreEqual (0, outputIndex, "outputIndex"); + Assert.AreEqual (43, outputLength, "outputLength"); + Assert.IsTrue (filter.IsValidCrc32, "IsValidCrc32"); + Assert.AreEqual (RtfCompressionMode.Compressed, filter.CompressionMode, "ComnpressionMode"); + + var text = Encoding.ASCII.GetString (output, outputIndex, outputLength); + + Assert.AreEqual (expected, text); + } + + [Test] + public void TestRtfCompressedToRtfRaw () + { + var input = new byte[] { (byte) '.', 0x00, 0x00, 0x00, (byte) '\"', 0x00, 0x00, 0x00, (byte) 'M', (byte) 'E', (byte) 'L', (byte) 'A', (byte) ' ', 0xdf, 0x12, 0xce, (byte) '{', (byte) '\\', (byte) 'r', (byte) 't', (byte) 'f', (byte) '1', (byte) '\\', (byte) 'a', (byte) 'n', (byte) 's', (byte) 'i', (byte) '\\', (byte) 'a', (byte) 'n', (byte) 's', (byte) 'i', (byte) 'c', (byte) 'p', (byte) 'g', (byte) '1', (byte) '2', (byte) '5', (byte) '2', (byte) '\\', (byte) 'p', (byte) 'a', (byte) 'r', (byte) 'd', (byte) ' ', (byte) 't', (byte) 'e', (byte) 's', (byte) 't', (byte) '}' }; + const string expected = "{\\rtf1\\ansi\\ansicpg1252\\pard test}"; + var filter = new RtfCompressedToRtf (); + int outputIndex, outputLength; + byte[] output; + + output = filter.Flush (input, 0, input.Length, out outputIndex, out outputLength); + + Assert.AreEqual (16, outputIndex, "outputIndex"); + Assert.AreEqual (34, outputLength, "outputLength"); + Assert.IsTrue (filter.IsValidCrc32, "IsValidCrc32"); + Assert.AreEqual (RtfCompressionMode.Uncompressed, filter.CompressionMode, "ComnpressionMode"); + + var text = Encoding.ASCII.GetString (output, outputIndex, outputLength); + + Assert.AreEqual (expected, text); + } } } From 01a2a7c3b37281ae13e811466e51db6b3293818f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 13:28:42 -0400 Subject: [PATCH 091/741] Added unit tests for TnefNameId --- UnitTests/Tnef/TnefTests.cs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index c41a539fe4..557a21c2c0 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -942,5 +942,32 @@ public void TestRtfCompressedToRtfRaw () Assert.AreEqual (expected, text); } + + [Test] + public void TestTnefNameId () + { + var guid = Guid.NewGuid (); + var tnef1 = new TnefNameId (guid, 17); + var tnef2 = new TnefNameId (guid, 17); + + Assert.AreEqual (TnefNameIdKind.Id, tnef1.Kind, "Kind Id"); + Assert.AreEqual (guid, tnef1.PropertySetGuid, "PropertySetGuid Id"); + Assert.AreEqual (17, tnef1.Id, "Id"); + + Assert.AreEqual (tnef1.GetHashCode (), tnef2.GetHashCode (), "GetHashCode Id"); + Assert.AreEqual (tnef1, tnef2, "Equal Id"); + + tnef1 = new TnefNameId (guid, "name"); + Assert.AreEqual (TnefNameIdKind.Name, tnef1.Kind, "Kind Name"); + Assert.AreEqual (guid, tnef1.PropertySetGuid, "PropertySetGuid"); + Assert.AreEqual ("name", tnef1.Name, "Name"); + + Assert.AreNotEqual (tnef1.GetHashCode (), tnef2.GetHashCode (), "GetHashCode Name vs Id"); + Assert.AreNotEqual (tnef1, tnef2, "Equal Name vs Id"); + + tnef2 = new TnefNameId (guid, "name"); + Assert.AreEqual (tnef1.GetHashCode (), tnef2.GetHashCode (), "GetHashCode Name"); + Assert.AreEqual (tnef1, tnef2, "Equal Name"); + } } } From 0155967380397b18a1a120fae19f5a7b3f8b582b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 13:57:30 -0400 Subject: [PATCH 092/741] Added more RtfCompressedToRtf unit tests --- MimeKit/Tnef/RtfCompressedToRtf.cs | 5 +++ UnitTests/Tnef/TnefTests.cs | 60 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/MimeKit/Tnef/RtfCompressedToRtf.cs b/MimeKit/Tnef/RtfCompressedToRtf.cs index 67a4b479ea..ce435a691c 100644 --- a/MimeKit/Tnef/RtfCompressedToRtf.cs +++ b/MimeKit/Tnef/RtfCompressedToRtf.cs @@ -112,6 +112,11 @@ public bool IsValidCrc32 { bool TryReadInt32 (byte[] buffer, ref int index, int endIndex, out int value) { + if (index == endIndex) { + value = saved; + return false; + } + int nread = (saved >> 24) & 0xFF; saved &= 0x00FFFFFF; diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 557a21c2c0..49c14ee54d 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -922,6 +922,36 @@ public void TestRtfCompressedToRtf () Assert.AreEqual (expected, text); } + [Test] + public void TestRtfCompressedToRtfByteByByte () + { + var input = new byte[] { (byte) '-', 0x00, 0x00, 0x00, (byte) '+', 0x00, 0x00, 0x00, (byte) 'L', (byte) 'Z', (byte) 'F', (byte) 'u', 0xf1, 0xc5, 0xc7, 0xa7, 0x03, 0x00, (byte) '\n', 0x00, (byte) 'r', (byte) 'c', (byte) 'p', (byte) 'g', (byte) '1', (byte) '2', (byte) '5', (byte) 'B', (byte) '2', (byte) '\n', 0xf3, (byte) ' ', (byte) 'h', (byte) 'e', (byte) 'l', (byte) '\t', 0x00, (byte) ' ', (byte) 'b', (byte) 'w', 0x05, 0xb0, (byte) 'l', (byte) 'd', (byte) '}', (byte) '\n', 0x80, 0x0f, 0xa0 }; + const string expected = "{\\rtf1\\ansi\\ansicpg1252\\pard hello world}\r\n"; + var filter = new RtfCompressedToRtf (); + int outputIndex, outputLength; + byte[] output; + + using (var memory = new MemoryStream ()) { + for (int i = 0; i < input.Length; i++) { + output = filter.Filter (input, i, 1, out outputIndex, out outputLength); + memory.Write (output, outputIndex, outputLength); + } + + output = filter.Flush (input, 0, 0, out outputIndex, out outputLength); + memory.Write (output, outputIndex, outputLength); + + output = memory.ToArray (); + } + + Assert.AreEqual (43, output.Length, "outputLength"); + Assert.IsTrue (filter.IsValidCrc32, "IsValidCrc32"); + Assert.AreEqual (RtfCompressionMode.Compressed, filter.CompressionMode, "ComnpressionMode"); + + var text = Encoding.ASCII.GetString (output); + + Assert.AreEqual (expected, text); + } + [Test] public void TestRtfCompressedToRtfRaw () { @@ -943,6 +973,36 @@ public void TestRtfCompressedToRtfRaw () Assert.AreEqual (expected, text); } + [Test] + public void TestRtfCompressedToRtfRawByteByByte () + { + var input = new byte[] { (byte) '.', 0x00, 0x00, 0x00, (byte) '\"', 0x00, 0x00, 0x00, (byte) 'M', (byte) 'E', (byte) 'L', (byte) 'A', (byte) ' ', 0xdf, 0x12, 0xce, (byte) '{', (byte) '\\', (byte) 'r', (byte) 't', (byte) 'f', (byte) '1', (byte) '\\', (byte) 'a', (byte) 'n', (byte) 's', (byte) 'i', (byte) '\\', (byte) 'a', (byte) 'n', (byte) 's', (byte) 'i', (byte) 'c', (byte) 'p', (byte) 'g', (byte) '1', (byte) '2', (byte) '5', (byte) '2', (byte) '\\', (byte) 'p', (byte) 'a', (byte) 'r', (byte) 'd', (byte) ' ', (byte) 't', (byte) 'e', (byte) 's', (byte) 't', (byte) '}' }; + const string expected = "{\\rtf1\\ansi\\ansicpg1252\\pard test}"; + var filter = new RtfCompressedToRtf (); + int outputIndex, outputLength; + byte[] output; + + using (var memory = new MemoryStream ()) { + for (int i = 0; i < input.Length; i++) { + output = filter.Filter (input, i, 1, out outputIndex, out outputLength); + memory.Write (output, outputIndex, outputLength); + } + + output = filter.Flush (input, 0, 0, out outputIndex, out outputLength); + memory.Write (output, outputIndex, outputLength); + + output = memory.ToArray (); + } + + Assert.AreEqual (34, output.Length, "outputLength"); + Assert.IsTrue (filter.IsValidCrc32, "IsValidCrc32"); + Assert.AreEqual (RtfCompressionMode.Uncompressed, filter.CompressionMode, "ComnpressionMode"); + + var text = Encoding.ASCII.GetString (output); + + Assert.AreEqual (expected, text); + } + [Test] public void TestTnefNameId () { From 9217a4927b49d03adff2dc6ad5114a760f883784 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 14:32:19 -0400 Subject: [PATCH 093/741] Fixed unit tests to work on Windows --- UnitTests/GroupAddressTests.cs | 1 + UnitTests/MultipartAlternativeTests.cs | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 84505c7e20..016dff0457 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -145,6 +145,7 @@ public void TestClone () { const string encoded = "Group Name: First Name , Second Name ,\n Inner Group Name: First Inner Name , Second Inner Name\n\t;, Third Name ;"; var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; options.International = true; var inner = new GroupAddress ("Inner Group Name"); diff --git a/UnitTests/MultipartAlternativeTests.cs b/UnitTests/MultipartAlternativeTests.cs index fa98757ae0..4278d8fdf1 100644 --- a/UnitTests/MultipartAlternativeTests.cs +++ b/UnitTests/MultipartAlternativeTests.cs @@ -57,17 +57,17 @@ public void TestGetTextBody () alternative.Add (richtext); alternative.Add (html); - Assert.AreEqual ("plain\n", alternative.TextBody, "TextBody"); - Assert.AreEqual ("html\n", alternative.HtmlBody, "HtmlBody"); + Assert.AreEqual ("plain\n", alternative.TextBody.Replace ("\r\n", "\n"), "TextBody"); + Assert.AreEqual ("html\n", alternative.HtmlBody.Replace ("\r\n", "\n"), "HtmlBody"); alternative.Insert (1, flowed); // Note: GetTextBody (Plain) returns Flowed because Flowed is also Plain and is listed after the text/plain part - Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Plain), "Plain"); - Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Flowed), "Flowed"); - Assert.AreEqual ("rtf\n", alternative.GetTextBody (TextFormat.RichText), "RichText"); - Assert.AreEqual ("html\n", alternative.GetTextBody (TextFormat.Html), "Html"); - Assert.IsNull (alternative.GetTextBody (TextFormat.Enriched), "Enriched"); + Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Plain).Replace ("\r\n", "\n"), "Plain"); + Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Flowed).Replace ("\r\n", "\n"), "Flowed"); + Assert.AreEqual ("rtf\n", alternative.GetTextBody (TextFormat.RichText).Replace ("\r\n", "\n"), "RichText"); + Assert.AreEqual ("html\n", alternative.GetTextBody (TextFormat.Html).Replace ("\r\n", "\n"), "Html"); + Assert.IsNull (alternative.GetTextBody (TextFormat.Enriched).Replace ("\r\n", "\n"), "Enriched"); } } } From 2b3bfc9557bb89bc5d1f360c1f4f3c76dd7346fe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 15:12:56 -0400 Subject: [PATCH 094/741] Fixed unit test --- UnitTests/MultipartAlternativeTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/MultipartAlternativeTests.cs b/UnitTests/MultipartAlternativeTests.cs index 4278d8fdf1..95d1acb6ce 100644 --- a/UnitTests/MultipartAlternativeTests.cs +++ b/UnitTests/MultipartAlternativeTests.cs @@ -67,7 +67,7 @@ public void TestGetTextBody () Assert.AreEqual ("flowed\n", alternative.GetTextBody (TextFormat.Flowed).Replace ("\r\n", "\n"), "Flowed"); Assert.AreEqual ("rtf\n", alternative.GetTextBody (TextFormat.RichText).Replace ("\r\n", "\n"), "RichText"); Assert.AreEqual ("html\n", alternative.GetTextBody (TextFormat.Html).Replace ("\r\n", "\n"), "Html"); - Assert.IsNull (alternative.GetTextBody (TextFormat.Enriched).Replace ("\r\n", "\n"), "Enriched"); + Assert.IsNull (alternative.GetTextBody (TextFormat.Enriched), "Enriched"); } } } From 24dad7f50fdf365f186412e7194f12e40925c088 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 19:50:47 -0400 Subject: [PATCH 095/741] Added unit tests for X509Certificate extensions --- .../BouncyCastleCertificateExtensions.cs | 8 +- .../TemporarySecureMimeContext.cs | 4 +- .../Cryptography/CertificateExtensionTests.cs | 100 ++++++++++++++++++ UnitTests/MailboxAddressTests.cs | 7 ++ UnitTests/UnitTests.csproj | 1 + 5 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 UnitTests/Cryptography/CertificateExtensionTests.cs diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 4bb201f330..6758e952e4 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -89,7 +89,7 @@ public static string GetIssuerNameInfo (this X509Certificate certificate, DerObj // FIXME: GetValueList() should be fixed to return IList var list = certificate.IssuerDN.GetValueList (identifier); if (list.Count == 0) - return null; + return string.Empty; return (string) list[0]; } @@ -114,7 +114,7 @@ public static string GetSubjectNameInfo (this X509Certificate certificate, DerOb // FIXME: GetValueList() should be fixed to return IList var list = certificate.SubjectDN.GetValueList (identifier); if (list.Count == 0) - return null; + return string.Empty; return (string) list[0]; } @@ -168,13 +168,13 @@ public static string GetSubjectEmailAddress (this X509Certificate certificate) { var address = certificate.GetSubjectNameInfo (X509Name.EmailAddress); - if (address != null) + if (!string.IsNullOrEmpty (address)) return address; var alt = certificate.GetExtensionValue (X509Extensions.SubjectAlternativeName); if (alt == null) - return null; + return string.Empty; var seq = Asn1Sequence.GetInstance (Asn1Object.FromByteArray (alt.GetOctets ())); diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 376da0a839..6ad12f4e52 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -250,7 +250,7 @@ X509Certificate GetCmsRecipientCertificate (MailboxAddress mailbox) } else { var address = certificate.GetSubjectEmailAddress (); - if (address == null || !address.Equals (mailbox.Address, StringComparison.OrdinalIgnoreCase)) + if (!address.Equals (mailbox.Address, StringComparison.OrdinalIgnoreCase)) continue; } @@ -315,7 +315,7 @@ X509Certificate GetCmsSignerCertificate (MailboxAddress mailbox, out AsymmetricK } else { var address = certificate.GetSubjectEmailAddress (); - if (address == null || !address.Equals (mailbox.Address, StringComparison.OrdinalIgnoreCase)) + if (!address.Equals (mailbox.Address, StringComparison.OrdinalIgnoreCase)) continue; } diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs new file mode 100644 index 0000000000..50ea067ecb --- /dev/null +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -0,0 +1,100 @@ +// +// BouncyCastleCertificateExtensionTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Security.Cryptography.X509Certificates; + +using MimeKit; +using MimeKit.Cryptography; + +using Org.BouncyCastle.X509; +using Org.BouncyCastle.Asn1.X509; + +using X509Certificate = Org.BouncyCastle.X509.X509Certificate; +using X509KeyUsageFlags = MimeKit.Cryptography.X509KeyUsageFlags; + +using NUnit.Framework; + +namespace UnitTests.Cryptography { + [TestFixture] + public class CertificateExtensionTests + { + [Test] + public void TestArgumentExceptions () + { + Assert.Throws (() => BouncyCastleCertificateExtensions.AsX509Certificate2 (null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetIssuerNameInfo (null, X509Name.CN)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetSubjectNameInfo (null, X509Name.CN)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetCommonName (null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetSubjectName (null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetSubjectEmailAddress (null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetFingerprint (null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetKeyUsageFlags ((X509Certificate) null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetEncryptionAlgorithms (null)); + + Assert.Throws (() => X509Certificate2Extensions.AsBouncyCastleCertificate (null)); + Assert.Throws (() => X509Certificate2Extensions.GetEncryptionAlgorithms (null)); + } + + X509KeyUsageFlags GetX509Certificate2KeyUsageFlags (X509Certificate2 certificate) + { + var usage = certificate.Extensions[X509Extensions.KeyUsage.Id] as X509KeyUsageExtension; + + if (usage == null) + return BouncyCastleCertificateExtensions.GetKeyUsageFlags ((bool[]) null); + + return (X509KeyUsageFlags) usage.KeyUsages; + } + + [Test] + public void TestCertificateConversion () + { + var fileNames = new string[] { "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; + var dataDir = Path.Combine ("..", "..", "TestData", "smime"); + var parser = new X509CertificateParser (); + + foreach (var fileName in fileNames) { + using (var stream = File.OpenRead (Path.Combine (dataDir, fileName))) { + foreach (X509Certificate certificate in parser.ReadCertificates (stream)) { + var certificate2 = certificate.AsX509Certificate2 (); + var certificate1 = certificate2.AsBouncyCastleCertificate (); + + Assert.AreEqual (certificate2.Thumbprint, certificate1.GetFingerprint ().ToUpperInvariant (), "Fingerprint"); + Assert.AreEqual (certificate2.GetNameInfo (X509NameType.EmailName, true), certificate1.GetIssuerNameInfo (X509Name.EmailAddress), "Issuer Email"); + Assert.AreEqual (certificate2.GetNameInfo (X509NameType.EmailName, false), certificate1.GetSubjectEmailAddress (), "Subject Email"); + Assert.AreEqual (certificate2.GetNameInfo (X509NameType.SimpleName, false), certificate1.GetCommonName (), "Common Name"); + + var usage2 = GetX509Certificate2KeyUsageFlags (certificate2); + var usage1 = certificate1.GetKeyUsageFlags (); + + Assert.AreEqual (usage2, usage1, "KeyUsageFlags"); + } + } + } + } + } +} diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 241d90ce24..4264e380e9 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -100,6 +100,13 @@ public void ArgumentExceptionTests () Assert.Throws (() => new SecureMailboxAddress (null, "ffff")); Assert.Throws (() => new SecureMailboxAddress ("johnny@example.com", null)); Assert.Throws (() => new SecureMailboxAddress ("johnny@example.com", "not hex encoded")); + + Assert.DoesNotThrow (() => new SecureMailboxAddress ("user@domain.com", "ffff")); + Assert.DoesNotThrow (() => new SecureMailboxAddress ("Mailbox Address", "user@domain.com", "ffff")); + Assert.DoesNotThrow (() => new SecureMailboxAddress (Encoding.UTF8, "Mailbox Address", "user@domain.com", "ffff")); + Assert.DoesNotThrow (() => new SecureMailboxAddress (new[] { "route1", "route2", "route3" }, "user@domain.com", "ffff")); + Assert.DoesNotThrow (() => new SecureMailboxAddress ("Routed Address", new[] { "route1", "route2", "route3" }, "user@domain.com", "ffff")); + Assert.DoesNotThrow (() => new SecureMailboxAddress (Encoding.UTF8, "Routed Address", new[] { "route1", "route2", "route3" }, "user@domain.com", "ffff")); } static void AssertParseFailure (string text, bool result, int tokenIndex, int errorIndex, RfcComplianceMode mode = RfcComplianceMode.Loose) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index d128659a34..6f258a826b 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -71,6 +71,7 @@ + From 8d2258f3dce2bede6074a7e45e2f6a8ae572b035 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 8 Oct 2018 21:19:55 -0400 Subject: [PATCH 096/741] Updated README.md --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2bc0c4fafd..0a018aae22 100644 --- a/README.md +++ b/README.md @@ -154,9 +154,8 @@ In the top-level MimeKit directory, there are a number of solution files; they a If you don't have the Xamarin products, you'll probably want to open the MimeKit.Net45.sln instead of MimeKit.sln. -Once you've opened the appropriate MimeKit solution file in either [Xamarin Studio](https://www.xamarin.com/download) -or [Visual Studio 2017](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** -build configuration and then build. +Once you've opened the appropriate MimeKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), +you can choose the **Debug** or **Release** build configuration and then build. Note: The **Release** build will generate the xml API documentation, but the **Debug** build will not. @@ -1058,9 +1057,9 @@ namespace DkimVerifier The first thing you'll need to do is fork MimeKit to your own GitHub repository. For instructions on how to do that, see the section titled **Getting the Source Code**. -If you use [Xamarin Studio](http://xamarin.com/studio) or [MonoDevelop](http://monodevelop.com), all of the -solution files are configured with the coding style used by MimeKit. If you use Visual Studio or some -other editor, please try to maintain the existing coding style as best as you can. +If you use [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/) or [MonoDevelop](http://monodevelop.com), +all of the solution files are configured with the coding style used by MimeKit. If you use Visual Studio on Windows or +some other editor, please try to maintain the existing coding style as best as you can. Once you've got some changes that you'd like to submit upstream to the official MimeKit repository, send me a **Pull Request** and I will try to review your changes in a timely manner. From 365b2b43f269f4bbd573566677946a1382f13ca1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Oct 2018 11:53:29 -0400 Subject: [PATCH 097/741] Added some MimeEntity unit tests --- UnitTests/MimePartTests.cs | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index fe194633db..4aca6883e2 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -98,6 +98,7 @@ public void TestArgumentExceptions () Assert.Throws (() => part.WriteTo (FormatOptions.Default, (Stream) null, false)); Assert.Throws (() => part.WriteTo (null, "fileName", false)); Assert.Throws (() => part.WriteTo (FormatOptions.Default, (string) null, false)); + Assert.Throws (() => part.ContentId = "this is some text and stuff"); Assert.Throws (async () => await part.WriteToAsync ((string) null)); Assert.Throws (async () => await part.WriteToAsync ((Stream) null)); @@ -113,6 +114,20 @@ public void TestArgumentExceptions () Assert.Throws (async () => await part.WriteToAsync (FormatOptions.Default, (string) null, false)); } + [Test] + public void TestParameterizedCtor () + { + const string expected = "Content-Type: text/plain\nContent-Transfer-Encoding: base64\nContent-Id: \n\n\n"; + var headers = new [] { new Header ("Content-Id", "") }; + var part = new MimePart ("text", "plain", new Header ("Content-Transfer-Encoding", "base64"), headers) { + Content = new MimeContent (new MemoryStream ()) + }; + + Assert.AreEqual ("id@localhost.com", part.ContentId, "Content-Id"); + Assert.AreEqual (ContentEncoding.Base64, part.ContentTransferEncoding, "Content-Transfer-Encoding"); + Assert.AreEqual (expected, part.ToString ().Replace ("\r\n", "\n"), "ToString"); + } + [Test] public void TestContentDisposition () { @@ -452,5 +467,39 @@ public async void TestWriteToAsync (string text) } } } + + [Test] + public void TestLoadHttpWebResponse () + { + var text = "This is some text and stuff.\r\n"; + var contentType = new ContentType ("text", "plain"); + + using (var content = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var entity = MimeEntity.Load (contentType, content); + + Assert.IsInstanceOf (entity); + + var part = (TextPart) entity; + + Assert.AreEqual (text, part.Text); + } + } + + [Test] + public async void TestLoadHttpWebResponseAsync () + { + var text = "This is some text and stuff.\r\n"; + var contentType = new ContentType ("text", "plain"); + + using (var content = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var entity = await MimeEntity.LoadAsync (contentType, content); + + Assert.IsInstanceOf (entity); + + var part = (TextPart) entity; + + Assert.AreEqual (text, part.Text); + } + } } } From 940a3e481b886f7b7c4abcc5b40e80bf68b1230f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Oct 2018 13:40:47 -0400 Subject: [PATCH 098/741] Added more unit tests for InternetAddressList --- MimeKit/InternetAddressList.cs | 8 +++ UnitTests/InternetAddressListTests.cs | 81 +++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index 1c128ab1af..98106aa843 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -147,6 +147,9 @@ public int IndexOf (InternetAddress address) /// public void Insert (int index, InternetAddress address) { + if (index < 0 || index >= list.Count) + throw new ArgumentOutOfRangeException (nameof (index)); + if (address == null) throw new ArgumentNullException (nameof (address)); @@ -192,12 +195,17 @@ public void RemoveAt (int index) public InternetAddress this [int index] { get { return list[index]; } set { + if (index < 0 || index >= list.Count) + throw new ArgumentOutOfRangeException (nameof (index)); + if (value == null) throw new ArgumentNullException (nameof (value)); if (list[index] == value) return; + list[index].Changed -= AddressChanged; + value.Changed += AddressChanged; list[index] = value; OnChanged (); } diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index 2f93fce88c..ff213ca624 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Collections.Generic; using NUnit.Framework; @@ -644,6 +645,84 @@ public void TestInternationalEmailAddresses () } } + [Test] + public void TestBasicFunctionality () + { + var user0 = new MailboxAddress ("Name Zero", "user0@address.com"); + var user1 = new MailboxAddress ("Name One", "user1@address.com"); + var user2 = new MailboxAddress ("Name Two", "user2@address.com"); + var list = new InternetAddressList (); + + Assert.IsFalse (list.IsReadOnly, "IsReadOnly"); + + list.Add (user1); + list.Add (user2); + + Assert.AreEqual (2, list.Count, "Count"); + Assert.IsTrue (list.Contains (user1), "Contains"); + Assert.IsTrue (list.Contains (user2), "Contains"); + Assert.IsFalse (list.Contains (new MailboxAddress ("Unknown", "unknown@address.com")), "Contains"); + Assert.AreEqual (0, list.IndexOf (user1), "IndexOf"); + Assert.AreEqual (1, list.IndexOf (user2), "IndexOf"); + + list.Insert (0, user0); + Assert.AreEqual (3, list.Count, "Count"); + Assert.IsTrue (list.Contains (user0), "Contains"); + Assert.AreEqual (0, list.IndexOf (user0), "IndexOf"); + Assert.AreEqual (user0.Name, list[0].Name, "Name"); + + list.RemoveAt (0); + Assert.AreEqual (2, list.Count, "Count"); + Assert.IsFalse (list.Contains (user0), "Contains"); + Assert.AreEqual (-1, list.IndexOf (user0), "IndexOf"); + + Assert.IsFalse (list.Remove (user0), "Remove"); + + Assert.IsTrue (list.Remove (user2), "Remove"); + Assert.AreEqual (1, list.Count, "Count"); + Assert.IsFalse (list.Contains (user2), "Contains"); + Assert.AreEqual (-1, list.IndexOf (user0), "IndexOf"); + + list[0] = user0; + Assert.AreEqual (1, list.Count, "Count"); + Assert.IsTrue (list.Contains (user0), "Contains"); + Assert.IsFalse (list.Contains (user1), "Contains"); + Assert.AreEqual (0, list.IndexOf (user0), "IndexOf"); + Assert.AreEqual (-1, list.IndexOf (user1), "IndexOf"); + } + + [Test] + public void TestEnumeratingMailboxes () + { + var innerGroup = new GroupAddress ("Inner"); + innerGroup.Members.Add (new MailboxAddress ("Inner1", "inner1@address.com")); + innerGroup.Members.Add (new MailboxAddress ("Inner2", "inner2@address.com")); + + var outerGroup = new GroupAddress ("Outer"); + outerGroup.Members.Add (new MailboxAddress ("Outer1", "outer1@address.com")); + outerGroup.Members.Add (innerGroup); + outerGroup.Members.Add (new MailboxAddress ("Outer2", "outer2@address.com")); + + var list = new InternetAddressList (); + list.Add (new MailboxAddress ("Before", "before@address.com")); + list.Add (outerGroup); + list.Add (new MailboxAddress ("After", "after@address.com")); + + var expected = new List (); + expected.Add (list[0]); + expected.Add (outerGroup.Members[0]); + expected.Add (innerGroup.Members[0]); + expected.Add (innerGroup.Members[1]); + expected.Add (outerGroup.Members[2]); + expected.Add (list[2]); + int i = 0; + + foreach (var mailbox in list.Mailboxes) { + Assert.AreEqual (expected[i], mailbox, "Mailbox #{0}", i); + i++; + } + } + [Test] public void TestEquality () { @@ -669,6 +748,8 @@ public void TestEquality () })); list2.Add (new MailboxAddress ("Joey", "joey@friends.com")); + Assert.IsFalse (list1.Equals (null), "Equals null"); + Assert.IsFalse (list1.Equals (new InternetAddressList ()), "Equals empty list"); Assert.IsTrue (list1.Equals (list2), "The 2 lists should be equal."); } From d51404fb3efeabd813e0fa63e7301b205137d598 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Oct 2018 17:45:48 -0400 Subject: [PATCH 099/741] Improved address parser to handle "local-part (User Name)" style addresses --- MimeKit/InternetAddress.cs | 17 ++++++---- MimeKit/Utils/MimeUtils.cs | 4 +-- UnitTests/InternetAddressTests.cs | 51 +++++++++++++++++++++++++++++ UnitTests/MailboxAddressTests.cs | 54 +++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 9 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 18f88a87df..dd48448fef 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -286,7 +286,7 @@ protected virtual void OnChanged () Changed (this, EventArgs.Empty); } - internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex, bool throwOnError, out string localpart) + internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex, bool skipTrailingCfws, bool throwOnError, out string localpart) { var token = new StringBuilder (); int startIndex = index; @@ -314,11 +314,15 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex return false; } + int cfws = index; if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; - if (index >= endIndex || text[index] != (byte) '.') + if (index >= endIndex || text[index] != (byte) '.') { + if (!skipTrailingCfws) + index = cfws; break; + } token.Append ('.'); index++; @@ -349,7 +353,7 @@ internal static bool TryParseAddrspec (byte[] text, ref int index, int endIndex, at = -1; string localpart; - if (!TryParseLocalPart (text, ref index, endIndex, throwOnError, out localpart)) + if (!TryParseLocalPart (text, ref index, endIndex, true, throwOnError, out localpart)) return false; if (index >= endIndex || ParseUtils.IsSentinel (text[index], sentinels)) { @@ -444,7 +448,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st return false; } - if (index + 1 >= endIndex || text[index] != (byte) ':') { + if (index >= endIndex || text[index] != (byte) ':') { if (throwOnError) throw new ParseException (string.Format ("Incomplete route in mailbox at offset {0}", startIndex), startIndex, index); @@ -651,7 +655,6 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index byte sentinel = index < endIndex ? text[index] : (byte) ','; var sentinels = new byte [] { sentinel }; string name, addrspec; - int at; if ((flags & AddressParserFlags.AllowMailboxAddress) == 0) { if (throwOnError) @@ -663,7 +666,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index // rewind back to the beginning of the local-part index = startIndex; - if (!TryParseAddrspec (text, ref index, endIndex, sentinels, throwOnError, out addrspec, out at)) + if (!TryParseLocalPart (text, ref index, endIndex, false, throwOnError, out addrspec)) return false; ParseUtils.SkipWhiteSpace (text, ref index, endIndex); @@ -696,7 +699,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index index++; } - address = new MailboxAddress (Encoding.UTF8, name, addrspec, at); + address = new MailboxAddress (Encoding.UTF8, name, addrspec, -1); return true; } diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 8610955f56..d9b34a0d4b 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -178,7 +178,7 @@ public static IEnumerable EnumerateReferences (byte[] buffer, int startI break; string localpart; - if (!InternetAddress.TryParseLocalPart (buffer, ref index, endIndex, false, out localpart)) + if (!InternetAddress.TryParseLocalPart (buffer, ref index, endIndex, true, false, out localpart)) continue; if (index >= endIndex) @@ -311,7 +311,7 @@ public static string ParseMessageId (byte[] buffer, int startIndex, int length) } string localpart; - if (!InternetAddress.TryParseLocalPart (buffer, ref index, endIndex, false, out localpart)) + if (!InternetAddress.TryParseLocalPart (buffer, ref index, endIndex, true, false, out localpart)) return null; if (index >= endIndex) diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index d150e6734a..2a495993b0 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -236,6 +236,26 @@ public void TestParseIncompleteAddrspec () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseIncompleteRoutedMailbox () + { + const string text = "Name <@route:"; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + + [Test] + public void TestParseIncompleteRoutedMailboxSpace () + { + const string text = "Name <@route: "; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseAddrspecNoAtDomain () { @@ -244,6 +264,37 @@ public void TestParseAddrspecNoAtDomain () AssertParse (text); } + [Test] + public void TestParseAddrspecNoAtDomainGreaterThan () + { + const string text = "jeff>"; + + AssertParse (text); + } + + [Test] + public void TestParseAddrspecNoAtDomainWithIncompleteComment () + { + const string text = "jeff (Jeffrey Stedfast"; + int tokenIndex = 5; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + + [Test] + public void TestParseAddrspecNoAtDomainWithComment () + { + const string text = "jeff (Jeffrey Stedfast)"; + + AssertParse (text); + + var mailbox = MailboxAddress.Parse (text); + + Assert.AreEqual ("Jeffrey Stedfast", mailbox.Name); + Assert.AreEqual ("jeff", mailbox.Address); + } + [Test] public void TestParseAddrspec () { diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 4264e380e9..ceac0ded11 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -313,6 +313,26 @@ public void TestParseIncompleteAddrspec () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseIncompleteRoutedMailbox () + { + const string text = "Name <@route:"; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + + [Test] + public void TestParseIncompleteRoutedMailboxSpace () + { + const string text = "Name <@route: "; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseIdnAddress () { @@ -332,6 +352,40 @@ public void TestParseAddrspecNoAtDomain () AssertParse (text); } + [Test] + public void TestParseAddrspecNoAtDomainGreaterThan () + { + const string text = "jeff>"; + int tokenIndex = 0; + int errorIndex = text.Length - 1; + + AssertParseFailure (text, false, tokenIndex, errorIndex, RfcComplianceMode.Strict); + AssertParse (text); + } + + [Test] + public void TestParseAddrspecNoAtDomainWithIncompleteComment () + { + const string text = "jeff (Jeffrey Stedfast"; + int tokenIndex = 5; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + + [Test] + public void TestParseAddrspecNoAtDomainWithComment () + { + const string text = "jeff (Jeffrey Stedfast)"; + + AssertParse (text); + + var mailbox = MailboxAddress.Parse (text); + + Assert.AreEqual ("Jeffrey Stedfast", mailbox.Name); + Assert.AreEqual ("jeff", mailbox.Address); + } + [Test] public void TestParseAddrspec () { From ef2a3138459a8d62e514726068b30b02d5ab7b26 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Oct 2018 20:33:37 -0400 Subject: [PATCH 100/741] Fixed unit tests --- MimeKit/InternetAddress.cs | 10 +++++++++- MimeKit/MailboxAddress.cs | 2 +- UnitTests/TestData/mbox/jwz-summary.txt | 8 ++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index dd48448fef..b576f2c52d 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -653,7 +653,6 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (index >= endIndex || text[index] == (byte) ',' || text[index] == (byte) '>' || text[index] == ';') { // we've completely gobbled up an addr-spec w/o a domain byte sentinel = index < endIndex ? text[index] : (byte) ','; - var sentinels = new byte [] { sentinel }; string name, addrspec; if ((flags & AddressParserFlags.AllowMailboxAddress) == 0) { @@ -684,6 +683,8 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index comment++; name = Rfc2047.DecodePhrase (options, text, comment, (index - 1) - comment).Trim (); + + ParseUtils.SkipWhiteSpace (text, ref index, endIndex); } else { name = string.Empty; } @@ -699,6 +700,13 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index index++; } + if (index < endIndex && text[index] != sentinel) { + if (throwOnError) + throw new ParseException (string.Format ("Unexpected token at offset {0}", index), startIndex, index); + + return false; + } + address = new MailboxAddress (Encoding.UTF8, name, addrspec, -1); return true; diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index bc8dc62b38..7ff0dbd878 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -573,7 +573,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (throwOnError) flags |= AddressParserFlags.ThrowOnError; - if (!InternetAddress.TryParse (options, text, ref index, endIndex, 0, flags, out address)) { + if (!TryParse (options, text, ref index, endIndex, 0, flags, out address)) { mailbox = null; return false; } diff --git a/UnitTests/TestData/mbox/jwz-summary.txt b/UnitTests/TestData/mbox/jwz-summary.txt index 5b1b29c725..83e0ab6200 100644 --- a/UnitTests/TestData/mbox/jwz-summary.txt +++ b/UnitTests/TestData/mbox/jwz-summary.txt @@ -1,5 +1,5 @@ From - -From: nsb +From: "Nathaniel Borenstein" To: abel, bianchi, braun, cameron, carmen, jfp, jxr, kraut, lamb, lowery, lynn, mlittman, nancyg, sau, shoshi, slr, stornett@flash, tkl Subject: Star Trek Party! Date: Thu, 19 Sep 1991 12:41:43 -0400 @@ -540,7 +540,7 @@ Content-Type: multipart/alternative Content-Type: text/richtext From - -From: nsb +From: "Nathaniel Borenstein" To: dnd Subject: Re: Happy New Year Date: Tue, 29 Sep 1992 10:19:23 -0400 @@ -739,7 +739,7 @@ Content-Type: multipart/mixed Content-Type: text/plain From - -From: devetzis +From: "Taso N. Devetzis" To: nsb Subject: greek mail Date: Tue, 16 Jun 1992 20:33:31 -0400 @@ -1195,7 +1195,7 @@ Content-Type: MESSAGE/RFC822 Content-Type: TEXT/PLAIN From - -From: nsb +From: "Nathaniel Borenstein" To: "David A. Braun" , "John Lamb" , "Michael Littman" Subject: Singing today? Date: Thu, 12 Dec 1991 11:38:21 -0500 From 298a028b6b405468a2ecafaff98a3e7aa627e8ac Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Oct 2018 21:04:05 -0400 Subject: [PATCH 101/741] Removed unnecessary error checking --- MimeKit/InternetAddress.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index b576f2c52d..9c48dffd42 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -671,20 +671,14 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index ParseUtils.SkipWhiteSpace (text, ref index, endIndex); if (index < endIndex && text[index] == '(') { - int comment = index; - - if (!ParseUtils.SkipComment (text, ref index, endIndex)) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete comment token at offset {0}", comment), comment, index); + int comment = index + 1; - return false; - } - - comment++; + // Note: this can't fail because it has already been skipped in TryParseLocalPart() above. + ParseUtils.SkipComment (text, ref index, endIndex); name = Rfc2047.DecodePhrase (options, text, comment, (index - 1) - comment).Trim (); - ParseUtils.SkipWhiteSpace (text, ref index, endIndex); + ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError); } else { name = string.Empty; } From 6e37be9f328dfa41bee9fb1fde3b5b046eb4eabb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Oct 2018 21:37:39 -0400 Subject: [PATCH 102/741] Added more unit tests --- MimeKit/InternetAddress.cs | 4 +--- UnitTests/InternetAddressTests.cs | 10 ++++++++++ UnitTests/MailboxAddressTests.cs | 10 ++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 9c48dffd42..a3e2cff7f6 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -764,7 +764,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index ParseUtils.SkipWhiteSpace (text, ref index, endIndex); if (index < endIndex && text[index] == '(') { - int comment = index; + int comment = index + 1; if (!ParseUtils.SkipComment (text, ref index, endIndex)) { if (throwOnError) @@ -773,8 +773,6 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index return false; } - comment++; - name = Rfc2047.DecodePhrase (options, text, comment, (index - 1) - comment).Trim (); } else { name = string.Empty; diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index 2a495993b0..f4a384231f 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -216,6 +216,16 @@ public void TestParseMailboxWithIncompleteCommentAfterAddrspec () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseMailboxWithIncompleteCommentAfterDomainLiteralAddrspec () + { + const string text = "jeff@[127.0.0.1] (incomplete comment"; + int tokenIndex = text.IndexOf ('('); + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseMailboxWithIncompleteCommentAfterAddress () { diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index ceac0ded11..758c30212e 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -293,6 +293,16 @@ public void TestParseMailboxWithIncompleteCommentAfterAddrspec () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseMailboxWithIncompleteCommentAfterDomainLiteralAddrspec () + { + const string text = "jeff@[127.0.0.1] (incomplete comment"; + int tokenIndex = text.IndexOf ('('); + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseMailboxWithIncompleteCommentAfterAddress () { From a4c288031c48a0d964f3608298a70c120ccdad0b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Oct 2018 08:19:41 -0400 Subject: [PATCH 103/741] Emit a ParseException with the correct token index --- MimeKit/InternetAddress.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index a3e2cff7f6..9c48dffd42 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -764,7 +764,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index ParseUtils.SkipWhiteSpace (text, ref index, endIndex); if (index < endIndex && text[index] == '(') { - int comment = index + 1; + int comment = index; if (!ParseUtils.SkipComment (text, ref index, endIndex)) { if (throwOnError) @@ -773,6 +773,8 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index return false; } + comment++; + name = Rfc2047.DecodePhrase (options, text, comment, (index - 1) - comment).Trim (); } else { name = string.Empty; From b08271305884d5d4e55cfdb7212312a95999e6b5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Oct 2018 08:33:36 -0400 Subject: [PATCH 104/741] Added more address parser unit tests --- UnitTests/InternetAddressTests.cs | 30 ++++++++++++++++++++++++++++++ UnitTests/MailboxAddressTests.cs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index f4a384231f..4afc1a103c 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -246,6 +246,16 @@ public void TestParseIncompleteAddrspec () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseIncompleteRoutedMailboxAt () + { + const string text = "Name <@"; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseIncompleteRoutedMailbox () { @@ -266,6 +276,26 @@ public void TestParseIncompleteRoutedMailboxSpace () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseIncompleteCommentInRoute () + { + const string text = "Name <@route,(comment"; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + + [Test] + public void TestParseInvalidRouteInMailbox () + { + const string text = "Name <@route,invalid:user@example.com>"; + const int tokenIndex = 0; + int errorIndex = text.IndexOf (',') + 1; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseAddrspecNoAtDomain () { diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 758c30212e..6ae5a759ae 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -323,6 +323,16 @@ public void TestParseIncompleteAddrspec () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseIncompleteRoutedMailboxAt () + { + const string text = "Name <@"; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseIncompleteRoutedMailbox () { @@ -343,6 +353,26 @@ public void TestParseIncompleteRoutedMailboxSpace () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseIncompleteCommentInRoute () + { + const string text = "Name <@route,(comment"; + const int tokenIndex = 0; + int errorIndex = text.Length; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + + [Test] + public void TestParseInvalidRouteInMailbox () + { + const string text = "Name <@route,invalid:user@example.com>"; + const int tokenIndex = 0; + int errorIndex = text.IndexOf (',') + 1; + + AssertParseFailure (text, false, tokenIndex, errorIndex); + } + [Test] public void TestParseIdnAddress () { From 275fa75100b96b3d96d6c4b86ca0a7c238e2aa0b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Oct 2018 09:55:47 -0400 Subject: [PATCH 105/741] Added unit tests for international mailbox routes --- MimeKit/DomainList.cs | 10 +++------- UnitTests/DomainListTests.cs | 12 ++++++++++++ UnitTests/InternetAddressTests.cs | 8 ++++++++ UnitTests/MailboxAddressTests.cs | 27 ++++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/MimeKit/DomainList.cs b/MimeKit/DomainList.cs index 0654a003bd..1683b65e1b 100644 --- a/MimeKit/DomainList.cs +++ b/MimeKit/DomainList.cs @@ -333,15 +333,12 @@ internal string Encode (FormatOptions options) var builder = new StringBuilder (); for (int i = 0; i < domains.Count; i++) { - if (IsNullOrWhiteSpace (domains[i]) && builder.Length == 0) + if (IsNullOrWhiteSpace (domains[i])) continue; if (builder.Length > 0) builder.Append (','); - if (IsNullOrWhiteSpace (domains[i])) - continue; - builder.Append ('@'); if (!options.International && ParseUtils.IsInternational (domains[i])) { @@ -369,14 +366,13 @@ public override string ToString () var builder = new StringBuilder (); for (int i = 0; i < domains.Count; i++) { - if (IsNullOrWhiteSpace (domains[i]) && builder.Length == 0) + if (IsNullOrWhiteSpace (domains[i])) continue; if (builder.Length > 0) builder.Append (','); - if (!IsNullOrWhiteSpace (domains[i])) - builder.Append ('@'); + builder.Append ('@'); builder.Append (domains[i]); } diff --git a/UnitTests/DomainListTests.cs b/UnitTests/DomainListTests.cs index 0fb5105cc6..542b551699 100644 --- a/UnitTests/DomainListTests.cs +++ b/UnitTests/DomainListTests.cs @@ -111,6 +111,7 @@ public void TestBasicListFunctionality () Assert.AreEqual (array.Length, list.Count); + Assert.IsFalse (list.Remove ("not-in-the-list")); Assert.IsTrue (list.Remove ("domain2")); Assert.AreEqual (2, list.Count); Assert.AreEqual ("domain0", list[0]); @@ -170,5 +171,16 @@ public void TestParseEmptyDomains () AssertParse ("@domain1,,@domain2", expected); } + + [Test] + public void TestToString () + { + var route = new DomainList (); + route.Add ("route1"); + route.Add (" \t\t "); + route.Add ("route2"); + + Assert.AreEqual ("@route1,@route2", route.ToString ()); + } } } diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index 4afc1a103c..d6b59d613b 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -296,6 +296,14 @@ public void TestParseInvalidRouteInMailbox () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseMailboxWithInternationalRoute () + { + const string text = "User Name <@route,@伊昭傑@郵件.商務:user@domain.com>"; + + AssertParse (text); + } + [Test] public void TestParseAddrspecNoAtDomain () { diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 6ae5a759ae..4657e139c3 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -373,6 +373,14 @@ public void TestParseInvalidRouteInMailbox () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestParseMailboxWithInternationalRoute () + { + const string text = "User Name <@route,@伊昭傑@郵件.商務:user@domain.com>"; + + AssertParse (text); + } + [Test] public void TestParseIdnAddress () { @@ -572,7 +580,8 @@ public void TestIsInternational () Assert.IsFalse (mailbox.IsInternational, "IsInternational"); - mailbox.Route.Add ("brånemyr"); + mailbox.Route.Add ("kristoffer"); // non-international route + mailbox.Route.Add ("brånemyr"); // international route Assert.IsTrue (mailbox.IsInternational, "IsInternational"); } @@ -625,6 +634,22 @@ public void TestRoutedMailbox () Assert.AreEqual (expectedNoName, encoded, "ToString mailbox does not match after setting Name to null."); } + [Test] + public void TestInternationalRoutedMailbox () + { + const string expectedIdn = "User Name <@route,@xn--@-216a8b89fj88ctw7c.xn--lhr59c:user@domain.com>"; + const string expected = "User Name <@route,@伊昭傑@郵件.商務:user@domain.com>"; + var route = new[] { "route", "伊昭傑@郵件.商務" }; + var mailbox = new MailboxAddress ("User Name", route, "user@domain.com"); + var options = FormatOptions.Default.Clone (); + + Assert.AreEqual (expectedIdn, mailbox.ToString (options, true)); + + options.International = true; + + Assert.AreEqual (expected, mailbox.ToString (options, true)); + } + #region Rfc7103 [Test] From 2ed6491bdee1879ff47b2759f925f0b319283b65 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Oct 2018 10:37:58 -0400 Subject: [PATCH 106/741] Avoid creating a multipart/mixed with just 1 child. Fixes issue #441 --- MimeKit/BodyBuilder.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index d4802e82ff..1156a8dfa1 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -166,6 +166,9 @@ public MimeEntity ToMessageBody () } if (Attachments.Count > 0) { + if (body == null && Attachments.Count == 1) + return Attachments[0]; + var mixed = new Multipart ("mixed"); if (body != null) From 4a5f56e340ce0c11799f44c3bd213af404e40328 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Oct 2018 11:32:14 -0400 Subject: [PATCH 107/741] Fixed unit tests --- UnitTests/MimePartTests.cs | 6 ++++-- UnitTests/Tnef/TnefTests.cs | 9 ++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 4aca6883e2..c58430b975 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -413,6 +413,7 @@ public void TestWriteTo (string text) var builder = new BodyBuilder (); builder.Attachments.Add ("filename", new MemoryStream (Encoding.UTF8.GetBytes (text))); + builder.TextBody = "This is the text body."; var body = builder.ToMessageBody (); @@ -424,7 +425,7 @@ public void TestWriteTo (string text) stream.Position = 0; var multipart = (Multipart) MimeEntity.Load (stream); - using (var input = ((MimePart) multipart[0]).Content.Open ()) { + using (var input = ((MimePart) multipart[1]).Content.Open ()) { var buffer = new byte[1024]; int n; @@ -444,6 +445,7 @@ public async void TestWriteToAsync (string text) var builder = new BodyBuilder (); builder.Attachments.Add ("filename", new MemoryStream (Encoding.UTF8.GetBytes (text))); + builder.TextBody = "This is the text body."; var body = builder.ToMessageBody (); @@ -455,7 +457,7 @@ public async void TestWriteToAsync (string text) stream.Position = 0; var multipart = (Multipart) await MimeEntity.LoadAsync (stream); - using (var input = ((MimePart) multipart[0]).Content.Open ()) { + using (var input = ((MimePart) multipart[1]).Content.Open ()) { var buffer = new byte[1024]; int n; diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 49c14ee54d..ff82b7d1e2 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -822,14 +822,9 @@ public void TestExtractedCharset () message = tnef.ConvertToMessage (); - Assert.IsInstanceOf (typeof (Multipart), message.Body); + Assert.IsInstanceOf (typeof (TextPart), message.Body); - var mixed = (Multipart) message.Body; - - Assert.AreEqual (1, mixed.Count); - Assert.IsInstanceOf (typeof (TextPart), mixed[0]); - - var text = (TextPart) mixed[0]; + var text = (TextPart) message.Body; Assert.IsTrue (text.IsHtml); From 57f4d20237af70ddcff5ee33d8838a38df4498da Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Oct 2018 21:15:42 -0400 Subject: [PATCH 108/741] Added MimeParser unit tests for ParserOptions.RespectContentLength --- UnitTests/MimeParserTests.cs | 84 +- .../TestData/mbox/content-length-summary.txt | 278 + .../TestData/mbox/content-length.mbox.txt | 13567 ++++++++++++++++ UnitTests/UnitTests.csproj | 2 + 4 files changed, 13905 insertions(+), 26 deletions(-) create mode 100644 UnitTests/TestData/mbox/content-length-summary.txt create mode 100644 UnitTests/TestData/mbox/content-length.mbox.txt diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index f0bdea8e7a..e89e0b7d3e 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -568,22 +568,26 @@ public void TestEmptyMultipartAlternative () } } - static void AssertJwzMboxResults (string actual, Stream output) + static void AssertMboxResults (string baseName, string actual, Stream output) { - var summary = File.ReadAllText (Path.Combine (MboxDataDir, "jwz-summary.txt")).Replace ("\r\n", "\n"); - var original = new MemoryBlockStream (); - var expected = new byte[4096]; - var buffer = new byte[4096]; - int nx, n; - // WORKAROUND: Mono's iso-2022-jp decoder breaks on this input in versions <= 3.2.3 but is fixed in 3.2.4+ string iso2022jp = Encoding.GetEncoding ("iso-2022-jp").GetString (Convert.FromBase64String ("GyRAOjRGI0stGyhK")); if (iso2022jp != "佐藤豊") actual = actual.Replace (iso2022jp, "佐藤豊"); - Assert.AreEqual (summary, actual, "Summaries do not match for jwz.mbox"); + var path = Path.Combine (MboxDataDir, baseName + "-summary.txt"); + if (!File.Exists (path)) + File.WriteAllText (path, actual); - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, "jwz.mbox.txt"))) { + var summary = File.ReadAllText (path).Replace ("\r\n", "\n"); + var original = new MemoryBlockStream (); + var expected = new byte[4096]; + var buffer = new byte[4096]; + int nx, n; + + Assert.AreEqual (summary, actual, "Summaries do not match for {0}.mbox", baseName); + + using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { using (var filtered = new FilteredStream (original)) { filtered.Add (new Dos2UnixFilter ()); stream.CopyTo (filtered); @@ -617,17 +621,16 @@ static void AssertJwzMboxResults (string actual, Stream output) } while (true); } - [Test] - public void TestJwzMbox () + void TestMbox (ParserOptions options, string baseName) { - var options = FormatOptions.Default.Clone (); + var format = FormatOptions.Default.Clone (); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - options.NewLineFormat = NewLineFormat.Unix; + format.NewLineFormat = NewLineFormat.Unix; - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, "jwz.mbox.txt"))) { - var parser = new MimeParser (stream, MimeFormat.Mbox); + using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { + var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); int count = 0; while (!parser.IsEndOfStream) { @@ -645,25 +648,24 @@ public void TestJwzMbox () var marker = Encoding.UTF8.GetBytes ((count > 0 ? "\n" : string.Empty) + parser.MboxMarker + "\n"); output.Write (marker, 0, marker.Length); - message.WriteTo (options, output); + message.WriteTo (format, output); count++; } } - AssertJwzMboxResults (builder.ToString (), output); + AssertMboxResults (baseName, builder.ToString (), output); } - [Test] - public async void TestJwzMboxAsync () + async Task TestMboxAsync (ParserOptions options, string baseName) { - var options = FormatOptions.Default.Clone (); + var format = FormatOptions.Default.Clone (); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - options.NewLineFormat = NewLineFormat.Unix; + format.NewLineFormat = NewLineFormat.Unix; - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, "jwz.mbox.txt"))) { - var parser = new MimeParser (stream, MimeFormat.Mbox); + using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { + var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); int count = 0; while (!parser.IsEndOfStream) { @@ -681,12 +683,42 @@ public async void TestJwzMboxAsync () var marker = Encoding.UTF8.GetBytes ((count > 0 ? "\n" : string.Empty) + parser.MboxMarker + "\n"); await output.WriteAsync (marker, 0, marker.Length); - await message.WriteToAsync (options, output); + await message.WriteToAsync (format, output); count++; } } - AssertJwzMboxResults (builder.ToString (), output); + AssertMboxResults (baseName, builder.ToString (), output); + } + + [Test] + public void TestContentLengthMbox () + { + var options = ParserOptions.Default.Clone (); + options.RespectContentLength = true; + + TestMbox (options, "content-length"); + } + + [Test] + public async void TestContentLengthMboxAsync () + { + var options = ParserOptions.Default.Clone (); + options.RespectContentLength = true; + + await TestMboxAsync (options, "content-length"); + } + + [Test] + public void TestJwzMbox () + { + TestMbox (null, "jwz"); + } + + [Test] + public async void TestJwzMboxAsync () + { + await TestMboxAsync (null, "jwz"); } [Test] @@ -753,7 +785,7 @@ public async void TestJwzPersistentMboxAsync () // Force the various MimePart objects to write their content streams. // The idea is that by forcing the MimeParts to seek in their content, // we will test to make sure that the parser correctly deals with it. - message.WriteTo (Stream.Null); + await message.WriteToAsync (Stream.Null); } } diff --git a/UnitTests/TestData/mbox/content-length-summary.txt b/UnitTests/TestData/mbox/content-length-summary.txt new file mode 100644 index 0000000000..fd3cb2276e --- /dev/null +++ b/UnitTests/TestData/mbox/content-length-summary.txt @@ -0,0 +1,278 @@ +From - +From: mailusr1@navstar1.mcom.com +To: atzet@netscape.com +Subject: Re: mailusr1@navstar1 3.0b6gold #1 +Date: Sun, 21 Jul 1996 17:02:55 -0800 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: message/rfc822 + Content-Type: text/plain + +From - +From: "Jamie Zawinski" +To: "Jamie Zawinski" +Subject: attached image cache test (test 2: inline disposition) +Date: Thu, 13 Jun 1996 23:25:49 -0700 +Content-Type: multipart/mixed + Content-Type: message/rfc822 + Content-Type: text/plain + Content-Type: image/gif + Content-Type: image/gif + Content-Type: image/gif + Content-Type: image/gif + Content-Type: message/rfc822 + Content-Type: text/plain + Content-Type: message/rfc822 + Content-Type: message/rfc822 + Content-Type: message/rfc822 + Content-Type: text/plain + Content-Type: text/html + +From - +From: "Jamie Zawinski" +To: "Jamie Zawinski" +Subject: attached image cache test (test 1: attachment disposition) +Date: Thu, 13 Jun 1996 23:25:49 -0700 +Content-Type: multipart/mixed + Content-Type: message/rfc822 + Content-Type: text/plain + Content-Type: image/gif + Content-Type: image/gif + Content-Type: image/gif + Content-Type: image/gif + Content-Type: message/rfc822 + Content-Type: text/plain + Content-Type: message/rfc822 + Content-Type: message/rfc822 + Content-Type: message/rfc822 + Content-Type: text/plain + Content-Type: text/html + +From - Mon Jun 3 12:50:27 1996 +From: izzy@nugget.scr.atm.com +To: jwz@netscape.com +Subject: RE[4]: your generated HTML +Date: Mon, 03 Jun 1996 09:42:32 -0700 +Content-Type: multipart/related + Content-Type: text/html + Content-Type: image/gif + +From - Mon Aug 18 21:13:21 1997 +From: "Chuck Simmons" +To: "Jamie Zawinski" +Subject: 3.01 MIME prob message [Fwd: communicator 4.01 a conference problem] +Date: Mon, 18 Aug 1997 21:07:07 -0700 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: message/rfc822 + Content-Type: multipart/alternative + Content-Type: text/plain + Content-Type: multipart/related + Content-Type: text/html + Content-Type: image/tiff + +From - Thu Feb 8 18:49:08 1996 +From: "Dr. Mark K. Joseph" +To: jwz@netscape.com +Subject: Example of CID linking in a multipart/related MIME message +Date: Thu, 08 Feb 1996 17:33:10 -0800 +Content-Type: multipart/related + Content-Type: text/html + Content-Type: image/gif + Content-Type: image/gif + Content-Type: image/gif + Content-Type: image/gif + +From - +From: develop!nextmime@ebony +Subject: More richtext questions/comments +Date: Fri, 25 Sep 1992 14:13:02 -0700 +Content-Type: multipart/mixed + Content-Type: text/richtext + +From - Thu Apr 25 10:19:58 1996 +From: "Raph Levien" +To: smime-dev@RSA.COM +Subject: Multipart/signed message format +Date: Thu, 25 Apr 1996 03:26:57 -0700 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Fri Nov 8 18:21:51 1996 +From: "Eric Rosenquist" +To: "Lisa Repka" , "Jamie Zawinski" +Subject: My encryption certificate for S/MIME testing +Date: Fri, 08 Nov 1996 14:45:18 -0500 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: application/x-pkcs7-mime + +From - Thu Nov 21 13:20:54 1996 +From: "Eric Rosenquist" +To: "S/MIME Developers" +Subject: My encryption certificate for S/MIME testing +Date: Thu, 21 Nov 1996 16:10:23 -0500 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: application/x-pkcs7-mime + +From - Wed Dec 11 18:06:10 1996 +From: "Jamie Zawinski" +To: jwz@urchin.mcom.com +Subject: signed frog +Date: Wed, 11 Dec 1996 18:05:56 -0800 +Content-Type: multipart/signed + Content-Type: image/jpeg + Content-Type: application/x-pkcs7-signature + +From - Fri Dec 13 15:01:21 1996 +From: "Blake Ramsdell" +To: "Jamie Zawinski" +Subject: Re: can you send me an encrypted message? +Date: Fri, 13 Dec 1996 15:09:42 -0800 +Content-Type: application/x-pkcs7-mime + +From - Fri Dec 13 15:01:22 1996 +From: "Blake Ramsdell" +To: jwz@netscape.com +Subject: Encrypted message +Date: Fri, 13 Dec 1996 15:10:21 -0800 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Mon Apr 22 18:36:56 1996 +From: "Arjun J Taneja" +To: "smime-dev@rsa.com" +Subject: Ready for interoperability testing. +Date: Mon, 22 Apr 1996 18:20:32 -0500 +Content-Type: application/x-pkcs7-mime + +From - Thu Dec 19 13:29:25 1996 +From: "Lisa Repka" +To: "Jamie Zawinski" +Subject: very cool +Date: Thu, 19 Dec 1996 09:38:50 -0800 +Content-Type: application/x-pkcs7-mime + +From - Fri Mar 7 02:51:22 1997 +From: "Jamie Zawinski" +To: "Jamie Zawinski" +Subject: forwarded encrypted message +Date: Fri, 07 Mar 1997 02:50:39 -0800 +Content-Type: message/rfc822 + Content-Type: application/x-pkcs7-mime + +From - Fri Mar 7 02:51:23 1997 +From: "Jamie Zawinski" +To: "Jamie Zawinski" +Subject: forwarded encrypted message (mult/mixed) +Date: Fri, 07 Mar 1997 02:51:07 -0800 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: message/rfc822 + Content-Type: application/x-pkcs7-mime + +From - Mon Mar 17 17:19:30 1997 +From: "Dan Hugo" +To: jwz@netscape.com +Subject: This is signed +Date: Mon, 17 Mar 1997 17:17:35 -0800 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Mon Mar 24 00:03:37 1997 +From: "Lisa Repka" +To: "Jamie Zawinski" , "Dan Hugo" +Subject: testing out some new stuff +Date: Sun, 23 Mar 1997 23:11:56 -0800 +Content-Type: application/x-pkcs7-mime + +From - Tue Apr 15 10:42:13 1997 +From: "Dan Werbel" +To: "Jamie Zawinski" +Subject: Re: Obtaining other people's certificates +Date: Tue, 15 Apr 1997 08:05:56 -0400 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Wed Apr 16 16:57:13 1997 +From: "Jamie Zawinski" +To: "Jamie Zawinski" +Subject: encrypted +Date: Wed, 16 Apr 1997 16:57:13 -0700 +Content-Type: application/x-pkcs7-mime + +From - Sun Apr 28 13:05:40 1996 +From: "Blake Ramsdell" +To: "'smime-dev@rsa.com'" +Subject: Deming Software -- ready to go! +Date: Sat, 27 Apr 1996 01:08:58 -0700 +Content-Type: application/x-pkcs7-mime + +From - Tue May 28 11:02:16 1996 +From: Ray2@FrontierTech.com +To: smime-dev@RSA.COM +Subject: Frontier Technologies testing, here's my cert +Date: Tue, 28 May 1996 12:24:23 +0000 +Content-Type: Application/x-pkcs7-mime + +From - Mon Jun 10 11:45:25 1996 +From: "John T. Gildred" +To: "'smime-dev@rsa.com'" +Subject: Signed Confirmation +Date: Mon, 10 Jun 1996 14:37:52 -0500 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Wed Sep 11 08:47:00 1996 +From: "Peter Williams" +To: "'smime-dev@rsa.com'" +Subject: plase help by returning what gets delivered... +Date: Mon, 09 Sep 1996 12:52:38 -0700 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: text/html + Content-Type: application/x-pkcs7-signature + +From - Mon Sep 23 13:04:41 1996 +From: "Ron Craswell" +To: "S-MIME DEV" +Subject: multipart/signed test +Date: Mon, 23 Sep 1996 09:20:00 -0700 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Sat Nov 2 21:56:58 1996 +From: "John T. Gildred" +To: "'smime-dev@rsa.com'" +Subject: Signed SHA1 with VeriSign certification +Date: Tue, 29 Oct 1996 15:12:00 -0500 +Content-Type: multipart/signed + Content-Type: text/plain + Content-Type: application/x-pkcs7-signature + +From - Mon Jul 29 02:26:23 1996 +From: "The Post Office" +To: unlisted-recipients: ; +Subject: email delivery error +Date: Mon, 29 Jul 1996 02:13:08 -0700 +Content-Type: multipart/report + Content-Type: message/delivery-status + Content-Type: message/rfc822 + Content-Type: text/plain + +From - Fri Sep 27 12:03:19 1996 +From: "Dr. Mark K. Joseph" +To: lewisg@Exchange.Microsoft.com +Subject: RE: problem with relative urls and applets +Date: Fri, 27 Sep 1996 09:36:54 -0700 +Content-Type: multipart/mixed + Content-Type: text/plain + Content-Type: application/vcard + diff --git a/UnitTests/TestData/mbox/content-length.mbox.txt b/UnitTests/TestData/mbox/content-length.mbox.txt new file mode 100644 index 0000000000..e915901497 --- /dev/null +++ b/UnitTests/TestData/mbox/content-length.mbox.txt @@ -0,0 +1,13567 @@ +From - +Return-Path: <> +Received: from navstar1.mcom.com ([205.217.251.46]) by hedgehog.mcom.com + (Netscape Mail Server v1.1) with ESMTP id AAA29011 + for Sun, 21 Jul 1996 16:59:17 -0700 +To: atzet@netscape.com +From: mailusr1@navstar1.mcom.com +Reply-To: mailusr1@navstar1.mcom.com +Subject: Re: mailusr1@navstar1 3.0b6gold #1 +Date: Sun, 21 Jul 1996 17:02:55 -0800 +Message-ID: <19960722000255.AAA26598@navstar1.mcom.com> +MIME-Version: 1.0 +Content-Type: multipart/mixed;; + Boundary="===========================_ _= 1212158(26598)" +Content-Transfer-Encoding: 7bit +X-Mozilla-Status: 0011 +Content-Length: 1213 + +--===========================_ _= 1212158(26598) +Content-Type: text/plain + +default echo 1 +default echo 2 +default echo 3 +default echo 4 +default echo 5 +--===========================_ _= 1212158(26598) +Content-Type: message/rfc822 +Content-Disposition: attachment + +Received: from hedgehog.mcom.com ([205.217.251.17]) by navstar1.mcom.com + (Netscape Mail Server v2.0) with ESMTP id AAA3678 + for Sun, 21 Jul 1996 17:02:54 -0800 +Received: from cabrillo.mcom.com ([207.1.136.82]) by hedgehog.mcom.com + (Netscape Mail Server v1.1) with SMTP id AAA29001 + for Sun, 21 Jul 1996 16:59:09 -0700 +Sender: atzet@netscape.com (Michael Atzet) +Message-ID: <31F2C3F2.D47@netscape.com> +Date: Sun, 21 Jul 1996 16:57:38 -0700 +From: "Michael A. Atzet" +X-Mailer: Mozilla 3.0b6Gold (X11; U; SunOS 5.5 sun4u) +MIME-Version: 1.0 +To: mailusr1@navstar1 +Subject: mailusr1@navstar1 3.0b6gold #1 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +mailusr1@navstar1 3.0b6gold #1 +-- +Michael A. Atzet atzet@netscape.com +Netscape Communications 415.919.3274 +--===========================_ _= 1212158(26598)-- +From - +Message-ID: <31C105ED.41C62@netscape.com> +Date: Thu, 13 Jun 1996 23:25:49 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: attached image cache test (test 2: inline disposition) +Content-Type: multipart/mixed; boundary="------------167E2781446B" +X-Mozilla-Status: 0001 +Content-Length: 3748 + +This is a multi-part message in MIME format. + +--------------167E2781446B +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline +Content-Description: a message with a text/plain body + +Message-ID: <31C10324.41C62@netscape.com> +Date: Thu, 13 Jun 1996 23:13:56 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: test message one (a message with a text/plain body) +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +This is the first attached message. + + +--------------167E2781446B +Content-Type: image/gif; name="one.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="one.gif" + +R0lGODdhpAAoAPAAAP///wAAACwAAAAApAAoAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3nuhP0frCT/HpBkK8I+RmUyM2xyXgipFALtbq8AphYirb63RK73nF2zOUe +hgt2W52Ar6VMuTgsux7ZQ7P4HEfkdgf4BtRAtTdIyHijRwd52Bg5J/lXqIDXeCeZ2OlX82jp ++VlaeYq5iRrlR7qqOiM61do6a4rpmgkaOEp7m0oj+/o1SHnWZ/mq28tciYwjnJo73Rxhx2mb +DawTvWmsugiLuAucKw4Naj5ppm6bPL4LZ35t0z2P9m3YyRPfX328Joc9X876HFv07EEdYgQL +kouR0I3ENOxKJXQ2waC+M0Ph6JFxguzdx5EVHpE8eaEfypUZkz1kCZOXx5g0a9q8iTOnzp08 +e/r8CTSo0KFEix4oAAA7 +--------------167E2781446B +Content-Type: image/gif; name="two.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="two.gif" + +R0lGODdhmgAwAPAAAP///wAAACwAAAAAmgAwAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3n+s73/g8MCoeBojFAPCqVQ4axCXgapNEiVEEVWg/Z7ZXr1Say0S+CDESe +w2XzNHx8e+Njeh0tZzfwy+rTnqfWQvYXtyRYJXfnN7eFh6WXByYIVxhpQkhlp9lI2bk2GfHo +F/q25omYkonY9an4Sgob6zDKSXm6uLKKWzrFO2v7u3cJ7MjKNjqy2zt76lp8mLqQLGV4nJos +sizbqtZtyjxBbYX0lxt+st0cLMuITUwLz8R43p6OXHnd+z2d3S99x5u6ZijU8Yu1SZ4mUfCg +/UN3752+fdEEHnLmzx4kRlCQyGX0cNFdoJGwOoWcBDDgvH4c/zV0gxEQTJiZZtpMVOfmTHw6 +bZ7sCTSo0KFEixo9ijSp0qVMmzp9CjWq1KlUq1qNUAAAOw== +--------------167E2781446B +Content-Type: image/gif; name="three.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="three.gif" + +R0lGODdhqAAzAPAAAP///wAAACwAAAAAqAAzAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3n+s73/g8MCofEovGIrASWzMCwCY0CoEkHs3g1ZKfLw7aq+Aa7XrLWeUaD +w2ahOp1Qi9dw4pt7l7fp9TS6WbaHJzh4F0i4MBfohwAI2PgIqUgidkUV9UZW2UVVNxmHWNjJ +iOdplvUZsnm61cqqBwu5CPEZ+YWKO8ule7Iq+dvnGttX+lDbdstKbIkcCuLLewtcTJ1syHa9 +3HxtTe1dAq3Nbft6KGUc2s1rfonp/BHurT6f+c5wXJ+fiJhqEq9ebc8oYhPwTftGcN2Kf9t0 +AQRlD1uDh4oiScrWS2BDZoeahFlpFcFgNH4gSU1RwVCfn3Pu8ln8iJEiyYGYUtQstDJnMFg3 +D9FyB7Ejrpc+sWFc05KP0okalzoFxeap1F2ypkrtaTWr1q1cu3r9Cjas2LFky5o9izat2rVs +27p9Czeu3K4FAAA7 +--------------167E2781446B +Content-Type: image/gif; name="four.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="four.gif" + +R0lGODdhmgA5APAAAP///wAAACwAAAAAmgA5AAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3n+s73/g8MCofEovGITAIDzGZg6IxGlYbm0ZrAKrVE7oFJBXiF42q4vAQj +nuKzuop1fsdTRd0ub3jZ+L02L2YFOOL3NCXFFwiXGGgIGPfWt8bY6BjJhQlJ+VHI9/j2Byqa +OKpXmnW6OEmqNhhSuBqrOts453kZuSqFyhjK+jtnAmsra0ZM61vMe8yMjAusMkxb25fqi8iQ +uVycCZ0iTT2tKfs8sbfN3K18Aq7u3OuKtnC+ntwsL9Je/r5uuzmfSxK3fdPY5XLHr1Kzal9M +/RvobRC+VwcJhkOkaZc/UXwTFUo8ZM9gnZF57oTaeGfRQ4wPUvp719EIxodhoFSsSSVgQJxd +4PHMqfGn0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWr1q1cu3r9CtZpAQA7 +--------------167E2781446B +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline +Content-Description: a message with a text/plain body + +Message-ID: <31C10333.167E2@netscape.com> +Date: Thu, 13 Jun 1996 23:14:11 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: test message two (a message with a text/plain body) +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +This is the second attached message. + +--------------167E2781446B +Content-Type: message/rfc822 +Content-Disposition: inline +Content-Description: a message which contains a message + (which contains a message, which has a text/plain body) + +Message-ID: <31C106F6.59E22@netscape.com> +Date: Thu, 13 Jun 1996 23:30:14 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: a message which contains a message + (which contains a message, which has a text/plain body) +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline +Content-Description: a message which contains a message + (which has a text/plain body) + +Message-ID: <31C106E3.15FB2@netscape.com> +Date: Thu, 13 Jun 1996 23:29:55 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: a message which contains a message + (which has a text/plain body) +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline +Content-Description: a message with a text/plain body + +Message-ID: <31C106D2.794B2@netscape.com> +Date: Thu, 13 Jun 1996 23:29:38 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: a message with a text/plain body +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Foo! + +--------------167E2781446B +Content-Type: text/html +Content-Disposition: inline + +And this is some HTML + +--------------167E2781446B-- +From - +Message-ID: <31C105ED.41C6@netscape.com> +Date: Thu, 13 Jun 1996 23:25:49 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: attached image cache test (test 1: attachment disposition) +Content-Type: multipart/mixed; boundary="------------167E2781446B" +X-Mozilla-Status: 0001 +Content-Length: 3748 + +This is a multi-part message in MIME format. + +--------------167E2781446B +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment +Content-Description: a message with a text/plain body + +Message-ID: <31C10324.41C6@netscape.com> +Date: Thu, 13 Jun 1996 23:13:56 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: test message one (a message with a text/plain body) +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +This is the first attached message. + + +--------------167E2781446B +Content-Type: image/gif; name="one.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="one.gif" + +R0lGODdhpAAoAPAAAP///wAAACwAAAAApAAoAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3nuhP0frCT/HpBkK8I+RmUyM2xyXgipFALtbq8AphYirb63RK73nF2zOUe +hgt2W52Ar6VMuTgsux7ZQ7P4HEfkdgf4BtRAtTdIyHijRwd52Bg5J/lXqIDXeCeZ2OlX82jp ++VlaeYq5iRrlR7qqOiM61do6a4rpmgkaOEp7m0oj+/o1SHnWZ/mq28tciYwjnJo73Rxhx2mb +DawTvWmsugiLuAucKw4Naj5ppm6bPL4LZ35t0z2P9m3YyRPfX328Joc9X876HFv07EEdYgQL +kouR0I3ENOxKJXQ2waC+M0Ph6JFxguzdx5EVHpE8eaEfypUZkz1kCZOXx5g0a9q8iTOnzp08 +e/r8CTSo0KFEix4oAAA7 +--------------167E2781446B +Content-Type: image/gif; name="two.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="two.gif" + +R0lGODdhmgAwAPAAAP///wAAACwAAAAAmgAwAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3n+s73/g8MCoeBojFAPCqVQ4axCXgapNEiVEEVWg/Z7ZXr1Say0S+CDESe +w2XzNHx8e+Njeh0tZzfwy+rTnqfWQvYXtyRYJXfnN7eFh6WXByYIVxhpQkhlp9lI2bk2GfHo +F/q25omYkonY9an4Sgob6zDKSXm6uLKKWzrFO2v7u3cJ7MjKNjqy2zt76lp8mLqQLGV4nJos +sizbqtZtyjxBbYX0lxt+st0cLMuITUwLz8R43p6OXHnd+z2d3S99x5u6ZijU8Yu1SZ4mUfCg +/UN3752+fdEEHnLmzx4kRlCQyGX0cNFdoJGwOoWcBDDgvH4c/zV0gxEQTJiZZtpMVOfmTHw6 +bZ7sCTSo0KFEixo9ijSp0qVMmzp9CjWq1KlUq1qNUAAAOw== +--------------167E2781446B +Content-Type: image/gif; name="three.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="three.gif" + +R0lGODdhqAAzAPAAAP///wAAACwAAAAAqAAzAAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3n+s73/g8MCofEovGIrASWzMCwCY0CoEkHs3g1ZKfLw7aq+Aa7XrLWeUaD +w2ahOp1Qi9dw4pt7l7fp9TS6WbaHJzh4F0i4MBfohwAI2PgIqUgidkUV9UZW2UVVNxmHWNjJ +iOdplvUZsnm61cqqBwu5CPEZ+YWKO8ule7Iq+dvnGttX+lDbdstKbIkcCuLLewtcTJ1syHa9 +3HxtTe1dAq3Nbft6KGUc2s1rfonp/BHurT6f+c5wXJ+fiJhqEq9ebc8oYhPwTftGcN2Kf9t0 +AQRlD1uDh4oiScrWS2BDZoeahFlpFcFgNH4gSU1RwVCfn3Pu8ln8iJEiyYGYUtQstDJnMFg3 +D9FyB7Ejrpc+sWFc05KP0okalzoFxeap1F2ypkrtaTWr1q1cu3r9Cjas2LFky5o9izat2rVs +27p9Czeu3K4FAAA7 +--------------167E2781446B +Content-Type: image/gif; name="four.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="four.gif" + +R0lGODdhmgA5APAAAP///wAAACwAAAAAmgA5AAAC/oSPqcvtD6OctNqLs968+w+G4kiW5omm +6sq27gvH8kzX9o3n+s73/g8MCofEovGITAIDzGZg6IxGlYbm0ZrAKrVE7oFJBXiF42q4vAQj +nuKzuop1fsdTRd0ub3jZ+L02L2YFOOL3NCXFFwiXGGgIGPfWt8bY6BjJhQlJ+VHI9/j2Byqa +OKpXmnW6OEmqNhhSuBqrOts453kZuSqFyhjK+jtnAmsra0ZM61vMe8yMjAusMkxb25fqi8iQ +uVycCZ0iTT2tKfs8sbfN3K18Aq7u3OuKtnC+ntwsL9Je/r5uuzmfSxK3fdPY5XLHr1Kzal9M +/RvobRC+VwcJhkOkaZc/UXwTFUo8ZM9gnZF57oTaeGfRQ4wPUvp719EIxodhoFSsSSVgQJxd +4PHMqfGn0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWr1q1cu3r9CtZpAQA7 +--------------167E2781446B +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment +Content-Description: a message with a text/plain body + +Message-ID: <31C10333.167E@netscape.com> +Date: Thu, 13 Jun 1996 23:14:11 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: test message two (a message with a text/plain body) +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +This is the second attached message. + +--------------167E2781446B +Content-Type: message/rfc822 +Content-Disposition: attachment +Content-Description: a message which contains a message + (which contains a message, which has a text/plain body) + +Message-ID: <31C106F6.59E2@netscape.com> +Date: Thu, 13 Jun 1996 23:30:14 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: a message which contains a message + (which contains a message, which has a text/plain body) +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment +Content-Description: a message which contains a message + (which has a text/plain body) + +Message-ID: <31C106E3.15FB@netscape.com> +Date: Thu, 13 Jun 1996 23:29:55 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: a message which contains a message + (which has a text/plain body) +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment +Content-Description: a message with a text/plain body + +Message-ID: <31C106D2.794B@netscape.com> +Date: Thu, 13 Jun 1996 23:29:38 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b5 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: a message with a text/plain body +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Foo! + +--------------167E2781446B +Content-Type: text/html +Content-Disposition: attachment + +And this is some HTML + +--------------167E2781446B-- +From - Mon Jun 3 12:50:27 1996 +Return-Path: izzy@nugget.scr.atm.com +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id JAA03193 for ; Mon, 3 Jun 1996 09:48:13 -0700 +From: izzy@nugget.scr.atm.com +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id JAA25021 for ; Mon, 3 Jun 1996 09:47:05 -0700 +Received: from nugget.scr.atm.com ([206.100.186.2]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id JAA16682 for ; Mon, 3 Jun 1996 09:47:10 -0700 (PDT) +Received: from mailman.scr.atm.com (mailman.scr.atm.com [206.100.186.54]) by nugget.scr.atm.com (8.6.12/8.6.9) with ESMTP id JAA29136 for ; Mon, 3 Jun 1996 09:51:56 -0700 +To: jwz@netscape.com +Date: Mon, 3 Jun 1996 09:42:32 -0700 +MIME-Version: 1.0 +Message-ID: <19960603164232.izzy@scr.atm.com> +References: <199605261926.AA283048804@merle.acns.nwu.edu> + <19960527225319.izzy@scr.atm.com> + <19960528160415.izzy@scr.atm.com> + <19960530190556.izzy@scr.atm.com> +In-Reply-To: <31AEE9BD.59E2@netscape.com> +Subject: RE[4]: your generated HTML +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Emissary V2.00, by Attachmate Corp. +Content-Type: multipart/related; + boundary="=_03tW34g.bO1996u.N16d000A.r06Y.42:0047e7"; + type="text/html"; + start-info="X-twg-cidlinking-V1.2" +Content-Transfer-Encoding: 7bit +X-Mozilla-Status: 0011 +Content-Length: 6555 + + +--=_03tW34g.bO1996u.N16d000A.r06Y.42:0047e7 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable + + + RE[4]: your generated HTML + + + +
+>> >2: your fixed-width text is *larger* t= +han the default size for fixed-
+>> > width text, and since the default s= +ize of my window is 80 fixed-
+>> > width columns wide, I actually lose= + 2-3 columns off the end of each
+>> > of your lines.
+>> >
+>> This is really the receivers problem not t= +he senders.
+>
+>Total nonsense.
+>
+I do not appreciate your response here!
+If you continue with this type of response then I will not be +talking to you again.

+If you read the MIME spec (NOT THE HTML spec), then you will see that= +
+display (including line length) is the receiver's problem.
+I am talking about Email not the Web. Just because HTML is sent in a +
+mail message does not change the mail ground rules.

+If the sender choses to write lines longer than 80 columns then the <= +/TT>
+receiving client should be smart enought to display that text without +loosing anything.
+
+
+

+>By using a "standard" line length but a larger = +font, you're
+>guarenteeing that anyone with a "standard" size= +d window will lose,
+>unless they ignore your markup.= +
+>
+NO I am not. Only those people with less than capable clients will
+lose. I am tired of having to deal with broken or less featured= +
+receiving clients. You could tailor and restrict the HTML you genera= +te
+in Mail, but we will let the user have full control. If he gets in
+trouble then its his problem. The sending user will learn over time.= +

+>I'm not saying that the composer shouldn't be a= +ble to control this
+>stuff, I'm just saying that the HTML you sent i= +s ugly. Those are very
+>different statements.
+>
+I would think that ugly is a subjective point of view. You think it = +is
+ugly then fine. But that is just you and others may not think so. P= +lus
+its up to the sending user what format he choses. He could make it l= +ook
+just fine by your standards.

+>tags. The rest of it is gimickry for its own s= +ake, and it doesn't
+>come free.
+>
+I find it very hard to believe that you said this. There is a bunch<= +/TT>
+of stuff that can be done in HTML with images in MAIL that cannot be = +done
+in standard MIME. "It doesn't come free", what in the world are you<= +/TT>
+talking about.

+ >But hey, you're welcome to generate ugly HT= +ML in your product.
+>I'm sure your users will vote with their feet..= +.
+>
+Again this is totally uncalled for. I have tried to hold a conversat= +ion
+with you so that mail readers in general can handle HTML in mail. Si= +nce
+Netscape has the market share it has I believe that interoperation wi= +th
+you guys is important.

+>Nobody's telling web page authors that they can= +'t make their pages look
+>any way they like. But as yourself, when's the= + last time you saw a web
+>page that looked like your message? With fixed= +-width fonts? With some
+>fonts that were so small as to be unreadable? = +That looked really bad
+>if your window wasn't exactly the right size?
+>
+>--
+Now this is total nonsense. Who cares ? Its all about giving the se= +nding
+user all the control he can get. If he (me in this case) composes "u= +gly"
+HTML then it is his personal business. Just as long as the sending u= +ser
+has the tools he needs to construct what he wants.
+

+ +--=_03tW34g.bO1996u.N16d000A.r06Y.42:0047e7 +Content-Type: image/gif +Content-Transfer-Encoding: base64 +Content-ID: <0.19960603164233.izzy@scr.atm.com> +Content-Disposition: inline; filename="SIG.GIF" +Content-Description: The Sender's Signature + +R0lGODlhvgBDAIAAAAAAAP///yH5BAEAAAEALAAAAAC+AEMAQAL+jI+py+0Po5y02ouz3rz7D4YW +ABzleBqpyCIkycLw84azOjJrtLfLrephagngC6g4ooJBZON2lBFdpSmzWRQ2raaT0+cwrmozLhmq +hHy71OiaF8XCuQE6+F55U/FJrUfPF3jVBShoeIiYqLjI2Oj4CBlTGDYZiWj3I2KU11MJKfYx9Ya5 +gbbURzjIVueXQTfWytkqKgTa95qWpmZWtYbmBqwHfJsSZ4lzWOgZGotKeYyn3Cw5DW19jZ2tvc3d +7f0NHi5uaHy6fEzKvCh6uupNVD2UnspcHK+Kn21rUyZ8vuui3R4Kuvgg+bcLVqd58twRrOUmCz1W +xBhucUZRk6/+XgXbxLIjZZiEgl44BltY0qOOclksXnDpMCMhWBNZiZwzyFTLh1pO+ixp757GoDZV +rvwoEhDCUp46xhynYdLSqFOfQXU1TegfrSi4jptVlenVsWTLmj2LNq3atWzbun0LN67cuXTrng1b +xy5ZpyP5fsPL7czLYlD9ggCMNeVDieDgRUM8OODige/s3THc5jDNCV8gP6Y8VOYTz3klc4bYbR81 +0T9Iq4bTmuelHV5x5stsA/TIlR5Rk85n5bec20U1mhjCmyTtp1viOdW5WrdNpC/dVXISzFlwhdJb +4hoeGiNL76VPN8e8Z9j4iIxZjxp/HgypOCClYWcPk5fM7OWG+t2s2NMZv8HEWnHgFcVLdn1tR9xB +PyHFXnxXEChJexeBR0uEsK2iGnqtPTgTg9vV1gGDOcE3HUqYpOOgh4NVgyKFmvRGom3zCEdDU/7o +hdFos1XIY4GxJVOjVXZJVWRX8iXZWDM45shkQnEp9WSOQS55VCNRXjkailx+CWaYYo5JZplyFQAA +Ow== + +--=_03tW34g.bO1996u.N16d000A.r06Y.42:0047e7-- + +From - Mon Aug 18 21:13:21 1997 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Messaging Server 3.0) with SMTP id AAA8166 + for ; Mon, 18 Aug 1997 21:13:55 -0700 +Received: from ywing.netscape.com (ywing.netscape.com [207.200.73.68]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id VAA02497 for ; Mon, 18 Aug 1997 21:12:23 -0700 +Received: from cantor ([199.104.214.79]) + by ywing.netscape.com (8.8.5/8.8.5) with ESMTP id VAA24863 + for ; Mon, 18 Aug 1997 21:10:35 -0700 (PDT) +Received: from cantor (localhost [127.0.0.1]) by cantor (8.7.4/8.7.3) with SMTP id VAA01935 for ; Mon, 18 Aug 1997 21:07:23 -0700 +Sender: chrlsim@futureone.com +Message-ID: <33F91BEB.10E2A9D5@futureone.com> +Date: Mon, 18 Aug 1997 21:07:07 -0700 +From: Chuck Simmons +Organization: Organized? You jest! +X-Mailer: Mozilla 3.01 (X11; U; Linux 2.0.0 i486) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: 3.01 MIME prob message [Fwd: communicator 4.01 a conference problem] +Content-Type: multipart/mixed; boundary="------------746A59DD382995F41B0947E" +X-Mozilla-Status: 0001 +Content-Length: 747282 + +This is a multi-part message in MIME format. + +--------------746A59DD382995F41B0947E +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +My problem message. + +Chuck + +--------------746A59DD382995F41B0947E +Content-Type: message/rfc822 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + +Received: from gezer1.gezernet.co.il (gezer1.gezernet.co.il [192.116.212.2]) by future.futureone.com (8.8.2/8.8.0) with ESMTP id OAA19067 for ; Mon, 18 Aug 1997 14:50:46 -0700 (MST) +Received: from default (gezer68.gezernet.co.il [192.116.212.65]) + by gezer1.gezernet.co.il (Gezernet/8.8.5) with ESMTP id AAA16299 + for ; Tue, 19 Aug 1997 00:35:52 +0300 +Message-ID: <33F8C032.C5DC0CA2@gezernet.co.il> +Date: Tue, 19 Aug 1997 00:35:46 +0300 +From: NIRI ELLERT +Reply-To: nirie3@gezernet.co.il +Organization: GEZERNET +X-Mailer: Mozilla 4.01 [en] (Win95; I) +MIME-Version: 1.0 +To: chrlsim@futureone.com +Subject: communicator 4.01 a conference problem +X-Priority: 3 (Normal) +Content-Type: multipart/alternative; boundary="------------D866708591E89309695535AC" + + +--------------D866708591E89309695535AC +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Hello + +My name is Barry and I live in Israel . +I am a system programmer of M.f. IBM at a governmental company/ +I have privately interest in Internet. +I have recently downloaded the communicator and I like it. +I have a problem thougth with the Conference I start to recieve a call +when there is a Buzz +and a message appears that a person wishes to talk to me I hit accept +but nothing happens and i can not hear the other side. +I check the mic and it works and while talking i can see the bar fills +in with green amber and red . +I hope you can advice me what to do to make it work + +best wishes + Barry [Image] + +--------------D866708591E89309695535AC +Content-Type: multipart/related; boundary="------------A9E4A76F8F8B49A8F9408311" + + +--------------A9E4A76F8F8B49A8F9408311 +Content-Type: text/html; charset=us-ascii +Content-Transfer-Encoding: 7bit + + +Hello + +

My name is Barry and I live in Israel . +
I am a system programmer of M.f. IBM at a governmental company/ +
I have privately interest in Internet. +
I have recently downloaded the communicator and I like it. +
I have a problem thougth with the Conference I start to recieve a call +when there is a Buzz +
and a message appears that a person  wishes to talk to me I hit +accept but nothing happens and i can not hear the other side. +
I check the mic and it works and while talking i  can see the +bar fills in with green amber and red . +
I hope you can advice me what to do to make it work + +

best wishes +
                   +Barry  + +--------------A9E4A76F8F8B49A8F9408311 +Content-Type: image/tiff +Content-ID: +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="C:¥win95¥TEMP¥nsmailRJ.tiff" + +SUkqAAgAAAAPAP4ABAABAAAAAAAAAAABBAABAAAAnQEAAAEBBAABAAAAvAEAAAIBAwADAAAA +wgAAAAMBAwABAAAAAQAAAAYBAwABAAAAAgAAABEBBAABAAAAyAAAABUBAwABAAAAAwAAABYB +BAABAAAAvAEAABcBBAABAAAA5GQIABoBBQABAAAArGUIABsBBQABAAAAtGUIABwBAwABAAAA +AQAAACgBAwABAAAAAgAAAD0BAwABAAAAAQAAAAAAAAAIAAgACAD///////////////////// +////////////////////////////////////7e7Azun1r931jOT1zuX9s+X9xfH3fe7qr939 +pPLrXurqV+f9p+f70PD2nPL2uun/bvD2jeT1oN38guD2n+bqO9vqcuz3WODrg+b4hej/3uD8 +s0rjksnYWtehb9eorMPwY7bEVKZVgsH5PcXpdIKOcKNff6uIXcy2o8mXmZfiw5t3h9HYkK6Y +lKh1sMejQ7GqtJTm17Z9nGbFVoq9W3Z7ToiKYsmebXnGTYmeQ8y+g5O+aoJyP4tKgH/e3Xej +b6tqcZmFrTphoJfBlNBluJOiT4lkUZDfU6SxL3SsTn5nZbqgeZuFeHaXYXZxkoN/eYHJhIGX +bLB5TYiFuM1zw5ukpHWy1LJMn2+6HH5UmFS3csGDTJh7ba6cLnecXHGopsa3dn2dKpF4P22V +oYE0WYF2madanct7xYGoP5yxubRfeGKyX3JYppJxYFFWgbmDec2nMmW4IWSYSpWnnpmdVo58 +XFeHRU2R35xyTnqZK51hamiH7ISps4ChTZ2zbJWtE4ScX3ibOXqhXV9vrqCGP4ibL3NkmXnT +qnx8b6WSoIdqWY/YyXaDM1yI3K6WcGyqiYykKqCusZ29aHLCzbupgKJkT5VXenZ4bHFvKIXA +8dKCOMCEl8WIK7eZxbl7Q4xyi7ttVLebmGWLfY6BbWYyQ5egx4WaT3C3sYqihJ6V4bG3QWKp +zIZunHC8YzycJ5pUjKmPRMqipFOG4bhGjIuCiYpBdl6av5U8e51/uaGOqIJ3znZyqqCGaFjD +xHLKt8mCg2Y8lbiuvGTHnI+sVuS5q7hguRyj2IhhsnFez1qFrn22QrzNepe/ZLnSi3trTW5e +kMGBbauVrVC+Xcx+S9GTPI9LKhmiTbyEvc/bnsDDz2ZzqoWzEG9nw5ZVJOc5WU7at5530UAy +xS2lmBWEzuyGm2HYp1KB7GM740Jm6k7me2Jnt5JYRZDH83HUY9G27FBzLaui6LhGnbiAnp1u +UHzQ57eBgtn40KwOQQ+SFSfUwl8O87v8bsPiWh7Pf3/MPpnrOK/9PpcWbFntl9mpspoMbKkc +duNTn8a6rfHGgNW4lODfR9PZw01gOmp1W8TryX4bwcFVzOIborjSOXvlJcKGWo/hvNlVTpzC +J6opr+XWXpfpva2ZpE/KrLSiX2+s2saxTWbqyZi8W6Bogox+aHOyyL3NhY1x0qm7y3dsl3XV +gYAOzV3ErUfe5h98jmcblW5mqSLK0LmFeGNZzqPBtIqtizBDnHjygGy3cyx0dsq9le2ldWQp +ql/qpmyIMs5UgYfxmLj93MJlZuTYhdf5yF6QbLblzJiYXnbMnrfJqrqNXK+vlEOd0J/rcYVU +urzKiaC87nGval6YlYOHhKXKXqiqglevlWPUhZPRUnKCc6bHSqx8PFdpOpGfqJvXzmLjkW9O +x4aGlV/dnKOjbKrcicq5ZKt3TrJZWlF9X4jUeUN/wFgUTXGyZsLZVpDJ34i6UJGYj6h/q7XI +K1hOf0NsM6tzMKJWMX+Pa719DYrdZk/QzL6wbml/X5ytiHyTfXKzbqietq3WUrakg9R6oYn1 +QOyywZH5WMbvhOu7SOvzxa36gPbdrO39bv63e/Tetur/cf7d29rh2eDo2+Hi2OLv2+n12/D5 +2+7t2uXz2+z22+nm2+Ps2+Lq2+fq2+Ly2u7t2urw2e3+2/Pz2+7y2+fu2+ft2ubl2+Lv1+vs +0ebr2+Tt2eTd19VmVFNDSkBHQUFESD9IRz5ASj9HREBDRj1DRj5CSj1CSz5ARzxDSzxDRz5H +Pz9ARz9IQjpCRThESj07RzpERz47SjVCRDw7SzpIQz4/RjpBRz1BQjhDRDtFSTVCSEBFRTlF +SjpCRjRERztERjtCTz9BRTtCRD1DQzpJRT8/Rjw+RjxBSDZDRTg+RzlBSDk8RTpGRT1BQThD +SD4/RzpDSTtCRTdDQjw/Qjw+RDY/RDhERDhAQzdDRztBRDpCRjpARDhFQz49RDZFQzs7QjhE +RD48RjZGRTs8RDdHRjw1RTZHQTs/RD1FQjs9RTg9QzxBRTk/QTY/RTo+RTw/QzY8QDhDQjY7 +Rjw8QTtCQUA+SDk+Qj44RTE+Rz9ASDtCQ0E9Qzc7R0E9Rzk9Rzo9Rjo4RDo/Pzg5Qjg/QD0+ +Rzw9RDw7PjpBQjs+Qzw7RTxBRUI+RjtCRzw6QzQ+RD08QjxEREA6QD49RzxBRDtARTw9QkA7 +Qjc/Qj48QjxAQz9BQjpDRj09SD5ESUE7Qz47Qjw8RTk6QDo8Pz88QTQ6SD48QDc4QTo6RTs+ +Qj5ARjs5QDU+Pz03QzU6Qj04QjQ+Qzw6SDY+Pz02Rjk8PTw1RTZCQz07STs9Qz46RDc9RDpA +RDs4Qz08RTw+RTw/Rj45RDs1RTQ9QTw1QzhBRUM8RThBQj87RjxAQT84RDQ+REA7Pzg9Q0E7 +Rzc9REA+REA/QjQ4Pzg+Pz46Rjw+RT48RT5BRTw+Rjo/QT0/RkJDRkE6SjdEQ0E3RDc/PTs1 +PTQ9Qzg0PDU5QTszQjxJUUVOT0hSV0ZUUUtVVkJUWEZSWERSVUdWVUhVVUdUWE1UWENVUkZT +WkZcXFZVU0dZVk5bVUFWWE9bWUNZWUxhV0xaW0laW0dSW0lbYU1YXEdaXE1aYkJZYU1fW0xZ +YEtaW0tgWktjYkZWXEVnYE1aXUxbYklYXkxfZEtaYUhfXURPTDtYSzdJS0NielCBdmJ6e1t7 +el91eVt2dGF9elx+eF17c11/eGV7eVp9emF7fl58elqAe2F2dlx3fmB2eFh2el17cV55dl52 +cl5wdFuBeWBwdld0dVpxdVd1eFtxdVZ1c1xxdVd0cVt0dVR9dFxzd1pxc11zclpwcFhxdFdx +cVdxcFN3bVlxb1RwalZscFR3bltta1JvalVoa1Bxa1Vma0x0b1ZqbE5salZqaU1ia05laE9l +Z0xiaU9kZ09dWEpARkQ9RDw6Sj4+Rzo/SDs3RTtBSUE6QjtDRjw5QjtEQD84STpEREE4RDo9 +SEA9RTsyRjk4Qj5ARzdCQkA9SD0/RD07Qjs7SDg3Qjo/QTg7Rjo3SDg9SEE6QDg7R0M4Qjg5 +R0A6RTk6QUE4QDo6RTs+RTg1RTo3RT0zRTZAQEE4RTo/RT06QjxARz09RT4+Qjw+SDw8SD1A +RD9BRz5NU0bk2aH62eqPaOH71fL73PL64fP14u/14ur04+7p4uf24ufu4+fx4er14u/14fDs +4+fw4ujw4uv13+zr4uni4uDc49ri49zi4ePh4dvk4uD8///7//ny8+/g897h7Nzj8931/PP1 +++bz/e3u/eX1//js9/D+/vz9//Pm9+Hw9+fl8eX99vzx8ubm7ef19PH9/v379fHx+vL9/vT2 +9/H++Orb39VhT09GRkFIRTxDPzxAQztIQj09RzpKR0FDRTpEPT47RDhIOj1FQThBPTs/OztE +Pj5FPz5BQj5IPjw/Oz1DPz9EPzpCPz5HQTY8PjZEOTs/QTdJPjtCQzRKPz88PzVJQD1BRDpD +Qjs6PzU/PjdDQDdCPzZBOjhBPTc9PTc+QjpCQTk4PDhEPzo9QDw8Pzk/PTk8PThAPDo5PTFA +PTk7PzFEPTc8PzZBPzs2NjRAPjU7QDY+PDg+PjQ+PD07PDk9OzhBPTw9PTg7PDdCPjs/PTdC +Pjs5OTY3QDo5ODZEOjsyQDZDPzo2PDRCOzk3PTZHPTk0QTVCPjg2OzlDODpAODo+PDg8Pzc3 +OzQ5PTk/Pjk8PTQ4Ozk/OzQ+Pzs8PDY9Pjs9QjRBOUA4OS4+Oz85PjE5QTs6OTQ7PTw8PDo9 +OjdBPzs9Pzo9Oj45PTY8ODk6PDk+PDg5Ozg7PDg4PTk+PTs9QTo7Ojg8QDs5QTdAPEA6PDpB +Pjg8PD1CQT8/PDs7Pjg+QTs6RDZAPTk6PDo+ODszPDU+OD41Pjc7PDY1PjlAPDg1Pzk5Pzk1 +Oz02OzU4PT03PjU7Ozo7PDc5PDk6QTc3PTU8PT81PDU8QD83PjVAPkU4QTQ9PTw3QDg7Oj03 +Pjg6Qz05PTo7PTs5PDg7PDk7ODg3QTs8Oj05PTo6Pz5BPzw4QD0/QEM3PTg+QD42QTc+PTs0 +PjdAPUQ0QjY8PDo2RDM7PUA3QjY+QUA4OjU+RD45Qz46Qjs7Qjw0Pz4vPzc7PjkzPDk3PTct +RDU8PDszPDdBRD1HUUJTTkdJTT1RS0VTUUlTTUtQUUZdT0ZRUkVNWEdZTUZTUUVUVE1UUkZU +VE5XVkZZU01cU0ZXU0laT0hXU0hdVU1ZVUBZVkhXVklYWFBbWUVdWU1XWEhaV09gUEdXV05b +WUhZVEVlYEdXVkRVXVBcWkVaWE1iWUVcVkdaWkZVTUlZRTtMRTpPSDtmclGFfF6Bd2B+emN5 +fGV5elx9eGJ4d2OBe2N4cFp/cFp9eV59c2B2e1l8dlp8dFx8dFt4dFl1dWB2dF91dFhzcVx6 +dWB2cVxzclRzcVZ6cGBvb1d2cFtxb1lycVh0b1Zzb1Vtb1Ryc1hvalJ3cFdtcldvbFhscVRv +a1htaU1zbFJsbFRsZ1R1bFJsaVJqalVtZ1Rkak1rZFRsZVFtZlNkaU5pZ1NhZkxqZ05ha0tm +Yk9lYUdcVUs7Pjk8PDk3PjM6Pjg7Pj04QDg9PTo4Pjg7PT43OjY8Pjc9OTk2Pzc+PDsxPzY+ +PTowPDk/PjsyPDdCPjs1OjdAPjw0PTs8QTUzPjk3Pjk9Pzs6PTk6PT04PD0+Pzk3PjQ8ODg4 +PDk4OzY5Pzo6ODI+PUAxPTNAPj80PTM5QD49PThBP0A+PT07PT5AQDk2PzhAPjo1RDdBREA6 +QzxFUETY8Zv6//T///////////76//X+//3+//n+//f+//n///X8//n8//X9//n+//j+//70 +/O/5/fL1//Lx/fDm+uTl+Onf89jp8+Ti8d7r7+Ln/+ny/vfy9/L+/fv9/f37+/Hz//n8//Ty ++/Tz/O76//L1/+7t++z8//f9//7////z//vv//L3/fX5/+/6//n5//X59Pn7//D9//r//fXm +5OPl5NhiT01ERD5HQUBEQT9IRDxCREBCRkFBRj9DRD1CRTxHRDwyPjpERD03SDhEPjw8PThC +PT9AQzhFQT09RTpCQz89QDxHRDtFSD85QjxBQDk8QDw+Oz5APTpGRDxBQkI/QD1DPz46RjVH +QDw7PjZHQzo+PzpGQT0+RDlHPj5CQjo9Pj1AQjhAPDo8PTlDPjhBPjc+Pjk7Ojg9PTc7Pjk/ +QDw5QDZFPjo2QTc7Ojs6QDZEQT4zPTVCPzo1PTlDQjo2OjhDQzs/Pzg+PTg/Pjw9QjZAQzw9 +QTtBOzk5PzxBOzc+Qzo8QTQ7PTw3PjE8PDw2OTRCQT43QDE/PUA9PTs5Pj47PDQ4QTo8Pjk5 +OzlEPj87Pzc8QDc2OzM7PDg1Pzg5Pz47QTg6PDo2Pjo6OTc9Oz85PzY7Ojs3OTVCQDc8PkE7 +Ozg4Ojk3Pjk9Ozk2PzE8Pzw5QTs+PT0zPTU9Oz47PkFGPjw2PTc+Pjo2QTw+Pjo5RDs5QjxB +SUBBQEE9PT89PjY6QDw+PDs3Pjk6Pzk0Qjg5QDk2Ozc6QTk3PDk4Ozk0OjI7PTk3OjQ9PDwx +PTY4Ozg2Pjg4PjU3OTQ4PTU4Ozg6OD05Ozg5PDo3Qjk7Pj01QDM6Pjw2PTg6Pz0xPzU7PUEx +PTI6PkI2PTg8Pj41QDE2QEE2PjU3REA6Pjg4QDk4P0E1PDc2QDs6Qjs0PTc5QD00Qzk3Pj47 +QDc/Pz0yQThBQkA3QzU8PD4wQzdBPj04PTw5Qjw2PTs3Pjw8P0I3Ozk2O0A1PDQ1NjgtQTg4 +OzgxQTU6RDhPTUVMTkJPS0pPVD5UVUpPU0JVUkhSTENUVE5XUEVWWE1WWUdTV0ZbVExPU0tZ +VUxYVUFWVU5VWkdZWExYWkNSVEtVWUVXVEtfWUpPVExfWklaWU9gW0hVV1NhVktWWlFhXEpX +WlJaUE1kWEpeWEZiXE1aV0heW05bV0VaW0tbVkZOQkBTSTtJSUFsdFJ9dmF7dVx/dmN6dWJ8 +d1t1d2F7dl17d114dmF1cl15eFtxdV15dVx1dVp6cmBydFx2c19wdFp7dGN0cFd5dF5xb1l3 +dVpycFd2cFp5cFtxdFl0cVZzc1lwc1xublZ1c1p3cV1tbld1bltycVB1cFtublVua1hmb1Jv +aFpqaVBxaFltbFBua1lsaVZrak5oak9rZ1JtalBoa1VjZlNoaU9hZk1pZU9jY0tmZ1FhaE1q +ZFJTUkZEQT00Pzs/PzkzPTk/PT41Pzs6Pzg1ODg0OTc8PTozOzg5Ozs3PTc2PTk2RTk+QTg3 +Pj84PDg4Pjs6PTY4Pz82PzUzPz04Pzg1PD84ODc1Pj8zQTgzPzg5Pzs1PDo1PT0yPTQ9Pzk1 +QDc7Oj00Pjg3Pj44RTw2QDw4QDtDPUE7QT07QD44QD86SD09PD43Qz86QDw7RDxCS0A+QEJD +U0bu9qz4//L9//j9//n///z////////9//z9//f5//X2/e35//L6//Lz/vX5//D1//T6//P5 +/Pnq+eT8//nx7fXk9uHj89vm9uvm9eTd5try9uPg9dz4/vny/+/5//L5//P18+bm9ODx/Pr7 +9+3o9+Hz/uv09ujo8eXz/u79//f0/u30/vD5//ry9Oz9/vLt8ejx6uf3/fX+/+7u++r9//3y +5+FlUkVESz9CRj9BQzxBSDk/RUFDQjhHRDs8RTxEQj9CRzVEPzg/QDk9QztCQTpCQDdERDs/ +QjZBQjs9QDc/RzpERDRDRDtFPzlBPDxEPz07QzhJRT9BRjhKQz08QjpGRz06QDdFQTtBRDhC +QTdAQTZGRDtAQTk/Qzk+QTlERj9LQTk9QzlDRDdBSDU8PjZBQDlBQTdEQDo3QTRGQTw8QzVI +Qzw8QTZHOjk8QDdEQjw7QjVFQzo2Pjg8PzU8QDg4QDU+Ojs9Pzg8QjVDPTg7PTY6Ozk4PTQ/ +QDk4QjNAPjk3QTZFQD44Qjc/Pzo8QDVCPzk7PjU/QDg8Pzg+QTo7QDk/QTc9PDk4QDg/Pzs8 +QDs9PDg3QDg/PzQ/Ojk9OTg8PD1EOjM8QDw8PDI8PT05OjE7QD05QTM5QTw6Ozc6QDhANzc8 +QThDPzw1RjVDPkc4Pzc+OT47Qj49PTc7Pz49QDw/PEA5QTQ/Pjo6QzpCQTo/RDtBQDk8QTg7 +QTY3PTw6PDc6PDk3QDg6Ozg3RjQ7Pzo0QTQ4PjcyOzA4PjM4PTQ4PTQ3PDs5Pi82PDw4PzQ4 +QDg4Ozc2PDg6Pzk0QDQ9Ojk3PTc6Ozo0PTc5PDs0QDc7QDo4PDg8Pj81PzQ4Pjw3QDc7QDU1 +RTo5Qjg4QTk8QTxAQDg1QTs/RTo7RDs5Qzg/Qj03QzU9Rj47RDs8PT84Pzc/Pz04QztEQT86 +Qjc/Qj08QjU+Qjw3QjQ7QD04PTc5Pzk3Qjg+Qjs2PTo5QzszQDQ4PDUzODE2PS8xPjk5QjY0 +QDc9QzlET0BRUU1MTj9UVkxMVEZVUUhTUUNbU0ZXUkdTWUVWVExXWENZW0tfVEZXVkZYV0FV +WUddWUdTV0tZVUxXWUJhWU9VWEZdU1hXWEFYWlBTWUlXWU1bW0RbV09eXEpeW0FhYFBcV0Vh +WEhZXEVaXEpZW0RZWU1dW0ZaVkpfYktaU0NQUDpRSD1RSzplcE9/eFx8fV9+eVx9el9/dF15 +el91fV1/cmR5fWGBc2F1dVh+dl99dViAdlp1e1d4dV55dVt3c110dFt8eVx9d1l6dFt5dV91 +clVtdld1clV0cFpyclptdVZybld0b1N4cFlwcFdzbl1vblZyclpscldua1hpaVJrcFhubVl2 +bFRqbVJsaVVsb1ppZ1NncFJrZVBka05qZU9jaU1raFFkZk5rZ1RkZ1FraFNiZlBhZlJhZktd +U0k6QjQ6QTk2PjRAQD86QkE4PjdAPTk4Pz06Pzo+Pzg2PTg8QTg0PTQ6Pjo3PTY+Pjk1PjRD +QjozQDY8RDkvQzg8PTYyPzQ8QTg1Qjg1Pzo2QTk6QjQ2Pjc1Pjg6Pzg3Pjg4PTg4QTs4Ozk3 +RTo1QjU3Qjs5PjM/Oz43PzA6QD49QDQ8SEA7RDg4RUA9Qjc7Qj1AREA3RzpERUA+QEFLU0Xn ++6X+///+//vz//L9//T///z////////////8///1/ej6//T////////6/Prt+Ovy/ubs+Ofx +/un1/+/o9eXn+uXl+tzu+ejc89fk893///X8/O7z/e3l7+Pl7t/o+ejw/+3+//r1/+/0//Hw +/uz9//3////////1+/H7/fT+//74/+/k/974//n/7vH6/Pf/9/ns/+Lo8uX39eze7djo7dRb +TkVMRUFFRThBP0Q/RDhJP0I8QztCPz05RDVGQT5APjlAQjhBPzk2RTdCQzpJQTxAPzxCPzZC +PzhAQDw/QDk8Qjk7QTZDPj8/QTVHPjs5QzRJQT09OzNNRz1IQTZIPj0+QTc/QjdAPTY+PzFA +QTo+Pj5HPztEPDlAPTVFQTw7PzhAQTM9QDJJQD08QDREQjs6PTdJQDw2PzdEPDg7QDdEPzlI +QDs9PTg7PTc6PzVAPDg6PjZCOzo9PTY7PDU7Ozc+QTY/Ozg9Pjg9PD44Ojc/PD4+PzM6PT85 +PS05QD4+QDQ7PTY+Ozc8Qjc+PDtAQjU9Pjs5PzQ/PDk2OzU5PDU0PDM7PDc6Ozw8OTlBQzs2 +PTU7Ozc6PTdCQTk6PzdCPTU7Ozo2OzVBOjpBOjtBPzw1PTE/Ojs2RThBPTg4OjpAODQ7Ozk/ +QDY3Pzs7PTg5QDZBPTk8QD09QDQ+Pzo/PDU7PDg+QTY+QDo/PjxAQTk/PT03PzQ/Ozk4QDE9 +Ozg4PjFAOT04Pjg8PjgyPjY7Pjg4OzxCPzs3PjY8OTw6PDY5Ojk8OzY5OzY4ODU6PTo3OTQ1 +OzY5QDU9OjsyQC84Ojo4Pjc+OjwzPTM8Pz41PjU6Oz02PTY6QD44QTs3OTM4Pzw4Ojg1PTo3 +Ozg6PDk8Pzo8Qz09Pzs5QDlAPzo4Qjs+PkQ2PjM8P0I4PzpCPzw3QDVAPjs5QD1AQj09Pzw4 +Pjg4QTk6Qzk7PTw4RDc5Ozk6QDo4Ozc9Pzk2QTc3PTk2PTI9PTswPTU3PzsxNjE5Pzo2PDc8 +RDlLSj5LTEZTTkZPUEVTSUVOTDxVUERRT0FZVUhYWEdVT0tYUEVQVUNYVUpSWEtfWkhXU0Zc +WEhTVExfWEpXVUVaVU5aWEZZXEhZVkVWXkphWFJWUUVcVU1ZWUxeWklYWUVeX0xcWkFiXEpa +WUdZWE1ZVUheV05bX0daW0VfW0laSkJNRTpVSjpLSDl7dlp2el2Cflp7fFx8eFt1dF5+dGB5 +eFh8d152eFh/dmB7d2F/c2F2dFqBeFh+eFd2d194cVl2d1x1c1t8c1h1dl18c2BzeFt0dVl2 +clN1cllza1R6blxrcFN6c15vcVZ1bGBvcFZ3bVlyblJqb1V3b1RqblV0bVdtbVNvbFJrak9v +blJvaVFsaVJxa1VsalBxZlNpaVBoalZlaE9rZk5haFBtZlJfY05sZExkZFFtaU5kY05ZTUM9 +Qjw5PTs7PTk7PjU4OTc0QDg6Qzc6Pjo0Pjc4PDs4Ojc7Oz88PjQ4PEA0PjUzPUA2PDQ2PDc7 +OzU6Pzc/PjszOzY7PDY3QTY3NjczPDU2OTo7PTc5Ojo5Pjo6QTw4PTw2QDY5Pjg9PDg6RD06 +Pzo7QTs9QD41QzJAQT44PDU/QTw0PDQ7Qzs4Pjg9QUQ2RzY8RD41RDo/RDo7SEFIVUTo9Kf+ +//b///////////////3////////////6//v9//X////9//f3//H3/PD5/fT8//vz9u7x/+r4 ++/Do9+Xp+ubW7M7j7dve79nb6tzt++zl8+Pw+/P2/vj0+fPy9ers+u7v+uXi89/r9uft9+fs +9+Xx/uj1//j5//Tw/ezq/fD1/+/z9e/4//D6//P5//H39/L+//b+//v9//f1+/Hn2dJkT0hM +RUY9Oz1JRz8+RDdFRkA/RjZFPkFDRTtEQERIQjVEQzw9QTREQjxCQD5EQDs/PjY/QDtCQj5C +QTc/PjhEPTdBQDc/Pjg+PDpFQDo4QTVHO0E8PTdJPj46RDpKPzw6RDlJQzk7Ozc+PzQ5PTc6 +PzVBPz5AQThCPjg7PjhDQTo+QDg9PzM/Qjc+QDZBPDpCOjU+PjxDQTRAPj0+PjU+PDw7PDc9 +QTU9PDU4Pzg8QDQ6PDE+ODk5Pjc9OzoyPjE+Pjs7PDU7PTk7PDc4Pjk9OjE5PDI3PjU2QjU7 +QDc5QDRAODk0Ojo5OzU6OjU4OzQ6PTw2PjU7PTs3PTY8OTg1Pzg7ODo3QDc3OTU9PTY8Nzc6 +QDM6PTU3PTVAOTQ4PDk8NzY4OzU7PTI8QDo5Pjc4ODU6OTQ0Pzc8ODo0QzRAQDw6PzQ+PTw6 +PzZDPjw4OTtBOjw0PzQ+Pjg+PzlEPT89PDs8PTk8Pj1BPzw7Pzw3OzY6PDE6ODo6Pjc4Ozo6 +OzE5PTs6PDM7Pjc3PTQ6PkA2PTA4Ozw3QDI4Oz00OzE1PTY4OzQ0PDU6OzU5PDc7PTYyPTU2 +OTgyPTU5OzI6QDc1PjE5OzUvPjc4QDo1PTg9PTwyPTU5PzoxPTY1QDU3OTkzPjQ4OzoyQDc7 +PTg0Qjc3PEA8PTs8OT07QDo6QDk6QTw4Qjg7QUI4Pzg9P0E6PDQ8Pz81Pzc3PT1AOzk6PDk1 +Pjg2Qjs7Qzc2PzQ7Pj0zQTQ5Ojk2PTc8Ozw6Pjg8OTw1PTMwOTU0OjUyPT0+PTouOzc6PzdI +T0NPTkFMTD1SUj5UUUVMTUNRTEVQUkJVU0VWUzxaVEZSVUJZVUpSWEVYVExRUz9aVU1TVT1Z +WEhWWUdhV0xZVE9VU0BXVUhZVkdXU0JXV0RZVkNbWEVWW0VfWkpVWklaWEdYW0ZjU1BXVEFg +VVBWWEleVkxYV0ZbWEpZYEdZTUFKQDlPRDtJSztsc1x2e118cl58eF6BeWB6clp+eF54clx9 +d2N1dFh7eml1dlp9c197eVd2cWN3eVp9dF91c1x7c112dlp6dFhzb1h5clt5c1Zzclh3cFt0 +cllyb1x1a1dxcVZ5bFltcFR2cFZublN1b1pxb190blZucFhwbVVya1dwbVJubVlxaVFya1Rq +aU1vaE9rZlNmZ1Zna1VkaVFnZk5nZU5sZ1RhZ05oaFBhYU9hZFBoaUxjZlJjZlFWT0g8Pz0z +PTk6Qjw0Pjk1Ozo2QDA8PTc1PDA8OzYxOjU6PjkyPDM3PTw7QTw5OzozPjg4PT43PTczQDox +OTQ5PDw5OzQ6PTs2OTY8NTgsOjY8OTsxPDc8PDcuPDc9PTYzOzo9Qjc7PzU/QTo4PDo8Oz07 +Pzw6QDs3Pzw8RDg7Pz06RTw4PzpAQD48RTU/REk8RDlBPD44STxDQ0Q6Rj1NU0nn+Kb9//H/ +//v5//f2/+79///////1/u/1/+/7//3+//D+//z6//f///z////8//z9/+76//b2//Lx+e7y +/Ov0+ffg89bm8+Lg8dbb5Nbv9ez59/Dc7tXp+u3t/vD+/vz19/P3+fX///7///////3x/e3+ +/fvz9ufz/u38//vv+ejz+/H8//j2+enq+ejr9Onn8eH49+3y/+zy9e/v9+Xm59phTlBJR0JE +QT8/RTxERjtDRjlDQztERjdCQzxERTJCPztFQzdEQjpKQzs/QjhJQkE3PDpEQzo6QzhEPTY2 +PzVIQzg/QTZCQzZCPTg7OzZDPTlCPzREPjlHQjpDQjxEQTxCRDc+OzM/PjU9PzhCQDpDQjk8 +PTJBPzc8QjU+Pjo/QTZBPjZCQTc8QThBPjg9PzhEPj46PjZBPjY/QTRGPjo8PTZCPTk3PTU8 +PTc6PzY7PTU9PjY+Ojg+PDk5PTZDOTc4OzU3OzY8OzQ3OzU4Ozg6OjY9QDc1PTI8OTs0PjU6 +PDk1Oy88OTUxOzU6OTg1OjQ6OjU5PTQ8PjM1Ozc3PjQ8QTU6Ozc7PTE6PDhBQTU7Ojc1Ozc5 +Njk4PDM8PDU2OjA+PTs1PDRBPDg7PTc/PzozPzk8OzgzOzRCPDU8PTQ1PTU6PTc7QTo9PDU6 +PTY+Pjk8PDg7PzQ/Qjs6PTRAQz01PjFAPDo5PjI/PT00OjA7Ozs6PDA+QDo8QTk3PTA8QDc1 +PTo5PTcyPjc5PDU3PDU3QDU3PTc2PTE5OzU3PTJAPjk5PTVAPD03PDM/QDg2NzM7Pzk2RTc2 +OzE2Pjo3PjU4Oz04OTQ8PTs2PDo8QTk2QTM3PDc2QTQ6QDcyPTg3PzU9Pjg8PTU2Qjo1OjI2 +Ojc3PjU3Pjk6PzY6Pjk5QTc1QDk2Ozw4QDY7QTc1QjQ7Pjw4Qzc0QDk3OjA3PT0yPzI3PTg2 +QDQ1Pz0+Ozc4PTg5PzY1Qjs5OjQ2PDY4PDM7PDg1PzQ4PDc0Oy42PTw2PDQzOjM1QjZJTEVO +ST5OUUpLUUBST0NMTkBQU0dSVD1VVkdQUEhXVUFXVENWU0ZXUEJeVUdSVkZTV0xaW0peV0tW +WkhaVEpZWUlbWEtWV0VfVUhPVEdgWExVVUdbV01bWkxNUEtdXElbWEVaWkZaXkJYU0lbXUVV +XkdaWURZXklhW0tcXENgSEJDRzdaST5DRDZvcF18e1d8dlx3e1t9elyAcll6elp7clx5fFt6 +dF55elZ4dl12elx6dV98dl52dFt7cll6eFZ9eFZzeFh8cFprd1h/c1tzcFd1dFhwcVd0clJ3 +cVh1blV6c1tyclh4blZwblh0bldycVNycFZvb1ZqbVRralVublNvbFR0bU5vblRwalJqbFNq +Z0xvaFVpalBlalJsbFJkaU1nZlFmZkttalFpZEtoY1FlYk5qYk9fZUtiZU9OS0M8Pjg1PjY9 +Pjk8QDc8QTU4OzYwPjc0PDU5OjozPTI2OjczQDY8ODw0PTU4PjoxPzQ5OjYxPzI8PTc0Pjc9 +Ozo5OzY7PjY1PDM5Pjg5QDgzQDM1PzY5PTc7Pjg7PzsyPDk6PjY3QzU3OTY0ODQ6QToxQjY6 +OzgvPTQ7Ozw2Pjo/PDouPTk9QjcyPjlDRTs8QEA5QTs8Pjw9Pjs9Qz5EVETj9qX9//X////7 +//z///////////v///////3//////vT9//zx/+r9//b///7///v3/vbx/Oj4//Dv/+73//Pj ++OLY7s3d6Nbu8uLm+uLp/+nV9+Lp8Ojj7OHz9u7r8+Dt/PLx/eXp/enu/O30//P///3u/+n7 +//3z+evy9vHt+ez5/vjx//D///7///n///7x6evz/PX2+/Hz++3l6NvV18hnTkpGRT1NQkRE +SjxERT5JPz0+QDlLQjo9QTlJOzw+QThKQjlEQj1FQj5CPjpCQzpIQTw8QzZJQDlBQjZIPj08 +RTlAPz0+PzdHPzc7PjZBPThBPjdCPDZJRTtAPzlBQDxCPDtEPDlDPDM8QDlBPjM/PzVBPDlA +OzhDOzs/PTZCQDk5PjREPzlCPzpBPTpBQjc/Ojk/PjY/QTdBPTk9PjhAPjY7OzdBPjU4Pzo/ +PzZCOjk/Ojc9PTo6PTM4PTM4PTY/OTM5QDVBPDs3OzU+Pjg3PDI8ODk3QTY5OTc2Ojg/Pjk7 +OzU2PTI/PDc6PzY5PDc3QTc2ODQzOzg3PTQ3Ojc3QjI+PDg1PzQ9PDc4Pzc/Pjs1OzFDQjsz +PzM9OzU8QTRBQjk9ODU+Pzk3OTRAPzs3Pzk3PTY9PTU6Ozg5OjU8PTw7PDJBPT87ODBAPD0/ +QTJBPEA/PjVBPz47OzJAQT48QDk6OjE7OTg8Pzo7Ozc6PDtAPzw8QDdBPDo9Ojk8Pjk/Pzo5 +Ozk8OTs5PDhAPjozOzQ/PDg2PTk9Pzo2Pjc9Ojs3Ojk/PzY6Ojg4PzM8PD82PDM+PTw3PzU9 +Pjc5OzU6PDY8Ozs+PjY4PTw6PzU5PD06Ozs7PTk7PDI4PDw3OzQ2PTo2Ojk7QDk+PDo6Pjc9 +PTw4Pzc8QD08Pjw7Pjo6QzE2PDo6Pz06QUA6Pzs4QTk8Pjs4QDg8Pjk7Ozw7PTw8Pjo5Oj08 +QDs3QjU5Pjs3PTY8Oj01PjhBRDw3QDQ6OTY0PTc4OzkvQSw8Pj05ODI4PUA5QjtLS0hMTEZT +STpKTkRTTkJRTUVTTkJVUUJVUUtRUkhZUkdVVEFYVkhVU0lcVE1VVEJZVUtYVEJhVEpYT0hg +WVJbW0lcWUlZWU9WWEhZVk5YVkhbXExcWkhbWUxXWUlaVUhcW0xTV0hjVUtXUURbVlFUVUBi +WlBbWUBgV1BaV0VcTkdUSzdORT1PTz1qe1V9dmF1c2CAeF1+dlt4dVp6eFp6d2B8dVt4dF99 +clp0b19/cFlydFl+d2B0dFp9c1xyd2B6e156dlp1clt8c19zcFh4bVtyc1R3cFdxbVR5bVtv +bVZ0bl51bl11bll1bldvcVt0bFN4a1FybFlya1Zua1lyZ1FrbFRvalRoa1Vua1RmbFRuZlNo +aFVva1RlZ01taFNjZk1nY1BhZE1pZlNmak1qaFhmaVNnZ05pZExiYlBVSUc3Pjs0OTU9PDo2 +PjQ8PDs2OTw8Pjs2PDY8PTwyPDY9Oz01PTg8Nz0zOjk+PTw2OTs5Pzk4QDJBOzk2PTk2PDg6 +PTozPTg4PTg7PDg5QDY9Ojw4Ozg9PzozQjg9QD4yPDY/Pz4yOjtAQT8vPDQ9Pj40Pzs7Ojg9 +PTo5Pzw6PDs7QjpCPTs7QDo9PDw9Q0I5Pjs8QD85QThBPz89RT9JVU3v86j7//T///b///// +///9///9//j///f9//z0//H5/+z9/fX8//r////9//jz9+71/un3//L8//Tx+u3l8OPU4dPZ +8dD0+/Pf79vQ3svq9Ofn8eb9/vz9+/f9/vz0/fHu9ebp8OHt/PP///3x8+Xs/evr/Or1+fDt +8OXz+fP///77/e7m8+bs++Pq/+j4//T8//n9//f9//vs8+P9/vrz/eRhTUxJRjpDQzxEQDtA +RjtLRTo5QzZIRjw9QTxHPzc/QzxJRjREPztBQDZEQDdAQjFBPjtAQjdCQT0/RDg+RjlBPzY9 +Qjc/QDhCQDY/Qzg/QzM/PzY+QDNCQTk7PjU/RTw8OzE8QDZBOzM8PzVBQTg4QTNIPTc8QzBD +Pzk6PzE7PjQ+QTI9Pzk+QDE9QjU7PjY/PDU/QjZBQDhGPDc7PzQ6PjI4Ozc7OjE3PTY2PjM9 +PTo1PjQ+OTcvPDI7PjM0PzA9PzczPTQ6OjQzNjI9Ojo0OjQ5OzQ1PTQ1OTU2OjYyPTA2PDY0 +ODgzODc1OjEwOTExOTM0PTA5Pjg1OjA6PjUyOy4/OjcwOjJDNzg1QDZAOjUvPDE8OzU2OzI7 +PDI2OTY3QTY1OjE2Qi47ODU8PDQ6PjM5Ozs5Pi45RTk2RDA+PTk7QTFAPT47QzFBQDs/PzND +Pjw5QDA6QTw7Pjc2Pzc8PDA5Pjs8PDo2PDQ3QTc5PzY6PTM3QDM9RDU7PTw6PTQ7OTk4ODNA +PDo2PDM9Pjc0PDU4PTU0QjQ5PDk8PDk7PTQ8Qzg4OzQ5PDU5PTc4PTk1PzQ8Ozk3PjY8QDg0 +Ojc1PTQ1PDUzOjE5QjU3OTU0QTY3PDA3Pjk6QDI3PjA6PTU3QDI2ODY0QDU+Ojo2PjM7PDg3 +PjU5OTs5OjY3Ozk2QTs0PDo4QTQ1QDw5QTc3Qzg7Ozk0Pjk7QD04QTw2PjY/PTo/QDQ8Pjkz +QTQ6QTo3RDA2Pzw2Qi4+QD0xQTQ6PTk0PzA0NzkvPi42QEMzPTU1QDU8PTxKTDlLSkBLTUJL +TT1TUUFSUkBWU0VNT0FVWUdPU0NeVEdVUUBZVEVSVUVdWEtVVkJcWEtVWUNXVEZcV0dTWUNR +VkhVXEVZVktcWEVXVEZYVUVXXFBcWUZXVk1dXElUWUFfWUxXUj9iVkxSVkBcVFBVW0BZWkta +WT5eW0hZV0VbUkFUQjtRRTRNSz1sdVJ8cF57dVl4dVp9eVl3eV2BeF1xdF6CeV94dlyAd1V0 +c1h7f1Z0d1l9cFp5c193dFd6dlx7c1t6cF92fFZ1bldwclZ8dVlzdVl7c1hvbVJ4cFl6d1tz +cVh3cFpvcVZzb1p3b1ZvcFZ1alFsbVNvbVJpcVRycVpvbFFyaVRka09tZ1Zla1FoZlFkZk9v +aVVqZk5paE9oak9pZVFmZE1nZUtpYkloY0tlYkxhZk9mYkxjYUxSSEM3PDYzPDQ+PTgzQTI0 +QTg0NzA+PTczPi49PzoyOTE/PDcwPjU4OTk0PjM8PTg3PTo4OzM1PDk1PDkzOzU4Ozc2Pjg0 +Ozc4PTU7OTs4PDg2QDkyPjM8PTs1PzNBPjkxOjY+RTkwPDQ+PDYwOTM7PzM1PzQ3PTY2PzYy +QjQ6PTY4QDk9PTg+QT05QjY9Pjw7QDU6Pj83QThBRUI4Qj1LUE3n96D+//n7//f1//b6//D/ +//n////6//H+//j8//79//n////////2+O/p9eH8/+v8/vry/O/s+Onr9uPu++by//Ho/+Dn +8eLX4tHh69b0///3//Ht/Onr/Ozy/uz3//D6/ff7//b1//L1//b1//P8/fHu/O35/vb4//Lx +/+zp/ejq/+ft+ez4+/Tz9erp++fy6+bm+ODl8Nzt9ent8unk485eSUxLSTw9RTlIQz06RDVJ +Pj04RTxHQDg5QjtGPjVBQTk/QTs/QjtBQTlCRDs9SDNAPTs8QzlCPzk3QjVCPDQ/PTY+PTg+ +PDVAQTU+PjVEOzZAOzk9QzhAQDtEPztBQTxEPzk8QTY8OzM8QjlCQTo4PTQ8PjYyOy9DQDk9 +QThBPjo8PzZCPTY6QDM/PTY+PjU+PjY/QDc+PjM7QTI1OjY5PTY8Pjk8PDc3Pzg3ODRCPTc7 +PzQ9PTgzPTI6QTY3OjU9PTUzOzI7Ozo0PzM8Pzg3OzM7PDY4OjI6OTYvOTU2PTQ3PTA3ODUw +OjUzOjYwPTQ4PTQzOzA3OTYyOzM+ODwyQS09OjgyPjQ9OjcyOzNDPTM1Pjc5QDg6PTQ3QjY6 +PDQ6QTI6OzU4Ojg9Ojo7Njs8QDc8Ojo8QzVBOz04PDZAQjs9QTU/OUA3PzU/QD09QTY7Qj09 +Ojc/QTc8PjU6PzU6QDc8PDlCOTs5QDs7Pjk2QTQ7PDg5PDc7Qjc9PTk2QDNAPTs2Ozc7Pzc2 +OzY6OjczPTU8PDI0Ozo2PDg3PDw2QTU5PDg1PzY6PDo3PjI8QDkwPTQyOjY1PTM8OzU5PTc5 +QDE0Ozk6PjU6QDc5QDU3Pj43PjQ5PjQ8QDU2PTI5PzkyPjk3PDk0OjU3OjsyPjM8Ozo3Pjc7 +PDw4QTk3PTU0QDg0PzU6QDo5PTo5Qjk2Pjk5QDU2QDw7Ojc8QjoyPjI6Pjs2PTw6Pjs3QDhA +PDw1PDg7Pzw0PDM6Pz4xOzg5ODYzPjMzOT0vOzE2QTg7ODc0Oyo1OTdLTENOTD5NTT9ITEVT +T0dSTkVTT0dSVUVVV0xPVENaVUZRT0BXUUtTVUVgVUdOTkZaV0tZVUlaWU5ZUEtVV0dZWkxc +VkJcV05aVktVWUhcWEdcWEtgWUxWXE1gXUtSV0ZfVkxUVkNeUU1YWUNaVVFUU0FYWE9kWEVb +XEleWEZZTkdNRT1PRTdRRz9wclN1f197b155dV53dF10dVqAcmByc1yAeVtzclh7cVh0dFuB +eVt2cVt8c1l6d1x1d1p3dVx7c1p7eFtxclh1dFxxdlZ0dFtsc1d1cFpxb113bVZxb1ZtcFdx +cFpzb1hxcFpwb1ZvcFdualZucFRzbVNpbVNxcllrbFJtZlJoZ09maVZnaVBpa1RfZU1jZlBm +aE9nZVJoa09iZlBkZk5pZFBlYkpbXk1kZkpgYEhlZUhgYUpPRUM6PzQ2Oy48OjsvPTQ9Ojov +PjQ3OTUxOy87PDUsOzE4PToxOzQzQDg3PTQ5PDg0PTc3Pi81PDo3PzczPjQ5PjY4OzY3Qjo2 +Qjg9Ojk1PTY7QDkxPjJEPjkyQDQ/PzkzOy88OTgzPjU+OjY6RDo1Pjg3QzY1PTg4QTozQDg3 +QTs8PTo9Ojg3Pzw7QTw6QTk2RDg7QD9BQTlBR0I+STxIVUzj85/2//L6//T///7///////3/ +//v///7////6///9//H4//P0/u/8//f////9///y/ez1++v2/e/9//X8/fjq9unY7c/j6tno +7ubk89zr+ejs/O3o9Obq+urx9+r0/O/s7+Th9Nbe8uPz++/y/vL+//7x/+3k7uXh9N3v8vDw +8evs8+7+//3///v7//b3/+3r7ufq+u7+//v///Xu9ene1MtdS0xDST9BRzxERj09Rj9MRDw2 +QztIREI2QztEPzo8QDlFSDlBRDo+RjY/PDk7RDU/Oz06PzNCQjs8QDVEPDc8QjZCPzw/QDk/ +Pjk8QTo9Ozc/Qz06QDdARjk/QzdCQTpCQTo/QztAPjQzQTk9OjY4RjhBQTo8Qjo+Pzw8QThD +Pjo7PjVBPTo+QjNAQDo5PjZAQDc9Qjk+Pjo7PDZCOzhAQDU3PjU7QDc4QDY8Ozc7QDc3PDZC +Pzo2PjZBPDw8Qjg+PT00PjY4PTo4PjZAPTszPjM8PTcuOTU2NzUxOzY3Nzg3OzoxNi84OTY1 +OzU2NTE1OzMsPzY3PjkwOTI2PzgzPjU4QTc2Pzg+PTk1QTc/QDgwPzdCQTc2PTRDPDk5QDU/ +PzlAOzo/Pjw8PDs3QDw4Ojc4Qzc9Pzg5Ozc3QTM5Ozc0RDNBPkA3ODU+Qj0zQTA9Qz48PDA4 +RD87PTo9Qz49Pjg3OjY3PTU8Rjc9PTg1QTY6QTY5Pjg9Pjs7PTo4Ojg8PTY6PDk6PDY2PzI3 +QDQxODU+Ozk6PTc9QDk0OzU1Pjk2PTc0PDQ5QTkyPzI3Pzc3Pzc/OjsyPDY2PzQ2QDo5QDc1 +QDc0PjM6PDs4Ojg5Pjg2PDY4PT45Ozc7QT06OTs3Pzk1QzcyQjc5PjUxQDY3PDkxQjQ4Ozk6 +QDo3QD85QzkyPDgxPTc1Pz03Pjg3QDg1PDIzPTk7QDgyPTtBTzk3QTwzRTc6PTw2QTQ6Pzsu +Pzc7OzwtQzc8Rz0yQTU6O0AvPTM7Pj0zOS81PTwyPC8yPzg6QzdJSD5JS0NPTkNHU0ZPUUZQ +TkJVVEdNVEhTUUdSWktZVUpTWUFVTktTVEBZV0tLVkFUV1JSVUVXWUdXW0dcWExZWU1XWkZV +V0xXWkJcW01bWkVRWEdZW0ZVZEtbWEtYWkVcWEtXWkReU0RYV0VdW01XU0RVVExXVj5ZVkpV +VkhVUUJISDhQQzVJUj9wd1d3fFt9eFh6dl5ydFt1dF11eFl1eVp8dVxze118cVdqdVh9el1z +c1iBeFp1dlh4c110dFtzdVttdFlzc1h2clhudFp2cVxzb1Z0dFtxcFh3cFlsdldxbFhycVRx +blR1clFxa1VucFhxb1drbFdtblFtbFZzblVmaE9oa1FocVJvblhibU5yaFZqalNraVNkZ05m +Z1FjZU1jZE9jY05kZU1cZ01jY0xjY0xdZE5jaUtfYk1OS0M2Pzo4Qjo3PDkyPjU6PTkxPjI1 +Pzw1QjQ9PTYzPzA1PTUyOzA0PjcvODU5PTs0OjY0OjgxPDk1PjIyPjg0PzQ1OjY1PTkzOTg2 +PjQ0PjY6OjgxOzFAQTwyPzU6PTsqOzQ+OjkvQDQ6OzgqPzg8PjkyQTc4Pzk2PDU9QTo2QTo4 +QDc4PDsvQDc4Pjo4PTg8Rjk3Qzk4RjRARz05RDlJU0ni8Zv9//////////////j///3///// +///6//fw/+z5/unv/u32++7t/+j0/+n5//P1/e7///zz/fXn+eDd+N7Z7dbX8s7u/ejk9+Td +6trn7eD59fb49vDp7uLk693q9eT0+fX9/f7z9+vw8ebt+e3s8OXx8un+/v3///////f6//r/ +//7u+ePr++n7/+/08+rx8uXw/fLt+97r9+329+ff29BkTklJRDpIRDtDQTxDRzhDQTk/RDpE +PjlARD5KQTY7PzNEQjc7QzNEPzU7PTVFQTk3OzJEQTU9QDY8QTFBOzc9RDNCPjc9QDQ/PjU+ +PzRCPDZDQjM/PDZEPDVAQDdDPDVAQDRCQThDQjdBQjg/PjdAPzlHPjNCPzxAQDVAQDVCPjU/ +PzVDPDY5QTRGPjw/PzNAPjc+QjFAOzU8PzU+Ozc7PDFAPDg7QDM+PTU7PzNAQTVBPDU6PTI7 +QjI4QDM8QC84ODY3PTQ8PDYyPjA3ODM4ODA7PjY3PjQ8PTIrOTE5NzIvOTI3OjM2OTA5MjUv +OzA2NTI6NDYzPCs3PDE6OzU2QjI4PjM2PDM9PTo7QjRBOjY0PTQ9PTc1PzU+Pzo4PjdGPzs5 +PTREQjU3OzFFPjg1PDU4Ojc8QDg7PDY3PDQ6PDI4PzQ9PjQ9PTc6Ozc5PzM+PTo0PjA9PDc4 +OjQ+PTo6OCw/Ojc3PzA8QD05PTRBPzxBPzY8QDVEPjc6PzA9Pzk4PTU9Pzw4PjY7OzI4PjY5 +PS49PTo2PTU6PjkzPzM+ODk4PDJAOjk1PzU9PDY4PzQ5PzU3PjY2PzU8PDU4PjI7Ozk2PjU7 +OzU7PzU/Pjk5PTQ8PDY6Pzo5OzA7Ozw5OjM6PT01OzQ4QDc3Pi46QTU7PTM2OzU7Ojk5OzU6 +Pjc3QTM5PTs2PDI7PT06QzU5Pjs0QC41PTk2QzI2QDg8RTU4Pzs5Pjk1PThAOzU4Pjo7PzU7 +PzQyRDQ7PDk3PzI6OTQ0PjA3PjszPy03ODUzODA7OzgzPC1NTENOT0JUSkdMTTxYTUZRVEBY +VEVQVUtRTz5WVEdYU0VaU0haU0VVVEVXVEdNUEdWUUZTWEFeVUZVU0FfT0tRV0JiVExVVkJf +T0lZWEJdWU1YV0ZSV0dVWEhZV0ZcU05iWEZbWUlbWkVVWEZcW0NWVkZWWEdeVURZT0tXWD5h +T0ZLQzJWRjlETDNxc1h5dlh7cWN4d1t3eVl8d15zdFt8dF98eFp8cF56dFx8dFt8elZ7dFl3 +cFpzeV17dFp5cFd2dFtwdll9dFhubVZ9eFZucll0cVV0a1R0bVJyb1dtcFF1cFVwcVN6bVNs +bVBwcVNra1JuaVJvblJqak1sbFNxalNlbU9yalFsbFJoaU9malFqaE5makptbE5nak1mZU9n +akdsZk9iZUtoZUpiZUpoYUxiZktlZlBiZktiYEtPR0E0PzcyPTU2QDc8OzcxOzM0PC84PDY6 +PzUzPzQ2PzY6OzYyQC89OjI1PDI7OjcyPDI2OzcvPTU5OzQ3PDM8PDU3PzI1PDQvPTU4PTQ3 +PDQzPzI2OzY2PjI2QTY7OzU2PTI8QDkyPTY7PTkyPDU7QDkyPTM+PDoyQDdCPTwvPTVDOjg3 +QTY7Pjc4RDw6Pzs6Pjo5Pzc9Qjc/Qzo9RzxFWEPt96X9//b+//b6//D+//P///////j///f2 +/+/6///0+eP+//v////9/fr9///0//To+uXq+Obr9d/v9ej8/fbt+/Hn+9vm7ubd39To9dzy +/u7z9+vr/u7y+vH6//H+//z5/+/z8ePr+uj3//f18+rs++zz/e3q8ur2/u70+u3q+ev4/+71 ++/L18uHl9eTy/+30/e30//X+//7z/fPq7+Hl5tZcS0VFRkQ9QjNEQ0FBPTdFRT1CQDpAQjg7 +QDdEQD9BQDU/QDc7QDQ+QDQ+Ojk/Pjk5Ojo8OzVAQjZCQDg5PzNIQDs5QTdDPzg2PTdEQDs3 +OTxEOTg9Ozc9Qjg/PTg7PzU/PzpAPTRFOjw3PzRCPTc9QTc+PTY+QTc5PTU9PDc7PjU/Pjo9 +QS8+QDk+PTM+PT86QDQ9QDU/QDc8PDRCQjw8PzhDOzg9PzM9Pzs6Pzg9Ozk9PjM9Pjg4QTU8 +OzU5Pjc5OTc9Ojc7PjY6PDI4PTU5ODQuPDM2PTE4OTk1OTQ5OzYuOTIzNzksNjUwNTYwOC83 +NDMwODU5PTs1Pjc5OTY5OTY7OjI2PTI5PTc9QDg4QTA4OTY0QTU9NzU8RDk+PDE/Oz05PDM/ +Qz45PDZAQTowOjY7OzkzODZBOz41OjY+Ozg1PTo+PTg4Qzg+Pjw6PzlASkA8OTk+Pzc8OzU0 +PTQ0PDEyOTYzPzA7PTw1QjM3OEAyOzM5QTs1PzU+Oj0yOTM8PD04PTE2Pjs7PzM5OzM5PjU1 +OTg7Ojw5PTg8OTk9Ozg3OzQ4PTE5QDc5PzozPDg6PjkyOTQ9PTgyPTI3PTYxOTQ7PTY4OTo6 +PzY3PDk3PDU7PDc1PDA3PDg3Qjc0Ojg3OTU3ODc1PjQ8ODM3OzMzOzI6OTw0ODM4PTs0Pjg4 +Pz00QDI7PT04PDI2Ozk7Pz03OzQ2PDQyPzc8PD82PjQ6QDs1QDI6PUE4QTQ3QD06Pzo4Pjw4 +PDovOzs1Pjc0Ozk7PDcyNzc1PDctNDc1PTE5MzYxQDVPSEJPSUNPTExHUj5YT0VLUUJUU0hS +UkJYVE1SVUJXUElZVEVXVktSWUdVT0tTVUdWVEFWVk1WW0pWV0NhV0pTVUVVVUlaWEZcXktV +WUVVV0pVV0ZbU0xVWEleVkpSVkJeUUxZVUZeU0RaW0ZbWEdcWEZWVklaV0paV0tXWExaTD1L +RjtNQTw9Szlxdll2d1p9el90d1h6c190dVZ6cl1zdVx2eGN1eFl7cmF5emB3dVl0c1t4c1l3 +cF5zdl14eV52dVp3dVx6b1p3cFp8cVpucVt7cFxuc1h5bVZtcFd5blRzblZxcFVtallyblZr +blRzbFZtaVdrbFFxaVZta1Rzalhrak1taVRpa1BoaVFoZ1JqZFFpZ05mbVFraVNjaExnZlBo +aE9maFFnY0thZFNiYk9cZEdgXklfZUlgXUxLQj46PTs2PjU2OzYyOzI7OzwwOzU1OjcyOzc3 +ODc5Ozg3PDY7PzczOTo0PzU3OzkzOjQ3PzkyPTc4ODczPTQ1PToyOzQ3PDguOjY8QDcxPTg5 +PTgyPDs+PzkvOjU6PDkzOzozPDk5Ozk7PD44Ozo4QDs6QjY6Ojo5Pzw6RDk1PDU7Pzs0PjY7 +PTs3PTk+PEE0PzlBPkQyPjlBREM3RT1LTkbZ5Zzm+N/5/e7////6///7//H////7//T9//b9 +//z8//H+///6//j6//Du/u3r9+Pz+fL6/fj9//nv/Pfk99nn+Obg8dPm++bl9OHc69jz8eHi +7ejp8OLu9+nb59vm9eTq897q8+f7/vXs9+Xr/ef+//n+//j6/e3z+Ovr9Ovy+PTs+Oj3/vv7 +//f+//zz8+vt7+b29vLj8uL2++vp8d/p3dlZUEZLQzw9QjdDOztFQzk9QTlFQDlHQjpCQTxC +QTw+PTRBPjtAPTlIOzk7QDdDPzs8PTVFQDo8QzJCOjo8PDFHOz07PDFEPTw/PDI/PjpAQDg9 +PzQ+OTQ/QTVEPTdCPjdBPDhAPjM8PzI+QzM4QjNBQDg4QDRIOjk3RDVJPDs/QTNHPTs7PzlJ +OjZBPjRAQDNDPzZCQDhCPDtCQj5IQTg/QjNEQjpFQTpEPTtAPjtFQTZEQDw+QDNDPzxBQTFE +Pz0/PzU9PzdBPzQ9PjhDQDg9Ojg9Ojg0PzE8OTY1ODM1ODYxNy86ODQvOTQ0NDQzOCs5OTM3 +QTY4OTM2OTY8PDY8PTk8OzQ/QjY7QD1BQTlAPjlBPTBDPjo7PzM+Pjo8PTQ9PDU5PzNKQDg3 +PzRBPzc6Nzc/NTc3PjY+PDU3Ojc9QDE8Pjg8OzU6Pzg9PDg+PTY7Pjs2OjA+QDY2OzI9Njs2 +OjM+OjgzOjY8OT02PTc5PTczPjVAOzc2PThAPzs8PDQ/PjlBPDU0PDw8QTs9Pjc8PTg5OjU3 +PzU7OTk7PjQ9Pzk3OzU+Ojk1QDM+PTw2QTE9Pjs3PS0+Pjw5OzA/Ojs6ODU6Ozo5OjY4PDM2 +PDQ2Ojc3PjY8PDU7OjU9ODc4PDY7Ojg2PTQ7PTszPjA7PjotPTM8OzszPTU+PDoyOzM8Qjk3 +OjsyPjc3Pjs7Pjg5PD05QDg6Ozg3PjQ7QDg7Ozk7QDU/Pz80PzU3QDk5PTU8PD43QDQ8Ozw6 +OSw5Ojs4NzA3NTs1OzAvOTc1OjU0ODQ7Ojg7QzBOSz5QSTtOTEVMUUFRUkVVUkZPUEtTWERS +UUxXU0ZXVUJdV0FSVUZaVkhMUkVYU0VXWkpWV0JbVkdXWEJfU0NXT0JaVERXXEhZVUhfWkNd +VkNXV0BbXExWWUJcWklfVUJaWkxcXkNYU0ZYUkFdWkdbV0dfVz1aW0FdUEZcVEdbSD9LSzhZ +STVGTzdwclZye1Z2dGN0dFV6dlx2eVp8dF93cF59dWF8d110eVx5c1p1d1tzdlt5dld0c1l7 +d151c1p8d1l0dVt6cV5wcll6cl12c1V0cF9vbk90blpta1VycFpxbFF1cVh1blVwbVlvbldu +blVxbFVwb1RubVZzbVRxa1ZwblNta1Rqa1Rra1Bza1JkZlBwbFJla05tZ1BgZlFrZU9jY0ti +ZE1kYUthZEphYk5gZUtiZ0tfYUlmXUpJREA8PDM1PDY4PDU7Pzc5PjE4Ozg8PTA2Pjg3PC84 +Ojk8PzQ6QDg7OzYyOjQ7PTkzPDQ4Nzc2PTM5PDIyOzM0OTU5Njs6PTg1PTYzOjU5PDo6QDQ3 +PzQ6PDUzPTg6ODg0PzUxPjY8PDI5Pjc2ODQ8PTc2PTQ+Pzw2PzhAPTk0OzY7OzgxPjZAPTw3 +PjlAQj03QDk7PTg4RTk+RD4+RD9HUkP5+q/+//j////+//f+//v///////z///////35//r6 +/+36//b0/+35//X3//P9//3y/+/w/Ors++nr7uXo8ODg8uLf9dDf7drg69bd4tn8//L2//j9 +//3////z8+fs7uX3++v8//bt9eXw+O3s9e7u7+X+/vz59/Hw/uj9/vn////z9+zl+ub1/fDt +/+f0/fTu+fLr/vHx+ezx+uvt8+Pd4dJeTEVERz46QzhEPz47PzhBQD44QjhEQTtAQjpHQj49 +QjZCQj1APTc/PjdDPDc+PzY8QzY6QTs/QThEQDs/PDY8QTY2QjM+QTc8PzJDOzk3OzJENz87 +Oi5COjs3QjZEQzs9QjI9Pjk/QDQ+QDY7QDQ8OzZAOzlBPjhCPzk9QzhAPjs8Pzc7PzVCQTY7 +PzJDPzg3PTNCOzo7PTRIPTo7PDZHPzk6PTVGPzo9PTdCQjhCQTdEPjxGQjw+QjRHQDo/Qj5H +Qzs+QTc9OjM9Pjo5OzI+PDg8QDQ3PTk2Ny81OTozOS8yODgyODAyOjM0ODMyPDM1Oy8xPDM5 +Ojc2OTU5OTM5QDI+PTU+Ojk6PzZBPzs8PzY8PzU4NzQ9Qzc/PjU6PDY3PDY+PzhBPzk3OzM+ +OzQ3PzFAPTg5PTU4ODg1PDM9PzU2QjY7PDk3PTg/PjczQzU7OzM5PzI1QDI5RDY6PDY4Ozg6 +OTE6PDo6Pjk4PzE6OzU5PDU7ODgyQC87Ozs3PTE9PTs5Ojc+PjU1PzI7Pzs1OzY6QDUxPzE6 +PjY4QTk/Ojk6PjQ4OjYyQDc1PjU3PjY7PjUzOzY3PDMyPzA6PTc1Oy47PDk1OzI6PTo3PzM8 +Qjw4PDI5Pzw2PDIzPDg2OT03PTI5Ojk2PTQ6Ojo5PDw1STk9Ozw3PTY8PTkzQDI7Pzs3Ojg7 +QDswPjQ/Pz8vPTI8PDoyPjc8PTo4PTw7QDU2Pjk1PDc1Pzc2QTU3ODgyQDQ4PTg4QDo4QDs2 +QTY0PjQ0QDgyNzU4OTgwPS84PzoyPTc6Q0BJRj1OTkZPTkBRT0BYTjxQUkJWU0BTUEJVT0hW +VkVXVEJYVUJZVk5VVkdUU0hVU0JWVk1ZU0NTWklbVkdSVkZZVUZRV0BiVUZaWElbWUdcV0ZW +U0dfVEhZXUdjWUtZWkpgWUtTVkxcVUlXVEVZU0pUWEVcWE1YU0NdV0hWV0VVTkZNQj1URzJC +UDlxcFZ5dVp+d2B5flx8dV10d1t1dmBxdVd7dGJzc1B4cl1ycVd8d11wcFV3dl53el91cFt1 +d1tzdVp5c1hwblh1dVp2cVpxcldvcFxuaVNzcVtrblVzbldsblVzc1hraVFya1dlbU9yblhx +aE5ycFZtbFFsbVhza1VuZ09vaFFmbE5oalVpaU1ma1FsZ0tqalNlZU9iZ1JraVJhZEppZU5g +ZUlmYk1fZ0xmZE9hZ0pmYkxhXUpMQ0I4PDo4OTQ3PTc2QTY5OTkuOjU2OTUzPjI4QDU0PTQ6 +PDQwPDM1OzE8Pjk4PDE2Oj43OTgxPDo3OTE1PDkzPTQyPDY7OzYyOzY5OTc1PDU6PDg2PTc0 +PDk0PDY+Sz04Pjk2PDgwPDkzPzY3PTw4Ozs1QDQ3PjY5Ozk6OTk8QDY6Ozw+Qjg+Oz84PTo6 +Pz81PzhAPzs4Pzo/QT8/Tj5TYFXb9J3+//P9///9//v////////6//j///f7//v5//X0/+n/ +//f0//X9//X///30//Xw+Ony++7t/Ofy+env/evs++7Z8tDZ5Nbe7trh69zz/+vr9ezs9+jp +8ubz9+7q9ebw++bq/Oby/evt9+b9//36//vz/Ov1//v8/+739e7t++r+//zx8eTz+PLn+OX3 +++nu8ub3/PT8//nv+uzp7eLZ29NbR0dAPj1DRz5CQUFCQD0+PDk+QD1EPzM9Pjo+PjxAPzdC +S0c9PzZCOzs1PjdBPzk8OzJEPDs7PDM+OzhBOzZBOj03Pjg/PDhBPTdFPzlBOjo5PDg/PzQ/ +PTpDOzk9Ozk9QDVCPTg8PDNBPDo8QTRBPjg8QzJHPj42PDRCPzg7PjJCPDo1Oy9COjo1OzFB +QDk8OjY7PDI8Pjc7PTU+OzM4OzI+OTY8Ojc9QDZDPTc/QDZEOzo6PTFFPjo7QDRIPjw+PzZF +PDc+QjZEPTk/PDo9Pjc/Ozc3PTU3ODYzODQ5NzczODM0Ny8xOTU4NzE3NTY2OjE8PDs5PDI/ +NkA5PDFBPDs5PDBBPTtDOy8/Pz9BPTU7QDU7PDk5PDhHQTo+ODg7ODg6NzlDQTo6PTU/RDc/ +Pzc2ODk+PDg5PDQ+Ojo3PTU+Ojk9Ojg9QD04OTo7PTQ8ODk4PDY8Nzs5OTc8Ozc0OTQ7Ozcw +PzM7PzYxPDY2NzY6Pzs8OTc+QTo7Pjg3ODk8PDc6PDo6ODY5Ozk2OTc4ODk8OTk3PDU+NTw6 +NzI4Ojg0OjQ4Ozo0ODI6OjU1NjI3OzY3ODo7PTk1OjM+Ojs3QTY7PD05OjQ1PDU8Ojk6Pzs7 +OTg6PTo2QDc3NzgyOjc8Oj4xOzY6PTsyPDM9PDs3PjQ2Ojs2PDA+Oz8yOjI+PEQ0OjQ6Ozw8 +PDs6Ozc2ODxARz02Ojk4Nzk7Pjk6PTw2PDY6PDgxPjs4PDsyPjE7OTkzPi4+Pz4wPDQ9ODww +Njc7NTQ1NzswOjc4NzY0PDY2Nzk6PzhLTEVMTUNPS0ZQUkJLTkVSTkdQSkJXTkhSTUFVWEtS +UkdcVEpVUz5VVVBTU0VWVUpRUEZTVEpXVUhYVUNaWUpaUUJaU0hVWj5cVEtXWUVVVUxaWD1X +WU1eT0xWVU1gVEdYVEVfV0hXWEljVUVXWEhgU0BaU0dZVUhdVUZZWUVdT0RKSjNWQzxGUDtx +b1pyelh+e2R7dmN9clt3dll4dlt2cVt1b112dVp5b1tzcF18clh4b1x1bFVycVp8clxycFZ1 +bVF1cVd3clxxdVd4blhvbFFzcVtyblVyb1xsb1JvbVVyb1Z1bVlvbVNuaFd0bVVxblVyalRt +aVNpbU9wZ1RrbVFuZ05maFFqZVBnZ05qalFiZUxoZ1RkZ1JoZVVjX0hlZ05jY0loZ1RlYE5h +X01lZU5gYUxkZFJfX0xgXEtJQUU2OzY9PTk1QDY+PjsxOjZAOjgzPDU/PjcvOTI/PDozOTs/ +Ojg0Ojc3PjY1Ozo5Ozg3OjszOzY4Ozc6OTY3NjY3OTk6PTk1OzczOzQ2QTo2PTI2Pj02OTM9 +PzszPzM3OTs2OzM5PDo7Ozk1Pzk6OzU0Oz1BOjs0QDM4Ojc0Pzg6PDo3PDo7Pzw4Qzw5PzY4 +Pz47Oz08Pj48RT1CQj9DUkns9KP+//f///n///r///79//n///j5/vb5//P////+//j+//7/ +//////35/vn6//Dx/+31/evv//Px++fw++vn+OXY69bp9uTc6tnc5dT09+vl8uPw/fHu8+Py +/vDz9+n7/fz5+enl8OHs/u3u+eXi7uXx+Ovy/PP///j2//P3/uzs9+nz+ej0/vP5+Ofi5tfb +5dju++/1/e39+e/t793j3tJaTENLRz87RTtFQkBAQDdBPjg8PjdAPzk9RjhAOz09Ozg6SD5A +RDg9QTM6PjU6QDU9Pjc/PDo/PTc9PTg1OzM9PTk1OzJBOjo+QTU9PTs8OjU9Pjk9QThCOTo8 +PDU+Ozc4PzY/PTY7PDE5PzQ9PjY9PTVCOzlBPzg7PjRCOzo9OzVEPTc5PDBAQTo5PDNBPDo6 +OzhEPjo2PjRFOzk4OTM8OTY6OzE4PTs6OTg8PDU9Ozk8QDU9ODc8Ojk8PTU8PDo/OTVBNzk8 +PjNGOzk8QTRDPDU8QDZJPjozNzM2PDYrPDE5OTYwNjQ5ODYzPDY3PDU6PjM6Qjc9Ozk7Ozc9 +OjQ5Pjk9QDU7QTg/OzZBQj03PTVBOT07PC9AQTo6PTI8PDk4PDA7PTk8PjI4PDc/Pzs4PTg8 +PTU3PzQ5PD07Ojk6OTc8PjU6QTg4PDo4PTE4QTk5OzY5PjY4QDM9Ojs6Pzo6Pjk3QTk8PTg1 +PTQ2QjU6Pzc7PTE5PDQ3QTU+PD02PzQ5PjY2RDY5PDQxPzM3PTI0Ojk1PTI5PTo6QTQ0PTY2 +OTA2PDs2OjQzQDY1OjU1PzY2OzQ0Pjc4PDk3PjY/PzM4QTQ8PDczOjI7OjwyPjc5ODczPTI1 +Ozk0PzU0PTk6OzU3Pzc1PzQ3PDo4PjI4PjgzPjY2OzY6PjY6PDcwPTE9Qj80PTM5Pzg2PzM4 +PDwzOjM7PDc3QDA7Ozg0QC83PDQ0OTY2PDk4OjcyOjUzQDc1PjY1PDU2PjY3OTk1PDYqOzE2 +OTkwPjE0OjUoPTI4ODwqPDE+QTxBS0FSTkVKT0NYVEBRVEZQVUNWVkdTUEJTUkpVW0haUE5W +VENVVUhYV0JOUEZbVEtXV0ZcVEtTUUJaW0xWWUdaWEpZVEZTVkhaV0JcUUpZVkZXWUdcVUdW +VEVgWEtaW0ZXU0heXkJYU0pgU0lXWEZhWURRUkZdW0dWWkZoVURaR0BSQjtPQT9GSzxxeV18 +clp9d195e1p5dll1dFl8el93dV56dF52d1p5dVp3c11zb1x3dFZzbV91c1t5dVtzcVp7cldw +dl9xc1dtcVt3blhrblR1cFpzcVhzcFhteFhzcFhucFJ4b1ltbVVzbFtpa1VvblNubVVrbVVv +blNobFNsa1Rvb1Vxa1FhaU9oalJta1FqaFFlZ09naU9kZE5hZkpsZlFeZktlZE9gZEpqZU5f +YkhlZVJfYUtgY05eXEpOSEI6QjY0PjI3Pzw2PjM5PDkzPTY2ODo6PTU3PDM7OTkyPTQ0PTcx +PTI4OzUqOTI9ODssPDE+PDUxODZAOzgnPDU6PjYxOTUxOjU0ODgwODI4OzkuPDY7Ozc1PTY6 +PjE5PTo8Pjc1PjgxPDI3PTs0PTQ3Pjo3QC02QT80Pi83RDg8QDkxPDc7PjY3QTo/Qjw1QD4+ +RTw7Qjg+Qj82QzxTZ0Xn+Lb5//D7//L0//P5//H+//f///////r///70//T0/+X7//Xz//Hw +/+z0/u/9//Lv+ur8//vs++3x/ufp9+zb6NvW8dPb6tfZ59bY49Hy9+vs+uzw9un2/u/u7+nt ++OP09u74/u/+//71++nw/Or7//b7//n5+/bs8+ju+Orz/fH9//r///7+//////Pz+/Dt7+bu ++uz4/+7j59zk4dbT0MdjTEU/SEFDPTk+RDxCRTk9Ozs/RzdEPzo/QDVBODo6Py5APz0+QjhA +Pjk9QTdAOzRDPThBPTU/QDc7PDNAOzo1OzM6PTY+OS87PjQ8ODQ9PjZCOTU5OTVCQDk7Pi9C +OjQ9QTFAPzQ6PTM6PDM8PDY8OzQ6PTQ/PDc6PDQ/PzU7QzQ8NzU/PDQ6OjM5PC88OzA6PDI9 +PDQ5QTBEOTc5PTJDOzg2PS9GPTk4OjRCPDo+PTJDOjY3PjJAPzc+PTJDOjY7PTc9ODE8OzI6 +PTQ5Ojc/PDk8OTQ/OjQ+PTM8NjkyOjE1ODY1Ny04NTktOS9COTU3PDFCOzk4PDRBOzk4QDlD +OTY7PTI/OjI/OjY+OzM6PjQ7QTM9PTU4PjVEPDU6QDY9PDFAPTtBPzI7QDU7OS5AQTw6OTE4 +Ozs+PTE+PDo7PDM6PDE9PDM6QDRAPTU5PDBBOzo4OjU6OjM6OTc9OjY4Ojg4OjU7PDY2PTA6 +OzIyPjA7Pjc4ODU8Pzk2OzQ+PzMyOTM0OjA3PTQ0PTg8ODk1PCo5OTg3OTU2OzQ3OzM9PDQz +OzE7Ozk0OTM2PTEzOzQ2PjM2PDo6PDE6PTw7PC84PDU3OjI2OzM7PTcxPzQ+Pzo2NzI9Ojkv +PzA6PjUxPTM3Pjc4QDA6ODo1PjQ6Ozg2OzA5Qjc5PjQ3PTQ6PjE1QT02QTA2Py87PjE3Pzgy +PDQ3QDcyOy83OzUwQDE8PDkuPjA5Ojg1OjA6NzoxOyw6Rz01OzI1OzU1Ozg6Oi0tPDQzPDIw +OjU4ODQvOjY3OTAtOTE1QDNGS0VRTkJLTTxVUEVPUzxYUEVPUkFXV0NNV0ZYVUVMU0VZUUJX +UkhVU0BWU0dZVj1WVEhXUz5aWEJaU0ZSUUhYVkVWV0BdV0VaV0VbWEtXVj1YVE1bV0VbWUxa +WUVbVExaVkZaU0ZZWkVcV0daVUFZV0FZUEdXV0FdUkVaXUBTRj9SRzlNQjtNUTtveVyBd1t2 +d1yBe190c1h8dVp1dF19dFt7clx8dlx6b1N2dFR2cVRxcFB8dlZydFV5dVlzc1h4c1lscFR2 +bVh3cFh3blZxb1JwcFd0bVB0cVNzcVVzbVFvbVRvb1dtblR1b1Z0blBzb1Jra1BtaFRobE9x +Zldra01vaVVoaVFoZ09qa0xvalNlaE1rZlFmZktjZE5kY05kYk5kZE1kYktiZExmY01lZk5k +ZU1bYEdkYU9eWEZNRD8wOTE+Nzg0PDE/PjkwOzI6PTgyOjQ3OzgvOjE4PDE7ODgxOjEzPTQw +PjI1PTQ3OzQ4PTM4OTEyQDI6OjgyPDI7OzksOyw7OTcrOzJCOzkrPTY9PTk1PDI4QTU3Ojcx +PzY1OzU0OzE3OTQwPjU3QTg0QTU2PTQ1Pzg4NjU3QDc3QDM3QTk4PzQ6PTw3PTA9Qz87PTU8 +RD8+RD08SzdQXEXd76T8//L///////f////7//b4//P///n7//f0/+3v/eXv9+ns+eLx/uj4 +/+/y++38//nz//Lv9eff69zu+uPw+vTV79Dl8eDj7dzg6NLf7d3m8+nz/vHz/O7+//T0//Hu +8ejo++T4/evu//D0/O7q9uPl7uTi8t3y/vf2//L4//nu/ub0/e/u9Ojq9/D///3////09Ovl +8uD9//ry8ura3dBhS0E+RUREQzw5PjtHQD0zPzhCRD82Pj5LQj4zPTpEPTk+RDpBOTpCQTtA +QTQ9Pzo/PjU/QDc9QDFAPTg6OjhBOzg7PjpAQTc8PTk8PTU9PDg8PzM8OzlCPjo9QTo9PTY9 +QDpAQTk3QDlCOzc6PzQ+Pzo7PTY/PTk4PzA9PDc4Pjg+PDw9OzQ/PDc+PzZAOzY/QDdAPTc2 +PjI7OzY7PDY2Ozc5OzU6PTM7PTtAPTU7QzM7PDY8NzZBPDg2PDFAODg1PDJANjQ4OjFAOzg9 +QDc/OTg6PTc6OjM6PzU8PDQ0ODA3OzQyNjYxPDguNTU4OjQ4OzM8PDQ8PzJAOjw1QjQ9PDc4 +QC9BPzsvPTRGPzo3PTNDOjczPTRBPDU7OzU1OjM9OjY7OjU/PDo6PTQ7PDc1ODpBPjQ6Pjg5 +QDE5PDg3PS85PTU3QDI9Oz01PDE4Pz06OjQ7PDs9OTI6Ojs7Ojo2PDI6PDUxOzY5PDY1PDc2 +OTU4OjU3Ojc2PzY1Pzg5Pjc2ODI9Pjo2OTo+Oz46ODY+PTo2Ozc8OTc3OzU6PTk/PTw4OzU3 +NTc2PzM7OzU0OzU5Ojs4PTY+PDY2PDY6PDM0Pzg1PDM5PDc5PDYyPD06PDMyOjk2OTU5Ojk6 +PTQ1OTg7Nzk0Ozc4Ozg3QDQ6PTYxPTA7OD05Pzk7PTo1PDY6PT09Pzc2QDk0OTo4NTk2PDY3 +PDY8Pjc2Oj08PDg4OTo1Pzk6Ozs1PDg3Ojc0QTFAPEQ2QTE7Ozk0PzQ3Nz03PTE4OjkyOSs2 +OzstOjA0OzgyOzM9RD1IS0VQTkBPT0VWSkZYUUJTVUJRTUVXVUhQVUFWUkdRUUdZU0tRWkJa +VktOT0FcVkxTWUVfVkpTWEhaV0lYU0tVVkNXUUtVXEVcT0tWV0daT0hXU0heWUxYW0hYWkdb +XUtVWkZbW05XUkFfWUxaWEFeVExZUURdW01ZVz9aV0ZbTj1KRTVUQzdKUjhydld6dFl4dVt8 +dlp3c1p7cVp5d2B+bVZvcld8cltza1l4cVpwbVh3cFJtcFV4dFV1c1p1d1R1c1x3clp3c1ps +dVV1dFltb1R1a1dublZvcllycFNyb1hualVsb1V1cFVvaFVpaVJwbE9qbVpva09sb1VubFRs +bVZuZlZmalBvalNmZ1JuZ1NhY0tiaFJmaEpnZFNmak9mZVJlaE9mZldeYU5jYlJoZ01laE9m +Z0xZYk9mW0tHQEA6Ojs3Ozk3QDc3Ozk3OzY6ODozOTI8NzczPjY4OzwyODY+OzkvPTM9Pjk3 +ODY2Ozo1OjY2PDY1OjU0PjQ1OTM0PTY1OzQ3Ojo2PDg6ODo1PDg5PTw0PTI+PDw0OzE/Pjoz +PDFBPzgxPTs7OT01PTo8PDg5Pjg5PTs1Pjw2PTU5QTg6Rj08PT4+PTk5Pzo5REA9QTs/Qz09 +QTlDRUtKWEPv+rL////5//P+//n///////r///////z////4//f9//n////////////x9/ft +9uPj7eDp+ePp9OTu/Obw9PDb6djc89P2/PXa4dTc7tDt+Ojm8uLp8N/h69zx9urm7+Dt9+jr +9+Ps7+bl6eLp/ebw/fP4/en3+e7x/+7x++7m89309un8/vv7//j7/vD6/+/17uvo+eDu7ePo +9+Pt9d/m79lbSU9EQThBRD5IQzpBRTtCPjw7QzY6Pzg7QzY9PDlEPjc7QTg/PzQ/QTk/PDg3 +PzVHPjY2OTdEQTU7QTdHOzg3QjU9QjQ8PDQ6QDE9Pzg/QDQ+PTU3PjNFPT47QjE/QDQ9PjNC +PjU+PzQ8PjJDPjY9PzM8PDU7QDE/PDo/PjU8QTxEODI4QDQ+OzU3PDBAOzU0PS9BPjg4PTRA +Pzg4OzE8OzU4PzE9OzU6PDo7Pjc7PDY8PjY2OzY8NTU9OzI7PjU8PDM6PTU8PDFGPDc5PTM+ +ODo5OzE/PzU4PTE9PDU1NzM1OTMwOC85OTM1OzA+QTU8OTM+PTY7PDM8PTQ/OzVBPy5BPzQ+ +PDg8Pjk7OzY5OTI/PjQ6PTM8QDo3QDFAPjM4QDBCQjs4PTNCOjs4PjRCQDg4PTJGNjo/OTtB +PzZBOzk8Ojg/PTU/QTU9PDU8ODg7OzM5PjI/OzM/PDk4OTA/QDc7PDE8PDs5PTE7ODk2OjI7 +Ozw2PC04Qjc9OzU6OzM4ODs7OTo8ODc2PTc9PTg1PTM3Ozo6OTM2PDk5OzU0PjI6Ojg4OjQ+ +OD4yPTU7PTo2PDZAPjY4PDQ5OjI1PTk7PDQ5Pzg6OjE8Ozg1PTE3PDc2OzU3OzU4PTY3PTE0 +OTY5PzY6PDk1OzQ4Pjo3Oi43PD82OjE5Pzg3PDM1Pjc5PjszPTY7PDs6QjY4OjU1QDU5PTkx +PS4yOzcyPTY3QDo2QTUzOjk1PTM6Ojc3PC80OTo8PTU4PTM4PjQ1NzY1OC03NzYtOzE4NDc3 +OjQ7OzAzPDM5OjNLUD1UTkNNT0NWT0hTTkJXVEdQVT1VT0JVUUFVVEZTUExVUzxTV0NaVkdW +UEZVUUJVV0dYVEZSUEhaVEdVVEdbWEpVWUBaU0VUVkpfVU1TWENXW0ZWVEdeWUlZWUdYWUZa +WEhXVEVdVUxaWkRbVk1ZVT9aTUVeWUdaVUNjV0dWTT9TSj1RRjJPUz9xeVV3clt3cVeDcF91 +clh8dl57cld8e1x3clt4blx6b1pzcVR5dll5b1Zyblh2cVV2cFp3d1dzbld5clptcVp8b1h1 +dFx7blpwbVd4b1Rwclh7bllycFh3b1drcFdwbVRqbFZwa1V0alFvaE5tbVJubU9xZlFpaFBo +aU9salBuak1talVpak1rZ1Bra1FkaU5nZ0tkYk1nZk9jaU1qZU5kYktoZU5lZExmZ1NfZ0dj +YExdXUVFQkIzOjU2PjQ1OjQ8PDU4OTg5Pzc5PTY3OzY2OjczPTk3RTc3OjY2PDE5PDYzPTQ5 +PDcwPTQ3ODgzOTI7PzMxOzI6OzMxPDU4OzYxPjQ3PDc1PDc6Pjk5Ojk4Oy88ODc5PDU7PTQ2 +PjU2PjI6PjkyQTg3OzYxPTM+QTs0QDREPjs2QTNEPj02PzlBPz43QTpAQT05QT9FQjs/PkE+ +REBIUUbc76Du/OH+//j////7//j3/+39//r///r///f9//rw/uns+eH9//z7//X///v////x +/Pj1++zo++P2/PDn/eLp/+be79jT3cvc6c/j8d38/+/9/u71++/0/Pz9//n7//L+//3t9dnz +/vz////////99PX9/f769+zz+PT++/Lv+e7+/+/s++r4/+zz/+/3++ny8vf///7/9fX17+3x +5+ba1spdQ05BPzxHQD46PzhAPTw8QTtBOzxCPjc8OjU4PDg8NzRLPTs8PjY6PTg9OS5AOzY/ +PDU8PTZCOjk6OzQ8OTg3PzZCOTY3OTRBOzo3OjQ+OzY5OzRBPzQ6Ojs9OjY6PzZBOzhBPTdA +PzdAOzI+RTpDPDQ7ODI7PDM+OjY9NzJEPzk5OjBCODc7OTFEOzg6PTFDOjc9OjdDPTo9OzJC +ODZANjE7Ojc6NzY6PTFAOjhBOTc9OjZDODY7OzRAODY7NjNCPDc8OjE+NzU5OjFBOTg8PTBF +OjczOzBCPDYzOTI9MjYxMDY4OjEwOTA6OTFAOzY8PDU/PTA/PDdDPjg/QDhHPTJFQjZDPjQ/ +OzU7PS1CODs/PjRDOjo+OTI/Pjs/PC07OTc9OjA5OTU/OzM8PDU/Ojc2ODJBQDc7PTRBNzU5 +PDQ9PDg8PjhCQzk/Pjg6OTU9PDg3OzVDNjc3PDc/OjY3OjI+PDQ7Njg6OTlBNTk6ODI9OTkz +PDA6OTg7OzM9OTc6OzM9PDs3ODc+OzI1OTU5NS83PTo3OTE6PDo+ODQ6Ozo5ODE3Ozc3OzE0 +ODc5NzQ0PDI9OTk3OjA9Njg5OTI6OTo2NzE3PDk6OzQ7NjY1PTE6ODY3OzU3OTk7OTVBOTc+ +ODk3OjQ6Pjk2OTg3OTE7PTM2Pi84NzU2PjI7ODg3PjQ7OzE2ODI6PD8zPS89Ozs4NSw+OD05 +Oy45Ojw2ODU9Ojg6PDY5PzM2OTU6PDY2PDY9PTg3Ojc6PTQ0Mi89NDgwOTQ5NTgvOCk6ODsz +OTFAODs6RzlVUUVLTkBXVUFUTENTT0JTUkJTUEJaVkRXVEJZVUVYWENaT0pZUUhXU0NZTkxW +VEJcT01XUjtdVktXVkVcUU9bUUdZVU1eV0hfVUhaT0JaXEhgUEZdWkhaV0dZVUZcVkpcWUJT +UkhbT0VgWEhhVEVYV0ZeU0hWWUNdV0dWWUVbQDtPQjtXRTVKTEJ4c1V6dF12c12Aclx9b1F8 +dF91dlp9c1tqc1d2cltwblN4clp7bFZ4cVx3eVl3dlx2dlV2b1pzdV5zcVt6c114blVzbVdy +cFd3bVh2cVxvb1V0blhta1J3a1publBuZVVubE1walNuak5ybVVobE5salNuZ05saVNtZU1s +alBxalJxaVBpaE5raU9laFFpalFpaVBraVBkZ1BmaFNlY0xsZlBjZU5oY1FlZkxnYk5jY0hc +Wk5HQDw8ODk7PDc3PTA0OjQ1OTg7PDk5PDk0Ozc4PDY3OTE/ODo4OTQ7PDkzPDM9PDkyOjM+ +OTUxOTU+NzY2Ozk5ODg5Ozc2Ozg4Pjo1PDk6OTg5PjU+Ojg4PDk6Pjo3Pjw7Ozo7OTw9Pzo7 +PD05Ozg+Pj09Pzk8QT88OTY9Qjs5PDk8Pjo+PDs4PDg+Pj48Rjo9PTg4QTdCQTw/Pzw/QEBM +VT75/bX////////9//n+//z///3///////////j2/vL2/ez9//b1/vHz9uvw8e/y8eb7//P9 +//n4//Pr+Orp79/g8tzi+dbj9ePp99/g6dvx/+/v+e/x/fH69eru9uru/+rt6+To8+X7+vvt ++uLq9ujy//Dp9+Xt/Ovy/vL5/+/4/+vt9ubx+uXs8+vo7uXk9ePt7+ry/+v2/uzs/+n0/efg +7tZcR0Q+QDdJPT03QDlFPjg1PTs8OzY5Ojc8PzY6ODo7PjE5ODY0RDQ9Pjs1PDQ9Ozc4OjU6 +OTI8QDU3PTI8PTM9PDU8PTc8OTU/PTU2NTE8OzU9PTE7QDhCPDg7PTg/QDU6PDA7OzI7PzRC +QDg7OzI8PDk5PTQ/OjY7OTM+OTc4OzdGOTk3ODI9PDE8OjI9OjM4NzQ/Ojk8OTE1NzI9OTU9 +Ozs4OjI8OjI4OS5COzQ6PTA7ODc1PjRBOTc4Oy85PDgzODFBODc6Oy8+OTQ3PTY1OjM4PTU3 +PC42PDQ3NTU1Oiw1OjEtOS0yNzMvOTBAOjc7PzFGPTo4PjBENTo0PTJHQDc+OjZFPTQ3QjVF +QDk8QTdAQjk/PDc7PTVDNzdBPDo7OzY7PjM7NzE4NzZAOjg/Pzo4PjQ4PjU4Oiw9OTk1OS89 +Pjg7Ny0/QD85PzM1Qjk9OzY2OjQ8PDY2PTU5OTk6Nzk6OjQ3PDg5OTg2PDQ3PDc7OzU3OzM4 +ODY3OTQ5OTc7PDY/OTsyPDc8ODUzPTM5PTEzPDc5PDE+PDM2PTc+Ojw5OzI7Nzo3OjE6ODs4 +OC43OzQ3QDg4PDg5Ozk2OzI5PDk3Oy46OTg8OzM5Ojw9ODk0QDg4QTY1PDY7PTk0OTM3PDky +PjQ6PDkyNzA1OTgzPzI2PDs3PjE2ODUyOzM4PDY2Oy42PjY4ODMzOjQ3PDc3PTc1ODQ7OTo3 +OTg4OjU1OzE4QDg2Pjg5PToyOTM6ODszOTM5Ozs3PTA2OTsxPDQ0MzcyNyw0OTczNzc6ODAw +OTQ8QjRRTkBQSUdMTkZSVERTTEdXVUZQTkJVU0ZTVkFUUU1UVkJbUkhSU0ZbVkdVU0FcVEZV +UktZU0dZT0hbU0VZVEdZVUFVT1BfWkxbWEtWV0xZW0ddV0lZVEdbU0lcVj9kV0xcV0RhVU5b +V0VfWEpfV0NYV09eU0VWV0ZVVktZV0RhST1ORzRUOz1KUzh+c159flx7eF9/dVt3cFmBeFVz +e2N8dlVyc1d7dFducFl7c1dzc1Z8d1l2cVt1dFV1cFducFJ2bldybVN4clZzbld3bld0b1N3 +d1l0cVt0cltwb1NubVN0b1Jzb1ZrbVluaFZubFRvaVBvbVJybFVqa1RubFZtalBsbFdrak1w +ZU9obExqa1NoaU1kZ1BrbFJoa1FjYk5mYUxhZExqZ0xoYUtoZU9pZk5iY0xjY0pkYUhkVUpA +Ozw1PTQ3OTU0PDM5PjQvPDA5PDg2PTc8QDk4PDQ8OTcxPTE2PzkzQDM8OzcxOjc3PDI4OjM0 +PDU4PDIwOzY4PDQ2PDc1QjU1Pzg2NzQ+ODY1NzM+OTw0OjM6PDsvPTA8PDcsOzJEPz44PTo9 +Pjs3QDY5PDw3PTU0PzI+PTk4OzhAPjk3QDo6Ozg7RTk2Pzk+Qj4+RDk3QT88RDNEQkdGWEPo +9q/0/+r0/+/y/+j3/+38//X9//r7///3//P3/+/8/+37/vfv/+z5//D9//z6/+/7//b1//D0 +/+3w/+zu/Ofj7+Tg5tHj8dzn++Dc69jj9uP08Obq79/k9ubw9ero9+j6/vX8//H08+jy8vD6 +7/D09PLw+fD+/vvt8+n2+/P1//T7/evq/PT+//79//v///Hu8O729e3i6OX08ub59/Dk1tNZ +R0U2PzQ9OTo1QzM9PjgzPjI6Pjc2QTI6PDc2PTU4PDc6PDQ9NzY2OzQ9ODI4PjY6OjI4Njo1 +OzQzPTY+OjUrPjM8NDg2PTU8OTo3OjA6OTgwOi0/Ojo2OjU7NjY3OzQ5NzY1PTE4OjM2OTM7 +PTQ0Oi8tOTQ2OzY1ODMyOjI6PjY4Oi87OzI5PzNAPTY2PCw4PTYxPTA9NjY0Oiw8OzY1OTI9 +PDYyOi82PDY3PDI8OzE8OzM4OjI2Oy81PDU3OTU4Oy82OjA4OTMyOi84ODM3ODU8NjU2OjE/ +PTgnNTE7ODYsPDE4NTUtOjQ0NjMzPjE2QTQ9PTI6QTc5OjUzOzQ/ODY3PjM3PDQ8Pjg6PTY5 +OjU8OzBANzk5PDI7PDc6PC85Pjc6ODI3Ojc1OC43Pzs3PjQ6Ozc2NTc2OTU6NTc0OS44OzE5 +OTI4OTc2OTU6NjY5ODc2PTA7PTYxOjU1OjcvOjMwNy80ODQ2ODg0OjM3OjE1NjU2OjE1Ozgw +NzA1ODU0PTY1OTYuOjM2OzAuPjQ3OTEvPDQ1OTIyOjgvNSs4OTkzOC4zNzY2NzM1OjY1OjMy +PTc0NzIxPDQ5OzcvOzM5OTkvPC00PDQxOzAzOzYtPTQyPjgwODQ0OjcwPDEwNjYzOjE1PDg0 +OzQxOTU7OzA1OzUyOS01OTcuPDQxNjMwOjQ3NjczOTQzOjoyPCw3PTUyPS40ODctOCw2ODkt +OSsyPDgvOjM1Ojw0Ojg5PCgwOzgyOjguPTg3OzIzPDI0OTAtOTA2OTQrOCczPzgtOS80Ozky +QjFMTEVJUztST0ZGUEBXUkdQUUJVU0hTU0dNVEJWVUVVUkBSU0ZXVUBTVUVXU0FRU0lYV0hS +TkJZT0dSU0dZV01aWENXUE5TWEFVWkxTVkVaTkhWV0FVU0dXT0tWWEFYVUVSV0VaVEpTWEdW +WUZZU0FYVElaVUBSVUJaVkBTV0lZRDlKSTdPRThIUz95dFZwd1t5cVp7eGB2dFlveFlxelx8 +d2Jxdlt7dFxxdlhzclxuclF0cVFzdVN0clhzcFhvcFRzc1h0cVlxclltck9ybFFsdVFzclp1 +cVd2cVdrbFNqa1Nvb1VpbVFpalRmcVBra1hnaUxwalRka1FoalRpbExobFJmaktpZUhnZ0xm +aE1pZEphY0tjYk1oaktkY09mZU1gZ01lZ01faFFnZFJmY0plaVFcYkdiY01ZZEJXV0o6PTM1 +OTY0Oy80PTgyOTY0PC83OzMvOjQxOzIwPjMyNTI2PDQvOzIzQDYsNjQ3OzgpOis7PjcwPDI9 +OjksOzQ5OjksOjQ4OTgtPzc6OjoxOTo0PDg3OzYuPDIwOjE3PTk2PTgzPDc1OzEyPjo3ODM2 +OTY1PTU3OD0xPDE3Oj40PzQ3QT02QTU5Pz04Ojc4Pjo7Qjc3Pzo/Qzg6Qjo9RkBLYEbf6bT9 +//T4//v///z////+///7//T7//T7//r8///y/eb9//f///35//Px/+/0/u3q+uvm+Nv0/+/q +8uXc7tfb+dzf9tTc7drc6dzV4dXt8d7g6uHg8N/x7+fi59rx+vL6/+ry/Oz9/v7t/+/1/+v9 +/vv5//H1//H///7p9+Xi/t/u//Dl+ejt++Xq/uru++rn6+L6//H9//3////u+enc2c9NUUNB +Q0E7QDNBPzs0QjQ/QTg3PUFBPjo6PDk2PTo9OzQ3PzM1PTpAPzU1PDI6OTQ0QDQ2OzYxPzA7 +OjUzPC49OjgxPC48PD4xODBAOjo1OS06PDk1PTE/Oz08PDI2PS45QDE5PjQ7PTQ6PTQ0PjQ3 +OjA4PTY6OzgyPTA4PTUxPC9COjIwPS49PzQzPTA8OzM0PTJCOzc1PDI5PjM6PjQ4PzE6OzM2 +PTQ4PDI3PjA7OjM6PzU4PDM3PjE4PjI6PDcyOC85OTc3OzE2PDk7Ny86QDk4OjA3OjM1Oi8y +NTI0ODUxPC41QDQsPDE0QDQ2PDE6QTg6PjU4OzQ6PzQ8PTI6Qzc5PTI1OTI2OzM7PjU5Pi88 +PC85OjU7PzIzPjY4PTQ3PDQ4PTA6Ozc4OzI9PDU3PDA9PDczOzQ8ODU0PTY3PC87OjQ6OTAz +PDI9PDM0PDg2OjQ3Ojc2Oi4zPjI2Pjg2OjIzOjQyPTU6PDkwOyszNzgyPDI8OTkyOTA3OzUx +QDE8OjgyPDM5PDM2OTE6OjQ0PDQ6PDk1OjIzODYyOTE0OzMxOS8zOzQxNy43OjEvOzE2Ozg2 +RTQ3PjUwPDI0OTgyQS82PDU2PS02OzkzOjE1PDg1Njc2OzI3Ozc2OzM1OTYzPDQ0PTUzPTQ0 +PTUyPjIvPDU6QTkvOzA2OTgqOyg5Pj0sOiw2PDcsOzE2Oy8xPzM0PTYyPDguPDY1QTYzOyw1 +OTsxOTM1PTU1PTk0ODEyOzQvQTU0Pjg1PjE0ODcvPDI1PTEwNy4xOjYuPS8uOTU3PDI6RzxP +ST5LUEJXUkNPUUJYUEVWVD1ZVEhXWEBQU0JXV0BXWUhUV0VXUUtXWEVQVkVcVkJPWUpaVkNM +UUdZVUZYWUtXXURWUEVVW0VaWE1SXENZV0hXWTxYVVBWWEhcVkxbX0NYUktVWT9aVkpUW0Za +WUlZXEZXWkpSWUNWVUNWV0VWSzxJSjtSQTdMWT52d111c1t4dl14el14b2FzcVZ6eGF2d1p4 +b2J1fVl+c2BueVl3dFtxd1lzc1dzcVZzd1p6dFZxdVZzclhzdVZtcFR1cVxycVhzc1hsblZz +bltwck1ya1RvcU9xb1hqblRwblpxb01tcFNqb1JpbU9oblVlalBqaFFlalBubFJsaU5naFJs +a1Bpbk9taFJlaE9mZ1Nhbk9paVZcaU9laFFhZUtmZ0hfY0tnY0poYUtgYkpaUkk5PTgzOjYz +PjU1OzQtPDAzOTQ0PDQ3OjE0PDcyOzAwOjY1ODI0Ozc1PzI4QD02OTQ2QDk1PTQxPjQ1PzEz +PjY3PTcuQDE5PDUzQDM0OjUyPTI6PDYxPzU6PzcxPzMzPTQxQDo1PTY4OzI5OzU1PzYxPDY1 +PjMzPjkzOzM7QTozQTU4Qjc1Qzo9OzkxPzc8QjgzQjU9PTkvQjk8QzhBRkZPZkX6/rn9//X/ +//3////+//r+//r///z///X7//r9//jy/eX8//r4//X6//Tz++73/+/8//n2+/Hl8OHe7dXs +/Ofo7+zI5cTh79ba6dbi9d3u/+3x++3y/e3p/+v+//7y8+Pt9+rt+eXs+ebq8uP9/f37//Hp +/efr9+vt+er4+O7q+u70/vH//fL18ur7/vn5+fjq6uLr8dzk8tzm7N3j6tre3NBUSkRDRUE3 +QTZHPDw2QTU8QT42PjFHRj86PjQ9QTw7PTE6PzY+Ozg2PzQ/Mzk9PTQ6PDc4PDI7PjQ3PDE2 +PjU7PzM0QTE8OjUyPjQ7PDg0PThBPDY4ODFBOzs3OjQ9PDI6OzU/QjI7PjU6PzNAQjY0OzQ6 +PDQ0OTE9OTI4PzI9OjU3PDM3Oi84QDM+OjA8PDQ3PC48ODg7OjE8PTI7PTI3OzU8Oi88PDM9 +PDQwPTQ7OzA4QDQ8ODYzQjM9Pjo6PDQ+OzU9ODQ9Ozg6OzU+PDU4PTM2PDI5PjE4OzA6OzMy +NzNAQjk9QjY0Oiw1ODk4PS4/PTU6OzE/PTI1Oi9BPjs3PDJBOTU7QTVCPj43OTJCPzY7ODhA +OjQ7QDVAPTRCPjk5PTQ9Ojc5Pjc6OTA+PzY6QC9ERDYxPDQ+Ozg0PDA+PTUxPSk6PDowPjU/ +QDQ4OjJBNzE1PDg6QDM5PDQxOzg1PTM4OTA4PDQ2OjY3ODY2OzgyPC02OzQ6PzE7PTQ2OCw7 +OD0yPTM7ODk3PTA3OTo0PDE5Njs2OzA/QTs2PzI3PDI4OTU1Py42OjU4OTQ5OzY5PTQ3Ojg8 +Pzc0PjI4PjMzOzQ9OzozOzE4OzMwPDA5PTYxPTU7PDg4PDo2QDU2Ojg7PTI4Pjg4PTE4Ojs3 +OzQ6Ozg0QDI6OzU5OzY1Ojc1PTU0OzI4PjsyPTI3Ojk2PS84Pzk1OjA2OTk4PDI3Py43OTY5 +PTs1PTUzPDM2PTcxPjA4PTgwPDM6PDs1PSkxNzMyODI1OTg5OzM0Ojs8OTYzPDo6RjVRUEZV +VUJRVUZRVUJZTkNQU0BbVUhSVUNWU0VVWkVcVEdeUz5ZVEZXU0JWVkhTUz1cWkxaV0ZaWktT +WEFYWU1ZVU1ZUzxaU0pcWEJVVkVcWkVXWEtaXEpWVUdiV0lZWERiWktXVT1hVUdVW0FgVUlb +XUZcXEVWT0JcUklZVEFXRDxPQTtPRTlMXkJ0elZ4eFV+dV91dVh1d195d111dl11eFp9cV10 +c1iCdV1zdFR9c1p0b1Z7dGB3eFd9bFp6cVV6c094c1l2b1twcFVyc1hvdVdxdVJzb1ZybVFz +b1V1c1htbld3cFRtc1hzcVRoaFRucVRoalN0bVFpa1RubFFqa1Npak5va01raU5ra1NnaVJx +aFFgZ05taEppbFFnZ09sak9mbE9kZ09oZ0llY09qaEtiYU5qZ0lmY0tTU0A+Pjk4PDM3PjU7 +ODE0QjA6OTUtOjM5OjU6OzY4PTgwPjU9PTk4PTc7OzU1OTM2PTY1PTc8PDk9PDs5Pzg4PTE6 +PDg3PDg4Pjg0QS86Pjk2OzU+PTk3PTQ8Pjc1Qjc9OjwyPjU/PDcwPjU6PzU5QTI7PTY9QjhA +QDY5Pjk7PzE8Pz48PjZDPTw6PDo6PTc9Ozg4QDQ9OTw2PjVBQz5BRTtSXkjf7639//T+//35 +/PX///////z///39//n5/e31/+z6/+ny/en0/+/6//by+e32//H5/+72//Tz/+z1/+vq+ujf +9ODt/+Dz//Dg89bc6Nbj+eX7/vP1//Lq9ebd7eLr+uj+9vzs7+L18vDx/Ovt+efs8+3y8+34 +9+/0+fT///7///fx/uzz//Hp/+Ho8OHh9uTs7OX9+/z19fD9/vvy9+vZ1MtXSUdARDxDQDsy +RDRBOTs6QTZBOD47PTQ8PDk0Ozg5Nzg1OTJBOjk7OjY2OzM8OjU6Pjc6OzY6OTUvOjg9Ojc2 +NDQ+OTo3ODg8Ojg2Ojk+NTs0OjdANjo5PDtCPjs2PTE8PDw7PjY2PDw5NzQ+OTM/Njo6Ozo8 +OTk9NzY8Ozc+Pjg7PDQ9ODU4OjQ+OTo4OTI8Ojk5OTVBOzY2OjFBNjo0OjRAOjg8OjlFODo7 +OzY8Pzc9OjU6OjVAPDo7QDU/PDY7OTo/PDY7Ozo9OTJBOTdBOjM8Pjk6OzI7PDo0OzE4OTk7 +ODVAPDw3NzU7NzhCOjo6PjRAOjY5OThCPTw3ODY+PDk6Ozk9PTg9OTZEPTo8OTU8NTZAODs9 +PDZBOTw8PjU/Ojk9OjU8PTc6PDg6PDI5ODs1ODQ6Ojk3QDc6Pzg2OzRBNjk1Ozk6ODs4PztC +ODQ8OTY+NDo6PTk7OTQ7Ozo+PTU8Pzw6OTg2OTk6OzQ3OjY4Ozs3OTc5ODo3OTQ4Ojo3OzE5 +Nzk5OjQ+OTg0OjI5Pj0zOzM6Ojk2Nzk+ODo7Ojk8Ojs5OjQ3ODs8Ozs6PTk6PTY8Pjo2PDY1 +Nzo1OTk7OTkzOzI6ODsyODE+NzszPDE+ODw6PjA9OkA7NjU6PD42NzU3PTY4Njg1OTQ2NjI5 +Ojc6Ojk6Njg4PTY5Nzc3PDc1PDUvNzU4PTg0OjM9ODszOzQ/ODwxOTg9OTsyOjU7Ojc2Nzs3 +PDc3Ozg5ODg2OT0+PTs6NzQ4OTY2OTk0OTQyOTQ2ODc4NDE8NT03ODU2OTo5TDNZTk1PUkJT +Tk5UVUNVTE1aTkVRUUtZVUlSUD5ZVE1XT0ZZVE9VTkVaVEtcVENXVUhdWUBbVUxfW0xXU0xd +T0dTW0liV01WUUpaWU1TVkhcV01dVExbVEtiVkNcVkdgUkpWU0ZnVE1XWEBhVkxbWkdaXE9f +WkVaVkpbV0NgVElSQ0FRRD5PPjtWVkR6e2KCd12Abl18eWB4eF17cVpzd1t+d2N1eluCc2B0 +cVx4cmF5cVp7b15zb1Z5cWJ1cV14dF10cViAcFd3cFl3b1h6c111blp3b1lybVZ1cVl0cVhw +cFh0aVVtbFh2bVltbFZya1Zua1FyaldscE5yZllxa1JraFVrZk5qaFRoZlVpaVFualRpalJp +Yk9raVFmZ1ZrZFFpZ1JpaFBkYk5uZU1oZU9sYlJhX0ppYUxeYkpeTkk1PTxBOzg7Ozs/Ozg0 +OTY2OTY3OTc6OjE7OTw4Ojg4OTk5PTg7Ozk2PTk2PjY5ODo5PDg9Ozw7Ozg5Ozo9PjM3Ozs6 +PDo3QD49OT47Oz08Ozo1Ozk/OTw6PTk5Ojs7Pjk6OT4zOzk7NzwwOjg5PTw6Oz07Pjw8Oj05 +Ozs8P0I8Ozo/PT0/Pj9HPkA8P0A9QT4/RD88Pz1BQT9CQD5FR0JRZETw97////34//D0/+jy +/+bw+Oj4/u3////////5//X0+e39//r////7/Pj1+/L7///u+Ort+unt9urr+OX2/vPt/+jd +9Njf6tji5dnb69vx/+zp8ebt/O3s8ebl9OT7/f3v+9/9/v3///f8//fm8+D2+/D3//nx++7s +/vL3/+vx+ejq9eXk8eDv+en9/vf5//Ty/fj5/+71/+/2/+/l59nY0cxLSjxJPj03PDNBPTo2 +Qjg8PjtAOzgqQTc6OzY2PjU5PDg7PzU1PzQ3PDo1PjI9PTYvPC86Ojo1PTQyPjcuPS47OjY0 +PS44Pjw2OzA3OzgzOTM7PDk6PjY3PTY8PzQ6OjU6OzQ5PTM2PDM9PjE1PTE3NDgyOzM+Ozc0 +OTQ+OzszPTU9PjYxOzI/OTU0OjY4QDI2PDY0OTc7Ojg1OTc2PDo2OjM8Ozg2OjY5OzY6ODY4 +ODY7QDU8NjE4OzY5OTE6ODo2Nyw7PTY4Oy01Pjg5ODM6PTM7PDY7PDQ7ODkzPDQ3OzUxPDI5 +OjgyNzQ6PTg1PDI/PjY2PTo8Ojg4OzY8PjU6QTg+OjY2PDA6PTQ/PTM1ODI5Py88Pzg2PzQ2 +PDQ4OjE9Ojo4PjE8Ojc1OzBAPTk1OzQ7OTk1OzQ5PTMzOjg2ODA5PTU5PDU0OjU6OjY1PTY8 +PDI2PzU4PDU8OjU8PDk2OjM1PTcyPjM6PDswPTE4OzgyOzE8ODc2OzQ9ODQxODk2OTk2PDY3 +OTgyODA4OTk3OTQ5PDo1OzIyOTU3OzA2PDYzPDQ0PDUxOi44OjEuPy81OTkyPC87PDYzOi43 +PDs2PzE4PDswOzA3Pjo5OzcyQC4zOzI0Pzg2OTM0OzU5OzkzPDU0PDc1QDY1PDU5OzYyPjE5 +ODcwPi46PDowOTRAPDkvPDQ8OzY0PDU7OjY7OTs3OjgzOzMyOjM1OzcxPjAxPTcwOzQzNjkz +OjQzQC82PToxQTQ3PTkyPDQyPjYzOjEyNjswOi0yOzgzPy8zOzg0NzEyRTZUTT5PUUBRVEZS +T0JZUklXU0ZXUkdUVkBXVkVZVz5TVEJbVUhUVU9cVkVPVEhbV0NQVUlgW0JZWEpXUUdYWUdT +WEFaXEdVWUVhW0hWW0VZY0pZX0VbYkxVWkxeVE1YWkZaX0laXEZgV0lZW0NYV0ZaWUdhW0Fd +WkVWWUFaVUhVS0BKRDhRQThKYD54d1t2eF19cVxzdll6dF50dVN8clp1d1p/cV12cl94dl5x +dVp4cFZ0d1d4dVp1b1hxdVt1d1N5c1ZxdFp7dltwcVp5cF1yc1V0c1dsdE94cl1sb1V2cV1q +bFF0c1lubE9vbVlwblRxblRwa1RxcE9na1FnaE1pbFNpa01pbFRrblJqbFJna1FmaU9sZlBk +a05paVNjZU1rZlFkaU9valVgaE5qZ0xgY09iZE1hZE1jYUlaSEo4Ozk6QjQyPDc3Pjc2PDY1 +PTYxOzk6OzU7PjY3QS01PDk1QjQ4PzkzPDY8Pzk2PDI0Qjg1OzcxQTc4PT00QTY6OjkzOz07 +PjkyPDQ6OjsyQTY7QDkzQTc0PjQ3PTg5QDc4Ozk1QTo4Pzc0PDc7QTY1PDg9PTs4PT00PjQ5 +PTs6Qzg8Pzw4Pjg8QDw4QzhFRjw3RT08SD0+Rj4/Rj48RT9QZETq9Lr+//j7/fX+//r+//v/ +//z////7//z4//D///z//vz///76//f3//H////4++/y+ufz9erm8t7x/unm9eLf7dzN6Mnb +6tfi8tfh7eDv/+zs9ejk9/f///zy/fT1+e7y//Dt7dji893w+Obs+unp9OPs/en4/PD9//ry ++ezw+fD69+79/v3///X1+/Ly+e737+rs8uP+/fr1++3t7N7d18tUQ0VARTU9PT5CPTg7PDc6 +Pzk8OTM7Pzs2QDI8PTs9OzQ2PTQ6OjQ2QTQ7Ojg2OjQ/OTsyOjM5OzowPzA2NTQ4OC8+QTw2 +ODM8OzgwOjM3NTQ3PTE8OjQ9PDk5OjY7OzU8PDU2PDA9NDY1Oi88QDU5PDNCOjYxOjA/Ojo2 +OjI/PDY1OjE5ODg4PDJAOjU3Oy49PDU3OzI3Ojc5OzQ3OjM3OjM3PDU4ODQ7OjI5OTQ/OjY9 +PTM6PDgzOTA/OTc3OjI9ODc0NzE/OzcxODFCPzg9OjRDQDs3ODY4ODM4NTg5NjcyOTUvOjQ6 +OTU2OjQ7OTI3OTM5OjM5PzQ8OzQ+QDo8OzBDOjs4OzE7Ojk6NzBAPDk7PS04OzY5PjM8QDc9 +PDc6OzM9OTE5PzI3OjM0PTI5PC83PDQ1PjQ3NjI1ODM5OTQ7PDU/ODw8NjM9OTg2OzU/OjY1 +Ozk6PzY4OjY6OjU2Ozw1NzE6ODc4OjU6NzU2OjM7OzcyOzY7OzYwPTI5NzU1Ojg6OzE8Njo6 +OjM4ODY7OTI2Ojk2ODQ4PDU5OjU2OzY7ODg5Ojg+Nzk0PDU3PDgwOTI8Pjk0OjE5OjQvOTQ7 +Nzk0OTM7ODwzOzc4OjQ1PTUxOTg1OjQ0ODc3OTg3NDYzPTQ3OTM4NjY4PDUzPDE7OTk0OzE6 +OTI2OTI7PDozPy86OzU3OS07OTk6OjI6Ozk1QDYzNyo3OTo1ODMwODY2ODMyOzI4PTY6PTM1 +ODM2PTE5PjgwOys6OjovOjA5OTssNSo7PjgwPjc9PTUyOTU2OzQ8QTtMTUZST0FUVUNQT0RY +T0BXUEdUVUVaUEJVV0tNV0dXVEZVUT5ZVERZVkhYWVFaVT5cWk1ZV0ZZV0xaVkVYVEdcVkVa +WEhhWUhZWUZeW0taWUJbWlJdWkJcU0taWD5WV0ReWkJcWUpnVUlXWkphWkhWVEZhV0dWU0lb +VUhZVEpUSDxYSDdIQTVZWUN0dVV7dVl0dleBcV52d1p8c1tyc1d2dVd2dVRzdFx7cVd6dFly +clV6bVZ5dVt4d1Z0dFp0bVRydVZ6b1lzcFh8bF5ycVV2cVVtdFF1c1dvcFZ1b1prblJxcVZu +blh5a1psalFxa1dxbVVubFZva1Rna1BoblVtaVFrZ1FoalRpbE1wZ1JqbE5tZVFlZk5nZ1Rn +aE5qYVBpZU5pZ09mYUliZE1lZUxoaE9iZkxlaFJjYUlXSkI9PDM5OTU5OzQ+PDo1OzU1ODI1 +PTQ3Ojk2OTU9PTkvPjI8ODYuPC8/OjgzPzM9QjU4OjQ5PTU2PTY4PTc7PDc5QDU2OjU2QDkz +PDY0PTc7Pjs1PDc4ODM5QDc3QDU5QDsyPTI7QD81QDM7Pjg5PDE7Pz45PDc3QDY+QDg2Qjc+ +Pj06Pzk8RTo5Pz09Qjo4RDg+QDs9QTs9Qj08Rz1AR0FQa0nv+sX+//X///v///////////36 +//z5+/P9//nw/+3v/uPz+ezq9OX0++v6++z1//D7//P7//f9//z5//ry/Orc593c7tHs++vm +897b6tzq/eft/fH+/fHq+en9//v1/+/1+/H1+ebx+ur0+u/t9vDy+eXy/PH6/erx+uzx+Obz +/u74/+/m8t7q/uzt9+X0++ft8+f9//7///Lv9e3m59fY1s9bSEU4RjxFPj07QTlHPzw2PTk+ +PDY8PTo9PTY1OjU8QDBBPDo6OjM5Pzc2OTQ+OTc1PDU/Qjo6OjY1OjU7Njc4PTU5PTg7PTI6 +OTM5OzE1Ojg8QDo2Pjg9OTQ8Ozc+OzM6QDI6PTg2PDE9OTU2OjI5OjM3PTI/OjYzOjM+NDg8 +OzE9OTk0OTc+Ozk6OjU/OjQ6QDU7OTNAOjM6PDU4PjM9Nzg9OjQ9Ojo4OjQ9OzY2OjU8Ojcy +OTE+Njc8OTBBOjg7PTI+OTU0PTE9PjY8ODRBOzo8OTc8OTE1ODE2OTM4OzI2PjI7PjQ9Ojc1 +OzI9NzQ8OzM5PDU2PDJCPTk0OjFEOzc0OzNFPTkyOzJEQzk7PDM7PDU8ODM8QjY7Ozc7PTI9 +Ojk3PjU8NzA2PjA9ODM5PDo8PjA6Nzc1OzQ8Ozs0PC47PDY2PSw6Ozc6Oy82PTk6OTI3OTM2 +PDQ5PDZBOjk2OzM6ODY7ODY4ODg1PTc6OjA4OjQ1NzI4ODQzPDQ5OjQ0PDRANzg4PDg+Pjc0 +OTU/OjU3PTY9OzE5OjY2PzY9ODo5OjM9OjQzOzU9PDU4PDM4OTU5Ojw4PDM3PDU8PTQ7Pjc2 +PjE2OTM6OjM5PDo3Ny02Njc4PTY3PjQ7OTI4PDU7Ojo1OTI7PTw5PDI9Njw5OzE+Pjs7Ojk7 +ODs8QDY8PDo3PDU3ODo4OzU5OjQ7OTQ4OTU3PDM5ODgwPTU3OzM3OjQ5Pz0zPTQ+Pjo2OjQ8 +OjU7OzM4OzoxPTI5PT0zNzA5Ojg0Ni02OzguODI0PDMzPzI9RDhKTT9UU0VTTkJWU0RXVkJV +TkFVT0dVVExTV0JbU0xUUkNhVklSV0ZeVEtVU0VcU0VVWEdfU0dfVkhWX0lcWVBcVEhZW0tb +WktfV0ldWkdeWkxdVEpcWUlaVU5jWkdaV0pWU0RjWE5ZWEdhWkpeW0RfWU1bUT9jV0tdWUNf +WEZWSjxMRjlUQzxZXT97fWF+eFp8d1+AeFZ9dFt9dWBweV6CeWBucFd9dltydVx6dF9vdVR9 +c1t1d1l8cFd8dld6dVZ3dFx1d1t5cF9xc1Z6dlx1eFl6cFhycFJ4c1d1b1V4bVVya1V2b1Nz +blR1blFtbFNzbVJwaFdwZ1JybVZvaFZta1VralJjaU5sZ1VlaE5xbVVoZkppaVFuaE1tZ1Fo +ZE5rZ05raUxqZ1BpZk9qZk1pZktiZU1qY0lhWUtYSUY4Ozs2PjA8OzQyPDQ8PTg2PDQ9Ojk0 +PTQ9Ozg2PTU+OTcvPjE5OzkzPDM9Pzc2PTQ4RDc5PDs8OzU6Pzw4Ozw+Ozo8Pjo7Pzc8PDc2 +PDY8Pjs2PjRBOToyOzU/PDg4QDZFQD0xPzhDPTozPTdDPz06QTxCRzpHRUA8Qzo9Pzo8QTk+ +QDs7RjlARTo7Qz1ARTs+PENDQz0/PUI+QDhESURZekjx9839//b9//j2/+79//r+///7//H/ +//////f///j////////9//j9//zz//nx++z3/+/0/O7u+Ofy/Ovu+OPk9uDj8dbg7trd69Pc +69Xy/+rr7+jf8N79/fv19efk/OTs/ODw/+/+//71/fHx/PLk++rs+eHy/vHx//D6//ry//T5 +/ffw9+z5/vv///////v///vx/ezp+Of99u7m6t7t6ttOSEZFQDw7PTs/Ojk6RDo8QDYvQjg6 +Qjs6PjQ6OzgwPzE8PzY2QjA4OjczOzI4ODo3PTg7OjctPzQ4PDQ3OS83ODM7OzQ3OTgyOzc5 +PTUyPDg6PTc0PDQ8R0BAPTVCPjkyPTg/QDo0OjA9PTctOjM7Pjc3QDI4PjU2PC46OTY1QTc1 +OTA4OjU2PDMzNTQ2OTQzPTM6OzQyOzQ6OTM1OjM/ODg0PjE7OTUwODA6PjYvPTI8ODUvOTM+ +OTcwPDU5OzE4OjI1OTQ6OjQ1OTc3PzQ1PjY6OjQyPDU5ODYvPDU2NzMvNzczOy04ODoyOjA4 +Ozk0OTg4ODk6OTA2PTs8OjY1PjM1ODQzOzA2OjQ2PTQ6OzQyPjE5OTc7PDY3OzQ0OzI7OTY3 +PzE5NzA2OzM2PDI3PzQ0PTQ1PTU4ODM8QDgwOzM4OjA2OTQzPDA4ODcwPjE1OzgyOy85PDI1 +QDc5PzYvOzM2OjkwOzQ1ODExOTozOjQyQDYyPTQ0PDM2OTE0Nzc2OjE3Nzk1PjovODQ1Nzc0 +PTM4ODUzPDM/PjszPzJFP0A1PDI4OTcuPC81OzoxPzkyPzYwOzM1Ozo1OTAtOzg1PzI0Ozcy +PTQ1OzY2OTEzOjMzOTQ3PzkvPDQ2OjYvOi40OzQxOzA3PTouOy45Oj03OjM6Ozw2OjE1ODI1 +Ojo3PjgyPjg0PD41OzU1ODczNDk2PDI2OTQ3OTYzPTM1PDUwPDU5OzouOzA9PTs1OzY7Ozkt +Pzg6OTYyOTQ4OzgsOTUvODA0MDguPTEwOzYwOTAyOjg6RztQVUdUTUJSUEdTVE1TUUVUT0tR +VUZUT0xSV0JTWUpZU0VVVUtWVkRVVU1cVElWVUdWV0ZXV0JcU0dXZEZcUUpbVkdZV0xcW09Z +V01ZV0NZWU1gWEpXVVJeXE1VWElfW0dXWU1dW0VZWUZcXEZgW0lbWkFcWEpVXEJYW0xXUEFX +Q0JRRjVVQUFYWUJ0eGF1dl90d1Z3d1V5dl1+d1x5elp5dl93elV1c1x8cl94eFqBd1t3dVly +cldzeFlzdFx0c1l1dlxzdFV7cl9wd1p8cl9vclp2cFlvblp2bVlvdVpxcFVyb1tqbVlwcVhx +bE9qalVrbVNubFRubVZva1RxblVqb1Vra1NpbFBxaVZnblBsaFpiaU9talNsbE9pZlRnaVNj +ZU1oZkxfaUtpZk9qY05kZE5hZExfZEtiYkdVTEU1OzoyPjQ0PjcuPTM5OzsvPDNBOz4tPDM5 +PjksPTI4PDk1Ozc1PjAyOjY2Ojc4Ozc2PDgzOzY4QD04PDk4PjY2OTgzPTU3PjE2Pz01PS43 +Ozo3QDE9QDw4PjQ8Oz08Ojk2QDk8PTs7RT8+REE5Qz88QD4zPTs8Ojk2PTg6QTg7Pjw2Qjs5 +QTo1Qzo7Pjs2Pz0/RD09Qz48R0JART9JR0JMYkzr+rry//X6/+3////8//vz+en+//v7//n0 +/u/4//b2/+X1/fXt/+X8//b4/Pjx+ez1/vH5/+/0//Dv+ufh9eLg9t7c99Xn9trk8ePh6N/v +/+n4//fx+/T3/+74+e/4+O3z9vPy8+Po+ez+//b5/+zz6+zk8uPw+Ozq/ubq/err/Of1/vX0 +/ez0//P0/eny/Ovt6OLm8+f8/fLz9evx9+rd3cZSR0k/Qjc6Ozs7PzM0OjU8PTctOjY/PTYu +NjM/PDgyPTNAOzMzODs7PDg2Ozc0Oy46PDQzOjA8Ojo2PTM2ODcwPDQ3PjY0ODc7OjkyPDM0 +OjQ2OjQ4OzY1PDc6OjQ3Pjk5OjQ6Ozg0OjI6PDk+OzU0PDQ4OTUzOzc6NTg2PjE/OzkwPS84 +PTgwOjM5NjUzPDE4PDU1Ojc6ODUxOzI7ODUxOzI1PDQ1NzMsOTc3NzY4OjU3NjU3OjM2OzE8 +ODQ3OzU8PDYyPDQ5OTQ1PDE7OTU2OjU5Nzg3OzI5OjcqNzM2NzA1PDQ3OjEwOjI0OC44ODY3 +OzUvOTc5Ojk2OzU2Njk1OzE4NjMyODM7OTcyQTA7NzgsOjA9NzUwPzJBQDozOTQ+OzgzNzc8 +OzM1PDI4OjcyOTcuOzM5NDMxOTY0OzQ3PDc7ODM5PTk0ODE0ODU4OzQ4OTozPjc7Ojo1PDA7 +Nz03OTA0Ojk2PjkxPDQ4ODc0OjM6Ozk0OTk3ODY1OzU6NzU1ODU3ODY6Nzg3ODc2NzkvOTg4 +PTYzODQ7OzozOjU3OzgxODU5OzYyOzc0PTk6ODU3PjQ6NzkxPDE5ODsxOi4zPDgzOzQzNzQz +PDYxPDU0Ojc1PTQ1Nzg1ODQzPD06PTQ5ODw5OzU2Ozc3PTU1PzE3ODkyPDs1Oj41NzA7OTkz +PTQ3Ozw1OzY2OTUzNjY2ODk2OTY3Ojg1OjY1NDcxOTc1Ozc3OzYwOTU1PjE1PS8zPDI3PTs2 +OzM5OTgsNy43OzgvPDg2OTovNy82Nzk1ODQ1OUA5STRRTEhMTkNWUUdSUUBRTU1SUEdUVEJQ +U0NbUEBWVUVYVUhTVUlWVEVWWEVaV0pVV0NaWEZUTz1eV0tVU0hcV0tTW0ZeV0dVWUdiX01d +U0tWWkZbWUxXWkliVFFdW0tYX0daW0pYW0haVkdaWUZgVUpYV0hcWk5YW0ZiXFBaVkRVRURY +RjJRQkBZZUl9emF5dl12d1t7c1t7fVp8eV52d1x5cVt6dVt4dVp4elp0cVpyclh1c194cFty +dFh7dFludVh9bl1zcFt6cVh0b1t6dVh2c111dFlyb1tqcVZ0bl1ydFdvbVhqb1FxblZubFVx +aVRybFdqbFZvbldxb1RybVhsaVJtalRxbFNtaFFraE5oaFBqaVJqalBsaVJiaE1paVBjZ05m +ZVFlYUloYFBkYUxlZU5gX0hhY1FjYEhPSkU8PTs5QDsyOjQ2PTU+OTczPjU4ODc3Ozs5PDo9 +Njo2PTU8Pjs0OjQ8OzcuPjQ6PDkxPjY8PjY0OTNBPzwyPjY5Ozg1PDM2PTw2QTw7PTk4PTk1 +PTg+OTk+QTw3Ojg+Ozk5QDg5PTw4RThBQj40PTk8QEAyPTdCPzw0PjdBRDs2QjtCPjo7Ozo/ +Pz0+Qj06Qz1BQUJAQT9AQDw8R0ZBQj5Na0/e7bX7/O7////z//P1/+j///7///////////z9 +///x++P9//j9///n+Ojx+uT4/+z5+vTh893v/uXk7eHk6+Pa6trg8tTo8uXd7tfg69/p6uDk +793u/uzr9+zp9uzw9uz1/u7u/+r9+fnq9Or3/u/z/+z8+vn79/Dt+ef9//3s/enx/Or1/Pnx +8u706ujq9uj+//v5/vr5+e/w8unp+end19BRQUE3PDk5QTU0PDI9PDo3QDc8QDs0PzQ6Pzg2 +OzE7PDgzPTZBOTowNzc5OjY5OzAuOjc1PDM5Nzc2NjU6PDMyODU2PTQ0OjU4Ojg1OzI7NjYw +NjM9PDQzODNAOTo7Oy86OTdNRUk3OT00ODY9PTo1OjYzOTI1OTY5NzY2OTI1OjM1ODM4Njg1 +PDU6OzEyOjA7RjgyPTQ+NTYvPDFAOTkvPDU9ODQzOTM/PDcyPTc5OTU6OjM8OzU3Ojg2OjY5 +ODo5PzY4PTU4OjY5NjM3OTY4OjIzOTk2OTAzOjgyNi80NDgwOzA0NjgyMjE3ND83OjA2OjI4 +ODY2ODQ8ODcxODI+PDgxOS89PDQ1ODU5PDQ0Py83Ojc1OjI1OTIvOjEzPTM4ODI3MjQ3OzM4 +PDc2OjExOTU1OTA0NzQzPDE1OzkxNy87Nzc2ODg6ODUzODQ3NjQyOTI6ODYyOTg3ODc0Ozc1 +ODQ8NjY2OTM0NTo5OzMxNzo1ODUyPDY4PDk1PzQ3OzgyOzM4ODgwOzI3OjwxPTM5NjkwODAy +OjQwOi84PjgvODE5OzYxPDU1OTM0OTYvOi8xOTE0PDQxNjE1OjI4NzE1OTU0Ojc5OToyPDI3 +OzQuPDA4ODo1NzE6OzkvPDQ5OTsvOS03OTo3QDc2OTk5PTg1Oy8zPDkuOjM2OjI1PjMzPDUy +NTUzPDo1OTcyQDE3ODYuNy85OTotOTA2OjwuOzQ2OTgvPDc5Njo3OzMxPTc0OjgzOTE1ODc0 +OzczNDo2OTY3NzgwNTEuOTg6OTc6OjQ5OzcyQjhQTEpPUUVVUEhWUENWU0pQUUJSVkhYT0BT +UkJZUUdTVUZXVEhWVUFXVkxYVj5bUElWV0ZWVklfVktWVkxYVkRVVk9dVUdWVEtfWkNZV0xh +WEVbW0xcXklfV09dWEFZWUtdXklhXk1ZWUVhVUlZWEpZWU1aWEJeUklWWERfVEpPRzVURjlR +SThha0t7eGN6fF51fF13dlR1c2F1bVhoa1J4dF54eFx6dFt1bVZpZU5sblJ8d11udlV5cVpy +clR6cFt2b1d6cVhzcFh9cVRyclp0dVt4bVhvcFhycVR1cFlyb1JqbVZpcFZybFhsblVxbFhr +a1R1a1VrbFFzbVdsbU9ybFVla0xuaFVjb1BsaVZka1JjaVBsZ05raE1pZU9ma05nZE1iaEpf +XktpYE5cZEtjY09cY0tjZ0tcYUlSR0QvPDY+PDwtOjM7OzgwPTU2OzgyPDg0Pzg2Pzk2PDI6 +Njc9PDc6PDczPzc4PDczOzs0OjczPjg3OTQ3OTk+NzQ4Pz03OTQ1PTc3Py87PUI8PDg8ST0+ +Pj86Qjw6Oz45Qjg5Pjk1QzY7QDg2PDk9PD4zQTM6PDk1QDU7Pzc7QD45QTs9QT87RD07QD4+ +OjxBR0E6Qj1BR0FBRkJBQD9AR0RPZUru+bv9/+////7///3////7//X7//X///////z7//n+ +//T3//Xz++j////9//r0/ffv9+L5//L4/fjt/ujp/Ojr/+ng9trZ49rk8OHU4NT2//Pv/PH1 +/fDs+en1/vHt/ejx9er0/vLq/O/5++vy/fL2++ry//X///v8//H9/fzy9ejs/O7v//P7//P5 +//rz9e/k69/z/eru+u71//Tw9unl5c1QRUs6QTo7PjkyPjc0QTYzOzY4OTg6OjY4Ojg1Pjs+ +PDg1Ozs5NzM2PTo6ODMyPDk3NjkuOzU5Oj81OjU8OTctOi0zODgsODA5OTY1PDE4OjQvPDM5 +ODYxNzQ+Ojs0OjU8PDU3OjMvODQ2ODI4QTc3ODY4ODozOjQ2OjUzPTQ2OjQyOjQ3NzUyOTA3 +NjkxOS46Nzc1NzM2PTg0OTE5NzYxNjo2PDYzODUzOjI5OTYwOzQ5OjU1ODU5PDc0OTU3ODQ3 +OTQyOy46NzgyOzM2OTYtOTQ+OjYvODI2NzQtOTU1PDEtODEvOjQ2NzUyOjQ1NzY3Ozg0Nzk1 +OzE3NjMzNzM3PDEwPTYzOzM1Pjg0PTI2OjcyPSw1ODo1Oiw1Mzo4OiwuPDw7OTMzPTI3ODA0 +PDM2OTYzNjU1OTUqODE3OTcxODM3ODE0NzYxODQzODYzNjE5Njs4ODk1ODgzNzU3PTcxNjYz +OjEyNzk0OTY5NDgwPDU6OD01NDE6ODkyOzE3OTUtOjg1ODgzPjc5OjI3PDg1OTQyOjo1OjEy +OzYzOzY2Nzk3OjE2Nzk0NjcyOzM1Nzg0PTU4Nzg1OjI4OzcyNjQ2OjoyOy82PTgyPjMyODY0 +QDI4ODYwPTU3NTczOjIwODU1OzcuPDgyOjE1ODg2NzkzOTs0OTM0OTMwPTE4NTosOTFPTUg6 +Ozg4OTkxOS01Nzs0OC45OjsxOjY2OTsyOjU0PDMyOj06NzU3ODExOjQvOTIyOTcyPDc0OjYo +NzAxNDYqODE+OjgwODA6OzcwODU2OzY1RjZSTkhLUEVRUUVQTUpOUEJRUkpYVUJTUk1TU0NX +VUZXVUdbUU5ZV0hXT0xZVkhVV0hcWUpZV0JUWVBVUEZeWU5ZVT5aWU9ZVktaVk1aVEldZE5c +V01cW09eXEtbXURXU01aW0RfX0tYYT1cVk5bXEdiWUxjXUJcWEtiV0hYWEtUQkFESD5MRjtV +akx8eF59cmB9d1Z4cV95cVR5cV94eFp6b112d1mBeFx6cV15bll2c1x2cVx5c1Z4dVh6cFl4 +cVp5cVtxdFp0bF13dFV2blx1clZvcFV0c1twcVdzblprbFdwbl9rcVdrbVVrbUxzb1h0cFZv +bFlsbFBza1Rrak5ralVrblNralZwalVlbFRsZ1RraVRuaVVpZE9mbU9wZ1BqZ0tiZ1JhYUpo +ZVNdY0poYlFdZUtlZE9fXkdOQ0c0OTU5QDY2PTY1PTQ1OTYzPjYwNjEzOzQzOzQ0OTIyPTc4 +OzowOjQ2PjcsPDIzOTctPjZANzoxPzc8PzwuOzdBQDs4ODhAPzk5PDoyPTs3PTw3QDg6PDw2 +Pjo9PD44Pjk5OTo1PTs4Pj02Pz04PTc7Pz05PDk5PzsyPTQ7QUQvPzY6PD49PT46QEFBPzs/ +RUE8QD41RTlGQz8+RT48Qz1LbEnr98X+//j7//r9//ny+/D+//P///r///z///71//js+d/y +8ubz/+37/e/s8PHt+OD8//vq9+ze69Tm8eHr9eDk9OTa79PY7Nfg697N4cvu9+3s79/i/Orz +/fLj69nn7+j5/fz7/e/s+unx9+3q9+nq8+nr8eLj9uHs/+zp/+z69fTm7+Ht+Oz0+unr8OL3 +/PX29/T5//Lu++7///Ho7dzeyLxFRkNHQzkyQTxBQzsxPzg4PTE2Ojg0QDA5PjgzOjg9Ozow +OjU9ODY0PS8zOjcwNzE1Ozg8OTY6PDc1ODc4NzczPDM5OzM1OTY4OS8zPDg4PTMzPDQ6NTg0 +OjM3PTUwPDM8OTgyPDM8ODczPTI3OTgwOjQ6ODoyOjE3OTUxOjIzOzQsNzQ3OTkyPTYzODY4 +PDM0ODA0OjM1OzM0NjM7PDY0PDQ1NTY0NzI6NjkzOzQ3OjUzPC84PDcwOi88PzcxODQ6Ozgx +PDM5OTc3OTc2OTU4ODk3OzM1NzEyOjItOTUyOTE4NjQxNi8wOzA0OjYuOjM5ODkuOyw1PDUr +OjA8OjgvODI8PDc1NzM3ODU3NzM2Ojc1OTI2OjU3OTYyOjU3PDgvPDU7OjIvPjc0PTE6OTku +PS04ODsvPC82PTc0OTI4ODs1NTEyNzgyOzQyOTYvNjYyNjI3OjMyQTU1OzMwOjI2NzYyOjEz +Njg4OTU1OjI0NjcwOTc1PDQuOjM4OzQtOC83PDc1ODQ3PjkvPTUwOjYtOjEzPDQ4OTgzPjQz +OjMyOzU2Nzg0OzM1ODQuOzI1OTk2PDcxPTQzOTgxPC4vPTkwNzE0OjkzOjUzOjgzOy8zPTIz +QDQwNzEyODUxOzYzOjkvPTIvOTUtPTM2ODgzOTM2Oz01PzUwOjgwOzYyOjg0PDc0Ozg0Nzcz +PTUzOzAyOjEzPDI3NzQvOzI2OTQxPjA3OjYwPzQ5PjssOS43PDYyOTM1ODosPCwyNzkuOS8z +OjsvPi8yPDgrODcsPDEtOTUzOzc3SDdOTkRKUUFQT0dQVEZSU0JTVk9XWUZRV0FaVEVVVEVb +V0dVVUVaWUhSV0hZWkdVVUVeW0VdV0tcVkRaVUtcVUpZV0taWEdXXElZW0NcV0VaXExWYEta +VU1fXEhjXUxaYERgXk5WV0BeXEhZWkRbX0tfV0VaW0xYVkpaWUdhWkVJQT5USDhLSDZiaEx4 +ell9eV+Aelx5d199d1x3dll6d1x0clV6c1xweF17eFxsc1Z4cVhydlR3d1t6eFl0d1x1cWBz +dFx6cWFxbVV4cV9zdFl0d1x3b1d0c1lxblFwcVV0b1RvcVd0cVlubVlvb1dzclNqcVdwbFNt +bFRta09qbVFpbFNnbk1taVFpalFpaFFpa09iak9qY01naFVlaE5kZlFlaU5jZ05kak5hY09l +Z0tfZk5hZUpkZlBjXEpIRUIzQDUyPTkvPTM3PDQtOjQ4OjgsOzA5NjcsOTE8QDgyPDI4PTYv +PS82QDkzPTM2PTgwPDk1PTIzQDYyPDQ1PTU1OzIzPTg3OjovPDU3QDwyPzM6Ojc2QjY/QD8x +PDY7QDoxQTQ9QDotPzc/Qz02QDo7Pjc5Qzs0OzY3Ojk6PDg8QTo3Pzk9Oj48Qzw6QT09QDo7 +Qzk/REA4QzRDRD9BRjtQfk3x98/9//f///////j///n///7////9//z8//L6//f+//D///// +///////7/Pz5//D1/+z3+/Xx/+b+///z/PDn9uTW5M/h8tzh6tze69jl+eTp9ufl8+Ld99v3 +/f31/+/q8+Dq+ebz/PD4+PDr++j+//37//P69fDy+/H9//f3//P7//v9+e/p8uj///z1//P0 +9+7z+uXr9uPf6NTh7t3g0clJRUM+QTs2Qjc7Pzo2Pjc+PDYwPi8+PTEvOzQ+OzYzPTE9OTEz +PDUxOi04QTIyOzE4PDQ1PDQ+QDcuQTM2OzIqPS81OTI3PjI1OjE4OzI1Oi03ODg0OzI3OjQu +QTU4QjQ5PjAyPDM5Ni0xPTMyPDAuPzA1OjQvPy43OzYxODE5OzYyPDA1OS8sOy41ODQ2OjEy +PS80OjI2OTU1PTI2OjAyOy83PjM1ODE0OjI3OzQ3QDUzOjE4PDYxOjA8OzY1OjU8OjIwPCs1 +NzYuOjE5PjM6PjA7NzUuOzA3NzIwOTE0PTQyOjQzOycvOjE0ODM1PjEyPTA0PDA4PTY3OS43 +OzEyPDA3NzYwOjI4OzUvOS89OzYvOy45PDMyOjFAPi8xOTE0PTQzOTAuPS85OzE0PTQyPjE0 +ODA3PDIuOTAxOC8yOjEzOTE5PTsyPS87ODsyOC48PDkyNSw2OTc0Oi84Ojc1OS8zOzU1OTUv +PS82PzMtPDAwOTQzNzAzOTQwPDM0OTY3OzY2ODI8PDk3Oi06PjUvOi43OjgsOS82OTI0PDE3 +PjItOjU0OjMzOTIyPDE2PDcwOiw4OzwyPy87PjsxPTQ4OjQ3OTE2OzI0PTQzPTI1PTgzPjM0 +PTg0PTUxPTk1PDE0Pzs2PjU2Ojg7OzcwOzA3QDc2PC43PDcxOi83ODQxOjE4NzkxPy4vPTUx +Pi81OjU2PjMzPDgzPTA1PzYwPjQvPzE2PC4yPDYyPS02PTcuPC05PTY0Ny81ODQxOjE1PTgx +PC85NzcvPDE3NDkzOjA1OzQ9STVRUklRUDpUVUlOWEhZWDxWVUdUV0ZTVUVVVkVTWUBZWEhZ +V0dfVkpSVkVZVkZaWENbWEdWXENgVEhVVDlgW0pSWEtiWUhTX0RbVUVfW0JYX0VVXEdaWUxb +XUlhX0ZiWUhdXEFgYkpeYEZYXUZjXEhfXEViVkhbWj1bXU9WVz5SRz1QSjVRSD5kbkp6c1x9 +eVp9e2F1eFpyeVeAeFh6eFh9dWJ1e1tycl6Ad1h4dVl7eVl0e1h5dFZudFh9eFdsclF8dFhv +bll0dltycFt9c1Z1dVZzdFRzc1dvcVJ1b1dvdFZyaldqdFNyblNtcVlxb1RvcFFoalBta05r +alBqaE9sak5kblVvaE1qalZnaUpkbU9vaVJrbk1vaVFmaUxmZU5iZ0lmZ05fZUZiZE5gZUdk +Zk5rZkhiZE5dXkpKQ0IyPzU6PDc5PTY3PTQ5PTc3ODgxPC40PTMsPjM4OjI0QSw3OjcvPDA4 +PjYxPC86OjM0Ois9PTMtPjM/ODUyPjA5OzU0OjY1PjExQTc3PDE7Pzk6QDg5QDg+SDo4QDg9 +Pjg3PDM4PDc0PzM8QDo1PzM+OzwyQDc7Pj0wPTc/QzUxPzZBQzs2RDo7Qjo+Qjo+ST09Pz08 +RDs+Rzw6SDw8TDxcmlH0/+P9//j6/+7////////////+//j9//v8//Xy//D5/+v4//T1/+r6 +//P///v6//vy/PDr9+Lt/uzn+eLn9uPY7NXX687o9ebd69PS5dH3//n1++/1/fv1+vDs+fD7 +/ub0++vz+/Dt/uv1//Dr/efz+ezl9Oj7/v3///fk99rv/fH0//D2/fr7/+/x+PPu9+Hl5drp +8u39//r///Xy8uvj0MlJQkE7RDk7PDk1Pzo8PDQxOzc2OTU1PDc4PTYuPDU6OzQvOzA9OTg1 +PDM6NTo1PDQ4PTgsPjEzOjQ1OzU4OjkwOzM3PDU0PTY3PDM0OzE4NjYwOTk2PDMwPDI7Ozk5 +PTI8OTc2PDE5PjMyOy49OjgzNzE6PDgyOzA8OzoxOjA3OTY6OTM4Njo1OTQ4NzE6ODYvOzU2 +Nzc1NzU3OjM8ODIzPDcxODIwODI5ODctOTM9OjYuPDJAODcvOTJAOzUvPTQ9ODU4Nzc3OjQ4 +OTUwPDM5OjQ6PTQ2NjQzOTI5OzoxNTE0ODY1NTQvNjAyOjgyOjQ7ODw0OjI6ODs7PTQzOjk2 +OTAzOTY0OjM2NzU8PjYyOjQuNTI2PzU3NTg1PDQvODY2OTI5NjI4Ojc2OC8yOjY1ODQyOjQx +OTE1NzcvOTE1OjY0Nzg5OTI0Ojg1OTk1NzU5ODE4NjgyNzE3OjgvPDE2ODcwNzIyPDkuOzM2 +OzQwODE4NjYuODYzOTY1ODcxNDM1OTw1NjczODY1OTQ2OTM5ODkwODM0OzYwPjA3ODkxOjM3 +ODYuOzA2OTgwOTQ6OzsuPDE1ODYzPDQzNzgvNjU3PTUzOzQzPDYyPzMxOTQ0OzIxOjY3Ojc3 +PDo3OjE0OzcwNzU6PDkuPDI4ODczOzA6OzkyOC45Oj4yOS43Ozo1OTA2NTwxOjszOTMyOjEy +PDgzOjYxPjc0QDg2OzUzOTQ1OzcxPjU6ODYxPTQ2OzMwPDE0PDYyPDA5PDgsPjQ5PTgsODQ2 +ODczOjczPzc3Ozo5QTNFTT1WTEBVU0dTVENXU0VXVEVXV0VVU0dTVUJVUUpTWEFZVk1fVUdX +WU5WWUNZWUxWV0VZWk1VWEhYV0lbWkpZXEhbVU5YWENfWFBaU0daXEtXW0BbWUlcYkRTW1Ni +XkdaWkljXUVaWUdiXkhVXk1gWkReXUpgXERYXFJcXEZeVkpLRDlaRj1MRjZnalR8eFqDdWR5 +d118eF55eFdxblhyeFt9cVx1c1t8eFh5emB2d151c114dVt3dlh5b1pzb1h+dFdzeVx9c15y +dVh5c1pycFl1cF1sbVZyblx1c1R2a1pvblNxcl9yb1Z0bFhzblFxclJ0bVNpblZqblVrb1Rt +bVVybFduaVJqaFdoak1rZlRmak9taFViZ01laFVkaUxlZU9lYkpmZVJjY0liYk5kZE1kZVJj +ZExiZE9kXUxJQUM1PDg4PTc0OjU8OjcvOzI7ODozPDM7PDoqNzY7OzYwPTQ+OzczNjVBPDsu +PjY8OjkzPTY3PTQyPTU0PjY2OTczPTc7Ojg2ODs3OzcuOzY2PTU/Sjs9PTw5P0IzQDY9PEEz +PDc6Pj44OjU1PT40Pjg2QD48PTs2Pzk+QDk1QTg+QTk4Pjg+Qj43QT0/Qj07Pj06Pz87QT0+ +Pj8/R0FFRUJgjEvs9tL9//f////+//v8///9//f///36//H1/u71//P7/+n7/+/8//X2//D3 +++/q9ubw+uj6/PL19u/h6tzw9Obv+PTg+Nrb7ODZ5tLY59Xr6Onq+Orz/fft//by7+ri8eP0 +/Pby/ezr8unr++Pq8uXn+eH8//v///r18evr8O30+Pnt/eby/ejy/+75+fH0+/L8//f5/+7u ++eXm9+Lw8uXYxr88SkNBQUA2QDY3Pjk6PDY1PDY3OzQzOjQ0OjI2OjY5NjcxNjc2OzgwPTE2 +OzktOi84PDgyOy0xOTQtQC45PTc4ODY0Nzc2OTc1PDY2ODM3PDM0PTQ6OzE3OTQ8OzQzPDM8 +PDM1ODA6PDUrOSw9PDYrNzU+NzYsOTM4PjYzNjM2OzU1OTI0ODU1NzQwOzA1OzExODA5PDMt +OjM0OjQvPTA3OjE1OjQzOjI1OTMzPCw6OjQzNy81ODU3NjEzOjUzOjAvOTc2NTQ2OjQ2ODMz +PTI4NTUvOjAxODQvOTAyNDQvOS0wOTMvOTM1NjIxPDQvOTIxOjY0OTYxMzU4OjQyODA2OjU2 +PzA2OTMyODA0PzMyOjA4NjUxNzQ3ODgxOi4zOzAtPDM2NTQyOzA0OTE0PTQyOTMsPDIzPDI1 +Ojo3OC8zNTM1OTAzNzQ1PDY2NjI0Pjs0NzA1NzkvOC83OjUyOzE5OTYqPzEzMzcsOTI8Ozov +NzM7ODgvOC84Ojg7NTMsPjcyODI1PDsxNzM0PzQzOTI2NzI2NzQ1NzUvOy84OzUzPTE1Nzc1 +Oi44OzswOCs4OT40Nis2OT01OC0yOzg3OTcvOTE1NjMxOjExOzMxODM1Pjk1OTQ0OzI0ODUy +OjU5Nzg0ODI3OTkxOzY+OTozOTU7NzYwOjU7PTk2NzI2OTc1PTo2OjIwNjYvODM1OzgsOTQ7 +PTcwOi4zODYxODc3PDU2NzYvOjY3Ozs1OC02OTYvPTQyPTsxNi80OTkyNjItOjQ3NzExOzA4 +PzQwQTQ+RzxEUDlPUEZOTEFPUkpcV0VPSUpWVEFWUEdYWEJST0xYVkhOUUNcVUNVVEZVVUhV +U0pYVEpXWUpWXUVXWU1XWEhcV09WV0dZVkxXWUJfWE1YWkBXWUxaYUFbWUxZW0ZiV05eXkNY +WUtWXEVhWkdUWkhiXEZhWklfXEpZWUdgYUdVWERbV0ZKRTdUQzxJQDdnbVJ2elt8eGV2fVuA +cltzd1h7eF90elt0clp8fGB0dWN5cWF8dF50dF1yc1l1dVx0cVR2cVh7c1lzdFR7dlpydVp5 +cFt1clV2cFhxcU92b1huclN4bltwbFJybld1blVtblhxaFRtaFNwaFFrak1qbVJra1NtaVVt +ZlBqbE9talRjak5mZk9oaU9oalJiak1tZVJjYk1WVURfYk1jaU9jX09jY0tkZE5jYUxkZU5j +YUxnVU1DQj46OzYvPDYzPDU1PjYxOTA6PDcuOjM5OjgwOzQ4OTo5OjU3Ozs3OjIyPjU0Ojcz +PDk1PTMzPDM0PTYwOjM2PTwuOTU4NzkwPDY6PjgzPzw2OjM3PjQ6OTc5PTc0Ojk5PjY4Pjs3 +Pjg3Pjo6OzU0QDY2PjY2Pzw2PThAPkI8QTg+PkA6QTQ/QEA5RTpCQz43Qzo+RDg6QTtNS0hB +Rj5BRD9jmU35/ez6//P+//n2/vX5/+z6//T7//j///r////+///9/e7+//31//fq9eT2+ez+ +///y+evt/OX4/e/4//D3/fPg9NvZ7tXl79rf7N3f8N/u+ufi9OTq8efx/Of3//bt+ev1+O/1 +++jt/evu9e39//32/ev2/vHz/+/6//f+//Xx//H6//v1/e/x9+z0/ezu//D1+/Dp7Nbw7+Xq +8+fm7OPbxsZPQkA6OzlBPDk8QDk+PDk2Ozg6Pjc9PDk+QzlAOTo2OjU9OTg4OzM+OjctOzhA +OjY8ODk/OTk4PTU0NTY3Pjc6PDQ8PDk9Ozg1ODQ5ODQ2Ozg6ODs4Ojg3OTcyOjZCNzk2PDU+ +OzczOTA9ODk2ODE8OzkxODU5ODQxOjI3OjU0Ozg6PDU1NjA6OzY4OTQ1Nzk7NzQ3OjcyODQ7 +PDU2OTQ2NjU0NzU8OzMzPS8/Ozk1OjI+OjQyNzE1PjkvPDI9OzM2OTA6OTUyOy43PjY2OTc4 +OTA8Nzc4OzY1NTQ4NjY2OTA2Ozk3NDM6ODk0PTI/Nzk1ODY7OjgzOzI+ODsvOTA6OjY1ODU8 +NDY0Ozc7OzoyOjk3OjM2OjE0PjA7PDgyODQ5PDM5OTg9OjU5NjY2OjM5OzsxOS05ODk4NzU8 +Njw2Pi44ODw3NzA7Ojw7ODI4OTg7NjU2OzY0OjU0OjY6ODg0NzU9ODk1ODc4OTcyOjY1ODQ3 +OzYsNjQ5OTYwPTE6Njo1OjU3Ojg2OTc+OTgzOzIzODQ5Ojs0NzI1OzY0PTI4ODUzPDU6OTsz +OjQ2Nzc1Ozo4NTY2ODY3NDI4OTo3OTM5OTg5ODY7ODs4OTE1PT07Ojk0OTQ3PDcyOzY7Ojsx +Nzc2OjUxOi86OT0wPDM6NTk4PTU3NTk1ODo6NzgzPTY6PDo8ODU2Ojs7OjU1PDY1PTg3OTk5 +Ojc8ODc3PDc3OTc1OjM5PTc0PjM5QDwxPTg7PTs1NzFBPD40OzE2OjwvPTMwODg3PzM3Ozw7 +QjxBRDRFSz1RTUFWUkVRT0VTVT5STUhUVkhZV0dXUUlaUkRUVkhZUUpZWkZbWUZTT0ddWEtW +VkZiWEZSVUhaUU1cWUhZWktdWkZaWkdaXUtdYEleXUtaYEdcXE1fW0hdW0tiW1BZYkRiW0pb +XEZmWkxbVT9jXVNcX0ljYE1dYUlgWkpfW0NiWEZaRTxUSTtQSTtnb0x9cGV9dlqAdWF8d1l7 +c199dl59dGF9c1t7cVqAdlx4cFuFeFp5dld9dFh0dVh1eFl4dF98dF12cGB4dWB/cmFzcVt4 +cVdsclV9cV50bll6cFhwb1p5bVV3cFl2dFl0blhua1Vxb15zb1ZxamBvblVualN5b1VoblRx +aVRsaFBuZVJnZVZwalVvalNtaFZnaFFpWVBZUENjY1BlaE1qZVFoZUxkZFNmYU1qY01rZFFf +W0xGQT46PDs3OjQ+Ozk0PTVCOjs1NzU8OTs4PzVBPzg1NzJBOzo3OjI8PDs0PDU5Ozs1Ozc6 +Ojk2Oj08QTU4OTs8PDo8OTg5OzU0Ozc8Pzo2OTY/Pjk2OjVAOz81Ojc/Pj40PTdFP0E2PjVC +QD00PzlDPT42PDVCQjw7QTw8QjpAQD9DQj5BQzo/RkI/PD46S0FCPj1AQT83QTU+QEJCSTxI +R0dekkb0++L8/+z///////r////9//v8//f////+//z5//P4/+rx+en6//D////////0/e3v ++un6/fDz/PLu9Ojd6drc7dje9NXj+t/j+t3l9N7r9Obw9efo9+j1+PPt6+Xz+PT1/PDx/+vy ++eXm/ef0/ev4+/X1/vL0/PP5/e7y//Dr+eHo/OTt/e3y++jd8t38/vvq8eb4/vr///X1/Ovj +79TZxMJCQD87QDc2PDM1PDk2PDQ5OjE2PDU8OTU3PTw7PjE2OS47OzQyPDE6OTgxODA6ODUs +OzM2OjYtPzE4OTkyPC46Nzg1PDE3NzkxPzQ2PDcwOTI3PTY0PjI4OzM2PDM0Ozc0OjIyOzAz +Oy4zPDQ0Oy87ODMuOS80ODEvOi46PzgtOzE2PDQpPy42OzQ1Oy47OjUyODI4ODMzOjA1OjM1 +PDA0NjEvPDQxOiwzNC41OC8zOzE4NzIxOTE1OjIvNzA4OjkvNjA+OTkqOC08OzIuNzE5PDMs +PjI2OjEyNjIwOjUxNDMvOjYzPDMwOy8vNzIzPjE2NjAwNjEyOS42NzI2ODM0NjMyOS4zOzcz +Ny06OT00PCw1NzU2Ny0tPTY2ODE2OjI0NzAxODQ5NS8xOjE6OTMuPDEzNjMyOzQyOjIzOzcy +NS80PDQyNzMzOzIwNTA1OTUuPDE0OTIwOTE2PTIuOjU0OjQ1NjYqOTAwOTgqPS80OzgtOTA3 +OTkvOTE4NzUwOTQ1OTU1ODsxNzIyNTAwODE1Njg0ODI0OTY3PDQxPzU3OjEvOTIyNjQvPDMy +OjQtPS41OTUuOzA3NzYvOS42OjYrNTE4OzoxOTQzOTQxOi84OzAyOjU0QDUyOTQuPjUzODE0 +Ojc0PjQ1OzQwOzA1OTYvPjM1OjgyPDA2ODUvOy81Pjk2PCw0OzgvNi84PTgzOjA1OzgxOjEx +PzE1OTYxOTQ2PTY4Pjc3PjMzOTMzPS80PjYsPS40NjYuOjExODcwPC44PTcsODQ6PTgwOzE9 +QDUuPi1GSzxST0JPUURSVElRUEBWUElUU0FTUUNTU0FWU0ZWWEZTWEdTVUpWV0ZZVUtSXEJf +WkxWVkNaWU1ZV0ZgWVBZWUJbWkhaWkZZW0lZXEhZW0VhXEtfWUdcWE9dX0VaW0VdW0VaVUli +Wz5VXEpiX0taXEthW0JaV0ZgVUVTVEhiWEFFRDpWSTlESTRkcE57d116e1h7e1p0fFh3dVpy +dlh5fFt1d1Z1cmF0dVp3eVh3eFV5e1x2eFd1eVl6dVh5dVl2d1x7dVZzdll0clVxb1V6blhx +clZ1dVZzc1RzcVpycld2dV1vblJvbVhucVRta1ZtbE9sbVNtblFvbVVralFvaVRvbVBma1Vq +bFNtc09qaFVrbU9ja1FnalJoak1oYU9iY0prZVNlZU1mYUxjZkdrYlJhXkhgZUxfYUdiWEo8 +Pzc0PTIwOzI2OzA1OzMuOC8zPTQzPTM0PTY0PjQwOTM6PTUwPjQ0OzYyQDQ7ODgwPTI5Pjgs +PTI9PTcxOzA8OjczOTY4QjYvPDczPzEyPzM0OC83PzYzPzI4OzcuOzM2PTU0PDw0OjU0QDIz +PTE9QTs0QDM8Pz44PjM8QkA7QDQ6Qj06Pzs5QT4+Pzg4Qzw/Ozo4Qjk/RD42QTo8RD9CSj1t +lkro9NT8//L5//L+//j///////r///////7///n7//39/u/0//H9//L9//rp9ujx+eb7//T6 +//bu/ub1/+/y/uzq+uvb79Lf69no+OHf6tz0//r3+fDo6tzh9Njw+PDx/u/l9eDt+/Lz++/q +8ejk9ePy++7s+OL4/vv9+/Lt8ebt9O/x9PD1/PX///77+/Ds7+Xi1c7i693h8eH5/vj/9/Dj +vsBAQ0BAPDUyPzZCPDozODI+OTgxNTk+PjMyOTk2ODUuNjY1PjI6Ojk1OTIyOjczPTI5ODUy +OzA5OTc0OTY7OTk1OTM1NzEzOzM0NzE0OzM2NzUwNzc4Oi8yPjk1OTU4PDU2ODQuPTE0OTUu +NjU4NDgwOTM4ODwwOjI4Njg0ODQ4OTk0ODMzODMwOTQ5ODQtNTA3OjY4ODYxOTYzODMzNjc6 +ODEvNzUwNDM3OjQyODA7OTMyODU2OTYvNTI8NjgyNDU6OTk4NDI6OTYwOTI3ODozOjQ7Ojcz +OTUuOjMrMzM1OzEwOjIvMjE4NjUyODk0OjMyOTYxODE6OTgyOTE1OzYsOy41ODctOjM9Nzcx +OzM0OjErNTM8MjkvOzI2ODQzODQuNjQ2NzYyODUvODcxNzQwOTEuOzcxODQ0ODM0NDE0NjM0 +OzIyNzQwNiw4PUIuOy03NDkvODAxOzUwOy8zNzkwNjQyOzI1OTQwOjI6OjouNDY0NjovODEz +OjYzNzU2ODU4NjcwOjQyOTgtNzE3OjkzOjU1OTMuNzc0OTQwOjE0OjQ2OTgyODI6OTw4OTIz +NjYuODc2NjkzOzQ2OTEyODUzOS80ODg0NzQxPDc0ODM0ODUxODMzPDUwNi4vNjUyOjMyOjU1 +ODQvOjQzPTUzOi42OTcvODE2NzcxOS01NDoxPDAzNTUwODAyOTkwODExODA0PTIwODg4Ni82 +Ozk2ODcuODQyOzcxOTMvOzI1OTYvOjA5MzUxOjE3OzksNS0zNjIvODE2NTcoQC8zODgzOzA2 +OUE/TThQT0JNUkZWVUhNUktRV0FOUENTVkZXWEhXWktWVUtVVkVZWEdYVkVPVUJaVkpZWUVa +V01TVztfVEtVV0tbW01WV0ddWkhaVUVWVkpaXElaWUtaWk9aVz1ZXExaWktaVUtgWktaXktd +WUxbW0VfYUxXXkFiXlFaXD1eVkpQTz1NSEFUSzxJSENjbVV6e1mAdV55emB6c110clx7eV94 +dll6e2B3dl93dF5+dVh2dl19cVpydFp6d1luclh+c150cld8c15vcV97dFpyclt0b1l0a1dz +clh3bllxcVFzbV5wbldsa1dqblFycFtxblNxbFZybVVsaFBpa1JwblBsa1VrbVNqa1VraVFq +bFRqY1VrbVFyb1Nla1BnbFFmaU1mZlBjZk1laVVnZUxiYFNfY01kY09iY0xhYFFeVUk7PD80 +Ojc3Ojk4PDUvPTc0OjM3PTk2OzQ2OjotQDY2OzYwOjA9OTgvOzI7PjkuOjE7OzQzOzE1ODkt +Oy81OzsyOTczPTkyPjcuOzUyNzkzODI2OzcxNzk4PDY3Pjc2OTM6OTkvPjQ6PDozPjE9ODoy +QTQ8OTwvODdDQUIxPzU6Pz0xQj06Qj02QT0zQT09RUE5PUE8QDo9ST08Qz09RkNFTEFrl1Hz +9+D////8/vn1/+3+//n///////34//v3/+75//j9//X3/vn1/+zy++zx9+jz/e/5/+z3/fHt +9+fv+uvp+uXe9tvc8tXl8N7e6dXd5Nrt8unx/erz8+rk9eb4+/Ps9eTx9O7t+OTx/vv////1 +//z6//b9//v49vD3/+7+//7////////////r9+rz+Ojr9Ozs6+jr+O////37+e7s7Njj0NJE +Pj45OTc2OzQ8ODk7PC83OjUuNjE/Ojs2OTA5PDowOjI7OTU5NTI3NDU4PDgxOjQ1OzY2OjM2 +OTY1NzM0NjgzOjUrODI4OzM2ODY8ODQ4OS86NTUzOjM7NDcwOjA7OTYuOi47OTIzPS04Njc3 +OzE6Ojc2OjQ4OjYxOTI7Njc4ODUxODI4OC04NzU1OzA4NzE0NzI3ODQ1NzE3NjQ0Ny83NTQw +NzE7OTU1MjE4OTQsNy07NTc8NTI4Nzw1NDQ4NzQ6NzY2OTI4OTE3OjQ2ODc1NzM6NjE7ODMw +OjY3NTUvNzMyOzM0ODA5NzUxODE8OTcsOS5BNzsvNjU7NTcyNTE1NzMzNzI4OzM6NjU5OzA4 +NzQxNzI3NTEzMTM3OTQ2OTM0NCw4PDcyOC4zOjgyOSs1NjU2Ny42OjkxNyo1Ojk0Oy06NjU3 +OjAwNTQ1OTgwNzE4ODQwNTI4ODc1OjQ3NTU1ODMxMzE3NTUvOjM2ODgvNjM1OTctOjY5PDQw +OC05ODY0Njg4ODE6MzczNjU2NzgzNTI3ODQ0ODI5NzkyOjQ0NTQ0OTM5NDQyNjk3NzI0Ozg2 +Nyw1OTg6NDM0NjY0NjU0NTM8NjUxNzU1OjUxOC84OTgxOS43OjcxOC44OTUxOTA0OjcrNy83 +ODw0OTQ0Nzg1OTY2OjgzOzM5Nzc5Ojc2Oz43NzI2ODU1ODc1OzYyNjAzODAwOzI1ODYzOzM6 +OTkzPCw3ODY3OzI1Ojg6OC85OTgzOiw6ODwwOCo0Njs1NTM3Oy42NTM3NC41OTE3ODctNDM/ +RzxSUUJaUEZQT0NYUUpUVUZXU0hVUUNZUkdUUEVgVktXVUVaWUtXVEZfTUhZVkhUVkNXVUlX +WENaWU5ZWkZWWkxdV0teWU5hWUdcWEZfVkhVWEtdWVJeXEVkXE1aV0VcWk1fW0dcY0taXEBf +WEtoW05cVkpcWlFbVkdaUkhWVDtKRzxYRjhKRTxodFB7emJ9e1Z7el+CcWB3dFuAdV54dVqF +d1h0dl14eFZ4dl95d117blt4cVl4cVtzdVZ3c111dld2cV10d1x1b1lwdFZ8b1xydFN2clVy +cFRzcVRzbVxycFdxbVlwb1RtblZya0tvblRub1FsalFua1Nna09ybFVrZ1BrbFdwak1qaVVk +Y0pqZ1FrY01oZ1RibU1uaFFgZUxoaFFkak9pY09lYUljZE1jZEtjZU5hYk1dU0g+Pz01PDc3 +PTE3OTUyPS03PzM1ODU6OTkuPDA5OjM2Oiw8NzUuOTA0PTU2PTYzPTUwOjQ0OTMzPDYzNjM5 +PDQzPDQ2PDQ1NjkyPDY7NjQyOzU4PDouPTE8ODY1OzU+PDotPjU8ODYxODc+OzU2Pzg0PDw1 +QTg3PDg7Pzk2PzU9QDU6RDo/QTs7RDw6RTg3PEA+QDY+REA8Qzk8QD45QzRERUF/o0j9///7 +//T///f5//X4/+37//H4//D9//r///34//jz/+bx/ef4/vLq7OH8//T7//fz+/Pm8ODy/evv ++/Hw9unj7trX5sze79jh79rV6Nbi8drj7t7o9+Xt9eru+Orz/vX5//L9//jt/ev2/ery++/x +9O/m9OLs+u72//Ht9uLi8ePy+ejs+/H6//z5//X+//3u++3y9+nr8eH5+uzr8eP5wMo/Qjwz +PTo3OzI5PDU3OTEzNzI1NTY2OTI1Ozc1OjIxPzI2ODYzNi06PDQtOis9PDYyOiw1NzYwOC03 +OjQ0OTA5OjkyOzAxODM2OTM5ODMzOi41ODAwNDI5PDM5OjU6ODM2OjU6Oi41OC4yOC8sPDA3 +OzEuOjA7PDMvPiw8OjMzNTU6Oi0xODIxOTQ5NTM1NTA0PTYzPjE5NzYxPTIvOjIzODEzOjAy +OTE0NS01OTYyNysxOzYxOy01OzYyNyk5NTc4OjIxOTo6Oy8wNzE2OzQvOjA2OTEyNy80NzMt +PzA0PDMvOywyNi4zOi8zNjI1OjUyOjEwOTEyNjI0PDIyOS80Oi8yNy83NjIwOjQzPTAxOC8w +OzI0OjY0OjQ2OTMvOzE8ODIuQDE3ODQrOyw7NzQxPzM5OTA2NDU5OTQ1Nzc1Nyw1OTU2NjEz +OTQwPS4uOS8zOjMtNy43MjUvNjEwOjEuOSk2OjYvOCwxNjUuOi43NzQsPi82OjMyOS02NzQs +NzI4OjAzOTEvOTc1OTMxODAxOC0uOy4zOTE4PDI1Ny80PTQuOS44OjgvOC80PDYtOjQ2Ojkw +OC00NzoyOy03ODg0NTAyPDczOTMwODMxNTExPTAyPS8yPC80OTI1PTAvOTExPjQwOTA2OTMu +PS83OzUsOy84OjMqOy80PjIsOzQ2OjYrOzMuPTI1ODE6OTIxOTc2OTQ2OzAzOzI4OTkwOC82 +OC41OzgzOTM1OTo3NzA3PDQyOjEzPDUtPS4vOzUwNSszOjs1NywzOTQyOzAyPTc1OzQ8SzlS +UUhPVD1UU0hTUDxWVUZVVzxRV0dWVkVWT0JZWkJVT0VgWEVTV0hYWUVWU0hcXENZWEdXVUlb +WkdbUUZZWUZXW0dbVUpTWEdfWUdXXEdaXk9cW0ZhX0tYWkZYWElaVUhgW0lWW0NbWkxaX0Vh +WUpdVkFcW0hZXT1aWENVVEVPRTpVSThLSzhgd095d1p8eVR8dl2Aeld7e117dlh3dFh4dliB +cl1ydFh5cV17fFp1dVt2dVp4eFh0dF57eVl1eFRzcFZ4c1d3c11zdlh6cFZuc1J9dV1yb1V3 +b1tqbk5ycVhua1N2cFhyb1Fyb1lxb1NrblBvbVNncU9sbFJtaVFxaVFpbFJmZ1Bra05qa1Fx +aFJja09tZlJjZk1saVFmaEltZUxiZk5rZkxgZktlaExiZU5jZkpjYkpkWUhBPzo0OS06PDY3 +OTE5PDIxOjEzOTA4PTc0NzQ1OTY0OjA1OzY0PC02PzYyOTAwPDY4OzQyPTUyPjIwPTIzPDA1 +PDI1PTUsOzAyPTMxPTA3PDU2Py81PzIzQC82PC02ODY2OTM3PjYzOjM2QTQ4PjY8QTcxPjo5 +QDg1RjU8SDI3Qzk2QjE7QDg6PjRAPj46Qzk+Qzs3RzY9QTg3RjtCQ0A+SD+AoE32++j9//j/ +///+//3+//z///////75//L0/+j8//b9//z9///9//r///37//H8//T+//Xx/O7g8dzm8t/Z +6tfh8djq++Dm3t/c6M7f69n9///7//X6//3v+/Hx9vL9++/k+eTn9+fx+urs/en5/vLz/vHy +/PP89+7r9ufr/Ofu/fb4++7x++j4/PX3//Tt++vk7uL3+/Ds+Ovx/u/49uvfs79EPz0uOjc+ +OTw3QDk6PTowQTI1OjYzOjg4OTU0PDY5NDo6ODI2PDg1OjU1MzYxNzM0OzUvOTc3OjY0OjU3 +ODcuPS82PjYyPzI4OzcxPjE3OzcvOi85ODg0OjM0Nzo2OzQsPDU5NzQ5OS4zOTY6OTc3OjY1 +OjEyOTcwODUxOjI0ODEzOzI2OTUyNzE4OzcyOTM6NjUvNTM8OjcwPjY9OzcyOjI2OjQ0NjQz +OTM0OjIvOS83NTc0PTY1ODcwOjM4NTUwOzc0OjAyOzM2NjI6OjkxODQ2PToyNy82OTkwMi05 +PDQ3OC8xODY2OzYvNjQ4OTMyNTIzODUvODA5OTcuNzE3NzQxPTE2NTY3OTU2OTU0ODU0ODMz +ODY5OTg0PTQyODU3OzIuPjU3OzA0NzM2PC8zNTYyNjg4ODgyOjE7OzksNzQ5ODYvNzU4OTYx +NjI3NTcyODk7OzYyOjc6NzQ2ODozOS83OzY1OTAzOzczNTE0ODE2OzYtPi82NjovOzQ3OTUx +OjA1Nj0zOzE5NjcxODE3OjouOTE2OzguOzU3PDMwNi40Ozc0OTU0Nzc1OTUxPzUuNzc0Njk0 +ODgwOjMyOTI1OzkzOzM1ODgvOTU3OzM1NTI5PzsxOy02Pj01Nzc3ODk1OzMwOjgyOTYzPjM1 +Njs2ODQwPDY1ODk2OTc0OjYzOTM0OTwtOTI6ODozNzI3PjctODI5NzkvOjE3PzYvOTQ7Ojg0 +OTg0NDQ9Ojs0PDMyNjUwNzE4OTgyOTEwOzgsOTIwMjU3ODUuNTIyOTE0OTQ1OT00RzlWUkZS +Tz5WU0pVTkFYU0dWU0ZXVUhXWkVYWkhXS0tbV0VcWUVXU0VYV0lYV0ZaV0haV0hfWkpZW0JW +WUtaWkVeU0xcWEVTVE1dV0xXXEtbW0xbW05ZXUJZW0xbXkVeW0ZZWktdWExfXkVeX05dU0xd +YktaV0tjWkxfVUJgV0tSQjpRQDpJSjhxc1h9emKCeV56el5+emV6e2F5eFp3d1t9dmB5dl6A +e2Fzd119cmF1dVZ6b2J3d1t+dl1xcVd7dVtwdVp7dlpzc1x1dVp5d2Bpb1d1d1t5c1xycFd1 +cFpydVZ0bF1vbVpzb1hubFZzbFZrclNwbllta1FyalJpbk5ubFRwbVBxalptcVBqa1dsaVNp +aFBtaFNna09oZU9oZFBrZU5kaEtkZU5nZVBhY0tkZU5hY05jZFFUUUlBPD4zOzY9OzouOzk6 +OzUwOjQ3PDU1Ojk5OTk6NzYyPDQ1OjYzOzcxPTQ3OjY5OTU2PDg0OjM1PTgxOjI5OjkyPDA4 +OTk3PzI3PjU2OjYyOzw7ODM0OzE5OTY0Ojg5PDgzPTY5PTsvRDc7Ozc2QTQ7OzozQTk8PT46 +Qjs5Pzo7Pzw2QDk7PTo3Pjg8QTs9QD1BQj04RD48QT8+P0E9RjxEREWGoUvw/Oj3/+/8//H4 +//D////////////////7//j2//ry/ebx/Ov8//X8//n9//r3+PHo7t/o9+Ps+OLx/+3y/PDl +9+Ld69Xa7dTZ6NfU49Lp8+Pp/ej7//Pz//L1+fHq997r8Ons+ub89+3p8uPt+Of0+u77//fz +++vu++35/Pn///7z//T2+u/x+en6/O7w/fHy8OPr/vD///rt/O7z8+HUrLVFQz47Ozs6Qjc6 +PTk2OjM0OzQvOTQ5ODk6PDI3Nzc6PjQ3OjYvODQxPTUzPDI3NzY5Ojc3NzE2OTU2OTMzOTw3 +OS00OTQwOjIxOzQ6OTMzNzE2OzUyNjA6ODgxOjM2OTctPC80OTMwNis0OTUyOzAyOjQ1OTg8 +ODc4OTg4OjY5NzcvOTI3NDU3OjUzNjQ0PTMxODI2NzYyOzA5ODUzNzA4ODcsOTE8NzgzNjM1 +OjkyPDAzOy8vOjE5ODcwOjIxNTI5ODk1OTA2ODQxOTQzODA5Nzg3ODQ3OTU0OTAzMjcyNTM8 +NTgyOy47PDYtOTc3NzUvNzI8NTYsPC09ODc1OTQ0Nzc3NzM1PDUyOS4xNzE3NjQyPzMyNTQ1 +PTQ0NzQ4OTg2NTM4NTk4Njg3PTo2Pi46NTkvOTA4NTk4OTM6PDszOTUwOjI4OTg0OjU2NDcy +ODc4NTUsOzE4OzU5ODk6OjY3MzQ3OTM3OTcxOTE4OTcxOzI5NzcuOTE6OjY4NTU4OjMzNjU4 +NzQ4OjkwOzU5PDgtOTA3NDQvPDE3OjcxODA3OzMwNjQ1NjMxOTU0PDUzNzcyNy4yNTk1ODYw +OTYyOTQ1Nzg4OTIxPDI0NzQxOzM4NDczOjI3ODQzOjE2OjYvOjE4Ojw5PTM4ODo1PTQ0OTUx +OzM6PT80ODg1OTU1PDMxPDgwOzMyNTc2OzQ3OTQyOjU3NzUyOjE2OTcwOzM1ODczPDA5OTkv +Oi83NTsuOi00OTg0PTIyOz0yOTA0OjgwODU0Ny4zNjg4OzYwODg6NzQvOzBDTEBMTEZXTkJR +TjxXTUpSUEFYVUpUUTxcUUdOVUZeWUlYWUZYW0ZVWEtXWEVeVEdXWEhXWEhfXkpXVk1YWkde +WUZcWUtaWUxcWkxeWUdjWkdWWUtiXExWVkFeWk1aWD5ZU0xZXkBeW0tbXUdcZE9gX0xiXEth +V0pbW0deXElaWEBLRUFWSTZLRjlsdVd6dl+BfVl1el6Jd2V3eVh/dVp1dV6EeFl6d198dFt7 +d1x1eFx6cVt0d1d6cFtzc1d6eF1xc1Z7dF5zcVl1cVpvclh6dVpydFd1eFh2cVt1c1h3c1lz +clN0cld1b1NvclhycVVqa1dwa1Rqb1NtallobFBwbVNuZ1JsbFVscFNrbFZpak1rZFNqblFu +aVRnaU9talBlaktrYExlZ05iY1BmZEtiZlBhZU1gY0tjY0hbU0o8QTs7PzwyOzY3PTcwPTE7 +OjcxOTI7PDowPDE6PTYxPjQ8Njc0OjI2OTkzPTg4OjA1PTYyPTI2PDYzQDQ0ODU4Ojk0PTU3 +OTkvODI3OzgwPDQ6ODguPTA9OjoyPDQ7PDkuODU5OTcuPTM+PDk3OjQ2PDY8PDk1QDY4QDY2 +PzY1PjQ2Ozk9QDY8Qj06Pzs4Q0A6Qzg4PT47RTc+PEI7QTpEQEmAmE7o9Nn9//T///7///n8 +//b9//X0/u/6/+3///37//j8/vD7//X8//j4/+/5/Pjp+uP6/+////z////2//Lt+Ofh9N/g +7tXf5tnk6d3d6tr/+fTn8eHh5+Hm/ej+8/P0+/H0//Po9eDw/Pz////y+fn3/Ozx/PP5/vP8 +//z///Tn7ePw+ery9ezv797e7dfd9OLw8u7///758Ozt9ePp6+DatLVGPT8yPTU4OTk2OjM6 +PTc0OjA4PzQzOTI4OjU5OjgzOzYuODo2NjA1PTo5Ojc0OTYxNzUsOjA5OTErNzE5NzQuOi4x +ODYqNjE0OzYxOS4vNzcxODM5OTYxOTI5NzMtPDQ3OjU2NzUwNTI1NzMuNzM0NjI7ODMtPDE3 +OjUwOTU2OTUxOy42ODMsOzI6NzguOjE6OTgzOi83PDktOyw4OTgyNzE1NDI1ODAvPDUxOzM2 +Njc0OjQzOTMsNzM3Ozc1OjkyOjcwOy01ODMtNzA4NzgtNTJBODgtOTM3NTErOzc4OzIuOzIy +NzQxOjYwOS8zODQuPTM2ODU1PTU0ODYzOzYxOC8zOTcvNy81Ojg2OSs2OjowOTAzOToyNS43 +Ojo4OzA4NzwzPTMyOjY0OTI0ODc0ODYqODI0OTYxNjQwOzgyNzEwODUzPDUwPTI2ODkqOTEy +OTEvOzM5NzUuNTQ1OjEyODg3ODIyODYzOzczOTkxOzAzOTUuNTQ1OzUwPjQzODUtOjYzNjcu +NDQ2OTYtOzg4UTc8PEQzPTgwOjIvOzItNzcxODQzOTs0OTUtOTM3Njg3ODUzNzotOzA2NTgy +OC83OzktODA1OjgtOjEzNzcyPTE0OjktOzI0ODE1Ojc1ODU1OzUwOTo2ODc3PDc1OzQ3OjYx +Ojc6Oj4zNyw2Njc2PzE6NTYzODE7ODswOi8xOzcwOSk3OjszOi42PD4zPTMzOTowNzo0PTkz +OzozPTAsPTc1PjQtOTcwPDEvNTM1NzcuOC41NzgyNS43OzstODQ7PTgzRjRYTERPUElaUUpV +T0JZTkZVTk5WVEZYU0hXWkNZV0hZVEdaVUVWWUZXVkZZUkpTWkNZVVBVWEZfWUhZVkhdVU5e +WkZfXFBXWEhaWlBeYENcWExhWUlcX0hgWkxgW01cVUZYYEthWUtZW0RYWExjWUtcWU1gX0Za +WEhoV0VYUklWRztRQkFRSztrcVyCdmF5eV5/fGJ6d2R8d1l8dl16eluCeVpyeVp4d2B4eF12 +dGF8dmF6dF5zcVt0dlp7dVx5cVl0cl5zdV94c1x0cVp1cFx1c1lzb15zclxwbVl2cVpxdVV1 +bVpwbFNualhrblN2a1dva09ub1hrbVFqa1dtblZsbVhsbFFsZVVra1FsalVoaVNnZ1NwZ1Jm +aU5oaE9rZFNiaE9naVFjZkxqY09gZEtjZU5fZUlkY1NVT0BBPjszPTQ5OTY1PjQzOzU1OTg0 +Ojg0Pzo0OjgyPjs3Ojc1PDg3PjUyPjQyOzMvOjI7PTszQjY7ODwuPTY8OjowQDA3OzQvPDQ7 +QTktPTY8OTk5PDMuPjU0Pjc1QTA6ODk3Pjk3PDYzPDE9STw1Pzk5QDc2PTk3PzY5Pz82PTM8 +Oj80PzI7REI7QDY5Qj86QDY9RT4/PjtBQz47RD89Rz1FRkGaqFL8/vn4/vD9//3////8//v3 ++u3+//j4//L5//T6//z6/+3////9//nz/+30/+3y/ero9ubr/eTo/ePg9d7n7tzh9OXe8tXm +/+Hj7t/X7dP2+Ons9ur+/v7s+enm9uTs89/w/e32/+3+//vo++ns+ePs8evt+eTw++76//Tx +/fH6//X9/v79+fv///7///X5//H4//Xq9OH8/fru9Ovs6+LVoKlGPUI9OTk5Ojs5Ojc0OTc5 +Nzk6OjkzOjYzPTU6Ojc6Nzo3PjM6PDUxOTA6NzozPDQ8ODcwOzQ9OzgsNS46NDg1PC01Ojgy +ODA2OTg2NDc2OzY6NzQ2QDgzNzg2Ozc4OzU7ODI1NjM6OzQ1MjU8OTU3OS87PTgxOjQ+OjYz +NzVAOjgyNDM/OjsxNzo+Ojg5ODM1OTY2ODY/PTc7OjY0NzU5OTUyODU5Njo1OjY6NDM2NzY1 +ODE5OzszOC43PDkyOjM3Njs2OTIyPDk0ODA2NTg8ODQ0NDM3NTUxNjQ8NDs0OTQ5OjgwNjM1 +MzYvNzM6ODU0ODU1OjgyOjI4Nzg1OTc0ODQ2OjU1NDY5Nzc2Nzc5OTc2ODQ6NjIyNzg5NjU7 +Nzc4ODU1OjAyOTI6MjcvOzU2NzQwOTg5NzQuNzg0NzIvOzQ3OjE0NTg1NDI2OTo2OTExOTc2 +OjUzODc4PjQ3PDc3Ojc1OjI1OTY4Ojc6OTg0Ozg5ODczNzk6OTsxNTI1ODsvODM8NjozOTc5 +OzM6MTM1Ojg2Nzc1OTQ4ODU4NDczNzU1NTg2ODQ3MzgwOzQ5OTkuNjM5NjkyODI1Mzw1Ny82 +OTw0Ni85Njc1ODE4Ozk2Nzc2Ojc5OjYxNzk7OjU2ODU4NzM3OzU3OTg1ODY0OTc8Oj01OTE7 +NzozOzQ6ODoxNzU7NjowODQ5Nzo1NzYzPTY1OjI1OTI4Njs4Ozs2ODs2OTM3Njg0NjU8OTQ4 +ODY0Nzg3OjU2NzQ2MzktOS03MzouNC05NjgyOS82OTk8PzA1PTpESj1OV0NXS0hVUD5VT0xZ +VkJYVkdUT0FaUkpVVUZWVkldWUdbVkxaV0pWV09gWUZaWUhgVkVXVkphVkxZVU1bWUdbWE1Z +WkJaYE1VWkleWE9TXEdiV05bXkJif1tdYExbXVJfWkhjYExeWURkW1NdXk1oXk9aXERhWEtf +WUthVz9KQz9VQTRLSjd5e1l7fmGEelx7fGGFdWN1elt7eGJ3emB9dGN6eF56eGN2dFl9eGJ0 +el56dlx6cV12c1x3cVt6c1h1cmB2c2J3d2F4dFh3cVp3bll1clp5clhyb1h6cV1vblZ6cF5p +cFR4b2Fva1J4aVdva1N0bltxcVlxaFRxbldtbVVuaFZtbVJwa1ZtZlNuaFBqaVFnaFBuZlJk +aUxvZlNhYU9nZFBcaExvYFJfZU9lZ1BmZk5kYU5fTko/ODc6OTk0OjQ2ODY0PTk4Nzo0ODY3 +PDY3OTU4ODY4PTo7OjM7Ojk3OC47QDo1OjQ6PT02OTU2Ozw2OjQ9PD04OTU3Ojo3PDQzQDU3 +OzwyPDQ8OTk1OTg7Oj44OTo4PTk6PTtAPjo0QDw9Ozg9Pzs7Ozk3QDo6OjlCRDk1PzpAQDs8 +Oz88QjhAQj07QD1APT88Qjs/QkE+QjhCRUA5Qz5EQ0GRpVL4/uv////8//3t/en+//X///// +//////////3z/vPw/d3x+Ozy/un5//T49fj2+Or///75+/L29PH9//b8/fze7dzZ5s3Z69nb +5NTe8Nnk9un+//Tn69zd6uHw8+n9/fLv+e/t+ODb6N7s8+339fDt9+rx8+z8/vn7//P9//n6 +//fw/erq/ev1++zy/e35/vfn6dvm+Ofy/Ofr9+vu5+HanalFPDs4OjQ5NTk1PTM1OTk8PDku +Njk1NjcxNzQ9OzsxNzY7PjUuOjVAOjcsODg7ODIxODg4NjYzOzssOzU6Ojc5ODI1OTUzODg8 +OTUxNy82OzI0ODMzOTgyOjQ0ODE6PTgwNzM3OjI4ODAtOTg1NzYwOTs6ODM1OTY1NzMwNDY3 +NzYsODc3NTczODI3MzctOTQ6Nzc0PDY6ODgyOTI2OTQxPDE1OTQ2NjQ2OjswOjU3Ojc7OS8t +NzgzNzI1PzcvNi82OjktNzQ0OTU0Oy88NTk0OjE6MzQpOTE5ODkqNi87NTQsOjQ5OzcwODEz +OjQuOTU0OjI2Njo1OjMyNzczNjUxNzQxODQvOi81NDM2Ny84Njc1ODQ6OTYyODM5ODYlOC89 +NTgxNzU7OTcqOTE1ODUzODMwOjYsNzUvOTU1Nzk1PDcyNDQ0Ojg1NjMzNjUwNzI2Njw0NzU2 +OTswOC86PT4vNTM2ODsvOjQ2ODszOzAxOTcyNjYzODI1NzUyODU3NDYyPDYzODUwNTU4NDUy +ODg0NjUvODc1OC04OjcyOTE3OjQtOTE2NjUyOTUwPjQtODQzODQ1Ojs1OTEyNzc0OjE0NTgy +OzU2OTsvOTU2NjUwODU0NTkvNTYvNDI2PTkwOTI5PDsxNjEyOTYzOjM0PjU2OTAvNzY2NTUx +OzM1ODcvQDM1NjkxNzQ4NzkxNTI1OzUwNi01OjctOTMzNzcuPDQ1NjcwOjMvODkxODMyODU1 +OzguNjsyOjcvOzY1NjE0ODgzOzI1PDYsODA0OzwvNTE4PDhERz1VUEZPTkVTU0lQU0FVVUtU +U0JaVktWUkBXVkhVVEdWVD1WV0hZVUVaWkxZVEhSW0ZXV0pZWExYWktWV0lgVk1ZVkNbWU5V +WkZdW01XXkhiWk5VX0xZZEtZYEtgX0pbVkpZW0daXkxdYEdbYE1bXkVdYVFaXUpWX0NkWEpa +U0NQQT5MQjhQTTpqdVV+fGZ/d1d+dmN5eFmAdWF8eF15eWB7dl18c2F6elx7dVp8c1p2eFh3 +blx5eFJ1blp8c1dzc1V5clZzcV18dlpxc1mAelxxdVd5c1ptcFd3bFtsb1h1cFluclt1bFRz +cFR0b1R3cV1vblVwaVJmcVZ2aFVwbVRyb1htbVVwbFVuaVZoalFnZFRmaE9gaVRsZlBnY1Zi +YklmZ0lmZ09iZEpmZE5fZUllZFBeY05iY05QTEI4OjwzOTA6OTYuOzE4OTc0PjY3OzY4Ojc2 +Nzg0PzM1PDQ1OjA0OjY0PjM1ODQyOjg2NzoyOjI6OTkwNDA7OTguOzI/MzgyOTY+ODozPjU5 +OzkzPjM9PzU0ODA8Ojo0Ozc+Ozc4PDw0OTc2OTc4Ojk4OzY5Pzs7PTs5Pj00PDY+Ozw0Ozg6 +Oz0zPz0/Pj8xQTY8PD0uQTVBOz40QDlFRUNBR0CJm1Pt+Nr9//r///z///z////7//f1/+/9 +//X6//L4//P3/+r+///+//z///j3/O/3//X6//D4//z0/+zt/Obj7+Dc8Nrg9NTt8unk8Nrb +6NXy/ezw/fLx/fn///78//v0/+/x9efp++r///j1//H3//Lp++P6/vHt/+rq9+Ld89zo7unq +8Orr8Ovs9+jw/vH4/e/u8+r5//709+73//v3/+vdmaNBPEItPTIyPDcyOS86OTosPC07PTou +Oyo2OjowNzU5OTg4OzYzOzczPjItNjc6OTgzPDQrNDUtOTAzNzk2PjEyODU1ODMrOzI2OjIu +NzM6PjMzOi9ANzYpPDE1ODUsPTU5OTQsNDEyODYzODkyOjIuOjQvPDE0OzUtOjYwNzUtPTQ0 +NjUyNzQ5OTIzOjM0OS84OzY3ODU5OzUzODU2PDg0NTAxOjY0Oi0yOjQvNzIwOTExODMqOy01 +OjMtPi40ODcwPC8yOTMwOzIxOzczOTY0NzMvPDYvOjQvOjUuOjIvOTMuOTcyNjUyNzguOzQv +OjEqOjAyPDYoODAzOjcsOi87NTUxOjM1ODMvPDE6ODorNzI0OjUuPS81OzgxNzIxOzQwODA0 +ODA0NzIzOjQxNzQtNzQtNDI0OTcwPS81OjUtOTQ0ODYvOjAzNzgsOC8zOjIvNjI3OTgxOjA2 +OzYxODU1PDMwOjAtOzUwNzQvOjEwODIxNzUvNi8yODMyNzAzOjYsPjA3ODotOjE0ODcwNzEy +ODksOSwvPTksNzAzOTstODAwODo0ODIxODIyODQyPTMyNzcxODU1NzY1NzQyOzg3ODguPTcw +ODwuODA3NzMsNzI3OjouOTM1NTkrOzI6ODguODUzPDc2OjgzODY3OTYuPDMyODgyPTY2NzUv +OTQxOTYzODwvOjU0OzYzODAwPzEvNjI3NjkzOTI2OTgxOy8xOTkzNzExOzUvOjMsOjY1PDcr +QDQzOzMvOi8vOTwxOi8wNzcyODMzNTovOzcxNjgzPDY+Sz5RVEVOV0pWVkNQUUdXUEhXVEZZ +XENWWEpVXElbWkxSWEFWW0tWWkZaVk9UXUJZVkdSW01eV1JVW0ReWklXYEJhWlBVYUJaXFBX +XEJbWElZX01dXUBZY0xbX0daYEdYWUZaW09gW0lWXkhYW0xgWkViX0pZW0FmWUhaYkRgT0RJ +STdZRztMTDt2e153dl+AfF2AemJ5fF56d196eFp5d2B5eGJ8c1x4dlx6eFt8c1x1elx8c2By +dFx6dWB1dFp2dFt1c1Z6cmBzb1h1d1t6dVZ3c1p3dVxydVV1cVxucVlzb1dzbl5tZ1lucVdy +b1RtcVFxblRxcVVpa1NvcVlnb1VubFxpblRzbFFlaldqbVNoalJnaFBlbFFkaExsaFFjaE5m +ZFBkalBnZlVmY05lZU5hWU1jZEhfYU1LTEQ5Pjw0NzQyPDYxNjQ1PTg0OjU0OTo2OzM0Ojc3 +PzcwPDQzODkyOjUzOjQrPTU8OzctODMyODUyOTYxODc0OTc0Nzc2PTY3OTYxPTkxOjk0QTk2 +Pjs2PjU0Pjs1QTkxOzY0PDc3QDgxPTU5Pjs0QDY4PD0zPzg6PzkuPjI+PDgxQDc5Pjc3Rzk/ +Rj02PDw+PDk5RD47Qjs6Qj84Qjs+Rj8+RUKZqFP1/u31/+/2/+39//ny+e/9//f///30/+/8 +//j2//H8/+/0//T5+e7v9Onr9d7u/uzk9OHc6dfu9+b3/Pjp8unh9Nzl/eDb7N3U3s/f7dXx ++ebk8t39/vvl9eXj7djk9env8+z4/fbs/eHk7tjd5tz99/T2+uTm9OTo7uXw+Oj09/b3/vD9 +//7///P1/vL19+vu+u36//Dy+uzw/Ovl7d3MjZQ7QTQ1QDg7OTg0Pjk5Pjk4PTM/OzMyOTI6 +NTQzODM7OjYzPDE6ODYrPTI9Ni8yOjE5ODAwNDEyPDMzOjQ1OzM2Ozg0ODI5ODgzOTA6PzU3 +OjM0PTIxPjA2NzE3OzY7QDI1PC4zOzM1PTc2OjM1Ojg1OC00PDIzODI1OjI7OTczODA1Nzc3 +Oy0/Ojc3ODE5ODczPDI4NzkyOTI3PTQ2PTU5OjQ6OzI3OzIyOjE5ODY2PTMzOTY4OTI3ODQ0 +PC87OzQ3OzI3OTYzNy44ODUyODA6ODcyNjA8ODcsOTI8NjU2NzI2ODUzPC42OjQ0PDA1NjQ4 +NjUxOTIyOTU0OzYxPDM8PDc1PDE6OTU2PC87PTgsOi88MTg0OjI9OzkvOTQ/OjcwNjQ9NzYt +OzI2NzcwOjQ5NjMyNTAxODQ1NjU0OjE5NTc0PzI3Ozg4PDY2NzM8Ojo2OjE5ODYyPi05Ojgz +QSw2ODk0PC02OjkyOzAyOTk1ODI0OjM0OTc1OzQ0OjEyODM4PTQvOjQ1PDYuOTQyOjM3OzQ0 +PTU1PDMzODI0OTUxODM5OzUzOzE8ODU1OTQ8NzM0ODYyPDE2NzQ1OCw2PTUtPDQ1OTUzPDU5 +OTQzNy80PDIyPDoyPDQvPDQ4ODY0OTcxOyw3PDk1OS82PTg5PDE6PTg0OzMyOzQ4PDcvOC83 +PDcyODk6OjouOzQ2PToxPS4yOjQ3NTA2ODUzOTUyOjg2Oy82PDk1OjY5NTc2OzE4Ojc2PDIz +OTQvPDMvOC8vODA4PDsyQDA1QTQvOzI6ODc0QS9FTD1OUz5WUkZTVkJUUEtVUz5WWUtbVEFX +WUtYVEdXXkdXWEhfVkNXWUZhWkpXWE5fVkpXW0VdWkpXVkdhWU1dXEVaWU1TWkVhWk1XWEBk +ZEtWXUxiX01WW0dkYUdbXEdTXUlfXk1gZUNiW1BiXUleXk5kX01gYEtiXUZaVkheUkRLSD1a +Q0BRWDqBdV56f1h+cWB9d1l/eV57e1p6eGF7d194fVeBgGV7e2B6elt4fF15c2F+e1h8d1+C +eV11eGB9dFt1dlh2c1tzdVp6cV1zdVh7dlhyc1h1c1Vxcll1cV11cWB4dVZ3cF94c1p6b11y +blJzcFducVRwbFlpa1Nvb1hvblpzbldtbVNxbFVqaVdocVNsa1Nta1NwaVhsZ09oZ1Nrak1l +Z0xpZU1kZUxsYktlZ0tmY0xhYktTS0gzPTkwOTY1OTA9PDU0QDU5OzI1PDM4PjgzOzM3OjQ6 +OjEwPjU6Pzo1PjQ2OzI1Pzc1PjM3PDczOzU4PjQ1PTI6Nzc3OTc9PDkxPDI4PjY3OzQ9ODcx +PzI3PjY4PzM8QDg3Njs4QTI3OTw6QDo6PTc2PDU3OzE8Pzk0PjI6Pzg6PzU7QDoyPTQ/Qz01 +OzRCPzw0Pjw/Qj44PD1AQz1BRj1MSEWQolXz+uX////9//j5/+r9//X////////+//j7//nv +/vHt9d/v/+L5//X///n7+vb+//r////9//n5/fjl9eLl8t7h+N/O5sjW483r8+Hl5uH8//nv ++efv9Ory+O7t9e3x/PL2/+7z+fDx+ur4+fLs89/n+eX0//Lt/PX6//X5//j///3///vt9eXk ++OHx//D3/+/q6Obs+OX5/fDy7ebo5+Peho07PDpFQjg2PDc/OzkzOjU+OTYxNzU0PDMxNzc1 +PDU1NzkxODI/NzgtODA4OTYuNy43OTcoOzI0NzgyPjUzNjcuOTM4NjMzOTM1NTI7OzQ2MjMw +ODUyOTY0Ojs4NC81Ozc5MzUwNzY6Njg0ODA9OjQvPjM9OTktNzE4Njs0PDY3PDsyNjU5NTcx +ODQ4OTQ3OjY2ODg3OTU2OzE9NDY6PDg7PDRHQDg6Ojg9OjkzNzM0OTYxODU6NzYuODU5NTcr +NzI4OTc0NDQ5ODktPTE0OTY1Oi88NTQxOTU2Mjc2Ojg4NjA3PDIzODM2NjQxOTU0OTA0OjMy +ODczNzUvOzM+ODk2OjA/ODk0PDJBNTo0QjJDOzYrOTE5OTcvPTc4NDgzOTU2PjE4NzU1OzY1 +OjQ4ODU1ODI1NTMwOzE0OzQzODE3NzgxNTA7OjktOjA3PTg0ODM0ODw0OCw2Ozc3OjA0OS02 +OTY2ODc4NzQ0OzI2Ojc2OzU6OTc0OTc4NDk2NDg1NzYzODkuOzI0NjoxNjc5OTM1OjY3OjQv +NTU0ODUzNjg1PDUxODczODQ0ODUyOjQ6NzcwOjQ0ODY3OTY2OTQ0NzczOTYzOjQ2OTU1OTQv +NjQzODc2PDI1OzU1PDIzPDg1OTQvOzUyPDcwPzE2NjYxPjA4MzcwOjA7ODoyODE3Ozo2QDg0 +OzYzOy8wNzs0OjM0NjgwOzU0Ozs2OzcuODc1ODQ2ODcyOzc3NjcwNjA5PDAzNzQ7PTowNi80 +NTQsPjA6OjU3Ni07OTUyOzA3Ozg0OTE4PT1EUDtVVElTT0tWTzxTT0hYTkFXVEVWWUdXVkJX +VUxVW0JaVERWV0ZdWUxZVEhfWE1ZWkthV0xXWUthXE5VVUtjWk5WV0ljWEhhW0lZWEhcX0lf +YktcWk5cXENfW1FiYkddUEVeXUdhXkhhXlJiWUtiX0xaW0VgW01ZWEVlXExaTztOR0BVQzlU +WkN7eVh9fV+BeWR9fF6Be197eFmBc2d7eV96cV5+dV11fF2AeFt1el2BeVt1d1l/c15yd1x9 +c2J3cld4clx9cFt7dlx3eGF3cVh3c1V1cVZ2cVxycl94bVpvb1V0c190eF92cF1ybFRyblh0 +blZybFdsbldwblRtalVva1BucFpta1Noa1Jsa1VrbFFpZlFmaVFnZVVhZ01la1FkZ0tmZ1Jo +Y0hoZUxkZkplZFFfZFBkXk9ISD85ODQvOjQ6PTc6PDEuPzUyODI3Nzc4OjI1OzczPjA4PDI0 +OTI6OTkvOzE3OzgxPjE7OzkwPTM8PjY0PDM2OjgzPjY7PTU0QDMyPjc3ODo5OTk1QDg3Qjg4 +QT0+Oj00Ozg5PTg2OjU5ODcvOzA8Pjs0OzFAOTo1QDVBOTwxPzhAQTsxRDVBPzs1PDk7QTo6 +QDo6QD03PTc6Pzg9QTs8RUBBRUCeq2j2/+7///X///P///n////+///+//j///3+//r+//z/ +//v///v///jy//H8//Pv/Ovn9uPq8uPo8+Lz+Oj0+PT0+vPm89vx+uzd69nc5dXq+t3u8+rr ++uv3/vz///X59e7y/u31/O35//j7//bz/e3v8Ojh8+D9/vv///////Lu/+nx//T0//n7//nt +7+rs+e3z/e/x/e/3/vL1++3s++jZhI81Qjk9PDQzOzA0NzgqOi80PDosPjE6NjUsODQ9ODYs +Oi80OjQwOjMtNjE1OTMwOTMxPDIwPjAsNjAvPDI0PTA3OTIoNjE1OTItOzE0MTUqOTIyODQt +PTA4NTUtOC44PjgrNjAyOjMvPDEyODA2NzIrODIwNjEtOTQzOTE1OjEwOS80OTMtOjI4PTMs +OjE5OTUtODA9PTcwPS9CPTZCPzhURjpQTD1VRztIQDY3PzAzOjU0PDUzOzQzOzE5PDQrOTM1 +ODQzOS82OywvOTIvPjEwOjAwOS8zODYxOS4xNzUwPCwzOjY0OS4uPTQyOC0vNy05PDM0NzA2 +OjQwPzE7PTM1OyszOjAzNjE5ODQ4OTI0OS81PjU3OjEyNTk0OTIuOjMwPC8zOTIxOjE0NjAu +ODUsPDQtNzIvOTI1OjgqOzMyNjUvOjIzNzg0OTc8PTUyPDE3ODkyOjY1NzItPjc4PTMwOTM1 +OjYvOzA2OTE1PDc1PzIyOTUxODU1PDE1ODcwOjI0NzYtOTM0ODItNS01OjYyNy02MzUsOjQ3 +ODMtOi01ODEuPTEyOTQwPDMxOjUuOzMuPjIuNjc5PTc1Oi8wPDQwOzEyOTIwNzEzOTMrPDY0 +NzkpPSw0OTgwODEzOzktPDA0NzsyOC01OjkzODIvOS4xOzUsPTI1PTYwOjQvOzg6OTkxOjM0 +PTguOzcyPDcrNjI4OjkxOCo2Pj4tOjQ8OTQsOTEyODYwPTQ3OjMsOTYpOTU1OjgzOjMzOzMy +Oi0yOjcyOTU0OjgxOi0wOzQzNTMuPTRGUkFSUT5VUUlTVEJVUEtTUkVWVkdTUUBVV01VVUdU +WEZcV0dcW0ZYWUxXWkNeVFBaXEdeWUpaVkdaWUldXUtfYVNdXEZZVElhX0pWWU1fXUNVXktg +WUtTXExcW0ZdYUddW0ZYX0paWkRjXEhZXEVmXEhZYUdgYE5VXEBdXklVTTxUSTtYQTdSWD54 +flh8hWF7f1x8fF96e118e1d0eF92emF2d1x1el16c2B7dF5xeVR6el92dV56dV9yd1l4eF1u +eVd1dF1xdlh5c1pyeFp3d11sc1x5dFt0dFtwclpvdFlvcFVzclR2dl9yeFtxbFhxeVdvblpt +aldtcVltbVV1b1pqa1B0aldpdVFqcFtua1BrbFVnbFFtbFFkbFBrak1pZUxjZUtmak5paVBl +ZU9jZkxmaVFkZ05eYUtPRkQwPTM7PTgrPC8/PDkwOi43PjQpPDM7OzMzPDU3OzM1OzU0PDIx +PDYoPi4yOjYtOzM0PjUwPDM3PDIvOjM1PzI0QDUwPjMwPDwzPDU5PDo0PC85Oz43PzU5Pjs6 +PTM3Pjc7OTEyPjU2PTc2QTk9Pjs3PTY+Pzw2Qzo5PjY5Pzc8QjQ5Oj04QDY2Pjg3QDY3QTgz +QDY1Qzg4RTY8PDk4Qzw/SDySsGn1/eX2+u74//X////9//3///z///f///////z5//33/+7/ +//zy++79//j////4//n8//j////9//n2+vPk+OHj9d/j/trm9OPa7tXY7dbs6ePj7N3k8+Pw +/e30//b+//z7//H3/e3l+uHp+u34//r9//n2//fv/+j0//D5+fHx9+/9/vzz//b+//j7//D9 +//bu++34//jt9uXp69/e79rVe4guOzc5OzotPTE4Njg1OTQxOjYyPDkvMzUtOjY2NzUsOzY0 +PDc1NjIwLzUuOy8wODUoNjE8PDcwNTM5NToyOjA4NzgxNTA4OTssOSwsODg3NzU0ODcuPjIx +PDE4OTgzPS4yNzAzNzUzNzg2NzEyNTMtOzUxODE9NTUsNjQ3NTYrNzI+OTcsMy46PDIuNDA7 +OTM3PTg1PDI+QDhQSD5TRTlGRThKQjtERjtKQDxBPzs8OzU3OjUvNy8zOjkuOy4xOzgxNzc1 +NDgxNC4zOzM3PDEzNjkzNjQyNzQyNTQxOTczNTUsNjIzNDgsOi0wODQxNDA0MzYtOzMxOTI2 +Nzo3ODY5ODcxOTEyPjY0OjQ4PTMyOzY7Py82Ozc2OjMzODUuNjQ4PTUwNjA8NTcwOTA2OjYv +Oy80NTctNjQwOTcuNTU0NzExODM3MzU0OjVDQTc4PDc0NjczNTYyNjQxNjU3PDcwPDEzOzcz +ODU6OjowNzM5OjgsOi8zNzYxOTQ7NTgtNjI2OjYsOjk0NjwuNjMwNDEvOTQtNDQvOTMzNzgy +NzIzOTkvODE0OTkxOzEyOjEqOS8uNTUvNzM1OTQtNys6NjkvOys4NzwuOSwtODgzNTA3OTcw +OTcxOywyNzYvPjQuOTQxOTEyOTIwOTIvOTU3ODAyOjQ0OzQzOy42OzwrOzc7OzsmPTI0OTYv +Oy83NzkvOTg2NjM1OTkzOTEwOzYvOzE1ODQvNjQ1OzcvPzYwOjk3PTkzNTo4OjswNzEyNzwu +Oi0sOTMwNTQ3NjkvMys3ODkwPDFFU0NVTkhOT0dVTUZQUUNXSkZRUz5XVktYWEhWVkpWVEda +WEpbVklZVExfWEpXV09dWkpWVk1hWkhXW0laW0haWEhaV0hbXVBeWktXV0lTWkxfXkhTXU1g +Wk9bWUliWE1aXUZeWkpZW0deW0xdWz9gW0xWYUVhX1RZYkVWWkxVUUJPSzJSRDtQWT14eGCA +d2J8eF6AeWR+fF18eVt2fF95e2N8dVp7emR7fFt+d2Jyd1t9eF16dV55dF10dFl4d2F9dFtt +cVtzd1t2dF5zd1t4c2Bwc1Z0cVpzdFt6d11wcVhvclp0bFZ0c2Jzclp0bV9wclN1bmFxcVZw +cFdsaVVvbFZtcVhsbVZ0Z1RralRlaVhoaVFraVFqZ1JralFtalJqZ1FqalVgak5oZ09bZk1l +ZU5gaE1oZFBcXkpORj82PDc9PDY0OzY1PDU3PjkuPTQ0OzYvOzQzOjYvOTQ2PTQ2Pjk0OTEz +PjY1PzE2OzgzOTQ1Ojk0NzE1OTo1Oi4zOjc4PDI1OjY1PDQyQTg2PTozPjQ2PTUxPTA2PDgt +OzU4PTUtPTQvOTQ0PDYvPTY2Qjc3PTQ2OzUxPTQ1OzczPTQ8QTczPTs1OTc4QDk3QDU8Pjw1 +QTQ9PDsxOzc8QT08Qjygt2n+//n////7//js/Orv/ev9//D////z//H0/fHz++n9//T+//r1 +/fft9Of0/uj5//T4//Du9+jm/d7h9eHc7Nnd7d/O5cTb6tXf89rc7Nj8//H6//fz/ujt+Orr ++d7x/vTy/+nk+ub9//v///z7/+39//n+//z///nu/ezy/+nq/uXk9d3i9OLy9Ojk9ePu/+Tk +7eX0/fHz/+vz+Orp79rKc3s2Ozc8PTstRDI4Ojk1PTA3PDg5PDU1Ozg4OjY1NDQuOjY5OTg5 +NTIzODAwPC06ODQxOjA3ODQtPy81NjcrNyc1NjUvOi85NTsxOi45NjMzNTM2OjQ6PTc1ODI1 +NzU1Oy41NzI+NjAwOzQ1NDM4OTE5PDIzPTI+ODIxPC85ODUrNS9CNjYqODE7OzMoOjE5NjE4 +OjQ7PDhORDpcSzdRQzlEQDhLOzpAPzREQDhGRTRPRzhAPDY5OTE0ODM1OjA3ODU0OywwOjMw +Ni40NDYuOSowOjQyOS00OzE2NjAsOzE1ODMsOzE5OzQvPSozOTUsNiw1NzMzPDE3OjM4PjQx +OC45PjgyODI5OzU1OzM0PzE5OjU8PDA6OjI4PzQyOjYvOy42OjIvNiw5OjUtPC44OjQsOC8z +ODEuODE8OC0uOjI1NzQ1PTI7PjE/QzhQRTdBRDg6NzMyPjQ1Oi81PjY4OTU1PTI4PjUxPDA5 +PTguPC45NzU0PDE3NTIyPTA4ODUvOy01OjMuOSw0OjMtOi8yNzUyOjAxOjY1Ny8zODMyOzMx +PTEzODUyPDQyNy0yODYuOS0vOjQtOi00PDEvOio2OzQuOyc0OTUsPCczOTgxOi8wODYvPjUz +ODIqODM3OjYyODM1OTI0OC8zOjQ0Oy82NzQ0OTA5ODYwOzA3OzQvOzE3PjsvPC43OTYpPC40 +PTUvPzA4PC8xNzAvOTQyOTUyNzEwMzMvNzE0ODQ0OjMyOjQuPTQzOi8vODYvOTEyODQxNSgz +OjcyOCsyNzsuNi46ODc8OjBFTz5TUUFSUUdQVkZWT0VXVUdWVT5aVEVWWEJbUEpXWURZXUte +V0JbWEZfWUZUWEleYEVWU0tiV0hXWkxiWT5YWE5iWkNZXUxcYUhfXEheWUVdX0hWV0ZkXUhb +XENgWURWW0FZXEVbY0RiYEVcX0FkZExZXT9kYENbY0BfWkZQTz5VSTtVRTxUXDx0eliBf2J7 +emKGel+Aelx8dll8d1d9d1p0e1p1dV12e1yBe2R0el17cll1gFp6dl97elx8d2B5d151eld6 +eFp1eFlyc1d3dV50cVZ2cFpzdVZ2cF96cV52cl1vdlh0cV50cVh1cGByclt0cl1yblZ2b1hy +blZ0c1lwbVdxb1Nxa1Zub1Nxa1BoalFvbFVtb1FrZ09pZ1NlZ1BraFVkaU5mY01hZ01mY01e +ZkprZFBdYEhNQjswOTU8QDU4OTczPDQ4OzQ0QC42PTAuPS48ODczPTM5PzM6OzQ0PjMxOzIx +OjA4QDQ0PTQ2PTYzOyw4PTkyPC00PDQ3PTA2Pzk6OjQyQjY9OjcvQTI4QDUyQDQ8OzgxPTM4 +OzY1PjY2PjczPDQ5PDc2QTg0ODE8PTY0PDo1QDg6PTU3PTo6OTQ7QTc2Ozk8QTc9Ojo5QDc7 +Pz41QTU9RDg6STakyXr+//b///////7///////3///zx/e7+//j///n+//zy+ubq9uD3/+/+ +//n09e7r+eHn9uTo797u9+fv8Ojr+eHh6+LY7szt9Ore6tXg4tfm/Ony/+7x8fDl897t+/Xz +/ufm9eT0++nz//T5//Px/+/v/eXl99vl897p8+Pr797l8uv7/fT6/ff4//X19e769PLy5+Xx +/Oz6+O7u9urv7ebUc3Y9QDk6PjcxPTk9PDg2PDg1NDYuOjwzPDY8ODc3PDg0NjcuODQ8OTQv +ODM5OTUuPi44NTk0PjY8PDcvOTE6NzovOzE0NjUzPDM4OzI0Ozc9Njg1PDU4Ojk3OjM5NDc5 +Ozg6ODg0PjQ3OzEvNTQ3NzY4QTRmSUBdQThCPTgyODI4ODgzOTA6OTc3OjI3OjY5PDM7Ozc6 +QDdhTTxfSj5aRjdVQjlNPzpIPjg+PzRCQTlKQDpJRTZLPjs1OTg5PTMqODI8OTgxOTA7Ozcs +Oi88OTgvNzA7OzApPDE4OTc0PDI2OTIxNzA1ODQ6NzgrOTE4NjUxOjY5PDM7PDQ4OTU4Ojk7 +NzI2OjgvOzQ6OzkyOCs6OTo4ODBBQTxBOjg3OTU6NjY1OzM3NDgxOy8yOTE0PTM1ODIuODRB +PTFMPzs3ODI4OTY2NjNAPjtIQTVcQz9EPzk7PDg1PDA5ODI0Njg6PTc1ODk1OjQ5OTUxNzg5 +ODg0PTY6ODkvOC86NjQuODE0OTQ1Ozc0NjkzOjc4NzE0NjkyPTE0OjQ0ODExNzQzOzAzNTQ3 +NDMzOjE3NjswOjE2NjkvOy84Nzk0OzQzODkvOTM3ODszOTM5PDkwOzMyODUuOjc2OTkzOzUz +OTU8OjU1OzU1OzU0OTU1OzY3OjYwPTI6Nzc1ODQ7PD4vOTE3OzowPTY3PDYzNy06OjszOys1 +OjsyOi82PTc1NzQ5Ojg1OToxNzIwOjQ2Ozw1Ojs1PTQuPDA3ODQvODE3OTYuNTQ2PTsrPjE4 +ODouOjA3PDgqPTE8RjxDUD9VVEpbUkNXUkNXUUlZV0VUVEtVWEJaV0lXVUpcWUVZVUdaWklj +VkZeVktaWE5aWklhWE5XWkxjWk9eW0NdYlVWWENgXE1bWERdYE1gWkxcXEteYkxbYUteXk1b +XEteYkheXUpbWExdYEleXUpjXU1ZYEZhYEtfYUdlXElUT0FaTDhOQTxdX0V/fmOBel1/dl2A +fF2EfmN7fF+EcmV2d1uBe2J0elx8elp7eF6BeV57elx8dlp2elp7emJ9e155dlp3cVp9dFpx +dVx5dVl1d1t2dV11elp5dFtxd117bl1zd1h0blxydFd2dFpwdFdzcF1xc1V0cVpwcldzcVtz +cFlybllrbFRub1hxbVptbFVtbVRwa1FxaVFtalRlbE9tZlJkZk9oZlRjaExqZlNkZktoaFFk +YkxmW1FEQzs6PT00OzU8Ojg2PjU2PDM7PjY2PjM2OjM2QDM8PDg6Ozw3PDQ9PDk0PTQ8PjUu +PDE8OzUwPTNAPTkxOTE7PzouPjQ+OzkxOzU8QDMzOzQ2QTg0PjY1PTc2PDkzPDU1Pzk2PTo2 +PTY0PTY5Ozg5QDw1PTc4Ozk1PjM7Qzw4QDU6OTk4PjA3Ojc3QTI3Pzk9QDo3QjZCQj06QDs/ +PDw4QUA+Qzmk24f6//L///n///f////8///2/ez+//v///z///jy9vD3/er////6//z8/fb4 +//T9//v9//n3//Hw/O/q9t7u9efh9uHr/OPl8OXe6tfZ49P19uvu8urz/vP8//fv8+Do7uLt ++/Hw+uz3+/L19erz+vr58+/+/v7///X0+PH9//7///v9//bp/+zj/d/s++7z/+by//n08url +8ODw9+js793Zc3o2PTJDPTsvOy47OTsyMy07PTovOy41PDgyPTY0PDQ0ODI2Ozc1ODg1OzI0 +PDQzNy85NzI2PDMuODQ4OzcyOTE5OTctPC06OC8tOi47NjAyNjI/NTgwPTY6OzU0NzU9PzUy +ODIzOTE0NTUyNjE5PDU0Py9lVjldTDxQPjc+OTQ3OzA4QDYwOy82OzM/Pi47ODk+PS9RSEB6 +Vj1vUEBsSTpfSThOPzdCPTRBNTo2OzM8PTRDRzVWRj9CQTM1NzczODQ6NDY0NjQ0OzMyOTU2 +NzUuNTE0NjM3ODEvNDQ3PDIzOzE0OzIzOjQyNjY2OTEtOC08OTg4NjQ9PTUyOjM6NzEuOi82 +ODEyNzQ0Ni8wODE2Oy81PC88OjU4PTs3Oyw2ODcyOzM0OjU2NzY1Ny83OzMuODA3ODZBQTNV +RDo/QDQ3ODM6OjJEPDdQRjhoSUFDQTc+NjMyOTU4OTU9ODM0PTc7OTU8OTg2PDc0PzU2OzM1 +NzQ1NzUwNzcxNS83OTg0NzM6PDgyNzA2OToxNywyODkuOSw0NjsxOSw3OjkzOzEwODA0NDMy +OTg2OTM2OTkwOTYuOTMyNS4zOTUyOjI3PDUvOi42OTgxNjI8OzUqOTM2OzIvOjg3ODcvOzQ2 +NjU0OTMuOi01ODIxOCwyOjUyPDI0OjY0PjQ3PTcwPDU3NzEzPTY2NjA3OTwxPTA3ODgwOys0 +ODUuODI4PDcyOi8vOzUzOjExOjM4OTAyPDI1ODguOC83ODsyPTE0ODwwNC02ODM0PTAwOjc2 +OTM2Ojg4PDYvPTBLTz5RT0dTUUdVUkhZVEJUUkNaU0dVUkZZWEdcUU5XWkZeW0dtf2hmXUtV +Wk1iWUlbYEVbVk1VW0NfV0tfXEhfV0tjXkhiYUdXYExdWzxXWkZgYExVX0hhXUtTWktbWU1a +WEtbWEZbWUthYUphXEVjXU5dW0dhX1BbYENpWE1VUTVUTDxQQjRZXUF8e1p7emOBe1p8eGF7 +emGBdV19elqAfmB5dFt7eGF4flx/dF95e1yAeFh3dl99cmFzeFd9eWR7d1l4d2N2dlt8gF54 +d1t1d1l6dlp2eFl0dVt1cFxycF51dlpzdl1zclZyc1t1d1hxcFd7clhvcFd0c1xtcld5b1lt +a1d0bllna1tua1RtbFZsblZvbFRta1NxalVpZk9lZk5mZk1rZ05rak9paExlY05pZU5qZEtj +WUhEQD02OS47OTc3PS82PjU5OzI4Pzs5OjU2PjM1PTg3PjY4PDQ1QS83PDUvPy82ODcyPjM4 +Ozg4ODQ8PDcwOjg1OzMyPzQ2PTU6PjU2OTc7QTYxPzU4OjY3Ojg0QDY3OzkyPzY6ODk0PTQ5 +PDY0PTQ8OTgyOTE9OjgvPDU9Qjw3PTk6PzU1QjY7PzY0PTc3PTg7OTo8OzI/RTs6QDk5PDQ7 +QThCSzyo2ob0++f9//j3/+vx+ev4/+v///v8//T89vL9//j////4//P9//H///b///j9/Pjs +/ers/+fu/+rw/Ovu+ebu++nf9uLT7MnX5dLf8dbf89v0//v1/+vv9e/k89rd697y/Oz+//7/ +//3t+ejr+u329+z1/O/z+/H3/PL4//Dz/fH5++vq+Ovs9ers9e/5+PTy9Orr7N79/Pz///77 +//ft8+XOb3Q7QDc6ODszPjc2OToxPzY1PDYqPjA1NjUsOjM4OzgzODE5OzIvPTcxNTQzODQu +OTMxNjIzPzk1OzY1Oi0yOTAvNy0sOjEyODQuOTE3OjgoPS8yNjIyPTU2OzI3ODI4OzktODQ7 +ODY0NTI8OzczNi43OzU2QTZQQTpZRjlGPztAPTdCPTlAPjdNRDlRPzRTQzleRTuTUUGsaEap +ZUjHhlTUiWWwXElaPDo/PDI/PjY0PTJBPThPSDhLQTkwODM4NjM4ODM0Ozc0OjQzNjEwODM1 +OTgwNzI0NjUwNi03OTUsOis2NjQsOi06ODUmOC49NjY0OTVCQDQ4PDNAOzI0OjEyPDIyOTYv +PDM3ODAzPC8yOS4yNS08PTY8PTczOjA1ODoyOi83OzgzNi8wOzctOC81OTw1Oy46PDc4QC83 +PDk6NzQ9OTZCQTc/RTdNRjpAOTg+PTgyOTA5ODM6PjdDQDdDQT09OzFAPDkzODU1NzoxOTE4 +OzYxNzc7OTgyNzY2PjQ0OjgwNzIzODowOTY2PTcwOTE2OTIvPS42OzUvOTI1OzMrNzI2OjEz +OTQxOjQvOTYyNzI0OzUyOC4wOTQzODIwOTYyNzMwPDI1NzszPDc4PTIuPjE2OjwvODE6PDwx +PC41NzkxODI2NzUtPDA2OjcwOzI2PTgzPzQ0NzY7OzIxQDo3OjE1NTs2ODQ5OjYuOzA0ODkv +OjAzNTYtPC00OTQpOC80OjooOTE3ODs0Niw6OzgyOTIyPTQwOi0yOTcsPDQvOSgyODAyODEv +PDQyPjUyPzJNTUFVTkNVVkNPVENYVEdVUUJZVEtSVkhZV0tSVkJaW01UXEZfWUxZW0dhWEdf +VkZbVkZbVUtfXkldVktTW0deWk5hYEhfWklfXEtfW0JhWk5bXEhhX05ZXUllYExaXj9eX1Bb +XD5eXUpbWkFdX0piWEVhak1aX0hbYkhcW0lQSzpMRjxVPzhZYkGDfFx+fmeBe2N5fWKAe2B2 +eWOBemJ3eGWDdV51d1l9ell9dlt+eFqCd2B+eFl+e2N7eVd/dmB7e113d158fF97cmF7clx6 +c1xxd116c151a1p0bl55cGF2cV11b1t4b1dvc1twcldxdF10cFNublZvcVpyc1d1clptcFVy +blppcFJzb1x1cWBwbVVpbVFwallra1FtaFVnbFNoaVVnbFBvbldoZ05bZFFoZE1jZEtfVkdD +QDs7OTQ5Pjc3PDQ2OTk1PzI/QDkxQDc7PDsvPjU6OjozPjE2OTk3OzA5Pzc2PDU1ODY3Pzkw +Oy4zPDc2Ojg7OzcuPzMxOzM4OzUuPDE7QDc1PDM6OTgvOzE9PDcyQDQ8PDczPjY9PjkuOjM8 +OzYxOzg8Qjo4Ozc3PTQ2Ozo6PTU6PzgxPjQ3PjQ3RDk5PjY2RD44QDo5PTc3Qjc4Qj06QDVB +RkOt4438//P////9//z9//P///////////////////36//3w/uH7//D1++/1/uz7//f0+ezu +9ejt/Ojx/+fm++Pl8t/f8eDd69Xf7+be6NXU4dDy8vDs9urt9uv19Of4/vz////p9uXu/+Hn +9OXv/ejt+uXx/evy/+74//H9//b2//L4++vx/vX5/e75/vX8/+/6//z5+fXt/u7+/+3x/+nm +9N3AaWs6PDk9NjY2NjZAPjs0OCw9PDUwPDU3NjI5NzY2PDY6Oy42ODM1ODM6NS8wNjU1MjE1 +OTE2QzcxOTg6NzMwNzU3NzUuNzY2NTIvNzI6NzgwODE2ODUvODA3OjYwPCw8ODM2OzE7OTI6 +Niw5OTM1OTAyOTA3ODJNRzhgSTlMQDlEQTZFPjdIQTtRRzhZSDWEXEPYsHvx27Ty477038D4 +5L/45L/uw5qtXVFEPDBCPjY+Py9FPzNRRzhbRjdAPjU+NTQ4OzM4OzQ3OzQ2OTIyNzQ4ODUu +NC4wNzErOjE3OTUrNy89MjYsNTE7NDQqOi81OjEyOS5FPjc8OTJBPTY9QDY0OzA1OjAwOjM2 +Ni8zOjI3Oy4zODM8PTJAOTs6QDI2Nzk1PS8zODkyOy4wOTY1PCk3PTg2OCo2PTk3OTExPDE9 +OTI8NzVBOjs5PTc8Ozc2OzBAPTVcRThnQTV8RzyUVEOfW0iERUFTQjw5OzU4OTYvOjE2ODcv +PDA1ODQsNzY4ODMyNzQ1NTM3NjczNy84OTwrNy0wODIuNzI0NjMtOC80NzEyODAyODQyNTU5 +NzEwOTcyODExOTc3NzIzOjYvODIzNjE1ODE3ODIzODEwOy03NzQwOC44ODkzOjAzOTUyOS81 +OzkvOyo1Ozc0OTMyOTA0NzQ1OTU3MzY5NzY1Oi8wODQ3NDI2NTA1ODM0OzUxODQ2ODovOCs1 +OTYyNzE3OjMvOjA3NzgzOik4OjcwOC8zODg2OSs2NzU6OC80NDcuODA0Oi8vODMyOzI2ODU6 +OTczPzFOUUdQVkVYU0pTTj5WUUVTVz5bVktXUEJiWExTVklbVkpXWklcVkdcWUVeW0haWUla +V0ZiakpfWUJgWEtaWk1cWUxZUUVbWUNfXEpVUUtfXU9aYEVjXU9cW0BiYE1bVzxdXk9cWkRa +WUxjW0RkXUtfWkFcXEthYE1iW0NgW0tXTDdRRj9LQDdcZUiAemB8fl9+e2B2gWSEeWJ7eF2C +e2B0dF6Ed155clx9dld1eGF1elyBfV10d2B6dV17dlt8d190d1Z6eGN2dV6BdVpydVR4dVxs +cFdzdVt7dVl2dFh6clh0cll3b1p3cFd2bVt4d1lyblx5cFlycVZycVtrbFh3allvdFZya1xq +a1NsaVZpa1VyaFRobE9vaFJna1FublBna01ta1FnZlJpZUtmZEpfY1BlaU9jYE1gWERDPjo4 +Pjc8PDgzPjI/PTo0PzI7OzY1OjU5PDc0NzQ8ODo0PjM9OTc0OTQ6OjQ7PTM1OzQ3OjQxPC80 +PDYzODUxPjc5OTg3OzQ8PDgxOzU6OTg0Ojg7PDUzQTA+OTozQTI8OzYwODU8OzgwQzFBOjc2 +Njg9PTs5QDc5QDo8QDQ8Ojc6PDg9Qzk/Pjg1OzU6PjM+TkBBQjw5Qj46QjROU0ZDQUNKQkWw +5Yf1/uX4/+n///////zx/+/+//X5//P9//P9//X3/+/8/+7///v///z9//zu8+r9//f+///3 +//Hz++/t9OXs9Ofg8trb9tDh+N/l6eDX5NLt/+zr9+Xz/u/t+/Ht++rs/+3w5+zz9e3+//77 +/ff1/u/+++3j9+Dk+O34/e3u++zl8+Tz+Orv/PX+//z////m9d3o7ev0+e3u9+n0++Xj4ta4 +Y2U/Qj46QzQyOjc4NTg2OjQ0PzQtOzUrOjY2ODM4Nzo6OTYzOzU+OjM0OjQ7NzcuMzU9ODcs +QT8/OjYsOzZANzYwMTY6MzQzOjUzNjE0OjUzOzM3NjE3PTI+OzY0OjJDOzc8PDk+NjY9OjU5 +Nzk9PjUwOjA7PjdEPjdSSUBMRjVJQTxHQDREPzlOQTtiTT7OsWz18Mn5+t33+d/8/eP7/OH/ +99z268Xam3RkQDlLOjZHQTVIPjVRRDhWQjxDPDU6PDE4OjI3OTg1NjM2OTIyNzQ1ODQvNTM7 +OjYxODA7NTg1PTA9Njo0NjI7OjQyPTI8OjU5PDBCPjc/PzY9OjU3PDU6Oy04Pjg/ODQ6OjU3 +NzQ9PDRBPTdCPzRPQT1PRTk3NTUvOjM0MzIyOTM1NzUrNi84NDcwODM4OjY2NDVHNzs7PzNG +PTtBPT03OTk9NzY/PjlbRDuOYT61eEvRm2Pdq2/ktILTlGqjYE9hQDdBQUAxOzU6OTovOSw4 +NzcwNi0yODYyOC85ODk2NDczODM6NjU0OjU0NzQ3ODc0OjMyOTcyODMzNjAzOTgzPDguNzIz +OjcyNi44OjctNjg4NzctMTU3NzUvMzE5PjUzODIxOTUyNzYyOS00ODgrOzY3NjkyOTI2NzQv +OTM3ODk2OTczNzExOjoyOjM1OTc1ODUzOjcyODYzOTQ1PTUyPzs7OC01OjQ0NjQtOTM9ODw1 +ODY1OjsxNzM2Ojk3OjI4Ojs1OzIwOzUzPC8zNjc3OjIwOTw3NTMxODU0OjEyODQ3PTQ0Nzgx +QzhOT0NZUUVYUkxSVUpYVUxYVUNaVEZSW0ZcV0xWWEVaU01YW0RcVktXV0ddWEtaWEVbWENZ +WEpfYktZW1JcXUtaXEdcW0hVWkhgWkxcWk9dXEVRXkhhXExXYUthXk5ZW0dhX0xYWUliW01W +XEVjXEteXktiXEpeV0daZ0dhWEJWQjxNS0BORTphbEmCfmB+fGGFeV99fWOGeWN1e12Ce2Z0 +eVd8dFtzcVh3b2NzdlaAc2V9dll9eF56clyAdlp7eGJ5dWN/eVx5dlp0d1l2dlp6dF94dVp1 +dF58cVl4dVp4cWBxc1p2dF9vcll5bl1qcFV2clptcVdzcFlzb1pya1hybFt0b1ZtbFdra1pt +blZrbFRwa1ZxaFJva1VqbFRtaVVua1VxalRsaFVoZ05ralZjZFBlaVJqYktbWE4/Pjc3PDY6 +PTgyOTk4ODk0Ojc8PDg2PTY9OTs0OjI5PTo3PDQ4NTc6OjU5OjM2PDg4Ozk7Pzs9PTk6Ozo1 +OTc6OzU7Nzk1Pzk+ODk2PTU6Ojc3PjQ3PjgtOzY9Ozk4OTM/OzsyOzg8PDY3PDU8Ozc8PzpA +PT46Ozs7PDk2Pzk+OTo6Qz08Pzc3Pjc4Pzo6Pzg5QT1EPz0+Ozs7QDZDREM/R0FFREi+6oz+ +//////f///////////7///////////39//X///zy++f6//D8//P5/+71//Xz/uzw+Or5/vDr +8+rt9+D6//Ho7vDS3snX3NHf6Nnd4tfl7Nnd99/j9en6/vvy7+He7uDr/eTv/+Ll++L1//b5 +++fi++L4+uz+/v3///vz9/X//v7s+ej0++zm9+Tm++Lx9ezp6dnt+Ojq8eL89Ozo7Nu8Y206 +Pzc5OjcyOi46OzQzODQ2NjEzPyo1OiwyPjE1OzE2ODMxOTI0OzMzOCouODE2OzUuOTE2QDgr +PDA2OjIzNy4yOTUsOjA3NzUrOS47OjI1Ni86OTcxPzA8QjRDPjVTQzplRDNiRTlUQDdEPjhN +QDRAOzc6OTA+PzNDQzVRRDpLRzVHQjhJQzFaSThzZjvp35f7+tn9/Of6/uH+/+T5/N3+/OP7 +8tDktH16T0FVRTRTQzZZTDVhTDplTTtTQzM6PzQ2OTAyPC4xNzA6PTQ4PSpRRTpTTDZWRDk0 +OjE8OzMwPjA9PTMxOjA8PzI/PjZMQjdJRTpFQDJGPDU/NzA/PDE5PDA9QC9DPzY/PTM3OjNA +PjBESjo8PDFLRDpNSC84OjY0NiwzNjY1Oy0wMzQ2ODQtOi0xNjU1NzNAPC9GRDJRQjRTSThF +RDU8OTY9NzE+PzR6XTvBklPlzHj68cL478/69Nnz38Xfr4CobFZXRDQ7OzU2PzM0ODE0OS8z +OTEvOTA1NzQtNzAzNzQxNi00ODMrODEzODQsNS8yNjEyODMzOC40OzovOCwsNzQzOi4tODAy +PDMwOjQvOy8uOS80NzYwOy4tNzQsPy41ODIrPC4xODQwODAxOzEqOiwwOTUwOjExODQvPjA0 +PTc0Oy8yNzQzODItOjcvPy82OS8wPiozQjIvOTA1OTYsOyw3NzMzPS81ODQzPi84OjYzOi84 +PTkwOSo0ODY2OS80OzoyOS8yNyw0NjMvPC8vOioyOCgtNTAvPS8uMi8yOi4tNyo5NTMvQzFN +TkVWUEBYVEhMVkNcV0dVVURdVUFPVkJZUURZVEJVV0daVkpZU0dZWUVaXEVaW0hXW0lXWkFj +X0RZXUlfU0tVVUZhWk9WXEJgWk1ZWkJbYktXX0liY0taY0FXW0lfWEZdZ0lkZkBZXERhWkte +WUZjW0leX0ZgXEhfYEdeV0dVSTlSSDpUQjdfakuAfFuBfWGKe2B9eFuGfWJ8d2CCfF1zcV15 +cFp1bllycVF2clp1e158e2N2elx8eGN4d1t7clt3eV13bVl6eVl3cVZ2c1t1dVh0c1Z4eFxz +clpzcVVyeVtydlVwbFZ1cltvb1h1cVhydlp5bVtzb1pxbVZzdFNyblhtcVFzallwbVBybFZr +aU1lbVZoaVRxaE9nZ0tsalFxa1Rmak9qak5nZk5kZkppZUxfaU9jaE1cWURAPjcxPTM4PTQq +OjE9OzIwPC84OjQyQDE3PzYyPTI6Pjc0PTIxPTY3PTMyOjAwOzMvOjM3OzM5PDY7Ri89Ozk7 +OzA0OjQwPDI6PzkwQzE5PDkuPTI/OjQvOTA4PjQwPjM6QDUzPDM1OTEzPTU0PjQ3QDc4PzU8 +Ozo1Pjk6PTYxOTQ2PTQ4Pjc7PDA3Qjs0Ny84Qjw0PDI3Qzw2PzQ/RT88RzhMUUrP8pT8//D/ +//3///f///j///f///v///n////7//f5//P7/u3x8+Xn9d31/Oz6///q+unr+Ofy/ezy++3p ++ujY7tXU6dLg9NPh69/a6dHR3Mn0+/Tu8er9//v1//H3//f//vLt8Orr7ebu9+ft+Ory+u/s +9un5/vX5//fy/e/+//bx/+n3//Pp7eLl8eHq+Oz///Dq6Obt8uz1/urw/er2//nCX3g1PjQy +OzQ2OzMyOzI7PTcvOTE8ODgwODA3OTksODEuNjgtOzE5PDgrPjU2NzcvPDYyNzgwOjQ1OzUx +ODM5OTY2OjMyOTMyNzU5OTQzPDI4NjQ3PTNBQDdLPzaGUT+bbErAgVm7elKvak6XXDyBUUVY +QDlHPjo8QjRIRD9PRTlaTEBYSD5ZSDdnSDp7aULo6aT8+t78/+P9/+T9/eL8/OD8+uL88NDW +pGl+UkJhSzlgRjlWTjpkTTxaSDlVRDcwOzA4OzA1NTA0OS43OTI6PC5HQzVOSzlMRzwyPjQ5 +PDQxPTc0OS81NzY2NC08QDk8RDFFPj06PDA9QDg+Oy42PDg3Oi44PzdCOTQ6PjRCPDVHOjVA +PTc7OzA8QDc5PjY4NzgxPTQzPDMsOjQzNDExNzcvNDcxMzMwOS9BPTRIRDdXQjlXRjlVPjg/ +Ojg2ODNGQzmCZj7Eo1bo4H/6/cX499f8+uT7+t/y0qq7h2RwTj5DPTg8NzY0Njk3NTMwODQz +Oi8wODU0Ny8vNDc0NTMvOjUtOjQtNjQ1OTMtODEzODcuOC84NzkzOTUzMTYxNzUzNTUrOjE2 +NzwuPC83OTguNS8zNjcvNzAuNzcyOTIyOzQzOjIyOTUyOS40ODQyOTEzODcwOS81ODExOjM0 +NjowOSoxODYxOjAxOTYzODEzODkyNzA1NTw1ODMzOC0xOzEtNzc5OTkxOTMyPTgxOC8zOjM1 +OjMwOzM5ODQvODk4NzQsNy45NTYqOC82NjcoNy02NzQtODE1OTAuOzIsOTY1ODA2QjhMTkhW +U0FaVEtYWkNbV0dXUEVWTEZXU0hUV0lZUU1VWUdhW0tXVUtcWE1dVz5hV09aXEZWXU1eXk5d +V05bX0taWkpbWEteX0ZbYVBbW0dbXUtXXUheWk1jX0ZXWUtlX0dbWUtmX0NVWEthXkRdWUZl +Y0xbXExiY0RbXkxcVkZRSj1RSzlWQDladUqJf2d8eVx/dWF1e19+dVx5c156dmN0dmF1eV5y +a1lrblNtcVR0el6BfGF+c2J6cV2Ad195dl92c2B2c115dV13dFl2c11ydFh2clh1cVh2b1t1 +dVlzclxsbV51cV1yeFdzalxycVdydFlwcVhualltb1VrblZtcFFycFVubFZucFVtbE9sbFZo +alNnaFNvalVva1NlbFFraFJna05nalNlZk9malRhalJoZlJkZ01cVEpBPDgzPzIxOTY3Ozc2 +OjY6PTgwPDU4Pjg3PTU3PTcyOjQ9PTkwPTE8OzopPzE8OzYsPDI0PDUvPDI1PDkvPTM0PDQz +PDgwOzM8PDYyPDc2OzY0PTs0OzYvODU2PDQ1PDU3OTIzPjM0PTE7Qj04QDE4PDs/RTo4Oz05 +OzY3ODs5PjY0Pjc6Pzk1Pjc7PDY0QzE8QTk3Pjw8Pzk1QjY6QTs9RD1BSz7M85n6/Oz///z9 +//////z////2/+39//b///f3//b6//Lz++v1/+n9///7//X5/fP0/+r5//Lw/u3z+Ofr8OTt +9OPr/e3g+tje9tfe8NTi+uT////6//j0+e3i8Nfy/e73//L+//z5//H1/efz/uv4//T+/v33 +//Ho9eDr++z7++js++j6/u/0/e/8/fPz+Ofs/u/9/fnx/+7y+eLf9Ofr59mjW29BQjw3OTo4 +OjM7PjYtPDI3PjI0QDQ/PDU6OjY4OTk0PTQ6OjQwOjU5ODg2OjQ4OTczOjI6OjU6PDc0OTA7 +MzM3OTMuOTQ0OzYxOTU7PC8wODE9PTNFRTiEYEXFn2LYtn3mzJDrwYjr1KfkpX/NiVWZWEhh +SjtTRzlJRjZNRDRTSzpfTTllSjtyTz54Yz/Y4IT5/NX//+D//+H//+P9/N7//eT278O9gVd6 +WD12UUBjSzhjSjxaTTx2VUZkSTg8PTY0NzQ1OTY2PzE4Oy02OTU/OjM7PjQ+PTM3PDQ4OTU6 +NTM7PTk3PjU7PDgyPDE+PTsyPDI+PDkwPTVIQDpCPTZLQDlAQDNLPjdBQTRJQDpEPDk9QTVE +QTdAPjQ8MzU1OzM3ODU1OTQ8Oy48ODM1OjI2ODkzNiszPTczPitOQTtaTTJwVkR6WD9YQkM9 +OzdIRDV+Xj+wkErl2XP6+8v89tr8/+P8/eDo0Zm0hlZpT0BFQT04ODk0NjE5OTcuODI3PTUw +NDQ1OTQyOjg4OTUxOjYtODQvNzg0OTU0OjQwNy85NzM1ODQ3OjI0OTI2NzUwOTQwODIyNzcz +OTMzOjU1Oi0wOzU1OC01PzgyNS82OjozOTIuOjY0ODYyPTc2OzgxPjc1ODgzPDI0OzYxOS86 +ODczODMwOjs2OzM4ODkwOzQyOzQyPTMuNjI1OzMzPTY2NTUwNzYyOjExOTcxOTU1PTkyPy44 +OzctNzI5PDovPTAzPTIwOjE3NjwyNi05NzcyQDA3Pzs0Oi84OjsyOSs8Ojw3Pz1RT0BUUUhb +VEpTWExaTkVUWkZZWEdWWUtZWUtXWEVcXExWXEZiWkxYWkJiWUlWXUVhXExTXExkWkxYXEdk +W0hfXklhYlBfW0ZfYkhgX0tfYExXX0lfYUNaZUlgZEtjYEpbXUtYX0NgXVBaW0pqYk9fYEVp +XVViYENiYU5eW0FUSkBURDpUSjticlB/e2GDfWF5e1+AfGR7gFuAfGCAel58eF+Ad1p7c2Nq +alRiaE90d1d0fFd/el9ze199eVt2d2R8fl96d191el18d15zdlV9c1xxeld4c2J1dVV6cGN1 +dFp+clp1cl55dV10cFduc1x0clp0b1l0c1trcldzcl1xcVdycVx0bE9zbldta1VucFJyaVhr +alRubVhqaVBva1VqblByalJrbFJwaVJna01oa1VxaldnaFZUVUs9Qjw3PTU3OjY3Qjk5PDo2 +PjU1Pjc3Pjg5PTc0OzQ5PDg1PzY8PTo4RThBQTgwPjA8PTkwQjU5PzcvPzY8Pjo4QTU8PTo1 +PzQ5PTU2PTs6OTQzPzg4QDk5PjQ1PjU5PzU9QDo1PzY9QTg8Qzk9Ozw0PjhFPD81QDVBQDwz +QDxDPzozQjpBQTw9Pzo1RDg4PDc1Qjg8Rjw7Qzs8Qzg9RjpAQ0BFUkPY95b0/+n6/+z///j9 +//T+//f///X///r+//f+//r1/PX2+eX9//73//rr+eTp8d/8/+z4/fLs7+nl+93i+trt/+vl +7+Pc8s359+3t7Onb59Pj8tjj+eb1+ez6//b9//z9//P6/+zk9d/x/fDx/+/7/+7v8ebs/fXr +++r7/vP1//ny//Du++v2/fD///3///vy/+vn8OH2+fD5+/P4+PDx7eGeUWhDPD4zODc9Ojgv +PDE7OTszPi4/ODotNCszOzo0PS8yPTM4OS46OTY6OzQ1OTA7PDgxPDQ4ODQ3ODQxOTI5OjIx +OjQzODM0OTc8NTUrNzBBOzg5PjZWRzyZf0zYxnfp6b/799749Nj99tj268royIu/hFNrSzlK +QThAPTVGPzZLSTpkSDxpTTlvTDpeSTuWpFPy9Lf7+9z9/uP9+uH//OL8+9nt2qWpc0yKXUB4 +UDpwTzxvTT98VjlvUkFNQjU/Nzo1ODM8NzY4ODI4MjUyPTE9OTE5NzQ3PDE2OzgyNzg4Nzg7 +NDg8PTMzODQzOTQ1ODMxNC83NTcxNTM5OTg4OTNBQDw7PTVCQDg7PTk/PDUzNjA9OzQ4OTQ/ +PTQ7OTY+OjhCOzdDOjJHPjhPQjFQPzc9OzE0OS8yODYzOTBCQDRgUTSHXkN4XzpOPUA1PTVG +OTtjVDibfUjSxV35+br39tD9/eP07sLasXeedk9bRTxCOz03PDQ2OTU2NjE3NjE2NjU2Ni8w +OjMzOjMwOjQtNys0NjgyNiw2OjkwNS03NjowMysxODYxNy00OTgzODA0Nyw2NjMyNjQ1NTU2 +NzQ4ODQyOTQwMzE2OzMzNzI6NTgzOTU4OTUtOzI0NzgsNy40ODcyNjU4OjUxOzU6ODc2Oi8z +OTQyODMwOzQ2OjQyOTo3Oz4wOjA2NjQzOzEyOTQzOzIyNjI3NTU2OTI3OzkyOiw0OjQxOS4y +OD02Ni4yPDc0NzAzMzQ0PTYvNzUxOjYyOTA2LjUyNy81OTcyNC86OTU6QzROTkZbVUNSTkVZ +VUNaU0ZeVEZYVExhWUFXVk9fWkNbWE1cVkhgWUZdWkdbWUpbYEteXUxZWEJkWlNZWkpkXE9V +XEtlWFNVYExjXVVbYEJkXU1aYUJgW1FbYUtkWklbWU9fXUlcYEtkW0ZiY0tkYE5fXEZbW0dY +XkNmX01aUkdUR0FRRDlURj9lc1GCfmR3eFyAdmF7c119eV+DeWB+emZ9fmF5dlt4cF15alVx +bVNuclZ3c116dVZ4c1t6eFl1cVeCcF1ycFh5cVt3clp5eFx4b1V8dWJ2cV55cGB2cVh3cFtz +b1V0cVp3cl50b1t5bl93cVpycFhzcFJxbVZ1blVva1hvbVJxb1N4blltbFdzaVdpaVJ1a1Rp +a1BwbFRva1RwaVFraVBoak1rZ05uaVBsZ1Jka1JsaFRdU01COz45PTc6OjQ6QTg5OTg9Ozs4 +OTM2Pjo0PDA0PDk5PTY1QTc+OzU9Pz08PzQ3OTc5Pjk1Pjk7OjQ1PzI+Ojk7OjE6QDU5PzQ5 +PTk0PzQ2QDUzQTc3PjEzQDU6PjY8QDk4PjI5QDk2Pjw2QTo9OjU1PTQ4PDc3QDE+PT41PzI4 +Pjc2PjQ9Pjg6PjhCQz07QTs9PD03OzpAQTg8RDs/Qj8+Q0BFSkLd853+//H///z9//v8//H/ +//z////////7//D////+//r+/O36//P7//j9//j69/Lz+uz7/e/9//T8//bw9ezm69/d6dLZ +89PZ69HT38jj7Nrx9/L0/u/y/vDq9+br/en2/vLt7uP+/fvt/evw9e/0+enw9O7w9OX4/vH/ +/+zv9Orm+OTz/fTt++vw+/L4//D+//v5/O////by/+/2//Py8uKTWGs9RDw5Qzg6Ozg2OjMz +Ozk1OjQzODk6ODU4OzQ0OTQrQzI6ODgyPTE6OTcoPTQ/PTYuPDY8OjMxODY2QDI1OzQyPDA7 +OzQuPjI1PDUuPTE8OzQ0PjRcUjyXgErRyXbr7sj7/OH9/+L6+dH07bXUtWyMaElmRT1FPThC +Pjc4PDVSTDp7WkBzTkBpSTtTQztUUTuovVbr9af9+tj6+9z7+tnz76zFnlqydU+fakZ4WT98 +WkFvWD5xWD9gSzlFPzc9PTM7PDY4OzQ4PTY1OzQzOzIuOzI3NjgtNy43NDQvPTA1OTUvNzI4 +OTgvOTQ3OzQ1NjM1ODQ0OzIwNjQxOzYzNi42OjQ2OzgxPjEzQDQzPDY5Njo0OjE6Ojk3ODVB +Pjo+QDNENz0/QzVNRDhBQzhpSEBDOjg7NjMuNjI1Ojc/PzljVTl/aUJdSz47PTc1Pzc2PTM+ +QzZlYj6biknUzF/v75z08bTjx4OzjVR8XkpMRTdEQkM7Oy86Ozg4NjQyOjA6PDgzOzU1NzU3 +OTcyOjgtOTUzNzAwNzAyNzUtNzEuNjExODUvODI2ODUtOiw4OTUtODM0OTQxODQ0OzItODQt +PDI3ODY3OzM4ODguOzQ0ODQ0ODA2ODgzNzM2OTIuOTMyOTIxODMvODIvNzQ3ODM3PTg1PTIx +NTY1OzQ1OzY1ODA1PjkyOTQ0Ojo2NjQxOjQ5OzoyOzU2OTozPDIxODY0PTIyOTg1OzMwOzQu +OTMxPDUzNzIzODs4PDYyOjE0NjErOzM3PDA1OjU1Njc3PTk0OjE8QjhPT0JaWktSVENZVkhY +WEJaWUtZV0VdV0lZVkZbVkxWWUJdXE9XWkZhV0tdYFJZWUZbYk1cX0lZXkdaWkxcX0dhY1Be +Y0lhYExbYkthYE1fYkFeXVBcX0hhYU1ZX0llWk5baERiW0pcYUheYDxhXEpXZkheYUpiY0Vg +XktfV0NSSD1YTDtIQjtlcU99fWN9dmF7dluAeGB1d1iAemJ6dl55dl92cFFrZFVlaEpsZlVs +bFB3eVd8cVp0eV11dl9ydVp4cl96dlV8d199dFt4d115dF1yd1l6dGBvc1iBdl5tcVp8dF5y +cVh/d1xzdlx7c1Zuclh1cldybVlydFp2blpwcVlvbVxucFR1bFtsbVd0bVVxbVNxbVNucFdp +b1RvalVvbVJubVZnalFoalhralFpa1JnaE1pbFBcU0o2RDdBPT02PDc+Pjg0QDRAPDs1QDQ5 +Pj05PDI7QDk0QTY8Qjc4PDk6Pzk3PzY9Pjo4Pzs7Qjo6Pzo4PzoxQjg5PDs8QDc4PzkzPTc6 +Pjk6QDY8QTw1QTg8PzguQTc+OzsvQTc+RDg0Qjs2QTw3QTg5QDQ3Pjc6Pjk3QEE8QTc5PzQy +Rjc2QDs7QTg4Pzw9QDo2Pjw7QT02RTg6QT85QTdAST47Tjzm/KX2//X7//Hv/+n7//Tz/O32 +/+n6/+7///n////1/+/5++v7//T9//T4//L9//v9///29+3z9u/l9d3k+N38//Hz/PXh9dL3 +/fTs9OXg5+P3//Lq7+Lt8+P3/fXs7+Hl/uT++/zz9enp/OXo+Nvr++b1//v///7r/+zx9+no +9+f9//Hr/+X6+fHq+Oz1/vLx/+/y8/X79/Hr8efh59rk6N6WVnI7PjgtPTIzPjgxPTQ1OzMx +ODM3PDcrODI4OzouOS81NTgyOik8NzsnNy86NzgwOC41NzQ6Ni81PTUxOjIxODE5OzQyOTE1 +NzYyPDYzPDM3OzQ8OzlVSDp+a0W+smPg6av4+t31+t345rLSsmOfbE9hTDxTQzw3PzY7OjY0 +PDRFSTduWkBoUDxlRztDPTlEPjhRUjyIkEnK0WLf3XXXyGmqh0p3YUSjfEqYakdpTjtgTj5Y +SDhMQztHQTdAPzc9OTc9NzdBPDc9PTQ2NzMzNTM3NzcsOS82ODIyNjEzNjgyNDMwNDUwOjIu +MTIvNDYxMzQyOTQuNjMxNzApOzI0NCwyNzUyNy81ODQrOy83ODcuNTI2NzU1OS9CPTs9OzVE +PDY2QDFBOjVBPDdOSjlsTz9fRzszOjQzNTAvOTY3ODFNSDlPTTs6ODg2OzYzOTE1OTQ6PDBC +QzVUUjaEdUmqplCzo1yYgUh8YEdSRztFPTo0PDY6OTYpNzA1Nzg1ODcuNzQ2OTM5ODcxOTMt +PDQxNjIzNTUxODAuMTcqOiwwNTUuNS40ODYsNS0xODczNSk0NjwxOi4wOT8xNjAxOTYyNzEz +OTEuMzUtNjMyOTAuOi8xODQ1NzMxNjExNzcxOTMuNzQrNjM0NDkuNzU4Nj0tOy44ODUxODA5 +OTQtNDIyNDEvPDQuNTE4OTcvOzExODcvNi0yNjQvNzQ2OTYtNjYwODMvNTcuNzQzODUyOjI2 +OzkqOiotOzosNC40NjU3NzE3Ojs1ODIwODQ2NTMuPDg4OzUzRTRRV0xRUzxXVUtZVERWUkdT +VEZXV0tdV0hWWUteWUxUW05gXEtXVklaWUZXWlBgWU1XW0tcWEtfWE5dYE5lWkdXYExhYFNV +YEhiXE9ZXkFkWklZXkNbVExiYEFcWlFiY0tdXUxiWkNhY05dXEldW0ZaYU5cYUlZWkxhWUxY +WUVTSztQQzlQRj1ka1Fwc158eWB7fWV5cF15cmR0blp5cltvblFuZlZlZ05sW09aZkxobVB9 +dlp3cF9zblp3blZ2eWx7dF51dl13d1p4d1p9d1t6clp5dl50clt4b1lrb1N5cll4cld3cWJz +clh1cFp0dFdycFx0cFpydFV0cVtwcFlya1dxclVucFxub1Nsb1NxblZubFlybVVoaVJwa1Vn +Z1NvZ1lnalFybFdeZlFnZk5iaFJoakplZ09cUEg8QzsvOzE6PDQ0PTU7ODY3PzY6OjQ4Ojk3 +Pjc4PDk4PDY5PDs1OjU2RTk4PjI8QD44QjQ4Pjw8Qzk3Qz46PTU2PTU5OzU3Pjg4PzoyPTY0 +Pj02PzM5QDc0RDg8PTo0Ozc0Pzw9QTk3QDg0PjY2PjY1QTg2PTY3QDczPDk+Pzk4PDcxOTg2 +Ozg3PzY1QTozPjU7Q0A0QDs+Pjs0QDk+Pz85QT4/RTnO75n9/+////z///f////////////6 +//v4/+/z/+7z//D+//H8/vnw9+z1++z4//D1/+v8//j3//T4/fPx9/Dp8+Ph7uDe88/a7dXa +7NLU6dDk+t7p9erj7+Dr/e/7//f++vHx/+z4/vD7//3////2//j7//Hx//Px9+r1/PH5/fvr +/uf+/v3///n49+vq8+D3/fL///X+//7///f09+z99+2EV2s7Ojs7PTc0PDM8OzcuNy87OzIu +OTQ3Nzw0PTI2Ozg2PSo7OTsxOTM7Njk2OjM1OjYwOC82OTYyNzcwPDI1NTU6PDQ2NTU7Ojc5 +OTM3PTI4PTU2OzZHQzZwXkGcgUzCv2fu86j488DfxXe3g1FzUz9RQzk6PTU7OjM1PjM5OzI1 +PjVORTdhTz9XSjpHPzg/OjRGPzhMRzheTTpkUz1jTj9YRz5ZSzmgf0rKhFKNUkRhSzlRRzxR +QzVGQTpFQjk7PDJEPDlKPzJNPzs2ODI3Mzg1OjIxOTgsOjUuOTcuNzM3OTUvODU3OTEyOjMy +ODI0ODIwMzQxODIwODE1OTEtNzMyOTAxNDItODA2NDM3NDM2NjU0OzBBPTk8PDFGOzg/PDZF +Pjo9PjZMPzRkTDWCU0JSST0+OjgyPjU2PC83Ozg7PDI3ODc1PDU1OjM4NTcvPzE2OTU0Oy09 +OzVEQTVfUUFbUTlZSTxHQzdKPzk2OzZBPDcyOzU4OzIyOjEyOjQyNTE3PDQ0OzQ2NzQuOTQx +PDA0NzIzOjcvOio1OTUxOysxODEuOS41ODcsNy81NTorOi82OzoyODI1OTYxOjIzOTE0Nzkx +OzIwOzUvNjA0NzIwPDMyNzUtOy4sNzIyNjIuOjE1OTUtNS84OTcvOzA4OzMrOzM5NzYvOTQ4 +NzQyNzczPDMvNDg1OjU1PDQ1PDI1NzUuOzAxOzMyOzU3NzQyOzQ1NTEvPDcqODEyPD8wPDE1 +ODYtPS80OjItOC8zPT0wPDIvOjEzPDMvODUzPToyNzVDQjhVVUNYUUlVU0JVVExZV0daWU9e +WUNUWEdYXUJaW0xeYUdaWUtfW0xZWlBgXUZaZEpgX0NcYktfX0lbWUxbWUlgW0xaY0hhWUda +X0dhYU1ZYEZfW01cXkRaXElgY0VhXElfYUFjYFBYXUVYWUpZWU1dWD5aWUhfWkhdXEdbU0RJ +TTdRQUBLSTthZkhnbFJtbFdlb0tsblhjb05qbllkZ0ttbVVnYkpjZU1qY1JkYkdnZUxxel93 +cmFxeFt0bVtxcFJvdlx5dF9zd1h6dVtzcFd7d2BxcVdzb15ubE9ybFhsb051aVpwc1F1c2Bu +cVlxcFt4dlt0bVF1cVh1blZucFlvc1dxbVV3blRtaldwcVZqa1hwa1dta09ycVlqcVNtalRn +bVBxa1Zna1Vsa1Nta09pb1FmZ1JmZk5XT0k2Ozc7OzQ1PjQ7OjU8QzU5QDg3Pjc8QTc3Qjc6 +QDM+QTg3RDA4Qjc4QDY4QDo5QzQ4Qz07Pzg4RD0+RTs9Rjk/QD03RDg5QDo2PjQ8Pzg4Qjg7 +Qjw6RDo6RDk4QDg7QTY0Qzc7PjcwPjg2QDQ5QDcyOjU1PTU4PDU4PzM2Pjk0PDU6PDo3OzQ6 +PTcuQDQ7PjkyQjE/Pzo4Qzk9PTozQTg+RTtETUDh8pn9//r///////n///H///v///f///// +///////9///z/+f9//n///n///7r+PHr8Obp+uPt/enq/+bm+OHh9ePX69fh/db1/PHm7eLk +6Nf1+Ozv+O3x9Ofe89/z/e3w/+z0/fTt/OX09+fu/e79//vt+ev2//H0/uzx/vL9//X9//b0 +9+Xw/Ov+//z1/+7s/ejn7drm9OTo+eLv+uvp7dt2VWtCPDwuODY9OzcpPTFCOzMpOzA/ODcs +OTE2ODEyOTQxOzQ5NzU2OzQ2NzcyOTA4ODUwPjE3PTQuNDE2OTU0ODM1PDEqOy8yPjQ1OzQt +Nyw3OjVGPTVAOzhOST1vXEOOej+xpVfCo1WhiEuKY0JbSDtEQDc3OjI3ODQyOzA3OzQwOTJB +PjVGQTZLQDc1PjE5PDQ2OzE/OzdDQTVKQzdMPzhGQjddSji6mlLZsm+/fVSLXD5dRzxORTVN +Pjo4Pi9APDNMQjRXQjhMPjZGPTMyNy45NDIyOC03NTUwNzEyODY0NjIwNi4wNDE0NjEyODQs +NjAwODIwMTMuOS0zNzQtNTQ3NzcvOysyOjMrNy88OzUwOCxFODhCPDRIPDc6OTJEQjlEPjRD +PjhTRziOakCSbEtQRTo0NTMxODAzOC8zPDgwMy87NzkwNzIwOjczNys0OzYxNC43OTsyOCw7 +ODk8PDI3OTc8OzY6QDA6QjQ3PTE4OzUwOzI1ODA1OTE0NzI0NzU0ODQ0PjcvPC83ODItNjI0 +NjQwOjAzMy0oOjMxNjQuNjU5OTEtNTMwOTAtODQwOC4yNzQyOjUxOTUuNS03NjkxNzQ2ODUu +NTMyOTI0NjgwOC41NzkyOC0zOjYyMjMxNzQ1ODAyPDU1OzMtOTUwODYvOzMzNTgvNy0yMjkv +OC83NzoyNjItNzgvOjIwNTAxOjI0Mis0Oy8xPTs1ODUzOTQwOS8vNjE3PjMxNjYwOjAtPDYx +PTAuPDYwPDAvPTYpNS05OjQxNzEzOTQzPjA2Ojg3RzRTU0lTVj5WVUxWWEZaWktXVEZTWUhS +WUtcW0tYWkhcWEdaWkVgW0dWZElhWUxUXExeXE1bXEdgW05XYkxkW1JbXkNlXExMX0hkW09X +XkldX0pTWEZeV0daYE1fXkldXkdbY0xaXEpjYD5WVEVYVkdZVkZVVEZPUkVVSz9GTDhNSz4+ +QzJKRUJVYD1gVktdV0BaVEdYWEFWV0BfWkdbZkxhX0tWWkVhXUhjZEhfWk1ZWUJlZkxzc1Fx +a1Z4blVmcVJ0dlVrcVR7b1Nzb1h0clVxd150cFRzbFhwbFRpa1RualR0b1Z0eFV2cFlwc1d1 +cFtvblZvcldqb1d0cVZtcFNtcFNyb1hxb1hyblV0bE9ybFNvaVRsbldya1NmalJpalZralFx +a0xobVBoa1NmaU9oZ1Jnak9raE9RS0RDPTozPDA2PjUwOzM6QDU0Qjc+Qzo5Qjk6QTk8Pzky +QjU1PTg3PzY6QTY6PzY1QDg5Qjg3QzU5Pzk0QTI4PzgzQzY7Pzo0PzY5PTgzPzc4QDkyPjc5 +QTQ3PTY4QDk2PzkuOzI6OzIzPTA2Ozc3QDQvPDQzOzIzPTE4Pzc2PDE2OzM0PC82OzswODA7 +RD00PTVBPz8yQzg/QTgzOzY4PTU4RDg9STvx+6v///f///n///3+//z5//f4/+/4/+////f/ +//30/vH4++f6//L6//bw9+T5//Pz/e3u+u30++rk7+T8//Lp9OHv++ng9dzg8Nfb7dTd6tzn +/eX0//n8//D5+vrp7dnh9ePs/erx9+Tt+Ozy9e/q79/k8d/s8Oz9/v37/fX1++zy/vn///7p +9evk8d/k9+Hp6uDp8fX///b3//Xz8+ra4tV1VWY2PTs2QDM4PzczPjA4OjkzOjM2OjcxOTA7 +NTg0OTIzPjM3OzE0PDY2NzQ7OzMzPDQ3OjU5OzUxOjEvOjU2OzQ2ODYwPDM2OjQ5PDQtOTQ3 +NTg0OzM9OTI7PTNMQjpiVUJ4YUdxXEFlSkNURTlPQT40OTQ5OjQwQDM4PDMyOTIzODI7Pjc2 +Ozc+PDg+PTk1NzVAOTk8PTNAPTlDPjxPQDxSRjrFoVzv4qn53bDmwYHXmWSUYkFiST5IQjhE +OTpEQzZdSDpiST9YQztSQDk4OTkzOTIzMjIuODM6OTMwOC43NjcsODI+OzgwNy81ODgsNi06 +NToqOTM1OjQoNjQ3NzEtOTUwPDQ1OTE0NjM1OzI0PTBJQTtURzlHQzpBQzhEQDhGRkBSSDmc +b0aoekmEYUxOPTQ+O0AwPC01NzwzNzY0NjU2ODMyODg1OzQuODYzNzQuNzY7NTcuOjI5PzQ1 +PDo6Ojc1Ozc4Ojg6Pjw2PjU5ODk3OTY5Njk0Oy82OTQ2PDA4OzUzODo5OjgyOjYzOzUzNjkt +ODU1OTYvNDM3OzYxODEzODArODE2OjcuOTYzOjQwOjYwMy41OTkvODIyODc0ODIvNTcyNzUz +Ojc0OjIyOjkxODUvPTI0OTgsOjI1OjoxODE0NjgvODI3PTwvOjMyOTctOTM3NjczODQtNzYz +PDouOzY1PDgxOTY0OjQwPDMyOTEyOjQuOTAyNTQtOzI5PDovNDA5OTk1NDc1OjgtOiw6PDwv +NzMzODsvODA1OUAvOCwyODkwNTMyOjE1Nzk6QzdSVEZXVEVWWklTW0xWVktgWUhZWUVaWEtX +VklgWEpXW0dgYk9SW0dfXE1WXExhYE5aXElcWU9aYkhWYEtcWU5eX0xbW05hYFBgXUtXYUpc +XExhWU1SV0xdWklZZENgV0pWX0ljWU1aX0FWTUdZVjtOT0xERjlJQkRKSTxISD0/RDc8QzY9 +QjlKUT5QUEZYVEFRTEhRSUBUT0VaTT9LT0NYWEdWWEhhUUtPWUdiW0hWU0dfV0NVV0piYUxb +WUtka05sZ1RfZlFwa1ZzcFZxa1RpblJyb1lja1R0bFRjak5xa1poc1ZxcVt1bFpvcldzcFly +cVR2cVtxcVNycVp4b1dwb1hrb1dqcFl1bF5qa1NxZlZrb1JrbVVsalRrZVRsa1RvalZmZVBo +blBobFJsalRgaU5maVJjZlFTTEU+QDgtPTc4Pi84PjctRDY5Qz43QDU8Qjk0QzU9Ozw1QDk6 +RjkxQztARzsyRTU+RDs4RTk9RTw2PTc8QTs2Rjo3QDtdYUE3Qj46PToyPTg9QDk2Ojk5Qjo5 +Pjg0Pjc4NzcuOjc4Ojg3OTY2PzouPjU+PjksPTM3Pzg0PDk8OzgxODU8QTU1OTY3PDc0PToz +PTc7Oz03Pzk9QTkyRDM6QT0+RT0+TDze9KD1/+3x/O/1/+/7//X7//j9//z///r9//r7//H1 +//Hy/ujz/+f+//H6//P9//71+en7//X7//n3//Xo+uvr+ung8uDZ7s3b6tnd6dLb59z09evl +9OXr/u31//P3//3///Pj8eb5/vz////9//X4//z////1//H0+/X1//Tt9erx/PD4/fTz++79 +//v///////3z8Ovp+unr9uvt9+Ph4thmTV85OT02PTU0Ozo4ODIzPjY/Njo1OTM5OzksNzc9 +ODQxNzY9ODMuPDA6OzAzNTQ3OjQ1OTM1Oi81OTQ1OzE2NzgwOTY2NzcvOzM4NzkwOjQyODY3 +PTQ7OjU2Ojg/PTZJQj5SRTlSQztEOTo+PDpFODg+OjY5OzY0OTQ6ODg3NzU8ODYxOTQ5NDg0 +PjQ3OjUyOzM4OTg6PDQ9PDpBPTpFQjuMgkXy76/5+Nv+99v84rPnwH/MmVyfZUpiSDtXRzpY +RjphSD5hUDhlUEJTRjdCOzwrODM3OTgvOTMzNzMxNy82MzgwODc2NDkzNTkzNzU1OjcvMTAz +NjgyNzExNDMwNjY0OjAwNTUxMy83NDw3PDI7OzdVSzdkSj9TQzhTQD5EQTVgTjyVdj3Fm1uw +iVbDnUvfvWXMnFRxSjs1OjUyODUyOTYyNTMzOjQxNTM1Ozg0Njc1OTkuNzE+OTo0NDA3Ozg2 +NC86Ojw6PS05Ozw0OTE2Ojc6ODc4NzQ5OTYzPDM1NzcyOjMzODczOzQ2NzMwOTU2MzA0ODQx +NTc4NzkzNzM3OTotOjEyNjQtNTE1ODkxODMzOzgsOTgvOzIzNzgwPDMxNjYxNjExNzUtODI0 +ODUxODY3PDUtODIyOTUxOTUrOi4sNTU0OTEzOzo1Mzg0OzszNjI1OTgyNzMrPDMvMzgxPDcv +NjgxODE2OTotODI2OzoyNTI1OjgvOSw1NzwxOy8tNzoxPDQuOTY1ODMwPjEwPDAyNDc1ODUv +OjgzOzEwNTMzOTM1OjQuNzM0ODgyNTRASUBVUkhcUUdXVkZZV0pXVUFZVk1YWEZfWE5aW0dg +WVBfWkddW0dZXE5jXUhXXElcW0xSXUxbXk1XWUxXYU5caUxgXkxVYEdbWUpbW0xgXE5SWUVZ +V09RVkFWVEtGT0laWExWU0dTTUlUTURGS0FJQkJFRDtERj9AQzg8Qjw/Qjg8QzVCQTg3RjM+ +RDpBQj5ORkRDSztNQUQ/RzxNRUc7PDdEREVISkNNSUFNS0FRUUBYXEdXVkJaWE1bV0daVUpi +YU1nZlNhZERmb1FxdFhpbFRpZFFlY05vaVFkbVJuZFNnalBtblZpb1p7bl5wb11tc1l2cFht +b1d4dltscVl4cVtrb1ZycFttblhwbFhsblZybFZwb1VtbVdpbFZra1Fua1ZqbFRqalVtalNk +alVobE1kZk1oaU5jaFFUSkc1QDk8QDo0Pzc2PjkxPzU5PTg1QTU8Pjg6Qjo7Pzo3QT47Qjs+ +RTw7PT08Pzg4QDs5Pjo7PjozPDc9OjkvPjY1Pzc7Qjo3OkA2QzY6QTcsOzI2PzgzOzg7PDgv +PTY4OzcxPzk6NjM0ODM3PTYwOjU2OjU2OTo4PjM3OTcyPDU4OTU1Pjc2PjY4OjkvOTY9QDk0 +QDY7Qjg2PTg7OjsvPzlDQUA+TD/m+KP6//n///r///////////v////////5/+75//D1/+/8 +//H///32//Lz/fDu++X9//n9///z/Ozp+ODu9+vy/Ofq+O7e8tDo9+Hq9ene69309+ns/Ozu +7+jq9ef3/O7q+On3//Pr8d3m5+Pl9un9+/rz/uT0/vDu+Oz1/vH///719+zw/PH0++/18erz +++7y/fL89/D///r7//v///75++twVGM+QkAvPjU/ODs0PTc9OT02ODg5ODo0PjU0ODU1OzQ1 +Ozc0MjU/OjIxNzc4OzUyOTc3ODc0PTQ5NTYvOzE9Mjc1NDM3NTczNDE+OTovOC85NTozNjJB +PDg7OTU3OjRFNzdEPjdDPjU8NzM/Ozk/ODc+OjY7OTM1NzI/NzYxOzY4OjgwOTNCNTgyODQ8 +NzUwNzNCOTc2OzNENjc7PTlKPzioqFj69sn6++P8/d//+t/29bv25JnjunSngUOghkBwWjiF +aTuBYzd6XEJQRDk9Ojo1Nis5NzczOC41NTY1NzAvOTU3NzcvNTM4NTktOTMwOzAwNC40NzUs +NDE5Nzo5NzU6NDgyODQyNjQ1ODU4OC9HQzduXD9xUj5pU0B1Vj1oWDy9pUXWs2erf1LEtFL0 +8ZT99tT38NPx5sCGcEQ7NzguOzQ3MjUxODY5ODY4Nzc3NTExMzQ1ODYzOTU5ODE1ODU1NjQy +ODQ2NTc2PTQ6OTc0PDc4NDMtOjE4OTYyOi81OTYwOTE7Nz0wODQ5ODgsODA6NTU3NjY6ODUt +NjQ2NjQ2NTQ0ODY0NjMwNzYyOjI1NDAvNjE0NS8zNzIyOTgvOS40NTMvNzI5OTQqNy40NDYu +OTM2NjgzNS42NToyOTQ1OTkxNjQ1NjcyODQyOTE3Mzg3NzQ3NzQxNDQwPDM3Mzk2Ojg5Ojgz +NzM6OTgyNzA8OTgtNTI5PTcuNDc7NDEtODU6NDMxNTEzNDE6ODQ2OzQzOjM0MzU0OjQ0ODU0 +ODQ1NjUrNzI5ODYuNzA3OTszODRDQD1PV0FVWUtXVkZZVlRcVkddWE9gWkZYWUxcUkNYXU9a +VUxaW0VgW1BaWkNkVU9eVEljWU9hXk5XXE1gYEpeWkliV09ZU01jU0hTVEtiVEVOUERXUUVR +UUxRTEdOTUdOTz5NTURWRUJNRUVEPzhKOz9BQDxJOkNAPTtBQTo6PDU+QTc5PDA6NDg6OzQ/ +PjlAPzVDPjs9ODxDPjQ1PDs6OjQ0RDZEPztCQEFQRz1KRT5PSEFOTD9VSUVRTEBbSUpZVUhk +T1BjZExqZVNpZ1JoYlBjYk9sbVRxbVRoaFFqaFFsbVNzbF1xdFpwbVV0cVlycFt2b1txa1l1 +dlptcVR9b19va1F4bmBtb1V3bGBobVN1bl5qaVNvb1lxaVNvbVFubVZqbFRqaVZkZ1NpbFJo +bFNnZ1FmaVJiYk9PSUc2OzY2PDYzOzA8PjUwPDY+Ozk0OzdDPDs6PTY9Ozs3PDQ7PTg8PTo7 +PzQ6PTg0OzU4Pzk4PDg6PDozOjo9Ozg3PTY5PzY5Pjo4PDc2PTw5Ojk5OT42OzE3Ojw0PTM3 +Pzs3ODU6PjQ7OzY1ODY6ODc0OTE5Nzc1PDU4OjYzOzQ4ODM3Ojg5PTk1OjkzPTo7Oz04OTQ6 +PDo4OTo5Pzs4OThEPzo9Rz3c6pz0++b///////////z///////7///n////////////5/vL2 +/+35//H2//L///z4+fbu++H+//z9/vfz++7l7N3a8NrX7s3l9N7i7Nzi8tjr7+Hc7dzw/evs +9+Tv8u7z9ufr8Obz/u3x+vPz/+/+//bm8d70/vv8/fTy/O/z++zu/vH19+vw/O/3/vL1/u7z +/fX18/D5//Dx9efy7+nm49drTmRBPzktNzM9OjczOTc5PTkyODg6OTUuODw4OTQ1NzY1PTU7 +ODk1NzE2ODgvOS82OjA2OTA5OTUwNTA1NjE7PTU0OTI1ODU1NjY1NzQzNzI0MTY2ODdAOjg5 +OzUzOTQ+PjY8OTQ9ODg2NzM6OjU0OjFBOTk2ODc1Nzc0OTE6OzcxOjc4OTg0Njc6OjsyOTM7 +OjUyOjM+ODhEOjg/PDhDPDtjT0fSwoX49dD+/uD9/eT9/N77997xy6idW1Z9VU1tTEJvUUVl +RkhSQjtJOjw5OjI1ODc7NDc2OTQyNTEzNTU8Nzc2NjQ0Mzc1OTYvNzQ0ODUvNjI3NDYzOTQ1 +NjYwNjE3NjUrPS86OTowNDBAOjk8PzFgSj59XkCSaz6WaEKebUl7Tky8rVv69bD//d7//uD+ +/uP+++H7+OPbrplHQDkvOzA4OTYyNyw2Ojk0OS01OT4yNC41Ozo0NzExOzg3NzoxNTI4ODU2 +OTo2OzczOzU7OTU3OTgzODU1ODM5OTI1Njg3OjY7NzkxNTQ6NzkxOTQ5NzgxNjM3MTMvMz04 +OjQyNzM1NjM3NzQzNjM3ODwxOTE0NjYwOTUzMjcxNDU4NTQvNjU0ODQzNTg1OjIyNz0xNTg0 +ODs4OTQ0Njg3OzEzOzY2NjYxOTEzNjQzNjQ7NTUyNjU6NTY0NTI4NjY2NjM2Nzk3NDU3NDg2 +ODU1NTg1NjQ3OjQ5MzM1OTUzNTQ3PDk9Ni41OD4yOTE2ODczNjg4OTQwOTczNjUxNS02ODgv +NzE7NTczNy41Nzk0Nzc9NzhDRzZbWUtTV0VaVE9WVkZZVkhaXE1YWEhdWkxYXUtWW0xjVUta +X0xjWk1XYEteVUtZW0hiXE5XXEhfWU5VVUlhV05TUkVZT0pUT0hVTkpFQ0JGPz9CQEZHSUFG +O0RESENEQUFFPj1COj9EQT42OzlEPT07PDhEPD88PDQ+PD09OzBBQjsuPC89Nzw8OzNAPDk0 +ODI+PjY8Pzc5OjY7OTk/PThCOTw7ODdCPT1EPDxFPEBEPj9MPkBKQz1ERT1RTEBVTkZbTEtM +TkhnVU9gXVFqY0xlVU9kZlJtY1Rwak5uaU9vclR3a11ubFh3clpwd1p4cFxzdFt2blh1bl1v +bldvcFpubVhzb1hybFR0a1Z0cFFybVd3alZraVlybFNqa1ZvZ1ZpaVNubFRlaU9palNlak5o +aFRnaFNlZFBLQkE/OTg3OjU1ODw4OTg9Nzg1ODg4OzY4OTc5Ojk+OzgzPTk7ODU/PDU4OTw4 +OTs7PDU5PTgxPDc9OT03PTU6ODksOzQ7PDk0PTg6PDk1PDQ6PjwzPDk6Pzo2PzY8ODc0Ojg7 +Ozc0PDc0PDQ0PDY6OzkyODI4NTk2PjU6OTk1OzY6OzctPDQ/PDoyPjY+OTs3PTVCPTo5PT09 +Oj01QT48PDo9QDpAT0L8/bP///X4//T///////////////v////9//n8//X+//7//vry/+v9 +//H///z2++37/+73//b6/+3w+u3w9uvm9uPg6tvV6dDa49TW49De5tPt/+j0//H1//X6+/P2 +8uz9//75//Pt7eT0/e/9//3n++r+//r5/+3p9ub1//v///nt9uvy/Oju+ez0//Dz+evq7+Lo +8uPz/Ov2/+/y6urT2c1zUGA4QTc2OTk0OzU8PDczODYyPTg2OTM1PTQxPjMzOzE0QTM2PTUy +QC82QDMsOSwzOTUuOjYzOjUrOi02OTMvOCo0OjgxNC44ODsyOTEuOzQ0OzMxOjQ9ODQ1OzEz +NzQ1OjM5OjU3PTQzOjM4NzM2PTM1PjI2NjE1PjIvOTE2OTQsOzQ3PTQsOS8/OzcwOTM6PDU2 +NzU6PDE3NzY4OTJCQDpDQjZeUUmsr2Dn6Jb09bry8bznzY2hblRUQ0BJPDtDOzxCPjhCPT89 +OzM/PTo2OjA1OTU6OC0zOjIvNzMtNTAwODIpOTAuNzIsOjAyMzEqOy8yNTMxOzI2NzUwOjIs +NjQxPDQxOi8wOzM1NjEzOjI6OTRBOzc/PjlMQkBLR0BOQEBMPUKboEn3+b/8/t3//+P7/+L6 +++Dw6caidGc9Pzc0Ni8vOzM5OTQtODU3MzIyODM1OTEtOzcxOjEyNDM2OTExODAxPDcvODU0 +PTcxOzM1ODsvOzI2ODMvNzIwNjYtOC81NTYuOTQ3ODYwOTE3NzYsNjIxNjEyODUtPDU0NzE3 +OTkwPS4yODEwOS4yOjUxNjQzODMuOTEwODEtNTA0OjgwOCo3ODwzOS00PzgvOC42ODkuOC0y +OjkwOTE1OzExODUuPDMtOi8uOTEyNjc2OTUyOzM0OTMwOTU0ODAtOC84OjYvOTI4OjQuOzQ6 +PjUmOS02PDgvNTQ5PDQ3OC8wOTA1OjcvOi4yOzcsNSwoOTQzOjI1OzYyNjMzPDIwOy41Nzc2 +ODUuNikzNzEtODI7PDk+QjJVUU5UVkVTV1JXVkVXW0peW0FZXUpaWlBhXUtcWUdYXEhcW09b +XEdYVktdWUlaW05eWUdTVU5eVkhVUkZTTUVGTkZPTkBJR0NQQjw/RT09ODg6PDo3Qzg5QTk7 +QTU+OjU2QTo8Pzw0PTpAOjg2PDIyNTY7PjM6Ojk8NzM0Nzk/QzI4OzY2PTI1PDQ6OzE5PjM4 +OzM6OzU1PTo3Ojc0QDY2Ojc1PDJBOjg1PTE/QDg1QTk9PT88QDZARkBCQDhOSUNFSj5FR0RL +TEJWTktgWEtTU0dYXEdeYU1gak5sZlVqa1ZudFhxdFd2cVlycVl0clxzcVd5dVxwdFd1cFpz +dlVycFhtb1RybVlsb1NyblZqblZycVlubVVvbVFubFJvaVRobVNqaVRna1RsZVBpa05pa1Jj +a1JjXk5CQT48OTouPDI7OzYzOzI7OjMsPTI4PjIzPDozQTQ2OjU0PzU2OjUwOjM5PDk0PTM8 +Ozk1QTU4OzY0PDg4ODI2Pzk2PDM3QDs1PjI1PTo0QDE3PD02QTg8QEA5PDYxQTY2PjcvPjY3 +PTUvPDIyPjI0QTk2PDoxPDU4OzQ2PjY4ODU1OjcyPTQ3PTQ2PTc/Qzw4RDg6PTw4Pzk+PDgv +Ozg5QDY6Qz9HXDrm8rL+//H////+//v8//P9//////3v/+38//D+//r5//P3/+n9//f1/vDu +++X5/+76/vPr9+Xu++Ts+ebz/urs9+Tp/Onp+97v/Ori9Nvo7+Hs/+n4+/Tk7d/k8OPt/ubh +6d3y/vD4//Dz+eje9drl9OXs/fDw+ujw/Ozz/vL1+/Dw+e34+/v/+/X39u/t/O/48/bj597p +7uTs9uPx+Orm7N5mTGg1QTcyPTcxPTYyPDM1PTU1PjEyOjUzOjMuOjYuPDM0OjQ1OTQxNjZQ +RkMsNzo9OzcpOTU7OjMyODU6PDMrOjY3ODMsNjYzPTQtOTUwOTE5NDcqOi8zMzQqNyw2ODMn +PTM2PDQvOSozNzIwOjQyOTA2NzYzNjExNTc0OS41OTc0OjUvPDg4OC8yOzIuPDIpOi85Njgw +OzE7ODc2OzI3OzUyODI3PjhASDVWWD5weEJ2dUJcUT5DQDkzOzI3PzM3OjY4QTY5PTQ4OjMz +OjM1OzQwPC83OzcqOjU1ODYqNjEzOTEsODEzNjAoNjE2PTAoOSs2NTIwNzIyOTAyODYzOzQy +NTMyOzM0PTkvNzI3PDM0ODgyOTU3OjUxPTQ3OzY0OzE8PThWYzrZ4mzv+sT++tfz+9Dw6rOq +l1xYSD4rPTM4OzYpNjIwNzMtODUrNzEtNTItODQuOTExOTMtOS4zNjYyMzEwODQsOS03Ozkr +PDE1Oz0uODA3NjosOTEvODQuNSwzODcxNTI0OjYvOzIsOzIuPDAsODIwOTIxOjY8SDo0NzQx +MzEyOjYyOjUyNzcrODEyOjUtNC82OjgnODA1ODUrODI1NzQuNjQvOCwuNzcyNS4uOTEtODIx +OTYwOS8zODUsOC0zNzsuOTUuNzEyOTYwOzMyOzUsODEvOjkqOiovOjwxNS0yNzo0MTUvOjkx +OjA1ODAwNzgwNzQzNzUwOy82NDUsNy03PDgzPTIuPDYrOjAxODIyOjAuNzExOjAqNzUyQDQx +OjwxODQsOzQ2PDQ+SDxVVUZYWUtXV0dbV0xaWEdfWFBWWkRhW09VX0VdXkhWXUdbYk9XYEdZ +V01YW0pdX1RZWkZZWk1XT0NMT0ZDRkRERkBCRkA8Pzg7PjU6PTozPjA4PzcrQDg6QTsrOjE2 +QTgoPC45NzQnOik5OTYsOis7PjkyPDVEPTxIQjlYSzlSST5ORz1QOzxWRTdWPz5NSDtFQjtK +QT1GQjhJQDg6OjU+OzczPi41ODgrPS49RDszNzM5OUAzPDE2Ozk8RDE6Qjg/SDpJTj5QSDpP +TUFTVkZhWUhVVkdQVj1kZ01vcFRvbFh2cVlwcVt1bltub1d6c1lucFh5c1lrdFt4cVlvc1Z2 +cFltbVhyclRvbVpubldya1ZkcFNxbFZucVpqblhpa1Vua1Bqb1RpalJlaVRpaU5rbFNhZk9b +X04/PTgxOzgyOTQ1OzUzQDIzOjk3PDQwOjQ4OjUtODI+ODovPDQ2OTYvOzY6Oz03QDYzOjk1 +PDY2QTYyPToyOjkyOzc2Qjo5PTs3Qjg3PTUxPjovOzY5PjoxQzY4Pjs1Pjg9QTktPzU6PTgw +PDU4OjUsPDI6PDgsOjM8PjsyOjQ2PTUyPDc4PTY3OjU6QDc0Pj01PjE8Pjg+PTk2PTg6Pjg6 +PDk/SUNHYkD8/87///////////n////8//z+//T///j////s++j5/er8/vL9//j///L1//Xz +/PDv+er0/Ovp9ufn9d/q9uPo+uLd8N7b8c7h8Nrj8t7a49rq6tze9ePz+fHx/fj///3x+/D0 +9Ozr7Nzr/O3+/v75/+v1//r6//n++fj1/fHx//T1/+3t/+7y/+zq9eng/OHn++f+/v7///X0 +/vj5++3y9+NkUmc7PDo0OzY2OjMyPDgyOTk5PTQsPDQyOTMzQTI0ODMyPzQ0ODc5OTM6Njkr +Oi80ODYwOS42ODoqPDI0ODMuOS40ODkwNy8yODQuOS4wOzI3NTUvOTQ5NjIzMzU1Ozc1PDYx +PDI5OzYzOS8vOTMwOjQzOjkpOjQyNjYtNDE6OTkwOTE6ODcwOTA4ODk0Ni84OTc1ODU1OTAz +OTU3NzIzOjMzODQ5OjQ3NzU1PjU7QDc6OjE7PzUyPS89OTUvPjE+PDcxPTRAOzowOzA9PDgq +ODE5OTYuOzYzOTc0NjQuODUxNDMqNzMyODQsNzU3ODMzODM0NzUyOjQxOzEvMzkwNjE3ODcu +ODEyNTkyOS00OTYvNS8yOjc3ODAyOzY3PDAtNzE3Ojg8PjhjaUCwvVHP1mbEvV+He0pNSDw3 +PzU2NzYuPTMwODgrNTQrOjcsOC4uOTYrNi0rOTUvODYwNy8zOTkuOTAuODUtPDIxOjMtOzAv +PDUrPDAzNTEsNjEwOi0rOTM0NTUyOjA1OjQxOTkvNzYzOTYyNjIwNzQwOS8xOTkzOjQuPDQv +OTYsOy82OTgrOzAyODQuNjQ1NDQrOi4yNjctOjIzOzQvNi00ODgtOTMwOTktOTExOTIvOTMq +ODUxNDUtOzAtOC0zOTUwODEyNDQuOTcuOTQuOiwxODknOTY1PDspOC81OTMuPS4zNTc0OC41 +OzUoODM2PTs0OjMwOTMuOTIwOTcxNjUwNzczNjIzNjMyNzY1OTctPjMvOTcqODQ1OjQsODE2 +NDQqNjI4OTg6SDldV0xTU0daUUxWVUdZXUhXVEtZWUhcXFBeXUxaXE5aWUtbXk1ZXkhYXUZa +YVNXYExVVUtOTkFKR0c8Qj0/Pz0zQSw9PTs2PTU8Oz00OzE4PzcyPzUzOTc6ODgvODEyODgq +PSwyOjQ6NiwyOzI4OzBEOzZURTtRRj9rVURlTz9wU0BtTjt4Vj1yU0F1U0BvVkJ4VUBnTDts +SzlnST9hTDleQTtEQDVNQTo7ODM4PTUyQjQ3OjY2ODMzPDk3Qzc9PTg9QjY/RjxATEFKS0NF +TEFXVkhRU0dgW0lcYUduaFNqcVZ1dV10c113cF1oclZ0dGFydF5zcFhuclVwb1psb1Jvblty +bVdzb1lsblRvbVZ0a1VubVdrblFnbFRoa1Jpa1Nmak9qaVBlaktrZ1NncE9laFRmak1fVk05 +Qjs0OjgvOjI1PTgzOS43PDMtODAyOjkxOjMzPTY2OzQyOTI1OjkwOzY0PDczOzUxPTE0OzIv +OjM1PTgvOTQ4OzYvPTQ8PTkuOTQ+PDwvQTY8PjcxPTY8PDkzPTQ6OzY3OjczOzk4ODcyPzU1 +PjkzOzQ1ODc0PDs4QDQ1OjQzPjQ0Ojs1PTM5ODw2Qi46PD8yNzQ9PUM4PDg1Qj47ODg4QDlA +RD5JaETk+bz3/+j4/O36//v7//b3/e3+//j////7//v8//X////7//D4//L1//P1/+r9//X9 +///7/+////////bu++7e8Nnk89/s9dve6N3a79jR4c/1//D1/Pz///n5/+3s9e3x/uvs+Ory +/vH0//H0/e3o/e77++7u/vH4//Py9+nn+Or7//vn8d7w9+37/ff6+/D1/O/x7ev5/vr///Lr +9+Xd4dNbUFM/Oz0zPzQ6Pjg6PDg1QS40PTgzOTs0PTI4OTkuOTY0PDYuOzA9OjQvOzM4PDYx +PTM7OTgvOzM3OTYrOTU4NjYuNzQxPDguNTU1PTgwNTUvOzQwPDE7PTMyOjE0PTQxODUxOTUy +OTItOTUzODE1ODYtPjU2OTgyOi02NzgvODA8ODUvNzE7PTY4ODU0ODczNjI6Oi0yNzc1NjA2 +OjM1ODA1OzYxPzUzPTI2OjUyQDY7OTc5Oy88PDYxOjU9OzYrQDVCPTozOzM9OzgrPDU3PDU3 +PDUxPC4tOzQ1NzIzNDczOzg2OjQxOTAyODUuODUzNTIzOzIyNzIyNjUuOi81NzcuQS0vOTUy +OS0zNzo0QS40OjI3OS81OzU1OjMzOzQ1ODc2OzVAOz07PTFMQzpTSj1QSEBKPjxBRTk4Ozww +OzAzNzkuNi8zPTUxODEyOjYzODQ5NzgtOjY1OjUwODcvOzMxNzUyOjM3NzgzNzE1OzgyPTM5 +PDQrNzI4ODMqOjAyNzMvOTM0OjItPDUwNjI0OTc1ODcvOjUzOjEuPDMzOy8uOjQxPDEwODA0 +NjQwOjY1NzQpPi44NTcvOzExOTUoOjAzOjgwOy82NzUyODI0OTkvNzE3PDM3OTUqOTQyOjEy +QDkwODE1OTUwOC80OjcsOjU0PDQsPzM5OjgzOTE1PDgvPS82OjgvNi02NjUyPDMyPTswPDM1 +OjwyOzEyOzQzPDQyOzMxOTA0Py0uOi4yOTExOzgyOzIvOjI0NTUrQDcxPDMpOS80OjosPCoy +OjUtPDBFUz5RVkdYW01VWEhZXExZWE1XXkpaWEtZWkpZXExbXEtbXk9fYkxeW1JcXENeX0pb +XEpTUkBORUE8RztCREIzODE6QDs1QDM4Ozs9RTQ4PzU1Oi84QTY3NzouOzE2OUAyPTIuOz02 +PTA6PTk6QDFDRjlYSTxVRj9wSztnVEN7VkFyWUN8X0V8YUWBX0F2WkV8WENuSkByVD5xVkFy +U0FvTUNsUDhlSz1bRzZaRz1EQTg/QDo2PS4zPjM3PjE9OjUyOTQ4QjVDRDhISTxKST9JSz5X +UEZYV0JdYkdsZk9xc1N1clhvcld5dFx2dFh1cV1wcVp1cVtycldzbVZscFlzbV5ucFdzcVtt +clhwb1hzbFRua1RzalNmb1VtbFdtblVtcVNxaFRnbFNsbVZlaVJrbFJjak9oZVFfWEdBPTws +Oy82OzUwPjA2PTkxOTY0OjguPjYxOzMxPDI0OjQ1OjYyOTIyPTQ0OjgyPzQ1QTY2PDQ8PDY0 +OzM8PTU0ODM8QzgwPDc5OTsvPzg/QD4xPjY+PDszQT0+PTk5Njo1QDw1PzcyQDI2OzkoPjM0 +PDUzOTM0QDg6QDg2PDQ1PDU3PzU2PDo3PzA6PzoyPDA6PT06PTQ8QTw4OTQ5PzpOUEU9SEFP +dUr3/Nb///z////8//30//D////5/vX0++36/fD+///s/e7y++X1/e/3/+z///3///j4/uzu +/+jz/+7t+ur0/+3u9+zw++vf9Njc6Nfj5trm79v0/+/x9uTx/O3s+eru+O7x/fXy+enk/OLx +8urr+Of+//zu++n4/fvs+ODt/fHx/+j4//P4//L4//X+//r///T6//n18uzq9ubp/ubr7efi +4dhYUV07Pzw5Ojo/ODcvODc/PTgtPDI9PjcvODM3OzIxODQ6OjQsOjQ8QDE2ODQ0OjI6OTcz +OC43OCsyNTI2OTQyOTM1NTMzOzY0OzMyOy8xODE1OjQyOTJAOzg6OjgvMjQ6PDA4Nzc1OjAw +MzQ6ODQ5OzMzODQzOy4yODEtOS80OjArOy03OTEwODI3ODQyOzA3ODMyNjE5OTAsOS43NzQ1 +PzI4OzY1Oi4uPDItOjE6OTUzNzA8OjcxOi88ODIvODA9PTU3OTdBPDg0OzA6NzYzOjI7ODIv +Ny84NjYuOTIzNjUyOTI0PDI2NzQ0NDAxOzQzOC8yMTc1OTUsODM1NjUtMC43NzUvNy42OTcx +NjQ7PTorNTE8PDUtPC88ODkqOTM6NzM1NzI3Nzc6PjQ6PjVDPjg/Ojc3PS86ODc3ODU4Ojk1 +NzE4Nzc1OjE5Ozc5ODI3NzcuOS04ODY0NzE2Ojg0OiwzODkzOi8zODc9Ozg0NjU1OjQzPzQx +ODUwPDQ2NjA0PTc4ODE3PDQ0ODAxODMxNTQzODYxNi44NDcvNzE2PjUsPTE3OTUyNjEyOjQw +OTQvOTQuNjMuOy00ODgwOzAzOzQvOTMzNjMzPzE1MzYxODI2NTY0OzI1OTUwODQwOTEzOTYu +OSwzPTcyPDIyOjk2OCwxNzQyOzQwPDc3ODkzPDU2Ozo2OjQ3NzozODI2OjQzODYzNzIyODI2 +OjI0OjM3OTw1OSwuOTQ4NjEzMzI5NjAuNTUyOioyNzA1OjAyOTgzPCw0PDcyOy01OTcyNy4/ +QTs8SThaVktYWERXWEtbVkNeWE1XWEVgYFBcW0BaVVFWX0pbWkhaXFBaWEhTWktZV0pXWkZX +TUVIRzlEOT03PDRCNzsyPC88OTgvRDQ8PjwwPDE1PzgpPTM2PzYsPTU2PjkxPTE3OzVAPjhL +QDhNSzlYSz1dSkRlVEJxVEV8XEJ7Y0GBXUiEYUWIX0iJZkSMX0qKZD6WYU2CXjeFUkV5Tzx0 +VEJ0VT50UT9qTz5nRzlbSTtbSTdYPzVBPDI7Ojg1PS86QDM7Qy82PDZDQjlJUD1OSjxPSkBW +VkVdaEpqZ01nb1F5dVh2dFl6eFp1cll0eVh2dVp1cVdvbFlybld0b1lxbVBydFVrb1F4bVNv +blZqblJrbVRnbVBuc1VubldrbFdralNta1ZxaFBma1NsbFFlbE9salFsZ1JlVEw5QzM3PTQs +OzI3ODYrOy86PTQzOi84PDcyPTE3PjY3PjQ7PDg0PDc4Ozk2PjQ2PzY4OzQzPDdCRzc3Ozg2 +QDU0PTc0QjM4Pj00Qzc9QD0zQjY6PTo3PzU8PDo1PzY6PDo2PjY6NzguPzY2PDM1ODU4QTg3 +Ojs2PTI3PzgzQDI6PDQ2PDYzPDE5Ozo4PjQ1PTgvPDA2OTg2PzVCQTszRDNGRT43QjxSgUfy +/9n+//f///v///////v///v///v////+//74/+v8//L9//X///74//T2/+/6/fvq+uP5/+7+ +/fnu+u3n8+Pn9+Dd8tvW7c7t+OXr9e3j69Xx+ebv++v4+O/s7urr7OLx/fH9/vfu/ub4//j1 +//D59erk693w/urw/O3+/vv///n3+/H3/vj7+fXx7+Xp9+nu++ry6uv6+/Tu9e////3///9h +T1xBOUE2PzY8NT02PzMzPzozPjQ9Oz0xOTM4PzU2NTI4OTM2OTU6NjczOjEzOTQwNzc1Njc2 +OjcrNTcsOzE6NjYuOzM1NTQyOzU5OjgtNS42NTkyOjI+OjstNjE4NDw2OTE1ODYzOTkzOzY5 +Ozc1NzgyNTYzNDIwOzQ0ODYyNzMzODc2NTE3NTYwODI4NzQzNzM6ODgtNjM9Mz0wODM4ODYv +NjI5ODU0OTY0OTgzNzU1OTQ3Nzk0NTU0OjMzOjI2OzY3OzU8PTU4Ojk4Ojg6Ojk1ODQ4Nzkw +NzIyMjsxNjQzPDk2NzMyNDgzODIyNTU4NTYwPTE6NDQuODU3NjgvNzI0OTYyNjMzOTQzNjQ6 +NDUyODgyNzE1ODYyMzU6NzgzODM3ODI4Njg8OjU0Nzs4PjQ4Ojk3OjUyPTMxOTI5PjYuOjI4 +NjUwNDU7Nzw2NjMzODUsODY3MzUwNzQ1NTcwODg1ODs1NzQ0NjU0ODkzOzE0PzU2MjYzNjQ2 +Njs0NDEzNjo1NzA1OjkyPjQ5NzoyNjI4ODYzODE1NjcuNjE4MzUxOTkzNjwzNTQyNjY2NTIw +NzcxNzcxOTUwODQxMzUwOjY0NzgxNzAxNzkvODM2OzksOjU3MzowNDA2NzgwOS84NzwyOTU1 +ODswNTE1NzQyNzQzOjQzOTUxOjYzODQxOjYzOTgvOTgxNzQzNTgzODU0NTgvOjA5OjsuODA4 +NzcsODQ2OzkrOTc7ODkvNDM2OzMuODcsNjQsNzgvNTMzODg0OjM1NzcyODEwPDg0ODIyOTQ+ +RUJRVUlZV0tVVUtgWFJXWEdcV05aW0lfW1ZcWkhZXFJhXUlgYVBbWEdVW0NaWlJXTkVQTEhC +QTlAPTw5PDU2OTY4OS8yNDg4PDQvPDs9PDspPDg/OzgvPDQ6PDYvPDxDQzdBPTpKQTdNSDpU +Sz1fTUBnTz16V0p9YkWJZ0uIa0mSakyRYkmZZE+OaEOaak6VZkiaak2QakiPZEyKYEOMW0aB +WkeEVj58VER2U0V1T0BuSUFeRjtTQT1EOzc9Pjo1PDU8Ozk6PTk/PD5FTTlKSkFFSz1WT0de +W0dkZU9ua1N2clx3cFptcF94cF11cFxwcGB0cmBwblhvc19sbVt2a1xta1Z1bVdxbVRxblts +bVR0a1htblJ0alhucFFuaFxma1RmaFVsalZwbFJra1VqalJtbFJpZ1JhVU0+OTo3NzI0OC83 +OS81NjUzOzc6OTk0Ojc6OTgyOjk+OzovOjQ7PDgtOjM4OTQ0PDo0ODg8PDg3PTY3OTkyOTQ6 +ODc1PDI4PTgxQjY6Ojk4PTwzPDc4Pz44Pjg5Ozs4Pjg+PT0xOTE1OjczOTE7Ozo4OzgyOjg+ +OTgxPTQ0Ojc0PDQ8PzkwQDU8PTk5QDc6Pjk4QDw9OT47PTs6Ozs7Qjs8Qj9BRkJPfErq+c32 ++e77//Dx/ev8//f3/O/+//7///////76//f7//n2/uv7//H///b6//f4/+3+//v8//Px/fH1 +++vr8OX4+/Dl9Ozq/dro+Onj9Nzg7+Dt++v+/f3r9+fq++T9//76//H2/fH0/Ob0/vL7+e3q +9eTt+O7+//71/+3y//Hz/Oj1/u/+//T7//P+//v9/fLy++/u9+j4//Dv9eX3+u/h4dNRSU89 +OjsxPjM5PjgxQTM0OzQrODE1OjkzOCw4OTcvOTE2NTk2OjA5OTgxNzc3OTQxODQyODc1NDcu +OTMuNzQzOTU0NzIxNjMuOjU0NTUzODYyNjIzPjM7OjkuNy46MTguOik1PTUtPCo2OTgqNjE2 +OjcxNTMwODU2NzU5OzAxNDExOzgzNzUyOjMwNzMtPDIvNzQ5ODcwNTA4NzcyOzM8OTcqNzU6 +NjgtNzI7NzUvNTQ6OjMtNjMyNzg0NTQ2ODI3NjgyQDc6OTQ1PTQ5OTczNzY1OzUvOjQqNDM1 +NTY2NjUxODMtMzAyMzkwNzIzPTgvMi81ODkyNzMwOjowOTMxODU4MzEyOi81NzYxPzQ3Ozcx +NTQ1Nzk0NTU1ODgzNDMwNDA3NjUxNjYzOzM0NzY1PDUwNzQ0NzgxNzU7OzQvOzQvNjMyODkx +NTIzNzcvNjA0NDYyNjU1NTctOC84NjgvOjM0PDcvNjM1OTI1ODk1NzM4Nzo3OTUxNzIyODMs +ODg1NzIwMjY2OjU2OTEzMzUzPTMxNjYwOjEwOjYrODEvODQuOTIwODgwMjU0ODYrNzI0OTMt +ODEzNjYwOjIyNjUzNzYxMzUtOjIxOzkzOi4yOTorOTYxNjctNzUzOTYrODUzODgsNi40ODot +NzA2ODouOi43NzkvOS8uODguOTEvOjY3NzszNTA2NjsyOjk1NTgyODc1ODY5NjcyNzI5NTcw +OTEyODMuODQ4NjcwNi85ODoqOTE5OTgrPTE2NzcnNTE1ODQsQDUxNTAzODQ0OjU3Njs3SDhT +WUlVWk5XVklYWUZWXUtYWkZbVkZgXE5aWklcXE9ZWEFbVVJbWEVaVkxXXEtUT0xHQTs8QTg3 +PzcuOTM6OTo0ODk5OzgyOjA1Oz01OTQ1NjU5Oi0yNDw8QzY3PTlFQTlESj9fRzVVTD5oVzxx +VUR8XUSDY0aKZ0uRaE6VeVKkdFahdk2kcVOddEyiclSUbVGfbkuYcEmTY0qRZkaSYEmJYkGP +W0WDWz2GW0SHWUKBV0NvTEJjRjZcRDxFOzo6OjQ9Ozk6OTA6PzU5Qzc/QjtIRz5YVUZYX0pk +YktiZU5raVprdVd2b1x1c1pxdlxybF97cld5clVvb1pzb1pwbVZybFRwb1Rwb1hzaldla1Nz +a1dubVRybVhla1ZubFZna05va1loaE1qalVlaVBpaFNkak5kZVJYVUs3OzUyOTUyNzMwNzQy +OTIzOjE1OzYuNTM2OTY0PTY4NzgvODQ9OjkoPDI7OzgsODM8OjcsOzRBPDstOTU9Ojo2PDg3 +PDQyNTg2PDg2PDszQjQ3PTw3Ozo4PToyPzY4Ojo3QDc0OTM4PTk4PjM2PDo0Oy44PTw2PDE3 +Ozo3OjQ2Oj03PzMzPTc3OjsyOTU+RTo9QT4+PDg2Ojc9PT00QDo9Pzk6RzlRgEj6/+L+//r/ +///7//T5//L+//7///7///////7///////////z7//f////9//v2//P///b5/vjs8+fy/un8 +//Lz++7k+OPb7tPg793l69vT39Hu+OX79+709fPy+/Hn8+nu8uP4/fz//+3y/e7///7////7 +//Hs/uv5//j3++/8//X+//fu9erp8+Pt8+jx//T9//zu7uTv+uv9/fXs9Ons69tUTVE+Ozg2 +PDM3OjI2QDA4NzczPjAxPDA2OzU0ODc4ODgxNTE6PDMrNzA7NzMrNy88PTQuNzE+PTQuOzE2 +PS4zNzE1PTA2OzEsNi82NjYvPS80ODUyOTI9ODczODE4ODI1OjA4PC0zODMzOTE4PTI0NTA4 +NjM2PS4zOTMyNys4ODM4OjAvPjA4OS4wODQ4NTMvNzA4Oy8zNCs7Nzk0OjA3ODMzOi0xNzAz +NjU+NTgxOi8zNzA5ODU1ODUzOzEyNjE5ODczODc7PS85PTM0OSw0ODQ1PS03OzIxNy4zOTcq +ODM1Oi8tOCszNTI0NTM4OjIvOS85NjMyNy43NjI1PDUxOCswOjUyNyo2OzM1OjI0PDAzODAw +NzA4PTQyPTA3OTM0NjE1ODkuOiw6OjcvNi87PDgtOC1AODgvODI4NjUqNS43NTM0NSwvOzY0 +NzE2NjA0MTQ0PDI3NzQuNy8xNDAwNTcxNzA1ODMuPDM1ODMwPC82PjU0OzIxOzUvNyg2Ojox +OC00NTk1Nzc2OzA0OTE1PDIxOi8wMi00OTIxNyw1NjU1NzA1OS40OjIuNzE2ODYsOS01OTYt +Ni03NjYpOC8zODQtODI3OjQxOTQwOC0yODQ4PTM3OjguOzM2OjMvPDE4OjQ2Oi80OTcwOzQ0 +PC4xOjUwOTM2QDYzPS8+Nj01PDAzPT0zOysvOjY2OTIxOzAvOy0yOi83OzcyOzQ1OTcvOyw2 +NjIzOjI1OjQyOTAyNDk3PC8zOTQ3OzI3OTQyOy4uOzUzNiw2NzQ6PSwvOzU5PCpBSkBcV0dZ +XkpZWUNYWUdXWEhcWEZXV0NcVUtZXUJaVklcXkJdUU5WWUJYVkdRTz5PSUc/RTRBPTs6PC04 +OzMzOjQ4NzQyPS8zOjM4Oy81PzQzPi89PTMzRzBBQjRBRTlYTD5ZUzhtTj52WEGKZEmLbEqZ +bE2cbU2bcE+cdEiedVKjd1CugFSwg1OufFCteFKqfE6rfE6rckygakqdZEuVakSUZkqOaEKU +Y0qLYj2QaEiHZTeNW0SBVTVzUTtlSzdcRTVFRTFCOzY7PjU7RDE2PDI8RDRPUDtcZEVkaUlk +ZkdkZk1tbk5vb1R6d1luc1p7cllyc1R6cVRxcVR0dVhtblZ2cFRyblVvclJyb1hvcVdua1Rt +blNublZqbVNucFhrb1VsbVFrbVJoaU5qbVZvbE9va1NvZ01XU0g5PjQzOjQzOjIzOjQ0OC0y +OTM8OjEyOTA1OTI1PjE4PDUwOjI2PDUwQC84PTMzPzE2PDY4QTM0PDQ3PTU2OzM0PTQ7OzQ2 +QDM5OTc3QDU1Pzg3QTg2PTU3OjI4ODkzPTA2OTUxOTM7PzY0QDE9PzU0PDA6PDQyQjA7OzA3 +PTY8QTUyQDY3PDAzPTM3PjU+Pzk5Pjc7PTk3RDQ7PjZAQjZAQzlDRD1RhEb3/t34//P+//L/ +//n///n///j9//z2//H///v6//r3/+/3/eT9//v6//H3//D7//fz/e39/+3///X2/+/z/unn +8+Ha6tfS6Mje7dvc7dDm9dv2/+7z+O3p++n6//zs++vz+PLq++jz9+Ty/ffz+/Dt/ert8ujp +++b8/fb+//L4+fHq+uv8/vv///////P1/Ozz//Hu8O/3+u/5//ny9Obi5dVWRlgzOzQ6OTs0 +PjI+ODgyOjE3PDoyPjI6ODg0OzUrODU6OjMxNzQ1ODczPy8vNzM1PjEzODc2ODQuOTU2Ozcx +OTM6OjQrNDE+ODIuOS45NzIyOTU0OTMyPjk2OjAtOjI2PDM0ODMtOS02NzQyNDQ3NjgvODU3 +OTMzODA8ODcwNzQwNzcyNzUzOC81NzUzNjE1NDc0NTIzPDY3OjAtOzUzOjMvOzY1OTctMjQ3 +NTYvNjE4ODgwOTM1NjYsNzI0OTk1Ojc4PTkxPDU4OTUyOjU5Ozc4NzI0OTQvOTUtOTM3ODcu +NDU0NzI0Njg0ODczNTcyOi42MTIwNy41MzgwODQxNzQwNS42NzMrNTM0OjktNi46NzU1NS85 +ODMtNjQ2ODY4NTk1NC02NzgzOzYwOjQ1ODIyNS44NzgwNjM1NjkrNjQzOTctOjM4Nz8tOzA2 +NzgsMzQ7NzYsNzM0NjUxMzE3ODgxNzIwODQzPDQyNzozPTc3OjYwOS0xOTUxOTEzNDkxODMz +MDYxODA3PDkyNjExNzovMy0yNjkvNy0wNTo0OTMzNzs0OTQzNy0yOjczOTg0ODUuODY4OTkx +ODEuNi4wOS8vPDY4NDczOy40ODctODA4OTotPTE4PDUrOi82NzQsOTM2NTUtOTQwOTg0Nzgx +OTMyOjozOTM0PDYuNzc1OTc1PDkxOjM2ODkyPDM4OzgyOTE5ODcyPi83PzowNzAzNzozNjI1 +Oz01NjM1NTQ3ODU0NjUzOjcyODMzNjgyOTE4NTgwOC4xNzcxODEtOjU3OjI6SEFZWkZVWktZ +WUlWWEhYXUNcW0xaWkFYXU5cWk9aWkhcWEdWTkdQTT1RT0ZKSkJHRT87QDU7OzwzPDQ3Ojkz +PzE6ODs0NC01OzkzODA2QDg1PDE/UztERztTRThWUz1jSjtwUEV3V0KFaUibcFOXak2ca02T +cVKlelyrglOreFivfFWveVusgla2glmyfFezeFurfFC0eleibkyccE2ncUifbUucakqha02c +akqXZUmYaEWTZEaNZUKOX0J9VT1+ST5iSzVUQDxDQTRFQT82OjE/PTtARTdXU0hZWEhiYktz +cFFucFRub1RvcFZ2eV5ybVtzdFh2cVd5cV51clpwbVd6clxxcFhwcVhlb1tya1hubVVybVZl +blRtbFZsa1VycVJra1JsaVRpbFdraFNpZ1JmaVBqaVJWUEU8ODozODY3PTM0ODkyOjYyPDU6 +OTE7PTk3OjM3OjYzPzIyODY1PDAyQjg5OTUwPjQzOTcuOzU4PzgxOzQ8ODowOzU3ODgvOTI7 +PTk3Ozc3PDouPjo5Ozg2ODcyPTg1PzY5PTM3Ozs4OzU6PTQ0Ozw5QDg9Pjw1Ozg5Pj82Ozk6 +Oj01QDc/OzY3QTZBQjozQDc6Ozg2RDg9QTw7Qjs/RDk5QT1CRT1Sf0j6/9r///////////// +//////////////////3///f4//f6/+z8//v7/+/9//vw/uf3/+/y/u3u+ezs++rp9Ofk8N/x +++fo+uTh69vV39PW3NHn+eHp9eLe793e7t3Y6tfk9un68On0+O70+en3+PX7/vb8//n///by ++evu7Ojc6t/s++nx+On0/PP5//Px++zw/PP19+7z/u7s+Oj1/PXk69ZUSFEzQDY4ODczPjc4 +ODQ2PDY0OzU1Ozg4OzIzOTM0PDMzOzIyOjMuOjE0OS4vNjA1NzMyNTM3ODguPDAzNzIrNi84 +NTUuOi83OzcuNyo0NDoqOzI2Ozk3Njs5OTYtOjAyOjQqOjM2PDU5NzMzNTQ0NTIzOzcwOTMv +ODMwOS84ODMsOjA6NzQwNTQ1NzgtOjE0Ny8tOzA5ODQsPC42OTUvOC80NjYwOS80Njk0OjEw +OTIzOTYuOTE1OjM3ODQzNTI1PjYzOzQ1PjkyPzI3ODEyOC84OTUsOTA2NjMxODU6OTgsOi84 +ODUuNS8vNjExNzEwPjU0ODQuPTE0ODYxPDQ0NjcxNzc4Njs1OzUxNjA0NzkxNi0xNDgyNTI3 +NjgzNjAzOjgwOTAzOjgyNyw1OTY0OjEwPDg2NzUuNzMzOjcvNDMxOTQ2NzI2MzkzNjU0ODAo +OjIwNTItNzYuMzMwNTkyODQ5NjYtODI3PDgzNjUzOjUwPDI1OzIxODU4NzA1ODYvNzAyODwx +OzM2ODcwNzA4OTkxNzI6MzM0OTUyNDQvOjYyNzMvODQxODMzODY2ODAyODUuODQzOTg0ODU1 +OjkzODQuODQyNzkxOTQwOzUuOC81NTYuPTAvOjcuOC4zOjktOi40OjIuODA1OTs1NzU0ODg3 +OTc0Ojk5OTUyODgzPDUyOTQwPDYzNjQyPCw2OTgxNi82OTowNzM1OzkvOTY2ODcrOzIzOTsv +OzMxPDkzOTIyOzcvOjM2PzUvOjUwNzE1NDM3NjgzOzQyQzYvPTM5PjY6TkBXV0pXV0ZcUkhX +U0dYWVBZWkhhW0xXXkZfVUxUVUVYWEtLUENRTEVLRkFHQDs8OTg4OzI2OjQzNzo3NzU0OzQu +QDc1PDIuPzU3Pjg+PTVMSEBWSUJZT0BfRzdqUUhwWkCHY0uNaUuYbE6Yc06ielKre1SsfFSu +dlqtgVW1h1u3h1q4hVy6f1e1glm7iFuyf1q9flW5fFW4gliveFOtfFKeb02raUiibk6ocU2h +akybZkmaaEyWaEiUa0iTXz2KX0SBXDxuTT9WSThRQztERDU+Ozc9PTlEQzlMTUJXWkVhXE1j +Y1FlYk9sbFJmbFN1cld0c1l6cVtxbVlxa1ZscFd0b1pxcVpyb1tzb1RzbVdqbVBxbFlqa1Fu +b1psbFZqa1VqbFRta1RobFNmalVrZ1JhZ05oaVBaUEk1OzU1ODY1PDI8OTQyPjQ3OjMyOTM6 +ODUwPTA5OjQvPDI3OzgxOzI6PDUzPDQ7Ojg0PjQ6ODY4Pjs4PjE9OTo0Ozc8Pjk2PTg1PDQ3 +QTkyPjY5Ojc1PTY7Ojs1PTI9Oj4wPTI8PDszPjRBPD0zOzpEOz03PDk9Pjw9PT80QDo1Ojg7 +QDs9RTo9RDtBPjs4QT0/RDo8REE9QjxARzxDSTtMT0VMWkJzlF7w+87z//T5/+/9//v///// +///7//H6//X///j7//b+//nz++z0+ur9//v+//z+//j6/Pny/+jv/Ort+ubx/ez2//Ll+eXe +8NPq9OH5/fHs9evq+eby/Pb+//7z9efx/PH9//Lt/e7t/ury/O/7/vf5//X2/vPl6uD9/fn/ +//7////5//n///7z/+7y9eby/vn1/ert7+zz++319urw9Onl49lKSko9OTowOjU2OzY2ODE8 +PDQzPjc1NzkzPTYxQDc2OTg5PDU2OjU2OjUwOjc1ODMyNzo2OTUzPjU0OjQyOjU3OTEyNjA2 +OjcyPDc4OjUtOjE1ODkwNi83OzswOzA9NzkwPTM0NTUuOTAyPDQ3NzQ2Njk3PTkvNTgvOjQ3 +NjQzODEzODMtODI1OTMvNzI3ODYtNy86NjkwOzE1ODMpOi81OTgvPDE5OjMvOzMtOzM1NDI1 +Njg3NzM2OTIuOTIwODY0NjM7Ozk3OjM6PTcyNjM1Nzc0OTY4OjkqMzI5NjgsODM3NTQtNi48 +ODQrNjM8OTkxODQ1OTQyOjYwNjYyNDIsNzQxNTYwOzI2OTIsPjQ1OzIuNTUvNDA0MzctNjE3 +MzYzOjE1ODUxNiszOTwyMi81NzcuNDQzODgwOTIqOi83NzgsODMxNzQuOzQ3ODMxMjQxOTgw +OjQ0NTQyODgtOjc0ODkrNTEzPDgxOTk1ODk0ODg+PTY1NTY4OTYyOTg1NTMzODMuOi0yODUy +OzM0NDksNDY1NDQzODM3ODYuNTQ2OzQuOTU4OTYvNzQ1OTA1OzQuNi0zPDU0OzAzNDMzNzMz +ODQyOTEuOzQ0NDcvOy8yODYvODE0NTkvOjIvODMvNy44OjstPCs0Nz40Ojc0NjcxOzIyMzU0 +OS82NjQ1PzQuPDM0PDEvOzAtOjA0OzYyOzE5OTYzOzE1ODMtOS8yOjcrOC84NDYtPDIvNTkw +OjI1PTsxOS8yPTgzPDA3ODUtOTg0OC4vNjM0OzQ0ODQvPDU0PzU/TTxbVktcUkhXWkVbVk9V +XEZjXEpXXEdhX05TXUheVkZWVUhRSEU8RjhEQjpCPT81PjY5PTMyOy82Nzs1PTQ3OjszOzg6 +PDo3OzNGSDtYSz9VQzxaS0pmUzh3WkZ3YECNcFCWd0ydbleid0mkgV+uhFizi2K8imC9jGW+ +jWS/kV3BhmHCjl3IimLDkGHFjGG+iVu+hV7DiFmygFazfE+tfVWyfFSldEytcU6nck6udE6h +b0mdbkagblGmcUaeaEeUakiXZUmHXD18UUFqTjteRztORDpEQDtBPjlAOz1ERz1XVkhdYkti +ZEtiZ0pubFB0cFh1cVZsdV1zcFlvcll0b1ptb1x3b1hpbVJ3b1hvcFVvaltvb1ZxalNpbVRn +a1hra1VmaFFqb1Vpa1RpaVJkbFRvbVNraFNUTUcyPTkuPjQ1OTg2ODI1OTQwNy86OTIwPDI1 +OzU0OjM1OjM0PDM9OjUsNzA1OzgvPTA6PjkyQjg4Ojk3Pzg6OTU5QTg1PTUyPTc0QDY3PzI0 +PTYzQTU+PDg1PTM8QDkzQDE7OzsyPzE/QDkxQjU8QD41QTNBQjoxOzhGPj49Rjw8SDs/Sj4/ +Tj9QXkFYcUZ0i1OPn2Gqtna7y5DK2KbM27PG3LW4zrLL47Ly/t/7/+7////////8//j9//v/ +//////39//b///j1//H6/+n///38//zy/Orw+e/q+OD3//D6//f1/u72/+/n8+bl7+DT7cvr ++One6tra6tX///z5//Dv/fDx/O/x8+Th6d739fnx/eLw/u3u++zh9uby9Oz4/vb7//Dt//Ds +9ePx/O/17ubk8eL9/fv////06+ns+O39//r0//P69+7j49RUR0tBPjw0Pjc2PDY6OzczPjc4 +PTYuOzc3OzM1OjI3NzIzOjQzOzMsNi81PDUqOSw4NzQrNi05Ojo0QC0zNjQxOy0zOTczOjIz +ODI3OTMyOTEyNTA7ODQzPDcwOS4zOTQ6OjU0ODY3ODIzNi47NzYsNjM9PDgtNy47OjUnNTM4 +NzQsODQ3NjYwNzE0ODEwNTE1Nyw2NjY1NTQ4PDQwOS49ODEuNjM1NzMvOTcxOjE0NjMyOi0y +OTYzNS48OjYzNS84OTczODA4Ojk4OzA1NzQ4OjA1OTM2NzUsOTIxNTQzNzE2OjMrNy8vNzIv +OTAuMzAvOC4zNjIwMjExOTI1ODQtNjIyOy8vNjExNjIyNjU3PDAwOjYvOTMvODQuOjE3ODkz +OC81NzQtNzA5NzEpOCoxOjEuOzEyODAxOC87NC4tODQwPC4xODE0ODYwODMyNi4tNzM0NzIx +ODQzOTQxNzQ4NDkxNTE3ODYpNzQ2OzUxOjE2OjguODUyMTctPDE5NjUxOS85OzYqOzE2NzUy +ODQ1Nzg1NTQzOTcyODExOi41MTAyODkwNzMzOTYvOjg1OTktOTI1MzUsMyw8OzguOS46OTsv +Oi40OjYyNi80Ozk0PjIxODg1OTYyNzM1NDA2PDQ3ODU1NzQ2OTQyNTU0ODU2OjYxODY2Ojct +OzI5NzMuOi88PDcuOjM6ODowOjE2OTMuNjQ5OS00OTE6OzIyOTcyODEzNjQzOTU2NzM0NjQ0 +NzU0OzEyOTMyPTU2ODU1Nzg0NSw0ODozOSk1Ozc2PDUyPDZGTTtZYE9bWkhaVUtbW05YW0Zd +WElaX0teWE1cW0dcTUVNQj9FSEJIRTc7Ojs9QzY3Pjk7PzIuNjk7Py0vOjo+NzcyOzpDQzRM +SD5aTTBaSD1pTkJ3V0iBYkWLaEuWdEiZb1Gfek6mgFWqg1mqh1i1ily5jWO/jFjCkW7FlF3E +k2/LkGnJkWXJiWbKkVjJkGPEjGLHjV3GiV+9hFrAgVa0g1a8eFmvdEu0dlWud0iqdVCmcUil +Z02ecEeodVGibkihcE6mdE2oc0mZZEN+VURuTUBgRzlPQDg8QDc3QjU5PjE+RDhMUEBVV0de +W01aYERoa1FqbVB1c1ltcFlwcFxxcFV0clh1bk13cVhxbVlvb1JvbVhsbFdybldwcFJwb1Zt +bFdsalJxalJqaFVna1JqbVBtaFVpY01ZS0cwOzQ/OjktOzNBOzgvODE8PjcyOzc2OzY4OjY2 +OjM1OjQ0QDM1PTYyPTQ4PTg3PDM4PDg1Ozg0PjU9Pzo5OzY2Ojg3PDI7PT02Pi47PT03Ozc2 +Qzw7QTU1QDY3OzY3QzQ6Pjg7RjlAQTk+SzlEVD9NYz5rek+JlV6jrni3vY3LzJva4Lbf5sTs +887w99P2/tr6/Nz6/9z9/+P//+P3/+Lx+dvc7c3Z7cP8/+r///z5//T4/+////////n///v/ +///////2//L9//H+//b8//f4//L+//v9//3////9//fw/+r6//Pv+Onx/ezq+ezj99jt8ebd +5NXi6t3l6dri7uDs/vf///L6//r+//v1//D5/e3+/vX6/e/v+ert+ev6//D8/fL0+u7///3/ +//7///z7/+/5//H3//L+//zx8vHy++7z/u35++/s7OBYR0czPTk+ODkzQDE8Ojg0OzUyQTk0 +OjY5OzoyOzY8NzgxPDA7OTcwOi44OTUzOTEsOTc1ODg8Ojg1PDEwNzYtNzQ2PDMyOzUwOTEu +OTE2NjUyOC4+ODcyOzY5NzgyODE6OjguNDM3NzcvOi02NzkzOjIxOTA1NzI0ODU3ODY0NDI5 +ODc4OjQrODQ0NjIzNzI2OjMxOS44NzUqNTE7ODQsOS48ODgwNTA8NzEzNDc6OzYwNzM3NzMz +OTMxOjM0OTUtOTM+ODc2PTc7PTY4ODY3OTY3Ozk2OTQ1NjYyNjI3PDoyNy01Nzk3OzA3Njo0 +ODEzOjs2ODMxNjA1ODIxNjQ1OjQtODA0ODIuNjQ4Nzk1NDY8NjUwODM1NDE1NzQ5Njc5OTg2 +ODQzNzQwOzMyLjAxNjY2OjQzPDczNzM1NDc2Ojg1ODkxOi84NjUuNTE4NTouMzE4OTovNzM0 +ODUuOzg7ODMyOjQ2NjUzMz43ODMtOTI1OzM4OzoxOTA1Ozs3NzQwNTE0ODYwOjczNzUtOS80 +NTgwPTA3OTovNzA3NjgwOjM2NzcyODI5ODUtOTM5NjoxOTQ3OTQxNDMwOjUyNzYvODc0NzQy +ODQzNzI1MzM1NjM1OTYzOy81OjQvODU4OTwvOTA3ODkvNis6OjszOS82NzgyNiw5Ojw0OTMy +PDcxPDkzPzQyOzIwPTQvPDI2OTgzOjU0ODIvODU1NjwxOS84Nzk1PDE3NzswPTA4ODwxPDE4 +PDowOzQ6OTcwNzA7Ozs4Ozg1OzA3Ojc5Pzk0PDQyPTRCUURfWEhaUUdZUkpaV0taVU5VWExf +XEtZVEVVUEdKQztHSEdCQzhCQj83Ojs8RDw4PzYyPDQyOTczOjAzOjA0Py9EQzhJSDhZTEZa +TTlcUUFxVz1/Z0iObUWScE6geFGdelSyglGoiVi1hlauh1y4ilu5kmLCkGPImG/ImWTKl2jG +k2vKmGnLnF/RnXDMomTIjmPLkFvIjGfCjFy+h166ili8hVi6eVSueVezeVGzdVGncU6wakOe +cEyjb06ib0elcU2odUypeU2lcEmMWER2UzxmR0BORDRJQD09PjJAOzsvPzJGRDtERT9UTkZY +U0RhXUplX09gZVJtbVJsb1Vzcltyb1hvbFVra1RsbVRubVZtcFNzaV1ub1VzbVVqb09ya1lo +blNtbFlpak9maVFoaE5ka1doZlNXRz06PjY7PTA6NjU3OzY0OjU7PjE0OjQ7OzUzOjU2OzUy +PzI8PzkwPjA+OzY2PDJCPTcyPjY+PD4wPTY+Qzo4PTs6Qzs5QTo3Qzo4QTo9QDs6Pzo5Qzc4 +Qjc/RzxFVj5NcEZphEmIm1uvuWW7ypHL36TZ6L7h7MPo+NHw/tL0/+D6/976/+D//OL9/+T/ +/+H//+L//+T9/+L//+H6/9z0+9rf9dDQ5brK5Lz3/+b///z///b////6//r///z5//P9//P/ +///////7//z5/u/6//b7//T7//T6//T8//P4/+zx+ezq+eTw+OXl9+Lj+eLh+9nj8tzj9d3l +8uD9//z1//b5/fLr8OTs3Nbj8dzw7uXq8eHi8ODu++38//z7+fPs++jt++r+//Tx+/Dx8+nz +9+n5/fT/+ffy7uTl8+Lr7uvz9+v3+O7r8uLh39hNR0U7Oj86OjY2Pjk4OzU6PTY2Nzs3PDY6 +NzY4Ozc0PjQ1NS8zOzM6OTI1OzY6NjcuNTI7OTUyNDY6NjEsNTY/OTcuMzM9NjMvPjY6NzUy +OTQ5OjU2ODY2NzY1NjYyOzE9NTU2PC82NzI2OS8yNjExOjE3ODE2ODM4ODE7ODg0OzMyNzY0 +Ni8zNjUzNS82NTM7NDEvNjQ1NzMvNjAwODUuOTI4MjctNzM0NzYyMzMwOTUvNTI4OTc0NTA5 +MjUyOi87Njc3OjY3OzM7OTk5NDc1OjI6OjQxOTIwNzU2Oy42ODgyOzE4OTY0ODI5NTYuMzAz +OjMvODE3NzYtNTA3NjYrNjI1NjQyOzI0NzExOjU4OjItODU4MDQzNzY3ODQ0NTQyNjA3NjA1 +NjMzOTMzNjkwODQ2MjgxODE9NDkuODM4ODQtNiw4NzcoNzI4MzUtOTM1ODQyNDQ3OjY1ODEw +NjA0NzM0NTY1NjUzOjMzNTMyNzY4NzQ4PDkwNzE6NTc0OjM1ODgyOC0zODY4Ny42NTouNy0z +ODoyOS8yNjcwOjQqOS85NzQ0OjUxODQxNzE3PTczNzA5ODIvODQyNTY3NzYvNy81ODYrNzA4 +OTYuNi86NjcwOjM4ODgzNzg7ODQxNjcyNzI5NzczOS8yODsxOTA4ODcxOzQ0PTYxOjI5Nzgy +ODUxPTQzPDI1OzU2PDQyOS0yOzUvOjM6OTg5Ojc+Ozk4OzEyOTg3ODcwOjA9OTYsNjE3NTY0 +OC03OzozOSs4OzQxNzAyODQ1Pjc1Ojc2OjY2OjhGUUFbUUlgV0ZaV0tcVUtRVExaUUJZWEdT +TUVIRkE/STlJPjs6PDQ8Pjk3QDA8NTw2PDE6PTcvOjE1NDMzPDA4RUBJTTFZUUFWRztlU0Zv +X0SFaEGRc02cbk6aZ06lfVethViziGC4i1nAhWO/h2DJmmzGl2vNl2zKoHPTpnPOrGvUmnLJ +n2nZoXLLnWvUnmrMmWfNjWfNk2bNlmjMk2LKiF/Gi1zAgFa8flm2fE+yfVKyfFGteU2vdU+h +bUmobVGjdEmpdVSncEWqd1OhbEOJWERxRztWRjZYSzlLRDU8Ojg2Pjg2OTU7OzdIQz9FRT9X +UEdYUERaXkZkY05mbU9xbVhtcVd7cltubVh3bFVvbFR3cFRqbVJxb1hra1VralRya1VubVZx +a1dsbFVvZ1RqalFsaVNpZ05VR0Q8Ojc2PjI4PTw5PjQ6PDY4Oy82Pjc5PDM1Ojo7PjQ3Pjg3 +PTIyOzE3PTUyPTM7Pzk3QDRBQTs4PTc6Pzk8STZIUz9TaEJthUqFmmGktna4xJPO1Kzb4L7e +5cbk78nv9NL3+NX0+9319tf2/9n9/97+/+H8/9v8/+D4/938/9/2/9r5/9zv/dbz/9Hm/MXb +6bXX7a3K5ay/3KS0zoyauYKLpXR2j2iOtWz4/9////////////v///z///r///f5//f1//D+ +//P9///+/+/9//b5//T0//P9//ny+e3r8uDr9uH1/+nz+ejp9uLl+eTb7tHj793j6d7Y39Pl +8tjf7d7l8Nzq+N/z/vn///7////////0/fH4//Tz/+7z/u7l8uXz++j3/vj6//Tv//P3/ez+ +//X+//X6//j///vy9O72/fL9//b+//v/8OlMSUc/PTk6OTM9ODgwODA8Nzk2NzU2Ozo3OjY5 +NTQ/OjY0NDg+OTQ3PDQxOTU3NTQvOjU6NjQ1Njk0OS8yOzU5NTYyOTQzODcxPTQ7ODgvNi07 +OTk3OzA9OjwyOC86NjY0NzQ0NTYxMzY5OjYtNzI5OjY1OjY1ODMzMzM2ODszMzI2NjMzOzI1 +NjY1PDA5MzcxOjU3ODczOTM8Njk0NzM+NTgvNjE7OTgyODE7OTgzMzE1OTQzOjI2ODc2NDk1 +OTM0PDQ6Ozg8Pjc5OTQ3OTM6ODU0OzI7NjgtNjQ8NTsuNjE4NjQsNzA+ODQqOjEyNzQtODE6 +OjUyNjIzNjU4OjYtODUzNjE2OTA2NzQxPDQ6OjQwOjU0NzE2ODQ1NzI2Mjc1ODQ6NDczNy48 +PDsuOC0xOjYuNis1Nzs3NDIzNTU4NjoxOjA7OjY0Nzg6NDkvNzI1NDUzOzExNzMxOTUyNjU3 +NzguNzMzNTcwNzM5NzsyNTg5OTkuNTk4NzI2OTU3NzEtPDUwOzUyNzctNjM3NTgvODQzNjg1 +OTIyODMwNzE4NDIzNjM1OjIzNzgyNTQ2NzkyOTIyLzQ4ODk0NTwyNDAwODc4NjMxNzQ4PDcv +OjM6NzgwNTU4NzU1OTI2NjgyPDA1OTgwODU4NzU1OjY1NDoxOTMyNzM1Ojo+OzwzOzAzNjk6 +OT0wOjQzODY0NTQvOjM4OjYvODM2OTo2ODc4NzYzOTM3NDUzPDQ8NjkuODA1OTo0Oyg5Ozoy +Oi83Ojk4OSw3Ojk4OTc2PC00OC8yPDw2OTRNUj9XV0ldW0tZWkxaVEdVTUNXUUpMTEVOR0I/ +QDlDRD83PTtERTs8PTQ4OjQyPDs7OzgyPDEuOzQ2ODo7PTdHQ0JdSzhWS0JnTz10V0aGakCS +a1CdcFmigFSkd1ekhV26gWW4i1/JmG/ImWPHlmnQnmnVpXTSonLSq3XWrXnVp3HcmW3SnGzS +mm/OmGHRmWvMnmjUnW3Wk2fLkmTMjmTDjWDEhF3ChWDGgFm7fFW6dFOueFO2gVGve1Kvek6q +ckqmc0umcUurd0yvdleodVCeYEd+UUB8UUVdTTxZRj1BPjQ5ODQzOjY7PDU/PDs/Pj1JRT5S +TkVZVEhoYUphYk9ra1Nxa1dzcVxxb1hualpvbVN1bl1vcFRwbFdmbVFvblhsbFVqaVJraVhr +aVhpbVltbVRqbVRrZlJUR0Q1PzY8PDUzOzQ5OTQ1OTUzPzE2QTIwOjI6Pjg1PjU9Pjo0QzhC +RDs4SDhHTEJAWztrek6HlVqhqHe5wZbI0KfV4b/f58Lj7s7s99b1+dny+tv3/tv5/dv1/tz3 +/9v4/tz3/9z1/9r5/9fr/tDp+NLn9sfh8MPX8LjP66zG4qXB2pyryoqnwIKUs3uDoGR8kmVw +hF5uc1pXYlBXW0xVU0xQUElHTUxum07x/eD4/+r8//D///r///////////////v///r////2 +//T8/uz2//D9//3///34//Ty/er9//j///z9//n1/+zq9uXf79vh/tnl7ebd69Pa39b3//z7 +//jz//f+/e3y7+vw9un0/O35/Ov0/vj0/fbt8+X1/fP///7////v++jt/vH3//H6+/bx+Ojx ++Ory+u/v7uTl6+Ly/unt/ezv8d/c4tJMQ0A6QDc7Njk0PjY6OTQ5OjM2PTkvOTg/ODUzOTM7 +NjQrPC02PTo2Oys7ODg0ODIyOzgxNi04PDYxNjUvNzU2OTU1NjQzNy8zNjg4NTc0NDQzNTY1 +NTUvOzQyODQxNjA4NTkpOy83NzEuOTQ6NDYtNTU8OjczNTQ5ODM1NDIwOjQzNzQxOzM1NTQw +NzAzODIsOjA0ODQsNTI2NjE0OTQuOjAyNjY0NzAxODIwOC43NjY0NzM0NzkyNzI2ODc0NjA1 +NzM2OTY1ODQ6OTUxODA3NzMzOzE0OzQrNyw1NzUuNDQ0NDUuNzMwODIuOTI1NDU2NC4yNTIz +OTItOjY1ODQoNjI1NS42OTYyOTI0NjIyOiw1NzQwNDA3NTgvNjIxODQwOTE6ODUrNTI3OTQv +NTg2NTguOC41OTIyMzMvOiwwPjgzNzE2OjguOjUuODQzNTkzNTE2NDcxNjE1NzgrNTI4Mzcq +OTQxOTArOC02PTotNzQ0NzMyOTI1OzcxNzQ1NjQyODArOTc1NjQyNDI1ODExODcxNjAvODAy +ODAzNzgtOzAtOTQwOTAyOjcrODE0OTcxOS0zNjUsNjEtODIvODQzNzgxOTcvOS0vOjIzNjU0 +OTU1PDQyOjYzPTYtOjE0PDE0OjM2OzUqNzA2OjYxODQ7OzQsOC5BQTwtPTU5QjgyNzk2OTcs +ODUxODc2ODcxOjE1ODouNzQvNToxOTI3NzgwOjEuNTQwPDQwNzM3OzgzOzE0NjozODQ3Ozkv +OSwyNjkvNCs0Nzc2NjcwPDU5Njc4QzdEUEFRUkNRTENVUUdVUEpMSEFOSktDRDo8Pz45PDY0 +OTc+QTc3OTk9ODc2OzY9PjYyPDA1PDQvOzo/PjBGRjdaTTheSD9kUD50V0eBYUGXclObclOm +fVesgFa0hluxi2G2imvBmWnJoXDHpWzOpm7NrHXYrX7Tq2/bq3varHvWrnTYn3PSpmrUpWfT +nWjNpnDboWrUl2rSlGfOn2XQmGrKk2PNkGvHh17GhV+/hlzDflezfFO/gFOvek21eFO0bUqq +c0qlbk2nd0urgFSsd06ibk2dZUSDWD5wTT5kSj5WRjg9QDU9PjgwOzJBOTw3QDBEPjxERzVI +UURgYEVgY01pbExublR3b1Z0cFZybVZucVdta1ZtblRrbFd0aVdxaVVyalZna09vbE9nZlVu +bFFlaE5rZVRmZlNRQkI0Pjc7PjM0PDc0Ozc3QDQ+SjhOSkJhWk18bVuZh3KnoY67tqHNxq3b +1rzi38a+2rHt7M329tn1+9n6/d75/Nr5/+H6/9z3/976/9n1/9nv/dTs/tHl+srf98TZ9LrM +6K/I6KC02pGs1IWXx3eJtWl6pmBwj1ZgflJedE5VZ0tRWkdKVENLUUZISkI8Qj9DQz0+RUE+ +QUBEO0M8QD1BQEA8QD1ERkFtnUr8/+/////////////////9//r6/+v+//v///n///j///j/ +//f+//X7//vt8+nz9+b5//jl/eHo+OHw/+Tx+uzj8N/h8+HZ7NTh7dvh9ODm8Nry//r0/e7x +/ufy//P29/Ds/Ob5/u7x/+Lz/urs/+v+//37/+3z/+rl/+Hp/+v3/O/x/vP7//H6//b///7/ +//z+//3//f/q6+bm6t7r8uXi59lLREBEPTozPzc6QDY2OjI3OzgyODY7Ojs2Ny88Ojo2OCs5 +PDotNzA5OTM6PS47OTQxPTI5PjI7OzMsOy4yOjQ7NTUwOjc2Ny8uOjQ2ODQrNS80OzQzOjE6 +OTgtNjE4Nzg1Ny42OzQuNC46NjYvOS44Nzg5Ny83NjYyNzQzOSo4OjMvODQ0OjQyOS82OTQz +OTEzNy80OTUwNzAyOTQsOS46NzEvNjI3OzIqOC88NTcsNjM4OzMuOTY3OTUuOjE0PjQ5ODY6 +Pjc4PDc1ODAzOTUyOjQ7OzI3PDczPjQ1PDMxOjE4OjkxOjQ1PTgvOzA3Ozc3NzE0OzgzODIy +OzkwOzIyPy82PDAvPDA1ODUtOTI4PDMsPC01OjQtOi82PTIyOS8yMDEzOzM0OSsvPS0zODQ0 +NDU0NzMwOTQtODc0OTMxOzg0PjA0NTIxPDI2OjYzMjA2NzgzOzU4OjcvOy85NTUtOS4vNjQx +NTE5NjUuOjA2ODUwOjY2OzQ0OjQzNS0zODQ3PC8vOTcxOTYzNTA1OjkwPi02ODgvOS00OTcv +Oyw0OTUrOTEyNzctPC00NzEuOS80PTgrOy0yODMuOjQyPDEzOjEzOjU4ODoxOTQzOzY2OTM0 +PTExPDQvPDQ1OjozOC41NjgxOTE1NzIuNzE4PDcsOi00ODwuOyo3PjwzOjA1PEAzQTYvOTcz +ODI3NzM1OzQyPDMyNDE1OTM4Ozo4OzcuPDIyPjQuPDE3OjUuQDA3OjUuPC84NzovNy80OzYt +PTI2ODcsOjQ4PDAzOTYvPDQ1OzhBUz9VT0VRVEZRTkZMTz5OR0ZERjY7Qjc8SDYwOjA4PTow +PzQ6PTsyOyo3PDsyPDQ8Sjs6QDFDST1PRzlZTThgRjdkUD9vTEuDZkeSc1Cje1CmgVyzhlqv +ily3jWO+lmrLoGjJpW3UqXXKonLVrnzUrYHZq3PPpnLTpnPXuHrgsXXdqXDVsnbcq27Xo23c +o3LRpGvTnm3Sn2PYoGjUn2TVnWrPmGTOiWTJkGXMj2PCgF++fli7gFW9gFe6h1ivbkaueE+m +dUmoeVKyelayeFWydlSmdlWabUp7W0FlSj9aSDdHPj01PTI1OjM3PjA3PDg3PjU+RDlASjpP +TkRdXURbZ09nbFRzc1dzclZ0cFVwcFV4bVhqb1R0clpvcVdvblhqbU9za1Rob1Rqbllobldy +aVpublZwa1hiWUxsZViGeGugkIGvqZjEv6TQzbja3cPn48vp7c/q8tTx9dXu+tf3+9jy/dv1 +/NvM77X4/djx/dX4/9Tr/c3v+cre+cPe8rnM77DN6qK62ZKjz32Ww2+BsWJ3pl5ollVegU1Y +bkhIYkJLXEBGUkBBTEI5SDRCRT87QTQ8QDs5PjE8Qz88RDI3Qjk/Pzk6Qjw/Pzk6QTpBQjw/ +Qjk+Rz47RDs+QT1ARz+FpU/3/+7+//L///n7//T4//P9//b////////5/O/3/vL8//j4/+n/ +///6//b8//T////4/vD6//b2/PHn7OHm9tr8//vq+erb7tDf79rc49jb6tfu/u30/+/49PDd +7+Lt/enc2s/++Pv1/Ovz9/D29u/x//Lw+ejt+vH+/fv+/vH4/+7t/OL9//n///X1/+z9//Xs +/eP2//j5/fX9//7y/+/t7N1JSD5FQENBQTg7QDw2ODI7Pjo9PDo2PDg7OjQ7OzQ5Nzc7NzQx +Ojc1ODY6PDY9OzQ4OzU+OjoyPDQ9NzQ3OjREOTg5OTM7OzgnPjU8OzIzODQ5ODIzNzU5OzU5 +OjcyOzA4PDkzNC82OjMzOTA5NDQ1OzY3OzY3OjUwNy83OTozODQ5ODMzOy4zPDE2OC4zOzk5 +OzEzOTg4NzU6OzU3NTE1OS42NjU1NTI3NzU0ODQ2Ozc1OjAyODQzODY1NzcxOjMzOTM9PTk5 +OzM8PTowNDU2NzI1NTU0ODYwOzYyOTE7NDk1OjI1NjYzODI6ODg2PjU4NTYuOjM5ODUvOTM+ +PTgtOTQ7ODQyOjE7OjQzPTU6OzA6OTc2NjM4Ozc6ODM0OTU5NzI0OTM3OzQ0OTE1MzU0OTQz +NzopPS81NzcsOzQ4OjoyODU+PDktOzc6OTktOjY6OjgwOTM3PDU3OTYxNjg2NzUyOjY5Ojg3 +Nzg0OzcwOTc0PjQ0ODUyOjI0NzkuOTQ1Njk1OjM8NzsxNzE3PDo1OC03NTo5OjA5NzwyODQ0 +OjI1NDc1OjU6NTc5OTc4NDc2ODc1OzM2ODU1Nzk5ODw1OjI2OjcrPDE7PDgvOzA2OzYyOjY8 +Ozk2NzU5OzcyOzc0ODg5NzguOTg1NzozOjk1OTc1OzM1Ozg1PDY4Ojk1ODcyPjU0NjgyOjE1 +OzU2OTU5Oj03OTI5Ozw2OTg4Pjk2OzQ3PTY3OjE1PDc5OzczOi80PjE1PDE2OTc0PzE2OTk0 +PDMzOTU2ODMzOjk5Ozk8PjhFUkVSUkZYUUNSUEVQUUNJRD5HPD06PDo7QDM6QTwwPjM5OzU1 +QjU5OTwyOzA6OzgvOy0/Pz1SRztfR0BXSj1iTUtpUECCZUyMaEiieFenhlizgluuiVu2iVnC +kXHMoWrMo2/PonrKoGLTpWrXtXrbrnzWo23UpXTXrHDjs3zbs3rgpXncq3PaqnrZrnPbqnbX +qm7ToWzYoHHanGzTnGjTlGvOl2jSl2fMjGnJjGPDg2DFiFS7glW9hVe3flG4e1iyd0ynb0yt +eE2yeFeyeFS2eVmueVWZb06SW0hvUkBcRTlFPTg4Ozc2OzI3Pzc2PDY4OjU7PTs7RDhSS0BP +VkViYk5mbUx5bldvb1l6cl90cFZ4cV5yb1l2bldob1hwb1Fwaldsb1Rvbllvb1RzbVZvbFFy +bVNxfVuot4jP1rXi6srp7tPt8tDw+NXz+Nnw+9rz/dvz/tvz/9Pw+tbv/83m+svm+Mnb+MS8 +46DI6avI56ez15Ks0YmWwHaPr2t8o2Byklthfk9cbU1NZEhLVkJHTEVJTUBGRj4+Qj1CQzg3 +QT5CQDpBRUE7RjxARDs8QDtARD08Pjg8QT08RzVEQj4yQDg9Qj4+QTxDQz83RDxCPD43Pzk/ +QDw6RTpASDxBSESFnkvx/eb+//T///r///r////////9//v9//f////////6//v6/er///n6 +//Py++7y8+n7//D///34//f9//L6//fl8+bq+eba8Mzo9eDe7dXj8Nrs++nu9Ofp+Ovy+fbz +9fb+/vzz/en7//vu9eXm+e3z++/0/ezw/+37//T0//b78vn9/u30//Lt/fDx++Xh9uHt8+nk +7+P+//j///L5//Lb1slJR0NGPj1APzg1Pi87OzY6Ojg/OjY8OTc6PTY1OC49NjgvOi06Ojg0 +Ny49Ojo7OzBANTk3Oiw9PTg8PTE6ODw9PTA+ODE5Njg6OjM6ODQ0NDUzOjc6ODc6PDY3OzE8 +OTU8NjIyPDE3NjMtMy87PDUpODE+PDc2NTJBPDk1OjY+ODoxNDM4PTEzODE2OTY0ODcwNzM5 +NjQ0NTQ1NzQxOjE1NzMtOjEtNy81ODMzOTI0OjYxNy41NTk2ODE0Ojg0OzE0Ojs6OzI4OzU8 +OzQ1NzM3OzYzOzM4OzUpOi00OjIyOjA7OTkzODgzNzI2OTI3NzE4OTU2ODMwOjE0PTU1OTY4 +NTM6OjUxOzU1OTYzNzc5OTM7ODUxOzM4NTQ1PDA2ODgzOTE4ODYvODE5OjYxOTE4ODIzODIw +NjMyODk7NTM0NTYtPDIyNjgzOzIzOTUzOTIwOjE2Nzc2PDM1MzozOTI6ODkzOzE2OzgtOzE3 +NTsqPDA4OTktQDU2NzUxOS05NjcpOjA2PTcwNjQ2ODYzNzIzODcvOTcyODMvNzg0OjM0OjMx +OTcuOzM2ODQuOi01NjkvNjA5OTo0OC84NzkvNzA1Nzk0Ny42NzozODMzOTQzOTQxOTE1ODI2 +ODY0PTYxOTc0OjQ0ODAyOjU1OzgtODU3PTQvPDQ2PTcsPTM4OjYpOTU8OzowOjE3OjgtOjM3 +OjcyOjUwOzQ1Ozc0QDM3PDgtPjQ2PDgyQTM0ODUxOTMxOjQ4OzkxOzE1PTkzPDA1PDU1NTI2 +ODg2NzAyPDswPTA1PDRISzxUVEZTUUNGR0BEREJBRjg8Ozs4QjQ2OjQ5ODU2Qzs4PTMzPkA6 +PC8wOTU6QDY1RD1UUUFYSTxjSz1ZS0BhSzhvUEKKZ0uVdEulf1StglmuhFSvimO+kF3FjmXD +oW7Tqm/Mpm/NoW7OqG3ZsH3YrnTYsHnZrnTYqHPcqHTdtILiqXverXXeqW/YqHTaq3bYqnbZ +qXHZonTUpWraomvUl2bSmmrOlWXNkGXHi1jIiWHDiVnMi1+6hFK4elSweFO0e1m1bk6meUyy +dFCweFGxdViyfFWjb0yPZEV2SEBYSDtPSDxDOjc1ODQ/OTkxPTQ6PzwyPzI/PT85SDdSTkZS +V0Bfa01rbVBscVJxbVZ0dVx0cldsb1RycFpxblVvbFVvbVZvblJxbllva1RybFVua1F3blV1 +k1rE3aDg88v0+NHq+dHw/NLq+tHn+Mzl+szi98PX8bvL6rLC46e13JKp04SZwnuIs29xn15w +kldmg1JZcktWaUlMXkBLV0xLTkFHR0g+RTk/S0JAQjs9RDhDQTo7Qjo9PzY4QDc/Qzs5Qj07 +PTw3Pzc8QD84RDg8Oz08PT07PT07PT08QjdBRkM8PUA+Pj8/OTtAQT07PTs/Qj8/ST87QDw8 +Q0A7RzhDR0KBnU70/eH///////////7///b6//b+//n+//f9//zw/+r5//D9//H///////// +//z7//j///z7//T////x/+/v+unj9OLZ69jV7cLl9uTe8drj8N/x9Obh6Nrk9d/6/vP8//f7 +//Xv9Ovu9+L9/fXx/vb7//b69+/n7d7k+eb9//31//Lu/+77+/Dv+ent+e33/vX///Pk5Nzk ++eXk5tng6eDo49VRQEpNQz1FQD82PjM2NDQ9Nzg7QDc7Ojk6NjU5Ozc7ODM5OTI5Ni87ODg7 +OzI6NzZIOzo2ODVCOTc0OjFAOzQ5ODNEOjc1ODQ6OTI1OTU4Oi8xODc2NTU5Pjs3OjM7NjY0 +NTU5ODI0OjI8NTMwNzI4NzQ3ODU5NDU6NTY5OTM2ODM/ODU6ODY2Ni83OTY3NzAwOjU0NjMy +ODM2NTQyNDU2MzY1NTE6NDowNzA4NTEwNTMxNjUzMDE2Njk7NTEyOjU1MzM3ODg2PDA4NDIz +ODc3NjQ4Ojc0OTM2NjQ2NjMtNzM4Njg1Ojc2NzUsNy88ODYyNjA6PDQtOjE8ODUuPDE5ODMy +OTQ5NjMzOjQ1OjU1OTQ1NTMwNzQ3ODA3OTY2OzIzNi03ODY0ODM5MjQuPC05NTY0PDI1NTUs +NzU5NTUsOjM8NTkvNjY7NjcyNjI4NzQsNjM2ODY5ODQuMjM6Njc1ODY3NTYyNjQ0OTEuNzYy +OzU1Ozo2Oi40MjkyNTA0NDg0Myw6Nz0yMS00ODoxNywzNDkvODMyNjgzODU0Nzc3ODY0NzU3 +MTUyNDY3OjM3Nzg0Ni42ODMsNzY1OjUxNTU6NzYwODU4ODguOC80NzYuODA5OzQzNjE6OjIv +ODYzNDg4PDozPDUyNjc0PDQzNjU0OTIzNTw2OjE1ODY3OTUzNTUzOzo0NDM6NzwzOTM5Njkv +OC40Nzg1ODE4Mjc6ODcwMjY6NzgxOTk1Nzc4PDc3MzQyNjg7OzgzNzA1NDsyNjI0NTk1OTE1 +OTc3NjQxOTg8Ozg8SjtMSD5FR0BIPDs7OTk/Pzk6PTs2PDk2PDU6PDU3PTg0ODE4PTgvOS80 +OjYzOjRLPj5VSTViTEVgSTdfSEZkSTl7W0iHYkebdFileVysflCvjV+5imDBkGrGmG/MpnPU +o3HPoXDVqHjWqnXXqH3ar33bqHzbrnTgqXzdsXXouoHisIjfrnvcsHXgr3resnzbqHHkp3jh +pnjcpnDbrXPZnm3TlGTUkmbOi2PKiV7Kh13Bh1XDjGDEhV3Cdlq8f1C2fFe1e02yfVqze0+w +elaue1SweFapc0+YZEyFUkFZSDtPRj1GPDY7Ozk3PDI0OjU8Ozc0OTU+ODY5PzlIQTtKSD9Z +VklgYkxvbFJqaVNwb1dsa1Zua1NtbFVva1VzaFZvaFdsbFVtbVZoaVRraVJralRtalJ4ilin +z4XG5afG5KrD4anA4ai12pWw0o2dwX2PtnB/p2J0mGJsjFZddlNWaU1NXEhNVEpFTEFFTEQ6 +Rj1AQj9AQDtAQ0FBRD1BRD5CQDs4Pjg/QDo2PDk4PDY9PDk/QDo7QDg8PTY4Ojg1OjY5Pjk4 +PTZAOkE2QDI4PDotPzU/OTo2PDg8PTk1Pzc/PTk3OzlBOTo0Pjg+Ozs7Ojg8Pjc9QDk7Pzk5 +QDtEQTt7mlD5/uf////////4//L9//L+//b////9//3z++r9//r8//n+//D///7///r///39 +//r9//ju+Orq7eLi6tjh59jn793d6Nzd+NLk7+Hm8Nrm7uTx//T1//v3//fx+uvj7tzm9Obz +/uvt++jw/ezx8+zy+un9//zz/ejz+fLx+Ojl8uPw8fLx9unx/Pbx/vL9//n7/+338/H///33 +/fP//+/k3dRPOkRDQzpOOjczODhCOjk0PDJEOzQxNzQ/NzU9ODY+NzgyNTMuOjE5OTQ/OTE/ +PjY6PzJBODU4Ozg/NDY3Ozg/OzQ/OTI+MzQ1OzY4NzQzOjE3NTUzNzM7NzYxNDM9NS83ODU3 +ODM3NzM3NzUuNzE8PDY1Pi8+OjM3OTE+PTk+PDU3OTYyODA4ODU3Ny4zNjEyODQ3OjI0ODM3 +Mzc/NDAoNy8yNTM2OTczNjE0NzIzOTQ6NjUwNzI8ODcwNDE4OTQyNzA5ODYzNTE+OjQxOS48 +Njc1OTM7OzM0ODQ5NjM9Oj0xOi4zOzQ0NzI1OjI2OTU4NTY1ODMzNDI8NDQ1PDQ2NzQvPC03 +NzYxODU8NDg1ODM/OjgvOzM5OjUyOjc8Ozk1OTE1Njk2NTU4OTIvMzM4NDQ1ODUyNTM3OjU1 +NjYwNjM1ODE0OS85NTowNjI3NTguOTE2OTctNjA0NjU1Niw6Mj41NTE1NTQyNjUzNjcyOTQ0 +OzI2OTMzNDY3OTAuMjM1NTM1NzMzMTUzNTYuOC81NjYwNzE1NTcwNy40NDMvOzI2MjMyNTM1 +Ny0uMzQ1NzI1ODgwNy44NTk0ODY0OTQzOjU1ODYuODE6NTgvNzQyPDIzNjQ1NzE1OzozNiow +OTM2OjE1OTQyOTA0NTU0Oi4zNy02ODcwPTQ5Nzc0NzQ5NTgxOjA1LzUvNjY2NTIyOTQzNjQ0 +ODA2Njg0PC8xNjc1OTAzOzY0OjczOTA6ODEsOjcwNywuOzgyOSgxODErOC4zNTctOSs2NzU1 +OS04PjYzOy1DREBFST9EQEI1Py46OTsyPCo6PDg1ODg6PDgzPDg1OyowOzU1PTQzOjQzPDhA +SDVZRkRZTDlkSD1fSjRjTUVqUkKEXkiDY0WehFylfVq2gFq2kV3Gj2PFlmjKoHDMqWfNqnbU +qnjUrnTbuHzasXnZqXndsnndvHvjr4Ddu4TlvoXktIDhtYfjsojjrIHdr3bjs4bhrHLdrHnd +rHjeo3jcom/XoWzXm2vSkmTQjmLLiF/Jg2HBgFbBhla9gVTBgF+8gFOwflO5glS1gFa5e1iy +flK8f1ineFKrdE6FXUVoSUFIPjlEQTQ8Ojc2QjE6OzY1PDU6NzU0PDA/Ozo5RzdKRj5PTj9d +W0VgYE5haU5vb1FxalNqa1V1b1RrbFVraVNsaVVpaU1salVuaVFnbExwcFNsbVVsbVVqeVFj +eVFgfUxkc1BSakhYYkpNVkVPTklDTEJJRkNGRj9DQUQ7QTs+QDhAQjs8Pjk/QDg5RTg/Pjg+ +QT4zPTdDRT1BSjxGRkE5QDg7PDk7Pzg7PTc0PjQ+OkA1Pzk9PTszPTg4PTgzPjg7PDc2Qjg2 +OTJATTk3PTs4QDQ1PDY2NjM1Pzk4OTY7PTg3Ozc8PTc1QDQ7Qjo2PTU+PDk2Pjc+QTs3PzhH +Rj97nkz2+uL8//H///r///v///////////j///7+//z5//P///z///j///v3/vH2/e7+/Pzr +9+nq+trw+uz5//L2//by++3f8+Xl9tXv++vp8+Te6Nb3/+/t//Ts++ro9ef+/vv1/evq+N7s ++eTo9ebr+evr8d/d7Nvz/vr////////7/fH2/vX3//H49O3+/v35/+3y++/9/v30++r0/+v0 +9+vr5NpIQkJLQzhAQjo/QTQ0PTBBPTo6PTU9OjkvPCs9OzcuNy49NzkrNzI8OTk2PDJHOTY9 +PjU8PjI9QjVAPC47OzM9PDE/OzM0OzIzOTc6ODAxOi82OjguNjI4PDEyOTE5PTcvOTM2PS8t +Nyw6OTErODE7PDM3OzRAPDc6OzU/OS0/OzI1PC84ODY0Oy42NzUtNy43OTMwOTIwODAzPDQw +PTA1OzorNy01NTgwNzIuOjU0OS4vNzg1OSwtOTU9PDM0PC41NjA0OTU5OC4uOC82ODYtOjA3 +Nzc1PC4wNTE1OzQzODQwOjMyNTMxODI0OTU0NzM0ODMzOS8zODY4NjIzOzQwOTI3OTUtNjQx +ODYtOC05NzcwOjM8OzUwOjQwPDMxOS40NTQ1PDM4ODIsOy83OjUvPTMxOTItPDUxOjAvOjc1 +Oy4wOzA0ODEuPjUzPjcwPTEzNzEsOS0yNzUrOTIxNTYqNzE1NjUqNjIyNzguNzM1PTQsPjA3 +PDgpOTA1QDUxOS4qNTUyOzUuNDMyODEtPDUwNi8tOzMtNjUzNzMvOjEzNTkuNi8xOjMtOSg2 +NjUwOC4yOzsuOisyOzgtOS8wOzotODEvNSs2OzEzOjE2NDEzOTAxOTY2ODUuOjMvOjAyPTEz +PjYuPC4yOjgqOjM4OzgsOjA3OzYnPjA2OzM0OjU5ODY0ODgzOzM1OTgzOTIyODYuPTAvNzAu +OjAwNzQvPCwzPTYxOS0uODU3OzYxODMtPDMsOSk1QDkrOi8yODIvOS83ODczMzc0Ojg2NTMq +PDU3Pzs3RDtFREBAPDc6Ozs0PDA2Ojs2PzAyOz05QDMzODc6PTUwPjQ1OjEqPThARzhNUzxk +VUFXTT1jUTtcSEJkTzx2VkiFZkiccFCie1G0f12zjFq+jma7kmLPpnHHp2nOp3XUsHLUqnrT +sHjcs4DhvHvcsoXcs3/lvonkuoDqvoPouYjluYjjvojrwJPou4vls4nhsnbks3zevXzgu4Tg +sHbdqHLVqG3cp3XSnWrPlW3JjmTFh1y6hVnDiVe+f1e6f1y8fVW3gla5hFe4g1e8gVu7f1az +f1iudlaZbEuCWUJjTzxVR0E7PzNDPj0xOS02Pjk1PSw2PDgyOi46QDc8PzpASDpMTEFHTUBY +VUZbXUhmZk5palJrb1Zsa1ZnblVsa1Nrb1Ftaldqa1NobVNmalNvalJoalJoY09BSj5CRj4+ +Qzk8Qjw4Pzw8Pjk6PDs7PTY8Pzg2PTc6Ozs2PTk6PzY1PzY6QTc1Qjg2QjI1QT84Ozk1RDk0 +QDE3RztFRDpAREE7PTUyPzQ7PTY3QzQ4QTo3PTo6PDgzQjNAQDk1PTM6Pjg3RDg0NjkxPzgw +QDQ5Pjk2OTg1Pzc3OjY4PzgzPjQ2QTsxPDg6QDQ1QDY3QjU2PTY2PTQ4PzcvQjY5Qjk1RjqE +n1Hx/+P+//b///////7///r9//f6//L///b//////////////+/9//f///v6//jr+ub6//D/ +///3//X3//X0/ezn9uTh+OHl/9jh8N/d5tXU5Mns9uj1+/Ht8uju/PHz++b2/vb///n9//3/ +///7///3//f6//39//X1/+3q/un9//7/+/P+/vv///f1/+rx++bz/O3s8OHi8d79/vnt6OHg +28xNQUNKRT1FPzw9QDg/PDc4Qzo8ODY/PDM+OTY2OS89OTYuOzE4Ojg1OTBDPzdBPzNJODc9 +QC5INzk9PDI+PDU6NzNHOTs5OTE7PTc0OTQ+ODU5ODMyNjM6OTc7ODQ2OjA8OjQ9NjY8OzEz +NzI2Nzc0OjA8OTI6OTE/ODY6OTVCODc8OjE/NzY1Ny88OTg1OSs6Mzc1NjQ0OTUyNTA1ODE1 +NjY0OjM4NTA0OTM0ODE3NzE1OTAwPDQuNzI+OjMxNy1DOTk0ODVBPDUtODA8NzUuPS89OjY2 +ODQ4PDM1NjIyOTE0NzE5OS84OzIxODU5NzA3OTI8NzQ4Mzg6OjA3OjU3Ny46Ojk0Ny04NDoz +NCw5Ojk0Ni8xODYyOy4vOTE5MjQvPDI2OjM2OTQ1PjEvODA6OTM0ODQ5MjYzODEzODMwNzQx +NTI3PDEvOjg3ODUwOjEzOzQ4NjU2OzMxODQ1ODQ2PjczNjQ5OTUyNzQ3NzgwPTI2OTY0OjA1 +PDM0OTI1NDAwNTc2OjUyNjI1ODQuODM2ODQzODUzOTUzODU1NzE1ODQ0OTQvOjEzODItNzEy +NjUvNC80OjEuPTQ4OjcuNy84NzcvPS44OTUzOzE2ODEsODQxOzQvOzA1OzcwODEyOjY2NzA0 +ODM2ODM0PDQzPSs0OjMrOyw1PDMwQS8+NT0yODA3OzouOjM2ODwzNTA4NjYvOic2ODstOys5 +NzY2ODI2OTk4OjY1OjU1NzQzPDYuNjEzPTo0NzM3NzMyOTU0PS8wNyw2OjUsNzQ2NzMsOjA5 +OTgzQTVIQ0A2PTg3PDsyPDQ4OTQ7PTMtPDY1Pjo3OjozOzQ4OjY3Pzg1PDdASzhiVEJjTDxn +T0JnTTxnST9rVj1/Xk2OcUOcdFiifVOtglSyh2G/lGzCmmjNoW/PpnLTq3vZsHrZtXraqnnY +rXroupHrwY/ox5Xqw5Hr0Zn0y5/r0aDzwpfowpTtwonkvJDqwIrhvIfovX3owIzotofjsHzc +qXvaqnjUqm/ao3jMnWTTkmfFimDJkGS/hFrFglm7gFm/fle1gFW/g1m8glq8ili7h1m1f1er +fFGla0mJX0VwUz9fS0FKPzw+PTY8OzU1PC1APjcwPDA0Ojc0RTRCPjlCRTtIQD9ARTdOSEBV +U0ZhYk1jZEtpbVJtaVVtalRta1NtalZrb1Rva1Jqa1JsaVVmbFJqaVFkWk9DPz45PTc+PDoz +PTM+OzgzPDI/PDk6OzQ8Pjw2OjQ6QTo0OzQ2NzQ4PDY8QDU7PzQ4PTQ1PzQ4QDU0Pjc9Qzs9 +PjlARDtBQzo8Pjk3PTU/PDoyPzM8PT01Pzg9PTo0PTY9Pzk0OzdAPzk1QDY2PjY4ODY3PzM2 +OjU2PTY8OzY3QjZHRjw1QDQ5OjM0Qjw3PDU7Pjs4PTQ9Qj44OjA6Ozw0QDRBQj49STySpUz+ +//////3///j///////n+//j+//7///////n///76//j3/uj5/+/3//Dw/+j+//f6//jn9+L0 +/Oj4+/bj9N76//Dp/unf79Tl8N7t/ebi6d79/+/i9eb9/vz7/+vu9urp9Nro/uvx/+vr++r1 +//Hn9uL4/+719+v19e3p/en+//P8/+vz//L6//v/+fHq7Of0/PL+9fbt++fs9uTy9eHh3NFM +RUBJRDxFPzI8QDI7PDA/QTg7PjE6OzdDPTEyOTRCPTAzPi49PzM8OzZKPDM5PTJKQDVBOTVJ +PDVCPjM6OzBBOTRAPy9AOzc3ODFAODQ2PDM9OzI2PDM8PDQ/PTM5QC83OzE2OTI1PS42NzIu +OzI0OTBAQDVEQDVDPDU/PTA5OTI/OzQ3PS82Oi8vOio7OC8vOik6NjY4NzA0OjQxODA1OTIx +Nyw1ODExOS8wOS4wOCo1OzAxOS85OzE+PDA8ODM5PTE7ODQ7Niw4OjE4OzE5OjQyPC85OjUv +PC41ODEyPTI3PzAxQC04Ny8sOC43PC46OzA7OTE5PC43OSw5PTM3Ois5OjA0OTE0NjIyNzEz +PDM4NzI0PC41NjAyNyo5OjM1Oyg8NTUvPi47OTUuPC87OzUpODE5PTYsNzQ6PTEwOi8xOTAx +NTE0NjUzOzEvPDAxOzE2NzAyPTA0PjIwOSs3OjQyNis3OzYvOis2OjQvOi84Ozc2PCs3Ojkz +Ni80OTM0OTAxNzI3ODcxOzAwOikxOjEwNzEwOjE0Ny8vOTIxOS0xNTUzNzE4NzYrOSo0Oi8t +OSw4ODQwOi42OTQsOis0OTEyODQ0OjE1NTgvOjAzNzkwOjA1OTgvNy81OTQxOy8zNjQvOzAv +OC4xODc2OzI2PTcvOy40PDczPC41ODgzOjExPTc1ODI0Ojc3PTAzPDIxOzAyPS83OTQuPC01 +ODU0OC84OzoyPi42PTk1NzIuOzYvOjAxPzg2PzAzOjMzNi8vOTQzOS0sOzE4OC8xPTA3QDI1 +QDY3QzA+QDswRjI6QDoyPy0+PzgxPSw0QDMzOiw0OTM6Oyo7PzU7PjNJR0BiVDlnS0ZiUTxt +Uj1nT0JyVkCHZUaXbUuhfFOnflevhVu7jmbCl2vHmGbMpGrOoWnTrXLXsH7VsHbYr3vetojr +xJLhxYzrw43nzJDs0ZHq05vqyJnyyJ/w06Dtx6LuyJHwzZfuzJLrw5jtxJfkx4vot4njuHvl +sHnZqG3cpH3OmmPOjWbKkV3IjGDEi1TIjmHHi1m6hle/hVm6iFnAhli7il26hlmzgVWwfVGr +dlOGYkh6WEVXTj5TQzc2PTVEQDoyQDZBPzQsOzA7Pi4uQTU/PDM8PTg7RTRIRzlLTD5UUUNX +XUNoY01salBzalRubk9yalBrclZwaFVxaVRraVFyb1hpbVNsaVBkW0hDQjk2PjQ4OTg3PDQz +OzQ4PjAwPjM6PDI0PzE3PDMtOi81PTUxPTM8OzkwOy80OTU0PDQ1PTU3PjU4PTY4QDg7QjU+ +Qjk9Pzk5QDI1OjU2PjQ1PzYzOzQ4NjQ1OzA7PTo2PjQ+ODgwPzM9PTQxOzA7PTMtOCw/OTY1 +PjQ+QDk2OzQ7PjY1QC83QTI0Pzc1PC83QTU2QjIzQjU5OzY4PjY9QDk2QjRBPz6MpUz6/+X6 +//L///v7//H+//P///z///fv/+j8//P9//b1//Dv+OD+//j3//L7//P6+vPt8+L2/+37/vbo +8+Pq+uHl9t/g8t/Y7s3k8Nvd5tHa49jz//Lt+ubd8+Ps9uny6+fl79vp8uf0/Oz1/fnt8+fu +/e37/vj1/fHw+O7y/+Xx/Ort/ury/+////n9//z///Xx+/D1+fn////x9+Xp++rq39NDQTxj +SDtVQD9GPDU6QzZWQDtSPjpMQDhJOzdHOzlEPjo2OS82OTdCPTJTQDpLOzZOPTZJPzFKQDhK +OTY4NjlAPDdCPDVDPTg8OTQ8OTQ9NzU0ODQ0Ny80PDI9OTQ0NzJAODU3ODc1OjMsOCw3ODcx +PC5COzdCPTRDNzk6OjA9OjE0PjQ3OTIzODE9NzIxNjQ6PTU6OTEwOTgyNzQ0OTMzODM4NzMv +OS81ODUwNzEzNDEuNS07NzQ1OTJAOjg0NzE1Ojc5OjI7OjUzNi86OjU0OjI9ODg6NzgyOzIt +NzMvOjM0NTM3PjM6OTE9ODg4NDFAOTk3OjI8OzI5Oy4/ODczPDU+NTooNy87NjgwNzQ+PDIr +ODM4NDUzMzY0OzI5OjQ1OjE6ODMzODE9NC8yOys3OzA5NTk6NzAyNzItOTI3NzgvNyw2Ojcv +OzA8NjkyNC0yNTwzMC82Ojg0ODEyNTU4NzU4NjU8NzM2NzM3NzczOTIzOTUyOTQxODY1NzMx +NTQ3NzMvODMwOTcvNjI0ODgvODQzOTYqNDA0ODAyPTc1OzEyNzc1NzU0OzEvOy02NjUxNzM2 +ODczNzA4MzsyOjc3NzAvPjY3ODMzNDUxNjI0NzgxOS8vPDMyOy8zNjc4NjgvOjcyOjQvODQ0 +PjUvNzM7OjQsNDI1PjoyOCw7OzwxODMyPDwwOS83NjcuNS8xOTczNzI3ODc0OSovOjY0Ojc2 +NzM8NjYvOjc1ODQyODMwPDMyOTIxPzM3ODkvOi8wODYuNyw0PDMyODM4Nj0yPyw3PTk1QzY7 +PDgyOy8wODc1PDA1PjkvPDY1ODEzOzczNjQtOi8zPjYyPzdFQztWTjtpUj9hTkFlUEJuVD15 +VEd2WEiOZk+Ob0ilfFqselq6jV6+k2TMlWvLqGzVqXvTqHXSrH7Xq3zYuYjat4flu4Tgw4rr +yZbuwZzw0abp1p7z16rxzaT0w6zs16n41rHz26f02Krs1qD10qnxzKDtyp7wxJrqv4rosYni +s3veq3vco3HVmnLMkmfUi2rKj2LIimfGjVvIhWDFil29i2PEimS4i1y9gGCwfVawf1mid1SI +X0V1UUNfRz5JRDo8Pjk8PDg1PjE5OjY1QDA1PjYzOjFAOzkwPDQ3PTQ7PzlESzlHSkFPVUBc +ZUtrblFtZ1RsalJoaFZsbFJnbVRwalNnbFNualJma1RvalFhV0o+Oj01PTQ3OzcsPjI0OTc0 +Oi41ODk1Nzc3OjcxOTU6OTgwPTY1PDc4PTYsOTk0OTQyPjc8PTY4PDszOjU0OjM0PDM6Pzw6 +QTY1PDgwPDg4ODk0PjQ4OjUrPjE2NjM5PTU6PTo2OzY3OTc6Ozo0OTE2NTk4Pzg0Pzc0Ojk2 +OjM1QDY4QDc7ODcyOi46Pzk1PTE6OjgxOzQ+PDw0PTVBPj40Pzw/Pjs7Rj+XpFz6/+7///3+ +//71/+39//n////7//X4//X6/ur3//Hu/Ors997x/OTy9Of19eb1/PXu++fm9OH5//Dt++7n +9t7c79vX59fc7tbf6dvV583Y4NT37+Hh6+b69/X///76//n4//z/+/Pm+N7j8eL9/P7v8+Lm +7dj6/vz7//ny//T8/fHt+Or7/fL5/Pbz/ene9N/w+/L48u3y/Ov0//Ht7+Pb1ctRRkFoSEFc +QDpFPTdHPjVaQTleRT1URThXPT1HQzhLOj06OTE5OzlKPTBhRDpWQzVhQjdYPzldQz1LOzU6 +PTJHQTVVPDVNOzdKOzZIOjNAPDY3OzY3NzY3OzFCOTY9PTJCOTc2NjA6NDQuOSw3ODYxOC9C +OjZEOTE/OzlAPDRBOjY8OzM8NzA8OjM3NiwzODA3NjE0PDM2OTQ3NTE0NTQ0NTQ1OzQoNC85 +NTEpNS48NDcxNTA8OjU0OjJANzQ1OjNCNzU8OTQ7OTM3NzYzNjE5NDc2PDQ0NTI2NzAyODQz +OTI2NC5AOzc5PTE4OTM5OSo7PDY4NjA6Ojk2Nis9Njg6OS0zODgzNy42OTQ4MTQ2OTEyMjQv +OS40MjMzNjI7NzQ4PDI9Njg7OjQ5OjM0PTY4PC80OTM0MjE2OTQvOCw1NzUxOTE1ODEuOzU1 +ODQ5NTU3NjE3NDcvOC8zOTYtNTA0ODI1ODI6PTM0OjE6ODQ1NjA6NTM2NzY1MDA2OjEzNC4z +Njk1NzE0ODg1ODY2NzYyNDU0NzY2MzYxOTE2Mjg2OjE2NjY1OTI3NjUxNy46OzUxOTE4OTUu +OjE6ODQvOjE0PDM1NzU5NjUxNywzOTc4OTAxOTQyNjMzOjQyOTEzOToxOjE2OjU5OC46OjUz +OjA3NzQxNjA2ODIuOC05MjgxNzE6Oz0zOTI1Mjk1NzA1NTgwNDYzNy84OTgzODE0ODMvOjAv +OC82NzAzNjQ3ODYzOjYzODcrNzE1ODYvOC49PTsnNzE3NzUyNzI6MzUpPzQ8PDk8QDQzOzQz +QTI6NTYyPDQ1PjA2RDQ2ODQ2OTgwODQtNjg5OjgzOjdPRz1VUzxpT0xhTThoT0FqVDx6XEyB +YkWJaVGbdk6kfVWuhFy5iGO/jWDEoXLMo3PKp3DXqH7Vr3fZsYXZs4bcuIzkt4Tsy57t1Jvr +z5P40Zrt3rL23bHw2bL60q742a711KL026342KDuzpzx1ajz05zr0KDtyY/iuH7nvIrluH3h +pH3ToGjXnnLTnmvPl2rXl2rPkWnKkl/Ml2fHlWPKkWXKkWTAhlqxg1mweViqf1ikdFKSZUh/ +UkhZTThNQz1CPTg/Ozg2PzE6OzY1OzdENjkyNzU+NzouPDQ2PDM2PjU9QjtLRz9JUERdX0hf +aEllaU5ia1Bja1Jobldpa09vbFVrZ09ua1Nkak1ra05aWEc/QD0yOi46Nzg2PjA2PTYyPTE0 +OTgzPDY4OzI3OTU6OTQyNjYzOzUzNjAwOjIyNjI3PTsyOzQ6OjQzOjI4PDstOzM8PDs0PDU/ +PDswOzc8ODUyOzY8ODcxOzU1Njc3OTcvOzc6PDgzPDM4ODYuOzY1NzM1PjQ0PDQtNzM4OjM4 +QDo3OS81OjY1PSs3OEAzQDg4PTs3PjE1PTo5PjQ6Pjc9OjU2QTk9Rz6TqlT9//b+//r+//// +///////9//v9//7////////////////5/Pb8//r8//z7//P///n3+PT4/ezz/O7p89/u9uru +8uXz/fHl/eHo7+Ld7Nne5Nfz/er0/fzt/+ny/e/r+Oju+ezy/+319fDw/Ovt/ur6//z7//f5 +//jy++f4/vD5/+zy+fPz+O3x//H9//3///f9//v0+/D89O7z/ur9//Hl2c5XSUFoRkBiQjpD +QDpLQDRdRD1gQjlVQDhVPzZXPTRFQjQ/MzgsPDJVRTlkSztsRzldRDVkRjhhSDtQQTg9ODZF +PDJbRDlfQDNVPztTPzdQPTlNOjU6ODY/OzFJPzdOPDVIQDdFOzdBOi05OTU0NzE9OTNDPi5S +QDhGQDRIPjVCOTBDOTc4NjY3NC83PS89ODQ3NTU8OTI7NjMxNjE0OTI6OjIzOjA1MzQvOS8x +OTAvPC00OTM1OjBCOTc8ODJDNzc8NTNCOzk4OjA6OTE1NS00OTU6OTE2NTE4ODYyOTAyOTE0 +OTM8PDRIPzdBOjg6OTI4PDM/OTI7Ni87NjM2NjE+OTcxODA7NjYxODA3NDUwPC88OjIqMzM1 +ODAvOjE4PTQ6ODY7OzU+NjY4OjU4MzU2NzI4OTI4NjM2PDAzOjUyLy4xNzgxMy01NDYwOCo4 +NjUxOS00Njc0NCsxOjcyOTQ2OzM8NDQ3ODc7OTk4OTM3MTE1ODE0OjMuODU4OTM1Oy4uOTQ2 +NjY0NzQ4ODouOTA0NTcyNjI2NzUwOi42ODkyOjU0OTA8PDU3OTM3PDY1PS47NDQwNzE6Njg2 +OTM5ODgzOTE2NjEzOTIyNTIsOzM0NysyOjM1OjM0OzI3NjM4PTs5OTI0OzU1Oy0yPDE3OjM3 +OTE0NTM0ODQ1OjQzNTI2OTQvPDMvNjUwOzQxODQ3PTM7ODk4OjAyOjk3OTMzPDY0OTQvPDQy +OjMuPTUzNjQwODMyOTc1NjsvOC81PTktOS0yOzcrOyw4OTkvOSkyOjUwQDM3Pj41OjE8PUE6 +SDM9QEA2OTY3OjcvOjU1PzAyNzYzOzQyQDc2PTRESDxaTUJlU0VjTz1nVT55X0x8V0ODYUiM +ckahfVamf1S0ilu7kF7GmW3KoXPUqX3VqnjUrnXbsn/YtYLZuIXcwYvnxZPky5bq057y1Jnx +26b14bH447D54LXz1K753rHw36r11rDz2af12azx3Krz0abt0JXxypzqwIznu37ltXngrnLU +oWvRn2zRnWvTmmfVnHDOlmnIi2nHkWDJkmHPmWrBj2LEimC7hV2wfleje1KecFGUa057WEJY +SD9KSjlDSTg/RDU9PDc2PjA6PTgwPTA5PTY6PjI2PTMzOzI4OzQ4QzY4QzdHSj5FTztOVUVe +YkZmZkxqaU1sbldsbVBlaVZvb1NibFBqZVZoaE1ZVEw5PTc2OzUsNzA4Ozk1Oy4zOjMxPTE6 +PDUyPTUpODQwPTQzOTcuPjIyODI2PTY1PjU3PTMxQDg0PjM4PDgyOTI0OzovQDU8QDUrOjE4 +OzgsPTI4PTcyOzU3OjYtPzY2PTY3QDY0PTUwPS84OzQxPjMzRTI3PTgvPzM0PjMzQDUzOjQ0 +OTg6QDU2PDwxQTI2PTctPjE9QTwyQTY2PDksPjM6PDk0RzlERj+brFb9//P8//f9//b///r/ +//3///////////7///v3//Dq/+fx/t////////n///z9/fX6//Tx/Orp7eTt++b4//rq/OTi +8uHd9tLh9N7h8Nfn9drt/+vw+Ozt9+rq6ubr9eTs+vD6/vX8//H9//79//P8//X1//Dr8OH7 +/fLy+O/z+vX9//zx/ev09fH19uz4/vH1+fHt6+j4/vj1/e3x8Ojg1s1TQkdoSz1kQEI/OzdH +QDtaSztlRz5iQz5WQjxTQTpNODg4NjU1OzVRRzpqRzpsSTllSDxkSjhqRztQPTRFPTk9RDRh +Qz5WQjZaPj5UPjRaPzlNOTJCOTs8ODJQQTVWPjxWPzlUQDRPQDdEPDU3ODFBPTdWQzpWRDhY +QjtQPjhROjxFOTJDNjc0OTJBODc5ODBHOjE5OzNAOzU3NDU3OjQ3NjNEOTk3PTU5OTc4Njk0 +ODM2NzM9ODNBOjdCOzhFNzNBOTk+OzhANjk1OjA7Njo8OTI8Njs+NzY4Njo3ODI3Ojk8PDVe +UD1xT0JQQTlBPDg9PDVBOzo9NjJDOzg7Mzc7ODM1OjA3NTM1ODg/NzY6PDc2NDA5ODY2OTQ8 +OTc9OjZFOzpBNTlBNjZBODhBNjs9OTg+OzRDOToyNjM9Njw1NjY4NzQ1NzE9NTQ6OTQ9OjY2 +NTg6NzYwNjU4Njc2NzY7ODk7Oj09OjI7NTk5OjY5Pzc8OjkyODU5NTgzMzI4Nj4uNTE1ODc0 +ODM3Nzk0ODQ8OzgtOjg7NzoxNTU2OTY1NjQ8OzU3Oy86OTpCOzdBOzY7PzY3PDc6NjI7Njc1 +NTU0NjY3ODI6NDk3OjIzOTgxNjI4PDg3ODFAPz06OTA+OTw8ODFCOjxCOTE6Pjg9OjQ6ODI0 +PTAzOjg7ODk9OzkyODA6PT0zOTA6Pjk4OzdCPDs5PDZBPDg1QDBBPDw0OjQ8OjcwODQ+Nzw3 +NTo6OzY2Ojg0OjE5Ojw3Ozg7ODo4Nzc2Ozg1NzY4NTo4MzcxNzg5Ojg3PzFBPDs7OzE6Pz81 +PDE7Pz80PTE6Ozw5OTE2Qzs2OzE1Pzo/QTtHSzldTUNqU0JmT0VuWUF8XUd6WkaGaE2Xb1On +fVqsgVW3i2zIk2vFpnHXpnDOp3vYroHRq3vhtn3awIbfv4noxJPqzI3vzZnw1qD31q/236f7 +4rT76Lj847L2z6ry3bDz4LP106zy3a311Kfv2KD20aH0ypTtyZPlxYnsvITisoDlqHPcqXHZ +oG/WqnXXnW/Un2vWo3LOmmrPmnPKkGfMlWzJlmLHiGSzh1eweFqhdU6hclWabVCCVEZYRT9J +QztIRj1GQTg/PTg/Pjc2Ozc8PjQ4NzQ9Ozs7Pjc4OTkwPDQ+OzY4QC4/Rjs6RDdPTEVTWkJx +alVvalNzbVpra1NtallvbVhxaVRwaVJqak1fVUs9QDo5PTc9OzM2ODE4PDczNjY5QDgzOjc4 +OzQwNzM8PjsxNzU7NzgoODU7PzktPjc6PjY1NTc2Ozc3PDE4PDU8QDk2Ozc+PTM1PTI4ODQ0 +Pzw8OTg4OTg5Ojk1PDk3OTM7OTw2PTI9Pzo2ODE6Ozw5ODg0Ozw6OTo0PTY8PTU6Ozw/Ojs6 +Pjo9Ojk6Qjk8PDs1OjY8ODg8QTw6PTg8RDs7QDo7QzxESz+ZqVv2/+7///////////////// +//X///z///b3/u38//D8//r+/+z///z0/+7+//Xy+fjp9N/8//T9//vw/O7t+uLo8eTn8+Pf +79jV4c7a7NXb6tXv//Px9+fn/OT4/fb5/fDu7+Pl/OTw/u3k9d76//jr8+bz9+rx/ez7//ns +9+z9/vb59ejx/uj+//b7//fz//L5/fP69/H4++/3//Ty8ufZzchKSUZoTDxlRj4/PjBDPTlW +RDlkS0BgRDNbRD1ZQjhMQjg7OjMzPC1ORjllRztqSD5mTDVsSD5pQzdMPTk9NzQ+OTZZQDda +RzhbRT5SQjRZQjVJQDVDPDU3ODNSQDhQQjlbRThYQDdRPjNFOTQ2OCw5OjRMRzhhRjhWRjVU +QDVMPTVLOjY6ODI5NzE+OzQ/NDFFOjVDOy9EOTQ/OC0xPTg4OTA9ODY8OjAxPTU6OjEzPTM4 +NjE6OzFFODRCNzRHOTRBPDFFPTY6ODUzOjU7PjA4OTM+PzU7OTMzOTQ0ODA1PDJPTziXjmSw +mIB1V0g6PTQ2ODA+PDU+NjBCOTQ5OzA/MjYzOS46ODUtOjA5MzMxOTI6NjE2Oi44OjQvOTJB +OjU+ODdEOzg+NzRDODkzOjI7OC07NzE+OTM3OzM2MzAyNzE6Njg2OTA3MzktOzE7ODwvOiw4 +NzItNi84NDIqNy0/ODs0OTM+ODM2OTM6OzQ2ODMxOTUzODE0ODQ1OTM3NDEyPC83NTI1PDIy +NjUyOi03NjcxNDI1ODovOCs2OzkxNiw+Nzo9Oy09Ozk+NDNDOz09Njc3Ny00OjU5NjQ0Njg4 +OzU0OjEyOjAyNzUzOzEuNzQzOzszOTE6NzEyOTE5Ojg4OzBCPzo4PTZAPTgxOjQ8OjQ2NzY7 +NTc4Ojo5NzUzODc2PS43NzU6NzM8ODw7OzM+PDc8Ozg7OjE8OzcyOTM5OzczNjEzPjQyOi43 +Nj0xOyoyPDo2Pi44Nzg3ODQuNzI0ODUyOTM3NjYsPTIyOjkxPzM7Oz0zOzMyOzU1PTQyPTg4 +PzQ1PDg3OjAzOjs4OjY0PDc3NzY4RDtPSDtXSEVmTD5oTUJrXDt9X0SBXUORa0eceVGrhGGt +kFy9imu7l2jGmXDLqGvUs3/frXTdtYDbrn/duYbhx4vjwYjiz5XozI3s2KH4263y4qv45avy +4ajr4KP10Kbx3qjx36f01p/z26j1zKXpxY3zvZ7rxYfxxIjjwIHqv4jhrnfgrnLXpnHcqW7W +q3HTo3HVoW/gqG/SnW7SlGvLlmbHkGK+jmHDi2C0jFmtdlecb06dck+Na0Z8TklYQjVNPzpE +QDM/Qj8+QDQ8PztCPTc6PTQzPDU3PzM6OzY8OzgyPDc2PTI2QTY9PzM6QjdHTTpRWEVpalFk +a1F1bFhmaU1xbVJiaE1vaFFkbU5ualNgT1A3ODM0OTQ0OzE0NjUwOTA0NjMyPDM3NzUzOTU4 +OjUuODY3PDI0OjQ0OzA5PTcwPTI2OzcxOzEyPDwyPjQ0Pzs1OjAxOi43PDI3PjI5ODMxPDQ8 +PjguPDQ6PDYyPDY6ODMyPTQ4NDowPjU0PTA2Ojg4PDgxNjE2Pjc2OzE6RDM5PDY1PDc6PDAx +OjE1PDM2OzUzPTU7PDY6QTY7PDg2PjI3PTc3RjZBRj6WpVz6//D///////3///r///f///z4 +/+/6//L///n///////z///H1/vP5//L6//Tz/e/3/u/1/+/q+ufr9uTm9OPv+eLu+vLa6tDj +6tvh9dnZ3tP1//f0/PPx/PX1//Hr+eft8+3y8Ovu/vD9//v5//P7//v6//P+//fy//H5//v7 +//H9//j1//L1//jx/ebw/u/9//Tq8OPl/+Xz9+fy9evnyM5QRkhnUEBbPj9DPjs/PDhTSD5m +Sz9kRTxcQTteQz9PQjY6NzosPDFSRT5tTTxvRj5qSjduTEBjRTZNQjk/PDE9OjhRQDhZQzdc +QjlSPzlZQDtOPjg/Nzw8OjdPOjpWRjlZRDhUQTtQPjtHPTc2NzhDOzlVSTdkRjxXRThaQz1N +OTlMPjU3OTM8PjQ1Ojc/PDRLOzpFPzlHPDs7OjQ2OjU0PDREPDY5OjY6Nzk7Ozs3OTM4Ojg4 +OTFHPDxHOjZGOzlHOzZFPT89PDQ6ODhFOjdLPTlHPTdAOjg8OTQpNTI4ODlhZka0soPEso6F +YV1BODk4OzVEPzNPOjRMOzlIOztBOTo4PC46OjRHPzdLOjdEOjc+NDc+Ozc0ODI9ODdJPzZQ +QjpHPjhMQTpHQDdENjg0OjhAPDBCODU8PDU1OjU6NzE4OzY3NzI2NTc6Njg5PDczOyw3NDM1 +NzQyODM1OzU5OjQ+Ozc8PSw6OjU1OjM6ODowNzI8NT40NTQ8Njw2ODU1ODgvNzQ7OTkvNzQ8 +OTY3OjcwNjg3NzgxOjo5Njc9OTg7OTM/OjU/PjRDOjpAOjY9NzgzNjY7Ojg1OTE/Nj03NjU7 +OD8zNzM3OzgzOTEwODkvNTY4PTg8OTc6OTY8OzU+PDVBODk/OjQ+PTI+Ozk2PjQ5Nzc5Ojk3 +Ojw4Pi85NTwzPjg8OTkvNzc9Pjc2PTJEOTc/OzZCPTg7Nzk2OTQ2PTszPTM0Nzo0Ozc5OD41 +ODEzODg2Nzk0Ojc4PD8vOzQ1NzsyPTM0PDstNzEzOjowOzU6P0E3PTg5QTw4PDk5QUA1OTcy +OzY6OzQyPzQ8QDowOjM6PD48PzhMSkJaUDxpTEZpTjtzV0eHW0eMYEybcVGle16wiVyvil6/ +jWu+kGjHm3TUqnjYq4nXsIPZsHfduIbjw4rlwJLjxovpyZ3qzJ3v1Kjz1aD437r45bD64Lz0 +36v50Lf04bP43LP14Kz507L427HtzY/ryJHuxZfpwY/svoHltn/lpXvVp3DhqnLXonHYnnXb +qnXerHnUqm/Wp3HOnGTMj2PDkV/KjmfAkmW+hmGwfV2fdVObdlOMaE9/WUlzTUZDQTk8PDs2 +Qzg+Pzw3PjU2PDoyQTM8PTkxPjJEPDw0OzU7PD05PTI7Pzo2PTY9P0BQTj1LT0JbXEdlalFu +bFZnblFobFlpbFRubFBqbFJjaVNaT0w0OzY4PT0sODQ7PTwwOjU7ODgnOjU2OjQuPDc3NTk2 +OTQwPDc1ODc0PDU2PDwzOjk0OzkzOTc4OjYxOjM3PDUzOzY0PjUxPDgyPDY3PTo1PTcyODk2 +PC81PDw3PDQ2Njw7Ozg2PD81OTcwOTU3OT4yPDI6NjU1OTU3ODk2OjY8QTozOzg2NzY2PDk8 +Ozs3QTg1Pjc6Qjw4PT89Qj07OT48Qz47QT9CSECfqVv6/+/5//L5//D///////////////// +//////////3///v+//n4//T6//b0/+v1/+v2//D+//71//L7//X2/fnq9eTf8d/X7tDo+N/o +7uTm7Nvr/+Xz//n3//Lp/Ovr9er5/vz///////P1//Ls/e/t/ej9//vx9ejq8d3q/On1//X7 +//3///v1//L6/vHs+ePq9ezq6uD09u7t+ufx8uLTv7tHRkdtSkBdRjU8OTU6OjdTQzxkSD1n +SUBiPjdVRjhXQDkwODc5PjVKRThqSzlmSTZwST9mTjZoTDtIOi0/OTg+Pi5OQTlYPzFVQTlX +QDZUOzRRPzM7Oi49PjdIPDZaRDlXQTdePjlSPDlDPTU6ODEzOzFbRzlfSTliRDhTQDZWQThB +OTFHOjQ0ODQ9PDVCOzZBPTFEPDdKPzdAPjUwOjE7PDM7PjBBODYwPDA2NzU0OTQ0NTQ4Oi89 +PDRJPTZJPTFOOTpMODFBODY7OS1BOzZGOi9LPDNFOzE0OTM6OjEvPTBkaESytYDHupKHalhH +PTo5PjBLOjRTPjhRQDVMPTU+NTI0PS85ODFMQzhOPjpMPjVEQDhEPzM3ODM8PDBQQjhTRjdY +PDlSQTRSPjk/PzA+OjVEPDBWPzdBPzJBOTQ5OTU6OTUwOjU8OTc/QDRCOjc9PDU8OjU0NjYz +PC8yPDM7PDU7NzA/Ojc4OzQ8PTIzOy42ODguOyw2OTYxNjA2NDkyNzE1OTQuODI1NTQzOTc2 +NjQtNzYzNzUwNDMzOjpBPDBCPDY9OTRBNzVDPjM+PDY6QDI6NzY1PTU7Mjk0Oiw6OTkyPC03 +NzovOzEzOjkxOC01Ojs2OS86OjYzODI9PDZDPjhBPjNCPDdCPDM9OjE3Ny00PDI5OzQzOjQ5 +NTYyOy48ODowPDE5PjwvPTM+Ozc4PjI9OzY4PTdAPjYwQDU2PzA1OTYzNjA4ODEzOjU0OjQv +OzQ2OzcyPTcyODcyNzMxOzU1PjorODE2NzMtPTQ6PDszPzQ5Qj0uODFAPjs5PzUzPTU8PTMz +NjM1PjUzQDQ3PDcyPTNDPzpLSjliTkJoTT1sVkCCYUGJY0yUa0qUd1ind1OrgVmxhl23jWDF +mWTKpXXKpWrOsnnaqoDasYTduoHgvoPiwn3vypjm0ZLvz5zt1aL53a/02aX62a344aH43KHu +z6rz3Kf12Jry3qT56K/526fy1qTxx5jpypDtv5DktYHltHritnvhqX7bq3bZom3WpWrYq3ja +q3LYpnfVoG3Sm23KjmfFk2fDk2fBj2K6iliufFqack6VclOQY0h7XkZrTD9ERTc5PzU3PjM7 +PzY2PTozOjY8PTYzPjM+Ozg0PDM7PjkvPDA9OzkzPzE8Qjo6QTRERT5JSTxZWUdialJrbFJo +aFJrbVVoaVJraFNqaFFqZ1FaTUo+OzYzPDU2NzczOzI1OzUtOzI2OzUnOTE6OjQuOTI6Ozkw +NzQ7PjIxOzM4ODE3OTQzOy8vPDM1OjZJRDg0PjY2PjYwOTY2OzEvQDc2PTc3Ojk4OzE1PDIy +PjE+PD01PDA6OTk1OjA2Ojc2OzAzQTQ5OjIxPTQ2OjI0QDI+Ojg3QTU6PTY3PDc9PTk3Qjk/ +PTY1PDY5QTg7Pzg6ODg6Pjw+Ojk5RzlARkKfrFvr/OD9/+v///v////9//v0/+v+//P///// +//7///j3//b0/ub+//X////////7/vP2++r1/e79//v0/+z6//Xu8e3a6tPa8tTj89rh8tjo ++OP0++/s+erq9/Hx/PD///75/fnx+vXv+OXz/vTy/+rs+e3l++f3//z////u//P68fLs+t3t +9ury++/7/vX+/vz////////1//L29O38//nr0dNJRkZwUD9bRTtFQDk7OTNVRjlpSD1nSTtj +RT1WPzZVQDo7PDI0OjdJRTZqUT5uUTpxTj1rTjxmRzdNPzc9OzdBOzVHPjdeRzVaRTZYQTpW +QDZPPTc8Ozo4OTU/QjZYRjZbRTlUQzNaQDpEOi86NDg0PzFYRjliRzdkSTtWRThWQTdKQDhD +Pjo7Ozg8PDNCOTM/PDRGOTdIPzpCOzY1Nzg3OjE9PzU+QDQ4OTMyPDQ2OTQuODQ4NzU8OzRU +PjpEPzJOPjhHOzRCOTg5NzBFPTpMOztHPDNCPTQ8OzM2OS4zPTVfbUe5wIXGvJeFalhBOjM8 +OzdHPzZdQzlRPTNSOTo/PjVBODY7OTNVPTlRQThXQDlMOTpHPDc6NjdCPzhWRjhbSjdeRjpX +RTVWQDg/OjlCNjZHOzhWQDVOPTk9Oi5HPT44Oy43Ozo9QTBKO0BLPjdMP0BKOzQ5Ojs1ODc1 +Oi49PThAOTtCOzU+OTg9OjkzOjMzNzc1ODA2ODM5NTY1OTQzNjUxOTM4Njc8OzVCPDgyOTg1 +PDQxODo1PTIyOjZAPjNOPjdNPjlJPjlJOzZJPDs7OzY6ODc4PTM5OjU1PjM6OjA0OzUzOjMz +NjY0OTQ0Ozg1OTE/Oj4+OzA4PTo+QThCQDhEPDZDPTZHPjg/OzNBNTs6PjI2PDY2PzM8PTc0 +PDM4Pjk6PDQ3ODw7PTZDOjs+PzI+OjdDPjk9PDM3OzQ0PTU4OzQ4ODc1Nzc4ODMwOjU5PDQ1 +PDJAOj4zOzU2ODcyQC03ODg2PjQ4NjkwPTE6Oj44QzY7Njs1OjEzOjU3QDk2Ojk2OTsyPi84 +OTg5OzMsOzQ7Pzc8PTlLRzxXUj5mUEVzU0eFaEyFbU+XbVSXd1WlelqniFezhmK2kGfBiWDG +nW7OpnHUqX3StnjauIHcsoLhuo3pw4ngxIjr0Z7q0Zvt2qf22bf34az247X6167s3rT60rP1 +36j837fu3KD42qb10Z310KnvzZj10ZrywpDpwobqtYfmsnnhtn7gsXfgrHbfsnjcqnrerXvi +snvjo3fPmmrKoGjGjmbNj2W+jmW4gl2ogVqseFScblGNa0uFYElnTT1NPzpARDk+Pjs3PzI6 +PTYwPDU/PDg2QDI/OzU3QTg6PjU3PTY5PTQ6QDk6PjU7RDw/QjlJST9ZWkNjZk9ub01rbVZu +bFZma1Nta1VqaFFtZVNcTUg9Ojg0PjM0ODYvPDExNzcxPDE5OzY2PjYzOjUyOzc1PTQtPzM1 +OzQ4OzYzOTw7OjcvPzU0OjY4PDc1PDU4OzkwODE+PDgwOzA5Ozc0PDM2NjczPy44Pzs3QTY+ +Oj44NjQ7PTQ4Ozc7Ozc4Ojg3NzQ0Pzc7PjQ7OzQ6Pj04PjU8Ojs6QTU7Ojs2OTQ9QDc2OzE7 +PzYwPTFAOzgzOjVBRDoxQjhDRT1CRT2usmP///n///////////////////79//X6//r5//Hx ++O3w/uX1/ub8//P///r9//T+//r9//r2//Pu+OPy/+zx/en5//Tx//Pi89/e5dzb6NPa4tTx +/vLp+Nz0/PXt9+Hx/fD6//L///jx9uTz/O7x+/D0+ejt9Ojt/ePy//L1//L2//L4/e/5//X9 +/fLv/u77/eXj8OTq6+Tv+uv1/u7t9eDax75GRkdyTEFdQjVCQDk+OzdPRThyRz9rSzdeQjla +RDlYPDc3Oi80ODFHQzZnTTxyUT1zTEBwUURuRjxLPzlCPzU/PTVJOzNbRDdgQDZSPjZbQTpI +PzZAPDg8OTJFOTZUQjdgQztYQDVbQjxLODU3Ojc2PDFbRjhjTDhkSThYQDhTRTVOPzY3OTM3 +OSw5OjJBPjJKOzVKQDRPQDpAPTI4NDM0OC5APzQ8OjJBOjc1OjE3NzE0Ni87NjU/OzBLPTVJ +PzNMPjRGPDhBPC03PTJDQjVPQThLPTZGPy84OzI2OTA0OTRkbUTDwIfIu5WIaFs7PTNBOzY/ +QjRgQTxWQzVWPzY+PjE2OjZAOzNWPzpTPjlQQThTPzdBPTU4Njg7PTRURTZgSDleSTlXRzdW +QzVBOTg2NjNMPDpZQjNTQzxCPDBGOz0/OTA5ODxAOzBPQTtUPztOPjdOOzY8PjQ2MzI4PDRE +NzU/PDBFOTM7OzA8OzEzODQ1Njc4ODk1OjM6OjYyOTI8PDcwNTQ5PDJBOjdOQjc/Ojc0PDMx +OzIyOzE4ODZDPjRYQTtXQzZSPzdVQjZRPTU8Ozg+OzVEQzxLOzNBPjQ/OS8+OjU3OC02OzU2 +NjE1ODg3PzNBOzZCOzY2Oi9IOTlJQDRMPTZFQDRKPDg/OzE9OTs6NjA9OTs4PTI7ODo3PDQ8 +QTg3PDY1NjQ8OTNCOjZFOzg+PDdCOjY+OTc3OTc1PzI1OjEzNzgzOjA2OjAwPDA9Ozs0Oy04 +OjQ0OjE3PDs0PDI4PDk0QSw0NjgzPy87NjU5PzM6OTk3PjM3Oy4vQDE3Pzg1QTc4OTk2QjU4 +OzgtPjg7QDg3RjRNQz9cSzxtUkR0YUOAaE6Pb0mfcVCbgFirelifgFytfFe9hmC7imfInm/H +n3LXsYTbt37itYbfvoniwYnmtY/gxYbuz6Tp0Jbu2Kfy3qf147Hx4qn42bHz36b0zqvv2afx +0Jn33ab41qzz3Kry16fyyp/yyZbtw4/twI3rwI3rsX3ornrnsXjdsXjhsnjZt3fitHzasHzg +pnDQn2zKj2C/lGLJi2HCjl25h122e1umdVGccVKGcEySZU1tUkNSSj9BPjc9PjY+Pjc6PDcz +PTc/OjY3OjU5PDIzPTY2PzA3PTM7OzM2PzY9Qzc8SDtDQjpCSjpRTz9iYktka1BmcFFsb1Vp +bUtrZ1RpcU5raFJYT0M4OTY3PzQ2NzQ0PS46OTU0PC01OjEwOzE3NjM5PzQuPDM1PjItPDA0 +NzAzOzU3OzM6PDk4PC45OTYxPDQ8QDcyPDQ3PDYvOy86PTQ0Oy44OjUxOzE3OzI3QDg3PDY2 +OTgzQS85ODQ3OjQ3OTI1PTQzQTY9OjkzOzNHQzk7PTo+PTk7TzM4O0ExPjBCPD4xOzM9PTsx +PTQ/Oj0yPDY+QDg1PTg+QztCTDyVrGPx/+T9//X8//T///f///n////////9//v9//X///79 +//b///H7/fT2/uzq9uDu+eju+eD4/+/7//L5//ns+unu9+Xp9OHh/Nnl9N3q9+Lj693j9OX7 ++fHt9uj4++7v+vLy/+719evp/OP+/vry9+v58O3p8eP6++v2/vL6//X+//T///Hx+eXu8/H/ +/fX5+/b2++3t8Ofy7+bt7+f3/eXgvr1LRUNxRkBWPz1JPT02PTVSPj1oSDxtPz9dRDhnOj5U +PTNEOjk3PTJGQztlTDlzUEB0Tzx0Tz5qSTtQPTJFOzM/OjRNPzdhRThfPjtePThaQTZUPTo/ +Pjc/NDZBOzNdQzxZRTdfPzhTQjZPPTkyOTI8PzlXRDZtTDthRzhdQzhXPjpHPjNAODc7OTM+ +PDdEODVIPDZMPDVNOTVONjczNzU9OTQ9PS9FPzo7OC88NjUxOS5ANzUwOTVKPDVMPDdUPDdO +PDZGPDhBOzc9MzRGOzhPQTlRPDhNOjo8NjY4OzI4PDFtdU3HxJLOuqGJZVhFODo6Ny5LOTdb +RDFdPztSOjI+OTo+ODNAPDNWPTdXQDhUQDhOPDhDPDs5NjNGOjVeTTZlRDpaRzpiPzhUQjdD +NzQ+PDdOPTRaQjpTOTpDPTlDOjU+MTI3NjhNPjZQPTlVQThPPDlLPDg8NTg3NjQ7Njw8PDRF +PTZAOTJCOTc3OjE6Oi04Ozg+NzQ6OTo7OTRCODY5ODQ2ODI9OThNRD5VQzFEPj08NTc7OzQ5 +OjU3OjZKPjlgRjpmRj5dRTllREBSPjRGNjs+PjFSPztQPjZTQDdQPTdDNzg2OTE8ODZBPDk8 +OjZMQTZbQDpJPTNBNjRSRjZiPzpaQTtdQTlWQzZGOTg+PC5MPjtKOjZHPjZAPjNBQDxKSD1I +PkM4PDFEPD9RPjRXPz9OQDlOODdFNjc7Njc+OzdGOjZBPzBBOTQ3NjI4OTM3OzRFODo3Oy9B +QD81OzQ5NzgrODA6OzcvOTE6NDQzOzE/PTo5Pjg3QTgzNzw2Py04Mjs2ODYzPzM2PDYzOjc2 +PTg6PzNAQzdMSTtWR0FgV0KCZ02Ca0eccleddVardV2veVquiVq2hFq2j2zEk2nGpHLUqHrT +sHjjt4fbtYnnyZfpx5flwJPpy5Lu1Zzz06Drz53v2Jrr2aT42K7z26j/2af30K3657L43rX9 +3LH01K/61qD52qT31537yJPuzJHzy5fqw47rs4bpt4XptYHir3nitXzetHnksXzjrnzap3HM +l2LLkGLNkWnJj2LCjmPAi1zDiV+zf1uZbE2OZE97ZUd1UURVQjlGQT44QjZCQzg6OzA8PDg6 +QDhFPjw5OzE5OjZDQz5CQDw8PDdGPDxCOz43PjdDRTpWT0NVVUdiY0toZ1JrbVJra1RzbVRq +a1BvZU5iaU5ZSkYtODI9ODo3PDM9OzkxPDM8OjY0RDA8Pjk6OTQ5OTM3OzkxOjY2OTEzPTY2 +OTI1OTY3PzQ6OzU0OTQ6NzcyNzE4OTYzOjM7OT0tOjQ+NjUzOzc3OjctOzBBOjc4ODc7OTM3 +PTM9OTM4Ozc1OjM4ODc2PjE9NzU1OTU4OjM/OzY8OzU4Pjo5PDI5QTg8PDI/PTc1PDFBQj48 +PDU9Pjo7PTI4Ojw9QjlDST2fvG3+/+/////////////8//39//T///X////////8//H4/+r9 +/vT5//f7//P6//by9e30+e3w++34//Hj6d7p79z8//vn/ubp+tzj8uPb6dPT5c3q9Onw/ur3 ++fT18eXk7uPy+Onw/+n3/ef0//X7//H3//H5/+X3/ej4/vD+//X0/+v0+ujy/e77/+zz/+7x +++ns/eHw8+T5/vn9//nu8+PcvLlHR0FwRkBTQDxBPzk/PTlRQDJkSDtwRT9cQTlePzhTQzVE +PTcyNDREQDdgTTVwTUR4Ujh7TEFmRzdROzc8PDBEOThCOjFgRDpiRDtgQztaQDhNPjhKOzg8 +OjM/PjBZQjlbQTdgPjlaPzVNPzM1OTA7OTJQSDNnSjtjRTFfRjtTOjNOPjk7Ny85OjQ4NC5H +NzhFPi5LPjVQPTlGPTM3ODY3OjE5PDVAPTI+OzE1OTI3OTI0OzE4OjFLNThLOzRRPTdOPDZL +OTo4NTU+ODJBPDFUQTdJPDZLODI3OzY3PTU8Ojlvc0vHyJfNwZmJZVk/PDJANjFFQTNdQTNX +RjpTOzJDOjY2NipBOjRQQjBVQTxQPzBLQDhGPy80OTg9PTRhTj5kSTlZQTZiRDlQRjBEOTM9 +PDFKQDlaQjhSPTpDOTA7NzQ8Nzg3OjFHPDpTPThTOz1NQTdQPDU4OTQyODI5OjRDQTBDOjNF +PDE/OjA4OjEzNjQwODE7MTY0Oi87OTo7PDA6OTEyODQ6OzdFPThSPzdHPjo7OS45PDc3NTc4 +ODVJPjRlRT5kSDZeQzdiPzlVQTZBODc9OjBSPzpURjRaQTtLQDJBNjwwPC8+OTY/QDNDPDtG +PzZcRjlMPjRCODpSRDdoST9nQTtcRDVaQjhFOzdCPjVSSTtZRDdRQjtDPjhAPztQUE1PPT41 +NTY/OzlRRTVhQUFYRDBYQDpBOS9COUBKQC9VPzxQPzhNPjhEPDk2OSxDPztKPDFIOztANzg3 +PS02ODQ3PTVBPDc2OzVDNzo2OTc9PjszPDA6ODoxPzE6PDctNTA7PTg2PT06OzY1NzU2Pjg3 +Pzg6PjBKRDxWTUFsVkeCY0WJak+ad1mdeVmtgVmniVizhF22i2LBkmy/oG/MoXTPonDarHzd +t37ivorkuYblvpHkx5bry4/rzp3rzJLjz5f02aj12aj03qr74a714q/3zaf43an45rf/57X6 +2ar01aP21J/6yZvsyJD0yJbyw4zrvo7tuYjlwITlt4ncsHfhuHzivIDir3zarnLfp3jPn2bK +mWLNkGHHjVvCilnBkmTEjWK0hlmwcleMZ0l+W0NeSkFKRz9QRTk/RDhEPzxIPjc7PjQ6QjRK +QDtGQzhPRD5ERTlCQTw5PjBCQDo5PjFDQDVMTTxXU0ROTEBkZkxiaUpvbVRvZVFoa1NoaE9v +ZlBlYVBaRUY1OTVBOTkzOjI7ODYzOTI+OTk2OTQ6OjUwNzA8NzYwODI6Ozo0OTA4OjQ4OzQ0 +QTw0OjM8PDA6OTc0OTQ1OjYvODQ8ODI2OjQ8OjU3OjY3PDU4OTgyPjFAPj05OTZHOTU1ODZA +Nzo4ODc+PjQzOjU3NzYzOzM4PDY2ODQ4PjRFOTY7OjQ6OjAzOjU9PDk7Ozg8PDY4Pjo9PDlA +Pj48QDg+Qj07PzlJRUWhsWP6/e3+//H+//78//L///f///7///j6//j0/eX+//r6//75/+n6 +/+71/vHu/e32/+n+//v2/evn8+Dw/eb///rr9+3X5c3S78nZ5dPd4dba3dHr/OHj+OPs/erq +9+vu9vD98/jr9eX0/O/x/vDt+e/0/uj6/vL+//z///Hx9uvz/fn///7///3y8evf7t7z/fL+ +//7//f////Xy9Ovy8eTwrsJSR0hpRj5gQzY+PDhCQDdJQzprSj5wSUBkQzhkRzlZPjlFOzc5 +OTBBPTxhSzx0ST90TT95UkJsQjtNOTRFOzRCOjZFQjVgRDpiRDxcPzhXRDxXQDdCOTo8OjZB +OzZgQz1aRzhkRDpcRjhNPjg0OTI6PDhLQjdpT0BjSDpfRTtVOjdMOzc7Oiw+NTQ/ODVIOjdO +PjlNPTpOPTU/OzU7OzE4NDg8PTRAOzg5QDY8OjkyOy44ODUzOTNFPjRMPjVVQDRMOjVKODg7 +NjU8OTVGQDRPQT1OQjlLPTg8PDg4OTE1PDVqd0jGyJTQvqGIZlhGPTU4ODJJPDdaQzZfPzpP +PzpEPDY1PTVEOzZNQTdaQztJQDhUODo5PDFANjRAQTZjSTpkSTldSDZfQTlUQTZHOTVBODdQ +PTVeRjlUQDhIODlDPDU9ODczNzJMPD1UQzZWPEBOQTROOj42OC02Njs6OTFEQTpKOTlFPzBE +OTs1OjQ1NTQ3NjY2NzU1OjI+ODY8OzY7NjQ4Ozg4OTVLPztUQz1MQDs4OzBAOzw3PDk9PDVD +QDNlRztkRTtjRjpiRjtUPjZDOTtBOzNWPj1ZRTtYQD5OQTlGPTc0OTM5PjJBQDlCPzNOQjxg +RThQPzo/OTJURUBpSD9lR0RkSDVYQjtEOjVAQDVVRj5WPTtUQDpCPTM5PDtPVEJSP0Q8NDRA +PjxPQjdcQTdbQzdSPzg/PTM+PTxORTtXPjpQRzlRPztAPDgwPDRBQDRMO0BHPDVJODs7NzE4 +OjUzOitDPTg+QjBBOzk+QDNBPzw6NjU+PTY3PTY6OTw4RDQ4PD01OzM1OTk3QDo6PjU3QTk/ +QDFLRT1ZTTxrVkZ9Zk6Lc1GUc1GliVime1qlglq0hmS5hl29k3bEoGzNqHfKsXrdtordtY/l +w4/pxpbqy5XqzJ3r05fq0aHvzpXu0qXy3rHy47n02q333a/z2qb01J/53Jv43Kn83LH64K79 +1rL43KP42afzz5nz06LxyZjtxZDyxpPqvI7puIPouoLitITZtnzjr3vdrHPQpGrOl2fKkGTF +jmXFjGHLlGrDjGLGhmWvg1qjdVGGY0qAWEZYTT5PRj5JSENIRTpFQD9ESDtFQj1QSzxXRj9R +ST1VQ0BFQzdJRj84PTU9QDQ8Qjs9PTtQTj5HSz9SVERlZUxvbFVyblVrbVJwalFxalZxaUxu +ZVFWSUY4QDg6NzczODU7PDcyOjM5PDg2OjM0OjU2NzY+ODcwPDM0OjgxOTY7OjwyOzY2Ojk0 +OjY8Pjo9PjYxPTU1PDg4ODw1OjI2ODk6OzQ2ODUzPjc0OjU0PDU6PzU6QDdAOjk5PTZCOj01 +ODg8Ojc1PDQ4OzQ6Pjg0OzQzOjY6PzQ9Pjk8Qzg8QDc7PDw7QDk9Ojs4PzY+Pjs5PTk7PT08 +QjNEPEM4QjVHR0KfwGz6/On9/fP///////////////////z+//T4//T///3u/eX0++P8//D7 +//fy/+j6//T2/vXv++X9//j///v2/PLx+Or0//jp9Nrq6uLy+efy++31///7//f28evt++73 +//Xu//D+//nv/+f1/er2/+/s++fq++P0/u/z/+/9/Pr2//D7//jw/+38//v///////v0//Tv +6OLo8eTo8+j+//PepK1GRTxxS0dTRzpBPT8/OzdKQDpiUD52R0JgSDpoRkBXQTRFPTgvOTU8 +QTZjTDlzTT12T0NwTUJxSDpNPTVFPTdFPDVEPDVfRjxZSDplPjpTQDVWOjo/QTQ/Ozg9Py9e +Qj9iRjZlRD1fQzVPPTo0OTE2OTFPRzhlTzxsRz5jSjxZQTlKOjlBMzQ5NzI6PDJIOTRIPTdP +PzxEQDRLNzguNjFBOjczPC5DOzg5OTM+PTYtOTU6PC4+OTRCOjhUOjlMPTZSOjpGOjU/OTI4 +OzVGOjdPQz1UPzpGOjk7Ni81Ozg4PDNlbEm4wY3OvaCEY1A/PDc5PDFGPjtaPjdZQDdPQTU7 +PTU5ODM+PTBSPjZTQDRYQDlKPDg+OjU5OjJCQTVnSjdhSzhcQThgRjpVQjg+OjE8PTVSQTVb +QzZPOjdMOTY9Ozk5OjI6OzRKPzRcRz5RRjFTPjk/Py82NTIvOS8+OTNIPDtMOzZLQThJQDU8 +PTY2NS8yPTk1PC46PDQ7PDE+OTk7ODczNjc7PDZGQTZVQjtFQjc+Nj04NjM+NjU2PDFIPDtf +RzdrRT5hQTlnRD5TQTI/PDU4PTtUPzhdQTVWOzhRQDY9Pjc2ODA4PzNBQzZDPDVORTRlSDlM +PDdCOjtRSDZpR0BgRDZmQT1WQTJENjdHPTJZREJVQzFUQj1GPDc3OzpJTENPPj09ODo8PjVQ +QjlaRjhaQTdQPjc7OTE8QDdLQjhZPzlRQjJVPTs6OzM7PTk8RDRPPzxFQDdNPTc2OzE4PDYu +QDRGQDpBPjU3QTQ8PTU0PDI6OTgzPjMxOzc3OzY3Ojk6PDg7OzM4PDUzQDVAPTsyPDQ7RTxG +SDlhUkZmVz1+YUuJbk2adl2phmCqhWS5h2G8kmO+kGfDnmzNpHvRqnvZs4HdtIPfvpDfvoDk +xZTuzpnrxpvr0J7r1qD11KPt2aH827D15bf95Ljx1qLwyZz3y6313qr65Lj83qr85LP73rP8 +3ab42aX506ntyZHsx43nxILswI7qv4npv5HouoTlu4ngsnzgr3rYonLOk2jFkmzMm17LkmfJ +lGTGlGfEiWW+hmCwdVuedVKWYk2EWkNXSEFKRzhKRj1LRThKSkVKRDxMSz9aTEFsUkdfSEBc +RT1fQzw8PzxEQzw/PDxBQDZCRD1HSUFMT0FaYEZpa01pa09vaFVpak91blVub1NyaFJkZlBW +SUUzPTM9Pjw3PDM6PDg6Qjk5OzM9Pjc6PTI3PjY2OTY0Ojk1PDI0OzUyPDU7PzY1QjkzPjY2 +Ojk3QDU/OjoxPi5DOjkuPTI8OTUwPDM9QDExPjY6OTsxOzg4PTk7Ojk8PTY9Pjs5OjY4Nzs2 +RTk3ODY0NjQ7OzE1PzIyOjI1Pzg9OzBAPTo4OjE4Pjo9QjZAQ0A9Pjk4Pj02Pjg8PDhDQDw6 +QThAQD5CSEa01IP///r///z+//74//Hy/+j9//b///7///b///////////////j///////v8 +//jy+vPr8uH5//X5/vTv/eby/Ovo8ufU5tDU5sbZ79nV4MvM28ft/+30//X2+vHx9+nv9Obr +9ev2//X39ezq++v1/vj+//f9+/bx+u3z//rx/+jy9+zm9t/4/fX7//L3//Hw9+rx8+H48/L5 +//v///vy9+jckphJSj5xS0hgQzpBOz9BS0NhUUlmSUFoSD5nRkJiST9gRD85PjM2ODw6QTVl +Tj92VDh5UkR4UT1vSEBQPzdJOzZFNjtCOjtZQD1fPjhcQjtUPDVTPjg+QDQ/OzVBOzJYRTdp +Qz5gRDhkQj1FPzk/ODovOjNSRDNlTD5tST1jQzxYQzdMOjg8OzI7Nzc8PDREOjRGQDVTQDpO +OjlFPDY5NTQzNjI8PTc5PzQ/Ozc1OTA4OjQ0OC46PDlANjNSQDpMQDZQPz1HOjc1OzVBPDJF +QDJSPz1KPjZHOzQ4Ni87Nzg1PDRhY0G/wYrOu5p8YFdEOTY6ODdCOzVYRTVYQDlLOTU4Ojg2 +NTM8ODRUQzRYQDdRQzVNNTo3OjE6NzZDRTRlSD1fRTlbQzddRDdUPzk+ODJDNDVKQTliQjJT +QTtFODM6ODo3NjQ6OjtKQjRZQzxSPTdQQjtKOzw6NTsyOjU3OC9JOzxFODZIOz08OjY8NTkt +NjM3NTIxODI+OTk1NzFANzkxPDU5NTg4MjdJPjtTPThGPTY6NzM4Ozk3ODcxOTRIOzRkRT1i +RDpjSjxnRzVVQT0+OjVFOTlRQDVbQDhRPzVSPT09NTY7PTY8OzFDQ0JDQzpTRjVfSjpIPTk7 +ODZORjVpRztmQjxlSjVZQj1CPDlHPTdWSDtWQztNOzhIPDwsOTREQj8/PDdFOz45QTVSQjdg +RT1bQjlNPDs7ODY5OjtIPzdZQTlRQDpMOzo1QDMxNjRFPDNKPDZNPzdKOzc/NTc0OzQ8PTw8 +PTRCPD88OzI9Ozs6Ozg3PTo7QjcyPDw2PDcuPDQ2PDk4PDU8PDs2QDQ6Nj0zQDM2QzxMTUFe +TkFxVkd7ZEmDb0yZdVmpgVmuiV61jGe8kmq8mme/lm3KqHfTpIHcsYHet4DewIzmvY/iypfs +zJfqzp7szZn02KLxzZrt2KT33rbz4bT13bn01p/43bXsx6bz4K773Lv54Kr53rT626vy2av4 +1qfzzJn1xo7htYLnv4/muILku4XhwH/ou4bav4LfrH7SrXTZn23MomXRm3DEk2bHjme6kWDK +kmfAkWHCiV6zf1igc1KZc02MXkdURzpLREBGRTxHST5GQzpKRj1KSj5cSEJSSzhmSURjTDly +TERLQTU+PT46PDc/SUBUTURRTUJVTEJdXkZoaVRwblNwbFVtZlFsaVBobVRnaFFsYFFMRUE+ +ODctOjY8OjYzOjBAOjc0OzY/PDkzQDM4QDk1PTY3OTY6ODc2OTUyNjQ0OTY0Ozk0Pzg8OTg6 +PjU7ODY0ODg5Ojg3PDo1PjQ1PT4yODQ7Oj4wPjQzOj0yOTo6PDw6QTM7QztAOzgzOjY2OTY4 +Pjk4ODg7Ojo5Njk0OTQ/OzZBOTRBPjg5PTg2PDo6PDg5OTU7Oj04PTY2PD05PDdDQjw/QD0+ +QTxCRT+w2YDz//Hz+ej6//D///7///////////////3////7//f9//z1/+33/u/s/+j5//D/ +///////8//rv++js+ufm9d/z+/Hk7t/e8NPs7ePx7ef07unu+O/r/e70/e/y/O/0/fj0++zl +9ODx++vr+Ojx9Ofs/uz9//79//Ht+PP9/v7//f31+/f8//f///b0/O39//3///39+/P5//P6 +/fbl7tvSh5FMTEFxRkFaSzhFQjlRR0VHQDlrREFnR0RqRjxlSDtlRDY/PzE2OzI8QzdmTTl7 +Uj90VTl7TztpTTpPPzk/PjBCPjVDPTVaQDdkRTlZRDdcQTdRPjhGQD8+OzVIPTdYSzVgQjtk +QzhcRjtQPTE3NzM2PTVGRTZmSDhpTjZlRztUQTdOPzg2OjA/OjQ3OjBAPDVLQDNTPTdMQTJH +PTY7OTA4NDE4OzVFPTc8PjI0PTM2ODM7ODI8Pi9GOzZNPjVWPDZMPDRKPzk5OS9BPDVJRTJa +QjpMQDVJPDY0OzI9OjQ3OzdiZUW7wojOvJx7YVNDPzg/OjRDPjZXRjtZQzVOQDQ/PDQ1PTFA +PDNTQTZZQzhORDNNPjkyNy09NzY/PTVqRzxdRTllRzxbSDRaQDk5ODJBPDdQRDRbRjdYRTVE +QTc6OjM1NzQ3PC1NQDtYRTZUQTpTQDhEQDg1ODQ3Mzg0OTFGPzhDPTBJOzo+Oi88Ozg0ODA0 +Ojk7PzY5OjZAOTY5PjY6OjU0PDU2OTNHPzdURTpFQjk8Ozc6OTU1OzU8OjlERDVnRkBjRzpp +Rj1pRDlYRDw5OjVEPjtWQTlaQTNURTNSQDNCPTkyOjM/QzQ/RTdHPz5RRTliRz1IPjhCQDNT +SDVoSTpoSz9mSTVdQzpCPjhHQzhWQzZURDpQPzNFPzw7Oy9AQDhLQTo+OjREQjhNRTVmRT1d +RjRTPzs+OzI/OjxOQDhZQTpQRDVPPz1APDY2OTRIPjZPQThRRDVHQTk/ODUxOTQ7PzQ8OTdA +RDQ8RTQ4PS48PjcuPTQ5NT4yPzM4OTctPDA6QTk3OzA4QTk1Oy81RDQyPzA+QDlLSTVeUUNm +V0B9XEt5ZEeZflWbfVuqhWa3km+0j2e9l27KnnvKpnXNqnnUsoPdu4TgvYvjwJDkx4zqy5Ps +05jw16jx2aLx2J/t4bD746776b/03bj12q7z0qP40Kr44KT35LD036ry2qj02qjw1J/y06Xq +yZPsxZLivozlv4Xdr3fYrn/RrXfTrHzSrXDcs4DXrXXSpHTUmWvLmWnNkmK8hmHDkGXKlGS/ +imq+jmS3iFioc0+bcVCZZE9bTEBVRTw8PzhKQzxCRDlKPzo+RzpdSjtfTkN6T0KHYEuJZUps +R0k8PjhIRjtRTkBeVElVUkFQTT1dZUdtblJzblpwbFVubVRybFRsa1RyZ1JnZE9RQj03ODk4 +OjQ6PTg5PjE3OTc0PTYyPDU9PjI0PTE/OzUwPjU5Ojg0PDIzOzM1Pi40OTU3PDM5OzQ6OjY4 +OjYzOzQ2OzY2PTk5OzY0PTQ0PTc2QDQxOzM2PjM6Ojs6QTZAPDtAPzZAOTkyQTQ6Nzc1Oy85 +OjMyOi8+PzQ1PTQ/PTM/QTNGPjc3Nzg7Pjw5QDc8OzM7Qjw6QTU3Qjc8QDo8QjU+Qjs7QDZF +TUSv5Y7+//T///v////////////0/+79//P///j///r7//f8//7+/+////////////77//P1 +//Pw/+vo9eTr+OLp+N/n8+Th9d7k/9vp++Th8dza69n2/Orp8uDq/Pb7//Xz/u37/vv///35 +//L9//79//nv9eLi69jq8+j9/vb7//T5//L2//jq/+f5+vH6/fLz/u/u/u3x9ezu+/D4//D8 +9evbhYpSSkNwSjlaQjpDOzg/PDtKRTtiSD5sRD9iSDhnSEBZRDhPOzUzOzFHQTdoUjuCUjx7 +Tjt6Uj1uRzpJPzVKPDZBPi9JPzdUQTBkPjpVPTZdOTpNPjRLPTo8OzRAOzJcRDdaRDRjQjpe +QztRPzYyNzU8OTdGQDZhST5tSzliRzhdPzVQPDY/OTQ/OjNDOzVBPTFQNzZLOzhRQDpIPDI3 +OTU3OzE+PDc+OzJBPzU3OzQ8OTI0OjA9OTZGOjdOPjpSPTFPQTZJPzA8PDE4OjBRPTpWQjhT +QzlDPjY+Ozc2Ny4+OThZY0LIwI7IuZp/XFc7PjRBOzJHPzJXQTdVQzdOPzY7Ozc5PC0/OjVR +QjVXPzhRPzhDPjY7OjY4ODRJPzteRzdnQzpZSDVjRT1RRTZEOTg7OzJYPjRbRjZZQDhFPDhA +ODc0OzM3PDZKQThXQjtTQjVSPjhFOzQwMzM0Oi89OTdFOzNLOzlFPSxFOTk8OzA5OjYzNy4+ +PDg4Oiw/Pjo9Py47Ozk0ODA/ODlLQTpXQzdMQjo6OzI8OzM6PTY3OThLQzdmRjlpRjZlRzhr +QzpUPzVFOzs/OS9cQzpbQDVeRT1OQTVGOjc1PDE/PDZFRTtHQjVaQzpiRTZPQzY8PDRPQDhn +SDlwRj5sRzpfRTlAOzlIQTtYRDpVQzRVQTtFOzQ6PTY+PTVHOjk+OzNBQkBNQjNgRTlhQThL +QTRBODc4PzFPQzhWRTxcQzpRQzdBPDQ3OzBDOzpTQTRPPjVMQjE6PTc4OTg0PDRFQjg/OzdA +PjE7QDw7PzQ7QDo6PTA0PDI6QDc2OzM1PDc6QDc3OzI2PjgzPTA5OTc2QC9NTDxZVD1uVU13 +XEGAbUuRd1ONZE2ji2G4kW23kmq+l27CnXDJrXjStIDZsYLduozduYfdvYrlxZrmypbszJ7k +06Dz2Knx0ZPz16Py5ar35bf75Lj63ary3q36zK703Knz26Hz16ns0aTmzp/px5jqzpPq0pjj +xo7gtILOr37GmnG9nWW6lmKkgVilg1yumlvMqXHOpGbSpHLImmPNm2/DkmfFlGbLnWXJkGPC +jWG9jV29hF+sfFObZ1FdSj5IRjtJQDg8SDlISTxHSDtaTz5qUj52XEaPak2xeFane1mRVEk0 +PzdYUj9fV0haV09YVEZWT0NeYkpsb1Vua1dmaFVtbVNta1V0a1JoZ0xnYk1PQj05PTQ1PDYw +OzM5Pzk9PDE3PjY2OzA4Ozk8ODU1OzY7PDcuPi45QzY2ODY7PzU1PTQ3PTYzOzNBPzgwOTE4 +PDM2PDQ2QDU5RDM3QDIzNzU5Pjc1PDQ1PDNCOzs9PjdCOzE+PTlEPDk9PTc5PDE+Ozk4QTZC +OjY2OC84PTg4QDVJQDc+RDhAOTw1PTZAOjg5PzdBQDg3QTZAPzk9PTtAPjc8Pj5BQjZGSkiz +4pD4/+3////5//X1+uf9//b///j////9//v4//D///7v/+34/+j1/+vz/+bt/uf0++vj8N7s +9d36/+34/+71/urn8+Xa7NTY7NDS3czV38/S38v0+u/u/evx/PD5//Tw/+nt++Xx/+zv+ebs +++zx/vX9//3////////u/+jt/Ovr//H///v7+fDz/Oz4//P79+zk7drn6t7u9OLt/urs8tzO +gIlLSz1zTD9OQjdQQjxCQDpNQzhkSjxmTD5mPzpsSDxhRTxKOzYvOzJDPjRoTz19WD15UjuA +UkBmSThSPjhCQDVMPzk8Qy5WQTxcQTJcRDpbRjNUPjZGQz1BPDdCPTZZSDllSDphRjtgQztM +PTY3OTQ0PDNHQDhjTDxrTzptSDtaQDhTQD01OzRDPDk6OzJNPDdEOzVQPjtMQjpHPjU4OzQ0 +PS87OTQ6PTI/QTA8QTY8PTc3PDU/NTRCPDJVQDZNPzhRPzZJPDo8OzE/OjdNPzNXRT5RQi9G +Pzs3PDE4PDY3OzNZX0C/woPHuJl7YFc+PjU/PTZBPDRcQz1ZRTVPOTk6OTQ3OTQ9OzVPPzRW +RThRQDxHPTY4OjI6OTVGQTZmSDxlRzljRTVkSTpWQzhBODo/PDBXPzteSDhWQTdEPTM/OTQ0 +NzM/PDZMQTdcRDlSQjdUOzU/Pzw3NzYzPzQ8PDJFOzZKPTVHQDtBOTA3Ojc7OzgzOi9AOTc9 +PDA+OjRDPTFCOzs0PC45OzhEQzRdRj1EQjFBOzszPDU9Ojg5OzRNQjliSDppRzdrRjVmRDtW +RDk/OjlAPzhZQjpcRjRZQztRPzZAOjk0PDE6PzpBRDZMQzxSSzViSD1OQTNHQDlMQzRmRj5p +RjVxTEJbQzJAPDtGPDlYRjdVQjdTRThFOzo6OjVBQjlHOzQ9PjZDPjhMQTNlTDxfQzRUPjs2 +OjBFPjtOQzRjSjxVQzlXQTg9OTc9PjVJPzlORTRRQzpHQDVAOjU4PjM5QTQ9RDVCOjc8Qjg7 +PzU+PzgxPDU4OzsvOzM0PDozQTA7Oz82RDA3Pjw3Oys4Ozg1Oiw1RTdNRkZcSUZnVUZ1YkqF +bU+PdVOXb1CqmF6ximusimCzknTFpG/GqnrUu4PRt5Lfu4bct4zdvIPbv5Djxovmz5ft1p3u +2qTs1p/32Z344K/567344LP316r12qr1zqzt0prrxZnhxZPZvoTHt3a6pXW0qmq5qmupmmKl +m2GfhluffFefe12VeU+Mc1OGZ0mFaEqQbkmcglK2lF/BmWHDnmW8j2K8kWPElmXJj2K+lGK7 +iWGvhVaqdFOMYEVjSUFEQjZEOTlDRDtDRDxZTj2CYkeQakaYbkqrhVvMnHfJlHG0YVtAPTdJ +UUNfYElpY01bXkdcU0hiaUp0bllta1NzbFxsb1Vvb1RqbU1vaFFnXVFNQz43Ozk3PDg1PjM5 +Qjg6QTY4PjU3PDY+PDY8PzI8PjkyOjE7ODo3OzFCPTk1PjJAQTg0QDBBPTc3PDA8OzE8OjY4 +QjU+PjU8PjI6Pzo3PzY7PDQxQDQ6PTY1OTk+QDU+PzdFPzdEPzk4PDA8Pzg5PTJARj48PDM5 +Pz03PC48QTpMRTlBQUA9PTc4PzVAQDg5Qjc9QjkyPjQ8PjY5RTZCRjtDRzpBR0BGR0S65o39 +//j///z///////////////f///z///////z7//b7//j7/vD///j////9//z8//f///z7//fy +/u32/+3w/u7k8+Ll/ODh+dPs/PDe6Njd6Nb7//X0//L8//ft/e34/vHt9eb+/Pz///v79env +7ujj8+T0/u3y++n4/fT7+/Lz9uv5/vD7//b1/+7z/vD///j4//X///79+/T46Ofp8ODfeIlJ +RjxzR0ROQzNOQT9AQDJHQjpjSTpuSTxqQDtlRD1rQDtOPTQ+OTNCRjBuUEF4VTx5UTuBVDxy +SjdTPDJEOjJRPDY6QDVXQTtdQTpjQjVZQjpfQjRKPz1CQDhEPjpXRDpoQztiRTRhPzlKPzI7 +NjY1OSxGPDVhTDRtSjtoRDpiRTRQPjlFODQ9OTY+OTFFOjdPPTBLPTlMQDdEOzVCOjM1OjE8 +OTE9PzNGPjI2Oi89OjU2Oy1CNjNLPTFSPDVPOzFTPTpGOTRANzQ/OzZPQDNYQDpXPzhHOjg9 +NTU5OjA4ODZcXT66uYbHtpl5WlI9PzFDOTVAQDRZQjlVRTJUPTY5ODE9ODI7PDBRQTZVSDZY +QDdFOTVAOTY7PTJGPjNiTT9hRTZlSDhnSThWQTVCOTVDOjVVPzpkSjZcQTlIPTc/Nzo3OzNF +NjtNRDZiQz1VQzZXPj49OzU9PDcyNS1DPDhMPzRLPTdIOjNEOjg9PjU6OTM7MzM+ODk+ODQ/ +OTo/OjA9ODk2Ni8/OTpLQDFdSj9HQDE/OT4zPS89ODg5Oy5HPTpgRjZlQjhuRDpqQzxVPThA +OTZGPTZYQzlgRzleQzlXPTlGOjk3NzJAOzhBQTNJQDlYQzpoSEBMPTJHPzZMQzVrRzxnRzVy +SDpbQTVEOzlFPjpYQjhZQzdWQzdLPTs3OTREQEBGPzY+ODc9PjlKRjdkSD1kRjdQPDo9PTBE +PTxPQDZgRDtYQjZXQD9EPTc5PjVEPDNWRThWPjdIPjNBODs5PDQ+PDFDPzRLQT5ESDFCQD03 +PjI2ODw9Ozg1OTg9PS82Pjk9PTY5RTlDRDk8PTw+OzY0Ozg8QTlMSz1cSD5nWUhwXkaEbE2M +b02Zelmbg1qSdlOXe1aniGaynnbFsHrNtHbNsH7EqHHRr4XLr3TMqn/SuoHcwYzmz5nrz5Tt +0ZDxzJ7p0J3+3Lf44LT21qPs2qjsv57eyofVrnyxkWKjfGCCaU16W09oWkRqVkptWUV2YUaD +Zkp9YUZ7ZUt0WUaJZEiRa06Obk6WaEuUa0uSak6bc1GphVq9jmXAjmLDm2fGjmPBkma+jWOp +elSkdVaJX0RlSUZNPzdIRD5IST5TSjuCXkGgc07JiGG8fFqzj1vMp225gWOZZ1FHPz1NTT5l +YUpjXkpbWkVpYE1ncVF3cVRya1hzblNsalJ0alRsblN0bVVoXk5LQD81PTc4NjFBOzY+PzlA +Ozc4OzM9PTI7PTc8PzY9Ojk4OzU3PDc5PTNAOTk7OS44PjdCPjFDQDtBQDZAPjs4OzM9OjU/ +PTc6PDg4OTc0PTQ4Njc4ODg9Nzo1OTY/OThBPjJKPzlFPDw7OTg8PDM/OTZBPDw/PTo5Nzo2 +QDhBPTZHQjxGQTo9PDk9OzY+Pzk/OzZAQTo8OTRBQDw+QjhISDw8PztCRj9CSD7C7pb4//P0 +9+r3/+X///r///T///v1//T0/uj2/+7+//T2//Dz+uD///v0+/D2/+3+///x++31++jy++z2 ++Ovm79/n8eDc8djb7c3m8eHj79Xk7tzy/+3z/+73/u/4//T6//P9//v0++/2/vL4//z////7 +/+vt8+T+/vz///z///////Pv/+fv/evt9+js/PD5/+z4//Dt7+f1/+7///r///fXd31RST5w +R0BWRjxGRThGOjhDQzRrSD1qSztoRz1iRDRpPz1NQjA/PDY+Qy1tVEB1UjN9VT99UUB1RjdX +QTtGQDhJPDNCQDNVSDdfRDhcQjdfRThTQjhIRDY6PDFKPjFZRjRmST1iSDVlRTVLPzNBOTEu +PDJGQTVfSzZuSzhqRjlfRThNPzY/OzJBOjU+OjBJOTRMPzNQPTVKOzJGOy88Ojc5OTE2PThB +QDJDQztAQDBBPTk/OTE/OjVHPS9VPDtVQDRSRDdMOzc7PTc8QDNLQDVYRDlNQTJJQjczOy8z +OzIzOzNTXT21uX3It5t3XlI9PTY+OTNDPTJYQzhdQThNQDY7QjU2PS07PjVLQjlWQjZMRDRK +Pzk4OTE6OjVHQTJkTDxeRzplRDViSTZaPjI+PjJJRTZXQzdnSjdYQThHPjU7PDg3OC04QDpN +QzZYQzdWPzZQQDVGQTo2OC05ODU2QS5OPj1KPzROQDlAQDNAPTcyPjE/NDk1PTFBNTU7OjBD +QTo2OzI2OzE5OS9DQjpTSDNKPDY+OzQ5PTA7NzE/Pj1IRDdiRThlSTduRjxoRTdVQTVCPytM +PjxZRjFjRT9cRjBYQDs7OzQ4PTw8QTBFQjpLRDhfTD1pRD1NQTNBOjBQRDppRzttSDhoRzhb +QzVCOTZFQDdSQjNdQz9PPzVLPjs0ODBKRTdDQDo+PDU6OjlMQTlfSDliRDRPQDU/PjZBODZS +QzdgQjlaRDlQPzg7PDQzOzVDRDVXSThUQj5JQDQ+Ozo1QS8/PTc9QyxFQzxBQDFBPj88QDE3 +PjM7PzgyPjU7OTg0RDA2QzU9QDNAPzg0PjQvNjo3Qyw2QzlPSTliT0FpVEVuZUuIaEuGb1B+ +YkVuWUdxWkl6aEuMdU+Ke12DdFGMfFiAaE18Zk59c0+KfValjmW8oXDKu3rbxIrdw4XlxIvs +zIboypXx25jz3azs0pftw5ThsInTonSvgWGpdFWTa1F1VEZrTz5tUUBiVkF0XEl0WUdsU0Nl +WUaKX02NakyWaVmSak+Ra1SRbk2cdFmlflOhdVWaeFCziVqzh1fBl2DFk2DClGC6iliyhlav +gFSWYUdiUD1RRz5JRTliT0CHYkK8hl7PnmjXonXTmGa4hmDGomrKk3qwZ1hQQD9LUz5hYk1k +Zk1pZktzalJxcFN0bFlubVhwcVd0blhvbVJ0blBybU9oXU9IQzs9NzMwQDJAOzc5QDRJPTk0 +QDQ8PTUyPDBCOjM2OjM0PzM3OjM8PDM5Pjc6Ozk3PDk1PC9BQDZAQjNBPzo7QTk4PTNCPTg9 +PjU3PjE1OTE5PDgyPCw3Qzk6PDI/OjtBQTJMQDpFQT02PTY0QjU4PjI+Pjc4OzM7PDQ2OjRB +QjZJQjlEQzs7PzY4OTI7PjQ9PzI9Qjo/QTg/P0M8QDg/QTxBQztGQz5IUUjE8ZT5/+v+//b/ +///7//P6/+7///n///////z///r////9//H9//b8//j2/ef3+e7w7uX0/On6//L3/+33//fv ++OT19+7y/PDq+tvp8+Dn+N3m9ODm9unr9+rr/uv4/evs/On+//z///vx/eHq/+fr/vX///bt +9efw/u/8//L0//L+//j+/Pr4/vT5//Py9+jo/ej+//bu8uT8//v3+ezt8uTWc3ZSSkVtTDdX +RUBIPjNEQTtEQjdhSTtwRj9hSTVnSD9kRjhSPzo6OTRCQzhuUzp3UUF2VD53WD95TDpJPzZK +QDk7PTFFPDZPRDVlRDVYRDVeQTdRQzdFQTU+ODU/PDNdQz5hRz1jQztbQjJOPTQyOS0yNjE3 +QjZaSDpoSjhmRzVcRjZLQDQ8OjU6OTE3PDRCPTNJQzZSQTRDPDVDPDA5PTI6OTU4PDE/PDU4 +Py8/PDU4PTM9OTQzPzFEOjVTQjZWPjVMPTNGPjg+NTY/OThLPTZWRTdXQjhDQjc4OzEuPDE3 +PDFJVjuts3rKtpV4VUxFOjg3OjBEPzVTRTRdRDxLPjlBNzU3OjQ7OjNGRzdaQjxPQTdKPDY+ +RDU4ODJGRDxbSDNhPzpiRjZqSDhaQThBPjRGOzhbRDhmRD5VQzdHPDg3PDE3Nzc5Pi5VQzlT +SjdZQz1PQThJPDwuODM1ODQ6PDFKPzhNOzlNPjJFPjc6PjE0OTE2Ojc3NzE6OzM+PDU/Pjg1 +OzY1OTg0OjJIPTpSRzVKQz41PDI6ODU7Oy0+OjtIRDRcRD9pRzpqSjpqRD1TQDpCPTk+QDRY +RjxeRDZdQTVZQTo9Ojg2OTM3PTBCQjtAQjRjSj1jRzxQQDZBPTJTQDldRzpwRDxpRztXQjVB +PDVAQzVSQjxWQzdSPzhDOzc7OjhERjtLQDY/PDc8OzFJQzteRDtaRTtLPTFBPDs8PTFPSUNd +QzJcST9JQTY9Pjw7OzRBRThVRjlTQDFJPzc5PS07PTY1PjA+Ozo/QDVEQDs+Qjc3ODg9PTc1 +QDs4PTQxODQ0PzYvOzU7PTUwQTw5PTczPTg3QS84RzlMUD5hUEtgTT5xWkZvYUdtXkJYTD1f +TUFeTj5xU0hhVzxkT0dbUD9ZS0ZZUEJkVk5wWz51ZE+DbVGhg128onbUsHzcvYfis4viwo3k +xZHizI/jwY/gw4/mv5XRrILGnXKziGKpc2STZEh9XE11YUd0VEVtTkiAY0qIYUyVZ1Ste2K9 +lHbKo4XKp4LOnHvElmjDjHC8kmq/km3AlnC7lmu7hmC3lF3Bjmu3k17Ekmm5h1i2gVqwfVGo +bVaQX0V5V0Z9WUOcd0+1nWLfxI/qu4/esX7eoHS7g1fIrHPXmoC6Z2hORT1BSzxdXUdrblN0 +cFhqb1R5b1poclR6bVhrbFNybVdub1ZwalFuZ09oYk1DQD4uOjM2OzQzQDI8PjU6QDM4QTQw +OzI+QDM/PDU7PTA3PTozPTI9Pjo9PTM+PTs1PDE5PjpEPS9DQDg5PDY1QDI9OjYzPzQ/PDU0 +PjM2ODUvPTQ0PjUyPTE2PzU5PDc+PDZKQjtCPDo3PDc7OjQ6PDk9Pzk/OjUxOjA7OzU+QjdH +QDlCQT08PzU7PTk7RTVAPzk2OjU+Pzk1PTZEQzw+RzlEPUE6RDlHSkTE8pj9//j///v///7/ +//X8//T5//T6/+37//X///b1/+r4/+/z/en3/uf7//D7//L6//X///nw++zx/Ozn+eTt+ebo ++Obm+eXX9dLk79zc7tXd69b5//Pw++78/vzx9+fq9Ojq9ubp99rj9uT7/fL4+fD3/fH+//v/ +///x9e7z+/D5/u37//j///L2/PX5/+74/Pb1/fP68vTn69/1+O7z8ObPbXJRSEFsQ0BYPTtL +PTxFOT9FQzlfST11Rj5jQzpmQzxlQjlXQDo7OzJCPjpqSzuCU0N3UTyBUkN4TDpWPz1EOjVM +Oz1EODdVPTxgPjheQztjRDpbRDhKPTs/NTVEOTVePTlkRztmRTdePDhUOzc0NjQ4Ojc7PTVf +RD5nSzl2RD1gPjpTPjo7OjM/OTU7PTVEPjZNPjlKOjhNPjw+PDU/Nzg1OjY5OjJEPDY+PTU4 +PDU7OTE9OTY5NjJINzhRPTFaOjlMPS9IODs5NzE/OTpNPzNUQztVPjlEOzlANTUzOjI8NDlO +VDiysXXHs4p6U1JAPTRCNjdFPThbQTpaQThSOjQ9Ozg8Njc8OzhIPTpXPTtURTpKOjg6NzY5 +OC9DPDdfSjhlQEBoSTZpRzpUQTdFPDVBPjRYQzVkSTxcQzlCNjZBOTk2Oz0+NzNPPz5gQjxU +QTtUPjhIOT85NzM6ODg7OjZPOjRPPjxKPjFFNzs7PTc6Nzs2OTQ/Mj48NzZGOTw8OjE3ODgw +Ny4+NztAPjRVPDlEOzRBOz05OjQ6PDg4OjZEOjlePz1lQzpvSD5qRTxUQDtIOjpEPTdXQz5d +PTdfQTlWPDFEOTs1OTA9Oz0+PjBLPTleSTZoQkFRPjVHPT1LQDhiQThrRDlqRTxcPTo+OzQ/ +PDVTQTlSPDZXQDtGPDY4NzhBQjZHPTs3PDM9ODo+OTRYQjhXOzlTQT07OTVCOjxRQz9fQTpX +RjxRPjtCNjw5OjRIPTxXPzpWQjhLPTlAODc3OzMxPjFCNTtCOjRGPzxAQTBAOkM2OzI+OT82 +Ny44OT41OTQ5Ozo7PTc4QTw2Pjk0Ozc9QDc6RDdQTUNiUUBiTkFiUz1TRUdVRjxZT0dgTkZX +TUFjT0BSTUZfTkVVRUJRRjxGSUBiTENiVExyXEx+b1Wbf16mj2vApXjbuYrUsnrZt33izJHu +yJrixInnw5Tju4nbpH/An3DJmnG+jmjEk3K1fWOxfmK3gmK6kWvGnXPNpnnXtYzYp4PRp4TT +qILSroDYtIbUr4PRpHzNpHnTpn7HonPGnW7Cl2vLlG+yh1/Bkme/j2DDiWa3h17BhVqze1SV +cVGMZkegelG1jmG4gmLRq3DjwY3rv43nr4fOkWrCoW/UqYDEe3NGPj5IS0JpZkptZlNpb1Jx +cV51b1Zxbl1vbVlwb1hya1VualhvaVZraVJpW05HPz48Nzk8OzMyOzc8QDk8PTc6OTs3OTZD +Pjk6QDQ9ODs0PTk9OTo0PjZHOzg6PTo7OjQ7PDk/QjhIOz07Ozc6Njg5PDZBPDc6PjY6NzUz +OTQ6ODcyPjY3OjU7Ozo8QTBGOz1MPThCPT45OTJAODw8PzQ+Oj06OTg0NzM6OTk+QDhIQT5C +QDo8PDo9PDw8Qj43Ozg9PDw1QzY8PTs6PEBBPjtBQD8+QD9OTUjB6ZXz/+r9//by/vD+//T/ +///////////////9//T+//n9//j6/+v////9/fnw9er3++/t+uX9//P2/fH0/+r0//Hx9u3d +69/a6c7j7dvm8uDb4tj7++fs/ez0+Ozz/fLx/fz////7+e/6/vT///71//P8//b4/+7p+eD8 +/vv5//H+//r7//X///z////////5//P7//P4/+/9//fx++zr69zKb3JXRz1wSENXQjlLQTlN +PTlEQTdmST9yRT1qRTxpSjpuSD1XPThCPDk+QjRtUUB6VDqCTkB/VT94S0JVQjtCOjVFPjZH +OzlSPjZZQTleQTdiQT5YQjRNODg+PjhHOThfQTxjSjthRzZlRz1IPTM8NzkwOTFGPDlVRzlv +ST5nRTdiRDxNPDREOTc6NzM/OTZLOzdNPTZSPDlKOjRHPDM7NTM0NTI9PDY8OzVBPDI3OjA/ +Ojk9ODJBOTI4OjFXPTdMOzNVOThDOTRDOTg5OTdTQDpXPjhTPjdGOTY7PTM7Mzg3OTRRUDy1 +s3nHtJR6V08+PTQ9PjZCPDNVQjxeQjVVPT0/NzQ+NDs7OTFLQDpbPTRTPjpEPDQ8PDk8NDBB +PzZeRjdZQjRqQDxmRjpQQzk+OzRGODhZQzpqRTlYQzdIOzU9ODo2OTBFNTdUPTdfQDxVQDxU +RDhCPDY6OjctNTM+OTRIOzdKPzZPPTpCPDU+Ojg4ODQ8OTQ4Ny1CNzU+OzREOjQ4NjU9NjY6 +OTpCPDNSPztLPDQ6Nzg/PTY4Ojo8OTNBPzZfQDxmSTpwRDxoRzxZOjg9OzRAPDJSQzVdQD1c +QjJaQTg8PTA4ODg3PDNFPDpDQDRgRz1kRj5TPjtLPDNTPTtmPjlpSTlsQjhYQTU+PzJCPTlN +QTVaPDhTQDhPOjo2OTBEQDs/ODQ9NTY0PCtFPTxRQTRWQT5NPS9FOjw9OjRVQTxZQjtXQTRK +OzdAPjQxOTFIQjZYQjlWPjdFPDc8PzMzOTE5QTc+QjJMPzpHPDBGOTk1PDA3OTs2NzQ+Ozw2 +OzBAOzgzPjc2Ojg9QDg7Pjg1PDlAQDg/Pz9MTT5gVEZcSz9TSkFOST9MRz1fTERlVEaBY1eB +aFGNa1mEWkx6TU5pTkBoS0dpUz5rUkVuV0d9bVmae12tk2a2nmvHqXLQpG3Tr3jXu37iu4rk +tYnjtX3dqHPdpXfXn33QomzLoHrIjWW4kmLMn2zDm3LJoW2+oHG+pG/GpHLDp27NrXvKpnXJ +pnHCmWbKnmrNn3HQoHTPp3DRtXvYsX/VpHvIm2fDl2u9jV7FkGW+j2LAj120iVyvfU6idlOT +aEanflbCmXHTq37luIvsyprzzajsxJ3epYS/nWbVoHa0Z11EPzpETj1nY05sZUttcFZ1cVp1 +bFdxcFZ1cFlzblpycFhwa1hvbFNubVJpWUtIQDs6OTYzPDI8Nzg8PDNDODgwOTM/PDc2OzJD +OjkwOzM3OjY3NzU8OTlCOzM6ODo3PTQ7PTVIQD1IPTc7PTU0PzM8PDVBOjg8OzM6OzcxNjU+ +Ojg1PDQ7PDc0OjNAPDU+PDRTPDs6PTA9OTk1ODdDNzo0PDhBPTgzODY2OTQ/QThHQj1HQDo/ +OjVBOzY+Ozc+OzY+Pzg6PjQ/QDk8QDhEQTs8STNGQUNFTTrW9aP///////////j///v9//X9 +//f///7///3////////////z/uv2/+f9//T///f////7//n3//Hw+u/l8uHs9OHy/+zr/eje +9Nbq9ufh59ng7Nb7/u3w8+nq8t3c8eP0+evt/ev5/e79//H9//T9//z///P5+fDv+Ojz9OXu ++Of1/+3t/ej1/vH4//Tq9+Pr+eTr9+ju+OT0/O7x/+Hz7uHGcGxUSkFxRj5aRjlLRTpMRDZE +RDdfTD9yTUFrRzhnSzpuST5WPjtBOTdHQzdtSjx7VjqCVkB+VD1+Tj5dQjJIPTtFPDZHPjZM +RTVhQjxjRTpeQjZcQzdTRTlCODVHPjVdRTpmRDhgRDdkRDdSPDM5NDouOTBAOTVUSzVsTDxp +QzVjRjdIQTFEPDc9OS4+PDZIODJMPTJUQDlJQTZDNTY3OjM4ODI8OzM+QDM+PjQ8QDE+PTI5 +OjA+ODc9PTJWPzdORC9XPzk7PTNDOjY4OTBSQjdTQjRUQjZEPzJBPTY6NzMzOzBKWDmusHjK +tZh3WFJBPjQ+OTNFPzFUPzdlQzNXPzdDPiw9Ozk2OitMPj5aQzVXRTxJQjA6OTk8OS9BRDJk +SDpfSThnTTplRTlTRDQ6PzRLOzZfRjlpSj5ZQDhHOzg7PzY2NzJCPTZUQThhSjtaRDRYQDtJ +QTY4NzY2Ojc7Oy9JPThPQDVJPztHPjY+PDU3PC4+ODU5PjE9OzI/QTNGQDQ2Ozc6PjQ8OzdC +QjRXSTtMPjU9PTY/PjFAOzg9OzZDOztdQDZnRzlwSDpqRzpVQDdDQDJAOTdMQTFgRTpbRThZ +PTw/PzI5PTE4PzNDPThEQjVlSD1rSTpWQTtJPzRPPjVjQjNpRThvRj1YQzZCPTJCPDRQQDVa +PDtXRDVNOzo4OzI/Pzw/PDQ8ODc9QDdGPjpIQTJXQT9NPi9HOTs9PzZWPzxcRDRcRj9JPDg9 +Piw2PjNDQTNVPzVVRjZJPjM+Ozg1Oy48QjtDPjRMQTlFQTFGQDs2QjM7PDcwPi07QTc1PjE+ +Rjk8PDM4ODE3QTc3PTo7QTc3RDg1QDhMSztXU0dYSDpLSEBjTkRmWkOBZlKMdF6niG6ri2u0 +l3u3n3LAnXe8m2+/mHy6kWyte2qgaVaMdFyUdVOZfFihiV+tkWC6mWfFomfatovow5LqwJPk +uH3krX7dr3zOq3XLnWTClWzDlWy+lm/Cj2euimGyeViVeVGdb0+YeFeiemimfWWle1ylfVik +f1asiVq2lV/DoG3KqXLRrXrRuHfSqnrUqHK/i2bFmWTCh16/lFvHil+2gFWueFGWb02SaEmw +iVrdunzgwY7rxZDry5fuzZ3u0Z3pvprLlGzXon6qZltFPz09RTdVWEZqbk90cFNycVV0b1l4 +c1d4cFhvbFR1a1Z0bFlkcFVvbVdqXFBEQjs4PDYzPDE9QDg+QjRGPDo7PjQ+PTY4QjNGPjg7 +QTM6ODU1PzBDPTk9QDFBPDc1QDU5OjY+RTtGQzg8Pzk6Pjk9PzU5PTY9PDM4OzYwPjM4PDUz +OzQ7PDY2OzE/QDZEPTJSPTo8PzM/OD4xQDJHQDk7QTY8PjU2PTI8QDRDPTZCQjRBRTU/PDc9 +QDk5QDpDQTQ8QTw+PTY6PzpAQDJCRzpBRDxFQ0NMTz3J+KDy/+b6/uz///n///////v///v7 +/+////////////b2//P8/+z8//vz/+z6/+31+ezz++n1/+n4//P9//ft9Ozh79jd59jc8c/e +7Nfg8Nfc7NX6//3///7x/ev+//7////////79+3j9ubs/Ojy+e3x+uv9/fv///3x//X6++/p +9uDs8uz3/PPs8Or4+vr+/vv///vo7Or9//ru6eTp7+HIbm9PTEZtSj9fQz1RQTZEPzlCQDlf +RD1uSkJnSUFnRUJsPzdYPDpAOTdBQTVsTDl7UD2BVUJ+WEJ7TT1UQTdKPD1EPThCOz1JQTZj +QD9gPzhoRD5YRDlVQT1DOztJPDtgRztjTD5kSDtbRzZJPjY0PDQ1ODY/PDRMSThvTz9oSDhg +QDpJPzZCOjczNy5APjZAPDFQPjxGPTFMODk9OTI9PDU0OTA4PTJAPjk9Pzo0ODY4ODg9OzQ9 +ODY8PTFKPTVVNjlQPDtCPDU9Nzk4PzVQQj1PRThUPzk+OTVGPDctPzM5PDVCUTatrnLEspF2 +Vk87PTc4Ozg9PDROQjRiRDpSQThGQDY1ODY4PTRIQjpZRTdVQD1GPTI9PDw7Oi4/Pj5ZRTNi +Sz5qSzlnRj9PQTk+OThGPTJjSDlnRT9VRDtIPDY2QDc6ODU8PDpTQjlcRjtbQzlVRDdFPTs3 +Ozk1ODE8PDJHQzRNQzpKPjdEPzg7OzQ8Pjc7Ojg7PTM6OzQ3QDJAPjY3PTc3PDgzPDE/QjdO +RDtIPjs2PTg2PjMxPTE6PzQ9QjVVQDRnSD1vTDpmQz5RQDdDPTk8PDJHQzhZQjhZRTxSQTs8 +PjY6Nzk4OzVBQDhEQzhhSz5kRzdVQTxIQDROQDhdRjVtRT5rRThXQzk9PDU7PDNLPzlXPzpX +QTVAPTQ6OTk3PDQ5OC42ODU2QDI8PDZMPjVURTVIQjFCOjk8PzBTQz1ZSjZWQEFEPjM/Ojc1 +PC1DPThZQjNTOz5HPzo5PjE1Ojg1PzM+PjdIPjtDPjU7QDozPDk5PzYyRDc4PjkyOjU6Pzcz +NzA2ODwvOzE3PDkoOjRBOz0zPzNVTT9eUUNYRz9VUUhnZEl6alSLeleSfGKlh2umimmyl2mz +mHW6lmq5k2+0k223mXG8kmq0kWOlgGeccVqLb1l/a0+UeVugilS4omzYs3/h0JXmyI/mvoLh +sXzaoXXKmW3Aj2GvhWavkWC6jWmsblWLZk+XcVN3ZE96aUhvblB2d1Bwb017a0uMelWrjVyr +e16igFSolGG8pXDMpXLUrHjMpnDNnmvKmmu4jlu1ilu4k2C+jGe4gVioc1GXbE2ScUu1l2nk +xYrrxprux5vrxZnsy5vqz53lv5bEjmnNpHecXV5HQEA8Qz1QW0JlbU9zc1pxclV4cFpuclhz +cFhpcFJtcVhub1Vra1ZnbU9mVktEQj4zPjg8QDY0PDU7QTU7PDc2PzU3PjU9PjRDPzowQjM1 +PDcwPzE+Ozg4QjU+Pjk5PDU9OTU5QjNEPD02Pzg2Ozg0PTE/PDg3PTczPDY1PDk1OzUwPTI1 +PDUyOzQ6PTVCPTVNPzk5OzQ6QTkyPDQ9QDozPjQ+OTsvOy86PDozQDRLPjw7QTlGP0A0PjY/ +PDw/Pzg2QjU4Qzs3Ozk8RDpDSDxCQD5CSj5MUEPV/535/+7+//X////+///1//L+//z////9 +///+//j////9///9//P///r3//n4//H2+/L9//js+/Dy/+nq/+jr/+Hx/+zm++re79Lr9uLi ++N7e8Nrn+d7x+fL9//vp9ebq+ej0+uzs/On++vX59/Pp8uz9/vTx/+71//L6//v///7///n8 +/vL5//X8//n0//Xz/e77//by8OL4/uz4/+359OrQb25YRUNyRjliSD1NQDpKQTZEPzheRUB1 +SUFpRjlvRj5jSDhWQDg+ODVBPzdkUT16Uz2HVj+DVUN/SzpYRjJKQDhEOzVJOzlJQDdhQDdb +QDlrSTtgQjdWRDlDQTdHPDRhRDtkSDlrRD5aRjJUOzg3NzI5ODE8ODFTRDdpTDprTTphQzlK +PjFFPTI8Oi1COTVCPDBOPjhXQjdMPzpFOjc1PDQ4NzQ3PjVEPjc6QDU6PDY1OjM+ODk4OzQ5 +PDZOQTVTQDVLQTNJOzc+NzI8PDRIPjtXQTpLQTZJPzVEOTQ4PTc2OjVBTDioqW3CsY94VktB +OTc3PTFFNjRUPjFoRzlXQTVKNzo4PTJCOzRIPjheRTdUQDZLODY9OzJAODVBPjVfRTZmQjls +TT1qPzxSRDc8PTJMPDtgRDhqRT5UPzVMNzc4OjA6Njk6OTZZOzxYQzpaQDhSRjdUPTsxNjU5 +PDQ6OTNRPzxOQDVFQTVCOjc9Ojg2OjE3OzM/OjM6OzY6ODM/OTM7Oi88Ozg0NzBIPjtUQThJ +PkA2OzE9Ojc6OjBDPT5DOi9YQzpmRjVySz1oQjdNQDVEPjU7ODNLODpZQTldQzdVPjRAOTQ7 +ODQ6OzVHOzxFQzdnTEBjRzRZPzhJOzFTPzlfRDJyRT1uRTxcRjpBOjZAPTNMPzlTQjhWRDlD +OTA6OTM4PTc8PDg5OjY5PTQ7PDhDPTRVQDVSOzZGPjhBPC5XRz1dRjdbQz5JPzM7PDU6OjVG +QDVfQjZYQzpNPzs9Oi02PDY0OjFFPjtMQjdIQDc+QTc7Ozk4PTA2Ozg9ODk3PTg/OTc1OjQ5 +PzU2Qjg0OzMqQjs+PDE7QTROUUJrXktiTT5mVEVmYEaEbFWLdFeXclqVf1qjfVyVflmYgWGP +gFSOeVuQfVeSdFmKcU2OdFeTfFiggGGOaFaIYDx/ZkiQdVqtkGDVtoLlxYzpxpPiv4Xcp3LI +l2zJkmWvglmuf1argFKpc1qXaE6fbFKLZUxtSkZXTT5gTUNsSEdjSkVPR0NaUEFgW0VuX0CP +Z0ydcUywiF/DiWfFl2fSlm/Lj2PIi2e5g1u8imKth1G/hVuze0uta1OXaUaPb020mV3mvIH3 +3Kf416vxz6PlwpDrwY/lvY7IkW3Ml22QWFJTTjlJSD1PWURrb1N+clhvb1d0b1lwclV5bFlq +bVd2bVtwbFNvbVFuaVVkWkpDPDk0OjU2OzM1OjNEPDg/PTg8OzM2PjFAPzg9OzY9OTk2NzQ2 +PDg9Pjg9PDE8PTk7PzE9PDlFQjZFPj86NzY2PDlBOzg9PTY7OTQ6PTg4NjczPDU6OjY1PjI4 +OzY7PjRHOjpIPTY9PDQ1PDc8NjQ6PTg7OzM5PDQyNzQ9PTw9OjREODQ7PTs4QDQ5PjU6PTQ/ +PTMzPjZDSEE6PzdDPTpAPzhDPTo/QDpMTkDH4pL6//H9//n8/+79/+////z////////7//P+ +//j7//v4//f4/u32/+r+//P////+//v4//H0/+f9//vs8+vr8Nzr+OXl9eHg+9by+e3Y4tDZ +58z///r1/+zx/Ovz/vvx/+vp+uP2/vj+/+z5//3////7//308en1/vv///fq/+7+//P7//Pr +9uft9eXu9uv0+/Dy9+j48u3z/uf3++zl8NvAZG1RSj57R0BZRjpMPEFGRTZFPzxbSDxzSz5s +Rz1vST1oTDxYQTc9QT1ERDlmUDl8V0OFVkWCWkF2UTtmRDlKPDZLPjo4OjRPQD1dQTZiRTlf +RTJiQTpQQDdEPDVJQDliRjxoSTljQzpkQjZNPjcxODEzOzU2OTBRQjxrSztpRzpcQjZPPDo9 +OzJBOzM7OzRHOzhKRjhYQDpIPDRDPTk1OzA4PDc0PTE/PjpAPzs3PjQzPDM7OTM8PjY/OTFK +PjRVQDZNPjlJPTo8PDM7OTVAPDNWQztNPzZOQzo5Oi5APzQuOjZNSzqgpmXGsZR0VUxAPzg7 +PDVAOjBQPzdjRzZjRTtFPDQ5NzIxPDVGPjNZRDVXQjNIOjU7NzI9Ojg8PTBaRj1fRzJsSUBf +RTJMRTo/ODRKQTtjRjtkRDlZRjZEPTM9OzQ0Ny9APzlSPzZaRDdaQztXQjdGPjYyOzM0OTJA +QTZPPjxLQzpKNzE9PDU+PTc3PDI8OTU5NzVAOzY9PDg/PzFAPDo0QjQ5OTRCOzRRQjtGPjpB +QTY3PjU8PDQ6OzM/PjdSRDpqRDdvSTxnRTlQPjtBOjQ9OTVIPzVXQz5hRTdWQzxCNzk1OTM9 +Pzc9PTRIQz1jSjhqST9QQjdNPjRMPzliRUFsSzlxSEBTRThIOzU9PTZJPjZaQDdXRDhFOTc7 +PDs+PDc4OzQ3PjY9Ojo6PjRIPzhNPzZPRDY8PzBBQD5ORzFfQz1PRThOQjw6Oy06OTk9QS9X +Rz1ZSzROPj85PTA4PTs2Pjg9RDRHQTtEPzU+RDQ9PDwyPzk9Njo2Pzc5QTgwPTE/PkA4Pzg9 +QDo0QTA8OzorNy8/SDtMT0JwZktrYUZ0ZlB9Y0+EZ06LZVmMZ0+BYEd2Yk57Y1FtW0hiWU1V +UERRTEJYUEpcYUuBd1qDa0mBXUp9YU2DXk51Vz9zbEyhilvNrnnoyZDyz5rrs3rVp3XMkGnJ +kGq8fVm5flu7c2GuelSiaE6NXUGumHemb2FpZ0llVkJgVUd3Zk1wW0qOXkaaZlGnelbGl2vX +qnbWqXXUom3Vk27RpW7ZqXHXqHDOnmbAjmC5h164hVezeFWedEyXaUuPdEi1l2HhwH3x0Y34 +467qxp7jtoHesoHjt4rNoW7Sl3l+Uk1VVURXTEJdY0VpbFJzcVZ5cFpvclN0cFRvcVhxb1lq +bVVwbFNsbFZsa1NdWklBPj8xODMwOzQ0PDI/PDZAQjovPDY7PTQ/Pjk/PDQ4Ozg6PDM8PTk1 +PTdBPjw1PDU6Ozc1QTRHPzo9QDM8OjwzOThAPDU6PzA/NjYzPDY0PDovPDY2Pzc3Pjg7ODk7 +PThFRDVDQz05PDU8OzE3PDc5PjU+PDk3OzQ5OTgzPzNEPzhBQDNEP0E2PDg+PTk5QTZEPDgz +OjQ7PDs5Qjg/QzlAQzxASDw+Qz9OUD/i95/+//z///////3///z///////////////v7//rs ++eLy/ezx++D6//L+//r2//fy/eby/+/1/O7t9Ofs+ODx/+zt9OfV5tjR5cfX5tDj69nn7eP0 ++uvx/Pr79+vq9/H5+fP1/u/++fTt7+Tx++jt/e3+//L5//L0/+z5//P2//H3//T6//b///7/ +///////7++3p+uPz9vT5//P///L+//jXbXZGSzh8UENZSTdVPztFQTNFPzpeRzpxTURwTDxt +RztzSTtdQztLODlCPzdoTT6EWDqLWj+BWUCBUj9jRDhFQThSQDhCPDJQQjlURzllRz1hSDhg +RDZMQTlFPjhHPTlkRzhlSTxnSDVnQzlURDE7ODY0OzI+OjNURTNuTDxrSj9fPDtMQDRDOzRA +OjRBNS5JOjZSPzRWPztNQDFCODU+PDI4Ojc9QDNAPjVBPzk2PDU7OzQ6Pi09PTQ6PjNOPjlR +QDRSQzhNPDhGPDU7OzFGOzZOQztPQzhLQThFOzU3OjI8PzRHSDegpWzGs4x9WVBDPTM/OzY9 +QTBXPzZlSDZnRT1IPTI7OzU0OzBOPzdYQTZaQTZIOzZEOzk5MzVFPjdcRj1mSTltTDtkRjhR +PzpAPDVJPTdkSjtqRzleRDlQQjVBOjkvOS8/OzdSQjdfQjtaRjVeQzlGQzU7NjgtOS5DNzpM +QztURDhIQTFIOjU7OTQ2PDM5OTI8PTc8OTM+OjlBPDRBQDY5PjE4ODc9PjNZQTlIQDlCOzs7 +PjU/Ojk8QChDPjhRPzJoR0FzTDhnQj9PPjZCPTNBPDlKQDZcQTpgQzdYQjU+OTI6OjI4PTQ7 +PDtHQThiSUFrSUBWQjZQQTxNQjViSDhpRzh0SjxUSDJJPDc1PDZLPzlWSDZXRThIPjY/PTM+ +PTc7Ojc8PDc4OzM+PDhFQTVRQDlOPzk+PzNAOTJYRTRjQzlTQTRKQzs9PTY3OTQ9PjBWQj1W +RTRLQTtBOzk7Pzg8PDRBPzlOQjdFRTJEPjs1PzI3PT83PzE5PTc4Pjc0Ozg+Pjc2QDlAQDow +PTc+PDcwPzc+RjhRTj1sZUaCd1WLc1aXfVmXdFqXeV2JaEl6XktrV0NaSkJLRTtoUkRXVzxZ +TEKjdG9iYU5lZUuValmGZ0KbflGkbU+SWkqBXEaWhVTIqHbmzYjt0Zjpun7Tp2zQmmrGj2HX +pm7buoDTjm26dmGpaUydbk2sfGKXc1aWZVKniGKxeG+sfGCzgVvMo3rTpX3arX7SsHbMqG/a +s3ngvH3hunzasHPbqHDWqG3JlmK/k2O9j2G1hVascVWabUiOaEmSc0vFoGjnwnzrv4HuyIjl +soHZp3XcqXXQmnDTpXTNh3BnUUdWSkVOSkBlYUpqb1N1blx1cldsbVd4bFFvbFFxbVZsblJ0 +b1dpb1Fva1dZWEhNQjczPDE0QDA3PDRBPjM/Pjg6PDI6PTc5QDM/OzY3PDU0PDg1PzQ9PzQ7 +QjU7OTU6OzI5Py9GPzo/ODQ5PTg5QDM8OzdBOzE7QDYzOzM0PTM2ODQyOjQ7PDg4Pi9APTNF +QTNKPT45PTM7Ozo4PjE9QDQ/PDU5OjM1Ozg7QDdEQDk/QjY/PDg6OjhAPjs/PzxBQDU6Qjw2 +QDE/RDdBQjhGQz89QzhERTxLUULt/63///v///f///////////b///f6/+/9//L///v////4 +//vz/+b9//j+//f6//P///v3/O/x+eb9//P4//fw/uzr+ePi9uLz/+Pq++Xk89vg7NTn8uTk +69fo9+nu/e78//T4//X1/+/0/+v+//n5+/L7/u/6//n/+/7s/PH4/ezv9Ofz/u/5/+/4/fX4 +/fD6//j7//z7+ff5//L8//Pv8+PBYW1NSzx3TT9iRDtLQjtKPzhEPDlWTjtySz9tSzlsSEBp +RjtiQDxDOzhEQjhgSzmGWD6BXjmJWEOAWTlpQT9MPTBTQztGPDJPPjxXQztdPzRhQTtaRDhb +QTs/PThGOThiRDZlRjxoRT1hRjpVPjg2OTI5OzUxOjBVQjppTTtySTtWQjVZPzc+OjFBOjI+ +OTBNPTVRQDlQQThSOTlBOzU6PTQzOjFDOjc/PjlAOjc5Pjo+Ozc5OzRAPjFCPzhNOjJUPTdO +Oi5LOjw9NzM+OTk/OjBNQjlRPDhMPjVGOzY7OjY6Ojc6RTWenWfBsYd0TVI8OzVBODc8PzZU +QDZnSTpmPDxIPTc7OS88NTZNRTZeQTZcQzhNPDhAPThBOzg/PzhbRDhkRTlpTDRlQUBLPjE8 +PjVKQDBoRTtlSTZaQjRNPThCPjU2NzJBOTVSRjlbQzVXRTpZRzlGODs3ODIxOTRBOzJRQTdS +PzlLOzdDODs9OzdBOTY3OjM8OTc4OTA/ODtAQTFIPTk0Oi87NzdAPjRXQD1CPThAPDc5PzQ+ +OTQ+OTU/QDdSPjloRzpySzloRTlMQjRDOjc5NjVJPTtXRDZfRDdUQTZENjg0PTA7OzU9Pi9J +QjpiSzRnRj9URDRMQjpLQDNfRDtzSz9wRjpZPTo/PDc8PTRIQDlZQjlaRDNGPTc8OzI7PTc/ +PjU8PDQ+PT08QDdGPDhLPTlUOzs5OjRHPTlOPjlmRTpRQTxNPjU5OzQ2OjQ9OzdRRTNaQDdL +OTVAQTw3NzQ4NjhDOjdHOzhKSj9HOjU8ODo4PDRBPDg3Py88Ozo3Py05Pzs3PjQ7Pjs7QTA5 +ODY4PTc7PzhZTD1sYEl9c02RfFScfWSXdleMalJwU0JYR0BXSzRiTEaPg12gc3BtZktoTEVy +WVB0almLgFqifmebbFahcVqthWScX0uFZ0ORe1DMs3bgyYvs0pzst3vdp2rZmHPEil3JmmbU +s3DbtILQnXrEgG+3emPFj27NlHrWnpHUo47fr5Tjup/fvI7cwIbds4DXr3rgu4ner33lrHzd +qXTfqnbdqGvdr3zbpnLUmm7DjF27g1itfU6jblCbZ0iQYUiUdUvIrG/iwojov43jsYXLnW3b +voPos3/JnWzdpnu3b2FORUM/RzlSSkFfY0NxbVlub1h4cl9ybVF+bltvalJ8cV5xalRzblxw +bFVvaVBfU01BQTsyOTg3OTYxOTJCPTU8PjM/OzY5PTJAPDc7PDc8PDMqPDM6QDk2QDdGOT00 +PTREPjU4PjVCPzhBPTs4PDg2PDg/ODc9Ozc7PjE5PTU4Nzs8ODcyPTM5OzQ5Ozc/OzZFPjpG +PDNAPjs0NzI6QEE3PDE5PT04PDUzPTo5PjQ+PjREOjw4PTU9PDo6QTlBPzhCQDs/Ojs3OjY9 +Pzs/PTlGPz1FPz1ARjhSU0bi+pr8/+////7///////z6//D+//v////9//n9//X////////5 +/vH+//v7//j///f+//n9//L///b2/e/q+OHi9tzk9N7d8Nza68vi7uDi7tvX5dX////7//z/ +///09+fn/e35//Dy//j//e7r//P4//T6//v7/+7x/ez3+ery/vL99/f9/vf7/+3w/PPw9+Tt ++ubt+OHt9Ony/+39//jn6dS2X2VVSjt5SEJgPzhQQjxFQDdEQDpUQjtwSkJuRz5xTD53Rz1n +QzpIPzpJPjhoTD6FUUCDWkGJWUN/Uj9sRztPQDVVPzpBPTBRPDpUPzVhQDpaQjRhPj1ZQThK +PzpLPDhmRD5rRjtfQD1nSThYPTc+PDY0ODQ4NjdUQDluTDlrRD1fQzdWPTtDOzZCODk9ODFL +PjlNPDVbQzpQOzZGPDo/OTQ8NzdBOjJFPjZGOjo+Qjg5OzU2PDI8NjNAPDNLOzRYPThOPDZL +Ojg7NjNBOTk6OzZKOjtKOjNTOzs6PTZFODcxOTVDPjuNj12+ooN5VE5COTVANzREPjRUQjZm +STdpQjpKPjo9ODNAOTZNQzZeRDdcQjdRQTlAPDQ/ODo6Py5cQjdnQTVuS0FfQjFOPztEPDVQ +PzhmSDtmRjxfQzhRPDVDPTc2OjNKOjdYQTldQj1XQztfSz1KPDs1MzM5NzVCOjVYQz5JOzZL +OTo7PTs6ODg2OjI7ODc5Njc+NzFHPDlJPDVKNjo7NTY/Ojk+OzVSQTtGQTY9PTk7Pjc+OTI+ +PDk/OzFOQDlrRzV1Rj5iQTtPOjlEOjQ+OzpDPjFZPzpkPzlaPzRCNzY2Ni09OTk7OTRFQjVf +TDdjQj5QPjlPOzhLPzdbRDtwSTpwRT1TQDxFNjk9OTJHPzhXQjdWQDpFPDQ3OTY8Pjk9OTc2 +OTc6OjU5NzFDPjpNPThNPDg9OjVFPTxSPzhfPztTQTRGOTU9Oyw6NDs6OjVRQTdVQTJON0A7 +Ojc7OTA5NjJEPjVKPjdJPDhAPDc/PjY0ODM7OjM1ODQ/Ozg3NTI+Pzg3Pi5CPDw4OjFAPDoy +PDNDQDtFRztuY0yPd1uvkWStfWKaaE+Zb1mWalWOZ0yef2OgZlyNYUyEW1CHZUyXcFeng2Su +lnrClHyyjmnIq4zDoHK4g2iFXUePZU6Sd0zSp3Phx4PuyJLtt33Xp27Wn3PVq3DVmHXPpGjN +mHrDjGS+l2vKpHXVsoLcvY3gx57typnhwZHiwJPbtYThrnrXrn7cqHPUqXLbqXbhs3rju3vr +vIfjq3nlqXnXrnPapG/FhF+0fVWreU2hbE2VaEqTX0uOcEjGrnHWq3narnnNpXLTnnXLqXXV +o3zVroDdoHqgZllJQz5GTD5NS0RiYUxrZU1uZ091clh2cFJ0b1dvc1ZzaVlsa1VvaltzaFVp +ZlZeTU1EPzoyOzU5Ozg6PDVGQDpCODg6Nzc+QDRAOTo8OTdCOjo5OjY7NzU6OjM7Pjg5OzE9 +Nzc1OTRFPzg+OzU+NjY3OjBBOTU7OTQ5ODc1OzE5OTYzOjQ3Oi82PTg3NjdDPDVDPzhHOTQ9 +Ozg2QDU+Njc8OzRAPT0yODdBOjw6OzNFPTk8PDVDQDsxOzRCPDQ8OjhEPjg7PTc6PjY8PDg8 +OzVHPDw+PzhCOj1NTkHn86L///j///X7//L9//n///z///v///////v////////4//n7/+z9 +//34//D3/+/7/vX0+ej6/+zz+ffu8+P6+vfr7efl893p9dzp8ODm7tra59bq/+n0/+zy/+39 +//vz8+/3/f3x++3r/ej1/+z4+PH5//Ls8+bx+O3+/vv6//v///31//b3//P1/+/7/u/9/vz/ +//fs6eP2+fHw9+Li4tSzXWtSTT98S0FiTDxRQzxGPzlIOjhYSTtxRz1wSD1wSUJ3TTxhRTlM +OjNCPjVuTz5+Vz+MWEF9VUOIU0JlRTpWQDhLPTdLQjdMPjdVQzNcRDldQzZhRTpTRTdHNz9F +PjhjRT1kRzltSDtpSzlWQDQ2OTY4OjQ1OTNMQjNpTjtrSzpdQz1SPjlBPjxBOTQ9PTNIOzhP +QTlXQTlOQjRGOzc8OzM9OTc3PTRDQjg9QDU8Ozo9PDM9PjU9PTE8PjVMPTlaPzpUQTlNPTlC +PDE8OjJGOzZHPTdQQTZSQTtAOzc/PTgwOTVAPzmEilWypHdxUkxFQTY9OzZDQDhNRjlwSD9o +RzxMPTk7PTM4NzRJQzhdRTxZSD5NPzNCOTY6OTdDPDNYRzppTDpuRjxdQjhQQTg+OzZVQTxj +SzloQT5ZQjZbPDg3PjM5ODJBPTVaQz1XRThfQz1ZRT1FQTg1OTM1PDZDPjVTPjlMPzhFPjlC +Pjc+Ojk3PDA4OjU4PDI6Njc/Pi5RQUJHPTI/PDo1PDZDOzlMQDdFPjw7PDE/Qj5APjhAQDVB +Oy9SRDdqRTdxSD1lQTpLPTdEPDc8PDdFOzZZQzVkRjRcQUE+PjQ7Ozs1OjFCOThARDFqSzti +RjtZQzhJPTtLQzhcQTxsSjxsR0FTQDdDPDk7PDVGOjhXQzhaRDhFOzg8Nzg9PDo8QDY4PDs6 +PjU5PTtARDFQQz5LPjlDPjpAPjRXSDpeRTdUQztOQDs+NjM3PzU3PTRUQjxSRzdQQj85PTI5 +PDo4RTNFPjtMRTM6QTpFPzY2PDo7PTcyPDQ/PzQ4OTs9RTc1QDdAOzM4PTc7NzRAPT8zPDQ4 +OTpFTD11Zk6QeFmphmGuk2XDnHW4mmqhgV2ch1ariGavkm26kHbCmmzBmnzFo37SuJfOrorS +r4jUt5nSso61knKNZVCTfFCVa0mai1rJpGzZun/owYresnvdonXOl2HUs3TdsHjeqHrOl2XN +onHLk27OnHfOmXzIq3PTtoHcvIneuoHWuYPOqHbZnnLUr3jWpm3ZqXHitYPfvH3txY3ruIXk +uH/etnnlqnnRm2jFiGWze1CpdFWibkqcaEiQYUiOcUrLpm/Gn3K9kWXZq3ngrILFkmvRqXnd +tIbTk3VzS0tBRjtMRUBaWEZtZFJuaVh0b1lsb1Z7cVdxcFZ0cFNxb1lwblpxcV1vcVdyb1dY +Uks/PjkvQDc0PDYxPzNCQD09Pzk8QDU4PjpCPjVCQj02Pjs3Pjc7OC8+QT07PzM3Ozg/Qjs9 +PTxEPjg3PTQ4ODM1PzM5OTc+PzI9OjUuOzA1OTg0Ojc0Pjg2QDg9Ojo4PDVHPzhIPTk8OzY3 +OTY5PjU9PzM8Pzk+PDg1QTc+PDlFQDo8RTc+PDc0QDc/QTo+QTVHREA2RDk6Pjo3QTdBPTxC +QzlHRUBCQj5SUUHl+J77//X///j///b///3///X///r+//b+//j8//vu/ef2/+/+/vj3//H6 +//P0/+/3//D8//j4/+74//L3//H2/+7o/efl+d3P7Mja59PY4dDe49fy7d3m7eTk9ubz/uz4 +//T4+fL59+7r8djo/OP///Lz8+j7/vL//fLx+ejs/fH0/fD8//r59+jp9uby/erv//P///3/ +//v9//T5+fDt8ua8XW9SS0B3Tz9gSjlVPUBNRThJQDhURzdsRj9sRDxxSDxuTDxmQjlGQDZB +PThjSzyDVEGFWUGFXEOBT0BwRj1WQjxPOjRLQDhKOTtYQjlhPzpbRDRiQzhUQzZKOzpEQDhk +RDpjRTZuSD9mRjdXPDc7OjI4ODM2OTNRQTZiTDdvRjpjPzZIQDxFPThAPDc+OzJKPDhOQTZX +QzhWPzVGOzk3OjFBOjU5PzNHPDs9PjZDPzZBPzJBOjg6PDdBPTdIPzVaQDdWPDdOPzhHPTdA +OjJFOzZEOThUQDlRPjtIOjtBOzc6OjRCPDR/hlC6ooJ3VUtJPTw+OjRHOzlSPDl0TTppSjpY +PDw4OjFCOTVRPzdbQjtZQztOQTpFPTg7OTI/OjdZRTlxSjptRz9hRzhKPTlAODVWSDpoSzRr +Q0FbQDBcPj1DOTQ4ODtBPC5aRT1dQDhfQDlfQjxCOjc1NzA4OTNFQDVSQzhQPjlHOjU/ODU4 +ODQ5NzQ4ODU5Oi1CODlGOTZTQThFPDU8PDQ3OzREPzhOQTlIPTk5PThAOjE+PDQ/PDJCNzlN +QzNxTD1ySTxgPj9KPjZEPDU/OjpNQjtaQzpiRDhePjxGODE9Ozg7OjA9PTdKPzBoTEBkRzxX +Q0BQPDdIQThbQzduSzhyRT9RQzVEOzk9PDFIOzxfRjVaQzxGOjE5Ozc6PTJANjg+Nzc8Pjk8 +OzBCPzhWQjVPQDhKPjdAQDtWQztkSDtWQjhSQDg8NzU6OjY1QTRTQDlWPTdRRDs7PTFBOjw7 +OzJGPTtIQDRLQD9CQDM+Pjk8OTI6OTo3OSo5PTc9Pzo5PTA2RDM8OTA7PDc9QTY2Pjc7OzdD +SztvY0yQflmwlGq1lWvBmGi+lGfCj3asi2Svj2y1lW3EmnTErH3PrXrQrIHJqoLRsY7Zvo/U +vJnBmXaadl6lgVymc1KNaUyuhF3NmWnaqGrmtX7hsXjgp3XRkWHSonTYsm7ktITnq3nconvb +pXHft4TdqXzVqXvcrX7ZrHnVpXXVoG/WqHPZpnDOm2vWlGXgqHHptHzivH7tvIXgvn/xt4Df +pnbjqG3ToXDMjF63iVyodFCia0mWaEeOY0aRbkfMpHC4gFzNm3DmwovqvZXGlm7gs3vTpnvF +e2hVSURJSkBiXEloY0lzdFVyclZzcFR0b1V3cFt0cVd2b11va1VublJ2bVlqbFVxaVJhUkhA +QTkzOzI6OTc0PTM+Pzg8PzM8Ozc6OjM/PTc5OTY8OjcxPzU8Nzg8PDU8ODNBPTU1PDU+PDJD +QDc5PjY2OTo3PzI/PTk/PTQ+Nzc1PDI4OTIsOzI6Ozg4OjVAQDk9OzRKPTJDPzc/PDg3QDY6 +PjI8QTo+PjQ1PjY8PDdAPThGPDpAPjk/QDs5PzVAPTtDQjtJTz9APklBOz05RjJBPTtCQTlL +Pz5ARTpbU0fq/qL+//H///v///v///v///v///////z+//z8//P6//f///z9/uv///b3//T9 +//n6+PXy+ubw+un3/+72/Orn7OPg6NTr9ufj6tbn8uLn++Hl+ODx/+31/+71/+7z9/Dx/O31 +/+z4+e3x++n5/ezq+OLz/fH4/+z9//b9/+/z/+71/ur59e/6//X///7////7+/Pz/Orq7eTq +/Obx/+7s9OClWGFSSz9+Tz9mRjtTQj5LQTNFPjdXQjdwTj9oRDdzQz1xSzplQT1DPzJHPzpi +TTmBUkGDWTqLXEd/Vz5wRT5ROzdZPzhLQDJKPTlXRDReQjhiQTVbQjRVQTdFPTRGOjNkSDtj +RzVtRDxmSDZaPjk8Oi8/Ojg2NTFSQj5mSTdrSDxfQzlPPzlKPThFOjNDNzVIODFWPjVUQjVS +PDlGOjQ+ODU9PTI7Oy1JPzc7PDRIOzc9PDFCOTY0OTJDOTlGQDVaPTVRPDNXOzdCPDRAOzFE +ODhBQDFUPDZTQzdEPDI7ODA2PDQ7QDN/fUusn3R0U0s/Pjg5PS9COzZPPzVuSDxoRDRNPTk/ +OCw5PzVNPTJdRD1ZRjhMQDJGOjI9OTQ9QDRaRDhxRztsRjlhQTpMPjVJOzZYRTRqTzZlRDhZ +PjNZOzhBPTQ9PDhEOTRTQDtbPzddSjZYRDdEPDQ0Mjc5ODBFPDdQPztOOzhGPTNBOjo7NjE6 +NzEwPDI5ODE7PTRHOjJMQThMPDY9NzY+OjJFOzpSQDVDPTY9PDQ+OztFOC1DPjhEPDhRQThx +Rzx1RjZjQztKQDRFOzU6PC9MPjtcRjJlRDxXQzZGPDg8OS4+NjY7PzRLRTxlSztlRTlWRzhP +PzxRRThaQjhxRztvRTtWPjVFPDQ+PTVJPTdYRDhbQjhGOjRDOTg9PjVAOzw7PTE6PDg3Oy1E +PDtRQy9QPz1BPDFHPzhaST5jRDFXQT5FOzVAPDc2ODY5OS9PPjtWRTdMQTQ3PDE8PTY1PTNF +PDVJPzRJOzU5QDA+Pjk1QC08QDQyPC89PTcwPTc+ODM5QDMyPzE9PjU6PjM7Pjs8PC1DTDt0 +ZUmUf1aukmO9nW7Tr4TLn3XGkGq3kW+6kW20lW3Bl3PBo27KrIPMt3zKp4zYs5HMt5nKk3Km +fFy7i2WygVubaU2Tc0m3jl7SlmzTpnrfsXrjs3rjpmzZnmfYnWTUqWnir3Hhun3tvo/rtInd +mnHUnnHapXLWo3HPoGfQmWfLkWbNl2nQlGfVmWnZo2zop3PmsHnis37jrnzgsXHlvoHltIDi +pHTYsXLRm2qzf1imcVGhbUmZaE6UZkiRbknCn2PRnnbjxZDpzJfvwZrQrYDbrYPHnnSeaFlQ +Sz5aU0pfX0ZnaVB4cFd+bl92cVl3c1h3bFR0bFZzb1dyd1lvbVZsb1NrbFVta1JbTkQ9Pzg2 +OTY5NzQ3PTJDPDg5PDVBOzY2QDBCOzY8OTFBOTo5PTVCOzc4OjRCPTk4ODE7PTU6PjtCPjBC +OzM4PDQ4PDM7PDU9OjM8PDM2ODQ3ODI0PTE5OzkyPiw/PDk5QjBLQjVBOzU8PTYxPDFBOTk3 +OjY/Nzw3Pzc6Pjg/PDpEPDtBQDI9Ojc7Ozg6OjRIPzpESz1CQkQ4Pjs8PjZEPUBEQDhFRz9B +RThYVEn3+6b7/fH6//D///7///3///r///n///z///////////b1/u/z+d7///b///r2//Lu ++ur8/+38//P4//Ly/+f5//Py/+vq++fd+tPl8Nvd7tfZ5c/n8+n1/vv7//Hz//Ht8+jj+eb2 +/O77/vX//fjt8evy+ef1+ujy/O30/fXy9Obv+/L///7////w/+36/vX+//v18+zw7+/9+e/z +8urx6OGiWGZXS0F/SztkRTpKPzpPOTlGOzlTQjxtR0FrRT1sQUF3TD1jQDhSPTlEPTlkSzh/ +Uz6IWkCMVj+FUT9pRztaRDtSQTZROTpFOzdaPTpdRDdoQDxbPDZYPzhANzRMPTtoQTpiRz9k +RzlpQzhXPTk7NjgzNjA4OzFEQjVvRzpuSjpkPjpJPTVKOTk7NzBJNzlFOTNVPzhTQTZUOjhD +NzBCOTc4NjY+NDdCPzxDPDtCPDg/ODg9NjM5NjQ5ODNHOTRVPzZaPzlMPzZHOjU9OTBHPDlA +Py9VOzdQQTRLOzo4NTc8OTk5PDN6dkqqlHd1U00/OjY8OTQ/OTVTRThqSztoRjpNPzU8OzI7 +PTRNQjlbQjZcQzlKPjZHODw9OzBAODtWRDVzSD9uSThjRTtLPjFDOzhXQThqSDhrQTpdQjpW +OzZCOzk7NjNEOjRVPDpbQjldQTNYRDdCOTY3NTk0NTFFODpRRDZOOzxLPDdBODk7NDQ6OTQ5 +NzU5PDc8MjFKPDdVRDlFPDdDNjk1NzlDOzhQPzlJOjo8PzFDPTVDPDtHPDk/OzNSPzNySEFz +RThcOzpOODJDPDtDOjFJPj1iRDppRTlcOjtDPzc3NzM7NzQ/PDZAQDJhSkFfSDdWPzxQODRP +PTtbRjl0REBtQzlXQTpFOTA9OTRGQzReQj5ZQjRAPTo8PjQ+Pjg4PTE6Ozc2NzU8Ojc7PC9T +QDxNPTpFODpBPzBbQTxfRjVeP0E/PTJBNDs1Oyw7PDdKQDBgQD1IPDNEODc8ODU4OjJFPjlQ +PzhIPDg/PDYzPTU9Ozc2OjU8PTotPjU8PTg3Oy89PDozODBAOTo2Pi8+PTkzNThCRTlyZk2a +gWO3mWvFr4DOqXHTs4PXqITJmGrEoXXCoXbDqHrCpXHEpnvFlnO+m23Cn3m4kWmvfWS8nnDD +k3afakqQYk+ZckfEj2XNnGfUmXLirXziq3jfn2zbnGbZkWjRkGLYlGbOoGjesnXrxIrru5Hk +qn/dmXLeoGvSk2/YkmjOmGTXnmzOmW7domveq3rosH3lsn/qt4DksYDluHrltXvjrXPkrHfV +qWrWnG29hFmrblOXbESdbk+UakmPbkq3ll3WsXjny5DpzJXmvpLgr4TdroTAhWZ0WFFYUEVg +WkhsZ01ybVV7dmB3d2B6b150cFh5b1x0bVd2blpyblFwalhvb1ZzaldxaVZdS0g4PDg4PDc0 +OzM7OzdEOjc3PzI9PDg9PDY5ODY7OTQ1OzE8OTY2PTVCOTk8OjM6OjQ7QDNAPzY+OjE+OjY3 +Ojc/PTw7OzQ9PDQzQDE+QDo6Ozg3NjYyOTY3OTM9Ozc5PzdEPjVFOzo3NjI7ODk2NzNAOzg2 +OzI8Ozg6ODhBOjpDPDRGPUA3PjJFNz0/RThLOj03PjdDQzo8NzM+QzpCPzpCPjtHPz1BRjtX +VEXt+aL+//j///////v///3///////////z///////f///////////73//Hx9+v6/+////b/ +//b4/PXu8+fp9eHo8uPg79rY5dXb8NDg5trU3M/X3sv///bw//Ds+OTr/fn7//77+/P8//bz +/+7r++j8//z////x9+Xx9+f6/vH9//7///Xz/+zr89/t7+30/O7y//H9//X0//P+/ev8//n5 +9/CYWXFTSzx6SkFkSTtMQDxPQjNEQjxRSjhsSURoST9ySUNwQz1lQjpKQThBPDtfSDt/VkF8 +Vj+CWEB/VEFzSjlURTpUQDhHPTxMPjdUPzZcPjxiRTphPzxPRTZJOT1CQTdiRz9fRThoRTtl +RzZYQjk1PDI5OTYuOzRGQTVpTjlrSD1eQzlMPjREPTQ8OzhEPTRDQThTPTZXRjxMPTZGOjs6 +NzQ6PDYzPTJAQTk1OzNGPzY5PzVAPDkzOjVBOztHPjhcRDlPPzNOOzprZmBCO0FDPTdDQDJM +QTlZQjlEPjk6OzcwOTQ9PjVtcUamlWtzVUhHOTs5PTZDOTxURTVyS0FlRj1SPDkyOjI9PDZG +RThfSD5bST5QQjpBQDk9PDw4PzdVRDpvUj1tTD1jRjZOQThDPDlaQTpsTDpnRz9bRDZZPT0+ +PDQ2PDlDOTNTRD1RRTdfRz1SQjg/PTwyOzYuOzJAOTRKQzVPOztCPjc/Ojc4OTQ6PTM2PjY5 +OS8/PThEQTVSQzxDPjg6PTw3OzNEPD1LRDZFPjo8QTVHQjtCQDtKPzo9PDNQRjdzTEF2ST1k +QDpHQDlEPTg4QTFJQTpaRT1rQjpXQT1AOzg4Ozc2OzM6PjZBQTNYSj5cSjhOQjtLPjNHQjtc +RThvSjxsRztRRDlAOzg3PC5HPjpcQjVaRDxBPDc7Njg2Qzc4Ojg3PzA3Pzs0PTM6PThUPjhQ +QD1BPzdAPTdXRzdYRz1VQUBIPjo5OzU0OTM0OTVQRDhTQzhIPUA5PTE+Ozc1PjFFPz1GRTdH +QEE8QTM3QDozOyw4Pjw2QDE2OUA2PzM4Pjk3Qzg7QTU7QjlARTszOzc6Pzo1Rzl6cU2ahF63 +mGq8oHjLonjEq3LGonLFmmzHk221kWLClHG8j2u9jHC5kGe3hmOzhmG2kmjFkm3CnWm6hl+R +ZkuIakiaelK9i13Jk2XVonXcrnrgsXnjpXvbn3PdnGvOm2nYlmbSn2Xgr4DjvXvpu5PruoXm +toTjsILfrHbdrXrapHfarnfgsHjksIDkrnfpuIHrvYnuvI3qvIPhsXzot3jdrHHksXjTqW/R +mWK9iV2od0+Kakendk6cbk+Rbkupk1/StHbkvovdxI3gtYnevIXaqYWmc1xZVEZbXEhgX0ph +akx4b1d7dFh1dVh3cV9ub1dzbllxb1dwc1xtcVVpb1tscFhtblhraVZbTEc8PTsuPTY1QDc1 +OTQ9PzkxPzg3Oz07Pzc8PDk1OzUyPDU0Ojo4PDc4PDY1PDY2PDc4Ozc8Ojc7Pjk1Ojo5PTo6 +OzU9Pzo4PTU7OzYwOjI5Ozs2PTY5Ozg2PTQ8PDY3PjVHPzc+PTU/PDczPTM5PDQzPzM0PTk1 +PDU3PTc7PDpAPDg+PT07Pzg6PDg4PjxCRDxBRD04QDlAPzo9QjRAQEA+Qzs/QEI5SDlUW0zj ++KX+//T///3///////v+//jy/fD1/+n9//X////4/vzw/ujx/uD9//b+//r////3//jn++Tx +/uf7//nv/+r7//b5+O/q9unp/93o+enw/eXo+enq+ef4/u38/evr//D6/vP4//T09+Ti8+P3 +/u3y/+74/+n0//T///7z//L+//f+//n19e7+/vz////39+7m9+H7/vPv8OPs9evs/urv9eGS +WmZVTkN6Sz1qQz1PPjlEQTdFQTZTQzxvSEJxRDxqSz55RjpiQzhOQTpJQThiRjh4UD2HWESC +XT2HTj9wSTVbPjpTRDVQPjpHPzpbPTtcRDdmQzlePzhXRDhLOztIQTdmRTpkSDtpRDtqRzhU +PzY/OTM3OjA6OjJEPTRqSzhqSzxgQzpJQzFGOjQ9PC1GOjdEOzNYQjxVQzVTQjpEPTNEPDgz +OzM8PjU/PTZDPzY/PTg8Pjg4PTM7Ni9APDNIPDFUQDFYQTROPjpSQzxDPDVMPjg/PDJXPzhM +QTVLPDg2OzA8NzU7PjRtbUWijWx1VkpFPDM7OjI8PDVTQDVzTjtvSjtOQzM8OzQ9OTJKPzRg +SjRfRzpNPzREOTk6Oy49OzVXRzFySjxtRTRdSD1OPTZDPzheSzptUDdqQjtZRjtYRTg8OjRA +OjE/NzRRQTZPQTVVRTZQPjk/PDE2NTQwOjE/PzRKQTZLPjc+PTRAOTQ8PDM7OzAzNjU/PDM/ +PzdLQjVSQzhFPzU5PTk2Oy5AOzhORDVIPDc9QTRDQTdCPzZIQTZBQjJVQzdxSz56TD5iRTxQ +QTZDQTk+PjFGQDhcRDNjSTtdQzRBPjM8Ozs5PjU8QDhDQTFcSTxXRjdTQzlJQzRQQzpaRzN1 +SUBtQzVTQjdBPDM9OjRFQTVbQzlWQzQ7PjY8PjM+QTQ7PjY3PjY7PzU2PzU5QzJRQztORTRG +QjlJRTFcSjleSDZYRT1DQDJDQDs1PCw4PTdIQDNaRThKQjZBQTU4QDQ4QDFBQjROQzVGQjg9 +PDc0QDA6ODY1OS86PzA4PDQ8Pzo1PzM7PDgyPS9BQDc8RjdDQTQ1OzFHTDl6fE2pjF6ujGiv +mGLCmW/EoHPMmnjHk2fBi166hF+3gGG4j2S/iF63glu+k2rKo3fGn2zKonXDkVyrcluJY0GR +blame03AjGLNmGjVpG7iqHbitXTlq4bbnGjcqG/coWzamWTXomfYp3Pjqmriq3vgtnPjr3vn +s3zaonXjr3ngrnvlsHXktIDkun7ltn3psnXmu4zuvYPmvIPpuoDlr3veuHvfsHbXqXPOmGbD +iliwcVOObUKkcVCebUqVa0mhiVDPnm3VsnXft4TdtYDcsH3Ilm+KZFFZUENnXUdwbFJ7dFd6 +eFl1dlpzc1V5b1pwbFR6bVRxd1V0bltyb1Nzb1pxclRxbFhtZVVcSkc5Ojk6PTcxOTM/PTlA +Pjc3Pjk6PTQ9QDg5QDQ1PDQzPjU6PTQzPDJDPjk7QTU9QTY2PzFCOTU4PS9COzo2PDQ7OzM6 +QC9BPjkxPTQ2PTM7PDU3PDU7OTk3OjM9QDg/PDdEPDFCPjY5OzM4PDE2PDE+OjY1PTA4PTQ3 +PTJEPz0+QDQ/PTQxPDBEOzc6RDJHQDY0PzFFPjo/Qjc/RTlERT9DRzpBRTtDRT1ZVEPw/ar/ +//3////////7//L+//D////6//f///////f///3///3///j////////////0+/X8//P6//Lw ++ejv/uHx++3j/9/d/N3f89Hk79vh8Njg6tfy8eTr+OX49eji9tzp7tzs/en3+PP4/ev9//n5 +8/Pv9+37/vHt++zu9ufq/ODz++79//n///j1++T5/fj///j///Tx8uv+/vT0/+nx8OWXW2xQ +REJ/R0ZqQj1MQTpRPTlBRTpWPTtuRz92Rj5pST9xRT5mPzlPQUBEPzZgRTx+UTWNVkOFWD2L +VUN1RT1jRDpQQTlPPjtLPDVUPjhhSDdpSDhjPzldQTpGPjZIPTBeRzhpRTplQjluQD1VPzRB +ODg0Nik5PDdJPzRuRz1nSDZeQzxOPjNOPjg8PjNAPDNIOTRVPzNYRzdYPjpFPDY+ODI7ODU9 +ODQ+OzRGPjpDQTdHPjs4PTM9OzU8OjRNOjZUQjFgPjdNPDVPODZAOTJIOjdGPjhUQzVYPzdE +ODQ8NzU5Ozc+OjZkYUCiiGh0VkxIPDU/ODlDPTVXQzp4SzZrRUBLQDREPTk8PCtRPjxiRzVi +RzxSQDRAOzs9OzQ+PDNZQjduTDpwRjxcPzJQQTlFPjRlQTtySTtqRjxeQjxXRDNANjk5MDBM +PTdXPjVWPTZSQTRPPDZANzg4PDUzNTM7Oi5IPzhIPjlHODc/NzU8OzM7OTQ/ODY3OTJEOzxJ +PjlWQjhEPjZCPDA3OTdBOzBMQT5FPDJBOz5JQTVCPj9FOzJEOjlZRDd0TDp8TT1hPzZMPDdG +PjdDOzpEOjFgQz1pRTpeQD1BPjY7ODY6OzA+OTVDQDVZRDlZSDdTQzZLPjdOQzRdRzlzSz11 +RDtZPzlFOzI+PjNGQTVeST5YRjtDNzo4NTNBOTo7PS8/PDg1Pi05OTo3Oy9QQj1MOzJKPEBH +PTJcRD5hSzVWPzpHQTs/PjM4PDM5OzdLQjlTPzpKQjtAPjY3PTc9QTY+PjJSQDpEPDRJSDw4 +PTQ/QDw1OjI/RTg7QDlDQT44QDhEPz0+PDQ7PDhAQjdAOjU8PzlCTDeCc06YhWClgmWrima+ +lWfLnXLNnnTPlXjJmGrNjGzFjGPLlW7KlmbSqHTUpHvYqoDUpnLJn3LGj1+idFGUZ0aOakqm +fFC2j1/PlnXTrG/otnrkp3zdpnPZmWrVpXHgoWbSnGvdmG3VqXfmsoTsqoXhsnzhr4DnsHrl +qXnkrn7pt4TmsXzst4PtuIbuv43uvIzxw5Dtwofyxo7nwYjnr3viqnLYoW/Wp2vYnm/MlGW3 +eVuNaUifdlClcVKTZUqiiFfUnmzQomvYrHTVsXvPom6zf2BqVUlZXElybVN9eVp7c2B6cVp3 +cl92cVt4cFxzb1d4bll2cVZ0dVl2a1hwbVl1bFZ0bldzaFRaSUc4OzM1OjM1PjNBPDk/PTg5 +PTk8PDVFPTg5PjI8Nzo2PTRBOj01ODJDPjs8OjRBOzk8Ojg4PTg+Qjc9OTc5PjY7PS1CPDY7 +OzU5OTY8OzY4OjU+PDU2PDQ+Pjo4PTVHPTtCQDBHOzk6ODNEOzk2NzVCPDk0PjY+OzY3PjRK +PzhAPTc/Ojk+PzQ8PDZDPjtGRThBOzs9Qjw/Ozs5PDtGQTtCQT5CQzlER0VYVUHk9aH6/+z/ +//////v////8//D9//b4//Xv/+zs9t/5/ej9///9//H////7/PD9//z///b///////37+/n9 +//vt9erf79rb6tni9tjo8eHh6dve5Nf6//jt9eTu8vL8/PLw7fH5/vv///////nt+en5//T9 +//n///P3/fP7+e/v/u36//P8//j0++P8/fju/+38//j//fX8+/v////5+/Dq69OPVmZNSTp9 +UkRkRjtSPztOPz4/PDhTQz9oSz1wRz5rQj5vSD5nQjtIQTdEQzxYRzl5UD9/VjqHWUWBVjh4 +TT9VRTVcQTpFPC1JQTxXRTZjQj5qRDRfPjpbQjdJPTVCODZdRTlkRTtkSDdkRzhVQDc8PDI3 +OzMxODNLPztkTTx0SD1XQjhUPjs+PDVGOzlCOzRMOjZKPTpcRzlSQTlAOi88OzU2OzM7PTU3 +QDVCPDo/PjZEPjg6OzQ9OTJAOTNFOzFbPjpXPzVSPTtLPTRGPjlEPDJNPzpTPzJTQD1DPjY4 +ODg6NzY3PjNgWD2Vh2B1U0pAPDA7PTU/PDZUQjhyTDlzRkVHPjk6PDg7OjZJQDRfSDpgRzhL +QzY9PjM7OTU+PjZdRzlxTjtsSTZdQTlNOjFHPDRfSjxxSzxlQzxlQz1TQDlGODstODFNOjZa +RTljSDtbQDtRPzs3PTg5PDExOjI5OjNIQThINzVANzk9OjM7ODY/NTk2ODBAPDlBPjRPPj5S +QjhLPDo1OjU8OTk9PjhPPj09PTVDQThAQTZBOzVBPzZIOjpTQTp4SkB/Sz1iRDtQQjZEOjJA +OzZIPDlcQzxsR0BbQjlEOzc8OjQ/OjY6OTFEPDlVRjVYQjxNRTVPPj1JPTNbRjpySThtQUJR +QDVIOjs9OTpDPTNdRTlXQjtCODw2OTRBPTw+PTY3Ozs6OTsxODE5OzZJQDhRPzs+PzROPjxZ +SDhlRz9PRDhNOzo3OjQ7Ozk7OzVLQTtUQDdMPjg/PTQ6PDc7OTg/PjRMQTxLRDhAPTs1QTYy +PTE4Ozg6PDA3OjsyPDE9Oz41OjBBODw7OS49QUE5PTQ6OjlCSTl6ZE2Ve1eff1muh123lmbJ +lm7Kpm/SoXrNqHPXpYHUpnLSnnfXo3PSrH7YsYHTpnvNp2vCkW++hlueelWTakuGaEylelO+ +jWTNmW3fsYDju4jqrnfdpXHTl27Ynmvdo3nhsG7nq3/puYbxwI3pxpTwxZfowJDtso3lrX7u +vIvluIftvozrwozwzpXz0Jn40J7zyp35xJPrwov1uYfrtoLmr3zZpXHSnmvXrHPLlWu0e1SW +ZUqZdUyqdFOUaEqZiFXYqXncp3LVpXbLnHDFjGWBZFNoXE1yb1d3d1qCd193eF57dmB7clx8 +c1x2dFt6b1xycFh5bldvcVF0bVxvblR3b15vaFVwZ1VWRj43PTc2NzQ1OTM2PDZBQDg6PTU3 +OzU5ODY7PTU3Ozc4OzgzOTQ8PTU4PTRCPDg2OjVCQDs6OjFBOzg9PDdCPTc8OzY/OjQ3OjM5 +PTA5PS82QDM2PzswPjY+PTo7PDlAPThDQThCPzk2PDQ0NzY6Oz42PjU3OzsyNTM8PTdCOTZB +QDc5ODA8ODtFQTQ/Pz1CPjg6PTY7Pjw2OzE9PDxAPzpAPjw4QTlBRT9UVETr+aj9//f///r/ +//r///n///////z///////7///////z9//Pz++X0/+n7//v8//L9//nw8uvm/eDs+t30/PDv +/Ojw9e3m++Ti+dbX49DZ59Lc7Nz1//n0//P9//n5//L2//X///7z/vH9/vP2/+3w//T1//b8 +//X+//77//z///f3/PH09/D+9/L5//b///L09e3y/O3u9+n6/+z4//H///CLT2hPTUWASkJn +RzhRQTxRPzxDPzZTQD5oSjtwQD5tRTR4SEFlRTpSQEFDQjJfPj14UjmLVESFWECCUkB5SztZ +QzVZQTZTPDVIPTZaPTpeQjhlQjVlQTpfQTZJPztNOjdbQTtqRjtiRjlvRDpUPTVBODQvOjA8 +OzY/PjRsTTZrSz1lQDpONzhJPjRCNzZDOjVMOTdTPjRbRDlRQjdLOTc8OzE+OTI6OjE4PzBD +PzhAQzRDPTs9ODNANzg7OjFIQDpaPDFbQzdRPjRJPDRFPjJGODRLODZUQDlaQDpBPTQ7Nzk3 +PzY4NzRcXj6VgV51VUtHPDY8OjU/OjVSQzhzTjptRTpRQjc7ODA9OzVOQzJhRThgRzhQPThC +PjI+OTo3PTBcSDZyTjpwSj5bQzJSPDpLPzZjSjpyRj1qRj5fSDpcQDtAOzs6OzNLQDpkQzpj +RT9lQjRUQTc8OjY1OjE0ODY5OjNNOj1LPzRHPDc9PDRAOjgzPTA8OzQ7ODNENjtJQzVWQDlA +OzU9OTU6Pi4/PDhMPzlLOzpERDVCPDtEPTNGPjhHQDVYRTpxTj17Tj5lRThUPTlHOjNEPThE +PDJgQztpSjdfQD5EPzNBNzk4PTA7OzlDPTJWRjxXQzlSQjlTPjtNPzVeRTZ0TDdwQjtVPzlL +NzlBQDZJOzRdQjtRQDZFOjo2PDM9PTg7OzQ6OTQzOS47NzY1ODFTRDpMQDhHPTRKPjVbRzhk +RT1RPzlKPT0/Oy00NTc3PzRLQDpSQTpNOzlAPjo4OzE8OztCPzFMPjxDQTY+OTw2Py4/PD06 +ODQ9PD45Oyw6OzQ8OTQ2PjY4PzY3PTNAPTw9PTM7PDhASjd3aFSOek+ddmKtiV68l2rMnnbO +oHHbq3TXsn7hs4XXqHHgsHjWrILgsHvVqoPgqXrQmm3IkWjCimWjc1OacE2Na0qhe1G5iFrY +pHvitoHtvIforXbgonLYnWfan3XYqWndrnnisH3wxpT116L10K741az1z5nrvJDzv4/yxpb2 +wZvxyJj61KX11ab41av40pv61qTuz5X0x5ztwIjsuoLks3zkp3HVn2jUo2vNmWq7dFyXbU+a +c06bbEyQZkmVgk3Pr3ncq4LSonfAjWOhdV5vYlBsalN2cVd9eGN2e1p9dFx6dWGAdGFzdV95 +cGFvcVZ1c1x1cF1ybllzcld0b1NtbFZyalJvZFJTRkI2PDU4PjU0OzE4PjY5PjVCPTc5OzVF +OTUxOTM7OzczOjQ7OjMyOTFAOTg5OTo9PTQ+PDk9OzQ6Ojc7PTA3PDU5PzU7PTU1OzA7PzY7 +PDg7OzQ5OTU3PTM2OTE5OjBBPjlEQTFCPDs3PC83Pjw8ODE/OTswNjU1Pjo+PTlBPTxCPTc4 +PTU6QTc4PTVCPjY/PjZBQDQ7Qzk7PzlCPDtHQjo9QTo8PzpHTT9VUUX//7P///X9//X6/+// +//n////////////////////////9//X3/uf9//D7/+76//T7//P//v36/+78//Lv++vx/+T9 +//Pz/ffr8trj7OHb69nc6Nf1//T1/Ozk+N/q9un9//X4/+7v/eLx9+r7//P09fPz/Oz0+e3r +9+b4//H8//f8//T+//b+//379+jw/fb////+//X18+75/fP4//Dt6958U2ZLSUaETz11RkRU +RDpPQz9IRTVNQj5nSD10Q0JnST1xSz5sSjpKPjpEQDVeSDd5TD6JVUCKWkSHVT13TT1dQjhU +QjhROzdKPjdXQTtbQjduQz9lQDZYQDlDQDRGOjZZQzVjRTtkRThrSD1YQTBDOjowPTQ3ODE/ +QDFjSTtySzldRzVQQDZGOjY9OTNEPDlGPDNOQjhbRjJYQzlFOzRBOTk0PzM9PDk1PjBHPTk+ +QjVEOzo3Oy9DOTc/OTJHOjlTQDZXPTZUQDtMODZGODREPTRNQzdSQThVRTpFOzg8OjE9Ojk0 +OzBWVkCFfVN3VUlBPjRGOj45PTFaRThtTThySD1IPThFNzg4OTJMQTZpST9iRzlRPzlBODQ6 +NzQ7PzVeRTd1TEBrTDteRjtPPy5LQDhdQTNwR0BmQjdjQz9QOjA/OTk5Oi9OQT1hQzRlSTxq +RkdSPzlDOjQwOjk3NzU8PDZQQThJPjZHOTU9OTQ/Pjo4PTM8ODVAOTY+OjRJPUBSPjtGOjk2 +OjU3PTQ3NzJOPTRFPTpCQjhEPTtAPDVHQDhFOzdYQTt2Tjp6Sj1eQDdQOzpIQDRGOTVFOTJj +RjpwRj9aQjVDPDk8OTI5Nzc9PTJIQTtTRjdURj5PQTdHPDhLQDtgQTt1SkBrRzhWQj1DODFB +NztEQC5gQzlUPzZBOTY2OTA7PTw5OTU2ODQ7OzM6PDc6PTNERTZXPzdDPDxKPjVgRD5jRzpW +RDpGPDg+QjszPTQ3OTY9QzRWQTtLRjRDPTs2OzQ+PDk7QDFNPTxDPzFBOD03QDQ7PEA8Pi08 +PDk3Nzw3PTM9PzU5PDY3Pjg9Ozw5QTU8QDQtPzFFTD5wYUmIb1eah1q1kW3ImmjOpHjUp3rd +torZsYbhs4LcrHrhrXrfqHvdsIDcsH3hsIjUrXjNnmvBlWeYbUydcFSUbFKjelu6iGPVqnjv +xJTltX/kp3reqWzenXXSnmjZk3TXn2zasHvlwXvnxpHsyY7wz4vw1Z7y05z5x6jz1KD42bD/ +3bv+37b726374LT82aT1z6P6z5vxyJb1w47lt3/rsn3gqHbboWvLpGzUpGm3gV+daUacd0yh +ckyPaUuFa0iil2LBp2y/l2igfFqBbVtzb1Z5cll4dFqBd1x2dld6dlt8cV57dFp7dVl0c1p0 +c1lzcVZ0bVt0a09sb1Z1bFhvcFdva1hsY01VRkQzPjY8PDg4PjU8PDg7PTM6PzU/PjY/OzU4 +Pzc1PDQ0OzU5ODo4OTQ/RDZAPjM6OjU+PjQ4QTU8PjI4OjU4Pjc7OzY3PDQ/QDcxPjQ6PDY1 +Oy08OzQuPDI0NzQ2PTBDPzM/PTU+PjI4PDNANzY3OjI9OTY1OTg5Oy86PTZFPzdDPzk9Ozg+ +PTU9ODlAQzdCQT89PjZBOz0yQTZFPDtBQzhHQzw+PTRMQD5TVUH296X9//T9//X///////39 +//b3/+r+//H+//z+//n////z//H3/ej////6//vx/+T9//j8//b6//vw/+Lz++vt9ebf8N/V +7s3k+dvl8d3v8uDy9+7y7vDw8Oz09/n5/vHv//H1/vD2+fP2/9/2/vH8//L5//fz8ej4++3z +//D2/u/7+e/x8ubs++j6/PXv/+jz/vH2/+r69/Hy/+7+//v18OB/UWlJUT+CUERySD1RQj1K +RzhJPzVKRT1kTz1uSzhpSzxrST5rRTdGRDZJPjpXRDl8UD2CWT2KWkF+Uzx6ST5aSDdbRzlG +QTNKOzZTQTdpQjxtRj5pQztiQzlFPzZCQTJZRjhiRztoSTloSTheQjY6PjU3ODUxOStDQDdg +TDRrTTpZQDRQPjZAOS5GOjZAPjFIPDZQQDdeRDxWRjZLOjg7PjM8ODI6OjU4Py89PjZFQjhD +OTBCOjY5PjRCOTdIPTRaQDdVRTZRPzhGOjBMQDU+Py9OPzZSQztZQjc8PjQ/OzY5PTU5PDRO +UTeGeFh2U0c/QTVAODU9OjNTRDRwUTxwRzpNQDQ7Ny1AOjNQPjRjRzxaQzZNOj5CPjA9Ojs7 +QTRcRDl0UjdvRj1fRThKPzZIPzJjRjpwSzxiQjpiRzdOPDc+Njc7PC9OQDJeSjxmSj5jRjlO +PjVAQDsyOC81ODI5PDFOQjtMPzhFPDQ/PzM/PTc5OTg7PDE6PjQ9PS9LPjpSSDZIOTo6NzM9 +OTc+PDNNQzlBPj5BPDVBQTxEPzRFQDpFPTRaTTZ2UTZzTD1fRDdRQDtJQTNCOzVHPDBZRDZr +ST1aRDpJOzw8PTNAPTg+RzdIRD1TRzdXQztNQjhLQjJJQTRdRDhxTjhtRTxVQDhFPDg9PjFE +QjdgRjlSQztDPjU9ODY2QDY/PjU2OTE9OzYzPTA/PThKQzRWPztGQzNNPzVbSDdlSjxQRjRN +QDxDOy87OzQ2PDBGQztSQTdKPzA8PDc7PDY4OzREPzNLPTJJQTg7QDQ9PTcyPzE+Pzo0Pi86 +PTgxQjA+PDozPjU/QD03QDhBQjo0PTE7PzhEVTuCakiHa1CjgVe1k3DHoGnUrX3VrHvZsIvZ +rnjZrHrhvYvkuYjguYPavYbjv47hvYjfsoDLoHS3iWqUb06NaFSNbkqpe1a7nWPds3rrwZbl +uofmrXvdrXriqHvZqnDZpHHPmGfPl2bNoWLYp3fcr3nUqXfXt3XXtXzjyYXkzJP00qH136j6 +4Kzv267+3qP22a7z15v11J/10JHyxYfiunzpuX7esHTZo3XNn2jMpmu9jl+haEyUd0ujdlSX +ak2FZkeJf1qCeV+GeFyBd1l9dFyAeFyAe1x8d1t4eV5/d2V2eVl9dF92dlt5dGBxc1h7cFlz +dFd6cWByclZwc1lsbVhvcltucVhyZlJQRjs7PDw2PzA7QDQ8OzZAQzc6PjRAPDU9PjI4QDM3 +OzFAPTc4OzQ+PTgzRDU+QDY2QTFAQDY8PTJBPjM1QTQ3ODU7PTJCPzoyOzM+OzU3PTQ7PzI6 +ODgzOys0PjQ5Pjg+PjFCOjg4PDQ4QDU1OjM5PDM2PjA4QTgzOjBCRTdFQzRMOjszPTZCQzk1 +PTVFPzpBQjdDQDg5PTo4Pjg+RDY8QTVDRDw9QjlFRjhbW0Pu+6f///n///////////z///v/ +//////////z9/PT1/ur+//z///n8//r4/+n///r+//n5//Lx/uj8//b+//35/+/u9+np9uPh +9Nfc69be9djT3sz1/+zu/+/5/+z5//L6+fTx+OHx/PP3++Xp9eT0//r6/evw++////P9//v/ +//f1/+70//j///L1//Lz+e/t8eLs++rz9PPz9+309e/z/eF9VmlISz+ATUNpQzlSQDpMPzNJ +RTpNQDdjSD50Rz1rSDpwRj9mRDZLOjdEQDxWSDl/UTqGVjuJVkWCVj99STxcQjZaQT1NQDRO +PjtNQjJmRTpqRTJrRD5gRTRNPD1COzVYRDJlSDdkSDNsRjpbQDM+OzU8PjQzOzY/QDVdRzdn +ST5XRDlVPDNBOzBCOTg4PTFLPTlLPTZaRDJMQjVNQDI9NzY6OzY3ODY7Ojg+QDRFQDlCPjk6 +PjFAPDI+PzFCPDZWQjZXQDJMQzVMOzRHQzJBPjFEQDlaRDVVQTlBOjE8OTc2PTA3OjJHTTaB +dVFxU0hCQTU/ODU7OTFTQDduTzZrRztLPzdANzM7PDJMPjRiRjhhSTlKPTk+PDE5OzQ6PjRZ +QTl4Tz1xSjlaQjhMRDlGPDZmSzdvQzpoRDpgQDxMQTRBPjU6PjBUQTpbSTtrQzpbSDpUPjg4 +PDU7OjY1PjY7PTVOPztTQDFBQjZCPTU4Ozc6PTM7OTQ7NS8/OTVOQDpQPjhIQDszPC04PDk4 +QDRQPz5APzFEQTk+QTg+PjNBPjJGQTZURjZ3UD9zSzxoQj5OQjVNPzlDPTZERDpdRTVqSTlY +RDhDOjY8PS08PTk5PjFMQT5SRTZSRzpLQzhHPjhJPjBaQz1ySTdtR0FRQTNHQDg9OS5HPDhZ +STlURzo/QTY5PjA1PDU4QDE5PTE3PTI3OjQ3OzNAQDFROTY/QTVKQTlZRTNlST9MQjdLPjg1 +OTA3PDgyOjdIQjdOQTRORTFDQDQ1OTU1NjNAPjVJQDhEPjc8Pzo0PDY7PDg4PTc2PC85PDQ3 +OzM9RDg6QjQ8QTs2PDE9OTo0PS85PjtJVTx1YUaMb0ymhl2zk2jDmGzYr3nUuYLctILjvojq +tYzlxZTpwprrw47lv5zluovcuI7asIO+kWaoeViYcFeSak+Ndkyqfli+lWzguHnt1aTwwYvi +qHzbp3PanWbQlWnZnGzQkGTOj2DDklzLl2bNkF7RnWfLl2TBkWa/o2Lcs3vcwH7wy4/w0Jfs +zpPz25r21Jbsz5Tv05XuypDswo/jt3fhsXrbrHXZn2fLnmjQoGq8iluha1KJaUShd1OObEOD +Z0mAgFiFc2N+eVyHfWN6dlt4el19eV18eV19eF56dl54el2Adl11dVx3dVp2cVt2dFhxdFlx +dFttdFhzcFxvc1tvb1VtbU9wZFdKRjw8Ojg3OjFBQDk1PjQ+RDc5PTc4QC87OzU6PTY5OTQ0 +PTU+PjQ7PDQyPDNBPjc1QDE7Ojk0OjQ7OjguPDNCOTczPy5AOzk0PTQ8OTUtOjM4QDAzOTQ4 +PjM3QDU2PTRDOTk/PDU5NTkwOjE9OzQzPjU6OTU0OzU1PjE8QDVDQTdDPT05Qi9GPzw7OzJF +QT9AQDA+Qzk+QDU5Pjs8Rjc8PjZAQjs7Qz1HRT1aWUPw/6v7//H///3///L///////////// +//j///3///r////1//vt/ub3/u79//X///r7/ff2/Oz3//L5//Ty/+rw/+v0/+/r/+vq897x +9Ort+ufg7Nvb7Njs+fL7/fLz+e3y+unw9unv/O34//P2//X+9/Pt9OTt+eb4/fH5/+b19+b0 +/PT+//r+//n/9/L+//3///////3y8er8/vf1++jw8uV1VGdLSUF+TEJvRztWQzpEPj5LOzpE +PjtmRT5rQz10ST5pST9nQTRPPDlJQTlWRzd6UDaHWkKFVD6GWUB1Sj1lQT5VQTVWPztKQDRU +QjVgRjZpQTtmRD1dRDhPQD5IPjZUQDtiRTlnRD5pSDZdRTtBOjc0NjU3OjQ7PjVfSDlnSD1d +RDVNPDlDOTQ8Py9AOzREOjNUOzpTPTZTQDlGPDdDOzc6OTY9NzY1OTM/PzhJQDg8Pzc+PTM7 +PDI+ODRHPDZWOzNcPzZMPDVTPThJPTNMPTlEPzRaPjhWPzFHOTg2PDQ6Nzc3MzBNSjp8cFFw +T0ZAOzU/OjU6NjRURTZzTENwRjxROjU+OTc9NzJQPjxnSTpjQj1NNzZEOzgzODQ/PzldRzh6 +SkBpRDpjQj5EPjVRPjViSjd4RT9nRDZoSDtSPjc5NTU7OTNTRTZhRzhoRz5lQj1MPjs8NzQu +NjYyODI9NzVOPjZRPj9DOjNCODo7PC85ODY1Oi07OTU8OS5JOj1SQD5GOzk4OTQ4OzM7NzlJ +QTdFPThBPjtEPThBOjdIPzlHPTRcRjp8Uj94ST1jRj5QPThMPjw/PC5MPTheRDhvR0FWQzpI +PjY6ODc1OzI8OTdEQDVVRD1TQzlRQDxKPzROOjtWQjV0TT5rRjlUOzZEOTY4PTNHPTpaSjVP +QD0/OzM4PTk7PzI3PDw3OzE2ODg5OTI5PDVEQDdKQztNOzlMQjRfQ0BbSDhUPz1HOjhCOT05 +OjQ3OTlHQjZTQDtFQjY/Ozg6OzM3OjRGQjpHQDdJQz48ODc9ODQ3QDpAPjQ7Ozo8QDQ+NTw5 +OzBAPjcyOjE/PTc1PzU/Qjs7QC9VVUV1WUWIb1mifVavi2K/pnXVqnnTpnjUtnniv4bpwovn +yJbox5TmwpriwpncvJTbqnzFm2+qdlqUc1GVclqNZ02TcVSpgFjMkWbZs37w0KjtupTlrH7c +pW/Ul2zUlWjRm2/Rj2fNj2LTlWrThm7LiWPKlWzcn3rUmnrGiXO6kGfFpmzgs33ivIflwYzm +xY30yY/tx4rzwo/tvIXrv4rqrH7lrnzgo3PXoGjOmWzLoWG9jmGsck+La0ugdU2bbk14YkOA +el2Ce15+eGOGeGB6dVp9eGF4c16Dc195eV+BdltvdF1/dGNzcVp3dlh6c112b1t8blhydFVy +bldxcVt2cFtybVhybFdrYExORUU5PDg3PDU7PDo7OzVBOzs9ODY+Nzk8OjE/Ojg3PDI3Ojg5 +OzE7OzM8OTY2PDNANTg8PjU6PjU0OzJBPDs3PTZAPDY9OjU0Ojc4OTg3PTQ0PTU4Ojc2Nzg6 +ODU9OzlCPTtBOjU6ODg9PTc5Ozk1OjY1OTc0OzM8Nzs8OTRHPj1BQDVDPDw6QjdCPEBAQzhJ +QTs4QTg/Pjs6QTpAOT07OT1CPzk/QztHQjxdVkrw96L+//z///////////H4//r8//v9//b/ +//////3///bz/+39/+////////v5//jv/eno9dz1/Obo++Tp9+Hm9t7u+Obb69vP6cbf7dTj +9N7g7Nz5/PL0++71/fLx9e7u7OXt/PH6/fT0/+nu/e3x/+z1/vH///7///j6//P9//f8//T1 +/+33//D+//77//T7//H///j18Ors/Oz69/Lf5NN7TWVESjl/Tj9zRDhZQjtRQDtDQTtHQztc +QTtsSj1uSTxsRT9oQjpLPTVIOjxQQzR5TDyIVDyEWD9/WTl+SEFgRTNeQT5OPjNTPjhOQTFi +QTprRTlmRDtdRDdKPDlFPDVVQzZjQzhoRjtqSjxZRDQ/PDY4PDIyNjJEOjZaSjdrRTxbQTZZ +Pjk9PTRFOTk4OS9KPTNGQTVbRTpOQDZMOTU+OzNBOjE6ODM2PDNAPjpDPzhDNTY7Ojc8OzU8 +PTREPTVPOTNROzRQPzpMPTRNOzVBOjFOOzhRQTNVQzlFODI9NTk7OTE8OzVHRjl6a01vVEBE +PjQ/OjQ6PDJTQzZqTTZtQjtJPzhAOTY3PjNSPTlkSTZlSDxKPTc9NTI8MjU7OjVdRzp3TDxx +Qz1WPjlNQDVNPDRlTTV0Qj9mRTZmQT1LPDRBPDo7OTFYQD1gSThnSD1fRDtQQDg6OzQ8OTU0 +NTY+NjNKOjZNOzRDOzREOjQ9OTk7NTU5OjQ6PDM/PzRKQjlMPTRFOzg1PCw7Nzs8PjdOPj5B +PDFDOz0/PzlGOjs/PTFCOjRYRzZ7UT90STxjQDVSQDVDOjdDOzZEPTpYQjhpQztXPzVDNzU5 +OC48Njg6PjRHPjtNRTlRPDxKRDhMPjpGPi1YRT1vRjdrQDpOOzBIOjc/Oi5AODlZRD9QQTdD +Nzs6Ozg3QTU6OzM1OjU2OTcyNzU1PDRAOzRSOztEPTVTQzlZQjRZQTtMPjdJPzo2OjA7OTY1 +NTJIPzdSPzRJPDRAQDo6OzI4PDU+QjFLPTtEQzY9PDU3PDY8PjQ8PDc2PDM8PjYzPTQ7PDo2 +OzQ8PDszQjM7PTo8PC8+PD9NT0ByV0iJc0ydgF2vjmbGqnPXsH/Uo3TdsoDivIzjv5DftYnb +u3/jwY7jwpDXsYTKpHLIhWWVbleeeFSbc1agblOVcE+6g1jJoHPdvX/wyaXrvY/lpHfWmW7S +lGzTmWbcnG/VkmjalnbToW/YlGzMjWfUnW/crHbdo3vetIXdl4K4gly1nmvMp2/aq3zat4bi +xX/kvYfvv4jiwH/tvoPfrXTYqHHbrG7Yo23OmmjNm2e+imC1dliOa0eba02DZkN5YkuBelqB +eWR9eV2Fdl9/d1x8d2CAeV99dV9+dV1+dFt9cVt6dWF1c1l6cFhyc1hya1ZycVlvbldvbldy +bVtvcFh3cFtycFRvYlVMQj0+PDo1PjM6OThCOzo2ODg9OzU5QTA8PDA3OjE7Pjc2Ozc2OTI5 +OTc8OzI4OzY4OzZAODk4PDFAODU0OTM8OTg0PTVCOzwwOzRBPjc4Ozc9OTU3OTE5ODM3PTQ4 +PDVAPjhBOzU5PTM3PTU7PDA3PjI2PTIvODw1PzVBQDhEPjZDRTk3PjI7Qz03PDBHPztFPDk/ +QD89Pjg4PjtGPjlBPjo/Qj4+RThGRkJcXUP0/q76//L+//z9//v9//X///v///b///////f/ +///6//b3//r2/+n9//P///n5/vP6//T7///x+e30+uj+//vv//Dn8eLq+eL1/uji7+He5drS +59L1//Hy/u71/+37//D6//L+//7z9ePz/Ovy/PL5/Pj7//b6//L3/+3t/uv1//Lo8eXw9Ovs +/ujz9e/1/ent9+bw/uvz8+74/e/z/+7//f6EV3JRSUF5TUV6Sz1RPjtPPjU/PzhKPjRZQj5x +SjhrSUJyST1tQj9LQTo/PjtORzt+T0CCUz+HVUV+WTx7Sz1hRDdZRTxYPzRMOzRRSDtfQTVn +RTtlRjVjRzxROTg/PTlSQzpeRDpnSD1lRzddQzc3QjU5OzkwPjU/PzhYTDlqTD5dRTlTPz1G +PDFDOzc9PTVAOTVSQDhXPTlTPTpNPj0/PTU7OTI7OzU7QDJBQjlJQzZBPjM+OjU7PTJBOjpA +PjBWPzRVPTJWPTtLPDJOPDlBQTdMQTdYQDdYPzhFOTM7PDQ6OzU6PTVHSTx6bUhtVElDQDg+ +OTZDPDJSQjNySz1rRztNOjo4OTY6OzVLQjRuSEJYRjRRPzo9PTY8PDY4PjZjSDxuTj1rRjtW +RzhTQTZSOjdkSTRxRTlpQzpkRjZMQDg6OjY7PTNZRjFoSD9mSTxhQz9OQTg8PTkwOi45Ojg4 +OzFPPz1NQS1IOTs+PDE+Oz08PDU8OzNBOzdBPDdQQjdRQjtIOjg3Ozg6OTw8PzRHPT1EPDhC +QzhEQDs9PjFIQDlAOzVfRDh5Uj96SkNbRDRTQTlKOzlKPjhEPzxcSDZwSD1aQzVGPDo4PjI+ +OTk4PDRDRDZLRDlVRDtPQjxJQTdGPTpTQThtTUFlRDJUPzpFPzVAQT5DQDRZRzxNQjU5PDs0 +OjM2Pj42Njg2QDY7OzM0PzE6OjtAQDFOPzpHQTdTRj1gSzZeQz1ORTpIQDk8PjIzOTg7NDhG +PjdRQDdLPDlFPzk3PTs+QDlAPzxPQjlIQzk5Pzg9Ojw4PTM/QTo7PjVAOTs3PDc+PD07RTRD +OT0+PThBPj48SjZBPUFXWEJrWEl9cEudd1unh13MpnnUsH3ZtIPdtYLgvobguozcto/Wq4HT +rXjKqnHKqXHDnmrEiGiMb0ugelydcVatdFWielaxkGPEo3Dlu4vpypzuvJXlpHnWmWvZoHHX +m2vapHTdr3PaqH3UpHjVnG3MlGbVtYTjo4DZrnnpsIncpX/NlHmxeFijhlm4lF/FpXLXrXji +tH/juILlvYDktYHhr3jmsnPisXrfq3fRmm3KmmXJk1+5fVqYbk6Qbk6SZkZ1Z0CHeFp9fVuG +eGB8eF6Bd2B1dl2BfV59eV58eVt9eGB8dmB7eV50e1p4cF52dFd6cl1tc1ZvcVpwbVl0cVZy +cFhzcVZxa1trYVFJQkQ0NzczOjkyPjQ4Pzw8PTc9PT9CPjU/PDQ7PTM1RDM7NTY2PTI1Pjky +PDQ9Ojg4Ozg7PTs9QTE7QjI0PTk3PzU4PzY9PDk7OTc4PjQ7PDg1Ojo9PjU3OjY/PDg2PTdA +PTVFQTg6Ozo4OTU0OzQ7PTs4OzU5PTc8QTNEQjtEPjhCOjc8RDo+Ojo6QDtGQT1FQTw9Qzo7 +Qzg9QDU+PzxCRDg/QzlBQzxJSD1aW0T1/7D///v///X///r///7///////////////////3/ +//////////b///73//X9//v6+/ry+eb4/+3////w9u/m8+Ds9OPk9eLY7s3i89vs+eP08+7y ++u3x8ers9Obz+/D+//35//H7/+/7/+3u//L///zx++fk+93u/en8//b+/ff//vv////5//P9 +//v////57uzm9eH9//78//Hy/Onz+OWCU2xJS0GASjx3STtaPjhJQTdKPzhIQThfQj5sSjly +Qj5wSEBrPzlMPjhCPzlLQjh7TT2CVTiGU0OJVDqBTEFgQTZhQj1RPTRQPjhSPzVZQTRnRTRr +QjljPzhOPjNHQjlbQzhlQzdoRTpySD1eRjNBOjM7PjMwPC4+OzhWSDluSDtbRDVbPzlCOjVK +Njg+ODNKPDBVPDZaRjlWQzlLPDZDOzg6OzM9OjE4OjJAPTRCQDZFPjdDOzc9OTFEOjZCOzRV +Pj1WPDdUOzlSPTJMPDdIOjFLOjlbPzZURTxENzQ2OTI9NTU2ODNKRDd3akd5UkRFOTRBODNA +OTVSQTdySztzRj1PPDhHODc+OjZSQTdySTpjQDpTPThAODI+NzM9PDVhTjhzS0BrRjxdPzpR +RDVPPjloSDZ3RT1qSDlkPTlKQDZEOjk5OjZZQTVmRzxvRj1kRj9ROzc6PDE3MjU0ODk+OjhL +OjpKOjNFOzVDOzU/PDZAOjY4OzRCOjo+NzJSOz5QPTVHPDs5OTA/NDk3OzJEPDY+OjVHQDo9 +QjJHPDZFPjZKPzlcRTd4UUF3RDxfQjlSPjZPPjRKPTVLOTZbQjNrRT5dPjRFPDY5NjA/NTk6 +PjBJPTtKRTNSPT1NQjFOOTxFOzRWQD9vSTdpQTxUPTVEOjBCODlEPjhXQTdOOTlBNTg7ODM5 +OjQ6OS81OzU3OjU4QDI7OjU8Pi5NPThHOTdVQThaRDZhPjtGOzBKPTg8OTA7PTM2PDRGQzRP +PThIPTNAOjs6NjQ7OzdAQjROQDdHRjo/Ozg7PDc2OTBBOTc0PzQ7Pz42PDQ6PjwyOzRBQT49 +OTg8PDg6PDM+QDlTUENpUUN6Y06ZelioglvDmnDOroDXs33droXftovcsYjXtYPTq4HRpHDD +mm/HqHPHl2i4eVuGZkmhelWXdk+kelapfly8il7Im3bktYPry5/00Kr1waDet3ninX/VqmzX +qHXSqXLSn2/Kn2XEiWPNoG/br4TUoHLSp3rdrXPhqXrQj3C7hl+dZlOOcUycg1i8nWTKoXPY +rnrbuXzhtX/brnffrHHctXnbqXPPnGzHlGjAkly1gViSbkySa06GZkl5YkSCdVyIgWOBd119 +d2F9eVt9dmB9elx9dV13d1x6d1p2dl19bWB2d15+cmF1cVt7cmBzblh4bl5vcVF1c1pwcFFy +cV9tb1ZrXlRORTs3PTQ1Nzk1PTY8OTQ+OzY9Ozk+OjY7PDU8OTQ2PDI1PjE2ODNAODg2OTU7 +OzE4OzFCPTk3PjVCPjczOjM9PTo1OjU/Njk8OjY5PjQ4OzQ3OzI8ODg5PDM8OjU4PDRBPTBF +PDpAOjU9PDg8OzU6Ojc0OzA3ODo3PDRCPjxGQTJGPjo+PjZBODxBPDJEPjxEQTw+QDU8PDc4 +QDtEOzw9PjlDPTo/RTZKQzpjX0f0/7H8//X9//z////////8//T7//P///3////8//b3/+n7 +/+7+//P7//D////2//Tz/+n8/+/+//Pv+evn9Nb1/un5//Dd79rq89jt7eTg5dbb7tP1/+/t ++u/7/vb3//D0+ezs/uv0//D1/vHt9enz/fD2//L1+Or1++79//Xy//P6/+vs/97t8+bu/Orz +//P4//X///7/9/L//vv/9ezh5dB9VmJCTDp+TEN2TTtbQTxGQTVFQDZIRjZgQjxySjdoSD9t +SDxhRTZSPzQzPjNVRzdtUDqEVT+BWz+GVTt2UDxlRzVXRjpVQTVNPjpNRDZfRDVkSTFqSjpc +RDZQPzc+PzFTRDpiSDpqSjhpTDtaQzZAPDY2NzMzPjU3PDJYSjluSTlcQzhRQTRBOzRCOTQ7 +OC5DQDZHQjRZRTZSQTJMPzk6OTA7OjI5OzA4PTI9PjA/QjNAQjU9PTM+PTE+PjJDPjRSQDNZ +QDNMPThOPTVLQDVFPzRKPzZZRTRTRDlGPy4/OzU2Pi8+Ozc+RjN9bk9xU0JJPjE5Oiw/PDZS +RTR0TTxsRThQODY8OzQ4PDFPPTxsUDRjRTtIPjY+Oy81OjM3QC1gSzpwUDhpSD5VQTRSQTtM +QzJsSD1wSDtxRD5XRDVRQDg1OTM/OzZURDNmTDxpSz1jRT5OQTo2ODYyNzMwNjA2OjNBQTdK +QDZAOzQ9OzFAPjk4QDE+Ojw+QTFEQTdIQS9PPjhAPS07OjY3PS03ODRCQDNBPTtCPjg9Py87 +PTU/PTVGQTRWSjZ2UTx2Sj1gQzlRPThMPzhIPzJAPTJZRDVpRz1fRDlAPDBAPDcyPTA9QTI/ +RThQRDxLQTlPRjhLPzRCPzJWQjxwSDZqRzlLQTRDPDg9OzdBPTVVQzlQQDw6OjQzPTU5Oz02 +PDE8OzU1PDQ3PTo5Oi1DPzlIPjJEQDtPRzNbRzddSjlJPjhGOjU7PDY6PTEzPi1DPT1LRy9K +QTg6Oi42PTQ0OzBDQDVJPzdCQTtEPTQ2QjU6PDU7Pjg8PTI0PDg6PC41QTQ3PzM7PTc5RDQ6 +PDY3RC08RDpGVD1qVEZsXUSMdU+fiVa1lnC/nm/Gp3nMqHrSqYXNq3DLqXrJoWq5i2W8mGvJ +l2y8hWOtflaCXkiAcUuDaUiNcEyri1vCi2bHmmvgwYjs2abx367w0qrtvpjdrHvZqXPLpGrF +k2e9jGTLkmzOoXrPoXTHkGq7lGHAk2XNqGrQpXHJmmy+kmawfV+Va09+X0h5b0injV6+o2TV +qnvTsnHer3vcr3jbr3zYtHvUpnS+lFnDj2a5i1WcbE6NbEiJaUN1Z0uHeVeAfmN9dF58d116 +eVp9eV15dl96eF58eFp7fFyAcl13eFl7dGFzeWGBcllxdFh6dFtwdVp3cllza1lybFl0cFl0 +blZsYlNFPkE2PTgtOzQ6PjY/QDI8PTM9OjM8Oi46PS83PDA1OzQ4OjA1QDU4OTI8QDo6ODM4 +PTZDRDI8Pjk9PDQ1Pi46PTQ1OjI7OzA0Py89OzUxPzI0Ojc2NzU4Ozc0OjA+PTY+QzY7OzQ+ +OjU3OjI3OjU3PTAyOzcyOzAyOzU/QjlEQThBPzpBQjg7Pzg7PjJEQDw8RDRAPjo3QzM8RTk8 +QzhBRDw7QjlIRT5HSz5kW0Tu+Kv+//37//L///j////////////+//r2//D+//b////////9 +//H+//Lw/e31/+r7//H6//P2/+/y8On2//L7//vv9+3j++Dh/Nzo+OPh8eHi8tv1/+/1//P1 +//X6+ert/Pb6//X0/u/7//fz//L1/+79//f9//7///Hy/en3//v////////9////+evx8uf8 +/u71/u/z9fH1/uzu9+Tp7OeBVmZNSUB+VD1+SkFUQThMQTxAPTVFOTZaSTp2Sz9qQzpwRjpq +QTlMPTdEOjZQQTh3TzuDV0CFV0GKVzd6TT5jQzdXQDVbPzlFQTdSPjtZRjNsRjplRDllQTdL +PDJFPTRPQjRlQzpkSTVoRj1cQTc/ODwyNzU6ODI2PzJWRDVnSjdZQjpSQzRDOzU/PTFCOzVG +OTVUPjpURDlYQDlDPDVKODY5OjVAOjY2PTFFPTc7QDBJPTo9OjFAOzU9PTFHPzlUPjNTPDRQ +PDpSQDZNPzdDPTdNPDVdQTlZQjlDOTc5PTA7NzY2OjFCQzx2b0l3V0lBOzNFOzg7PjBYQjZu +TTlzSD1KQDZGOjU6PDJPQjhqSThgRzZMQDg6PjY5MjY9PDdhSTl0TjtpRDpTQzdRQDNXPTts +RzF4S0BsSDhlRT5KQDE7PTk9PDBWQjhiRDhmSD1fRzlHQDQ+ODI0OTQ/NjY4OzNLPjlFPTNG +PjVCOTY8ODRBNjc+PDdFOzdBNzJJQDdIQDVJOTYyOzU2OjczOjVCPDM7Ozg/PzdBPTo8OzBA +PTNAQDdZRjpoTjluRj1ZQjRTPTNJQzdHOzpFPDZaRzZnRz5XQzZFOzU9Oy86OzU4OzFGQkBP +QzZPSDpPPzhCPzNHOzdRRjRsRDxiSDNVPjhAPzM+PzM/PDJXQjxKPjM4ODg0PTA3PzcyOS40 +OTsyOzI1OjszODA9OTNJPDdIPThWQj1cQztZQTZLQDU/QjE8PDYwOiw5NTRAQDJPQDtBPTZG +PTc2OzRAPDk+OzNKODlBQTFFQT05QjJAPT03PS07PTw6Ozs4PSo8QTo+PTc8PTc8ODk2QDdB +Qjo4QTNGVTxoTz5oVkF+dEmeflevkmPDo2vBomzNpXrBpHbHmm+tjWCme12deFauh1uwhl60 +iF6teVukd1mOWkV3T0BiW0SAc06sjmTSrnneuIndvonfxI/tyZbdsX7UlXS/k1q5fmauiVu5 +lWy8hFq5imK3fFueelWZfE+jdVOfeFemdlClh1uOclKMeVOBYENtWERnVEBkW0CTgFHCo2/W +sXbUsXvkt3ratHreuXjOmXKwi1jDkV+6gVuZZk+IYUaKZEV7bkaEfWF9fFyEeGV6e1qCdVp5 +d1d7dF56eFyBdmF3eFp/clp4clt3d1h7cF96c1l1c114clpycFh1blVzclx2bVhyblhycFln +YU1IQEA0PDQ6PTY3QDQ+OjU2OzI+Pjo1PzU3OzQ1PjI7Ozg2PTQ5PzE1NzQ2OjI3PDQ3PDg/ +PzgxOTU2OjI+PDY4OTQ8OzU1PzE3PDUzPTI3OzkyPi88OjMxODJAPzg/PTNEPjY/PTQ+Nzo0 +PzU7PDg4OzY6PzY4PDg6PDVBPzxLRjVDRDw9QTlBOzY9PTZAQTRFQjs9PTdCPTc3QjFCQjw+ +PTZFRj9ASTxKSkdbXUT3/7D///////z6//H4++z7/+////////////7///n///b9//n6/u36 +//P///n////////6//j+//n+//j6/vji7ODd69fx/Obm8eXc39Pf6Nfl6tnl/ufy/ent++33 +//Lx+e71/+r0/Ov3/uv9//n+//D2/vD1/+nt8OPz/vv///P5//P3/+7w/+nt+e7s9+r5/fjy +++ns7unz8O36/PP7/+2AWGlIS0B8TEB8SkBfQTxNQTdNRztARTZdSj5tSTtxQ0NxSD1uQTtI +PjRCPTxJSDt1TECFWDyIXEKHWEGCUkBrRzpTQTxNRjVKQD1PQD1eQTpoSDtvPzljRDhSQj1G +QDdSQTxiSztqST1nRjhhQD9APTI+Ojk1OTdCPTpURjdrTT1dRTZVQzxJOzg8PzI/OzlEPjVS +PzlXPjtWPztMQDhFPjFDOzg2Ojc8NjY6PjdIPjk8PjZDPjk5PDNJNzo+PzRYQzxVQzhbPDtS +QThMQjdGPjpKQzhZQTtSQzVLQDg9PDc/PDQ6PDRBRjVxZFF5W0hGQDtCPjI/PjpWQzZ2T0Bw +STxUPz9BOTU+QDxQRTVpR0BjRj5JQDNCOzQ1PDRDQDZgTDp5Tz9oSzlcQTdNPjhcQTxtSjh0 +TD5rRUFgPjtPPTs9OTVGPjpcQzpnSTtoTD5gPj9IQzc+PTU3PTQxPi81PjZLQjlLPThEPTBD +Ozs8PjVBOjg7OzFBOTU+PTJHQDpIQzo/Pjc5Ozo9ODgzPDY9PTNBPDpDPDc8Ozo/QDU/PzlB +PThYSTpuRkJrSTldPjpLQTlMPjhEQDRKPTpTQzliQ0FSRDxHPT06PTQ+PDg5QDBGRDxJRTtO +QT5PRj5PPzlMPThRQjttSztnRj5RQDpIQjk+OjZDQDtWRzlQPjk3PTE3Ozs1PDc8Njc3PTQ8 +OTs5OTM7PTo7PTRKPT5MOzhXQkBjSjpcQjtKQjxFOjZEODk+OTQ4OzY+Qi9SQjlJPDg8PzRB +Njc3PTZEPTlJPTdQRT47QjJCPzs4PDE/Pzg2Pjc/Pzw2QTVBOjg6Pzo6Rjs8Pzk7QDw4QT86 +OjhETj5wX0peWkd7ZkmQfVanh2K8oHG/nXO/nHW9lnCpglyTfl2aeFajdlChf1eddmCXdlSb +clqVc1WOZkx0WEplRzZVVUB1eka6pnTQpnTGpnHKsnHSrXrOm3CygmGdhVmqkmacaFiNflKi +flWQbVCXYk6CWkqCa0p+XkeTbk2EXUqCaUeEY0VxXEZqTEFsVkZbTkBWTz9hXEmsmGHYrnfd +un/eu4Pcs3zOrm/AimWpilO+mWW3hF2YbFCMbUuCZkp3ckiEgmKFe2V9eGV/eWB7emB9dWR7 +e11/fmF3dlt7cl18eVp6d2V1e1x8cmJ6e1x5cF5ycV+Ddlxyclt2cltxc1lzcFZ4b1ZpXlFE +QDw3Pjk7PjM6OzY7PDM7Pjw5PTpAPTo4PTY8PjY0PjE3PTk2QjU8PDc1PTQ+Pzo1QDVDRD43 +PTY8PDY2QDg5PjY9QTc4OThQUEk2PTk2QzU1PDY3PDc7PDQ7PTI9Pzg+PzVDPTs7Ojg9Pjg3 +PzJCOzwwOjU7PTo1QDpNRjtERTpLRTo8QDk9QTRFPz1EQT5GPz5CPDg/QTw9QDtEQzlBQztC +QzpEQz5FSTtlYk7y/Kj8//n///z///////////////X9//j8//D////+//f5//D9//L///79 +//jy/+z4/fD6//L9//H5//T2/+37//j9//jv/Ord9djv+uXs/efp9uX7//n1/+/r+eny/Pf4 +9+30/uvv+e3t++H6//T3/fH4+/D3+ej8/vfy/ev48enp8Nvo9eP5/fb+//v///v9//T5//T7 +//f9//7////57uN2UVxISkWAT0F3TT5lREBGPTpEQzxBPjNiQkBrSjhuQUJuSDtxRj1RPTRE +OkBIRDVzTEJ7VT+HV0KDXDx9TUNhRTtYQDZSQDRLOjdNOD1fRDdpRzlrQztgQTlSPjhEPjVQ +PzpiRTptRj1pRzZcRzo6OjI6OTgzODE8PDtRQDlqTEBcQzZRQztFOjk+ODI+PDg9PS5OQTdU +QTxXQTtLPDZBPDQ/OzY0NzI5PzU5PTBGPThAQDQ+Ozk4OzNGNzs5PTZYPDtQPDJUPjlMPTVJ +PzVGPzdIPThaQjpZQjZJOzs9ODY7NzU6OzVAPjZyZEZ0VEdIPTtDOTRGOTlOPjVxTUFvRzhS +PDxBODA/OTlXQTRnRj9dRDZKQjs+OjY4NjA9OzdgSTV6TTxhRDhXQDtUQjhWQzpuTT12R0Fr +RztiQjtMPTo7OTVGODhYPzdnSjphPzdbSDpDODg7MzgvNTkzOTIzOjdFPDVGPzg7PjI9Ozk3 +PDQ8Ojs0OzM7OzY0PDA+OTg0NzU7PjUzOjY3ODY5QDk7PTI3PTc5OzY2OzozOjQ8OjtDPTBV +RTdtTDtgSjtYQjtFPTVKOjxARDREPjpSRDVkRj5TPjVKPEA8Nzg9ODk9QS9GQztIQzhQQT1N +QThJPjhDQTZTQDdqSz1kQDhOPjdBOzg/ODNAOzRPRTlLPj46ODI4Nzc2OjY6NTozNzQ1OTcy +PC45Nzk4NzJLPz1HQTNZRUFfRDZYQUBNPTtCOzZAOzU7ODQ3OzU/PjZMRDlHODhBPDo8OzU2 +Oy1GQDxLQDdHPTw7PjI7PTozQDM/PDszPDQ6QDczPDU8Ozc0PjVAPDU6Ojk3PTc6Pzc8QDg9 +Qzl1Y0tlVUeBaEmJdVSmhGOvmmq9mHO8l3G0g2F/akmBZEp8ZEmBZ02AYkF8YVRrY0WAZk58 +WEdqT0dfQkVbTEBkSEVLTDtsbUuPf1aFdFaBb0yRf1qLc0t7ZVB1YEeHfFaGaUxoU0h4YUaC +W0x8X0dyV0R5XkptT0lzVkJmWUJ8XkluWEZpWEJjS0JRST1UQkJLSTxgT0KJkFnRtXbgun3i +u4TasXrOr3XBi2y6k2G/kWSwhliQaU2IZ0Z/YUV7dk9/gmSDeV57eF9+dGJ7emB9d2N1d1x9 +dGByel57emR+eF18c196c1l7cFl0dFl4b1t1b1V4cF9wblhzblhyblt0cldvalFiXFFEPzw4 +PTk5PTQ1QTQ8PDQ+Ozo7OzM9Ozg0PTE7PDcxOzM+ODc3OzI/PDs2Pjc9Pjg3OzFBPDw4OzM9 +Ozc4OjdANTY5Pjk7PjQ+Sz5AQkY4Pjc3Ojk3OzQ5OTk6PDY7OjdCPTQ+OTY2QDg8OTc1OzVB +OTo0PDc9OTY0PzFMOzpDQjlHPTw7OzxBPTk+Pj5IPz8+Qj4/Ozo/Qz09Pzk9RDxDQUBBPzxF +SD1ERjpmXUrq86X6+ev9//j///////f///7////////////////////7//j4/+/+//j///v/ +//////z///f9//P2/uvr9ubl+ebq++bi8+HY7tHh89rb7NjW4NLy+/D0/fb+//r2/+/p9+Xr +8OHs9+vs89/r/uj8/vf9/+rx/+n0/+////35//L9//z////////7//X0/e77/vL///f49On5 +/+7y9+vv8uZwU2RPRDiCTEJ8S0FYQjxMQDhCQDlKQTdVPjlzRDtrRTt1SDpmRjdYPDU4ODVJ +QDNtTTyFUzyKV0SDVT18TEBjQjheRThPPDZLOzdHQjpkPztkRjhsRDdlPTdRPjRFOzZOQTRm +RztsRzRpQj1ePzhAPDc7Oi80PjI7OzJPQzVlSDdgQjRRPDhHPjM/NTZAODdFPjdMRDdWPztW +QjNOPTg/Oi87PDQ6OzE0OTM6PjJGPzZAPTU7OjJENzM5OTZCOzFOPTVVQTZTOjhSPTFTPzg/ +OzJQQjhYSDteQTpHOjNEOjk4OjRCOTY9OjB2Y0pvVkJIPDk8OzVCOzZTQDhzUDprRz5TPTVG +ODc8OTRXRDZqSTpZRDlOPjU/OzA5OTQ8PzFnTT5yRzhoRD1VRTBZRDpRQzduSzxoRzx0RD5Z +QztROzk9OzQ7OzRcQzRlRz5jQjpaQTpGPDczNjczPTE2OTA7PDBJQDtAPDVBQTk1PTA+PT44 +QDNAQD83QTA2Ozo1ODQ9Njk3NzEzPToyNzM0Oiw1Nzc0OTQ6PDg2Pzc8Ojg8Pjg/OzRNRzpg +Tj1bST5LQTVFOzw8Oy5BOzs9QTNRQD1WSTdcPjpFOjpFPDg1OTQ8Py9EQD5LRjhQRDtOSDtH +PjdBPS5RQzpnSDZkQjlKOjRCOzZBPDVAQDRWRT5PPjg9ODgzPC45Qz41NzE4Ozk0OTI3Ojk6 +PDE4PjVHOzhKQDdZPzdfSDlcQT5EPTNCPTpDPzQ6OTcwOzI8QDhLQzRGPzlHOTQ7PTs6ODRG +PDxPOjVDQDhAPTY4QT1APDY4PTY2PzY4QDQ4Ozk+Ozs2QzE6PzU1PDM8Ozg3QC87PzU2RS1j +ZUxoUzl9cFGDbkaliWO0lmG6mHe3mGmJYVNvXEVqTkNiT0plU0ZcU0RgVEVeT0FoS0RbTD5c +RENVS0FfT0R3Wz5mS0BWRDphT0VyXUhvU0pxUj95Y1OHbE5lUUBtXkhyV0JqR0FdVz9yVEdg +UUdwVERnTEFjT0JkSz9iTjxoUUdjVUNnST5ZVTxSRj1BRDVORD5TTDmUjVfRtHrdtoLcun3Y +sXfHqm7EmWnBnWrCmmeqe1uNaE2HYkh7Yz99dVSAfFyCf15+eWF9dV99d2F4dGB8eV11d2CE +fF9zdF1/cFp4dF1/dV91dl57cl91cl13c1t1cFl2clZ0blhzcVRycFhxblVoXlBGQztBPT00 +OjQ+PDQ2PTU7PDI+Pjc8PjQ6Pjo6PzE9Pzs2OzU4Ozo5PTI5OzlBOzI6PDg/PzQ6PzZDPzc6 +OzI8PDU1PDM6PDhIRzc+PDs6PTU5QjE4PjE9OjQ4Pzg9Pjc+Rj08PzM1PTM6PDU8PDY6QDM3 +PTEzOTk5Oy9FPTdFQzdEQTxBQDc+Qzo+PTlFQT9CQDo/Ozw0PzlGPTk8QThGPjxDQThFRDxJ +R0BoYkf//7v///////n///v///////////////////////7///j9//r9/+////////////n/ +//n////4//L9/vfz/ufy++vr+ePv9/Df79X6+e/2/evt9+zu++n3/fDt/evt/ev09/Hw/Or9 +//7///n3//H9//n29fH0/Ovz/vL3/fT///bt/+z0/uzy+ez2/vX4/vH9//H0/+747vH5+/D7 +/vHr9tt0UGZMRz2GU0V8SkNkRDhGPjhIRDhEPDVYQzpsSjtzRz5uQz9rRzpMQjNEPzZCRTNv +Tz2BVzeDV0KAVDyCTj1mTDxaPTtSQDZKPjlPQjZhQTVpRjRlRjhjPzlNPzhCPDVRPTlcRTdp +RThkQzZiQDc9PDI8NTUuNzM/NjhOQTVjSTtZRzVXQjtEPDNEOjhEOjBEOTZSQTVYRTdTQjlM +OzZDPjQ8PzI5Ni82OzA2PDM/PzhBPjI9OzI8PjJGOjU9PTZUPjZRQTJcPjlOQDNRODk9PDFR +QjtWQztfRTdMOjU+PjE+ODY3OjE9PzZvYUd6UkhDQDlAOjM8OzZURzd0UUFwRjlTPzc+QS4+ +OzhSQzRrTT9cRTZIQjpAOCw6Nzw/ODBeSzx3RzleQzhbQzpSQDhYRDZsSjlxRzdqRDtjRDlJ +PzpBODhDOjldRThnSj5jQTdYPDlDOzc7NDcyNzI5OTQyODlGQDk7OThAPzc2PDc1QDY3OjM0 +OzE6PDU1OC82ODkyNTE1OzYvODM4OzUzPzk3PDE4PDY6OTc4NzY7OTQ9PTY6PDM/PjlEQTRB +Pzs/OjI5Ojc2OTU6OTs/OTdAPzVLPTpEPTlEOTs8PDE6OjY5Py9HQjxHRjhQRD1LQzdKPD1D +OzVPQTlqRzpkQDhMPzJGPTZAOjM8PjlUQz1MPDg5PDU3PDQ1QTQ8OTcvPTA3PDYzOSw2OTs0 +PjRKPTRLQDJaQzlZRDNaRT9EPzZDPD0+PjQ4PDc2OzA8OTNMPjZFOzM9PTg7Ojk4PjFEQTdN +RTVKRDc8RDM3PTc0PzVAPTozPTFAOkQuPSo7PTs0PTE+Pjo4OzM9PDk2PTs8QDc+PDhMYUp4 +XUZtakyHd1iiiF6yj2u4lm6pcV9zYUdiTz5UTD1MSz1OSEBPTTtUTUFZSTxZSEZTRjlXS0FP +SjVQSkVoVT5jTj9WSkJcT0GDe1KCY0JlVEFhVEJ/aExpTjddSD9pVUNeRkBtWURnSUBlUz1t +WUFwTkFYTT5kTD9aT0FwTz5vU0SKVT9zTkBnSzlbRD1KQjhYTD2kk1bPsHDauXvcuHfJp2rH +pGq+oGnFpG7BlmGldFODZ0d/Y0Z1WUSBe1qAe1+BfGB9e2CAeV17e2F8d191d117dlp9eWB6 +eF51dF57eWJvdVd9dFlxc1d5c1x2c1R5bVxzcllxclt1blhzalJ0blRoWkw9Pzw5PTc4OzA6 +QDg6QDU6OjU7PzU7PDI5PzI8Pjg2PjI0PDYyPDQ9ODUyPDI+PDU4PjE/Oz01PC49OjU0OjU5 +PDc4PTI+PDs5QDU8ODc5QTc5OzE1PDc8OjY7PzU9PTU/PTY+OzY0OTQ8PjE4PzA7PDcuPTM3 +PTQ1PzBGPjpBQzJHQDs1QzI/PDk7PjVHQTo/QTw9Pzw6Pjk5QDdBPjo9QDpDQj5CSTpMRj5o +YkTy/6n///////////////v5//b4/+z+//r///z///7////9///8/+31/+/3/+z9//P////z +++3y/erx/fDn8+Tq+ubk797b8drn/Njp8+Le5NbX3c7r++zp8ubl9ur0//T///vu/+3z/O30 +/uz2//zp8uT9/fv59/Hw/Ojs++Ty/+79//7z9ez1/vLx/ez6//vy9+f9/vr7+/D9//v79evk +39dqTlxBSjuHTkJ9TT9sPzhJRDtGPzdEPjlSQzhsRj1tRj1yQztpRTZSQjo7OTRHQDdtSDR9 +VUCCVT6IVD54Tz1kRDhVRDdUPTFNPjZJPTZcQzhoQThmQjpiQDpRQDpGOTRFPjhfQzlgSDll +RT5cQjdBOzUxOS86OjY0PTJQQzpjSjtgQTtOPjRHODs6OTE9PDQ+NzRQQDhURDlXPzdMPTVB +PTU/NTI0NzQ4Oiw7OTM+OzdEPDY7PDA+OTg+OzRKOjlJPzBXPTpOPzVZQDhIPjRFQDRKQTZe +RjtWQTZOODU+OjM8PTc6ODdAOzFvY0NzVEhGOzk+NjM8NTNLPjlvSztwQz9OPTZAOjk3Py9U +PzpkRzleQTxEOzRBOTowNzBDPDdeSzl7Tz5dRDlbRDlWPDpdPzdzSTt1R0BvRzxVQTxIPTc5 +ODVEPTFbSThhRDheRzpTQjhGOTkyOTAyOjcvOS04P0E3NzUxOjUzNTQtPDQ1OzQwPi8wOzIt +PDAyOTcuNjIyOjIyPDMyNzcyNTQ0NiwxODEzOTI0OjYuOS85NTYyMzI3NjUyNjc+PTk2NjM5 +OzkzOTQ1Oy8zNzUyODU6ODU7OzU+ODs1OTQ8NTk2OzU6PjdARTtKQTdHQTdKPTlGPDlGPTdS +PjpoRTVjPjpOPTM/PDg5ODFCOTpTPzVLPzs7NzEyNTI2OTcxOTE3ODc2PzY7Nzg1Oy82PDhG +Py9PPT1cRjdhQz1YQTZDOjtDQDQ/OjY3OTIsOzBAQDZGPThLPDk5OjY8PzE8ODhGQjRRPzVD +QzY+PTsvPTU8Ozc2PzI+OT41PDQ+OTw0QDE3PTs4QjE/Oz84QDQ3PDg/Qjg7PDlCTz1xZE9i +X0uSfFGskmmniWq3l3OlclRoWUdPSEBDSjxDRj1DVjxSRzxESDdYST9ISjVRRkBFSDhJRzxO +UDdiSz9RRkFPTDtcT0aAa1ecc1mEaE96VkZ7akR5WklxU0BxSENNST5kXkdbTT1eVEJuTkdq +S0FmR0FSSzttTUNoTj1+V0x/WD6RZ1KlcFVyWEZSRzhWVEOsl1/aun7atH3WsXnSqXXCoGXE +pnTInGe6jWCidFaAYkKFZERuX0mHfmB9emOBfGV9fV6Ce1p5dWJ8e2V5dF98dV98e115dFx6 +eWJ2c1x4cl57dVx8dV1zblp2altzdVxyb1pwbVxzblZzb1N1bVJhVlFBQjk3OjU0PjU2QDg+ +OzM8PTk8QDI3PTo/PDg3OTIxOjIzOTE0OzA4OjBBPTY6OzFDQjo5QDk9Pzg0OzE7OzY3PTc3 +OzQ2PzUyODM+QDc+Ojc7PDI5PTk4PDA1OTE9PDFBPDU7PDI3OjcyNzA/Pjk1PzE9PTsxPjU6 +PThAQDNKOTlAQzhBQjc7QTc9PzZBQDdFQzg5QDlBOj03PjZDQjpEQj1BQzdBRj5HRz9nXEfu +/Kj9/+////v///z///j///j///7///v////2/+77//X6//T9//P6//b7//P7//T8//T6//n3 +/vTr9eTy/uf+//f1+urn8+jf+dTh8ODZ5dPg7df7//n+//7z9enr8Ojl++bx/+/6+Pf//fL9 +/fL8//v5//X+//z/////+fXy+uv+/vv5//P///r5+/Lz6uHu++rx8evp69/1+Ofl9eHu7uNx +V2hKR0R/VEeHTkZoRT9RPT1FQDdEPD5OQjlwQ0JrRDxwSUFrST1VQTs9PTVEPjhoTD5/WkGK +WUSGUz98TzxnQzxTOzhSPDxLPThPPzpXRDZoRztqQjhoPj9OOzlMOTpJPTBgREFnQjlsRD9X +QjZBNz4+PTY3OzI8NzlRQDhjRTtcRzxRPzhKQDhBOzdEPDhCOjhVPTlXQDxYQD1OPzdKPTo4 +OTI/OTcyOjNBPzZAPzxFPTo4OjFDODhDPTtCPjlKQDdTPzhXQjtTQDROPDRAOzROPDlaRjhe +QDpRQDlEOzM9Ojo7OjRCPztwYUVzVk5JOzU/PDw+OjFRPjp0TD5ySUFSQDpAOTBAOjZUQzln +RjpURTtGPzo8PTU7ODQ/PTdlSTxySj5iPzdVPjVVRDdbRzpyTTZzSUJ0TEFgQT5JPzhBOzlE +QTVeQzZjRz5hRjxVQjo/Ojw4PEAvOC83PDcvOjY1PTYuNTc4NzgrOzE1OjcxOzc2OTUvOTUz +NjMwODUyNy81ODg7NjYzOTkzNzIzNzcyPDMsNjM0NTcuNjI2NTotODE0NTkzOTQ2NTszOTI5 +NDswPTE0ODgxOjI2NjUwPTM1PDgxOzM3OzkxODE3Pjg7QDdEQENOPjtMQjpCPThGQTtMRThp +SD5fQThQPT5CPTE7Ojs7PCxVQTxMPTc+OjkzODI+PTo4OzE4OTw4NjY6OTk5OjQ7PCpKPTlP +PD1aQzdgRTtZQDlJQDhEPDlAOTYzODI4OTE5PzJMOTtDPDVEPT82PDM9QTw+QDFYPzlDPDdD +PjsyPzdAPTk/PTk2PjM8PThAPTU2Pz01PjA9Pj05PTQ4Ojg9QTM3PTc8PTQ5QTdrY01yVkaH +f1qjoW23lHK0m2W9gXRmTDVDPkJDPzdHQUFLRT9GRz1QSEJKRT5NQTtGSzlJRUBQSDlRVEh4 +TD5WR0NUVjyXdGS1kGbDinW7hmibeWDIi3OzgmulaFd/XkxiRj14YUxtUUaIW02CVEeNV0ho +Rz1HRT1WSD+PaFiZdFS2gGbNpHqxg2aebVNvTkt5ZkfKqG7Wt3zTrnXUsnzNo23GqW7OqXnH +mmm1g1eabU6DZkd6Ykt6bE9/fGGCe2mAfF6Cel58fGF/eWJ4d19+dmN6emJ/dmV6el+Ad2d5 +c1t9dmF7clp8bl5wbll4cFxwcFx0blh0cld1b1dzc1dxblxoV1FCPz42OjQ1OTc0PjM8ODc8 +PjhAOTo8PDNAOjs6PDU5OToyNzE6PjUtNzRBPTs6PTY8OzFBPTdAOTk9Qjk8PTk6PTc7PTk0 +OjU6OTc4ODM+Pjg0OjE9OjwwPDVBOT01PzRJPkA3PTVBOTw0ODVBQTk2OTY7PDk1PTY5PDlE +QDxJRTtEPTo/QT1DPDpBQjtKPzs/Q0E6Pzk7Pzw8PDg8PEFBPzlDR0NIRD1RRklrX0Ht+bL2 +++j9//r///////////z8//b+//v////////////////+//j+//j////1//Xz/+v3//P+//n/ +//f8//j3+e3y+eDt/+zl9tvf5t3p+uHg7d3u9+Ty+PL1//79//n7//T4//z//+vz//Dz/u3+ +//v1/ez0/u/6//b///3///n///ft/ezw//H6//v///z////7//vz+ez+//3///Xz8OVoV2BI +RUF/WUOBTkBlRzhSOz5BPDRHQjlURT5kRjxyRkBrRTppRDlTPzJBOzREPTtgSzt9VEGFWUGH +WUF4TzxrRD5TPTVTPkBLQDVPPzxYQjJqRj1nQDVkRT1KQTJKOzpMOzhfRDtjRThkRDdVPjZC +OTQ5OjY5PTM4OTFLQzlfRzhhQzdXPzdNOjg+OzE/OzY6OzRSQjlPQThcQDpGQDRMPTNAOTk8 +OjQ1Pjg9QDRBPDhBQDlAOjM/ODdBPjY/PjZMPDRRPTlUPjtTQjxNOzVFOjZLQzZeRT5bRDZQ +Pj5DNzI/PT07OTQ6OzduXkJ2VklNPDpAQTZBOTlORDZxRjpvSThaPzlAODdBOjlVRDhnQzpV +QjdDQDU9OjU5ODA5PTdoSjxsSUBgQzdWQjlaQTphRjVsSjtwSjluSEFcST5HPDQ/OjhIPjZZ +QTVhRT5aRThNRUEyPjc5PjQ0OzQwODExPjY2ODEyOTc3ODI0OTYzOTU1NjcwOzQqODwzNjMx +MzM2OjMrNzMyNzcyNzU1NjUtPTE3ODYxOS40NzkuNTE4ODQvODM0OTcxPTI1OjctOTA3Njgv +PDIzNzU3ODQvOjcyOjMvOzY0OjQzODAyOjEzODg0OjZAOzhDQTlOQztGPTRDOzdIQDNoRT9c +RjRPQTo9PDA+Pjw7PjNTPkBOQDc7Ozk3ODc0OS87PDQ4OTg4ODY7PDQ0ODQ7PDRBPDdPPzlX +SDlfRDdRQjRMPTs9OjNCOTg1OTI+ODs4PTNRQDpCOzdFPDo9PzY+PjRCPT5PQDtJQT07QzQ6 +Ojk4OTM6Ozg4QC04Pzw6PTc6QDQ6OjwxPDg9PDk6Pi06QDo1QDhAQTw3OjdQW0VyW0x2dVCj +l2+7nX20nG67mnKEREBJRjtPQkJjUEeGVkxhSzxRQkBQRTVQR0FVRTdFRTxNRzdWT0GAXEpu +TEGEXU+rf1u3j2Gvhma4iWW5k2++i2yyhWW8hmjEf228fGjQqYnSp4HCn23DnnesdmGdbWJz +SE1tUT+ZaFG6fWDSr4XatoLHl3XBgG2FXkyokV3TtoDauIXVqXLLqHTInGrJo3POpnS+mWax +fFuHaUh7ZEtuXUeAeVmDfGCAfmV/d1yCfWB+e1x/eV94dl98dF19el58dFp5c1Z+dGN/dV51 +eVx3eFt0clR2clt9b152cVR1bFtscFlycVpxblR1a1dfWE1FOzwwPzE5OzYzPDRCOzk7PC8/ +NTg5OzU3OzY5OTc6OzE4OjQ1OzM5ODk6PTM5OjM6OzI/PTc+OzUyPDQ/Ojk2QTU/PT00QThA +Ozo0PDNBOzcqPjE/PTowODc+OTU6PTQ/PDU8OzMzOTA1NzM3NjQ2ODExOTI2OzU6PjJGPDhG +PTpBQDRBQjo7PjJDQDxERzZBPj8+QTM+PUE4RDM9Oz88RjFBSUFFQz9FSz5rZkj2/7T+//v/ +//z9//f2/+3///7///////3////////9//z4//X9/+/9//P3//Dx+uv4//Pw/en1/+73//Ls ++uHl9N/1/e/j+uHe9Mzh9eLc7tTi8Nj1/PHr+ePm9uTv9+79/vz///3t8d7o8uf2+PH1+fbr ++u/9+/z5/ujy+PD8//L4//Xx/+/7//X5/fXz//Xt8+r+//v99fH4/e/8/O79+/t3VGZIRz9+ +TkOCUDprQUJLQj1FNThKOzZJQjxoST5rRz1yRUNiQztXPj09QTdJPjldSDl+Uz6BVkWGWj58 +SUBmRDhSPjlQPzVLPjhKPzhePDthRDdrQThkPzRUOjVHPDdRPDdbPjppRjthQjpSQDdCOzU1 +PDU2OTU4OzRMQD1aRD1cQzpVOzVJPDZEOjZAOTNJPTpDQTVWOTZRQTRTQDtBPjBAODg8ODg5 +OTI2OTRAQDpDPDU8Ozg+PDc+OzNBOjhJOTtWPjlTQztXPzVQPDZBQjdKPzxdQDdfQDxTPjhG +ODk7ODFDOjU7PTRnV0NtVkNRPDg5NzVBOjVJRDdySD5rRDtWPTxGPDlAODRTQjpmSjhXRTZF +OTc7NTM7ODRAPzdrSDpwTDtlQzxWRDlfQDtbQTRzRz1zRztxQ0JVQDhNOzw7ODVHOzdVPzlk +Rj5EQTg4Pjc1Ojc2PTQzOjQ1OTs2NTk1NTUzMzQzOjUyMjI3OTowODM0NjEwNzAxNzYxNjA2 +NjkuODA2Nz0zOC83Oj03NzE0Ozs1NzQ1NS8yMzQzMzc4NjQxNzc4NzM1NjU1ODgyPDM3NzU4 +ODcwOzU1NjcyOTY2OTUtODI0OjUrOjI1OjUsPjI6PTg5PTdLPzhBPThCPTVQQD1lRzliQT1R +QjhDPDk8Ozk9PTZRRTlQPjk+OjYyOzc8Pjw5Oi86NTs5ODE2OjoyPC45PDNHQDNSPz5bQjhb +SD5VPjtFQDxCPTc7OTg8ODc2OTQ+PT5JPjhIOTxAPDI9PTs5PzNEPz5UQjhKPDlBPjc1Ojo7 +OTc3Ojg7PTc9OzhBQj02OTs6Ojc6QDo6Pzc7OTk2QjNCPTs0PTE9Pzk/TThyYk9nZEicg2Gt +rG6+onnDp3euYGFgRzldVEh9dFOufmetdWObYFZ+T0toQTpBQD5TPzpeU0OWaVaMalSteXSO +aEyudma3goKuc2WqelnOk4Pho5nXo4Pj5qLr0aHkzZPr1KrlwZq3kmK0qWmnnnTGqYGXXlOg +Y1XBf2LVpXfctHvWtHzdqXbXpXiwdVzGpm3htYDZvITWqn7TsHXNqHbDo2fKmHS4j1yZd1uC +ZEd/ZExtYEqFfVeEe2SIeGWDeGKAd2CBeFx5e2B+dGF/dmB4d2J8dFx6d1p7dV12cmGDc2Jx +c1x8cmB1c2B3dGBub1l6blxvbFt6cFpzblp1b1dlVlM/Pjs2OTs5OjVAPzk6PDRCODo8PzpB +PDk6QDo6ODU7ODk7PTY6QDs6PDU/PDs9OzRCOz09PjY9PDtAPjo6ODNAOTo2OjQ4OTUzOTU7 +PDk9OzhLNzk3OTY9OTk6OTQ+OTxAPTlBPTk2OTszNDg5OTo3OTQzOjcxODhBPDlEQjhOPjZC +OTtCPTxAODtCQjRKRDs9QDpDPD46PDVDPDw/QzxDQDxBQzpNQj1KST9sXU3q96n+//j///// +//v///////////j///7///72//H2/+r7//z9//P9//j3+/L+//n7/Pz6/Pf9//P1+fLt/Ojw +/fHj9tvn8OXZ6tHl5uDh79vg6dvr++z6+fH5+vb3//Dy/+fl/eLy9+3x9+Tm9ePq+eX0/vLy +/+/4/e77/v3///v18enp9enr9ufw/O7///v///f///ny8+n9//D1//Tp8t9xTl5IQ0V/U0WC +UD1nRTtNQj5MQjhDQTdQP0BvST54R0BzSD1xPzxbQTU8PjdJQDhbRDmCUz6AVj6JUj96ST1r +SDxQPTpWPzdKOzdQQTJaQTRrPzlnQDtaQjVSPTtGPzZSOjpXQjRnQjpgRDlcQjc+ODU5NzU3 +NzYzNi9FPzpfRDZdQjlXPDJHOTdDOzg+OjhEOjVNPzdaPDlVPz1PPjlCQDNAPDY3NTc7Nzs+ +OzZDPjk8PjY/NTdCOTdFNzdEOjdPPjRSPTdWOD1YOzpSPDhHPDdKPjleQTZgSTpVPzRGOTg/ +ODQ/OTY7OjJlUz5tUERNPD09OjRDNjhJPTZxSztvQz5TOjg+PzhHOTlTOzxnQTxVQDxGPDY7 +ODY8PDJCODpfSjdwSDpdPjlaPTNTPjZbRDZyST1xQzdwRj1XQzZNPTlCPDdKPThSQjhHPUM2 +Njg+ODYvOjc8ODYrODE3MzUyOTMyNTYxNzMzPDQ0NDkwODUuPzMvODAsOjIzPDgxOS40Nzgu +Ny0tNjUwNy86NDkwOC03OTguOio3NTwxPDA3Nzk0NjM1Nzc4Nz0tNzU4NTIxNjQ1NzgzNTMx +NzQzNzU1NTM0ODUzNTM2ODUwNzU2OzoxNzY7OzkxOzU/Ozk4QC9GOjpEPjVpRTdbRDtRPjZC +OzU8OTQ/PDhRPzdRPDw3Mzc3Ojk6PDYzOzgyODQ3OTc2OjU4NTc6QDZIPDVSPjdaQTZdQ0JR +QTdNPjtDOzg/Ozw7ODIzPDFBPjVOPjVJOTc/Pzc9OTo4PSpJPD9SQDRLPz1APzc3QEE5PzM5 +ODxAPTY2PDU/Nzs3OTs/QTc3Ojg9PzQzPDc+QTs2PDRBQDg4Ozs/QTdgWEluYkmNfl6vmm3D +qom8pXXNo4mxamKGZlt/fVS4jXWth2K2jnalZ0+ZVU9tTD1KTD5da0ylmXupqn3Lw5fKrIzc +zbDk1q/ksJzey5nx57T10cHz2qzy5bD02rTexYbo15fhv5XZsJ6/kHSyhWuriVuyd1/CkGvP +pXfbs4DguITbtX/brH3iqn/SonbWsnbgtn/ivYXbtXnPp2/KnnDBnGjDk2ergFeTa1R9aUV9 +XUx5bkuIemd+el+GfWuCdmOBe2l9c1x8dl2CemB6dl2Ddl58dF98dl16dVp1cl98d1x4cFh6 +c1lzcFl3clp0clp7cF9uc1lya1tubFZ4bVldU0lCQDkzNzo9PTY6OzU3PTQ/Ojo8PDk8PjY2 +PTFAOjY4PTI+NzU1PTRAOTg9NDs+NzdFOTw6PDM+PTw7PC9APDk4OTI7Nzw4OTEwNjo9OTQ4 +OzU8ODQ9OTNBODU7OzdCOTw+OTZBPjk3PzQ/OTk3OzQ6Nzk5Ozw0PTY5PDVCPTZMPz1CODpA +Pjw8PDRDPjhGPj1DQzs6Qz1AQTlDPzw9QzpDQD08RDtEQEJORT5wXUjz+qn+//v7//b///// +//////////////7///v///z////////3/u/+//b////6//P3/+////z8/vn39+39//v4/fjt +9+Tw/u/f/Njt/Ofq++be6dz2/+j0//Hx//Pp8+bk7+Dz+/b+/vz///f++/L9/Pvs9eDj6t7s ++ury//Lt8ej9/vn////////5//r+//Tj99/y/uf08uby+ef3+u7z6uNyUmRESTx1UEF+TT9q +RT1SQTxGQDZGQzlKRDhoST9tRjxxRkJrRzlXPz09PCxCPjxeSjZ8VUKEUz2CUkN6STpiSjda +PTVQPTNKOzVQPzdiRTtuSTdrPD1nQjZOQTxOOzZHODZiQDdjQTRlQzNROzlEOzUzOy88ODIp +PC9MRDRcRDdZQDNRQzZJPzREOjQ8ODNHODJCOzRWPjpVQjZQPDhEPDhCNDM2OjU1OC87PDc6 +PjNEPDg9OjJAPDVDPjJDODhKOy1MPzZVODpYQjhTPDVAODVIOzRdQDhhQzhSQTVLODc+PzM+ +NzM6PzJpWkBuVUZJOjo9PDA4OjVLQTVtSzpxSjtUPjVFPjY/OTJWPzldSDdXQDVAOjM9ODE6 +NDI+PTFpSz5rSjpeQjVWQzBcQDpZPjZ3SThxRjtuSDlZRTlLOzJAPjVEPTVAPj43OjU0PTY7 +NzY1Ojk6PzI7Njo6ODI0NjUxNjYwNC41NzM1OzM2NDktOjA3NzktOCw2ODguOzA3NTkvODc3 +NTguODQ5NjIuNS81NzEyNzA3NzYzOjQvNzUxNzEzOTE2NDQyNzg2Ny8yNjcvODA2OTU3ODE3 +NzgwNjY7ODkxOjA0ODotOzI+QD02QjE5NzozNDY2Ozo4PDE/PDJIOjNdRD1fQDlJPjVDOzg7 +OTk5PDRSQTdPPTg/OTk3Njk8ODc6PDA8Ojk1ODE7OjkvOSxFPzo9OzFSPjZWPzVeQzpQPztE +OzhBOjw+ODA1PDQvOTE/OjhOPThJPThCPTQ6PTs/NzVIPDlRRDdHQTFCOzw0PS84OTc5ODI+ +Pzo+PTI6QTs9PjQ8OzQ+PjIzPjU/PTw6QDE/QTQ8PzY9QTQ7PjhIT0JuYEd5d1SemGy2rXrR +rH3VwojftYzBeG+cjVe7lHG5lWmyjmiqclOgaVWeaVCKV05eTzp4fFOMq2fBwonFyoro4bzs +67zs0q/s46747b/33cTz2q3q4JPj1Ybs37Dkw53GtHPMuIC7iGOsdla5gF/Dh2LKlW7VoXjg +sH/ovIrpv4rlwYzltHvhr33cu3vetoXYuXrTrHzIo2y7nHG1ll+zhV+Rb0t9ZEt4YklyX0SA +gluEfWOGemF9fWR+eF6BfVt8eV6AdVt8dWF9dlp9eV18eGN6dVt3dF91clh8dV1xdVp1c1dy +dFd3cl5scVN1alhxbVZxb1hzcldybllmUk5APTo6Ojk0PzQ5OjA8PDI3OzI/PDY7OzQ7PTY3 +OjM8NzUzPTA6ODc3OzVBOjY3PjVAPTU4ODNDOTc4PjdCNTU6ODc+PDU9PjY6OTQ7OjU2PjE1 +OTQ2OzI7ODU5OzlAPTVBPjk7PDE6Pjc4Nzc/PDo1OjE3OjQyOjFAPT1IPTRHPzpCPDM8OzlB +PTpCPzhIRDo9OThEPDc4Ojg4QDo7PDVEPD46QjhHQTxLR0FyYEr0/7H///////v7//P6//T4 +//H///v////////////////1//f6/ef///z9//T9//X////0/u3l+N77/+/1/+vx/ezt+ebh +7dre883m+OPa5dbl69r0/+/l6+nl59zo+ev+//7t/+v0//H8/+/5//H9//v+//31/fD+//z7 +8e/+/vv///X4//fy/+fy9+Tq+On9+fD08/T/8/r9/PL99O3q8t90VGRBQj52TUV6S0ByR0JT +QTpKRj9BPTpQQkJoSD55QUBwSUF0Rj5KOjhKPTlBPTdfRz17Tj2FWUKEVEB/TD1jRTtbRDtS +PTpMPzZMQzViQDhnSDluRD9cQTdVPjlJQDhQPkBXQzJlQUFcQjZYQjlAPDE5Ojc5ODQ2OzNI +PjpcRDZjQDlMPTdPPTZAPTRBPTZDOzdHPjhaQjtVQDtSQDlDPzVIOTo1OjM+Nzk1NzhIPTk6 +PzVFOzk4OjpCOThGOzlKPTZVPDxXQDZaPjlQPTZJOzhLPjteRDheSDlXQjVLODhHOThBNTo6 +PTVjWER0VkRQPj1COjA8PDhHPC1sSz9tRTtUPjxGOzRCNzhWQzlmRDxXPzZEPzU/PTY3OjNA +ODdnSTpxRT9aQzdeRDdcQzhfQDlxSj1zRD1sQz9UQzxLPjw5OjRBPjszQDk3PjY4Njc6OTY9 +Nj45PTc8Nzk0PjM3MjgyOTg6OzkuOy85ODkvODY2NzUyPDUyNTQ1NzY8NTcyOjY0MzU3Mzo1 +Ojg2ODgxODIzOjk0NzQ4Nzg2NzcxOzQ1NzYwOjI2NDU1OTA1NjkwOTE3OTUyOjU6OT0vOTY1 +NjYvPzM5OjgvNzE1OTYyOjM3QDg4OTUzOTk2OTc5OTc4OzVBPTdORTpWRDxPPjhCOjk7OS08 +PDVPQzhUPTs3OzQ7Ozg4ODY5OTgyOjA6PDgyOS82Oz04PDNIPDlQP0BcPzxfRDVUPTxFPztB +PTs5OTk8PTkxNjRBQjREPDdLPTs/OTY+QTU6OjhJOztMQjVRRjk6Qjk+QTo4OjlBOzk4PDg/ +PDc2ODdAPjg8Pzg6RDQ0PDw6QTc7Pjg+Pjg7Ojk7PDg2QDc9QTpZWEFyZlSOilqzoXfCtH3T +vpDex5Pju57XnH/Kony8lWe8k3ewdl2XcFeebVuYbUmaY0yVa0+aW1SWhFe1wYjq4Kjo6bXk +0p/N0Zrn66/13Lvuz5zhwIzUtnLczYnZuH2+l2bCe2K4fV/JfF7NkGvNn2fYpHHUr3zowI3r +zI/xypjjvYznv4Tet4Djv4jit37au37OsXHEp3a/mWi3kGiogFyOcEx8Zkp/ZU53cVKGgl6E +f2WDe2OGgWKEe2R3fF6Gel12fF+AeGh2dWF4dmJ3eV2EdWh0dlp+c2F6d1t3cV53dVp3dlx3 +cVt6cVt5cFt2b1t1bldyc1p0bFljV00+QD88Ojg0PDU8Ozs7PTNBPjs7ODVCPDg8PTY/OTk0 +OzI8Ojg1OzE/Pzs3OzQ8QDs8QDdFQT07OzhAPTU4PTg9Ozc6PjM8Nj03OjRAPDY6Ojg5Nzg2 +OzVAOjY0OzQ/Ojc6OzJCPjk2OTRAPzYyPDg+OjsxNzhAPDw8PjRMPTtMPjw/ODo4Pzo6PTZC +PThKPThDQj06PTg8QDg7QDtAPzpERUNDPD1HSUJOSkBuXk3z+63///////7///////////z+ +//f+//L3//H5/+////v8//f+//X8//r8//P///b9//f1/fX5//H////z+/Pt9uXq8uXl8uTi ++dbp9Obd6tff49fr/OX4/vn+//7/+/fq8d/y+Ov6/vX+//v+/+7s/PT8//L6//L1/+/6//D1 +/+j4//Xx/u71/fH+/fr//v7///f8/+z1/vn///3r9OXr39d0T2lEPztvTjyCTENuRjtaO0FE +RDJJOjtJPzhqQz5uRDp5R0FpRTlTPTo/PjVGPDliQzl1TT54VTyBUT56SzxjRDpYQjhVOzZL +PzdVPDhYRDdtRD1lRDttQD1OPC5OPzZJPDdeQz1fQTRfRj1RQjI+ODY0NS4yOjI3OjZGPjRd +RztdRDZaPjtMQDhDPTU/OjRBOy9MPDVTQDdYPzdMOTZNPTg9OzM8ODg3NzU/NzQ6PTNHPzY3 +OTRAODM7ODZEPDZKOjlUOzZVPTdTQDVTPTRDOzBIPTBdRTliRjlbRTROQDZBOzc/OjFBPDZg +VD5zVUpGPjY9Ozw7Oi9LPTloRzVuRj9WPjdAQTZBOjhQQzhlQTtLRDRGPTc+MzM9OTs4QTFk +RztsQTtZQjhcRDdaQjleQjptSTdySDprRjpSQDk/Ozc7OjU2NzQ4OzcxODM3QTYzPTsuPDg7 +ODg0PDs8OzUvOzI3ODYvNjQ0NjQsOC85ODQtNzI3NjEwOjc5OzIwODI0NjA3OzYyOTMyOTgx +MDAuPDg4PS8vNjc0NzUsOS0wNzUuODAyOTIyNi01ODYuNTM2ODkuNy44ODctOS82OjouOTEv +OjQwOTE2PTc1Ojc3OTc4PjQ2Pzo4OTgzPjY2PzU0PjY2QjdFPDZEPTJIQDs/OTg6NzY6PzFQ +Qj5MPzhDODk0ODA6QT01PTI3Ojs1Oy02OTkzNCg9PTJHQTZVPTxdRjtdQDtSQDhBQzlBOTI/ +OzMxPDM0OzM5PDRNPTdLOzVFOTE2PDBCPTpAOzBZQDxAOzI+PDgwQTA6PTg4PTQ6PDc5OTU2 +QDY9OTs5PTg6PDMzPDMzPzg+PTo2QjY9PDY1Pzg9Ozw2QzdLTEFmZ0yGfVaclmS6roTNvYDX +xo3fyI7duYvNqnTBoG7AkmuwgV2beFCZcVOPX1OTbUusgV62h2G8hWa2fGG9hGC7iWC1dWCu +dlm8j2XJkmi/pnTTom7HkGfLknHMj2/SkHLRk3LTkGfJlnHNkGnQmG/bqHbgs4bkwYbuy47h +xIfpuoLowIrpvITav4Hdu4DTq2/CnWrApWy5lWmvhV2VcFR2ZUl9ZEx4XEZ7c1GCfWKFfGJ+ +fWOBfGN8fWB9eWN3eF96eV53eFx8dWB0fFx9fF97eWB/eWJzclx4dF95dlZ6c193clh5cF5y +c1l3b1l0a1VvcFZxbVZzbFpbVEpBPD01ODY3PDk2Pjg+PTc8QDM9PzU2OzJBNzkvPjA3OTcz +PC48OTg4OjE9PDs5PDI6PDQ8PjE4PDc/Pjo3Oy07QDQ1PDU5PTY7OzQ5PTQ7PDc2PDVAOTcy +OjE+PTc7PDNEODk1OjM8NDoyPDJAODwyOzM+OTcvOTY/OzlBPThLPT1DPTo5Pjc+Pjk+PzhJ +RDo7PzU+OzY8Ojg8QTRBPzxCQT1DRT5ERDVOR0NsYULz/LL+//L////6/+////////////// +//////////71/+/3//D5/+3///z1//j9//f8/Pj+/u78//j0++/4/ev0++/y+Ory/vPp/+Hd +8Nrf59Pf69f///n9//v1//D1//T+//35//H9//Tl/+jz/vL5+fDy/vP///n/9+z5/ff///35 +/O3z//H3/vX5//b3//Dt/+/+//z19/D19ePp++z5++xyVGo/QTtzTUZ9UT18TUBSQTtNPjtB +PjZSOz1mSDd2Rj9zTDxxRzxVPTpEOzdDPjxaRzt3Tz+ETz+CUD58TkFkRT5UPTVXPztQOjlP +PjljQjlnQTluQD1iPjRXPThJPTJPODpaPztjQEFfQzNaOzg/OjI8OTc1ODY4NTRHPzZkRDlb +RDdUPjlMOzg/NThDOjRBNThKPThXQTxRPjhNPzpHPTVGODk1OTNAODU1NTNCNTs8OTVBOTk6 +NzNGOTs+NTVLOjlPOTRVPTpYQDNZPDdGPjlJPjRbQjpdRDtZPzpNPDdCOjVCODo9OzVcTkBu +VEdMPzo/PjRFNjpFQDJyRz1rRTpZPTs/OjVKNzhMPzdjRz5PQDtMPDM/OzU3OTNAQzZhRjpt +RD5aPjleOzheQDliRThuSkFvSzxfREJFPTk7Nzs9Ojk5OD87PjM6Oz44PTQ7Oj04NTc9OT81 +NjQyODQ2NzkzOzc4NzcxODQ0OTkzNjU2MjYyODQzNTcyODQ1NzUwNzUwNi45OTsvNTM5ND0x +ODQ8NTswOjc5Njk0ODc7NTEyNTU3NzIzOTU1OTA2ODkxOjY3NTkvOTI4NzgxOjI1ODkxODQz +OjM1OjM1OTQ0OTY1OjE2Nzk5Ozc/Oj86Ojs1OjY1PDY5OTlAPjU9PDlANz07PDVFNjlLQThS +Pz03OS82OTc0PTM3Ojk7ODc7Ojw5OTM3OTw5OjJHPTlOPzZaQEFhQ0BSPzpDODVDODg+OTE0 +Nzc6OzdAPTZJOTVKOjxBODk/Pzk1OS5PPjxMRTJOPz47OzE+OEE4PzQ8OTs7PDRAOz04ODQ/ +PD82PzM8Pjk7PDc6PSw7Pzc3QDM3Pzg8QDg3PTc/Pjw6QzdXU0xyak2PiWGtpmzCs37DtInd +xIvbwYnVpXy3km3Ck2y4kmqtdVuWaFiVaE+gaVKgdVeve1utdVW2iWXLlXbNmnLTmXDQkXTU +iHLTkmnSnXnVnn3foozjtqPnrpnesInWo3jTk23TlXLZnnHYo33crXbqxo7tyo7wwpDlt4Ho +vYfmvYbdu4PWrHzXtXnGpnW4lGa0kWetiF+cfF+HZ1N8aU1/YUp3YUiEck9/e2ODfWJ9fWKG +e2d8d2F/eGB9e2h1elt8d2N7dV18dmR7dFl7dF99dl5+cFx5b116c2F7cF53cV52bl11cVpx +bVx2aVhzcVpycFZyb1phVk45PkA7Pjc3Ojk+PDY7PDNAPjY6PzhFQDk5PDg8PTk6Ojg7Ozo4 +PDU6Pjc+Pjg7Ojc/OzVCPTc9PTVAOzc9PDQ8QDg7PzhAODg6Ozc1OjQ7OzI3PjY9NTk7ODc7 +OzJCPTg+QTVBOTk5OzA/ODk1OjY8OzQ1Ojc7NjQ9PTVIPjdEQjlGPzw1PzlDQTlDPTxJPTpA +Pj0/ODM/PDs7QDlCPzhCOzxGQzZHQEFVSUFwXUz2/7T///////j////7//n7//P2/Oz+//// +//////////////v+//T6//H8/e7///76/fT///z9//Tx+uv7//X3//Hy/uXq/O7Y7NDm79v2 ++u/x+urz//Hv9+fu9uj1/v37//H6++/p6+n+/vz///nt++35//P3/vP5//v///n0/+v4//X5 +/vf+//vu8+jy+Or5/vT5+/ju9On+//r///r19ex7VGc8QD1xTkR7Tz12SUVWQjxHPjtCPDRM +PT1rRjtvRzxzQzxpRTtdPDg0PDlEOz1TRDyCTUN8V0GCUT12UzxnRDhPPTdTPDtRPDlOPTVh +PztkRTltRj1dRDlTPTpFPzpQPUBTQzlmQj1jRjZaPTk/ODc0NzU1Ozc3OS87QDhaRTtTQDtK +PzdBPjU5OjI2OzlCOzlEPDlZQDlTRTpSQTlBPjdEOTc2NzM6OzY2OTU/Njk8PTJBPDg9PDE/ +PDVCOjVFPTVOPzdVPTpWQTVXPTpGPjRFPzpaRjhbQTtYRThOPzdAPDNANjo5PjVjVkNwWUJN +Pzo5OjJBODhDOjVrSjpsST1VODg/PjhEODtNRTxdRDxOPzZDPTc9Nzo0OSg/PjZfQj1pQzxV +PjtbRzlcQzpZRDxtRT5YRTtFPTwzOTQ/Pj00PDU1OjgxPjg8Pj0wOTY9PD8sPTY4OzkyNDg1 +Ojc1PTYwPDg1ODQ1OTczOTM1ODcxOjAvNzgvODMuODUxODI5NDgqNzM1ODctNzU2NzsvOzA0 +OTsuNTI3NzwxMy4yOTgxOzMuOjQyPTgwODEzPDUxOTQ0NTctOjc2NTYzOTo0NjIzNDU0OjU3 +OzgwOjA3PDkuOTM5PDgyPTg3QDcxPDY8QTwzOjM2PTU0Pzw9QTc+Ojs7PzY4PDhGQjJQPTw5 +Ojo3Ozc6Pjg2Njg2PDU1ODg5ODYzOjU8OjZFQDVRPjtdRzlcQz9RPztCPTtAPjQ8Ojk3OTAy +PzI/PDNGQDtGPjw+PzA7Ojs9PjdIPD1PPzhPPjw+QDQ4Pjw4QjQ0OTs4PzQ0PDs7Ojc0Oz05 +QzQ5Oz87QzgzPDk/PTcxQDo4RTo2PDgzPDg6PTs4QDRCUEFiXUZ+b1GRi1m1mnu/s37MuIDV +u4LLr4m4nmu6lnG8jGu3g2emeFefdVugeluqelimdlm2fl+uhWK1g2rMnXfRlnzOn3barI7V +r4rWr4rcwpTjv43TsXTPmnLSlW7YnHTRm3LasYDTpnrarH3etYTsxI/tzZTqyI/iwY/fuIHh +vYTcvYnQqnnGpXO1lGOwjmiqjWOsimSJblGAcFF6aU56WE+LZ0mAcVaBgF6CfGV7fFqEfmd7 +e1t/fGSCe2B9dmF7emJ6eWJ9dV99d1+Bdl5xdlp6d2F2dmB2d115eFx1c1h5cl1udFp7dGFt +cFZ6cFprclp5a15bT1E6PDowPTc7OzY3PDo8PTRBPzk+PDZAQjg4PzU6ODczPjQ7PTc3Ojg7 +Ozg7PTY/PjdAPzw8Pzc9Pj48Ojc7QD08QzY+Pj03PDY8PTpBPzc7PDw3OTY3PjQ9PTk1PTRD +NTg8PTlBPjkyOzU7Nzs5Pjc2PDg1PTY2OzU8OzRIQzhIQTxANzk+Ozw6QDpIQjlFQjhCPj45 +Ojw8PTw3PT4/QjpBOzxCRThIRUBLRUJ7a0/k86T3/+z7//P///////////////7///////// +///////7//vt++b6/+39//n1/fP0/Or+//Py/PL3/u/6//rm+Obs/+Ln9uzm8tXr9PHf8tvf +59zr9+Lz//D5//z19+nu/eT4//f+/PH3/+zu9+z6//r7//Ht9ejp/ebu9+Tu+vL+//T6//L5 +//f///3////w+e3q9uzt9+f+/vj5/+jt8+B2VV9DQDxuT0CASURyTUBeQz1DQDdJOzhHPTpo +RzlxST5sSz1tQzdURDhAPDdBPzdXRzR4UD6BUTqEVTl4TTlnQDxNRDZWQDtRPzFVQT5gRDVt +Rz5uSjhqRjpPPzdPPjZLQDxVRThnSTtkSjVYPDQ+PC82Ni8zOTA0NzI7PzE9PjRAOzg3OjI+ +ODUzOzA8OzQzOiw9OjRCQTBeQzhGPzNQPzU8PDM+OzI7NzA4OjE3OzA+PjNCQjY7PS9BOjRD +PTVIPTRSPjVYPzZbQzZWQTRIPzVEQDNZQzxdQzVYSTxKQC9FQjc+PDFCPzhgWDtyV0dOPTU7 +PjFCOzJEQDNtRjxvTDlVPzg/ODFCOjZNQjFhQDhRQzU/QTQ9PzY5OTA/PzNgSzZlRzpZRDVh +SjlbSTlbQDZaSDpJQDk6Njc5QDc+Rjw1QDU5OTk1SDQ/RDwyQzk6PDYzPTk7PTEvOzY5PDU1 +OzE1OTMuPDM0OjExPDg4ODUwQS80OjEtOzctPTIvOjMzPC0zPDUwOTA1OjU2Nzk1PDI1PTcz +QDQ5PTgxPTI2QjMwPCs4OTU0PTA3OjgtPTEwPDYvNys1PDYzOzA1ODI1PTMyOjQ1OTQzOzEy +PDYzPDAyOy80QDcwOCw2PTo5RjQ8Qjk1PzU7Pzs1Pi46PjM0PC8/QDo3PDJCPTxLQTQ9PTs3 +OzU6PzY4OTk3OTE9Pzk8PDMyOzE7OjNEPzJURDtdRThcSDVQPTpFQTc/PjFCPzUuOyw8OTU3 +PTdRPzw9Qi1EOzM3PTBDPzdKRDhXRzpQRDs+QjQ8QDc4OzM6PDg9QDM4Pjs6PDM7PDk8OjY8 +PTdGQTo4QjM9QDg3RTRARDo4QC9CPEE0RC87Qzw6RDBMUUZxYkN9eVeVkGOqnmy/qHPHuH3J +s4HCn3S2k2y3kWnAjGqqflyceFegf1eliFm1hWS3gWW8hmi7fmq+lGXEiG7MkGjDlHfDkGnO +j3LIimDLk3XNkHDRk3LRqHfaqYPTrnrYpHjYr3vpuInpxInxx4znxYztyIPryZDjvorctX3V +uXzPsXfFom6yk2etkGapjmmggFN5Z0mJbU+BY0qLbUyRaUuHeViEfGGDgGJ8eWGAfGN+fmGE +d2GAeF58eFx7eWB+eWV+d1l7dl16e2d+dWR8dlt7dmCBeFtyd1dzcFR3cVl4dVd8cVhxcVVz +cFdybVZ0bFhaTkdCPD82PjI9OjY4PDNDPTc+PjRCOjc+PTQ+PDs6PjI4OzQ7OTc4QDU9QDo8 +QTc+QDY7ODBBQTM+OTc/PjQ/PDU7PThDPz84OzVAQDk4PTNCPTY2PzBBPz07PDA+Pjg1PTZF +PTM6PTA9PTQ1PzQ3PTg7PDQ4PjU1PzU+QzhJQDdEQjhFPjY6QTZCOjdAQjlGQDRCQEA6Qi9B +QT04QjNFQUBCQTZEQUJHRDlPTUNyYUbw+Kf////+/+/8//P9//D///X///b///b///f///r7 +/+79//v///z///v8//nx/+z+//j9//f8//T2//Tm9OLn89/r9uTZ8tjd+tDu8+Hk6t3b59P0 +//Tt+PXt+eXp9u7h8Nz6/fP4//Lz8ej4/e/r9eHk9N/+/vz9+/n9//7///////Xw/+vt/Oz4 +/vTx//j///7///3/9fXx/e/2//H67ehvVWBCRkZpUj5/T0FwSz5WPz9DQz1EPTpEQThpRTl4 +TENpRkBuSD5TRDc/PDU4PjNWQjp3TUJ/UzyDUjt4TztpRzpSPzNWQTtQQjdXOT1WQzRvQjxq +RjhqQT9LPTNRPjdNPjtZRjtfST5aRTZJOjY3ODE2OTcyODYxNjY3OjQtNzI1NjU2NTc2NzQy +NjE7OjYvOjI5NjU2OTNMPTo+Py9QPTU7OTFBNjc1OTc6OzI2OjVAOTlBOjU7OzNBPjQ/PDJH +OzVLPzhWPTZXQDlWQDVCPDNFPTRXQztaRTZWQTtNPjZDOTw7Oy49PTlbUTptXkdIQDY6PS89 +NTNIQTpnSjhtSDZVPTVDOjZEPThTQjRfQjxMQDdAOTg3Ozg3NzRAPDNhRjNhRD9VQDFZQzxW +QjlTQTRPPjw5OjoyOjU8QDc6Pjo6QDc7QTw3Sj4+QT0yQDg/RD4zQzo5Ojw2PDc0OjQvOjEz +NjIuOjUyOTEvODA2OTQtOTczOTIzOzsyOjMvOjY1ODUvPDkzPjUzOjUzPTUxPDU5QDo1QTY3 +OTYxOjQ7Ojk2PjA5PjgvOzE6NzsyOjE2ODcuPDI2NzYuPDMzOzQ0NjM1NTgxPDUtODQzOjIw +NzczOyswNTkvOC80OTU0PTc6Pzk4Pzc7Pzs0PDQ8Qjs1PDM8Ozs4PjZEPzhKQzE+PDs1OTM3 +Ozw1Ojw2ODQ3PDM3OjU1Ojc2OzZBQTZSQj9ZRjlZPjtMPzlFPTg7PzQ7ODkvPCk6OTc5PjFN +QjU8QDREPzo4PTNDPztDQTRVRjVHQkA4Pjg0OUA4QDg4Ojk6QzM6PjU0QDQ6Pjc3PDQ3QDY6 +PTY1OTk8Pzs2Ozc8PDswOzQ8PD86PC89PT02PzA+QjdHTzlva06HfVmch16vlmmzrHG0mnG1 +oXO8nnu4k2G5jG+2iWGre1ufcVibfF6egFymlma8mnC7nXjDmHm+nXbJk2+9lXzJmHbEpXvM +mWjCoG/CoHLFqHXJrXXKpXDRrXfis4rdu4Ltx5Hrw5LuxpHkxIbsvITjxIXevIXYtIPMrnm+ +omewjmOfkmOujWmZhGKJcFF7bVCGaUt/bEyeeFWNZ0qAe2N+fGCFf2V+emGAf2N5dWCAfGmA +eF97d2J5eV14eWN8eF97dWJ3dV2BeGJ0d1x6dV57dGByb1p2c1dyclp0cVpubVZvdFh2cV5y +cVZ4bllWUkk+Pz06Pjc9Ozc7Qzg8Pjk7PzFCQTk/Pzg+QDY0PTY6PDgzOjA5Ojw9PDo3PzQ8 +Ozc8PDJCPzg6QDg/PDlAOjc5QDU7PDY0PDc9Ojc5PTA6PDotQzU+QjkxODBCOTo4QDhHPjky +PDU8OTc1ODY6PTk9Ozk6PjU1Ojc9PzRBPDRDPzpEQDo/Qjo+PzhCRjpBRTxAPjs8QDg/RD87 +PzRDSEA7QzpERkJJRTxPS0V0ZELz/bT7/e////////////3///3////////////////////8 +///+//H9//f4+e39//z///36//Px/+ny/en2/e37//f1/e/q8+zl+dnq9uXl793j59/p+ef0 +/u38//f4/PLw+O7r6+Dj+uXx/Or///3////7//P4//H9//P7//T7/+z+//j5+vL7+u/0/Oru +/e3s9d7v/ury8Obs8OXy+uvv+uh5VGhDPDxpTUOBUD55SThhQDc+RTNMQD1DPzRiQThtRjh0 +RUBrRjtUPT1BOzQ+QDZYQDhyTT+GUz58Uz18TDxnQzdVPjhUPTVKPjZVQDhTPjRtRDhmRjZt +RTtMPTRQPTJEQTVZQTpaRDdTPzUzOjU3ODUxNzYzOjE2NjM4ODI4OToxOTIzOzQtOzE5NzYy +PDI3NDI1NzU5OTQ8PTk+OzVGPzY9OzE1OTQ1OCw1OTRAOjE/PjdGOzI/OjQ+PDU/OjZMPTdO +QDdcQDlYPTVWPjVDPDZHPDZVSDVfQztWRDNQPTZEOjREODJFPDdgTz5tVEpJPzpAODZBPDdD +QDdgRTxwQjpSPTZEOzFDOjVMPzZcQj1LPzRFPDo3NTM3Ojc4OzNhRTlYRTRXRDhPQTpWQzdG +QjlDPDc4Ozc5OjU5PTw7QDY4QD1DQTw/Pj06PTs2QjtBREA2Pjk2NzQxNjM5ODovOTExOjcu +ODQ3NzgvOjAzODYvMy48ODsqOjI4ODs3OzhBPjcyODc8PzY3PjgyOTszPjY4PDU2OjY1OTc7 +STs6PTk0OTg1PjYzNzUxOjYsOio2NzUvOzQ2OjowOTA3Nz4xNzA2OTgwOSsvPDUyOTI1OTo3 +NTc1PSw1PzY0NjE4Pjs6Rjk2PDY4OjY4PC03PTU2ODY8PTo0NyxAQjpBPzc9OTcwNTRBOjoz +ODE5OjgzPTU/NjQxOTU+Oy9FOzVPPTlfQz1bRDhOPThBOjREOTg8PTQ7NzQ2OjE9PDRLPTdF +PDU+PjQ0PjE9QTdJQzZXRUBHQzRBREA1QDM0PDg5ODA3Pjk7Ozg6QDc8OzY5PDc7PTk5PzA2 +PDk5QzE+Ojw+RzE6OT05PjQ3PDxAPDQ3OTlCPDQ4RTxeUkVoalGOf1mSjmWymmmunXGrmGy2 +lm68kWW+mGu8lG29g2aqfGGveVekgluihGCliWSmhWWrk2yzlG23lGaujGa8ima2kWi2i2e+ +jXLHjXLTmXnYrYDjsIDow4/pxJLqwo3wyJbuypftzJLqyY/rvojeuX7VsnvEqHbEnXCuj2On +gl+qi2Gok2eKbVGDc1yJdFKCZk+WfVOqfVOMak2BeF6FfGCDfWGAe2B+el6AemGCe1+BeFp/ +eWF9eWGCc2F9dl18c192dV17dV1zdVmBe2J5cV16c2JvcVV5b1pzcVdzcVlwcllzclVzcFht +Z1VWUkc8Ozs1OTY5Ozo+PTZGPDs/OjZBPTs6PDQ8PTo4PjhAPTozPzE8PzQ2OjVCOzk2PzdD +PDpAPzQ8PzJDPDc4PjQ8PzU3PjU6Pzg4PTQ6PTQ3OTU4ODI2Ozc5PDU/PDs+OjVFPTg8PTJA +PT45PzI7Oz86PDE1PTk1NDI/OzhLQTNEQTVCQDY4QTpAPTpGQDlFQD88PzU9OjY8QjY9QDk/ +QTpCQjxDQzxLQjxRR0F1ZEf6/6////r+//b+//X///f///v///z///////f///v///v9//n4 +/uj+//v///////77//T+//n2//D+//X4//P8//Pw/+zr/uXk/dfm8+Ll9+Lk7+D1+u/z/uz4 +/vT7//z///////n79/Hx/ubt/Ony/+/9//7/+/H19u71+e75/+/3//Dx/+j3//r9/fX9//X6 +/fn//fL29vX2//L6/ezu5tp1VGg6RDlqSEV7Ujp5TURaRTJOOEBGPDRJREBgSjh0ST5tSDxt +SDdcPTlAPjQ8OTZWQzVwTz9+VTh6Tzp5TDliQzhWQjdPPTZZPDVKPjViQjtlQzpzRDxhQjdY +QDhSPThSQzdRQjpWPzhBODU0OC81NTUvOS45MzI0Ny80NjAxOjI4OTM0OzI4OjE1OjE3OTI0 +ODI1ODE1NjY3NzU6OTU9OzFCOjg8OzE7PTQ7PC83PTFDPjc/OzBDOzg8OzRGOTVCPTRSQDZV +QDVYQz1TPzJKPjVAPjVcQTZeRzhZRzdSRThIPThDOjY+PDVhUTxuVElOOTdCPDNBPTBOPTdm +SjduRj9PQDRFOjdDPjVQQjlUQjZQPjdDPjNEPTk0OjZFPjhWRTthQTdQQzZdRDpPQjtCOzc4 +PTc3PDM8PTk4PTY7PDk3Pjo4PzdCPT4/RT9CRkJBQT1APzwyOjA1ODQyPjI5Mzo0PTE4MjYv +OzM4OzYqOjY2OjgyOTM2PDU5PDQ2PTg+Pj49Pz85OjY6ODk0ODc3OzgzPzI2Pjk1PjI7ODg3 +ODQ9OT02OjE3OzgwNzM8Oj0yOSw4NDgzOy03OTszOTM1MjU2ODUyOy0zOzYzPDU4PDI2PDE5 +OTU7Qjc3PTc1PDQ1PTY6PTg1ODg5OTg3PzU7Pz4yPDI7Pzc2PS5EPTk5OzY+Pzc6OzY5OTY2 +OjA1OjM3Ozs0OTI5PDdGPjZZQjtdRDdeQjhOOjdBPTJBOjo8OTI1NTQ3OzJEPzhHPDhMPDs9 +PzVBOzk6OTdPQjlTPjdPQTxFOzk+QDg+Pzs4QDg9PTg6RDQ+QTk7QDE8QEA8PTQ6PDk7PDQ8 +OT1APTg3PEA+Qzc0PjlDQDQ2Pzg9PzI4QjhBRTZARjxhW0JybFOGfFWVkWOlj2azl3C3pXG5 +om61lWDDmXO/k2bAim22iGLEjWy6j2XAh2m+hGC9kXTDn2zLlXXJn3HKm3bNqYDYpnjZr43l +uZLlwZfqwpLtwJL3zJrwxZDrwpHqyI7vx5Dkx4vtwY/pv4fduYPJq3DLoHGzm2epiGOnjGSy +kmuWe1d9cE2PdE+Abkice0+sflukeVeRcUyDfF2DfWOAgF6Ef2R+fWB/emN7gF9/e2B8eliA +e2F3dlp+c2J7dFeEe2R5ell8d2F/fFt8dl58cF11dFt8dF10cVpyb1V0cVdzcVZ0cltxa1dh +Ukk8PTc4OzY1PjZCPjw7PTRDPTo6PzZEPTo1OjZGOjc2QDE/PDYwPDNAPTU8Pjc8PTJCOjdE +Pjg/QDU/PjFEPDdAPzU8PzM4OzM8PzFAPzc6QTI7PDU6PDA/PTk+QS9CPTpBQDFAQjs4PTQ4 +PDc2OTI9ODs6PDQ2PTdGNzZFOzxJPDpDRDdFPjc+QjRKPT1ERjZAQTw/QDc9Pjg7QTdAQTdD +QD5DQjtNSURPRzxvY0by/ar5/uz6//D+//f///////////r///z8//T8//H///////////X/ +///3/vL6/+76+Pzp9t7z/ujq+eju++Lf7d7m7Nbh6+Hg88zp+OHi7NXY4tP+//np/O34+/P0 +//P5//Hx//f///3///T///j1//z9//v0/+79//L2//Xz7eHs8en17+32/u31/e/1/+/8//j2 +//Pj4NXw/un0+uPq5d5yUWA+Pz5kR0F5TUB4Sj9XPTlQPzs+PTJQPz5aSDh1R0JwSjNtQzxO +QDNBOzo6PzNRRDtsTj15TD1+TT1wSztsQT5VQDdQPThXPjVMOjhYRTVkQzdsRjZgQzdZPDtI +PjJMPDw6OjhENzU2ODU/NzYwNTU6NTQxOTIzNjMzOTYzNzUzNjc1OC05ODIsNDA3OTIvNzM1 +NjYwOzUzOTU1OS87NjI8Ozk2OC86OjY0OS86ODY/PzNBPz1BMjZBOTxHPTZCPDNRPDZVQTZZ +QTpVQzhPPDhEPjRcQjldRDtZQDhQPDdLOjZBOTg8ODZZSjxuU0ZIPjk8Nzg/PDdGODRmSTZo +RTxWPTY/MzhEOzJKPzxXPDZNODo9OzQ8ODU6OjBDODZUQjhXRDtQRTpPQT0+PTo7OjQyPDg7 +PjI2PDg5PDY1Ojg4OTo3Pz5GSkI7QkM5Pjk3Ozw4OTszOzU1ODszODU4ODUwOzYuNzkzOzE6 +NzwwNjU3OjwzOTc3Pj42RThVUU8/QD86ODwzNzk1NzovOTU2ODY3ODs1ODs0OjM0OzczOTc2 +Nzk0PTU2OjYxOTE1PzY0OC80PTYvOCw3OTgyOTEuNjgsODA4NjsyNTQ4Nj0zOTE2Ozk4ODQ8 +OTZCREA2OjcyQDQzPDc2OTk0OTk3OjY6PzQ6Ozg1Nzo0OjVCPj00PCw7OzsxOTQ/NTwtOTU/ +Ozo2OjQ3PDczPDdGPjxWQDhcRjhYQjxKPjdEPjVBOjdBOjk2OTQ4NzQ9PTNFPjtIPTpDPjVA +Ojo4PC5PPDxSQjVOQkQ8PDg/PTw6PjI6Pz46PzQ6Qjs7PDg0PDQ+PTc6PzE7PTg3Qjo8RTk4 +PDg8ODg8OTE3PT8+PTU6PDs8PDQ1ODs+QDs2PzlHR0FXU0hzbU1+cFOSiV2ahWOmmGqtlW62 +lWrGnHLEmGfFi227lGXEm2++mGrMpX3Nm3XTonzSpXfZpHrPp3TbqorbtonkuI3dvpHiv5vp +w5PtxaLs0Jr0zpnuwJHnwYnjwYnsxY/kvIjgwonbu4fOqX+9nHC1jWWVf1qok2SvkGuegGOB +ak+LbFOMcU+SdVCphFa5i12teFmIb02GeV2DgF6CfmSAfWJ/emGCeV+AfWKEfWZ/eWF9dmJ8 +eGF8fGJ4d2J8dGR0eF19dWJvdlh7dWZ2dVt6dF13dlh2cF11dFxzcFt2b1tzcFhyaFpfUEs8 +Ojw6PDs2OTg+Ozc/PjpCPDo9OzZCOjg3PTU7OTc3PDQ/OjozOjQ9Ojk4OTlEPjo/QDdFNzc3 +PDdEOzZAOTQ4PTc6PTg5PTM+OTY7OTM+PDM4PDg8Ozc4OzU6OzQ8QThCODg+Nz00OjM5Ozs4 +PzI6OT00OTU6PD8+Py9MPD9DPDdFQDo/Pzk7PjRDPzpAPj5AQz1BQDk9Pj45PTVBODo/Qz1C +RDtFRD5USTx3ZEvs+7D+//n////////9//j///7///////3///77//T+//X6//b9//L7//b7 +//f6//j7//f6//X////8/v32/+/6//r2/vHd9uHd8dXc5tff6tXW6dLy//j5+e7z/vf6//Hs +/uf1/u3v/+nw/+Xv/+7n8+bs+Ojy8+3u9uX+/v3////////q//T+//n///7/+fXn8t/e/Oju +9PL9//v//fXx6NtqUmM7QjheSUF8TkN4QjxgQThGRTdKQj5CRjhhRjtxSjh0SEBqRDNVQTo8 +Oy9BQDtNQjFtTD99Tzx+TDp6Sz1lSjpcQTdSQTZTOzhKPTNcQzdqRD1pRjljQzdOQDlMOzc8 +QDM/OjQqOi8+PDIrOjU4NDMpODA3OTMxNTM5ODEyODYwNzUuPDctOTMyNzMvODI3OjQsOTA2 +OTYtODMxOTM1ODA9OzQ4PDQ3OzE4PTY1PDBDQDpAQDQ8QTk8OzY9Ozk+PzVLRDxZQTdXQzRY +PThHQDhEPTdWQjlhRTpVRThTQTlFPDU9PjU4OTZcSztnUURPPTk/OzI9PDFBPThiRTxpSDxT +QjxGOjU8PzJOPzdUQTlIPzRBODc3PDM7PDQ3PjNOQjhNQDhIPTo7Pjg7OzUwPDM5ODk0QTc3 +PDMxQDM2PDc+RjxCTEA6QTw7Qz01Nz03PjEyOTw1PjkxNDc0OzQ1NjM2OTkxODc4NzkqODEx +OTYvOzM6ODw7STpNUVE5RkA/OzouOzU5QD0yPjg4Nzw0PjY1PzY0PTQwPDQyODc1Ozs1QTI5 +NDk3Ozk1OzgxOjYxPDktPS8xOzUvOCw2ODgxODE2OzkuOi03ODsrOzIyPj0vOi00Ozk6QTVG +Rz9EQT47OzQxODUxPjQ1PTk3RTc8QTg2OzIzOzg4PzQ3PjQ2PjcxPjY4PDkvOzE6PjgwODI/ +OzovPTQ9Ozc+PjFTQztYSDtYQzlMPjhBPTNCOzg+OzY6Ozk1PTE7PThIQTRGPjdBQjg3PzM9 +Ojk+QjVWRTxDQzg+PjozQDE7PTs4PzA0Pzw0QzE4PTY2QDM2Pjg+Pzg1RDs5PDM2PTc7PTo6 +QTo7QTo3PDU7PTw5PzEwPDs0QTgzQTw6QTY1RTxJSzxNWkVwZkh2ck2GfVeOh2Ojkl6tl2u5 +mWzDpnjNnW3Klm7Il27RpHfDm3HPpH3QrXzTpX7UsoPYrX/gr4TftYfjvZXrwJLpxY7zxqHs +w5jsvJPpyI3tx4/jwY3ox4fqzJHkv4zZuH3Uqn+7pnCvkWWghl2ghV+tmGmmjWx+cVCJc1CO +ck2QeFaujV69lmS2imCofVuOcEuMflp/fWGBd2J+e2J6e2B9fWJ+emF9emF6fV11e1p6e155 +el59eWN3eV18cmNzdWF8dFt9cFt7dGF1cFt6dF91eVp2dl91clZydVtuclhubVdYT0s6QTc5 +PTc1PTg3PDY/Pjg/RjpCPzg+OTE4PDM2PTE/RD00PjU8PTk1PTJBPDUzOzRDOjk6QDVDOzk2 +PzdCOzg/PTY4QDk5QDg9QjE9PTc5PTw7Qzg3PjY7OTY3Pzc/OzQ+Ozo5PDU6PT03PjM4Pjoy +PDI3Nzw6QzFDPjpJQjRFQ0NBPzdCQD9BQDhCRzNFOzk8Rj09PzY6QDg7Pjg8PzdARTw/QjtG +Sj9RTEF3ZkXo9rL9//n////3//T6/vX1/+ns+eb+//f///////////r8//f8/+7z/+36//Py +++3z/Or6//ju/+z1/ert+ubr8ubf69rf8OHY69Lg89na7dfi9Nn+//Tz//D6/+/w/ez19/L4 ++O/5/ff///X+//7///v9//b6/PX///Dy/+v6++7s+eX6//jz/+b6//X///v//fb+//j+//z/ +//T3/uv19eppUGNCQD5jRzx6UEF7STpcOzdKQTxJQTpQPz5jSTl3S0NySTxrRUBUQTNFPT02 +PTBWP0BpTDl+U0Z/TjWCTkBrRThdQzlTPzpUQzZUODRZPjNrRTtvRDtjQzxRQzdIPTlKPTc0 +OjVCNTY2OTE+OTIrNzE8OTMwOS9BPDIyOTE+OTIvOTI3OzczODU0OjA4Nzk2OzMzOzIzOjE5 +NjU3OzE5OTM4ODM+PDI6PTA8OzU4OzlDQTlDQDo6PTNBPTdDPTNHPz1QPjJXQjldQDVaQzpR +QDVAPjVbRDlgRDpbQzhSQDZLOjtEPTNBOTdZTzltWkhQPzg/OjlCODRDPDZjSzprRDxTPzxM +QDlFQDdNPjVXQjhOPjdIPjc6PDM8OjFBPTtNRjtOPTw5PTQ/PDcyPjE8OjozQzY9ODk3PDc9 +QDg2Pzx0bVpAPkA8QDc9PT48Pzc5PTs3OzQ6Ojg5OjM9Oz06PjU7OD05Njo4OzY4PjwyPTQ6 +PjlDT0NNR0s7Pzg8OTw2OTRAPTk4QTdJSkM+PDpBQD02QT09Pjo4Pzc/Qjk4PThAPjpAPDw6 +Ozg5ODc0OTY3ODU4Pjo1OTA7OTc7PDI1Nzg1OzQ7Nzk0OS09Oz0zOTE+Ozs0QDNAQz5BPDlE +RD5GQTc7PDk1PDk1PTo9QT5DRjw9PkA6Ojc9Ojo+Qjo/PTo6PDw8PTw6PDg0Ozc8PTUzPC86 +QDcxPzRKPDxSQTZgREBaQzxTQj9BOzlJPjo/PTw0QTM0OzU7PTdQPDhNPjhDOTs+QzlCQDlK +QjdWQjxJQjhBQThGPDw8PDdBOjw3QjBBREA8PDlCPD86QzVAPzs/PjlAPTtCOTo6Pjc/ODg7 +Qjk/Qjs7PTg8Pz83RDY+NTxCQTo7Oz5BRTg3QzlRTDtaWEtvYEdrZE2Md1eOhV6zlnGylXe+ +qXTTqnjSo27Nn27MnWnQn3HZrnzZpXfOnmvarXzZr3ngpoTkv4XuxJnsyqHtzKfqyp3txpfq +uH7lv4Xnv4fjwpLfxIrqwpbatonNqn+6n3C0lWmgg16TfVaolGetimaOdVSLdE2OdVCVeFuv +iVq6jmPCkmW9immtgV2RbU+ddlSNeV6AfWGJf2OAfF+Ee2N/eGF4d15/dFx/elx9emB5dmB3 +eV95eGF5eV99dF56eV19eWB0dF1/d15ycFt0bmJyclp1cmFvclp2cF1tbVNbTE45PzQ9Pjw6 +PzZBPTNDQjhDQjRBQTc/Pzk1PTc3Pjg8ODU7Ozo7PTc/PTY7PDZDPTs6PTRFOzo1PjFFQjtD +RDxFPTs4QzhFPzk7PThBRjU9Ozc2OTo8OzY8Pzc/OzlAOzhFPTg/PTY9OThBODw8PDg5ODk9 +OzI7PjY/PjJMRT5JSDlKPj5BQTZEQD5BPDBIQD1EQjk/QT1AQTk8PTxGPj1EQjdMQj1HSD1V +RUN7aUr4/7P///z+//r+//r///////7///////////7///3///z4//z5/+z+//f///r+//f+ +//n8//j3++76/vD9//zz/PXt9+Pj/uPp9Nrk8N35/ezl6uP18Orq8eXp8unu9ubt/O/2/uv6 +/u76/+Xz//T5//v///n4/+ry/+/4+O7+//3///////f2+e/p897q8OT4+/D0/u/48+32//P0 +9Ojb481vUVw3OzZhSj98UECBSEFcSDdMP0BBPDZJOT1gRzp0SUJrRz1tP0FUQDhEPTg5OzlO +QTZxTDl/UD97Uj96Tj1mSDlcQzhNQDVTQDpMQzVdPDtjQjpwPj5hPTZNOjs3NzA9OzkzOTA2 +Ojc8NS8yOTc4ODg2ODE3ODA0NzUzNzEzNjQ3NzE2OzEzNy86NjYzODQ5OjMyOjE/OjszNzI3 +NDQzODNBOjsxOTJDOTgwOjM/PTo8OzZKPTQ4Ojc+OzFEPDVDPDNTQTpZQDddQTZeQTdPPTpB +OzpUQDpdRTpgRzdZQjpKPzRDQTg+PC5cST1uWERTPzs+PDRAOThEPjVfSz9rQz5LPjRFPDdA +PjdMPjZRQjdJPjo8OTRCOTc0NTNBPTdBPjk7PjU6OzY3NTc8OTk0NTdERD04PzU3RDg4PTtH +Rz4+QkA+Qjk9Qjw6ODg7Ojk2Ozc2NzcxNjY4OjQ0OC46ODczODQ1ODYtPDQ2OjM0QTlOU0NB +RUQ8PDk2Oz09PTU6RTlCRj5ISUdHTEQ/QkE7QDg5QTk4Ojk1PzU1OzgwPTM1Ojo2PTA0OjYx +PjA0OzQwOTQ2NTcxOjI4OTgsOTIyOjQxOTE5Ojk2Oy02PDMxPTE3Ozg5OTc3Pjg6QDY/RjtM +SD5JPDk2PDQ7Ojw5PjVAOzw1OzI4Pjc0PTA3PDg4NzM9Ozs4PzY+ODk4NzA8Pjw2Oi42Ozc8 +PDZJQjJVQzdbQTNeQD1NPDhHPThEPzk7PTQ9OTk2OTpEPTVHPDJKPTs+Oy5DOjw+PTRQRD5S +RjhNPzw+RDU/Qzg2PDhCPTg4Pzc2PTc9Ozo6QjI/PT0+QDU9Pj88Pzs2RDs5PDo8QDk+PDw3 +PjQ9OTw3PThCQD08Ozc/Pzg6PC9BQz07PS86QT9FST1WVk1hU0lpZUiBdlyaimm0k26zi2G/ +oXLIpG7FmnXKpGzQonjWp3jTrX3arn7TroDdt3ziuIvpxpfqxqL4057u1a7txJrtvpDlwYrm +wYnmxYncuIrcv4beupPXqnnFoXS5lWuagl6NflWnjFuuiGGLcleLd1WPeFCTdlSqjmLHn3DK +m2jGmma7i2G0gVmUb1SjglmkdVV+cE5+eWN/fWaBemd8e2SCemN7eFd+dV14eVyBeWZ3d1mB +emJ2dlx+eGB6eGB7clxzdlp4cmBxclp4cVxwblp0cFV1blZwb1p2blZgSkU4PDc6OTk3OjY+ +OjM6OjFEPDk7PTREQDo8OzRBPj07PjU9PDw8PTA9QTw+PThBOztEPDpDPjs/Ojs6PjVAQDs8 +ODg/OzM9ODY+QTRAPjU+OjY8PTk6OzU8Pjo1PDBDPDk6OTZDOjs+OTREPDw1OTJGPTwxOzZA +PzlEQDhPPz1MQj1DPjxDQD1CPTlIPztBPjc/Pjk9PThDPzpBPT5DPzxHRD1GRTxPRUNSSzp1 +Yk30+LD8//H9//H////z/ur+//b9//b8//P+//r+//H///v6//79//D////9//v3/+/+//z3 +/vL8//by+uzl8uXx+uT8/f/q+Oje9dbl89/e6tve5dTu//H4++/7//L///vx+ef0/vj78+Xk +9d3s8+bs+un5//Hx/fT///7///P4/vT3//L6/fX///n9//j9//n9//3y++7++/f7//D4+fHu +8O1xTmc3QDljST17Tz19SkFaPjxKPDtEQDtJPzxdRzhzR0RrRjlqRzpNPjhEOzs7QDJJRjho +Sj1/UUGBTz13Tj9xRztaQTRQPjZWQDdMQTdcQTRgRjdqRjphQDVHQDo0OTU6OTszOTA5ODUx +Oio6NzcwPC05ODcsOC81OTUvNjU1NTU0NTQwNjE3OTY1PTU3PTQ1NjQ1NzY4ODU0NTM1MzUz +PC0+ODI1PC8+ODkuOjQ/PDo3PzNFPzU2OzU/OjQ5OzNKOjdJOzNYPzpYQDZdRzpMPzg/OTVN +QDZXRjhhQjlUQTlPRTlIQDg/OTNTRz1pWENQQTw8Pi9CPztEQC9gST5mSDNSQDdFQjJEPDlL +PjdNPTpIPTk5PDZBNzg1OS4+QDM4QjQ8NzkzPzE3PjcsPTE6QjY2OjsyPzU2PDxAPjw7Pzw7 +Pzs7QzozPzg5PTk1PDU3PzQyOjQ0PDMtOzI0ODIzNjYvPi80OTo1PTU7QjlCSkJCPz81QTg3 +PDk2QTxKS0FIS0ZJS0RFTEVBQ0A4OTk5Pjg2PDo4PTk0PDc0PjEzPDg2OzQwPjg0ODM0NzI3 +ODYwPjMzOjguNzIzOTguOjA6PDwvOjQ2NjowNiwzOjgwOy43PjYuQDY3OjY7RTNGRTtfU0Ji +TUk/PTs0PDQ0PDUyPjg1Pjg7PzsvPDc1PTczPi42Ojg0QTc/PTc2OjA6OTc3Pi89OzwzODBE +PTxSQjNeRT5YRzNZZklJODhCOjA/Pjc3NDc3PzQ9PzZFQjtGPjpCPTRFOjo6PTJMQTpSRTdJ +PTw4QDU+PjguQDM4Pj4uOi09PDcyPTVEPDg2PDQ+PjA6PDc6PTQ6PTc6QTo7PjM0QDc8Ozg8 +Ozc3PDc6PjY3QDg/QT83PDM3Ozo2PjU/QTg2PTNDUEhVUUBUVkVmZUOBfF2hiWKwkmqliV+y +m2nEmW/DkGjNnnHNqW7VpHvTqnnarILXt4bgu5rrvovkzp3tzaftzKbtyKDlwI/tuZPdvYzo +v43SuIjZuYLUuITNona5lnCnhmOKfFeajmKqj2aOelGDcU+QfFGffVimi1u9nWnNoWrGoWnE +mWjAimGtg1mZdFOlhVeyg1ike1qIelt/d2J4e2Rye2V4fGl5el94dmF0e158dWN4eVt8emN0 +e196dl5ye118cF53eGB4dGB3dlp1cmF0b1x0cVpub1lycF5wa1lSTkc9PDMtPjc1PjZCPzs8 +PDpAQzhAQDVAOjc2PTY8Pjg0PDE8OzgwPzA7Ozk7PjdDPDg7PDhCPj06OTVAPjY2QTY+Pjg4 +OzM4PDlBPTQ8OjQ7QTc1OTE6PTg/OTc5PTZEPzo8PTQ+PTg3OjU5ODk1PDQ9PTYyPDI/Ojk8 +PzRNQTpGQjxHPjw5PzZHQjlDPTlHQjo+QTZBSTg5QD47OTVBPjpAQTtDRz1DTEBVTTx2aUn/ +/8H///z///H///////////////z////////////////////7//T3/fD5/+7////19/Dv++f6 +/+/y/u/8//f3//bu+ufl9OnV58z7/Pfr9+ff7NT//P/t/e33/fDx//T7+/Ps/+z+//z7//P7 +//fs9uz4//n///np9uD1/vv///vt++b6//H7//fx/ejt/u75/vX7//bs6t/o9uX6/uzt9ONy +Umk7QzhfRjpzUj54Sj1bRDZHQTs+PDBHQDxUSTlyTj9qRj1oRD5TPjdEOjk9PTVDRTprSz17 +Tj1/Uj93TjtqRT5aPztMQTdXQzVNPThcQzRmSDpqRD1ZRDROPDg0OzA+ODozOjM1NjgyOyg1 +ODUuNTI5PDgzNDQvOjAwOi8wNzc2OjcyOjI3NzM0PTQzOjEzOzMuNzU0OjUwOi80PDQwOzI7 +OTk3ODM9PDczODM7PTQ4PTNCPTY4ODY8OzFAOTVEQTNPPjZWPDlcPTtcQjZOPjY4OzlMPjNZ +PzZdQzxZPT1NPjo/Ozc/NjBRSTpnVUBRQz06OjFCPjlCNzNcQj5rRzdNQz1GOTpAOzhKOjhP +PztGOzw8PTQ8OjU2PTM7PjI5PTY4PDg1PDQ0PDQ7Qzw5Pjs9PD4zQDQ5QkA2Pj8/Qz47RTo8 +Qz01PDU2NjY3PDo0Ojc0OzQyOjQ0OjszOTU5PDgyOzk4Pz1CTEFMS0g6Rjs8Pzk8QztEQz4/ +TkFCQj84QUM+Rj89QUE+Pz83QD42OjA6QTw4PTkyPTQ1OzszPjQ3PDYvPDM0OzcyOTUyOjku +OzA3OjQuOjEzOjUxPDY1PT0xOjU1PjsxPjI0NDQuOzA1NzUzPDYqPjU4PDQ8QTpMSz1ZUUFL +Rz47PTk4QDQ6QTg6QjU6Q0A2QDk9Ozs1OTQ1PTcyQTQ7PjsxPjM4Ozk2PDI4Ojs1PC1GPjtV +QDtbRTJYRj9SOzlEQDtDPTg8ODU2PDQvOzNCPjhDOjNLPDc/PzlBPDs8PTZNPj9PRDlQQD44 +Ojc9QzcwOTc6Ozg3QjU+Ojo6PTw0PTg3OTs4PTU4Pjc1OjM9Oz08Pjo6Ozk1Pzo1Pzg5PDc6 +OTc9PTwyPzM/O0A5RDA9PDwyQTA6P0E1PDE5PDRDTzlUTkJRS0JrbEyXh2OaiGOig1uhiWKz +nW7Do2zDn3XJp2/JpHnNqXfOr33er4ThvJHqwpXl0Jzs16bk0qjz2q/qzJ3pzpnlxJfjxI3Z +vY3MrH+9o3WxlGacgWSDdlOehmCkjWKOe1iEeFGafViqh1uyiWK/mmjQnnjNoGrIlmfHm2TD +k2ezg2Ced1Wph1e/lWC9kGqwdlp+c1VVYVNJZVNEZVNKblhSc2Vidl52emV3dF53dWB6dV9/ +eGB1dlt6cl1udVh5b15zdFl5cVlyclt3dFt0b1tsbllwbVRUS0g6QTY7Ozk5PTg8PDc3PTVB +Pzk4PThCQDouPjc+QTk1PzU8RDo8QjQ7PjM5OTNBPjk4PTVBQjc6PDRAPztBPzk9QzI8Ojg4 +Pjc6PTQ4QDI4PjQ3PzE4PjI1OjQ5PDFBPTo+Pzg8Pjk2PTY9PDkvQDI8ODouPzQ/Pjg+PjZJ +QTlERDk/Pzg6PjZBPjhBRT1BPzg+Pzo7Qzs/Pjw/PzxBQzw+PTxCQjxGSEBTST93ak/+/73/ +//j///7///7////+//v+//X////////////7//f5//X8/u35//T+//b1//D8//n///z0+vPy +/OX4//Dw/erq9urZ8NTl+t3i8d7e4tTi8tzp/+bt8+ju+uv1/fX19+vy/vL0/+zp+eLl++fz +/O7t9+Xt9+j9/v3///r///n6/fP6/vn5/vb9/fv//////fr///71/fb//fP1/u3t7NxhUmJI +Q0FVSEF8R0F5TkNkRTw8PT1RQD1EPDxkRDhtSUBwRkBmR0FPPzlAPzg2QDJPQjxlRzt5T0N/ +Uz19TT1qQjhaPzpRQDtVPDlMPjdWOTdkQzhpRDpjQzlLOzpBOTk2Ojc4Nzk2NjQ1OzM2Ozcx +ODM7NTMsOjU5OjQzOjE6NjsuOTY5OTk1PjY2Ojc1NjQ5OTQyNTU9NTs2Mjg3Njs1OTo/OjVB +OzozOTg2OTU7Nzc8Pjo7OjY7NzJDPzc9PTdFOTZNPjVcOzxXRDRqQTtQPTdEOz1LQjpfQD1X +QTxbQThJOjdFPDk+OTZOQj1lUUVSQDY/PDc8OjZGNjhbSDtjQzxMQjhEOjFCPjZBPjZPPTpA +PjQ+Ozc0NzE/Njk2OzZFNzsvODY9Ojw4PzdDPj41Oz05OD87Pj42PDw7PUA6Pjs2PDo2QDk/ +Q0I6Pj05ODYyPDoyOjM6NzoxOzI5Nz02OjRGQEJFRTxJRUg8RDY5PT83QTNCSElDPz1AREBB +R0BCRT1GRkdERkdKRUdGQ0Q9PDs2OTg0NjkzODgzODM3Ozk0ODU0OjkvOzM1OjcyOjU5Nzgw +PDU4NjcyOzM3ODgxPDg1OjM2PDk1PjY3PDY3OzI3OjgwNjU9Ojo1PTdHRj5YTkFfTEdoUEpJ +Qj06Qjo3PDg6Q0EzPTE8Q0BFRT0+OjwvOS41Oz00OC82OTs4Ojg6ODczOTU2NzVHPDtOQDNb +QkNYQjVQPzpCPTlCOT4+Ozc2PDw0PTI7PDtKPTdGOztFPTM9NDtDPDpLQDtWQjtGPjc+NzU5 +PDczPjc3OjM3OTQ/ODwwPzA9Ozo0Pi07PTgxOzE2OzoyQzBCPEI5PTQ8OD03RDBCPTw3PC0+ +QD86PDY6QTs3PDo8Ny81PTw2OjU3QTU5OTc1PTRETEJJPDxVYUNvc0+YflyVfFyVfF6jkmW0 +l2q7o3PMqoHLo3nYponXsYXewpfkuI7pwJjlwpfgzKDmy5/k1KTeyJncwpfawpbZuo7PsoDK +qXSslG2ag2l/cFShiWaajGOOdWGFbUqcgV+ujV3EoW7HpGzPq3jOnmrbpnTEmGXGm2a/jmSz +iWOmd1isi1zEmWrKoG3Jm221g1+Sa1ZgTU04TEVEUUJJaFdSb2tTc2lreWNwcmF8c2FyeF96 +dlx5d199dVx0cmV5dF51c2J2cVtycFxvcFlybFZtalNZS0c4Pjk6OTk8Pjo8PzZAQTxBPjtH +PT0+OjI9QD88OTE6QDk7OzQ7PDk5OTY8PDw9PDdFQTU/PDg3PjVBOjk8PTg/PTg5OzRBOT42 +PTc/QDU4OzU9Ozk7Pzo8PTY6OzdCOzlAOjk6Pjg5QDY6Ozg6ODg4OjszOjY9PzlIPzVHOj1H +QjxAPjtAQTpFPj9CQDZJQEFDQTlCPDs5QTlEPzxAQTxGQT1BQTxJRz5USUF6Z1D3/7T///z5 +//H9//f///////z////////9//r////7//b7//r4/u3+//X9//b7/+/6//T//fby+uv8//ny +/e7s+uTn8uTk8+PY6tHo8+Dk7tvd5dr///v++/Py6ubp++v6//nu+On1/PL8//H3//Ls//D+ +//77//P5//Xx++3x/+z+//f1//D4++zx//L7//b7/+ry/PLz8+v4//D4/+/u7+NpTV5CQTxa +RTxyTDh6TENgRDlMRTtDOjdDOzZfRTlqRkBqSDlhRDpVQTo4PTFDPzc/QDRsRzl0Uj+AUT16 +TztyRjRZPjZSQDNPNzdMOjdXOzZiQjlpQzxkQjVVPjlJQDNMOjo5OzM4OzU1OzIzNzMzNzQ2 +OjIzNzc1OjA3OTY4OTI/PDk0OjA3Ojk5Oi80OjU2NDQwODM4ODEqNjQyNDM4OzFBODU1OTA4 +OzQzNzMzPTk7OjBBODY3OTU4OzQ/PTRBOzJJPjVVPDZYPzZiQjlSQDQ6OzRNPTZZQzlbRDVW +QzhGOTVEPjY5PTBJQjVhTTxLQzY7OjBCOTM8PDReRDJjRzVPOjc+PTI/ODhDQjBKPDQ5QDU5 +PDI1OTkxPC0xPDUvODEwOjM9PTc4QjY3Ozs9PTpFS0Y1PTg1ODY6QzY7PTszQzFBQT0zPzVA +PTwzOzU9PDkuODM7NzUwNjg7PjZDRT9CSEE9QD02QzsyOTk2QDs3OTg4OTU0OC48Pz48RTtD +TEVITkhIR0I8PTY+RDw4PTI9Pjw0OjA4PUAxNy00Ozg0NjA0Njk2OzU1Ozg0OzQ3OjI3OjQ2 +OzU1PDY6QDc4OzU5OjUyPjc3ODU3OTI8Ozg2QC8/PTc2QDlCQD1FSTdZTkBjWUd/ZU9mUUVL +Qj8/PDw/Qzo9PDs0PjQ1ODg4OTQ0ODY2PDY5NzQ0ODM4PTo2OzM0NzI2OzU+PzJSQTpcRjZa +RztJOy9DPDxCOjE7PDY2NzI4PTVAPC5KPzdCOzk+PDQ/PDQ6Oy1JRT9QQTdIPz1APTg2ODhA +OTc3QTc4PzI0Oj87ODc5OTU/OTY1PjdAPDY0PTM+Qzk5PDQ/QD01ODc4QzM5PDU1Py86PTcz +OzE9PDMyOjU6PDsyNzU6Oj05OjA6Pzk2NzI6Pzk7RDA/Qj1EVUBwcEmEeVSOgF6QiGOljWe0 +lnK6pnbSpn3Ts4XSs4Xcu5HZsovgvYnZvorbx5LYwJLWvI3TvIbUuoLKp3u+oG+0mm2ohmCG +bFSTfF+ajWGTg1+Eb1GRgF6yjme6nGzJp2/WsnfVrnPOrnLRrnnSp3PNqXLNnWq9lWO9jWem +flavi1q3mmHVrHvQqG/SpXm8jmOwfl6KZk9bR0VIZFNQcmdNdGtLcWZQcmxacmNnc1xueF51 +d1l2b11zbl95cVlvdF14b11tcFZ6cVpmcVtzaFhVTkI6PTUtOzRBPjY9OTY8OzRBQDhCPTg/ +PDg8Piw5QDY1PzE+OzgxQDU9PTZAQzVBPDVBPjZAOzU+PDc9QDRDPTw4PzU9PTs2Oy48PTVB +PjQ4PTk7OzU3PDQ4OjQ7PTc/PTU7OzU7OjQyOjBBOTc0PTg7OzgyOzY4ODpAPjdMQDpIPjg8 +QTVAQDpBQjdFPzdAPjc8Pzg6Pzg/Pzg4QThBQjxHQUJIRj5JREFOR0B2XUr6/7f///r///v/ +//b///z///////b///v///////////z////7/+z///X3/vb5/u36//32/vD8//X3+vTt8+Ts ++ufn++Dm/eHg99Th6uHY58/c6Nrx/+/9//v6//Pz//T3+fD//fn1//X9//r79+r6+u/s9+Tp +/+r4//n///by9O/88Oz07e79/vz///v7/O/+/vr5//Tx+fH4/O34//T98+xtT2E+QjpWRz94 +T0N6SEFkQTpFOzlIPzdCPjlURDlrRT5uSThrRD5NPDNHOzo7PDJPPjhiRzl1T0B7UDx/Tjtw +RD5dPTdVPThSPThNQjpYPDRlSDppRjhiQEFVPzZJODlOQDg9OzE5NDIwNzE9OjcuOTE6ODQx +OzM6Nzo1OjA/Njk2OjQ/Njs5PDU5Ozc2ODM0NDI6NjQ6Mzk1OjI0OjY/NjQ8Nzs8ODY6OTQ0 +ODNANzc4OjhAPDc3OTFCNzo4OzBDOjRKPzZdPT1aQjZpRzhPPzRFPTlEPDNeQD1ZQzVkQjhP +QjpCPTI/ODRDQzhfSEJNQD1ENjVEOTs8PjVdRzthPjlPPTtAOjFCPDU/OzVFODk3PDNCNzYy +PDQ8NDUxPDU+NzgxOjU6OjQ3Nzk5OjhBQ0Q0PDg4ODY7QT08Qzs2PjxJTEA7Ojw3NzU6Ojo8 +QTQ7PD03OTQ7OD05PjVEQkNFSzw9Pj41OzQ4PD02PDAzQDw1PTQyPDI4OTo2PDo9Pjk+SD0/ +QD1BQz9ERT5HRT89Qz41Ojo1OTI6OTkyNzEyOzIzODM9PjY0Oy49PDo2OTY5OzYyOzY4Ozg3 +ODM2OjQ4Njk7PDY5OjgxNzU2OTU2OjQ5Njg0PDc7Ozo6PDtJPkBXTkN4Yk+HdFdsVUZKSUI9 +PTc8QDxHR0JFQkQ+Pjg9Ojw6OTY3Pjc5ODM3Njc8ODw5ODE7Ojo2OjJCOTlOQDdhRT9VQzVK +OTw+OjRCOzU/NzY9NTk6NzRAOTlOOztAPDZGPDVAOjtAOTVNPjhTOzxGPjs8Ozg3QTQ6QTE/ +PTk0PjM+PDk2Py4/Ojc6QC87Njg6QS87Oz05Pyw/PkA0OzM6OTs7QDA6Pjs6Oz84OzQ6OTU4 +Qz1AVlo4NzcvODQ4OTsyNTc8PDsyPDU6PTc5OjlCQD07PThIVT5fbEh7c1mDcVSRiGGii2mx +mXa3q3nCqX7Jq3vCpH7FrX3Ru4zGq3zIsn2+o3fIq3y+nHS6mnizk22ejmSIglmBdFuVflyb +hmd9dlKJZ1akjWHEmnnVr33atIvgt4biuofYsYDSpW/QpXHWrXzaqnfPpXHFmmy8j2yuf2O3 +h1vCk2DLpXLSrHbZq3nGmm7HknCof2B6ZlVHa11SbmdDcGxLc2tGb2xLaG1HaGRNbWVdcWpo +dWFwcl51c115cGN2dF51cFptcVd1ald0a1hWSEY4Pz00OTY9OTo7OS5GQz9CPTU8PTY+PTI9 +Ojw/Nzc8Ozc8OzZAQDlCODpOQDpEPDs8QDRBOzw7OTJDQjk5PDQ/PDk7NzQ+OTs3PDNBPDY3 +PTU7PDU8Ozg6Ozc5OzVCOzNEODc3OzhAOzc4Ozo2OTQ9Ozk2ODI+OTxCPTZVPzxHOzZGOzo9 +PjVHPj5CQTpCOTo5QDlEPTg/QTxEQTo+PDxIPzxAQz5MRTxVRkVwXkft96v9//b///j///// +///7/+/9//n///////r+//b+//X8//j1/ub9//X5/PD9//r1+ez7/O/8//f+//n3//T9//jw ++O3j9OTh9c7m9t7r8+Lb7drr+ePw++j9//7v9+3z/vD+//Hx/ub7//b///L6//X59+/w7uPh +/eL0//P9//77//f3//j8/+31/fP9//X8//jr9uLk8+z1+uv5/ezu9d1fUl1BST1YSDx1TEN0 +SDtlQjs+QzJMOzo+PjZaRjlrRztwRDtiPjhNQjRANzY5PzVEQjdgRzl5UkF9Tz11Uj1wSTpY +QTVRPjhOPTJUQDpQQDdoQz5jSzRkRTpNQzNQOj1JPzFKPDdBNzM3Ozk2ODA1OTI0OjI1OzE0 +NjQ2OzI4NjM1PTQwOjExOjAzNjM2NzQyOS04OjItNi47OjUwOS5FPDU0PC9AOTM1OTA9OTQ3 +OTk9QDg+PTQ7PDU3OzQ+ODJDPDdPOTlVQDtcPjhpQzlRQjU/OTNFPDpYQThcPzhZPzVQPDs9 +OzFBOTtBQDFaSj5JQTA+Nzs9NTBFPTpbQTVgQzVIPjU9PTQ7OjRCPDRDOjw8PjM5NTY4PTQ2 +NjI1PTI4PTY0OTYvPDQwOzQ6Pzg9PDs4PDY8PTozPzk+Qz0/RUE/Qz47PDs2OzM3Ozs5OjM6 +ODgtOjE8PDo9RzlJTEU0PTM2PD4yPTs5OTcwODY3OTIxPTUzOTUzOzg7PTI4Qj88QzU/SUFM +S0JLTU1BRT07Rj83PjkyPTI0OzYzPDA8PjwyOzQ5NzowPDY5Njk0OjI8OTsxPjQ4PDU1OjM4 +PzYxQC83PDUzPDM2PDU1OTUtOzs1OTY4PDk4PjM9RTdFSjlaV0JuaEV7Y01fT0JMQj45QSw9 +QDxATEBKSkM9Rjg5PTowOjI5QD8yNy86OT02NzM6PTs1Pzc3Py47PDlSQzVYQzhUQTtHPThD +PzY+Pjg9PDYvODc1OTk6PTRGOTo7OzFIODs6PjRAQDpFPzhUPzo7QjREOzszQDQ5PDU5PDo0 +OzY5PTc6QTY0PDQ5PzQ2PTc7QDg0QDc7Ozc2PTw8PDg2QDc7QD0vPDE8Oz0vTD4/Wl4zU0hB +YGQ3Pjk6QDovPDMzOTpDRzxcRzxDOzw5PDc7PTk6PDU6Pzs9STZNVENgY0dkbkx6elR+elaL +iVuRiWilkmmdjGadi2uRh2WWh2COjGWdi2OVjmSUiFiFelxzbVN6aU+RjFqWfmCCelCDbFCq +h2PLrXbNr3ncsn/ixInkuYvguX3fsX3asHfSrXnTs3ncsnvSsHTSpnTJomzClmO4i2XBk2PA +lmLMqXPPq3XXsX7UsX7PpnqtjGpxbmZKbmVQc3BCdWxGbW5Ha2ZMdWhKbmdLcHFFbGxIeXlP +fX1bcG9rcFpnb1trb1d0b1ZtdVxraVZOSEI3Ozo0PDc4ODg1PTRBPDs8QDdCPTw4QDM8Ozcu +QDE6Ozk0PzRAPT08PzY+Qjc7PzQ/PTg8Ozk+PC89Pjc7Pzc6OTY7QDU7PDI+PzI8Pjc8Ozo0 +PjE9ODk5PzFBPTo/PjRJOzkzOjRAPD4xOzJCPTwyPDY7QTU1PDVDPjlIPzxCQTtDPjo7OTY/ +OTtBQTpFPTpAQDpBRj49RD8+QTRDRj9IQTtDRUNGQzhXTEduZkL0/7r///////////3///// +///7//P+/+////7////3//b+//P///D+//f7//n////8//vt9efy+eT8//ny/ez3+u/1//Lq +/ujf9dPY5tjh6tfp9+X1+vLx/PL0//f0/evw/u/2/+vr++nx/ejx//D6/vT0//T5+/n///z/ +///t9+jw+O31/+zt++ju+uvz/u36+fD+//j///n///7u8Onp79t1T2c7Pz1WRD9zTj51RkBo +RTxFQjpLQDk4PTZZQTliRzpxRj9hRjpRPTc9PDk9QTNDPTlcRjhySz54Tzt8T0FsSjtbPjtO +QjZWPjpLPDhZQTdaRDVoPzxoRz1SPjlMPTdIOzhJPjpSPjRGPTUzNjEzPDg0NzAtOjU3ODYz +PDU4OzItOzM5NjguOTA3NjMzPjQ2NjQyOC80Nzk0OjM3OzE+PDBAOzc3PjE0NzMxPjM4OTM9 +PjZAOzY5OzM0NjZAPDY8QDRGPjdSPzVeQjdkRDpTQTRAOjlBPTJYQTpVRjhcQTxMQDhFOTc3 +PDRFPDxORzVNOzo6OC88OTVCQThZRTdaRDtIPjU+QDU6Pzc6NjI7OzkzOTA3OzMsNTA7Ozky +Ojc0PTwwOjQ7QTkyQDRAQD0xOTVAOzs4Rzw/PjguOzs6PjgwPjY4Ozk3Pzg2PDk3NzgtOjU5 +PzdBQj9DSEU7RD8yPDExPTkxOzU0OjktOTMzODgvNjI0OjwvNy04QDc9RTg8R0VFS0FNTk9F +QkZMUUdDREMxOTY0OjcxPDg3Pzg2Pjo9QD02ODkzOzU6PTcyOjg2OzgwOjM0OjkxPTY4PDky +PjI7PDkyPjQ3PjcvOzc4PzUtOTcvPDU3PDUzOTc5QTlPUEJraU59alN7ZVZSSTw+Pz0+QzxE +RUNDRUI/Qzo9QjszOzAzOjgzOTI1Ozw0OzUzOT01Ni4/OThEOTRNQzhYRTxQQDNGPTo9OjRB +Ozo3PCw2OzYzPjQ7PT9DQTpDPjtDQDg8PjhDPzRCQDlRRThAPTtBPzE3OTc7QDU1QDk4PTM2 +Pjo4OzA4PTw0OzQ6Qjk6PjQ8PEAwOTU7Pz0yOzA9PkA2QTQ8QUY7WUpBXWs1VEo4UUlBblxQ +VlZqUUBXRUA6QjhKSUNaXE1zZ0hiP0A6ODw7OzlCPjo5QjY+STs/Rj9QVUNPXkZiYk1kbU1o +c1Fuck53d1VvdFhwb09bYUZcY0hbW0VrXFBqWkuBb1OUgWSRi1yGdVN6Z1CTeVe8nHPTtoXg +vYjavI7nypboxI7rx5Plwo3jvYjatHvgsIPatnfZuHzZr3PWq3vGo2vBnmq8jWXGk2nHm2nJ +rGzTrXTQr3fUsX7LrHO3lG5kfGFLeWxLcmlIcWlMcWlCb2lGdW4/cnZQcm5CcHNSbnY8c29M +cnpLb3FgdF9obmFqcFpycVxmalpSREY3PTg/PTo0PzQ/OTk7PThCQDk9Pzs8PDY4PTc5PzM1 +Ojc6PDM5QTk4QzU8QTw4PTY8QT46Pjc7PjY+QDc4PTY+Pzc2PjY8Ozg3PTY9PDYyPzE5Ojc4 +NzQ8OzU4QS1APjs7PjY3PDYvPjQ5PTM6PDc6OzU2PDY3OzdCPDdIPjtIQDhCQTo+QzdFPTg/ +QDNFPjw5PTk8PTw6QTZCQj4/QEJEQjpAQDxOST9TUUJuX0rv/Kv+//31/fD+//j3//P4/+/+ +//////////////////////////Xz/fLy/+rq+ebl9OP2+er+//ny+/X3//D9//7r++bp+ubW +6dHj7N7y+urt5+r0//n1/+nt+u3p/ubx8uv1//H6//bu/+bw++zx/Or7//z////9/+/6//D/ +//r///3///////379+z7+/Hy++3z++v0+O3y8+v5/Pn79ex4TGE0PDlbRjhmUTp6Sz5eQD1M +Qjg/Pjg9QDZQQjtiRzdrRj1kSDdRPzU4PjY/OjhASDdjRjlrSzp6TjpzTDhpRzhYQzVQOjhO +PDlRPTlTPzdgRDhmQTdkQTdRPTlNPDBKPjZNPDNQQDdSOTU7PzIuNTMuPS81NjUtODA2OTMv +OjA1OTMwPS8zOjE1ODA5ODI0Ny41PC4sNzI3OjU1OjU9OjQ8NDAwODM4Ny01PDU4OTI8PzA1 +PDI8OTc3OTFBNjU9OzNMPDpUQTVeQDhjRTZZOzk4PDNFOzRSQzVdSjdbRDZQQTdBNzE7PTJA +PjVQQjdJQjc2ODQ7OzQ/QTZWQjVYPzdFOzE/ODM3Nis/Ojg0PjQ8PDUvNyw7PDguPTI4OTou +ODQ9PjwxPDxAPTkvPTQ4OTM+OzowOzM0OTU1OjY8QjY4PTs2PDUzPDk4OjU0PTU8RjpGTUZB +SEY7RDwvNzIyODkzPDA0ODcvOi0xPjctODIyOTwvOjYxPDQ4PjQ4RzxERz89QThHQkBPUUlK +TEc3Qjk4Pjk3Pjo9PjU7QTk6Qz09QTsyPTQ6QjUxPDQ1OjswPTE5PTUyOTU+Pjk0PDU4PjE0 +OzQzPDAzOzQ0OjYzPDYzPjQ1OTgzOzU3PzY1PzQ4PzI9RTxXZkRtW0tTRj0/Qj07QzlDREE9 +Qzw0Pj5AQTg3PToyPjIsOjUzNTI1PTc8OTgwOTA2OT09PzRQQTtVQzhQQzhFPTU9OzZBQjU4 +OjU0PTMxOjU8PDFCOjdEPTc+OjFAPjM7OzJHQjRMQDlBQTI6Ozw4OzE5NzcwPDM4PTo1PjI+ +Pzg1PTA1PjkzQjE+PTs3ODE4PTg0PDE2Pjs3QjM9Tk9Dal9BZGw/YmY7U1U7U01FaWVUcVuB +dVluU0I+PDxGUT1kXEh0aVCNdVR3V0JJRzs3OS8/OzouPyY5Qzk8RzBDRj9ARzxXSkZOSkBf +UUFdV0lwakt+bFSBfFiJfFyUe1uJflyFf1eBeFZ6cEx3ZkSXd1e5n23Kq37OuYPbsX/kyI7q +x5Poz4zpyIvmwoTovYLevH7Ztnvas3zbuHzdu37UsH7OrnbIpm3Emm28lmLBoG3JpW7HpWzL +q3HOr3bOrHPDn26miGdVfGhReXJDcmtMcGtAcmtMcmtEcW9Kcm1KcXZIdnlKd3pCbXFAbHBH +dXJJZ2xCaWhWb2Fdb15laVhGS0Y0QDVMTT05Ozo8OzM8OzA4PzZBRDM+PDo2OjE5PTUyOzQ1 +PDk3PTQ1PjQ9PzY5QTQ7OzY6PDI+PzU4PjJBPjc6QzU/PTc1PjI6Ojc8PTc1PTMyOzQ9PTc3 +PzI7PDM7Pzc/PjU4PjY0PTc6PzEtPDYzPjAvOzM5QjBDOzhFQDZLPzo5QTQ+OzozPjdEQTc7 +PjdCQTg3PzM9QTk3QjtEOj49RjlJRTdGRjpUST1oXUnz/a3+//j////////////+//n8//f9 +//n///r4//H///n///z///T///////71/+/7//r7//n5/+/2/+74/fPf7d3k7NTj+d/f/dPq +/ebn9eLb5NLy/+74+fPy8+fy/e/3+ejq+uX7//P6/+z1/O32//D1/vL6/+r8/fX+//7///fz ++eLx/uvv/+b4+ev0+ebp/Oj6//r7++3+//jy9ero6N1tU146RDhYRzpxTD50TTxlQj5HQzhE +PDZIQTlTRzZmTz1nRzxsQDhLPTVJPjY4PjdOQDVeRjx0Tj56Tjx3SjluRjhWQDVWPDlOQjVZ +PjhXPTVnQjhmQzdqRzlVPzdSQjdSPTdNQDdZQDRaSDRMPTQ3OC85PjU5PDA5Pjc7NzI7PTQ/ +OzQ4PTM5OjM9OzE9OzA1Oy8+PDUzPC06NzQ2PTQ8OTc9Oy87PDM7PTU8PTU4PDY9OzY+OzU9 +ODMzPS8+PDFEPDRLPjVcRDRcRTZpRzZgQjY8OTJGOjZRRTdnSDtiSDlTPTlBQDFDOTc9PTNN +QDhIQjZCODc3PTBCOzhTRjZmRDlEPzZDPDVBPTU9PTA5OzQ4PzI3PDQ1OC83ODM4PDozPjc+ +Oz08RDRCQz44OjU7QEE0QDdAQj01PDk9Pjg9RDpEPT01OjVAPjY5PDs6PTlETj1LTE1BQUM3 +QTw1OzYzNzYyPDQwPDQ3OjUzPTY0OTM4Ozc1PjU8Nzw2PThEQEA8QDdERkJNU0JLTExLTD1H +RUhBRD1BQ0I/QkE4PzJAQjw9Qzg/QDk+Pzk5PjY5PjU8Qjs8PDc5PjY3Ojw4Ozg/PDk3PTVA +QDw3PTBDPTw5PDlCQD07QDdAPjo2Ojk7PDY6PDlBQDpRSj5iV0dTRj0/QjpDQTo9RDhHREY5 +Pzc8PTNBPUA7PzU4Ozs3OzA8PTY3Pyw9PD03Ni1BOjxRRThYRjlTPzRKOzxEQzZAPDhCQTg4 +PTc4ODc/PjpMPTtGOzREPjhAQC1BPDdKQjpTRz1LPTU+OzlAPDo9PTdAQTo0PjY6PzM3QTpB +QDc5PzRBQzQ4PDU3RDpAQDU/RzxCU1k6Yls/WllHbmtKcW5DaGZEXGA+XUxJb2JcfVuNeWVv +VERERkFTUjtlYEl8a0yKe2CdiWSedVd9WUVeSzlEQjo/QjdAQThEQzxGSj9OTD9QVkdhW0he +XkpjakhpaE5salRsZUVyZ05jX0d7YkyMcFC7nG3GoXzXroLWtIjbuoXiyZfxyJzs0Zjs0JTl +ypPrzJrnwYbmvYnhunrlt3ncu37btYLduYHeroHOrXfPoXrEpW3Dm23KqWrQpnbOqXDRqnrR +rH3Fo3K2l3CEfGVVdmpOdXBQcm1MdG1Ocm9Kc2tJcGtQcW1Ic3RRdXlGc3ZRcnhKdHRMbnFC +cW5McHRBcG9ScXdIb3RMT1k4Pzw5QDY6Pjk4RDVCPzlAQTdCQjtDQDg+PjhAPjU5PDU7Ozc9 +PTI/QTk8QTZDRTs/OzBCPT49PzFAQTo9PjM9PTpBPDE0QDY8QTU8QjE+PDU2QTA/PDg0Pi49 +PTs8PDZDOjg+Py88PjY7PTI3PDQ1PDE7OjY3PDVGQjVKPzhLRDlJPjxDPDxFQzc+QTZGQzk7 +PDs7PzRCPTtDQTZLQjw/Rj5FRUBMTDxZTkBwZkX6/7j7/+r+//j///////////////////// +///////////8//T9/+3///3///7////////////3+vfz/+jy/O72/Ov9+/3j8ODd79Te8djY +59Hc6tHq//L9//z9///////7//z7//n69+Tt/en0+ev0/vX8/e/q9eT8//f0/+n8/fj49+vt +9u3+/vv///7/////+/fq7t7r9eH+//L9/+/s8ONmUF0+PzpURDtvST9zSz9iQDpKOzNBPjRF +PDVTQzdvQTppRTpqQzpMPDdEPDY3ODBLPzdZRTRvTEB1UDp4SkFsRjZaQTpMOjRURTtVPzRU +PzljRTdlSDdpRjdSPzZROTZRPzNMPDdWQTdaQDRRPTMyOyw6OzAwOzE+OjUwPTA9PTQ0OjFH +Ojc3PDI9NzM2PTNAOjE2OjQ3PTMxNTI0OjI9OTc7OTE7OTM8NzU8OTQ2PjI9OjM8OzI/PS86 +Ozk/OjJAOjlIOzRZQDhgQjJsQjpbQTE+Ozk+OzBWRTtiRjdhRzlXRDhFQTY/ODY6OTNIOjdF +PjZDNjg7PjNEOjVUQzdfQTxBPTU8Oi84PzE7PDE+PDY5PDU4OS82NjE4OTE3ODZAPDg3OjY8 +Pzo6OTg4PjY4OjkwQjM/Pjs2OzQ/OTo8PTQ8PDkyPDY+PjoyOjY7PjRFS0FCQj41OjY7OTIu +NjQzOTE0ODwxNzIxNzEyOCw0Nzk2QTg0OzE2PDczOzY8Ojc4OzE/Ojw7Rj1RT0lUUUxTTElK +UERRRkZCRDxHSUA/Rj8/Nzs6QDhAQTw6PDc+QjhAPTs6QDQ+Pzo8QDc8PTdCQz5CQz1BQTw/ +PzRLQjhGSDVXSD9TTDpTSEQ+QjFBQz1ERjNFQjxUSzpdUUhSRzlDQ0A+QTg8Pj1ESEI/PTc6 +ODY1OjY5QTU5ODgzOzgzOTM1NjY8PTw3PC1AQTdQQzlaPj5KQzRJPDc4PThHPDo1PTA5OjUv +NTU9PDREPztDPTY/PTY/OjM/PzdOQzNRQD1GQDdCOzs1QDI4Pjc6Pjg7PTc8OjouQTg8Ozk3 +PDFAQjs2PzA6TUdGZV1IeYlQc39EdH1FZ2JIbXNDamJDa2tEZWA8VE1Ba2NWeVyFbllcTTtO +T0ZcUEJkVkl8ckqPeVyjj2amiWqtjWqlhWSZbk91Y0aBYkh2UUdyVT5nU0RpTz1lTkNkV0Jy +X0B2WUWNZU2gfFuxjGu8pHTPq3zOsX3ewIvau4nex5XiwpDryZftzJTt0Zzs153u0Zvt05/y +x5foxpDqw4PhwIrjtoXet4XhvYPiun/duH/UrHzMp3nLoW3JoGvKp23VqnzPrXbRq3zAnXa7 +n3OolXJjeWdMcmtKdG1Nc2hPcGxHcHFHc3FIb25KenVJdn5GdXtIc3pPbnlDdHlHbnZBZ3FF +Z25Dcm1Od3pJgHxQd4JFb3pFVGc7PD9HRj9BPTtCQjtBOzhDQDo9OjY4PTU5OTQ6NzY+PDQ/ +WDpWVF1DOzY9PTdFPjs5Oi49PDQ5PjBFOj01PDBAOjk2PTNGPTs1PDE9PDY5OjY/PzI3PTVE +Pzc/OzY/OTE8PDI6PDU8NzQyPTI5OTE5PTRKSTdGQEFGPDM+Pzc9PzZCPDpEQTRDRD0+PjRA +QDo9Py5FQD1DQTdCQEJERDpFQjxZSUBpYUbx+K79//j////3//H6/+79//j+//T8//L4/+39 +//b8//H8//r8/u79//P9//b5/+7y/ez2/+z0/+78/+/w/unz//Dz//Do9+Tk+d3i7d/p89rt +++n5/+30/fDy/+vs8+fx/ej5//D5/vb7//75//X6//v+//z9//v+//3///f9//T+//n///n7 +//f8/+7x/+////3z//n/+ez5+/Lx9+v08+BeUWA6PD9PRjhpSTttTDxiQjtGPThJQDZAPDdU +Qz5oRzlpSjdnRDhRPTY9OzE3PDZCQjdhRTtqTjx5TTx1UEJsRzpVQzVRPjRPQzZWPj1PQzVj +QjxjSTppRjhVPzZRQzpMQDVMPjhXQC9ePjZIQDM6ODk4PzE1OzE0OzA0Pi83OTI3OTI6PDYz +OzU7PTM3PzU1OTIzOjUwOjQ0OTcwOzE5OjcyOi84NC47OTA9OjUwOy49PDc1PS48OjU6PS4+ +Pjg7PjNNQDdVQDZiRTlmRTtWQjFBOTRAPzVTQTReRzhiRDpRQDpEPjI/OjM0OzJDPDU9OjQ8 +OjM2PzBCPTlMQDZVPj07PDVFOjktOjQ+PzQzODk7PDY0ODQyPDQyNzExPTg1Qjg3OzQ4Ojk1 +PTU2OjQsPTQ2QzU3PTgwPS81Pjc0QDM4Ojw1QDA0OzwzOS86R0BFQkc2PD42OS0wPDczNzEx +OzE1NjoxODUxPDMxOzMzNjQwOzgzOjMvOzYyOTE3Pjc3QTU+RTg7RjtVX1FRW1FbYFRaXExX +XFRNS0JGSEI+QUVERUBBSEE8QDtBRkM8QDlAQj48RDtHRz9BSj1CRDxDRztORj9RSjxmVEtq +XkmNe1mRcWCNcFqDaVR3XkptWER2Y0lmUEVjVkBiV0pPRD4/RDtGRT49QzdEQj86Qjc6QTgv +PS03PDosPjIyOTgxOi42PjkxNzM2PTc8PTVMQzxTRTZMPDtGPTU7QTlEOjkyPTo0Ozg0PDY7 +PDlDPzM7QDFCPzI+PzBCPzZHRDVSPDg+QTVAQDkzQTA7PzQzQDE6PDk4PTQ6QDsyQjA3STo8 +YVBFdnpFf4hLgYJFeIJKeYNHb4BIdXM/a2dCZ2M7ZWE8Y2A2T0s/amJIbF1tV05MTjtcXE1d +Xz1mYEtmb0ySfWCbj2qvk3Gun26ym26ljWmVfGGdgmCTh16ei2qlj2Omg2Wkk2uul3aum3HA +o3LLqXzJr3vTs4TTw5HixZHZv5Dmy5vm05nozJ7ozJfryKLmzpbs05rs1JXq1JXu0JTp1I/o +zI/mxZHlwo7kv4XjwI7mx4zhuIPbtILXtHjQsnnKpm3MqnHMrXvUq3nOr3vLpHW1lGysmGxp +emVVeG5Lem9GcW9Mc21KdGdKcWpEcGZNcm9EfX5Sen9FeXhIdX9DcnlKbnc/cXRHa3BAb3JC +anNCaHBCa3JDb3ZId3dIgYRUfIRIanxDUVY+QT07PTg5PjQ+PTkyPTM4PTY6PjU+PDk4QDs/ +QD44QDM8PTg4PjU9PjQ6PzM7Pjg9PTg6OzYwOzQ5PTg/Qzg0PDs2OzQ9PDo3PTE9PDg7PTQ9 +QjY6Qjg2PjMvPjQyOjgyOC84PzMyQjdLQDhAPzdIQDo+QDxAQDo6PzZBPDU6RTY2PDo/Qzk+ +PzQ3PDlAQDk/PzlFR0BHSDtVS0JpcEr6/8X///////////3///v5//H9//v///////////// +//zy/+76/+b0/+z6//j///r5/PLy++b4/fH4//nz/e7m7ODe6dfi9dzi+dvk8tns+ujY4tLx ++/T4/vT7/fT0+e7p/ej0/Oz8//T+//j8//j6//Hv/+74//jo/eLx/uzw/uz+//r///Hs/uj8 +/+799/Lm+9z6/+3p9Of6/vD///v19+hbUWM2RTlSSjhvUkR2SkBdRj1GQztEQTs+QjZYRDtk +TTttR0BbRjRURDw/QTVAPjxEQTZZRjxrSjdyUT5zTz1rTD9TPzhNRDhYQTlSQTpZRDdhRjhk +RjZjRThTPj1PRjlRQkBSRDpYSDxbRjhCPzQ/OjQuPzE8OTcwOzY4PjgtPDU+ODY6PTU8PzQ5 +ODc4Ozc2ODk2PjA0OjUwQDA5NjMxOzM6OTU0OjQ+PTQ4PjU5PjQ3PTY4PTM+PTw+Pi8/PTU+ +Py9JRDhbQjleQzxpRjZbRTlGOjc4NzFWRDheSThkSUBSRDlHPjs+Pzc/PjVBPzZBPTk4OzJA +OzVBOjpNQzlQPTxDOTU5QDQ5PTM6PDU3PDI6PTMvNDY0PTQ0PDQ1PjY8QjozPDM1OzkzPjE5 +QTY1QzM5PTsvQTU8OzozPzg7Pzc0Pjk3PDUuPC85PTk4QDw4OzcyQDQwPDQvPDo0OS0uOTU3 +OzQvOTAzPDYvOzg0NzwzPzM3PDkwPTM1Pjk1PzA5Pjg3QzhFT0RHUUNfY15NT0hRT05VXVRX +VU5NUUpRU1FVV0xKUFBKTkJWU1NQT0paXlJUVktPSkJMTD1SSURMSj9hVUV2aUuUg2ajfm23 +noK/mHTCpIi2j3OZeWWfhWOacmCAZUp6YVNtXUxeVT9UTkFISkE+Rzw4PjY2RTg+QzsvPjM2 +QDgzPTU5OjgyPzk5OzUtPS8+Qzw6Py9TQztQQzZVQzZDPzdFPzg9PTdBPzY7OzgtQDU9PzlF +RzpEQjlCPjhBPjxEQTdNQkBORz5ERjg/Qjw2Pzc8PkA6RDI3RTs7QTU/Qj80U0FDamREc25D +eHxEeH5PfYtTeoRGen1IbHFCd3NJbm1BbGhCamw8Y2E7U1VBZFdLb2RhYEVVVklvaUxlY05z +YkpqcVSNgVifiWiyn3OzpnTBpniulHCpiGGmkmatkXCuk3Cvm224pXq+rH3BrIbBpnvStYnO +uYnUv5DZwZLkyZnjzZfkzpnl0Zrp0p7m2qLszaHs05bw2Jvr06Dq1J3qzpjrzI/p0JLqyY3j +yZLmyIflxozlx4/hxIzdv4jUsX/du4XSr3bQrn/Lq3LQrHjSr3jSr4DApnOrl25qfmRPeHNL +eGdBeHNHd3FJb29EcHBJcWpFcWpKfHdPe4NKf4RNfH5Gd31Cd3lKdndCcnJEcHc9cXRGbHU9 +ZmdDbnFDb3RCbndGeHhJeX1ShIVSgodMZntASlVBPzw5Rjg5Qjk3QDk3PTQ5PzQ4PjU6QDo1 +RTZGRTs6QzNDQDszQjVFQDovOzQ8PjcxQzhBQjg9PTc8QDY5Pzg2QDg7PDY7QjlCPTg9PzQ6 +PTc5QDM5OzQ5PDs6PjAwOjc6PzhIRztEQjhGREJAPzVBRD4+QTREQT8+Qjg7QT9AQjRBRj0/ +QjdCPzlHQj1GSj9ORkNXSkF2d0z//9P///zy//b+//b///////////////v///////3///v/ +//////f////+//b+//f////////6///r++bi9Nzt9uH9//vu/u/e79Xh8dzf79vl8N73//X4 +/+zs/uz0+eTj9eb+/vv9//X//+3z/fHz+ebu/ef5/fX///j9//Py/efx/+fz+en5/+7t9N7r +++P3+vH8+/nx5uT5/vL4/+jx9uJiU2Q8PzZUQD1nTDtzRj9cQDhFQjpIQD5HPzVQQz1jQjRq +RD1lRjlSQDVFQTxAQDRIQTlZSjVtTTtySzt2TkFuTDphRT5MQDVXPzhNRzRaPzthRztmQjdk +Pj1YQT1JQjlQOj1OPDRIQzhGPDg7QDUzOzIzOTMzNzA6OTIxOjQ3OTk6NzQ6ODotPzI9OTY0 +OjJANzc4OjI5ODsvPS82NTYuOzA5OjU1PDQ7PTU6OjMxOzE7OTI8PDlCOjk/OTc4OjE+QTZI +OjRgQDhdQzdnSDZYRTZEOjY6QDBVPjlWSThnSDtOQzlKOzU6OzdDPzQ6OzdBOzRDOzU8PzI+ +PjRIOjhFQjc+PDc4OzE3PTU/OTU3QDY6PjU0Ojg3OTQ3PTgxPDA6Oz41OzA8PD0zOS1CQDw3 +OjM4Pzo4NjU2NjM0PDgyPDUyOTgtODM6NDMyPzY2NjQzOTI5ODU0NzUyOi8uOjE0NjQ3Ozkt +PjI0OzQxOTQ6Pjg0OzM3NDgvPDM3OTcwPTY9Pjg9QTc8Qj1JTUdNUUlQUUxdYFFYUlBWW1RX +YFNQVk1XVklJVEhQTUlTVktUVlBMTUdNT0NUTU9aTD9iU0VrWkd9bFKoj3a7mYfLtI/SuJLc +wpDbwIzVrovFnXPLqX+7kW2wf2uYcWCWd21wW01YR0NAPzc/QTc+QDc3PDg7OjU4Ojk1QDQ2 +Nzc5PTo4OTc2OjM0QDk3OzU+PjZHQjdUQTxLPThHPj08PjRBOjo1OzM5OzQ3QC9APTdHQDBD +PT0/QTNEOzlEQDVUQUFOQjFIRjtCQjw5QC00PDw5QDk+ST1DYGJFb3lDa21GcHVLdX0+aXFE +bm5De3dLfX9Je4ZFZG1Hcm9Lb3lHbGNIaWY8ZGBEU1w/Y15QbGhfXFBWYEdvcFR5a1V0bFB0 +c0uGeludh2SnlG+8n2y3nHa9nnq1pHi+mHWtoHG7oXq8pnzMrInMtofHtIjLsYTVxI7eyI/c +wJDdwpTaxZPnx5LhyJXlyZjp15z23afy2aDz06bw1aL016Dxz6HszJbxzZ3qzZbtx4nlyI/s +vo/hxozmxonhw4joxYveu4Ddt37at4LOsHnRrH3GqXe9o3W1o3GUj3RaemtTcWtKcWdLcXVN +d2xMeHFLdW9Kc3BKcW9OfoFPhoVOdntFdXxOdn1CdHZHcnRFcndCbXE+a29CbXM+b3JDa3FF +b25GcXdDcXhGdnpDdXdGdX9FdHlMfXtJeH1UZnpARFc/QUA4PzY8Ozg4Ojk5PTY7Pjc9PTc9 +QTc9QDY7RTRAPDk6PTM7QDc5PTM/PTU3PzM/QDYzPDA9PTQ1OzY7PjY5PTRGPzg8PzE8OzU3 +PDM+WT9sXX06ODg5PTZAPTNHRDZIRjtJRTw5QTg6QzU/PztARDZBQD0/QDtBPTs9QzlCQD1B +PjZIQ0BERTdRR0RTTD92dUzy/7z8//f9//b////////9//v///////7////////////9///9 +//T///z+//P+//f1/vPq+eTt9uH8/f/8//P5//Lr9+jk9ePh+dPr+Ofi6tzg79rq/+bm9OX0 +/vP+//z////z/+v19eTk+eP5/vX9//X8/e/w/On2//f///z9//H7/PH///3///n6//L///7/ +//P9//v1+e/+/fPx9uTu6+BTTVU7PD1ZRDtsSzxuSTtgRDxLQTpEPzhEOzlQRDVkRjxpRzhp +RTtRPzc9PjVEPTREQDhhSD5nSzx7Tz1yTztzSj1XPztSOTdPPztaPzhTQT1dRTZnRDhgRDVP +PzhEQDNCPTs8PTQ6NzYzPzI8NDYyOzEzNzI2OTMzPDI0OjU1NisvPTQyPC42OTc1PSw7OzY4 +PC8zOzM3PC8xPDE4OTMzNzQ2OTMwOjA4OzQwOjE5OzQzOjQ8Ozk7PjY+OTc9Ojc+PDRJOzZW +QjhgQjhnQjhZQzZCQDY+OzZPQzdfRTlhSkBXPztEPjZBPDFEODU8OjNGPjk4PTQ/Pjg6PTZG +PDhIPzdEPDo0OjQ7NTg1PzMzOzQzOzY3PjM0OTI5OTs2Ozs4OjM1OzY3PTY5PjQ7PDg4OzY9 +PzoyOjE7NzotPjY2ODovOTE2Ozk2OC47OTstOzM6ODopOjA/NDoxODc3OjEzOjU5Ojs0NzM4 +Nzc1PTQzODQxOzU3Njg2ODQ3QTc3PTY3QDg1OzE7Qz5BRTpJTEdHSEBKTUdMTEVWW1RPVUpI +S1A/STZES0dESDpIS0dGQ0FGRDtYVkVkV0x4aFGOd1mSflyokHDHpo3Pw5TfyKPgxZrfw5Hk +xI7UrX/UtX3XvYzUqoLCoXu6kXarh2uDZVVjVk5TRT9DQTw5OzY8QDs3PjA2PTM3Pjg3ODsy +PDU7PDg1NzY4ODY9Pjg9PDtMQzxTPzlNPkFDPjNAPj07PC45PTkyPTE2QTs/QTRDQDxGPzE+ +QDZFPDlEPzlPQTpRQThJQDw8PTM5SUA9T0lDY2xDbnFEdH1OdnZJbHNKb3NGeH9NbHI8aXVL +bnVEc3dSd34/cHdQdHlGbHtHamxEaWZIaWU/VFg7ZlpNcGxRYUtlalV9dE+NbluAdVZ9aVeD +e1eZhmWnime2o33ArG7CroLErnvDo4HAp3rDpX3Jq4LDuIDQuojOwIzVs4zWwo/ZvYravpPi +wZPsyp3r1KTx1Kjx1qTw36bx26Xz2KTz1qLy1qXx1p331qLwzZ3s1ZTvy5LpxYvqx4zqzZDl +x43xyZnlxY7mwo3dvYveuoTVtH7TsoTKqnvAoHamoHZ3g3FScWZRdW5FcGFNc3NFeGtOeHVJ +cG9NbW9Mc29Gf3lYhoxMd35NeoFFen1MdoBJbnxIcHlGc3dEbXdAcnRAa3VHaHA/bXJJanA/ +bHJKcHdBcXZNcHpCdHxJbnpDcHlHc3lGeHdMdX1HYnU+RlQ9Pj00QDQ+PzpCPzlGQzw9QDg+ +PTk6QDY9QDU7Ozg9ODdAOT06OTU9Pzs9QDM5Qjs3OjY+Pjs5PjQ/PztEQDg+PDs/OTk5NjY5 +PzYzQTs4OzUvQDRTRj1HPzhLQzpCPzdEQzk/PTVAPDVDPTw/Ozk9Qj06Qzg6QT1BQTVHPjtB +RDxGRTtLRj1ZTj91blHj8b76/e78/e/x/+n6/vH////2/vf+//D///////v9//v+//n+//f/ +///////+//v5/+3////3//nx/eju/Oj3//bm9+Ho9uje89jh7dvY5tTc5tj///D3/vz////z +/e/v9uXy9/T6+vPx/PDw/+////f///z///P6//H0/PL9//z////z/Pj///7///v8//r///f4 +/fL7/fH+//Pw/+nq4cpZTFI+RTxRRD5pSj1wREBfRDlHQjpFQDo/QThTQD1hSDluRj5lRjxa +QTk9PDBEPztMQTljRTxmSzZ7U0F1STlsRD9WRjZHQDtFQTlOQD1QPzVVPzhTQjpMPjpCODc3 +OzM0ODg7ODg5NzE7NDcyOTI2OzQwOTM/OjYzOTU9NzgyODE+OTstOzA/NzgzNjM5QDc2NjE7 +PDs7NjQ1OTU7ODU2OzY3MjczODI1NjI6NzQtNjM1ODQvPTE2OzI4PTI6OzM5PTFMQTtVRDdm +QTteRjZiQDo9PTNAPDhHQDhjSDxkRztYPjhFOzU8OTc6OjM6PjE8Ozw6PjFAODZAOzZHODZE +PTw9NzQ8OTk2OTQ3PTYzOjE5PDo0OTM4ODk6PTc3PD02PTM8Ozw8PDg7RDc0OzUvOTI4Pjg3 +PTU5PDcvOjQyOTMzOjQ5OzM6Pjo4ODc0ODk2NzM0NzU1NzQzNzQzOTE0OTYyPTU1OjkwODM3 +PjYyODw1ODUyOTcyPjo2OTE2Ojc1PDgwQTY8QDs3Pzw8Ozw1PTg+PDhCSENFRUFBQUJBQDk+ +Qj07QDY6QTo5PDlDRD1XUUNwZlKNelmpl3y8pYW+moLMtJHZzqXcxaHf1J3lyZ/ox5vkxZfi +wo3nx5zixZXhv5TRqYHHo3m4i2mQcFhyXExdTEVIRD89PjxAQT01OzU3Ojk0PjUyPzY2OjUz +OTM0PDMwPjE+PDw5PjZTQjlKPjRJPjpCQDFAOjs9QDJANjUzPCk7PT8+PTJEPD5EQjdDQj0/ +PTtHQzZNRUBMR0BJVktJb3JFdnpHdXxCdH1NeH1Ge4dMb4E8dXpKcndFd3lOeIM/a3NFaW03 +bmtQd3s+c3FKeodEdnlGcHRIaG47aGU/Vls/V0w+ZltMcGhpbleFeV+JeVmFeF2FeFmJelmB +h2Kml3O2oG++n3zJpnDIsoS+r3jLr4bIq3vKsoXXt4nUvpDcyJ7cv5noyJ3ozqfl0p3l2p7q +2qnt2afx2Kny3Kfw2KXy3aP43q3026Ly0qTz0pfw0Zvy1Z7p05nwzZ3qx5Tr0Zjnzpzmypbq +yZbpyJPlxZfbw4jguIfKt3zFpnyck3FzhHNSdm1PbmtCdGtPb29GdnJJdnVKeXROcG1Hb25H +cG9LfYBZhYdHd31Ld3hEc3lIcHRDc3hIcntFc3hEcHlDcXxDbnZBcHZEa3hAbXFCanQ9cXJB +anNDcHNBcXhAcHZHb3dBbHJBbnE/aXNHbndKcHZGdHdMbnpAWHdFS1lDPkU+QDhAPj46QzdC +QDs7PzpCPDs2PjM9PD05QDdDQDc1PDhCQTgxQTc9Pzo7PDU+OTpBPDc/QDk2Pjg+PDg7PDU2 +PDQ3OjY0PTdEPzxLPzdJQThJQUBBPDVDPzo8PjVEQj4+RjdEP0A4RDdCQEI6PzhFPj89QjlK +QD5HS0BYTEJqhkv//97///7////////9//n7/u39//f///////3///n////6//n6/+n0/u30 +/+7z/+v6//P4/+33/PP2/O75//zx/OLw/u/m+t/a7tDk79/p/OLg6tnz//fx/+/x//D6//b6 +/+v6//b7//f///79//Hz/e/t/Oj9/vn///L5/fL2//H8//ft/+r4//L3//L7//f9//f9//f1 ++ezx/On38uvp4NpTSU86PztSRTlwRz1pSzlbRjo+QjVJOjxDQTJQRD5bQzpqRENgRDFPQz4/ +QTM6PD5KRzdgSDluSzx4Uj1zTD9jSDtMOzo8Pzo1OzY6PTo8PDZCPTg2OjM9PTYtOTY4ODcq +OzM1OjQyOjA9OTYqOjM0PzEtPDA4OjEwOTUtPTE2OjUzOTA2OzYuPzE0OTM0PDQ3OzUzOjY4 +OTY7PTg8PDQ6PzUzPDQwODUwOTA0OzsqNjM1ODcwNi0vPDY0NDA0PTw1OTE9PzVIQDhRQjtc +SDdUQDZCQDs3PDZHRjxbTDplSkBVRzlFNzg/PDM6OzE4PjU5OjQ4PjM4ODI8PjxBOzVHPDk6 +OzQ5PDY0OTg5PTg1PDg1PTU1PDgyPDQ4PzkwQzcyPjoyPC47PzoxNzU2PDMvPjM8PjUuNjcz +ODIpPS8zPDIzOTk0PjcuPzguNzMwPToyOi0uNzQ1PDQuOTM0OzM1ODQ2OjguODI1OTk1OzE0 +NjosPjA3PjgoNzIzOTUuPDU1PTkyPDU4QD4zPTk5PTkvPDY6Pzw8Pzw1PTs3PTg5Pzo3QDU4 +Oz45PTdLRD9RTEBmYEiCb1OhjGm4oX7Hp4HYz5zjz6/k0Kzp17Xr2KTqzqXly5voy6bozp3k +yJzhyJLkzY3Wt43Psn/FnHisg2igd1uQZ1J/WkZYRD9BPjxDQj0wPTk6QzsxPDEzOz0sPzY7 +OzUsPTc6QTozRDVJSDhFQkRIRUA+QTg4Pzc7QDw6PjY2PDstQjQ/QzpFQTlBPTlBQjxBPzhB +RD1FVVdFb3BFdXZDc4BCcnRJb39EcHhGc4JAen5IfoVMeoFFdYZDb3lEeHdJdYNAanRBZ21B +cHRJeIFPenhJc3w/b2hDbG5BZ2U8YGg/SE4+XllNdG5UeGeDfmOCfVyNgFuLfWaMfVqOg2CX +kGuqnHGypXTEpnjErHvKsH3FsYDKroO/rX3LuYXNuIXVwYbZuI/ixJzo0Z3p16bpxJPpz57n +0p/s3J/t2Zvx2q/x2qTu06Pw0KTqzKLq0Jnszprr0Zzrzprm1pzryZXjyZPnz5fcz5rhx5na +ypLgwJLOvICzpn6JlXFrfmtReW1MdG9CbGZIa2dFbm1Ed3JPdHNCeXBJdXBHd21KdHdPhYhP +gIJLdH5Fe3pMd3xDd4FMdH5CdnpNcXo+cnZHcn4+cnZEcnpBcG9Db3dAanE8bXZDb3hEcnxI +b3lDbHhBbHg8b3ZCaHE/bnNCbXVBa3M8aW5EanE9bXBIb21Gc3JKc3o9ZHBGS184QT5APj08 +QDxAPj4xPzY/Pz07Pjk6Pzc4OTg3OTc5PTc2QTU8Pzk6PThCPjw+Ozg7PTU5RDw8Pzg+QDk2 +PDU3Qjw+QDRGQTtDPzdBP0A/QTU+Pzs+PTNHTEQ9PzM2Pzo+QDU8RTlEPzo7QzxFQT9APzlK +SEJUTUBzgEz4/9L+///7//n///////////3////////3//f6/+/+//z5//T7/+3///////z7 +//r8//ry/fD2/+r5/fvq/uX1++zt7eve69za98/h79nd7trj8tnv/+jw9+vw/evy++/r8eP5 ++O/w//Lw8d7m++ry+urw+ebt9+f1/vP+//j///7x/er1+ez18+Xv8ezz/uf+//n+//f7//P9 +//r+//z19+VZSU47Qz1XRDtoSz9tSD1eRz1RQj1EOz1FPT5HRzhsRT9oQjxpPzlPPDpHOzo3 +QDlQQzpeSTpqTjxzTz11TjxqRD1GQTU/OzgxOjQ0NDgzOS86NzQ0OjM/Nzk6OTc0NzM2NjY0 +NzQ5NjUuOzA5PDM0PDc0Ojg2OTE1ODc4PDIzNzY3ODMxOzU7NjksNzM4OTczOjE6NzI2OTU/ +NTo3OzM7OzM3PjUyNzEsOzEzNzY1ODE3Nzc4OjEyOzU0ODQ3ODY4OjQ1ODk/OTc8ODZBPTJH +PjdAOjI5OTZFPzZdRj1gRztdRDxJOjFENzU4OTE/OjY1OTA+ODY3OzM+PDRHQDZDNjk8OzU1 +OjYwNzM4OTQ3NzQ3OjIzPDY1Ozo0OTM1PDk4PjY3Nzc4OTM6OTcwOC81Ojg0OjY5NjksOzA5 +NDYyOjM8OzssPDU9OzsyOTQ4PDU4NjIuMzgyOTUyMjE2ODcyOjE1NzYyPDkzOTEyNjc1OzU2 +NzgwNTY2OTMvPjQ5OTk2ODE8Ojs3OTI8N0A1OjU3PT05QTU6PEA+Ojk4OzM6Oj02PTZAQTtN +ST5aTUhjVUVyYk6NelWxpXjKu5DZzJ7l1K/l26ft2K7s2rLy26/n16js2Kno1qTuzqLnzZ3q +zJfiyZrfv4zWs3/QpX7BmHfDnm+7knGphmWSZ1ZaRThEQDo0PTk4Pjo0ODg2PTM5OTk1OjM5 +OTs5OjI7PThBQzZEQj5EPTlAPztAPTU8PDlBPjs3ODc7Ojw9QjhEPzxBSD9GW1g/ZGFGanVF +bntIcnxIc3lIcX9IcHZFbIBEbG4+b3lIb3pIdoBSeH1KdohMcHg+ZGpEdHtJbn0/Zm5CaWw8 +b3NMcXlLenxMaXk4bWVHZ28/ZWNDTl09WUlIYF5GeW1rfmmHjmGSf3CXhGSPhGWShWWVjGij +kW+7qnLIr4fOsYfPq37NsYfJsYjNsIPKt4XTsIfVuYfdtovZypXqx5bi0p3qzKLk0pnq1Jzr +1qX32ajt2KLw0Kbv2KH11p7r1aPoz57jz5XnzZnjypTqzZbmzZnq057hzZnez53ZxprGuo6k +o3x6hXFbeW1SenZJcW5OaGpDZl9FaWlEb2lJeHdNeXZIdHZKeHNIe3VNe31RgohTfX1NdntK +cX9Kd4FMdXlFcXpId31GcntMcnlGcXo9dHpKb3lDcnRIcn1BcXZKcng7bXhJb3RCbXlDbXlH +bnpDbntEb3xFanhHbXY/a3NLbXM+bHFCb3Q9aXM/bXJFbHRFam1IZ3BDbHVHa3M9WFVGSVQ+ +QDo4Oz45QjY8Pz08OzM5PTk7PjU1PzY6PDY1PjQ8QTg4QjRBPDk3PzY8PTs3OTI8PTo9PTs4 +Ozg/PDhHPzVGPTpFPTw+Nzs/OThAQDs9OzY/PTg8PjhAPjk9Pz1AQzlERD9FRD1HQT5LQjxZ +SUhrfEf3/8z8//j9//n///f///r+//3+//z///3///7////+//32/+/7/u/8//X9//T////9 +///9//T3//X5//D2/PDs+ubr+uTr9efn9dj19PTd6NrX5NX7//L9//77+e38/vz9+/Pn8eLi ++OT4/vP///3///////v1+ej7//r3/+3z/fv////7//T9//f///z7++3y/ez5//P1+/H6//Ls +9enr5thRQ1U9RTpYRjxpSjt0TTteSjZPOzxHQTlFOz5MQjNkQzxiRDVmQjpOQTVEPjY4PzRL +QjheSjpnSj91UD91TTxlRz5QPTk1PTs+Ny8yNzYxNzU1OTI7ODo3PTI1NTUsODM0Pjo1PDE6 +OTQ0PDI2OzkwPTI3ODY1NjczPTYxOTI8ODYzOTU3PDkxPDMyOjU3OzEvOjM4PDE4PTo8OjY9 +PDU7PzZBOzg5NzE2ODUyOS81ODUwNy48PTctODY7OTcvNzI2NjYvOjE5Njg3Oi83PDQ4ODE/ +Pjc6PTc/QjFWRTlbQThaPjlIPjZAOzY6PDQ/OzI/PDo5OzNAPjc+PzNHPzo+OzRBOTg1PTFA +OzUxOzRBPzoyOzc6PDM0OzY3PzU6Ojc0PTc7ODg0PDQ1NzM0PDQ3PzIxOzUxODc1OjYyODI4 +Ojs2PTY/Qjg3NzM5OkAyNS87OjozOC07OD8zPTA3PTk0OzA4Oj02Njc4ODM4PDMzNzQ3PTUy +OzY7ODQzODM3OzUzODUzOzI4PTY7Ozo7PTgzOjJAPD44PDU3Oz04OjY/PT09RDhdUUdjV0tx +WUlrXFCHeFaskG3Dq4nawJ7m1q3w4Lbx4bT13rfx463w2bPo2anp0qHlzpfpyZDqyp3pz5Tp +yJnctYHcuYvWs3/TrYbSpXzFmnO7jGqleGGGXUxKQjY/Pjs3PjU6PzgzOTE3Pjo2PzE4OTk5 +OTA5PDs/QjZBQjtAPjc9QTxCQjtCRz89Ozg2PjU8TUJHZmNOcG5Fa3BCbWZJcHlFam5JbnhD +b3NCbHhJc3JJb3lGcHlHcHtAb21GbXg/bXBJdoBGdH9KeoZEc28/bHNFe3RKdIVDZ3FIaXVB +bnJHbnZFcHc8Y2A/bGpHZ21BY2ZDWWI2XFVHbGJJc3NrjHGOimaekW2ciWyeimaPimOjm3Kt +pG7AqXvEtIfSu5LRrojSsoPKr4HLtYDUuIXUv5LcuZfjxJjnyqLky5flz57t2qTr2Kvr1aXs +1KDqz6Hm2KHx26jk0pbqzZPo1Jjs0prl0pTp1qPnz5nZypTPv461womHoXlihmxZem5TeGtP +b2pObGFFaWNHa2VCc2tIdG5Fdm1QeHhEcmtMdW9AdXNPe3xJgH9XhIVKfIZYfIVHdn1Jdn5G +dntJdntGdIFEdn1KdntKb3tIc3lDd3tKdXtAb3hMcXhEbXlGb3VDb3dEcHVIcnpDcHhFbnlH +cXdHbnlBcXRDbX5EcXxBbX1NbIBBaHhIbn5CaXpHcHo8bHlIcXlAbG9NZnRAbWJFa3RGaXNC +bHY9Xm9DSlY9Pzo9QDc4Qjo7PDk+Ozc+PDlBPTdBPjhFQT07Ozw3Pjk/PTk1Pjg5PTo6ODZH +PT1JQT1MPz1CPTtGQD1BQTxGQTpEQjhHQD49PT5CPzo/PztBPz9DQT1JQTxGQkFMRDpYR0Fz +jUzv99T+//H///////////////////3///n+//36/vD6//L///////7///v////////z//P9 +//ft++vz/+j6/+z6//rp8+fg8dzd9dHq9+Px++bq+O32//Ps8+/2/O7s/+30+er0/v3///n4 +/+36/+/1//T3/uv2/fH3/+3+//r//+39//f///v+//P2//T8//j1//P++/Lu7un6/fDu9N7e +49dLRkc6PTpRRDdoST9tP0BdQDtLPDhEPjg/Pj1OQTphSzpqQTthQTlNPjpEPjg7PDpJQjdi +ST1oSDlyUkBuTjxkQzpEQTM2NzcwOjA3NTkxOjM5OjcvOjA4OjcyPDQ5PDgvOjQzODcuODQw +PC40NDQ0NjE2OjY2OTQ0OjQ1OTc0PjM4ODUuOTA5NzYzPjM7OjkzOjE7QDU3OzE5PDY2OzNB +PTo7OjI4PTY3Ny80NjIzNzc0OjMxNy83NTgzNzI3OTAzOC82OTM0NjM0ODQxMzI2ODUwOzE+ +ODY3PzBYQDhWQDhcPjpCOTBDOjU1ODA9OjM1NzI/OjY2OTE6OTxAOTg7NjU3NjA3PjM1PDAx +NjIyNjM7Nz04QDM1Nzo1Oy83QTo6OzQ3PjkzOzI7Pj8xNzE2Ojk1OTI1Ojk0NTQ2ODc2PjE3 +PzYzOzUxNzQyODU0OjI2NTYtPDA2NzEyODIyNjc2ODQ0NzY2ODQyOjA1OzUvOjMyOjIxOjMy +NjU0OTU6OTQyODY2ODY5PTk3Njc7Ozo2PDc5PDcwOjM4Pzk0QDNLQjtiUUOBZVaKcVuKa12N +dlW+qoLHt4nZv5TgzaPt4LXy3bfz3LLy4Lvr2avt1qPsyp7qzZrv1qfu16HqzaPiwIfhvIjZ +tHvduYfYvIDbtoPOrnjGnXG5jGi5i2ige1ldP0BFPjk6QDg0OjY0Ojk7PDcxODc3OzU3Ozg4 +PDNANjc7QjZDQDk8QjdAQTxBTD9IV1ZFWFBGXVxGaGdGaGtAamNEanFCbWxHZnk8aWpDcnpE +bHdGbnNFb3RGb3hDcHlDbnVBaXBBaXM9cnxHb3hFfH1OeYlBa3hDX2lAeHBUeYQ+Z3JCaG84 +bGxIbXU8Y2ZHbmJCa2lEaF48amZDZ11DV1Q/blxNdW9klm2Sk3GhjHCcjGubimqck2qtnmut +onLOs4LNt4jVvozQuoPVvZHUvYjVuY3PuYXVvY/gxZLkyp/iy5rk1Jrizpzkz5zn1aLk2Jzp +zZ/izp/l0qXm0Jfkz57izZTay53Wy5m+xJamsoBwlHRfhXBQe29Tc2pEb2dScmdEaGBKZVs/ +Z2REbmlFd3BGe3VLdnNDc2xIc29Ec3NQdXhJgn1UfoVHf4BNfIVLdX1NeHxEc3pJcX1LdX5L +dYBNdYNKcnxIdXxEcnlBdXxIdXpKdX1Kc3pAc3xCbnZBcnpHbXtAbnpKbnpAc3lHbntAcXpH +cH1Dcn5NeoNHc4JEc4hGdYNGb35FdHxIcn9FcHxEb31DbnNCb3NGbns9Y2dDaHpDbHdDbnhC +Z3NBbnFJbHtEYGtGRlcyPTc6Ozs2QzY/PDg9PTRCOzoyPTc6Pjk9PzY6Pjg3PTQ6PjVIQjtG +PzpEP0FFPjtDRDtDPzw8PzpGPzw8QDk9Pjo6QTpEP0M7PDhFQEU/QTxGP0BJSDlWTENqkkb/ +/+v///////////////r///r///v///n///j////////2/fj0++b+//jz//Xu8uH+//r9//vz +/uvz++r8//b1/+3z/e3j++LW7NHe8dPd7dfU4M36//H+//7z/ePq8ub6/fL4/+7u9efx++n1 +/vL5/fD0/+/+//v///P///z7//L5/fHx/uj6++/7/vP6//Pr/ePt/vDx8uLx9uX0/ej+/vpV +TUo+QzhPRkNoSzpySzpfQzlKPzlHRzo4QTdLPjhfQjBnRjhcRjlSPzo5QDU9QTxHRjRhST5o +TjpxUD5wTjllSDs8OzQ1PTQyPTA1Nzc0NjMzOTU8OTQ2PTczODIxPDQwQDQ2NzUwOzQ2Oysz +OS45OjY2OzI4ODYwPTE9ODg3PTI9OzY1Oy87Ozc1PzE6PjU0OTM3Pjg2PzQ3QTc8PDY8Pzc2 +PTIxPzQ2PDQ2PDI0PTM1OjI4PDM7ODgzPjM2NzQsPDIzOjUuPDE5NDMyOTI7OjcsPDA8OjQ5 +PDJVQjZbRDpaRTdDPTpCPTc9OzY6PjI9OzM+PDM/PDU6PTk/PTg4PjY5PDE3PDUzPC0zQDU1 +Oy05QTYyPS0yPjU2PDE9RT42OzA2OjU2PDQ2OTk1PDQ2Pjg3PDcrOjA1PjU1QC42OjQ4QjUz +OzUwNzE1Oy8zPDcwOjQyOTEyOzU0PjYxPC45PTc0QTI1PTYxNzc1PDM0ODU3OzIwPjUwPzE0 +PTY3OjI6PTU2OzU6PDo2Pjg2Ojg2PTU6PTQ6Pzc/QTRZTjuBbU6NdVebgmONb1ebe1mvmXTU +uZXgyafn0KXv3Lb167/w5MH05rbx4bTs1qjp2qTu0aPqzZrq2KPn0JrlypzkxJHjvo/YsX/a +vInatYPUroTNqXTIoHa9l2m3kW2id11jTT9EQj84QDo1PTQ2PDg2PzQ5QDkwPyw5PjcyQzNF +RDtARDU/Qzs3STVCUU89S0JEUVFCWFVBXFtGY1NIZWhCcGNHb3pFbXJFcG1Dcn1GdH1DdHtH +dnlAeHVIdnlFdn5HeH1GeX1Ebno8cXVEc3U/cW1KeX1FgX1PeYM3bWdHeXhGe4RGeINAb3hH +aXZAbXI6Y2FDbmREb2hIaWVDa2Y8ZmBCZF0/b2BPe2xihmuWkniXjW+djm2ZjmWrmW+sqHHG +r3/JtYbVtZDRv4XXw5HUwJHXu5PWwZHZvZLjyJPdypfiyZzcyp7dzZrj0Zji0qDq1Zjl0afi +xpvf1KHf1J7OxpfFvomQpn14k3RfgG1ZgmtMd21Rc25FcGVOcGVFbWZJa11IbGdEbmZJc3BF +c3JNeXdEc2pFcmxEc3JEeHtJgH9SgoZLiYtRgotSgIhMfX9IfIFKeYJOfINNeoVLgIRMdHtN +eYJMfYBFeHxIe35GeXpKc3xEe39Jc3tDdXZJdH1BcndKdXxAc3hFdn5DdX1IdYI/d31LdIFF +d3pIc4NId4JIdYVGeoJJdopNd4REfYZHcH5DbHtEcXtDdH5EcXZAaWtFdnhEbHtCb3tFb3k/ +bHFKcHZDbnhLcng9YWw/RE03Pz1FQzo8Qjc+Pjg0PzY9RDZARkk4PjE4QzY+QTZAQjhGRTZF +PzlDQz1AQThAQzo8PzNEPzg7RDNBQTw0PDdERT03QTZHPz09RzlNRT9IRjxZTkJzk074/9r/ +//31//H2/+n9//T///v///v///////////////3///r//vL9//b7//f///j////3//D2/+r/ +//v1//L0/+f2+vHn9OHt+uTk6eTa59He6tj1/fL6+vPy/vL4//T2//T3/+n4//Dz//b5/+37 +//v////1+enx/ury/+n3/ej8/v3////7//X0+fT6/P3//////fv19/z///7///vx6d1TSFE7 +RDpUQz1jSD1nSz5cRT5KQzhEQEBEQT1JQUBjRDtgQztlQzpKRDlEOjk1PjdJRjpaSTtpST9r +Tzp1TkJXQTc9ODgrPzM6ODcwOzYyPTgsNDQ2Ozs+OzczOTU1OjYzPTg4Ozg5OTU2ODc2NTcw +OzQ1NzQwNTc7Nj03OjQ9OzczOjM9OTcxOzI5PTcyOjY/Nzw4ODg2Njo5NzU4OTg5ODY5OTQ1 +OTU1NzM5NTQ5NzQxOjc2OzYxOjU3OzozNzc1NzcxNzY1NDgxPDA9NzkuOjc6Ojc0NjRDOjxM +QTxiSDxRPzxIOThAOzk2OTU/PTY4OzY0NjQ3Ojg6PDk0PjQ5OjozOjU3PDI4Ojc1OzQ4Ozk2 +PTY4OD00Oi88PkI7Pzg5Oj4yNTU3Nzw1PDE6QTo8NjwvPDg2NjcxPDQ7NTk2Ozg8OjotODQ1 +PTU2OjcwNjc3NTc0ODczNjowOjU2OjgxPTM6OTs2PTg0OTgsOzg3Pjs0OTc4OToxOjk0PTk1 +NTs0PTQ6OTw2Ozc6PEA1Ozg9PzpCQDldQ0J7WEmlhF2hg2OvjGqrhGi3lW/Oq4ncxZrj1bDp +2bLx37vz47vw4bjz3Lby37bw06jv2Knw2qnr0qPqzKHiy5Lmx5bny5flv5rgvYzeupDdvYrc +tYnWq3jSsYPOnHTFlnS7mWyhdGBkTUFFPz9CQzw0OTo1OjQ1OjgyOTc5Ozg4Ojc+Pjw/RD0/ +QEQ6Qzo7QkY2S0M9SEc8UUNCVlw7UVdHZWJFX1xHbWNHZmlJcHJFb3JKdXpNfItMd4JNfH9F +eYhLd4tNe4NKeoVUe4dEeH1Jbn1DcHpJcX1BbHtEcH5DdoBMeYg9a3ZJcHlJgoVVfpFJeIlR +doQ/cn1BZ2VEbWpDc3RBbnc/amdEYG08a1xEbW1FdGhVenJci2uBlG2ZlHObmWyrpHm6sX7I +s4XSvIfUw5LTvZLZxJrSxpDYzJTXuZPbypjdzJrdyZrbzajZzJnbzZ7Vx6HMxpq1x46UtoZ1 +oXFiiXJafWxPfXFVc21Gc29PcW1JcmlRb2o+bWVKamRDamlFbGQ+ZmpJcm1Cd3BJeXdFb2tG +d3RLcnBId3hUfYFOio9cjZNNiI9WiZFOioxOgYRLgINSgYhMfIRNeYNHdoNKeIVKe4VOeYJK +eYNLeoJMeotLeXtGeH1Jd39Ie35LeYNJdIFGc39Fdn1Kd4lDeYNRfIRGdn9MeoZAeX1IeYlH +eIlJeYtIfIVPfIpHeohKd4dGdYpCc4JId4VFdH1Gdn5HcIJAam9BcXtHdHxBbXxAb3pJcH9E +b3lFcHZDbndGanhDcXhQYXY/QUo7OkM2PTk+PT42PTdAPTs3PTg7QTs8PD1CQTpLRz9GQjxA +PjtDQUJCPz1IPkFBRj4+Pz84OzhAPTk9QDpKPz47RjpIQUE/RDxVSEFTSkJ8llP6/+P8//b/ +///////////7//f///////////b6//f9//r4//r6/+j////////6//jy+uj+///6//H8//b2 +++3r9enf89fn/Obe+9fe8t32/enm8uT///Hp/OXt/uvt++bw9ejx9e33+/Lp9N3p+u3y/ezr +/+3v+efs9Of08Oby/vT+//r8//D7//D5//D1/+n8//n9//b09/H0/+709O/f4tJWQU08QzdP +RzteRzxsQ0FXQTZOOjw/RDU7OjdERzZhQT1ZQzhYRDNHPjk8Qjc2OzZIPjdbSDxnRDJsT0By +SD1SQTY3NzQuNzIyODcoOTI2NzQuOjM2NzozOzU5OTsvOzI2NTgxNzIxOzgwPDI5NTAvMzI4 +PDUtNiwzOTQ6OjMtNzY1OzMwPDQ6OzM8Nzk0OTY7NzgwOzU0OzQyOzMvOTQvOC03ODYwOzQ5 +NTgvODU3OTYwPDA8ODcyOjE1OjgyMy40ODk0Ozg0NzY4ODk2NjQwODQwOS81NTQ6OjZHPzJZ +RDlQRDZHQDU5PDM8NzYrNzI3OzYsOzA6ODktOTA+OTQwOjQ7OjUuODU1NzYxNTUwODU6OjQu +ODY5Ojk2PDo1OjMvPDgwPTQwPzAvPDE4PTYyNTA1OjgsOi83PTgxPTI3PztHRzszPjouOzEy +PDYwNjIuODQvNzIyNTE0NzQxOjQ0OTQuODU1ODIyOTQyOzcvODUxPDYzPzQ1ODQ2PzU2OTM4 +PTYzOjQ+ODc4PjVCQzpRRzp2VEGQZ02ti16vi2a3jWy8jnfFl3rZv57ex5vp2Kzq37Hw37vx +6b7y5bzv5bz24b7w2bHt1Krs1azq1aTmz6PjyZHjwo/nzZPlyqDixpnivorcuIDYtYfYsoLP +sHvPqXXKpXLBn2+0j2WMalVjTEFCOzs0PDMzOTsyPDcwOzU0ODMyODg0PTM6QDo6RD06Q0U3 +RkQ3Rz87TEgzSE07RD03SEI4S0ZAUVY9UUhBUVI6ZlNEa2ZFcmtMZnFDeHpOeodKfohMeIpH +fYNQeopJfn1MgIpKe4FNd4JKdHhJdIY/cXw+cHA+d3xGeH5FeoBIdHdAdXROgotOfn5OgY5B +e4xHaYI0YmNGdnQ8cXJEaXA6cWZIXWM0YVtFZV5Db2xPd3VLfG9eimt6jm+NoXSmo322rYG8 +sYjHuonOuY7JuYTSwpbOxqDNu5vPxJq7x5G3wY+kvYqTqYB4onFtjnpZg2lVfXRHempVfHlJ +eWZJbmxFbmpEbmZEamJEaW1EaWU8ZWVCaGlBa2NJdW9Fdm1FcnREc3FCamtGcXE+c25PdnRC +fH5Pho1SjpFYiY5Nh5Bbio5PhotRgIhLgIVNh4dKeoNKf4JMfoRCeYJIeIZHd4FdfINHeoJJ +eYVFeH9Jd4JKdHtId4JKeoRLen5BeIRLd4BLd35Dc34+coVQeYRJd4RKe4JDfIhPeIRCeYZK +eoRHf4dKeolJfYlMfItDe4RKdodFdIJFeIBCdH1Gc4JEbnBGcYZDc31HdH5BdH5Hc39Bb3tF +b4xHa3U6b3dEcW8/bnhAX240QEo4QDY4Ojo1PDY5QD4wPTo+Ojk1PzdGQjlCQjlGQDg/Qj4+ +PTg5QDs+PDg4Pzk7Qjk8PTo7Pjc3QTw5PDQ+Qzw+RT5HQz1ORz1UR0Fyk1Dy/9n///z///// +//v////9//z8//L+//r////////////+///+//f///v9//z9//b8/PX1/+/5//H1++72//Dt ++Ojq9eHq8+zg7dbt+ufh9dzT4dPy8Obx+PD+//z+//z///3///z5//j///7///37++v4+/T+ +//v///3////////t9+Pp9e/4/vH7//v9+fLx+O35//Lu9er7+/Dz+u727e1TSUc/Pj9RQD5j +ST5xSD1iQ0FKQzZFQjZIQjxEQTlkQUBiQTpiPjdGQDlKOjYyPDVKPThXRzZnRTtqSz5tSjZI +OzU3PDQ5NzgxPTY3ODYvOSwxPDYuNzE8ODU3OjU1ODQtOTU1ODQzOjA0OTA3NjIyNzQ2OjU2 +ODM0Ojw3OC82OjI2ODU1Pzc8OTg0OjI8OTwvODA7NjYzOjU7NzUtOS03OjgyNTI6OTU0NjI0 +PDUwODM3ODU3PzQxOjQzODU2NTU4NjEsOzU1NDM1ODkvNjY4MzYwOzc4OzY4OzFKQjpYQjdT +PztEPTk/OzczOzY3OjIyPDM6Oy8xOTE4OzUxNzM4Pzc4OTI4NzU3OjY3ODA3Ojo2NDU4PjM6 +OjpCQTo4OjsyNzI4NzU0OjUzNTEzPzQ5ODg3PzU1ODUwPDE6ODwyPTRdT0BPSj87NzgzNjU3 +PTQ4OjY5OzY1PDsvNzcvOTcxOzY1OTUyODQ1OC82OTc2PzU4PDg2OzQ8Nzw0PTM9Pj08PjNE +OzxEPDZxT0+UZlCsgGa8kWvJoIHEm3i+pXPProfXuYrdv5PjzqTpzqnq1aTp2anl1a3r2qzw +3a/w4qz24rzw2a7x3K3r16Hw0qbq0qHsyaTqxZjtxZnlyJHlxpXev5TgvoPguobbt3/WroHK +pHXKonq/m22rg2J+YE1nS0FCPzw8QDg2PDo6PDo4Nzg3OzIyOzk0PzM7Q0U6Rz8+REM6UUQ9 +TFk9T1U9T1Q8UFQ6UVQ8SE03ST8/TUo+Vk1AVVQ/X1ZGZ2pBbGZIdn9LfXxKfo5RgIRPgI5N +f39Mf4RRfIhKf5BOhIpPfotPdn9Le4pNdIhIdoFGdHpNe31NgIFRe4dBeHdKeYRLhIJTiJZL +hY1NdYs7amdEc3NDcW1FcW1EdWpHZXBBYFhFbWQ7b2dFdWtJcG5NdW5Qd29WgWldh2tkmXJq +oW9zlHFun3RvmXNdjW9lgnBTgG9UfXVLfXBNdXNJempUdXFGbmdScXBJcWNQenJEbmlNZWZF +ZmVBa2JJcGVDbWpKcWVJbWtFcXJGdHJEdWxJdXBHdnBLcG5GbnFGc3JDdHNVf4FTiopah5BQ +io9YhpFOh4VUhY5SgYtRg4xPfYRLfIJNgoRMfYNSgIRQf4NMf4dNfIFJd4RSgIRJfYdOeoZK +fIdLeIBKdX9OeoVCfoJQe4dKfYJTeolAd4NSeYdHeIhRgIhIfIZMeYJGd4VIeoRIe4pJeohL +eYZGe4lRfIZEeoRKfIJFdoJNdoVLd4JJd4JIcoVFbXBHc4BJdYBMdolBc31HcoRFdHtIb4FD +cnw+aXlGbntGandHaHtFaHhBRWM2PDc1PDo4Pzg9PT45QTtFQD9CPDtLQTtHOzlCPzlAPztC +PztDPDxAPTxEPzlBPjhHQzw/PztFQT49REBAQTxIREFUSUJWSUBzmE74/uX///r///v///f/ +//////////r///3///z9//b9//X///n///f+//j6//ny//P+//b///z///j6+vnu9+f2//Hu +/PTk/OLr/93o+OPi6Nv38+n3+ejv/urz/+/x/O7y9OLl7eDv+Orr7tjx/ff///7///v7//b6 +//H0//T6//r///j7//f4//L1//H///31++/t7en6/vP+//Lq9uTl5tNPSUdAQUFURzlkSDxq +Rj5XRTVOOzxEOjc7PTZLQjdfQjpmRjpZQzZNPjk+Pjc8OTw5PTRcRD1fSjdvSEJhRTVKOTs2 +OzA4OjgvPDQ4Njk3NzM1NTc3OTg0OzY2PjYvPDQ4Ozc2OjQzNzg7ODMvNzUzOTI0OTk+OTgs +NTM4OTksOTZAOjUxOzRAODctOTM8ODUsODQ8PDQ0ODY1OzY1NTo2OjIzOjYuOzA3OTYvODU4 +Nzo0PDYyOTIxOjQ5NTgzNjU3OTM2OzY0OTU0NzYxOzMxOjY0ODE3PT09OzJGQT9SQzlMQDpE +PjU7OzY8OzMwODE3OTI1ODQ4NzY4Pzk6PTU3NjY7OjYzODM1NzYzOjg1NzM1OTQ2OTI5RDg8 +PzcwOzY7OzozNz0yNzc4NjQ3PDkvOTIyOzEwPDEzPDc5Pzc5PDM/QjZTSUMzODA5ODc1Ozg7 +OTUvOTQ6OTIxOjE1PDIxODo0Ozc2PTo5ODM8ODg6OTk4PzY6OTg7PTZHQjxURDx1WEmTclak +e2K0lnDCoHq+p3HJqHe+om/Lp3zWu4vgwZnbwZLnyaPq07Dq2q7q2a7r1a3q1Z/n16nt3afr +3Krq1ajs0Jzqy5rszqDq0p7w2aTq0qPt0KDszJ/pxZnau5DatonZtHzbs3vRt3bNqILGqHDH +o3K6jWaVcFWAYkhiTEZAPTs4Pzk2OzU0Pjg0PDc2NzMvPjU6Pjo1Qzg8SEY9Tk47S1AwS1E+ +Tk86UFNCUk8zUlE8TlE4TEM9SU41TEZDS0I/UlBBZmBEYWY+aWFHen5OeX1ThI1Rg4lOfohQ +g4tOhI9Rh5BVgodRh49LfohSgpJMfohNhYlHeYBIdoRBeH1IeoU/fYRPfohFfIlJfYJVi41Q +h5FRiY1HcnJEbGxDcm9BcGpDaWtBbGpCamQ6ZltAaWNDbGlHbGRBcmdFbmQ+cGZEdm1CbmlR +eWxIc2tMcGVKa25PdWtIbnBJc2dJcGw/bmlKb2tEbmZJbWpJdmhKaWc+amhBZWFCZ2FIbGtB +cm1EZ2tFcm9LcXZFdWxHbnJFb2xMbmxBbW5Jdm5CeHlLen5WiI1bk5VZjpFci45VkJFbiJRW +iYlRhpFNhpFLgJFKfYhQfYhKe4VNeYhDfX5QfolHfoRUgYtMgIZPgIlNhohKgYpQfIRMe4JM +gIVMfYhLfINJgIhKfIVQd4JBfIFFeIRDfIRLeIVFe4ZJeIpGfYtMeo1HeIlKeItEeIJLe4pF +eYdIf45EdoNFcH9NeYNDdH9HdHtFdoJFdoJJcG5HdoVMd4pHdoFKcoFBdoFIbn0+cXhIcH9D +cHpKbn8/aXFEa3k/bHRSdH02QFw9PDwyOjY3QDc3OTc8Pjk+PDxDRTxEPTo8OTpCQzhBQj9E +PjhAPTs7Ojc8PD4/PDpBQD0+OzdAQUM+PDdCQUVMRzpVUUp4oU////L8//36//T////9//z9 +//f///////3////////6//b3/e/x/eT+//b///z////8/Pzv+ez3//Lx/e/1/+zz+PDn6tzl +9N3X89DZ5dTl9Nvi7uD5//Ly+ezz/+/8//z4//X9/vX///7///f1/u/6/u/z/+78//T+//X2 +++nr+u3z/e79//36//T7//b7//D///n///759fT7/fD8/fv16eVaSVA+QTZPRT1eTDdpRT5f +RT1NRDxIRThCPTRCQzlfRzpjRDxZRDpKQDk+Qz4zQzJDQTtUQzRfSjllTDdbSDw5Qjg+Ojkz +OTE7NzgvOy84OjQvPTE6NzkxOTQ0OjYuNTU3OzI6OzEqODIvODAzOzAyPDM1OzMtOS4tOTMt +OjQ2ODQnPTI5PDcyQTE2PDMqOjE1NzgxOjA2OjcvPDE2OTcsOzQ1NzYwPTA0Nzc0NzY1OzQ3 +OjU1NzAxPTItODcuOTI1ODE5OzE1OTgtOS82NzMxOjQvNzUyODE9OjU9QjBRQzlHQDhDOjky +OjI9NzczNTU8PTc1PDM2OTE6OzczPzY2ODc1OjU8PjQyOzQ4OzMxPTM4OjQ2Pjg7QjM1Ojg1 +PTM0NzkyOTA3Ozo6OzM2OTo1PTQ3OjkyPDQ0OzY5PzlESjlRSTxDRTw8PDUzOjQ2NzgwQDU4 +PDYyOzIyPDU2PjQ2ODg3PDo3OzU6QjgzPTVCQz5XSTt9W0yNblWecWSrfW67k3a+mnvCoHPF +sH3Ksn/Or4PJsHrRp33YvJLdwJPayYzlzZjm1p7n1qDk16js2azu2qzq2KPo2a3q1afv16fu +1p/vy6Ltz5noxpXp1ZLr15rs1Zrt06HtyZ3lyJLkv5nfwYHht4rauIPbt4DRpXjFo3HEoG62 +kWKbcVR5XkhfSkFAPTs4RjU2PzY2Ojc1Ojg6PS8xPTcyRTc7Rz82Sj47Wl1AW1k9WFY6XFk/ +UlU6T1I9UlE6UVE9UVYyUUs9TVM3U0Y+Tk08VVpCXFk/YldEcWxJd3lOeoFMfIFShIpNgopO +go5UiJFRgoxMhIZThpFOh45Qg45LiZFRgIpKfoVLfYhDiIVQgY9EfIVShpVKeodRfolKh49Y +ipBKfYhMcH1Fd3c/dm9EbWxIdm9CbntBcmw/bmxEZGM8aWVEaFtDZFpDbWFCcWNIb2ZCb2NK +aGNEaWFNZmI/b15KdGxEaGJEbmhKamU+aWhDbGpGcWpHbXFEbGlJamxFb2pIc3BDdXBDdHFD +bmxGcm9JdnJJb3BIdGs/c29OeHZCe3ZVg4dRio1kj5lVlpdjlpdSlpddj5Zai5NUipBSjJVQ +iY9QhIxKiItRgIxNhIVSgYlLfIJPgIdRhIlNgolLg4hQhYlRho1QgY1MiY5RhY5MhIxTg4pM +f4xMgYxJfYlLfX9GfoNDfINKfoRMe4hFeoJKfYdOhIVRfYlFfIBLfYhEeoRMfYlHf4RQfYVE +d4RKeoRIfYpKeY5FeoJKdX9GeIdIfIJHc3ZFe4lLd4VIdodCcINEeYRDc4JDc35FcntGb4A+ +cHtGa38/bnFBanlBb29McXozSWI8PDsyPjhBPz41RDk9PDo5QDtCQ0E9Pj07PDJBQDxAQDw+ +Qj49PTs8Qzk/Pjw+QDlDQzxBRjtIQ0BCQjhTR0BOTjx3mFP0/9z9//f///v///////3///z9 +//L9//P///////n///r///////////z8//f5/+/6//L8///w++zv9+P7//X0/+3v/+no/+jg +89fl6eDj6dfZ49b5/vnv+e3y+/T5/vf6//P8//T8//D1//T///r5//j5/+zu/+rr9uvw8ej4 +9u/v3uXs5+j3/vP59+3m9+H4/vD7//T5+fT5//X6//Ht8NxTQ0s7RztSRUJfRjdqRT1ePDhE +RThEQTpEQTlHQTpYRTlkPz5bRjlMPzc9PDM7PDlBQDpQPjliSjxWSzhNPDssNzVCNDYyODQ7 +NzI0OTY8NjUzPjo7NzQ8PDs1OzYuNzUxPDE3OjczOTA4OTYvODU4OjM6OS4zNzQyOjIzNjMy +OTYwODI8PjUxPTM0Ojc0OTE4ODY3OjEwNjUyNzM1PDk2NzMsNDU4NTcwNzQ1ODcmOjMxNzYz +OTU4NzUxOTM1ODQvNjM1ODkzNzI3ODMwOjM2NzY0ODM3Ojc0QDNFPDhUPzhOPTxAOjc3OzU3 +NzM4PDYzOTE8ODkxOjA4PTYyQDc8NTkzOjI4OjcvNjY3OzUyOTc5OTY1QjVBPEE3PDg2PjY3 +Pjc3PTY3PTc8PTo2OTg6OTYxPDYxNzM2OzU6QTlGRjdJREI9PDY5OTo2OTM5OzwuODM1ODss +NjI4NDkwNjQ5NzYvOzQ8Nzg9QDhoSkSMdVikf2mxjW21k3C3lG7Dm3PDnXXIoXrFpYDKqXjJ +rH3GpHbIqXrTtozdypHgxJbfv4rlzZzlyZrpxqTnyqLoz6fozpTtzqjq1Knt0aXs0aTp1aLu +zaHsyp7pyJroxpjrypPoxovq0ZjryZjqx5flwYfkv4zjtYnbu43ZtIfRqnvJnHPBmGvAh22U +dll1W0dbRkY+PTY5PjsxPTY1PTc6PDQ3PDoyPTc7Q0Q2REI6Rz49VUw9Wl08W11BY2s/WmBA +V2c8UVY6WVc6UmA7Uk88UU04TlE6S0k7T0ZBWlxAWlg9X1JKcmxIcHZFd35MhoVRf4tOgYNS +e4lKgIVSgZJQgIlMf49PhYlQg4xQgIVLh4lYg4pShZJThIpJgIZUf4xKfI5TfY1Jf4pPiJJZ +hpZNfINPdYdHe3dMd3pDcXBMa3dDbWpIb2pHbWlQZ3A9ZVlDZ2g+aF9KbGJFaGNEZmlDZ2dK +aW5CcmxMc2hFZ2lHcmdAbGVGc29Ecm5Kcm5AbXFAbmlCcG1HeHZAdHNMeXdBeHZJenFGcWdJ +anJDbmtJcHVEf3dSgIlKiIlaiItVjpJZkJVfkJBOkJNaiJNTipFRiI5ZiY9Uio1Xk5JRio1S +ho1RiJRUhJJSiY9Tg5NOioxXjZRQi5BTh5FNhYhVh5RPgodRiY1ThI5bh41Ph4tRgopWg4tQ +f4pLfopIeYZKe4hGe4hKfIpMfIdMfoZMeodIeoZMeoxDfYdQeolHeIZQe4REfIVVfYhGe4ZQ +fYtIf4pNfIhJd4JKeINHe4lEeYhKcntJfohNeoxLdYNLdoREdH9Gc4BEdoJIdoRHcYZFb35C +b39Ab3REbH1CanJCcHVKbnQ4SWw4Tko1Qz49Ozo4PzdBPjs8Pz5FQj0+PDlEOz0/RzlCQEA6 +Pjk+QUFAPzk9QDw/QjlHQj5ERT9CRDtNSEBQSkRpkVHy/Nn///3///////////////v///// +//////3///X////+//3+//f///z////9//v6//b+//T+//X////z+fTr8eTv8ePn/Ong+9Ln ++N76//Dp7OP///T49/X+/vv2/uz0/+/y+evq+ODk9Nvr9er2/+71/+v6/vj7//b5//L5//z/ +///////4//P3//X9/u/1/+3y+uTh7t/h8tns9ebk4dhUREg4QjlTRjlcSjlsSkFaSDpMRj49 +RzdEPz88QjFcQT5iRjxhQz5DQDhCPzc3PDc5QDdSRz1aRThURjpGPTU3PDcxOjUzOTY1Oywx +OjQ4OzYwPDM6PTUtQjQ5MjMtNzE8OjgvNzQ5ODgwOi07ODYvPDI3OzkwNzg4ODstOzM3PzQw +Ozc0OjQ1OjQ6NTY3OTIuOzIsOS41PDQwPDM0OzMsNjEyPTgvOjI4PjUyNzM4OzYzOjI3OzIv +Oi85NzQyOC45OjQvOjA4OjU0OzE1OTgvODM1OjY2Nzc1PjJCQTZNRDhJQTlAPTc5PzM3Pi82 +PDI2PTUzNzA6ODgvOTI3PjUwOjAzOTcyPDA3OzMwPC82OTQxQDM8QTgxPTU6OzM0PjA1PDMu +PDQ2Pzg+PDw1PTQsPTM2PTg2QTY3Pjg2PTNDQjk8PjlAPTkzPjM3QjgyOzE2Nj0vOC85Ozs1 +PDA2OTs2OjFCRUJSTz1wYkaah2WvlnC8nHHEpnzHpHrBoXPHoXLLqH/Jo37HpYDLqoDPr4PN +qn7OqYDUuYfbwI/cwZLev4LhyJfnx6foyJ/r0afl1q/o1aPlz67p2Kfp0qfw1Kfz063vz6Ht +0Z/sypnryJnoxJPqyY3myZjnw5bjx5Xjvo7fvIveu4jat5DYsYPOpnvJpnLFm3O9kWand193 +V0hZTz1APjw5Qjs4OjczPTE5Qjw2PjA5QDw6Rjw5SEI6SkM7UEo9WFI9X109Z2E/Y2ZEb2s9 +Z2o9Zlg8aGpDaG08UV89U048TlA4S0o6T0c6W1E9XlpDWldJdXA/dW5PfoJKgIZUgY5Je4RQ +gIxLfYpRf4lMeopQgY1Lh4ZMfYpQho1Pgo5Ri4tPhopSg41Qh49Mf4lPgY5KfYpXg4pKiI1U +h4dGgIRKgIVJgn1Ke3xCcXVMcHE+dW1KcHFDc2pHbWtAbGVEZ2VFcGJEb2tJaW1EcmxHb21I +dHFEb3BEdmdFbm9Jd3BLdHZJfHdCeHNIcnVBeXFOenhAeXNEbXI/cWRFbnNCd21GeXpJd3lQ +hZFWhYVRio5WkJVVj4xXipBVjJBajo9Uj5JWipBYholSiY5Sio9QiYpQhZFPi5JViY1TiZBY +ipJSh4hfj5FRi5RckJJOjJFajJFWjpBZjZFSiZVVhI1QgJFTiYlThI5QhIZVh41RgohQhY1M +goRPf4pKfodPf4dMe4RMfoVNgYhQgYRMf4tKe4dHfYtGfYBKfoZLe4hJgIpNfYRJf4xMf4hJ +fYtMe4tDgYVLfI1IfIlKfYZGfHxMfYZFeoVGfYxHgYhLd4VGeoRKeIVIeYBHdoBFdn9HbXhF +bns/anlFdXo+anFCcHBDbHJARlk8Pzo5QDo4PTkzOzU+QDs9PThARTw4QTZFQDk4PjhBQzw3 +Qjk9QDo+QT5DQTxBQj1DQjxDRj1PSDtPST5vmE32/N7///X///X///f///n////7//b+//b5 +//P////////////6//D9//r2//n4//L+///8//T1//Ly++r5//D///f////n9+3i+tXt/O7m +8+Le7dXs/Ons/uzx+e75+/j///b///7///////////fu++z9/fj4//H6+e39/vz///X9//bz +/e3x/+v9/fT+//z///fx+/L+/Pv////////38udZRUY2OT9QQTlhRj9kSTxhRDtMQjhHPjxA +OzhLOzZVRjVjRTlaRTZIPzU9Pzc7NzY+PTVSQTdcSTlMQDc6OTU0OzIyOjU1OzY0OTg6NzE0 +PTYyNzQ3Nzc5ODo2PjQ6NDg0OjU6ODkyOi82OjYsOzE0ODg1OzM0ODMzODI7Ojk2OTc8ODY0 +PTUzODc2NzI+Ozg2NjY3Pjc7PjY0Ozg1Njg1PDM0ODM1OTMyOTEyOzQzOC83PTUvOzA4OTMv +OC48OjYyNjA4OjUzOjJAOjY0OjM0OjUyOzM4OTg4ODg7PjVLRTpJPzlFQTk7ODc3NjQ7Nzk3 +OzMzODUwPDE5ODcxODA3OTY2OzM4ODgwOjA8OTguPDJCPzo0Pzk8OzcxPDQ7Ozc3Ojc4PTVB +RD46QDY3QTM3OzI+QjY9PUA8Qjk/OztRSDtMQj0/QTE5OzkzPzU8Ozw1PDA2PTs2Ozc1PTs1 +QSxJR0JkWE10a1qbhl62nXK8oHXJp3PRrIDJpXzDmmvJqX3Np4rHp3fHoXnJpnXNqH3Ep3rH +rH7StofOt4zYtYfTt4zgyJrfyKHdx5ravZbiwZ7fxaTlzafp0KTp1anq2qzr2Kvw1qfv1qnx +z6jpzKDrzp7oy5fqy5LlxpTiuIffv4njwJHlvpXiuoPct4vSr33Pp3nGnWO/k2qpg1yOaVVX +QDk6Pjc7RDgzPjM3PDo1PjU6PDs7RTg+RkM2QjU7SUNAUUQ/VFg9Y15DbHNFampCZWRGa3A9 +ZWpDam0/Z3FHdWxAWmZBV1g4UE49S0s7VEk8WVREWlk/Vk5GcnFEdXFTgYdNgoZOgIROhoRV +h5BKhIpVf4pHgolMhZNJg4tThZJShYpZh5NPiJFUiJJTjZlRi5BPhZJRgYpPiY9WjY9Vj5lV +ipFPiJJKdX5BeotVjYJNg4ZLeIBFd3hKdn5Db21Kc3NEcHJKbnFIdWtJcHBGam9Ke3FKdm5E +dnJJdnNHdHJJcXBGdHVFdXBPcmtNbXNJdXNCbnNFc3BJeXhOgoZLhotYh4ZJh4hZi5FZkIpm +l5taj45hkpldk5hUjZNcjpJVkZVUipNUjZJcipZTjpRWipFRi5BXi5RVj5FQjpVXj5BUjYxf +lZNSjo5bi5VQipFcjJZQjYtfi5NNiY9XiItNiZFXhpBLg4pRiY9VipBRiI5WhI5PhotUf4pJ +gYpPgotQg4lOf4hKgohQhIpPgIxMfo1JfItQgIVQgJBPf4VKgItMfYlOf49MhYtNgIxJfIhH +gI1RhIhKgYpMfZFKgI5KenlJgItQgZJOgIlMfIxGe4hOgZFOfYlNeYVJe4BJdX9DcX9Db3pI +cnhAcHpBbnRHbHVKbHNHYnhCQUo3Pzs2QTg4OTk1PzdDQD1AQDhCPD49QzdGPjs6QzQ9PDY4 +QzJBPzs8PTlDQjxAQjlIRzlKS0BSRj9ul079/+v///////r///39//H7//X///////////// +//z8//T2//D9++3z/+zz++n9///8//X7//v5/+/1/+3+/vzw+Ozw9+Xj8t7l+tvp8t/h9dnp +/uD1/uzw9+fu/er5//Hu/ert9uPi+ubv/O71/+z9/fb+//X9/fr9//z///////f+//3///f+ +//P6/fD5/+/z+vL///z5++vs9eHm+ujp8NhQS0pDQDpLQTpcQjxjSTllQTxEQzZJOTo9QDNH +OzhVQjdrRzxRQTNLOzc7OTM/PTo1OTZPQkFTRTZEOjctODU4ODY2PTQ1OzM0ODA6NjI1NTI6 +OTMwNzNDOjsvNy82ODI1PDY7OjYzOjE5NzUzPC06NjMuOzE+NjczOjI9NjcxOC44OzQvOC82 +NzM6NzQ3OjE1OTU0NTI1OjQuODI6OTA7OzMzOjM1OzI0NjQyNTQzODQ3OTQ0NS84OzcqOTJB +NTYvNjU9PDQyNzY4OjUvOTM5NzYzOTY3ODE3OjI5OzFDPTNGQjhDOTg1PDY0OzQzOzUyODIz +OzI2Ni8yOTc5ODI7PDkxOTA6OTgzOS84OTs2OjM8OT0yODE3Ozw3Oi8zOzw7PjU5QTZBPT05 +QjY5Pjc4RDZARDtCPz1CQT1CPDhLRzw8Pjs6ODQ0NTU2OjU5QDs1PDI4ODY1OTk6PDU5PTVG +Rz5hWkuBbFWnj2K4mmq9m2vGpnfPrX/Mpn/LonzKpXPIpnvIonnDpHa7lWm7kGuykWu0lWe5 +qnG4pXK3sHC4rnq4sne6qXa6qn3Gt4XJwpPTxI/ZxJrax5ffzaLk17Ho2rHt2Krr2qju0qXr +1J7t0aTqz6Hrx57qxJHkvI/du4PqwZPku43gt4Xbs33ZqILMpnTHn2+9jmCtf1+QZ1FeRjw7 +OzI9Qjw0ODM4ODkvPDM5PDs4QjdARD84Rzg9Q0AzQz1AUlY+W1ZHY2xFdHFObHVBa25FYGxF +cXdDaGdEZ2o/XFxBW19BY149V1o7T0c6U1BAVVY4VFdEalhBc2dIdnhGeoFPe4dJfolUf4dG +gX9Tho5OiZRVh45PhZBZhYxRhY9Wg5JTiY9UiIxPgpNUiJJSg4xQh49ViJFYjZRWi5VPiY5V +ipRPhZJMfIlGd3tEfHhVgYpRg4lWfYtJenZKdHVDc2ZMa29JZmpEbnVIantFdHVIdHBEcm9L +d25JcnJMcnpIfHpNeH9Lc3xVe5BSgIdUhIZRd39NfYlfh5FUiZZikZlSkpFakZdXkJNej49U +io9cjYpRi5FUhZJWk5Veio5fkJBWipBZjJNOj5Rfi5dSkJBdjZdTjJFZiZFZkZVfjZdVj5lY +i5NVi5ZXjpJYiptWkZZUjZRYgpVRiJFSiIhOi49RiZBRhYlQhIpNgIZQgIhQiotRgI9MgIhb +ho1LhIhPg4xLgohPgY1IgolRfYlLgYhNgopNhItQg5FOhYlQhJFTh5BLh5NThI9Sh49Tg5NX +h5FRhI5ShpVKh5FNg4ZMgpFNgIxIfolSfIlFgIRQg45If4lRfIpKeoRNd4NDdYFLdoRCc4JE +a31BZ3lDZ29Db3FCcXBBSmw6Pjw5QTk7PT02Qjs5PDk6PTZBQzo6OjhDPT02PzU+PDo4PTRB +PT06QThFRDo6RTRMRj1NSUFRTENwoEr8/+n///T//////////////////////f/2//L///v8 +//T8//T9//X///////////79///7/vH3/PT7/+/v/e3p/ePs++zl9+Pb89Xd69fh7t7d69v/ +//////Xy+/Lv+u7p/er8//37//f6/fH0++j8/vf5//P5/fPv/ur1//Lt9+jz/+/+//Lz/vD+ +//n9//b1++/5/err7OX7/fj7/fXp6NhYQk47QD1ERT1hSztkTD1kRDdGQj1JPjw1PjpDPzZP +RjhkSzpiQTxOQDo2Pjc2OTUvOzRCQjdLQjo8NjUyPDUzOjEzOjc0PTYyPDUoOzcyODMvOzMx +OC44OjY4ODQ1OjQyOjE3PTUyOTMyPTU2Ny81OTY2ODItODM0ODQwOjQ4NzYoNzI1OjYzODMv +NjUtOzAvOTEuOTA2OzkxODMzOTAxODI6PDgxODc1NjYyNTYyOjQvNjMzOTI3NzMvODwyOzkz +OTY0ODQ3OjkwOjIyOzMtNzE3ODYxODM4OjkxPjJBOzVBQTpCNjk1Njc5ODgvPTQ4OjY0OTI1 +OjMzPTQzOTc0OjkyOzE6OTUyODYwNDI0OzcxPjM1PDcyOjM1PDYzPTI3ODo2PTVBPkE/STpB +Pz47QTpER0FBS0BAQDw5QztGREEyOjg6OTk0PTg1Ozs8Pjg3Pjk0Njg4Pzs5OTU6PzhNRDxu +Zk2hg1+xkmu8nmvAonbHqH3Npn7GqnvFn3XCo3LJp3fEoHC4k2e0hmOlf16TdVR6bUpwaEtr +X0d1ZU1xXUdxYElzZ0lwZElqWktsZE1/fFKVl1ukpmy3snPVx5XZz5Tm06jl0qLt1qnpzZvs +yJ7nzpnlyZTjw5Tdv47gv47gv43hv5DgvIjbt4XVsn/Tq3zNpm+/k26rgWGLZlFXSEQ6Ojoz +Rjs0PDIzOjw1PDY5Qjw6RTs/R0g7SEA3RkI8T0I9UFA/Zlk/ZXNDZWM8aGhLd4BEbXtCc4FC +am9GbHpCYnQ/XmZBb2hCYG4+WlE7T0xFXVE4VVxAaVY9aGdDdnhGfH1OeXlEfXtLgIVNfYFJ +gIVMhopMiIxOio5UjY5NgY5Eg4hLhY1GhIlPhZJQi41QgYhOjYpShZNRioZWjZRPiotMjJZM +iYtZi5hUjZJQhI1OfoxLdIJJfYZJfX9Ef35LiopMhIVSfY1KfJFNgJBMiIVNhIlRgY9Yi4xT +i4lKj4pJhIFNg4dLd39PfY1UhJFgjJpakJdVkpZYjpFYkZhWk5FXkpJRj5FTjI9QjJBLiZJM +go5WipJWiJBTh41Sk49hkJRUkpRViZtUjZJckJpPlZBajZdVjpJelJ5UkpZbkZhZkpdWi5VX +kZVXjpRajJROi41WjZVWi5JShpJSi45WjJFHiZFKgIxTgopQhYtVgY5LhIpSgY9EhIxQgYtK +h49TgotFfIlOfopHgJBMgotUhI5Oh49TiphNhI1NiZJPh5NPg49Uh5JQiZdRipJVh5JPhpRR +h5JYjJlWh5VNhoRRhJNRiJpNgpNOhZFMgI1Jg5RPgolNhI1KfpJHeolHdodGdYdJcYJFcH5F +cIJDbXpCZ3VBbXhGZ3A2Sls4RD8yQDcyPDU7Pzw/Pzw/Pjw8PTk6Pzg5PTk/Pzg7Pzc4PzU/ +Ozs9QjVBQEJCQj1MREBFRkBtlVP2/93///r////////////+//31/+/6//L///////////// +///5//bx/+v1/+v9//Xy//Pt++X6//D7///u/Ovt+OPg9t/d7Nna683o9Off9tzX4NH8//fx +8+fp9+X3/f37+/Hx/uz4//Pu8+n+/v38+fH0/vb+//b9//Pp/uz3+/D7//b3/+3z/vL2/+z8 +//ju/+fj/eT89u/x/ujs9OHh+OVYTVI1PztORjlaRj9lST5lQz5RRjpAPTs/RThCPDpURzhp +RzxUQzZPPDk+OTA7Pj05OzlEPzlHQDk6OTQwPTYtODg1OjQxOjU0PDE2ODIzOzg3PDgxNTc7 +PTEzPDMvOjIsOjU7OjsyOjM0OjYxPDA0ODQvOjE0OjYtOjA3NzowOzU5OTUvOzQ5NjM2OzU2 +PDUxNTM3OzgzOzQzNzUxPDU2ODo4PDU3NzgzODQ2PDsxOzIuOTUxPjAwOzYrOjE3OTYsOzU4 +OjYvNzI3OTY0OTY3OTgzOjM4PDU3OzcyOTY5PzRAPjU3OzIzNzM1OzM0OzMwOjU3PjMwOy80 +PDUvPTE3OzgvNy03OzUuOCw3MjcvOi88Pj0sOzI8PDswNS4/PDk1QTpFPjhCSj1FSD9CRT84 +PzpDST9HREE+OzxARz49PTgyNjg2PDQ1PDhARzlBQEE2NjQ8PTk/QTlCPT5LSTVwVk2OdlGq +iGm7mGm9m3TBoGnDonbHqHLGo3HCn2zConXGo3fHn3rJn3rEoHbFmIC7hXa5dnSpa22jZGSb +YFuLZlGGXVF6XUp3Yk5tWkZvVlJiUEJdVURmY0d3dE5/hlCVlVu7tXPXv4/lxpvjzZbnyqHk +yZnpxZzevJTfvY3fu4jlwYvgvZLguZDasoTZrHvYqoLTpnbFlnewf2CIbFZXQTw3Pjo6QjY2 +Pjg2PjkyPDg7Qj07S0E+RkY7Sj43QT84UkdFYmRAX1xCZWo8ZFtCa3NBZ2pFcYRGfH9JdIhI +cn1BbnNDZHI9Y1xFY2Q2X2Q8UlI+WVE9W18+YlhDaWlHc3pFeX5OfYBFeH1Nen9Dc3tQfYlK +h4RPgYtMhIZVipFPhoJQgJRPi4pWjY1Hg49YhY9Si49UhY1MjopUj5BTi5hSkZJVkZRTiYpR +iYpVjY1Pjo1ViJNLj5JcjJZQhopYgJRBfYZVgIxJdoRPgoZJfX1RdoVDeYFOeoZPeItPgolP +hZFVipJajZlajpBWkJhdlJZSk5dbjJlXjJJTipJWj5NXiJFPjJFXj5dViY1Xi5ZSjIxViJpc +mJFZipRUjZdZjJRWjpRXjpNUiYxXjJFYkpNhk5dXj51djZlbjpFZk5ZWlJ1Vj5pVjZVVjo5T +j5VdjZRWiY9Uio5OjJNVho5QhotOhYxJiItShYlPhJVPipBIg4tNho1Kg4tSiZFMfotFhYpR +g4tMhIxPgY1OhZFRhpBQhY9OiZBQiJdShY9PhY5NgI5Mg5NOi5BWj5dRho5ShphYhZdWjZhW +jphQjphMhIJPjJFWjJdTipZRiJVLgYdThZFLh5ZOfo9HfI1Lf4tHfItFeotLd4tId4FGdIJH +b3lAb3xBbndDam1CWWw/QkosPzszPTY2SDY6QDRCQz8+QTg9Ozo3QTQ9QjwzPzE/RD88PzhD +Qzc6RTpISTtFRz9QSkFijkn1+Nb///n///v///n7//H9//j///////79//r2/u/8//H5//D+ +//L///7///////3///j///v///v//////Pn6/ff1+ez1+/P4/+7p8+bk7Nvx9+vv/+z0+O3v +//T7/e71//v///X1//L5/+nz/vb///v0//L8/u34/+76//n///b1/fL+//r///v/+/j5/vP/ +//j8//H///7///v19Ov17OBZS1E5PTlHQDxZSTlpTUBaRTlSOzpBPTw/PDU/PjhZRjhgRTpg +RzpLOzhGPDo7QDY7OTc5OzBCOTYwOjQ4PTkxNjU5Nzg0NjE1OzMqODM3OjkvOjE6OjQ4OzIz +OTUzOjErOjY2PDI2ODMzOjA5OTQvOjU3PTczODM2OjoyPzQ4OTknOzE2OjIvPDA6NzQwODQ/ +Ojk0OjI3OjcwOi04OTc1Oi8vOzQzPjgwOjEyOjMzODIyODM6OTgwOzM0ODYwOjMyOTIwNzM3 +NzUyMzE3NzQrOjI8OjcvODE8ODUvOC09Ozc4PDY+OTMwOi83OTU1PDYyOTUyOzUzPDY0ODYx +OTIzNzcxOzI6ODgxOzUyODQ4Ojc6PjYxOzIvODE3NjY0OjQ8Ozo8PjRGSEI/QjVDQ0E5PTg8 +Pj06Pzo9QTpAQTs1OTQ4ODoyPjRBPD07QDtDPTtAQTxLPjxIQDxdTkJ3YU6Wd1uthWW2kGK8 +k2+9lWnCnWzFmW/ElW/EmmrDm2y+mnPKqHHTrH7XqX/PpHrSrYbTr4XNtH7RtI/MsovUtYTO +rIPTpYrLlIjDfIGcZGR/U0tqTUdhTEBTSUNOSj1XTkRdUUBrZkaTkVa9rHfYvoPhxpfnxprl +xJjjuIjdvYnivI3fwYvivJDfv4Pct4Xbr4HTqXvLpnDGpHWxiGiHYVNMPjs2PDk/QTkzPzw1 +OTc7Pzc/QT40SD5FSEU8Q0U8QTo8UUhBaGBGXmk6Y2VDYWQ/aGlHbHBEdHpPeYZEdXBMcH1G +dXJNdHw4XlxDbW8+ZGBBY14+UUY+XmY/Vl1DbGRBb2pJen1PdYNPdXxFdH1Oe4FHfopRfYZM +gYVPf4tKhIVUgY5KgoZPjJFJg4tVhIlGiIpShpVOiolTiYtRipNXjZJVj5RRkpJZjJRXjJNY +kpdVjJtSippWipdUkpRQj5VVl5pblppZjJddiJhakJJbiplNiZBajpdViZFeiJhZlZVblJpV +kJNViplOjo5ZkJNVjpFWj45Ui5NTjpNai5dZlpFdkplUiY5TiZFak5FYjpRekJpVkZdgkZZT +j5Jbk5VUkI1fjZRVkJFbjJhTjpZekJRPjpNZk5xWj5VUk5RakplSjpRah5hQi5FWjZZXjoxS +i5dUjZFZjZBPho5TjpBNh5BRiZJRiJBRg45Tho1Qh45Ng4xSh4tOg4lPh4lHgYxQg4xNh45S +gYVIhoxRhYxHhIhKhIxQhpBViJVNhZJQh5JIgYtXi5dUi5hcjp1Ukp1ajJtWjZxWjKBYlJxX +kp1ShYhXjplZjZ9RjptWi5tThpRFgYtShJBGiJJMeoxKfIxNfo9Ke4lMfI5Fd4VJcYRHcXlF +bXo/bXVHbHdEa3FDTGsyPjw3Ozc4OzQ9PTk7QT08PTdCPTs+QTxAQDpEQURHP0BKPkJAPj5D +QTtCQTtMS0NEST1ll1D6/+n///n9//b9//j///r////////////9//n+//z////+//v+//L8 +//33/+78//T8//f5//L+//by/PHw/+Xr+uvr/ODg9uHY9srg79vj8tnn8+L5//D6+fHt+O/1 +//Lx++jv/+/3//z///P8/+/4//X+//P6//f9//v8//r39+j4/ur///n5/+76//D4//D+//b3 +/+3q8eT5/fn////5/+VUTU1ER0BERDhfSkFlRDljRTtNQzVFOTxCQDpCOzpUQj1hRThfRTtH +ODdDPjk7OzY7Ojk5NTo9PD04ODE0OTI2OjgzPTI3Pzc3Njc2ODk1OzQ2NzYyODU+PjorOzI4 +NTI1OTg6Njs0PDE4Ojg3NzU4OTg5PDc4OTg8PDc5ODY7NzYwNzc5OTQ1NzkzPDQzOzc5ODU7 +OTg0OzQ7OTg2Ojg7OTY1NjQ9MjgsPDQ5PDsyODE/NTs1NjI4ODgxOjQ4OTw0OjM2OTo2Mzo4 +NzQ5PDY3ODI9OTo3Pjk8NzY2OzM6PzNAPzo2ODY7OTcyNjA3OjksPS49ODgwNzQ/OT4tOTVA +NjgsODNBOzU2Nzc8PDgyODo+Ojg3OTIyODc4OjQ3PjQ8PThBQ0JBQD09QD9APjo9Pzs+QT08 +Pjk8PDdEPz04OjY+OT4/PjRqS0huUkhoR05TRj9NRkVkUkVyXlGae2GxiWm6jW68i2zBj2u+ +mG7Il2/BlWvFn3LKoHHImm7PpHfOqnzSq4LVtYfWtI/Yuo/Zuo3WtIvQro3Mr4fQqo3NsYHa +toPavZHYuobXqIvHnYC9fHeiZ2GIW1NyUktrSEZhS0VkT0huYkyfkF/LsXnhwZHgwZfgwo7k +v5PhvIbdvY3fuonctoXfsn/dtInYqHvSq3rQoHvCnm6whWuCZlJPQkQ2PjY+QjwwPzQ/Oj45 +QThAQT08RjxITkZIUEg/Q0M+Tk0/ZVpDbW1CcHVIbXhEa3JIcHVDcnVOhoZOeoRLdoRIeHRG +dGtHZ3RAWVhKbHFDYl1EV1pBW1hGXlpDamNMcXxGg4BRgZFPfYdQgIpLfYdQhpZPiIpQiI9V +goxTgoJMg4dVf4RRgolQgYlMg45SgI1PiY9ViIhVg41YkY1SipFWiY5Wk5VXjZpVk5VkjJlZ +jpVWjZhUj5laipNVjJFai5ZZj5pbkphZipVekJxhkI9Wk5JZlJJUjpNbj5ZWjpRZj5dcjJta +kZNZj5hWkJJaj5hVkZhXi5xWjJVYhZldkJhZjplXjI5gkJhakJRjkZldjpZYi5RckJtglJhi +jZJajZpZjphWkI9djpZfkZpckZldkppbjZhfkplUkJVgj5hUkJNijJVQjZRfi5FRipFVj5RS +ipJYiY5TiJJTi41YjZJNhI5ThI5RiZFTg5BNiolRhZBPiJNPiJFOh5NRhIlShpBSho5Qh5FQ +hItWhpBUipBbhphTipNVjJFShpNSiZNVjo9VjZZajZdVlZhcjJxXlJldkZ5UjppbiZ1Vi5pU +iIpWjpVfkp9Wj5lVhppNgo9OgYpViJVUhphMgpRNgZRQgpBSfpBPeIxGfIpPdohFcodFcX9D +bXtGbXhIanlHYW9BQV47PT9EPkFAPzlEQUA7RT5DQUBCQzxMR0NKSUBPSUZKSkZGQUNGQ0FH +RjxJQklOSEBlhE30/9n///////////////////n///////z///////3///////////77//T+ +//////3///n///r9//j0/+r9+fPy9ev6//Tu9vPn89j08+v6/vfn7uDt/+zw/+/5/vL29ezw +8ef6+Pv////t/Oft/eH0/PP3//L0/e78//f9//b+//z///fz/+n9//35+/Hy//f4//H6+/P9 +/fP///nz++fW3dNWTVE7PTlJSD9ZST5lSDxgRjpVQD1FPz0+QDlDOjlOQztgRD1aRjpOQTY7 +PjY/PjcrNzU4OjszOjo9OjIwOjg8ODgyNTg3PTU3PDY0Ozg4NzgxOS82PDUzOzE7OTUxOTQ4 +Pjg0OTE7Nzc3PjIzOzU1ODQ5NzE3PDU3OTUzOjg2PDI3OTc0OjM5ODc0OS42OjU6OTU5Njc4 +PDY4OjI3OzcuOzQ5ODgxPzM3OzY2OjU4NTcyODQ4Ozk0OTI3OjYwPDM0ODQ0OzA7NjYzNzk0 +NjgwNjEyOTc3OjA0ODc2ODY5Ojo5PTg9OzQyPDI5OjcwOjQ5ODcwOTM/OTk0Ojc8PjQzPDU6 +NjU1OzU4PzQyOzg6PDY4PTQ0ODE0QDQ4Ojg3Ojw7QDg8Pzo4PDk6Ojk7Pjk2Ojo7PT82PDVC +Qj49RDg+PDtIRDhvUkx0Ykx5ZVBfVUNWRkVSTT5wVk+BZ1Cnh2atjWy2hWe7jm68jXHAkW/A +km7Fl27LpnjNonvOonnTrHvYt37ar4bTtIDRsH7TsojOtX7NrYbHrYHErofGr4XOronVtH/Y +t47ZsoHWqn/Tp3/Srn3NqX3Dm3ewf2OndmCiZWGZZViTYVSWd1jAp3bavYjav4vfvIrhvIjc +uIzZtIrctYbVuX/btIbVr4DQqIXMqnrGonWwi2SVd115Zk1PPj88Ozs5QTo2OTwyPjc2QTtA +QjtARkBDTUZFSUY/RkRAVEtEXF8+Xl9Hc3dEbXVKbXdHc3dCYWxHenlMfoVUdXpCaXtDZmw/ +Z2ZAaWk/bmtDWGY9WltIXF1AY1lHZWpId3ZPfItOhY5SgpJQfodSh5dRf4BPg5VWhotPhZVd +iZJPhY1UhIxLfo1UhohPhY1Sh5FNiIxLiIpTho1OiZNUjJRRkJBbjJNSjZFZipxVko1XkJdQ +i5NUi51UiYlajpRRjZJUiZZVj5hYj6FakplbjJJWjZVYi5dajpRajpRcj5NdkZ9XiZZdkJNN +ipdbiZVXkJNdjZRNjJFaippWkZVajJhOioxVhpZUipdShJJSjZNaiY5QjZBdj5lfjI9MkZJa +j5VakJtZi5laj5VVjpVWkZpXkpdajJpRhpNbj5lajZVaj5lUi5NciphTjJVZi5lLiZFWi5JU +iolVh5ZViJBRiY9XipBQh41PipRQiI9XhZBYiJNOf5FNg4pPh49RhpRNhpVWhpdThJBPg41O +iY9Xi49OjJJUi5VNh5NZipdNiphVjJhVjJpejZpQjZpWjZtVjZlXiJdWi5dUjppUjp9Qhole +kqJbkp1XjJtWjJ1WhpdMhJZUi5dRh51TjJdVippUiI9NfpZMgo5IepJMeYhHdYxLcoREcoBJ +bHtCdHxEandLZG5FQ1E4RTtBPz07OjhBPDo3Qzk+Pz1ERT1DRzxHRkFBQ0JFQ0BMSUFEQ0FJ +REBKR0Zcekr//9n///////v///z////+//z8//L+//v////+///8//X9//j8//D///z1//X6 +/+v9//f///v8//r+//j2//f2//L2+/fs++fs/enq+ejm9uPi79r1+u/t9+bu/u32+uvz//X/ +//T4//X7/+r+//3////+//P7++b3/+f5/+35//P8//Dy8e3u8+b9//vz/+/0//H9//z5+fD6 +/u77/+7q6NZYSk43QzlERTtUQD1mRTlgST5VQjtBQzw6PjU9PDtTQDxcRzpcRj1HPzU/Pzo1 +PDc4PTczOTE7OzgwPDA1OjkrNzE5ODozPDE1OjguPzU3OTMvPjE1Nzk6OjQ2ODg2OTMtOTY3 +ODQzPTQ2OTU3ODcvNzQ5OTY0OTA6OTgtOjQ3OzQqOTAzOTUtOS87OTctOjE5NzU0PDI9PTg5 +PjM6OjMyODA6PzYzPDYxPS84PDgzNzM0OjU1PDUyPDU0PzMyODQzOTYuOzE0OjUzOzE2OTct +NzA4PTcrNjM8ODcqOy09OTgsOTE5OTMrOTQ4NzU0ODY2OTU3OTE2OzU1ODYvQDM2ODYvODE5 +NjQ2PDY4ODIuQDI1OzMzOjM3PDI4Ozs6QDRGR0M6PTU3PTo3PzA8PT0zNjA2OzoyPDQ7QDpE +Rz1ERzqFbVuDblKJbVl2ZUlwVk5TSD1UVERuWUWOd1KlgGKpime1jGu2i2O9i2bBlmq9kGvC +oG7JonDMn3PUq33VsoLct4bVuH3WroLIqXXLp3TBrXPAqW/Iqn7Ap3bDpH3AqnrJtYbNtoPT +s4bPq37PrHbLpnbJqnLHoXS/lGi6i2WygFywi2W8kGy4jnLJp3PZuoXau4Tevonet4rasoXU +rozRr3jSroTLsX3Kqn62nWmmjmmPi1aHeFpoYUpdVUhKRzs2PTgxQjg4PzY2QDc1RjxEREU6 +RD9BR0E9RkM8STw/VlA9XFZBZGc8ZmFFa29AcmlKeX5CaXhEcWhJe39Fb3FBcXdBZ2k/dWtE +Ym09aFtDXVlBYFRBYF1BWFpCZ25EbnZKe29FgINPfYtSiJRPi49Si5BTjZNVjZVVh5JQjZNZ +iZVLiYpVipVThY5aipZQi49Xi5ZKgIhai5VYlpldjphVjo9Tj5FXjJJXiZJRjJZXkJJajJ1c +jphWi5VYiJRRjpVPipJUkpFcjZVSkJdbj5tQjo5dkppUipFgjZZVjptalJlZjpBXhZhWjpJb +iZVfkJRZi5NaipdPj5JUjZNRjJRXjZdejpRZkJxejZJYjpNej5BYjZNbkJhWk5RejZZYlJVf +kJhUk5hcjpZTkpphk5hVlJlhkZVXjZVZjZNajpZUjplVjpFVj5VTiZRNhI1Wh5JRipRYh5RK +hoxXlZVnjJVViY5ThIxSiZRQiZJQiJFSiJVSiI1TipBQh5JMiZNXjY1QipFThoxRh5FVi5RP +jJNQipdWiZBUhpZWi5hXjZVWlZlYjppSkZpUi5tdlJpVkJxXk55dlZ1dm55dlKJXkotflqJe +kaJYk59ZlJxakKFPipFYjp1ZkJ9Yip9YjZ5Th5lMgY5Oho9Jho9NfItEe4dJd4dBcH5Kb35F +dn5Lb4RCbXdKUG46Qzw+RDw1QDw7Qzg+Pzw7Pzo+Rj44QTtCRzxCSj5CQT9CRkJBQDtDQkFA +SThddE7r/8n+//L///T///////7///77//39//b3//P+///h9Ozr/t/4/+r///n+//r+//70 +//H4/+v1//P1/PLs9Obu/eLl+Nvm+uff9dbo9+bi8tnm89z1+u/2+efw/vH3//T7/fL6//D6 +++r6//Hu9eT0/u37//H5//j/+evy/PH5/O/9//f///77//T1/ery/fP8/vPy/e39+fX5++32 +/erw6dtZSFQ7PT1DQztdRztkTD9kRDxHQzxOQDs/QDdDOzpKQz1iRD9hQzZLPzc+QjY5Ojs2 +NzI0NDM8PTQ2OTc1OTY3OzIyOjs6OTEyNTQ9NjYzOTg5ODg1ODRBOjg1ODg6OTcyOTY6PDYt +OS86ODkvODA5PTYvODE6Njo2OjM4OTQ4OzU5OzUqOjIzMzM6OTQ3ODo3OTQ8ODQ4PDI1OTQ2 +OTU8OTI1PjM4Ozs1PTk8OzcxPjM8PDoxPDQ4Nzg3OjI5NTc0ODQ+OTcxOTI8NzczNzM4Ojc4 +ODk1NTM4OTkxOTEzOjYxOTU8Ojc2OjM3NzI3OjkxPDI4ODUxOzE7PDkwPS87ODotPjA8Njwq +OTU7Nzg0OzQ9OTcwOzM7MTo4OTg/PT1EPz85PDc3Ojs7OzZBPTk3PDc/Ojg6OjpEQTg+PkFP +STyIc1uEZFCCZlCUdFl0UVVaRzlaU0p6XkSVdGCeflmthGavjGO5hGi+jWq6h2u5h2PCk2fI +n3DMpnnYsoDetIHfsoTXqnfRm3bMl3G/iWaxfWOef1iaiF2kkmSxmHKym3K4oHC2n3C+pXPB +o3jEoXHFn2/Dm268lGy0hl+zhV61h2O5hmG/k2rKm3vQrHnatofasoXcs4Xct4XWqYDRp3zK +oXHFnm6/mm2pjG9/blZhVUlWSj9ORURPRTtDQ0FCODc2OzU6QjU2PzQ/PTk7QTtGQUY5RDhH +Rkk9Rjw8T0RBXFpCYWlFYWNDbG5Jc3VHanhJc21JdYNJdHBOfIFPcXdMfodKeoFOeIRCZmdM +cGxEXFRJYV1EamBFYWBBampMdnNBcGxRfXdRioxbiZdShZBZiZVWj5JTi5RYjJFXjpZXj5dV +jJZTipRZjo1ViZVXjo9Xj5lbiZdYi5RdiZtSjJZgipZXipVfk5tXkppYh5BVjY5bkp5ZlJNg +kZdLipBXiJJPiI5cjZZWkZdaj5tSiZRZjpVdiJdejZNYipthj5pVjJBbj5hXkJlUlZdZiJhZ +jpFUiJJWjZJVj5FYjJhaj5VejJVQjZBZkJVVjY5WiZVUjI9YjpZakZNZi5Zgj5Nfk51djpJY +jpJYjJhVipNYjJZVj5hWkJRaj5RRhpBXjZJVjZZcj5NSipRfiZZUjY5Zi5dNipNdh5VMiJFY +h5NLg45ahY1Mi45YiY1ShpRQiZFXho5Oi5BZhJZOhYxUg49PhJBUhpBKiI5Who5Wi5VQiI5T +iZFRiZRTi5dUhpRWh5ZVipJXjJtRjJhUj59ekpZUkJ1ZlaBckp5jlqFdkaFWjoxfmJ9clKVX +jZ9bk6NYjZxPhJBYkJ9ZjppUj5ldkJ9Yj5tXi5tLhJZShpVNf45Tfo1NeY5EeItMc4FHdoBI +cYJLbHpEZ3BFQFM8PjtAPT48QTlBPDs7QDhDPD83PTtBQT9DRD1GP0BEPkBEOzxERT9IQ0BY +fk33+dL///7////+//v+//X///////////////////3///3//////vP///T6//T///v////9 +//n9//H2//Dx+u7y+O/4+uzz/ffl9dfo8uDo7eDa5dbs/PL1//P///f//vv5/fD0+uv+//z/ +//P7//T4//f6//j9//T6//D+//z///v0//D8//j9//v/////////+/Px/N/z+Ofz++3u7+Xt +7N1fSlY0QTdHQT9ORjxmRT1YQzlSOzw/Qjs/OztAOzVLPzpZPjlgPzdHQDVDOjs2OzU8NjYr +NjQ6OjcyOTQ6ODUnOjE4NzgvOC01NTQyOzA5OTU0OSw1OTc3Oi43Ojg0NjE6Ozo3MzYzODMz +NTEzNzU1MjI3OjI3ODI7OTczOzc3OTQzOzI6OTkzODQ6ODUwOTFCNzk0ODI/OTcyOzA7Ojcz +NzQ9OzgzPjQ8ODM4OTQ2PjcxPjU3OjQyOTQyPzA0OjktPDI3MTUuOTU0ODY0PTM3NTQ8NjY1 +OTE1NzgwNjE4PDg0Ni82NTo1OTAuNzc0NS8yNTQxOzE5OjQ0ODUvPTI8NDkvOSw5NzQuOi83 +NjYzOTM5OjQzNzI5ODg9Qjc4QDg9QjszOjc4OTc3PTg1OzUyOjM5OTk6PTRAQjpHQjxKSDt/ +b1R7aFGGaVSQdllsU0tuVUhTST9xXkeMdFOhhVmqhF2kg1ywiGaviGG2g164jGS/kW3DmnHN +oHPUqHfYs4TbtojdsoHcsYTXrHvXrHrTqHvDlHCja1l2WkZ9fFGrlmu4nXu3kXC3jnCwiWiu +hWaigFigfVqSfE+dclSle1C1h1y+j2zCkm3Ko3LVqXrWtX3WsofetIPUrIPFoXC7lmytjmOd +gFyPcFVwUU1ZTz5PSkQ/RDlDPzw7QTREQUI5PDQ4Ozo2QzA9QT5ESkBLSkZJREE+QDw+QkM9 +QzQ/Sj9CXFVDXV5GWGVDal5GbXNFdXZNcHZFc3BDYGRHdHZLcIFFeXNMcnVDc3BKZHE/Z2RH +VFw+YVpGZGQ8Y11LZmhGaW5IbnBLd3hOhItSj5ZYiZFVhpZSipZbkZRajJdThZJQiJJNiZNT +h5JOhZFRhY5Vho9VjZdZjpJfjJJTjolVjpZZi5NOkpRajpVVjpdYj41XkpJWipNLjI5YjpdZ +kJJZjpBXj45ei5dVjpNYjpdbjpNTkZRhjJJZlZ5ekpxViplgkZpVk5tbj5hajZdclZNWhphZ +kpNYlJdakZddj5dZkZJakplUi5hYjZlQkpVflJxZjZZcj5tVj5NVjJVXkJFakZlakpRYjJdX +jpdYj49bkZRZkpZai5BVjJBSjZdWi5BTi5FViJJQi5NZiJJTi49ZjZlShJNZipJRgYpWjJJS +io9Sh5VSjI9WiJJRhpFTipJSj5JUjJVVi5RThpNThY5UiI9Wg45KiY9WhZFTipFWipdYjJhX +j5dbkZtZkZpciZpQipBYj5dZkplikZ5WlKBhkp1Xm6BdkZxZkpxalaNTiItllqRYl6Bfk5pf +lJ9biplTjZRglaFemqNZl6VbjqFVjJhPhpJRhpNOhJJPgJNOgJBUf45Dfo5LdYdFdnlOeIRE +dIJJcnk+UGk9PEU3PDxBQTo2PzU9Qj09Rjw6RTw/Qjw4QTY6PTo+Pj5GST9DRj9HRD1Xbk73 +/8P///v////////////////////////////////////+//7+//v///////////n///r///jv +9vHn7+Dv/eb5//D0//Xd7NjX79Do9eLn8eDt9+P///z3//P6/+r0//P7+fHs++v1//b5//H9 +//7x//X+//zt9+jy/vb///z1//b78+vr++32/+31/+vw9e/9/fv///7/9//+//z5/fX79eZb +TV06QDtDQT9NRDxeSz1bQjpPP0I+PTlEQ0A3OzRPQz5YQjheQT1PQzg7PTg6PDguOzY4PDoz +PDk2PjM8PjY5PDQ6OzEzOjc6OjUxNzc2ODgzOjM6OTguODU6NzUxOTI6PTcsOzUzODcuOjI3 +OTUyNzQ2PTcxODM2OjYwOTU2OjUyODUtPjUuOjE0NzY5OTgzOjQ6ODU9Pjg0OTg6OTk3ODU9 +PTs0OTM3Ojo4PzY3Ozk4OjE5Nzk0OTQwPDw4OTQvPDQ2PTQxODM1NzcvPTM6NzUvOTM3Nzgy +PDg3ODQ2Ojc2NzY1OjU4ODYzPzkzOTg3OTcyPzY3OTU0NzQxOzY3Ojg3NjczOTk0ODQ2PDgz +OzM6ODo1PDM3ODw5PTg9QD02Ozc8OTYvPTE7ODk1PDk0Ojc2PDc1PTc6Rj1CRjtGTD5oW0h9 +aE6JcFGPcGB1XEx9YFFSRT9pVUOHblGZfVakf12lhVqxjWm5jWm1h2eshVvAlGrEm2vUpX/R +rX3esYPVtoLeq4XauI7gvY3dtorfuIjWrIHHlnekbFqEW09tVk1vb0yFjVSonWyrlWyui2ig +fluLaVKAbEaqiWHJmHvXqYjIm2vUqn/csX/et4vmv5jlvJfdr4LQpnvBlWifelmHbFaKaU+X +cVijb12bZluIW05+V1N7VlFgT0lKRD8+Pz0+Pj08STxMT0RPWE5PTkhHRkBHREY0RDg9Rj81 +TEFDWVg8XldGZmM+X19GcHBKb4BKeHlJanE8X2FJeX9EbHBFenJKdH5FaW0/bnFDXmo9WlxB +Y1lJaGJDdndFY3k8ZWBEcHpJf3dTh45RiI5TiJJWiZVRi5lZjphRjpNZkJdSjY9WiZxVi5BX +jJlVk5NXiZdRkZVVjZxQjpxTiZhZkZdRkp1gk5dbj5xikZ9ZkJldjZNTjJ1ejplbj5pcjpZa +lJNSkpNWj6BSkpdbjZtWj5dil5pVj5hfkZhVk5Ndi5tXjJNYj5hZjY5akJhWj5NckZtYj5pP +jptWjJNaiphRio9WkJZTjppRi5Rdi5VWi5hPj5hfi5dTi5RgkZtakppclZZakZNbjZlakpRf +jptUkZpelJtTkJhZjJdRkZpVh5hUi5RUipBUio9Ti5Nfj5NNi5JWiJJVjJNQh45TiJJQjJRT +hY5OhoZShIpNi5BSipNSjZZWiJVMiIxSf49PiY1WjJtUj5RajpNSjpZdjZlSj5pXjZdYkZNe +kZhbj51Uk5ZXjJtVjZ1ek5xfk59ZkqBej59clKBflKZbmqBjmqZQj5FdmKhXlJ9jlKBRj59g +jJ5Pi5JgmqFamKdekp9Xi5tUjppQhpxPhZBRhJpTipRLf5NNg49RhZZJeIxHcX5Bc35Jd31C +dIhNbXc7RWA2SDc9RkM5Pjc8QUM5Pzs6Pj88ST08Q0Q8PEI8RjxCRkBFR0FCSEJRaUj//9T6 +//n+//j///////z9//T///v///n///////////n7///+//H9//v9//r////1/fD5+ev8//b9 +///8+fvy9+n8/Pfy+vTv+9/29/Do7+Lf69vv+vLt9evz+/L2/fL0//f9+e7t++rz/enr+un5 +/fj0//Pz//P1/+/69e/0+Oz9//v///f5/+fy8u/5/vv///7///fq8uju/u79/fHo6thZRls2 +QDlDRD1SRzpZRTxdRTlOPjhBPjg9OTs3PTlFODhWQztXRDlPPjdANzwvPjQ0NjQsOzQ6OTYv +OTI2PzYwOzM4OTYuNTQ4NzgrNTM5NToxOTM5Njo0NzE5ODsuNjQ5Ozk3OjcqPDQ1ODM0OjQx +NjUzPjczOzA3NzMuOTEzOTMyOzAyODUwNTI8Njk0PjU/Nzw3ODM8Pzk0OjI5PDo3QDE2ODg6 +NzEwOjk0NzQ3NzMuNzYzOTA1NjczMzo5NDg2OzMxODY3ODcwMzI2NjYsOTQ5NzktOjY2NTgr +OTQ8NTktOTU5NjQpPDc4OTMvOy85NzUyOzQwOTI2NDczNjYzPjY1ODYwODMvPTYzNjQxOzY4 +NzQwOTY1PDY3QDc2PTo7OTc4OTg4OTw1NzY4PTwwOjE8Oj4xPDY+Pzk+QDY+PTxbUUNqY0eE +aVODa1R0X01uWEVbTENfVkR8ZEyNdU+XdFaYeFang161iGu1hmW4gmW/lWrHmnTLp3fSpHvc +rYPcsYbcr4bivYncwInfuYjdsoPatX/aq4DQmnexcl+DXkV7WUlYS0JeUERcU0ViUUdbSkVm +TUSOZ021jljYvoHguYzPnXrXsn7huYzmvofqyZ7tz57gu47So3a1iGKNaFOYcleshF63j2W/ +mW68lm/AmG22j2mthGeWelpkUUxAQDs+RkJFSUNFT0hTTExGSEZISDs/REE+PTw3OTo8RUBA +VVdBW2BBWlw+Y11EanBBeXhDbXxDa25JanJEeW5SeYxDeHhLcH0/Zl9GcHJBYmJCZmtBV1BK +a2lKdXhNcHw+ZGJCZXBFc3BRg5JRjZNTiYpWi5NThpRTkJVUjZJMiJFSiZNViZdcjJhKiZFT +i5lRkI1WjZlPh49TjZlOkZVWjpxVh5NdjJdTipBgkJZYkplRkpNWi5JUipJUiZBYjJJRiJFV +jpFVkZBdj51Wj5dYkJtYkJdZj5pbipxejZpPiZNajpFTi5RajplXkZJYjJ1XjpFXkJdZj5VY +kZRbiphUiJdZiZVXj5hRjZdUkZZZjJZRkpNakJtbiJRQjpRZjJJPipJYipRRhZdYjpVVjJZa +j5RPjZdZjJlOi5hYkJhViphPjJVXjpdbkpVaj5hVkpNZiZNPho5YiY5RjpRZiJdRiJNXh41O +iZRQh5RVipJZjZlTiphTjIxOgpFRjJFTiZlWio9Si5RQiZNTjJlTiZdVjJNUi5ZOjpZbkZlQ +jJtZjJpXk59ekaFYlptWk59al59bkaNXj55Xi55ZlJtZkZ5TiolWjppXkZ9bkqBelJ9ejqNU +k5VelKVYk55alJ5YjZ5VjJ9OjZpUiplQjJVTg51OiJZYhZVPiJZMepBDc31KcoFFd4JKdYpE +ZoFGVHM6QEQ7PTs3PDw4PTw8QkI9RDg+P0A+QTxEQz5MRUJKRj1GRUVHRT1YZk7z/8T///// +///////////////////////9//r9//39//v8//f8//D9//////7///z7//X9//v////5//fv ++ej0/u3y//Dc9N/b/dPk+eHh793d5d/u/OX+//7t8+Xr8eHo9uD+//719eXt/O35//Ly++vs ++ej2/vX9//r///r///v6//D+//X5//H5+/Hx++zt/fDs9ejt9ez8/vLy9+jt5NlWTl1EPzs8 +QzxPQDZbSDteRzpSRjw/PDM/ODg6PzRDRjpXRDxdQzdGQDVBOTo1OjU7Njk2PTQ1Nzc4QDQ0 +OjQ2PDk1ODI0NjgzMzQ2NTc1NjMwNzA6ODQ1Ozo2OjE1ODU8OzM1PDU2PDAuNzI2PTQrNDI2 +OjksPDE6OTYvNzI4NjU2NzQxODcuPTU7OjU4QDQ3PDU2OTE9Nzo4PTQ4ODQ/PDg6Ojc6OzQv +OjcyOTU3NzkzOjM6OjUzPC04ODUwPTE4ODQxOTc7OTg1PDE5NzguOC89PDkzNjA3OjgzNjUz +NTQzOzU6PDk3PTk1OTQyNjYyOjU5QDY0PjgxOjM1PDQ2ODQ5Nzk3PTM2NzgwPDU3ODkzPjM5 +QDc0PTFCQDw1Qzc+OzowPDZBPTo1OjU9PzUxPTU3PTo4PTg5QjY8Pjw9PjpCQjdNRT1iVEJq +Wk5kU0FlUUJnVj5jTz9xY0OVcFKOdk6gb2SkflSre1+xgVu6kGnBlWnJm3bOnW/Rqnncrn3a +roDbuIbjxJLhwY7gu5LftIHitoDfsHzZuoXdsILQk3WrY1eEVkd9WkRsTkVgSz1rTkV5X0Kt +g1vJqHHatIPdt4TaqH3atoHduIHivIjqyI3rxqTguITQonixhWOYd1SfgFmqgFyvkWW+mWq9 +om3BoHC+mXGohWV+alpWTUNFRkY/QztCSEY/QjtCRUdDQjg/RkE6Pzw4Qj07QD09RT9GWlBC +YlJDWGM8Y1pHbWxJcmhLe4NKbXNJcXJGcmVQeX1Me3xRgItGaG1GdXxBY1pFa3pMbGFFcWVS +e3RKbHJLc21Lc3lJc2NUioxQh4tUiJJQj5Nbj5dTiopajpVVjJhXkZlVjZNXjpVTkplXhZhS +jpNXl5NWjJRXiJlWi5dZkZ5RjZlSiZJRipFVi5RZipNTiZZSiZNTjJJOlJFZiZhLjY5ejZJW +kpNejqBWi5Vdi5VRkJNaj5ddi5VhjpZUkZhai5VUh5JWj5VblJdQlpZakZhWjJZUjZdSi5RW +jZhViJRWlJRekJVZkJNjiptRko9bkppVi5ZVipRRj5FdjZhXj5VZj55RjZRajZxTi5BVkpdU +j5JVi5NbkpVXi5NXjpZbj5RZjZFVjZRTi5NVi49QkJZWjpVTj5JUiZJNjZNdi5NVjJlVg5FL +ipFWiZFVhZRajJBQio5XjJNRi5FbiY5WjJVWjZRUjZRYjplUiJtTj5VdipdXjpdZjphXjpdf +lpxXlJpblJtdlZ9XkZtXj6BUlJxfnKZfk5phlKZelaJZkZFdlaVbk6NYj5lUkplZjZtTlJZk +maRXmKNhmadfmZxajKJWj5xYh5pTjJNXkZxVi5pbjpVbh51Tfo9IeIxGeoBMeYBLdYJLdYRG +a3tEUWI4RUY7QDs4PT45PDxAP0A9RjtQTEFbW0FgXUdmYkVoW0ZfVUJwalD3/7z+//T///// +//v///////////////////////3///z///////P///n6//T6//X+//r///n///zw9O/y++n8 +//rt+O3p9Obk9Njp6eTc7NLg7dr8/+zm9uLz/e////7///f6/+/9//z9//T7+/f9//z///n0 +/fH9//f3//D///v+//f0//H99+z8/fb///f///j///719Oj3/u77//Dv8OZjT1w/PTpFRjhK +QD1fSjlUQjdWRDg9OTNLPDo2PjdGQ0BSQD1aQzhEQDdBOjU2NjQzOzE0OjQ1PjA0NTI3OTE4 +OTgyPS45OzYrNjU4OjY1NTQ8OTQ0PS47OTI6PTM1NjQ4OzU5NzM1OzM5OjY3ODA5NzU2PDk1 +OTY1NjQ3OjAwOTE3OjM0OjQ6ODc1PC0+OjY6Oi08OTg3PDQ5Ojc8OTI8OzU6PTk4OzYzPDQ4 +ODM1Nzg3OjYwPDI2NzY4ODI2OTU7OjMzODQ4PDU4OzI0Pi01OjE3PjA8NzYzOzQ7OTcyPC43 +OzUzOjA6OTMyOTE8ODc0PjE5PTUzOS06OjM1OzM4PDI4OTU7PTg5PDQ5OjY2OjY8Pzc+PDU3 +PDA7QDlBPjw4ODA9PTk6Ozc3ODQ1OS49Pjk4QDhCPz5CQT1DPD8+OjpNQT9PTTxkTEBfT0Zq +UkNsUUJ2XEZ3VkZ4WkWOb1GMaUuVc1OkfF+wgV63gmS8i2DGl2zNlW/PmHXQoXDUp3rYsX/c +sI7ivIvnwJDqxZLqvpDpwJHjtIXfsX/ar33VqXrMpXDPm3fKjm67fVyvcFOwdlC0dVDDjmPV +qXHgtYHlu4jdu4fcs3zXqXzgtYbhvIXswZTesITToHOqdmSIbUuSdlaef2CpfWSkhFiqi2Os +lGOijGiJdF5dSURHREBDQjw9Pz49RjlAQzg8QDZBRDk8PTc4QT44PjU7Pz45QTQ/UElEVFZA +Z2pAZVtHa2dLb29JenhRdHhIdnpJbGtLe3NMcn9Kf39FZXJEamBDY2RMbm5LZGJLbmZPd3JM +cmxDb2tMen5GdWVYiItPf4pUjI9QhpRcjIxRjpZZkJhXkZNYi5JTiZNSiY1Th49Qi5NXjpdR +iZBXiJVOiotal5NXkZNWiZNWk45aiplVkJNWkZ9TjItZiJVdj5ZcipFXiIxZjIpYjpFdjJNY +ko5ekJZXjJdbkJVWj5VhjJNZj5Vbj5VZkpZYkJpXi45Vi5RZi5Jfj5lXlJVckJdVkZZhi5lN +ipNfjZVcj5lRi5Vbj5dakpVbi5VZjpJaj5dbi5NXjZNXkZdajZFaj5NSj5lgjphVkJNdhphS +jZRgkJdWl5dei5tWiJBTi5ZXjY9ZjZhPjZNXkpRai5NRjY9aiJJUhYxYiZBVhZBVhIxYjpNX +jI5aipRUjJRYipJWio9XjpZQi5FcjphZjZhdjJhQjpVckZlTj5ddkJdVkZlckZtekJxekplc +jptalJtblp9alZ1clqBdlaNilJ1dlZxelKBYkKFYj4pbl6FglJ1WkaBbkZpbkqFblZdclqNl +mZ5flKVdlaBZjpxai5pVjZdajZtWkJpXiZpRjJlXi5lUjJhQfpBEd31QeIRPf4RPdohFb4RH +ZXo9QVU+Pz49PT06QTk/Qzk/QjpJSz9VUT9cWEJcWUZnY0RlZUqIg03u9rz+//j///7///n/ +//////7///j////////////////7//v+//H///v///v////9//n///P8/+36//P////z/Ozv +++Tt/+bk/9bp++Xt8uba5NX0//T0/fD8/vr0//D///Lw9ej9//Xr9ePs/fLx/ej9//T7/+7z ++/D0/e7+//X8/+z9//r////////9//P8/vH6//b3+fP7+ezt7+Dr7+VmUF47PjVEQTpEQztV +RD5RQDxMQzw8PTs8Ozo5PzM9QTdFPjJPOjxAOTI/OjouOS84MjgtODI7ODc1OzE0ODIuPTQ2 +OjcwPDQxOjQwOTI2OTI2OjQ8ODU9OjU8Nz0vOjM9OTk1ODExNjMxOC06NzYuOC46NjgvODI3 +ODUuNzEyNzczNTE5NzgwODI5Njc4OjczPCw3OzQ4PjE6PDQ6PDMzOzI7OTc0NzQ4ODY5NTcx +Ojc3OjQ3ODY1Oiw3OzQqOTE6ODQuOTE8OTQvNis4OTYzODMzOjI2ODIwPTUuNzEuNjU1NTQz +OTAwOTQ2NTI3OjkyOzQ3NDMvNzQ1Oi4wODY3ODQ1PDY0Nyo7Njo4NzE3OTg4PS46OTo5PjA3 +OTo7OjY3Pzk6NTY3PDc5OzMyQDA5OzQ1Ojc5PzM+TD07ODc3PTdBPjhaST5mTD5iT0VlVj9i +U0ReTkBxXEV4V0iIakuKbE6Tc1Cge1iqflqyg166jGbCkXDIm2/Mm3LHmmrYonnWqn7dto3c +t4rlwI/mw5XowZPhuorhr4Ddq3vdqnTVpXbUonDLj2u/jWO+hWPJimHSm3neqYHnvI3rwpXl +wJrluYncsoLSpHvOpnTYqXPetn3lwIzes3/Sm3WtfmN9bFdYUUVvc0+glV+vhWqdfmKAZVVo +ZEdiW0dKRz5CRz5NQ0RCSERARjs8Qjg4PjtBREI6Qj07PT03Ozc2QzsxQTpAUEs8WlBDYWA4 +T1JDYV1AZWVOd4dMdG9ReoZEaGFJc29Ga3dHeYdFZnJIal1EdnBJcW1Lb25OaWdHeHRFbWtE +bGVLaXFBdmxXiJFPh4pakphTjI1cipRTkJVXkJtPipdbjplLiZBXipBQiZBSkJZTiJJUkZVY +ipdUj5NakZZSk5RXjpZSj5dVippYjplRk5pYjZlZkppalJtaj49ZipJUiZBViJtSkI9cjJpR +ipJRkpFZjZJbl5lbhppZk5xaiZhckZJYjpJWkpRZj5ZSkI9akZZUjpdZjJVWk5pXjJZWj5dQ +i5Jij5ZSjpVejJNUjI5bj5tVjplekZhNjJJcjpRei5ZYjJJSjZVSjZlTi5JUjpRRiZRUlJlW +jJtWjZJXiZRakZNfkp9XkJdYjJhUj5NSiZFSipFUh5FVhpZVhZRRjZJYipRWiZVSi49NiJBV +ipRSiJtVi5FVjJFek5RVjJNZkJpVj5ZZjZhUkJRajp1YjZlclJpUj5lak55Wk5tbjJxXj5pd +k5xhlaFfmqdbk6VdlKVkn6BknKdck6VWkp1Ti4ZWkZxbkp5WiZxSkJhak6FTl5ljnKBYl6Vh +l6hYkp5XjZ9Qh5tbj5ZWkZxakZpXk5xXkKFWiJpUjJhNf5RIcoZIdYJHeIdOgY1KfIpJe4hH +Zn86RE8/QTg5QDk/RT0/ST1DQUJASD1MSkVCUT5lYEdjYkOViVP2/8P+//b8//L+//f///// +//3///X///3///79//n5//D4/+z///z///3////v/O/2/uv////6//H6/+/v/Orq9eHs9uPe +6+DZ8crt9+nm79zh8OH5//T5/+36/+7x/ev29/L3/u77//D2/vH9//z///////Xu+ev8//3/ +//f19/D5/PX1/fX8//P7//X6//D2//P5//T99/H9/vf///71++lrT1s+QD9DQD5IPz9LQTtW +OjtFPzc7Ojc8OTg9OzlDPTVJPTZEPzU2OjM7Ozc0OjI6MzYwOTQ9OTkwPDE1OTgvOis2Ozow +PS46OjYzODI2Njc6ODg7OjVBOTYxPDIzNzA4OjU4ODc3PTI1NDg3NzA0OTM4OTQ0OjM6Njcx +ODI7OTcsOTA8ODguODFAOjQwOjU+NzYsOTU/ODk5OTc4PDQ1PTM5OzY2OjY2PzM/Ozc8PTY/ +Ozs4Ozc5NTc1NTU0NzU0ODIwODIzOzgzNjU4ODk0NTE6NTkyNjM1Ojs3ODEvODc5NjU7Ojk1 +Njc3ODU5ODgzOy45OjcxOjQ3OjkwNjE5OjgzODQ6Ozg5OTQ4Ojc2PDE1OjQ4Pjk4NzY7PDk1 +PDU8NTY4PDQ2OzU4Ojc4Qjc1OTc4QjU6OTk4PTk+QTo7Pzs/PDxLSThrWkhtUERyT0JhTT5c +TEFlVUOBak2KbE+Lak6ObkugclOtgFy6iGG1hWnAk2vGlW3Nn23PpH3VpXrbsYXduI7kvJDm +ypXqxpvpwZ3ktormrI3crHbhs33YqXXapHTWom/Zo3LWpnPhtojpyJLrypXqxZXtwZDpv5Tc +sYbYnnDPo3PZp3bapnrbr3rer37dr33Rm2+we1+KYE1kRz9KQ0BNTj1ra0x8d1N1Yk91XEdZ +R0g8QDVCQT9DQjw+Qz88Q0I4PDg5PDg5QTg8Pzg3Oj44PDo5PzY4PT04UUY6VFRAVFc7UVU/ +UlQ9X1pLa3Y+a2BTfIZGc3FJb3JFdHNSdns+aGZMZW5HdIBGbGNMZ2tCbmlGcXY/bmJOcnpI +aW5BcW9Wio5ZiplTjphXi5lWj51Xj55ZipdQjZVZipRWjJNaj59WjZdUh5JPfo5QiZFUhpFT +jplYjYtTlJxcjppYkplnmJ1XkJRZiaBSk5hYj5lWkYxaj5dWjIZZjJBWh5BWlZdekJVVjZxd +iJNTkJddjpZTiphfjpRWiZ1ej5xTlJdZjJlVjZhVlZFZjJdSiJFbkZZYi5BdjJdRjpJdipxX +kpRbjplUjY9ckJhXipVai5NVi5hYj5ZWjpRai5JWi5FVi5NSjJRVk5lYjJpYjJRZjJtXipdY +kpNfj5VRjZNYipNWkZhejpZTjJJajZpTiZFTjJJRh4xYjZlXjpJch5dRiJVVjJVRh5FWjJBQ +ipVZiZtYh5ROjJZYi5VTjJdQhZdWi5RMiJFXjZlVkJ5cjZtZkJdakJtYjZhejpxQkZhfkptc +laVlnKlXkJ9fkaNbmp1claFamJ5dkKJTio1Yjp1YkZ9Wi51ckptbl59VjZpgmaVclaRakaNY +jqBYjp5RiJhWkaBUippWi5xSipdilZ5Xk6Jbip1EgJFPc4dCdn5QeYdNfo1JgItKfo9Ld4pI +Vm88Pzc7Qzs+RDw9RDs6RT0/Qj0+RURDRD5dVENlZUKLhVb6/8L///3///v////9//j6//b/ +//////////z////////+///+//L///b///z////////9//z6//T////9/v3///z3+/ji9N/m +/Nnx9u3l9drl8t3s/fP9+ers9+Xw/urz//H9//73//X7/+3x/+z0//Lw//H6//L1/+/z9+3z +//L8/fPt++b4/fL9/PH8//f4//X7//n7//D8//Xt8N3q7tlhTF09RDg9Pj5EQjZLPDxMQDVE +PzU9PzYxPzk6PDU1PzdCQDc3PDQ+PDcxPDc1OjUqOTQ7OTQ3NTc7NzYtOjI1PDEzOTc5OjUz +OTUzNTI4OTI1PTA5ODU2Oi83ODktOTI5NjkzODUzOzA3PTEwOjUvNTc1NDM0ODczOy41OTYz +ODQyNzYvOzQ0Njc2ODAsPTI7NjU0OjU7OzQ0OTIzPDY1OjE9PDY1QDU8Qj86QjlCPEE8Qjg6 +OzY0OzA1OS81NjM2ODYyOTMzOjIsNzA1OjM4OTMuNjU3OzEvNzUtPDQxNDMyPjIzNTUvOTU3 +NjQ1Oiw0NjYsPTU4OjMvOzg0OTguODU3OTYyOjE6OzUvOzQyODM4PDY6QDgzPTs6NTc5QTw5 +PjY3PjkzPDY8RTg8OzYyPDA5QDo0PTY+Ozs6QTU+PTo2PTJFQTpRTTlcR0VfVT9pUUBnUkNs +TkZ4Zk2UcVOLaE+ObE6geFOoeVe1jly8kWrIk27KnnfPpXfQpnnVpnrXrH/dtIngv5Xkw5Hu +xqfowprsxaLmuozhq4XdrHrbqoLZpXHbqn/fsHjlsoLer4Dgu3/lt4LqypTrvZTdsYDZp3zU +oW/UpHPZqH3ZqHzar3nZqXfdrn/Plm68g2agc1R/WUpuUkNhSEFIRz5MSkNWV0KUd1RdQ0U6 +PDU7Pjg2Ojk3Ozk6RDk6PDw1Pjc/RTk6Pzc6OzkyPDcyPTg2QT03RkY/U1Q9UFA9VFY+VU1C +YWA/bG1FZ29HbWtFcHVLc4BDb3VJcXU/a3NJal5BaWVHbGlLcm9KcGtJdG1JaGpJcGhKY25J +f3xXipNekpdalJxckJZRiZZWjZRZjJhbkZ1SiZpXjJRPh5JbmY9YiplZiZdWkIxZlppTipJP +jZRVio9Tio5aiY9MipFYkpNSi5NaiZhRio9VkZdYkZBWkJVZjpVXkpdajpdXjZhajY9YjJ1Z +lphZi45YkplflJlXkJhakZ9XjphWjo9Zk5lfjZZRkZdTkZhTjpRSiZhYkZhUjpdNkI9alJlP +jpZek5lYlpRgk5pWkJpZkJpajZRZjZdWjZZZjJNVkplai5FVjJZhlppZjpNWi5dVjpVaipNR +jo1ZkpZTkJVajZxVkpRci5lYjphWjZRSh4pYi5lRjZBVjJVXjZhVipVVipNSkJZUh5RSkJVT +h5FSjJFTjJBakJZXjZpak5VUjZhYi5xVj5dZjZ5QippejZpUj5tZi5tSj5hekJpVlp5ll6Va +l51clJ5alJdYlZpXkpdYlJtdmKFIh4pVkZ9Yk6FXjZ5TkJRclJ9SjpVflp9el6Fbk6BdmaNV +iptTjJZSjZVbmKRclZlZkqJclKFbl6Raj55PhppNeItEeoBOgIlOh4xNhZNJf4xHbYdBYnQ/ +QFE5Pj42RTg5Qzs8PTk6QUE4QT1BR0JcV0BhXEd/gE3y/7f9//////z///z////////////9 +//39//////////////r///X///////n///D0//D6//L3//T2/+3r/+fo9+Ln9uby/+zp/+fs +9Ojl6N/h6tv5+fDy/vH+//rx/+75//Lt9eHw/vD8//bx9/Hs8+r6//f5/ffx/ez+//r0/+74 +/+/6/ezy++j4/PH4/+/7//zr+eP49fH8//b//fnt6uVvV2Y3RjM8QT9EQTtDREBJQDdEQzc8 +Qjg7PzU4Njg5PTY+Ojo6Pzg2Ojc0PDIxNjcvOjAwPDQ5PDQsOi8yPDcoPjI7OjIqOjI2OTQr +ODQ3OC8zOjI5Ozk3Ojk7OzYwOjg2PTU1OjIvPDE5OjUyOjE0OzUyOzE3NzUrOTQ0ODMsNzE1 +PDA1OzIzNi0yOzQ1ODM0PDUyOjI3Ozc6OTI4Pjs+QTg8SD9HST9DSj9ER0E9QDY5OTYxOjI0 +PDU1OTQ4Nzk0OjI3ODY1OS81PDIyNTI3ODUzPDIwNzQyPTUyOTA0ODU5ODM0OjQ1NzY4OTQv +ODM0OzIxOTQxNjI3Njk1PDU6ODkwPC04PDYyPTA0OjYzOTM7OjYwPDM1PTYwNzRERTs6QTw9 +PDo7RTpARTtAQD42OTc5Pj05PjQ/Qzo8QzU4OTc1OzU3PDNQTD1XSz5lVUNwUkV5VEhpUUCH +Y02Gb0uMbFCMa0ufcVamgFWyh2C1jmXHlXPEmnDKoHHSpXTXqX3Xr37fuI7mv5fnyJnwzazv +yKPtyZ7nu5vltYrquonltoXmr4LksILnsYXkroLir4zfsXrkt5LjuX/iuJLcqXnXnnXXn3TU +qHrWpHvWpHTWnHPZpXXaonHWn3S/hWSsflmlbleWY1F7WER2TUNeSDplVT6Nf1ZqTkk5Pzg/ +PDw0QDU6RDszQDhAPT42QDQ4QDg8QD01QTg1QDU0QTQ2RT84TEdBU0o8XlA9WFk8Z2NBXmhD +aWlHcnhCX2BAdWxMdoBAbWJDZWQ/ZlxFdXFBZ11DcW9Ha2xEaGZMeHhGbm5NaGw7bWxPfYRU +kY5ck5xSi5JZkZpbkplWi49UkY5ViJNUi5NSiZVXkZRRi5JZjZZRh5NUiYNTkZNXj5JSjJFT +jZJTkJdXjpFRipVTi5FXjJFWlJVajZhVi5JakZxTkpVZjpZRi5Rhj5lZj5ZclJpbiJRYkJhT +j5Jajpxfj5pakplZjplZjJJTjZBhkZpYkpNZj5JUjZdYkZZTlJNYi5NVipZUiJNRiZZckZhS +j5halZVSjZNajpJTjpFVi5hSjI5VjJpQipRWipFQj5NblZZWkZdakphYjpZRjJNXjJVZkJJX +k5VelJtYkJpaj5hSiZZai5dQh5BZjZNVkZZbj5xUkJFakJRNjo9ciZRWkZZWjZxZkptViZhW +i5ZViZhUjJtRj5dWj5lQj5lVjphXkphajZhWk51ZkJZcl5lgk5xckpValZhclJ9WkpdfkJ5T +kp5hk6Jckpxdkptal5himaBPh4tbjp5Wi5tYj5RPipNUlJpXjplalp9clqNYkJ9jlKFPkZtY +j5VXkp1ekZ5YlaJakqFbk6BamptcmaVSjZpLfpFMfYNHe4tRi49RgZZMe4JPfpNHaYM+TWM7 +SUE7QD0+Oz83PzlAQj5CRztIS0RZWkNnY0d8fUz3/776//34/+7///////z+//r+//3///// +//////f///z////9//b8//H0//P5/+r7/fL4++7+//f3//f2/e32/+/7///l8uXV6Mvd79vk ++N7t/+X////p8+Ps+ejx/+z4//n8//by9+f4/vHt/+/+//z///Xy+/b5/fX9//L7//3///// +///////////99/Dl7uDz+uvt9e70/u71/+vs9d52VWw8QDo/QDtHQDtFQD5HPDlAPzM4PDY4 +QDY2Pjc6PjU5ODk3PDQvODw9OTQzNzM6NTktPTQ+OzkyPDtCNzksOTY6PjcpPTU7OTozNjs8 +OzQ2Ozg2PDQ+OTU0ODU1NDQ6Pjc0NzQ0PDY7OTcyODY1OjQ1Oy43NzIuOzYyOTI1OzgzODAx +OzQzOTAxPjUyOS44PDkzNjI2OTw5OjY8PzxCSEBHRUFERUA/Rj5DRD8uOTI0NjU0PjQ0Ozcy +OzU0PDU4Ojk1NzgyOjM4OjIxOzI1OzMxOzUyNTU4OzgyOTU2OTEzODUyOTIzOjUxOjM0Ojgy +OjI3PDgwODM5NzU0PDQ3OTkvPjM2NzU0OzY2PDcwPTdDQTYwOzg1OzU1PDVBRDxCSD5APD07 +Qj8+RD86QD03OjI6OTk7Pjk3QDg8Ozg2Ojc3Ojk1PzhFQD1QTDxuUUhhTEBnTUh0WUOHak6C +Z0iRa1aTck+oel2ohFm5imq5jWrHl27KmnTKoXLPpXfSpHPWqnzhvojlw5Xozpjz3rn43MPz +0LHtw6flv5fquZTnuYnquIzou4LltIvkt4Hhto7ksn3lupHqvJHlsIjdrH3dqnXdo3zUpXLa +pHzWoHnbqHTXqX7Wn3PVnm/LjmrCi2a1fF2rhFuoglmofV+kcFWrdFatimN/V1MxPzRAPT03 +PTg8PTs2Pjg7Ojs5OzkzPjg1PDg0OjU1Pjg3Qzk8QUE4Tko8U047WEo/XGI/XV4+ZGZCam9E +aWVAXV5AdmxMdHpAX1g+XWdCaWRGaGxDcmZAamhBXl1BbmZQfX1EcHpLZm9EcW5NhoxWkZle +jptTjpROhJdUjZNdj55ZkIhWiplYjJhTiphci5NSjJRWipNPipRZjJNVipZVjI1Sk5RWkphY +kphWj5ZbkJlVk5VZkpdTlZpdkpxOkJdYkZdOiZBYk6BZlpJai5ZSk5ZVjZdal5VakJhQj41a +j5lXjZZZjpdXi5JWjJdSj5hWj5RUjJZajJhVjpJaj5ZVipZYkpRRipNXj5lckphVjZtRkZVX +jJRUkJRXj5hVipdZkZZOkJVYjJpQkpdUjpVXk5lZj5tYkJtTjppUj55Vi5hVlJVakZlXkpZc +kJlXjphVkZZXk5hajJlXj5VajJ1Qio5Uio9VjJBaho5Th4xWhppTi5RbjJhXjZZYjphXkJRa +lZVYkZpWipRXkJpYi5lbjZtek5pUkJlalptZlqFal51ZlZ5akZ1blZ1glZ9Qkphdk51Sk6Fg +k6FVk5xbj59YkZ5al6FSi4tbkp1VjJ1Ti5lWjZZalZ9Uj5tal5lalKJYlKZYkaBUi59XjppV +jpxckZpblaJekqVaj6BckptalqNalJpHgZhIdoVGfI1MhIpJe41KeX1SiZRLeZVFYHU6REc7 +QDg7Q0Q2Qzk/PT87Rj9BSD9VU0daWkd0ek7q+a/7/+////z////////////////////6//P/ +///////////9/vb2//P+//z////////7//X2//Xl8+Pw++v2//Ty/O3m+ub1/+Tx9fXn9t/h +8Nvu//H4//Lp8ebo6OLk8OD19/f9//j09ejv/un0/+/5//H7/+/5//D2/+37//T9//3x/+7t +8+Hq/e7///3/////////+/n2/O7++fvs7OBuU2U6RT46QDpDPT4/PzpJQT88QTk7PjM2OzQ5 +OzozOTZCPDsrOzE2OzgzNzE1OzorOi45PDcvOy82NjUuOS44NjowOTQzOzY0OTE2OjU5Njk3 +PzM4OjU0PjQzPDcvOjIxPDQ1PDQ2ODI2OTIxOi82OzUwNjU1OzYmOTI7OTkuODI1OzQqNzA4 +OTQyOjQwOTM0OTQ1NDMwOzs0ODhBQT4/RT5DQ0E+Rjs9PzsxOzU4OjcsOjQ3OTI0NzYuOjI3 +OjgzODExNDgzOzAyODovOTIxPTUxOyw2Pjo1NTUuOy8vOjMwOTI3ODQyOjM2OTIrOzM0OTMu +ODE0NzIwPzI2OzIzPDQwNzQ5QjUvPDUyOjU0PjI/Qzc2Nzc3OzM6QDk7RDhCQkJBRENCQj9G +RD49Pzs2PTQ6OjcxPjQ6QTswPjI9OTcyODY2Nzg2PDhIQTpRTj5hTEBqUUR2YEWBZ0uMbkmS +a1qVdlaofmCshFuziGS7imnDmm7HnnjOpXfOrXjVon3WqXvbtoXiwpbmzJ336Ln++dP/8tj6 +4MT0zrLvxp3vxZnnxpHqvZbnuYbouIvjvoPnu4niv4jnxZblvYvntovdr4PesYHcrH7drHzX +q3jbqXzSo3PUoXLSoG7KlHLAmWTKkm7Ah2G+hGO+ll7KnXbHn2/BkG6HXVM9OTk4Pzk7PjU0 +PTo4PjoxPTYyPTQwPTE0PTcuOzcvOzMzQjU6Qj8wRTs4T0c3S0Y9WFU2ZVtGbGY8bGRBVV02 +aWpDY2I9YV5BWVxAWFdDamNCbXNHdXVCa2dFbmVHdnVSfX9FaGhEcGxGcXFWkZdclZ1ak5lU +jpZWiplTipNTi51NjIxXipZSi5JWjp1UjZNSiZ9Lj5JYjZBTj5hPj5RWjplRjZRMi5dWkI1X +kJlTlI1WjpdZjpRPi5NTjJRWlJ5ZkZRPkZZUiJNNjpdkjZRYjJRhi5pTjJtYkJpWkJlXiphU +k5hYi5JMg5JRio1SipZRj41UjJZTiphXkJdWjJlSiZhTkJBVkJlMiJdRjY5Rj5VVj5NTkZFW +kJVUi5dckJ5Qi41YlJhVkJdYk5RVkp5aj5RYjJRbkZlTkJdVj5RWkJFUjJZNj5NYj5VLj5hX +jpVSkZRWj5ZQj5RXjZFPjpNWjpdUlZdYjJpVkJJYjphViZBTkJdVkppZjppRj5dVipZVj5ZQ +kZhTjZhVj5VOjpRVjZhOj5ZZk5hXlplakJxVlJ1bkZtQlphflp5amJxflaRZkZtXkaFZlqJc +lqFXi5tXk5lbmZxSj4pak6NRjKNSiZlWj6BakaJXjptclpxhl6ZZl6JclqZPjptYkZtWlp9b +l59amZ9fmKpXmKNdl6JWlaJckqFajJxFfo9Geo1HeotFbX9Ff39UipROhJdDYYI3RFU7QD49 +RUI5STxDREQ8Qz46R0BBTThKUUdfaUf4/Ln///z///////z///////////37//f///////// +//v////8//T9//z////2//Hz+u79//r5//T4//T////0+O/s+N/w//Pl/OHm9N/r9+Xg79zz +/+n4//37/+n+//z5//H1//X///j///7////////v/+fx/+/x/ur09+7s/e78//r///3/+/3r +/vD4/vT0/+30//f7+Pb///75/+307uRpUmFAP0M7QTpEQD5APztDQTlCOzo2OjU3OjY1PTI1 +PDc1OjcrOTY2OzcyNzU6PTg0ODUyOTcwOzEwMzUxPDM2Njo1NS0+NzswODM9PTo2OTI7ODkz +PjQ5Ojg0ODM1PTUyPTQyNzMzMzY6NzUyOTEvOi8yOTgzNzk0OTQ0ODgyOTQzNzY2NjM3OTkz +ODI4PDUrOjE3NjYwPDI+PTo3QzlGRT8/REM+Pj02OjY1OzA0OzMxPTIzOzU0OS8xNjQ2OTQ0 +OzYwOjIzMzM0OTg0PDI0Ojc1NzI1ODkxNzA3OzoxOTAzOzo2ODI3ODs2ODMyOToxPTIuNzcy +PTczPDUzOjYyOzM3OTc2PTY2OTg1NzU5Pjo+QD85OTg1Pjc7PzQ/Pj87PzpGQUVFQUNNSkRE +PkE7PDgzPTc8Ozg2QTk1NzUzNzszPDc5NTg9PjJIQT1OTEBeTUFkUj+CYlCFaU6RbVGCa02Z +dFWjg1e1iF+6j2vBlGjDmm7IoHPLpXXQoXPYpHzapH3broblwZbsyKH14LP39cj99dD87cz3 +2bnvy5vrx5rowI7kuYjkt43ds4neuX7jtonguIDgtoThvobov47etoPbsH7Xp3rVnXfXonfX +pXneqYDYn33Rk3HMlHC9kGjHlWnKnHHHkm3Ik2fKnXDEnWzDmXaPXlQ/PEA3QDE7OTszOzE4 +Qj8yPjQ6Oj8yOjAxOT01OTozPCw2PDQ4RDs4R0Q6RkM4S0I9VU0/Z2BHYmVAWFk8XFY/ZmJA +W107ZWBCUFA6ZmFLZm1EbnVLams8bWdIbWc/bl5JcHE8aWdBb2RFdXBRkZZZjZhUjpVVjZpV +jJlVipBTipNQjJRWjJhTjJdYi5RRjZNUi5NYi5NajZxTlJNaiZlWkJdVi5NPj5VYkKZZjplX +jJxVi5lSjpFSlp5Wj5hciZdRjZFYippUh5ZSkJddjZZRjZ1Ui5tRjptgjJZUjZNZjJJYlJNo +jplNj5hckJRTj5NajJpRjZ1ZkpNVj5ZXi5VVj5Faj5BVipdRiZNWiJVSj5ZaiZVSkJVajZdR +jJNSjpBSioxWjZhYj5ZYkJtWkZhajJdTlZlbkZNVk5dZjZhck5pXj5RQi5tYkJpYkZZWkJZQ +jpdakplXjJhWjZJWlZpajJ5Pj5lZjJxPjI9UipVQkJdejp5RipNVjZZVjZtai6BWjplajZlU +jZJXjphSiJlQiZlQjJVWiphRj5pZjJtZk51TjJtUkJxdkJtZkp1fkaRXkZ9cl6BUkaJflaNY +kJxikJ1Wkp9SjY9Wk55UjJxSi5lUi55cmJ9RjZpclJ5blJ9bkqBZkaJTipdWjphakptZkqJb +lppik6Vcl6JhmaVWlJxaj51WiptQe5RFd4NOdYI+cXtPgIdSipRXh5VFcotAUG0/R0RUWUlk +aFxfYlxLT089RUVBRT09SEJQWkb0/7H///v///////n///n///3///////v3//b9//P////5 +//X5/+n///////n2//v///////f3/fH6/+/4//b8//L2/ffj9eTd9NTr9+bl7uLX3tL3+vT1 +//H5//Ty/+T3//T2/e3w+O75//T1//P17+Xt+PP9//77//z///f+//7///X4//T///7///// +//3//fLx/u7t9+/w/+33/e/0/vN5VW86QjlCPD8+OzpCQDo9PjY/PDo9OzU1Njg4PzY9Ojs7 +OTU7ODU3OjM6NzUzPTswOzM4PDc4OzMuPDU8PDg1OjU7NzYvPDU7ODYwOjY9PDk3PjA5Ozky +PDI4OzgxOjE/OzsxOzE4Nzg4OTQ4OzUzOjA3OTY4OzYxOTQ1OjM4ODY1Nzk7PjgzNzE3OjU2 +OTM6ODYwOTI7Pjc5RTRDQj44Pzs/Pz41OzM3OjgtOiw2NzMsOS4zNzMxODE4NzY1OzI4OjQ2 +NzkzOjQ0OjQ3PTQwODQ4OTkxOzA2OjQ0PDIuOTMxOjQ1OzosPDI6NjkwPTI8OzoxPTM/OjUs +PDU7NzoyPjc3PjcuPjU2Pjc5OTo0PDY8QTY0PTU7ODo8QDlHRkFAQzlORkM7QUBCPzo3PDw4 +OzE8Oz04Qzc+QD80QTQ9PT41QDY3PEA1PDNDQkBRQjlbTENhUkRpWUB0XEmEa0qSbE6Nb0ui +gVexlF+7kWm7mW3FmXXDonLLpXXOpXXWq3zbq4TYsYXhu4/kvo7tzaDs1anz3bHx3LLx0Knr +xJ3pwozlvIzhsX7fq3zWp3fYqXfVrHLcs4jcs37guonatoLXpH3Nl2nJkmnSnXXUoHDWnW/Y +nm/VonjUmXPLjnK+hmLHmnHNnW/QnnbOl23Fl2rInGrBl2uZalc9Pzk4PTw0PzE3PDszQjc3 +PTk1PDU1Ozo2PjIwOTk1OjQ2Ozw4QTU1S0U6Q0Q6TUZBSkpBWU9GV1k7WFVDYFc7VFVBXlVD +XmJDbWdOeIRIb3JJbnRGZWZFcnJCZ18/ZmY9ZWBJa2pDZV9OhYhSj5JZj5dPh4xWj5ZXkJNV +iZJTjJBXjJlQio9OipFVj5dUkZRRj5NXjpRXjI9VjZhRjIpakZRclJZcjJZPjo9ak5xJiYhW +iZdRkpRdkpdOipdbi5VOkJdVkZpZk5BZkJlelp1Qi5dakpdakpxcjZpYkZhal5tfjphYkphU +kppbiZxVjZtemJRcjplUk5daiZpSkJJRi5lOkpdajJdSjpNUiptXk5Zbj55flJdZkppaj5NW +jJdYkZFXkphVkJlajpRUjplalZRZjpZXkZpUjZ1alJdakZdfkJpXk5lilJtZl5lbkplZlZph +lJlSjJZWjZNWjJNWkZpXkZ1ajplUi5pPi5NXjJZakpZUh5VPiZNTipFTkJVWi5RYlJZdlJdc +kptYkZZXlZ1ZkphYkZtYlplYlZ5hlJlXkqBWkptZmqRglZ9Wkppek51WlJlgk51clKBclJ1Y +k5ldlKFSjo1UkKRUiqBQh5tRjZtclKFajp5gl55XkaBakaFclZ1XjphZkplak6BdlptZlZ9f +nJxdmaRWlqNck6ZalaBej55NgJNLdYZFdIVIcHxIg4hUhZFQipZSe5dGZn1SXmJmblhwdWRr +cWdwbWNhZVxRT08+RE1LW0Ht+qz+//n///////z///////v////////////////////+//79 +//L+//r///3////w//H8//b8//X////1//bt/OXv+OXq9One89Lp9+Tn8Nzd79fv/uri8N3s +9Ojq+un6/fL2//Py/+zw+OPq/vD+//z///31/+ry/+/6//b///77//Hz++fu/+z+//z9//X4 +++/9/vzu6enl8t7p8uTk5dZ4WG49QztBQD5EQTg+REA8QDc3QzM0PTY4Pzo8PDg1OjczOjc2 +PTA6ODk2OjcyOjc2ODYwODI8PTYtOzQ7PjktOjc7OzYsOzY9NzcwOTY+ODkyPDI9ODU1OTU4 +OzQyOzc7OTQ5OTkyPDM8PDg1Ozc6ODc0PTE0OTY2ODc2OzYxOzYzODM3OTw6OTI3NjUzOTAy +OTowOzI8QTk8QTQ+Qjw8QzY2Ozk3NTEuPDU0NjUzNjI1ODcsPDQ5OzgyNzc4OjgrOjI2Ojgx +PDM4OTQsOTEwOjUvODQ1OjkyODY1OTQvOjQ2OjgzOTY1OTY2OjQwOjY0OzUzODcyPTc9PDsy +PTU/Ojw4PDQ1NzYwOjE3PjgyPjY8PTgzOzU9Qzg/QThDPkFARj5LRUM6Qj85PTk9OTk5PTk3 +Oj09Qzw+PTw4Pjg8Pzs7Pzk0PDY+QTg+PzVLR0FPTD1jVUZqW0Z2VU55YkONblKHcVGkfmCs +iF3BlWy8lG3Hmm/Fn2/OoW3RpHTVqn7aroHZq4HjtYjcs4PlvIjlwZjswJnnwJXlvJDjuo7h +s37frofTnnXMknHMn2/VqH3Yo3vUoHrWo3PXpnrSpXHMlXjIkmvIlHHTnXHSmnDYonTYmXrU +mHfQj27Li2u9i2LElm/NnmrRpHTTqX7Om3bKm3TAjWGbZFQ+Pzg+Q0A1PDU+Oj80RDg6PjUx +Ozg9OTg1PjgzPTo0OzsyQDQ7QT05SEg3SEM7TUU+UEs7SEM/TU4+WU4+WFRAW05DXFU+Zm1L +fYJGa3VLbG5FampHanRBbGlDW1xAX2RDbntAY2RFcXhSj5NXipJSjJJWiJZSi45Uh5NSkY1X +jJlUio1WiZRPiYtOipFgkZZPipdZjZlUl5pekpdTj5ljkKNRj5ZZiZRakphilZpUipZRi5Ra +j5RSlJNTjZhSkZFTjaBLi5hakphWjpJWjpBRipdYj5hbj5tej5lYjJBWhZ5Ui5lbiptZkJVa +h5hVkpJWjJdWlZxcjpVWi5JZkJZPjpJelJlViZRWkZZTlJRdj5dVl5FZkptPkJFXkJhbk5da +k5xclZpcjppXjZRYjJRVjJlYj5VVkpdWjplajpROi5lVj5pVkJpcj5pajZhZjpdZk5hZjZJV +ipFVi5JVjptSjJZZjpdXjJpYh5lTjJxajZ9WkZZWipxSi5VZjZpUk5hZjptZkppTjplZkZpe +k5Zol5pcmZ5XjpxXlJtZk5xclKBalp1cnKRcnKVflaVamJ1gmKBdm59jl6JVlKFhmKJZmJ1f +mqRRjoxfmaJPi6FRiplOiZhZkptalqBTl5tcl6RXkaBaj5pUjZdakJxYlp9akaFZkp9dk6Bd +kqNXkJtYkqNglp5cjqBRfYtKdIVHdX5Ea39PhIRTjJRajphNhJhHb4lOaGxmbF9mb11tc11u +e2VubWNnaF1WUVNMVEz0/7X///////////////////f////+//71//T8//b9//f///f///n/ +//35//P9//X///////z3//T2/+70//Pv/uzy/+zl/+Tw/+Py/fXi7drg8ODx//H8/fr9//v/ +//H+//v9/+/7//P+//L8/+/7//r+//Dy++Tw++v///v5/+v9//z////0/u70/O76//r+//39 +//v///////D5+vLt9+KEWGk3QDY8Pzo7RTlCPjk+Ojk7OTY1PjY0Ojk2PTMyQDQyNzg2PjIt +OzM1ODguOjM6OjcyOC47ODUuOy00PTMpPS89PzguPTE7OzgvOi48PTo6OzE4Ozg1PjE4PjUz +OTMzPTI2OzUyOzUxPjUuPTM1OTc6OjM1PDQ4OjEzOTI1OTUxPTUzOzYrOi48NjMsOjE7PDYp +PDFCQjo4QTdBQTw1QDk3PTA2ODYxOzE0OzQ0OjA1ODMzOy0wNjAzPC85OTEyPTA7PTI+OzY6 +PTM0OjU5PDA1PjUyOzE0OTMxOyswOzE2OS44PDkzODAzPDQ0PTQwPTM2PDEzPDU7PDsvNzU3 +OjoyPDE6PTYvPTU1PDg7PTM4OzM1OzQzPjM/PjY+QjdKRj09RTo9RDs2QjQ1PjQ5PDc+Rz1B +Qz05QjY3PzY7PzY6PDRCQDpAQzg2PTVEQThVSj1lU0FpUEB3XEaBakiKaUiHb02ceUywg1+9 +lWS+m2zFm23GnHDOpHbPqn3SqHjTqXnXqnjXrn3dtIPhu4rhtoDiuYXhtIvfsH/csILSq3fS +onPMkWzaqoTaqIPMl3rIlmjbpH/WpnXXpHzXqHjZpHrPl2zPl3fQoXLWp3req3TgsIHepXzX +mHbSjnDGjm69kmPPoXHTpXTVqHvLonPOnHe9iWiabFZDRTdBQD07Pzc/SDw2QzA2PjsvPDM6 +Pj03PTM0OzQ1Pzg0QC82QTw5REE7RkI8R0A4TDo8Skc+Skg+VUw8TkU/Xlk9b2RPe3pNh4tL +c3pCa25GaWhBXlpAWlo8U1JFaWFJb3FKdHlRiZFOjIpQhI1RhY1QhpNOjJFWjZZXjJRalJpc +jplPhpNRi5lWjZFUh5RXkZRdkaBVi5dclJxTipdcjJ9WlpNakJpakItZk5lXiJBVjZVSho1T +jJlalpVWko1akZZRjYxWj5lhlZJZjqFZipNYi5dXkJBWl5tdk5pakZ5ijZdYlZhikZlOkp1g +lJdViptZkJhZkZxTkZhTkpRWkJNRjJJPjJFXj5ZWkZJajZdRiI5WkJVUjpNYj5dXjpdak5lZ +jJhTiphSjJFVkJNclZVYkJhWj5JZj5hWjpxVjphUkZdclJxelqBbkpxbkJpfkpxWjpBbjZpU +k5VRiZxWkZBXkJ5UlJpcj5pOjJRSjplTkJFZj5hSi5RYjJhYj5tXkJtZk5tYkZhbjJVWk5ZZ +jphZlJpalKBbk5dYk5palJxXkpxelp9dlp1elKRalZlckKFSkZxalKBYlZ5il5tZlp5ZkqJT +iIZZkJxRiJVXiZRSkJlbmp9akp1UkZZflKBWlqJblZlWipZVkplfmqJblaBgk5xak5xdk59Y +lZ5dlKJWkZxbipxHgI5UeIdAcnpJcHhHf4JTgo9UjpRYiZpMe49LbHZkb1xnbFtnblZtalVu +c1ptcVxgYVVbXlbq+Kb9//n///j////9//v////////9//v///7///////7///v///T///// +///8//v5//L2/+36//H3//Dz/+vq/+Ts9Ovo/ejj/N3l7eHf7tns/Ob///z3+fDs/+Dt//Hx +/+70/e71+eby/ez8//n//f35//n//vTz//X+++71/PX///T4//L9//v9+/H2/u/r/+j5/+75 ++fX+//7///f59eiEWG1BRkA7Q0BERTo8RTs/Pzo0PjE1NjsuPDM7PTkzPzM4PjssPzI0OTow +NzYzOjg1ODM9PDc8OTQ0OTU0Ozc1Nzc2OTY3PzUzPTQ6PDQzODM5ODguNjA6PTcwOTU2Ojgt +OzM7OzgwPjA+OzkzNDI1PDszOTU3NzcwOi81OjgsOTA8ODgxODc1PTU0NjY1ODYwOzI0Ojg3 +PjY6PTo5Nzk0PDc0OjI4OjUuNi44OjoyODI7NjkwOzE9PDMwOjJBOzc3PjU9PTc7ODk/NjU3 +PTU0OjY2OTUzOzQ5NjgwOTU3ODUzPjU2PDU1PjU2PDAvOzYyPDM5Pjg7QTw1PTwzNzQ8Njo2 +OTQ4PTo2OzM3OTw1OjU2Ozk9PTc3Pjc+RDo7QT49QD09QDlDQjk6QDQ/Pjk4OTU+PTs1QDg2 +PTkzPTM8QTQ6OT04PjVBQzk8Ozg/PjpQSztjT0NqVkhsVEV7a0mOa02ScVabd1arhl+5lWS2 +kWrBn2TGmm7Jo2jNqHnOom7ZrXnRrH3aqoPVr33ctofdrYnjtIbar4Xaq3vLoHzHk23SpHvi +v5jozaTou5zQloDEkWbVq3TjrH/is4TgrIXbrn7Zo3XPoXXYpn7gsYbsza3tyKPmuYzltYrd +qYPRoHHFk23KqG/XqnbTpnvUoHjKm3a7jGyZaVdBPTs7QDY+PTg2PTQ4RDYxPTU0QD0vPTQ6 +OzsxOzg9PDowQDQ4PDw1Rjs9QkQ6SUc6RkA5TD5CTUdCUUZCU1JBVlJGa15CbnFLgoFEZ2lB +aGc+Y2M8aGI7X2NAXF9BcW1Ga3FRi5NWiZdSkpJSgZFLfohWh5RPh5JcjJlQjJhfkpZYkJZb +kJRVlZ1gjZpbkJpWlJ5VjJxVipJSi5xXlpVWlpxXkZRWjZlakJhXlJpZjJNRlZ1UkpZSlY5Y +lqBNkZZdj5tUk5hcjZ5Zk5VejqNRjphZj51bj5dYjZxYkppbkZ1ZkJRRjJRbj6BWlJpXkJ5b +i5lTjJFcjZtZjp1ajZVPj5hai5VLiZZdjpZRjJRai5VQjJBgkphVjZlcjZlVip1Xj5ZVjZhY +kJpVjJtakZhcj5tWj5tdkJxUlJtbiJVXk5tZkZxWkJxZkZVZlplajZVYkJpUj5dQjpRbi5JX +kpRflJpWkZdVi5dViJdUipVWkJ1Xj6JTip1bj5pYkplckp5WkpZYiplSjY5cjptZk5ZZkpdW +lpdblZ1ZlZhXkZ1TkJ5akJ9YkJlYkKBblppckp1YjpxPjZtYkZ5TlJ1cl6Bgm59bmaRYlJBX +lKJYi5pOkJZakJ9UkaBfkKRSjZRckaVVlaBkk6ZWkJpXipNZl55blJ9dlJtck6Jbl55ckaBZ +iZpUkJhUjZpRgpJIeYpEcH9BcXhMf4ZOiZFViZlTi5hViphLd4hacW5ib09sblhebU9kbVVj +b1NqaFx1fmLz/cL///z9//v9//v///////////r///z////9//f9//P////7/+/+//j3//Xw +/On2/u/y/ef0//L1/+X7//z6/+/q+uzm9N/a7tPe7dXg8Nri9Nz///j3//T9/vv1/PHu7er9 +/v7////+/+f0//Hz//H2//P///r+//n///3///f8/u3z//D5/+3q/+j5/u////3////u7OTx +++f1/u3u7tyNVWE8Qjk/QEE7PDU+QDo7QDg6Pj06PjM0OjM0OzE2NjY0NTY1OTEzOTY1NjIz +OjU0OTI1PDY1PTQxODI3ODQlODU1NjgyOjIyPTcyPzY+Ojg6OjQ3ODcoPDE6OzouPDFBOzkx +OzE4ODkxODE5OTMwPjQ3OTcuNjM0NDc4NzMqODczOjQ0ODg5ODM1OTU2PC8wODUuODE7Ojcw +OzQ5OjcvOzE2Nzc0NTI2OTYuOS40OTguNTM9OjU1OjE5Ojc8ODQ8PDU0PDY4OTU6ODc3OjA1 +OjIvOzE0OTIyODMzNjIxPDcyODM1OS8tOy83ODQyODQ7PTg7QzhCPj0zOjU3OTQpOjI9Njst +ODU+PjU2PTVGRTk4QTc1QDU8Pzk5QTU8QDw6QTs6PDc6PTg9QjY3QzM7OjdAQT0xOjE6Pjs0 +Oy9IQj82PDE3ODo5QTM+Pj44Oi9FPz1dSzhnUEdtUEN2XEOFaEmSc1Kie1WlhFq5jF69lWjC +k2/ClmvHmnDJonvLoW/SqHTPqHvUqYDSrnrarIfXq33YrHzMoHfGkWPGkWzdsIPpxZnvy57s +zKHoz5riuJnEh3jAmmzTr3fesYjiuoXnupHbp3zWqHvXrYHhv4rx67X32rTvzqXswJPjs4/Z +qHzJmXXIoGrZq4jYqXzVqX3QonzAkmqZallFRTg8Pz87Pjg6OzkzQTU5PTcyPTE2OjU3PDM2 +PDgtQDAyPTU5QDk1Q0A2PzsyRD49Rjw7RkFATUNAUUhAVEc9WVBDaGFCa2Y+a1tBYmI9Y2NG +a286Y1s8X1w8XE1MdHNMiI9Yi45QiIhSi49WjI9XjZpSi5JYkppXjZpXkJpZkZdZjKBXjpxZ +k5Zak55YkJNUmJlclZ5XlpRajJlPi5hXkaBRiphVi5lPjZVXjpdOjJRWiJhRkJNWkZxRkZNX +kZ5TkZddkppblJZikpJclp5gkJVXjZlWjplVkZpTjJRcjZhZjZVaiZBWjJtYjp9bk5tXj5VZ +j5tblJ9jkKJTjJdZjp1YjpJVi5NTlJhXjZhRj5FRjZVYkJhbk5pciZVZkZdakpVWjplaj5ZZ +lJhfkppXkpZWlphYj5hXkpxZkJNXj5JbjZdTjplfkZ5QjJlbk5ZUjppZjZJPjJZYj5VVjJxX +jplSk5lXkJZXi5tTjI9UiphVjJRUjZNSjJZYk5hSlJZWkJRVjZRWjZVUkZtXk5ZXlJ9Ykp1e +lJ5ZjptZkZ9ckZxblZ1gkZ1WkJpXlZpcmaFYk6FZkJ5bkZ1amKFTjpxYlZlelpxSi4xaj5tP +jJZSi5RTjZVbjp9ak59Wj5hUmJxhlqZajqNUi5pYkpxdlpxYl6Fak5xelp9TjpxUi5lXi5lU +jppPj5tQhJlLdYpDb3tAcnxFeoJRh5FTh5RZj5tNj5pXepVKbHBjZFBeZE5kY09jZU5dZU5b +Z1F0gl3s/7r+//v///////////////v///3///////////r///v////////////3//P///// +///////4+frs+dny/+f5//ns+eft/+jd9tbr8ePi7d7l6t3v/+jw9+n3/e////r+//v4//f/ +//b///j79fXp8efs/uTm8+Hx/enx/ub09+31/+78//Py+uf6+vL7//f4//D7//T+//v9+/Dq +7uLd4tSNVGk0QjhAPTs9QDlBOT03PjU9Pjo2OTY4OzU7ODYxPDc5Ozk2Ozg4PjU9ODY2NDg2 +PzUzPzc3OTUyOTQ1PDQwOjI6ODcwOzE6Ojs2Ozc8PDQ1PjA6PTcxPS4yOzo0PjM4PDkzOjU6 +Oi01OTUxPTU2PDg5PjgyPDM3OTUzODQ6OTM2NzU1OTQ0OjI3ODY0OjE7OzYuPTE7Pzg2OzU9 +PTcwNzFAPjctPTI3PDUxOjQ2PDAxODA1OTM8Pjg6PzI9OjY2PjM8PDY2PDU6PDc4Ojg5OzE0 +Ozc3PTg2OjkxPDI2Ojc2PTQ2PDg4Pi87Ojs2OjE5PzxBST47QTw7PzYyPjU3OzY0ODY+Ozg1 +PzlAPzo+Oj0+Ozs9QDc5PTc9PjhBPzc7Pjo5PDg8QTk+PjpGRTw8PTxCPjw4QDc/Pjk5PzlE +RTo1PTw1PDg6PTg9Rzc7OzlHQjpaTkBpWkR5WlB9XUh+XkeCck6jflupiVu+m2jApG/GoXS/ +mWrKmmzMpnTMpHTQpnvVo3zPoX7MpXHRpXrLpHTClmy/jGzMnnjdtILlwZXuy5ns0Kvvy6ju +xKXnv53gtJXHgXe0k2bKpHPUr33ctYzWrXnYrXzYs4Xdt4XnyYvtzpbrwZTkvpDmu4rfr4LK +nnLNnXTWsHrWqXzTp3rLoHfClGWOZVY8PzVCQDw9PjU8PTs2RzY8PDs4QTM7Pjs3QTA6QDw2 +QDU1Pjc8QTpASD84PDg5Rjk1RDo9Ukg8S0FCUUg+S0RKbmlBaHNEaV5Cam9DYWNCY2FAUlM7 +WlRBXl1AbGNUi5VLg5FYhpJMho1UjZNXjZNfio5XjppVl6BbkKBZjJpbk6BZkJpcmKBgmJtZ +jpZWjJNbk5pXj55WkplXjphVkpVYipJSjJRZjZNRkpRgk5lXjJNXjZlVj5lVkZpVi5hVkpZZ +ipNXkZlYj5ZakplbkZ1VkJFajptWjpZalpdZj5BglJdijppRk51bj5ZVipJYkppOjphlj5VW +iZZgkJFLkJFZj5BajJlekZlSlJFalJVXjpZYjpVWkJFZko5ajZdWkJNjlphbkJZYjJpZkZhZ +jJlUj51elZ1em6FemJ5ak5xZjplYkJlakZtZk5xWjpZbjZxZkp1Vj5xfj5dVj5VekJ9ckZZf +l5lWkJddj51QkZNZj5tVk5JWjphWjphXjZhRjZtXk5tZkptWjppZj5pbj5dWk5lblJdakpdX +jp1fm5tgl59fl55cl5xZlp5Ykp5Ymp9dmaJYm5tjmqdal59ekp5dl5phnKNUjopekJtUjJhW +jJpVk5lWlplXlZtaj5RgnZ1flqBemaNYkZ9Wkppcl55elZ1ckptck5tZkZpXkZlblJlXk5ld +lJ9XkZlReJJAcH9KcHxIgH9Xg5NTjZpYjZ9XkJ9dhp5FaIBbY1dfXktaYkxWXUxMVElWVUdc +bFLq/7T9//j+//j///////////////////////7////9//33//Xw/+X7//v+//r3//j1/+j9 +//b6+/T2+eT8//vq9+Tl+ODo/+ni+tTl+eD2/+vm8Nv///r9//7///f7//P1++X2//b6/+3y +//H+//j7//D29+zz9vH9/vz///z///////X0/+39//3///f1//T4+e7u/eT19+79//H4+/P9 +9+2IXmg7QTMxQjdDPDY1NzhDOTgtQDM5OjgoOTY+OTgyNzQzOS4zPDE0ODM2OzI2PS41OTcw +ODA5OjgoOTE1NDMsPS84NjU0OzM1NzM5NjU5OzAzOjI0MzM2PjIyOTU4PDM4OC8xNzI3OjEu +MjQ1NDUqNjMyOTEwOS04ODcwOS83NzU3NjI8MjguOS47ODUuOjI3MzQ0NjM8Ojs2ODY6NzQq +NzU3NTkxNzUzNzUzOzQ1NzU2OzAsOC86ODQyNzMzNTQ3ODkzODM9PTkzOjI3PjM2OTI5Nzcy +ODI3Njc0NzU7NjYvNjc6OTc1OTU6NTQ3PDo5Pzo4QDk3OzkzOjU3Ojg5NTw4NzQyPTQ6OTM8 +PTA6OTY5PzM8QDU2PzQ6OzczQDQ7PTc4OTJBOzk1OzVLQEA4QDhCRD0sOzVCOTw5QTVCPTs3 +QDg4OzE2ODQ1PDU6PDRAOzhJQD5eTT5tWz+BZEuDXkSBX0qLdEmrhVy3kWe5mGrBn2vClnHG +pXDRp33SqXDRp37UqnfPqYLPpnjBk3LDi2nOkWvZqIXYq37huIbpyJ/vzqLvz6jsy6nq0Jzs +yJ/oxKPkt5nKhH+0d120iGSzkWDBn23DnXDPq3bTr3zbtYnduIfitYnfuIjhtoXaq4LElXDG +nnXRom/PpHbKpnrEnHC3kGp/WlNBPjk8RTk5Pzk3Pzc4PzkyQDE4Ojk2NjU7Ozw3Qjg2Ozsy +PC82Pz87Pzg0Qj03QDo0Qz88R0E+Qz9ATUk+WE1BYFRAY1tFcHZFZ2lAV1g8TEY6VVU7WlJA +aWhOgolRhI9SgopQiZJQhJBOjJVajJRWjJ1UjJldkqFdkppSkZpXlJhZkp5Xiphdj5pak51j +jqNXk5pfkpxWlY5YjpRVjJhVi5NQjZJVjZlTjI9cj5xbjpFblZldlphakZtVi5pWi5ZSkJRZ +jpJWk5laj5lWj5RSj5pVj5ZVhpdTkpZZkJlOipZUiZdSjplcj5xRlZNgkJlPkJRYj5xWkJxg +jZtYjpZhkppVkZ5cjJpbi5lNjZhXjZxclJpbkppWjZZXjpVbjplYjZ5dkp1XjZdWkJRUkZJb +kpxXjphdkJpakJNejZlakZpdjpldkphZj5tUjJJej51ejZdakpdVjJVWkI5ckZdXjphbj5ZX +kJpbjJtWjZNakp1ckZdPjJZXjZhVkJldkZpZkZxajZlSkJhhkZlUj5pfkZtUjp5ejptdlqBe +lZZXmp5Xk55ZkaFalaFhkqRZlJ1ZjZpbl5xfk6Fcl5lelJ1Ykp1VlJhSjYxXiZ5WiZhNi5RS +j51Xj5xZlaFYkJtamaRdlpxZlaNXjJZWkZtfk51dkppWjplXjZlakJpRj5tdkaJUjJZXkJdV +i5lNfo1FcX5EcX5KfYRLg49Ui55WjppVl6NVh5tKcpBMX2FWWktVXVJSVEtGTElDR0ZRXk3n ++qj+//f///v///////////////////n///j///////////////z7//v6//v8/+/5/fP+//X7 +//Xz/urs+eXz/ur8/Pfn9+fa7s7l89zo9eLk79/m8+bj9eDn9ufx/v37//nx++vw9+rs8uXs +/Pf///7///////nu/+fy/uvy/+f9/vX7/fHy/+/7//P9//b8/ez+//vt8OT8/vH2/+/29OWb +WGo7QjY+QzU/QDk9QDYvOTU1NzkzQjc4Ozo1PjUxPTY6ODUzNjY2PDgwPDEzNjIoODI4OzIx +PTE+PTMtPTQ7OzMxPTU8PS85PDUtPTcyPTM0OzE0OjUyPjY3PjsrOTc5OzQ2PzIzODU3OjIz +PDMtNzUzODQ2NjctODM3OjYzNzI4PTczODAyOjczOjIzNjc4PTUzOjU1ODEtOzM/Nzg0NTQ3 +OTgwOjIxOjUsOiw4ODkwPTc6OzovOjI0OjIqOC8xPDI0OTc1Ozc0OjQzOzQzOTQ4PDY0OzUv +OjM1PjczPDc3PTY1QDUzPDQ6OzgxPzk7Pzs3PzU6ODsyPTc7OTo0OzY3OTUxODI5NzI2PzQ5 +PDU6QzU8Pzo2Qjk/Pjg2PTY6PTk9Pjo2QjVBRUBCQj0+PjhBSjo2Pzg1RDg8QzdBP0EyPTcy +OTQsPTI5Pzg2Pi0/PDY9RzhgR0NuWEB9ZUiQclKOaFF7Y0eliFa4jma/l2zDnHDBl3HEnG3K +pHTRpXLMpXTSrXvQpX7CmW/LlnnRrXbWq3nZuYXfvpboxZPw0bPy2rP21a7u1arwx6js0Jzr +zKbjwpDnv57cupbYsIzNj4K0b2Kge1WtjGTBmXTRq3fZroParn3ctIPYrYbMoXm6j2rEm3PL +kWvKnXXJmWu7jm6qfGFbRkBDPjwzQjk7Pzk1OS81Qzk1OjQ2Pzo2PDYzPjA1QDkzPTQ0PTws +PjM4QD02RTk6Qzo1Rzw3QjY7S0Q5SDw6SUU+VExEXlo/WE47U1A6YVpBXWY8W1Q/eXpJeXtO +hoxOgodLh4lYipRVjpZZj5dXlJpajp1dmZ9bkaFdk5lZk55ak5pXlJpcjZ1Tj5pak5dak5hX +ipJVkZtVk5ZVkZlcjY9PkJNVkJRSj5RVkZlWj5VZmJxZhpxPmJpZjZ9alZhglZpOkZVWkpha +kJdcj5hWlZZdjJ9Rk5hdhptRjpdYkqBck5VYjpRWkZZakZhYiZZYiZpakJZhkpZXk51bkZlV +kJtWj5pSjZZVjpNZk5hVjZhVj5Rbi51Sk5VVjplWkZpYj55Wko9gk5pVkZxcjZlPj5hdl5lh +kZhTkppVlp1bk5xbk51Vk5pXj5tXk5dUjZhXkppTj5VVlZ1Xk5ZbjZVPj5ZajJ1VlJpfkJ9V +j5hTjptakZldkJtVkZdTkp1Xk5xaj5dZkZpRkZpYlp5ZkZhTkZtakZxalp5fmaFckp1ekZ1U +kJ1akJ9ZlJ1bkqFYm6BjnKZUmqBilp9Wl6Bjm6FWl5xYlZ1WlKFWjYtUjaFQjJlWj55WlaBd +k51flaNelJ9ZmqNdmZ9XkqBYkZxUlaBWkZ1ShJlRiZJWj5pVjZVZk5tYkJZWkZ5ZkZ1WkKJR +fZZBc4JIc3tFfoRMhYdQh5lcj5xXkp9blJxPg5ZHVnM9SkJDSEdAR0BASENESkJDV0rp/6X9 +//L///////////z///////v///////////////v4//j7/+7////////////////////4//Xv +9uvw/uf8//nv/e/v/+7e9dTw/ejs8urj8Nz////////////2/+vx++n0/u/9//7///f9//nt +9+jx/Oz1+/H///7///////P3/vz///////b9//n4/+74//v5//n/9/X///X1/+z49O+wXGw7 +OzdAQTlDPztEODg2PD03QDk4PDdAPjorNzQ7OTgtODRBOzUsNTU7OjsyNzk2ODQ2OjZCclk9 +Pzs4PDI4PDEyOjQxOTc3ODU5Ozk3PTU5NjQuOTQ3Nzk3OzUyOzYyNDo6Ozo6Ozg5NjQ3OjU1 +ODI2OTc2OjE0OjgzNzI4OTowOTUyPDY2OzUzPjY3OTIzPC40PDYxOjM6NjcwNjAzODkwOTU0 +OjU0ODE0OjcxPDQ1OjQ9Ozg3Nzc4Ojo1Njg4NjY4Nz0/OjowNjg7PTQ6OTQ1OzU3OTM3OzE8 +Ojg2OjY+PUA3PTQ+PTkxPDQ9QDs7QDs+OzU0PzY+PTozPDY3OjgxOTE1NTI1ODg4QD02PDdB +PDg2QDo1Mzk0OTk3OTc4PTg7Nzg3PTNIP0JEQztFPUBIR0FEQkM2PDY/QTtDQ0E/N0ExOTg/ +OTozOztAPT09OzhBPzxWSD5xWUV4XkqIaE6MZEmEYUqXdFGujmC8l2nHnnLKoW/GlHPEl2zL +n3XOqXnPo4LAj2nNnnTTrX3Po3/MnGvXr4Xft4zlx5rnyZzo0bHnyZ/uzaTv0rXmwZTlw47o +wZDmwY3duIrWsYrQqILCmXHAmHeqcla3jWXAmW3NoHvMq3/RqYbFoXi1iWuujGO+jWrCjmjE +l3C8lG+zgGOJXVVIPTs6PDs0PDc5OTs1NjY0PTg2PDo3OjszPDo2QDUxQDc1PTY0QDsxPjQ6 +PkEzPTc4RT42Qjo1SkA8QDU8QUQ4Pjw7R0M+Ukg9V1BBUVQ+WlhAU1tCb21JdH9JfoRViJFS +i49Vi59alZlkk6Nfj55ZkqJbmaNak6hfl6BYj5ldjqBblp9Zk55TkZdfjppVi6BajZ1Yko5Y +i5NZjpNVkI9dj5ZRkpVaj5ZWjJVVipdXkJVhkqNTkpNilJ9bk5dbjaJUkZFYjplVkJVWkJpW +jo1amJJXjZpVlZ9TkJhgjZJYkplahJpSkpVakJ1gjphYkJZZlphhkaBVjZdglJhWj5ZYjZtS +kZZYiZhNjpNUhpVVjplbjptTkJVYjpdXip5gk5tfjJZVjJdWkZdWkZRejptVjZZUjplXi5da +kplijpxYkppYmJxakJVhkJlalJtclZpXjZNck59OjJFTjJhTi5hakptXjZNYjZlZlJhaj6Ff +lKJakpxXi5lVj5dZkZpVkpZemJlXkphWjplXj5lakZxZjptXkppgkJ1XlJ5hkKFXj5hikJ1T +k5thk51Uj5tdkZxVk59ek59ZlJxZkKBTkpxWkJxZjZ5clp9VioxRipZOgpNRjpVXkqJZlJ1e +l6Zak6Rcl5tYj55WkZtXjaNZlp9RiZ9OiI9Qh5NUh5dWjZtWippZmJxZkJ9Vk55bjJtOhJVL +b4FAdXZOe4JMhI1ViZdQj5xWkp5dmKJZhZ9DWnw/PkZAQkI9QD0+REFARjtHUUvn+az///// +//////////z///3///////////////r///z///////////n///z///v6//P4//P6/+75//P1 +/OXx/u7z/+zl++Xg/dfq+ebv+ubv/Ovx+ejr/u36//jx/evs+Ojl+OX6//fz+ejz8+z+/vf/ +//n1/+z1/+/y/e79//z5/ffs/Ojz/+38/fn59/L/+e7y9ent8+Px/uj9//zu8uOcX2k5QTlI +Q0BJQjtEPUQ2PS46PTw5Py86OjouOTA8Ojk4PTc1ODU0NjYzPTU8OzkyODc4OjU6Ozk2OTU2 +Ni81ODs8PDU5ODY+PDQuPDY/OzY3PDU5OzkzQDQ+OToxODY9NDg1OTQ6OzE0PTU9OjUxPjQ2 +PDQ6ODczOjQ3ODU1PjY+NzcxOzQ+OjoxPjY5ODo2PDg3OzM3Ozo4NzE0Nzc0PTAyNDw2NzQ5 +Ojo3ODA4OTo8PzJCRD0/OzMzOjU8OzY4Pzc9QDQ4OjU7OTUwOTQ3ODgzOjY3OTUzOjM1OTY3 +PDc8PD43Nzo6PTk5OzVARzs4Pjg6OTY3ODg8Pz44OjYyODY7PjYzOjc5ODQ8QDo1PTVBOjs0 +OjY7PDg0ODg/PDc1PTNAPDo7QTdIRjo9Pj5EQjhCRT1DQjg6QjdCQDk/QT08PzUyOjU2PDQ7 +Oz9APThCPjtHRDhKRzhrVUh5YUaMcFGde1iccleObkmog123ll/DoXLInW3Fm3LIonDUo3fL +oXLJj2/GlmzSpHnNpm7Op3bUqnvYr37cuoPat4bdsoTes4DgvIjo1abt2Kbtz57txZbrvpbk +vobku4zUpHjHmW+/kmqyfWeph2Cri2eykmO2k2yujmOigGKEZU6deFaqgWOzhF6/iWS5g2mt +gGWVblRfR0RAPTk3PT06QDg2Nzc6Ojc1QTk3ODo1Nzg+Pj0yPDE6OjsxPjU8QTw1PjU8Pjw0 +QDxAR0E6RUAyPzw8REg4Qjs5QT06Sz1CXmFAWVdAWFtBYGU/YGZHbWdGd31RiJhXj5lglp9e +mJtfk6VYjpxckZxalZpclKBckZJai5VXkJZSjJpZlJxZk5ZZlpRYk5lYlZpTio5akZtYi5lZ +j5lRiY1WiphZkpZZkpdXkplblJxYjZlVk5tdmZRZjJhhlZJWj6FgkZdQkJdUkpZZj5dYiZNW +jJlWjJJVjpxRkJZjjptTkKBYjppUjZVhkphRj5JbipRPiIxWipRckZlakJ1Wi5FakpVajZpW +iJVZiZJRi5VYjZdWjZZUj51ckpZYk5lhkJtVk5ldkZpdk5pVjZZakZdXjZhakppfl6BXkZlV +lZ1XkJdXkZ1VlJpakZtVkplgj5lYk5pZkppYl5pglpxaj5tVkJpekJpXkp1alp1hkZ5ckJta +kZpZj5hXk5xakpdekp1SjpRfj5lVj5hhl5lWlJhbjptalJlil6BdlZ1bk55TkJxbl6RXkp5a +k5xdmKFZmKBakZ9bkZtdlp9alJ5akpxXjZlXkptflZ9UkIxWi55NgZVUjJVPi5ldj5xUjpxd +jphXkppekZ1YkZxekp5PjJpOf5RQh45VjZdQiphVj5dclZ9Wkp5ZkJxTj5pakJdNh5dEcoRF +cXxGd3xRgI1VjJFZj5xekpxhlKJXi5tGbZE9QlU/Q0Q9Qzc4REBBRj9FVEXw/6j///z8//v7 +//b////6//T9//T+///7//b+//T////z//Dz/un5//D6//T6//j6//n2+vH6//H////v++3w ++Ojp9+bw/+rd89fh99vn9eTb6tP///nt+ev1/vH8//P9//X9//b7/eXw/Of4//j5//P7//n5 +9+nx8un1++fx/vH+//n1//X9//z///////3//////////f/9//X3/eni49agW2w2QDtESkBN +RjxEQjo7QTQ8QDMyRzQ2OzY1NTMzNzEzOTU3OjYtPS80PjcxOjg2NC01OTY1PjcsPzcyPDc5 +OTY6OzQxOjA1OzUuODE9Ojg1Oi8yODYzPi45OjkwOjI6ODQpPzIzNzU3NjM4PTMwOzQ4ODY0 +PTIxNzQ3ODY1OzY2PDQzOTozOTI2NDM1OTI3OzUyOTU5OjQyODM4PDcwOjJFODw4PTM7PjY1 +OzI9RTk7QTJBQDc0PjM6Pjc9PjM5PzQ6Pzc5QC8+PjY3ODQ0OTQrOjUxOS8zOjA1PTQ3PTg4 +QDQ2QDUzPDA4QDk4PDM+Pj0vPTI+OTkuPTY5OTgyNzY3OTIsPzY4PTU4Pjg3OzY2PDQ1OTU0 +NjM5NzUzPTEzPTE8PzI6QDlDQjlBSD5BSD1FQD06PTQ/Qj42PDRBQTs5PTc5ODs6PS06PTk8 +PTNBRD5NRTdKRz9nV0NwXkaJa0yYdFagfFiQbU6aelSylWPHoW7EoGrFm23NpXHQp3rOpHXE +lGnQqnnKpXXDom2+o3DPr3vMsHzOsH/Pq3zWsoHYt4bkwpHo0KDs2K/r0KrqyZ3sx5/lwo3j +uIzbr3vToXnIlGq/hWWobVuQbVCIblKBZUp5XUZ8WEWbcU+uh2Ghelyge1mpf1qgeleQblRu +WEVDPz47PDw2PzE5ODk2Py01PDY0QjQ2PTwyPjA0Ozk2PDE1PD4zPjU2PzY1PzU1QT01QTM4 +Pj04Qzo2QDk5SD45S0E8R0A5T0I+Y148YFM9cWlCbGs9ZGNJc3ZPhYxbkplakpldk6ZZlple +k6RblJpek5tYl5xZkKFakpldj5Zak5pZlKBajZRTjJRPjZVTiYlWipVZj5ZXjZNak5lZi5JW +jpZblJpgkppXjpJckp5TmJdYj5hTi5dajpxPjZFWj5pLjZpgjZ1SkpdXk5VZj5VakZVZkphS +i5JZjZlWj5VVk5hWj5JYiphZlpZZkp1akpVXk5xajZdbipBdjp5YkZhdkptPjJJZkJtVk5VZ +jJxRlZNaj5dWlZRcj5hTjpBRj5hXkZpXlZphlZdckppZkppVk5RZlJtYkJxgjptYkJZTkZlZ +kppXkqNdlqJVkptflKNVlJtgk59SkJlhkptYkZ9ekppUjppclJRXkZpZk5pflZ9ZlZhZk5xW +mZtZk51XlJZdkJtUkZ1ckZpUlJpYk5dalJtak5tdmp5Tl5tdlJxbk5tem6Rdl59cmJ9glJ5Y +lZ9Xkp5ZlqRgmKFaoKRbmqBZl6FWk59Tk5lgmaFTjotXiqBHgpROipZQkJlWjJtXlZpcj5pa +lqBakZ5WmKBYjZlSipdMf49TiI5ajZhXi5lSjpxYlZ9YjJ5ZkppYkptWjppXjJdEc4lJcnhH +fH9PhI9Pi5Zaj59WlJlekJ9UjJ9Sd5U/UW9DQ0E9RUBDSD8/R0NNUUbd+qD1/+r6//T///// +//////////////////3///////////r///////////////////n4/ez///z5//bx/+r5//Lx +/+/n+erP68fq+eXj8N7f6tXt/eb0/fDy//fx//T3//v///by/fL1/ens/OH59PHz9urx+/f/ +//7///////n9/vPy//v////t++fz/u/5//f6//Px+ez+//v9//Ty+ee4YW9AQD48ST9JR0dE +RkI/Pjw/QzxCPkEvPTc7Pz8zPzY6OD4zOTM6Ojs0OjI7OT4uOTE8Ojo3OjM6OzwzPjUwOjc5 +NzQ1PTc6PjcuPTc0NzI2Ozk4PDcxOzIzODc7OTY0ODc+PDYyOTU7OjUyOy85OjksOjE6ODgq +OTY+NjgtNzU4OToxPjg6PDI1NjU0PTQ5PDo7QTw7QDlASTk6Qjc2PjhBQTpAPDg+PTg5PTk+ +PjlDRkBAQztHRUI6QzZBQTo6PzE/QTlBQDY9QDs8PDE6PTk7PDQxPTY1ODQvPTU8PDg1Ozc8 +PTgvOzI9PzszPzk6PzwzQDc8QTk2Ojo0ODY1Ozo2OzE1PjczOTg5QTkyOjY5QjQ2PTk8NzY2 +Ozc3Ojg4ODk5QDY8OTs8PjRCQjs8RTdEPDw3QDpBQD48QjhBQj40PTs5Nzc6QDk+OjVAQTxH +PztEQTpSRTtZTz9xVkiAYk2ceFGogV2ecVWPblGpkV3EnHHClXDBmGzMqHPSqnzUpn7Jmm7S +oHTInGire2OKaU6LaVGQa1GVbVCaeFimgmWsimS/k3LGr3bYw5LgvZPfwI/kwJDiwIvgs4Hj +tobcqH3TnHHPmm7LnHHGlGe+iGKqc1WgbFScdlKqf1iohmKjeVuddFeYc1yMbE5xVklNQTw9 +Pzk7PjY4Ozk2PDk7OTcwOzY3QjovOzcyPDczPTQ5OToyOzk6PDozPDk2OzswPjk5PTw0Pjw8 +PT03QTdARUI3RT5AQzw1S0dDVVc5WVdGZmZDa25If4JOhoxWk5pYkZ9blZ5bmKdakZxil6Fe +l59ckaFXj51XjJpYjphTjZRUiJ1Si5ZVipZUkJZglaBXj5Nbj5NcipVYk51Xj5hXlJxai5lV +kZxakplYlppakaJckKBakJlalJtjlaBYkJhalp5amp9WkJpgjppWkJ5ai49UkZdgkptRjJpZ +kZJOkJhgkZdWi5ddkaJdipxYjJVYkJlTiZJWkZFdiZlYiZxQkZtXjZxdlJthkaJXj5dYj5lR +kZpajpZTkpVZi5ZXi5ZZkJpekpVek5Zekp1el59cjp9ekZdTjZlaipVWmZdakJlSkJpcjppT +lJZZlZ5WlZ9cl59alJhek6Bck5pcjpxVjZZbjZlUkppZk5lZjJhZkptYkZ1flJ1akZxflJxb +kp9dlKBZkJ5ek5xakZ1dl6BZl5tfk59clZ5glaNVmKJXlJ5cnKFik6ZYmJ9jmadcl6Bfl6da +lqBklqRZkZdfl6JcmqtalahTkaNalJthlaBXi4pYjqBPhpdIiJVXkJ5ckaFVkp1Xi5delZtW +l6FcjZxUjZpTgpZHgYhVjJhQj5ZXiphMjJdflaFUjZxYjZhbkZtbjZ5Ph5hJdodHdX5JdYBM +gY9XkphakKFdlKZfkqJXkaFQgpZFYoM/SUdBRUc9RD1HSEJVWUjp+Kn+//n////////////6 +//P////////////////////////7//T////7//r5/+zz/PL5//D8//3y+e74//H1//P5/fDq ++ent/eDq9eXp8uLm8OH///7x9eTq8N7q9eby++b1/uv5/+7+//H8//r+//v///b7//n9//T/ +//77//b++/f0/+30//X///z7//ju+ufl8+T08u/+//35+evt8eO3X2o1QDpDRz5DR0RIRkFJ +RUNNSDpJRkBEQD0/PT01PzU/Ojo6OjdBPTk0Ozk0Pzc3Ojc2OTc6Pjk4OTgwPDU5OTY6ODY6 +OzU2PDc4PTY/Pjs2OzU2OTw4PjQ3PTg1OTUzOjY/PjoyNjU6OjUsOTE1OjgzQDI9OzkyPzM1 +PDYwQDQ6QDcvPTMzPTcwOjI9QTdNUUJbUkdcW0VcXUpYTEFJRj1FQjw/Pzo0PjI6PTc7QjhH +SD9NRzxLSD1DRzdIQj8+QzNCPTk9QDdAPzc/QDVCQDk4RDJBOjkzPzM3PDw0QjQ/Ozg4PjQ8 +QDc6Pzw3PDM4PDs4QDY6Ojw0OjkxODU0ODg4PDE2PjA1PDQ4OjwyOzI8OzkzOjM8PT0wOjc8 +Ojk2PzA/PjwxOTRDPT85PjhHPz4+QTo6OzhCPz0/QDo/RD48PTg4ODc9QUA6PjpCPDpKQzlG +RD5STD5hUUJuVz6IcVGaeFSrgGGleVWadF2ulF/EonfBmWrElm/Lom7VrX/TpHrMpXDRqHjQ +p3vHiHOQeFemmWLLr4u0fmW+jGi+h2q3d1ixdFq2fmO5imfAlHDInXbVpH3OnnnRknDNmW3Q +m27OnWrVoXTNmG7JmWzBj2y4gF6eb1eUeFWgeFqhfFayh16idVqNZlZuW0pLRT0+PTo6PjU8 +Ozw3Pjc5Ozo5PjM1PD42QTQ2Pzs6Ozs2QT02PTA2Ojs6OzgyPTo3Pjk3QDs1Pzs3QDU6Pjs2 +QDw/Q0Q9RT08TUU/UEQ/UUs8YmBCcHRPe3tUj5RfkKBelqhdlppamKNhl6ZckaZhlp5al6Jh +lJlel6Bgkp9cl5palJZajZdVk5pclJ9WkZpgkpxVjpRekpdakpJZj5lTkpVakJ9YlJlfkqBa +k5lbmJpfmphXmKFakpxfl6BamKNgkZdakZpdkZlalZ1YkJBYlpdalZZTkpZfkJZZkJldl5pZ +ippXjJpSkZtliqJSi5hckppVkZdfkJpQiZlckppakJxakZhhj6FZj5VdlZlajZxajZ9Zkppa +kJxilJ9Vkpphj5ZWkJhfj5lVk5delZ5Yk5ZilKBcjpldlZ1Vk5pajZ1XlJVck6BYk55ik59a +l51em55elZxgk51ikpxelZ5aiplXlp9ak51fkZpZkp5ek55gl5tekJtalKFakZtXlp1ekp5W +lp1ilqBTlp5hk5dWk5tck5lRkZtakJ5fkpxdmJ5flp1cn51hm6Ndm5xcmJ5Skptbm6Nen6Vd +k6Jemp9ZmZxcmqZdlZlYj51clplcmqlWjopXjJ9Ng49Ih5VYlJVckaFckp5Zj5phlaJaj6Fe +j6FTj5hPgZJKgohajpdXj5ZVjJZaj5pYkZ5Zk51ViZpXjppYi5xRhZRLd4hKd4JMeoFRioxZ +kJtclJ5WmaVkmKBWi6RVhplLeJFSbG5XX2NITUhPUUZaXUvt/a7////////+//v+//f///// +///9//v////3//T3/+32//X9/+/////////////////////6//z7//H2/Pb1/+71//Ty//Lm ++9zn9ubm8uPi89rz/+76//z9+e76/vv18+z3/Pv5/ff+//z///3x/+////n///Ty/O3t++jr +7+f9/vr////z9+zy/vH9//v1/+7+//n///75/+/4//H28Oe3WWk8QTxDSD1KR0FGRzk/Rj1I +RT9DQUFNSEE6QjZFQzczPDc9PDMyPDU8OzEzOjY5NDI4PDU1OzE6OjQxPDI5OTc8PTc7PDky +Oi87NzUzOTE9Nzg0OTMzODM2PTQzODI6OjU4OzQ0Nzc1OTM3OzYxOzQ4Pjc3OTQzPTc0PTEw +OjU2Ozk3OzY7QTpITDd6YEWGZEl7WUppUkFnVUheUj9eSz5TSjlMSTc9QDg/QDM+QjdIQzlI +SDxKQT5EQzpFPjlAQDU7PjtEPzg8PTVCPjg9Pjk8PjQ8OzU4OzA4OjY9NzRAPT41OTE8Pzk1 +PjY8PTozPTU+OzIyPzY2OjUuOzY3PDYuOy81Oy84ODk5ODQ1PDY4PDM1ODUwOTY0OTI2OzQ5 +PDc4Ojg0PDY8OzYzPTFBPz41PDU8Pjc+QTpCQD46PDZAPjsvOTQ9PTc3QThARDdNSDlLPz1O +RD1fTUBsVkKEaEicdlqhgFmmfFiYdVOskl7En2/GmmvGnXPJoWfVsn7VqXzTo3HRpHLbroDe +r360dnCkoWHVxqLEpX/TuYrKl3vJk2zRoHXmx5j10sbamYi/f2O1fly9hWi/h2fEimzEhGi+ +fWLAg2S4eFy5f2GrfFWse1qbd1KZc12felm3jWDEnHWpdVx9XkpURz5AQD06OzQ8Pjw1OzU3 +PjQyPDU4PDkzPTM0Pjc2PjM0Pz01PDQ0NzA2Ozk0OTU8PjwyPzQ4Pj00QjY7P0Y7QTg3QEA1 +OzY3Qz87R0M/VU5CW1c8ampGcnRGfHxWh4pajZZfkJxVi5NZkJpXjpFYk5tdjpdZkJZbjJNY +kZlZjpRZjZRej4xSiZBXiI5SiZJajJBVipZZhYJYh4pViItXiJJTiJBXipJOjIlZjpJVi49b +kZFXkpddk5RVkpRajptVkZJaiZBUipZXj5hZjZFSjptWjI5el5NVjJNckZZXjZlgjpNVj55d +j5dYkpdjjZZSjJRai5tVjphZi5pUkppRkJtVjZlckJxZk5VZjZRWkpdakJhakZtYjZdTj5NY +k5lUjZVYj5lbkZRVjpVZjZlelppZiZpZi5pVkpZckZpakZpXj5hYlZpgkJxXlphcmZtamp1i +mKRblJ5dlJxbkZhbk5pWkppck51VkZZbk55alJpakplZjZZak5hWk5pak59fkppbk5hckJdb +lZhYlJpelJhXkZlbjptWkJhbkJtUlJlklZ1VkJtblaBblZphlKNXkZtgk6Fbm6NhmaBek6Fb +mKJcmadZkKJZkJ9Uiptbj5hcmKFUjo5YjaBSgJ5Jgo5Xjp1XkqFdl6FakaRalJ1Tj5tclJ1a +jp9OfotMg45VjpRUi6BVipdVjJddjZxRjZpYiJZOjJlZjZxPhZFMeYtDc3xNfoZNhJFYjJlT +jpdamqZbjZxaj59XjZ1PeJNUbH5faGdSUVZLS0ViY1Dp/rP///r////7//z////////9//n8 +//T///z///z///////////b///r///X9//n7/vj6//H6//Ty//L1/+ru+/Pi9Nzd8trc9s34 +//Dv8une59ru/O70/e/+//fx/+vz/+/x+uXu/+z1/+36//X09evz/+vt/er8//r7/vX5//b8 +//f9//D6//b0/er0/+/1/vH+//Pv8Ojz9+7z+Onp9Nq4Y2tBRTtHTEBFREJJPj5DSUBEQEJK +SD1ERDxLSEBART89Pzg2QDg2PzkyPDYzNTUrPC06OTo1PTQ9Pjg1PDJAQDo1PC4+PDg6OzI8 +PDk2PDQ1PTUyOTUzQTU4PTovPDc1PjQ6QTc0Ozg1PTU1Ozg2PTcyQDQ2PTY3PjQ5OTk7QjRk +UECGbUepg1atiGC4jGexjGu5jWqqflioe1aYakx9Y0WBYkB2XkFlUT9RSzpOQztGRjtKRDlF +RTlKRjpEQztDQDY+QDc9PzdBPzw5Qi89QDk6OTI3Pjg4PzA3Pzk6PjI1QDc4PzE5PzU6Ozg4 +Pjs9PTkzOjE7OTc1PDQzODY1OzU3OTQzPjM8PDgwPTI4OTM0OjIyOTEyOTUzOjI2PzAyPS85 +OzY2Pzk5PTAyQTM3PTg4Ojs4PTY9PT03OzY6QDg1PjQ1OTcxQTFCPDpBRTZQREBLST1URz1k +U0NoTjt4X0yceVOdelephVqcbVWpkFnFpnPInW3Go3HMqnTYsX3ZqX7Nqnfaq3zas3nmwova +sJDAiGqVhWSZkmPWzJXYsZHVsnjt0p3w3J768Mb338XproberYLWnH/AgGS6e2W6fWW6hmm1 +d12qdlimd1mcb1OPZ0qJZ0isi17DnXDUuYvInHKTbFZVRUw3QDU8Pjw0Pi48OjkvPTA9Ozk0 +PTU2QDsxOTE5QDk0OzMxPDw1OjozOS82PTQzPTE1OzEyPjszOzkzQzY1QDc6Qz0zQDw3PkAz +Rjg7SUU1UkpBXVg+c2lLbnFCd3hWg4hTk5FZj45SjZRcj45YjpNTi4xZi5NbjpRakJZSjpdX +lZtSiZJWiI5UhYxNiI9PiIhTiJJUg5NSg4pSfYdJhIhTjpROipBTiZJSkIpUiJFOioxYkplR +kZBajJlVjZNRjZRXi5ZLjY5Ri5JPko5LgolShotOiIpSg4tQi4lLgohLhI9ShYxJgItYjYtL +jZFZgo9OhZBWh5FSiYxVi5JVi5dRiZNRipNdi5JXj5JLh5BViI5Qio5NhotPg4ZViIlMhYtX +gotLiIlWgYlKgYZQfodPfYFKfotPfYVNg4ZLf4VSgZBQg4VSgIVUfoRUhIBXiYxUi4pZjo1Z +kJhZl5xei5ZSjpJalJZTkZdYkZVTkZVZiZdTmZtdl55Zk5xalJ9bmp1dkqBbl5takplYkp1c +lKBUl5lek51alZ1bk6JfmJ9blp9bnqJglZtZk5xakp9WlJ1clKBcl6Fel6JblpxdlKBalp1j +naNZmKFekaBSjZJYkp5TkJxSjI1ZkZ9NgZdKgo5QkJNakZ1hk6BVjJ1SjplTjplclZpWh5NM +fIhNhYhYjJVQjZdWjJFRjZZTiZdRiZhViJNJj5Fcj59PiZVQeoNBbXdLfYFRhYpYlJpZj5lc +lp5ZlKNXk6RYjaFTf5JOan1YcmdgXGNNTk5cWE3j/6b///j///////////////f///////3/ +//////z////8//z+//j///b8//n1/+7w/+78//nw+/Pu++X6//T7//n8//vs+Ozf8tTh7N3f +9dvl7uP///328+fs9un6//P+//7///n2//b2++vv/PT2/fP1+fD7/vX4//b///7+//n5+evw +/fL6//z7//L7//v///ny/ejt9ur+//v+//j///LUZ3I5PTdBRkBDQTc/PjZDQDxJSD1KQzpO +SD9LQj9OR0NESD5DQjs4PTo5PDYxOjg0Oy8vOThAPTk3OTc6PDUyPTU/Ozk5PzU9PTo0NTM7 +OTc0OTA6OjU1OTE8OzU3PzQ0OTg2PDA1NDU2OzA5OjUrPDM5Ojk9ODYzOztbUj2Vck2kf161 +jGi4jmnFlHXDlnHFkXPCnXLDm3mwjmq+km6thGOtgFube1GcdFmRbk2Jakh3WkBnSzxIRjdG +PzlDPTlCPzhCPjlAPzY7PDY4PjA5PTY5OTM3OjQ6PTc2OjNANzk9QDk+PDw4OzM/PDk8PjM+ +NzgyOzU9OjY0OzU/OjkzODY+ODc7PDNAPDg3OTU3NzY3OTIxOy8zPDQ3OjU4ODU1Pjk3OjU5 +PDY5OjY4Ozg8Ojc5PDs3PDQ/Ozo2OjM/PD00NjQ6Ozo6PS8/PEA7PjVKSEBSTT9WUT9oWURj +TkN0XEiQc1KhfVqkfVWcaVOlh1HFo3HJpHLKonLKoXDVrHfaqn7OoG7Xq37VtHvlwYzmxI7f +qYjEiWqqhm2wq3u2p3bf0JTy46ju06vktIbz3qn21azrtpflv5HsvZTao3nSjW3JhGy6b1+l +Z0+OV0V1UUWIXkm8l2bLpHHXupHVsH2lgW1ZR0NBQUE2OzM1PTk4NTQ2OzM1NDY4Pjc6ODg1 +OjM6PDgxPzQ5Njs1Oi83Pj43OzQ2Ozw3PDE3PDY6OTU9Pzw2QDc3Ozc+Qjs5Ojw9QD47Pj87 +SEM6V1Q+Y2REbnBDdHRMe4VOh4lTjZJSiZFZjJdWjY5ai5lOho1ThZRSjJFYh5dNiY1Si5dR +hYpXgZNTiodVipNSipJUg5ZPiY1WkI1XiZNVipJPi5VVkZlZi49TfopPiY9VjI1Mi49Vh41X +jYtRiI9PhY1TkJFMjIpSg5JOipFVjI9LkZZVkZFWio1WiJZYjI1SjJZUj51RhYtRhY1SipFO +iZFViZFSiJVViJJRkJdQgZJRh5NaipROjZBUj5JPiJBSgZJMfYVTgJFMhpFRhJRPio9Qfo1P +g4pUhoxKfItSg5JXg4tMg4tNfYpRg4pNf4lQfoJOfYlOgIdQf5FSg4xRgotSfolVfodWioxP +iYxah49Kh41YhIxEfoxUg49Pgo5Rho9OfodPg4xSfYtXh4xVgY1SgohUgYZThoNZiY1WjY1c +jY5TiI9Wh45SiItcjIlTio1ZkpFYlJpfkJZXjZdak5temKBbmKJhk6NZlplgmqJnoaVhoKNh +kJ9Tk51blZ9Ylp9bk55OiYlci55JgpRHfotWkZJci5xZlJtbiZlVk5VWjJpdk59Ug5VMfYRS +g5FSiZNZipRXiZhQi5FUiZVUiZpOhZJXhphYj5lUgpNIdIJHbYFFf4JWiJNSjJVakqFVkp5g +kKFYmaBbkZ5NhZ1KcYxOWmNWVFBQT01gWlDR86D5/+/9//v///////v///////////7///// +//7///j///r///v///////////z///z////9//b////7//n8//bw/vLy/+vi/NTq8+Xg5trW +5dTk/+Pz/vX9//7////0//T+//38//b///76//n///7///////Pp8ubu+ev7//j///7//fH4 +/e/8//f7//j6//v////5+fT4/Ovx9ejt6d28ZXFLRTw9QT9FPzw7Pj0/QTs/QDtERD5FQ0BF +SD1JRUNKQ0RKRD1CRjo/Pzs3QDc8Ozg2PTU1PDw6QDc3OzUyOzY2PTU8ODk4NTU4Ozc2OzUx +OjUzOzc1Pzw7OzU4OTY5QDM1PTY6OTYzPTU6ODYyPDc6Ojs+SDh9akqefFGxkGzAnXTIp37L +nnbBjmvEmXbLoXjGl3LEnni/nXrGmXe4i3KwkHG2i221i2iqgF+ohlqefFmbb1OMbUhzV0BI +PzhFQjs6PTc5OzU3PjI6ODs2PDM7Nzg4RDZBPDo5PDU8QTo2PTc7PDg3Ozg4Pzo4Pj43PDQ3 +PDYwNzQ6PDY2PDM1OjQ1NzI8PzY6NTgvPTU4OTUrPS83NzgrPDI7ODQtOjM8ODYvOjQ9Ojcz +OjVAOzkxQDQ5OzM4Ozg7PjUzNTc3OTc1OTcwOjM3NTU7Qjo9PjpHQj5MRkJbU0FuXktxVkVx +WEiHdFSWdVCjel+afVGnhF7DomrGpHfKoXDJpXbVsXrXsX7TqXvatYLeu4nfv4rdvYjfv47X +pIfHj3WpfGOUeVLSzY7v3KHnz53o2pj598386cnvxZv46Lj2473rvarbrITgs4jOm3jGkXSh +almbaUS7m2DFp3rZvIPXvYa3kXRnUE1FPz82Pjc0PDgzQDQ0OTY1PDAzOTE1OTo1OS84ODox +PDc4QDkyPDE2Ozo4NjY1OzozOjUzPzQ2Ojs2PDk2OTsyQjY1OTs2QDk8Pz86Rjg+R0U6TUU4 +S08+VkxCZmZFg4pMgYVLhoxJiY9Ui49PiZhWkJVTkptXiZJSj59XiplTjJhNgY1XipxQh5NR +h5hQipNSiY9PiYxTio1QiYxViJFVkohZjqVMkpZTjZhXj5lTippVjZdRjZpPkIlRipdRi4pR +hpNJiZJLfYhMgYpLgYNOf4tVfYlIfYdTfYFKgopLg45GeIRMfJBIgIdNfolJf31NfItLg4NU +hZNEgIZZg4pKfolWgI1JhopRiZJRgIxQg4hSh49Kho5Rf41KgYtQhZBLgolPgYZVgoRUh4xN +hopNfIZPfYBKgH1SgIhNfoZViIxIhYxUiI1WholXj5VWkZBXj5ZVipBVj5ZZipNSjZdNi5VN +i5RNipVMi41YjpJRi5RRiZdUj5hQjpVTh5FLg5JNg45Qg5BUfIpIfYdQfodDfYlOe4dHe4NW +fYZJgotQgolPhItQh5BPho9SipFSgJBTioxXio9IiJFUiY1Qi4xbk5RcmJpbmJlbmZ1jm6Jd +kaNYjJlbkqNZlJxTjYlYj5lSiJdKfYdRiZdZjphWj55Wi5RNjpVViZlRi5tJfZRFfIhJhJBN +ho9ViphPjpZbj51Sj51ShphMjJFRiJhVkpRThZVDcINHcXpNe4dMiJVTj5pYkaFXkZlWjp9Y +kaFXj55Vj6RMeJRKWGtMTkxNT0lYWlDT/6n///v///3///n7//n///////7///3///////7/ +///////9//z6/+/9///////5//r3++n5//P5//fi8+Pi89zp+ubp/ObU7tDs/ODu/+zx+uv0 +//L9//z5+e/v9evt8ebq++/y9ejs9uTz/uzx9uz0+Oj+/vr///////37//X09ez///7///// +///3+/L6/erz//b9//j///f4/e718efTbXJBQ0c2PT1EREI8QTo8Pj08PzlAPD8/RDpFQEFE +QT1FQkNLSEJNR0ZLSEJFRD9BQT1CPzw8PDk3OTo7Ozo3OjE1Ozk8NDc5OjU6OT43PTc9OTk3 +NzQ9PTs2OTc7ODw7Ojc7OjwzPzQ/ODkzNzdEOj1HTjuBZkufeVSogmK1imi+k3XAlHfMronP +mXrAl3TSoIHQqYPGmHfClHfLp3/FmXmyj3DAnHq/lnS3i26yiWq2iGeniGCojmiVel5+XUlU +TTtGPj08PDZBOjg+PTw9PDo4Qjo3QTc9Pzo7PTw8PDg/PDxAPD4/OTs+PDw8PD84Pjg8OTs2 +Pjc6OD0yODg9OT4tOjQ+PjwyODs/OT04Ozg+OTo0PDM9ODg+NzM3Pjk7OjU7OTY4Ojo0Ojo6 +ODw7Ozw6PDs3NUE7Ozo9O0A2NzQ4OTo0OTM2OTw2Ozg+QEJFRjZMSEhUSj5pWVNoVUN1WlCI +bFKWeVudfGCgeV2timG8pnDKp3bHpnfGoXTWtHndtYXZr4PZrYDbtYTguojkv4/gvZLku5rT +n33Pl324hWbHtnjcy5zNq4Pj5aP688/37Mf46rb/+dX78s7x0bLs1aH04rriv5vcxaO7lWyu +h1u+onDTsnzcvZDGmnt8WlZLPz88Oj46OjY5Ozw3OjM5Pzg3NzU0Oj83Njc8Pj06OTg0Ozo2 +PjoxPjY3PDswOTc8PTwzOzU6OEA3OTA3Pjw2Ozg6Pz82PTo5QkE5Qzs6QEQ8RUQ4QEg9SUs8 +S0hIb2ZTgo1ViY1OiItPh5NVjJVWhJJVjptVkaFhkKBalaFckKJSjppTi5lUkZxcjZxTj5ta +jJRUhpRNjJFPiZFYhpNTi5dYkppajp5ek6NZiZlfkJZUhZRVjpRXjJpQipZOjpZTiZhSipdU +kJpPh5RTipNOiZFPiZNMjpFOgpRDhopUiZdJh45Rh5ZLi5JUiZdNjJNYiJdSiJpRiJZSjJhP +jZlYj5tWi5pUjppZj5lRjpZYipNSj5RRjplUhpFYjptKiJRTgZhOiI9WiZdKiI1bhZRPhIxY +h5FRj4xUiJpQio1Rh5NUiJRRiZFVgpFVh49RhpZSh5JXgJBNg4xKhY5MgI5Tf5BQe4VNeoxR +hY9MiI1WjZZNiJdRiJZOhpNXgZBKfo9af4pPipJYi5RVipNUgo1Th5VRiZFPi5RVjJJRi5hU +jZNRjZdVjptTiZdLg5JQhI9QgIxXhYpQg45QgY9PhZJQgo9TipdZjJZUi5lbjpZdk6BflZZd +maNbkaJVjp5ViIhPi5xThJZFfYdXjZlXk59cl6ZWhZtSgpFRj5RWjJtNgI1KeoVPhI5Vh5VP +jJVXi5dcjplYjKNUipxaiJdWippZkZ9Rg5dGbYJGbHpLfIhVio9Zj5tRjp9VhaJXjppek6lb +lKFdj6RLgJpMY39OTVJSU0tSXFLR96f///////////////////////////////////////// +/////vb///n///////3///////z9//74//f2/+v+//r///3h8+fg9NHn9unm8uPe7dz5//Tx +//X1/vH5//f9//j5//P///v7//P9//7///////vx/+74/vf///z///////vv/vL9//j4//T/ +//Hw+enu8ufj6tr0/vT///7y+eq9aW49Qj5CQz01QTk/Qzs3PTdBQDc2PThERTU6PTdLRD1J +QUFRRUFKTkdPUEhJSUJIST1CQj9ARDg6PjgzPzY6QDozPzM1QjQzQTU5PTU5PDQ2OzU3PDQ0 +PjY6NzYzPDI4PzU7QDU1QDc0PDQ3OzdUTzaEbkmoilzAmnXCjnS/jWy7kW6+kmm+mXDSsoW6 +j22rhGWyjmy/nnLAknW+nHXMo4K5jWy8lHO3mXOogmmch16hgl+MbldwWlFrWEpvVUl1XkNy +W0BtVD5XSzhEQjg/PjUyPzI+OjZDRDk6OD0zPTU8Pzc4PTg8PDg3Qjg8OzwyPDM8PDQyOzMz +ODk0ODc2OTc3QDk2Oi86OzE2PjUzQTQ1OTg2Oy42PDkyOTA3PDQ0OzI1OzMwOjI3NDszPC44 +PjczPTE7OjYxQTE8ODoxPDM5OzgrOS87PDA2PDhDQT9HRDlOSkBJRzhbTz5jUD5xXEaCaEuN +cVGeeFagfVmmkVy9mG3GoG3KpG/HpGzSo3TWsXfcsH7Ys3ndvIbduIjbuY/mwI3ixJngvJrS +nn/OlHDEg2O9j2e/o3rOyIbk46jx5LT18L/7+NL69c7y5rX59Mjw58Hy577kzrCwgGufg1jD +onPYxJLLoYF/YFRRQUQ5Ozw3PTU5OjcwPjU1Ozg1PjI1PTUwQTUzOTo3PzM6PDU1PzY1Pzcx +OTQxPTc6OzgzOzMzPTkxOzM1PDYzPjU3QTwyOTczQjs3OzU4QUE2Qzc8TEQ8SEE8SkVAS0w7 +VkpOdnVLh4FXh5hTkZZXiZRRholWjJlclJdhl6VbkJhZkZ1bjpxXj5xWjpxMh4xYio5PgYxU +iZJMipRTj5VZlZpXkJhVi5ZPh5BQgZJMjZZRhY1QgY1PiJlPi5FVkZlTkplXlpxRkZdaiZhP +f4pRiJVQiJBLiJRMhYtPjZZNhoxRkJBQhJBRjI9RiJVQjJJSjpFYkZhSjI5VjZpVjZRaipZP +jpJYjZVVkpFSjZdMjI5ThpRNjZJdiJNOi5BUipBTj5JWkplRj5VSkZVZj5NLjI9ZjpdVi5hU +jZpbjZJPiZJUi5JViplRjphQhI1Sh49Nj5NVi45QjY5fi5VNlJtbjZhRipZUkZlbkpZYk55W +lpVXmp9alJhXjJdZkJlTkJ5Ti5ZOj5NTiZRRh5dKipdLiJBPipJMipdGg5NUho5LiJBShZVD +gopQfotNgYZWgIdHhYJYjIlLgYtSjJBPj5lUjptVjJpPjJpRhZdRhYtVjo5SlJZUi5pRi5NW +jZZXkJlOhINRi5hSh5ZHhZRRiZNZkZ1Yk5lUiphOfoxTkJpYippNg5NMgIhKgZNUi45RjJhX +i55UkppYjptTi5ZViJRPkJpakJ5OhZdKdolDcX9LfYZNiJJTiZtTkJpWjaFXlJxXlqNZk6Rc +jaJRhptNa4ZPTVlFTkpaYU/K76T3/+7+//v////////1//P9//3///////////37//n4//f3 +/+7///////3///3///z8//36//L5//H9//b4//jv+Ozn/+zh99Pj8+Dk79nf8uD////z9efy +/Or9//v///3x/+/8//b1/+X5//jz9+7w/O/+//P4//H3//f1//H+//X09+7x9ujp/Oz9/vj3 +//b+//j1+fH9//X1/+/x9unHa3FCREI8QDtBPzs6QTo6PDs6Pzk6Pzk7PjxCQThDQj9LSztM +TENPSEVPS0ZKRkdDRjxKR0E4QzhAPz00QTk/RT82QTVDRDs4RTlHQUA7QjI9QDc1QDU6Ozo9 +OzY2OzE2OzQ2OTY5PDc1PzVbVUKYfFiwkmrJtITNsIzCnnnAoHnJnHW4j2ixg2e5oneccl2y +h2TLkHO/kG+8fmSVdleYd1+DZlaBa0+IaVGCY0mDZE+Kb1CRa1OGaEqDYkmCZUuHZ0uKbE6S +bFGRbkyMX0VWRj07QDJCRztGQzs3QTs3PTU6Qjs6Pi82PDw+PTQ2Ozk4PTIzPDQ0NjY4OTc2 +OzkwPzI8ODg1PTM8OzcxPDQ1OTgyOTMxNzQzOTU4OTYzNzc6OzQ2Ozg0OzU0OTY3NzYzOjk7 +PDg7PzQ2NTY2PDg1Ojk1QTQ1OTU1QDU2ODg8RDhFRTtCRj5LPT1LSDthUEBwXkR8YUqJb02c +eVSdf1eykWLBmXHDnWvJp3THoW7PrHLeun/ds4LcsoDZt4Tbv4vduYnfx5Tix5zkw5njx5Lq +0rLjwp7ToYPKjW25fmC3lmq8o3HV3Jbw6bvs6sXh2KXq57Xt3rXf2J/OqYiZb1Slj2HWv4bN +qIGAZVZJQ0A5PDk4PDg0OzA0PDUvOi03PzgyOzQ7OjoxPTQ6ODszOTQ8PTwvOjA3Pz4zPzE1 +PTwzPDQ1PDcvPTQyOi44PDk2PDUyQDg2PTo5Ozo1PD40PDY7PEM2Qj08SUA3Sz89Wlo4TUJD +ZGlGg4VTho1PholQhpBTkZRgk59amaNekZNXh5RakplXjppXip1RhpRUiJJQhpRTjpxSkp5Z +kJpSgZtUiJVOgIpOf45HhY5NiZVMi5NUi5JPiZlUg5lRiZNXhJZUho5PiJRTiI1ShopOgotO +g5BMg4pKhI1Pg4xPio9RiZFKipFXkZNOjotUipFXiZBLipdck5ZZiplaipNYkJpYkZdUh5NW +ipRQjJ1WiY9MhJlVi5FRiplakJhSh5NNiJJPjZZRjJJSiJNRjJNUipVPipBXh5RTj4xaiZBP +jJBZi5ZXjZRUiZJSi5ZTipFSi5JTjJZQj49Yj5VVjJVYjpVVj5pYkZVZk5tXjpZYkpZXkJdV +j5hZkJtVkZlWj5pTlZtUiplVlphZkZtVk5lZjJpVj5laj51Rj5NVj55Ukptck51Wkptak6BX +mZxZkpxWj55RjJpXjpZQjJZKhJNOhJBMfotRgYxMg49Mf4pUi4pXkZdPjJZRgpRKi4xWjZJS +jZhPhoVOg5dOgY9HfodLhJFUj5tel6NQhZhHf4ZTjZNVjptPe4xLgIlPhI1PiZJWipdTj5lU +i5NQippNiJRTg5JOj5ZdjpxOh5ZMcYU/c3xQfZBOjpBej59UkqBZkqFVi5tYj55Ykp1UkaRV +g5tJdohIVWtDTkdYXU/S/6v///////////v////////////////+///4/+/6//T///b///v9 +//n7//z5//D6//f4//T4//H1/O7y/+zo+uTw/urn/ubk+M3w/O7o9OLl8N3+//T8//3///fu +/+n3/u31/uv4+Ov7/Pz3/fD9//7///37//L+//v39e3p8+ny/uz///39//P6//Px/+77//X9 +//79/fb4/+34//H5/e7SZ3xBPT9COzlAQD09QTo9Qjo7QjVCQD4/QDdIPz5APztGR0FLSD1I +R0JNRz9FRUFLQEBCREFLQz48PjpFQkAyPzpGQDtEQjxCPztDPTxCRjlCQT5CPzo5PDk6PzQ3 +ODsxPDlDQDk0PDRtYEWjf125jnLCnHHRr4jRsYvLn3qyi2qxlGa1iWmZdFWXbVmWcVC4jWzS +nXXYroPQroLBhHGgcVmca1eObk2VcFGid1ucd1ald1ujf1mkemCddVqfelyafFOefVugeF6q +gV+RaU92U0ZJQjhHQDdCPT89PjlBPDc5Pjw7PTc4PDo2PjhBOzo1NzQ3ODozNzUyNjgyPS88 +PjkyOzQ7OjY3QDI6OjUxOzQ6ODY1OTM7OTU2PjY9PTY3OzY5PDM0ODc2PjUzPzc2PzA8PDg2 +Pjo2PDUzOzQ1OjM5ODo1OzM7PzgxPi9BQDs7QzVGQj9GRztTQj9bUT11W0xyXkOCZk+ZdVam +glqxjGPBmHPFn23Eo3DKpXLRrXfcu4PeuITatHzdt3/guoXbsoDWsH/duYrew5fivZTixZfl +zbDp1arwyMLYkoTJe2q8flfAkGm5m2y3p3SzonS6u3SwnXOTbU+balKObk3DqXTMt4iIalhI +RTw9Qzw3PzkzOzc5Ojg4PTk1OzgvPDE7OTsxOS87OjYzOzQ7Pzk1PTU9Pjs1QDQ5Ojc5PD42 +Ojo2OzY1PzM4OjU1PjQ4PTg1PTU3QDw0Pjc0PzQ4PTo3QTg5Q0A4QUE+TEs+VFI9TEs/Xk5P +hpFRi4tUiZFSi45WjZtekphajJ1ZjpdVjZNXjZdPiJJZg5BOiYtWjppYj5hcjZ9UjJJOgJBU +goJOfo1KhI9Lio1Ti5VSkplfkZtTjppciphPgo1Vi4xThpNQjpVOhZFOhJFRg4xUiZJUiZFR +i49WiZpEgopgi5ZKiodYh41PjZRYjJpVjZFalJ5QjY9Yj5ZYjI9RjZRVhJhVipdWiZRYjZdV +jZlYjItTiJdVjppVjppRiplVjJBZi5pRiZZSjZRTjZFPiZBIi5FZh5NVjZJZiZdOi5dTh5ZQ +iZRXkJZakJNgh5hXkptdjZpbjpdSipRZj5hVjpFXkJdekpJekJhZjpZUk5lakJtVlZtZj5la +lJddkplSj5dblJtQjpddkJ9Xj5pdkZ1Wk5xekaBTjZVZj5tXiZhVlplbk5xclZlXkJhalJhc +kZtalZtZkZpgj5tYkppakJpXj5dVjZtTjp1bkZ5Si5hZhpdHg5FQfIhMfYBWgYpGhZBRgpFE +cXZNf4dRiZRPhppPhpZYk5FdlJxbiphNfYhNjJdZhpVHdIxIfolNg4hTho1WiZdUjZpYkZ5U +kZlOiJtLiJBWjJNVj5dTgpdJcYNFcoFTfoVRipJflZ5Yj6NXj6FXjaFbj6FalJxdlKdShJhL +dIxEXXRFSklOWUrE75v+//j///////////v////8//3+//z////////////////4//n3//P9 +///////+//3+//f///32//H6//P///r7//nj8OXW9svq++br+eTl9eTp/+by//D5//z9//P8 +//z///f6+u33//b9/+zu++/x/O3y/er9//3///////P+//7///X9//T///31//H+//bz/ez8 +9/fu9ej1++/09evXb3pEPT87Pjk+PTg8PjY8PThBQThAQTo9QD1ARTlHQzpEQUBNQD9JSDxV +RUNEQj5JQz5APjtNPTw7PzZFQDo/PzxJQj1COjxBPTxEPj5CPzlCPztDQTs/QD00OzI5PTU3 +PjJEQTlUVkeoh2XBnoK6kG/BnnXJpXfXso7OpoLEkHavemGhe1+HV0lmUUeVck+7imnOp4Db +u5TcsYfQo361hGaqimWmc1yohFa1hWWsflutgF6wimS1g2SpflyofmCtiGa2iGish2ixgmih +e16DXUpYSDxJRz8/Pzk4Ozg8PzQ9OTo/QTg8Ozo2QDU7PjczOjQ8PTUuPTM8OTswOjZBOzs2 +PDU+PTg3Ojg7PDkzODU9PDY0Ozc8QjU8PDY9OTU7Pzc5ODI3OTg1OTQ2Pjc0ODc8Pzo9OTk2 +PzI+Pj03OzM+Nzk0PTQ8PTg0OThGPj47QjdGQT8+RDlMQD1UTEBvWEhuWEV+Y1CVdVOlgluz +k2a7mG3FmmrJnWzNpm/SqXbdt33jv4fetoLctIDit4Pguofcs4beuYzavYXjwpTfwJTcu5Tg +xprivqHhwaHbmYrWl3bUj3nRkG7Ki2nAc164cFmxbFSubE+lbFKlhFPRt4WUc2BPRT8/PDs4 +Pzk9Pj83PDI9PDsxPjY4Oj8yPjI+PD4vOjY/PDcxPTRCPzw8Pjk8PTgyPjw1PTY3Ojw3OzY4 +PDQ0PTY3PTU6Pjc6Pjw5QDo4PzE4QDw2PTc6QTs4PzU6Pzk1RDxATUg7Skc/UE9EZllSgY9V +h4tWi5JXhYxdjpxXi5dXj5Jaj5tWipFYjJxViYlWiZpZjZlch5dUhopPgIlMe4dCeYVQf4xQ +iZpXj5NTkJxZj5NMiYxUh45LhotXiJJRhI9XjI5PhJNTh4tWipFOhohPiZlRkJVXiZFOhI9W +jppPh5JYi5BYj5RajZdVkI1fjpJYkKFYiJRRi4dTjZdXiYxZiZFVjZNVkJtakZpWh5RUjZdY +j5ZWhplWjpRVjpZahZNOiphaiZNRiJFZh5VUj5NVipBViJFViZJLioxYj5VQipJWjJJRi5BZ +kJZYj5dakJZZjJhSkJNVk5RUj5dTjpZXi5JLhpJVjJZUjJVckplXjphej5VTjZhXkJxVk5Ze +kJpblpVfl5tXl5dcj55WkJhVjJ1bk5pbkZtYlJdel5tajppclJ5elZ5ak5xelJpYl5dclZpc +lpxclqBimJ5blJlgkZxXlp5gj6RUj5tflJ5YlZpcjJpUkZlij5xOi5pZjJpPhZVNfZBKdHZI +fIVNe5BOi5BZk5xXj5lai5pOe4RIgIlWjZVVhJVIfo1MfohKfYtSh49Wh5dWi5lcjp1Vj5pS +iZpMg5FVj5tbjp5RgpdIcYNDeH9RhIhQjZRaiptZjp5bk5pckpxbj6BWkpxflaRZjZtShZJL +ZnxFTU9UU0zE7Zz9//f///////////////n////////////////////2//P6/+7///////// +//3///37//j4/+74//L3//Ht+ubs9+Pp/+zg9NTg8N3i69Xj89z6/PLu9uLq++jy/+/t7+L3 +/f3///Xs89/r+PD///7///n5++33/On0/ezz//L5//j7//D///7///f9//3///f5//Hq9978 +//3///Ly8OHJeGxEQEI6OjM2PTo6QDU3PTU2OTc4Qjc/PzY9Pjk/PjhBQjRAQDxFQTRCPTZD +PDU6OzU/Ojg1PjU/PTcxOjQ/QTQ6QDRHQDs2PDZCPzY2PDBEOjc6PTc8PjY5PDIzPDQ9PzM7 +QTh3bFK1m3HFmXi6nHG8knDKp3zWsobTsofOo3u8jGuvdVd+TkFWQziEZUmphF7CmHvUsonX +tI3SnnO/imq2hV+xfmGvgVa7lGS3hGeoflu5l2q4kGquhGirjly5knC2imapg2ergF6ie2Fy +VENKRDlDPzs3PjU7ODg9QDQ3OjY6PTc2PTUyPTM1PjI3ODM0NTY0OTMsODA3PDU0PC8zNzYz +Py87PDMzPTA3ODQ1PDI7PTczPTk5ODY3QTo1OzMxOy81ODIwODM7PDMzOzU8PzY1OTc0PDE1 +OjI0PTU2PTU3PTM4PjM3Ozc7QDJIQDc8PzRFQzY7QTFWRT5oWT5wVkxyY0WLbUydhFuwkGK4 +mWvGmmjEmmjRpHLbsoLbsX3iu4LbtYLasHzgtojet4bYtX/atIbbtoPct4neuZDas4XbrobV +tYLWsoPOn3XToXfTnm7OinDGh2XJhmjGiF/DfWizcV2VaU61pW+Qd1hIQDg6PTk4PDI2PDc0 +PjI0PjE1PjQ2OjMzOjU4PjMzOzE2PTYyOy07Ozo0PSs/PT0vOTE9QDwvODU7PTkzPTQ6PjU5 +QTk4PTE3Pjc2QS83Qzg1PjU0PTg6PTU8Qjk3RDo0Pz00Qzg4RDk7ST8+UExBcGhLf35ShYpS +iotUho5YkqBag5lXkJhXj5hXjJJRg41YjJNSiZRLgIhHeYRLeoFKfZRMiJZWj5ZbjJxYjI1W +i45UjpFNiJRNh5BSiJBNjIdLiIxVi4lTipNTjJRRjZRYkJhVh5JWjZJPkJdZjZRQiJJSjJZV +i5BWjotVh5NQjYtSh5BOi45UippOi49SiZZZiIdUipBSi5lVipVajZNbkZNXj41ZjJVOjZJV +iZJNj5JUh45VjZBTiIhNiZFVjJFTjJJak5RRh5JVi5JRgY5Ui5RMjpJUg5NVjZBTjZNPjY5U +i5RRko9ZjZZGi5lZipdVjphbkJtVj5dZj5ZSi5NVk5ldk5NTkZlUjJhWj5RXjZtXkZVSjJpZ +jpVSjZVfmJpRjZpbkZ5Vk5dck5pWlZhalaFXlJdclJ9Vk5Ndk51alZdakZ1akppakZpekZpZ +kp1ckZ9UjZZfmJtckZ5am5xajptYk5RZlZxbj5tcjZhYlZpakZtTjJtXiZxDfJBIcnpEdIRJ +aX9AenJRiYlKho9Yj4xVg5NMhItXi5pShZBPho9JfYdEg4RPjJBTjJhTjJhXipdTiZlWiJNJ +gpBSi5RYj59MfpFGcoBGcXJLgYtTiJRXj5tYk5pYk6Zbj5tWj5taj6JZl5xhkKZSgZtNb4Q/ +TFhTUUTB7Zf+///6//P+//r+//z+//////////3///3////9//v9//r////////8//bz/+z6 +//H7//n+///8///1/+38//P0++zl8uTe9dH2/vPs9ufs8uHv/+nr/+z48e/y8uv0+PH1/u/0 +//T///b///75/+34//X+//vy/+r9//3///P3++/o++j0//P1//b6//H///3///v5/fj///3s +6trg5dnTc3xBQjk/QTg7Pzk5Qzc6QDg1PTU2PDc0Pzk6QTw6PzZEPjk6PjQ7Pjc9PzRDQToz +Py5BPz44QjY/Pzw9OTBBPjo7QTNAPjc/Pzk+PzQ6ODQ8PzE9PzU1PTc6PTQ3PjU4OTQ+STuN +dFq5n3e6lHa9knavkGfEn3nNrn/UrojNqoHPpnvEmXS7eWR2TEFrXEGbfF24k27LqXrTroPR +qX3HmHTDhme2fmKtelq4k2O8jGm0iGm6km+0jGeuimezk2+2lG2wimiriGKrf2SWb09eS0dD +QTQ7QTg3PTAwPDg6Ozg+Qzo8PTUxOjI3OzQvPjM0OjUzPC01PTIvPDE3NzMwPDcyODM6OzY6 +QDc3QDg5OTI1PTQ1PTI1QDY2PTc/RTk3PTY4PzE2OjQ4OTIxPjMwPDI3PjktPjUzOjMxPDM1 +PDgwQDQ2OTY3PTZAQD1BQj1JQzw/QjhGPzU+QTlLRzpiVEN0WkVuXEqDa0uahluoi2KxlWvC +pnDJqHbRq3jVsXrcuYDiv4rhvYbcunzht4jdv4HeuYLauITbuIfZuYfbtY3Wt4jXq47MpnbR +l3LGjGvIiGzAfF29dl++fl27gGK+gl6xeVqfaE+RbkqWfl5HRjs6PTc2OzcwPzEzPTQxQjIx +PDUvPTY4PTYvOjA2Qjs0PC40PDkvQTIyPjczPTM6QjgwPjg2Rzs2Qjs1PTozPjczPTUwQDUy +Qjs2QDc1Qjc2RTk6PDksPzQ3QjYxQzdAQzw2Qzs9Q0EwRTU/VkQ6VU1DbWxFen1TjIxNj41Z +jY9Xj5hSkpRTipRNiZBTi5pUkJhQgINDdYFFhI1Rk5hWkplam5xWkKFXkJVSio5ejZdRi5JS +ipNMi45Ri5lVjY1VjpRVkY5akZxdjpZXkpZZjZtViphTkZhWipRTjJVSjpFTiZxRkotPiI5Q +iYZRio9TiopLjJNVipFQiI9ZkZFPi5NcjZBRjZZZkJFSjZVeippUjo9VjZRPjI9Qh5RWiZFS +jZJLipBRkpFUhZJIi41bjJpOkI5WlI1Wl5RYjpJPj5FSiJZLi41RjJpVj5JSipNRj49Si5NP +kJNWjpRSjpdVipRTj5RbkZVPkpdYk5dUlZlWlJZRlZhhjJVLjpdWkZpQkphYk5hPlJZYlJ1V +i5RVkZlZlZRZk5hSlpZYlZtUj5dalJhZlJpaj5lWjpRVj5lTjJVSjpRUlJhXkplVk5lYlJ1a +lZpWlppUlpdXkptUkZtZkpxUjZVWkJdVkZhQjZlVlZxclJxWj5xWkJpOfpJCbXVGdn5EdIND +dYJHfIdKe4FKhIZPgZBPiZFPi5JYjZZQiZNMfopHgYNSiZVOi5RXjZ5SjppPhJlHhI5Sh5VK +iZNYj5hFgY5IdINEeH9Qh49Vj51Uk6Bbk6BQkJ5ckp5Vkp1Wi6BYk51flqVSjZ5ReYxFXnNT +WE2335b9/+7////////////////+///+//n///////3////////9//r8//f+//j////6//j8 +//X4//j2//T1//Hu/+7o++Ti+t/f/9jf7d7l9dzm7d/s9ePt++f4/vT+//v8//Lz9+/2+vL0 +/Onx++7z/+/6//j5//L+//f8//b///z5/+zx9+3x9e7s7+b3/vHr8uPq++j99fX///33+/L7 +/O/rf4c9QDtCPj4zRjY9RTw2OjQ5Qjw2Pzk7Oj45PDNBPzs4PTRDQzxAPzc/QDg4Pzo9Pjk8 +PDc6PDg3PTQ6PDc4PTRGQzs+PjU+OjY7QDY7PTY1PTI2ODMsPjY6OzgxPTM8Ozg9RDaEeFyy +lHGykHSvjWaxf2S6k2vFo3fQr4bSsofZr4XPo3vGhmapYE9pTT+JY0iphFzAm3LEonTLoXrF +nnvDkne9h2qyd1iwiFm+j2yviWm3i2iqh2e0imaujGi2kW2rimyrimapf2N+VkxLRUA+QDg8 +PTk2PzI/PTg1QTo9PDg4OzYxPDQxOTE0PDY1NzgyOTQ2NjktOS83PDY0PTI4OTg1Ny08Qzw9 +PDY3PDs5OTc5QDY7PjY5QDVEQDozQjU5OTUyODI6PjItPTI4OjU0PDgzOTI6Pzo2OjU5Ozk8 +PjM4Ozg6PDZEPztKQj1VSkFQSz5KRzlAQDlGRTxYT0JnWkduWkd5aUaXfWKdf1ysjme7onLF +oHfNqnTWrIDWtn/dtYPhwYHiwYjkyJPnv5DeupHhu4rasYnbtYnYs4bXtIHSsYfQoYDMn3fN +lW/Fhmy+fmS5f2S8fGO3e2K0cmKfaE+MXEyUg1xYR0U3PjM5Pjw3Pjc4PDYzPjM1PDkwPDM0 +OzgxOTU3PTQ0PjQ2PDI4ODgvPDc3OjQ3PDU5PTg1ODY1RDY8PkE4Qjk7Pz4xPi45PDk3PjE+ +QTs4QTQ/QT4yQDQ4Ozw1PTM4P0I6Qzc8R0U2QTM3Q0A4QUI9W1BHZ3ZNeYZJfYZRgIhSgYNW +ipJPhpNUgZJWj4xVhpBHcodKdYpCh41ak6BXlZ9fkZxUj5hciJtHjZRYjpFRjpZVjJhVj5Fh +kppVj5lblZlXkJhej5lXi5tYkZJTj5ZTi5hViphKi5NOipJRiY5JiY9VhJJSiJVZhI9Fh4tO +gJRGgYVRiJRKj4xWjpBRkZVWjJJRjJVVi5RNho5TiZNWg5FQjJVWhI1Rj5BUipJSiYtUhZBQ +iZFViJRSg4xOhpFSh5FJgpNWhpJQipJWhI9PiJFfiZNSjpVVjZdTkJNUiJNSiZVTjpZOjpZY +jZZVjpVTlJhZkJlTk5dSiJVVk5NYj5lak51YkJlYkJdZkZVYj5hYkZVZkJ1ck5VYmJ5ZlJ5b +l5xckqBZlp1hmJdbmJxck6Baj5tZkJpYkZthlJpTlZ1bkptUlZNbkZtYk5palpxbmZddmKFV +j5tdkJxclZxdk59VlJ1UkJ9PjZdYj5VYipZTjJlVi5VWjJpRj5tThZ5FbXQ/bXlDcX1Dd4JM +hY9LhI9LgpJJcoNNiY5VjI5Xj5lUg5NDeIVPg4ZMh49TjZtWjptTiptMiJZMhJFLg5ZNhpNX +kphOfpFJcoBEc4BRiYlck59WlaRakqBWjJxZlaBUk55XkKJWlJ1glqhUkJ5TfJJDcnZeZWXD +5qX///////////////39//79//r////////8//n6//f8//j+//P///////////////30//Ds +/eXz//L2/+3////2/fXn/Ozg9tbq+uPw/ejt+en3/+/2/Pr49urh9djx/vD9//75/+/1++T3 +/fb7++3y/vH5//D9//z9//j6//n///vx//P///7///////////3///7y+e/x9+jx/ujy9OrT +fn4/Qj1BPT42RT1BQzo6Ojc6Pzs8Ojo6PDg+PTc9PThCOjs8PTVDPzs8PThFOjs2PjBJOzo2 +PC9EODszOzBAPDo6PDU/Oj08OS85Pzc+OjgzODQ7PDc6Pjk7PDsvOzM+PTlJRT9sZU+qg2Sv +imipimiqgl6tiWm6mW/Mqn7StY3Xq4zUtpLfsIzImHa+emWWW0qbblWmfl26jm7Dk3O/kW7C +jXC9iW+4hGa3jGaziWSef2ClfmCnfmOphGeogmWqgGeogmSlfWOTal1jSz9IQD05OzVAOTsx +OzFBQj00QDI2Qzo4PTI0ODUzOjQtOjU2OzYuNTE6ODYwNjQ2ODkwNzc5OTU1PDc+QTQ/Pzs2 +PTY0Pjc8Pjc+QTk8QjhDQkA5OTg0Nzg2PTg2OjQ4QjU3PDc4OjkxNzM3PT00OjY9Pjs3PjU9 +OztCRDlKQz5HRztdSUBNRz1cSj9CPzxCQzdHRUBsVUFoVEd0WUaOdFacgl6okGa3lW3Dp3TI +qXLNqHfPq3PbroDhvYLfxpHow6DmxZXmvJfguIratIjXsYDfs4jdsoHUpoLMonzOn3q/mHO7 +jG+0h2u6gWm1fWerdVydZlWIWVCHaEtpU1A9PTU5OTQ4OjU1OzI3PTQ2PjozPDIzOTgxNzc2 +Ozc0OzU7QDo2PDc7PTsyOys3ODs4PS07OT42Oy84QT1CREBHREE6Pzs1PTA3Oj44QjY7QjdA +PTk6Pjs8PDszOzM3PDg+RjpDQjszQzk6Qz81Rzo6RkU+cWhOY25HhI5Xi5JPiZNUhJRMiI9X +h5NOgZFKc4ZCdX5GgI9SjZpXl5pfkJlbkZpbj5pXjpdOjppThplRjpZXlJRWjZZflZ9Zkp9X +kJhRio9XipFVipNUi5hPiotUiJlMiYFMhpJPh5BRipFRjJNOgpFPhZFRgIhOgotQgI1KiJdR +jZRSh5JSj5VZkppWi5NOipZajZJSiZVcipNJiZRUi5JSjZZai41KiJlUkY9PjJRViY5TiJpP +iJFNhpJTiJFUiZtPj5FYiZNPj5NYiJRRio9dlZlUiphUjJlTjJRZjpNRjJVUi5dQjJhYjppT +kJhXkJZckphWk5dSjppSjZJel51ek5tYkZxXkZ1akpVakZhSjZNYkZhWkplajJhXjZJZkZlZ +kppdlJxUlZlbkplSkZdWjppWkZhVjptWkJtZlptemJxVjZVYk5NXkp9XlJtgkp1alZ1bk5xW +l5hajZhZk5lalKBZkZ1ViphRj5NZiZlTjpNWjZtUjpVXh5xLh5NEaHg8anVEbn1DfHxTh5VN +fYtPjJNNgYxJgI5Oh5VXkJ1QgZBGfYxKgolTjJVUjJhYi5tSiZhQh5lFgY5Pg5FPkJFZjZxH +gJJLcYJAeH5Xi4pWk59hladVjqFRkZtbkZtXkJ5YkqRcl6BdlahajaJPfo9LbX1dc27M5637 +//f///r///b///r////////9//r9//3///7///////////r9//36//T///z///z////9//r5 +//X7//f5//Tu/+3i9+XT88zv+ufr+ebi7t7///r5/+b8//35//P3/ent9OX1+u////Lx/vH/ +//j09en5++vt/+/+//P5//v///z6//X7/PL+//7///L///T4//b19Or+/vz///////TUeolA +RDhDPEA8PzdEPTk7QTdDRTo6Pjc2QDc2OzFBODtBPzpCPDo9QTpBODdBPzdCQTs9PTtBOjo4 +QDY/OTI7OzY9PDk/Ozg/PDY1PzdCOzowPzNBOjs1PDdAPDs6PzFUTUWJa1OWZVWUb1OlfGGf +el+mgmKsiWS3k2/Fo3rLp33VsIPWsYrdrYvbsY/cqIrTnn7Fd2aoaVKec1isgGS2g2a2h2mx +g2SvfmefflqXdFyVcleNbliOb1KbdVyXdmCbdWSpfF6bcV57WFBPQzw/QztEQDlBPjo6PTY5 +QDo9PTxBPjk9Ojg3OzY9ODk3OTQ7PDoyOzU8OjkyOTM9PDgxOS87Ojc2PzhLQz9JSEJHQEM8 +RjpJSD9DQTw8PTpGPz9APTg5OTo5ODU+Ozg2OzQ6Nzg6QDs0PTQ7ODs8PDM/QT5ARTdAPD09 +QjdJP0ViUTtnU0ZlUDxnT05PRDlEQDxMQjxaU0RmT0dwWEWDbU+SelighFyvkWm/mnPHpXLN +qnXLqnXTsojhu4Xjw4vqxprqyJ/syKHnwproworhvYnjvI3YsIjXpoHLoXrKlXW9lHG8lXK4 +iHSrhGaffGOPbFl/Yk+BakxrV04+PTdAPTs5Ozo9Oj06Ozg2OjQ4Ozo5OzI6Ozo2ODo4PTo0 +PC05PT89OjI2PDs0ODA2QDk6PDg5PTw7PT07RjdFRUJNU0hGRENAPjxFSEM5QjBAQD1JSz5H +RkZHUkZGRlBBQT8/RUZMTUtCTEhETEZCSk1GU09Ha2dKenxQgoxQfoVTgoZNe4BRfYxHdIFK +bHJHe4hRiplWjJ1YjJpXj5ZbjJxVi5RZi5pViJpXi59ci5Vgi5pRiZVXi5hSjZlZiZVSiplM +iI5TipVWhZZWiZdQg4pPgZVPho5JiY9Vho9LiJJXiZFMiI1TiJJRipVahpVLhYxRkZNKj5FZ +i5FMh4tXi5ZRi5NZj5JWjpZYjpRViJhOj5BZkpdWiYxYi5lThpBMhpJSipZaio1ZiJRRiJBT +jpdPjZJbjptQi49Wi5VLjZBZjZhWjphaiJhSjZFakZpYjpVZiplbkppclplXi5ZWk5hbjZpV +jpphk5hejZlakKBYj59akJtbjJZVi5lXi5hZj5lek5ZWkZxfkJ1ZkZZjjppSjphhj5hRkJ1k +kJxakaJek5ZekpZZk5dbjZtalJtglaRhlqBfkaNfl6Fhlpxckptbk5xalptbjp9clKFekaBc +lZ9ckJtckp1alZ5fjqBZipRck59SjJlYjZ5fkJVUiphQhJhEcnpGanc9bHVMf4RRhJRKfo5W +kZdTgplQhoxQjJZYj5VKf5NHdIRSiI9VjZRUj51aj6BXj51ViJdMgY5RhpJUi5xZippRgJFG +b39IdYFOho5Xk51ak6BcjaNXi51Zkp9WkKBhkqVZj55il6dVj6RXgplOc4Jadnm+2qT6//T/ +//////////////////////////////////z///////r///v///v////4//X9//v///7////2 +//Py/PHi9+Hz/u7w/+X9//np9uXb5dXx+Oby9Onm/Oj+//v5/+////3+//P0/Orr9OP4/+/+ +//z///38//Pw9e3u/e36/vr////////+//Ty/ej7//Tr/OT6/vf///3+//Xv6+LZgIpGRUEz +QTxMQj49Qz5ERT40Qz9DPj85Ojo7Pjg9PTlARTw9Qzk7Qi9CPjs+Pjk/QUBBQDs+PTc6PjhC +Pjk6QTk8NTU8QDk6PTY7Pjc2PTc/Ozo5PDk8Pjo8PThOUUOdel+rimnElHK+i2yrb1yScFen +fWKti2u5kXO3kXG/oHbFpHjSr4DXt43hu47fvpfeuZTgr4zXooPKhm65c16gbVKXb1aMa1KH +bFR5XEptXE5yU0pvWUx3WE6AYlKLblaaeVycfWSIZVZaSj9IQDs7PzFGQDk5Pzo9NzozQzU+ +PD0vRzo8PDowPDk3Ozc2PDc6OzU4ODM2PDYxODYzNjY1OjgxOjQ+QzhCQj1VT0hCQT5CSj9L +S0VESkFMR0RHQz8+PD80OjI7NT41PjU7PjorOzE8PTk1OzlAPDo1PDZIQ0A7QjdGQT1HRDxL +Rz5kU0RzV0VxXkuDY1RfTkNISDpEQj9SS0JkUD9zX0l7bk6NeluWf12pjGmylGu9o3TNq3XR +rn/QsX7YsInVrYDfv47kxo/wzqLpxaHiuZXht4rfvI/cs4LbrYHWpHvGnXTEmHC+kG20h2is +fWKfc1aYclicdlmPa1VGQj4+PUAzPDU6PTkzPTY6PDkzOzo8QDYxPDcyPDE4OTo0PDU1Ojw4 +Pzw4Pzc0QDg4Pzc2QTo7Qjw7Qjs+RD5ITUNMTUlQSktLSkhKREI9RTs6Pj46RzpKVEdQSkdM +UVBJUk9DTU9MUkpMUUlKSklETklKT1RFV0lPXmtIYGVPbG1Pd3tIbXxLc3pFcHtMd4FKgJBc +kphUkaBWiJlVj5pbkZNZk5hikJxWjJpVi5ROipNWjI1Vi5NRh5JPgpNOiIdUjplMgYpVh49P +iZJRg5JOg5RTiJZLiYpWjJROjI5RhZVMhY5ViphSi5VQipROlZ1WkZxVipZVi5NUkZdOj5NS +jJRVjphTjJdVkJdUjJRWiZhPkJJYiJlNiIpRi5RNh5lUiptNjYlSiZFTj5RVipdLjo1ai5hT +jZZfjpRSkZZVi5ZUiZFKh5NWipRYipdWjZhVjpRTjpdajpRYjZpdi5pUkJdWj51SjJVakJpO +j5BYjZhVjZZbjJpYkJRYi5tWjZddj55WjZlTkZdakZhYlpddj5xYk5tYi5pWiZFdkZhXk5ta +jZlXkZpcjp1bj51ZjpdXkJlTkptek51WjppajpdYk59nkqFSlJ9kmKFVlJxekJdYj51ekZ5V +laBbjpxbkJ5Zk5tVjJlSipVOhZVWipdajphSj5hXhppCb3k+aXw9aXhHentLgpJHfIFTjJJQ +gpJNhpBXkphTiqFNeo1LfohQiJBVjJpXjZtXj59ajp9NiJhRe5FJhI1XjJlSjJROgJJAa4BJ +eoFOipFYlJ9bkqZYj59YkKBZipxWkJxZlJxak6FalaRglKJRiplSeINSenq806D+//f///// +///////7//n9//3///////38//v+//f9//r7//b+//f////7//3y//H8//X4//bx/+nw/O/s ++eT3//jz//bh/t3r8ebl89jf7Nv0//T5/fL1/fL1//T9/fHs/uXr/On9//v6+e3k9Oju/ej+ +//T9//L+//v////9//f6/vP7/+/4//b7/+77+/f+//f78+z8/vf+//L7//DsjZM8RTs7RD84 +QDdAPT08QzZAQDkzQDY/PTo6OzRCOzs2PzJAPDo4OzJHPDs2PjNCPDw4OzM9OTg7PDU8PTJA +RDc4QTQ6PzI3PDM5PDY3OjY8PTk7PDk2PzZNUkGPeFbAm3i8mnjSon/RrX/MnHi4gGCmcVqo +glm6j2yyi2S1im2/k23GoXvYtIbdu5PeupLcu47guZLkx6Hjup7YqIjPmHOfVU5WRUBRRT9h +Rj54TkaLWEOdWkl4T0R6WE57YEuJZEyKZElzUUpLQD1KRDo4OjhBPzc9Qjg2PjE4PTY6QDg8 +Pjw1PjcyOzU0PTQ8OjczOjQ7OzI1OTc2OTE9ODcyOTY4OzVAQzZLS0RRTEZIQkJGQzxST0ZI +RDpHRUNLR0E3QDY6PDk0PjM/Ojs1PTc5OjM6PjU6OTc3OzU8PDk8PjZEQz5GPzg/QDdKRD5o +VER/ZEV2ZkmTeVZ3V0hNRUFHQjxSSjtcUkJ0XEx4ZkyFa1KSeleiil+wkGu6mW7EnnDCpXPP +q3zKrHrVtYXcvIrivY/gwpHowY7oyp/mvJHiuojouoXgtYrarX3ZqXrUpHfNmXbGkW/Bkm6/ +i16whV+uhmR0VExANzo2PDA5PDU1OzM7ODU5Piw2PDU0Oy42Nzc5OzM6OzozOzY4Ozg2QDE7 +Njg1OTY+Qjg+Ojg2Pjg+OzU5QT1NVEZUTExIR0ZJSkZLREVETEQ4QDNGREVJU0ZbV05RU0pS +WVdBS05OWVhVWkxQSEpEUEhNVlZFUUVOXmhCYVpHX3BHaXFNbXJFb3RGe4BPiI5PjZBZkJhW +jZFXkJdUhpNOi5NSg5BRjJJOgpNLhYpRhZZMjY5XiJBPiY9UjJVIiZNTiJRJgJJPiZJQiZBV +ipBUi5BLiI5PiYxPjZZPhZlTipVZjKBViZlTj5pVkZdTkp1Vi5dSh5dTi5dTjJRbipdNh4pW +hpBOgoxXiJJRgotSh5RYhotUh5JMgoNSiJFXiI9PjJJLh5BRjJVYjJhPjJRSiZlUiJRTipZX +hpBTjpVXi5BakZxai5VWjpNaipdOipNfjpVWjpRklptSi5hbkZRQkJZjlZZakJNakZpYj5JY +kJFajJhbkZlcjqBVkJVZiZlWkZpckppdmZhTjplWk5ZUjZtakptXkJxalJxdl51fmqBdlJ9e +lJlZk5tclp9ilpVflJdakplXmJ1UjJlTj5lekZ1WkJNgkplamZpilKBYk5hYkJ9YkJlXj5xY +lZRgjZxZkJlYi5pTjZVYiJxSiZBbjpZSgZVQhZBEbnc/bH9AZnJId3xLfI1Je4hTiZBVhJRN +hIpSjZJRi5ZQe4tIfoNSio5Ti5ZZkpxTj5xXjplJgZFOeY9Jfo5Xi5hXjJtLgI1Gb4BFfIFR +i5Ndl55dkKBXjJ5WjZpYipdXi5phkp1dlZtbjJ5XjZxXi5lKeYRaeH+61qL///////////// +///////////////9//v9//j///////3///n+//3+//v///////z7//b1/e37//X///////36 +//jr+uvd9dHt+Ori7dzs9+fv//H///719e/6/vf4//P///n5//bz/+z9//7////z/fTu7+Lv +/vD+//7///v///3////////7//n///7///X9//L9//T5/+z19OXo7d/WjZk7Qzg9Qj5ISDxE +QjxARDlCPT02QDM4OTY7OzU7OTRBPDZCQDc9Pzk9PjY0OzU4ODM6PTM+Ozc6OjM3PTE5PTA7 +PDY7PjQ/Pjk3Ozo9QDs2OjI6Ozo0Qjd9cFmuk3LFn4S8n3vKoIHOroPYp4XVqoTOnXy8gGer +fFqti2Gvh2exiGe9k23BnnTJo3bKo33QpXzQsIrXsJDUsIrcqIXYtoPTmH+TW0lxTkJnVUWX +c1iffmO4kW67jHO2fWeSYU+GXU5wVEhkTEVLRj1EPzc8PzU6PTY4QjU1ODY8Njk7QTc4PjY6 +ODowPTY6PDc3RDU/PDsxPDA6NjcrOzJAODgtNzA+Ozg8QjhJRD49SEJKQUFBRT5ISTxAQD09 +QThRT0VEQj0+Ozo1PzVAODc2Ojc1OTc3PjY0PTRBPjk9Pjo8Pzs+QTNEPz46PDBJQj5sWj6C +aFF1XEKJclWEY1RPR0BRRj1QRztlVUJ3ZUx9aUp+bU6Cb1CPeVihhF6qjV+5nG+1kGa5nXHI +p3TOs33YtoLasobgs4jdtobjvYblwIzmt4nhsITdrX3XqXzRqXbOpXbRpHbLm2zEkmq9iGG0 +imKifmBQP0JAOzkyPDczOTYyOjQ3OzQ5PTQ4ODk5PDk0OTY3Pjw3PTY4PT81PjIyPDk2PDE1 +Pjs6Pjc8Pzs7Pzg+Rz5GS0ZLVkJXTk9DQjw7PkFGS0JBOz44OzM5QDtDTD1UVU9LU0pJVFFK +VVpIUFNOV01OU05NWFdMVFdIV0lPa3lFWmRLYWFFaGxNbnlMbndLbXdPgn5VhYtShI5ShY1O +iYxRhpJJg45PiJJMh45WippLhpBWhphPj5Jckp9ajZlYip1YhZNWj5lVkJhWkZVVkplRjZNT +iZVXkZRRl5lYiplZlJhVlptXk5RZj5RTi41bkZxUi5paj5pLhphQiJRKh45UipROi4pRfoxN +hoxUhIxPh4lJho1Rg4tTiZNQiJNSjJFQg5NRiJNSj5NTi5JUkJZThZJLiZJUiJRLjI5ahZNR +jZBdj5hZlZZZjpVSi45VjZVUipdYkJhalJFYk5ldj5NWkpdVjpdalJhZk5lhj5lbkZpTjpNZ +lZdVkJVWkZhVjZRUjJdYlJtSjplckZZOiZhcjpVNjplaj5pXlqJdkZlXkp9blpxVlJtdk59a +laFZmZdal5pYlJdalJ9WkptgjZpPjZJZkZZYjZpWjJpZlpldl5tWl59bjphUjZZXlZhhk6Bb +kptVjJ1TjZpPjJZVjppQiI9ViZNNipJLhJRBa3Y6ZXY4am9BdnxHd4FKgYlQj5NTfpVJeoNO +hJBRhJhKeIpJfYZSi5FZjJhZjJZXj5pYjJtNg5ZLfoxOgY1UjptThplOe4pCbn1Je4JJh5Ba +kJ5TkZ9ThJlLjphVg5tSjZJakJpVkJxekqBWkJxVipROfo1TeoKmzZ/7//D+//7///////// +///9//z9//n///////////////////z////2//P9//j///z////9///9//n1//D2/+3y//Ds +/O7j/9zh7dvs++Ty/fDu/+7n8uTy/u3y//Lx//X///v+//T19efr+9/q/e78//3///////z/ +///4//D4//H6//b2//Ly9+jt++z6//Px/vD99ff4//T5++z+//floK5EQ0A8Pz9ERDs7RTxF +Qj41PD1FPzgvOTY6PjQwQDdAQzdAPz1DQzg8PDk4QzU7OjU6Pzc+Ozg6PjQ2PDk1QTY7PTk6 +PTRAQjc0PjY8Ozg8PzY+PDo9R0GNdl2zmXjBl3i8pny9lnXCn3jLrYDTsonar4bSqIbPoHa9 +f2erd1ingVu4jWu2kHC/kXK9k2y8i2/GqoPRsZXXv5rivafixavctZu6iWijc2N9VElwV0h6 +Y0+YdVmjf2OliWiwi3KIaVd0WUxqTUVLPzlAPzkyOjU7Ojo4QDk+OzkvPjJAQTs3QDc7QDcy +Pzg8Pzk1RDo+PTovOjM0PDUvOi44ODUxPTUvPzY7PjxCQj4+QT4+Qzo8QTpBQj07QTk8QzpK +TkBIRUBCRDs7RzxFQT4/Pzo2ODI/OD8sPDFBQTk3QTpAQD47RzxEP0A8PzZMRT1rVEN9YE+F +ZEl2ZEZzYUlSSzxMRjpkWECHbkyDak6DbU2Aa1GAblODb1aOelqbhl6mkGCvlW60lGa7nXfC +q3fOpoHVtXvdtozasILYtYjeuYLftYrapn3cpXzVoXTSpW/SpnfNnXPKlnHFjWe1glywgFyC +ZVE/Qjw2Pjk4OTkzOjQ4PTsuPzQ4PDYsPTI6PzszOzY7PjQ0QDY9PzkyPjg1Ojg1ODw4QTU+ +QjxBRDlGR0FNTEVPTk1SVktUXE9FR0Q6PztCRUE4Ojk5QDk1PTI+RkBERz1GTElGVk1KWGdD +TEZLVlhRWVBSY19STU1RcWtjeIZLXm5LXmdJZGVMZ3JNanNKbnNPc31MdYBOfIhJfItKfYlM +e5JLh5JRipNVjZVWlZ5Wi5ZTi51Uj5RTkZxblZ1Yip9ZkJpPjqJVjppTiJxVjZdRkZZWlZlY +iphWjZlXkZlRjZdckZxMipZXjZ5PiZhYjZpZgZhYjZZTjZRYjZZLio5ViY9PiY5OiJBRiY9U +f4dNiYtNhJBPgpJVjJFNkJFXiY1RipJaho9KjYtZjZZSj5JSiZpOjZBPi5NRi5FYkZVLj5BW +kZVNkJRYkJhTjZdXkplUjJNTkZdQkJJViZVWj5RSj5ZUkpRakpRXk5VZkZpYk5ZekJ9XkZZb +kplSkZxckptWj5hekZtSk5NakZdPj5NVjpRSkplYjplTkJdWk55YjZ1WlpxelphdmZtalZta +kpxYl6BbkZlWkqBalJ1XlaJbkZ9Wk5xckZ1SkpZakJxQjZtYlJpSjpZcjphQlJhbjZ1UlJ5a +lptTjppNi5BVjJNSjI5TkJpTjpVQg5c+cXJBZ3k9ZXFDd3hEe4hMgYZVjZRIe4pCcn5PhIhU +iZFJfodFg4tPh49VipNVjY9SipxTjZhKgpZPgIxLg4xTkZZTi5hKe5FCb3lLfYNMiZFbkZ1V +jp9ViZxOgZtRipJQiZVWjJhZkp5blqRdmKRVj51Vh5RQg4uw06j5//b9//v2/+79//////// +///////////////////////6//T////////////4//n+//X7//r9//n8//b2//Dw/uvm9+bc +89nh8dzd7t7d5df8/+/9/vn///798/Py8enw8+js8Oj7/vL1/fD9//z7//P5/+3+//fz+en7 +//j79/P9//z///35//r///7z+ez4+efp8eH9//X5//X+//PiqK09REY6RD9BRjtASkA9Qjw9 +PjtDQzo8RDpESUBBQ0A9PzdAQ0BIRz1CQUE9Pjo9OjNBPjwzPDZAPTktPzZBPTg1PDU8Pjcz +PTpCQT4vOj0/PjU3QDdBSz6GeF+zkHe7jnSvjG25jnGzkmy+mXTNrH3auJHbu5DetYrcqIPM +l3vEgW2wd1ung1+sh1q0jGi0gmG+nXTCn3jEmXrIqILRvIzdtIi9hWelhV6qgWqNYFVrUEN3 +W0h7YkiNbVJ1XUd1V0ZyWElWSURAQDg4OzU4PzM1PDg1PDg2PTcyOjg5Ojc5PDk0NzY/Pjk2 +Qzw6PTg4PjouQzA2PDExOC41OzQzOzE5Ojc7QDg/PDw7PjZAPzw5RDtAPjs2PjU9QTpDUT9H +R0VNS0FESEFJRUNDPDs6Ozw8PzI5Ozk7QDc5PzxBOjxCPztFPTs/QDRQSz9rV0d4YUqOdlZo +U0ZIQjtiT0R2UkaUcFKQelyTc1uUeF2Nb1t+aVGCak6AclOPfFiegFuhhWWli2Culmuzlm6+ +onbLq3fYtIjYsoHbs4LasX7etIjbr4XXpXzVonDVoXbMpW3Tn2/NmmrFi220flugeWBdT0g6 +P0E2OzszPTQ4OjsyOjUyPTY4Ozc7Ozk2PDc2PDQ4Pjg2ODo5QjwzPzY6Ozg3Pzg/RD47RThN +TUVSUEhWTk5LT0ZMTkk/SUBJRUo2QDw4RDs4Qj05PD02QT9ASUBCREI+Rj5KVVhGUFRHTE1Q +WlZTVl5VYWJPXFRlhoNkf4tZZX5JXXRMX2tQZ3JRbnJLam5WdIJRcX1Odn1XeotLf41Rh5NO +iIxbi5JSjJNUh5tQiZhRiJtTj5NWippUk5BUjp5YkppZk5tZkphSjqBdi55TlaBXj5ROjJVX +kJhajZ1dkpNXjZlVi5dUi5VUiZNRjZlSiZRVipNOipRSipZPjpBVio9WiY1ShpRRjI5YiZFa +hY9OiJhRhoxWiZZUi45Vi5dai45WjZVJh5ZXipdSi5RSiZJUjpJRhpJUj5ZWj5ZVkJdShZRQ +kJVUjJRMjJJUjJVSkZRXiZRQkJRZiZhOio5UiZNXkpFbjpRTkZVVk5palJxYlJlckphWkJlZ +j5lXkJhVkJpdjplXj5pXkJVZkppckphZlJhalKJXjpZclJtZlp5gmJ9YnqJcmKJZl5lglp1X +l6Nfkp5Yk5xbkppcnJ1blaFdkp1bkZVWkphXjZdhl5hXlJpYkZtUjZdTjppUkJVXj5pViphU +kZhUiZlTjZdNgZFJhpFUiZNEgJRPbHc4anlBZ3I+c3tJe4JGg4tWi5FGc5BBdH5Vi5FPhpZN +folMhopUiZhVkppRjppTk59Vj51Ng5NIfYdKho9ZkphZjJtOeYpFdIBMiYJTiZRXjpNUjZ5U +jJlRiZ9PhZNPhJRWjJpTjp1fkqFbl6Jajp1ViJRWg5Kw1aj+//////////////n1//T+//// +//v////////////1//X9//j9//r1//P6//f////////9//X8//n7//j4//Pw/evm+uXg/Nv1 +++z///vw9+v2/+fo68z6//T6//L9//z////+//z///////ny/e/z/e3r9ODl/Oz7//b///z+ +//n5//T4/+/0/+35/fv///n+/+/z6uTt/O36/u3u9d/VsLBAREE9QzpCRjxCRzg2QThORUBC +SUJYSkVFT0hRR0BDSEZcT0NGSz9LRDg8Pzo7QDU8Pzk8QTk6PzU7QzM8Ojc2PzU8QDgzQjdA +QjY8PjQ9Pzc9Qjs+RDtralaojG6ukWyogmWugWOrfV+xjGi/oHTOsIbbs4vgvpbeuZLYsYja +q4fUpYDOkXG5eVuwcVmreVa2hGenf1mzi2e7jGzCoXXEo3mzj2qzgG6dgF2gfGOTalZnUkVk +VUZlT0VhTUJoT0NNS0FNQjw4Pzg0OTRAOzY3PDI5QDY2PjY2OTg2PTM5PTo1PjY5OTs3PTg5 +Pjo1PzQ9PjUzQTI5OzozOjM7OjYxPTU2PTg0PDk9PDQ3PDk+Qjc3Qjk9Pzs5QjNCQj9CQT1J +QD9ERj5IRkJGRj5MRDpBPzpBPTpASDdIQUI8RThIRUA4RDhIQjpJTj5xX0ltVUVyV0dTST9Y +TT2gglilfmWVg1SXel6ZgVimjGmgfWCKb1uBb1F8Z059akuMdlORfVmafGKYflerjmqyl2XA +p3bGqm7RrH3MqXfUqn/YqHjVqXncqX3RnnXOlnLMl2nSm3PMmmvAjGasf1+CZFRKSEc8QjZF +REA3OTI9PTkxOzM5Pz8zOjE8QDkzPjI6PDsuQTU5PDo3PjlCPzk9Qj0/QTo8RDs9PzhKSkpV +Vk5UVVFGSUFBRjtCSDpBRT44Qjg0Pjk2QTs3QDY7RT06RDhASUQ9SzpLUlhFTkxDTkxQVVFU +X2ZTXVRbdGxwhY1riZtpdItRanxRXHNNaGdLaHRLZ2lWcYBeeYRYbX9UfX5VhI5TioxLholZ +i5JQi5VZkpVQjZJWkJNWkZpejZlRj5daj5NZkpVkk5NdlZdZlZZimJpUj5tclJpRjpdcj5hR +jY5cipJRhJFSh5JPiY5VjZJPhY1Sg5FRiYdRiI9Lh5BUhpNOjY9Vi5lLjIpVk49ZhZhgiJdU +kZJbiJpRjplaiZRVjpRVj5dXkZpWkJpPjZVWjpZXipFZjJZHiJRWhJhKiZNThZJLi45Wi5NK +io9YjJVSjphQi5BWh5BOjpJUjpRZi5RWj5dZlJZZjppYkZhXlJtajZhWj5dfk5lUj5dVjpdR +lZZekJ1Xj5pWjppOjZdVkZ9XkplcjphVk5RZkZhVlZpilqFVk6BjmZ1imZ1YkJpekJ5Wjphc +lJpYlJpXkZlaj5xYj5lXkJhXkZlZjZlWjpJXj5dUmJhck55TlJddj5lQkZdfkJhSjJlgj5dS +iZZZipVThI1Ph4xOho9Lf45EZ3A7Z3M8am4+b3dIeH5KgIpTh5VLeIxLgIFRkZNNhZVJfIpT +ioxVjplZjZpWjplZjZhTj59PgZJJfIpUiY1RjppXiphHd4lHcH9JfIJWlZlRk51dkaJTjJpS +hphOgY9RjJJRjZZelqBblJ9ck51XjJlShZRTgo2o1Kb+//j///////////////////////// +//////////////////////////////r///7////8//P3//P9//jw/e7w+ebk9+fV8cns/ezu +9+Xk8dv1+evr9eXr7N30+vH8/vX3//P5/eXg+9vw/ez9//33//P6//z9//z4++39//z7/+/6 +/vL7//z5/fH9//z///////3///v7//v////1+/blwsg9Q0A+QkFDST1ESj9KR0VcUUtTVk5X +UkZKTD9YTU1MT0lYTktFRz1EQT85QDA8PUA6QDI8Pjg/PTk8QTg6QT07QTY2QTs6RDw+Pz09 +Ojk+Pjc9Pzg7QEBNSUR7dVeghWedgWCjeGGWeF2ogWWtjGrHonvKrYPUsYfOsYTatYrXso3a +sYndrIvbro/VpoTWpYvUooPPlHrKhXPAfmOsgl+dglqliWKqjm2dclydf2OWaVh0V0laRTxZ +TERQRD5QREJGQzw/Oz88Pzc3PT48OjY1PDk6Ojc4QDk4OTg1NzM2Nzc3Ozc3OTU1OTY4Njo1 +PTI2OTY2PTI5OzcwOzY2NzU3PTU1NzUyOjY0OTI8PDo6PDY6PDc6PDU+QDg5Qjg9QTk7ODo7 +PTY/QT1DRztNSENDRD5FRkFFQUFERD5GSDhGQT0+RDpKQjxJST9eT0RhT0FYSkJ/YUOgc1aa +fVe1nHGbeWiPdU+0k2u7n3WujWymg2WScVeDZlF+aEiDa1KJcVKNdFmLd1mRe2CUgVyki2mw +mm7CoHbEqXfNqHzKoXnMoXPLpHbRnnPMnm/Gl2zIoG+6jnGwhmCNdFtlbGpOVV1DQz5FRUQ/ +Pzo6PT0zQzU6PjU3OzI7Pjg0Pzc4PDs0Pjc+QT85PzJAQEE5QDM9Q0E1Qi05QT9BR0VPTkhN +SEVFRzw7QD85Pj1AQTw4PzY+RDo9S0I9R0FDQ0JAQUFCQEM/TkNIS01ARkdLS0tQX1tdYWFe +dGZpf4ttkZ92jJtsi5x4j5tsb5FIXGZOY251o6t/qbKGpaljeYpTcIFVc3pTg4VMfYZLg41V +i5JRipRXkZhYipVSj5ZZj5lVmJpci6BNi5lZkppci5BakJxTkZVSkplakJlMkplOjJRVjYxa +jJNPjZNajJlTlpNSkJhTjJNYiZdVh41WiJRTiI9RiZdWiZRKho5ViY5Qg5RZi5RRkppYh5NY +h5JWjppPjppekppVjJdXjJFUiJRPkZFakpJRj5dZipVRjZZdippRio1YkJRQkJNah5VSi5JY +kZxRkJZSipNNiZNWjZBWi5NRiZZYjpFVjJVUkplajJJXlJhgmJpXk5ddlJhYkppdkJpVlZZf +lqBdmZpakZhXlJlWk6BXjphajplZlpZXjqBck5pgkJ5dkqBflqFYmp9blZ9XjJdVkpRblp5d +kZZXj5dbk5pWkJxTjJtVkptUjJdQkZlakJdUkZpelZpUjphaiZhPkJJdkphVipRXiZdMiY5S +iI5MgIxUiZBUipJHeI48ZnA9aHo5ZXFBb3ZIdYFMgIVMho9OeYtHfYVVjpdUhpVKgYZRjJFW +jJtUj5JaippNkZhah5tHf49QeohOh4tekZxMhJVLdopBdYBLgo1alJ5VkKFWkKNVkJpTiplM +gZNSiZJQiptbkZhdk6dfmaRTjZxVh5RZipqq1KL9//z///z///////////////////////// +//////n+//j+//T///////////////////////n5//Xu++fx++j8///p++vg+tf1+/D3+fPp +8+X3//X1+e/4/vz////1++3s/uvy++r9+Pn0/+/0/+z+//z///////v///72/+v1/vH+/vz/ +//////vz++/s/efw/+7y++j6//H///b4//ru09JGRUM8RTpJR0pWVUxaWlVeYk9bWFBQU0NS +TEVMUEZdU0xOTUZVRj9ARjg6Pjc4QDhAPzk0Pjs5Pjw/Rjw9RDlBRz09RDs9Rz48Qjc4PTc6 +QDY2RjlZXEmNZldrUURqXEl7a1GKdVCSc1WaeVysjGm3mGzAmXm9oHjEm3nGqXvUsH/dtoro +vZvnxJ7hvpzgw5fjwZrYs43UtYjUrIHKkX28l3HHlX25g2qtemWLaVGKb1R2VkdhS0NYSEBL +Rz1AQDpGQz44PzU9PDk0PTQ8OTg3PDI+OTk7PDY6Ojk2PDY5OTcyOjg5ODYyPjc6Pjs3PjU1 +PTQyOzU0OjYwOzY8PDsvOzE/OjkzOjM1PDYvNzBBPzsrPjFAODwsODM+PjgwPjc5OzksQDc7 +Pjk7RTU9QTtJTkFOS0lDQz88Pjs7RDVCRT5DRT9JRT5JQzlSS0FaUUB6XE2pj1yukXKee1Wc +jF+Yc1arkGjCpHDFpXzBn266l3KoiGefcl+EZU5+aEeCaU1+cVGGb1OEcFN/bVOHeFKXf1qi +hmKukWi0lm27n3XBnHO/knK7kmy1jmm4mG2zj2iqiGqBc2BcXlRNXWROUk5ETUJTVUpOTkpC +REE4Pz02QDQ2Pzs2RDw4PTw0Pzg9Qzs7RDdAPzk7QT06PjY3QkA6PDU9Pzo1PzNDREFFRT4+ +Qj83Qjk6QEA9Qz1AQUlASUc+UFA/R0ZBSkZCQD44QjhAQ0A5SkJGS0xNWFBcaGtdZ19ujJpu +jp5slJx7oKV4lKd8qKl1hZhHWF1rn5uJpqx8o6yDpaeDqLNid4pTbX5OdX1Rh4dShoZOgodQ +f5FUio5Gi5RZjZ1SipJelZxRi4xhkZpPiplXjZxViZlcjp1Nho9alJpXh5NZkJlTipNVkpdP +j5VWiZRXl6BckpdTjZhXk5pOkZNRjZNMi5BXk5ZSkY9Yh5NLiZFViphUi5RUhplVi5Bai5hV +kJVak5ZSj5FhkJZZi5NWjpdXipRGjIxWi5VUjpZXh5lYhItLjJFVipZVhZFVj5VYjplZiptJ +jI5aio5Oi5NakZdUkJRai5RVkY9YjpxZk5tYk6FajZRaj5dal5pflJxcjZdVkJpelJhXlJtj +kKBYlphdlZtdkJpZkJtbkJ1YkJ5alJ5enaFbkJ1Xlpthmp1al55dlZ9Wkpxfl6BXkJtilJtT +lJpVjplXjptXlZxWk5pbkppbkZlVk5Zbj5ldlJtak5tYkpxcj5hbk5xai5pTjJhXhY5OiY5R +h41PiY1Tj5VKfo5AaW9Aans+ZWtAb3pCdXpGfYZMgItGc4NHd35OioxPgJRLiYpXjZRbmKJY +jptTi5pTjZ1NhZRLeZBKeYRKgotUkJlThpRJeYlHeoVUio5alZxSkJpalaBcjZ1PjpdUg5JM +go5Pj5Vakp9YlKBclKhWkqBTi5dWi5Gh06f6//D///////////////////////////////// +//////////v8//z9//v+//v6//T9//b////////9//z6//P6//D2//fu/+D1/vfr9urd6tfs +/Obz/Ovw/+ny/+/y//L6/fL+//z9/+36//D4//H6//j0/+v4/+73/vP7/+34+/Lx/O/x//Dt +/+ry+e328+/+8/jw+fH4/e3l/uPv8OHc1M5JPkUzQDlMSklRUklaWUxgWVNTXE5STkxNTUVP +TVRTTktRSktFQD86Pjo4OzU1PjY5OzgzOzY9OzU0RDM/RD5IRDc9RD86QTU+PD03PTI7ODU4 +QDRwZ1KuhG2phmifbmB+U0VkWEdvZkqJclKWfl6sjWu2lm+4nne8lnW+nHXOqYHUq4fXsojX +uYrasorTtonYrZrUrJXfsp3WtJfdr47Fl3nRu5DWrJXIo3rDj3qeYVB9U0hjTkNVRz1GRDxJ +QjpGQj09OTg5PjY9PDgzODc0OjE3OTs2OTI4ODoxOi4zNzwzODA2ODo3NTI2OTk2ODAuNDY4 +NjkxPjc0OTczNzc2PTg4OzM2OTYvPTI3PDkzOzgzODUzNjE7NDUyPDQ0NS84PDMxPTA0Pjc3 +PTU0PDI/SDRDREJAOjs7Pzc3QDk6QDo+Ozc8QDRJQEBLSDleUUGOcU2fgFechVaPalKWck21 +lGuzmG+/qXPKroK/o3a+nnm8lm6tkGykfWOPaFR8Xkl1ZE1/bEx/Zk15Yk5yYklyYkhyaE2C +c1WGfVqXiGWbg2SbgmmYf1yYgmeMfF+FfGRbZFBJS1BLWl1MTWA1QDo6Ozw+SDtJTUc8RD01 +QTc7PjkuOzc2RDQ+PzswPzc8QDw+QTtFRkQ9RD9BRkQ2Pjk3PDguOTQ8Ojo3Pzc9QD80PTM8 +RDs2Qjc+Rkk8R0lCTF87SUZAS0c/PEE2Pjo7Oz47Rj04Rz9FUE9WYFlqdIBqipRzjJ9zj5h8 +k5t5laV9lKZ2laNqaopEa2SMrbGFqrSCprR5o6yBqquFoLNdeoFefIVWdYpXfodPgI5ShZJL +jI5ThZZTh5NTjZlWjZtPlZVWh5lVi5NSkZNVjJZYjZxVipxaj51Rj5NZj6JOjJZfhaFVjplW +ip1Yh4tRjZlUipRRiJpQjI9Rj5hZkJVLjJFUi5RTj5NWipdVkZZLjZNVjo9WjJJWh5JQhY9Y +jY5QipVXiJFSjZFaiJJJipdZjpNQiJlYi5tTiZVSi5JMjZZTjY1PkJJUiZlPi5RRipNakJpO +jJRViJdUj5BXiY5Wj5RXkZZVjI5XiZNUj5tUiI5WlJFakpxYjZlVj5pWjp5WjJVWlJpaj5pa +j5xYlJhYlZhWkZVYlZdcjJlVk5dbkppXlJ5fkJ9bkZxak55SkphYjplQjZVXjp9Sk6FZjplT +j5lWkJpTj5ZbkphVjJhTiJhTh5NNi5dakpxWjp1Ti5hSipVSj5dYjpVRhpJOhJBEg4pXjZdH +f4hQhoxCeoBDYW04YnM6YWs8anFGcXxCeoNIeo0+bH5Cd4BQjJdHfY5IgopSjJBTi5hWkJRS +jZdUjJ1PhZg/dYhGdYJIgY1TkJdPg5hDeoVKfYJLhpBcjJ1Wk5tYi6JLhJZVh5hIhZVRhIpN +ipdbkp9blKFfnaJVjJ1ViZdSiZaj1KX+//f////////+//f+//z1//b9//f///////////// +//////z////9///9//j////7//j2//b2/+7////////6//vo++Pj/9nm8+Di+Obr+eb3/e74 +/vz9///r9+/1+evy/fD8/+3z/+j5//Dw+e/0/unw8eXo+eXz/fH7//b9//j5/e3v9+T4/fj/ +///8//n+//v5//X///7//f3///Lr19VQQ0g7QjpKSEdRT0ZXV1FWV01cVk1QU0tOTUlYVk5Z +T0pOS0dCQzs/Qzo7OzkzPzQ/PDo4QTlFRD9ARj1KSUJBSEJGREA3Pjg4PTk3PjI5OzgyQDR5 +Y1Sqhmanimmlf2GdfWKXZVR1UkJxXkd8blCVe12ihmiti26xjGy0j23IpYLCoXjLqn/Oq3/K +ooLPso/ZtZTavZ7hwaXiz7LmxqvJnHvLtYnVuJDRpIXEnHa/lH6vcGWEU0ZkS0RXRj1MQT0+ +Qjc5PjdBQDk4PDQ2PTUxPDQ3ODc0PTI4OTkxOi84OjktNTQ7NzkuPTA9NzkqPDQ7NzYtNzEz +NjYsOzU4NTgsPTMxPTQyNjc1ODQ2ODU3PTc0ODU0OjM2NTQ6PTktPTQxOTQzOjMzOTkyOC80 +OTU0QDg2PT00Ny46Oz03PTE6Pzs5PTM2QDlHQzlFRTxuYUSFbU6GaEyDZ0WUcEusiGO+lW+3 +lm/Cp3PMs4TDrX3Dp3/AonG4mXC0jWOohWWVcFh9WEtpUENkUkViWUhqXEptXUNxWEppXEZl +XkljYExmZE9paFJqa09jYU5SWEtQTkhLUlpSW2VMWlxGUVg1QDo2QjQ7Pzw8Qzw9Qj83QjQ7 +Qzs1Pzo8SFQ5RTs1QTs9Pzg9RT1JT0FHRkI8Qz8zOzY0OTguPDI1OTg4RDg/QDwyPC81Qzw4 +QDg7SERGXFlCSVQ8Skw+Rkk6Oz44Qjw6RkI9QENGSUdMVVFrgod6mKN3laR1jaNslZ55lKV6 +oKt5mKJyjp9jZoJQeHeMrLWPvLaFprF4n7N/nKd/qax4f5hhiY9egY5UfH9Rho9JfIJQiJNP +ipFXkJZRi5lTiZhTkJlVjptTjJZZipxVkJlXjpNVlKBZjJRTk5VXkZtSkpValJpUjZNel5tT +kJBajZNLiZFSkJlOi45WhpFLiJRRj5Vbj5JNhZhWiZhXh5JQipZTiZNWkJhYjphTi5hZjJpU +iZZRh5VJh5JWiZhQipNTjJNUkJdhhZhOhZBWipdUiI5cjpdWj5RRiJlXh49YjZZVjpdLj5NW +i5ZLio9XjJhWj5dYkJJbi5FZjJpWkppXkZRgk5takZxflZ1Zkp1akZpUkplckJhUk5helJ9V +lJpilpdVlJlglqFYkZtal5halJ9XlplbkZ1YmZ9WkpxXkZpdk6NZkphZlJxZlJtbkptWkqBX +kZlWjZ1ckJdYj5RYipxTiKBQiZZXjqBbkJhVjplXi5BTjpdUjJRMhI9Qfo1Ki45XiZhKg4lL +gI9FdYVAZW5BaHE8Ym84Z3FDdoBDeX5HfYg9bHZHen1NiZFNeItLhJJQjZZUlppUjp1Yk5ZX +jZpPhZFGd4hGdoJJg4pWiZVMgpZDc4RHfIJLhZFXlJ1Rkp5ZkJ1LiJhQiJNHh5ZNf5dSjpZY +k51YmJ9ak6RalZ9Wh5hTjZml1bD+//b6//T1//T9//n///j///////////7////////1//r8 +//f////////////5//n6//f+//v1//j6//Xx/u/p++Pl/ePd+djr9+Tr+ejf69r6/e7z/+/6 +/fP2++zq9+T9//zz/+33//H6//b///75//P2+Oz0/vP9//r7/+/7//v//////+38//Lx/Oz+ +//r0//D6//P4//L1/+3s+93a1MpERz86RDhGRkZOUkpWUUtYWE1ZV05MUElRWE1bXUtRVlFb +VUdMRkNSSD9STEZSUEdSVU9bVlBMTUdSTEc9SkJUVERRT0dFRD41QjlAQjc6PDo6QTlxaVKp +hWWjf2WkgWKZd16XfmGee1+YZVl8VUhxX0yBdVCOdl2WgV2jiWW0m26+nHW/mm2+mXe7jWvA +poC/mnjHpX3JnX7Nq4bSqIPFmXLIpHnNtJDPqonLo3jCpHu4n3e6kHqXcGBzUU5URT9EQD09 +Qjc9PzgyPDc3ODUxPjI5PzY0Pzk2PTQwOzQzOTU0OzIxOjg1PDQ5PDgxOzQzOjQwODQ3Ojgs +ODE2OzcvOS81PjYuOTc7OTcuOjQ5PTcvPDQ4PjcxPDQ1OTMvPDMzNzIzPDM3OTU7ODc1QDI2 +QDk3PTE0OzY1PzczQDQ4OTo1PTE/QDRBQjdKRkBQRz1mUUNrVkSSak6lgVm6nWm8oWvVsYrM +qHnQsoLCp3nHqH/BpnnAoG+5m260kGeuh2alfl2haFSIUElzSUFwS0J3T0BoVEdWSTxJQkFD +RD1DR0FCQjxHRUM+Qj5UWWBpenlkdodQXmJNU2I/REg9Oj05QDc9QThATEJISkJAQT06Rz1M +WmVKW2o5RUUyQDg9RztKSUFERUFCR0I7Rj07Pz4uPzQ4OzsxOzM+QTo1QDg8QjoyRTk7Pj40 +QD0+RERBRkI7RT08Qz8yQjU7Pz87SD1FTkhKXlNegY1unJyCoqZ1lqFyjJp1l6J5nqJ3lKJ1 +n6h2jKNcZ3pgio2EqLSDqrV6oq1+oax7mqF8oKGNprNhhIRogYtff4xegYpTg45UhY1MjpRZ +jJlUiIlYjpZXkJJVipxUi5lSj5hUkJhTj5lXjY1ShplVkJlTiZRSjJRRjZVXlIlUl5RRjZRJ +iYpOh5dViZlKiY5NiZJPio5Xg4xOiIZPhJBOhYpUiJJRiZBRi5BRjotZh5JNiZNViI5YiJBS +jJJPiY1OiI9Qi5JVgZNRiplVi5JYkZlWiZlPiJdXlJlQj45VhJFQiZBVjpJTi5NSj45RkZRV +ipZWk5JYjZlPi5NYjJZTjZpcjpVSmJdckptWkZhfl59alp1YlJpakpdXkpxaj5pZlZZZlphg +kptZk5lelpxbnJxcl59SkZZhk59WlZdblJtalZhglZpUlplfkaBYlJhalZxalpRflppblJlW +lZlXk5pakpdYlZlUjZVTjpNZlJpVkptWkZZTjJZUjJVWkJRQhJFJgIhShYlRjZFWhpFGg45L +dY46ZmlDZ3o4aHBDaXc9cnlLeIZKe4dBaXJGg4RSh5ZJfopRkJRTiZdUjJlSjJhUkJdYkZ1O +hpNHd4VCeIRQiIZSjZtNgo5GdYRKhIRQiZpVjZVWjqFOi5dNh5xRipJNhZFShpVOi5lZkp5X +k6hdlaZclqRYiJxVipGj1rL9//b////////////////////////////////5//n9//b////6 +//39//v///////////v9//72//H6//P2//D7//rm++Ph+dns+uvf5tTe8tv///n5//P1/vXz +//P7++7p/ur5//f6//T+//Ly//X///j///j9//X5/+/9//X6//L6//v///X4+/D///3///fy +/+71/uz6+/P9+vL///vy49pLSEJFRkFETz1WVE9SWFBZV09NUkVKSkpLU0hgWFBZWVNaWFVW +Xk9kW1RWXk9dV09TV09ZUUhUUEdJTEBERUJFQz9LS0RAPjc6Qjk7Pzg2PjQ+PzxRV0KZe2OX +e2CjfGOVdV6ZeGGZfV6miGmui3CzgW+YZVB9VFBrWkZ1ZVWHdlibe2OigmepjGWlfWKsiWiw +hm2sjnG1iWzCl3m+nn2yim3Ipn/Uso7MqofTsIrDnny+lHGrg2mdc1yLcVd0Wk1VSDxRSD83 +QjlBPDc1OTQ0Ozg1Nzs5Pjw3OTY2Nzc7ODo1OjQ2OjgzOjY9OjgrPzI0ODYzPDgwPTYsNzQ1 +OzYwOzU0OzM3Nzk1OTI5OTs7OzU1PzcyPDQ0PTg3OjUvQTE6PTU1PDkzPjQ2OjY4Ozk2OTc0 +OjYzPTQ5OjwyPDY5Pjg4PTc4OTZAPT1BRjtVSD9lVECAaEmNglKshWK8kmrNqXLVvIDbt4jY +r4XKqnXKtH/Lq3nFp3e8oG+/nHS/nm7AmXHLqXPSr4LWr4XMm3O8hGalZFF4TkRKQzw+Oz88 +PzY/Qj5TYV9fcXxjdYFjfYRte4hVZ3NKVWE9QkA5PzgyPzg7Pj48RztBR0k/TkJSY2xXeIBY +an1HTFU7QDxETz5VT1NARjw7QT4+Qzk6PT01QDoyOzo2PT44RDw9QTc3PTs3TDo3QT07SERB +S0o7RT47RUU4QjlARUJGUEdYZWpigYh1iJZ2maWApq92o6Z2l6R2lJt3lqp4mZx+oqx3oKh8 +nq18lq2Qs7yHrbSDprZ1pKx/pLB6lqN5n6KFs7F7hZphh4tyk5lujZZagYxOhYxRhpRNg4xb +i5lTi5RZj5NWi5FajpNJi5JYiZdOgo9TjplUgpJGi5JXho5KhYpPgY9Og4pRhpRQiIpPjJFK +gIlFf41Oh4tNiZJRho5KiYhThZRLh41Ugo5EgYJSgo9UiJJVhZFPh4tSiJVTh49Mj5BVjZNW +jpRYiJVNiZdQhpJVi5hWiJdYiY9TjJVSi5hQjZNVipdNhpFUipJMi5FWjJVQiY5ajpROj5Nb +kZZVjphbjZZOjZlajZxWjJZVj5lZk55bl6JkmqFTlZ1ajaFglqBgkKBXkZtZk5takZZgkJ1b +l5phkpxXk5tek55dlJ9flZtbmqFck55bjptil55dlKFZlZtcmaBXlp5ZkphelptWkpxblJtc +kZlZj5tUjJNZhpRSiYlUjJlWjZdVjJhPiJNYi5lQiZZQgZhEfY9LfotSipRUg4tOhJRMc4xD +bG87Z3c+ZW86bHY9bXlCd4BGcIZDbnJIgINUiJZNhJFOhpVSjZlZjZxUiZlfj5lTjZtUgZZD +colPdYRLhYlXh5dLfotMcYdHho1PjJdRjaBYjptZj59QgptKhpJPgo1KhZNYiphXlZtimKZa +mKFbmqpajp9ckZuX1az4//D6//b///////////////////v///z////////////+///+//v/ +//////3///z4/vfv+ub5//H9//bv/en3//D3///t/+H5/fr3//Tw9vH6/+/t/u3r/u7y/u38 +//j4+ev9/vrz/e74//b8//X2//L+//36//P///n7//L///33//D4/vn///b0/+nr7uDy/Oz0 +9ez6/fH9//n7/+3n4tNHRj4/PUNYV05TXFVZU0tRUk1ISkA9SUBJST8+SD5UWFNaX1NhZ1Vd +X1lfW1FSVVRVVExLT0dRTkVFQ0I7QTs+Pjk6Pjk+QDxLTUBHOz4vPzc9Ozw9RTxnX09/b1SU +dF6FcFSMa1KNd1ycf16qh2mzlHi1lnyzjXWmeG2da2SPXFZ/WUp0UkxyWElqWkh6a1OSjF+k +hGegf2elfmidg2LGoITLpYXIqYPEr3/FqIO1lm+ximunkHGfhWyPh3F3aFxMU0ZLSUtDQ0o8 +QUNAPj4vPDk3PDg2Oj03ODc2OTo0OTc3OjkvPDI4OzotPTQ1NjkvOTQ6PDYyOTU2ODgvOTU1 +OTcxPDQ1PTUzOTY7OzQ4PDo3OTcxODg3OjExOzgzPTYyPTQ2Ojk0PDgzPTk0OTc2PTkuODQ4 +OTkuOTE3OT4wPjc8Pjg0PjVAPT1ARjpkR0FrVz6CXlChd06+lmXOsnvatIPZtoTYvIbauYTX +toLYtYnUsIXTqH/TrXzXr3/Zs4Xdu4Divovdw4zevYDdvYTcuY3FoG2se2thSkI9P0Q8QDZO +W1Vld31jfohidX5neodrfI5XZnBQYXBDSFQ8QDw2Qzo7QTw/RkNHUVdac35hfYRifIpddoNP +U207SD1HTExBSEZCQUM1Pzg+Qz41QTg7Ojo0Pzs3PTg0Pzk1Pzo2QUFBVFVDTmA/R0xCSEo9 +RkVGS05VXWpha3xpgY9ukpZ4oKaDpamDoq9/oLGCoa57oa14jqZ3nqN8nLF4oqR+p658oqiD +r62MrLeIqbSIn7N1n7GAqLB7l6J4mKOFqambpcRohYh3mJyJrbB4gKVYhopLhI5PiZJPiZRV +h5FKiZRTh5ZMiJVUhZJLhY1OgIxJgZNMhYxSgpNOhI5Mh5NNiI5LgJFPg4xMfopGfZROg4xK +h5JQh45MhIxUgI1LioxMgo9NhpBPhZJLgIdRiI9RiJVRiZNJho1Ti5RMj5ZVipVPhZdPgZZO +jphUippNjZpZkJlRjpZUjJ1VkZxXjZlQk55bjplZkZNYjJlPjJJVjZdQipdekJ5TkZZfjZhV +ipVhlJtglZhQkpdYkplYj5ZZkppdl59enaJalJ5gk55ekp9bl5pik5tXkZVcjJlOjphej5xU +mZZflJxWk5Zfl6Ral55il59WmJpblKBakp9ajZlUlJdZlZ1ekJxal5tblJtbl5dXjp5Zi55Q +iZRUjZlUiZZQiJFRiYdWjplVjJVUipFUjpBYiJJGh5BMfYlHgoRWipBLgY5UhZJHdIo+Z286 +aHM6Y3A/anhBcX1IeYRAbohFdH9RiJRQhY9QhJFRh5hWkJVYjpdakZ9bj5xSjphRgZVFc4lI +eIhQiZlSh5hOeJBLeYJGiZNUj5dWk6BViJ5TipxNhp1HfZRMfo9PjJFXjJpYmaRcm6hbmaNe +mKdclJ5bkp2X1rH3/+z///////////////////////////////////7///////z////////6 +//n5//f////////////5//n+///2//rm+unX/M7h+9nh9t3k8+Ls9uP49+zt/vP1/+75//H3 +/+7n+d3y/Oj4/vX8//b6//P8+fD+//7///H2//T///74+/L///7///n9//f///7///Px5uf9 +/vzy9+bq7N/j2tFLSEQ/Sz1fWFNUUkxaTk5GS0JCPz09RDxKSEM4PztLTExfYVZiYVlbYFRc +XVVSVUdUTEpLSD5LSEBJQDo2PTk+PzdAQjlNSUpZW1dgUVROQUM3PDlAQT1JSTxUTENbWUdr +XkpwY0V6Y098b06XeFuWg2ClhGSlflyzgWu3hGvBiXXGhXS8e3qxbWWpZWOuZmWqXFuhVVSD +UkpmUUCgh2DCon23l3SzmHaplXSIgGR2dmJocF5mZlpTYldWW1xQUFtPR09CS1JOSFdBTVRI +RlRBQEc4PT82Ojw2PDY6ODY0Njc5OTo2PTY6NzQ2Ozk0OTYxNzU8ODk3Ozo3Pjc3Pjg6OzQ6 +ODk6OTM6Njs8NzM/P0AzOS87OTw4OjM2Ojk9ODQ2PDc5Ojc1OzQ8NTI3QTY6OzcxPTU+Pz05 +Ojk5OTc6Oz47OzhEQjk+QTtLQT1iUEKDZVGYc0y7mmXAmXHGpW7Os3rctoDYvIvcvnzbvILc +vYXau4HauIHVtH7cuHrcuH/au37euYjcwITnx43fwo3atYjLqHXAk26JWVRGQT5ERz9kd3Vn +eoNhdXhnfIhpgo1rg45fbH1Xam9fc3tbW3peVnliaH9ldoxsfopnfohlgo9jgY9ab4BPXnI/ +SkVQT1NJSklERFA6QDk+RD45PTw9QDw5PTg6PTk9QUE8SkxSVmZddHxteYptdZBfaH1oeJRn +eYdwiJVxl6F0iaNylpSDpKx7pq+AprR9oqaEo62Enql9mah3oaN+max4m6WEprKFo6h+payD +pbGIpqyIoLd7nat/oLOEmKx8laCFqaiQtrp6gZNtmJeMsrCVrb5se5ZOhYpYhopNi49UhI1G +hI9TipJJiIxQfoxMf5FTg49Qi5RaiZJSh4pShZNPgpZRho9Oh5ZTko1Vi5RPiJBRh4hRh5JR +iZBYi5RUipNZhZhRjZFXhpRNho9Vh5hTjY5dhp5SiI5bi5ZUiY9VgpNZh5NYiZNViplUjJdW +j5BRipZUjppWkJRYkJtfjZNVkJFXiZRQjZFSi5NRhpVajpNYjZpci51Tj5FZkZNUkZldi5lW +j5xfjZhXjJphkJ9VjJpZlZhakZxglZdak59flphcl6BfkqBgkaBhkp9fjJ1clJZik5xjlp9z +nqmPsL2brsGHqryAobVmn6lij59bl5xgkqBblZ5fkJlcmaBclplWkJdUjphXj5haip1Ti5Rc +iJpKhYxShJRLiI5VjZdQiJRSipRXjpFXhI1KgIxMe4dIeopQg41PfoZSg5RGdItHZ3E/ZnE6 +Z3REa3NGcnxKeYVIdIRJgIRWjZROhI5ViZVSjZdXipNSj5JckJpVj5lbjZ1Lfo5IcIFKf4ZV +i5dQh5NIdoxLfIZRhpBVip5XkJxbkqVTh5xNhpdQgphMeY1Mf49Vk5hhmaVflaRglqBelKBi +l6dckp2X0rP6//L///7///v///////////////////////////////////z5//n1//Xz/Or8 +//79//b5//X+//X9//j7//T5//Pl8+Lc6dHg793q8+Xr9+L5//L9//b9//T4/+zw+/D5/u/4 +//L5/+Lq+en4/u36//Lx/+n5/+78/u78//P7//T3++/8//Ty//P///v9//z/////+fT5+O75 ++/H9//z/+/lRQkA/SD9TVklXVkxTTkVRSz88QjpBRUNJQz1ERDtEU0RdYFBZX0ljV0xXUEVN +Sj9KRkFIQT9CRT87OTc1QDg2QDVKSkNcXE1eZFhlY1ZcYFVXSURBRTlJTERKVkpYT0xVUUCA +XFODYEeFYlWJbVKheWCyhmrEknfRqYHZt5fXvZvivZ/cr5bSpYvUp47Qp4zUqpTIoYesbmFq +UkiBf2F+eGZobVplZmBTWlBRV1hMWFhTW11RU19PUFpLVFxRUGBHT1dJTVpDTlxLTl1DT1JC +SVJFT1Y7RU06Pzg1OTMyPDg5Ojk0PDE0PTAzPDU0PjcyOTM1PTQxPDU6PDcxPjQ2PTgsPzEz +OjUuOzE6OTk1PjQ6PDotPDVEPTUvPDA6OTg2NTY4PzU2OTQ6QTU3PTc2PDI3QDUzPTYzPjc2 +Ozg2OTI5PDZDRDhFQz1WSjtcTEBhVT2DbU6rl1jNqHnOqnTKpnbVtnvZt4PdtH/TuIbTt4Xc +vYLbuofYvn7cu4LduX/lv4rkwIzjxJHoyo7gwYfQsXzEqXS6mnOSblpgTEhWYVhmenxifoBs +fotkgYVrgYptjJFkcIFVcXdheYZhgIVofohpg5BqhZFkgY9cgIdkhJRhgYxgfI1OXWhAR0lL +UUxLUUxCSUk9QkI6PkE3QDg9QD85QjY6QEE5R0BXb35jdYFqjpVxkJxjfIVvjpN8lKJ1kaFz +kZ99naRzkKN3nqh/qKyCprN+qLF5oa6Cp6iCqal4mKJzoqt5oad9nad/oa9/prSAo7GEqrKL +qLGFpLSBnKeLqLGBoad7l6Z+p6eSwbuSjaVkjoiAubOYwMSClqVffYtLi4tXiZJRjpFZjJNW +ipFXh5VPjopRiJNVjJFRiJ1OgpFTjZVSgopNhZRMhJVQhI9OiJFThoxPjZZOipZPjppOg4xK +jZFXkI9SiZJViZlPioxVi5VGh5BXiJBVjY5UkJhSipJVj5dSj5RUjpJSiZBYiJNTjJRRipVR +iJZSj5NUiZJYk5hWiJFVj49RiZVXhpJRipJMiI5Ri5FYipNOiZBThZdRi5BcipVRj5BXkZRW +kY9aj5xVjpJUh51TjpZakZhakZtZlZ1hlaBXkZ1akptajZhYkJhdlZ1dmqCBtbSGurhttql+ +wbyh0ciGvL6At7d3vq+Mpb5XlZ1ik5xYkJdhk5xdlZ1ajZ1Xkp5XiZpQi5dTio1YjpZZlJZb +jptNhpBOhoxSi5JRhpRTjZJRhpFQhI9LfItMeoNNf4VShY5KgYpNiJZHd4M/Z24+ZHA9ZW9B +bnhAdYBMgINBcX1NfYRQjJBPhpBNiJFRjJlUjZZTkJxVkZ1Xj5dRiJdDdo1AcH5NgopTi5NN +hY5KfoFMg4ZPh5RWjJhckqFYlp9YjZpKiZhMf5ZJfJFLhY5TiZZanJxfmqVbmaFdlKNXl59f +naKS0rH+//b///////////////////////z///z///v6//v////9//z///////////////// +//////v9//T8//z6//T2//X1//bt/+L0//Hw/+bl8ejx+eXs/uny/ez1/+v7/vf///7///// +///////u/OTm/+fz/vP+//35/er5//b9/+/9//3/9vDt/en6//Py+er+//3y9/X///7///f6 ++eHY18hISUFAQEFSV0ZXT0tVT0dJRkA9QzhBR0NCTD9EOjxCTEBcSkJbSUJZRkJOSTxLPj1L +OTdCPz8+QTo5Ojk8Pzk/Rz1ZYVVeX1FZZVZfZlNfaFtkZV9dY1ZkZF1cZ1taWVJfXUybgmeg +fmaXeGCdfmWyjXKzjnLImXPIrYHZtI/Xu5Dhv5fXtovQp4XIq4HMqovMpYa8nH6WcGJWW1ZV +WVlQVllMWVpUVmBQVV5QV15OXWRXWGZIW2NNWGRMWmVRV2pHUFxJT1pFV1tPVWRHUllHUl9G +UFxHWWVDTF46Pj43R0k5Qkk0QUEzQTg4QDw1QT42Qj85QTwrPTY3PDkwPjM1OTo2PTU8Ozwv +PDU5Njo0PzU7PTgvPDFAODgyPTM6PDUvOjU5QjU3Pjg0Qzk4Pjg2Pjc0PDcyPDQ1PDg5PTlC +QzlJRztTRzdSTD1aUUJ1Wkl9VkaEWEuVd06/o2rQsn7Pqn7QtXXZu4fdvofat4jeuYLdu4fe +u4HgvIXmyJbozpbsxJHozIjjyozdwIrStX3Iq3bFqni7nnCVel9oZWZhcm5yhYtogItvi5Rr +h4t0i5BuhotmeIhUcHhsgotmgpJqhpFhgJBihIxoh45sgo1kf5BhgYlkeoxNXW9JU05ISklL +U1FHUFVCT1U7RkM3RD00Qj8zRTtDU1lVZ2lnhZdwipRngotyhZlth5t4mqGEo6t0kaFvl6Z+ +pa54maR6n6uEq6yBqbJ7pa6AoKuFq6uDobN6l6B7mat7pKd7m62Aqad7oq17oKF8q6+HqK2F +n7WAn6iHq7CHpbB6laOBo6SLs7aTo65uf49soJOTw8GSqbh1hJtLfX1QhIlMhItXipVbmphQ +i5NPjJNTipVRkJFUjJdSko5ZjpdSjpNTlZlUiplWk5RWkZlRjpVOjpJSkphOkplWjJdLiZNa +kZJNh45Rh41KiI9SipRRioxUjpRRkJdPjJlOippZl5BVkZRWkZZMiIxVj5BYkZdUjJVUlZZL +hoxSjI5Sk5JNj49QjI5RkZVSipJPj5RZipFPiZBRhpJRkJRWj5ROlJtejppVkphfkZ5WkpVc +k5hTkJRalp5ZkZhdk55dlplXlaBdkZpamZpfl51ol6Bkm6FlpKONwsCHwL2cxcluq7GX0seb +zcae08h5pK6AwLWUzMCOs8Flm6pWmp9hlJ1VkZxgj5lUkJpbk5dQiZNPi49YjJFRiZJUiJRM +gIdOgolMhYhThoxNgohRiI9NiZBKfYhFeoRHfX9RiYhMfY5IgI5CdYI9Z2o9Y2o8ZW8/bXFB +cXxLdH1BbndJhIRTjpVSiZdRjJNYjJVRjJlajZlOhpNVjJhQi5NJb4dCeYFPhI5RjJdYhY5K +fYRPi41Si5dZkaFXl6NWk6FXjJpMg5VMf5BGgo1SjZhWiZhTlJhelqFYk5xdlKFYmJ5hmKOY +17P7//D///////////////////////////////r///////////z///v5//j9//j////8//36 +//X////+//z8//js/+fn/+Tf/9jy/e/j+t7w/ej5+uzx/vH6/u3y//f///bt/ev1/uPq+uD2 +/ev7//f///f1/+v2/+/+//3///X///Po/uD5//D6+/j9/vb2++7t/ejw/uf2//L8/+7+//Tq +5dpPSEhCRTlUSkRKSj5NRj1KRz89QTY7RUBJRTlDQkBJR0BdT0BbRTxSRT1MQTxEQzg+PjtB +QTRGQT03PzVARkNTWE9dX1RaX0xiXldeZlJpa2FubWVub2ZtcGNlZVxVVEpfWUyAclaPf2KP +dFeZf12tjHC7jHPCnnnGq4DRronUuIjVuI7ToonLoXjPqozSsprHpoWdhnNtZWhZYmVWX2ZN +XV9UWmdNXWNXXmtRXnBQXm1TYW9SYWxRYXZQYmxPYXBMZHFPWXBPYmxPV2dJVWBNY2hIVmpK +WWlMVGdBSlhbbnlUcIBkaYlGVHBMUm87TFxES1g8Sk09PT43PDk0PDU4Ojc4Ojc5OjgxPDM0 +PDc5Pzc2PDYxPDszOjM1RTk2PTA1PDY0PjMzPDc2PzQ8OD43QTg6ODwvPzQ4PD04QjVJRz9b +UD1mUEZuTkhrUEB5V0KPb0infFquiV+9lGrEpGvOp3nOp3LQr3PYt3vavH7kwYjowo3mx4nd +xYHox4vmypLky5Texovav4PYtYXWs3rNrHXDpW6vlWt3cWRmeHxvhYJ0iJRrho9ufYxrfoVt +iI5nhYtofoBieYFqhYpxhY9wiJBth5ZogpJri5Zth5JtipBqgIplfZBNVmJMUlJOVEpPYmVV +XmlOV2NBREVDR0VESU9FUlNWaXFdfoBzmKZzkJ5zipl9nJ17n6eFqaiGprR3o6h0lap3nKd6 +mKd9nqWHrLGIpbF8pLCBo7CBrKyIqbB5naZ5mql4m6N4nquAq7WFrK6HobB8oqeFp7F+nq+B +paqHr7CLn699nqCBn6iEt7Wjvct5hpdejpZ5tKidwMaOl6lif4tMhIRUg45PiZJVipZWipFM +gIlMiIxRiJVJjpJVi5BMiopWi5lLjpJdkp1PjpJWiJxTj5daiJlKjZlSi5hKiJRYiJlUjZhS +kJBZjZRRjJJQi5VViZRRgZVUjopOjptMio9RjZFYjZZMkJVbkJpVjZRXiJlRkpVYkZNUkZNh +lJ5VjpNThpZUjIlZi5ZSi4xTjo5WiZJMi5JTjZhakZRUipVVj5BVjZdUkJNYiZhZj5tdk6Bc +jZpYk5RilJlak5hhmJpZmJxekppYjZlfl5xamptinqWQzb+HzsCXyL+PxrtqpaVhn55ioqNj +o5xluaOP1L2a08aJv7aJqrldnJZck5Rbl5dbkJpVkphYjZlRkZhThpBQiY9Ti5JVipJOi4pL +fIZQh4lTh5NKiIpRipFOgoVLf4pHc4BFen5Qg4hJhItLgI5AcoA9YGs4Y2s8anFEb3pHeYBE +cYBBdXpLhI9TjJpSi5hajZdUjZpTkplTjJpYkJhYjZtKf5hFcoBCd4JRiI9XipVJfo9Lg4pO +i41Ujp9SlZlamaVRjJlUhpxGgZVKfY1IgpJbkJpckp5bkqBdlp5ck6Fak6FamqBboKab1Lb1 +/+3///3////////////3//X5//H+//z///////////////r////////////+///2/+/6//Xp +/efv++bu++j6//Pl+ufh9NTu/enw/uvp9ufx//f3+O3z/vH4/vL09+rz9ej9/v7///X4//v/ +////////++/y/vH98/L5//f8//L9//r4/vH9//r///7///////n27eb5/fT9//b4/e7q4thJ +RD09PDxESDxNQ0FMRztKPj5DQztCQT9URUJFOjtFQUBUST5PRT9ORThGQjhDPjo3RD1DQUE/ +RztIQkJPVk1iWVRUWVFbWlZUZVdeYl1fbF1ucGlubml0bGRhYldVUE5PT0duXk+Ccl+AZVKI +dVimgWevjm26l3vBonzLrYfKpoLFpH66pX+qmXaYlXKFiG5ydXBlaGpXZmldaXJRYWldW2lW +ZmpOYG1QXGxTaHNSZW5UYW5candVanpQYnRUanVaaoFYbn1WY3lMXGxPZ3dVbH9SYXFMWm9L +WWdLXGZVdXpigItdgI1gdI1aeIxdbYtRYXxUWXg6QFo7Pj0vOjk1PjYxOzc3PDQ2OzkzPDg4 +PTk0ODc5Pjk1Pzw1PDY6OjY0PDQ1PTg1PDc3OzwzODQ6OzozPDY8OTo3Ozg9QEFaVj90XE1/ +YkqEZFWHZ0aXaFaedVe1iGW4h2moiFjBoG/Cm3DOqWvRqnfcv4Hfxo/lyJPjx5Dnw4vnx5Dm +xpDkx5Tev4ndu4fSuIHSrH7NsHvMqH6+oXWTf2xpbHBtf4pkhIhsiopqgZBqgIlogY5phIhr +fo5jg41ufoZog5JshJJsiJNwhJhog5ZqjJRvj5NriJRoiJVgcodLVmJKTlNLUF5ZXV5neYJo +fYpfaYdQXW5OWmhSYXBRbXRlfpRtkp94iqRwjZp7mql9pKKHprmHrLF/mrFxkZt1mK15nKV5 +nq+JrbWGrLSBp65/oLN7oKyCp7V+m6lynKF8m6eIpbCBsKyPsbd/o62DpKuCpauBnK2DqbGO +rrOIqrGCmKR8oqCQtbmbyMOTnK9dgYBulpqGvLeJorNje4pbdo5ShYpPio1Rh5dNiJFPiJRU +iZdMhpFYiJVSipJVjpNVipVXiZJPjZVTiplVk5xXkZ5Sh5JcjplUkZZajJdVjphhkZFRkpNR +ipFRiZJbipRVi5hRkJJVh45YjJRaiZ5VkY9OkJdZj5JTi5dXj51ajJxbjqFZlJthjZxShpRa +j51SiZNYjJxRio1UhZdRjpBYhp1SiYtYipVOh5FUkJdTjZVPipNZiZdUlZZhlJtgmKFYjppZ +kpxUjppZjZpflpxil6Jelp5jmqJhmqVmlZ5qta96vbSIxsGTwLlcoaZnm6RblqBhlZtimJ1g +m51fpKGQ0L2Xx8SFwbVpl6lXjplVj5hWjZhXjZpbj5lYjZdTiJFXiJNMiZFUiZJRgY5KeIVO +e4RNg4tJf4NRgYNMhI1EdoZFdINIdX1HgIdQe4lEeItAboM9Y2ZAX246aGpJbXZEdYNDZ4I7 +eHNNh5VTipZSh5dRi5hSiZZMhpNTjJdOjJlRip9IepVEcHZGfYFRiZdakJpJfJFQg4tSi5Ja +j5tbkKdSkJ5YjaJKippLe5JFeY1Rh45SkpVcj6FVk51fkqBZlqFilqZdlJ1nnKWc2bj9//b/ +//////7////////////////////////9//r///////j///////////////7///////////// +///////////s/e/m/9/0/O3s+Ofo8uf5/+/v9Ovm8+nw/O36/+/6/vP5/+/t/ez1//Lt+ejo +9+H0//T+//P4//P3//T4/vX///z//+zx+fD5/+77//n7//T+9/P29eTx/ev2//Pu2NdERkZA +QjxOR0BBQzlQRD1HRjk+QTtCRz5USEY/PTlBPz1USjxJQDdKPj46Pzs9Qj8wQzdEQkA/Qz1U +UE1TVElYVlFTU0lYVFJWWVBiYlljalZjal9obGBmZlpbXVNOU0tXTUpTU0VuXk92Wkt9Z1WW +fmKfgWSkgWioj2+nkHGUiHiEeXRucWdoZWpcaWZhaWtbZWtbZnBWbHRdaG5VYWtUbG1UaHJW +am9WaXVXaXFWa3FabXZYbHhXbHhXa3tjd4VofoVjeIdcbXlRaHVZc4Baa4Fab3pRanpMYGZZ +dINbb4RPbHtVbnZifo9hfo5cfo1heYxffIRXbYBETGM6PUYzOjY6Njs0PDk4PzsuPjg2PTox +OjkyPzk8Pzg2PDo4ODo6QDk3PEA2Ozg3Pjk1Ozw4PjsuPDk6PDcyQzhASDtYWVBralOHd2OY +gmWfgmGzk2y9kXDGpXfIoHiwgV3BlG3FlGvOqHDKo3DftX/fxYzkxZPoypHqzI/nzJPlxZbh +x5LcvIbZuofRs3rMr3fIq37Cp3SpknBudF9sg4tZaHlESEw/SEVJUE5afHdmgYxkgIFof5Bk +hY9pgoxogItrhI9riZRwjppripZ0kJh2i5hphJFrhpNaa3xOWGNKVl5QYWhidYJng45ukZpj +fpRoepJjg49lco1UcHpoi5ltk5l3nqRylZ98oK51l6CBqLaBp6h/n69wlqB1lal4oah4oayD +rrSGqbR5n6h/o6x9q7SEq7CCoK54l6J3oKqEqrGDqquNr72ErraLp7V+oKmHoa6Br6+Rr7aL +praDm6t4oqeNs7eWwsSYqbdkcoNcgo5qjpZ8p6d6jaFif4lUd4NSi49TiZlSjZVVi5NRiplO +ipVTj5lNiZJRhZJSiI1WjZlRipVPiJtTjY5Vi51SipNRjJtZkZhPi49SipZNjZJUh5dWjIxY +iJhSh5NYjZRLiZJVjJVWio5ch5VPho5UipVYj5NQgpZcjJRWkJpbipJNi5Zai5NSi5RajZdV +iJZUh4xRhJFWjJRTjZdUiphYjJRRiZNQjY9TiZBVjJdRj5hai5lWkZpck5hZkZpYjJ5VlZla +jZtbj51jnaKUwL6ovMmErL5+rrSKsL2ltb5wpauIv7x6qLFloKdxp65mm6dkm6JvmahllqFm +m6Rtu6d7obNxs6p4pLdkl59rnKlclZlgl55ll6JdjZpQiJNWiY9RiY9Yh5VOgo5LfIdPhYlS +iJBMgYhRgopGgYdGdIE/dX1Hcn1Hh4BSfYxIdoxFbH83ZGQ/YXA3Z2hCcHxFeYJEZXlDfHpT +jpVXjZZVipNOiZdLgZBSi5RXj5tWj5lNiJpGdYtGbX1He4JYi5VRiJNJe4lLho1jmJtSjJtY +kJ1Ri51dj6FJg5NPeo1FfIpTg4lSkpZhlaVXmZxbl6VbmqRem6NematfnqeO0rjx/eX+//b/ +//////////////////////////3///////////T///r////////////////0//P2//D4//P4 +//7u/+7p/ujr/uDv+Obw/urr8+n6//f8//X9//35//f4//H1+/f+/P37/+/9//X+//P///z7 +/+/8//nw/en+//v9//T6//P+//z9/ff18+78/fD7/vX7//b///v3/+/49+fe2MdLR0VCPjhK +RTxTSDtRQz9GRjs/RT5FSDxDRDpNQTs6PTZQQjpBSDlQPzo9PjdKRDc9QjhFQTtJS0RKTUJT +Uk9OVkpUS05TVk5iXldfWU5jW1VaZ1RnY1ZbXEtZV0xTVUpSTktLSUNQSUFRTUhWUkhiWlFi +XlBZYVJgYlFja2dpbWtlbXNiZm9XYWpZZ2lXZmhba3FfbHlhc4BhdXhkc31ebXdgbn5Ybndf +bntTbXdZb39Wbnhba3RebXlieYJnfYlneoZfcn5YZ3hhc31ifYpmfIlnf5FmdpFbZH1Pb3Ff +fIxmfpBaZ35aa3ZacH5Yd39geH9kdYdlfI1bcYdJT2o2O0FBODw2Ojo6Ozc3Pjk9Ozo3Ozk9 +RUI4RUg+PD06Pj87QDlARDs5SUM/SD4/QD83Pjs+QDw2QTlDPkNFTUhYWGRidHdzeYJvfYBz +cXuNl4DFsoPNt4DTpX+8jVzWsILasIDdtYPfuovdvYPcxIrgwIbqypHmz5bixIndvYbdwYza +vI3Vt4HSuIXOrnbKqXS7oW6LdmRxgn5mcYRcbG5rbYRlWIRGQ1M/RT5UdWlriJBxhZRlfXxp +f4lvhYxugpNriZNzg5FtgY9ui5F3jZdyjZdpgo9dbHhVaXRXbHhcboNsh4xxkZtqiJJmkZ91 +jZ9tkJ5pgY1jeZNghYxoi5dzmZ11kpx6pah+m6h+pKeEq7R/pKx2lqt1oaV2m6F4n6p8qayH +rLOCprCHqq+GqKyErLKDoq53mqZ9o6mApa6Gp7KLr7aMs7SJrLCEpKyGqbGKr7eQuL2GprN6 +mqWDqauLrLCUurKltr5wgJBbgX1hiI5wnZmJuLV+iJhddYdUd4BQjZBRjJRRhJFUhpRMjpVV +i5BPg5lSio9SjJBVjZdVhphTi5NXiJNRjJBgjJRRjJZVipZVjY5YiZZRiJFYhZRUjYtYjJha +jIxUhphPk5Jal5tXjZhejpVOiZRUjY9RiJtViZZRjY1WkJJVkZdajZRTkJhViZdGipFRh5VN +h41Yi5dLi5FZi5VVi5VbjJNMiJBei5RTi5BYipRUkJJej5hWkJlhi5Zbk5lTkptVkpVbkp1j +lpmU0sfd+eTb792R0Mbl+eTc9uCczMjT89rd8uSX0cbc9OLf9OOz0tTa9N7f7OGfzsXg8ePV +693C5djj9+S00tfM8drX7t6Zx8Pd8t+0zs1Xk5tYjJJNiI1ZiYtTiY9ShIxMeYhJfoZVjJJM +gopThY1JfYtQdYJDdX1Td3tMgYJUfYlGeYhHbIM8W2RBYWg9ZG5EdHNOeIY9aXRKfoNUh45X +jpZVipJViJJPiZJTjZFTkJ1ZjpxOgpRBb4FEc31KhIJViplUgIxPhItcjpJckp1dmJxdl6Rb +jqJTjJRTgphJe45Od4RVhopbk5pdnaRgmalgmqhflKVenaVemqRhm6CQ0bX+//b///////// +//////7///////////////////7///v////////////////5//r1/Oz8//j////9//3m++L2 +/er3//ro/dj0//Xj8t3e79Xz++n3/vTt/ebt/ef4/+/9//Du/eb5//L8//f9//z///77//X+ +//T7//v7//L89ev0++32/+3+//r///39/eru++n6/fL7//L2++X2/vP98PJNQ0NEQztARztS +RUFNRztKQkA/RzRIQkA7QDREQT47Pi9GQz5DQDZKPDpBPjk6PDdDQDxBRT9MTENQTEVPVUxS +V0tTTUlWVk1dU1BbU01eVk1cWlFVWFBcUkxQTkdSTUpQSkdPSkNKSkVVSktMU1FZVVRYWV1a +V11YVmBaZmxdbHVabHdYZ3VTYm1aaXVWa2tbcHhhcXxgc35hdn9neoNmfIZgcX9gcHxca3db +c3thcHpfcoFdcn1jdIZne4ple4pje4dab35gbXVgfYRqhZBphpZziJdmhI5rhZdcdotVan5a +fH5edYVUY3RRZ3RMYGxTZnFTb3hfdn1bdHxSX3U/RVM9Nz86Ojg0PDU+PDY3Qjw6Qj9DU1BA +RlI+R0Q9PzxBQj07Qj5CO0A9RTpBP0M8Pzw/Ojk7Qj1GR0hUYFtXW2VhdHlwfI5mandmbHhv +gnyJkomhm3nFmm7EpXHYvYfhvojix5Poy5DkyJTgworpxZPlx4nly43dwIbmvYzbvIfbu4rW +toHWsX/Nr3zHp3eqlHJ1cWphf396g5Vne4pxi5J8kJxsc5FOV2xEUE5efXJsfolqgotuiZRl +fo5pfYZphpBrgIpriY1tgZNshYl0h5Rkd35ld4hkeoZnf41pfpBsiZlfeoBvmaR8nqd2l6p1 +kKZsi5Fsh5xab35khY1viphskJd5pqiAoLGAoq6Jq7WIqLZ3n6d1n6p2nad5kaN7paqMrbmB +p7CGq7OBpaqGpbKGpqt8l6V8prCIpq6CpLOEqbOKqbiDrLOAoq6DqKqMsreYtL6JpK18oaqC +qrCOtKqUurypysmBjZhheIJkhYVzl5txj5V2k5lug41ZcoZWeYRSh5RYiIlSi41WjZFYi5JX +hpNTj5paiJNRjJVVi5JQkZJYh5dViZNVj5hSlJVVipNakI5RiJhRi5ZTiZZYiolLiJZZh5FE +iI1ViI9Xi5VciZVOhJFUh4pSgotUjpJRho1RiZVWhpVLiZJYfpJUjItaiZVPiZJUi5JJhoxV +h5BPiZBPhZJUi49Zio5Xio1TiI5SjpNXhZJRiJFYjJNVjZZTi5FVipZbj5dTkZlek51hraTI +8drY9OCcwsbC8tPg/ea75NPI89vl/uPM39m06s7o/ufB4tnM9N7l/ua73NfT+Nro/+mv2M7T ++d7f8uPC69Tg/OScy8nF7tbO6NtwmaZbjJNZjpZUipJPiZBXjJdMhYhQgYpJgYhWiI1RgohX +gohIeohNcYI/cX1Gd35MgIZRf4dMeo5Eans6YWk+YGdEZWxCcXVFbXxCa3BIfYFVj5BQhpNR +g5RLiJFViJhSiZNZkZ5OjJdQe5A5aXpIdH1LiY5ciZpIfYpTgY5Ui41bkpxcmKJZkZxajJ9S +iplQfYxGeIZLhYpTjZVelJ9dnadfmKNim6ZdmqVgn6pgm6lgn6d8x6b3/+X+//X///3///// +///////////////////////7//T+//T///3///////////////////7z//D5//P9//n///zw +/uze+dLm8+Ls9uH2//Tx/Or19fL29+7q/fD3/u/z/PT08efk+OHs9Ovt/ej5//Pu+ef1/vLz ++eno/ur8//j5/+39//f7//T7//P+//v///319+vx/fD///L5//Hx4NxHRUM6RDpGQD1NQTtA +Q0BGQTkzOjVCQDg6PDo+QD02PTs6Ozg5QDg7QTM3Pzk2Pzs6QTw8ST1FSUNETUJJT0ZJS0VP +TUpMTURTTUNSTUFVTkRNT0ZPSUNHS0dMSUJETEZHRztGSUVESUdJUlVKUFpOVFxQWF1PVVxP +Vl1UYmpYa3VSanlaa3hOYnFYb3hYcHhWaXlbdHpidoFZcX1jdYFfeIFlfIxedIRgcodebnxZ +c31ie4JjeIZoeIpmfYtjfohgeIZXbntid4VkfohuiZdxiJdwiJ1niJRugpVggophfYxYb4hQ +XGxMamRObGc/Xl1IZVlXc3pdbotSboFabYFRaXhNY3RNY3FVandGT2tGU2RGVW9HX2lDSFQ2 +QEA2PjczOzo2QDlASUdBR0U9RUw6SUk6P0g+QD1LSVpRWmFbZHFXgWx0iI9cen9ugIxrg4tx +iIR5fIaPmHqxlm/QrojRvYfhx4zmzZnozJ7fw43lx43jzI3hxYviwofixpfav4bcuovOtXvJ +rnvCq3aqo4aBio9wdYaBl599jJxvhpR+m6l+mqhtfY1ziZ9ZWHc8Q0lEWkxbentkhY9niJVu +gY5vh5VsjJduipBsh5pthZRvio1qhpVuhpVlipVoipNXeXpjg49tjaJvjp1tkaZvmqJ2lqVx +maRyjqdjd45TcnxgiopsjKN4oaSDprGCqa2Eq7SHqbJ3nap2kqx4oKhwlqhwm6CDqbN9payH +prmBp7CCprSCqa1wlqWCqKuArLCFq62FsqiPuLeGrLF+pa99rrGOubuivrqKoad/oaV7oauM +r7STtbiiwsKMmapke4BTe35jhYhljZNtkJ5jfYlefYdWcolRgYNRhItMhZJThpNRipJYiZVM +h5NVjphLkJJaj51QiY5TjJVNiJZTkJhMjJNZi5NPi5VUi5dTiZRKfopOhoZUhpBRhJBRh5dP +gJZSh5RNh4xSiItRh5NQiZVGhY1TiJdRhJdTiJJOiJFViJdLjZJSgZpNjZJQh5ZKiI5UkZVH +iI1ViJdSipZUiZVUiZdbjJNSh5FUjpRZipZPjZhYjp1YkZpTiJtWi5ZWkphalZhluaR1yaxx +u6x3zbWP4rmT0r2A1rer7dCj6M+n482y9dG96dea38fA+Nmy2syh4MnI+tie0Maq58rH892L +ysC/9tiv0M2b4b+h4sVqmqBXiJNTioxTi49WipFOhotTiI5DfYVMfIpFeIVQh4dLhItSg4dF +eopEboE/a35Kc39FfohMf4lKfIdAbn48XmI7ZWw5Y3FAd3dAYns7a2pJf4dPjJVVipZMiZ1M +ipZQjZxRi5RWjplUhpRGc4s9anZNfoJTjZVShpZOhItShpZTjZtTi55YlKFUlJxXl6ZKgZhK +eZNEdoZHf45PipVglZ9ZlaNhmahcnaRdnKxgnKZdmqdfo6WAvqz9/+L///////////////// +//3///7///z////////////////////+//z1//X5//f+//v///z7//39//j9//j7//zl+Ovd +8dTr9+ns9ujl9OD7/+zy/+37//r0/+v8//bu/+T+//3//u/3//f+//T0/+f4/vH9//T///v1 +//Lz//D6/vL+//v///X6//r///X+//r08en3/vb9//Ly/+zi38xIRD5DQDw/RjlIRDhCQjtL +RTxGQz48PDY8Qzg1PjM6QTg1QzI+PTc7PjE8Qjg3PjdFQTpCRTxERTpHSDtIS0FKTkNOR0BK +RkBNSz1LTEJOSEFHRTxKQzw8R0NJRDpFSz9KSUA+RURBRk1FVFVQUldGVFJVWmNKVV9PVWJN +ZGpdc3VjdYBic39Ua3FdbHZZcHhgcH1mf4ZpfIxje4FreYdmfIdmf4prfYVjdoVfeoFicIVl +eH9jeIZoiJJohI9feoZkcYFVcn1ogYxoh5Jwh5Vvi5l5i5hohZFwhZFafodlfIdfe45gcYFU +bnhSYXlFX3JOWW5NWGxPaXdNbnhZe3lceoFXc3hSdnRab31IbWdBVEw+Q0JAPko4QEE9P0A2 +Pz1EPT80PjpAPkA7RUBHS0xFVFRFRVM5SERTYGZYamRXZXZaaGN0jJhviZN8mJp0jJlth4t/ +gJR/fJVygXmfpnnOtoHdwozjw5LoxZPcyIrlx5Thy4vixYzawIXbvY/Us3nRtIDMqXq4oXiS +n4iGmZqFkZt4jJSEoaV7mKSBm5mRr7Z/n6pmfYSLn65maYtJV21BRF86TUZFXlVFcVxdh3ho +jotlh41Yh3dXe2lJb15TdnBXcnhWcG1Yan1ZcoFie49fhIxliJFYfoVbeYRjhI9xlp1zmql1 +lqdvi6FgbYpfhIlpjpZ3nKaAp6qCq7KEqauEprR4l6h0k6Z5mqZzmq13mKKDqrKHpbF9orCF +qrWCqLODp650maF7oqyBqaqCp7KBpK6Eq62LsbeBoq+Iq7GLrLmMsLV+n6uBnamDpqyKsbKK +tbuavsWdpblvfIhWcXhXfINcg4ljiZNugI5ZfHtecoFVcH5Vg4dOi4tPgohKioxSiI5JhYNU +h5lPjo5Sh5RUhopQhIxQh4hSi5lPhIpUi5dXiZFPg5JOh4xRh49KiY1MiZBQiJNSgpJNgI5R +go1NhpVRiI9Kh5BRhYxLg4RTgpBMh4lRhopOhYtShZJPjIpbjJROj5NXhZFQjJFUhJFYhIpJ +h41Qg4dShItQio5Lio9LiY5Vho5LiY1Vj5JTkJJZjpFYk5hYipNTk5RhkptSk5Vikplak5Ze +k5pbmplimaGNwbiGqbdmqZ+AqrRrnaRtoqtmmKNcop1jo6Fgo5xnqJ5loKJvrKCTwbydwsSq +28qHvbtZlJtXkJRXjpVWiZVah5FJioxShoxLfodWhopEfYZMd4NEe4NOhodPhYtOgoZLf4lF +dHlCbnRBbHNHfH5RgYhNe4k/aX0/YGE2YmhDZ2dDdXw/XmtAdHZVh41TjZtUiZVXhJVSiIxR +ipNXjppYkZtOfJM9a3lDbnlOhIlWjJJQgoxYh41PjZVWjZNTlJpYkp1UlJlWiZRNg5RGd4lJ +d4NKhIRWkJVYnKRhlqFfmKBdlaFhoKJfm6RdmZxlnqN4tKv6/+L///////////////////// +///////9//z8//b///z///v///3///r///3///////n///z8//v6//j1//Xv/e3m/+Tr/9ry +//Hn/OHk+d7y/fD7/PX1/vHv/eLi7dz0+O/0/vL//+vt/efh+eT9//v+//Xz/+77//Hy/+/9 +//f9//z///P1/fDy//Hy9uft/un6+vb///389+vv8uLv4d9LQkE3QD5BPDo/PUE5QTdDRDk+ +QDU0Ozw6Pj06PDY4QDk/PDc4PTY9Qzo2OTU9RDs1RTlDRkJBRUBDRkA+Rj9DQz5BRT1BQkNB +Qz1HREE/Rj1BODs+RD1DREE9Rjw+SEZDRkY7SUs/SEw/UFJKTltHUlpOWmVMUmNLWGNUa3tX +b3tfdIRWc3pTaHVTb31bbX1Zc39tfJNif4dne49nfolmfIpef4dngpNheIxleIhjeIVic4Zl +fohph5FlgJJqfI9bc4Jie4dqiJNsiZVtipJyiJxqiph1h5Vng5VoeYlef4pug5heeYxkcYRP +aXxSY3NQa3RfcoZZbX9ab31XaXxSa31TbnlPandMWnc5RFU7TVlGU2lGVWk7RF04RUU7QEg5 +QEI4PkQ2Pzw8QUY7RkFTT2g/Rk1IXF5KUGlBVFFETldrh4OCn6RvhJ9dcnxde350ipN3mJWI +oKt7epp/e4rBrXzfx43hy4rdworZvYrYu3/Zw4zUvYPWwIjSt4HVsYbPsn+4pXiOloeFmaN1 +jpZ2j5V1mpWFqKOEm6mKrKuNq7SAn6pzhYeVsbpyfJhgdI1abn5UZIREV2lUd3qDm6lxdphV +XHZic41ie41gdYZkg5BrjJdujZhpiJZheYdffYVfbYRZeIJjfYlgfo9lh5Rqj5Zuj6Bzmal2 +kKRnfphaeoFniZRwlqV7oqx5obCIrK+GprN4nKd5mql1mql3oqtxk6B9pqmJqrWKp7WDpq1+ +pbaCqLN8mK15prCBp6+Aqq6Ap7KFrrGKsbSGpbGDqK2AqKeMtbV9oqaCnq1/oaeEpa2KtLOe +xMSoscV5iKBfe4lVb35ifI5hgY1nhI5cfH1Tc4FVd31Tcn1QfopJg4xQh4pBe4JMfY1GfIlP +hZNQhZBRf4tBgIFVfZFFhIVRh5JKh5RQhI9JhYxIg41GgIhQholPfIhPg49MhI9NgI5JgIpK +gYlJfYpNgZFLgo9Qf45HfoxGhIlNh4xNfpBIhY5RgpBJhYtSg45KfolKgo9JgIpSg5FOgY5L +h49Rh45TiZtJipBMho1LhotOhpJUhI1VkJFRiZFQiJJRiJNTjZVQjpNZk5Nhn5yku8WPnrdf +kpVipqXG7dett810oq+RzsG/4dOk6M6rsMVhm51gmKFqnqV0qa+8yNHB3dnJ6Nm559J3pq5W +kpNckphOkJBThZNJiIxUio5Qj5JQho9Og4xNgIlJd4ZJeYFEdoNHeYVMiYtMgI1Mf49Gb4U3 +bXJBaW9DfoBOgY1GfYxEaH84WmI+XGw7bG1HcIA0XmlBdHlQio5Oh5NMhZJMh5ZLho5SiZZP +iZVOg5hCd4Y9bXVEd39Wi49WjZFCgYxTi49PiplXjppYkZ9TjZlUjJZOiJROfpRAdIVKeYlN +jZBXkJxVl6BflKJalaJakp5fnp9emqJcl6FhnKJ3yK/9/+b///3///z///////////////// +///////////////+//7+//j////////////6//32//P4//b8//n1/+7t+uzn+Ond/dby/PDt ++Ozs9eP3/+bw/ef9/f37//v///79//P5/ezy9fL///7////7/+n0/fT1/vLz//b7/+73/uz2 +/+fy/e/1/fP7/vn///7y+efu9Ov19/H+//3////u8txbR082QThDQDk4PzY/Pzw8Sz08Qzc2 +Pzg8Qjc8RTc2RTU3QTc5PTY5Qjg2RDc+Qj1DQTk+RDlCQjxARDpEPzw/QjtARD4/PjdCRT87 +PjY/QD43RTQ7Pjw9RTlBQkI/RD1FR0g/SkpGTE89U1VSV2JFVV1JWGJVXHFPZHJadnxld4Ra +doJfbn9RbnxbcHtdb3thcIJpgI1kfo1pgI9rf45mhIZpg4tigYxfeIhif4hrho5hf4Zke4Ri +fIprgI5hfoldd4pjgo9ohZFziJhvjJR3jZpzjJh0jplrgZNjeodogI1jho1thJBidIVccXxN +bHhjeohgeYpldo9beYVgb4RRcnlneYJadoJeboVDU2xHVFxHWGFLXGlFTWQ6R1I/RkxGTlY9 +Q0RBS1A+RE1FVFpIWV1ARU1IU1JEUVtHUFFKW2h6lpSHn7Nsg5JbcnZVbGdyhI53jpJ7mZ+O +pKehqbXKsYrYv4zfvYndvIfVt4LXuYfdvYXUwYDXvoHVtIPRs3+2o3x+hX2BlZl2lJpxipR4 +i5V8l5iDn6WCm6KRr7GVr7mCnK91ioeRsbR4hpNvg5JthJFdbolLXW5acXmDpZ+EiqdgfIJt +hplpjZVmfZNkgY1qjJRwjpxohJJifoxmhY9ufZR0jJp1j6R3k5x1kqZ1k5puk6dxkJ1xmKZ1 +jKFWa3xlkZNrlp18nat6pquEqLN+q7F+pbF1naZ3nKJ4n6d0mKd3m6eFqbeDqrOHrLWFqrB+ +r7V8ma15mKeDqK2Bqq2JsLOIqrWNsruNqLqFrqqJp6+IrbN/o6Z9naKAo6t9pqiNtLOSwrun +wcZ8l5p4k5tadn1agoljfY1if4pafIFcd4VTdX9UdHpKd35SfYBJeIFKgIdMfYRGgIpFgIhK +gYZFgYlMf4hEfohRhn9FfoNMf4pKhodLfY9Gh4VUeolFhoFQf4hCf4VOfIdLgIRKg41JhIxN +gIhRholEhZBGfopLfolKh4xUhoxIe4RQiIlGgolLhI9QgIxQiYpKg45Sgo1IgotSgpNIhYxQ +hIxOhoRZh5BIh49QhpNKgYxQipRMiZRVjJdNh45SiZBXj5NSj5FYkJWMz7es2s/A0ctsnqpv +vKu26dS14tas1se96s2szsuw5syduMSOqbeg2MrX7eLH5trD8NKZ48uy59CPwr1Ul5VZjZlb +lpdYkJ1UjpRNho1Hio1Qg45MiYtMfpBMhIlNf4lMeYdHeH9Bc4dNhIVOg4xNfYZJdYY9Ym48 +Z2hDd2xPg4hMfYU7ZX0/Xl05YWdAbGtGcnk7XGo9e3hViptNiJBOhJdGhYxKgY5Iio5Rh5dP +gpNDbII5anNKd35VjJNPhJZRi49Rh5ZUj5hYkZ5Xk5xWkqFWiZdKhpBOfItEcopJfoVTjZVc +mpxamqValZ9fl55bnaNflqNamaNglKdcpaiFvbj9/9n///////////////////////////// +//////////////r////8//v3//Xz/vL2/PH+//n///z////z//Px//Tn/+Xk+t3o/+Xr++jt +/erv/e/y/Onx/+70//Pt+ej4/evx//H4//Px//Tu++br8+n0+Ofx/+/4+/H1//T9//r5//P6 +/+/3/fH1/+j3//P4//T///j+//T1//b09eTj49hHSEU9QTs7PjNBQjg8Pzg4Pzk6PjkzQDo7 +QDQ1QTg2Qzg5Ozo2Pzg4QDc1RDk2QDI6Pzg/QDs7Qzs8Pz06Pzo/Pjs5RTc6QDg1QjM7PTc1 +QjM7Ozk3QTU8PTs7PzxBRUNAS1BGS1hBU1w/S1NFV15NVmFLVGVxfpB9h59eeohmfoFeeYZa +coVXb3xccntdd39fdH9pfYxpgYxphZBogZBxh5RpgY1sgJJkfoxtgpNmgIxseotkeIJle4dk +fYZeeIVhgI1nf49mgY9miI9viJRviZh3ippzjZtkhZdegIdgfIhmhJBniJNpgJRkdY1hc4hi +f4pnfJBeeYhkfIddeINhc31Yen9fcoNedINPWXVGUGRDV2ZPYnVJWnE8SFs5SFBea3dJXGVf +cnlSYHJRWGlOT2lKT2hLV2tDU1hdZHZjdISDoKiKrKpwfpljYmhPU0xti4d6jKR3jJV/np+c +ravGso/atYvZvYnZuIjStIPZvIzTuYfVu4fStoTOsYSpoXl0e4B7kqF6k5p4hppwjZByjI95 +pJ6BmqV6lpqUtrCQtLKFla1kiYCMrax0gZl2jpVyi5tfdY5LYHdLbXt9p6KKmLJjdYZmkJRw +iZxmhZNff4llhIl0jZ1thZZ0jpx8l6eBo6x8oa9/oauCoa57oal0mKZ2k6Nul6d1k6VzmKdi +bpNZhoNvkJp5nKx5nrCBqK2FqrKCqK17oq91mKZzkKV0lZ91kqGApq9/prKEqbOBpLGBqLB/ +pbN1oKZ6pLB9o6x8p62Fs62Ps7mCrrSErax2iY2BprR/oaV8pKx4oKmApbOGsLCbwb2hwsCG +laBvkpFxe5NVeXVch45ee4RdgI9ZgIVYb4FMen9Nbn5GcoBJeYJEdYNJeYlEeoRFeoNGfIRN +eoZIg4JJhI9FeoxRg4tEe4tNe4ZFfn9NfopFfYZNe4dBfYFOhIQ+fn9KdoNDgIRRgopRgIxF +hYxQfYpKgolLg4lIgopNgYtOgIpJfYpGfYtJf4NJfIVFeohLho9JhYpRgo9DhYhUhopGgIdS +gZZRi49QgZJKiIFVho9Nho9OhY5Rg4lNgYtQj41ajZFWiJBdnp7F5NaEuLmWzci04NPG59vA +5da33dacwsiL47+z3NK84NTX5OPI7dy+8teq5s+l28Vlo6Nlqp90sq1bkZdcjZVXjpZQjpdU +i5pUjJhRjZFTipJUho5VhI5Lio1VhIxKf4dLfYhDd4VJeYNOhYZShYtHfYRKdoI+YXQ8YWQ9 +dXZMf4dMgJBBZoAxXmI8YGc5a25Hcng4ZmRNgIJOhZNNh5JHgYxOfY9Lho9SiJVPiZVLdow7 +ZXc9cHtPhoxXjJRPgY9Pi5BTiZpWkJ1VlZtWkZ1UiJpOiJVMh5NIfoxGeYhIfY1UkpRdlqJd +l6FilKhYlaBfmKZZn6NioKNen6lnpqmHv7nu/dL///////////////////3///////////// +//////////v///7////////////////////9/vrv9e36+/D9//ry//bi+Nft7+nc7Nrk9+P2 ++fDz/fn1+uj4/fL7/vb///77/+np+uX1/vj///77/+/+//77/+/4//b///b///71/+jy/+n4 +++vz7+ft9uP+//nv+Ob0/+v2/+v5++zm49dUSEk/PzxGPzo9Qjs2QDM5PTk9NTg1RDg3QTk6 +Qjk8PDkyQjU8PzkxPTQ+QTc1Pjg8QTw9RzU/Pjs3PzVCPTw/QjdCQTw4QjQ/PzY8OTdCQjY5 +PDg6PjZEQjk1QUE+RURGUFlKUWVJUV5EUVxVZHNLWWdPY297mpyWo69pg5BsfY5gfYlmeYpZ +bn9ab4Fjd4dicohigIVogpNuhIxxg5Vsho9xi5FuhZVlgI1mgo5oiZNqg49lg5Blf5FjgJBb +dYNqhYtie4tohZBriZB6iZtwkJZ0i5xri5pwf5the45rhpFkhJVthZtliJRnh5Fof5Jmi5Rs +hZJheopgeIdfeolcdIRifYpedYdacIJSYXtLWmRLWmlVbXtPX3JKUm9BWF5vi5BfbYBviJFw +fpJYboljeoBdbo5dbHtLWHlKZGRzjIx8nKSJqLN2gJ1tdHZZUkxjfH1+j518jZeBmZ6TqqLL +tIvVt4nYwI3Zu4TRuITUvIfQuIrXtonKrYOsmX2CjYuBk6CAm6WAmZpzlJmSp6B6d4JbhG5x +i454lZCJpax9oKNudZRacXFxjphieYRohIdlfY1keIVZboFWbXl+qJ+ZpLZpdodvkJ50kaVs +ipZifZZifY1xjpt1jJx5n6KBpLCEqbKHpLd7pKqBpLOApqt+mqxymqF3lKp1laB1n6xuiKFY +enVniYh8prJ7o7OBpq+FqqyCqbJ2nKN2k6F9mqp3mKp3laJ+qLKIqLWGqbWDr7CGrbWEprh3 +nat8pKqGq7KErrCFqrOLsLWLq72Cp6t3hpqIqK5+prGCoaCCn7CGpqyOsruZv7uryMyUoqxz +kZRthJJacoJYgYhng5Bge4phdYRZfoFbc35McH1Tb31BeXxLeohGd4dOd4xJe4FOe4U/fIFO +gIdIfoRTfIlDgodMfItJg4xMf4tLe4xIfIZNd4lKg4pKeoZKfIhJgI5KfIJKf4xQfYxLhYZK +f4pJhItTgZBJcYBPdYxMfYhMgpBKfoJKf4xGe4FOgJBJf4hPf4tKfYhLgopKf4xJh4RPg4hN +i4xNg4tJgIdHhodMiI1Ogo1RiYpMgo1PhohSi5BZjpBZo5u959DC6tnT8t+s2NLK4tOq4c6x +69B9rrCPwLaDrq6M4MC+59WX2sJ2t6tmpJ1dmZxcmZ15qatWlJVaj5NQkpRXjZBUjo5WiotV +h49UhopRipBWi45ThpZRg4xNhIpNfIRHfYVMd4JIeodNgI1Ph49QgYdMeoM/Y3I4YmdBcndO +fYZNg4xBbn88YGE9ZGVDb25GbYBDbmtKgoZUhZZNg49KeoZJfoRQho9RiJNSg5JIc4c9Z3VG +gX9QiY5Mh45Th5BUjpZdj5tZlqBgk5pVlqJXjp5RhZVOhJJCeIdOeodMiZBclJxZmp9ZlZ9Z +m6BflqJhnKBdnalgoadkoatjp6p/wLTz/93///j////////////+///+//v///////////// +///////7//v////6//v8//P///3///r7//j+///1//r3/+/n/+ji/9f2/+3p9urg7OP8//n5 ++e35/vPy//H1//Lz/+/9//34++X3/uv1/+v5//T6//D+//r7//b///71/+z5/vP9//z///39 +/+////79//z07OTp7eby+un7//Dx7uBZQ0xBQj1BQD5CPjY2Ozg9Qzo0PjQ9OTo1QDQ/Pjc1 +QDdEPTgxPjRDPDwyODY/Ojc6Rjc9QTU4Qjo6Pzc9PDg8PjY+PTs6QDY8PDw7PzU+Ojo4QDQ+ +PTc4Qzw/SkJCSk1LVl9bb4R9eZVab35fbXtXYXRkc4aIpa2WpLJqfpFrf49de41ndYNfcoVi +c35hb4JjeIdke4JsfI9kgIpthpJuhpFvjZlyipdogZBmgIlug5NogpBmgY5sg45pfo5heoZo +hJNsf5NqgpRyiJhzjJt1jZx1ipRyjZ5xhZxmgZBof41mh5Bvi5hkhJJse5Bpg5F0jJtne5Fr +f5Bpf45ph4pnfolpfIlnfI1qf5JbaYdPYHFRa3tnf4lfbIZQYHNKVmdniYN1hqBzh5Z5i595 +iqlkdIZuepBtgJVxg5hTVXZcc25wkZKOqKiHm6hmaoZWUlVtg3x/lKSBk6OAi5qYoZ/Rro3V +u4nZuYTVtIXQsH3St4LRtH7Cr4CZmHmAkZRqi3xge3NXcGdaYmhmd3OJnplqeXpra4V0gISB +kaSNoKWFj695hqFfd354gZRjcH5acX5dc35id4FgdYNWaHhyoo+cqLpsfY9sjpdwk5prg5pk +fJBieohtlJZ7oamCo69+qbGJp7KEp7J9m6Z7oauCm6N/lqp7lKV0kKp4lqV0lal1k6dfcote +goV5oamCo6mCoq9/pa6EprB4oKN4mKh0l6p+mKJ2lJx/qKqNqreJqrKGpreEqLGFo7N3kKJ/ +oa99p6h/qLGCq6yLtLmOqbN6l6V6i5WKoLKCpKt+oKl+obCCrbCNrbiVsriiysWhq7d0kqF2 +i5Jnd4Bden9hfYZ2i5lmfI5mfoZfeI5ab3xTbX1Nb3pKd4ZLf4hLfYNOeYVRgIpFfIZKfIJJ +fYNPgYtRfoNTeo5NfYZQgJBKhYNFd4lJgYRSgZJPgYJRgo9Je4VPfJBBfolMhYpLfYVVgINF +f4BLfY9LfY1MeopFfoVLgI9QgYxRe4NGfYlKeI1EfoZRhZBKfoNKfY1KfoROeY1Be4NNgIZP +hY1UfYpHfYdMf4lQfY5Kg4pPg4xPf4pNhIlVhIdUkZCS4be64M5617SP2ruX275lop9ZlZFS +kJKZ27204NDJ49d9pbJqnKhmmJpsmqh8rKxqoqVelJdYiplVjpBgj5RXiZVRiI1ThY1LgotP +gJBQho1Tg41TiJNWg49Ph4pNf45Mf4tIe4VLeIJIf4JXgoZHf4JVdoQ5Y3NEW2s9aGZQgH5N +iI9Lb4Q5Wl89ZmpAb3VFbH5AZ21MgIBUh5NIe4RGeHxLe4NOgoxLgY1Oe4c7ZXpCb3BMgoZQ +g5FMhpRSjJhZkZ1YkZlWkKJXkJdXjqJWjJhUh5tPf5FHd4dRfIlVjplalp9fkJ5Xk5xdmpxh +naVdoKZknKdgnqZgn6ZhnKGLwbX+/+L///3///7////////////////////////////6//f7 +//L////////7//T///////38//f0/+7s9ujq997n+una8tni+9jr9uru+d/w/+3s/Ob4/vb/ +/ebl9eHh7tzp8+Ln+ur4/vjz9ej0+u77/vL2/+7w/+r4//f4/+r0/e/7/vL+//b1//L8//f5 +//P5+e/y9u/+//7///X18un08O5USkc7PjtBPDg7PDU/Rj05TEBPQT4vPDQ4QDsyPzdAQkE7 +PjM/PTw1PDQ8Pj02PDM5Pzk3QTY2PTA1QDYzQzM7PDgzPzI7PDcuPjM4ODY3PTM4RDc9Pjk4 +RD0+Q0Y/UVVSY3F9m6CCnaxviJdyeY9cd4N3hJGCqqiYqa9igIxpg45shpdle4lccodYdH9k +fIhfeYhofIhljJJxh5Vrh5lyiZlxjJZvgotlhpFqhZFripJrh490iZlsf41leo1og4xriJZr +iJFug5Rth5JwkJx0kJt4jplyjp5ti5hrf5JefY9qhpZsh5Rqg5BkgIpjgYxpi5VqhZRmhpxg +gIxjgYxngI1nhY9uiZZthJVph5Z5iJ9lgpFwh5hbcYRWa3VHWnZpiIWElaZwio5+m6l3mKVu +f5dmiZFxiJVzjp1wf55DU3NbeWt8mqCMoqxldZBaXG5ih4Z7lqF6lp54jJiDmpnMsIjXsYXX +tn7Ss4TGqnu/qXq1pnSBi3lea3JncHyKlqeHpauAoaVwjpZveH9oeoJrfYJ8o6GbtriKpKqX +sbSCn6WGma9ohoKDlqxiboJabnlgdH9beoZedn9aboFvm5Kcu7x5jJ9vh5pxlJ5vjaRnhJNn +g5Bjh4l+oqp/p66GrLeGrKyMr7x6ma92m6V4pqWDobB9n6h1la1zlaR2nKl1mKttfpxXfXtv +naSBqqqEqqx/rK6Co7Fykah5n6d/o6R8naZ5l6V7oamFqbeKr7SEsbWLq7iFrbF6mKd1prCA +pKh/p62Ir7WGsLGIrLR5lqxriImHrK17paeAn6aBpKuBsrOPtbiVub2dysWcrsGBnKdymJp0 +hZRYfn9yhZRvmZuGmatpgY1hd4lRdYFec4hMbnZLhoRTh45PhZBPhIxQhpFSf4xRgoVNfYxP +hopJgoxFgopHfoJKf4pMgIdKgItKhY1UgopKiJFMgIlEholUh4hKgoxRgIxIh4pUgohMeoxK +d4tThpNKgJBHeotPg4tKfodKe4VOfItJe4VJfo9GgYZQhI9JfIdKhIdLf4VKgIpEhYZMgYxR +ho1Of4tHhYdRgIlFeoVFfoROfYVQhINLiY1TgoZSi45Vi45PjItakI5VjItWh49Rj49akJlW +nJljop5YmpNfp6BmrJ5ppaBZmZtZkplUkpdbiplShJBUjpNZj5RbiZdQiYxNiZNRh45SiJJS +iI5Rh49YjYxjlZVJf41LgIpGfn9Ed4RFe4JGf4VIhopRe4pEeoZCZXc3W2VBaWxHgHhNhY9F +dIk+Ym09aW8/b3Y9Y3hCdnBTjJJOgpBGcn5AcX9Lg4ZLg5BGgI5DbYE3Zm9Gd39NiItOhpBQ +jZVakKJVkptklp1OkJlZkZtQi5VXkZtPiZhWgpVBf49QjI9SkJpTkJlel5dclp5cmqFbmKZg +nKJamqNelaRbnqNioqOKwrv0/9j///z///////////////////////////////////////// +///////////////////5//L+//f////6//b///zx//Pq/+Dt/unq++br+ef3/+n8//X0/+r6 +//z////9/e/3/e30/+/+//3////5//Pz//f6++X0+fD///3///////n9//f2/vb///X3//D6 +//f6/fH8/vP+//r///Lo69xUQUw2QTw+Pj48QjZAPz9RYlZnW042QD0+Oj01OzY5PTk1QC88 +OzozQTU6PjcyODM5Oj41OTk6Ozs3PTUyOjc6PDg6PTk9PDk4Pzs6PTo6PjY1Ojg2Pjw5QUJA +TE1IVWZqh5SHoKuGmaJ9jKBteI5Zf4d6jJ18oJ6QqrBigJFrhpdtiJBrfJNjeYtfeYdke4pj +fIxgeYlphYpuiJhrjZdyjJ1zkJttiZVxh5VrgpRphphriJZuiZpkh5dsg5NnipZ0iJlviZFz +g5Jpipl0i55tjppwhp1nhZd1i55jgZVpgpBni5ZuiZdpfJNdfopof41th5Rui5ttjJtngZNk +ipZuiZZ3jJ5wh5lxjZt3k6GEnK16jZ5/kaxbbIRZb4BNZXlWdnyAoZx3i6Z+mZx7l6d4iKdm +iZVzjZ1ukJp9lahjbZZIV19tjIqAoahofZlUbXhxj5B0jpZ8kp12jZ19j5Wvo4LEnnXLmnjN +qYDHrH25oYCEhIJteoV5j5x9maByjpZoe4dVaXZacXyIp6iKqq6MorGHpKWYq7mGn6mKpq6L +prCLm7NffYGGoq1vgJVbcX1YboNddH9edoZieop2n5+evsCDmKp1i6Fwj59zlZ5shJZog5Zm +gpFylJt9qqiFrLeCsLGLq7iDpbJ4lal0mqR2lqR4nqp4lKp3mqd8na53mqp1haVOcm1slZl/ +qKt/qK2JqrOMq7uAn690maZ7oKl5oqV6nKp7nKyCqLCJp7GFrrOIq7aCrLN+l6d3oap7o62A +pK+GqrqErbKKq7hxmaVrjYuKo7CAnqt8pKd8oq2GrLCMsLGQuLqUw8OpzMyfrMB5jqB1i5Nf +e4Brj5N1namTsr52hplphZNYe35Xcn5LcX1ObHhMgoRThJZFgY9VhZJKhI9Rg4xMhZhPg41I +hJBLf4pIiJBNgo9NgYtQfolKhIxTgYtNg4ZOfYlFg4dPgItMioxTiItKhIhTiJRKg45UgJBF +fYtKgJNQf4ZTho9Rh41LhYhOfY1MgZFLf5NNf5BMfYpGgIxSgI1GfYROgo9Mf4hNg41IfIdE +e4RLeodJd4hKdYZEfIVQe4VEe4ZQfn5FfYJNf4hGf4JRgIVOgYtQiI9PiohVio1Ri5JSiZJX +j5ZUjoxUjpNWkI9WjZpUjphYkZhRiJBViJZTjZFXh5NVipBUiI1TjJVTjJRUkJdViZRTiY1Y +iY5Qh5BNhotMhotPf4pMgIpMdohBeIFMfIBKg4ZPf49GfYVHbX44X2c+YGdGeXRSho5Ldok+ +Y2w6anFFcng8ZXBDcm9Lh4tLepE9bXtEdXpMg5RHgJJIdIU8Ync+a3NOiYhPiZNNhpBWj5Va +kZpRj5pWi5RZk5laip5Qj5ZUjJpRi5hUiJVOhpVXh5hXjJxakqFXlphflplblJ9enKNamqhg +oKhinKNdm6dioqd/xbj9/+b9//z+//v////9///////////////+//n+///6//P+//f///z9 +//j///z+//z7//L9//3////0//f8//b9///t/+/h+9ns+Orv/+zo++jt/+fj8uD1/fXx/+n6 +//H5//P6/vPq/OD0/ej4//T8//X5//j0//L7//Pw/+74/+/x/+30//L6/+/q9ujy/u76/vP5 +9fH8/+77//H7++nt6uBMR0lCRkMzQTE9Qz81QjRCUEZGTT0/QEMvPzU9Pj04PTc0Pzc3PDk2 +QTU9QDkzPjU5Pzs0PzU5QDs1PzU4PTY7QTcyOjk6QTk1PzU6OTcyOzA9PDgyPThBRkpCUFBN +aXqAp6WQqK95nKl9l55xgY9ZenxqgIpmlZaLn6tif49qgZVpiZVth5VkfpFccotce4hkfoli +e4xjg4tvi5xriJVti5hyjZhwiZ1vh5dug5tlg5FojJpph5Rlg5VnhpFriJRwjZpyj51whZhx +lJt2kZ1ukZp1jZ9njJlxjpxkhJRphZJsi5pthp1sgpZoeo9jfotti5VrhZZqhZhlhpJnhpVz +jZZukp90jpptkJdyl6KEoqWIoKSSrrV2hKlacoVXcH1SZ3FtjpN+j6FvkJaBlqp0j6Zsh5Nt +ip92kaBykqJ1iqFNWHVlhHZ7m555kKRwhpp+k6FrfYOUrq+Al6t7kJugpIzJqX3EpHPFpHO2 +pn2FjYNkenh8kqd8nJ59jqCAqKxkc5BOanV2jZaMq7GGl62KpayHmKZ6kKB1ipmAl6KOsraF +nbdZcX+AqaV8k6NkcYNacntccX1bc4Nlf4l4mp6ZvLqPlrN0lJ1zh5hvkJpzjZtpiJNviaBq +kJh4n6iArK2KrLWMrrmLq7N4nad1l6R4mKl3m6Z3nq54mqt2nqh1nqhylaZTYnVjk5SApbF+ +qauGqbGErrOEo7NwlZx7nax6n6x+obFxmqqCqLGCqLeHrrSHrLN+q7Z3mq1xnKd7qbKBp65+ +pa9/pbCAqbBtjKBsnIqNp7F+naV+o6+BqLKEpa+Br7WOsrmVu7mlzMypzcOasMJ6k5ptfIxc +g4Z8nqaatbmFmaZ4iKBkgopfe4VafotbeIFMd31UioxJiYpRiJFNiJJLhZBMjZNOjZpUh4tO +hZZXh49KiZhdhpBMiZNTiYlGiphUjJFLgYxUh5BSjZBOhIpRgpNNiZBPhI9Lho5RgZVKgIJN +f4xKhI9Qg5FEgYRKfIhHgYtKf45MhopJg41KgI1OgItKiIlNgI5KgohLhpBKhIpLgIlFgotK +eYVFfIVMe4JHf4VPfIZEfodMdIJCgIFNgYhGf3xKd4JDfoFQf49KhIxThopIgI1SiphXkJVa +jpNSipBUjpRQiZZVh49ViotNiZNVjpFQi5ROi5RWlJdRi5RZi5ZTi5NXipVSio1ThIpKiYpS +h4lNhotUg49IfYVNfItFdoVKdoZDeYJskJNMf41MgohEbYQ8Y285XGY/cGxNg4FGd4Y8YGc+ +Z21Dc3I7YWtIenhPhIhCdoM+bXlFf4BMg5BHe4tFboY2ZnJHeoJMiJBTh5NJipBXiJZYkJVZ +k5tTi5hWkptSjZhOhpdQipJOiZlXi5pPkZxUjZ5TippZkZxXkZpZk5tZlqNhmaJhnaReoKhh +nqpblqFfnqR8v67s/t7+//r///////////////////////////////////////////////// +//////v///r7//j8//j9//n////s+u3g/ODf+dXt9+fu++ji7uD+/O/x8+zx/O3x+O7p+eX0 +/vD9/fL1//z/+/fr9Or9/fbt/+/3//L5//r/+/Xw9erz/e70/fLz/PD///r1/+/z//T5//X/ +++/v++z///359OlYSU1BQDw/REA8ST5HSUZFU0pLR0RFSTw0Pjc7PDU9Pjc6PTg6QDc9PTo6 +PDMvPjs2QDg1Qjk3Ozg1PTM2PDQ4QDc6QTgzPzY7PDszQDQ6PDo3QDQ6QEA3R0dET1dagYqe +rrSBn6eBmap+l6N1fZZLaXZtfI90kZt+nKZng5JoiZVyiJpwhpVng4xmeo1gf4VoeYlofYtn +eYpliIpxi5RujpN3kJhtjJRziZpyjZhug5driZJuiJRnfpFqgZBuhJFlhJVvi5hphpJzkZh1 +jp5sjJl1jJpuiZlxjJhqiJJsjJVzh5lyh5drhZNmgZJegYxviJxmiZZ0iJdkfYtuhZlngpRx +hZJtjZp4k554laOCo6qHpLCdvryhrL1/jqVsd5laboV1hZdwh51shI9/l6mAmqhrf5Rpi5Z0 +kJ51lKJ4kahpbZRTaGRwkYmHnK52i5huhZSAlp6JpaySo657j6KPlpXBqH7EnHG6o3KRjHxq +en1/kpqBlp6Am6qOpa2AmapXZ31mfYeDm6GWuriXrrqNrK2LoK6Rq7GOo62Ns7GBoKODpq9e +aH14oZ2QrbOHka1ndodmdIVidoNmgIt/p6yWurmVo7Z8mZh5jqFuh5VyjZ51jKB0jJ5ziJx0 +lqKCp6mGq7eLq7KIq7qApbR3l6h2kaFxlaR7nKZ7nKZ7mqx5mqR3lK5ga4dgiIl6oKx9nKx9 +p62GqrWDp693kaR5n6J/oa19oat9oKh9q6+LqbaGsLKCqrWErK2Do7N2l6d6oaqBoq18nqiD +o61+papvh55tlo6MrbWCo6x8o6iBoq2CqK6HrbSJsq+Nq7aOu7eewr6ez8KlvMt5h5thfoNp +ppaexMOiwMuJl6t7kKVwiIligIdfeItRcnxTgYRShJNRi49OjJRYg5FJh45UgI5KhZBZjp1U +h4xYi5RKhYtSgJROf4tPg5dMf45Nfo1EgpFOhpBNh5JUiY9YiY9Mf4xVgpJRgZROg49QhIxS +hJBRhpBSgpdQhpNNfpNRhZNMg41PhY5MiYlVh5JMh4dWhYpOi4lWhZBRgoFQgpFOgIVLgI5O +e4lDeodKe4NCeoBLe35JeYNGd4NFdodFeIRKe4ROe4VGfYVOgodPgYVViotVi5JTj5FbjpVK +i5NYh45QiI5ciI9ViY1UjJFRiI5Yi49NiZJQjJJVjI5Tj5BWiY5OiYlOhYxUgYxMhIxLgIhS +f41Gg4dNgIVOgIpQfYZLfYlHeYNIf4hQhY1IfIZMcYVDXXI9VVk+ZmZOe3ZGcYM7ZWY8aGtA +am44X2ZKfoBGdIhEaXQ+bXBGfIZHeIdGbYM6ZW9FbHhFgYBThpVPh5dQhZFQiYtThJJSi5NW +jplPjJtVjpRTiJhOjJdajpdUkZtZjptUjJxNhpNSipVXj5dWiZ9VkppdlZ9dm6NioadioKFj +l6denJ6Lvqr2/uH+//z////////3//T+//v///////////////3///////7///3///////// +///1//T1//L2//D1//Ls/en2+ezz//Pp+tvj8ePm8dnt+en2//D5//X5/ez+//v///X3/+78 +//n1/+v4//P9//D4//f2/u72//f7/vP1//f9//X///7///n8//3+//T7/e/y/O7///n6/+35 +/+3u8t7h49FZS0k7Q0A7RTtFSENDQz1DSUBBST09Qjk6RTk6PDg2Pzg5Qjw1PzY2PTgtOzk0 +PDg6Rz00PjE1QTg7OzczOzw3PDU0PTo6Pjo0PzY+Pjw7Ozk/Pz41RTtETVlIX2l8lp6QqauK +m6p+oKd/lqhwgJFPZ3Vde4d8m6d5lZ5vfZZkiJJyiZZvio9qgY9leItfd4theYphgYxlf4xj +fYlrh5Jvip1vi5p1kZtvipd1hpdsiJRwjJpriZhpgJhmhpBthpdph5RvjZZqipVyiJtwjZZx +i5hxjZ1ph45xjZtuiZ1niZBoipZriplqi5Zjfo1jgpNtjJdxiptqjZZpg5dhhYxuh5doipB2 +jZx0l5+Al6OFpamKpLCFsK+ivL+Qtrqgs8CXq7ydubqbsb9yhqJ5l6CAm6Vyh51qhZhujqBx +h6BziZptfJxFUVhjgYB2j5V+lqFykJZ5lJ1/oqCKqKmLo7CGmZq1pnzEpH2bh25teIJ0kJWB +oaaEoKuLq7GLo7ZofYxacoRyl5uRsLCdwMCcq7x/nJ+Kp66XqrOImqmOpbKAkqB+maJoeY9z +m5CUurqhvL+Mm659kZ5uhZtogYZvkpCXtredsMJ3k5aDlrJsjZV1kZxykqF0j6Vuk5tvkZ11 +o6SEpq2Dpq2DqquFrbl4nqt4l6Z1k6B5l6V4mqh3nax0nKd6la5ocItThIB+pK18oKyFqbKB +rrCBqLBwj594l6N+p6p/p7R8pLJ9pa+DqLGBoLGBrq+ArLWCpbF4mq6Cp6l9qLGGp7OBqrGF +prNujJ9vno6PqbOAoqt/oqp/oKyHqbKJrLSKrrKBqKiKp7WFqqyKtbKTyL6Una9gen9kiJKP +xrqtyM6duL6FrbGDlqBjgI9qiJBif41TeH1TfYlLhJFMholJgo5QiY9Pi4lTiZhPhZNUhIpI +iZFShpNViZFUhJFLgJBQh5FUh5FYi5FRhIdSgJNPhZJRh5BJgpFWh5BQhZJXgpJXjpRViotV +iJBLgI5NgotShpJMgI9RhI5Sg45TfY9OhYhVf4xTiI9UgY1PhJFRgZNFh4lTgpFJgIdPeYg+ +fIBRfodJc31Ke4JJdX9EcoVIcn5Acn9JdoBGdXtJfYVKf4JFfYlIg4VMhoxShYtOiZZWjZVN +gpBNh4xPiYxVg4pOf4lThotNh4lXho9MiYtYiZZSiY1Xh4tNjYxZiZFRhIlTio5Ogo9Qg4dS +g4hOf4hOf4xLf4lMfYZMfIhOgYFJiYxPgIlLgIlBZoE9V2hBYVtAcG9CbXVAZWg+ZmlAYnJA +aWNGe4ZCbnw8Z3RIdnlHfYpIbYE8a3o9ZnRDgYhYipdMiJFOhZVHhpJThJVNhpJXipZVkJpT +hpxSjpRRiZNgjJlbi5RWjp1UjptTiJhQhZlVipVWho5VjJZOjZxglpxgm6ZlnaNln65fnadk +maSLv6b6/+n///////////7////////////6//n///v///3///////z///////3///r9//7+ +//v+///+//f5//n+//j7//jo/efb+dXz/O38//br8ejy9evy/Ojx+O/y/e3u++r0++7x9fL7 +/+/8//b+//3///v+//z7/+3x/eTz/+33+efs9+rq/Ofs/uL2//H+//f///708ev4/vf+//n/ +//77++dYR1M1QDNEPEM/QTpBOzw2OzU6QD49PTwyQTc6Ojg1PTQ5PDkzPDhANzxAOTs0Pjc2 +QTc9PjdAOjc2OzU2ODk0PjU9OzsyPDVAPDgxPDc+Pj4zQ0FDSU9EVWRVaXuLqbKIna14laqH +nal7m6d0fpdVYXRWf4KBnqZ9l6Jyf5dih45th5dqg5VufZdffI5deYNde4tnf4lqgJFqgIpp +hJFvjZZwjaFzi5xxiZxui5lqkJp0jptthZ1ng5RjiJRyipdlhJhpgZdvjJVsh5dsjJlxiJ1r +iJhvhphzjJ1yiZ1viJ1uiptrhZZpgpZjfIxkg5Ftg5lwhZ5ng5VigJFqgpBqjJNuhZZzkJp1 +k6F6mKaPraqUpriFoqyNqLKIrK2RrLOUtrmdr7ycvrqXpLl1jZ9/mqtvh6Rug5RwjJt9laSG +oLB5lJ1jY5BPZVxkgpBngY9ogI1wh5OEn5+NqLGNq7FzjYe1nXawlXF3eWl1foeKr6uYsbaf +ubmDpa5iepBacIJXc3+In6eRtbWftr2Xt7qVp7+RrbGVrbmLp7aFp6h/l6BwkJV3jaZli4qT +uLaiwMOgu8CgsbqRo7OBjZ6AlZybubifub99iqKApKt4hqdvjZ13l6pzk510kZ91kaBzlKF8 +nql+paaDqK+GqLh/n7F0mKdvkKNukZ92mqZ4mqx0max6mqprfptUdGVxoKeBpK55pK+Cq7Z8 +pqxykKVqk5t/pLGBqq6CprN8oKqHrLWIs7aFrrOGq7iDpa14mKV4oqmCqbGApKt/pa97l6dy +iaNtno+NrLaHn6x/oayHq7OHrbSDo66Dp6qCpbCDpaqGprh+pqyKt7ifvsGAhpRbh4N8rqil +zcalx8mewMCNrrV0fpJsho9ofYpkg4tRcH1YhIdOgZNUipBMiZRUiI9LhZJNi5RLiY1PiIxE +gY9YiIdFhJBZh5RSi5NRhpBNh5VXipdVf5FVjZlZiJlWgpJTh5dLiJBSg5JJhZNMf5BJh5BV +iJVRiJVNgJZKhotNg5JKiJBUhpJVjotRgZBPgY9QhZBJgZBPgYpSjpVXhY5JgoxLfodEd4FD +cn5BcXVIcYBDeIFNdYJCeXxKcnxBd3pHa4NAc3dJdoBEd3tKeIJMg4dUiJFOiYxhjZxViZZS +gIpRfohKhIdSgYpQgIlQhY5Rh4xLiJFQiIpYjZBWh5JXj5RVgI9OhYxRhYtKgoZRf4tHeohN +eohFfn9KfoVLfIZPfYpKfYhShY9Ke4ZPgYZFcodBX248V2A9YmJAZmo5Xlk8ZGZAXmk/bW1F +aYE/YW0+Zm5Ddn9EdH01ZWlCY3lBcHtQgYtJgI1ThJJFgpBPgpZKhZJXjphRj5ZWjJZUipdS +i5VUhJFQiJNRiZJVjZdah5hVj5daiZ5Ph5dQgZBNh5BLg45aj5dfm6ZioKFhoaZipaZmo6F0 +s6Hu/sf9//n////////5//T///r///////////////////////r///z7//f9//3+//j///z/ +//j///X1//Tr/Ovr9OPj9+jp/9z2/vbl8+Xf9dr5//L+//r1/+zl9+f9/vv9//f9/e3+//b7 +//b5/+3s/Ov7//H7/+34+fH/+/v///v///////z////5/+/8//v4/+r29vn////5//D19eji +3tVSRUw9QDk9Ozs3QDk6PTk7QDg5QT5CQjs6PD09PDo7PjlDPjs0ODVCPjk1Ojk7PDo2QDU9 +Pzg2OzpCPzY0NzlAOjg/PT02QTsyOj4+PDk/QkM+SEZFS1RNXW5sjI+RqrKHoKp6nKGDoaN+ +mKN2gptWXnFUen+Kn6yElqF3hphmf41ziZxzhpRshpprgpZge4ZmdoJnfYd0hZhvh5FugJBm +iJN6jaBxjJt1iptviZp0i5huiZNziZZlgI9nipdth5Rrh5RpgJhyi5hzj5l1ip91jp17jZ90 +jpxxkJ13jJtvip10jJx2iZ91i5hnfY1lhI54i6Nyj51viJtrfZNmfZFtiJdyiZt2j597jKJz +kaOQq6uWr7+Koq6Lp6yNo6+Gp6yPra2OrbWbtLOouL2Gla5+m6h5kaRxhZ1ui5l0i5Zzi6Bz +j5x2hKFRXHFpeYhnfotxgpN3hJKEmpuBpKl8h6NzfnG+oH2VdWZ+g3xuh5V0iKBohodkjoxk +d4RecYFUaXxjfYKGrK2Vt7imwsWfvcWerryJqLCQsbJ/m6J5pZ+DkKl1kZd/k6xihIKWt7ij +w7apysOdv72husKnwMCkvcSnwcWpwMWBkqiEqaOHmLV0kZ58mKl6mKF5kKJ3k6JzkJ18mKCA +qKeLqbSErbKDpLZ1nat6lKVvjZx7lqdyl6Z5mat3nKx7k6VXZm92oaN9oa+BqLKBp699pa99 +mKpvj5qAo65/pKuGrrKDo7GFrLCIrreIqrWIrrOLrrl9mqd7nKWKpbKFqbSBp7B4laFuh6Zm +kY6CqbSDoaiFrLGNrrGLprSQqreJs7aOqb2KqrSJqrSMsrWGq7WZvLuUlbRmf357oKKXw7ut +0tO0y82ju8h5jJ9okJl7iZVvj5hngYpOdYJXhpJVipxVipNWipZVio1aiZNPhpBUh5RNfI5V +fJBKh49UiZZRiI9UgZBSgpBYi49Ph45ViZdQi49ZipZRiZFag5dShpJOhJZYiJZaiZVRjJlV +iZBOhJZSiJFRjZVWiphWiJFTiJFKgJVVi5FaiZBOfI1NgIdLhJNqn6xUgJJLf4lPeYlFdIJN +d4NDdoNLdodMeIpMe4FHdIFKcn1Lc35EeHxKeH5JeIFHd4NKeoRLgYVRi5FXjpRYi5lXjI5Q +f4tNgIZUfopJgYdUgY9Ph4tXiJJPh4hXiY5ViJFYi5NShohPg49SgYpThY1Sgo5VgIdLgY9I +eIpKdoZGdIBJfIRLeIJLfIdVgI1JgoROd41Hb31CW3E8Y2dJZm84WVlDYWs7WV1IaGY8Y21D +YG1AbW1Ja3c+ZHJCY29Hdn9FeoRLeo1NhYtQhI9Rh5BTg5JRipJVgIxSiZJXhpBQh5RUho9V +hpBWg49TipZXjZhdj6Jak5pckKRaj5xXh5dThIxSh49Zh49impxkl5tfmJFbhHFSXlpjbFbz +/cD+//z////////////////////////////////9//z8/+7///////////////3///////// +///9//f8//r8//n3//np/93n/Ojn8d38+vTy/+z1//j7/ffx/O7z/+/0//X4//T3/+v+//71 +++34++7u9ejw/u70/fPw/+38//X5//P3/+zu/erw//L29vH+/v318ej7/fb99e/7+fTs7+FT +Slk4RTs9OTk2Pjs5QDs6RDwySDo5Ozs3QTg1PTk7PTc2PzgzPDwyPDs9OzkyPDkzOTQwOzQ+ +Oj4tQjU2Pj00PTQ7OTs1QDozPkE1QjdBREY5S05DUV5VcX9/p6yPrrKBn6h+kqN6k6GBkqR3 +i5dcZHhIZ3KBnqR4lKNyh51lf4xlh5JsiJZggI5sgpJdc4VgdYRXeYVyiJdih5RzgI9pho10 +j5lri5pyjJhrhZlpg5VsiphzjJxqg5ZkhZNmhJRriJhniJhri5hwiplvi51yjJltjJtsi5Rz +iqBxjJlujZ1xiZpzjaVwi51kgJJjg4xujqFrhZtjgZZmgJNjfZBnjZRqjJd5j6Bzk6F8lqR1 +mJmauLiUsbmJobCMo66DpLCLqrGPqLKPsrOjwsCSoLZ8laN9m6pzj6FjhpVuipdugplpjZV0 +jp9XYolYc2xogZJzjJp6kaGCoKN6lqBme4+EiHOznnqIZV9qhHVnf4WDnq1sdpJdc4ZdbX5T +a4BTZ3lgfot/nJ6QsbWiv8aYtr6ZtrqLrbaImbR9jaN0iI+Dm6eZrsGInrFmdouHsqidvsGV +truauMGevrqkxcakwcGnx82nw8uSm7V4n5iKpbdzkqF2kqV9nKd1lal2l5t3mqV2jp54mqd9 +pquEprR6n613mq9rjqFxkaJvlqV1lqdwmaN2ma10mKteX4VllpF7oK57pbCDqLGDqbF9m6xy +kaB2nKuEqbGAqrmDqbR7qLKLsLmHrLaFsLaJrrh7nrF5m612o66LrLR8pKx4lKhrh5dlhY+F +praBnKR8qrSNpbSHtLOSrbSDqrSNs7CHqLSSqbWHrLqGqrSMtbKXrb9of4hvnJmAqrCbxr2u +1c+kvMF0laVujpFuiph0kZxsiJdghItTeYpXiJZOipBTiZNTh5JRiZZPhpFQg5RRiI5PgJdP +gI5Nf5BNh5JRiZdQhpFNiJNQjZZSh5BVh5dRiZRShZZLiJBYi5NSkpBbhptWk5JQhZJWi49Q +jZdSiJJIiZJRiI9KiZFYjJZPipBWiZBSh5NSipBMg5VRiZBJh49fiI1TgYlEfYFKdoZAeoBM +doJEe4FPfIpFeYNMcIFAc4FBcHxFc3tEcX5Ac39LdIBIfIFJfYBKiI9OiZJRipdWjZFRhpdO +fo1FfIpIeoZGe4ZKfo1GhYZRfoxJiItNipVQi4pVgJJHfoxRgJFLhJBSiIxPfohIfoZFeohK +fYpGe4dMf4ZMe4hPiI5XhY5GfYhMfIxLdIE/ZHY9Y2g5YGw8VVY7YF88UFw4WVtCXms4XWlA +anE5aHVAcHpBbn1FdoRHeY1Mgo9MiJBNgI9HfotRg41OhYxMgZBQho9PiZNPiIxPhpJPipVT +iZxSi5ZThZZOipNglJ5ck6JgkaVTiJVVh5xUh4xhi49lioFgbGdCSUlRTEhOVE1iYlX9/sH/ +//////////////////////////////////////////v////9///9//r////////////4//r6 +//b6//v8//3s/+/c9dXt9uX9///r9Onr9+X0//Xr/+r9//rq/ez8//Xx8+nu8eXx/PL7//n/ +//778fH5/vn///79//v5//L3//P+//73//T2/+7z/+v4/+7+//z//+7r/+L+//j5//BeUWE2 +Qjc+Qz02QDQ7RD86RTlER0Y+QT80Pzg1PzkvQjU7QTkvPzE8PzozPjUxPTgvQTcyPzY7PTcz +QDc4PDkwPzk6PjsyOzY4OD0rPTg8PkU/T1hLVWZql6CYrrWKp7CEl6JylKV6j5t7kJ93jJ1V +ZXJEWGZ2k5t4mKF/iZtadYdthZFnipdshJJbfY1ke45XcoFed4NripRuiZNsg5RmhYZsjpVx +jZlsip1zjp1ohZlwjJVsjqJuhJ9oiJdrhZVriJhof5Nqh5RvjJpuhJpvj5lohZFsiJdpiZdw +i5hpiZVvipdviZxvi55hfJBhgopqippohphpfZhhgo1jfI9kjJdpiJlzkZ14laZ6j6NshZV0 +npWOtrCZrL6NqbOOpK6JrrKXqraFp7CYtbiYr7x+lqV9l6Z4i6FlhZJpi5Zsip11jp15kKZu +epJGX2VmiYt6mp96jqN8maB6kJxjdIubk326n3eNZV5mfW1idH55pJ2SrbSJkLJzdpBmdoZz +hI6WsLmjusKYvLePsbeHrrKWtbuKqKuMsbKJorJ5lJmNtK+euryMq7pvf5KFsqiQsbeRtbWS +tLuNsraUubqYt7mhwMOfw8KhssFykJWMrLV7kaR1lKR0mKJ5l6J1laNym6Zzlah1lqR4nqx6 +oKp/nqt5pKt5nbFyk6VvjZ5zladvlaV1m693maVodJtTi3t8oq56o6p/pKx8qLSAo69ykqR2 +maN2qq+Iq7OCqLZ+prCMsbmGsbmIqrmGs7WBprR3mqd4nqeAq7SCo7B2kqJkf4tigYaBqLSC +obCDq6yQubWgu8mLsLaFrrWHrr2FrbeMsLiHpa5/q7KLsLGbucJ2i5Rzkpl7qaKUubuvys6i +vsN5kZ51mJ16kaB1jJVykZpvjZFsgpZaiYNTjJlXio9ThZZVjpZJipBUiJZIhIpWhIxIgYhL +i45OhZZZipBWi5VWh5dMgpRPipVbiJNOjJVakpVTj5RWiZZUkZFXjJZOkZNViJJJjJhVkZRZ +iZRRiJVKhYlQi5VKh45Qh4xWi4xLiItPh41RiI5JhI5KgY1LiIlPgY1DeoFJeoREeHtGc4A/ +fYBIdoFDeYBIeIhEd4FHbHw8cHJGa3c8c3dBb3s/cX1Id39Fg4JMiYtOjJBRio5WiI9IhY5K +gIZFfINJeoJVhIVNhYpPgY9LiI9PiZNTh4pSholNh4xTho1Oi4xRgY5LgodNgYlCd39EeIFD +d4FRfYdFfH1Lf4RLgYJMe4lOgIdGeIRCcHxAanI9Ymo8TVQ4XV07Xl88YGI8Y284ZnM+aXQ8 +cXNDd3tCeXlLfIdGf4VMfYNHgYNTf4pDfIhOe4VKfolRg5BRi45ThpNOho9MhY1ShpNPjZNT +i5NPhpFTipVTkZRblptalptkkJtgi41tfW5vXVVwUkRtU0hbTkJOTkVaVEpoZFLu/az+//// +//////////v///3///////////////b///v///v///7///r///////////3x//Ly/+z7//n5 +//T9//fo/+3j+dfw/+/u/Onm9eHv+ujl7+D4/v3///Hz/ev09+77//P///71/+3w/+rs/+j4 +//fy//D+//vz/+37//H2/vP6//D9//r////7//v///7y6uby+/P///3///Lq7eBYTVQ6QTc9 +Qzg3Qzo9Pj02QjZHQj81Qjc9Oz0wQC47PT42QjM3Rjo2PjQxPTgyPDc6QDU4QTc3RjU1Pjku +PTYyPjoyPjc0PTgyPjM1PDk6TEtHUGROXm6BpayasLOGpKeBlZ9ykJt7lKB1mKF4kqNWXnhO +WWpmjpODmqB/jp1jd4dnipBthpdlh5BlfYVkfI9Vdn5idIRkhI51iZduiZNngolkh5Fzj5h1 +kp1xjZxujJhxjptujJ5vh5lqhZlniZFniJlqgY5ujpluipZxiJhwi5lui5hxjJtsiZZyiZlu +jp53kJdtj5Z2jaJcfo1lhJFzkptqgZZkhpdlgZJjgZBpiZZyjZxxjZh2mqB5l6JxgpZeeIRy +nJGbubmiu7yUrLeOqrKQrbmPq7WWtL2furyBlqt5n6R9mqxyjKBziJNtkaBwj5pykZ50jZ9Z +ZIZdfGl6mJx+laB6mKCAmKRmeIWqnoO8onqKZVxneGhgdn50kpx/oqqGra2VuLieuryeucGY +u7yUt7yIsKuHqLCDqquTr7uGq6uPs7WRrreHpaWTtLWavb+OsLN4hZ1/q6GPrbGTs7eOrrCO +rLGLqrCQtLaVubicxL2cu8B5i6CGsqeMq7N1j6Ryl6J7oat1laV5naJ1naZ8mqV6oaR/o7F7 +oqp7qLB8qKh6mqxsjJlqlptvk6Bum6J1maZviJ9RdGR5oah1oqOBp6uAr7SGp694nql3mKZ8 +pLCHr7qBrLOApbB/sbGRrsGFq7GNtbd+p7d8nKp1pKmGrbSEoa5zlZ9kfJVbeoGMsLx+pqiH +r7WZxr2WuL+CprCDq7GHtLiPt7iLsbiIqbGHqLCCsaySvsKInKmAk6F5nZWJq7Goz8y6z898 +iZR4l5p4k5hxkJlzj5JtkJlyj4xjhIxaiotVh4pVjZJRlYpYhoxSgo9IhI5NiZNRiJRMf4xK +hpBUiIhFio1aiYpPi5JVhopLh5RVj5FShpNSi5BRjo1WjZRPiZJTio9TkJJPjJJPipZRj5Za +hZlJi4pWiJJVhotPhoxQjpBViJVLjZFLipFMio9Lho5KgYZUg4ZDgIJLfIlDeYVKeIBCdnxF +eHxDen5KeX5De3xIdXw/dH5Ebnc8amxEbXM4b3NHdHk+fIFPjIxVkJFSjJNUj5BWipNMgIdO +fYtBgIBOhIlIhYhKhYhRiY1RiZFXjJNPiolUhoxQh41QjJBRhotMhItMgYxFfoNMdYJHfXxJ +dYJEeoBMf4pKiItRgY1IhYRNfYxCeIVIaHk2X2g9UVk3U1A9UEs8XFs9ZF07Zmg9bGo9bm5B +cW9BcG1Fb3ZCdHtEeX9Fe4JHe4hFfIVMf4tIhIlKgoxOiolXjJZFh41ZiI5LipBUh5BNiZRW +i5hTio9gko5ql5JyhnZ3a1ePalCkclGvfmCsgV6Wc1Z2YVFYV0dhXUZpak/w/rH////9//H/ +///////////////////////////////+///+///9//z6//b5/+/0/+z8//j9//nv/+vx/+zx +/+7n+ujg+9Ty/fDp9uTg89j////7//Xs9uji9ub0/e7t/+v4//L1/+vy8ubw8uX7/fv///v8 +//n4//P7//D9//r7//L7//b7//X2//b9//f+//7///////fw//D1+ern6NtZTls7RTk5QDc5 +Pjg9P0E2RDo5Oj81QDc0OzU2PTU2Ozo2PTw3Ozg2Pzo6PDYxPjk1MzkyPzs+PTYuOzg3ODsv +OzM4ODotPDQ+O0I0Pz1CVlxGVm5feYuIqLCSqLWAn6WAk6F0ipp4jqB1lKR6laVhan5EU2pl +iY9/laZ8kqJse5FjgIttipdkh5NjeoligZBfcIhRcHxngpFvkZlziZpggItsgZJliJVtiZxr +iZVziplwipRyiplri5trhZpsipZnh5Vph5Zrippni5ptjJhyjZxsiZVvjJdxjpl2jJ5xip5y +jpl1kZ1thZVleo1giJB6k6NqiZJxiJhegpNkfZFihZZsiZhpi5R2kZxwip1ofpRccYBWd32A +q56mwLmluMGVsriXsbqRrrWNrrWXtb2Uorl0l6F6lat7mqV0jaFzjqN0jZx+lKN3mJ1seKFK +WFxzkJR8jZ59laWAl6NsfIerlIe6nniaampfb15fbX12lJl7mKJ4n6SFpqqKq7KOrrORsLmS +rbqNr7GHpLKPr7OXtMGHo7SJrrSPqrR/mqaVtrifur+Vr7l7j6Z4npOPrbqPqLCDoqx9n6KB +oq6CqKqMqLCOtbabvL+Hkah4oZWWr7h+k6Vxkp12laN1lKR2lqV2mqV1kqZ4oa59pal4na92 +pKl8qLF/p7NwlK9khpJqkKNtk6R0mKRyj6tTY25tmJ58oq96pLF/qK2DpLN7obBxlqZ8n6x/ +qbOBpbB+oK6FqLOHqraHsLSHr7aHp7R8orB5oq96qLGHqrB7k6hheIxhg36Rr7d+qLKDrLab +vsWVsruHprSFq7CRsr6PsbiNqrqHq6+FqLWCrqyPuLyftsSjwsyZsLeUvsav2dOtysV+kKR1 +j5J3kJ9wjZ1viIhrkpN0m6h2maZxi5ZVj5VTi5NVh5lRiZNTgZFFhYlWgoxLiIpMhZBFhY5M +gpJJhI9QhI9IiI9TjZZWhZJSjZRRhZFIhotOgY1TiJZRiZNOiZFLiZBViptRiZdShZZSgZlM +hpJJh5Fah5FOhpBRg5lPj5JUiJtOh5BThpVNh49LhY5Tg4tIg5FMfYpJe4BDd31Ecn5Ccn1D +dIdJdIZCd35BeIFHc4FAanU8aXI/anA8anJBcnpJdn5Fg4JUiJBTi5BShIpHiI9Sgo5GeIdM +eoJEfIVJf4dKgopJiolPiI5TipJUiItKhY1Lf41MiItSg41GgopOfIhIe4FDcoA/d35Id3pJ +eYREf35LhYlLgodHgIFIfohGd4lAZ3Q8YWs8VFg4Tl04RkczTFI8T1c0VWA/YGg4Y2lCaHA9 +bWxMdH4+c39Meok+dINJe4VHe4pGfYpJgIRIdIZRgoVUhotQg49SgYlLg5FUho1ThpBXiJBx +i4Z/eGmXaFK2hFzAi2nCmHDDoGzElG+wh2mkeGF7XlNcTUVOUURzZ0/4/br///////////// +//////z////////////////////////////////////+///+//7////////6//n0/e71//Pp +/+fm/t3m9eDr9Obq8uHr/+z6//b9//v9//Xp7ebz9/H1/+/3/+7+/vn///79/+3z/+72/+7+ +//v9//n+//j1//r7/+7r/er3//X6//L1/fDz8ur+/vr//fP29/Hr8eJdT142Qzs8REA9RjY9 +QDs5PTs6Q0AuPjQ7PzovQTc4QDoxQzE5QDs1OzE6Qjw0PjM3PT0wOjU7Pzo3PjI1RDc3PTYt +PzY5QDw1Qj02RENCXmJMbHl+oKeKp7GJpa2Foax7kKB1ip12j596lZ9+laJmcoVMV2tuj5F8 +k6F5maF0gpRgfY9ripdmhZVjfItceYdUdoxRbXxXeH9piZZsjphuhI5lg4xlgZBriJVtjJdp +h5Foh5BwjJpsi5ttiJZqiZRngpZlgZBtjJxvi5Zti5Zth5NphZZui5Vwi51tipdwjptzkJpy +kqJ2jJ5ie4ZnhZBujJpqhJZlg5NphpZkhZFkhZFriZVtiZFzlJ51kqBxh5lecoZYdH9ggYd7 +o56dsrOdtL6XtrybsbuGpq+UsrShvsF6k6R7m6h6m6h2iqdskpR6ladvkqJ5jpxtjJtWVntX +fGl4jZp2lpp+mqKBl6WtnIm7oHmne3NmY1hfan9ykpp9lp53jpx7lZx+mqiFp6mHrbGLr7aF +p6qEna6DqqWJr7R8nKd+o6Z4opyDoa+RsrWfv7+Wub6Om7hpkoyKrrWCpq2Dn6OAoauDnax+ +o6eCqa6Kr7GVubiWr7p2j5WOu7OMqbpvkJl2lKV9mqV7m6V8oKh7nax4oah8orB7n6Z9oal1 +pah+prB7n65xi5pnkZNwlaVylqJ0mKlea41Zhn15qK2ArLGCqKt7qLF/o7J0laJ0oKeCrrGB +qK+CpbB8rayKsruEr7GHr7aDsbJ8oLN3qKx9pKl7p697oq1bcolijIOHsbqDq7OIrKqVv8WP +rraDq7OGq7SLs7WQtsCKq7SDrq+Eq62HqrGHsLGSwbqZvbyhysakx8qn0cmyyMx5jpl8lpdz +kJhpiItliIVzk6SFsqqbwMKRobFfjZVWkphLh5dTh5JRiYlPiItMhJNUi41ViJFNiZBSiYtM +g4xUiZFLiZFakJ5QiIlYjpJRj5lUjZdLj5JVi5NPkJtYj55WjZpXjpxSl5hUjJZVipRRjZNS +jpBNipBXhpRPjJJYiY9SjpBVi5BNi5JRh5RNh5FNfolMhIlMiItEf4ZLeoE/eX5Hd31Gd35C +d4FEfYRJe39Dc389bno8bXg/a3Q8bm5HbXc/dnpKfYZMjZFSi5RPgYZRiZFKio1Pfo5Ee4dD +fopLfoJQf4dGhopTi45Oi5FOiIpJgotOhI5Ng4lMh4pQhotGfopEeYRDdIJGfX9GdoJEen5L +fIJLfodUhYpIgIZPgYJHeYZEZHQ3XFtDUVA1Vkg4SU84UU8/W2I4XWE9ZGk9Zm49aXQ8bHdE +dnpFcn5BeIBFd4FIeX1Kf4hMgIdGfIJJfYNMgYRThINOhItShYtThotoh4d4gneYd2ipgF3K +n3PKqHjVqn3OrXrSqXzNpnXHmm6yiWenemCBY1ZeVkZVVEltb03x/bP///r///v///////// +//////////////////////////7///v///////v////////9//n2/+79//v3/fDs+u3i/eLl +/9n0/vHs/efv9uj5//Hx/eru/fP6//X5/fL4//f69+72/fb6//j0//Pz//H0/vv///74+fH5 +/urr/+/s9+no/Oj7/vXv/+ry//Ht/+z39+31/u7t/ej9//vu8OZaTF8+Pzs8RztCRkI7QTk9 +QUE2RTw7P0ExOzM7QTkuQDk1OjkzPTY+Ozk4QDUxPjU6Pjs3QTY2RDkxPTUuOzc8PjsyPDs6 +OTszPT46TE9Fb3Vuj6CLqrKHo7GFqLCEmqp7kJp4jp9zjZl/k6NtjJtXZHtLWW1liJB5laJ8 +lJ9uh5dieYhkhpNhgJNofI1eeIRjeYhVbn5Vc4BniJJrjZpugZJmfIhhf4hhgY9viJ9riJdu +h5ppiZtviJdrjJh0jJhrhZZphZhniJlqiZttjJ1uh5ZtgpdujJxyjJ1tjZpwjZtsjZ14k6Jt +iJlhgItjhpNzjZtph5tnhJJoiJhheYxpiZlrhZRvjp13jpx6laF0jZpfcIxacHlYcHtlgY53 +opuhvcCgvr6nvsOQpbiMrq2dvb2CkrV1l596nax1kadvip14k51yiJxzkZpvi6Rqep5JV11p +iIZ0jpt5jplyiZiYnoy7o361kHxpWk9gfHd1kpx7nKN1kaRvkZ16mKV+o6mLrLKGqq2BpKZ+ +oqmDoaaLqq+Fpq+Kr7WStrqPq7aYt7eauLqdub2IobRwi5CIqrKIqKx9nqt+oqp8oayBoaZ9 +n6SBpq+Lr7WPr7qAlqmJsK2YvL58l61rkp14mqt3mZ17mqV6m6d8oKl3nah9pbJ7n61zm6d6 +oq57rLR2la1lipxvk6V0k6JynahpfJdMdGp1pax4pa2AprB8pa1+pLVynaB5oa9+q7GKqrSA +p6x/pq6FsriNsL2GrrGMsbp7n6t7nq98prCArrmAn7BicolejYWBqrCEqbWDsLGRsrqEoayE +r7WJrbeJrreMt72ArreJqLZ/qLGDpq58payPsraJr7SVvb6Ot7Wcx8advsWAmZ15i59pkI9m +i4hrmpSBn6yOv7aaxsWgv8JxjJhRi5xSkZxTjZhRj5hWjZdMipJMhI9Rh4hQgJJGgYxLhZJK +g4lYiZNPiJBNfo5RiY5QhphRgZNSi5BVj5RTj5VUkZhXkphVjphVjptRi5xSiJBUipBShIxK +i5NNh4pShJBRhJBJjY5agZNEgIpNhYxGg4lQfYdEgYZQfopEf4hLeH1Dc31HdXtEc38/eXxK +fYtGeYJIdXxDdX8/bng8bHc+aXQ6bnFCcXVJfIFPg4VPio1QhJRKiY5QhpJMgIZKfYpLf4xK +f4dGgI9NhIlRi45Ri49OipFRf41QhIpNgolOgohOgYhJhIdLfYRDfH5KfINAcXtIdn9HdoJO +fYNMiItRf4dJfYlJc4Q7VmM8SlM4Q0E2SkA9T1I9Tk89V1k8WmA6W2M9Zmo9aWxAantAbXRB +bndAcndFdH5CfINRfYdJe4dMeI1If4xUgYhPgYVfiIx0joWdjHG5lnDSq3vVtYHZtILatIba +sn/Ys4TUrnzOqHvMmnO/lWy2gmuogmCIaVViVUdaU0lsZEno+a/9//T///////////////// +//////////////////////v////////////////9//7w/+/8//X7//r5//X8//ro/ufd9tLi +9N/h8d3g8tzy/+34/fH8/e/1+e79//v7/vXx//b+//Dv/+z5/vH///72/evq/d77//b1//L5 ++Pf7/vr//v7///////////////vr7en+//rz++3z++/q8uFjTlw7PjdBREA9RjlIQ0M/QDI/ +PUA2QDs2Ojk9QD08PzQ6QDg1Pjk/Pjg3QDc0PDk6Pzk2Pjw5PDM5PTk1Pjc1OzY7PjcvQjpD +Q0A5S1RYeIeLq7OQpLOIo6+Mpq19l6d+kJxxj5x4jaB6laZ2i5pcZXpPXW5ohY18k6N/lKR1 +jp5meItjgoprhZZgfY1hdoJieoxVaX9VcH5riJBzippxhpptf5VjeYdmgItrhJBqhJNrh5hw +ip1wi5txjpZvi5dsh5xqhZlpipt2iZlvjJpvjJpujZxyjJxvi5hxiZprjZh5kZx1kqRqhJ1i +fI9phpdxjZ5yh55shZhuiJhmf5RmiZR0i5dqh5l3ipt2k6BziZVoepNVbntecX5edYJsiY+V +uLKhu8GZvr6Rp76Ir7CduLiWq7p6kJ97nqyAmqpzj59yiZ9wjqBzjZNyj6Fxi5xVYYVVaV5t +ipByi5dyipyBj5CxoYG8nnyCXWFfbmJrjZR6kaNzj595j6F8l6eAlKaDoaiHobKBpqqDmqqE +oaqQq7GGq7WMrbWSsrSNq7WUubWkxcmfvcSKn7dwh5OGqq+EpKx/nql9m6B/nat9pKp/n6l+ +pamFpqyMsbSUpr18npyatsWOprl2kZ92nad9na97mql8oa99oa18nKl+oK17oaZ8lKp3nKt/ +p7N9pLRxhZ5tjpRykKJ3laFrfp1OYmVrlpN+pa15oal+nq96pKt7mKtynKp/qreEp7SJpLR9 +qbCNrLmOtLeIq7mMrLmBobB7nrB7oKWCpbONprZvcpBlk46Eq7WEpreDqLCQp7SGq7CPqriM +triQsMSIsbOKrriMqrSGpbSBnaOAn7GEqKx9qLONrbOKr7aWvLycvMiJmJ9+kaJrf41hioWL +trqcwcGUtbqKtbGSvcaMkaBXh4hViZZTkZVahpZTipNZh49Ifo1Vg4pGeYdNfIdJdoJPgn9R +iYtQh45OgIlMgYJPipFOgIlVhpFRiI1djJZWj5JZkZVVj5JUhZVTiJNViZRMh41TfJFKgIxS +gYpSh5FSiJRPhpFWh5JOg5JPg4tQg5BXhoxMfolRe4dFgIBGeoZAd35Ecn9EeH5LeoFEdn9F +d4ZCc35IbYE/cnpCanY7anNBY3NHbG9EcntIgodOiI9TjJJWhY5SholPho9OgIdDdYNGf4FJ +eoRKgohai5FSiZNXg49PiI5Tg4tSiIpPh41Kgo1Qg5FJfYROeIJDdn5KcYZEcntOcn9He31S +hIlKgIpQfYdLZnpBVWA/UmA3RUE1Qj47SUs8T0xAUVo9VllBWmg6YmZBbHNFam1HbXtCbnhJ +bX4/c3tOdYRJeYFSeIVNeYZhgYZsinmjinPAn3DTrX/VvYnbvonauofjv4ffuYbduoHZr33c +sHzbrnvPq3jQnHPFm26ygmGod1+KYFRkUk5cVEVuYlL7/rD///////////////////////// +//////////////////v///////////3///////P///3////w/fD5//X3/fbk9OLs/tz9//j8 +//3y++319O/0//X2//34//H2//b2+Onu/ej5/fP///T+//r+//X9//f///7///////v///L9 +//3///fy/+/z//Ht8+Lm/Ob4+vP+//j///Xu9uvy699ZTmJCPT0xRz1JRD81PT9DQDo8QjpA +QTg2PDo6Pzs9PDw2Pjg8Pjo6QTs9PTUyPjg7PDo6QTg8PjkzQTk7PTs2Pzw4Pjc3REA6RkZD +WmNago2Xs7mLp7KLo7OFnqt9mKh3kqF3jKB7jJ2Ck6JxhJpPZ3VcbH5ojJl/mqB8lJ57j55m +eY5qepBiiZFlg5JddodceotWcYdWaHpdfohxh5dwh5psh5hshZBieoZke4xkf5RsipBqiZVw +i5txi5xtjJ5yi51ri5dziZtnh5ZzipxriJttjZlriJ1vi5pqkJhthphvkZ13kqFqhZpkhZdl +hpR0kqFxjZ5vjZ5xhp1ohpNmhpRnh5JxhZpxipl2kp13kJ91hp5ic4ddcXxacYJfeH95nJyS +treetb2Rr7eWr7mTs7educCAlKyAlqN8prJ6kKpthp13kqR6lJx3k6NxiaFyg59GTWZggnlw +jJVvh5hrhY+Yn5OwnnSVcGdZZlh0jZh7k5+DmKt+nJ+Al6Z9lqCDn6+CoamAmq1+nKKBpqyK +rKyGprWKq6+Xs7iUp7uJq7GbubuXtbqPrLt1j56Hpq6Hoq9+mqF7nKN+oa5+m617m6aBpKqB +p66KrbOTtrWJm6uTu7egtMCBmbR8m6d3kaF8pa18m6p/o7B9oa5+o6iEqrF+m61vkZ16q7CD +q7R6nqxvhp9uk5p1mad0japRVW5kkYd+qah/oLB6oKl8qLZ8n6p3oKh6naiAqbiIqrSFpLON +rbSJsLOMq7KIqriApbR8pqeDprJ9qKqDq7RveZhtlZuBq6yHp7eMsLGWprqHsrWLrrmUtbmI +sLuSsb2HpraJpqyDpbSAn6t6oauCpah9oKyFr6uDp6uMuryqwsuBlZ9/iZlefIxvl5eWwsOh +wsiUuLePsLWJsbeYr7tnd4Nej5pemJxhlKFYi5VWi5RPi41ahZhPg5RKgY5Je4dLfYdLfINN +folHhIhTe4lQiYxWgJRPh5VdiZVJjJBYi51XjY5ci5hUjJdhj5pShpFUgphKiI1OfJFKg4pO +hY5SiJRLhY9XiY5Njo1Rgo9KhopOh5FPg4pLgYpNeoVJfIRKcoRDc31GdoFDdYJKdIlEfIBK +eoZEdYBGcHw7bXNCZ3Y9aXBBaHJDbm1EdoFKhoZai5dWhJZUhI5Sg4xKg4xNfIlKdoZKgIRP +golQg4dUh41Pho5LfodLgIRUfYhMg4ZTfo1HgIlSgI0/dIBRdYBBcYBJdX5Hen1QgYZJg4VX +g4lJb349XmQ9XWJDTlg6Pz83PTpBT0Q2Uk5AUlU9WV08W2E+YmpDZ2lDbXRFbnlFdHxHc3xQ +doJTfX9riISLjHarlXvAonzIroTPun/cxI/dxJXfwYnlv5DcvojiwY7lvIbetILcsoHatXfZ +snfZo3fNnHPFkWq1f2aufV+HZldqV0tZUk1iXU3o/qr+//r///////////////////////// +//////////////////////z///z+//z+//3////5/vf7//L///r3//Tp/+vh/9ni8uHj7djm ++OLq/ebw+un2+efs++r+//7///fw8+fs/On5//X9//T9//D7//n+//v6//Po/Onz++r9/vv6 +//X3//Pz9+v9//7///////X8//T5//z///329utdWGFEQEA2QjhESEk/PzY9QkQ2QzY5QUAy +PjYzQD00RDk8PTw4QDU7Pjc1Ozs1PDc1Pzw8Pjw9QDc4PTY0Ozk8Pzc7QTc8Pz05TVJJXGps +naGbsLiHoKyGnq19n6eCmal6j555jaJ6kKR9lKZ5lJ9fZ39TaXptkJR7j555kJ56ip5pgZBh +fYtheotoe41edYNbcoVgdYhOZnJgfodtiZt0jJltiJpuhZZleIdje4hqiY1uiZVuh5dujJly +iphzj5hshJhriZdxhZdoh5VyjKBuipNxiptxjJlyiJtqh5RviZlsiph1kqBsiZxkgo9khpJz +lZ1xj59ujZtriJhrgphmg5FshphshJVwiJ5zj51zjqJ+m6CIlK1hcoNcbYBacHxmdYN2lJGX +tLifvMGQq7mOrrSUq7aRpbp1kZ6AoK96mK9yjJp5kZ99naZ9lKN3kat2k6Vjb5hPYlhthJBz +hpVuiJSBlZXRrIewi3RfX1J3jpR/lqGJpq5/mqR/l6x3l6SEnaqBoqt+mqVzlaGDoqqBoamH +o7GPsK2VsLiForCKqK6WsrSQrraRqbiAoqqGo6uCm6l8mqN7mad8oqWBoq5+nqR7m6p/n6eK +q7KLrbKUrbiPta2mv8ectryCl656mqGAorOBo6x7nrB+pa6Co66GrbKEqLB6lKd4nqV/pLGB +pbR4m65ngZZwmaZ2nK9aXYBYfXV3oad8nKx3o6yEpbB7nK19nKh3oauJq7GCqbCLr7iDr7WO +r7eHrLWLqa+BpbR6qbCApbF3oayArbZ8hqFqjpuGprSGsbaMq7CSqrSJq7SLsrSTtcWRub2L +rLmIr6yFpLCCnad7mqqBpaeCpa+CpauGqreGqKyItLemzciNmKBxh45hfohyq66Rv7ybusGL +r7aMrLWKqrORtsODjZlRipZelJVblJhajZZUlJhjjpBMjaBZiZZFg5VUfIpFeIVSfIBOfIdM +gI9Ld4pFhIhThJFNg41VhIxVipdYippRj5pijZpQjZpci5JRjZFYkZ9QiZBUgJFJgI1QhZFW +kJZNi5BMjJJLhY1GhY5WhZBQgI5NgYtPg5BLfoFGd4VMeINEdHxHdYFCeoVJdIRFe4NIcIE/ +bnxCa3c9bHZAY3E7aGlCY29CcHNFbHlCfXxTho1Qi49RfYZPioxPhpBPgIhHeYRIeIJHe4FQ +goVRhotQgYZPg4xUg4pQfohPhIZRgo5PhoNQf41GeoFNeoVDd39NeYNGen5MeoFLgYFUg4pL +eH9CYmtBWV86RFE0QDw3QzU8RDo6RjxBUEU8WFhAXmE+ZGg+bXVGbnZIcndXd3huiHOclH2w +pnnHrofMtInRrovNt3vYvITUwIvbxIvdv5Xiv4zcvIbivoLhv43guIjdtX/cs4DYrXfdtHfc +rnvInnLIl2i6hmWofF+ObVlsWktaVE1aX0fm+6n+//X///////z///////////////////// +//v///////////////////////3///v5/ffz/uz9//z3//Tm9+Lp/ufl/dnx/O38//Ly/O38 +//Xy++3z++zu++jx++ny/vD3/e31/uv0//Dx++7w+Obv9+rw/e3u9Or5/vL///35//H3+e/y +/PL///7z/+f4//Ln6+Pj9eX4/PDv/uzx8eVmVF89PUA7SkA+R0JBSj8+RDw9Pzo7Pj87Pjc6 +OTk/PTguQDM7PDkrOzVAQTcxQTc+PzkzOTZBPDYyPTY6PzQ2PTg4QTg3Qz4/VFpJZHJ1oaCV +rbaKprGFnamCnaiBm6Z1laN9jZ11jp15kaJ3j59jZ4BQaHhujpV+kZ54jp92jqB5hplgf41j +gZFkhZBieo1gdYRjeopYZntVdHxojZJ1i51qh5JwjJRmgotkfYxmgolnhpRqipVvi5psjJhu +hptxiZtwip9ui5pxiZhvjJpvh5RuhpVtiJdwiphijJpmiJdrjZlyjZ1pgJdifYZfh5Fsj5V5 +j55wjJpphpJihI1lfZJnh5Nqg5NrjJt0jaFxj5d4kp+VtbSEjK1bdYFacHtbcn1geH50l5mX +tbGNsLibubaStLegub96lKt6mad+nah5jKdylKBxjp5wkZx2kKB2k6VvhqFBUmtfeXJmg4py +hpVqiY+js5uIdWZrX1NtkI2Alp95lJ96l6B6lKN9laV8n6h/nKZ9m6R6maZ9laSIp66KrbKK +qa6Goq2Qr7WFqqaNrbGMq7OVr72BqauKqbWDoqqCnqx4m6CDorN/nKd9mqN6nap8oaeAp6mJ +rLWQs7GTsbekyMehw8SMpLl9o6l6oad9o6l+p6yAoqp8pKqFqbd+o6t7maVrkpyApa1+prd9 +pqxzkaZxj5x3oKdld45HYmBwnJ51lq99nad8oKh8o6t9oq19oaqBqrGGqLSDqrCFsLSKr7mJ +r7GGq7WHpq96pKyBpLR+pqyCqLh+m6pwl5+Kq7CKsLqKqK2LrrWKs7OMsbaMsriJtriFqLSH +qbB9n7B6nat+m6uApKqEqbSFq7CFo6yEq6yKsr6px8l4i51xfYpbhouDvq2StLyMtbiFqbKJ +r7GDorGOsa2Vsb1jfIBXj5daj5tbjJpeio9Xj5VVjJVWf49DiItRfI5FfINKeoNIf4hQfYhL +fIVKfoZFfoVQgYlNh4hNfo1ThoxRiZtGiZhUkpNgkptXjZVWjZVRhJdLio1Of4pKhYlRipRM +j5VViJVOiI1Xi5RRi4xSgo1GgYlOg4hGg4tIf4tEeIBHdINCcn5Ldn1DeX1KeoJFdoI/eHxF +cnlDb3dBanU8Z3M2ZWs7ZnU/aXBEdn9OgIRYh5NJg4tOiY5QiJRVhJBGf4VKeYJGeXxRfIdN +g4pRgYtOhYdMgYxKhYhIfohNgYZJfohMf41JeohMc39AcndEcHtFd31HdXpNfIBLfoNNe4I/ +YW0+UVg2Pz08PzwyQTc8OzwyPjdAQUI3S0JQYFBWcFhyfWeFh22glW+qm3S4pnnFsYXItoXP +uI7RtojXu4bSs4LRs3zQs33WtX3auILZs37at4Pat3nds37btXvdtIXasXfdrn7ar3jWsHzQ +n2/Ej2+3hWGlfGGPaFFuWUtTTUhXWErh96T///z///z///////////////////////r///// +///////7//r///////////////39//n9//7////////7//Pu/fHi/NPu+unr+uPh797z//Hy +/ent++vy/+nn8OX6/vz///////n9//P7/e76//T09eft++b+//3////v8+fm8+L7//j///n0 +/+36/vj///r///n7//z////19+/x695oV2RBQz46TEBQTUc/RkE7REI8RT0+SDw9Qjk1PDs8 +Pzo3QDU5QDo3Ojk/OUA1QTc5PTU1PjU7Pzk4QTk1PDo8PTk8QD06RUZIVGVRan2Mr7SPqrKG +prGGpbCEnqh/nqt+k597jp97jqB1k6N8k6NqbYNTZnZskZeCmah3lqd8kaJyi59qeZFefYpt +g5JnfpNac4VfeYhdcoNMbHZsh5RtiZZwipdyi5prhZRje4ljgY5nh5FnipJqipJziZZxjJlw +iZpujJ1zjp5tjJ10jJtvhplwiJdtiJRwhphojZtvi5pwjJt3kp9sjJxkhJVkiZd1lKR2jqJv +jJdrhptrhpZig5ZqiZVvipl1j6B0kaR2kKRxkZ6Jq6+Tr7ODkKpieYdfcn9Wb39mcoJsjoyF +o6aQt7ScsruTtLeLn7d6lqV+nKp4kqRui51tjJ91jp52jqZzkaN1jaBdcZJNWlNogopvipBw +h5VtgpGBh4tqY1dyi4hyi5pxhptsh5R4kKF1lJyAnqh7mqZ+maV7maiAn6eFprKJqbGJrKyJ +p7KLqLF/m6CLrrOYubqdt8GQsLeMqrWJpK6EoKZ+nKuDpayCo699nq+CmKl8nKSFoK2GpqmP +sLOXuLmbuLuVt8CSrrl+lKd8oKqEpbSDqa2Co7GDqquDqLGEqrKAoLFwk6J0naN6prGAqLOF +qLN3mqtznKdwiKBOVmVkkJB3nKl1lqR7obF7nql7n6mAqrOAqbSKq7KCsLeKsbeIq7SPrcGE +rbOFprSBp62EqrWEqrWDrLWApa14nZ6Ip7CHrLaHr7GHpbWDrLKMtLyMr66NrLmFpa2DpK6B +pKR9oKp8o6p/nap+p66Fpqp/qKyBp7CIvbuct8Fzjplrf4lliY2XwMCRsrmQr7mIq62EqLCK +rqyPsLmNvbZxgpJWiohcj5tYj5VZi55Vi5lYjptWjJpVi5FSho9Sgo5FgYFKcXxIeYBNfYBJ +eoFOdIRMfoFKf4xKfIdUgopNjpVYjpZWkJlikp5QkJVXjJZSkZhVjZZPiZNRhI9Wh5BPkZlT +h5pTjJhSiZRUjpJTh5NQiJFRgJVNg41GgIRRdIRJd4FHc4VAe4JOgYpJdn1Pe4dCeX9GdoBi +g4FPbXlKbG9CZm8+Y2g/Z3FGcXpLgIBUhY1VhZFRgohTiY5Vg5FOgYVLfohNf4NQfoROg4dO +hotOfIhRhYZUfYZKfIRQgodKio1chpBJeoZSeoI+dHpMcntDcX5IdHpLe4FPgYVRe4VJbnk+ +QVQ4Qjc4QDgyQjo7Pjk3PDk9PztBTUNlZk9/f2CPimqfmHSpmHKwnni4qXnKsIXMt4HRtozW +t4LTtYfXt3/St4bXtX7RtIHbsnfZtoDeuYPauH/jtoXZtHvftH3btX/br3vXrH7UqnfPpnPH +mm2zh2SqfF2bdll1XUtZU0xRWEjs/av///////////////3////////////////////6//z8 +//P///X///7///f////8//z+//T+//r+//f4//T9//bs/+ng9tXm9ePs9+Dp9eX8///5///5 +//P9//77//f9//v7//b0//P///7////9//X1/+/0/vL9//7///n1//P+/vb9//75//D7//f7 +//P6//Pv8unz/On6//P9//ju9+Z2T2s6RjpDRUZGTERKSkVBRD9CRz4+Rzw8Qjw4Pzs5Qzs5 +Pzc0Pzo1Pjo2Pjk2PDY5PTk6Pj4+Pjo6PDg8Ozg5Qzc9QkE7SUhBU2dYg4yQrbqNpq6Fo7GK +oK6BoayIpKmBlaZ0i512j6J0j518laVwf5RKYHZiiZOCnqiCmaR5kaJ6k59mf49ng5Ftipho +gZdgeo1ZeYhhcohMZHNnhJJsiZRwiZhqhZdxhZpif49ke41lhI1rgo9ph5JshZpohpNyi5p1 +kZ51j51xi5l4jZ9wippwiZduh5lwjZdohppqhpVwiptwjZ1vip1rg5pohpVxkaF0kKFziaFp +iJ9vg5xhhZBqhpFri5h0kaJujqJ3jJ1yj6J8mKWCqq2evbqHnbRfd4xdb31dc39jcYODo6KX +tbmZu8Kar7mWr75+l6eAoqt/m61ziKRzkZx1kadyjph1jKB4lKJukKJJWHBWbm9ofYluh5Nt +gJRuhI9uaHlkg4Fqh5Noh5Zvi5lwiph2lZ57laN9laV+naOAoamCoa2Fo6+IpbF5mKuBoK6A +pbF/maR/qqiYuLqUtMGNqq5/prCCnqp/nLF7nKeCpq+HqLSCo6x8oKmGp66KqrOMqbeLqq6V +s7iVsbyYuL6Us7yBnat6oKl/n6mAo62EqrGKqbKLrreHrLeEp653naxylad9p7WDq7eFrbZ/ +orF0kKBvh5xRYmxghIdzk5x3l6R4nqt8o7J4oamAp7N6oqqHsLWIqrOGrbqKsraLrraGrK2E +rbeAp62DrriFqrR6q7WIrLB6nqiGq7OIq7SJsrKJq7OErrWNrLuJsbqRqbWEqKyFq7N+o6eD +oah+qK+In7B5o6qEsLiBqqeFqLWKsK+esb53kp9jfo5kkZSawMOMqrSFq7B+p7SFrK2EqrGN +u76TvryLpaxSgoZckZpXkphZi5VRjpNTjJtTkppbkJZRiZFXjJhEgohLe4s+dn1RdYNDe31J +doFDcX5KeoVMf49KgZBRio9Wk5pakJdak59TlJxZiptTjpdRgppOhpBOhJBKf4xQiZFPi49T +i5ZRi5RZiJhNiJRWg5JQiIhRf49JgYVLfo1JeohId4NHfoNFd4NJfIZDeINKeYNFdH1Td31C +anREYmxBZm08Z3BBZ3M9cHJQfH5KgYVXjZNIf49ShYtLhJJWhIpGfIxSdoVKeoJOfYNMgYZS +hopOhpBQgoxLeX9JfoFRgodLgolOe4hIfoNMeYFDdIFJbntEdH1LeX9MgIBNhIVPeYY9RFM6 +PUI4Pzc1P0A7Ozo0Pz88RDo8RkFfY0x3e1qRh2eZkG+nl3KsmnW8pXu+rILLrIHStoHUtYvQ +tH7SsILPs3/YvILVtYXbsX3YtILes4PbtX3ktoPftX/cs33itoDeuYLYr3vPqXjPonPClWu4 +gWSufl+ad1mDZ1VgUkpWVErb+qP9//T///z///////////z///////////////////////v/ +//////////7///////////////////z6//X6//3k9+Hn/db8//v2+/Ln9uL5//X2//by//f8 +//f7//j5//H5//j4/evr/PT///7+//X9//v///7x/+z2/+76//X///71//P9//j7//X++/P0 +/vP2+/P8/+z6/e3u+Ojs8uRxVmc8Qz8/R0VJRUE9RD5DQkI7RkFBPkA6PDg7Pjs2PTdAOTg1 +PTg9Pj42OTc4O0A1PTk9PT43PDg4OzswQThAO0IyRENASk9EWGldfYeKsbSUrLqOo7CHoa5+ +maaAm6p+kaZ2jp53kaCAlKR8laZ5jaFJXHRph5J7mqJ9lqNykaB7kqVzh5hthpdnh5Vng5dh +fYthd4lbdIZTXnZbeYFphJZoiJVwiZlyhpZsgo5ieY5lgJFjgpFpiZdwiZpviJZtiZhyi59s +jJ5zi5xrjpZvh5xrhJd2h5hsh5dwgphghph1iZ5vjJ1xiZxmgpdohpNwiZ5uj51wh5xqiJ9s +h5dkh5Frg5JyipZujZxshZ5xhZJyi5xxjJuBm6OHqKmcs7qHoK9repdXbXpfc4FgfX5/paSg +u7+cucGWsbyFmbJ/ma2CnK96jKdujpd3j6Z0kaFxjp1yjpxyjKNrgaNLUWJifHlmhJFqgZNq +hZBtg5RlgJFpgZFogY1ugJJtjJR4k512jaJ9mJ97nqSApKqBoat/pqx/mqd7lZ+Doq18n6t6 +kKZ5lKCCp6uIrbGGpKp9oamBoqt/oKyDnayCpa2MqLWZurzO5djc8enO593I2NnL2dfV4dvd +8OTf8+Xh8uPg7OTOztmbq7uMrLiOr7aKprmMq7SPrbaIrrWAoax3nq95mqZ9qLSCqLODpLOB +qLVvgp5ZeY5XdGxwk6J3maZ7nKyGqbZ+obV2naJ4oKx+qK+KrbOIrLWJrLKCqrCMr7aHqK+C +prN8pq2EpLSBpKqEpLR/q6qTqbyMqrSPt7yLsLKPs7uMrLSCqbGCp7KNqraCoLGBpqqHqrGC +pK6BpbGCqK2DpLKEpqyDrLWOrrKVsLR+jpxjgYp0n6OZvMKPsLx9oq+Fp7N8pauFpbZ6n6uH +tLWSq7pofYZUj5dgkZ1ajpdRlplekJxfl6BamptXk55ZkppVi5NJgo5Oc4REc4VNc35Dc4JG +bn1GenxIfYtGh4ZUgpBRhotYjZFYkJtZkKBVkpZZjqBTi5RShZJWgJBQf4xRhZFMhI1Ui5RT +iJhSiJhXh45JiI9QiZJOho5MhotPgY1LeIpDdYdLdn5AdYBMdH5BeH5ReIZEeIFUe309dntF +a3g8ZHJBZ209ZG9Da2xEdHlKgolUjJNWhY5KfIZNh4tVg45GfotLeYVMe4FKfIdMgYhNgohP +g4pRgIpPfYZNgoFMg4FTgoNOgYpOgIdKfIVIdn9EcH1Gb3xJdX5PeYBOgoRXfYQ6SmM6QD83 +QTo5OjgwQjY5PD42QDk6RTtRVERtbFSFemCZjGSnk3KumXa1oHTFqoDLqX3MtH/NroHQroHZ +sH3Nq4HWtH/TrYLUsnvZuYTatIHfuoLguYfft4Hbsn/gr3/YsHrfrnzRqHfRonjDk2vAiGun +gWGgdFmEa1JvWk9aV07j/qz///////////////v///////////////////////////3///// +//////r////////6//L5//L2//Pz/u7q9OTz/+zk/t3n8+Ds+eH2++/1/+nz9+b7/vH5/+/4 +/fD0+e/69/H+//r///L5/vrt9+vx/Ov3/+////3////////7+en+/+/2//L4//D9//7///Xy +9PH1/fL///X5//L1+et+V2RAQkFHUEJEREJDRz06RDhERj42QDlHQDwvPDZIPz0yQTlBQTkx +Ozk+OjY1OjpAQTszPTo/QDk3QTw2QTU5Qzs3SEZBT1pJXGJagYaLqrCVrreHqKySp7CFoKeG +n6d/lqV+j6N7kKB6lKJ8mqZ7kp1TZXxWfH53l593m6F1mKZ5j6N+i5hmgY5riZdngZZkfohh +eoldd4NYZHtTdnZrhZhoi5pzjptyjJpuhphkgIxlgYdkgIxpho5rjJhvi5lzjZl1jqBzjp1y +iptxjJ1uhpZxjplsi59wi5xuhppni5Vyj5ttk5t4iJpri5VrhJlukJx7lJ5vjp5wipxqh5Vn +iZNpg5ptiJhvipd0iaFzkpx1jKRwh5RwjZiCmqOGqa2YtLabqLxqeZddb35bc39ghoSArqCh +v7+Wt7+Wrrp7mqSMq6uGo7B9kZ92mKF6kKh1k6R1jJ90lZ14k59dYY9QY1tpg4tqhpBrhpFq +hZFoh5Rtg5lohJBmf5Bqg5Jxkp93kZx7lqR8nqJ8o6t+maKBoauAmqR7lad9oKiCnax6kJ55 +k6d9mqCCnqp8l6F8mqiBo6WBnqOEoaeCpa2aubnQ69vb9OXY8uDf9Obp+ufj/OPU7ePR69/Y +8N/a9+Ls/evw/ers5+fe4t/m3uPW0tzBwMybsLuXsLeHp7F+pKx4maqAqayFp7aCq7OJqbZ0 +g6FZdHVTXmpqi5d6nJ9+qLGJrrOLr7p2mKdnh455oqiKsK+Nrr+HrLKLsb6JsbKLrrmHqrWF +qLiKq7ODqbOBrKyErq6Gq7OErbaOs7yKtbaWvrqIrLGQqreHprKFp7CHpKR9pa6EqamDpq6H +qKeFrbGDpq2DqrCKq66Pt72kwcFyipVqgoh3q6mbvsGMrbuEqrGCpauEpKqAo6Z5oqeGr7Gc +ubpqfIRWko9bkppVjpVajJ1bl5JdjJdalpJgj59XjphamJ9WhJhZiZFKfIZKd4RAcXZFc3ZC +c3ZJdXxIeH1SgYhLiY5UjpZalZ1ilJ5WmZxXkZ9XkJ1Vh5lRipJOgJVSiI1VipFHiY9Rh5NX +ipFZipBTioxYiY5KiYtRh5JTho1JfYpOf4pIeYVJeIRMfoFCd39Kdn1FfIBKdn5EdH9Fbnc+ +aWtAbWs8aWU+am8/dHJNfYZSi4xZj5dMfodVhYZTjIlJg4xFg4ZLeoFKeIJLeoJPgYdThopS +iItMfYJOg4dRg4ZShIhPgYdJgItPfIRHc4BMdn1GcnlLfX9FenxPe4RMgoFUZ300Qj88Pzkz +QjpAQDg7QTk7Qjc+RThCUEBjZU18dVKOhl6ljWuqmnGsnXTAqXXGqnjMsHvNrnzPrHzTsn/V +toLUuYPbsnvYsH7as3fcsoPbs3rhuH7fuoDitXzds3vbtXzcsXjVr3/SoXzHmGzElmuziWij +dF+MbVB8YFNiX0rV+qD///n///////v////////////////////////////8//b6//D+//L/ +//////v+//3+//z9//r3/+z1/u32/+/y//Dn/9fx/e/1/eru9+bt/+/1//P8//D1//ny//P8 +//b6//b9//L4//j///z////5/+3u+/Hy/Ozw++bw/+jy//X9//fx/PD1//T1/+v5//Xw/Pr/ +///0//P7//zw8d6CV2k8PDs+R0NDSj9ARDw3Pz85QTg6Ozw1Qjo1PDw+Ozg1OjU1OTwzPDQ1 +OTkyPDc6Pz4rPDU5OjszPjQ2Ojw0QTc9SlBBTE9MWm5SgYWCpK+MrbSNqbSOqbKBoKl9n6p8 +mal6j6N/lqF0kaJ6lKd3k6ZfaINObX10j5t4kaJ5kKR5lqJ7kKVff49ph5Vdhppkf5RXdo9j +eo1RaoBKaXRngJBkiphvi5tvh5VripdkhJRmfI1ceo5kgpFkh5Vviplsj510jJ1vi6Jwj59u +i6BrjZhwjaFsh51sj59uhZpripxzjptujKJqjJtig5pph5Zyjp1yjZ1si5twjp5th5lmg5dr +iJhriJhni5tuj51viJhzi55mhJNpi5ltj5p6lqGBoKaSsLWKoLdjdY1ab3tccH1jgId2lpiL +q7CPsLyFn657m6uMq7NuiaRti5V+k6p2mqZ9k6dripdwh55ykqNJVW9KZmJqfY9lgpJthZRq +h5lvhplngpRle4pkgJNwhpR1jp96k6Z5laJ6lqJ5mqZ7lqd1k6J3lKh6mqWAnKx2kaJ4k6J2 +lKR+nKl2lqR7lqd8oKh/oKt5l52EpK6+6NDf8+jS8uLT7uDm/enk9ejg+ejs/evs+unm+urq +/Ov0/+3///D//+7//+z7/e77/+z9//Dp5uTL2trN19LLzNW4vcqfsLqVsr2UrMKEqbSBnbJY +YmpbZYNbiH94mal+p6+HsbWIsLp/pLFyj6JmhZOEpqqJsbeFqrWEqbCFq7SCqa58p7WAqbCC +qrKHpbN6qbOBpq6BrbGIprGIsryHsLWHrrWLq7aCq7OMq7GBqrCBna+BoKyCp6mDprWBp6uE +qrGEo6yDqq6EsLaPvb+arrZziZBnh453uLGatb6EqbWFp7N+pKx/nat2nal+obGBs6yUt79p +eYJWhZJSjpJVj5hak5ZVk55SkZdWjZpWjZtVkJpdjaBWkplXiKBSipRIgpFGdH5Db3pKbXc/ +bnxIdIE6coBLgIlEg4VSkZFUjJphkplXjaFZj5pVjppUi5FJhpJKhI5Nh5NLiYxQh5BRhYtL +hJNKhotRi5BLiZFOg41JhZFLgY9NgJJIeopFe4ZKeYVAc4BCb31BdH5Hcn5AcH9CbXc6aXY8 +YWs8Zm43X2k3aG1Jd3xKg4NQhoxMh49MfoZGhoNPgJBGg4hKeopJeINLfodJhIZSgodKg4hK +fopJd4NLfoNKf4VPfYhHeoNHfIRLdIFAcXtEb3pEd31Dc3xGdn5Ke4BQdYU3RlI4PTwxPTY6 +PDgvPjQ4PDYvPTZBRUBZXkh0bVOEeVyXiGeekGqslnS5oni+qHvApnvMqH7JqHzOs37Ss4PQ +r4LTsH7VsYHYrnzTq3/YsH3Vsn3atnzds3/YrH3VpXzOom3TpXDJoGvJmHG0jGq3hmqgeF+Z +cFt2ZlFvXlDM85v9//X///7///7///j///////////////////////////n////////////+ +//v5//T+///7//b9//T+///4//zl+N/a9tTt/ebh9N/h8Nry8+br+ery+ejm/eL4/fH8/+zp +9uLy+uTx/fL7/e3h+en+//z///n///79//X7/e/0//Px/+zy/Ov5//Tl9ePh9OTu8uj3//D8 +//r///Tq492HVmk+Pj06RTw+PkA2Qjo6PTs2RjY8QD4zQDc4PDo6PDc0PTc0PTU1PDIsPjY4 +QDg5Ozs0PTY3Pjw3PzgzPTc6REE/TU9EU1xLYW1Zfot2oaOPrLONsraQprF8nqZ6m6p4lqB4 +jJx1kKB6lKV8m6SBmqdxc5RXcYJykpp9kqWBkqJxkKB3kJ1nfpJripdph5dih5BdgZFZeIxj +boJFXWhigo5hg45viZdtjJhwiZZoiJVsgZVaeoRmfYtkho5yiZlwj5p3jJ11jpp0kaF1jaFr +iJdwi5psiJhsjZptjJpvk59vkKBxiJ1phZdmi5Nnhph0lKF3jqRuiJdxhZligo9sippqjJlp +hZVlipZ1jp5vjqFzi6BmhJVshZJtiJZ0kp15kKGEnqaNrrKJlrBlcIxYaXtXaHdXc3hhf4F2 +pZZ9nKl+n6uDo6x+na13mKF2lah2kKJ3laVujZlvippzjZlwgKJJUWdXdWtng5Rrh5Rphppu +j5puh5hjgIxigI9oiI10lJ98lKN6kZ91k595kaBzkaBvjpt4lqB7mKJ+oq14nKZ6lKN3kaF+ +m6h3m6d5k556nKx+oKZ8naSdyLfZ9uTe+efb8+fm+uf4/+/6/+39/+78/+f9//L9/+v//+v9 +/+3///L///X///T9//b9//T+//L9/+z9/vPx/OPv/+n6/+f49+r6+ubu8efd6uHDwdCXe6VV +c3hSb2lxnKGCqLmIsbWKr7h+p7F8orJthJx0p6eJo7yGrreJr7SDqrSBp6qBqK6Bq7KEp7OH +rLJ/p7OCrK+JqreHp62NsryFr7WIrLV6qqyGp6yFqbCCo7V9pauFo7CDqq6DqLB/n65/obGB +oqyJo6uBq6uUu7qXsrR0h5Jkjo2NucONrr+EqK2BpK18oKd3oKd5mql6oKyHsrCRsblkdYFD +hYVThpBOiYhejphVjppWjJtZkpZdkZ5PjpFgj5tVkJ1ih51UkJhVipJMgY9UeolEbXw9Y3JA +anM5bHNCdYBFgYNSi5ZVj5dTjp1WkJlNjplWj5pYkZZVhpRHgYdVhI1Lg4lNg5BKh4pRiZNN +ioxNi5VLjI1ThpBQgoxLhpJQgY9GfYpKe4ZFeYJDdH9AdHtEc31CdHY/bn1Db3M9ZXI6ZW08 +X2pCZmY7aG1Cam4+e3lOhI1TjJJMfIw/g39Vg4tEhIZNf4lBf4dOfIFHf4JKe4dPhY1MhIVL +doVLh4BQgYRPgodMfIhEfYFIfIJGdYJJdX5Ac3dIdn1EentMeH9Lf4VDWHM2PUQ0PDczPTs4 +OjQzPTw1PzI3RD5RWkBnaUt9dFWOg16hiGilkGi0lnC1nHXDpX3FrHrOrnvOsHvStYDStoXQ +rX/Tq3vUt33Sq4LSp3fXsnjWtoPct4HZrn7Zq33TpXHRonHHn3PGlW23imWvg2OodlydelOG +Zll2ZUzb/rP///////////////////////j///////////7///////////z///v///z////9 +///7//T9//H///n2/vPv/eX2//Pr/+L7//Xz/ezz/e7v/+r1/+3+//7z//D6//X0//T+9/Xy +//L9//v///7////9/+/t/+7u/+nt//L///7///Pt9+r3+u/+//n///v6//X9+/T3//f+//f4 +//n//feTWGhDQkA7QDdBRkY7RTpHS0I6Rzg+RT8/PzZDPjo9PT86PjY5Qjk7Pjw6Pjk4Pzc7 +PDg4PDk7QD43QjczQzw8SEpBSVBEVmFNYHBab35fiJOTs7OXtLmTo698m6iInKV2lKJ6ipp1 +j519kp98m6V8mat7iqRbc4F3k5p4kaJ8kZ1+kp53jphtgJRriJZthplkgY1ifo1ce4dkcolL +V21af4dniZVtip1wiJpxi5dsiZdthZdleo1hfY5niJNripV0jJtzjqB2i6BwkZ1xiZ5zjZ5z +i51wjJl0jpxsiZxtjpp0jZ5xip5uiJtph5hnjJpxkJ52jZxyi59yjJ9riZpwhZl3iqNthJNo +g5RxkJd3jp1xjJpwgJdngo1uh5Vuh5Vxh5t4kpp/maSNsKuVprh3gKVlbIJXb31gb35dc35k +d4B2l5mBoqyDoq54mKF/mKp+lKd1kaB1kqFxip55kaZ1kp1pdplIVVhkfnplhY1rhJdukJR0 +jZ1ieotkfI1igo9zj5x2mZ92j5xpjp52i5tqip9tiJlyj6F3lp94lqR2kqd1kaB3lqN+nqR6 +mad1lZ2DmZyDn6GPq6/A5tHi9uff+ODe8uX3/+3//+///+7//+37/uj9/+/9/+b9/+z8/+r/ +/+7///D///P///L///L///X///H///f9/u/4//H8/+39+uT+/+/7/u3r+eDY5NbQ19STf5Bc +ZXVomZGNrrWIsbuRtrmFrLiGrbR0jahqmZiFsraOqrmErLeIsbmIrLaDq7SKq7OGq62Eq7GH +qLeJrLOJq7SEq7CVrruIp7KBqriIqrCGq7SBoayIp7CGp7KIq7CEqKmHqbGHqrGEp7SDpbGC +pq6Oq7GavsWesrZshZVrk5OSvL2NrrWHrLCMrK2DnKZ9nKl3naeApamEqqeMp7Rtd35EbndS +iIdVjpRhkphWkJ9iiZNUjppgiZVTk5hjkpldkKNfmZtgkp1XjZVSh5lNh49NgJBGcYdEbX09 +ZmVBa29CeX5QgIhRkJFcmZ9jlpxdjp5blJVflJpWjZVaipZVg5dRholOg5NKhJJRg5VRipNO +jZZSiI5KiI5Vi41ThY1ShY9NhYlNgYpNgIZRfYlFeYFMdoRDdX1LdoI9cXdHaHY9a29CY3A9 +ZGc9aG9BZm5GdXtKgYVQiIpYgYxHe4tMgIdPio5HfYtGeIJGdoNKeIBIfYJSgolOgIlMeYFI +fHtWgohKgYdWe4RJgH5Re4dJd39Hd4BJeIJMdYJJf4RSgIZRe3xLa3k+QUc3QjQ4Ojg1QTg6 +Pjk7Pjk5QjVGUj5haEp7dVaNflyYh2qfjWWukHCvl265oHq2mnLLpXjIrX3JqX7GrH3PqXnP +rnbUrn3OrX3Wrn3XrnrUtXzfsn7YroHWp3vPp3jOoHjKmm3IlG3AjWu5gWOpgF6gc1WOaVSE +cE3a+Kn9//f///7///////////r///////////////////////r///////z///3///z///7/ +//z9///9//j8//X6//bu//Lq/934//vq9+bl8N77/Pb19ezy/e79//Tx/+7+//3////7/+/1 ++ejq++n1//f1/+rq9ef4++71//n5/+7+//v////////7/fPr/Or7//n8//D+/+/x/ez5/+/m +8d2iXXA7PzpERkNAQztDQURBR0E8QD5JRT07QDk5QTo2Pzc8PTk2PDk8PTg2PTc7Pjs1PTk8 +PD86QzkwPzY8QkI2VlZES1hEU2RWYG5LbndpgI6Hqq2ZsLSAnKmHnaZ5mKN9jqF8jJ51j6B6 +k6B6k6iAn62DnKRcd4h6nqR8kqZ2jp17kJx3jJt1hJVnhJRziaBmgZpof45ie45he4xPYHpZ +d3drhpJth5NzipZuiZJvipx0iJlkf5FlgIhhgJBqhI1xipZ6jp9zj6B1kqFxjJ9yi55yjJ1z +jKJvjJxsiJpojJhsip9whpxugpZnhJNogZBzkptxiqBti5pwiJxxi5NlipRyj5xmgZZrh5l3 +k55zj590kJ1qgplmgI9siZhtjZlviJpzjptxkZ59laOBq6qbsLh5h61qeIpbc4Rdb4Bab35o +hYmCm6d/m6d5k6eTrbOEoLd7mqN6maV3kaZzjqF1gppvjKBdX4REX1Znf41kg5BmgJBnipJq +g5xkfoZje4tmjJZ0i6NsiJdxjJ1rh5VyiJtsh5Rtipd1kaFylKt0j59yjZVzkJ94mKJ3k595 +laKGop+OqKucxbfN8drg8+PZ8+fm+eP///L//+3//+/9/+b8/+fy/Nr3+tv9/+T//+////T/ +//f///T//vT///X///X///b///f8/fD1/+79//D+/+/8/+39/+by+9/l6drQ4dmxnr5cbXJs +io18rLKRt8CIs7qPrLyBqrV+nKtqf4mHs7SNr7qHq7SLrbmFq7CEq7SArauGq7eGq7GJpriC +pauEpbGErquLrraHp7ODp7GLqbiFq7GOqbyBpqaFqbKEo6iHprSDpq+BpLCCp6+Hp62Lp66L +srehur+Onq10iZF2mZqgusKTr7iPqLiFpqqBnaeEm6J7mqeFoqeOtraOm69aaH9MbXtBb3RW +iIlZjZNklJxSlJ9bkZpdlJ1bjZ5SkZZgkpxakpxalplfiZlZkplZiphLh49TfpBBeYdHZH03 +Y21DZG9EdHdPfo1akZxdjJhSjZdYkJVaipdYjpxTipNXjZVMiJdTi5RMj5dTjpZQiJJShJRO +hY9UipZTipNSiI5QhpFUhpNPg49RhI9DfXxKdIREdYJLdIFHd4JIbXs4a3VDaXI7Zm9CZG49 +X2c9aGtFbXVEd4BQhohOgotNgIdLfX9QiYxMg5VLgYZNfYVIen9MfoZPgIRVgoZLfIROdoBP +g4ZVfoRIfYJKfolJfIhNfIZFeXpKe4JKeoFOgYdSfoZUhIhQcX44QEM2PjY2PTY8PDs4Pjo2 +Pzg+PDtCSjthYU54dlGNgmaaimSfhGmjjmW5j3Ozlm7Bn3W8pHDJpHi9p3HHpXXGpnnPpnnN +p3rPrHrSqnrWsXjWsnfatH/Vq4DUp3nOnnHInWzMnW7GoXLGmmu6hG+mf1uge1iQblmGb1jZ +8Z79//v///7///////z///////////////3///v///////v///////////76//X9//f+//v/ +//n9//f5/fbu++7h/OPj/Nbz/u7s9uPq/Ofq/uLz++31/eL0+e7t8+Xu9evs++n1//D///7/ +//////////n9//v///////P5/+3t++79//D2//P///n///v////q7ef3/fj5//P6/+/u8uWo +XXQ7RjZBQD89RD1ARENCRj49Rz86QTs3Pzw5Pjo8PzU5QjY1QTo6QDs3OzY0OTQ7Pjo6PTk5 +RTwtPjk7RUU5TE1CTlU8VWFUZm9Qanxvj5uLq7SOoKuClqKAlqB/m6h5k6B4jp90j552kJx5 +maKGoa14m6ZacYZ5mqJ3l6F3jqB0jJtwipx1ipdjhY1rkJhthJhmf41ff45igoxVbIRPam9k +hpRqhI9lipdphpdpjZZxi5dphpZnfZFigY5mfItpio1ujaJxjJ11kZ1uj5t2jJ9ykJ50jKNu +h5htiZdujJ5xk6BsjZ1riJdmhpZoh5VxjJVqiZ5si5dtip5uh5lviKFvkJxniJhqi5NwkJly +jZxxkptshpZlfY9jh41sjpdwjp50iptuipZyjJ14maKHqayZu72dssR9jrJsfZBnfZdogIh+ +mqp7n6V/m62Nqq6OrbOAl6t1laR5lKJ4nKRziJ5rh5l0g6RQXXpQa2Rgf4pnfo9jgI1wiJhl +epNid4tfhJBvj55qjJprhphxjJ5yjZ1viZpxkqNxjppwk594lKJrippxkZ53kJx6l6KKoqCT +sbCcu8CkzcPV9uDZ8+PM5drs/+X///T//+j5+N7t4cHp2brp47/t7r/v9rz2/9f//+T//+3/ +//D//+3//+z///D///L///X8/e71/+v8/+3+//T2/+v3/unr/t/u8+LX7tO/scBTamdieIB0 +m6KLtbGJsraRsbqJqLqOqbhxe5p2p6iItLmFrbOHrrKDqLCJq7aBqK6Dq7KCqK+FrbaDpLGC +prCFq6+Hp7OEqLSGrrKOqrmCp6mLqrWHpayFpLeCrK+Pr7iDnqJ/oqyJp62BprGHqKiMuLa1 +y9K6z8y9082+28/I39O328+82c+1x8WbqrmFpqF7payGq6eTr7h4iZhNeX1XgYZEb3lKeXlI +g4VhjpRZkJZZjpRYiZldjJ1TkphXkZhZj5lRj5lVjp5Si5lYj5tOkZJRiJROiZNMfYs9bHc+ +X2c/bm1EeH1MjIlSiZRUi5BVjpVNj59Uk5hSkZ1Xj5VPkZZWjZFNjItRhZFQjpJPhZBJhI5P +iZFHiI5RiI1SjI9RiI9Oi49Rg5BKf4NNgIpFd39KfoVBeYJKcH5BeHhIbXs8ZXQ5Y2hBYWwz +YGc8Zms9dHZMgohViJBPgI5JeoFLi4lRhpJLgIlMfYNDfYNNgIpMgodUhIhGfn5JdX5FfYJS +goZMf4BTgYhKeIFPf4JIeH1GfX9Kd4FPeoBVgopRf4NIZXQ6Q0M0Pjg6QDk1QDg4Pzk1PjU2 +PDk6RTVVVkRsb0+GfWCMhGKejmyklmu3lnKxmGu4l3S3nXDBnHK/n3DFnm6/nW7GpW7Lo3HJ +oXXLqXfQqXnSpnbNq3bPpnjRq3bYqnrPpH3Rp3XGnHG7lG2xi2aohmKjd2CYelmSdF3W76j/ +//v////////////////////9//j9//n///////7///X////////////+//7+//X///n4//f3 +/+/t/ezz/+r2//rq/97x++ns9+Tp9uTt/u/9//7p+efx9Ov9/vz///n8/u7p/u78//b8//b6 +//b7//P5//33/+v1/+/y+fP+//z9//Hz//v///////////////3///z8//D7//v//++5Zng9 +RDdCQkVETEFDQEQ9Qzw2RDs7Rjw8STg5QDk7Pjg7QDo4Ozc5QD44Pzk1QTs6RDk3QzlBPzwu +Qz86SUk4TFBIVWhEZXVfcId2k6iUqrKMqrOLpKqAn61/maaEmaN6k550i6JzjJx6lKJ6lqiB +o6t0lqJfcot1nKF+l6J2kJ12jqB2j5xzi5xceZBojJhqiZtlf5BfgpJfgo9hdYhLYGNjhY5k +iJRqjJtviJttiptzjJtviZpqhZZlgo5ngJJkgItxjZd0kKB1jp5ukZ91lKJzjZ5wj51oi5pt +hZlsiZt1jqRqiZ1lhZdoh5xoiJt0jptykJ9oiJptkJxwiJxwj6B1k6Rrg51niJBqh5Z1j5xu +iZ5ti5NsfpRngYtrgY1nipRzh5lwhph3ipdui5p9l6R9oaeNsLGaub6asMKRqr58ia6BoKCF +oqd/ma6AnqZ/pK56laVzjaF1lal7naRxjqNoh5ltkZlnfp1MVG9WfHRmfZVdfoxphpNuiZxn +eY9mh5BxjKJsjpxzjaNwjJ93lKF1jqFwi6F0kZ5yj6d5lKBzh552k6B7lKCFp6eTtLqmy8Wk +xMel0M3X9eXY49zr9Oj5/+v9//D69NL488zx6sbq38Pf2rLa1K/Wzqrd2K/f3bHn77n0/9b4 +/eX4/+b+/+n///P///X7++3u/+r8/+r3/+/y/ebt9+Tu/ePx9OPe7tzArMVLYVltgopxiZh+ +pamGsbeQtLyfx8Xx/uzv2Oiut8KVtcOLsrKLrbWHqrGHrrmHqbKDqLSErbWIrLSEprGDpKmH +r7WHqbGKrraJp7SNqLSKq6+IqrGHra2LqbKJpbOLqrOKrK2Pqbmbt7yyz8nE4M3B3Mm10cCq +w6uitKydt6qhsaWInJCIkpGCmoiHwaGz1cStub2ct7l/jZxxgIlRfIFljI1UfJFOdng/dXNS +g4dTlZtYlZhVh5JVk5hZkZtYkZxbk5hSi5hfkZ5RkZlckqBShphWiZpShZhOgpVDf49EZn87 +a2c9am1MfIBPjJJWj5lVj5ZPjZNYj5dPjJZRiZVRjJtWjJNSk5lVjZlYjJhViJlUkJhWiZdN +iI5WiJhMh5BVgJNKhotPgZJIgIhIfIxCe4NJc4I/dX5HdIFGc31HcH0+aHhDZnc9ZHA2ZnE+ +anBBbXlGeoBJhIxRio9MfY1LioZThotKgIhWgoxKfodNfohFgoJVg41NhYhKdnxFeXlNgIVM +foNRf4ZFentMeYRKeH1GeHxMeYVPfoJShIVOeodAVmg1QUMyPzY2PTo5Pzg4QDc0Qjo9Pzw1 +RTZOVkRhakx8dV2Ig16jjGujjmyskXGrlm+6mXWymW++oXOznnK6mXLAonDDo3DHpnbGonjI +pnLKqHXUp3rTrnrRrX7Pp3zTs3/PpYPFonXKnHHBlG63imyyhWKpf2mgelingWTc6KP///z+ +//z+//n5/+7+//z///////////////////////////////v7//X///z////4//b9//f8//72 +//L8//Xw/+7p/+Du/ezp9ube7tz///Lj/Of9//Hx/fb9//n8//P9//b2++/t/ent++X0/efw +//X+//n3//X///r///7///f0/+v8//T5//Hy+enn/OX0/fD9//r5/+70//Dx++W7XnA7RThC +TEVESkBERUU/Rz9CRj87Qz08QTdBQjg6QD48QzU6Pjg2RDo6Ozs0Qj06Qjs4Oz86Qjc6RT88 +RkpEVWVgc4t1j6CApKmKqq6Eoa2Dnql9mKmBo6uClaV/oKOAl6p5jJ57kKR5jZ97l6R5n6d+ +lqdefZF8mqJ4laF8lad6jppwi511i5pse5ZujZl0jaBlhpZkgJRffo1jfo1FXWhjf4VkhIxw +jJZniJlwh5hri5p0iplqh5ZpfpNkhI5od49mg41zj5tvjJh3jJ52kKF5kpx0j6JsiZpsh59w +i6F1jKNuhJpki5VrhZVngpJ3kaBvkJ9xiJttjplti5p0lZaBk6RtiqByiZVnjI9ziJ1ijZZ1 +j51of5Nrf5RpgZJthpVyh5l4jpt4i6FwiZx4jp95lZqAm6eErKqWvrmpyMahsMRpiJJ6nqCH +oK2Al6SOp7ODpLB0lKlzkp5zkqhviJlwjZtsiJpziJ9sd5ZGV2hefHplgZFng5Bsi5hqgJpk +hJNvj5xvkJ9ziqV1l6J5kaZxhp9xiZpykaFzlp+NpauYrbuxv8ehuL+iwb+hxMO10tCkw8ao +zMbW9+Xw/en5//D5/+j///D09tnr4bji16zh0KzW0qzZyp7Zy6TZyKbZwqPeyJvXzKHW06fi +77bv/8v8/+7//+3x6+TR9872/+v7+ert+eXo99nu/Obx/urs+eXo7ePg5N3x9unm4+LIwtiN +rqyZwbzf/OX+//Dr9uS62NSqz8iyz9GmtsSIra+KsrCFrLOCqLOIq7SHqrCKq7GBoaGHr7CR +q7WNp7CNrKyPpaqQpq6XrLKzvL6/x8m+1c28072jxJmaroqSo4GVkYOUjG+RgnGNinGTiHiF +eWaNf3WDeGKCfHFue2psdXBXWltRZVNrr3uj1MCxusGGjJNdeH9dkpJZiZZShYxMd3xIe4NN +kpFcjp1NkJVdkZxVkJNijJ1YkZZiiJlQkZVciZlPjpRgi5ZXiZdRj5FRjJdNhJJOfo9JZ347 +Y2dAcG1Ce4FRkJBWi5NZjJpQipVSjZxPkJtVi5pPj5BZkJlWi5RSi5pSjpRUiZdUi49Qg5NO +iYpRiZVTipJQiZFRgY9NhY5Ph4tMfYVNgIdKfIRKeYFIcH1CbnxAb3k8Z3Q+YW47Zms/ZXA6 +bHdPd3xEfoRWipBQg4xNf4FJg4lYgolKgoRQf4tOfIdMeIRLf4RThYpRfIdLd3xQgIRMhYpO +fohJfINQeoJKdH9IeH5Ne4JOe4FTg4dOc31CS1k8SD03QT08Pzg3QDw6Pzg4Pz03Pjc5PjpF +TDtUXElyb0+DelqSgmOaiWumkm6skW2ymnaxm221km6xmW65mW69pnHBnm3Epm3DonXFo3bI +pXfLqHfPpHLKoHnNpXjRpHbPqHfLonbHoW7Hn3O/kW22h2eqfGGegVukfVvk/r7///////// +//////////////////////f///////7///T///3///r///////////X9//r////8//L5/+/3 +//Dl/eLj/trq+eXe6djh8dnv//Dx+eb0/fX2//H6//r1++bz/vL1//H///7///v4//T9//jx ++eX7//b+//z///v7//T///j7//b8//f8//H7//zz7+nv9e39/vv9//v09OO3Wm9CRUU2QUVC +QkQ6QT5CQkE9QUNDS0E+PkA5QDk7Pzk5Pzg7Ozo1QTQ7QTk1PTY7QT01QDw/QT86RUc/Sllc +fI14kZ5yhJhmg45yk597laWAl6R7lKeCnqaBna59naaJoax5kKJ2jZ51kqN+kqJ+mKR5lKZU +cIN9lqZ4k6F6kqB2j5p2iJhth5hyhJpchZBuh5plgJJkgpNffpRhgpBFW3NYdnphfYxqhZRq +g5Nqh5dsippxjJ9viJRvhJZoh5Nog5JkgItzipFripVyjJp3kJl3kJ5sjZx4kKJkiZp0jJxw +lJ5yip9mhpVugpNpjZJzjZxxkaFyiKByiaFripl0k513kqd0i6Vjg5FripRujJ5tjplwiZxo +iJVsgZRphZFzhZpriJhyjJtwippxip1wjJt1j593mqd9mqeAn66RsLWas8KFjrJwio6Epat+ +m6uAoKeDoa55nKN3lqV4j6xxiZpviZh5lJ5ujaV0i5pkdphIXGtge3tkfIRrgJdvjJdogJ9r +kJZvjaNzkZt4lah1j6FxjKJwjZl0kJuGqK+6287T5+PW8OXD1N2my8Ov08+72dqsw8+gxL7J +89zs/+n2/+n9/+zx7M7h0rDZzaLbzqPUyaneyqjZxqfeyaDax57gzKfj0Krn0aXl0ajp3avu +16/p3bHo9cfz9OS+wqbq/t72+ujv993t8t3v++P8/uPw/eDm/uP7//D8/+v7/u7u9OrHvM52 +hIuP1KHV/NvK4dq9287I4dfe9OPBxcWKq7GLsLWPqbGLrqmKp62Lp6WWoJyNmY6Pl4iQkoGS +hn6ak3axmn+2l32zi3SrmHiolHipj3mokXa3mXy6nXW8mYG3oIW8pXa+pYHBoH+7nHaslm6m +kX2li2+fhW6Sf2SRdGZ7Z05dT05JVElVXVdrk3mp0sW8zsmlprdokJNch5lNg49QfoZJgYNR +lZdajppelZJbkp9fi6Jem5lik55VjZlikZ1ak51hipVUmJtZjp9RjpRZi5FKg4tMfI47aX9D +Wms4Z2dLgINKh4hdjpdUj5tWkJdPkZJRjZdVi5VRi5pVjppVkJpViJhViJhTjZZYjpFSh5JZ +iJNPh5FUg41KiJFRgI5Ph4lQfYtKfIpNeIhKdoJIdoVDcHtHaXpBaW5CZXU9Zm05Ym09Z2xB +cnFKdX1HgohPg4tPfYVNe4VShY1PfopLfIlLe4dNfYlSf4pSgIZPe4dTeIJJe31TfYhHfoRT +eYdEeIhOeIJEdn5RcHxKentMenpNaXM7Q004PDs4Pjk9QTg1PTo5PDo3PTY8Ozk8Pjk+STxZ +XUtvb1GGd1iOeGSbh2injm6rmGutkW+zkHSujmyukm2zmG65l3LAn27BnXbEmnHFpXPHp3nI +rHnKp3vTrXvVrYHMpH3MpX3LonbIl3TEkm3BjG2wiGmpf2aceV6lhGbl+bD9//f///////// +///////////////////7//z+//f///v///z///////3///3///j9//L8//P///b5//P9//Ps +++7h+tfk8uHv9+H4//Tz//T5//T5//v1/+3x+PL3/fD9//j9//Lz/e76//n5//Tx9en9/vj3 ++fLs++7x/vL5//b1//P3//T+//3///X6//z5//n///74//b0//Du8uPHaHA+PD89Rjw/RkI+ +Qz09Rj07RDo+R0A7RTczRTo8OzoyPTI+PjUuPzRAQTkzOzY6QDcwQDo+RDo6TEtKV2ltjZxq +gJNjf5JYcIZTcXRli5F6kJ96kqOBlaaCpaqDnKeHqa6Clqh1lJ55jp11kaCAnqh6m6tjcox4 +m6N6kKJ6kZ90jZZ0jp9uiZhviJtkgo1riZ1ogphjgI9lgZFdf5FaZnxIb21lfYhkgI1mgpRn +iZZsjpdtkJpwj51vh5hoh5hlgpJlgJBnho1siJNsjZl4lqB4lJ13lKJzlKNhiJtxj552j6Ft +iJprh5dth5lphZtrjplykJ5yjaJzj59oi5Rxk5x2l6V3lKFlg5hph5VsjpVxiJlxkppuiplp +iZlqhpVvh5VsiZZohpRsiZFshZpti5pzh5pxjZt1kZl7maZ/paaQrbacsrxuf5ZrkZR+oahz +nKF6mKh2mKR2k6ltkaJ0i59niZpzjaFsjaF0kp5rg6FndJNIW2VafH1nf49mi5JzjaNrjZpv +jJt0lqFxk6B3kqJriZVrhJh0lY6/39XY8uTc9uPd9eO4zNiky8Ou2c/D4da40NaZwLy159Db ++eTs/+n2/Orj2sDNwJbUyZ3dyafby6Xq1a/u27Xp2K3iyqXo2Kny3rb04rju4sPo3rTw4Lnx +5rjz3r/g3rW2nZvD7Ln4+efz/eX1/eLz+uD5/+Hy++Xp89/u/+r+//D7//D8/+309++2r8SB +i6OKr5HK5NXK49bW9dzl/OS8v8CRpZ2anomomomsmIaxkom3mH67oIK5n36xl32plXCzkHe9 +oHTIq4jYsYrTrYPLmHjDpnzMrIjMrH/OsXnOsILOqoDRrn7RqYjTtofSspDSrYvEqIvDoXy3 +p3S1kXOljXeogmiael2Tb1ZwY01gTUhOVExXbF52nXmw2b+8ucJjkZ5bgpFFhIlTeIlJgIJP +ipVWk5lYk5tbjZNhlptWkZNakp5akpJSk51LjZRYjp1SjJlYiJdOjJpajZNOhZhKhJJAbX46 +Y2ZAbG9Pf4NRiI5WipFQiZBWi5dOi5BTjJRPkZdYjJpMjJBVi5NIi5BVhpRPkphVipVPi5dX +iZNNjZZTiZNOhpBPiI5NhIpCfoRAgIZIe4NDd39Edn5Ccn4/a3Y6ZW1CYW06ZWk+ZGk+bXJB +bnlBf39Qg4hLiYdQfohNioZRh41Mg4JTgItJgYROfIRLgohPgIdKdoRNfXxMe4ZLf4RKfH5M +f4FEfYBIdnhGdHxGc31Ie3xHVm41Pj48QT0yPzI6PTksPjU8PT0vPzdAPDkvQjZBQztKVUNp +Y057dVmRfl2RhF2diWiokmqljnCrkW+ri2WrjmetkGezlm+4lGu3lXO7m3XAonXEpXXIpHPK +pXvQqXvRrn7LpXTHqH3Oo3HJn3fJp3XDoHu3hm2pf2Skf2OpkGPm9bX9//b///////3///z/ +//////////3////////////8/vP+//j////////////////////////8//X6//T9//Pt/ejm ++tjm8uXz/+3q+eX1/+/4//X///738e33+P3///n4//b6/+z7/+bt8uX7/vP9//z///X+//z/ +//////////X8//3///f///j///Lz//H19+77//T49uXs+PD///TRZHdDQUJBTUtRVE9JSkZD +ST9DREI9QjlBPz09QTw+PD44Pzk8QDs7Pzc/Pj42PDw7Pz09QTg7RT1CUllmeZNxip1ufJZk +eZBidI5YYX1PYGNqhpF0k6F3j6B2kKSHprGMp7CHnat9kKZ8j59+kqaFpauLo61ibYx1lJp/ +kqJ1i6F3kKB0ipp1jZl3iZpkf49vhpZ0h5hogJZrgJJjgJFjcYhKYWple4lpgZBnhI9thJZm +ipdziJ5zj5pwiJxwjZdxiJhmg4tqf45piI1vi5dtkJl0jaBzlKJ1kKNqh5RwkaB4jqJwhppp +i5lxjJ1nhZl2kKF1iJxzjqBvjJ1thpx5lZl7k6Ryk55thp1pjJR1iZxwi5tzjpx3iJl1h5ln +iY92hJhriZZyhZVqiZZvh5dripdwiZxyiJNvjqJ4jZ19maKFpa+QsrKNl7FlfI13kZV3lKB8 +l6V3lKp3kaJ7k6V6j6RwjJ9wip9uiaJwjZp0i6VuiptjcpJKXGFngYZng4ttipZ2jqB0k5p1 +j6Jykp11j6Fqg5RjdYOOuKDZ9ePh+eXj+eni9Oq9zNOmzMqs1NLE5N293tmvv8+Tx7a96tXf ++uPp/OXw8Ofbu63OxKHg0qjr2bb47sL468ry4L3o0rLd06no263y7MXt4Lvq1qTlzKDn46f4 +58Tr2LHex6bfz6/j6L7v/eb1/N/4/Ovx+uL3/eby8Njx/+j//+z///f///P9/vHl3NmjnKG4 +4NDG49HH5Nm7xLGpqIe9nIbGpIHKpX7Tq4nWqIDSsoXXsYrOsJPOqIPIpITCnXTKnXnSp4LW +uJLju43iwqHct43ctpLfun7btZDat4LUr4XSsoPctYrZtYPdupHUun/avIbWsIjUsYTMsn/O +pITBmWa4jnOfhF2gfGWZd1eAYlRhUz1bTk5JWEtXalyAxJatyb+Jn6ZYiZFOfIlTg4dPjI5W +i5JSkZFcjJdXkphgjJVYkpdhk51WkJRckZlUi5BhiZNWjJNWiptPiY9Xh5JNh5NSfZBGan49 +YGBFcHNFgoRYj5JVipZZi5lTipJUjJZMj5RUipRck5pWjJhZiJJTjpNZjZlVjZhdjpJSjJFf +jZtTjpZSiZJSipJajJhSfotQeotPe4FKdX5Jd39FbnZBa3dBanZFanA/ZG89Y2pAZW1CaXRF +cnZJfH5OgIhLfIlUgopNgIlSgopNfYhRe4hIfoZYgIdNholbe4ZJd3lXf4dOgYlVeodNeIBI +dHtJeH5PeH5Ld35Re4BES2A2QTg8Ojw7PTk+Ozg/PT89QDc6PDc6QDg9QTg7QTNOU0VmY0l2 +blmJdlaQfl+Wg2KijGyriGmniGeni2SujGKzkme0kWi9j2u8m2/FoHXBn2/PpnfLsXjWrIHT +tH7VsobJqH3Nq3/GpXbJnXHJonK/mG29kXCtgmSufmKuhmHf6rD9//X///////////////3/ +//7///////////////////////////3///n////8//T9//X///r////1//bz/+ft/+zp/9rr +/+br9efc6NT5++ns/ev0/ff///f2//Ty/+v6/vn5/+3+//3///X9//v9//f9//v///b5/+39 +//3////7//P5//H0/+/8//T+//z18+3+//v/////////9PDJbG5CQUQ8TD9PSEg/RT9DRkU+ +Rzs7RTo6PTg+QTk3PDg+PT09OT81Ojo7QT09Pjc1PDo6Ozs0Qj8+TVVliYp+jaRqe5JkfZBj +e4xlcolGVWxdcXhqiJV+jqF2kaONoa2CoKeOo7OBlqV8lqd5kqGDn6iDmq1idIt7lJ1/l6N8 +jqF8kZ55jKF4jJ1wh5V0gZZnhpduiJxlhJVqgZFego1keIxJWWBne4lgfY1rgZJpg5Jui5Rt +i516jZlyjZx5jppshJtohpJjfo9mhY1zjp1wipt5jp9zlKF0jKFriZp1kqd0kaR0i59ohZpx +iJxphpxxkJlyj6F1kJtwjKJriJR2laN+laN6lKV0iaFqh5txiZVyjJlyip1zjKFzjJxviZtw +ippviJVyg5lvhptvhJhyh5Ruh5dviplziJdxjJ11kJ6En6eHqq6Ws7JyfJ9rfY1zk5h5l6V+ +nLF8mKt3kqZ5k6N5kZ1zj515j6l3k6F4kadwh5hnfo1XaYVVaGVkgYhmgJFxjKB6jp90jp50 +jp91jqFufpNVbW+KvqDG69fa8N/a9OXj9OfB2uGox8mt0dLD39nK5Nu+z9qSsbeezL7V+Nzl +9+vr/+bq3tzKvaDg0bPw5rz899H28Mrx2r7cyaLbvJPjx6Ho2Kjm1Kfky6brz6rrz6Xx2rHr +0a3p1K/x4bz33sDr4rfu/Nb7/+f2++Hw/OLw89T1/+n///T///X///P+//Ly9ujMzr7I5tfF +29O4wq6xn4TDq3/Sr43XsZLivJDivpXgrZHdq4LfuYrVuZHZuIvXrYjQq4bUq4TWt4rewpLr +yJfiyZnbvJHewIrcwZPXsorct4rYq4bfuIvZsYPitYvWu4rhu47duI7cso3UsYTZt4PMqXvM +pXe8mHqpf2Cae2STfGScdmOIYlNiWE5bTkVPU0tjZFZ5tIu40suBlqdghJlKhIdYfIxYj4pY +j5lYjYldkZdgj5dWh5ZZipVYjZhemppajZpZkJdckJNVjZlZkppYiZ5WjJRTh5hVfoo8ZXpC +ZmlId3lWhoxTipdbj5VTjJlTiZVTjZpdkphWj5tdjphUjpNckZhRjJpVjJRai5ZUipBejZVV +kZhbiZRZj5ZWhJFRgpBSf41GfIVPd4lGdIVHb4BFcXtHbHtBZXQ+YHA/X2xCYWg+Z2pEbnNL +fYFRiI5MipBMfYVLg4ZRf4hLf4ZOfo1Fdn5Rf4VNgIBRfIxMe3tTfIdTf4RTgYZNfIVKdH1I +dn9Gen5NfYVOcn0/RlM7Ozs7Qjo5Pjk5QD05Pjw7Ozc4Pzk5QDk9QD5ARDtTTkZgXUlzbVR+ +eFeUfl6YgmGgi2ujjGini2emiWWni2eqiGWuimG1kWi+mna9oXTFn3XMqnvKqHrRr37Tq3/R +rn/UrHzUs4PMoYDBmnG+lW/AkXC/kW+7imuyhmq0hmPl67D///P///////f///////////7/ +//////////////37/+////////////3///3///n////+//T7//P4/PHz++rq+ebd9NXl893l +9Nz2/Or1//D9//7t/eHm+en99/H4/vr///L2/+r9/+37//3///z5//Hy/+n6/fr///3///Xr +9Oj+/vz9//P1//L0/+749+306+v18+r1+ef0+efp8+LLa3M/Qz4/QT0+RjxDQ0A8Pzs8Qjg2 +QDw+PDk9PT04NzE6Ozo2Pjc5PTg4Pzk2Pzs5PDs2PjxCQkY7UlZmg450ip9vgJVlfYtkgZRj +f41icY1DSVdfeoFtj5h7lZ98l6SDl6SKpayKoqp+kKJylKGCoqyDpKxkdJF0lZt8l6N7lJ93 +k6J/jqR3jZ92ipxvhpVphZRujJdufppmfZFhe41bdopRVmxSbnFlfZFkfItwh5dng5Jxiplt +jJxzkaB5j5t2i55vgZFpeo9mf4xwipt3j591ipx6j6J0iJ9xi5p3l6V4j6lzhaFtjZx1iZtl +ipZ5kqFtjZ57kaNxj6N1iqFylqR+lql1lKhyjZ9thZZriJNzkaBsiZ5zh553kJ54jKFxiZxz +g5ZuiZZxiZZuhJtwhJVviJlzhpJ1jJxwhpNzjZt4kp18mKyHqKOVrr9sdZlmg4t2kZaLqa+N +qbZ3nbF4mKd6lKRykKFzlaV1kaF8lKtwh6FqgpVmgpRjZ4pQZWZle4NogpB0jJ11kJ54k6d8 +kqaIiaCTkKaot8CuwsHI39HO6dvU7+HU59/E1dG0y9C839TM7+PK4uKkusySt7uk1sDW8+Pw ++e7r9OjJvavd2Kzy6MD778X36Mbmya/WupTo2Kvy3Ln01b3mw57u2bf13rPy3LHuzKrhx5vp +2Kzv3rHz4rzu3rXo0afu+8z7/ujw9ODc4b71/+n///P//+7//+/5/+rj8OHG4NW708qzpZK4 +n4XOqonasonjv5ntwqHvyKHswpjqv5Pps4vis4Pdt43dwJ3er4/Rs4jkvZjdt4/iuorgu4ri +vY/euo7uw5LmxZTowJXduozjt5LatIbesojgu47dwpHgwYnhuofevpLguo/dsYfftpTTq4LN +oHyyjWq4jmmtiWOtiW2afmONbFxlX0NcUklDREJUWExhk2is0sCqrLdsg51Vf4tWgItViJRY +h5Jej5ZakZdYjptVkZdXk5lYkI9Yjphel5lcjppfkZlVjpVikplTkZNRiphNgpVNeY0+aHJD +bG5Df3hUhYtXkI5Vi5hRi5FWi5RRjZFZjZhZippRiY9ZjZNVjZhWiZZTiJFUjpZaipVViZRW +jJNVipFUiI5MgpJRfIpMfopPfYhDdoBLeIQ9c4BObn86aHVDZ3E4ZW5CZGw7ZG5Ba21KdXpL +gH1ShIpNgo1OgYpQiIpRgpBIfIpOfYVKgYdQg41NfYVOcXtIfnpPfIFQgIRPfohMeYdLeoFM +fINLeX5MbX46PUU3Pz89OzYzPjo8PTY7QTk6Pjk5QDo+PTw0PjVAQzhQUUBgX01uaE6AcleJ +dleSgF2YgmOhhWKhhGaifV+lfmChgGWniWKwjWi5mHbCmHLHpnTRrn/XroHVtojXtoTVs4fL +q37UqIPLonK+jm2xgWW2i2i6kGvCkG6xima7imHi8K3///////////////////////////// +//////////////////////n///n3/u34/+/w/Obz/+r9//X///j4/vDu9+zm9dTz/On3+/fh +8Nz6/O/m8+H9/vz///z////7//Xp/eXk/OP9+fbr9+ry/fX///79+/f8//z7//P9//z///// +//v7/fT5//P9/vf9//f9//f///3////////19ujMbXhEREA5Pj47QEMzPjo/PT80Pzs8PUA5 +Pz07PUA2OTw4PzozODk6PDs4PjwrPj06PDw3Pz42QkJCXWhzjqB1i51sgZVjfpdde5Bfd4lZ +d4tdYn4+V19ogY1zlJt5iaR2kZ6Go62KqbKBlKp6lqGFnKx9n6hpd5Rxl6R7lqd8kKF5jaJ2 +kZ90j6B2h51uh5dnf5Bsipdsip1jgJJjgJJhe5RVY31OYmtXd4Nje4tlh5VrhpJnhZFviZhr +i5p0jZtxiJx2jJtshJJpgYtxiZlxiZp1j6Nyjp16kKBxjZt3kqR3lKVxi6Bqipxsi51oiplw +i55xjqNtjpxxh6hnhZZwkaB6l6N3mKZ3lKJuhZ9ui5dviaByhJ9vi5p3k513laZ5kKNyjZp3 +iZ5uipZwhZpwiJpuf5lthZdyhpdxg5dogZR0i5p5kqF5mKOMrbaJlbZneY5riZJ7n6KCnLB8 +mK58l6h4mKhwjaNwkaZxk59xkqZ3n6t2hqdkgpJmf5hTZHheaINfe3tziJl0kp2XrbK/1NTX +5ePZ7OPd8OTg9ujg+OXX8OPP697H7OPW9eDe8eja7OLQ6uPU7+S4zdWbwcOWtsW55NHf+eng +8Om3trfKzKDq4bv45ML05cbmwK/Otobu37ny58H66snyzqz15bz678b56MHs0LXTqorcwZLX +vZri06Pq4Lnr27jq2K/u+8/09eTg4Mn2/+f7/+n2/+ns/Obr9efR6NW9zMCwoH7EoYHJo4DZ +uZrmxp/vzq710aX217j40K3wwZ/iu4nkuYrcq4fbwpTkxqHUr4HmyKXlv5reuZPaq4Leu4nu +z6fxzaLzzKXowJPnvJPgsYbct4zXvY7jwJXdvojlvordypbjwY/fuojju43kuo7cr4TMlnO5 +kWXCqXu8lm6pfGWhd1ucemWJYlRjVEpWTEQ9Sj5JSklSe1mUy6e81Mebn8FilZRWh5VQiJRa +kJlZkJpUhphSi5BTj5lakJhYl5tXkJVXlJ1aj5lYkppWjJdWj5ZSjJZRi5hNh5pJdoY7X21B +aW5De3xTiYxSjpRgjZlRjZdejpdQjplZi5NKipFVjpdOjptVjJZMiZJQiZhNhJJOhZJNh5JK +iZFShZBNiYxTiJBKgIdJe41KfohFdoA/cXxHcn89ank8Y3I6aHI9ZW07Y2w7YGpAbHNBdXlK +gIpSho1KfYdciIhSgpBMfYhJfoZMgohMfYJLeYVGen9KeX5JfoRTfoNIfoNJeolEcn9OdYRJ +dH1FYm04PUY5Ojo4QD05Ojk2Pjk1PDg2QDw5Pz1AQD40Ozs8QDtFT0JlX0tsYU55bFWKeFyN +fmGZgmiWfmKgg2akhmOmgmSTgGKcgmOpi2e3lnK5m3TGqXvNsX/RtIXWtYbZq4HTrIDLqX7L +pHbMqHq/mHTFl3DCi2y8km65jm+yhWm0jWXl4rD///b////////////9//z///v///7///r9 +//r///z///r///////////////////////////zt+ejv9eH4//Lv/+/p/934//L1++3s+Oj6 +//rz/e7p++Ps/+bt9eLw+u3+/vL7//L9//r///79/fPz//P9//Hy++r1/+34//T///z///n/ +//X8//v///Xx/ff9/+39//Px9+bp9ODs8uXYcX07Qj48REE4RD0/QDw7PzY+QTw5QTlAPzg4 +RDk9QT84QDg5PzY7Pj04QTY2QTk2QDo3Qzs6REM/XWpykZdwip1uf5ZlhZVof5FieoxifIte +doNMS15Pc3Rwi5l4l5t7j517m6KOqbCDmqiAlqeDoqeBnqptdpJ0kZt5j555jqF0i6F7jp93 +jJtzjphvhZhof5p0i5lwiZ9ogJRlgZhhg5Jmc4lEWmJbb3xcf4tsi5dqhZF0hpdqjpp7jqNw +kJx3jJx2kpp3jqGAlKCWoqeAjp92jp1ui51xi5hyj6NzkqJ1jZ5xi6JxiZpxhZxriZpwi5p1 +kp10kJ10lJ1pg5tuj5p8l6txj6B9kaJpjJt4kKByjpx6jKFxjp1+kKJ+nqmElqd6mKJ1jJ13 +ip90kZx0jaFuiZdthppxhpx4iptwiJ50h5R2iZ92k5qFmaaQsK58hq1he4dqi5OEpq6GoLR+ +maN7ma92j6B6lqp3k6R4lah7mqd1kKFzh5lhc4dpfn+lqrZ9e5WFlZ25w8jW7OLk9unp+OTr +/ejk+uri+ero+ezq/urr9+fa7ObL5d/I6N3f9+jm/Onm9OnM4N6nx86q0sy/4ti74NXB69qv +s8WttY7n4bT27sj46MXhxaDGq33j16f25rn68c773cPy37D568L758X02bflybfd2sbQ2sjT +uajSxZXn2K7v1rPr1q7n9NLf6tHe89nv++f0/+n6/+rh8N3Fz865rY7PspXTtpHeupnkyJrq +0aLx16fx4bj86LP73rD3xp7ntY7lr4TZtIHbq4DevpbhrY7auIviu5rbsYjUpHrew4/xzaLy +0aTswZ/wuZTivJPjuYrgv4TpxJPlwpPnvZTlxY7rx5zrxZfsxZnpxZTpwJjowpHaroLMoW/L +n3u/j261f12lg1umgWCadVaCXkZpUkJWS0JBOzdETERQX1htlHOh0a7A0smOp7dmiJZUkY5b +ipRQjZNbk51UlZhakJlRjphajJ1WjZdZkJVbj5hZi5pakZVUkJlZjZ1XjZlUho9Md4g7YmtD +am5He3pWhYpNipNTi5ZPjJRXjJZRjY9Yj5hUkJVZjJlKh45VipRWiIxVhJdUiJFRiJRXi5BU +ioxPhJFNhY1NgIZPgolOgY5HfIdIcoJEb3tBcHs+aG1CZW07YGg+Z2k/aXE/bHNGdHZGgIVX +iYtRgIdUiIhPhIxZiI9Jf4pRfoVQf4pSg4pPfIlHeXxHenxKgIdRfYlFeYJLdX1IcntLb3g/ +V2Y4P0A4Qzg1PjY9QDw4QzU8Qj46PzY7PjlAQTY+QD05QDRKUENoYkZwak9/cFSIeVibfmKZ +hWCghGOjgmangmGggl2aeF2chF+rjWWzlWy7om/CqnrLp3zMsoDUrYbOq4jWsoPMo37Qp3nE +nnPJnHHInXK+kGW5jWirhWmuhWWshGLf4KP+//b///////////3///////z///////////// +//////z///z////////////4//P///X///j///j8//j8//Dg8+Hj+dDt/+vt++Xn+d7u/Oz0 +/fz///v1/fT3/fb///r7//P7/fL6+/bz/vT1/e7r+ej6//f///z///j9/vj7//D4/+r9//f/ +//z///j59erq8enz+e/0/vn///v////de39FSUg2RjxBR0o9RTdHQ0BAQzo8PkFBPzs7Qj8/ +Qj49QjU1Qjw8Pjo6P0A8Oj07Pz44Pzg4SEVAUmRpj5p9j6R6jKFyiaJqgptuf5dke5lqe5Zc +aH9FTVdceoR2jplxj6GAkqGMqrWVoa97mKp+n6yDnq5yf5pykJ1/mad8jKJ3ipx+jJ5zj516 +i5txiZp3g5ZqhJZyipxsgp1mgI9ff5Jhe41NVW5PZGxdd4pmhY1og5VshZFvjZ16kp9/kp2E +lKF/lqCDlaGFoKbKzcmfpbeBlqV6j6F+mKl5kqWCla12kKR2i593i6Nyj6Fzip5zhptyjp51 +jptxjp9rgZd3lJt8m6l5mad1lah6kaN1kJ12jp90jqRyjJx5kaaGpK+InLCAm6mAlKh4j6V5 +ip92jaFyhZ5xiZx5iZ5wg5p0hpVthpZyjJh2jqB8kKGBn62Sqbd6fqVmeIR0m5+JrLOGnLJ6 +k6p2j6B2lKZ4naR5j6l7m6V8naluipZle32RqZDQv9y6ztLY6d/c7+Xs++3s//Hu+e/s++3x +/u/x/u31/+7o/Ovg++ff9OTc8ubW6+TT8ube++ro/e7j9OzP1+K419Oz1NCv0tSxztGowMmK +lIng37T17Mr16sjesKSQgF3Kypbx4a796sL74sD11aj54Ln95rP34r7q5Mff59TW29TX1cbV +wcXYvqnpz6ny1rXny7Hj6NL2//D6/+n+//Dw++fW29S+rojXtY7awZLevZXfypnrx6fozqTs +1aju2a/izpbgwZbbtInNrHXSp4LUq4jcr4bZqn/UvY/XtJTTto7SqYTVqIjcuI3nw5jqu4/r +wpbpv4/xw6Xrx5ntwJLtwZDy0avtzKDz1ajzxaDpzZj1zZzyyKHxzaDvypnruqDjvI/gs4zX +roLCl3exfGKnfGilelucbV+KalJtTU1YR0FFREVNS0VLUkpdXVNjkmun16+9ws2Om6Ngh5Vh +lJdciZtVi5RYj5hWi5FfkJ1Si5dbj5hLjZRhlZpVkZ1bjJpakZdYlJtai5dShpJFeIhBY3g7 +aGdHeXpMh4lWjJNWhJpLhY5Rho9ajJJUjJRViJdSiZ5Yip5UjpZWiZRWiZhZh5ZRio9RiJNO +iY5ShZNMgotKgJBKgolUfotKeYBLeYRHcHtJaH5BbnZAZHU+W2k+aGxEZ3A8aW9FdXxLf4dT +iI5OfIpWg4hSgo1NgIZTfIhOfoNTf4NLg4FQdYNHd3pSf4dLeYNLbnxEbnVHanRDbXBEWGs2 +QEE7PDw6Pzo4Pzw6OT47Ojk7Ozs/PT09Ozk+Pjw8QT5CRzpfXUhzZ1B/cVWQdWSQgF+igWmf +g2SoiGWjiGClfGWMclqXel+aimOyl3C0l3TCo3fHo3rIp3nOpIPMrXnTqoDPrYPGoIDQpnjS +pX7Oo3nMlnPDl3K3hm6vhWmqhmDk26D+//n///////////////////////////3///r8///8 +/+7////7//P///z///////////7///v9//z3/+z+///1//ji+9rl8uTo797x+eb8//j9//73 +/vH+//z///X59+74++/4/+3///b9//X9//T6/+74/vT+//v///37//Xz/fP+//7///v2/PD9 +//j///f19/T9//v///P8/ezs8+DWe4A+QTw/QUNFSUI+R0M/SD02Qz9BOUEvQDpCQz05QD1C +Qz42QTlARj42PztEQDo4QDs6Pz88RURBYGNykqR/l6R7kqJvjaFrgJlrhZpthpxqiJpogpdJ +UmZJYGdnhI11jpt9k6KAoKiWpraFm6l8lqWBnqd3hZ52lqB8k6Z5kJ91ipx0jJ53j5t6j55u +i5lziZpif4prhpVnhpdngpVdgI5kgZFaZntLXmZYcn9lg4xlg41pg5B+lp+QpaeUqa6rt7u9 +w8W2ssCsvrjO4dC5vMSnrrilqbaRoLOLoKuGm6mAnaV/kKt+l6F5k6d0j6R3jZ11lZ99kqRw +kp90iJ9si5V9lqR2mKKAmqR1l6R3jpt1jpxyjpl1jZx9laGQs7SQq7SOqrODn7F+mKl+l6B9 +kaF3h6Ryipt3jZ9xiZx2h6Bmh5Zvhpt0jZl1jaB3lZ2Foa2EnLBpepJjeoJ9mJ9/oqaEoqt7 +lah1k6F+nKZ7m6t7mqlvj6FleId/i5y/0cPi8erX7+Pl+ufb++jp/uzz/+z0//H2/+/z//Tn +/+nq++vo/ebk9+zW8+Pb9OXn+ens++3m9+rm++na8+Xd8OO91Nikxcimy8ip086nyc1/goTI +16bu47v25sblv66femytp37k16v97MD96sL2yKf257P87cv26crq4MLb6tba4tTJ08nIy769 +rqrQxpfdx6LX2bbn+eH5//D5/+z5/u3q6tu+s6rNspDbwY/ZuZXQtY3fyJ/nzbHlyqTkyZ3e +uprOqILSuIXixJbpxpbpyZ3nw5rpxZvluZHep3jRmHbHnXjZsITYtYXisYzjtYHkq5TfsITm +w5Psx5jvyJntzZ7uzaf52Knu1qr41ans0Kj30KTy0qby0aDzzqbtyp7szafrvI3fsInTp3vK +l23AjmW+jnSriWCkel+OZlF/ZlBlUEdYS0NDRkJES0hFT1NYXVVebV6Lv6K53MeiqLZfjZxa +k5VUipBfj5RYlJ1akZhYjplZjJtblJdckJtVkp1hlqBdkpxckppXlppajphTgpFLcIc7ZG1B +a3VFfYBSj41VkJNbiphSipRYkpVTjJJSjJZQjZFVjZdXkJRSjJtUi5VTjZVTh5JRj5VYi5VR +i49TiJJOf4tKhZBQfpBJgIlPdYNBdIBEa3s8anI/Y3A3ZWU9ZG08amo/bHI8bXZNen1SholP +gI5QgIhQh4VRfolOfIdFeYFJf4JRfoFLeINGcndMfYFId4JDbHFCbHFIaXFDZ2tHVWM3PDw6 +PTswPTZAPj0tQTY7Pz0zQjZCPzo4QTk9QDo9PDo8RzteX0htalCDdluNfVuahGKgiGeih2qi +h2msi2mmgmWhgmOYfmWhjGe0lnSxlnK9oXTEq3jIp33EpXTLo3jLpXjFpXrAm3XCq33PrH7K +o3zFnXS8lG20iWqximivgmfh2Jb+//L//+v///X///r///////7///////7///////3///j/ +//////z///////v///7///38//b1/+z+///u+Ozf8djq/9v0/+zw/Onp/OX6//f1/+/+//bz +++30/fL5//b///7x/+n1//vt/+j+/vv///////Hs//H9//v9//r///73/+75//X4//L9//z/ +///7/ff6//j9//7///////Lff4REREA6RjxFRkI+RD09RDs1QTs5Pz06RjhCQkI8PzU+Qj46 +PDo7Qj49Rzk9QEA+SkM6Q0E5RT49TlZciIl5lKN8kqF6iZ93iJlpg5plfpVmgJJnhZdlc4Q/ +SFVYc3ZsjJJ2i5p1laGTrbN9nal+nad9nah7hqF3naWEl6Rxi5p8ipt0kZ17kJdzi5tyh5hw +h5dmfo5sgpdvh5RnhZRlf5Rogo5jfIpLWmZMbHZkfIlrfYxwiYuOpaChtaq/08bg7dfo8+Lb +5dXJ2M3e7Nfn8eHn6+Db5dzD0Mi6xrzMxsjO0M3f3NzOydSuqcOJm7OInKuBoZ58lKd7lZ9z +i6B0kpuBnqd5l6OAmKZ4mKh+kqFzj5x6mJ97j6R6laOJrqqYs7uWrriJq7OKqrSCnbF8mKh+ +laVxkKB1jZx0jJ95j51si5l9ipx7j5p2jKFyjZp9k6KFpKuKlrFmfoRvhYt4pJiKqa6An7B/ +laaAnaqDm7GDoLGEnrGOrre3z8jO69bh++fe8uXq/Ofw/+33//L5/+76//Hu/+7k/+/I8d/T +8N/a+eLi+efm9ujd8OXe9Ojm+uvw/+/p9uvS7eHa9OLa6+TG3uC1ztekzMihyclzc4iju4Pp +3bH16cbu17u+16vBsbXL06D58sz87sfzyqrr4qX58L7357jt5MTk79Te6dbT28XMz8XFvLnE +tK3W1MHg7ND3/+r+/+z7/uzt+ubf39HDrI7VrYbbuI7cv5TPpYXXyKHo067m0KfpyKnauJbZ +p4TRtoP12Kn55sH+5cD23ar93K7116f2zJ/vvo7lwI7ku5PpuI/nuJHtxo3nso/lrI/ux5T0 +z6f1zpr13K7327X43q303LL937f627H50bHuyZ/y0qL10KTwzqLvyaTtxp7syZfou5Hapn3E +lW3GlnO2iGiegF6OcVSFa090W0dnTUJPSz5LSkNES0BJWU9aZllWbFmAt4i32sO6t8htlqJo +lZ5YjZpgkJlWkJlilJlVk5lai5RakpdYjppXl5tfipRekZtYkphfj55UkpdVgo8+c3tDaW5E +d3NOg4JTkYxSkJVZkZRVkpFTj5RYh5lWjpRXjZdSi5NYiZRUkJVViZNQkZdajo9UkZJVjJZQ +iJBRhYxHhohOgopHgYxNeYhEdXxFb30/bnY+anI4ZGlCY207ZmRCZGk6aWtFdHlEfoFQg4BN +fYZRgYVMf4JOeYBLeIBGeYBQf4BIdYFFdnlGeHpGcXhCZnA9b3BBamxAaGVDT104QT5AOjov +PTI5Pjo2PTc8Pjk4QDY/Pjg3RDc7QTk4Qjg9QzhRVkVwak9/clWKd1KRfVydhWChi2utkmqz +mXKwjW+chmOXh2eei2aqlWivnXO9m3O9qHDFqH7Oq33Rqn/MqX/Pr33SqHvSrIPJrXzSpHrN +oHS/mHC3jXGuiWmziGTm2Z3///////////////////////////////////f9//f9//b///// +//3///z6//T///b6/+3z//H5//H6//L7//Pt/+/l+drq8t7q8t7q+d7r9OPo9+v7/vL6//z9 +//fk9eX4+O79//37//D7//j//+vu+Oz9//39//X6//n///75//f9//T///v///////n///77 +//H0//X9/+vz/+319+TZgIg/RT47Rjw5RjlBRUFBQjlCSD87Qz89OzlBQT9APzs/Rj5AQzw9 +Pz0/QT02S05LTFU7SEc9QkE6S1BPeX5/oKd8mKd9k6N0hpxsg5Jsh5dmhZpvfZZif4tbWXU/ +WFhrfohyiJV5j6CQr7GJmq1+lKR5oat+k6d7mqiBlaN4jJxzjJx6kqB0i510jJx1h5hviZdp +e41mgpJviZZmfJJnf45nfpNjf4tRX3NNY29kfoVcbnt4jountqy8xb3L4NHh69nc5dbJ08jZ +49To+OHw+Obz+Ono897T4Nbd4tnp9uLv9ufx9+bn9uDZ4tnCz8LRydDFxM2zsMaJprGKmaiE +namFoql5m6Z+l6V+mqh6kKZ9kKR9l6F4lKR7laORsa6jwMKeuMOUsL2QrrSEpq+Ena18mqh9 +lKZ5kad/k51+kaN+k5uQm6mZo6yYo7OZoa+OoK+XqKmruL7GvMy6qL6YnrKTqLKsvsLJyM7G +ws25xM22wMO1wcLEy83P1MzX6t/Z8ubd8OXq/OHy/+7r++zT/OXF5t612dG919bH393J4dbK +59nM6NzN7t7b9+Hg9+vl/+nq/Orq/Ozi8+Xa9ebd8OfL7d/P7t/F4dy3ztR5e599lHrd2a/0 +68Hs1b+4p4+/rbq8v5Lp47D56cPz1Lrjx43y4LT44LXx57rw9+Dt5Nbk2cvO28PX5dLX7NXc +5NLe9eD6//L+/+34/u7x/efUua3Ns4jYuZXWtpTYuZHDh27JuI3n0Znsyqjxx5vsyZjosY3l +ypr+7r//+9n+9s788cD/6Lb+4bz62aj82ar62rj2z6j0y5/3yaLx16n5xZz0zJn60Kbz0KP2 +1az13bH84LD63rX137X63rD54K3847f92qr316n316zyzaX31KTt0prxy5vixJXjroXMpnzL +mHK7jGuyfmacfVmkYll1ZEl6X1BkTENcT0c+SDdLUEREVExVV1JYXld3rIex4MnDzdF8j6Jf +kp1Zjp9bk5ZWh5pVkJpWipZXjZZYjJRekp5XkJhVi5hYkpVll55bkZZfhpVMgIhEbHlDaGpJ +eoFQgoBOipNalJZXk55TiZRWipVPjJJSipNVjJVWj5tWipZViZdTh5ZSjJJUi5RSh5JSiJBK +f41QgYZWfohGf4lSe4hEeYhPdYVDcoBGaXk3ZHNBZWw6YWo+Z2VBaG0+anBEcXtGfoJNfoxK +fH5Qf4lMgYVMfodMeYJKd3xNfYlNdn9IcntOdH5HbnJBamtEZWo8X2E8U1o3Pz49Pj85PjY1 +Pj83QTQ3Qjw5Ozg7QzQ+PTkyQDg9Qjo8PzlTUkJlZkd6cFSFdlmPeV6Vf12pkGiwk2q2lGut +lW6agmafhmefimekkGurlmm4m3LEp3rLq3jRsoPUsIDOsYjXsYXSrYTFp3zKqHzIqHXSqHnG +nW/ClW21jGm/kGjl2pj9//D///////////////////7///////////////////////v///v/ +//////r////////////////7//X9//Dq++nr/Nr7//z0/e3l8t71//Tt8+bk9+jt8uvt+On6 +//f///7///X9//v7//v6//z////4//H2//L0/Ovt/uz2//L///3///n///v+//v2/+/z8/H2 +++zy/e35/Ozy8+fjgY49RkFCQz01RUFERT02QjxBQ0A2PEBERDs9QDxARTxCRjs/RTs5QD03 +QzxLaGdGTU1DRlA6QkA7TFBIbHyBmqR1k6d7kaR1jaJzg5dpg5RrgpZrf5VkgJVfeIdDTldW +cXBnhI5vi5qGpqqSorV7kaB7mqh8mKt9m6d4k6NwipVviJdui5ZwiJlpiZRziZxti5lugJJj +go9riZhqh5lkg5hggpNgfZFOX3FPY29Wb3NZbG+YsqWqwLbQ38bk897t9OPb4dnM4Mnp++T1 +/+r5/Ovw9ufd59za7Nj3/un4/+n7/+70/urr9eTT4Njg5trp+ef4++3q8+PU19ynuL6itLmb +sLiXrbSSp7mOp62WqrGls7a4v8mxucWVo7iIqqufvcOZuMSTub6VrL+PrLiJo7d/oamLo6+g +trfFzsvB0M+/xMLU3dLp9Nfo9uXp8+bU5NXm8eH2/en4/+vt8+Ta49bX5tDs9+T0/ezr9uHV +4dXQ48vp+ODq+ufx/ufp8ejP2dDU4tDf8NTn8urM5tnK4N7B3tbF39vU693d8+jn9urt/+vt +/ezp+urj9Oba7+bV8t7l/+3r++nj9uTe+unR6OSo2Mm249jF593R5uWfmLlpcWnFyZrw5cPz +3MDCtqbLz8+4p5bTx5P55MH01rvmu5Tq16j03bztza3w/d3//+7//O3+/u/18+bi4drU5Nfp +++T7//L4/+/r9uPv8eXHr5fYvpXdvJTVqovMn4DBgG66j3bizpf24b7027Tu2rLvwqPmzZb6 +67///9b/9s3+8b7/8sj/8sL/6cL+7b796rz34LP33q712qr40Kj40qfw06f50Kbyy6H52aj5 +3rD+57b24Lf637X53bH42qv437T44bT95LL74rL31qzz2a/00qTryZ7vx6jiuYrct4rLroHQ +rH++mnC3i2+igVuSZlttVEVsVktfTjhRTEVASUBKUk1GVEtJUUxgf2bN5s/E5NHR0NBmmppf +kJNWkJdXjpVVkJdajJRWkJlVj5ZRkpRakplTkJZYj5dTkJJckZhTkJVOiJdHd4tCan07bnNP +foFRiIxSi5ZZj5VYiZlVjJlSi5VYkZRVk5RWjJhVipJWiJJUiZZSjpRaiJRNiI9VjJVPipJQ +gpFIgopLfY1DeIVMe4ZDeoFFcXw9bXY6bHQ8ZWs8Y2k4YGpAZGo9aG5CbXJHgYBMgohHd4VJ +e4JNfYNOeoFIeX9ReoFHfoJNd3xBbm5PdHo9Zm5HYmk+aWlGYGs6T1c9PUE0PDw8PDYzPjU1 +PTc6PDk3Pjc6PTs4Pjc2PjM1QTg0QjZGSj5cWkt0aU6Bc1WQd1yWfl6jkWewmWy0lnWli22a +fmeYhWCkj2mmkWWqknCxkm+3n3XEpXXLroDOq37NtoPSroDQsXvOpX3HpHTGoXDGo3HGlm3A +lGy3jW65imzc1ZP9//H///////3+//b+//n///3///////////3////////////9//f7/+7+ +//n///z5/+36//H7/+38//D///jq+ubl+tTk8Nrn9N3p8eDx/O73/vbw//L1//L+//35//fx +++fw9+bp/OX0/e/7//Dz/+3y+ev9//v////////9//v+//z5//L5/e36//D+//33//b6//H6 +//P///r+//v0mqo8R0Q6RT01QDc6RDo6RDZART01QjQ7QD00RTVBPz8zRTM/QDs3RDY+SEVf +aWw9R1FPXGM8QUU+S1FWfIGAmaN2kqV1jqN3jaByg5tqh5FqgJRpg5Nlgo9lfotjcYJKSk9Z +eXlwi5ZukZqWrbF3kaJ8kqJ1kKF9ladsg5pzg5Jigo5xgpNlhZRniJNshZVnhI1yhpFbeYVo +ipRujZpkg5Rgg5FlhJNccYVPYm1SYmhthX+is6i6yrvX6dTl7t7f6tjS38/b69vo9N72/On1 +/Ofm7+Xg69je8drx/OX5/+31/ujr+ube5tnf9Nv3/ev1/+v9//D2/OjZ5dTP3MPj7djo9d/s ++Ofj7N/P2tHa6NL2++X5/+34/erv+eTT4NW8xsKour6ovL2txL6pxrytvLqmuLXV5M7s+uL4 +/+vj8OHo9t72/+f3/+Xv++Xf5tnd89rw+t/5/+n1/+nh8eDU3crh79Xz/eTz/unq9eDm79zw ++uD6/+3//+v///H8//Ht9+b4/+n9/+r///T9/+/4++zn7t7c7d3j9+Pd8ubN7uDN5+LA4dfG +5tnX993p/erb7uTR7t3i/OPi7ufN8N/R5+KwxdODnqqayL662NDM3daTg6agsIro4bv35MHb +u7C116bNvby7soDjyqfv17XsvqLjv4z02rXy3a31+9z6/+z+//H7/+3+/+76/+34/+36/+vi +8t7g+eTn/OHa1MfHqIHSrojZtpPZtJfPlHfGh2u/gWXYy4/z2a/w2Kj66MP64bDuuo346bb+ +8dH74aj86rL/78P/8b//6b3+26v526n54LH54Kz1yJ/tvZbyy5ryxJnyyZHy1qb73Kv54rL+ +4bX84bj24Kz87bX93sD55rb94Lbz36z847762LH53rDz36z01Kvx1ZzlwZHguoXSo33ImHXF +m3a+j3SmgFqJaFN8Z0d3YElqVUZiUUZLTT5BSkNccmJSa13E5srN4drV8tvm8dyxq7RWmZ5h +kJpalJ1ZkpZVkptckJZZi5lSjpZZkptVkpZalZ9WlpRZjZZVko5Tj5dSh5BEdI06amtEbXFD +fYJSiYxYlJZfkplWkZVTj5FSi5NbkJZZkZ1WipNVi45VjpRWj5ZWj5FUjZFUipNMg45PhY1R +iY9Vio9MgYpMf4pIfIVNdIA9cXZCaHk3Z2s+YWw8Y2dAX2c5ZWg/aXBBcHZLeX5LeoFJeIBU +gYFKfYJMgIBGe4FFc3xNeX5GbHZHcnM+Z2dBaWo/Z2dDX2dATVQ4PDo3PjU4OzgxPjY+Ozsv +PjU8PzcxRTA8PjgyQzY9PDY6PThARDlaW0t2Z1GEdVaUg1ufhGOehGSlkGytmXCgjGmchmae +jWOlkGmqkmyoj26yl3G4nXfDpHDMqXvJsHjPpX/EpXHQr3jLpHnPpnLHpHXOoXfBjmi0imW1 +i2S8km7r2Zn///////////n///////////////////n////+//f9//L5/+v////////9//79 +//j///n6//Tv+efz/+v19fPq/N7u/+H2/vHt/+bu+OTn/ev3//X9//b7/evr99/7/vfz+ez9 +/vX9/+7///3//+v0/fX9//7///f8//T///z///Py/+3+//v///X///z7//z17uj7/fn///// +//f5//HjoaZEQ0RCRz03RDpBQz43PT5ARkM6RTlEQD86RTlDRDs8Qzo+QTk7QzpBV1xbWWJC +TFdmjY9FSlFESU5KcXiCm6tzj598kp96lJ91iJlqh41of5NmgI9ogpdmgpNofoxPV2pJXV5k +gZF4iZiFpKt/k6Rxi515jpt3kJ9xi5hpgZNsf5FmgpRmg5ZohJNqh5VmgJBvgpVddYdnfo9r +iZZmgpRtiZRlfJNjdYdTXWVTXWaEmYi1xbXT4tDj8Nzy+OHq8+Tg69n0/OT4/+z//+z9/+/y +/OPn9uDz+uX5/+z6/+37/+zt9ebj6dzn9OP8/+3+/+7///D4/ezm7t/g8Nf3/Ov1/er6/O3o +6uHY5tbg6tn3/+X+//Hz+uni6dzV3dXW49XR1tfF1MbJ2MzM28zQ0sfa5s/0/uf5/+zz+evT +49fl797y/Oj7/+jq+ebn7t/n9N7s9+D0/+n7/+/1++no7eH4/OP+/uv///L4/un2/+r+/+3/ +//X///f///f7/+74/er9/+///+3///v///H8//Du9d/3/uf1/eTv9+nj8Nrb6NzQ5dTM4NrQ +59TV7eDO5trQ39bV69vf8uPX9ObR7uDT7OTQ6OLQ6d7e9uTX8eXAxdGgm4rc2Knw6MHoyr6u +sZjO2M3AtaHfyqft4bf74cbwz7r22b3//dL///T//+7///T7//P6//H1/+/0/+j4/fHQ09HP +8t2+1szKrJHYspHiuZPitprfuZfamH/JiG66fmfSs3/54Ln87bz/8sr+5sL1y7D66bn+68v5 +zp775bH/8Mb/+M7+5LT706T706j31qTy06v0zaHuvKDrypnwyKH106L61KH95Kv5677+67j5 +5rn947r/4bn+6Lj+6Lr947T64rj76Ln346v84bH62ar33LDv1KDsxZvqyJjhvH7No33Gnmuz +gGqZc1iRa1R2YUd6ZVBuXkJtXE1eTkFFTENSb1iw1cLd8t3Y59bk/eHy9OPFtsdjk5JakZdd +kphVipZTjpNZlppmippWlJReiplTkJtbi5VVlpVakZ5akp1YjplVjpRYf5E9cH5LbHZCdnpW +holWjpJbkZ9fkJdZi5NZjJBMhZJUj5ZVjJRVjJlYi5FSjZRYjZRViZJXi49TiIlYjYxPiJBV +h49Pg4hVfoVDd39JdoFAdnlFbHo9bHM9Z3A7Ymg9XXBAY2k9aXFBbHNKeXZJe4NMfIVNd39L +foRPf4NPeYBKcn5NeHpLbnhJa3A+YGxCZWc/YmREYWU7TlY8QD43QDk9PTwvPTdCQDs5PzhB +QTo5PDlARDY4QTc2QTo7PzlBRDlXV0ZuaU+FdlqUe12diGahi2mokGiummyjk26lkGymjW2j +j2qikGWplnKwoXC+p3rCpHfPsYHPqXnOpn3PqXfQsYDNrXvNpnjKnHHHoXW/j26xgmaziWGt +i2Xj0o37/+3///n///////////////////////////////////////////3///f////7//T3 +/+79//n///X///z9//bu/+nq/d3o8d/m8tvh6NTy/+zt9eD0//T+//3////9//v9//37/+n9 +//n///79//f5//Hy/+zq8eT6/vL6//P1/e////b9//b9//n///D4//T9++/4//b7//H1//L+ +//PlsbtHSEE5QjM/QDw6QTU/Qj42QjVCPkM1QTY6O0A6QzlBQUE7RzY7RT5ce3dNTVFEXGZ9 +naRRTVxBRk1Ha3N+nqZ9k6V7kp14k6V2i51jfpNpg5NjfY5og5Zkg49rgJFbdX9KTFhcdX5y +jJdsi55/kKFsiZx2jKF0l6R3jZ9nhJVhf45kf5JlfpJthZdogpBqgpNjf45qfI5he41pg5Zo +iJZpg5Nlf5BgeohNWmlkfXejt6vP28vt+uf6/+r3/+vm8d7j9N74/+j9//D//+/w/Obj7Njl ++OD//+7///H///D7/+z2/Ovs/ej9//D///D///H8/e3r9OHk89r8/+z8/+/9/+34/+vv9uf1 +/uX1/uj//+/+//T///Tx++zn9ODk7N3d5tnb6Nzb7Nnc6dzX5NTg7dvt/+H6//Dx+efu9ej3 ++Oz+/+/4/+n3/+/z/ur5/+v///H///L///H5/+/6/+////D///f///L2/ufx/OX+/+v///f/ +//T///H2/+b4/e3+/+////H///T///f5/+z3/un+/+39//P///D//+/5/+v3+Ory9+vs797l +8N/m9ePv/OXp+O/k9ubf8OPa8OHc7+TS593U8eHO6tzQ6d3N6NfJw83KxaXn2bvs3L3avryr +ua/S89n0/eP///H///H///f///H//+////f///f///r//+7///D//+/5/+73/ejq8+Xb6d/L +wLrYv6zpxKrtwaTryKbwxaLry6jaoZbAg23OuIP368P+88X/8tP+7ND54b779ML/57380KL7 +3qv/8sP/8cz+36v73az44L3yyaDw0qHtzJnrupLoxJL817H83Kz83az84rP96bb95Lf95r31 +5rH94rP15rD658X/57f948L65rj95rn23bL34bL816jx0KHqxZ7gtYHVrofRp3q/kHC6f2ad +dV2ZbFKLcVqKZk16YFCAYk9lVkVNTkFyw5no89XL6NXt/uHt/eHu/OTTzs5ekptZlJlZi5Na +lJxZk5xci5pVjphcjZlXkJBZjZVXlJdajpJRkpRajZpXkJZai5dMi5FOeYlDcnxAbXQ+eHlP +g4RWipNZjpNQipBajZFOiZNVio9ViZFYi5BQjYxSipRTkZNUj5RUi4tSh5JOh4xUhpFMiI1S +hI1LfoZLfIlFfYRHdIdBdXtCcn5CanI+aHI4X2c/YWY7ZWc7aXFDcHJEfH5OgoNJfIRKeHdQ +d3xHdYBHeIBDcnZIcXpBbG5HZ3M5YF1HaGlAX2dASFc1Pzo/PjoyQTM/Qjo4Ojc5PjgxPzQ9 +Qzg8Qzg8QTg4Pzk9PDE+PjdSVD5taUyLeVqWfl6chGKfhWSjkm6eiWmjjGqfjmqij2+olGis +kW2nlmy4k3a2n27EpXzOrHbMrH/DpHbPsHTJqX/MpnnGn3LInXPIlmvGkmvAi2yvhGmujGfh +0Yz9//f///f///j///////////////////////////////j////////////9//L9//n+//H3 +//f5/+74/+3w++zu/+3p99fw/ur9//nw++z///34++nq9ubt/ezy/vD9//T0//b1+ef5/fDx +9+bz/+39//3///////v9//37//X+//z//+/7/fPt+Obs++z5/+/0//T7/ezy/vL///f0//bg +ub9EREM7Rzs/Sj07Rj47QTA4PTw1PTU1QDU6QTszQTg/Qjo4RUBET1NoeHlBS09OgIZ8oKde +WmA/RkhFZmmBm6l2kaJ4kJ92jKF0jKJqhZFrhpJje41mhY9ifItgepBlfYtHUmRNamZhe4hh +go53laFwh5x1jJh3kaF0hpxohZVgf5Bgf49wgpVkh5NxhZVkgItuhZVkfoxgfJFkiI1qiJVf +gY5kfo5ZaHtOYV6YrJe5zb/Y59Tq++D2/+fz+efc5NPh69X0/OP4/+z0/Onr7+Di7try+uXy +/+3+/+v1/+r4/+ji8Nnw+eH9/+7///T///L8/ejq8uPo/N/7/+7//+v9//H0/ern6dvo/eD2 +/un///H///Dy+uby+uH3/+P4/Obr9OTo8t7q8eDn9uLo6uHl8Nn1/uv7/+r6/+r4/+b///P/ +//j9/+v9/u7z/+j+/+r///D///X8//D5/+v7/+n+/+///+////H6/uv4/un+/+z+/+7///b/ +/+z//+39/+v///L7/+z///H///L///f///L//+////P///f///L//+z///H8/+/6/+X//+// +//L///L///b9//D09+T0/OX//+/6/e7w+uTp/ebm9+bp++vq9ere8+jf8d/j7+Dk8trU2N62 +x7Pk+9j9/+n///P///b//+7+/+/9/+v///X///D///j///P///f///H///D//+n+/uf29+Hu ++d/4+9vr99zv+efz7OD438rpu7HKlHbQwor28ML898n/+8v+7MvzyqD74rH526X10qbz2az/ +7MD/7sD91aL32Kf25cHtyZjqxZzowpDpwpbqx4364LX93a/857P63bH+47D/57j958H76rr9 +57757bv85sD95bf95bn86Lf857j857X737H32J7sy6DZtIjYrIPNmnTKn3e9mWqsgmmVd1ub +aliJc06MbVaEZVKBbE6CXU1qmm/f69bQ7NDl+ODm/+Lu9eLh99vd09BkkpZVjpRZjJVUk5da +lJlYkpRcjZ5WlZJdj5dUi49djphVjY9aiZRQj49OiplSjpNTjZNSh49FeoJBaHY9a25Fe3tQ +iolXjJNVjY5UjpNLgopOiYxajZBUjo5Xj5ZPjZZejZBTjJRXjJVMi5BXjpNSiJJViY1Iho1P +h4JLhY1PfYhFeYlDd31Bcnw+anc5aG87ZWc9YWU6ZWZAYmU+aGpDdXdEfoJPfoVJeHlMe3xK +eHxFcndBcXhDcXdEZ2xDY2FAX15DY1s+XWg9R0o0QjgzPTQ0QTM4QTU1QDU0QTc0QDE8QTc2 +RDI7QTk1QDA4QDU0QjVDTDhxbUuJf1mZiGGhjGehjWani2edi2mekmyfkXKhkmmkj2amkmm1 +nW+8o3W8pm3GrXvGqnzBpnu/pnLFo2/AoGvBnXPCmXHKn3HFlmXHmGu5kWmthmWrhmDezYH/ +//////////////////////3////9//T6//X///7///j///j///n///z///////////////// +//P8//z7/+3r/+jg+9Lt+uTm+d3s/uT+//Lx/+r+//f7//f79+3q++Dw8uj1/vD5//P5//L8 +//X1/+/+//b4//b///7z//H3/+3x/+/9//z///////ft/eb57e39/fz///////v19ujYvbxL +REg8SDxHQkI3Qjk9QT43Qzw/Qzo5QDhAPTg9PTs3QDs+Qj5Te3pfZGtDT1t/laSGnq5kY3Q+ +RUU/WV99n6J5lpt5jp14jaF6jJtjiJJmgZZeg45qhZNmfo1shpVigY5raYBAT09bdn1jfo5u +kZh7ip1sipt1kaN3jaBtg5lkfpRkhJVnhZFui5lvhZdqhJRrgpJlfpFmdYlge4Rtgopjgoxq +eYxWYXF+iou2yrnl6dTh7Njs9N309+b2++rz9ej5/er8/+/9/+7//+34/en3/uf7/fH//+r8 +/+7///H2+evv8OL1+uj8/+z///b8/+ry++fm8N31/+P6/+n///b///X///H9/ur8/+z5/uv/ +/+/9//Dz/+v3/+T7/+/5/ur0/unz/Orx/evs9eTo99/6/ev//+///+34/ez0/+z///H///P/ +/+/9//H6/+v8/+7///D///T9/+7v++f5/N/9/+/+/+/+//T9/ur8/+39/+3//+///+////f/ +//X///j///f//+////b///P///n///P///v///T///j///f///n///L///b//+z///r///f/ +//T///L///P7/eX9/+////f///T///T9/+z0/+ru/+vy//Ls/+/y/+/u/O7s+vDq9uvh7eXf +8+Px/+r6/+n4//H5//D0/u/z//H4/+3y/+nz/u3w/+zz/+71/+79//D9/+z///P///D///L/ +/+r//+r7/+v6/un4/uT6+urxz9Tiw7Hw5rv//Mb/+M//887+38Lxv5TyxJf02JX35K3/9cL/ +57f81aDyyp/qwqbcuI7gsojewZDqxpnt0Jb84a/84rL93q/84rX/6Lb96Lv+7Lv26b3+6Lz9 +7sT/7L/957786LT87Lf63a/75L3556rz1KDqvY7lxo/nxZzVp4HRr3vLmm+1imqcfF6ee1yT +gWCZbmSJbliNa110iGfa9Nja5NPq/eT1/uTt/eTz/ebk997Ju8Vfi5lhkJRakpldkZdblJha +jZlak5pYhpBahI5UkJlajJJRk5ZZipROi4xcippWjZdakZpVj5VchY1Ec4JFaW8/cnVRfYRR +jpJZj5Ngj5lWjpNVjZNUkJlWjJhRjpJak5RWlJZcjpdSjJFcjphSiZVQiI1RipBUhY1Mh4pK +f4VLholQgINKfYZEc3o/bXtBbnI+ZnM/Zms5X2pBZGY8YmhGbnBEeXNMeoFJeH1McX1HdHdI +dnlEcnVMcoBBbXVAXmk6WFpGXFw8Vlg+RU49Pjk4PjYyRDk6Qzk2QTY4Pzg1QDc2Qj08Rjg+ +Pjs5PTo5Pzs6RDhCTD1ibEqFf1qXjWmpi22nkWunjmihlW2jjWmci2epkHCllG2yl3KtmnG4 +oXO/pnTBpHfGqHTCqHbDrXzGnW/OnnPFnHLHmnPOmHXKnG3Dk2a6i2Spf2OnhF3SyX36/+r/ +//////////////////////3///////3+//X9/+z////////+//z+//b////9//f///f7//T8 +//X6//H2//bm8tby+eb19enr7uL3/+ny/PHt+ujt/Ovp/ej+//z///H1/ejr/uP6/vH+//7/ ++/Pp+eP7//b5//f+//j9//L3/vj///39//fy//P///3///n7//D5//X9//f9//nuzdJGREU/ +Sjg/RjtISD07Qzk9Pjs7QD8/Qjw1QTdBQD81STw+REJfgYFOT1s+YGaDn69xlJ5mb4A6SUFE +Ulx0oJ5+lqV3iptzi59yiZhqhphpgJVggJFohpZlgJVogpRmgJVkeYtHS1dGZGNieYxrhpF5 +k6duiZ16k6JyjJxxhJhnhZNogJRlhpVviZpoh5dpg5Voh5RqfpNjf4tkfYxviJVphI9fb39e +bXSfsqfR4tTq9eL2+uz7/+37//Hz/e39/Ov///P///X///L//+/0/+f7/+7///H///P8//P/ +//X7//P+//D9//H///H///P7/+32/On0+ej3/e39/+7///T///T//+7//+////P///X///b/ +//X//+///+v//+33/+73/+vz/ujv/ufz+ez1/+T+//H//+////f6/uv0/en+//D///X//+37 +//H3/Oj+/+////D//+////D//+z///D+/+7+//D///T//+z///P///D///r///b///f///f/ +//X///b///L///f///f///f///X///f///b///v///P///b///P///b//+z///X///r///r/ +//X///D9/+////H///f///b///j9//P2/OX6/+3///X9/+z4//L3/+/3//L6//f1/+/y/er0 +/+36//H1//Ds//Dn/OLw/+3n/urn/O3r/+ru/+3v/+jx/evv/+v0/+/3/+/2/+v///P//+/+ +//T+//H//+n//+j+/+z5/+n8/ur/8t//9cb/8sz/7sf+5cL20qf5yaX20aD22qr+5bP+47f7 +05v0xJ/kpYDjrYfeuYnpxJbuz6Hzz6PzzaT+6bT/6bj/7b7+68L96sH96rz+7MT88cf95rn1 +7cL+6rz85bf+5rf65rP+57713Kf0zqXjv4rhu5DUwIrZr4rCn3PAk26vj3Ozjm6igmSRe2Wb +blyJe1qNe2XN5cXX5dvo+eT3/ub3/+Xy/+vz9+fj8tqFn6ZdjZNkjp5bmZ1ai5lVjZJajZdZ +kZhdkppQi5NZkptak5RYkpZUj5RWiZJbk5xYkJdRi5VSjJJTjJNLfIZDc4BAcHFAd31Lh5BR +jo9XkZNVkJhQhYtTi4tcj5dOhpBXjJhVjpJfj5tQjpdai5tNipZThpBNhpBQhItOg45MhIpV +h5FPgYpOeYZEd39HcH4/bHlAaXA9aW46Zm03YGQ7Y2c8a21HdHRNfIRIeH5FdXxHenhDdH5J +c3xGdnxGdHpAYm1AWls+WFpAV1k+Sk83QDkyPzc5PDoyPjQ4PDkzQDY6PjY2QDc9Qzo5PDc6 +QDg3OzQ6Pzk9QjpgYkZ+dlmWiGShiGifjWWkkWqfi2qci2iej2unkG6jjW6wmW+sk2+unW29 +n3jEpW/Gp3e8nnPFpHTDnG3KpnTAmGzOn3LPoHPMona/nG++kW2uiGipflrazoX+/+n///// +///////////+//b+//n////////////////9//T///7///r9//X4/+n7//Dv/er8//H4/+/7 +//D0/+31/+b7//z1/+jx/ub8//D1//z///n1/vb///75/ef9/fT1/+z5/fP9//n+//39//f9 +//7//+/y/+77//v////6//fy++719/H6/u/y/evw79/4/vD2/PHu/u709OffxcJMRkg8Rz5J +RkVBSzxDRkE4Qzo8QEAyPzdBQEI6RDs9Pj9CamtvfolASk9YgYx/nq1+lKl2gJI0Qkc9TFRe +gIR1kaB0i51riZlriJhnhJVpgZdjgJhsgZdkgJBrf5Vjg41kg5FianNATFhVdnxjfo5riZF0 +i51zkZxxiKFohpdmfpFmf5Nng5Jng5dnhZdqgpdohJFogpVif4phfYpif4tnfohZZm+Yr6fb +49rl9eD5/ej9/+3///T3//D4+u35/+v///T///L///D2/Or1+Ob9/+////T///T8//L4/+/z +++n7/+////r///X///f///T5/+/4//D///L///L///T//ev1++33/+v///b///L///r//+77 +//L3/+j8//X5/+33/e/2/ur2+Ovx+eb2/+n6//T///T9//Lz/e/4/u36/+z8//D7/+n6/+7/ +//T//+7///X///L///P///X///L///b///b///f///L///b///j///7///X///v///P///r/ +//X///f///f///f///T///f///r///n///r///j///X///D///v///T///v///f///r///X/ +//f///D///r///v///f///f///L//+7//+v///X///P9//L1/+fv/+zx/+z6//Pz//Dp/+vl +/+zj++fh+ubc8+Hy//Hz/+3x/+zw/+/y//Lv/+/1//L2/+72/+3y/+/y/+zw/+3w/unt/e/o +/+3z//Ps/+31/+74/+z6/+3//un//ur/8s7+5b75z6z50Kf5z6P20az32q7816z326f3zZ/t +xJ7nrYrpwJnnwqDqzZrz2qjz1qfyyZn33qz+4rn36sL87MX+77/+68P56cL+7cr85r376sX6 +6MX+57385rv+4rn55bn52rbxy5rpxZnnvZnav5LTpYDMn3G6mXWviXGkfWKYc16FalaMdlyF +cVu40rrd89ne9eL3/Oj6/uv4/+n1/evJ0cOTrKxcm59ilqRalJddk6JZi51bk6Jbi5RakJVZ +jJpWjZZYjJNVk5ZYi5RaipJUj5dTi5RXjpBWjpdTiJhZj5pMhpBQeI1BdH5Nc3xIe4FcjJJS +ipRWjZNUiZJaipJMhJdVhZFQi5dYj5NTiJlTjZddiZdQjJZaj5tOiZVRhpROiJJUg5FSiJBR +gY1Pg45LgYtLd4lDe4hBbH8/aXM7ZnM/Ymc8X3A/aWpAaXZIen9KfYlRfIVGcnxNdoBFdH5L +dIBKc3dHZno6XmE/Wl47WVZARFMyPDs1OzszPTY7PTg4OTo9Pzo4OTs/QTg4Qj47Pjg2PDo5 +OzxAPz08QTpTWEF5b1eOhV6dgWaZhGGei2yYgWyahmeajGShjGuljGevnHSplG6xnnK/pHrL +r3/HqHzGn3jDlnXBl27FoHDKn3bIpnbIm3fHlnS8jGm1iG2rf12wg2ffzYv+//r///////// +//////////////////////////////////////////////////////r///////36//Xy++rn +/Obg99Xs9+P0+/Dl8t3v/+vx/Oj1//n7//L6//f9//b///r///v///3///H0/+/2//Ty/+75 +//v//+/5/+/0/PP///z///3///////////37/ff///r///3////7//Lu1M5HQEU/STo9Q0BE +RTk8QDs+QTo0QjtAQjszODo/QjwtPjtphYtjanVLTVNwmaKMoq51kZ91j59JUGI8SUtPcHl5 +l6B1h5xyiZtyhZFmg5dof49mgJRth5pmgpNqgpZmgZJmfpBqe45FSVNRam9je4llhZF6kKN5 +kaVzj51viZxngJNmgpNqgJFniJZphZNliJpxgZhmhJRogY9le4tmgItWcXdmgnrL3sj2+ej2 +++X9/+z///H///T7/+r6/+38/+z9/+38//D//+/9/+79/+7///D///T///H///D2/e37/en9 +/+////f///b///X6/ez0/+b8/+////n///T///b8//L9/u3///L///T6//H///X5/+z0/un6 +/+3///X9//L8/+z5/+/6/+r5/+n8/+/9/+7///T7//D///L///H///X///H///H///D///P/ +//b///f///P///T9//L///b///T///r///v9//D9//j///b///n///f///T///X///T///n/ +//H///v///b///n///f///z///j///z///f///f///L///r///X///z///L///v///n///r/ +//f///n///j///n///j///P///j///f///v///T///X+/+78/+n9/+r5//D7//L4/+/4//Pu +/+/s++rr/ub3//H1/+v8/+/2//Dq+uvN8+PV+uft/+/7/+/3/+/7//D6//D3/+31/+/2/+/4 +//P3/+/5//D4//H0/uz5/+j9//H//u7/58j/377+4Lb/37L/67r/5Lz+2Kv81KP1x5f30Kfv +tJvty6f2y6nvy6T64bz63av91qz62Kr/5bz96bH88ML/7sL+6sD56bz76bz66MD56b785L31 +5LX95bn547b53rPy2KDwzZ7iqojMpnvLn3XJlHDClXe1kXC6jm+gf2SdeWOQelyUfGqhtIzr +9t7b8Nvy/uj7/ef7/uv2/+nr6Nquw7iOmqBeko5klJNimJ1hlZxhlJpjlpBakZlikppakJFX +jpZSkZNakZVXjJdajZhSjo9VjZJQj5BajpxRj5Vej51Mio1RgZBCen9Oc35BdXpRgolPh4xb +jpRWiZVWjpZTiZNFjJFWio5VjJNTi5JXkY9Vi5NVi5VViYxTjJBPho1Si4xKhpVVhYxOf4lW +gI9Mf4ZSf4ZGeYBQdYBBbHJBZXQ8ZGQ/YWs/ZmlBZnJFb3ZGcHJLenxGcXpJcnhKeXpLc39J +dHlGbHdHYGk8WldAWlc+S0c6QDU1PzM/PDgxQjM9QjotQjg+PzswQjdBQjs1QzJCQjk6Pzk8 +Pjg8PTlESj1pakyGe1uXgGaUg2CdiGWeiWSZg2Wdj2aojmqolm+ulGyqk3O1oHC+n3PEpXTM +pnrJo3PFnXXDmW/PpnnPp3XSqHvQoHPDl3jClGyzh2OtgWOqgV/g0YP9/+////r///////// +//////////////////////////v////+//f4/+39//L6/+/+//f7//H+//72/ef1/uvn9ufs ++97+//vq9uDm8dv9/+70/fP8//H1//bt/Ojw++3u/fDu/+z6//b1//L7//f58+jv/OT+/vr7 +//H+//n///7////7//f1/e/x+/H7+uz4+vD5//fx9+Tr7uPm9uX14+ZGQElCPUI8RUFBQ0E9 +PTpCQz9CPz4zPz88QDw8Oz1DSldnf4pZV2RDUmOEpayBnqh2j6Jzkp1nZHI/RE9CVl16l59z +jJ90gJxqhJNug5Nmf5FqgZlrgZRqfpZlhpVug51ogZNmfYxeWHE/VFJld4Fkfo9uk550jqJv +h5xtg51mf5NogZZlf5Jpg49kgJBohpZlgJVpfJNigI5vepNRb3dXXmaEpJnj7trx/un6/uf6 +/+v9/+78//H//+3//+/8/+z5/+v9/+z///T///D+//L///D7/+/9//L//+3///L+/+7///T+ +/+7///P8/+39/+/9/+7///b///f///j///D6/+v+/+7///X///v///P///j///T///X//+// +//H///P///T///H7//H7/+z///D///P///b///T9/+////L///n///39//D//+7///L///j/ +//v///f///X//+////X///X///3///X//+z///T///j///n///n///n///P///j///f///X/ +//b///r///b///v///z///r///n///v///r///n///j///v///7///n///r///v///7///z/ +//////z///3///n///n///j///3///j///z///n///z///b///z///T///r+//L8/+z0//Lp +/PDt++jf+un4//H9//f6//D9//jz9+/R2d7B89vp/+/6//D7/+/3/+7///T7//D8//T8//D+ +//j7/vPv+Ojw//L8/u3+/+7///L///D/++v/8Mv/+NH/9tL/9c3/7Mj+3rf32rT/4sH92bb1 +4K731rHy0KLy4LX/4L792Lj4zKH25bP/57r97cD/9L797Lz7673+777447X85bv54bX54br2 +3rH32qr31qnx2KvrvZnhvpLguovSpYnIj3C6k2zDm3+ykHSrgGmae2Kac2aHhWXk9N3d7d3r +/OX9/+rz++j0/OD7/+jq2dW1vrWCnp5fjZ1jlp5impldlZpYi5tWjZpWiJhWjZRaj5VZj5Zb +k5pVjZhajZZXjJdcj49TiplYhpRUjJhaiZdTipdah41Pg5FEen5GcHpEcXtIeYJHgYRZiJBP +ipNZjZNSjZRUhZFRh49TiI1RhpNUg4pTiJJRh5NSipZYiZBLg49RhYxUiotMgpBLgZFRgotM +goxMe4VFeYZEcH1CcH1BY3U4YGo8X2g4YmU/XmU7aGxEdXdIfIFJcYRCbXRNdXtJfX1KbntC +bnZBandAYW4+VVw7PEw3Ojg3Ojc6Ojs3Pzg0Pjk4PjY+Ojs/Qjk9QjozPzQ6Pzo3PzY+PD05 +QTQ9QzlbY0eCd1mKeV+ReWGNgVyWgGeRgmSgiGSmjmenim6nkGitlG+/n3a6oXjBqnrMqXzF +oXrCom/GoXPKnnTIoHDJl2/HnHHBk2+4jmy4jGSsgWanfWPQyHz9//T///3///z///3///z/ +//7///////////////////////3////////////////////////5//X3//D+//zw/+zq/93z ++Ofz+ufw++j7//H2//T0/+vs++j5+/b5/PH7+vX//fn9/vv7//f///7////9///5//f8//H/ +//31/erq+d73/fj///////z///////n///7///X7//X2//Dk3dNJQkE/PkJCQ0I6OztERDo5 +PTtCQEFARz89Pj44SDpYeXxwfo1bVWVEdnOXr7h6kqZ4iKF3jJ12doxBRkw8TVRdh4t6kKBx +iJlvg5hshplpg5hugZpshpdngJVrg5Zrg5RsgZNng49mc4o7SFJZbnFff4trhpl5kKJ3iZxl +iZhxgZplg5Ntf5RmhpVqhpRtg5loh5ZpfI9ge41reoVNVV9JUE6LtJbm+9z1/e79/+78//D8 +//L8//L8/+78/+76/+v7/+v//+7///b///H///X//+z///L///P///P///b///P9//H///P/ +//P///H///H///T///P///X///b7/+/5/+7//+////P///n9//f///f///X9//T///L///X/ +//D///L///X7//P6//P///H///n///f///b+/+n+//T///v///j8/+39/+n///T///b///b/ +//X//+7///P///f///P///P///T9//L9//b///j///f///j///n///j///v///n///L///z/ +//v///v///3///r///z///r///v///j///X///n///b///n///v///7///z///n///z///r/ +//z///z///v///r///v///b///v///n///7///r///v///n///v///b///r///L///f///H8 +/PLu/OX9//P1//D6//j///b///n4/PbY6OPh++j7//D5//T8//P8//L8//L9//T6//T4//Hx +/+76/+////X///H///H//+7///T///L//u7//+D//eX/+s7/8sj/3Lj/7cD/78X+9NH55LL8 +4LTwzqT64Lf/58L/4Lv92Kv94rX+6Lr66bn/6L/+7Lv35sH+4rn32rP64bDy2aX337Dz2abv +267t3qfy0LDqx5XcwY3duYvSqX/No3/FmG65i3Cth2ilg2edfF+Sc2jM5cvr+Ofh9N/6/u/5 +/ejw+u33/un5/+vb3c6VsKhyl5pdkZphlJ1knZxsmJ1fmKBcjp9Vk55dkZtXl5hhlJpilJxZ +jJNej51ck5lei5tVj5VjmJ5bkpRaiqBZkJRYhpdTipdQf45Id4VCdX1JeoBPg4tSipFUjJJX +k5hUjJdTi5RShYxPjY9Vi49OhpVOhY1Oho1XjZNMhoxPgo1PipVSjpdYkI5NhI5Nh45TjJdS +gotMhIxIfIZJcnw+bXpBZ3Q6ZW1AYmk8X2ZBZWZFbW1Fc3NKdnpHcHlEbnRKdXs/cHtHcn1F +cXlFZHc6WWFARlM3PTk4PzszPjY8Pjg0PDY7OjszPjU/Pj83Pjc/PDg1QTU+QDg8Pzo9PTo6 +QjdUWz95b1WEdFWJfFuVgWGQgmOVh2aWfmSnj2qkjWymk3Csm226oXO9pXXEp3fDpHfOp3fC +o3G4hG2+oWnSqXvFn2/KmHjBmG63g2qrfluzhWevh2PNyH79//H///////////////////// +//////////78//j9//P///////////v9//j////8//Pv/ur5/+z+///2/+/q/+rk/9Lq9eDk +9Njs++L3/+zu9+b1/PH7//r///7///v///31/+/9//n9//L19evu/+35/+zu+/P+//7/9/n/ +//z///z9//P4//r///fw/e309PH+//r///7///z/+fHo5NZOQktBSEBCP0M2RTc+Rj88QzdC +QUM2QzZBQ0I6SU1qepJhf41KS1dThImas71+mKt4lqV0kaZzh5pKRlk8SU9Ha3R+laR2jKB0 +jZ5vgpZtg5NqipVyipppgpZsipZlg5Fwg5Zng5RxgJJUWG5MW2ZefohthJRylaNyjZ5yjZ1s +ip9qf5RpgZNph5huippuiZRpgpZofI9meIxaanRCR0xCSUJkk3ff9NX3/+7+/+77//H//+z/ +//P//+////L///b///b///X///b///r///b///f///T///j///P///b///T///j///X///v/ +//j///b///n///f///v///j///r///f///H///D///f9//T///H//+v//+7///b///b///v/ +//P///P8/+76/+7///P///f///b+//T+/+z///j///X//+/8/+r+//T///b///X///b///T/ +//b///n///j//+7///X///f///P///n///b///X///P///v///j///z///j///j///r///3/ +//j///7///z///z///j///v///f///b///b///f///v///n///z///j///3///z///r///3/ +//f///r///3///r///n///7///r///3///7///3///n///////n///z///n///r///T///j/ +//b+//f6/+79//f///b9//T+//nz+/L0//H///f///f///L7//X7//b7//f8//T4//X8/+78 +/+7+//j8//D+//P2/+7///H//+////X///H//t///Nj/8r7/7LX/9cv/9tD/+sj937v62qv1 +1LL73q336bj+5Ln72ar626782rL22Kv46Lj96sH24K/93Lb31K772bX40Kn117Ty06vx26Hw +1KHryKDox47dtZLOroHMsH7KqonKpIDFoYC+knqne2SZdGG61Lvq+ODb8+L4/uv2/+v6/+b1 +/+v//+n49+fCy7ynr7FumZ1bkZhfjJVfmJdilZ9gjJthj5hajZpbkZpkkp5YlJphkZhblpdg +kZhRjJVWjJZVi5dbj5hbk5NZkptakZlUh5dRipFRhIlLeohJd4NGd4hKfYlNg4pMho1Ui5ZX +j45ShZBShYlMhoxPipVPjI1SjZdRiJJYjJNUjpBXiZZRjJNWiphPiYxRio5QhZJQiZFPho1W +iI5PfYhLeohGc39BbXs6ZXA7YWw9Ymg8YWtBZGZCZ3JHc3JHd3xGb35McntJc4JIdX9Oc4FI +a4A9XWpBTls1Qjo9OT4zPDM9QTo3PDc7QTozQjY9Pjg6Pjc6Pjg4Pzo7PjY+QTo7QDQ9RDtN +UEBuZ0+GdlqFeleRf2KSgGGYhGGUiGOmk2qgkGiul3KwnXO7nHW5oXHGpXjBnnXEonfDpXbH +pHXCnHDPrHHMqXvQpHjOpXi/m3S1iGisf2OogWDHyXn+/+7///T///////7///v///////// +//////////////3///////v///////f6//n9//D///j///rw+/Dt+uXx/ezq/9z1/u/x/Ojm +8eH0/+z6//z///nt/evx/uz3//Dz/+79/+/w/+z9//v9//f8/fT6+fX+/vv///z///////z/ +//////z///v6//D0/fP+//35/+3u/+33/vX0//Dy7ORSRERBQj9EPztHQEA6PTk/QkA2QjhE +PkQ7SDhIWWZpfoxpfYVBRkxVdIOMqrR5jqF9jKN6j6F8laNpXXI/RE9EV2RdlI6CkqN1iZpu +iJZogJVshpVngo1thZZjhYxxfpBhhJFvgZRXcHlTaX5zhZZod4tkgZNrhZJ2i5trhJhphZdn +hY9mgpFlf5Rxip1oh5xugJdogY1nc4NHUVhIQ0U/RUJMalnR7cj4/+f9/+7//+3///b///H/ +//b+//H///f///X///j///X///T///b///f///X///P///f///f///T///f///b///X///X/ +//P///f///T///j///b///X///n///T///X///b///H///X///b///L///T///b///T///b/ +//H///X9//L///X//+3///f///X///D///r//+z9/+////D///X///X///X///T///j///r/ +//r///P///f///f///z///T///j///b///f///v///X///j///n///z///P///v///X///z/ +//b///z///v///z///r///////b///H///f///////////3///z///z///////f///b///n/ +//z///f///v///v///r///v///j///3///f///3///b///z///H///7///f///r///T///v/ +//j///f///T///T///f4//P6//T///j///n+//X9//L5//P2//T+//T///X+//f7//T///n/ +//P///X///L+//L6//L//+////f///L//uv/+dH/6bv/7Ln//cP//c3/+dH+57362K363bb5 +3rz+3bX/3q381qb31Kz33Kvz2az93Kz12bL62LX72bL637L626f62afy1KH43K3w0p3s0qLs +yaHlw5Lar4PPoXTGonzJrHvYq4PLqH/Bk3qlhmamp5Dq+uDX7dnk++j6/+r8/+f1/+j//+j5 +/uj18+DF2s+aqKVmk6BhkZxXiZdZl5BUi5NWlJVek51Uk5Vhl6FakZlgj5VYkp5ikJ9VlJNd +iphVkZZZkZVXkJRaipdXjpNbjJdckJdajJlPipZRgItHeYBFd31IeYNJgYFOhY9Vio9WjpdX +i5hUiJNahZVQi5NZio9TjJJai5ZSipNTh5NMho1ThZdPhIpTf41Kh4tTiJBRiJFSgJBJhoVP +f41HeoRMdoRFb4FDanhBZG86Xmo9Y2Y+ZmY9ZWtDbXFNd3dKbnlBbXNGdntEdX1FdnxFcXpF +Y3FAU1g/QkIzPjY8PjY1QDY6PTs0Pzg4PTg7QDg/Pzw6OzQ3Qjg4Ozg8QjM+Pzc6QTdFTDpr +a06CcleKfFuRgF6TfmWXhWCZi2qdiWmmiGmslGawknawlG+8mnG7oXTLoHvBo3PLpXnGqXLQ +p3vDknDLnXDRqHnHl3W1kmu2h2alhWCvgWLVyHr9/+z///3///////3///////////////// +//////////////T7//T///r///3///n///z///T9/vn+/+7///n2//fh+9bw+efp9uTt6uPv +/+by/+z6/vH8//ny/+Tz++/4/vT8//X8//T9//f+//j///7///////P///z+//z///37//v9 +//r///r3//b///7s8uP8/vz///////Xn9+Dq5ddIRkNGQj9BRztCQUI5STlBRT88QTlISEQ/ +R0Zhe4xrg5Nlb3xGSFFZfYeIqK93lKV1k6V5kqF1jp10cYRBTE9CTVhJaXJxj51zjZtviJhn +gZNvg49mgI1qgpZqhI9lf5FbdX9TanJme453ip5yiZljfY1kgY5ofY5qi5Jpf5Nng5Rqf5lv +g5Nqg5JoiJRshZdviJdle41VZm5FRExAQkFJR0VLZljQ5Mby/ub+//D+//H///H///T///b/ +//L///P///L///T///X///X///r///H///T///X///P///T///L///T///T///n///f///j/ +//L///z///n///n///X///r///f///r///b///D///j///f///T///f///v///j///X///T/ +//T//+////b///P///T///n///P///X///H///f//+////X///f///f///P///P///j///X/ +//j///f///r///j///P///z///z///r///j///b///r///n///r///P///n///r///b///j/ +//j///z///j///r///n///j///H///X///n///3///b///v///z///n///3///3///v///b/ +//7///r///z///r///n///X///n///X///z///n///n///X///r///T///3///j///r///X/ +//z///3///v///r///f///f///r///n+//b6/+7///b9//P///b///j8//X8//H+//j+//H+ +//D+//P///X///L///D9//H3/+b//+f/+9f/9M7/8MT/99H/+dT/9cr+7cfzyp/y2LH15Lf8 +5rn73af82rL02an31rPs0ar32a3x2aLu16/y3an65LDz1a/1z6312qjv0KntzZzq0qDmxJvn +xJPgupnXr5LMpIPTso/JqoXEnnytl4PTxrvm+d3c69vs/On+//D5/+n9//D9/+3//+z0/uPc +7t/D18qkqLhrkp1kl51ikZtZl5hbjpdRlpZhkZpYj5Rdk5pbi5VajplckZtZkppgjJxRjZda +lJZWi5lYiJFUkZtekZRclZpdjphTjJZejJNJh4xSd4ZKc4FHeX9CfIRQj4lUjZNZkZVajJhZ +kppdi5dRj5VZiZFNio1XiZRSi5NWho5RhZBQh5FUho5Wh45LhZBVh5JPio1Tgo1Lgo1SfYdM +f4hQeohBcIBGbHU/Z3c/Xm06YGQ/YGQ/Z2VEaXFDbHRJcHlFbndKdHNMdX1Od3xEcXZGZ3A/ +W2U9Q0s1Ozw8QjoyQzo6Pzs4QDw3RDs6QTY6QDg4QTc5Ozs5QTY5Pjw4QDk8PztBTzlrZ02D +eFOMemCIflySf2WRfWKcgmSdi2ejjWirk2uukXC1j2q9mHK8n3HEm3fGo2zKqHXMsnXUrIDJ +o3rMnGzKqXfEoXHAl3CuhGOuhV6sfGHKxnP7/er///////j///////////////////////// +///9/+7///T///////z///////////r///z7//f+//z3/vbg8tvk/dfu++Xv+ubw/eX7//b4 +9eTt/e36/+75//L///3///f6/+79//nq89/+/vXt/un0//P+//v59/H1/Ov7//b2//X1/fX0 +/+v+/vX0++n9//f///r8//b///r///Pt59xRRkI9RTs+Qz87SjlFSUM6SDhFRUI5Rz1IXWRr +jZdthZhfX2Y/TFFflJWMoqt3jJ52i6FsjZd1kaF3gpJAS1FETFZNYm5khY59jJxrhZJug5Bm +fpBqe45lfIhpfoxbZHNVWG1liY6GlqByhZBvf5JefY1ke5BjgIplf45ng41pf5BigoxrgpJq +gpJshZZsgpRrhpRpdohTVmJCSENCRUdBR0JHXVS53rfy/ef7/+39//H///P///P///D///f/ +//P///f///H///b///X///H///P///P///T///L///T///L///P///b///b///T///X///r/ +//n///n///X///b///j///T///X///j9/+7///b///X///j//+////n///H///j///T///j/ +//b///X///T///X///X///f///f///L///f//+z///X///j///P///j///X///X///j///b/ +//X///r///X///L///f///j///b///j///f///f///3///n///X///f///z///f///f///b/ +//3///j///v///b///X///H///f///f///j///v///b///v///z///v///r///v///b///j/ +//j///////z///b///T///j///z///n///r///f///T//+7///v///r///n///X///r///T/ +//X///T///j///L///f+//f+//b///T8//L///P+//P+//L///X///L///b//+z///P//+n/ +//H///P///f+/+3+//X6/+b+/uf//dn/9dL/78L/+9D/9c3/9Mz/6sT5x6Hl16jy3rT02rDz +2q7x2KH027Du2KzwzqntxqDry5zm0KTxz63tyqfv0LDt16j11qvt06PxzKbnxpzmyJ/kyJ7j +xZ/fxKDhupfTsY3QtJLQ0LPg9tnt++Lf8Nfk++n+/+71/+n6/+n9/+vy/+j9/+r1+uLX5ta8 +38ezu8SHmqpYm5VhkZ9al5lejZxSjZZgk51YlpRYkJ9dk5JSl5dak5dfkZlblZpWlJhWkpZV +jZRZjJVbkZRbjZpaj5FYk5haj5hUipdYjJVMgI1Qe4VEe4JLeX1FhYVYjJBNjJBYjJZMipZZ +io9RhopUg4tSiI1Xj49OjpNVjZNXipJSjY1ThZFOiYtRiYxRh4tWh4tNhItNgotNg41Pg4lI +dYdHcXpBb3hDaXE+Y2w+YmU7X2M7YGRAZ21Ea3BDdXlQc3hEcG9JdXhFcXlGaXY/aGhHXmc5 +RE88PDo1PTI4Qzo3PTU8PDozPzY8PTs3Pj47PTc7Qjg4QDY7Qjg4PTc8PzY/Sj9raUp5cVmK +dWCLfV6SiGGUhGKdhWKUgmWei2OrjmmwmG63l3O5kGnFoXbGqHDHn3bHq3PMrXHOqnrPonbJ +pHHKmnK/lmvDl221h2qthmaqgGXHxHb6/+n///L///z///r///////////3///n///n///D/ +//D///////////33/+78//H5//P9//f3//fy+u3q++Lz/+/k/tf6//Lr+uXj9tz8/+/2//Tt ++ezw/vH8//f8//j4/fH1/u37//v///f9//z///z///////H8//r///37/fP+/vz////7//b/ +//7////3+/Tz/+v8//D1++zq+ubx7NpPS0k9Q0M/SUBDST9EQzw/QUFERUJEQkRNaHBifI54 +jZtOVGBHXGlumqSCnqV6j6J+kaJvi6J7lqZ6jp5PUF48SVREUGFhgY57jJxwgZhngZJtf5Jl +fYldaXZRYGpQZnNggomFn6l6lqBzg5VkgZFpgJBqfZBkgpBphJdlfJNlgJNpf5BogZFrhJFs +h5puhJZohZRmfpBLV2M9R0Q7SUJARURBUUuqyKrs++P9/+/8/+3///L///L///P///P///b/ +//X///X///X///T///L///X8//P///T///X///X///j///X///b///f///T///r///T///v/ +//j///n///j///n///f///b///f///b///b///j///f///r///j///b///r///3///P///T/ +//T///P///j///X///b///j///b///n//+3///T///P///n///T///j///f///z///j///7/ +//r///z///X///7///n///n///n///v///j///X///f///T///f///3///r///7///j///n/ +//n///z///f///f///T///v///z///////f///n///j///z///n///7///b///7///3///z/ +//7///3///b///r///j///z///z///j///j///X///P///n///n///f///T///f///n///7/ +//j///n///X//+////H///b///f///X///X///n///j///L///7///n///v///f///f///T/ +//f///f//+///+3//+/9/vD9/Nv/9Nf/89P/99j/99X/9NP/9s398dj378/7+9/7+OD5+d36 +/uH4/t/9/uj199z189/s7c7s4c/x6MDv2sTs1bDs27Xq2LTm06vryKbm0Krs0qblx6LjyKXf +ya7i5Ljn+tv1/OXr++fl++Xl+ef2/uP9/+75/+b9/+/7/+nq8N7m/N/7/+vs8uXE0cbS7drO +zc6OpqxvmaRhkpphkJ5elpxXjptbkJhclZ5gk51flZhbk5hijqBbkZ9bkpdakpdbk5VXkJZa +jJRVjpNhj5RVjpJajJVKi5NYjJVPjJZThJBHf4tJeoxFeYNOeIBLfoZdiJVSi5BYjJhWiZVV +iJBWhY9TipJVipVSi5hXipZViZJXiotVi49QjJFShpRTjI5PhotQg4pRhI5OholNfolFeoFP +c4dBc3xKa34+bG5DZnA8ZWJBYWo/Y2Y/bHBEanNMd3tHbnlHdHBLcX9GZnRIbHA/am9DTVs3 +Pj05Pzs4QD88PTw6PTg2PDk8QTw3QDY9QDg4QDc+QD42PjhAPz0yRDtIST1fZEZ/clWEdlqS +fGKQfmSVg2aSg2iPfGObgmWliGmymG24nHW/lHDBpnbKpXPKpnjNqH/EoXTKp3nHn3HJo3O/ +knDCkGq/k220h2mjdmWhelzIx3f9//////////////////////3////////////////////+ +//36//H4/+v+//3////////7//T6//H////8//vs/+Xm/Nfo8eLr99/3+/Dz9en7//n///X3 +//b///v6//H9//z9/+v3//X5//L6/fX1/+3///f+//z///////n9//j6//f5//L7//r9//j+ +//Tz9u7+//P+//n///////Dr3tZYSEU8RT5IQz5CRj9IRUA7Qj9HQz8+S0pifopoi5p1gItC +SFJKZ3WFoayDna59mqx7kqR3lKd7mKiInq1VWW1HSVU8T15Sbnp0kJd2hptqgpBlcIRWWWxS +W2tOaHRedYl+nql9l6l2iqBvg5RlfI9rgJNsiJpsgpVnhZlrf5BmfZBle41lgI1ohZBshJZz +hpxuh5ZqfZRXYXJDR0w8Q0BARj9ATkakyafw+OP5/+7///D9//P///H///X///P///L///P/ +//L///D///T///L///L7/+3///T///D///T///H///X///H///b///f///T///j///v///b/ +//n///X///n///f///j///f///3///j///r///n///b///f///b///n///f///f///T///T/ +//f///b///j///L///j///L///r//+3///r///T///v///j///j///b///3///n///z///r/ +//v///X///j///j///n///z///n///r///v///n///P///r///z///f///z///n///7///f/ +//z///n///j///f///n///z///r///n///b///n///3///n///r///r///3///v///n///3/ +//z///v///z///v///v///n///n///n///3///r///////////z///j///v///z///7///7/ +//z///7///r///r///3///r///7///X///v///r///b///r///j///X///v///P///z///X/ +//j//+////r//+////T///H//+v///H//+j///L///L///L//+////P9//H///L9//H///b9 +/+/+//L2/+r8/+/6/ury/+7x/uXz/ur2/+Ts/en5+unz/Ony/OHz/OD1/ePw+OXx/uf0/+jq ++eLl9+bp/Obx++vs/uj3/+3//+/8/+75/+z+/+j7/+Dy/eT2/+Lz+fDd5dK94cjh/ODU1dmT +sbZ8laVjkJlhmJpekp1iipdXkZxel5hhl6Bfj5dZkJdfjJlUlZlkkZpPio9UiJVYkZddjJdV +jpVWi5RTiZdbjJlVi5RbjplSi5ZPhJZKf41KgIlMf4VKeIVLgYlNgotUho1Uj5JVjJFTi5JO +i45NiI5PgYpWjZVPipJShZBNi5NThotPh41ShZFNiIxYhY5PiIlRgIxOfIRKeYdJfINKdIVD +cH1FbnxBZ3U8Z3A/Y208X2o/V2Q+YWU8a2xIc3ZEcXdHa29Hb3JGZXNEZmpDZ3M8WmE+PkYy +PDQ/PzszPTQ8Pjk0PzhBPzk2PThCPjo6PTk9Pjg4QTk4PTk3Pjk9QzljYEh6c1OGemCKfmCV +g2KPf2aOemCVgWeehmSsj2irjW23lXK1k2vAoXjNp3bGonzUrH3Ko3vHpXDNqHzLonjAmHPD +kW+6j2y1iWqof16wgWO7qm75/9j///r///////z////////////9/+7+//X///////n///// +///////////5//T4/+/////8//3z+eT4//Tt/+f5/+n///v3//Tx8+r6/+/s9Oby/un9//nu +/en+//T5//L+//X1//f///7///////f6//b///v///f1//L4//j///39//////Pz+/P8/vz/ +//v///////f///3///Lz7+RPSEhBQz44PTdAPkA7QzpCQkQ8Rz9HWGBmi5VviJ1maHRFTlhQ +dn5/paqJo7KIorCCnKZ5nKeGp7GHpa5hZ3g+TVI/SVRMZW9oi49zfYpXXmlRX29KaHFbdYVt +jZt9l6V8nqJ8lqdxi5xugJRmeYhog45yjZd1j6JmhJBmgpVmgYxjfIdogYtmf49thJNki5dw +hZRtgpdebX1FSEs+RkE+RD87RkKJtI/m+N75/+37/+z///H///H///X///D///X///L///H/ +//L///H///T///L8/+/6//D///L//+////H8//H///H///T///X///f///j///j///T///f/ +//j///z///b///v///r///f///P///j///b///f///j///r///b///T///j///X///T///D/ +//D///D///T///L///L///r///P///n///X///n///j///n///b///n///f///z///r///n/ +//P///P///b///f///r///T///3///n///n///L///f///X///n///r///r///r///z///j/ +//T///r///f///T///n///z///X///r///X///j///b///z///j///j///n///n///3///z/ +//z///j///////r///////z///7///b///7///z///3///X///3///f///7///3///////7/ +//v///r///n///b///r///z///n///r///3///f///r///T///v///P///j///T///v///H/ +//j///j///z///P///H//+7///D//+///+3///H//+///+7//+/+//P+//L///P///L///L/ +//T///L///j///D///v9/+z+//L6/+79/+/4/uj5/Ovt+uTs+ePd7d3b6tjg79nZ8OHW7tzf +9dvq/er0//D3/+z+/+j9/+n//+v8/+j3/+Lv/eXz/+Tk89bK3M20zb/g9+Pd+uXd59iar7qP +nLF4mJlclp9glZpXkp9dlptfk5VZk5hXkppZkJdWkJJckZRZlZJilptYkZNakJlWjpBTjZVa +jpJXj5dWkJFSi5JYiYxTho5Wio1QiZBUio1MhYxNf4hIgohViI1QjJNVjJBXkZNRj5VQjZBS +iZNSh41RiIxSipNMipBTiJBPiI5OhpNUiJBRhY5Mgo1QgItKgohNgIlIfYdNeYRPeYpJcYBF +b4BEb3g+a3k+am04YmpAX2ZAYGk8aXFBb29JdXVEdHhCaXY8aHNDY2s/bG4/WWc6Q0Y9QDs5 +RDk6Pzo2Pjc0PDY2Pjk1PTg2Ojc4PDs1PjY5Pzg8PjY2PzlCPjtcYkl8dFOEdlmLgFaSf2aL +emKKe1qVgV6ciWWqkmqrjmmzoXC+nHjBmG3GonfDo3fKq3fMrHjOonrGn27DnHW+mHG1hGWz +jmS3i2ewhGakeF66sXH9/+j///////z///r///////////////////7///X////3/+79//v/ +///////////////5//P7//H0//Hs9uLt/ujn/9rx/efs/OXh7938//v9/vr4//r5//Hz/vL+ +/vn1++js/d/w/vP8//T19en5/u36/+ry//L2//H+//f///7///3///////////37//z+//z1 +/e74//X5//L3//H59uVYSEtARD5ERT08Qz8+QkA+R0E/SUJMcHdwk55vhZlRUl8/X19igIp4 +qqaQq7WFpq+FoLB1lqOCr7SIsbFzd49AUFZDS1VBWmFbanJOX2pOYG1JaXVsjJiFpq6SrLSP +oat8oax9j510iZZmhpVofY9mgo94kJ18maFziJ5jhZFsgI9ifotlfYxjfo9pg5NsiJdziJ1t +iJlnb4dARU9BRERBSD9CR0aEqoHg89r3/uz+/+36/+///+////L///L///T///n///L///P/ +//L///T///H///P//+////X///D///r///P///H//+////r///T///z///n///b///P///n/ +//r///3///z///n9/u7///b///b///T///H///z///X///v///b///j///P///r///P///r/ +//b///7///b///j///L///H///n///v///z///n///r///f///////v///X///v///v///b/ +//j///z///z///n///r///v///z///z///T///f///j///n///7///j///z///z///////b/ +//r///b///T///f///j///j///z///X///z///////3///z///z///z///z///3///j///3/ +//r///7///////3///v///3///v///v///z///////v///n///z///v///////v///////z/ +//r///b///7///n///3///3///v///n///z///T///v///3///z///n///b///T///b///3/ +//n///f///v///X///b///T///7///P///n///X///n///L///T///P///3///L///z///j/ +//z///T///j///X///T///b///H///T///D///b+//D9/+z//+/9/+n7/+v6/+7+/+r8/+70 +/+zx/+f9/+75/+X9/+v//+z//+rNx6uJm4KOqY+sw7C1wby9787h+ubo+eTW4uGetbyGrbF3 +np9mm6Bhn6JbmadalJ5XkJhfkppUlZpgiZlWkZpfk6FUjJFhkpdVjpJflJVbkZJaj5dWjpNV +jZVZhI5SipBUj5RQiJNYhpBUiY5OiYxSiIdNfo1MgYZSio5OiJBTjJJai5ZPipBaipFQgotV +h5FNgIpXho9NiZBWi5NXjphZio5OhY5WiJBaiY9Sgo5LgItMe4ROeIVOeYBMeIZKe4JQdIhC +cXtCbXc8bHRBZG1AYGs9YmhDZWtEa21BcHJJcXlIcXhKbm5EaW1Ga25AYWU8Rk87PT44Pjg4 +Pzw5PjkwQTZAQTs0Pjw5QTszQDY9QjszQDc8QD45Qjg+RTxZXEV4cFWFfFuPf16MfGKDbl2J +gFubhWuijGmmjmaokW+zn2zGp3nFnnbHpXXFoXXGpnPAmHK0jGq7jGi/lme/i2+shF+viWer +jGWyimacel28qmj9/+r///////////////////////////////////////////////////P4 +/+31/+vr9uP2/+r5/+36//D///31/vPk+dXo8eXf7dPp8t71/+z4//Lt//Tu++/4/+v7//f9 +//r9//z///////37//z6//H+//r7//X6//f///37//P3/+3r/+ft/+rz//H5//n0+/D9//n/ +//v///X5//nx8OFSRkZCSUA8Qzg6Qjs7Pjw8QkFEUVVff4x0jJ9nf4xHTVNDYGpXe4Nhg5GD +pquMrbKForCFnamNqrJ9mqp1iJJMVGk8UFZHUGVKYW1Uan1YdoZ3k6V/mqJ/mKeOqbGBn6+K +qq19lad1h5hlgIxjeoxnfItvlp98nqd4jKZnf5dphJRmeo5jeoxkfY5kgJFwh5pviZdzhJdf +dH1KSlU3Rj1EQUM6RkJylnXO58r0/O34/+3///T///L+//P+//T///b///j///T///L9/+// +//P///P///L8/+/7//H///P///P///v8//H///T///P///r///n///j//+////v///n///v/ +//v///z///X//+////j///f///r///X///r///r///n///b///j///j///v///r///P///v/ +//f///z///z///j//+////z///z///7///f///f///j///3///7///z///r///z///L///n/ +//////r///f///f///j///z///////P///T///j///n///3///f///3///v///v///f///T/ +//3///f///n///f///r///7///3///z///3///j///////j///////7///z///v///////v/ +//v///n///7///f///3///z///////z///7///z///////z///7///v///3///r///////r/ +//7///n///7///r///////f///////b///////v///////z///7///j///f///n///n///3/ +//n///b///n///z///r///b///3///n///7///r///j///H///j///T///r///f+//Hz/+n/ +//D9//L8/+////X///P///T+/+/9//D//+7//+///+z9//D7/+32//D5//H5/+n4/+/1/+z5 +/+71/+71/uj5/+L3/+v3/+bc3d3Dy7zA0ca3x7avybzd9+Dd+ufh99/Y7NypqLKJq7KBnqt1 +l6FnlJpikqJel5tgmJxVlZ5ZlJZXkptkjZJbk5dci5JUj5dejJpXkpxhlZhSjZpalphOjphh +jJRVi5dUj5FZjZdMipBTjJJSi41Uf4tKgYJQfX5KhIBThYlSjotYipFMi4ZWiZBXjJZXjI9Q +iYpSiIlTjI5WjpBNh41Qh41NgY1ShYlNgo9PgIxJfotIeoRFfIBKdoJLfIdMeIFHdIBIcHw8 +bnpDbXVAaHE7YnE8ZWY5Y21AamtBbHBGc3JHdHxGbHI9Zm5BZmNAZGg9RlQ3Pzo4Pzo1Pzg8 +QTY2PTg2Pzk7Ojw2PTg5QTk3OTQ+QDs+RTxBOzo2RDhfWkd0blOAcFeEe12RfmGDdV6QgGKi +imeokG+kj2uoj26xnWq7oHPHp3jFqnXNrn3KpXbHonfHm3PEm3G3km+6kmvBim2+jmqofWCe +dl2mfGG1pmH9/93+/+r4//L8//H///////////////r////9//39//b///////////X///// +//j///n////////+//r3//Tr/d/f+tbr/OP1/e/r9OP3//L1+/D8/vz////7///5/+/5//L/ +//7t/evz//n5//f19eft/O7///f1/ert+uf6//L8//n///z////9//L9//3///T+//j9//H6 +//Hr7+br599US09BRkQ3Qz9DPUA9PzxBRT9Ld3tsip9xhplebnU/SlRQX25PaXpYdYNwlqGC +oqqEpKyAoKh9mJ14n6RreIJSWmRKX2hccYJzjZaImrKAnKWLpa5yjJlui5p1jJV4jJ99l6J9 +lqpwi5tqfJFlgYxff4twj5iAnqt+laZ6jp5khJZof4xjeIple4tlhI5tgpBsh5VxhptjeotM +TV43RkFEQkM7Qz5WYlalz6jr9uD8/+v///P///T///T///D///P///f///f///f///H///b/ +//T///b///f//+7///b///b///n///L///b///X///v///f8//X///P///n///j///////r/ +//b///r///b///r///r///r///X///r///v///3///X///r///3///3///v///D///3///r/ +//7///n///f///H///j///z///7///f///D///v///r///r///z///3///n///j///z///3/ +//n///b///3///v///3///3///X///z///3///v///z///j///z///v///7///b///r///b/ +//n///3///r///v///r///3///j///v///3///////3///////z///z///3///z///////// +//3///7///v///z///f///////////7///j///7///7///7///////7///3///////////z/ +//r///////j///////v///////j///////j///v///v///////7///7///n///n///3///v/ +//n///z///z///z///f///n///b///7///n///n///v///v///n///j///T///n///T+//H0 +/Ob2//H///j///H///f///L///P///H///X///H///T9/+z1/+/5/+78/+r7/+z4/+v0/+nz +/+Tz/ubo/d3x9+Td8OLU5dnE2Mi51MCqyrnL59zX+N3e9ePd9ObY6typq7J2l52AoqmDn6d1 +mKVjkptek5xZlplfkZ5kl5tbj5hdkppWj5peiZVVkZpbi5dUipNdjphRkJRikpdUipVWjJRP +jJRgi5dVkJVWh5FShZJShYtPg4VNhItTfoZGfoBTfYlGhohYkJROjJJdjpBajpJVgpFSh45b +ho1Si4pZi5JTipFUhI5KholVhoxIgolSfolNg4pNfYVIfoZPfYdKeodJe4VGf4RKeYNBdn5F +bXtAa3VAZ3c/ZGtDYm1BZW5GaHJBa3FJc3tDbnZCZGxAZF9BY2FASVc4QD04Ozg4QTs9Ozs8 +PTY3QDczQzY5RDY+QDs6OjU+PDo6Qzc9Pj07RDleYEV4cVGBdVuHfVyKdF+FdluPf2CXgGSf +gmanjWWwlHG0nWrBmnPFoHPLq3rClnLFo2/RqHTDnHK+j2+5jWa3kGm9lG63iWaxg2arf1uY +cVywmF/6+87///v///////////////////////////3////////6/vb6/+n///v///v///// +//////33//Tv/eb6+u74//rk+tfw+eXt+ujx/Oj////5//j1//Tt/evx9O319+v4/fLt/+z9 +//r1/e/+//f7//z//ff5+vP9//3///v9//////v///X5//T///v////0+e34//H9//L0/vT/ +//72+ehcTVo1QTc+QUA6Pzc9Q0A0Qz1ggY1ulJhrhZ1PVmBASVFOXmtPZHVQZnVadHxkfIVk +f4hifoRibXpUY25RX2dRaHpkeIt+nqeDn6yNq7J/laBhe4dmc4BRZnRjf4h2kZ6Hn6x+maR3 +hplmfoxoe45igo9mgY59oaeAn6h4i59sgJFkf5BjeotlfJFhfIZmf4tmgpNrgZZleYtOTl06 +SEA/QkA3RUFATkmOrZDc89Py/+j//+3///T///D///L///D///b///P///T///H///L///f/ +//P///b5//D///L///X///f8//D///L///b///f///j///b///X///r///j///X///r///r/ +//f///n///z///z///v///7///v///z///r///f///n///v///r///z///T///z///v///// +//n///f///P///r///3///z///f///n///n///z///7///z///////z///n///7///7///n/ +//n///////n///////r///b///n///7///n///z///z///////3///7///n///////n///j/ +//j///r///z///////z///v///z///n///////////z///////////7///X///7///z///// +//n///z///3///////3///////z///7///z///////7///j///3///r///////7///z///z/ +//////v///////v///j///z///////7///7///////n///n///v///n///n///7///f///3/ +//////7///z///3///n///z///v///r///v///f///v///n///z///X///f///j///T///v/ +/+////b//+////T///H///P//+///+////H//+v+/+/2/+b4/u7s/uPw9OTh7tPR38q+4LW5 +0rGjrpW40MXX5N3G2NDDz8inyr+33cnT6eHX9ODT9OLN5NrJ5NistrqQqLOBpaR9o6Z4lZ9m +kJhZmJlhkJ1ai5RVipxclJVckJhRkpJbkpdUjJNYkpJWjZdUipRWkZdci5NakpdblJhWjphW +jJBTkZZVipRZipNVhpFMgopQf4dOgItOgIVNhYtQgYhOiZBUi5FTjI1cj5JOiI9WhY5MhYhT +fYdKgoZRhZFJg4hKgopPhYpMf4lHfohMfYhDgIlKe4lKeYJJeYVLc4FJeINLe4JGdoRJcn5E +bHs+bHk/aXI6Ymo+ZGg/am5EaHNDbHFOc3tDcndNZmw4Y1xCTFMvPzs6PzszPzU8Pzo4PTU5 +QTs3Pjk6Qzg4PjY7Pjg8Qjw6QTU5QDg+PztcWUNybFJ9cVSFeVuEcFmFdFuMd1qReluhgV+m +jmymj2O0jmy5omzKp3nDoXLInXC3lXHFmHC9kW+9i2m5h2q8jWq5hmezgGWremCofl+db12r +k2j6/sP///////7///r///r///7///z///z////9//r9//j///////r////////////7//f5 +/fD8//D////7//nk9t/j/Nbt/O7v+Orf6tn0/+/0/+/t/eb0/u36//X8//f///3////////4 +//b9//3///n8//f///7///////38//r///n9//v////3/+r3+eXw+fH+//36/ez7//bt++ns +6+BYUVY7Q0I/QTk+Qj83RkFHXWhkh5BlhpFsgopHTFRAR0xEW2JNZ21OYGxOYG9SY3BQYWpM +X21NYW5ZaHhXcoZyjJl6kqOFnaV6nKh8lZ98mJ9nboJQYXNRYm5RanJskZWFpqt6lKF1g5pt +gJNnf5Fkfoxqe5B0mZ2Gm6pxkp9+jaBpgZVrf5ZkfJJjfY5kgJFtiJFugJlkf4xTWGlAREA+ +QkJERD5AS0ddeGS32bjj8dj5/+r///L///H///D///L///j///H///X5/+7///P///T///b8 +/+/5//D///L///T9//D5/+////D///X9//H9//H9//L///T///f///j///r///3///r///v/ +//b///7///////3///3///7///z///3///f///r///b///n///P///X///n///3///v///f/ +//n//+7///z///3///v///j///f///7///v///j///z///////3///j///3///////j///r/ +//r///////r///z///T///3///z///z///3///7///z///7///v///b///z///3///f///z/ +//f///3///v///////7///////z///////z///////n///////v///////z///////z///z/ +//////7///n///////7///7///v///3///////7///////3///z///////7///////v///// +//3///////7///7///3///z///7///3///////7///7///z///////7///7///7///3///3/ +//z///j///n///r///f///7///f///n///n///z///j///v///j///v///f///r///j///r/ +//j///f///P///n///X///L8/erB4cuz17zM6si9zcC6xbm7yb/L2srN2tPc3dvZ3dvm7uHe +8uDl8t7J29C+1b2vxsG20cfS6t3b7N/c8d3T8N7P6dvE4NKemq53kZSAjJmDp6aEnrF5k59e +jJ5ZlJ1fk6JhlJ5ij59ek5taj5JWiY5akZVaipZWjZNakZdYk5ZVj5pfkZdXk55bjZZVipFa +ipNQjJJZiZlYh5NTh4hVg4lPfotKgYdUgopTiIlYipFSjoteipNRjI5WiJJUiIlWhZNQhI9S +h41QiZBYhY1WiJBSgYpOhItIfYpLgYZQgYhLgoZLeYVDd4JOdIRJeYRNdoNDdoBKcX9CcX1F +bn0/bXdEb3Y+a3BFa24/a2tMcHlHc3lQeYFEa3VCXmc/SVg3QTk3Ozw2PTY8PTQ0PTU3Pzs6 +PT88QTVBPjw5Ozk9Qjw5PTQ+QTtARDpdWkRsa0uEdVuEfVqMdGF+cFyKfFqLf2Gnk2CciWaw +kGO0lW3EpHXKqnHJrnnGoXm8m3LBl3TFoHHGpHnEoXTAkXC7jmu7imiygmOjfVujemKyj2L+ +/83///////////////////////////////////////////z///v////2//Py+en1/uv///// +///3/fLo9eDp/ebm/93t++Dt+Ovp8t78//n3//L7//f///z///Ht/uf4/ev6//f+//z///X0 +/fDs+ej1/e33+uz6/vT+//j9//f///T1/fL5//T///31//X///7////////////9//z/9+5f +UF5ESD02Qz9DPj82RENnhItjhJJugZdpfItDSks/SEZEV19SW2hEU19LVmBKXF9TWWtNX21T +ZnZahIx6kKCAl6Z1hJxxmZx1i5tegIVqd4NPYmxSXWVPXGxSY3Bgf4eEn6GAlKFziJpohpVm +hZFlg49ngI1tjJqJnqhviZt4kJ9rf5FrhpNffIxufo1ge4prgZJigItwgZJRW2xEREQ/QD89 +RUJERENQX1d/nYfG5MPv/OH0/ev7/+////P///P///T8/evx/uz4/+////L6/+z2/+j1/+b2 +/vD8/+/y/+jt++X5/+39/+34//L6/ez6/+z+//X///n///f///j///r///r///v///r///r/ +//////z///3///v///z///z///r///j///j///n///v///n///v///z///v///r///z///3/ +//T///r///r///7///z///j///3///////X///3///7///////f///7///z///7///r///r/ +//v///n///z///f///z///z///////v///3///z///////v///r///////7///v///v///z/ +//z///////7///////////////////3///r///////z///z///////7///z///v///v///7/ +//////3///7///7///////v///3///z///7///////3///////////3///3///////z///// +//7///////j///////3///z///7///n///////7///n///v///7///z///3///7///z///r/ +//b///r///v///v///T///n///f///j///b///v///v///T///j///3///7///j///r///j/ +//f///f///b///D//+39/+r9/uz5+Ofq/ujv/vDq/+34/+z0/unz//Du/+3z/+zy/+ft+u3d +7Nm70c2wzb7D1M/R5tjT9ODY6OXP8d/O6OLG5Na30c2Ol5h5mJZ9iZhrko+Ao6F7m6p2lqRe +jp9akJNempZkkZZYlplhjJRYi5dgj5FXkJdYlZ1Vk5pVkI1Xi5RXkpJXjZRZj5VajphYk5dj +jJxXjZZZh5RKhI9ShYtLfIlQeYVLeYRQgYhNiIxUiY5ZiJVXi41aio5chYtQho5RhJFPhItS +jI9VhotSh4pOiZBPfYpKfolMeoVLeoVLeYhGeX9IeoVMfYNReYNDdX5NdoFHdntLdIFGdn9H +cn8/bXJDanNAZWdCaGo8bXBGc3dMdXtKb31EYm01S1Q6Qjo3Qzs4QzY4QDc0OzU+PT45Pzk8 +Pzg1QTg8Pjk3QTk+Ozs3QDpCSz1YXkdxZ1B/c1eIdV18bVeGbVmBb1aTfl6eiGGojWq0lWzF +o23FpXzCnnDNp3fMq3/KpnnAo2zJpXDBlm26l2u9kXG8kWi3k2+3imWtfGWefVWmg2D3/br/ +//n///z///////////////////////v////+/+z+//b///////j///T///////3////9//P/ +//r///ny++3b79Hu+OTu9eDs9eLu/+z+//z////7//H+//z9//T///71/+v9//z///3+//39 +//X+//v///////n5/+z9//T9//j9//Xx/efz/fP+//T4++3+//n///z///////f09+pjUGJD +PkY7QTs+Qjw+W1ptiJdwipVlfYprfY48R0lESEM8T1BYWGBEWGRRVWVKW2hRYXFSXm5OZ3Ze +gYt8maCIoax5iJx3j5txf45baHtRYm9RVmpRW2xUX3BQaHBhgIiGnKt9kaByhZhrf5Jpg5Nn +fYtshpNtg5Z2j6B6jaBkdYxhfIdriJJrf5RgfI1kfIhlfotpg4xkf41bYXRBRkdCRUM8QzxC +Q0lNWFhriXO52rrg7d/k9971++f+/+////H///L5/e3t+ubx/er5/+v6/+32/eny/enu++X7 +/+3w+OT0/Or0/+r///X///L///T//+7///L///T///n///v///v///f///j///v///j///z/ +//r///r///r///z///3///3///n///////3///r///3///j///7///n///z///f///3///f/ +//////z///////z///////f///////3///v///3///7///b///z///r///3///v///7///z/ +//7///z///P///r///////v///7///r///3///v///////z///////3///v///z///////7/ +//7///3///7///3///v///z///3///z///////////////3///////3///z///3///7///3/ +//////n///////z///3///r///3///////////////7///////v///7///v///7///n///7/ +//////////3///v///r///z///////z///7///7///3///n///3///z///3///b///z///j/ +//z///b///j///j///v///v///n///z///f///n///X///j///j///7///f///f///b///f/ +//T///f///b///L///X9/+/4/+z6//X5/+zy/uvt/+7t/u/r/ejt/+vj+ubq/ebg8dzD1ce4 +08bI4dTP5NjX793R8d3U6ODP8NvT793K5dK4zcx4aIVMU1RUaFxljIlthIFqgIZrkJBxjJxW +k5phkp1ak5pilJpbj5hTipNUkpdWjZpXjpZViZFRjpVciZdWjZdflZlWio5YjZBSiZNWipRR +jpRWkJVVjo9XiJFSh4xUgYtMgIVNfoZXiI1MhIhVh4hYjI9ajpRfjpVbjpNViZNTho5SgIpP +gIhOgYhUgIhOfYdPfoRPe4hKfIBPe4VKfoBSeodDdnxLdYVFdn5PfYJKd4JKcoFLd4NIcXlC +b3pEbXRCZm4/ZGlBanBGcmxJdHpIcXpDbndAS1w6Pzo+QTs5Qjg9QTo1QjlAPDs3PjRBQDk3 +PjdDQj07QTZCQDs3RjZHQTpWWkdwbE9/alSAblR3a1WAc1GLelmUgWWdg1+ljmitimbBom7C +nnXBnnPDoW/KonnMpXHHmHK1lGK3jnOyh2CyiWivh2SwgmiuhluqgWejfl+ljGP5+7////// +//////////////////////////////3///f///7///v///////////////j9//38//P9/+7/ +//bx/+3w/+L///rw9+zn9d35//T0//L3//b1//f5//H+//v8//Hv/e76//r///r///7///// +//X6//L///3////7+/L7/vT9//v///////////ny8ur+//n2//H8/vL4//Pu8uRgUWpLQkY7 +QURCQ0VLfoZyg5Zqgplnf4tmfYxCRks/RUI9TEhKTVdFVVtPVmJOXWJSa3lWb4NxhpNcfZF0 +hZmAmqN4hJxicoZdaXpQYnRTW3FTWWlOW2VOY3FNYW5Tb3yClqN3jqNyg5hrgpRpgZFkg5Bt +gZNrg495iZeBnKNvdZFRbnZpgpJqh5hmfpJoeo9kfpNngZNlf5BkdIBGS1k/R0RERUZGSkxV +WltbamiOtZzT5cza6Nfk9tvz/Of6/+7///T///P//e/z++r7/e77/+7///D8//H4/fD8/+// +//P7/+z5/+v///L///r///n///z///T///r///v///r///7///n///n///7///z///////// +//3///n///z///////z///n///////7///////3///3///z///////////////z///f///// +//////////////3///7///////3///v///////////n///z///////z///r///////////3/ +//7///L///////7///3///7///7///7///////////3///////z///n///////z///////// +//////////////////////////7///////////z///////////////3///////////////3/ +//////////7///7///7///3///////////7///////////////////////7///7///3///v/ +//7///3///////v///7///r///v///z///////////3///7///////7///7///7///7///7/ +//3///z///X///v///7///n///z///j///f///n///b///n///X///j///r///r///j///n/ +//7///b///f///j+//P7/+zy/+39//H3/+7u/u3q/unk8OPV7trF4M621cu+2czM5NrR7OHU +9t7a8ubJ6tjS6+HF4tzJ6NrF6t3F4tirtLdTXV9CWlhLTFA9SkxNXlpae3VoeYldf4Bjj5da +lppglJ5fm5lki5RWjpddiplYk5VekJFdkJRVi5dXj5JajppWi5dQipNTiI5RjI9ViJBVjJBV +io5Qho9PjJJWhI9Vf4hTf4lSf41RfpBOg4hSh49RhYpciZJTio9WhZVRh4tWhYxMf4NRgIxP +hIVNf41LfItMfIhPgIdLe4hQe4RMfYZJeoNHdH5OdoRNeYJMdYVLd35EcnpNdn9Ec31Lbnw/ +aXJIZ3c/aXVEanc+am5IcHlDdXhTcIA3WW0/QEEwQDw8QDs9QD08Pjw7Pjo4PzhBQDw9RDo9 +Pzs9Qj08Pzk+RTw/QjxUU0NrZ0Z1a1h/bVWBaV6EdVaQfl+NcVqcgWCljma0lHO9mnLAoH21 +mHW6mXTBnW/BoHC9lG++lW29kWq5jm68h2u0h2axfmWlgV6kfGSbeFuui2L7/b3///////// +//////////////////////////////////////3///f///////v///j8//n3/+33/+3p9ubd +79Tj/NLs8uTf79jp9eDy/+/z/e3x/+/6//np+ebr/eLx++32/uz+//T0/+z6//fz//X3//j7 +//b3//X1//X9//7////3/+7w/uXz/+38//v/+/n9//z///v///r4/fLs8eNrUGo9QzxCRUEy +R0RlhZBoiJ1pf5JhfIpsgJRDUldEQ0c+RUdHUVxATlhGUVpGWmFSYXJLaHd6ipljg5NviZNx +jJRviplleIhSZW9KXGZMW2hIV2xPWmRPX2dSYmtVcH2HpKuCkqN4i5lnhJBrh5FhgIxufJNl +gIlyjZx1kaNsepRUZnZddoRrhY9rgpZofpBmfo5qhZRrgY5wgpBQVWVBRUFBR0BAT0hTW1tV +Zl+Eo4vF3cXl8trs9+jy9+ns/OH9/+/9/+////X4/+r8/u79/+3///T///H3/Oz9/+v///n/ +//b3/un//+////j///z///n///r///j///v///n///3///r///7///7///j///3///z///3/ +//3///3///z///r///r///3///7///////7///n///////v///7///3///z///b///7///7/ +//7///////z///7///v///7///////z///3///j///z///7///z///j///7///////////7/ +//j///v///////z///////z///z///z///3///z///7///3///f///7///r///3///3///3/ +//r///////////7///////////z///////////////3///3///3///////////n///////r/ +//////7///////3///3///n///////////////////////z///////////////r///////z/ +//3///n///7///n///////n///7///r///r///z///7///r///7///z///7///z///////X/ +//////f///3///r///j///r///r///v///7///3///b///n///v///b///v///f///b///f/ +//j///D///P///L+//Hy/+z6/+3z//Dz/ejb7tvX6tzZ7uDU59rT6N3S79rV7eDU7eDO6dzF +6NXF59nI49jI4N/D6dnJ5tfE29CMi6JjcoBJcnhPV2xASkhCSlFDR0dKUlZZeHdmiYhdlZFe +iJtajZFWkJVYh5FZkJRdjphRjpFejZVQio5bjJZcjJVVjJdYk5FQi4tajpNVipRSiZRWkZRa +iJNOiJFYiJFRiIxRhYtGg4hSfYZKeoZRhY1OhYxWiJFXiJFSho1QhpVShYlTf4ZPfIRTe4NN +f4BQhIlLfYdLfYNKfYtMe4ZIeoZGeIBFdn1Ld4RMe4NFd31EeIBIdn1HdINJc35JcH1IbHk/ +b3tCaXBCbHREZ3BBbnJFcXVFb3ZOa3o2QEk9QDsxQDY5PDoyPjk9P0A5QDs7Qjg7Qjs9Qjo9 +Qj06Pjk0QTY/QTtXVkNvZ014aVSBcViAbVh8dFaOfl2ahGOcg2Cnh2i0lmzBn3LCp3fAmnKt +jGS8kG23jmW5knC2kmvBkmq3k2y7jmquiGerhGCkfV+VclqUclihhF76/br///////z///n/ +//n///j///////z///////////v///////////////////r///n///j7//P///j////y//Ho ++9zp89/l9eHr6+Tq//H+//b7//n9//n1//b6//j///7///n2//H2//v1/e/q/On9//b1+ej1 +/fLt/e31//H5//7////9//f+//bv/eX4+/L///3///j0//L8//Px++x3WGxDP0ZEQT8/VF1k +hJRtiJpnf5VjfI9ogpFaVGBCQEQ6SEhHTVU/U1lHUmFCVmBPXXJHZ3RkeIlfeYdmb4NVb35u +f45UZnVSYGpMWmdNWGlRXGtJXm5RX2xOY3JTe4SBkKJ2jqB1hphuhJZvhZhrg5NrgZNkgYxu +hJJyi5t8i55YaHtTZHhXeoFvgZ1jeItogZZngJFshJhxiJdjbIJER0pBSUFHUk9TXVtUW192 +lX641b3l9d/w/Or6+ujq8+X6/+39//D///f//e/4/+37/+z///n///T7//L+//H///T///j/ +//P///L///j///v///3///f///n///z///3///3///3///z///3///7///3///3///v///f/ +//3///v///3///v///3///v///////7///////7///////////////3///T///////////// +//z///v///3///////3///z///////////n///////////3///r///////z///3///3///f/ +//j///z///z///////3///////z///7///3///////3///v///7///////3///z///7///7/ +//3///////3///z///////////////////////z///////////z///7///////////////// +//////7///////////z///////7///////7///////7///////////////3///7///////// +//////7///////////////7///n///3///j///////v///3///r///////n///z///n///// +//z///3///n///7///j///7///z///z///z///j///7///7///f///r///v///n///n///L/ +//n///H///X+//b8/+n9/u7l+uvr++bh/Ozk+OXW7+HY7d7O6dzP5dnK5tvK59zI6tnG4drJ +49zD5tzI49vJ6NvK6di3vcR3mKF3lZ5xiZxqh5dchZBUeIJLaXJFSlNIbV5zjJ5nhIhejpVb +kpJaj5hYjphfkZdZj5dbkZhYkZZVlZNdk5Zak5VVi5pTi5RYjZVXjZFRiZRSiI9UipJOho9P +g4xSh4tHgY5SgI1JgIlRg4tJg4pYg4tNh4tQipRTiZJWhI9OhY5Uh4xNf4dNgIZMfYhRfodO +fYNKg4VOf4REfYJQfYdNgYZNfohOeoVOfIZLe4NMe4JJeYJMeYRFc4dHcnpFcYJHcH1AcHhD +bnJAa3ZDa3RDcnxJdHlEdoVLdYE7T1U9QD05Pzo3QEA1Pjg5PT42Qjc/Qj81QDc7QDw1QTc+ +Qj06Qzs8QThQV0JpZ1B5a1l/b1h8cleAblWIe1qWf2OkimarlW+9nXC3lnC+mHe8nXS3lGy8 +lWzIonS/mXK5mW6+n3HBmXLAlnG0imupeWOjgmGacFiRcVadf13y+7L9//r///////////// +//////////////////////n///3///////////v///n///7+//n3//L+//T7//Hs/+jh/9r7 +//b2//Hw9uj////2/+vu8+nz+ufw/e38/+7y//H+//D5//f9//v///3////9//3///////// +//////v///f+//v///3///77//H+/+/z++3y7OTw+ef1/Ozz9OSDXXBDRjw/Pz1CbmplgpZm +fZJhe45hfZVnf49jYWs7Pz85RUVESlJAUldKVGNJVV5KVWtLXGdUaXhaanhVXXNRXGxXZXJK +XmlOXWhDWGFNWGVMW2dQX2tXWm1RZnJmi5B9lKV0ippug5NngZJrhJJng5Nrg5Nkg5BrgZBr +ipp+k6VkdIhNXG1QY29sg5Jmgo5sf4xjgoxsgZJvjpV4fIxCR1A/Q0NJXlBRWWBVVl9ea2Wf +tp3a7ND0/uf9/+r6/On5/en6/+v+//H///H5/ev6/+r///L//+/4/+37/+n///L///X///D/ +/+n///b///T///f///D///X///n///f///j///n///r///n///n///r///v///z///r///3/ +//r///3///v///v///z///////T///n///n///7///v///////z///n///z///////////z/ +//////////z///P//+n///H///n///X///v///v///v///b///n///r///j///n///X///7/ +//n///r///z///z///v///v///n///3///3///r///v///7///////r///7///z///////7/ +//v///3///////r///z///3///z///z///z///3///3///7///z///3///r///////////// +//v///////7///z///3///v///3///z///z///z///3///v///////r///////r///z///n/ +//z///v///7///////7///v///v///n///v///n///3///3///7///f///r///v///v///b/ +//v///P///3///j///z///j///n///L///z///f///7///7///j///v///f///j///n///b/ +//H//+////H9/+7+/vHp1NC+5svb+OTq++Lh+OPd8+TT7t3S6t7O6NrU5t/N7tnS7trS7tzU +7d/O493T69nM39mKnKl0iphxkJlxiZpyiZlslJxxj5pljJlkfI5BTlVYdW5iiJJjiYpZkJJi +j5NVjZNhjZhZkJNckJ1Uj5NVjZNdkJNbj5ZWjYpXipFXjZFRjZFWhZFSg4tSh5FSjpBWhpFO +h5BQg4pRhYdNf4tRg4lNgYpUhIhSiolZiY1RiJBXhYtRi49ShIdJf4pUgItHdYJTeoJJfIJU +f4ZKfYdMfIZKeYZMfIBMdYJKeYBLeoNGfYJJe4NHdYNNeH9SfYVNcoJHeH1Jb3pDaXZCZ3JB +a25Da3REa3RCa3JGc31GcnpAZGQ5SFI5PTs6QTg0PjY5PDg3PzQ6PjU0PzU7Pz0zQjc/Qjc8 +RTVAQzRMUTpkZE52bFV3Z1SDcFCEbFGFcVaRf12egGCujmi4nG+7lmzAnHe0kGy2iGO3k2nB +nnLAnnG8m2vAmXDBmm2+kWergWKmf2Kjd1iZc1mWclijgV7z+rX///b////////6//v///// +//////////z///b///r///z////////4//T///////77//L8//H+//Ty+ebm+ePn/9jz9+rj +7dnm9dnx//X8//X7//f///Ls9+fy/un2//P9//L8//j3/fP1//X4/+31//f9/+v1/vH9//X5 +/e/4/vj///3+///9//X4//j/+/T+/vP8//b9//3////39+mTW29BRDw+RUNRdoBmfItphZBn +g5FohJFog5JlbntBSEM4RUo/SU1BU1xKWmVKVmdMWWxKXGhMVmlKYG1SYnJKXmlQVWlHXGVP +XGVHXGBNV2dNXWJTXmlTZ29WanhvlpuAlKN0i5tvhppnhpZuiJdngJBmgJJtf41khJNxkpp7 +l6d5i5tUYXNHWWdUaHptiJNqhZFng5BogpFvjZRveIpGU1hBSUVJYFlXYGRQW1ZaYF1+moHI +3sjj9uHy/ur1/e36/+v8/+3//+76/+/1/+j5/+z7//L3/+rx+ub1/+X///H7/+39//D+//P/ +//j//+////P5/+7///f///L///X9//b///v///z///z///z///7///7///r///r///////3/ +//v///z///z///v///v///n///r///r///////////3///n///j///v///////3///z///f/ +//7//+z98s764rH/6rr/9sL//dL//+z///X///j///X///n///z///r///n///L///////r/ +//3///z///z///v///////z///////////7///j///z///3///7///////////////////3/ +//r///////3///3///7///////////////////////3///7///3///7///7///v///7///z/ +//7///3///////////7///////7///////z///3///z///7///7///////7///7///7///// +//////////7///////7///v///r///////v///3///f///z///f///v///f///r///P///r/ +//X///n///n///z///T///X///D///f///X///n///n///////f///r///j///T///b//+7/ +//T///P+/+v7/+j+/eXd5My91cOz387S8+Pj9ubl/eHo+efd9ebk8+Lh9uDj8eLd89rc+uHc +8eHd7eOxrb16jaBti5h0jppuiJp0jZd2laJujZt1kqJtjpxuhZljeotkhI1rjpRbkpVZkJZa +kpJbiY9RhodXipRYjpJXjZZRkpdii5lRiYxXh5JTio5TjJhaipBajpVYipJRjJBXjZNUjZRX +hoxPhY1Ug4xRiIdMgYtRiIZPgY5QhYxWi49Rh49XjZBXhYpNfYZQfIVEfIRVfYVFgIFUeohI +f4VSeYNBe4RQeYFGdYFKdoBQfINKeYBNd4FHf35LeYRQeYFJen9GdXxNcXpEbHxDbHZCanVD +bW9CaXZFcXNGcH1BdXhBZnA/WGA/P0I7PzM9PTw4QDc4Qj48PjM7Qjs7PDo9Qzs9Pjg+Qj9C +PD5HTj1nYklzalJ7aFaFdlWKdFiOfVmgiGerk2iqi2iymGm+nXe4nHHAoHWyiWvCoW++nnLA +lnDClmzHmHK7jXC+lnKtg2ivgmChclqbeFuPcVikgl74/b3///////////////////n///j/ +//////j///v///z///f////4/+3///////3v+en8//L///////z///n0/+zb8dPc6Nbz/uP3 +/PP8//X3//Dt/PL7//T+//3///H7/+31/uX4/fr6+err7+T7/vX9//7///f6//P9//b+//z/ +//f+//f///37//f///n///7///3////1++34/vHt9Oe0YXNBPjw+UVNgfIhnfZJkgZNpgY5n +hZBmfZNqeYxDP0c7RUNHSk9GUFtIVmZNXm5JVmtGXGlNWGBMWGZRW2dHWmVLUWlFVmJLVF9J +WF9SWGNOXmlRX2tOY25VaXZqj5Z1j6J0iZlxhphmhZBpg5FmgI1ofIhmgYhvh5BtipeAmqJ8 +nKhobotKW3BFW2tohYZviZtvh5ltiJRvkJxtcIZGUFdBSElmdnJfZGtQXVdYYF5ngWm+1Ljf +8dzf7eDo+N71/ur1/+n2/enr9OHr+OX4/+3y9ujh7djj6tfu/eXx/efo9uPn9+D2/+j///Hz +/en1/uTz/eb8/+z///L///b//+7///b///f///3///f///3///7///3///v///3///7///z/ +//r///z///n///r///z///r///z///v///v///7///v///n///z///z///7///r///b///X0 +68b/8dH/57j/6rn/57L74rL88Lz/9sn//Mv//9v//+n///H///f///T///D///n///v///3/ +//n///v///r///3///f///7///r///z///n///////////z///////////3///////7///v/ +//r///v///////7///////7///////3///////7///////7///7///7///////////z///3/ +//r///3///z///7///v///////////7///z///7///////7///7///z///7///v///////z/ +//////z///////z///////n///z///3///r///n///z///3///v///3///n///n///7///r/ +//3///n///j///j///T///H///j///T///f///b///n///b///z///L///r///b///j///P/ +//f9/+j///P+/vH07dng7dm1wbWzxcO32sHN8NTh9t3g997c9eXb9drV7+Da9trZ+eXf7N7C +zdCAnqWDkZ9zkJZ0h5pxipByjJp2k6F0kqJxjpx5kaByjJqAlqF3laJgkpdekJZVkZdXkZpX +iI5fjZpSi5ZZkpdYjZJUi5RdjpRTjpNVjJNUkY1XjpNWjZJYjpRSjYpZjZZPiJFWipFUhYlQ +h5BKfIVSgIRKgYBRgINOfolSg4pQgYtQi5BVho9ShotNgopRfYZTeoVPfoJHeoFMeIdIe4VQ +fYdHfYNNeodDfIFPfYdBc4BNdoBDdoFQcoFJe35LfIRJeH5KdXtFc3lEcntDcn1Cb3REcXU/ +a29Db3dEcnlFcnxCamlDaG45RFM4Pzo2PTo4PTc7Qz40PjRAPzs6Qy5CQTw4QDA5Qjw7QDVH +TD1iX0dycVd9bFSHe1iPemCShmKjimiij2amjGepkGyyjG+zkWy9mXK6kWu6lmq7nG/Dlmu/ +mHK9lnG9kWyyhGeofF6sg2Gog16jgV2Yc1WWfVju9Kn+//r///7///////r///////7///n/ +//////////r///////z///b2/u75+ej+/+33/O/q/eX0/ej2//Hv/urq+trw9+Xo+ePp+dzv +/uj+//z7//H///n5//b5//T+//z///////f///3////2/+30/+z6//v////7//L8//T8/+31 +/fT9//j///3///n9/PX6//P///7///////n9/vnEZX5ERUBRcnBmhpVmhJRkgZVnf5FoepRn +fYxqeotEQ0hAQ0RDSUtDUFxKVV9EXm1SZGxEXGdPWWdBWGhRW2tFVGZSWWhFUmNNUVxFVGBN +VWJLXWtQYWxWZHBUcYGAlaF1jZR7jJ1whphvhppqhpRrgJBlfpBmgo5uhZZ1iZd6laeBnqx6 +hp5QX3NOWGhSZHFwjJlyiZtvh5l3jppzd5JTW2JDU1mVo595fYZdYmVSYVxiaGCNrJXQ3s3b +59Td59fk89vu++n4/fL4++ns893x+ef7/ur1+ejj69/x++T6/+v09ujk8Nzs+uP8/+z///X/ +//P5/+33/er///P///f///f///P///r///r///n///v///////r///v///r///3///r///z/ +//3///3///////r///7///v///7///////////////T///z///////z///r///799Ozz3q// +/tj/99X/8tD/5sf327L64rX24rXtyJ3u15766Lj18b3+/tL//97//+b///L///r///f///r/ +//z///v///z///j///n///7///n///j///n///////7///////r///////n///////z///3/ +//v///////r///////3///////////n///3///7///r///z///////7///////z///z///7/ +//////////z///7///////3///3///7///z///3///////r///7///////r///7///////v/ +//////7///////f///////z///////n///n///7///z///z///z///3///z///7///b///7/ +//r///7///H///z///v///v///j//+////H///v///7///X///r///T///j///T///n//+3/ +//L///H///b9/+f8/ujcysadtp+62b+20b3A0sG928TI3NG73crF28K51MGar5xzjIeCmqB6 +maF8lpp9j5x6kJp6iZp2maN0lqN2lqSBlqVxhJGApKVykJVmi5VZkplglptblJdZh5xSjZNb +iJdUjZRaj5NRipdYjI1YjJBYjpFUipRZjpRZjJdakZpUi5RZjZVUkJpYiI9NiItShZBLg45P +gY1MgYpSfY5Hf4dNf4hLg4dPgYhWhI1TipJXiZZNgYtXf4hFd4NEcn1JeXxKdXtLeoJKfYdO +e4dJe4hQfYZMe4NPdYNJd4BMdoJCdH9Xd4VHcHtOeH9BcnpLcXpEcHVHcX9GcXVGb3pEa3BE +bnZHbndHdn1CbnFGaXZBVGY4QD88Pjo4Pjs6PDg7QDc6QThBPj04QzZAQTk7RDZCQDw8SDhf +XEhwZE55bFJ+d1mNe2KMel+bgGWihmeoimauk2q0jWuvhGaqjmG6kGjDpXO2kG3CqHDEom+y +iWiyimerhmOykWC3hm6bc1eQbFeLbU6ngl/0+rT///////////////////////////////// +///9/vj8//P///v///////////////////3///36//vp8ubf99vr/+D8//vy+ufy8uz1//b0 +//D0++f1//P1+fPy/ev1/+78//Lz//L1+eXx/vT//fv5/Pb///79//n5//Lx+vL9//f///77 +//P2/e39//v/9/f///f0/+75//X///n9/+vLYnU7RT5deIduiZJugJZlhZJngZZmhpNngJdp +g5lOSFg8QT9ERkk/UV9KUWFJXW1OW2lLWWhRVmhEVGRLVWdGVWFTW2dKV2BKTF5CVF5OVmdH +V2NWXWxPa3RogZeBnaV5i6RyhZZyi5log5JqhJhngZZpgZVrhJJrhJBskZR7lKGBnaV+l6Vn +bIBMXG5MWGtffohpjpp0ipxylpl8e5ZOXmpFUVqftqKXmKNnbW5gZWJXZV17mYS/1rnV38/V +5tXk6tnl9Nv2/+v3/evn9970/Ob///L9/+zx+ufr+OH5/+z5/+z49+ru9eP6/+7///T///X9 +/+/7/+3+//H///j///b///b///f///n///X///n///3///z///v///z///7///7///////3/ +//7///7///v///z///z///3///////////7///n///z///////r///////r+8vTpy6D88rb/ +/cz//+H/9Nf958P95srw2K/sxZHw0Zn22qvw1qDx1qD55K388Lz//Mn//+T//+v///P///n/ +//j///v///T///n///n///n///j///n///n///n///v///r///////z///z///7///7///f/ +//v///3///////z///////z///7///v///v///z///z///3///7///7///////////3///3/ +//v///z///z///////////3///7///3///7///7///////z///////z///////7///////n/ +//////z///v///z///r///z///3///z///3///z///////v///7///r///z///n///r///z/ +//////r///v///X///7///j///j///T///7///f///z///f///3///T///n///H///b///X/ +//L+//P+//D//+/x59a7nZOWt5iuzbirzbenx66lv6yNsZdpi3FTWUxMUFNki4uBlqNzmZ+C +jqB3k5x/kqR2l6F3kqJxmKF6kqN7mqJgipl+mqRTd3hWkJlbkphXj5lXjZhXkJpcjplYjJlg +kJdUipVSjZ1WkJhbj5lRj5VYkp5OiJJejJpTj5FdkJJTjZZVhpVVi41Wi5JViZRRiY9Xh41P +hodRholTiIlSh41Rho9Ng4xVhIlUgo1RioxNhI5ThYRGeIRMdYJBe4JOeoZFfoFTe4hCdIJP +eIBDe35SeYJJfIVQeX9LeYJGe4BPd4JEeX9FdIFBc31Ed3tGcX9GcntFc3hJcHc9dHhEbHZC +b3hIbnZKdG9Kb3tCYW46QUI8Pz09Pzg4Pz09PjU5QD47QjU+QUE/QDw6QkA5Qjw/SDleWURn +aEx1b1N5blWKd1uPfF2UfmWTfl+hiWawm3G3knC4lW21mHG8mHK8k263k2q3jmm3jGiyhWWr +hmKsg2OsgmWlgmOWclaQcFGVb1Oaelvw/bf///b///f///////////////////////z///// +//j////9//n///z///z////9//T9//L6//D5/+/6/u7v/+vf/Nrj8tfn99/u+Ojx/uj4//z/ +//n7/e3w/en1/u75//z///P9//7///////v///77//H6//j9//3///////v+//r7//j5//X3 +//P0/+3n8t/7//b///j+/ff7/uzz+ejKcXU/S0dheYBlhJBkf5ZogpVmh5VxhJJjgJJng5NY +VWE9Qjs5R0U8U1VDVFpKVGJKVWhLVWdBWGZKUmVJU19KUWJEUFxLVmpFU1lJWWNFV2NPWGtO +X2pUa3Zmj5WCmqRyiJpqiplrgZZpg5Fqfo5rfpJogZBqhpNuiZdtiJp2kp9/mqWCm6hpdY1M +XnFQWm1LZ3N2iZpxjJt8kJ15kJtYYXFDYmWtxreosLd1fINnamhcYlVqemqlv6fV6s/j8Nzm +7djd7NTz/OL4/+vz9eXi9dv7/+z///H5/e7z+uft/OD9//L///L5/fD0/Or///b///L///b/ +/+v///L///v///n///3///j///n///P///j///r///j///j///3///n///7///z///7///3/ +//7///////v///////////z///7///////n///3///////7///v///j//fXnx7P02Kj947D/ +47j/88X/787/8M730Kf10aH62Jv62qb72aH206T515733q7/5LD98LP/9ML//9j//+b///T/ +//T///P///T///P///f///D///j///L///r///f///b//+////f///X///L///n///X///f/ +//j///v///n///b///X///n///r///r///////z///3///z///r///n///7///z///7///j/ +//7///r///////r///7///f///////n///////f///z///j///r///v///////7///////n/ +//n///v///z///v///3///7///v///z///3///n///7///z///z///r///r///r///3///// +//7///v///j///n///r///n///b///v///L///3///v///j///b///P///P///f///X///b/ +//b///L///b5/9/dkqZvblCCg2+LoX2NfXJzX1lOTU5DRkFIUktad2+CoJ6GnaWAl6R2k6R8 +mZ96kqF9l6J8lKZ1l6CBmq92f5pslJtyfYlPjJZgkZpYjpBdkZ1WkJdejpxWjppfk5tVjJZb +kJJUjZdai5ZYio1WiotTiI9ZjI5SkZdPjZFZjpdTkpVZiJBWipFXipNSio1eiJZOhI1VgIpR +gopPf4pNgYpSf45Kf4dPhYpMhYhRg4pRiI1PgYlLfotNdYZFfIhOc35FeX9Ld4JGeH5OfIRG +eIBNeYBHeoJMdYFJe35MeX5RenhKc4JEdH5JdH5JdXpIc3xDcX1Nc39Gc3xHcX5EbnZKa3pF +cnZHbXBPcYFCYGs9RVE5PDc4Pjc9QT06QTU7RDk0PjU/Pj46QTY6Pjw8QzhBRj5WVEJqYU5u +bk+FdFeIfVqXhWWVgWCkiWSefWKsjmKzlm+4lW7AnnrFnHTDonm+n3DEpnPBnHPBoHDBk3G2 +iWatfmCielegb1mbe1iUZFeaeFLl86j+//P///////f///X///z////////////7//L+//j/ +///////////////9//76/+3+//j+//v1/Or0/+3s+uTi9tfz++b4//D4/PD5//D2/+f3/+/t +/+j6//z///////f8//X6//n7++bq++n7//X8//r7++n7//b///v///X///D6//r///n///j+ +//n7+/T///v9//f6//D9//j///bidYRAS0lsipNmgI5siJVliJR0jJ5qiJJnhpFmg5NoaXQ3 +Qj86QUBDUVVJTl5JUmFKU2FJVGRFUl5FWWVPVl9FT2BHUVxJVl1NWGNKXmFNXGpIXGRRWm5M +b3RylaKBnaaBlKdxi5pqhZhshY9rgZFhf4xnfo5lfpFxiZdxiZV1k5p9maGBnKJjdYVTZXRM +XGdLXGNlgYVzi5hwipl8l6BaYnROamW50bm5vbqCkZCHhoFjaVtha2GGoIrP3sXn9dvx9+bm +6Nrc8dXz/eX8/e7p8OP0/uT7/+/8//H//e/y++P7/+7///P///D3/Or+/+3///P//+7///H/ +/+v///T///b///r///b///j///P///j///j///f///f///f///z///n///3///////3///n/ +//r///v///n///v///////7///////f///3///z///3///r///j///nz2NDjxJvy06b+57z/ +4rT847j52q/82a/93Kz73qT82qT526H83af94qz+26v+36/+57L/7bj/873/+cn//ND//+D/ +/+H//+r//+r//+///+n//+/9/+X//+T//+j//+z///H///T///X//+////L///D///P///X/ +//r///j///j///b///X///P///j///n///v///T///b///j///n///v///r///7///j///z/ +//n///////v///r///3///b///z///f///3///f///z///f///7///3///z///T///X///P/ +//P///r///j///r///3///r///v///L///H///j///7///z///7///r///7///7///z///b/ +//n///H///n///f///j///j///v///f///n///f///b///T///b//+z///T//+j///P///D/ +/+7//+///d61b2dyWE9tW0huWExpW0h2WlBMT0BGQUFIa16JqaOHpq2Boad9oaF8mKJ6mZ9/ +nqSDrKiJpq92pad9j59xlJiEmJ9mkptYjZhai5hVjpVakpJfkJFYkpZajpBYjY1Si5NcjpVX +kI9Zio5Yi5JSkI9ciZRRg41ZjpZVio1hjpVWjpNWiJdVkJNTjZVaiI1ZipVRjI9QhY5QgYdQ +gYZShYhMfYhRiYhRhpBSf4tNgIlWgYhRgIVPfoVMeIBPe4BQd3xHd3pQeoZDeIBQd4JEeX9P +d4JDd35PdX9Ad4BTdnpFdHlQdHtFen9Id39KdX1JeH9LdoNMc3tKeH1Gd3xHbXtAcndHcHlC +bmxLbnlEaW5AUFw7Pjs5PTo5Pz46Qy86Pjw5QzY+Rj03PjI9Pzw8QDU/SD1WVD9lYElzak59 +blCJd1mIe1eYe1+Yg2Kgf1+ZgVqsj2O6nXHGqXLLqn3GqXbDnnqvimTGqnHHnna6mHOsg2Kq +hGahdVmngVabeF+WcFWbgVDo8q////////////////////////j///z///7///////////f/ +///9//f9//P///n///n///31/+77/+r///34//Ds/9z6/e7z9+3l6Nb5//L7//P1//n///76 +/+/z9+fw/Oz8/+bv/e37//T9//7///Hy//X8//f9//v///z///v7//T+//n7//H+//n9//7/ +//X8//j///7///f3+e7o793Od3o/VEpcfohcfYtnf5VlhZZpiphmgpVqhZVtg5tyhZFARkpA +REU/UlhIU2BJXGZKXWpJWGpOVmZLW2NKU2RDWWFIUmZEU19SWmlFW2ZKWmxOWGpSYG9Mb3R3 +nZ99laSBlKd2jqF2i5lpiJRsh5NqhZVkgJJrhI1oipt3ipp0jZh3l56Eo6pkc4dSZHNNWWdI +VGZNaW9yiplzjKCFm6lpcolVdXDD4MrEycaKnZqYrJ5/eXpmamFpfm+szKvd7dbo+uLq9uTk +8dzz/+f6/+jt8eLh9t/3/+z4/+zy/O3t+eT5/+3///j9//L6/er9/+////T///T9//H8//D/ +//f///f///X///T///v//+////n///j///j///n///v///z///n///v///n///r///z///n/ +//v///f///////z///7///////j///n///3///////3///b///7/9O/gwbLhvo/y06b65bb8 +7b3+58D/6bT/57X54LP516v326D+5LT/5rn75LX/5rb/7r7/8rz/77r/9cn/9r/988j99cT9 ++cf08bvv7rbw/ND9/9b//+X//+z//+7//+z///v///b///v///v///////v///////3///// +//3///7///////3///////7///////3///3///v///3///v///7///z///////v///z///3/ +//7///r///r///////3///7///7///////7///////z///////3///////z///3///r///v/ +//b///z///b///b///f///r///j///n///j///////7///7///v///////////7///f///v/ +//j///b///X///T///X///z///T///z///j///z///P///b///T//+/9+tzy/+P9/+7//+j/ +/+v799y2jXSpcl+aa0ylc1iifVijemGKX1BIVF9SfG6RqrCFpKyFoap5nqWCna6KsbGjwsOM +pLF9nah7naGDnaCCnapljpVgj5xdkp5akZ1YlZpaj5hWjpJWj5VWkJdWi5VZj5RSjY9ak5dZ +kpFhkplTjZJfjppRjJJajpRVjY1ajZhSi5BUjZZSiI5SjJRajZRVi49Rh5BMi5BLgohNg4xQ +foZOf4NOgY5SiY1ShpJRhpFPhpBUgYtJgYdMeIJCdHxOdoRBc31Ld4Q/en5QdoJHeoBMdIJE +eINOfYVFd35JeX9Kf4JIe3xJdoFLeoROe4RFeYBPeX1Fdn1Ldn1Hcn1JdIRFdn9FdYFDb29G +dYBFZXE/VmE3QT82QDs7REQ7Qzc4PT47Qzg5QD86QTk5Qj48RDY/RDtTTz5gXU9qYk5yak6B +c1OPfF+af2abiGWmgWWtiming2K0lGnCpnjNrIDKpH2/qHfCkHCwiWi5j2q3imutiGWwiGeg +d1uYeFqifV6aeFmZgFXl+a7///7///n///3///////////////////z///////3///////z/ +//z///////v///39//b5/+7+//X7//fr+uXb+9Pn+9jk9dr1/+75//T9//f1/eTz/+76+ej0 +/e/+//34/+////z3//j9//bx+ev+/vz////5//T9//r///7///f5//b+//7///v0/+/z//X+ +//z7//Dx7+jr9ur9//zuh5VET1BefoJpepBphZVxi5pmhpVqg5FkhpRvh5NshppKTlAzPj47 +R09BWGFKV2ZEWGZOV2FDWFxNWGdFUmJKVmBFVGNKWWVMYGVOV2tMWWpOXGlKY2xke412m6aH +n6x4mqZ+kp53hplqi5ZrgpJqfpFlgJJug5NrjZd5jp1zi516l6aKrLB2epNPYm9MWHFKVWZP +V2pfgIF4i5p4lJ5+gpNbh3bF3s/Gzs6Qmp6wuqmglaJ0cGxvcmOUspLR4sfV49Db69Ph9drv +++Tq9+Hg7dzk8d3u/Obs/ePl8t/m9dr7/+zy/+vx/Obu/uP8/+/2/+79/+3v/eb4/+79/+z/ +/+/8/+7///D///T///D///D///H///H///X///P9//X///D//+////j///b///P///f///j/ +//r///f///////r///////D///3///T///////z///z///7///b34uTYs6Phu5PozZz13K34 +4bL96Lv+5br72q7716f646v/6b795bn/7bf/8cD/9ML/8sX/8b3/7r7/8rv/9L3/9cT/8Mn/ +5rv22a3046r7+s///+D//+z///P///n///b///n///7///7///7///n///3///7///////// +//3///z///3///r///////r///7///////////3///3///7///z///z///v///////r///3/ +//7///////////////////////7///////3///////7///////z///v///7///z///z///n/ +//v///n///b///z///v///v///n///v///X///n///v///3///f///7///b///n///v///7/ +//H///v///P///j///X///n///j///v///v///n///T///j///D9/OX5/uX79uHi+dTx69zk +0rm6lXK2nGi+mGq/qHC9n3i3mXCmempPZ11khoGCr6icr7SOs7GbsbWVsLWUsbeFsq+Hp7F3 +mqtzmZ2BnKVxkJ1blpVhk5pYlJxXjJxUlJtXjppVjI9ZjpVXipJXiJROjJZajpRVkI9Zi5FW +kY1Vi5NTj4xWi5RUh5BViZNSjZZPiJFUi4tSjZRVkJdXkJJUh5FMh41RiZBUh5BUf4pRg4ZL +fIlJfoNPhIRRg4hKgodWg4hJfIFRfoNDd4JPeoNFd3xNc3xBc35Ne39JdX5IfH5Mc35Men9J +coBHd39Ec4NLe35IeH9GeoRQeYJMfH1LdH5EbntEdHlIcYBNcIFLcoRKdXxKdH5HcGpJcHxC +ZWpCUGA2Pzk1Pzg6PzY6PzQ9PTM7QzlBQDs0QDU7Qzs4PjdBPzlGUTxnXUdsZkx5a1N/b1SR +fFqai2mZfWqmjGStjmyxkmi5kWq+n3DFqXrCl3K9onK8lnG4k2q8ona7m3KshWSthWGphF+n +gl6aeFuLZ1uNcU7U5aD+//P///7///3///j///T///////////r///////L///z///////z/ +//////37//T9//b6/+39//v6//bw/+3q+97t9ef7/vLo8OL3//L8//z///v9//r+//z///H1 +/+zy+eTw/Ov6//n///z///77//P9//z////7//P7//z///nz//H5//D8//P5//H9/fT4//D+ +//v///7////u9urdjptFUkxif4tphZRyjp1vhJdtf5JsgZBjhpNwiZ1ohpVOVVw6SD4/RkxJ +UldEWVpOXF5EVVtHVVpHWmFPV2JDWmJPWmRJWWRVXm5FWGRSYG9TbHFic4R1lJd+mqGDpqh/ +oKl8lKN2jJ1yhplvipdwh5hngZVqhpFng5N2kJ58k6J5l6GLqa6Cl6FYZHRPYmxPXG1HWWFS +anVljpF+lqN0gY5vkH/G4s/N1cuOoZ62ybTAxMCQiYR0bWZ4hXOmxqXD2cPG18LP48Xj7tXR +2sjM2MLN4svk8NrU4tDR4MnS49Ho99rg69bZ69He8Nrx+eDr9+Xj7dnh8Nvs+tvv/+L3/+X0 +/+r1/eT3/+j5/+b//+r///D//+7//+7//+n+/+3//+v//+z4/+f9/+j//+j9/+j8/+n8/+r/ +//T///T///j///j///L///j///T///T///n///j///j///v///H03tvcwZfduJHhw5Hw1aT0 +26b826r12qr92aX75qn+5bH97LP967b/8bb/9sD/88b/8rr/9cT/9r7/9MP/9bv/9cD/88H/ +7cH/8LT/77v/7bv/+MX//9r//+j///X///P///f///j///3///z///////r///////v///3/ +//////////z///z///z///z///n///3///7///z///////////////7///////3///////// +//3///7///z///7///z///////7///////3///////r///7///z///////3///////7///n/ +//7///z///////n///z///7///j///v///z///3///P///7///j///z///v///r///T///7/ +//T///P+/+r8/+r///H///X///j///b///j///D///n///D///T+/uvp587b2sTLxay+pXzD +om/DoW+6lmu8omy1oG29mXOtiHFbWmBggnyVtbugubexysehvLias72Jq62Lp66Cpa54j6h7 +kZt1lpVajpFclZllkZxcj5dekZlfl5JbjpNakZNajpdakZFXjpVVipFTj5VYjpJXjY9jkZJN +jphci45Ui45UioxNhYdViYlWkJNYjYtSiJZVi5BXjY9UiZNYiJNRiZBUiZJPhZFTg5BLfYZK +fopKfoVNfYZLfoZRgX1OfoJQfoRNfYhJeIBJeoZHc3ZGeYFLen5Gd4FMeHtHeYJKdXtHeYFG +eYJIeIJReXxHeoBNe4BOe3pOeX9Gd31KdntIc3pHdHxNeoBLdX5FdHxLcYBCa2xDb3dAY2c8 +R0s4QTU4PTU8QDg1Pzw+Qzc7QTs6QDk4PzU4QTY9Qzs6RDRPSD1fX0JyZUp2bEuGblqKfVKc +gWOahF6uk2WukWivimisk2PBmXC9lG3HnnW7jmuzjGbAmm+1jGitjGebdFyefFioiV+ufF2M +aVSGaUied1Hl6q////z///b///////b///////////////////////7///////r///z+//r+ +/+////r///z///T2/+7p+N/W7tPb8cb7//rx+ujj8Nj7+fLy++n9//r09+nz/u/+//D1+/L8 +/u////z///v0/+v6//z5//n9//Hz/eX4/PL2/+z6//b5//b7//3///v///77//Pz//T8/+/9 +//b///f///zrp7ZATUpifYhlgZh7jaBnhJVlh5Vtf5RnhZNwgplpiZRlYnE/Qzw6Rk07TVBP +Vl9FVWNJTWJFUWJJUGNOU2JPVmRIWGNSWWlOXGdQX2pTX3BjeoNngpCGnamQrrmAoauJprF/ +m6Z0kaB3iJZxiJVrhJRhgJNrh5VqgZN2jp57laKKoK2MrLOLobBdZ3pRW29FYWxOVGdHXWhm +gIlzlqF3gpRzmIjQ4NTJ082Pnai+4cfZ5tqzsLJ4c3N0dmiGnoa30LnL0MTF07/K4MXa5dLZ +3tPE1cXZ58/h6tni5tbZ59HZ4c7n9tnu8N3b7tnn79Po+d3r8+Xt9uHt9eHp99/1/+L9/+/7 +/+79//D1+eT5/+b+/+n9/+z5/+f6/+b9/+f//+n///P//+7//+3//+j///T///L///j///D/ +//P///D///b//+7///T//+3///P///P///H///X///j///L///P449rewqnavZLexJLp05vy +1aPx2Kn40aT22qT94K7/5a7+7bX+7rj/9cD/88D/8ML/8r7/88H/9cX/+cL/88T/8sf/9b7/ +9sX/8Lz/98f/9sn/9s3+68b+/9D///H///P///H///3///n///v///j///////r///7///z/ +//7///3///z///3///n///////3///////r///////7///////3///////////////////// +//7///////3///z///7///z///7///z///7///f///////z///7///z///7///7///7///7/ +//3///////////////z///7///z///7///v///////////////f///r///v///r///T///n/ +//L//+7//+r///T///X///X///b///n//+////T///H///P9/uP9/ufy4cq5rIq+pXTIonm9 +onW/pHi9l2m+onK9lmunjm9cYVZbgXqPr66Ztbeew8Kgur6ZtLqLp6t6maV+lKB8oKt9oa1n +kJpml5pblpZhkpdalplhlqFZjpNYjZ9VjZVXipNPjZJVkJlVkJVYjJRQj5BYi5RRjY9YiY5V +io1Pholai5NOhYlOiY9Si45WjpFYj5RNjJNajphXipZWiZZSiY5RiJNRiItYhIpNgohQf4tK +foVQfotLfodOfIhEf35TgYtJeIFNfohMe4NGcoBLeX5FdYBMen9BdX9Od35JeYJLfYZIeIFK +doFNeIBJc3xIcHpFeHxLdH9HeH5MeYBDeHtQcn1Edn1Md4JBd4FNeoBAb2tQZnNBTVk+QkA4 +PDc2PTY4RDo5Pzc4QDo8QzlAPjo4Ojo/PTY/Qzk+QzVJST1iWEdtZE90a09+bFKHdFWWfmCc +gWOliWaujmatjWqtj127nHLKpm7AmXqpfGutj1zAo3O+nXO3kG6rhGaof2Oad1ubeVuLYlOJ +ak2beVfa5Zn9//T///n///////////////z////////5//b9//H8//b9/+3///b7//X+//L/ +//////z///v////7//vt/+vq/9ro/OPk6t7j8tj2/+70/fXx/O/0//X+/vv////7//f7//H9 +//v9//f+//35/fLu/fH7/vz///////////39//j5//z///////v///j+/vn///////39//7y +/e39/+7crbRKTE5efopykaRvh5pmh5plfpRsf5NqhZpyiphwi59wgIg9Q0k+SEc+TFBGUldC +TlJKTlxIV15NW2dFWGNMV2dFXGNPW25LWmVRYnJRa3Vle4xrg5mDqbGSq7aEoqyGoK99naWB +kZpzip10h5dpgZJshZFrh5FsgJN3kJ99mqqKo62ApamJoq1caH1SX29GX3FOXG5AUmNXdXht +iplzdYx4oY3K4dPG0cyOmqLA1sPg6tfW0s+Xj4p2dWlzfm+rxqbW6tHg59nJ1sPd6s3f6Nnc +39DQ587o9djv9ujv9N7h5Nre8NT1/uf1/Oby8ePr+dr9/+/+/+z//+/2/Ofy++X+/+j//+7/ +//X9/ur//+n5/+f//+3//+7///H///L///f///z///3///3///3///z///z///v///r///z/ +//X///7///X///f///r///j///j///X///b///r///z///f///f69ePo0cPavZfZv47fw5Hl +z5rs1Z/43KL44bD94rT/4bT/7rb/8MP/8ML/7sP/77f/8sb/77//9b7/9sT/9sL/+cn/98T/ +9Mb/+cT/+8T//cX/9cr97L3+6rr8/cD//+P///H///b///r///3///z///3///z///7///// +//7///r///v///z///////////3///n///////////////7///////////////z///////7/ +//////z///////v///////////////r///////7///z///////7///////////////////7/ +//7///z///7///3///v///v///7///v///7///v///7///f///7///r///j///j///n///T/ +//D//+3///P///H///b///L///T//+j///f+/+/5/+v7/ub4/d/NtJ6+nHXFpnLDn2vBpW3I +mXS8mGi9nXG/oGS2kXZzYV1Tg3mYt62XtsCVtrWNs7d/iZmEnqh6l6SCpaKNpLBvkpthjZZW +lJdakaBgkpNdlpthlJlVk5pikZRZkpRckJVQkpFajZZWjZdgj5BUjJJZiJRYi5FZk5ZRjJRS +iJFQhotLgItSg4lUh5FViZFRiJJUjJNSkJRajpZRipBUio1UipJYiJBRhYxSgYpRgIdPgohP +gIVPeoRPhYtNf4lKfodPfIZGgYpLdn1FeoJJen5JfIJMd39Lf4BNgIhLgIFQeoNGd3pVeIRF +dXxKcIBFdXpQfIVHen1Jc35Jc3tMdH5IcXxKcH1JcX1LdH5HdHlGZ2lGVFs5PkQ9QDw5Pjs4 +QDY6QDw5RDlAPT05QDRDPj04PzJAPj85QDs+RD5ETD1lWEprZkxtYkqAd1OReF6OdV+afmGv +kmiwiXKxiWaihWOzlmu/lG+5k2qxg2GtiGO0lGyxjmmvg2ewhWGtgmajfFufelmQcVSSbVSU +dlXb4Z3+//T///////////////////////3///3///b///////////////////////38//L2 +/fHt/+f6/+/5//T3//Pt++Xq8uXm89/s/eX+//zm/eTz+u31//X9//fx//T9//7///v+++3y +//D+//j1//r////9//H3//Py/+30//v////7/+/1/e7z/fH8//31/fL0++z7/+30//H///b1 +/+3mxNBGS0ZhgYhviZlxiJ5mhZdpiJpqhJd0ip1shZl0j6J3kJ1MS1o8Rj4/Skg9R0tCSEpI +R1E+U1lJWmdNWmJQWGVNWGpKYnFTYG5SZHJUcX9piY9tiZttiJmIpq1/oLCGoa2Co6eGmKB2 +j6B6iJhphJhwhJRyhZhkhJBsjJSCnqWDoqp9nKp7lqJdcYdSYmxPaHFMWm5GUmVNXG5mhI9s +eYiYxa7Q4tfK1dGWr6nG28jk8tzh7N7GvbiAf3xwc2aDl4DL37zg89ns7d7Q4M/p893r8+Tb +4NTe9djz/Or0++rw9ePX6NDq+eH+//D9/fDq8eH1/+T9//P///P5//H2/eb1/OT6/+f//+r4 +/uz///H///X///T///z///X///f///T///z///v///3///v///z///z///////////7///z/ +//v///X///z///7///7///////3///3///3///3///n///z///v//+/++Onp2M/cwqrTuI3b +wZLqzZ/tzJr226X53a/33av757L65q/967j/88L/8cL/9bn/88b/9cb/9sL/9cP/9MP/9L3/ +/Mr//s3/+NH/+8n/+cb/7sX/5Lj52Kzt6LH6/sv///L///b///z///b///7///f///3///r/ +//3///v///7///7///////z///7///v///////7///z///////7///z///3///3///////z/ +//////7///7///////7///////////v///////////7///////////n///////v///7///7/ +//////////7///3///n///////v///z///z///////7///v///7///z///v///r///j//+j/ +//L//+z///X///L///b///f9/+j//+v9/uX1/d3s7tLbrJm/o3TKp3TMp2vGrHe8l228nnS8 +nGW8nXbBlm63k3CFZ2dUe3iXsLGSsraarLuKoq19pKF8oKqAoqmDrLN+jZpak5pej5hZkJpZ +kZhdkphbkphYkJVXjphWjZJXjJRZjZNWiZJfipdTkJhfjpZWkZNalJpWkJpXjJVYj5BYiJBW +h49Tgo5MgopZiIdMgIlSh4lPhJJWhopTh5VVi5ZRkpRbkJhUiJNZg5FRg41Ph41MgYdUf5JF +goVQg4tOgotOfpBEeYFLfYRMd4FJfIBHfoNJeYVHd35Pe4RLfIdPeoZOd4JCc35Kc31HeoBK +d4BJdnxHfYRPd4hHeX9MdoJGdn1IcX1EdnhLcntJc3tKbHc9XF4/QEo0Qjc9Pjw2QTk6QDw2 +Qjs9QDs6QTk/QDk+P0E9RDw9QTpCQjs+QjxER0FbV0liWE9uZ0t+c1SUfl6SfWGcgV6qkGi2 +knCuiG+ig2GshGG5lGi9lne4k3G+kW6uiWmxhmSwimC1hmqlgF2pfV+deF6KalSNa1WYelje +3Zj///r///7///3///////z///////////z///////f///v///v8///+//T///////r9///y +/+v4//Hy/+nk+ujf+tH6/+31/+r1+u3///b+//z///Py//Dy/+76/+/5/+7j9+P9/fz5+/H4 +/vb9//r///r0//j///b///7///f9//T9//b///7///////////////z//////+7x++jx8uXZ +zcxOTkpcg4lqhJpuh51sgZdqh5hwhZhziZh0iJxtjp+AkqV6c4ZAQkQ8QUNBS0w/SEtBSExA +SE5KV1xKWmRSXGpJXGtVY3JKYm1SXG5PaG9qgo9eiY1/kKGFqquPprR+oax+lqeBn6eBjqB2 +jJhziphshpZsiZRzhZFsiJR7mqCDmqd7nZlue41XanpNYnBPbXZTZ3lKWGVIV2hXd3hndoKq +zLbT4dTBzMeWq6m94MTt+OHw9OPk3t2vn6GFhnx0fWyProvG38Lc7tXe6dbj79bw/uXu8OPW +39Hk89r0/ePr9eHg7NXi8dfx/+T7/+3s897u9uLx/+P2/+jq/eDs9+Do99j6++X+//P///b/ +//f///j///n///v///3///r///z///X///n///j///////r///7///3///3///7///3///// +//f///z///v///////v///z///n///////X///z///z///////T///n///X//uv55t3cvLDX +upLavInlxY/l0Jbu05ry1p/23qj+563/8rf/7bb/87T/9MH/9Lz/9Mf/8r7/9sX/98T//M// +/8v//cn/+tL/+8H/+cX/+cf/7cH/5bb417Lt4qb5/8v//+T///D///L///L///D///b///v/ +//n///r///T///r///j///z///r///7///////////7///3///v///3///////7///////// +//3///////////////3///3///////3///z///z///////3///////v///////v///v///n/ +//z///3///3///////z///////z///////////z///////j///r///z///r///n///D//+7/ +/+7//+7///X//+7+//X6/936/ujl5czf7MvQw5fTr3fLsHnRrH3Op3nGoHG6mG/BmWy4l2++ +om+1mW28lnCQamZdgnCKwLSVrriOsLOKkp+DrKt+jpyHr7CKo61pk5lgkZdcjZlijZlhlJVa +kZhik5ZSko9Xkpthk5pcjJJYj5NNi5JUj5JXjpJWio9VjZRbjJZWj5FVi5FQipBXipRRjI1T +hpNNgoxRgpFKhoVRiIpSiJFUjpRTiJRWjJRTjZRdi5RejJRQho5SiZBTiItVhI9OipBTg4xR +gohMeYFLe35KfIdQfYdKfH5QfoRKfHxPeX5Dc35Ren5Ge4JNeoZJeINQd4BGeHtJd3xGc35N +eHtNe4BId3lLdHxEcn1IcX9FcXlIcnhIdHtLcntDcnVCTFU9QEA2PDc9PDs4PTE9Pzs4QS4+ +Qjs9QDY/QT89RDg6QDs8Rzg8RT1CRjpASTZdV0ZYVEZwYkx4cFGKdlecf1ungmSki1y1kG2t +hGangl2qjF26mG+5lXHJo3fCoHSwfWWxjWazkGurf2eieV2bblWYb1iYaVWFaE2belnh04// +//////v///z///z////////9//b9//j///////z///////32/+7///r+//L+//T1/un+//T9 +//vu9enm9d/m/Njo++H1/+rt+ens++Pw/ff6/vb///359+33/fj6//f9//H5//n///79//n5 +//T+//z///39//X+//X///77//n+//z///n4//n+//P69/P2//D8//f///76//j///vn3thM +T1BUc4JuiJRqiZVxhplriZ9vi5lyi6B6ipprkKSCmKJ8jp9PUlg+Pj0+R0ZBRlE+R0RERUs7 +TU1OUWNNW2pUWGpKZnVKYG9NYW5QZHNabn5hio2Opq6Dn6WIq7N+oKt9nauBmKR7kaR2jJp1 +h5luipVqg5RshJRwjJWAlaOKoKpteYdZdH9YaXxKX2lUanxfc4dNXW9DTl9PY2xfdXy207zJ +39PM082ToKC80rvf79bq9+vs8uLHzceemZiCgHR9jHejvaW6yrXK3cbR5NPf7N3Z5tDW5c7U +59Hg79ri8Njb5Njf6tTl8trW68nZ7M3j9Njm7Nrk7NPs9d74/+T8/+z///L///T8//X///L/ +//X///r///v///3///f///z///f///n///r///z///n///////////z///n///7///////f/ +//z///7///7///v///////7///7///v///////3///////b///v///v///P///H+9unlz7nS +t5LYtYbbuI3fvo7jxYXuzZjx2Jv95Kr+6rD/67z/6rn/7Lr/76//8bj/+cf//cX//c7//c7/ ++cn/9sf/9sj/+cX/+8n/+cr/9cP/88r93rX2zanr06Tw87jx9b/6/sz//+f///T///P///r/ +//n///j///b///v///v///r///v///////////r///////z///////z///7///7///r///// +//3///3///z///z///z///7///z///7///n///z///7///j///z///7///7///////v///z/ +//r///z///////7///v///j///////7///////7///z///r///v///b///H///D//+3///D/ +//H//+3//+j+/+j49d/j4srNwqPFsIjTsITRvX7buITRp3POqXjGomrJmXG8nGq/m2i3lm3A +lXCumW6baGdZcWWMtbGTpa+Rs7FzmJOFnaR1p6OXub6AnKVlkpldj5Jbj5pbl5Zjk5pajZJb +kpdRkZJbj5VakpNfkJBQi45Yj5JWkJFikZtVjJBbjZVXi4taipZSi5JOh5BMiY1UhItPipFW +h4pOf4hFgYlNhYdSjJBZi5RYjpRVjpRQjY5Sh49ThY5Oh5BXh49Uio1ShY9PhYlRgolMgIdS +eIdJfYJPeIRJfIBPdYhKfIBJe4VJeXxLe4JJd4BKd35KdoJMdH5MdYJKeoFOeoFJeX9LeoRG +dX5FdntJdX5IeHxKeIBIdoBKc3xGdntMbntCXWVDQUk0PjdAPzkvOzY8PTo1QDg/RTk7QTw9 +RD09Qjk3QTg7Pzc8Qjg7QTs7QDZDRztTTUBdU0ZrZEp8Z06LgVidgGOjhWiqkGOtjHGsj2aq +hGWqhVqwhm63m2LAq3W9knGyiWi8k2azi2u5imOxhmenfF2kg1yhgGKbd1+aeVvh2JH///j/ +//////////////f8/+39//z///////////v////+///+//r////7//P///n///////nu+ezt ++uLw/+/q/Nrt9+Pk9d/k8t38//L9//X2++fh59Tz/fT///7///r///z9/+30//P8//7///Pt +/Of5//v///H1+/P0/u31/vL9//Xz/+76//v7//f7//n7//r1/e3w/Oz+//v///Du6N9QTUdb +dn1sg5Nkhphugpdsi5ptiZZpjZ15jKV0k519mKV1j5xugI4/REM5REQ/REc9S0k/RUg6SUtH +VlxIWmZRXXBPZG1canRWcHxTaXVQYXJok5J/mKiGn6iHqa+LoaiDnqqCm6Z5kaBwjpt2iZxt +i5ZuhZdlhY5uhZV3lKB/lJtodoJVaXNRY21JXGpOa3hieIRNY3RIWWVJVmVafHe62cLR4tTO +2tWWnqSvybPf8Nfq+eDy+ubj69fFx7+Rjoh+fnWEnYSouaK1xa/G07/J07vG1r7J2MDM2MLQ +2sXQ4MjM4MbT4sXK073GyrbO1rna6M7r+OD2/en5/uT6/+v//+7///L9/+79//D///T//+z/ +//j///r///n///3///X///L///L///f///j///z///3///v///n///r///////3///T///3/ +//z///r///z///v///////////j///v///v///z///b///////3///7///T///3///D88uHi +zb/Vs5vOsYDOrnzRt33mzIz23aL74ar847H/5bT/7bL/7bP/7rv/9MH//Mn/+sr/+8L//Mf/ ++cn/+cn/+sT/+sX/+8n/+8r/97//9b3/9cT+5rb10qbxwJvTqXvRwY7V5J/1/9f+/+H///D/ +//T///L///j///b///n///3///r///3///v///z///r///3///j///3///j///////7///3/ +//z///7///3///7///n///v///3///7///3///r///v///3///////r///z///v///v///7/ +//n///v///n///z///7///7///j///3///7///j///f///b///X///L//+n///H//+v///L/ +/+7+/+j7/eLZ4cXOtJnGsX3Uu4Hcv3zXtH3UsnzPqHTMpHS+o3K+l2S2km3ApnC7nW6+k2+x +lG+dbmZWaXCAqpiOrbGQoKl0np+AmJ2EmqCLnahljZFblJJklJ1YkJZYkpNZkZNglpZNj5Ja +kZNdl5ZcjZdZk5Ngk5pZjpBXi5BOjJFgk5dQjY9gjZZSiZFYiZBLiYxTio9TipNXjY1LiIxO +e4VJeHtNfoRKhoJZho5KiY9WiZBSipJWjZRQh45WiZBRio5UiZRNiYxXh45RioxSg45JfYNL +f4NMe4RJfINEeoFLfYVMeIFEeX9KdoJHeYFIdX9Md4JJfYdKdn9Hb3dMdX5Hdn1Nd35Ie39L +doBEd3xMdoNDeHpPdX1Gc3xMdX5DY21BRE81QDc1Pjc5PzcxOjc4Pjo+PzdAQz44RTg/PTk2 +QTZBQTc9QDw6Qzw/Qjw8Qz5BRj1JUj5jWkZqZkyAb1aGeVSXglujh1+ujGqhjGmyimugimDC +km26k2u/kWy4gmTAmWi+lG63i2m4h2m0h2O2iWapf2OcdVmfc1iTbVeVd1Tb0Yj9/+3+/+// +//////////////z///////////z///H///j9//T////////+//v+//H///f9//nv9+b5//Lx +//Dk+Nfv/Ofq8OHh6df////59+/2/vT+//7///Hv+uj7/fD6//D+//7///////////////fx +//H8//b9//7////////////////9//Xx/PD+//z///////////////////359uxZTk9Yd4Bv +g5dyipxyi55xiJpyh590jJt3j59+lKV2lKl4j6Z5malmXm09QUJEQ0c+Sk1JRks6RVBPT1lJ +WGpKWm1QXnRXZ3Zbb3xQaHJUXnVoi42LpqyIpa2MqbWKo7GIn6h7laJ8jp17j6B2i5dzippy +gpRrf5BpgpN2i556lqBtdpFVX21KZXJSXG5XaXpicYRVZnlPUmc/TlpcfXa81MbI29LE2Myg +oa6gva7Y6tft+eXv9ebh7tzm6di+sbGJgoB6gXaZrJC5yLXX4sra5NHN1svGyrjEz7q8yLTJ +zbrQ0sPU38fz8uLl59jv9d33/er6/+v8/+79//D///P7/+////P///H+/+7//+////H///P/ +//b///j///j///T///b///j///X///v///b///j///b///n///////7///////D///3///z/ +//7///r///z///7///////v///////7///z///X///7///j///z///f///z///n///j//PL4 +4NjgvLDCn4XBnnbbvIPozpPu1ZT52qX85LD866z/6Lv/8bz/8r//+MT/+cz/9sX/98r/9b// ++cr/+cT/+Mz//Mv//df/+8P/+8n/+Mb/9cP/7r3/57P+3q70yqbhoIq1gXChn3HBypLX8rD4 +/9f//+n///L///L///b///v///z///7///3///v///7///3///3///z///7///j///z///// +//////////////////////////z///v///3///z///7///v///z///n///7///n///7///n/ +//7///j///7///f///3///z///7///3///n///3///X///L///P//+v//+7///b//+n//+z+ +/uLs79nQwae+k3nVvILXtYHgvHzZtH3XrXvSqHXTpHO9n3bAlGe7kGy9mG2tkmq1kWq4imyk +gGhla3Vkf36Rrbx5h5aClqSJqKGMpa9wipFVh49ci5Rdj5xdjZZhj5pXiJVYiY5akZBblZpe +k5VhjplTjI9fiJJakJhVjJVVjZdVjZRVjpFbhJdZjI1Xh45Th45UiJFUipFUiJBPgIhSf4xF +dYNGcXxGc3xReIJSgYNUiI5XiZFahoxSg41ShpFRgI9Rg49XiZBHho9Uh4hOg4hTe4ZPfoNN +fYpPfIdNeYJNfIVIeoNOfIJKeYBNeIFPeYRLcoJFd39NdH9EdHtMdn1HdHxMcX5GcXtScYFL +dX1PeIJJd39LdHZNcYFIZ3ZGSVVCQEE3QDc5Pzs8PTg4Pzk3PDdBPDs4PjlDPTw5QDE+Pzs4 +QDhDQTw6QDlCPT43PzlFQD9MTT9nV0hsX0qEa1OOeVmcg2SngWijhF+jhWKohmewkGTAmm3C +lHjEn3fEl268knG8mXC/lG/Ai3Gwfmeygl+lfmaYb1qMZ1iCZUeOdFjXzYL///v///7///// +//////////////z////9/+/+//P+//b+//b7/+7+//v///L///v6//ny++n9//L2/vDq+Obg +9s31/Ovk8eHr9d71//Xt++r0//37//f4//P+//3///r///Tz/+r+//v///n++/b9/vv///// +//////nt/u34//P7//X9//z////////4+ez6//P///L6/vf///738OTe3tVSTU5QbntwhZhk +iZZ0hJxshpZvh5dzi5d6kqR0jqJ/kqtzlKKGorKMpqhiW3U4QD45P0U9Rkc4R05EUVFHVWRK +WWxRXm9NY3BRZW9SY3JLY3Buk5h6ipd6oaOUrLKQrLyNoLF6kaSFk6J6kp5+jKFsi5d8h5ht +iJd3i5hzj5aGlqNRbXlTYW1OXnBTWWpTaX5nfoxZZndKWGdDSlpLbGW0y8K/3dDO1tO0t7qn +xLPX8Nvt9eHu++rp8uPc6ODU1Muuo6WIh3p9iHiJoYSiw6akt5iFl4OEjHydoJPi59Hw++bj +7N/0+ub4++jk7db2++b7/+r9/+77/+f//+/7/+////H///L///b///L///b///P///P///r/ +//b///b//+////f///j///3///7///j///X///H///L///T///b///b///D///r///z///b/ +//f///P///X///r///f///7///v///n///j///3///r///r///v///z///r///////L//+n+ +++bt3NjNrZfFrH7YvYvjzY7316H75Kr85rX96rL/8Lz/873/88b/9Lr/9cf/+sT/9cH/+cP/ ++MP/+sf/+Mb/9sH/98r/+sP/+sP/88D/8Lv/9sP/77z/7bj93rb506Ttv57hqY3RkXvClXrI +047m77r7/9b//+D///n///b///z///r///////X///////3///////3///n///7///z///r/ +//7///7///7///////3///b///7///z///7///n///7///j///z///7///3///b///v///X/ +//v///r///j///3///f///////v///r///X///T//+v+/+78/+b//+7//+j//+v9/uvq58rW +xaPKr37iwIjewXrguY7avH3brHTSq3HRp33MqGnFl263j2W8jWi2kGa5mne7kGu7kGSmhmyH +eohzkZaYpa1wf4x9oZ6Ps7uJoq5kj5dViIxWh4xbjZVdkJhelJJak5ZbkIpWj5VikJZMkZlf +jI5XjJFWipBWkZlakI5ZjZZZj5JYjpVYjZJVho9Oio1ai5dVi5BZg4tOiYpZh49Sf4RMd4VH +cHxHbnZJeHdEcXlMgIVQg4lWholXg4pOhYpQg4pLgItRholNf4lNf4dPfodMe4dHe4lRfopM +fYRTfYpNe4NLeYJLfoJNeINJdntKeYZFeHxGcn5Fd31Len5Jen1KcX1Fc3pPdn5Nd39Pd4BM +cHlJdntLcntGanNDSFRBQ0I6Qj06Pzo4Pjk9OTs2PTdAPz44RD1EQT03RDZAQzo3RjpEQTs6 +PzhFQDY9PDhDQDk4QThORkJdVERuZUqBdleRfFyTfmOegWGegWCohmGtiWm0jGbAmmy/lnOx +i2a+mHG3jGy/lXOvhGSyh2enh2OxiWikgGOXbWCDaVCJZVSHdU7e0If///j///////////// +//////////////////////X///////////3///3////+//n+//n6//Xx/+n4/+/6//vm89rn +9drr8ODs8t3q+uby9+z3//Xt/+z7/PDu/+39//z1//L+//z5//H4//L9//z///////f8//X5 +//X+//7///z////8//H///v7//T89/X+/fD3/uv3/+/5//L5//Tx7+VTUFBacnhohpJyhp9q +jZd1jKBuiptyi59wj59/kqWCpKl+nKp+o6aEoqxsdIdOVlxCSD47R0g4Rk1BUlpHVl9GUmVM +XGpSWmpRWWtPW3BQWG1ykZRziZ1+m6aNq7GTrriKpKqEmah8laeGl6J3j56CkJ9ujpx6jJt4 +jZ6Bl6SCjJ1RYnNQW2xRX2tOXmhLZHBhcoZQZXJSW25BUVtQaWOwzL7D2c7R49W4wsKtwrTV +69Ds+ujx+urv9+3u9uHr7ufZ1cyyo6aSh4GAhHmHiHmGh3+Wjn+vsZ7a4M/r+N/v/Ofv++P9 +/+7y++Ln8N36/uz7//D9/+39//D///D///H///L//+////X7//T///T///j///n//+////L/ +//P//+////H///f///v///n+//X9/+j+/+3///T///v///b///v///X///7///n///r///n/ +//X///T///P///D///H///f///b///T///X///j///f///r///n///r///z///L//+v9/uf4 +8uLVvqLGoIXOtn/rzpbz36n84bL54qn96rj/8r3/9sP/9sb/78P/+sL/8sj/9Lr/9sf/9L// +9cb/+Lr/+MT/8rr/+cf/+sf/9sX/9br/98P/9MH/8Ln/8Lv/77z/4an83Kn205/2x6ruvpLp +wZziupPZzJL2+8v//+r///P///T///z///n///T///X///r///n///v///j///n///3///// +//7///r///v///z///7///n///j///T///7///j///3///r///7///////n///j///n///7/ +//X///v///z///z///j///v///L///H+/+3+/+n+/+j+/+r///P//+b9/+L28tPMu6C/p3vb +wobiwYLkvIDctHjctoPUo3bOpnHOpXHGoG3FmWa4kmK2jWCsjWS4j228lGy9kWyviWibpaqJ +paZ9hpdtgoZ/sa6drbdrjJxhiJBQiZFejIxRkJNWiI9RiY9ZjZVTh5NYhIpViZRVipZWi45b +ipNXhZJYkpRaio9QipBhjZdSj5Beio5QjY5Tgo5ViItXiodVh4tRgYhUio9UhY9Ofo1LcHxB +bHpJcHREcYBDfIFKgoVOgopPgYhUiJBNg4xLeohPgoZPe4dOfYZQd4VKe39NdohNgH1QfIdK +f4NRe4JHeHxKfH5HdH9LdH1Hdn9Idn1CeX5Kdn5Gcn1KcX5LdnpGdoFKd31MdX5DeHhJb3pG +c3NEbXI9TFVBPUA2Ozc9Ozo0PTZEPzg1PjRBQjk0Pzc9OTs7Qjc/QTg3QTZAPjs9PTlAPzo/ +QDlCOz4/Qj9BQTlHSj9gVEduZ0p/dVWNfFuXfGKfhWSjgmKmiF+xj2i4kmq6lW7FmHXBlHO1 +kme9imq4lWu5hG6simavfmeWelmccV+OaVGLY1GQZVGJa0/TyXb9//D///n///////z///z/ +///////////////////////////////2/+79//b8//f0//P7/ez6/vH///zv//Lc9dDi7+Hl +89rj8t35//n9//37/e3///z////5+enq9eT0/+z7//L6//j7//P///j///T9//z///X///z+ +//n///7///n9//r0//X+//f///3///////////vz/e70/fH///NcUl5KdHFxg5dsipp0i6Ju +jpt3k6J5kaJ9j6VzmqWCm6t7pKl/oauDnKZqfotYZ3JFQEs+S0s9S01FUFxEU2FIVGVLWGxK +YGxRY3BPY3BKXmxtj5d0ip1+mqKDn6aLrK6IoKyBnqmCmaeCmp9+kqN0j591ip56j5mInKGG +pquChZ9UZHFRXWtKXG1KWmlQZHVaboBUZ3pNWm5JUl9Ocm2uz7/D2dDQ3NW6uLqqyr3g7dvr +/OP1++js+uf2/ubw/Ob4+eTZ3NG9v7avt620vrO1wbLL2MHf5tXZ6tLp8t7l8t33/uf7/e3y +8+bp9+D8/ezz/uf6/+b//+3///L///L///D///P///P///T///D///T///L///b///P///L/ +/+j//+37/+P//+r9/+X///H///z///f///////7///r///////f///z///////3///3///n/ +//r///3///j///r///r///r///H///z///z///n///j///j///n///j///n//+3///b8++vb +vKzGsoTbwI3qzZvw0qD12qr94a7/8bz/8L//9ML/+8r/9Mb/9cb/98P/98L/9Mb/+8D/+Mz/ ++M3/+Mn/+r//98j/+8X/+8T/+cf/+MX/+MH/8L//8MP/8rn/7bv/7Lf/7bz/8LX/8br/7Lr/ +5bT42LDvypnq1qT5/NL//+T///L///X//+z///L///f///n///f///b///f///3///3///r/ +//z///f///r///v///n///b///////z///7///b///3///T///z///n///////j///n///j/ +//D///X///r///z///b///H//+////P///P//+n//+v+/+b7/uH28djWu6i/sXbasn/dxInr +v4DfvH/dtH3au4fXp3fLo3POo2i+nWi4lmi0j2CuiWe4j2m1lmu7mW27mmmsj2yWtquNqa5n +hYZslI+Io6qJn6ZkiY9VjI9ekZdYiY5alJdVhotVi5ZOhopYipZTj45YjpJal5dXj5ZZipRW +iI9Wi5JWjpBYipJYkI9YlJRTiY9VipJQjYtZh4tVhYZTh4hXiYtSi4tQhIxGg49QeIdDdnxK +cHpHdH1Pb31HfoVTgIRKfIBSgoZSgYhLfYVNeoFRfYZKeYJMeIFOeYNOe31Kdn1GenxReYJM +fIRPgIBOe4NMd35Md35Hd3hMdH1Kc3tLdXxFdHlFeX5Jcn1KcnhGd3pNd3xMcXlIZ3BHamlC +T1c+QT83QzxDQTw1Pjw5OTo3QTg9Pzs5QDk6Ozo5RDhAQjxEQTw7QDw1QDU9Qjg+Qjk9Pzo9 +Rzw/Pzk+RTZISz5lXEhsZkuAcFKEeluWgl+igWObgFmif2GrjGKyim60mGa+kW/AkmzBmXK+ +m3CzjGSzjWu2immngF6jeluYdFeTclmWblmQa1aJblbXy3j+//H///////////////////// +//////z///////7///n///////v///r///j///r2/+39//b///r5//Xm9d/j8s/s+Obk6tzc +5tTt/uHt++jz/u3+//f///n///z///T4//D7//P+//v9//n9//rx/+z7//z///v///r5//Hx +/+r4+/H8//P5//L7//j///v+//X+//n///z///7///ns6txiVGNQcGlwi5poi5d5jpxyjZt3 +jKBzkaF4k6l0jp54lJx2mJ2HmqeKpbNmfolXYGw8REc8TUg/S09DVVlNVl1CVlxIVF1IW2JL +ZG9RanhPW3Blf4lqgpJ9mZ6Cj6KOrbOKoK57maF+mKl+lZ99k6R4kZ93jp55j5uClqGPrLB6 +hJRTZHNKW2dLWmZPWGVQYXFacn5TantMWm1FUmBRd26vyb/T49HG1c+cq7CmxrTl89zv/OX1 +++nr/+L6/Ofn+uPz/ebx+ujs8t/d5NnA0cnV58/Z4tXl8tva6dTb6tTl9dv6/+r7//T2/+73 +++/7/ery++f1/u3///L///D///j//+////T///b///T//+v///H//+7//+73/ejs9tvr69Lz +9dv///D///j///n///n///z///n///r///v///v///3///X///3///v///7///r///7///z/ +//3///j///z///z///z///X///7///3///n///r///v///v///n///3//+3///T38N/ZwJXW +v43hw5Hy1aH63q385a3867f/8L3/8r//9Mj/+sj/98v/9cH/98P/+8f/9sT/98D/+L///Mb/ ++8f/+sj/+sL//Mr/+MT/+sD/+sv/+8j/9r3/9Mf/98L/98b/+Lr/+8f//Mr/+cX/+cf/8bv/ ++r7/9Mn/7cH+5b354q32+sL//97//+b//+3///b///f///n///f///j///T///r///z///7/ +//j///n///j///3///j///////T///f///X///3///b///3///n///X///X//+/9/+j//+n/ +/+3///T///j//+n///T///L///D+//D7/dzv8tft9c3e1bm5pYDMqn3Xt3/qyo3fw4nivX3b +tXbdtnbXsnvRr3nQo3TFn22+nWjElly5iWavjl2yjWq9lm68nHO9m2unjGSao5+BkqFrgoN6 +rKKOsap1jZRbh4xWkI1aiJNVj49bjJBUh4lYipJSiYxSj45dko1VkJNUio9gkpddjJNZkJFX +jZNWkJZXipZTjpFQh4xRiItVi45VhYdUh4pUiYlMiopRgIVNiIdYhYlSiIxUgolEeIBObnlG +c31Ldn1Kdn1MeoJSgYVRgIlPfYRNfIRGcnxEcnVEaXJCa21KbnJEcXZKdHRKd31NeX1PfYFK +e4BMeH9KdX1Hc3hIdXpNcHpOcXdJc39IdHVHdH1Ib3hEb3hObnNIb25GaGs/XFhGUFBMT0c+ +QUE6QjY8Pj05QDk8PDg4Pjg4Pjo9PTs8PTk/QT49QD1CQzs9QztAPz48QTo6QDg7PDlCQzo9 +Pzk9RTZFST1dVEJnX0x6bVCHblOVflKniGGOclmbemGoj2OqgGyojGO/kW63jm7ImXO2kGus +i2SogWawh2GuhmGogWWddV2jfVubdlqPblKBZVbNxG/+//f///r///7///////v///3///z6 +//X4//D+//L///n7//j9//X4/+z+//T6//Py/+X2/uvq++L3++jg9N/l+9bx/+/u/Ono9OT/ +//////v4/+zx//L6//H7//P9//j1+er4/fTz+ent/ufr8+Xw/+38//b///j///r///7///n/ +//7///n7//n+//z5//T///j7/fX7//b2/+35/+//+/hwXG5LZW9wk5h2k6Vzi5ZrkJ1zkZp3 +j594iJx1jZx6lqd/n6qHnq5zlZtiboNLW2M/SElESkw/TUxDUltFWGBPW2hEWWJMVWJIYW1Z +ZXdFY29hcH9PanhzmZiGra2ctbmHoayEm6Z/m6WElKB8laB3jJt5ipl1kZeDm6iWrbJ0f5JX +ZW9PY2dJXGNPV2ZNYnFbcYdUa3pMXG1MV2NUcW2p0cO+1svG1tOirrK81MPg8dfq++jw/eby ++ury/Obw+uP2++jv/efu9OLP4snR1MbS68/b6Nfl9dzs7t/K3sro99v9/+v4/+vu9+L1+uP2 +/ef3/+b8/+7///D//+////T///L///b///P//+///+n8/+/7/eP9/en+/eb9/+r//+v///T/ +//b///z///v///7///z///////r///////3///////T///z///7///v///////v///7///// +//z///7///////////b///z///f///v///f///////f///7///r///P//uznzrbfw5Lx16P1 +5bD847L85bT96bj/9MD/8cP/9cL/9cT/98n/9sf/9Lr/98j/+sP/9sL/9cH/9cv/9MH/+8r/ +/cP/+cr//cT//cv//8n//Mf//cX//8f/+cb/+8b/+sX/+8r//L7//cb//s//+cT/+MP//cb/ +/9H//8///c7/+8f/8cH95rzx4rPl57Lx/9H//+n//+3///D///D///v///f///3///f///n/ +//r///r///n///z///b///b///H///D///H///r///f///P///T///X///j//+3+/+v8/+b+ +/+n9/+X5/+P//+v//+P8/ufn6sHY4LvIzKK7onq3imbFoG3et3/ltYDgv3zcvYfgvH3htnzZ +rHXVsHbbqHXIn2jBm2u/mWu2kme1j2C0kWy2jWi9mXHAmXC5lWmqgWONp6GAiI52kpSMr6uB +mqdgjo1UiYpXj4tZjopYiIxTiJBTjI9ThIpRjZBbi4xTjo9YiotRjItVjIlTkI1YiJJUh45W +hY9MiIZWjotZiotaio9PjIxUho5QhYxTio5QgolUfodMh45Vf4ZKfolRe35Od4JJcn8+cXlK +c3tFentLeYNKfH9PeYRKeX9MbXtHaGtGYGVDZWVCZmlBZWNJYWdEamZFbHJAbXNHc3dGcn1I +eIFTdX1Idn1Md3hGb3RKbnBJcndFdXdLcHlCaGxLa2pDaWFLW1xBU0xfaFFpbFdVSUw3QzpA +Qjw3PjY9Pzc8QjE5Qzk3QDU8QDk2PzdBRjw9Pj05Qzk6QDw9RTk4QTM8PzQ+Qjc5Qzs/QDtE +QjpDSD1bVkZkX0p9aU+EdFKXfF6Zg12ZeFmihV+jfmmsjl+9k3S9mGy6kWvLq3TEmnSqh2S1 +kma7i2myhmOqhGOhd2CYe1mVcl6EY1WOdFjczIL+//j///////////////////////////j/ +//////b///f///P6//b6/+z+//n2/+P9//X9//H+//j09u7o+tvs++Pn9+Dk9+Hh89rp/N7o +9eb0/+7x9+jp8+L7/P3////7//Xt/er3/vX///j+//7////7//f0++zw/+z1//L9/vP9//z/ +///1++z5//T1/+/6/+/9//b///7///f2/+7r/+eQWndIZmJ0lJ51j6F5jqV0k6F9kKN7kKJ2 +kJ50kKJ3kqWFpayDoqxkdYdVaHVPXGg8SUpDSVE7TExDUFtLV1xMXmdOWWZIWGFUYm1NY3RT +a3lyf5BYZnNbgIWHrKyPrrqSpLF+naeFnaeAnaSClqR6k552j5t3kpuDnqaPp6trfItWZXNL +XmRNVWNHWGBQY3BUbXtbanxMZG9GWWJbe3KoxLi1zci0y8Cet7fG3sXj89/s+uXv++3y/+fw +//Hz/ury++bz+eXP3s7O3sTV4tbc5djS2svm9Nnr+OLd5NnU5c7e9Nfh9Nrk7trw+Obz/On4 +/+v5/+/4/+v6/+f8/+z//+78/+n8/+z7/uf0/ur6/+f//+3///D///T///T///n///v///3/ +//j///////3///r///z///r///z///z///z///n///3///v///r///v///z///z///////z/ +//////z///3///f///3///////z///v///r///////z///7//+zx58/m0J/w2Kj05ar87r39 +77v977n87LX/8cf/8sb/9MP/+cT/+Mr/9s3/+8///Mz/+sr/+cX/+8f/+8b/98//+8X/+8X/ +/sn/+sb//cX//dL//9D/+8f//8n//s///sr//s7//sf//9H//sz//M3//Mn//cv//Mz//sT/ +/8j//9D//tH//sn//dL/78T716jYt5KquIe12qPG5afh/8z5/+r///L//+////X///D///n/ +//X///v///n//+////b///b///D///H///j///X///H///T///X//+3+//T3/N3x9dTg5sze +8czn8tLn7cTQxKKvnniogWelgluvkWbFomTcvIDduXzkwoPiwn3ruIjZt3vbvH3at37Ts3bU +qHHLqm/En2i9kWO3k2a2jGCri2Wukly1kmO4n2+8nG29l2eYgGZqgHdbfoOLqqiOpqd0iZZR +hItahYxUh4hVhIhPiYpXiolQi5FTio5PhY1RiIdai49Ri4pViY5RiIdViItQiopWjI5Oh4Nb +iopVjY1eiYxOiYdYiotOiY1Tio1ThYZZh4lOholUg4dSgIJPgoNMgopLdn5FdXtGc3pCdX1K +c3pId3xPdXxFdHpNb3Q/YWY/Wl9BWltEXWA7XldCYl0+ZFhAY188YVtCZWNCb2xLeHhIdXxF +c3hGc3ZPdXdMcnhLcXVLcHRGaGxKa2tBY2VEXFlLVU9naFGHgGKBh2F3cl9fVldCRD44QTg7 +RDs4QzZDQj40RDc7Ozg4RDlCRD80Qjc+QT43QDlARjw7Qjk9RT09Rj49QzY9Qzw/QD5CRjtH +TT9TV0VsYkZzZk58cVeOfVeiflubhl2vjm6sjmC/nm28nnG8lHO0k2vHpni+lnOxh22mhmi1 +i2uqiGa6jWqqf2ebcVmZbleXbFeZd1rQxnf7/+n///////7///////3///H///v////9//L/ +//z8//f+//L9//P////////+//j+//b7//X6/u7y+unt/+jk/dXx+e3n7+Lh6dX5+e7w/vr5 +//j///7z//ny8+Xm9Ov9/v7///z////////5/fH6//z///////3///b9//7///f7//f///71 +//Hz+e7p8d3u+On1/ebv+uvx/en2//Hs8eekZ29DYWBnjZlzjZ10jZ11kJ59kqF4j6J6iZx0 +i552kKKCnaqNqbFnbYdYYHFBVWRGSk45RkZET0w/TldOU11HVWNSXGVKWGlSYWZOY29ZdoJ9 +hJJWa3lZc4FtjJmWs7ePqrCDoa59oqeCn6d7l6N+kZx0jZp8kqCHp7GOn6pod4VYZGpLVGVE +Ul9GWWtRX25Ta3pedYRPZHlJV2FRcG2lvrmrwrqks6yfva/R383e8Nny/OTn+ujr+ebs+uby +/efq+eLe5Nq2w7zO38re7t3h8tvg59vd79jr+eHl6uLV4dTK3cza69Tj9d79/+z3/ebu+uPs +++bt+eL0/ub9/+v///P///P///H5/+r//+v///H///X///X///n///j///r///n///v///z/ +//3///r///j///z///b///v///7///z///b///3///z///f///n///z///z///////3///j/ +//z///v///n///v///3///b///v///j///n///r///X07s7n1aTt2Kfx4a766bj867j/7Lv+ +8bv+8b3/9Mb/9MP/9cj//cj/+M//+cn//cz/+Mb/+c3/+s7/98f/98X//cz//M7//Mf//Mj/ +/NH//cn//9T//s///cr/+s3/+8b//s7/+8v//dT//9P/+cr//c7/+Mb/+9D/+s3/+9D//9L/ +/9H//tD//tH//9D/+sr/8sL52LDSwKW8tZGvr46io4Gz16Xg99L5/+P//+b///f//+////X/ +/+////b///T///b//+////T///b///D+/+j9/+f///D//+///+r+/uL499vl5MDn383Tzq28 +nYevimm1hGm6hFzEjmfTnmzVtHjetHzZtXXhuYbiwn3is37cuoPar3/Ss3TUrH7MpG3Jnm7P +oWm/m2i9kmizlma1j2WsiGK1j2a4nmzCnG+9oG20jmSUfWlTXldgj4abqK+Bmpxhg4ZVh4dQ +ho1Vho5OiI1Wg4pUiIhZiY5SiItXh4dXhYdTg5FRi4dYgoxVf4ZTh4xTiYhQiIpKiIdSg4tP +h41WiohNhIpVgYlOhYhYg41Rg4hVgItLfoNQgIhKhIZSf4tHfYNRfYJFcoFJcH1FdHpKdYFF +cnpNc3VFanBAY2dAWmFBV1s/VVxFV1g+Vlw6W1g/W1tCWWQ8XF0+W18+aGFCa3BIb3RJbG9D +bG9Ga3FEbGlKa29EZGhLZmM9XFhLUVNlcVGCf2eBg2SIgmiAgGV3cmVlYllERUU3QD04Pzo4 +Pzw2PDM3QTk6QTg9QTo9QTk5Qzc8QjY0QDU8PTs3Pzc7QTc4QDVDPjw1PjhDQjo3QTRGQz5Q +T0RqWkxybU+Fb1aYgVuojmahg2Sqimeuk2W2kGu7kmyyiGith2DCoHG7l3K6mHO8jXSlfWek +fV2uh2WsjWiog2KkgWCgemKfflzQynn9//b////////////////////////////////+/vP+ +//f///z///////////j///b///z///n4//Hw+urv+/Ha8NLg79jq9OXl9t36//T4/u/+//j7 +//X2/+z6//f///Hs/+j5+uzt9u30/vL9//3//+/w//P9//v7//f+//X///j9//P9//j///z/ +//v3//T5//P9//X6//T+//z///n///7kb4RDX2Bui5h3jKF0kKR5lJ56laN6kJ55iaB4j556 +jKN+oqiCqqxobYtLYnBDSmBBSE0/SVE6R00+SldFU2BFVWRPV2pKWmdOYGxPZnFgho92iplf +cINkh4iFpKyOsbaMn7J/naaJnql+m6h/kqJ8jZ56jZx9maWNrLODjp9ncYFTX2pMVmZMVWRJ +WGpJYW9adIFfc4VTZXRJWGdRXWObwayzxL+bq6ukv6zP5c3p9OHz++j5/Ozx++Xy9uji8Nze +5tjD0ce3wbfW587p897p+OTx+uPg69rr9+Po7Nve6tfe6NXX4c3n9tr1+uj0/ujz+enz/eLx +9+Hu+OD9/+v9/+v///H///P///H///T///L///v///j///z///n///v///n///v///v///v/ +//r///n///3///////z///////////j///z///r///3///j///v///3///////n///7///v/ +//////P///z///v///r///f///j///j///n459Xr2K7w2aP126f647D967b98bj/8b//9sX/ +9ML/9MX/98r/+ND//87/+tD/+tD//cz/+s3/+cP/+c3//cX/+87/+83//dH//c7//cn/+tX/ +/Mz//9H//sz//M///tT/98z//8j/+tL//cv//9T//tb//tb/+8z//sn//9P/+tD//tP//8// +/tP//9L//c///Mn/9cL96bnWvqWtqYqoqYSqonqkrIS4yaPh78jx+9/2/+H//vH//+b//+// +/+////T///L///T+//L9++f189Tn7tDz+tr7/+X//+z8++Hw6MzctaTAnoOzh3ytjmjBlGvN +snLbt4DVrnThtX7auX3dtoDduHzot37hvHrjtYDZsXHdrH3WrnTZsH3SqXXXpHvLp23KmXDA +nWu8kG6yjGquiVysi2C0i2a6k2i/pHK8nGuyjmqTf2ZcYV1ompGbqa9gf4hZgItPhoVWg41N +gYBRiZBJhodTgo9PgolSiI1Ph4tXh49Vh4xYjYpRgoZDgYdOgIlWiYtQgpFQgYtWgYhRgIJK +fIdOgoZPgolLhIdLgYJTfYZJgoVQgYhNf4FSgIhPfoJRdolFe35OdYVJcnlFbX1AbXJFc3dK +anI7YWVCXFw9W108X145amg+b3FBc3lDeHxIdntDeH5BcHQ+aG5DZnFDbW5Ja3FHb2pJa3A+ +aGtJanFBZGZIWmVDXlZea1VwgF6NiGiJhmmHg22BgGiBhWVsbl1sbl1JRko3Pzo5PDgxQDU4 +PzYyQDo9Pjc6Pzk4PzZAQTk9QDpBPj47PTQ7Qzo7QzZARUA5QzI9Qj5AQTRBQENBQzlPTUVr +X0d1ZlGAbVmSd1ehgmWnh2iph2enime8lG67mHK5iG+xjWTEmnLClW/BlGy+kHCvgmemfGGv +h2end2WieWGhemWacWCUdlzMxHv+//z9//T9//j///z///r///////j///////////////// +//////////jz/uv6/+n///z///Tv+u7w/+jk8+ff8M7m89/o9tz0/en2//Tx/fD0/vL+//z/ +///3/e/9/vn6//L+//7///////n5//r///z////3/+/6//X6//Lz/vL5//T1//f7/+/+//r9 +//v9//z///////X7//b9//jz8ObGc3NKWmRsh5V1jqV4jp5+lqN9oKiBlqF/mKN1maF9m6mI +qbCKpK1sdYxIXnFHT1tCS1VASU5ASUxDSlJBUFZET1lEVF9PVmpGXGlSWG9je4Ryh5WFoqiK +p62PrbObqbqFnKiIo6+An6mInaeAnaZ8kqV6kZ+Go6WFmKVyd4Zaa3lKX2xNVWRLWWRNWWdJ +XnBVbnlbc4BMandMW2tAXV+eu62xy8SprbGMr6jQ5drn9uHt9+fw++nt8+Xs9+Pk6tLK1MvZ +5tTD0sXY7dTv+ujv+OT6/+j4/+nx+uXh6djS5Mz0/ejv99/g7Njn9Nzw9d/o8Nru997x+9/6 +/+j8/+b+/+z///P///r///P///X///X///n///v///n///r///v///3///3///z///r///v/ +//3///7///3///7///7///////f///z///////z///z///7///r///z///j///////z///z/ +//b///3///r///r///T///r+/vLx3MTk2Kby3aX44a/757X977z/68D/9Mb/88b/9Mf/9cf/ +8cH/9Mn/9MT/+M3/+tP/+8z/+c3/9sb//sv//Mz//c3//dX//87//9D//8r//9D//9L//tP/ +/8v//9L//9D//tb//sn//9P//ND//M7//s7//9X//9L//tf//9H//tb//M3//c7//83//Mz/ +/s7//c3/+87/+cn96rXr4bHTxZy+uJ6yqpKinYaTi3aTj3fBq4S/lIPCv5jb1rzd27Ht7M/7 +/tj7+ubs4c7byLDe3L3i1MLZyLPCmI22moHLrpjFk3fDrXjPtHvbtXrWrHTbs3zkw4Xqw4ro +xovgvIjdtXfjtoPauXzjvIrcuH3drIHZtITcsH3XsH/Xp3zUr37IoW7EoXTFoGzCom65kGS5 +j3Gyi2WuiWSti2m7lmi5mHC8nHG2knSsjWmdgW9Qb2FwhY12jI9fgYdVhYZagIxUhYRYipFV +f4JQhohNgoZNh4tPgYRWholTgYtFg4lShJBRiIpVgIdQhIpRfo1RiYpMgo1MgIZKfIFQgodR +gIlWgYtRgolYgoNKgYVVgYREfINTfoVKgItRfYNLe35KfH9FdH5Kd4FFc3pEbG9Ha3BFY2tD +X2VAXVxCamU9d3lJf4FBe4NOe39NfYlJgItNg4ZNgYlGd4JCcnxHa3RIaWxFbXBHaWhDZWdL +YmFOZ1tnflqKkGmOjnOTi3CRhWqChmmLg2qBgWSIhWl1fmF5eGRcX088QD03PTc8Pz89Qj06 +QDo9QTo+Qzw+QDs9REA6RD9APzw/RDg4QDxFQTo7Qjk+Rjk8Pzk/RTw7RD1ERT1NTkNlX0Z0 +Y1B/cVWWfGKWel6limOrk2+tima1l220jmq0jmq7km/FonbGonTBk3XBmnG0kW6vg2SofWSp +i2KmfWWbdmCTc2GbfFu4tWr9//L///////z///r///3///////77//X+//v///b////9//n/ +//n6//T////////3/O/t/Ob8//T7//fk8+Xj+9Tz/On4+/Dn7d37//b89+/1/vT4//X09eT1 +/vb6/fb+//j5+/Lr9un0+fP0++31/u75//P+//3////////////7//j///v////3//f7//f/ +//X3++v+//z////////////3jY1EVVpqjZNxjJ51j557l6p3jqJ5k6Z6l6J9k6h6lqOLqbWP +o6lodYdSXmlCRlFBSE87R0lBRkpCSExJSlZATVNPUV1IWWFTXGpQWXBqe4dmhpGDpamUsbmS +qbaSqLqHpK2VpLSBn6eElat/mKF/k6N+laaEmqhrdYlkb39TZ3NQWGxLWWdKV2dKVW1IX25V +YnhYaXpZZHpQWGZDWGGivKy4zMeprbB+kZS4yb7Q5dnk8+Tl9OHj7Nzd8NvZ4tnQ387p7dvR +2c3f79fr8+Hv/er1/+j4/+74/ej1+eXW4dPd6M/6/Ojv+Oji7Nft+OT4/Of6/+z//+////T9 +//T///L///n///r///X///r///T///n///j///3///f///j///v///z///j///r///r///r/ +//z///z///z///v///z///X///r///z///r///v///7///v///////3///n///3///b///j/ +//v///7///f//+/36tjs1rLo1KL226z146z75LX96bb/7bz/7cD/8rv/87//9cr/9cn/88b/ +9cL/98v/977/+cz//M7//c//+cb/+cn//cr//tD/+sn//sr//8///tT//dD//NX/+87//Mv/ +/s7//dH//Mr//dX//83//ND//dL//8v//9X//9X//dP//dD//tj/+tb//8X//9f//Mz/+8v/ ++8n/98n/8Lv32q3SvZGadnCCfmiLgGuCfmeEeGeKj2Po3J/02arvy5jnyIzjvYDatobZr37U +uI7Zt3zduYvXs4HTrH/Wuojbv4TarXvbuX3luoXlwYbqw5DpxorrwIrhuH/mxY3qwYXrw5Ph +tIDdtn7duYHhvIDdsXjZr3zYrnvOsH3Vr3bKrHXNlW7DoGfImXDEnG29kHa7k2e2kG61imKp +iWWximKujmXJmHO4lm6/mW61km2yi2udiGuAjJBzkpZec3hSgIRWe4JRfX9SfohSfopNf4NS +eohJf4JSgotKgYRVfYdPg4ROgYtMh4FZiIhNf4hQf4ZMf4tUe4pSgoNTf4VPgIVUeoZPfoVP +fIFJfIBPgIlOf4JNeYBFeXxOen1OgHtQeIFFeXpKeX9CeH1LcoFCbHFAZ3RAZGlIYWU9bV9F +f3xKhYBXeX5Lfn9ShIlOfodSgYdOgIlPe4JLcXtDa3BEZG1FZGRHYWFJW1pPaFZuiF+NlWyX +lGqck3SVlHaRkXGOi3KQjmiQh2uFhWZ7emd9gmSFf2l6fWNzamM7Qzw7OTwzPzo5QT02QTk8 +Pzo8Qjw9RTs7PDg9QTs9QjdAQDw8OTdAQT04Qjo9Qz87Qzs/Qjo+RD1EQkBFSj1iWklrY0qF +cVeOfVideWSgimO0lG2tkWu0j2q5imm+jW+9lWq/lm6+lG28kXG3im6+mXO3jW+jfmmcdVyh +eF6Ub16MbVqHbVCvpmz6/+D////////////////9//n///////////v///r///v////////+ +//v+//L9//f6//H3//P5/+3z/Ozm9t3d9M7q9OPm7+Hf6tb1//H3/fL3/vL5//T9//X1+ez6 +/+76/u77//n5//v////5+/H6//D1+/P3//D2+vP+//X1//P+/vb0/e/58ert/fP///j///v9 +//f+//z////9/+/u9uXdn5xFV1pqiJZyiZ11i550ipp4jaN3laGCkad7k6V/lKaIqrF9fphc +anhSZHJHRlFBR08/SlBESk09R01DSEtDVFVGTllGU2RTWGRJXGlvgZNndIeAl6ONrbSUrbaP +q7WRrreQprWJpayBlqiBlKh/mKR/k6SCmqd2h5pdan1ZZnZNX2xLU2pQV2ZLV2pTWW5MYHJU +YnNNX2xKUF1DTlR6m42rwrujtq5/hI6gt6nM3s/e7+Dq7+DY59bW39XDzMTV4MvZ4dXV2tXY +6tTw+ub1+uny+ubw+ejl6+Hf6Nzj69bf6dbn9tn9/+z//+33/+37/+3///P///f///L///T/ +//P///n///r///r///T///n///f///j///r///3///r///r///j///z///n///z///n///z/ +//r///r///////r///P///7///r///z///n///j///n///////n///7///n///3///D///j/ +/vD26Nfv1K3x1aby2q3536/747T85bH/77T/8L7/9ML/9MT/9cf/8sH/88f/9ML/88b/8MH/ +88j/9cT/9sn/+sr/+cr/983/+sj//M3/+s7//9D//c3//dD//tH//9D//M3//tT//dH/+s// +/NH/+s3/+s3//c3//Nj//9L//9D//9r//9P//M7//tH//tj/9tD//9T/+tD//c//+Mr/9cf/ +8Lv+5rL02qzMt5mgoXCxrH+5nniahmaPgmKWg2Xc1Z/746z86qz83qX31aHx0pLyypvuyZLv +zZr0zJHpwpPsxIrlworqvofov4/rwYntxYfovX/qxovtwIvjwofotn7jvn/nwoPpu4HftHvg +uoXasnbZsX3Wsn3csH3QrHLYp3XPp27No3PEnWbEnm7CnGm/mHC1l2O1imiuhl2nhGKniFuu +jGy1lmu7lHC2kW+zj2yphWqmh2eLh3F9kJ6BnaJtdYBNeXxQdohKgX5OdYBPfH1YgIdPen5X +dodJfHtUe4JLfHxNeoJGgIJTfYNRfohUe4FOeIJReYBSeoFFdH9QfYRPgIdNe4BKd35KeIBN +gYBNfIRRen9LfH1PcnpFdHtSd31IdHhKdoNFeXlTcH5KaW5LanJFYmFMbGhVl3OEro6grpyS +oI6arIufrIaElnhpf2xhc2dRbWRZbGBWcGFadl1khlx4l2eOm3CaoXekoXadnHmennuZmXee +lXmXlnOYj3SRlnuWiHKPiWiMhGqAiG2Cgml9fmyDeWh1dWhJS0k/Pj09QD08Qz07Qjk8QDo2 +PThAPTg/PTxAQTs+Pzs/QDs+QD49Qjk/QDw9RDU/P0A/QzdDQz1ARDlJTERcVEVtYVSEb1CM +eVugg1uxk2epi2u1kWu9pHHHoXDAm3G6k23EmXC/lWvNn3PCmWy2hGqvg2argmKed2GUcVeM +cVqTaliKaVeklWD7/tn9//T///z///////z///////////////z///z///n///n///j///T+ +//T9//H5//T3/fD0/+j8//fv/+/n/9j2/ezr7+Xe7df////4/e3x/vT7//T+//T6//L7//H3 +/+7+//v///P1//D+//v////////////////3//fx//H///3///3///z2//X39ezx9en+/fL9 +//z///f2//P8//Dy4tZPWFRki4p6k515jqN5jaSAn6iCnaqDoKyAoqaPsLeClqJlaoFRZnFR +ZXJFWmZETlRASkk9SUpBR0tBRUc+S0pATk5JUV1MWGVSbnd3lZhhb35edoGHrKiXsLWPrLWL +pq6Dn6eGnauEnaSHnqd9nKR/mKF+k52AmaRwiZVaanxJYW9MXG5IWmdNW2hKYGdNaHNRZnNP +XWxKUF1GTlRYdG2swre2xbmHlJyOqprH2cbX5tDS3NDF2sS9y8GzxLzN3MnN2MjQ5c7d8tnt +9eLm9eDg7dvP4M/r+dv7/+j8/+33/+b9/+v//+3///H9/+z///L///X//+7///P///P///H/ +//X///b///X///j///n///b///b///j///3///v///3///n///j///X///r///r///3///3/ +//z///j///z///P///z///n///r///f///j///f///v///T///z///b//+7478vu3bft16Hy +26ry4aT23bH34Kz95rX77bP/87//9sL/9MT/9Ln/78H/9b7/98T/9sb/8cr/7sD/88H/77/8 +77f/+ML/987/9sT/9sT/+cH/+MT/9b7/+cn/+c3/+83//c///s7//M///cf//M3//Mz//9H/ +/dD//dH//cf/+cv//c7//83//sz/+87//M3/+cL/+8b/+Mj//Mf/+8n/9sT/8cH86rD86a37 +7rnnxZnZzJno46+6knpkW05iWVJcVEdnbFihmm3s26f85qv82qb51pnw0pbyzZTmyovqvovq +yIzrwYrowojptoTjw4HitYXmwX/qyo/it3zfvYbmwn/mvYXmuobjuIPisX3aun3bt3vau33b +r3bOqHfSq3fMp3PPpXfMoHDPoXC/mmy9mGS9kmS6mGaxi2apg1mkgV6hfV2qj2OujGK0jGe3 +lme1jmiqkmingmihgmCdg2RbXmNmhod9mJuImqlWeHdSdXtLenxQfXtNfINRfHtLe39SfH9K +fIFPdX1Le3lNdXtJfXxRfYVKenxQeoJFf35UeohFentQeXpFeHxTdntIe3tSfn5LdHlKc3dR +enVOe3tSeX1IeHtMcHJGdnNNdXlMd3tKcnVKcW1cmXmHqYqZs4ubooiaqIG2t5a4xJq9tpyr +soyytI2yr4esroytroOrrIemrIKzq4iqrYSor4asp4aop4Omo4KkoH6enXmgonupoXyfnnqe +m3ial3aRlnGPjGyGh2iMlXCLjXWFhG18imiAg2p+h2ZzZGM4QDtBQjk3QzZDRD47QzhBRTlA +Qj08Pzc3RTg8RjpDQzs6RTlAQTw9RTtCRDo7QTxGQTtDSDtCST1HSUFPUUFoZUt4b0+QfFmr +jl6xj3GghGC8nm7Em22/oXbImXK6jnDGom/PpXfHnXDCl3i1jm61jWq4h2urhGeogWWcfV2Q +bFeIb1anj2P8/sn////////////////////////3//b///j////8//P7//H///f///j////6 +//n8//T///z////8//bp/eXl9tbg7Nbe6dfl8Njy/+rw/vD0//Tx/+31/vT///v///X0/+v3 +//T8//n9//n///n9//n5//f7//T+//v5//P+//P9//f8//3////1++7x+O3+//7////0//P+ +//b9//j9//Xq39NNU1Viiot4jaJ0i5d2j6B9m6d6lqaBo6iKqbKQpq+Ck6BgdYRTaXpNX21S +VGU/S1FFR089SUlASU1ASUM+SEtJS1BBU1hKVWNTbnlxgJdic4Zlg5ORrbWKpa6VrLiEp62I +nKh7laKBlaJ7lqGBl6Z8kqF/kaN4kaOHo6hsfoxabXtMZm9QX25NW2lMV2pPXG1TZGxNWW9G +TFpGTlJLZGeiw7C+x8KZl6F6kYmsvLK1zL/Q4tHK0sm/0cHH08HJ3MTZ3M/I2MzU38/Q38rY +4tLb69bj8Nr8/+z//+z//+/0/On//+z9/+/+/+76/+r///D///P+/+3///T///P///X///P/ +//b///D///z///b///3///b///z///b///v///n///3///n///z///r///v///j///b///3/ +//j///f///H///r///r///n///T///n///f///P///L//uf459Tt2K/u1aLr2qj13rDy4K72 +4K725LH847P95rv/57X77Lb/8sD/8L3/88P/7bz/8L//8L7/8cL/8cL/8sb/7Lb/6rj/8sD/ +8cH/87//9cH/8sP/9sf/77n/+Mf/+s7/+tD/+M//9cX/+83/9tD//Mj//Mz//c///cr//cz/ +/Mr//tD/+sr/+8r//c//+sn//sb/9Mr/+8T/8sv/9MD/87v/9sH/78H+7Lj76bD76an74LPj +ypDy+83x3st9XVlbTklSTExaUUdeVk+HlXHY25n536z63KLw0pPyypTmx4zqxI/jvoTkt4Xd +t4DkwYniunzdtX7gwIPkvIriwYHjs4DeuoHktX7iwYLfuH/gu4LcsG/VtHzUq3fWrXvNp3fI +p3bQpnHPqnbKoG/Hn3DHnm/Cl2e9jWqui2GxhWqliVuge2CZgVquiGmsimO2j2urkGm1kWqs +jGSuhF+nh2Klh2aIh3B4kp14kJx6l5yBoKZhb3tPdH9Ke3xQd4BNeYNLcX9PeHxKen1Rc4BJ +bnRSb35CdHhOc3xFeHxPdX9MeXZPdX1KcnFKc3pJcXlIc31IcXVKdHNNeHlNeXxPcXZNcnhK +dnpMcnNKb3NLb3BNb29QcnNNg3h9p46lt5ivsZmdo4uqrouvvZG8u5yvsY27tZGyuI+7sIuy +s421so2xs4+ssIKzsouurImspoSqqX2srIako4CkpIKlp4GjonyloXqfmnyjoXyfmn2Zl3uV +jnSIjm2PjXGOjnCPlXKVn3+PinWCiGuDh2t9hmt3aWNFQUI7Rjc3QjU7PTk7Rzw/QTs4QzRA +Qjk1QTg/Pjk5PjY9Pzk8QDc8PzhBRDw/QT1APz1ERD5ASTxDTDpZWkhsZEt9cVKRe1qdg16n +imuhhWO4nG/Iq3a/nHHLoHW7jXG8mXHFnHO8mXXCmHC1iWa7imuqhGWsf2afg16WcFiLaVWB +alGZh1v2/Ln7//L///H///r///r///T///X7//T///////v///////z///r////5+/T5/+b+ +//j8//f6/+r0/u3o+OPh/dPu+ev3/+3s7uP3//H8//nz/+b7//v0/e/5/vPx/+n3/u7y+On6 +//z9//X///j8//v7//v+//b+//v7//X///j9//n9//j6//v////7//v///P9//P+//X3//r/ +////////7+RQSklkgot2j6J6j6F1kKF/m6Z8naqCmKR3kp2Ioat9kqFkeYhSZXBOX2xHUWFA +SU1CSlE/SkpCSEw8SEVCSkc4SVBFSFNJUFtSbHNreIRddX97np6ZrLOLn6yKqaqInbCBl6N8 +kqKFmJ97lKKClqJ+kZ98kZx+k56Cl6SHqqyDlaNedYFWbHdQaWxHYHFMW21SXW1MXGVGT1s/ +UFJPW2SXuqTAzsWksq98h4qZsKK0wri+0cDE0MO7yru8xLrI3cPR3MzQ2M7P3Mvb69Tw9+Xq ++eDp++X4/+f///D1/+jw++f6/+zz+un3/+f///H///P8/+n9/+v///H///H///b///r///j/ +//L///X///j///X///X///f///r///n///f///f///f///n///n///n///b///f///z///r/ +//n///H///j///j///f///b///D///D6+uDt273p2KTu1KLx16fs1Z3u1Z/v2qfx26rz26f8 +4rH94qj84bH/5rX95rL/7Lj/67f/7Lv967T/67n/7br/8MX/6az/7rn86rT/6L3/9Lf/8sf/ +8b3/8r//8sL/9sT/9sL/98f/+M3/+Mn//Mn/98L/9sb/+cX/9sn//Mf//Mn//Mv/+M3/+8f/ ++8j/+Mz//Mn//c3/+8r/9MX/8r//+Mb/9MH/7bz/8b7/9Lj/7br+56j74a/63qnuzaXY0ZH8 +/uLdva9mUVBHRkBJSEVPTUhYU0OKmm3I0Y302aft0ZbtxI/qwojnvITiu4PdsoXfsIDduInh +wIjeuoHfsn7Zsn7Zu4Dfu4DdsIHeu4XiuIHcuH/ju4Pfs3nXtH7UtHTOrYHTpW7RrHjMnmnE +oW7Jnma/mm3EpGe9kWq/i2SuiWG4hWCifWCdfFmbgGGngl2uiWWrlmS1i2uukGuthmylhWGc +hWGif2GOd2Z9kpOEk6FwjZh0jph6l52Km6ZKeGxMdHRSdndRdH5Ob3dNc3tMc3dJbnZJdn9K +dHRIdXxMeHNEc3pKdHtFdnpNeXxLdXVKcXlFd3dMbXpDcXdMcHdQenNQc3pHb2tSbnVHcm9O +cndGc3BXfXh8m4SgvqCuv6Otr5OmrYm5vJvHxJ3DwZq7s5S1spC2spC0uZW4spG7tY61sIu5 +r5GssoiyrYyqrY20qYatq4CtqoeqqoSrqYSlpHWrqoyjoXymnYGjnHmenX+bmHmXjnaKiHSN +lnKSknaTj3mPkHaIl3ORk3iHhG+FhmyAhGl9dWJMRUM6QTQ8PjoxRDdDREE8QzhCQz01QTdE +Qj07QTlFQz43PzdIQjs+PzxBQTpAQDo/QT5DQj5ESD9HR0BQTkFsX0l9ck2VdlmXhV2wiWin +hmaulWq5mHCxim7CnnS5j2vGnHjFm2vAk3S7jGa8kXi2iGivhWqmemCbc12WcVuRcFl4YVKY +e1nv/L3///z///////////3///////3///////////b///r////9//r1++j1/ur///n////3 +/urx++Tq9uTe79Xe88vs9uHw9+bh6dj2//Lv/fH+//Pz/PT+/O/y/O79//35//P9//Dp9efv +++Xw++v0/vL6//P7//T+//L1//f9//f///v////3//D0/vP59+/4+e7s9eb9//r///3///v7 +//Hz6+NOTk1ggIV5kaJ5jZ52lqeClKF9oqyJpKx/n6aIpad4jJ1mbIFKX2tTW2xBTl1ESFQ/ +TUpBSlE+SUc6Rko3SEY9Sk5DTVFEU11GZXBlcYZpfox/oKOOrrSIna2Fn6eFna2GnKh/lKKG +maJ6kZx9lZ99kaB7kKB/lqF8l6GGnqqNqq2Zr7l4maFye4VZaXBSZXZRbG1VZXZKZGpMYmlF +Vlp+moumtrSera6QnZmbqaSsu7OsvrS+y7q/zbzD1L/S4MvN3cjY4tHT4Mzt+uD9/+vu8uTt +/OD3/ezv++b4++bt++H5+enk+N36/+f9/+////P///P///L///P///L///n///r///P///L/ +//f///X///b///b///f///7///f///f///X///z///j///f///b///v///T///v///T///r/ +/+v///z///L///T/+ufx5Mrr1LDnzp7ox5fozJry1afy2azx1KLt1KPy1qbt3KTw1aP21KX5 +3Kj+3Kb+5LX857D85Kr/57D/5K//6bP/7Lb/7Lz/9cT/8r3/8Lv/87r/8cX/8Lv/9ML/8b// +78L/87n/7sL/8sP/8rv/78D/77z/87//9sT/9sf/98T/+sz/+sr/9sn/+sb/+83/98r/+cv/ +9cX//83//sz//ND/+sj/8L//9b//873/7br/8bX/68H/5K7+4K774bD62qfiuonYwozr78a1 +golVSkNITEFISD9MVERyclWhtYLSyofszpbsyZDkuoTnvoXhvoPfs3/Urn/brX3Ysn7btYDd +sn/asHjbsnrauX3dtYPatnzgtX3ctX7drIDUrnjSqHbQqnzQqHXFpGzLonjOn2rHpG/DmWi9 +l2m+lGq+jWS0i2SxiF2ngFmgg1ugfFGZe1ebhVqnhWCsimWqimmnjWaoiWeZgmSYfmWZiWSJ +Z2RwlYd+iaFtkp58i6J2kKB6ip96naJecndKc3dKc3xIbnNJcXZOcHtKcXRKb3hKbnNFdHxJ +dH1Hc3VKdHREcHZLbHJIdXlOa3VDa3RKcnFFcXFJbHhCc2tOcHVLdG1Lb3RIdXBSint0r4Ob +w6KzxKy6vKawuJnDyJ3GxZ7Ev5vFuaG3uZW8u5CztY6ztZC7u466vZS7tI+wrYu1sJGwqoO1 +tYyoroexqIatqYGysIinpoCsqISnpoGsqX+np3qkoYCloH+eoXujln2Sj3aamnmQlX2XkXyT +kHKRjnSPl3GRkHSUlHyOiXWEhnWDgGx2cWNMQ0RCQT07PDQ9Qj06QTY/QUE7PzJAQDs7PDk+ +Qj09QDU7QzdGPzs6QjtBPjw+QDZCPT06QTVFRT5FSDtORUJoXkZ1ak+KdFmcf1mkg2Sph2O2 +mGyxhWqti2isjG+/m2rCn3XEmXPAlXK/iGmwiWivfWiriWSid2OedluVcVuQb1t5YlKLclbt ++6////j///3///f///b///////////v6//v5++f7/ufz/Of9//T///3////////5/u/v/eT9 +//b8//rr/ujh/NP19+jr8+Lo9tz6//X6+fLy/O/5/+/w++z9//X8//L6//P+//3///7////7 +//P9//7///n///7///v///79//X2/fH0/Ob+//7////5//T0//P///7///f0+ej1++zu9Obs +6t1PUExegIeAmaWDnK56laSCnqyJpq+Boa2AkqFnfpF6hY5TaHpPYmpIXGtVUFw4Sk9ITUw9 +TU5MRlE6S0tDR0o9TE9DUFNGUV5SbnZoe4tvhZOJp7KXsrWKn65+oKaCmqSBn6d/kKd/laCF +mKCEm6d+j6F/k6J8j6GAlqSDmaSJo66SsbWar7ybubmOqbZohZRheohgcX5acX1eaXVNaHNZ +Y3JmfHqNlZaKp5m6zrnG0cO9z73Q3s+/yrzO3MnQ29DS4M/b6dXU5NLr9t7u9uTf69jr++Hl +793r9d32+Of9/eX1/+v5/+f//+3//+///+7///L///j///H//+///+////T///b///L///H/ +//b///P///P///b///j///n///X///X///X///f///b///v///X///n///r///j///z//+f/ +/+z05srq0q3ix5nnwZPlwpTrwZHuzJr206n13qr637fw26H12Knw1p7y0qXvz5r10Jv53qP6 +3a762ar72qT81ab84Kf/6bj/6rX/8MH/88b/7cD/7Ln/7Lv/8cP/8b//77z/8Lr97bz+8L/9 +8cH97rr/67j/8rr/7r7/8bf/9MD/+8L/98P/9sL/+cn/9sX/9L//9cD/98r/9r//9sb/98X/ ++cn/9sL/+sb/98f+88T+88H/9bz/6Lr+67v96Lj636b415r+2qD106jSnniomXW4sYyObHRP +TURWa0xMS0Jkglbb8sL77NLk2KDvyZTiwYnet4zXsIHRqnvUsXnUrHvSqnbQqnnZrHvWsnvc +s37btH/bsYTatnnZq4DPsH7Rq33TrnrPrXbOoWrOqHTLpHLJqHLCnG3EnG7BnnC6nWO9kmq0 +l2C1kGutgl6mfmGegFacfmGde1Wdg2Ckh2CtkmWtimafgWelhWKNc2GCbVhrWVxmX1dkiIOE +mKF8m6J8kKR6kaB4kZR6i519lJ6Fk6FJaW5LcHtLbnlOcHVCbHBKcHBFdm5FbHJFc21QbHlG +cHJMcHdGcG9IbnVKbHBMdHdKcXdObnRNbnFLeHBNg3dZkXZ5rIiqx6i6ya2zu6Wyu5fHxZnN +1qjW06/MyaTIwKa3v5TAuZa6vZK+vJextoy9vZe7u5q9s4+vtpC1r4+1s4m3r4uur4y4ro2t +p4WyrIuvrYCtp4GpsISvpoClpn6spoKrqYGko3yenX6XlnaVo3aeo3qUn3uZnXqQlXmTkH2I +jW6OlXSUj3eVlXyLiXKJh298fWR5cGRNRUk9Pzs+Pzk9Qjo/RDlCQj49QDw8Pzg+RDs/QTs5 +QjhBQDw/PTk+Qjs6PzlHQEA6QzhLQkBBRD1LQ0JCST5oV0d3b0yOd1mgg2OphWahhGOzkGyu +hW62lWi5k2++mG3An3q8kWq+lXO+m3S9jm6vhWewh2Sbe1+ge1qcdV6Ob1OHaVyQdFDi9Kr9 +//H///r///////////////////////////3////////////////9//L9//X5//D9//Tx++rw +/Ojo/Ofd+NPq9+Dm8uHm8t/0+eb2/fHq9+v0/vT9//3///P4//f7/+3y/Or0+uvy++33+Ovr +++vw+enw/O/29+/y/fH+/vv///////3z//Dy/fH1/vv///X9//r7//f+//7///////f///Nd +UVddf3+Doax8nKqGnqt8oq6DnK2DpK6Ejp9edYZmc4BNYW9KY2xNVmdFT1pBSlM/SEw2SU9C +SUY6SU08SUk7SExCTVNBV11TeH1sipZwiZeCqK6Sp7SEpKqKn658mqiDlKZ5maGGlKV/maaB +laR2kKN8kqR7l6KBm6h8mqeBoqmIqq+Rrracu76evL6UsbqDnqpthpJkeYhfaXxWUmhQU2BV +YGaAooqlvLTW4s/J0sTG3MTY3c24zLjT28nL2crW4NDa5tLX4tLJ1MfO38vf6djs9t7r++Pr +8eLy/Of2/ur4++j5/ej9/+r+/+r///P///P///L///T//+////H//+7///P8/un///P///L/ +//b///L///j///X///r///j///X///X///n///b///b///T///T///T//+3z3tLnxrHlxZ7k +wZbiwJDnwYnozJHsxpfu0ZT21qn32qj74K714rHz1bDry5vqxZzpxJbnwZDswZbyypf30qH0 +0qL10J7316L52qn84qr/67b/7rn/9cn/78T96LX/7L3988L/77z66r3667n45bX957X67LL9 +8LX98bL/7rT87rf/7rr97rb/8rP/7Lf/77r/7rj/9b//9Mb/877/98T/8r//9sf/9cf/9sf/ +8r3/+cL+8L797b786bT96Lb55LP747D33Kr02aP33aPz3Kfx0abQpH+mhmeOf2SPi3pbXUdY +UlBPV0VVX0meuobZuZ7kxZXit4XSrILOrHfQqXjHrnPOqXvNpnDVrXvQqXfPqnvTrXvPqXnT +rXfOr3TRsHvPp3rMqHjHpnfOn3C8m3LBnmbEoW/Cn2nKnGi5mmvAk2a6k2y7lmq3jmixiGmo +hF6lgFubgFqVelubgFmegGGgg1megWaSeluNcmeAaFVoWVVST1JNUk1MeWxri4tykJd8k5l5 +lKJ9mqJ6l6F3j5twjJZ7kqJ6kqRcfHxFfnRRh39FhHdOfnpJh3ZZinZKh3lRj35TjoRak4BX +on1jooNcpoNtrYSDtouGvJGbw5mlwqGiqJijqJqospO7vJ3G1KLQ06XR1KfTzqzKwqLLyKHD +xpvFxJ6/wp++upi2vpPBu5e0tYy+u5fAu5C4tZS3uo67tpeysY6zsIm6t4+1t4qvto2trIey +sYqtq4aqq4SwroqlpIKpq4Gmon6bl36UnnWdpH2ipX6mpIOUnH6ck3qLjnaRknqMkneJj3OS +lXeTl3iMlnCHiW9/h253fWZrZV5DREI3PTwxPjc4PTg4RDc/QD40QTc5QDo6Qjo8QDo4Qzc3 +RDM4Qjw5Qzg9Q0A8QjdDQj88QzRBQkE+RThCSEJbU0R0a1KOeFuUfluwi2atkGm6lnGtjnGv +imm4m2rRonPIoHbGoHO+mG67jW+yiGyshmqkeGGhel2ee1+bdl2Ual2DZFKKdVbh/Kz///T/ +//b////////////////////+/+7+//j////////////7/fT7/+39//P5//Hw/OXz/ujx+urq +/eTe+NTi6dri99Xs9Or1//L4//X8//n///b7//D0/uz6//Pz/+76//H9//7////7//z8//T/ +//7////////9/+/8/+31/e/9/vH9//z////1//b9//r7//j8//f5+/L6++nu++zz8udXTlhb +hYl7lJt3jp96lqKIoK1/oqGCn6l3j5xsdYtPX3JPaHNMWmtLUmJJTlc8S1A/SUw8SUtBTE08 +S0g4Skw+VVZEVFtOYWxpfIp0jpmIp66Oq7GMrLKDoa6Dnah/kaF7l5yBkaJ6j5h/jZ58j5d3 +jZl1jZZ8kJyBlZ6FmaOIoKeIo62OqrCYtreju7+UsLaImqVqgothZnlRTl1HV1dOXl2Cqo2v +yLezw7rZ59DQ08nBzL/b59LAwL3E0MLG0cHH1b7U4MvV5NHf6dfd6tbs/OX1/+rv9+Xs9+Tu ++Ob7/OX1/uj//+v8/+7//+39/+79/+7///L8/+////D//+n///H//+n9/+////T///n///H/ +//f///P///r///f///P///b///T///f///X///T//+n34tjgxazjwpLgyI/kyZPmx4rnxpHq +z5vw0Zj62qT026r52qf626n42Kfz16f216Po0ZnqxJTmxpLnv4zbr37pvobtwovwwIjxx5rz +1Jj305342KT+46z+6LT+7rn/8MD/6bH75rH87rf/6bj65LD35Kz+6q3/6LL+47X85rH96K/8 +67b/6K7/6bP85rP/6Lj/7LD/6a//7Lr/77b/8bf/87n/9MT/87v/9cL97r//7br/7LH/7Lr/ +7bj+7rX646365LP75bH73rD13qnv1aTv0pnt0Jfv1KPu1aPeuI6kf2CBall+eFx+YFNdXE5S +VUZ0h1Ofk3vQtYrWrYTQonvJrHXLoHHDoWzLqHbLpHXJpXLNqHTNrYDHoXTFpXjHpXDLonvE +m23Hp3TMo3THmWnInHG/oWzCn23DmGnEn27CnWavl2bAlWywjmmvk2axkmGskGmki12piWid +gFmjflySglqcgGGPf1uNdGBzZlZpU1BZVk5afmB4pZeDpJl2jZd4kpd6jZx5mJl7k5yEm6F2 +l6aBl517naZ9mqN3maF7mqOCmp+xxqzI0bHK0bTC0q/FzrS4vZu6vaC6vJaxspWqs5LJwqm0 +sJSelXyFinCzrpahpoanrIWrsIa1u5DQ1KXa2rLS1KzT0qDS1KPMxJvR0J7UyqLKxqHHxZzD +xaDIw6G9vZrEv5a5tJDDuo69vZK9vJSzuZGztIy1tpW1rYe7s4y3sIm2tIuxsYawrIevtIe1 +r42prISkpYGcnHudoXqaonqYoXmeqoassIWmqIydoIKRknmNj3SVmnqXmX6QmXyUnXiVnX2S +mHWKi3WUknV+gmt6c2FpcFtJQkQ4Pzc7Pjw1QTM9RDg3RTc9QDg9Qjk/Pzc8QTc7Pzw9QT89 +QTs+Qzo+QDc/RT1BRTs+QzpDSDxNRDxBSkNWTz5tZk+IeFSUeV2lhmKrhGauiGaojWqnimey +jmXClXLJnHLBl3HDkm/DlHK4j2uxiGWmfmSfgWCcdFeTdleXcVeGalWLb1TT7KL///f///// +//////f///////r///v///////X///T+//H+//H///f///z+//z8//L5/vL2/+z3/vLk+ODg +9c76//Dy9eff8drt9Ojt/On5//35/e/z9+zs++v9+fTx/ur+//7u/vX1+ev9/vz///fx++vu +9OD9/vT8//z///v7//j6//X+//n///z19+72/vj///X9//7///////////Tu9OBdUmFYgX+N +n6x6oal7kqVzjp59lKl/m6V9kZ5fbHZQbnRVZ3VQYWpKWWRDS1NBS046SUg9TEtASUg8SkxC +SkpDUlhGT1tKYWxibXt1mpyKnqeAnKeMpK+AmKF+iZlviZh7iJh5lp6On6R2iJFxc35XZnFb +WmtjZW9rfH10hZN+lJyFoqmMpquYr7iat76NpLF8jJlrdoVNVWNOVlhMYWtvj3vBzsa9zMC8 +x8G918DI2MqxvbDEzcCzw7G7xb7DxrfA0MLS4crT4tTb49fi9Nvl9tzo9eLs+OTv+uTz+ufz +/eT8/+r9/+/8/+34/+n4/+z8/e38/+v///P///b//+////P//+/9//L///r///j///T///T/ +//P///n///j///L///X///r///T///P07dnixaTfwpHjv4/fwInmxZDkxZLowYznxI7z1KLu +1qf42aj20J720qTuwZfz1Zj10p/22KXr0qPkypfsxp7mv5PiuoLouYfpvobvz5buzZr00qD0 +zpn41Kb436T85Lf667T957f45K3636355a385LX84q7636j56rP857f85LH83a7+4ab66rD/ +4az84av/6K795bH957H97LT97bj+7Ln+8Lj/7Ln/7rT/7rz87rb/7Lr757H85rn656/+6rn6 +5K723q3x26fv4LHz1qjtz5/t0J7s05Pt0Zvq0Jnny5rWt4+whmuHbFhnZUp3dFyLjmWws5mN +emmPkGTJrnzIoHO+m22/mnG+m2rInnHBpG/MpXTIonLJonXAo3LLqHnLqnbLpnjJqHLDoW7H +pm/JqHLGpHPAm227mnC+m2+/nG26mXO/lmy1jmiwjmqti2ekiGaphmmnhmKnh2uXhVyif2CT +gFmUeGmKbVhrV1tZS0tKS01NTkhGVVFkgYp6kZiCmJt6lZ91kJl8kpd+maB8l5qAnqSFp595 +mKRwlaB7nqiGoqN4lZ+CmaGNtJnEzKrBzq3N07a+1K7Kzp/FxqbHxqPDv6PMzqrN17TZ2LrN +1aXT0KnBvJi+yZzJxqG3r5nBx5vS0qfQ0KjX1KjQzaLLyqXLyp/GzaTMwqDEw53AwJzHwZzD +wZm/vpu4v5PDvpy3uZC2sJC5tIuytYe1sIqwtpK7t4uztpK2r4u1rouytZS0r422rIalqIOf +o36fq4Ksro2lroucpIGVn3ufpYOfqYCfoYeNlnmZnHuaoHqfpH6bmnyPm3qUmXORlXePjneM +jXGLlm+Ef3JzdGR1dmVOTko9PDw1QTc8PjU0QDY7QTg4RDVDQDs1RTlBRTw9RDw+Pjw+QTk8 +RDg3QzZCQDw9Qj5GRjhGQD5GR0JGR0BSTEBqZE6Dc1WPe1mngmOkgGKsi2m5km2rf2ilhl69 +kGq5km7FnXa7mW6/knKsi22zgGejf2CXcFqLcVGYdFuLZlmHaFeSdVfZ5qH///n///j///z/ +//////////////////////////////////7///n9///9//L///n5/+z9//f///j1//fg+M/q ++uno993i7dz////7//Hx/Of3//j2//T///r8//H//+/3+/X0+/T0//H8//X+//z////s/efk +3sb6/e3z/u////3///v7//b9//35+/H9//X9//v9//j///n3+en8//T/9+tcUmRijYx7pKyK +qLB4lKV+mad4kqN9l6R6iJpbZnRSYnFLXGlGX2lFUV5DSlM8Sk1ARlI7R0c/SEw/SktDSlBB +WF5LV2RZhoaAkqJmeIyFkp6BkZ+AkZ56iJZsh5B3jpWEmZuKoaaFlZx1jJR6io1ydn1cUVlH +SE1JSU5MTFReVWFpenqGlZaPr6ybsLR9maNxi5ZmcH1MTllCVVNSXWKJrZjAzcS60bnT08mz +xbW7v7amuaqot6ixvbDD0L3Fy7nB08LQ4sTV4s/a58/l8tvm89vu9+Py/OXv9eLx+uH0+eTy +/+P4/ef3/+T7/uj1/+f+/+7+/+j///X///b///X///P///P///H///X///j///H///T///X/ +//P///T///T//+///+v+8+Dfy6jdu5TiwY7myJfrx5DmwIbryYvtyJXjvIPqxI/mzpjxzJ3x +zaP00KPzz53yxpTy1Jrv0KHu16fs1JzmxZHeupHmxI7mwobryZTxzZjyy5X0yI/ty5Hww5by +05j32ab02Kj55LP54af83q7156774K7336f536z55LD74Kr65az/5a3/47P94a/93K7446v/ +5ar/56384qz95rP96bH86a/+7bb76bL96bP96bf67LH87rj67rD86bz45a/767X456/226js +2KLx1KXrzJTtzJvpz5zn0Zzp0ZfjyZbevprWt4rJoHuefV6EbVZlY0tpa1N4dVx0Zl5nXlGT +lWPGnne4k2W/m3TAmWvCnnO+oGvLqnLLq3bKp3HHqHLLqnzKrHHLqXfJqXjEoXPAp26/pXHF +oHDBm2vKpXbKpXHDoXq9oWu8mW+3l2mxjGqsj2GtiWWrjGefgmOoh16jhGacfWGWfGGPcFZt +WlNdTklKS01JQ0VGVEhTiXhyfoFKaF55kpp6l5+Blp18jpl6kZZ5lI6Cjp9yjJJ7kpl+mpuA +n6R2mZp9nKR8mZ+InKeCm46rq4y2uJW7vpjCyJzGyZfY2LPd4rTe4Lrl4L3d47rh4rfg4bHV +yqu2q4yzuJC2sZSpp4O7y5vT1K7U06HZzKzLxKLSyqbKypzQx6DLxpnPx6bAxZjFwZvFxZjD +vpm7uZOwvJe9s5G7tYy3sou1tY29upK1tpSytI64toizs4+6q4qqp4anpH+dpH2krIarspGw +qY+WpIKeoX+Wpn2joYCdo3qXm4ecnX+dqIGdpIaZnoGVmX2QlnaTl3ySlHuJi3eOjHKHiXCL +km+DgWxxdWN1dWNgVFU9QThCQDo2PjVEQT02QDk9QDs2PzdBQTk3QjVCRD44QTRDPjw6Pzo+ +QzU9QjlCQjtCQzpAQztGR0BCR0BOSkRkXUh6bVGWhFqoiWSvjGe7nWu5lW+whV6ufWGxkGLE +m3LGlWvAkXXBmWu3hHGqfVufeWSRc1mPc1SRcluPcVKPbFZ8bFPQ55j9//L///n///b///// +//7///j///j+//X+//X///////z///v///////r///z6//T7//j4/+/8/+7m8t/c8srh693q +89rn9OP5+eby/vD4++ft/Ov6/vDt+e/+/v70/+7+//z///n+//7////2/+z09/Dt/OXk3Mzp +++////77//X5//f///v9/fXz++78//b09+j29+j3/fD///v9//Xy9OdeWmxegIN3k59/lqp9 +maiAm6eBn7B5fJBXYnRSYW9LXm5RWmpKWGRMV1xARVFESVFDTE5BSVI/TU1DSFI8SUxMYGZI +XWRtlJqAm6d7iKB3iZZ2iJVwh5N7hpR2jJN+kZmCipKAkJiBjZV6fIVpWmtjVlZiWU1MTkZD +R0NIQ0ZDREVOSkxNTVdoanOAk5GKnKh1h5Jqb4JFTlBKUVhRaWOSsJq4xLq3xLy4vrqsuK2t +tq2ns6Wps6enuKm/w7i/y77C0cTU4Mfa4s/h6dfj69bu997j7tno8+Dv9+Hz9eLu+eD2+eT1 +/+f//+7///H///D8/+n///L///f///f///T//+7///L///D///f///j///f///b///T///b/ +//f///H//eft4NLdwJzYupbkwIvuzJntzJXryZ3pw5DkwY/jvoXlvJLeuoHqxpnoxY7twZHo +y5Puz5vuypTr0J3r0ZnqzqLryZzfw5LhwZPdwpDbuIXhwozsz5jt1qPy0aHy0Jvrx5vy1J/5 +1p/21KL13af22qT2263836764qz847H13bH636n847b85q374a774K/84K774av83Kf546// +5rL75rH84a385LT96Lj847X137P04bD247X247H03q725LD03Kzz3qny16ry2Kfw1aLnzp3m +zZfkyZjmyZPgx5XjzJnew5PZuIzRs4PMrH+7lHKTb1t3ZFZjX1RiZE1eXFFjYE1ubVe0oXK+ +oXm6l2+8m3PFpmzJpXfOrXTLpnPRroDLqXnQqnzLq4HSp3fNpn3Ko2/FpW7CoGvHo3TCn3XI +pnbDoXXDoHS9o3C9mXKvlWu2km6ulWGtj2+skGeriWmjg2GmgWWcfGKReGeCbVldTU5KSE5N +S0hFYlhTgGVsgIRxk5l7j6BYWVxrlo+AlJmAmp6Ci41zkJF/i5h6i5d6kJ14mZt5j595kpmE +lKZ5kqF9i5t2iZmLqqHV3bTg5Lvq4r7d37bb3LTZ4Lnb2LDW06zZ2K/Y16rQ1qnZ1a3KyKmw +qIuntImzsZWepX7Ox5rTzJ3SxKbQ1KLVxqbVzaXLwpzNwpTNxaLDupTCv5nBu5K9uJPAvZS7 +tpm/tpG9uJHEt4q6vpW7upS9uJC4s5K1s425sYisqYqdon6lqISrtoyxspKjq5CtrI6erI2l +pYKep4OcmHuQoXeanX2jqIWpsY6joYmXnXyWnXuRmXyVlYCPk3mQkHmFjG+Hg2+DhWuLjW58 +e29zbl9vbGVeUVM8REE8PTc8Qzs9PDY+RD47QDc8QTw8QTM/QD5BQzc8Qj0+RDhBRTxBQTg6 +PThBPztCRjlBPzpDRThJQj9ISj1fVUVwYk6aeFypi1+5k2y2kGrEmnW9iXG5ima1iWe6jGbD +mHHDmXO4h2u1jmuxiWmsfGSabFeEa1STa1qLbliFbFeCblTL1I/9//b///////////////// +//n///z9//n8/vH9//L///r8//b+/+////v///b9/fL8/+3///72+url9ePj98/s9uXo893h +8Nz7//Dz/+74//H///j9//b5++vz/+76//b+//v///n9//z5//P8//X7//jy/fDx9ebu/e7t ++uLy/Ov+//z///n4//v////7/+/9//r///////bz+en+9/D09OR7YHhVcnV3lJh/lKWLo612 +jJt3iZBodn5SXGZMVGBUX2dRX2xOTVdHS1hET1VBUFJHU1k9UVZLUFlCTVNJWmRbb3lggYhr +iJt7iJqEmaaCjJ12hpR5jZV8hZF6ipB8ipV+i4h9eHpva2KId2KXkmilkXWekXOlhm2ci2WL +eldrZ0lPR0hHRUhLRUhKRk1iYmJ5g4lseoNOX2ROT05mfHWInI+krKels6eos6eiraCktKei +rKartamru67AzbjU4c7R4Mva4dLY5c/n79rj79jr797e69fr8tz1/Or//+n6/+b6/+f//+z/ +//P///H///H//+////T///T///X///H///L///T///b///X///b///P///P///D///D//+n3 +4NfSuJbbtYTjx4/rzpzpzpzz15/x0qDtx5bvvpXcs4DfuIjiuX7lvozkxIbsxo3pw4rry5Lt +yJXpxIzlx5XlyI3mx5Lfw47ctI3PrnjftojiwIrhuoXiwozqyJDrzpX01Jrv15f42qP02KP6 +2q763Kf72ab02qL72KP426X536f53qn13KT34K374q/446r526n53qb32qf23ab74ar24KX5 +3qb026fz2qnw2KL02Kzp157r0Kjqzpzt2azx16Tt1KDs0KDr1pvt0p3q1Z/ny5fjwJfcwozg +wobfw5DixZbhvpTavo3ZvYnbwpHXvY7Xt4qoe2N7bVdwfVaGil6KhGiQhG2unXTJpHvIp3nP +rXrKonbPrHPSsH7VsYDUrn3Urn7PqYHKsH3Mq4DKo3POroHNq3/FqnTIrYTFp3XKqHrFqH3E +onPBnW2+m3K3lG2zkXGwj2ezknOnjmuliG6hhl6dhHKdhmqMiGt/eXB3fGx0hW1Sb1dcgINz +jI97mZ58j5lnh397lJp6ipNWXllebnx6kpqDoKGDjZlyiouAmJyBk56IkJh/lZuJlZp1kZuB +jpV3j5V9k5WNoaHB17Hg2bbd2bDc27Db2rDc2bDR1qbY2LXW3LDW1Kja16rb06nHxKWsnISk +rIenoYaorYPK0Z/V06Dc1avSzqnb0qbSxqTJxJ3Lw5/OwKDBxJvMxJm9wpm/wJy9upfEvJW5 +t5PEvpu9u4vCv5Gzt4q8s5GqpYeinoals4OrrI6xuZCusJOqtJGsrYqrsYmssIufpoCip4Og +oHygrYGssYyvuJWopYmbooOdp4SZoYWQmXqRj3mOkneMh3OJimyOjGyKj2qRi3iFjm+JgHFg +aVNrbFZdVUxCRD46Pzg8Rj4/QDdCRDo7PTs6RDY6Qz49QDtERDo7PDQ9RTc/QThAQzZCQjw+ +RThGRzpBRzxGRD5ESD5MSUBbVUJzY06WgFapiWOoiGS9lG63lW+2i3C7nG7AlWvDmXLAmW7B +l3C3j2m0iWilfWKrhmKphF2Wb1aLa1KQc1WIbFSGakzVzYj///n///////////////////// +//////////////////P///////////z///bw9+Pz++bp9+Ly/ubo+uLo+db9//3q8Obi7tn0 +/+vy/vf6/vzz+O32/vH5//L9//n4//Hu+er1++nz8+fx9+T3/fr///z///7///3///7///3/ +//z///////f///71+O3+//X+//b8++v0/fb///n9//7/+fmYXHNWam1qgpZ1jJl2iJp0kJVz +iZdldoNWWG9DWWRTVW1GUGBASUw8SU1ESE48S09CTFQ9T1lHU11HU2ZRbHd1jpuAmqV3h5Fz +h5d2iJ17iJJzhZF0hox6hIl3gImIkpiPiIeVimynimynlWysknakkXKmjnygiW+iiW2gjGuh +iWuQhF+DdlNeV0ZGRERLRkhaV15hbm1aZGlEU1RmdW+LjISboJSpsKGntqSZppqXpZqns6Sz +vK67zbrN2M3N3MnZ5NDb4M/P2cXa59Tx9d/p9uDp8Nvv+uT//+7///L///H8/+3///T///b/ +//b//+3///H///P///T///f//+////P///T///H///T///P///T//+z//eju38/euqjWtojk +uo7jxJPyz5jt1p3316Ht2Kfy1KPs0Jftxpbet4LhuYXiwI3gwInpx5Lry5XqxpPlxI/ivYzb +tIPPonvBmXfKm3jfwYvnz5bs0Jjsz5Pt0Z7xzpr11aX02aX20qbx05v11af226j526z526j1 +16r52ab43Kn83a353qz337D52aTz1aft1Krwz6Hx1qXy1an32qH02qj11qf02qXy2KXvz57v +06bt16Pu1qLx153zz5rq1J7t0KLu0p3x1J/t0aTpyp7o0Zrqz57jxJfbwJDevpLZuYXXu43U +wIvexZrexZPfxpbnz5fs057n05/Tr5aZe2WMhmWennuorH6uqZC+rYLOrIjSsYfOroTQsorX +sofUrn/RtIDRsYjPs4jXtI7PqH/IrYbHqHbKqH3GpHzHq3/EpnXDqnfKpXXCqHnGpnjAon++ +oHCzmHW2mXesj3C1j2umkG2rlHKjlm2dmnGflXmjmXyZm32fnoiToZCdtKGqsrF9n52Hm6Z8 +mJqJmad1lZl8kJp+mqGDiZlliIRiZ3JqiYl6j517n6WEn615mZd9laCCnKCGnaB8mad/n6J6 +m558l6OKn6jE1abX2LHc2bDa3bDd1KzZ2K3d1a/R0KjX0qzNy6La0KfR0aTHu56kmn6qrYij +p4OiqojCzJ/a0qPTzaLNxqLLwJ7IxJ3Mw5++wqHEwZnKxaHEv5y6upK9uZS7vJC8upW9upm3 +t5WxroyhooWkq4Kor4yutZOxs4+tuJWutpO0sZqosIuwsY2vtoyztZOnqYefpoGjr4aqsI+x +uZK1uJmproq0s5Kaln6LkXeKjnWLinGMjHKGjHKKiG+NknOTlXiSk3ePkHiMjHh8c2pnZ1Jj +a1dfUlE2QThAPjg1QDtJQT49Qj88Qjs7QTpAQD1CQTs8QTlAQTs+Pzo+QTc/RTs+QTpCQT5B +RT1FRT5DQjxHS0FKSz1XT0VyaEiPel2ig2Grh2+5kmyzjHK6jmesjmvBlXHDoHi/k2+7lHGv +e2mliGesgGSdfFyke1+MbViSaleHa1SFalKGb1POyYL+/+7///P///3///n///z////+//n+ +//T6//b9//T///////77//T4/e36//H6//T////8//ny++fn+ubo/drm8uPn+try+er//+zt +7+n3/fH4/fH9//z///P4/+77//L5//r+//7////////1//X///7///3///z7//X///z///31 +/+30/+39//v///T+//v///////37//H9//r7//Lt8uCdZHRafXNmgo9mcoVleIdje4RabX1k +dYVQW25TXG1LUGBLUFY/SEZCR0w/SUlITFZAUlFJVVxBUVZMUGNNYm55i5ZtgYx2jJV5ipd9 +jZ2EkZt7jpqDk5aCkJWInp2RjoalmHC4nXaxmXCzl3Oxmm6zmXWmlXCulXGlkWymk22nkWui +imybh2OWgWJ8bk1OTUVDTUleZ2Jib2lSWF5fbWWGjXmbm4ueppSco5CaqJOntaKtva26y7PH +1cDJ28XX38rg79Xg6NTU38jv+Nr3/+f7/enu+t75/ur9/+3///D2/+b//+3///L///L//+3/ +/+///+7//+////D//+v///b///H///T//+7//+///+7//ez16tLgxajZr47asIDjt4LpxYjq +yZb02qH226/02qPx1aTqxpbtxZHrxY/qwZbnxYjguYbguX/jvYXkuobTqXzIm3eyiGyuiGfF +n2XduXrnzYzs05zy3af04LL34bH13aL21aX12J321qj02Kb32KP32Kj72qb22aD62aL315/8 +2J343K702KL21KX12aT22aPw1p7y1aLp1Jjs15vrzpf005bw2qH136ny2qf23KHu1qPt0Znt +2J7x3KD23qjy1KLy2KLu16Pr1aHp0JfmypPlyZLiyJbgyJTdxJHcvo7WvIzQs4TRuYjXxJTi +yZLly5npzpvy2qfm0aDKqYutmnW1u5XGyKXKwKK/q4/CroHLrYHVtoDVtofVtojRrn7Ou4HT +tYTRsoTLsYPQrX7Hqn3JrX7Hq33KrXzKsIDMrHzKrIPDpHu/o37IqH++pHbFoXm5oXa4nXWy +lWuzl3qum2m1oH2voXKroH+mpXittYrKyaPT4LbN0rfIzrG4vay2xrTAz8OSpad8lqKCoKV9 +qaqQqah/n6B+k6h7lp90i5hrjJFyh49leH9yaHpWY2ZpgId2lpeDjpl1k5mEn52Bo52CpKSB +laODpaKzz63Z2K/a27Hd1q/Z2KvU1Kza3q7Xz67Z16nZ0avV06fX2au+vJqbmH2iqIKipXyb +rYDFy53Tz5/TyaXIyZ3LyJ/Qxp3EvpzMyJ3GyJzHx5m9v5a9wZTAwZa4uJKvq4+lpoKjroOq +t4ittIqst4+7tpKptpS7upOsuZK6tpSesYyvs46lrIuyso2nsI2vtYunqoqquJOqsI6stYqt +rpOoqYSpr4iil4GFgGyCjmaMh26LimyOi2uQlHKXmXiRmnSVlW2NiXGDiWl0amdmb1Vna1hU +TEg7QUI5PzU7Qzo/PzU+Pzs8QDQ7RDY8Qjg9SDhBQjo4QzRFQjo4QzU+Pzg4RDQ8Qzg9RzZG +RT9DRTpGST9AQztUUD5zbU6MeFmYf1ysjGS2lmu3kXClfWSfeFq3iWi8nXHDmG+3lXWvhmuh +fFyriGCnfF6egVuTc1uJbVCKa1F5Z0qGbFTRyn3//+////////////////////////3///// +///////////x/uz6/+r8//L7/+v///33/+z8/+v8//Hr/OXf89Hn9djn8eDe68/////7//Py ++uz4//r+9+vu8+v5//L4/uj1/PL7//f+//7+//f59e72/Pj4//P+//z///vy+ev3/PX+//z/ +//f4//b9+/r5//j+//T7/vX+//f9//P7+e/09OezZXdYdnpteotbeIJngJBkd4VlcYdjdYJQ +X2xJW2lMUVxBUFFDRE4/SkNCSFA8SEdJTFdDUVhNU2FEZWpPb391iZNtdYtxi5B/ip+AjpSC +kZyHlp2Ik5aPkpOdjYKzl3OwmHKzmHe6n3i+o3q8nXezmHW3mHm0kHOxj3Gvk3Kzlnark3as +j3OdiG6cf2mBc1paUk5PVltlZ2tdZGVXWlyDhneZn4eWoJSdpIyfpJqbq5u0wa/CzbvP3MbS +483c5NLu+t/v9+Di7d35/+X9/+/6/ej2++X+/+v8/+37/Ob5/+n8/+b5/ez2/+n+//D//+z/ +//T///T///H///T///H///L///D//+z//+r7993jzsHYs5TcuYnnwZHrvI3owInqyZXxzZr2 +16fv17Dy1qbw0J3tyqPpxI/hso3arIDYsoDWrH/RpHa/kXOrgGWrh2fDm2PYtXXgxIjxzZny +1pv23af13Kn84bL55q385bX45q/93rL52ar51aLx0J/52KD61qL3zZbzxpr0yZbrxpXvypnx +ypzxzZfv0pv02KD11qH026Pv26T326fw2J/116b526L43Kj63ar63Kb23KTz16fy1J301Zru +1aDy26jv1qLp0qHo0JjtzqLjxZPixZTdwI7ZvpDYuZDXvInTupPPr4rNtITWv4vfyJfnypPs +1J3t1abgyaS5mn2xrHvT0a/Qz63MuKHIs43Sro3JsIjTuYzTuYnTuY3NtIPPsI/IrYXOtYjL +sYDLsXrHrYHJroLJqX7KsoDKr4PHsInHrIXKr3/FsILMs4rHq4fBpoK7qH26pX22pn2toHys +oXe7qIG0qIO8sYi8xZ7a473m8s77/t/5++Tv8dvZ4srS2sfF1MnE08KztrmPoKSEl52BoaeC +mqWMoKx5naWBkaF7kZ16kaJxjZeCk6Vyj5hPS1VET01QTV5UU1xhZnR1kYuDm6N9jZyEpKmS +ra6oxqbRz6za3LPd26/b2Krc3LHb2bDR0LDT0arb0afc1K3U1azFt5Wdm3qsp4KWmHugqX7J +zpnZyqXPz6bRy6TIyJ3SyZ7GwZnIw53CwZi+upi1tJarqIWrsI+vvJG4u5m6xJ62vaKwu5W3 +tpWutoy1vJW3uJm+vpqvtpKvt5GttpSztpOysoyxt5OvspixuJaptJGssIuqr4+mroqfsIum +q46mrYivs4yMinGMi3KRlHOZmHuPmXiboHyWn3uXknmOjHGGf21+hGlpYmFgaVNoaFVTS0hA +PkA/RDxDRz9BRDw9PztBQTw6Pzo/QDs9Pzw/QjlAQj1AQzk/Pz08QTpAPD4+QTpBQj9AQj9J +RUE/QzxJQj1STkBqXE9/cVCggGCcgGGwiWWvimi3jGurhmK+kG26kHLAmGy/kHW4kG2dfGGm +fmSifGGZdV2PblaQbFiOclOBZVV4YlDJwXf///n///3///////////3///////////////r/ +//z7//P///7///////v7//T3/ez6/+33/u3z/+jp/OPg9NHp89/l7t3j8Nry/+r+//Lz+Oft ++ur1//L3/+v9//j///7///////H9//P7//n///r///75//T4//T7//T///v7//X2+O/9/fT5 +/+/q7+b9/fD6//j///7///z///bz/fP///nKbnRRXmJZa3BZe4JxiZJXeYFof4Zbc3ZVZHFN +Y2lLVWRATEw+RUs/SkM9SUpHTFI+YF1EWWRScXlNYHBPdnxwhJFwi5l6j5h6i5GEj5d9kZGA +fn+FfG+diGmyk262mm+7mWu6oG7Bn3O4o3S/nW+3nHW7l3K4nHa6mnGwnHCxl3KvmnqvmHKs +kHCijGubhml/cVVaYVZbYVpXZGRTWFh6iXOhmImYpYufn46Xo5CcpZO5z7LZ48zV4czZ5dHi +8NX3++Ho8+Dq9dz3/+X8/+zx++T1/ubt9+Lj7tfr+d36/+b6/OX5/+f//+z//+3//+////L/ +//H///b///L///H//+j//+f3/dzu483StY7Vs4XbvYfox5PoxZbsw5bjuoXpw4blxJXuzJfs +0Z3typjpypLmw47ewIjWsYPHnHmse2icemOkgl66mmfVrXTdvYboxY3uz5Xy0pj01qH64qn/ +6az436j56K//6rP64q7+5bL84LLz16nvzp/wx5nuzZPwxZjrxJbnvozmvInjuojmwInkv4zv +zJf03Kj23q352qnz26b24KT646344a7w2aT33qv02Kn53an32Jzv1qPu1Znv06bt0pvv05rp +1Znq1qTizJPiyp/exJDbwZHWu4rOsoXMr4THsH3Fqn/Bp4HErHvQtX/WwZTeypnczJ7ez6PU +wJK/pomytZO/sJDDsovMtI7CrYbNt4zIsX/MtonKtZHPuY7NtonPtozHs4nHsILKu4nHtYnK +s4XJs4nKtY7Uw5HdxKPbxaHdy6Di0qPeyZ7XzqbVwp7WwZ/Hsom2ooWonnasoX6hmYC/t5LE +wpPc3rrr88X3+t/5/uH5/+v//+n9/+n5/d/j7djc5NPT3b7X2829y8SLpah9opx7l6Z8l5qB +maqClqJ2jJ99lJl0jJp7ipFsl5J6jpZej45Zc3NMbWdNW1NATFNWYVdrjol/lJmClaCCmZyU +vZXY3KfX16zN1Kjb06vQ4afU0avU1anY0Kja16/X1azV0qW3sZOQmXSfqYefoH2Ypn/GyZPK +yZbLyKDEw5y+wpC1sI+urYqrr4ipsI+yupS1wZq0waKwvpq2wJ6vvZ66v5iut5iwvZa2wZe7 +vp+4wJu5waC8x6CztJumsYeyvZWytY2tu5Gvt4+zuZequZKps4yor4qor4attImfsY6mtpWk +rIqrqomkoISan3iaoXyXoHqXn3+VnnuWl3mKjG2JhGl5fGCAgGddaFVibFNobFJLSEo4PTU/ +Rzo7Qzg7QTk1QjY7Qzg6Qzo7QTE6Qjk8PztCRD1BQzk6RDc7Rzo5RDo5QTo6RDdCQ0A9SDhF +SDxBSjxTUERkYEZ9cVKcgFqpiGapi2O0kG23lm26jmy+oHO5jnCzkWi+lHS4jnGddF+aelyg +eV6ScVqXdVeNcFKEblB/Zk9xYlG5vmj8//H///////3///////z///X///33/+z8/vT9//D/ +//b///X///3///P///////nz/uzu/eLu+uns+ufw/9n7//3p893p9973//Lz/vH9//z///r/ +/vb7//b///Pw/9/+//z9//X+//X1/ezw+e74+vX///7///3///n1/+z7//j///j///T6//H0 ++/b9//v//fT5/vL7//jz//X///r7/enXdoFDSD5LSklCSUZJUVZNZWJRaXJwg4tcd4FRXXBH +VVpEWVs9R09CSEpEUFVHTVJMVF5KYnh5iZpdXHRXdn12jJx/i5d3jpiBg4V9c2ugeWOkh2iz +jWeukGu9lWy6nXDDmmy9lnTJqHvIqHzDoXTBoHfCp3u9pH27oXi6pXq+pHnAoHyxnHi5mHSu +lXKtkXWiiG6TeWdxYWJVW1ZITUxvdVyclH2Yl3+ipI7Fyqq1tK/R1sPK2sHU38nZ4c3r9Nru ++eHj79rr9dvu+t/f8Njm89js9drl8Nrn69Hx99z//+P//+3///H///L//+n///P///T///P/ +//L///b//+3//+b5+NfXyajQrXzXtoThvZPYuYDevonkuovnvo7ou4fasoLfsoDZun3fuX7Z +u4DWsnzAoG67iWrBnH3QsJ7Ep4PXqHrgv4jsyIzuy5Ty05v21qv20qT42an74a/85bb/5br9 +57L+7r797bb767r45Kz526nx0p3nwZbnx5DmvIreuoDdtHzesYHluYriuorpwZnsypf42aP3 +4K373bH43bP34qr54av34LH747X63a723qT016Xy16H005322qvz1KfnyJDpz6DjzZXryJbn +zJbkzJXjyY3bu43Ns4HGqYG5onaxmnitlm2rlnWomXW0pX69rX/Fs4HHvY3HvZDUxarl1rv1 +39Hqzr7ewrDcvKbbvazbvqbbw5vkyK7syrjy1cPx1cb52s3t1MLx177s0rvu1br27c7+8tr6 +6dD/+Nr//+H//+7//+///+r//+7//+j//vH//ub+++Py7NHs6c/j3cDZyLjQ07ng48zu9t75 +/+P//+j//+P+/+v1/+T//+7//+/+/+38/OXp8djr7NLR38/U3su6ubmVrrCSpayMmaF/n6WJ +kqF6o5t+jJlxkpp8kJd6h5l1lp2Bj551l5x4h5hmipN+iZZcWmpLWE5YjnV/k5h7pKCXvJXR +1K7Y2K7U0qvW0arV1KrY3LDb1q3Uz6fU3rHVzabVz6u2rI2VkXqdqYGhpH2hqIGutn6ron2t +pYCyrIq0s5LAup+3u5G5t5m6u5O+xKC9xKq4v6G3uJWquJStuIy0vZSvupe3xZrDx6y6v5+6 +v6KwvpiwupSysp2ssoyvtYqzu5mtvJKtsparspGnro6qs4mssZSssZCrsJGmsZGqtY+vtZOr +qIyutI6goYWXmX+UnHqTmnSVmnSQlHSMiG59gGR2cWJrcFhnalZze2B3c2ZFSkhAQzw2PjRD +Rz41QTY/QD44Qzk/Qjs4QThBPjo7Qjk+Qzo8Pjw8Qjo8Qzs5QjVAQz49PTw+Qjw+Pz0+RTlG +Q0BJS0BnWUp8ak2dgl2hiWG+lWy0hXC3i2q1jXG2jWyzl3O1i260iG62iGmtf2SyhmSpfGSW +eF2QbFmLbFWGaVJ6XVNyYEyss2H3/+n///////////////3////5/+7///v///////7///// +///9//D///v///3///j///79//z+//fs+Onc9M/i99zu++Hs9eXv+ujs9uX1/fL4//P8//X9 +/vz///f5/vH6//j7//L+//H+//b///3///n2//Pz/+/7//v1//X49vH1+efz+fD7//z///// +//v+//z9//T///b8//P///32/+ncio9FRkFDRkhDREJAQkNDREVESU5PTVhXZ25KTFlLTVJJ +XWFFRUxBRU5MT1Y/TVRLUltFV2VyiY1odHtbZ29jdXZxa29mX1+IdGCUe2Kph2Ksi2WxkmW4 +jm2/nGy3lW2zkW7CnnTHqHHNqHrEpXbLqHzDonm/nHHBpXi/oHnAqXvBp33ApHm+o3q6ona7 +mnSym3Ovl2+dgWhxYVhMTUtjaVuTinqhmH+kqpPO2MHAxrjM0r/Q18Xj6dHO2sje69HZ58/b +5NDa6NLU3dDW5cvu9d71/uf6+OPa08a4rY7Q16X4/tv///H///D//+v//+7///H///b///L/ +//X//+z89tve0qbUtITduXjbrX3Jom7Kl2bCkl/HlGnTqXjbsn3bq3nUpXTUqXnRoXq6lm+6 +k3HRvZPawKfUr47Wr4XetYnsw47pyJfz2JX32ab52KL62qX74rL947f/4rX967r95bb44678 +5rb647H236/u1qb10Kfrz5fpxJffu4nhuojctoPbsYDat4Xit4rkvYvpu5Psy5fy1qX53qn0 +3qb55bP35a334a304LH14K3z3a303K/wz6Dw1Jv12aTt0Zvt0KLlypTnxZPo0pLqxpjozpfo +y5nauofMqYe6oHizl3iwpHq9ro2+q429p4a1nHy5qYTLvJDUyqfe2bLt7M7+/+X///L///L/ +//H//+v//+///+7//+7//+j//+z//+////P///H///H//+3//+v//t7//+v//+H//+L//+b/ +/+r//+r///L///P//+n//+r///L///b///H//+/+/ub08tX289To8cvu4M7i9sv5/+T//+H/ +/+7//+f//+z//+b///L//+j//+79/uXz9uXq8Nfj69XX38/N3MfQz8Syvriis72Tr6+HoaWB +maGCm6eDmJ56k5qElZl4fZJ3lZGEjpuEkJpvhZR4iJdviJhpantJU1pZaGNwlY2NtJbY0qbX +0qzXz6LV06vb2a7Y1KnY06nZ1Kfa1bDNy6LFxp2pq4iVlnenpnyimoCjrHu/vpC+u5S3uJC3 +vZO+vJm5wJ26vZ62w6G/vpzCx6W4vp+zu5+vuZ2wvJS3tJW1upa7wZu8xKLGzqi4vqC4vp+z +u5q6uZqyupSur46qsoyuuJCvuZKuu5arro2rr5KnrYeor4qtr42ms5Ctso+ut5Cxs5GtrJCm +roqrro+bon+an3+SmXiYkXyIi3CKf2p6e2B2dGFua19tbltycV5vaGFDRUVBPz09RDdEPjw8 +Qjo/Qz48QDtFQTlGPz4/QjdAQjtCQztAQDo8QjlAQjo/Qj5DQ0BERj9CRTs9QEFBSDtJQ0JE +Tz1qWk14aUqhfWCegmK3l2+0lXC1gXCvkmm7k3O9jHG1i26zh2q1jmuxjGuvhmarf2Gab1iR +a1KBZ1ODZVB2ZE9wY02jqV/5/en///3///v///j///v///////////////v///f///X///// +//n+//3y++j3/u7///r7/+7+//f0//Lq+Nrn7Nvl79za5tPq/u/+//z5//L9//X5//f//+71 +/fHz/er3//b5/+z2/u7y/ujz+Oj1/vj////9//H///v///7////////+//T9//3///v7/+/1 +/u/9//7///////f///z////tlaBITkVHSUA6Rz07RjY2Rz5BP0A6QUFJQ0U+Qj9EQUE3SkBE +RT09Rj5CPUM9Rz5HQEc/RkNORk9MTEdPSEleW0h6alKHeFOafFidfViqgmCtjGW5jWq2j221 +jmi6lWvClm7AnXLJqnnJsX7OqnvMrX/RqHvBp3fHpXzJqX3IrHzKrX3GqXzBonjDpXy6q3i/ +onu2o3azl3CiiF9yY1JkZlCcknWln4C2vZ3U4MLEw7bH0bfO17/R3MPHz7XFzLW+y7Pa6cvq +8dri5M/c5svx+dr8/+np4s+0jXikiVyzkWC5t4j3+9r//+///+n//+////T///H///L//Obo +x6DUrXHat3HZuXPYtXXUo2vHll/IiVu2hFW7hVawfVq8kWHMp3TEmGi7jmzAr3fUu5rMs4jb +uIfetYTmvIrkwInnw5LqyJXvy5Xt0pj12KX84KP94q/+57X84rX84LD63aX616bv1aLu0prt +x5rsy5XpyZfnxZTewYzar4bbtorfv4vjuIzcs4LatIfctIXowJHkxJHqyJLt0aXz2ajz16Hy +0prqzZjs0Jbpy5fjzJTnx5rlzJDpx5TjxpPkwJPdxJDlyI/pypboyJXkzJzjx5vcwZbYtoPF +pYK4nnK3qXvBvonSz6vS167X4rvl6MTu6873+9P5/d7//+P//un//+///+7///P///H///X/ +//D///P///H///X//+3///P///L///v///P///H///D///D//+////H//+///+z//+b//+r/ +/+///+////D///H//+7///X///b///T//+j//+7//ur+/eDz99ru89zp79P5/+b//+b//+r/ +/+b///P//+n///L//+z///H//+j8/uL0+9/y+eDd5tDh7tDc6c/S2cHD0cGjnZd5dIN8jYeC +nZaDnaSLpKCIlqFylJhudIZqioOCjJp2iZRrg49uj5Z4jpFtjJB4iI1gbG6DtZnP0rPa1ajO +zKXRzaPGwqLIwZfEwZe9v5fIzKLOxaTKyqXMyJnMy6HLxqDGxZvSw5u9wpDBwJq8vZe8vZq8 +xJK+xKC2uZi+yKTBwJ69wJ+3vpO0u5m6xJq2wpu8waK4xJ2wuJO1v5W9xae5uqOsuZevupmq +tY6ut5Kmroyws46qtI2ksIymrIerroyjqoGuqIilsYu0s5Ctt5CwspCzupSutZKqrY2osYix +s5CcoYKWnnuRlXaOjGuCh2aAeF9zdGB5c1tsbltwallmY1ZZVk5EQUM+QjQ+RDs6RDI7PDk4 +QjQ7QTo7QTQ8Pjo+Qjg5PzY+Pzs8RTk+QTo5RTY+PzxBRDk7QDg+RDlBQzs+RDhHQzhGSz1b +VUN7dEyehF6qkWefgWCuhWe2jGinhV+zi2q1kGm0iWa7j2i2iGatgGSjgGGif1qUcVeFalCA +aU5zYEp7Y0xuY0ehtV36//H///z///r///////////n///j///////v///f///n///////// +///3//L6/+7v+en2/+Xy+uzd79jW8szn9t34+urs9+P///T49/Dx++nx++zr+eb9/vr0+uj0 ++uzu9Ojs9/D9//7////9//////////H9//zz//H4//Hu/fD9//v///75//P8//L///7////5 ++fTz//D+//39//n38+nanJ5KXmJMZF1CTUk9QkA+QUA7QEJCQUBCRUM4QUA/Qzs+QD44QT87 +Pz46Pj8+QUM7REFCQkVCR0JWT01kYEN6Z1KCbFSYelqRdVqigGWqhFyzj2u3j2i2k3C5lWrA +lm6+lW7GqXzOq37RtILPqH7Mq3vNq4DHqX/FonnPr4DOq37QrYHLrH3GqHzEp3/EqX7ErH6+ +o4Cznni3kHSafF1yWVKFhWisnoi2uKjZ3cLLyb7GzbXP1r7M0rnAw7TByrbIz8Dk9tbr9eDo +7Nbi7NTz+uH5+ePVxLWphmajiVm1lVm6n2/N0Zz//+X//+n//+////P///L7897auJPVtW3h +u3PetWzNqG3TombVnmzLkWe+imCxdFeufVKxeVamdlCrh2Lcy5PZwavUrY3ZuYXiv43rx4/p +x5Xgu4/iv4zkxJDuypLtzJfx0Zvyz6H31aD13a/64a3406j22aj21azwxp3mxJDjwZHivo3d +v4fYuYvbtY3duYjYvY3dsIvauYrftIvWtIbctoXiuY3lvozkx5XtyZTt0Z7216Hy1KTz1Z7o +zpzqzJnpx5fnzJPqz5nlyZzfvYziu4zfvofixZblyJbqzZnmyZXhxpnWvI3QsY6/pHy7one7 +rn/h37fs8s36/OL7/eXt6NDi6Mjq8dX//9///+z///L///P//+3///n///H///X///P///b/ +//P///f///T///X///j///r///L///n///X///j///L///f//+////j///j///f///T///T/ +//X//+v//+7///H///L///T///D///H//+z///L//un9/OT289T1+uLx+OD5/+f7/+X//+n/ +/+z//+3//+n///L//+n///H9/d/5/ufy/ubz69bU4czN1cHE4MnZ18rAy7m6sJaFfWd5bGl0 +dGd5fHF5fnmAf3+Aj5BzdYNje3N/i5JzkZeBo6FyiZN1g5FnjoaEmp2SrJO1tpTBvZLGyZnQ +yqnRy6bN3K3U17PZ3LnT2b7N1LHK1KnMzafS0qnGyqfJy6TLz6fFy6K+xJvJxaPEx6fHx6bF +zaS/xKK4wKm3vZixwpm8upqvu5TCxKK7xqm4vqS3vpevuJe9xpzBwKO3uKGyt5WvtJOqsIis +t42hpYuqro2nq4yqrY6jr4irsoytsIyvt5CttJOrsoqxuZatuZW2vJu1t5auspmorIqqrpCo +rouXmHqTj3aKiXR/e2l5d2JzdGN7el5zbmNvdFxkX1hZVExEPUE4QTw9Qj44Qzo8PDs9Q0A9 +Ojs4Pjs4Qjk8Pzo7QDw8Pzk6Pz8+Qjk6QjtCQjk7RTk/QDY7Pjs8RThCREBBRz1EQkJaWEGA +cFOaeViwmW2ujmmuiWyif1+me16oh2SyjWmuimq9knK3hW2qgGmqfmWgdV2UcGCTcVqRc1eM +Z1J6ZlRvYE2WsF38/+7///r///////z///b///j////6/+/9/vP9//L///////3///r+//X+ +//r////8//zr9OPh7t/i+N7l+tby/OXq9OPq89/z9+js9ej5//b+//v9//Xz/vD9//35/+v/ +//3///////v5//b9//Ty+en9//r9//j///3///f5//X7//n///3///jv9ej9//f///3///// +//n6//H7/vD0/evqtblOY2VaZW5bgX5Zb2o9Sz1HRUE9QTpBQEQ2QzRAQUI2PjU7Qz08Oz02 +Pzc7Pz06QTNBRD1JSkFTT0ZsXEt3YkaCbU2OdVeUd1ifgFysgl6sh2C4kWi2kmnClmm6m2nK +o3LGp3vSq3/KqnzNpnnNrXzTrXvOrH/MrYDPr4LNtHzOsYPKr3fMqnzKrn/Ip33EqX3HqYG9 +one1oXKtkGaMa1Zzb1qgknevtZvR3r3HwLW4w6zR18G9w6jAy67Z4cTK1cLq8dXu9eDi59Hk +7M/2/OTy7+HHtJ+hgFyjgFipkli9l2m3pnPi57f//+b//+////H/9+HatY7XtWvfvGvcvHPX +uH3eu4HnxJLjs4rXp3nFlnayfF6aak+icUyfbU6si1TUrYfiv4Lpx5Lm05ft0Zvr1J3wzZ3m +wZjqwpDixI3jvITnwonpuozqw47uxpHszprwyZHyzZ7xzprsyJfpw5DdvY3atITYr4PMqHvL +q3vNq37ProPWtIfZvY3gvY7bu4nes4rfvIbpxJPsyZfs0KDv2J752aH13ab32qXtzJ/rypnq +ypXv0Jvp0Jjmw5XewZHcv4ngwI7gwIXqy5Plx5HjxpLgv5DZu4jNqoXAoH+5pXjJwIzv8sP+ +/+T//+r//+r///L+/ebw6dDh8cn5/uH+/+v///f//+////T///b///b///X///D///n///b/ +//L///f///f///X///f///T///P///T///T///b///X///f///P///L///X///r///L///P/ +/+z///D//+///+7///D//+z//+3//+7///T//+/+/uj1+dv1+d/1/uH4+d3z/9r//+v///L/ +/+////b///L///P+/+n8/+f1/979/+v1/d/s79nX2sLT3cTD2MLM28HK2bq7vZ+yo4qOkWmj +lWaIflp5b19pallZTVVSVU5YWVlja2V2i4KGm5h6mJ6DmZOlvKDFwKjEx6HJz63Gy6jQ1q3J +zajSz6fL1rHS2bHO1rfN2LHM0bDO1KfS067Fz6LN0abO1KrLzabJz6XLx6bGxqHDyKDEzqi6 +wqbAwZ7Awp+2wp62vJa2xJe8wZ+/v56yu52wvZKvt5O0vZWvvZuvsJSosYmnrYysrYmos4+p +p4ulsoqus4uts4mssYqnsIqwspCttpGvtZGttJGyt5Gpt42zupi7wZi0uJajqoagooKhr4ea +moKMjHGHiG58dmRvcF17g15/fGZycWJ0dGFnZFlaUEs6QDtAQDw7Qjg8Qj02PzRBQDs4QTZB +Pz03Pzc+Qjo0Pzk+PTg6Qjo9Qjk4Pzg+Pjo9Pj0+PTpCQD48PjlCRT1HQzpHRkJVVkOBblOR +fFmrjWatjmiviWWzimame1eqhFuykmG1i2/Alm67j3Ctg2iqeGOTcFuacleLbFKKbFl+aVJ0 +WU1uYEuCmVf1+9f+//b///////////////////////////P///X///r///f///P6//T4/+36 +/+z+//X////6//X1//Pm/dbs9eno99zp+eT///////vx++zv9+7y/u/t8+Xy/vD5//H0//D8 +//fz//D49/b9/v3///////X+//j0//L9//3///////n9//j///z///////X6//L4//P+//f9 +//T///7///3qwsVMbGxigYxdfYdziplldXw/VVRATEU2RT5EQzw1Qz9BRTwxPjc9QTs1Pz1B +PjwzPjs8RkBESUFRUUVhVUttXkx/aE+JcFGSdVmZel2mfmOsimS4kWuwlWq8lGzAomrCm27D +o3TPrnzNq3rMqXrNqH3Qqn3Ts4LQtIDWtoTTtojMrobGpXfKr4LOsnvKq3/Ao3rBq37Hp4O6 +n3i7mXijf2F4ZVSRhm+upIystJWuq5W7xaTO0bu1taPD0bbe4MvT3cLv9t/p7t7b5dDc7NP3 +/uPs6ti7ppCZd1udeVWfhlawk1m0mGO+tXzy+Mj9/+X//engxKTTrGrevGjv1Y/u577n0Kvc +v4vhuI3YrYLPmXjCnHXDj27GmW+3gVvEnF/bu4LnyJTw0pbx2aTu3qn33rPv2K3v1qvux53n +vIbftYjfunzmwIzlwofkvYTkvYPlwonnyovrxZDlxo7ivZLVs4PVr4TEoXS2jXOnf2O1imrF +nHPOrH7VtIzavo/gvZLjwpLiyJHmyZzqzpvr0KLp1p3z2KP33Kjw0abozZjpxZnozZDryprl +ypjjxpndw43gv5Ddv4rgv5Lhwo3ixZLiwY7dwY7Ts4jFqXi4oHqzm3vWzZv5+9f//+r//+n/ +/+z///D///D//+38/eTp78/n+dD6/+j//+///+7///H///j///H///b///H///T///P///j/ +//X///X///T///j///r///T///X///X///f///r///j///X///b///P///T///f///L///b/ +//b///v///D///H//+r//+///+7///H//+f//+79/eTy9t/3/uPy89zq9tj+/+r///D//+z/ +//P///D///H9/+j9/+r9/+f+/uj8/uf5/ePo58vd7dDl5tPK2sLO27rEvLasjHOJnXS1vYun +r4qZkXaEfWRiU0ZMUUxLUUNNTUpSXFNgYV5eb2BtiXG1vZbBxpvIyKDKyKTF0KbK0arJy6bC +xKbIyprCxqC7xJu/xaLDx53Bw5rKzqjCxqPDyqPLzKa+yZ3GxqjDzau+yKW6w6DFz62xuZm+ +w6G4v6G5vJ23up27wZ61vJ6us5Cms4uoso2ntpGtsY+vupKyuZmrr5Ktr4ioroyltIqkqoik +tIass46mtIurr5OtrIqrromqsYyqr4urr4ivvI+3uZWuwJe7uZ6pspKkrIicpYKcqn+enoOM +iXJ6fmR5eGJxeV6DgWR8emR7gmt6eWRoY1ZMRUk+Pjk5Ozs4Pjk3QTU4PTs6Qjk7Pjg4QDgz +PTY1QzU7QT4yQDNDPz4xPjk+Pjo1RThEPj82PjpHRUA3PjZHQD5BRTxJQkJVUkR9a0+PeFei +hGCmf2SphmS0jmytg2eyh2W0jWqzhW2xjGewiGylgGqkf1uZbWGCaU2HaFeFaUx4a1BwXlBt +YFF8mE/7/+r///////////v///////v///f///////n///////3///f///////n3/+zy+O/z +/Ob0/evy/Ork9OTd9M7w+uz4+/Hj59fv/ezy9+32/e739/n//v3///////X9//7///n1//D5 +//H0/fT///r+//L8//3///H9//j//fj9//j4/+z0/+b6//D09/D1/O36/+78//n2/+z9//f7 +//T8++7fzcdPXF5efIV7iJ5vhZZugo5le4xhbIFca3dJUmZISVA7QkM7RURBRD47RTs8QT48 +QTQ9QTtERztFS0RQVEVqWEp1YUaHaE+MclOgfF6hhVyrh2OukmK1kWu+nWzDnHDAlmLCo3LQ +qnjFpnTLp3jNrn3TrYLMsH3SrnzTs3vMr3vTtojQs4TKq3nRsH7Sq4HOsX3Lq3rCq3XGpne5 +oHK3kW2RcluPeluYmW+mmIG3uaG9taLKyrCxs6DD0bLZ4sjP3sfp9tfb5cvP2sDW5cvs+djP +zbygi3OQdk6Ydk6delClglOvk1W4lWXAu33d6Kvt47rPp2rSrV/t3JX//+D//eT55tDtw7Dw +xKrux7Du2sHs373Qvp3Tqn3etoLixZDtzZ7x1J/33a754rL34bb45bXz3K7x0ajxypvrvJXm +wIbtwpXlwYfnwInluIjsxJPqxZLlwovctoLauYTVs3rDoHLPpn/n0LPx5M/RqY/TsIDcupDm +xJzpyZ7syaflx5rsyqPszaT21Kbv0aTw0aDu16rw2JrozJLmu4vpw4/ryZfr1JzsypnkwpXm +xIjpxZPkxo/jxpTjxInhxpDlvovWtIXHq4WwmW6yk3XQt5H27M///d7///P//+////P//+z/ +//f///L///L///H+/ej19dH0/OP//9///+////P///j///L///X///H///L///L///P///j/ +//L///H///j///b///X///P//+////L///n//+////L///P///f//+////j///X///L///b/ +//H///L///H///P///L///T///D//+L//+r//un9/+P7/uL7/uDz9Nr4/+H//+n///H//+z/ +//H//+v//+v9/ub//+r9/uv4+d7v9tnr+c3s+9vr8tXo5c/V4MXR2b/Ry7rKzLHMwqq+s5m+ +spK7u47DqI6ukHyddHJiXEdfX0xcW0aemXrAvpjFyqTFyZ3Nza/CzaXF0azJ0JrDzazLy6vG +0KnJy6rEx6XLwqS9w5vExJvFwp3BwqPFxJ3KyqXAy57JyafPyqS/xaHKyZ3IyKa6u5Wtwpaw +uZGitY2vroyisYqprYivtJC4tpq1uJqyvJWyuJG4u5GzuJOvsYyttJOvuI+1u5WwrY2jp4Wk +s4iqq4enrYWqtIeqtI2ut4aqsIqlrYept4+vtpSztpKsvJWsso+rq4GhqH+aonSeon6Ghnd9 +gWSAe2d9gmuEgmt9e2GDiGd/eGRmX1hFQ0E3QT5BQTk/Pjw5QTg+QTk7Rj06RTo6QTc4Qzs8 +RDo7Qzs5Qjs9RDk/Pjo/QjlCQTg4QDo8RzY+Qzs/RThARD1ERTpFR0BMUD17bkyHdlaWdV6b +hVy6jW6yh220i26wg2q+mmm3imqviGW1jG2sgmSne2KbdVmUbFiPblGLblWHa09yWlNoV0t+ +lFP5/+D///f///////////////////r///H///f9///7/+////b///j2/+7+//L///7///z7 ++fr9//fn+Ozb99Du+9/n8Nzf69X////////3//j8//Xz//D6//D4//X+/+zw//H+//79//r9 +//Pt9un5/vP1//H7/+zy/+/4//j7+ff5/vP6//3///////j///f6/vT///34//L///n0//L7 ++fPm08tZdHd7lp58j6Jqho9kfI1geoRieo1keYxgbH1dboNVaXpPXXBCZmxDSEw9Qzo6QDY2 +RDo+Pz9FSUFOS0NjVURrYUZ9Z02EbE+Yd1aggFeshGCpiF63km6+lWzCm2q9k2zIoXHKpXbO +q3bSr4LWtX7UtYHSr33Ss4HVu4TWt4DUtYbas4fQtYTTsYTNs37JrnzJrnnLqHfDp3m+one7 +nG+sg2R/bVedj2ivp4vAzp/RwLfGxqe3t6OwvaLS2sLK1brq9dnT08S+0LDe6Mbs7dPBraGM +dFuRbkqNcEuXcE2adVKgg1e2lGaviV20k2m/kWe9jVnAlVve3ZD//+T//+r//+z9/eX8/eHz +7M3Xt53VrYPfsofhvI3pw5XuzZjy2Kby2q784a7z6K/34bDv3bP02K3rzp3sxpztyp7syJPs +y5/ltYTlyJHovo7bv4ngv4jZsoDNo3rMoG7ZpHPxy5zn1Kju8c7t5tDbuZjgwo3qzJ7x1aLx +3q3x2bPr1qH216n12q/53LP03a7x163oy5fmwZDivInnwJHnyJfrzJ7dyJXmwpLkw5blyo7n +wJLjx5HfvYzcvo3cuYvOsIC6oW+yl3LLtIvn2L/3+dn//+b//+3//+3///H///X//+////X/ +/+3///T//+j///H5+uHw+dj7/+b//+f//+////L///L///D///T///H//+////L///L//+z/ +//H///L///T///H///T///j///P///j///b///r///j///f///b///j///X///b///f///j/ +//f///j///b///f///b///H//+7///H///L//+3//+z9/ujy/+f+/+v9/+n///X//+////f/ +/+n///H//+b///H+/+36/+z4/ODt/eLu89jw8Nrk99nq8tfl5c3R2rnSz77KxaLGyazEx6jI +w6nK0azIz63SxKy3n4qqkG2jpXq9wpm9w6K2u5S0wZm+wZq3w6K+vZm6vJ29w5m6xJvNzKTG +z57J0KfRzqzJzqTM1arN0aDS0K7K06LLzarDy6bMyqLJzaTDxZ/CwaPCwZ6rroqxsJeor4mz +uZixupm5uZyxuJazupO7wJm0u5WyuJuytJC2uZSrs46rsImys5WuuJa1uZOvtpWor4yfrIet +rI2pq4SrsIutsImrro2orYqrrImqtIiytY2utI+3vJqxtpWrqYecnnqgoHyYnXaZkYF/f2eA +fmh7hGaAf2Z+fWh6eWR8e2hlXlo/QTs+PjkxPzZCPjw4QjU/Pz88RTc+Pzk7QTdCQzg3QTU+ +QT08PzZAQTtAPjlBPz48PDtBPjY+QDxARjtAQThDQjxIRjpHSEFKST11ZkqMclOXeWCmg2G4 +j2+4kWuvgGmwlmfAknWthmSrgmqzkmm0gGaaeFyZc1eMb1eNZ1WJZVBxXFBpX01mWUh8glT4 +/s////P///v///j7//j+//b///////////v///7///////////39/+/8//bz/Or2/+v2/+ny +/Ovk9drg9Nbo8t/n7t/u8uT///X09ev0/fLz/+/49+fw/On4//P5/+3+//v9//f5//f+//v/ +//v2//X5/fHt8+Lr8ej1/fL9//v9//j///7//+7///P9//X///r///b5/+/+//b1/ev1/On9 +8+1Za3V7jZV0gZZvfZFjd4ZnfI5dfIlme45aeIhseY5dfIxld4dbdoRSWGE4QT8+Qzw2QzxC +SDxDR0FKSUJaVEVzW0Z7ZUeHbk+Wc1mbflqogV6riF+yiWi7k2q7kWrFn2/Lo3TKq3fQrnvX +tITYs3/Utn7RqoDPtYbbt4nUu4TXu4nXsYnUsX/RrYPYsX7Lr3zRsoDOsHzNqny7pne/nXK2 +jmmRalyOfGKwqoiyt5rQy7W9waK+uKerqpzByLC9wq7f7c7Pyru4vaXT37vn5cuykYaHaE6V +cUeVb02RbEmcdVKbeE/BoGmyiV67l2bAklzPn1/GnFzQunf//9n//+n//+f89+Lm0r3btpXY +soPkt4bjvozlwo3qxozv0J301qPw3Kz44bbx3bLs16vt3Kft16vszaDkx5Lsy5rnzZTrz5vl +vozhvorWtIXTqH/IpHDLk2/KlG7isoLtxov94KXv0Kno2LLXzLfivpPnyJru0aP12Kj13K71 +27Hx4av44LT45LX657P23qzy16DtyJzkwojkxIzmv4fjwJPbw4/cvIrhwIjmyJDnyIzmwZHj +vYvfuZDYtYHRqYK5l3W4nHfe2KT3983//9///+H//+3//+v//+j//+z///P///H///L///T/ +//L///D//+79/Ovx89T6/t///+L//+n//+////H//+////b///L//+////P///L///L///D/ +//P///P///X//+z///H///P///f///L//+7///P///L///f///X///X///H///j///P///b/ +//X///v///T///b///L///T///H//+///+n//+r9/+v6/+D///P8/t/6/+v//+7//+7//+f/ +/+n9/9/7/+n9/uf3/ejr7tnr/uD9/uXz/ej058za49Ll8NLh3czMyKvG1rjPz6fJ0a/GxafD +y6nIy6PLz6jKyaTFvJnIw5jFw5vBxaHGu5y9upm+u5i6xJfDwZm/v5zBwJrAxZ7LyKrK0KjM +0azY1LLM0qvO06zRz6rK0qbNzKTEzai/yKO+wpjBwJy5tJKrsJG5uZmvs4+zvpqzupi4vpm2 +vKG1uJawuo+wtpC5vZizvpa1tZyzro20uZKrsYyttI+utZC1uZS3uJSrt5imrI2msY2pr42q +r5SttIuuso6jrIuss42ss4yxsY2ttoyzt5OtuJettI2qq4OfoIOgoYKVnH+bn3yOiXF+f2R4 +emZ3fGOCeml2dWCDgGZoWlpCQD05PzY9PTU6QjY4QzpAPTw7Pz06OjpAPTo9Pzc+Pzo7RTo9 +Pjk5PzQ/QTw1QTpBOz46PjlFPj48RjdGQ0E8RjxKQT9EQUBMTUB4aU2Ndlqafl+qiWG1k228 +k3K7i221jmy7j3W/kGqoe2ywiWixh2mpfGGNbFWKaFiNbFSDaVh/Y0xrWU5iWUN3hFj3/8j/ +//j///n///////////////7///////////////////j////////////////9/vzw+ufs9+Xs ++uDu/d3w/Ozw/+b5//T1+/T6/+7t9+nx9un1/vr///j///z///////P0//X7/+7z/er+//v7 +++3x/PH+//3///////3///z///X+//v9//L6+Or///3//+78/vL+//b6/e/9//r///zy39ZM +Ympqf4Ntg5Frf41eeYdodYtne4dle4tid4xjfYhlf4tlf5NrfYplcH46RT89QT41Pzo/Q0FA +QzxHQz1STEZqVEhyXUl+ak6MclSXelihg1mqhGCsg2S4h2O+mmzCnW/Hn2/IpnjIq3fSs4DO +un/btoTVtXzZs4jPuIHUsIPMsIDWs4fPsofRtYDTtX/Xs4TKqnzMsYTOsILMsHzDoHa8onC1 +jGGKZlKAeF21q4mws4m2rpWzsJGgoIOqroqpq5PAy6XHxLK5vZ3Cu5+ej3KVa1aYdU6dd06U +bkqWbkuObk6bdU7Br2jJoXu2j2DAllzMkmDEk1nZynv//df268veyKXcsYrbs4Hfu4Douovq +wovpuYnlvInnxZHqypPuzqPtz5vv2K3p0p7rzJ/ky5npzZzlw5DgwJTasofLsX/QsX3MrnzF +lXWxiWWofGCqd1jSm2/it4b0z6D+5Lj/7L/337bnv5PcwJLlx5rszqLt0qP02arz3q/436/y +4rH/4rX65rT857b23K3wz5/oxZzlxI/iwY3du43ZtIbYuorgu4rjwYrlw43nwovlv43dvIPZ +r4LMpHrFnXDj1Kj888z//+P//+P//+z//+r///H//+D//+7//+j//+7//+7//+3///H//+// +//H//+f+/en199z19tH6/OH//+b//+f//+3///D///P//+n///b///X///D///L//+3//+// +//P//+z//+r//+n///T//+///+z//+r//+7///L///j///P///P///X///r///T///T///T/ +//n///b///T//+////j//+7///D//+///+/9/+n//+j//+v9/uvz8dj///L//+7///L//+/+ +/+v+/+v9/eL099/w9dfq8dDx9tzu/tr0/ePy+Nnz89jc3bzT2L7U6cXg3MHVzrbN1LTHy6nP +0KzK0Z/Q1azS0KfG0aPTzrHJ06nF0q7N06fSz63NyKjGz6fOzKvLzqrEyqXDzK3KzarI1KPO +z6jDyqPCxaG/wJi8wJ+8uJO1t5ausoWnqomwsoW6uJOzuY6+u5qpu5C5w53Avpitu5a2vZiu +s5OtuJazvpu0v5uqsIutt5CxuJG2vJetuJSstJCztpOouJW2tZOttoupqISiqoKnq4apr4mu +sImir46qrYqmroartI6vs5Oqs5GqspKstJKospKrqoebmICUnXmYmnibnnyQhnV7gGh/fGaA +fGN3b1lxb1l7fVloW1hCPTU9Qz49PTc8Qzs8RDc5QT0+Rjc5QTxCQDs7Qjc8Qzs2RDU2QTk6 +QTdDOTo2QjNAPzs6QDlDRDtAPDlDPztAQj5GRjtHRz9MSD51ZU2MclWbeGCnhWGxkGq0k2+5 +knG5kHLIpXTAnHy5inSnfmamf2GngWaWdFuMa1CLbE5+Yk98W05yW1RnXkh/eFP1/cv///// +///////////////9//f///f///r7//P+//77//P1/Of2/+ju/Or9/+/4//T4//H9//rw/u3c +9M3k8uDl8Nnj8d7y9+Hz/u/8//n//+7t+d/s/Obx/+H0/+/8//P5//P+//z///P1/u7+//v/ +//////f+//n6//P///H7//b9/fL4//b///X7//b///z///////j///j+//j9//Ly6t5baGth +fIJle4plg45phY5ieYtkeIlkfo1lf5BjeYhsgYxlf49rfZBlfoxQUF5EQj48QDs/QzhGRj9F +Qz9JSj9cUUN2WUd4X0yIcEqWfFahfVidgVynfluviWC1j2u5mGy/m3DDn2nKrHTLr3vVs4DR +tYDZtYbOtYDTsYbUsXvYtoLTr33XtoHUtYTXuIHUtoHPs4HQsX7Ss4TNsH7Lp33Gom3AnG+2 +iWmIYVWBiF2zp4u1sY+mmoOck3eglm6dgmKjimSfkGaiiluhi1OsiFioh0+pf1Obd0iedEqa +bEaSaUySa0WgiU68mGmshFO5jlbKmVnFkVTIqW7auIzhu4zft4fcrYHbsoDjwYzjvovotIPn +uoLosYThvIPkvY3fxYnrxpbnzpnny5fjzJnpxJHiwYzdu4nWtoXNsHvEpXrBm3PBkna4jHuw +g2m9i2jLlXDetIfyyZb95rn/8s/958H32aPrvJPlxYztyqDw0aH51ab226r737v446/64bX9 +4qz/5LL94Knxz6ruzZzhxpXctITUq37Urn7YtITbsobdvorkwJXgvIncuofbsoLRqHfClmrI +pXLz6cP9/dv6+NHp7735/sz8/9f//+v//+T//+H//+r//+3///D//+r//+n//+v///H//+n/ +/+b//uj+/+b3+tbr8M3u/Nr4/d78/+b//+n///L///H///L///X///b//+////X///L///3/ +//T///f//+////P//+3//+7///L///P///T///P///P///H///b///T///j//+////f///f/ +//X///P///r///b///z//+////P//+v//+///+z9/+n8/tzz9N/1/+L//+///+7//+n//+T+ +/+X1/979/ubt+t3t9+Xu/+D5/uL6/uTw69fT5Lzg7dPk7Mvg3tXQ3sHf5cvc2r3X0bfNyqLM +0a7O0ajS0KrQ0abLzKnK2LDK0KnMz63Kz6bKzafFx6a7xqG/wp66wZbBwZ27v5XBvpq8u5W+ +wJq9vJrExKrAxZ/MyKPExqDHxZvAxKLIxqHByZu+wp6+vKS1u5CzvZi8vJmyuJmvto+uuI+v +tZCttpG1uZGutJO4t5KutY+yvJSttY+stJGst422tY+lr36utI+ipYOhrIujqoCqso2rrYqu +royysJCqsYKor4yusY6lrYintIyrsJOpqYiio4WbnXuXlXabnX+bnnWYk31/gGOBfmR/dlx3 +bV9rc1OGfGBmXVVHQDw4QjdDPzs4QjJFPzw7Pz0+Qzk9Qzk6QDlAPTxAQjc9Pzg7Pjk8QDY+ +QDk+QzU9Pj4/Pjg/PTs+QjpDQD4+RTZCQj9ESzlMT0hlX0Kbf1mnfWOagV62jmm9j3S4jGuv +jG24lGfCm3S5iXirgGiofWKgd16Ra1eJa0yRbFyHbVaIalR/Xk1yYEuBe1P7/8n///D///b/ +//f///////////////////j///////7////9//v9//T///n5/fLu9+b5/en6+/fp++Xl99Dx +/+jv9ePf6Nf///////v07d7s9ez+/vv///////////H3//L7//L7//j+//7///n+//31/9z9 +//X5//L+//j///z///r///H3/e/t7+T8//b9//H7//H4//D///7///T///zx7+NbaGpriZN6 +f5JeeotvfIpif4xkeolhfIheeYxigIpjfY1ihIlqhJhmhZFkZXU/Pzo8Pzw4RTlDQ0A/QTtC +R0JKSjxpV0dzXkqEbU+SdFGbd1alfFmhf1yvimG1ime5lWq9mmrBo2/GoG3DonLPrHnQsYHM +sIHRt4HZtoHMrnfYtn/dtIDUsYDPtHbStH/QsIDTsYHPr33Orn7LsHfOp3zEqnbKqn2/l260 +i2KBX0+DhWOxpoenmX+Ve2eKb1CXd1GlhVKmhU+silavkFm1k1/Wyobaq4+ifE2edFKTb0mR +ak2PaUqbclGpiFS1h1vXvoffqYvDkFnZqnbqvIzhvo3dtIfWq3/Yq33cr3/ht4nft4Lis4Pf +s4XYr4Hct4Hft4bcv47fvYjcu5HaxovawI7Ts3zSqYDRpXrguJbn1Kn069Dhzby7kXvAiWLM +n3Xku5PtzaT63LH/88f/4cD31J3zyZvltoLsxozyzZr21aL52qv54a/+57/657355rD537P4 +363z1aTrxZrgxJPWvIrWuIXWsYfVq4basYTcuJHkv4zhsYHVrnjVo3LNpHHJl2+9nnLh2a7U +vZrXrYner4PnsoPksYXowY/z6LX9/+L//+n//+j//+z//+///+v//+v///L//+z//+n//+r/ +/+v//+30+N/e5cTb7cT2/938/+D9/+X+/+f//+7//+z///T///D///T///T///r///L///r/ +//T///f///T///r///T///n///T///P///H///D///H//+3///L///P///D///P///L///n/ +//H///j///T///b///X///f//+z///r//+/+/u7z+tn4/OT1/971/+P//+7///D+/uT3++D0 +/N7j7NDm9tzp69Lm9tfs7dzi9try9+P38dnl0sLW7MPt7djo8c3o79bT3sLT2LzK16TTzqrD +z6DMya3AwqHBwZy5wZm5uJm9vZu6vJrEvZzKw53LyaTKxqbOw6fNxqzIxqrJyK3MzanOz6rM +z6bQzajR1aXQz6vJy6TOyKXKzqbNza3IzaHIxaXEvpq9wJq7vZi4t5q4uZqvuJyzs4+vsZC0 +vY+0u5Sxtpezt5Oxupivto+tsI2vso6yt5K0tpOnsIyrs5CnrIStqoOlrYSysYmgr4izr42k +roepsIyksIOrqYajrourr4ilqYmfpIOdoYKYn3uXm32fnnqbl32SnXyFhW9/f2mDeWdudGB1 +cV93gmNoWFc/QD88PzY9QT48PjQ9QDs7QzM7Qz47QjM9PT88Qjg7RDw6Qzo3Pz1CPT06QztA +PT47Qjo8PjkyPzdCPTo+Rjs/Qz5GRz1FQz5JSURuZUqbiVytimyqh2W3jm+6iG7Dn3C9l2+/ +mne+m3G/k3bCj3OkhGaugWigemSRcVaNbFiOc1KNcFN8Zk93YVJ0cUny+Ln+//n///z///// +//////////z///r///f///j///r///v///r///////////X///f5//X+//Lx/+7h/NL0/unn +8OHt+N3y/Ofv/uz6//r9//L5/fD1//D9//P2/+r5+uz+//79/+/2/uX1/+75//D7//j4/+33 +/e70+ez1/Or6+u3//+7+//z///////v///X///3///n+//b+//T0++n99ulSXFxyjZNng5Jp +gY1UcX5wf4ZdeodseYNhd4VmcoZje41mgY5rhJJsgI5lbX1BQj49QDw3RDZDRUJGSjpERTtK +TD1kTkNzXUZ+Y0aIb0+YclWaeVOihVqohl+wjWK0jGS+k2jCn2zFpG3FpHfHrXjMrnnQr3XU +rnrXtH/Qr3/Ps4DXtH7atoHWtoHWsn7Psn3Tq37PtnzQsn3JrHPKq3fGrHXIo3LCn2y8nWme +dVpxX0yPiWuiiHSAYE6YdkiukE/FoV+4kli8l1m+oGG8pGS2oG+mhWKZdk6bck6SbkaVaEuN +bEGbckekgU2ykFvt7rX86dDRqIHsxpLqxpbqwJrlvpzlvp7SporTqHPUqXnZsYDbrXrWrHnX +pnfSqHTZr4HTrH3QqHzLqHzIqnfSrYPiyZj46MX9+9b//ej6+9bm28rAmnzOnHDOn2/So3Xh +xo/45Lr747z758P306j81qTtxJvjrXvqxoz01Zr426X93q385rX857j95rz75rH44azw2Kvl +zJrauIvGqXW+lXTAp3bTrYPUsHzasoLdsoHhtorasHrZrobbrXjRpXbYvITTt6PNl3Teq3fn +s4bqvo3wv47vwon006fx1qXx68D+/9z//+r//+7//+j//+z//+3///D//+n///D//+r//+z/ +/+j+/ebs58/d4sLb6sfq9c71/N37/9/+/+b//+n//+////L///L///D///T///X///X//+7/ +//L///b///T///n///H///L///H///P///D///b//+3///f//+z///T//+b///D//+v///H/ +/+3///P///X//+r///X///D///H//+79/ub6/d3y+tf2/+H6/+P//+r//+r9/+b6/+X89dnp +79Dp5MrHxbK+4LDl+dft9dnn9tbq9Nbl+tns+dj299vn7c3o48bM37vOzrHIzKbNzaPKzqHP +zK3DxqPJw53IyZ7Kx6XCzKnR0KvH0qjQ0ajS1qjKzKXHz6vR0KnM0qjM06nN1KnP06HL0aLN +06rM163bz63Dz6fM06nE06PKyqrL0qPDyq24spqjrYSuuI+tsZSvu5KwtZyqs5CxuZO2uJet +tJCrt425sI60to+ys42us4qyr4uys5CktI+hrIuos4apsY6lrIicpH2ip4KeqX+uto+kqYml +qoilroKmq4ifrYKsq4mgpn6doYSTnneboX6ZmHaWmXiPkXKPlHGShHF9eFpzc1pvdFR2dlt7 +fGFnVFVDRDs7QTU9RDs8OzI7Pzc4PzI5PzQ0QjI+QkAzPjQ8PTYyPDE+Qjo0QThCRTwzQjdC +Pzs3Pzg/PzQ7QzI+QjM/Qjg/QztJSDxJRUByZ0ehily1iXCuk2zBnHPFonm+lna4jnG6mHG8 +i3a8jGq2jXG4iG2rf2aigGKddWaMa06Ia1V/Zkx+aVRzXk5yeFH7/8n///////////z9/+// +//7///z+//7+/vD///f///v7//T///79//P9//f4/vnt++L3/+rv++Tp/+Tj9s/x9ufk8d7k +6dn1/vTs9OTr8uT0/er7//f//+7+/fH5//T///bt++T4//H+//v///////////v8//b///3/ +//////z///r9//n///z5/fb+//j///X4//X6//P5/e/6/uz7//Pr3tRWVE9cbnZkfI5teoxj +gItndopebodpeolfe4hrgo9phpBthJVkfoxpfJJmdoFHSUw7RTs/R0M+Qz9TSUFFRD9OSUBf +UURnW0t9ZEmHa02TclacelShf1aohVyrhF22jmfCmHHDoW/HoW/Kp3XHpnjIp3XKsHfUsYHT +uoDasYnSsHzcu4nctn/bsoPYuIXauInZt4HVsH7TvITXt4PQsYbNrnzMqHjAoXTCn3O1jGiK +YlJ3aVWUgF6DY02cfUfEr2fv3ajbs3W8nF2yiV6kiFavhV2qiFSvfk+ZdUmabUuQakiSb0ud +cEyoglCrkF/w8Lf+89jdwZnqw5LuzZnw0J7uyqfmwKPZuY7Pm3DVpXfdq3vbsH/SoHTTo3vP +n2zOp3nHqHnTsInlz6L16cn9+9r//+z//+r//+z//ure0MLGnX7SpW3gt4DguYTmsoDovobz +1qX52rX10rT1y6n50aTrt4/kuILwzZjz06T8363+4K//5rf75bn45bjz1ajx06Lkx5rUs4e9 +k3qogWK0jGrConTVrYLar4XgtIrftoritovhvIjesYXQo3bPsHzSo4jXp3zsuorvwY/1y5/0 +yJvtx5f22an516/swpbm0aD67cH//93//+P//+f//+3///P///D//+z///L///H//+7//+j/ +//f//uj8+OLy9tLy8NPn8MXu99f8/+P8/+n//+D//+X//+z///X///z///P//+////b///H/ +//n///b///L///T///X///P///v///X///X///P///P///T///f///T///X///D///L//+r/ +//b//+7///T//+3///T///D///P//+r//+b+/uj3/uP1/+b7/+T///D+/un8/+b8/eTy+tvz +9eHg4Mzi8tDj4MLO1sHN373h7c7i8Mfk99j1/uD3/eDp8tLq6Mze38HMzqfOzKDKzJ7OyqfM +zqfHyKrO0arM0a6+yabK0abP0qnO06vN1K7H067T07DU06nN1q3Q2rDZ17HO063Q1KjJz6XP +06vM0Z/NzqrK0abK1KvQ1qvNy6y/u5+9t56rsIu1sZGwtpW3v5i1tJeutYuut5Wws5Gts4+v +tZKztpOzs5Cyv5ivuZavtpS1q4+jroWstIqqtIqztZOeq4iorIapr4ylr4qnromnq4Wkq4Wj +rYqoqYifqX6jqoqiq4Ono4KcoH6gnoCUl3qOkXWRlnGZmHaWj3mAe2R6eWJ3eF5+e2N6eV5l +WVVCQD1CRz5DPjw7RDk3Pzc7Pjo8QTY3RThDP0A9RTxGQj44QDo8PT4+QD1DQD83RjpAQD45 +RzpAQjs8QT1IRUJARj1KQ0BISkJQTEJ+cEqojWevi3evkGnEpXm7mHnOrXvRpIjDmXi9m3vA +nHm+kHS1immtgGepgmeacmGOcVSLaFaHcFOBZFJsZFB2dFb4/8T///z///v///////////// +//////////v///////////7///z9//b9//j///b7//b////9+vLv+ujl+9Lp8OTn9tzs9ufy +/O/8/+39//z////p/eX9//H0//H1/OTw/u7+//v///f8//H6/e70++r6/vz///n///39//v/ +//77//T9//rz/ej08+nz//D///z///v9//z5//j///////n9//pdS0lAQklPWl9ieIFkfY1l +fY1ceohnc35ieYdke4ZlgIprf4xqf41ofopmfIlITFQ3RjpBQTw6QjxHSkI+RzpDRzxKUD9i +VUhvYUaEaUuOcU+adVmff1ephl6ojWGujGa4lGq+n3LDn3HCo3LAo3HOp3fMrnzRroXOsX/Z +uoTTs4LRr4LWtHnWtX/Ns33YuYDXuILbuYfTsXvWuIDOsn/UsIPNrHzNonbAom25k26lgF6B +XE5kUkqCX0GUdEqoj1mwkWCoiVmqgVCmhU6yj1awjVqwi1irglCddUuYckyTbUeWdFGadEqj +eFGkjFnu77b799vx3Lrnx5vuypviwpHnt47bsIvPpIHCj2zLo3PPqnrTqX3Sp37Ssn7lxpb3 +6MP//t3//+r//+f//+///+j//+3//+j8+OPXs6jIpXvbrXbjtX7mxYTuzJv0zZTxyJPxxpbz +y6X42LD41a3xwZfer4Ltw4X615773qn23qn86Lv957P53a3z16jrzprewI/RrH7Hon++kHXE +m2zNq3vXsojfvYnqwprpy5/wyp/pxpfru4jVqX7Bi2XTonjpuoT0x5b81Z393rL01afwxJTu +1KD01KnlxJPkupHtxpb0xpHtyJjz4a7//df//+z//+///+n//+z//+///+r//+z///b///D/ +//T///D//+3//+n799/s6cXn9cr0/+T7/+L//+r//+j//+v//+z//+v//+7///f///b///f/ +//T///T///H///T///P///v///n///P///H///X///X///X///X///T///P///P//+////f/ +//P///L//+7///P///D///b//+z///H//+r8+OXn9tTy+Nv8/+z+/+j6/+H7/uXy+9vz/OPs ++eHz8dXl9dbt8dnj5M3Ty63J3bzN2LXJ377l/M3o9dbu9NTe17vJzq3NyaTNzarKyaTJyKfG +v6HHxKTCxJ+/xqLBx5/JyKfK0KjK0ajOzqzE0arOz6XL06bL0KjM0afJ0KvN1KXTzqzEy6DK +0abL06vF06LMz6y2vpa3upW9yJa5r5intIa1tpO1u5OzuJiqvI2ws4ymtIytuJGvt5Orto+1 +uJWss4+qtImos46xtZKst4uqsIurtom0uZSvtJCkp4GkqH2kpISmpoWdqYGrq4SepX6jq4Oc +pXunpX2hrYWgo4SYn36dnHyXmnmanHmUmHeQmniRkHKPkHOIf2h4elxzeF52dmF7eWVoYFdE +P0E8Pjk8QDk7Qzk7QTY7QDs2Qzg8RD09QDg5Pzk7QDU+QT08QDc+RDw+RTY7QTw6QTg7RjZA +QDc9RTk+RDg/RDpISD9FSTxRT0V0akesk2ezl3aulW3MtYTTtInUsInWrYfFoYHEm3q8nHm9 +kXW0im6pgmale2eUdFqJbVOJbFaQcVeCZ1hqXkpta1Dx/LD///v///7///j///39//v9/+39 +//D+//P8//L3//D+//T///7///bs/un1/+j6//Lz/+nt+ujf8tXV68vj8dfg79/a4Mzs+ef4 +/u76//L19ert9eLp+Obu9+n6/vL8//z7//Hv/+zw++33/vD9//Pz++z3/vLq++bz++zz+Of5 +/vj///v///7///////3///r///j///z///f3/vP///bq5ttcTEhCRUJERkVJVl5VdHZheIhg +e4djg5Fqe4xccH9dd4Vkg5BrgJJhgIRtfIxKSlE6REA3Qjg9QUJCRD5IR0M/SDpDSTtaT0Vs +Wkd8X02IbE6UdlaVe1Wifl2simKvjWSzkGK9lWy+o2+9o3LEoHXCp3LRr3zMqXbZtIbQtH3W +sH3YtIDgtX/Tsn/ZtIDStILUtIXUtoTQr4PTuILPs37Srn3Jq3vMpHW7oXCyimqTcFZ3WUlX +TUV0W0SGbUeaeUengVKzh02sjFajiVejj2Klj2KaiGSchWGpjmGldkyQbk+VcUyac0ykfk+o +jlzu77n7+N7r4b7iw5jpwY/huIzctYzTq4bHm33DlG/Mn3jMrHnct4r05Lj+/dz//+z///H/ +/+z///D///P//+////L//+75+N/Qs6XTqXfUr37duYHpwZHtxYz0y5j01J/51qDy2qj92a77 +4bjzyKDouYnmt4Tu1Jf53ar93rH54az847r83qz12qru06PgvpXVsobjyKbbxLHJpInRsoPi +voDhvpXnx5Pyz57vzpbwxpnpxI/ju4vFkGnaqHHrwIr1ypn41p/+4bP64azzxprkwIrqxqDc +s5HfuIXrwJXzzJn1xpvv1Jj75bL8+Mb//+T//+j//+j//+v//+v//+j//+////b///L///H/ +/+////L//+////T//+f9/d/2+9r6993x+9T7/+f//+b//+z//+7//+7//+j//+////X///f/ +//L///f///T///T///T///T///b///X///b///3///T///b///L///f///L///7///j///X/ +//P///f///H///L///X//+///+///+v9/uv5+OHq8Nzy/+b//+j9/+j+/uj3/OPy/Nvx/t/i +48XN4sHi89Dl7tjq9NDk48/W2cTUz73Czqzh7NXp4b7V3cTQz6DP1K/N07HOy6jIxqS+vaTD +v6W7u5G9w5a6vpfCw6C9yqXGzqrNzqjD0qjOzKrN1arO0KvKz6zJ0KHIyaDT06bKzKjR0KjJ +2azO0a28vZq6u5LGyZ++xKO0tJiotIysu52uuoy4u5qsro+vrpGfsoWrtJGutY2uuoqptpKs +t5O0uJGuuZSttYuwroeqsomps42otJO1tY6lqYqjp4Kcp4CjpXedrIWlpYGfp32VoHuXpH6l +poSdp4Kep4KcpoKWoICboHidoYGVmHmVkXeOkHSKjW+Hg2t3d2R0d2B4dmF7gWhsYVxGREE9 +Qz49Qzw3QjhAPzY8Pzo6PjxCQkQ7QDpCPTw9QTVBQT47Qjs8PT88QTk/Pjs4RzdBQTw/RjxB +PT06QjtGQj9FR0BLS0JKTUOCbUyckGaqj3aunW7JsIjIpITPtn/PrZHHooTBlXW2kna7kW25 +i3CshG6mg2qbdluDY1aIclOPdF2BZFRqWVRrb0rw+bj6/+n///////3///////////////// +//z///////7+//n5/+/8//n9//X///v///zw+uju9Ofm9uPo+932+e3v9OTq8eT///////Xy +/+/+//b///z///39//r///r5//Hy8e31/vX///f///7///////////////////////////Hx +/+rz//H7//X0++33//H7/vX///X///f7//f9//Xm59pdS04/QjtERkY7RTxDRUxHU1NUcXxp +gYple4xcd4NneoxfbodjeYNpe4ZthI1jX2o+QEA+Qj88Qz87Rj5MSDpCPDtCSDpPS0BsV0d0 +XE2GaUyLdVCYclibflushV6ri168k2i3mGy/lWrAmW3EnHDFpHXIqnDVsHzWs3vSsX3TsHjd +tILVuoHZtIHZtYDdtYbYs3/YsoLZsoTVsX/OsH7PtnrQr4DLpnLAmW+fdFtsUkphUD9SSkVY +Sz55XEiYdEqje1Gjf0+NgFuLeFysoXjWyafUyrHGqJahi26pl2+sdleZdEudelCpfVSuklzs +8Lv5997k3sDgw5vbsofcsYfcq4Xaq4PXpoPfupP01bL/+dT//+n//+r//+3//+7///P///H/ +//T///D///D//+r58d7QtJvWq3zcr3zku43iw4zxxpPyy5n0zp3226P94q793rD42aryy6Pq +t4rksYHnwYT02aX84an75LX74bH83q3w3KrwyZnpwpLfvYjz58H799rn07/XrovauIzlxI/t +xJ/qzJ3w0afty5fwyJbetonjroHjsX7svob3zp752qX+4Kf74a/11ZvpvpfZtYLZr43QoXnl +u4fz1ar2zaTxyJj64q332ary1p/2/NH//ef//+P//+b//+D///L//+r///H//+v///T///L/ +//f///f///T///L///L//+z+/+f7/d/299j1/9z//+n//+3//+///+r///D//+7//+7//+// +//T///T///P///j///P///H///L///n///j///T///f///f///z///j///X///T///H///j/ +//n///f///P///H//+///+n//+v//+z+/uz7+uTt++H+/+X+/+v9/+H7/OP0+9319+Xq9dDl +59bZz7u5vafP5cPp9dfq9Nrq9dTg08LD0qjr6dHJwpzM1rDO16rQ1K/Oz6vDxaDExZm8wJ22 +t5Sys4q6uZe3wJjCvp26v6HExKjIyqrQz6nEzqnM1K7IzafNzajK0qTN2abM0qrS2anOz6i6 +vpW1t5C7w5rMx6PCxJi0tJGut4+xtpevvpauspOvt4+osImtr4yus5Gxs4myto6st5KytJCo +spKttI+vr5CqsoyksI+ttI2msYiytpGko4akp4Kdq4GrqIigqYGhqYalqoCjpIGcpH+kpoOh +qIKbon2ZpICXnX2dpnqion2QlnqVjnOPimyMk26UiG17d2V2eWR8eF97el9sY1tHSkNBPj47 +PzY9PzgwRDNDRDw5RTo9QDw3QjVAPzs4QDk/Pjs3QjY7QTs3QTg+RTg9Qjk8QTw4RjtERT5D +QkJBRzVJR0JRS0VNVEPOxpSMg36onmvWrpa4pobFqHnLqoq9oHzFp3+/nHq1i3G2mHG7kXeo +gWSheWSeel2ZcWCHalaJZ1l3ZlB7ZEyAdlrx/rv///////////////3///j///////////n9 +//T///P7/u/z/e76/+7///b0/+7z/+r6/+/8/vvn++bg/9fv/+L4/O/s9uD3/+rz//T1/eX2 +/+74/+35//T8//L///3///j///7///////Xs/ef5//T7//X+//fz//L9//j///T///v///// +//Pz9un9//v///f9//z7//H/9+7+//v//fLs7N9ZTENBQkJAQUBAPz1EQkVESUhHRE5TYGFi +bnlkgohpeoljgI5kgI5keIRpe4JudntFQ0k8RDs+O0VAQztGQT1CQjtCPzxARTxiTUV0V0h2 +YUmNaE2VdVWefFulgF2niV28kmyxkmivjWXDn2rBmGzBmnDEqXLQs37VqHrUrXvVrnzVsH/c +tIXXtX/fuIXbtIDZtIPWtX3TuYLUtIDTsIXQqX3NqHfQpnXGoHOXalhjS0RcRkBQSz9RRkFY +SkR9ZkaIakuFc1Kom3jBup/T0LT0+tb5/OX0893hwr+olXy3jm+lelWqfFCnglG4mGH39cj/ +/+n89eLw4MHwz7juyarz0bL01rv/9dX//+r//+7//+////H///H///P///D//+////L//+7/ +//X//+j69uHLsZDWq4Las33ivYvwypDyxZrzy5z315782KT21Z3716r516XyyaHouZPjsoHi +t37szJfz2KLz05700pz00pr1yZzqwZPkvY3dt4b05rn/+t779ODpxrTlv5bmyJr2zJ7v0ar2 +1KrzzaXqwZLeqX/kuX72yZT40Jj916v316f51qXz0pjyyJjnvovaqnnLmGvLonbmtYX1z5n6 +2KT0y57y0Z7z0KbuxJfy5bT//+X//ej//+T//+X//+z//+v//+7///L///D///f//+////T/ +//P///b///T///f///H///f//+///+38/OL4+N34/+L7/+b//+r//+r//+r///L//+n//+j/ +/+r///L///T///H///D///b///H///f///T///j///D///n///b///f///T///T///P///f/ +//H///X//+////T9/uX8/+j//+X//+n+/vH189j1/uL9/+D6/eHz/Nf1/OD18tbq9dj089bo +687c4M7S1b/S1LjK27Xd7dLk8tTu6dHN5MDe0r3Iz6PRzqjN2KbP0q3MxqrLwp/Cw529tJOz +t5a2uJO5uZm/vJu9vp3Bw57FyKPIxKHGzKTKyaXLz6bNzKbNzqHSzbDMzq/OyarDvpu2uZ6/ +x5nJw6DDv5rDwKGzsY+utZK2t5i1spOuuI2vtpG8t5KvuY68upOyspCqsY+sspCysYyztI6s +s5OsrIeqsYmrtZOuuZOvr5e0tJKvoY6Tm36foH6cooCoq4WjqIemp4KbpX+iqIemqYmkp4Sg +moCWm3uXnnmcnXuZnHmPjXKJh2yEiGuSjG6Ni3KBfGaDfWZ3cWF3d2JkZFFTSUw4PzJAPDo8 +PS87RTw7PzdDPD9BQTg3QDk+Pjk6QDw8RDg8QTg/Ozo4QzY+QDk7QDk9Pzw/QzpBPT09Qj1I +Qz9JRD1NSUVVZESnpICIfW62wnSjkKRzZ2aChGLftZq2lH+2lXyxjHK9l3m2k224mHise26o +fGGhfGOdeGGUcFiacFuBaVVvXlFzaVH1/bT///j///n+//b+//X///////r5//D9//j///// +//v///3///b///H///////////v///38//Ds9uXg9c/p9eDk7Nnh6tPr8OLs+ejy+urs7+Xt +8uDt/Oj7/u76//T+//n3/+v3/+vz/e7+//3///f///77//X7/vP0//L9//X1//H3/vH///j/ +//7///f4//H+//r+//3//////fTq+ebz8OBVTUpCQz86Qzk/Qz07QjlCRUE2QjtHRUpIT1Rf +YnBee4Nvg5RpgI5ldollbn1UZHNFSk8/RD09Qj06Pzk6QTxCRDpAQDlARjpQS0FmV0J2XkeC +aE2NcVWbdVWYeFilglqujmS8kmSvjWLDona+mmnHpHLEpXTMpXPKrHbYrXfQqnXWs33ZsH/Y +tX/UroPWs3zVtYLSs33Xt4PWvYLVs4DNqXzPq3jHqXTHoHCgaVNsTUJfTT9XSTtMRz9MR0Bl +W0uCck6fl3nW17LY1sPR17vx+t38/Oj9/+by8NnLvqu4pYC2jWGngVKnhVDFt3X5+9T//+r/ +/+z//+v//+n//+r//+39/Ob//+n///H//+///+////L///H///H//+////T///P//+///+rx +6tfSwaTWsYThuIbjwYztw5Pryo71xpX21KH815/22Zz726v206X0053qwpXfrYfYo3XivoLn +x5jv0qHvxprovozoxY7nvYrdu4jbuYTt4a7+/NP//OD36dDryaLlw5ns0prx06b016Hzz6Hm +wZbdqYHhvIHuypP22Jj837P95rD/37L516HvwJPkt3/bq3jMnnDIlWzbvX/0zZf53KT20pvu +xJPowKDgu5Tt2aP//9j//+b//+L//+f//+T//+n//+v//+n///D///j///T///z///X///r/ +//H///X//+////j///H///f///j//+3//+/7/t35/Nz8/97+/+z//+z//+3//+v///H//+7/ +/+n//+v//+z//+///+z///f///P///T///T///f///v///j///X///P///T///b///f//+// +//b///P///X+//H+/+j//+f//+79/uj0/d/p+NT9/+D6/uLt/t/5/+P6+t/t9dnq8tfp89Tq +8dLt8tfl6MzU1sfJ3rnU28Hc5Mff1cbR2LTM0a/O1KfS16/T1ajOyqTMw6bEyKS8u6O5upmr +tI+ztIm2v5S5vZq2vZvDwprIx5zQ1KjD06nNzqjK06PS1KzL0qrMyKLCv5jCvpS8xZbFxZ/G +wp7Iw5+/w5uvtJC3t5azt5O6vJasrYavs42yvY2ytpKvt42yt5Gus42ttZK0vY+ur5Wrsoyp +tIWqsIersI2utpCusouotI+vpoWlpX6bnHaXpH+lrIOep3+kqISdo36bpICepH6lpoOZonia +l32Wm3iXk3uSlnaRkHOCiW6LhWeKiWiOlW6EhG18dmNucVp8dmRoZlNWUUlCPjw4Pzg2Pzg4 +PDc2Qjk4QTo0PDY+Ozk6PzY6Pjg3Pzg5OTs2RTQ+PTs3QTY+OTg3QjhAQzk3RjhDRDhBRjlN +Rj1ESj9gbkmFf2SimXSeoIN5c39WVVhxhVTlzrfGzaPv0cfOopHBn3muhHGngmejdmGae1il +f2egg2KbdmSPbVeKaFh1Z0h/bVH8/rn///D///L////////////9//T///////P///////X/ +//v///f///z6//by/+7y++bq9OHe79fh9tjo/tzy/O/n89fq8eD////5//b0/vL///7///// +///9/+vz/vP7//3///n9//f///Hy/ej4//X+//v7//T+//H8//r4//T+//3/////////+//5 +//D+//n///b///T///3///////b19udcSUo6ST9HQkEwQT4/Rj42PD89Pzk2QENARURGSElJ +S1BQXGhdcHtmeYZhboJ0iphgcIFCREc/QD07Ozs7PTs9Pzk6PTc/QTxKSDxdUkZpWUmAY02F +ak2SclSefFijfliqimOximC4kG65nHG8l3HCn3TEpnLMq3nOq3nUqHvQq3nWtYPUsn3YsYTU +sIDUsn/Qq33UsX7QsHvYtHzTs4TUsYDPsXzTqn7Pqna5h2Z9WEZlTkNfTUFVS0RSREBZVkWf +mWi2s5nZ5bzm5dHR1Lnw99X+/+b//+v7/uX59OHp48fVu6S8n2vLrnPq7r3//+7///L///P/ +//T///b///P///L+/u7///L///T///H///T///j///b///b///b///P//+////Hz79vUtpzZ +uYPkvozoypj0yZn126P72KH51Kn71qL21af616Hx1pn1zZnpyJfit5DPnHfYsn3nxZPhwpPb +sYTcsILft4jjvInetoTZr4Xt36r//OD//9r9++Pz38rsxaLqypny1Kfy05/syabeuI7ToX7p +vYT005z63aT/3rL/5Kr+5LD52KnqwZXgs4DXrHrLmnPDmG/ctH7ty5b41KL416Twy5zit4/b +u4/x5LT//+L//+b//+n//ez//+H//+z//+f//+z///L//+z//+v///L///T///r///r///X/ +//7///f///v///j///v///b///r///f///D+/+z7++H5/dzz+df0/t38/+P//+3//+v///H/ +//L///T//+n//+z//+3///X///T///T///X///T///b///L///f///T///T///T///f///P/ +//X//+z///X///P///L8/uL6/ur29tzm89b9/+L1/ef49dzs99Hq99bx+t7t8dXp+drc583h +7crRyq28zKzQ3rzNxKu/za7W0LPL1avSzavOzqnS2qzU0anY17DLyZ/KzanHxp68u52stIut +r4ymrYutuJW0uJy+x6HJy6nM0KvL1qjR0anJ06jM06jJyKbKwqa1uZG7xpm+waLJxaTBx5bE +w6K+vJmqrZOqtYywspGpqoirso+vtJKtt5OvuJiyuZWzuJSwsImxu5C1t5ivtpOrqomusYup +so+rrYursI6ssYyttY2rqY2inn+Zo4Gknn+ep3ufo4KfpYCdoX+Zpn+npYOepn+ZnYKZlHaa +mHaYm3WPl3iRkHeKjGuIim2Ih2eTj3GMhGx3dmRvclh2eF5ual9fUkw9QTs0PTg7Pzk2QDY/ +QT02PjlBPz4yQDhBPDw3PjZDPjw3PTxEPDszQTdBPT46PD5BQjw8PUBAQz0/QjxCRjxHRj9G +TEJteVGFgGm4q4yBenpkZGGIgWGTqmy2qbrm8rr///H//+vixNTLr6mljYCdgmKVdWSih2SV +d2eYe2GJb2eDblqFb1eFeVvy/bv///////////7///z///b///////////////////3///j/ +///8//3+//D6//L///v///32/fDy//De8dLg8Nvm9d3e7d/n/Ob7//H6/vLy++Lr/ev1//H6 +/PXx9+Xw/ur9//X4/fP///7////5+/Lx/+rt/Ofu++r2/+72/vH///35//H9//z1/e7+//X+ +//L///r///j+//X2/+f9/vj28OBaS09ERkM6RDw2QDk9PTc7RTw6QjhCPjtARjw9QkBBQjk/ +RkU+SUZMV1hYYmZcdXtweoNVXF9FPj0zQTc/QDgzPTdDQjo3QD1HRD5MSkJnVkN0X0yAa0uQ +claXe1qhflelhlqogVmtj2G8kGyxkGrCnG/DpXDOqXvRsHzTrXjZsYHUrnrbsX3QsXvUtYjX +tH7TrX/OqXPSp3fSqHvSsIHOq4DQtn7RsH3OsH7Oqni1gVqHW0lsUURoTUdjTT1fU0Weq3XI +va/H1bPj5MvW2sTj8M78/+j8/+f8/+n2/OL5+dz159Xg0L7q7Mn9/+P///D//+z//+///+// +//L///P///X9/+X///T///L///P///T///n///X///P//+///+v7/+fr5czNspbfuovrypby +x5Py06Py16L33LD74an92rH83J/505/3z5n11JfqwpPcuIXOonfZu4Tpv5PfvYbhuYrXrH3a +qn3at4LeuIbZrnvy2q3//t///+P//9/9+eDr1K7sw5fnw47y0qHrzaTevI3crH7owY/10pP9 +2qX636T+5a395rL72avyzJ7qu5LVrXjKn3TBlGncsILsyZv30p30zZfyzprpv4TYr4Lr47D/ +/+L//+H//+b//+X//un//+r//+X//+n//+r//+///+z///D///L///n///v///f///j///z/ +//v///j///3///b///v///b///b///b///f///P//+3//+n7+9vq79Du/9j8/+b//+j///D/ +//D//+3//+r///L///H//+7//+v///T///b///b///f///T///L///n///j///X///j///P/ +//r///L///z//+79/vD3/uDz9tzs8tbv/uD4/eDx8tbj+NPg6sTf7s7n8cjU48bZ58fg9djk +7cbX3cfY07ydroXF0anJzKnO1KvK0KnVz6fF0a/U0anV1KXOzqTLyaXIx6S6w566s5SxtJKn +sYyqtpG0wJC2vJfCy6DJ0qXE0qTOzabEyKDFw6PBwJS8vpi9vI/FxpzLzZm/wZ3DwprGxKHG +v5mvrZWnqIOqq4WmqoSttY6otY6ysYyvs5CzvJivtJKutJCxvpW2tpOyuJKusZCtsomysJCq +r4iwspGnrImrs5CusJKhpoqdo3+jqICeqYKjqIueooWdpYOZon+boX6YoX2Zn3eYn3qYmn2V +nHOXmXaPlHOOim2Mj26Uj3WKjW+PjHB5e2R8eGBwdlZ7cWJeWlFDPz81OzQ/QTo2PjZAPDs3 +PDQ9Ozk6Ozc4RTU9QTw8Qzc5Pjo3QDo9Qjc9PTs/Qjo7Pzs5QjU/QD48QjtHQ0RKRzxPUUV+ +g12MkWqwqZV+dXhlbFq/tZiuwY789d3//+b///T/+uza1Mqknbd1doBgYGCGgVW/lppzZV5m +Xk9gXUxbUktYV0lgZk/x/Kz+//v///////3///f///r9//b8/+z///n///b///z///Tv/+7z +/OX9//b///v///v8//D2/+3r+OHh99Hv9eDj7t/i59P///X///79//nw/PH1+vP8/vX9//P5 +//D6//X6//T+//7///f+//z///////////P0//P+//T///3///Dp9u/4+uz2+PH+//L7/+/6 ++e7y/Oz7/vn///////v7//NfT047QEA6RTlCPD07RDg7QTs7Pzg6PDs7PDhBPzo7QTs6Pjs9 +RDxCQD08QT86SURFSUxJRUlDPT46PjY5RDw/PDM2QTc+Pjc9QDlJQz5WT0JsV0d2YkqJbU+U +clWmfVubf1Wqgluvi2G0jWa5k2i7lGy/pXXKqHjKrnbVs3zSrnrWrHvRrn3bsYLTsIDZsoHW +sH7ZtYTWrX3Xt4PUrnnUrHzRsHzUrX7TrHzRsH/Mqn7AmWiwfFmkfliYelFzWkyHkmPLwaTA +yLHf5MfR1b3W48Py/d7+/ef1++Pu8d70++P8/+T0/eL+/uj//+v//+r//+v///H///L///T/ +//P///P//+j///T///P///f///T///X///H///T//+38/ubm28fRuY3ZvYrkyZbwz5r10qH5 +16H42qX95av83a/84bP63af41KXzzqPqx5XWrIXOo3PhwYjkxpPnxJPes4PZroTZr3zesYbU +rHvSqnzz5rL//+r//+r//On//Nb27drnx6zjxZPlxZPmy5XguJTXqnzowYvzzZj726v937X4 +46z846v43azx1J/qx5bgtoPDnXS/j2rasn3zzZ3z0qL0zpjswZHpvI3cr4Paw4v6/Nb//+b/ +/+b//+///+r//+f//+b//+r//+///+v//+v//+j//+3///L///j///b///b///7///b///z/ +//j///b///X///r///X///j///f///f///T///T///P//+/9/eLy+ND09dTq8NPv+Nf2/+X/ +/+j//+7///T///L///H//+r///L///D///L///P///z///b///X///L///v///j///b///L/ +//n//+n//+3//+n+/+v6/+j9/efh7Mjr687Z7dHk89Tl89rs8Njh5snm7tPc6crQzrfN2MHS +2rzIz7fT2L7c0bbGy6rFy63LzqXM0KvO163U2LnU1bDSyqbO0KvEyKbJxZ++vpi6tJGvs420 +tpSttI+wv5K8vJy7w5q+xpnLx6PExpfBwZ+4wJa8v5m+xJXKxJ7Bxpq/xZnFxZ7My6nCv6Cu +tI6oroOvqYqkqoutr4uosoa0s42vt42xt5WstZGutJOmrZCstI2usY2tsIipsYKwsZGntYuw +tJKqr4Wrs46utI+io4ufpoSeoH+eqoOkqISgq4aWnHyYnnqgo36doH2jo4Ogn32ZmHyVmHSZ +m3qUlnqMinSLjGuPiHJ8fGCKi2Z9fmeGe2Rpc1qDeWBaXFNMQUQ3Pzs/QT07Pzs7QTY7QDc4 +PTQ4Ozg3Pjs9Pzk6Pzc9Pzw0PTg2OTU7Qzg9Rjs5QkE6QzU+Ozw6QzdDSURKRjplekixmo6G +jGelmoV4cHF5gluvpaLR5qX//+z//+7k4t3ay9TAxblxdJJlbGhVV1ePk1+osppbWHRTU0pQ +U0tERURHTUZMUkfq/Kb6//T///7///////////////v///////v//+7///j7//X9//T+//j7 +//X4/+v3/+zy/+vu/eTs++bh+8/p9N/m9Nvw+ejn+OHt6tLt/uz7//T7/ev2/vD9//71/+v5 +//P8//r5/+/7//Hz/uj9//L7//b///z///n///v1/+/3/u39//3///P///j///7///3///v/ +//r7/e35/+////Tv6tlaT1A+SDpCQj02RDU9QD43PDlBPzw3QDdBQTw5Qjk7QTo2PzhAQjw9 +PTw9RDw9QT41Pj42QTxBQEA9Qj43Qzc8PTc9ODo6QDQ/QTc7PzVTS0FdTkN1WEqAbkuRcleN +eFKefFyehFWrhmOog162jWS3lWbEoG/Jo2/HpHPNqnfQrnnUp3LOpW7SrnXKrnfUsH3Ys3zR +sXnXsYHSs3/RrHvNqnXOrnjQsnzTrXzKqnHSs4DPt33TrIHJrHPAnXKVc1Z+b1WrrojEvqHS +28HQzbnK1LTh79Py9N3i7NXj69Pt9d76/+f//+r//+3///H//+///+7//+3///T///L///T/ +//L//+///+////P//+v///P///D///T//+z19ePXwabVu4rhwYrpzJT12KH43KX62qn43aT8 +3Kr94aT94av736n716LuzZnnu4zctIfYuHvp05ru0Z7qypTgwJPasoHUsIPSqojHo3bgyYb9 ++9j//+7///D9/+b6+t7x88zw3crgxJrbtIzWrnrfsIPmwYftxJLu1J752qb84LD95a313Kv1 +1qbu15/pyJHeuIvPqHnRqnbxzYj526b615/00KDrw5Pis37Xq33OsoDz+cn//+b//+3//+r/ +/+z//+v//un//+j//+n//+f//+3//+n//+3//+f//+z///n///r///j///f///v///r///b/ +//r///n///v///j///j///3///f///b///j///b///f//+z///L///L+/+r3+djz9tH5/tn4 ++eLy/dn6/+P//+P//+3//+z///D///H///L///j///L///r///b///T///b///D///X///b/ +//D//+z//+3///H+/u7r8tzr6NXn9NTo79C6sZi+17jd7M/q89bi68zl6dbZ4MnOz6vFzbDI +yqrF1b3O073TzbDAxafGx57FzqPN0afS1KvN1KLO06jOz6rPx6bByZ+8tZSrtYm1sJClsYmy +rI2vtoe4vpnAwZ++xKTIzKHGyajCx5jFyKTJxJ7Gx5zEwZnBwZq8vZ65vZnIxJm2upOzr5Cr +uYuouIq2tY6yso2nq4amroSztY2tuI2utIuvs5Cvs420tYyys5Glsouwr4mlt4+ztZSttI+o +rY2utZCquZClpYeanX2dqIOcpXylrICYon2YnX2ZpHybooCbpH2hnnqYn3iQlXOamnSVm3qU +lXuOknCBgGmBfmB/g2GAg2OHgWlzdFpoaldxel5pYFZVUUk4QjpBODg6QzhAPjw/RTg8QDg4 +PTQ/Qjs6QTU5PDc5QDQ8PzY4QDc2PTU6RDw4PDU+PzM8Qjc/QzdDTDtMTD54h02XioaIjWfY +0pl7coRveVqVp3/x/8f//+3/8+7l4tKtpcJ8f4ZbY2l3cGpVXFSRjHtSVFhUU1RMUEdLSEND +R0JKTENQW0fr+KH+//j///f///L///n///b///v9//r+//T///j///////P///X9//L9//j/ +//H6/vLy/Ob1++zi9eHg99Dr+uPn79/g7tT///H2/uXz+O/x//H9//D///77/+/4/vD///T9 +//P///j4//v///H///3///D+//T///75//D9/vz9//f///v///3u8ur9//f9/+7v/Of4/vP/ +//D4//L7/ejy6+NVTU9EREFAQTVDPUI4Pjc8PD02Qjk6RTo6PDg1PDlDQTs5PTo1PjY9Pzg8 +Pjc9Qzw9PTpBQzw9QDo3Qjc5QTZBPjY5PzFCOzk3QjhBPT1BQzhdS0RpVkN+YVKGZkeNbE+S +cU+jgF+ngV2nhVutiGK3lGrCmHG+nXHLpHbLqHPRq3fTrXvWrn/br3zUr33Vsnvas33YtH/Q +q3nUrn/Sr33TqX/Mr3nWrnrKrnzZrn7Kp3bVqXzRsnzSqnvCo3KtgWJ9ZE6GfGW0qovJx6vY +07zEy7bU38bp8Nrn59Dr79bw++D3/OL//+v///L//+7//+///+n///D///H///T//+7///b/ +/+r///X//+z///P//+///+3//ent3NPPs5fYuorhv47tz5Tx1KP12aX516T73KH12KD73K37 +4qz84qr016XtxJzgsYHUonvQrXbozpTr0aLwyJrr0Jnpwo/at4nOpn/Krnvp5av9/+X//+r/ +/+7//+f9+OH5+Nj06szhyq/bs4zeuH7twovvzpP31pn32KP72qH62qX61aTvzZ3ry5rox5fo +xI7btofMpnrYs33y1Jf826j81af305/0xpHltIXQnnbGnXLev4P28MP//+n//+v///D//+r/ +/+z//+r//+z//+j//+z//+r//ev//+n//+v//+v///f///b///X///v///j///X///3///f/ +//r///r///3///r///v///f///v///L///T///P///n///T///X//+z///L//+f//+r+/+T7 +/+D3+t3299X4/+L//+3//+z//+7//+3///D///P///b///b///b///T///T///P///T///D/ +//P//+3///H+/vH58ODf68vl89jq9dvm18KXiH2TupfO17/X5cnX4dLT2MHQ3sPJx6rBxrHE +xau8v6jBvqPDwKHFxKDCzKHMzqrSyKjZ1KrI1afQzKPMz6bDxaXEwJa3rY2npoaoroulqYeu +rY61tZazwJe8vp3KyaTDwp/DvZrCvZPCvZPIxaHDyKDCwJvExJm/xp7Ev5qwt5OzrIuisJCv +tY+tsZGzto6rs42trYmjrZC0tpStso2lrYWntI+vr4mqtI6ms4+vs46xtY2qs5Wtr4yppo6o +r4uuso6kooWYnn6irH6doX6ep36jooCdoXyapnufpH2cnXmYnXuXlHaXmHmZmnWcmniPj3OM +h2uFfmV/f16JgmCGiGeSinBycGBtbVpze1luZlxXVUpAPD45Pjc5QjY7PjY7PDg4Pzk8Pjw8 +PjQ/QDhBQzg+QDg8PTo5PDQ7RDhBQTw/QDo5Ozo9QDU7QDk/QTZUWEBhXkqKcl2NfFnHspRu +Y3RdVVDD0YLP1MH//+jv2uvw7NeNiK5wdHtlZV3PzJ9qbnd0Z2xTUE9MVFFJRUhGRkJISUNL +TEVobUnt/KP///////n///////3///3///3////5/+v+//n7/+7+//L////////7//j////z +/e/4/en1/PDo9OPf/NX7//D2/fDu9OPq9+Ln9eHt/un7//L+//v1/fL6/e77//H4/e/8//L7 +/+7y/ez+//7///////P5//X7//r7/+3z/PD+/vv7//v7/+r9//r///v+//j///77//T///z/ +/////+3q6t1dT1Q2Qj4/RDc0QTw/QjY2Qjg5QDY6QTc7Qjk/PTk2QDM4Ozk6QDg5Nzk1QzI6 +Ojk3QDxCPzk6QjY5PTk8PzY2PjU3QTk8PTY8QD85PTZCQTxJS0FZUEZpWUx5ZkyEaEqLb1CV +dVKaelmjf1aohFqviWKujme6lmzBpXDIpnPGqHDQrXXOq3Hbtn7VsXrauYTYsnzbsoHatnjV +rnnRrnnSr3/TsX/QrHnTrXvNsn/TsXXMrnjTsH3RrH3Nr3rHqHSxhmN6Y1GEfl61pofRz6vV +0bvM18Do9cz5/+D7+uTs+eH4/OT8/+n///H//+///+3//+39/+v//+v//+7//+///+n9/uz/ +/+z///H8/+f3+97v49DNsJXStIjbwofq0JLs0ZT326P42qr23q743av63ar346363qj13ary +0J3fuozToXfBkGvas3jlxpXrzp7oz53kw5PmvY3dtIHUrYPk2J34+tT//+r///H//+7//+j6 +++Lw7dLn2sjUupbovIvrxo711Kb42qH74Kv53qv33anw1qPvz6PqwZHftYPXtHzZsYHQpnvE +onDmx4f22qb84bH62an20JvlxJXbuIvIonbFpXPov4vz1J39+Mj//+j//+3///L///b///H/ +//X//+b///L//+7//+z//uT//+b//+///+3///X///L///v///f///v///j///f///n///X/ +//v///n///j///r///r///r///3///P///7///f///7///T///z///j///7///f///f///3/ +//X///f///H//+///+n///H//+7///D//+7//+z//+z///T//+7///P//+z///z///L///X/ +//T///P9/uj5/Nz8/OTb8Nbc6cbp8t/h58i4iHl7a11ycmyRl46twKmvuJi6x66817fM2L3D +y6nCxqfFzKXBwp66wJHQ0arOz6vR16vL1KfJy6bN0qfNzqTLx57GvZquuZanqoadsYyqs4uu +q4mtrpOvuZbDw5m8xJvCv5i9xpi9vp2+xJrHy5e3wJHBvZO9upm9wJG2upOjr5GkpYOoq4yp +t4mvtJSnu5SwuZewuZSrsYejqYGcrIqlrYmirYylrYevr4qqtIqtso6uso6usYujrYmpsYan +s4qrp4qcoHymo4KaoICcnHmbnnOXm3qWmHWWk3uXlXOVmnuSj3GOkXGYmnqOkHePi22DhmV/ +gWV8hGCIimmQinCCh259emd3bVp5cl5fWFVaWUw3RD1BPzg2RThBPjkyQTZDOz8wQjQ9QTY3 +QTc/Qz0zPDQ9Qjg2Pzk7STY8QTs5Pzk4QDk4Pjo7Qjo9QTw/QTdcYEWYgFuujWK6i2i2j2et +imS2pYrd7bH//+////DPw92qoKdtaXiit2XLw9V0eIhnb2lUXE5LT1FHQkRIUUBDR0NFSUVS +UknY8ZX9/+n///n///z///n///////////f///r///////7///X///j///j///////n0//L3 +/uz2//Dp+eDl8tDe7tno9d3m8Nz6//j7/eru9unz/vT0/ev1//H+//ru/OT6/vz///f4//v/ +//////////r///r99+n0/vX///7///X7+ez6/u76//P7+e35//b+/+/6//L///r///f6//T/ +//v28t5fTV5BQkFAQD5ERTw7Qjk9RTlAQz09QDI/PTg2QTk9Pzk5QTY+PzwwPzo7PTU4QjY9 +QDY4RTw6Qjo7Qz08Ozg+Pzw8QDg6Pzc7Pzg+Qj47QTxDRkJZSkJdUUd1W0t/Z0yHcVCQdVKY +dFedeViofV+rjWS0jW2zk2rCoXPFpnHRqHrNq3bTqnjZs3/bsoPYt3/ZtIDUsn7atIDatn3b +tHncsX3Rrn3WsHnOtIHVtIDWsXzXtIDWsYXUsnzVtH7TrX2+mWyfcld3Z1OvrIXc3rLt8dbl +4tPb6Mn+/+b8/eb1+ODu9+D8/+T//+v//+7//+z//+X//+f//+j//+v//+v//+z9/+r//+n/ +/+r49t7ayrfGspHOsIHRtIHnw4/vz5j31KP426T53bP42qf837T44K784Kr146n93K3qxJfZ +qYHBkGnQqXLevIzhvorkxYzgwZDhu4rXtYTUsn/n3Kz7+9P+/+L//+j//+7//+T//ubu7dLg +yrnfuZXnxIzwzY372Z/63aX84LP73aL54LLz2KrvzpzqxJTjuIrZqn7NqHbPpXvJo3LixYX2 +2aD95K/+47D42KvuypXmvozbsYfHpHXjv4jz3qr/5rb897///+f///D///b///P///P//+z/ +/+3///L///P///P//+n///H//+r///P///L///T///j///r///j///z///3///z///v///D/ +//r///n///v///j///3///j///r///P///v///T///z///n///j///v///v///n///j///z/ +//T///n///j///T///L//+///+r///D//+z///L//+z//+7+/+z8/+////H///j///H//+// +/+7//+7+/9/+/ezg6cLi6NDi8NHt8Nbd5MWsiGloa1RmZlhke2CRlIKcrpCms5i2wqW6w6u8 +xprKzqjCy5y9vZW/0KHLy63O0afN0avK0qvS16bOzKbNzqfDwp+6wJm2tZCorIqmsIatroie +rIertZG/xZzIxp6/vpfCwKG6xJ7DxJvHxpvIwpy5vJfCw53Exp28tZirtI2zs5Grr4ynrYmt +s42ptpO1tpSwtpSvs4+rs4yusomoqoqjroefp4SlsoiqsYyutYyxsY2usYqkpYqlsIS0sIyq +rYein4SepH+dpYifo3ucnn2ZmnqVl3abm3iamXaQk3aXkHCYkXSSlXWTjnWLim+Dg2uLiWWM +jWmRkWyIhGuAgGmAfGd0dWBpbldeXVNXXExKP0M1QTQ9PjozQDg/Pjw7RTpHRjo7RD09QjY8 +Qjk8RDc7Pzo4QjY+Qjw6Qzs8Pjc7RTc9QTo4Pzg/QzxBPzpkYT+ihV+1jmi8lHK/lGjBm3a0 +jXPHxI76/9D//fHb0s25qMZrbm692I3U19OEeJloZWJea1VbTl0/S0RKRkNBRkBLS0ZJT0Td +9p/6/+r+//b///////////////7///T///v///7////8//v2/+z///Py/e/0++n0/Oj8//Ly ++u/t/uXk+Nnq+eDu+eXn9t/6/+n4//T9//73/+/9//z3//Hy++v3//L6//H9//35/+/1/+v8 +//Dz/u79//v///Ls/e7+/+79//T9//L6//H7/e32+fD///P5//L+//L6/u7x/Ov1/e/1/u/7 ++e1aTl1ESD1CRzxBRT47RDY+Pjs1PzY+QTk0QjVAPzo2RTk9PTg6Qjg7PTk4QTg3QDg3QTo6 +OjY6RTo4PTI5QTo6PDY0QTo6QjU7RTM/QDc2RjdBRT5NRztXSUNnVkJ2XEt8ZUmOb1KQdlCb +eFqdgVWshmKtjmK3jGi4l2vCmW7FpXDJpHLMpG7VrnXXsoHZsXratn7QrnrUq3TYsnrWsX3X +sXrSrXfSrHfQs3rWsIHRsn7atX/RsnzUrnbQtnzUrX/EqHO6lWyPcVKakG27w5/u79Dv89rd +6Mv5/t///+n5+uXx79/r8dn8/+X//+z9/ej3+d/5/uT9/+b//+b//+r//+j8/uX//+bw8dHO +u6+7oH3KrHzQrnrhvYbnzY/216Xy2aH/36nz3ar93az616f72qT74Kz23KPuw6PTpn/DjWbP +pmnbqnzbq4DVq3vSp3nSpXzHp3rXvoPw5L36+OD6/d38/dv9/+L//+T//+T69NHew67euIvq +xYzxz5X63Kf85aj74q/946724q/216zrxpbnvoXes4XarX/Po3PFnG/Eo3LdvH/23KD736j9 +4qr02qn1zJvlw4vduIbStIDsypby2qn74rT04rX//t///+X///P///T///H///D///H///P/ +/+7//+z//+3//+3//+r///P//+7//+////P///L///X///P///v///r///3///j///3///r/ +//v///z///v///n///r///j///r///v///f///r///b///z///r///3///f///3///v///z/ +//z///////f///f///T///r///H//+3//+////X///D//+3//+v//+z//+3///L//+///+7+ +/uz7/+L6/uPx7M/l9dfh9dzn7NPl6tDf4cmxj3ZucVdqaldpaVlwYVVsalJ8lXW4vpHExJnK +zqXJyaG8wp/DxqDKyqfOzqbNzarNzKbNz6bN0arIz6PPyqW+v5m+upipqYyhqIWcqX6mrIuy +uo25wJ2+u5nBuZe5xJbHwZzDxZK9wJbBvpPBwZzExKDJxqK7uJKdsZCss461tYyttIqqr4uq +sIWtt4ynsY2zs42os5CtsJGirIOmp4emsYWnpYSop4Crr4qqsoi4sY+oqH+ssIqss4uvrI+b +qIGjpYKcn3Wdn3uZnHiXlXeXl3eak3yTknWSkXaSkXeYmHeSjnGOjm6KkG6PjG2XlXWUknON +jmqIh2uEgmWGf2dtcVxmYFdYYk1nXlA9REBCRDs0QzpARDw9PDk4Rjg3PDc5QTc4QTo7QDw+ +Pjk5Qzw9Pjo2QzhART07QDo/QTQ9RTs/QDc+RD4+RDZpYEqkgFi8kGu0iGW9kW/DlGq7lnS+ +nXLKuoju47ze38+ahrRudm54dWiMkH2Ac4xZXFu9yIReSndVWEc+S0BFSEVJSERLUUTo+6z/ +///////////9//79//j///T///////////v////////9//r1+u36/+n7//H+//b8//rv9ufl +9uDc9cj1++/p8d7m69j1//H5++/1++zx/O7z/ezs/Ojz/fD2+Ov1/e7v/e/1/+z09+fr+tvw +//j///j//vv+//3////////////7/+77//X39/L3/+n+//T///3///v///r9//n9//Tt699e +UWFCRD82Qz07Pj09Pj41QTs+QTo4Pzk+QD48Qzc8PTstPzQ9Pz00Rjo2OzsvPzE1QD83PDY/ +PD81Ozc5Pzo9QzgyQzM7Qzc6QDo7PTg3PzI+PThHQD5LRUBYT0BpVkRyWEl+aUyObk6NdFCd +eFmegVitiF6ohmGzi2KzkGvBnHDHoG7LoHHJqHPSrnzSq33Sq3nVrHzVrnnNpnjUsnXUrHXS +snjTsXjUsXvWsX/Ws4HRrH7TtoXVtYfTsoHRrnzMrnrJpna5k2qUclianHLK1qbl6tDc28zZ +68v5/N3y++Lt8tzm8dn2/OH5/+X4/OXs9t72++L//+b//+r9/+X//er09dvn5c/FtJW2mHjA +oHjMroDXsYTfwpHu1KHy3KX52an63qn21qTz2qX82bP63a772K300aLcr42temS+k2jOpHLN +onvLmnTClmy/j2fEnnHhx6fs8Mv79dr799v399ny9Nj3+tnu79Hh1rjauZ3iuIjtzZX32aP3 +36v84q365rf+6K744rn226vpzZThu4nXrnbOnXLAkWTAlnK5kG3buIbz2J752KL13ab42KTs +zJPnwo7VtYjUr4Xo0J3wyqDt16r47MP//+T//+r//+f//+3//+n//+///+7//+///+z//+r/ +/+X//+3//+r//+7///H///X///L///L//+3//+3//+////n///v///7///n///////j///// +//j///z///3///3///z///b///T///f///T///r///f///b///v///v///n///7///r///7/ +//z///v///T///3///f///j///T///f///f///f///j///T///b///H///H///D///b//+3/ +/+n9/ubw7N/h89Dj8tTp99vp8tXk6s3j6svNxrGnjW2ZhGuCcFR0aVaIl2yxu5jDxpfGx6XN +yJvBu5+9upi7w5vGyqbK06THzqfLzZ/LyJ7C05vEyq3BwZzDu6C2s5enrIqnqYWksoqyuIuz +wJS+vpa1vZXCxZu5xZ3Cw5y4v5vCwZu/v5rCw5i9w6WzrpSlr5CqroiurYanroWrrY+nrYmo +rIuqupCqtpaor4yvsYykrYimroStsY+lqISlrYeqpoKuso6usY2pqYqlqoKssIqvr4uhqIyk +ooCao3+WnnyPmnWWmHmUm3qenn6SmHWVknWSmXuUknaWk3STj3SSkXONjniOk2+UkHWDgWeG +gml/fGeBfGdvdWZcW1dkbFVbW1I/QT9APDk9QzwzQjs9RTs5QTc4QDY6Qjc0PzY6PTo7RTo8 +PT00QzY8Qj4+QzlAQDs5RTg9Pzk5QjY+QDw+RTh5akiohVy9lm3AjHK7kGjAlm7EmnG/j3PB +mHS2kHSum4SHgIRrc21raVqNk1l5ZI1PV1F0gGBKU15MTEtGSlFBS0BHSEVGT0TY9Zz///b/ +///+//v+//r///////////n///b8//X8//L8/+/7//H////////////8//n1/+v3/O7l9+ff +9dDg7tf5/+/r8+Tz//z3/e7z8+ft+u7w9+j6/vn///7///P9//v///7///z///3+//n7//X4 +//L+//P6//L0/+Xw//D+//H9//z////3//L9//T9//j///f///3///T1//D+//X29+xsWWZB +RUI9Qzk9QTtCPTk7QTs7PTE9PTk1PjU+Ojw1PjE4PDI6QTg6PTk3Pjg5OzU6PTc/PTU8PzY4 +PzU4QTg4QjU3Qzo6QzY6QTk/QTczQDpCQDZCQkBFQjdJTD1eUDxjVER5ZUt8aEmKblGOdU+e +clKcgVemglurjF66kWa8mWTHpXDKomnJoG7InW3IpG7Qq3PQqHvUrnTPpHPQq3fTqnnYr3bS +q3fZsHnTsH/Usn3brn/XsHvZtYLSt37QtX/QrnnMp3XPpnG2j2+Wd1uXkGnD1Z/j4sTGy7PZ +5MDm887i5tXh6s/m7tTp79zy+tr2+uD7/+H5/+P5/t339+Hw+Nfg3ca9q464n3O0oXHGrHjX +r4DdtIXnx5Tuz5T03Kf62qX726Hz15z226L315z71qXv0qHuv53JoHPUpHHEj267i2a2h2G5 +imS5iGjPuJPe1bbj1b/t6NX08tP6+Nrt7dLe4L7WxJzivo/gs4frv4zzyJz32qT94bX54an+ +5rb96bD85br53Kbvz5zmvYXasoDNnG7AkGu6kW29k2rZt4Pz2KD50JftyJHrzpjmx43XsYbN +rXzWr4Pry5nvz53sz5r48cz//+b//+7///H//+z//+z//+n//+///+////P//+j//+r///X/ +/+r//ur//+T//+7///X///r///H///L///H///D///D///f///j///n///3///v///z///j/ +//z///7///7///b///j///P///7///j///7///n///n///r///j///3///n///7///n///// +//X///7///b///j///b///n///b///f///T///j///T///T///P///X//+////T+//D4/uP7 +/uX38N/b6cXl99vo69De7NDh7szh6M/h6M7RzrXLz6nCtZS5wo29yp3EzqbPyaTEx5nGxp66 +w5m+v5/Jx6PN1KvN0afPy6fLyabR0anJyqvGwp22wJizuZKtsI6noomkqIqdpYSlt4qvvJC1 +vI/Cwpm8wpLFxJ69wZq+vp28vZbBwpjDwpzIw5+wr46trIegqoStq4qjrYOiroGtrIytr4at +r4umrIyrsI6wtIyqqoiqsIWrsY2qsJGqqYiqq4aqr4mvsZKmqoSpq4eosIyxtIqjooCcpYOZ +oHmfl4CWoXeenn6bnnublneSmHOTkniTkneQj3GTkHWMj3KSlnOQk3GVj3GNi2qCf2OAfmN9 +gWCGg2N2c2ZcXVNlbFRjWlJDQjpDQz4xQTZBRT06QTpEQTs2QzVDPTk8RDRDQj4/Qjs3PTc4 +RTs5Qjk7QDo/QDs9PDU5Qzg+PDk3RThCRjiIcUuwiV6+l2++j2e/lnXFn27HnXLGlWnBk3K5 +imy9jHStfWaCbmiEa1qipG5eU3lQVU12dV9KTktPS0pBQz5MREZQU0iHfFzb8Lr9//P///// +//r////////////8//79//D6//X///////v////6//T2/Or0/Or6//D0/u32/+rt/+zi9tTu +9eTn7d/c59Pv/+Tz/fD///j///bt/+71+/Hy/ej1+uv7//D5//L5/ev+//v///7///v///T/ +//r///////v///z8//b7/+77//f7/+/+//b8/+/4/+7w/en+//b9//b7//L19+pzV247RDw6 +RD45QThCPkE2QTk+PTgyPDM9QD0zPTY5Pjo3PTU3PTk8QTk5Ozc1PjU5Pzo6Ojk/Qjo5PTUz +PTg4OzY0QzU6PDU5PTU1PTg6QTs3PTZFQDtCQTg8RD9MST9eT0VmVkB0W0h0ZUuHaUuNck2g +eFaWfValhVyojWG3jWq4lWzDm2rDmmjEnGi7nGnIqHDMp3LMqXLQqHnMrnzNrHPOrXbPrnfW +r3vUsH7croHTtHvdtn/XsnrYs4XOrnvYtYTTtoLUroLHqHnAkmqZc2Whl3PJyprJw63NzLLN +0rnQ2brb2snn8dPj59Tv9tr1+OD69+Tq9N34+N3x8djf38S7qo+wnXKzlm/AmnPPr4jUrn7c +tornxIvrxp/v0pj31qnz2aLw0KHz0aD11qP0zp/uyJ3esITQn3PMoHjTpHXLiXCxg1/TuJjl +48Px69Hs69bu8M719N7n5MHWz6rbv5voxJrtyJfxzJnxzZb11Jj12J763qf43qz75aj64bH4 +26jz2aLty5TmxI7dtoHUpXvHoW/EmW2/kWfaqH3t2aX42a/tyJjlvH7asoXPrn3GpnvMqnjq +yZTy0JvuzZvy6Lb//+T//+j///T///H///H///L///b///D//+3///P//+3//+3///L//+// +/+z//+v///L///v///T//+7///L///f///D///f///z///z///3///z///z///z///v///v/ +//v///z///r///f///n///z///3///z///n///z///n///z///b///3///r///7///f///// +//n///7///b///////n///7///j///j///X///X///P///T///j///P///P+//T5+dzr/93z +99zo7szl78nj69Dc7M3i6M3d6szM2L7I6b/Lxq/F0qrNyKzJzJ/N1K7Eza3NyKbGvaC5xZq+ +wZvDxqjEzqTJz6rL0qrSzazJ1qrN0arMzqrNyaO+t5Wvr46hrYedroqip4Wqro+3u4m6vpO9 +v5e4v5K2w5K+vZi9vpq+wpvDxZ7Jw5/Dv520so6qrYWor4ulrY+nsYerr46krY2ttpCysI2m +sYiosIepsIqxs46qr4azt5CpqIasrYqnspG0rY6jrIirrIWgsIOusYqnrIimpIKdpIKdpH+b +n4OdnXqcn36VmXuUmnqXlnmUk32QlHucmHqLkniPknSQmHOTkXGPhnONi2qGhGeAhV6IimuF +hGZ2cmthX05mbl5aVlE0QT09Qjk3Pzo/Qjc4Qzw1PDc3QThCPkI6RThEPj45Qjk/PTs1RjY+ +Pzs5QTg9QDc5RTc9Pz0+QTtBQztNUECRdVK0kWi7jWq9jm7ClnPGl3XFl3PClXK7jHK+jWq/ +kmy8k3C5jGyZcl2fpWfMp7VoWHFWW0pISkVFTERKQ0JATUFLUUdmdFfO/K7///v///r///r/ +//r///v///n///////j///////7///r///v////9//33/+/y/+33/+zy+vDe89bm/NT1//L4 +++bo8OD///D4/O3t+efv/uv5/vH///7///f1/+31//X2/uz+//j///b5/enz/Or6//T///v7 +//T///f7//L7/+/7//X///7///P///3///////37//P8/vP///f//+/4+e6DXnNASTtAPEM9 +QT06QzpEQzszPTk7PDc7Qzw4QDU1Qjc0QDc9PTw1QDU6PDg9RTg6QTY0PzQ9PzoyOTZBPDwz +PzM8OzwzPjI9Pzk0PjBBPj46PThEQUBFRTw/Qj5GRD5SS0FkTkJvV0V1Xkp/aUmHbU6ScFOZ +dFSfe1qrhl6tiWSzlGi+kmy9lGW/jmu1jGHHoG7MpXPMpXHRqnPOo2/KpnHXrXnLqXbXsn3X +sX3ftn7Zr3zdu4DduoLWsn3Wtn3Wtn7SrYDWr37TsIDJp3vEmG2beF+jmnLHtpXPzajW0rja +3bvf4cvn7Mvw8d/l69bu8Nvv9dnv8tvp7tTp7djGuKiwl3Szk3S7lXTIqHvWuYPftYzcvYrq +x5Xpx5Tzzprvzpny06bxzZbxy5ruyZfzzpzsw5XksILmuoPguYzgtYjnuYXiv4zjx5rd17Hn +6MTj3MHe4Lfh0rfNqIrhvovtzJf02Z351aH51KP42qj43Kj+3qj636r93LL14a/11KXvy5vw +w5XfuIncsoTSpnzLpXC/m3PCmHHixo333KP34LTyzp/qv47es4PHpHi/mHDPp3Hkwo7pxI/n +wpHr3qX9/tz//+j//+v//+7///T//+7///X//+7///D//+///+///+7///D//+///+7//+3/ +//T///j///b///T//+////b///D///D///T///X///3///v///r///3///n///////z///z/ +//3///z///z///f///z///n///3///7///7///z///j///3///7///n///7///7///7///z/ +//j///v///r///z///v///T///j///L///j///P///j//+3///T///T///P9/eLz/tz6993s +69Pk7s/h4szc28jc7s/h5s3c38bKyLHV5cXRxqvGzqXL0rXNyqfIx57OyqbBwpi/vZvCxJbF +zKXBx6DHy63O1KfPz6vMz6LNz67MzKXJzabGw5m6tZSpoICXnX+ZpH2lroa7u5u2w5O+vJO3 +upS7uZG9vJXBvprExp24wZzFxqDAvJuwr4+kp4aqrYmkrY2rro6gp4essY6qso2xr4uqsI6y +soylqoioq4Csr4qlroqqroixs4qsrI+lroWtpIelqIOkq4KrtIywsIyqpIiZnH2en36joX+d +pH+eooObmXiYmnebm3qSkHeUlHiQkHWSlXKYlXSSlnSSjG+Lim2GhmyGg2OIgWWJimeBeml8 +eVtvZ1xfZ0tfUE0/RDk8PTc7QTY+Qzo7QDk6PDVDQDs+Pzo8QzQ8OTpBQDo8QDo7QTY6QTo8 +QDs/RDs/QTk/QT8+Rj08PTleVTyifFW/j2bCj3PFkG7Il3K9kG2/hm22hmTAjWi+lG7BknC/ +lm67jnCugGeKbliclndgWWlYX05OR0tFSENCRT1CQ0FETERkYVW66pn///j///z///////v/ +//f///////r///////////////j///r2/fH1++f///j4++7w++nt8eHg993f9s3h7dXm8Nfk +8tvt+Ovs9+v0+e30++749uzm/uf9//X4/uf7//r0/ejx/PDz9un///3////////9//H9/+/y +9+rz/u79//z///P4//jz9+3+//n6//H5//f///n9//f7//X+//vy7+N5WW5ERUI2Rj1FSEA2 +PzxCQz41Pj1AQDg0QDpDQT01Qzs6QTQ6Pzo6Ozc6PTg6Pjk4Ozc5QjhAPDw0Qjc6PTwwODM9 +Ozo2QzU5QTk0PTc2OjY8Pjs/QjpHQzk9PzhBRD1KRT9WUENfT0FoV0d3ZEZ8YUyFaUmLcFOR +dFWWfluef1uri2GviWqzkGO/jWS8j2LDmmrGoWnEoHDEpHLGpHPKp3XLp3LMqXTNq3TOrnbX +s33ZuoDUtnvYtH/buIDeuYfVuoDcs4HYtIbTtIDUsYbSsIDBmG+igWS6r4XLyqbO1Lnb28Hh +38Pi583w+dfs8tju79vo8tXx8dzm8NPKxrGnlXaxlHS0mnXFpnvStX/avIrivI7mw4/oyZjp +yZzzyZ7yzZnyz5fw0p3t0KLz0qPy1qDzy57pvYvtzpzoypjqwZXgt4bmuYrevIXds5DZrYXg +ronduInjsI7oxIn41aX01qf23Kz64LH33rH93qj846/74a752qz626/02qTyz6LnxJXet4fY +q4HPqHbGoXa9lnDTqHjx36795Lb14azt16PhvozWsYPIpXm+lnTSrn7s05vvyp3dvYzu2bH5 +/OH//+z//+3//+z///P///X///P///P///L//+r///D//+z///H//+7//+////P///j///f/ +//v///b///b///L///H///D///D///X///X///z///f///////r///z///7///7///z///// +//7///7///3///j///3///n///j///3///3///7///7///r///j///f///7///7///7///7/ +//n///z///n///3///f///v//+////j///X///r///L///f///X///X//+v+/uzt8dns79rv +8Nnd7tPi3bbc08LR6cvY4cbY2sG5yKrY5L/j2cPKzaXMyqm+zZ3LzavFxJnDwp26uZDEwZq/ +x57Ny6jD0J/MyKXGyKTIzKjNy6fEw63AxZm9tp2roouTk32Vnn+froSuu428xJjCwJ+7vZq3 +uZa5wJS+w5m8vJWywZi+yJ+9w522tpinsIqlqYylrIaoqYekrIWvtZCntZGqt5OksY+orYmd +qIKpqoKlrYenq4WmsI2mroyqtYi0sZKrroqmo4KiqYimsIyqr4GlooCYo32dn3+fpH+kpYGb +oH+YmXyZnXuWkH2Nk3WalnqWnXqUlnSMkm6UkHaHimqSlnWNj3OKiGyHiW2Cf2VwcmJ8fGB7 +dmBnaFRTUUs6SD44RDY5Qjw7PjY+Pzw0QDdAQD84QTlARD02Qzk+Qjo1RjxAQD01RDdCQj0z +QDtBQzw3QjtCQj07RDt7bkOkhmK6km2/l3TBkmq9kGy+kG2/im22hGOwfWS4jmjAmG7AlXS9 +jmu4i26leGCBXVFnV0hRTk1CQz1MU0ZHS0RJS0lKUEBkeVDY7bP+//T///////////////7/ +//z///v///v6//T3//D7//X////9//v7//L8//n6/+/////6//D1//jq/9zx+e3k8Nrv+eP6 +//X+//v6//v///7///rw+uz6/vb5+efr/Or6/vL+//7///31+er9//j+//f+//z///f+//T8 +//b+//P3/fbz/+719+70+efz++zz/er6/vT///b4/+/t9eLp8uOQYW9EQ0I2QTlAQkM7QTo6 +QTs8RD05QDo7Qz07Ozo8PTg7Pjk1Ojw2RDk7Pz0/Pzs1Pzw8Ozo6QTo6Pzw6QDdAPDg2Ozk+ +PkE6PDo7ODovPjc+O0A/QzlFPzo4QjY7Pzg8QjlLRz5WSj1fTUNnVUh4Wk16ZEqDZk6La06R +dVmee1udgl+rh2O2jWW6j2m8kWm+m2rAl27DmmzImm7FoG7LonHJoWvNpnbKp3DPp3PUq3nY +sIDVtH3eu4fat4fctojbuYXdtIvZs4bZtoTVsILUsIbVsH/EmnSokHjKwpzX2Ljd3MDg4MTp +69Di4dHr7trp7dDn8Njg6M3KyruokoCtkm+ukm3Io33Gr37ZsYXZw4rsx5PkyZfuzaTqxprz +zpr4zJ7zz6Hwz5vyzpr0zpj40aLxwqT1xpfz0qLtyp7vxJjyzZrvzJ/yyZ7zzpj21KT31KT3 +zp/yzJ731Kr325343az95rH+6bX+5rD/5Lb/5LX/6LL53rH3263yzp3kxJPht4jYrX3UpnvC +mHK9knDRuXr24bL65Lv54LPz0qLivY/Ronu2k3GviW7HpnPt1p7t0p3pwpfn3a3//+T//+r/ +/+z//+r//+z///D///H///D///P///X///L//+///u7///L///b///X///j///X///r///r/ +//7///7///b//+v///T//+r///D///b///v///v///7///z///7///r///3///7///7///// +//r///7///z///7///3///r///r///z///z///////7///7///j///3///////3///7///7/ +//f///7///////7///j///f///f///7///T///3///j///f///b///X9/uvv6tbq89vr997o +69Xk8NTX48i7qprV58nW2MDJvaa1ya7D2rnO0KrN0KfCxZu8yZ/Ex6C9vJy6u469wZnJzaDH +x6jMzqzGyqPNyqvHz6TNxqvExJ7AwqGvtpSsqZWanXybj3yXp4CqtpS5v5e/wpm/wJrDwJnD +wJq5w5e/v5i/vpa3vZrBwJSusY2rso6mqoumrIykqIimrIqns4y1uJWqr4mrsImgsIynqY2k +rIKpsoqntYywr5Gns4ioq46rroqvuJOqqIqusIuuso6yq4inpYeVnX6ZonyipH2booGdooGe +on+doH6UmXmYknSVmHWalnyPkHGXknOSlXGSj3eLjW6YlHaLjnSNhW57fGV9cWF3fGJ+fWNm +XlZOSko5Qz84QDs4Pjo+RjpDQj40RDs8Qz04Pjo9Qjo6RDw9QTo5Pj85Qjk6P0A4Pzk/QkI9 +RDZASUA8QDdBSkOReUywi2W9i2q9jHG+j2W3i266im67i2m0iWO4hGS5iGm+iWnAkG7Dk3K5 +hmutgGeYcGBvXE1RSklMSkZGTkdFSUlHSEFJSkdWYknT66P9//H///////////////////// +//n///7////////////4+/fz+en6/+/9//P4//D2/+78//rr/ufh/dXz+unl8dzn8+D1//f6 +//D8//b+/+/z//L89u/t+uj+/vv////////5++Xt9eT1/u/+//bz/+3///n///v///Xz+/D+ +//v///////////////v///78//b5//H8//H9//z///////+uX3I+STs+RTw4REBCRjw5RD47 +QT42Qjw3RDc4QDtCQDw1OzQ7QTwyPzQ4PjszQDU7Pjs2QDQ6PUExQjQ9PT03PzQ6QD08Ozg3 +PDo7Ojk3QDc7PjU/QTg8Pzo4Pzc6PTg+QjhCQj5ITEBVTEFbUENiV0ZwWEp0ZEmHaVGIbU+T +dlmZflmmgV2qi2OzjGi0kGm9k2a3kGvCnG7Bl2jDnWvDl2zHqXbLpXPMpnDWq37PqXnZsn7S +tHzZtH3ZtYTcuYTbt4TXuIPfvoLev4bXs4fSrH7XuIbUr3vJoHuynXPDwJba1a/b3MPh5MXm +6Mvu8tjk7dTl7s7R07ytnoamiWuvk2u1lnLDpnTOrnrZuYrkw4znwY7oxY/wy53v0J331pny +06T10qL31aTy1KT02aP11aH21Kn32an+3a313qr53a783K/+46/83LP54q373bP23qz616/6 +3Kn947H74q355q766bj/7Ln867P75bP857b86LHz1qXsyqHjv5HhuojVq33Lo3S5mXC+mXDh +xpD55bD96Lj65bDv2KXkw5bEpXy0iGmxj2fFmnPo0Jry1aPs2J327Mb//+T///P//+v//+// +/+z///f//+////b///f///n///v///j///L//+7//+z//+z///T///j///j///n///X///7/ +//j///b///L//+///+7///H///b///v///v///////r///////n///7///f///z///z///z/ +//v///j///r///r///7///b///X///7///7///z///z///v///n///7///r///7///n///// +//7///3///n///r///P///f///j///v///j///b///j//+///+7+/ujt8tzf7df9/ujx9+Lj +8tHj5NHd48zEyq/J1LbG3b3EyazOzbrD17TSyKvCvprJxaTFxZjCvp24vpa+v5rAxp/LxabM +z6fLzKLNzqbHyKHNwqPKyJ/CxZu6wJS0so6kpYSUoX6bmnmZpoS0to+9wZu5vpq7u5TIvJS+ +wZvAxJu6v5TCxZi1uZS2r5KiqIuus4+kqIahrYqrto2pqomwtYqltIaqr4ypq4usrYyoro2q +rIyksI+mrIqlr42nsIyor4uutIilqImksoizrY+mqISqrYqcoHyeoH6bn3qaoIGepH+epISb +m32Vn3ybmXWUm3SbmH6PknWVkXaOk3GaknaSlnWblHeNjW6Kg2qAfGN0dF50fGCDgmpsalpQ +UUtBRT09Pz02Qzg8PzY4RDo4Qzw9Rzk1Qjo/QTtCRD80PTk7Qzo+Rzs+Qj84RTtAPz04QDdD +Rj9AST9oYEimhle3kWi7k2y9j22/lGy4iGm2iWe7i26xhm6yhGm+iGK+imqoiWusjWq1gmq0 +hme1f2hzWVdOUUlaVUtESkZFSUlFS0JEUUhVXEmy1Yz+//T////9//L+//X////7//L9//T9 +//L///r///z7/+////z///////v8//Xw/+70/ent9+Tk8OHf89Xu9eb0/e/r7eX3/ev6/vv1 ++ez6//v5//f7//T///L7//Ts/+Xy/uj6//b///7///H59fLy/u/5//X1//X+//X///77//Xy +++7q++Tt9+r6//H+//D3+e3x/vD6++r0/u79//Ln9NnGaXg9RDo8QDo2QDo9PDo6QjY5QDs0 +QTc7PjgzPTc6Qzk9QTg7QT0+Pzo4QDU2Pjg2PjozQTo2QTc2QDY6Pjg6QDU3PzY3PzJAPDo3 +PDQ9PT0yQTZDPT06RDRBQTs3PTI9Pj88QTVCREJFRjdMREBXTT5iUUZtV0l1X0d+ZUuGbUeQ +cVOTeFaiflmjg16pgl6vjGO3kGfAmmm4lGi/lW7EoHHIn27Cpm3Qq3TKrXLPqHjNrnLctX/P +tXvUtHfQrXfasoDfu3/juoLcvYrevIPdvIjiv4rfuYjVsYfTroG3mXfBvovVy6nZzrja38HR +1rbKzrPHzKytpJSlimSviWi4mmvCnnzOqXXXs4bevYfkxZztwJbqxZ3rxpjty5Hxzpzs0Jbz +2Z7x16H41aLu1KP32qL63J7636T55Lf85qn85bH846/+5a/54bL/5q335a766Lb42a353q36 +56/967n25q/75rn75rH95rb55LX63ary16Xuz53nxJDdvITXqn+/oHa7k27PrYLy3bH57Lz8 +67X34rDx1J7gu43EnnSti2m0i2nFqnXn0KPsz5zr0Jvz68T//+b///T///H///j///D//+// +/+3///T//+////L///f///n///b//+z//e3//+P//+z//+v///r///T///f///T///j///n/ +//b///X///b//+3//+3///n///f///r///r///v///7///z///n///X///r///P///j///z/ +//z///f///b///j///r///P///7///X///3///v///////v///7///////r///7///v///z/ +//f///v///7///z///j///L///b///P///X///P///f//+////f+/uf37tf0/uDz/ePq89vv +8NPg6svd3cGow5nS3MPAzq7KyqXAybHC1LbMuqbByKTJx6G+wZi+vaG8v5q+yJ7KxaC+zKHH +wZjKzpnQyK69wZfJwJ65vJTCwJyusIWfpYmXnHuipIWcoX+nso+1v5W7u5bAwZi+v569xp7C +xZvEwJi8vJq2s42vrYmirYqqrIuxrY+oq4ekr42trYmnsIqrrIimqYSoqoilrYiwr4yosomz +sIqprIyqsIuqro6wtJSttY6doYCgqoWqqoakqomqq4mdoIKaonuhpHycnnuWn3qbnHaZmnqS +mXiSmHaVlHuXkXick3qTkXSYm3mYl3Wak3mNjW2NhWyDgWN6eWR7eVyDf2N3e2NwaGRJS0g2 +PTo7PDg4QTg9Qjs4RjQ8Pjg2QjI4PTc3RjE8Qjk4QzY7Qzo4Rzs1QjM3QDY5QTc8PTk3PzxE +TD+VfU+vjGW7km3CjG66jm6/j2XDlG/JmmzGm3q4im3Cjmy/jW66j3C7iW++i221iGe4h2S+ +i2mab116aVJfV09UUUlGRT5DS0JJTEZLUki645f///P///D///z///////////////39//r+ +//X7//P+//f///7///T7//P///D+//H7/+/y+uzo/+Pi+tfk9tzh7dro8N/s/+nq+uz6/+7q +/uP0/ej4/vP8/+z1/+39+fD///7//+vy+ub7//X5//X///P++er6/vz////5/ez4/fD9/vn/ +//7/+f/5/vP5//b9//v//e3///79/+z0/OTx++rCbXhASURBQzs7RkA7QDk6RDs9Pjk5Pzk6 +Pzg3Pjc9QDszOjg9Pjs6QTY+Ozs3QDg5PzszQTFAQT43OjU7Ozo3PTk6QDk3Pjg2Pjk2PTM7 +Ozg6OzRAPDc9QTk3PjpBPDw9PTU0PDY6Pjk8QzZIRztOST9YTURfUURrVkpvX0qFZ0uEa0uU +bVKMdVKifl+bgFyphl+qi164j2u5j2a+lGi+lmvCj2bAlGbHn2vPq3jPqnrRrnnOq3vOq3nU +rn3TrXjYsXzZtH7ZuofevoDkxYzhwoviv4vcwovjxJXZvYvdtonHon+9poHJyJTXzbHPza/S +0bLBx6Koj3ipjmezk2q+pnHGpXnOsHrWuoPmv43ozZrszJrpyJjuxpjoypnvy5Hr0KDw15nz +06f52Kf22qj32ar516j63qL+4LT65af/4r7/4rD/6Lr94bL95rP73rL65Kv73bH74q785bP6 +5rP44rD15rT24Lb24LD02Kv426bx0aXwxpvlvpPVr4jCoXu9m3PhxI/74bv857z96LXz27Hw +zpnjvozSp3m2jmiyj2jOp3nkx5TszpvjxZLv37H//+n///X///X///f///L///D///H//+r/ +//P///H///L///P///b///P///X//+7///L///D//+3///L///f///n///b///f///X///j/ +//H///r///H///H///L///v///r///z///r///r///f///z///P///7///z///7///v///j/ +//z///////z///n///3///z///z///j///////3///z///3///z///7///3///////////// +//r///v///j///3///P///b///L///f///D///n///X///L+/vHx8dLs/Nzv/t/1+t3y9tbk +7s7h6NDNtaGq0qrS1rXLzKXFzJvNxqnEyqXCwaLKyJ7Dwpy1vpDDwpm+uZXJyabBzZ7Ev5rC +v5nFvqC/w6HGwZrHw6G8v5q6s4ytrY+jpoifnnqboHmnsomvt4+vvZKuuZLDw6HDvpvEwJi8 +wJPFxKa7u5G8rpaqqX+tspKrr4isroyvtIuys5SyrYuvqYmprIyjq4iwtYqvtIytspCutZas +qYytroevr4ysr42sq46np4ahrYitr5CorYavsomSl3qjon2an3igoH2YmX2do3+Wm3mhl3yY +k3WalHqYl3qSkXGWjnWUm3GUk3yWjneLinKHhmmFfmJ4emGGgmWDfWV+dmJ4bWFMREc/Qz4+ +OjY/Pz86QztAQUA5RDZAQj88QDY+RD09QTY4Qjw+PTc7Qz0/Qzs5RTs/QTs9QTxDRTxkYT6t +iFu3kWvAlHHAkWvCl3G+kGzGmnXImWrLmnjDknC+jme/jHK9imy7jGy9jWq+iWi5hWa6iWiz +eWaDY1JVUE9UT0hFSUdESEFMTUZLUEas0Ib///////////////////7///z///7///X+//r9 +//X7//b///7+//j7/+78//X1/+72++/6++nx/+rf+NDl79/q797t997y/PPz//H6//L9//7/ +//n99/L1++/8/vb///79//Pz/eXz+fH2/Pn9//v///39//z5//P7//T///f8//f///X///39 +9ev0//D7/+73/+7+//77//T6//D9//v///bVcHs6RD4/QUM6QDs7PT86PjxAPD41QDg8Pj44 +QDdBOz83PDk7PTs2PTg5PDc9Ojs3Ojs0Pj06PDs8Oz09Pzs3PD08Ojc1Pjs6PDw3Pjg4PTs1 +PjhBPTs2Pzk6PTo1PDI+PD42Pjc9PTs2RDc7Oj06QTtMQTxSSEBXS0ZgVUdxWEt4XkqDaU6L +cVSWdVeac1mXe1yphlqohGCvkWW1jGavi2S4jmm8lWm+nnLFoXLLo3LDom/LnnLOpXDOn27L +r3vYsYTPsnras4TVt4PZuoTcv4flw4zjwJDgvY7jw4jiv5LZtYvOq37Lp4u8rpGtsJGnqIym +kG+nhmazk2e7m3O9pHTDpXvQrnzduorfxYzty6Do0pzxy53kwZLsxZHlzJj10J3w05n22qfw +1KH1z6PwyZzyypnz0p/42qn02KX13LH93bD23av326363aj62Kf23av21qH13qr+67b76bzz +2aPw26zz2qr01rHu06L0zKfrzJrov5rUrn/BnnXMonjy1ab44bH66bL13bDu0anpxprYtIrL +p4C7mG+2lnHcvYvsy57myJravpTXr4b4/tv///b///j///P///L///f///P///b//+3//+// +/+////L//+////X///r///D///T///H///P///H///T///r///n///P///f///X///3///j/ +//f///n//+////T///f///3///n///3///z///v///n///////z///3///////n///n///z/ +//7///3///n///z///7///////////j///7///////7///7///////////////7///////7/ +//7///n///v///X///n///v///n///j///f///L///L9/ero6tjc7MXy/uPv/ePv793j7s/d +6NTT3sDEn46txKXEz7bDzqHCxaLFxaPDxKrKzJ/GxqG6t5m8v5q3vpnAvZ+9yJnCv6HAwZjF +vJ61v5bExZ7Cw53BvJ2zuparqYGcpYWgpIidpYOir4mtupK0tJi3u5W6uJm2vZi6v5u6upy9 +vpq5vJKtrYyqroilsI6ut5Wkp4yuq4insY2oqY2jrYyoqoWnsYqqsYywq4uoroOvq4ulrYOu +rpGjroWtspOqrYanqYemsIqtsJOosY+jqIubln+co4KWoYKcooOWmH6WnICannyZnnybmHyR +jXaPk3SUj3aZlHiTjHOMkHCSjnOLkHCIi3OBfmyIhmh9gmaHfmt6emV/bGE/REFDQkA5Pz4/ +RkE3Pz9BQDw7RDk3QTo9PTk7Qzg6QTw8Qjk8RD87REA/RT04Qjs+QD08Qz8/STySgFK9lW6/ +mHO/nXDFmHnElWvHnnvFmm7Ln3zHl3HElnXHkWbDk3HDi3K4jGzCim25hGe5gme8hmiyhmSo +d2GKYFJzW0hqU0pFSURIS0ZGT0mnwnr+//b///////////7///////////////f///////r/ +//v///z///f6/vP///z6//D3//Pv+ujg9Nzm/9rz/+3u/unr9OTy/+zz9+fo+ez8//D1//j/ +//v///7//+/z9+7w9+b9//z////////7//P9//X9/+75/fL9//L+//n5++3z8erl8ePr8Oj1 +/uz0+Or8/vD29+z9/+z5//D+//T//+7Yen5FQ0A/Qz0/Oz8+PTw5PTk2Ozo3OTc6Pjw2Pzs1 +QTk7Pjg2Pzo8OzwzQDg9PTkwPjQ3Pj01PTQ7O0AvOzU+PDw3PjU8PjswPjc4Ozw3Ojk9Ozg/ +PTlBOz0/Pjk2PTs6PjY8PTs6OzU6QTk7PjZBQDs9RDxKSEBTSD5eUEJmVERzVUh6XkuDaE+H +bFCObFeZdlOie1+if1irh2CxhmKzhmW0jWW5kG+/l23Cm27DoG7HonHDnGzMpm/LrXPNqXjP +qnrWrnvYrnzauILUs33buITfwofkvYrbv4rcwI7cxInfvpDUv43QrISwlnWvj3WehGmpi2ax +kGfBmW/BoHHDpHfKpnjTsnzevYzqx5DwzJftzqPwzJftx5jtwpTuyJPvzJb00KLx1KLy1qTy +1qPz0aDyz571zqrx2KT21qv316Xz26/226n73a753Kf10qnz1aLy1aTz2qz147D55LLu2Kf0 +1aP01aX10qfvy5/tyJrow5bdsIjJoXzMsXju1p346Lf857r44q/11ajmx5bes4zEnXzAknSy +j27exorq0J7lwZbWuIfBrofx8cX//+v//+79/+j///H///P///T///b///L//+3//+7///D/ +/+7///P//+////v///D///X//+z///L///H///f///T///T///T///f///T///v///n///X/ +//X//+7///X///f///r///v///////r///7///n///z///f///f///7///r///r///r///X/ +//v///r///v///n///////////////z///7///j///////r///3///n///7///n///v///X/ +//3///n///j///b///v///P///b///L///b+//H6/eHk6c3n9NPl9s/1/d33/eDz8dLa3cbj +58XS27qysIy6uJy/waG5xJvGwqbDy5zQzKXDwZPBvJu5wqDDu5q7w5jDw5u7wZjHwpy5vY27 +u5C9v5XBxJu9u568uZewroyip32amoWbmnyiroaut4u8vpS6vJW2tZG+uJazu5a7upW1vI+2 +uperqYatpYebnoKlp4icqIWoqoemqX2jrI6mqIOgq4emrYWtromsr4SsqYmqrIelq4SsrYWt +qoWnq4mlrIWqqIioroajrJCrsIWmq4Sln4WUnnuenXyQl3SbmXmXn32gnnuPlnWblHOUlXqa +knKOk3aQkXaOkXSUk3SNhm+MjW2IhGyAhGiIiGV5emCAe2h1dWV+cF1FQkE8Pjk7RDs4Pzs9 +PT85PjZBRT86PjdAREI+PjdBQj4/PjU/Qj1BQjs/QD1AQzs7Qz09PztcY0Cpi17Cl3LEn3PF +nm3KnnW8j2zLmXbLnXTHnnXLoXTIm3fLmnHHlnTGjWy6jGXGjm28hmy9jWnDiG20gGSsfGCa +b1eKaE+Ma1NuWEtXU0ZJUkeluXP+//b///////z///z///////z///////j///r///v+//L2 +//H4/+z6//L////////6/fzy/enq/eTh+NPt+efj8t3i7tn1/ejx+ev69evp+ez2++rl9eD2 +/Of+//j7//n7//b///T19+77/u78//L09eH9/vr///34/+/2/e75//L9//v///////////// +//n///74/+r1/u7///f+/fH8+evddYJFQkZAQkE+Qzo7RTc6Qzs/QD0/Rzw1PDs9Qj09PzU5 +OzlBQzg2QTk7Pjg2Pjg2PTk6OzM9PDYzPDc6OT42OTc6Pj03OTQ/OjwwPjQ2OTs5QDZAQDs0 +RTQ/Ozk6PDk8PTo+QDo8PTo7Pzk/QTw+Pzk6QTxDQD1KRz5WSUBbTkZhTUNuUUh2W0h/ZU+D +Z0qLaVGSdVGcd1mYe1ireWGlhV2zhmWwjWS8j2q9lm7FmHW9mmq7l27IoXHNp3jOonnJpnTR +qHjUr3XVtH7buYXbuoTcwo3hwojfxJDaxIvhxpLYwI3Op4m+onHJr3qsim+jhWarkWS6lGu7 +oG/LpnbGpXfQqnjSsYTfuofixJPtyJvtxZ7mxJHtyZLlzZrsz5zuzZfuzJrvzZvz1qHw1aPy +0Z3u0qnsyJjy1KXt1J3z0arz2KT126z32Kfy0Kby0p3yzqPtzpTwzaXx0qHv0Z7t06Hx1aD1 +0aXzzqbuw5rkv5XXr4bGm33Jq3fv2pr55LH03rH02KTuy5zgwJPXq4i9kHi2iWvDsnDq1Zns +0qjju5e+koKvq4Lx/N3/+u7zxMHy8Mn//OT//+3///j///X///n///P///P///H///T///L/ +//P///D///X///H///H//+7//+7///L///D///b///P///T///T///n///f///n///X///L/ +/+3///T///j///n///v///v///3///r///7///z///v///j///z///f///v///n///P///n/ +//////3///b///n///v///v///7///r///v///n///v///f///////v///z///f///z///n/ +//7///L///f///X///L///D///f///L+/+f3/t3v79ns9NPn59Dl9M3x/OXz8t/m5s3PxrDJ +xa7CyKy9yqW5v4rFw5a/x6jKxprFxqXEwZ+7wp7Bupy/wpe8w529uZS/vJe2vYvBupO4vJW+ +vZG6wZTDu5u0tYqur5KkooWnnX+PlnqZpXykromvuJG7wZu8w5zBwaK+w5W0uZS5t5S6tJWp +rYunroiusYqnrYerqIqmqYSqsYypqoirroqiqoGtrIqqsYeorI6lrICmr46nqoWsr4ivq4yp +rISgpoampoOjqIWjqIanqIWjqYGcnoGZmXibnHycnnqYmXWfoXqgnnabm3yPl3icm3uOk3aZ +k3aPlHKZj3eNknKXk3KNkXWQkXKHjGyEfGp3fGZ8cV1xblpxblZGQ0I9QTg9QDg8RDw9PTs3 +Qjk9PTY5Qz86PjxAQTo3QTU/Pj86OzU6QkE+QDo9QT9DQDlGV0KWh0u+mmvHo3bKqXjGnHHE +mHDJlm7FlmvJm3nInnPOnnPGm27HlXO/iGfDjnLFi2vAjGm/hmW7imW8hGmyf12ogF2gdluW +cleQblSEaVRwW0VhWUWcr2b9/+j///////3///////3///z///////X///v///////r///z/ +//////j3//Dw/+j9//T////v/+zj+dPl8N/q/eHp9uPu/+/3/vP///nx/ev2/u////7///fx +/+P+//z7/+3z//P6/fL6//X///D6//v//+/1/+/+//D8//f8//L7//H+//Pu/+////7///v/ +//7//vn///f6+/D2/+r5/+bYgH5KSEE8SDg8Qjo8QjQ6QDs5Qzg6PTo7PzQ8Pjc2Qjg4PDg7 +Pjs7QTo3Pz46PzA2QTo3PzY2RDw6Pjk6QTU6PTMxQTY7PjczOzU7PjcvPjA5PTY1RDM1Qzk6 +QTI6OTs4RTk/Qjs3QDc9Pjk2PTY+Pzs9Qzo9PDlIPztCQjlPQkBJR0BXTEJeTkFmU0Z0Vkt7 +XUd7Xk6BZU+QbVOVcVWcdFyae1aogF2niFu0iWa0kWe8jGqyj2XCkm7Anm7Am3PGom7Mp3nP +rHvQr3zVsHvbvIHaxIfiwIziwo/fw5HeuobNsILGrHvQsoC6lXO0oW24oGjCpWzDp2rJpnHM +sHLYsXrRsHzhwYjhw4rlxZDiwYrqxYzmxJDtw5HnypDsxJXpyJXmypXlxpfkxZLowpnlwpLp +yJvpyJrvzJrqy5zsy5nsxpvqxZ7rxJ7ou5fqvZnhvIrfuo/htonivJTivY3lvZTktInmspHf +rYTUpYXKlXe6k3TEtnXhzJHtzprrxZ/ivpParo7Mn4G1nHC6wm3i2Iru1aXlu6LVnZSzfYKN +jneEqJJ0o4t9mYG5pLLu59zr79P9/9L//9j//9b//+n//+n///D//+r//+z+/er+/+X//+3/ +//L///L///P///P///D//+7///D///P///L///z///v///v///j///f///f///r///P///L/ +//D///f///b///v///7///n///n///7///z///f///v///3///7///r///f///j///////z/ +//3///r///z///n///7///z///////v///////3///////7///3///7///z///n///7///n/ +//v///f///z///b///v///b+/vD1/+b9/u3v8dfh8M7Z7sjm8tTt/Nf8/+Xy/uDu+djc4rrK +1azDyaPEw5vFxqnFx6XFyJ/IyqHEwpzAwZ68vpbAs5K3v5G8wJW+vZPCv5O2wJjDv5u+xZbE +wpu9v5y9v5qvsJOsqoqcnn6coICUo32oqoe5uo+5uZK6uJa8v5i8wJW6vZq4vJeyt46lp4ak +roinr4issIqirYOqpYSksYirr4mlrYmttI+irIiqro6jp36qqYmkroWlrIykrIWpsZCqrYep +rYqmp4OgpXyjqYOjqH+hp4Oeo32Slnqbm3qZnnmWnXOZoXqYnHuWmHSUlXaRkXOQkXOOknaW +lXqOkXeRk3aNknGVk3KMk3OOiG95iWWCg192d2BwcFlpaE5IS0NAQD04QDY9Qzo8Rjo+Pz06 +Rjo+Rjo+QTs+QTg4QDU8PTg9Qzo+Qzo/QkE9RTpOZEKYgka7mGrKnXHPp3/MpHXLpHjIn3PP +pn3OnnHNpXTLpXTCl2rKmHHLlnHJknHEj2fFm2vAkmfBiGe6hWS1gWG1hF2rf1ybdVuYcFiN +bFaGZk97ZlFoV0ylrl36/+////n///r///v///////////////j///////j///////r7//T6 +//H9//j7//b3/+3w/+fy/+rp/9zs9ebj8d3o+9z///j7//Pz/+76//3/////9/T7/uv1/u79 +//n///7///////37/+z6//r///j8//T///79//X7/fT8//3////////7//L1//H9//f///7/ +//////n///j+//Ty/eegWHpCRT8+RD87QDpAQjo8Qzg/ODg9PjpAPjo7PDk6Nzk+Nzc5Pjg6 +PDg5PDY7Njk+PDc3PT06QDs6PT49Pjg2Pjs5PDs1Nzs3OTo2Ozo0OjQ0PzI7PTk1QDU9Ojoz +Pjg3OzcyPTM5PDo2Ozk9Nzs5QDs5PD40Pjg9PTs8PDk7PDs9PT1GQD5MPj5OPkJQQEFTQ0lc +Q0ZaR0VjS0psTU9yVU18XVSCZE+KZ1aOZledcWCeeWCrfGWthGG3hWezh2PFlHC+m3DPpHTP +rHfVr4bXtIbYtYnWtYTZuoHcvIrcwYvevI/YvIffv43XvYXZuoLYvIXcvoLZvoHevX/evInh +yInhw4/jyIzqw43kx43oxpLlw4ruw5LhwYvqwo7hwozjvZDcuIzitIfWuYriwInevY/WuYvc +t4reuojZuYPfuoPcuIDbtoLfuoDivYLmxY3pwJbfsovXqofUqX3Rpn3DoHPIoni+oXDEpXjL +rXLauYnduobetpLcsYnNnIXAqXjLrXzRmoeucHuAZ2GSiHKEh3OZtZKHuY6EraSFrrF8laV+ +kKGAmp6HtaqVu7mLubB0c3qOfZHLscfNwc3QzMLU48vl6NL2/Of9/+v5/+f3/+X7/+///+7/ +//H//+///+///+z///T///b///T///P///X///n///z///3///n///P///T///X///T///v/ +//H///r///X///7///v///////3///////v///z///7///j///////3///r///j///7///n/ +//////z///////z///////7///////v///3///////////////////////3///////3///n/ +//3///j///z///r//vT99+bi583f9dTp+Nvr9dT0/OXu/d7o58TN6cbl9+Dr8tjt89nc6szh +68fR0qHDyKe7wZu+uZ25vp25uJW1t5S2tpC1vJS7t5K/vZHBu5m3t5LCvpm+wZfExZvBwJPC +w5m3tZOur5CjpoChooKUmH2bn32dq4Our46uupfAuZmyuZC3upmzupC1tZG5rJCjoYelqIio +s4yrsI2ssYenqoWproimsIerq42rsY2gqIuksISnr4mosYatq4umqIOnq4uprImurYyprIav +ro6iqIassIulqYWio4iip4Kam3yPj3WTnXmbnH2YnnyVnHmVl3qVkniXknSOjnWSi3GOknCR +jHSNjW+VjnKSj3CTjnCOjXKQh3d9fWZ+bWNvb1pwZ1ZaXEw/QT86Pzo+QTo9RDs8Pzk/QTw+ +Qjw7PTw8RDg8Qz04RDxBPz04PjtFXj2Hg0i2lVrHkm7JmXXUoH3To33QonzMnHTLk3jKnm3O +oHjPom7RpHrSn3XNm3bKnnPQnHXMlG7MlnDQmXXHlG/BiW7Dh2m3fGareF6odVuVbFWcalR+ +XlWFaE2EaU+Jc1X0+8H///z///////////////////////r///////////////3///////// +///////z/+/0/+/s/+rs/9zz/u7t9Ojj/tj+//X8//n6//T7/+/6//X///X9//n///7///// +//n9//3///P///7////////9//L7//f///7////7/fL5//X///7+//j///7///////////// +///9////9vf/vu9mSlxEQkE8Rzk+Pj42Qjk/RDs1PjJBPTg2QDc/QDc1PTs/Pzk2QTk5Nzk4 +QDs4PTU6PTU1OzU4Pzo7Pzg8Pzo7Ozc8QDg0Ozs3Ojo6QzMxPTY+NzY1QDo7QDQ1QTQ5PTgu +QTg8PjkwPTQ5PjU2QTQ7PTk2RDhAV0I5Sjs6Ojg7QDc7Pjg9SjdBSzlCSDxHRz9FRz1HQ0BG +QT5IRkFTSUJORkdXSENcTUhpUktwVlF1Xk+BaVSLbVOPclmYeVujfF2mh2Gvjme3lG3DnXLC +p3PJq3nPrH/RtIjZuoPcwIvbw5LjxZTjxpPjypPiy5flxorgyI7pzZHozZPoy4/szZTtypvm +yJPozY/oypLrxJrfwYTjyIvrxZDqwJXlworkvI3duojhuYnatoLfsYbSsIXbsYPVsYTVrX7c +tYbesIXeqoLXq3/Xp4DUoX7RnnvIjnTFlHO/jnW8knbAjHW9kHC5jnS9lnXGm3nKnHjLlH3J +lHzLi3+zfW+lfG+Pdmh1gWVmjVlqonN5kJhnfY5fcX1ib2hziIGAm5SEoq6OqbWOrreJrrKE +qqyHq7GOqbWSr7uQq7iQrbiGoq6DiKB9qITB473f6dHs6drq79v0/+f0/+b5/+P//+z9/+z0 +/+b//uv//+n//+v//+///+////D///H///3///f///3///f///T///n///b///b///X///f/ +//P///f///r///7///////3///j///////v///v///f///3///////////////3///3///z/ +//////r///3///z///////7///////7///////7///////////////7///7///n///7///n/ +//z///X//fn85+be5MzV8s/q893t/970/+v69uLu/eHw8tfz4t3c3cTo1dbU48fc3cLb4snd +5cvW0LrEr5myvYrAwZa7xpO3wJe5vY+8v5S9v6DCwJK2vpfAuZm1u5DCv5bAv5i+w5TAt5a4 +sIyyrYymnYqbnX2SnX6ZqX2krIqptoyxu5mwt5GuuJWst4qttI2wsYyyqJCfo4Wkq4imp4mg +pIelqomkrYmmrIulroyoq4qoqoekqoWlrIqqroqlroelroaqq4inq4Wip4mlqIKlqYSnqIWl +pIWcpn+ho4ShpoKjoIObmnuOjHqTnHGZlniZm3uXl3iWk3WUjnSLjm+GiGeLi2mKiWqIiWiM +jm2OjGyNj2uNjm2QjXODgGh9cGFpbVZzbVdha09xZlI9RT5BQz84QjpBRT45QT5FPzs4QDpC +RTs+RTk6RDg7Rjo/TDhVbz+ejUy6mmbBm3DNpnPPnXfOnXTPm3TNnnPNm3DIlWvJl3TJl27K +m3bOnW3On3PPnnDVmXzRl3XJlHXJlmzEknXCjG/AiWjAiWa8h2ivgWCtfVyldlmXaleJZU2M +ak2MelSGu1jy/7z////////////////////////////////////9//n///////////////// +///////8//P1//T5/+n+//v5/+/x9+v1/+/6//Lz/fn///7///P9//f+//H7//D9//b7//L/ +//799+/h8d7pictoRFhUS0Y6QDxDQj81RDY8Rj1BRTw2Qzo7RDk9QjQ2PUA/Qzo6PDk7RDg6 +Ozs6PTs1PjI/OzcuPzU6Ojk1NzY/Pjs1Pjc/OD02QTRBQT82QTQ6PkAzPzI6Qzw+Ozc8PUA3 +Pzs2PzY6PTo2PTc8Qzc1PjM5QTQ6QDY2QDo3RDs6WUZKV2RRSF9NRk9FXUxbm3mXxrSryMWk +xL6fu7uLrrSPtLCLr66btrOWna2Eo5qKlp6TsZ+Vuaiss7Sag6ZnhHqClIxud3heYmFGUVBL +SEtESURFRUI+RUA+SD9CRUNIRj9NSUJVSkNbUEpnV0xwXlV1YUl3ZVV5ak5+YFWDaU59Zld5 +ZFJ4Y1J9ZE93Y1F4Xk9vW01yV1JqV0xrVFBiT0ldUk5bR0ZWS0lVSUpOSUdOUkdKU05VbFJs +fnlrh4xwhJNugI9vh4txgJB1iJBxiZh1hJV2jZNxi5h0jpx3i5t0ipxyjJpxj5t2jZtzjZt2 +i5V0lpx8laJ0iqB2kpx+nqaClal9m6KDlqR/k559jpx2lZ57maZ9lqh6laV7lal4lJ2Hqa2I +oaZ9h551fZFscIVgZnZYWWlUTV5RZVmGxITF6cXr8uPFpsR+ZHtshmauu6uknp7C77bx/ub4 +/+n9/+r9/+n8/+r+/+3///L///T///j///j///H//+7///H///L///f///r///r///////n/ +//3///r///f///n///r///L///j///T///n///r///j///L///n///T///z///j///X///j/ +//P///r///r///7///n///////////////////////j///////z///////j+//X9/+3w7tvf +3MXQ1rzO0bjB2bbS3MXS89rl8tne8dHl5dbd49PK77nv9ubt99rs6NPNu6GxtZKjrIKvvoy5 +r5KzsYuzs463tY61tIqvuJC3tJmvuJK3upivuJW1sZSus4K0uJGvsIiwtIyqsoetsY+pso+s +uZGto4ibnYWRkXySlniiqYOqqoKlrIapsoKsr42nromqrIevtJCgpYuglYGbpH+iq4qjsYer +r4efqoqnq4akqoWptImorYqqroOhq4ioroSorIejqYifpoahqoWnqYujqYGlo4Kdo32cnoOW +p32loYebo32frIScpYSel3yNiHOKi3GOlnSZknqZmHaRlHWZmHiUl3aan3eZoHebpIGho3qc +nHqcl3uRiXiIfWl9gGF/cmB0dF94blxtc1lxbFpsZ1ZcSlNNRUZERkI/RjxAQD9ARD8/Pz4/ +RDdAQjs/RDxAS0BbdEGmg0+/k2DKnHLOnXXFmHHKlm+vi2TJj2/CkWzMmW7Jl3HMlXDUnXLO +oHPPnnbNnG7Tm3TMoG/PlXnHk3LOknPLk2rKi2y4i2a7jWu1g2e3f2SwdWGqd1qhb1uJZ1SU +a0+UbVSVilTq/6z///v///////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////3/ +//79//fy/+nr/+Dv/+f2/+/w/+vx9+zx/vn7++vz++39//f9//f8//P5/+j8//b7//D7//38 +/+v+//uUUGRNPUhIQT8+Qz5CQD86QTk+PzM/QTc3QDg7SDc7PDo0PzQ1PD08PTUyPzg9PjY2 +QDc6Pzg0OzQ9PTMxOjJBPzsuQjg/Pjk0QDk+QjQrPTY8Qjw4PTk2PTg3PDg6Pjk7QTs5PDQ7 +Njo6Pjs9PjowRDM8Qjw3QDc2PjY2RTg6PDk6RkVDQ0Y+RUFAR0JglnuGrKmmzsKz1MqpyMav +0se42NPD3dbE3dXAzcqOs6+ZmqlrkYuGl6Wwxbe4w792e4tufn9oa3Zog3ltbHFOUVdESkpC +RkNDQT0/RUBBRkJBRT9CRD9CQUFFRT9FQkFMTUFUSERYR0ZPS0paVEhXTUdaUkhVU0pXUEZa +S0tVT0hRTUpKSUJSSElKSj1MSUlGTkRRTklJW0hmf2Rbbm5kdXRmfoJvhYpqgItte4ZufoVv +f41ugoxqfotrfo5sfopwg5JqfI9ri41wi5V2jpp2ip14jZ11hZpwipRzhJ1yiJF3i59xjZV5 +k6Fzj514h551kZx6kKJ3lZ17kaF2k56Ak6l3kJ57lqh/n6V8lad4k6B0j5l4jJxldI5gdH1Z +aHlPVGZOTVRMR0lGRUhCSUZ4nG3A07fb69a1n7ZeWVtlbl99mnTF08Dd8Mjz/eb7/+/6/+vx +9+P3/+n///L///H//+7///P///b//+z///D///D///X///X///f///f///j///f//+////P/ +//n///L///b///X///v///P///f///n///3///f///L///D///T///v///b///z///T///r/ +//f///j///j///j///z///////3///////z///j///7///T///v///P8/ezu8d7a4czP2MTJ +1sXF0cHF4sPb5czf7dHd6c3Z6tPf7NDa08LE8sLr8d7y+dni5M7GuqK5vpO1vZWztoqus5Oz +tIq5vpm8tIuvu5Wxt4qnrJStsYyuto+3tY2rq4yvqoivs5ayto+1uYivrH+vtJCrsImxsI+q +p42Xkn6JkG+Zpnqfq4Kmq4assYitqo2psYitsIqvsYqoqoyjpICVo32hrYijq4mgq4iipYWi +q4ikqYigrYqprX+mrY6qqomjpoamqYmjqYWtqIeiq4WipYCjoHuiqYWnq4edpYKbp36mpoqc +pX2goISdpIKco4GSkXuLhm+JjGyXm3mZmnaam3uboXiamXqZmnmZmXqapXuflniWknKQiXCO +k26Mg210dmOEe2Rybl10bWBvcFh1a1psdFdyXlZCQjxIQ0M8RDhCOUI8Qzo9RD87PjU7PT4/ +PzhCREBnZ0ajglS5jWPEkm/NmnbRn3LOnXbIknCsjWbEjGvIkmnQoGzKoG7Qnm7LnnHLmG7R +pG7LlXbKmnfTmHbJnnPSj3HFjGnPlmvAi2m6gGSzhWCxfmGtfGGrdl6mdlmRbFWKak+Qa1OW +b1THyHX///f///v///////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////v///38 +//jt/+3t/9/5//T4/+7y9+b0//T5/+72/un5//n///fz/ujz/un19eHv/ebr79vHYWRETEBN +REE0QjhCRDs6QTlKREE7QzY7Qj02PzhBQzwzQzNDQz0yOjNAPD05QDg2RDI9QTI9Pzk7QjQ5 +Pjc9Pzk4QjI5OzY7PjM7PDY6PjA5PTZDPzdAQj1CPTg2OTg+Qjo2QDpCPDozQTc7PjkuPzhB +QzwyPTtDQDk8PDpCQDg9Pzw9QDU9QUA9PztCRkN3rJGuz8XB2s621M+90tCv0sq/3c3J4dHL +39LL3NHC3tHE4dDA18y92Mm/29C50Mqww8KPj59wjYaKp6GUs7ehwrqv0MrA2szE28yxycCv +zMSvxsKsxb6errGWv7OxyMK50MfA1ce90cO408e/2snH1M3F4Mvd7djR6NXU5tS30cu21cfD +1s2zysixy8aXoLJ1h5dnhpBziI91iJhvhJFviI94k5eCkZ5tgoxYV3JJVVtRUltGV1lqgHxv +i49qgo1wiIx1hpl2k5qBlJuGnaGEn6l9k6aFmaCKpKaOqaqOrrd8kJ1uiJB9n56FpKh2lZh9 +nJiEo6aKp6h8k6Voc4tZanJtiIKRs6+JrLGYt7OgurudtLxxgZpgcYJSZnBLRlA9RzpERkZL +ZEGcsJKfraZhVWBGSUpHUEhibFtOTExNVkiBonHT4Mbz++X3+Obr+9n5/+b///T9/+P///T9 +/vH1/eH//+////f///D///T///P///b///X///3///T///v///D///T///T//+////X///j/ +//b///T///f///X///X///f///f///z///n///f///X///n///X///f///j///v///b///X/ +//n///b///r///b///j///P///L///D+/+z4/+bv7NrU5M7S48jQ3cPL177M4LrQ28bH2MHM +3LrV38LO28PQwr3S4MzWwraz267Q89Hc58S+tJmqp4iytpKzsYmpsZCwr4i0uZC4uZO5vZOu +uYutsI23tZCut4atr4yqq4CnrIOtso24uJa8tZC1tJi1tJOttpK1r5GssYWdm3mFkG6bnX2d +qH6tqYOjrYitp4ekpoWqr4GqrIymon6om32NlXubqH+orYWpr4Wts5Cuq4emsoOutJOksYqu +upCssoqrrX+mqYKfqYanqYCmqYalqoGipIOjp4Gnp4Cko3yio3qhqoOeonWaon+fnHmYnn6e +mXqLiW6NiW2Gj3GZmnWZmnenmneVmXacmnyWm3OZlnuWk3ONhHKAgGGCdGKBeV+FemSCeWJz +blpzdFl0a1hyaFVua1ZzbFZOSEU9QjhDQjY9PjlDRTw7PzdBPzg7PThAQD0+Sz2WdUuvflay +h1zAj2nFjW2+jWbBiWu+i2PBiGe/i2TAjGekg1nEiGXAkGnLmXfOlXLMl23Ml3DLm3PIm3PR +oXrRo3jLnXbIlnDKiXCxfF+3fF+1fV2xgGCve1uzfFyWbVeLZlOPbEmfblafqGb//+T///z/ +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////v///r///v///n///37//H///71 +//by/+Tz/Or6/+/3/+3y/Obi7d/4+uz7//X8//j9/+v9//33/+vw8uvu799fSVA+Rj01RT9A +RTg/RkJEQTkvQjxBQTo1QzdDPjgvQDdAQDg2PDo9Mzc2PTY7Pzc2QTkyQDc6QDQyQDA6OjY0 +QTA7PTgzOzExPDk5PjY1PDwuPjQ7QDc2QDg7PjY1QjY8PTg6PTs6Pjg7PTw0PzQzQTc6PTg2 +Pjo8PTU1QDo6QDU4Qjc5Pzk7Qzo7PjU3QztXjHqpz7610Me639C+086y1snA2NK628zC2M+8 +2cy2z8mpwb2dureTp6Z5doVcUmNOTVVITVBqkoaHp6mOsqygxLiv0cnA18+50sqzzMSwzMiw +18a5zcaQqLGTsrCaxLywysS628/O4dbM5dTQ49a31cvQ5NbP5NXM4dW+2su8283B3NHH0suU +oLF2iJJuhZVxh49wiZN4iZVwiZV3hJt2kpeAnKN6kJx2j5t6lJt3iZhTaG9GSVtGT01eYnBl +e4JydYZjdIB2fYhyjJB7iJZtgIxziJBvhJJye4xea3xZZ3RTX2tRXGhYX3BSX29OV2FOWGdP +WWFSWmRRWGJQXGdMVWJRWGRacnNreY5jb3pda3pPYGxVaW9UXWVIRVQ9STtOWVhKSU1aXltY +UFdIQ1BCQkM/Rz9CSUFJUE5KS01KZkWx0rDP5cDz/ujt+OPr/eH7/+v//+3///P7+/H1/N79 +//L///f///L//+v///H///P///H///X///P///n///b///b///H///X///T///L///j//+// +//j///L///L///b///z///j///f///f///j///f///X///n///T///3///T///f///X///v/ +//j///n///P///v///H///L8/+fv+9/r89/g69Hb6dLZ4MvH0L3M28LY2M/Ez7XHzb6507S5 +2rW+paivxbTK1sSoxK68xaq73r21oY6XkIOdpoWqqYuopoOkrIavsIK3uJGsto60r5SrsIWv +s4+vtYW2sZKtsIetrIuruIqsrIykroerq5KtsouxtIqssYirrY2prYmciXuBkm2YpX6cpIWm +poqjsIqnq4WiqYmiqYCrp4CgrIecnYSeoICWonyprIeosYurroehsIaorIuiq4uurI2eq4iq +r4adoYWgrIKmrYGrp4KeqYaqp4akp4SqqoOfoX+pqoWpp4CWn3ydon2doHyhpH+inoCYkniL +h2uGhmWPkXSSnXeel3ygnnealXGajXeRjXSRkG6Lfm19eWSBgGR6fV2EgGSDe2F6b19wcVd3 +bVlscVdpZ1Brb1FoWVFGQ0E6Qzk3RDc7Pzk+Qjo7QzY7PzU8QzU3RDV9bUilflm2hWO6hmDA +hWm8jmjBiW68jmS+h2a4iGLHjWy4i2aog12/i2bLlmnHmm7MoHjImnrNo3XRnHjNm3TMmXLN +k3PMk27DkHO+hW20fl6wclumdlavf1qxel+nclmTaFSGaUiTbVSPbVLM1YD///D///////// +//////////////////////////////////////////////////3///////////////////// +///////////////////////////////////////////////////7//f2/u78//T///j3//Pf +99f1/u77//fu9ev7//b///79/+35//D1+ezz/fL19/H///7///3j0tJSRkk6QUNFQj41RT9E +Rjo6RT8/QD86Ojo7RTc1Qjw9QDM6Qjk6QDc9PzczQTRCPj41PzQ/RDpCPTw6PTY8PjQ9OjY8 +Qjg4PDw2RDk/Pzo0RjM4Pzc9QTg8QD05QDs2PTw1QTY+Pjs1PkE2Py80QDo6QDo6PjY8PTYx +QDY6PjkwPTg9QTs0Qjk+QTwvPzk6REFDX12Pqqeqz8O61Mu1zse5zsqw0Mi0xsamv72gra+F +lZp3eIZkaW5VTlpQTEtARkdDSEJBSEhlhHyDoaOJp6yZurmlxby1ysawycOvzsaq0sPI4dTL +4tO/082Vu7uQr7SPrbKWtLifw7+/2NPA1c+/2cvE4s7H29LK5dXF39S50s+dp7d2g45tgY9v +i4t0iJV4jJN7lKB1h5h0gY52i5KCi5hyiYyHlp16k5p9lJ19mZ13hJVJYG5FSlBDTU5WTl1H +SlNRTFdKT1lYW15TWWZOWWhQWmRNVGFRVF5DTltOT1hHT1VIT1VETU1JR1NFSU4/QkRCREtB +Qj9BQkw+QkBFS1RFS01JUVlMT1hQU11OTFRLSVZGS0tHRVRARkM+Q0NAQUM9RUJDREhBRUhD +REVCR0FGSkNER0RJTEhITkp5pWPIy8XN7sPu++Du+ePx/eD8/+3///P8/+32/Oj7/+r///L/ +//b///H///L//+7///D//+/9/+3///T///T///H///T//+////X///X///X///L//+////b/ +//r///X///f///r///f///v///D///n///j///r///X///j///P///j///X///X///n///n/ +//X///D///v///T+/uz7/+by+OXq9dfo8tbf5dLS38/C17vV7tDc2si3x7W5uKeyyrWwxqei +goautqS6qat5c2J6hHeZnZCFjXGFk3CjsompqISrrIaqsYa1uY+5wJK7uIuxtpGrt4urs42x +tZetsIizuI+vtJGuupGrtYyvsZOor4yvvpqnt4myuZOttYiwr42Oh26KlWySoH2iqoKjrYem +qoaeqoqiqIWjroSor4ecpoaboIGPnoKgqYmhrIeoqoycpYKiqoagq3+iq4Sfo4GkqYWlqoWm +poClpX2kpH+fpoSir4Sip4KfpX2fp4Whq32eoombqYCdn3+eon2dpXmioX2gpXybkXmIimaE +gG6Pj2+bn3yVnnmdmHiSkWyWj3OPjWeUiXOEfmOJh2aDgGKKg2mCf2F9cV9yb1VtcllybFhp +aFRxdFR6clpgTFBBRj46QTdBQzk5QTZCRDs6Qjk9QTs6QThUWUGZd1KzhGGvjWXKjGq+iWTD +ime0gWC9iGK3gGO4gWK2iGm9imeggFrEj2fIlHHKm3LOnXjOnG/RoXPEmXPMmWvOmnTKm2zH +lnS/hWq8hme5fVyxf2Sue1iyfV+veVuecV6TZlKCY1GRcVCHclrr/rf///////////////// +//////////v///////////////////////////////////////////////////////////// +//////////////////////v///////////////////7////////////+///2//Lm+uHz/+f+ +//v6//Hv++jy/eb4/vH3//b1/+/w/un9//3//+/z/uPl6tnWX3xERUhFRzg/QTtAPzs/RT87 +RTo6Qz48RDY4Pzc6QTg6Pzs9NzgySDg9PzsrQTc8QTgrPjg7OzYsSDc9QDQvOTY7QjU1S0RB +PzkzPDk1QjQ6PTo1QDU7QD43QjY6PTsxPzU1QDkqPTc7OjY3PzQ7QDc2QDU5Pjk0QjY3Pzc3 +PTU4OjQ9Qjo1PjI8QjU5PTg2PzpCSUlgh3ueuK+ovr2fs7iZra6Tq6iOoqCJmJl1fIVqXHBV +TlZPSk9AREFBRkE+Rjo/RjxAQz5OUVlseX17i5SFnaGex7Wrw72mxb+q1MPD3tLF4NXK49bQ +5dfG5Na+2dOv1Mit0cKjx8GrysOsycKuzcOtxMSqxsK1sciTj6x6gpBwi415jpd8hpV2b41l +YXpiYG9SWWlZVGZWVWNTUl9TUV9PTFxXUWFXVFpWT2VaVWxdUmlLT1pBREtERkZERklDQktB +RUFCR0xDQkZHSUs/Q0VFP0tAQUFIR0c0PkJGPUY7PkU+QkQ7PT5BQkg5QUBCRUA8RDxBQUA8 +QD47QD9BQEQ/Q0FAQkBCR0Y/QUVBRkk+QkRBQEQ/QUE+Qj88Qzk9RD85PzxAQEA+QTtCQD47 +QTo/REBASTtNTkxLaEWzz6WptZnb79Lo8d7p/eD1/+P9/+j9/u/2/+n9//H///T///L7/+z8 +/+n9//L8/+3//+////H///T///L///P///L///T///X///T///T///n///P///D///L///f/ +//j///T///v///f///r///X///n///v///f///r///f///P///X///j///f///f///P///H/ +/+////H//+v8/uj2/OLw9+Tn69bc287F0rzL3cTR38rL3bvT0cC2sauLgHyhuaypvqSglX2a +mZCEbWl0cmNyd2F+gHOChm6Knneqr4OorYWqp4WlroirtoyrsZC4to+vr5OutoyssZGssYKi +rH2stIewtY6ntoSrtIqmtIakpYOdqIimtIyjsY+mq5Cdon2GgmiQpXagq3yiqICkq4WhrIGe +pYacon+jr5CppIeYnIOXmHuVoIObr4alsImlsYiorYSjqYiiq4aiq4eoooCep4CmrIWjpoGi +pYSioX6dpn6aoHeipoWjpoSnqoWorYajon+aonucnn6apXqnoX6ZnXibm3eSiHKHgWiIh2WE +kG+cmniemXiXknWOimuRjG2Th26KhWqFiGmKiWeLgGmCeWWFfWFub1V1dFpnbVZwbFppaVJv +aVRyaFZZSVE3QDdDQTs4RDc/QDw9QTk6RTo8QTlDRjlrZUCce1a2h1+4hGS9fWC2gWa4gV++ +hWS1f1+0e1+yfVmveF+0glqig126i2fIlG7NoXLUn3nOpHrQonnHmm/MlW/IoG/Jl3LChW6v +gGKzfWK1hWG2fFy3gl6zfFuqd1qdbleMZlKEZE2MbEuTslf//9X///7///////////////// +//////////////////////////////////////////////////////3///////////////// +//////////////////////////////f///7///////////r9//79//v+///1//Hv/9/r+uzt +++Dv9+f8//fz//L8//Ty//r5/eru/e39//z/////htJMTkdISEU2Rz9AREE+QjQ8QUI/PjY9 +Q0E2RTU+Pz06QTg7PT88Ojc+QDk+Pjc1PzQ8Pzs3QDk9Pzw8QDU1PDU2Ozg0OT09QD08Pzg6 +PDc1ODZBPz42Njs+PTk2QDtCQT81Pjk9PTcxPTc/PjoyPjhCOzg3Pjk+QDUzPDs5OTk6Pjw5 +PTc6PToyPTQ7Pzw+QDY+Ojo6QkBVWl9wfXyLnZaTqaaPip17b39kU2dXSFpNRU1HQEhKREY+ +P0M8Pzw8P0BAQTo/QUE8RD1BREdOS01VgGmoxLSmx7+qxr+wxsOZqraRsLSgsr2jwr2zy8it +wsWitLqXq7ORpq+Nl6aPraCQp6uQqa2Om6hvaYRXVWZRSVxTS1tSQ1xSS1VNRVRMQ05GQ05E +Q0pJQExDO0hHQUxAQkZIQklDRENFQ0k+Q0ZDQkhAQEZJREg9PUU/PUY6Pj1BQ0Y9QENAPkA5 +QEJBREA+QkE9QUE9Q0U9QEA7PUNAPT0+Pz48QEA7REA8QEA6QUI7REU8QD9DPD87PEA/P0U5 +PjtBQUI7Rz0/PkI7PztBPUE+Qz5CR0M6QkFCQT09Qz5BQUM6Q0A8QD5CPT08QkI6RD04Qj4+ +Qz5BQUZLcUis1afF2rzQ5sLe9dXw/Obz/+Py8+Pb5tDx/+r5/+f///D7/evw+uT2/+T8//H/ +/+39/+36/+b///H///H///H///D///L///P///T///f///f///L//+3//+3///f///r///j/ +//P///r///j///z///z///r///j///n///H///n///L///j///X///H///P///b//+////P8 +/+n7/+z0+urq9tvc59jS2cjHyrXF1L7KzsS4vKjHz8erq6R9ZmxwlW6QdX6IeoRwaWhmbWRv +eVx3dmZyhV2AenV7l2iWqIGlrIWeroWvroatt4atsoissIqusI6psoyqsI2tq4Wopomlq4Ct +rY+rrIiuuJmtt5Cpr5KkqIaapoamroucqZChoIOLh2+Mn3KaqISjqY2iqo6kq4KnqIGmqIGi +pISdoICdm36QmHmYpoOgrISppoWer4esr4mnsYKmq4idsYyqqo6mp4Sor4imq4morIygpYWj +poOhq4SkqYukp4ajpXyeooKkoXubnH6gpXaipH+koX2dm3+ZmHuZlHiSiG6MiWeKhW2MlXCS +lXmVkneOh3GNiWmWlXKOiGqRgWuBe2V9c2N6el93eGB0cVh6cF9za1hmb1l2aVltblVubVhe +T1FDRD87QT06PzdJRz8+RDtDQkA5QjhCQT9EWDqOcUuoeleze16wf1u7emW0hWC/g2a1fmGy +el+rd1eiblineli5imOlfWC+kmHOmXDNm3bQpXTQmnrJmnbKl3a/lHLHknXFimu6iGa0e1+1 +fWCte12yfGGqdWCrc2WXdFSUZ1OAZ06FbEyEeU3r+a7///n///////////////////////// +//////////////////////z///////////7///n///////7///////////////////////// +//////////////////////////////////////7///////////z8//bz//Hz/+L7//X0++n0 +/+j1/+ns9urj7N/7/vb7/evz/er3/+/p68+2XGNNQkZIRkE1RT09RT81Pzs6RDw6OTI9Pzw6 +QDY5QDk7QDk2RDw7PTkzPDs2OjgxOjM7Ojs0PTE+PT80PzI6PTkyPTE9QD8xOTM7PTsyOjI1 +Nzo3OzU7Pzo7OzczNzo8PDU1ODc6OjozPDk5PTs0PjUwOTg3OTIzOzU3OzY0PTc6OjUzNzY9 +PTkwOjk/PDw1PTo9PDs2QTxKREZISE1ZU1hWTl1STFFJRktDQkVEPkc+Q0A8QkA5Pzw+Qz45 +QDlBPEE5Pjo/PT48PzpAPj5DVkugyaaz0MW0y7+ztb2BhpN2i5B5l5SKo6Z2lpp3iJp3fYZv +dIRkXGpUUmZac2iAoZx4lpaEoJlqW3dORU9IQk1ARENEQkdAPkA+P0NAPEBCPUE+Qj1APEBA +P0A/QEA+QUE8QTw+PD46PDw/QT4+PTxAOUA+Pz1LR0E3Qj05Pjo8PTk5QDs/ODw4Pjc6QDw5 +PTxAPD8wPjlEQD02QDw+OT42QDo+Pjo5RD09PDw7PT47Ozo7PEA9PT42Pj89ODo1OTc/Qjk3 +REE9Qjo2OkA6QTg4P0A7QT48QT08RkA9Pzs9PT42RTk8O0A6PTo8OTk7QD0+Oz06RztBREc9 +RT2GtXe91LvG08bF38Hh89ji7tzj6t/S5M3s+9r7/+n///b9/+v3/+r6/+n//+7///H4/u3y +/+T3/+n8/+r+/+///+j//+7//+3///f///L///b//+3///b9/+b//+3//+7///z//+3///z/ +//n///r///r///H///f///j///b///b///b///D///L///H///P8//L+/+3///D+//D7/+Pu ++OH4+ufh8NLc4tbK2sLAwrPJ3r7Y0b+42bvGwa+coZRiZFVukG6FaWdXWVNUaVRqbltucmN3 +eWV6fmpxcmKImXelroCiqICisYWxsJKss4mrs4ulq4utsY2nrYCspo2ksIKmp5Cmo36krI2n +roirsYirsY2ls46ir3yWpX6Uo3uWnn6Vkn16kWacoYKmrYqjpo+lrIOkqYuprYacpYmppYOZ +nYGgnXiSlX2ho4aeqoarqImhq4qqqYmkqYeqqoSfqYiop4Smp4mhpIGjpH+ep4Gmp4meqYKk +sYWeqISkqoScqX+io32fpoCdnXqZnXelpX2VmXmcnnqanXWZkXiKhmuJhW6IhW2Oi2qXknWX +hm2Kjm2Tj22PhW+Ke2WCdWJ/cV97eV16cFx1b112dV5rZ1htZlhpa1BwaFdub1RxYllIQUM7 +PkA4Pzg7PztCQzxHQ0E9Qz09Qzs/RDhxYkScclGodVetdVateVyte1q6gGG1flyzdlundFOg +alWLZU2idVSthF2jfly9kmXHk2zFlWnInXLOonLLnXjGk3LDkG/ElGzGj3G3g2OydGKqdl2v +e2Gxf1+qd1uocViRak6SbUyDZE2FaEuavV////D///////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////7///////////////////////r///////L///z4//Tr/eHo+932/uv0/On/ +/////////fHt/Onx/vLz++Hk8tnehKBMR0xESEA7RT8/Ozw7Qz8+SEE/RjhDQz05Qjs+Pj01 +QDdAQD41Qjc6Ozo2RDlAPD01PDM5Pzs3QDM6Qzk2OTc5Ozk7OTY6RDs8QTsyQDo4Pjc6Pzk6 +Pz46PDk3Nzk7Pzk1PjY6QTozNzQ2PjkyPTU9OTUyQTg5QDszQzY2QTosPjQ7Pjw2QTJCPzk3 +PDM7Pzs1PDc9QTs8QDo+Pjw9Ozo8QTg+Qjw3Qj1CPzs5Pzk6Qjg8Pj07QzhAQjw5RDc8Pjo0 +QTg7PzsyQTg9Qzp6qXfV3tHE2c67zsBmXXBKRkQ7QUJHREM8RkRLSUg9RUNAPz49QURAP0A+ +Qzw8ST5ccWBZYGRSVltFR0tFPjs8Pjw7QTs8PD47Pz08QD07PTc+QDs7QTpBRkQ6PDU9QkI+ +RDo3QkM7PjQ8PT4+QDk7PDw7PzY1Qjk+Qjg7RTtBQTs4RDg6Qjs8QDo8QTo4Pjc/QDw7Qzw6 +QDg5Pzk+Qzo7Qjs4PzlBPzw3PjtARTs9QztARUM6Rjw/RDw+Pz5BQz04Qj07RDc3QTk6Qjo+ +SkM3PTo8RD03Rzo9ST44Qjs9Qj44RTg9RDo5Qzo+QDw6QD4+Qjg8QUQ+Pzs9RkRLWz6hw6W3 +y7KYpqCTkZaOrJLL7rrd59bo8tjo/dn6/+74/+/u99/k9Nvp99v3/+j//+/9/+v6/+zt+ODq ++d/3/+P9/+38//D///H///H///b///P///n//+7///L///f///j///X///f///X///T///H/ +//f///f///P///X///n///P//+///+7//+3//+3///D//+r+//D2/efv++Py+uPy/ePj+tzi +6tnU3cXJ3cDH0rzK4cLK38a+xK/Gz72TgHmJhoR4gG53fGxxfF9ybVdqaFZnbV1veFxwf2pv +ZmB5mW+froShooiproSnroSzuJmps42usIqlsYyvt4qlrImorpCtp4qqs4unp4mjqn+gp4Kc +oYOan4SKoXiSmn2cmX2Umn2cm311hWmPnH+Vp3ymrommrIeuqoumq4qnp42fqIOioYGTmYCS +l4eSpX2cpX6cqoSosomjs4qrsoSpr4emp4ajsYelsYqvrIOmqYWprYamrYGlrYKeqoGdqoOm +oH2bpn6iooKbo4OgoX6To3yanHeZn3minnqVn3egj3aHjm6Oi2iHh2iWi2+Skm2Sh3SQiHOC +hmiNh2mHhWZ/fGd8d15+dV12b1p4cFx6eV9yaFdmaE5qalFqb1V4eV9qaVtZTkhBRz48QjY8 +SUI/RUBARj1CRT1DQ0E/RTdoYkKYcFKhdVGqdFajdlSpe1esglizdVyufFixdl2UaVVsUUaD +bEeoeVWuhFuehVnEkGvGknDGlW7Llm/JmnPMkHXMlnXCjXHFiWi5h2izfmKneGGse1uwfF2q +eFilcFqRbFGSbFSZb1GEY1GCd071/7r///r///////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//7///////////////////////////z///////z///j///f1//bu+tz9//b7//z6/+/y/+z0 +//L9//7x9+vr5+baVpxfRVJJSElBQT5FQT82RT89QkI+RT1EQUU5PDhAR0A0QDQ9SEQ5PDU6 +Pzs6PzQ8Pj88QDc2Oj4+QDk7PDw2Ozc1Pjo6OjsyOzc6Pzg3Ozc6Ozg6Ozg6Qjc4Qjk4ODc7 +PzcyQDU8OTc1OjY8PjoyOzY8PDcuPjk7OjwtOjVAPjgzSTk+SUE0R0RDSEc7SUM6Rjw6P0A2 +PTg6OTkzPjg8QT81PDk8Ojs1PTY9PDo1QTc7Pzg2PDU6PDU2QD04Pjs8Qj48QDw8Pjs6QDk7 +QDs3PTk3R0ZSUF1kS2xWQ1NGQ0g9Ozw4Pjo7QEA/Pjs6Pz07PjtBPz85Pz46PD47Pjc7PT42 +Qz1DOkRCRUQ/Q0I8PDs6PTw6Pz06Pjs7PTw6PT09Qz06Ozo9PTk4Ozk8PzsyPzg4PTU9Qj44 +QDg3Ozo4Qjk3QD03PTc4PjgxPTg8PT49QT47PDg2Pjc7OzcxQTc+OEA4QTg+PT44QTo/QDo3 +Pjc5PzcyPjo6Ozg3Pzs5QTs3Ozs3QDY3QTo6Oz82PDo8Pj06QTk4PD8/QTs7Pj04RDg/QD01 +PTk9QUM6RDk9QUIzQzxAQj42PT1CPj45QDtDP0I5Qj5BQj5ATURIWkphYWJcVV5UUVdegWGL +o4ex17DIy8PE77ni6drXx9O+y7rBr8C266zk793m597h/tj0/+z9/e7w793Z3dHY/9D4/+/+ +//D///j///P///P///b//+7///L///D///P//+////D///L///b+//H+/+r///H///L///P9 +/+/6/+r8/+v//+3//+b+/+z7/+n+//D0/+j3/uTy8+bm79nd5dba5tLT2sfJ08bG2MTM5MDa +7sfb4M/Ts8mowZi1mrKMiIGHl3yPj3yFiXyDfWt3ZGJoYmNac1RueWd5ZmZxgGh5m22XpoiZ +qHyiqYqlp4ulq4enpImnq4urqomlpouiqYGsp4KjqIqjqoOqqYmen4SanICVl4CPl3yOl3yO +kn6Pm3aTkYCNfXGEiXCLnnONoHyfo4GYnYGirIecnYmipICYpISipYaZkoGZlX2TpH+ZqIak +q4ilpIehrIKjq4WjpoSipoCgoIedo32hqoOjpoKjo4WhqIKnqoagpHuioX6epoCcpoSjp4Sk +oIWcnXygn3yapH6jnH+bm4KdmHeciXiOiHSRjGqShXKMhm2Mg2yCgWiKfmaDf2OMfGiEeGZ9 +fGN+c2N7cGZzc1t4d152alxvaFVnZk9nZ1JlbVNualloV1ZfS1JPP0RGQD49Qzw8QD0/Qjs4 +QDg+QztEWD9dbkCXdE+pflaxelmqc1mkcFekd1SyeFqxdleoY1uHWVOATU5wWkaPeE6qgFG3 +hGK6jWCqgF7DimfKk2zJmXPHlnTFknbDi2vBhWu5fmSwfGKygV+wfl6vfWOsdlyoc2CZZVWW +ZlOSaU+LaVaIzVPz/8j///////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////3////9//v+//z///z7//r9//78//Xv/+vp/977//f4//Dz+O7u9+Pp7eHk +i9SpVINlRl1LRkhKSUk+RjpBRUA2PjZIREA+Rj5FRUE8QD1DQ0Q9Ozs6RDk+Pzs3OTk9Pzk7 +RDg2O0A8Pzs2Pzs6PTcxOzs6OjkyPzU6OzkuOjpAOT02PDU/QTszQDVBPj41PzFAO0A6ODY/ +PD81QDE9Ozo5PTM5QDo8PTo7PzU7Rzs1Sj02RUc3REQ6SEU8Sks+UFE+Vk9AVE43PTwxOjc/ +PDo2OzY6Pjk5Pjo8QDw1QTVGPjgyPDlBPjswPTpAO0A0Pjw8Pzo8PDxAPTw3Pj03Ojk8OTs8 +PTo5P0BCREJFPEdBQkJBO0A7Ozw4Pjc2Pjo+PTc2Pzs4QTg7PT05PTg+PDw4Nzg9PDw5PzU9 +Q0Q8PTc8QDs9Pjg8Pj89PTo6Pjs4PjY5PDs6PT04Ojs4Ozs7PjlDRDo3PDc4PDo4RzY8Qzk3 +Pjc4ODo3PDc5Ozk8Pjc7Pzw7QTw8QTo7PTo3PTw2QT03Pzw9PT87Ozo/Pzw5Qzo6Qjs3PkA7 +Rjw2Oj00QTU3RDk4QTVARUA8Qz47QD07Rj1BQT01Pjs4QDg6Pjo9Ozo3Pjc9Pjo6Qz46Qzg3 +QT02Ojc6Q0A5PDc6QT05Qjo2O0E/Pzs6RTo3QTw9RjtHSU1CUEpJZk5UXFRhjF986nXT3s3h +vdrIwsW+vrO7p7ix3a/P+8Tq4+PW7tHU+cjz+ebr+d/o99/i/tTw/+T6/+n9//H//+////L/ +//T+//L+//H//+7//+////L//+z//+3//uz///P9/+j///P//+v+/vD+/+3///P//+j8/+/5 +/+f///X+/+n5/+f7/+b3/+f5/Ojy7uDk5dPU187G5sTV4NDP1snJ3bzL37rQ5MnbwtrHr8Ck +u5eoiqOLjnSIinaHjnWOkXSHhXWGcHF0WmJgbFFgZ1xwb11nlVqFoGyUpnuTpH+eoX+eoIOf +n4Sbn36cpIihoYKiooKhpoKlqIWmsYqrqoyprIqrqoqzqpCkoIOdnYWalH2cl4OVinaPf3iB +gWmBlm2HpXSVoX2io4CdoYehoYCbnoCanXqaonudlYGZlXmVinySonmapn+mqoqrp42rpoKd +qYGlqIGfoYGloYCbmoSZn4KVn3+inoKYnIGhoH+UoH2goX6bo3ujoH6dnn6enH2dnIGbmnmg +mn2ZmXudlnyalnebi3WUjWuOhGuHhGmMe2uEgWWJhWeIhGiFgmeHgmOHd2SBc2V9c2F1c1p2 +cV96aF9uY1pnZlRoZVBkZldqa0xoWldmSlNXRkhKREhGQUNCRT89RDtDPz47RTtDSkA8Wjpp +cEWad0iog1awcVuqcVemdVipc1iod1arcVqdXlZ/UVFwTUpmVkl2ZUaXcEqhfVSth1y+iWHC +i2WqhV3IlG7KlXLKjXbAhGu5fmy0e2GwdGWnfVyzel6vdF6mcWCcblycbViTZE+VZlGJgk2c +9lXz/73///v///v///////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////9//r9//bt/O3r/9vz/err+eHx+urOWKJxQGBORUFL +SElCQUJFQ0Q7REBBQEBAPkVBQzw9QTo7RTg9PjtCOjg2QTo6Oz80PjhCNz8xPzg9Pjo2QDU5 +Oj02QDQ8PDowPC87PjovOzc6PT00PDM6RTcwRTc9QDw3PTk9Ozg6QDk1OjpBPjkrOjU3OTY6 +PTc0PDgzRDQ2Vzk7T0c2REg9QUQ4SEE/SEg9TkdETVI6U1dDWmFDYWBMY2k5YU48UUgxPjU5 +OzozPDI7PDo3Pzc7Ozc8PTg2PzY6Pjc1PDg7Pjo7Pzg8PTg4PDo4PDc8ODg3Pzg+PDYzOjY8 +PD1DO0FCPUA0PDZBPUA0OzRBPD04OjtBPDozPDJBPT01Pzg5OjUxOzY8Pzs3Pjs5RT04OT05 +Pzk6Ojk5PjU4OzQ7ODk9PDYxOjk+PDoyOjk4ODQ3Pjk3Pjc5OTo3PDQ5Pzs1PzQ/PT42OzM7 +OTo2OjQ/OD04OzUzPTw1ODY6QTw8OjczPTw6ODw5Oz0+Ozs4PDs7Ojw4Ojg8PDozOTY+PDo3 +Pjs7Pjc2ODs6Pzw8PkA2PTk8PEA5QD89QEA6PDc6QT0yPTg7QDw4PjpAQTk0Pzw5PT04PTsy +Qzg8PEA3Pjg9Ozw0QTQ5QTo1QjY9Pj47YjtCZUNSfV1WxVSK2ILEsbqsp6mgjZuVYJl0m3WG +9HzV8snk8t7l7tTj5dvU78Xk4uPi5Nnc8dXd6tLa/NX3/+f+/+z9/+/8/+z///L8/+3///L7 +/+35/e70/uP8+u33/+X///P6/+r9/uz7/+r9/+r9/+r5/+b7/Ob6/+z0/+L3/+r+/u/7+Onx +/OT0++Xt8+Dm6tve39jU4c7O7cXc6dPY0tPI08DL1b7PzsTK0sTIpsCgrKSkmpqli5OLh3x+ +iWd/jHWFiG6Fg3J+e25+X21gVVVZcE9gjFh+lG6TmHubnHybmoCbmoCZnH+bmoGXmn2XlXmT +kHuYl32SjHqXin+MjXONkH+MlXKOknmMnXWUn3yOnn2dk4OKiXeMgnWBgm53kmWKlXOPmX6X +nIGUoX2Wnn2apYKcnn+ioX6bmICfkoGNlXmPmXaToHmbpoCZpH+gooOZnXudoYmcpX6jo4Kb +oX+dnoWeoHuio36aoH2ipoKfoIKcnICXmH6cnXqbmnyWm3eclH2ZmHiXk3yXj3WViXWSjG6O +inCPh26KgWqOf2uAfWaEfmaCgGiNfmaBemaLeWmAemWEeWJ7d2KCeGJ8a2N6ZVxoY1lhZU1o +ZU9mcFBxZlVsU1FhR1JTQ0VTQEhBP0BHQD8+Qj5CQDs+Rz5ASz9EY0BpdT2hdUesek6ue1Wu +e1e0fGC4flu2cmGnZFmOU1ZtSkpYREpiSUVtUEh0VkOCZkeZbkykek+xfFuzgV29imq/i2mq +fmLBgWm9emexdWCsdWOufmCxfGGucmCoblyfbFWXa1SRa1KZbFaRa1KO3lbn/5r///r///// +//////////////////////////////////////////////////////////////z///////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////3///H////3//Xz/+X6//P+//r3//FMSFVRSUlER0dFRD5F +REE7RzxCSEA/Rj8/QEQ3QT06RTs1RTtCQj8+RDo7RTw2RDY5QDw2RTQ6PT43Rzs5Pj45Pzc9 +Qz86Qjo6PDs5Pzw6Pzo6Pjg7Pj46RTs7QDg8RDw7QDs1PTU5QDszRDU9QDw2QDk+RTs1Y0ZE +XFc2TlI8Pkg/TUg+UVE7VlI7TFM5UU1CTFI9VllJWWRIYmlKZnBPaW5RaHRIbHBCaWI9WUk2 +SD86Pzs7Pjk3QDg6QDYzQDk3QTwvPjc8PTwyPzk0Pjg3QTJAPj43PDc+QDo1RDU8Pz42PjQ8 +Qj81PTc7P0A9Pjc6PTo3PTg4Pjg7PTs3PDg6PT04Qjg4Ojw7PTw7PDs3QDs4QDo7PD84PDo9 +PTk0QjU7PD42Pjo/QD02PDc+QDsuOzg+PDoxOzg/QDoyPzo9RD0yOjs+QTg3ODo4QTk2PzQ1 +PDs3PTg7VTk/UUE3QDk8QDs5QDg5PTg4Pjo8PTk4Pj09QDw2Qjw4PzU6PzwyPTc7PkM2PjY5 +PEE1Qjk9QEE1PTo7Qj47QDw8P0RBPT85RDs7QT07QDtAOkA7R0A/RkA8Qz09Q0I8QD48QT46 +Qj03QT04Rzs6Qzs8Qj5BZDxZXFtzpGi8zLeroalwW3FmX2hiUmNYXlqe1Ifb4NawsqLf8dbk ++Njv+uXd5Nybh5m65LHV39XX7s3i8drt+uL9/ez7/+j///D3/+/1/+r1/+v6/+/5/+r8/ezw +9+X9/+/8//D7/+j+//D9/+n4/Ozu+uTw/ef6/urh6Nrt/dzv/+bz++vq+d/u+eLq+ePv/Onq ++eDi59zZ59fa5dbZ583U3s3N2sXL0sLBxr+foZixq7B0gYp+jHeJkXyKjnWEiXKFjnOAi3aE +iXSAf253a2NbUlZdeVR6jGyJlHabm3ycpXygn4WWnnqWnoOSm3iYmn2SoXaanX2Vm3SQkXmT +l32WloWPnHeZnYeXmHqXloOUmH2TnXyOjH+Lj3N7fWp9gW13jGuMmXaNmnyYpIKbqYijqoWf +q4KdoIOgpHyeooSPk3uNkHSNlneUm4GbnHygqYWjqYalqomirIWopoacqoSdpX+cpIean4SW +pXucooKYo32aon6cmYKZoX+anoGcnn2WmXmVmHmTl3iaj3KYkXGWi3aOkG6WiHGLhWeKhmyH +gGSSiG6OhGCKg2iHgmWCf2uJeWKBeGN9eWJ5cmN2bV9uZ1hrXVVlbFJxb1t0cFRrbVdoYFRa +Sk9PSEhIRkZKQ0ZERENEQkQ7Qz5JPz43RT9HRT9MYEOYc0yhdVC3f1i0h1vAhl3DgWPAgVmv +b16PXFNtTFBXS0ddSUhMS0JRSEBhVkSMaEaccEybaVOkcFOueVq4g2G8imXGkG/CimideWKt +emCqdGKtgVavfmKvfV+jcF6WalWUalaWbVCfc1WdbFqWvGD//9////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////v///////3///n8//j4//D0/+zn/974//Hz/uzk7+JWWUdES0ZASTtAQURDSDc/ +TEA+Qj46QkU/RzpESUI7Rz88RDg2Pj09RDs9PD47RDk5Ozs5QDk1OTc4Qjc6Qjo7Pjw2RDVB +Pzw1PzU6QDw2QDk6QD00PDM7QD42RTY9Oz4zPTo4Pzc0Oz42PDo7PDs1Pzs7W1RJaG9IVGND +PEM6RkFCVVNEXWpMV2NCTlVAS05EUldGU1tFVV9NU2ZNWWRRXXJLZG9YbXtSbnhRZ3hSb3ZT +cnw+Z1k8TkszPjc2QD09Qz41QjY2Pjw0QDk8QDs2RDo8Pjo4Ozk2QTo2PzU5PTk8Pjk3Pzk8 +QTw1Pzc6PTozPzk9Pj4wPjQ6PTgvPzc+QjsxPDY+QTgwPzc8QTgwPzk5QTk3Pzo4QjQzPjo0 +Qjk5QTk6QTk4QDozQTg8RDYzPzw8PTU6Pzo5OzgzQTs0PTc8PTkzOjQ6Pj02OjI8PD43QDQ4 +QT47Qjw+P0g0PTs6RkE4PjczPzc6PDg1QTg7PjkxQDg5RDw3QTg8Qzo4RDg8Sjk5TTk+TD09 +RDw3Rzw8Rz87Rj48RT87SUI+SEA7VUQ6VEJBRUM8PD47QjdRRk47R0E+REI3P0A2Qzs8QkA5 +Pjk4QTszQTg5Pj4+SD9GSkZdaFlxY3JXTllTTk1ITklef1Ghvp6/vL+kvJ7F38Xd6NXk79fN +1dCNeJmDpnzJy8qOmorV8cvm8t32/+f0/Or7/+j6/+j7/+ru+N/z/+nz/+nx++be4tb0/uf0 +/uX4/un6/+z4/Oru/N3u8N7w/+T6/urx8+bW6snj9t3r/OXq997Z6djq+tzn9uHo8dvg5czY +6czj9NbT3MXY5tDQ4M3N0cqcpqV8kpaPp6R6foBogn99kXiKnXWSlH2NkXWNj3iBiWuChm17 +fmpqU11GW0d1hWuDi3GRlX2UlYGRmIGPk4GSlHeUk32RlHmKkHGKkHOFjG2MhWiEjG2JgHKA +hG2EinSBkW6Ok3uLmXSbn4OKk3WMjnuBf29/fm18gGaKknWNl32ZnX2VpX+WqHuZoIWdpIKb +pIWepIGTnHiRjHSNj3KQmnuUmn6dp4Ojq4Olp4Kbm4Ccn4KVoH2jmnyTp32ioH6don6in4iX +oXujoH6bmXWXmXyXoX+amXidmXOSlHaUlXSPiXGaj3SOkHGQjHCOi22KhGyDgmeJfGWEhGaI +fmd8f2N+eGSBeGF7eWOCdl55eGCAb2FtdV1vYVdZYE9sdFV6d2B7aFxeZU5iVE9NRUdDRkJF +RUA+Qz1APzs+RDlAQj8+RDtHRD88QTtIUD+BZkqkd1eidlexf1m4g2G7gWC8f2Cwd1mjbll5 +UURMUkWGaElzVEhVRj1LSkR1XkKVbkyrelGkdFGye1q1fGK/hWbAi2vCi2y9h2eadVuwc1es +fFizfl6kbl2VaVWUblSZb1WbcFaYblOfdlWQb1TQ5Jb///3///z///7///////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////3///////////////z/ +//r///////3////////////////x//bv/936///0++j1//BcYVxQX0paVVFJVktPU1FMVkxO +UkxNVk1NS0xJTUpITElEUElKTUhDTEhAUkNEVUk+TkA/TDxAS0I9SkJCRD07Sj9GR0JBRjxF +QUFDQjtCRT83Rj1BRkQ2Rz8+RD82QTk/REM6Pz48Qz83RTs8Pz07QT5PYm1RXWlKUF5DQUQ2 +RUVJVGNNYXBKX2lEVl4/SlFFTVZAUF1JU11HV11NWWVCX2VVYXRRaHZabX1Tb3liboJZbnpb +b4FVc4FUb3xFX1tBSUs4PD48PEA7QD45Pzo7Pzs5Ozg9RDs4Ozg6PD48Pzw7ODs9Qzk9Pz47 +PT89PT07PD02RTc7PT8zPz1APz83PDk7PjoyPzhAQT4xQDtDOzs6RD48PDw8QD1CQD07PTs7 +PzpAPT8+QT8+OT48Pj08QkE5QTs8PTw2Pzg8PTo+QD08OzQ+PTw9PTg7QkAzPTo7QT06PjU9 +QEA8QT06Q0BDRTk7Qj8+QTo8SkM9RD45Rz4/Pz9ARkJBSURDU0dFXUxBTUo/S0ZKWktQXlVS +Z1ZTYFFld2JXZmBMWVJPX058inmEjoNXWVg7PTpEPkJAPkBEREJAPkJDREA3QD49Pj48Pj83 +QDk/QDw/QDxBQkNCSUFJRk9PUk1RT1JERkVMT05SUVdqb2tdUmBobV+iuKywv6m3xbqQj4xc +VFx+k3elprKcuJvP4szm+Nnm79/J28Tg99bd6tnX4tTR38P5/+36/+fu8+Hf7M/m9eLz/ub7 +/+r4++3c3c7f9tfk6tTz/Obu+Nvy/ejl79rf7Nfi8t/j6t7F2Lfr9+Hk7dnt9ebl79zc8Nbm +7tXZ3NLW6dTc4tHAvMB6j5l8lph7h4lle31qe4lziHaOkn2IknmLjXp+iHOGhHN+iWuAfGxZ +SkZQa1J+hGiFjHaOknuSjn2TmXKXkoGOkX+PkW6NlHiOk3mNkXWIi3WMjnKHh2h+j3aGjXGM +lXOMlH6PnnyUl3+Tmn2OhXSCfmyAh21zfWt+f3KFk3WTlX6VnHmcoH6Vn4KjooWepYmeo4Ch +on+Wm32TjnGLjXaOk3ebnoCao3+ak36Nl3qSlISXk4CXm32Tmn2dmX6goXykp4abn4GcmIaV +l36fmH+UlHOXmYCYlnyUk3yUk3aRjnaNj3OOj3mXlXaTkniRjHOPiG6NhGuHhW2NhmyOe2eF +emmKgGOBf2aFe2V/dWODc194el97bF5fYVNlZlVycVx9aFxhX1NoWE9SREtMP0NAQT1BPT4/ +QT5BRz89QjtAQzxDP0A/SD1EQj5pWEGNZkuYcE+reFu5gV66gV/BgGG5fFy0eFufZFNyT0pM +Q0FZT0VgSUNSR0JLRD9VTUWEYEqhdlu3fVu4fl+3el2xfV+8gmW4fGK8gGeXcVeseFyyd16s +cl6ebVmMY1CNa06Xa1OddVWbbFqccluVbl3j9rj///n///////////////////////3///r/ +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////7////7//X2//Ds/+H4//b1/+39//Hj99zW6tnT087s5vDOzMLDwsbLv8O2 +wa+1vq2rrqqUo5mgq6OPjY+KiIV8gXt0dXdub3Fvc25sb2tsbmZiZV5WYlpRXVNUWFVUXE5V +VllLWExRWFFGW09JVlNLV0tRVE5LUExKVUxGVU1JVUpKUEpEVUxQVVVRXFZQV1VFVk1JVE9M +W1dQY15TX11IXlxETFI6U09NVF9EUldHVV1BW2NQWGJJYWlPYW5OaXZSbHxZcHtacXxYcH1Z +coFgc4FZdX9ZcYBXen1OaXQ5S1M6QD82RTo7Pjs3RDs9Pzs1QTo4QTc1Qjs2Pjs6QD80PjQ6 +Qj8zPTM4PzwzPDY0Pz08RDY2QD05PTg1Ozo5QDguOTw6PTwzQzY4Ozs0RDtARkEyQzc6Pzs6 +QTk5Qz40Pzg4QD41Pj87ST86R0M4Qj06QUA/TTxBRkE7ST84Rj45QD8/QD85RTw8RDg2Qz89 +SEM7ST9CTEQ9R0JKYExNVU9EVVFJUU9IVEtVXFZlc2Z3hHVaZ2RdYV1NaFlSXFVOXVNYaVhx +fXRUWFpjc2WQkodpd21jYW1HTFJDQkc3P0E4PDc3Qzs5RUA3QDo7PTs2Qjs7Rj01PTg+Rz82 +QT4+PkJKX0ZIUlQ7RzpGTEZATUtCREs9R0RFREo/RkREQ0RLXkl9f4RNUk5QUFNLTktATk1i +dl5oYXN0kHDP5cji79u6vcB/inPD1sXE1Le9yrLT6sD3/+fw/+Ty+eXt/Ofj797u/+H2/+nq +99/IzsTj99vk7Njh8djn9dnu9ODk7d/c6tPf9Nfe5drH37jm9dne7Nno9N3i5tjG4MDc7tjT +3czN5MbR6tO8trpyjZR0iI9lgodse4Jeen5vgH5+j3iKjHd9ineHjXF7im2Ch2x8eWxTTUVU +blZ3fmR/h26JkHSMkXeMkHCNk3eLj3qOkX6JjHGGjnyDjXiFiHGNkXqHknqQkX2JlXGZloOR +nH2TmoaYm32Um4CIhWZ9fWt0dGh6fmt6hmyEjHSPmXiPn3uRnICZnH6XmX6Zn36ao32ZnnmV +m4GQjXZ/iXKMkHeSmXqPm36OlHqblXeOm3qVlXaVmXqcmHSZo4iloYqTn4GcmHGYk32ZlXad +noKYmnaNlXeUkXeRlHiJkXGOjHCJjXKQiGqJjm2NhWqIh2iRjm+HhmaKg2uFhmiJfmZ9fWOI +emV9eV+DemN9eWR7dGF4dGJ5aVphYFNjbUxrbldsZFRaXk1WTEZBRT9DP0E/RDw8REE6QTtC +Qj86RTpCQkJDRkBCPj04SDt4X0yIYUiWZU6Wb0+ye16uely+eFuwfVuuc1mZZ1Gne1CveV+e +cFORWUhfR0VHRj9LRkBzW0KUYFChcFOzfWG4e1+1fWCvely3fV+weluUblWsd12ye2GrdVqO +YlJ7WUyLZU+NbVGecVeLZ1CNalWBbVfh+rr///v///z///z///////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////9//T/ +//////////z///j9//vy//Dt/+D3//Dt/+zu+un////////l79Pi8+Xy8+Pt+ePo8eDt++n+ +//3/+/Po9Ofp5ub+4tzU3NLK0MnPysnXvcLJ0bi0tbCur6q5squZo6aTh4J/enp3eHB1ZWlY +ZVdfXlhPWExaWldSUE5UVVNQVUpTU1BPVE5PUk9PTk5MTkxQT0xNTktNUE5LUUlMTktHTUhN +U0tMUkVPVEZRUkxKU0pQXEtJT0pJRUg9R0JPW04+SEJBRkFLUExKSEdDSUVNTUtKWE9gaVVY +WVNHT0lSVlRPUlJcYllNUU1LTFRZZVdhaF1aV1tmYFpVVlxZZVhcXFljbGZvb3J4jnt+koJY +XlpRUlA+QUI8QUI8PTk6Pj46PDE4Pj06QDo9PkA6QDU3Pzc7Pjw5OzxDTkE9REE+QT9XaU5R +S1JBSEFLTUhETElDSEVBR0JERUJISUhFR0JedFd4gHhyk29vgHJZY19NUU+MoXuEloqmwZXT +4Mbk8dTb7NTF67/n9dLj99Xg69jc8c/8/eXx997o7N7Z6c/x+eLx/OLz/OP2/+Xn9N3j9Nfp +69Lv++Dx/N7f39vY48bk+Nrq8tne6Nrc6tPi69XY6szg69LV4c3W5M7T3MjM28PT4snJ0cPM +0L+8ybOUmaKYsJCFiqJrfHuHinaEiHCFh299gG9/g3B+g3CBf291eWZiW1ZLV0trd12EjG2P +kXqVm36Wmn2YlnaQkHqMlHeQkXSLkXWNj3eJjnGKjW+Kj3aKiXGFim6JiHGFiW2MiXmPk3SV +mHuPl36XlICHj2qEgW90eGR9hnCMlm6PlYKWn3+Zm4WZoYOXnH2Tn3+Znn+anIKOj3qKj3mN +lHqWoYCapYWZqYecoIKeo3+cpIKXo3ycoISWon2bmoKWloCco4OSmn2eoYCVo3qaoIGVnHui +oYCZoHyhoYGem36am4KYmnyeoX2XnHiTnnqZlnyMh3CMiW2MjWaQi26SiG+LiG2IhWSEhGeM +gWuIhWd/emZ7d1yJdGd0bVh1b112el56aGVoZk9la1RtZ1hxfVt/bWRqX1ZLRUFBQjxDRT5C +QztARj1IR0BDRT9CQzg/SDpuZEqZc1SmcleoeVO4fVi2d2LBgmC2g2TCflytdF+zd1ahclet +fFu0i2S/hGi6i2vIl3XMmXjOo3jVoH3TonPJkHDJmGzNlXHIjm2/gWqyfmO5fGK2f1qveVi0 +eFq4eF+ncl+icFaIY0yJZ1CVbFKQmGn1/Oj///////j///3///////////////////////z/ +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////4/OD///////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////z///////////////////////// +//z////////6///r/eTu/+Lu/Orv/efs9uDr+OXq8+Xr9OL6/vX5//X9//79//r69erq+eTw +7ebk6OT39unt8eDn9Ovx+e7t7OHe4db26uTZ3djb29TN1cTEwMC7uLjDur2vsrKzurq70L7Q +tLyQiYSDfXtzfHB1dXRxeHR6anBZYVdXXVZZVVFTWlhWVFBVVVVSVlBRVE9UUFFLUU5QU09M +U0tMUkxMUUxOTlFMT0tPTUhRU09KUk5RUElJT0xVWlFTWVBZVlFKTEpUS01JUktZV1BGSkpT +VUxNW1dfYVtgal5TXFNOV1ZQU09NVVJQX1huc3FaXl9mdGlhXWJUWFZFV1JKUVBBTExAQ0Q4 +R0I7PT5AP0A6PTg9O0A4Pzc5Qj84OzY8QTw7QDU5Pj07PTo7Oz4+RDtFREQ9QT49SD9NWExc +alhIR0c6PzxCQUI5RD1BREQ7RUBCQ0Bnf1pfWWZFTEdJRUlCS0NKS0eEjXVXWlikvZDe6tDc +5NKpsLSUrIfL08bN18K7wrzg7sP3/uf0++Lf5dzp79Th8dzx/uL1/+fq/uXM2cff99Xe7NLt ++N3l9dvl7trc5M7f79Ti79XY5dfM4L/j8Nzi7NTd79XS28jW5sfb48zM3cXR4cjI2cbC07+Q +oKF4ioqTpqBvfH5pfXl/i3uEi2+FiG+CjXGDh3R6hnCAgmt4f2pXT1ZMVkR1e2WBh2iQknWQ +mHyYnH6Vln6XlHmPl3uRi3eUknuPkXeQj3WOl3qPlHeTlHyVl32WnIKToIOWn3yYoH6Vmn2S +nn2RknyEh258e2pxfmV+hnGJknCUlX6QmnaWl4SXmnmXoYGaoXycooiVm3uQj3yMj3KPlHqU +mX2ZoHWan4SVoIGaoYGXn4CeoX+ZooKZp4Wcn4KZm3qcoYGWnn2Xn3uTnX2XmoOPo36epoST +oHugnIGSnXuhoHmWoH+dnHuZlXuVmXyWknmOkGuPinKKi22IgW+OhWeFgmmAgmeCgGiHfmaC +e2SGd118fmd/cGFublx3dVxydltsY11bZEljZllkeV13cGNraVlmXFc/QTRBQDxCPDpBQUQ9 +QTs7RTpEPzc7RDhESkR7ZEybcVWndFSydFiwc1iue2G3gGGyd1+veWCseFiyclSMZlCmdla2 +g2HIjGK8j2nSm3XJm2/SpXjNn3bRnnbKlXXLmHHKkHPClHC9gWm0gGW1gGa6iGO6gGSzgGGw +eF2icVKabliJZUqQZU+ObU6pv4f9/vH///7///////////v///v///////////////////// +//////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////+n///////////////////// +//////////////////////////////////////////////////////n///////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//v///////////////f///j////7//ni9ePi79vx9Ovs9+L0/u31++r1/+7s+eTr9OTp9ubx +/e/v/+j4/vH9/+70/O7u+uj+/vzs+eje6+Hn7uHm6t/j8dv0+vTm8tvT38/L2MbMzsLEz8G4 +vrLC0b20tKunrqWnrqKcoJaSj4+Eh32EhX14fHRrc29pbmBmY1pTYlJYWVlPW1BTWFNNVktR +UVNDVU9SUVJMVkpPUlBKU09MU0tRVUtQVEpSVUxKVE1NUU1LVExSUlFUVU5TWlFSW1BUWE9U +UkxNV05RVVFGTUtHR0hBSEVHSEo+T0h1hG5SXFhQWVRJUExGREhDRz5BREM7RD4+P0I8QzY4 +Qjs6Qj41PTc1PTg1Qjc4PTk8QDs4PTo1QDszPjg4Pzs4QjU7QDc7QzhKSkQ+R0JFRUZDSkZA +QEQ3RThDRkUyQzxBRDs2RztJR0Jle1lfVVxESEhERz9AR0RJWkl3dHZRWVG7zKXh7tOwx7ty +eXqlvJOyv628x7W3yLbr99Dx/uTw+eDo793n997h8dvs/eDw+ubn9drG1sPq89ri89nk7tfe +9dLm9d3W5tLa69TZ79LP2c/M3Lfj89fX6sjf79fU4dHS4c3Y7M/J2MTT48zL28Kdr695jo+C +mZd8jYlseX9oen6GjnaIlXmMk3WCiXSChnJ9iGx+hWZ4e2tST0xLWkt2e2B8hm+FjmeOkXOL +lnWPknaKkXWMkneLmHiPlHmKkHSLj3SLkneIj2yLmHuNk3eMlX2PnnqSmX6MlXWOlXuNlXmI +jHyDgmt3fG16eWZ8hGyLkHqMmnWToIWSmX2dl4CRmnqUm32TnH6TmoKQlnuJjnmKlnaRmXiW +pn6YoIKdo4GUoIOaoX6ZoYOZpIaUnoCVonyXnoCapX+SoHueq3+ZnH+XoXyWmnyWmoKTk3uU +lneWmHyTm3SWm32NlnSemoOOnXGTlXyRjHKPjG2BgWSHf22Ch2eDhHCFgWmDhXWDeFt/fGV+ +fWN/e2hybWBzclt1cmV4eFlpYFFjbU1eakxja1BtcVpwbVxUTUhCRz83QzhARTc2QDU/PUBA +RDs/PUAySThIVkB6aEuibVSfd1apcVelc1SwfFm2fmKvb1queFmrdFSfZ1B3XEiiclaugFu3 +gmnDiGvCmG/MmGzMm3DNoHXHnXzLmHXFk2/JkW3AjGq9g2mufVe4fWGrf162e2ivhV6uemKd +b1KaalSGYUeDXU6CZFOxzZn9/uz///3///////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////7/+X///////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////9//3+//n///// +//////v4//rx/+b///n0//H4/+318uv+/fv//vr+//3z9eXt/u75/ebp+uvz/+r9//z3/+3x +/Ovx+Ory/u7s/+76/fT///r4//D6//Tu99/t8uX4/fLt6eT48/L//ff/9f7s7ejq7drj7ODj +4Nrc5N3u8OPf4NPT39Lf59vf29PNzMy+v77CvcG6tLS0tK60t66sp6alnJuinpiYk520l5eF +fYNycHBuZmhbWmFgXWJcWVhZWVdQWlRVVVdQV01XU1RRVlRVVlNMUlFWVFJSVkxSVFFVVlFP +VU9TVlFMU1BRU01RWE9VXFNUXFVZVVNWT1RHREhDRUU8Rz1AQz87PztCREE6Rj4+RUA5RT5E +QUU3PTw9Pzw1Pzo7QTw5PThAQj42PDs8Pz85Pjw7QD09Pz1DQz5ART9LWExGSEs+Q0A9QT9A +QUM/RD5DSEVDUUJESEU/RzxHSEc/SUNFREg+R0JDSUxyhmNUV1t9kWze6dDM3cxtbnRte12y +trOQon+uvarO0rrt/d3u+9/x+93u+d/j7+Hr+Nzl9dzq+N/Bzc/Y5sPi8d/d5tPi7tnk89Dq +9N3U59HZ59Pg7dTK0srY68Xb6Nje6cvl7dbT0b3W5cXR4c3BxbzI3MPU6MWWlaVvjJJ3iopn +en5oeoBoe4B7h3iHi3eDjXWDhXOAhHV8g3F9gnJ3dGhLTUdZXk14fmWLjW6NkXuSl3uMlnuN +j3qLkHSPjXmHjnGFim+Fi3CBiGWAhWiAiGmChHCAhmp/iG6AjGyGjnaHkm+SkHuMkXqIjHSC +hW16eGp7gXWAiWuIk32Pl3aWoYmcn4ecpIaZoISUoYeZoHmTmH+NkXmHkHSRk3qVmn+fpH+d +on+dpYeaooCfn4Ggo4KbnIaXnXuWmYCUnnmXoH6dpnueo4CeoYCWkX2fmnqVmH2Zm3mSk3ya +m3yTmnqUnoKXkn+VlXWQj3OPi22LiHCKhW2Hg2yEgmaIfm2GgWSMh22BfmOFgmd/h2h+eWR8 +cVh1a2F7dV57emRvYk5iYlBobE5kXldqa1VoY1ddW05KREVDQD9EQzw9Rj5APTs9QEBBOjw8 +Rj0/REFhck2QdFaccVWrd1yqfmCsc1Wdc02tc1yvdlGufVudc1Z8VUhiUz6SdlGpf1e4hWW+ +i2jIjW3ElHDKmG/OlXO8lnHDlnLEj27CjWzKkWrBgWWzemCqeV6veV6vgWC1eF2lc1afcFGQ +aE2KYVF/Y02KZ1fK4qH+//H///3///////////////z///////////////////z///////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////8/+T///////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////8 +//v0//Lz/+n8//n5//Dx/+v////z/+fx/uzs9eXr7+Pp7eTr/Ojw+/D++/Hu9fP+//z5//X/ +//P1+PD1+vP8//v79/P4/+z6/vL///n5+fD5/vb9//79//f///v9/fL9//r///X///3///L2 +9+zm8uDo7t7s7uHk8eTw+evu9vP///7x6eP27PDk4NvP18fP08ra29bNysXHzsK/v7iytamx +qafOu7u9urm4raaWj5iKgYOBfH52eHFoZ2liYVxiYVteW1dcW1lYWFNXWlJYWFRXWFBVWFRU +WVFSVlFRVU5WT01WUlFUXk9ZW09LVE9ZVlFQVE1UVFNPW01RVE9FSEhNQ0M6STxKSUM7QjpB +Pz43QT1BQz83Pz1BPz1APz04QTc6QTg5RDlCPkA/QDpCQT1APjtGR0JFSkVOVkNRWU1ESEdA +QENCQUBCP0E+PzxBQUE9RTpEQ0I/RTpERURGSEJOXFJOU0e8zaLY5M6UmaRXXViwvpRzcICb +tIm6vqrd58n3/eHu+eDn9N3q9NnJ2srl9tbc6NPh7dvBxLvt99re8dnW5NHe7dfe7NTs99rm +79jK28Xf69DT2tHY5tDS4NLb6M3d7dXLz8TW4s3U48vD1brL4cTP2MuFj5V1h45vhYNte39m +dnxqeIJwg3uCiXR+hnOAf298gWyCgml9hm1ybF9JTEZda1F5fm2EiW+Mj3yOjnONjnKOj3GL +jHCMhm+MjG+LiHKKjHKFhW2ChWaChW6Afml+f3B8h2aDim2Jj3aRkn6UlHuIj3iEj3B/g2x3 +eml7fmmChGyKkneQmXuXl36VmnyYmn6XnniZpoSdoXmVoICJkG+Lkm6LmHWRl3qVmXycpYWb +o4WfooafpnycoH2bnn+cnH2Vlnqam4GYnXucnYCaoX+bon6Xmnmbmn6WlXibm4CSnH2Qk3aU +mHSZmHiSknaQjmuIi2iOi2aLiWeEiGmKgGKBemF/f2WLgW6FgWaFe2qCfGSBfGp3cld9cWJ9 +fV6EfmZ5cmFoZE9dYU1uZlpla1VrY1RkcVRaVktFPEk+Pjo+PTs6Qzg8Pjc+PTxBRTtAPz89 +PTl9ZUyWclOmeVard1eydVigblCjcVWod1Suc1ylcU6eY1N7VT5qUEqDaEipel+zfly5gGXB +kGjMjm7LkmrJk3POk3LKlXXJkXLEj2u9i2q9hGazeGCweFeufV2zeVuodlqxdFuSZFCRa1OQ +Z02IZFB8a1Pe7rj9//f///////v///3///////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////t+9n///////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////35/+79//j///75 +//zv/+T3//Hy/+36/vL5/+3s9Ob29u30/PT///7///f5+fD+//77//r///75//f5/+76//z/ +///////5//D3//z////1/fL6//r4//v1/fTq+d7r/+n1/+f1//H1/+3+//z9//b7//r////2 ++e30+uv8/fL39urp8uP5/vP1+fD2//b///Xw+Ojw9e3x8enx+Ovl6+Ld4dTX2dTd2Nff9dTZ +2cy+x73NxcDExr7ey9DBuLy5rq+jn6Cfm5yTkpiUh42FgIF8dXdxbW1raWFoY2BaY1paX1Za +W1ZTXFhUW1FTX1VNXFRRVVNRWVFTV05PWVJQU0xWVlJQXU5QVlJVV0pLW01OWEpPWlJPVU1R +SlVLREg+Rz8/ST08RT05RT86RDw5Pzw6Pzk7Qjw2Sjs/RUA7Qz5FSEM/SkE/RT08RkI+Qj82 +QT06Qjs6Rj4+SD07SDw+Qzs8QkA9Qz5CRkE5SUVvg1nC17G5yLdOX16OjnWgqKBUY1CntqTI +2bLh9dXq+9/j+Nvr99zL1M3L3L3g7NPa6s/P2NHW6sH0997c7Nfb6M7T4tDh8NXi9tnc69LP +4cTe8c7U6NTJ4cHF2MPZ5tDO4MbD0sjG4sLH4MS1zbXF28esxLt9jJhwiItrhZBifYBhe31g +d3h4inp/iG6Ch3N6hm9+h3Z2gmZ9gGpgZFdIT0dreFp0gm2GiXGIjnOLkXaNlXeJkHqIjXaG +j3GEjG2AjW2EkG6Cimp/iG9+hm1/hm17iWuFjHiIkXGSlnaNl3WQl3+AiG16hG95gmB1fmh5 +fmiGjnKQlYCSnX6Tn3+Xn32Vn4GSoICVnX6TmX6Om3yGi26Dj3GKmHeTnnibpn6VpH+cp4id +r4Khq4eVoYCcoIKTpH6VoIaPn3eWnnyRloGbn4qWn3qWnnqSmnyTn32VmnuSm3qZln+Rk3OM +lXiPk3OWjXCOjW6LjWmLi26IhGiCgGWChmWFiW6CfWKGh2d+fl5/fGx3dmB6dmJ6eFyCfmd8 +e1xwbFdeY05jaFFma1RqaVdxb1ZkZFVNQkY7Rzk7QDw5PzdFRDw7RTI1RT4/STtCTUVFTTuT +bVimdVSjdla1kHSmb1GndlSndFKpdVqmdliudE+CWEtzWUZmR0NzZEeZeVuogFu6fGK7kWa+ +jmi/kGfNk27InXHIlnTFlGvGinC2hmG0e2Gne1+wdlmre1iyelure1ibb1iKa0yTbE6VbVWD +YkuBjGb5/+f///7///////////////////////////////////////////////////////// +//////////////////////////////////////////v///////////////////////////// +///////////////////////////////9/+j///////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////v///z////////////////4//D7 +//X+//38//r3//Hy/Obq++n7+/Hz/vv7/+r3/ezy+eXt/eT3/e/w/+zs+OLx/PP6//Lt/uj9 +//r9//r///v5//b9/+7+//f///n5/PD07+36/u////7///f///Xz/+r7//P+//b///7///n/ +//7///////v///f6+fL7/fT4//f7//T6//P//ev6//H3+O71++7y+vL///7////z7ufk6+Ds +7Of47ufi5Nnd6Nzk6Nza3tTV1s7Kx8PRycXCwL/Ct7rOscKzp6azo6ynkpmOh4mPhY96cHV8 +bG9rZ2JkZV5fYVhbYFRdXFVUW1JXXFNVWVRVVVNVVlRWVlRXWVNQVU5XVFBXU05TVVFSU0pQ +VlBWV1BWXlZVWE5MUE9NRkZARkBGQT8+QT8/RD89RjtDSUU7QT4+RD88SD5EREQ9RztCQz9E +QTw+Rj87Rzw+QT08RDs8RDo8RkM/REE/RUKWpX+80bKCj5BdXVW0v6RtbX5jgFqstqjH2MHf +79jl7NfZ68zv+du2vrLP4cnf79Dj7Nq7xbjo9dbj9tvc6Nbc6tHM2czd8dPS4tLV48nP5MTZ +6crY3dDO3Me/zbrV5dHK3sPAzMSqzJ7D08C4yLLD08WZtKl6jpdvhI9rgYRleIFhdHlrdn1z +hnV/hW96hWV/gG94f2p7gHB4fmZhWVxNXkZze2R+gGaIh2+Gh3GOkHeLi3OJkHWLjXWHjHGF +iG2BiXCBh26AhW+Ei3GFjW2CimyMknuNmnmOlXqQnnyTlX2OkHuGhnV6fmV8fGl5gGZ6gmyF +kXSOk3uTmHaVnoKQnHmTnnyZo3ybnYOUnICOlXKGjHSJj3eOlXeOnXuZp4SkpoKZoX+Ymn+Y +nX2Vn3yRnHqZnnyUon6cnIOaoX6bnn2Tn3icoH6Rm3uZmXiRmXmYnXyOknSSlnGTl3mTkm+T +k3CQim6Kk3ONjW2JgmiKhWeAhGyJhWGGhmaKiWyLfXCFhWeCdmODc2KCfFyBdWJzcFh+bGJk +YUxnYVJpbFFwal1ndlZ5cV9hXEVJQD8/RDs7QDxBQT87PzhARDlEQDxCTEVKSj1Qak6jelao +elKneFije1uqdFSpb1itdlSndFaueFuTalBzUkZlRz9eTz5qXU6ZbUyVclexfl2viWPIk2TE +kW/JkGvLmXDKmHHMjXDCiWTBhGe5fWWvgV65fV2zfmG1fmGtc1ugdFSRZk6Va1CValKAX0iQ +s3D7/ej///v///r///3///////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////v/9n///////z///////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////7//34/+37//32/+z9 +//n9//v7//X//+35/vft++no7uDl7+H1+uv7/vv1++fy++n8/fn3/erz/fD4//L48OXs9+f4 +/vDz++b1/vP//PX///f9+ev8//n///T///r6/+/9//v///////f9/vL///H+//n///n1/+z6 +//n+//X///7///////////b5+PPz/O79+ezy/ez7/fH//vr////2/+z0+en9//j///////Xy +9ub4/vX5/fH6//X08ubz+fD/+/jr+OXe79rn7tvk7dbc4dXj59XT1c/SzsrLxcfDw8jNwsOu +paicnJablZOLhoaKgH90bWtvZ2lfYltfXlxYXVZYX1VXW1ZWWlNYW1BTWVZVWFFVXFFSVlJS +V1NTW1BYWVRSV01RUFFOU05TVU5LW0xWXlBTVUtVUE5ISEZISUNBTENIS0Y+Sj9ERz8+RD9A +Q0A6QTw8RTs8QTo4REA6QkM9P0FCTkakt5KKoZBZW1uLpneXqKBOTVVsil280bW80Lva8Mja +59nW68zj6N/J2LbW5Mzi79bP3tPC2L/b8NXT59DR4s7T5szO18/E5sLO1MzH3bm+zMHB27LY +58vM2ciquqjS1sfF2MGyuLSOrou4z7e3w7K3xrh8iZtph4dvg4pqfoZmfH1geHpmdX5xgG9/ +hW9+gGh7g3B7gGd8g3F6fmxYU1dSYEpvfGCBiG6FkXGNjHSQkHeRkXqMknKOlH2Lj2+JinKE +iXKJi26Ki26IjnKJkHSHjXWLlnaLmHuSmH2ToH+Tm3yIj3h9hWh1eWh6eGd0gGp+hGyBj3iP +knWPnoGUmH2SnYObpX2YoYKWon2boYaRkXaLinOHkHSOkXOVoH+Wo32YnnmOmX2Vm4GRmnaT +nXyWm3Wbon+XpYSbpYOUnn2XoIOUnnSWnHyUoHiOoHyXlICVk3mQinSOlXWXk32OknqUinGR +jGuTjnSIiWiHhmmCg2KHhWeMiGeFgm6Af2R+gGmCfmF4dGiAfmF7eWd0b19laVdrbFVfXlRm +a05zblxyb15xaFtjY1BVS0U9Rj5DPUE7RDk9PzY7PzlDRkA2QC1MV0lQVkVobFCgdlane1qr +e1qnb1ureVSyfmGxflu6dV+oZlWBZk9QSj5iTUpxSEdtWz6FZ0udblChdlqxg2PBjGXGiWfI +inDVl3W/lnfLknC9iWezgmOvfl2sd2KsgGC1gmGod1mjcVmicVSPa1OOaVGTZ1OCZkytypn+ +/er///v///////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////7/+X///////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////2//Xp/9z0/+vw +/uv6//Lk7t7r7Ofh9uP0++3///z5+e/6/+z6/+31/e/2//L7//H3/+fu++j+//z///n9+e7+ ++/j5/+/4//b+//j///7///P5/fD///Tz9+n1/PH3//X///7///n///72/un5/vT1/+79//f6 +//H6/e/9//f9//n///7///v//////+v9//X+//3///////v///7///3///r1/+79//j///7/ +//j///X6//D3/u75//D///P5//L//f33/e729+b1//Hz+ejy/OX3/+3v8ubl69nV28/Z29Db +3dfX4NTT1crEycHJw73HzsGzq62ptKjEwrCKiY1+gHVwenBrb2JgZGFXYFNVXldaWFBXWVdX +V1FTXlVbXExTVldVUkpQVk9TVk1VW1FTVU5RWE5SVU1SVU5UWVNQV01VXExIU0dPSUhER0FI +REU/Rz88Qj9CR0E/ST4+RkJDUUWBlnpaXWBCSUlZbVZcZWNBRUdvh16pvauPqo7L4L7I1sPZ +687b4s/L2sDE3cLS5svN5MrW4s7N5MrQ4cq6zr3R5MfP3szH1r/F1827w7OvtbOywqHQ2snA +x7aru6nP2MfK4MOxqrNseXysxqWetqizybWBj6BniYxqh4hmeYJjeH1mdHtjdnhvf3mEjneC +hnB7iGyAg296f2t5fWpMTkxfZ1NyfWF+gnGEi22HiXKGjHOOk3WHi3CPj3KIjW6GinGFiWyM +inKEimeGiG6HjHCIkHmJkXOMkXSFl3OSnXyRm3mRkHl4e2h1e2hwdmB9fml/iWeHi3aLl3GT +nHqPlXKXnIaXnXWTn36SnXqWnX+LjnWBiW6Gk3GLkXSSnX2Xm3KRk3eNknOQlHuOk3GQnHiT +l3yWoHeeo4CaoICalX6PnHyamH6SmXmUln2UnX2amYOKk3WaknWQknGOjHCMkHKPi2yNjGqM +iWqJh2yDg2qGhWuEh2iDfmiBgWCCfGWCfWJ8fWF8eF14dlx9dlpwbV1waVlaYU9iZFZvdVZx +cllpbk9ybVpdWkBDRkU+RDc+Qj4/QTc6Pjs+Qz1DQkE/TT1AQjlFRkB4a0qgdViqe1SvgFqz +eli6fV63dVe8gmS0dVqec1d9W0tHQj5QTztrTUVyVz1zX0yOZkuabU+xelysimDHimy+hmrI +jW7AimnBimK3gGC5fF6yfF6oc1W1gF2reVarcmCbdlWjcFaOakuYYlKKY0mFZ06+46P9//b/ +//7///////////////////////////////////////////////////////////////////// +//////////////////////z///////////////////////////////////////////////// +///////////////////8/+r///////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////z///z///v////////////6//r1/+v9//v1/e/4 +//CQAQAAAQAAAJABAAABAAAA +--------------A9E4A76F8F8B49A8F9408311-- + +--------------D866708591E89309695535AC-- + + + +--------------746A59DD382995F41B0947E-- + +From - Thu Feb 8 18:49:08 1996 +Return-Path: izzy@scr.atm.com +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id RAA04054 for ; Thu, 8 Feb 1996 17:35:41 -0800 +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id RAA06978 for ; Thu, 8 Feb 1996 17:35:51 -0800 +Received: from scr.atm.com (root@[206.100.186.2]) by ns.netscape.com (8.6.10/8.6.9) with ESMTP id RAA08762 for ; Thu, 8 Feb 1996 17:35:03 -0800 +Received: from mailman.scr.atm.com (mailman.scr.atm.com [206.100.186.54]) by scr.atm.com (8.6.12/8.6.9) with ESMTP id RAA23678; Thu, 8 Feb 1996 17:35:10 -0800 +X-UIDL: 823829838.001 +From: izzy@scr.atm.com (Dr. Mark K. Joseph) +To: jwz@netscape.com +Date: Thu, 8 Feb 1996 17:33:10 -0800 +MIME-Version: 1.0 +Message-ID: <19960209013311.izzy@scr.atm.com> +Subject: Example of CID linking in a multipart/related MIME message +X-Mailer: Emissary V1.20, by Attachmate Corp. +Content-Type: multipart/related; + boundary="=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7"; + type="text/html"; + start-info="X-twg-cidlinking-V1.2" +Content-Transfer-Encoding: 7bit +Status: U +X-Mozilla-Status: 0001 +Content-Length: 46628 + + +--=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7 +Content-Type: text/html; charset="ISO-8859-1" +Content-Transfer-Encoding: quoted-printable + + + +Example of CID linking in a multipart/related MIME message + + +

+ +B= +uy, Try, Update to = +Emissary 1.1,
+Or Update to SSL Secu= +rity Instantly, Free!
+3D"=3D"Emissary
+3D"WOLLONGONG
+
+
+

+ +


+

+ +Wollongong has been a leader in software-based networking solutions fo= +r 15 years. Now, The Attachmate Cor= +poration has acquired Wollongong, and with the new EMISSARY line of products, Attachma= +te is "The Intranet Company." The Wollongong Group, Inc., now the Attachmate Internet Products Grou= +p, is headquartered in Palo Alto, California, with additional operati= +ons in McLean, Virginia, Santa Cruz, California, and Bracknell, U.K.

+ +


+

+ +All comments or questions regarding this Web site should be addressed = +to johnn@twg.com.
+Images and contents of this site are Copyright 1996 by The= + Wollongong Group, Inc., The Attachmate Corporation, or the respective do= +cument owners. and may not be copied or reused without permission except = +for purposes of reviewing or promoting the Wollongong Web Site or product= + line.

+This Site is Enhanced for best viewing with Emissary!



+ +--=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7 +Content-Type: image/gif +Content-Transfer-Encoding: base64 +Content-ID: <2.19960209013310.izzy@scr.atm.com> +Content-Disposition: inline; filename="attach3.gif" + +R0lGODlh+gBLAPf0AP////f/7+fe1r3v3ozOzrXGvb2thJylnJSclIyMjGPGxgD//0q1vUqUlDGl +tRiUpQiElAAA/2NrpTlrrRhjlAhzhABzhP//Zvn5Y/PzYvPzYe/vX+rqXurqXejoXd7eWdraV9bW +VtTUVdLSVM/PU87OU83NUsXFT8TETsLCTeecSri4Sre3Sa6uRa2tRaenQ6GhQa2ESp2dP5mZPpiY +PJKSO46OOYqKN4WFNYODNJRjIXNzc2ZmZmNjY0pKSiFjewBjczlSYwBKY4CAM3p6MXl5MHR0Lm5u +LGZmKHNaMV9fJl1dJVdXIlFRIVJCKUhIHUJCGjk5OSkpKTw8GDMzFTExFDAwEy8vEyQkDhAQCA0N +BQoKBAcHAwAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm +mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/ +zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm +/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YA +AGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZ +M2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kA +ZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZ +mZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwA +zMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/yH5BAEAAPQALAAAAAD6AEsA +QAj/ALsIHEiwoMALCBMqXMiwocOHECNKnEixosWLGDNq3IiwIIAuAEIa7ELRQJcCPFKqXMmypcuW +CxawjElTpsqaMG2ujDlTJw+eO33+tAk0JdCiL4vizNnTqFCnQaEyffkyixMVFgl+BClwK8GSWVJG +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 +dzR7Z/CIgF4WEAA7 + +--=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7 +Content-Type: image/gif +Content-Transfer-Encoding: base64 +Content-ID: <3.19960209013310.izzy@scr.atm.com> +Content-Disposition: inline; filename="liluse.gif" + +R0lGODdhCwFLAOcAAP78/P379vf4+Pv56vjq6+vv7eHr4vrm3PztzvHc1fzZx9bPzcvEyf/luP/i +rf7XvP/dtP/VtP/erf/ar//aq//Vrv/XqvjYqv/ap//cpf/Wp//Sp//Wo//So/rSo/LOsP/MpfzK +pv/OoszJsdXVrP/Zn//Vnf/Sn//Sl//Onv7MnPbJmf7GnP7Nlv/Ll//Lk/3Flf/HkvbFk+7Elv7F +jf7GifbDjezDjK7JrcS6qc+3qvm9lOu8k/29i/W9jP28hfW9hPu2iPS2hO29jOa8jOm3iu68he21 +hOW1hOethM+xkdy1id2tg9ash8ifm7y5qLOxqJSupayfobqqmbKslrimipanj7SXi6mah46WiXWh +jf/Df/u3e+m1fPmteOqreuWtfeWtduSmdfy1b/mpaeWnbd6tfduqetOue92lddakddykbdWjbtml +Zsyja+mcaNeddMiaddudbNWda9mZZ9WcZNSXYsqaacyVYsWUY9iJYciNY/WjVuqRUtSVWMmUWdWM +VciLV9mGScaGSrekbp+ifa2UdrqXZbeNZKaIaJSKcbuUWa6UVrqHVquIVruFS6yESZeGWv//ANyG +PLeGOXKMbFyKagD/AMt6R454ard6R6tzT6h6SJh5V4lyVJZoV5l3SpZqSIdpR89wMs9oF9xjDMlj +ALh4Oal3OahsOLFyLqZpKpd2N5hrOIZnOplmK4llLKtYLoxVLqdpGqtnB5NkEKtUBJlYAI5TCodJ +AKQmAIs2AW95alNyaHlpSW9sUFFqTHJXRlBWSzxkSjo7RHhmOmtkOnRjLFdiOHhYOmhXN3pYK29P +L2hKKFhWOU5MMVdIKnVhFXFSEnpHAGlIAFFHCChWJi5NA2U1JlA5Knk4AGg3AG4rAVc2AEk5AFUt +BUcrAHURAGcAAE0aAFYAAE0AAEUAAC0tJzMwAgwvATEaADwAADMAACwAACUAAAYaABoAAAAAAAAA +AAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMywAAAAACwFLAEAI/wDjCRxI +sKDBgwgTKlzIsKHDhxAjSnT4KVm1Y9J8FZsGa5koSIfQLEFC5IaNGS1CeMjAoQIGCRgqbGiBooWL +FylSuGhxwoWKDSJEtFChYgcMGjF2xPiBtEYLGD5BmEhhokXOFDZPdEghwsMJDRs0JJREtqxZSRPT +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 + +--=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7 +Content-Type: image/gif +Content-Transfer-Encoding: base64 +Content-ID: <5.19960209013310.izzy@scr.atm.com> +Content-Disposition: inline; filename="wollogo2.gif" + +R0lGODlhFQLSAPfXAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm +ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ +mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm +zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ +/2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ +AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA +M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ +ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA +mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ +zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A +//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M +AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAA0NDRoaGigoKDU1NUNDQ1BQUF1d +XWtra3h4eIaGhpOTk6Ghoa6urru7u8nJydbW1uTk5PHx8f///4Q/FlVHIMlAiuI2BoQ/FlVHIDRA +itcfhSx7JD+0PwA+dih7JPYAABUAAIcAAAZ7OAAAKEd7XP8ADvY8RyH5BAEAANcALAAAAAAVAtIA +AAj/AK8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX +MGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9eHrQQR +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 + +--=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7 +Content-Type: image/gif +Content-Transfer-Encoding: base64 +Content-ID: <0.19960209013310.izzy@scr.atm.com> +Content-Disposition: inline; filename="BULLDOG.GIF" +Content-Description: The Sender's Signature + +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 +Ow== + +--=_09tW13g.bO1996u.N01d000A.r02Y.33:0018d7-- + +From - +Return-Path: +Received: from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7) + id for nsb; Fri, 25 Sep 92 21:30:21 EDT +Received: from att.att.com (att-out.att.com) by thumper.bellcore.com (4.1/4.7) + id for nsb@greenbush; Fri, 25 Sep 92 21:30:19 EDT +From: develop!nextmime@ebony@sblab.att.com +Received: from ebony by develop (5.59/25-eef) + id AA28800; Fri, 25 Sep 92 14:08:15 PDT +Received: by ebony (NeXT-1.0 (From Sendmail 5.52)/NeXT-2.0) + id AA00975; Fri, 25 Sep 92 14:13:02 PDT +Date: Fri, 25 Sep 92 14:13:02 PDT +Original-From: develop!nextmime@ebony (NeXT MIME Prototype) +Message-Id: <9209252113.AA00975@ ebony > +Received: by NeXT Mailer (1.63) +To: @develop:sblab!att!thumper.bellcore.com!nsb +Subject: More richtext questions/comments +Cc: robb@develop +Mime-Version: 1.0 +Content-Type: multipart/mixed; boundary=tmrob +Content-Length: 2579 + + +--tmrob +content-type: text/richtext + + + + + + + + Nathaniel, + + + +I think the biggest problem with point size in the mail I sent you earlier was my own + +misinterpretation of the rtf "fs" command. It was not documented in my (sparse) + +RTF documentation but I guessed from context that it was point size. I've done more + +experimenting since then and concluded that it is consistently twice point size. So + +instead of a mixture of 12 to 24 point my previous message to you was 24 to 48 point. + +I didn't see it here because I either read it with metamail and no font software, or looped + +it back and read it on the NeXT where everything reversed itself. + + + +It should be fixed here: + + This is 12 point. + + + + This is 14 point. + + + + This is 16 point. + + + + + + This is back to 12 point. + + + +I do have some followup questions. Can I close a "bigger" environment with a "smaller" + +and vice-versa? I was doing that but for safety's sake I now use, e.g. "/smaller" when + +growing and the current point size is less than 10, but "bigger" when growing and the + +current point size is 10 or greater. Is this necessary? + + + +I also have a question about external-body messages. If I have a multipart message it + +would be nice to make the first external-body segment ftp, with parameters that would + +cause it to essentially mget all the files, so later segments could be local-file. To do that + +I really want the first ftp call to mget all the files, create a subdirectory on the user's host, + +and put the files into the subdirectory. One way to do that would be to make the NAME + +on the ftp access type the basename of the directory containing the message and make + +the MODE "directory" or "recursive" or some such. But it needs to be something well + +defined for all the MIME readers. Any thoughts on this? + + + +Finally, I'm pursuing the problem where WIN/3b munched my Content-type line. + +I t's Wollongong rather tha attmail, but I haven't heard back yet from Wollongong. + +A "content-length" caption was added in as the content-type line was mangled, + +so I suspect WIN/3b sendmail has its own private interpretation of content-type. + +Until then I've shortened my boundary down to 5 lower case characters so this + +message shouldn't cause the trouble the last one did. + + + +Thanks for your help, + +Marty + +robb@sblab.att.com + + + + +--tmrob-- + +From - Thu Apr 25 10:19:58 1996 +Return-Path: raph@callisto.hip.berkeley.edu +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id EAA18301; Thu, 25 Apr 1996 04:30:51 -0700 +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id EAA01168; Thu, 25 Apr 1996 04:29:58 -0700 +Received: from RSA.COM (RSA.COM [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id EAA17575; Thu, 25 Apr 1996 04:29:05 -0700 (PDT) +Received: from callisto.HIP.Berkeley.EDU by RSA.COM with SMTP + id AA26475; Thu, 25 Apr 96 04:25:34 PDT +Received: (from raph@localhost) by callisto.hip.berkeley.edu (8.6.12/8.6.12) id DAA00979 for smime-dev@rsa.com; Thu, 25 Apr 1996 03:26:57 -0700 +Date: Thu, 25 Apr 1996 03:26:57 -0700 +From: Raph Levien +Message-Id: <199604251026.DAA00979@callisto.hip.berkeley.edu> +To: smime-dev@RSA.COM +Subject: Multipart/signed message format +Mime-Version: 1.0 +Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; + micalg=rsa-md5; boundary="7oU2Ma36WUas7M" +X-Mozilla-Status: 0005 +Content-Length: 1784 + +--7oU2Ma36WUas7M + +Dear S/MIME developers, + + I believe that this is a valid S/MIME multipart/signed message. The +implementation is still quite experimental, so as yet I have no way of +verifying that it is, in fact valid. The code is quite similar to my +PGP/MIME and MOSS multipart/signed implementations, so there's reason +to believe it works, but, then again, a lot can go wrong. + + If anyone can verify this message or tell me where I went wrong, it +would be much appreciated. + + By the way, there's a minor nit to pick in the S/MIME message +format document. After clearly (and correctly) calling out the fact +that MIME parameters including slashes need to be quoted, the example +of the multipart/signed at the end of the document is lacking quotes. + + Also, when the spec is finalized, it would be nice if the examples +had valid PKCS data :-) + +Raph (who really needs to get some sleep after staying up past 4am) + +--7oU2Ma36WUas7M +Content-Type: application/x-pkcs7-signature +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCAMIACAQExDjAMBggqhkiG9w0CBQUAMAsGCSqGSIb3DQEH +AaCAMIIBQjCB7AIRAN8ws2vZH70kgc/aYPAb7EswDQYJKoZIhvcNAQECBQAwJTEj +MCEGCSqGSIb3DQEJARYUcmFwaEBjcy5iZXJrZWxleS5lZHUwHhcNOTYwNDI1MDQ1 +OTMxWhcNOTcwNDI1MDQ1OTMxWjAlMSMwIQYJKoZIhvcNAQkBFhRyYXBoQGNzLmJl +cmtlbGV5LmVkdTBaMAoGBFUIAQECAgIIA0wAMEkCQgC//PdZ46JmErS4tgZaI0rq +sHFosshkiNyqT5pVmcS8Aym2JBTtpZOL2oiZDWswBL21Hitxu3Mb2Wa3XNLFhT4y +xwIDAQABMA0GCSqGSIb3DQEBAgUAA0IAfkFzTSTLNoGvOF36wiQpsQ7oRmG8y/U/ +bjjoyVVtAHYikVTYQ3nPN/v8E84psDJu5mkSt9h2fa6c36nHMlEDAoMAADGAMIGf +AgEBMDowJTEjMCEGCSqGSIb3DQEJARYUcmFwaEBjcy5iZXJrZWxleS5lZHUCEQDf +MLNr2R+9JIHP2mDwG+xLMAwGCCqGSIb3DQIFBQAwDQYJKoZIhvcNAQEBBQAEQSUh +EF1KhpoFv1g5O/pOCaEploY8j6UmuR76CJf/6IS+2FPjH1o4Fkxqxzs2/MOp24Dr +leU63btqDC77W9cZ1lsCAAAAAAAAAAA= + +--7oU2Ma36WUas7M-- + +From - Fri Nov 8 18:21:51 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.01) with SMTP id AAA16354; + Fri, 8 Nov 1996 11:45:02 -0700 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id LAA02061; Fri, 8 Nov 1996 11:43:46 -0800 +Received: from krusty.strataware.com (krusty.strataware.com [199.246.138.42]) by xwing.netscape.com (8.7.6/8.7.3) with ESMTP id LAA26164; Fri, 8 Nov 1996 11:44:58 -0800 (PST) +Received: (from rosenqui@localhost) by krusty.strataware.com (8.7.1/8.7.1) id OAA29470; Fri, 8 Nov 1996 14:45:18 -0500 +Date: Fri, 8 Nov 1996 14:45:18 -0500 +Message-Id: <199611081945.OAA29470@krusty.strataware.com> +From: Eric Rosenquist +To: Lisa Repka , Jamie Zawinski +Cc: S/MIME Test Account , + Eric Rosenquist +Mime-Version: 1.0 +Subject: My encryption certificate for S/MIME testing +Content-Type: multipart/mixed; boundary="-ABC" +X-Mozilla-Status: 0005 +Content-Length: 3409 + +This is a MIME encoded message. Decode it with "munpack" +or any other MIME reading software. Mpack/munpack is available +via anonymous FTP in ftp.andrew.cmu.edu:pub/mpack/ +---ABC +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + +Netscape: here's my encryption certificate for S/MIME testing +purposes. Beware that this is an Entrust certificate rather than +Verisign. Among other things, this means that I have a separate +key pair for signing and encryption, so you'll have to use this +one to encrypt for me and use the certif included with signed +messages (rather than this one) to verify signatures. + +Eric +--------------------------------------------------------------------- +Eric Rosenquist, Strata Software Limited http://www.strataware.com/ +mailto:rosenqui@strataware.com Tel: 613-591-1922 Fax: 613-591-3485 +Quote: I discovered a meal between breakfast and brunch! + -- Homer Simpson +--------------------------------------------------------------------- +---ABC +Content-Type: application/x-pkcs7-mime; name="eric.p7c" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="eric.p7c" +Content-MD5: THv54kLXRGIbbpoHJeNKGA== + +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 +eNmVDny/dh6w1pNIAhVyHzEA + +---ABC-- +From - Thu Nov 21 13:20:54 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.01) with SMTP id AAA27656; + Thu, 21 Nov 1996 13:20:43 -0700 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id NAA20931; Thu, 21 Nov 1996 13:19:19 -0800 +Received: from RSA.COM (chirality.rsa.com [192.80.211.33]) by xwing.netscape.com (8.7.6/8.7.3) with SMTP id NAA00850; Thu, 21 Nov 1996 13:20:34 -0800 (PST) +Received: by RSA.COM + id AA02049; Thu, 21 Nov 96 12:11:51 PST +Date: Thu, 21 Nov 1996 16:10:23 -0500 +Message-Id: <199611212110.QAA14653@krusty.strataware.com> +From: Eric Rosenquist +To: S/MIME Developers +Cc: Eric Rosenquist , + Michel Ranger , + Ron Vandergeest +Mime-Version: 1.0 +Subject: My encryption certificate for S/MIME testing +Content-Type: multipart/mixed; boundary="961121152248_14052" +Sender: owner-smime-dev@RSA.COM +Precedence: bulk +X-Mozilla-Status: 0005 +Content-Length: 5854 + +This is a MIME encoded message. Decode it with "munpack" +or any other MIME reading software. Mpack/munpack is available +via anonymous FTP in ftp.andrew.cmu.edu:pub/mpack/ +--961121152248_14052 +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + +Hi everyone. I'm a consultant working with Nortel on their S/MIME products. +I've already completed basic interop testing against Deming's Secure +Messenger and at Blake's suggestion I am about to post a signed message to +this list for others to use in interop testing. If you have questions about +Entrust in general, please visit their web site . If +you have questions about the forthcoming S/MIME toolkit for Entrust please +email Michel Ranger or Ron Vandergeest +. E-mail any technical interop-related questions +directly to me . + +One big thing you should be aware of with Entrust is that it uses separate +key pairs for signing and encryption, so you must be careful to distinguish +between my verification certificate and my signature certificate. You +should import *this* certificate into your local database if you want to be +able to encrypt for me. For now, signed S/MIME messages created with the +Entrust toolkit will include both certificates for the originator as well +as the originator's CA certificate. Eventually this will be under the +programmatic control of whatever app is using the toolkit, so it's +important that you look at the certificate you're importing to make sure +it's the one you want. You can tell which one you've got by looking at the +keyUsage V3 cert extension (object identifier 2.5.29.15). The encryption +certificate has the keyEncipherment bit set (bit number 2 or 0x20) and the +verification certificate has the digitalSignature bit set (bit number 0 or +0x80). + +One other thing that some of you may not have encountered before is that my +CA is not Verisign. Included in the P7C (as well as my signed S/MIME +messages) is my CA's certificate - a self-signed certificate. You can +distinguish this form of certificate (a self-signed CA) from a self-signed +user certificate by looking for the keyCertSign (bit 5) or cRLSign (bit 6) +bits in the keyUsage extension. Failing that, you can look for the +basicConstraints extension to see if the 'cA' BOOLEAN field is present and +TRUE. + +Without further ado, here is my encryption certificate and my CA's +signature verification certificate. I'm away all of next week, so if you +have questions or discover any problems please e-mail me ASAP. If you +don't get a reply by the end of Friday I'll try to get back to you as soon +as possible after Dec. 2nd. + +Eric +--------------------------------------------------------------------- +Eric Rosenquist, Strata Software Limited http://www.strataware.com/ +mailto:rosenqui@strataware.com Tel: 613-591-1922 Fax: 613-591-3485 +Quote: I discovered a meal between breakfast and brunch! + -- Homer Simpson +--------------------------------------------------------------------- +--961121152248_14052 +Content-Type: application/x-pkcs7-mime; name="eric.p7c" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="eric.p7c" +Content-MD5: uqh4Ulmz/0OvRmRYshEwJQ== + +MIIHVgYJKoZIhvcNAQcCoIIHRzCCB0MCAQExADALBgkqhkiG9w0BBwGgggcrMIIDgDCCAumg +AwIBAgIEMpBhhzANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJDQTE1MDMGA1UEChMsRW50 +cnVzdCBTL01JTUUgSW50ZXJvcCBEZW1vbnN0cmF0aW9uIE9ubHkgQ0EwHhcNOTYxMTIwMTU1 +MjM1WhcNOTgxMTIwMTU1MjM1WjCBljELMAkGA1UEBhMCQ0ExNTAzBgNVBAoTLEVudHJ1c3Qg +Uy9NSU1FIEludGVyb3AgRGVtb25zdHJhdGlvbiBPbmx5IENBMVAwEAYDVQQFEwk4NDg1MjMx +ODIwFgYDVQQDEw9FcmljIFJvc2VucXVpc3QwJAYJKoZIhvcNAQkBFhdyb3NlbnF1aUBzdHJh +dGF3YXJlLmNvbTBaMA0GCSqGSIb3DQEBAQUAA0kAMEYCQQDGWzna0zhZqRFNLsKp3n1QARcM +IgTPKNCOhp3P1GULQQy/xyyof8Nhz4k6iO1rgo89SCVYAvq2iMk6jQUmNO3jAgEDo4IBcDCC +AWwwYAYDVR0ZBFkwVzBVMFMxCzAJBgNVBAYTAkNBMTUwMwYDVQQKEyxFbnRydXN0IFMvTUlN +RSBJbnRlcm9wIERlbW9uc3RyYXRpb24gT25seSBDQTENMAsGA1UEAxMEQ1JMMTAUBgNVHQEE +DTALgAk4NDgzMjI5MzcwGAYDVR0CBBEwDwQJODQ4MzIyOTUxAwIFIDANBgNVHQoEBjAEAwIG +QDAUBgNVHSMEDTALgAk4NDgzMjI5MzcwEgYDVR0OBAsECTg0ODMyMjk1MTALBgNVHQ8EBAMC +BSAwCQYDVR0TBAIwADBmBgNVHR8EXzBdMFugWaBXpFUwUzELMAkGA1UEBhMCQ0ExNTAzBgNV +BAoTLEVudHJ1c3QgUy9NSU1FIEludGVyb3AgRGVtb25zdHJhdGlvbiBPbmx5IENBMQ0wCwYD +VQQDEwRDUkwxMB8GCSqGSIb2fQdBAAQSMBAbCkpBU1BFUiAwLjEDAgbAMA0GCSqGSIb3DQEB +BAUAA4GBAIk5IGnAWKAIIrM6Iv1ySEz12l6QeOXJB7/DxNGoMXrPWrJMYDF8DNdWSls60ukK +hUN/5zkQQYDOSbTCsRTh6+aZM+i+tNQEW2T/6QqbCF5XzdDcM/5Tpf09PgMkjWUoOc12fcF8 +FUn8QHGsjMFuge86UprBchakJQBLo2rQT58bMIIDozCCAwygAwIBAgIEMpBheTANBgkqhkiG +9w0BAQQFADBEMQswCQYDVQQGEwJDQTE1MDMGA1UEChMsRW50cnVzdCBTL01JTUUgSW50ZXJv +cCBEZW1vbnN0cmF0aW9uIE9ubHkgQ0EwHhcNOTYxMTE4MTMxNTM2WhcNMTYxMTE4MTMxNTM2 +WjBEMQswCQYDVQQGEwJDQTE1MDMGA1UEChMsRW50cnVzdCBTL01JTUUgSW50ZXJvcCBEZW1v +bnN0cmF0aW9uIE9ubHkgQ0EwgZ0wDQYJKoZIhvcNAQEBBQADgYsAMIGHAoGBAKDpfkhv4sFk ++otmMcegaghJFlAOYIj9giN4qid7wfHZhPuE0pUTC1xIB4ytNaEu5j+jh8lUgcd31a7QcCmI +Yh8VzR8bCoGjaVBwOsWDshKFTx8iWeJcQ1fhSIofHWS5VbQudjxeJBzuU8pRXwAr3YXzOR6A +dBbaYZy6PGUYXLgTAgEDo4IBojCCAZ4wYAYDVR0ZBFkwVzBVMFMxCzAJBgNVBAYTAkNBMTUw +MwYDVQQKEyxFbnRydXN0IFMvTUlNRSBJbnRlcm9wIERlbW9uc3RyYXRpb24gT25seSBDQTEN +MAsGA1UEAxMEQ1JMMTAUBgNVHQEEDTALgAk4NDgzMjI5MzcwKwYDVR0CBCQwIgQJODQ4MzIy +OTM3AwICBDARgQ8yMDE2MTExODEzMTUzNlowDQYDVR0KBAYwBAMCB4AwFAYDVR0jBA0wC4AJ +ODQ4MzIyOTM3MBIGA1UdDgQLBAk4NDgzMjI5MzcwCwYDVR0PBAQDAgEGMBoGA1UdEAQTMBGB +DzIwMTYxMTE4MTMxNTM2WjAMBgNVHRMEBTADAQH/MGYGA1UdHwRfMF0wW6BZoFekVTBTMQsw +CQYDVQQGEwJDQTE1MDMGA1UEChMsRW50cnVzdCBTL01JTUUgSW50ZXJvcCBEZW1vbnN0cmF0 +aW9uIE9ubHkgQ0ExDTALBgNVBAMTBENSTDEwHwYJKoZIhvZ9B0EABBIwEBsKSkFTUEVSIDAu +MQMCBsAwDQYJKoZIhvcNAQEEBQADgYEAWZAeWY0jxvT5nRfzPZDULNebM+GdSNLC+YyPYqeE +bD7iR09O0Jh0tP2NyISUcWlRullDIYE8by4T6NhZy0MDrvA3alWxaeGgyEWnqa+kuFOgZTjQ +jc3k4hF1UrhdqK+KfIwz8lhWiDCmSL9IrUFosNwL23rW/pQBm3TZcVCO+nAxAA== + +--961121152248_14052-- +From - Wed Dec 11 18:06:10 1996 +Return-Path: +Received: from urchin.mcom.com ([205.217.237.40]) by dredd.mcom.com + (Netscape Mail Server v2.02) with ESMTP id AAA17435 + for ; Wed, 11 Dec 1996 18:05:59 -0800 +Received: from gruntle (gruntle.mcom.com [205.217.227.10]) by urchin.mcom.com (8.7.5/8.7.3) with SMTP id SAA20049 for ; Wed, 11 Dec 1996 18:05:55 -0800 (PST) +Sender: jwz@netscape.com (Jamie Zawinski) +Message-ID: <32AF6884.41C6@netscape.com> +Date: Wed, 11 Dec 1996 18:05:56 -0800 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0 (X11; U; IRIX 6.2 IP22) +MIME-Version: 1.0 +To: jwz@urchin.mcom.com +Subject: signed frog +Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------167E2781446B" +X-Mozilla-Status: 0001 +Content-Length: 15749 + +This is a multi-part message in MIME format. + +--------------167E2781446B +Content-Type: image/jpeg; name="bad-frog.jpg" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="bad-frog.jpg" + +/9j/4AAQSkZJRgABAgEASABIAAD/7QEXQWRvYmVfUGhvdG9zaG9wMi41OgBIAAAASAAAOEJJ +TQPpAAAAAAB4AAgAAABIAEgAAAAAAtsCQP/n/+4C/wJSHwMFKAP8AAEAAAEsASwAAAAAC+cJ +YAEsAC0FoF7sACYCAQEBABgAAScPAAEAAQAAAAAAAAAAAAAAAAABAGQAAAAAAAAAAAAAAAAA +AAAAAAAAAAACAAAAAAQCBAUAAAAAOEJJTQPtAAAAAAAQAEgAAAABAAEASAAAAAEAAThCSU0D +8wAAAAAABwAAAAAAAAAAOEJJTQP0AAAAAAASADUAAAABAC0AAAAAAAAAAAAAOEJJTQP3AAAA +AAAcAAD/////////////////////////////A+gAAP/uAA5BZG9iZQBkgAAAAAD/2wBDAB0T +FRUWExsbGx0rHiAiKzYuKysoOlNSQjNCTVBlZmBiYmBrboCCdXJ1dmh9iouLjpWlpaWikqWl +paWlpaWlpaX/wAALCAD+ANUBAREA/8QA0gAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoL +EAABBAEDAgQCBQYGCAcDDWEBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSYjM0wXKCQwcl +kghT0fBjczUW4aLxsoMmRJNUZEXCo3Q2FxjSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl +9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9yg4SFhoeIiYqLjI2Oj4CRkpOUlZaXmJmam5ydnp ++QoaKjpKWmp6ipqqusra6vr/3QAEABv/2gAIAQEAAD8At52dk1ZV9bLNoaAWiB+7PgsujrXU +32ta6/Q/wW/5Ftvycj7MXNf7tvMDlYjurdZHNp/vG/5Ffx8/Pfhmx1nuA52j/IhZPU+oiut1 +dupmfa3/ACKfTeo59zni2wmOPaP8ifMzupNtIqsIb/Rb/kVfE6n1R2S1lthLe42t/wAiu3Z+ +U3KYz1IaRxA/yKhb1PrDbHRadsmPa3/ItA52YcTcHfpNvgOfuWY7qfWwJ9Q/3jf8ivYPUc6z +HcbLJeJ/NH+RRs6lnfYHPZZ+kDhrtHH3Kg3rnU51v/2rf8is/trLEfpv9q3/ACLTozzZTvNg +P3Kld1bI3EMt4PgP8iu4mbY9pFj/AHT4BDyepOZc1rbIB7QEevNDmzvn7lkdS6zm1X7abobH +7rT/ADJ/2tn+jY71tQBHtbz9yq/tzqn+P/2rf8ikOtdT/wAf/tW/5Fc/amd+yfX9X9J6+zdt +HG2fBf/Ql1P/AFRyPg3/AHkLPNLa3tW1TY30gCUDIFRaptNYxntHdpVfF2isbv3UbGfS0kyi +vsqOsqs22kXSo5lrX5FJbrAKldbWGtHccqbcqrYASFB+RSWnUKGPk1AOEjUEKFTwMR+7iVl2 +RuMcIZBUg94EBxCNiCbDPgi5z3MyCGuI0CquscTJJJS9V4GjihuJOpV4yMS0O50iFTA1Ulf/ +AOMH/oq/44v/0Z9VEdTd5tH5FQyNXtRpO0CUxk8pawmJJx2zzPZC1UZPiVAqdE+oJ8VHK/j7 +PigmUydv0m/EK86f2baf4YWeQmhJGxdHn5KXUNcp/kAPwVYpkx4V1/8AI7PNwCqBSV//AIwf ++ir/AI4v/9InVf8AVL7h+AVGwS4+RRBG1KRCbzSaD9nE+JlCIQy9s8pNAfwVOpp9UDzUc0tZ +e8fD8irlzYlR3s8U7XtJELRfH7Lf/TCziQkSFGRKNjRu+5SyWl+Q+PFVn1uDkoUm1PInaY8Y +Vm8FuJHi9U2qeivf8YP/AEVf8cX/0ydWj7cT4Ob/ALyFTt0e74qY1rUHMIEpm+8QE87cd58H +KuPUsdpwmqxi+2HKzZgOr1YUNjXMtbuHdB6s39O53iq213pSq6PQNPmtW0R0p5/0QLKa6SUN +zyHJw+XBWsWPU+Y/nUcq015dnxQ32g6pqzvsa0GJIC6Ci9tDm0N93iVHqOL9raRjt9wMkdis +LaWuLToQYKkVfj+4P/RV/wAcX//Ufqx/uhb5Fv8AvIVbI+nPjCnT9BGsYPTVCm0NuIRiZxr/ +AIgqGPawQEXcBaCrhsG0Sqdxab648UsqgWWPPmhPpApjyWU9ha4hGxwSQPNar2mzpT2jkvH5 +VmnGtpI3sLd3E6SgOx7JJ2kDzCG5rmmCIVzp8G3XxH86F1DXLt+KAZ4KTSWuBHZXmZdosZYB +JGhCs1dTyt59INAcSRKoOcX2Oc7UuJJUlen+4P8A0Vf8cX//1V1aft+QfDb/ALyFWvP0D4hT +odOiuPH6OFix+tEBXKQDVcw8ECUO7EZSWlrj80cY4eAS4hQyWmqsQ8qLabA2u48FwAV0tBBd +OsoFnu0OiqWYTDLg4oNNb2v0EgFbPTGB9QY7jeT+Kq9Uyqbbr2Oa4uaS1o8I0WY52RRtmWhw +3AHggopbXk1b4hw0KfEbDxHMj8ihdWDlPB/eQMloD4CD3VursrdrW14zSGgGOVSA1U40V6P7 +hf8ARV/xxf/WfqeudljuA3/eQqWUf0VJ8iFDDefVhW8nKFYjxCoY5NmUCrr2x64/gLLZY82M +BcTr3KvZpeGMDCQSY0VanJaHEPlwjk6wVpvtH7MxgdHEggHwk6qLnPdYWN4AkFEoxy5u5/0h +qQD2+CJnDCf+h/i3kQHAfzqljuqrd6V4LLG8Hs7wVzA0oDg7bqSlbS12UzIIa14+lM7XR3B7 +H4rP6tL8qt5bG5rZ8NEF7SwucBDZ2n4qWGJcT/DCa7XKtP8ACKZ1Yc2UKvDutY6xrSWN5dCe +kTaxvxW/TiUXYjHPbMjQFZnUcIYrw5mtbuPEeSqAaK9H9wv+ir/jq//Xjnn+6+Y3xDf94Cp5 +OuHXHAdCDhGMgeaJ1MwWKvh2xe1aZdutsH7zFjNMWN+K0ctxbXW4cgqpU1hZtIAMy53cAd1a +vzW3WhjGgMbtDfGBpCtC2mu6XnVzQAI7KxRmVAEGsvnsAUQBl2jKrQD4tESFQzcC51Rthx2+ +LY0VjCl2G5oO0teT8FNleSzQPa/gjVAzqm30F2wNsEka8xoQhkOuxK5r2sDQR/C8Sg0MNZjx +cPyJVUl11jj3JKjaxwO1vdbtNX2LA2tG57WEw3u5YuDiX35W5zS0TL3ERyugftrrMAANGk9g +Fk9SeLsCuxvZ0keEysxvCvf8YX/RT/xxf//Qh1AO/beQYMEM/wB5CrXj9Qs7w/8AnVTEfF7F +Z6qAWsPmqFGlzD5rXb/KGeYIWO7S0+RV7Mk4w+SrgbvNxAOijUzbfBgrXbcyp7Q4taYBBLQf +xVhmXRtH6Yt+PdM/JaBplaH4FV8jPu9GwCHNI2zxz5JYV76MS2wDUFpn5wpDqm/6dbTPki15 +mG9jgf0YdM9whYx9DMsoLm7SN7HDjUfkIQ7a/Tu28tB9p8Qp17GsmQDA5Qw5riZ/BXMK4jHs +sOrmmOeynlW2XU13Yzh6lc9+fLzWdmdRsynNrIDGke6VFjy7AezbHtEeZBVNphX5/uH/ANFX +/HF//9HRy6q3ZD3Hkx+QLIsaPs+U3XSeFl1NPqtgd1a6nPps+Kz6jD2/FbLCPVpPmsq8bb3j +wcfyq7frhz5BVjDB6be/J80UNGwSII7+KLna+if4Pf4qrucUWhsu1I011VnLn0Gt4k+PgrXS +mCxj2HUHx8lds6VjWtAALfNvHwQLOk0tEB7m9h5/5FlYhczNaRrtJ5Wjlx69UaAidOyrvs9o +HaFXNReS4O2mFGjO+ylzQNwdyJ0UDmTLKQWB3Mqdz202tLQJrA0PcFSos0uv2bGlpAHiSIVa +Fe/4wv8Aoq/44v/Su5jXfbLTOmn5As8D9Je3xB/Ih7aWwe6HmvrsYB2lB+zUurBB18kao+5g +5hw/IqPUBtzLf6U/ejG7djbY7IU/pde+qOR7dDwiZLdzKIEy0qzi0GNj6w49hwR/lUndLe6w +mstDT5nQoGfhux/TBEk91c6NAteJ0ErXG6NBPhCcguMO58CsGihjc63Hs2guPtc0fRPKLn1t +qtrAkgA8oGTUftXpkyTEfNLqrK8RjK6T7yPf8FikEGArH2azGsrNkDc3cADx8VLqL2bw0TuG +pPZPS5jcR7SCXlzYPaPBM0K/H9xP+in/AI4v/9MudkO/altLQSfbx/RCTsO+svse2A4EGFhl +7/FTyBNQVUPe3glaGNqB8Wqv1H+WPPjH5EfFdUGe5Ey/QtqaayA9vHmgth1U9wNR4K1LBVRu +HII/Ir+O0tDS1rdPDUFaFerWzpHh2VDrlZ20uBMSQhdFH628eTluBnimDTM8A9lmdepAqbcw +Q4GCR+CrZ1jLTjuboDWZjx7qXV8WuksymENeNssPf4LEyb3XxuaNwJJd3KrbnDhGoJe8l5J4 +k/NTy2l+S8DmRH3JmgtEEnn8UQK7/wAYn/RT/wAcX//Uu5prx899sQ57PpfAKDc8GlxcQNYn ++dV7q+n5hDmtIcBqWaF3yUH9NZY2GPnSYPIVW3o2S2sva3cB2nVLGqc2uSPA/io5eJbfkFzA +Igd1Onpl7m7dAfil+xMz+D96i3Dsrfc1wJcxpJjjRW8ag34kt5r1n4rTxGD0xq0/BXGhpGhV +DrTqziH3CWkHlU+juP2olsGd3K3Q4CCTKY2Nka6qv1EC3DsHgJ+5YTXlwqPMNd+VVcq91ri5 +xJJ7lVWtdY8NaCXHSB3Wg3pBZSX3Eh3Zo/nVOhoDwP4QSvM5Fh80+hE6z+VSar//ABi/9FP/ +ABxf/9XUz2V2S17Q4Agj4wsbKxmC6oMGxrpkDurnpN9JpaNr9oEt0OgT9Ifk5FRfaQ4NMNJG +p+asZufVjFjD7nOPA8OJWfdVkVtY1w9rmbgfnP3pODmursAkER9yKci2sbg0HyQ6+sWueR6Q +AAkmU2FkG77VW/lzHuB84VnojttT/MBWnU45e47IdOpbohnGqcQZefi4qt1WiuvD9rADuGvf +70LpA/WHeMFbBrsMagBRNdnd0lVeok14thDpJEcwsmjUV+Yd+VUba3B7h5kK/wBHdXVe5rxD +3AbHH8i0cx36F3wWHjibB/TCFaZuf/SKk1Tar/8Axi/9FP8Axxf/1rvULw3JeyeI/IqmVq6h +3miVWggCdQrRdVgYIe+QB2HJlc/Y51r33WGS8zHz0XRi6vKx3BjHQ1uhIVSquu2mCTuBlo8J +Ubx6TYeR5eap21AUucDrzCrY1mzIbB5BB+YWl0l0UuB4OhKvVsduMzrx5ozKy2In5qn1iDiE +dw4cqv0XTLPz/It0kQEN5J44Cz+sgjFHJlw1Kzq2OFtII1gflWo/pmP67rCNwdJgrO6piOdm +1CuAbAA3sJCJlOeKC14hwEHz81l4jSbGn+F/Mq7/AOMd4yVNqm1aH/GL/wBFP/HF/9ep121z +Or3gHT2/7yEZtpfiVuPZwRsevbkNstOyk6AnuUTrtjbKqgD7N+pHbRUMapr8qvad4gloPlwu +jxnucwbhAVIbTZYaRLN3I4Q85lZxv0k7p9pWZbke1zSTG2NFWxWusugAmAT7fJafTHFjCQNw +B114Wk25zHAOYWfCEVmRWRP4/wCVB6q9zsF5EGCFn9Hn7U7x1/ItoP8AHRPHCpdZb+pzGjXe +KoMcX5OOTztYPxW8SPx4VHqtc44tETU4OEc+ah1Gt+Rjl1Y3GAQPEFYuIC17RwQ46Kk4+93x +Km0qbStD/jF/6Kf+OL//0KfX2n9rZB/of7yE+Jri7TwHLZe6xlm0V76zxpITZrayxrS0DcDI +AWA9xqv/AEZLCwmCUb7ZnWQx9hDXaGNJV/EyRRQ0nh2n3IXU+o13UtYzU7plY7nku4V/o7Gn +LDXd2ka/zK30yvcXMmNpOp+K0hXBLd4ntPJH+wndUQSYGv5fNC6g3bhXRI8+fvVDo5jLJmNO +/wAFuBwPePDRPx2gHxVLqsfYngjgjTsVl4muRjg6aN5+K6CRPOvYBByxOPcI5aZ+5Qwv0mHS +efbH3LNzavSzBrO4OcsN3JUmlEBWh/xh/wDRT/xxf//R08rp9d+Q95Oro/Iq2R09tOJcGmfa +SodFN19Lh6pAZAHB5Vu3D1Ly8uJ8VCvpVDiXOJkqVnTaK63Fo1AJVPpmJTl1ltonZqIKtX9O +w8et9rWAFomVzdlRDiSNSjYbzTlVP0EELT6OYyH6jUu5+K09AQJk9p4+9SbwedRMHVVuota7 +Dtnw5HBWd0kA5BHl4+S2Y09xkgeHKkzQESCFX6oycG7QxE6fFZGFJyMfQTpp81vTpIBPaExa +S2PiACfFVOkEtptqdyywqr1NwOYI7VrnyVJqI0LSj+4P/RR/x1f/0t17oeULIl1Fo8WO/Isv +6vPhtwHl/OtcmRqpAkDQpnS5pHksrpLy1zxxyPxV7Idva1rtWnUjyVW/FZkVlphpHEeKxLWO +psIOhafyLR6O4uyXH96VrOP7095KYvg6/LcEO8E49upgtOnYGFl9HMZR8x/MtrdtPgPLgn4p +d9ST+RQyffj2tGvtI18wsTpxJyKPKFuhxkjtzKUtBERP+fZZ+J+j6rksg6if51DPAfmvA7sA +HzXPOEGPBO1FatP/AIwv9/8A/HV//9PbuMWFDmQR4iFndIY1hfHPB+9abSpEpg8LIxDsvsHg +5ys5FmwVuIkSQfmjMcRHeYWZ1mhrbG2N038wNZTdF1v+X8y2nfRmNO0cIJeB/R08eO6hcSan +tEO9pmfBZfTXRb4AD8IWq29riRoODyjAnwjyGqZ4DmuHlqJ1Cxemj9aYBpH+yt0GP9lNoTM6 +juP8qzXS3rQj2Bze3fRNa6epvHIAasDY574aJJKsDAy9s+kY8tVANI0Oh81o6/sP/oo/44v/ +1Ny5oLnFDqa3cs7px25ttZ7OcFpNLd0SneBtUKtvdZQe1mXcZ9oeVaynj7Jua31Ggg7m9v8A +Puq4vIBmCIBiU3UnCzCdqNCDoeFX6M6Lx2kLaBaGgTyoEkyRpMzHP4eSHa5xYYkggyCDwVkd +PcG2OJG4R/MtUPA5ae0/MKXqgggyBqNFMOcGmYJGkHggrJ6eQMgE6jSQCtauxp4InmPya+an +OkHx1WZedvWKzzLRp4JnbX9QtEzJA0KV/SmenupHuGsTol0rK2Wimzg8HuCrfUcGu9hsYP0n +Yjv8VS2H9kbY1+0xH9Rf/9XXyS4Pd8kCov3Kg99lWZca2h7y/QExyEz8vMrDXOxw0uMDXv8A +eruPljIrImHjRzR4+XkqmVnWUW+3hhkg91Xy7Gusyn1n2mHArR6Mx32Q74/SEkN8uPxWVc40 +ZLqiJ2n2z3HZEtyW2Y7x3LDOkTr+Kh0p0PBJ+a2N5LiDxM+U+CYnWSJ2xM8lDs3Bsj6QiYdy +qHTd3qkt5hX/AKEy3RoJgIjHCJntqOYHmptIAMGdCJjw/IsbEaDLe+g0Md1pUnZ9F+7xk8eA +UnWndAEeBlUXvb+1JIMNboAljbvt1pPId3WhvI+iJPIAWBbc+vMc4DaQ8mPmuibksNAsPdUd +/wCob+/2yfwX/9bYyfpuQ6291h9QfYcy2xoLCwafLurmBm1ZOPYzJ2idD/CHl5rJBZVYHNc9 +g1jxHgpX5JcyLGgujR47ypYvvqsB4LSt/BracOkg67eFR61il1DbGD+L5+BWJ6hLSJMwrfTi +ATJjTk/FaItBdxqZPeY8QfLspb54O4iZ2nXnmEjI9zmkToCBzPwlZ+IdrbIPaNOVfqeIaNwc +BxI7jn70YaRILj4cCD4lM95bIe/a7UEz2+5ZuA6HbvCCrYLGvB7n87XUcSPNPZe2oFzjxr2g +oWFU6x5vfy46ApsUTl2/0ytBjy0na0AzrJWH1YtGY8gyTromdnPdWGhobpB81bn+4c/8WP8A +jq//19fKP6Q/JMw+1UMwD7YB2eyCq7+kljN1bt7edp5HwVd2Mx7SwSS2de4VK0WVsNbhoSD8 +PgrPThpDuC0yr+Bk+k00WGHM4M8hWszNrppkjduO0Arn8ttJ99ehJ1AKliE+jYf4BU6MpxkG +SJH+fxVht3AP0xI3T98g+KM07m6BzHEkAtPfzVXCcSXumDHKvN7biCBBAM/fCJIho2wHHRuu +vl8EG5+2t4DtpIcIGp+c8Kp0/wCifAgDlEyMj0wZ+UKg+6w3BzwYkHat+mxrq2ODfa7jyVPE +e31LTxDnalRzuoekNrB7iskve5xc4y49yna1xGgWtB/YP+//AOZf/9DVyz+mI+H5EwOip5v8 +ppPkQrtX0Qh5NOM87nMG/wARoVR6lhv+yH0m72zLp+kFR6e3QDx3D8FWM+nM+5nhymsN1lbb +DZvE7QO6P1Btf2XGeysMkGYCWI1rq37ZjY7lUA9zT5Itdpa4HdI8FYbkCCdw4EyJ1HiidPPs +cf4M6DzV4v2BzwQRPn7h3EJP2DRvOhB/dny/nVfPeBjAcSePAoWK4MoeSJjbp4o+LiBzvVvE +u5a08BV+qMHrB06ka/JWcW3bjsB0gCSVX9R1VDnNEkugCFRHqPtDngnWTKvGxl1LnmpjIOjj +oIVSzJL3hpMsGg2iAtjb/ceI9vrePbav/9HUydcl3y/IpRpCpZoAsqPgVcZ9EIdx4U6yQ0Kl +kVMblV7BG8mY8Vk5DHteZZtI04iQqQ3AK0/KdkY3pvIaW6j+EVZ6e0FjY/ddKq5OG5slkubE ++YVMAt+Ckd0GDoVoYIPovP8AAKn9oaZn87ifhqpttYQJ1Gny00Qs14tc33EgEkkqxhDY5xiO +DB7Kw6ztHms3PaX26cAH5Ku60O2sDi1g0JlaFLn1YrnbJIPA1VK31LHRa7YD4BAcXloYXSG8 +DwUq6w6zWdT3W/6X9x9n8P8AmX//0tW/+Uu+X5E4c2Ykfeq2W3cW+RlHc9rNCQD5lCfbVuEu +CO19JaDvbHxVa4Msur2ODtrgTCbJGLa0sse2RwTyFj5OMxujbGvHkVTcwt05C1el4tm4NPeT +8iFEbLDtDxIMQeVXzMQh24iJQK8YuWniYj/QsEHVrgNFRtpZW8teH7vhCGGO3e1jo81fxcXa +7e4Fx7K5ViWhljtpG5VbXXzFePY48AuCquwM+8lz6yB4H/IrIxLXVsqZjQ4SC88HzVx/TXvx +w06EGfiqNvSsxxhtYaP6SH+xcwawPvRsbo+QLWufDQCD8Vt+gPs2z+FP4L//092xkvJmJhBG +FT6nqcOnkIuys8wfik6ulxl0KJoxjoQ3X4KAxsBp+iyUVv2Ss+3Y0+UKD2YDnbnemT8lHZ03 +XSv7go7elkf2L8ERuTg1iGvYAPDshus6YXSTWSe+ic5PTRy5ij9s6WPzmD5KX7T6e0QLWx5K +B6l00yS4H5Jv2p05o0MD+im/a2D2a4jyakOs4ZO1ocT4AKZ6nTBIref6qE/rFDNDW4HsCIlE +HUJaT6FgETx2UKOqDI3elU5wbyifaru1DvvCC3qm6/0RXD5iCQFO/MuordY+mGt51Ch+0x+z +vtOw7fU2x5Qv/9TQzBR9qeX2uB00DojRAd9jAP6VxP8ASKpbh6dgJeXR7TJ5RsIUfZwcmd5P +cnVWCOmeA/FCyRgGoisAP7RKp27HY2xrItke7yVqoYVVLBfX741McqXr9LE/oh/eqjnW4z3t +NDNpHOmhQ7bG5LqgysVuGhjgq+MnArGx1XuGh9oTO6hgD+wfgFmi8V5DrKmjbOjXa6IzCcnI +FuwN2ido7wjnqjBxSo29SZbU5jqJBGmqDiZl2MCBDgezlPGtLL7sgCTPHxVh3VLO1Y+9VM3L +fktAcwCOCFGvOy2N2CwlsRB8EWq+3CoY6nT1Ppbh4Jx1bOP5wPyVa62++31XGXeI0Uxl5F36 +K2wuZ3B7rW9Jn7M2bTs9WY8ts/lX/9XRzOnm7JfYHgTGkeSGOkjvZ+ChkdOFVLnh87edE2Dj +15dMOcW7Dp5qx+ysfvY78Ev2Xi/4x33hVOo4tGKxrmP3TpBPdHoxMbKorfY8gxETEKR6V0/v +Yf74Jv2R0z/GH++CzczHx8XLayl+4aO1MrQb0/AsabHyHHUjcpfsvpR7/wC2S/Z/SGDUjw1c +svGNLOpNYNa2uc2fEStU4nR2yHBonxJTCjosRDfvQsmrpAx37SGugkEHWVT6Q6h73+v9Ejjz +WkP2QD9FpTz0lxnYyfgqHV/sHoNdSAHh0aeCL0p+OzFi5s66SPJWftnTvBv96pDMwo0iPgsr +qzqnZNT62xuGvnqtP1f7k8Cfo/gv/9bZvZuscfVc3jQNPgqd+PL9cuweQrdwq9+NUanb814b +Gs1uRMWjGFZFWUTpyGFM7HqnXMd/w25R+z4//Ex3/DbkG7GwiG785w92k1uR/QxYbGW6ex2F +CONhyf10/Otyb7Nhx/LT/wANuQ24uB9oB+3Hdpp6TlYvx8QkTllpgcVlDrxsMP8A5aSfA1uS +txsMzuzQBu49IoOPi9ND3RnbvL0nKzlY+EdvqZkaCIrPCB9l6fP8u/5Cco2YvTtvuzux/sTk +XExsBtcNzd/n6ZCRx+nTpmf8hlOzGwoO3N/5DKDdi9OIbuz41EfonK0KML0gPtfz2FD+z9Pn +XM1/0sorKMEH+VEjw2FNm0YDrqi7K2Q0bRsJkSrXp4n2Hb63s9Sd2087eIX/2Q== +--------------167E2781446B +Content-Type: application/x-pkcs7-signature; name="smime.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7s" + +MIINTQYJKoZIhvcNAQcCoIINPjCCDToCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC +DDwwggm7MIIJJKADAgECAhApD8YX9G6ah0T5a1eI8maEMA0GCSqGSIb3DQEBBAUAMGIxETAP +BgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVy +aVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NjExMDYwMDAw +MDBaFw05NzExMDYyMzU5NTlaMIIBDDERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZl +cmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVh +bCBTdWJzY3JpYmVyMUYwRAYDVQQLEz13d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BT +IEluY29ycC4gYnkgUmVmLixMSUFCLkxURChjKTk2MSYwJAYDVQQLEx1EaWdpdGFsIElEIENs +YXNzIDEgLSBOZXRzY2FwZTEXMBUGA1UEAxMOSmFtaWUgWmF3aW5za2kxHzAdBgkqhkiG9w0B +CQEWEGp3ekBuZXRzY2FwZS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAvf/Pd1H5zPhu +ZO6Dt702B4B/dOoosaVlYyknsHZfDHEufMwGbywmyrvhSgEWdL4TwOa1J3tvfzV1G9oKlRzM +pQIDAQABo4IHCDCCBwQwCQYDVR0TBAIwADCCAh8GA1UdAwSCAhYwggISMIICDjCCAgoGC2CG +SAGG+EUBBwEBMIIB+RaCAadUaGlzIGNlcnRpZmljYXRlIGluY29ycG9yYXRlcyBieSByZWZl +cmVuY2UsIGFuZCBpdHMgdXNlIGlzIHN0cmljdGx5IHN1YmplY3QgdG8sIHRoZSBWZXJpU2ln +biBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudCAoQ1BTKSwgYXZhaWxhYmxlIGF0 +OiBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vQ1BTOyBieSBFLW1haWwgYXQgQ1BTLXJlcXVl +c3RzQHZlcmlzaWduLmNvbTsgb3IgYnkgbWFpbCBhdCBWZXJpU2lnbiwgSW5jLiwgMjU5MyBD +b2FzdCBBdmUuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MyBVU0EgVGVsLiArMSAoNDE1KSA5 +NjEtODgzMCBDb3B5cmlnaHQgKGMpIDE5OTYgVmVyaVNpZ24sIEluYy4gIEFsbCBSaWdodHMg +UmVzZXJ2ZWQuIENFUlRBSU4gV0FSUkFOVElFUyBESVNDTEFJTUVEIGFuZCBMSUFCSUxJVFkg +TElNSVRFRC6gDgYMYIZIAYb4RQEHAQEBoQ4GDGCGSAGG+EUBBwEBAjAsMCoWKGh0dHBzOi8v +d3d3LnZlcmlzaWduLmNvbS9yZXBvc2l0b3J5L0NQUyAwEQYJYIZIAYb4QgEBBAQDAgeAMDYG +CWCGSAGG+EIBCAQpFidodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcmVwb3NpdG9yeS9DUFMw +ggSHBglghkgBhvhCAQ0EggR4FoIEdENBVVRJT046IFRoZSBDb21tb24gTmFtZSBpbiB0aGlz +IENsYXNzIDEgRGlnaXRhbCAKSUQgaXMgbm90IGF1dGhlbnRpY2F0ZWQgYnkgVmVyaVNpZ24u +IEl0IG1heSBiZSB0aGUKaG9sZGVyJ3MgcmVhbCBuYW1lIG9yIGFuIGFsaWFzLiBWZXJpU2ln +biBkb2VzIGF1dGgtCmVudGljYXRlIHRoZSBlLW1haWwgYWRkcmVzcyBvZiB0aGUgaG9sZGVy +LgoKVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0ZXMgYnkgcmVmZXJlbmNlLCBhbmQgCml0 +cyB1c2UgaXMgc3RyaWN0bHkgc3ViamVjdCB0bywgdGhlIFZlcmlTaWduIApDZXJ0aWZpY2F0 +aW9uIFByYWN0aWNlIFN0YXRlbWVudCAoQ1BTKSwgYXZhaWxhYmxlCmluIHRoZSBWZXJpU2ln +biByZXBvc2l0b3J5IGF0OiAKaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tOyBieSBFLW1haWwg +YXQKQ1BTLXJlcXVlc3RzQHZlcmlzaWduLmNvbTsgb3IgYnkgbWFpbCBhdCBWZXJpU2lnbiwK +SW5jLiwgMjU5MyBDb2FzdCBBdmUuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MyBVU0EKCkNv +cHlyaWdodCAoYykxOTk2IFZlcmlTaWduLCBJbmMuICBBbGwgUmlnaHRzIApSZXNlcnZlZC4g +Q0VSVEFJTiBXQVJSQU5USUVTIERJU0NMQUlNRUQgQU5EIApMSUFCSUxJVFkgTElNSVRFRC4K +CldBUk5JTkc6IFRIRSBVU0UgT0YgVEhJUyBDRVJUSUZJQ0FURSBJUyBTVFJJQ1RMWQpTVUJK +RUNUIFRPIFRIRSBWRVJJU0lHTiBDRVJUSUZJQ0FUSU9OIFBSQUNUSUNFClNUQVRFTUVOVC4g +IFRIRSBJU1NVSU5HIEFVVEhPUklUWSBESVNDTEFJTVMgQ0VSVEFJTgpJTVBMSUVEIEFORCBF +WFBSRVNTIFdBUlJBTlRJRVMsIElOQ0xVRElORyBXQVJSQU5USUVTCk9GIE1FUkNIQU5UQUJJ +TElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKUFVSUE9TRSwgQU5EIFdJTEwgTk9U +IEJFIExJQUJMRSBGT1IgQ09OU0VRVUVOVElBTCwKUFVOSVRJVkUsIEFORCBDRVJUQUlOIE9U +SEVSIERBTUFHRVMuIFNFRSBUSEUgQ1BTCkZPUiBERVRBSUxTLgoKQ29udGVudHMgb2YgdGhl +IFZlcmlTaWduIHJlZ2lzdGVyZWQKbm9udmVyaWZpZWRTdWJqZWN0QXR0cmlidXRlcyBleHRl +bnNpb24gdmFsdWUgc2hhbGwgCm5vdCBiZSBjb25zaWRlcmVkIGFzIGFjY3VyYXRlIGluZm9y +bWF0aW9uIHZhbGlkYXRlZCAKYnkgdGhlIElBLjANBgkqhkiG9w0BAQQFAAOBgQCvsCGM0+zA +TKtgRn8N1dKRfa1Y7JouUdVU4ynJWeEZ1iEvtzbhaaadgmV5ZPLoUZzjCMEpnYDzwK+bh/nv +IecbQOC9ie5Gr8DURh/9ZqYP0/L+QGDshYcBB7kyG9XZ5ihnAc4eZBJCqtrTYWwW9lGHFKRX +dEh4GQBfJRThfNOYgTCCAnkwggHioAMCAQICEDURpVKQb+fQKaRAGdQR/D4wDQYJKoZIhvcN +AQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDYyNzAwMDAwMFoXDTk3MDYyNzIzNTk1OVowYjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5k +aXZpZHVhbCBTdWJzY3JpYmVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2FKbPTdAF +DdjKI9BvqrQpkmOOLPhvltcunXZLEbE2jVfJw/0cxrr+Hgi6M8qV6r7jW80GqLd5HUQq7XPy +sVKDaBBwZJHXPmv5912dFEObbpdFmIFH0S3L3bty10w/cariQPJUObwW7s987LrbP2wqsxax +hhKdrpM01bjV0Pc+qQIDAQABozMwMTAPBgNVHRMECDAGAQH/AgEBMAsGA1UdDwQEAwIBBjAR +BglghkgBhvhCAQEEBAMCAgQwDQYJKoZIhvcNAQECBQADgYEAKeXHoBmnbxRCgk0jM9e9mDpp +dxpsipIna/J8DOHEUuD4nONAr4+xOg73SBl026n7Bk55A2wvAMGo7+kKTZ+rHaFDDcmq4O+r +zFri2RIOeGAncj1IcGptAQhvXoIhFMG4Jlzg1KlHZHqy7D3jex78zcSU7kKOu8f5tAX1jC3+ +sToxgdowgdcCAQEwdjBiMREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xNDAyBgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNj +cmliZXICECkPxhf0bpqHRPlrV4jyZoQwCQYFKw4DAhoFADANBgkqhkiG9w0BAQEFAARAuhJc +9hmJOgvfpjpNc54XgAqiP6hhFJVL/Qih0b3/TLDX0dy7q0niVJ7LourWVn+oMtnL+8CamqOE +61cwKedkFg== +--------------167E2781446B-- + +From - Fri Dec 13 15:01:21 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA19742 + for ; Fri, 13 Dec 1996 14:59:31 -0800 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id OAA23726 for ; Fri, 13 Dec 1996 14:58:13 -0800 +Received: from peapod.deming.com (host20.deming.com [206.63.131.20]) by xwing.netscape.com (8.7.6/8.7.3) with SMTP id OAA00270 for ; Fri, 13 Dec 1996 14:59:27 -0800 (PST) +Received: by peapod.deming.com from localhost + (router,SLmail V2.0); Fri, 13 Dec 1996 15:01:48 Pacific Standard Time +Received: by peapod.deming.com from seth + (206.63.131.30::mail daemon; unverified,SLmail V2.0); Fri, 13 Dec 1996 15:01:02 Pacific Standard Time +Message-Id: <3.0.32.19961213150855.009172e0@mail.craswell.com> +X-Sender: blaker@mail.craswell.com +X-Mailer: Windows Eudora Pro Version 3.0 (32) +Date: Fri, 13 Dec 1996 15:09:42 -0800 +To: Jamie Zawinski +From: "Blake Ramsdell" +Subject: Re: can you send me an encrypted message? +MIME-Version: 1.0 +Content-Type: application/x-pkcs7-mime; name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" +X-Mozilla-Status: 0011 +Content-Length: 1431 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAt +IEluZGl2aWR1YWwgU3Vic2NyaWJlcgIQKQ/GF/RumodE+WtXiPJmhDANBgkqhkiG9w0BAQEF +AARAb0tthyav05ce7KBWdlfN1M0R6wLQ2FWPVQynuWo/yHUoo3hiII7j15FXNgnxF7QkY5/p +mZXg0P2eJ1iYQy1vZDCBzAIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5W +ZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1 +YWwgU3Vic2NyaWJlcgIQDOtpec1+JM3EpqAMVqgtjzANBgkqhkiG9w0BAQEFAARAuqnsnz1O +qEdx7NEMJDEdjccjdEuCM8x2euTYlU/GWNY+s2iKVahbT3/R8E8hp3YfrHd2sjvgy6teTOPO +ZI2SxwAAMIAGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIlhWqtbsElaWggASCAjBooYYTWSBz +7A4l0Aho7mK85zpMyAR0xTKqHXT0zL9XpHbKPAcETaBTh1n7e8aJeQ93ONGAs6tVVlA6bpUN +F3Q5O+ZuNXOMT83HIKRYEO1l8a+CH7XtUiQWtu/aBt12GQDX475WhPULKEJs7kLS2DwToRX/ +ctwEPNwc6zfsOZoVTQ5HOwisvDZ2QGwa08Psj38SaQ0Y+ryk5FeiAtKQUZ0uuJWI/rRu64yj +KmVs1DDId18coftA2rv/u2/zABEX8u5ckEkwS7fO7UHv6XMCQ3kqgqIZZE1zIGohfUdtOYYo +M4eki3QDyovHPxEjBbnmpUw2xDN7/DdxYEZ4CteWurQ+VoP0PUM2qwi6EgM6MpVKg8KzOWdb +aV51a1oQKtpJJFZqZtFf9SQ4OW6NKXHsJ2AF8W4OQ+ySWQN43wMk8dGJYlPrREqn5RufPg3k +QM+s4VwTrS2TrU+ELZCYnJFfH+N7tE8ILrFMAteVxtqjat7OJRyDxy0cnBP+oG81Sr0zvbdC +jUPUDFlrPgFjDrswX1UpkEE2OgKWmfc134AbysJFOuCIze2XqKB96rJvxS76ygzVvrU/4sI1 +6VDlZUEuUPaBUOimFxRk/rqPJDI1M8rNKykw9qsoWQMRnvrODfzo7iVWQ0TQHiwfoBhs6Dvm +UgrMwopFnzRdSHvT1acSqVfMYWm5nXImvtCuFAavkjDutE9+Y/LLFLBUpAVeu3rwW3wV0Tcv +9I6Afej0ntfbH9vlRwQIl7MeXMqoBV0AAAAAAAAAAAAA +From - Fri Dec 13 15:01:22 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA19910 + for ; Fri, 13 Dec 1996 15:00:10 -0800 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id OAA23769 for ; Fri, 13 Dec 1996 14:58:51 -0800 +Received: from peapod.deming.com (host20.deming.com [206.63.131.20]) by xwing.netscape.com (8.7.6/8.7.3) with SMTP id PAA00313 for ; Fri, 13 Dec 1996 15:00:03 -0800 (PST) +Received: by peapod.deming.com from localhost + (router,SLmail V2.0); Fri, 13 Dec 1996 15:02:27 Pacific Standard Time +Received: by peapod.deming.com from seth + (206.63.131.30::mail daemon; unverified,SLmail V2.0); Fri, 13 Dec 1996 15:02:23 Pacific Standard Time +Message-Id: <3.0.32.19961213151017.0091ed80@mail.craswell.com> +X-Sender: blaker@mail.craswell.com +X-Mailer: Windows Eudora Pro Version 3.0 (32) +Date: Fri, 13 Dec 1996 15:10:21 -0800 +To: jwz@netscape.com +From: "Blake Ramsdell" +Subject: Encrypted message +MIME-Version: 1.0 +Content-Type: multipart/signed; boundary= + "---=_=_ 659214770-385040-15143392 _=_=---"; micalg=rsa-sha1; protocol= + "application/x-pkcs7-signature" +X-Mozilla-Status: 0001 +Content-Length: 4392 + + +-----=_=_ 659214770-385040-15143392 _=_=--- +Mime-Version: 1.0 +Content-Type: text/plain; charset="us-ascii" + +I sent you an encrypted message that was triple-DES. Let me know if you +had any problems with it... + +Blake +-----=_=_ 659214770-385040-15143392 _=_=--- +Content-Type: application/x-pkcs7-signature; name="smime.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7s" + +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIAwggUM +MIIEdaADAgECAhAM62l5zX4kzcSmoAxWqC2PMA0GCSqGSIb3DQEBBAUAMGIxETAPBgNVBAcT +CEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24g +Q2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NjExMTMwMDAwMDBaFw05 +NjEyMTMyMzU5NTlaMIIBMzERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWdu +LCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJz +Y3JpYmVyMUYwRAYDVQQLEz13d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTIEluY29y +cC4gYnkgUmVmLixMSUFCLkxURChjKTk2MT4wPAYDVQQLEzVEaWdpdGFsIElEIENsYXNzIDEg +LSBTTUlNRSBEZW1pbmcgU29mdHdhcmUsIEluYy4gQmV0YTEjMCEGA1UEAxMaQmxha2UgNTEy +IFRlc3RpbmcgUmFtc2RlbGwxIjAgBgkqhkiG9w0BCQEWE2JsYWtlckBjcmFzd2VsbC5jb20w +XDANBgkqhkiG9w0BAQEFAANLADBIAkEA0q21Atm4nAvUY0I8lrFOjX9BbnR3gFfZu8+jiW87 +snqVeDFARsmmwqyQ1VoHgkSN/atjDHKkT+E/4OK1/up9YQIDAQABo4ICMjCCAi4wCQYDVR0T +BAIwADCCAh8GA1UdAwSCAhYwggISMIICDjCCAgoGC2CGSAGG+EUBBwEBMIIB+RaCAadUaGlz +IGNlcnRpZmljYXRlIGluY29ycG9yYXRlcyBieSByZWZlcmVuY2UsIGFuZCBpdHMgdXNlIGlz +IHN0cmljdGx5IHN1YmplY3QgdG8sIHRoZSBWZXJpU2lnbiBDZXJ0aWZpY2F0aW9uIFByYWN0 +aWNlIFN0YXRlbWVudCAoQ1BTKSwgYXZhaWxhYmxlIGF0OiBodHRwczovL3d3dy52ZXJpc2ln +bi5jb20vQ1BTOyBieSBFLW1haWwgYXQgQ1BTLXJlcXVlc3RzQHZlcmlzaWduLmNvbTsgb3Ig +YnkgbWFpbCBhdCBWZXJpU2lnbiwgSW5jLiwgMjU5MyBDb2FzdCBBdmUuLCBNb3VudGFpbiBW +aWV3LCBDQSA5NDA0MyBVU0EgVGVsLiArMSAoNDE1KSA5NjEtODgzMCBDb3B5cmlnaHQgKGMp +IDE5OTYgVmVyaVNpZ24sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIENFUlRBSU4gV0FS +UkFOVElFUyBESVNDTEFJTUVEIGFuZCBMSUFCSUxJVFkgTElNSVRFRC6gDgYMYIZIAYb4RQEH +AQEBoQ4GDGCGSAGG+EUBBwEBAjAsMCoWKGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9yZXBv +c2l0b3J5L0NQUyAwDQYJKoZIhvcNAQEEBQADgYEAF6Z54NUzRdcCLfac7WDTx88kisX4TpG+ +UXPcTMhNm55pDb88mPMBNhsOTA9SP7OJjCVBvqNcWSopPaz6H2Bd1vowiDi3Lnm3Dw0ntXvp +WPO1PkUd6/TGpu4ayfpNVAYSxDcjdt4+LSSwLWLsWarAanulHHcoO9ZGm71nm70DubkwggJ5 +MIIB4qADAgECAhA1EaVSkG/n0CmkQBnUEfw+MA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYT +AlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjA2MjcwMDAwMDBaFw05NzA2 +MjcyMzU5NTlaMGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j +LjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJl +cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAthSmz03QBQ3YyiPQb6q0KZJjjiz4b5bX +Lp12SxGxNo1XycP9HMa6/h4IujPKleq+41vNBqi3eR1EKu1z8rFSg2gQcGSR1z5r+fddnRRD +m26XRZiBR9Ety927ctdMP3Gq4kDyVDm8Fu7PfOy62z9sKrMWsYYSna6TNNW41dD3PqkCAwEA +AaMzMDEwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgIE +MA0GCSqGSIb3DQEBAgUAA4GBACnlx6AZp28UQoJNIzPXvZg6aXcabIqSJ2vyfAzhxFLg+Jzj +QK+PsToO90gZdNup+wZOeQNsLwDBqO/pCk2fqx2hQw3JquDvq8xa4tkSDnhgJ3I9SHBqbQEI +b16CIRTBuCZc4NSpR2R6suw943se/M3ElO5CjrvH+bQF9Ywt/rE6AAChgDCCAScwgZEwDQYJ +KoZIhvcNAQECBQAwYjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJ +bmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3Jp +YmVyFw05NjA3MDExNzMwNDBaFw05NzA3MDEwMDAwMDBaMA0GCSqGSIb3DQEBAgUAA4GBABi7 +kOj1/AOwIqgRLVs2LZepWTUgyNG0eWFKPg9ic5MN9HcUJyUmylxHOl2LswFuR768wE17uXNf +Vlj0+HEQ8Jox+9YvUHA8rFsH/8BNKhk4liN7UE9COVRoe4yCQ9O55QcN0eF5fHR/ZK/OSbFo +p6gx+WCqSKPaPJJ2OZ+/qozqMIIBJDCBjjANBgkqhkiG9w0BAQIFADBfMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDEgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkXDTk2MDgxMzAwMzA1OFoXDTk3MDgxMjAw +MDAwMFowDQYJKoZIhvcNAQECBQADgYEA1dzv/pevULboNwwiRcIOq1XaRQOMyWw/SSFUNu+j +5rSRjjvmzWTpm0bi/8ct5T5HR9auJmz6Q/pj6x0waXEjshWQh3/VagIcgDsXcdObIDcw4Gpf +igcOHr577KpFlr3kGVC4ik5oTvzmNscK5So8npwbEXx9NHMXFmh7vMr7jREAADGAMIIBNgIB +ATB2MGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIG +A1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcgIQDOtp +ec1+JM3EpqAMVqgtjzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc +BgkqhkiG9w0BCQUxDxcNOTYxMjEzMjMxMDIxWjAjBgkqhkiG9w0BCQQxFgQU2mTOfNT5sj4A +zx1+sUPxnuPu0BAwDQYJKoZIhvcNAQEBBQAEQE7o3gGllV4G6J4nrUpT8U9Ci5KPPC+WJ9Ot +UI4zv6C6+7KF4yf7Dbv5PL+EQHY02oDQXvrU4nNkhSefw4gcON4AAAAAAAAAAA== +-----=_=_ 659214770-385040-15143392 _=_=----- + +From - Mon Apr 22 18:36:56 1996 +Return-Path: arjun@connectsoft.com +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id SAA23836; Mon, 22 Apr 1996 18:27:07 -0700 +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id SAA01845; Mon, 22 Apr 1996 18:25:57 -0700 +Received: from RSA.COM (RSA.COM [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id SAA27395; Mon, 22 Apr 1996 18:25:05 -0700 (PDT) +Received: from connectsoft.com by RSA.COM with SMTP + id AA11175; Mon, 22 Apr 96 18:17:09 PDT +Received: from [199.237.157.163] (arjun.connectsoft.com [199.237.157.163]) by connectsoft.com (8.6.12/8.6.12) with SMTP id SAA12999 for ; Mon, 22 Apr 1996 18:19:19 -0700 +Message-Id: <199604230119.SAA12999@connectsoft.com> +To: "smime-dev@rsa.com" +Subject: Ready for interoperability testing. +Date: Mon, 22 Apr 96 18:20:32 -0500 +X-UIDL: 830222885.000 +From: Arjun J Taneja +X-Mailer: E-Mail Connection v3.0.B1d +Mime-Version: 1.0 +Content-Type: application/x-pkcs7-mime +Content-Transfer-Encoding: base64 +Status: U +X-Mozilla-Status: 0001 +Content-Length: 3495 + + +MIAGCSqGSIb3DQEHAqCAMIACAQExDjAMBggqhkiG9w0CAgUAMIAGCSqGSIb3DQEH +AaCAJIAEggL1TUlNRS1WZXJzaW9uOiAxLjANCkNvbnRlbnQtVHlwZTogbXVsdGlw +YXJ0L21peGVkOyBib3VuZGFyeT0iPV84MzAyMTE2MjM6MTA1NDQ4Njk0Ig0KDQot +LT1fODMwMjExNjIzOjEwNTQ0ODY5NA0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWlu +OyBjaGFyc2V0PXVzLWFzY2lpDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBx +dW90ZWQtcHJpbnRhYmxlDQoNCi0tIFsgRnJvbTogQXJqdW4gSiBUYW5lamEgKiBF +TUMuVmVyICMzLjAuUkMxZCBdIC0tPTBEPTBBPTBEPTBBRnJpZW5kcyw9MEQ9DQo9 +MEE9MEQ9MEFUaGlzIG1lc3NhZ2UgaXMgYSBzaWduZWQgbWVzc2FnZSBpbiBhY2Nv +cmRhbmNlIHdpdGggU1RFUCAzIG9mIHRoPQ0KZT0wRD0wQWludGVyb3BlcmFiaWxp +dHkgdGVzdCBndWlkZWxpbmVzIGJ1dCBmb3IgdGhlIGZhY3QgdGhhdCBpdCBkb2Vz +IG5vdD0NCiBoYXZlIGE9MEQ9MEFkZXRhY2hlZCBkaWdpdGFsIHNpZ25hdHVyZS4g +SG93ZXZlciwgSSBob3BlIHRoaXMgd2lsbCBpbml0aWE9DQp0ZSB0aGUgcHJvY2Vz +cz0wRD0wQW9mIG91ciBpbnRlcm9wZXJhYmlsaXR5IHRlc3QuID0wRD0wQT0wRD0w +QVRoYW5rcyw9MEQ9MEE9DQpBcmp1bi49MEQ9MEE9MEQ9MEFBcmp1biBUYW5lamE9 +MEQ9MEFDb25uZWN0U29mdCBJbmMuLEJlbGxldnVlPTBEPTBBZS1tYWlsPQ0KIGFk +ZHJlc3M6IGFyanVuQGNvbm5lY3Rzb2Z0LmNvbT0wRD0wQVRlbGVwaG9uZSBOby4g +OiAoMjA2KSA4ODktOTE1MC4NCi0tPV84MzAyMTE2MjM6MTA1NDQ4Njk0LS0NCgAA +AAAAAKCAMIICHzCCAYgCEQCEto07ePXf6KTBZ5qzNS8FMA0GCSqGSIb3DQEBBAUA +MIGdMREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4x +IDAeBgNVBAsTF0NsYXNzIDEgQXNzdXJhbmNlIExldmVsMSAwHgYDVQQLExdQdWJs +aWMgUG9saWN5IEF1dGhvcml0eTErMCkGCSqGSIb3DQEJARYcY2xhc3MxLWluY2lk +ZW50QHZlcmlzaWduLmNvbTAeFw05NjA0MjIwNzQ3NThaFw05NjA1MjIwNzQ3NTha +MCYxJDAiBgkqhkiG9w0BCQEWFWFyanVuQGNvbm5lY3Rzb2Z0LmNvbTB8MA0GCSqG +SIb3DQEBAQUAA2sAMGgCYQDUZFRq4Ll6Cu0ZfINkX4YzLz3w5a/yg8m7KQj2qcw+ +hmkMGK4GANp5yGiiFUIDdGIds+uzbKcehc0C61M7rI7L25Sz/Yd4Ij7527uE/YEj +97TCvf7CAJAS3hQQoEWsq8kCAwEAATANBgkqhkiG9w0BAQQFAAOBgQCyX2wUxSSd +0Rmtt1x+VzLJkewdXImjD1eE54nwuqhAR04vOaztxXCHw2GkBafe6R+W27ndlvRO +jb/Upmgv5Y4f2PycLY3uzPg5+kJgpjc5RZ6znVJ1KKXR9gzGCe2wPuZ3V3KP8W6v +9s5g4tgoG/vS2PGl5oRfWfj46ynKK2o5vjCCAlkwggHCAgUCcgAAATANBgkqhkiG +9w0BAQIFADBIMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4x +IDAeBgNVBAsTF0NsYXNzIDEgQXNzdXJhbmNlIExldmVsMB4XDTk1MTIwNzAwMDAw +MFoXDTk5MTIzMTIzNTk1OVowgZ0xETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQK +Ew5WZXJpU2lnbiwgSW5jLjEgMB4GA1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2 +ZWwxIDAeBgNVBAsTF1B1YmxpYyBQb2xpY3kgQXV0aG9yaXR5MSswKQYJKoZIhvcN +AQkBFhxjbGFzczEtaW5jaWRlbnRAdmVyaXNpZ24uY29tMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDgeHrgXvkvVB1tR47OHIdk+rxL1rAi4LR4RKd59okkrOpF +dYzwbAUWA7jBphpSD7xSsBUxiOjp5YYhRDL5zExACvdiIEDJxPqwUvmkmNXYALKa +GYWvJWsxALtk0Bpf82y0uxSmUrsdHirSGpaFleH3D2AiEsYMChQ7kpBW1vs5LQID +AQABMA0GCSqGSIb3DQEBAgUAA4GBAKROBq7wk4Ynx1DXItt4EwC6/c6RcnU2RtpE +6/uxsgtYFtaPoSUqtl/3kjovWUFEDRe+DBu6Ae3Vm3x3kklF9b9Dq9+IUIurDTqt +x30bYTcuDdfNu3V8cz9/CFNeUAHb+RAremus3s/msgDvuyo9NyzkSWUlPjsqolRP +s1S9/yC4AAChgDCCAQwwdzANBgkqhkiG9w0BAQIFADBIMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xIDAeBgNVBAsTF0NsYXNzIDEgQXNzdXJh +bmNlIExldmVsFw05NTEyMDcwMTA1MTBaFw05NjA0MDEwMTA0MjhaMA0GCSqGSIb3 +DQEBAgUAA4GBADABPXKyt8lQYnZLOILguT9MgQF2mCnvRpBonj38PIVscBRP/51V +oJeBwdi0OGjqpCwjnfxQvkVl6BT/SCw9PXi2nN94lINJRTl8tJ/+BeU1PH/uTiuv ++D1ouEPRA7nBD66j9xG/jy8rIKWm6MNzJL/wI0/rVrk3mMI69Y5NC9iTAAAxgDCC +ATgCAQEwgbMwgZ0xETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2ln +biwgSW5jLjEgMB4GA1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2ZWwxIDAeBgNV +BAsTF1B1YmxpYyBQb2xpY3kgQXV0aG9yaXR5MSswKQYJKoZIhvcNAQkBFhxjbGFz +czEtaW5jaWRlbnRAdmVyaXNpZ24uY29tAhEAhLaNO3j13+ikwWeaszUvBTAMBggq +hkiG9w0CAgUAMA0GCSqGSIb3DQEBAQUABGBRBSdjzGVvqmxsR9sgeJnH7p4hJS+l +j89asKncnFHeDJston9tQt05f/3zJNpQWQJfoXVzCnwlogobiaWNVvxBNKkca/cq +7adpi+h6d6T0ZD9xfIhKvRPoCRinvcjOepQAAAAAAAAAAA== + +From - Thu Dec 19 13:29:25 1996 +Return-Path: +Received: from c3po.mcom.com ([205.217.237.46]) by dredd.mcom.com + (Netscape Mail Server v2.02) with ESMTP id AAA14894 + for ; Thu, 19 Dec 1996 09:38:52 -0800 +Received: from ghoti.mcom.com (ghoti.mcom.com [207.1.147.41]) by c3po.mcom.com (8.7.5/8.7.3) with SMTP id JAA03928 for ; Thu, 19 Dec 1996 09:38:52 -0800 (PST) +Received: from ghoti (localhost [127.0.0.1]) by ghoti.mcom.com (940816.SGI.8.6.9/8.6.9) with SMTP id JAA01356 for ; Thu, 19 Dec 1996 09:38:50 -0800 +Sender: repka@netscape.com +Message-ID: <32B97DAA.167E@netscape.com> +Date: Thu, 19 Dec 1996 09:38:50 -0800 +From: Lisa Repka +Organization: Netscape Communications Corporation +X-Mailer: Mozilla 3.0 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: very cool +Content-Type: application/x-pkcs7-mime; name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" +X-Mozilla-Status: 0001 +Content-Length: 661 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgc8wgcwCAQAwdjBiMREwDwYDVQQHEwhJbnRlcm5ldDEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0Eg +LSBJbmRpdmlkdWFsIFN1YnNjcmliZXICECkPxhf0bpqHRPlrV4jyZoQwDQYJKoZIhvcNAQEB +BQAEQF+IarhYH6F+1SG5osDdiuiaHaiW+hN1qidO1jkmzrPcW+EWBrqz8N04vexYeRd3NTYM +n1izmFc/P8+c4NxIr+gwgAYJKoZIhvcNAQcBMBQGCCqGSIb3DQMHBAhM6vSiWNR/i6CABEgn +8VTx1medvABZJ6pdJYupUc7qlYZwIY3NjElAIwlbPwpWj4lt4TXQa+Ir8djF8xmHBOLxSSIn +EQK1tgT3CAMTeDvxvlvZWhEEQHaLZbk7XHfjoMoTCviNdkmfWC/3O5vfJmFzpBYrY+9lOvFX +K5QmWq8m680kJCbu8pSxXhxQGUoBV8U6ejvSc+gEMN+GS+LzvW5K04/CtO8cM1tSRcyOmWtt +oandbdLW+XWD907ylAoiHEXoKDeMCHVNjwQIrTKsMQRLJq0ECOk1Trs4Jm6bAAAAAAAAAAAA +AA== +From - Fri Mar 7 02:51:22 1997 +Return-Path: +Received: from gruntle ([205.217.227.10]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA4040 + for ; Fri, 7 Mar 1997 02:50:37 -0800 +Sender: jwz@netscape.com (Jamie Zawinski) +Message-ID: <331FF2FF.FF6@netscape.com> +Date: Fri, 07 Mar 1997 02:50:39 -0800 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.01 (X11; U; IRIX 6.2 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: forwarded encrypted message +Content-Type: message/rfc822; name="smime18-encrypted.msg" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; filename="smime18-encrypted.msg" +X-Mozilla-Status: 0001 +Content-Length: 2812 + +>From - Fri Dec 13 15:01:21 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA19742 + for ; Fri, 13 Dec 1996 14:59:31 -0800 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id OAA23726 for ; Fri, 13 Dec 1996 14:58:13 -0800 +Received: from peapod.deming.com (host20.deming.com [206.63.131.20]) by xwing.netscape.com (8.7.6/8.7.3) with SMTP id OAA00270 for ; Fri, 13 Dec 1996 14:59:27 -0800 (PST) +Received: by peapod.deming.com from localhost + (router,SLmail V2.0); Fri, 13 Dec 1996 15:01:48 Pacific Standard Time +Received: by peapod.deming.com from seth + (206.63.131.30::mail daemon; unverified,SLmail V2.0); Fri, 13 Dec 1996 15:01:02 Pacific Standard Time +Message-Id: <3.0.32.19961213150855.009172e0@mail.craswell.com> +X-Sender: blaker@mail.craswell.com +X-Mailer: Windows Eudora Pro Version 3.0 (32) +Date: Fri, 13 Dec 1996 15:09:42 -0800 +To: Jamie Zawinski +From: "Blake Ramsdell" +Subject: Re: can you send me an encrypted message? +MIME-Version: 1.0 +Content-Type: application/x-pkcs7-mime; name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAt +IEluZGl2aWR1YWwgU3Vic2NyaWJlcgIQKQ/GF/RumodE+WtXiPJmhDANBgkqhkiG9w0BAQEF +AARAb0tthyav05ce7KBWdlfN1M0R6wLQ2FWPVQynuWo/yHUoo3hiII7j15FXNgnxF7QkY5/p +mZXg0P2eJ1iYQy1vZDCBzAIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5W +ZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1 +YWwgU3Vic2NyaWJlcgIQDOtpec1+JM3EpqAMVqgtjzANBgkqhkiG9w0BAQEFAARAuqnsnz1O +qEdx7NEMJDEdjccjdEuCM8x2euTYlU/GWNY+s2iKVahbT3/R8E8hp3YfrHd2sjvgy6teTOPO +ZI2SxwAAMIAGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIlhWqtbsElaWggASCAjBooYYTWSBz +7A4l0Aho7mK85zpMyAR0xTKqHXT0zL9XpHbKPAcETaBTh1n7e8aJeQ93ONGAs6tVVlA6bpUN +F3Q5O+ZuNXOMT83HIKRYEO1l8a+CH7XtUiQWtu/aBt12GQDX475WhPULKEJs7kLS2DwToRX/ +ctwEPNwc6zfsOZoVTQ5HOwisvDZ2QGwa08Psj38SaQ0Y+ryk5FeiAtKQUZ0uuJWI/rRu64yj +KmVs1DDId18coftA2rv/u2/zABEX8u5ckEkwS7fO7UHv6XMCQ3kqgqIZZE1zIGohfUdtOYYo +M4eki3QDyovHPxEjBbnmpUw2xDN7/DdxYEZ4CteWurQ+VoP0PUM2qwi6EgM6MpVKg8KzOWdb +aV51a1oQKtpJJFZqZtFf9SQ4OW6NKXHsJ2AF8W4OQ+ySWQN43wMk8dGJYlPrREqn5RufPg3k +QM+s4VwTrS2TrU+ELZCYnJFfH+N7tE8ILrFMAteVxtqjat7OJRyDxy0cnBP+oG81Sr0zvbdC +jUPUDFlrPgFjDrswX1UpkEE2OgKWmfc134AbysJFOuCIze2XqKB96rJvxS76ygzVvrU/4sI1 +6VDlZUEuUPaBUOimFxRk/rqPJDI1M8rNKykw9qsoWQMRnvrODfzo7iVWQ0TQHiwfoBhs6Dvm +UgrMwopFnzRdSHvT1acSqVfMYWm5nXImvtCuFAavkjDutE9+Y/LLFLBUpAVeu3rwW3wV0Tcv +9I6Afej0ntfbH9vlRwQIl7MeXMqoBV0AAAAAAAAAAAAA + +From - Fri Mar 7 02:51:23 1997 +Return-Path: +Received: from gruntle ([205.217.227.10]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA4104 + for ; Fri, 7 Mar 1997 02:51:05 -0800 +Sender: jwz@netscape.com (Jamie Zawinski) +Message-ID: <331FF31B.ABD@netscape.com> +Date: Fri, 07 Mar 1997 02:51:07 -0800 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.01 (X11; U; IRIX 6.2 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: forwarded encrypted message (mult/mixed) +Content-Type: multipart/mixed; boundary="------------31DF237C2F1C" +X-Mozilla-Status: 0001 +Content-Length: 3188 + +This is a multi-part message in MIME format. + +--------------31DF237C2F1C +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +blah blah blah + +--------------31DF237C2F1C +Content-Type: message/rfc822; name="smime18-encrypted.msg" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; filename="smime18-encrypted.msg" + +>From - Fri Dec 13 15:01:21 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA19742 + for ; Fri, 13 Dec 1996 14:59:31 -0800 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id OAA23726 for ; Fri, 13 Dec 1996 14:58:13 -0800 +Received: from peapod.deming.com (host20.deming.com [206.63.131.20]) by xwing.netscape.com (8.7.6/8.7.3) with SMTP id OAA00270 for ; Fri, 13 Dec 1996 14:59:27 -0800 (PST) +Received: by peapod.deming.com from localhost + (router,SLmail V2.0); Fri, 13 Dec 1996 15:01:48 Pacific Standard Time +Received: by peapod.deming.com from seth + (206.63.131.30::mail daemon; unverified,SLmail V2.0); Fri, 13 Dec 1996 15:01:02 Pacific Standard Time +Message-Id: <3.0.32.19961213150855.009172e0@mail.craswell.com> +X-Sender: blaker@mail.craswell.com +X-Mailer: Windows Eudora Pro Version 3.0 (32) +Date: Fri, 13 Dec 1996 15:09:42 -0800 +To: Jamie Zawinski +From: "Blake Ramsdell" +Subject: Re: can you send me an encrypted message? +MIME-Version: 1.0 +Content-Type: application/x-pkcs7-mime; name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAt +IEluZGl2aWR1YWwgU3Vic2NyaWJlcgIQKQ/GF/RumodE+WtXiPJmhDANBgkqhkiG9w0BAQEF +AARAb0tthyav05ce7KBWdlfN1M0R6wLQ2FWPVQynuWo/yHUoo3hiII7j15FXNgnxF7QkY5/p +mZXg0P2eJ1iYQy1vZDCBzAIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5W +ZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1 +YWwgU3Vic2NyaWJlcgIQDOtpec1+JM3EpqAMVqgtjzANBgkqhkiG9w0BAQEFAARAuqnsnz1O +qEdx7NEMJDEdjccjdEuCM8x2euTYlU/GWNY+s2iKVahbT3/R8E8hp3YfrHd2sjvgy6teTOPO +ZI2SxwAAMIAGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIlhWqtbsElaWggASCAjBooYYTWSBz +7A4l0Aho7mK85zpMyAR0xTKqHXT0zL9XpHbKPAcETaBTh1n7e8aJeQ93ONGAs6tVVlA6bpUN +F3Q5O+ZuNXOMT83HIKRYEO1l8a+CH7XtUiQWtu/aBt12GQDX475WhPULKEJs7kLS2DwToRX/ +ctwEPNwc6zfsOZoVTQ5HOwisvDZ2QGwa08Psj38SaQ0Y+ryk5FeiAtKQUZ0uuJWI/rRu64yj +KmVs1DDId18coftA2rv/u2/zABEX8u5ckEkwS7fO7UHv6XMCQ3kqgqIZZE1zIGohfUdtOYYo +M4eki3QDyovHPxEjBbnmpUw2xDN7/DdxYEZ4CteWurQ+VoP0PUM2qwi6EgM6MpVKg8KzOWdb +aV51a1oQKtpJJFZqZtFf9SQ4OW6NKXHsJ2AF8W4OQ+ySWQN43wMk8dGJYlPrREqn5RufPg3k +QM+s4VwTrS2TrU+ELZCYnJFfH+N7tE8ILrFMAteVxtqjat7OJRyDxy0cnBP+oG81Sr0zvbdC +jUPUDFlrPgFjDrswX1UpkEE2OgKWmfc134AbysJFOuCIze2XqKB96rJvxS76ygzVvrU/4sI1 +6VDlZUEuUPaBUOimFxRk/rqPJDI1M8rNKykw9qsoWQMRnvrODfzo7iVWQ0TQHiwfoBhs6Dvm +UgrMwopFnzRdSHvT1acSqVfMYWm5nXImvtCuFAavkjDutE9+Y/LLFLBUpAVeu3rwW3wV0Tcv +9I6Afej0ntfbH9vlRwQIl7MeXMqoBV0AAAAAAAAAAAAA + +--------------31DF237C2F1C-- + +From - Mon Mar 17 17:19:30 1997 +Return-Path: +Received: from ghoti ([207.1.147.41]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA8103 + for ; Mon, 17 Mar 1997 17:17:40 -0800 +Sender: dhugo@netscape.com (Dan Hugo) +Message-ID: <332DED2F.F5365D61@netscape.com> +Date: Mon, 17 Mar 1997 17:17:35 -0800 +From: Dan Hugo +X-Mailer: Mozilla 3.01 (X11; I; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: jwz@netscape.com +Subject: This is signed +Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms088B4AC60B9FCF022C11E60D" +X-Mozilla-Status: 0001 +Content-Length: 6011 + +This is a cryptographically signed message in MIME format. + +--------------ms088B4AC60B9FCF022C11E60D +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +I signed this. It is signed by me. +-dh +--------------ms088B4AC60B9FCF022C11E60D +Content-Type: application/x-pkcs7-signature; name="smime.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7s" + +MIIQCAYJKoZIhvcNAQcCoIIP+TCCD/UCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC +DrQwggn+MIIJZ6ADAgECAhBEnTH5Krg91zfWumiMpAYPMA0GCSqGSIb3DQEBBAUAMGIxETAP +BgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVy +aVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NzAxMjUwMDAw +MDBaFw05ODAxMjUyMzU5NTlaMIIBCzERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZl +cmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVh +bCBTdWJzY3JpYmVyMUYwRAYDVQQLEz13d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BT +IEluY29ycC4gYnkgUmVmLixMSUFCLkxURChjKTk2MSYwJAYDVQQLEx1EaWdpdGFsIElEIENs +YXNzIDEgLSBOZXRzY2FwZTEUMBIGA1UEAxMLRGFuaWVsIEh1Z28xITAfBgkqhkiG9w0BCQEW +EmRodWdvQG5ldHNjYXBlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA8k7aIi84 +a6+2Hy9re4TTL31jxpQgxnHi7Hf7ynIhcSaHo67XWuocRHsOq4A4JpklPACe1QquvVU9QSXy ++mVCW3oRFcaeXwIde5ImxbvO9H1Z8zCuii9r4Cq7zL9sTZDnIYhlSfqdkuLzoFlbZTauZil5 +MJmO3FJpD05C/tu/kH0CAwEAAaOCBwgwggcEMAkGA1UdEwQCMAAwggIfBgNVHQMEggIWMIIC +EjCCAg4wggIKBgtghkgBhvhFAQcBATCCAfkWggGnVGhpcyBjZXJ0aWZpY2F0ZSBpbmNvcnBv +cmF0ZXMgYnkgcmVmZXJlbmNlLCBhbmQgaXRzIHVzZSBpcyBzdHJpY3RseSBzdWJqZWN0IHRv +LCB0aGUgVmVyaVNpZ24gQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgKENQUyks +IGF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL0NQUzsgYnkgRS1tYWls +IGF0IENQUy1yZXF1ZXN0c0B2ZXJpc2lnbi5jb207IG9yIGJ5IG1haWwgYXQgVmVyaVNpZ24s +IEluYy4sIDI1OTMgQ29hc3QgQXZlLiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMgVVNBIFRl +bC4gKzEgKDQxNSkgOTYxLTg4MzAgQ29weXJpZ2h0IChjKSAxOTk2IFZlcmlTaWduLCBJbmMu +ICBBbGwgUmlnaHRzIFJlc2VydmVkLiBDRVJUQUlOIFdBUlJBTlRJRVMgRElTQ0xBSU1FRCBh +bmQgTElBQklMSVRZIExJTUlURUQuoA4GDGCGSAGG+EUBBwEBAaEOBgxghkgBhvhFAQcBAQIw +LDAqFihodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcmVwb3NpdG9yeS9DUFMgMBEGCWCGSAGG ++EIBAQQEAwIHgDA2BglghkgBhvhCAQgEKRYnaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3Jl +cG9zaXRvcnkvQ1BTMIIEhwYJYIZIAYb4QgENBIIEeBaCBHRDQVVUSU9OOiBUaGUgQ29tbW9u +IE5hbWUgaW4gdGhpcyBDbGFzcyAxIERpZ2l0YWwgCklEIGlzIG5vdCBhdXRoZW50aWNhdGVk +IGJ5IFZlcmlTaWduLiBJdCBtYXkgYmUgdGhlCmhvbGRlcidzIHJlYWwgbmFtZSBvciBhbiBh +bGlhcy4gVmVyaVNpZ24gZG9lcyBhdXRoLQplbnRpY2F0ZSB0aGUgZS1tYWlsIGFkZHJlc3Mg +b2YgdGhlIGhvbGRlci4KClRoaXMgY2VydGlmaWNhdGUgaW5jb3Jwb3JhdGVzIGJ5IHJlZmVy +ZW5jZSwgYW5kIAppdHMgdXNlIGlzIHN0cmljdGx5IHN1YmplY3QgdG8sIHRoZSBWZXJpU2ln +biAKQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgKENQUyksIGF2YWlsYWJsZQpp +biB0aGUgVmVyaVNpZ24gcmVwb3NpdG9yeSBhdDogCmh0dHBzOi8vd3d3LnZlcmlzaWduLmNv +bTsgYnkgRS1tYWlsIGF0CkNQUy1yZXF1ZXN0c0B2ZXJpc2lnbi5jb207IG9yIGJ5IG1haWwg +YXQgVmVyaVNpZ24sCkluYy4sIDI1OTMgQ29hc3QgQXZlLiwgTW91bnRhaW4gVmlldywgQ0Eg +OTQwNDMgVVNBCgpDb3B5cmlnaHQgKGMpMTk5NiBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0 +cyAKUmVzZXJ2ZWQuIENFUlRBSU4gV0FSUkFOVElFUyBESVNDTEFJTUVEIEFORCAKTElBQklM +SVRZIExJTUlURUQuCgpXQVJOSU5HOiBUSEUgVVNFIE9GIFRISVMgQ0VSVElGSUNBVEUgSVMg +U1RSSUNUTFkKU1VCSkVDVCBUTyBUSEUgVkVSSVNJR04gQ0VSVElGSUNBVElPTiBQUkFDVElD +RQpTVEFURU1FTlQuICBUSEUgSVNTVUlORyBBVVRIT1JJVFkgRElTQ0xBSU1TIENFUlRBSU4K +SU1QTElFRCBBTkQgRVhQUkVTUyBXQVJSQU5USUVTLCBJTkNMVURJTkcgV0FSUkFOVElFUwpP +RiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSClBVUlBPU0Us +IEFORCBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIENPTlNFUVVFTlRJQUwsClBVTklUSVZFLCBB +TkQgQ0VSVEFJTiBPVEhFUiBEQU1BR0VTLiBTRUUgVEhFIENQUwpGT1IgREVUQUlMUy4KCkNv +bnRlbnRzIG9mIHRoZSBWZXJpU2lnbiByZWdpc3RlcmVkCm5vbnZlcmlmaWVkU3ViamVjdEF0 +dHJpYnV0ZXMgZXh0ZW5zaW9uIHZhbHVlIHNoYWxsIApub3QgYmUgY29uc2lkZXJlZCBhcyBh +Y2N1cmF0ZSBpbmZvcm1hdGlvbiB2YWxpZGF0ZWQgCmJ5IHRoZSBJQS4wDQYJKoZIhvcNAQEE +BQADgYEAafEe3g7HCyRq7u5/2gW1vL0IA7zbvuVcbTwpRc5LPldwYew29BW2qdy9IRTMHdMK +374ei4ortgDuhLVZUh9y5ov3s9tyqW41SlCVdjbJZcJE+2770LQ9SWhAVKuc35tN8uGgsIzH +D3B+bLcknQRZaoiWOo7SB7f3fZ2Na211nvIwggJ5MIIB4qADAgECAhA1EaVSkG/n0CmkQBnU +Efw+MA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg +SW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw05NjA2MjcwMDAwMDBaFw05NzA2MjcyMzU5NTlaMGIxETAPBgNVBAcTCElu +dGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xh +c3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAthSmz03QBQ3YyiPQb6q0KZJjjiz4b5bXLp12SxGxNo1XycP9HMa6/h4IujPKleq+ +41vNBqi3eR1EKu1z8rFSg2gQcGSR1z5r+fddnRRDm26XRZiBR9Ety927ctdMP3Gq4kDyVDm8 +Fu7PfOy62z9sKrMWsYYSna6TNNW41dD3PqkCAwEAAaMzMDEwDwYDVR0TBAgwBgEB/wIBATAL +BgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgIEMA0GCSqGSIb3DQEBAgUAA4GBACnlx6AZ +p28UQoJNIzPXvZg6aXcabIqSJ2vyfAzhxFLg+JzjQK+PsToO90gZdNup+wZOeQNsLwDBqO/p +Ck2fqx2hQw3JquDvq8xa4tkSDnhgJ3I9SHBqbQEIb16CIRTBuCZc4NSpR2R6suw943se/M3E +lO5CjrvH+bQF9Ywt/rE6MIICMTCCAZoCBQKkAAABMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJs +aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBaFw05 +OTEyMzEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3 +MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO ++jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A0 +1480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEA +ATANBgkqhkiG9w0BAQIFAAOBgQBSc7qaVdzcP4J9sJCYYiqCTHYAbiU91cIJcFcBDA93Hxih ++xxgDqB1O0khQf6nXC1MQknT/yjYjOqd/skH4neCUyPeVfPORJP6+ky9yjbzW2aynsjyDF5e +1KG0IQkzyjtZ/JLCOPyt2ZYk4C36oyn1M2h4TrS8n2k14qiYlHM7xDGCARwwggEYAgEBMHYw +YjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQL +EytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyAhBEnTH5Krg9 +1zfWumiMpAYPMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEgYDqCaQ0zitIwVu7QLC3skxR +fl/Jn7sKSzC4SqeVMjm/JzeLLO8Edh0aZ73KJ9z/fdLXbyOKQ9kLUWzcdDv74K6S3RhPxCS5 +VcdCcp0/93l8Y3g/culxQqsxSK7tZKnPGYKHB6br6gC8VkFST+QjjhLTKGaS01WfhCzChTxY +xIre5A== +--------------ms088B4AC60B9FCF022C11E60D-- + +From - Mon Mar 24 00:03:37 1997 +Return-Path: +Received: from r2d2.mcom.com ([205.217.237.47]) by dredd.mcom.com + (Netscape Mail Server v2.02) with ESMTP id AAA14844; + Sun, 23 Mar 1997 23:12:07 -0800 +Received: from ghoti.mcom.com (ghoti.mcom.com [207.1.147.41]) by r2d2.mcom.com (8.7.5/8.7.3) with SMTP id XAA00404; Sun, 23 Mar 1997 23:12:06 -0800 (PST) +Received: from ghoti (localhost [127.0.0.1]) by ghoti.mcom.com (950413.SGI.8.6.12/8.6.9) with SMTP id XAA13656; Sun, 23 Mar 1997 23:12:06 -0800 +Sender: repka@netscape.com +Message-ID: <3336293C.1A98A9A9@netscape.com> +Date: Sun, 23 Mar 1997 23:11:56 -0800 +From: Lisa Repka +Organization: Netscape Communications Corporation +X-Mailer: Mozilla 3.01 (X11; I; IRIX 6.2 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski , Dan Hugo +Subject: testing out some new stuff +Content-Type: application/x-pkcs7-mime; name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" +X-Mozilla-Status: 0005 +Content-Length: 10236 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxggKvMIHMAgEAMHYwYjERMA8GA1UEBxMISW50ZXJuZXQx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENB +IC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyAhBJCr3PVq/yL4EWb0iQtudmMA0GCSqGSIb3DQEB +AQUABECABA21ckYboqGsrycHuLFd2lAykH5zc0qn2lrVq+7z8ot6rrgBgo4ZXVXcqgJbeBIA +ndACq/1yn+cm1zTNJsDMMIHMAgEAMHYwYjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoT +DlZlcmlTaWduLCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZp +ZHVhbCBTdWJzY3JpYmVyAhApD8YX9G6ah0T5a1eI8maEMA0GCSqGSIb3DQEBAQUABECZVZtV +60EG17f8dx18Ko3HVPUDYtUatvbgUwVvppkznNYk6Dq6xhTXPcbB9QG+QLI4PzlG4UWoHa4L +8JPNbE0uMIIBDQIBADB2MGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2ln +biwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vi +c2NyaWJlcgIQRJ0x+Sq4Pdc31rpojKQGDzANBgkqhkiG9w0BAQEFAASBgM6NLcwNenBhPom8 +Jqc2Hg587jtyWmQWU0BG6JvTXWsWvTh+iMgpW18q/xp8bloIU2CHr+eaD0wwMb8jniznJAPt +UoiJ8AzQ+6N44sUtMaPct/9pb3xymN9f+S/HHPO39Hp9WeaLsibbBoFQJcjJX6ChFuTxDTiU +08p2hJYIm1etMIAGCSqGSIb3DQEHATAZBggqhkiG9w0DAjANAgGgBAjLe3IQq8c3gKCABIGw +XRuUTIR75iyUJzG6HY6754iofKee7cidFqsuY/qKl47opuUaat7QaJtYck+sQb3TFucwBbdu +vn1Nf/NG6akGKZQd52ndUBsrpK3Vf+taqbwXHaP54iHRinpSAcGbOO/s8z3C01qDlKNBsI3o +hRHvOliAmyGRonWvyxi1Iv61BJ7jwe5pwb3iHoveiPOc74jJFcOC7jauckqQsbGl7YebNv1v +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 +GgAAAAAAAAAAAAA= +From - Tue Apr 15 10:42:13 1997 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.02) with SMTP id AAA10068 + for ; Tue, 15 Apr 1997 05:06:21 -0700 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id FAA02788 for ; Tue, 15 Apr 1997 05:04:58 -0700 +Received: from alpha.iipo.ayce.com (iipo.ayce.com [204.176.152.40]) by xwing.netscape.com (8.7.6/8.7.3) with ESMTP id FAA14103 for ; Tue, 15 Apr 1997 05:06:19 -0700 (PDT) +Received: from dan.IIPO.AYCE.COM ([192.168.169.131]) by alpha.iipo.ayce.com + (Netscape Mail Server v1.1) with ESMTP id AAA192 + for ; Tue, 15 Apr 1997 08:14:19 -0400 +Message-ID: <33536F24.BBDEA09D@ayce.com> +Date: Tue, 15 Apr 1997 08:05:56 -0400 +From: danw@ayce.com (Dan Werbel) +Reply-To: danw@ayce.com +Organization: ayce +X-Mailer: Mozilla 4.0b3 [en] (Win95; I) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: Re: Obtaining other people's certificates +X-Priority: 3 (Normal) +References: <33522A52.3AC8BA5A@ayce.com> <3352D2BC.94342FC7@netscape.com> +Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms1FB3ACBABA2E8DEE155566A8" +X-Mozilla-Status: 0015 +Content-Length: 2813 + +This is a cryptographically signed message in MIME format. + +--------------ms1FB3ACBABA2E8DEE155566A8 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Jamie - + +I tried to sign and encrypt this message, but when I did I received the +following error: + +The certificate issuer for this server is not recognized by Netscape. +The security certificate may or may not be valid. Netscape refuses to +connect to this server. + +I also got this error when I tried only to encrypt the message. However +with digital signing it seems to work ok. From the error message, I +don't know whether the server in error is my mail server, certificate +server, or a server on your end. Our mail server is Netscape mail +server v1.1 and Certificate Server 1.0. + +Thanks for the help, +Dan +--------------ms1FB3ACBABA2E8DEE155566A8 +Content-Type: application/x-pkcs7-signature; name="smime.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7s" + +MIIFJQYJKoZIhvcNAQcCoIIFFjCCBRICAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCC +BDswggHUMIIBPaADAgECAgEGMA0GCSqGSIb3DQEBBAUAMEoxCzAJBgNVBAYTAlVTMQ8wDQYD +VQQKEwZDYXNpbm8xDTALBgNVBAsTBElJUE8xGzAZBgNVBAMTEmNlcnQuaWlwby5heWNlLmNv +bTAeFw05NzA0MTExODMxMjdaFw05OTA0MTExODMxMjdaMCIxCzAJBgNVBAYTAlVTMRMwEQYD +VQQDEwpEYW4gV2VyYmVsMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAORuX/pu2WBZsRVEAo8a +gDsFIDMuMSSfHjumCcBIweDYJPIxfOA3df6LHiWm7mHo05xJQMYrikpV0cdTt2w8aKMCAwEA +AaM2MDQwEQYJYIZIAYb4QgEBBAQDAgCgMB8GA1UdIwQYMBaAFO+SFAaztmWl3qWbjuSr0z+7 +3YQzMA0GCSqGSIb3DQEBBAUAA4GBAJY7LQc/x7QaPVllkWjLCgn48g/ofjPmpYhVau84uNoc +2uxjxkk7nt7KVHD+JR5q22hZGE3FjDOVX1hf1Brv1ND/TrSNWNqksTPnLhJrksB4jr1nyWdk +cDdiwAwg/JV6hxDSotWEyQQxuXZcc2/8Uql0MayeQoCfnBddsRJJBCsaMIICXzCCAcigAwIB +AgIBATANBgkqhkiG9w0BAQQFADBKMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQ2FzaW5vMQ0w +CwYDVQQLEwRJSVBPMRswGQYDVQQDExJjZXJ0LmlpcG8uYXljZS5jb20wHhcNOTcwNDExMTc1 +ODE0WhcNOTkwNDExMTc1ODE0WjBKMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQ2FzaW5vMQ0w +CwYDVQQLEwRJSVBPMRswGQYDVQQDExJjZXJ0LmlpcG8uYXljZS5jb20wgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBAN5RErUTfKDv1dNb5N6aFM8udyzuG1FfJ1pTGdN1ifsbhBsdDrX4 +h4t/ttLoL5oxs0giyWewmfnCBYJaszX/B8LYdbN7uZ/NYbVTQEj/+tP6cfUVt9BUm6kj+hep +YOXjNYHpyVHhORPXIDpLcIdi9ocSu8Y0bZpc3KChX3JEAehhAgMBAAGjVTBTMBEGCWCGSAGG ++EIBAQQEAwIABDAdBgNVHQ4EFgQU75IUBrO2ZaXepZuO5KvTP7vdhDMwHwYDVR0jBBgwFoAU +75IUBrO2ZaXepZuO5KvTP7vdhDMwDQYJKoZIhvcNAQEEBQADgYEAmyjzwo6RbPwY4nNrDU+a +bv0/Qai2GJuapSuiG5cnGG7xF1Lm1aiwmU6NVuoW8QyrQSvh80zNdSQIwjnxqws6NDrAg1VG +fwpkz2hCBZmpvfie2GedLO/19gO9Myahwr7BsjjAeCJhX+s9iJIWMcLB1auoc8EAq69RsqI1 +ftgNKqYxgbMwgbACAQEwTzBKMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQ2FzaW5vMQ0wCwYD +VQQLEwRJSVBPMRswGQYDVQQDExJjZXJ0LmlpcG8uYXljZS5jb20CAQYwCQYFKw4DAhoFADAN +BgkqhkiG9w0BAQEFAARANKYYXgGR1/JsdTBBpDKE2QSSCiOKnZI1oGAXbyhUlpzXcjevB9J6 +gI03JZ6QJOTp0t2YNPnNtxaIp0YVe2TC/g== +--------------ms1FB3ACBABA2E8DEE155566A8-- + +From - Wed Apr 16 16:57:13 1997 +Message-ID: <33556759.E69CC032@netscape.com> +Date: Wed, 16 Apr 1997 16:57:13 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.02 (X11; U; IRIX 6.2 IP22) +MIME-Version: 1.0 +To: Jamie Zawinski +Subject: encrypted +Content-Type: application/x-pkcs7-mime; name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" +Content-Description: S/MIME Encrypted Message +X-Mozilla-Status: 0001 +Content-Length: 523 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgc8wgcwCAQAwdjBiMREwDwYDVQQHEwhJbnRlcm5ldDEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0Eg +LSBJbmRpdmlkdWFsIFN1YnNjcmliZXICECkPxhf0bpqHRPlrV4jyZoQwDQYJKoZIhvcNAQEB +BQAEQDGfrTzHvgPxsduymPX79aaqV2xKfsutMaqQW+LErXBDwkimBbTq49Id8vycP6SEp6vF +l5J5qda2KFCYUYXgQd0wgAYJKoZIhvcNAQcBMBoGCCqGSIb3DQMCMA4CAgCgBAjJN/R93qHp +TaCABEhb2+WRZ2GsIJzegOQzvmq+gwTH2LyDUgonylLXvlWLDYSTMseqErwpgYqxgfo5uapd +Wn6AtC5HgA5ZAbKAZhRA4Xm8fsZOdc8EEJYfdDGBEbAnDJ7VYP23fyQECB/zPDnCSWqoAAAA +AAAAAAAAAA== +From - Sun Apr 28 13:05:40 1996 +Return-Path: BlakeR@deming.com +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id BAA29432; Sat, 27 Apr 1996 01:15:23 -0700 +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id BAA19974; Sat, 27 Apr 1996 01:14:30 -0700 +Received: from RSA.COM (RSA.COM [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id BAA24941; Sat, 27 Apr 1996 01:13:37 -0700 (PDT) +Received: from pain.deming.com by RSA.COM with SMTP + id AA10376; Sat, 27 Apr 96 01:08:51 PDT +Received: by pain.deming.com with Microsoft Exchange (IMC 4.0.838.14) + id <01BB33D6.1DC9C140@pain.deming.com>; Sat, 27 Apr 1996 01:08:59 -0700 +Message-Id: +From: Blake Ramsdell +To: "'smime-dev@rsa.com'" +Subject: Deming Software -- ready to go! +Date: Sat, 27 Apr 1996 01:08:58 -0700 +X-Mailer: Microsoft Exchange Server Internet Mail Connector Version 4.0.838.14 +Mime-Version: 1.0 +Content-Type: application/x-pkcs7-mime; name="deming.p7m" +Content-Transfer-Encoding: base64 +X-Mozilla-Status: 0005 +Content-Length: 2882 + +MIAGCSqGSIb3DQEHAqCAMIACAQExDjAMBggqhkiG9w0CBQUAMIAGCSqGSIb3DQEHAaCAJIAEggFo +Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0 +DQpDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUNCg0KVGhpcyBzaWduZWQgbWVzc2FnZSBpcyBE +ZW1pbmcgU29mdHdhcmUncyBpbmRpY2F0aW9uIG9mIGludGVyb3BlcmFiaWxpdHkNCiByZWFkaW5l +c3MuICBJIHdpbGwgYmUgaW4gY29udGFjdCB3aXRoIEFyanVuIGFuZCBSYXBoIHRvIGNvbXBsZXRl +IHRoZSANCm5leHQgcGhhc2Ugb2YgdGVzdGluZy4NCg0KTGV0J3Mga2VlcCBnb2luZyENCg0KQmxh +a2UNCi0tDQpCbGFrZSBDLiBSYW1zZGVsbA0KREVNSU5HIFNPRlRXQVJFLCBJTkMuDQo8aHR0cDov +L3d3dy5kZW1pbmcuY29tPg0KAAAAAAAAoIAwggIOMIIBdwIRAJZvpuhJTTXlMBB+6Wgpi9YwDQYJ +KoZIhvcNAQEEBQAwgZ0xETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j +LjEgMB4GA1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2ZWwxIDAeBgNVBAsTF1B1YmxpYyBQb2xp +Y3kgQXV0aG9yaXR5MSswKQYJKoZIhvcNAQkBFhxjbGFzczEtaW5jaWRlbnRAdmVyaXNpZ24uY29t +MB4XDTk2MDQyMzIzMzQzMVoXDTk2MDUyMzIzMzQzMVowNTERMA8GA1UEBxMISW50ZXJuZXQxIDAe +BgkqhkiG9w0BCQEWEUJsYWtlUkBkZW1pbmcuY29tMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK5p +EHTIgBq3KMigUfgzLAd8p62GRu7DhRWlTRV4XzOzd54zZrLPdcBD6Awhize3McsBzfFg3Ksf0X6N +4YmffhUCAwEAATANBgkqhkiG9w0BAQQFAAOBgQDL2WVV2T068o+gQiVXWKpyJkDFL7Vscj5i12Jp +H8BSUZHzrWTeMTKcMPZIxXc+Tc7P6BLatWRaJ1Fn/j6uX1Gmw+CYA7ba8FKO1GdIjWQMQ8oD6Bqu +3zHyhEdGDHp7Ac2zzrlP9kk7y+y6sAwRp0GYu0IBbZUxynT+0Ajjo5W+yTCCAlkwggHCAgUCcgAA +ATANBgkqhkiG9w0BAQIFADBIMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4x +IDAeBgNVBAsTF0NsYXNzIDEgQXNzdXJhbmNlIExldmVsMB4XDTk1MTIwNzAwMDAwMFoXDTk5MTIz +MTIzNTk1OVowgZ0xETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEg +MB4GA1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2ZWwxIDAeBgNVBAsTF1B1YmxpYyBQb2xpY3kg +QXV0aG9yaXR5MSswKQYJKoZIhvcNAQkBFhxjbGFzczEtaW5jaWRlbnRAdmVyaXNpZ24uY29tMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgeHrgXvkvVB1tR47OHIdk+rxL1rAi4LR4RKd59okk +rOpFdYzwbAUWA7jBphpSD7xSsBUxiOjp5YYhRDL5zExACvdiIEDJxPqwUvmkmNXYALKaGYWvJWsx +ALtk0Bpf82y0uxSmUrsdHirSGpaFleH3D2AiEsYMChQ7kpBW1vs5LQIDAQABMA0GCSqGSIb3DQEB +AgUAA4GBAKROBq7wk4Ynx1DXItt4EwC6/c6RcnU2RtpE6/uxsgtYFtaPoSUqtl/3kjovWUFEDRe+ +DBu6Ae3Vm3x3kklF9b9Dq9+IUIurDTqtx30bYTcuDdfNu3V8cz9/CFNeUAHb+RAremus3s/msgDv +uyo9NyzkSWUlPjsqolRPs1S9/yC4AAChgDCCAQwwdzANBgkqhkiG9w0BAQIFADBIMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xIDAeBgNVBAsTF0NsYXNzIDEgQXNzdXJhbmNl +IExldmVsFw05NTEyMDcwMTA1MTBaFw05NjA0MDEwMTA0MjhaMA0GCSqGSIb3DQEBAgUAA4GBADAB +PXKyt8lQYnZLOILguT9MgQF2mCnvRpBonj38PIVscBRP/51VoJeBwdi0OGjqpCwjnfxQvkVl6BT/ +SCw9PXi2nN94lINJRTl8tJ/+BeU1PH/uTiuv+D1ouEPRA7nBD66j9xG/jy8rIKWm6MNzJL/wI0/r +Vrk3mMI69Y5NC9iTAAAxgDCCARgCAQEwgbMwgZ0xETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQK +Ew5WZXJpU2lnbiwgSW5jLjEgMB4GA1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2ZWwxIDAeBgNV +BAsTF1B1YmxpYyBQb2xpY3kgQXV0aG9yaXR5MSswKQYJKoZIhvcNAQkBFhxjbGFzczEtaW5jaWRl +bnRAdmVyaXNpZ24uY29tAhEAlm+m6ElNNeUwEH7paCmL1jAMBggqhkiG9w0CBQUAMA0GCSqGSIb3 +DQEBAQUABEAsnhQPeX87vT74Wac98iTe8Mhh1ZH2VbNtGPbJ24RVlSR56SPvsYB0FdrvmI4XfMqS +gYc5R346K3Oms8eL1do6AAAAAAAAAAA= + +From - Tue May 28 11:02:16 1996 +Return-Path: ray2@FrontierTech.com +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id KAA06913; Tue, 28 May 1996 10:39:26 -0700 +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id KAA21382; Wed, 29 May 1996 10:39:17 -0700 +Received: from RSA.COM (RSA.COM [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id KAA04507; Tue, 28 May 1996 10:38:18 -0700 (PDT) +Received: from ns.frontiertech.com by RSA.COM with SMTP + id AA17193; Tue, 28 May 96 10:23:33 PDT +Received: by FrontierTech.COM (8.6.9/8.6.9) with SMTP id MAA17555 for ; Tue, 28 May 1996 12:26:15 -0500 +X-Mailer: SuperTCP Suite for Windows Version 2.1 (Mailer Version 1.02) +Message-Id: <31AB36CC-00000001@rock106.FrontierTech.com> +X-UIDL: 833305231.000 +From: Ray2@FrontierTech.com +Mime-Version: 1.0 +Content-Type: Application/x-pkcs7-mime +Content-Transfer-Encoding: Base64 +Date: Tue, 28 May 1996 12:24:23 cst +Subject: Frontier Technologies testing, here's my cert +To: smime-dev@RSA.COM +Status: U +X-Mozilla-Status: 0001 +Content-Length: 2122 + +MIAGCSqGSIb3DQEHAqCAMIACAQExDjAMBggqhkiG9w0CBQUAMIAGCSqGSIb3DQEHAaCAJIAE +Q01JTUUtVmVyc2lvbjogMS4wDQpDb250ZW50LVR5cGU6IFRleHQvUGxhaW47IENoYXJzZXQ9 +VVMtQVNDSUkNCg0KDQoAAAAAAACggDCCAhIwggF7AhEA62zEiHHV7taXo1K3a9lK6TANBgkq +hkiG9w0BAQQFADCBnTERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWduLCBJ +bmMuMSAwHgYDVQQLExdDbGFzcyAxIEFzc3VyYW5jZSBMZXZlbDEgMB4GA1UECxMXUHVibGlj +IFBvbGljeSBBdXRob3JpdHkxKzApBgkqhkiG9w0BCQEWHGNsYXNzMS1pbmNpZGVudEB2ZXJp +c2lnbi5jb20wHhcNOTYwNTEzMjAxOTM0WhcNOTYwNjEyMjAxOTM0WjA5MREwDwYDVQQHEwhJ +bnRlcm5ldDEkMCIGCSqGSIb3DQEJARYVUmF5MkBGcm9udGllclRlY2guQ09NMFwwDQYJKoZI +hvcNAQEBBQADSwAwSAJBAMy8QcW7RMrB4sTdQ8Nmb2DFmJmkWn+el+NdeamIDElX/qw9mIQu +4xNj1FfepfJNxzPvA0OtMKhy6+bkrlyMEU8CAwEAATANBgkqhkiG9w0BAQQFAAOBgQBb9yc/ +VQmdwBImTtAaHTC1HGpXz96VywBjKpeWlx9ZDh8aGCYVeTKgTveTryOkxsA5YFLBmaE/dE6y +oCC9g0rvQSCdkeMzzrU/vzb8MAR3mUVYpq27GWyGscSis3OxT0mZp/sYEWn47n+XT5ViIku/ +UNAdN1jBH0+d9eIUs+IoWTCCAlkwggHCAgUCcgAAATANBgkqhkiG9w0BAQIFADBIMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xIDAeBgNVBAsTF0NsYXNzIDEgQXNz +dXJhbmNlIExldmVsMB4XDTk1MTIwNzAwMDAwMFoXDTk5MTIzMTIzNTk1OVowgZ0xETAPBgNV +BAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEgMB4GA1UECxMXQ2xhc3Mg +MSBBc3N1cmFuY2UgTGV2ZWwxIDAeBgNVBAsTF1B1YmxpYyBQb2xpY3kgQXV0aG9yaXR5MSsw +KQYJKoZIhvcNAQkBFhxjbGFzczEtaW5jaWRlbnRAdmVyaXNpZ24uY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDgeHrgXvkvVB1tR47OHIdk+rxL1rAi4LR4RKd59okkrOpFdYzw +bAUWA7jBphpSD7xSsBUxiOjp5YYhRDL5zExACvdiIEDJxPqwUvmkmNXYALKaGYWvJWsxALtk +0Bpf82y0uxSmUrsdHirSGpaFleH3D2AiEsYMChQ7kpBW1vs5LQIDAQABMA0GCSqGSIb3DQEB +AgUAA4GBAKROBq7wk4Ynx1DXItt4EwC6/c6RcnU2RtpE6/uxsgtYFtaPoSUqtl/3kjovWUFE +DRe+DBu6Ae3Vm3x3kklF9b9Dq9+IUIurDTqtx30bYTcuDdfNu3V8cz9/CFNeUAHb+RAremus +3s/msgDvuyo9NyzkSWUlPjsqolRPs1S9/yC4AAChgAAAMYAwggEYAgEBMIGzMIGdMREwDwYD +VQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xIDAeBgNVBAsTF0NsYXNz +IDEgQXNzdXJhbmNlIExldmVsMSAwHgYDVQQLExdQdWJsaWMgUG9saWN5IEF1dGhvcml0eTEr +MCkGCSqGSIb3DQEJARYcY2xhc3MxLWluY2lkZW50QHZlcmlzaWduLmNvbQIRAOtsxIhx1e7W +l6NSt2vZSukwDAYIKoZIhvcNAgUFADANBgkqhkiG9w0BAQEFAARARYPUJhkJG0zOTHUnRt3p +uWaGVnIgJrjtLTOfi/W/0CaGYEhNhsLLiQ7EbVkF8S/cDjsxywND2YjvdTh9/hNsMwAAAAAA +AAAA + +From - Mon Jun 10 11:45:25 1996 +Return-Path: owner-smime-dev@RSA.COM +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.6.12/8.6.9) with ESMTP id LAA06225; Mon, 10 Jun 1996 11:39:15 -0700 +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id LAA29912; Mon, 10 Jun 1996 11:38:04 -0700 +Received: from RSA.COM (RSA.COM [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id LAA03740; Mon, 10 Jun 1996 11:37:21 -0700 (PDT) +Received: by RSA.COM + id AA16878; Mon, 10 Jun 96 11:32:05 PDT +Message-Id: <9606101835.AA29051@www> +Date: Mon, 10 Jun 1996 14:37:52 -0500 +X-Mailer: OpenSoft ExpressMail Version 1.0 +Mime-Version: 1.0 +Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=rsa-md5; boundary="===OpenSoft===11339510===2===" +X-UIDL: 834432008.000 +From: jgildred@opensoft.com (John T. Gildred) +To: smime-dev@RSA.COM ('smime-dev@rsa.com') +Subject: Signed Confirmation +Sender: owner-smime-dev@RSA.COM +Precedence: bulk +Status: U +X-Mozilla-Status: 0005 +Content-Length: 2957 + + +--===OpenSoft===11339510===2=== +MIME-Version: 1.0 +Content-Type: text/plain; charset="us-ascii" + + +--===OpenSoft===11339510===2=== +Content-Type: application/x-pkcs7-signature +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCCB8Ewgge9AgEBMQ4wDAYIKoZIhvcNAgUFADCABgkqhkiG +9w0BBwEAAKCCBncwggIDMIIBbAIFAnIAAAIwDQYJKoZIhvcNAQECBQAwSDELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMSAwHgYDVQQLExdDbGFz +cyAxIEFzc3VyYW5jZSBMZXZlbDAeFw05NTEyMTMxODI2NTVaFw05OTEyMzExODI2 +NTVaMEgxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEgMB4G +A1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2ZWwwgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBAL3XxO2O1rN/OvhilSL91rW18hEdBt3tZG6A8A2VX1O1Qkv/gFY+ +fUrFXCawOpED1OT8AI3nz7wujgWbTQvBiIcR9pjWVzMV07lOV+GxrJB1AkT4+6S5 +OKrGzgoTc0eDxJT83qdkGuZx85yv6W4GcUbvKdlIEBAituzYFA+NNH8nAgMBAAEw +DQYJKoZIhvcNAQECBQADgYEAPSUL6fSN2Ei65ZNgVxV1zcIBTMxJjQ6IcjPTlgEu +FouajOzmU9P8DXCYTdlb4dArlAQpuZl7sN6l95AwTEYvcC7WcpGrFepA++/m6KB9 +PBtBIZJeG9HW9SZmq1CrsXGYF/2rivrSMdEwzaZYcwejZ4OXvBM6zMx8+5PBRaYt +vTgwggIPMIIBeAIRAIU4YBC74iL3XmlfPohD8dIwDQYJKoZIhvcNAQEEBQAwgZ0x +ETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEgMB4G +A1UECxMXQ2xhc3MgMSBBc3N1cmFuY2UgTGV2ZWwxIDAeBgNVBAsTF1B1YmxpYyBQ +b2xpY3kgQXV0aG9yaXR5MSswKQYJKoZIhvcNAQkBFhxjbGFzczEtaW5jaWRlbnRA +dmVyaXNpZ24uY29tMB4XDTk2MDYxMDAzMTEwOFoXDTk2MDcxMDAzMTEwOFowOTER +MA8GA1UEBxMISW50ZXJuZXQxJDAiBgkqhkiG9w0BCQEWFWpnaWxkcmVkQG9wZW5z +b2Z0LmNvbTBZMAoGBFUIAQECAgIAA0sAMEgCQQDeK7ftSrLOqEIp2FW6bveae+U4 +pDEcufIlRx6XCE/XxlGO7djwhjBwjmdBCLCWudHHACxVn11DwcZHrsNk9yBJAgMB +AAEwDQYJKoZIhvcNAQEEBQADgYEA0kbBxyATGyuQe7QkJbuyTMRiQW8djg5xLGtL +2erUxaPNPZp6+pHUg/u67kJo56492ERqljg/ULc8BohBEGUuwv4d5hSST0KHhk5y +UIIOT0FUXh/4M+iZBKsy+1ERGnZBYg2Kt9BoK1bIhedCtiA1pD7kUfztEOMj1QGM +k841UKwwggJZMIIBwgIFAnIAAAEwDQYJKoZIhvcNAQECBQAwSDELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMSAwHgYDVQQLExdDbGFzcyAxIEFz +c3VyYW5jZSBMZXZlbDAeFw05NTEyMDcwMDAwMDBaFw05OTEyMzEyMzU5NTlaMIGd +MREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xIDAe +BgNVBAsTF0NsYXNzIDEgQXNzdXJhbmNlIExldmVsMSAwHgYDVQQLExdQdWJsaWMg +UG9saWN5IEF1dGhvcml0eTErMCkGCSqGSIb3DQEJARYcY2xhc3MxLWluY2lkZW50 +QHZlcmlzaWduLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4Hh64F75 +L1QdbUeOzhyHZPq8S9awIuC0eESnefaJJKzqRXWM8GwFFgO4waYaUg+8UrAVMYjo +6eWGIUQy+cxMQAr3YiBAycT6sFL5pJjV2ACymhmFryVrMQC7ZNAaX/NstLsUplK7 +HR4q0hqWhZXh9w9gIhLGDAoUO5KQVtb7OS0CAwEAATANBgkqhkiG9w0BAQIFAAOB +gQCkTgau8JOGJ8dQ1yLbeBMAuv3OkXJ1NkbaROv7sbILWBbWj6ElKrZf95I6L1lB +RA0XvgwbugHt1Zt8d5JJRfW/Q6vfiFCLqw06rcd9G2E3Lg3Xzbt1fHM/fwhTXlAB +2/kQK3prrN7P5rIA77sqPTcs5EllJT47KqJUT7NUvf8guDGCARwwggEYAgEBMIGz +MIGdMREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4x +IDAeBgNVBAsTF0NsYXNzIDEgQXNzdXJhbmNlIExldmVsMSAwHgYDVQQLExdQdWJs +aWMgUG9saWN5IEF1dGhvcml0eTErMCkGCSqGSIb3DQEJARYcY2xhc3MxLWluY2lk +ZW50QHZlcmlzaWduLmNvbQIRAIU4YBC74iL3XmlfPohD8dIwDAYIKoZIhvcNAgUF +ADANBgkqhkiG9w0BAQEFAARAyD0uuJsqRBcMalVVEGzeGmvtNymctzBxy2kCzhMf +YgMQk9JIRMSI/mgv/XXSAY/7Fwjvx7UO+MjMz+RTtznUxgAA +--===OpenSoft===11339510===2===-- + +From - Wed Sep 11 08:47:00 1996 +Return-Path: owner-smime-dev@RSA.COM +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.mcom.com (8.7.5/8.7.3) with SMTP id NAA01603; Mon, 9 Sep 1996 13:04:54 -0700 (PDT) +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id NAA29833; Mon, 9 Sep 1996 13:03:35 -0700 +Received: from RSA.COM (chirality.rsa.com [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id NAA01808; Mon, 9 Sep 1996 13:02:34 -0700 (PDT) +Received: by RSA.COM + id AA26187; Mon, 9 Sep 96 12:47:15 PDT +Message-Id: <01BB9E4D.CA27D8A0@Peter.verisign.com> +From: Peter Williams +To: "'smime-dev@rsa.com'" +Subject: plase help by returning what gets delivered... +Date: Mon, 9 Sep 1996 12:52:38 -0700 +Mime-Version: 1.0 +Content-Type: multipart/mixed; boundary="---- =_NextPart_000_01BB9E4D.CA434FE0" +Sender: owner-smime-dev@RSA.COM +Precedence: bulk +X-UIDL: db360888b99be53e578173dc6a65a828 +X-Mozilla-Status: 0001 +Content-Length: 2880 + + +------ =_NextPart_000_01BB9E4D.CA434FE0 +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + + +The first two bodypart sent above should be part of a MIME object. +One should be type text/html, the second application/octet-stream. + +Can anyone who cares send me back the MIME object for +this message actually delivered to their UA? + +Im finding Deming' s excellent tool to be be very useful +for signing attachements of any type, and being +able to reverify the bodypart content even once the attachement +is released from the mail system. + +Peter. + +------ =_NextPart_000_01BB9E4D.CA434FE0 +Content-Type: text/html; name="Page1.htm" +Content-Transfer-Encoding: 7bit + + + +New Page + + + + + + + + + + + + + + + + + + + + + + + +------ =_NextPart_000_01BB9E4D.CA434FE0 +Content-Type: application/x-pkcs7-signature; name="Page1.p7s" +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIAwggHOMIIB +NwIEQAjsMTANBgkqhkiG9w0BAQQFADAuMSwwKgYDVQQDFCNQZXRlciBXaWxsaWFtcyA8cGV0ZXJA +VmVyaVNpZ24uY29tPjAeFw05NjA3MTYyMTIzMTJaFw05ODA3MTYyMTIzMTFaMC4xLDAqBgNVBAMU +I1BldGVyIFdpbGxpYW1zIDxwZXRlckBWZXJpU2lnbi5jb20+MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC0DQLdneDxs9u+7STPqBls/wZX89tHi4a8r/b629bqaEOoGbamNGPx9LSAjZxItPRG +2m4tEgY+oe8gYTPnKzPlZJyWmCxD8Cpi3dQF8/8NzKqEtxVEoldvUAdQB77BznGs5s8DC7GYIR89 +aJoyVk1IcxY+YQYj3hN2YWQ4/F5OGwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAHWOkUF8GfWNS9pA +bYZXesuYwxZ6FWgnD4A7WeS0ODYIdZ3MfQhYkyiIba/8ex+A8JhazpOsBRM0ydoHpspbWhhwTlah +/CUNk3V/eZLYpYsiwSTQYKBxuhYIfkaE0mXgAv+ef473du5NaNLIGI5cK7Vmbj9Bh/93K9Serto1 +BtxiAAAxgDCCAWMCAQEwNjAuMSwwKgYDVQQDFCNQZXRlciBXaWxsaWFtcyA8cGV0ZXJAVmVyaVNp +Z24uY29tPgIEQAjsMTAJBgUrDgMCGgUAoIGIMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJ +KoZIhvcNAQkFMQ8XDTk2MDkwOTE5NDEzMlowIwYJKoZIhvcNAQkEMRYEFFusg4r4l+lJKA8GOuNP +xoTBiXuCMCkGCSqGSIb3DQEJDTEcExpTaWduZWQgYnkgU2VjdXJlIE1lc3NlbmdlcjANBgkqhkiG +9w0BAQEFAASBgLCjKzFaV8bOUloF1T3zjEFTOqSk7/MZoqv3xMwOYo76/81Jl36DBNIcngari3v5 +vIRWDwvw6gRnE4kkx0DGVu/zvXV2EX1BTwx47uLcExR99SilUZbkwf/Q2foBPbKXAVunCZ3SJcPG +X0GE3m1gBzM2KDEKEKLpvSTzBBpvZNIMAAAAAAAAAAA= + +------ =_NextPart_000_01BB9E4D.CA434FE0-- + +From - Mon Sep 23 13:04:41 1996 +Return-Path: owner-smime-dev@RSA.COM +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.mcom.com (8.7.5/8.7.3) with SMTP id JAA19830; Mon, 23 Sep 1996 09:27:04 -0700 (PDT) +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id JAA07645; Mon, 23 Sep 1996 09:25:43 -0700 +Received: from RSA.COM (chirality.rsa.com [192.80.211.33]) by ns.netscape.com (8.7.3/8.7.3) with SMTP id JAA28691; Mon, 23 Sep 1996 09:24:41 -0700 (PDT) +Received: by RSA.COM + id AA02291; Mon, 23 Sep 96 09:18:21 PDT +Date: Mon, 23 Sep 96 09:20:00 PDT +To: "S-MIME DEV" +From: "Ron Craswell" +Subject: multipart/signed test +Mime-Version: 1.0 +Content-Type: multipart/signed; boundary= + "---=_=_ 3784965-7724120-8948032 _=_=---"; micalg=rsa-sha1; protocol= + "application/x-pkcs7-signature" +Message-Id: <19960923092443.03af0217.in@peapod.deming.com> +Sender: owner-smime-dev@RSA.COM +Precedence: bulk +X-UIDL: b097620b95ad7baa11ee8c3d2f409640 +X-Mozilla-Status: 0001 +Content-Length: 4528 + + +-----=_=_ 3784965-7724120-8948032 _=_=--- +Content-Type: text/plain +Content-Transfer-Encoding: quoted-printable + +Here's a test multipart/signed message. Anyone who can read +this and verify the signature, please respond to me. + +Thanks, +Ron Craswell +Deming Software + + +-----=_=_ 3784965-7724120-8948032 _=_=--- +Content-Type: application/x-pkcs7-signature +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIAwggVD +MIIErKADAgECAhAqqMNhRDnyZ4/IFxlCEv25MA0GCSqGSIb3DQEBBAUAMGIxETAPBgNVBAcT +CEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE0MDIGA1UECxMrVmVyaVNpZ24g +Q2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcjAeFw05NjA5MjMwMDAwMDBaFw05 +NjA5MjgyMzU5NTlaMIIBJjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWdu +LCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVhbCBTdWJz +Y3JpYmVyMUYwRAYDVQQLEz13d3cudmVyaXNpZ24uY29tL3JlcG9zaXRvcnkvQ1BTIEluY29y +cC4gYnkgUmVmLixMSUFCLkxURChjKTk2MT4wPAYDVQQLEzVEaWdpdGFsIElEIENsYXNzIDEg +LSBTTUlNRSBEZW1pbmcgU29mdHdhcmUsIEluYy4gQmV0YTEaMBgGA1UEAxMRUm9uYWxkIEog +Q3Jhc3dlbGwxHjAcBgkqhkiG9w0BCQEWD3JvbmNAZGVtaW5nLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA+JwFnASUABZCioWmADLnZvMeKAI1voL+s9b01u7+YAv1UvtUFX57 +wT9sgN3LAOtdwNTv6JEzUXAFf8X5bys2uMy7a9cYirg5qozQ9VOcyX/CKt4H9AfTkxa+U56h +FvC0ghn3+Pw8W8aD3nuobORXM2E4fMIeCtexPN13WrmFkrkCAwEAAaOCAjIwggIuMAkGA1Ud +EwQCMAAwggIfBgNVHQMEggIWMIICEjCCAg4wggIKBgtghkgBhvhFAQcBATCCAfkWggGnVGhp +cyBjZXJ0aWZpY2F0ZSBpbmNvcnBvcmF0ZXMgYnkgcmVmZXJlbmNlLCBhbmQgaXRzIHVzZSBp +cyBzdHJpY3RseSBzdWJqZWN0IHRvLCB0aGUgVmVyaVNpZ24gQ2VydGlmaWNhdGlvbiBQcmFj +dGljZSBTdGF0ZW1lbnQgKENQUyksIGF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cudmVyaXNp +Z24uY29tL0NQUzsgYnkgRS1tYWlsIGF0IENQUy1yZXF1ZXN0c0B2ZXJpc2lnbi5jb207IG9y +IGJ5IG1haWwgYXQgVmVyaVNpZ24sIEluYy4sIDI1OTMgQ29hc3QgQXZlLiwgTW91bnRhaW4g +VmlldywgQ0EgOTQwNDMgVVNBIFRlbC4gKzEgKDQxNSkgOTYxLTg4MzAgQ29weXJpZ2h0IChj +KSAxOTk2IFZlcmlTaWduLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiBDRVJUQUlOIFdB +UlJBTlRJRVMgRElTQ0xBSU1FRCBhbmQgTElBQklMSVRZIExJTUlURUQuoA4GDGCGSAGG+EUB +BwEBAaEOBgxghkgBhvhFAQcBAQIwLDAqFihodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcmVw +b3NpdG9yeS9DUFMgMA0GCSqGSIb3DQEBBAUAA4GBAG2HnnegbT4k8xn0c5ciQF69M8J8NUlR +2lrDhHrIF5HCHYHrzOBFbRxBB7Q76HvkN+HKTZIJCNdHS/dk8TF5H56dmhkou93y3bca9Qoy +JDKBZ5EnNj96yK6xQ+/iNt8FHPaRyb2awC5WfvH5PoJvuPrBm+8fvG0PbsWxZl7lZYXJMIIC +eTCCAeKgAwIBAgIQNRGlUpBv59AppEAZ1BH8PjANBgkqhkiG9w0BAQIFADBfMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDEgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNOTYwNjI3MDAwMDAwWhcNOTcw +NjI3MjM1OTU5WjBiMREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIElu +Yy4xNDAyBgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmli +ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALYUps9N0AUN2Moj0G+qtCmSY44s+G+W +1y6ddksRsTaNV8nD/RzGuv4eCLozypXqvuNbzQaot3kdRCrtc/KxUoNoEHBkkdc+a/n3XZ0U +Q5tul0WYgUfRLcvdu3LXTD9xquJA8lQ5vBbuz3zsuts/bCqzFrGGEp2ukzTVuNXQ9z6pAgMB +AAGjMzAxMA8GA1UdEwQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIC +BDANBgkqhkiG9w0BAQIFAAOBgQAp5cegGadvFEKCTSMz172YOml3GmyKkidr8nwM4cRS4Pic +40Cvj7E6DvdIGXTbqfsGTnkDbC8Awajv6QpNn6sdoUMNyarg76vMWuLZEg54YCdyPUhwam0B +CG9egiEUwbgmXODUqUdkerLsPeN7HvzNxJTuQo67x/m0BfWMLf6xOgAAoYAwggEnMIGRMA0G +CSqGSIb3DQEBAgUAMGIxETAPBgNVBAcTCEludGVybmV0MRcwFQYDVQQKEw5WZXJpU2lnbiwg +SW5jLjE0MDIGA1UECxMrVmVyaVNpZ24gQ2xhc3MgMSBDQSAtIEluZGl2aWR1YWwgU3Vic2Ny +aWJlchcNOTYwNzAxMTczMDQwWhcNOTcwNzAxMDAwMDAwWjANBgkqhkiG9w0BAQIFAAOBgQAY +u5Do9fwDsCKoES1bNi2XqVk1IMjRtHlhSj4PYnOTDfR3FCclJspcRzpdi7MBbke+vMBNe7lz +X1ZY9PhxEPCaMfvWL1BwPKxbB//ATSoZOJYje1BPQjlUaHuMgkPTueUHDdHheXx0f2Svzkmx +aKeoMflgqkij2jySdjmfv6qM6jCCASQwgY4wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw05NjA4MTMwMDMwNThaFw05NzA4MTIw +MDAwMDBaMA0GCSqGSIb3DQEBAgUAA4GBANXc7/6Xr1C26DcMIkXCDqtV2kUDjMlsP0khVDbv +o+a0kY475s1k6ZtG4v/HLeU+R0fWriZs+kP6Y+sdMGlxI7IVkId/1WoCHIA7F3HTmyA3MOBq +X4oHDh6+e+yqRZa95BlQuIpOaE785jbHCuUqPJ6cGxF8fTRzFxZoe7zK+40RAAAxgDCCAXcC +AQEwdjBiMREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAy +BgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXICECqo +w2FEOfJnj8gXGUIS/bkwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEw +HAYJKoZIhvcNAQkFMQ8XDTk2MDkyMzE2MTE0NVowIwYJKoZIhvcNAQkEMRYEFDfU6g0eba3d +u4OWg+vZTtYXPu7wMA0GCSqGSIb3DQEBAQUABIGAg1K0GAAMYK1A+F9vi2PhdmE1AMWzQXsj +/LkFlEF/GDg5DDtQH8lcGHuCjQNQA3c9sE+dgqW7teF5dqaB+/ua3dvQzrwuS0PDtqQSvQcF +q5AD2i7qQrvF1Jr/Z1eyMMAEZP1TCQjTzxffsbHRwOshRVwewVzDQ9mX9MBBdnb4ziQAAAAA +AAAAAA== +-----=_=_ 3784965-7724120-8948032 _=_=----- + +From - Sat Nov 2 21:56:58 1996 +Return-Path: +Received: from maleman.mcom.com ([198.93.92.3]) by dredd.mcom.com + (Netscape Mail Server v2.01) with SMTP id AAA20354; + Tue, 29 Oct 1996 12:15:27 -0700 +Received: from xwing.netscape.com (xwing.mcom.com [205.218.156.54]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id MAA06386; Tue, 29 Oct 1996 12:14:10 -0800 +Received: from RSA.COM (chirality.rsa.com [192.80.211.33]) by xwing.netscape.com (8.7.6/8.7.3) with SMTP id MAA08725; Tue, 29 Oct 1996 12:13:42 -0800 (PST) +Received: by RSA.COM + id AA21317; Tue, 29 Oct 96 12:13:12 PPE +Date: Tue, 29 Oct 1996 15:12:00 -0500 +Message-Id: MSG961029151201#15@server1.opensoft.com +X-Mailer: OpenSoft ExpressMail Version 1.0 +Mime-Version: 1.0 +Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=rsa-sha; boundary="===OpenSoft===247233737===5===" +From: jgildred@opensoft.com (John T. Gildred) +To: smime-dev@RSA.COM ('smime-dev@rsa.com') +Subject: Signed SHA1 with VeriSign certification +Sender: owner-smime-dev@RSA.COM +Precedence: bulk +X-Mozilla-Status: 0001 +Content-Length: 4051 + + +--===OpenSoft===247233737===5=== +Content-Transfer-Encoding: 7bit +Content-Type: text/plain; charset="us-ascii" + +Fellow testers: + +Please let me know if this sig poses any problems. + +-John +--===OpenSoft===247233737===5=== +Content-Type: application/x-pkcs7-signature +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCCCqYwggqiAgEBMQswCQYFKw4DAhoFADCABgkqhkiG9w0B +BwEAAKCCCaIwggIxMIIBmgIFAqQAAAEwDQYJKoZIhvcNAQECBQAwXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEy +OTAwMDAwMFoXDTk5MTIzMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVu +DLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVW +aR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqG +SIb3DQEBAgUAA4GBAFJzuppV3Nw/gn2wkJhiKoJMdgBuJT3VwglwVwEMD3cfGKH7 +HGAOoHU7SSFB/qdcLUxCSdP/KNiM6p3+yQfid4JTI95V885Ek/r6TL3KNvNbZrKe +yPIMXl7UobQhCTPKO1n8ksI4/K3ZliTgLfqjKfUzaHhOtLyfaTXiqJiUczvEMIIC +eTCCAeKgAwIBAgIQNRGlUpBv59AppEAZ1BH8PjANBgkqhkiG9w0BAQIFADBfMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNs +YXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcN +OTYwNjI3MDAwMDAwWhcNOTcwNjI3MjM1OTU5WjBiMREwDwYDVQQHEwhJbnRlcm5l +dDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1ZlcmlTaWduIENs +YXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIwgZ8wDQYJKoZIhvcNAQEB +BQADgY0AMIGJAoGBALYUps9N0AUN2Moj0G+qtCmSY44s+G+W1y6ddksRsTaNV8nD +/RzGuv4eCLozypXqvuNbzQaot3kdRCrtc/KxUoNoEHBkkdc+a/n3XZ0UQ5tul0WY +gUfRLcvdu3LXTD9xquJA8lQ5vBbuz3zsuts/bCqzFrGGEp2ukzTVuNXQ9z6pAgMB +AAGjMzAxMA8GA1UdEwQIMAYBAf8CAQEwCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIB +AQQEAwICBDANBgkqhkiG9w0BAQIFAAOBgQAp5cegGadvFEKCTSMz172YOml3GmyK +kidr8nwM4cRS4Pic40Cvj7E6DvdIGXTbqfsGTnkDbC8Awajv6QpNn6sdoUMNyarg +76vMWuLZEg54YCdyPUhwam0BCG9egiEUwbgmXODUqUdkerLsPeN7HvzNxJTuQo67 +x/m0BfWMLf6xOjCCBOwwggRVoAMCAQICEFFJf2qY+gHIW0t+SuyuYCIwDQYJKoZI +hvcNAQEEBQAwYjERMA8GA1UEBxMISW50ZXJuZXQxFzAVBgNVBAoTDlZlcmlTaWdu +LCBJbmMuMTQwMgYDVQQLEytWZXJpU2lnbiBDbGFzcyAxIENBIC0gSW5kaXZpZHVh +bCBTdWJzY3JpYmVyMB4XDTk2MTAyOTAwMDAwMFoXDTk2MTEyODIzNTk1OVowggEU +MREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAy +BgNVBAsTK1ZlcmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmli +ZXIxRjBEBgNVBAsTPXd3dy52ZXJpc2lnbi5jb20vcmVwb3NpdG9yeS9DUFMgSW5j +b3JwLiBieSBSZWYuLExJQUIuTFREKGMpOTYxPTA7BgNVBAsTNERpZ2l0YWwgSUQg +Q2xhc3MgMSAtIFNNSU1FIE9wZW5Tb2Z0IENvcnBvcmF0aW9uIEJldGExKTAnBgkq +hkiG9w0BCQEWGnNtaW1lLWludGVyb3BAb3BlbnNvZnQuY29tMFswDQYJKoZIhvcN +AQEBBQADSgAwRwJADeNrTMucfTTQSuc+WPBUM0MxRhjkXFLepVhZel6y5GCrL9bC +iHm+QzA81DItelxpAMOY5gOhwyRu5Njr6ag57QIDAQABo4ICMjCCAi4wCQYDVR0T +BAIwADCCAh8GA1UdAwSCAhYwggISMIICDjCCAgoGC2CGSAGG+EUBBwEBMIIB+RaC +AadUaGlzIGNlcnRpZmljYXRlIGluY29ycG9yYXRlcyBieSByZWZlcmVuY2UsIGFu +ZCBpdHMgdXNlIGlzIHN0cmljdGx5IHN1YmplY3QgdG8sIHRoZSBWZXJpU2lnbiBD +ZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudCAoQ1BTKSwgYXZhaWxhYmxl +IGF0OiBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vQ1BTOyBieSBFLW1haWwgYXQg +Q1BTLXJlcXVlc3RzQHZlcmlzaWduLmNvbTsgb3IgYnkgbWFpbCBhdCBWZXJpU2ln +biwgSW5jLiwgMjU5MyBDb2FzdCBBdmUuLCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0 +MyBVU0EgVGVsLiArMSAoNDE1KSA5NjEtODgzMCBDb3B5cmlnaHQgKGMpIDE5OTYg +VmVyaVNpZ24sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIENFUlRBSU4gV0FS +UkFOVElFUyBESVNDTEFJTUVEIGFuZCBMSUFCSUxJVFkgTElNSVRFRC6gDgYMYIZI +AYb4RQEHAQEBoQ4GDGCGSAGG+EUBBwEBAjAsMCoWKGh0dHBzOi8vd3d3LnZlcmlz +aWduLmNvbS9yZXBvc2l0b3J5L0NQUyAwDQYJKoZIhvcNAQEEBQADgYEAq/arpsyo +Tf5GPrE0KqlupSKbhz6iSNk1xtuGUPL98T/ejjud1c1JqSmkR7/l70BUi2uzTy7q +WdoUaYs+7pfzeYCEezori5Ew/Z9PxF2XPf2gsgCmnSRKeiYFaqskBve2QUIKlQ0D +pkQgNhg+4ERibZmfwmP2ejmhPSlpBxa4sZIxgdowgdcCAQEwdjBiMREwDwYDVQQH +EwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNDAyBgNVBAsTK1Zl +cmlTaWduIENsYXNzIDEgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXICEFFJf2qY ++gHIW0t+SuyuYCIwCQYFKw4DAhoFADANBgkqhkiG9w0BAQEFAARAAtgPcxoY0qAX +TKNpfBPH5MH9JwgDdjNK4e8CntvLb70WnUuTxiEWGOReopn5QCerO5YPW2ion88j +xEzvtOYuMAAA +--===OpenSoft===247233737===5===-- +From - Mon Jul 29 02:26:23 1996 +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.netscape.com (8.7.5/8.7.3) with SMTP id CAA25028 for ; Mon, 29 Jul 1996 02:26:08 -0700 (PDT) +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id CAA12409 for ; Mon, 29 Jul 1996 02:24:55 -0700 +Received: from mm1 (mm1.sprynet.com [165.121.1.50]) by ns.netscape.com (8.7.3/8.7.3) with ESMTP id CAA14074 for ; Mon, 29 Jul 1996 02:24:05 -0700 (PDT) +Received: by mm1.sprynet.com id <148226-12799>; Mon, 29 Jul 1996 02:21:58 -0700 +From: The Post Office +Subject: email delivery error +Cc: The Postmaster +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; boundary="A41C7.838631588=_/mm1" +Precedence: junk +Message-Id: <96Jul29.022158-0700pdt.148226-12799+708@mm1.sprynet.com> +To: unlisted-recipients:; (no To-header on input) +Date: Mon, 29 Jul 1996 02:13:08 -0700 +X-UIDL: ee2855c88ed795f63bbcbfd279c80fab +X-Mozilla-Status: 0001 +Content-Length: 1263 + +Processing your mail message caused the following errors: + +error: err.nosuchuser: newsletter-request@imusic.com + +--A41C7.838631588=_/mm1 +Content-Type: message/delivery-status + +Reporting-MTA: dns; mm1 +Arrival-Date: Mon, 29 Jul 1996 02:12:50 -0700 + +Final-Recipient: RFC822; newsletter-request@imusic.com +Action: failed +Diagnostic-Code: X-LOCAL; 500 (err.nosuchuser) + +--A41C7.838631588=_/mm1 +Content-Type: message/rfc822 + +Received: from urchin.netscape.com ([198.95.250.59]) by mm1.sprynet.com with ESMTP id <148217-12799>; Mon, 29 Jul 1996 02:12:50 -0700 +Received: from gruntle (gruntle.mcom.com [205.217.230.10]) by urchin.netscape.com (8.7.5/8.7.3) with SMTP id CAA24688 for ; Mon, 29 Jul 1996 02:04:53 -0700 (PDT) +Sender: jwz@netscape.com +Message-ID: <31FC7EB4.41C6@netscape.com> +Date: Mon, 29 Jul 1996 02:04:52 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b6 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: newsletter-request@imusic.com +Subject: unsubscribe +References: <96Jul29.013736-0700pdt.148116-12799+675@mm1.sprynet.com> +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +unsubscribe +--A41C7.838631588=_/mm1-- + +From - Fri Sep 27 12:03:19 1996 +Return-Path: owner-mhtml@SEGATE.SUNET.SE +Received: from maleman.mcom.com (maleman.mcom.com [198.93.92.3]) by urchin.mcom.com (8.7.5/8.7.3) with SMTP id JAA29055 for ; Fri, 27 Sep 1996 09:44:42 -0700 (PDT) +Received: from ns.netscape.com (ns.netscape.com.mcom.com [198.95.251.10]) by maleman.mcom.com (8.6.9/8.6.9) with ESMTP id JAA01328; Fri, 27 Sep 1996 09:43:26 -0700 +Received: from SEGATE.SUNET.SE (segate.sunet.se [192.36.125.6]) by ns.netscape.com (8.7.3/8.7.3) with ESMTP id JAA28293; Fri, 27 Sep 1996 09:42:21 -0700 (PDT) +Received: from segate.sunet.se by SEGATE.SUNET.SE (LSMTP for OpenVMS v1.1a) with SMTP id <15.651C283F@SEGATE.SUNET.SE>; Fri, 27 Sep 1996 18:44:36 +0100 +Received: from SEGATE.SUNET.SE by SEGATE.SUNET.SE (LISTSERV release 1.8c) with + NJE id 12302 for MHTML@SEGATE.SUNET.SE; Fri, 27 Sep 1996 18:44:32 + +0200 +Received: from nugget.scr.atm.com (206.100.186.2) by SEGATE.SUNET.SE (LSMTP for + OpenVMS v1.1a) with SMTP id <10.616A9AEA@SEGATE.SUNET.SE>; Fri, 27 + Sep 1996 18:44:30 +0100 +Received: from mailman.scr.atm.com (mailman.scr.atm.com [206.100.186.54]) by + nugget.scr.atm.com (8.6.12/8.6.9) with ESMTP id JAA21526; Fri, 27 Sep + 1996 09:50:59 -0700 +From: izzy@nugget.scr.atm.com (Dr. Mark K. Joseph) +To: lewisg@Exchange.Microsoft.com +Cc: mhtml@SEGATE.SUNET.SE +Date: Fri, 27 Sep 1996 09:36:54 -0700 +MIME-Version: 1.0 +Message-ID: <19960927163654.izzy@scr.atm.com> +In-Reply-To: +Subject: RE: problem with relative urls and applets +X-Mailer: Emissary V2.03, by Attachmate Corp. +Content-Type: multipart/mixed; + boundary="=_27tW56g.bO1996u.N16d000A.r09Y.36:0008d3" +Content-Transfer-Encoding: 7bit +Sender: owner-mhtml@SEGATE.SUNET.SE +X-UIDL: 9f218600f41793d7a03f4710763907fb +X-Mozilla-Status: 0011 +Content-Length: 4879 + +--=_27tW56g.bO1996u.N16d000A.r09Y.36:0008d3 +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + +On Thu, 26 Sep 1996 18:30:27 -0700 +"Lewis Geer (Exchange)" wrote: + +>Section 7: +>New Text: +>When the sending MUA sends objects that reference each other within an +>email message, the sending MUA SHOULD attempt to use the Content-ID +>method (as defined in section 8.3). This will avoid problems the +>receiving MUA will have in parsing non-typed fields (such as PARAM +>fields in OBJECT tags) that are contained in the html. In the case +>where the email message contains MICs, it may be necessary for the +>sending MUA to use the Content-Location method (as defined in section +>8.2) in order for the receiving MUA to be able to verify the MICS, as +>well as to verify the message against its WWW counterpoint. +> + +I for one agree with this change. MICs aside the "cid:" approach +is much easier to implement (speaking from experience). + +--=_27tW56g.bO1996u.N16d000A.r09Y.36:0008d3 +Content-Type: application/vcard +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; filename="MJOSEPH.VCF" +Content-Description: The Sender's Signature + +BEGIN:VCARD +NOTE: vCard Format: Version 2.0(Spec-4/29/96) +REV:1996-09-17T21:00:23Z +N:Joseph;Mark +EmissaryA.FN:Mark K. Joseph, Ph.D. +MAILER:Emissary 2.01 +EMAIL;work;pref;internet:izzy@scr.atm.com +TEL;WORK;PREF;MSG:(408) 471 - 3016 +TEL;WORK;FAX:(408) 471 - 3010 +TEL;HOME;FAX;MSG:(408) 475 - 8805 +TZ:-0800 +ORG:Attachmate Corporation;Internet Products Group +TITLE:Software Architect +LOGO;BASE64;gif: +R0lGODlhuQAwAPcAAP///+/v7+fn597e3tbW1s7OzsbGxr29va2traWlpZycnJSUlIyMjISEhHt7 +e3Nzc2tra2NjY1paWlJSUkpKSkJCQjk5OTExMSkpKSEhIRgYGBAQEAgICOfe1oR7c2NaUjEpIe/n +3s7Gva2lnIyEe0pCOaWcjJyUhL2tjFpSQox7WntrShgQANbGnM69lMa1jO/WlJSEWta9e8ata3tr +Qq2UUqWMSpR7OYRrKTkpAKWchIR7Y+/erefWpa2ca6WUY4x7SpyEQsalSr2cQmNSIbWUOYxzKaWE +KYRrIZx7Ie+9KUo5CGtSCMaUAKV7AFpCAP/33u/nzt7WvdbOtb21nK2ljJSMc4yEa//vvXtzWnNr +UmtjSufWnL2te//nnFJKMe/WhEpCKaWUWufOe861Y8atWoRzOXNjMe/OY9a1SqWMOffOUjEpEMal +Oe/GQpR7KVpKGL2cMd61Oee9MffGMdatKa2MIc6lIe+9Ib2UGMacGO+9GMacENalEJRzCLWMCK2E +CN6tCNalAIxrAGtSAEo5AMa9nLWla9a9Y72lUvfWY3trMbWcQnNjKefGUu/OUt69SufGSpyEMda1 +Qt69QqWMMc6tOffOQta1OZyEKcalMe/GOc6tMb2cKd61KVpKEL2cIe/GKYxzGNatIbWUGN61GFJC +CK2MENatEO+9EL2UCM6lCO+9COe1CO+9AOe1AN6tAL2UALWMAJx7AJRzAHNaAN7Wtb21lK2lhP/v +rYR7UufWjM69c8a1a/fee2NaMe/Wc5yMSvfec6WUSufOY9a9Uox7McatQu/OSoRzKa2UKe/GIYxz +EOe9GN61EIRrCN61CNatAM6lAIRrAHtjACkhAP/3zu/nvdbOpbWthN7OhNbGe7WlWs69Y1JKIXNj +GL21hKWca/fnjN7Oc0I5CMbGvf//797ezsbGtbW1pefnzpSUhEpKQtbWvcbGrb29pYSEc2trWpSU +e1paSnt7Y1JSQmNjSkJCMVpaQiEhGEJCKTk5IRgYCBAQAAgIAAAAACwAAAAAuQAwAAAI/wABCBxI +sKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bN +hxH+6dyZ4WbBnTt93gQK1CDRfz+Jljx604JSmAGO6kSQtChBpiSx1qzw9OUEqf82VA16tatIrTS5 +Wn0JVudYt2XXnjU706nckwcIRm1LFcCBA0cN/BV89C8BvQ3U6qygICECu/8qpHuLFEDOfxkaDxz8 +N4DABzovFCA4QO2FvgULRMgAdIKBzQcuEB1ccMDXxYc35h0ou21l38ArCATse0JBB20jDDxaQKpn +AEQNIDgqFsAGqQRB+24MfOAAvh+B//8WD1b4dPEPBl73XZ08XKLIpVZYT12gYt/ffQtUAPxCx/w7 +OcAAUdy5d5RwBgp0W3DQuVeggWAJBKF+zaHHUW9kaYVWg3Jp+NRRFzRAX1AGijUhWArwB5R/AAiA +1X2VSUjUAAKNGGNGWHl4F1oO9NjjbhwGddlOxskIVDog1shUfUHu5N9eQElwQANUUhkXWZDBBUCF +OwHZZJEYcamTBvYRxYCRZC1HV0EHQIAdWgpUIKecKnaolFbErRXfTsIZlM6CVsE4EIyc5ZnmRawB +1RcBOdK1YQE2vrkmZVe6hRaeRPVZp34AZBnjhBpd+qGjZkUa4YZGmbWkql0ZQJQFTXL/Kiia5GV0 +nnvpbagVjDxhaOmkld64qp1rGRpZW77C5amaCWJkqn66dpUkrUjBmamoRWGbprGe/uMAs2TBOBoA +yWYF6lEZ/EXtAwaIqWWslhHVE7WbvjvsoVq52h24yhK1wV+3hkbQnHNiFDCubVG7WGACJTvetffa +eyerxYr3HHYA8PorUBkI4O4/CWSskwMVfAeRjf8eIJjKkWr8MMTufUZerhSTWLOWxrocIQB7KmVs +wvbxnIEGNzJ0lGYE1fuPixhrXMGAYNlIo8i+sajtxvi2mqnDQMcKl9JoCeeAbUUrpDRCR0XQc5qJ +AiWcdvA1Wd2WbQF5dbU3x5gzuVIV/1CvcgAcrGUAzwI+UHqa9SkUAhBU4MC4DSFAsgOoxcQABRM0 +8NxFB0x+plCghy766KSXbvrpqKeuukQBSOBjj40V4MDcEfno5egkz7u6QhfQ+E96iv+DAUVRTb2Q +t0tBftAGfSpu0QFgzkRVcwJ9Dt1otwMwQPYE5aTXc7cXTSP3r5E2nEEFeEk9Qs0hDQGbBuVGAPg/ +Za48QR4TtJsBm/slkPEYkU1BpmMdAQokKgGYXULCMpCcRCAC0wFSTspXgAxUQDa7Kd76AKAA1igA +OQ3wDlIu+L8NZKB8RtFdQTawgIyh5joGuMBXBgAaxQFGQoYDQAa+9Q/rCTAD3gNAAP9A4xnk4ch5 +1smAfxrwqcYQbYFIi8oCAmCy5RgOORMIwG7Wx5WBNIdy0NncP3ynu39ULjtlq1F1XCWQkP3DOBi4 +gHL+AbkBCcSCy2lMVAYygQT8gwPQ6VNPQJaxjfwjN2pSUvX+cQANIDFpN4rKty5Au3/0DzNX0eM/ +kAYd/4CGj/9IxwYMt0GDdPEgS1NQjAYkgAZxUFjpgc77RCajskjokiGknUWC6EVLSihxaUwKQb4i +Ib/tBylTKyUB4yXEY0roAZp5V8N8eRDkDGw5ywleT77juwlArjJVhE5jZLMApG0SAHa8SgNiiSNd +ZmADAyCAA1j0SioOD23shM6ZviOqgefIZm6UJAhyCnAB0ABSQn3a5Li8dwDD/Y6eRukTQbFpmUre +8TfpCNkrf7kcB5Bpk8/hD0Ih2sP7VYQCPYpeAwaggAvcTkRnHIgAIrBO1ISwRRnYnANyuNKffKsB +KlUPAFfjJQ18SyGXyeLAXEqaozagldaBaiCZ1z853XFzC+jLDn9y09159Xj9s8gAIPrVshYkJ2GV +yHcCQFazupUjBwDgW+dK17qWNSAAOw== + +URL:http://www.atm.com +LABEL;WORK;PARCEL;POSTAL;DOM;QUOTED-PRINTABLE:140 Du Bois Street, Suite C=0A= +Santa Cruz, CA 95060 +EMAIL;home;internet:markjoseph@dhnet.com +EmissaryA.URL:http://www.dhnet.com +END:VCARD + +--=_27tW56g.bO1996u.N16d000A.r09Y.36:0008d3-- diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 6f258a826b..fc40426875 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -182,6 +182,8 @@ + + From 60a724cf736ee713af9990101b77983909eb8afc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Oct 2018 11:00:39 -0400 Subject: [PATCH 109/741] Added more MimePart unit tests --- MimeKit/MimePart.cs | 12 --------- UnitTests/MimePartTests.cs | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 7a7617f231..a5befaff43 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -504,18 +504,6 @@ public bool VerifyContentMd5 () return md5sum == ComputeContentMd5 (); } - static bool NeedsEncoding (ContentEncoding encoding) - { - switch (encoding) { - case ContentEncoding.EightBit: - case ContentEncoding.Binary: - case ContentEncoding.Default: - return true; - default: - return false; - } - } - ///

/// Prepare the MIME entity for transport using the specified encoding constraints. /// diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index c58430b975..ad34b8cc7d 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -292,6 +292,25 @@ public void TestContentMd5 () Assert.Throws (() => part.ComputeContentMd5 ()); Assert.IsFalse (part.VerifyContentMd5 ()); + + part = new TextPart ("plain") { Text = "Hello, World.\n\nLet's check the MD5 sum of this text!\n" }; + + var md5sum = part.ComputeContentMd5 (); + + Assert.AreEqual ("8criUiOQmpfifOuOmYFtEQ==", md5sum, "ComputeContentMd5 text/*"); + + // re-encode the base64'd md5sum using a hex encoding so we can easily compare to the output of `md5sum` command-line tools + var decoded = Convert.FromBase64String (md5sum); + var encoded = new StringBuilder (); + + for (int i = 0; i < decoded.Length; i++) + encoded.Append (decoded[i].ToString ("x2")); + + Assert.AreEqual ("f1cae25223909a97e27ceb8e99816d11", encoded.ToString (), "md5sum text/*"); + + part.ContentMd5 = md5sum; + + Assert.IsTrue (part.VerifyContentMd5 (), "VerifyContentMd5"); } [Test] @@ -322,6 +341,39 @@ public void TestContentTransferEncoding () Assert.AreEqual (ContentEncoding.Default, part.ContentTransferEncoding, "Expected ContentTransferEncoding to be default again"); } + [Test] + public void TestPrepare () + { + using (var content = new MemoryStream (new byte[64], false)) { + var part = new MimePart ("application/octet-stream") { + Content = new MimeContent (content) + }; + + var encoding = part.GetBestEncoding (EncodingConstraint.SevenBit); + + Assert.AreEqual (ContentEncoding.Base64, encoding, "GetBestEncoding"); + + part.Prepare (EncodingConstraint.SevenBit); + + Assert.AreEqual (ContentEncoding.Base64, part.ContentTransferEncoding, "Prepare #1"); + + // now make sure that calling Prepare() again doesn't change anything + + part.Prepare (EncodingConstraint.SevenBit); + + Assert.AreEqual (ContentEncoding.Base64, part.ContentTransferEncoding, "Prepare #2"); + + part.ContentTransferEncoding = ContentEncoding.Binary; + part.Prepare (EncodingConstraint.None); + + Assert.AreEqual (ContentEncoding.Binary, part.ContentTransferEncoding, "Prepare #3"); + + part.Prepare (EncodingConstraint.SevenBit); + + Assert.AreEqual (ContentEncoding.Base64, part.ContentTransferEncoding, "Prepare #4"); + } + } + [Test] public void TestTranscoding () { From 60d8c30f78b137efdbd911e7888881a35f21454e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Oct 2018 11:06:54 -0400 Subject: [PATCH 110/741] Updated README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a018aae22..ecee35fede 100644 --- a/README.md +++ b/README.md @@ -1075,7 +1075,7 @@ Before opening a new issue, please search for existing issues to avoid submittin ## Documentation -API documentation can be found at [http://mimekit.net/docs](http://mimekit.net/docs). +API documentation can be found at [http://www.mimekit.net/docs](http://www.mimekit.net/docs). A copy of the xml formatted API documentation is also included in the NuGet and/or Xamarin Component package. From 0bc4890563ce05ec35a600e083f0916ca4b940f4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Oct 2018 22:53:21 -0400 Subject: [PATCH 111/741] Added more encoder/decoder filters and fixed UUEncoder --- MimeKit/Encodings/UUEncoder.cs | 16 +-- MimeKit/IO/FilteredStream.cs | 3 + UnitTests/Encodings/EncoderTests.cs | 180 ++++++++++++++-------------- 3 files changed, 100 insertions(+), 99 deletions(-) diff --git a/MimeKit/Encodings/UUEncoder.cs b/MimeKit/Encodings/UUEncoder.cs index 93dcc10064..0ac3ef3d4c 100644 --- a/MimeKit/Encodings/UUEncoder.cs +++ b/MimeKit/Encodings/UUEncoder.cs @@ -134,17 +134,17 @@ unsafe int Encode (byte* input, int length, byte[] outbuf, byte* output, byte *u byte* bufptr; byte b0, b1, b2; - if ((length + uulen) < 45) { + if ((length + nsaved + uulen) < 45) { // not enough input to write a full uuencoded line bufptr = uuptr + ((uulen / 3) * 4); } else { bufptr = outptr + 1; - + if (uulen > 0) { // copy the previous call's uubuf to output int n = (uulen / 3) * 4; - Buffer.BlockCopy (uubuf, 0, outbuf, (int) (bufptr - output), n); + Buffer.BlockCopy (uubuf, 0, outbuf, 1, n); bufptr += n; } } @@ -186,8 +186,8 @@ unsafe int Encode (byte* input, int length, byte[] outbuf, byte* output, byte *u } } - while (inptr < inend) { - while (uulen < 45 && (inptr + 3) <= inend) { + do { + while (uulen < 45 && (inptr + 2) < inend) { b0 = *inptr++; b1 = *inptr++; b2 = *inptr++; @@ -216,10 +216,12 @@ unsafe int Encode (byte* input, int length, byte[] outbuf, byte* output, byte *u } } else { // not enough input to continue... - for (nsaved = 0, saved = 0; inptr < inend; nsaved++) + while (inptr < inend) { saved = (saved << 8) | *inptr++; + nsaved++; + } } - } + } while (inptr < inend); return (int) (outptr - output); } diff --git a/MimeKit/IO/FilteredStream.cs b/MimeKit/IO/FilteredStream.cs index 9576532d61..9520acb913 100644 --- a/MimeKit/IO/FilteredStream.cs +++ b/MimeKit/IO/FilteredStream.cs @@ -522,6 +522,9 @@ public void Write (byte[] buffer, int offset, int count, CancellationToken cance foreach (var filter in filters) filtered = filter.Filter (filtered, filteredIndex, filteredLength, out filteredIndex, out filteredLength); + if (filteredLength == 0) + return; + var cancellable = Source as ICancellableStream; if (cancellable != null) { diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index d17f08de3f..4780811c9e 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -83,60 +83,13 @@ public class EncoderTests + "fo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQ==" }; - [Test] - public void TestBase64Decode () + void TestEncoder (ContentEncoding encoding, string rawFile, string encodedFile, int bufferSize) { - using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) - file.CopyTo (original, 4096); - - using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.b64")) { - using (var filtered = new FilteredStream (file)) { - filtered.Add (DecoderFilter.Create (ContentEncoding.Base64)); - filtered.CopyTo (decoded, 4096); - } - } - - var buf0 = original.GetBuffer (); - var buf1 = decoded.GetBuffer (); - int n = (int) original.Length; - - Assert.AreEqual (original.Length, decoded.Length, "Decoded length is incorrect."); - - for (int i = 0; i < n; i++) - Assert.AreEqual (buf0[i], buf1[i], "The byte at offset {0} does not match.", i); - } - } - - var decoder = new Base64Decoder (); - var output = new byte[4096]; - - Assert.AreEqual (ContentEncoding.Base64, decoder.Encoding); - - for (int i = 0; i < base64EncodedPatterns.Length; i++) { - decoder.Reset (); - var buf = Encoding.ASCII.GetBytes (base64EncodedPatterns[i]); - int n = decoder.Decode (buf, 0, buf.Length, output); - var actual = Encoding.ASCII.GetString (output, 0, n); - Assert.AreEqual (base64DecodedPatterns[i], actual, "Failed to decode base64EncodedPatterns[{0}]", i); - } - - for (int i = 0; i < base64EncodedLongPatterns.Length; i++) { - decoder.Reset (); - var buf = Encoding.ASCII.GetBytes (base64EncodedLongPatterns[i]); - int n = decoder.Decode (buf, 0, buf.Length, output); - - for (int j = 0; j < n; j++) - Assert.AreEqual (output[j], (byte) (j + i), "Failed to decode base64EncodedLongPatterns[{0}]", i); - } - } + var dataDir = Path.Combine ("..", "..", "TestData", "encoders"); + int n; - [Test] - public void TestBase64Encode () - { using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.b64")) { + using (var file = File.OpenRead (Path.Combine (dataDir, encodedFile))) { using (var filtered = new FilteredStream (original)) { filtered.Add (new Dos2UnixFilter ()); file.CopyTo (filtered, 4096); @@ -145,18 +98,32 @@ public void TestBase64Encode () } using (var encoded = new MemoryStream ()) { + if (encoding == ContentEncoding.UUEncode) { + var begin = Encoding.ASCII.GetBytes ("begin 644 photo.jpg\n"); + encoded.Write (begin, 0, begin.Length); + } + using (var filtered = new FilteredStream (encoded)) { - filtered.Add (EncoderFilter.Create (ContentEncoding.Base64)); + filtered.Add (EncoderFilter.Create (encoding)); + + using (var file = File.OpenRead (Path.Combine (dataDir, rawFile))) { + var buffer = new byte[bufferSize]; - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) - file.CopyTo (filtered, 4096); + while ((n = file.Read (buffer, 0, bufferSize)) > 0) + filtered.Write (buffer, 0, n); + } filtered.Flush (); } + if (encoding == ContentEncoding.UUEncode) { + var end = Encoding.ASCII.GetBytes ("end\n"); + encoded.Write (end, 0, end.Length); + } + var buf0 = original.GetBuffer (); var buf1 = encoded.GetBuffer (); - int n = (int) original.Length; + n = (int) original.Length; Assert.AreEqual (original.Length, encoded.Length, "Encoded length is incorrect."); @@ -166,24 +133,32 @@ public void TestBase64Encode () } } - [Test] - public void TestUUDecode () + void TestDecoder (ContentEncoding encoding, string rawFile, string encodedFile, int bufferSize) { + var dataDir = Path.Combine ("..", "..", "TestData", "encoders"); + int n; + using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) + using (var file = File.OpenRead (Path.Combine (dataDir, rawFile))) file.CopyTo (original, 4096); using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.uu")) { - using (var filtered = new FilteredStream (file)) { - filtered.Add (DecoderFilter.Create (ContentEncoding.UUEncode)); - filtered.CopyTo (decoded, 4096); + using (var filtered = new FilteredStream (decoded)) { + filtered.Add (DecoderFilter.Create (encoding)); + + using (var file = File.OpenRead (Path.Combine (dataDir, encodedFile))) { + var buffer = new byte[bufferSize]; + + while ((n = file.Read (buffer, 0, bufferSize)) > 0) + filtered.Write (buffer, 0, n); } + + filtered.Flush (); } var buf0 = original.GetBuffer (); var buf1 = decoded.GetBuffer (); - int n = (int) original.Length; + n = (int) original.Length; Assert.AreEqual (original.Length, decoded.Length, "Decoded length is incorrect."); @@ -194,44 +169,65 @@ public void TestUUDecode () } [Test] - public void TestUUEncode () + public void TestBase64DecodePatterns () { - using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.uu")) { - using (var filtered = new FilteredStream (original)) { - filtered.Add (new Dos2UnixFilter ()); - file.CopyTo (filtered, 4096); - filtered.Flush (); - } - } - - using (var encoded = new MemoryStream ()) { - var begin = Encoding.ASCII.GetBytes ("begin 644 photo.jpg\n"); - var end = Encoding.ASCII.GetBytes ("end\n"); + var decoder = new Base64Decoder (); + var output = new byte[4096]; - encoded.Write (begin, 0, begin.Length); + Assert.AreEqual (ContentEncoding.Base64, decoder.Encoding); - using (var filtered = new FilteredStream (encoded)) { - filtered.Add (EncoderFilter.Create (ContentEncoding.UUEncode)); + for (int i = 0; i < base64EncodedPatterns.Length; i++) { + decoder.Reset (); + var buf = Encoding.ASCII.GetBytes (base64EncodedPatterns[i]); + int n = decoder.Decode (buf, 0, buf.Length, output); + var actual = Encoding.ASCII.GetString (output, 0, n); + Assert.AreEqual (base64DecodedPatterns[i], actual, "Failed to decode base64EncodedPatterns[{0}]", i); + } - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) - file.CopyTo (filtered, 4096); + for (int i = 0; i < base64EncodedLongPatterns.Length; i++) { + decoder.Reset (); + var buf = Encoding.ASCII.GetBytes (base64EncodedLongPatterns[i]); + int n = decoder.Decode (buf, 0, buf.Length, output); - filtered.Flush (); - } + for (int j = 0; j < n; j++) + Assert.AreEqual (output[j], (byte) (j + i), "Failed to decode base64EncodedLongPatterns[{0}]", i); + } + } - encoded.Write (end, 0, end.Length); + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestBase64Encode (int bufferSize) + { + TestEncoder (ContentEncoding.Base64, "photo.jpg", "photo.b64", bufferSize); + } - var buf0 = original.GetBuffer (); - var buf1 = encoded.GetBuffer (); - int n = (int) original.Length; + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestBase64Decode (int bufferSize) + { + TestDecoder (ContentEncoding.Base64, "photo.jpg", "photo.b64", bufferSize); + } - Assert.AreEqual (original.Length, encoded.Length, "Encoded length is incorrect."); + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestUUEncode (int bufferSize) + { + TestEncoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu", bufferSize); + } - for (int i = 0; i < n; i++) - Assert.AreEqual (buf0[i], buf1[i], "The byte at offset {0} does not match.", i); - } - } + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestUUDecode (int bufferSize) + { + TestDecoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu", bufferSize); } static readonly string[] qpEncodedPatterns = { From cc3b08cc93747bdad2443b7ed74bd27de69f15e8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Oct 2018 07:26:59 -0400 Subject: [PATCH 112/741] Added unit tests for UUDecoder's "begin" state changes --- UnitTests/Encodings/EncoderTests.cs | 55 +- UnitTests/TestData/encoders/photo.uu-states | 2905 +++++++++++++++++++ UnitTests/UnitTests.csproj | 1 + 3 files changed, 2938 insertions(+), 23 deletions(-) create mode 100644 UnitTests/TestData/encoders/photo.uu-states diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index 4780811c9e..fecc6cb4a9 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -58,29 +58,29 @@ public class EncoderTests "This is the plain text message!" }; static readonly string[] base64EncodedLongPatterns = { - "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCU" - + "mJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0" - + "xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3Bxc" - + "nN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeY" - + "mZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6" - + "/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5O" - + "Xm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", - - "AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSY" - + "nKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE" - + "1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc" - + "3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZ" - + "mpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/" - + "AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5e" - + "bn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AA==", - - "AgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJic" - + "oKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU" - + "5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzd" - + "HV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJma" - + "m5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8D" - + "BwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5u" - + "fo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQ==" + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCU" + + "mJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0" + + "xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3Bxc" + + "nN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeY" + + "mZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6" + + "/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5O" + + "Xm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", + + "AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSY" + + "nKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE" + + "1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc" + + "3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZ" + + "mpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/" + + "AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5e" + + "bn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AA==", + + "AgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJic" + + "oKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU" + + "5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzd" + + "HV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJma" + + "m5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8D" + + "BwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5u" + + "fo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQ==" }; void TestEncoder (ContentEncoding encoding, string rawFile, string encodedFile, int bufferSize) @@ -230,6 +230,15 @@ public void TestUUDecode (int bufferSize) TestDecoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu", bufferSize); } + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestUUDecodeBeginStateChanges (int bufferSize) + { + TestDecoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu-states", bufferSize); + } + static readonly string[] qpEncodedPatterns = { "=e1=e2=E3=E4\r\n", "=e1=g2=E3=E4\r\n", diff --git a/UnitTests/TestData/encoders/photo.uu-states b/UnitTests/TestData/encoders/photo.uu-states new file mode 100644 index 0000000000..711ecb3ddc --- /dev/null +++ b/UnitTests/TestData/encoders/photo.uu-states @@ -0,0 +1,2905 @@ +x +bx +bex +begx +begix +beginx +begin 644 photo.jpg +M_]C_X``02D9)1@`!`0$`2`!(``#_X@Q824-#7U!23T9)3$4``0$```Q(3&EN +M;P(0``!M;G1R4D="(%A96B`'S@`"``D`!@`Q``!A8W-P35-&5`````!)14,@ +M0``9&5S8P`````````2D! +M\@'Z`@,"#`(4`AT")@(O`C@"00)+`E0"70)G`G$">@*$`HX"F`*B`JP"M@+! +M`LL"U0+@`NL"]0,``PL#%@,A`RT#.`-#`T\#6@-F`W(#?@.*`Y8#H@.N`[H# +MQP/3`^`#[`/Y!`8$$P0@!"T$.P1(!%4$8P1Q!'X$C`2:!*@$M@3$!-,$X03P +M!/X%#044%]@8&!A8&)P8W!D@& +M609J!GL&C`:=!J\&P`;1!N,&]0<'!QD'*P<]!T\'80=T!X8'F0>L![\'T@?E +M!_@("P@?"#((1@A:"&X(@@B6"*H(O@C2".<(^PD0"24).@E/"60)>0F/":0) +MN@G/">4)^PH1"B<*/0I4"FH*@0J8"JX*Q0K<"O,+"PLB"SD+40MI"X`+F`NP +M"\@+X0OY#!(,*@Q##%P,=0R.#*<,P`S9#/,-#0TF#4`-6@UT#8X-J0W##=X- +M^`X3#BX.20YD#G\.FPZV#M(.[@\)#R4/00]>#WH/E@^S#\\/[!`)$"800Q!A +M$'X0FQ"Y$-<0]1$3$3$13Q%M$8P1JA')$>@2!Q(F$D429!*$$J,2PQ+C$P,3 +M(Q-#$V,3@Q.D$\43Y10&%"<4211J%(L4K13.%/`5$A4T%585>!6;%;T5X!8# +M%B86219L%H\6LA;6%OH7'1=!%V47B1>N%](7]Q@;&$`891B*&*\8U1CZ&2`9 +M11EK&9$9MQG=&@0:*AI1&G<:GAK%&NP;%!L[&V,;BANR&]H<`APJ'%(<>QRC +M',P<]1T>'4<=:AZ4'KX>Z1\3'SX?:1^4'[\?ZB`5($$@ +M;""8(,0@\"$<(4@A=2&A(B>K)]PH#2@_*'$H +MHBC4*08I."EK*9TIT"H"*C4J:"J;*L\K`BLV*VDKG2O1+`4L.2QN+*(LURT, +M+4$M=BVK+>$N%BY,+H(NMR[N+R0O6B^1+\<-]1B)&9T:K1O!'-4=[1\!( +M!4A+2)%(UTD=26-)J4GP2C=*?4K$2PQ+4TN:2^),*DQR3+I-`DU*39--W$XE +M3FY.MT\`3TE/DT_=4"=0<5"[40914%&;4>92,5)\4L=3$U-?4ZI3]E1"5(]4 +MVU4H5755PE8/5EQ6J5;W5T17DE?@6"]8?5C+61I9:5FX6@=:5EJF6O5;15N5 +M6^5<-5R&7-9=)UUX7&EYL7KU?#U]A7[-@!6!78*I@_&%/8:)A]6))8IQB +M\&-#8Y=CZV1`9)1DZ64]99)EYV8]9I)FZ&<]9Y-GZ6@_:)9H[&E#:9II\6I( +M:I]J]VM/:Z=K_VQ7;*]M"&U@;;EN$FYK;L1O'F]X;]%P*W"&<.!Q.G&5&YXS'DJ>8EYYWI& +M>J5[!'MC>\)\(7R!?.%]07VA?@%^8G["?R-_A'_E@$>`J($*@6N!S8(P@I*" +M](-7@[J$'82`A..%1X6KA@Z&I+CDTV3MI0@E(J4 +M])5?EAMJ(FHI:C!J-VH^:D5J3'I3BEJ:8:IHNF_:=NI^"H +M4JC$J3>IJ:H_ +MR#W(O,DZR;G*.,JWRS;+MLPUS+7--:6YQ_GJ>@RZ+SI1NG0ZEOJ +MY>MPZ_OLANT1[9SN*.ZT[T#OS/!8\.7Q.$))30/S```````)```````````!`#A"24TG$```````"@`!```````` +M``(X0DE-`_4``````$@`+V9F``$`;&9F``8```````$`+V9F``$`H9F:``8` +M``````$`,@````$`6@````8```````$`-0````$`+0````8```````$X0DE- +M`_@``````'```/____________________________\#Z`````#_________ +M____________________`^@`````_____________________________P/H +M`````/____________________________\#Z```.$))300````````"``,X +M0DE-!`(```````@``````````#A"24T$,```````!`$!`0$X0DE-!"T````` +M``8``0```!LX0DE-!`@``````!`````!```"0````D``````.$))300>```` +M```$`````#A"24T$&@`````#10````8`````````````$I````Q@````"`!) +M`$T`1P!?`#(`-``T`#`````!``````````````````````````$````````` +M````#&```!*0``````````````````````$````````````````````````` +M$`````$```````!N=6QL`````@````9B;W5N9'-/8FIC`````0```````%)C +M=#$````$`````%1O<"!L;VYG``````````!,969T;&]N9P``````````0G1O +M;6QO;F<``!*0`````%)G:'1L;VYG```,8`````9S;&EC97-6;$QS`````4]B +M:F,````!```````%7!E96YU;0````I%4VQI8V54>7!E```` +M`$EM9R`````&8F]U;F1S3V)J8P````$```````!28W0Q````!`````!4;W`@ +M;&]N9P``````````3&5F=&QO;F<``````````$)T;VUL;VYG```2D`````!2 +M9VAT;&]N9P``#&`````#=7)L5$585`````$```````!N=6QL5$585`````$` +M``````!-'1415A4`````0``````"6AO +MD%L:6=N````!V1E9F%U;'0````) +M=F5R=$%L:6=N96YU;0````]%4VQI8V5697)T06QI9VX````'9&5F875L=``` +M``MB9T-O;&]R5'EP965N=6T````115-L:6-E0D=#;VQO)E\K.$P]-UX_-&)Y2DA;25 +MQ-3D]*6UQ=7E]59F=H:6IK;&UN;V-T=79W>'EZ>WQ]?G]Q$``@(!`@0$`P0% +M!@<'!@4U`0`"$0,A,1($05%A<2(3!3*!D12AL4(CP5+1\#,D8N%R@I)#4Q5C +M+RLX3#TW7C\T:4I(6TE<34Y/2E +MM<75Y?569G:&EJ:VQM;F]B7I[?'_]H`#`,!``(1`Q$`/P#M%1ZL +M/T`^*O*EU7^CCXIDMBN#CE4@8MM;XNE752_[46?%-"5&EKC+A*FVAFWZ(CP\ +M5)C7/<&M$N<8`\U?KZ<\L:7.8QKO;+B=VA]SFM']MR<+*'.%3!PT#PA.`KW4 +M7=,QL>2YM;:W`/>222#]%KG!8]W5L?U:\;$:E2 +MFXH9%U&*`[)>*@8`W3.O\D>Y8?5^M9^#99ANL:,JMQ;:S$`=L=,&BS*:^S;9 +M5_A*ZO?O_G;/4_1KG79SC8XNW!YDO;69>3X676;_`'?U4:4^@@M)<&N#BPP[ +M:08)`>/H_P`A['IX7-?5_JF-CX`%AVON>Y[GD@R1^C]P9_-^FT?1L:S_`$JW +M:,ZBX2RQK_A_=])"Q=*HIB%%2W`]P?,<***G_]#M%1ZK_1_FKRI=5_HWS39; +M%(<=4O\`#V?)70J;0/M-I/T6Q/G/9-"YMXD!X<026Q`['7=[ON1>IYUGJM:Q +MT-#>2>"=';?S=NY:/U>QAD`D`$LG>3P)6-]914S)VUZM(>`!VD>W_.VH9"1# +M1,! +MZNUU;W;&L]2K99L]1:F;9Z>&ZP09O+R/,,]_^<]KG+.OR:[),0_=M!^7M4>. +M:BTP9`T/+ +M>!_84X-L=*Q3LR6[B-MIV$G@.=]!Q_MJXVP-,M):X:D<$'Y*GQN2W4V"7@<[Q[;?\YWZ5O\`QB;(6+[)B:-.IB=>R*X:\BQO\KG[UI_M +MVJ/H&=LQI]*?H_U=OYRY;TR8R>H.LS@^=&'GXG;_WY +M8&W_`*A&(X_>Y_P"DL_!RC6X=FGD>!XW! +M:OKXL?1'T=T2.9_\]?G*/A/%7=?8X;?_TNT5+JO\PKJI=4_F"@=BD./W5CZN +MOM_:.;2UT5NHWO'8EGT?^K<@,8]]C:ZVE[WG:U@Y)/8)W658)M90X6Y%HVWW +M`^T-/-&/_(_TM_\`AO\`B?IQF0B+^Q?"!D:'UYKK"VMQ^B--!]/7^ +M5/TD2ZNHYE.2&CU--&.X9M0=FK9CD=4NK:[:7VN8P^!.Y[%7ZB#;13]7.J-->=9S,B/2= +M^[]%WQG^JK51#0-[F[#PYT1\/I?25^>GQ&^OZ'GS,IO$;V^J[A%;_1__T^T5 +M+J?\P5<*I=3/Z%([%0S +MUPYKV/\`W3_WY7J,+'ZA:,+*9ZE%I][/E]-L_1K9Q3%<->;K45UFH]PX:*ID&IK2SNBUDTU-KF=K8E4LP$,LASP>0X1O57):;;/?KZ8V$^4?\`?4\4:*V30MQL +M>\BQK_3W`$L?P.'>UVG[JA5::O5+FBS:UY#3W=9M;_U2U,NEE6!M!!L&QX/@ +M'FVML_VD#%P:K:[B]NUU5>YVT2"1[6;F_P!=/'X+>"SHU-K&VS2W]"\;F[C` +MVQNV.U_\X>B^GC?Z-G$_2/\`F_\`J55\XBG(.)6=PJ:T/<-8MU<__-W;'*I% +M_P"\9W>/?_SE&M+6?I^QSAZK=P#A]HK/T?I;=OYBU, +M1^0+]N*X5Y-K75TV.D!KW?0]S?H[OYO?_+7/Y%74;\ASI0\6-!@P9@^"!8Z3"E315CB*V@2/<&B`H6O +M$IH`#)=HG-")4&"R3.UP+7?']Y!<[S4F/TEQX2E&TJM8T5G=QS*SQ8SUQ7,$ +MND'D3&K?\T(N;E`M+!INT,+/<&[8<1VASB0!^ZYT?FM0C'HM)U=>G#H:RUQK +M:?6!)#YYG=X^QS%GY?4:>G8]E-!8[)>00`=VTCZ-MS]?YO\`P57[ZIW"&V-< +M22`6N&Z1/QD[EDW0#`T[P$\16G)0T&I1@^XDDDSJ3J3.LDHF\^.OB@A/M="> +MPO\`_]7L'*GU$_JY"M%VL%5,^32[L!R2D=E-+I=9LZEBM[>JUQ^#3ZCO^I57 +M*MKNRKKWQNM>YYCS*LU6#$QY0\]WZYB`:F+2!Y[ +M88@30)[`G[%V,7D@#KQ3C'_&DQRG.:QTGD1'Q62X;G0%;S,@6M:YAEKP"#\1 +M_P!]5:O0?'7[N$\:!A.I4VEQ)_DZE2V(M9:`=W!$>>O^Y-O_`)/E'_?4+53_ +M`/_6ZYQ5//LIJQWWY#ME->KB.23]%C/^$>K3I[(=N)O=[?38/8VBC]VV[Z63F_P"" +MI_0T>G^F7,=0;LN=4'!Y8?>YLAN[^1/YJ[W.NKZ']5*<:K2[)&Y\NYUU7Z?G''N`N)?03#IU+9_ +M/:NG#*-NYI!:1(*Y5U.ACMJK73LU]$46'=7_`(,GMY)QU5$UH7<=Z?YN@'=9 +MN:R![?4:R?-Q*L.O#A)4JZVWX;K)]].91#?C7DN_[XHLIX82/A7^,SX! +MQ9L8_KQ_YIXGG]0`QVFR6GY$IP\=N2K/5\9U/4[*6"?4(M8/*P>I_P!%V]1K +MQFM(8/<3](^/_F*DA,2C&0_2`E]K#E@<>2<#^A(Q_P`71&UEU@WAI:S][_R* +M)Z!_M'[!C^MM] +M5V_=Z,0[^9]+U/6W3]/T/?L_ZUZB-COTMCL]G__7WK\;+ZWD6]*P[#CX5)V= +M3S&ZN<[_`,KL7^K_`-J[/^M+H,/#Z?T;#;C8C&UMK;)'@/SGV._\^6*/3J:, +M3$:VBL58[1-;#H7?G.L>YWNO:7#W.)X[D&=\?RM +M$/&RK*RXN@,:-29,#LV^K\YK?](W](S_`(130)`_%@R:GRTJ.3T6XQ5CV-OMF +M&M=-;B/^$]3VMV_UE)Q?3^7=C!Z-)F_\ +MYRASR$L.3AZ1,KV^3UMCE=,^+BT]00Y%?VO%QHVR\D^):S@_3^FK6-[GYV(\;P\ONKYC=6XOV-"`#[9 +M#M:Z`WZ>QK/T^0_;[/T=/T_45;KGUDIQ'79N3%C,W[59 +M^?\`S'^%7G_5>I]0ZQE'(RG[G6DCR:T?X-GW[G?OJO?$;9A&A3:Z]UC(ZL:# +M:]SF-S\UO\`(W=D,!@ +M3N$2(_EM]RY>Q_Z7<-08/R81E5L1D1=.RQV%ZI;#VT +MO&M.X;27?O#;[/[*CGYK?3&/22QCHE@X^W\[9O68]SPT%S#L(T\] +M3PQJ'ZS2P'Z(B),EL@_O$'Z2<("P==%EM^OJ%K8$-<1QN,QK^=_YD]&P,BRW +MJ5-CW3#]Q`T``U/];Z:R1L(VEH)81L<_7<`3W_.;_55O$R7-K=>UNUM53CN= +M^?:X\_U/H,8Q-SQ_53`&L@8?X_I9>6/Z[&3M"0F?+'ZY?]%G@9;&=2&7I%=I +M)>2Z7,+G3MK9[?YLO^FB]2?57NP9#*Z[8,@%KB#[?'<[9[G^RS>L\?:',#;; +M`UC^:^7$?G14W;_X(]7,EK++F96[TC8T;['"7RP>D[8S_!;FUML_ZXD8@9(G +MH8\/UAZH?]+*CBXL4AUC+C_P&%P+S$N,"\`/#]X<&%C:V5T(&)E9VEN +M/2+ON[\B(&ED/2)7-4TP37!#96AI2'IR95-Z3E1C>FMC.60B/SX-"CQX.GAM +M<&UE=&$@>&UL;G,Z>#TB861O8F4Z;G,Z;65T82\B('@Z>&UP=&L](D%D;V)E +M(%A-4"!#;W)E(#4N,"UC,#8P(#8Q+C$S-#&UL;G,Z=&EF9CTB +M:'1T<#HO+VYS+F%D;V)E+F-O;2]T:69F+S$N,"\B('AM;&YS.GAM<$U-/2)H +M='1P.B\O;G,N861O8F4N8V]M+WAA<"\Q+C`O;6TO(B!X;6QN7!E+U)E&EF/2)H='1P.B\O;G,N861O8F4N8V]M+V5X:68O,2XP +M+R(@>&UL;G,Z<&AO=&]S:&]P/2)H='1P.B\O;G,N861O8F4N8V]M+W!H;W1O +M&UP.F-R +M96%T;W)T;V]L/2)-:6-R;W-O9G0@5VEN9&]W&UP.D-R96%T941A=&4] +M(C(P,3$M,#(M,3E4,34Z,C&UP34TZ26YS=&%N8V5)1#TB>&UP +M+FEI9#I",#,R0CDX-3@W,T-%,#$Q.$4W-D(R030Q0S!!-#$V-2(@>&UP34TZ +M1&]C=6UE;G1)1#TB=75I9#IF868U8F1D-2UB83-D+3$Q9&$M860S,2UD,S-D +M-S4Q.#)F,6(B('AM<$U-.D]R:6=I;F%L1&]C=6UE;G1)1#TB=75I9#IF868U +M8F1D-2UB83-D+3$Q9&$M860S,2UD,S-D-S4Q.#)F,6(B(&5X:68Z17AI9E9E +M&EF +M.D-O;&]R4W!A8V4](C$B(&5X:68Z4&EX96Q81&EM96YS:6]N/2(S,38X(B!E +M>&EF.E!I>&5L641I;65N&EF.D1A=&54:6UE +M1&EG:71I>F5D/2(R,#$Q+3`R+3$Y5#$U.C(W.C4R+3`U.C`P(B!E>&EF.D5X +M<&]S=7)E5&EM93TB,2\Q,#`B(&5X:68Z1DYU;6)E&EF.E-H=71T97)3<&5E9%9A;'5E/2(T +M,S0Q-S8O-C4U,S8B(&5X:68Z07!E&EF.D5X<&]S=7)E0FEA&EF.D9O8V%L3&5N9W1H/2(X-2\Q(B!E>&EF.D9O8V%L +M4&QA;F584F5S;VQU=&EO;CTB-#&EF.E=H:71E0F%L86YC93TB,"(@97AI9CI3 +M8V5N94-A<'1U7!E/2(P(B!E>&EF.D=04U9E"UD969A=6QT(CY# +M;W!Y3PO7=O&UP34TZ2&ES=&]R>3X-"@D)"0D\&EF +M.D-O;7!O;F5N='-#;VYF:6=U&EF.D9IEB_<9Z?3[$?7VXQC9,E)RP9*Z.DY8D,`3W/WX+ +M8;6U6G@:K&J$+*Q93G8]MQ]."&-@\DD0EMK9`;36`JI8@[\+:2#V4@&1(LJZ +M:,/@W\R%1CK]]N__`)X/I$3*%I'M$C1/>YU7BA0"FV3D9'I_6_"8W3=/2)@^ +M"%JN,%3@$-['[?OXVPDK`SM`2EG>:$2DH%!*]OO_`*?]^)C#W$H=[1%D*)I` +M3G#1D@DX(&V/;@P5SN0G4@FZSZ;0<`(\5!CT`'^6/MPV<;OG1.F@+`BR,[=H +M^BBQF%2P.X]#].`W8TD3O6^J`A2<^DZ22-@8<-CT&Q^WUX2W$'-,I_\`3P"H +M"3E]32%SX(QW!/8\.NQVD(?]-((*F;9RRI)HFKYTBH;:APU0ZYZVQLD:[&1S +M[#L-V('&ZF*))DZ)3:(TYK-M^B:-I658D4(K2%BNRJ!_0X'&+<[1/]6P""IB +MEL%%"598HW4XSM_#]_#7Z@O!693$J5AMU+&`/"4@X!/K^7&C5,IRG2<7$.4C +M!#3@IB,#<#[?]^$@N(A9+3`;HLM0N&PJ].>V"/W<8V=%HD"VL>[K*QTL05.1 +MMC&<#/?A!9OE)F^8;E_%E_#AE&1MC((_TX7U9(D+=0M-@-%Q<]*C))8#&<]_ +MZ_RXQK"3!38:-ZZA'@C\);T'^G]>O"W&_"R(\$(,8Q +MV^P]?KQA!]+T&7BNLAL^955<$[>HX?:V+)MH$RNX(&!"@;]MS]?7AEC2==RP.` +M)BZQ&#G`8889QMG;A>0082P;YB5UNG5U$#)(SD`[C.?W\8QIU*QKX&4[UCF, +MD`_7(W_APIU.]^"PD@+'?*])*GJSW(SOWR.&:C9T6"3HHZENKN/?@VD\@$!)`A8\I4J"2 +M<`9P,=]^'V`$A8&YK!+K6,9:VSJ,E^D]AG)QPY38""=$W1L+JLMLF%-=RH)4 +M%MM^"L-!,!8QH:20F['.)W7\+'&PXQ\[TTV,Q7&9!+&JG8]/MCA8M=9D,74. +M]K#D]00`G&",_7?^O?@MN)$V2)B7>RLREM2JI/0`"N>PR1OWX0^J"E]6,HRZ +MK*^4`*CI)!V)^O#+W3HL[1$Z@K+@@PV",$MN,#VXR>"RH`;3HI.&DFJ(Y6BB +MZTB`>1V(5(U[99NP^GJ?3/;C`>*TU][Z+,J$AHBT$43SU@V9YDQX8[^2,[Y[ +M>9OR`[\)/`IR`=-2HJ?Q:AB93+))V'4Q8@?3/I_#C;3=-,N9*RX$$%%5R2,( +MY9>F*).HABI.6;'ML!^?"C#0DASM-2L14=BN'";[X7.=^%L(B%C0?B63T@*2 +M#DD`X`SMGW_SX27A.]:NU%#G6Z+*&003U#.V"93C/OM^?TX=U=`*02&#,=5 +M\:-6`!!;.V<;-].$NEHLG"`1+M5Q(#%L])7&Q[[?;AT-+0F@#E7%4)Z6Z=^D +M=1([_?UXTT!UBM@B#"R0JE'RV3*2X[MZX-$'*MTG'9=N^W"W.&D) +ML/+8LL@8`SDG\OZ^O"6@"X2KQ=<2BCIP`&ZLD$?3U_E[<:>#J=5C1)NOG2W2 +M,DDG/?OQLW,+67AHNLA59R05&<#[<;9(%UL@[ED=((;N(^^WL,[<8"+@;UN( +M$A8CDLP/X<$XP-L>_"F#LP=5F1VJQV``&"6`&5R-C]?X\)`O;_]?Y\$L;!)&A3>8:%`6KD!MM2`I/E]/;@ABVPS'7D:I#1!A2T:@LH(!ZA@D#&?OPG*8, +M)4APANY9$<910!A<>GM_KQA@&R6VS;+NP"?+^7WXP"T2F2W4[U_"-6.3AAG. +M0,C']8XS6R46#ZJ0M]LJ[A6T=!;X?'KJEUAAC!QU.VP!/H-\Y]`">-M@V&JP +M$S*+S):H+L*6DZ*VP6I&F3J7`N-0H`\5A[/)CI![1@#U.5AP#LPW)N[6QN]W +M][D._)BHCEN=YKI$\5V<>7KGJ6[L0-@!G.6)Q[9XVQM^U9:;/&ZQ::BBJZWP +M8C+\JO4[-(`K",;D''KV`QZXXV&M+K:%;=FB7+A6PR?,R32+X1R`$!SX8/8' +M\L#C1:)@+3P`VRQF0Q.(V*(V>Q[C;UXVYH#3F2G-RB)U7\8W+"-XFZSY0`,Y +M/L!_EQC#>0M%A'9XK.9ODU-*"IJ6&)6&X3W4?Y_NX<>Z-4XUQ!/+1?R#J#A2 +M6'8MVS]N$D'+)20\DB39]Z5>L>;?*70TD`&(;AGTRUSH_S(D1Q[0/(BZSN6O,'2?-71EEUSHJO:XZ>N +M$1:)G7IDC93AHW3]EU(P1]B-B.*Z]F0EIU4\*A<,T(W?UZ2#VQG?;VS[<-OC +M,`4\QNL\%_`_M#.>QP-^$6U-DFXMO7'H\Q0!P3V`.=M\\;RR4IKRNSH(!=F& +MY]OQ?]^%!G%-.=:RQI%(+E2!G;OPIO`)(-Y*Q9!YF9L9+8V&#]QPAA!=*4^I +M`"Z'8D=!`&=L_P"N>%@!9$0L&0E\87,?<^G3OWX3.8V2LT:J-<1ELGH?._;M +MPBH8,0MEKM%Z/.HD9(Z3ZG/<\&0F3R76!N5+$GC12&L,25\SLV"RX.`WO^[C +M24.Y?#DY)SU?4?OXVM"=0@O5BG]'RXSG!SOPQ7T(.BK; +M)XI>,$U)*E:#!$I3MU#&[=\#8>__`(X9+K63FMQ9=:G;YX=F4E@LJAG)OH!8 +MMEMAGZ^W[^"Z4`I%40>'>F[0M^J##+.2`-CM[_S_`(<(>TZ+;F3*(8NDJ%VR +M!MMMC'MPG?98)N%VA]PV67;N?7WX46$!+<>S`7)<'!92QQD#';C;8U":=`,3 +MJNY3@DY8COCW_+C(DI6*].BEC34Z@GSJ/,6)&R^F!W/9M +MK9<`M%W9`*&*V6HJJN:2KIY$G4]+((^AH@-@"O[)&`,'Z<;<"3.D+5G.DE.; +M1_+2_5%HDN5#2P_I"7"&:L(2"G38](._5(<_A`)&!Q*83`57CL"_R_="U,0U +MHE_OWO6#J#EKJ+0EFNEUN\='/2R1QE:F*3QD\1I1TJ6&RN`3Y3@\:K8!]%LO +MU]^X2FUVN,-2EHJ2HN=7#14*223N<`[G"^K,0-E'GGD-)`&NBD +M)VIJ;QZ2TQU-7,K%?FRN#CU1!Z9WW[^G"@1HS19F=$%1CT59120K4T=53EP& +M7Q(R@/VZOIQCW$6>"LIL;.<&RYQ2Q`ANQ4 +M=B"%*ID`9W4<.3+K>298!E(<4172S?[*:>MFL-?7&WZ#TG7$F@JKB>E[DHV9 +MZ2D4F>H7TZT7HSMUYXDL-LJK48*E3LLXGZ#4^"`_6L+BVF"XC6UI[]#&^)C? +M"J]S-^-WE%RM\6#0G+>IY@W>(-FMU:O7"VV.J.T4[J,`G(\:9CVRO<<2LX6@ +M8:SK#Q=8>#1]2FF4:U02YT#@-3WD&WF5K)YU?&9\8O.ZOM5ITYID26QF$%!1 +MU-%X%*?;P**(0TZG_$W4?<\1V+Z64"":M0$-W`V'@VWI*(;L)Y\#U@H\;.ZIW5XA\>ORL@FX\\]#PS2!]1)=4#3P"/_4;,%FL,\25FRXZXMU)=*)UN%O>_UUM4,&H"AL!2)823K]/W6Q2&L$JMTPO*W<]+#(_+/T/$8QX)NB:K2#W+O\6( +M@]3R4['.`XZ?;W]._"V1JM5+&PU4BZ952`2>GOZ'ATNWE-!QWKH()P2<8[=Q +M^7\N-03J$LB`NDAU!+'<'?`V^W&I@V2"6DPL20##9++L`,]]_;WXT&E+;K$+ +M#90>DYSO@9]!PJ9`/!8#N*CW(0Y\PP=CCU]N,`U@+8$B5'S@,5+!&[_BVQQN +M"=4EC@)&J]'#9Q@`+Z;#@EJ:M-EUGI7\1R3WXTM@G]">JA_\`392:@Q>)0"H/7@\ +M4G&GMZJ2INBQU*4.3@* +M2^.2!V\Q[9[Y^O!C&P2FGU'1>P01JQP+=5C<84[8W[;<.M8LIDET%5%GR+\/ +M-U,7QG'?^O\`7A>'%H6GM)>2[1-JW_A['/\`+M_KP_59"S(PM-M%.*-AU#`V +MSZ9VVX9TT6VU-_-9$88J,](^P(R??^&,\;+B"M/C-80LA<^3I+*3W]Q],\;` +M3)-YU`^JS[?;;A=*NFH;;2O4U\TJPPJO[E$$21JQ2/J<;*5`&0`/KP^VF]X(-@G'Y28M*?? +M(7EXFNTO.L>8=RM];H^RF*.KK'IY&JA*".F%78*9G)*`1^89*Y(X/P5`N.>H +MZ0.5QR0CZ[0V-/?OO5NK%?+!9]26KY:WPV::,SBW6P2K.[1*.J3IR`S2@;G? +M0I#!T`6AV\JG$IH=/Z;N:6Z7`F?Y:6=@6KK*PQTC!(*!V;JBCI2R)`H_9QG/4<^^= +MO?AIX$!P$)>H5(:0^2#"8K`N@L%Y5)^>GQ?\`*GD'6I:+M/-KR\"58_E[5(A\1B,KTMN7 +M)ROE0$@M@X/#XP1^)^GS_;WJM-Q#08&ORMZQ_E4LU!S_`.?6L]67#6VNKC=^ +M4UBAA2"AY7Z9DS)&IV66[5[9=7D(R8EQC.#@;<'5*%-EWC+;0?6??$9C,6T/JTL@_N(GR$PFJQHT'96OS?[9 +M`\"8)\@JVZMYRFK\:..*%G<`%9JGYF5-SLV,C/TZC[<3V'V0R$*+KXMSF +MS\[H!T_2:BU[47)-/4-(U)1QBHN-7+)#345JA)P):RID*0T\9]&D9>KLN3@< +M'5:E&@T&H==!J2>0U/@A*=*I4^'0:\DQ(*#E9I2CM]YK^8>OY[691!4ZGTKH +MF&KHX)@$9HZ"6Z5E#\VZ++&[/'$`H>,AV619"/7H8^M3-6G2&22`'.(DC<MC,;A<)UM2@'U!,,IG0#FZ)/ +MYPGQ@=\KTO\F^8E@I.6^E-.6L1Z1KK#"^FJZTSUGBI; +M*^BD:EJ81(%`=/%A=U?]M75O4\`5,0*H;7!D5`'#N=<'Z'@5(MPX:[JC`+)! +M\-?/Y)XQ:EJ:FE-41;JJ(>43TTX?'TSV_(\))?-E@:`.*[*34PJ'%/)=%=3W +M^8\J'Z;?Y\*;4)\4FI2.NB***LZG4B40`GO"W5&1[EO3'UX-I@N$`W3-2FUJ +MFA)`19<):ZIIL"MHR8LXZT/4-^'02-5LL +M`-ES2HCF(".?$Q^'&,=O0^O&A$F%CA-UP=3UMTG,8T+3AV8*P)`6 +M)92N,Y'U^XX2)DI`=)NHR55#8)"^VV<\-A@_F1`((W+T<9R"1CZ;\2(T0A)/ +MPKA^R,W^G#-;0I^G&:%K9YID_I65<,1U$A?KGBBXUI:XR%(T!V04GG8 +M#`.,$9V)X;#1JG7FZ_E(*DDAF(QD;AOOP;1,F(LFS$P5R;\+;JR_OWX*=JDD +M@]E`6K&S050*X'0<$9VX>:+:I((+I51W4&_1@H&;J]_Q??ARD+P$VYTDY4WK +M +M>=8I:"@$1:6(.3^JJ)3T)U$`JC%,@NQ!U +M*B\-!TGP$?24.^HTD3?[7GS_`&5AN37+OEFE!;Z_F'/J""_554(*:JBJ`[6] +MFE3PBU73YBZLQJ`3E0K=/FWXE=E80L875R"XG=-N%[^^*'Q-0.=+1'O]DU;Q +M2\D=+VMM++H:B%I56II*B!WZ\^-EA(JL!(JNRG)'6"2WS4T3]4J>(>F102.EL*P<,"04/J.$N:P&8[DIU)Q$3S6LOXL/CEU1KC +M351;-#:CO&G=/M62VWP+6"+A?ZEBN(*?IRZC+8+=\$`98@<_-:X6745)H/_P!1>=5M5:6FIUIUJ*72-++) +MXGRT1D81/,C%O$J966*-F*!V*DL93>^K)I1#+2=./W0->O2PX'6_$[0`28X` +M;[ZGX0=^];!OBLY"?"M_96Z&K;K\5'/BFKOBBOUNEJK#RPT!14M[O]0[JQAJ +M*^OKXVI:&F\7HZY6IFZL.(?&88,8>C[:@+\14<9W`Y1]SWV'BHK%=)L8YYP^ +MSZ;0]MCF&;+(L7GX08_D;G>09$#M#RSS=@8'!B,/2:V=\7/,DW/B59JN*K5?C> +M7'WH-`JPU5#JRXO;Z)+9[M?ZZ%V\'3]LKXJ6=PI(Q6U[%HZ4GU@IU +MGJ?V3X!\W`K\56J$-HB`=Y$^0U/"3#=\.">918VYP+0+:"+>6_P`5'5BZ]J].5MKCUI<+C0SUTMUJ +M*%Y#X3ULB!))R&R!(RJJE@!D*H.RK@FGM(L:*+1#!H-P[O();\$22\F7'S*P +MK7/7SW6SV#4K4LJ45&6=J10:F2G#Y,8R5261%ZRH8@!=NK`V+96-1ARBXTGZ +MH<,#'0_0K=]=[_I'X;ZCX>+O\-W.#6G-7X<.9NCYKO:FU52T44^G]04=0T5T +MMDL5,%CCE4R12/%C(\96ZI.OQ#S7![6QV+9B*6-8&XC#$6;,&FZ2T@'Q@C7E +M=6RGA,-2?2-`G)6&IU#P=_>-4>6GXG;;#+)-?++6T%9$=Y*)_!!&WF4=B-^Q +MSZ<`,QIS!SQKP]%+.V>RY;:%8'3/Q86&J@IJ:WQ4UV@SAQ5HJ3@>HZEV)]-^ +M",#LP1T +M*].?5?<\/9!>$P2X0'+G%,T?4KCQ8NP?&X^AXQARP!"2P&>G(4C;OGC56F2;"4IHXA>C08'F!/UX.30<-0NI@,8;)'\>, +M/)9>+KYNOL/MP@B5L/!7T[``@]O3T'&1"0"/BW(0U1*/D)\8.![?EPSB&RTP +MG:9$R-ZUM\U<"Z39Z0W5]OOQ2<:27J3I"P!29OK_#@EQFTIAK8N>"!M4Y-#4CI.2#PZUL +M+?69CE"J/+'TWQ65L98`C.W?_MP_3UNF)N93G!SW/KGWSP]4;R2 +MBP3R4ZC#&X`)SL?7VX;B"G&-F^J,^B&@M&IGI&3P9S;XHRVY*,[RL/KYH%__ +M`%X=$0X`ZI`)>01K?WZHGY96VGDN=-7U*]=8]4E'1;9,#!#++.,[=21H%4G( +M#2AOV>',.QI,DQ]MZ8J5'$1[]Q\UL"Y6VZZ7G1E'J>&]Z?6DCCCK`\CPU`6! +M?UZD*DCCNTTT0DBGZ>TIHRV +M7'2^G[19K%/201*M-*B+#=8Y),%QT?B.'++(O;().W$NYS:8.0"1NXCDD4VE +MQ[7A\U335VI:&+4222F?PHJYX6%3TR!JM%,D;2,I'3UK&PSME5R>.?8O:XHX +MDTMSS:3OW7W7CS5LP^SG5*0=O;KW#]I[X5?^?>N8X].WZMH+PE17I`9X)_F, +M9J8V4S)+A3TL`4(;T*$#!&>)##;4;4>ZE-S<>/LH<[/=&>+:%:_^97/Z^&:\ +M5AJY*NFJ[4E%)TNR=1%;D@,VX?PWD"_])P!PY6VG):PF3'RW^B<9@FY[K2W"IJII:B"0M(X'3 +MXGB,3T'Z=1?MMOMWX52Q,NF4U5HEC2T6/U3;_L]>6MW^([^T1^&KX>K/7V:B +MJ[WJ<6AJFYJ7CMJ&&66HJ$0$%V1(I.A`5+R=`)4'(L.$H=8W+QW\E4MMX]^' +M::NK@0T`\7.#1)%P),G?:UU[2O[37^TFY*_V+G)0_!7\!MKTQ6?%#/0T]1J" +M\W#PJAM)0S1LL5PN.,"HN,BKU04W3X<*!69%0Q1RRC6"FULB!N'U/'Z]RJ5" +ME4Q56I2I//\`_)4L"2/_`(V;FP#>+4P8`+W$CP#:ZYZZVUQKZ\)PHZI;`X+!X-H>\=8X;^D=ZJ3J6[UVK[W4WZ\6^P6IFCCACI+5114M+#&BA53IB51L/IN=R3P/B +MMH.J.)"AV]<#Z\"OIWA%,J_U'18.L+8I,.IK&[)>[>5ERHVF08)!'N-_ +MH1D9/#V!KFF[*[>LQ=)K@7#4(TL?-B]V'0Z::L]%!>-*S7ZEU?;:.8MBV72* +M,P5"PGT6HIV-/*O9Q'`WXHUX.?@*?ZIF-`[306GFTP8/<;CA)W%1[<0[JC0& +MA(/<1O\`NK@>!=J,0W#2U-P>W +M'-ND>SV8;%NHND#5IXM-VSSBQYJ];'Q#ZV&%1M]Q'`C7WP44E0#+&UNJ1%4I +MAGC8E)(B=\.OOL1G]V>(\503+AXHV+RPHXM&N+Q;_!DK+G70M'M3U!9NJ(^@ +MZNX/T.W#6(9V1DN$L92;IV:5^)+4VGY8#6U]16QL06-27:%O8C-GBJU/5#*#^SU#N.V0<'Z\2 +MV%VBRI!^$J,Q6"-,RT2%:?3VOX*ZD@$U?`\/X'GA)90W^)-B,XV/$U1JR,P. +MJCZM$M`(W)J03530BHM]TCK$._X_OG\_7AM[^<)MS6F%Z/0<@'&3C;;B +M0-D@VN-%Q)!/H/ICC:5!E<,#`V./;UXT>";@:KB[;>48;Z\:(XIS?"#=4X^1 +MJ`"#MO@XX8JGLDE+HD$W6N'FHG_U&7<%>K8>_%*QOQE'4'&TE)B3?U8+Z;>O +ML.$@F$\7`&-Z[%`"G`/K@9.!]^"*,)MQ`[6JY$>4DCN#OZ?]^#*;P2;)ISAF +MD(&U,0:.K`#=C]^'&@`))<#,A50J7Z;RK9SYCL?IZ?OQP[0B0$AHEUMR:=$/ +M(),D]O4[9X<#DXT'-(NIV,G9"5R!@GT_\<(FTE)IO=EDFZ+J*F>NM%):_FZ2 +MF\:6:M>:4L$C2).@=14$X):;``))].'J;9?9*>[*"1[LGSIG1%^TW9='U\FG +M36"XI>K=3W*)Q44T%7+T0J5>/*@JCJW4<#]8`-U(X)9AW9`2+7""?4DC+K?[ +M*S6A]2Z:ET38=.5]PT]IAK,K6RS5;665:CP,R">+QH9`THSNS,I$@D*,`0K" +M;P59AI#,X`BP,:\IWIJO0FI#1(X>?W]5F<^ZR"@TQIFFLDE'1SRTX--4Q3]2 +M"H5NL]+,QZ%=3YUWP)`?V3D#:6,%%@>1V1:WJI;`4#5):==??O!$Q"EOT3?TYI&^4^AE +MOH86LOF-J"]7C3D-((Z=*VVU$D<]'(V"K*\2%2"/*@96._\`>)SCBU[3VS_Q +M%)P%G#P@@G]E%X79;33=3-B#^RZ.?ESFMWPS_!7052T7VM64C$,CQO +M'4R*G]_;Q%P=SU>QXH>Q<3UFVMHOGL-+!X&WA=2V,IAF#P\_$9/E=:Q*B.X/ +M::F=P7J:"XQ4[$=Y,%D!'^$H%';T^O'4\7C:;B`#\053I4'@&=04.7*W(HNL +M>6,/@J\:G=3@]0QZ=\XX9PF,APC64O$8:`8X*:^&2MH.7O./2?Q-67XTN2?P +MJ.I;/?E:' +M`@1[TX+G.TJ#:H+*H)$^,@R(/(B1S3`YR8M[J +M)+ER5]=14VDN4\67B%Q2HFNM]EC/HUVJ,-"I +M78K1QTBD$Y!SPPQPR@F_OWO3M1IDI)WZ_:GUU=Y]0ZJO-==+E.`LTI<%F7T7 +M.,*H[!0,``>W&JF+DY4XRD#W+NIK<4C5:5(XBP_:7J#?<]Q^_@)[R;NNB:=A +M9)SX@FH2Q^QX9=(-DL,F25\AEK++(D=Q=9:3=8JC!*X[=+COC +M?\OJ#LA[0XV2Z;N*@WHDM59-0QH8[36,:BD.?_MZA1ED&?0CS#W&/;B5P6(S +M`L<;H3'4Y+QRONE`*=JNNT?(M8G@R%:H62MJ.AC$P_9I:^105 +M(("7)>V.(GI3LO\`5X`5F_\`,HF#P+''?R#O_9'[`Q[:6(ZEP[-22/\` +M(OX%%PCT[J-#3U,\%/<3U>'60]*,5SN9%'?!QG`V]1Z\R3?C]TA +M^4&6^2SZ:[BD19;)T5%(Y'73'/2">X`[(WIMMPZTD]FH((WINHQK>TW>FKH3 +MGA?-/S>'17JXI"/+\O4D^0?W#GL/;B696J,:"#8(:M28ZSN]6WTE\55XIZJ* +M*N+)3X`!.[J/;ZC[_EP33VBZ9*CG;-DR=%;S2'.NS:CFHUM=[B2YSKY::IP/ +M%([@-V(_C].):CBA4AP,$J.K8?*2"$YZ&Y0S0++4P/UGNJ'9#ZC'!3F&=)0D +MVT7IS[8()S]#Q,$[E'.$FR^'.=]OKQM.--EUEMLY).,XSG/&H6G$ZKH9MCG; +MT(XR%@?.B$M3$M0SEF!\IX'K"`83E-PF"M='-8!;E*6.'+#TXI6/;VB5(T0` +M2"DJS9\A(4D[8'#3&MW)<'4K^3ISTX(V]NWMP=2I``733G1,+[D8"CK`QW'; +M^N_!30;E(=*EDP`/-G`]]AM_7 +M?A`,ZI#;]G@C/Y6BII$>2KN;3BD586IHU"13;'HE).6_YF0-\E1N,\+;E`DZ +M^_HFY+G"$VK/J98!R\KK97GI2B2BKZ2!BOC=%2SKC!'G4NN,=PS#<;$NB0`` +M!(C3N.[F$@M,S,$?<^RGGI"PFIU3:&K[2-CX2KX3L[ +M1C(8A>D*^>HG@S"85D@:$<_(I/6/#;7!]^:`.>&K*>_66DKJ&WBT)4!8/T:( +M2HIHT1R8D(_"Q0N5Q]`,9XJ&WL:V],F`X0?(P?D"KALC#$00+M@RM>UX-OU/ +MH:2Y4DE-67&SWF@K_&.`RD=223))G)22-*?KZMLJQ]N.2/QL8ECA_,US#Z$3 +MW%70T(8X>,\I'TE"W.ZECU/HWF(-.VZ=]1W.SUZ1O*PRMT"PUR'PF_8,D:RC +M/=JMS].*]A:[<+BJ37N[--P/A.0_^+H[FA'5*+GTGQJ0>_B/4+7QKZ6@U5-8 +MKS%T&WWAFJ)(U/4:FJB5EDA78YZN@L=^S_0#BVUZP;1ZL_\`Q2.8:3(/A/HH +MRE_S;F[@#XC4+N^,^AJ:'E'\.<=!-%25NG+1\@51E44M341TWBR,V<`GP)U^ +MNX4<4K\.\6U^T,6#I4>3ON&S;U"E.DM!S<-2+;0WYQZ*D%TTE1UE]O5/3TE3 +M1T$M&U32O">LATJB&A`8@LX#X!VV!^AXO-+:#FTVYM0Z#W%MBH@X4%]ANMYI +M;7NVI_L\]?36ZIZFH)9?$,_21TN&7]6%&`/$5/?S0] +M:BYM(O-[3ZJM7,#05O;6%ZLU-;5I7EJ34+XE5,89'\V,$?A\V4S_`#VXOVP] +MM._2-J$R`.4^XNJ5M'9`_4%IWZAYY[[,M+86LDK2LT,!J9)@Q!)PK +M/DG/3L=QQ8*6U&BG=T\=RB7;-<'1$%15UH/!EZGMTHD4E0I?#`#&,'_VD#'T +M/#],@[T-6I.#M%C4]10.V?DI(Y`0"HE\I/L01Z\.&R1:41VVNM,AD@26LM\H +M4]2MTN!]U.-L^NW"7!VI2VEL"A9J::#!P,$K)^1VS]FX07%/MI@@7 +MG5=#6>)95D@(HF[?B/23]"1]N-AQ212S`$+/1JFA!BJ8T\%O,V!E&^K+V'W' +M[^-&Z4QI%RI2BE18I(Q$*F#`S3L,MN-RF?Q8&/+^[AIU.\I=-V8EI416V6EJ +M;=/2,#V\:CJ8SYJ68;KE3W0G((&XS^]%*JYKA4!TU]\4X[#A[.A[U977.E[WR\U[J30.L6@GU +M%9+M-:WKZ9^B*NDB9)5(V/'+=I[*J8:N_"U/B88/W[CN71 +M-GX]E>FVNT]EPD>/VWJ*I]8OTT]!=(H:JF;J3#*?#ZR=E9?8@@C!QGM@[<0Q +MV>TDEI@J09B2!#A(6-42B*!ZNRQR"%';KMZY,E.?7P<]P,9Z#O\`3A-.FX'+ +M4\_NMN-B&^7V0M+>U!_25FKHZ2J51U@YZ)#Z]0].^#GUWXD&4)^*Z'JU!_*8 +M4H;A0W6;$(G6Q5D('H1]L@ +MCU'`].0V_$I1QI:( +M?=1]7"M%VE>ZHEL;#S9QQ=`)52FT!<,DG)SN?3C'4Y)&>W8[?;UX-I7[02,@W+D^WK^[C,MY6!@(C2%4JL)%Z!_!YM +M_P#7@BG!,)L@!T!.334(JH+I3'`5J*60=1`"-&!(._\`[2/S'#U5F_@MET'D +MIRR6NNNEQBHJ;$Z#]8[,0HAA7!=W8G"HJY)8]OJ2`6FM).6-4NGET"J:\1H?.-F6E-;I-)3Z-H:RWM;BYM=6[M(\5/2CI=G +M\PZC)*TB!0,$)OMP_P!7E<'4[`;^7#Q3U,S9Y\%6+F!;HM+O<;!5V]++;Y1/ +M0&1Y)T)G21#(K%8^F:0%%(Z<8W)..==,:)%,$:$GQX*Y["J#.3Z<%K?CN +MTMNYB7G3-SI&2SW2BK87A@B)*/&W6`NXZO.82K#&RCU;''%]H57FDZ#<.&_6 +M;?=7]I#B`1J-_`:^A2H_VL-KU_I"VU/C^-5P4B9\4F.6:"I$3]LY#4\P4;Y` +M"COC`6+H&OAZCANGU%K\B)GQ6L,`VKV>[3WN5"[)%-9M5_%QQ=45L+1Q+;];3@]\2.^\CR4/08&5W4@ +M-':\%8KXV;":ZAU!:IX(88$AL]UIS&<2/$;A/2@G`W\@&<;Y<9[\.K(_E;?QA5%T-9(1-71R3M2U,D,YHICEWA#*DIRIW` +MS%$V>Q.!MU'B];6JDY3ND9AQU'U*B,*0&'-X>4H9UQHH4VFZ^Z(JUC_HJXPQ +M]",O1.DJ^0H!M^$KC)P5'!>#Q?\`&#!;M-/A";J@=40>#AXV20UIHVMK*^SU +M-)%&M8)G%,V.J65\B0'([KOV.WWWXL6QL9D:YCM(OPX%1>TDDC52Z>8`Q3$[@=0"J3N3TCT/$JZODJ9FGLG7RU'S\T`V +MF',(.HT\]$%R@Y!&1C<;[\36Q]H5 +M`P4W.TM/$;BHW:6$9FS-$3NYJLNIM)26J85B4[FB=B%!!#P-C(23;L=\'<'W +MXN>&Q>>WLJM8G#EEP%TV>PVVZXI!65MDO*,LU-4.N50[?M+GJ3&6S[#U[<+Q +M%=S+Q(WIRAALYR[QHB6":JL4[6N_4%-!<0Y1TBC*_,]/_,08Z77_`!*1OD?0 +M93J![<[#(/HL<#3=_$U1-0QP3(\T82I@7RN$7J\,Y[,O=?IG8_7A!<0X`ZIY +M@DRU9PM%/64Y-,T+JJEFC4'$9)SG(&5]MP1]1QMU;*Z#HL-#,"T(?J+:4PD8 +MD\K=6,8/;NO?V],@^W#S:LZIBI3RNM8K%HZFHCD\&1_/VZW&%;_#*/0_XAMP +MBI2%R$NE6)$'5"&H:`6R]QO)$M-!6'K>-P&$2G*3G+(*UT;JMIBIAG6`[3>YTS'HE\6-Z854%?`WA&)BHXSM_+BF8\PY232/B2*D8'U##TQOCA +MFB"XPG#!NOJD=)8@,1@=^_!=-UX.]-%A('%=JCI5L`Y/^?!;1S3-T(ZE0BBJ +M"=U"X[=A]3PI/4F@JG5RD5;ZHR`>O!W^O#V'^)-.B)!E.73]-+<@4A487H#- +MTENC)"@`#=F)PJH-V)P/<.U(&MPE$`WXIKW&IHM/PQVFFI8:NCCE9ZF-\.+G +M5*2I$A7_`(E-"V4"@],D@DQMY@G,6N#1[_PL80()$;OW\5:WX<;+6U5]@N6H +M)HZNRT5)7U];+35:>+/45`D:6-)(\XG^7M_RZD`>$KN5QMP;AF]OE]TP\DG, +M.,>:O=R6L4-F%EHJA[/-J"GLW6^DAI(TD8(ADA4@E0`25,I8DGOT#& +M>_$D)>#`LFVC+$ZE:PN>E%`+K?:BW4UOI[/3R"ID?YB*M.JPBT&#S':"MVS"1489X>6A6F:ON+VO65+77-DC-LNAHIJ +M@#KJ!"Z,D,P#$GI!D>-O5@0",])'F_:M-SW/:W5P!'"1$^DGV5U=DY6@7@[_ +M`"5?.8:34=RA6DZQ7VZ[+66RIHY%*P1APZ'8;+FD<=&Q`900#MPO9]-SJ?:% +MB(,]W[_-,XD`6Y_+W]D@NTNRQQ'H`LZ^ZYME1:KI;JGY4U+V^N9>C)C7QJA)'EQ^T +M%`9=_5QM@<*P^S7"N'[LPGP!`'J/`)+L6,ION.O'>AW7--3&ZZ9KZBK19?GZ +MJHEE(Z6&PP3P=L@.AP`W#3D?'P^<$,W^G#ZJ"KU^K<+[U'ZDO +ML%52+(BP^(J)(XD0XD.RMMD^4(R!C]F].%8?"EK\N[V4JJX9>1`VZN1G##;;<'V..),/#[(!S2T:IL4]RLUXCC>Z/)2U'2&CJJ9`DL)(_ +MYBJ0&7/J#@[W5]B-F_EOQ(T*X<(= +M91^(HAI!U4==*5;[8:NC5%FJ8U\2D88'ANNXZ1^SG\)3U!.">'VMR5`]OBFW +MQ4HEO^;)[?!W60\Q+_K'X?KB]0?_`%%L36^QH'"B/6%OZZJROC^_,PJ[;G__ +M`&9^W%JPU`8BE4P?_P#4'9_WMNWSNWQ59%44*K<0=&F'?[76/D8/@4$TG$4V[Q>R,.__L;ML5.-N,;4#A/\P2JE`M=!^$^BZ+A8WND, +M=?2Y6[F/>,[I6(OI[B0#!![^A]^-TL1$3I\ENI1FPU^8^Z&S33"5:N,S4M7D +MJW5^*3T*.O;J'][U_F6(=S"$;2#2$1TE3%XX;:#:\)]]P)"^0]6P!!P>W!C0&E(>03!6=&/+D#W&_KZ_Y<$-@I`<" +MWN0KJ8@T-5A1^$]CV^O"VLLF6DW(5*;U(L5^=^D``=>PWVWQ]SCAVCQ)2B!- +MN"MM;[1'I:&-ZR5XOE*>.13&0':26($U*^TLA:2&GS^&.*2?&%7K*Q;,ARCW +MS26/:X"=/=OOS0ZCO<*OQI$BB7``CB!5(8E&%C0?W0`%`W_,DG@1T+'..BN? +MR3O])67;2]FMOZ1IZJEIVN+1NS#KHTI:M3(W2=RS5#R=&"!&(N^&/!-,C-D& +MG[+;?ZCN]_);>.3V@HZJ@H8+;0SR^-9:.FCDEFZHX*:.F#[8]"$B.VYQWWXF +ML-3+B,J'+VR3Q\M58'F116[0>CYK=13+/7_)1(9NH81OQ&W/W99@QGJ-=N^RT[\];K:[;8JBLN$E3)45D-N.-I?$;I4`E +M&@SD$\4/'8]M-A#M7$C[>BN.#P;W/ENX!:#^;ETGLW,62^4CBJM5T +M:1D2%L9B\-.I02#TG)+C(SE5/'$MI85KKO.GL?-=2P=2&B09C]OHE!?YJ<\Q +MVHVJNBRW63PUJ"1&&%2LL43D[A6)F7K)'[6Y]>!-FR +M!V*[2+?U4S]@?90E(9J8C5AGS&[T\D3?&Q)3U>H>534:?)VBILDR+%$X946% +MGIV3KQYE6!-R/[H.`,\5[\-&.;1KDB2"/,P0?./-'])`8& +ME.NHDIS'+4/<5D[>(9#&3C_$>L@_<@X&W9S1#\+4,<`/"_\`E4MM7+59YE1V +MH-335%LNP:#%2HKHX^E1Y/\`A;`;%@.ECGU)X=PV'`>V-#E2*U4@.+A>_OP4 +M_KS6M9+I2WW>@K615HK?)$Y4-%32RHZ?@/<,R,-NV#Z<*V-LQC:SVN&\CZ_5 +M![0KDT@0=P]0@:XWJDOM)351A%+3U+]:@ME:28F,/&0024PS'?G@JK9=76`I%%6,TO2N#`VR,^,;C!7/K]>W$A +MAQEJ"=XMS0[P'-)X&Z'K=6U%(.BF=7*Y)61,K*"0O3[CN!L>[#WX.?3!-TQ1 +M)!LLQYTJ#!>[3'&:F,J\E/E@6&Q8#W!WW_AGA--N4ECBDEA=VE*.U/6QM6TC +M]-*QR&VZE`R`64_B(Q@C[^FW#S1!RE-U&AUUAFU/3RV^6FZ:6/PP(S#*H`SO +MTQMV93U9Z#[_`$SPZ:L.E)B;GJ;YAY`5QF*K0K4)@`8Q+ +MC8#!W'`M.I;*[S&Y./PXS!]/R5<;I6&AE,L$=3158VE@9AL?<'`SG[??B=HO +M)L;A0U=H:;64+I^_7&S:OH[Q8;K+9[T*F.XV^NCRK4-&A\1!*45RTC3S6TQ1S0R66=PD%2$\U'.!ND@.61AC8 +MG8A0/Q*0:]2Q(.MGC=Q')2]2A!)!D'Y\T-ZM9[_<)-"H0+ +M,HW5A_RYEPRA1Z2KM\J5M0B3E@I +M;HV\91VD'N0._KCB1S!^FJ!_Y;NUH42QVN"X9FIY*%#@!P1D9]P=MC[!1SYP!@]_8\,5G")3M,:`K7/S:20]EB0%W/8`=3*1AZ4DG18X$.%U8'4%R +M%POEQ2&*2GH(9RL$;[NY$:1F20C(,C"-`<9"A51?*HRO$`YB2-4D4VGX+2NJ +MC4N9T#,&:,J/H>&"ZZ?,MESN*O[\)7+N[ZJYH4S66DGFFAK)8W8+O)$$,*Q8 +M]%(QU9V`V[G@[`T'5*D`(*K6#61[GY>C6TZ:M'+.Q0V6WQQK.8HA.RIG +M`2,)T@?W.D#;U(/OQ:"6TVQQ0;6&H;*F_/+6 +MH_JYU8=0.6Q\N3Y0%\_TQQRC:U>H2#>+GWY+H6RZ+9[B+>(6H3FF\KV[1E_N +MHBB"77Y.JDD&&+-4(BDD>7\-0&)]`!G'%1QHS.?2(N02/#_$*T-#6M`8;)-: +M^AJ*G3XIIGIOTU24/Z5M*-A%,U&T,`AZL;+(\8&=\$^F>!-@5&EQ#[MF#W&2 +M?0H3'AP/9-CN\$K[4?TCS@H7:O>&BYA6JGDBZT"?*HH_W5F!&`R5M'4+@C(5 +M%SWX;VR"W`G>Z@XGOF[O#(X>*9P+1UH#K!UO?BNSXL:RHFT3R%UU%2Q)66W4 +ME8LM.5$95):VK0Q.QW*,R@D']ECZ$<1?0=C6XC$X=WPN;'B`T@H[;K"YC'<# +M\[%:H-;0JFH;+=Z:JGN-'3T:TM2[[234ZUKQI(1C9TDC>-O9E'H1GM>SC_P[ +MZ;A!)D=^4&/$$$+G^(!-=CC,1]86#K8U-(U>'DD64W"25&&9"Q-03&JY3:9ZE514M;X3)D=:*DD[84>N,'/TP?7B1P +M;`,:^>)/H/NH^NXG"LC2P07)?/T/535'0]52-`35TRY/2V0^5)..M.LX/K@@ +M['B3_3YQE%B#8H!M7)?&QS_P!49)]0!L?7`]N#VU)[1\4(0!(&J[*.4QT\ +ME73-U0-&)9%`RR.&QU#V!ZF.?0G?OPJI3DP[5(`MFXJ1H*E:6>*NC:&G?K82 +MQ]/D+C&6"^GN1VX4`3(-[)+2`05)U$#4T9GI*=Y++)E9Z*12W21D$8/\.Q[' +M/"V/,0[7BLJ6$@2I:E%*L%,&I_F:0?\`#$AZ63_"&[]6.RMGZ$\($EVMUD`P +M$1TR5E(L:TM6MPMC)UI&Y'CP'_`3^T,G(.0=Q[9:>&G=!1`D-0IJ_3E+=J(U +MU)#&PZ3UM&AQU8]C^$^I4_<<.T"YI0]:D'B0JPU\53:KA3S2QDF*57ZEW!7; +M.WOC/$]0>(E0&(9J%?/D9J)M3YL2ZDU[0\C5#6IN6\M=9:2^T%525E0,O07(,N)U`7_`':I`_YBJ/D1[U33\%(EIG>/L?=]RA-*QQ7JGGL%VMDJU*$TSTSL0_4 +MGF\+JP2)4528V&[IL"2HZE8O+3.=CHWSZ>4Z\#=-8+,\97#P_?Y<1937^SPI +MD.*N9WIG\:VUAC\Y@!W5Q_>4'JZ>S)XF/P[!#$0X-=OL1SX^*-ZC*WLG2X[O +M941<+6>ADIH(HB':0Q1GST4@.1TAB>J,YS]5(]^"*6(R'*_3YH=V&+Q.\:A! +MOZ/J0[M0T,:2''C0^L3?3'[)[C]WIP?5,F0@VNB9"_3['2-]A],?3B_P0%SD +MKZ2-R`%/?'&$+#Q7S*^7S8[<:)W)6MI77)U!2".GT[]OIPG@4F8L$$ZG_P#L +MY3UY/3Z[\,UQ8IZD-ZUTW#U.$T\Y1 +ME0MJ%E%'.QP0%/IO_6W#L+*(+M%274)+WKPO%8Q^(Q`+$A,[$@=@3L#[@<.T +M1<`IF7"VY+D#0(GTQ +M;:V]7ZUV>WPF>NGG6**,GL2=RWT`R2?IPTUI=`;J5JHYK18R5Z4?@.Y/V72^ +MGKMSD^3BIZ>I66W6%I/,9H1(3/6EAZ2R>5?98_KQ:]G4([7AX?O\E#D!]26Z +M"PYG>?MR5A^8NKHIW-&E5"USD1T5"Q\JKY69B.P!;T._?L.`-KXL`AHU5DV9 +MA"6YCI9:X.>^H:VEH$DM]'+)0%%C8](?I4R=U'J#\NQ&?7`VZLCGNV\:13MI +M^\^L*Z;+PX+X.Z_I^ZU\_$6SW&QZ4_1D$E72R5E=2H[+@QQ5$Q&WN>E.PP,9 +M)VR.*]M!V>DT4QQ\I4YLZGD>>LX`^(&A\_'1:D.;=G-9RPUK:I#3^+9[C2U, +MOA,?UQ89.(:I53J.PV,AQWY3ZMD^:M.T6"I1.6X]PM#^L$_1F +MI:>LHJ67$OSD$L4I*_-0/4-(._KNQP=PR@@<>D-G.%2BYI/])\0`/?DN78QI +M;4!Y?640\S6H5CO[2QRPVYS3^%/C+1!JC+^N8=7N#MQ+X;_`/=.)WC[ +M!!5'@X=I:EK'$M5+G%NNM#$C&:".J,70=^ENF. +M1B#ZY+@8/L.$L&9AXD?LEO(#Y`WK&6E:GGK[?6QR&A,GAJ)2W4C#W&!C; +ML54^_#K7-(!":<.V6E8-3:IZ>JI)X`A5^M)%48!ZBPVQW1UZOL=O;AWK`09% +M[)IP);`YJ)AABDB29"33NA4DCS+T[!C[,-P?I]^"'!P330`VUT14$_RCHLXC +M3S>"'8'PQ)V4-]'7`'ID#&.,+0X0%DY3?V%*2PPT:03U4\=/9YW(4R$,(VR/ +M(S8PI!P03@'';/&!Y<(&J<<`+C19S1"W'PZFIDHJE7!2=4\6&09R#@'J7VR, +MYP?IQKXX`N$@C+V3_E&5#1@./%EI8:\Q=3>%U],B]_-U*.H8[-^63MPR#!$F +M0$^UI>(-DB.:N@A)'->+92Q1TS$8\-^I"2"0!N>D$>A/<;'?'$OAJF6`5#XQ +M@(S#V%#_``]\R:3EAS1T=JK4=)+2LC<;^#,GA3Y_964>AR:+TAV*6U7T]XMWQ^U^:N^P]JYF +MAS18^DIZ4/\`N]-K@9>U?@5 +M:J;W9@&Z&_+O0AK#0\%3!3:ML32FZ(QB_5`H<1X98YF`_52H1D,!A>GJ4E20 +MJ,%B7!QHU!V3]>''FEXBFV`]MGS-O?#C]T_0K->TEVOKWK&O.G0E!#54R +M0_-"(/%(%P9HQD,N/1TS@IZ*<8V'#;*CG$L.A^?%.5FC_F#<$'5=MHKA,:F2 +MEE\0@=0#E,'_`*=C[_Q]>#Y<0,NPP2<'C4&5MH\5QDP1N"`/3C'"UE@&\('U/_`/9U +M&#MTD=NYX&J$W2Z9*UU\V"?TA*P;+=1].XSZ?NXIV.9VI(4A0="6#>F7$" +M80IJ1B*:<;DE<8Q]/_)X?BQ2I)$-LJ3WR4-?UP6'ZST'U'"Z([4%,EW:`'!. +M:QE3`K!&R%&0/7;^AGA\MD$!):]TZ*[OPER% +MEME/CKK*G;MTQ*5!_O,!Z\&X/#ESK;[=PWGOCU3&,/9,:FPY$[_`?->GV[3V +M+0^FK3I;3-'!;[/;J6.BHH$(411(G2H^F`I)/Y^HXL>)K"FR`$Y@<)G/`*E& +MI]7R3ZIMU*TXD@DKUBJFSTA5F5HNGJWQYV@\N^W?''-]H[2)Q`IDVD3X_:RO +MV'P#>H]L:;X!^WFM??-/4ICT/I6GGEHYXU$$K +MW*:$!G;Y(3`]&,(@D,JA<=\;G.T`*QZEEYTO$;E:!@@<34BQ$F/^H#7>8OPE +M:Z]5M#74?.^V=<572U=K->B"+>52T)&0?V@A)/<=3@]AQ7<<\]4"-01\U)%C +MFO;:)'T*J-SLI8Y^2U0]T<1U8L]%X`Z`S3#)B?+^G8-Z#(`/%=^GI]#\Q-9Z*N<0NM)15"OBHXKM3 +MR=0F!\+Q$J?-DKDIF/&/7;?WG&-<,9FG4$=\1]U%@#]-?C/S053I$;M;5%,( +M7>G://B=7605QL0`#D#?VX,J3D+AK*8H0UP:=%`6.(V;6-;&ZCY=9'0*1L06 +MR-L>Q]/3VX-J_P`2@TH>@T-K$`6E,#F(!3:BJ(#(DL+U99S@J"7CC'B=]L.N +M!]-N!\&#E!Y?5.XMQ!/>LZZVY:QI!UBFK'HXI5.-CE5)+#<$*P+=0_NGWX&H +MO+701(E.5Z6;M-UW)DZK3P(!W*3M-9%: +MY9Z:Z4\530U'5!,LR]2P%AT^?_"?1O0G?8\,O8"!&H68=^60="LVIM4EF1Z: +M)9JFQDE82A#&`^B.#GR]L-Z@CZX27YC.CDMP+6VN"N$$56*5!;E^J4:VTU5:3U1'"KN::5FEI)224E7JQY2 +M>X!7!S@@C!`XF,)6W&ZA,;3`(+4S*G5B1LVIE):%9;E?KZW5M-3V:Z5=50IX?2CB0M' +M`6.S(A[PD'=3NASZ8QS[:^$?2[8N/I]U>]G8P$"F=`K1T4-4DU9'3R/2W^!( +MUJH4V2Y1!0Z-D9!D`/6C`$XV(XJ3W&PW'0\#P5G:`^_'U'^$&ZUM4&GJ^DU] +M;/&I=-RL8+U!2GJ^1R>KYJ%1WCZ@&:,?AQE=MA)X'$LK?\.X=L:3OC=Y*+K4 +M32<'@RW>CNU72BNFG*[495JRA1H9;C+3D/\`),Y,<=:B=V.0`ZX\R,#L<<`U +M\$]M4!NH]P?&P1E.JTMC4;^X;_>Z4$W;2!2LDBIXZR*123)'"P8(2>K*G(\A +MZNI?N?0#A1JDM#HU365H$G>OT5D!!P>_;UVX[(TSHN1%UC"_F&,@[;[;<85M +MI$+B`=_7;N/;C1*T`97R1?*Q)[<8%IQN@349_P!VG&V,>OIPS7%DZQY&BUX< +MVEQ7$L!N_KMCBFX\RZ-ZD@8-TE'/3E?,5SD`>W#--H-RG7UHO"PL9[@LWL1_ +M+@D-`%DBD=9WKO1&P?,%;;MP_3-T,]LE"6HXV^6GZ54/@D>N_#Q,FZ>J$S;0 +M*DFH"%U!V`(DR6!^O"Z`ER;?5&:83JLC2+2HW8](./?Z;<&N!!F%JF((.J]/ +M_P#9[\FX.7'*"Q\R+M;IZ+4=SH&IZ,3+TO'3,X=Y2.X,CA?^E5]^+%LW#=72 +M#W"\($G.9'/UU^@'%_E=5EYPT534_#[=*&E-/6HVG;C'$\L8;HFC9F4X.RX\/ +M/OTLPVSQ7-C.G:/:XC3N"%K4#F+2-%K2UKJ273//WF5+%'5T,%+72VZ%6'2X +MDCBAAW!`QYH%(R-NA?7OUVO1#\/E=?\`RJ?1-^7%;//@OO=HI+:E;)+% +M_LB\`JVAF;)6AD58JF!QN>N+Q2N^S!8V&Q..6=+L(.L#SR3Z=\20Y26LMQ$,?2Y[B6G6D*G.Y([ +MYXMW0/'0RI3=N<'>#[FPX$GS4'M^F'N;4;H1^X^RK5K2EZ--WNJZ9A5QT%+) +M$RY!&&E'X>_;*C/L.++LMQZ]C0;$W]$+M*33<3P]_-*R::6[Z%U];JZ%9JZ" +MDLTZRPX202!II#U`8#^4N/0_7;BSU61B:51NDN'G`5=82^BZF=0`?)#*1TZS +M4?S)CFB25"&*DY0LC!2OJ#^\<$M:+PF`26@DKC5TCTNKZ%VCC#S0PR."0X9G +M0(6!'V)S]<<)IU`[#D<)3M1I%8'<4?K([4K(E30P1$[>?$AZ),9VQ +MD`_;A6!J');C_E:QE,.?V3R7V1(ETYH^O>I^9J(8J^VU],5&8XHNGI((.<$, +MW?L1]-\=2ESK<".](;4[+>(%T!7.USI555'-'4+64ZQ"(`>:>-5P,$9\Z$-C +M/H2OH.#6U1`0[Z1OP"G;9#0WRV&@N]8@IU;I!))%*K;=1`],E2"-UR0=CPU4 +M#J;LS0G:;NM;#C<>FY8=/3U]KK*JU7>$U+0A8YD??QX\D*ZMV[`#_P#4^G#C +MGM2X45;-20P454ZQTX!0DGI:##'R]9[+N.DG.#WV8\(C,TW5,"SF&FKZ6:.G +MHK7<90`C3JRTU8ZC!BSMX\^]+VJ]0RBYTOZ-J +MSAHDJ9^DK48P0)/0=@S>N0V<@<&N::BDHZIY**_ +M6ZK$W34+T.5.(Y4;?IV`B<,#@]'USP=U@<)&A47U9:_*F!154E#4AY(W@FAF +MZ73'28V/J,]AG?[Y';B(Q5$$0K!A:F6''E?Q")R4P,_JGW!Z6VH&U,+U;B3\.\>]XX[U<]F5`\"1?=]58>T7@WU +M*.@EMIFU'')+%50B00+J)-W!IQVCKERZE&`#LBD`.2C5>O1-)QJTW=G4TB7B3:>!!^NY"MDHZWEI-75=DJK34XJ:EJ[9#'%3W"SU]9%$6BA$9'73@'>)P`=U/;<]_8#A%-[7"9@HSM,-A(7Z +M#"D9&V_KQV,"3=<7T%UQ<'!!RQ_CQMT398("X@'/N,<:G<$HZ+^DPP(R"#PM +MH$3*UO0'J(=5++[D$]O7@2J;)VF1*U[\V5!K9".W41@#BH8^G!$H^GK&Y)"1 +M,;E5(^F_Y_7AFC)'!/D@RXKJ*C.2WE/<8[\.TS!A(=3!,+[T@*W;A]O%R6T7[5E2#4@`U%D]);Q,9]]^%TP`>TM5 +M&PZ"KR_"/R6K?B`YQ\O^6D"2BU5-2M1=I@0#36^+#SM]RHZ!]7'$IA:'65&L +MW>Y0=:I#,HU-OOY#U7JSU;J.W:?M_P"B[7'34ELHX%I88(FVAA50JC'MV'OM +MQ-8S&!H,(_`X$&`%KMYT:_'4].J3*8P`^6\LDA&^#Z#!`]]N.2=*MK`@L%H7 +M2^CVS!JY5$L&IJ>FUQI^[2-'\M02RW*9F\N%IX9*@[_>%1M[CCFNQ'.=C65' +MZ-EW_:"?F%T#'8<.PKZ;?YP!Q^(AOU)3,YQ7J>[\HZRSRSP^`D]ZHI9\-,S+ +M'")88B5V"O'4>O<1,/0\7W$52_#%IWYO33T*HN&IM9C6O`UR&-+DP3X%OJ%J +M^YCF.+1%ID(25?!DN=0O5@2`L@$9]2Q\7I^G4W;!XI([-%HW[UT.G)K/'JBZ=6)^8%JN#U(C>FO#5+$['H\(DCZ?@C_=PU4=G8>8_P`+>,I$L(.D?7]R +M@_5^G5NO+6@T\B/*\\MXM$JE1B)IY)50J#W`,@/TZ1[\4O9QC'!Q.A;?N0&- +MJ`DD\CY1]%HVYCT\<6I=:72D^:JH5O%8D9J&R[QQSOTM(1W8X4'ZCCN.&K`T +MPWD/7W*J%:@YK@';N&FBOQ\%FIX*"]Z0\1NFTK42:?K(YC^K6&K`D0N1[*O? +MTS)C?/%#Z4T6]J!),.[\MOK\E(X4D0=XGY?=6(^+ZQ2\V.0>IX*&UUERU%IN +MWTFJ*&18&,U1!2/)17"EQD8EA$3N-B<1#T*\1FP*GZ7$L>XV<(\]>_@M3O-"GHZZVZ@^6+315-E@:*2/996$//BVBH$ +M=LCBY5*9&5@TAT*M4[`NWVE1M?:Y*4QTRB:1Q5QQ+GS$H@ZP?J2`3^0X)PKP +M02>'[)K$TR(`4I;K<9*C3+I&T\!@EA95W8LC_LMW!((W_GL.!J9!SM/'Z(AS +M2,IUW(JO,<-146B2.->@VUZC/43@EI%&<;`AEC&^^XQMGAW`%V6#*FC292LL:#I5.M<90=O#<])Q^RPQL#P41GIQP3#I:[1 +M&--,*Y*>DE:.2FBB/AJWF,:$8*9'F(&Y"_B/8>8`$*P,\44"HC!_P!W +M!QL_^`$[@[KZ'&`-U0'01JEL(BG(3HFM3`?B1 +M>S0G!\N`0#G8C'$BPD-0-:F)C54"F:.V76HI:P2ME6CQU=23Q%2K!6[A@"=C +ML5_]O!%!Y([*AZ],--T6ZN_Y<-8FB +M9E2&#>W1,O3UUN5@J*>Z6NN\/H82Q.O2VX&<%2/;((]B>X)'$#BJ+7]EX4]A +MJY:,P,*[6C=66[7]MFKZBO\`D:]HH14LJ%EBG0GI:8*"X1CT],WFP?*Q(Z3Q +M0]I8-V'<&L;+;V^WV5QV=B6U;G7N]]RL'H]Y=0W.X_/TMJN5VN""@OENJD7Y +M34J%0`M5_[EQ!4L*;7,R.&NHY(IL +MO++4UFHY4T?9.8.KM)/,QIEMSP-56J4*HDHZZ)O,DL?D`?\`"Z%2-PP!+\:W +M$14+@QV_@>8[T,VD:78@N&Z-W+WN7NW78#)(''H/+_:%K(#U%DT\Q#!MC^?#-0)Y@$K7YS +M9`-9*V<*6QMZ\4[:#@'7NCZ0,@A([!'8@[9[;>W###(NGWN,\0NEF/YYX>IW +M,E-N=NWKB&(!="!D^GU_\'@A@@W23I,6WH6OH'RU2Q.W23CU/^@VX?!)&5:: +M0W5KWGN^Z'R!U3LC2WU/T5Q^9FM6I*2L'CN +MK(2[H&Z`QQL,'VSCB#VIBNP1.BNNS<*2X'BM:?,35!JZU5^99CU9)(.3GQ[\LJ0974=G4PQFD)66ZO-3#J\]",KVJ2WPNI)*RU\A`R3TU#!5V[=*Y_-V/MQ1,8\$#A?YKI.'DO+A<54KD]`:"?H]\>=C^_TXK#*(_7$#E]0JW7>"QQ/#[@ +M?):'==T<#'44T"CP9(I:A5W(\[LW;N?,IJ>5EL +MEL.J;C1906+JY:D$6-_>_P#RM!`TV=QO#5#MWR&Z?S^_'3<0_*]H[_HJ0T$M='*? +M-=UU2H,>C+@_2)Z>98JC;!!6'I#/]2B#?_"?8\*PA+7/;N.GB5JL\N#7<%-: +M/\5;-\R_S,#T5&U5$ZY7/E;.?S?]^/IPC%@-K!PT-D52=+2-%GM3U!M0*EMQ/R_RF,5F+(C7Y62\U;?)F +M?P'DD:2.AIZ-"6+-&J0K&5Z=B<9<_P#4.)RG3@RH=SY.4H?M-W>@N$\-2[U5 +M+4P"1TQU,0%`+H#L74,&'N%(]N&\70SM`%DNC6`J4B_L(FH14L%B4'S$-15V^8+(\`;K1\JTB]6"& +MQW/8[=PB.9,AED` +MZA[[;'<'AISG,=8>^2>;0#Q=*JJI+SHZL^9EBFFM3L`9@WC+C/9^Q!&/Q;$> +MOMP4QS:@MJA'!U($;O>J9VFZBR5%)*L$<)M[#K(#!HXQU$MT$?A))W#=*^N< +M[%M[G3,P4EN4B&B0IO5=NN=+IM96GJ*Q5!=&5\I@;%6Z,],F0#D[$;_4R="K +M(DZH:NTDQJ/54LU?%15RFKI1/0W.F?K66&0LK@>C*P[C."#W!QPY2EIY(&NT +M.UU0Q;)DMUU6NHXB;?7IUAJ>4%8YE_$GT.-QD#(QQ(!P<,I4>#D.8&2-Z:-L +MNSTLR2`1MNKH8AAPP],';TR#W!R/7B(Q6'E3N#Q1`DIK:5U)4V.NBO%@_P![ +MAE8M)%"I\0(?Q*5_;3(SC@^8+NR:BH1(WZ0FN-.JT\MQMM0JSW",9,?S+.^7Z`612=P`5)/3Q4L1ARV`&@Y9.PPP]@>/4<7LO/'VQ[XVXV7#0I`LN(V)&2N_"-#9820 +M5Q9=MP&'\N-Z2`LS(`U*0()Q@]M]^&*P3U,C>M?_`#8D'S4Q#97JP=NW_?BH +MXX!VY2#`1XI(Y_$Q.?7(/;;@%OPPY/R09)6%UG)((.!OOV]."V[I3=0F9-OW +M7U=QELG)[_GVX):),)#B`=8"%K[CY:H##R@';.Y&,\/"F-25CB053&Z6FY7W +M5]%:;/1S7.[S3^'#!`K.TSDX`"C)[XXW2;+\HWI+NRZ>"]A?(G0E/R5^&/E5 +MH"#PFK:6UAJW"%?%JY5,DC,._P")B/?R@<7%E/JZ08F\`+WUU5,^>M^6EAJ3 +M&QZE4X`7;KST@+_%O^KBB;:+2"5TG8S-`5KGOVHXJBNZB\ACZPBD$>8G?;'W +M`]^*34PY#NV%=J57*RQW(4U!S3TSH+0]PJKK=::BN==<0TCT)/BM?W/'F72:2U5>;+5>--3S2U\E+B/)/4(I`&*9W/5 +M@XR,MGL<\5*KA2XY>]7396T!U+7BYAOI/I]E6>Q\VZ2Z7VBMDD1CA2JIOUF- +MF'B1-E<[G`.X._?MP!4P;A((UE&8W:8R!P$'=ZRK"7RW_.:0M\T9:K+#4$4A +M4D'J_0\I1@PV/ZRF1L^V!Z\5"S<0'#6`?46]2H^I4S2#H(_]OW6A"Y3T\VD+ +M?52?C(H8,XPW3UQDC[[-^_[\=6PK8J0WG\BH;:-0AG:WE9'+9I*>Z72C<2SR +MR"5H8S(0&(+G8]EQU,L-%W.F +MO%EKQ/U-3T5R9"JJ!NT*51;.,%%:0#OCB(8#3Q(,6J6(W$M'H.3JZ2C$``G,$NS;$J"N[+D.E3 +M&&JN%,]D_5.L)9VB9CW/A(\^2TTU5NGLUMUS9T>2&6*IDI&#['I+@=+=\X&3 +MU#/H0=^.P4:S:IIO&A$^BIE:GES-.\F5&5D;S7F\6YY9:>EEMT*J1OTRL%Z' +M]^HEOW,>"7&&-<+D$_NF002=WN$::?)@K+U354OA(TK4$1;)4!$B4X/MD@?< +MGZ<"XL2P.;NNB<*&M='\I792VV6HMU[MH/F6(_OX1A, +M0.O#W;Q[^:UB:)-.V@*J_JBMFKK[4$?4=('U"\6^@WLP5 +M6*[7-<22NRAJ(*RG/S1,,,9@DV7_`($IR#C/96&/SVX9JM+2$\QTCFCFV7'H +MD33MQ=Z>L),ELJNK$?F';S#\!/5D;[Y(X$>V1G'BEBHX$`GN^J)*Z`5U6"W5 +M0:CI%(DVZ1-&#AOJ0N,AAD@>;L&PPTEE]6GT*/?VFV/:'JLV@GJ*.JB2HI+1 +M-,ZM&]-6YC@JXP=D=U(*9)!653F-L$'I/&8AK7,RM)',:C[\QO"W2>14#@// +M0HYFGH:MZ_5MC>HGK@?!O%LJ4S+4@*?$DDC0#,T6`Y88+A2Z[AQQ'LIN:13J +MZ;B-.7GY#3>B`6$YZ>HW>:[A6VC45.[4X!KHRD;H"&>,-L&9>TJDXPPV93@[ +M@<,OIOIZ:(QU0.$;E`T>F*:W7>GK+#(UBK&)S\G5],3L0!TA7/2"IZ3-5/4RH])*C8$\2*^<>DBY`?[;'ON>-T7%H +M0U5H?=Z6)6G7!`# +M@HE^'[5D94[9HXTD555^DI)$XPQZ<@E">QR-P1PW4`=HB6DML=Z+K,\]5&6I +MHX7JQYYUB!4RD#:14R"L@QOC8_GQ%8NE!NIG!U2X0$Y](Z\KK6W^\31WK3J1 +M-%5=4223TJ;Y#*/.5&WE/;TXKV.V'Q3F6F6Z\T^X]:T=LB@ +MKA755+;ZV)9::44PKZ:I`V+PL%)0]@RD`@@`DXVI=;9S\V41(UO!^BMF&Q8< +MV=W=*_1S3."#@C]_'>6Z+A&9?Q7);T^_&%LF5K5<5W.P!W]N-%LE;GV_KTX$;I(2ZL9LK=ZCC*PWVX*;R350")XH6U"TB05/41GI.WL.";$91I[NML,GFJH4&L[AHGF# +M9;Y0-@TEPAJL;#)216W.-QY<8.VYX=PY+*G9W$']D/6;`,[Q[/FO4CR=YT+S +M<BU%>U4TJ?/T*-&$=J64>)'T@$AEPRX/ML=QQ:'5@][O,=QT1.%:8!&\*D +M7Q!WZY+>_P!"6RFFJ[DS-,D0W,BGN-]L#=BQP%`R2`,\4#:CG=:&-W7\%TO9 +M=-O5]8XP./N_=%SN6I/GESVM_+MJRS6VNCO-4RB.ONU.>F*G4G"PT1_N^0B2 +MH`'B'"Q],8+2QO5!QAN[T4UE,=8X0/Z3KWN^C=VIEWPT+YC\U-0:7L7+ZZWF +M5J_7M!;6NNG;<4#"CN=RJ&F6YU$9_P"&E'3_`*/:GC/FDG2%L=$YMH'$DY@X[FR-3:3^!FTU>E^>G(J]11565HI;.$:9RD< +MAKFJZ<'OXCEZ>0$G(S)ON>"7T06%O)1V-+:K'..LWCA$?7R5HOBKY#Z;U)J; +M2QNRFJ@$,U.DL4IC99XV$"R$C)!:)8<^A]<]/%2%(=:Z.2F=D5W.9VQS\[QY +MDJI-HY,T6G*VJEM%8\)AP["25B961U`)!.&/8[;GJR6#](Z`N5CF-0LT+7`F56*@/-12QJ"V)\U%UG9AW>_V4MRTE@I;Q37"H,OR@GJ8VQN529UA4@'N>N3`]1W].-;6: +M7,RC6/E=!L)#B#OCTU3TMM\M.A]8Z&K]5T\4FA;W:Z[2&I(&EZ5DIII6PR./ +MP./$652NZLJD=N(K"TG5F/8T]H0YO(M]^2:V@2&MJMO'VT\4^*BSZCY7_P"V +M6F;PL-VGIUDII>ABE/!]$= +MU3^X?X^H6O;G9:'MVM=9V:]1T"25T+W"CKHE\U:B..EGZ3TF1@0&38 +MJRD;@CB\;'+NIIO:38P1[W*KXN2XYMX)^JKW#)!5U-3)U)+!'-^K.!UF)M@2 +M#Z#P64>Q&.+0^UAO48S73N1=;*5*V&WH7Z*BI&)VSZD,&'H=\'!XNNSL2U +M[9&N]5+&X,M,%!\%1)05574RQ+4(M.M+4H#Y7QC(.=NK'[ROOP=4&EB+Y+97S*@'JQ5G`WR>C&^V0@PAY@(DU,P`*9M%+3 +M7\QJ]2#5T*H]/+#Y6JD�.-I0=QU=U)SVW'>W*>1U1=.'``ZA5[N#3/ +M3QTUQ"]2HN/UIQY1&/V,_@Z=P9%06A&%50TNH%K=2Z6@CME^AB +M"W*U!2O@L2I66$#RM#(ZE=L!7('[0X`SFD>KJ7:=#QY'F->Y%L8UYS4_BWCW +MN0U2:IQ)3TMVH)#6,V21U!Y<'<#&T@]T8=0]/1N$5,.=6FR72JVAUBB-[Y!5 +MTL,-%<)I:)AUK&^6A#Y[!2,(3ZE&VS[C'&Z-1].3[_=-UZ+7D`"_%([5MOJH +M*N2YI3&-2.R%E/ME6]<>H._W[<2U'$M>-5$U,.]EBE37WRMLM;#=:23]&5:G +MPY)*V-98Y$.Q2564Y4[CMC_VG@^G2:6P1(Y?11^)<09%BF'%462KL[2U5CL0 +MA!+QBW2SE(01U&-F#D+L2Z`C=0P.",<-M:]I[#CXI8>QS8>T;M/?T4'/)9*. +M6&JBLUZ@C4EQ/27!9.F5A!+(1@R+#-$ZQN0!U=&,X&Q>!J.=,9N +M^)[I!$^*L.%Q%$`YG1W:+].E.K!`Z>.HKE!"^98`87(]`/?OQB4`OXC?Z\8L +ME?SXZ<'T['OQIPLM:E+G5;'P9>GT'?@2L20B&NWJ@G-4CQYR<,O5Q5-H.@F$ +M;1`)ON2)E9@F"`N>VQR1Q'L=!(WA&!IFRCE0&1@0H.>^?\N"VB#S3#C:VBRE +M4J@;"XS_`'NP(X*HZPFR+%"NH$=J><(@SZCMZ;<.!P%BL:X`JC^J-M0`M@KX +MF#GUW^O!+`,PNM5&WNO2;\`UDMU\^&KE%J>2CCIKU17:X6B2I>0NU5#XW4H' +MM^/I`/H".+5A*332:^(,D(7#5W-SM&@)^0/U5>/C%D>UZQU19?F#16H3B.H2 +M%!XE3T_A$SL1U(,#$?X!WZ<[\&GO]E777%IL]]UCJ2\-3R34E3,(83/(7D$$:B&'+>K"**)?L![< +M2SJI<90=.D&@$B#'KO\`64?\I+NVD]0Z(KK>L!J+==(JF(?A?J2IBF49[X8& +M9,_XN&*F+``OR]4X[`M8(^ROU\45K@-RF6A98:FCU!6!4R#UTM1&L +M\)ZO7'5TC_\`&>*O7>&8B&B)_9:V"XN8"="T&=+BQ^Y[U26MB:LU=1T=*K5+ +MU-:E*PW;I=I5&.D9R=P<`9V/?A..JRTG53I?E;+N$^0)5C-'W'%EUA.%;]&? +M)17H(Q)'ZF!9-@I&WA(P;/8`^O'.-ITP70>?D3"&J]EP:3G88*^')U/W`VVU5.MUB+1%/EX)HS'(.D##+%-0R1$KL%92<%3Q<=AOG#O9S]9D?^ +MRK>,I'K&N[O']XN>:J-=[7'1NT$JH\SYA3?`E03/E5QV.`"/?!/<\685;70' +M5!KK(ZH;C36ZZZ.J5HY*JB62!IU3&6#K@D;'IQ(SCZ$+[\0]=N=KF[]R,ITP +MW>)47RR!%3IPW[(8$L!Z=(SMC@5UE5J'3UOOY>UHU:%G/CT+$#I590&>+.W2I4]CG@K`[0+. +MW:UCX:>B%QF!#CD=WA(FX644-!=:>\2&@N]?4"")IHSYA$"XY=1U8WZ<= +MR>+;2Q6>',N![A52MA33>0Y1^E[/(]7<+;/X-1T)#<8T9B"E7$0$5Q@G$A?H +M.PSD9.P/#E2O`SQQ'AO3-&B2) +M%G!#4UVDIV"M4*CO5V28YQ +M!,W_`#$.&:*4Y#+MU%E8<1V'?(\1]$:X-=W<=X0A<=-76UPPW* +MEK:34EFE9HXKO0R&:.?'=)E`#!AME945QD=]CPXZLR(B#P^W[)MK729,CU6* +MU]N>((+[!5UM`!TH6B8K&HVV<9=,#89+``=@.!FT1=U.Q^J84%4V'5IO[*P9Z +M26WN#<*:GA5F"R1]862)L;JW3@D>S8W'UX,94IO$M*0Z@6CMB"NB/3T$K-6V +M2_PVZO`\D%3Y?F&R/*LAPKXSGS]!&#@D\:JURVSQ;DMMHYC+3"Y0ZCEH>N*] +M4%>)BD7)U!2!U9`R3VSP$UH)LG>V1*PE`(7<*NV_N>"&[^* +MT]@C35=P!P`I3)VSZ<$L/%-.L)!0Q?@?EYPS$`#UP,;>GTX=INBX%TK*,P5) +MM3TDU1J'HIHFED#Y\N!GNI"7%+JD%W="]./]GC89;-R0TSHRX14M*:> +M^TUWK9'.T41@%1/(^.RA0%R>YP-\\6G!NR8/JU1=I=;N +M7HC8^!=1P;*;K$-6LK4)BCEU!>J7H=[;035G4X)Q*[)3QCVZO$J4([?ASZ<7 +M?#4X;("`JC1A-B0/J?01XPJ9W2"F0"**-D!P%)V`'MG[#@JE3,:)O$5@'P=5 +M`P*_B:(!S'O\ +M_P#""P6(=3>*8X]Y@ALJJ>GKQ;8Z+_:*Q5E"_BRTJBJAE#^&KS()B.GNYC?P +MR2-PQ8R"-ZF:F-#I,R;_`"/UOX*P?*B=+E:[[:*HHAJM,U32+(AZ +M.@1)`Z8`V),Y7'I@\4#:K0&9G;C[*RL8J`M@P1'G(]`M07Q`4*/JB.ICCZ9_ +M`IJ23J=1\X(HTC9\KL)>B2-67N<]7N.+%LAH`AO/PG3P2JA+H*YT,U#431O$6A:*=7C);.Y`F.2#C' +M3_BXIVV<.:>/`([+I'U'F/1&X8BI2(!\N5O.$F_A]JAH.XZ=IFB2DI'K?T;Y +M7+I#3R%(U8,?Q-%XF_;#(R_>6VH>M>Z/B,'Q_?Y)AC"UK8@^S]D.\]-,1:/K +M^6]=6URJU!->]-UB*65)*WAISG[`*DUVL%0UWMMIJ:@1U3S2B*5<,K9"@!3V"MG8C]H;=^+:RJ` +M"^+*.@9N0T7."I:"_P#BR&2F2&K6D=0V`4*9V/IEBI(.Q^A'`=6A+9`G>GJ+ +MRTE-'4E.]K.E*MPH:6FE6I@EV,J`*'8*IZ>I1T;;'`&,]N(-SSG3I%1$/,%8CMY@0#V\X/8;,4L4`Z'C_. +MBS$4`X`@6];H-U?I*WZHMU#?*9HC04\`CF)4]5._B$RR2+WZ.MB#CL1@8XD, +M'M5]&H:9U,^-OGP45B<$VLTOT"7#6"Z:9>GDO%*LZ04R5RUL.#2SD,8Z5/$[ +M8,DBLRMON,'OQ8\/M2G5.5AN;$'4;R8[MZAJF"-,DU#]I[TFKN*^T7'YQJ>I +MJ*-).N-NM@*B)AU8/IYE)!]"<'USQ.T:K7MB;_51%9CF$EPT475I*CK==/2L +MTL#=;IT@O$O]\`?BC((!'IGV/#]-_P#*_>AG.(=F;N198>8DM'-"U73Q2T$P +M$1F&ZD;%6[[#U'#-?"APU1-'&!EW!-3YBTZBACEME8I$4..M8<3 +MA]R%J%SD-@D>*F01N0P!Q&O#Z;C&_G;P^RDFUF5&"=>2Q;5>]1:4KGK+=*DT +M,B&&HH*U%%/6QMNRG!Z1DC/4N"K`,,'AK$8:E5$/'B-4ZRNYIAIGZ*6O!L"Q +M0ZFL!NEHM-6_R\H/2QHY<'%-6!01U8W20#IE4'&"&413:;V_PGD$[N?,?4(] +MM0'M,MQ7&"@JJHB>DH*B.$D%JB@'B1JN,^(T8.`O8;$CTQZ<"/J!MG:\T5E) +MAQ&JS)],VNXT\UQH+E3TUPA/AR2VPER__P"5?0[8P0?IPP,:]A#'MD'C]$XW +M#->TEA@A95MI-31/%(S6N_4V1U>)"_41V`#QY*=_7I'":U6B-.R>7V2Z#*A, +MFXY]R*GU!372!;;?K/0SQ]0BE2NC2=F(_9$@\Q&-N_;&Q[\#4Q49VVDF+VMZ +M(EV'IO;EZIP(92PVQC@:L#*?`W!4'YJ +M,&GER#@L0-L<57:$"R,IR2(LD#4*#@'\(]GI;&^?3A +M\-C>AG.<2LR-0RX53N?7^?!3#!!2&50"AN_(O@SA@N"I/M_6.'6B+[TX'DWB +M4AM!\K]<\]>9=CY,X!E2.(NT<"#,KMC98U7=F.`,Y)X(PF'=5. +M1O&^ZR8K5&TCVKS[*WH44M@^#+EMK;EU9M=5O,;G1J299-47JEF9*.T(BA4M +MUL3/DA0;.^>IVZB?V52E=.NG#:37[/V?+JA^(@Z=W.->'>;=(Z$=!*F(J_ZE +MC1E9_*T^D_3CNLM6W,[6$$S5CB:>JD+%HI_\`8Z_I.J>/<[O34N`__(I8GE?`QV,M33;CU3&_IU;"4YI`ZDJC +MXU[16Y`$^9'K8^:K_6U-.U1'"LP20*21W+'';'IG'$L&M:R`H%P+G!Q]W5-O +MBOY?KJO3-=)3U#8^C +ME-CYI^_"OKJZ6#X9-%VZ2Y5E3'0W'YFIQ,6$BE88G(3/26C"R/C?J#,,^@`V +MR"XD@6/O]E`X9IIU"T:Q\M/D@1M37:R\T^9^FXM+SVJC1XZVFJ:.3!^6-3&\ +M<;*-E/=R=^HJQ[*,D5L/.'94>/5D"LF.N-R@)/]T@=';N!]!Q*='W]D-XB$5B'D.`//YD +M_=(`TZQZ?UTCI&:5:BEE;(),0^8G0N,G;I\2,YXG'C^(TCG\@HRJW=O/VE6( +M^$!Z:JHM3\N;A/!1SW&U-\N&?\#+T2$)C]EI(1WW\PQWXK'2^D2UM9N[Z)[9 +M<3;W/V"B;_:&@LFJJ2*::FK*2M,RNY"YCE(='],%9!(",=USW/#>!Q1-5A)'8]0TL4&'@]OD9"%Q$+T$ +M[[?M=)^_WXO3'$L='&RAW4>T)/FLF.PQ7.ZTPK(XW***AVR%6=<;[>C84;?3 +M/8'@=F(+1EW(E^'$9MZG[W#/<=.V^&OJW6>&XOX<[D]5/UP*2^?8/&0<[8)[ +M8XBJ](MK$`;OD?L4_05AT +MJR,,`2(Q[E<\/,Q#*H@B8'F/>G`\K(!]!X#GG0H4U+IZ\ZW?H>IIJNWU=3'IJ9I*=2W4IC57/1Y6R58!E!7?#(1G +M&#Q<<#7-9L/$/$'W]%7<;AA3?8]@H6U"WZ)NMLJ:!([;@<]/M7'T497;EJ"%U&FIKHZ%H'HS6,J0R)&'CD9B%`8=F +M\Q(!&/;(/&VU,M@=.*;?3:\2%]K**JTA=C1SSQM0K*%BK(9F5X3G'6C^BL5) +MPW?MW[XQ_6LS,]5MXZEP:="F99-5AI/T?J6>"HCZC&*J,,QD/?SQ%2,[;D>G +M<8WX"K4`02SWX_12.'KF>U='EIDHZ*K-=214]?;'3PI(I"6H:Z`GJ:"=1E@- +ML@J24.&5D('$+B&N+8)@^HYCWIJI6@T%TMOR^ZZKOIN]6NA&JM&23UND7F4/ +M&K9FM7@9M:E4)I5OB]#W?4(CMLA[-)/@N-MU167 +M*HA$]LM%;<5V,59A)B.G]F7,'VN/0)^GC,T`@>/L +M%,^R5E&D\L?Z*O%*&B)P':81#W4E>KIW[]6_T[\0E=I+9+@;\@I;#N`<(%CS +M]Z)B6ZIM=4U)2UEQM20/'F,2Q;,!MTD.)%.?;*G'MCB/>6F<*02&""IBCE`V`P5QML3WX%_U(23D] +M#])"QV&!L"">=U[R5!`(.PQGCTWO7GH+X22=B,<8MVWKYC?/KGT]#QL%8'+X +MQ/2>Y/KQI)*6NJY&6*10OFP?IP)6,A$TG0%0[FECQ)RQ&.H^GUXJNT-\(UL" +M.*0TY4@]85N^W`5+2$[&4WO"AW8HW3T]7\, +M#&M,9D.!.JG-+A;2]WU/<7*10A^A(HP07GE<[1PQKYG<[*!Z +MD@$^A1>\AK=P2W50T2[3Y\@K;UVI>6OP=Z0U!RXY&W"AO>MKA"M-K37JQ#YJ +M[GNU+0L#F&A0]E!RY\S$GCDW3'IV3FP&RCV-'/&I.G9(T[_+B>Y=`OPTL,=M +M434-VL.@'/F>'B>`H9J_F)7W6L1DJI98M_$WSEC@Y<>W?;WXI^S,#$$ZKJN+ +M:T`M"0=^K;C>#XJMB(*QDC*@>(?OZ=^+;@@&G,-%7<92EN1(G4]@K5A$PR,* +MS!"2W22?,!V]<'/TXN>S=IM!@E4W:>%D$C3W"1M-1-'=7^;PH7+O+W##V^^_ +M$U7Q?8.355>EAGR254_XH-87,11Z6M=MJHK+D25U:8022,'``[@>PX&PSVN? +M#[!'5GD2]NZR(?ABU1INGI+'RXH+W)5_,V=ZE^NB:)XZFHK7:(,,DG""GQ[A +ML>ISO;XILIDL,G7RNH,/BBT72.)@GJ=B2R1$[;_F>.:=("*C7$#6RM6$PP;3##IP\ +MTH/BHT^SW:]W6B@^=%7;WJ8TSO,RJ2!@#RYP8\;[A/?A&P*Q86R;"`?JB:QE +MM[&3[][E2FBIYJ_3VJD>-G::US0@LN\A#Q5!'[HI!GTWXGR,I#]\_LF'`D0= +MW^/LI/D!JK]&:PTC?34!8IK>L7BQRD!I(P9')/=2`B';U)X3MRD'T7T3N)\B +M@\`?XLMWGT5P>8^G;=>+CK&2UN%H*RAJ6I9-F:=1'XZ&;I[LH;JQ[$\4#"5Z +ME(T\PT-_D58*=,.I7CV/D@[E=;X]8Z1J-+2FEI4DH[WIDL^3X$A1:VB55`SO +M/32J-L@N!MWXL..J]56%3FUTQX'TA1F%IM+2':`7'H?NJ,:VH)*.KLM=X91; +MA;1,@QVZW$;*/L4;^/%^PE<93WJ/;3FSMRQZ>BD\.IK%PT?@%=AD+)TA3@'; +M(!8_]0['AL@DP4^6$F2BF6V+7VZI67$4YJ8FB:0%HY`8G)V[ACU`$]]^`6O< +M*H!N#/?N6FTQEX<_%=%#03QT[!*=(YTG*KUOXD5#[4HN-,M +M$L&8AI +M:9!D>1GY2JO5I=8R`-X_PN/Q1-.B-XTE +MBFJ)$P"\;$!ND%I#Z95=\GB7KTLW9(L?E[LH[#U0T=G5,NFETA?+9;5E5+?$ +M*.+<`]%.>MPP/5EE0D`=+=2Y`PW;B-IFK3>9O?[>YUY(\-IO:''?\T-5>EKK +M;ZFVAHX)Z*95IXJE5!ADD5^@03IV&?(5<'8CTSG@TU6N!`U'N0F&4"!F(D!< +M*6Y72UQBKLK2VVJZ_P!92L2W6C,=T8[>5E>,JX]M\G'"74P\Y'7''WQU6-K$ +M&6E.+2G,F.AK*>X24QM35$7R\\]%'&\-0K'#)443XBFC;!5XP%+;;@]+"!Q6 +MR"X%LR>!MX@[CPW*8P^T2NT\]6T%SLCC +M\7ZBI"R/2DY*2J\BJ"%9L^9HBFZO0:#5EKM`=0>$Y;`^%]W`2[JM"H0QL'Z] +MWVXH;MEKMM!4TQJJ/6FFT4H$:&F,BQ@8RRM$_F[=@&`[<-5:SRTBSN,V^:=H +M,:'"):1P.Y,>ABH:VHF:FYETL\9PJ?IK3G7U;;JRM#)N-MRRYQQ"O:`9=2CN +M=^ZE#5>02'3WCW96&Y7:>@GN%+1PWSD["H0EL[8"8&2 +M3VXBL7U;K',!WSYV^J+P]6HT9A'E'+C96^M=!J"*V6U=%:HCM:>`IK8[7J"> +M2%)M_(&:1FPHP/-C?JQL1Q'5<$)D"9Y!/T\>YTM,6//3Z\]KB +M2N[#MGC'!:A<`0`01N.-+:^2D]+*"#VVSQBQ+/508I*3D8SP-6`A.TP)5%^: +M6!+,A(R">W\QQ5\>P3F4C0)F2D%*H"GI8?E_F>(YC01`T3CB(MHHADRS!NP/ +M8\%,$0L+$8^H[*U"57!HN/W5R=>:ITG\,>E:WDYRKN=+>=8W"G`UAJB&+#7,C'^Y +MT['S0T:G.$&\N[,=\'D?3OID]]3_`$W9I['\[M[MT=W[@'6>X_AQT!:UHVGC +MQ+A\#3H-X,^"/7/$KA-N`'M;E!G9YC,$I9N7 +ME/4Q&EKK135BA/.\R*<$MV[9[;]^_$?C-J&HXN:5.8393;2IO3/*BPVW4B5U +M#3I35+1K2QO)"#X`7I$6'V(Z&5&P<[YW]>$,VJXM(*&QVQ((/?\`._U1M?\` +M1]/6 +MGIO0-IFUBP\P%66;Y.CJ*FD61>CK\-GP`R^A*_JMO7\^!L97ZQI`%T17PY++ +M#<;^?[J`YW6ZJN%C>&9Y8KA:6CJGD*JA>E=U@D)`QO',H./8G@79[PVH0S3? +MW_X0U9O;D:.GSU]1HJ&4#PT6I+_15,3014ESC^91,96%Y6C>5!OE&2H=B",! +M@?<<6AA.03O_`&^R`Q##FANL1Z3]$DM`)5:,6MIIHJ>HNEAN\E,8ICL6C:=? +MPC<@HK^OMP?C6![[Z.!^B!,7Y/'.,0'&H]IM\@I*DEM_P#\3.#CN3W/%IQHZ[#4ZD6B%%4`WKAP)COE +M)'GOIFJMETJ*6G99*.V:AK;92=*XQ3S-'6PL!ZJ4E;'MQ.[(K-KRY;'K@JA.?<\$O!+M=$^]EI(CW +M]U)QT'Z/MU/,:&@JJ:5NJ2)T++,!#DJP!SMOVQVV(/`.)G-E,CGP2S1D=D7* +M`[C4P6NY545HM[VZ=^BJ@1:B0I,%,GF5V.Y*Y!5MQD;MPNO0STQUCIBQ[D*` +M`"B\53'4FL-0K-ZCY<7Z@Y%S:?UC:X*>IU1H8?*5$TIC%0: +MNDBJ8TZL'HKXHIHI6C.TR2(3T,!G&/?A<6*I$M:?E;R^20\LQ-"UC-[:02+\ +M08B=Q&\);G@FL:<^K9CC:WK:.6;DM>_.>VW?6MCLT +M[V6YUL4FHKG5"1(RI2:HC61B'(&[!I1@_P!TG`R3Q8MFUFT7DS%@.\"UU%XQ +MKJG8U()]_)4ZJ=/UCP!:F5+;TCQ2L\J*5DD&,$*21MX0[9[['/%P9B6WB_FJ +MJ_#Y==5E112V^/2572W2W-6^!-$BI(,31_,,70END,"'/OV`X0Y@=F:1[A.- +M<:8#@=$_9+30"3HBW2MRT +MM;:^WWBQU%ZIKM;8OTA0(:&:*Y)$"5,<;PU"&4Q,'0KAR0K(1L,AUZ51P+7W +M!L;VX@Z6G7=N**HUF`2!!W?;FFI:K9RFU0AI$W\K`$K&5'5J<-K,L.,>ICUT/)/NJ-(!8Z#Y77?-KK0^D:B +MC-MT1\3U55%0LGB:VH8J:H/H\,JT$A+&-Q3` +M0"3Y_=-#3/Q":GI9FDIM`\ZK%I6,EVEJN8E+2@DH1T/*E,)JEB1E8D))[8`\ +MP`K]',+!B)[BB6[4KN:`=/`CQ"84'Q871H(1;:+7-EBQDT]%?:VM*G``,DB0 +M+YL`#&XVP"0.!QT:HM`;D$<[?,E.#:S[@O\`_'[+]"%6`!P-_H>.MP2N:2OK +M-D9*D$=LCA,`%8NEF`ZSZ??;C&@3=82NMF4J0<'WXTMI>:H;R-D]N!Z^DIUC +MMP5$^:1/C3%E\H)!S_+^O?BL8]MT?3IZ<2D'*/+@'&0K=1632FF[9->-1W.KCHJ"DB/GJ9W.%49./_(W5 +M(JO#6YBMI-SL]@^%+ES7W?/$BRF(@*._6&`2L2U: +M>J(NA)9!4M$&0](R&WR._MG]_#(HD"3N1GZT.TWIE:=H8:BJAC6.IBJ^CK(< +MDGI]CZ9]AQ%5\0QIRC5!XBDYP+M6ILU>B8[A;ZAZB"D%5T=(\N"-@<,<[\0E +M?&D`N.]""D,XB4E`JL`2H/^'Z[G)X9I[2$&%/40&M`"YT +MNFE6A+FEIY9`%_;SEA_C.!CZGUQP^S:3LN819-UZ(W8^@X54Q0,E%LP\/RN%P3Y:_LHS7STE?<*2ZR.!076W&2Y1@> +M7PZI72H(!_:296/<;LG;;A&%J2R5;]6[RJI\%R<8R244X]`AXM>`KDM(\4#C*);#A9+NK2.IY@37 +MJ!A%0Z@M27)5+962MA4JX!QLS`*?^MN)D/=U4;V'T40Y@:`(U^]E;?E%%2:N +MY::VT@M0*^6"F$=,^Y9@TO%0V]E8YM72Y^A1^S2YCLG` +M3[\RD+=M34UEYX*KI7BJT;T\LRS`GZCOCB>PO\` +M$P[\.3Q'/<1Z0@ZV&<6GOFM*6ZODA\)B$$CL27>JM;O!(/IU +MT;Q/['I'`FRL4&UC'?X.^SE+NI@@N`B/L#\Y2YL")3TUXD8W +MQPT79&.8??-1>)IN=#M/?W1WIFT5U+H_4%CEAJJNVW*E_0[SM*VS?VB<]MY!?#^>5NG5H;EK* +MOO1L=NJJM$DJ9ZVCMM.T<#2QX""06VB#A%SX99222.+5LK",KDLJ-L1)X_$7 +M$SQ$B%0VXRJ'L>TV@::=HD:=[G?.RU\\^:%+5I2ZZ0HKTE0T-=5M5U%$?]V> +M;Y?Y*:J1,,R@>//&7&W2X.,]JK@'5<+5#A=ITW3>0/16M[6XFC&A@=XMFCND +M3QE:Y[]R[J=-\M+V+I#55%QM5[M]SAJTE;HJ('FJ:.?J8`CK`GI68'.5;8C! +MXON$VM3KN&4P3(CP!^8/DJI4P%2D2")'$W8[_NXE*+^TXCE\E&UF]F3I=.'6%/)!HGE_1US4]PFM5CT\*B=9 +M<2.*^GK*MAT#D$*1H.:6M=NO\`,?F3(/4<..!L17_BL>VV9S.X2'R.[Y)RG3LZD1>#Z" +M1ZA*3F=RROCUNFM5Z/N=%37*XVJJU=;*1NI8UO%,H%UH8""0/$6)ZU$!PR,` +M`.H#A_"XH26/&A`)_M/PGP^'UT0M6@Z);8#WYQZI7V^V5^IKO%/-:;3<@>JK +MM];$[J]*7P4ZS&Z]?3*2I=&#JW2_9F(><<@RS''G'W'U"U2S%X+A*:=AJ+K= +MJ"LM.L--V^QW*6M)J;K161JAXI,$2/)#(.LE@&\15/42H=#U@@@8NF&D5*;I +M$6:3`/CNC=Y'5$85KKAX\?>JE;ER#YM4EW=Z*V6^[104_P#]_0ZFI4I32D8$ +MD;2LDRJ5P2IB]>[#/#=+;N%`#7DM/!S3\_A]?`+>(PKP9&AX'=[W(>?DC+%@-U,M.A0G)]#[;#B2;MBF!O0PV2?YA/>2OTQEWST +M\74$"Q5*!E?&VP-E'OCC7);YK'8^8]603].$P5D7E=;$LI(8`D`_?C2V(T0# +MJ-5,:U#5/)/)3P/5Q@[^".H_F!O_``XJVT06B0CF +M`.T*KU\K62$I'0U)D'_\IMNW?V]>`VDE/O$F2-%LK^&JTZ>^'OD7<_B#U'`O +M_J#JCYJU:>9PA>UVV.0Q33PG)(DF<.O5C(2,=@QR[MG:(V?@.O`FH^S??KY< +M%-=%-ANVCCPP_`PWYGW;N!XJDG-+GE<+_45U?2RJLO44CFFE++'Z@`'WQZ]^ +M.%OV'B\;5=6>;E>E<-1H4&BGPW:2JCW_`%O<-3UP>JJQ+6NY5')Z3O\`7U^W +M;B0;T?.%&:-411KL=+6FP0;3:3U!)_O<2&J4N&4@]72V^`N#W.X]O7C3-JMI +M]EX@K5?"MJ:%9\5Y:U5)@N,<@E.4+J0VX.-@/7.,GB7PV)HU;M*A,7A7@0!H +MF-9&^?3IC=IB$V`W(/BZ(XXWZ1$P`(4DE3TG))S@_F<\'LH$D.` +M1!V>V[:@GG[\E7365'!%!<+?;8$^1,!CI$.<4X8=?0/890@#L,8].)*E3[^(#Y^!,^B%^9.C`VD=`7JD2.&2AO5TTW +M+3X($*RL:V)<>G2SRJ/\+#U!X9V3BCUSJ;M[6F>ZQ^B(V@UN:09&OAH?D/-. +MRW30W_DIIO4%4*BMAHKG;JNX,S=0\.1&M]43]#T02,>YR??C&4RS%Y9U!CT< +M/64H/EN5NH'[CQU^RK_3T\E*9;25\6>&0T3](Z1(R"4.1Z]^GBZT8[1$UOII*VVUESI>B>FAIA.5!Z60-Y!W_`!@/CMVZUS[\+KT3`@2F +M*A():_W[^ZK[)<*V>AE@6$5-2DGB]$C$`=#*ROM_=8K@]\D'L!PSB*#2&U`X&\W\9O[X*0P@`HN`WYO0SS4%\>7,:NU%\3&AZ^JJZB72^FWCU +M4U5(H\>GEJ4J5C=@N5\18TC?K8=3#`&P!XN.P7@47/:9<9;RM!/V5/Q>&.5M +M(#3Z:^L]T+5KSTYRZDT]7V*[M7]%YI"MQAH8IW'C0RS2RS>*1V0>-3L5(S(W +MLJGBTX;95*NTT7B6Z7&AW1SL>Y0N(QSJ-2:0W_M\K)D:,U=8]5VG45EJ$2A6 +MK\8S>8&";*I*99$!'2XQO@`9)(QMQ1MJ;`Q%$]:PY@V(&\&^G)6;";795;#_ +M`'P2RYF<@-&24PO%-6RZ56M,4T56U0KT51.?*F)QLA(;PSX@4D8.3@'AS8G2 +MC%"KU7QD;B+C>=?.W-*VAL'#U*0<#'/[I*ZIY.7J\VFU6NRWC3MQKO#K$2?Y +MGH62229E78Y!*E$!(WW[$;"Y8/I*QKYJ,<)BTKL9S@&#WWJ/U=8&M6J +M^8M0LQL3)!G0&29^J +MC:FSG@R1'L?N@VAF`T'%I5C46D*8\I&YZ9)1-6RQR$'\15`N"PWV`[\&%T5" +M_7]@`4,QA(#3S]8^RMGIG6>H.7_P]\\4IJF=J2X6*U6FG$?G#?NY$LS`9M;?926F-96CF-R,U;JS2L%)I +M[5^E*JCUP+9'X<@L]5'*8*SPU95=:25)XZE02P41/%VB4F-JT#A\4VE4,AP+ +M9X@@1/\`<"(/&9WE&TW-J4LY$P+CWR5>.9--H*V:JAU)HZEK/]A[U3+J6T4\ +M)\,P0S=25%&"K8S%)'/"WE'FIR?4<3-)U8L+7_$TP=_H\,M-8_'E' +MGKP^R6YM,'L@_LF[8-962EE33]ZTON8% +MDZS7FJ,*HDDBF>*4'(9&((_=Q5MH2+A&@3;FCK$G\>$OOWEA +ME$@/KAL=CP3MS!BOA:%0:-D'D;1Z!='_``QQ36U:],_$2".Z_P!UI\U5S$OE +MSD>2JO/31,Q;J\0XQ]NW]'B*;0&5=7?6RFP!XH?TISJT11W.*URZ\TT]<24\ +M*6YP!PV?PX+YS_VX'Q&&:]L:A!'$!L%PCW=77LFK:66@A>EEI9*81AI,G\61 +MG'IZ$[]MS[\4[:/1[K3GW!3&'QS0U*0#P2K@:>GCE@@FDE:,R`$!&Q@?YXSCTXI&W:$O(TT4ILUW9@(]IZR +MEGB,B.4$DF21NVW8G;Z;<59M`R(WJ2=1&J=`C!488'<$@^^"=\\6-F";8@)5:L-YOK^R7<-PG,W@3 +MAB\#J(AD9(ZP<;X!P1D>@/WX3CL+#06C2Z@\<&@ES=')'ZD@:UU.L-+TV)4J +M*9IK"C<14):UV@W^4*GW,V@I[[9VOC +MRU3=-2Z-C(-'-U;=0."H.-C[J,[GAW!')5@>"C<2PAQ!ULJ[557I4=U'U'3E1GV"GOMQ7-K4?X-1CO=D[1$.!XJPFHM+17VC^(# +M0=/7D72G_1FLK8)`0"\$Q5L$#8%'$;'L01]>*EA:[F?IZIT,M/<1^R+J6FW+ +MZK/^&\TNLM,ZMT"\0AHK[;I*2F4MDP5,RL3$=NZRPJ?3'1WWXF]H@!S*Q^)I +M!\!^WS3#JN3M;@??S2GU'!\E56>LKB:9;C7TU?4%X\")S#X.6-+?9XWZG62H,KP0@]P.C'54,%'977&W%NV!AG-(:X?"YQY1N^BK6U*K +M>L<&CLZ=USZ?N5K[U];Y;]JFJO%P(K;-XU33APAZTB9VB8OZC*!3GML/7BZ8 +M9X93:T:V\_V5:KT'5#+1X<-X4_R3>Y:?Y@W*QW6EBJOFJ610K]+`RQQ](*YR +M,]!E[9#*Q!';",6T/:,MENBTLD-T1WR_NVL[/8;WIZCAI;I%1HQFL]PIR],\ +M:R/&WA[AT(95(565M]B>W%2V]LBA7Q#*E26S_,-9'F-^\%3V$Q-1E!S3>(L4 +M?Z:Y@\N]:U=DN]\M-+HW4E.D#W"F>@$Z1RAC+O5Q"*50X4L6E!'GP3D9X@L5 +MT?QN%=_!<:C9M#B+?[3(/"`1Q1K=I4ZC2TC*0/V5>=95=-662\UU/6"2EEG2 +M!I::J<]#JY9R\1S:+VF*ECKH/LJ]BZC'26)-R1)`UAGMR +MJ[05$,+'PPPZ50E3MY@,RD$[@;=N+`UYOFWJ*J,`>T-T"<',V047+"Q:*H(& +MN*UEWEKY95PY6*EABBAAPIZ@,F5L?WESW8X&P54FL7.M`MXS*_5I&YVX^836"/55`X$\#W)E7CEQ-8HZSE=076XWNU6ZMJ[OH^J +M$0G:>G,9:JI"X&&\6*!*A0-W>&=0.IG`#PN.=4(J/`#HAPX'Q. +M"%-T"[77'V4=RFLFGUOU+<[C77ZL2SSI-#3^+'%%41R2!6CE/G_4J&:4@@$C +M(]20YM%K\N00,VO'O'/<.&JWA6-(WDM[O)&>GZW2=B$D]H_15!49$@J*6/Q) +MY23DEJR4L023DE#GOMO@BU:55Q`(2J=6DP$[N'[HY&M8ZP)43ZIT_IBC=0T$ +M==='HED_98Q^1I)=U!+O@>90`,,JOT=CAP,ZH2KMI](!K=.7^%^BTK97J.2/ +MIZ<=%R#2=0=@O(\EK1^*;X7;C+I*[ +M/:JBMNO+^H?P/TE3*PC`."(ZA5WAD(V9&(!]"PXC,3ARRX^$;]WOO7=MA;=P +M^+_Y1%Q!!U'[<.2UXZ'^#K3=%;;E:KA8K7?&\,M&ZQ#Q!]3MOG.Q]Q],\%X: +MJUS3FN4?CQF((LN_E1KO77PQZ\IN7NL)KU>^3MTJ%IJ.25VF?3DS';I8^8TQ +MR`T?['XEP,@HK46O%K%1CW/H=IMV\.'=RY+8I>;I4R23TYD+$AL*IR-P(Q$K+'T]?X=\9R.P^OIPNGAFEA!"#VA4 +MS5`MF>EJKPJ*!*A`>E`I!8>H'?/IQSW;-$E\M4OLL61E351E62-9F'DZ$"'# +M`#Z^_I]N(8X$@@J8-0P&PA*YW#KI0:DY:+`"CL6]#[^O;.WKP92PF\I;&EIL +M;'Y)#7Z=Z@RP.*40!3PJC+;``+@ +M$C?\SZ?EQ/X?"P03HA,1B6Q&]`YN[BN^>J.J:*)&)P=S@8R2/7(7\QP]4P(< +MTL.]1]:K-T%ZS^7NELI;I'+"USII"5+`E9<@E@Q],Y(/IYB?3B.;AW47D$=E +MRCF503D=[]ZCP5=+W;:6KGK;;5S304M;`&,WB(>E6!P"K9SG/$7 +MB*+J9@&PO^WPD").GV\%7;5%B2RSU]DNL3)13(45\DM&"<$H3^TK#!&= +M^X[CB3P>(E@D>J5BBX)0P[L/<@]+X'?)X?Q< +M/&8[X3`I`6'O_.BV&V&W15O.'EN98XA0:KTI6:AXF*YZUH$ZBWB/W2,C6\_?L>"87Q0Z4CCN5W +MGMT(I[/)5M=[?)&N`14('9!_@$AFQZ[GOCB3V%B>PT&^[R0U*ME?VB3-CX'_ +M``J<"L6F%(7D96ED1]VZ?U0<>+G&^#UL/LI'KQ;NK,`;A*>>;DDW,^:%[5$) +MM8VZHF#,*=$BDCC_`!%DBD"L#]5P<>X)].-8^J&4B!JH\2YQ)]W%E;'0.J;3 +M:N6\UVK$BCN,.EZAH.EAA/F9ZF$.C!AO[%N+7L9QJHZZ*DJY,$/T`CI<@=P8S(,_3?A)B,O%+ZD2YI'=WJX]A +MYX:TYL-/XLHJ[%<*D.5.)9%,+MN`3@])/L"1DC;-7VK4<&TQP<%*[/AS2 +M=`1;UCT5,4L=/;-0ZM6XI'5(EM_1J/44=AFGELY@\*H"Q!IJ.:*11XCKC+)AF!8$91 +ML_X>#ZM9PASAVE#T\&V&DN)U3QV>#$B]TOJG31_27R-LO$URCE4^(8XSTK*V[(F#NJD](;'F` +MZ@,$"*;4I,5TTU.!T2"L!5Y*2) +MW7R.TZF:%L$).W3^"HER)2PH<34:)W.[MQYP+'B.8"#VB#3RTJMIN.\>_DE; +MK"L@AO.F-?VE'BTY<5>X11^`_135(+"5`DFP4X8J",JK-&=XF/$S0I7--VHM +MX>_OO57J5,K@Y!53K:T6HFFM%'+=9F19(:FI`6G6'N/&8;OC!4H#C*G)4;$N +MGAB>T;?=1[L3#^SYE+BZR@*H-;2#1$0$"^J*KM!LF)1],DWBR14TW1@;2(._;?@=@.A1+G@B0NN`4S.7BD\+ +M'=&['\_Z[\+IDZ0F209A6CY!Z>Z[I/$RTU3)4P%I*:I198)8F\@26-LJZL23 +MTL",+P?1>YOP:_NFZ)+7RTW'^!YSY!(CXR?@^TERRUGI'7'*&.B@T/JBR)>U +MM$4Q=*&11TU`IR@,%W&.%;5V:QAZREH1,>]V]=*Z*]*:N(H!N( +M[3FF)X\/>]:_K[IK3QC2IN5BI:MQNKE=]CL<_GCB&J7&8JW'$.<;%)[4U[-2 +MPIZ"UU/ZH=*^3;&,8!]._;@7JBZ\(AC7,)#2I3E1H^^7*]&X&@2F5,!4WW.> +MYQVR/XG@7%OR4C%B5MS6O(#M?5;$;9(]')34DTD3/L&(&5!`W(/KZ<43%B7P +M5+;.):TJ7EN!6F$:!BWF5"6[M]<>F_#%/#EP4WE$RE[>J]:[@T\DRR!8P&QC&.D8]3_GQ,82B`_[^)>G0BZ#%:224`5CN49'`.%R3U9+_3'Y]_3A_JCE[00IJYCD +M&_\`RAVK41!G3`#=2B/()9\8&,_0G'UQPWB\$*C;E"NQ$F`D[54C5C101JU/ +M5>(QIW/F19`"`-_1@0I']['?B`QN#?!SB0MO<-=Z$M0V>+5%ID1X)([O22]- +M13LH5U(!4E,9ZL'JQZ%>E3N5/%=H%V'J?VN1#H<(=;A^_OY)704%10+7/+_O +MDM+;99BW4>J2#PBF5'JK +MWF:&WW-7=Y/1%E)8!@?02^*RGTR1ZC@+`UB^D6-^)NG=_BR<`_A@Z[O$>QZI +M_P#,9[?K?E.U0ZU$5?98%6)DW1HF:*5"Q[,A5ZA0-B#(#V!X+V94ZJO('Q#U +M4=4::-N_]['V!Q3CF`XF? +M?OJ'=/4E+>[9XZ!H):@8F253A)AU*P)&<'(QCMGBR! +M]X]PFV!V4)A6/1%=)0W%:11+#-3]/0@&2^+PX/%9(JF.0N%7(ZR1`B]0]R1Q%8^BY["X\0? +M+_*'PS@T`-TC[+6ASCIS!?>8U'32+XSU09GR3VID922<$@F0MDCL.)*DX'*8 +MT^Z):Y_5Y?)5HY;U=]ME0U53B2ENJTK;:?-'JNI@2NIH(IDC+2J0"TC[D8![]M_7??<\0F(EA+3Q5JV:" +M]H)[BK-6CX?A-I"[ZBAAEBIEI^NK_6>657&0&QN?,#Y^XP?X<.8W$!C()1>SMEMZ +MPU(NEG\<8;0W,3EMI"TUDKST]A>LGD23)#2S8"HS89'"QA@4P,X[D#B8Z/T9 +MIOS7N/E*YO\`B#C0;@GJ8;K@R=3#92"S4>HX'NW*C-<2PYM_NR3=THJY(Y[/56^ +M$"F8L(H*@^?.Y)_:)SA@<8&3C@EL"X0=46+#HHZG:Q+"JK<[[25()$L=-2+4 +M]/MU-D$'OL?\^%D'A*:RN_ELOUGD&`O8?L+%.L5%^8Y)GE&`#D +MG.>*ICC#C=',<18I$U)_=CMC(/`[`0)1+AF,A1B@=08G`]3[`?\`;AW492AA2F8!V/;8R$@?3B8PK,TOT^EB@G%^ +M>&Z^@L;GS]%8KG[RTM57H_X&J&S1U$UN:CJ;9`E1GJGHZ@.RROZGJ!#@>@;8 +M57*2.&7J);.=CVV +M^G#]!I%E+57]G,+>REY?ZBG\82(5D`7KP1OG[>AXFL-AIARCW8MP&4:I3W>I +M>7Q9(B$._4`-P!],[GB1I4&@)JM5,W2ZKZB;Q_*ID103U>WW^O\`7KP72:1H +MAJSP6W*&JB5WC9)NDR;$AFVR.QSZ4'4C;DR2+CI!W(ZG3J1@=FPIV)QQ0,70#*II.^$HRB8^+Q^_ +MAKYJ!K]-QW!*^_4$1IWJ+>\512@$=)=HBY4#']W<>H8$9)/#3"YA%,Z3\I3S +M1D.4ZB$_>6JFX\M8],2R(*VAJHZV`9PR/)EE(]B'"@D^N/4\1.V&7%5ON/V3 +M#634CB+_`"^2^_$);AK/3^C>8%NAEIZJ:V9#$9BF967QX64#8JQ8_P"'K7B' +MPK&4:CF[I'?=/T&`-R.XGW[X($T!K:]VBX4NF[C45EPT[54)$$3[KY>@AB<> +M8A%8,#DX`]."7X-H!&^3!3-;-4:7--Q$^/#Q2EU?IR6WO)'+%`1%4M&A1`%F +MC!S$ZXVW0D9'JO%YV/5S,U0&*+9S`:C_`#Y(6N'BZ>.=&QM& +MZ2%E!/TZ/W;\2M6[;[OL@10#SE.A63S`M7R-3K.R4LW53I4O*[@84#9D)QWV +M.,?7@(/[5.4RXNR!_P#4E/I&BDJ;'<;_`%+X:H>:4'8R12.P*$>JXP,?;;L> +M)-H(>&[@$,UP!S'DLN*BBL%5^EDQ26FX2JLP"E(J2OP,@')PL@Z6WP,YQZ\2 +M=-YCLW^?^`E9`UQ&[W[_`,JTW*B))VZ)T4*'/E!P",=Q]#U'@;$5>S`4Q1HA +MH,G.,G,=2_A-U,!VZ89)ND#S-XF!WR':H# +MZ):>2@\12TR6CPM>WG?P6OWXD&GMO._5EOJ%+134U&93U]8/53J%*[#`"JN` +M=P!CZ<'46ES&N")PF0LUWGYS^Z#+'IQ+1)+6(D)! +MKG``IJI19'-,33*T;:BM^Z$^'>X7.&1*F&X0BF6-SYD8DJI0MZ^H&_WP>(G"5"RF7#>I +MZGA)Q#6-$Q/[*LO*^CM.G:9KW<*:HM\\BLS5$RGIAC&[,<#&,`[^V3P+B:CG +M$,B2I)F82YUA>_W6F7XA]:3\^N&VT\M')%BDB`2(+(04!; +MH9]L;N?;/'12FH:Z>JC7&?F*M\HIU[M_[*.Q!=D)&^->>G@;GNA7=^*_G +ME\/_`"!I]-5^M[V)M06^D6TZ5LD+K-44B&$Q?,LFNQ'"##C!3;W'4E +M?TM91U=)/&[I_A!.<8/<#WX55IN`A(9:H"E[<:MXY#&^%!8@=1V&/Y\2V`9, +M'DBL5B#E@#@ES?9?$$DE/*_C@@#I\OKW![?7BR4J319!MK91=!M9`,9 +M4YRV?7@SJKV";J53.:4%W5XE\&4T\\GGW(PN/8>N.,RN-R(A,!^:9*#ZJ-I5 +MD#IU(1Y549&1[?4[\/LI9A)2752/A-T.UD+M&J^%]-^Y;TSC&_\`IPZ8`@"4 +M,VKVKJ(GB*)*K/(S8V)08'V]QP._6R=8X%VE@L&V0@54$55)*M!.Y@D8;>', +MOF1@??8??'%3VSAW.&9NH@_1&,>#:+CY$+LK+<:&.XT,@8TTLJ)A01A"V>I# +M^RRL`0,_8=N(*A4[65VMSY>[IX%SP'#V?\(LY;ST\=XJ7J>F"Y2T127H!"O- +M&R2HX'[+$PAO^K;'JK&T0:<<_0V*9.91E,>@;"9VQY.*W3HRR3K<>26*HS@\8]^%TC:_3U/!4O3)*D,]//)-1] +M.#U)UY`(&^.EPI.Q\O$I3I"HSM:K=5Q!EMFF)^?G(]5)7G3=%?#+0!YR]11Q +MW2ED5\CYA4`G1:3-79I +M%9XY8)%9G7#-@])`W_>/3Z_?BY4P'4P2@*[[W69IJU4U_I9K%5.6I:Q0DZYQU +M!V![D<2&%HL55+RR2=/A^9L^5LQ*2??A^N&M9E-DAM(O;QN1ZS]4^/B4Y(ZMO>O=0 +MZNH=*W*LBCMUL#G?JF5:*(2E5`\V)`_UQOZ'A6"Q%.FSJSSNDX;#N=3#@1OM +MOU/V57Z>\T\-KCMCPF*6!BSQXP4R0`"._5C&_MC@JH_=-D4:#W.DB_!6%^&G +ME+6:UUO172HHY[=9TDZ?$?*]63N5S@YV./;'$'CZYJ'(W16_`87J&&J^^2YQT^Z5.ZHX&B8+OBY-.[O=O_`+>]:DPT5/)!(*Y7B550F-7(8_M> +M@]3WXMK1.ZZXFXW@%$]OO$T;K2,T]9$=XR\C+W]`0<^I`W]>$0EL(1?;+W2P +M24M=5376N#UO=34M7'66NKGI*RF4(5># +M_$+U/T/V>:.S*+2(@1W]HF?&1"J +MQRZ^)=[#"J*"I(7<`DDYS@;_`)YX%_1=H60[JEB2L6KJFIJJGJ8'B2G9F.WH`=LG +ML#CT_P#)*ZHQ!2!4T.J&+_=W4ICI?`(!P/7OOP=L]AS61+B'-,60555@E@E' +M42R'I`^G^0XL=.G<*-JL(=.LH7EF\&=RW6C'&Y.2#[_?;^'!S6B8"VYQ/9W( +M>JKC$?QJ)2V,-Z;G;MGZ\.&G:"D'#QVBH6KB*JF"K*>Q+=_^^_Y<*#)WH'K' +M"2$/U5,6IR"&IV7L"02H_K/&G#<2GA3,SJ5"52-*"BJTKC8GISVQV_A]N&*E +M."EAG%?*>DB+?+31R00B=6)4?A..D_3U_,9XC:U$/,GA"?SEFF@"/[=;(*ZA +MN-+<&>"24&)6`ZU=T'5U=.^0,(=NP8>_%!VGAWT:S',$D7/<;(R@_-2.70E! +MMCI#0:CL,TLD4$GB1P2MW7)8J6^QZR/Z!X.R]7?ANH]K*H,VD'YILN,&;`; +M_105HNEIOK:GM]OBD,!H#3VV624(T_RY1_$F+[`OF=@=NDR8V`VFF,@W\>28 +M#"&ZZ&_[+GI^RUEMOB4GTSMML!6L(. +M4W5FITWAHRSKXHTT/K"\5Q:.RT@H2.EE(C"*B,28KGQGQN%C!R?<=([D<'8'" +MNK5,OGW*N])-NC"4>L%]S1Q/V&OIO7G3U'<+A?;A<[]>;E/7WVKE>JJZB9\M +M4S,$3,+;0)*>_P]U]9;M:R?HYY%K`D-4G2> +MD_JIE)_^+-P70>0[,+0A\02)RWB_E=5_YR?!)K'4GQ\47)*BM5!)R]UA75=7 +M3:HN%),]#;J&GIY*ZN29HBICJ(H8Y550REV9"#@DA%;9[JF,`([+C,_/Q\KK +MO.!_$+#X?83L2UW\6EV2P$27&(-]T23K8&RJS/\``=I:VBOOJWRY-05!IH^MP2<]11\#.P7/J.!F;/8W+)UDCP,7[]R'Q_3O$5':7$`GGK94YK +M-"U$][MM+*2T+.%>11YF09V;I4`G./*=SL>&J.#?4G()_;]E( +M#I#AZN5F*[).\*0MWQ.V_P";J+9JNFKM.W^"0+54-9`T4L4G<$QL`5]P=^_L +M>`L1@"QQ!;!"0]F9H-)V9O%6=T'S2L6JX*:"AKHFR#ZYQMW.=B.V^P_=Q`X[ +M#Y''+9"T:VXHCN4AJJ:5"5BFA;*`$]OK_']W`V$I$/NI3#U]',C1 +MD$Y&P'Y^^>+/3DC@4IT`DS=15PA6)6$4T'F9*$U +M,K,(W;*MGJ``&!Z<.0=ZW5J29:L@THE.8RJ@MTX&,9S[<.M,(5P!D\5']**: +MD]74H(4)V]?\M^&W.!,E:S%MN*@YT>$-(WAR1C#!"-QG_/U^W"7IVBP/:0;% +M?$;P9W"]$B!"3D[GOO[>G`;G$F(@)=6G`D*:_2;4M9;S;7D,$,@GSU9)+!`6 +M7/ITJ`?0\06.P+:@<3O^B*PE5IAIYKA+224=]$D<(1&*:"R9M[NF#8=65JQ76AN86:.J#([CR]:'NN/4 +MAE5@?3@+%82'6Y'S'N4#UF5K9'L;T+TG6@2H\)5<9C*`9\>%L`YSVR$/?U&> +M(FM2#*P.[Y(U\%I&LK#J:.*TPUABEQ2)5+/"X)Z9,QE5'Y@])'IYN%4G.&(# +MCO$'SO\`L@ZS,]/(!)2RO%T^1D>W,5JJ.NZ5C#'/ARKLDOITGIPI.1L6S^$8 +MM%,AS)8(N:&/Q*M%WHWM-YIJ:)DJ(*JBKJ:FF<]*D5%+.A8' +M^\IZA]&!^G$ZV@YQD\OHF6O#?BW>_?)/'DEK:2ZZ3TG#I9"138;D?RV\DV4L$EF=KI`D"6^*&42EESLQP"! +M@Y&YS]0I]^%`N0%5K7`VU(_=%.H?T?>X8ZJHIC`\U)1N&"[$K%X3X)&V&C/U +M&?KPFI7J'7BB=D827.`W'Y_<)&UVFK0D\E5*8U9<@9"G)';./N=SZCA3'$V* +MLP:VG`WCZI';YD +M4>6D;`]6P"Q&2>+?A:`ILRA<4VKM>KB<0ZK5/<.`X#W?>D9>:U?P0K!%$/10 +M2?N6.2>#:9*KE6I-RA6BJNF<^*S2@_WC^'[?PX;<."U2=>%GN`:H/$H<.<8] +M>^^W[NW#M+X4S':A2T,\:2RJ"44G*;')'8@]N&!*KX$ZKI?8L^,CL!PAS=Q63*C)R +M&W"`L`44S$OVZ?7/OP@+9*@KR[?*2#&X!&W<\(<+2$XS6ZH[S24/53$`=6^W +MH=^*UCV]I'L<8L$B)T8%AT%`F%/R0("BI`N2"%![@_?Z?E_/AZD7#3 +M1-V5_O@SY1:%-!J#XA><5VN=)H&S51M%JM-"_34ZCN)16DB&,-X:"2(=*X+. +MV[!4(:7P]!C*9K5-!:.)]V\UK"[/Q&-KC#T!;>>1'H(N3W`;U;OG1\6'PR\F +M[?KJCTW1UO\`MM=4>UWB&AN6,I,1UY1'5>J,RKC88`/`FU^EF%PF=E, +M9WS$#CW\OFN@]'?PMQ>->*M7LTSVI-IX<[K0%JG7&BM67"ZU!YAZ@Y6TDCDNQ;!.(JT>NJF`&@D%]1T``7@3O.X!:I^>6JVU_88K/= +M+!IRBTQ%+-+!85I5EFK.M2OS%ZK0PDK*OIZ,HC1TL;CIBA"H"R<'C7_J#4ID +MD<3O[FBS9\2-Y*$PO02E3HYL9>H[4#X6_P!H.K@-"2>UK$*B,O(RZ!(+=::[ +M6-82PZ7J)C,8`<92)G!=$R``N?*OWQQ:QCW.B;J)9T>PU&7AQ;?BK#)1L@+HN1N7S@COMC^7$=M`TRW2Z9?39#BTR/>BVJVQH +MKE0>*N4'A#"GT`SD#Z\0``=VD+3[)B5QJZ`0ADP[,R!E/N._$[0$MNMFH220 +M+(3K[;),[(#X8VZL[YX(IM*?HO+1S0:Z3JTTA,4<8;I;J.6(S_YXH^GY\9&]*@P5'RS0HI&4 +M+[-U`^F?7]_\.$D`)3*;G&0%C4]5%,U.DBM+*0%4`Y+J!C&!PT\P8*55I.B/ +MY25DSTL$D-2X`C`CZ0Q8]**=L?O/[SC@"M3BQ6Z)AT`7*(9*IYZ6U5Z,[LL9 +MC<]/2P91Y2P]2,G!^^>(04FA[Z?B.]$.CP69#*9X&<0NZL.@+CP`'I@C)"AO7?B'Q^SY;FX)`JC-8J +M+NER@K;3X-?#%+;:CICBDZO.CE`%)&>RE6!R,$-[\5FA0<"029'R13LK1+-2 +MJLHR*=@3ARNX'K]^+A@`YQENBA:S0.TJZB +M_P#Z>AGI9XWG-52NQ19/-+CMT,?VE$2@#]I0/IQ(T\(6.#^]`.>YPD;D'V]- +M/4E5+:M562NO%MJCU4-PHY2E5:ZI2<21AB(Y8V_X=0=]QN(^G(_1!?+[4NH^7%#\JL9K[&Q+Q319(B8L,EEL'Z<9BJ`> +MZ6FZD]G[0?1<9N/DK17;XK-/U-127/3ED:TT%#IZQ6KY=2SF.HIK;3TTQR=R +M7DADF^@D`X=QF$#W33$`@?OZIW9FU64V9*QDE[O_`&)'H?12%?\`%_)!!<*4 +MTE76,D!IFB,>5/45[$[8ZB>`_P!'"74VFPDN;[U01JSXF]16S2.GKYI^.>I5 +MZBLM\$4CE"KHZ2C!`(_#)M]L>F.$MP:;PNW!2+GY9F/D0JD:X^)'F[J +M&E>FI*[]`PS(6G^5<>)^+MU$[=AZ9[]N#*6"8#=`XSI)7<8IG+\_`JI5PJ7J +M9ZB2KGDJJAVZI)'D+.[?XB>_$UAV$"2J;BZQWF^\H-N=Q$/5X`5G!P"1Y5/^ +MO!S`#JHBH;V0?53,4>69G;U);U.?;]W#[0(L@W$9KJ)@8&1)-\8WP<]MN&PW +M=O2,XS2%.+*B@R85G0=(R/7/?^7&4S!@K;F7LN`J>A>@RHRJ"$,G[)S[C^M^ +M-99*2X`#DIZDJU:/K>*2+/9D(8,/K]1PES"+!+IO`$K]9U<@=7KV_P#'$\UT +MV*@\H6+42>S>N?MPV\\DH!14C@@]N^.&8!-ULRL-P$7/2_#\&(6W:75C:KFG%I;X8M,21K5JNFM1W>KJ9%! +M,:O/#')!U@;Y9B1G'_*._8<2-;$%N$#@/@)GQT]?DK_T`HMJU:E`6+H\MY\! +M(6BGF3SEU%=[G6FG-9T9&9)'.6_O,1ZDD'?BD8?9P+L[]5Z2JXIM.GDX>BKG +MK'6FK772FEVJ&%!?-04WS9&%65J2&>HIH2Y[`SF.7I_:>",]T'$U3ZME"JT: +MF/G=<\VYC&G:.$JSV&%Y_P"K*,I\+PB;26GI)HJR:XA'EZRBQ]65C&?<_?UX +MCZ##!("5M3;QJ.`8;?-/*U43="_*6KQ$`"G!R0?N>'AB'#4:*LU:LN@.33I= +M*FI@>::(&;+'MC'8#'^O`&*(""+I54Y8O(609(!;.2,CL.,<)1#:+A=IF$+25"?-R0 +M("DY3\+-W`]?IPISDCJ(;KHL6J4Q8EC`(?"L"=QMMQ@A+IU'D92+J)N!E?YA +MU+I$&("_7`['Z<:A/4']J#JL!*EHQ$[.P&54-U8(W[G]W#3A">>V=%(6BJJC +M15#U$V91YIE^72:80+*'6,@$$L._ +M^7Y_7@;$T63FC5,MK%K2'!$%-5.6$Q)B14($;;"0[#'VR>W#):9[*%=`$C11 +MMPNZF)HUCA,@RW5)U.05SV&0/S.?;[IJTB1HULU'BGNB7" +M*6(5,40&(8'#^9,G!+9ZL$``!NYXA:^S&D2T0="GZ>(S@@Z#W/RL0_0_-#8OX>PDFL2PU +MJ"$B'PRBPD';ICQV_P"K;/%D93:XP4&T$,ANL(LHC2&NA^W`;62I:H_L@NLL;6-MI8N6-FI',6AC[_3] +M41]\[\-"!6F-1\C^Z$J,B1.GW5:;W+1.TE-/$&`'0DRD]:D;?A_:^VWWXD:+ +M)4;6)!U2PN8DB4A%`SG=AW^P'![6G>H[$$1;5`M7`K!Y906`/8'@@2G+ +M5.'HXWRJ2,,L&)'V/#5;5+I3E$K];!22I!&3]_X\30`G513@L"I;\72"<>_" +M73-UMO%1Q)P,`Y]03CAEW!;6+./*<%O;C'-A:F$+7'\AS3W)!M/)/?D-3Z#U3JF;E%S5M$]YY<:P6.SUWR\A2IHJC+&FJH'!P'CD +M.^0058@CB8PQ9!IU1V':_19A]H5\/5;7PSH<#NYV5(OC%_L^KW\.VK[A)45D +M5VT?)._R=93L6\:,@O$[D@8ZE.0!]?;B*VILCJ.V3+2NK[(Z:5<8S+/:]Z*@ +M5UY=VR_T-=8:N@5J*3#,#^(,#E75ANK`[AA@@YQQ7VOAW9*E\0>M9#[[UAC!'I_KPS4K0,IT6LL&4>54L:1N0D<2J25!.,^PX&8X%T!.N +MH]F)0G)UL\Q*]?4,`KZ`[#_7AUM*2MN!9&58];4@2.SRD%0,;`?P]>Q[\%8; +M7N2\/);"!:^J(J'_8<%R1`4CDM`N4+7&J"B>3K&%)"JSY.<[ +M%N%$D7W(G#-`@3KJHT2(%62='D8G(QG(/8`D^G"RX+8;)(!49("IS'*I\Q8! +M@#D?3;C1*W4BX73/4E8A$C`Q[L%.^6._;;UXPV"&ZR\E1Z>%-1U2QB8[Y(9B +M""?Z/#3A8]R>DTQF*QJDC*Y[X._Y=CPQ2.@X)3ZY+8:7#?,LQ498`=SO[=SMPH-`368 +M$6"6-YU2D=+*QE:*EQ^(=R`/8=V)('U)XRJ#E@[D-4XC>D?J#4#3PU!J/#B" +M/\Q"A'5TR``$=7J"N![%ESVQD8-!0[J@;?V4C8;]+/>J74C3>)-3PK3(KLV5 +M0NY9#[]2,"\%E=6:TV$B4+M)YIX9[P)(:;>"@]6F^BPMS"(E;!SME@<=^&WM(*R;J.;`Z_P`17[^O#6:Z40L:8%@0N"O" +MG.BRV1O0Q=8G:GD.W5PVX19+:J/\U4:.:;,7EZB,Y[?U_'BM;1%X*(I)`2DR +M$L<@Y/[\<1[$4^EFU6,F.K;.<9/;?M_KP0"6&=R1E@%'O+NM^0U]HBN,AC6* +M\4;,X[JOBKD\2!$@)@OR"1N(^:VU?&SRKJ]9_"[I&[SBF#P:?I"9)]BS(Q*, +M&_O%,#'UXF=KLG`$NW#Z2I'H:\,Q36"]S_[%>:.#1]SH9IXJX15;JQ4%5P!@ +M[D^_;WQQR88D;UW6O@VM[;;2IJ"U!4$:JDDC'``&/+]>"FNAMBH:I2>7$"T+ +M+-KGHRP4]*DGR^F!L#GTQ[<#YIF"GZ=(B'$*(KEJ`HZ.EE&-AZ'W/T]>'V-R +MW"4VYRJ-5NF"0,K.AW4J._Y?OX,I`0FJTRH:L45$8Z6"`'&6.!G_`,<$Y835 +M&IE-T%5<<4,L@`,:XP5/O]/IWWXT*EY"DJ.(FR@:QNE(@DQ`!+=);&^_KPNX1C'R3&JB9JDI*TB.@=UZP#N0O;/[^ +M-H2H+7*CDJ(5B<2NTH8D$]1V7.^W\OSX0!NU3=5\.L-%\H.B2:6E<@2@$(6( +M'2G<`$G?OQJVD62,15)&8:?=0L;XA+P[QENLRLI:ZU&2GJ&BBG8MGIF#%?V1G?(!W(R!D; +M^O&Z=1I`+=Z(K/[0!%TL:ZWW_4=_M6D+$E777">2FIQ'#)XM36:2OKJ2CNEPK)*B:HHJ1I*:&0,Y8^$2K2QC(RC(2,G@+:3#^K?+B0V +MT^2DMF$5,$T%H8'-T&Z=Z@::*KHW@>6I24HA8L5[L#^(=\>_WQP(3N3]1ICM +M(.UE#34&F[M=(P/E*VHB5E1P3!.HE#OU$L"?MMG?Z<3-)D"2JY6D%*BLN,U3*T;*R(#OG81CUR?< +M_P`/OP_H@*QOHH*OJ/%E@H5\JMAY0!V7T'^?"F,U)3-0%KLH7'H+*\JY(ZML +M#A(LG:D$66.L77*RA0H&2/IMC_/A0)28),1"Y0J0_P"I"O(!V.P^O^G&&4E@ +M`TU4S34QA*3P"543=E;!('^>.&'.&A3M)IRR-2B&.""H1)':%CTC#JV.H?E^ +M?"F.,D%$CM:A?K`+C`SW^O%E),JIF#HL64M@;9WX0]+!&Y4#`#IN33XFRGK- +M'5-=[1'01R2U[U<"4\8.2\IE4(!]2Q'YG@T,+CE&I0=4AK'.)@0?E*WI_P!H +M1JF72O+FTZ$MICDBIJ2*G>(D!).B-1C!W.XR,=R"/?A?2K&=7A,K=3[^2N?X +M?[.%2OF?[XKSPUU`]35/U*H4EB"K'.._^I]N.--K]HKN6(P]@1HN,=CBZ%D/ +M006P,#90-M_X;<&,Q+K3HH.M1,D!85TME/%`[LJ@J?3U^W!]-UP"AFAV4[X0 +M/<85DIS&`PZM\``#OWXD:?:,IGJP""4%U(%.$!8J,`C?'\>).D`&@%(J@&2A +M"OJ$1BR.[H,G<]O<\*#]R:%,1)0Y7]#JC^:5R0Y&/ZR._"`PNU3M*J6DH,N= +M0'$T<@A+8'1^[W_G[\;<^+)Z@Z!F"`+K(&AECZ5Q@^&PS@9_SVX61V1*E&8H +M@R-R#Y[A/TH53H=&Z&!&21W[^O"@V;)=2H!+77E0\M;.CJ[>%TL.EP!L.Y[^ +MW?\`=PEMQ9"/>P0T%8;W:&`]3S^*!A@!MT['_/'#3LNIN@:F(=$J,CU?$KN9 +M"(ED!QC?`WS]]P/X\:%^T4RZIVH"%ZK5X*M#'(Q!V#C)],8'US]^-%KMR9=6 +M:VWL(6K=6/)3QHVZ].`VX[^IQZ[]^'&,.6'733WC/=`M5J9+;;ZNNIEBB\<*[1IX*$J2ZKWZ<^H&=O].&@P!UMZ +M?J-,$A*SEQK"]I7\W+Y8JNP+JJ@N]?9;'5.DR+12O1F'YL2*Q+5-.)&DB!'A +MEX`"!GJ$C@^E+<'C6X$M[75]8#S)((Y18@]_)=2Z-?@+@>D'0O:/22KBNIQ% +M"L&M!_Y9:QK7.;`!=G=)RNT!`F`201SS6W3MDLU@L<&(::AA@IH^L,(H40!5 +M;&XV">GIP)FS&ZY&ZF&MEEMP0A=)KI6JZRW&&CB`(Z8BN2"=R,GZ<;;9#8EQ +M%I2EU+=K-06X45;44UVH'DZZFGEJ3BI'H,INK>H8;@CU&07Z39>H[$D99WJL +MMTCHO$^8MCK+3!@/%(P8LG8,!V;V]_3Z33;!0M5TH-N]52TL6(T9U5ML@YF< +M]@3_`!/T^_&VB3"%K.RMM=0$%,\:RRSL6GD.9&]V]OR!`_,\+*E*P$[^(=@IMO?MQH$[UN$*:@J.FGD`;.VP_ +M[\-53P2VQ*H_S,DZY)02RMOD$]M^*UCQ)E'4-+!5_F&2Y89)V[8_C[<`TQP3 +MTD7WKH0-D,03@9QP91I]J24UG('-69^$+3::M^)[D9:I8%FI?]HJ>NF1DZAT +M4RM4X;TQF`<2N$$U`-_[*-Q\&D0="6CU$^BM)_:&ZJ6[:KJ[<:EC.9"\I1LE +M5*KA28@'5`-UO"B>1?#`4#.?0$_ +M7V_[\(='!/4ZY`01=+A*TJ;)R/(G4%_>HXS#T\]04QO('FG:U8L;F! +MB+JL?PZ5575YC2/D2O6_X?N?0_!ZKB6M)S5'.,D$CW/3G\^)A@R,O[*\EU#N0W7T=L@IIPD46<9RJC?Z?Z^W# +MM$DZJ,Q;0`-T)`:ZKXIV<23`!%Z2W0,_09]>^V>P^G!]"SH"C,2X04@*ZI$< +MSO$5BC*-E1V96[DN:O%SFDN,0)I(3T)$V3T$G`; +MZ@XV/?;'#S3`0#CG=(T7*DIQ5281"R#LQ(!P-R3]SC]_#=1T!(;3FZ*8Z(RQ +MO(&"PKA"Q.%&?Q$?E_/AH.T;O1;I(77)0?.*(8XS%'*X;K(P8HQ@+]]\G'^O +M"&5(OP6`"!*.*2QT[4530TL,B4XI'J9&5G"'-BR4.*PW9ND@EOW^G"25L%!=^8-$XQT@C?;TX +M:JPEM-Y5-N9H`,N`-B=_IWXKN.M=&LD&%7I^EF9>IC@8`^GU_CQ'L"4"02N- +M)32UE0M/"I:4[YQLOU_EP2UV5*@CX-5>_P"#^>R:'Y_-]D@YF7]'#)-&(Z +M>1(U4'.,@^G?M_G +MPEP@7331P0K<]0`PEBRA2V_"@MOM\*7%PU$`?$>I*,/,!U$D_S[[\: +MGJR>GT!VX6!O30):9W)57C7(Q,SL0HP`2,X/N +M.%%D%,&O9*N\Z]26(8G0QI'U[LHSV)`)V^S']QX;RA.TQ>)3MM5KC9.LXBZ003@[ +MD'8??Z<(>;(E@@'+$NTLG\[9S.U5>?BE +MKFLG*#4M,K"F>NJZ>@7!WZ6<.VW_`+8F_+B5V(T?J`[@"??FHS;50-PKK\![ +MY)1_"W6!M":8J0T:1PWQ[9-UC=1)*9`1]?,HW]^.0])WN;TJZL?_`",#AW@1 +M_E>X?PHQC3^#-:JYN9M*L^D\?VOJ-?(YC-(YB-ZM/5M#)+4RKB!94['B.H:&.@M;2SQF,$83/HH!RQ'\?SXC*E8N?` +MU4CU!8P.A$4E'##;:"FJHBTTQ6:9%;\'4?)&00TL,?0OH#G8[;YP"=_\'"7B&AHU*QC/Y^":^@ZVC_17,ZZ +M2DI&=,2TE$BDCQ3-64L:H<#`7I\4D?W4V[[H>T-(G7V5E._:`]W2NJ,3&MI9 +M9WFJ6825,N-P"=E'IMEF^Y'MP:7P0`M&F<,?;?V_APAQG1;!``"Z9 +M,E>^!Z\(RE8%B$84GL/3A9`B%MX0+?Y0$WZ<`$9]^!J@O9;;94]YEY(FZ7)( +M)/?]_P#7UXK^T!92#(M&]5\/?I7!;;U[_P!9XC&,G5+(@RBV@$=CM_S+`&KD +M_"#W)QP]E:YUUA,7&J/^3UMU-J3FEI:>VM.DM#5Q5\U2!Y:,(>I6)]^H#`]> +M$X_:5+!TC7J&(TGBH_%&(8;YK?/EP&%N +MN4>?%CE`/E.X9<[%&!].-LVMAML8)NT<'<7#A-PX:@_,<095XZ$;::)I$W!\ +MUHOO&H7HNJ/Q>C$@SN-^VX/VXAQ3CLKJ3*X@2Z\PD1@D53U@C.QVVV +MV'"M4&ZJ,L0A.KUXU5(F:A6;V4X`;.W?;C37$A-/J7A1-1K0L@=Y8DZCDKU; +MD_UC]W"HX)H/=(S%!5UURJ]<4=0>E<$^;^`]N$L&Y;SFY]?1H))/F$W! +MZ2.X&^N9;?K(ZR#"X0T-PJF;JR3D?UGC66R6TN)DBRE::QRLW5)U +MKOC.0#WX;W+1`U"(Z2S8<,T3L@`)/N?;^/\`#C;;&ZW%@40TEO6-NGPU52>H +MX7('MQHANB2&FY*S98(XEZ54/D=(48./].,.MEMK)$A0E?;5:01QHS-X98@^ +MNW\\YQ].&BZ`GF-!$1=96F66CKA32NL,-0IDI7;R@N-V0GT."Q^WVX27VE/@ +M``\$];.$=ECDB5(R`3@__L`#Z]OW\;+1*>I2!;24:PH&@D176,%,@@#,>/OV +M].&GQ,G*10"@;([!3N%S[D;D^Q_=UK"TIZR1+% +M*KC#+&.D;9ZB?YG&/Y^O`M=W9*+I,`,!&44T%QNQ\?\`645,&!3OX[*K.P&? +M0E1^0^HXCP(IDQ<_=%AV:H&DV"Z6J*BIN(:>=Q5!C,[!OQ2OY>OZ8'8?X>%P +M&MLL+2YUU)A(Z:A:*G1'FDD,*(3CJ;MN?10,Y)]SQE(RZ3HG7@-$%."PTY2T +MS62B\2=ZJ6GHNPQ4],;MDC;_`)@BQ[`$^G`M:H9GV/=T[AF`B(0H;52_IF_U +MW4):))"H"X"S,TBDL#VW.$'L,?7AXO@91K[A:%AGX*$O%;/<+@\5`:B1(D!D +M>$A0\C$LQZCW'H,=@/KQ(TF0T!"&H,Q)7ZA$W6&.Y`[@\6A[;JF'58IGZ6]` +M??AL.`,++:!9/C*X.#U;>HSPO.L)NL"IF(CD/42<=O7A"V!>=R7%]DD=RCOG@>O +MB:="B:KC`"14JADNW?--K5NLZ'E?20\MM`SQ/J*7IEO%S0`=`VR,^_H!G8<> +M,/Q1_$U^.Q/48L6`WWG_\1P509.?5XT?K>Z:8HK5;=5Z) +MO(6GU+:*M_U%PB(P)0P_XE5K_X'M<\SM-U?,GX[:QTGAG>V7$+37 +M"F(SU*I)$=0HQ^)2OIY>/86`QN'QV#;CZ$L8=SK$>._O75]@],&UF!M5I!WF +M++6)S-Y/?$=R[J9$U;R7YHV-47J#SV2H"%>^>L*5/;N#CADEPUWJ\T]K47CL +MN"J;J#6>IH6DI)[=<*68;,K1LLB[>H."._#D%L!U@F35#Y(07!J.Z.8^HU$1 +MWSOTC[9]N%TWP=$!B':DW"RZC5TT(1G=0JC.2.Q[<*94!$I`?`@[T,5NK9G\ +M1NB14S@,QV._\/MPL#>%JO5+6@:H,KM25$H."4!&!OG^AP\W1!.Q#CHA"HFJ +MZYP6E(7UQ@Y_K/#]-DF90)J.&Y=U-::<.#)ALYS]>'"T`ILDN;`"+*"V4&54 +MQ)U@$;C`[Y[<*&GEI*-8+1*DOT80%RD9., +M`MPR`B)&Y9AID0@AW)Z>W8`?T>-$A9:(']7E78`=MSZ<+%X("0TP9A +M?5IXU)=Y8R^,D8&3PG@EB9D"RX)`CM(`K(-BKXW!]#PVX72Z;2XDKJ:W>-U* +MC+!.9/&#+CRR#LP]O7/Y^YRR?[4[1,@D\$P+)7RO%&A$/CQJ.H*/*Q'IC&VW +MI^X\;:ZYE.M:18Z!,N@JHY(DR5:)?,05'23CMOOZCC'-)D)MLEI=N5!/CGJH +M2_+NWPO%L*BIP#OAF(.WW4<36R3!<>/[*M=*G#*P3Q_90GP[QU-UY'Z]LE*W +M56+63U%(,].)`@)7/LR]0_(>W'G[\4WLH=)L+B'_``D-#NXGZ?*5],ORCX2M +MM'\*MK[.HF:C7U7,OO#&NC_JN+(NY7Z]M.I.5%EO22Q5%_@@6VFE#>:FEC4! +MIY1[$%?#'JQ+':/#]QQ.%ZM^3=]%\W:./.(FJ=223XI7:LN*DS3,7E6(Y=S@ +MAG[;$]\'J`/T/!6'9O"'K.B0576[U#S/XDGFDW6P"*-_7+=^^V>!:HD0.2=H-;J5F4L0681=3 +M2,TGS#M@`A00`O\`7TX'=(N$^P7`.BSS3FL>CCIXW<,"&(;`ZBV"`VWT'_[' +MC&ORZK99G.5-9+A26JOHK:!T,LI=G5L^&V`H5?JP7)]A@>O#0)+I-T4]S6B- +M$N[Q=YJRMDB@<14XZ8V'8#I`Z]OH0I^_!S*`9VCJ5'U:A<8;I==$5RJ8P1;* +M>:HD[RMX?63N<9)[>HQ[`<+-2!>R;HMI[<7&%3"25$5-.0Q +M.Q]3Z#@=[#JE!P7!495P<8)[>W"AHL)WJ.JB>EDW8'C"9U63>5"R4M/'"]97 +M'*8\H/;[\#56REA5;YI:BK)/F(Z/]1"#@8&_]?3B%QDD&2B0+R=$J[/25U+1 +M"WT5/+7:DK6\**-_$P_P`(S^9_AY7_`!:_$JIB'.V;L\]D:D'2\1WGAN57VEM`M(9_ +M-\A/S*I=?-2&BH[E,\\E3=ZDL\\Q_$['N22?Y<>>:>!+WM:?A"AP`T6%]ZA_ +MARY.7OGMS%CIXJ$U&DH:CHNE<25$K#M$A_:^OVX]"?A]^'SMH5A6JC^"W7GR +M'UY*Q;,!=\6@U7HR;2ULTEI&U:0M%L2AIY/`I(5C7I#*,%@!]@1^?'HOI148 +M,.W!4[!Q#;<-ZN>R,*"7.W-'J=2JS?&CS4:TTO\`LE0RU-)4PT@EJ2NPBC(P +M,_?';CF73W;!-;],R1EN>0/L!=*Z(8$NFL_?^_V6F#XO^8O*#_TJTW8:GE[H +MK5FKJ2D+SU=101M5&IE_#&9@.K&2#C.V!P1@MLUJ-!E,/@-':)OKWJX[(Z+U +MMH8[J6,S%QW<2?G]B5YDN>7-&P:4U=3Z>L>GJ&XSPJ3(9H#O=&I[DC\8-F8?HWBF[/I7K@2\3($Z`9=JN+HE# +M:[_)7551'26FWQ!9ZNZS-MT)&,8W.Q/%FQ>`HX:D_$U:@;3:))=H!Q[EQVGT +MHO+F&381J2=(5E.;7P]ZQY1V[1TVL[_IJCU!=Z45;V>.1GJ[4F,_[S@=(SG` +MP3D\!)$&B"$L,$]P>$%Q!E/@SO1_::MIE5G`EE.#C!&?\AV'"C4DW6W#*(; +MJB\12SHSB(.<$=.-LX[#'#;G#0!.L=,%,)$D#58 +MT%?S6ED=!'"SY4D!O;[_`%^O"7Q$I1IF)7!K'4,_7)'&A]`H[>^>$@#)-U$?XRZX]_ +MMQV?`.-7`4JKKG*#/&VOU7A3IE2IX;I#C,/1$-ZQUN$G3P*-=85T*4D]/$&4 +M.^$&VW?@V%$P"++" +MM43U=4E14#RKU.?4@9VS]3_EPEPM`6J;"72"I^J83R4M#&L;*<,P'JS?L[_3 +M&3[$\,Y!KO3Q,B`I%"#-)3#J-(OAH[;X8+YC^>?3Z#A+VP"!JE6F"I"&>2*6 +M6=05E;\/KDJ-L?;8?<@\-##R(*<>^#*DJ.15BAIS(5D1%,?2 +M/PP?*-S]3P._FG`JV:DHHI:F6LJ?)2P9&O5?-^`4#M? +M:[J32Y@[1^'NFYCD-.:UGWW7MPU)>KOJ&^W(5-RJI3+*S$D*=O*,=@.PWX\P +M/P)C--SJ>)YJEM>YQ))U49IRV:AYL:HMG+_1D7555$JI75BXZ:*`_B?[XR<9 +M]N.@="N@U;:F,;3:(;_,>`XJ9P6%-0SO7HG^%_D7:.7VFK%9;-30Q6^EA'Z] +M@.J;'=V/N?\`//'M+"X*E@\.W#X<0U@`\E=\+0+0UC;_`%C>K07*G@>_07BX +M/'#:+11R3IGLTIR,_8#]^>*CBJA?BAB'_#3!([S]@K1AF%M,4F;UY]_C2YD: +MBUJ^H[G:Y'B-TKA!2(JYE>*)L`GV!/;VWXX1M/:?7UG8VL>\W`X +M+OO0OHY7KOI8'",+ZKS``XFWAQX#4K0SS_UCJ6;](VBS]58:'J>ZW4L&AH)" +M-T+'9IB,X'[([\=&Z$]!,1MRF,9C0:>&FZ:].MG?AJ';-V:]N)V +MPX=MWQ4\/.[^ZH=PW6)CX3IDU!;[KS5Y@T.C>6^G;UJZ]UU8M/3TE'$9)[G4 +M,VRJ/4DY.3L`"3L,\=OVECL#LK!NKOBEAZ39+C9K6CWWGO7A#:6U,1M#$/Q> +M,J%]1YDDW+G$^I)W?1;?;!\+FE_[,_0M!S)YM4UEYC_&MJ"G'Z)L[-XU%HJG +M<;GJ]7`(S)W8^5=N/$6,Z4;3_$[:#\)@,X]`!D9X]4='-@879V'9@L&P,ILL`/GS)WDJ0K=EI=),WGC/R^@5&'JY[K5 +M55=3QB.CCZFP?PXSW)/OVS[`\7.DT,%RHAQWS$U9,YJ*UP< +M-C\/U`X?NAZQ`N4NUDF)+,S/&Q`)W!QP3:(4?!F9LB736O\`4^E:@RVNZ324 +MN233SY=7]AOQCZ+*@[0NM4\14I78Z`5L%Y&_P!.P'""[>4;3((`GFIBET]"57IA6=!@ +M*<[8]V?H.,:X'1)=O(UW*#FMCRH!(AB7'4IQ@M_VP/Y<.;TP^"Z` +M9[U0KXD[;!/KV*)CU5GZ'I^C.?\`A]=1U?\`R*<%4:KFD1\-_.1])5?VO3+G +M`#2#\T`_#%XU3?JVW1R(AGAJH@3Z,8T8'V(RI_CQS#\:R&X2E6(^%P\E[6_( +M/4?4VQC<&/YZ4>(-DGZB1[;S>DG5&2?Y]F8>TA!#?QS^[CI/1IY?LREO&4>6 +M[T7EK\74,/Q=]USZ'M]]OKPY*:.ED14%&:&A6.4JLLK"64D[`D +M;+_TJ,G[\:+=ZTPPV#JLJT+$9*BOF55B*B@BI8Z"]6+Q"H:2$RJ#`&4.H.3C)#YV)P<@X.W&4ZK1\34S594<9IW +M7ZF$Z\0HJ:8A6!)/OOPRYR3 +M*CV8M^$$8^G&)S1#-WC,A?L&.PW_`*^_`Q,"%N4*5UIL&G+!5:]UQ-34&D+> +MS3J)<8K)E.0"#W4'T]3QRS\2>EU+9F$)_G=8#GN'B@]HXQM-D/-IOS/#ZE:0 +M_B/^)Z[5E53.M-:HSX5%"'\M.GOCMU'U_P"W'DP8"IB*CL7BC-1VOV"I +M->N7N-6I$N].7O5*.P6_5^KJ^@L>GJ"HN-XK&$4=.ON3@NQ/9!G)./;B4P&Q +MGXJJVAAVRX[EK#ASG#())]^^"W;_``F\A+7RM@H].)F\:HJ$$UUKNQ.3EE7U +M`]`/;CUWT6Z-T=E844&07GXCQ/V"ON"P(HM#`;G4_0+=+I>R46FK+!-6*T0> +M/J5,[X]."L<\.[!L%/X9H#_%>8KXZ^>MLY;V +MRFTWI>NJ[AKRYN+3220CJ^3!_P"+*#Z8&?N=_3BD_AMT79TAVH<4^3A:/9'! +MQ%_$\=P',E>Y>E6W:/X6]%33I0=MXX1(N:3#,N_M`_EWO=?06U#<]>9&B*G0 +MMFL>I+L^A.3=OBDC-)1RJUWU)5(`7FF8_AC9^K#'<_3CV-C=K8.D&4"88+!K +M=3IPT'O;\25:KX&*_07PC\IHOBHN/*NV5O +M/CF#3M1\E="2L&JZ6T$E/TY=9&_X"3N,KGS-&HP/,<>2OQ4HXKIQM3_[V"B@X\V>.P= +M&^C&#V5@Z>`V>P-I4]!Q.\GB2;D[U9\/0:RE-27$FY_J(U\-P,:"PNM>?Q&< +ME-;\V-:Z@H+6*V+1-EG5;[=%'4*RXR',Z4I'_$Z%Z(EZ=@%/8`GB8IO%('-J +MB:M,UGEC=+`GGOCN%@M?O.R.QZ(HZ?2UFI::.H@8M\HAZ_"V`7QI.SR`;X&R +MG;@B@2XYG)%6FQH+1[X2=Y5&;I,5G>6=FJ:R4$G?/3OCB2:TE0E5X!F;J%*R +M];R29#*Q`V]O3AQ]@`$VVF7$E=4ZIXBL1Y-V4`]SPY3>18H`"*M@ +M)V27I]!Z@]Q_VXK6*H=4\CI([U&52>&":A +M^MMCN1E?X>NW"SI=:8-T0H6IJQ&\W0H2-CGI+?AQZ%CZ_0<:'"5CRRTFZ$Z^ +MNA>>2./,C%?[N-SZ#;AIU[`IE@`B#JHT4<%('GKYAX2KU"-23N2#D_EMPL1H +MDO<2`XBZ&:^XK52L\8)0C"+MLN3_`#VXFSZ)/Q,/S_`'2XYNVR:P\[-84,F!/% +M=%=64'#*R=0./J,''%Q_#C&C$;!PU5NA;\C"XI^:;8SMG_B%M/#.M%2?!S6F +M?%"$DN7DJI!F)"OIYNWOL.%BXY)@]F.*RVKHHAX<.%B5,$9[D[DG^'[ +MN&YA/0T:;UB25D7*"-"W2!^TV/0?F?W#WXT=4YG%UASWA8PTKN0V,`!P, +MX],_S/[N%"=R0ZN`HZ*Z5-760_+LSLS#'2APHS_+?MZ\)>1$E,-)T;HI*UV& +MHKI5,M)4R!`<$H<)@YR<[#!P3]^-EW-:-$:@IKVVDIZ)Z.>..*EE598G2+,C +M^*%8YZFP`?;'8;XWX;J7%]$ED:"Y0]075Y:=##15P0#I#11=2-]NV."'TB#: +MZ#IUA&]?JE,X"]P#]/7BQ$J*S7RC50=6^6(``'OGAMQ2R"=5#5"!B,;C^7#9 +M=:$X!:ZZ`.E3GJ]L<(60-Z_J.V4M=4U%3JU@,F+2M(7QV?%M_M[7S:2T=43V[0U%)X%+#&<)5RJ<=> +M_=?;W[\>*]K[8K;6QIQE:/512U$KL`T2DL7<]@OUX&JU2XY&"ZBZU09^I6Y/X0/AQK](2/S/U3&AO, +M\'A4%.%S\O$=]P?VO3CT/^''0UV!I_J\0/XKAY!=`V'LDX9@J5;N^ZW:_#5R +M5_1\-7K#4$!BEGS+B3V[Y/'4'$M!\*US-QKIEE:BIE*I&/VR +M.P']>O%2Q>*+:;ZCMV[GN4[08'O$:"RU6_&KS7ETU8*V@BG@%;X95FZ\2^;` +M$<'J6)(&1QSW:^Q&_P"DU=L[2$4:?&V8ZY0=\Q?D%[+_`"Y?AUB=H[2&*:A?]35%+635E91&40I$A)>K;..D8!PNX:<29Y+;=\!7)G4VL]< +M\E[;S)N]SKM;7*AIZZ6BJ)#-'I'3LA!7:LN14M)+-MB-=AT +MH/PA@S=@#",Q'6P]^X6X[KGW;>IJC2R-RL-M.'O3V%YI>:FI:W4%VN#PHOB2 +MNS22`$Y;/92>X^OJ1B20GUW_`'<(D)<1H%@24S,A!P)!V`[*/;A; +M7F4P:<&#J5(I2B*CIGD3"R$'';(SN3[\),E;=3`;)WH_Y1\S[QRKU9%>*)G- +M$\@2JB0[2)GN![CC,3AA5;E*AXKE6B0YW.!^[^M^-"1>4\^O +M(,H5J]3022+B6:=P20JC89_AG;A5R$AH+K;T.5-==[C*YI8S2Q[9H*5*JML6@H;Q2$_B6HAO$##)/;JBDJ4QW/6..>=,=J.P^U-E4F +MFU:NYA']IHOGU#3X(O8^Q:FT*CL)0$U'!Q:.;6EWT5*?AEMD]3SGBMM#!-55 +M33%(80/,_4=ACL._EMEADBG2MM=%4K-&?)/(A>!^AOVE7PP`WKW['C7X"8] +MM;8!I`WIU'M/C#A\UG_U#=BU<+^)+\4]F5M>C2>!OMF89_N[-QNTFRKS/3^) +M*B-U"EA3Q'(!_6-WQ[`G.?Z''8LR\5Y"5A5-:STYA"I&">HX/?'_`)S^7"CJ +MFS8$*+:I$91E=900.WOOG?\`KOPHG<4@-DS*[(:^0@MW!;"\QC2CHD&&90_"";PD5GR>Y=_Z-J+Q6PVNSTP50_2 +MS!=V/8$G?'<#'&IR@N(JOB7.%O+WPU[@;(NF\2)T'O]E,WO35OL514QBCBJY945YS$%95 +MDWZ7&Y0D@J#_`/D)SY>)'"T7907&-8'+W,=R$Q&(;G[(4=9M,S2BHDN=JO?Z +M$J&2KDBI:!_FVBB`,LJ]6`JK$O47;;*G&1DA\86M4&6B)(FY-A?YSPTW\VOU +M#:9&8Q/F5823E1K3E?K#6NBD\.MGHZB(2,*0MA73Q(P593TMX;QD@9&3L6&# +MPANS\/BIQCA%BLYK(B@EJ7C@A5I)F(55 +MQOGTXTX@`N-@$DN`WZ+7/_:'_$Q!H;3U-R%T9=42[5P\2\SH>AX(_5=CG+8( +M&?3/OQY+_$_I<=JXHX'#G^#3^+FX:#PW^"I&W<4:[SAQ\(N3Q.X=W'R6@_4- +MV>]WJEBC67P$P`A!R3[C]_%)H84L88$E*H4P*<-$K;_\$7PZ05JTG,#5U&\K +MQ@?HZG=3A<]V(]^V_'7OP]Z&ACOU^)$G^4?4^"L6Q-ATV$XFIKJ%O6BS1O]Z\U>*^UT=!24 +M5BM:*B-A3T[=*C_QQ![4Q9)%-JFL#AI&8V"`>9.HJ#1VBKE62!HXXX6/D&6> +M0]ACUR>_%0VSMC"X=N;$DBF-2!)XZ>"M>P<`VK6:UVDA>PL%3%#!LS`-!DNO=Q.X +MQ81I>\KZX_@7@>KV93IL8&,&X:\B3QB_BM1GQ?:GN%OTI=[9;TJ4NM93AI7C +M(_W>`GL?7)W.WIWQD<"_E9_#(;2QO^HXD31H$&#_`#/U`\!<^'-1?YA?Q1.R +M=G.P>$<17K"&D;AHX]YN!Y\%H@Y<6>^\W>?-AY;Z'L$ERU#=[K'1&XQMU2VR +MTQ>>MJ(V8EUJD6MH$(@MEGBBT;_\ +M?5&;-P1+@\VY;IO[[S/!>/OXY.9$=#<:?1--4G`V4=6">%[);G.8BP]V^J,VI6#!E:.?L;SK=:H+K;#"9*N[L*$L +M2R+,^6)]Y#[^N!G<\3[<4#9HE5XTB/BL@ZMJJ%Q4M1PRU3](B5B"J,Q]AW)P +M#PMKSJZR'+A)#!)"AQ054B.)(UA+$X4#'3QLUVZ)5*@\B767R*S>5C-&8XQD +M,3Z\;%83&](=2)[E]KX_"2F7IZHA"`N1L.^W#C3JFZD#LG10\U*\8J#X<8;' +M6@Q^9_APXUYF2AZ](B2$\^17-NXZ0N,=HFJQ^BY#Y%;LN3OPSC,.'"0B]DX] +MU-V7=\ELSTUK2GU!#2,:T,H4*0CX)W[;\0E1L6-E:65LZ9<5;0X180J1$#I/ +M5G._[0[<-AED_G.JR*F])'Y8RJH!^)L$;_7WW_EPZ9`@+#`DE"]=5T]4`K*' +ME7S-U/YS]<#MPIK(-PF&N.]"LS1-)%&SU4P!R%5V\OT_?[\;`),E*)#3E"CJ +M^JI((I)8FCCE[=9&3]@3V`]^,_F6FN,04^>1E.FH>2GQC.U#(SP:+I@LR@80 +MO=*4!2?3(20_EQQ3\2@!TGZ/M+OBQ#Q&^.HJ:>)"ZO\`@#V^F>SSN-3+YMF596I*:9BH+^6$.\:GT!*G/J<`9QD%'XW8R-BLI@Z@GY +M`'PE>F_R%]&'4^F6+>\7I$4YYYC'R^J:WQVZ(":3Y1\PJ:.1UH+]6V"HDQG$ +M<@2>'J]\],@_\\4'\L'2(C:&-V6\QGITZH'-I+'?,%=7_P#JC=$B_P#TW;M, +M7:33<>3VAS?_`"8?.%K?N4QEJVHU9Y$7",>K9B=SL-L;#/V`X]B,!U*^2U8C +M*&M0W*[]$WA(KJYZ5)&R@8/^0_CPZAG`$*.E8+X<:=3#.`,;G]W&@4V7@"Z8 +MNF='5ER,,M3"\5,AR%((ZSD9R<=M\?\`GANH\`$H>H^=$?M1_,BGM=O6,3.0 +MG2QVC7&^%]N_IG\N&`X`DG1,FYAN]-G1FF:>P3Q44<(J)I1URNH&2P&.C!/X +MNL`'.R!PQR#PXS!NK-#WF!]/#E?G'))?BVTSE;J?FFH;K'-&ULC^9NU4\GB1 +MPP)([%6/2L94D/TG!'FW"-(OXH]RPQN':':-XZ>/#CIOCB@"752`1+MWC[\D +M"&[2W6LMEKML45YOG/F?162Y&&G]0WV]Z0M]70ZR^0\" +MX37*IBCJZ>"K+P_,+'4D2$*_67DC4^'THV.D+B;QN'V0_!,?BP#1!,0"18&? +MAY'W*KC<1C'57=3(?>=QU&]W.(CYJ[=^TQ)S/YI\R*N7FMS,MMOL+4.DH:RV +M4-?.MT>B@$;2B3JA/A])BZ?$_6DEW9(A(JFH8S:S!FZAE=9#D@$?4\-@PM$;BA;G!S6L'(3E3J/F9J&54G2%H[ +M=#U^:28C`P/J=N.5_BKTP=L_"=10,U:EARG?X*"VMM#JVDMNXV`Y_9>4+6_, +M74?-O7M^U5>:J2HK*V9IYW)V0?W5/;`[?EQYEH8046ACKG6>)WE5XX7JVY=2 +M9-_OWJ_7P=_![>.:-?0\RM3VRI@TW$?_`*;3RQD-4GT=@1@CV],;\=;Z`=#3 +M7C%5Q#9D#B>/D7D=R+I=-4E++/3Q-/&JE857:+Z` +M>_\`+CT#A,*RFW312F*Q)C--XL%?.DM=):*&GIG4AB`[*!LOWXCL=7`!)1&% +MI%Q`)YK`J33TGSMYJVP54%<[9]`H]MR.*5C*V2:C]5;:%*8'!4=^*O7=5;;" +MEEI:NGJ+S4RK#%`#L'88&?H,Y/VX\F?F%Z=[XN>:5SO\6I-7_, +MPJELIY8EI8CM%75#E8HR?VBD723CWX^RWX4]#J.QMG4>^3Y6 +M7S4_%?II4VIC:N)?HV0T<`;-'_;"1WP-6#4W,34>I[1IR.T+\_DO-F'PF;$# +MB1SOK)YD"8&G`3<^W7X2K9:.3OP[SQ6>%2E/%T +MD8ZQ"/FG?]N6I3O@#B"=C12HFHWXG>@G]IYDRBJE-U;$0T=D&!W:C[GO%[+3 +MS\<_-VZT%1=Q:ZJ,:AN*K1Q54C9>T439RJL=S,_F[>9L$[`\5*IC"]Q$P=3W +M;E<,)A0T26V&@]]UEY8.;FO+:NH[E'8!#=+JTA6>MJ,.`W;IC';;?;\(W[G? +MB];-HES`#9JK6U<0WK)9KQ5?Z"Q7/4%2U74))43=7FD<&0D^P/8<2E7$LIB& +MJ%9AW/T1#4VNFM2)2]+(ZDO(0F3&!,5AI,J3V=CW$>YI$ +MA3IKM(&Y%]/?:6KCBEJ!&9`W7&G5GPSCLH'KG&2>&:=S"=<\B5RFK(*DA'CC +MC`\Y;L5;VR-_3A]Q=H4ECR38*(K:ZHCDG;SU8`V`8(0#V^G;C!)65"@N:20] +M;UJ53+V6/IV^Q(X348!$)FFYQU6T3^S\T53\P?AQ_M$J8T[BI31$<,"-'CPW +M2CKZU=CN#U4<9'WWX\C_`(_[<=@^FO1,38XAQ/<74J9\Q4*N_P"%6U!A>EVR +MWMM_&8#_`-3FL_\`R6K?D;I6ET_9_PM\T +M+53PM454#O>Z#R[BIH90[*/;,9E7\^//WX;=)F['Z;8&L\PUT4W?[:P+0?!T +M%=0_.AT7;TAZ(8ZA0$O%,5&#?GI$NCQ@CQ*T+77G+BIO)6[ +M7.FEAIDC,P4(<%`2,DX('V]>&WUH[(09;F!S%-&\+3T:?HZTK%)MTB-^A6V` +M!8?@/ID@DG\\\`M.8Y?--.;$9UV6ZG:PQ"F$[+,:$-(_4&QX462<$G';) +MZP@.%;/!E.DU\/<.8!^9Y?2=X0[ZA82![[D=PVZ^4%*M/76B]:3M[0'$M5`E +M..D``2&:5PD<94NJQA7DZ04\Q5>DEFT*;G?P2*AG<2?(#6($DD#?($@MNI%I +M.8$=\#U/'<+SN1C;-+Q675=BM&OM)\T-(Z&F8- +M,Q@2$LY+%V56*I*X/!.#75:194K;FD@-!%X)$W&IC2T";F*QF(=+6.EM.]XW +M;]_'QW+:[\)/P]P",T$'>UA,&`"]Q[(TS)>"PC,5 +M_#8\=42.1$C7F=>0`N9L;]V/DWR\J.8_+35^I++KBIU=I*T4=)I6.[U$;4T[ +MK+*%GG"&;HC!F969AY2(U2/J*,>/OZ<8RM@<11PV('4UB[XV.D`G*:=-MA!: +M#/Q1<.-H5AJ;%HMK4W%DO:/Y2(-IS..ZXD&Q.Y4M^&7X>=<_$G:M?5'-#6UW +MY7PV*_UE)&E'04T\UQN<\\M17RU+R`!I%>6",$!<*BKC"*3W';'2O9>#-)F' +M8U[#39E)C+DCL!H(.Z[N,B52=G[/Q500X@P;R#>8/@/%>O6;(4[?N/; +MB84J6F"-R'*]NHD8`'U/#;XUWIUI&BYTM+0VZU7#5>H:F"V:7H4:6HGD8*'P +M,X!.WIN?3BL=).D>'V;AW5ZSH@(7%XIM)A>38:GZ=Z\R?]H'\8]P^(C7TNGK +M#5B'E];)6AHX4?`J&!QXI&P],`>V_KQY.K8JMM#$G:&*^(V`X#NXJKX2G4K5 +M#7J#0=DT0.W^ +M+CHO0CH*=H5/U=?_`)33;^X\.X;U(4,'U[G9_@;OXFU@O6]I3E-:*"WVBAL% +MF@H:&GB2-.A`J@`#&WY#CT?5PS601`CRLIBMBRXY:05D[#H>WV6VK4S*PJB, +M[XR3Q#X[&M'JFK-0-9:.02VZV,):V4'R/*1E4S[Y(V^G%)VWC`'._MUX>TZ2T>,`\I)S=P'%>_ORR]&6/#WM$R0V?"25I#^)[F%7V_EKJBME=D2ZU,= +M&_F*XCZNP(^N,_3/`GY9.AHQ6V1BWB6X<9O^MUF^0!/?"[9^/_2*G@=D.HTS +M>I%,1PU=]EH]^*>\^!HO2>CK:B&LK)9+E(Y/FJ)I-O$<_P#4%`]EX^H'1F7$ +M$:#W*^:O2FH2SB2%L$^`OE-93\AIVS_,5%MU)K&U::OE*C*)X[)9XY*J6&0' +M\,E6T<4YCSE5(#;D@6C;N*S-I4&FG_G!JZL@TWICEPLRTUZFHY/TK448\E`G3X]8P(_`%ZHZ9>X4!3[XZ>>LFI-2:H6URSFP6_]5XHC"*'= +M<@*!^*23H`S^S&J*/4D39%,U7-+OYC,<%9MH5C1IN,?#[`[Y\A'-:>JG3!Q4 +M7G4M/)3`J',$C!78D9\W]U1^\\7T8G+_``J-^:YY5PP(ZVMY(=-]B2"J%I+B +M&'"A8EZ5&W4S`?M=(Q^9'$I1PHD.J*-KX^"0S3WHHR"F:OHGNM3%/&"&<]0! +M/L`/YYX-`AV65'=9F87&RD:&ST\7@M4=$)!\.0[L(CZGH!R3CU/K@<*J,)$% +M8VL&B6'19E9%2NB5$=)61VZ#`226!E52&LQ!`*?"ZWGN,*B)Z>0SGS)&)V9Y#CT49+=OM]>'9DI!,AE:<@=7<@].-AG&!Z@[['A9:!*T`8TC[K;K_8Z:BK*WEC +M_:16R@BHWBATA2PAAD+(\M%[^6LP^3VD>L+7WRDB6>BTY)T!4#TF%.V"I([_G_`!XM/XL4 +M^KVN^GQD>9(7V[_#3%=5MO#U-`ZWS'I`6S?E=:K95677%IGHY)(+?J%TJAG* +MR4M5&5DQ^1SCZ9]>/$73JM7PV+P]4&'.IV_WTW`A>E^G6'I/QAHNC)48#'^[ +M=XWGO7ENYMZ7J.6_,K7_`"^JF,DMAN]7:NIO^8(Y6`?_`*EZ#^?'V+Z([=9M +M796&VI2^&NQKQRS`$CP,A?FF_$/H\_8>V\9LJIK0J.9X`V](*R^76A7OLS7J +M[J4HU!:*.0]/BGI;#G8D*,9&QV&_?/$]5J0(=]5VC?/R1G4PV3I["#FK&CJT-31>CM;5%#;]1R:ZK-9U-EI]6TURIWDC +M6U13SK%!X,4CR-/528#^GM>B*/EA +M8=!Z5KK[;+G56RJFCJ`M+9I99':>C>42U#-+1>-X8F<*H+-CJ;+<5KIG3?BN +MMVC6#W`MAC9FJY@AK"!_*'S(+2'D02;0G=EL;2#,/3(:=3P:;EU[3$00X$`^ +M"^Z:MNH]`Z^H+5+4ZTO?*5*UA=/TS3)1/XIK%EEJY98Z>`.#4TP9XU8M/(R, +M654917<-L9N.V?AZ=$4W5:+8W3`,0J4S%NPE>IG# +MH>9$@>.HOW^=U[)9\]`/5G;?WXM;@BP-RZ;?;*:<5=XO4XH-.4:^+5U!;IV& +MY4$^NWY#BM=(^D&'V=A78BL8#0F<56#&F\1@:1C3U%33OT_I`#;&W_`"P?_P!OMW\H;2VO7VUBOU>)D4FF6-OW`GZ*KLIG +M%5`]X_AMNT;S_<>K::YVW0HD69YI$Z7J<$'! +MSV7^>W%_Z(]#:FT8?6[-+C_5W(K:.*% +M)CW3$1/&^X+)+U5PF&<'W*+TJ? +MKD<R!/G$G_M%N2N?1S9CJM4!K9GYG["!RNM0WQ':PK;5;Z7 +ME[#61BJF59J\I@A'9NMP#]"57[+Q\I/Q1V[7VKMX]8993W"(!.[GE$">(X+Z +MP_@]T7I;*V2VH6W;ZNWGQ.G):*/BLU9#JC4UIT50/60VVU.16^;*-/W8A<[@ +M*HW^HX]T_@)T.&R]DC$.$/K`./K'@!I^Z\O_`(Y]*'8W:C<&TRVD3^_RU6J; +MG)JZ2\:GIQ14ENCG@J8X+;6,I$U&BDE2"#@X.2,@E?3CU5L#L40($1["\L;= +M?UE2QB3;EP6Y;^R$B_1%5HVXUKR326PWO5]6[GJ:>JJ(DI(?$_Q.TC$9],]^ +M,VGCVTJSG_TB!X_Y4/A\&#AF4XNXEQ_?GZK8A\O;CJ^R,/3IL[-UQC: +MNT*E:JOI)JOKDC*UD=."KU'2=V8^IZC_`/$_3@I]5U1HM`0+6BF3O.]?*NWO +M24@6C6YS&=V_IQ&XRFU@%1AU4M@ZQ=+*H45J&0BG6M,<<\,9Z3$PZA +MT]AM[?7OZ\&X(YQE&J%Q0-(YB)"7SDMX4U*'\"/#$%MX?_;[C<<2%2F19VJ' +M;598LLLNIMT=?;WDB_63(>I@`?,W][^?`G6%C@"BS3%1F92VE;N*.I19F*]& +M`R^N?ZQP63*#H@-,'56HTO?*6JIPB5+QQG8CK\S;^G`55LZ*:IU7?#P3'H;G +M03%I$1J>#IZ=L#JP?Y#;[G/`[I&J-$%VBQ*JNIW#FG9*5YN\JDB3H[]Q_/Z_ +M3C3:8&FB279B,NBKKS"UQ#0TTMOH9W&[8S^SDX`_=D_O]^",F;460]>O!(6Y +M+^P'KH;O!\>FGJ@32P3Z*BJF`;/5TT]:@Z0/V@6SG[<>#/SPNZC'=&\8#!&) +M+?,TSY(?9&+-+:&&K-T;49_[M53.6U-+!IV%T95D3J?([>650.+E^-I#-N$^ +M_B4%UD6-]8:.K;O2M(Y`DKJ"> +M'RJI&>IH*F9NX_X0[\>9?Q6Z+NK]&SMR@.UA*[FX!P\0Z;\"M;/]H+\.\8^(F@YF")8],:FM<%1.H*@27.F +M(@G4C(R2@IFQZECQZQ_*)TU=C.BSMG5+OPKRT?\`]M_;9Y$N'@OEE^>GH(,' +MTLI[6:(;BZ8D<7L[)/BW*?`I'T-)3V>WR4D$D"4[HJA5F4=3=(]!)@+YL$]B +M21C?CU`VH'-L?<^=]R\6Q:/\+NEH*LV.HAHH::6J@)8-*%,9ZCN&Z0@7;'FZ +MO;L!PAQIBLUM0F#:VOS,^'-9U;C2);J%EIIB>RQTEZLEIJ+E?+0JW*6BFIU; +MKI"O2149(E,'0Q_6(98V"J201C@W#UZ6)'4UG0RI+9!/Q"_9BP=(T<&D:"05 +M&FD6=MHES;W^O[2K(\OI],WKF!I>YU6F8]'/J:.GM$UEJ5IYZ"X4M3#T15S, +MP\%IXI4DS#+D`"'J(8E`W7V*^CLVH,_6'#=L.N'!S73U8&N4C5P(F2!`NF:V +MTFU<0TY0TU+1N(B)[Y(W+'Y!W7F&O,:MY:U2W6NH2T/R<$51 +M#$RET>:D2->PZ08F$+$#P1T]`VJS!U<"<1BV`L8TN#=1)$$"-9F.<\"9I]"O +M7;BC1H&Y)`.A!'VB1SMO"N1R\T;JWX>K]8.5]C7DU>N?-\@JWL%RJZ1\4D%; +M3E9I)ZU`)YIY87=(HVZ*=/$$LDCL5`J.-K4-K4/U;Z;OTM$0]N8`&""!!AC6 +MLLYSSFFS6@"Z(H"KA*AHR#6<9#HF-8,W,DF([R3N4OR7H>S(2&AH:,SHB)EI<9TALZI>RGXG9].MU@-X`:9B2>%CSMQO?5\7WX +ME[K'9=%TE=HJ\Z7UKJ*VW2X4$=>88(+8]&D:@4:!1))3SRN\/C[SJX95#@X' +M,'_A_AF9VTWNAA:"6NS!YJO,EQ``[+;Y`0T",\@7MM/;SZF4N8-^HT@#3Q$` +M[]RI5S`^,34>F;I8[YJW3::XMFH;+0WNVVQJ\T*:<9T*U,2QB.0DR5"33$LY +M;SC('HP4W.:7$R7P9S7`$0;!H@7N3I`8KI`X.#GTVF0#$ +M:;HWD]YN5[EZ.F^8G,:E$4`O)(?PHH[DYXO.+Q+:-,U'V`"'JOR#-O6D_P#M +M,?CIFA27X;N3%PDJ5?%/G0>E/2*IMW'$M)_ +M3,-O[CIY#=Q57Q+_`-55[1_@LO/]3OJT?/C"A/[/_P#LG+SKM;?S8^(.W5=, +MDKK44-G<'K]^J;';T\O'3NB/X>=;&(QPANYA^9YJN' +M34%#8;>J`)&`F`!W_+B&Q>-@$E2.'P\0`EIJ'5]!003U?4B.1A,[?;\OY\5> +MKBLQ);O4Y2P[6"2%7B_ZLI=/V2Y:BO++4W$L[J6_Y*`=S]!_'B%Q6.91I9S< +MW]^]2I?"84N<)]\TI)K?+JV[*&!ZC5U^+1D>(4(6GB4?_E=5"G^X +MQXCJV'EU,.)<&@U'6U.C0/$@>!*+:\,D$7GT&OF8;XDWA5%^*'7,?^W>G],4 +M,I6CLE(]UNSC!2>H$A(!/8>?`^R,./('YBOQ$_TO"NJ8?_FB6-.[-)+G=P,3 +MY!>F_P`OO05^/V@UU82QG:/?N\S?N:5HLYY +M/?P:Z!5-L[2;1>,P;#WDGB[?Q*]^_B3TKI;$V2"W4=D#B +MZ+@??=JM->H;A?;I:Z[4:P35-ZK:`SA47K?QJI\(OW$:J1G^\#Q]0\'A>K;3 +MI1`^0&B^:^+Q=2L:F)?\1!/BXZ*EM]LU70\P-5V^JCBJ%MLT5(6$B%9JD)@1 +MH^2"2X?)!QA3OQT3`MBD'!4/:6(FI&ZP\>'F/1>BW^R\L+4?*76A!*7&Z7"V +M4[>+A!3TR+))+)(W;&%;+'8`9VX@-L5W6:!J?34GP"*PS!JX[I[XFR3?Q>:G +M76NH[[>):EI=*4$[5RI(Y"3LBE(%1&_"@`0#T&3W/5Q4C,P]2S,?,/0<=/V)L]E&F +M6CXCJN7[:VB_$OZP_"-/?'FF'K[1E+IO29O=1;*>X:B\`3-!X*L*=!^$N0"6 +M;<%5/USV(X,P&(F_UVVRG3:QQJ[K<9'%+J%[WM##KX0=_DNZTVRWO7R5R7Q);U4'J=G(N@_*[K:?BI=Q#F=54\$IJBCGMTU325,3QSHA:,Y[XW'W!WXMU*JVNR +M0H&MAGTGY7>BP*&LFHX%JT=VC63H8]6``?3[?Z?3@'%41,%.X:N2VQ67=9)8 +MJR&MIDC\"8X8']EO7/MPBD+0434_K;JC*P:E^6"J2\4;##$'8CUV^O"B.">I +MUR\%-)=:T4$,=$B55;.R^6&)2SN,]O8`^YVX'#`=4:S$P("A-3:NU/\`+R23 +MRP62!HR(XHP&EV/J_;U/8<8&`V*T[$/RG,9__KG_`/%!XFH:5'K)^&_D0?HA_DY:#=8;=;PH?R/^$9+`E7[? +M]7\N)+\RN+.'VY7DV$$>,K[^4\'.+>PG^8G_`+F-(^:!4U3/H/XT?AUU?6W" +MJIK98/%DJ^G8?*-<#!-&WH%>%L-G;"_3B8Z&]':>V>@NUMGEH/7M:T?[L@+_QUZ9XG9G3S8>-?4@4A4!G0,+\A'=!D]RV)_'+R\_2'*^\W6.5Y*S3 +MMTCNT<#TB.SWZ8AA9CH_'7Q5``CDPBL- +M@Q(E(&!G8Y]3Q]._UK*%(U*AL)/R,+Y)MPSJCPUMMRM%H?2-#$(J:AI*J>3K +M(*+N:@E<=)(R>D@[#9NY'8E:=C,16Q%221NCD)GNGTX\#,TJ+:38W>JC:ZRT +MFEZVKL-'1P#Y2L,T45(98:>E5G#]=)\P6%/(W1+B:-GII`LD2AR2IZ+LVD:E +M$8A[B"X1)AS["V>`W.+@EA`=3L^8"I.*K#K"QH$">0\)F+Z$:H2GO5DU+R9T +MM4+9BMWTG<:6%"0\X>DEJ&5Y#$9,K!+TJQ6,C>$JF-WXO56B^AM%XS$-JM(L +M!%F\Q=P-^U89I/!59U=E7#SH6'4SK(U[Q:WAHK)Z'Y=:;K_B#^)ZYZ_U#KNS +MZ:L-/<*^XU^FK=%1S4](@65)G3'C1QR1`P!51W4.99B&7#P>&VA5I[,P-/"4 +MV5\\,;+W"XW@@&8#YX[+H(=D;3FX#B`P'.XB[B22A,+BZ[:[/T` +M(G +MI*22FJRG5X"_,S@^$'9G\1SG*%G]G,PU3:F)JU*+12ZNF!(:.P0299K#M9C3;1-PRX=J9M))UGE<`+$Y&Z$Y+7CE7IJXZTT)2S:@9 +MI(VEEO,D,D\:].'D,DK'K+&7**B*F`,N2S<&=*=H;2=C7-V5B12:+D.`-Y([ +M((L.S,DDDDZ`!-[.V;AW46OQ%+,3P)]>=_EOE>L;^T+^*NR_#-RSET1IRM2H +MYH7B!XXDB(,E.",=9`[`9P`>YQ]>.3?BMTN;6=_I5`ZW<1N'#O)W*K;5Q9)_ +M34_B(EQX`_4JN']EQ\`'Z2U!0?$?STIIKWJ2KZJBV6ZHB#K3!SGQ)&;\4ISG +M([9XDOPXZ#"BQN-Q(T^$>&IY\."(V=@6AC:K[,%P./?RWCU7J`TUI)*>*.*D +MH8[;1!<`!0NWT''875`!F*EW/>]\`1S3&@-):(O$$@ED&=]@1].(7$8@"Y4A +M0HP>)2AU5S1I9:VIA2=)*6`8E<'8G.,#W[@<5#$8_.\C4!63#84!I<=VOV2< +MU)>(##6:HU%616?3=%&TDCS-CL.Q^PX`QN(#&E[S#6ZGY`(["434>#O6K_7? +M/'5G-76=!8-#)5W6WU5>M-#%'&Q@HZ9!UO/4-[$=(53^)BH&>.;T-HOQV(:V +MC=I,:&`T7)/AI.IA=`."IX6@:E:SM1[X<>=N"V*.-!EB/J1D_\`7]>/E%^8C;S=H=*'8&E: +MCA&-;']Q[3IYR1X+ZH?EEZ'MPFPF8RL.W5)>>X68.Z+]Y7FC^)WFE5:SUYJ2 +MV6R2G%DTU`UKHU4Y_6MCQ93]2Y5?ITGCUK^7WH$-E["IXFJ/XV*[;IW-N&#P +M;?Q7"_S`]-G8[;57#4S_``\("!S>8+SX&&>!2>U#544=DM,5-(XIY[I.'(/D +MD2FB@AC!&>V5.!]..[.?-0NX?JI))6BX2)25#8-1J*2OE +MD51U^&%Z-S[#K;\VXOU$9*-_Z51\35#ZH&_-/T^I7IQ^"2.T]3-*M%&6!'3XKC\!'%0VO78`>LWC32TW\[`>* +ME,-3+JHR:`_3Z?L5KB^+;7USNEDU+32,E/=KC6*U0T4?DIO*L<<42?\`\-`[ +MD#OMD[D\`[`I==BPXBTSY#0+_A*)KD0.S)GG'!<]QF+%+X=0!`X=_? +MJBW04\T]M;_:*']+U%4\B1QNP05TH&!/*1YA'GR[]/4$QD9X&J":AP]`Q%YW +M@;P.?#A/)Y?4=Z+M):LI+%HBKT9J::YWB^0372Y1UI*H +M):1D+P*7Z).DB1&1>D;9P",\26$V;3=7-6@`P=D&Q/`&!([RHH;3<:!94)+A +MF(,QN)&X[Y'DA#7NBM+ZGT?IV'3UZKK1HPVREOZR7JJ%9#635A\$!)",1R"8 +M=+(-@P/;.Q^"KXEE7K*],/JN")(,Z0M5JM)]$-IO+:IM$7B*RZ@HXZ.G@J!)3S"19$=5?/2'!(!\I&,@@[$`\6S!8 +MRC78*U$R")B\^O\`C@H3$X:I2>:3[05)K-=ZO]&>`\M/7)<7JZJK"A_#CE8I +M&6`_98,"0,^F1WX-J.:221,@?*2F6M=`C4&YX28$J:JV8W2KJJZ.LN,?5!23 +MQ4*KUS53AB9(T8%3E<#I[Y].`*5%IIV,"\3N`X^*(?5=UA:9.@MQXK)I(;;J +M2(VVLK;!XE*8YEZ_#&WG3/EQ])^'=G:.SOX3RY*:P=45AE< +M1IXPES>K25<6:\?[N22M-5$8Z.^`_NIV'TVX/P.(C^)2\0LQ-(N'4UM=0>'? +MR2TGM=1;JZJMMQB5'.#TY\LF>S@^Q&_$ZZLVJP5&WE0@H.I5"RI900J:B""2 +MW2D*#D1N=SMVSG]W`H1E*L`("X6JNJB)6=WR"`.H[@_3AXM$`!:IY@"Y&UDO +M"T+S/(O7*^,G/F;'IGVX;9A7 +M*^&*S5`U+1P#J-/34C+*>G_FH(HU`^^')^W'+_S>XEHQCG[W"GZAQ*_0DVDV +MGM,4`-&C_P`&MI_,>BJM\8UJ&EOB#AMD`JI*273+5*1QIUL4EK&)"I@DGN,$ +M>F=@#QUK\LF)?4Z,5:\WZQGHP:^:^8WYQW$](,'3_P#XJD^-4CZ!;<>4NHXN +M>OPV\O[C?:>'Q;A9)M-W>$Y*O)$IIG8-TKG/2D@(&Q/TX\#_`(D8"IT3Z>XE +MV&/_`"ZK:[#R><\;^;?!>\?P=VG2Z5]!*3,4)ZVD:3QS`+#\@5JNT_88-,W^ +MMT]=)474,-144125AUR&&3PV*@GS'J\/`R!ALD@=_J+AC4VKAV8G#WI/#7`C +M>'B1II:?HOD=MC9!V1B*N%Q-JE-SF'EE)!L=?93FH]46VQ]$M*E0##*[2531 +M]$%52*A>.I296R(^GQ"5"B1A32@=@4MVRNC#:9:^KK_3O#I$BXBQ_FN&ES3O +MO2-H[:HF96E64G#LD +MKO2Q],*EV9J:I0$L4:VX);<5IK/G)JOEUI*Q\S-/WR2IU!JK6%UKZN@K)626X4`1DHI9'8LL +M\4$=5+A`4C#NBNLA`5-8#9M/&8LX"H,U*BQ@:8L'-/;(G0NB#$F&FXWAXZL: +M=,XB8<\D^7$B13)@YB8,.+2138"' +M$@EQ#4[L(,H4Q5([50@-O<\0!\W:7@`D6,->?"7S)U)IWEK7\FM=IB'43XD@1=V<=."68]"Q]O64I8#";/J.IT<&ZK-RX9#?Q&N +M\\22HVMM"M5:'5*H`W"\CR\AW+TB\@OA6YK_`!Q<^KU\2_.RS&AT[-5B2V4- +M0Q$$2*-<`&C7>58L!A1(R>^:2EGL`95N][G^7LM'&TT(=L&23&\LN? +M8'8=AN>!64.J9G<8@2.7]Q^@1I`>PDN(W"; +M238$V$S>(71-B[$_T'^$/?"30ZOYSUU5?[71V70EBJ;D]);J +M.CF\1+!0($,]3+(26J;E,P6(._DB4N0,X`M'1)M>JSKP!3:X]D#1K1\3IU<] +MQAH)T$FQ(`@NE)-*H*)<7.%R9FYC01N%FSI)=:P&P[XJ:H:)Y-2Z"T7$M)=* +MR&.GB)?H^5HPPZY'<]F;J;<[GS'TX;Z:8AK:)I,(:`,SB;!K&P3).DW\)2.B +MN$=6KM8T27&`!O)W>]W(+RS_`![<[:/3EYO4^GYHJF.PVNHD:5!@5%3D],9/ +M<]4G@)_[0WOQ\O.C^PF]).D=5[;C$5B)TL7$N=>]F3Z+ZWX?:@Z.=&G5Z@_Y +M-/-!.YC88.][R`O/U-\U3VL)=:N6>[W*YS5=3.!DR10Q^(QR.W5(YW)]N/I[ +MA,$QH#:8AC``!PW`>`"^9^T,=5J%W6.E]1TN/'>3W$DHYNFG[I=4Y=62VTRU +M55+0M5-'%_Q(Y2[G+>@SMN=O,NXVXCZ`[54;Q\H2ZKY%/G]_\>:K%RJT-=;_ +M`,P*1*^S57Z)H)I_GEF#0J^66$0EC@^9V(;&X19&&.G(Z!CBUF&`=R5.PHG$ +M9N!,^2WYRZZGK>1?+"G/@-35LENN]+3*BJE+;R9HZ*.-1CIC\.W4\@3L#4;? +MBR>5[3$UG1J1?RCZJX;+LP$"1,#GJ?HJ#"HBG,9(832&-N +ME6S^P#N?7;'$CL89=+$#ZH;;K@6#OGQ`574MT?Z1O^I:OJJ)I99*FL(WK<74XMQIMI,M-A]_NJ4*#>M=5/,GN"[Z5KQ1WZIK8V#P2,8JJ-& +M;PA2^&.J/*]D'EZ=]V*\.T*`-$-!@\=\S8GWHHO'EY>;\_(:?9/3Y#]*VVW7 +MW1,]#)Y +M76R\7C2U(>8%DAD<`O'FK,08X$D#+B1NGNT;8P?3?B[]'OQ,V?BG-IU9I/=Q +M^&=_:&E^($(?%;&JM$M(=W3)\^*555%;WM-;J:IFKK75/X`-/2X2:F<*%:*$ +M@$1]6$4MN<9QOCBR-J5,W4F(;/0``JB,C,RCJ)ZP03CTWX*=A&UFM9>XF2/K/HF?U'4O)D6,0#^U +MQS1%3U$>N-/0S-$*RL\-D1POXF!R5)/HV,CT!)XJ5>D<'B"W0:JXX9S<51%0 +M:I57JF,<;V:YI+'.AZK?4$C,+[9CDSW0C'VVXG<,[_Y*5P=1]1S4/7`/\*K9 +MVX_0H"NU.:FEZI*>2GKH<+(C;D-_IP9E'Q-T*CSV1!%T-5E0E,:4#`8IXF<^ +MI[#AQ@2ZK[V6#5W&1D\&-I%=SER?1?IQM[)3321HHFLJ7DB89554'(QG]_#8 +M;=..J3:$Z.3WPZ:XYLQK=(GCTOHU9%2:ZU,3.9![4\8WD./4$*/4\0FV.D-# +M"/%*,U0B0T?,G=-IL\-=>:K4NG: +M>VW.JN3B7K@AK(JOPVA`$:]30#;?<*">.#=*:^(VQM;9U=\`8:JYX`_J=3=3 +M!G>!FY<>"ZE^&_0ZEC-O[/P@N:E>DTD\"]N[06DE7$Y&TMOHM2WE[:Z5<;89 +M0K=1`8%LD^N2&Q]!QQ;\]&#;2VU3%.S'4VD>%O3ZK[*]$MJ,VABWX@N[4,G_ +M`*W5'?(!(?XX;1IJEYUZ-OMTH7J*E-*-;IT,)(EC%6LHFZL8/2LPSZ].3@@; +MS_Y3AB:_1JO088'6M<#.\LB/&.Z8&]?/G\W]&@S;V%KU+S2>`(_IJF?HGG\# +MFJ(*K1FO]%5JO0BEN$=TMM+&B+'%3-B"H0].#XJS"(N`,8>-@6#@\TTBHT!H%5HQ7 +M=<*5`@4],'F&29C$WK(T\)ARTXE\F!FB`T-(L9-RR);I+A'],KQ]-2I(IMAN +M@G6;3XS$G0$)EW:WV'E?ICDK\1%DYESZTNMVKI_D;/X4#5-#1F*=>NDCBD9S +M4P2I,LDCG_@$.N%9>K*+NNK5\&ZGE@3<@S<7=$V<+AL"71)U@"I_"8RLYV;= +MI!$[MW&YW7"16FM7\O\`F+S'U5+J*:JT]ROEK:ZXPVFDK)$M=+\Q$#+1PN.H +MLTW@E65!EE\")G\-)'X'VJ[$4,+2ZILF1][K +M\)WG<+[_`)SS52[C=;[KR[FMIZ*YU$3R54L5)2T\DGZ.\:5YR$"C(78G"^7] +M4=L`\7C9V%908'-&@`/"0.&[C&N]5^L34=``-[=RL9RQL>M]&T51J"MH;K9- +M0W>)M#Z=I:J1H*F9ZC]74SH)"&DHX8Q41/X?E62;#8`8\06W=M403AH.1HZU +M[@):`TCLG^YYXW+1W29@=G/R&H?B/9`)O>;CNUG16BUS;N74&G^7]DEYS\S+ +M%>J+1<-!'J*&E*6BZ-%%-!&D!ZTF$-.)&A:H)Z)(I5"=)(62L;,;B*M:KB:F +M':[-4!!>M17*+2&D)%CDCEFA>:6ZEI0A@INE'\,J`_ZV3`\A5>I^E.+? +MM[I92P+7007M$WT\7:`Z'*8D7D*(V?L1UJV&%(IG,XBD::%&3I1B(UZVG8("[DU%SF +M8X!^TFFL^Y$'(`UWP]D$`%P&8BY$@$V@2@R82)FYG28\%^C?1BR +MZ2T[:=/:9I*>TVZ)1%$L2].-NR_4G)SQ//8UK8T"0YS6L#6CL:`<4R](QQTT +M!J9HV:<[Y4'+'/;W/^?%=Q^/+CE9JI#"X=C&ES[#W9.Q.JWVY;E=Y12@+D1G +M`*\1E7+19F<>T46QQJNDB!N59+Q6Q:MO=;>7ADGM2R>%"S;"1AW8`_LCWX@* +M!%6:[A+3IY_)6!@@=,U4SZ>1BEYK8S@2X_\`[>)O +M;T)'V]^*GMK'?J\V'I&6`]LB;G`JU:AH46R^VFZ=&]W +M$[A=7BICF4*/7.FUP!J>`',K;;\+_+O3OP^\HZ&A(I*RKMU''#=+D,(U^K\Y +MD^7SC$?B,ZK[C)/?/'7L%A68?#-I4]&ZGB=3'*28Y>"Y/C:QJUG5GW)]>[D- +M!XD6A53^/WFI.M1:K;)=Y;/6SF.::D"=32+%Y@K,1V,DL(R-CX8'H>/._P". +MVVQ0V74DEO7%E..4YW^.4$<+@:+T'^`71XXG:S7$9A1:YYX3\#!_W.!YPO(? +M\>W-B@MCI:C'-5UMZKIKU*['):EA8Q0`_P!X22J\F/7I4<<>_+%T3-;$5=J/ +M;:G+&_[W=MY\`6M\UZ-_,KTO_1[+H[(:Z[QG?_L82UH_ZG`GG`5(M5)4T5%2 +M6&K9!=X*&>EJNO8I4.$#[^A4N,8X(R'E7U8-G`]]^^_%!3IY=UK\@+I3H`]>+?M`BH&,=80#Z"%5,&\TA4>1_,1Y$K9W#JE:[27+WP?&I*2&P6!(: +M:1B[P(MNCGC@8_\`\J(JOUP#MCB@8JDXU:A(^)Q/@('W5HP;HI-&D`>9$_55 +MSU-4TRO#XF?$2*,^&AR2ZEE!;W.,]_IQ-X-@!=P(A1>VJG89F.AE)OF+3FS4 +M&E*>8F@HZM37R]04O(BEE`PNY.Y8'./.-]N)?!8>JRH[?EM.[NM5\K]0M=[+-/5VPR(M52%.I9PV!)Y6&3D9./7J&?4<6 +M"MLNCB:>5UG`V(U"@'/>QV=MQ['BK*:$O>A^;IA6RW:Z:#U93JAD`8&%,1BW5\*[_BVBHS1KM'#C)@@\M#S435H4WLRTY!UC,;5:Y7,M^N^4MQI*>LJH+;:4'4DRI5RO%*S1%O$;I +M=$*@1LW4=R$R2JNJK`XKHI4#(I=J.,3OFY]>Y#/VA5=VM#R^VG-#FM?AE^&G +MG+0W"MK-+T5MN533"7YNSU$M+,ZM$)"SH"ZL`OB#I9690H)4$,>&,!C-I8)P +M:PDM&@B1.L?,PGGX\OD9M>/7,K^RCL])4M=^5O-!H:*4EZ*@O:=8!10Q` +MJ83ET.VYCSOW'%RPGXC5[#$TN-QRYMM,ZUM!(>K!+>%U,FX8Y*J<@9QGB3?M+"XH2*@)X$0X>=O53VRL +M=D(:P1XH`UMI(:DL1O-##'+=:93'71=)!*#<2='<'<@C;!SZ'@39^-=1JY'_ +M``NTX3P5FVC@VUV9Z=R(E56>KAG4051\Z92.;&^!W5OJ,>OIQ0DQQ*,PVR<17O1;/R3TA_LK/C#>:ICK=,Z,M= +M+$@;YB>_0M#*>D$@%3@PO\`^JNPW'L59/#*9]0$>.C.,((@6YIS +M:*_LS*K1=W@N/->_Z8:NT0B-9*>)CTJE%$JGI +M9:1.EY4!*JP0$H"'.%4DQ6S,!^NJN;E.XGBZ3<9K@&+@FQ,#5&5W]0T.&ATO +MISBTB>'>;)#ZYU_4W&.BM%7-7UHJG:JIYJ:0.L31RLE3#(%"Y9&E*';#CPGP +M"=NA;#V%1HN!I@`"`9$2(!:;\8!C5IS"ZZ/^7RN\])6[2JSEPK'U.6<@M8/` +MN<;:Y05;[X1;Y#?[GJB(T%=2U5-60T-2DR=)B9:8OC'I_P`7&/\`"#ZGCQK^ +M>6J]V+P;\XBF,V?7PT5*(Z^F6-L74R7$`F_::7B8!)(`U*Y1^6[IA@^C_3#!8H +M5NQB"*+P2+!]@8W0\-N;`'5;+N>U9JBVZ0Y=G,"U\Q]2: +MALDM!R]OEZ2$U%EL$DE97T,L:AT9UZF6GDZB=R7\H'4LC99OIIL]^%K85M)K +M26TW'MN[((T@%W:>!8#T@0!\L-H5:S*I7EBOC? +MI07?41>Y30H(V-!UU,@F,Q5@561PJ(H2-<+)Y7ZU8$[&J9\4]NK*8#1?>!;0 +MQ,7O)B-$#M*13$V<;_6/7NN4CUK[V+17:;BAGHJ,'YNK@CC`ZV0=(>1B.KPQ +MGJ`!Z2#DY`!XMH=1>YM4$$B0#.DZCA)\U"4W'+U8'9)^GV5Q>6W/WEERUT[# +M16O2^JZ.%80U;\C-#`U=./$<2S%LLS=70%0L4C"GZGCGN*Z+8_$X@U<1E?.X +MDV&D``0!O)':-[W`4]1VQ0I,#&`@Z:#=K)W_`"%DEM2\U+SS[YCZ<;5%906J +MPRRK0Q0N[3)30.P0++-%"7EEW"ERO2=E1(T'2+7LW8]+9.%>S!M[4$C<-\0" +M0`!KQ-R27&5$XC'/Q=8.KF/M\S.B;%TYMW2VT-GY;WBEK4TI61UM#6Z9CH$% +M71VO,<=,.G8M5(L"R+([=!,44F"(E'$=2PM"OB7;0+R8B'%SLI?%^S,`3`+0 +M-!WHO%5'-:*8;:3:),;K^<'TNN-#S/K.9M7I3E?H[3=_TQI.EHI*&O5()2;1 +M0=T&Z-B= +MP3YQYJ.ZBDS*-\:@`1X=XN=$56O7EFT.*VP:1Y8V3F'=*>=X;L*.TFN@MDJ[ +M+3P2*1B&,$Q#.>IH9'!Z77BJ;4Q6=X=BZIH@CLYGY2[67$1J;$C^4$#4%2.% +MPHN`T.(L3$B>`[O5?HH\N:V]ZWE?5:P//1R2&"V4J[Y7..K/;)QW]N+1C\2< +MUNX*#V=GJDXAYMHTLAG\L9[G&>`&4^K&;> +MI+$.`^*W+[H!U5J%-45-2\LKTUCBR,Y(\;[?3_7B&QC`]P?4-E([.:7'.!R_ +MPJ2:[Y@WC75TNO+WES5K:;+0#IOEZ`RE`G_^/%Z-.W_Q!R>*)M7:-7$DX;#' +M(UMG._I'!HWN/IJ5>\#@12`=4U^G[^]Z7&M'L7+?2$MSK:A[=8:8,8:?O*S; +M=.<_B8G?)W.?J!Q&XA].A3AMJ8O"G,/-0EW^`/>I0-\/7*.]:CU$VN=7NVEX +M*]99(X9GZVH(AYIJF9QCKEZ/+G9$R$'8\371[9CJ3>OK=G-,#>+W).\Q;@+- +M&]1.VL7F<*+3)XZ;N'<;\`0+$E-FKYH0\TN;^EN5.CJ63_TWLKI<)I`Q\2O6 +M+SK$<[",DQR.Q.2"J[`@<2-&L<15R-;%,7\.'<)EW.!H`H>JQK*0)WB-VFOE +M$$\K:"%0_P#M+8+V>?,=_O5)-_LQ2Z3IQ038*Q5L[U#"1`_J5F"HX[H(A_>' +M'DK\TK'T\3AZM8?PF-<_D7.(9'>(<(%_->R_RJX?K:.)%$_Q7OIL[FM!>>Z7 +M.'*PE>.77VI+IS'YOW[G/+\OJ+1UFO:4-E@J1TP5E1&6-'3]'K#$E/\`,R#U +M&!^T>/0/X2]$QLS8>'P9;%0MS/\`]S^TX^L>$;EQS\9>E;=I](,1BJ1#J+'Y +M*?`AG99WCLFH[B#&]+^&XSZJO^G5DJOT@T]1&]5.S?\`'"S>+,X([DL'W^G% +MTQL,I/(W#]@N?X%A>YA!D\=9WD_-&7.HM>+;:ZND+456]TDK<[X1)(?$4J=] +MLLI`XJ^RFBC7<7<(]59=I/STVAO'YA+AKN]%4ZGJZ"/KJ+C:JAW">5#+)"&D +M.!N>H.XQV\Q'$M@VDL)<="!ZJ/Q#PQTC^:3XP#ZE73CNTU#;;CXX$C^KU6.! +M8:<^&,JBNI`#QN?7(8G.,YQOZ5G`8EK34INTOY64]5J]9D.^!Y\4%"CAKYTJ +M?"CZ#(U.T:H<*^!U`8_Q*3^?[Y7"XD06M//WX636*P[C!TU_=&1Y?I<*!M0V +MFK:SW^@Z9XJN(X\ZD$+Z9R,@KOGJ!QMP_6VPV>I>W-/O@>]!NV:QPF8/E[X* +M:M_-"S:^IZSEMS1TW;$JXTJ(WG0"?I9VZBW0Y/5&63\&_2,A.@.DUM +M>A5EO])`$\)V9GQL9W_`$0[9W$;CZ'+2S`N) +M.L'\,F2"Y.1U]"@Y'EX.=1HU`74S:??[\=%$5&EIREMO4^2N/;^87,&*BEOM +M14IJ"TRR$I5P3("ZD$-*S%BK';)R2@,>%78\1>*P-(C^)W:?/NW+*CW;MY4? +M6'#%"/#@<&22'#;$+GJ&1OUDH.WIOP&=FMGM"WB??I=(IXL$1 +M-OOZ_1*_5E=HW5LE)-?K';*FEG6H/S/@HP<=(4JLHPSD$ACB0YQC)SCA3]FV +MENG?IW<_/R4CA]I5V.!82.[W=#G*/X#>0^I-1P\GNW%#UX:>]T]4:BO +MEE>"'Q"M(2BC=MB__$C`,(4AY4Z45CT$PJ>)IN&%$BI29`D$;S&^!8&VD,F3 +M&;^)9#L6T@9W:V.[AKPGA/.T&:F<\+;0):['>`E#46JFG=)*V:D2;]"&2)EA +MJ97VZ(^L&.6-0ZR1O4(?P*>+MTUL033%4Q$C=)OO^D:0;Z*M$W+#56KM<6@:7L=RI-3VRS7&XT%(M09A*],3X +MUMG<91.C+*M3DF17A<]/XA=6[3PE##1B'2RI4:TF/ZQ+7MWWCM-ME(=W$38^ +MV,;A,1UF$,'*9X$#<=)UL>!"M_\`"PM?*UKU17T]-3UM_IJ.[,*>G6"G),!C +MZ8\$,Y'0>IW526[`J`Q\#?G!+3CVX<&U%CFWF?C)DS.LB(M'.5],_P`CV(-; +M86(Q-8RZK7#I_P#\;0!X(K^,RSZ/OWQ(36?4VC[#4VNEL]N2*Y5574+5?.U` +MS%3TL<;`22LU+DQEE+0B4=66REU_*=B\:WHI5J86L6DUX$DCXJA```(S203`U6LJ_7?FQIB>$\MK3HZ +MJN\2FF^=TG9DIJSQ@K5#=85,QK!)"Q*J1'&XR`>E"OM;9%'`O>!B'5!&C:CW +M$9=)@F^:8EW:]#\T:6ZUNF +MX[W\[63ZCM])+)T2K2E5I(:8CK?P_"\V02W7U;J`Q^O6RA-.I@JK"2W+%,/` +M<&S\9,]G-,]P(O*^(N+86/%5]@9DQ:>`XQ?T1Y\2]K5I^90TN9KU4T%5;+CJ +MNIKS*CB.0,+?1P1#91$)Y995;Q"COXGB*6:/C.AU`X=H%=F49G!@!GF][CO) +M-O"(.I;VP'.$9IM?EI`[HX;M5-\KN9?*>[6/2=CUY9JN_P!^L]#^C*:KK$:: +MJJ:63"RT\/@LI952)?*X?(DW)(4A[&[`QK*[JU!PRO)=E`,-(B">Z-``+;EJ +MAM>@6M;4':;:>)X#<)DW^J:DTA#HF_WC1,G-*V4E3J#2I@O!2GCI9* +MRGJE\5#EDD:5*N/HDP[.P"H.CS1U7IC4_6TCAJ50TGD-)[,`Q$M$]J!!,D`6 +MU3IV-2#7!SVAXOHZ8X'IF=P[O&L;8L.$VEM'#-;2JTB][B8+G">.X1`U)(`X3(4= +M7HX9[\]*I#0!N,>IU)T\RE_4:/AK*E.85NM?-B^4=1(:A[[7LELI&@PN3))' +M!@1%0R]61L1A02,[JXH4V'#-6?+5-&Z6UG05'.FB-\%1-/^A6CJHXI(Y"BP2K&O7'*L?@NW6,,9CTDJ-C, +M#B,:ZH^C4ITWN9$N=V021)+9!ELF!!W7U3>+ZD!M1CRUKM`+V%A-Q?P^2_5) +MTTNF.5VG*2DIH():I$$--#&`>D>@'MVXC,,RT^X1F(Q#*<-;NL+;ONEA>=07 +MS4>IC9&KRE0Q2>2")BP$.>SG]D?3UQ[<:KN`&4?$A:.%SU@'ZZD:F/D%7'XB +M-?:TNM11\J.4TZT>H*QU2MN[CJCM=.20[(.S28!QZ#N>W'-]OXZO7J#"X4P! +M\3[0!P'$\/5=)V5A&L;UKA?=ZHRL.AM*2>/$E2%(E[H'LJJ_,N.76%XT_$$-K5Q(D0!J2?A`''APNXP! +M?#@ZSNL"#(R=Y6#-CS<6TM(;DK.`(NZ+`<-=PW?U'M%50F7F!]86^ATUKR\U5@O5!62WR.T1W!@%:IM:RQ%):0,!CYEWC4+GJ!8 +MNQ"H@X;V7693P[G92"209X38#OD3SN3$!+VI1J/KF#V1`F^\"W(DQ:\#6P$Z +MU_CQYH6'F?5\X=7T%]N%+;9;C6T]3!UITVY(@T8,;`X`V9M\'96/XN/&WXT- +M&UNE6#VBCJ7VJ+K42(JRSM__#4]*H`-^E!D[GCW +M'@*+9ZR-?E-EX>QN(>0:Z]NX7O*F.7J0:4T_;+Q52Q&2WP2Q!WW! +M)C).W_NE/;_+BH;4>:M4L9O5SV=2;1I=8[^4?1$5I@J+WR[N,M8WC5-#XM;Y +MV_6)3^(H5,YP57]8!MD!\'89X@MH5@,0,O(*3VA%8N&]P.@=)'V^G$S1)%-S6ZR/?U4<\%SQFT^D_L$\=.:BJ +MJ^UZA@,@EJ_T+9[YX3'&)"O@F,^Q*MC./64*S%.)S$WRL/T4 +M#1ZI2A6TW=/"J9K76TUSIUE!7,90$#([9(()&^>W!;L*9(J>4'JCCRL<15"&P0`"`2;A@<2 +M:6&=4#X`;E:.&XDZB>%M5S?'8,.KBG%R +M(H0'!#*P9E66I8]M>C-373_''F->:A<U!\0>C==22::U;\)FI*O +M52*N8,Z))'5TON5"]MBVVPZ>(C%T64*?6TL3U8WR;6Y.X"YTF +M5F#PKZIRTP'#QE-^S:/Y54%JIM1ZIY?'1\:P-)%8XZ^JJ+C.O00(JBH,GZL' +M)PL3*SL'7R.G0*SB=L[1J5',P-0N&F>``)WM&\CG:X)D&5;=G]'Z3&Y\2+<` +M?0\!QWJGVH/BJK*B^4\UMDFI-,05,@H?D:<4CFV+3M-3PK$IZE*F%495#,O0 +M,MEYP#;-&@%KFIXX'G>E4I$]/EI9&$FNZQJA)*&J,'ZU!`ZR.QE5 +M<(=^IRRX!&%,:Y9L]]P,%LJC3<"1KK8;]/Z1N)!.8]EI`[26_'N2(=/5%??:I:6=ZB44QZ5D!,^(@R9:*-E?PP2CR$%]R#V)!(F+_@M!I#*2 +M9,6,ZP2(+C,"PB`P&Q*?HMZP`F\#0@1/C;3S[1W*%YG5%#8;AIC],71(:F`5 +M+0YMDCU*5"966HBJ0Q%0IB9DGHQ&,Q=(O3P[T6Z-A&XK+74E!+-!48)E@C9H661WZY8GABRBL_1T*IT7IXG9[:+W9:CJA>T@ +M$',V2,S38.(!D`!N?M055W;0JLK%S0"`V#W'AR)MQ%QP*?\`\*>I6U!IG1E3 +M\W\_'")*:GJ!4&4O$)9RJ8)/0J;`(V&`P3G(9O`WYS\"RGMHO:`"^F'$<+AM +M^),$E?4_\B==[^CE8&X%>/\`Q#CX01ZH>^.+455<_C6=)G!(DDR1A6ZLX`''MYVR65\,QA,AHMO$Q`)WGYKQ0S&]76)`N3Z3X`: +M!;9O[-WG)3W::_V.IH*VC^3O-1,M)55+U!^5JB9@K.WF8"43(,G.,`G(SQ\N +M?SL=!:FS=JT=J4XBK3;<".W2[/\`ZY2>*^LOY(^F#=J]$ZVQWN[>%J6XY']H +M7Y',/()0\Z.7]ZNO/NPZ(T3J4W&JT9?*F:L2>!:9K;15U8&AG0R'Y=HTIIX( +M2%`9UU37TZEQN-@JK5SF305VU-4U<4U;` +MBFGH*DT:'P::ID&&G!!`$#ECEQ&2`P3B4&U*;,93JX%HIL$DN<.6AG6(1,_B*0`KH&+2(W3GQ//E6STWHUTE_44*K<0;,=!)``,WT!,: +MZ&][Q*IFUMFN96;D^(^F[?\`/CN1AI?1NIJNSZJ77G-G45QBKH7J;M26^HFD +M,Z*(0PEJ&D!<".F5<`>90`,(H;B/Q.WZE6H&X>BS*T]G,1J+V`!B]Q/?NB6B\J9K?=8M3Z=>V\PM"&Z+!+%^D(UCA8'HIY*N7,BB/)0 +M]+'S,S)TL%SP57Z4X:IFI5LU*KEN#45\N4]*LK4A*?+PHY8HD,<:JBM*%5=BSA&(#`@\4WHWLX' +M&-VE5!IM8'P)L2[>Z2?A',!LPIS:=4FF:-;1V" +MW5M'1W&36-V/3:K=(O5.B'_GRI^R`-\>@(!WX=-=1W&IJ-55\7765M0>J9O\``![DGI`'T`XJ6WL> +MW"TR)N=>('=Q.@5OV-@FP3H-23P%[_3@AOEOHBZU#UFM=6216:5XO$J8Y%PU +M/"=U@)/9\8+>WY<56E1=DFKV0!VARW-[^.]6D/),-$$Z5]C50D:(Q-XK,@)!&%R7R2HVW/5@;L!Q"UGC%5G5ZH_@LC7>=P[N, +M7&[4*68]N%IF##N9TM(UX290U1^'7E:.=W-_3SW?FC4P-%IRR/&/%IKG +M5C*T,"C.:ET"+++VBAC9`0.KJNH8["TQB,0)JF0T1':=N[X':.C6C*.*IV)K +M=:Z6`GD1Q'#C$2/Y6]D7)6OCFO>DTORSY@7'G1K*EET]=*F&^Z[U$:@EJZJ# +M=:6Z%20$HXT14"+^,Y.,,.@4ULS976ORMX +M9G'A&_<(!O\`W.)CLA:F=:_&GK#GF]WOMRME\Y<-+.P"^#2@+U9R(C^)6H==B=20`V;!HD`7OQ).^/*<_2M9B& +MMI#L@$@_U:G_`+;2YVA@Q,6I=S>YJW*B^!Z_ZEO=VH+K?[A<^FHGH83%3R2O +M.C!(@<,Z=2D>(=VP3@`XXX;CME==^)6`RB6MIN?,?T!X]"X77I'H_M-M#\,, +M>XZYPRVDU'TSY6(G?KO6A+3%CJ=6WV*KK^IX/F'FDSN2%.V?;)S]3Q["QV*& +M&I1O7D?`X?\`4U>4JV5SIDN5H_0M,&^6CJ3'48['(0_PVXHW6N8[K'ZG17)] +M-M1II-^$:IAV2HH9H+/32QLL-UJ*RAF15P45T8@J?[I*$#_MQ6ZM,N>3/PP5 +M-TGM:``/BM\TG[?:7I)M>35E48Z:ACBM\!VQ5RRQ(Q`]BO0`P].L#N1Q:\(Z +M:#'<9/D57*E0BL]O],#S"F-!ZD*QV6[!P(:_2%*V)E!#M!$PS[; +M<2F)H?$W>UY]6CYSZ*+P]9IR'4%E_!SOH@:W:@HH:NFL]54*]NJ(I:,M(IS3 +MLK-T]1]0KQ`?9L^O!U2@YP+P+V*%IX@6:=]O)-C1&N:6"W4]MJHF1H&ACS,G +MB=-;&Q$993Y3&ZL49CNH*X.V."]GLJ7RND&;*ST@V"'NP:OMMS@>CGK%JUD*LH2?'3$8U+HKMC/4K, +M5`[@]6RCQ#1,3L7$`=90$&3((W@VF,WB8G<"\Z2S<4USLM4[K1W'28F>7IJ6 +MK8;E3UB0QT=;75DL$2BH\6D"K)U^9HNMNGI4B9P23D"JB(\J%EI>U<(ZF7"N +MQNL`@W$`@$P3H6@\#E?O(!.I514EP,<;3KJ.Z_'>#HNC7%DY15D-':@OVF[E+KO4]%3U-"]VN5%; +M6C"V^D8`QQR2MXF)7,L4>%55ZH9E#9QQ:=LXFOAJ=0,:'?RM+I:7&8)`,=D` +M$SKVV$V,**P=&E7+03&\@7MKS'^#O"NE8=%*F;QS7Z(KE8;=44EABE7J-/20K3I51DF1^IE"K)D2`,#@2 +M=2B3HD*2,WA.C!&6M7E\'>28-A:22((D3);V@,S9".=C&@EC`&SR`^0_SQNJ +M%\Y=:+?[)-27"Y5M/0U<ZG4 +M!I:B^EH)-N1-VC6.(;E:J=M3$TW"7&YW:$Z7[N>_O52;A?9([K`]ETE57>HD +M:HJZR"`2]<5,WB%NG(#]*R352J6(!3#8([=(PV&!IEU5^4#*`3X1K:X:WQ!G +M158O"N@J)I[I%9:QE,CV_P`B3NWA1S28@5"S/UT\H$C$`>*F +M-V'$=5V7FO`+9$.O&I`[6\0]OEP1'7-!X%,*W1:ZQ +M!0.*QCG-EQN/O/S03'^D-'T6H:W4-IIZBZ7JP8MD3P%HJ:8N$GB@E@"S*65"3ZH0-@./F?^;#:+L9M9V( +M.CJ;(_VEQR^E_'BOKI^2;`-PG14DB[JU0GO#6@_))3XZK]76#XJ[GK":IO5K +MM\FFA9:::D8JDC!W5HV;!ZDP5++AMMCCN/0'Y5,.VKT2J4&`9W5G.\"U@=PX +M$!>1/SAUW-Z1X8YK-PS!YU*C@/4*I,5WY/Z3TD*1*&?6>H)*9H:I:B%U4RD* +M"8)"/)&N6?KP7/4`!G+<>H*M+:&)K`9>K:W2\^@-S-H-MY7DJA6PC:9>[M'W +M\E=3X;>;E(O.O3U!!I2AM5QJ]/".MJ:&15?YJREH)A.E?HN_R"B'3UJ&7P6(,>%&R+ER +MOFQ*Q8AL*N#Z'%?$/FF]K1)F)+NT0+FYD@";0&V`O=>0,3E;VPYPM$P!:??> +M=5K"U=37G4U;RYEO5OO=7=+K/4W1T0*TT%'-4EHP)7CP`HCD<3MA%3I(PH.. +MV;/%+#=>&/8UCYP`!D`[Y'9$GC;V4)B&$Y:;OBN+V[(-CQGWS25L'+87NF@N-SN,*^) +M3HR124;L8SUR!NE1N$R-F('40V,XXB<1C#5<71>>/O\`:5IM8T@`+ROTG?@^ +MU#KCXC=177FS=]/IIW1[$-0R31%9&3&1C/[..PR?<[[!QE8O!?;O2L)3>^H7 +M`@@[]23WG4#L[=J*[TOC::H'_P#HM(PP*RI4_P#W3KV\--^G +M.Q(SZ#CGN.:ZMBVU2;#X1W:O/(7CFKW@HZKLW'_L>/_5Z;_H^C4=4LC$>N-@/J!Q3MKXEV+Q#=EX5UC=SO4S[X#5 +M6C9^'ZFF<75'=.\G]KGR1)RJT_I7F7J^.Z6NG5.2^@YIJ2AJV8"*ZW.G7];. +M#V:&%P1U_M2@X_`#Q?\`9.&HO`\U'G+:W%K3P']3__`!:.)3VS,.00X"^[D#O/]SNZPYD+S@_'/\9^ +MF]9:HM7+2Q4VG;%RJT^X>"2ZRBLB^8'E^?FB4GQI%`\L`5V+>J`;0%)C:K@[ +M+$6$WC=,;R1Y*WNPYH@-@1J=;]_A:(.F[?JX==QU +M$CR'RQQR15$C.S>PD=,>V0`-AQ6L)L(__].6BFT=:`T9ZP`K.[?BE<#;^/8<7#%XEV(J7 +MT"I&"H_IZ9RC5-;2E`W^Q]3)/*342UTLKX;=BQ3!)_Z?RX@=I8@==;<%.;.P +MT4LKM29*EX9PFHM.VU)UDI8JRCII`IZ<9DPQ^X#$Y^GUX!PC,U-SSO!1>*>< +M[6S.@]4G[[?*B'4O-JAJ96BB$M.T*)_PX889$<'_`!,WB2$D[GPQ^5SP.'S8 +M2@._UG]E4<=B2W$UB[EY#116FM0T<6DN7==$$IG,MSM=0(MEA3YJ:3IZ2<`' +MJ;V[CVX-.'?U]5I_M/H`HME5HHTW`1\0]24(:@K(1<4AAD@J(I)Y,E6Z0LK( +MR,,'`!S'G/KGB3PK3E!.L(/%/`.7GZK)I-0T\UOAAN72C,!3/,QZ&C?!Z?$] +M.EO,.K]D[=CLY3PQI5,S$QB7MJ4\M3N]]ZL-RIIM73VU+M;[3=:VG:2**L-4 +MJP_-1#J3Q1)*5#`-T*S*<8/WS(XUK*C0'&"=._AXW4-A7/I.,B_L3X*UMDNE +M\I*B$U--!55.5Q'%603!XV(4@Q(Q#88CR=BQC#9$6U(Q^#R@M-IGS^T:\A&] +M6/#.8Z"#)'J/\W\>2ESKW4NG8I)?T=6VUS3&*1(Z:0A$CD"Y5R"O1CJ!8X9_ +MUCY)FZD,H[!I8EQ8\]D$WMJ1K>;Z<@0```T!1&)V@ZF);&8Z\OEQ[]^I0;J_ +MGK:*.V0UU]JKI=KW64<]LHFI417>/I?Q%#.V8XQ).TK=./.Y_&QXL6R.BC&. +MR4(:QL$^E[&Y@1)$Q&BKVT=K5,H=4DN,Q[W7X(?U'0K +M14E,]:T26=+CX4CTX0^7Q`L\B22G'4%=6&(P#)8?!DU,+U`/4M,ND7.2P<;D +MB8!`U&[XC`KBW)6Z\?Q(@03_`#:C07W2N=+K*:VVRDMU+XJ7:V^)23QH1.W7 +M&M8'CC650H#D+YCD]/2<*W4H:?L]KZA%LKC8V%CU=Q$G2?EI!3]/$G*'LU$_ +M(VY>RFLFLHZVW).C3T@9'B<2``J^>N7$+(,J%D#$MD2%HSC+-(]7Q&RR*EB" +MTZ1-M3K,@\Q!`!N9`%BI8DEI+1<^6[=`[CWZ"\P%1J^FH8JPSU9A149:D4D< +MD\:[,VSNPZ@%C<@Y)(23SR*X7AG_`$MI_A@2;1F@:VW"W,"!.C6Y0ENKD=IQ +MMR/W_P`WWJL>L-=V66XUE91T<4_ZM1U/6"5(D#-+@K"OZP8DG4R=4899I>A% +M<..+Q@L$64PPF3R$:B#$SR-P8+1?+"KV*KESY;[^7#3GQ29H-4\P;3:*_F3I +M735LI=(2SK;X?%`=O(RJDL_0Y:0J4C4R$@`QG`4=YK$TZ-:NY0Q5-QL%ME$5>B,),SB,L +M2I`Z6.22YF!`)!P%2Q]$X<4L-4G0=7%(![3!&4[S8C>?#T6A3IN>&%T +MM/OPX]W>NZ*GTS6)?=`W;4=/J*>E;-FN$;?,-5TS'J7P0@8JS%?.(QXC#K+$ +MB,#C6(Q.)8QE9C2)U:;J;&44V`01&5HL!^R^P'Y7=FNP7 +M0S"LJ?%4ZYY.LYWD3XJC_P`<.MI]8\TQ:WNDTM/0-*KQH,D.2G5U=6=SN +M^5-NT2;Y\YKZMI;;9J93*8#32225[]+>4*@(508PIZMRTD0&`79/06TSB^J# +M,)\3MYW#]SOW7.X+S1@A2#@ZM>-W%6^H-8/G1^7VG6P/2W';"KL&=[)&8Q#J; +MK@/,\/'5">I=9?IBZ5>C=3\Q:J/ +MEU;:\17:MFC85VI6W9R(Q$"\:M'(J1.0L:LC$L[XXFMC;'I8:F,90PXZYTEK +M0;,:3:Y,3$%Q%R;6"C,5CW5']4YYR@WG4QU@T5R0Y%:SNFB]=ZFU+:=?U<,[W*^Q4WAT +MEDDEA8Q_+H0U0^[%6J70X8-X:L`W$)L]VTMJ85FT6L#:;?@IF'%\6S/O`TD- +MFP^*Z>7^B]!Z?KKU36+3M[KK +ME0&9V%/2];J8XZ:)GD`8N6G;;>1P,M@<7S$S2Q53$O==X``WVF23XP-P"K]( +M?PVTS_*2;CP'IZHRY1\I]1ZUO-)?^8TESK!75[4CPUM64E*`([M)(&,BMX>5 +MSCK4NF!@`\47'XQC)92`#&@F&CA.@L.&_O4J'26DF7.-YY<3JK?6NFJ=&6RW +M_(UUFTG?:Z/YFXQ2B(3$!F2%)8RQ5&6-%P1YF5E+Y;@:"2GM$+W'7EQ +MA-/;Z"/!^3@!PJX'8_M$]MN^!QQS:NWJC26MO7>-/Z6[A[^2Z3LK9'6&]FCW +MZ>JI%R[M>H>7FEJ>QV^IN-3\2O-6:2&HNBCQ9-/6CJ4SSH.XZ%D4)_?GDC]$ +M.">CNR7X6BVD)Z^O1N"9V_M`/?V##&6`^9C>3ZD@:*]FN-0: +M'Y-Z,L/([1@MM"E);U@2WTYZV^7C`)+GL(TQYY'.&8DG))XOV/QU'#4QA*$0 +MT`1W<>0XJJX+!NJ5`2/#6PT\!Q.INO*I\>OQO7'7B\Q.5/);4S6W3<5;);KO +MJ66M\.6Y59R):6C"@O*54=+2`;9(&!Q0RRI7J"M5=V#)OO\`#?/NROE)E.C3 +M=3;\6A.\DW,6OS\]+GSE:LD@@BO-SO%YAC@C'@+"%\P8[$[[L<;;]L[[\72A +MALI8QK;FZBJV(:0ZHXHHY<1H="ZHN30PVU9Z66&FCQU.(?&A!=C_`'NE&``] +M6XB=KNG%TV"\&_D?JC=D4P,.]SA%C'=(^BRM!P?IVBU+8N@34#333R-CJ;YA +M(5D0K]$$4A/TSP5C6EN5[3F\*^:A:_0_,:(6OL@CFI;1XBBY&0F9F_!3 +M$'S'VRH&,^GY\!84.`*/V>]I8PZR?V0-=;@QU;<9H&@8)5DIT`_A1?+@_7A.S2*>6>I:!E$E31:J23I7&4BE5U./\0F\; +MG!]<^_!F"[+!QNA,2!+IWW]^2@[+7QH9A41I5-T,H20=2$Y'F9#LY7`8`Y!Z +M03GMP>\.<8F$"*H!S.$IC4M^N9N=PO%3)47*X-"OCF9Q+)60,#G#MG+`*V,? +MW!C\(X#PU2!DTCT3V+ESI%[75A;+J>EJK6]555Y>WE34?,*Q6)%RO220I.W4 +M[]RI!*]QGB6:UM0C*.UH5#.+Z8DF1J%AS:MJ:6Y7!-"5=]U-+.HJ*)(HY"J= +M2A,ROZJO^$$X0G;!P72H-R3B"!%C\D)5J2^&R0=.Y8C7&^U=!6:JO]9\_5W" +MH_1DII8O%:B,L:M1O21*29`)/'>5'+.# +MGI65,DOLXS$FDX8/!'^8ESBV0WEXDW/T33J0(-6L(,6$Z\UROFHDF_15UHX0 +M^J*:..FKV,LBPZJ,P^*(`RFZSZW6UQOL$=#JTU^K_``%0!WC5D4(H8+T2-U)Y +MSAL%L$MC@1E5_4#$5/\`FM.43>Y-N),@=X^G?]@N?4R-GMQ*##UJ#&MH]K69.IU.OWL$*U['N +M+WF`%)6VJY@RI?[MH2:_U^CXI7C@:=PRE%\Q_5/E6)VPN"^>(LU,*T-9 +MBP!5(OE&DVB1<>B?(?FEA);H)];+%TQJK66I9YZ*S'1%+=*A#)-+4T%)"TN" +MR;IO>^S0)[A/AY)D76MCT +MM1P:9*=ZNNHZ&HAI*6IC>0,]/5U,,9J`&/B,4`Z6"Y#;CB!P3!B +M,0[$8<9F-B"[,2#'\H)RV&CD?B?X;.J?8GA'?=&%RT10TVAN4FC=7UE=;(Z@ +MR26=[72NU#2]=E/5+@>^`?^H9X^:733%C&;6?CGBU6L]P']H-A?RNOM=T,V:W96P*.SF? +M_#0I,/\`N++/-35]#5SM5,:\&/H\# +M*2(YZE8>(,PHW4.K;IXM;^D%?$4JOZ<%KJ=P8M&\.F(,7CXC(T7,J>SJ3'4^ +ML((.HYS8\[V\$'37[2N@;!J/36B*^HYBU3U"0T%#=:1/D*=PZF2J$++^M97C +M2,-+T!B'"HREB6:SJ^,JMQ.)I]2T`20Z7$?R@[A8DG+,2),V20QM-A8TYC>T +M0)XCEY2KV<@KY<^:_P`$W-_E?JN"HGO%-;JN-X$Z%>HC@D$J=`792#'&`!@# +MH(['CP7^*&&9T6_%/`[KPP#O@=(&#]%L/LUS&9,6X.O,`0">+KF3WSXKY15<5F(ZL1(X[N&Z%CZ1Y2 +M734T3ZAO];;-/Z-I55JVJ=G:"!F7K2GQ'O45SKCHI(CU;@N\2AF4C$[6ODIB +M:I!RMT+HU-YRM!L7$1P#B0"W^E$%[C8:G7PMJ=\#QBZNKH35-FY>7_3$M)J# +M3%BL]KI&NM79_&E-Q;I@=DIJ]56.")D*B0I%(JQLZ%I)).AUINTJ3'84U:S! +M6J$96NB&2XP=2W?FI\ +M34]CM`M%!66FBJY/!NZ0RDSH_2H1W_$Y54C4D`YZ%RPW+2=#$LP++/,0!E)$ +M".`@1-[/>G+RTY,V73NI12WNVSW6N%.?D+I4"$T2R( +MY\3P_-D-T](!`,@*-DC!XK6U=H5*M,O!OPO,$=W?K;0W3-)SJ3X>V&F=\^^? +M!/*HUA:-'5=ND@IJ99:5JXS5E3,K(L(@(D7Y4>(W5,9VCZL=9`).RJ>(3#89 +MSFN(==PN/'>;:`"`+3ON5*U27%@.C0X?73QUWJA6MOB):WW"FMM+72ULU+$* +M5OET>,P1)M%$^'3)1<+@[@``A?6>_P!*JUW&HZP.GE'#E^Y2*@LT-U`[_)?J +M,?$[\1=!IV2ATGI()#;*3*PK&E725]7$`,'9;,>^.[ +ME,KJG1[8S0R76/RY]ZT\7?6YO>OOTKJ>[M%=VC-UO#R'RT-`F52`D]O$8,2- +MLI$?[W%4V91<^M->5[\K*S^BM2T?* +M6V7CXK^:59-1ZEO%M6EL%KK2$>U6@,3$Q!_#)*7,I&QR_P!N.F,K_IF_JZL] +M8\:'%JXQW6U!#/_;OY?-3-5E+",ZND07F +M)(W=WO??BM%-7S!2R:-:JH(YH(I143F1Y,U#@D*J*Y_!D#+L-SGOOQ.U<.:N +M+R`PT0!\TNC693PN8?$9[^[[JM=2];J"GM+5SAC4,LG2H\J@G/;V``^^.+[#BE8Q +M_P#Q#G[P0/$S*MF"8[J<#@XGNL!Z2LO1&K?_2V_P!)J"S45%H +MJ1%#6.I\RA5Z1D^I;]K'KWXL&!PHI,S'0:*O8_$NJ.+:>_7N5O[TM+I^@LUM +M*0$T-H5H@!E7E9`HW].D]/W[\<]KS5JN=Q*N>$8VFQHY)":?JA47V^QQ.9(D +M\0*Y/9$@._Y])/Y\6"K1BFTC>HFF)J.'#[('YG.MPM0+L(FDIV7Q"YQ'(T01 +M5VVZ20,_4@^G$]T?):XMW#[J&V^06@CW:R&M'O+46_6Z9,4KE6 +M./?(_(\36,$.IN&XD*$P8+FN&E@?)!FJ*J5+M#-2D+Y.E2/[P<8!_-",?4\& +MX5O9[7NR`Q#NV.?W4*LTL=93U=',8@2'0G!`S@@'W[G^7!S83#Q(D:IFT[BY +M:<-;:DDI[G3U"3QQK^R,-XD:GTPR!E'H">(^J2*L'0B$_2J33MK/^5TVO5U7 +M:!45=,AFH3$U7'3YZ0V'3QH0.V,^<`=CGT.[]&`8)C=]C]$!7:3<"VOW3;AY +MJ5P-FK+>;.KQ3AJ*>=28MTRC-TCI)97*,3@E2PV))X+I41>9/$<=Q^_>@:E1 +MV6!;AW*?I(K3-27"[:1N.E*[7#W;Q8FG\:![697;I6E@;/ZL=US*0$VB\".T=>%O!,TL"V#D(<_G/HH^&XW6^S*DC3ANKJD"O"OD4A1&2=B0Q*>YM'$-%!P:T@0-)//F1Q0 +M[&_PR7`DS!.NGT4%:JZSLU>][O%QH*2:%8(=0+2^/17E$D0+'7P98&158(K, +MV5=QDC'5P2^H_-F8V3O:##FSO:[A;2+IB!)SF#&NX\B/%?8:_3]NMD=MO=@K +MM)FH9YOEKU22U5MJ78,OB0SI^LA#'S](ZEQ#%NPWXW^K-6[7]8`=6$!PY%MY +MY[^03[@&@M7+8 +MC>18V\H(#GJ?!'6.,J[2'6=7UA:QPN""T]XMNWGN"32PT4])<#J(C?SMKHL6 +MGO-PL=XG>Q5D&E37HD%;13PK62J`Z'QX:2)9F$I90`'"+YTZ=@21"]CF.#^W +ME-C\([BXP(WF+^:)JTP"`VT^]WUA"E3IK4U?<:?E_:ZK3NFK,RQ/4^-7PS54 +MP8@XE(PS.O0"(5"A1TC!+9*W8UK0[%O!>X$Q`(`W6&D<2;GD$T:1<[(V&COU +M[S]M%\TW9]?\M)M4TTM#7T5!N:]8ZB".NIX5<()=PQ1"&;?H.RD^7&>'*];" +M[08P,>"=P(.4F--TDVWJ/LF'2:DTG+05VJ+CJRZ5%[HZ4TMNL +MXMPII9G+,5#R0L$*(P)9PH)=QV,8PY7V9B`T8>E2:&O,N?F,CG#IG2`)LM_K +M6`=8YQ)&@@7\?'T2^T_4WKEM-=(J:@J;=JX-3U$=P>0+44T>/%.`25(E#Q') +M\Q!"[Y($T_`T<;EJEV:G!MN/,\>6[@HW]4^F"RTC?P'`?5-CD9I;1_,?F3>- +M0\T+W34\-!'^F&HD/1#6LLJ(%>0(X6G5FCZL8)C5_P!ECQ'[8KUL#AV4L$VU +MQF.ZTB!O)/(P!HC<`PUZKJE3RYSSW1ZPIOG%K*[ZKYLQ\HSJ![MIZGU*PH5D +MB\(TZ32([4S1@*H2`&=1A0`2Z@]!4"L8[$T-F;$Q&UF-API%VMR0TP>]SC-H +MN5&P^CS\;M6GLXF7MR-_ZGN`=Y9C/<5]@.F?2:G@MC +MUMJ"U/\`B5/^EC26?]P:+:P5JZO&NK[K."ILNE;?<:>E:^/R-=,OTVW<3L5QEM>GG;_OI&;][21QM`5=]9*VULC` +M;1I12;6I@N>8>9:W*X`:-EP^)UAI''RU^+/0RGL7I'M#9SAF%.HXM;H,KSG9 +M)%R,KH@:QNU%;[IYI:TF?YW +M6`\!KW")T)`3]2I3$L#KCF.(]*8`ZR2O= +M>Y.PVSS4HN!OF/IQ)WGY(0M/7"3=L^OV51K_`*_U-S#E:*U2U=ATS3*0:ZJ/ +M3X"D`$_X=E4>K>@/FWE\)@6TQ+KDGWWI_0PEG2WBAMJ?)6*Q4=T1`/%JJJG> +M3QVWW3#*0NV6=LX<]<6V#B`).C!%O\`J)-]Z]!;'>"S,=!Y +M]\;]PYE58Y*4&BC;=1\P>:%<*K35/6"_Z@K75OE:EPH6CMT/7O($B`9V;'GE +M(QOD2_1_!T:;7/K',P',3>"Z.RT;^RW4G>;#@%MC&5W.ZJG:;0-P_(6B +MW^TN_M(=9\^]67#3M@O=5:>75#-(B0P.0DTF0HC4_M*`,>V0>)S"4*V-K==7 +MTO`Y)#13P=*WQ'Y\N7-::ZN[WVNMUNK;W25L%LJJEYZ99X6198CB/Q8F8#K+ +M$.G4N1L1Z<6VM1R=AIO"@J50$DD;U(\P*2GBTY1M2QM)!'1>'#$0#D&4J-OK +MC/UXC-F2:Q!XJ0QI:*4@;I'FH[36F7>HMU7B1.N]76VU"2CACBI*6-680=1,L\I!Z?%;ON +M=R.Y[;#B;V/@:C^V\7*#VSBVTSE9H`@#DC15-_UE:FNC$*M1,[AADR;CJ&/8 +M+U-_[NGB9Z0UA2PQR\@J]L27U0')5[K5@'D#0"/DD;HJ1VN-Y60+'D3GN1E3$4_F"?J>+-BF-; +M2"@\.9K.[RA[7T3&S:KC'G6"&AF49&5(J(P1_P#JS?NXE=B"'M)WR/11.V23 +M3'S0SIZOIZ2Y:0MJR]%7?:>JMK.?PH)(W,7_S:,_]/UXFL8P]6]Y'P0?( +MW]%!8>N`YK3;/(\]/5!NII9XZN,3IX%3([QM&^/U4L?AL0<;#!D/W`'KG@W" +M/:YLBXU\#*!Q1+2)U^HC[H=NC-;JI94C9(LA7C.P",Y/_P`6ZE_=[\%4;BZ8 +MQ#R+;TQ=/5XI'6:*3IIYZ7KE!SCK1\@CZ@I_\B/7@6JPQ?<4NA4%RW>%WWV* +MEHYVDB81VNK;QHW7M!*RE6V]1C.1Z_NX:@FXU"43ZH4I(9Z:ANL$NZ1_JZF( +MDLJ8.5.W=,]>&]B![<2%/$AKP=Q4?6I2T[TY:&&6#3M'>*.O>[1T4,$E5%%, +MRM2,P'DHB +MR6"]V"TW,WO5E'0Z9G:1*BE$3303$`8$NP/2RE2)$)P,C9M@5B]HTZE0,IME +MXYP1?W":I88M&9YAOOWWH.34^E@)M.U=MJ*W3JX:EJC,WCP/TEF;';=V9L9P +M/+W`WDQA:Y(J@@/WB+>^:#-5@[,=GU7+3=^MFF*RIM%;=+;>M,5Z*\DOR[N( +MF7(59(74'(!*;8\K;'^27AZM)C[W!7=/JVDEI=36 +MYY+W/0I%'^AZ6OD9<(&7,;%,%E*X*J20!OGJ(X:PVS7-+7V#C.8C?W3Z\5C\ +M4(.L;@?V3!GM7+CF+K33]+9]0RZ=CJ:9IO#DCC"TQ7IZJ<*%18V.).ERV.Y. +MR`G5'%8K!TG5*C0Z#Y\_N(^JT^G1JN&0D6]4M=86;5-DN!I_TU27BDAB$"SP +MRX,4:@EH@K'J55;(PV46HM35^I-4RRU514UPGJ*.C+P04:9!D^8J)$49_8`4 +M`DLS#/8Z_5U:%#J:-H$`FY)Y-'ST&FB<&&:3UE4WWQ\_%+FSZHONG;K?+;IE +MH:>"HJ@QK8(9*AXZ=6)41YQF,CI)#+ENA<]L<'XEHK4@_$;A&60))UF-_<83 +M-)Y8Z*?FF-RGY=UR +MKU]MNVFUN8,WGBX]GQU/*)7K/\U73"EA.C[-D`P^L0VW]++OCQRCQ5":"CI+ +MC74EMM`L=IKU/5\ZT;U;2.=U"0PJR=0P?,0P!(W.-O;7Z:JVD35)`.[3PDW] +M0OFSUK,\,$G1/[1GPU:8NU!9]6:CUC=`T7)XFT<&QX#GF!J=!8:F_ +MEQ)T1/0O;*5JS6NC.7MJML5+U0T%7?*^/HHR'ZHI((5$2.Z`AG8^(GGP3C*N +MFG@74&_I\=6F0"YK&ZSJ"3)`)LVX<1,<0AV(%3^+09`!@$D>FZ?K"(YOB,YF +MU]!HZGEK8KF]/=DK+M*L,<5.M.LBQI'%T9+_`(1N!T1L9"`CSS,]5Z4]$;YC/"`.<7D-:%T#\.^GV(Z/;;P>V7O.:A4:XW)[`L6B +M.+2Y.CGSRVLNO>9.F^:\U.]YMUPLB-4TZRMT551!Y4`0$`ED?)R1LHW''`OR +MV](*F%V9B>CSS%2C4)`C1COBORJ/SO\`1BBS:F"Z24#_``<12R2-[FPZ +MG'?3>!_TH;L/Z#L$D=KI+:E"9(HLQTKIX:Q!68B281D9=1UY$@"E%ZF'4#QZ +M1%:E3.:HZ3Q-XC@-=>4G=-FM=CI9*"LM@O8I9: +M>2HHY#)3Q"0EF568R,24`ZADHS$>4K&I*X-=[7/9E:TR`=9`@$CS(&[C*?9A +MQ2:64Y^J4TY6AC>^V\I:UEBI;+5PW7F%<&N=U&6CM +M23`NK=7:9L_J_MN1D#T($FS,;4TDD1F*A[A77B]3TM36M1TMN@8M36V*,&G4 +M8[E3^(^;.3D_D,<2%+#`7-R@JF+DP%*4&D#=;?2U8JXU@RRH#"Y"D'<;`^I_ +MCZ[\$NKM:;RO<7\;&H;Y=>=VBM%7&Z5598;M'%?ZZ-R"9JHR$ +M`=L>&H`Z5QM@<>0MIO=4QH:\R'`./>XW/VX+U%T9HM_1YXO*K/\`')S(U/I3 +ME3I?0MAGI[?8J\">H"*0[,V8R,YQCI'MG<[\6*N):VC_`"M!/J1Y*#P-ZSR= +M;>I@KS'JUL:%BL5%2QA(8D&%7=MR#W/UXO>Q6`4@FEF_V9L4KR26R>X0RO&S$X;SJ"N_EP!Z?7OQ(UK5'.X`_11K*38#0-2"G- +M>*2&BY=22PJ/G$I8HHZA@#)&IF;/3MC^'%>HN(Q1YDJ8QCIPT[P!'FN=CA2C +MH+K6Q#KEIZJEI(`_F6/"@^)@]Y,L3DY&<8`P.,Q==P``_FF4SAF!TN.HA=%Z +MKZL6[7&H?'D-W9)4\8DY`,G2 +M*&FD/5",2D9/G9QEB??CIVSJ31HN=X^J9]5:[X>((H[IJJNZ%>JH+88*=V&2 +M`1UEC[L2`,^H`'%-Z6O)ITV\2I_H\T=8\\`!ZRI.L)EH[XTA,C3K22/G?#=8 +M;;_]CQ`L8`YHX2K2P=EQ._[_`+I=`2(4 +MLVH=)Q,S,M/7J\6^ZE)8P/WCOQ;C>F\\C\BJJR]1G>/F%/\`,1O&6NK75?F8 +M[_B33),UNN,,A)46X2@@[JV-R#_U'C51H+@> +M:&82&P."(G5:GEO,M81O1K3-(RAZR=4]THX +M9)'Z7@FI)".[QB%@`3].A#]U'",4XW.:.W-` +M]+.TWZY.ICE<]L#IVVVR?4\5G:5=QJ-=QM&ZQB>]2^!8`,O"_P`[=UD$ZWM% +M/<;IH/QYZV*)ZRHH9(X9C&)(Q$)/,5P>K+$9S^';MP[LEW5G$!NX-=>]YC?N +MY)G:#9ZITZF/2?V[D@[Y;++!IBEB2Q6L5+((Q4A&65.G&X((!)+%CD')`]`! +MQ8L%BJKZY#G&)T4;78T49`NHSEC9J"I)NU1$)JD&H5%<`I'T0]8(4C?/8@Y! +M&1C']O8MV&I,-,"7$ +M"]TY@*(J/AQW?4*Y/+Z"T4^KM76FV:>L5EI:=:/K-)!T/5DKU@S,22V"N!V& +M">^V/)GXVXVM^CPK'.)S.J.,\;-%M+`F+;U[=_*7L^D[%[0K1#FMIM'=+GGS +M.M?EX +MV+AQT;IXR.W5<\N\'9`!P`#1ZKD_YG=LXBOTK?A:A[%!E,-'^YC:CB>9 +M``W*,JB)$"]'6`2IR#@9XZ[A]B +MX5S#1AHKY1IJ:LH(9'%(E +MREZQ)/%$20K-O[]()5>E?+Q#;&Q3^K>"9+7%H)U@:`G>G,7AF%T^,;I4WRVT +M_0:NN&C*#4YJ;W0U:Q4@@EE*QTT0=L")4Z0,8VSG&3COP'B,4\9W`WF4+7JE +ME,Y=RLQ;--V.HF?%MI*6NMMNH9Z.K@C$ZR:_6EV4.:#`M93]5>:B\_#WIV^W*&"IKHZR">,DN`CLT@) +M!#9V[XSW`SGCS%T=S8/\1<32PY@/#YTO9KOG=?1;IY5&T?P1P&,Q@#JE(TPT +M\,M1](?^%E5S4-UN70*FKK:BZ2RQLRFJ;Q/ERS;^%G\&=AM[#UR3Z8K`NJ%L +MQ!W6GOXKP!2>&1D`$I-W>MJ:BBI&>3"R3=+(.Q!)]_7RC?OP;1I-;<<%CWD^ +M:(-=U\W+]J;2>DUBM,56D*5E>B_[[4K/`DCJTW<)YBH10J]/<$^;@K#40_\` +MB/O!L-P@Q,<>>O"$RYT-M[D)<:?T];Y]6UUMJC4U4$1FE#._G=E!(ZG&"=QQ +M)8QQIT@YEB8"#9_$J]6[2#\DUM1V>S6N[T=-26JE2CGMIF$+,Y6"1E?+QDMU +M*?*/7'T/$7L[&578=U1SI(='A;[HG$82FVH&@6(^ZJ#=JVJFJ55IY5`0-Y6( +1R3WS_KWXL9>22DT!#1"__]D` +` +end diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index fc40426875..fe64ec31e0 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -161,6 +161,7 @@ + From cb077fa1dc40e35dec80b8835addeba41adcf317 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Oct 2018 08:05:53 -0400 Subject: [PATCH 113/741] Added more QuotedPrintable encoder/decoder unit tests --- UnitTests/Encodings/EncoderTests.cs | 130 ++++++++++++++++------ UnitTests/TestData/encoders/wikipedia.qp | 5 + UnitTests/TestData/encoders/wikipedia.txt | 1 + UnitTests/UnitTests.csproj | 2 + 4 files changed, 106 insertions(+), 32 deletions(-) create mode 100644 UnitTests/TestData/encoders/wikipedia.qp create mode 100644 UnitTests/TestData/encoders/wikipedia.txt diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index fecc6cb4a9..8ab55c6971 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -83,9 +83,44 @@ public class EncoderTests "fo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQ==" }; - void TestEncoder (ContentEncoding encoding, string rawFile, string encodedFile, int bufferSize) + static readonly string dataDir = Path.Combine ("..", "..", "TestData", "encoders"); + static readonly byte[] wikipedia_unix; + static readonly byte[] wikipedia_dos; + static readonly byte[] photo; + + static EncoderTests () + { + using (var memory = new MemoryStream ()) { + using (var filtered = new FilteredStream (memory)) { + filtered.Add (new Dos2UnixFilter ()); + + using (var file = File.OpenRead (Path.Combine (dataDir, "wikipedia.txt"))) + file.CopyTo (filtered, 4096); + + filtered.Flush (); + } + + wikipedia_unix = memory.ToArray (); + } + + using (var memory = new MemoryStream ()) { + using (var filtered = new FilteredStream (memory)) { + filtered.Add (new Unix2DosFilter ()); + + using (var file = File.OpenRead (Path.Combine (dataDir, "wikipedia.txt"))) + file.CopyTo (filtered, 4096); + + filtered.Flush (); + } + + wikipedia_dos = memory.ToArray (); + } + + photo = File.ReadAllBytes (Path.Combine (dataDir, "photo.jpg")); + } + + void TestEncoder (ContentEncoding encoding, byte[] rawData, string encodedFile, int bufferSize) { - var dataDir = Path.Combine ("..", "..", "TestData", "encoders"); int n; using (var original = new MemoryStream ()) { @@ -106,10 +141,10 @@ void TestEncoder (ContentEncoding encoding, string rawFile, string encodedFile, using (var filtered = new FilteredStream (encoded)) { filtered.Add (EncoderFilter.Create (encoding)); - using (var file = File.OpenRead (Path.Combine (dataDir, rawFile))) { + using (var memory = new MemoryStream (rawData, false)) { var buffer = new byte[bufferSize]; - while ((n = file.Read (buffer, 0, bufferSize)) > 0) + while ((n = memory.Read (buffer, 0, bufferSize)) > 0) filtered.Write (buffer, 0, n); } @@ -133,15 +168,11 @@ void TestEncoder (ContentEncoding encoding, string rawFile, string encodedFile, } } - void TestDecoder (ContentEncoding encoding, string rawFile, string encodedFile, int bufferSize) + void TestDecoder (ContentEncoding encoding, byte[] rawData, string encodedFile, int bufferSize) { - var dataDir = Path.Combine ("..", "..", "TestData", "encoders"); int n; - using (var original = new MemoryStream ()) { - using (var file = File.OpenRead (Path.Combine (dataDir, rawFile))) - file.CopyTo (original, 4096); - + using (var original = new MemoryStream (rawData, false)) { using (var decoded = new MemoryStream ()) { using (var filtered = new FilteredStream (decoded)) { filtered.Add (DecoderFilter.Create (encoding)); @@ -156,14 +187,13 @@ void TestDecoder (ContentEncoding encoding, string rawFile, string encodedFile, filtered.Flush (); } - var buf0 = original.GetBuffer (); - var buf1 = decoded.GetBuffer (); - n = (int) original.Length; + var buf = decoded.GetBuffer (); + n = rawData.Length; - Assert.AreEqual (original.Length, decoded.Length, "Decoded length is incorrect."); + Assert.AreEqual (rawData.Length, decoded.Length, "Decoded length is incorrect."); for (int i = 0; i < n; i++) - Assert.AreEqual (buf0[i], buf1[i], "The byte at offset {0} does not match.", i); + Assert.AreEqual (rawData[i], buf[i], "The byte at offset {0} does not match.", i); } } } @@ -200,7 +230,7 @@ public void TestBase64DecodePatterns () [TestCase (1)] public void TestBase64Encode (int bufferSize) { - TestEncoder (ContentEncoding.Base64, "photo.jpg", "photo.b64", bufferSize); + TestEncoder (ContentEncoding.Base64, photo, "photo.b64", bufferSize); } [TestCase (4096)] @@ -209,7 +239,7 @@ public void TestBase64Encode (int bufferSize) [TestCase (1)] public void TestBase64Decode (int bufferSize) { - TestDecoder (ContentEncoding.Base64, "photo.jpg", "photo.b64", bufferSize); + TestDecoder (ContentEncoding.Base64, photo, "photo.b64", bufferSize); } [TestCase (4096)] @@ -218,7 +248,7 @@ public void TestBase64Decode (int bufferSize) [TestCase (1)] public void TestUUEncode (int bufferSize) { - TestEncoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu", bufferSize); + TestEncoder (ContentEncoding.UUEncode, photo, "photo.uu", bufferSize); } [TestCase (4096)] @@ -227,7 +257,7 @@ public void TestUUEncode (int bufferSize) [TestCase (1)] public void TestUUDecode (int bufferSize) { - TestDecoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu", bufferSize); + TestDecoder (ContentEncoding.UUEncode, photo, "photo.uu", bufferSize); } [TestCase (4096)] @@ -236,7 +266,7 @@ public void TestUUDecode (int bufferSize) [TestCase (1)] public void TestUUDecodeBeginStateChanges (int bufferSize) { - TestDecoder (ContentEncoding.UUEncode, "photo.jpg", "photo.uu-states", bufferSize); + TestDecoder (ContentEncoding.UUEncode, photo, "photo.uu-states", bufferSize); } static readonly string[] qpEncodedPatterns = { @@ -258,7 +288,53 @@ public void TestUUDecodeBeginStateChanges (int bufferSize) }; [Test] - public void TestQuotedPrintableDecode () + public void TestQuotedPrintableDecodePatterns () + { + var decoder = new QuotedPrintableDecoder (); + var encoding = CharsetUtils.Latin1; + var output = new byte[4096]; + string actual; + byte[] buf; + int n; + + for (int i = 0; i < qpEncodedPatterns.Length; i++) { + decoder.Reset (); + buf = encoding.GetBytes (qpEncodedPatterns[i]); + n = decoder.Decode (buf, 0, buf.Length, output); + actual = encoding.GetString (output, 0, n); + Assert.AreEqual (qpDecodedPatterns[i], actual, "Failed to decode qpEncodedPatterns[{0}]", i); + } + } + + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestQuotedPrintableEncodeDos (int bufferSize) + { + TestEncoder (ContentEncoding.QuotedPrintable, wikipedia_dos, "wikipedia.qp", bufferSize); + } + + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestQuotedPrintableEncodeUnix (int bufferSize) + { + TestEncoder (ContentEncoding.QuotedPrintable, wikipedia_unix, "wikipedia.qp", bufferSize); + } + + [TestCase (4096)] + [TestCase (1024)] + [TestCase (16)] + [TestCase (1)] + public void TestQuotedPrintableDecode (int bufferSize) + { + TestDecoder (ContentEncoding.QuotedPrintable, wikipedia_unix, "wikipedia.qp", bufferSize); + } + + [Test] + public void TestQuotedPrintableDecode2 () { const string input = "This is an ordinary text message in which my name (=ED=E5=EC=F9 =EF=E1 =E9=EC=E8=F4=F0)\nis in Hebrew (=FA=E9=F8=E1=F2)."; const string expected = "This is an ordinary text message in which my name (םולש ןב ילטפנ)\nis in Hebrew (תירבע)."; @@ -275,20 +351,10 @@ public void TestQuotedPrintableDecode () n = decoder.Decode (buf, 0, buf.Length, output); actual = encoding.GetString (output, 0, n); Assert.AreEqual (expected, actual); - - encoding = CharsetUtils.Latin1; - - for (int i = 0; i < qpEncodedPatterns.Length; i++) { - decoder.Reset (); - buf = encoding.GetBytes (qpEncodedPatterns[i]); - n = decoder.Decode (buf, 0, buf.Length, output); - actual = encoding.GetString (output, 0, n); - Assert.AreEqual (qpDecodedPatterns[i], actual, "Failed to decode qpEncodedPatterns[{0}]", i); - } } [Test] - public void TestQuotedPrintableEncode () + public void TestQuotedPrintableEncode2 () { const string expected = "This is an ordinary text message in which my name (=ED=E5=EC=F9 =EF=E1=\n =E9=EC=E8=F4=F0)\nis in Hebrew (=FA=E9=F8=E1=F2).\n"; const string input = "This is an ordinary text message in which my name (םולש ןב ילטפנ)\nis in Hebrew (תירבע).\n"; diff --git a/UnitTests/TestData/encoders/wikipedia.qp b/UnitTests/TestData/encoders/wikipedia.qp new file mode 100644 index 0000000000..52bd6e2b29 --- /dev/null +++ b/UnitTests/TestData/encoders/wikipedia.qp @@ -0,0 +1,5 @@ +J'interdis aux marchands de vanter trop leur marchandises. Car ils se = +font vite p=C3=A9dagogues et t'enseignent comme but ce qui n'est par e= +ssence qu'un moyen, et te trompant ainsi sur la route =C3=A0 suivre le= +s voil=C3=A0 bient=C3=B4t qui te d=C3=A9gradent, car si leur musique e= +st vulgaire ils te fabriquent pour te la vendre une =C3=A2me vulgaire. diff --git a/UnitTests/TestData/encoders/wikipedia.txt b/UnitTests/TestData/encoders/wikipedia.txt new file mode 100644 index 0000000000..c99f0a9708 --- /dev/null +++ b/UnitTests/TestData/encoders/wikipedia.txt @@ -0,0 +1 @@ +J'interdis aux marchands de vanter trop leur marchandises. Car ils se font vite pédagogues et t'enseignent comme but ce qui n'est par essence qu'un moyen, et te trompant ainsi sur la route à suivre les voilà bientôt qui te dégradent, car si leur musique est vulgaire ils te fabriquent pour te la vendre une âme vulgaire. diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index fe64ec31e0..ad5a673391 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -162,6 +162,8 @@ + + From b7979a567f0d1e89c8e163b6af3516cafe5fb4d3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Oct 2018 11:10:55 -0400 Subject: [PATCH 114/741] Added more unit tests for the various utility classes --- MimeKit/Utils/StringBuilderExtensions.cs | 2 +- UnitTests/ArgumentExceptionTests.cs | 11 +++ UnitTests/UnitTests.csproj | 2 + UnitTests/Utils/CharsetUtilsTests.cs | 1 - UnitTests/Utils/PackedByteArrayTests.cs | 77 ++++++++++++++++ .../Utils/StringBuilderExtensionTests.cs | 88 +++++++++++++++++++ 6 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 UnitTests/Utils/PackedByteArrayTests.cs create mode 100644 UnitTests/Utils/StringBuilderExtensionTests.cs diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index c49d5e8041..00a9caf00c 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -110,7 +110,7 @@ public static void AppendCStringByte (this StringBuilder text, byte c) case 0x0B: text.Append ("\\v"); break; case 0x0D: text.Append ("\\r"); break; default: - if (c < 020 || c > 0x7e) { + if (c < 0x20 || c > 0x7e) { text.AppendFormat ("\\x{0:x2}", c); } else { text.Append ((char) c); diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index 8e18cdd798..d9bc633712 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -233,6 +233,17 @@ public void TestParseArguments () AssertParseArguments (typeof (MimeUtils)); } + [Test] + public void TestBufferPoolArguments () + { + Assert.Throws (() => new BufferPool (-1, 16)); + Assert.Throws (() => new BufferPool (1024, -1)); + + var pool = new BufferPool (16, 2); + Assert.Throws (() => pool.Return (null)); + Assert.Throws (() => pool.Return (new byte[8])); + } + static void AssertStreamArguments (Stream stream) { var buffer = new byte[1024]; diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index ad5a673391..ab3ce0dadc 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -111,8 +111,10 @@ + + diff --git a/UnitTests/Utils/CharsetUtilsTests.cs b/UnitTests/Utils/CharsetUtilsTests.cs index 38f63e3429..70f76b0447 100644 --- a/UnitTests/Utils/CharsetUtilsTests.cs +++ b/UnitTests/Utils/CharsetUtilsTests.cs @@ -26,7 +26,6 @@ using System; using System.Text; -using System.Security.Cryptography; using NUnit.Framework; diff --git a/UnitTests/Utils/PackedByteArrayTests.cs b/UnitTests/Utils/PackedByteArrayTests.cs new file mode 100644 index 0000000000..49f0b5107a --- /dev/null +++ b/UnitTests/Utils/PackedByteArrayTests.cs @@ -0,0 +1,77 @@ +// +// PackedByteArrayTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using NUnit.Framework; + +using MimeKit.Utils; + +namespace UnitTests.Utils { + [TestFixture] + public class PackedByteArrayTests + { + [Test] + public void TestArgumentExceptions () + { + var packed = new PackedByteArray (); + + Assert.Throws (() => packed.CopyTo (null, 0)); + Assert.Throws (() => packed.CopyTo (new byte[16], -1)); + } + + [Test] + public void TestBasicFunctionality () + { + var packed = new PackedByteArray (); + var expected = new byte[1024]; + var buffer = new byte[1024]; + int index = 0; + + for (int i = 0; i < 257; i++) { + expected[index++] = (byte) 'A'; + packed.Add ((byte) 'A'); + } + + for (int i = 1; i < 26; i++) { + expected[index++] = (byte) ('A' + i); + packed.Add ((byte) ('A' + i)); + } + + for (int i = 0; i < 128; i++) { + expected[index++] = (byte) 'B'; + packed.Add ((byte) 'B'); + } + + Assert.AreEqual (index, packed.Count, "Count"); + + packed.CopyTo (buffer, 0); + + for (int i = 0; i < index; i++) + Assert.AreEqual (expected[i], buffer[i], "buffer[{0}]", i); + } + } +} diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs new file mode 100644 index 0000000000..edbde78b5d --- /dev/null +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -0,0 +1,88 @@ +// +// StringBuilderExtensionTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Text; + +using NUnit.Framework; + +using MimeKit; +using MimeKit.Utils; + +namespace UnitTests.Utils { + [TestFixture] + public class StringBuilderExtensionTests + { + [Test] + public void TestLineWrap () + { + var builder = new StringBuilder ("This is supposed to be a really long string of text that is about to be folded "); + const string expected1 = "This is supposed to be a really long string of text that is about to be folded\n "; + const string expected2 = "This is supposed to be a really long string of text that is about to be folded\n\t"; + var format = FormatOptions.Default.Clone (); + + format.NewLineFormat = NewLineFormat.Unix; + + builder.LineWrap (format); + + Assert.AreEqual (expected1, builder.ToString (), "#1"); + + builder.Length -= 2; + + builder.LineWrap (format); + + Assert.AreEqual (expected2, builder.ToString (), "#2"); + } + + [Test] + public void TestAppendFoldedWithQuotedString () + { + const string expected = "This is about to get a quoted string appended to it:\n \"and this is a \\\"quoted string\\\" that must not get broken up!\" Got it? Good.\n There should be another wrap in here..."; + var builder = new StringBuilder ("This is about to get a quoted string appended "); + var format = FormatOptions.Default.Clone (); + int lineLength = builder.Length; + + format.NewLineFormat = NewLineFormat.Unix; + + builder.AppendFolded (format, "to it: \"and this is a \\\"quoted string\\\" that must not get broken up!\" Got it? Good. There should be another wrap in here...", ref lineLength); + + Assert.AreEqual (expected, builder.ToString ()); + Assert.AreEqual (40, lineLength); + } + + [Test] + public void TestAppendCStringByte () + { + const string expected = "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\a\\b\\t\\n\\v\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "; + var builder = new StringBuilder (); + + for (byte i = 0; i < 0x21; i++) + builder.AppendCStringByte (i); + + Assert.AreEqual (expected, builder.ToString ()); + } + } +} From 2ba76442ccdd430d3fc0a896492cad4fc35db7f2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Oct 2018 11:29:34 -0400 Subject: [PATCH 115/741] bumped bc-csharp to 1.8.3 --- submodules/bc-csharp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/bc-csharp b/submodules/bc-csharp index b19e68a517..46a73f7278 160000 --- a/submodules/bc-csharp +++ b/submodules/bc-csharp @@ -1 +1 @@ -Subproject commit b19e68a517e56ef08cd2e50df4dcb8a96ddbe507 +Subproject commit 46a73f7278c3ba6e79a46000e62f9a4bffbfb429 From 75d9f5f221fcf5ac1897cf385ac8a64015c5bb86 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Oct 2018 11:39:51 -0400 Subject: [PATCH 116/741] Updated .travis.yml --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5e950c527f..7db0153271 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,2 +1,6 @@ language: csharp solution: MimeKit.Net45.sln +install: + - nuget restore MimeKit.Net45.sln +script: + - msbuild /p:Configuration=Debug MimeKit.Net45.sln From a8d75e3804c691d53eca20901b24c51ab8efc256 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Oct 2018 12:18:31 -0400 Subject: [PATCH 117/741] Added more CharsetUtils unit tests --- UnitTests/Utils/CharsetUtilsTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UnitTests/Utils/CharsetUtilsTests.cs b/UnitTests/Utils/CharsetUtilsTests.cs index 70f76b0447..f96df78bcc 100644 --- a/UnitTests/Utils/CharsetUtilsTests.cs +++ b/UnitTests/Utils/CharsetUtilsTests.cs @@ -96,9 +96,11 @@ public void TestParseCodePage () Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-8859")); Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-BB59")); + Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-8859-")); Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-8859-A")); Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-2022-US")); Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-4999-1")); + Assert.AreEqual (-1, CharsetUtils.ParseCodePage ("iso-abcd-1")); } [Test] From 33a93e52abd86b3a338f226572b98fa5b7506997 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Oct 2018 12:33:29 -0400 Subject: [PATCH 118/741] Added more unit tests for MimeUtils --- UnitTests/Utils/MimeUtilsTests.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index c43b09a7dc..2aeede9e6f 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -92,6 +92,7 @@ public void TestParseGoodReferences () " Date: Mon, 15 Oct 2018 13:43:18 -0400 Subject: [PATCH 119/741] Modified TextPart.Text and GetText() to canonicalize the newlines Fixes issue #442 --- MimeKit/TextPart.cs | 13 +++++++++++-- UnitTests/IO/ChainedStreamTests.cs | 2 +- UnitTests/MimePartTests.cs | 4 ++-- UnitTests/Tnef/TnefTests.cs | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 5592eaa2a3..f42759aa5f 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -42,6 +42,7 @@ using Decoder = Portable.Text.Decoder; #endif +using MimeKit.IO; using MimeKit.Text; using MimeKit.Utils; @@ -304,7 +305,11 @@ public string Text { var charset = ContentType.Parameters["charset"]; using (var memory = new MemoryStream ()) { - Content.DecodeTo (memory); + using (var filtered = new FilteredStream (memory)) { + filtered.Add (FormatOptions.Default.CreateNewLineFilter ()); + Content.DecodeTo (filtered); + filtered.Flush (); + } #if !PORTABLE && !NETSTANDARD var content = memory.GetBuffer (); @@ -410,7 +415,11 @@ public string GetText (Encoding encoding) return string.Empty; using (var memory = new MemoryStream ()) { - Content.DecodeTo (memory); + using (var filtered = new FilteredStream (memory)) { + filtered.Add (FormatOptions.Default.CreateNewLineFilter ()); + Content.DecodeTo (filtered); + filtered.Flush (); + } #if !PORTABLE && !NETSTANDARD var buffer = memory.GetBuffer (); diff --git a/UnitTests/IO/ChainedStreamTests.cs b/UnitTests/IO/ChainedStreamTests.cs index c2dced35cf..ef1ed5341f 100644 --- a/UnitTests/IO/ChainedStreamTests.cs +++ b/UnitTests/IO/ChainedStreamTests.cs @@ -388,7 +388,7 @@ public void TestChainedHeadersAndContent () var entity = MimeEntity.Load (chained, true) as TextPart; - Assert.AreEqual ("Hello, world!\r\n", entity.Text); + Assert.AreEqual ("Hello, world!" + Environment.NewLine, entity.Text); } } diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index ad34b8cc7d..dafb388b9e 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -525,7 +525,7 @@ public async void TestWriteToAsync (string text) [Test] public void TestLoadHttpWebResponse () { - var text = "This is some text and stuff.\r\n"; + var text = "This is some text and stuff." + Environment.NewLine; var contentType = new ContentType ("text", "plain"); using (var content = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { @@ -542,7 +542,7 @@ public void TestLoadHttpWebResponse () [Test] public async void TestLoadHttpWebResponseAsync () { - var text = "This is some text and stuff.\r\n"; + var text = "This is some text and stuff." + Environment.NewLine; var contentType = new ContentType ("text", "plain"); using (var content = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index ff82b7d1e2..d21a7fd636 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -831,7 +831,7 @@ public void TestExtractedCharset () var html = text.Text; Assert.AreEqual ("windows-1251", text.ContentType.Charset); - Assert.AreEqual (expected, html); + Assert.AreEqual (expected.Replace ("\r\n", Environment.NewLine), html); } [Test] From 821ce49487170c9e063cbc4f648e953ddd38360e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 16 Oct 2018 16:18:01 -0400 Subject: [PATCH 120/741] Added more encoder/decoder tests --- UnitTests/Encodings/EncoderTests.cs | 102 +++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index 8ab55c6971..c0583139c7 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -333,6 +333,88 @@ public void TestQuotedPrintableDecode (int bufferSize) TestDecoder (ContentEncoding.QuotedPrintable, wikipedia_unix, "wikipedia.qp", bufferSize); } + [Test] + public void TestQuotedPrintableEncodeSpaceDosLineBreak () + { + const string input = "This line ends with a space \r\nbefore a line break."; + const string expected = "This line ends with a space=20\nbefore a line break."; + var encoder = new QuotedPrintableEncoder (); + var output = new byte[1024]; + string actual; + byte[] buf; + int n; + + Assert.AreEqual (ContentEncoding.QuotedPrintable, encoder.Encoding); + + buf = Encoding.ASCII.GetBytes (input); + n = encoder.Flush (buf, 0, buf.Length, output); + actual = Encoding.ASCII.GetString (output, 0, n); + Assert.AreEqual (expected, actual); + } + + [Test] + public void TestQuotedPrintableEncodeSpaceUnixLineBreak () + { + const string input = "This line ends with a space \nbefore a line break."; + const string expected = "This line ends with a space=20\nbefore a line break."; + var encoder = new QuotedPrintableEncoder (); + var output = new byte[1024]; + string actual; + byte[] buf; + int n; + + Assert.AreEqual (ContentEncoding.QuotedPrintable, encoder.Encoding); + + buf = Encoding.ASCII.GetBytes (input); + n = encoder.Flush (buf, 0, buf.Length, output); + actual = Encoding.ASCII.GetString (output, 0, n); + Assert.AreEqual (expected, actual); + } + + [Test] + public void TestQuotedPrintableEncodeFlush () + { + const string input = "This line ends with a space "; + const string expected = "This line ends with a space=20=\n"; + var encoder = new QuotedPrintableEncoder (); + var decoder = new QuotedPrintableDecoder (); + var output = new byte[1024]; + string actual; + byte[] buf; + int n; + + Assert.AreEqual (ContentEncoding.QuotedPrintable, encoder.Encoding); + + buf = Encoding.ASCII.GetBytes (input); + n = encoder.Flush (buf, 0, buf.Length, output); + actual = Encoding.ASCII.GetString (output, 0, n); + Assert.AreEqual (expected, actual); + + buf = Encoding.ASCII.GetBytes (expected); + n = decoder.Decode (buf, 0, buf.Length, output); + actual = Encoding.ASCII.GetString (output, 0, n); + Assert.AreEqual (input, actual); + } + + [Test] + public void TestQuotedPrintableDecodeInvalidSoftBreak () + { + const string input = "This is an invalid=\rsoft break."; + const string expected = "This is an invalid=\rsoft break."; + var decoder = new QuotedPrintableDecoder (); + var output = new byte[1024]; + string actual; + byte[] buf; + int n; + + Assert.AreEqual (ContentEncoding.QuotedPrintable, decoder.Encoding); + + buf = Encoding.ASCII.GetBytes (input); + n = decoder.Decode (buf, 0, buf.Length, output); + actual = Encoding.ASCII.GetString (output, 0, n); + Assert.AreEqual (expected, actual); + } + [Test] public void TestQuotedPrintableDecode2 () { @@ -360,7 +442,7 @@ public void TestQuotedPrintableEncode2 () const string input = "This is an ordinary text message in which my name (םולש ןב ילטפנ)\nis in Hebrew (תירבע).\n"; var encoding = Encoding.GetEncoding ("iso-8859-8"); var encoder = new QuotedPrintableEncoder (); - var output = new byte[4096]; + var output = new byte[1024]; Assert.AreEqual (ContentEncoding.QuotedPrintable, encoder.Encoding); @@ -371,6 +453,24 @@ public void TestQuotedPrintableEncode2 () Assert.AreEqual (expected, actual); } + [Test] + public void TestHexDecoder () + { + const string input = "This should decode: (%ED%E5%EC%F9 %EF%E1 %E9%EC%E8%F4%F0) while %X1%S1%Z1 should not"; + const string expected = "This should decode: (םולש ןב ילטפנ) while %X1%S1%Z1 should not"; + var encoding = Encoding.GetEncoding ("iso-8859-8"); + var decoder = new HexDecoder (); + var output = new byte[1024]; + + Assert.AreEqual (ContentEncoding.Default, decoder.Encoding); + + var buf = Encoding.ASCII.GetBytes (input); + int n = decoder.Decode (buf, 0, buf.Length, output); + var actual = encoding.GetString (output, 0, n); + + Assert.AreEqual (expected, actual); + } + [Test] public void TestPassThroughEncoder () { From ecfc09d97bf66a463db1104a18448fe70880d2fb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Oct 2018 08:21:22 -0400 Subject: [PATCH 121/741] Added more YDecoder tests --- UnitTests/Encodings/YEncodingTests.cs | 44 +++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/UnitTests/Encodings/YEncodingTests.cs b/UnitTests/Encodings/YEncodingTests.cs index 294966462e..4288193b8e 100644 --- a/UnitTests/Encodings/YEncodingTests.cs +++ b/UnitTests/Encodings/YEncodingTests.cs @@ -166,5 +166,49 @@ public void TestYDecodeStateTransitions () } } } + + static readonly string[] YPartTransitionInputs = { + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=xcontent", + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=yxcontent", + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=ypxcontent", + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=ypaxcontent", + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=yparxcontent", + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=ypartxcontent", + "=ybegin part=1 line=128 size=19338 name=joystick.jpg\n=ypart begin=1 end=11250\ncontent", + }; + + static readonly string[] YPartTransitionOutputs = { + "xcontent", + string.Empty, + string.Empty, + string.Empty, + string.Empty, + string.Empty, + "content" + }; + + [Test] + public void TestYDecodeYPartStateTransitions () + { + var ydec = new YDecoder (); + var decoded = new byte[1024]; + + for (int i = 0; i < YPartTransitionInputs.Length; i++) { + var input = Encoding.ASCII.GetBytes (YPartTransitionInputs[i]); + var chars = YPartTransitionOutputs[i].ToCharArray (); + + for (int j = 0; j < chars.Length; j++) + chars[j] -= (char) 42; + + var expected = new string (chars); + + int n = ydec.Decode (input, 0, input.Length, decoded); + var actual = Encoding.ASCII.GetString (decoded, 0, n); + + Assert.AreEqual (expected, actual, YPartTransitionInputs[i]); + + ydec.Reset (); + } + } } } From d3a6c07b44f21492dbf255e6f3c0c062a04abdb0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Oct 2018 21:39:12 -0400 Subject: [PATCH 122/741] Added SecureMimeContext.Import(string, string) to import passworded pk12 files --- .../BouncyCastleSecureMimeContext.cs | 12 ++--- MimeKit/Cryptography/SecureMimeContext.cs | 49 +++++++++++++++++++ .../Cryptography/ApplicationPkcs7MimeTests.cs | 3 +- UnitTests/Cryptography/SecureMimeTests.cs | 6 ++- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 7b2a543793..db9df9c9c9 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -1151,22 +1151,22 @@ public override MimePart Encrypt (IEnumerable recipients, Stream /// Decrypts the specified encryptedData to an output stream. /// /// The encrypted data. - /// The output stream. + /// The output stream. /// /// is null. /// -or- - /// is null. + /// is null. /// /// /// An error occurred in the cryptographic message syntax subsystem. /// - public override void DecryptTo (Stream encryptedData, Stream output) + public override void DecryptTo (Stream encryptedData, Stream decryptedData) { if (encryptedData == null) throw new ArgumentNullException (nameof (encryptedData)); - if (output == null) - throw new ArgumentNullException (nameof (output)); + if (decryptedData == null) + throw new ArgumentNullException (nameof (decryptedData)); var parser = new CmsEnvelopedDataParser (encryptedData); var recipients = parser.GetRecipientInfos (); @@ -1179,7 +1179,7 @@ public override void DecryptTo (Stream encryptedData, Stream output) var content = recipient.GetContentStream (key); - content.ContentStream.CopyTo (output, 4096); + content.ContentStream.CopyTo (decryptedData, 4096); return; } diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 171d0e36cf..9e78ac1d59 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -719,6 +719,55 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute () /// public abstract void Import (Stream stream, string password); + /// + /// Imports certificates and keys from a pkcs12 file. + /// + /// + /// Imports certificates and keys from a pkcs12 file. + /// + /// The raw certificate and key data in pkcs12 format. + /// The password to unlock the stream. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// is a zero-length string, contains only white space, or + /// contains one or more invalid characters as defined by + /// . + /// -or- + /// does not contain a private key. + /// -or- + /// does not contain a certificate that could be used for signing. + /// + /// + /// is an invalid file path. + /// + /// + /// The specified file path could not be found. + /// + /// + /// The user does not have access to read the specified file. + /// + /// + /// An I/O error occurred. + /// + /// + /// Importing keys is not supported by this cryptography context. + /// + public virtual void Import (string fileName, string password) + { + if (fileName == null) + throw new ArgumentNullException (nameof (fileName)); + + if (password == null) + throw new ArgumentNullException (nameof (password)); + + using (var stream = File.OpenRead (fileName)) + Import (stream, password); + } + /// /// Imports the specified certificate. /// diff --git a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs index 2115df1bd4..377b3f6f37 100644 --- a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs +++ b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs @@ -52,8 +52,7 @@ public void TestArgumentExceptions () recipients.Add (new CmsRecipient (signer.Certificate)); using (var ctx = new TemporarySecureMimeContext ()) { - using (var file = File.OpenRead (path)) - ctx.Import (file, "no.secret"); + ctx.Import (path, "no.secret"); // Compress Assert.Throws (() => ApplicationPkcs7Mime.Compress (null, entity)); diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 81aa33f7b7..dd029c3edd 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -104,8 +104,7 @@ protected SecureMimeTestsBase () path = Path.Combine (dataDir, "smime.p12"); - using (var file = File.OpenRead (path)) - ctx.Import (file, "no.secret"); + ctx.Import (path, "no.secret"); } } @@ -161,7 +160,10 @@ public void TestArgumentExceptions () Assert.Throws (() => ctx.Export (null)); Assert.Throws (() => ctx.GetDigestAlgorithm (null)); Assert.Throws (() => ctx.Import ((Stream) null)); + Assert.Throws (() => ctx.Import ((Stream) null, "password")); Assert.Throws (() => ctx.Import (stream, null)); + Assert.Throws (() => ctx.Import ((string) null, "password")); + Assert.Throws (() => ctx.Import ("fileName", null)); Assert.Throws (() => ctx.Import ((X509Crl) null)); Assert.Throws (() => ctx.Import ((X509Certificate) null)); Assert.Throws (() => ctx.Sign (null, stream)); From 26c29ac7e6884dd873069f73830f1cce00c7a6c3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 08:43:17 -0400 Subject: [PATCH 123/741] Added more PGP and S/MIME unit tests --- UnitTests/Cryptography/PgpMimeTests.cs | 16 +++- UnitTests/Cryptography/SecureMimeTests.cs | 93 +++++++++++++++++++++-- 2 files changed, 100 insertions(+), 9 deletions(-) diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index bd8276fb27..3c71ff3247 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -454,8 +454,20 @@ public void TestMultipartEncryptedEncrypt () var encrypted = MultipartEncrypted.Encrypt (new [] { self }, body); - //using (var file = File.Create ("pgp-encrypted.asc")) - // encrypted.WriteTo (file); + using (var stream = new MemoryStream ()) { + encrypted.WriteTo (stream); + stream.Position = 0; + + var entity = MimeEntity.Load (stream); + + Assert.IsInstanceOf (entity, "Encrypted part is not the expected type"); + + encrypted = (MultipartEncrypted) entity; + + Assert.IsInstanceOf (encrypted[0], "First child of multipart/encrypted is not the expected type"); + Assert.IsInstanceOf (encrypted[1], "Second child of multipart/encrypted is not the expected type"); + Assert.AreEqual ("application/octet-stream", encrypted[1].ContentType.MimeType, "Second child of multipart/encrypted is not the expected mime-type"); + } var decrypted = encrypted.Decrypt (); diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index dd029c3edd..0c4aa2d053 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -62,7 +62,7 @@ protected SecureMimeTestsBase () var dataDir = Path.Combine ("..", "..", "TestData", "smime"); string path; - CryptographyContext.Register (ctx.GetType ()); + CryptographyContext.Register (() => CreateContext ()); if (ctx is WindowsSecureMimeContext) { var windows = (WindowsSecureMimeContext) ctx; @@ -233,6 +233,22 @@ public void TestSecureMimeCompression () var original = new TextPart ("plain"); original.Text = "This is some text that we'll end up compressing..."; + var compressed = ApplicationPkcs7Mime.Compress (original); + + Assert.AreEqual (SecureMimeType.CompressedData, compressed.SecureMimeType, "S/MIME type did not match."); + + var decompressed = compressed.Decompress (); + + Assert.IsInstanceOf (decompressed, "Decompressed part is not the expected type."); + Assert.AreEqual (original.Text, ((TextPart) decompressed).Text, "Decompressed content is not the same as the original."); + } + + [Test] + public void TestSecureMimeCompressionWithContext () + { + var original = new TextPart ("plain"); + original.Text = "This is some text that we'll end up compressing..."; + using (var ctx = CreateContext ()) { var compressed = ApplicationPkcs7Mime.Compress (ctx, original); @@ -258,6 +274,50 @@ public virtual void TestSecureMimeEncapsulatedSigning () var cleartext = new TextPart ("plain"); cleartext.Text = "This is some text that we'll end up signing..."; + var signed = ApplicationPkcs7Mime.Sign (self, DigestAlgorithm.Sha1, cleartext); + MimeEntity extracted; + + Assert.AreEqual (SecureMimeType.SignedData, signed.SecureMimeType, "S/MIME type did not match."); + + var signatures = signed.Verify (out extracted); + + Assert.IsInstanceOf (extracted, "Extracted part is not the expected type."); + Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); + + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + foreach (var signature in signatures) { + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + using (var ctx = CreateContext ()) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; + + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); + } + } + + [Test] + public virtual void TestSecureMimeEncapsulatedSigningWithContext () + { + var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); + + var cleartext = new TextPart ("plain"); + cleartext.Text = "This is some text that we'll end up signing..."; + using (var ctx = CreateContext ()) { var signed = ApplicationPkcs7Mime.Sign (ctx, self, DigestAlgorithm.Sha1, cleartext); MimeEntity extracted; @@ -312,7 +372,7 @@ public virtual void TestSecureMimeEncapsulatedSigning () } [Test] - public virtual void TestSecureMimeSigning () + public virtual void TestSecureMimeMessageSigning () { var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); @@ -388,7 +448,7 @@ public virtual void TestSecureMimeSigning () } [Test] - public virtual async Task TestSecureMimeSigningAsync () + public virtual async Task TestSecureMimeMessageSigningAsync () { var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); @@ -559,6 +619,25 @@ public virtual void TestSecureMimeEncryption () recipients.Add (new CmsRecipient (certificate, SubjectIdentifierType.SubjectKeyIdentifier)); + var encrypted = ApplicationPkcs7Mime.Encrypt (recipients, body); + + Assert.AreEqual (SecureMimeType.EnvelopedData, encrypted.SecureMimeType, "S/MIME type did not match."); + + var decrypted = encrypted.Decrypt (); + + Assert.IsInstanceOf (decrypted, "Decrypted part is not the expected type."); + Assert.AreEqual (body.Text, ((TextPart) decrypted).Text, "Decrypted content is not the same as the original."); + } + + [Test] + public virtual void TestSecureMimeEncryptionWithContext () + { + var certificate = new X509Certificate2 (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up encrypting..." }; + var recipients = new CmsRecipientCollection (); + + recipients.Add (new CmsRecipient (certificate, SubjectIdentifierType.SubjectKeyIdentifier)); + using (var ctx = CreateContext ()) { var encrypted = ApplicationPkcs7Mime.Encrypt (ctx, recipients, body); @@ -978,21 +1057,21 @@ public override void TestSecureMimeEncapsulatedSigning () } [Test] - public override void TestSecureMimeSigning () + public override void TestSecureMimeMessageSigning () { if (Path.DirectorySeparatorChar != '\\') return; - base.TestSecureMimeSigning (); + base.TestSecureMimeMessageSigning (); } [Test] - public override async Task TestSecureMimeSigningAsync () + public override async Task TestSecureMimeMessageSigningAsync () { if (Path.DirectorySeparatorChar != '\\') return; - await base.TestSecureMimeSigningAsync (); + await base.TestSecureMimeMessageSigningAsync (); } [Test] From d16c5334de88fb5412d128f227b074d475b59661 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 09:50:05 -0400 Subject: [PATCH 124/741] Added more CmsRecipientCollection and DkimHashStream tests --- .../Cryptography/CmsRecipientCollection.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 27 +++++++++++ UnitTests/Cryptography/DkimTests.cs | 48 ++++++++++++++++++- UnitTests/Cryptography/SecureMimeTests.cs | 23 ++++++++- 4 files changed, 97 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/CmsRecipientCollection.cs b/MimeKit/Cryptography/CmsRecipientCollection.cs index 6b704940ec..1ee3517cd6 100644 --- a/MimeKit/Cryptography/CmsRecipientCollection.cs +++ b/MimeKit/Cryptography/CmsRecipientCollection.cs @@ -74,7 +74,7 @@ public int Count { /// /// true if this instance is read only; otherwise, false. public bool IsReadOnly { - get; private set; + get { return false; } } /// diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 890388c027..b744d4f4b5 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -49,6 +49,7 @@ public void TestArgumentExceptions () Assert.Throws (() => new CmsRecipient ((string) null)); var recipients = new CmsRecipientCollection (); + Assert.AreEqual (0, recipients.Count); Assert.IsFalse (recipients.IsReadOnly); Assert.Throws (() => recipients.Add (null)); @@ -89,5 +90,31 @@ public void TestDefaultValues () AssertDefaultValues (recipient, certificate); } + + [Test] + public void TestCollectionAddRemove () + { + var path = Path.Combine ("..", "..", "TestData", "smime", "certificate-authority.crt"); + var recipients = new CmsRecipientCollection (); + var recipient = new CmsRecipient (path); + var array = new CmsRecipient[1]; + + Assert.IsFalse (recipients.Contains (recipient), "Contains: False"); + Assert.IsFalse (recipients.Remove (recipient), "Remove: False"); + + recipients.Add (recipient); + + Assert.AreEqual (1, recipients.Count, "Count"); + Assert.IsTrue (recipients.Contains (recipient), "Contains: True"); + + recipients.CopyTo (array, 0); + Assert.AreEqual (recipient, array[0], "CopyTo"); + + Assert.IsTrue (recipients.Remove (recipient), "Remove: True"); + + Assert.AreEqual (0, recipients.Count, "Count"); + + recipients.Clear (); + } } } diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index fce912b139..17cd453ead 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -86,10 +86,56 @@ static DkimSigner CreateSigner (DkimSignatureAlgorithm algorithm) return new DkimSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { SignatureAlgorithm = algorithm, AgentOrUserIdentifier = "@eng.example.com", - QueryMethod = "dns/txt", + QueryMethod = "dns/txt" }; } + [Test] + public void TestDkimSignerCtors () + { + Assert.DoesNotThrow (() => { + var signer = new DkimSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { + SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha256, + AgentOrUserIdentifier = "@eng.example.com", + QueryMethod = "dns/txt" + }; + }); + + Assert.DoesNotThrow (() => { + var signer = new DkimSigner (DkimKeys.Private, "example.com", "1433868189.example") { + SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha256, + AgentOrUserIdentifier = "@eng.example.com", + QueryMethod = "dns/txt" + }; + }); + } + + [Test] + public void TestDkimHashStream () + { + var buffer = new byte[128]; + + using (var stream = new DkimHashStream (DkimSignatureAlgorithm.RsaSha1)) { + Assert.IsFalse (stream.CanRead); + Assert.IsTrue (stream.CanWrite); + Assert.IsFalse (stream.CanSeek); + Assert.IsFalse (stream.CanTimeout); + + Assert.Throws (() => stream.Read (buffer, 0, buffer.Length)); + + Assert.Throws (() => stream.Write (null, 0, 0)); + Assert.Throws (() => stream.Write (buffer, -1, 0)); + Assert.Throws (() => stream.Write (buffer, 0, -1)); + + Assert.AreEqual (0, stream.Length); + + Assert.Throws (() => stream.Position = 64); + + Assert.Throws (() => stream.Seek (64, SeekOrigin.Begin)); + Assert.Throws (() => stream.SetLength (256)); + } + } + [Test] public void TestDkimSignatureStream () { diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 0c4aa2d053..5780f65a27 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -62,7 +62,10 @@ protected SecureMimeTestsBase () var dataDir = Path.Combine ("..", "..", "TestData", "smime"); string path; - CryptographyContext.Register (() => CreateContext ()); + if (ctx is TemporarySecureMimeContext) + CryptographyContext.Register (() => CreateContext ()); + else + CryptographyContext.Register (ctx.GetType ()); if (ctx is WindowsSecureMimeContext) { var windows = (WindowsSecureMimeContext) ctx; @@ -1056,6 +1059,15 @@ public override void TestSecureMimeEncapsulatedSigning () base.TestSecureMimeEncapsulatedSigning (); } + [Test] + public override void TestSecureMimeEncapsulatedSigningWithContext () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeEncapsulatedSigningWithContext (); + } + [Test] public override void TestSecureMimeMessageSigning () { @@ -1101,6 +1113,15 @@ public override void TestSecureMimeEncryption () base.TestSecureMimeEncryption (); } + [Test] + public override void TestSecureMimeEncryptionWithContext () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeEncryption (); + } + [Test] public override void TestSecureMimeEncryptionWithAlgorithm () { From 30cfb5ff6b30c36191cc35921bcd3dc3bf7f8b49 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 12:35:07 -0400 Subject: [PATCH 125/741] Added more S/MIME unit tests --- .../TemporarySecureMimeContext.cs | 23 +- UnitTests/Cryptography/DkimTests.cs | 2 + .../Cryptography/DummySecureMimeContext.cs | 368 ------------------ UnitTests/Cryptography/SecureMimeTests.cs | 97 +++-- UnitTests/UnitTests.csproj | 1 - 5 files changed, 76 insertions(+), 415 deletions(-) delete mode 100644 UnitTests/Cryptography/DummySecureMimeContext.cs diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 6ad12f4e52..0f1cf70b2e 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -47,8 +47,9 @@ namespace MimeKit.Cryptography { public class TemporarySecureMimeContext : BouncyCastleSecureMimeContext { readonly Dictionary capabilities; - readonly Dictionary keys; - readonly List certificates; + internal readonly Dictionary keys; + internal readonly List certificates; + readonly HashSet fingerprints; readonly List crls; /// @@ -62,6 +63,7 @@ public TemporarySecureMimeContext () capabilities = new Dictionary (StringComparer.Ordinal); keys = new Dictionary (StringComparer.Ordinal); certificates = new List (); + fingerprints = new HashSet (); crls = new List (); } @@ -166,9 +168,8 @@ protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnch { var anchors = new Org.BouncyCastle.Utilities.Collections.HashSet (); - foreach (var certificate in certificates) { + foreach (var certificate in certificates) anchors.Add (new TrustAnchor (certificate, null)); - } return anchors; } @@ -186,9 +187,8 @@ protected override IX509Store GetIntermediateCertificates () { var store = new X509CertificateStore (); - foreach (var certificate in certificates) { + foreach (var certificate in certificates) store.Add (certificate); - } return store; } @@ -399,13 +399,15 @@ public override void Import (Stream stream, string password) var entry = pkcs12.GetKey (alias); for (int i = 0; i < chain.Length; i++) - certificates.Add (chain[i].Certificate); + Import (chain[i].Certificate); var fingerprint = chain[0].Certificate.GetFingerprint (); - keys.Add (fingerprint, entry.Key); + if (!keys.ContainsKey (fingerprint)) + keys.Add (fingerprint, entry.Key); } else if (pkcs12.IsCertificateEntry (alias)) { var entry = pkcs12.GetCertificate (alias); - certificates.Add (entry.Certificate); + + Import (entry.Certificate); } } } @@ -425,7 +427,8 @@ public override void Import (X509Certificate certificate) if (certificate == null) throw new ArgumentNullException (nameof (certificate)); - certificates.Add (certificate); + if (fingerprints.Add (certificate.GetFingerprint ())) + certificates.Add (certificate); } /// diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 17cd453ead..73696ac4d8 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -127,6 +127,7 @@ public void TestDkimHashStream () Assert.Throws (() => stream.Write (buffer, -1, 0)); Assert.Throws (() => stream.Write (buffer, 0, -1)); + Assert.AreEqual (0, stream.Position); Assert.AreEqual (0, stream.Length); Assert.Throws (() => stream.Position = 64); @@ -156,6 +157,7 @@ public void TestDkimSignatureStream () Assert.Throws (() => stream.Write (buffer, -1, 0)); Assert.Throws (() => stream.Write (buffer, 0, -1)); + Assert.AreEqual (0, stream.Position); Assert.AreEqual (0, stream.Length); Assert.Throws (() => stream.Position = 64); diff --git a/UnitTests/Cryptography/DummySecureMimeContext.cs b/UnitTests/Cryptography/DummySecureMimeContext.cs deleted file mode 100644 index 770c995ef0..0000000000 --- a/UnitTests/Cryptography/DummySecureMimeContext.cs +++ /dev/null @@ -1,368 +0,0 @@ -// -// DummySecureMimeContext.cs -// -// Author: Jeffrey Stedfast -// -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -using System; -using System.IO; -using System.Collections.Generic; - -using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Pkcs; -using Org.BouncyCastle.Pkix; -using Org.BouncyCastle.X509; -using Org.BouncyCastle.X509.Store; -using Org.BouncyCastle.Asn1.X509; - -using MimeKit; -using MimeKit.Cryptography; - -namespace UnitTests.Cryptography { - public class DummySecureMimeContext : BouncyCastleSecureMimeContext - { - readonly Dictionary capabilities = new Dictionary (); - internal readonly Dictionary keys = new Dictionary (); - internal readonly List certificates = new List (); - internal readonly List crls = new List (); - - public DummySecureMimeContext () - { - CheckCertificateRevocation = true; - } - - /// - /// Check whether or not a particular mailbox address can be used for signing. - /// - /// - /// Checks whether or not as particular mailbocx address can be used for signing. - /// - /// true if the mailbox address can be used for signing; otherwise, false. - /// The signer. - /// - /// is null. - /// - public override bool CanSign (MailboxAddress signer) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - AsymmetricKeyParameter key; - - return GetCmsSignerCertificate (signer, out key) != null; - } - - /// - /// Check whether or not the cryptography context can encrypt to a particular recipient. - /// - /// - /// Checks whether or not the cryptography context can be used to encrypt to a particular recipient. - /// - /// true if the cryptography context can be used to encrypt to the designated recipient; otherwise, false. - /// The recipient's mailbox address. - /// - /// is null. - /// - public override bool CanEncrypt (MailboxAddress mailbox) - { - if (mailbox == null) - throw new ArgumentNullException (nameof (mailbox)); - - return GetCmsRecipientCertificate (mailbox) != null; - } - - #region implemented abstract members of SecureMimeContext - - /// - /// Gets the X.509 certificate based on the selector. - /// - /// The certificate on success; otherwise null. - /// The search criteria for the certificate. - protected override X509Certificate GetCertificate (IX509Selector selector) - { - if (selector == null && certificates.Count > 0) - return certificates[0]; - - foreach (var certificate in certificates) { - if (selector.Match (certificate)) - return certificate; - } - - return null; - } - - /// - /// Gets the private key based on the provided selector. - /// - /// The private key on success; otherwise null. - /// The search criteria for the private key. - protected override AsymmetricKeyParameter GetPrivateKey (IX509Selector selector) - { - foreach (var certificate in certificates) { - AsymmetricKeyParameter key; - - if (!keys.TryGetValue (certificate, out key)) - continue; - - if (selector != null && !selector.Match (certificate)) - continue; - - return key; - } - - return null; - } - - /// - /// Gets the trusted anchors. - /// - /// The trusted anchors. - protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnchors () - { - var anchors = new Org.BouncyCastle.Utilities.Collections.HashSet (); - - foreach (var certificate in certificates) { - anchors.Add (new TrustAnchor (certificate, null)); - } - - return anchors; - } - - /// - /// Gets the intermediate certificates. - /// - /// The intermediate certificates. - protected override IX509Store GetIntermediateCertificates () - { - var store = new X509CertificateStore (); - - foreach (var certificate in certificates) { - store.Add (certificate); - } - - return store; - } - - /// - /// Gets the certificate revocation lists. - /// - /// The certificate revocation lists. - protected override IX509Store GetCertificateRevocationLists () - { - return X509StoreFactory.Create ("Crl/Collection", new X509CollectionStoreParameters (crls)); - } - - /// - /// Get the date & time for the next scheduled certificate revocation list update for the specified issuer. - /// - /// - /// Gets the date & time for the next scheduled certificate revocation list update for the specified issuer. - /// - /// The date & time for the next update. - /// The issuer. - protected override DateTime GetNextCertificateRevocationListUpdate (X509Name issuer) - { - var nextUpdate = DateTime.MinValue.ToUniversalTime (); - - foreach (var crl in crls) { - if (!crl.IssuerDN.Equals (issuer)) - continue; - - nextUpdate = crl.NextUpdate.Value > nextUpdate ? crl.NextUpdate.Value : nextUpdate; - } - - return nextUpdate; - } - - X509Certificate GetCmsRecipientCertificate (MailboxAddress mailbox) - { - var now = DateTime.UtcNow; - - foreach (var certificate in certificates) { - if (certificate.NotBefore > now || certificate.NotAfter < now) - continue; - - var keyUsage = certificate.GetKeyUsageFlags (); - if (keyUsage != 0 && (keyUsage & X509KeyUsageFlags.KeyEncipherment) == 0) - continue; - - if (certificate.GetSubjectEmailAddress () == mailbox.Address) - return certificate; - } - - return null; - } - - /// - /// Gets the for the specified mailbox. - /// - /// A . - /// The mailbox. - /// - /// A certificate for the specified could not be found. - /// - protected override CmsRecipient GetCmsRecipient (MailboxAddress mailbox) - { - X509Certificate certificate; - - if ((certificate = GetCmsRecipientCertificate (mailbox)) == null) - throw new CertificateNotFoundException (mailbox, "A valid certificate could not be found."); - - var recipient = new CmsRecipient (certificate); - EncryptionAlgorithm[] algorithms; - - if (capabilities.TryGetValue (certificate, out algorithms)) - recipient.EncryptionAlgorithms = algorithms; - - return recipient; - } - - X509Certificate GetCmsSignerCertificate (MailboxAddress mailbox, out AsymmetricKeyParameter key) - { - var now = DateTime.UtcNow; - - foreach (var certificate in certificates) { - if (certificate.NotBefore > now || certificate.NotAfter < now) - continue; - - var keyUsage = certificate.GetKeyUsageFlags (); - if (keyUsage != 0 && (keyUsage & SecureMimeContext.DigitalSignatureKeyUsageFlags) == 0) - continue; - - if (!keys.TryGetValue (certificate, out key)) - continue; - - if (certificate.GetSubjectEmailAddress () == mailbox.Address) - return certificate; - } - - key = null; - - return null; - } - - /// - /// Gets the for the specified mailbox. - /// - /// A . - /// The mailbox. - /// The preferred digest algorithm. - /// - /// A certificate for the specified could not be found. - /// - protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorithm digestAlgo) - { - X509Certificate certificate; - AsymmetricKeyParameter key; - - if ((certificate = GetCmsSignerCertificate (mailbox, out key)) == null) - throw new CertificateNotFoundException (mailbox, "A valid signing certificate could not be found."); - - var signer = new CmsSigner (certificate, key); - signer.DigestAlgorithm = digestAlgo; - return signer; - } - - /// - /// Updates the known S/MIME capabilities of the client used by the recipient that owns the specified certificate. - /// - /// The certificate. - /// The encryption algorithm capabilities of the client (in preferred order). - /// The timestamp. - protected override void UpdateSecureMimeCapabilities (X509Certificate certificate, EncryptionAlgorithm[] algorithms, DateTime timestamp) - { - capabilities[certificate] = algorithms; - } - - /// - /// Import the specified certificate. - /// - /// The certificate. - /// - /// is null. - /// - public override void Import (X509Certificate certificate) - { - if (certificate == null) - throw new ArgumentNullException ("certificate"); - - certificates.Add (certificate); - } - - /// - /// Import the specified certificate revocation list. - /// - /// The certificate revocation list. - /// - /// is null. - /// - public override void Import (X509Crl crl) - { - if (crl == null) - throw new ArgumentNullException ("crl"); - - crls.Add (crl); - } - - /// - /// Imports certificates and keys from a pkcs12-encoded stream. - /// - /// The raw certificate and key data. - /// The password to unlock the data. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// Importing keys is not supported by this cryptography context. - /// - public override void Import (Stream stream, string password) - { - if (stream == null) - throw new ArgumentNullException ("stream"); - - if (password == null) - throw new ArgumentNullException ("password"); - - var pkcs12 = new Pkcs12Store (stream, password.ToCharArray ()); - - foreach (string alias in pkcs12.Aliases) { - if (pkcs12.IsKeyEntry (alias)) { - var chain = pkcs12.GetCertificateChain (alias); - var entry = pkcs12.GetKey (alias); - - for (int i = 0; i < chain.Length; i++) - certificates.Add (chain[i].Certificate); - - keys.Add (chain[0].Certificate, entry.Key); - } else if (pkcs12.IsCertificateEntry (alias)) { - var entry = pkcs12.GetCertificate (alias); - certificates.Add (entry.Certificate); - } - } - } - - #endregion - } -} diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 5780f65a27..7ecffeae6b 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -108,6 +108,9 @@ protected SecureMimeTestsBase () path = Path.Combine (dataDir, "smime.p12"); ctx.Import (path, "no.secret"); + + // import a second time to cover the case where the certificate & private key already exist + Assert.DoesNotThrow (() => ctx.Import (path, "no.secret")); } } @@ -313,6 +316,48 @@ public virtual void TestSecureMimeEncapsulatedSigning () } } + void AssertValidSignatures (SecureMimeContext ctx, DigitalSignatureCollection signatures) + { + foreach (var signature in signatures) { + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; + + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Seed)) + Assert.AreEqual (EncryptionAlgorithm.Seed, algorithms[i++], "Expected SEED capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Camellia256)) + Assert.AreEqual (EncryptionAlgorithm.Camellia256, algorithms[i++], "Expected Camellia-256 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Camellia192)) + Assert.AreEqual (EncryptionAlgorithm.Camellia192, algorithms[i++], "Expected Camellia-192 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Camellia128)) + Assert.AreEqual (EncryptionAlgorithm.Camellia128, algorithms[i++], "Expected Camellia-128 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Cast5)) + Assert.AreEqual (EncryptionAlgorithm.Cast5, algorithms[i++], "Expected Cast5 capability"); + Assert.AreEqual (EncryptionAlgorithm.TripleDes, algorithms[i++], "Expected Triple-DES capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Idea)) + Assert.AreEqual (EncryptionAlgorithm.Idea, algorithms[i++], "Expected IDEA capability"); + //Assert.AreEqual (EncryptionAlgorithm.RC2128, algorithms[i++], "Expected RC2-128 capability"); + //Assert.AreEqual (EncryptionAlgorithm.RC264, algorithms[i++], "Expected RC2-64 capability"); + //Assert.AreEqual (EncryptionAlgorithm.Des, algorithms[i++], "Expected DES capability"); + //Assert.AreEqual (EncryptionAlgorithm.RC240, algorithms[i++], "Expected RC2-40 capability"); + } + } + [Test] public virtual void TestSecureMimeEncapsulatedSigningWithContext () { @@ -333,43 +378,17 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContext () Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); - foreach (var signature in signatures) { - try { - bool valid = signature.Verify (); + AssertValidSignatures (ctx, signatures); - Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); - } catch (DigitalSignatureVerifyException ex) { - if (ctx is WindowsSecureMimeContext) { - // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); - } else { - Assert.Fail ("Failed to verify signature: {0}", ex); - } - } + using (var signedData = signed.Content.Open ()) { + using (var stream = ctx.Verify (signedData, out signatures)) + extracted = MimeEntity.Load (stream); + + Assert.IsInstanceOf (extracted, "Extracted part is not the expected type."); + Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); - var algorithms = GetEncryptionAlgorithms (signature); - int i = 0; - - Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); - Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); - Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); - if (ctx.IsEnabled (EncryptionAlgorithm.Seed)) - Assert.AreEqual (EncryptionAlgorithm.Seed, algorithms[i++], "Expected SEED capability"); - if (ctx.IsEnabled (EncryptionAlgorithm.Camellia256)) - Assert.AreEqual (EncryptionAlgorithm.Camellia256, algorithms[i++], "Expected Camellia-256 capability"); - if (ctx.IsEnabled (EncryptionAlgorithm.Camellia192)) - Assert.AreEqual (EncryptionAlgorithm.Camellia192, algorithms[i++], "Expected Camellia-192 capability"); - if (ctx.IsEnabled (EncryptionAlgorithm.Camellia128)) - Assert.AreEqual (EncryptionAlgorithm.Camellia128, algorithms[i++], "Expected Camellia-128 capability"); - if (ctx.IsEnabled (EncryptionAlgorithm.Cast5)) - Assert.AreEqual (EncryptionAlgorithm.Cast5, algorithms[i++], "Expected Cast5 capability"); - Assert.AreEqual (EncryptionAlgorithm.TripleDes, algorithms[i++], "Expected Triple-DES capability"); - if (ctx.IsEnabled (EncryptionAlgorithm.Idea)) - Assert.AreEqual (EncryptionAlgorithm.Idea, algorithms[i++], "Expected IDEA capability"); - //Assert.AreEqual (EncryptionAlgorithm.RC2128, algorithms[i++], "Expected RC2-128 capability"); - //Assert.AreEqual (EncryptionAlgorithm.RC264, algorithms[i++], "Expected RC2-64 capability"); - //Assert.AreEqual (EncryptionAlgorithm.Des, algorithms[i++], "Expected DES capability"); - //Assert.AreEqual (EncryptionAlgorithm.RC240, algorithms[i++], "Expected RC2-40 capability"); + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + AssertValidSignatures (ctx, signatures); } } } @@ -970,7 +989,7 @@ public void TestSecureMimeImportExport () Assert.AreEqual (SecureMimeType.CertsOnly, pkcs7mime.SecureMimeType, "S/MIME type did not match."); - using (var imported = new DummySecureMimeContext ()) { + using (var imported = new TemporarySecureMimeContext ()) { pkcs7mime.Import (imported); Assert.AreEqual (1, imported.certificates.Count, "Unexpected number of imported certificates."); @@ -1006,6 +1025,12 @@ protected override SecureMimeContext CreateContext () { return new MySecureMimeContext (); } + + static SecureMimeSqliteTests () + { + if (File.Exists ("smime.db")) + File.Delete ("smime.db"); + } } #if false diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index ab3ce0dadc..9601212c7b 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -78,7 +78,6 @@ - From dfbcfddec67834aa3f6b2237023f007eccc62758 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 16:48:14 -0400 Subject: [PATCH 126/741] Added more S/MIME unit tests --- UnitTests/Cryptography/SecureMimeTests.cs | 226 ++++++++++++++++++++++ 1 file changed, 226 insertions(+) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 7ecffeae6b..2b43beee2a 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -393,6 +393,196 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContext () } } + [Test] + public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; + + var signed = ApplicationPkcs7Mime.Sign (signer, cleartext); + MimeEntity extracted; + + Assert.AreEqual (SecureMimeType.SignedData, signed.SecureMimeType, "S/MIME type did not match."); + + var signatures = signed.Verify (out extracted); + + Assert.IsInstanceOf (extracted, "Extracted part is not the expected type."); + Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); + + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + foreach (var signature in signatures) { + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + using (var ctx = CreateContext ()) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; + + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); + } + } + + [Test] + public virtual void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; + + using (var ctx = CreateContext ()) { + var signed = ApplicationPkcs7Mime.Sign (ctx, signer, cleartext); + MimeEntity extracted; + + Assert.AreEqual (SecureMimeType.SignedData, signed.SecureMimeType, "S/MIME type did not match."); + + var signatures = signed.Verify (ctx, out extracted); + + Assert.IsInstanceOf (extracted, "Extracted part is not the expected type."); + Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); + + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + AssertValidSignatures (ctx, signatures); + + using (var signedData = signed.Content.Open ()) { + using (var stream = ctx.Verify (signedData, out signatures)) + extracted = MimeEntity.Load (stream); + + Assert.IsInstanceOf (extracted, "Extracted part is not the expected type."); + Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); + + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + AssertValidSignatures (ctx, signatures); + } + } + } + + [Test] + public virtual void TestSecureMimeSigningWithCmsSigner () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; + + var multipart = MultipartSigned.Create (signer, body); + + Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children."); + + var protocol = multipart.ContentType.Parameters["protocol"]; + Assert.AreEqual ("application/pkcs7-signature", protocol, "The multipart/signed protocol does not match."); + + Assert.IsInstanceOf (multipart[0], "The first child is not a text part."); + Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); + + var signatures = multipart.Verify (); + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + + var signature = signatures[0]; + + using (var ctx = CreateContext ()) { + if (!(ctx is WindowsSecureMimeContext) || Path.DirectorySeparatorChar == '\\') + Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); + Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); + Assert.AreEqual (MimeKitFingerprint, signature.SignerCertificate.Fingerprint.ToLowerInvariant ()); + + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; + + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); + + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + } + + [Test] + public virtual void TestSecureMimeSigningWithContextAndCmsSigner () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; + + using (var ctx = CreateContext ()) { + var multipart = MultipartSigned.Create (ctx, signer, body); + + Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children."); + + var protocol = multipart.ContentType.Parameters["protocol"]; + Assert.AreEqual (ctx.SignatureProtocol, protocol, "The multipart/signed protocol does not match."); + + Assert.IsInstanceOf (multipart[0], "The first child is not a text part."); + Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); + + var signatures = multipart.Verify (ctx); + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + + var signature = signatures[0]; + + if (!(ctx is WindowsSecureMimeContext) || Path.DirectorySeparatorChar == '\\') + Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); + Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); + Assert.AreEqual (MimeKitFingerprint, signature.SignerCertificate.Fingerprint.ToLowerInvariant ()); + + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; + + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Seed)) + Assert.AreEqual (EncryptionAlgorithm.Seed, algorithms[i++], "Expected SEED capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Camellia256)) + Assert.AreEqual (EncryptionAlgorithm.Camellia256, algorithms[i++], "Expected Camellia-256 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Camellia192)) + Assert.AreEqual (EncryptionAlgorithm.Camellia192, algorithms[i++], "Expected Camellia-192 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Camellia128)) + Assert.AreEqual (EncryptionAlgorithm.Camellia128, algorithms[i++], "Expected Camellia-128 capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Cast5)) + Assert.AreEqual (EncryptionAlgorithm.Cast5, algorithms[i++], "Expected Cast5 capability"); + Assert.AreEqual (EncryptionAlgorithm.TripleDes, algorithms[i++], "Expected Triple-DES capability"); + if (ctx.IsEnabled (EncryptionAlgorithm.Idea)) + Assert.AreEqual (EncryptionAlgorithm.Idea, algorithms[i++], "Expected IDEA capability"); + //Assert.AreEqual (EncryptionAlgorithm.RC2128, algorithms[i++], "Expected RC2-128 capability"); + //Assert.AreEqual (EncryptionAlgorithm.RC264, algorithms[i++], "Expected RC2-64 capability"); + //Assert.AreEqual (EncryptionAlgorithm.Des, algorithms[i++], "Expected DES capability"); + //Assert.AreEqual (EncryptionAlgorithm.RC240, algorithms[i++], "Expected RC2-40 capability"); + + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + } + [Test] public virtual void TestSecureMimeMessageSigning () { @@ -1093,6 +1283,42 @@ public override void TestSecureMimeEncapsulatedSigningWithContext () base.TestSecureMimeEncapsulatedSigningWithContext (); } + [Test] + public override void TestSecureMimeEncapsulatedSigningWithCmsSigner () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeEncapsulatedSigningWithCmsSigner (); + } + + [Test] + public override void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner (); + } + + [Test] + public override void TestSecureMimeSigningWithCmsSigner () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeSigningWithCmsSigner (); + } + + [Test] + public override void TestSecureMimeSigningWithContextAndCmsSigner () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeSigningWithContextAndCmsSigner (); + } + [Test] public override void TestSecureMimeMessageSigning () { From 293db87ec0370c6c592c7e0a2f8af15aa4e4c8e3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 16:57:22 -0400 Subject: [PATCH 127/741] Added another unit test for S/MIME --- UnitTests/Cryptography/SecureMimeTests.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 2b43beee2a..e1858ab5f6 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -163,6 +163,7 @@ public void TestArgumentExceptions () Assert.Throws (() => ctx.Encrypt (recipients, null)); Assert.Throws (() => ctx.Encrypt ((IEnumerable) null, stream)); Assert.Throws (() => ctx.Encrypt (new MailboxAddress[0], null)); + Assert.Throws (() => ctx.Encrypt (new MailboxAddress[0], stream)); Assert.Throws (() => ctx.Export (null)); Assert.Throws (() => ctx.GetDigestAlgorithm (null)); Assert.Throws (() => ctx.Import ((Stream) null)); @@ -205,6 +206,12 @@ public virtual void TestCanSignAndEncrypt () Assert.IsTrue (ctx.CanSign (valid), "{0} should be able to sign.", valid); Assert.IsTrue (ctx.CanEncrypt (valid), "{0} should be able to encrypt.", valid); + + using (var content = new MemoryStream ()) { + Assert.Throws (() => ctx.Encrypt (new[] { invalid }, content)); + Assert.Throws (() => ctx.Sign (invalid, DigestAlgorithm.Sha1, content)); + Assert.Throws (() => ctx.EncapsulatedSign (invalid, DigestAlgorithm.Sha1, content)); + } } } From 37fff3df4e20da5e7e9cbbdb07c7695c637d98a4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 19:37:51 -0400 Subject: [PATCH 128/741] Removed unused code from WindowsSecureMimeContext --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 8 ++++---- UnitTests/Cryptography/SecureMimeTests.cs | 8 ++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index ae3babd458..77ed02e828 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -725,10 +725,10 @@ DigitalSignatureCollection GetDigitalSignatures (SignedCms signed) if (signedData == null) throw new ArgumentNullException (nameof (signedData)); - var contentInfo = new ContentInfo (ReadAllBytes (signedData)); + var content = ReadAllBytes (signedData); var signed = new SignedCms (); - signed.Decode (ReadAllBytes (signedData)); + signed.Decode (content); var memory = new MemoryStream (signed.ContentInfo.Content, false); @@ -766,10 +766,10 @@ DigitalSignatureCollection GetDigitalSignatures (SignedCms signed) if (signedData == null) throw new ArgumentNullException (nameof (signedData)); - var contentInfo = new ContentInfo (ReadAllBytes (signedData)); + var content = ReadAllBytes (signedData); var signed = new SignedCms (); - signed.Decode (ReadAllBytes (signedData)); + signed.Decode (content); signatures = GetDigitalSignatures (signed); diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index e1858ab5f6..452d3a7d1c 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -282,11 +282,9 @@ protected virtual EncryptionAlgorithm[] GetEncryptionAlgorithms (IDigitalSignatu [Test] public virtual void TestSecureMimeEncapsulatedSigning () { + var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); - var cleartext = new TextPart ("plain"); - cleartext.Text = "This is some text that we'll end up signing..."; - var signed = ApplicationPkcs7Mime.Sign (self, DigestAlgorithm.Sha1, cleartext); MimeEntity extracted; @@ -368,11 +366,9 @@ void AssertValidSignatures (SecureMimeContext ctx, DigitalSignatureCollection si [Test] public virtual void TestSecureMimeEncapsulatedSigningWithContext () { + var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); - var cleartext = new TextPart ("plain"); - cleartext.Text = "This is some text that we'll end up signing..."; - using (var ctx = CreateContext ()) { var signed = ApplicationPkcs7Mime.Sign (ctx, self, DigestAlgorithm.Sha1, cleartext); MimeEntity extracted; From b95224b28c51f3979906696cbc02fe5779a4d34c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 20:55:54 -0400 Subject: [PATCH 129/741] Fixed WindowsSecureMimeContext.EncapsulatedSign(CmsSigner, ...) --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 77ed02e828..7422631af2 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -464,7 +464,7 @@ public override ApplicationPkcs7Mime EncapsulatedSign (CmsSigner signer, Stream var real = GetRealCmsSigner (signer); - return new ApplicationPkcs7Mime (SecureMimeType.SignedData, Sign (real, content, true)); + return new ApplicationPkcs7Mime (SecureMimeType.SignedData, Sign (real, content, false)); } /// From 9d6ebc34b42c69c478fb827ba729cd2e1702f417 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 20:56:45 -0400 Subject: [PATCH 130/741] Fixed unit tests --- UnitTests/Cryptography/SecureMimeTests.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 452d3a7d1c..647ca71744 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -305,7 +305,7 @@ public virtual void TestSecureMimeEncapsulatedSigning () using (var ctx = CreateContext ()) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -331,7 +331,7 @@ void AssertValidSignatures (SecureMimeContext ctx, DigitalSignatureCollection si } catch (DigitalSignatureVerifyException ex) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -422,7 +422,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () using (var ctx = CreateContext ()) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -512,7 +512,7 @@ public virtual void TestSecureMimeSigningWithCmsSigner () } catch (DigitalSignatureVerifyException ex) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -578,7 +578,7 @@ public virtual void TestSecureMimeSigningWithContextAndCmsSigner () } catch (DigitalSignatureVerifyException ex) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -654,7 +654,7 @@ public virtual void TestSecureMimeMessageSigning () } catch (DigitalSignatureVerifyException ex) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -730,7 +730,7 @@ public virtual async Task TestSecureMimeMessageSigningAsync () } catch (DigitalSignatureVerifyException ex) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -1070,7 +1070,7 @@ public virtual void TestSecureMimeSignAndEncrypt () } catch (DigitalSignatureVerifyException ex) { if (ctx is WindowsSecureMimeContext) { // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (ex.InnerException.Message, UntrustedRootCertificateMessage); + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } From 8a006dc505c9e50d7393c993f4ee993f9d50b070 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Oct 2018 21:37:25 -0400 Subject: [PATCH 131/741] Fixed WindowsSecureMimeContext.Sign (CmsSigner, ...) --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 7422631af2..8b3c389653 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -536,7 +536,7 @@ public override ApplicationPkcs7Signature Sign (CmsSigner signer, Stream content var real = GetRealCmsSigner (signer); - return new ApplicationPkcs7Signature (Sign (real, content, false)); + return new ApplicationPkcs7Signature (Sign (real, content, true)); } /// From 5db6b8956f82ac13fc1c9f2588b701f5bb7a893b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 20 Oct 2018 15:16:24 -0400 Subject: [PATCH 132/741] Simplified *Exception.GetObjectData() --- MimeKit/Cryptography/CertificateNotFoundException.cs | 5 +---- MimeKit/Cryptography/DigitalSignatureVerifyException.cs | 5 +---- MimeKit/Cryptography/PrivateKeyNotFoundException.cs | 5 +---- MimeKit/Cryptography/PublicKeyNotFoundException.cs | 5 +---- MimeKit/ParseException.cs | 5 +---- MimeKit/Tnef/TnefException.cs | 5 +---- 6 files changed, 6 insertions(+), 24 deletions(-) diff --git a/MimeKit/Cryptography/CertificateNotFoundException.cs b/MimeKit/Cryptography/CertificateNotFoundException.cs index 87cba4d7d6..faf2f237ee 100644 --- a/MimeKit/Cryptography/CertificateNotFoundException.cs +++ b/MimeKit/Cryptography/CertificateNotFoundException.cs @@ -95,12 +95,9 @@ public CertificateNotFoundException (MailboxAddress mailbox, string message) : b [SecurityCritical] public override void GetObjectData (SerializationInfo info, StreamingContext context) { - if (info == null) - throw new ArgumentNullException (nameof (info)); + base.GetObjectData (info, context); info.AddValue ("Mailbox", Mailbox.ToString (true)); - - base.GetObjectData (info, context); } #endif diff --git a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs index 1bb0cc6ea7..2872bf8869 100644 --- a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs +++ b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs @@ -127,12 +127,9 @@ public DigitalSignatureVerifyException (string message) : base (message) [SecurityCritical] public override void GetObjectData (SerializationInfo info, StreamingContext context) { - if (info == null) - throw new ArgumentNullException (nameof (info)); + base.GetObjectData (info, context); info.AddValue ("KeyId", KeyId, typeof (long?)); - - base.GetObjectData (info, context); } #endif diff --git a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs index a297b4b554..a6115f4bdf 100644 --- a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs @@ -132,12 +132,9 @@ public PrivateKeyNotFoundException (long keyid, string message) : base (message) [SecurityCritical] public override void GetObjectData (SerializationInfo info, StreamingContext context) { - if (info == null) - throw new ArgumentNullException (nameof (info)); + base.GetObjectData (info, context); info.AddValue ("KeyId", KeyId); - - base.GetObjectData (info, context); } #endif diff --git a/MimeKit/Cryptography/PublicKeyNotFoundException.cs b/MimeKit/Cryptography/PublicKeyNotFoundException.cs index e1c106cc8b..8d2fe4cf4b 100644 --- a/MimeKit/Cryptography/PublicKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PublicKeyNotFoundException.cs @@ -95,12 +95,9 @@ public PublicKeyNotFoundException (MailboxAddress mailbox, string message) : bas [SecurityCritical] public override void GetObjectData (SerializationInfo info, StreamingContext context) { - if (info == null) - throw new ArgumentNullException (nameof (info)); + base.GetObjectData (info, context); info.AddValue ("Mailbox", Mailbox.ToString (true)); - - base.GetObjectData (info, context); } #endif diff --git a/MimeKit/ParseException.cs b/MimeKit/ParseException.cs index a461816c8d..0ee7b7639c 100644 --- a/MimeKit/ParseException.cs +++ b/MimeKit/ParseException.cs @@ -114,13 +114,10 @@ public ParseException (string message, int tokenIndex, int errorIndex) : base (m [SecurityCritical] public override void GetObjectData (SerializationInfo info, StreamingContext context) { - if (info == null) - throw new ArgumentNullException (nameof (info)); + base.GetObjectData (info, context); info.AddValue ("TokenIndex", TokenIndex); info.AddValue ("ErrorIndex", ErrorIndex); - - base.GetObjectData (info, context); } #endif diff --git a/MimeKit/Tnef/TnefException.cs b/MimeKit/Tnef/TnefException.cs index 559e2b01ba..ff7cfba356 100644 --- a/MimeKit/Tnef/TnefException.cs +++ b/MimeKit/Tnef/TnefException.cs @@ -106,12 +106,9 @@ public TnefException (TnefComplianceStatus error, string message) : base (messag [SecurityCritical] public override void GetObjectData (SerializationInfo info, StreamingContext context) { - if (info == null) - throw new ArgumentNullException (nameof (info)); + base.GetObjectData (info, context); info.AddValue ("Error", Error); - - base.GetObjectData (info, context); } #endif From 47bc7751e7deb47946cf033bb3f1d3e6254e0459 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 24 Oct 2018 16:47:03 -0400 Subject: [PATCH 133/741] Throw a ParserException in ParseEntity() when the stream does not have headers Fixes issue #443 --- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/MimeParser.cs | 19 +++++++++++++------ UnitTests/TestData/mbox/jwz.mbox.txt | 1 - 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index fc205b5404..083faceac7 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -323,7 +323,7 @@ async Task ConstructMessagePartAsync (MessagePart part, Cancellati } // parse the headers... - state = MimeParserState.Headers; + state = MimeParserState.MessageHeaders; if (await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) { // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 1098b747cb..5aa1df6c04 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -779,10 +779,17 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check return false; } - if (state == MimeParserState.MessageHeaders && headers.Count == 0) { - // ignore From-lines that might appear at the start of a message - if (length < 5 || !IsMboxMarker (start, true)) { - // not a From-line... + if (headers.Count == 0) { + if (state == MimeParserState.MessageHeaders) { + // ignore From-lines that might appear at the start of a message + if (length < 5 || !IsMboxMarker (start, true)) { + // not a From-line... + inputIndex = (int) (start - inbuf); + state = MimeParserState.Error; + headerIndex = 0; + return false; + } + } else if (state == MimeParserState.Headers) { inputIndex = (int) (start - inbuf); state = MimeParserState.Error; headerIndex = 0; @@ -832,7 +839,7 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check length = (inptr + 1) - start; - if (!valid && headers.Count == 0 && length > 5 && IsMboxMarker (start, true)) { + if (!valid && headers.Count == 0 && length >= 5 && IsMboxMarker (start, true)) { if (inptr[-1] == (byte) '\r') length--; length--; @@ -1279,7 +1286,7 @@ unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, Cancell } // parse the headers... - state = MimeParserState.Headers; + state = MimeParserState.MessageHeaders; if (Step (inbuf, cancellationToken) == MimeParserState.Error) { // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, diff --git a/UnitTests/TestData/mbox/jwz.mbox.txt b/UnitTests/TestData/mbox/jwz.mbox.txt index 93edf33748..d3ab425e8d 100644 --- a/UnitTests/TestData/mbox/jwz.mbox.txt +++ b/UnitTests/TestData/mbox/jwz.mbox.txt @@ -6595,7 +6595,6 @@ a --PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2 Content-type: message/rfc822 -26-Aug-92 22:15:02-LCL,22076;000000000000 Received: from po3.andrew.cmu.edu by COSMOS.VLSI.CS.CMU.EDU id aa13358; 26 Aug 92 22:14:26 EDT Received: from sqhilton.pc.cs.cmu.edu by po3.andrew.cmu.edu (5.54/3.15) id for beatty@cosmos.vlsi.cs.cmu.edu; Wed, 26 Aug 92 22:14:07 EDT From 621ad1b7544a551f3f7f50cf5cf231be7776ab05 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 25 Oct 2018 04:22:44 -0400 Subject: [PATCH 134/741] Updated README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ecee35fede..5eb6575017 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ | |Build Status|Code Coverage|Static Analysis| |-------------|:----------:|:-----------:|:-------------:| -|**Linux/Mac**|[![Build Status](https://travis-ci.org/jstedfast/MimeKit.svg)](https://travis-ci.org/jstedfast/MimeKit)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=HEAD&service=github)](https://coveralls.io/r/jstedfast/MimeKit?branch=HEAD)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| -|**Windows** |[![Build Status](https://ci.appveyor.com/api/projects/status/07h7cobihqficw3s/branch/master?svg=true)](https://ci.appveyor.com/project/jstedfast/mimekit/branch/master)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=HEAD&service=github)](https://coveralls.io/r/jstedfast/MimeKit?branch=HEAD)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| +|**Linux/Mac**|[![Build Status](https://travis-ci.org/jstedfast/MimeKit.svg)](https://travis-ci.org/jstedfast/MimeKit)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=master)](https://coveralls.io/r/jstedfast/MimeKit?branch=master)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| +|**Windows** |[![Build Status](https://ci.appveyor.com/api/projects/status/07h7cobihqficw3s/branch/master?svg=true)](https://ci.appveyor.com/project/jstedfast/mimekit/branch/master)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=master)](https://coveralls.io/r/jstedfast/MimeKit?branch=master)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| ## What is MimeKit? From b3773324a94204e0dcd4729e070248a56c594b2f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 26 Oct 2018 09:03:17 -0400 Subject: [PATCH 135/741] Implemented a better fix for issue #443 --- MimeKit/AsyncMimeParser.cs | 5 ++++ MimeKit/MimeParser.cs | 34 ++++++++++++++++++++-------- UnitTests/TestData/mbox/jwz.mbox.txt | 1 + 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 083faceac7..85fa3c3986 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -195,6 +195,7 @@ async Task StepAsync (CancellationToken cancellationToken) case MimeParserState.MessageHeaders: case MimeParserState.Headers: await StepHeadersAsync (cancellationToken).ConfigureAwait (false); + toplevel = false; break; } @@ -509,6 +510,8 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat stream.Seek (offset, SeekOrigin.Begin); state = MimeParserState.Headers; + toplevel = true; + if (await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) throw new FormatException ("Failed to parse entity headers."); @@ -570,6 +573,8 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat } } + toplevel = true; + // parse the headers if (state < MimeParserState.Content && await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) throw new FormatException ("Failed to parse message headers."); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 5aa1df6c04..0e36cb261a 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -138,6 +138,7 @@ public partial class MimeParser : IEnumerable MimeParserState state; MimeFormat format; bool persistent; + bool toplevel; bool eos; ParserOptions options; @@ -330,9 +331,11 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, contentEnd = 0; offset = stream.CanSeek ? stream.Position : 0; + preHeaderLength = 0; headers.Clear (); headerOffset = 0; headerIndex = 0; + toplevel = false; eos = false; bounds.Clear (); @@ -748,6 +751,7 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check if (IsBlank (*inptr)) { blank = true; } else if (blank || IsControl (*inptr)) { + char c = (char) *inptr; valid = false; break; } @@ -771,7 +775,7 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check if (!valid) { length = inptr - start; - if (format == MimeFormat.Mbox && length >= 5 && IsMboxMarker (start)) { + if (format == MimeFormat.Mbox && inputIndex >= contentEnd && length >= 5 && IsMboxMarker (start)) { // we've found the start of the next message... inputIndex = (int) (start - inbuf); state = MimeParserState.Complete; @@ -782,14 +786,14 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check if (headers.Count == 0) { if (state == MimeParserState.MessageHeaders) { // ignore From-lines that might appear at the start of a message - if (length < 5 || !IsMboxMarker (start, true)) { + if (toplevel && (length < 5 || !IsMboxMarker (start, true))) { // not a From-line... inputIndex = (int) (start - inbuf); state = MimeParserState.Error; headerIndex = 0; return false; } - } else if (state == MimeParserState.Headers) { + } else if (toplevel && state == MimeParserState.Headers) { inputIndex = (int) (start - inbuf); state = MimeParserState.Error; headerIndex = 0; @@ -839,18 +843,23 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check length = (inptr + 1) - start; - if (!valid && headers.Count == 0 && length >= 5 && IsMboxMarker (start, true)) { - if (inptr[-1] == (byte) '\r') + if (!valid && headers.Count == 0) { + if (length > 0 && preHeaderLength == 0) { + if (inptr[-1] == (byte) '\r') + length--; length--; - length--; - preHeaderLength = (int) length; + preHeaderLength = (int) length; - if (preHeaderLength > preHeaderBuffer.Length) - Array.Resize (ref preHeaderBuffer, NextAllocSize (preHeaderLength)); + if (preHeaderLength > preHeaderBuffer.Length) + Array.Resize (ref preHeaderBuffer, NextAllocSize (preHeaderLength)); - Buffer.BlockCopy (input, (int) (start - inbuf), preHeaderBuffer, 0, preHeaderLength); + Buffer.BlockCopy (input, (int) (start - inbuf), preHeaderBuffer, 0, preHeaderLength); + } + scanningFieldName = true; checkFolded = false; + blank = false; + valid = true; } else { AppendRawHeaderData ((int) (start - inbuf), (int) length); checkFolded = true; @@ -974,6 +983,7 @@ unsafe MimeParserState Step (byte* inbuf, CancellationToken cancellationToken) case MimeParserState.MessageHeaders: case MimeParserState.Headers: StepHeaders (inbuf, cancellationToken); + toplevel = false; break; } @@ -1477,6 +1487,8 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) stream.Seek (offset, SeekOrigin.Begin); state = MimeParserState.Headers; + toplevel = true; + if (Step (inbuf, cancellationToken) == MimeParserState.Error) throw new FormatException ("Failed to parse entity headers."); @@ -1547,6 +1559,8 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke } } + toplevel = true; + // parse the headers if (state < MimeParserState.Content && Step (inbuf, cancellationToken) == MimeParserState.Error) throw new FormatException ("Failed to parse message headers."); diff --git a/UnitTests/TestData/mbox/jwz.mbox.txt b/UnitTests/TestData/mbox/jwz.mbox.txt index d3ab425e8d..93edf33748 100644 --- a/UnitTests/TestData/mbox/jwz.mbox.txt +++ b/UnitTests/TestData/mbox/jwz.mbox.txt @@ -6595,6 +6595,7 @@ a --PART.BOUNDARY.2418.16114.COSMOS.VLSI.CS.CMU.EDU.715029153.2 Content-type: message/rfc822 +26-Aug-92 22:15:02-LCL,22076;000000000000 Received: from po3.andrew.cmu.edu by COSMOS.VLSI.CS.CMU.EDU id aa13358; 26 Aug 92 22:14:26 EDT Received: from sqhilton.pc.cs.cmu.edu by po3.andrew.cmu.edu (5.54/3.15) id for beatty@cosmos.vlsi.cs.cmu.edu; Wed, 26 Aug 92 22:14:07 EDT From 72fbb9a427a4cf94b1092da374109034647c84af Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 27 Oct 2018 09:25:54 -0400 Subject: [PATCH 136/741] Register message/global as a MessagePart --- MimeKit/ParserOptions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 91c3f274c7..dedb31d8f4 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -334,6 +334,7 @@ internal MimeEntity CreateEntity (ContentType contentType, IList
headers case "external-body": case "rfc2822": case "rfc822": + case "global": case "news": if (!IsEncoded (headers)) return new MessagePart (args); From 7071b668057d92bd7ed63b80babad7fe506690a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 28 Oct 2018 12:43:26 -0400 Subject: [PATCH 137/741] Bumped version to 2.0.7 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 20 ++++++++++++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 20 +++++++++++++++----- nuget/MimeKitLite.nuspec | 17 ++++++++++++----- 7 files changed, 52 insertions(+), 15 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 77ee8884ad..00ddf98df5 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.6 + 2.0.7 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 4f9ff4c42d..e33bbbacd3 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.6 + 2.0.7 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 7340a62131..7872c880db 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.6.0")] -[assembly: AssemblyFileVersion ("2.0.6.0")] +[assembly: AssemblyInformationalVersion ("2.0.7.0")] +[assembly: AssemblyFileVersion ("2.0.7.0")] [assembly: AssemblyVersion ("2.0.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index ecf59852ed..75cd32d755 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,25 @@ # Release Notes +### MimeKit 2.0.7 + +* Fixed a bug in the UUEncoder. +* Fixed a bug in MimeIterator.MoveTo(). +* Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single + child. (issue #441) +* Modified TnefPart to no longer set the name parameter on the Content-Type header of + extracted message bodies. (issue #435) +* Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file + sharing violations if the application already has that file opened elsewhere. (issue #426) +* Improved address parser to handle "local-part (User Name)" style addresses. +* Updated the iOS and Android BouncyCastle dependency to 1.8.3. +* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442) +* Fixed WindowsSecureMimeContext.EncapsulatedSign (CmsSigner, ...) and Sign (CmsSigner, ...). +* Added SecureMimeContext.Import(string, string) to import passworded pk12 files. +* Improved MimeParser's support of Content-Length. +* Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the + stream does not have properly formatted headers. (issue #443) +* Added support for message/global. + ### MimeKit 2.0.6 * Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions diff --git a/appveyor.yml b/appveyor.yml index 25ce00a876..ff9c882401 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.6.{build} +version: 2.0.7.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 619cf4ab98..6255dff049 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.6 + 2.0.7 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,10 +25,20 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions given an incomplete address like "Name <". (issue #421) -* Fixed support for parsing mbox files using Content-Length. -* Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to iso-8859-1. (issue #417) -* Minor optimizations. +* Fixed a bug in the UUEncoder. +* Fixed a bug in MimeIterator.MoveTo(). +* Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single child. (issue #441) +* Modified TnefPart to no longer set the name parameter on the Content-Type header of extracted message bodies. (issue #435) +* Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file sharing violations if the application already has that file opened elsewhere. (issue #426) +* Improved address parser to handle "local-part (User Name)" style addresses. +* Updated the iOS and Android BouncyCastle dependency to 1.8.3. +* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442) +* Fixed WindowsSecureMimeContext.EncapsulatedSign (CmsSigner, ...) and Sign (CmsSigner, ...). +* Added SecureMimeContext.Import(string, string) to import passworded pk12 files. +* Improved MimeParser's support of Content-Length. +* Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the + stream does not have properly formatted headers. (issue #443) +* Added support for message/global. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 30806c9928..d74c530066 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.6 + 2.0.7 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,10 +25,17 @@ An Open Source library for creating and parsing MIME messages. -* Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions given an incomplete address like "Name <". (issue #421) -* Fixed support for parsing mbox files using Content-Length. -* Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to iso-8859-1. (issue #417) -* Minor optimizations. +* Fixed a bug in the UUEncoder. +* Fixed a bug in MimeIterator.MoveTo(). +* Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single child. (issue #441) +* Modified TnefPart to no longer set the name parameter on the Content-Type header of extracted message bodies. (issue #435) +* Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file sharing violations if the application already has that file opened elsewhere. (issue #426) +* Improved address parser to handle "local-part (User Name)" style addresses. +* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442) +* Improved MimeParser's support of Content-Length. +* Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the + stream does not have properly formatted headers. (issue #443) +* Added support for message/global. Xamarin Inc. en-US From 239a4570b2e9e2f1367c7215b99529a51de416dc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 28 Oct 2018 13:06:28 -0400 Subject: [PATCH 138/741] Fixed the build for PCL --- MimeKit/Cryptography/SecureMimeContext.cs | 2 ++ UnitTests/Utils/StringBuilderExtensionTests.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 9e78ac1d59..3aa18675b2 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -719,6 +719,7 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute () /// public abstract void Import (Stream stream, string password); +#if !PORTABLE /// /// Imports certificates and keys from a pkcs12 file. /// @@ -767,6 +768,7 @@ public virtual void Import (string fileName, string password) using (var stream = File.OpenRead (fileName)) Import (stream, password); } +#endif /// /// Imports the specified certificate. diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index edbde78b5d..9fa7e12050 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -73,6 +73,7 @@ public void TestAppendFoldedWithQuotedString () Assert.AreEqual (40, lineLength); } +#if DEBUG [Test] public void TestAppendCStringByte () { @@ -84,5 +85,6 @@ public void TestAppendCStringByte () Assert.AreEqual (expected, builder.ToString ()); } +#endif } } From 3a6a114be7f8b83ad80890774cfe694afe68657f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 28 Oct 2018 13:34:56 -0400 Subject: [PATCH 139/741] Updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 7 ++++--- samples/DkimVerifier/DkimVerifier/app.config | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 4 ++-- .../MessageReader.Android/MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/App.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 6 +++--- samples/MessageReader/MessageReader/packages.config | 4 ++-- 10 files changed, 21 insertions(+), 20 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index d29cde6ce4..4691437a85 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -29,11 +29,11 @@ x86 - - ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + + ..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.6\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.7\lib\net45\MimeKit.dll @@ -49,6 +49,7 @@ + diff --git a/samples/DkimVerifier/DkimVerifier/app.config b/samples/DkimVerifier/DkimVerifier/app.config index 9a06ca7746..91378490c0 100644 --- a/samples/DkimVerifier/DkimVerifier/app.config +++ b/samples/DkimVerifier/DkimVerifier/app.config @@ -4,7 +4,7 @@ - + diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 8defaa2e3c..d8b404ebe4 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -1,6 +1,6 @@  - + - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index df9377d477..d28287dd16 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -55,11 +55,11 @@ False - - ..\packages\MimeKit.2.0.6\lib\monoandroid\BouncyCastle.dll + + ..\packages\MimeKit.2.0.7\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.0.6\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.0.7\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 4bfd8bcc0a..7dfdf1d07c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 1157d85b67..b46a92d839 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -67,11 +67,11 @@ Default - - ..\packages\MimeKit.2.0.6\lib\xamarinios\BouncyCastle.dll + + ..\packages\MimeKit.2.0.7\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.0.6\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.0.7\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 2b285ead1f..477682d55b 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/App.config b/samples/MessageReader/MessageReader/App.config index 36809fb5bf..f62b55466a 100644 --- a/samples/MessageReader/MessageReader/App.config +++ b/samples/MessageReader/MessageReader/App.config @@ -7,7 +7,7 @@ - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 3ff3c3e774..32b5d20f29 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -32,11 +32,11 @@ 4 - - ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + + ..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.0.6\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.0.7\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index f154bb75ca..6e7302803e 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From 8649d91acd911c1774c7205c34df4a6bb3125916 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 29 Oct 2018 11:19:40 -0400 Subject: [PATCH 140/741] Linkified ReleaseNotes issues --- ReleaseNotes.md | 218 ++++++++++++++++++++++++------------------------ 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 75cd32d755..3e172a1a60 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -5,36 +5,36 @@ * Fixed a bug in the UUEncoder. * Fixed a bug in MimeIterator.MoveTo(). * Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single - child. (issue #441) + child. (issue [#441](https://github.com/jstedfast/MimeKit/issues/441)) * Modified TnefPart to no longer set the name parameter on the Content-Type header of - extracted message bodies. (issue #435) + extracted message bodies. (issue [#435](https://github.com/jstedfast/MimeKit/issues/435)) * Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file - sharing violations if the application already has that file opened elsewhere. (issue #426) + sharing violations if the application already has that file opened elsewhere. (issue [#426](https://github.com/jstedfast/MimeKit/issues/426)) * Improved address parser to handle "local-part (User Name)" style addresses. * Updated the iOS and Android BouncyCastle dependency to 1.8.3. -* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442) +* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue [#442](https://github.com/jstedfast/MimeKit/issues/442)) * Fixed WindowsSecureMimeContext.EncapsulatedSign (CmsSigner, ...) and Sign (CmsSigner, ...). * Added SecureMimeContext.Import(string, string) to import passworded pk12 files. * Improved MimeParser's support of Content-Length. * Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the - stream does not have properly formatted headers. (issue #443) + stream does not have properly formatted headers. (issue [#443](https://github.com/jstedfast/MimeKit/issues/443)) * Added support for message/global. ### MimeKit 2.0.6 * Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions - given an incomplete address like "Name <". (issue #421) + given an incomplete address like "Name <". (issue [#421](https://github.com/jstedfast/MimeKit/issues/421)) * Fixed support for parsing mbox files using Content-Length. * Modified the TextPart.Text getter property to check for a UTF-16 BOM and use an appropriate UTF-16 System.Text.Encoding if found instead of simply assuming UTF-8 and falling back to - iso-8859-1. (issue #417) + iso-8859-1. (issue [#417](https://github.com/jstedfast/MimeKit/issues/417)) * Minor optimizations. ### MimeKit 2.0.5 -* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue #710) -* Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue #404) -* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue #725) +* Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue [#710](https://github.com/jstedfast/MailKit/issues/710)) +* Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue [#404](https://github.com/jstedfast/MimeKit/issues/404)) +* Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue [#725](https://github.com/jstedfast/MailKit/issues/725)) ### MimeKit 2.0.4 @@ -43,24 +43,24 @@ in the Efail document published in May of 2018. Clients that wish to continue automatic downloads of S/MIME CRLs can manually set the property to `true`. * Properly wrap long mailbox names with quoted phrases. -* Fixed parsing of header blocks that span across read boundaries. (issue #395) -* Added FormatOptions.EnsureNewLine property (MailKit issue #251) -* Enable System.Net.Mail support for .NET Core 2.0. (issue #393) +* Fixed parsing of header blocks that span across read boundaries. (issue [#395](https://github.com/jstedfast/MimeKit/issues/395)) +* Added FormatOptions.EnsureNewLine property (MailKit issue [#251](https://github.com/jstedfast/MailKit/issues/251)) +* Enable System.Net.Mail support for .NET Core 2.0. (issue [#393](https://github.com/jstedfast/MimeKit/issues/393)) ### MimeKit 2.0.3 -* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue #391) +* Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue [#391](https://github.com/jstedfast/MimeKit/issues/391)) * Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. -* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue #385) +* Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue [#385](https://github.com/jstedfast/MimeKit/issues/385)) ### MimeKit 2.0.2 -* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue #649) -* Added a record for .epub to the MimeTypes database. (issue #376) -* Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature(). (issue #374) +* IDN encode/decode the local part of mailbox addresses as well. (MailKit issue [#649](https://github.com/jstedfast/MailKit/issues/649)) +* Added a record for .epub to the MimeTypes database. (issue [#376](https://github.com/jstedfast/MimeKit/issues/376)) +* Explicitly pass 'false' as the silent argument to SignedCms.ComputeSignature(). (issue [#374](https://github.com/jstedfast/MimeKit/issues/374)) * Make sure the MimeParser does not hang if the last header line is truncated before CRLF. -* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue #370) -* Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue #367) +* Don't use Encoder/DecoderExceptionFallbacks in the TNEF reader. (issue [#370](https://github.com/jstedfast/MimeKit/issues/370)) +* Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue [#367](https://github.com/jstedfast/MimeKit/issues/367)) * Fixed TemporarySecureMimeContext to key off the certificate's fingerprint. ### MimeKit 2.0.1 @@ -98,13 +98,13 @@ ### MimeKit 1.22.0 -* Fixed a buffering bug in MimeParser's header parser. (issue #358) -* Set the TnefReader charset on extracted text/plain and text/html bodies. (issue #357) +* Fixed a buffering bug in MimeParser's header parser. (issue [#358](https://github.com/jstedfast/MimeKit/issues/358)) +* Set the TnefReader charset on extracted text/plain and text/html bodies. (issue [#357](https://github.com/jstedfast/MimeKit/issues/357)) * Added safeguard to protect against malformed nested group addresses which could cause a stack overflow in the parser. ParserOptions now has a way of limiting the recursive - depth of rfc822 group addresses using the MaxAddressGroupDepth property. (issue #355) + depth of rfc822 group addresses using the MaxAddressGroupDepth property. (issue [#355](https://github.com/jstedfast/MimeKit/issues/355)) * Fixed the S/MIME certificate database for .NETStandard by using GetFieldValue() instead - of GetBytes() which is not supported on .NETStandard. (issue #351) + of GetBytes() which is not supported on .NETStandard. (issue [#351](https://github.com/jstedfast/MimeKit/issues/351)) ### MimeKit 1.20.0 @@ -114,16 +114,16 @@ * Removed methods marked [Obsolete] (which have been marked obsolete for several years now). * Improved performance of writing messages by a small amount. * Fixed SecureMimeDigitalSignature to capture the signature digest algorithm used by the sending - client. (issue #341) + client. (issue [#341](https://github.com/jstedfast/MimeKit/issues/341)) * Fixed the S/MIME decoder to correctly determine the RC2 algorithm used by the sending client. - (issue #337) + (issue [#337](https://github.com/jstedfast/MimeKit/issues/337)) * Fixed a bug in BoundStream.Seek(). ### MimeKit 1.18.1 * Added CanSign() and CanEncrypt() methods to CryptographyContext for checking - whether or not a mailbox can be used for signing or be encrypted to. (issue #325) -* Automatically register the CodePagesEncodingProvider when running on .NETStandard. (issue #330) + whether or not a mailbox can be used for signing or be encrypted to. (issue [#325](https://github.com/jstedfast/MimeKit/issues/325)) +* Automatically register the CodePagesEncodingProvider when running on .NETStandard. (issue [#330](https://github.com/jstedfast/MimeKit/issues/330)) * Fixed MimeMessage.TextBody to return null when the top-level MIME part is a TextPart marked as an attachment. * Fixed the HtmlToHtml converter to suppress comments if the HtmlTagContext's SuppressInnerContent @@ -131,23 +131,23 @@ * Documented OpenPgpContext.GenerateKeyPair() which was added in 1.18.0. * Added OpenPgpContext.Delete() methods to delete public and secret keyrings. * Added OpenPgpContext.SignKey(). -* Remove "Version:" header from armored OpenPGP output. (issue #319) +* Remove "Version:" header from armored OpenPGP output. (issue [#319](https://github.com/jstedfast/MimeKit/issues/319)) ### MimeKit 1.18.0 -* Allow importing of known PGP keys (needed when re-importing keys after signing them). (issue #315) +* Allow importing of known PGP keys (needed when re-importing keys after signing them). (issue [#315](https://github.com/jstedfast/MimeKit/issues/315)) * Added APIs to enumerate public and secret PGP keys. * Added an OpenPgpDetectionFilter to detect OpenPGP blocks and their stream offsets. * Added a MimeMessage.WriteTo() overload that takes a bool headersOnly argument. * Pushed SecureMimeContext's EncryptionAlgorithm preferences down into CryptographyContext. * Updated GnuPGContext to load algorithm preferences from gpg.conf. * Fixed TemporarySecureMimeContext to use the fingerprint in the certificate lookup methods - when the MailboxAddress argument is a SecureMailboxAddress. (issue #322) -* Fall back to using the Subject Alternative Rfc822 Name if the SubjectEmailAddress fails. (issue #323) + when the MailboxAddress argument is a SecureMailboxAddress. (issue [#322](https://github.com/jstedfast/MimeKit/issues/322)) +* Fall back to using the Subject Alternative Rfc822 Name if the SubjectEmailAddress fails. (issue [#323](https://github.com/jstedfast/MimeKit/issues/323)) ### MimeKit 1.16.2 -* Fixed a bug in the MailMessage to MimeMessage conversion which corrupted the Subject string. (issue #306) +* Fixed a bug in the MailMessage to MimeMessage conversion which corrupted the Subject string. (issue [#306](https://github.com/jstedfast/MimeKit/issues/306)) * If no KeyUsage extension exists for an X509 certificate, assume no restrictions on key usage. * Throw an exception if there is a problem building an X509 certificate chain when verifying S/MIME signatures. @@ -155,9 +155,9 @@ ### MimeKit 1.16.1 * Fixed TextToHtml and FlowedToHtml's OutputHtmlFragment property to work. -* Fixed EncodeAddrspec and DecodeAddrspec to handle string.Empty. (issue #302) -* Allow string.Empty as a valid addrspec for MailboxAddress. (issue #302) -* Catch exceptions trying to import CRLs and Certs when verifying S/MIME signatures. (issue #304) +* Fixed EncodeAddrspec and DecodeAddrspec to handle string.Empty. (issue [#302](https://github.com/jstedfast/MimeKit/issues/302)) +* Allow string.Empty as a valid addrspec for MailboxAddress. (issue [#302](https://github.com/jstedfast/MimeKit/issues/302)) +* Catch exceptions trying to import CRLs and Certs when verifying S/MIME signatures. (issue [#304](https://github.com/jstedfast/MimeKit/issues/304)) ### MimeKit 1.16.0 @@ -176,12 +176,12 @@ header. * Added automatic key retrieval functionality for the GnuPG crypto context. * Added a virtual DigestSigner property to DkimSigner so that consumers can hook into services - such as Azure. (issue #296) + such as Azure. (issue [#296](https://github.com/jstedfast/MimeKit/issues/296)) * Fixed a bug in the MimeFilterBase.SaveRemainingInput() logic. * Preserve munged From-lines at the start of message/rfc822 parts. * Map code page 50220 to iso-2022-jp. * Format Reply-To and Sender headers as address headers when using Header.SetValue(). -* Fixed MimeMessage.CreateFromMailMessage() to set MimeVersion. (issue #290) +* Fixed MimeMessage.CreateFromMailMessage() to set MimeVersion. (issue [#290](https://github.com/jstedfast/MimeKit/issues/290)) ### MimeKit 1.12.0 @@ -193,24 +193,24 @@ mailbox and group addresses. * Added support for CryptographyContext factories by adding new Register() methods that take function callbacks that return a SecureMimeContext or OpenPgpContext. Thanks to - Christoph Enzmann for this feature. (issue #283) + Christoph Enzmann for this feature. (issue [#283](https://github.com/jstedfast/MimeKit/issues/283)) * Fixed DefaultSecureMimeContext..cctor() to not call Directory.CreateDirectory() on the default database directory. Instead, let the .ctor() create it instead if and when - an instance of the DefaultSecureMimeContext is created. (issue #285) + an instance of the DefaultSecureMimeContext is created. (issue [#285](https://github.com/jstedfast/MimeKit/issues/285)) * Store DBNull in S/MIME SQL backends for null values (SQLite handles `null` but - databases such as Postgres do not). (issue #286) + databases such as Postgres do not). (issue [#286](https://github.com/jstedfast/MimeKit/issues/286)) ### MimeKit 1.10.1 * Fixed the Content-Type and Content-Disposition parameter parser to remove trailing lwsp from - unquoted parameter values. (issue #278) + unquoted parameter values. (issue [#278](https://github.com/jstedfast/MimeKit/issues/278)) * Fixed MimePart.WriteTo() to not necessarily force the content to end with a new-line. ### MimeKit 1.10.0 * Fixed OpenPgpContext.Verify() to throw FormatException if no data packets found. -* Added new MailboxAddress constructors that do not take a 'name' argument. (issue #267) -* Added an HtmlToHtml.FilterComments property to remove comments. (issue #271) +* Added new MailboxAddress constructors that do not take a 'name' argument. (issue [#267](https://github.com/jstedfast/MimeKit/issues/267)) +* Added an HtmlToHtml.FilterComments property to remove comments. (issue [#271](https://github.com/jstedfast/MimeKit/issues/271)) * Modified address parser to handle invalid addresses like "user@example.com ". ### MimeKit 1.8.0 @@ -227,7 +227,7 @@ ### MimeKit 1.4.2 * Strong-name the .NET Core assemblies. -* Fixed logic for selecting certificates from the Windows X.509 Store. (issue #262) +* Fixed logic for selecting certificates from the Windows X.509 Store. (issue [#262](https://github.com/jstedfast/MimeKit/issues/262)) ### MimeKit 1.4.1 @@ -243,32 +243,32 @@ * Added support for .NET Core 1.0 * Changed the default value of FormatOptions.AllowMixedHeaderCharsets to false. -* Added a new DkimSigner .ctor that takes a stream of key data. (issue #255) +* Added a new DkimSigner .ctor that takes a stream of key data. (issue [#255](https://github.com/jstedfast/MimeKit/issues/255)) ### MimeKit 1.2.25 -* Fixed parsing bugs in MessageDeliveryStatus.StatusGroups. (issue #253) -* Fixed MimeParser.ParseHeaders() to handle header blocks that do not end with a blank line. (issue #250) +* Fixed parsing bugs in MessageDeliveryStatus.StatusGroups. (issue [#253](https://github.com/jstedfast/MimeKit/issues/253)) +* Fixed MimeParser.ParseHeaders() to handle header blocks that do not end with a blank line. (issue [#250](https://github.com/jstedfast/MimeKit/issues/250)) * Fixed the MailboxAddress parser to handle whitespace between '<' and the addr-spec. -* Fixed TemporarySecureMimeContext to handle certificates with null email addresses. (issue #252) +* Fixed TemporarySecureMimeContext to handle certificates with null email addresses. (issue [#252](https://github.com/jstedfast/MimeKit/issues/252)) ### MimeKit 1.2.24 -* Modified MimeMessage .ctor to not add an empty To: header by default. (issue #241) +* Modified MimeMessage .ctor to not add an empty To: header by default. (issue [#241](https://github.com/jstedfast/MimeKit/issues/241)) * Modified MimeMessage to remove address headers when all addresses in that field are removed. * Properly apply SecurityCriticalAttribute to GetObjectData() on custom Exceptions. * Fixed TnefPropertyReader to convert APPTIME values into DateTimes from the OLE Automation - Date format. (issue #245) + Date format. (issue [#245](https://github.com/jstedfast/MimeKit/issues/245)) ### MimeKit 1.2.23 -* Modified ParamaterList.TryParse() to handle quoted rfc2231-encoded param values. (issue #239) +* Modified ParamaterList.TryParse() to handle quoted rfc2231-encoded param values. (issue [#239](https://github.com/jstedfast/MimeKit/issues/239)) * Updated to reference BouncyCastle via NuGet packages rather than bundling the assemblies. * Fixed MimeParser to set a multipart's raw epilogue to null instead of an empty byte array. Fixes some issues with digital signature verification (as well as DKIM verification). * Added an HtmlWriter.WriteText() override with Console.WriteLine() style params. * Added convenience MimeMessage property for the X-Priority header. -* Fixed MimeMessage.ConvertFromMailMessage() to use appropriate MimeEntity subclasses. (issue #232) +* Fixed MimeMessage.ConvertFromMailMessage() to use appropriate MimeEntity subclasses. (issue [#232](https://github.com/jstedfast/MimeKit/issues/232)) ### MimeKit 1.2.22 @@ -287,19 +287,19 @@ ### MimeKit 1.2.21 * Added a MultipartReport class for multipart/report. -* Fixed serialization for embedded message/* parts. (issue #228) +* Fixed serialization for embedded message/* parts. (issue [#228](https://github.com/jstedfast/MimeKit/issues/228)) * Fixed MimeMessage.WriteTo() to only make sure that the stream ends with a newline if it - wasn't parsed. (issue #227) + wasn't parsed. (issue [#227](https://github.com/jstedfast/MimeKit/issues/227)) * Fixed MimeMessage to only set a MIME-Version if the message was not produced by the parser. * Ignore timezones outside the range of -1200 to +1400. * Added InternetAddress.Clone() to allow addresses to be cloned. * Properly serialize message/rfc822 parts that contain an mbox marker. -* Fixed MimeMessage.DkimSign() to not enforce 7bit encoding of the body. (issue #224) +* Fixed MimeMessage.DkimSign() to not enforce 7bit encoding of the body. (issue [#224](https://github.com/jstedfast/MimeKit/issues/224)) * Fixed ParameterList.IndexOf(string) to be case insensitive. ### MimeKit 1.2.20 -* Fixed serialization of mime parts with empty content. (issue #221) +* Fixed serialization of mime parts with empty content. (issue [#221](https://github.com/jstedfast/MimeKit/issues/221)) * Fixed a bug in the TnefPropertyReader that would break when not all properties were read by the consumer of the API. * Fixed the InternetAddress parser to throw a more informative error when parsing broken @@ -310,7 +310,7 @@ * Fixed HtmlUtils.HtmlAttributeEncode() to properly encode non-ascii characters as entities. * Fixed HtmlUtils.HtmlEncode() to properly encode non-ascii characters as entities. * Fixed MimeParser to track whether or not each multipart had an end boundary so that - when they get reserialized, they match the original. (issue #218) + when they get reserialized, they match the original. (issue [#218](https://github.com/jstedfast/MimeKit/issues/218)) * Implemented an optimized OrdinalIgnoreCase string comparer which improves the performance of the MimeParser slightly. * Fixed QuotedPrintableDecoder to properly handle "==" sequences. @@ -321,8 +321,8 @@ ### MimeKit 1.2.19 -* Handle illegal Content-Id headers that do not enclose their values in <>'s. (issue #215) -* Fixed reserialization of MimeParts with empty content. (issue #213) +* Handle illegal Content-Id headers that do not enclose their values in <>'s. (issue [#215](https://github.com/jstedfast/MimeKit/issues/215)) +* Fixed reserialization of MimeParts with empty content. (issue [#213](https://github.com/jstedfast/MimeKit/issues/213)) * Improved parsing logic for malformed Content-Type headers. * Fixed HtmlTokenizer to work properly when some closing tags were not lowercase. * Bumped Bouncy Castle to v1.8.1. @@ -332,48 +332,48 @@ * Removed unimplemented TNEF APIs. * Use DateTime.UtcNow for S/MIME certificate validity checks. * Added ToString() methods on ContentType/Disposition that take FormatOptions. -* Added a new ToString() method to InternetAddress that takes a FormatOptions. (issue #208) -* Added a MimeEntity.WriteTo() method that takes a bool contentOnly parameter. (issue #207) +* Added a new ToString() method to InternetAddress that takes a FormatOptions. (issue [#208](https://github.com/jstedfast/MimeKit/issues/208)) +* Added a MimeEntity.WriteTo() method that takes a bool contentOnly parameter. (issue [#207](https://github.com/jstedfast/MimeKit/issues/207)) * Added support for encoding parameter values using rfc2047 encoded-words instead of the standard rfc2231 encoding. * Fixed SecureMailboxAddress's Fingerprint property to work with both the PGP key ID - *and* the fingerprint. Previously only worked with the PGP key id. (issue #203) -* Added GroupAddress.Parse() and MailboxAddress.Parse() methods. (issue #197) -* Set a default filename when generating application/pgp-signature parts. (issue #195) + *and* the fingerprint. Previously only worked with the PGP key id. (issue [#203](https://github.com/jstedfast/MimeKit/issues/203)) +* Added GroupAddress.Parse() and MailboxAddress.Parse() methods. (issue [#197](https://github.com/jstedfast/MimeKit/issues/197)) +* Set a default filename when generating application/pgp-signature parts. (issue [#195](https://github.com/jstedfast/MimeKit/issues/195)) ### MimeKit 1.2.17 * Fixed DkimRelaxedBodyFilter to properly handle CRLF split across buffers. * Added ContentType.IsMimeType method to replace CongtentType.Matches. * Added S/MIME, PGP and DKIM support to the PCL and WindowsUniversal versions of MimeKit. -* Fixed PGP key expiration calculation when encrypting. (issue #194) +* Fixed PGP key expiration calculation when encrypting. (issue [#194](https://github.com/jstedfast/MimeKit/issues/194)) ### MimeKit 1.2.16 -* Fixed relaxed body canonicalization logic for DKIM signatures. (issue #190) +* Fixed relaxed body canonicalization logic for DKIM signatures. (issue [#190](https://github.com/jstedfast/MimeKit/issues/190)) ### MimeKit 1.2.15 * Fixed the Date parser to catch exceptions thrown by the DateTimeOffset .ctor if any of the fields are out of range. -* Fixed logic for trimming trailing blank lines for the DKIM relaxed body algorithm. (issue #187) -* Fixed DKIM body filters to reserve extra space in the output buffer. (issue #188) +* Fixed logic for trimming trailing blank lines for the DKIM relaxed body algorithm. (issue [#187](https://github.com/jstedfast/MimeKit/issues/187)) +* Fixed DKIM body filters to reserve extra space in the output buffer. (issue [#188](https://github.com/jstedfast/MimeKit/issues/188)) * Allow specifying a charset encoding for each Content-Type/Disposition parameter. ### MimeKit 1.2.14 * Fixed DKIM-Signature signing logic to use a UTC-based timestamp value rather than a - timestamp based on the local-time. (issue #180) + timestamp based on the local-time. (issue [#180](https://github.com/jstedfast/MimeKit/issues/180)) * Fixed Multipart epilogue parsing and serialization logic to make sure that serializing a multipart is properly byte-for-byte identical to the original text. This fixes a corner-case that affected all types of digital signatures (DKIM, PGP, and S/MIME) - spanning across nested multiparts. (issue #181) + spanning across nested multiparts. (issue [#181](https://github.com/jstedfast/MimeKit/issues/181)) * Fixed MimeMessage.WriteTo() to ensure that the output stream always ends with a new-line. ### MimeKit 1.2.13 * Modified Base64Encoder's .ctor to allow specifying a maxLineLength. -* Fixed DKIM signing logic for multipart/alternative messages. (issue #178) +* Fixed DKIM signing logic for multipart/alternative messages. (issue [#178](https://github.com/jstedfast/MimeKit/issues/178)) ### MimeKit 1.2.12 @@ -381,32 +381,32 @@ ### MimeKit 1.2.11 -* Fixed an IndexOutOfRangeException bug in the TextToHTML converter logic. (issue #165) +* Fixed an IndexOutOfRangeException bug in the TextToHTML converter logic. (issue [#165](https://github.com/jstedfast/MimeKit/issues/165)) * Fixed the DKIM-Signature verification logic to be more lenient in parsing DKIM-Signature - headers. (issue #166) + headers. (issue [#166](https://github.com/jstedfast/MimeKit/issues/166)) * Fixed the DKIM-Signature verification logic to error-out if the h= parameter does not - include the From header. (issue #167) + include the From header. (issue [#167](https://github.com/jstedfast/MimeKit/issues/167)) * Fixed the DKIM-Signature verification logic to make sure that the domain-name in the i= - param matches (or is a subdomain of) the d= value. (issue #169) + param matches (or is a subdomain of) the d= value. (issue [#169](https://github.com/jstedfast/MimeKit/issues/169)) * Fixed the CharsetFilter to avoid calling Convert() on empty input. * Fixed logic for canonicalizing header values using the relaxed DKIM algorithm. - (issue #171) + (issue [#171](https://github.com/jstedfast/MimeKit/issues/171)) * Fixed AttachmentCollection to mark embedded parts as inline instead of attachment. * Fixed the DKIM-Signature logic (both signing and verifying) to properly canonicalize the - body content. (issue #172) + body content. (issue [#172](https://github.com/jstedfast/MimeKit/issues/172)) ### MimeKit 1.2.10 * Added public Stream property to IContentObject. * Implemented a better fix for illegal unquoted multi-line Content-Type and - Content-Disposition parameter values. (issue #159) + Content-Disposition parameter values. (issue [#159](https://github.com/jstedfast/MimeKit/issues/159)) * Fixed the UrlScanner to properly handle "ftp." at the very end of the message text. - (issue #161) + (issue [#161](https://github.com/jstedfast/MimeKit/issues/161)) * Fixed charset handling logic to not override charset aliases already in the cache. ### MimeKit 1.2.9 -* Fixed WriteTo(string fileName) methods to overwrite the existing file. (issue #154) +* Fixed WriteTo(string fileName) methods to overwrite the existing file. (issue [#154](https://github.com/jstedfast/MimeKit/issues/154)) * Updated InternetAddressList to implement IComparable. * Fixed DKIM-Signature generation and verification. * Added support for Message-Id headers that do not properly use encapsulate the value @@ -431,12 +431,12 @@ ### MimeKit 1.2.6 * Fixed a bug in the HTML tokenizer to handle some weird HTML created by Outlook 15.0. -* Added CmsRecipient .ctor overloads that accept X509Certificate2. (issue #149) +* Added CmsRecipient .ctor overloads that accept X509Certificate2. (issue [#149](https://github.com/jstedfast/MimeKit/issues/149)) ### MimeKit 1.2.5 * Changed BodyParts and Attachments to be IEnumerable - - WARNING! This is an API change! (issue #148) + WARNING! This is an API change! (issue [#148](https://github.com/jstedfast/MimeKit/issues/148)) * Moved the IsAttachment property from MimePart down into MimeEntity. * Added MimeMessage.Importance and MimeMessage.Priority properties. * Vastly improved the HtmlToHtml text converter with a w3 compliant @@ -448,14 +448,14 @@ * Improved error handling for Encoding.GetEncoding() in CharsetFilter constructors. * Fixed buffering in the HTML parser. * Fixed Windows and Temporary S/MIME contexts to use case-insensitive address - comparisons like the other backends do. (issue #146). + comparisons like the other backends do. (issue [#146](https://github.com/jstedfast/MimeKit/issues/146)). * Added HeaderList.LastIndexOf() convenience methods. * Added a new Prepare() method to prepare a message or entity for transport and/or signing (used by MultipartSigned and MailKit.SmtpClient) to reduce duplicated code. * Fixed FilteredStream.Flush() to flush filters even when no data has been written. -* Fixed the ChainedStream.Read() logic. (issue #143) +* Fixed the ChainedStream.Read() logic. (issue [#143](https://github.com/jstedfast/MimeKit/issues/143)) * Added EncoderFilter and DecoderFilter.Create() overloads that take an encoding name (string). * HeaderList.WriteTo() now adds a blank line to the end of the output instead @@ -488,19 +488,19 @@ * Fixed the HtmlToHtml converter to properly handle HTML text that begins with leading text data. * Fixed MimeParser.ParseHeaders() to handle input that does not end with a - blank line. (issue #142) + blank line. (issue [#142](https://github.com/jstedfast/MimeKit/issues/142)) * Renamed MimeEntityConstructorInfo to MimeEntityConstructorArgs. * Modified the MimeParser to use TextPart to represent application/rtf. ### MimeKit 1.2.0 -* Force the use of the rfc2047 "B" encoding for ISO-2022-JP. (issue #139) +* Force the use of the rfc2047 "B" encoding for ISO-2022-JP. (issue [#139](https://github.com/jstedfast/MimeKit/issues/139)) * Added some text converters to convert between various text formats including format=flowed and HTML. ### MimeKit 1.0.15 -* Fixed MimeMessage.WriteTo() to be thread-safe. (issue #138) +* Fixed MimeMessage.WriteTo() to be thread-safe. (issue [#138](https://github.com/jstedfast/MimeKit/issues/138)) ### MimeKit 1.0.14 @@ -510,20 +510,20 @@ * Fixed TextPart.GetText() to protect against NullReferenceExceptions if the ContentObject is null. * Fixed MimeFilterBase.EnsureOutputSize() to initialize OutputBuffer if it is - null. Prevents NullReferenceExceptions in obscure corner cases. (issue #135) + null. Prevents NullReferenceExceptions in obscure corner cases. (issue [#135](https://github.com/jstedfast/MimeKit/issues/135)) * Added a TnefAttachFlags enum which is used to determine if image attachments in MS-TNEF data are meant to have a Content-Disposition of "inline" when - extracted as MIME attachments. (issue #129) + extracted as MIME attachments. (issue [#129](https://github.com/jstedfast/MimeKit/issues/129)) * Fixed TnefPart.ConvertToMessage() and ExtractAttachments() to use the PR_ATTACH_MIME_TAG property to determine the intended mime-type for extracted attachments. * Catch DecoderFallbackExceptions in MimeMessage.ToString() and fall back to - Latin1. (issue #137) + Latin1. (issue [#137](https://github.com/jstedfast/MimeKit/issues/137)) ### MimeKit 1.0.13 * Added a work-around for a bug in Thunderbird's multipart/related implementation. - (issue #124) + (issue [#124](https://github.com/jstedfast/MimeKit/issues/124)) * Improved MimeMessage.CreateFromMailMessage() a bit more to avoid creating empty From, Reply-To, To, Cc and/or Bcc headers. * Modified the HeaderIdExtensions to only be available for the HeaderId enum values. @@ -531,12 +531,12 @@ ### MimeKit 1.0.12 * Modified InternetAddressList.Equals() to return true if the lists contain the same - addresses even if they are in different orders. (issue #118) + addresses even if they are in different orders. (issue [#118](https://github.com/jstedfast/MimeKit/issues/118)) * Allow S/MIME certificates with the NonRepudiation key usage to be used for signing. - (issue #119) + (issue [#119](https://github.com/jstedfast/MimeKit/issues/119)) * Don't change the Content-Transfer-Encoding of MIME parts being encrypted as part of - a multipart/encrypted. (issue #122) -* Fixed logic to decide if a PGP secret key is expired. (issue #120) + a multipart/encrypted. (issue [#122](https://github.com/jstedfast/MimeKit/issues/122)) +* Fixed logic to decide if a PGP secret key is expired. (issue [#120](https://github.com/jstedfast/MimeKit/issues/120)) * Added support for SecureMailboxAddresses to OpenPgpContext to allow key lookups by fingerprints instead of email addresses. @@ -544,28 +544,28 @@ * Added the ContentDisposition.FormData string constant. * Allow the ContentDisposition.Disposition property to be set to values other than - "attachment" and "inline". (issue #112) + "attachment" and "inline". (issue [#112](https://github.com/jstedfast/MimeKit/issues/112)) * Shortened the length of the local-part of auto-generated Message-Ids. * Fixed MimeMessage.CreateFromMailMessage() to not duplicate From/To/Cc/etc addresses if the System.Net.Mail.MailMessage has been sent via System.Net.Mail.SmtpClient - prior to calling MimeMessage.CreateFromMailMessage(). (issue #115) + prior to calling MimeMessage.CreateFromMailMessage(). (issue [#115](https://github.com/jstedfast/MimeKit/issues/115)) * When parsing S/MIME digital signatures, don't import the full certificate chain. - (issue #110) + (issue [#110](https://github.com/jstedfast/MimeKit/issues/110)) * Added immutability-friendly .ctor to MimeMessage for use with languages such as F#. - (issue #116) + (issue [#116](https://github.com/jstedfast/MimeKit/issues/116)) ### MimeKit 1.0.10 * Ignore semi-colons in Content-Transfer-Encoding headers to work around broken mailers. * Added ParserOptions.ParameterComplianceMode (defaults to RfcComoplianceMode.Loose) which works around unquoted parameter values in Content-Type and Content-Disposition - headers. (issue #106) + headers. (issue [#106](https://github.com/jstedfast/MimeKit/issues/106)) * Modified the MimeParser to handle whitespace between header field names and the ':'. * Probe to make sure that various System.Text.Encodings are available before adding aliases for them (some may not be available depending on the platform). * Added a MimePart.GetBestEncoding() overload that takes a maxLineLength argument. * Modified MultipartSigned to use 78 characters as the max line length rather than 998 - characters. (issue #107) + characters. (issue [#107](https://github.com/jstedfast/MimeKit/issues/107)) ### MimeKit 1.0.9 @@ -583,7 +583,7 @@ * Renamed MimeUtils.TryParseVersion() to MimeUtils.TryParse() (the old API still exists but has been marked [Obsolete]). * Fixed S/MIME support to gracefully deal with badly formatted signature timestamps - which incrorectly use leap seconds. (issue #103) + which incrorectly use leap seconds. (issue [#103](https://github.com/jstedfast/MimeKit/issues/103)) ### MimeKit 1.0.7 @@ -591,9 +591,9 @@ * When decrypting PGP data, iterate over all encrypted packets to find one that can be decrypted (i.e. the private key exists in the user's keychain). * Updated WindowsSecureMimeContext to respect SecureMailboxAddresses like the - other backends. (issue #100) + other backends. (issue [#100](https://github.com/jstedfast/MimeKit/issues/100)) * Added a Pkcs9SigningTime attribute to the CmsSigner for WindowsSecureMimeContext. - (issue #101) + (issue [#101](https://github.com/jstedfast/MimeKit/issues/101)) ### MimeKit 1.0.6 @@ -619,18 +619,18 @@ Note: If you are not yet ready to port your iOS application to the Unified API, * Added convenience methods to Header to allow the use of charset strings. * Added more HeaderList.Replace() method overloads for convenience. * Added a FormatOptions property to disallow the use of mixed charsets when - encoding headers (issue #139). + encoding headers (issue [#139](https://github.com/jstedfast/MimeKit/issues/139)). ### MimeKit 1.0.3 -* Improved MimeMessage.TextBody and MimeMessage.HtmlBody logic. (issue #87) +* Improved MimeMessage.TextBody and MimeMessage.HtmlBody logic. (issue [#87](https://github.com/jstedfast/MimeKit/issues/87)) * Added new overrides of TextPart.GetText() and SetText() methods that take a charset string argument instead of a System.Text.Encoding. * Fixed charset fallback logic to work properly (it incorrectly assumed that by default, Encoding.UTF8.GetString() would throw an exception when it - encountered illegal byte sequences). (issue #88) + encountered illegal byte sequences). (issue [#88](https://github.com/jstedfast/MimeKit/issues/88)) * Fixed S/MIME logic for finding X.509 certificates to use for encipherment. - (issue #89) + (issue [#89](https://github.com/jstedfast/MimeKit/issues/89)) ### MimeKit 1.0.2 From 1aaea3bb1b1c854a65f161989453e7dcbd92834b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 12:57:00 -0500 Subject: [PATCH 141/741] Optimized CryptographyContext.Supports() implementations --- MimeKit/Cryptography/MultipartEncrypted.cs | 5 ++--- MimeKit/Cryptography/MultipartSigned.cs | 8 ++++---- MimeKit/Cryptography/OpenPgpContext.cs | 18 +++++++++++++----- MimeKit/Cryptography/SecureMimeContext.cs | 18 +++++++++++++----- UnitTests/Cryptography/SecureMimeTests.cs | 2 +- 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/MimeKit/Cryptography/MultipartEncrypted.cs b/MimeKit/Cryptography/MultipartEncrypted.cs index b15ce2eb44..83c1a4cd17 100644 --- a/MimeKit/Cryptography/MultipartEncrypted.cs +++ b/MimeKit/Cryptography/MultipartEncrypted.cs @@ -1029,11 +1029,10 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - var protocol = ContentType.Parameters["protocol"]; + var protocol = ContentType.Parameters["protocol"]?.Trim (); if (string.IsNullOrEmpty (protocol)) throw new FormatException (); - protocol = protocol.Trim ().ToLowerInvariant (); if (!ctx.Supports (protocol)) throw new NotSupportedException (); @@ -1046,7 +1045,7 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, var ctype = version.ContentType; var value = string.Format ("{0}/{1}", ctype.MediaType, ctype.MediaSubtype); - if (value.ToLowerInvariant () != protocol) + if (!value.Equals (protocol, StringComparison.OrdinalIgnoreCase)) throw new FormatException (); var encrypted = this[1] as MimePart; diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index cf3b06b122..9ed7d6564f 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -409,11 +409,11 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - var protocol = ContentType.Parameters["protocol"]; + var protocol = ContentType.Parameters["protocol"]?.Trim (); if (string.IsNullOrEmpty (protocol)) throw new FormatException ("The multipart/signed part did not specify a protocol."); - if (!ctx.Supports (protocol.Trim ())) + if (!ctx.Supports (protocol)) throw new NotSupportedException ("The specified cryptography context does not support the signature protocol."); if (Count < 2) @@ -474,11 +474,11 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - var protocol = ContentType.Parameters["protocol"]; + var protocol = ContentType.Parameters["protocol"]?.Trim (); if (string.IsNullOrEmpty (protocol)) throw new FormatException ("The multipart/signed part did not specify a protocol."); - if (!ctx.Supports (protocol.Trim ())) + if (!ctx.Supports (protocol)) throw new NotSupportedException ("The specified cryptography context does not support the signature protocol."); if (Count < 2) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 00698ee123..62423248ac 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -57,6 +57,7 @@ namespace MimeKit.Cryptography { /// public abstract class OpenPgpContext : CryptographyContext { + static readonly string[] ProtocolSubtypes = { "pgp-signature", "pgp-encrypted", "pgp-keys", "x-pgp-signature", "x-pgp-encrypted", "x-pgp-keys" }; const string BeginPublicKeyBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; const string EndPublicKeyBlock = "-----END PGP PUBLIC KEY BLOCK-----"; @@ -387,14 +388,21 @@ public override bool Supports (string protocol) if (protocol == null) throw new ArgumentNullException (nameof (protocol)); - var type = protocol.ToLowerInvariant ().Split ('/'); - if (type.Length != 2 || type[0] != "application") + if (!protocol.StartsWith ("application/", StringComparison.OrdinalIgnoreCase)) return false; - if (type[1].StartsWith ("x-", StringComparison.Ordinal)) - type[1] = type[1].Substring (2); + int startIndex = "application/".Length; + int subtypeLength = protocol.Length - startIndex; - return type[1] == "pgp-signature" || type[1] == "pgp-encrypted" || type[1] == "pgp-keys"; + for (int i = 0; i < ProtocolSubtypes.Length; i++) { + if (subtypeLength != ProtocolSubtypes[i].Length) + continue; + + if (string.Compare (protocol, startIndex, ProtocolSubtypes[i], 0, subtypeLength, StringComparison.OrdinalIgnoreCase) == 0) + return true; + } + + return false; } /// diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 3aa18675b2..4ece84c5e6 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -47,6 +47,7 @@ namespace MimeKit.Cryptography { /// public abstract class SecureMimeContext : CryptographyContext { + static readonly string[] ProtocolSubtypes = { "pkcs7-signature", "pkcs7-mime", "pkcs7-keys", "x-pkcs7-signature", "x-pkcs7-mime", "x-pkcs7-keys" }; internal const X509KeyUsageFlags DigitalSignatureKeyUsageFlags = X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation; internal static readonly int EncryptionAlgorithmCount = Enum.GetValues (typeof (EncryptionAlgorithm)).Length; internal static readonly DerObjectIdentifier Blowfish = new DerObjectIdentifier ("1.3.6.1.4.1.3029.1.2"); @@ -159,14 +160,21 @@ public override bool Supports (string protocol) if (protocol == null) throw new ArgumentNullException (nameof (protocol)); - var type = protocol.ToLowerInvariant ().Split (new [] { '/' }); - if (type.Length != 2 || type[0] != "application") + if (!protocol.StartsWith ("application/", StringComparison.OrdinalIgnoreCase)) return false; - if (type[1].StartsWith ("x-", StringComparison.Ordinal)) - type[1] = type[1].Substring (2); + int startIndex = "application/".Length; + int subtypeLength = protocol.Length - startIndex; - return type[1] == "pkcs7-signature" || type[1] == "pkcs7-mime" || type[1] == "pkcs7-keys"; + for (int i = 0; i < ProtocolSubtypes.Length; i++) { + if (subtypeLength != ProtocolSubtypes[i].Length) + continue; + + if (string.Compare (protocol, startIndex, ProtocolSubtypes[i], 0, subtypeLength, StringComparison.OrdinalIgnoreCase) == 0) + return true; + } + + return false; } /// diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 647ca71744..00c34a2150 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -753,7 +753,7 @@ public virtual void TestSecureMimeVerifyThunderbird () var multipart = (MultipartSigned) message.Body; - var protocol = multipart.ContentType.Parameters["protocol"]; + var protocol = multipart.ContentType.Parameters["protocol"]?.Trim (); Assert.IsTrue (ctx.Supports (protocol), "The multipart/signed protocol is not supported."); Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); From 0c67ae6365b59600ea11e2e02c523942746353bb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 13:20:10 -0500 Subject: [PATCH 142/741] Optimized the OptimizedOrdinalComparer even more --- MimeKit/Utils/OptimizedOrdinalComparer.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index dd0a69fc94..fb05637ead 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -26,6 +26,7 @@ using System; using System.Collections.Generic; +using System.Runtime.CompilerServices; namespace MimeKit.Utils { /// @@ -34,7 +35,7 @@ namespace MimeKit.Utils { /// /// An optimized version of StringComparer.OrdinalIgnoreCase. /// - class OptimizedOrdinalIgnoreCaseComparer : IEqualityComparer + sealed class OptimizedOrdinalIgnoreCaseComparer : IEqualityComparer { /// /// Initializes a new instance of the class. @@ -46,6 +47,7 @@ public OptimizedOrdinalIgnoreCaseComparer () { } + [MethodImpl (MethodImplOptions.AggressiveInlining)] static int ToUpper (int c) { if (c >= 0x61 && c <= 0x7A) @@ -85,7 +87,8 @@ public bool Equals (string x, string y) if (x.Length != y.Length) return false; - for (int i = 0; i < x.Length; i++) { + int length = x.Length; + for (int i = 0; i < length; i++) { if (ToUpper (x[i]) != ToUpper (y[i])) return false; } From 1f084e509ee1d768d10dcf0c082320c71ec3ae4c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 13:50:43 -0500 Subject: [PATCH 143/741] More optimizations for OptimizedOrdinalIgnoreCaseComparer --- MimeKit/Utils/OptimizedOrdinalComparer.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index fb05637ead..8ed05d8b51 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -50,7 +50,10 @@ public OptimizedOrdinalIgnoreCaseComparer () [MethodImpl (MethodImplOptions.AggressiveInlining)] static int ToUpper (int c) { - if (c >= 0x61 && c <= 0x7A) + const uint range = 0x7A - 0x61; + + // check if the char is within the lowercase range + if ((uint) (c - 0x61) <= range) return c - 0x20; return c; From e463038013ce7eb1c53930b893f1f7c7539cb1eb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 13:56:22 -0500 Subject: [PATCH 144/741] Make the code a bit easier to read --- MimeKit/Utils/OptimizedOrdinalComparer.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index 8ed05d8b51..e6142eb115 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -50,10 +50,8 @@ public OptimizedOrdinalIgnoreCaseComparer () [MethodImpl (MethodImplOptions.AggressiveInlining)] static int ToUpper (int c) { - const uint range = 0x7A - 0x61; - // check if the char is within the lowercase range - if ((uint) (c - 0x61) <= range) + if ((uint) (c - 'a') <= 'z' - 'a') return c - 0x20; return c; From 515f96aca70436c1b98accb0b4f27480e6026bae Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 14:24:44 -0500 Subject: [PATCH 145/741] Minor optimizations to date parser --- MimeKit/Utils/DateUtils.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index ed7383527b..fa85665063 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -177,10 +177,7 @@ static bool TryGetWeekday (DateToken token, byte[] text, out DayOfWeek weekday) if (!token.IsWeekday || token.Length < 3) return false; - var name = Encoding.ASCII.GetString (text, token.StartIndex, token.Length); - - if (name.Length > 3) - name = name.Substring (0, 3); + var name = Encoding.ASCII.GetString (text, token.StartIndex, 3); for (int day = 0; day < WeekDays.Length; day++) { if (WeekDays[day].Equals (name, StringComparison.OrdinalIgnoreCase)) { @@ -218,10 +215,7 @@ static bool TryGetMonth (DateToken token, byte[] text, out int month) if (!token.IsMonth || token.Length < 3) return false; - var name = Encoding.ASCII.GetString (text, token.StartIndex, token.Length); - - if (name.Length > 3) - name = name.Substring (0, 3); + var name = Encoding.ASCII.GetString (text, token.StartIndex, 3); for (int i = 0; i < Months.Length; i++) { if (Months[i].Equals (name, StringComparison.OrdinalIgnoreCase)) { From 43d8f6eecc627c00a4906d8fa93658905b8e120f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 14:40:38 -0500 Subject: [PATCH 146/741] Fixed uses of ArgumentException to include a param name --- MimeKit/Cryptography/CmsSigner.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 4 ++-- MimeKit/MessagePartial.cs | 2 +- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeMessage.cs | 10 +++++----- MimeKit/MimePart.cs | 2 +- MimeKit/ParameterList.cs | 6 +++--- MimeKit/Text/HtmlUtils.cs | 12 ++++++------ MimeKit/Tnef/TnefPropertyReader.cs | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index cd3b9abbe6..c8e8963e8b 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -78,7 +78,7 @@ static bool CanSign (X509Certificate certificate) static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) { if (!CanSign (certificate)) - throw new ArgumentException ("The certificate cannot be used for signing."); + throw new ArgumentException ("The certificate cannot be used for signing.", nameof (certificate)); } /// diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 62423248ac..eab2d20777 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -1118,10 +1118,10 @@ public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? var utc = expirationDate.Value.ToUniversalTime (); if (utc <= now) - throw new ArgumentException ("expirationDate needs to be greater than DateTime.Now"); + throw new ArgumentException ("expirationDate needs to be greater than DateTime.Now", nameof (expirationDate)); if ((expirationTime = Convert.ToInt64 (utc.Subtract (now).TotalSeconds)) <= 0) - throw new ArgumentException ("expirationDate needs to be greater than DateTime.Now"); + throw new ArgumentException ("expirationDate needs to be greater than DateTime.Now", nameof (expirationDate)); } if (random == null) { diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 967eda2ba4..b2b6f80dcd 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -262,7 +262,7 @@ public static IEnumerable Split (MimeMessage message, int maxSize) static int PartialCompare (MessagePartial partial1, MessagePartial partial2) { if (!partial1.Number.HasValue || !partial2.Number.HasValue || partial1.Id != partial2.Id) - throw new ArgumentException ("partial"); + throw new ArgumentException ("Partial messages have mismatching identifiers.", "partials"); return partial1.Number.Value - partial2.Number.Value; } diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 22ba86382e..96eaad0a6a 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -298,7 +298,7 @@ public string ContentId { int index = 0; if (!MailboxAddress.TryParse (Headers.Options, buffer, ref index, buffer.Length, false, out mailbox)) - throw new ArgumentException ("Invalid Content-Id format."); + throw new ArgumentException ("Invalid Content-Id format.", nameof (value)); contentId = mailbox.Address; diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index fa8272d55f..a504a7c544 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1844,14 +1844,14 @@ public void Sign (FormatOptions options, DkimSigner signer, IList header fields[i] = headers[i].ToLowerInvariant (); if (DkimShouldNotInclude.Contains (fields[i])) - throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i])); + throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i]), nameof (headers)); if (fields[i] == "from") containsFrom = true; } if (!containsFrom) - throw new ArgumentException ("The list of headers to sign MUST include the 'From' header."); + throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); DkimSign (options, signer, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); } @@ -1928,19 +1928,19 @@ public void Sign (FormatOptions options, DkimSigner signer, IList head for (int i = 0; i < headers.Count; i++) { if (headers[i] == HeaderId.Unknown) - throw new ArgumentException ("The list of headers to sign cannot include the 'Unknown' header."); + throw new ArgumentException ("The list of headers to sign cannot include the 'Unknown' header.", nameof (headers)); fields[i] = headers[i].ToHeaderName ().ToLowerInvariant (); if (DkimShouldNotInclude.Contains (fields[i])) - throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i].ToHeaderName ())); + throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i].ToHeaderName ()), nameof (headers)); if (headers[i] == HeaderId.From) containsFrom = true; } if (!containsFrom) - throw new ArgumentException ("The list of headers to sign MUST include the 'From' header."); + throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); DkimSign (options, signer, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); } diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index a5befaff43..48d13bc47a 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -113,7 +113,7 @@ public MimePart (string mediaType, string mediaSubtype, params object[] args) : var co = obj as IMimeContent; if (co != null) { if (content != null) - throw new ArgumentException ("ContentObject should not be specified more than once."); + throw new ArgumentException ("IMimeContent should not be specified more than once."); content = co; continue; diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 17af0c96c6..03618ccae8 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -369,7 +369,7 @@ public void Add (Parameter param) throw new ArgumentNullException (nameof (param)); if (table.ContainsKey (param.Name)) - throw new ArgumentException ("A parameter of that name already exists."); + throw new ArgumentException ("A parameter of that name already exists.", nameof (param)); param.Changed += OnParamChanged; table.Add (param.Name, param); @@ -507,7 +507,7 @@ public void Insert (int index, Parameter param) throw new ArgumentNullException (nameof (param)); if (table.ContainsKey (param.Name)) - throw new ArgumentException ("A parameter of that name already exists."); + throw new ArgumentException ("A parameter of that name already exists.", nameof (param)); parameters.Insert (index, param); table.Add (param.Name, param); @@ -579,7 +579,7 @@ public Parameter this [int index] { if (table[param.Name] == param) table[param.Name] = value; } else if (table.ContainsKey (value.Name)) { - throw new ArgumentException ("A parameter of that name already exists."); + throw new ArgumentException ("A parameter of that name already exists.", nameof (value)); } else { table.Add (value.Name, value); table.Remove (param.Name); diff --git a/MimeKit/Text/HtmlUtils.cs b/MimeKit/Text/HtmlUtils.cs index 8751096976..0ec210e345 100644 --- a/MimeKit/Text/HtmlUtils.cs +++ b/MimeKit/Text/HtmlUtils.cs @@ -171,7 +171,7 @@ public static void HtmlAttributeEncode (TextWriter output, char[] value, int sta throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException ("quote"); + throw new ArgumentException (nameof (quote)); HtmlAttributeEncode (output, new CharArray (value), startIndex, count, quote); } @@ -209,7 +209,7 @@ public static string HtmlAttributeEncode (char[] value, int startIndex, int coun throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException ("quote"); + throw new ArgumentException (nameof (quote)); var encoded = new StringBuilder (); @@ -257,7 +257,7 @@ public static void HtmlAttributeEncode (TextWriter output, string value, int sta throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException ("quote"); + throw new ArgumentException (nameof (quote)); HtmlAttributeEncode (output, new CharString (value), startIndex, count, quote); } @@ -288,7 +288,7 @@ public static void HtmlAttributeEncode (TextWriter output, string value, char qu throw new ArgumentNullException (nameof (value)); if (quote != '"' && quote != '\'') - throw new ArgumentException ("quote"); + throw new ArgumentException (nameof (quote)); HtmlAttributeEncode (output, new CharString (value), 0, value.Length, quote); } @@ -326,7 +326,7 @@ public static string HtmlAttributeEncode (string value, int startIndex, int coun throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException ("quote"); + throw new ArgumentException (nameof (quote)); var encoded = new StringBuilder (); @@ -357,7 +357,7 @@ public static string HtmlAttributeEncode (string value, char quote = '"') throw new ArgumentNullException (nameof (value)); if (quote != '"' && quote != '\'') - throw new ArgumentException ("quote"); + throw new ArgumentException (nameof (quote)); var encoded = new StringBuilder (); diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index 4b3dc317ba..3a98157255 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -413,7 +413,7 @@ static long DoubleDateToTicks (double value) { // The check done this way will take care of NaN if (!(value < OADateMaxAsDouble) || !(value > OADateMinAsDouble)) - throw new ArgumentException ("Invalid OLE Automation Date."); + throw new ArgumentException ("Invalid OLE Automation Date.", nameof (value)); long millis = (long) (value * MillisPerDay + (value >= 0 ? 0.5 : -0.5)); @@ -423,7 +423,7 @@ static long DoubleDateToTicks (double value) millis += DoubleDateOffset / TicksPerMillisecond; if (millis < 0 || millis >= MaxMillis) - throw new ArgumentException ("Invalid OLE Automation Date."); + throw new ArgumentException ("Invalid OLE Automation Date.", nameof (value)); return millis * TicksPerMillisecond; } From 8d3d30ca6989cdd857c03d45f5a21aec179defc1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 14:49:32 -0500 Subject: [PATCH 147/741] minor optimization for GnuPGContext gpg.conf parsing --- MimeKit/Cryptography/GnuPGContext.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index 7854873e9e..7ceabcc8cc 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -40,6 +40,7 @@ public abstract class GnuPGContext : OpenPgpContext static readonly Dictionary EncryptionAlgorithms; //static readonly Dictionary PublicKeyAlgorithms; static readonly Dictionary DigestAlgorithms; + static readonly char[] Whitespace = { ' ', '\t' }; static readonly string PublicKeyRing; static readonly string SecretKeyRing; static readonly string Configuration; @@ -135,7 +136,7 @@ void UpdateKeyServerOptions (string value) if (string.IsNullOrEmpty (value)) return; - var options = value.Split (new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + var options = value.Split (Whitespace, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < options.Length; i++) { switch (options[i]) { case "auto-key-retrieve": @@ -147,7 +148,7 @@ void UpdateKeyServerOptions (string value) static EncryptionAlgorithm[] ParseEncryptionAlgorithms (string value) { - var names = value.Split (new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + var names = value.Split (Whitespace, StringSplitOptions.RemoveEmptyEntries); var algorithms = new List (); var seen = new HashSet (); @@ -187,7 +188,7 @@ static EncryptionAlgorithm[] ParseEncryptionAlgorithms (string value) static DigestAlgorithm[] ParseDigestAlgorithms (string value) { - var names = value.Split (new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + var names = value.Split (Whitespace, StringSplitOptions.RemoveEmptyEntries); var algorithms = new List (); var seen = new HashSet (); From e49d1dde6ca6624f504dec7ca7b1789e25995adc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 15:05:51 -0500 Subject: [PATCH 148/741] Added a few more S/MIME unit tests --- UnitTests/Cryptography/SecureMimeTests.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 00c34a2150..e36abebed4 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -140,6 +140,7 @@ public void TestArgumentExceptions () MimeEntity entity; Assert.IsFalse (ctx.Supports ("text/plain"), "Should not support text/plain"); + Assert.IsFalse (ctx.Supports ("application/octet-stream"), "Should not support application/octet-stream"); Assert.IsTrue (ctx.Supports ("application/pkcs7-mime"), "Should support application/pkcs7-mime"); Assert.IsTrue (ctx.Supports ("application/x-pkcs7-mime"), "Should support application/x-pkcs7-mime"); Assert.IsTrue (ctx.Supports ("application/pkcs7-signature"), "Should support application/pkcs7-signature"); @@ -237,6 +238,11 @@ public void TestDigestAlgorithmMappings () } catch (NotSupportedException) { } } + + Assert.Throws (() => ctx.GetDigestAlgorithmName (DigestAlgorithm.DoubleSha)); + Assert.Throws (() => ctx.GetDigestAlgorithmName (DigestAlgorithm.None)); + + Assert.AreEqual (DigestAlgorithm.None, ctx.GetDigestAlgorithm ("blahblahblah")); } } From d6435ee6b4e6d51560df2f41cbec1635b5308d2e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 15:33:56 -0500 Subject: [PATCH 149/741] Added more S/MIME unit tests --- UnitTests/Cryptography/SecureMimeTests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index e36abebed4..7ef756c47c 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -243,6 +243,7 @@ public void TestDigestAlgorithmMappings () Assert.Throws (() => ctx.GetDigestAlgorithmName (DigestAlgorithm.None)); Assert.AreEqual (DigestAlgorithm.None, ctx.GetDigestAlgorithm ("blahblahblah")); + Assert.IsFalse (SecureMimeContext.TryGetDigestAlgorithm ("blahblahblah", out DigestAlgorithm algo)); } } @@ -277,6 +278,20 @@ public void TestSecureMimeCompressionWithContext () Assert.IsInstanceOf (decompressed, "Decompressed part is not the expected type."); Assert.AreEqual (original.Text, ((TextPart) decompressed).Text, "Decompressed content is not the same as the original."); + + using (var stream = new MemoryStream ()) { + using (var decoded = new MemoryStream ()) { + compressed.Content.DecodeTo (decoded); + decoded.Position = 0; + ctx.DecompressTo (decoded, stream); + } + + stream.Position = 0; + decompressed = MimeEntity.Load (stream); + + Assert.IsInstanceOf (decompressed, "Decompressed part is not the expected type."); + Assert.AreEqual (original.Text, ((TextPart) decompressed).Text, "Decompressed content is not the same as the original."); + } } } From b5cf5aeef524fc3640743263d76dcfb5cc08525c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 17:37:43 -0500 Subject: [PATCH 150/741] Fixed OpenPgpDigitalCertificate.ExpirationDate for PGP keys that never expire --- .../Cryptography/OpenPgpDigitalCertificate.cs | 6 ++- UnitTests/Cryptography/PgpMimeTests.cs | 44 +++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs index 60102de14e..fadf218e09 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs @@ -139,7 +139,11 @@ public DateTime CreationDate { /// /// The expiration date. public DateTime ExpirationDate { - get { return CreationDate.AddSeconds ((double) PublicKey.GetValidSeconds ()); } + get { + long seconds = PublicKey.GetValidSeconds (); + + return seconds > 0 ? CreationDate.AddSeconds ((double) seconds) : DateTime.MaxValue; + } } /// diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 3c71ff3247..68fa928739 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -231,14 +231,22 @@ public void TestMimeMessageSign () var signatures = multipart.Verify (ctx); Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); - foreach (var signature in signatures) { - try { - bool valid = signature.Verify (); - Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); - } catch (DigitalSignatureVerifyException ex) { - Assert.Fail ("Failed to verify signature: {0}", ex); - } + var signature = signatures[0]; + + Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); + Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); + Assert.AreEqual ("44CD48EEC90D8849961F36BA50DCD107AB0821A2", signature.SignerCertificate.Fingerprint); + Assert.AreEqual (new DateTime (2013, 11, 3, 18, 32, 27), signature.SignerCertificate.CreationDate, "CreationDate"); + Assert.AreEqual (DateTime.MaxValue, signature.SignerCertificate.ExpirationDate, "ExpirationDate"); + Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, signature.SignerCertificate.PublicKeyAlgorithm); + + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + Assert.Fail ("Failed to verify signature: {0}", ex); } } } @@ -278,14 +286,22 @@ public async void TestMimeMessageSignAsync () var signatures = await multipart.VerifyAsync (ctx); Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); - foreach (var signature in signatures) { - try { - bool valid = signature.Verify (); - Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); - } catch (DigitalSignatureVerifyException ex) { - Assert.Fail ("Failed to verify signature: {0}", ex); - } + var signature = signatures[0]; + + Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); + Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); + Assert.AreEqual ("44CD48EEC90D8849961F36BA50DCD107AB0821A2", signature.SignerCertificate.Fingerprint); + Assert.AreEqual (new DateTime (2013, 11, 3, 18, 32, 27), signature.SignerCertificate.CreationDate, "CreationDate"); + Assert.AreEqual (DateTime.MaxValue, signature.SignerCertificate.ExpirationDate, "ExpirationDate"); + Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, signature.SignerCertificate.PublicKeyAlgorithm); + + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + Assert.Fail ("Failed to verify signature: {0}", ex); } } } From 89ffc8b36f272f208f224b4a9a7a82618a0f0d25 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 17:49:23 -0500 Subject: [PATCH 151/741] Added more unit tests for SecureMimeDigitalCertificate --- UnitTests/Cryptography/SecureMimeTests.cs | 47 ++++++++++++++--------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 7ef756c47c..49b86252d8 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -50,6 +50,9 @@ public abstract class SecureMimeTestsBase const string MimeKitFingerprint = "4846fb5e27df6a23bb35a995443363e447d3426d"; const string ThunderbirdName = "fejj@gnome.org"; + static readonly DateTime MimeKitCreationDate = new DateTime (2018, 07, 30, 13, 13, 19); + static readonly DateTime MimeKitExpirationDate = new DateTime (2019, 07, 30, 13, 13, 19); + static readonly string[] CertificateAuthorities = { "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; @@ -317,29 +320,37 @@ public virtual void TestSecureMimeEncapsulatedSigning () Assert.AreEqual (cleartext.Text, ((TextPart) extracted).Text, "Extracted content is not the same as the original."); Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); - foreach (var signature in signatures) { - try { - bool valid = signature.Verify (); - Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); - } catch (DigitalSignatureVerifyException ex) { - using (var ctx = CreateContext ()) { - if (ctx is WindowsSecureMimeContext) { - // AppVeyor gets an exception about the root certificate not being trusted - Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); - } else { - Assert.Fail ("Failed to verify signature: {0}", ex); - } + var signature = signatures[0]; + + Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); + Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); + Assert.AreEqual (MimeKitFingerprint, signature.SignerCertificate.Fingerprint); + Assert.AreEqual (MimeKitCreationDate, signature.SignerCertificate.CreationDate, "CreationDate"); + Assert.AreEqual (MimeKitExpirationDate, signature.SignerCertificate.ExpirationDate, "ExpirationDate"); + Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, signature.SignerCertificate.PublicKeyAlgorithm); + + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + using (var ctx = CreateContext ()) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); } } + } - var algorithms = GetEncryptionAlgorithms (signature); - int i = 0; + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; - Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); - Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); - Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); - } + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); } void AssertValidSignatures (SecureMimeContext ctx, DigitalSignatureCollection signatures) From dbeb6b2dac6f2ec85160698368748ca1f8608c27 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 18:17:58 -0500 Subject: [PATCH 152/741] Reduce string allocations in MultipartSigned and MultipartEncrypted --- MimeKit/Cryptography/MultipartEncrypted.cs | 6 ++---- MimeKit/Cryptography/MultipartSigned.cs | 10 ++++------ UnitTests/Cryptography/SecureMimeTests.cs | 4 ++++ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/MimeKit/Cryptography/MultipartEncrypted.cs b/MimeKit/Cryptography/MultipartEncrypted.cs index 83c1a4cd17..f69e0cfcde 100644 --- a/MimeKit/Cryptography/MultipartEncrypted.cs +++ b/MimeKit/Cryptography/MultipartEncrypted.cs @@ -1133,12 +1133,10 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, /// public MimeEntity Decrypt (out DigitalSignatureCollection signatures, CancellationToken cancellationToken = default (CancellationToken)) { - var protocol = ContentType.Parameters["protocol"]; + var protocol = ContentType.Parameters["protocol"]?.Trim (); if (string.IsNullOrEmpty (protocol)) throw new FormatException (); - protocol = protocol.Trim ().ToLowerInvariant (); - if (Count < 2) throw new FormatException (); @@ -1148,7 +1146,7 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, var ctype = version.ContentType; var value = string.Format ("{0}/{1}", ctype.MediaType, ctype.MediaSubtype); - if (value.ToLowerInvariant () != protocol) + if (!value.Equals (protocol, StringComparison.OrdinalIgnoreCase)) throw new FormatException (); var encrypted = this[1] as MimePart; diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index 9ed7d6564f..a5fae545f8 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -534,12 +534,11 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// public DigitalSignatureCollection Verify (CancellationToken cancellationToken = default (CancellationToken)) { - var protocol = ContentType.Parameters["protocol"]; + var protocol = ContentType.Parameters["protocol"]?.Trim (); + if (string.IsNullOrEmpty (protocol)) throw new FormatException ("The multipart/signed part did not specify a protocol."); - protocol = protocol.Trim ().ToLowerInvariant (); - using (var ctx = CryptographyContext.Create (protocol)) return Verify (ctx, cancellationToken); } @@ -568,12 +567,11 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// public Task VerifyAsync (CancellationToken cancellationToken = default (CancellationToken)) { - var protocol = ContentType.Parameters["protocol"]; + var protocol = ContentType.Parameters["protocol"]?.Trim (); + if (string.IsNullOrEmpty (protocol)) throw new FormatException ("The multipart/signed part did not specify a protocol."); - protocol = protocol.Trim ().ToLowerInvariant (); - using (var ctx = CryptographyContext.Create (protocol)) return VerifyAsync (ctx, cancellationToken); } diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 49b86252d8..18d9365b70 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -149,6 +149,10 @@ public void TestArgumentExceptions () Assert.IsTrue (ctx.Supports ("application/pkcs7-signature"), "Should support application/pkcs7-signature"); Assert.IsTrue (ctx.Supports ("application/x-pkcs7-signature"), "Should support application/x-pkcs7-signature"); + Assert.AreEqual ("application/pkcs7-signature", ctx.SignatureProtocol); + Assert.AreEqual ("application/pkcs7-mime", ctx.EncryptionProtocol); + Assert.AreEqual ("application/pkcs7-mime", ctx.KeyExchangeProtocol); + Assert.Throws (() => ctx.Supports (null)); Assert.Throws (() => ctx.CanSign (null)); Assert.Throws (() => ctx.CanEncrypt (null)); From f49a0ade19cf82036d753cec348723072e7b9ff9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 20:11:06 -0500 Subject: [PATCH 153/741] Refactored OpenPgpContext to reduce duplicated code --- MimeKit/Cryptography/OpenPgpContext.cs | 53 +++++++++----------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index eab2d20777..d31ab3878e 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -543,8 +543,8 @@ async Task RetrievePublicKeyRingAsync (long keyId, bool doAsyn filtered.Add (new OpenPgpBlockFilter (BeginPublicKeyBlock, EndPublicKeyBlock)); if (doAsync) { - using (var response = await client.GetAsync (uri.ToString (), cancellationToken)) - await response.Content.CopyToAsync (filtered); + using (var response = await client.GetAsync (uri.ToString (), cancellationToken).ConfigureAwait (false)) + await response.Content.CopyToAsync (filtered).ConfigureAwait (false); } else { #if !NETSTANDARD && !PORTABLE var request = (HttpWebRequest) WebRequest.Create (uri.ToString ()); @@ -762,6 +762,19 @@ public IEnumerable EnumerateSecretKeys (MailboxAddress mailbox) yield break; } + static bool IsExpired (PgpPublicKey pubkey) + { + long seconds = pubkey.GetValidSeconds (); + + if (seconds != 0) { + var expires = pubkey.CreationTime.AddSeconds ((double) seconds); + if (expires <= DateTime.Now) + return true; + } + + return false; + } + /// /// Get the public key associated with the mailbox address. /// @@ -779,16 +792,9 @@ public IEnumerable EnumerateSecretKeys (MailboxAddress mailbox) protected virtual PgpPublicKey GetPublicKey (MailboxAddress mailbox) { foreach (var key in EnumeratePublicKeys (mailbox)) { - if (!key.IsEncryptionKey || key.IsRevoked ()) + if (!key.IsEncryptionKey || key.IsRevoked () || IsExpired (key)) continue; - long seconds = key.GetValidSeconds (); - if (seconds != 0) { - var expires = key.CreationTime.AddSeconds ((double) seconds); - if (expires <= DateTime.Now) - continue; - } - return key; } @@ -879,16 +885,9 @@ internal protected virtual PgpSecretKey GetSigningKey (MailboxAddress mailbox) continue; var pubkey = key.PublicKey; - if (pubkey.IsRevoked ()) + if (pubkey.IsRevoked () || IsExpired (pubkey)) continue; - long seconds = pubkey.GetValidSeconds (); - if (seconds != 0) { - var expires = pubkey.CreationTime.AddSeconds ((double) seconds); - if (expires <= DateTime.Now) - continue; - } - return key; } } @@ -1254,16 +1253,9 @@ public override bool CanSign (MailboxAddress signer) continue; var pubkey = key.PublicKey; - if (pubkey.IsRevoked ()) + if (pubkey.IsRevoked () || IsExpired (pubkey)) continue; - long seconds = pubkey.GetValidSeconds (); - if (seconds != 0) { - var expires = pubkey.CreationTime.AddSeconds ((double) seconds); - if (expires <= DateTime.Now) - continue; - } - return true; } } @@ -1288,16 +1280,9 @@ public override bool CanEncrypt (MailboxAddress mailbox) throw new ArgumentNullException (nameof (mailbox)); foreach (var key in EnumeratePublicKeys (mailbox)) { - if (!key.IsEncryptionKey || key.IsRevoked ()) + if (!key.IsEncryptionKey || key.IsRevoked () || IsExpired (key)) continue; - long seconds = key.GetValidSeconds (); - if (seconds != 0) { - var expires = key.CreationTime.AddSeconds ((double) seconds); - if (expires <= DateTime.Now) - continue; - } - return true; } From d1a7cdcd3fe9a207e9efb018f277e9b0d437964f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Nov 2018 20:23:24 -0500 Subject: [PATCH 154/741] Make sure to clean up temporary MemoryBlockStreams in OpenPgpContext.Decrypt() --- MimeKit/Cryptography/OpenPgpContext.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index d31ab3878e..de8e259f40 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -2346,12 +2346,12 @@ async Task DecryptToAsync (Stream encryptedData, Str /// public MimeEntity Decrypt (Stream encryptedData, out DigitalSignatureCollection signatures, CancellationToken cancellationToken = default (CancellationToken)) { - var decryptedData = new MemoryBlockStream (); + using (var decryptedData = new MemoryBlockStream ()) { + signatures = DecryptTo (encryptedData, decryptedData, cancellationToken); + decryptedData.Position = 0; - signatures = DecryptTo (encryptedData, decryptedData, cancellationToken); - decryptedData.Position = 0; - - return MimeEntity.Load (decryptedData, true, cancellationToken); + return MimeEntity.Load (decryptedData, cancellationToken); + } } /// @@ -2382,12 +2382,12 @@ async Task DecryptToAsync (Stream encryptedData, Str /// public override MimeEntity Decrypt (Stream encryptedData, CancellationToken cancellationToken = default (CancellationToken)) { - var decryptedData = new MemoryBlockStream (); + using (var decryptedData = new MemoryBlockStream ()) { + DecryptTo (encryptedData, decryptedData, cancellationToken); + decryptedData.Position = 0; - DecryptTo (encryptedData, decryptedData, cancellationToken); - decryptedData.Position = 0; - - return MimeEntity.Load (decryptedData, true, cancellationToken); + return MimeEntity.Load (decryptedData, cancellationToken); + } } /// From 0a215125514c2f045e9e38bfe423666e7ef620af Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 15 Nov 2018 13:42:36 -0500 Subject: [PATCH 155/741] Removed the Issue Stats icons because that site is no longer functional --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 5eb6575017..3692ccf152 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,6 @@ [![Join the chat at https://gitter.im/jstedfast/MimeKit](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jstedfast/MimeKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Issue Stats](http://www.issuestats.com/github/jstedfast/MimeKit/badge/pr)](http://www.issuestats.com/github/jstedfast/MimeKit) -[![Issue Stats](http://www.issuestats.com/github/jstedfast/MimeKit/badge/issue)](http://www.issuestats.com/github/jstedfast/MimeKit) - | |Build Status|Code Coverage|Static Analysis| |-------------|:----------:|:-----------:|:-------------:| |**Linux/Mac**|[![Build Status](https://travis-ci.org/jstedfast/MimeKit.svg)](https://travis-ci.org/jstedfast/MimeKit)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=master)](https://coveralls.io/r/jstedfast/MimeKit?branch=master)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| From 27b5c6cbfe6ceda68c7417a6c16c08d60b47757d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 27 Nov 2018 08:44:14 -0500 Subject: [PATCH 156/741] minor code cleanup --- MimeKit/InternetAddress.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 9c48dffd42..52217f45f1 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -348,11 +348,11 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex internal static bool TryParseAddrspec (byte[] text, ref int index, int endIndex, byte[] sentinels, bool throwOnError, out string addrspec, out int at) { int startIndex = index; + string localpart; addrspec = null; at = -1; - string localpart; if (!TryParseLocalPart (text, ref index, endIndex, true, throwOnError, out localpart)) return false; @@ -429,7 +429,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st } while (index < endIndex && text[index] == '<'); } - if (index < endIndex && !ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; if (index >= endIndex) { From 33c8fe113bfe0d4ca712051eaf4329b4de5b0dea Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 29 Nov 2018 14:54:09 -0500 Subject: [PATCH 157/741] Added more HeaderId's --- MimeKit/HeaderId.cs | 283 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 3177ca1888..2740ad79cc 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -41,11 +41,21 @@ namespace MimeKit { /// comparing strings. /// public enum HeaderId { + /// + /// The Accept-Language header field. + /// + AcceptLanguage, + /// /// The Ad-Hoc header field. /// AdHoc, + /// + /// The Alternate-Recipient header field. + /// + AlternateRecipient, + /// /// The Apparently-To header field. /// @@ -56,16 +66,89 @@ public enum HeaderId { /// Approved, + /// + /// The ARC-Authentication-Results header field. + /// + [HeaderName ("ARC-Authentication-Results")] + ArcAuthenticationResults, + + /// + /// The ARC-Message-Signature header field. + /// + [HeaderName ("ARC-Message-Signature")] + ArcMessageSignature, + + /// + /// The ARC-Seal header field. + /// + [HeaderName ("ARC-Seal")] + ArcSeal, + + /// + /// The Archive header field. + /// + Archive, + + /// + /// The Archived-At header field. + /// + ArchivedAt, + /// /// The Article header field. /// Article, + /// + /// The Authentication-Results header field. + /// + AuthenticationResults, + + /// + /// The Autocrypt header field. + /// + Autocrypt, + + /// + /// The Autocrypt-Gossip header field. + /// + AutocryptGossip, + + /// + /// The Autocrypt-Setup-Message header field. + /// + AutocryptSetupMessage, + + /// + /// The Autoforwarded header field. + /// + Autoforwarded, + + /// + /// The Auto-Submitted header field. + /// + AutoSubmitted, + + /// + /// The Autosubmitted header field. + /// + Autosubmitted, + + /// + /// The Base header field. + /// + Base, + /// /// The Bcc header field. /// Bcc, + /// + /// The Body header field. + /// + Body, + /// /// The Bytes header field. /// @@ -81,6 +164,11 @@ public enum HeaderId { /// Comments, + /// + /// The Content-Alternative header field. + /// + ContentAlternative, + /// /// The Content-Base header field. /// @@ -106,11 +194,21 @@ public enum HeaderId { /// ContentDuration, + /// + /// The Content-Features header field. + /// + ContentFeatures, + /// /// The Content-Id header field. /// ContentId, + /// + /// The Content-Identifier header field. + /// + ContentIdentifier, + /// /// The Content-Language header field. /// @@ -131,11 +229,21 @@ public enum HeaderId { /// ContentMd5, + /// + /// The Content-Return header field. + /// + ContentReturn, + /// /// The Content-Transfer-Encoding header field. /// ContentTransferEncoding, + /// + /// The Content-Translation-Type header field. + /// + ContentTranslationType, + /// /// The Content-Type header field. /// @@ -146,16 +254,41 @@ public enum HeaderId { /// Control, + /// + /// The Conversion header field. + /// + Conversion, + + /// + /// The Conversion-With-Loss header field. + /// + ConversionWithLoss, + /// /// The Date header field. /// Date, + /// + /// The Date-Received header field. + /// + DateReceived, + /// /// The Deferred-Delivery header field. /// DeferredDelivery, + /// + /// The Delivery-Date header field. + /// + DeliveryDate, + + /// + /// The Disclose-Recipients header field. + /// + DiscloseRecipients, + /// /// The Disposition-Notification-Options header field. /// @@ -213,11 +346,26 @@ public enum HeaderId { /// From, + /// + /// The Generate-Delivery-Report header field. + /// + GenerateDeliveryReport, + /// /// The Importance header field. /// Importance, + /// + /// The Injection-Date header field. + /// + InjectionDate, + + /// + /// The Injection-Info header field. + /// + InjectionInfo, + /// /// The In-Reply-To header field. /// @@ -228,16 +376,46 @@ public enum HeaderId { /// Keywords, + /// + /// The Language header. + /// + Language, + + /// + /// The Latest-Delivery-Time header. + /// + LatestDeliveryTime, + /// /// The Lines header field. /// Lines, + /// + /// THe List-Archive header field. + /// + ListArchive, + /// /// The List-Help header field. /// ListHelp, + /// + /// The List-Id header field. + /// + ListId, + + /// + /// The List-Owner header field. + /// + ListOwner, + + /// + /// The List-Post header field. + /// + ListPost, + /// /// The List-Subscribe header field. /// @@ -248,6 +426,11 @@ public enum HeaderId { /// ListUnsubscribe, + /// + /// The List-Unsubscribe-Post header field. + /// + ListUnsubscribePost, + /// /// The Message-Id header field. /// @@ -274,11 +457,31 @@ public enum HeaderId { /// Organization, + /// + /// The Original-From header field. + /// + OriginalFrom, + + /// + /// The Original-Message-Id header field. + /// + OriginalMessageId, + /// /// The Original-Recipient header field. /// OriginalRecipient, + /// + /// The Original-Return-Address header field. + /// + OriginalReturnAddress, + + /// + /// The Original-Subject header field. + /// + OriginalSubject, + /// /// The Path header field. /// @@ -289,6 +492,12 @@ public enum HeaderId { ///
Precedence, + /// + /// The Prevent-NonDelivery-Report header field. + /// + [HeaderName ("Prevent-NonDelivery-Report")] + PreventNonDeliveryReport, + /// /// The Priority header field. /// @@ -299,11 +508,22 @@ public enum HeaderId { ///
Received, + /// + /// The Received-SPF header field. + /// + [HeaderName ("Received-SPF")] + ReceivedSPF, + /// /// The References header field. /// References, + /// + /// The Relay-Version header field. + /// + RelayVersion, + /// /// The Reply-By header field. /// @@ -314,6 +534,11 @@ public enum HeaderId { ///
ReplyTo, + /// + /// The Require-Recipient-Valid-Since header field. + /// + RequireRecipientValidSince, + /// /// The Resent-Bcc header field. /// @@ -364,6 +589,11 @@ public enum HeaderId { ///
ReturnReceiptTo, + /// + /// The See-Also header field. + /// + SeeAlso, + /// /// The Sender header field. /// @@ -374,6 +604,11 @@ public enum HeaderId { ///
Sensitivity, + /// + /// The Solicitation header field. + /// + Solicitation, + /// /// The Status header field. /// @@ -404,6 +639,54 @@ public enum HeaderId { ///
UserAgent, + /// + /// The X400-Content-Identifier header field. + /// + [HeaderName ("X400-Content-Identifier")] + X400ContentIdentifier, + + /// + /// The X400-Content-Return header field. + /// + [HeaderName ("X400-Content-Return")] + X400ContentReturn, + + /// + /// The X400-Content-Type header field. + /// + [HeaderName ("X400-Content-Type")] + X400ContentType, + + /// + /// The X400-MTS-Identifier header field. + /// + [HeaderName ("X400-MTS-Identifier")] + X400MTSIdentifier, + + /// + /// The X400-Originator header field. + /// + [HeaderName ("X400-Originator")] + X400Originator, + + /// + /// The X400-Received header field. + /// + [HeaderName ("X400-Received")] + X400Received, + + /// + /// The X400-Recipients header field. + /// + [HeaderName ("X400-Recipients")] + X400Recipients, + + /// + /// The X400-Trace header field. + /// + [HeaderName ("X400-Trace")] + X400Trace, + /// /// The X-Mailer header field. /// From cb114fbb08764121449cb9a0cc10976f690ae7fd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 30 Nov 2018 10:24:46 -0500 Subject: [PATCH 158/741] Minor fix to unstructured header folding logic If the first token we get to exceeds the SUGGESTED line length (78), don't add "\r\n " and then the token or we end up with: Subject: Instead, temporarily ignore the SUGGESTED line length (78) and forget the newline wrapping, thus producing: Subject: Partial fix for issue #451 --- MimeKit/Utils/Rfc2047.cs | 12 +++++++++--- UnitTests/HeaderTests.cs | 10 ++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/MimeKit/Utils/Rfc2047.cs b/MimeKit/Utils/Rfc2047.cs index 80638c827c..a588f41370 100644 --- a/MimeKit/Utils/Rfc2047.cs +++ b/MimeKit/Utils/Rfc2047.cs @@ -813,8 +813,9 @@ public static string DecodeText (byte[] text) static byte[] FoldTokens (FormatOptions options, IList tokens, string field, byte[] input) { - var output = new StringBuilder (input.Length + 2); + var output = new StringBuilder (input.Length + ((input.Length / options.MaxLineLength) * 2) + 2); int lineLength = field.Length + 2; + var firstToken = true; int lwsp = 0, tab = 0; Token token; @@ -845,6 +846,8 @@ static byte[] FoldTokens (FormatOptions options, IList tokens, string fie output.Append (' '); lineLength = 1; } + + firstToken = false; } else if (token.Encoding != ContentEncoding.Default) { string charset = token.CharsetCulture; @@ -857,7 +860,7 @@ static byte[] FoldTokens (FormatOptions options, IList tokens, string fie // break just before the last lwsp character output.Insert (lwsp, options.NewLine); lineLength = 1; - } else if (lineLength > 1) { + } else if (lineLength > 1 && !firstToken) { // force a line break... output.Append (options.NewLine); output.Append (' '); @@ -875,6 +878,7 @@ static byte[] FoldTokens (FormatOptions options, IList tokens, string fie output.Append ("?="); lineLength += token.Length + charset.Length + 7; + firstToken = false; lwsp = 0; tab = 0; } else if (lineLength + token.Length > options.MaxLineLength) { @@ -886,7 +890,7 @@ static byte[] FoldTokens (FormatOptions options, IList tokens, string fie // break just before the last lwsp character output.Insert (lwsp, options.NewLine); lineLength = 1; - } else if (lineLength > 1) { + } else if (lineLength > 1 && !firstToken) { // force a line break... output.Append (options.NewLine); output.Append (' '); @@ -913,6 +917,7 @@ static byte[] FoldTokens (FormatOptions options, IList tokens, string fie lineLength += token.Length; } + firstToken = false; lwsp = 0; tab = 0; } else { @@ -920,6 +925,7 @@ static byte[] FoldTokens (FormatOptions options, IList tokens, string fie output.Append ((char) input[n]); lineLength += token.Length; + firstToken = false; lwsp = 0; tab = 0; } diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index aab2279b01..480f9f1004 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -147,6 +147,16 @@ public void TestMessageIdHeaderFolding () Assert.AreEqual (expected, raw, "The folded Message-Id header does not match the expected value."); } + [Test] + public void TestSubjectHeaderFolding () + { + const string expected = " =?utf-8?b?0KLQtdGB0YLQvtCy0YvQuSDQt9Cw0LPQvtC70L7QstC+0Log0L/QuNGB0YzQvNCw?=\n"; + var header = new Header ("Subject", "Тестовый заголовок письма"); + var actual = ByteArrayToString (header.RawValue).Replace ("\r", ""); + + Assert.AreEqual (expected, actual); + } + static readonly string[] ReceivedHeaderValues = { " from thumper.bellcore.com by greenbush.bellcore.com (4.1/4.7)" + FormatOptions.Default.NewLine + "\tid for nsb; Fri, 29 Nov 91 07:13:33 EST", " from joyce.cs.su.oz.au by thumper.bellcore.com (4.1/4.7)" + FormatOptions.Default.NewLine + "\tid for nsb@greenbush; Fri, 29 Nov 91 07:11:57 EST", From af0ffd9f34fa03210ef92efd044f00ea93325fd4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 30 Nov 2018 11:00:27 -0500 Subject: [PATCH 159/741] Another similar fix for address headers. This concludes the fixes for issue #451 --- MimeKit/GroupAddress.cs | 10 +++++----- MimeKit/Header.cs | 2 +- MimeKit/InternetAddress.cs | 2 +- MimeKit/InternetAddressList.cs | 10 ++++++---- MimeKit/MailboxAddress.cs | 12 ++++++------ MimeKit/MimeMessage.cs | 6 +++--- MimeKit/Utils/StringBuilderExtensions.cs | 5 +++-- UnitTests/GroupAddressTests.cs | 7 +++++-- UnitTests/Utils/StringBuilderExtensionTests.cs | 2 +- 9 files changed, 31 insertions(+), 25 deletions(-) diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 96400a1b0d..d70876ef8d 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -130,7 +130,7 @@ public InternetAddressList Members { get; private set; } - internal override void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + internal override void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength) { if (!string.IsNullOrEmpty (Name)) { string name; @@ -145,11 +145,11 @@ internal override void Encode (FormatOptions options, StringBuilder builder, ref if (lineLength + name.Length > options.MaxLineLength) { if (name.Length > options.MaxLineLength) { // we need to break up the name... - builder.AppendFolded (options, name, ref lineLength); + builder.AppendFolded (options, firstToken, name, ref lineLength); } else { // the name itself is short enough to fit on a single line, // but only if we write it on a line by itself - if (lineLength > 1) { + if (!firstToken && lineLength > 1) { builder.LineWrap (options); lineLength = 1; } @@ -167,7 +167,7 @@ internal override void Encode (FormatOptions options, StringBuilder builder, ref builder.Append (": "); lineLength += 2; - Members.Encode (options, builder, ref lineLength); + Members.Encode (options, builder, false, ref lineLength); builder.Append (';'); lineLength++; @@ -199,7 +199,7 @@ public override string ToString (FormatOptions options, bool encode) if (encode) { int lineLength = 0; - Encode (options, builder, ref lineLength); + Encode (options, builder, true, ref lineLength); } else { builder.Append (Name); builder.Append (':'); diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index d31a5e7a04..8b1e9497fa 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -468,7 +468,7 @@ static byte[] EncodeAddressHeader (ParserOptions options, FormatOptions format, if (!InternetAddressList.TryParse (options, value, out list)) return (byte[]) format.NewLineBytes.Clone (); - list.Encode (format, encoded, ref lineLength); + list.Encode (format, encoded, true, ref lineLength); encoded.Append (format.NewLine); if (format.International) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 52217f45f1..3f9699d1bf 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -223,7 +223,7 @@ internal static string EncodeInternationalizedPhrase (string phrase) return phrase; } - internal abstract void Encode (FormatOptions options, StringBuilder builder, ref int lineLength); + internal abstract void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength); /// /// Returns a string representation of the , diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index 98106aa843..a44efc9359 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -466,13 +466,15 @@ public int CompareTo (InternetAddressList other) #endregion - internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + internal void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength) { for (int i = 0; i < list.Count; i++) { - if (i > 0) + if (i > 0) { builder.Append (", "); + lineLength += 2; + } - list[i].Encode (options, builder, ref lineLength); + list[i].Encode (options, builder, firstToken && i == 0, ref lineLength); } } @@ -495,7 +497,7 @@ public string ToString (FormatOptions options, bool encode) if (encode) { int lineLength = 0; - Encode (options, builder, ref lineLength); + Encode (options, builder, true, ref lineLength); return builder.ToString (); } diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index 7ff0dbd878..b6e45d915a 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -409,7 +409,7 @@ public static string DecodeAddrspec (string addrspec) #endif } - internal override void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + internal override void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength) { var route = Route.Encode (options); if (!string.IsNullOrEmpty (route)) @@ -434,11 +434,11 @@ internal override void Encode (FormatOptions options, StringBuilder builder, ref if (lineLength + name.Length > options.MaxLineLength) { if (name.Length > options.MaxLineLength) { // we need to break up the name... - builder.AppendFolded (options, name, ref lineLength); + builder.AppendFolded (options, firstToken, name, ref lineLength); } else { // the name itself is short enough to fit on a single line, // but only if we write it on a line by itself - if (lineLength > 1) { + if (!firstToken && lineLength > 1) { builder.LineWrap (options); lineLength = 1; } @@ -468,7 +468,7 @@ internal override void Encode (FormatOptions options, StringBuilder builder, ref builder.Append (addrspec); builder.Append ('>'); } else if (!string.IsNullOrEmpty (route)) { - if ((lineLength + route.Length + addrspec.Length + 2) > options.MaxLineLength) { + if (!firstToken && (lineLength + route.Length + addrspec.Length + 2) > options.MaxLineLength) { builder.Append (options.NewLine); builder.Append ("\t<"); lineLength = 2; @@ -484,7 +484,7 @@ internal override void Encode (FormatOptions options, StringBuilder builder, ref builder.Append (addrspec); builder.Append ('>'); } else { - if ((lineLength + addrspec.Length) > options.MaxLineLength) { + if (!firstToken && (lineLength + addrspec.Length) > options.MaxLineLength) { builder.LineWrap (options); lineLength = 1; } @@ -519,7 +519,7 @@ public override string ToString (FormatOptions options, bool encode) var builder = new StringBuilder (); int lineLength = 0; - Encode (options, builder, ref lineLength); + Encode (options, builder, true, ref lineLength); return builder.ToString (); } diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index a504a7c544..3aafdb6da8 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -408,7 +408,7 @@ public MailboxAddress Sender { var builder = new StringBuilder (" "); int len = "Sender: ".Length; - value.Encode (options, builder, ref len); + value.Encode (options, builder, true, ref len); builder.Append (options.NewLine); var raw = Encoding.UTF8.GetBytes (builder.ToString ()); @@ -443,7 +443,7 @@ public MailboxAddress ResentSender { var builder = new StringBuilder (" "); int len = "Resent-Sender: ".Length; - value.Encode (options, builder, ref len); + value.Encode (options, builder, true, ref len); builder.Append (options.NewLine); var raw = Encoding.UTF8.GetBytes (builder.ToString ()); @@ -2674,7 +2674,7 @@ void SerializeAddressList (string field, InternetAddressList list) var options = FormatOptions.Default; int lineLength = field.Length + 2; - list.Encode (options, builder, ref lineLength); + list.Encode (options, builder, true, ref lineLength); builder.Append (options.NewLine); var raw = Encoding.UTF8.GetBytes (builder.ToString ()); diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index 00a9caf00c..014911d245 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -44,7 +44,7 @@ public static StringBuilder LineWrap (this StringBuilder text, FormatOptions opt return text; } - public static StringBuilder AppendFolded (this StringBuilder text, FormatOptions options, string value, ref int lineLength) + public static StringBuilder AppendFolded (this StringBuilder text, FormatOptions options, bool firstToken, string value, ref int lineLength) { int wordIndex = 0; int lwspIndex; @@ -77,13 +77,14 @@ public static StringBuilder AppendFolded (this StringBuilder text, FormatOptions } int length = lwspIndex - wordIndex; - if (lineLength > 1 && (lineLength + length) > options.MaxLineLength) { + if (!firstToken && lineLength > 1 && (lineLength + length) > options.MaxLineLength) { text.LineWrap (options); lineLength = 1; } text.Append (value, wordIndex, length); lineLength += length; + firstToken = false; wordIndex = lwspIndex; while (wordIndex < value.Length && char.IsWhiteSpace (value[wordIndex])) diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 016dff0457..1b20ce0d51 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -143,7 +143,7 @@ static void AssertParse (string text) [Test] public void TestClone () { - const string encoded = "Group Name: First Name , Second Name ,\n Inner Group Name: First Inner Name , Second Inner Name\n\t;, Third Name ;"; + const string encoded = "Group Name: First Name , Second Name ,\n Inner Group Name: First Inner Name ,\n Second Inner Name ;, Third Name ;"; var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Unix; options.International = true; @@ -161,7 +161,10 @@ public void TestClone () var clone = group.Clone (); Assert.AreEqual (0, group.CompareTo (clone), "CompareTo"); - Assert.AreEqual (encoded, clone.ToString (options, true), "Encode"); + + var actual = clone.ToString (options, true); + + Assert.AreEqual (encoded, actual, "Encode"); } [Test] diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index 9fa7e12050..c8bd022dc2 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -67,7 +67,7 @@ public void TestAppendFoldedWithQuotedString () format.NewLineFormat = NewLineFormat.Unix; - builder.AppendFolded (format, "to it: \"and this is a \\\"quoted string\\\" that must not get broken up!\" Got it? Good. There should be another wrap in here...", ref lineLength); + builder.AppendFolded (format, false, "to it: \"and this is a \\\"quoted string\\\" that must not get broken up!\" Got it? Good. There should be another wrap in here...", ref lineLength); Assert.AreEqual (expected, builder.ToString ()); Assert.AreEqual (40, lineLength); From bc3cdb75fa7de9776b8b53e5c5ea8973206e7b83 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Dec 2018 13:37:26 -0500 Subject: [PATCH 160/741] bumped version to 2.1.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +++--- ReleaseNotes.md | 12 ++++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 23 ++++++++--------------- nuget/MimeKitLite.nuspec | 16 ++++------------ 7 files changed, 30 insertions(+), 33 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 00ddf98df5..d088628739 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.0.7 + 2.1.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index e33bbbacd3..c5c18abe7c 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.0.7 + 2.1.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 7872c880db..9d1d57b420 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.0.7.0")] -[assembly: AssemblyFileVersion ("2.0.7.0")] -[assembly: AssemblyVersion ("2.0.0.0")] +[assembly: AssemblyInformationalVersion ("2.1.0.0")] +[assembly: AssemblyFileVersion ("2.1.0.0")] +[assembly: AssemblyVersion ("2.1.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 3e172a1a60..d34add9ef0 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,17 @@ # Release Notes +### MimeKit 2.1.0 + +* Optimized SecureMimeCryptographyContext.Supports() and OpenPgpCryptographyContext.Supports() + implementations. +* Optimized the OptimizedOrdinalIgnoreCaseComparer even more. +* Fixed OpenPgpDigitalCertificate.ExpirationDate for PGP keys that never expire. +* Reduced string allocations in MultipartSigned.Verify() and MultipartEncrypted.Decrypt(). +* Fixed OpenPgpContext.Decrypt() to make sure to always clean up MemoryBlockStreams. +* Added a bunch more HeaderId enum values. +* Improved header folding logic for headers with long words. + (issue [#451](https://github.com/jstedfast/MimeKit/issues/451)) + ### MimeKit 2.0.7 * Fixed a bug in the UUEncoder. diff --git a/appveyor.yml b/appveyor.yml index ff9c882401..4933a05ee4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.0.7.{build} +version: 2.1.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 6255dff049..57f2010cc6 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.0.7 + 2.1.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,20 +25,13 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed a bug in the UUEncoder. -* Fixed a bug in MimeIterator.MoveTo(). -* Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single child. (issue #441) -* Modified TnefPart to no longer set the name parameter on the Content-Type header of extracted message bodies. (issue #435) -* Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file sharing violations if the application already has that file opened elsewhere. (issue #426) -* Improved address parser to handle "local-part (User Name)" style addresses. -* Updated the iOS and Android BouncyCastle dependency to 1.8.3. -* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442) -* Fixed WindowsSecureMimeContext.EncapsulatedSign (CmsSigner, ...) and Sign (CmsSigner, ...). -* Added SecureMimeContext.Import(string, string) to import passworded pk12 files. -* Improved MimeParser's support of Content-Length. -* Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the - stream does not have properly formatted headers. (issue #443) -* Added support for message/global. +* Optimized SecureMimeCryptographyContext.Supports() and OpenPgpCryptographyContext.Supports() implementations. +* Optimized the OptimizedOrdinalIgnoreCaseComparer even more. +* Fixed OpenPgpDigitalCertificate.ExpirationDate for PGP keys that never expire. +* Reduced string allocations in MultipartSigned.Verify() and MultipartEncrypted.Decrypt(). +* Fixed OpenPgpContext.Decrypt() to make sure to always clean up MemoryBlockStreams. +* Added a bunch more HeaderId enum values. +* Improved header folding logic for headers with long words. (issue #451) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index d74c530066..f3f7047658 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.0.7 + 2.1.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,17 +25,9 @@ An Open Source library for creating and parsing MIME messages. -* Fixed a bug in the UUEncoder. -* Fixed a bug in MimeIterator.MoveTo(). -* Modified BodyBuilder.ToMessageBody() to avoid returning a multipart/mixed with only a single child. (issue #441) -* Modified TnefPart to no longer set the name parameter on the Content-Type header of extracted message bodies. (issue #435) -* Fixed various locations that loaded content from files to use FileShare.Read so as to avoid file sharing violations if the application already has that file opened elsewhere. (issue #426) -* Improved address parser to handle "local-part (User Name)" style addresses. -* Modified TextPart.Text and GetText() to canonicalize the newlines. (issue #442) -* Improved MimeParser's support of Content-Length. -* Fixed MimeParser.ParseEntity() and MimeEntity.Load() to throw a FormatException if the - stream does not have properly formatted headers. (issue #443) -* Added support for message/global. +* Optimized the OptimizedOrdinalIgnoreCaseComparer even more. +* Added a bunch more HeaderId enum values. +* Improved header folding logic for headers with long words. (issue #451) Xamarin Inc. en-US From 3fe301388da6a8ce8b5737941622788fd6465699 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Dec 2018 14:02:16 -0500 Subject: [PATCH 161/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 8 ++++---- samples/DkimVerifier/DkimVerifier/app.config | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 4 ++-- .../MessageReader.Android/MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/App.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 8 ++++---- samples/MessageReader/MessageReader/packages.config | 4 ++-- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 4691437a85..15b6116a8d 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -29,11 +29,11 @@ x86 - - ..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll + + ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.0.7\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.1.0\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/app.config b/samples/DkimVerifier/DkimVerifier/app.config index 91378490c0..6cf307a37d 100644 --- a/samples/DkimVerifier/DkimVerifier/app.config +++ b/samples/DkimVerifier/DkimVerifier/app.config @@ -4,7 +4,7 @@ - + diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index d8b404ebe4..9a674c9c4a 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -1,6 +1,6 @@  - + - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index d28287dd16..1c320b2a0c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.0.7\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.1.0\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.0.7\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.1.0\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 7dfdf1d07c..2a199ee928 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index b46a92d839..6559322d9b 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.0.7\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.1.0\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.0.7\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.1.0\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 477682d55b..58eeb2b347 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/App.config b/samples/MessageReader/MessageReader/App.config index f62b55466a..7e74e1239f 100644 --- a/samples/MessageReader/MessageReader/App.config +++ b/samples/MessageReader/MessageReader/App.config @@ -7,7 +7,7 @@ - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 32b5d20f29..1be49b2051 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -32,11 +32,11 @@ 4 - - ..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll + + ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.0.7\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.1.0\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 6e7302803e..c7a236c8a1 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From 25f12c16e6b3d93006556a880f3c5f7f6fa7dc1c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Dec 2018 15:21:19 -0500 Subject: [PATCH 162/741] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3692ccf152..dc1f867659 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # MimeKit [![Join the chat at https://gitter.im/jstedfast/MimeKit](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jstedfast/MimeKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit) +[![NuGet Badge MimeKitLite](https://buildstats.info/nuget/MimeKitLite)](https://www.nuget.org/packages/MimeKitLite) | |Build Status|Code Coverage|Static Analysis| |-------------|:----------:|:-----------:|:-------------:| From f1bb464cb0f88c1694190f63d36569defb7ccc8d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Dec 2018 15:31:31 -0500 Subject: [PATCH 163/741] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dc1f867659..02c53d8713 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # MimeKit [![Join the chat at https://gitter.im/jstedfast/MimeKit](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jstedfast/MimeKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit) -[![NuGet Badge MimeKitLite](https://buildstats.info/nuget/MimeKitLite)](https://www.nuget.org/packages/MimeKitLite) -| |Build Status|Code Coverage|Static Analysis| -|-------------|:----------:|:-----------:|:-------------:| +| Package | Download | +|:----------|:--------:| +|**MimeKit**|[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit)| +|**MimeKitLite**|[![NuGet Badge MimeKitLite](https://buildstats.info/nuget/MimeKitLite)](https://www.nuget.org/packages/MimeKitLite)| + +| Platform |Build Status|Code Coverage|Static Analysis| +|:-------------|:----------:|:-----------:|:-------------:| |**Linux/Mac**|[![Build Status](https://travis-ci.org/jstedfast/MimeKit.svg)](https://travis-ci.org/jstedfast/MimeKit)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=master)](https://coveralls.io/r/jstedfast/MimeKit?branch=master)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| |**Windows** |[![Build Status](https://ci.appveyor.com/api/projects/status/07h7cobihqficw3s/branch/master?svg=true)](https://ci.appveyor.com/project/jstedfast/mimekit/branch/master)|[![Code Coverage](https://coveralls.io/repos/jstedfast/MimeKit/badge.svg?branch=master)](https://coveralls.io/r/jstedfast/MimeKit?branch=master)|[![Static Analysis](https://scan.coverity.com/projects/3201/badge.svg)](https://scan.coverity.com/projects/3201)| From 9eae8e1054a57955748276589356c66f4cb457df Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 8 Dec 2018 22:05:04 -0500 Subject: [PATCH 164/741] Added extracted tnef content to the unit tests --- .../MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.doc | Bin 0 -> 61952 bytes .../MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.pdf | Bin 0 -> 213685 bytes .../MAPI_ATTACH_DATA_OBJ/VIA_Nytt_14021.htm | 1914 +++++++++++++++++ .../tnef/MAPI_ATTACH_DATA_OBJ/message.rtf | Bin 0 -> 2429 bytes .../tnef/MAPI_OBJECT/Untitled_Attachment | Bin 0 -> 628240 bytes .../TestData/tnef/MAPI_OBJECT/message.rtf | Bin 0 -> 732 bytes UnitTests/TestData/tnef/body/message.html | 95 + .../tnef/data-before-name/AUTOEXEC.BAT | 0 .../TestData/tnef/data-before-name/CONFIG.SYS | 0 .../TestData/tnef/data-before-name/boot.ini | 6 + .../tnef/data-before-name/message.rtf | Bin 0 -> 163 bytes .../tnef/long-filename/allproductsmar2000.dat | 11 + .../TestData/tnef/long-filename/message.rtf | 26 + .../missing-filenames/TechlibDEC99-JAN00.doc | Bin 0 -> 34304 bytes .../tnef/missing-filenames/TechlibDEC99.doc | Bin 0 -> 33792 bytes .../tnef/missing-filenames/TechlibNOV99.doc | Bin 0 -> 33792 bytes .../tnef/missing-filenames/generpts.src | 1691 +++++++++++++++ .../tnef/missing-filenames/message.rtf | 20 + .../208225__5_seconds__Voice_Mail.mp3 | Bin 0 -> 10656 bytes .../tnef/multi-value-attribute/message.rtf | 33 + UnitTests/TestData/tnef/one-file/AUTHORS | 8 + UnitTests/TestData/tnef/rtf/message.rtf | Bin 0 -> 593 bytes UnitTests/TestData/tnef/triples/message.rtf | Bin 0 -> 247 bytes UnitTests/TestData/tnef/triples/message.txt | 1 + UnitTests/TestData/tnef/two-files/AUTHORS | 8 + UnitTests/TestData/tnef/two-files/README | 31 + .../tnef/unicode-mapi-attr-name/image001.png | Bin 0 -> 3815 bytes .../tnef/unicode-mapi-attr-name/image002.png | Bin 0 -> 3573 bytes .../tnef/unicode-mapi-attr-name/image003.png | Bin 0 -> 3792 bytes .../tnef/unicode-mapi-attr-name/message.html | 69 + .../unicode-mapi-attr-name/spaconsole2.cfg | 145 ++ .../tnef/unicode-mapi-attr/example.dat | Bin 0 -> 1024 bytes .../tnef/unicode-mapi-attr/message.html | 12 + .../tnef/winmail/Untitled Attachment.1 | Bin 0 -> 29200 bytes .../tnef/winmail/Untitled Attachment.2 | Bin 0 -> 68624 bytes UnitTests/TestData/tnef/winmail/message.rtf | 65 + 36 files changed, 4135 insertions(+) create mode 100644 UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.doc create mode 100644 UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.pdf create mode 100644 UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_14021.htm create mode 100644 UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/message.rtf create mode 100644 UnitTests/TestData/tnef/MAPI_OBJECT/Untitled_Attachment create mode 100644 UnitTests/TestData/tnef/MAPI_OBJECT/message.rtf create mode 100644 UnitTests/TestData/tnef/body/message.html create mode 100644 UnitTests/TestData/tnef/data-before-name/AUTOEXEC.BAT create mode 100644 UnitTests/TestData/tnef/data-before-name/CONFIG.SYS create mode 100644 UnitTests/TestData/tnef/data-before-name/boot.ini create mode 100644 UnitTests/TestData/tnef/data-before-name/message.rtf create mode 100644 UnitTests/TestData/tnef/long-filename/allproductsmar2000.dat create mode 100644 UnitTests/TestData/tnef/long-filename/message.rtf create mode 100644 UnitTests/TestData/tnef/missing-filenames/TechlibDEC99-JAN00.doc create mode 100644 UnitTests/TestData/tnef/missing-filenames/TechlibDEC99.doc create mode 100644 UnitTests/TestData/tnef/missing-filenames/TechlibNOV99.doc create mode 100644 UnitTests/TestData/tnef/missing-filenames/generpts.src create mode 100644 UnitTests/TestData/tnef/missing-filenames/message.rtf create mode 100644 UnitTests/TestData/tnef/multi-value-attribute/208225__5_seconds__Voice_Mail.mp3 create mode 100644 UnitTests/TestData/tnef/multi-value-attribute/message.rtf create mode 100644 UnitTests/TestData/tnef/one-file/AUTHORS create mode 100644 UnitTests/TestData/tnef/rtf/message.rtf create mode 100644 UnitTests/TestData/tnef/triples/message.rtf create mode 100644 UnitTests/TestData/tnef/triples/message.txt create mode 100644 UnitTests/TestData/tnef/two-files/AUTHORS create mode 100644 UnitTests/TestData/tnef/two-files/README create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name/image001.png create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name/image002.png create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name/image003.png create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name/message.html create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr-name/spaconsole2.cfg create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr/example.dat create mode 100644 UnitTests/TestData/tnef/unicode-mapi-attr/message.html create mode 100644 UnitTests/TestData/tnef/winmail/Untitled Attachment.1 create mode 100644 UnitTests/TestData/tnef/winmail/Untitled Attachment.2 create mode 100644 UnitTests/TestData/tnef/winmail/message.rtf diff --git a/UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.doc b/UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.doc new file mode 100644 index 0000000000000000000000000000000000000000..10c27787787f8ddac96408c56295aa3c86fb6f3a GIT binary patch literal 61952 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ⅅqq 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 literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.pdf b/UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/VIA_Nytt_1402.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef5e2b4ad5f941daf8142e48ba35eecadb6795f8 GIT binary patch literal 213685 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

u>uLyg5hEbr5a% zkOKQkgN>&ewZ>A+D%=zLsrO7LtBM=E$8tfB>$mj><|^3CtTrCI7}LN#rC#jNG1yWZ z{Oyq0Cwp>h;lU%x+SC<#s=^bHQVmVkZhMRVk4BmwmvwjlrP@0JM~oBkDaY1(*wsCb zg>bJZm;YCt+VMV;vh}W&|Lyx|9FO@i!jZv7;e!DQ&kcDIAwwvx;=4K2G^1R+)G~f$ z38u?~8D;7|?|QTH^1Nv~t)dwC7}mZwX>5hJllaQxx3UY;^Ws+iGkvU5-~<))x!MKp z1I|}c1A|(?8>pjgr8bCe33}`nbWfY)u%v4WScJ$N(~)RR!~un*;`4n~6*7`};DQbT z&q!(6rd@%m`pXi!yc3ckq8(sZE?l{`{1k(r&b9ZH*=<$aXLjR}ffxr%Myx)M$&*>t zaqvb^oVD_2Ux$w|=WPg+UJY8SG1kbJYJdx+arXxNmBN#5*~XL|)S9#M0%It$eOf1O%W>g#ec7aC%2rPKLsX;eAo)#03+~bGM+}N#e2;~i!GeH< zA;tI5bbL3%+fel{vk6d*8Nv6@LKGNVXl?kqe_HwYJYymKxac;GpoOtPX3o%UTOY`3i;&+Z{m>MeeY04z7S&F8PXUJ@+oEjs_uz zy*nm-Q)+^LcB7;a$>yQK9#=+p`p_;WlCM0pwq^HTRbH1~7hdmbE-_B>>9TFAc%mCg z=UWIr!1F7nwM_S=BRlD;aZE;TAq8nau}24S=bSxa_2D*EGQ6PLLtdW-0BrC9{XllX zaYs9_8JHr|Lwwtz-#>LFn^7|G!gjp_Jn`}c{qQ$6&hY|15m|miJYnbqZL|X3X~{r? z^0S@kXC1XO((JHA?Sf?qeX`7n4R-x=M!VIY@#+)R!Jyad)Z*-r{DObjUCwtez`2k& z8p*sXE_ul{>A*J3{zjImXi44_tnjW~hCiJ0EqA#h-!JNamwFcMeRp>6Amscp-=G({ z1cS#wKpi5BEt@zecv+P5Zw*iau-n`?PqxWOLzzp85lOemN|0X!8{x13^JkxU3Zzw{L}n2_Lom@oX|>?Z zd%zwHJndYX^E;?yaX)rpoH$87!!`8DNO8obZn>38&U{h&Q_k*r=hk)iw!8JSsY9#3 zHssFi4WThRiKOz4JHZ_Zl%F;53b-BYz<>N`o(ta(h{As@E)|cd7LNq&4auF37fhfh zTG!dIJIUBagDds8ft$@ehv^Tk_JE4%v+Xja_QbAUBUXtAI{bXV>bsde$~1g)Hhp1+ zEg&<)n2-iKrBoz(Qe+!(-y96u`truBSspdm7>ljp-_>`0VB!y}9-VVVv$s-np=()Y z5oeFilUDug&0FAsPmgwqN`KmK+!yUVu{`2JX}SWV>3{WMnJwkT$g6gWLddICN@(+c zd@`{3-6*V-YqyyC#7im^@ER2!6)n4@o^!(db;PN>^VBAEGURNxOC%c*m2eyjRiWOi z2fB3WYUd<3Gg+Rw9@@NRf7-1ZC#m`?TFRHNVXtkjyX0yD{Yz8FZ5nJs@$zBEWs9VW zqUOdE>5yvvi*i`edjzTVVzBWCP?0189tsJF?JUjSK0mR~E!#SD$nN|mk+>*yAb#3e zLZeZ@=ud&jc*YNa@aMONpRm%mJWNM@gBfq5fJ*YQ=7NrU?kwS(l4=@g6u=LH_C_;+ z`w5ayMXsS!=S6XR2J=dY%=iISMzkwmH>)TD)Hr_GzfG~gNmJBRW+^_uf&W`|ql(`y zRSsKGh=z}H(%3`*in=0vFf@N9&i;n91>zR(mDrfQNA?!^mDzP|px@p17;JZf^abV{ z*P2SA)vk4S3>U}?_y7kHn;}5Pk89cuxh8~e0|1MF0KNiQx6lc)Jv_zu#sK~8qrY<` zbA!qZj43>Cb%5TikK=?+gmw~#q@vOv)OYD{F^+fxfF{a7d_Y@rD7|{Y!f+pw_9iXu zO;2iSc#x9zR-V?zO-dUXArWCE0!ZxGtbE8N{hM?iElsy-1$2-Ld=TRQ7VZBg%>O0G z|7FdO4HMoC$Ut$h+y)y_7I}_Za#=RwR64nmOt31#9kxOcpBucON;sgBAsMBv9a2sV zkX7=_EurcJ$6jSnw;|w&-vWAsP(SYwRq#aN&nIl)O}9s(WI>GjBZ1(^Y}$YrOAz9@ zk4MOt0_f-OSoKT!m(kk`IR)BYojIF8>)0+%V7l%CI66pus#eg~T4 z{4S_0XI`;Rgq#$0YoO$pJ-uJx=+qo7TQvvYX^$@R2ruJ!i1gj7d-z!TA;-|*>>JK{ zRN9dUil;lc3#(h8Ml3c#j{-GpHcpQ+b=+jV0r1{B2|s!l7$gL$bd`bwjYBHiwsi5_ek03%%2`!C#EKK!oxZ|e92uLn z!sbf%pbShzj{@7((Vm!T;+;A5=9cv!zKH~x70V{RX@8^5Mj!F;l!@I&`-5B3k5+%{ z23~8e+oI9{-pyz*Q}mo>n-?Ezs}WUH3yfMj4_C|*)@~M{tFg}as9p1KI?=2NqxroN zq~1X1Mq@?oE7DR8C{DZAJK?YI`$d#p$tQT!eMeOOLZ+Y&sZG^6yft3h37iACV)x>f z091N_#nvc}q)o|TTP@oo0xav2Kwf_duX>S5eC~q2n;C|US-fZ;mN_G+B$iO{JOpkb z^O|WATRKtsj)WlkXbb!?I+@v~+R<2))1w}{E9ACuR;Fu2aiw9>hi9JfC4~v2GJNp( z#~&uU4l6jc>9D^iLQ`MGou<|1xO5q#{n+n(I&a#@8HJfeA{U z6flv{B`D)45|)A2(lU|yZPxuqUJXPL5+kV6h%jFGkXMH#zH6yoN}`9f{`PiY?}}cY z`;7oX_OS5q@UYi-C1~vA-xh^diz@*VA`%$Oot{kbNp^C#KfevWNvxRt6av{G1SV&D z%*@CJzVT!B_h5#Lo3VPIkw#H}35D>YjWFH9MI-dd%T?UDZuJIsI+PHmONE;(-g;RW z&zH$Lg2G;u?7~%|=!XghZZm%x1HtU107+z>+*b(Hw`{wy*KHcP9idw^qAIfCKB@nq zCN{b*ms|I=+P67Y+jT$koVK;eB>TFZ!Ihgx&LBOFH@P|9JoY;!m zwH9R7;O0@gfT1T8i&g%5IV20&+b5&A6F<3IuS=QTGweRyt3U3SI~YR?4qVbAv(>cv~{#K3?RT!RM#gT#>dQzjKsuvgD>OX z8H?H>`%a!-c_~1!%Phm+DmC{4Cs@m7Ze{-e;- z$E)^cd;9aBin;N%qEM}d--ywo*BoFO?**mnlmv%^x53txqnMMeOl=n@TPLuD-^)Z+L%g#rjDLj9|y zQ6tz8)Rr%?Ktw~DLCKzrlg^R0r))ns`o)k7;nM5gBaZ1dTiSifyv|7>Y@Z@LRDKRq zg_}JZNo(cCA}IF&=??7=L8Z6LRQy6!=Q|Z{pBljhv!BBNOBy_=L@6;RwJ~whY`R@) zx;xcSMCx`njzZ!91XNnnpwb-Zxe?LkuR^Df&j})15wZ5qnHkMGAiMe}Ju!!mjvc@4 z^NbMQ?p*c#TFwTap5OgXrP<05wQK+G3wOK^A)cKQ-rOcKuYNHay2;zvbMG$-176?< z*@_kUCBd2&L22QyKu4M$Am+! zYOKJN!hzcmCm@8VK8PI;ut5!MvagQyCkj(1#$^*xqV8RWnP?X--KvuqE6mDNT zrde~=+NOgLaIpg7~oqQ416CG#_GjC<6@RKgQ`-n==< zj*uz`?cXntb!c(sY(xaj#5)SR2{6pE17{qB_0)0h6hsKM;(uJOv(?L`PH7JDC9Z&F z_ePl~OuyZ$szw@rx~ZNIf4F=jdx^-#6=TlZw#fIuHZmfRa+lf_tI%g?5|FH%Kxk18=~9i?$#9sV?X6jgv0RSE+7 z0C4($H8XtisbD+ZsnzT~fQO51(&tVz#^URoAsq4Kt?q(rJjpEC1-O5&a6bt;FT~X% zs7Ke6;-|-DVm@Tf5>fusD08ovam2o$u6a!xgxd@aPud3NUu7Zd{n7O{?#@0#q^QG(M#HDcs&w4C{DMFwr930_4o}pJ4CgS{d_1ULu8O+Mx*|Z^HZv2ciJmI788oevYLn`ir!VICfx; zuB)e7Cx{;5$<42O)s}5|(ZAbVmcJ-py)nLmk^Tn})GfcQki{)EtRaSkxu-;2@j%k?VK*+8iZ@9LpZKyEMcs7aIZkW=~S4CE7rcqdk#KQGdHSo43Ge!DB`iQWpoDfatc~slR1~3_O4*@pX~t|$ zrF?-W3jzgNg;_OvsIM~|d~qNUf={~4*QO3bnke+T?m#_xVr-|owQQ#dd=G>mWKM6Kg8$XrFpe-mEFmNz8Xu7NvD(saqjxPdF~|J< ztG7eDC}av5QVudj;jgXoDHF->G;{Z0ziU901vBLL5G0lg7uDnS6ef3?QZCoP>eYyx z;9??SAa^}8uq3)>!ej3@_yKTu#C`csS-?0x@S%fOdxQJA!|v_;Xy1Uui|Rz?ogh>< zY})cqe{i|0!wEvSpTQYMPdSyck{h1^gd7>(c{Ibj9T3L&+f$3G@hC0cLL}inO5{pH3Q&h9jJS!vt z0gLHu_H|#$_kGXo_WRezKZ@S#y}WAVk$rH3ZS5Y52QXsGe9zl7Ope z!Bu&d<&!pBv*lnbWPPihXp8;6o2N)2<|4FBf~|e_?rZP z@q4RP?bR5qF{_#{C5$v<#Y*B(9Q3lGxu-Q7+V=qsfOqHNioi02%$ znEf)UL3|57+fv(tUeQ%J=aqQOAf5B`%x}eJtc$W2Pe0Lvv9q#rr-y=a)aXGY3!-E# z@L@VuyS|$&E4!=lmpHyo=FXlj%5gxfrM+pG@J!$MR}ilMA$! z(}veRhH76W=heQp+eeGviHXNE;*1w$ovQ6st{U0n-#8yLovT)t(~x^=Xf3E%BCa$} zo_nwtgx@+Z(*aUgJ#yb!y_8e%YvtWXJMkKhu1C%Bx6w`RTekW1Q^-(*wsHn*+7O>Z zQ{yTsU1l}Fz$IDp!8LAP1vo2;OQ$8=Q*q^!U6Rr-r~|?v*(~rbOnk#i>QpJgQ6?ju zESZAFM4w46>npkb?SbxwP-Q0CDo<{sG!qtz0=HD+?TWs3OQn}bQ8fv3+JcN9!P=n! zMMRcSo(ykpR*-XgKsP3B(n#MoMg83&@vdZA&X>Ygs%#qgE&~EK{!nqOVB z!guS-nYp`uPcwF6xYyKjaMM{H#{AnHp2ywsJ{;ah^*c3aFINu1oZ|3E zFV250nwyTPj&W7UAEp^?II1nFk_xBN&KSfig+FMh>6{V$NQ{h)*&l8*>h<=W+9XQF#Jazimu|; z(AC!M0;G7;744ZNuHTe0Uc`7_Qf5fe-eWeG!7uxMXUyK;IFIse+nce^;9A^cmjB>Q zS$OlYU8f)K@tg$R3HQaBJwYZ(z4l7Y&$hKA#lpzKr6#xdO%)Q1qtRHi)*e4ja&K|9 z_s|cDG#;B_xT%M=bfadC*;(J6XyGKj>)2qkx|9KpM5C89^y`!^W@by5J@?}v$563y zs@VKrw0#9smCg1y-CZJi=#cJ~E&=HjrMp`MX+=^}QVHn>DM=-yO97FPQUnPDL;>X+ zKz-GF?)P%8>%Z1r_dSn?v-kXV&7M7b=EZE_bWy8c=Ji9bbI7sZM_3i!oycM1Xqz zfH?zAR9vmC%YFta*XzyG+`~P8U6O}3f|Oa5x{*`OEBqAcG=8)=jb|xvKT7pApvO#x z;Mft$iY93A7l@YGUDg>_9N(-Yl(>2Cd2q{{tC0^rxypHp3l61*aJP}Z=`_XX%{kkR zsuHVA6*>^lcGV*4Oa_(Sm{JO*Qcgi~VUF(Lxq^6c%c%EXLJNCjb7^_#21-RQ_t9}v z#fH+yaT5~6bBmXL>IsfFA!1mdHzb-Gx`(Z}5fdscg2)=6S(tO~j(_ARYYp=^tgYZP zZ!A@A;4lQ059M7ih+GjHF|2SeyOBH;Vtfu;gzSagaB;->G8cIy za_O>fU^6_#yz9dUGwv$`)b*uVQ65P<&%$)tkjAZjEM&0 zg~kL#JhpMG*YTemFfl$B-rnh`b$?yp_1X4Hk5ls*++e%Sz}*~dmKT-SGDM6JDa=A# zQ{38bS`8hk8#D@I*}?+C12J{+-pWp@bxH6d6!sm+ef{c*lN(t+Qy1cPoo1{LxgTO& zkmpB;)gTR<%bqJxA=KH_BCj+Wf8F zYWSJ*8wooyJ=~v5~_DKcDfe z;F3mnn0axEQ!G_GC)M_6Bzvse;WJ;KS5v$7r4-$7nO6ume0qz~aXNfs2;It8mBFZ2 zJpSdwSKNE9Ud~V0xcjeHEv+7)ALPZ{`M`uS^!4UuakS%N^U|=p^}bu3xv0dn_sRu7 zYp`6}=u~oGs^jcMejJ`|MdQpxApK@KD~cZ>nmg-U9s-7es0e9ZVHOg68Aj;H{mR=d zL`6}zaG!qW+URI?pytuZBpJmGvP(zXe`$=C`e5q%=GL{LBKYWl!MlJed=(;TIZqdvR=HR9VX>vcCa94&BPJfC(YyqjuIZ;vAK`Z;ioH@!V4_~- z@ICRv((29waEa<|#OCJ*BWll4yGQu-{W;`xed@$4u?t1yY%XOl+2LriH$S`mAkloG zRo|{A=_$OY`5Czm^O%xaG;O7MFH* zGFs%7-(Jk6500!pj-6WB&iboQL;B5-V(ww_Tx4Mh4%nHvk-re6(&|Lq^y%@f&GNP2 zkG0A#ECfC_ikuHHfl!p*!j3?)t$I;nCm-;v_Vsp>TWkk)d_d-F!NUU*1-Y&<1XU^{ z2Qs5w-`xAp#=Y1VUwn0BFZoawxsUtY!74)OK~wJ5v%KJLxS+^ zux7P!XP4e4e_H(7Yu*}5dnUK0)8TnFx^u+!m|l3_c0ov7McU=O`u$I1*ZlW8@^^G* zQz=bT$k#F6okbz(memo9A=UFzb%UfSS&Gs;XW&wfL3XX2Fp(qzubK;9CO|^((h%Ta zj4zj^O$|>MjvT>D3blB=KxX-jyHb+|z1yUZjNsXRBMaRCUO_(3ZoHj(c*q0;Um(+V zq+zeUT#`^(@Pf)4jFb_f_}zSJdY52lyyr;g_{0!*l^uqM2iZ$IYi_)@-m6Dwhnq9@ zL4Vla;6H7;|2~sITo1ulw0v^M>(a0nuHT9l%Lp10`n(n$)*GtTOYlvHE1aIfm*gqu z*M}Cad~?z=w(pXt52;JGH0;ct^YdiJ{~YwBKT+W>`AdDeiIxB@4BxWWO7!`}j`ba# zvtM3yJ<93mPSh>4##y25b+Hqa7}a>S*tkqRwAv?U$&S&g=WkpOL6Du+<7tse6~CZXHxBF8n|9%d^otli|t1KrDH&JhUGPdcdwFVs#sex%Lj7h3DJGhK8M<5 z9Yf|Z8;f(;B$HTI)m=56y|(j<1ofT>vd>Xt*WEj?y6}G1Ioxv#ycuh4`J&q5n{oS>WWKhp@4meQucOpCkah3tH()67Mue8KcL%CG$fav9XtQ1sXW7QgtHv=GfCw2Xv!RGuyH0<^H-AR(;2upc*-UWL zJ1)}IvkvM5k4KzgjUiNpMwC z1m|lL``P>N$}0`)WJ!|vFTH|=mL*sW@__> z8{+Cj75JQXc<}8L8th0{9rIulTf{X7nV33e-qec!5$xA#VxbiOgCc-yFkgz@2K_;Rfyd!$~w`r)^p*1E(iL*KT=EvLT( z){@oxzmpGe=Yt%&UV9xzC(omah&Bf&eo(#u`C$5#-2$oaCAu&A)Z3i*@b8_;r#Pc> z6jDk{dvc}7ZSSzsFT%mydPkE^NghQM#@gqP@F`jEvk;wgJ44UXtE(YFVz;`{9n9Dy zU+3KPzADzN5cPoyRpUVdt&$iGccYASLZbgOfk^J0_HzA9Du(n6FF(!f;!zF0jo^DA zcfeUuk|)=suv15s*NlZDVI668j#{QNLknNLU|(xIlgyLg#@+K1%_x$o!7&7T$^r4w_5DjzQzfr(FsYY(zoz?=x!;msU3&U@QVoj~ zhvWL}2OqnJ=7F;wj;~_*Ldh4W@Xb6s>sRjgk+53N!8iAPe&AL}KfHo&o$ux7c&~Z3 zX0m12ef+D@HmBh1m07*#Y6+B^5`6QFHHuz@-)z_vE@iuN%n)ou;3!Z(q`pe^npsaO z`Rogd7{1pZs3!EmZA>n*HpS%?S2Tx(80ZLTmEz)zvFO|dBHQ_buJ=WCh$%bM=p-=r z5Moub=DPT$1qq$wF&^M@&p2xyh4opf%aEEN(e4suyqYkw@%eEcZ0gD4{<29~!x9YY zsC=zp+9=HX?Si8S{gv->UyC1_w!JV@CeOi3HYVLzg6K4 zF5}C;^>*qfhnI@x7O!u+*6KdoSg^6Xe|d#4wIe-3_P$%d_2;%liGq^D=3nP#mRYic z#$&#IP-dgA$TQI8pKEtelnCWwG)Oe-q9GVS>q4|(KAS7Dj1iZLeXrv!tDEM|0%<6& zMqq>QL#Y52f&jX$o-c!6bo0DWg9Qs-DKwhgrn)xlIFcHfPt=)@^wp{Nwn6>=z|2@B zpA47vGSS5cld9OLmo5)G)U!XSvT?T7;n--XF6g)Ao<3uw7lqGYy-;}T%u<^lC6z{f zbYlI=+d<^m6%Nc~ALF3f_jDzh1`|~U=S2;M*_5O&tjS*>Sa54tgV5Y{0p~|b6-fK7 zU3pjGyOeI`*z}~(;K#(U(vvx&jFLy$T`psM%oXJ>EbDm2!z*%9(>B|ueCF!N@@s=+ z%WTIhu8kB6AG$uc`vtEcNeomh3%+CWVYs(a<&BAlKh-SJ)T|kG%e^xjqz}qFs^O zM5awg_`hU!Eetg8h*r0`yx*xCtGEm;zxL@?5_!%cnn68Q*8T8WZ`pp#sQT-#2eI9JJ7ODYJvD2zx!Now z`e@77)1R9^)3GL#d0vTtL#Y)S^(5Y-&(nYq-Edry3eHNZR+O1GlPfAu!n63kx@oo* zL#VJ#yXNJ5wpEPg8H$UY*3>VXtlZ!2Xh`HR7{zd2U&mkJI{ZB4PHuF5);8N7MUcPs z>4TL{r>?wBliltzrX@46xvKG9`BLi_wr;eW%igjS9g(a<-FN(`N(+)gE(i{ZDa?I) zj!9vV-LuHSd`%Knx9~+lgu&jM7nc*j{blE~Vrd>#Wk`(8VY22tzJ8A-UtHxb>RpPd zYpJ%V?uT$|ulv5_fBgFSq5`9q7_XMSDeG9)xLdBd<6TJ105^ug_{K~ z&!X)7E5*MJ*2g=HsJDAt`}Ur3%GzWfPVm| zcmcaGAD{5hYZ+1& zB@Bhv?>7_!UVz96FF^kU4&Vq30HFKH4)D6+8wt1oc2F1zL%Eju4^TfvcLECV0w@3r zK=VX&zse2Z1tS4tgU0LE%bCC1IX^T|vA5!Z3IIDm3Wy8v0>T7L0Xo17umEEKpa3FU zLvv`1pq*A1_)SxQ8W=yI4`g`43s44J055Ob?8_C9l!$62S857 z4A`Au0hVxLa)1%w`;!+mM$m%8?^wVH0T)0Va5>S@2?~Jmggy}0|Ca@n$iVkIi=Q?C z1OylXf`A1e4uF911Ev7Zi8=seXegjW0AB9jGy+gqnI@f#|3o!_1z?nPy9A(vMiYwH z|6#hokigHu*nqVF2!I8U0}u-!7@-r`>Km2gj3GP zLqW^K)WZ^j&8Z~?u`+dVKl*r4{pUw#m!BUms;dHz#^#h(;DK<;T3VTUI(UFb9U0Bv zp0$5}RMh_Uk7cAF+~7CnrpN!$QZ;qAhj6MnI~{SAQqua#OIr2lpWPfy9l#gb7a$&P zp5RX;Bp}$9P8QB)cGx_^zl4{6fujY+&B4WUMCrG&{X&kH3rY~-75uN-1qK9+=ESjq zGJs%WnxS0MAGXlf` z3qTOC01j|srYF{U;$VQ$2?P*IfX$tF{(qV*FBg=k@dq5h3mEH97JwaK0aycQC(Z`O z01%yc2s9Q@;>909_5=w2A~h*cA^5H7a%3T z2zY_)1mq|u2@2qHl9mBpU?l&A{x1=P^GA~RXOQ&) zbimJnpa5|I;UpXTnTLT437`Pt0vQ-I2)}ssPZqqtx#5YpfQZ2O0WU!LL{=w>9RLDk z1z13*&ke=R|4_#Xd?2Nt5RMR;8v;gvBcKmN2RNRf0L}u&1B3AS z0$2c=Cn+Nk8DIyv1CD?);0Uk)rT^pz#s-buzXt&@)Dw0`su5HGOaUUm?l|8P1Y`l1 z6OI7mNiGgX0*x1xAn=EWo`~_pk^#FDO#v2w*9lX=>jWCW1;G9nMo>b*A0`cG0xn>* z-=%kK4<{%9UVsi@0jR+MpaFpr0saX4z`=oQgGlnz@j-Y2kq1Nr5CK4N0PzPJWhjpS zN1OzdK^Q!l;7^F3ghW93Bvu1PAUg!y!2}PD1r&e(LklO77Fg-Y_yJ`wi2#`ZvH$|0 z4qtqKp!YVSXu=NaULjM|A!R;69R_x$Fl9jM1lPPiGir{U#*A-il_7P{pRU_{!ij3 z&JJh-`v-1#LK)hyp?LHk%UvK4AcUW41@ZtE1#}9e0j59TRwt7bkPMI#(9Vhcfl@%? z2v)oxgLJl^g~l3+gA4v1hk=WMk)H$#;Oqe4Nn{2~Xt10<%1X7|flGdm|Hn&l;Nw6D zU{pW?K-d625Gge7zk2;irmBC@%+Au>1H!50Y36a9yDB-FT7wi;&(^}j2Eq*jE2pBR zt+kB@1Z0Ms(zYJ%>XvRY&W#S(KVF{$;o}$L zhj2o>wd*KJboX$xGIHm=e56HQN!>3457v|DkClBklbdoHDTWqg+6)g7X zY@;D zc*p0f`qgqROoYVB9IqKY7%nyRA3h6=kYm3d5yKxYE;wPc{e&h>)R)`){oolb`>-$B z1mC1w?ml>5{bt><0V{%dU9T|c3X|@m=VGDQ9y^sbFB%*i(z{X0Z*6#X%%F^9(hl5A z)+l@~>GJ^n4(3O^{JzR|`5L~<#9mKIjke}4KIK)o*EQO|=0pka8Gg%O#(&geosMSu z8gezFd2t#_ny zM}*fFb_L>4b+*UhsH1S=apmw%qPPUTx1XH7v%c7Sa6!TZ7ruH)xa}l;QaKKT9ybNxY4bzDDHr<(#C0 z`qLK=*eWeAX|pgG`3PlA51j2nFix)~?=nF!wpnGB;^#w~11l@68!kI$ZY=-!@H78Vjr~J}bOdi)T#Vu#_w}o1_%I(T;cp z!tWqvNtk(qnMbS$h4%qll0c^7=3|_CHuFQ-SxN+v`F*e$=_I(Uh&Ws8cQYj_n*K_?u~>w`LtEW%v)E;ts4%ddT~Wv1R`K})~^ z{X;*c@~85P7tc01g-oLCs&qC5G#@^+3~I8q+_3z@zT$K#s7zub2t8oBW&!e)Smd}wj)kQZ7OW)f_s+wlL<7JX?k@RdoqEe?NCGxH?14_%{ z!eoVko;=YevDn;K>gcylt>bPM1+C>>-wrw?PL__)eux+o)B3HAB|n#pj$f-+ZY;Ji9MM2*{dB zF4$5^OH#~E>=K6ZOYz3lT{m}^y?f`X(;Omk>o+#o$?sogopKMzi)Xk{N`B#BXs%k+ zl}O(7xnph9ot63}uH_Dw1NVCWPx;?oZ*P@NTs+)kk3!k#pRjyuOe%Nyl}>}8SiP9} zK;{)H8O{6wiqhu&-J}6GIVFLsx0>d$!^4}AW8OCGPqLi(Dx%_}Hjh+J=(6QOF*$qQ zs53ilvPgO1d_{=|e_KuoYZq>)rqv>4(xJVrv(5$I2PqEK1?s9{;(V;g>fRxC<4PmZ zYT}Zw_usi9zI1)-&4$rjyySHz8lK71ACo7przItLw|{Hx|+Ooj>P zsoCylA{mdn$68cpJTopJ(?&d#zJyx7g&k!4hE2Ah_?(};8Xi|eguhnv3~2_9MN-Is zJ;lScz`PKPgxlxIN|hQ!Q8xYbQ1;!QAkxAQrGKOzRtxd3Uwh^pi^%Ch^4eF5q#9NH zz)(YJaTgf_6+?@TwDop`r4YxES5;vh0C*mPF~4P>Cnl4*)Ru`2s5@7mcm`g3 zfJeEe#*ABAkDzWtmZ)TG3kdIp~`blZ~4~B0h0N zd#$_!R3dKvDHs_|T{ARn_iq~Y_q2ATX&$Dr=G_qbD4m}e{)AbJrU2oNNUwT$ssx5?9X43^c_HW53o zynD{ng~#DCGcEV#!tjNH% zc5mK~P+O329X^NV_ia?#gNRb&wsg(TAdMVfu;%uwP!TL&qG-wwmhBbqW^aFB!kIMTiPvLRk%k*53bYhF@+A{xUCttP{I8vr0e|%1;Ka6@t=Ci z(j#^gZwIyQQ8XI`ZgJ#_t|q*Yv#L{!Z@;k`y~aCkD}6;9DV|C~SHpwGfDpAlA! zmi691)VR$#v($fYlj=t9XV+~XWQV=T7HPX7G;1yKqqe2|w{=R(e`W>=ODm%h?jDEtGn3Y2xg}pCW@GR%@rVBkn|4hM%FQ7H;8p?bf zf4x2B+|1ggQ11K52F)SyEM;4e(o1b#agw;fm2`b#`jyYCUA!JL)uHI6D%Yj<5a%$* z)n>NR@|4pC8y9L^rol_cbrdPtYBsp5`dKst0oS1^z+;)Jkt1t6d1UsIom}e2ce}he zSZVpF8aD5PAP0U+E zhD3uAh1g)*E=L~U*tEB*`y(~S=erj(nibhF`_2!oZANtotS zQ1w=oZdpuatf*_)@;uiea`J99i6BHwoA74-R*}?NaJ_cTH#TyF`0<13e@#m4(l_llXq?29lk5lxmL61i{GH~HmH}+#3>mU+w*m$m|Qrk zdVbPf#(1;$m#eDjJ!+wftgPWV>O#y>E7-OCin$MHlIUe9yVrB2NXFEi8J%6x54nTOn`P4;?uBb>nu#ey+Sr`n)63NAJgim+pPslG2H(K%RPWO9$EN zYh}#lmpS~g=|?WOAv2=$HynigTpkTvk&suxDW@U(%Esg2kgNG>F@Rx<1+%=6le{&* z>TUvNW6d4XSFy&40TZ}bg!>8(V_va$q8%l=?#uK!if48bAPD)<0a^w}YofHAx8T60b^3Riq$%%9W zGg7(KrT8QKuRn-vYM8cIswp5P{6;?ZGB@EBrrGs76ba(V-E@wQW;`s7ocP_6E38yV z*653P5d>$5D8-t}ukL=@m};u2kG!?BuwI{#z|P1(Bc}&VBO+duIeVAI+ZOJV5S>TBy4655fHbPl zs=G~sm1{QT>me>(EQRX7k}mezQ@-J97*Pm2Jk?DX%x zC74G!=E3_4b))N9AO3Y_dyCD`eIKpb6y&BVI<}gPeyWFl9tP(rw-f^~GMr`_F`lqk z$!&bvhNxTG8+A|PwtbAoF~}!R|B#0`Uqz`#8l>5u_z3->HA^E|O0h|z#QQA4Yy3Sz zFDhb(#wRQY$-EkDe9iJ2JH6KmqtFtZ1q7~xQ=ycXKMcH5Kol9xmo<*`K{x+wk?_bU z7sU)g-=@rJODg%%H$7Cr3jQb~%m~OzTTyJDysl`tWMJw!^rB1rP9L@kJ{3>bzqpOv zH0wvNnz~aU?a*!CZFBo6>JsWsK{Rr6p??6=k`)gF%TvjO5+{x|k4X8DW-jJ2&$|yq z8=mmUp)%E>m{u42@QPiJDJMRA&+IxDz>SV6{FzCnhr3!eE~1AAbKW z);kSULjM{rfl$+^LA z3hwq+(l;F;&NE{lV_HP&Qsd)GMyJ>(vxMntFS)Z9D=~KEX^=-p*3ALiRGCbcg9`shWo~YrWU%U{8CUqO> zP39t}H){{3d&rjvyW}y^Gky(rN-|+Dm|v#k(BQ7=y`ikeVVHT)7tC7G-bApj_Gs;P z&49xA)r;(U1|-<4uZRMNJ}E>w8r>9qL|A2a#kXcQ+*pT^dG#JSwRTSSywTat|u^#Y?;h{8zg^2~yC z^b5;pVjyBn@O!=*(rv(PU+BSUQcR)J(?a_^yQ}^gsAN|cv{Ng zG|XGl+0{W|^Ci^Q5A1x;331?ibkXapt7N=q*Y|ziuT*q_)j?wUx`JT%ng|-=J8dn9j16tP8|1=+`WY?Bf#zby=#IZ z4uR%0%U)dto@J0Vf*em*^8m4$j|rng@~9NXBgFlFFXpBKkV)YVzWF|YR+9R)P<*PA z6xbB~UXTKx{$vHx0%KGoRy zevX~{e;7OX^}kor(so_+BpjzEjQ1^K13|R0#g5W&RK1=LO~l z0|I$_Ib=Nevy$5zZv_M45aCKzaGpa0@oRnlR3N}s+Ybl$Ur+!oo(cuG^+W?S zl$5hgA_g3pHO0t`Xm}=Y2Mu_^P>}Hcx*2dfB>%Yb|A2(=RE6cf!DfE{u{3~0Qd3I< zAzWo3ihXeQ&X55zQO2>SupcRhGZAkB8l+$MA5I79uRNSj@HEOff^?#sr%Yv|+KF(q zdQ2AxdCk$xS2J`ZS+as>28`g~QQ$(V2%v4v0XzPuso`{>{>tnOvlJeSaJnB*)Xn$Ip1BQB} zJ2*zd_s}51ynzF@=>8&F2%Kul0a4p@b@>j3Ah_;(vUhBzbKv<{FM%RL+?}TMk_1ab zMTk05I3F=X;QFVv%UO$+^NZgtRMDHT5E@FDa{{m__yZ+S>AxlgT)!s;+&rfWihcu+ za1dy)kkqYSAOr`OmLDD#kxYbaKDvW$`{q7;R=9%fxS0wOV%Eo?N1Cm8^p;^!af}!{ z=Tn9>dxMhh@#kG~RyLH|At$EVx$(T}?m(`6@YSll+GoD3PyN^EGNQOXOkDd`;y)Nm zU3T@-b*KK#%S`(V?Co$%F=$YQ1atDi3zHjj3;(f`cdE<@t6Pcy4uXcry+KQ|bGVgs zfze!97EjU{%-K5TrfW01AQMCvhAV)kb(j+pUfA6CxD`$FpRLJL0ix(R2Gk+RtzLW> zP#M+esOwNopM7PTL^$~B2-BJba8~RVxHf2jV9rm#`-*;;@o6SR@V290b6dVsIV;wa zUU)b>ETs0zn`nE^danh!&4P2zD5jcNIT4XHkqr6gakj%@*T4-yLj-fO!Ux+F&wV7a zUsQCeDIV)l5InFs1TJi@!M(%TnSndxLZJ{eS8J=)+p4Nwvp)J)Kn{a`+~`!0C?4IyKXN0kXPRqmhjng@x}^dkywz`zitYw?3I;aT#cUFq zz!Cbx6GDRobJhYDNw7fTKJwIGv~;TIX=Y+!W@Tz>Vrgk^ZEkLkGzMvhN6NTVs@^_0 z*wfMfq^F|?7bKU&BJgLRVS+hn;e#zW95=B2g6UMt6|4?)oMSZ+uiWlGJk(9|7+@fG zL(9ADUci5&J}Zv$0fmka%NG#yAXD%+puvJUW#NY{L~#FMeW!v&^e6~F5Q2v&CEfh4 za3r7+t4UR}etZ5>ZUj=HeK+30-u~nZJ4FTHRA+kN382A(IZXlWRWMoL5d&DYCH6=O z0YpAT$s+BC^M}Kpyu5JfNPdl^^l=6{Uvy9zHYS88t1Lc&1e2N+-Uu2jnDY{T*kT3u z?|I3QTmF0IeCZLGp^jjU^5yj%-m|~7A>cu}%BA=|>dOVCXPV>r_pr9lwZqX?z`H`j z1alg}|4*<0O8eJbi~GpL|4|j_vpNl?er|+72*C981{#_A;i183+_bX{q?guhxcHMW zNx`h5OiS!Jt;$7R8wnDt`_t6-_;Y-NSIlujL-l}J)+Zs_K*I`ih5@Vojw0_rSV05q zDX>yJf+q-spdqy{3vq=Gd^^-<@~&W1M|k};AGt$;QKq-=CEY7uIQLe2gOKY+02~uK zd>S-xFlQUE`rJ_n{sr8r(kHB*NASm?gaLhyw(zUoxsMr34sK)qNoS3h?qVVglx;{= zud82dFvP*WMG`IW*@LkYoOlwtJ3&R7ymn}juI+F zF2`)h;^9{DSsq3>viZcvy)JoXIy!3$=WEOM6VH}|x(P`VJQ*}t|JNA^&mZysRCSY+ z48+ph+!7T5$ID9%Z*Zuqs|%aN)Dl%otl94XA-LJ$XzfiF32y=o6znMoY|;O?+w~s@ zJ6$p81eApdfMtqk>LnoH#fXDrl?8`ZSsl#9%XCH%mx=SJgpJ<-_Zb=}m=h3KGx|T) zD5naE$DmA1L8iC@XR79J$Nc;kYG+eU|e<` zcRl~2r&B?q=zMgN(O2csKK}N0?Tg|KRo;=_i-!0{=y{0omkWybF}UDx*x{C;L4rB) zfNg2aE&Rv2>r|68(2|LnRS<%eu7DSg8i%f~u7IwUl`fYF(9kPnpdhR>aJ|sbz?^cx zTDkb$=6FvP^vq0-7ARJxR#ujlW=D$@)OgAEZj3x(p+ce>FKv_MNH{oXsg$vh8D$mB2E8 z&ek`i8k25iyEzni296jm37#0S_JQ6m0$2&yOkhH5cY+If#lS~^C zrePPhlU@l0RpjK?n*Z|4`fMrf{IP?Ajc&z5D!)sr77`2lU6tXwZ5bi(26m`(l)x zDmIV8se>?db-|pMa07wEP{H~W6cEY3d)9YQz!pKRAJ`(;>VQ~m&T0B1GN(``&0L$^O)w`Vf4L_LeDmKC*_9RAfd5r&4h}Y3+HT^=N_GQdoYLr(bUoTaeAT`vZZYy&S_)YmbM+R={y<4;K!!vXvn0 z6EkeZ{Xcy7Xq9w|X{@MK;M(gYU_@Ut6TqfCTP7RmhM7emL;@+st~(wlGagv^+Q7h^R)bz znc%641V@NYbfd*oI&sw5{nN zlaY@1g&qE*V1bBBgbfWJ?DPCz1q*>w&6Xf&TbXXgB@5LupPL5AdV1Q&dXM_(dft8d z09UOggAhcoj;)T@<5aSS!U{w&d}5+Pw+W%Oo(aO75x`n3`MoZD%3_J%fB{Yi1Pf`z zB=&-4I#Sx$K6NeP*HzjbB}npnHl@UN%NrL+N~g!K5^+b=vf;sD&~N(n?Jq3ClXCH> z+>e_V3~n-P*u49M?*ftv1(~h(8=FO&6gwNm_7oEZ$G0B269=CcUOBvK+q>QvP^>jI zRJ8l;^Td_Aps1wJgc%6U7+}smV6BiHd6OoLtuRE7gRqac1uV%Cw-2vHt4`vm4-g^i zg;+GQE509Yya>WA<_owMD1d}u&PZS@VDcPa1_di1ica|B?R#!lLCLR&0sQ$&3M!^O zM0n%QB6nsMr=PR}4Pl|cRY3y;bAke6k(ulFvft@u#N$pFuocXeuG|0au#ujw$*mL%X}6J6tQE`^gpBYc&``mgyny@)mWt2uU1a|=Dh?xf z&qLQ&3E^o^;^Cy6ikB5p;B;SvMvO`9*6yAGEk5(`5NN1i&R<|`@!|S?ljCUn``^=L ztlnPub}lRguK2~k*-QHur`OIsn4{{(Q|(=VCs$-t_hovuqp<0&PrM5nvd*l-3qwN& zbM6A;{xzsG{_0w%Lq^mijBsRyQaE(@qlf49X3Qdp`Kh_mB@e>&X;KNNI^}VLiHbzL zioSuMLH-(E5E?R=vlbYe4nULtZ^%xyP9_3P2kj87j`q%4aA<0m`i##Tst6=1I4tFf zL7DNd#ke2STVpxOcX&Hej~Xh-Md4YXVS_nYfw5Zzm@n+ujzauVXAGC4>8w8SVViFJ zTNEK7bIF08QggX!T*o_?%JmiPSq+; z-!DZF2z*U4j{bgG{@&rRT@pEBlPRhaueG{u{-^wF4+I8w)Jkxf!o*@~iV6Cjx-tzLB=&gI^#JAh&+Tk+v5unupf4kB4R3`*rRq4@u^H1PB`t`qu7@{W{ zB%qN*R)dd_<;9`XtFO)OM$`z!YB6C-BgLwMkqEc83T0l+q!$@?-UE{Y?IgS-6mu1Z zIU|A56_0yWe!+IC1q9KP8si+m?3m7Lxa~1c<8N@>UPtTdCj(zP)js zjP3DJI|&Uxd>k}rFsCLk#!qnF?5}D&-L{SPBPq~M2>O5S4>GPDR(J|L-Md{B$gXjF za~kiP@cnmI<6}KhOzm*=G4Rk9w8F5bCa~4Gj?el0qpzbB;NNZWsPn?i%nIHNZ0ZYm zdEp4?GI|lU_jYx6cY!Y5j{ZlFpCEw}1W5)w12jebUneHVXUu-VbgCSZuZR1j?^9E$ zr0eir|6;d2r2yLP_!)88A;piJFQ3|Nl!kx~Ns{~UOwd5Vo|nK@3qC%__zS30E6NIV zQ=6}tEX*Upb1*^@qNCGqVLnE#p7Qbe@);TF>e123Gyd=z&@jQAk-(blA5Ad7U^-R# z>z}qC>y%y~xaT)E>~0VgBmX(hA``BB)UkZ^Fw#g9LLb0^^Ddw2}M<=~VIW zsH+4t$(Wj2TFStAk&sxC;8>{%aDYA;5+^FE%MwQwAsj@wMQDIv&OcyWGxPls^-eWM z^F2E14FvfxlHs#&hZPCvfpWd&<=+UxX8fh!4}Au$j+lE;O8~##EB*bJ?0>m?5Vo2I z4?zE`eqikS0sV7kX6EMR)>dYSqb5{nt}bpz{U7LQa8OQu^Zj{*xXv}yFE@Ek zXN6lC&kQw$!OqpedK1ZOD$u1RFOPy}vAX|tD<%hfJG5)KP*$US$H#Gx zUOpfu207i-@R$8Qr^>KEzmG#%;W}`yd;XJ;XO8xBAoa}W$eD3~aweZ+LuoMMJFeQo zgao#n{*QgqQ+E3t>&BsEZ3t}6$bwzpi0bMf+M}M6^kytGXeI`8<^fxI@edRr|2@Ur zcA^e|;w~^U4PAlT@IVc^s_10U0Ki<{fGuPH69CVt03541epKDeK@BYx?$V(*}a{&px-CxxZg(>75P7<{!9Jg$9qH6k8YC2=2SOzJGv^G z`?%_)3I0LT(%sq9&D_!*a^&&9TpxY>s0EJ9^8667j2758;NkjSP6AJYkRNq3@E`;M zCt8jZCGa2&`Cg&`H&SbXl_I!!;`>)%eGiHqKOT4>{NKwo;Lms=ph)xM8$JkVv^{z_ zroayYMXw)U2|)P27g@oN1R>yB>>u9KA4K4vF@W-?z|S!NkqG=81E^65{2T+2$Z^Bc@fd(ajvIh9 zkMBwUp#rYs=9G5^S~`xw+I$cm-jiW)YHI^^fb{iv zfZEyukRR1%ZEZma&v!u_-R8~tBcDGaq2vfIg8%*_@EJ(jz1{~0vrALAOzw5XAD5aKaPDUIRX{`II9C5xFJ7|kAVju z-S2t@4?w#Ai~*?l$5C+b6%gr9Api{ntNxAxX!u7x0Q{K{(9cg4K*c}mA4-lu#XqW6 z;DHSSS*nrgC zoXxc?Js?I9PIXy%kPBG)cpT{&gb|tV|5bt*pV+kwFjf#%+#x4Su{l*OEo@DtoqfQs zk4DH3?ynF6BQid6W;bUS=-+5MAHSvP==Dol;9W@O9w)KN{pdAHM??DYRwO|1M^J`V zMEmhdl@rWIKm6xv`zXC>CprZj|6RRjTDKvJjfxZeXb4f_HIY)c`(u)3Zwld7&(smy z)60~(P6V`-)>-SyRlT|aUqY=`rQb|Jb+>hDGg7 zJ7sDRUFfY#<-3C&KmIKCxUDpQu`e(Dc=z8f&#o`e4*RV-?@*q<*A~!^diN`7d3{hU z4u=>y?!)(Zj%*AmiNWl7Bi#G%%mUILy(znh9D7!FaNgUY`-_QHK)S|s5F#$;P%CxR z1si(I+l65g9@DR0Kb$URYR}GF*1Tp>yY4+Zp8DYti)Q617T30 z*IVPslFKyLbb@!;zdh8ds+G_1+aAKYakJ7*fF%F=ZL%w}m3Ycd*p~>bm*Nf;b~Lvf zf}%E39j&)lkes#97H>RhjCh5iY+yF|)xX|wE^RHzD?-R5C0H?cb!$bCm16Y9a@and zx)VM@syd<6GTWmdTyJvX^ACE+j_RVFHpyaTNlQP* z8NNAiZJlUOl}V+on>XT@32W&`W7oF4^LWTgkzI3z%fjmsA~R!VL_-@FTID!)fmy;w zglo4*J$=+j+(=y9SnIgz=II4l$!VqVdq=V<_#vjB5{A;F&=Tb)JeZ9b(8tSoQoCgz zPhP%>LLO*7B{^=leAmkNBUd)*?VQCx?zV3^HRKmnJZLYUDYnc}=8)2FJurOYOU@Op zyRTCqXyTjT{Pb2&jSjVJ=eM!!UQLyppr%-nHexj-v>M}=-f#Pz<=^xO(pudMng95} z^NDbHL0AcOg$tf3<}BMLKbyDRJSO>@%sw5q5jXbO?!pL*1ZI_DTb7x-!r@FsaVUBL zISu|9&n^YCjIf@y!xmJOS=we2uN2`k*nXNp8P0=o<}ytmk&zDt%|c(|6zZ4e>$2D% zaNrOQvJx=3iW2E7AL>k8sOsCB)QZwUmSZZt9Npur;_!Thg`4rtIqlBRS6DF#Mbc4Q zXP(4xnbdLgicHpGkMAIKJ$<&II`EiEUC2eeJ3vD5ja$?qp5n7X>6>m3f*q7UO0Arq zFeMsG#FJfa*Y#}0)luNCsj$q%&kqeO2|TCK-0zoX#(QBGf@xJZ?$10$g8TU0U^JQW zFmg9)Xa{C3sW{Tao&jHHy-2ck>27?+%d%&mOtU;uu}k;g3ZIdrC4POLHCcgTc$tUB zxzyKDIlkXFN!ritfDe9SoB6)T?cBnQitUK)E~CrpvU3l+5>Rk51hME5Tq|OV+m(mn z*r@rNgI2kd=m(1T&YNJThR($(-po?Ex%D~A-0tcq&XYXEYb2}vdpQEEOgDDV*i^A< z-DgG9w2j-{o9K&gzmsURzP1zx&#_LG`qDtUM#46gHK#LXU`u4J=G_FA)>(DxT0h!X z%u$mD`&k!9+AASBVj>P_Au4ZuAHeVmoZCb@OH9>IhK{Z35q$%deYA6YK-XX+>yzV z8bDu95Pn(e=@&I_9`y3VLv9}1992|YitJ>ehe`8y%0go_BbT1Ezcsp5K;r9gP6C)}jerALYq&baOFoF2;>^cep!SGx5Aw?Z?v8p zp~7|t0lh?|qk0stGAxG2LB$j!9$kR(o)Pn7(nsCOQrHs`B~n;Re$3*dN@u_LhfCBw zryICcI!L}QB+D~vZqYCROCp*tkx&bY!vf1kkGjh^+x?3PH%D}6DvRJAa+ zCyEbC?8P2Gw2T;u(cr#1B`)%;W|S@4&VuFLMU|YPCuAwomFhdAp?IMdjeZ|PrL%fA zgCn&Fk~3dr>hy2Wl)d6Mbbn`X>G5a_e{~O{Z{zaIt(PeQrFVUk^qS?AN2q+>?7i|k zit{htc+5XSp?yi!lx> zg*s#4eqYmjJv>W|QUEL<$@nWLhW$h!cxd+^?+VSZ{Q{nIDa|Vwzqvh36q8)8CKOHQ zQ=LfLe*^oY6FY<-)Gk4|4IPN$>6If0Up^%DPB6x>yvmUN zSDXQ>>BCO>y;ZTQDDn2SYG|#gs3p!dk$i4aKbvxXfmd(2s?7)b#f{I-$rC!_L@rRh zR9Wm-t{Lc(o^}n%@DvRdeMD^QmlWH6lH||P=f%gC1nPd@?@%s)by(MNr_Ay|ooH83 zrZi(kw18j`5V7W@m6p7{OQKKC)0`I1fr-APWMrI{m6@%=s?~**kdYMFEy$D!g}?hM z-y9wF-T;(DK;ZCFm=t#}8R~O7+Y94J)Kdg-pGv2WC9d}i=IYveD}p^7_LeLoltdbl zb%DczM0V7Y*p-qd`n_DOkIr-$CKj^mg74)v<-+grPT3|*;%%fa7jCdDDod-$(TIEu z{mR&`o)Vl<)B9ixzD$c)nYMl-SA1b&scGOzy-?R{kHS*#J1P~|br~+lb8$?QB)FDf z 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 + + + + + + + + + + + + + + + + + +

+ +

+VIA Nytt 14 - 2002 20 august

+ +

 

+ +

 

+ +

+ + + + + + + + + +
+ +
 

+ +

 

+ +
+ +

+ +


+
VIA Flyspesialisten nsker +den nye konkurransesituasjonen p norsk innenriks velkommen

+ +

Konkurranse skaper dynamikk +i markedet, kt fokus p produktutvikling, service, tilbud, hy motivasjon for + lykkes og ikke minst lavere priser. Hos alle VIA Flyspesialisten byrer +fr du n Norwegian billetter til fordelaktige priser.

+ +

 

+ +

Ny rute fra Stavanger til +Aberdeen, og Trondheim inn p KLMs norgesnett

+ +

25. 8 - to dager fr oljemessen pner i Stavanger - starter +KLM sin nye rute mellom Stavanger og Aberdeen i Skottland. KLM vil starte daglige flyvninger mellom Amsterdam og +Trondheim fra 30. mars neste r. Ruten blir opprettet p grunn av at +Trondheims-omrdet er det fjerde strste markedet i Norge, de fleste av +flypassasjerer fra dette markedet skal til ml utenfor Skandinavia. Ruten vil bli betjent med en 80-seters Fokker 70, og +det blir to rundreiser per dag.

+ +

 

+ +

KLM med lavere +priser

+ +

KLM har innfrt ny og +lavere prisstruktur p sine 66 europeiske destinasjoner. De reduserer ogs antallet +prisklasser kraftig. Prisen vil avhenge av bookingtidspunktet, og lavpriser +krever minimumsopphold p 3dg el. natt lrdag/sndag.

+ +

 

+ +

SAS senker prisene i Norge

+ +

SAS har senket prisene p +lavprisbilletter med 25 prosent, og ligger tett opptil Norwegians laveste +priser nr selskapet kommer p markedet 1. september. P flere ruter i +Sr-Norge koster Norwegian 490 kroner. SAS tilbyr reiser fra 690 kroner. Mens +Norwegian til Nord-Norge vil operere med under 1000 kroner en vei, vil SAS +legge seg p mellom 1.500 og 1.800 kroner. Konkurransetilsynet sier at de vil +flge nye med for se om SAS vil dumpe sine priser. (Dagsavisen)

+ +


+
British +Airways fortsetter sin priskrig mot lavprisselskapene

+ +

BA har kuttet prisene med 80% p sine flyvninger fra +England til destinasjoner i Tyskland, Sveits og sterrike. Prisene starter p 99 p 37 ruter. BA +tilbyr n full service til lavpriser p 108 europeiske ruter. De satte tidligere ned prisene p +britisk innenriks (noe som gav 15% flere reisende) og senket prisene med 80% og +fjernet lrdagsregelen p 42 andre europeiske ruter, deriblant til Norge, +Sverige og Danmark.

+ +

 

+ +

Finnair ker +til Beijing

+ +

Finnair ker 5. +september til Beijing med en ekstra ukentlig avgang ut torsdag og hjem til +Helsinki igjen fredag. Finnair flyver daglig til Bangkok og derfra videre til +hhv. Hong Kong og Singapore. Frem til 31. oktober tilbyr selskapet ca. +1/3 rabatt nr ektefelle/samboer reiser med til sten.

+ +

 

+ +

Sterling med nye +destinasjoner

+ +

Milano/Bergamo blir +fra 13. september ny Sterling- destinasjon fra Kbenhavn og Stockholm. I +tillegg fr Bergen og Stavanger ukentlige direkte ruter til Malaga og Alicante, +og Sterling begynner en ukentlig ruteflyvning til Tenerife.

+ +

 

+ +

Ny rute til +Dsseldorf
+Lufthansa, som nylig ble kret til det mest punktlige flyselskapet i Europa, +vil gjenoppta morgenruten mellom Oslo og Dsseldorf. Avgangen vil starte i +Dsseldorf kl. 0700 med ankomst Gardermoen kl. 0845, mens returen blir fra Oslo +kl. 0920 og ankomst Dsseldorf kl. 1145.

+ +

 

+ +

+ +

 

+ +

Oslo billigste hotell-by
+
Oslo er Skandinavias billigste +hotell-by - dyrest er Stockholm, fulgt av Kbenhavn. Det viser tall fra Horwath +Eurocity Survey, som boarding.no refererer. I oversikten er Oslo p 15. plassen over Europas +dyreste hotellhovedsteder. Dyrest er London med en gjennomsnittspris 150% +hyere end Oslo. Stockholm er p 6. plassen - 28% dyrere enn Oslo.

+ +

 

+ +

 

+ +

I perioder listet opp her forventes det vre vanskelig skaffe +hotellrom:

+ +

Stavanger 27. 30. august ONS +(Oljemessen)

+ +

Stockholm 3. 6. +september QuNordic +Road & Traffic + Elmia Waste & Recykling

+ +

Stockholm +8. 12. september Urology Congress

+ +

Stockholm 14. + 18. september ERS + Network Telecom + SecurIT

+ +

Kbenhavn 21. 25. september EU toppmte

+ +

VIA Flyspesialisten har til dels store romkvoter i vre strste +byer. Bestill derfor din overnatting hos oss.

+ +

 

+ +

Nye hoteller

+ +

30. august pner to nye hoteller i +Danmark: det nybygde Scandic i Kbenhavns Sydhavn og det like s nye Radisson +SAS Hotel i Silkeborg. I +august pnes ogs Hilton Malm City og Hilton Stockholm Infra City. 1. september pner Quality Hotel Aalborg med 168 nye +vrelser, og direkte adgang til Aalborg Kultur og Kongress Center.

+ +

 

+ +

+ +

 

+ +

Jentetur med Hurtigruten fra Bod til +Troms, inkludert spa og moteoppvisning 08-10. november

+ +

F tips og ideer til hud +og hr, med Hurtigrutens egne frisrer og terapeuter. Bli ny i MS Finnmarkens +egen velvreavdeling. Med frisrer, make-up og aromaterapi. Spr vr +fargekonsulent hvilke farger som kler deg best. Eller slapp av under pen +himmel i skipets to boblebad. Vi bor p Rica Ishavshotell og avslutter +lrdagskvelden med et gnistrende moteshow og pflgende middag. Pris fra kr. 3.290,- per person i dobbellugar/rom for hurtigruten inkl. fullpensjon og spennende +foredrag, overnatting lrdag-sndag p Rica Ishavshotell i Troms inkl. +halvpensjon og moteshow, og fly fra Troms til Bod. Tilslutningspriser fra +andre byer ordnes. Teknisk arrangr: Kystopplevelser.

+ +

 

+ +

SAS og Braathens med hyere PTA-avgift

+ +

Med virkning fra 1. oktober +kes PTA-avgiften i Skandinavia til DKK/SEK/NOK 350. Det er alts avgiften +flyselskapet tar for at du som reisebyrkunde skal kunne hente ut billetten p +deres flyplasskontor. I tillegg kommer reisebyrenes honorar. Reis heller +derfor billettlst der det er mulig, eller hent ut billettene for en mye +rimeligere penge p de flyplassene der VIA Flyspesialisten har kontor +(Gardermoen, Sola, Torp, Vrnes og Flesland).

+ +

 

+ +

Utrolige priser p fly og hotell i USA med VIA +Flyspesialisten og Prisma frem til 10. september

+ +

Orlando 4.435, -, New York 5.195, - Washington 5.005, - +Miami 5.050, - Los Angeles 5.545, -

+ +

Prisene +pr. person inkluderer flyreise fra Oslo med skatter og 2 netter p hotell i +delt dobbeltrom. Vi lner deg i tillegg +mobiltelefon som fungerer i USA, og spanderer oppgradering ved leie av +Hertzbil! Reiseperiode: 3/9 - 12/12 2002 (Orlando 23/9 - 12/12, +Los Angeles 25/8 - 10/12). Utreise fra Oslo. Begrenset antall plasser. +Spesielle betingelser.

+ +

 

+ +

Kampanjetilbud med Sterling til Milano

+ +

Sterling starter +flyvninger fra Gardermoen til Milano/Bergamo via Kbenhavn to ganger i uken, +med frste avreise 13. september, og vi tilbyr i den forbindelse knalltilbud: +Oslo Milano kr 998,- t/r. Sterling garanterer at denne prisen vil vre +tilgjengelig s lenge det finnes ledige plasser p flyet! Salgsperioden gjelder +ut august, og reisen m foretaes i september (seneste retur 4.oktober).

+ +

 

+ +

? VISSTE DU AT

+ +

..... Aurstad Parkering p +Gardermoen stenger 23.08.2002 og flytter virksomheten til parkeringsomrde P3, +som befinner seg p hyre side av motorveien inn mot Terminalbygget p Oslo +Lufthavn.

+ +

..Verdens strste pariserhjul - London +Eye ved bredden av Themsen - har ftt permanent tillatelse til bli stende.
+
Det 135 meter hye pariserhjulet, sponset av BA, er siden +pningen i r 2000 blitt beskt av flere enn 8 millioner.

+ +

. Walt +Disney Company vil pne sin tredje temapark i Fjerne sten, denne gang i +Shanghai. Det finnes allerede en i Tokyo og i 2005/6 fr Hong Kong ogs en.

+ +

. N skal de yensynlig ikke lenger +prutes om prisen p turer med tuk-tuk, de sm vognene som fungerer som taxier. +Bl.a. Phuket, Thailands strste y, har de thailandske myndigheder besluttet at +de n skal kjres etter faste priser.

+ +

 

+ +


+
Redaksjonen tar forbehold om +trykkfeil og eventuelle prisendringer i tilbudene som str beskrevet i VIA +Nytt.

+ +

 

+ +

nsker du bli slettet +fra distribusjonslisten for denne utsendelsen? Vennligst meld tilbake til +avsender.

+ +
+ + + + diff --git a/UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/message.rtf b/UnitTests/TestData/tnef/MAPI_ATTACH_DATA_OBJ/message.rtf new file mode 100644 index 0000000000000000000000000000000000000000..e3c5078f3ededd7a0ce90584526a6b94129bc4ea GIT binary patch literal 2429 zcmb_eO>f*b5be1@|HC*Jx5aw9cJ07T4uyjxsL{FsVk0MAsMSc~iXsILrNzR?fA1Sg z+r&wGYWJWoa=zYsGu+1_ruw`vUTnT>hvxj^>Y}K)t~Yv3ru_N&=CP=QPpNcx*c7$w ztw>RCTN8!ThHj!Y?&Zgi-+fz5miL|Y)nzem&x^sts&K|P=bOvR+4N#VuQ?G%+67`y z6T5E5K9QJ?OrkPW#c6$AnVvoCHXoRJ-CmsXmE*)esfpvNV){M>5?f)_OmNWmtZsh& z0ggRk{b*~Pn_&Jt%3>%QLsHZjmXKj36+3Ce#FZpdv0oq4bT%cb9Y>~tqhn;N0YgKB zQy5P97wM2(eH|0ERuW38=-#*l|7JuPYkJp^ZoDG#rt4sh+)#dYJs^k3E7XDS7OMmw z2;u9H-*>FBvbl$=JN7Hmc&LUc#n9(k6tB1`B;RZ zlXajbe+3euCn!mIY^Y>OYkK4KU7Q&P731htBikQ!E!={GkiI%2oSztRb2e z6(#){;+`98d{J&_rI4X46)ozEK=Y5=hld53$PGK7+o_gS<<_f*XYWw}g}w~2dZu1p zU;;#Cx*F%c1o-teYNP;;Rm`|+Bh8PZj3HxkwLSO6R!#sQx@%q{|AmliORuIJ={6PR!DD&Xl zb9n}q(dP=_6FwKlluaBIS)V%BSjCEgoD8A=lj+hEZ9dp2m1(544lOxnhxqi?9b{m^ zNvLov3%~m@&0CIjgmMQk2MoZAP4Vw9pHI{L{G+mI;V5l6_9@Jwzo)9gi zKWg?gpAop_g8uVm@%ey*msqoa>O>5L+8V)VR(bAu!2gQFvi0uv?hQUM4)Y9BY9UO_ eP4-&|rpB?@4|>)h|2PUup3nbxzWQJ3o4)|}=qoM& literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/tnef/MAPI_OBJECT/Untitled_Attachment b/UnitTests/TestData/tnef/MAPI_OBJECT/Untitled_Attachment new file mode 100644 index 0000000000000000000000000000000000000000..4b67570e911e4458a5374dafbe14f1dff4f6eeac GIT binary patch literal 628240 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]AQIVZoUY(9?{X63MB2Vkr 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�Z57lmI9Q_c2cFTbyK!)DB+h%@d-?-n|wbDH_ zvpIKl@`}e*hiywUU4fGH#k#iq1)aHiqVaXg#~0%8Mz4)7+}MD|akn@=D6#XJW0_m% zMnZA!NoT`!O_R}au}q`>^p453iBAdTCPB&_aWeMmNv^k;-hHy2J#Icbv))8x`!+#m zScL2aFUsnpyhhpUEgEw&Oy|AN>~40+IsF5?ikfYH7`;KmH^$FYd4pzHJpY&0@t_Xs z4{8UbF}Ja@Lm&7wALW#DUdm-n>N#@bXCpkt{wkH!B@DHg z>C`O#Quv}|*E%N3vvHEueoJ*Afy(bXd1uDC7=j=3_f=Qmc0C-}N&OacP(Tz#?;B%n zCVwGU;nAHhs&{fWW0B2dyMWpq>)J18wH5vW0c%K3TdfRR&5j2PABWBd*x#zHdL@ol zuD<$NHJjs?hn8BF18GwZ6h|;1ZiNXsY;_Rx@5bw%Qm2(IB1Rph9-%8{vpQZ)&6~$r zA+%13$;IU*w)_0FLVkjRG4n#Orzu5fWlFA>-?NsFm-7Zz^QpgS=DM5j2mawPq(8vN z_xldhR{*Pg{9(#0%Yb%!P_ z_jzfzVzEY*T=E}Y*pT2e(dYF1G?rP{bD91Iu)o34qrS&W2CGWxS*$>y>_TTcmbCvmJ8=j}Wt(#xf(iB~( zC@-j{z;2>fmn5mVeuTwH~4Du6xF+Zj^G?J=0G z_?b0=zKINLR~?Q~Sf$6vfLA9%kd zO7r;U`_71rUQ+zw`YGHY9f|Wb<|b<5RGu=Y0OL-w^sjnv7ggxQTs=#?bTHkGh=Q*d z^{I5DKz#UpBr)>if%N<@#JMc}A+Jcq%d>j--5~a^h?&=^H*evYIU_zF`cBZRsSing zw+=*BJ=?(rJKpP__i0R$S{qO`vsoNFFDP5=>9}{A{o>)P0heG=+4UE-V!~FszX}Eg zvT`vju6@n){aJH4<7AEFQ`As4^Sr!Wzo0G?6E+&lH*s<#*5Z5=c-7@9K$G$F)N2-V ztWF9>F6nGIwv!Ixfx6(K0eY)!$7Dimc*EY*88PiEj_>!rMVX>KDoJ?tr0oTNCgFfo(z;d83~F1Kj*-<-*Zvp-|BEfW7l)Nzu=rHrxLIvP(6B z+tu&Ab02Q$2#}?5DG4AqAFA`u(0z@H%{zv1;DZLnnfk1U6QE+4-^B3GyEP&HUIZH^ zi1gPw!|ZH1A4lmW11+;#Gm17#l_5TpP{^E?RVCC2zfy>;5kVW`ts(Q~OKvIxO7;Sc zGaHYgRrl)6>zBDLlo?x7>Aw&BPAP+ZYk^&+Rx#wRK%Ws)FgBCyMDx}8{w~J>7;9T6 zxFOgrcoFtdB$2d?O+MTimEJCEX{pcMw>Zrfc!ObLsa_8`h}2@jqEr3>cwxf9ejA6I z7!TMKlHFU{f5;Pj}iTcx@Vzk zWc?e}x$mAAj(2!#jAbp?*6u?Hb%du1Pzz9W{ZbW;sXQWXV6-Y~$&ulSZi*d-B^N)$rfT~|8 z56kA$v`M<($L`MS?qi-D{8YCoUd4TzGGPzE(Wk&}P^m;RUd|=NO>995)F=%55o!nx zsX>#qiDD3VX)h;>WxuaMsnrVF9sf?TtLtR1VIWbfHSL<&3Ux%o+ygRqx~|EETcCL< zs=<*2i5B9bYQ)I_FZ6l~Zla-jJit}B>0SGuHW&w+f{nKI+QZcCU1w1fF91^zbN<6I zk`c~^!mx}#FqtANV&Rup$jav#WIeVhvWerGm)}3Y-9|k1ntTxyhULHZHQ!6Lw=iOK z`L(eiqa);vp>4=a3(C=5WDC^icyw9GP0G}7c3IUceMAqG{}P*G|XN-I@b#C7Sxw9Ayv;{ zK8SDU%_6jpc;a7|kSqnR7cElpf$>Pu$F}wHQS-N+WS@2b?P23O!1Fq?S;<0hw23j+ zA`^!kYX5y21GU7WBPiVQ2UzaB;e;10@hfL`=2kQNg(`O`voZ)-uT7`voat39!WYAJ zA59?DlXPEpT`e1&Wb4O(5}I}Bagzx*WPk|Wi@kpn>X6S_c~z-cOKMYh(9)`Fnn zRb|H%e9KwBxBJ9`)^Zi@3|^?Bu(F+ZZq9UqF$D?0M&#R08u*JV4srH6L@Jw^9<$e+ z@x6?4eGY#sC;RU0Umb%TnZrEpSjEzXpi+h;Y)IeCr` zr?27XV;egdf8V(gjUxDPEp|>-aqt+)U}bvcYadM8no*C%KKaM(nR|%WH38?Lc}!bJ z{h7BP_f87NR?su*h21Fi*~nZnw|sDZ(vgq) z7}cJXI3RteZ!J;d^l=xG2W3(e9Jn#)DSHE%b4Jh$(K6pB@u@O0-I7HYtz5^uzNIKq zemy4pgCo$iWEmV4P1c*66033Ak4~a+I-sQH*YZ08WOE^f=mnyBnQ9i#{JcP`hRmO` zvIRT%z>uDBN6$XrS&SZaXQNUhdhck-b2W#8$=t(F=9Fe$XM^3>Cc}AkH1ki2p5xO-uzwCAjyOwhj=yCehgJ(w>u43iI%=s*qG34>- z78O?+iVi1RRzj6=^hr8&Tlv?it$RuGBZm}V{ZC}mWVojm3+8}37*0jDz01Da0U-%X z4d$cu>VCZ52R()u|4Lo9FDXwGRc?IxSNcov?rKn+j@&i}*@kFUN|wVHZeJisO>o_9w(t={O(kM^qAet(ZfRq*Zf@* zm*&>aCeqWmgdfq;Y>6q#{MHVmE45=dhv;v_p!dFP%ve}i?u+?`1aD<^P+&!S9qc$; zAu(IIXs_-1xU|(FqE?58GA*JuOEz26*2GE-riAOT5?cz%S7u9b$N{!!Dp{fNGzogG z1|o9xXQz=XhAEF%KZ`QG`w+JTsU5r)ac95G`dRD`1BjOKpE*!HsQ)}{7{-o652wUY z$uAt9WC&gkgN{F8al`-z<@VTwJ?8WIe|T~@GF6*h?jTN4A;&c*tCcY&9>X;<`cK_-oz#E-a{ zK9v<9em+U-ezp7AmyD{Ft(tOsLAM&Eh9dVC#PhjR9|=O_$f2=hDsC3xL;VFR3u{VD00@h1BC29xHL8^lOFy6=GMiqFERjn1Fl zl0*d{r^mdA_^ek^3vsH1EZK!mMmVpsvB)%M!*B6siMNn%eC;_i7uK@Tr-a4UCXW9# z!j8k%2${q@ye8rG`FpY@#)oy+EZCM9NfW)H?X@qt2IEDA5fkq$^1Uto$kKoR&Ys&d%GEQ0q%OhK$Zso zy4au3G=+d^1aEh`mMjO??^<*;Q-1u=a>RpQXPwpjjxH^C551m}p%p9qeoVBQeQ{xO zA*R%r?K+J;v52mO?HY$Mygf4DFal(R`R8m)>S`-Ayp9>k&b3e*Aj6^^UZjS5odv3OA3Lry zH$T$emUV{OnFq%c*7nDOTt7bPXHPuaBy&8rvc!Pjiv9XQiw7pqXNWEiiVH&RY5^(( zRabglX!Q$e#4d&>m_g+`&Wk9*WYzN$vg>D}L?0aBiF8A<5v63n_C#qlViaDp4;+AL zs0hwA%_3anP7W`fd{f!~#YR{y^Vca)--=A1Et)9){&qjE7<1C8dG87_W-xWA((;-? zLQ~CW?!IL8zriDXe6`F&X1?zPyAX&smZj%bJHf7ZOJyYyRQo_9z}^3@2I;H)kbI+U z$r`U0_i4iH7W}0S?GjY8>|&42lgkUV&6d8y8z8B@Cqij65RtMV`cmH&S}85fGC1#< z26W&Yy^Q#Jkgwf!7dJ{R+UuaWpk6ekc@+%@Z!LLRYj5)OR5I!)&ZHKi4lKop`BXa1?=+_~rtDj(K-3KQr5mVJGs&Cd>#J+^W z>*n`qNiYWJ^Q(zveFzTC3yfFcFC7TmKZ8yY_~G-~m%&JPcoM@~>9V8^h9_}i>c2kw z>@Xho&?M{J^*?%k^wK_|ZYtWc;_%$;DEWGjV6)NH>nN4*b=~acPpoAd-XGMoR7~K` zK%D*$wmmWIa~dghv)RO2n*rHolIfDL?y#6P?h?ZWGRdUvGP9eWWRl{c?x)H>=AZn` z>Wkfa*67O!Hq?*|WDM3PB0eUWg!F9gt4~E9g0*fb{1QLjjR-Y+=g>t$Dr)%*U!ux> z;&2yGy|@A8O2XB#BL&3^@@enP(pe1z>ow-rv&llw49Jox5x1DUeAqp9a&_HG#J8Nh zpWnX3{ndzHTQl+uLlRA+t~>g9iO+}p;)7D&GrJI zH?Ny!J?ciFDy{`^tWMMZ+;u0|>K|a}{=0tw0gwQG=b(4#l+yWM3uMuXh|XmkGD1hu zBU|Lc{ISbytv~g4WrgyHxz{UoeDFjgQ%D!OAfPhheJ)k|yJ2bFl_*WedMjf%y(hM6gNbJ_QKLq5B}9 z(^j<|R5#38TtO|Gf*|d=Msvbik+-C@FPfgerw9_uu$z0~BoVR*-XKzN&7fC~4vck3 za^T=yrB)!sz#_Y6BeOoY=zf>ZA{Q6$B@AVUM%8q72mRX9;%QL)khu<;mD|fDi3H0L zT!<#Ps-7T$;N$DI+*!Z#=#n$DfYbQh9gBp0W1lc?HbT@bBAI-%Bi$Ly2D z9?dE<+1QXOUhgthjdkg0>iKF%HGE4~Vs9loP>0H0cyEv_RZB{uLAp*Z3^tBXGZ85Q z+egdR!ATpG=@}URR`LN|bDPqwN(B5hk3oH7s+Mo;yXiRYq9iJO0lr!SZ)}bu$-};j zsNh#x!ela2rx3M>rTd)969taW$|vW|3owV{_wkyyZtp@b>0X`xD-3lYR;__i#%q?z zI?`m_IoF?B=6LDBYynDHxyR!XwFpMLl4J(LTdf4Q$7a*Ain;vxcKPEN?{2R@=%BVO2L=i&W$GWG#dX+COA#Y1G5il8(yd0eo|i@R zB^m5fr0`Mb_ouu;K`p1=qVYG^6h^dvFUA%>+0Y$998L)H`ANn%}<-SQBl{;XWfw+GVqxw~o9s8hB#8=2Fw z-=Q9{S5-*)X|IIan4~HZjmVg5vwMG<1brl^pos8I2qX!ppJe>i5_u>#TU)^J$GfKJ zwYg8^xp=c)#l>{QBj$s)#Vv zTMM86<^NLzTqCwW>crNy%p?+1xPL;{oUZG?_6_jcP=bF=TYggSY{ns7ozLas0k^k~ zC!2kqw&L+;Hmc(2j{dbva67Np;(*eS49QoiU@8_??$oW*(Al>s1Nq!J_j}u?PTWS9 ze~r(aW=&svk?A#R1wI(4(>0%NDPZJ%GGS_WwauPMC-jbXbzeFdY_^v) zMqc?JOr3c=RQ><{m7*-!DmxWY*(&=wl{-t4B4iyxj9s?Dn2~)K!kul(8bX$#Y-67! zWY1W}%!Gu@h;f)P{m%V)eE<0U;Xe1*Yo-gPw6Q>k7>23Y&5mygl+l~ zo0^(a%s6(Ed>vsLX80OfKJbF>&KxIjqCi=k#Z!_ixX8r;$Sh~@Q0uo~ZxAZeTYG*i z<(ttFwaP}*`8#B@l*eAW+7@k@wftv`e!snamapvVUzXd*DW=>c%G+?D0jq5eJ33gopGT(ISM|wBV;BsC1UtBzlj?*`efUu z)&p6h-_~L^auA;?*{~WzF(V0r(7ZUN0QD#@N_sXJe2svGK2WSm4R$?DNUE5^2tONF z46ZtZ4wv||rEG)E_IPTyhCiQ zdAgx(V{GNAPlFhv5%s$^wkp}aH)}30Rr7|}B2y8<;LU{u1W2gfBV{7@Xu>i&4%PUV zWpkS3jHUa;#1~i?v=~Y zrzDo3$EaQP?3*>jnz0j%6VsBk_dpW;(XR&NNSk#s!=du0Dfn*>L(l%A*#>7ewBEea zhWs~wDzqV|IhPn86S!u7JdJ~n+nT555j!BKk=zUuz^ek`MfsgwiU1)NadeWYA<-}j z6Y15X;PTGX&{9xjq%&C+Q?yj0yC7d%6IraU&_AN-s(%(e23oU45ehR5Rf^;w@*Fr` z3m|ksYx_ZVKav%=P0FSC#8;6$*#FJ%?0mn^HGY5(qA9)m#oO1pUF+(;ko8ZgJ)1+~ zSLw1z7+5SM=hpNj z2q>GXy+FOUsPHpK-Zkrq8!wLLEbRymjwh0%IiWFN@WrRr*)Bpm(r>_u(t~|IKiDNd z6YFuRTZ1z-ijDo;!4L(MzT$pkJ;r$81d?^EH{%g;`z*r|J!o57j18z^JPh;+B%=8| zZoqi$K7rzc`KO?%%@Rzmu}RsCzw*tCxp$8)gC7SIBJwYRBD#DkXPSjcU`Ds&`sf zpI3BF%T!y3SL}N;`w(o$D67TcFMK4fn>j?SNp!pbg4Z3QTero-3)$%XnNyKVi(30& z<=gggb%w>v39%SIp&lVkzBgnl`;O$jO=F++sjC*5>B^b2UEySE{VOkv!&?4F|NqpD z#q+u^hYoV_@-VK|^OG+Kj3%Har2}`FHucoOqxus*^!o@HL6VzXRTPz4^$264rt$Q; zkpC@BVX;6a4$^!P#M`Ip@Ei7G`FU@1^f9GFkF=Tgf1u!qnJ^gn;+C2C!oMNs z(xq7xIbHu`k4b5mM?Cw~pg1H-T&yO1KInJ-h<`g*cr|0i=gZ^s7yZx1dM=?k;81n|=kXn+D_F}*LVU5_xq@;~JCM0<+Gz7z&^>n!ityVuIg zQcn-ojPjJDf1+F^8#TtF<&TLSK(unWTiIEBe(_wOALkKU+ffHMHZn*q20vctFU!E) z_pCXKQ6q2pZPG(htB*~}w5QH)NpiK$ zbDhS{oNm7Ax1L9w$z#x?Xo%~G-u8ekHii*E=D~ZB)Z@UjGlW=IPkat@|YtiunN->exS^jZ{=_OTWKMw4k?Iwj;%ul3Q9Xv}+PH<$CfBdc-6}+byj@ zyJnrM3|}XN!`XH1%z>U8Cm3EyyJHyYBvx5bHB2h9#zHT}O<3 zxmvC@E%8flBLBfPV}ps1=h$mU-@#9mGjbGsOb408V9!8cJRHC*6c{4=B|7p>DLDg0 zq)25m$~R1mLwn=L8Tp_^iC$v`g-bR;k=KSwV7_i~Dx&Zc#7lF~>i2pUFU^E{{RuDX zLVNYjQnp`oD8Gd(_iCx3iDMi9^j_;Xgzg)d8qB%EgO=MM{qXjQdur8}s-xJ&tc^1q zk(h%x&-7YDH6{~xsGjBasxh@L{dl2^pisG@-Q1TU_1dNS_HY|XTqQ$1f(lBVMu1ca zLa$-k=SPACWvjfS?Xh_Y6jod1^WO)Pr;IrP zX))~PiNWudh_jNQgJWml><)RWVKS53!9s+G2?$po*!wNt3uit-utV$68CiySEwN^= zg(6Yo<)%HqA;B?;5iNM@F+)8!jv218dF1Z5_zAjItPN@JCdhAIPGb@uSMw(WKW!3`XqhEuspanN%F#%;tpPa zHj;l}YQ)5KnW%$TEdB;+v<(6y-_XhG*8DADVWlXI(I>RBLHpe9Yf)U613;J^VmV+7 zbQE`mWGUxd{3u%(IG??{ZK~5)C{gLpdSN-V61%7yCUnwZRd_qOJS^19*-vI`Z_3Il zWTkj@b!WwAYuT~j_4h5-iklIKR0I0y=A5P8g+<#rJNqSvv2&R6>gIg`)9Xehmcma5 z5;@pcpkopnj|QMP*)uYvHHUv^&$ z%*l`7GiH}(t~#{dE=o4HQJAOOBB!CkSYN+Xk;+XAI+tgwqhu2W^F4tUdsO<~89NQC z&Rt(3DjT0T#ZSq%s_%TRS{XP$qc7G!cKmLD4y0U?4eL~&fNcWb&r%8x@k|AQ2f=x6 zCc7G&xGR2BG$XlKaq7*};4Kr!SzjI8#{$bJ!>3F30nO(dbRK<{3Qm@EEWDU^+p5Oh zW)nS!ADeX$)ZgjwRTjnpRVz04%ehL6tYetf1Q(BHSg-2%J?U&veNm+^FKc{rPYYu479iqO4tCpwz8giru^| zzQ3W$2#GqXM<~;8fP|;{H;ka!AoMYY4fVhCkNNA-8)13J*QyBGN^l_P9#ic`X!?NJ>nX0oARe$;{3N-rU=l~2hxOP zr&Lh_FbHoK=lZ_ZY7=GKWY+iXw_5KYAl4esS-I~c89DtUF<$^_l4&yP%E&WNxz(dC#EAk*$Nj#5fC+_Iyp zlig!f>F9Vz$xgt1msp;-f%H?d$whlX!u*6xVX9|3;?0NV; z9_2H2m|u&<9W*NQy$DO zf`^F2tCs@-;Gk|aNg0i@MVIwWrNU%H(iKfrhi4SZw(HUtT~W#bY@7laqwexZZmUuQ zfs(1+G!9Bi(UqRM$HXyqMcdFHzkcMm_AuE10je@taO*W?jClDIWryDDco}?5C|KJ_ za02du?-0`CK_fQ_M$={KJ4?i;f^EK;-ZQlQi{-8AJY0|J=ZcME-FGXQr^UTaCiFrR zLaYk9MqnhRbMyEZ?Zw~!P<=nXyZ@C{EhOVLZlp&_S7*`;P^v@X(9P;G$ZHHM07qpV zJY3DBYkGn!xE-K$Fn}TZ3Gj)8IhU{FThNNFKJpt?IIk*G6)P>vj`NR(bwUEJnTk2O zE}_9^Kw9zdKSaa6`GSob6-)L&%7C??ZG>H-X+djB@SsQZwXHh^iPr>E`Cg=2%kq-0 zJ*}~*n{EG`H8C$;l-q`6pMtYyefu0J?|2eREB2f~cT~Dvo$xmukcn_;p7-+63}*H* z*dU~$Nx0Mz-)SL@rv}OgSH!HHjQ;S7xw8vP3*h{0$qddM%J0I{3T@*YVv?^;u%w3k zkgT6o{m!p1d+juNRXpOQ=0+6i+QEa$y=2!{kM6Q^Tq%kA??)$)7PGdTFt9g#oWQ{_ zVqq5rE!xH?+}ph$=|x_Q0EidKj`j+em23oqz_jvN^mhvCmor=4y@9}6T@(#4VA zybZhmvZUTN;?g?{WTx9!vC{d$Ud?ZT3shhhAR}knEolD&Qvv*~3|T?0`|l-RN;!Q! zCC!uBlru!mF0|H@a%}?}%tW1ct58yF>e_uQ1DQs_?tVAb=mfY+jWgS1>Xz(FHb~Pp zAQkYJB@HoZW0{Ha(f#LCQEJi!aE+(b7a1`0xqI|xXv8cv%3w{@I%MLJzG1t^Ni$iE z?t^qgj?xdB^_w7@?G#=Jq)@G}$U<6*-|#wV{$(C+2@jh+bL#fX6l$HPef; z`JxVHr_FZOcOZ?>IcZ7Y_U@GVkN2+IpS7RAAy1;sP~}Jvl`(LpmJ+k9`OGzqVO-nr z*-eL=ixMHha9VcStDl9=2~`84rYE~OGKRe4rO#AWKEJ^{2hhPQBVLw9fh-fUX_*k( zXjj9Kn;)%U>X|9mm3YO*PtsctZ$2;xkJ%GbmNA3$nQoSc?kq68aETFqrlZqZN)P6R_KATe7-iAkRCPh2OxrL(<%QlDQsV60B2vb|d*B?^g($eGOVsk%+fP+CP#1ZP*7OO*vzO=42x&Avcwf!Or^JQTgO$*(ZZq)y=1^CEle&!fjqC>UL#=*|RQJR8E zmB*MWS$x_dVJ3nd6q)!x_d2iLwn~?4j|jbV>oX<$W%WTlEoCMsQnp{qpz4hm-Y354 z?M8SI{y{_OuiUE03eT3-8_nwHXRm8ql{O#zogo_izOFm^^f{&0 zaf9G}6K+*Q=9$Afw0BK6kDZ4}NGu_F8Jt zSKKT^?Z0-O z#T05%D92we?WZOVxVL_6MI5_OUsq7A_<%DoDs0f~(d0`=Uie=Yg$zJClyR;P)Y(r{ z_01@_B+TXP9<4UToH`H3Ytw!ZA|DlT{7FaoCpY(W?mH?ktY&T8T*SP;>HQS)`O9Lc zG#5yl23YC#a9dozBu9sXcW^?3ph&_C#4RdpNp<1{-lV|ihy5-6i-Kyk@(P`|{papZ z6d8@cKH>vH+-J;hoY;H#_??ppZ}`yy-}fEZaACYy&6(%@KDhgex??}C1b@jDzjgBY z0J~Uf=HqQY1^Elb`wu@R&y1enQJC&eIq}Ff>X@&F{8^`B6PIsRNot#MSFcpcHcFzx zd@At^P{$GR&Z07ffB>C3{wtY}o0J8*Sy-V_&}PDxF13`#1cs`aeUJ}>rFxk}1s$9p z{VsFj#@rAjzDoecL`2&~gt7K2s&c++$rti*$~EA*B>4EWPD>VZ0@YkOSPxuLA9R4y zq>sR|PNmom1>!0SfD$m=8FjoHb2RjuOFqq!iAt`L3Ey&1eCa^gZ>w9XTnWo{woaqo9QL;q*D1caQe~-a!Y5N& zYT`Z=DXSX6xDkP|pm`n@L!M#hwEHp{*8mx+;(VVn;~Hgz5X-zU@7Z<)A~|HJf=Mgi zd@oV0Q?mIYYiu&N$(J#E~|rn1}IyHlw@+(mH%vPCRCmj zhP$&5xKaUkN51kG8`8C3yLEK7Hjb-wPTqH$dY0)^`dZ$boH`tF&L1L%awp8Kk(ORi zW&0#f&FuO`i-6A}Y%&GD0ZL)GBJI9jNxt>a@UoCrN7<%kYS5p%!G6_?>jpEdC_n$P zN+}rq&c6yIvvPzP`1@zz5xq2YvtUdI_gk0W0PL>|C59TuMBdnjhLfwN35X z$;>L&nn!qrm9%NaO+9~osl^2L!>G*lS>E}B)pEHn=Hr!%wc^as9o_K9mRvd?{&nNh z7161?SvKD+rG&f@-{O^Xo8FTByfM7=>n>ITp)pfVk$tfTA^`ar>QuX4+xV(8*~DQb zb|Bks0-^BE>$;anP$R0>=`eKeqRBg7#R?Ouv~T9uN;$DOnI8~$1#Kd>cLSTGw!}l3 zO%WyTM_~*ozw6$F*>TMRQw(v%3Tuea-hgYp9^TM5(-V^q<`9BfHm z4Q+0`t{*<{oDXO9)=e1TiNo^lrb${;w)?P>UV1ktbokus5qG8-+|)4>J-sF%tm={Ba5a@rfkmOpEmOH(f5w9msv+ zeFp6pcI?S&Yq~6?3oFWys{^)|y_Ym8e*GZn8pN6rx+B@v`X7P>1_-Dy4`4w~Ia&A8 zS*`NUcud8w;SkzZjr}i+fyy~s&+~Y1T9zGVApc1>_?p!un+biATyw1{9S{nA&|0KE z0ff0&_aPzE;0Dmb_y*E6q52vGM>sTqi|NXsEut{ym+QY6%5}S#}k59=Y89TG) z%5QGI{He||?$z_iqVTzOLZ$w}_JC!|Tl0!b0=};bJq`Yt8kj7Z+vlaE6iO1i|S?)dsPMT~dJAKqypT7jhi_Y#%x$+ASg1Ol6PNQ7DHb28&DfjYTTH z6|+9}dpUt_WfZiLcE>u`Bq1dJs^wGq2J_Sc2ZI~9cf9I27_IYUxig1L-b;=4XAu^< zu*|Qq%+Ylzs4}W|1X>hWV4{|5N~4e_D0Xdmne zJtc^!1<^f8Y%O~b)R-Cjs!RwU6q2Q)eS9GXjpq1eAV*p);7|; zt^2{NK%mh8K#@=m<9}kVMORCumU+ANC%OdWhRV#!Zke_o3cYK)O0ExR($aD-sZFrUzRAzmuN~r&eVCx3Fc|2qp5gpIW`d!(w=3b)?KQ_%N5F{!S(qK zm)K_w>43uny3}zUfy(G7tfFc&Ps1+kO4UE~4|h-h{y%*=soaRk%V7KDWx_ewLiMc* z@bjx)f9a)W@Z`t0iqy{X{^$A^*>roP&6Z`0%B-jS@n{-N*rHYaCWeMJIS7S_QD^5M zrvl3pv9gWUD@`G5aa)l}__aUVl>KGDtvJ$%A!rUrs$&il#2D5TKO#2H2YH#H*+QWe zRl=1`rV+Bl%OVT20pJ3&k2^I@T5X$I=-koPuXjJt`Nq*2a|DcGD(T51&H&C-b@TDx z49yzgPp?(+)ft2;s$QRzQqQ^QIH;(oGB|bVxaL4}mX4gXic z=Pdq}w&`@Ue@NtAYBeoD!TWAFZQ$J>{YCp0OwQ5}c9n6s0A!Rd*<>%@9IL17c}|ul zM^`<-X#u)+IqF~ z@I7%v^^O8wPCWQab~TcGKeIb$QX3B*SZQN00iQ&SGX6b>onlXqT?-&p6CCj{TDAkh z-q0P!vFi1DWyd9zpJh0E(3mAuI`wgz=YwIC!dIDdrkaEHHT8a08Kh8}KDZYtROQw- zn%u?WFW5JNMW8hGEO`B$kJMvHZ{GZ!yA1ceAto2px4 z&TCmEQ1WQ*zzC=uf;4mCh1=zf2UN2JITEAKRb6A^otT|rbS-$75 zHnZ=){em^EXw$?GUZ1lO-0~?mZ`ptcbi5>!`zpXrDu8T3Kr3x2Rk^&w%aQJc4nL=tow#m!D*WJv(COalthJ>vt9ED*R$KC-*fY+w z4^IkDDtS}*iX%G3@@9bK{os7_n2P@O-cz}q6jTYaBDKytgPDA zj-?1wX4ASP>KecykJIZA(>@HgB5tQ3++b3$ot}5vowXB9_K}5s9)h2fWNhh^G*2ot zrt3J|f{02$D%->FDJAEt_kr$!WAJTqULq%e-0z=Z@;`BnpZ!N94bxR0RxadF=TfLo z)BR?I91qZ`kp_!A1h=5{%OLdtyPVS{-89i*NAeS#XK1y~=nX7m`M<;C$t1(gEwati zzbtuPr+qDaiUyDI&HcJzyYSAUDS%^b4(mDwD7Gdu&Y=RAB~!JoQ+)GCtEQqPg@N=U zSlAnQ)&%z*xr647Tr8$z%KK7B=5I3ki&yO6TTQ-y?7pT&hM!ZZ7gfii(Yt%U90d|? z*r4Qw<*r`y{1#g}{H0cOaOhq0Cgz^vRg9>t%Mk~rfaf@zIo5|f0nQ%XW~>YwP!`bd zx1DLCNP~4MxC{~`WT@BydVLJo z)CS%rOE)Pe7jY>;+i57CE$`ntk|eVea9>Uzt*do{(6nK^VHtiTRHyC5(Zc@zOfEAx z_h$@ajIP9-Svq@EtH;W?t#|h5ZHFA?JrLU8XZ4M7aT#^ev&|G2!w?McZOMO@17j76+qmehT@cxuuZMK(37WvGU5gC$TSf5i4`cL zbY^UEk{u>QIsF9I`Mk3qC7=6fa(PB|W3^!aJpEGco!OMh+ZO(TrcmaYt**8j+a-54 zH>miQ^IZ#1{?Po%g4`Q`lt}naOBtd0xpj8Ny|NuP-$&Tq2wXJ4QzFk3NU~d3 zDQFUEpdPPmNo7xHHaiJG2Slthx=u3`I%k8pl^#ZD#L-^+z^ZQhw;bYiV{&r6V6xGx zCVO#QDEF`b+FJK&B4t3kTWJ3n9}Fo4C{XvAyct3O=ioSy-K$kttn!i4Yb%ZSOmI|; zkBQnGTBb@tOr%ED#4m4pVU zqCHE;DD_btg50w&z$0$AI_eZs2$tz#Ek_)afPZl~eo6;K?;MUh9Y(CP-xcwu;a?R8 zSKa6c0%6TIK{HlL2bg$iw>8yk-~Us=g_n2H?iGH=Wr#63%~~D*P3lMEdY?LLx@f6 zL8EOi*S`T0j3|O}yXdoCS``f>ar47{^M+U;>u^r7R%Nz$iS(QMmh4#YS;3oTg3Gi0 zTXxVH1qN#wnCKdzWb0E@6Z(`+0ZrXlZUh$@{M>NtmBJ+It4u+jv#kkl!vqGRH*ZL& z{L&O=y+2X*CpLD(anQkV-n#J8Cv#Y(*PP;^s@Jw}=WnDoNy6QlJ#)Fn3f=PRt;VR> z7qm{ny{onXg?>W#A`q^9EhOs`iNJ@DC4paPY?RyvS@3YebsI%>H|ZGHaib{r=+0EXMLb^own&5*jH~Rk%TvUcBanL$t-*q1W5~LSiJSCawD%QK zAQi#V7ye`!nmr6>xdBkUNT`!u`=H{+fKiL-gG)E5vq?cP1s%S39)~%#T}kdFVT_S< zfyFe39=�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

^@)U9h!qVS;`d@F1FCSoLe&RJeBEj zCf6dJf^J4_`{B8>YKZrsvDO-I(yd$O*3C5NjSpk6;V=HJau5l9A` zA>#!bQ^25H&ODoOi3QJ$nb~b_ovmjmD}10#HQi_5s$u!ha}wCk6%h}YvV82=Hj|lG zvDPnR*rH368j{hY*_CS>;v7BnEd!j0Jn$T&z&6qVtQ=qPRDAB6?Zs-t`$0!`u*eTg zl*Z?`9~+m%G@`dd^ygirgcuNuCdvUtVJjzNZQc!P^?s@<`%0R)JLTwl zTECI%jsS*2!xp^~Lm)XG(^$59xqo!6%rahnuR775vN9|`G@N7tg+9vZo0`13e*sq4 z#Ao3)g0Cp-VHbX|gEi1i5Ve|=w#j0+ru0l%$J_ZEsC;h~B8xTM(>#~VHuSp35+E$dp6=-?X; z@FSYmH)CYWJdPZBtECALQz^H-f)C{Kn!U-;)$La5$q+N1?E%@6%kZ=aBjQ_6PWK-iMzEo<692#%;9Zm`Z`bRKN4)y zj64hvY|#f7e6|d%1tx9XG``%2Co}xPOpA3edi+=(t_vYnXPJkd$?&dvi&ZAH(Z9+q zl^pLFo7~{?vm~LXQ+ZZe>ur3jM(BPAULgG91*g&pchezZhqFLQxL+BlbGlD;aA~B@x}?eM zHEkrWTH#i?i~Gm)v`OWoe;u4aJ*5Fu`3}JCn(g5I!_mL3{ZJaqo^TI`;OAl0UVl%g z*xj!)0JDo#pG5ys)r&Qiib2?9+Sb5XX1Qwh{J5`bpB}x6EOHZEsd`sAa&_0Czv74A zyzaW8KX+@+hp!37)uc{=bAQTt=6at_WiVPYwLTKtN67&9rzgysag~MSnV;o;W3+L2;_Grr9cdpv{Rxz295}MoIB@8dN0O5iFziE#J zHx(88U9gqq+}sJ`lVLGV8oZ~^l4Z?Ffe+`Rf8aFX@K<$d>6GXeeC*``73(?RDcW5` z0g2Q1zJB@HRZ0{|p?yW)4l3cwf*>A{gn1v@O4=Ak zlImjf9>(ODxqvIFm2Rf<-T_{BKfS(K*lBK=G3OX>?^bw)xi&pduq?@rr5o_JuZA#v z^#E2ll^LO>vMv#IzijkGsF8VLmjC2<+uM=Vb*qb>yS1+FLFvz2qd(blR4M_%I(3Q+ zqFwfqXE$-L3tIXEvW3B@q=P8pD}w!R?P3)S1WIi3oLGKXLT)-W@XA@?mgNOuntBDAOp+f8gynKWi;ad7*z{}-42U7C4c zOG|5rz3PFbYxPEm`zV$T2G+`c_IqFDS3vZ*Drl=$tU14g>=SrmygL^1H9gXA=V5$; z{n{TT=96@ao%Z-ij(eWl%f9)Rt^}dTxSy2s3**%p?fFaHuqLSfP{AR>6WkEEUm#8d ziz$Hr%0!<`OurKXwom*{oD}TCB&OfzMdXGxHQnA4onMlMFEMT7oV51{3xXsezcAD$Nc@|*aX0lF<$Lv|P)xSyO{SmEaJ+5UQcWgn$fkpFs=NGf(iW;+Ee+%D0r zBB7H$B3OSAU~S7*h$_J>Y@7cAkTw}ss4eWu4Z(c|#`h9;UJ+|=w;pP&85XGdx@~zc z7E92o^UICQ*6Uj~)pTM9R(?-wH8t~MX0AlF*|>+hEv`kep=fpXK75FLDq$KYGx)Ql zuYI{5gq%*hhdj0Z)>+p3mvCLKW^U`{lz`~u%PFh~PB@sjPGLFkUuY$FIM6u-P@tp7cO{= z;wAmw`FdJck@>5vdQz@bY@M;+8{I;uc#F#FK^5lpP{SG*RoBjr?XiK3a%$puO3L%$ zqz6T|Rcej*uYytC(du{suFF%enq4XH zoECb+ZBt8gZG#IY_&d|D85ufN@#0B3@(496<*{t)_I>0tmBlXFf1V0_5l5j=_7aIv z02V){C?v0Y?9S^K8bX_egyei(k8d=5OkdJE1f4E_^-4b{TIEg%!CCTN^MPs7KIigs zzESvEw4&_Wjv$?<6PlVG6!WX8$v=OtL|UFRmz$B79rpO%`8>$JW+oxQ;ZQ)X7%NVOA*!a`Y>*1A9B8gXgw!p zQ#bI26Pa}GeIN53sd8bo9g(iHKZNqFd`?v)*{}rtk1OD3Gpzkk@6I)ARE>*d(mu6u zwLt6;fUZ^0?1D;}{SA-0cdS}4)|>|AFq$s|_X5hO1;rM-*Oux)mD)O|y#w zcjhp(m$gliFRX;Tw`?1@^TBxY_|Z$#0XBh!UQd*^TwnCEn{n5*cRerr6L?YAMS2xX zY%i`r%mQuUclH$2`sANZbP#mDgg|igH-uZ!$c~F07uS8dr26vGleKf4{ZKt(5^5xB zl%OiEjX`0g3di;U!qyZi#7`*ZJ~qI4uFV&I7D#}aOxQA*pcLu*6%a(U%E-4`!XO9q2ZH=nm%IpWlJ zq6|Y2Z#{`;zDpO*XSW;HTVW?FF4pfHIMX`UrtB-#!yy{O9a0nZXAaA}!rgWT3>)eb=tZxhKBVj?LH7^<#$??SrRUG(?96bwE)gj@{% zyU8lh%f}lu*m?zm6RZM{=z$LwepiFNZ|rhMo;=}r()$wTvbP6lb@sa)?7QpmQ62F9 zl((OcZ}2X?BjEjUzu=o^y>Fbr1YW}gc?SjWItm(3V6I|rI9&6(1g?70`c|GM>GUw+Yrww|`IvJhGaURvw4goJ)kg--na>37S& zzt;c#|L=d-|F4&@u!!*Q*ZTFp--!Hvtrr#*6%he{L_~gH8 za_ak!Y4*b6(lTcSUS0d$uXRGg|2|~v*8N+@{!_oUfqtzQ5fK&<17j?-Zha{DE4)oa zbob#6(#Ot;d0m&;bL8$u+2c=MmNjfr)v;&EUA)mNF27fop~n8*wZD7zKkHc3|5eZa zqhtT*7e#2Z@H+7DgtrNygaiW3g-lKv8__WTKt&&(V4xnFnerd&Nr}OjhOzDZXLXj0 zd5Qy5izbPuFRwhx832H#^7)tYZ@Y?3m$Oq@-S&O6b3|id)3zw0T}6PRX;*Y}*IETS zNkyrjq|b9?$)~dC>7lbV+=BrqX@ELxBBJ6I)#t>x&XgZU0J0zepFyJy14NPO^_y4~ zgxvtb?`&ONREKpyNfT z#M5Qy3ytA?kF*gh)`QjInodIqk}OY?{WFtmjn!f8dltcJYC%IbhMX#3B4eCsT#+}UaGUh<6&&TmmP}75C7NDjQFHw>qL<`*js*tF z5y=zt9}pB~KXbSl8A}p}6@Huj!1o|0IQ*4&b!Z7qscsNR_3)76@m(03%6IJSdjYTE zTg)~qmP#?xy+p(1#~8Bzq($f1$FRC1ByD-Kz=f2~q0JJQk8S{?1<`Ek(`bZ$DA0j# zk2kM@432QN*-8_-GW}tl7XvxcZ^u%rDtr|tZzl^Yp;-fN%p2LzjU{u zGG>uitt)0|$gZU88a#D}aPN~|hHVbn+6ItZ%+{2cxx3v6EEN5jySjMiCQc#0#no=> zwd}vb9b?4LMb$p__bTd;W&SvJ8Y6|(DOOPY%U^bUQ`=Tb$yt6^&O1aLT9%{&aQH|j zAr3ExbBlW7}t;PmrV_iw4>oHb1t!@}_7rv&1zEUJB< ziOqPDe3%c@;vSPMX#+7H$uQF!x{!acT8UTnHZ5@mm$;AQB@h0jp9syLcG`2YCYjb% z{r=IDy!aKU2K^SrlczEeb9PM3M(lRDjRC>-=$$4u6_!23jYQo6vu(UT28PC3q=y<8 zoZL%{xMypVd2W880VWZF^t&OzH~Qeul#x&G)J;2mJEg}JpN>b=263uZY}5Y|aC_j`u?jxeIx`9TqY`8_E7_~K$724j6`Qk!|g*-JQn`Q^UHBLO| z*<6r4m1}*bZs4lf&|53DYAW{oowTE0LV!p6EM^r2Q6mJOSD2t)!0kb7H2TM9hkK2a zCTcOA?6(fN&XOB#k$x7APrVhs_50ylpA{fw(%H7Eh^WkH|FDOjrQKW40fJwoZXZ}S z7o=iAbt`-eS_nokWA6|#a{z|2WW{8TcZ<&8y=wY?2~`DWUF=XkVf&t|*L;2S#3Xg} zgnFvU^^QzVt>*e%9vK3`vkMTST8y8y(oE)`S$-{e3ehPv>cZmr3bq(eW`%jBI?r4z zrZSWE09|3+72uWYd7(*-Kb8+n8cAY%jTNR)dRok_B1+S>&_#84EZ_+yFkmzKGl3^N z+(6pLQs>DUa0Yu#-19E@W|XYVA;+b5xVetjnxyz;s}7a&PULt*B{X@DWxaOs*rk5W zI(4($-E+Jj^umqIFsbHQZp`%?WbN%8PqUXbYO`nO3ab2ds-9$xhvq^(pf;E%BGJU) zBb>5H>E`*T{-sZ+U*ndLrE`YIe=bDld%s5a;CYI`e_{Y|>EQQ3h0})6ay$@Q&`?BM z#GzNL$tyX-y)@QYJNW1@!>&QwcAP<&waE=bapKs6MenNEQZ1NmqyFcxa;(U?>|*8O z5m)y=w11kIPf@AC=nUmetTW?2hK=f#aTmX{<@b^H)fOF71~h ztbvgKhrRa>YHE%Dg!Nhw5s{7{L`6WPU8N~4R}l~pBE1Q@hzKEuh=2qMi47vnC{;m; zbm=Mqq$Sct1f&HCB_t6M0+Lw5k(9gV{`TFOci!3Ao%#Lo&hE~RgJT?toSbu>^L#(` z>0F6o$?M4P4Q}qagyljN9$_yReK+1aq~~OglMLs;tNCc8ywADQLGCxJr~S=cUG+RR zBZ{dbXix+mWiC`0_XCI(0Na)KuV7IUxb$A!_kC$$i6E9;_JQs-4PV=Hg+*hn02etN z#czG`k4=5c+>C$A1w2fGx>G~&z^OqPPvZV~7rxoND^cPt{Yv!YGu1v$1^s@J)_!j}SL{3Di804@j zNnC#heUN`hRQl6st59i_dKsSz-HtnoRpqYt8{HKjr;J)Tv(^Hh~H^^M{sfm8TG4B@V7?D>JKiOWz=OfU4&KS#j(u^ zHcFT~OPz%WcrZdcth}3L;63FKFlbr*?B@3^w2=h$&IitMay8N#U(-@N20Jn8{Z9xo z{VCV7m#s`HTdOxxoO874Q3!vhA(PGOi$8gVCS0>^&^&2Ym8b9H2~Wni8KN;lyR@J^ zaNH#(AqLv8TkktkETt&G{RblvCmzB{0`*+tUjUj#f?&qkriAVSlp5=@^5z5LUXmfP zZY8gIbb307e)0XN&6BX5%oD|Gzw{-K)(SU;>foW}QzO>GSW8_)5VpfDYG}QrP-7CO z8GaMpOH>4-{uvo{AdpRxhE>vg>sFMG*WZuy`)06OxDuX&s*}V_?9u{d*0TqWGbL1c zxHACpNQq?dx=FoB`K-BHMnPg;ToI#(qR&N3E~OC~@*5r;deIziu29jq7?XE{?;I^a z*B=8o+;>XM&B(E4DKHUDm&k)7_aaGg(+xh`{oE+{gxOfJx&#?I)L@z1Z#6wxaQ=*44 z>JXMgIz%it=WVnLGkzZIqmb6<`w_%b=Ep4cD4%P+i^vapo*NV+_gCcntV`43Z*Q*k zC(i~y`>gneaWq{ssjFpR__`bNQ?F-sCgR7@y4LdX2g?OKo%`)NnPC$cbCc}F)Sef1 zXJoI#W*o=U16-~*ZHA8_emVREdjUS-yKS^YuWa_?rlK(UGftC~{g^^_pFcjyKxm{n zP#JM^>Q=igm<`aJwQ}aS?LhVNs8Aoq2zcLw;5L~yd!m9iFZj&<^yy+ZoX3T#%JzFk zdm^elX({$kFP0Y9#cUo;NP3Vo)v44nZ{#pQf0-42s$K#q7Z;FXL-)cqHJAT zczbRV@BD<`9d$s(gZnDQm3$Z>5~RA@;Z;)A>(X^aFX+B2t?lCdacG&F(=kW~NmVDS ziO&c;9}uCXNB>mqwJl5GV;e-E0;ay22ru7wjnE>g^>(ZpYBTR zApw*VWC2jQMxAu;yDZXOnt#}R1Mw;BQ64G1{Wx1X#Eq-=)t|Ex*X-{@2v(Rik+L)SnQkc_6Px9;6FYOIB2+%Zqcb0qK;74Tzk{ z5@)Gj7I7P)TDlReqVLnC@{+L{_~I+Yj5|r_Gorr&A0ls1Yrhg9 zofLE6csYiKmj!0L$Al6JI5l2aTDvLp9C>C9b|EW}8=5g(WPac9U=z(MB5y-}_F_aH z`o(p|Ht50~lB_8h@uzWO%F0@BO?YtJWc?mhw$4OG3II9Ct3LBKz+EPF-`BWTADT9Y zp8DL-dyZ6!xLS9)DOtRd;P=^U_Af^gX!>*pPc5}ksksab0diRN>Ci?{Nr`gP1O1CiqGHL9t+)mHF6**am5}-Fo_2uEGEov z<_|`re|s>ANhDA_JeSBM(Jev#8svg@k4^R9!Nw8dUtn%@|Hw{XOypE|p~b`}!16De z>0q14!a9<#4)3Dqg8)Kl&{rB?=>%r?%C|+0-nlhg$yTee`0L&7{Rziv@q_P9cQzMa zKxr4R{`M@MuXiZH-{W~1ZtvzjZMfQ0S zfsi+D&2QW(iU{tG*CzKiqXm(;Phh|9gh>ay=NfJjy02*JSD=hTUN>F4;wHs#lJ<=? z0?Ylf5)ghQ`y6j(Ao?0l^O(sG#S^9|Jw6@=&PO)dqLOx%SW(DD0Ltr<*&>V^)4b!n zrUOd8dEPlFom-9XGS%z_Rwq{S&C_EzoN7)saipEQYQ{6k8b*>tHCAy5o&&#JREE?3 zWR^>V%Hp8FVE+x5qWPc|3r)LfAkBS3(=1Lo*V`wvvuPpzdZ3@b>i~HG8M#;t`x-5l z9tPAGAatLFJfXtIf)Nnw(ZzD@8Vs#eR55GN z@hj)U!vTImn_hg5vwfqevge|m$6YI{?kKIZYXn~yLJ<{wYOKsHp!MEo7I}lML4Zkp zejI7SzS*KA=j7I#7&h(Fw03m7(m%WISA?sqd*oW5`wIRfev8dXK){axCb@&`sV))N z>e>(AErcUjYcfM^9pv#?c*B4=t84{&xlk%4Ms#MbP9Kdb$%m5tgJ#e8>Sw@x@txk# za0mh3=&&}!Bk=D6uy{~uZ% zrI6XDP0l{@x_kev~r3nTVs1)Na(6PI#K%bE4=`O&-Wxis_?JE)^gbB>22Ty zKqYkH}>qFfCm_ zko!l>1IF+DJp8?OmjxLmOv&3qlhHciDK=yWCUv7LNT17pt^ogPQCJXd@Jy7=bcCOf zWaesjYQ}_ZpZZv+Axeg#NXp@=kW`_rKwUgBufuIl`I&&;2OxVW8X}TaKyA3jq4D)# z=K@QP+PkZ&``4C|eHT;1pJbkW^Mnjt0H*L(_u+-0;)&^d>G~d= zMg6`gJFBaDPTUGDSJKM}_x4MZe&OTJc{y6|^P64>T(xu6tl$2PxNK$WA>p2lI@LSz zqFTEI;b`I3(28<&WIU-zR0VYj3fR8@lE4)lqD{$|_Av7vnFF)n3oG2oWsTijQi?|G zR1A6#)&^)OSvlTY5m9heJc>pYbD(=osx74ktNV%Qbmq&msg}rHoF7iq=b-;^1B_$g z=kUJN3L>%kz^K4L7y;lbz^3)v!T=_WU{TQrA>fVzwhMxh0|A(dx0~yCFQI~1^K(}3 zVqH{+1@GoLNBm>vFS~bX+l%p>8Ro^2qt%bUJTdfemrGK8^diSxS*2eV68_6&?)~d} z^J1Tz+~IksLg;j(6;*#YI^4yz@svj-qSBGM_^vMB-#)EmM;keEaeMcL2u78`oQ>*$&H5v3Fj7bN}YW_5Op8?>8j{FsJW)1RvI#q74(WHSilqUSEw0q zdCE4d>q}Mqf4xIHH<`&}{Bf5_+|VHl<$`;!@&%A3K z?>ejv%;;y8zE^AYShDU8f}ruj6#h0H3YOoY z>E`@f6W>f`3P$ci_WUGm#YCT_azFcLOqf&5IywqnA_m>!&HaXu2&N_Hk5^|$tZWWH zJ3o5ZDh~3YuaQNS!=$-zb05_q%{R-REI?(PnJ@|8xeuYu+%E-Y)s>vgY5#ieS$c9q z)m#pkE!h0SoaeJC2VRy`>NY$RtPwJ`Q9+uw;?sWOWw96@u7lU#bJHiS){ZbOo{q`i zn-*2}_U}}?@pUpxCR{b$NVi}_JQmN+?l#edu!4>Sb8-8D<37pPX<0qqIY-HvH>$m3 zD`E$$_---O)~D{dV3c+P5R%dhJYp*v9{FHM(@2kSv~0ZTS!8d9rQ`Tc^&9zFQIj+L zI?xuj@I!Fxw`DhS0j@$_Gw0!ZTa5_qu?wVqb8|wOO!aM@^M`ol)vS6+%+^?xydU>V zBQvZyPjF_1(d(br!-*xFZ+Hx!o|`^uZacWG3+spGIk5BA{0=~Nip>EJyK!h3qzPaI z0C?UyKY*9sJimu$(}+l1NL2RWF46;m>(Zt}@AGV9nwwwR#lDC*fu0B|`ja;Ky^(ebzf62QXReAHZJF_N#n9)>_AQ)D$nda-&d> zmesAQeY>1a_d{wNBy`{0+L7-PiQbRIxi9kq=mV^_`?a|zU#SW*(Yse@=`8xiR~to^ zwVGVI|91m;+xW22_tqFTsefzEWH+s1zo%EVm@P|)h+67F_?zmML24Y2b_!6X-)1sG zx&6KCpGx=@6YcT>FAT{ET)*^%_CN!#d%--_MsZI*w{LJWz)C~DP zNvoi%=Bi2=+cyUp0Rb}r+&=f*<$TMTG=>S6`oLy~_@jmLZ5v4-Vc}Z=d;Om5GPpT( zVAbEnH?#q#D1TsWCAsTw;R=mI&H|*F%;t^>@NQKW_DXnwk{x_~vL-Pp9DG#VUKn5I+ymdQ+6wqOQQt z<;`HGY-ZGT*wVC(H5N5N(fSJ6D^};=5B#&`@;cxaChSMbs?oPyk4C%DS}L;2bZB#Q|t0J{8_TNE4dIm17Q@O|@HAVJy4R%)xcYP&H?R z7p{thU!~Qp8tr{RcYPLBISZc-S%GpLN7R9a3m+-_;Mfzuac(^ylIYlu0HF?02L(FN zlz@gFKF+G`bvsu`m951(R0E3jb&>ip$WLQa-L+B33YYlO=>e;9UBe>M>JXBD0IY^K z0SMd~e#W?X4{kzZ7m!zpDe!0lH@yK1BYUvsq6!-syE+VRq?_hVH_HiT>XM(?dNnkE zw6cLRbrObb5PL2VS9yD%grapS@Arl(jKx$a%wC=KR2Xv!tXNMNJ~n);xamPb7Ru<( z``1RY$6d?xZ>W-&`x=?5<2}wYx)$hMxr)Kl$M)4tI(dcO$%A(6@eDtcb86&A1$&6G z>dX?XOM^tv)avP4Ab@?NBQ%_`J(6;4_A7V+NdzD^C`UTR^<&i-N#JPO?h$K#53Dhr zjZn(ntRphL$uv_Vr2tq+^{4q2TK-SC+A{UEPA7af)(+s*V;D?$QVi@iY16wm#?%^VPB#7qAQi(Dg zi^xZU6rKY!4_x<_`l0*8S{R)LE?~z-Z^L*n)5ODniYLTJK*i~Ou||JgxQzvGX9qi} zb=>NB4KhGK*4hN{iF=~zv`HkGSbn06Bor^-%*Zji3)(%bx4H19GAKucH+b5&S(U;> z9?}gMPvlbHYG`Pva6h)wAboN!{{ln6EtPdEc!jS6o2szP9f(Gj;}O0bbMMy1x}r<@ zR|-mh2LGU|Sm~Fzx4FN*SXEkO%{26-T*)b3RGXh2b{YtT^$)e{4`K4G%dE70B*(5l z?Wo~qUwZ`0?NIivQ9t@V(ksNNq5S!ZgJYwDEDPT|2 z2t>jI8*nC;d;!|~>+p^ECYwod4xiBoipRnQuyriM7(diXttJ7c&~LbT$U4?Y4By8Y z!biXWb7%fEFe7lmjp9|UbiskicN|Q)iDNgXQFMUF?j9R69;%!gQo#`)oG=YIi7qB| zdz{IWl%7Q%v(tZ3SEJ;x<+$hy_^3Y$di5yQ;A7H!ik}NPUDBIx-n-IZ(wwqC(b%gk5IRV1 z%wJ(zd8j!bn^~@s2VU3z`ovQvkY$uH_={Xpnu#@}XI_bCLyTrJ~}bKzZbZ9&dI)GhnItZ3g%Bx`d7?GABZ?H$a-eyYANg}J0U7CNud5}UxPAbuH5_etm>|b3RPv&{q$cjt!c3$(!eVOO z%~~6Ovvtj8e+ucM2jD=mPfWwVQWh#~3k27}$5sx!X#Nczw2PXCQyu>al5q40iZM_7 zeiK7(wcVp=x%st=0&RugaJt43jb0i^G)mH6V>jlt_!vBC;^_I{2yn2?f-S=f6wqmAWL!G zW*;_kvJQ6y*Sooqga@xF)j7NPxO$=9lzyz#`dy9V6NbNJZ#3WV=shwHL|uBo;u|A^ z5wU-VG`~!pfB)9Oq(O8gkiE3~Z-8U+-dNu~H^4onjL>6u>I`U7$T;UZ|D8xqTg*%& zm)YDX&Vm~}#whlx4DT8=zSt~1_;@_Ymvz+1$v977=jid&=vzy|DZ|U3>lOEUE`m-h z3w$UPIAz?!XlPz#a*+#AaF=#@MkdvwqH}$#uh6`KH%#I+ixowbhVpQph+rpE3Vs04 z_{G5;_sq=32Ka;@pPS-eK?)Wtm|h!ePXtag!VqAN*Uwx6CE)k*+pIzar?F=yaYwKY zcNct!zd+xczfDa|e#;i}-xIt0ns>(5zEo%Ie3lJ|HRo=4ClRL7$K-xIOcIai$ zn{6iFqY8gO25T{=scKeIb%1gAyw-z%wzvb1Tzl)V3q+Rny$dF3hy+&JJ2L0l@gps= zN0!6FOve0Ea@7V;l|EqY-8|s3AR*zPRv6m&)#7pKqWhoOocAT}*WElz7ggg5S~Dtp z!{>^#E_%H|_CGMpmD2tYPRp<|cB{~>iV1N!`J%<*kz4kfv|5KFG+u9jEC&6OcVkxZ zS3xBV421Ry_}KsxoEA<4u~mqVSR+8KROk;->oEObE&F1?QVY+u1zEP@{^4?N7s}FU zytdIY%r~blb|&P@z=2}M?+kElsuD_k1f3_q(XcfSZeCY~1F?$_k%KZ#xx;zPb!l6s z^tP@|d>UB*QJxOJVG(0EYKJbft?MoCU%cwzVjXzt)}Kkxafj|8HSWe;tmSizZI^{c z788t2@v&>8^dI_|#5@B{9wO_uTSehhDlEcYsO8k&( zS7_~Lnu*cJiq8FHD*T-?4c-~tsooDw8pqf_KFrxlZhmnb1@Q_)|~gr`cVM5Hbnm z;Qs#6zVz?p57^>nmevRmdXP^pmSh2+hJo^b;l3$0VbxLKKO-K6l6_Ke+c6ARF0nfU zc^*JOz>R_`Q2x&rICm)})+4O^*%>6VRtMIUJNtFY<_I}7-|-HmNWMmGRGYAj1`K?J za`kK|m`La)dS=SFt-91HvkQse4X$?z%QogT8{LSTb+@aKwAPwJNP&G*)0^?11ia(8wu0#x2iu zJW}WFf|VA_bm1FR`hKU&mFvA8)w|)SE=hNPL~Ru|H3Sxn3hFK<5+koMSP=*gG~qh-!h4oZVE z*Kf7!aI4>HNC5B!YdwL~TZXg{QjU@8%s)hFnHVOPe&t_4&|~ZAkw-FF@MH7yD#Gc{ z@sKM^H!k`9vqc{?5{v-m>-;+-{J=^okih|TXhsDh)V?>LW$7f0bkOFvHu1(5UMLS*=pV@dglfLgKU<0m z1mH_1f(a9c9g_gp8!R+L(Y>36UbBA0VMBL^)Qi%x-E8|q&_V==JirD&KqpH=JV3|Hv5ll4@Xfr$>O2rPyR%39&g|_fKop#N8nzBl zyCpz|q7s*?cM~%kGG9aG>WIUh!IJ=l^@$bGra}VqW1>_E!hHh%1+u;-a93b!HVSSW zlrUHM5>0okkq=wJ_cRm_K9ta9Gl&&n(QPW$0>2?)r#N%KTQ3jD6fk}l+Gr9^-ZUm( zQ^0dQp}*y`Dd6{5<38|v?hB)NAK6fR4}I(M&rxI=n7@)mYN&l2t(;+FYBu@qhm~EC z2C!C=dbF0A($lfxydIWz|K0VIYj?`Pw_u7L)S|(|rT{zk-T`N!w zUt0!Of~P_jtPXkBB1*MU>?+8E1GiuT|GK9R_|2%gOY8hI0CKA(SfW`-O>lo{y%qXn z(N3|d(tUj%AOCr3kSi6j50q|)h#gGhL0AylY$)%`OQD}Ik5F>>XA4U24-Wqt*GjD^ zf}&@6S~K<+NUqHIAFT~O)mR-y2#`v0p+ChfiXBeHav@#&l67AI57{T@;v;V2XF8%< zE4oN~r*)49aa?Y})(sC@+dND?T1S^|DHT#}7o*ShJu_Rbz8QYq9i!%W=C3ysn5)qy zaA9N>Y3K4S`6UJyx>SP~g8A5G1AE^AUs=bM0ml454fa$>aIE6&i8=D4Nc!v66YB3h zKktwz(fH|RhqTjDht|q|z7qYEQ(+z#NvZkoYrM_=lNxU`P>20L)OerxSHk`OXuOU8 z{n!5~jknp!KmRwBcpuqv>;Fo;|3kX|zrVzrBQ^r6y|{7Rc!d?Q+9Y;=35NEKW+a6* zZwFG*4!5;=L2c1HQ<#>4@YTQP5;Hlz6DDm4+=yT4qe4_V?8*31tiXi9ICcSo}U9pnGg!Pa%YB z^WaKH>x9sWJ5UbbMw};Osgf(-139P0>#47k^WvoEn#!UO=3my=wsHHr@^WpCiz+~f zEJ?dD$e{d0?0^J8ynPm-8a`1M zD?(nNj=zuC#1){PYv=qrC7-iHdFbd5(<7{Bb7k){sro_9HysB|o+?|6b76|QqeC2T z!s{}B6W!tL9KY`A@ul*riAuNAlhr#`MNco6*_$jmPCPhNV=_acQ(s9C+M~ErJ=8{g z7gWPv=spqa0%b2w_4!&MSu%Tq5b$lk>H%M+ff~j%_7tV%*?fS?FBMZ4*B>sDpdUJo zDsP=O&ylm$ZoqHYx739fs*J`G<$yfjF`+ecLufXE<_F?hnQ-*88Hpq z?V%r_&v&3$sKa1MN&-srbXIq+e{5e#?TV7dq1Y1SJSEi`={!PrmhGlw=YB^E0o7HZZe$I z1Y5n!LLnWv3~*wPpiZ~-XdLG4twa}nRo$Dy8|+qXYOD*I`;g0Tx^d%G5V-+n^4j4* zlzq*&Z&lATci{B!og<|0e}nTqb#t zn|mWC%cU%Ky15A8N3+rUqxQNLaES`sIe)jD?c#c}0cfwt#C%FW zYCpkRwfDF)gt1gS@^U&?wf*4d)sn!mr@C#NG6zA6pV{K-e5#>vL%1(Q>`oON!_WQz z&3iL_isJheYanR>gwNzB!JJ-bzs5eWa0(^yPCU!2AYz?E7eG|>DzkxoumbPQqW!?jU@_qhz|{Y zvC=og%uB}&mM!;v!x(&?FqKMfe)YOJGh93xmw?{=5~0*S0@7w`0v{0nbfShcWSn_Y zy{Z*Gu>0VYi90ld0U`TtHPqE`_}+Fkurhj3TF><(_IPl7j6S&yahZ6&8BvxKbR#LO zqqQ)^bWj+U8YIsW+VS?PtlDb@zh1T3n@6sioWae=>!@h66~n9FyXQQA3fHd>;RsLg zoTZo>TVOkE_wY_7YbyIpkGl>Sg%DD+Yo0b{kwaAGQI0`oE#e&L9%ux7n#jIEjbp;@ zfH7xbZ;5FX-SMCCR_Dv*UzFAV|{ofe1BddakZ8w!OCrk!-(~O0wzp; zd6SVs*`L-GmMb-9>-2_8?fDw3?#Lpyyh-!;n2#{EB(%M``y)J2{WW%cCB9iEj52ks z#~gxOohaKM(~I_-9{KG_9hW*!Gs%chZW;aMV(HzS3P0@lbMR|DGvndC{FH1Z#ay;Kezommn9&;b+0FeFIUVJ7@eJKLktF9;J%az^C*)gZ@%H z45s575x0U+;$^I*;9!t=@~-$89&n(5Xv*$-fvxxml(%d%vIYgtL)jZ&1V;QgVZv-Y zwN0Ez(Ev7jNxRz<7x1YXe@x$s3SgrGI_z^z_6(TS~6zsFS|@Hfb>Q4OWDNx{Z0)tc*uTxOrWyeBpSMG5-bj z#E@VQT~@x=dD+kV+Usu!)-yE1#S1a&S#?yqbXm)7*kC|wa4^z)lf?0=LT)M%KI2hH ze^(;EmT^TqF%dj29&LyORo)+h+aiAs8)tM|+hLY^KvHcx&Kg5xl6t`0$}voX9}s{u zH6m=%(%8>J?8i|@2t9?0ybA&MO$486(JU9_TZ&T0ccV;95B-SkmGNU#o({+Z$l_>X zc~Kc2fxacy0Q`8{#PYCvg@1^i#y~Z`(n#FYi$JtM&l^Zlz#UDXp7=H_HGn5uot)p= z^8Hz%9`<*_!4|>QSWy<35xN!6eEe?+;dItQ>_`%nxr?WK$7UY_!hLCVT+{|GF-H8b zG}EIy>)A3tN28(?3a>Q3hye8uCFl8rU)Gvu{^+UxU9pd=p?CX@tqyDD@$~qI<8|J} z#mn!XSvq}RTJk{kd5$~f!`qShv?Y=9LH1K4Ro)d;SN6+mmA5-z%s1p$s%D}5ty1?& z>e{2s-KbGE0gOz1$_89*73;xM?qNt;onkGo2mD3mdbMFFiRQhOt>bl8=D|^{LF=$? zu}oIrsQ04jB2THFnJ{OMis-{M8p!{}2r+ynO)HZ4Kvkuv0LVVL3|5UR)oG@o(gp+y z?16H2-~3j9R3mhK12D>PA6vzQqOUfFTndS8;OsYUisTU2)C{D0;%?&VO*Z?UA&}g` z?$Nmbj(_Yj_vuEv1g~o5FTkZNKxo1BSxYOydeO9bI=wo;p*VpVFk;80P}xK^OoLcn zur9>_e)x0$K+sfguH@y{6XgA$)U2V%9XD21;`|nxs12JsXGFKC!6SRW=9?2%p_if4 zlrQ~f#%g~e^)liXXtzP*9tIVBPBUT1^*b$Kuw~lqe4dZ{pw+P7=SOo-h`oJC@CwOh zu^0v=)luFanb83@K59Ww<$#94>ZClCk55m8xss2aF>JOD9duPJt?-bszfj~pPqU#Z z&Q4kkZWuaw{{EY~59`O>aNs5`^}thGHJ(7aIiLq0p(F?Wx z_iPRdT_&-|s{r%@KRrLUh^a0oh9#?#TkA?{Eaw~%ybzy>;I`4l!XKx35|em!tTi{y z{bOS{H-!EEtIZ)%nU(1a+(-CpnOjztg7f{{nSRx!G$FWBD}%zXpZ-Q^jlRE7+vk8h zx5xf-z;3n!${l@Rq>Q6#(xjvuXRZ+kx&!I9Ort(f{ox7t@XLTabAnYIi@4`2lx#@l z=CK@7QDUjD{$A9icD=tTS`Dwbbs$b9*+EDlQ~&Vgcyu#GVXjRRztAcxapvBI>JwMV ziAd*ZZu2c0eepzoJJ@R0z#N&;JO^xz<*mDoqs0fXE`YJoJsZ6U|FG0w5Jk+jaJgl3 z%E8twmr;YC_y?PfIU8v)k1I0Sr@4Badu)_jxW6*KwEWD`ar@3fdXnW@Y0Im{weK6- zy&AncCNAX{2tBshN(+Qp2Aw~qt}o_$&g!^muXvKkv6r(!y1;WW$u-QyzRam1o%@rr zUDP3l2w^;7kh+HYM`6H%v-7$lh_4521Lj!xyKrS2S)iJwQBfgO075G;?HH;b&y}jV z?5~qT&M@j}#dJ(w4L!#O&?fo0ReYZy&8Z?`pon6l%V1zEJ%Ctl0XwLYO`Mhq00fno zHfDYIvj8v#?;^(1eN>C5{%WF_+jG$N!aral-`gTm@umJXwo9;35X&H_p zcu^;6A3UeMoS8$yi-C}53)h5h+3tPAR;f`9S*cDNh_=!?GH$&SAMZedjhyVhb&?=k zc;!i-ms6?M+L4tP_Vw+ReSc4=z2GU~zkCJCmhVRs zS_iY>sgPampmE_3!G*kD%C45wKD9y4x!?ps^4N-3l5dMM!dG`!Pa-ILmH>y*PID_C z!Fga?C!;a!EklX}WkbT`+H4ff zrl_}H2{3?N$VF!H)xshC0ifXSJ8WcaChNFcZa{jO{V^xUF2xCy#1K4&U7|zJ-!0lTmk;A|QMhC!WAuP2W!czvdNv1>%p*oMyO$9%P%Rm~qUyjjB zbM8Q`)rtrB)HOx&1J6QT?97Xv$RoNJVQb(zv)xeC1ZHSZRaWG&reM|(m5yBaR#uys z)d{XE#?NN~MxPRI)~1->l)sT|5Q1`|vGfvlWU{`g#gluHgO>xwO^SDjoE2FRDF-NN z_aMZn@UW+*`!h$^y-%MmdhgZqQa*Xz-gU3zdt>kE#^1SW-D2%r+r3A9RU41mlPf36 zi?mL@=zBVm-;jB4V%BrQKP`>2ydT~O5z6|oh^w&YKtK^EZ8Ta8;{ftC%_w^8I3X-cu4IpYnfgf30`d`zDq5t+&98o=0)%G zA?EUtzngC~0QoBUW8QJi=yV}M0G^0W_&-|^a|v$?_XBNQAMtKUUi5{=NpLo9mxLACb|~~Z7pKDqN%`&I;C=^%#Dj^E z;D)l-k#~lDnhJpZ8PuQ#9<(QyJNavlpTl&qbZN>}-`0Kj%47PR%cUuL@5Dya%QG5@ z5x(2=u1(JbI{r3?MA4vkF%~&jgAyEM3oIT**gGU|vgXxgoF*!C z7p){&0cSCP9Up>DF&ZU=a&7#604g{O3W5<_2H!}A&_W;&t}|tjIwj8uDaqD z+MRc{k2^&WGoJaOt}oL&zWP4w62Mas|p88lqC%#9*{!}1E$|kus!Vd2XVqcw8@gng^ldM)bq!{lbbGnhm+(@ z%**m}vB3)h$i8KY^=NHDSN_HwiXwn}@9;5lHJFSsj03_tOU^&AyzdwJ`FrmKwWE+l z9e1Zb!~x4ze znkebp^M`2hAb925jOqTJygv?)?ixB`<6i?dQuX4Gh%`?UB@1|E2TBaGgVZGK_YpN+ zt;R2|=MLt+-}@A$RyNqNt|;>PnZOi!dvs1VT|k zkp8gm2-1OXtBa%`EzT@?^F&*6oN@*qYyN&W3(r}!g9&p>8L zjk1WqFXT_1DM0 z?l-&r0S@NlDkL^7fg@c+LHGFbm7~QSyJIR(auhcp)@i+$E{W)waC33kQ&2_N!02h) z(g&HD5$`_y$=#tq;JzX~zI;`01Wi%EUTnG|E1rjNFBm8Hj|eVAgf){*+yaj!sToBj zzWepC)QJH|sD0K1e{EM7R1j4IfUVkGMLj%FNjE zJ1;$F4~dF}PTj<^cg3mSif(tB*MiBbdO{*`=wwAoqR>NT_VFbxSr%K zZgvX)ldmfr|D3vvk`;RIPl{b`PWeb>kn1_OJr~Y?fA{;y)+G0M%`%gx`Oep@1ig6q zt1(5=6@-$zJr+sb1M)-2>-A;JNhh^gp>xUGKils-=P|BF+BR8-MX-*d<-K{4B?x}0 z>@G6$iNWFY9bUtpm7QweNikVjh29h#5L**raSs`X#L4~eYYj-g56utDyo~TiSPhUWsmWpB%7s-rhpI8=z8EqedlY}kALS} z)GmA>T|4x7EVA36H#Okk#RCt!!cGmJ?2jI)wV=D2Y9dOf@-@D${X}PMc(g~s!)fNs z&!I-85%93qzs%&tM2n(Gsi)O{uXXlG*4vL!bTQ_h4+AKrG1U!5nFgkqjPwsq$=k!y z4=h~11KSc)|1?%j&+9~vWe|CHAHHbu!lY-FI8^lEqde5 zzBwz>PYsXMbo@K_RPiI*Bd<Pdamj4;O#ZDRF`#rb}5fG=#Z z`Q)(Y9fGC9yu@?szcgQsL&M?f;cc1UU1Z>m=g!P@)@Xk9e`EP>PvFZV7bU0T`0`c=U)_88N=c3UOl(IcZw>7Y@qpbJ%-R6b-?i&t`C@4ntdrpXm^>F^hsz*P6cb3=z8di|B1b?3y16BZdS2dwN& z4O;TPocvY?B7WVh2;U&Y=$WZ~=kky{DxSsU_G$S}Mp`v(dAMIaWn}L6gZO%vk2c$} zhU2EyR28AlC<>gPu?JoD68XzQCdQ^NR~aBsT& zfa2?dln{Ye$#2xsy6^WxbN$;RS@Vs&onQ%H>M8PC&}Lun!Oq6*5(JgWJ zf#b;~4cix3=c#q}gL%gJiINZm|Ige8wQ22xm*4TK)%znwU{|^E+k*fk1*bV27I(Qd z`O6jGTAR6T{yjz6Ck&Sldu4y$dq`>{#p+T1gZ*SRaI@%45v7~B>K5JB{>m9?Zl@0SOS6u5eMwv>Q z=^>wGnqOL5OuA+$(p!Qi)bL@+>=lR%&D{h@;FUw)NGShY2 z|9aMW*?lrcgt(|7Xibmv@J8>Vaw6h|D4&FF1RNi^5-}z&=Mr%#Yd6(~7 z@3R+g9rGKOTpYP)Ix{!~@tiVM`Sokm6q(^VJl?e&weaFfu7hXOt(D^z=g+!lf8w2M z*&Vl~!}>1sJ7DQM`fXKs;QR>&m7h#yqWn~yIn~X-ms)ebdm{{Y8LNSHq@-{#H9RPhBnQjSH8b&Gm+jtj=XN{9uSB2G@@**Sa1a zWXJW4Z0p^PLHDSZ7xUd!vbrr6(*R<3=l-;pNYP-F?(lzM?>&Q>dc$^KRFGb!w+Pa! zbOa-z{4Y&!$OBDhxq4F@OV8% zy`by#N$g#>7_6n@OlY|4U-pXGLu-Hp5u96nq}KT_pSCuxQ#KjwpT8^b+x2CAzp#)G zR0F!6j>?`|Z<_a^s|N~dRd$<+VDxA}$_vn}{6I#cBR8RTJ&KWdAM5%nkIaKJLXh5< zFOU1+vvZhm53?SuD|QF!iTE%FtBX7>K_P(^VLj)?_}s!?l@mGwp*BW{*r@gH!^nHVxnlq~n^JWO;0dQCS&aor!aEZp6?*QY z)-3h5{?VGJmA)c}WjfkMRBt$?oG3(kE8DH(&d)nn*AaeMPpq|0CUBUy|GLFPss$(| zS%;v9=frIdffA8T$d_OjZn$v$@LC3&e1cyvGY86^U~VuaSG%|G(lP6Tgl1wIp0;yw zX$L9_cdk>pB=g4;^y%1v-7mXnZ86reDce@={KnZ+Qf)6KQG%362Cu<@Q_lEe z9B1{#9hm4;@R)zH_6=<5>Kcr#7pL+~c9Wc(ts}KEgx4+L{+%ntuD|*5F2hupyzx2^ zRgtmpfUWT~cuzE%>kcX%2%wZNCp24T;4`p~U(*yLEzR#ep(>ds^E>|sd z4;es|1@8V6X#F6Vp%nql6n~uqp6C&@^gG-yGEc;PjB#2NH|jKGpvo>`9D!QJ{M3(l z@%t|RyJEcv{5dQnp&!9VyoN!t0z6FWf%-*+9>Ek15G$klL)DHvI_IlOqkL?D5E`SS zoQ@7;i*#uFLYRxu(riws>m$M{Xv4lTvGFHS%+SWj+QvLi|DM@%e0HGYxS{kTlg-mJ zyXH6MZEfdK*I=3%@%ia|m$drTlMJ=Pj2MA|%5RmFOQ*B;r5yzsC?m-V#9qSQA)tU* z5>#+&wk=q-WceC057C+>#Y1^;PG<}7%X6fg>Y&a zj;mI{EQ?9!Oub0l>O(*0r!atgFWJcwz=L|GnWDh6a+HDL-9kqVN~c9CkNb_>@4#6i zD~bb-<=F;Ng012Ho?7#qzo)MYzfCE+E5bU^O#egVQ6z zvtIG?d4yOus%>jvdSFA4YJ*h#X9Sa*YqV{%`x{Z#Q(Hyy-*(ixa2^q!bdU78k!sX7 zNdLBvF+m!Uvs7hC0egEXTxFk3jgzfiZ7lWN4e3-aRuN5dVI>tm(d2mZ@=4lWTxJql zA(emOF9eGu)7{5thEA6g-UGNKl)&t&Ly@2;R_;?C%IL$98k-Hup)oWI8bhfY`T0%J z<(J?+e=wQ?{UbQhTAr}cu_9!`b&;Y2Rmf%nVrYOV+-T zsax?Q`ALcakf#Jb^i~28#C5oc93k^#GZM+7-knj&As(EX%sk#lyQ*-`i${z1=CR7< z`FEp#$n~8jWsWY7ClAe-6*+TMd*ec*W~d|V&!}1~d%HU4w10~C^cL70*132FJ)hPz z=DYb!U)06EnGKNVwN1alOtC(zH?RkYQV+Q)$5m+jT>YG%Be(%Iyp*;FWi7+#csw%A@Z-eqv+BdddOJDem1sn z%GNx!ww7(0@VDz^Fo;u(@kP{vnZA1iG~bP7TBg zf|6P#4l0niy3ZF7s}iSxK)?0R{u*H^6Rl0lE-!r(hDjFRo>-~ql|pX&ZHhl3B;Y4pZMpdiK!Zb8u!cu?uYwm70Iq*3NL(!Q#A*<^B)_h=SJG)U5cQM(&J5CL z4Yg~J)5(ZMqANotsX(j%x5J@!Wz^lt*L|IP5k46f86^8%U*MPVud}?HZKs;G38nxh z?J>4;FZKrM6EMPZr5ZjP)i#+?I@@hr4&~gnNg3|U$*uIlmY)o=elQmu8gDEX{yh73 zl<`CSs-{OwCohSWR03X4667K!!&E$R3xlg73HSt38B9sWa+T}Jk33+_q=mCD>a&L) zO_qC3YTB01{9R*5N>#6Q*RB!RW zotHIEJ;KAZ+&q8u8;8TM*)l(`%WCL}u8D*Wk3~cC?lQ6U zg22k)X;^nsEgIUdw+%ovt`1<@zZfUKplVME@l_fE zbJpw|$Mg!Kptj!Xx)~SoGTfK_bFn2;3#vuYDSXD{9In`>QnUhQ7SMS7D(OR?8@>{{x zNAAGS`7bZ`!RRwY7ZPh^oB-hfua`l1k0+PfH|CS73D@w(Bm_}1e7!z_YmKD_(=w&< zAQ~;#8fkSeZZrNytydW5#6nmaP4kRwnL*^Vz3wJ__Z7kNR(+C&+ z*=3Zv2r@oZBn-Dt8v zAvra8+aq|>_yCju0!R#t?dwnAa-=G4Q6jjDkdLt&OS1&i!6$e{KP?jOW4My!(Vr9a zfA}h&UIysMh#<$j4f*;X z@Fk+ImJW8NPvd*D>=HD}xJPE#S~>AIZ{RqO>swoqmlzXZew!e5NaS?3B5X(0z-UQt zweIy^B_Xu!3>&k)dfenubCn9*GH124MHjA!dp=AH7l7 zZtcD1ip$LNaTh7xf#Z()d~lG7-a;I52uWKfJhf!=gDld=|Gr*@KHs%@PUpL}b-vB} z?6JG2ZxnUAlG!-!^qo&^;B#lXL(oXtK8Bz_fAUI?(5?aDY+Q+D(hW~jQ*tvHo|H*k zyyIf!o!yZJCwY^CZ;$iWWHi;oyg5EKzP`^;Gwgn0IOgyO{qt8WchKmLA_a9SlUC&r zh{g7rdPEIs^79uZ=|>Y!vYhVeu5`6UL#cVRlFzao3B|sGU(0&`Qe?kK<9=pk{`qPq zvA>M_;?>{3Of-G0L~g(ah{X33;(&kRt+Rs?dIiRJyL23yk4J#~TpZih5V-Z^cixAk)tyckFk?uSO05}( z&HnN8tnGVL9j}Q4-=7seJd1*rMOG)U3X zI!mAXlf+{M*UsQA%hGZ~N5e(AJ!T_987>T6*=J0*3SGcdrYVCcp1Pu9Y!hb@r78%K4F8>Nbz=ifAAsb!!QvP>t|AkGw_zb{W zXq$UqOf^1qt`4;1fqk24{rb#>AB|*B@BKh1(w$vwfM3Gp;EN@ST>y)e5C5u#R2E{8 z!M39o7IlfN3@s+J5X}jY4?C=S_+t9L2AO-qN2paD($HK({El1dmFHjfqrPjVxnpk6 z*VYoH=D_YN-e^#&%*lPGb~G}z)5Y>Ur@L{8tN0UN_y%K;+WBLK1*Qe2H831cXA;a}euYiG` z!fLuK3+X`B4p;67adAN#{gwK{8>FHrR{^z+wj@j;FntQUPsqnsICy>_#9$Zt$+F#3 zOM?YDvvF+nkZTW{Au+*DUB%y8vK|hGb4kSbMEwNyA(s$%ml>eK1}1vw@zU6TyR=ws zFjg&Qu$PYXR$FmZ{0padA@p~_-|usm4SWt&KIzDWJ@Z`2=cv=Fy{JCxoC!u!L+Sn+ zw0mz8U2)QeGiJln6B~nq!RJ!9%Y4&fZYK8+BqdKif2YUaq!9RNDM)@#nZBNXCtmj2 zeL@vZPF8nd&~_COR@zrbWFa{Dau$LYYfdyP%mb=-6qPN_hI4tW-K>lHU-9Z|e72Lv z@cY@xzyn0}B(r|yyr_FJ*V0)o>N%UUAZ^lRWcy8SJaS|jEP<_03i#>BjIP3X;}``k z^r&LIg5SNd`#pp{q=S0dH~Y>7maFjjW$XQ_+|RhMg|C8J^@i41iCzo9qto2q4qC$P zs=WZm^$HcMSpWk!+gX#Y?BJiM@CWJAnnBm-FODs9e(75uB!Q16a7kWk}lR#*BY4; zsyw&RYjlWfF!gpq=XR})S1;A{!M?J5lCR2ujuhjqAEObJVftb0-V|vcBx=~JKY;|W zz<=Bw0$)8g)Wa|j%QNr1AS2L7re$cJVG6oN&5EpOKx?a$xUwzFQeamq7NXE1^-Rzt z6K?e&RYW~38TSKSUP!ukt(x1sN+UV8NF|kjOZC*Ovw22ejq{kOG*Z+~y}oMqvZ`>C z`_a$uI^3d`+;1n8cV?!ad~_->GwEu5_>H;1GF9|o7q7Nge&O#3Qzp3M^Km#Sv)=I2GaRjQRxZUK#<|fBa&B_` zv3fV$=fGH_`j<#fxB_|f6wZXTiU-^vbqAnUTbK!LRb2`~+6#4UgIvKv%lOtI0n=*U%(j{CPbiF9;gZZ>yRe_71)P##$M3K{Xuw z^`|eR#wu5!c0dAT>NAbn<*aXRvo&|p*GBc&kZ$U|tJ;AbTNkaKq`_taO?XDuh zlDzvs$OP8CeF(|n^#YQH^j$--4WP@jTNc!iOxkobFyoE4ZppzH*TyjVWtGjF)Z?(UAZ@?IDX;P^l*e?lj?SkWL{~9?svVIr_Xk;cC^qH4hYaf3sINF?7UXl55%uPW-J!Rg<_+81)et=`B zXV8!mYs{U?Gu3CQXWnN9c=9F&yCtKiFgE{Cq|rXfd2$A2xVyYMus+G=ea@JZfUk|&KIMI5V!!%xjjc@~ zCMOqqFFe6}pGrj6|26FE9)Jpvrl6VfbO1dsF9c5#ahNVq?0h;gnj&HSytan*?{uv<&MYFki4m^=bC1z)>2x zX&cO(i#t(tz%B)9p{*yH2{_@X(=Ze@Z3U0O^SGI8*`e>H>H`MSY@8BPp&vX_c2IDH z(}zXd?M{cBisDL}d$N0bKEBiQ)AK55Gxb?23&EGq>Z}CCxy;%2$e`V*UE=Uk1R$!| zN7G4^zNEW%iIRop1|{ojPmg!Z1M&okN+Rp|06wmH7U+S-&dJ%>`VEJ=a`B|X`*XHC zlYJ#}otEj5ZKt_SdLiWwnuDQ+SKeOvR*pu+fX2j!GYAs?`|mHVL-TY=1;DCQyVleV z2GYkrtBmRbsB0jy1g6*6)M|}dGsUV6F5PZ?gzM=BKA!YbzP8IpTg;F@Q;yEKp!NEG z`HT{}d2N28HxN8rpA4s7s1cu0F=ila4YaKaPjAKl7K?sbrKpy>m-+>&kh>o&Y|Ribrm(5U3vlAiV5)>9V7zEy$dO^5cxA(%!MeB7sgkhJ zKMi$Ty2BX8sd91aS)3XAebz1U^dr`w&!S_xqM`%v95`Si#d_554dE0W?1rKm!NVEc z@Uar%f`eWAR)XgSUwE$!kvC#gh?de)Rs^?GV9mf!s;ZdfmA@Ho@-ne(%Q#`JDU8Vf z>VjiCfXImR?>meJW6jqV{U+4i68arw3C-n%&b9t2kt15;c%lx5Z(M$u*8+8Cic~ao zwTh!muka!I>D#jj#cu)2HhbRa#^f9?(^Sc!kyF!DGyQu-x7hhw?B1CF_Bt{$+C2p` z_huIPqT89>^0lpA^NW&O6@ zBb@AT6M`46YA_4o@9pX{%_%K&50-jFOVw0K zUO3|!2psPSm1ul64h*cWja!5Mi+V#?LV`)|BpNcp%u0ZaoUg@I$a^^MKI)p@EHPNR zjr*RP$9p0BOV&*^{ilwUzW7dBd0K5^;ogrL-ynt09odJ5K|+_pzK-MySv+w+_#~Ao z^%AW9O-nj?xMnP6ceuxTbkwYJe6J1=ugzLE-44nQ_TCg_dyxIdJ>7{;g(HcC3jrB7 z1|1z{ZEg=X~Y@9z&y;=zMp-a93?evUVaL^0YVwbD$D zn$=5{HaNxH0hNLl%H6$ehqKG>$*Dvd8&9wM?B|(ur%$M%6z|CCKIC7wI`X}^AJsR3 zXwHkTJ2*zfbQ%w>rQ5zSPKCbcUs$hgJYPw1B~Nw!NAzN8fGICk3)KN;FkqAi^*d)zLdl`0cv{w$3Q+oOGde9?66eF3ii)0v93 z+>JrrSX7tml-Xa6+*j*{ zj$`O2R;pN9Kk>FWpI!?_I__2jV#e8S|t zjbMTn-p9G+`PUHOBw&1b^S;O!-_jV*b=6U)Ov{JMS1CUv*C;AV1Hez$yd+obxh+f! zi0zn+C94>7ZTD(oYY)mPr&o6JjAiQUZPx(k(zU%VgYs41>shz)6IrFhdjrd0X9x>~ zC`(8Zf9b0-$qlXVL$JbpYj#2x$cpi@Lf!Hlm{xpVAZEml0<;a&HF@1g&b91VCnxaA-x9&RNOstdisrg$Pyy_K<4jk#LC zULT|I=UkIUl#o#my1b+Ik!-l1_U7F0eb94!)1fK8XrpsHDEd8a_equkdddOXBabRjE0yfj%Q+zNLE z4^+X?zlfaJZZ1m@rL0y2@Z?qpVj8P1L$ix?mZtYE7`0r?xIxM0*vbF^U2mv^VLG-T4 zoaF@V(`0Wx5Ra$jDe842bb8r~%rocrlvTA-@h0`})1kGc8)UkU3#KsF;MHSgpL8E5fYF6hsH?+Fnn^@&^s~Xqc?Z-vQ`O`!m{l3w?1V z{febw=dtE8j<ceL53cvnHv9(2z-KX?755Y~Mqu_nYF;)K*~ZdKXwu@MbK_zBXeg4 z;8fTXL~Jl0v_t4dYje7K^sjcATOucu*Fj^a{gVWt%4DLO?1_95gt^5y8g&bLumYEY z=5CCTHM$oSAGcEv}uir94&YnrL; zo%?8S+#*#f;Bq#@Y@jzR#rk}C+A(5>%;q2~M6o#Yx$IU{r%?vZ6d3|Q^n`hsKuVzt!z zQBi<{Sa!L8RVu>AzQX z7_;^_?FaAsN^QQ0bCr^~a;u5wwqd_khhTJ_N#Py9BMYn0D@YxcM4Y zD)|uB*U}`j__R!xbSOb83$6yU!fxOkTQ?&4VU7TAwPh`>4G33b%Jco?$vZR|T{q)! zv@zY?mTs5V8eqwhr^Sj_^=COv(%-4(Gj6T1719=(- zLTN>^UqUG_?O16m%mk-s_5|5?way$1@D4i|ICS(l<29uvSU+^-`mRY@B-uA;DMl+y zcwCuV7({7xx~34!0GlzO`%9b8T%YTfJ7??;wUsNYaI_l=atdMykjNM-Ks|KfcV@db z`@193U`Qh*t>sj4*>1qsk2VW`fcEvhzLeEhocQ3%EzK^bFT7{W>%)~8dBPJi%~bH$ z;~wS#N8V|1>}mo=zzuhjuVN@~)ZN)OH9hiJSNDmbwx*cax%DE&5wWa6DYS|!_Imz7 ztLJZATO&SGq#!Tpk@q1xQX$Q^_HqTnlh^OtfG2~qY|r;5uFRL3Ja92pq_@CU>~Un& zP$*Z!?V*b5GVAinghLY!i<@3thU`kic9aHQZW%PjZ$CRMCaaKi=fjCQQCx9@Z>^Ol z=~qXpyg%yU?7bM${F&`B>|s(rsqB8&q^$9H+13tBw(0vFa7!;cep_e{Y!qO6@tS!> z>;Dv+|siJ6r20qnq~LJ%4?wJeVk-9 z98AOadqKnwYG-8^MH)0!ZaaSlO)&SIpWHW>d0vy=zbaOwBsQl)EP~HRVXftt5-`hP zE;zd_Fs49?_9OEVCINK92AIOuv9}#Jrq|gP&+@}-RjAv}#&@=6MpGq6$o%B z`vU+;%CuC_9o@Iq4^yf?h_2Kp%G%ED`yL}W7IQofOXDR);s?y2zj~$($9k$M#(5}+ zfbS<-6+XoRo%}+L7HobI)z(t0I6XbRia*sjMCU9?#=8tCCjl?eFWBq%uBJ zSuA3*^c~jyvhpl;0gy2cQPO1EDqNfhZXxEd)t|{@i_E&l&8SFq6I!T0`|W<{Lgo-p zG)ISopKOS_fUkR}ju>>M(v}Q3oz}CF3}p7*e~-$*xI;7|Q8|iDJW1Ae{N!!RPuY`k zO*+c9z?*}a2WFLY&mW}ClvBW`hNC4mQiIbjGxbo6z&($XZ&FMIEKmQS-U9FqLFl>3 zG;OL~t2UOi_JZ484ibRP*c0-`kJ@b-6zA0V)$%KKI%3?oKZ85UgP;QAfs2r*2$7+v zCog<9xTZY=yJH@kcU?71bQ}wiv)h|0ItZ-1xQ+9V-vexXB=dW-!ZuHl%~_1Ksh7Wg z(>UIRe0ATSywHM<;Oz)K;Tu2(m1iGOMdf?iN8KRVxbd9twH$L@;#Bnhy5_%~T&$P8 zpWdK|)VWZD+{E6-=T5$v3E54Hd(LVJS(6~9s9OI@$lwpM0k;Vv!z;+&A$)Q&zoBv> zSlDwNDRuoaww)I~iu^^K>Z~uh0JCwU=5A2TObMrRW2?< zL#GY>b=uz=0FGPZ-cUP<_x|!@Pn(h7KMSN#=v?p;?=|4!V*<06mknzQy_p$Se^%?` zo$zj-vxc|!F1{sgs^x`Fk8;aP8mNeN=a`=6loUsOdf51Lcv_X{f0k;m%KbdNkCNY= zANvCI8@TmhgNAAYFS4zn^CLE&0rPhxn?DWl&Wv)cWh7{jwC;zyI{f_n;GMf<-pPw#N^oJU4_^l^U`*J4QT01C$Wa}(;uGNyHl9E8T0S zADRcy{683HthGe#on1&l9}so{#M=sXavdCpS_N|K4wK+gZ9h~5LS!vmIt;}PMAp0% zhg10noGI&5vtLSM)i$_@ob6vg?bPvPX*e+T-I%u*R7IY4WG2L+-LWA+9l3_O=u>;a zwTHw=iuSapP4D*KY*>)5eV=L^z@KIB`7eL!+VE1t@gq3-{fIx+j-$YWjB^&o`<75!hs9-&lp9hx+h3QT2WlW}&zX`b$c8HQ1d;Y3Ll8!+ z5ftYu^M2|?I)?Jan_ShI6&;=eeHUx)zN2c|JNz{+29g$3g}Q16vi#wrD$4Z7?p{SwFXL!0-4X4k??-TI3wmfXrl1e^MFXlU z2bk%0@nlu3{9vuTMbEUBH#W>B{Ybh8SSj^pYj7WJ45$`z!d*YwZ0?IMZv>l-Q;>Ih zZxZ>i8N>1ns~&=))BEz4!Dk``qVCk5_LuJt-<2*3zVXBA2uS&$;`+DzCIXSv9|&#C zlyGKBr z;PH6PuQFhl^=R)Z2G!T20ZNRxAvUh8yFaqtu_=7fF8*47^q0_a!3A?96mCS(Lub&N zK-=3bfD1xntmR|71KcA&ZVO6chpRp~)*j?k+3Z-ByRvPgg^%Q&j>^;R>}$T?+&Y~Z zfhz-V@Edu>kpi30FE2o-H^v%AXY?=0Cm=ZFlpo3mSCQo%$DODuy6POZH6GdMiJZsK zy6ARvt7d9-WEi(ecHUuL$v~x$>HkHBpOUge#ttcQw&I z!{n++$_)1NkmKCH6&d9Y!=niamdG}b?ysjGS6j~{ankrx;I;I?7w4@UL8Ovi5W$X2 z3!Jn7{-6whe0n+(+XeQr*{{@l_#H*WkCtsKPV}00Zs(dC_}E&L7v9d_Ki(oFeH@WL!k-ktXK z=~gPO!QUJNLb8mL2^>`815q>Y$CzoC-n49WQ0M6_Gc5xi(?E|)4VSz&u)bJmQcg8yGmk3wZ z*UtDLx9F zf9t=f+~4|7l>1x%iuL~;u&w&9%>Q3P0VvvwG4Z1drVvcWl$UTV4ZLJz8x9xt(_DnY? z4^|YwdwCFhsea<{Ux$c;Hb?m{lwO~40*F;xdFO8ab>!5sO$(U*p{}msFWgyQ5HZT# z_3-oQe!uJIy`VO>?5u-a1bjpm=Euc=j8g9IBrPH8TINIU<~}W(EutfG;+Xf*7f+#0 zY9$Mg08%mdVWFt#ynlQbhEL~4%x_L8fBI+WwbkxtQHg6@y`r|z7z?0q@@D2GL@x|r z3+q`c2WpK#^q!qwiE?tPUvrOW(tovnMwLJ&%)P3fy}LO63|0Vw1Si-R3cH9L$ZOwA zqT-BmQ$@wM{U;$`$mxfzq-%yrTR^xLy}C0`mR;e8WcBk%j1jfzd^dS(Bd=f6?yXNb zA#MGAM3CZ=oehHBx_oXhz0XWJt(@We;7fLfEIkfl40HpZPRjB9m1}5jMaaOJo7}S= z4XHAI@wYwDI^24)y*8X5)HX68&)63Xlf1a~*d^V}*H2~Et}BNka9?KZhP)5OPwv~& za|u^;q-O_rH$mi|e=CPfjlLB?@F)LJ+`oWl58*v5%vLQGRlg3Xr*`!DFfl(h{=u6y zFm!HlveNS^h-zgSgQuljeZiX`4BT<(_H4JZ9Ot)Ih z6P?0>&>4w&|4^`KNy=4WC|rPW7$MeWPYF}dc!OwhY#Zg_(k7pHF2hHL75(oOBR^!XPxuA zzmv(lgXe0o{$ed95#C)@&P{C{?U7k`zK1ote>`&z7^#Jg`){n!Ej`xANIp?%$`SQ& zD>y%q+5aGsCM2wPqd4)q?h8pRhJ`L-K(0Db$fIs2O|FAI;Of%~-6KCfj}vvu^-${R zUd67NniKjIr7(7L+17=nnt7=3TRY=TEnSbr*G<|Z!K)tx>IT%sHScL3DinQ~(FS(g z=+qUcl{r?WeIEoUthV4Z7!b2&R4{21|JNYf_DA>KcdPa_if3G+kFOpLpIp!6y`@%T z3`?zizDRKYL<}R<^~x-X@XD2F^LajcY!JY({r)Zc1|9CD%f<{3PyMdA*$-cp+v27( zUj<$F-{j&Z13LeF*^3p437D`*bc$xu@%S@&wY_xvG}})1*=&t)XN0HK_a}dynM`At zo*UiN^Exl8O!9L54Ebb)&@vA_t#vu~IbR`8BEBnHqzy(upZw~avptPG)jKk%BwoS| z1L0;scK}K%QCg_~AX>j4?ER&Yp=guWgeP7j)%}M`g!?OP8YumvmhQHhgOjv-tLM;R zKsMU7@?~6ZsHx^%UCc^!;0*s_V=g8BTpKre%!~uAQ}-eG215Mh@?FuBY;VM5t@=Xs zIlJhK8nV3Aon4C~ALA7I(63()Y;Yr=Wh7^L=he7jQQMqHGNF#w3uxDo^B9UZuRZ@{ zh=?N!B!BVge{tvWI{(gfZPWUrV;4TqL9~8({vV1!_awUn+!L{4^}ltyC&vC?iHDtp zyXzM{{*NOZs2|M)%hKHlgZdm3YRhKJMZ!&4KB-Chy8CS1GW}5mZ-Y^gUc)%hpIhn^ zK`cb+a<5($srF8}!fI>15U!Znm(F6URJMQ1lrj^IIJ8|oK?Yxtjf2`e^T+kv1mq9~ zpqtyvH43Dnbb8{8n(tqHt$foxEn&?sQ{BDZ^3W!9)A%)f3J_wWfa+@RoBTdp9*)wc z>Y3krl0+0(XN=SqhPK_h8ag10NT}T`p?;=7&U)sk``hAox11100`smRJVdt&nQU7@ z%$-=dAZ^v>xa`D);BMNlaHg+D_Avj@cX*0>m_kh!@Ye9+Azcp@rDCyQ{|F>xgBBu_=&dEBmnfQy~Y}p1r8nO4JIA&%56Yti) zsB`!J;{&U|a9v&j`rgYbNG{YvVL?iq+^Y=%BZ!QqSiXCm=a#MX>xbaQ$&b$bCB?M$ zhzE)L42gH`qnQG^S^Mf+$?60H^0l=X2!|Fsdl$4Cjjw;F%kCEvQO$$ah2V3FZ6ar_ zFbjJTxR0>=SX!)AVjU-Q;u`%ug4K|1@Sf$)Z|P@F%}Ba%*DUopU`TYU#_!>!8O`}?kbklzs1a88L)!B<7s_84IT7q0MC5H*OmyKUY5(wJj^9Fig9TdymyxO{+*0gVS}&kCp3m%9+;St5ZQP70~pw(UvJLah)v zud0yelYFOQ>!KyfI$dId$4Nz;>c2v*QG2uYSqlyC$|OIIE~>WfZykY!y2F5@VfDKe zKR(w48pF~R_-t$+&fwe)PwjN+onN9>>-eM+T1YP znI)5HEl|k1aRP!-8>ELWT#-8+MAdGNB%Lr{+x_9SVA*zaMeJR@x1V3|pQp2rU#A4e z8aXSpWM)E&=P`Q|-O`h?eQQ6v3`*>qW+L=D|2EA8or}l9xV|ab5@@y-JKr1d$UQQD zvNOR3-yu}Z6tr$~uV}8+$`m?^ZmitEACl_)wQj$MJtg#P$c7D-$TX0bTCjQhlDKv& z9B5JIp$*%PEbj!=*H_rhMUuZQMp#Fx_ElFij+)52grNjv$dDd?lNN06r(i}-+0a81 zY(wjhkXqhb2bM#A7A^)*(Ih|7*0gzD3eqQ`9-CL7N+9JC5K5UB578?4_R6~(##h$} zC8tJ`PE~eL&HG(*r9Bs{KlhwFN=!=Kvrqpteis(0n&ddA_PsDC&j~7!3Tk_WiGqX< z?A9=XQ45T*0Fdm|==xM5RpDVz5x(H-u? z)}L_ov6c56S6M=yR815=JgTUx<bfpnwpHwYwL);s*C&ZF|sHS9I~`RZ-V0*pw~Q8_GV7hX8(sm zzwL)SXK1Il-PaAV2+h`KZY;}`nb|%KNlubVQ9*D)Qlqve93VX~_xmRynzmw&qY{xU zWE7kq<~j3jxE=$cU(=z{u&isyXA_IYbAOP3zVkKfU520jm7~*sWP8o(ZBnT=hyd9* z9j?;8?cFQpy+%QZc}xf*y}~K2Pn2Y%fVtdfgo2R)W9<^*a!!Efqoho_2M{dBPslO$zR)TXBBqHnhp80ou1n=nWWEy{L4$9&R*mn zWwL4hLvfSqLQY^3UE&%r1c2(zjSO-2PX-!N(m)i(_LzBu;HuTO`}Q zbNVsvc3!+sE{)T_XSF#_mfsAe&%DZ%sJ8qz@FZy7-ZrlJ4)FFF2-h%M3AG0;1TCww z8dOEx$0Y;jYJ#2ltAe#B)Bd&P7P)+dnjhhP!>sl?;r{RK>5ccgx?VmWd)^)6tDx=n zsKJU_3OaIpLx(jxrdxOJ*d2EbM@^>H0R$;0TuwRQbx(!}5bsymLFp}9apmoC!C+Ph zw9F*SfG@VoGJ0YExgL*YlD;I*Q?8fKsQ}07H)MNVOvKgV^~v-X6~%z0f|*P(l{sP5 zv$_EU4yMj4wD0Gh%21lL6dLDKc2NX|hCLu>6?4p%Nw_*ie{g+xER5ug0?aQ2G2Jwr z+k!cv80-Bw#t`>G=S0A2Kvk-3YG>LxXxSPUo8S2N0bKufI-@V$1ioZAFg`B{$h8b1 z%90AY%_|7m>lKX~$g74I8ZhIY>|qG4mUFq|5;WO(F>ff|zt!IQU23y_nL$93cw_rh z%xaY48cCSeENa7eBV*4UNLgedq|^h}UnHG2lU?5naGRD=ElLC0+%Kp;RX27!y|K(I zscpfeq0_iTI`Oq6kKU8uV8|b?jkP^Aj&BG=NtOeQx++-Cp88$5Lh|x9t!w!>Q&G$SewSD6gMcXLJGE@g+blUA3T_bJ16C3$ae@`L*^D5m2Gsae#AgIM(IanQ zr0_P7f}%mRnIY4xJ>EM{TZ=Ct=;l^OyiLW|_D)zPYUNIA3xq4=`|) zmK-#IvE2Yi-#4b#QXwBcilHoxb9$D;vs*8uL6h};hl?X*I#B>iOIt<+0jJBmW()Hu z`iR0cIvC$fcR(%bu3zeF<>n~Yl`;0`71)|hHWg~BJN5I-i)wgz;QRKa=RT$e+#o<@b^y&4Nkg1^ANjvFwuZI(NRs z)>+{A0D?2X!$^5RHW3tpwGZjJ(ulhXR{sjCYjZPN;Xax6#yiiV6W=DoTWloL_mNNP#~A4D~r?eD}4N7BE9V; z@$uGwBL$_mnBL*#w%Z|pJa)TblJWsVB`wv1V~)Jm=;y0MNEe&9z3CV zO2v1F2$;4&I_xHw{`*D!ABufS{||fb8PsI^fBS-<2uN>IBTZ16^iD*iiHIP*MFgaT zB29vXM0)Q63Ia-%F1`0I0@9_E(4;4n7$D?1_cLdo7iZ?o{?Gi*oEQIn_A4e#GQ*Jj zzV7Q<-?cvL!G9+9N&joY{h!%%|8HX7znIYfOze|=0EmYF-CVjF|6A;%r21b+?E9LD zrgq-QL_2?p5RlT78RLtQB@_IVNJ0vjGcse)haGodrYraEh8l+&CJ4TEn&Lc2qRAKg z6nQwHycr>~iHynx9ABO{3YV00a{D>rTRt!Rc_RBfjO&$dTKaFF?rYw?6q`aMI~*ng zrw{A#erikKigGx8r3~&rj*%MYcYm%{kDn_e&O_?W`i2GT@p_oAzE&3I11*)+%zxd! zoTdoI^V=mJHrpLSf69(W{6o?ZnZOq~9tGy~L*BA_AR*<#CYQs`z^i!wXY3aCvqR>e z2wLyu#fx(W#Zr$+7f?gXU?2Fp^YiwBLbSg4&HT&5MxJ-Ywahe$18tEeR{%L>M{v@U z3-7mO^avnSP_ky<8ciTtje$TIu1m8u|9CYDxC(|)vjpo!k4LFkl{bq?SwS;e`lcEo z*`LxRi952fn7>ajXX)j0Z#mp|CfwzzsId**a@F4qaF!}Z=nZuqzkIxGqzv%j_Rs`Czl3twy1G$Tt#1M@VRRuOYO zRxfQR%d;>jS#+LDl5^W^4Q6LG-{Ns>ePrWb{$=~`%fw>B3xCh5y$jE%fei1)7DR4f zfwg*2xnN~R`R~<%9kIfVC$;Q`mKuEG{P%m0UZ#1xOZk%ZJaJ3*S%Itf4>PclOt#gt zIhj3ut0%1?mj)fd9%3F98;reD4~87=x+^&Fi#UTB)RdbaD6(Onf6CYDW>p=vhMyNw zu;AunCapQ9p<~@fzXtZG_4=Sx>#cZ;-{(HKJp3Vo7O&2Sx!THEQJ#4nep(@QcsD!z z3s5|^5q$h@A(10}ceKmBz$}a)iQhm-?U-SH4?@9-G7}7`53zEsstF%=f0B)I?cEx5 zt;A7P!~5knl@f)o8Vi*&`u~Xeq)if7TwF;NN!t6TH;6`6n-B(PTmD%%8Bn6k=-fyN z^?|zXEg1Fc40+1~anc4=7Y8T6Iv6>xsgpXv~kpfWIs296NzYZa{hb3Hgc zv^ji4%&Irzxp-M%zAI~rYWqP!SfW@QQ@<$URh-;tZ-_{Qnov5YW14zABV8<}stY@?!fzqYe=>T7FTeC4l&2y^~cY0<6{3lOltZpbM4w~cQIqIDQzJe149(#n-J=jk>X ziAc$B)!>H|6$p1&E3OWo7*wv7fqiyjJ0<=)DGTP1@niB(UE!yAE}G#G0EjcgK6vXLA`(T@KUCdMC`0 z(7grGPbyFOO^upwTOi+deYYv*Oq8yQDmvgMv~qtad6`)o-&whx+rKV^75r)1^45{5 z$;C+{mC=6dt!FV;&NGqSqc9$}I;>2gVCwKM8H;O>IODULYSf#-irJ7oWCZ zD^rVh(ktXjD)!zgJ$+|<{Dd%~l40gEN^fGKNh6>^$w-&MoIh>~pLwe#yZPjUYBpQR z*^R<-a~CC1T#MU-`Gwz>fQ9oQNxArpS`+{|hdAFp zRb-viQI-2XJVdr(KyN{L2MFw~JFXY$sLU;bF~$aw7X&5k&KHj^nv`q0!>GSJ)cK1yllh-Czv=suZ41MEx5utr1Or=$<1Pk$(5;)$k$(Z3Q{@IVeXeMh$viqV+L9OOYxt}cU zn;hVTTW~V0J&{%#{{nRx;I2kbAjfB**Qsv1RS^P8T>$+^<_^WOb281wes<5tb)kh0 z20#Z42F^Na1glFy#9SwX8ke&zT*4e3qAA5nLq|)z}>*_i94j4+WyiWyS~d3z4_46nXFoad{>z@F~Ud zKu-+Ng9Bh78P8J~m>bv0(;*Bu$=*20pFFE#UWHo9=5N0-cayKL@1Ptq*69-ZQnlI{ zo{M?t?qr<8nHX&=%i(ZqPhjEMha&u=n-tEXkI3e}RLvZP0Coy(&v^(c#bP`N^{LGY zNjv$M=T6pmEPqq@n{4f8(1si`2HDEkpPSjvA}7kZy+^%???LP;R%ISQcQAw*_Fm6j zwwjegWlE8eUs##{mPIo;IeChbf7MVJi)!5b;OHdCkOl07%={QdqLpdi}>`~ zqWTXAirH7ZqOyU%@6HQI3cpUUFiRAx8A2JR;Fo^po|u4OM~osl5%*j=MDR$gkOc=_ zZ|qgz3wnY&9_bNf@~n{Rt5vp|+%d0J^+p}S^=o`GY2t-a2&~dB22IK6EEK1AtNJ@^ z)0ExRNa0S%P5#-oi@Ie+Z&@g}SW#-s)QJ>96LrAUpUG2(s$$qlx10^HG#@T#&e2iHXoc4bowJ@dlCsmfOceg)c$5YooMd z?PeXOWdhv;pSAxw@D%ef*K<1-n-oa?#L`$$Np4gYQm#OARRjw}dG;Dmy8187g(E;P zp1AJFri0qk_3YM%0YW*#X&bKvQpR)zK4%_#E{Ncs;JGiKJ7dh@Mwp<& zmBymQIsh>@_MxN*zuHS0?PjqWF1C579N*TX!*x6%NfN&z_~gl+hGiN`(0LFGmgGfJ zzmGUlMLDfa>4wh7_m3I_9vCFc^({AkeeA~F1XgwBp_~Pfugg1Z zrk?hJcJj$8V3_y=;}A7d)7$sElDa}@Y2E;F9fN&dpp0@9!8%u;7}9gV2gfV(=IEi*FCHc?ivOx;YF%FvT8O9KJ9AA|^??o1CC{SQgF#aD9}7%eeC zM_~X=d08=gY9bS|=4U{H<>~a#caBT%A{Xsa6wuWm=%ARZ-=~t_BO{sCZ>DPtg3)ed5r*ORh+31SeVg{J?cP`Yf#}lgytz6|h z=@8f9((PI1-&4@C{&g+Wppp7uw5Ywe$#=u10qF~o%lp9M$xT!x7&Zrv1KT2+J9s;k z2y`O}M2R`scJKh=0p=UbLFA2!s*{g^+*W|8 z0-w9qE~|ym)5Q)d(2jq1E=D(T-bZu7-PeFCmj`a}J%p6uSG@$w=o;wyodFJoQ+*N_ z+$ft(^)ht`g_-?mkRm1ncke1y?K(uelpt`GLu7@4%wt_5ttQ)q-0wD%TCWxEm!6bt z99L2vSsM-Lh-p)uMXmm?{&hoP@ zH6}e5<$T7u!(laowS%&J&(wOQ>vY`6l@hRL(?Ifvgm4dVsUP(A$7WwuGu5Z)JvEgc zlIu}G^}}o5cHn`^f&+k(U0eMwz6Vs+BuI&ZN%Y zepV;8pw-qcI{|AXdb0 zaP4@w+V6}`hPuV`eKnV_n5(*lL&Dnx^Q6APKWE3Qz%y#Cr1QG(Cl7ZO)wNX~Sdnum zr!HELM%m!=KO{F_OSkR(LxM0^*PQb@9^Ox!zAu6~>H}d+I-`|>6C_B8<8ODAA6(&@ zD2Uaj1!q&OslBR}}b1RgK zzvpD-{-R+a{Dwjr8VSrs#08zsMmP=1%yE3djR-oQDsEx-zju1sUiPCCRfSy3=TIw# zRtgQON?XPJ&hlEJ84BF;_n?D zSQIZW>;g%pFd`GaQ!_c;!fjvFPlDFA&8|U@!#dzN?1OtU0+t1>q)HyTin_`IyV8*$ zCV9A8rwIxYz7mWsl&|liO3qhMEtk z0Kr{BA_~c*!j7rxl}AWmXX{-P}s57c8V^8vF}F8LnG}$ zFg?<}F_^y|Z?#6f%3@oO?v=@`SeshcVSjdRzxeS}T0@$4HmfEDt%B@1@Lah*fp0E$ z{tGaYbGtq1J=Jbuw`2U;eFl@u$`)xZxHvq*=fisX)p5#%7N3 zIM$wJ<07$V*{LrjYn2I~VKM8`fYys`jSLugwnWMGNnzv7U_}ra48e_W?9F`E(o&gR zf)6yVwQ=gT75LtMDRx%+^JBvCz=4-+TMVsyNV%HhOZArs`m3@|*Kuy*=sUCEBNb_T zlmQR^#h_*XR;&{iWIDOBZ89N#ioXuvvX)z{HC>cPNCOy;=`V@H3eM^_+rk5dy2tsh z57I13jsL!bkLzQFdU7KWH!v&t>qyXUCR+rY|4Yy09*;P7rGh&myy(v6(+np06-5$_ z+u}bTQt6Tq)rb?Tm=}o@aIjLsr%MSqTQ#<@{agB&L_Ct?pb}1pxj<_QvYzPv;?aYS zWW7Y^BWsSeIWHg*!2<O(e@oiuza2bS`M9dBwy8Ew74Nne zzyDl3;zSx7 z{gdkC%vYgrY__S}ze_=D(peW~{8cG5XhOXc1W$}@lpur-?LCSC5P*0EisH&#^8elb zEoQSnot)3Ti5Tl(GoZfNV}C=rLT!QmeL7es!vnTiI||pWL@a|@&h9cT!}YEz+8*_W z-mS%U9Q9(H^3vn)W*X^`Z7nbT?T6d1iGhupTcJVVo_AF-;?J%(tZ6}dgQW7Rakp(XgDOewkj zroe@zJYifL1FQ)z))Dcl+sW7$xKEhVhVRibMUx2G-IaS51*T-fO%dqFapJVvE8IR1 zeYga$;M5@IZH2HbxuLHB@5!QXdu6rf;}I*0m}$d5wxpA7+E6H#Q*X-4C!hlM?x1P~M?Es%B&Fq>70yub z7XR_l;=Hw4Kd9O)r0S3mxDKX)t79gC0tbWy#z?bxmt&=x_Vdf>{iEy4Eg6jgf+0?g zY*xC$i$?0dk`TB#umb=UN$h=R*NK(;ny+8f>oK}v0}HV$(8`s3S%ij2T#p5%G5d6H zvkZ?vlh7FL*8*E)7JESWF9WAM#bmkF2A_X#iZ~p&m{cASX$>H6_-pv&>v}ThS5wnl zH+N}lssI^gEeCMURz-F?gWoUcOkA%sgWR%RMa_Ome?RCHK$Bg-*MlQ}!=)`l#YX;8 z*Yg4S`+_U1rPdSZCoXkOW)o6E3UC|jrY=_*R7FJM6|*Q3sD6eVW+>ZZ`) zl1pvv1EWR;vT3qQ;KY616*IC#oW3|9l$sr^P)!s@k?6w0%hboYUg>P^WD?3J+e92I z``76rmCDYQ==vd4OL%_6Prr10_oB743T-RBG8$T9*j{v>^2`2Q&@X!XBF5|KWg;#B zpNd8TX|5c)tlmzB`Xf?Z6fcnKa^>NitUJ&%Z<;)9J~(?^XV%ux6zJ$IJ1C`EfOPh& zHJ>ZZY{cG0(h(<-0H?mS z%jvrPDvo@*I;Z&@iQ|pz%hV2*fC~kc4WqK{_3EeUp~GUnc=4k8)cwhwIZQ7XDvf=G z`puY00#lMsRrAZHiMnrT&xb`z_oS_>6Mof=4CM}oD6G-mKDSoIo78pPHEp~k;mSrR7x#%GjS{_#l-&bU;|S8Q|h){U5N9-xq| z0=^Ztt2QDZVsy2Rq8}34L66~SYN1Jt<~eyhn`#0)-of3OVe+%-nfX!t4WaVlxo)Ib zKB@Q3-1_h|H1DM!>oyFUKpo0WEtTxUFA0T22+s5Tp&uoM*KZ^$3IK7kE9&0CQ#txr8 zq;~(1WZ#2G6WFg}0Ce)R$Ue5!dPFDI-((IoGr6jPArKYQk4KE_at7FEA$&qf0~2}@ z=@TTaIwHX#6cgauNCHDGn$LV?$#sRheYR4?p!m<6m$ePdlvAXNYFEj${wnXt&L384 zNm-E}vb2hYU*6(whXqZG|__Rp8usgT)B1nz}H}Yea$nW&CJI~a9YW> zfC$pdhT3Kh+-Pm{pYfwP{=^%`e(QNR)j+Yb;_xw`AT;7?@!{)`n=pB;U#FfVmiXE6 zC)2*2jJu8UD@w%P>bX}b?ox+;y7?B=+wY_@=-$|rY~tVK>kQmSu4NJxNP)MbsXEdv-Ah1|Kf-}eOZlA>D>srz z*^43a7vm|2tl$ILk{wJ@LZ)XIGJ>s<$d=|?mtD3v*Asbc4BXKN{v33X_2B(0HJppxrH*FE zDC>kHB`!UhI_XyMN0C7JzGbZ=Eo@uMjl#ka)Uwv>EVr3SOGi{iUwTC$Rb!|Hiao3r37D?Ob3?Z|D2jPVs=`G?VUT9!7P~Kb-t(eL} zWle>Lta3q0PEePS_x3{@zSjA^k6ndFhKPB{wbj-g2_g#|*(7<+nu7nU7YKXu0r0wI zaLPMWPYrEedM)X`px2C$OM1XsY$`cx*rMCb+3Gx>=54>qsTHykzK$tG{iNB6T8$Sj)CZq zE=LiT z(HZ&NSp@`*+~4#MYSh7Yl#yrf2;yzayR>;K6vVdY9ll*U{g_DUaBY<8lzrlH==`VH zL?CYh@Rqj)(s8){#pE+p>>Q7aIzOy7ZeypC)~ ziBstx32Dn+CC9#p8Z?Wdqg3!8f7A`pAhtG|OLAh*Tn978Y`_oSxefxk&W3;^SE&hf zYkF5kNXA9W>j`X=lgxD!j59_$(*bj_^&~&ui))c$yLFWZ7n6@YBnTnh(FWoFklbc6 z)&~zFZ&lrCt&jHL_3;$3mS+Dc8vHODE5RIPykHwE5-)`>CNA{m1Jv94Ft5wCsyWl zghJe2l5v$K=X?&un?0(t7!8nts}~W+I_dbP%}flgnZq)yV}CRmFvHc`o3Vdm*cU%> zUTPSnpi!UQ4VyZjL#NET@S>gCt0Vy9OSrm`$@TP_O82 z&hMD{n+Xz)8^f$y8Q;ApRTLoB_Y%~BF18NVh1e=i=$>O4x%2`aq%rXtTij=3p>9;> z{>9>`?E@DmQ!_%AJXP2lo#ky;_G=3+iP@4*7P~X0w&<_&4&e&<$y3p5d}72U2Tw*m9-5xjdqfWk5h7g zB|R@a)p6jSu2L3HaWUKhABg_q?mNo%BxjhrB1Qk*mcGH$X7(jZL&ib(-AZp}{5)rfaXYMgi{bUYI-7_;)#pQRKgf<}fOiV`GH3hP(XZ+3`+4cX$;^gnKk zawIF0F0?}r#^?QsH`y>psLh1!8lMtIw$*a!|k5)q0n1NMk%`aS<%qA z;8|*AJin2WD0p5aY{GB zQ-R|5ROE-tDnKCzfH@V7Dy@yAu8l=F`_=Q&d*yYC36Y zvtTnI7~{OD6+aWq6;k;_eP7@2^f^Dq3JoSOCO*e_M!zt@bEB!tK$K(x=_{nIIqaum za=PTDH03GXg3}B|n8y!(CU1l9al67GL`uDN5bFca=#Kj}A>D0_nIlg_?RAC_nB+!< zarT=JaaF5)??0dD&|jldF+Lvn+mOGNR^fxq2Ou{gkKjBLGECoKjKX!}+>3oZQ9KePj7ZWsof34%zX6D$=>fzC-&fdogKn-1b!5t7M@# znEx7GPcF5nNIqUdGj!--b+U8Ji`zI{l}YWS@8xxB7dxn1={2EL#;=CwrrFFS?_b&r zT;|jPzSI9p>HmN8^Zz+(E-m#RP6?#`t0{rhzwh`TVRK1oIpD>AHYJdh`)`PejUsvX zzo!KM|Cti}7gL09PVUv|Le5;Zes|2a0ly6-+V(DBe<@pbvE0fpa>i}%X9gwY`iPZ# zRI?b0u-r+1)pfR$_@qgFbe{C@a{shx@879j5}}C9$8m@P6OA%+(t*O42A5`D!3kG1 z2&=t_Gf_V=h+)%oy+ygqd6k2O$KB@E+@bh_-*G=jn;ViSN~$7=^036dRa&qUBo@hB zd1j;DX5qeeUghQ(v8(fH>Wt=Ltg=j_&1$PvKxLkB*N|kHlfZ0pck_(iN4h^!K!$}a zq^>Nzb_VW*QkDAy&cNAd^qIajyWg8arSkrCpW@y2CVm~`&Fr6nUhTb^E_A%a_TL0+5p+>E)=uf>`7gIfpA7D3(?mP+uNi|E69sl*c9LTRiPH5`toGv_fh+>%8iu)QxuvGQwqPLDZzE_qj$7aG(y{?jq zw)h>ZRcC{v!GB1C=&)7C6CJaDt8{y;3%Ow`+T}ZJ3l3%eg}WE8+f~yG?WI0P^EYdo zX>ofOa1cv@<9#Pc)^mXq=LhVz)|F>x+aRbCtL_!i))uO{#>qvkGVYD|znK=VoR@|N zwr?3I{xl##@j!#GG|O&0?+T&w8Y(thvn^QR#Z;ClJHI1V6^}aI-3!d3d1htNr4rZD z;1hR^uFw}m^$&^bYU~OfHck?s+kep+Q^yT5V^tz1m!-8q%kJeTI5Y+0A{lRPa9Vj? zN4?Y*x~-zp8hlxz>EyzO%dE_@FZpe)4TOO#2LoOF7-+bEdh@j?@F%EK#7vZP)Yg)v zVf#^21YWdA|EomWWN`Z0TE2{1j5fNbQ}O40>^{i{4=$(F&_Qs>$pPdY!J!!nj!=_q zdA#C&nlC>2=B5Sx=bR;{OhQ*I+VHtH&aY)-8{`r|8;Bd+v|;9Wo=P^EGW~U_kxg&l z+WFV_gh3$tK6h#JXF;tPh)fy(suz>jn-##mjmn|;XtvJ{v+)^kK`z1~=0A)w-z?E7;{V;4e8S3y`m)PHC|6-G z(2iqSZZ&%xENKxXYwn1b%$`cVE=bk7eqBMkGRo zaq*ayzxeqU_o8HB_^ryZ-ThU5(OfA>(hrP}2rtlycm*~b8p~KemhFRD<{w+=QM}ul z{q+uMBYk_*I@g-;xWW!Z0hUOlx&rzidLf<+u%1Pfc8si0;{%n2j9?3gCTom`K**M& zkRzAK(@A|cb8Qf%KZ)c+9pQ)dRGI*k(g*MbnM8>&qpgC@%AEX7| z9UO(oS|hukBlvgUPN`QCc=478QtmEwWTp6bFOHJ^?yRdy#$a;k5%V0xTE%n;Dz)?g zPTy5FR|b-2&tUf-&?%7B)7CcBREMEtomdg&FoT{P5^QG#Tc2(L+zhjk>)A3@siKND zU~KQGtnlQLii{jeiZ*(j{Wj$}BVD17X$LLdro_2s?;n!aSigu|(lk$|ejd@;)9CUz z&9IzTSz$K$9{%@4LKMeH2_e%+SBYrP%SA9FY_jLMWEPTpm$v=JFLi-65(?X%+SBoc zsr9k&${n7&lZ2qMY{;V~tE;=~wwLnpZsmsz!3i&%zV*wNsW^C=!puuZLTKpw2JVj= zHmsBrlhv*vyQPRihzX^qwyMODDIx{oep}>$E$0lu-K%o1LlwK+FuE6LmpAOk(d#1I z9TPar@4^r&`j{(m*>fI*bF99~Qlo%b^>93E_7ty%d&q*BpbO%WH&R&}eg8@;DKd)I zge2*Df=2m+rV{ADeGOTFfK&;bAwHV_bWFwNVOfjjsW*3X=rGgYYqk%g=AN36aoGn4 zLw?Z_7!3Z6Aa_Cmo&`@9_GHkO9SG8{MndSy+tdqfG}lJKy^T1_gu>F{q6KZ4hNQt} zOI5k6A56crykdGxgalu^7Gzal_6HW&{HUP-2DtJmKgVJG63Gcq9=CZ}(_`8@qAm(& zv)s3AUH|GKOCc++FIFMDQU$Ms7jz4jR__a&sMnK>kqB(Jv}0*MM(B6knZOjhw`Cm< z>OB7CgEtclKd-@Svn3 z1t)^D5&Hy-uqC(zKAh@3(9BulKK?XTSBGdqIJAK!>P{~FbbVKuTgPMnD@nsH;`s{s+;_#-l(6`hQDSa1IS1;WkR_-$vdy#X6&<0cu8sNp2cV>|GR#7)k z;JNIUQYGv*zfFzQ*9hGPYH8&T>#{Gw3FMf;XxVsAo9`2DY7^WI74L8dYF}LnEvfyQ zQ-|$TjtAMV%O#&UgeX+BCWeFP#blynOX{E&VgNipoi#^zQo`@{bY9cj#)N|ccABmM zU5c0rRBo(NRm7}$g@>%4R@}gdqmm}QNRP*@xSQ)=SatwRMqO@H%GTI^XH;c)ZNBKc zwEp^ z(kKbGsJ0`#cAHKEAy^3abn(rXbj87!(hzOE%cpz(8iup-d&&2v*Uf6{5`IjMu{JG- zg~%ql@*M~WuaR2#gX^>kMeVO7`W!yjG%mP(xaKoAFIb~^(>?Z zxtYy!c5M|hUyh2k6T+hfPuM>MT}u+V_wAl#&OmaE>;4J($-1d}v5nl}Tgo`)_7)Ce zLg!ixgsT8=lMjE5Q7sB(5AB!d5NO$s5lpwr%8K$G(F|GX5$Ky$31qJ6{E!id{8<$a(L{s|Yr0d~n6C7tel~s9XTy;3h%j z^wGa}+bszuz%sM2!Z~-E-P&323$2h5e>k2?)*qMqx9mLc>ML?BizDNJ*Kuu>Zk?_h z!nrq#q=Q?l*rQf~Sa`dbdsTny{E#KojK|G@IgDjFv|i`sL!k?pAMFF5ITd3qTJMUn z2h=3yJ~{O_K9o-98_Bxp4(J)rX`HVk->^W1tTQ1pr#k2?kbUhh-m#X1F_wL)lMz$AKMW`5RpFI%nmdCH1%WL>?> z&F7EjL_FEqH<%#H%*iC>dT-crGpbbg&XWK<=Vujdv?mi{6hZ-h?MZ3tEXN2`+{i75 zn9G=P#D4(j8cqqsVM2YHe~E`K1-H*?yU#^cmnVa{WP+Hu^))kihMbgC(v#2LH?-*9 zU9HZYN<=I~MxtslxnafMXWc_%oex!>*;;b}qn#5oJl6}7yN;9Oo9 zDWD{n2qnI1Wi=Xg=VEecz*R>rJ^8q>;x_m4t6TP$_1i*YhXm>hksmL#1D$pG6c`Q! z%_9_^FGeezRs9a=xCx6ULh#yKhQXh%J!Vc)N_s%5)@2F@YUR!bmd1 zy%pfHsYClw;XNj7!*&lxxvTor<|73)yGDLYSNU(iul)1w-Ff?)Qo1@HI~yr3%=RL_ zVwA8vCP8w-n47dITCY5mB~|{Sn-z&S#fKM+tt{*lz3EHd)HuFhc-zRu=ncJR_i8hr zps`@Qk9ey4MW_6gGgjcmut!%-$b2^$`^Bry*PUzWIlM@^MYzr{i8hSK=9H}1y}~Uf zO1&lzUL%E}lzE520(4vD2@ZjAu(UbrpUH@=2ea8iR7X=?{4G_h!cXz*I_aSL^5fV~ z+>2g!d02E*jzum2ctxnU%n_+GsBR9xGY}r*{Vgvzyaeh_9 zK=)cPfl28IcY<~5HDK(;y1^Aev~c-ve;)j{h8ebL(_BK9Etg~#!+#3iyp+1fwLv_6y~RTO-ikL#P34P0%JztyuucqQSd0? zPcVy*CufkpM7l{?2*b+Q8<_KU!UR*J);nU!w+hvI_vTL0RsFJT548pf32Lh=5UkNV2L!_|M)gQ@gMK)&U(F7E`?zU0La8~@}lniB0+Z4%c5 z^??t009=>W2*XOaFP^6O@o4lj-~yfFR=+JEn$EhG^VuON(CiO*p9xr)wXoXz(90(< zI$Zcnr?V;u=mx<=xm?tLATmtC$-MIWzX3d;ZBlYE&#NGyQ9T{6!OAw4P$u#%EfR zVS)FgLd>K{4>$I{X&@60JV%7kn>^L*eEH*l4`FH2ds z(-yR?LQ|tx2BLM%jQDJDDc$ce)O%GZ7_@g>wZ45ogIkqt+7~@~iEO8tDYfofvQK-deq<|;rknq}Hrv5n?-{{Em8na*?B$8Ngi?_=r^DNGXk!Fo4E&q7;mCW*MoT*{9*6o>B8|lVinWL zPYoItE?(%(p2mC6iX3ph_&!ta#2)cizb)Zn(r~wipG8$$1JXAa1%3q%zDODJT?Y4c zu%!)3JM)ONa>CXbmSiTd#DjooP>pAz8qd;jDg4e=ep}F5?C%f5Tz?sI>+VWDlz;29 z&=NeSZ1AMV{66wEG6Y%jM1RNrvLmlE%HRfKY8B{sj(EUXMM?l<=$ufuZr?fVvqsv^ zt17^K&gD|kwV^q{686>R&GVWx`zr=yH&7_=k;n}9!1L80X8$56@dnuK$Jm6gsMdoU zmu6E0uqQf;{8(IO*=Y27Z`YR2q2-EZ@X(1{Auo%CruXz$rMC@bKQ^nR&tAtAx_tY+ z+RZW(zubOMKGMROrJIgkG2E>z2vO~~;d&ngCHdE$PIX?4E65!4jKnRlT#`9fL6a6& zx=wEMH^(rizbOczyxM&T{G(rYq*sLkf11k?rv~23&H*FVKNu4?B<@fB`Z&Is&!%nv zyu-~W#Pv&+KyY2X(;!D=j{&9a*FcFnb4Ad-5YM_th|+T*3}0vJ_~PIGoCny|1IqPy zF%Ql0@D6r-$Yoa!$5h4b^Ea{75smFF&KK++LgDkDyx$7w4m~tD#bQPVRvG-;aguod%NHw(3f(^it%zO zu1we=jBo$3wtlq1>YGgWv-Qb${)@TaAhLf*+!GT(HwEgZ>}EiNIrI(B1u%)RaV?)& zF_olN%HI(a&^o3%{@cNKK4ulZ8y_71t+y`UbMx>F%mjP7N4(uQHqMQg%r&3Le+Ywq z7S8-_&$ToVrQ1_$2Kc4J&TK^452&qsNN?ywIG7CbrZ!zT82((Sm70;h;K6fVzJ}kx z@8DDgpe2~O!3=V3;QCLDuUv1a?f8IgG?-B{zdOupDu2B73Ko?B-M!N8^#`1n4K?Is zd=KUOg8tHqoRc$roW9O=Z-Mk+K*?+#bPf1gf%7Tn+LQSmC4-pAxHgb0xkfiaSy%Sp z{)*&ahKr(?j~mI5ag5<@m5+;GQ$FP5lCQ{ZTq=giK!+!`7D0ubaegAPtOoc(nXHJ$ z8Cq#jw0Kg|Z0>>8L+zvLz7#s)?CMdj93(~>cZ|2Y)PD*m2Xdf|sO`SiOZ`dPov$kD zC^5OEVJ}v-I#27HV`xW>pVU1(fe;E3ktWn+eNb5>&(VZxfQyAY{Z$_WJ_@m zgvH9CD5ud`aoJr8a8AG*rY_8~cM;UH?$p#3LeC>Tujh>7kgMi{d-_inC37tDVW|T= zbS;PW{gmO88)&s6sx$K=)Fj<^$zu` z3lw|lnO5oKnJzpy6E*&Y99Q)bD5Qb5#&$0B;sR!l1Y9nUj5%r(0xefD!}ma# zyT;rf-Z8|vj)}|d8rzSSTn$&LpB5I_hVJND7lgxgFYOkoGw}WcmJ86!rh$XDeDl8t zb5-?0jY&$M&Co&wHfgkM;(H_@e^I!0aN?WPxZySvYWx;ZHKvJE2xCVYdX;UbM#JB+ zWKjdkSzw%jPs0oj9C6}{2Z+k}U=)%8 zzls`<_2W!z#9J9+2IFP*SveKMQhq)zaW%HSb4#9*-|=9Iuj31T(GMGltHxIp;Um$n zo6!cbY9dxTD*S8NyrLb8Vriwyw+}@3*BK()wFmFKkmLOFeVVUc$?wP4p70wMID(ul5>vNN4kFl59;tt<4hq z1K_n{9P*~G0c-!I2I2X%(3~v0c$@SW*gC2s5i2!khB>??mzhv}_e*p@%ZY<0Gs9B< zo#@R>jRvc?DjEH&5um!_zC`+kMVD1l#B~t&pnNvELa&>LHv=Uz=QVQwzJbrz^NX~k z4<(;ghoEk00_kAk%Sc?*RS7&0!!rsLHr#MoAF#bQ%YvHB>NAbEFC2VB#w2jSob|&g zkFP{ko;LpkAX#6vbOPj8TKE&ZA6g=gNQxJ$*tw{{Oq_8)kqAGrfO&EuJ&l6 zvd$6w@TXJ0raas!OhvAYuJY;WTZ>O7-4A*M7=~rOP3lQLXZogKw%d#4fkX|=bgM7O z%(WXC6?3>R>^wR#$_irU`&r!cY02w(ce%`ruDFMV=76s2%#>bUN5+(yL(nB)pByQ} z#IE%x#Um9Mh>W{w&~I& z?5~`>*Y-$j&8G?v`in@T+lU(-_-QyDYFQl|;B+@bT<&~UK!EFwRFg1813*)Eg057}a%wf%@`{;(?BN+dRDR{TLi^HBa&h7J0 zYXrSMe+~Y->^ngSnoF{`z_7-``|NU`&b*!?Rco~oB-Gl*`(b?g4MPNLs#^r3&FWht zWCuOiPw>Q$4kR91yqine0difr*ESXBa~@r|6YLn{?NKT9ebc0NfI2XZtX&TEQcdTo z0-@xb%a}LWMwaI+uOxezSjuf?(+vGn#pliI9Hz5dx|lkusLUJ z%eljhgo^wMy5~}oUG~|@c}(d==`Ffcq$^~RZEbbG0u>+&;@Q&=LYM7n<@SQ<>gdD) z(C!MaT~g(D)@#&ndTIRL7zuWh)E;ON`76{|i4(aEor6aVwtE`Zz^1HnH^mhph>u6B z1|9t$?7d}F96{SQNN|F?y9E#K7J@@?g1dWg3+^rf5+IP^1os4Ym*DOee1^a6oj-IlYVGDfOS&v!bGE%RxGlS?Yx zPb&y$;|X!!5>GWBs$VWgxD}t?sKSPx>#;8^uAxJnceeX*SMwm!bGI*AjGZy1$@>%C z0W6DQVX*8TEwLhG}2x$L0~G1-6#m z!IfLVNvXb;aKX?VG+WZ2?V*Z@7b3s+hIKHBg~A_TmoJYhDLUFG7Q5vxIUJ)=seFaO zw62-w>iL5UcV6U8A?mJ2=AgZStu*T%KL`nP#fH7eRg7 zZL!hr5?Wx=p#luhUHq5!Tn-*2fAhh)mD6_Q>`bM!wa%u|)Z=puM)Lllc9XdN-I57V zTOSXgf?#zjSHc9B%jbM(F`yYkK9~SHMm4v<#0-=1+DdKl;memMcr#41sLTsFoTiap zYsdXP;bz2*V44n}ufNiqm*)e_=%uJ;Ye-DrC{e3r|K!>%8>QQ9C(7VwmnS;!`W-*x7(7I-o^Yw)4kdKymVhpe?4w0VJD4Z58P#^} zs|$~`N^xc^)(UT)#Jl@pRm+KDLL$xsPDhmbFZQ&j>_NByAt$#~fLl&#n`KDk(3qY4nI2}Kt z1d=ofGjb?o??fzUv)^y8-FoVbmMPT%|fePA2YshAO^)=jHjnYEwLSK zDA5iJ#kw?+Gcvngkx>yY;Nk9?dzgu$q`dJ8Pk;| z&H1FygWk-$2qcPlKkDopwGbj1O&;j+HR=^Q(iB?x77zM|HD*F8~rJcc=7e37`r`0hC@{Be8-8 zm(3vZc)LeV-^+u8u>$9_K(9@4Vb`6Uss7O?_0~ z?lcvvj9<4AmVoOrX4TT^k-d+l8y2E~l*3!{YTgBX%ZRG58kVox++0Iz`Wa14zb=-& zeGgY2?(KxK#iH|1#+2DitIB=e>$HBJ*~=W+Zn(Q31+|M*OW1;hjaudfMzP*{VTz}c zpFG67mNXkhcM`;{(26wmY|pTVJu?xi+BXQbDMWNKqo0=$FIfpz0x#v~(BcMTR=i%$ z23J)zLL-e@?n8g>I8vT3oy&ISP2!M{9lnL{w3t$=ES(?D-@1y8XxD$Iv~TKZR_!nh zhhM*>gERCnOFPy<8HLZcA7!ECn&6|%J@+_itYGu1S|7*eWHtXfnFSkNgZ-@YtBDD6 zJ$aez-$N7?2nxI^0g4z4yDJ_e5Cv+>Ol`;cr2AYa za8)T^B7kHXG!s96JAeWkb?~(BP^GAd8i$x8-%d<{v%GdYAzAe(MQjDQ}&9nsFWD`PFkNm;@vv3B7 z*}6|?02|;+A-aDVv)16d)9gg9(usyECZPoWq`SH-AC1*Q_;dP4_RdN_(Aj=Z#JS6A z(!UfcxeLOUv53d=#>}{hWGX~xkZEA z)fNi}3%C}2l!Lv%szb&fjr2A%s?>{*jZk81<>MWM*o3f5u`(5Pb$N^D z_zCDr`TVM(mqecm%q(JT>*o}jNZ(d4#7cAHn@}_i<8K_|;=GjkPDfyjla-y3mi0lK zh%_scKsODK_-G$Bqtz{C)UAv%LOhGiyNli=+x@Ra@3vh2kZONGsiq%hnYNSqD_r?Ure8MX#?Ze z$dsx#-t_P-WekN_&yQcfT7s52 zWfb>bjW&LWok1uw9yd*4@jQl1C7&&2h`x#zZ;n^C@OWpn5zod~S$BMQwS99=Y?VNG z;%Q=s^JAgW{Vsa}!Z zY@=JL+T0H$u0vk-JQrJj`Ad>HeI|tIl2?4CptK@UfrDte`SLxP^^*Qb z4*df=TL(v{1zo+L-bx9lhxc>Ls*Q8=K*c{-+tOCg%?@agJAcUgQp>h^rwHxD2q7!Z zc!%skKlOg8SEp>_GHoPS)%oC`W}*F6MXd0uxW#vMEl=3Jt*w=QVy`XnV{^DUHrE;# z@<3*Z68*3F@Nepea?fqyjapEddE1pfNj|Mi{#oxtC& z{Yw(06A=85Bt$15^dCu>PC)oSk_er^Kf3qNbBfXl{HHB~Kp+3p7C~M*p#1v^f_!v9 z`78Y$mw6O`d-ae0DDd*p0p*|76nF*cfb#EJ|EQ_!;NxmV$N!HO{BuzMuSfH@9shVp z|G0_&ms5+Ht(!eCxA60d{-0 zz(kpS`Wd1u#`SXxgqKBs-kZ&wbK5=RewHB>g_h=U8Qc@{)NWsy0b@Lvc0YaZ9;)8+ zxj+fb9~wNQSURc=#QT&mie7{#%5 zxc#Nk2?uSnz4daZK<$+zrY%RQWT{yM7Por;345S1*;&5>gWi_W#Bi&RW6)2k{3eBu znxd)EC2SUByld0?S1Zk>c8I3)!#81INf$o!QVtF7Bk=p^kha!#cQ2`r0`OKx=fGZQ z+4GVQ9$I=!E0!%i&W=tlteNlr5krc)qN$ffW|U zh{ksCyjDJsh6a3iUj4%5cf&();I&nfEOGWu2`RT`Y4tm+;FRpT1|cUCtKfjZ>w}3b z12ePf@}|0`WT@mQ?TGnZYuMvW+1#w}<=|&Y{1Z#Pd$I}`nnJ^q*7V>b&&1R<((up9 zbZk8f5s0y++c$@-$K|ZntqW;GNT?veS^CG6L0kSmc09k)X8t7Y6r1Vb*}v9fB1S7y zIXyo;&4cP{l=Y;7>TX=yt8%NYdBA=zd%J-WM3H7Cwcw3({x#Tofeve#^PhBAyjBbT8Z){LGo@K z^7X;MhQMEQg^c6ElwSL4fd7brVr;|f< zd1KH>RS0!@!s=Sg`dF%Vf=`8@9c7R^l`Q|_XS*{uK8Zw8kx&C~1emdP zJ9373b%nwd^lN_4BS~+y;u{`-#JQH06Ck(ZP}EPs)jDr+m&Ya#v2_>4)5>K{A>SG{ zRT+G;OUH?_*d0ZsBr6-d7#!C+7Fx?cGcgbq~pI2;q%M;Vh zIkpgsRls8u)`1f0vwewYTPy4@ti@iHWv5-Gp@Hbi8~i%S!suxR#{LNUjUgql(3EV= zp3RQTPN;d|XY^Y?eLCFnjz4^*>0X+qlz71duWt!q`X#alO);tLi}3l zvDPhOvh6I8zo*koP5AfWD-)ihycVd`cCewD`=EE@TJ;fWq5WBr``B-_4y(ZTK>%sr zeyTpxM#t47ra@v>BQlDx@3%h6uu}e|()7~Tx(m-&7TW7=-B6?1%b_Q|o#fxQr|k?~ z24lYObU(M~-dt(D6h#<(*Nk7=$eOZijx){dt8n)jse+LT!KNfBR;rca9phX*l1a@` z;*`s+x8!F|5~!r9*_1uUGeL<1YzxgZ-B=gF9bEOFq&b;+TD};XPUtMKv2b%o2Od!T z-iAvrTQhDd!rO&OSM<#=44-gXn>N9vQmxXsHB|Tp&@vCU*K(?-BnSxP+I;KQ9q5U_ z5m@-DSDwkxW|X84al$A*aU8hD-ATQd4t^N@753s<4snr+Rny#c5SZe{OboDNw);@B zzV}LP6Ox&EE~o~VY*^GX9QJkBKP500#OKQ^3DXrVFBeV=O-z-9_*N)#;D?F|K>~xX z<;H3{$jz>ukVnYya>*fhWJ9kjK8~)xotfG0d{hpG9bVM!3-@$BzSv6r!?u+&^V>~s zTTj!CVm-N1zUV?Zx+sTq`S*iWHnBoS}xhNSIr6f;5dl?z6GevK?G-oc8UZ1t9Ay!h^ zhvuSu!B5%8itvaHT$g+5jSuI1F&<`p>55q5S@0)}|Dq%GmmCIRuqHmd3cn$hC|} znpQg4WAnT(euSYDUR9+oPMo%o5jhckA;|CUq1neSWx`XDj8Qg!_aQh09>~O9TX(vu zK7K&)ZYBV8`6g)NKFUgCql0}TlUtCfRi?c!6x!Er_Tm=-*2Mc#+%*Uab;WMv64Yet zyWS0FcHU|eXF|^;3n}9EP%v*z9Z&A*;egXxZ=|w+oDdXI{qMAVvZZ>@mHW_oOFh2* zZVp4>9W}G21djUB*5pu0?aWbP)1lQ89s9eOy@;l9#MH?D~5r{H(H#Ph__;TU_~;4&-bG@%i% z*ocWdq7$!@pUt5UsRsx9%(mCpTq$)Kl&hr5*^4~x!a`mzQ9U2cm5&=d_>dT^;}z@G z`MKJjBMiAR=ELz-OeFO|xaFM$-nqASe7@3HVwLFYeQX5Hy^ol*hj-_C$Y~!f&QmyS zUN8#p>udbjO?-#g=#Q)@Te{-SnPE9k^R30wxmvYYCEhFuv%r|N^)@n$c-MINx~5*} zf~sil@0~PyD|@^S239!6ZKZa^m6?LZw6aW^=-yUD{JhHYPzP?zsY_Ghh;y!Fli*&oZ zoyZ$G{J{2eCKM@u{|YUzXR+;v-+;SLZwtNNfebH_lHyDe-QenTgFm`6OGvW;VJdMv zeFPrX(Q11$m3uPWIz1y#?9&B%)?drL@kRyGzuqX-ur{-DL>(AD-2^^W_FP9gM_1Hy z?;SwLX@Vt8o=#B+2RD18PbEvK?-dBuF7>+gwP;@T=G7DrDk2khyU&YIJKDIsr=c+c zR*j?hF$SZHzz_Q3qXmIp?aMyuFo{O%-vOe#N*M-_30 zaBMx#=@yZ3Yr5a>;mxJe?eVBHzqX!t+0fGvZYFj2Jg~T;__N;^UL1d%8_jAypY8O8 zKif%WJfo)kHRzMZRRV7f*8_KgPG9W6UEvU*mhx zbAkWd+LVl(9^|wfM&H8is*Zdt&PluH%8cObdO$!hjXW`juk!hopPtnT9vRdq>uLmx zifT_2C%liU58njzTpwf57pr6gU$Yl~;~C0u`y3hvTO(nPaB}Y?o9JHR;af7_OFe?1 z75MC*2XM3j_o?)t^^DYyM%_j~$ma$>$e=sNi*@nGeqVP6ghC4S^`^II@n0~|b9t;y zuX0^t(W}MwZVVN^)ClePcn2`yZxGWl^}yL_$>`kd5xs5GM`$e~LOi}llf%(gC8=Bg zCr$IOBK042MmNC2mhRuGAD}Vm_*i-WFPA8LI2NoXpX7d)C4n%Ii5O!i}vW-#iTOKNJkg!cBOJ$ zvh+BVoV0iO_({hJKfxmjZwJ-_*Vo2qA;YDQiNr2ht!RhN@h@?RJrR$q@WfC@#vVRs zKV?uV1|a8d)L~@^gsDP|Ju*z1UXo8V#1P0Je=;t0L@)dCX(Vn?L`o&-Rw^!apC(~0 z?ZK`nd;dyBs58F-GY&c}!&*mWU*pgR_Ub33F1>w0)jCTBF*bPw4O&Oeyx};qO)xAq z_(EBdt*2*l7;hbh>+$3Gq#!FMlQQ1T$01&+j@tD+++x(#HD^4!Z{+!Tqefc_w`kR2 z^!e;0Sg#n!yJS39g1_)*TQt0Nq}#sJc9q%@_f(XLrInjuXs4tl_IK9Ke!=N;!M=B7 zhe`a+T!H(5Sv8D-Ny;~3W!M8dSUiA{lGh!-fbFU_WW<`ug{T(2V9(@QCV}`}20AWh zz(v+9{rk6j_I*=aJT(^(==HJbqhx<|(}sMRLtuU?Re-iEt`~^`ejlx{RX)Alyg+$U z#ZfU+i?j^jC>XqXmGI&V;{V;=aC_mjEHiJv;Ffi`8h3F~bmTl{92GA)cB=9G87l&z zehZh%yh=;P^|cn21I{9HK$8##dRTh4hzMR2HCY5p(z?Vojpre#|!SPab}y;*Akh{B)+pne-Ns4 zU~CkqZi=7|0`kPS>|ePzdD2a-JL0Y8OR^Oh#F^}D?9rG6YOhVCJl;;pGaeAnIpLQy z3Vl9kA2>u=8W{P&-pglDDdFxxd?cyQM~E=GQsX`nsglgZ5!MtvQZC z<-tJ8wN%B!Mh<(9(VNOWQ`PhAdO7#cBa@9kZ%H!LP!N@3nd83|jf>JOO>Y>l$`U!E z=Q>K{aS4eGt7VEZF=^4+2jF`?#2j6|0KQ z-{f|wrO2A4(a?PEbH%%a-^3c|rCln5kq3~{RRZOkd+LCM-FK}7IC?tH@=qc5D*{^b zUNqmezhX1x3m@$D_l6Scn&P zSYj&}Z5R``5+%!IGFuzI0XI@}p-&>RftF@?wy?%vYI2}L zo-dCSkAKmlWDShHtT?qqGLL<3a99xU6d`d^;u`1tQ#$|# zR$tgCe9l_60TTx+w0wgZKyPUZX^Ny!VeBLT*oS~pxjJOtKL(;qFr%2F_u^Mu24*~C zx*11+=4IV5<_uI67ZSg8Yj6z8InM*RzxwHBuwmr5#R+YyanAjNkfFp|(ngZ&;=!2| z1%UrnCQJF9BxCbKa^UHF3YWGxGspWy;oI~m1f?8U%SpH_Ge-jn z7A;n=-hL*U+t0NAU&8DbxN>eR` zE3;_>l&`?_^31g4!cwF#-A1V5u95`#js^;pWM5TyS?uUXrBmSIW%1r01j^I9+SCf? zTu8-r^YTOVdV^!_(S5v)o^G-hDmaU$`S!7=4l0Swn3&VFcviIb2Z8^FPp-bX)d`^a6AstQV4? z{=G?a$6Prh)8^UQLZ2%a2Sc=if{Dx5yV>rhk8ovj+=MJWvVaEhG1 zF4Xo=#<})h8)xu-RW6?w$Ku^>Ly_fghl-<>&)pRQTkF6 z7?N^rq8wE5=DcW|L0sfDeLmn%T85#4k#@~ecWX!oXb7OAZEFh2rOaj7TQ9-7%enA! zazEeBj)DigYh{6?Yc~nIR~3lt-x4%48=W8E?F9FJYUez)+LQrAtZM)qCvGEwks4jK^ls@1SEW|(wLHeG{$(5q*USlFhJ6-!iWA?m-}7Q!)RPWBV? zIXsTDPZn^sAIM$pd>Uk#bj*#woB9!E11Ipxe-~*EfLahY!Eq2lwCC|)M*XLhKL|El z!n@@|J!{8u3+8gr4!}3R6fT7WpZ3#cGp|n;Wzv8u37%P)ZjCXiiW_P%7AV^r))cd9 z_tbTMmz~gSly>WMwe$lE4;cxcuYOStZeJd(A#Ul3Uu%sIZWZpq>ZW;LW^Age zUEpJzv2|>ojrkc#O%tmzXR+2=KT*Bi_DQ(DzHzSFrFlwd36o3wO>;_r|M(g&aZAa| zq7fpkiXC?LZ((8x9I#BEE9i^1i+wPM&SE!bu<}zEkebTI(B5i}XYQXk&_j3(RWDjC z?U<&=cQj&Hmtlx}Vi9pom}r{GvPS++5Nf>*dULfd4Jm_C1CdlM%K!#{A(TyeD3#XH zc_;C+qB+#qavyWl4!XW?j=Rli4vK;L4W>=jQ7^~eR-Kq}DB*Fe8_u}!kRK-O$#d0~-%$&2^k=-&f`!UG6c+WokhZ&8hfA+8aQ&BeA$j}QR$Km^ z2Ozz}#cDn$F|MayO1l~R8b3&VHJI#OQe7s$#2~zvFNV*pZ4RbMmF|>8sxo1;P$rJd zxorYKrq!ktR>|qj;|!w*sAK|j?d>bSQiKv`H)+jg&BfP4X5sjJC<`v`=f$EJOsp63 zqqLjsA8BCKZ$sIFzvGntf7y? z1q{&0TJE-Q%8stoMc-#{*r;ncZ^+2%Hs~q>3LW^S6%4|vT8Q<(V_=`&r#Cr%o$R(& zVfrppLOs=NQ4x%CKqHKw5>r}m@Y10TRhEY6OaJ7g9EsbO@8#eJ7^ z2A70LGn6geEB&oy6OEQK^jdSBy--SKs61o+Uo(m)bjFzmf4Tf2KK-`m_Q_kKP20zQ zit7(T-RR5$&*cr~ds^KEfsXYcF5|ZpH1Xf$iQ2L$TFc{YRWa4;n>5}Xu5V0Q#+%&x zHi`BZQykrPk*XvPfE?E@^J>lgh2<9j=ogX?K2=Y~>W!Hi3$(fo8M-{jl3iUlF{hNu z+hZx(QS$v2$DKSx6w$4P`v6zr3e@-wxF&00+Zk`=o`!QFguv8^&hd`N&&!f&PkhYP zs*SX9RhBY2bFj?&)kQ`D+0Rb!8X4pOHqo`7+;tZgjSdje0N3b}%gGcM`@iP&1tm zuX24^$8oOAQ_b;uY^9+uq*LJ%{)&TU{7biWF>7vlRU`W|apujTQ83%GEtuMDPZPIV zwiyn{F7KKBtgG&Y^M(BG^VVyLm-HEq2ei%FFtx5&b5L0oklP~mbQ|+ySKZnOTDsrG zsFJ0_oV`Y%7DqteRCRAn%{#Fo*pD+L07I69z=ubDdMD{R_S#>df`Ww{9j zZ7*k+CYRh@{3K!@*k-=uSwQa2llOE+=3**dbUwlZa{WcYQIaN;R! z1^DbyJ~l)9_IU7vsln>8QO#5SBOu&9Y{xSH{k`qMO}?cW_1|uS4akm`MO#~&Ge91b zz0sE1uX=<2Wj_+N$p+hCS+ILTr`+BTI5LcCiBt`m{~*|10}LCHt47YbwCCGJ=5?Q} zc^kj$#{kI#V%3K4SrxNrUeM!KY_o;awRLy^@z9CZ^`NZja4_izsm6XGwmG!$%^XZY zkj=f5wS2{7ZDoCAuSVOz&DCPzmW}1Nb)%}o0si_%=5rJaB4cPzZQiM)gXby$on*dT z7!oz>pQBLU1M2z=P`#>`JBy`;)xqq+tZ$n^3%P~SaFmwh(hpU|XMyW=ITcO>0K@Ts zOD@CK5L2K{oA?|#BPu2e$UX^XxF3qHTq@L-qvfS1pm=N7*T&>gb=<{1;vc_GAEz(0s6Lv(SGJ#p z?tBbIkdWSm3gj$H_*F1p!w8}Htnu7F=0woe-+Ddm3%A(LW4xXI?E(vH%JW(?46@bO@d6gxD!%9w0$`aBmm%6rfX^xV7G+a)W0NO3V)=E^F;{#*#yB}ly(k{gQLv_2R$knt~+#d zgPDIUT;2Hl7`o@ZPC4dI>rBoL=xi+0XZ0E{@%Zvg*Ook}^%mYka9=~YZhrP)zgmdf zO#yZ8rJ(@jLy;v(x0>z5+;Mh5xQ>oavUojr?Im7mVc6`Q1pnhU38dVk zs{=&>^aUaQdi=u(vIqrbDui-INg|IR$oTAAwNK1kI3#e+;kg)2dfdZ}N2zXFTaD9ncQ)2d+T2o# zJdC0Kgv)?5BQD=_)*vyHW$d-wO&hXEx<9<#92+IjL+*sQyc0SkDclQkYS*t}XsMaH z0$kmn6;-l+=C^!U=FC%Oe%;SMt}i^a4dqyaPq5j0feH7JDO$ElrhpXV<$=uN(0(02 z$46szT3hWW(M=VX{qbopT=_`He2gbD6bNdU#_UF)0nO~3>&$>vhvD3dQrxf*AYQ|4R^57#h7-)D z9IU<uS^l_eT~Yl9-^OhFjS znsB~?_jT|Qr`~gz9sn@oBH@xNJS@F7vdicu4a$J=05ry`7B+lCMC~-iwGMaHsYyaN zOWwUBskhHxC1t2A;pSpAtqZ62v2HO8}SS)w&}JK!ohhj^{e-s2vK~w7(Ty76v#7FmA9^# zyWw9vkexdSS4&3cmuG@BS{HaSB&U824ZJ^6eKML-1Dk0GNIAZB?$B*lU-v`7ZezNx zmSF7^n6bjX8oITu#G~kq~BunMohno9u$5DJb^)&`(N2YFiW;GUK`&1->4`v?nH)_V$jRsI! zTAF3)+aj2iz9uVAiKVA@VQXLZNY7u>Eo@l_qcd3 z3+C38kN76fNFPc+R0bgX>~~{66-W^7P`eM9G5KNYWC!8JCVPKFXMxpC?o1@trC_qxU|>ip*so9QDv9Uj9%lIt zG{0};|7L!WyRkN%=4$|@%4iM=#ru|$c@3Mi2~InaV*bhM#i|eN%3i|mLl4`(&zlL| zR85y}>uyim1WFvbSyrJudSJnvz;-a9vag4K!zPiZ-^BYp+Ily53b=oqKL) zeM7^U?Z?XzU)u!Cm<&r-q60CQGcaEuJ#}`XJU)jBlHLjF7l=Yn_SOOTu;<0QVrE5{ z@nkzr4_i3DIO%q$LmUIy3pgktNPs9?ARb$^wgQ=lBuGJf- z%WdstrSF8kRsvwd%Wa-hL3|sgs*;tXw{yn z#&8cor&mRv*B-Tss!)4@ryZty`H63wL4O4ko~%2LW;QJwr@FO%wQko;245&?SCF^F z<6h`sXgn=dH=}>vKH4xY;i(xvG<`o=Sx0a2vrRy~K}||#*>Lp~b!RAFpDQ}nhKI3- zWKL{1xdD`9dVg>m@1TXEJKv@!QssL*sRD@eWnC^)fsD$A6RkkXxwMz_5pukdj2+Dr zpuX&!7vi254$&|w8IM@85sYuLrtHo4YO2OfzHGcC*q%<(-#ZbFOUE*{Hna&{l!mfM z!wBKOA+6A4YjDS&eyX3>qclteOxFeqiS&+q6yIl!t2X#llFh)&om?_bIE9_n(V1+0 zBtj*{`$k%ChOA4Rze%D*j za^ww=z3Vt;Z|PDohhXy=$On@;K|rYL75A?Z{TPO!=Z1LcFrIk^>uN6$qqu#crF%it zLZSaN;^E{&RJuXFO0fD ze%DQ8Q_9Y$9oLF`EobKMPX)UMl>9PcX#>q@6U@iU)gILkDL_V5$qQEws=531vV_ zl>i53I2^f)JBNmPmWjq%H3&}}wenjt$2;%76zO+}5e?7GAX*4vs=2M}C{9UC!UEmglA%K%-b@r1--JMcFc-CYw3> zlMy}53dFUKHS8PT2vdZI*xOovtC0&#Tjccb;Rl4Kl8wBdEIBc|g^oRR!UyazlMbFA zG*944X&rwHu;byCL$m#0>*r!i2e>X-BSNlB0+*w?7A6F)Ne%UchKuZYyZ1i@?$m4R zq(laSq)e=`;>&V7S04e~3{<#t@jzi)YeShS2YayWQ*NhXu_4I@TA_6<)LKUkCx5`z zKVVwnr2>x1j`U8Fj${suC~}8lxJ+D9uCH5QZr@j%I1V(mIQk|4D`a{aDR@X$WQcfG zb*JIN_6~ycwEZj8MjF6;aNH)TZI)Dq$yGqTbbs#V&WT>QGAy`US$wSe2*fH%a}?Fv z__%$^zz*fw1{s(~^ni5gB59iy&yS_gc>$;yU9r>=o+ui2sP&g%5~va9c`$#Ce_Q|D zmVd&$ap!!CxmcfD?YUr7d|5h#DTLC_4|Dk;A39Zh_IuRN=} z#WqJBZ58D+xV})8%I6>RDrTX}6UMZoesMicg;237i1&PS>~P^qL}>C-yG<3=784ll zJh23(ntSEDIB+UO_>#nQg?TZ2M!X^69$>8i5FI_1FZ6bla^5_Z0Nybva!^VQp5zr;K3dq6t69Gt1rY zI{l&eX8T?O9@K^svOz?)!#{-_=|5ss((SC%pg+|gUwccFJHnBGwL_GNM7oofe}@7z zX@)8sQqrzawL2y7eT@;DZeiLFi<@6#rH#h9?rdS&zgL%L#!#_#ZKd$Xb@@}x(?0z7emz?SOWezgJg|g6e z&dKr&h9-od88Q(DbhASVgWO&7v3ti#%*-Zc-Y_zH{E{7or~Or6kdHv0x2nJ$!&~%E z9~raYFM{Q0@nD9#xMac9b5g7)?E+_ID<}A@(bdhXw<2Gg99+1z&q@4OIWtx1wk|co zU5wlMI!Cx>$yYt;B(!7(<=U>t>pJt@P-gFQGQ?EZN>(PvJ4%E%bbG+7m6<%R?#9IX0VYz5#@NgsiVTa8saXaO|%@`#GW0zm4XD2?4w09F%Pj zn+5JlXgKHA377>grLoM`3%P@W5)~S9y|aao`IPx>(iA5m%?k^gw_y}BkK!;%(EHeg zzt-1vjXmiR$v_QSe=nIuIN50^PO~|x^O}C_x6>s^?r^t{YR4~npSkLi?_JI|VPhVy z!6j>RY`Xcavpplfe~x70+B>c^{mW`|Tz3Lrj3)#zWui4~p642sQ0KF%AcE*MaO+mkH2P$gEt=CUm=W(_ssYc)YJS zl*sz3&|r98a2$82yyI~&FZ2$`l6G8jgd{3SQH5;W%^GMNW;V;ZhWa?giZWq;p@C-= za^0fOC1pZ%=4T5Rw?6GBE5K25f4}*OeI%3&A|(~<0_GW^CED^=y6Pkdo;%?8N*o{Vg z`Tf?Cyu1ci!2ZdB5$>&X5lblbORg_kHe5{@3q6=!5;U_*V*T`i)ZsqBVD| zdGkJaI9M2Cbpyq^qDYbg8T}At9Q0sQtQk@zB!D-u*oS1+g@(04%c1F<>nyLMp_N)~ zqNOMyd(K#(7rLMD@=T9QID6x-CT&|ZkuT*FMRI2b(&}`Grheb_EDNRoAD^!^UDZdS=nD5h(o+)!u`2! zV^eov#jAH$h33#;o^FEfLA85Sn5Wz25lN&_*M%M&9r7fLa_M4?M6W(xm8f2*UeV@t zTN`30d0k!jXbB5!(okIvQm7bO3mJ435lFJRczMbMtpd;ExS%P&^;)uwQMy%*Kdnqx zw7qejKeQoo6~~+5c**&lQyCxJW^WC*NMbCAmlt|JjIuZE3|tsI9ivTKu6Qc4vL>O3rurS3h9qLhdxDfTV@sE4(2^4b1h3xsiy7`b!<{ z;0Wb|X6^#-A-psHg`_|yqkJp#d16COu7xMHF=k1M3)EB+qn>`l@`EHJK5op=dBk2c zw8|_=GR1s;SLC_3Ak$BRvu!5!VXVkP=${j#Eak9%pyVBa#Ya>)4&;F5kCdbkAc`(m z85cKWtK_G-ZEQ}#&c&ZXf6&;+*(T}jap3L}-Pl0e(3x#8QYZI!Dr6X<0;?ii3_{a1 z0X(?ip_S)DNp(E*-j3-#{#pK7#%f>M?Va1U5_l()zxQxW`}N$Z!N#C0!Dw4YW`KjU zi>%PM?4l60yP8821RcQ=SnV0xPdpF7M{(TD^u8LCe>bU)EI{IRN{Nzqho8V@)(ds><>_jL$_DNrfBL(SrH(UwLyt{Fp{;c*yB}K!b1r|ebn)@~ znkfDh&z_08n>CW8m_Y-rkoqPGQwb=`P_Op}PLZ6a^kU(-_bG;K}mI zO;r}jIQz$YW|B3P{UpltADNZ-q%1XMgqXdA-X-COE}9MQ_-T_1HGO4?9BK3;%+X|* z3{s#7n+;SfQjW)IM*+C35PO8^cQxDrI?$EpA3Vxmj67v54Q_=Z6>|f&Qq~QtJ88BG zeESrEMS~++`FEZS_Xe)$3jLfBUVE_arl694I_z|&Vc4L--@JO8sA4$8l`^-;YP|a= z_$zRn3HiW}C|AzW`YjK?fT5=*$So<^UwcT~CO9&Ll7icD z!42QK#jhkU04p)5(b#Gy%oE{eZt;*wj$L)|R}1&OSrdEZOy!r2C#i1mKd@kWY!0k@ z4d_u4f*4^ol%X3O(*uyf+b=LD7ddFlb`vdcQaIL!1>~J%>dqC1FmfQU7F)AKt zZkYOPZZvQlU2Y~VkD|RWOE=P3bu;x)oNVCZxlVS7N%~Zb+l9>!b4@~)wC_ClUiK29 zC&WW5GUYlsg3GNn8*=BWKqy2b76T&NM(!uQYM2&Tmy_+7%ij>qcIKff&&p;cfIRZ? zUGF;vOi{wNGdcRiqI2%e0rsZk(DQ*{mO1Z$w9ctZFeNnW)#T~LUlpt`L!CO8CM$b) z+5#kSscLQ`2~HGffvoGdR>Fv&ROY9_F))%qpRzy!OrkX8Gkkh?K}k74H2cRWMDC8n zy;}43eLnZn!*pX2a8_$l4~z*~rk|`tj?f9{ugo!D;~@USs4$;YtQno>wA*5uF&uH{ ze#(%R`07R*Grxe=L^^m{{)dr%YWT*)==Id`jMrgR_y*EU3?taoEj0G{6mg2BqePcA z#%Z<$w25%^!v^v$pAQn<$gzcan74hJm*f-`?4gic*ZoL;$*}0SnRu8;$VS4Lw2+6 z^yMpp%?a=isp4<9B*o+P?sdst`G2E;j8_R)Ui@8OMgu&q?Y9+lL;B5c3zPKIxVaOB zd=!tyzs!c$$LXCoUV6C!fJNfq@qh3blx(&@F(77`qh36SxRVDn(|1}4jWfa!ZLd%= zU_if`CB9aQ95vuO2DzP=$)TthAf2=sRIdsv^{R{K9QND4sT)br7Is%M%cj0F9wY%Co}=@u3>T)S-?;wEad01b zgQHXc4hCyX)^OASP*(v#P9vLWw1$PR;FJL7FPjhV&Zj*KWuFqx-AF=aBL6pg@DKms z*@$5tsUHFNj7SLMTOO!$n-VOt2wkVVzmdhk4rMfHbh{65b%MCtD(Vhd2nUZ}t*k{C z20$82nsP_K+NR|&r+`oos#-ytS@0%szZiy}<2VKxhAsu%lB@@C6brV~I4+Di^OE#L zj5RepU7%eRv4ZicHLa}p+^+UyU3IM?djwyk{beg(m1E6}oL8CDtuSn}sT1!$iU940 zsdIBWb=l$|1(cWf-1uI2r)wTnZq2&rfA)1c5k=>=8$UjtK~A4Ot4q(H$B9t$S?Bun4TMAcw9-~}q?Q&f|+?e@|B1C-{sI%+L$ zdq~|m{Mu!pdtCF8tLe_RAn6v|f$L#`8o2cjJ3gW8+QeASPS|mZe1%h+x(lp=)D`WR z^-lk<4*xf%(kMwH_k*sJKPE|E?x9vQ&vn$6uI`jdwL$P&GCcTCX@}U=8%Yqy3Kc)N zY`#ozy?$6NKRoe$h$Jx#l;GD{;z~cfcz3utIibH=a@FfVej8tpeZN^WATUO!KbI(Y zS;5j5OsslX=ysd54I!T&Y5bGE$2tm@a>pHNL=kT0RtlkD1M|7>8o#L13TfJZ-jp}& z$O?(4!ZQ}?zG?36rQA4O2JD^tI0%9tIZF%}L$Ok~a7YT7ne@_DC$Bq{l{0mJcGCfV zw_yc3R{B0@&P>IO06>cGP)WA*dJ}Fdw^aK2jM1UV0xC2`K)*0yeGKoKT!eESvR#X0 z$!SZI5uDq51`3|;{%jmtC56jX%SUuCdPp5j3!D~vhSS&T<(P-LeK{ls_2ZM&<}b>e zMJwO$swWM9ZfH}vH&w<~z~*lB@woeVi2hlxUT8O)8q=_-(!z&(?qmKe_j*63@hk@HbCtivM=5{}0rC5%c!|ayM|c@+Hb;Rw9D&#uXjq5tAllA{%qKG90luOv2<_* z>{t(_y`9@P!LbG%Gz8LuFsuwh5frk{n}QbL4YF6_ml?=eFsZYy_|-(yV_(DfhDIRk zm)3Py9~_YNV)&B!l|h$J>cs)|wKKqxz7mCHtp56}w5CGVw` zNwfjdp;lw(jkHBFRk+mS#fn~Wf|DATIqLzX3h>wczhLici6lKL){J2ClDA(al@i@0iVTYD&Jn*Y0|ED5 z6Nb#)DoN~QdbgV}TN|i|O54k@DJ#9pyc2P^+dFFbh2X(WW9jl}?8PwLHEvC>cVJ-< zM%qrloy*kI*tpR2fPddi@mDL`Q`=c=gX#sY;w<^HHXy}LU3PV;|i^?Z1w4vH8&f2PoVtQV6SD$SL0sMonv zi!DrP-?l#kq|xVzvA1v(>5r97^{5a*4&rP z;$&Y6G`L?P%*b9b-97KW&4h1$l9YN6T*PPWt5^xaf!ueupOrLHYCmay3XkX_kEc%2 zMTE>Jy13W~9$2W}4(_ni-{=?PMt~Ze+KoJR%nf(f3Pp^YihaK846D!IVhpzTY(ZP)bnol zAdKibc{fS9a0zD96OgE>h^XTfwUSmST<9igUkG=9>h_29=?X25^bmQ4Fo}1|ZwKmq zj%8zBXj#;j)fg^~FVQ7`7R&C%B2`CfJKew}oIFnQ_4_#e6aCz8?e@qU17yN_6{5qM zIUe_5)>T^PDbtpPnMje-i|Fl}E};)Mx7UefIMO8~<0j=1>x~-L@-{nI@NhY|Yl8+i z*GY@aNkWz&e#hl!bd3VSM;a$t75?;P3kJ_p?JXX4D+PUj zlaqE!xbo7jA=H5&5dHHHGc-B&Y<-Pv;K|OLZzks+KF&X(iiR^vCi!%@X=HJe%a*p> z-m85V-x5oa>AW3}R<5Yr*1^;ip=(;e2L7mBugIBYJ;&GduvMqA#tvsIf1^CtIza_4 z{&2m^ffU4xCnkG*VCv`+F91zY7lqsOZ+%A|y$8suk}tU>)=jGIGwjVaF=MLp_~noQ$f zUB|Z&t)F^;)CW6ssZ^yu<8nz_S%3UY$n3~Rj%TVW9l9v>+=nf_?vB@Fc}b|G#J9w- zzf&mJ5Z^pY2#yhMoTQH&FY?XXP(w*IEejW?(0i(jd`hlGJbf57Iu9?b&?Vt|wk6JM zc+Nm0u$%L=RbaXz2^cS2n_J1(YD1&lG&%kts6WhRE2peLDLMDP!lm%c)`sVk zsxV+cpR}7=_i*$vwTV}!R{SQBwU_Q)8Jmv6`i3Sz2UU}=<Ph4Ag3xP!^sa!Zt9u!sYbVWf0})D7;&?RNC9qyyyg&_3n<(SDkv-Da6v z!r&n|(ygPjIMXo!?h2=GEUu9DoeZ9U-Ir+*@n)j7ve$-DVG_CcTiiNRx{IatFZx%1 zYLo}qB!g}k0r=6L3NywKjAD%Jq`;~*Vd7A31J@st z{7NyhUCTk)+1tHDC;71=E+=Bld9kF0pQS_WglH4;VsU?Q^nqL$E2L~Ui+ZnHSS}@& z8#&r#PG>J&MTX&j)`UdIyfei+^ArCWnT8HMSFuZOaj+euujd|S^-&H~CVD0UHfi~j z_7^x0i5>x$^b$7;L%tTFM0j(sAISs>4S2D;Co*?{gAQo;H|9_Q zl38b$B4~gCay+3h#zecO5qY_zzkh%#|D`g;cI^J4(w?&sCV*3fbqj$Y6H$gibpye7 z7q%N`jE?eVm7EcAD^GptJL#=tH1bl$pXJTAm3=CG?MNPi`%LF^sJS-!wZr%C#f)3~ zSdW&jM=Cr!cMq0I(Q_U;6S|w4Wi5M9lK8J#XR@VwqK@dsI(V zh_;h3{IdNOYT8Au7_#lrz684n*NYc3G7_%gk4A=SPgm)QtxQVs9?O9ajkc?nlF%NQ zZ1#h|=a~CQ*g!&QVe+~qCJ8Z+{Bz?MpZw?BqD{%r-|6;m^eO^0OPAZ<;2RD#S^R?s{8*_TrDP~H zT<^O9g2j|GAOz%{V8QjaHh#?THOXPZWFusntcsN_x)-LLCzB;!eqEL)_{5;fYbv@! zNX2v)ISOBbS*0lMd+Sj-`$r{%lHCZjX^49si3#ti8nJ$%pa=G&|HAcv6|9>W?ojr~ ztpq7{On&2t;jvO2Wk>@J#EHc`;E2d#rT@NA-}X0CnlqUx+pBpeM*?Ni2gAs^_4#j) z(qP|Ws8MB_>15omF%3up9DP%wh_CdQ7bwc8DngetajVle!8UEqI}8P)0bsqu7Nv%_ zD{H}^q`$|%oBl>0g6gjNvLBEit6n%4OpIo0kD?v;;9s1I?Ct$wOY!w5#!J7p6~>_Ff3s`>3HdG1P~T*z z+~L@vbE<>Kci=Zp&h)bxbI>!TYnnnuYX%`EF9v!#*Exr zDz5twJ;Foe!ffI=#wRYcDMl7N00ugfA4!a-JE^epbM<=REY=kPr5M_-9Ld|vz^6VQ zKl_FMOufrI-&iySo2^?ue_vF7v@zVMnm|=2#8@h?Hk|@bUB0$(s47NZ*cw#i$F?1M zA5Xc~FPu+es~132d>*awAPS5_0bZE8)gKv>-rP7!JY* z+!tcj?||=*p^UempeDjyWP~6c2BS9)E9x_xwH=8EW=EUNO=%_Ryk!3PURQekU}6wp zp$NK-$LbVeU!lYz^XH0@i5aD)Vo9`v?wVyz*O6r<*3KWsikwnJ+7D7zt^V5e)18FA zvUA6m@%cGm{Hnxpe!+L8bKPnP8i^3%^;z10fromsuLqHjW?`asW&b7CM%ReY@=M|I8836P~4jfi7Gc@gBF>;u2mZc5P`j@|Wq)qeBW4`vlu z>7o10L{Kl_xNK_4XJf*x`L~kJ=CGYvLHaVcB`67jHD zT%h8;7plH~wTt~fOdlzwdbk#S_BnSc7@(B7o})ZEt^oIql^-rY$aast-)_#Hy|&xA zrDDUaC&1&~ZDiOrrnXTVnWUtzDI4b_CpPUR)ld;GX5Y>FBxYC{Z`^|I8@}1FYNZ7L zsfP$Pum^(|Y%$X)_Qn+({~0@V*UIENqBUkA&Xv@ZKFN!n%{%f{Ein5e49{<%(zqO@ zKaJH#sZI28;N$LU*v>l4UzQQoV)C{%%nUTPro4ZoKCT{S245WRShGpHTjF`#vS3+m z!+=bJBXs={9CZ@68FxQm(092ovjZND)pUDM1Sp|rYg>{RUNpRUTcdMyqV(O);5bIy z18g_%ZjjitX7)FmPCQXIO}7J7b@&UJv~+`Zz_8zlVkDHvf$sla*k%xyu|>86x@XP~ zMHzdN_MzdVsTZXuP-`

$W;$m`s=y_pS-tN{;<@xn_~VPncL-L(1Rnmg*y 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

SenderSearchKey = 0x0C1D, + /// + /// The MAPI property PR_SENDER_SIMPLE_DISP_NAME. + /// + SenderSimpleDispName = 0x4030, + /// /// The MAPI property PR_SEND_INTERNET_ENCODING. /// @@ -2257,6 +2267,11 @@ public enum TnefPropertyId : short { ///
SentRepresentingSearchKey = 0x003B, + /// + /// The MAPI property PR_SENT_REPRESENTING_SIMPLE_DISP_NAME. + /// + SentRepresentingSimpleDispName = 0x4031, + /// /// The MAPI property PR_SERVICE_DELETE_FILES. /// From 788982f91bce425781f1ff85027d18619db02d55 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 10 Dec 2018 13:35:12 -0500 Subject: [PATCH 190/741] Fixed the TNEF Importance and Priority values Importance: https://msdn.microsoft.com/en-us/library/ee237166(v=exchg.80).aspx Priority: https://msdn.microsoft.com/en-us/library/ee159473(v=exchg.80).aspx --- MimeKit/Tnef/TnefPart.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index f1aaa4f2f3..fd9256b7c2 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -323,15 +323,15 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB case TnefPropertyId.Importance: switch (prop.ReadValueAsInt32 ()) { case 2: message.Importance = MessageImportance.High; break; + case 1: message.Importance = MessageImportance.Normal; break; case 0: message.Importance = MessageImportance.Low; break; - default: message.Importance = MessageImportance.Normal; break; } break; case TnefPropertyId.Priority: switch (prop.ReadValueAsInt32 ()) { - case 2: message.Priority = MessagePriority.Urgent; break; - case 0: message.Priority = MessagePriority.NonUrgent; break; - default: message.Priority = MessagePriority.Normal; break; + case 1: message.Priority = MessagePriority.Urgent; break; + case 0: message.Priority = MessagePriority.Normal; break; + case -1: message.Priority = MessagePriority.NonUrgent; break; } break; } From 6a87bcd4362aa39ed43f30c7712cdc5222bb967a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 10 Dec 2018 13:57:10 -0500 Subject: [PATCH 191/741] Map TnefPropertyId.Sensitivity to the Sensitivity message header --- MimeKit/Tnef/TnefPart.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index fd9256b7c2..5842f6a42e 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -321,6 +321,7 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB } break; case TnefPropertyId.Importance: + // https://msdn.microsoft.com/en-us/library/ee237166(v=exchg.80).aspx switch (prop.ReadValueAsInt32 ()) { case 2: message.Importance = MessageImportance.High; break; case 1: message.Importance = MessageImportance.Normal; break; @@ -328,12 +329,23 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB } break; case TnefPropertyId.Priority: + // https://msdn.microsoft.com/en-us/library/ee159473(v=exchg.80).aspx switch (prop.ReadValueAsInt32 ()) { case 1: message.Priority = MessagePriority.Urgent; break; case 0: message.Priority = MessagePriority.Normal; break; case -1: message.Priority = MessagePriority.NonUrgent; break; } break; + case TnefPropertyId.Sensitivity: + // https://msdn.microsoft.com/en-us/library/ee217353(v=exchg.80).aspx + // https://tools.ietf.org/html/rfc2156#section-5.3.4 + switch (prop.ReadValueAsInt32 ()) { + case 1: message.Headers[HeaderId.Sensitivity] = "Personal"; break; + case 2: message.Headers[HeaderId.Sensitivity] = "Private"; break; + case 3: message.Headers[HeaderId.Sensitivity] = "Company-Confidential"; break; + case 0: message.Headers.Remove (HeaderId.Sensitivity); break; + } + break; } } From 6af51057f5028f9af4599b44d7ed115a4f10f4b4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 15 Dec 2018 11:11:22 -0500 Subject: [PATCH 192/741] Simplified TNEF attachment extraction --- MimeKit/Tnef/TnefPart.cs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 5842f6a42e..08c27cd378 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -414,9 +414,6 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment.ContentDisposition.Disposition = text; break; case TnefPropertyId.AttachData: - var stream = prop.GetRawValueReadStream (); - var content = new MemoryStream (); - if (attachMethod == TnefAttachMethod.EmbeddedMessage) { var tnef = new TnefPart (); @@ -429,17 +426,10 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment = tnef; } - // the rest is content - using (var filtered = new FilteredStream (content)) { - filtered.Add (filter); - stream.CopyTo (filtered, 4096); - filtered.Flush (); - } - - content.Position = 0; - + attachData = prop.ReadValueAsBytes (); + filter.Flush (attachData, 0, attachData.Length, out outIndex, out outLength); attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); - attachment.Content = new MimeContent (content); + attachment.Content = new MimeContent (new MemoryStream (attachData, false)); filter.Reset (); builder.Attachments.Add (attachment); @@ -507,7 +497,7 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachData = prop.ReadValueAsBytes (); filter.Flush (attachData, 0, attachData.Length, out outIndex, out outLength); - attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.EightBit); + attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); attachment.Content = new MimeContent (new MemoryStream (attachData, false)); filter.Reset (); From e0a73e4bf1473b9ec32a882dce871422df5fc2c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 15 Dec 2018 11:12:18 -0500 Subject: [PATCH 193/741] Added a custom-made tnef test case produced with Outlook 2016 Contains Task and Calendar attachments. --- UnitTests/TestData/tnef/rich-text.eml | 14501 ++++++++++++++++++++++++ UnitTests/Tnef/TnefTests.cs | 67 + UnitTests/UnitTests.csproj | 1 + 3 files changed, 14569 insertions(+) create mode 100644 UnitTests/TestData/tnef/rich-text.eml diff --git a/UnitTests/TestData/tnef/rich-text.eml b/UnitTests/TestData/tnef/rich-text.eml new file mode 100644 index 0000000000..842e0ef68b --- /dev/null +++ b/UnitTests/TestData/tnef/rich-text.eml @@ -0,0 +1,14501 @@ +From: "Jeffrey Stedfast" +To: +Subject: Rich Text +Date: Sat, 15 Dec 2018 10:07:14 -0500 +Message-ID: +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_NextPart_000_0001_01D4945F.67C9A820" +X-Mailer: Microsoft Outlook 16.0 +Thread-Index: AQIGQYd8BwKQgsko1bnR3xjxAU5sOA== +Content-Language: en-us +x-ms-exchange-organization-originalclientipaddress: 76.124.193.35 +x-ms-exchange-organization-originalserveripaddress: 2603:10b6:3:a3::10 +msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=True; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Owner=jestedfa@microsoft.com; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2018-12-15T15:07:06.8221370Z; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Name=General; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Application=Microsoft Azure Information Protection; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Extended_MSFT_Method=Automatic; Sensitivity=General +x-ms-exchange-organization-submissionquotaskipped: False +X-MS-TNEF-Correlator: +X-OlkEid: 00000000ECAE942DF45013449093835EEB7507F00700C3B68E10F77511CEB4CD00AA00BBB6E600000000000C0000CDA2140C59596247B6411A8D771D11090000000006030000A82A649F37B6A646AF283D18546521C5 +Content-Length: 1111863 + +This is a multipart message in MIME format. + +------=_NextPart_000_0001_01D4945F.67C9A820 +Content-Type: text/plain; + charset="us-ascii" +Content-Transfer-Encoding: 7bit + + + +You've made this a Christmas to remember +Springtime feeling's in the middle of December +Strangers meet and willingly surrender +Oh! What a Christmas to remember +Almost went to Aspen but something told me no +I considered Mammoth but there wasn't enough snow +And I even thought of Gatlinburg but seemed so far to go +So I headed up to Tahoe for a Christmas on the slopes + +And I had fantasized about Christmas in this way +Curled up by a fireplace in a Tahoe ski chalet +With a fast talking lover and some slow burning wood +But even in my wildest dreams it never got this good and + +You've made this a Christmas to remember +Springtime feeling's in the middle of December +Change the radio and I'll turn the lights down dimmer +Oh! What a Christmas to remember + +Strangers when we met, lovers as we leave +Christmas to remember, too good to believe +Don't know how or when, but I know we'll meet again +Blowin' back to somewhere like some wild restless winter's wind + +And you've made this a Christmas to remember +Springtime feeling's in the middle of December +'Neath the mistletoe you kissed me warm and tender +Oh! What a Christmas to remember + +We loved and laughed and played and joked +Sang Christmas songs and talked to folks +Sleighed the fields and skied the slopes +Then to the lodge for dinner +Now it's time for us to go +As our hearts melt like chimney snow +There's just one thing I want to know +Can we do this next winter +Oh! What a Christmas to remember + +You've made this a Christmas to remember +Springtime feeling's in the middle of December +Though the fire is hot, we'll just have to let it simmer +Oh! What a Christmas to remember + +You've made this a Christmas to remember +Springtime feeling's in the middle of December +Though it's cold outside we'll just stroke the burning embers +Oh! What a Christmas to remember + + + + + +------=_NextPart_000_0001_01D4945F.67C9A820 +Content-Type: application/ms-tnef; + name="winmail.dat" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; + filename="winmail.dat" + +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 +mh+bL5w/nU+eX59v/6B/oY+in6OvtS+2P7dP+V+fvA+9H74vi5+/t30AxUAAAwAWEAIAAAALABYw +AQAAAAMA3j+fTgAAAwDxPwkEAAAeAPo/AQAAABQAAABqc3RlZGZhc3RAeWFob28uY29tAAIB+z8B +AAAAnQAAAAAAAADcp0DIwEIQGrS5CAArL+GCAQAAAAAAAAAvTz1FWENIQU5HRUxBQlMvT1U9RVhD +SEFOR0UgQURNSU5JU1RSQVRJVkUgR1JPVVAgKEZZRElCT0hGMjNTUERMVCkvQ049UkVDSVBJRU5U +Uy9DTj0yMjdERUMzNkQwOTg0NDY2OUY3OEZDOTQ4OUVCMzFERC1KRUZGUkVZIFNURQAAAAADAP0/ +5AQAAB4AIkABAAAAAwAAAEVYAAAeACNAAQAAAIEAAAAvTz1FWENIQU5HRUxBQlMvT1U9RVhDSEFO +R0UgQURNSU5JU1RSQVRJVkUgR1JPVVAgKEZZRElCT0hGMjNTUERMVCkvQ049UkVDSVBJRU5UUy9D +Tj0yMjdERUMzNkQwOTg0NDY2OUY3OEZDOTQ4OUVCMzFERC1KRUZGUkVZIFNURQAAAAAeACRAAQAA +AAMAAABFWAAAHgAlQAEAAACBAAAAL089RVhDSEFOR0VMQUJTL09VPUVYQ0hBTkdFIEFETUlOSVNU +UkFUSVZFIEdST1VQIChGWURJQk9IRjIzU1BETFQpL0NOPVJFQ0lQSUVOVFMvQ049MjI3REVDMzZE +MDk4NDQ2NjlGNzhGQzk0ODlFQjMxREQtSkVGRlJFWSBTVEUAAAAAHgAwQAEAAAARAAAASmVmZnJl +eSBTdGVkZmFzdAAAAAAeADFAAQAAABEAAABKZWZmcmV5IFN0ZWRmYXN0AAAAAB4AOEABAAAAEQAA +AEplZmZyZXkgU3RlZGZhc3QAAAAAHgA5QAEAAAARAAAASmVmZnJleSBTdGVkZmFzdAAAAAADAFlA +AAAAAAMAWkAAAAAAAwACWQAAFgADAAlZAwAAAB4ACl0BAAAAFwAAAGplc3RlZGZhQG1pY3Jvc29m +dC5jb20AAB4AC10BAAAAFwAAAGplc3RlZGZhQG1pY3Jvc29mdC5jb20AAAMAAWgBAAAAAwAHaAAA +AAADAAho8P4MAAMACWgRAAAAHgAKaAEAAAABAAAAAAAAAAsAC2gBAAAAAwAMaAAAAAADABBoAAAA +AAMAAIAIIAYAAAAAAMAAAAAAAABGAAAAAHiFAAAAAAAAAwAQgFar8ylNVdARqXwAoMkR9QoAAAAA +AKAAAAEAAAADABiAU6vzKU1V0BGpfACgyRH1CgAAAABBoAAAAAAAAAMAGYAUIAYAAAAAAMAAAAAA +AABGAAAAAAWPAADw/gwAAwAagFOr8ylNVdARqXwAoMkR9QoAAAAAQ6AAABEAAAAeABuAU6vzKU1V +0BGpfACgyRH1CgAAAABEoAAAAQAAAAEAAAAAAAAACwAcgBQgBgAAAAAAwAAAAAAAAEYAAAAAB48A +AAEAAAADAB2ACCAGAAAAAADAAAAAAAAARgAAAABwhQAAAAAAAAMAKYAIIAYAAAAAAMAAAAAAAABG +AAAAANeFAAABAAAAAwArgAggBgAAAAAAwAAAAAAAAEYAAAAAEIUAAAABAAALADuACCAGAAAAAADA +AAAAAAAARgAAAAAUhQAAAAAAAAsAPoAIIAYAAAAAAMAAAAAAAABGAAAAAIKFAAABAAAAAwBCgAgg +BgAAAAAAwAAAAAAAAEYAAAAAAYUAAAAAAAALAEiACCAGAAAAAADAAAAAAAAARgAAAAAGhQAAAAAA +AAsATYAIIAYAAAAAAMAAAAAAAABGAAAAAA6FAAAAAAAAAwBOgAggBgAAAAAAwAAAAAAAAEYAAAAA +GIUAAAAAAAADAFOACCAGAAAAAADAAAAAAAAARgAAAADrhQAACQQAAAIBwIAIIAYAAAAAAMAAAAAA +AABGAAAAACCFAAABAAAALQIAAAIBBwAAAAAAAAAFUmVwbHkISVBNLk5vdGUHTWVzc2FnZQJSRQUA +AAAAAAAAAAEAAAAAAAAAAgAAAGYAAAACAAAAAQAAAAxSZXBseSB0byBBbGwISVBNLk5vdGUHTWVz +c2FnZQJSRQUAAAAAAAAAAAEAAAAAAAAAAgAAAGcAAAADAAAAAgAAAAdGb3J3YXJkCElQTS5Ob3Rl +B01lc3NhZ2UCRlcFAAAAAAAAAAABAAAAAAAAAAIAAABoAAAABAAAAAMAAAAPUmVwbHkgdG8gRm9s +ZGVyCElQTS5Qb3N0BFBvc3QABQAAAAAAAAAAAQAAAAAAAAACAAAAbAAAAAgAAAAEAAAAA1llcwhJ +UE0uTm90ZQADWWVzAAAAAAAAAAAAAQAAAAIAAAACAAAAAQAAAP////8EAAAAAk5vCElQTS5Ob3Rl +AAJObwAAAAAAAAAAAAEAAAACAAAAAgAAAAIAAAD/////BAAAAAVNYXliZQhJUE0uTm90ZQAFTWF5 +YmUAAAAAAAAAAAABAAAAAgAAAAIAAAADAAAA/////wQBBVIAZQBwAGwAeQACUgBFAAxSAGUAcABs +AHkAIAB0AG8AIABBAGwAbAACUgBFAAdGAG8AcgB3AGEAcgBkAAJGAFcAD1IAZQBwAGwAeQAgAHQA +bwAgAEYAbwBsAGQAZQByAAADWQBlAHMAA1kAZQBzAAJOAG8AAk4AbwAFTQBhAHkAYgBlAAVNAGEA +eQBiAGUAAAAAAgEFgQggBgAAAAAAwAAAAAAAAEYBAAAANgAAAEkAbgBUAHIAYQBuAHMAaQB0AE0A +ZQBzAHMAYQBnAGUAQwBvAHIAcgBlAGwAYQB0AG8AcgAAAAAAAQAAABAAAABrmOnR1mtfT4xQuYTZ +2hsOCwAVgQggBgAAAAAAwAAAAAAAAEYBAAAAMAAAAEUAbgB0AGkAdAB5AEUAeAB0AHIAYQBjAHQA +aQBvAG4AUwB1AGMAYwBlAHMAcwAAAAEAAAAeABaBCCAGAAAAAADAAAAAAAAARgEAAAAWAAAAVABl +AGUAVgBlAHIAcwBpAG8AbgAAAAAAAQAAAAwAAAAyMDE4MTIxMC4xMQAUABeBCCAGAAAAAADAAAAA +AAAARgEAAAAyAAAAUAByAG8AcABlAHIAdAB5AEUAeABpAHMAdABlAG4AYwBlAFQAcgBhAGMAawBl +AHIAAAAAAAAEAAAAAAAAAwAagQggBgAAAAAAwAAAAAAAAEYBAAAAMgAAAEUAeABjAGgAYQBuAGcA +ZQBBAHAAcABsAGkAYwBhAHQAaQBvAG4ARgBsAGEAZwBzAAAAAAAgAAAACwAbgROP8kH0gxRBpYTu +21prC/8BAAAAKAAAAEkAcwBRAHUAbwB0AGUAZABUAGUAeAB0AEMAaABhAG4AZwBlAGQAAAAAAAAA +AgEegROP8kH0gxRBpYTu21prC/8BAAAALgAAAEgAZQBhAGQAZQByAEIAbwBkAHkARgByAGEAZwBt +AGUAbgB0AEwAaQBzAHQAAAAAAAEAAAAiAAAAAQAKAAAABAAAAAAAAAAUAAAAAAAAAAAAAAD///// +AAAAAAAAHgAfgR+k6zOoei5Cvnt54amOVLMBAAAAOAAAAEMAbwBuAHYAZQByAHMAYQB0AGkAbwBu +AEkAbgBkAGUAeABUAHIAYQBjAGsAaQBuAGcARQB4AAAAAQAAAJcAAABJST1bQ0lEPWQ3YjhjNTFi +LTVhNDgtODk0Ni04Y2M5LTQ5ZTg3ZDQ3M2JlNDtJRFhIRUFEPUQ0OTQ4MkMzOTc7SURYQ09VTlQ9 +MV07VEZSPU5vdEZvcmtpbmc7VmVyc2lvbj1WZXJzaW9uIDE1LjIwIChCdWlsZCAxNDQ2LjApLCBT +dGFnZT1INDtVUD0xMDtEUD0xQzUAAB4AK4EIIAYAAAAAAMAAAAAAAABGAQAAAFIAAABFAG4AdABp +AHQAeQBFAHgAdAByAGEAYwB0AGkAbwBuAFMAZQByAHYAaQBjAGUARABpAGEAZwBuAG8AcwB0AGkA +YwBDAG8AbgB0AGUAeAB0AAAAAAABAAAAMgMAAFsiRXh0cmFjdGlvbklkIiwiYzYyNjI2YjQtZDIw +OC00Y2NhLWFkZjUtMDI4ODFlM2EzZTE0IiwiVGVlRW5naW5lVmVyc2lvbiIsIjUyLjAuMCIsIkJ1 +aWxkTnVtYmVyIiwiMjAxODEyMTAuMTEiLCJDaGFuZ2VzZXROdW1iZXIiLCIyMDE4MTIxMC4xMSIs +IkxvY2FsZSIsImVuLVVTIiwiTWVzc2FnZUlkIiwiXHUwMDNjRE01UFIyMU1CMDgyOERBMkI4Qzg4 +MDQ4QkMwM0VGRkE2Q0ZBMjBARE01UFIyMU1CMDgyOC5uYW1wcmQyMS5wcm9kLm91dGxvb2suY29t +XHUwMDNlIiwiUmVmZXJlbmNlVGltZSIsIjIwMTgtMTItMTVUMTU6MDc6MDAuMDAwMDAwMFoiLCJG +bGlnaHRzIiwiUWFzQjJGbGlnaHQ7VEVFUmVwbHlXaXRoU2hpcFdXO1RFRU0ySFBheWxvYWRFbmFi +bGVkRmxpZ2h0O1RFRUNvbXBsaWFudEluZmVyZW5jZXNTaG9ydGN1dDtURUVJbmZlcmVuY2VzRm9y +TTJIO1RFRUluZmVyZW5jZXNWMkZvck0ySDtURUVJbmZlcmVuY2VzRm9yU3Vic2NyaXB0aW9uO1RF +RUVuYWJsZVRlcm1GcmVxdWVuY3k7VEVFSW1wb3J0YW50TWFpbDtURUVIaWdobGlnaHRzQ0Y7dGVl +UmVxdWVzdHNQQU1vZGVsRmxpZ2h0O1RFRVJlcGx5V2l0aENvdmVyYWdlRmlsdGVyRmxpZ2h0O1RF +RVJlcGx5V2l0aENvbXBsaWFudE0yUTtURUVTbWFydFJlcGx5RW5hYmxlZEZsaWdodDtURUVTZXJ2 +aWNlQXBwb2ludG1lbnRPZmZCb3hFeHRyYWN0aW9uO1Fhc1Rlc3RDb21wbGlhbnRURUVGbGlnaHQ7 +UWFzVGVzdEtQRU9mZkJveEIyIiwiU3RhcnRUaW1lIiwiMjAxOC0xMi0xNVQxNTowNzoxOS43MTU1 +MTIxWiIsIkVuZFRpbWUiLCIyMDE4LTEyLTE1VDE1OjA3OjE5Ljc5MjU3NjZaIl0AAAALAC6BE4/y +QfSDFEGlhO7bWmsL/wEAAAAcAAAASABhAHMAUQB1AG8AdABlAGQAVABlAHgAdAAAAAAAAAAeADSB +CCAGAAAAAADAAAAAAAAARgEAAAAeAAAARQBuAHQAaQB0AHkARABvAGMAdQBtAGUAbgB0AAAAAAAB +AAAAvzsAAFt7DQogICJAY29udGV4dCI6ICJodHRwOi8vc2NoZW1hLm9yZyIsDQogICJ0eXBlIjog +IkV4dHJhY3RMYW5ndWFnZSIsDQogICJlbnRpdGllcyI6IFsNCiAgew0KICAgICJAdHlwZSI6ICJF +eHRyYWN0TGFuZ3VhZ2UiLA0KICAgICJAY29udGV4dCI6ICJodHRwOi8vc2NoZW1hLm1pY3Jvc29m +dC5jb20iLA0KICAgICJAb3V0cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJMYW5ndWFnZSI6IHsN +CiAgICAgICJAdHlwZSI6ICJMYW5ndWFnZSIsDQogICAgICAiTG9jYWxlIjogImVuLVVTIiwNCiAg +ICAgICJuYW1lIjogIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIg0KICAgIH0sDQogICAgIkBzb3Vy +Y2UiOiAiRXhjaGFuZ2UiLA0KICAgICJMYW5ndWFnZVNjb3JlcyI6IHsNCiAgICAgICJFbmdsaXNo +IjogOTkuMTM1NDQ0Ng0KICAgIH0sDQogICAgIkBFbnRpdHlJZCI6ICJlZjJhZTFmZS0zNTRlLTQw +MTMtYjEyYy1hNWE3ZDAwYjcwZmMiLA0KICAgICJAY29ycmVsYXRpb25UcmFpbCI6ICJBc3NldElk +PWI1MGY5ZDY3LTcwNWEtNGJjNy05YmNkLTYyZmJjYzg2MDRhMTtFeHRyYWN0aW9uSWQ9YzYyNjI2 +YjQtZDIwOC00Y2NhLWFkZjUtMDI4ODFlM2EzZTE0O0VudGl0eUlkPWVmMmFlMWZlLTM1NGUtNDAx +My1iMTJjLWE1YTdkMDBiNzBmYyIsDQogICAgIkBleHRyYWN0aW9uVGltZVV0YyI6ICIyMDE4LTEy +LTE1VDE1OjA3OjE5Ljc5MjU3NjZaIg0KICB9DQpdDQp9LHsNCiAgIkBjb250ZXh0IjogImh0dHA6 +Ly9zY2hlbWEub3JnIiwNCiAgInR5cGUiOiAiU2NoZWR1bGVBY3Rpb24iLA0KICAiZW50aXRpZXMi +OiBbDQogIHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmciLA0KICAgICJAb3V0 +cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6ICIyLjEiLA0KICAg +ICJAdHlwZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAiVEVFLDUyLjAuMCwy +MDE4MTIwMy4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Db21taXRtZW50VEZMVSw1Mi4wLjAsMjAxODEy +MDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFjdGlvblRydXN0TGV2ZWwiOiAi +VHJ1c3RlZCIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUiOiAiMC45ODg3IiwNCiAgICAi +ZGVzY3JpcHRpb24iOiAiQ2hhbmdlIHRoZSByYWRpbyBhbmQgSSdsbCB0dXJuIHRoZSBsaWdodHMg +ZG93biBkaW1tZXIiLA0KICAgICJkZXNjcmlwdGlvbi9zY2hlZHVsZUFjdGlvblR5cGUiOiAiQ29t +bWl0bWVudCIsDQogICAgInNjaGVkdWxlZFRpbWUiOiAiIiwNCiAgICAic2NoZWR1bGVkVGltZS90 +aW1lem9uZSI6ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLA0KICAgICJzY2hlZHVsZWRUaW1lL3Jl +bGF0aXZlIjogIiIsDQogICAgInNjaGVkdWxlZFRpbWUvaW1wcmVjaXNlRmxhZyI6ICIiLA0KICAg +ICJAYWJzb2x1dGVPZmZzZXRQbGFpblRleHQiOiAiMCIsDQogICAgIkBzcGFuIjogIjUzIiwNCiAg +ICAiQEVudGl0eUlkIjogIjYzOTljMDFiLWUzZjQtNGY4Ni1iYTMwLWY0OTA1NDFhZjE4YyIsDQog +ICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1YS00YmM3LTliY2Qt +NjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2EtYWRmNS0wMjg4MWUz +YTNlMTQ7RW50aXR5SWQ9NjM5OWMwMWItZTNmNC00Zjg2LWJhMzAtZjQ5MDU0MWFmMThjIiwNCiAg +ICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTkuNzkyNTc2NloiDQog +IH0NCl0NCn0sew0KICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmciLA0KICAidHlwZSI6 +ICJLZXlQaHJhc2VFeHRyYWN0aW9uIiwNCiAgImVudGl0aWVzIjogWw0KICB7DQogICAgIkBvdXRw +dXRWZXJzaW9uIjogIjIuMCIsDQogICAgIkBmb3JtYXR0ZXIiOiAiVGVlS3BlQm9uZENicEJhc2U2 +NCIsDQogICAgIkBzY2hlbWEiOiAiTWljcm9zb2Z0LkV4Y2hhbmdlLlJlbGV2YW5jZS5UZWVLcGVC +b25kUmVzcG9uc2UuVGVlS3BlLlRlZUtwZVJlc3BvbnNlIiwNCiAgICAia2V5UGhyYXNlcyI6ICJR +MElCQU0wVUVnb2JDWElBYVFCakFHZ0FJQUIwQUdVQWVBQjBBTWNLVWRSZ1FNMFVFQWNFQWdBQUFF +QU1BQUNBUHhBQUFJQS9EZ0FBQUVBQUNXTUFhQUJ5QUdrQWN3QjBBRzBBWVFCekFNY0tJS2dUdjgw +VUVBY2FNZ0FBSkVJQ0FBQ0FQeElBQUdCQkZxbEJKVDBVQUlDdFF4Z0FBSUEvR2dBQW9FQWNxQlJz +UEI0bHlUSkRJRW5tQXo4aUFBQUFRQ1JUM2J3N0p0czJKME1vczduMlBqUUFBR0JCTmt2VXJqNDgy +N2FoUVQ2YmJ2dytSQ1ZKbmtGR2hSVDNQaXdsU1lKQUxnQUFBRUF3dDIwYlFFcVNKR2xBVEFBQUFF +Qk90MjBiUUFBU2N3QndBSElBYVFCdUFHY0FkQUJwQUcwQVpRQWdBR1lBWlFCbEFHd0FhUUJ1QUdj +QXh3cUl0Z3BBelJRUUJ4d3lBQUFrUWdJQUFBQkFFZ0FBb0VBV3FCVHNQQlFBZ0sxREdBQUFBRDhh +QUFBQVFSeFQzYnc4SHMzTU9FTWdMRllJUHlJQUFNQkJKUCtsalQwbU16TWdReWcwWU93K05BQUFv +RUEya01INVBUZ0FBSUEvT2d6T3h6dzhNek9yUVQ2WW5nVS9RQUFBQUVCQ0RNNUhQVVROekpSQlJ1 +OUY2RDR1QUFEQVFEQUFBTUJBVEFBQXdFQk9BQURBUUFBSmN3QjBBSElBWVFCdUFHY0FaUUJ5QUhN +QXh3cXIyNzFBelJRUUJ4d3lBQUFrUWdJQUFJQS9FZ0FBQUVBV1U5MjhPeFFBZ0sxREdBQUFnRDhh +QUFDQVFSeFQzVHc5SGdBQW4wSWc3cHBxUGlJQUFFdERKSUhERlQ4bUFFQ0ZReWhubkVRL05BQUFB +RUEyRE01SFBUZ0FBQUJBT2d6T1J6MDhBQUFRUVQ3T3gyQStRQUFBd0VGQ2lkb1ZQMFFBQVBoQlJw +eVBRVDh1QUFDQVFEQUFBTEJBVEFBQWdFQk9BQUN3UUFBRllRQnpBSEFBWlFCdUFNY0tMa0Jwd00w +VUVBY2dNZ0FBSkVJQ0FBQ0FQeElBQUlBL0ZsUGRQRHNVQUlDdFF4Z0FBSUEvR2dBQThFRWNmZyt4 +UFI0QUFQQkJJSDRQc1QwaUFBQ2VReVF6SVdrL0pnQUFua01vTXlGcFB6UUFBSUEvTmd6T3h6dzRB +QUNBUURvTXpzYzlQQUFBZ0VBK0RNN0hQVUFBQUJCQ1FzN0hZRDlFQUFBUVFrYk94MkEvS2dBQVFF +QXNBQUJBUUM0QUFLQkFNQUFBb0VCSUFBQkFRRW9BQUVCQVRBQUFvRUJPQUFDZ1FBQUVjd0J1QUc4 +QWR3REhDbUh3YjhETkZCQUhHeklBQUNSQ0FnQUFnRDhTQUFBQVFCWlQzYnc3RkFDQXJVTWFBQUF3 +UWh3cDJBRStIZ0FBRmtNZ1hsUGRQaUlBQUxSQ0pKL0xoRDRtQUFCRVF5aDBtUkEvTkFBQUFFQTJE +TTVIUFRnQUFLQkFPcERCK1QwOEFBQ0lRVDd0U3RRK1FBQUFNRUZDcVYySlBrUUFBTGhCUmhtY0R6 +OHFBQURBUUN3QUFPQkFTQUFBd0VCS0FBRGdRQUFLWndCaEFIUUFiQUJwQUc0QVlnQjFBSElBWndE +SENzWjVhOERORkJBSElESUFBQ1JDQWdBQWdEOFNBQUNBUHhaVDNUdzdGQUNBclVNWUFBQ0FQeG9B +QUVoQ0hPbU1FejRlQUFCSVFpRHBqQk0rSWdBQWxFTWs2RjlhUHlZQUFKUkRLT2hmV2o4MEFBQ0FQ +ellNenNjOE9BQUF3RUE2aWRvVlBqd0FBTUJBUG9uYUZUNUFBQUFJUWtMdFNsUS9SQUFBQ0VKRzdV +cFVQeW9BQUtCQUxBQUFvRUF1QUFEQVFEQUFBTUJBU0FBQW9FQktBQUNnUUV3QUFNQkFUZ0FBd0VB +QUJuTUFiQUJ2QUhBQVpRQnpBTWNLUVBsUHdNMFVFQWNiTWdBQUpFSUNBQUNBUHhJQUFBQkFGbFBk +dkRzVUFJQ3RReG9BQUloQ0hDbXJTRDRlQUlBWFF5RDJpZDgrSWdBQTNrSWs3c2VqUGlZQWdFSkRL +Q2grRHo4MEFBQUFRRFlNemtjOU9BQUE0RUE2UzlRdVBqd0FBSVJCUG4wTXpqNUFBQUJnUVVKTDFL +NCtSQUFBdkVGR1Vic1NQeW9BQU1CQUxBQUFDRUZJQUFEQVFFb0FBQWhCQUFsbUFHa0FjZ0JsQUhB +QWJBQmhBR01BWlFESEN2SFhqTURORkJBSEh6SUFBQ1JDQWdBQWdEOFNBQUNBUHhaVDNUdzdGQUNB +clVNYUFBQ2tRaHlUKzNFK0hnQUFwRUlnay90eFBpSUFBSVJESkQ3RVFqOG1BQUNFUXlnK3hFSS9O +QUFBZ0Q4MkRNN0hQRGdBQUJCQk9zN0hZRDQ4QUFBUVFUN094MkErUUFBQStFRkNuSTlCUDBRQUFQ +aEJScHlQUVQ4cUFBQ0FRQ3dBQUlCQUxnQUFvRUF3QUFDZ1FFZ0FBSUJBU2dBQWdFQk1BQUNnUUU0 +QUFLQkFBQkIwQUdFQWFBQnZBR1VBSUFCekFHc0FhUUFnQUdNQWFBQmhBR3dBWlFCMEFNY0s3V3FW +d00wVUVBY2NNZ0FBSkVJQ0FBQkFRQklBQUlBL0Z2K2xEVHdVQUlDdFF4aXJxcW8rR2dBQXFrSWM4 +OVY2UGg0QUFLcENJUFBWZWo0aUFJQ0JReVRyRXo4L0pnQ0FnVU1vNnhNL1B6UUFBSUEvTmd6T3h6 +dzRBQUFRUVRyT3gyQStQQUFBRUVFK3pzZGdQa0FBQVBoQlFweVBRVDlFQUFENFFVYWNqMEUvS2dB +QTRFQXNBQURnUUVnQUFPQkFTZ0FBNEVBQUVtWUFZUUJ6QUhRQUlBQjBBR0VBYkFCckFHa0FiZ0Ju +QUNBQWJBQnZBSFlBWlFCeUFNY0tIVEdYd00wVUVBY2ZNZ0FBSkVJQ0FBQkFRQklBQUlBL0Z2K2xE +VHdVQUlDdFF4b0FBTFJDSEovTGhENGVBQUMwUWlDZnk0UStJZ0FBZmtNa21XTTdQeVlBQUg1REtK +bGpPejgwQUFDQVB6WU16c2M4T0FBQUlFRTZrTUY1UGp3QUFDQkJQcERCZVQ1QUFBRHdRVUlzVVRz +L1JBQUE4RUZHTEZFN1B5b0FBQUJBTEFBQUFFQXVBQUNnUURBQUFLQkFTQUFBQUVCS0FBQUFRRXdB +QUtCQVRnQUFvRUFBRVhNQWJBQnZBSGNBSUFCaUFIVUFjZ0J1QUdrQWJnQm5BQ0FBZHdCdkFHOEFa +QURIQ3UxcWxjRE5GQkFIR3pJQUFDUkNBZ0FBUUVBU0FBQ0FQeGIvcFEwOEZBQ0FyVU1hQUFDK1Fo +eEVMSXcrSGdBQXZrSWdSQ3lNUGlJQUFIbERKRWF6Tno4bUFBQjVReWhHc3pjL05BQUFnRDgyRE03 +SFBEZ0FBQ0JCT3BEQmVUNDhBQUFnUVQ2UXdYaytRQUFBOEVGQ0xGRTdQMFFBQVBCQlJpeFJPejhx +QUFEZ1FDd0FBT0JBU0FBQTRFQktBQURnUUFBT2R3QnBBR3dBWkFCbEFITUFkQUFnQUdRQWNnQmxB +R0VBYlFCekFNY0tyMkNLd00wVUVBY2ZNZ0FBSkVJQ0FBQUFRQklBQUlBL0ZsUGR2RHNVQUlDdFF4 +b0FBTXhDSEY2QWxqNGVBQURNUWlCZWdKWStJZ0FBYzBNa0ZrWXpQeVlBQUhOREtCWkdNejgwQUFD +QVB6WU16c2M4T0FBQU1FRTZxVjJKUGp3QUFEQkJQcWxkaVQ1QUFBRG9RVUs3RWpVL1JBQUE2RUZH +dXhJMVB5b0FBSUJBTEFBQWdFQXVBQURBUURBQUFNQkFTQUFBZ0VCS0FBQ0FRRXdBQU1CQVRnQUF3 +RUFBQlhJQVlRQmtBR2tBYndESENwVS9qOERORkJBSEh6SUFBQ1JDQWdBQWdEOFNBQUNBUHhaVDNU +dzdGQUNBclVNYUFBQUFReHhUM2J3K0hnQUFBRU1nVTkyOFBpSUFBRnBESkhuVUlEOG1BQUJhUXlo +NTFDQS9OQUFBZ0Q4MkRNN0hQRGdBQUdCQk9rdlVyajQ4QUFCZ1FUNUwxSzQrUUFBQTBFRkNhbGNp +UDBRQUFOQkJSbXBYSWo4cUFBQUFRQ3dBQUFCQUxnQUFBRUV3QUFBQVFVZ0FBQUJBU2dBQUFFQk1B +QUFBUVU0QUFBQkJBQVpzQUdrQVp3Qm9BSFFBY3dESEN0cGxnOERORkJBSEh6SUFBQ1JDQWdBQWdE +OFNBQUNBUHhaVDNUdzdGQUNBclVNYUFBQUdReHl6dDhVK0hnQUFCa01nczdmRlBpSUFBRlJESkVs +bkhEOG1BQUJVUXloSlp4dy9OQUFBZ0Q4MkRNN0hQRGdBQUdCQk9rdlVyajQ4QUFCZ1FUNUwxSzQr +UUFBQTBFRkNhbGNpUDBRQUFOQkJSbXBYSWo4cUFBQUFRU3dBQUFCQkxnQUFBRUF3QUFBQVFFZ0FB +QUJCU2dBQUFFRk1BQUFBUUU0QUFBQkFBQVpzQUc4QWRnQmxBSElBY3dESENpY2lhc0RORkJBSEh6 +SUFBQ1JDQWdBQWdEOFNBQUNBUHhaVDNUdzdGQUNBclVNYUFBQVRReHd1NXRnK0hnQUFFME1nTHVi +WVBpSUFBRWRESkF6UUVqOG1BQUJIUXlnTTBCSS9OQUFBZ0Q4MkRNN0hQRGdBQUlCQk9nek94ejQ4 +QUFDQVFUNE16c2MrUUFBQXdFRkNpZG9WUDBRQUFNQkJSb25hRlQ4cUFBQ0FRQ3dBQUlCQUxnQUFR +RUF3QUFCQVFFZ0FBSUJBU2dBQWdFQk1BQUJBUUU0QUFFQkFBQVppQUd3QWJ3QjNBR2tBYmdESENy +NHYzTURORkJBSEhESUFBQ1JDQWdBQWdEOFNBQUNBUHhaVDNUdzdGQUNBclVNWUFBQ0FQeG9BQUN0 +REhLMVAvRDRlQUFBclF5Q3RUL3crSWdBQUwwTWtUQnNCUHlZQUFDOURLRXdiQVQ4MEFBQ0FQellN +enNjOE9BQUFtRUU2cjBUdFBqd0FBSmhCUHE5RTdUNUFBQUNvUVVJNEh3TS9SQUFBcUVGR09COERQ +eTRBQUNCQk1BQUFJRUZNQUFBZ1FVNEFBQ0JCQUJSM0FHa0FiQUJrQUNBQWNnQmxBSE1BZEFCc0FH +VUFjd0J6QUNBQWR3QnBBRzRBZEFCbEFISUF4d3BkTWdMQnpSUVFCeDh5QUFBa1FnSUFBRUJBRWdB +QWdEOFcvNlVOUEJRQWdLMURHZ0FBTVVNY0I1VUNQeDRBQURGRElBZVZBajhpQUFBblF5VERhUFkr +SmdBQUowTW93MmoyUGpRQUFJQS9OZ3pPeHp3NEFBQ1lRVHF2Uk8wK1BBQUFtRUUrcjBUdFBrQUFB +S2hCUWpnZkF6OUVBQUNvUVVZNEh3TS9LZ0FBd0VBc0FBREFRQzRBQUFCQU1BQUFBRUJJQUFEQVFF +b0FBTUJBVEFBQUFFQk9BQUFBUUFBRmJnQmxBR0VBZEFCb0FNY0s4dS9ud00wVUVBY2NNZ0FBSkVJ +Q0FBQ0FQeElBQUlBL0ZsUGRQRHNVQUlDdFF4Z0FBSUEvR2dBQVIwTWNETkFTUHg0QUFFZERJQXpR +RWo4aUFBQVRReVF1NXRnK0pnQUFFME1vTHViWVBqUUFBSUEvTmd6T3h6dzRBQUN3UVRxcFhRay9Q +QUFBc0VFK3FWMEpQMEFBQUpCQlFzN0g0RDVFQUFDUVFVYk94K0ErTGdBQUFFRXdBQUFBUVV3QUFB +QkJUZ0FBQUVFQUNXMEFhUUJ6QUhRQWJBQmxBSFFBYndCbEFNY0tYblBXd00wVUVBY2ZNZ0FBSkVJ +Q0FBQ0FQeElBQUlBL0ZsUGRQRHNVQUlDdFF4b0FBRWxESE1aSkZEOGVBQUJKUXlER1NSUS9JZ0FB +RVVNa3VQTFZQaVlBQUJGREtMankxVDQwQUFDQVB6WU16c2M4T0FBQXNFRTZxVjBKUHp3QUFMQkJQ +cWxkQ1Q5QUFBQ1FRVUxPeCtBK1JBQUFrRUZHenNmZ1Bpb0FBQUJBTEFBQUFFQXVBQURBUURBQUFN +QkFTQUFBQUVCS0FBQUFRRXdBQU1CQVRnQUF3RUFBRkhNQVlRQnVBR2NBSUFCakFHZ0FjZ0JwQUhN +QWRBQnRBR0VBY3dBZ0FITUFid0J1QUdjQWN3REhDbEFyQThITkZCQUhIRElBQUNSQ0FnQUFRRUFT +QUFDQVB4Yi9wUTA4RkFDQXJVTVlxNm9xUHhvQUFGNURITzdISXo4ZUFBQmVReUR1eHlNL0lnQUE5 +RUlrOHdLMFBpWUFBUFJDS1BNQ3RENDBBQUNBUHpZTXpzYzhPQUFBeUVFNitoZ2NQendBQU1oQlB2 +b1lIRDlBQUFCd1FVSXNVYnMrUkFBQWNFRkdMRkc3UGk0QUFJQkFNQUFBZ0VCTUFBQ0FRRTRBQUlC +QUFBWm1BR2tBWlFCc0FHUUFjd0RIQ2lmUjFzRE5GQkFISHpJQUFDUkNBZ0FBZ0Q4U0FBQ0FQeFpU +M1R3N0ZBQ0FyVU1hQUFCblF4eTJheW8vSGdBQVowTWd0bXNxUHlJQUFPWkNKTm11cVQ0bUFBRG1R +aWpacnFrK05BQUFnRDgyRE03SFBEZ0FBTkJCT21wWElqODhBQURRUVQ1cVZ5SS9RQUFBWUVGQ1M5 +U3VQa1FBQUdCQlJrdlVyajRxQUFBQVFDd0FBQUJBTGdBQWdFQXdBQUNBUUVnQUFBQkFTZ0FBQUVC +TUFBQ0FRRTRBQUlCQUFBWm9BR1VBWVFCeUFIUUFjd0RIQ2lmUjFzRE5GQkFISHpJQUFDUkNBZ0FB +Z0Q4U0FBQ0FQeFpUM1R3N0ZBQ0FyVU1hQUFCOFF4emU2VGsvSGdBQWZFTWczdWs1UHlJQUFMeENK +SW15aWo0bUFBQzhRaWlKc29vK05BQUFnRDgyRE03SFBEZ0FBT2hCT3JzU05UODhBQURvUVQ2N0Vq +VS9RQUFBTUVGQ3FWMkpQa1FBQURCQlJxbGRpVDRxQUFBQVFDd0FBQUJBTGdBQWdFQXdBQUNBUUVn +QUFBQkFTZ0FBQUVCTUFBQ0FRRTRBQUlCQUFBZGpBR2dBYVFCdEFHNEFaUUI1QU1jS3k0Zlp3TTBV +RUFjZk1nQUFKRUlDQUFDQVB4SUFBSUEvRmxQZFBEc1VBSUN0UXhvQUFIOURISFlnUEQ4ZUFBQi9R +eUIySUR3L0lnQUF0a0lrV1VXR1BpWUFBTFpDS0ZsRmhqNDBBQUNBUHpZTXpzYzhPQUFBNkVFNnV4 +STFQendBQU9oQlByc1NOVDlBQUFBd1FVS3BYWWsrUkFBQU1FRkdxVjJKUGlvQUFLQkFMQUFBb0VB +dUFBQ0FQekFBQUlBL1NBQUFvRUJLQUFDZ1FFd0FBSUEvVGdBQWdEOEFDMjRBWlFCNEFIUUFJQUIz +QUdrQWJnQjBBR1VBY2dESENyek85c0RORkJBSEd6SUFBQ1JDQWdBQUFFQVNBQUNBUHhaVDNidzdG +QUNBclVNYUFBQ0hReHh1TVVjL0hnQUFoME1nYmpGSFB5SUFBSlpDSkY1VFhUNG1BQUNXUWloZVUx +MCtOQUFBZ0Q4MkRNN0hQRGdBQVBoQk9weVBRVDg4QUFENFFUNmNqMEUvUUFBQUVFRkN6c2RnUGtR +QUFCQkJSczdIWUQ0cUFBQ0FRQ3dBQUlCQVNBQUFnRUJLQUFDQVFBQUVaZ0JwQUhJQVpRREhDcUJC +MzhETkZCQUhIeklBQUNSQ0FnQUFnRDhTQUFDQVB4WlQzVHc3RkFDQXJVTWFBQUNVUXh6b1gxby9I +Z0FBbEVNZzZGOWFQeUlBQUVoQ0pPbU1FejRtQUFCSVFpanBqQk0rTkFBQWdEODJETTdIUERnQUFB +eENPbDZKV2o4OEFBQU1RajVlaVZvL1FBQUFvRUJDa01INVBVUUFBS0JBUnBEQitUMHFBQUFBUUN3 +QUFBQkFMZ0FBSUVFd0FBQWdRVWdBQUFCQVNnQUFBRUJNQUFBZ1FVNEFBQ0JCQUE1aUFIVUFjZ0J1 +QUdrQWJnQm5BQ0FBWlFCdEFHSUFaUUJ5QUhNQXh3b0c4UVBCelJRUUJ4c3lBQUFrUWdJQUFBQkFF +Z0FBZ0Q4V1U5MjhPeFFBZ0sxREdnQ0FxVU1jRlJsNlB4NEFnS2xESUJVWmVqOGlBQURBUUNUL3BZ +MDhKZ0FBd0VBby82V05QRFFBQUlBL05nek94enc0QUFBY1Fqb2ZnM00vUEFBQUhFSStINE56UDBB +QUFJQS9RZ3pPeHp4RUFBQ0FQMFlNenNjOEtnQUFJRUVzQUFBZ1FVZ0FBQ0JCU2dBQUlFRUFBQT09 +IiwNCiAgICAiQHR5cGUiOiAiS2V5UGhyYXNlRXh0cmFjdGlvbiIsDQogICAgIkBjb250ZXh0Ijog +Imh0dHA6Ly9zY2hlbWEubWljcm9zb2Z0LmNvbSIsDQogICAgIkBFbnRpdHlJZCI6ICI1MDNiMDhi +Ny1hY2NlLTQwNDYtYjQ4OC1lYmUyOGM1ZDU2M2QiLA0KICAgICJAY29ycmVsYXRpb25UcmFpbCI6 +ICJBc3NldElkPWI1MGY5ZDY3LTcwNWEtNGJjNy05YmNkLTYyZmJjYzg2MDRhMTtFeHRyYWN0aW9u +SWQ9YzYyNjI2YjQtZDIwOC00Y2NhLWFkZjUtMDI4ODFlM2EzZTE0O0VudGl0eUlkPTUwM2IwOGI3 +LWFjY2UtNDA0Ni1iNDg4LWViZTI4YzVkNTYzZCIsDQogICAgIkBleHRyYWN0aW9uVGltZVV0YyI6 +ICIyMDE4LTEyLTE1VDE1OjA3OjE5Ljc5MjU3NjZaIg0KICB9DQpdDQp9LHsNCiAgIkBjb250ZXh0 +IjogImh0dHA6Ly9zY2hlbWEub3JnIiwNCiAgInR5cGUiOiAiRm9sbG93VXBTY2hlZHVsZVJlcGx5 +UmVxdWVzdCIsDQogICJlbnRpdGllcyI6IFsNCiAgew0KICAgICJAY29udGV4dCI6ICJodHRwOi8v +c2NoZW1hLm9yZyIsDQogICAgIkBvdXRwdXRWZXJzaW9uIjogIjEuMCIsDQogICAgIkBzY2hlbWFP +cmdWZXJzaW9uIjogIjIuMSIsDQogICAgIkB0eXBlIjogIlNjaGVkdWxlQWN0aW9uIiwNCiAgICAi +QHNvdXJjZSI6ICJURUUsNTIuMC4wLDIwMTgxMjAzLjExLDIwMTgxMjAzLjExO2VuLVVTLkZvbGxv +d1VwRm9yUmVxdWVzdFJSLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMSIsDQogICAgIkBl +bnRpdHlFeHRyYWN0aW9uVHJ1c3RMZXZlbCI6ICJVbmtub3duIiwNCiAgICAiQHNvdXJjZUNvbmZp +ZGVuY2VTY29yZSI6ICIwLjUxMTM2MTY1ODg2NjIiLA0KICAgICJkZXNjcmlwdGlvbiI6ICJXaGF0 +IGEgQ2hyaXN0bWFzIHRvIHJlbWVtYmVyIiwNCiAgICAiZGVzY3JpcHRpb24vc2NoZWR1bGVBY3Rp +b25UeXBlIjogIkZvbGxvd1VwIiwNCiAgICAiQGFic29sdXRlT2Zmc2V0UGxhaW5UZXh0IjogIjEz +MSIsDQogICAgIkBzcGFuIjogIjQiLA0KICAgICJARW50aXR5SWQiOiAiNjZkZmExNzMtYTFiYi00 +YjllLTg4NmItZmM1ODI3Mzc4NjkyIiwNCiAgICAiQGNvcnJlbGF0aW9uVHJhaWwiOiAiQXNzZXRJ +ZD1iNTBmOWQ2Ny03MDVhLTRiYzctOWJjZC02MmZiY2M4NjA0YTE7RXh0cmFjdGlvbklkPWM2MjYy +NmI0LWQyMDgtNGNjYS1hZGY1LTAyODgxZTNhM2UxNDtFbnRpdHlJZD02NmRmYTE3My1hMWJiLTRi +OWUtODg2Yi1mYzU4MjczNzg2OTIiLA0KICAgICJAZXh0cmFjdGlvblRpbWVVdGMiOiAiMjAxOC0x +Mi0xNVQxNTowNzoxOS43OTI1NzY2WiINCiAgfSwNCiAgew0KICAgICJAY29udGV4dCI6ICJodHRw +Oi8vc2NoZW1hLm9yZyIsDQogICAgIkBvdXRwdXRWZXJzaW9uIjogIjEuMCIsDQogICAgIkBzY2hl +bWFPcmdWZXJzaW9uIjogIjIuMSIsDQogICAgIkB0eXBlIjogIlNjaGVkdWxlQWN0aW9uIiwNCiAg +ICAiQHNvdXJjZSI6ICJURUUsNTIuMC4wLDIwMTgxMjAzLjExLDIwMTgxMjAzLjExO2VuLVVTLkZv +bGxvd1VwRm9yUmVxdWVzdFJSLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMSIsDQogICAg +IkBlbnRpdHlFeHRyYWN0aW9uVHJ1c3RMZXZlbCI6ICJVbmtub3duIiwNCiAgICAiQHNvdXJjZUNv +bmZpZGVuY2VTY29yZSI6ICIwLjUxMTM2MTY1ODg2NjIiLA0KICAgICJkZXNjcmlwdGlvbiI6ICJX +aGF0IGEgQ2hyaXN0bWFzIHRvIHJlbWVtYmVyIiwNCiAgICAiZGVzY3JpcHRpb24vc2NoZWR1bGVB +Y3Rpb25UeXBlIjogIkZvbGxvd1VwIiwNCiAgICAiQGFic29sdXRlT2Zmc2V0UGxhaW5UZXh0Ijog +IjcxOSIsDQogICAgIkBzcGFuIjogIjQiLA0KICAgICJARW50aXR5SWQiOiAiYWJhNmI4ZTYtZjFh +YS00MWM1LThmMTItNjI3YWU2NDljMTQyIiwNCiAgICAiQGNvcnJlbGF0aW9uVHJhaWwiOiAiQXNz +ZXRJZD1iNTBmOWQ2Ny03MDVhLTRiYzctOWJjZC02MmZiY2M4NjA0YTE7RXh0cmFjdGlvbklkPWM2 +MjYyNmI0LWQyMDgtNGNjYS1hZGY1LTAyODgxZTNhM2UxNDtFbnRpdHlJZD1hYmE2YjhlNi1mMWFh +LTQxYzUtOGYxMi02MjdhZTY0OWMxNDIiLA0KICAgICJAZXh0cmFjdGlvblRpbWVVdGMiOiAiMjAx +OC0xMi0xNVQxNTowNzoxOS43OTI1NzY2WiINCiAgfSwNCiAgew0KICAgICJAY29udGV4dCI6ICJo +dHRwOi8vc2NoZW1hLm9yZyIsDQogICAgIkBvdXRwdXRWZXJzaW9uIjogIjEuMCIsDQogICAgIkBz +Y2hlbWFPcmdWZXJzaW9uIjogIjIuMSIsDQogICAgIkB0eXBlIjogIlNjaGVkdWxlQWN0aW9uIiwN +CiAgICAiQHNvdXJjZSI6ICJURUUsNTIuMC4wLDIwMTgxMjAzLjExLDIwMTgxMjAzLjExO2VuLVVT +LkZvbGxvd1VwRm9yUmVxdWVzdFJSLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMSIsDQog +ICAgIkBlbnRpdHlFeHRyYWN0aW9uVHJ1c3RMZXZlbCI6ICJVbmtub3duIiwNCiAgICAiQHNvdXJj +ZUNvbmZpZGVuY2VTY29yZSI6ICIwLjYzMDMzMjAzMjgxMzgiLA0KICAgICJkZXNjcmlwdGlvbiI6 +ICInTmVhdGggdGhlIG1pc3RsZXRvZSB5b3Uga2lzc2VkIG1lIHdhcm0gYW5kIHRlbmRlciIsDQog +ICAgImRlc2NyaXB0aW9uL3NjaGVkdWxlQWN0aW9uVHlwZSI6ICJGb2xsb3dVcCIsDQogICAgIkBh +YnNvbHV0ZU9mZnNldFBsYWluVGV4dCI6ICIxMDQxIiwNCiAgICAiQHNwYW4iOiAiMSIsDQogICAg +IkBFbnRpdHlJZCI6ICIzNzkwMDhjYS0xMGE1LTRhMjUtOTgyMS1kNjU0Y2JiOTE5MGYiLA0KICAg +ICJAY29ycmVsYXRpb25UcmFpbCI6ICJBc3NldElkPWI1MGY5ZDY3LTcwNWEtNGJjNy05YmNkLTYy +ZmJjYzg2MDRhMTtFeHRyYWN0aW9uSWQ9YzYyNjI2YjQtZDIwOC00Y2NhLWFkZjUtMDI4ODFlM2Ez +ZTE0O0VudGl0eUlkPTM3OTAwOGNhLTEwYTUtNGEyNS05ODIxLWQ2NTRjYmI5MTkwZiIsDQogICAg +IkBleHRyYWN0aW9uVGltZVV0YyI6ICIyMDE4LTEyLTE1VDE1OjA3OjE5Ljc5MjU3NjZaIg0KICB9 +LA0KICB7DQogICAgIkBjb250ZXh0IjogImh0dHA6Ly9zY2hlbWEub3JnIiwNCiAgICAiQG91dHB1 +dFZlcnNpb24iOiAiMS4wIiwNCiAgICAiQHNjaGVtYU9yZ1ZlcnNpb24iOiAiMi4xIiwNCiAgICAi +QHR5cGUiOiAiU2NoZWR1bGVBY3Rpb24iLA0KICAgICJAc291cmNlIjogIlRFRSw1Mi4wLjAsMjAx +ODEyMDMuMTEsMjAxODEyMDMuMTE7ZW4tVVMuRm9sbG93VXBGb3JSZXF1ZXN0UlIsNTIuMC4wLDIw +MTgxMjAzLjExLDIwMTgxMjAzLjExIiwNCiAgICAiQGVudGl0eUV4dHJhY3Rpb25UcnVzdExldmVs +IjogIlVua25vd24iLA0KICAgICJAc291cmNlQ29uZmlkZW5jZVNjb3JlIjogIjAuNTExMzYxNjU4 +ODY2MiIsDQogICAgImRlc2NyaXB0aW9uIjogIldoYXQgYSBDaHJpc3RtYXMgdG8gcmVtZW1iZXIi +LA0KICAgICJkZXNjcmlwdGlvbi9zY2hlZHVsZUFjdGlvblR5cGUiOiAiRm9sbG93VXAiLA0KICAg +ICJAYWJzb2x1dGVPZmZzZXRQbGFpblRleHQiOiAiMTA5NiIsDQogICAgIkBzcGFuIjogIjQiLA0K +ICAgICJARW50aXR5SWQiOiAiNGM3N2FkM2EtODg2ZC00OTRlLTk4MjAtMDk2N2YwMjRjNDUwIiwN +CiAgICAiQGNvcnJlbGF0aW9uVHJhaWwiOiAiQXNzZXRJZD1iNTBmOWQ2Ny03MDVhLTRiYzctOWJj +ZC02MmZiY2M4NjA0YTE7RXh0cmFjdGlvbklkPWM2MjYyNmI0LWQyMDgtNGNjYS1hZGY1LTAyODgx +ZTNhM2UxNDtFbnRpdHlJZD00Yzc3YWQzYS04ODZkLTQ5NGUtOTgyMC0wOTY3ZjAyNGM0NTAiLA0K +ICAgICJAZXh0cmFjdGlvblRpbWVVdGMiOiAiMjAxOC0xMi0xNVQxNTowNzoxOS43OTI1NzY2WiIN +CiAgfSwNCiAgew0KICAgICJAY29udGV4dCI6ICJodHRwOi8vc2NoZW1hLm9yZyIsDQogICAgIkBv +dXRwdXRWZXJzaW9uIjogIjEuMCIsDQogICAgIkBzY2hlbWFPcmdWZXJzaW9uIjogIjIuMSIsDQog +ICAgIkB0eXBlIjogIlNjaGVkdWxlQWN0aW9uIiwNCiAgICAiQHNvdXJjZSI6ICJURUUsNTIuMC4w +LDIwMTgxMjAzLjExLDIwMTgxMjAzLjExO2VuLVVTLkZvbGxvd1VwRm9yUmVxdWVzdFJSLDUyLjAu +MCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMSIsDQogICAgIkBlbnRpdHlFeHRyYWN0aW9uVHJ1c3RM +ZXZlbCI6ICJVbmtub3duIiwNCiAgICAiQHNvdXJjZUNvbmZpZGVuY2VTY29yZSI6ICIwLjk2MDIz +MTYzMTM3ODciLA0KICAgICJkZXNjcmlwdGlvbiI6ICJDYW4gd2UgZG8gdGhpcyBuZXh0IHdpbnRl +ciIsDQogICAgImRlc2NyaXB0aW9uL3NjaGVkdWxlQWN0aW9uVHlwZSI6ICJGb2xsb3dVcCIsDQog +ICAgIkBhYnNvbHV0ZU9mZnNldFBsYWluVGV4dCI6ICIxMzgwIiwNCiAgICAiQHNwYW4iOiAiMyIs +DQogICAgIkBFbnRpdHlJZCI6ICIxZWJkMzRiOS04OThmLTRmZmQtOTAwYS1jNDM3ZjFiMDI2NDQi +LA0KICAgICJAY29ycmVsYXRpb25UcmFpbCI6ICJBc3NldElkPWI1MGY5ZDY3LTcwNWEtNGJjNy05 +YmNkLTYyZmJjYzg2MDRhMTtFeHRyYWN0aW9uSWQ9YzYyNjI2YjQtZDIwOC00Y2NhLWFkZjUtMDI4 +ODFlM2EzZTE0O0VudGl0eUlkPTFlYmQzNGI5LTg5OGYtNGZmZC05MDBhLWM0MzdmMWIwMjY0NCIs +DQogICAgIkBleHRyYWN0aW9uVGltZVV0YyI6ICIyMDE4LTEyLTE1VDE1OjA3OjE5Ljc5MjU3NjZa +Ig0KICB9LA0KICB7DQogICAgIkBjb250ZXh0IjogImh0dHA6Ly9zY2hlbWEub3JnIiwNCiAgICAi +QG91dHB1dFZlcnNpb24iOiAiMS4wIiwNCiAgICAiQHNjaGVtYU9yZ1ZlcnNpb24iOiAiMi4xIiwN +CiAgICAiQHR5cGUiOiAiU2NoZWR1bGVBY3Rpb24iLA0KICAgICJAc291cmNlIjogIlRFRSw1Mi4w +LjAsMjAxODEyMDMuMTEsMjAxODEyMDMuMTE7ZW4tVVMuRm9sbG93VXBGb3JSZXF1ZXN0UlIsNTIu +MC4wLDIwMTgxMjAzLjExLDIwMTgxMjAzLjExIiwNCiAgICAiQGVudGl0eUV4dHJhY3Rpb25UcnVz +dExldmVsIjogIlVua25vd24iLA0KICAgICJAc291cmNlQ29uZmlkZW5jZVNjb3JlIjogIjAuNTEx +MzYxNjU4ODY2MiIsDQogICAgImRlc2NyaXB0aW9uIjogIldoYXQgYSBDaHJpc3RtYXMgdG8gcmVt +ZW1iZXIiLA0KICAgICJkZXNjcmlwdGlvbi9zY2hlZHVsZUFjdGlvblR5cGUiOiAiRm9sbG93VXAi +LA0KICAgICJAYWJzb2x1dGVPZmZzZXRQbGFpblRleHQiOiAiMTQxMSIsDQogICAgIkBzcGFuIjog +IjQiLA0KICAgICJARW50aXR5SWQiOiAiYTg5MzY1NmYtY2RlZC00ZGE5LTkyNzAtNGFiMjQ4YTc1 +NGJkIiwNCiAgICAiQGNvcnJlbGF0aW9uVHJhaWwiOiAiQXNzZXRJZD1iNTBmOWQ2Ny03MDVhLTRi +YzctOWJjZC02MmZiY2M4NjA0YTE7RXh0cmFjdGlvbklkPWM2MjYyNmI0LWQyMDgtNGNjYS1hZGY1 +LTAyODgxZTNhM2UxNDtFbnRpdHlJZD1hODkzNjU2Zi1jZGVkLTRkYTktOTI3MC00YWIyNDhhNzU0 +YmQiLA0KICAgICJAZXh0cmFjdGlvblRpbWVVdGMiOiAiMjAxOC0xMi0xNVQxNTowNzoxOS43OTI1 +NzY2WiINCiAgfSwNCiAgew0KICAgICJAY29udGV4dCI6ICJodHRwOi8vc2NoZW1hLm9yZyIsDQog +ICAgIkBvdXRwdXRWZXJzaW9uIjogIjEuMCIsDQogICAgIkBzY2hlbWFPcmdWZXJzaW9uIjogIjIu +MSIsDQogICAgIkB0eXBlIjogIlNjaGVkdWxlQWN0aW9uIiwNCiAgICAiQHNvdXJjZSI6ICJURUUs +NTIuMC4wLDIwMTgxMjAzLjExLDIwMTgxMjAzLjExO2VuLVVTLkZvbGxvd1VwRm9yUmVxdWVzdFJS +LDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMSIsDQogICAgIkBlbnRpdHlFeHRyYWN0aW9u +VHJ1c3RMZXZlbCI6ICJVbmtub3duIiwNCiAgICAiQHNvdXJjZUNvbmZpZGVuY2VTY29yZSI6ICIw +LjUxMTM2MTY1ODg2NjIiLA0KICAgICJkZXNjcmlwdGlvbiI6ICJXaGF0IGEgQ2hyaXN0bWFzIHRv +IHJlbWVtYmVyIiwNCiAgICAiZGVzY3JpcHRpb24vc2NoZWR1bGVBY3Rpb25UeXBlIjogIkZvbGxv +d1VwIiwNCiAgICAiQGFic29sdXRlT2Zmc2V0UGxhaW5UZXh0IjogIjE1ODkiLA0KICAgICJAc3Bh +biI6ICI0IiwNCiAgICAiQEVudGl0eUlkIjogIjM2NmQxMmQ0LTI0MjAtNDY3YS05MGNjLTk0ODE3 +YjhkMjQxMSIsDQogICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1 +YS00YmM3LTliY2QtNjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2Et +YWRmNS0wMjg4MWUzYTNlMTQ7RW50aXR5SWQ9MzY2ZDEyZDQtMjQyMC00NjdhLTkwY2MtOTQ4MTdi +OGQyNDExIiwNCiAgICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTku +NzkyNTc2NloiDQogIH0sDQogIHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmci +LA0KICAgICJAb3V0cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6 +ICIyLjEiLA0KICAgICJAdHlwZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAi +VEVFLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Gb2xsb3dVcEZvclJlcXVl +c3RSUiw1Mi4wLjAsMjAxODEyMDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFj +dGlvblRydXN0TGV2ZWwiOiAiVW5rbm93biIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUi +OiAiMC41MTEzNjE2NTg4NjYyIiwNCiAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCBhIENocmlzdG1h +cyB0byByZW1lbWJlciIsDQogICAgImRlc2NyaXB0aW9uL3NjaGVkdWxlQWN0aW9uVHlwZSI6ICJG +b2xsb3dVcCIsDQogICAgIkBhYnNvbHV0ZU9mZnNldFBsYWluVGV4dCI6ICIxNzcyIiwNCiAgICAi +QHNwYW4iOiAiNCIsDQogICAgIkBFbnRpdHlJZCI6ICJiMmNmN2Y1NS0wY2ZjLTQyMjYtYjhiMC04 +YWI2MWJiYmQyZDkiLA0KICAgICJAY29ycmVsYXRpb25UcmFpbCI6ICJBc3NldElkPWI1MGY5ZDY3 +LTcwNWEtNGJjNy05YmNkLTYyZmJjYzg2MDRhMTtFeHRyYWN0aW9uSWQ9YzYyNjI2YjQtZDIwOC00 +Y2NhLWFkZjUtMDI4ODFlM2EzZTE0O0VudGl0eUlkPWIyY2Y3ZjU1LTBjZmMtNDIyNi1iOGIwLThh +YjYxYmJiZDJkOSIsDQogICAgIkBleHRyYWN0aW9uVGltZVV0YyI6ICIyMDE4LTEyLTE1VDE1OjA3 +OjE5Ljc5MjU3NjZaIg0KICB9DQpdDQp9XQAAHhA1gQggBgAAAAAAwAAAAAAAAEYBAAAAGAAAAEUA +bgB0AGkAdAB5AE4AYQBtAGUAcwAAAAgAAAAQAAAARXh0cmFjdExhbmd1YWdlAA8AAABTY2hlZHVs +ZUFjdGlvbgAAFAAAAEtleVBocmFzZUV4dHJhY3Rpb24AHQAAAEZvbGxvd1VwU2NoZWR1bGVSZXBs +eVJlcXVlc3QAAAAAEwAAAEV4dHJhY3RMYW5ndWFnZTEuMAAAEgAAAFNjaGVkdWxlQWN0aW9uMS4w +AAAAFwAAAEtleVBocmFzZUV4dHJhY3Rpb24yLjAAACAAAABGb2xsb3dVcFNjaGVkdWxlUmVwbHlS +ZXF1ZXN0MS4wAB4AQ4G4WoAxkj7cEYecAAYbAxAEAQAAACIAAABHAHAAZwBPAEwAIABTAGkAZwAg +AFMAdABhAHQAdQBzAAAAAAABAAAAAgAAACMAAAAeAEWBhgMCAAAAAADAAAAAAAAARgEAAABmAAAA +eAAtAG0AcwAtAGUAeABjAGgAYQBuAGcAZQAtAG8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAC0AbwBy +AGkAZwBpAG4AYQBsAGMAbABpAGUAbgB0AGkAcABhAGQAZAByAGUAcwBzAAAAAAABAAAADgAAADc2 +LjEyNC4xOTMuMzUAAAAeAEaBhgMCAAAAAADAAAAAAAAARgEAAABmAAAAeAAtAG0AcwAtAGUAeABj +AGgAYQBuAGcAZQAtAG8AcgBnAGEAbgBpAHoAYQB0AGkAbwBuAC0AbwByAGkAZwBpAG4AYQBsAHMA +ZQByAHYAZQByAGkAcABhAGQAZAByAGUAcwBzAAAAAAABAAAAEwAAADI2MDM6MTBiNjozOmEzOjox +MAAAHgBPgROP8kH0gxRBpYTu21prC/8BAAAAFgAAAEMAbABpAGUAbgB0AEkAbgBmAG8AAAAAAAEA +AAAVAAAAQ2xpZW50PU1TRXhjaGFuZ2VSUEMAAAAAHgBZgYYDAgAAAAAAwAAAAAAAAEYBAAAAGAAA +AG0AcwBpAHAAXwBsAGEAYgBlAGwAcwAAAAEAAABFAgAATVNJUF9MYWJlbF9mNDJhYTM0Mi04NzA2 +LTQyODgtYmQxMS1lYmI4NTk5NTAyOGNfRW5hYmxlZD1UcnVlOyBNU0lQX0xhYmVsX2Y0MmFhMzQy +LTg3MDYtNDI4OC1iZDExLWViYjg1OTk1MDI4Y19TaXRlSWQ9NzJmOTg4YmYtODZmMS00MWFmLTkx +YWItMmQ3Y2QwMTFkYjQ3OyBNU0lQX0xhYmVsX2Y0MmFhMzQyLTg3MDYtNDI4OC1iZDExLWViYjg1 +OTk1MDI4Y19Pd25lcj1qZXN0ZWRmYUBtaWNyb3NvZnQuY29tOyBNU0lQX0xhYmVsX2Y0MmFhMzQy +LTg3MDYtNDI4OC1iZDExLWViYjg1OTk1MDI4Y19TZXREYXRlPTIwMTgtMTItMTVUMTU6MDc6MDYu +ODIyMTM3MFo7IE1TSVBfTGFiZWxfZjQyYWEzNDItODcwNi00Mjg4LWJkMTEtZWJiODU5OTUwMjhj +X05hbWU9R2VuZXJhbDsgTVNJUF9MYWJlbF9mNDJhYTM0Mi04NzA2LTQyODgtYmQxMS1lYmI4NTk5 +NTAyOGNfQXBwbGljYXRpb249TWljcm9zb2Z0IEF6dXJlIEluZm9ybWF0aW9uIFByb3RlY3Rpb247 +IE1TSVBfTGFiZWxfZjQyYWEzNDItODcwNi00Mjg4LWJkMTEtZWJiODU5OTUwMjhjX0V4dGVuZGVk +X01TRlRfTWV0aG9kPUF1dG9tYXRpYzsgU2Vuc2l0aXZpdHk9R2VuZXJhbAAAAAAeAHuBhgMCAAAA +AADAAAAAAAAARgEAAABkAAAAeAAtAG0AcwAtAGUAeABjAGgAYQBuAGcAZQAtAG8AcgBnAGEAbgBp +AHoAYQB0AGkAbwBuAC0AcwB1AGIAbQBpAHMAcwBpAG8AbgBxAHUAbwB0AGEAcwBrAGkAcABwAGUA +ZAAAAAEAAAAGAAAARmFsc2UAAAAeAHyBCCAGAAAAAADAAAAAAAAARgEAAABGAAAARQBuAHQAaQB0 +AHkARQB4AHQAcgBhAGMAdABpAG8AbgAvAFMAYwBoAGUAZAB1AGwAZQBBAGMAdABpAG8AbgAxAC4A +MAAAAAAAAQAAAM0DAABbDQogIHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmci +LA0KICAgICJAb3V0cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6 +ICIyLjEiLA0KICAgICJAdHlwZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAi +VEVFLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Db21taXRtZW50VEZMVSw1 +Mi4wLjAsMjAxODEyMDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFjdGlvblRy +dXN0TGV2ZWwiOiAiVHJ1c3RlZCIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUiOiAiMC45 +ODg3IiwNCiAgICAiZGVzY3JpcHRpb24iOiAiQ2hhbmdlIHRoZSByYWRpbyBhbmQgSSdsbCB0dXJu +IHRoZSBsaWdodHMgZG93biBkaW1tZXIiLA0KICAgICJkZXNjcmlwdGlvbi9zY2hlZHVsZUFjdGlv +blR5cGUiOiAiQ29tbWl0bWVudCIsDQogICAgInNjaGVkdWxlZFRpbWUiOiAiIiwNCiAgICAic2No +ZWR1bGVkVGltZS90aW1lem9uZSI6ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLA0KICAgICJzY2hl +ZHVsZWRUaW1lL3JlbGF0aXZlIjogIiIsDQogICAgInNjaGVkdWxlZFRpbWUvaW1wcmVjaXNlRmxh +ZyI6ICIiLA0KICAgICJAYWJzb2x1dGVPZmZzZXRQbGFpblRleHQiOiAiMCIsDQogICAgIkBzcGFu +IjogIjUzIiwNCiAgICAiQEVudGl0eUlkIjogIjYzOTljMDFiLWUzZjQtNGY4Ni1iYTMwLWY0OTA1 +NDFhZjE4YyIsDQogICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1 +YS00YmM3LTliY2QtNjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2Et +YWRmNS0wMjg4MWUzYTNlMTQ7RW50aXR5SWQ9NjM5OWMwMWItZTNmNC00Zjg2LWJhMzAtZjQ5MDU0 +MWFmMThjIiwNCiAgICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTku +NzkyNTc2NloiDQogIH0NCl0AAAAAHgB9gQggBgAAAAAAwAAAAAAAAEYBAAAASAAAAEUAbgB0AGkA +dAB5AEUAeAB0AHIAYQBjAHQAaQBvAG4ALwBFAHgAdAByAGEAYwB0AEwAYQBuAGcAdQBhAGcAZQAx +AC4AMAAAAAEAAABwAgAAWw0KICB7DQogICAgIkB0eXBlIjogIkV4dHJhY3RMYW5ndWFnZSIsDQog +ICAgIkBjb250ZXh0IjogImh0dHA6Ly9zY2hlbWEubWljcm9zb2Z0LmNvbSIsDQogICAgIkBvdXRw +dXRWZXJzaW9uIjogIjEuMCIsDQogICAgIkxhbmd1YWdlIjogew0KICAgICAgIkB0eXBlIjogIkxh +bmd1YWdlIiwNCiAgICAgICJMb2NhbGUiOiAiZW4tVVMiLA0KICAgICAgIm5hbWUiOiAiRW5nbGlz +aCAoVW5pdGVkIFN0YXRlcykiDQogICAgfSwNCiAgICAiQHNvdXJjZSI6ICJFeGNoYW5nZSIsDQog +ICAgIkxhbmd1YWdlU2NvcmVzIjogew0KICAgICAgIkVuZ2xpc2giOiA5OS4xMzU0NDQ2DQogICAg +fSwNCiAgICAiQEVudGl0eUlkIjogImVmMmFlMWZlLTM1NGUtNDAxMy1iMTJjLWE1YTdkMDBiNzBm +YyIsDQogICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1YS00YmM3 +LTliY2QtNjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2EtYWRmNS0w +Mjg4MWUzYTNlMTQ7RW50aXR5SWQ9ZWYyYWUxZmUtMzU0ZS00MDEzLWIxMmMtYTVhN2QwMGI3MGZj +IiwNCiAgICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTkuNzkyNTc2 +NloiDQogIH0NCl0AHgB+gQggBgAAAAAAwAAAAAAAAEYBAAAAUAAAAEUAbgB0AGkAdAB5AEUAeAB0 +AHIAYQBjAHQAaQBvAG4ALwBLAGUAeQBQAGgAcgBhAHMAZQBFAHgAdAByAGEAYwB0AGkAbwBuADIA +LgAwAAAAAQAAAPIaAABbDQogIHsNCiAgICAiQG91dHB1dFZlcnNpb24iOiAiMi4wIiwNCiAgICAi +QGZvcm1hdHRlciI6ICJUZWVLcGVCb25kQ2JwQmFzZTY0IiwNCiAgICAiQHNjaGVtYSI6ICJNaWNy +b3NvZnQuRXhjaGFuZ2UuUmVsZXZhbmNlLlRlZUtwZUJvbmRSZXNwb25zZS5UZWVLcGUuVGVlS3Bl +UmVzcG9uc2UiLA0KICAgICJrZXlQaHJhc2VzIjogIlEwSUJBTTBVRWdvYkNYSUFhUUJqQUdnQUlB +QjBBR1VBZUFCMEFNY0tVZFJnUU0wVUVBY0VBZ0FBQUVBTUFBQ0FQeEFBQUlBL0RnQUFBRUFBQ1dN +QWFBQnlBR2tBY3dCMEFHMEFZUUJ6QU1jS0lLZ1R2ODBVRUFjYU1nQUFKRUlDQUFDQVB4SUFBR0JC +RnFsQkpUMFVBSUN0UXhnQUFJQS9HZ0FBb0VBY3FCUnNQQjRseVRKRElFbm1BejhpQUFBQVFDUlQz +Ync3SnRzMkowTW9zN24yUGpRQUFHQkJOa3ZVcmo0ODI3YWhRVDZiYnZ3K1JDVkpua0ZHaFJUM1Bp +d2xTWUpBTGdBQUFFQXd0MjBiUUVxU0pHbEFUQUFBQUVCT3QyMGJRQUFTY3dCd0FISUFhUUJ1QUdj +QWRBQnBBRzBBWlFBZ0FHWUFaUUJsQUd3QWFRQnVBR2NBeHdxSXRncEF6UlFRQnh3eUFBQWtRZ0lB +QUFCQUVnQUFvRUFXcUJUc1BCUUFnSzFER0FBQUFEOGFBQUFBUVJ4VDNidzhIczNNT0VNZ0xGWUlQ +eUlBQU1CQkpQK2xqVDBtTXpNZ1F5ZzBZT3crTkFBQW9FQTJrTUg1UFRnQUFJQS9PZ3pPeHp3OE16 +T3JRVDZZbmdVL1FBQUFBRUJDRE01SFBVVE56SlJCUnU5RjZENHVBQURBUURBQUFNQkFUQUFBd0VC +T0FBREFRQUFKY3dCMEFISUFZUUJ1QUdjQVpRQnlBSE1BeHdxcjI3MUF6UlFRQnh3eUFBQWtRZ0lB +QUlBL0VnQUFBRUFXVTkyOE94UUFnSzFER0FBQWdEOGFBQUNBUVJ4VDNUdzlIZ0FBbjBJZzdwcHFQ +aUlBQUV0REpJSERGVDhtQUVDRlF5aG5uRVEvTkFBQUFFQTJETTVIUFRnQUFBQkFPZ3pPUnowOEFB +QVFRVDdPeDJBK1FBQUF3RUZDaWRvVlAwUUFBUGhCUnB5UFFUOHVBQUNBUURBQUFMQkFUQUFBZ0VC +T0FBQ3dRQUFGWVFCekFIQUFaUUJ1QU1jS0xrQnB3TTBVRUFjZ01nQUFKRUlDQUFDQVB4SUFBSUEv +RmxQZFBEc1VBSUN0UXhnQUFJQS9HZ0FBOEVFY2ZnK3hQUjRBQVBCQklINFBzVDBpQUFDZVF5UXpJ +V2svSmdBQW5rTW9NeUZwUHpRQUFJQS9OZ3pPeHp3NEFBQ0FRRG9NenNjOVBBQUFnRUErRE03SFBV +QUFBQkJDUXM3SFlEOUVBQUFRUWtiT3gyQS9LZ0FBUUVBc0FBQkFRQzRBQUtCQU1BQUFvRUJJQUFC +QVFFb0FBRUJBVEFBQW9FQk9BQUNnUUFBRWN3QnVBRzhBZHdESENtSHdiOERORkJBSEd6SUFBQ1JD +QWdBQWdEOFNBQUFBUUJaVDNidzdGQUNBclVNYUFBQXdRaHdwMkFFK0hnQUFGa01nWGxQZFBpSUFB +TFJDSkovTGhENG1BQUJFUXloMG1SQS9OQUFBQUVBMkRNNUhQVGdBQUtCQU9wREIrVDA4QUFDSVFU +N3RTdFErUUFBQU1FRkNxVjJKUGtRQUFMaEJSaG1jRHo4cUFBREFRQ3dBQU9CQVNBQUF3RUJLQUFE +Z1FBQUtad0JoQUhRQWJBQnBBRzRBWWdCMUFISUFad0RIQ3NaNWE4RE5GQkFISURJQUFDUkNBZ0FB +Z0Q4U0FBQ0FQeFpUM1R3N0ZBQ0FyVU1ZQUFDQVB4b0FBRWhDSE9tTUV6NGVBQUJJUWlEcGpCTStJ +Z0FBbEVNazZGOWFQeVlBQUpSREtPaGZXajgwQUFDQVB6WU16c2M4T0FBQXdFQTZpZG9WUGp3QUFN +QkFQb25hRlQ1QUFBQUlRa0x0U2xRL1JBQUFDRUpHN1VwVVB5b0FBS0JBTEFBQW9FQXVBQURBUURB +QUFNQkFTQUFBb0VCS0FBQ2dRRXdBQU1CQVRnQUF3RUFBQm5NQWJBQnZBSEFBWlFCekFNY0tRUGxQ +d00wVUVBY2JNZ0FBSkVJQ0FBQ0FQeElBQUFCQUZsUGR2RHNVQUlDdFF4b0FBSWhDSENtclNENGVB +SUFYUXlEMmlkOCtJZ0FBM2tJazdzZWpQaVlBZ0VKREtDaCtEejgwQUFBQVFEWU16a2M5T0FBQTRF +QTZTOVF1UGp3QUFJUkJQbjBNemo1QUFBQmdRVUpMMUs0K1JBQUF2RUZHVWJzU1B5b0FBTUJBTEFB +QUNFRklBQURBUUVvQUFBaEJBQWxtQUdrQWNnQmxBSEFBYkFCaEFHTUFaUURIQ3ZIWGpNRE5GQkFI +SHpJQUFDUkNBZ0FBZ0Q4U0FBQ0FQeFpUM1R3N0ZBQ0FyVU1hQUFDa1FoeVQrM0UrSGdBQXBFSWdr +L3R4UGlJQUFJUkRKRDdFUWo4bUFBQ0VReWcreEVJL05BQUFnRDgyRE03SFBEZ0FBQkJCT3M3SFlE +NDhBQUFRUVQ3T3gyQStRQUFBK0VGQ25JOUJQMFFBQVBoQlJweVBRVDhxQUFDQVFDd0FBSUJBTGdB +QW9FQXdBQUNnUUVnQUFJQkFTZ0FBZ0VCTUFBQ2dRRTRBQUtCQUFCQjBBR0VBYUFCdkFHVUFJQUJ6 +QUdzQWFRQWdBR01BYUFCaEFHd0FaUUIwQU1jSzdXcVZ3TTBVRUFjY01nQUFKRUlDQUFCQVFCSUFB +SUEvRnYrbERUd1VBSUN0UXhpcnFxbytHZ0FBcWtJYzg5VjZQaDRBQUtwQ0lQUFZlajRpQUlDQlF5 +VHJFejgvSmdDQWdVTW82eE0vUHpRQUFJQS9OZ3pPeHp3NEFBQVFRVHJPeDJBK1BBQUFFRUUrenNk +Z1BrQUFBUGhCUXB5UFFUOUVBQUQ0UVVhY2owRS9LZ0FBNEVBc0FBRGdRRWdBQU9CQVNnQUE0RUFB +RW1ZQVlRQnpBSFFBSUFCMEFHRUFiQUJyQUdrQWJnQm5BQ0FBYkFCdkFIWUFaUUJ5QU1jS0hUR1h3 +TTBVRUFjZk1nQUFKRUlDQUFCQVFCSUFBSUEvRnYrbERUd1VBSUN0UXhvQUFMUkNISi9MaEQ0ZUFB +QzBRaUNmeTRRK0lnQUFma01rbVdNN1B5WUFBSDVES0psak96ODBBQUNBUHpZTXpzYzhPQUFBSUVF +NmtNRjVQandBQUNCQlBwREJlVDVBQUFEd1FVSXNVVHMvUkFBQThFRkdMRkU3UHlvQUFBQkFMQUFB +QUVBdUFBQ2dRREFBQUtCQVNBQUFBRUJLQUFBQVFFd0FBS0JBVGdBQW9FQUFFWE1BYkFCdkFIY0FJ +QUJpQUhVQWNnQnVBR2tBYmdCbkFDQUFkd0J2QUc4QVpBREhDdTFxbGNETkZCQUhHeklBQUNSQ0Fn +QUFRRUFTQUFDQVB4Yi9wUTA4RkFDQXJVTWFBQUMrUWh4RUxJdytIZ0FBdmtJZ1JDeU1QaUlBQUhs +REpFYXpOejhtQUFCNVF5aEdzemMvTkFBQWdEODJETTdIUERnQUFDQkJPcERCZVQ0OEFBQWdRVDZR +d1hrK1FBQUE4RUZDTEZFN1AwUUFBUEJCUml4Uk96OHFBQURnUUN3QUFPQkFTQUFBNEVCS0FBRGdR +QUFPZHdCcEFHd0FaQUJsQUhNQWRBQWdBR1FBY2dCbEFHRUFiUUJ6QU1jS3IyQ0t3TTBVRUFjZk1n +QUFKRUlDQUFBQVFCSUFBSUEvRmxQZHZEc1VBSUN0UXhvQUFNeENIRjZBbGo0ZUFBRE1RaUJlZ0pZ +K0lnQUFjME1rRmtZelB5WUFBSE5ES0JaR016ODBBQUNBUHpZTXpzYzhPQUFBTUVFNnFWMkpQandB +QURCQlBxbGRpVDVBQUFEb1FVSzdFalUvUkFBQTZFRkd1eEkxUHlvQUFJQkFMQUFBZ0VBdUFBREFR +REFBQU1CQVNBQUFnRUJLQUFDQVFFd0FBTUJBVGdBQXdFQUFCWElBWVFCa0FHa0Fid0RIQ3BVL2o4 +RE5GQkFISHpJQUFDUkNBZ0FBZ0Q4U0FBQ0FQeFpUM1R3N0ZBQ0FyVU1hQUFBQVF4eFQzYncrSGdB +QUFFTWdVOTI4UGlJQUFGcERKSG5VSUQ4bUFBQmFReWg1MUNBL05BQUFnRDgyRE03SFBEZ0FBR0JC +T2t2VXJqNDhBQUJnUVQ1TDFLNCtRQUFBMEVGQ2FsY2lQMFFBQU5CQlJtcFhJajhxQUFBQVFDd0FB +QUJBTGdBQUFFRXdBQUFBUVVnQUFBQkFTZ0FBQUVCTUFBQUFRVTRBQUFCQkFBWnNBR2tBWndCb0FI +UUFjd0RIQ3RwbGc4RE5GQkFISHpJQUFDUkNBZ0FBZ0Q4U0FBQ0FQeFpUM1R3N0ZBQ0FyVU1hQUFB +R1F4eXp0OFUrSGdBQUJrTWdzN2ZGUGlJQUFGUkRKRWxuSEQ4bUFBQlVReWhKWnh3L05BQUFnRDgy +RE03SFBEZ0FBR0JCT2t2VXJqNDhBQUJnUVQ1TDFLNCtRQUFBMEVGQ2FsY2lQMFFBQU5CQlJtcFhJ +ajhxQUFBQVFTd0FBQUJCTGdBQUFFQXdBQUFBUUVnQUFBQkJTZ0FBQUVGTUFBQUFRRTRBQUFCQUFB +WnNBRzhBZGdCbEFISUFjd0RIQ2ljaWFzRE5GQkFISHpJQUFDUkNBZ0FBZ0Q4U0FBQ0FQeFpUM1R3 +N0ZBQ0FyVU1hQUFBVFF4d3U1dGcrSGdBQUUwTWdMdWJZUGlJQUFFZERKQXpRRWo4bUFBQkhReWdN +MEJJL05BQUFnRDgyRE03SFBEZ0FBSUJCT2d6T3h6NDhBQUNBUVQ0TXpzYytRQUFBd0VGQ2lkb1ZQ +MFFBQU1CQlJvbmFGVDhxQUFDQVFDd0FBSUJBTGdBQVFFQXdBQUJBUUVnQUFJQkFTZ0FBZ0VCTUFB +QkFRRTRBQUVCQUFBWmlBR3dBYndCM0FHa0FiZ0RIQ3I0djNNRE5GQkFISERJQUFDUkNBZ0FBZ0Q4 +U0FBQ0FQeFpUM1R3N0ZBQ0FyVU1ZQUFDQVB4b0FBQ3RESEsxUC9ENGVBQUFyUXlDdFQvdytJZ0FB +TDBNa1RCc0JQeVlBQUM5REtFd2JBVDgwQUFDQVB6WU16c2M4T0FBQW1FRTZyMFR0UGp3QUFKaEJQ +cTlFN1Q1QUFBQ29RVUk0SHdNL1JBQUFxRUZHT0I4RFB5NEFBQ0JCTUFBQUlFRk1BQUFnUVU0QUFD +QkJBQlIzQUdrQWJBQmtBQ0FBY2dCbEFITUFkQUJzQUdVQWN3QnpBQ0FBZHdCcEFHNEFkQUJsQUhJ +QXh3cGRNZ0xCelJRUUJ4OHlBQUFrUWdJQUFFQkFFZ0FBZ0Q4Vy82VU5QQlFBZ0sxREdnQUFNVU1j +QjVVQ1B4NEFBREZESUFlVkFqOGlBQUFuUXlURGFQWStKZ0FBSjBNb3cyajJQalFBQUlBL05nek94 +enc0QUFDWVFUcXZSTzArUEFBQW1FRStyMFR0UGtBQUFLaEJRamdmQXo5RUFBQ29RVVk0SHdNL0tn +QUF3RUFzQUFEQVFDNEFBQUJBTUFBQUFFQklBQURBUUVvQUFNQkFUQUFBQUVCT0FBQUFRQUFGYmdC +bEFHRUFkQUJvQU1jSzh1L253TTBVRUFjY01nQUFKRUlDQUFDQVB4SUFBSUEvRmxQZFBEc1VBSUN0 +UXhnQUFJQS9HZ0FBUjBNY0ROQVNQeDRBQUVkRElBelFFajhpQUFBVFF5UXU1dGcrSmdBQUUwTW9M +dWJZUGpRQUFJQS9OZ3pPeHp3NEFBQ3dRVHFwWFFrL1BBQUFzRUUrcVYwSlAwQUFBSkJCUXM3SDRE +NUVBQUNRUVViT3grQStMZ0FBQUVFd0FBQUFRVXdBQUFCQlRnQUFBRUVBQ1cwQWFRQnpBSFFBYkFC +bEFIUUFid0JsQU1jS1huUFd3TTBVRUFjZk1nQUFKRUlDQUFDQVB4SUFBSUEvRmxQZFBEc1VBSUN0 +UXhvQUFFbERITVpKRkQ4ZUFBQkpReURHU1JRL0lnQUFFVU1rdVBMVlBpWUFBQkZES0xqeTFUNDBB +QUNBUHpZTXpzYzhPQUFBc0VFNnFWMEpQendBQUxCQlBxbGRDVDlBQUFDUVFVTE94K0ErUkFBQWtF +Rkd6c2ZnUGlvQUFBQkFMQUFBQUVBdUFBREFRREFBQU1CQVNBQUFBRUJLQUFBQVFFd0FBTUJBVGdB +QXdFQUFGSE1BWVFCdUFHY0FJQUJqQUdnQWNnQnBBSE1BZEFCdEFHRUFjd0FnQUhNQWJ3QnVBR2NB +Y3dESENsQXJBOEhORkJBSEhESUFBQ1JDQWdBQVFFQVNBQUNBUHhiL3BRMDhGQUNBclVNWXE2b3FQ +eG9BQUY1REhPN0hJejhlQUFCZVF5RHV4eU0vSWdBQTlFSWs4d0swUGlZQUFQUkNLUE1DdEQ0MEFB +Q0FQellNenNjOE9BQUF5RUU2K2hnY1B6d0FBTWhCUHZvWUhEOUFBQUJ3UVVJc1VicytSQUFBY0VG +R0xGRzdQaTRBQUlCQU1BQUFnRUJNQUFDQVFFNEFBSUJBQUFabUFHa0FaUUJzQUdRQWN3REhDaWZS +MXNETkZCQUhIeklBQUNSQ0FnQUFnRDhTQUFDQVB4WlQzVHc3RkFDQXJVTWFBQUJuUXh5MmF5by9I +Z0FBWjBNZ3Rtc3FQeUlBQU9aQ0pObXVxVDRtQUFEbVFpalpycWsrTkFBQWdEODJETTdIUERnQUFO +QkJPbXBYSWo4OEFBRFFRVDVxVnlJL1FBQUFZRUZDUzlTdVBrUUFBR0JCUmt2VXJqNHFBQUFBUUN3 +QUFBQkFMZ0FBZ0VBd0FBQ0FRRWdBQUFCQVNnQUFBRUJNQUFDQVFFNEFBSUJBQUFab0FHVUFZUUJ5 +QUhRQWN3REhDaWZSMXNETkZCQUhIeklBQUNSQ0FnQUFnRDhTQUFDQVB4WlQzVHc3RkFDQXJVTWFB +QUI4UXh6ZTZUay9IZ0FBZkVNZzN1azVQeUlBQUx4Q0pJbXlpajRtQUFDOFFpaUpzb28rTkFBQWdE +ODJETTdIUERnQUFPaEJPcnNTTlQ4OEFBRG9RVDY3RWpVL1FBQUFNRUZDcVYySlBrUUFBREJCUnFs +ZGlUNHFBQUFBUUN3QUFBQkFMZ0FBZ0VBd0FBQ0FRRWdBQUFCQVNnQUFBRUJNQUFDQVFFNEFBSUJB +QUFkakFHZ0FhUUJ0QUc0QVpRQjVBTWNLeTRmWndNMFVFQWNmTWdBQUpFSUNBQUNBUHhJQUFJQS9G +bFBkUERzVUFJQ3RReG9BQUg5REhIWWdQRDhlQUFCL1F5QjJJRHcvSWdBQXRrSWtXVVdHUGlZQUFM +WkNLRmxGaGo0MEFBQ0FQellNenNjOE9BQUE2RUU2dXhJMVB6d0FBT2hCUHJzU05UOUFBQUF3UVVL +cFhZaytSQUFBTUVGR3FWMkpQaW9BQUtCQUxBQUFvRUF1QUFDQVB6QUFBSUEvU0FBQW9FQktBQUNn +UUV3QUFJQS9UZ0FBZ0Q4QUMyNEFaUUI0QUhRQUlBQjNBR2tBYmdCMEFHVUFjZ0RIQ3J6TzlzRE5G +QkFIR3pJQUFDUkNBZ0FBQUVBU0FBQ0FQeFpUM2J3N0ZBQ0FyVU1hQUFDSFF4eHVNVWMvSGdBQWgw +TWdiakZIUHlJQUFKWkNKRjVUWFQ0bUFBQ1dRaWhlVTEwK05BQUFnRDgyRE03SFBEZ0FBUGhCT3B5 +UFFUODhBQUQ0UVQ2Y2owRS9RQUFBRUVGQ3pzZGdQa1FBQUJCQlJzN0hZRDRxQUFDQVFDd0FBSUJB +U0FBQWdFQktBQUNBUUFBRVpnQnBBSElBWlFESENxQkIzOERORkJBSEh6SUFBQ1JDQWdBQWdEOFNB +QUNBUHhaVDNUdzdGQUNBclVNYUFBQ1VReHpvWDFvL0hnQUFsRU1nNkY5YVB5SUFBRWhDSk9tTUV6 +NG1BQUJJUWlqcGpCTStOQUFBZ0Q4MkRNN0hQRGdBQUF4Q09sNkpXajg4QUFBTVFqNWVpVm8vUUFB +QW9FQkNrTUg1UFVRQUFLQkFScERCK1QwcUFBQUFRQ3dBQUFCQUxnQUFJRUV3QUFBZ1FVZ0FBQUJB +U2dBQUFFQk1BQUFnUVU0QUFDQkJBQTVpQUhVQWNnQnVBR2tBYmdCbkFDQUFaUUJ0QUdJQVpRQnlB +SE1BeHdvRzhRUEJ6UlFRQnhzeUFBQWtRZ0lBQUFCQUVnQUFnRDhXVTkyOE94UUFnSzFER2dDQXFV +TWNGUmw2UHg0QWdLbERJQlVaZWo4aUFBREFRQ1QvcFkwOEpnQUF3RUFvLzZXTlBEUUFBSUEvTmd6 +T3h6dzRBQUFjUWpvZmczTS9QQUFBSEVJK0g0TnpQMEFBQUlBL1Fnek94enhFQUFDQVAwWU16c2M4 +S2dBQUlFRXNBQUFnUVVnQUFDQkJTZ0FBSUVFQUFBPT0iLA0KICAgICJAdHlwZSI6ICJLZXlQaHJh +c2VFeHRyYWN0aW9uIiwNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5taWNyb3NvZnQu +Y29tIiwNCiAgICAiQEVudGl0eUlkIjogIjUwM2IwOGI3LWFjY2UtNDA0Ni1iNDg4LWViZTI4YzVk +NTYzZCIsDQogICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1YS00 +YmM3LTliY2QtNjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2EtYWRm +NS0wMjg4MWUzYTNlMTQ7RW50aXR5SWQ9NTAzYjA4YjctYWNjZS00MDQ2LWI0ODgtZWJlMjhjNWQ1 +NjNkIiwNCiAgICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTkuNzky +NTc2NloiDQogIH0NCl0AAAAeAH+BCCAGAAAAAADAAAAAAAAARgEAAABAAAAARQBuAHQAaQB0AHkA +RQB4AHQAcgBhAGMAdABpAG8AbgAvAEMAcgBlAGEAdABlAGQAVABhAHMAawAxAC4AMAAAAAEAAABF +AQAAW3siQGNvbnRleHQiOiJodHRwOi8vc2NoZW1hLm9yZyIsIkBvdXRwdXRWZXJzaW9uIjoiMS4w +IiwiQHR5cGUiOiJDcmVhdGVkVGFzayIsIkBzb3VyY2UiOiJUZWVJbmZlcmVuY2VzIiwiVGFza0lk +IjoiUmdBQUFBQzdfOHpqWWJzNVNJNXlXQ3BxdF9HVkJ3RHdhVm05a3h3clFKa2dPYmFrcFV1V0FB +Q0w2cEp1QUFEd2FWbTlreHdyUUprZ09iYWtwVXVXQUFEZFE5VXFBQUFBMCIsIlRhc2tTb3VyY2Ui +OiJjb20ubWljcm9zb2Z0Lm91dGxvb2suZW1haWwuY29tbWl0bWVudCIsIlNvdXJjZUVudGl0eUlk +IjoiNjM5OWMwMWItZTNmNC00Zjg2LWJhMzAtZjQ5MDU0MWFmMThjIn1dAAAAAB4AgIEIIAYAAAAA +AMAAAAAAAABGAQAAAGIAAABFAG4AdABpAHQAeQBFAHgAdAByAGEAYwB0AGkAbwBuAC8ARgBvAGwA +bABvAHcAVQBwAFMAYwBoAGUAZAB1AGwAZQBSAGUAcABsAHkAUgBlAHEAdQBlAHMAdAAxAC4AMAAA +AAAAAQAAACYZAABbDQogIHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmciLA0K +ICAgICJAb3V0cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6ICIy +LjEiLA0KICAgICJAdHlwZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAiVEVF +LDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Gb2xsb3dVcEZvclJlcXVlc3RS +Uiw1Mi4wLjAsMjAxODEyMDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFjdGlv +blRydXN0TGV2ZWwiOiAiVW5rbm93biIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUiOiAi +MC41MTEzNjE2NTg4NjYyIiwNCiAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCBhIENocmlzdG1hcyB0 +byByZW1lbWJlciIsDQogICAgImRlc2NyaXB0aW9uL3NjaGVkdWxlQWN0aW9uVHlwZSI6ICJGb2xs +b3dVcCIsDQogICAgIkBhYnNvbHV0ZU9mZnNldFBsYWluVGV4dCI6ICIxMzEiLA0KICAgICJAc3Bh +biI6ICI0IiwNCiAgICAiQEVudGl0eUlkIjogIjY2ZGZhMTczLWExYmItNGI5ZS04ODZiLWZjNTgy +NzM3ODY5MiIsDQogICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1 +YS00YmM3LTliY2QtNjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2Et +YWRmNS0wMjg4MWUzYTNlMTQ7RW50aXR5SWQ9NjZkZmExNzMtYTFiYi00YjllLTg4NmItZmM1ODI3 +Mzc4NjkyIiwNCiAgICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTku +NzkyNTc2NloiDQogIH0sDQogIHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmci +LA0KICAgICJAb3V0cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6 +ICIyLjEiLA0KICAgICJAdHlwZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAi +VEVFLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Gb2xsb3dVcEZvclJlcXVl +c3RSUiw1Mi4wLjAsMjAxODEyMDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFj +dGlvblRydXN0TGV2ZWwiOiAiVW5rbm93biIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUi +OiAiMC41MTEzNjE2NTg4NjYyIiwNCiAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCBhIENocmlzdG1h +cyB0byByZW1lbWJlciIsDQogICAgImRlc2NyaXB0aW9uL3NjaGVkdWxlQWN0aW9uVHlwZSI6ICJG +b2xsb3dVcCIsDQogICAgIkBhYnNvbHV0ZU9mZnNldFBsYWluVGV4dCI6ICI3MTkiLA0KICAgICJA +c3BhbiI6ICI0IiwNCiAgICAiQEVudGl0eUlkIjogImFiYTZiOGU2LWYxYWEtNDFjNS04ZjEyLTYy +N2FlNjQ5YzE0MiIsDQogICAgIkBjb3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjct +NzA1YS00YmM3LTliY2QtNjJmYmNjODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRj +Y2EtYWRmNS0wMjg4MWUzYTNlMTQ7RW50aXR5SWQ9YWJhNmI4ZTYtZjFhYS00MWM1LThmMTItNjI3 +YWU2NDljMTQyIiwNCiAgICAiQGV4dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6 +MTkuNzkyNTc2NloiDQogIH0sDQogIHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5v +cmciLA0KICAgICJAb3V0cHV0VmVyc2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lv +biI6ICIyLjEiLA0KICAgICJAdHlwZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2Ui +OiAiVEVFLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Gb2xsb3dVcEZvclJl +cXVlc3RSUiw1Mi4wLjAsMjAxODEyMDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0 +cmFjdGlvblRydXN0TGV2ZWwiOiAiVW5rbm93biIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2Nv +cmUiOiAiMC42MzAzMzIwMzI4MTM4IiwNCiAgICAiZGVzY3JpcHRpb24iOiAiJ05lYXRoIHRoZSBt +aXN0bGV0b2UgeW91IGtpc3NlZCBtZSB3YXJtIGFuZCB0ZW5kZXIiLA0KICAgICJkZXNjcmlwdGlv +bi9zY2hlZHVsZUFjdGlvblR5cGUiOiAiRm9sbG93VXAiLA0KICAgICJAYWJzb2x1dGVPZmZzZXRQ +bGFpblRleHQiOiAiMTA0MSIsDQogICAgIkBzcGFuIjogIjEiLA0KICAgICJARW50aXR5SWQiOiAi +Mzc5MDA4Y2EtMTBhNS00YTI1LTk4MjEtZDY1NGNiYjkxOTBmIiwNCiAgICAiQGNvcnJlbGF0aW9u +VHJhaWwiOiAiQXNzZXRJZD1iNTBmOWQ2Ny03MDVhLTRiYzctOWJjZC02MmZiY2M4NjA0YTE7RXh0 +cmFjdGlvbklkPWM2MjYyNmI0LWQyMDgtNGNjYS1hZGY1LTAyODgxZTNhM2UxNDtFbnRpdHlJZD0z +NzkwMDhjYS0xMGE1LTRhMjUtOTgyMS1kNjU0Y2JiOTE5MGYiLA0KICAgICJAZXh0cmFjdGlvblRp +bWVVdGMiOiAiMjAxOC0xMi0xNVQxNTowNzoxOS43OTI1NzY2WiINCiAgfSwNCiAgew0KICAgICJA +Y29udGV4dCI6ICJodHRwOi8vc2NoZW1hLm9yZyIsDQogICAgIkBvdXRwdXRWZXJzaW9uIjogIjEu +MCIsDQogICAgIkBzY2hlbWFPcmdWZXJzaW9uIjogIjIuMSIsDQogICAgIkB0eXBlIjogIlNjaGVk +dWxlQWN0aW9uIiwNCiAgICAiQHNvdXJjZSI6ICJURUUsNTIuMC4wLDIwMTgxMjAzLjExLDIwMTgx +MjAzLjExO2VuLVVTLkZvbGxvd1VwRm9yUmVxdWVzdFJSLDUyLjAuMCwyMDE4MTIwMy4xMSwyMDE4 +MTIwMy4xMSIsDQogICAgIkBlbnRpdHlFeHRyYWN0aW9uVHJ1c3RMZXZlbCI6ICJVbmtub3duIiwN +CiAgICAiQHNvdXJjZUNvbmZpZGVuY2VTY29yZSI6ICIwLjUxMTM2MTY1ODg2NjIiLA0KICAgICJk +ZXNjcmlwdGlvbiI6ICJXaGF0IGEgQ2hyaXN0bWFzIHRvIHJlbWVtYmVyIiwNCiAgICAiZGVzY3Jp +cHRpb24vc2NoZWR1bGVBY3Rpb25UeXBlIjogIkZvbGxvd1VwIiwNCiAgICAiQGFic29sdXRlT2Zm +c2V0UGxhaW5UZXh0IjogIjEwOTYiLA0KICAgICJAc3BhbiI6ICI0IiwNCiAgICAiQEVudGl0eUlk +IjogIjRjNzdhZDNhLTg4NmQtNDk0ZS05ODIwLTA5NjdmMDI0YzQ1MCIsDQogICAgIkBjb3JyZWxh +dGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1YS00YmM3LTliY2QtNjJmYmNjODYwNGEx +O0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2EtYWRmNS0wMjg4MWUzYTNlMTQ7RW50aXR5 +SWQ9NGM3N2FkM2EtODg2ZC00OTRlLTk4MjAtMDk2N2YwMjRjNDUwIiwNCiAgICAiQGV4dHJhY3Rp +b25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTkuNzkyNTc2NloiDQogIH0sDQogIHsNCiAg +ICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmciLA0KICAgICJAb3V0cHV0VmVyc2lvbiI6 +ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6ICIyLjEiLA0KICAgICJAdHlwZSI6ICJT +Y2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAiVEVFLDUyLjAuMCwyMDE4MTIwMy4xMSwy +MDE4MTIwMy4xMTtlbi1VUy5Gb2xsb3dVcEZvclJlcXVlc3RSUiw1Mi4wLjAsMjAxODEyMDMuMTEs +MjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFjdGlvblRydXN0TGV2ZWwiOiAiVW5rbm93 +biIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUiOiAiMC45NjAyMzE2MzEzNzg3IiwNCiAg +ICAiZGVzY3JpcHRpb24iOiAiQ2FuIHdlIGRvIHRoaXMgbmV4dCB3aW50ZXIiLA0KICAgICJkZXNj +cmlwdGlvbi9zY2hlZHVsZUFjdGlvblR5cGUiOiAiRm9sbG93VXAiLA0KICAgICJAYWJzb2x1dGVP +ZmZzZXRQbGFpblRleHQiOiAiMTM4MCIsDQogICAgIkBzcGFuIjogIjMiLA0KICAgICJARW50aXR5 +SWQiOiAiMWViZDM0YjktODk4Zi00ZmZkLTkwMGEtYzQzN2YxYjAyNjQ0IiwNCiAgICAiQGNvcnJl +bGF0aW9uVHJhaWwiOiAiQXNzZXRJZD1iNTBmOWQ2Ny03MDVhLTRiYzctOWJjZC02MmZiY2M4NjA0 +YTE7RXh0cmFjdGlvbklkPWM2MjYyNmI0LWQyMDgtNGNjYS1hZGY1LTAyODgxZTNhM2UxNDtFbnRp +dHlJZD0xZWJkMzRiOS04OThmLTRmZmQtOTAwYS1jNDM3ZjFiMDI2NDQiLA0KICAgICJAZXh0cmFj +dGlvblRpbWVVdGMiOiAiMjAxOC0xMi0xNVQxNTowNzoxOS43OTI1NzY2WiINCiAgfSwNCiAgew0K +ICAgICJAY29udGV4dCI6ICJodHRwOi8vc2NoZW1hLm9yZyIsDQogICAgIkBvdXRwdXRWZXJzaW9u +IjogIjEuMCIsDQogICAgIkBzY2hlbWFPcmdWZXJzaW9uIjogIjIuMSIsDQogICAgIkB0eXBlIjog +IlNjaGVkdWxlQWN0aW9uIiwNCiAgICAiQHNvdXJjZSI6ICJURUUsNTIuMC4wLDIwMTgxMjAzLjEx +LDIwMTgxMjAzLjExO2VuLVVTLkZvbGxvd1VwRm9yUmVxdWVzdFJSLDUyLjAuMCwyMDE4MTIwMy4x +MSwyMDE4MTIwMy4xMSIsDQogICAgIkBlbnRpdHlFeHRyYWN0aW9uVHJ1c3RMZXZlbCI6ICJVbmtu +b3duIiwNCiAgICAiQHNvdXJjZUNvbmZpZGVuY2VTY29yZSI6ICIwLjUxMTM2MTY1ODg2NjIiLA0K +ICAgICJkZXNjcmlwdGlvbiI6ICJXaGF0IGEgQ2hyaXN0bWFzIHRvIHJlbWVtYmVyIiwNCiAgICAi +ZGVzY3JpcHRpb24vc2NoZWR1bGVBY3Rpb25UeXBlIjogIkZvbGxvd1VwIiwNCiAgICAiQGFic29s +dXRlT2Zmc2V0UGxhaW5UZXh0IjogIjE0MTEiLA0KICAgICJAc3BhbiI6ICI0IiwNCiAgICAiQEVu +dGl0eUlkIjogImE4OTM2NTZmLWNkZWQtNGRhOS05MjcwLTRhYjI0OGE3NTRiZCIsDQogICAgIkBj +b3JyZWxhdGlvblRyYWlsIjogIkFzc2V0SWQ9YjUwZjlkNjctNzA1YS00YmM3LTliY2QtNjJmYmNj +ODYwNGExO0V4dHJhY3Rpb25JZD1jNjI2MjZiNC1kMjA4LTRjY2EtYWRmNS0wMjg4MWUzYTNlMTQ7 +RW50aXR5SWQ9YTg5MzY1NmYtY2RlZC00ZGE5LTkyNzAtNGFiMjQ4YTc1NGJkIiwNCiAgICAiQGV4 +dHJhY3Rpb25UaW1lVXRjIjogIjIwMTgtMTItMTVUMTU6MDc6MTkuNzkyNTc2NloiDQogIH0sDQog +IHsNCiAgICAiQGNvbnRleHQiOiAiaHR0cDovL3NjaGVtYS5vcmciLA0KICAgICJAb3V0cHV0VmVy +c2lvbiI6ICIxLjAiLA0KICAgICJAc2NoZW1hT3JnVmVyc2lvbiI6ICIyLjEiLA0KICAgICJAdHlw +ZSI6ICJTY2hlZHVsZUFjdGlvbiIsDQogICAgIkBzb3VyY2UiOiAiVEVFLDUyLjAuMCwyMDE4MTIw +My4xMSwyMDE4MTIwMy4xMTtlbi1VUy5Gb2xsb3dVcEZvclJlcXVlc3RSUiw1Mi4wLjAsMjAxODEy +MDMuMTEsMjAxODEyMDMuMTEiLA0KICAgICJAZW50aXR5RXh0cmFjdGlvblRydXN0TGV2ZWwiOiAi +VW5rbm93biIsDQogICAgIkBzb3VyY2VDb25maWRlbmNlU2NvcmUiOiAiMC41MTEzNjE2NTg4NjYy +IiwNCiAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCBhIENocmlzdG1hcyB0byByZW1lbWJlciIsDQog +ICAgImRlc2NyaXB0aW9uL3NjaGVkdWxlQWN0aW9uVHlwZSI6ICJGb2xsb3dVcCIsDQogICAgIkBh +YnNvbHV0ZU9mZnNldFBsYWluVGV4dCI6ICIxNTg5IiwNCiAgICAiQHNwYW4iOiAiNCIsDQogICAg +IkBFbnRpdHlJZCI6ICIzNjZkMTJkNC0yNDIwLTQ2N2EtOTBjYy05NDgxN2I4ZDI0MTEiLA0KICAg +ICJAY29ycmVsYXRpb25UcmFpbCI6ICJBc3NldElkPWI1MGY5ZDY3LTcwNWEtNGJjNy05YmNkLTYy +ZmJjYzg2MDRhMTtFeHRyYWN0aW9uSWQ9YzYyNjI2YjQtZDIwOC00Y2NhLWFkZjUtMDI4ODFlM2Ez +ZTE0O0VudGl0eUlkPTM2NmQxMmQ0LTI0MjAtNDY3YS05MGNjLTk0ODE3YjhkMjQxMSIsDQogICAg +IkBleHRyYWN0aW9uVGltZVV0YyI6ICIyMDE4LTEyLTE1VDE1OjA3OjE5Ljc5MjU3NjZaIg0KICB9 +LA0KICB7DQogICAgIkBjb250ZXh0IjogImh0dHA6Ly9zY2hlbWEub3JnIiwNCiAgICAiQG91dHB1 +dFZlcnNpb24iOiAiMS4wIiwNCiAgICAiQHNjaGVtYU9yZ1ZlcnNpb24iOiAiMi4xIiwNCiAgICAi +QHR5cGUiOiAiU2NoZWR1bGVBY3Rpb24iLA0KICAgICJAc291cmNlIjogIlRFRSw1Mi4wLjAsMjAx +ODEyMDMuMTEsMjAxODEyMDMuMTE7ZW4tVVMuRm9sbG93VXBGb3JSZXF1ZXN0UlIsNTIuMC4wLDIw +MTgxMjAzLjExLDIwMTgxMjAzLjExIiwNCiAgICAiQGVudGl0eUV4dHJhY3Rpb25UcnVzdExldmVs +IjogIlVua25vd24iLA0KICAgICJAc291cmNlQ29uZmlkZW5jZVNjb3JlIjogIjAuNTExMzYxNjU4 +ODY2MiIsDQogICAgImRlc2NyaXB0aW9uIjogIldoYXQgYSBDaHJpc3RtYXMgdG8gcmVtZW1iZXIi +LA0KICAgICJkZXNjcmlwdGlvbi9zY2hlZHVsZUFjdGlvblR5cGUiOiAiRm9sbG93VXAiLA0KICAg +ICJAYWJzb2x1dGVPZmZzZXRQbGFpblRleHQiOiAiMTc3MiIsDQogICAgIkBzcGFuIjogIjQiLA0K +ICAgICJARW50aXR5SWQiOiAiYjJjZjdmNTUtMGNmYy00MjI2LWI4YjAtOGFiNjFiYmJkMmQ5IiwN +CiAgICAiQGNvcnJlbGF0aW9uVHJhaWwiOiAiQXNzZXRJZD1iNTBmOWQ2Ny03MDVhLTRiYzctOWJj +ZC02MmZiY2M4NjA0YTE7RXh0cmFjdGlvbklkPWM2MjYyNmI0LWQyMDgtNGNjYS1hZGY1LTAyODgx +ZTNhM2UxNDtFbnRpdHlJZD1iMmNmN2Y1NS0wY2ZjLTQyMjYtYjhiMC04YWI2MWJiYmQyZDkiLA0K +ICAgICJAZXh0cmFjdGlvblRpbWVVdGMiOiAiMjAxOC0xMi0xNVQxNTowNzoxOS43OTI1NzY2WiIN +CiAgfQ0KXQAAAAsAHw4BAAAAAgH4DwEAAAAQAAAAFwCIYmVcL0K+j6gSY6LNKgIB+g8BAAAAEAAA +AOyulC30UBNEkJODXut1B/ADAP4PBQAAAAMADTT9P60OAwAPNP0/rQ4CARQ0AQAAABAAAADpL+t1 +llBEhoO4feUiqklIAgHiZQEAAAAUAAAA9kFwYR5q1kOITwPBjPt/YwAB/DICAeNlAQAAABUAAAAU +9kFwYR5q1kOITwPBjPt/YwAB/DIAAAACAX8AAQAAAFEAAAA8RE01UFIyMU1CMDgyOERBMkI4Qzg4 +MDQ4QkMwM0VGRkE2Q0ZBMjBARE01UFIyMU1CMDgyOC5uYW1wcmQyMS5wcm9kLm91dGxvb2suY29t +PgAAAAADAAYQYQv/igMABxCmBQAAAwAQEAAAAAADABEQAAAAAB4ACBABAAAAZQAAAFlPVVZFTUFE +RVRISVNBQ0hSSVNUTUFTVE9SRU1FTUJFUlNQUklOR1RJTUVGRUVMSU5HU0lOVEhFTUlERExFT0ZE +RUNFTUJFUlNUUkFOR0VSU01FRVRBTkRXSUxMSU5HTFlTVVIAAAAAGqACApAGAA4AAAABAAAAAAAg +ACAAAAAAAEEAAhOAAwAOAAAA4gcMAA8ACgADACAABgA3AQIPgAYAKbkFAP/Y/+AAEEpGSUYAAQIB +AEgASAAA/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAW +EBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQU +FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8IAEQgDpwV6AwEiAAIRAQMRAf/EAB0AAAAH +AQEBAAAAAAAAAAAAAAABAgMEBQYHCAn/xAAbAQADAQEBAQEAAAAAAAAAAAAAAQIDBAUGB//aAAwD +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 +6H6lqFNi1NfHOjo6XQ4tPRt1aTyZu47P0Dyrua8/09P530m8w8SmhybrOWCPs0GmaQTR+LfXXB0c +2xXZMoliYurygKbcAiSZgSXFg0TqkGl5mZU+UdkhiQUxGdJZoao6Wn1IVM7XV8m06v2H5T6lz7c7 +rEy02KldM4F2ce3ycmns3eNtfJrj2JQ5DlaXUchyPr3NPoVSF9e5mRsBkgRuoUNSkGxRpMHgAAMg +MECAEEoSYAEZADIEBkCAAEgAEASZMMA0gYMAYUBGDGQBgDBACAQAAwEnnUzd8w7Hbw+YWsynRiOF +9Cw/l83R+m+V+pdS5gnUZGW1BnwE5bESVrbaF11t9+vf0LKXWlhPU+1cS0s92w2mNmRvfIaYTmrF +S1cFFhsuJWaW1r5eLstI0Ss5YhZFVwB2Ofcr8NbaFCRltdFTlNXEaO2nZ07kUc6Vm5uOtmhlFRMV +WNaw7TyK0bNDOqNIhxnI6Vi7WHplKy0RpenX1Ojv338+LS1W3HGi2bzmlPV595Q9tkWdvK9n7755 ++hr5fQxKFQgKICjSsoiRYYyMHFWcx2iVxvHda5lRDI1zLRvKQwlxmmqfXvSnUiVENxJkV063KgDk +uRpDzDMqKI3G3Yt9yJdS6iPoq646fpOJ6hadVYoc5Z1Pd2flpnWuOYyTOLqJ2qzXRbvm3Sl0bTXY +aT11peeZLp0Tt2YNppazIUKOungo0KE+YAyAIYBAAhaUEAAIlECSMgACUKIEBggwAGAMzQRmGgYN +MjMwIzAJIwBAMIZm8mhRj2Hyj1aownAenvH1+suq6rzrNW8LXYt+M3ML1DA8+kbNXMK5ZWiDq50R ++ttWXRuV7fTOsrunY6KzUKRHra469y63vTpeh5jouLt6JJp7iNBIrXmmGJMBUdXa0uetkwiAnYy6 +6zqXXILgWEquSIQmaLHovYdKmdLN+vgKtFdY29CUxXQk9PIzxovDrEaZ29G5XaTFor2n0zpkqrKz +n51lS9lcdXZDv4/pOoefTW8opnRjXOdKqtTze3e8Y67lto4LA12X6/iYQkRunw+8emvnX6t04+zh +YqM75v7EUz53z/tHxbGe59XeGPST0oePdo81aDK2VSiDa25SGzhJAcaduKfSYTQtFOohzIM5iYk6 +ucyUxrQK4OSlaLOFLiV0txYCpHorujftM06EuEuxWbVqLKX0zVcvodNKvZ453njszHB+866d35cr +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 +Fyes0Z//2dpmAhCAAQANAAAAS0lUVEVOfjEuSlBHAI0DAhGABgC4DQAAAQAJAAAD3AYAAAAAIQYA +AAAABQAAAAkCAAAAAAUAAAABAv///wClAAAAQQvGAIgAIAAgAAAAAAAgACAAAAAAACgAAAAgAAAA +QAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAhBgAAQQtGAGYAIAAgAAAAAAAgACAAAAAAACgAAAAgAAAAIAAAAAEAGAAAAAAA +AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR +kI+Qj46Pjo2OjoyNjYuNjIuMi4qLiomKioiKiYeJiIaIh4aHhoWGhoSGhYOFhIKEg4GDgoGDgoCC +gX2BgHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRkZD7+/r7+/r7+/r7+/r7+/r7 ++/r7+/r7+/r7+/r7+/r7+/r7+/r7+/r7+/r7+/r7+/r7+/r7+/r7+/qCgX0AAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAACSkpD7+/r39vX39vX39vX39vX39vX39vX39vX39vX39vX39vX3 +9vX39vX39vX39vX39vX39vX39vX7+/qDgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AACTkpH7+/v39/b39vb39vb39vX39vX39vX39vX39vX39vX39vX39vX39vX39vX39vX39vX39vX3 +9vX7+/qDgoEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUk5L8+/v49/b49/b49/b4 +9/b49/b39/b39vb39vX39vX39vX39vX39vX39vX39vX39vX39vX39vX7+/qEg4EAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJP8+/v49/b49/b49/b49/b49/b49/b49/b49/b39vb3 +9vX39vX39vX39vX39vX39vX39vX39vX7+/qFhIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAACVlZT8+/v49/bXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDX +dgD39vX7+/qGhYMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWlZX8+/v49/fXdgDX +dgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgD39vX7+/qGhoQAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXlpX8/Pv5+PfXdgDXdgDXdgDXdgDXdgDXdgDXdgDX +dgDXdgDXdgDXdgDXdgDXdgDXdgDXdgD39vX7+/qHhoUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAACXl5b8/Pv5+PfXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDfmDzXdgDX +dgDXdgD39vX7+/qIh4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJf8/Pv5+PfX +dgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDmq17ZgA3XdgDXdgDXdgD39vX7+/qJiIYAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZj8/Pz5+PjXdgDXdgDXdgDXdgDXdgDXdgDX +dgDXdgDXdgDhmj7rvIDXdgDXdgDhoEvXdgD39vb7+/qKiYcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAACamZn8/Pz5+fjXdgDkqFvXdgDXdgDXdgDXdgDXdgDXdgDciR767t/ZgA3XdgDZ +gA327+fXdgD49/b7+/qKiogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbmpr9/Pz6 ++fjXdgD38ejdkCzXdgDXdgDXdgDXdgDXdgD45s/osm3XdgDXdgDuz6n49/bXdgD49/b7+/uLiokA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbm5r8/Pz5+fjXdgD6+fjz4crZgA7XdgDX +dgDXdgDwzJ/7+vnsyJrXdgDmsGr49/f49/bXdgD49/b8+/uMi4oAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAACcnJv9/Pz6+fjXdgD6+fj5+PjsyJvXdgDXdgDgmDz5+Pj5+Pj5+Pfu0Kr3 +8Oj4+Pf49/fXdgD49/b8+/uNjIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdnZz9 +/fz6+fnXdgD6+fj6+fj6+fjkqFvbiB338ej5+fj5+Pj5+Pj5+Pf5+Pf5+Pf4+PfXdgD49/b8+/uN +jYsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACenZ39/Pz6+fnXdgD6+fn6+vn6+fj4 +8en16dr6+fj6+fj5+fj5+Pj5+Pj5+Pf5+Pf4+PfXdgD49/b8+/uOjowAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAACenp79/fz7+vnXdgD6+fn6+fn6+fn6+vn6+fj5+fj6+fj5+fj5+fj5 ++Pj5+Pf5+Pf5+PfXdgD49/b8+/uPjo0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACf +n5/9/fz6+vnXdgD6+vn7+vn6+fn6+fn6+fj6+fj5+Pj6+fj5+fj5+Pj5+Pj5+Pf5+PfXdgD49/f8 ++/uQj44AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKD9/f37+vrXdgDXdgDXdgDX +dgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgDXdgD49/f8+/uRkI8AAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAChoaD9/f37+vr7+vr7+vr6+vn6+vn7+vn6+fn6+vn6+fj5+Pj6 ++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 +AAAAIAAAACAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA +gICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////////// +////////////////////////////////////////////////////////////gICAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////////////////////////////////// +////////////////////////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAgICA//////////////////////////////////////////////////////////////////// +////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////// +////////wMDAwMDAwMDA////////////////////////////////////////////gICAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA////////////////////wMDAAACAAACAwMDAwMDA +////////////////////////////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAgICA////////////////wMDAAACAAACAAACAAACAwMDAwMDA//////////////////// +////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////// +wMDAAACAAACAAACAAACAAACAAACAwMDA////////////////////////////////////gICAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA////////wMDAAACAAACAAACAAACAAACAAACA +AACAgICAwMDA////////////////////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAgICA////////AACAAACAAACAAACA////gICAAACAAACAAACAwMDAwMDA//////// +////////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////// +AACAAACAAACA////////////wMDAAACAAACAAACAwMDAwMDA////////////////////////gICA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA////////////AACA//////////////// +////wMDAAACAAACAgICAwMDA////////////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAgICA////////////////////////////////////////wMDAAACAAACAgICA +wMDA////////////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//// +////////////////////////////////////////////AACAAACAwMDAwMDA//////////////// +gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////////////////// +////////////////////////AACAAACAwMDAwMDA////////////gICAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAgICA//////////////////////////////////////////////////// +////AACAAACAwMDAwMDA////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA +////////////////////////////////////////////////////////////AACAAACAwMDA//// +////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////////////// +////////////////////////////////////////AACAAACA////////gICAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////////////////////////////////////// +////////////////////AACAwMDA////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +gICA//////////////////////////////////////////////////////////////////////// +AACA////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA//////////////////// +////////////////////////////////////////////////////////////gICAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA////////////////////AAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAwMDA////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAgICA////////////////////gICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAAAAAwMDA +////////////gICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICA +gICAgICA////gICAgICAgICAgICAgICAgICAgICAwMDAAAAAgICAgICAgICAgICAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA////wMDAwMDAwMDA +wMDAwMDAwMDAgICAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA////////////////////////gICAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAApE8CBZAGAGgaAAATAAAAAwAg +DgEkAAAeAAEwAQAAABQAAABCdWlsZCBhIHRyYWluIHRhYmxlAA0AATcBAAAAfBkAAAcDAgAAAAAA +wAAAAAAAAEZ4nz4iJg8BBpAIAAQAAAAAAAEAAQABB5AGAAgAAADkBAAAAAAAAOgAAQiABwAJAAAA +SVBNLlRhc2sApwIBDYAEAAIAAAABAAEAAQSAAQAUAAAAQnVpbGQgYSB0cmFpbiB0YWJsZQDXBgEF +gAMADgAAAOIHDAAPAAkAJQAfAAYAVwEBAIAAAKYAAAAEAKYAEgCEAEplZmZyZXkgU3RlZGZhc3QA +AEVYOi9vPUV4Y2hhbmdlTGFicy9vdT1FeGNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBHcm91cCAoRllE +SUJPSEYyM1NQRExUKS9jbj1SZWNpcGllbnRzL2NuPTIyN2RlYzM2ZDA5ODQ0NjY5Zjc4ZmM5NDg5 +ZWIzMWRkLUplZmZyZXkgU3RlAAAAAAAAAAAAcTIBBoADAA4AAADiBwwADwAJACUAHwAGAFcBAQeA +BgABAAAAISEAASCAAwAOAAAA4gcMAA8ACQAlADYABgBuAQEJgAEAIQAAADlDQUVERDAyM0ZGODlF +NEFBNUZFNjk4NkE5ODM4RUY1AJEHAQyAAgA6AAAAQnVpbGQgbXkgbmVwaGV3IGFuIEhPLXNjYWxl +IHRyYWluIHRhYmxlIGZvciBDaHJpc3RtYXMuDQoNCm8TAQOQBgCAFwAAUAAAAAsAAgABAAAACwAj +AAAAAAADACYAAQAAAAsAKQAAAAAAAwA2AAAAAABAADkAoAPMtYOU1AECATsAAQAAAIQAAABFWDov +Tz1FWENIQU5HRUxBQlMvT1U9RVhDSEFOR0UgQURNSU5JU1RSQVRJVkUgR1JPVVAgKEZZRElCT0hG +MjNTUERMVCkvQ049UkVDSVBJRU5UUy9DTj0yMjdERUMzNkQwOTg0NDY2OUY3OEZDOTQ4OUVCMzFE +RC1KRUZGUkVZIFNURQACAUEAAQAAAJ0AAAAAAAAA3KdAyMBCEBq0uQgAKy/hggEAAAAAAAAAL289 +RXhjaGFuZ2VMYWJzL291PUV4Y2hhbmdlIEFkbWluaXN0cmF0aXZlIEdyb3VwIChGWURJQk9IRjIz +U1BETFQpL2NuPVJlY2lwaWVudHMvY249MjI3ZGVjMzZkMDk4NDQ2NjlmNzhmYzk0ODllYjMxZGQt +SmVmZnJleSBTdGUAAAAAHgBCAAEAAAARAAAASmVmZnJleSBTdGVkZmFzdAAAAAAeAGQAAQAAAAMA +AABFWAAAHgBlAAEAAACBAAAAL289RXhjaGFuZ2VMYWJzL291PUV4Y2hhbmdlIEFkbWluaXN0cmF0 +aXZlIEdyb3VwIChGWURJQk9IRjIzU1BETFQpL2NuPVJlY2lwaWVudHMvY249MjI3ZGVjMzZkMDk4 +NDQ2NjlmNzhmYzk0ODllYjMxZGQtSmVmZnJleSBTdGUAAAAAHgBwAAEAAAAZAAAAU2FtcGxlIE91 +dGxvb2sgMjAxNiBUYXNrAAAAAAIBcQABAAAAFgAAAAHUlINYxPFA1BPXQU74u8KjFPCQAk0AAB4A +GgwBAAAAEQAAAEplZmZyZXkgU3RlZGZhc3QAAAAAAgEdDAEAAACEAAAARVg6L089RVhDSEFOR0VM +QUJTL09VPUVYQ0hBTkdFIEFETUlOSVNUUkFUSVZFIEdST1VQIChGWURJQk9IRjIzU1BETFQpL0NO +PVJFQ0lQSUVOVFMvQ049MjI3REVDMzZEMDk4NDQ2NjlGNzhGQzk0ODlFQjMxREQtSkVGRlJFWSBT +VEUAHgAeDAEAAAADAAAARVgAAB4AHwwBAAAAgQAAAC9vPUV4Y2hhbmdlTGFicy9vdT1FeGNoYW5n +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 +1AEDAEKACCAGAAAAAADAAAAAAAAARgAAAAABhQAAAAAAAEAAQ4AIIAYAAAAAAMAAAAAAAABGAAAA +AGCFAAAASFO+UZzUAQsASIAIIAYAAAAAAMAAAAAAAABGAAAAAAaFAAAAAAAAQABLgAggBgAAAAAA +wAAAAAAAAEYAAAAAFoUAAACIDggzlNQBQABMgAggBgAAAAAAwAAAAAAAAEYAAAAAF4UAAAAIMLAO +nNQBCwBNgAggBgAAAAAAwAAAAAAAAEYAAAAADoUAAAAAAAADAE6ACCAGAAAAAADAAAAAAAAARgAA +AAAYhQAAAAAAAAMAU4AIIAYAAAAAAMAAAAAAAABGAAAAAOuFAAAJBAAAAwB4gAMgBgAAAAAAwAAA +AAAAAEYAAAAAAYEAAAEAAAALAHmAAyAGAAAAAADAAAAAAAAARgAAAAAcgQAAAAAAAAUAeoADIAYA +AAAAAMAAAAAAAABGAAAAAAKBAACamZmZmZmpPwMAhYAIIAYAAAAAAMAAAAAAAABGAAAAAFKFAAAV +lRgAQACGgAMgBgAAAAAAwAAAAAAAAEYAAAAABYEAAAAAWsfkm9QBQACHgAMgBgAAAAAAwAAAAAAA +AEYAAAAABIEAAACAOB8JlNQBAwCKgAMgBgAAAAAAwAAAAAAAAEYAAAAAE4EAAAEAAAADAJOAAyAG +AAAAAADAAAAAAAAARgAAAAAQgQAAAAAAAAMAlIADIAYAAAAAAMAAAAAAAABGAAAAABGBAAAAAAAA +CwCbgAMgBgAAAAAAwAAAAAAAAEYAAAAAJIEAAAAAAAALAJyAAyAGAAAAAADAAAAAAAAARgAAAAAs +gQAAAAAAAAMAnYADIAYAAAAAAMAAAAAAAABGAAAAACmBAAAAAAAAAwCegAMgBgAAAAAAwAAAAAAA +AEYAAAAAKoEAAAAAAAAeAKOAAyAGAAAAAADAAAAAAAAARgAAAAAngQAAAQAAAAEAAAAAAAAAAwCo +gAMgBgAAAAAAwAAAAAAAAEYAAAAAOYEAAAAAAAADAKuAAyAGAAAAAADAAAAAAAAARgAAAAASgQAA +AgAAAB4Ar4ADIAYAAAAAAMAAAAAAAABGAAAAACGBAAABAAAAAQAAAAAAAAAeALCAAyAGAAAAAADA +AAAAAAAARgAAAAAfgQAAAQAAABEAAABKZWZmcmV5IFN0ZWRmYXN0AAAAAAsAsoADIAYAAAAAAMAA +AAAAAABGAAAAAAOBAAAAAAAAAwCzgAMgBgAAAAAAwAAAAAAAAEYAAAAAI4EAABj8//8LALSAAyAG +AAAAAADAAAAAAAAARgAAAAAmgQAAAAAAAB4At4AIIAYAAAAAAMAAAAAAAABGAAAAAFSFAAABAAAA +BQAAADE2LjAAAAAAQADagAggBgAAAAAAwAAAAAAAAEYAAAAAoIUAAIC1y7WDlNQBHgDbgAggBgAA +AAAAwAAAAAAAAEYAAAAAoYUAAAEAAAAIAAAANTU1NTU1NQBAAOmACCAGAAAAAADAAAAAAAAARgAA +AAC/hQAAYGfLtYOU1AECAQWBCCAGAAAAAADAAAAAAAAARgEAAAA2AAAASQBuAFQAcgBhAG4AcwBp +AHQATQBlAHMAcwBhAGcAZQBDAG8AcgByAGUAbABhAHQAbwByAAAAAAABAAAAEAAAAPT6V+pQU7hF +mUOTsi5l9OIeAD0AAQAAAAEAAAAAAAAAHgACDgEAAAABAAAAAAAAAB4AAw4BAAAAAQAAAAAAAAAe +AAQOAQAAAAEAAAAAAAAACwAbDgAAAAAeAB0OAQAAABQAAABCdWlsZCBhIHRyYWluIHRhYmxlAAsA +Hw4BAAAAAwD0DwIAAAADAPcPAAAAAAIB+A8BAAAAEAAAABcAiGJlXC9Cvo+oEmOizSoCAfoPAQAA +ABAAAADsrpQt9FATRJCTg17rdQfwAwD+DwUAAAADAA00/T+tDgMADzT9P60OAgEUNAEAAAAQAAAA +6S/rdZZQRIaDuH3lIqpJSJ46AgECNwEAAAAAAAAAAwAFNwUAAAADAAs3MgcAAAMAFDcAAAAAAwD6 +fwAAAABAAPt/AEDdo1dFswxAAPx/AEDdo1dFswwDAP1/AAAAAAsA/n8AAAAACwD/fwAAAAADACEO +ZTICAAIB+A8BAAAAEAAAABcAiGJlXC9Cvo+oEmOizSoCAfoPAQAAABAAAADsrpQt9FATRJCTg17r +dQfwAwD+DwcAAAADAA00/T+tDgMADzT9P60OoNkCApAGAA4AAAABAFAHAAAgACAAAAAAAJgAAhCA +AQAUAAAAVW50aXRsZWQgQXR0YWNobWVudAByBwITgAMADgAAAOIHDAAPAAoAEQAmAAYASwECD4AG +AFkAAABUaGlzIGF0dGFjaG1lbnQgaXMgYSBNQVBJIDEuMCBlbWJlZGRlZCBtZXNzYWdlIGFuZCBp +cyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWFpbCBzeXN0ZW0uAPIeAhGABgC4DQAAAQAJAAAD3AYA +AAAAIQYAAAAABQAAAAkCAAAAAAUAAAABAv///wClAAAAQQvGAIgAIAAgAAAAAAAgACAAAAAAACgA +AAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAA/////////////////////+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA +AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAA +B+AAAAf///////////////8hBgAAQQtGAGYAIAAgAAAAAAAgACAAAAAAACgAAAAgAAAAIAAAAAEA +GAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA +gICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID////////////AwMD/ +///////////AwMD////////////AwMD////////////AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID////////////AwMD////////////AwMD///////// +///AwMD////////////AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAA +AAAAAACAgID////////////AwMD////////////AwMD////////////AwMD////////////AwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID////////////AwMD////////////AwMD///// +///////AwMD////////////AwMD////////////AwMD////////////AwMAAAAAAAAAAAAAAAAAA +AAAAAAAAAACAgID////////////AwMD////////////AwMD////////////AwMD////////////A +wMD////////////AwMD////////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID///////// +///AwMD////////////AwMD////////////AwMD////////////AwMD////////////AwMD///// +///////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAA +AAAAAAAAAAAAAACAgID////////////AwMD////////////AwMD////////////AwMD///////// +///AwMD////////////AwMD////////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID///// +///////AwMD////////////AwMD////////////AwMD////////////AwMD////////////AwMD/ +///////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID////////////AwMD////////////A +wMD////////////AwMD////////////AwMD////////////AwMD////////////AwMAAAAAAAAAA +AAAAAAAAAAAAAAAAAACAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMDAwMDAwMAAAIAAAIAAAIDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID/ +///////////AwMD////////////AwMD////////////AwMD///////////8AAIDAwMD////AwMAA +AID////////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgID////////////AwMD///////// +///AwMD////////////AwMD///////////8AAID///////////8AAID////////////AwMAAAAAA +AAAAAAAAAAAAAAAAAAAAAACAgID////////////AwMD////////////AwMD////////////AwMD/ +//////////8AAIDAwMD////AwMAAAID////////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACA +gIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAIAAAIAA +AIDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIDAwMDAwMDAwMDAwMDAwMDA +wMDAwMDAwMDAwMDAwMDAwMDAwMD////////////AwMD////////////AwMD////////////AwMAA +AAAAAAAAAAAAAAAAAAAAAAAAAACAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA +wMD////////////AwMD////////////AwMD////////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAA +AACAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD////////////AwMD///// +///////AwMD////////////AwMAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgICAgICAgICAgICAgICA +gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA +gIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgICAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACA +AACAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAA +AAAAAACAgICAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAgICAgICAgICAgICA +gICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgICAgICAgICAgICA +gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA +gICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAA9jwIFkAYAGOIFABMAAAADACAOfekFAB4AATABAAAA +FwAAAENocmlzdG1hcyBDZWxlYnJhdGlvbiEAAA0AATcBAAAAJeEFAAcDAgAAAAAAwAAAAAAAAEZ4 +nz4iJg8BBpAIAAQAAAAAAAEAAQABB5AGAAgAAADkBAAAAAAAAOgAAQiABwAQAAAASVBNLkFwcG9p +bnRtZW50AKMFAQ2ABAACAAAAAgACAAEEgAEAFwAAAENocmlzdG1hcyBDZWxlYnJhdGlvbiEAVwgB +BYADAA4AAADiBwwADwAJADEAFwAGAFsBAQkABAACAAAAAQABAAEAgAAApgAAAAQApgASAIQASmVm +ZnJleSBTdGVkZmFzdAAARVg6L289RXhjaGFuZ2VMYWJzL291PUV4Y2hhbmdlIEFkbWluaXN0cmF0 +aXZlIEdyb3VwIChGWURJQk9IRjIzU1BETFQpL2NuPVJlY2lwaWVudHMvY249MjI3ZGVjMzZkMDk4 +NDQ2NjlmNzhmYzk0ODllYjMxZGQtSmVmZnJleSBTdGUAAAAAAAAAAABxMgEGgAMADgAAAOIHDAAP +AAkAMQAXAAYAWwEBB4AGAAEAAAChoQABDIACADsAAABJdCdzIHRpbWUgZm9yIGV2ZXJ5b25lIHRv +IG9wZW4gdGhlaXIgQ2hyaXN0bWFzIHByZXNlbnRzIQ0KAMUUASCAAwAOAAAA4gcMAA8ACQAxAAQA +BgBIAQEJgAEAIQAAAENFODM4ODkwRTBFOEE2NERCNEVBM0MxOTk1ODQ2NTdGAEsHAQOQBgDkFQAA +cAAAAAsAAgABAAAACwAjAAAAAAADACYAAAAAAAsAKQAAAAAACwArAAAAAAADADYAAAAAAEAAOQBg +R0tehZTUAQIBOwABAAAAhAAAAEVYOi9PPUVYQ0hBTkdFTEFCUy9PVT1FWENIQU5HRSBBRE1JTklT +VFJBVElWRSBHUk9VUCAoRllESUJPSEYyM1NQRExUKS9DTj1SRUNJUElFTlRTL0NOPTIyN0RFQzM2 +RDA5ODQ0NjY5Rjc4RkM5NDg5RUIzMURELUpFRkZSRVkgU1RFAAIBQQABAAAAnQAAAAAAAADcp0DI +wEIQGrS5CAArL+GCAQAAAAAAAAAvbz1FeGNoYW5nZUxhYnMvb3U9RXhjaGFuZ2UgQWRtaW5pc3Ry +YXRpdmUgR3JvdXAgKEZZRElCT0hGMjNTUERMVCkvY249UmVjaXBpZW50cy9jbj0yMjdkZWMzNmQw +OTg0NDY2OWY3OGZjOTQ4OWViMzFkZC1KZWZmcmV5IFN0ZQAAAAAeAEIAAQAAABEAAABKZWZmcmV5 +IFN0ZWRmYXN0AAAAAB4AZAABAAAAAwAAAEVYAAAeAGUAAQAAAIEAAAAvbz1FeGNoYW5nZUxhYnMv +b3U9RXhjaGFuZ2UgQWRtaW5pc3RyYXRpdmUgR3JvdXAgKEZZRElCT0hGMjNTUERMVCkvY249UmVj +aXBpZW50cy9jbj0yMjdkZWMzNmQwOTg0NDY2OWY3OGZjOTQ4OWViMzFkZC1KZWZmcmV5IFN0ZQAA +AAAeAHAAAQAAABcAAABDaHJpc3RtYXMgQ2VsZWJyYXRpb24hAAACAXEAAQAAABYAAAAB1JSFROpB +O5YoiQNPfonY8L01ZCUyAAALABcMAQAAAB4AGgwBAAAAEQAAAEplZmZyZXkgU3RlZGZhc3QAAAAA +AgEdDAEAAACEAAAARVg6L089RVhDSEFOR0VMQUJTL09VPUVYQ0hBTkdFIEFETUlOSVNUUkFUSVZF +IEdST1VQIChGWURJQk9IRjIzU1BETFQpL0NOPVJFQ0lQSUVOVFMvQ049MjI3REVDMzZEMDk4NDQ2 +NjlGNzhGQzk0ODlFQjMxREQtSkVGRlJFWSBTVEUAHgAeDAEAAAADAAAARVgAAB4AHwwBAAAAgQAA +AC9vPUV4Y2hhbmdlTGFicy9vdT1FeGNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBHcm91cCAoRllESUJP +SEYyM1NQRExUKS9jbj1SZWNpcGllbnRzL2NuPTIyN2RlYzM2ZDA5ODQ0NjY5Zjc4ZmM5NDg5ZWIz +MWRkLUplZmZyZXkgU3RlAAAAAAsAAQ4AAAAAQAAGDsDASV6FlNQBAwAIDm/bBQADABcOAAAAABQA +Gg4CAAAAAAAAAAMAgBABBAAAAwAFMAAAAABAAAcwMB4FMIWU1AFAAAgwACcYU4WU1AELABYwAQAA +AAMACzYAAAAAAwDeP69vAAADAPE/CQQAAB4A+j8BAAAAFAAAAGpzdGVkZmFzdEB5YWhvby5jb20A +AwABgAIgBgAAAAAAwAAAAAAAAEYAAAAABYIAAAIAAAALAAKAAiAGAAAAAADAAAAAAAAARgAAAAAj +ggAAAQAAAAMAA4ACIAYAAAAAAMAAAAAAAABGAAAAADGCAAAEAAAAAgEEgAIgBgAAAAAAwAAAAAAA +AEYAAAAAFoIAAAEAAABQAAAABDAEMA0gAgAAAMBWBwAMAAAAAAAAABkAAAAjIAAACgAAAAAAAAAA +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 +AAEAAAALAHWBAiAGAAAAAADAAAAAAAAARgAAAAA6ggAAAAAAAB4AdoHu/8AAEREREb7vAKq7zN3u +AAAAAAWQAAABAAAAIwAAADQ0NDctMDdFMjBDMEYtMDE5Ri0wRTMxLUZGMTctMDA3MzkAAAIBd4Hu +/8AAEREREb7vAKq7zN3uAAAAAAGQAAABAAAA0gIAAEJFR0lOOlZDQUxFTkRBUg0KVkVSU0lPTjoy +LjANClBST0RJRDotLy9BcHBsZSBJbmMuLy9BcHBsZSBXZWJEQVYgT3V0bG9vayBTdG9yZSA0Ljku +MTAvL0VODQpDQUxTQ0FMRTpHUkVHT1JJQU4NCkJFR0lOOlZFVkVOVA0KWC1BUFBMRS1PTC1NQVBQ +SU5HLUlORk86MQ0KU0VRVUVOQ0U6MA0KQ1JFQVRFRDoyMDE4MTIxNVQxNDQ5MjNaDQpEVFNUQU1Q +OjIwMTgxMjE1VDE0NDkwNFoNClVJRDo0NDQ3LTA3RTIwQzBGLTAxOUYtMEUzMS1GRjE3LTAwNzM5 +DQpMT0NBVElPTjpIb21lDQpTVU1NQVJZOkNocmlzdG1hcyBDZWxlYnJhdGlvbiENCkRFU0NSSVBU +SU9OOkl0J3MgdGltZSBmb3IgZXZlcnlvbmUgdG8gb3BlbiB0aGVpciBDaHJpc3RtYXMgcHJlc2Vu +dHMhDQpEVFNUQVJUOjIwMTgxMjI1VDEyMDAwMFoNCkRURU5EOjIwMTgxMjI1VDE0MDAwMFoNCkJF +R0lOOlZBTEFSTQ0KWC1XUi1BTEFSTVVJRDpHRUVQLTA3RTIwQzBGLTAxOUYtMEUzMS1GRjE3LTAw +NzM5DQpVSUQ6R0VFUC0wN0UyMEMwRi0wMTlGLTBFMzEtRkYxNy0wMDczOQ0KVFJJR0dFUjotUFQx +ME0NCkFDVElPTjpESVNQTEFZDQpERVNDUklQVElPTjpUaGlzIGlzIGFuIGV2ZW50IHJlbWluZGVy +Lg0KRU5EOlZBTEFSTQ0KUlJVTEU6RlJFUT1ZRUFSTFk7QllNT05USD0xMjtCWU1PTlRIREFZPTI1 +O1dLU1Q9U1UNCkxBU1QtTU9ESUZJRUQ6MjAxODEyMTVUMTQ0OTA0Wg0KRU5EOlZFVkVOVA0KRU5E +OlZDQUxFTkRBUg0KAAAeAHiB7v/AABERERG+7wCqu8zd7gAAAAACkAAAAQAAAC8AAAAiQz0xMTFA +VT0zZDBiZWFjMS03YmFlLTRmOWUtODY0My05ZTk5ZWMxM2NkOGUiAAAeAHmB7v/AABERERG+7wCq +u8zd7gAAAAAXkAAAAQAAACMAAABHRUVQLTA3RTIwQzBGLTAxOUYtMEUzMS1GRjE3LTAwNzM5AAAe +AHqB7v/AABERERG+7wCqu8zd7gAAAAADkAAAAQAAAB0AAAB0ZXh0L2NhbGVuZGFyOyBjaGFyc2V0 +PXV0Zi04AAAAAB4APQABAAAAAQAAAAAAAAAeAAIOAQAAAAEAAAAAAAAAHgADDgEAAAABAAAAAAAA +AB4ABA4BAAAAAQAAAAAAAAALABsOAQAAAB4AHQ4BAAAAFwAAAENocmlzdG1hcyBDZWxlYnJhdGlv +biEAAAsAHw4AAAAAAwD0DwIAAAADAPcPAAAAAAIB+A8BAAAAEAAAABcAiGJlXC9Cvo+oEmOizSoC +AfoPAQAAABAAAADsrpQt9FATRJCTg17rdQfwAwD+DwUAAAACAQkQAQAAANQAAADQAAAAUQEAAExa +RnUrm9DrAwAKAHJjcGcxMjUiMgNDdGV4BUJiaf5kBAADMAEDAfcKgAKkA+T/BxMCgBBzAFAEVghV +B7IRpScOUQMBAgBjaArAc2XcdDIGAAbDEaUzBEYUN94wEqwRswjvCfc7GJ8OMHY1EaIMYGMAUAsJ +AWQzDjYW0AumAzBvYmphgQJAcGggSXQnBCCadAdxIAIQBcBldgSQBnkCIB6QdG8gb3AjCfAeUGhl +aQXAQ2jZBRBzdADABCBwGKAUkFkCMHMhCqIKgH0iAAMADTT9P60OAwAPNP0/rQ4CARQ0AQAAABAA +AADpL+t1llBEhoO4feUiqklISusCApAGAA4AAAABAAAAAAAgACAAAAAAAEEAAhKAAwAOAAAA4gcM +AA8ACQAtADYABgB2AQITgAMADgAAAOIHDAAPAAkAMQAXAAYAWwECD4AGACm5BQD/2P/gABBKRklG +AAECAQBIAEgAAP/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEO +CwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQU +FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/CABEIA6cFegMBIgACEQEDEQH/xAAd +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 +CJMSgVdutaUqL41dW7NiLOQzVyJLFVc5N2MWMkHKxjO47WLUxvn2jvkY48a1j3FdX2cFlM05T3Ca +t+OSw+h+pahTYtTXxzo6Ol0OLT0bdWk8mbuOz9A8q7mvP9PT+d9JvMPEpocm6zlgj7NBpmkE0fi3 +11wdHNsV2TKJYmLq8oCm3AIkmYElxYNE6pBpeZmVPlHZIYkFMRnSWaGqOlp9SFTO11fJtOr9h+U+ +pc+3O6xMtNipXTOBdnHt8nJp7N3jbXya49iUOQ5Wl1HIcj69zT6FUhfXuZkbAZIEbqFDUpBsUaTB +4AADIDBAgBBKEmABGQAyBAZAgABIABAEmTDANIGDAGFARgxkAYAwQAgEAAMBJ51M3fMOx28PmFrM +p0YjhfQsP5fN0fpvlfqXUuYJ1GRltQZ8BOWxEla22hddbffr39Cyl1pYT1PtXEtLPdsNpjZkb3yG +mE5qxUtXBRYbLiVmlta+Xi7LSNErOWIWRVcAdjn3K/DW2hQkZbXRU5TVxGjtp2dO5FHOlZubjrZo +ZRUTFVjWsO08itGzQzqjSIcZyOlYu1h6ZSstEaXp19To799/Pi0tVtxxotm85pT1efeUPbZFnbyv +Z+++efoa+X0MShUICiAo0rKIkWGMjBxVnMdolcbx3WuZUQyNcy0bykMJcZpqn170p1IlRDcSZFdO +tyoA5LkaQ8wzKiiNxt2LfciXUuoj6KuuOn6TieoWnVWKHOWdT3dn5aZ1rjmMkzi6idqs10W75t0p +dG012Gk9daXnmS6dE7dmDaaWsyFCjrp4KNChPmAMgCGAQAIWlBAACJRAkjIAAlCiBAYIMABgDM0E +ZhoGDTIzMCMwCSMAQDCGZvJoUY9h8o9WqMJwHp7x9frLquq86zVvC12LfjNzC9QwPPpGzVzCuWVo +g6udEfrbVl0ble30zrK7p2Ois1CkR62uOvcut706XoeY6Li7eiSae4jQSK15phiTAVHV2tLnrZMI +gJ2Muus6l1yC4FhKrkiEJmix6L2HSpnSzfr4CrRXWNvQlMV0JPTyM8aLw6xGmdvRuV2kxaK9p9M6 +ZKqys5+dZUvZXHV2Q7+P6TqHn01vKKZ0Y1znSqrU83t3vGOu5baOCwNdl+v4mEJEbp8PvHpr51+r +dOPs4WKjO+b+xFM+d8/7R8WxnufV3hj0k9KHj3aPNWgytlUog2tuUhs4SQHGnbin0mE0LRTqIcyD +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 +ma3EaSO66cgFh9LaHVFn3WpU7YtAig2mePe+r+YfQnkfNX/iP2Ngu7HOcA9j+deP0Oe0qq/6HjjH +YPTnVu2kqNUWVC9GctxV3vzZSB0l7p5+RsdijwuRDrFilxZvv0lnna07rAT5DVd/WlwIegJA/OLf +pM9Dzw16HZzPPB+hWGcHR25qFzJjrkJLiI7Szscja6vGlc7u9XYKcxVdQzMZc7g9vY16eMabcrF2 ++r3Tfk+pyU9pmeTvyzDFnO2dI2aItZPp98tBVN2qcOP6a5918nP9hg+ucV4i41vJtdtC7htp09Gh +e52UxcU7VBr7uhYoW71vGKVt8tvHrbauBvc9v6Lt8/42qvSkfj8Pgz3qU+jfx7V+zMma+e8t6Ymq +fLML1hEqvNth2fkmPPZVlOmikF407gC4Im1RQwZdtApr3S6odDVnlzuRu2wy7epQlCiTK5j8SLDu +rV9FZUtRVah757UsZ+CdGfTRWp1M2XEjS3IWeha6DbpZNiyyrsVW0LON3s8MI5sHLMoeldc5pe2p +B5pN43VJiW7smXj75ZXP7q7eJgQNwys+eJ6fcXpxhPcXHXCGvQTg/Ow9DJl+fld+UjiT/bllcQV3 +F1nDl9yrpOTjqrlb8aRqMrHehmKzUybKhOcOu+j+DeiPmeqwrsRRXl2XnkYtTBo6RI+i4uXu9SeD +l0zpb4+fT94+LFStk7U5J7WLFlndObWbXpDazq9CGqBd4bKJV2QqU7gBUHaGFUdoTVWLMDqytSFW +CzAVhWoFUlbqCka0BhQO3RhUOWZsqk3BMfYOLnomA5BiuV8q9NweDs843Xa2qOQZH0Sma87XHb3G +YVW8V0c3PldAooed511jIef15J+2h9+eao9bS1tWCcq9a9NxMFmn9lq3lS92wF9fLtl5qz0xtnmb +Eht6XJagu2DzVOu5UlXKsDZV0+sOTJv6UkZGBvAjk9H3MI5E91YBySh7wA8gr9djHn8juetBT8mJ +9aJT8nyPVJ1fk4/WJUcGuewCXw4+4FL4i52oN8Vk9gS1y1fTUW8E/tCp5R7SE1nE6QgzkDYFLyND +0skcsmdHJLn1vqjp5NOuOjFxt6E+cROpGjl03opDw0jYhrJO6twMorWqZk16wwyy9QYZY9QGZlOp +MMgztgPBRujEnzCv6+E+DUfpVM35KgexRNeKKj3YJXgY/fIR4h656CRx7eerft54VyY+su+rzcvn +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 +uq6Loui6LxrxrxMvEy8ArwCvAK9MK9MK9OK9OK9LG69BXdeigZeliQ1YhLoy0tLS0tLS0tLS0tLS +0tLS0tLX01/PpaWlpaXVaWvrr66WlpaWl1WlpaXVdV0XReNeNeNeJeBl4F6demZelFekFejBeijX +5fEvy6JflkC/LYV+Wwr8vhXoYk1SNl6cF4RXjZdGXRdV1XVdV1WlpaWlpaWlpaWlr/raWl1XVdV0 +XReNeNeNeNeJl4mXiZeJl4mXiZeNl42XRl0ZdGXVl0ZdGXRl42XRl0ZdF1XVdV1WlpaWlpa/k0tL +X/b1/Pv+zpaWlpaWlplpab/oa/7GvppaWlpaWlpaWlpdV1Wl1XVdV1XVaXVaXVdVpaWlpa/n0tfT +X10tLS0tLX9/2XsvZey9l7L2/wBDtbW1tbW1tbW/5tLX8+lpaWlpaWlpaWlr/pdmZ+4p303lBf47 +Mm911WlpaWvppa+mlpaXYWXlBMQutLyDvS1/0PIO/wC7v67W1tbW1tbW1tbW1tbXuvde69/ppaWl +paWlpaWlr+fS19NLS1/29LS0tLS0tLS19Nf6d/Zpb8cajyMZuQBK0xlBO4AcczlDNodWIjK1HEMI +f23bs08ARxUv6i3NT0MVt5a+NEZ2+rv1aCXzN/a2pj6xUGGxLtZK29c43LxbW/7OlpaWlpa/k0tL +X8mv+ttbW1tbW/rv+xpaWlpaWlpaWv8Aoa/k0tLS0tLS0tLS0tLX/auyERtqvI8pHZqu8FjKwrGT +eSteZ5Vjp/JVhLRgUltU5ye2dsxs2r7i0s0jV4rrlBRuvJN55bD0rxyyhcIbdi+YLfttW3/Qxf8A +9hIXWOD3lpT+GvRtlJZs2nEp3sVVJM89bFMcjTWSKSaSem/qmeCPyWgp2DKWK47TndMZp7BPLcM6 +itzFELWpJY4LXnipS+AattyuXZZa6af+m7WLAY+288v+h2t/T3Xv/LpaWlr/AHulpaWlpaWlpaWl +paWlpa+mlpaWkfwyIy+nyISib/vyU8Xliry+lMa+6Veb0r2meCrWmCPH473yV0e9uSqEpXf+HDxt +45YBq1aTkcUMIVgeNpcnmvdm/arf/Bjmd7skFmZHWGrTxAN1p/8A2nbpk7rM8FNv/bsR/wDFrn1y +WRZngbbYwJwGljP/AJkEbS5I4BaWhILWspI0jZD/AIMa/XGwNu7ihYrAf/b5b9kxax9EmemzCK2t +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 +m5fmxaMI+Divg+q04wSlEhq8UR13eTTdrkNi3/QyL4q0VSpF44o6GvbxHKPku1grBaE2Ldyycj+h +91s8CXk6OVf55SUFbI6sJdM5U87amt6T4oX1ji6miGrFyflMlCnyXRJZL/4kLzYsifgmk0LCyVy7 +Kr8Rjoa2s72ookiMcnFIW1WUWLLKJtKWDn8Uejqy/wBiOlx8k4av+jP+qlFU1k1NSWo7ltB5NP8A +CjyPvG1qJbfRWCVXRYvjaUm3gUPDK+N+i3taQ6Yq2js87dmF/lldYNPVlozyfU60XBV5M3g0ZazW +GT19XSdIjLmPSbZCXA8EmxdUXYirZdke7Fs0JeGSGVYt2VZRJGV2WRkUmOJBZJYZKkiLhq+2XZ6W +po5gyH1i/wBkf9Vp1ZqarnKxtyKNHT5ZFtbRzTFbLd0TeKQlxR/Qo0TZVC2eSKUfsSaw97Irzvli +HH/LranpQ5HH2+pLyNuyEHKSHJaePBa1JEtFJ2cU+j003kgkdyHk4kSWMmChWuzveUaGvvcqE7ON +npji0QY0JElkmdEfqHVDdu/t0Y0t8WY6G3eBHFicmRReaOXJ/wBEVeRtGPJaORf2NbUJbJFroop/ +dFqStDfE5e/j9v1SvTNTUv2+DjZo/wDa9xN4cn2aM6lbFqfJf/EqxYL91lllo8ER5Mp0dbscRx+6 +TSIveiuLFkTGrR6fInofA0VQlbHpSeELR4xyacOUjTTSyW7pjOxY2fQysHJdIn8sjnb9fZR+jrvb +syt1RZ5++X/cfFdHRLof5xZJXg0tRx/7cjlHlwsm+KJ60aHp+CuI26yY6ZHTSZFYERzk6IdlJIlj +KFl0PBXkfglGzLWRbUUNDW62kl2y0uj1SOopbMSOORFFD01LwPQQtLiyMl0Ti5OiEVHGzyL9dlfJ +jeuTMiwNcnkSS62p+BNrs738jrboZe1mfg7IO19s9bi+NEr0Y+1WepFq0equmLMXEU0+yd82zTS9 +TlM1HdGorolp8hwfkl0aWlB5kamnn2kI3GvJFs6R/ZwVCvyP4I4JvAx9rayjJZyW726Q8jRxZlFJ +5IlFFfZW9Eva+RLKx2RfJGVs3yiJt5JN1e7ihRvplUJRfk4/sS/e/wCxvdNLscol/IrfRHvO1iIF +7P8AZfyaqm3zFqPwMlFxOeLFJvI5D9wsf0R+GdD1HLBOGckJcXkdiZV5I4Zd9FtCdjRhEmnGhfbf +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 +vqVK+ivoqVKlSpUqVKlSpUqVKlSpX0qVKiDaYF5AyOKWc0lg4GdCxKHwZzdBknnh6wO0w1kdx9/8 +mY+adq1knrj3mUfq5F8/KOebk1cBP6yy/lz4lur7c4uUrW4MQ4ah9jUu4pOhs5ExgwtsYq0dwUxf +Fy4VzpUW9PaaQSsTqMwo+SmJa3FYK8H9wjkPlKlNzrIgvVekEDwBR6fRG50sMuzy8lZG8eIaBNJM +kqTypQyOKCc05BsjnhroYqj2lJpWWuo9v9l4xE/biAdZlJ4sK+ZjF4RiKlx8jqvMD81bHRviVHIB +KeltVCHa5h28QGYnKHXvNP8A2V/1BiAFoTlo7Cgcji0FgxSVuKn018x2i2s132qG8EMypyNeiXiJ +uq0Ka066xl3L3X3hM7oaBohxDbwLKcH9yjYfS+0KJAAaNeZZo36MVG13Sj0I2WFySggyOEKc0lg2 +fzAr6KJUogCW06GzkTFhhbYxVpUqVKlSpUqVKlSo6UZlZBBkcAs5pLBslSpX0qV9a+lQdJpMbORM +WGFtjFWlSpUr6VKlSvpUqOlmdWQQZEoFOaSwbJUqVKlSpUqVKlQVLadDZyJiwwtsYq0qV9KlSpUq +VKjiVHSwuaUEGRwCnNJYNn0r+FfxqCILTobORMWGFtjFWkqV9alSpUqVKj5YXqyCDI4BTmksGyVK +lSpX1qV9Qktp0NnImLDC2xirT+VS/wCFRI1wwh0pae4Pb6WIuXLhSX9Fy5f0uXL+mfpmUypVlTrs +yvKzPWKsE8HL1/8AIAePmvMYxUNJnZRSuvJ73KlSpUZlahgFha4ylSpUqVKlV/CvrUr61/8APUqV +9KlSvpUqVKlSvpX/AIV9a+lfSv4VK/jUr619a+lfSpUr6VKlfWpX0r66/jX/AIVKlfSvpUqV9a+l +SpX0V9FfUqVKlSpUqVKlSpUqH0V9a+tfxvYB1sIvY/m/L/yEQJQDAfU+mDYa/A5jALBpQ+n8K/jU +qVKlfxqVK+lfWpUr+NfSv/4upX0qV/6V9agfx//aAAwDAQACAAMAAAAQlvHp6iiGW+47CHL2CCTH +HWD/AB16s6+3xwx6ErFn3rzr5oITRTYhQRgtjQrTPe8ZxfwO3DzhCweaQUgOl/HbPzwUyQ+zVpF+ +4vwls9gzTChZutrzlDSLlgiwN4XEt4taAs7eswZUu3N1cOJLTtpw3BXl3nAIOKmvpbzXWxhgl4d0 +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 +/wDAV7yMAMS//iE/8n/6AT/+fMmIOAOshbiUcIzTEh6/8mJJ9/8AnOSc5MiYkMCzxh6YnOsTGjI3 ++snjAhcnrNGf/9naZgIQgAEADQAAAEtJVFRFTn4xLkpQRwCNAwIRgAYAuA0AAAEACQAAA9wGAAAA +ACEGAAAAAAUAAAAJAgAAAAAFAAAAAQL///8ApQAAAEELxgCIACAAIAAAAAAAIAAgAAAAAAAoAAAA +IAAAAEAAAAABAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAIQYAAEELRgBmACAAIAAAAAAAIAAgAAAAAAAoAAAAIAAAACAAAAABABgA +AAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAkZCPkI+Oj46Njo6MjY2LjYyLjIuKi4qJioqIiomHiYiGiIeGh4aFhoaEhoWDhYSChIOBg4KB +g4KAgoF9gYB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkZGQ+/v6+/v6+/v6+/v6 ++/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6+/v6goF9AAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkpKQ+/v69/b19/b19/b19/b19/b19/b19/b19/b19/b1 +9/b19/b19/b19/b19/b19/b19/b19/b1+/v6g4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAk5KR+/v79/f29/b29/b29/b19/b19/b19/b19/b19/b19/b19/b19/b19/b19/b19/b1 +9/b19/b1+/v6g4KBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJOS/Pv7+Pf2+Pf2 ++Pf2+Pf2+Pf29/f29/b29/b19/b19/b19/b19/b19/b19/b19/b19/b19/b1+/v6hIOBAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJST/Pv7+Pf2+Pf2+Pf2+Pf2+Pf2+Pf2+Pf2+Pf2 +9/b29/b19/b19/b19/b19/b19/b19/b19/b1+/v6hYSCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAlZWU/Pv7+Pf213YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA +13YA13YA9/b1+/v6hoWDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlpWV/Pv7+Pf3 +13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA9/b1+/v6hoaEAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5aV/Pz7+fj313YA13YA13YA13YA13YA13YA +13YA13YA13YA13YA13YA13YA13YA13YA13YA9/b1+/v6h4aFAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAl5eW/Pz7+fj313YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA35g8 +13YA13YA13YA9/b1+/v6iIeGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJiX/Pz7 ++fj313YA13YA13YA13YA13YA13YA13YA13YA13YA13YA5qte2YAN13YA13YA13YA9/b1+/v6iYiG +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZmY/Pz8+fj413YA13YA13YA13YA13YA +13YA13YA13YA13YA4Zo+67yA13YA13YA4aBL13YA9/b2+/v6iomHAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAmpmZ/Pz8+fn413YA5Khb13YA13YA13YA13YA13YA13YA3Ike+u7f2YAN +13YA2YAN9u/n13YA+Pf2+/v6ioqIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm5qa +/fz8+vn413YA9/Ho3ZAs13YA13YA13YA13YA13YA+ObP6LJt13YA13YA7s+p+Pf213YA+Pf2+/v7 +i4qJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm5ua/Pz8+fn413YA+vn48+HK2YAO +13YA13YA13YA8Myf+/r57Mia13YA5rBq+Pf3+Pf213YA+Pf2/Pv7jIuKAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAnJyb/fz8+vn413YA+vn4+fj47Mib13YA13YA4Jg8+fj4+fj4+fj3 +7tCq9/Do+Pj3+Pf313YA+Pf2/Pv7jYyLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +nZ2c/f38+vn513YA+vn4+vn4+vn45Khb24gd9/Ho+fn4+fj4+fj4+fj3+fj3+fj3+Pj313YA+Pf2 +/Pv7jY2LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnp2d/fz8+vn513YA+vn5+vr5 ++vn4+PHp9ena+vn4+vn4+fn4+fj4+fj4+fj3+fj3+Pj313YA+Pf2/Pv7jo6MAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAnp6e/f38+/r513YA+vn5+vn5+vn5+vr5+vn4+fn4+vn4+fn4 ++fn4+fj4+fj3+fj3+fj313YA+Pf2/Pv7j46NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAn5+f/f38+vr513YA+vr5+/r5+vn5+vn5+vn4+vn4+fj4+vn4+fn4+fj4+fj4+fj3+fj313YA ++Pf3/Pv7kI+OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKCg/f39+/r613YA13YA +13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA13YA+Pf3/Pv7kZCPAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoaGg/f39+/r6+/r6+/r6+vr5+vr5+/r5+vn5+vr5+vn4 ++fj4+vn4+fn4+fj46eno6ejn6ejn6Ojn7OvrkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAoqGh/f39+/v6+/r6+/r6+vr6+vr5+vr5+vn5+vn5+vn4+fn4+vn4+fn4/Pz8pqamjIyM +jIyMjIyMjIyMkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoqKi/f39+/v6+/v6 ++/r6+/r6+vr5+vr5+vn5+vn5+vn4+vn4+vn4+fn4/Pz8pqam6+vr6enp5eXl09PTjIuLAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo6Oj/f39+/v7+/v6+/r6+/r6+vr5+vr5+/r5+vn5 ++vr5+vn4+vn4+fn4/Pz8pqam7+/v7Ozs2dnYjo2MGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAApKSk/f39+/v7+/v6+/r6+/r6+vr6+vr5+vr5+vn5+vr5+vn4+vn4+fn4/Pz8pqam +8vLy3t3dj4+OGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApaWl/f39/f39 +/f39/f39/f39/f38/f38/f38/fz8/fz8/fz8/fz8/Pz8/v7+pqam4ODgkZGQGhoaAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApaWlpaWlpKSko6OjoqKioqGhoaGgoKCgn5+f +np6enp2dnZ2cnJybm5uam5qampmZk5OSGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAWjcCBZAGAMgBAAAZAAAAAwAgDtvHBQAeAAEwAQAAACkA +AABraXR0ZW4tcGxheWluZy13aXRoLWEtY2hyaXN0bWFzLXRyZWUuanBnAAAAAEAABzCg6d3hhJTU +AUAACDBA+UpehZTUAQIBAjcBAAAAAAAAAB4AAzcBAAAABQAAAC5qcGcAAAAAAwAFNwEAAAAeAAc3 +AQAAACkAAABraXR0ZW4tcGxheWluZy13aXRoLWEtY2hyaXN0bWFzLXRyZWUuanBnAAAAAAMACzcA +AAAAAwAUNwAAAAADAPp/AAAAAEAA+38AQN2jV0WzDEAA/H8AQN2jV0WzDAMA/X8AAAAACwD+fwAA +AAALAP9/AAAAAB4AC4F/fzWW4VnQR5mnRlFcGDtUAQAAACwAAABBAHQAdABhAGMAaABtAGUAbgB0 +AE8AcgBpAGcAaQBuAGEAbABVAHIAbAAAAAEAAAABAAAAAAAAAAMAIQ6lMgIAAwD3DwAAAAACAfgP +AQAAABAAAAAXAIhiZVwvQr6PqBJjos0qAgH5DwEAAAAEAAAApTICAAIB+g8BAAAAEAAAAOyulC30 +UBNEkJODXut1B/ADAP4PBwAAAAMADTT9P60OAwAPNP0/rQ7baAAAAAIBAjcBAAAAAAAAAAMABTcF +AAAAAwALN1AHAAADABQ3AAAAAAMA+n8AAAAAQAD7fwBA3aNXRbMMQAD8fwBA3aNXRbMMAwD9fwAA +AAALAP5/AAAAAAsA/38AAAAAAwAhDoUyAgACAfgPAQAAABAAAAAXAIhiZVwvQr6PqBJjos0qAgH6 +DwEAAAAQAAAA7K6ULfRQE0SQk4Ne63UH8AMA/g8HAAAAAwANNP0/rQ4DAA80/T+tDsSt + +------=_NextPart_000_0001_01D4945F.67C9A820-- diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 6232933d32..750bc57159 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -933,6 +933,73 @@ public void TestExtractedCharset () Assert.AreEqual (expected.Replace ("\r\n", Environment.NewLine), html); } + [Test] + public void TestRichTextEml () + { + var message = MimeMessage.Load ("../../TestData/tnef/rich-text.eml"); + var tnef = message.BodyParts.OfType ().FirstOrDefault (); + var timezone = new TimeSpan (-5, 0, 0); + + message = tnef.ConvertToMessage (); + + Assert.IsNullOrEmpty (message.Subject, "Subject"); + Assert.AreEqual (DateTimeOffset.MinValue, message.Date, "Date"); + Assert.AreEqual ("DM5PR21MB0828DA2B8C88048BC03EFFA6CFA20@DM5PR21MB0828.namprd21.prod.outlook.com", message.MessageId, "Message-Id"); + + Assert.IsInstanceOf (typeof (Multipart), message.Body); + var multipart = (Multipart) message.Body; + + Assert.AreEqual (6, multipart.Count); + + Assert.IsInstanceOf (typeof (TextPart), multipart[0]); + Assert.IsInstanceOf (typeof (MimePart), multipart[1]); + Assert.IsInstanceOf (typeof (MimePart), multipart[2]); + Assert.IsInstanceOf (typeof (MimePart), multipart[3]); + Assert.IsInstanceOf (typeof (MimePart), multipart[4]); + Assert.IsInstanceOf (typeof (MimePart), multipart[5]); + + var rtf = (TextPart) multipart[0]; + Assert.AreEqual ("text/rtf", rtf.ContentType.MimeType, "MimeType"); + + var kitten = (MimePart) multipart[1]; + Assert.AreEqual ("application/octet-stream", kitten.ContentType.MimeType, "MimeType"); + Assert.AreEqual ("kitten-playing-with-a-christmas-tree.jpg", kitten.FileName, "FileName"); + + // Note: For some reason, each task and appointment got duplicated. The first copy is attached as a + // TnefAttribute.AttachData and the second is a TnefPropertyId.AttachData. + var task1 = (MimePart) multipart[2]; + Assert.AreEqual ("application/octet-stream", task1.ContentType.MimeType, "MimeType"); + Assert.AreEqual ("Build a train table", task1.ContentType.Name, "Name"); + Assert.AreEqual ("attachment", task1.ContentDisposition.Disposition, "Disposition"); + Assert.AreEqual ("Untitled Attachment", task1.ContentDisposition.FileName, "FileName"); + Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), task1.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (9217, task1.ContentDisposition.Size, "Size"); + + var task2 = (MimePart) multipart[3]; + Assert.AreEqual ("application/octet-stream", task2.ContentType.MimeType, "MimeType"); + Assert.AreEqual ("Build a train table", task2.ContentType.Name, "Name"); + Assert.AreEqual ("attachment", task2.ContentDisposition.Disposition, "Disposition"); + Assert.AreEqual ("Untitled Attachment", task2.ContentDisposition.FileName, "FileName"); + Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), task2.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (9217, task2.ContentDisposition.Size, "Size"); + + var appointment1 = (MimePart) multipart[4]; + Assert.AreEqual ("application/octet-stream", appointment1.ContentType.MimeType, "MimeType"); + Assert.AreEqual ("Christmas Celebration!", appointment1.ContentType.Name, "Name"); + Assert.AreEqual ("attachment", appointment1.ContentDisposition.Disposition, "Disposition"); + Assert.AreEqual ("Untitled Attachment", appointment1.ContentDisposition.FileName, "FileName"); + Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), appointment1.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (387453, appointment1.ContentDisposition.Size, "Size"); + + var appointment2 = (MimePart) multipart[5]; + Assert.AreEqual ("application/octet-stream", appointment2.ContentType.MimeType, "MimeType"); + Assert.AreEqual ("Christmas Celebration!", appointment2.ContentType.Name, "Name"); + Assert.AreEqual ("attachment", appointment2.ContentDisposition.Disposition, "Disposition"); + Assert.AreEqual ("Untitled Attachment", appointment2.ContentDisposition.FileName, "FileName"); + Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), appointment2.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (387453, appointment2.ContentDisposition.Size, "Size"); + } + [Test] public void TestTnefNameId () { diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 52dbc7b3a6..e155325078 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -289,6 +289,7 @@ + From 84c8d2d18aaa7949451af3c6c10f8653334265f3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 16 Dec 2018 12:12:12 -0500 Subject: [PATCH 194/741] Added another tnef test --- UnitTests/TestData/tnef/christmas.list | 6 ++ UnitTests/TestData/tnef/christmas.tnef | Bin 0 -> 821421 bytes .../tnef/christmas/Untitled Attachment.1 | Bin 0 -> 6524 bytes .../tnef/christmas/Untitled Attachment.2 | Bin 0 -> 6524 bytes .../tnef/christmas/Untitled Attachment.3 | Bin 0 -> 385317 bytes .../tnef/christmas/Untitled Attachment.4 | Bin 0 -> 385317 bytes .../kitten-playing-with-a-christmas-tree.jpg | Bin 0 -> 375081 bytes UnitTests/TestData/tnef/christmas/message.rtf | 55 ++++++++++++++++++ UnitTests/Tnef/TnefTests.cs | 19 ++++-- UnitTests/UnitTests.csproj | 8 +++ 10 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 UnitTests/TestData/tnef/christmas.list create mode 100644 UnitTests/TestData/tnef/christmas.tnef create mode 100644 UnitTests/TestData/tnef/christmas/Untitled Attachment.1 create mode 100644 UnitTests/TestData/tnef/christmas/Untitled Attachment.2 create mode 100644 UnitTests/TestData/tnef/christmas/Untitled Attachment.3 create mode 100644 UnitTests/TestData/tnef/christmas/Untitled Attachment.4 create mode 100644 UnitTests/TestData/tnef/christmas/kitten-playing-with-a-christmas-tree.jpg create mode 100644 UnitTests/TestData/tnef/christmas/message.rtf diff --git a/UnitTests/TestData/tnef/christmas.list b/UnitTests/TestData/tnef/christmas.list new file mode 100644 index 0000000000..77c480de77 --- /dev/null +++ b/UnitTests/TestData/tnef/christmas.list @@ -0,0 +1,6 @@ +kitten-playing-with-a-christmas-tree.jpg +Untitled Attachment +Untitled Attachment +Untitled Attachment +Untitled Attachment +body.rtf \ No newline at end of file diff --git a/UnitTests/TestData/tnef/christmas.tnef b/UnitTests/TestData/tnef/christmas.tnef new file mode 100644 index 0000000000000000000000000000000000000000..40a3f33c917a0fa56a552fa8551320c26ed7a599 GIT binary patch literal 821421 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

XIoktRo!onvJR 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

3uX*hU1N6)k6l!M;!I-#|X7Wa>{hagS0I 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

@pO_ZiIbL@-nD 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

pgSffUb7so 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

s`?XIk}x7%xt5~ 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

4i9u4_xP0F zK@Py0T4}tbi$XHU2Q`Edw7yJ4c|hhtUP^3tq@#_{I!8FU<3_gMs&+5Yn6rSKobAF$ zd!yYapEOQ02IE(6Y{iOoseUN^+x7$&c}_vgiByTX2R1 zZu5%SM(`d*+)>R(cq$I@`6>lY992z#Rd~r5y$|NI4&c!6Rpr%PwN|57GtBmQ_IP$! zDysWKz1q|iobyqtnx>a;bX&G@vY|O!#PdwtvL62Z{{Z$pe~mGDwXGD=(y?+u{EJ{p1b*0Nm6if=105 z_Lytf>Wa3P1v3mLd_Iqn=Vs%>rBO1N*-vglsp$MXxPih)ZbqdZnZ(By6@xxV8OQjF zigB36*HnOSPD*?@#^M^vS_Zy{FHnq7=K4G15=Wn2p*O2S$~77)OaUB4Rz?M|hBrp< zZRF~g81%$*dB4Ug=pLGcm%)n&u9QGIv8wNjwJ>`9~8~S6QnpLn!Cj ziufB3I+Orh*Ca(2fqj_sL!xf^@K$hW<5gCW>K5uM^;d znKS2Wg&y)W@aDdahC4v_0!=jO;D|5C^q@HpsJ_^O3w2`$y)SG#71u!r;kPG+-4eb*JXJRjns2=w?o*>ES`{)35Pd~ zJe`(m{=8Jf5a+nZ-h6M`0p=6-c*#Uuvsn|GuBvyzSy7|S4779o?g49=-GOFzahFbW zrE4>2IMHZi{v|<1j!hI*&<;J0AW*whX?0VpuC}t;mlag*LCJ68DADY(QJK$Dt=X99 zw+EWFPgP;@M>Lx7Xj_qw7c0Nv*lA@^yti9X%?D=yjt8;SIgd5^DhdT&D_1!^(Z=V7 zi;y%|?4q`TPUs&qw? zF@@R!oN+KZD{H7I;_$eS?AgupMcsFcQD#30w`+g+oE^uBZv+Qewvj06`m<- zdn+zAqGRkyCFr~L0@+$BgK+VBrku~d@$yBl@K4DhWUUo#Etz3wl2^?A;Nv5!LBJ+B z)EZG`&6=E3tEUdYoy{?tW$cy$GZybOFQUBEkF#=gZwn#bugw#$MSjLNnE_&5?@I5* zO9A%xhlu_}tj2}Ib^id9ywy0O+_dPhn3o!fLu>p%(EeW)h!Hfm);MOTRO;I{@E$7e ztN#E6o8aeui!FDfSyj8dI=r!ZJMRM=pkI@gfqoXO=6 zbY}VP9E6XI1Z)h~0X z>Yp@shG$aF9aE1=154|{W`^-W2!y!tH$VNzQG~fQ#2Y5iE0vZJa;od5>?$Hx0VmVyH-TL&W!3wu4-ST?zt}V*ZyhEcNIKU-K|=zY1J5|`&N9@k7Wp1o;$o2 z$TMRPGpZZ8`5LD_N0?dN5wO$Zn#khWI3KhYDa2D4--ExJj#yaJ9B0;lnIDMcn}w0t zXBK0}w71+{R9xmUl7VN|pA_0}KZQR9HV}75AH1Rz_HI1W%dSAxT2G1^9|fTWTvE0@ ztalD6#hPZ!5XVQrZ-B0gqC4K|64sT|`*=Rb-Mk8rfrw^8C)(X*6gdpHBd zzo(MjHDiT}4Ry${Do77~r)?LA?+-Em0JJPi9VND|-20e}U=%}*sSMI8v6?&l2W{Z-tM$$($rO#A1D14Rp=y|Out?=xvGkB`&(Qj(2nD{C% zH_d5Z1-(|4cb|&&d#aRmd9($l)5OtL+Hh@ZwbEMmTTi9RTyAr^p=6o6LU@ZOM%Nf(CZsn~ zfN1)fmAhs9ML3eE6gYOjAar|K8q@7Mzx}jEsu^XEZxdb%qjwO1W(FK2Q3^Cg_^Ywb zcM27m*_z|QQO;;;p?yI1TB$;)#!zu9aFb1Hs%zGX+Xm&TuB&TH8*62q@|=NXj8OI9 zt?}$U7~82aa(5%qI%zd|saazm$R|Sp+dS^NPtk8!a$Br)uH~azy<>pru1Q;)wLtaN zT>X9>R+MKVi@B}X5pmkj0F_2BmppJU*Y?BwI_yMg|>qa2p}mC$=l z94-plS%zR9-h_Zi`Kevj=GK?Uf(sss_hRR3#TsM=Bv5>q-&AGqpquv_yU9JLz;vq&wRo8 ze3koT+|1_<*L$a$VVSw{4er-R4!^3VKuc=Y#5cY!MFc-!!CJLfmt?YPT}pHu5mZea zd7=rS;Jf7p`$pweWd@T2dgxot3_Jjn#Enq}l>Q}c7GC6>ITTrxj&xfhDAxlS2jbK5 zOo$E0{{R(aPc3^G#$C^_3JeTd0aqSr%`Gh)*U{qc`)>D@g$Hea1-#%qO7CX=5R74` z#GkKT%Kc7=TFQe|8U^dBH9l&>tB~l8?gHM`JL+lw05CDI2Hcn9P)=O}VDmh^j9)%8T8pHBRwC*IU$Yf^(X5_m=cm`=~OM zb8M@`6dlb?4>6c{r_Adyrk*7>y`5G`eQP@Ep60hBPJvC&JHH;>zS!=bW0K14I37yr zu{qgT_@SfEvh09WWR{}&Tpg(3s2fAgTY248U2?1VpxXZc3y%d>Mj*;;Y%YQ~sK( z%GUkSL^Bsx*mwT`@eLV^e~5l*n>aA|mrB#V!QJ>K%Q0;opbIk^EzB*n<&1M|)C6bM zw@#%-1A}_iQPKw#DVpl7Z;cjbl33f_SD;Ogg>w~~-8D>=z1JrNx~ex_%~94o)p+(X zy()vbEIS5|khw-QE#j-Mk7Y-Bx}#kbpTt&S=h;pRHy$NrIxI2g3x6<+n_Z-1kF?%? zNSfW(SEqs|mtTtNw~aYFk^t(p-5r)x+WBT%z&rg)z>go<=&M>T73L1TmPa^f9~Hf0 zz>o^(!pY6zy>Na)4Kj0CC@gI5%*}TsDz{xlu6OVXfu--_d3G1M3Y&6Oc~($N*X9r6 zI1~xwq+_qjoK|z#{I`*Y{tI+hnOp2}@1yi^8Tq#9&=J_ndGvZeTrt+ir zPbFjWRB$RcftxoDO5&%IEptFeWc4suPoV6T^W)dCeoqDQ@ zx$dx_`K>betj;SVcUZGDkVmu@c^y;DQKNU6Tdw%6>NR)AXXJp&I|ECyqqB1)pyskj z+^*!TJ1i^Wh(9DV4+U2mDgdZ8Sw^Q)yUDGkg1V@%?7wl=Da`$|p7WKh6(tyOu!rEZ zzX9)d?eNFe(xHb(j!H)}+Gz#6k0pqN@I8iU-I6h>Px>^XOr7tp*&|?o165X*I;*U_J08Qwr)C%b04x6hy~sJHglL4U z6lR%y)5&V8dz{b=(Q{o@H49rW5{ehg(E{>b@y)s|F1RbMpI1+*T35kl8ZA-d;D`n6 z@mJm+3zvqAGU%yQM`_VIJJ6=xcdg=!BKWEf#x!ZKX1$W(Tx@rl(5gAPc_Eh6vH+U3 zx&@oysAFzZsl8T6*_4h&RG-)v@G4A8{2CQpYJhRRTMk`~Is;?osN%Jvpxt6&b&Q8C zIw@tAyJuL{SPoWB5_=~_(QMzjlR2pDxa8cXX{PIgh9XcqNvTA({LO>wi^x_bWDdLz;M^>rRw?H))(H>P#ue>2-2A-cwX zNaLYyd^Dri#y|HdTE|v7E0?lpt;n*8p<9c>x zd7xSISvl3rD4raAmo-M!qM8mVh3%tjcJxvbaxyVz5T=%2S$e7Cu1NA!c%T{>2=<%B zI>6;sYe2sQI`izJsG`aSWA3ckgK2s@uvNqrUT!EnCP>qF3xwL};I7@QC%nWYj8-$D z92T^FQ;+ZD6d!e}s1zPOl-UPh>~v1xpTOootBR{>+lT)E%Rl?vtQ5h*qb`VhK-@c+ zSJQ&s(NJou%d)&muN7L+4V8RcgpU=F@f=mYrF$>guhhS8s;6JPh%F%e(E`roG(D8y zbVmAcJXYw+I+aCQ`B6~m(KOd}Hjkz5yWv^aA5&=4zBhqUPZ!w9@;#!S6kLiX=ZRM| zJyjY7d=o`-_#!iv_O4%P@d}?T-p^Rc_!K0H`d{sX_K*J?HUF*#I6tc<<`SKAT{5b4^!rgRO$5 zVDI5t<{ee{PhQ)L^hYVLiqeRa*}8m+BsXU-5znwRcC>rXs-vnpg{W}p`wv;&O(534 zQiCzMJI*IlUO%wYtQW$i(aAwF-i0 z{>Z+gr$h<^*nm|301;Shdq;oOzsG`xQLJtbLUJ<~cUm~7;xWJ7{aB76TMlSBhcimT zVcP0gy~||WN!jutIlDqxplWFql5#3QL9ZeR`7m7?3j@VD-4o4gn5r;<lnxE&LF_20Dm(>2Pl0oK!8@W0l6)fT(b<$gHkuYq=iE<|5n`>JMc>(M1m& z)GCL8(Q~34!lIR?_oxcAX`@BMKyAM?=Mz$U00^~Hv7L>frT8Wv-tko6Q-!yM4M+7w zUIlaPgniG<_EddZe0wYS1)x_B{{Trsn0X)7$MZr!%2%h<(Q-tpH8-10Y-qQaKdqv6 zzk(w!PwSelY|Q4Xq36v}z*qrcO%?Cip<5^L?w`pz*?J*f7F|^`Q1e%43sr4Ytc`)$ zg$XpZ{#qi_Vl_{}P4;s4Pa>Za`_1j}UMnlXJc!gUenXzMB9hnZT?5i3HJkcf9Ex9P~8rN0c&*H5ZYq_Tr$rn73i(p`H-zr9mWs|<=(7D(7 zXsyZRp5tXS;3---~dB~4O?D6Eju*qs_tKs`y_o#xO;LA)^%*r{f&)v1qM%sl6?X8KPsiLC~H9$weHm z-g)7{2gcy$o*@>F{VEZTN9B|Yig8tRf$nu`IV_HKB9r94ksb0;)d*m*F7?Cg+UBsx79qB<}#gKa#710 zsjXH=?$?@@6L$_uts8~in?gVa*G5M>HE%}fgsc`CwL`LTJ8fUdyi=Q*q*1OJSE@9o ztXoXQ^0ZQp)i*fGNUbWomDW+IG(bF zb7fDePZ&w7n?83{+A3$N?+-rCimu%X!re-) zMib1f=0rS|M9r^)-o{m16vQat@y)+ist1CoG*`N**Xm_0zcJWZz-ie~FGaI)5B!kT zj_9*gERKz4*+|y&b8Ycg?LAYPntG=vjy3w$HSP5e+;4h5Xkj*v*=Fum)lk8OBP$z1 zI`L1&VBJ}GwEIc%#_Gn?M?)rwqA11~^Q}s8&7JkSAi3F`MI6^tDs)(??OVjBVaeYS zxr#g8ozj^O&N*1iZ&;$oLSo&eom;N%Z{b;VDj|lNOims_>*6h@M{{bPDB+SVlzU9l zQsGM})$cCsZgY{1ZC2HXHXb2oDdp0J!3Tqp&f(QJYsZLAiuq8r0*$O`ajt=7o*j%{ z%jGmu;pHLCb=pFj7jH+wW_3Ih%Pavvxw%|N9trh#3L%*BrF%T;v*{<|vYkQ{3XU1t zt!%dJ`@=^p%%;T-SxhiU@R1XEwatm6jYxSx5qrB%g z%E;E4z4ILvT?=dXNk)JwACK3e6$^CN>llgOZy&*MRUqu$XDrS8MrqV`Ws;Znil%CY z>DfZ(M)Act=9l6YdRCkkYEkcM0+ph^ofPvCM$*a7aosPV@$4NH4TnY3n$o=yep1R@ zx~uJvn%m8JQ*Q;nBdCR<2A4iU9{*N-ZVE+KSe~P2URaz<9Rr?C-^$S7X8noD={4=(0_jnbv znY$@@9zBl3#cAFs5PS9Nn~1~6Sz9}iQ^?svaWUGC<6bH5kmh^NYV%IX8()}ZzXe0> zaqPgdP#Zi=+2{As$b6TiK9JEYhCfrEgOCzY#)?^enA@1G*N*~&$9QN{hg4k~^0~}0 zp8}d%nh|usz4!WpzOu5MOoHJ(-)`JP>Q`$f94o9j{fn-BV%m<}$X|SaT)9werQ@j5qBgBwiay+c)1UJ8Tj>GcXf z)fEfA9F^t+-KwtEquy)(0IH*Q=jPE*lHh)(T_jXG{>H+nayBTq5YTSB)>L_+YP?lr zuU4bIla_5)HQ{oDg*Kp4+*QR}T^7aJDl3{*XnHFS3z2qAnn{n9l#o}=E}CP zcQo)>O^8=sKd}yR*Gejq8n>mdg0y-60Et7Su0*Wx728RTJFs|Gs^KBD@v3PwZZMxGY^Y+-|k8Jt?l8!g-L5993RAZr$rs` zcvjKx98+C|amr8Gy6N!CyC(n>>O~HVWixX$AA)m^`&xvp*QaJ@w>30X;+j2|5VQAk z=&=lOc4rDSCXQ&)+AQ2qS!+YVY>#*vBhb+Yv;)wo14pQs)Q@nY>eQ6h4)dL=guwQL zD>p$F&Ijh6*Hk-41#@a5UwSRC6T_0p!nUfTz9X{eWB?v%uf#ud=2q?4Zq>9SG|szv zbw$rPk1~c^cp~SY5?0~zDu&z>Hjg3nqpXfnehRB2?%oHI4b?)?cTv?oN?9>3)ViJ0;DX<)U4I5QJWEFjXJIHK;Qy&5>bwEt0e2m7RV@7Pj8xtbgE$JvggUg z&I>+VkT_9{y~>13Wj#WuHyo9C^i(6w zSgkuU$)~)zj%YboAZLf{Da3YEg|pW$$r2pNK1(y0LsYi83z6)oyLg1$Rvp{D?*g3q zQh2+;21YLHDBNyXDI0$@Tw79kt3(&sv@HPgUdcWP?J(?pd8WR9M^UcOu#e=b!z>;t zvBKTHV@8(yN{`E02P5jqrmBUO;?w!`Ua9%&D{o-&39-y+C3h*;jaH$}tuqZ3#e5d) zyqvB+rIFIg>vdoD9T6Zc75h0jaYH|N3RM?@P(Gy&sPk82hmzu(wvb1gO0AaGDMPK6 zwW`d_*q=u6X0M0Cm_|s?t7xMWV|%u&_g%pVBE!cMWc}xQ%Wm-J!HPMynNvm(GGP-4 z-qNRvIQ&`4*Ba&aiV#J+QNazPYT?C7(054D5D6X#hZ5ny_EEG^1E&y#ZKTog2UIt; zy%!{S_O-y=Ec!c&*`6zC`0}^1suxS$4yjT>2_CO3k+^%wxV)L;aRh|+V=B@$*?tL` zVFseLb;@}SYfTRYBOfDM9Brt!r3#V`mRaR+WqYmSM?a}YU5!MYYPZu}P1k67ti00? zMMv)~OIAodcR;9BMV40lQ;b!O+GZS+u>q$qcQcmjs)a&$=#SK^#X^8U-J2c{WyMO& z;gz9N*lz`p+;CJv97dzNBFgdn)ihSJB8tAi03hHA1vFA8k}Br5KwJl2NM@s0+X@>I z!45;}-(Rb*ZgcGMPBF=lyLiTU9w-w`!`*l1_35f4SrwPO6?IwyN-hg%-)CNmj*YHg zWLmq_@mZK!@SRrJ8dtHtDg6*SaYAPC)``w@obvAIaZaxC-6(c!pLkqo>i#LfcOKhw zrzKa$Y3#RwMoA4__;zZmS`KQA_@}%|$lDne%=$Rj-5hjGEt6={8s@s$y3}x?ugMu; zb4;X?=Eya!sqK>vHoE5bd=|rC1BlW}Hn~TTtq?B5#Q0+}(Srv9-^dK;Gf$tBS=%EIIZkE8-@O z7w-=xV_Vy@-vX_#F3v70jTuKoM?T8Z>Z5gc!q>OF8RD&#ka-6cCljK@S+=g`;V*bi;oTso={tVmWMtAqtU$|$bypc&j$QH7>S(Ysj}Mpf?9T4*;)4d9RjJqutWjGG zK+P8iacb8*XGeAgjmDCpj)Lz2`drM@WMp!QU1s@>VRx0^r=Zp(3qzh(yL#g30kThf7MkvA!Lbvp}^Gd+X7oRkWWBSkdh`uTzN)aJ35W5A>s& zISJ}4x^hgB;i58apF`qujha`-7YlMVmEF(knD1UmE#5hs(xX}3{n3q=Ox9pMz96K|&X`Xn?`=X?I zimdr^y1Pb>V!!uLeGD=@EWkyxV~*`jLtW?jBF)+nnY6vXR70Cp-63jLweeLN_61d# z=|yxhZvwqzyn@{nRYh)8F87f{J|+{-x4r_91DkZ;v#PqQO-Ch}gDbf!g_q4aym)rc z4p0M_LL-vHGEm&m458deQcEDr!)p7eVq$w^nw4zL(DV-8(QTkI=3z*Y~>qhy6U#jhdLwP1Y9it0C1@rrOL@5sTvhyb#;}(oRc2o zXDvt7-e@Y#7DEv6m505vMC`$L4CpdkG)?MJ+P`4;aT*}OBV=tiPrRJUP>uy;rlct# z2Du$%-&EZxs&q|_jccu5DbcvlQ&OtaZi;n{Gk<=#=Zy&H{3-Edb`0)SblG*p)z7GG;hEY7>RDwSH@2Q8Ty;ySmI z4QBHWiZbZV&ret03Ao2IJ`}vtW?iA)>Eu=y3yTfKK@`k;9ZE>h-)F6=FU=8xn``Ro zVJwPexDAz+^c{zvWxfkrtvhYmmS+aJ`>c~fh{R>y8`V0VC2eb(J`MMg zF4vc3klM5td&@QQbVn;M%&J!0lf!<{gjjmmA4rb1LEkWpSaxMRUgXK&ii$ZLN2_tGh&~^h zteE)0CYc%esN(urb$zBdQ~v;Jf=#5cnM3O0@sv~jBA+!QCdB$fXv;C%2HbO@PQ*eE zB15Ak87PUx!y{uC-EQZ{v(?Jxd8$a(O5cG^WRSZK=bX9N%*MV0RM5vbN?PW+7LMa7 z`X^3b9Ij!guXddO03_B#;&jgP&?@ef;n{V$cJXON@NU11Wl)L`nY0Db*LVX%MES7M zpQ4AGZ=WQ8`I*6Ki%Rt8((YqQ-{+eH37{fl&Io_ z(2uj$3uPl4C2wVT%x>ng z*1;X@j~r3hLnb1c?AT2eU4ap_YF{fy=BnsA9pPe_K8*KmJG(kQzXa$fj!Zj-t$S!! zRh9n$6bQOIGhuor$y|@7p%z)^!8FSQqx;R#S!vl-QSd-FUJD~`^w^qn7hT03%%=BQ zT+G~%IT|{#Hiumfs5(=ccW@jQeB|^$QSI|zdAAE@+Y`+WX{nL27dH|+(q^&p?F%66 z#z(7|?8D*wirP0%X{b`&6C`cO=Dw2~YoAq^o35ROrDWn%@?hEsgjTOVXzy@!OvYhw z<~%FOjrez0)ymO!{s-c|mf7~$98+7HBdNcr1aat8FvCCgccz#w(|G2mA0BD5J}Dp> z&d(7U<6dJ!(Kak++h`^p*N9ZDdn%a}X5`eKNT9S|pKmqGvV;N;1I1;19UE_+l=4-( zIW$~R0xs%y@~Yi+xfQO>%OxvbJQR6Pn#>09?+(jum2qSZtwVVEEB1z9@X=vU`G975wGGO2{*;3YADM^dnk`Ye#S#m#RWr9Vp0p!Q+Q<=E{cmSayAw0?Y4m}WeP zB)p>Du#FC!E%hqZP)l49+KjU|M>K2O9t#sG%-0Yj%Tigbo$T@aSJ7l~7aX^ZI5`_gY)gVxLjzhPZS3Qs(731 zfwR=*uFV_h>V)s3w`lgaF=*lz8dnUHL}*Vno)`|;`wp>1?UoqF8b3GSiILFb@vZ&g zj*JJV>YpTFQ(W>sgR0rOcpaA1Yl)(ENp_%tm>X$YAt`%38s>M)SyLeWdZw`9aP7)+ z=Xk56LC{Hwjx(%Hj5?kUC2f5jh-|O_04op#QjY_nPr>>_4s$g7b|G6uT4o%Vt@XKd z1u`bbCfNG`RW>;)_i=(g_r&O>G2t3<5yk~t;P#FrxyO%%6bzDSjO3jl48csESH zH2hW>*@Q=a*<3oH^6QFSwpC+dET8wSJJjOS{RKw7pql!ONCmwzxKrR%f^hr}D>V*5 zRxP7Qo+o!)(zlve@u(pL2Gy%ONOy;0g1J@-Ne6kH5tsL9N_)>aSgKKQ@5XQ7gNU(J z?6Tyu$;Z0X?8dx`%6=MUz&Dpu-@y3=_D zr(unQX+gmbO21H+8ax{mTEZH@ciT^EjS-`&tD>mWk7rK9K~(4+_PXY;$S(~OPXY5m z>@;h*_VQU>cCBhTtb^!G+He_u1r)p@ey7r zqaauK!QtSaiH4XzNyS+lz;cHQ@aO$%h8|Zp2a3vA$=E0*t!*G0p^2RB-BKfshN7PR zc@9hH<;3P-FA@#*-noB2hihYu49A{{j$@kUmS;J)a@kOV2-FqV>KPlMX=A(!WAF`Y zwq!&j4at}^2XQczj$<${JkQh{{?k!;#{cAETR@uJ?y$ z;;r2l2r4FyE?H}JR0wXWl%Q5=D@u5ww3twPArjG3;;XW4I*`3t4e$!DlQ`t4bI0>R z;!N#6&{fZ06kKjjt26A+#aD*`$p;aNyG+{?d;TV4>Z|XXSe6#oazBn zTXusikCcl7^HPlo71RwD_zp)Qr$wTx32V9)yhNTls*_yGl4;M9y~i|Kd#_Sq$n{Rp zCh%)42V}QIAk)r@gNI;zmX1A9ceB7M5p_<&c`CQyp5~entYt*^Gb1GchdV^=+|4xJ zZP8%R>Uk+};MLL7Ds^LZxTXnMVvvl?uMntp?2->|FIgXlv=NQpX7yH7NYhb7TrBrH zGlwptu!%N+x7uYDV#TvJDF#HzOMPoK%4<-lEIF>c6AAk>z5J6g^8j%0?}qb#57k86 zG1=iJsGdf5{5mwLI?<|7!%XFbo-K17P~e?}XpN4LQdx(1^FC^3!u*lQH<_zmIT6JP zAufU3S`CMRPQ=c0%W9A*RTMJ5h2PZ?Zj?ipWfPsoiSqF$u+v&Aw<+y>>|m2Cg<5$n zvombn?7LR9|dJccU`)AA`YPvR_V;BNGDD0SGsttwA@tuO0!k$xYxyH zp}#e*@mZYXocxuI6U#=5``s5`tD@0q^$V>*t?${*0@{Ku2vWu<;Ulx=aH*|0^9P7U z&n3<#q@LGdoeML|D_!)5I++0R;eVRj?c&ZKn`Fwp&Nbu1!n_ln>$%3H{alf@q}sXx z;&>=yWHHM8AONzN1zYl^4LYn$QN-LvGbnVCj_iPP{{VN%VjnEiVldGfHQP@1Y8q3| zg2^-j8ATr(WV0lpHSp4(6^QyHLvZePXxcrHczGGKhi0o$ZE+OBP!FV3um3}WBb{EG|5^{Nh(Lj@lAVs%{2#*7sODtsOq4fFH63ipUZxL^u+%yLqTc%h57+ z@}dsnELD-1H*vc5HQcUK{8Jhu*iO;yaa$Q&=+C;*syi&tedOGK`etZv^IN^;`qA@Ic1%2z9x%qnI}jBfX|*L=^=5fRVYAL$W`l`CL8s*h~@;cv& z%@8!;4vVU(jLO4$mepT0N8*HLk7jCuIi}$sEO=~A9GuK~%b0u166oV}m_h1V_YKKg z#+?(Q!_L{F?+O~0bSozUwq@B!;Y3MV(c2eMzP&c^0Hg1MmN7j~Ws#X6iQvn;J?r$DsJ;_iX;)UeV<08gmbhW$kNC6sPD_7WIRNNDfoVinF6!`-DPxcVfS9#r8pYpCc3QW?M|ou zLibe|hPS0vTK2!eW#p}*vT!a8rSh8J!|_k0_)$61Xv0mKr6@Tndpr>4^!a9PcfQSP zGS_?AJeJ24265e$8HFZeb;+xISNDQ8XF_%ILCj{@9UkpI2pyw|_aFHn8x143N3CxN|rl_{e`J zGeWaB;o0iV#{w#;EHTKw%);ZqBUXc5N*GsS-Z1043rzv?Qbn+FnD->(;YFSD@*#{D zuOgcxc%c-I5{m{G-OK~o9D*ow(OU23vbEJ`x>Fk?+9W)a10`v%3aM^{NC6T4D2@NHSEqQmjCe8q6&|QVw)%U5$ zt)t()O!0`w&F5Vf*B1$ncw_Za>qmKWQsCfZlmt61j{(FUN6k1jhj+bh?~2*V(#LD! zIghQF3RC8?#T%t|v|y^k%P7kXr$OJR^Fkqo6l*hjw&f1%Z^Me(V5D=UmW+Fx;#$jI zhV-%W@=^>ta^oE@+dac`mrGPCjDOMbFb9^rGc1{ftzCVps34l8J&tK`HK%^1+-p%# zvCYU__{$^?ui4*UjT2>#w0-Z-il-G*Wn)A)#Fhr4yt?)p_e!H1ly-N9Z^dc#Gnm{P z&WPn8r{{QS0-z9T?w{8sq57Rye4iVyTLXWImMhfFL+-f}SY6e(R_^jEF*zxzSwn-X z$w&S73eC~F;U!1@g|o}F#5mJzJKxY-yVd5ZMJc45zmmRR)e<*Bumg%@MxL#?Zj0Fb z%!^7}$n#j4edlmj?ybCAuBPzjn@5*2QrU+Z9Ji-LWPRz~=#E1`?Ne}GkU7~*u{qx$ z@6}4zkF#|EKT}WGIB`a+ICrhhcJ%DcnC9bdz$K8v540PZ5HS<65pCtgAHz>7RQGX^)5^| zcptp{h~%9kArZCQ7;3UdhIG#3RqODAFFT;wCXw;`wW5`baNcumN^@VD4(_-cI4zzn znc43F`7HQHhqv9Ti)&bmU7>HuV(8~h?oQj}9@kd>i{6ClR@OICH*(;FQ#j?| z=WtnzbG5>i<`Bu<&AZqr(l3-%38abC;a(+X4HW3JH?YV&$5m0=Y?q>{)bi}A_;f7lr_I(dJ}rd}eyBy#MA z9$L|&?l<^Z86TSt#~p}}v%28!9B7P=+{2h>gm9BQnBw5wn(zvSBfHbjf`(Q;+h=;Q{#0XP1Bc%?QxBT!Mc&6d~S1M$O&;9 z)cn3{afW9yjC%f&~0!xT4R0)%GZN@Q;gjwWdoVvVmpr5LiZM>a!g8YnCO0BuybbCxpM zTZwC=`@6Ym#P2M8Zp5?~#`+vHcN|Z$c@NQbWS=4xl@6Vi`j%Gs_UTk=!(m%2(K~bS zRnYWY{8gMnyN_;Oz&WZ`;WRPTc7PkE3_}=YH#vAB=pVL>@KoZP;GG~eZe7~(^I4qU z@b7Rc+8>LNpf6!J1xJ*Sz-zszMfz9bpPBolRQV!YO?aNYgw+h*%R_1Ig-FaH#Aa-A z$wv|3ws^Q*4s8zu;D9$RDyLKXO7?MDteMVUU88K;jW&wc3n(?|!EVbQ+EZ6IHOC;d z?A~i$I*O_Yn$h=cw;tj1S>ba_xP<3W#x*W$mPgF|Q~EZPS)+A&aUGeVd5qTiO)Q%f z(irbY7ainS?9|n^;DcM3lhF*WuKf*s5IIc-i&*3Pu8;*x@t^*yR%SKcExHk6m@8iJ zM7X~rsA~bb{_lvX8Z@2YP!opN{L#f2p4u_Uj6}BfI)`|f^!;jUv$?R7)UcA;>XV^|$Te|C!OIxQj?Vx5Q+dc7=63GDN#2r@I zkiEcB?b>gc+<5;0T$VwR&WvVw49en1c=B~Q(M3Gc!b`IVn{({clkV83VKDE1(j0Tg zoO;e>xw|Hm%o!wg0yk*$OAi%EL=xfTkVm&@%`R<5ZE~Nx(56Ef4r7Tf$?Ve20CcC| zvtjUZK*C*}(f6Jml!H$$9aM76$wbbhTIcScbSC{aS~0{1M+3yS3Da*E2<*TCj9(r=JXd10%pcdWB8I9G*LK+Dl;wO!Tgv$S&y z)x1d0nzf45c@^szY0XpFIuXGfM5jES!%B3IIh^fLdmXZO$f~vwHwmG)gl6Uik>mh5et4$DejeK>s zl~s;*yX38L+3OhDKZ$3Dao-h5a<%<5Du(?K+Q1)_YE2Yj?RaA>FT5A1bD9ph#oVsI zT+{Gc5PGfQRal+m<#@l;5p;x{x8J=Gds-UO@}-ToQ$-wdxw00H`+cCCn)dp)jX4xOUdCNW8at>=nVZe# z7G~;J_jLS|Th7VnnN=p#yJ)K0bnNQ6QFU3FuMndhQ-@B#P^ROkgcA!M>EYn1d)=-; zx~%9ur5k_-+7+Gg8|g#E8eHfTVrR8tRBf)dS#q?|S%Ry$#dZ%RZ>dlydn$W5pliQf z74_tZV`zDmn38*3izg3!W<0cJ00Tk%zO<-V*<8!AT=F&EJcZ+bpfNumb6c5SM`w4tpnylJDq1%<=P3vvk`Fmpi}^3yO*15&A= zTgTwHMM@;=+kJa(s4P#<_BtykRJG%%R?Qo^Rc&P9a29v)&~jC;!CGB-5UmltwvItM z5NhtVKw7(?7HXUt{M03z_t7^yHy@*G%Zd%m=ufimyo~ZYH7?S4^-aV`H>s4oRORyE zIQgNL%r?Kx4PC;@|v#|1o+RqfRBMq+fF05aB8e)llW>D?jCXG7Ev6HJ_`Q;1<7q`so|=tXgPz$85-9` zTM_J)yb8?C*M2K#(d#Kkj$cvDc86LiBj7idX4k^Vmhmp}`pZnaL za{bRpuF$@0Met`hh=9MabJR{x#AT~7&@=C&VK5n7^&?$ zRC0>0{aw>VX8E8UPR$DLlua^nRt4Qk1|X;Yg*H;@bRhSqWVrUHoCWDMx>4gsJaP2jn?(HcA6h|#SBl<^D*apW-`#)&L0Hl z9Z9LT>=@{Siy2Tk3e!-ZiOe9QgGl$UOL9*vY?yf3_K??0-sbCcS=CwkO z-L8b8S#RL9r=9Ayp_zxe;*8i~B&^lM*f8=cNN1Id!|`o%Tg&lHIp4}sN3y4G7yc41 z^s$J-PN@<@D^%cZ;(| z2VQ@(28&PFx=30{g}XvW0Hc1$ONDc(!lJhypTQlA`@`DRQ0j^YhZJXKj%`&PWB8%$ zyIQpke^t91d|ZIpgW%-iF#F%cvrCi@cU4{o;8nLIL>qnuZ-01*>eHzGQ>20Wr&iZR zR+>C;auT|+$~RpZ{8clnU&FJeg&t~$$Ep)D!TR{2n29N?pm9afG(2)@-f3gG z6`LU~T#%P3$m@8iT|!$>GOeZ`&4@9sE~{&P3K@0aDYx^wCw4 zW<=_>>>qVCruK2CJ<^^gF}eoRCfM=h--@mtv*69AjcrRSw zMr`?7+@m)?*kPn>jCqg;3Yrpm1P08!nzhxf9Q{YZY+`eA81Iu?>e{EZvFzMil*hp8 zE#Yojsa$r46NnGPw46LHn+0wl~@?!G3_A^&9XU#4Jp0EpE0uScu`455b4fW3VS;KDk$@2iXldi$FhKVt;?T# zvfmUDqP~kX4%!YZ_J?39zRA=p)`sA(Xs+o)D@f{%byO7!tvP~W=$%bP`%8p|Fw?D@ra=H=HhSwV4d)~%rOT$Ltv?*gj}NsRlqq6M+Y3E`H@)iI4c&ZrqA zW2t++QOp%oHw*cqT@a8FPN6ZU49Q5gXD2gaB6gs)Q$!$^H2 z!DfSA#tkShUTY(_qdz5?j@&D{sOJOGG)4(J04|uo(fy+T09mv;e*$wH(#JN%r-I8S z_ab%ruWG`vv9eb=^vNf5**gywT$@~!e-?pVRwi8X3`=uj1T8t5_VH(x>g6kE%NtLA z5$*9AdLnX$RM#lbbp4BC_5sWXB{q59-I&^IyL%TBzL3X4@Mzk$x$Uo)UZ}$ZHj-t` zMt5D^I*h`Fzu`c&LM6Ye{U9 zI<(_|>s2G56o{SG6q;plb*_%l;yg?B*uLW}xa(g9Ffq~an&tMX%pk!0@e7Eg(0+-J zmk`!Tn=|m@#C&xh_EUWU*{E}U9<`vgXn5=JA5$wuNwSHoc4o--VVyKr(V&toZQo@! zIARgT-Pq|`mWwvEQN+>qZN2ML*~ktnD{R%OwVTXEX zp-giIax7?_6PjBiH=ABc;+{Q?A+nxM!4^EK$ly(JQW`;UTgwxClc`$y|YZ8sZ(Mj%`8ONy2Zg%A>-Lz8dvrK z582I}e{{RrX!NFv3%sQ%Q3X%h_ zdA=&u3wnq)zw79PQ1^KCRU6IXxzRIb-I(_|c2&CZ`hnR+YA-}&j#9@8QDntMv}e2m z&xLsY6QbBm401QRO4-gRbPrV3oC*vb;%rl+7i$|rsMBs;jyhF1@(am7+M?OJdL!)e zO>;Y)6>O_o`5{}Le7k8}!;-6f7e2j!xYRAvRh7@pT^Itkh#C-mpx!ByIk{cIzUWc5 zxnEu*`s$yLv{JNQT3OzF)^BI()1t!(F5KyWkYz5*S7}`rqOmd-M4N?MClo~W*nOkNU$Y7H(BgCNbB`!^`7!G9Jxb%lgvA!lP(e{U}LwoWap_C%1?sD zVW$n)N)mFB=l_fm%F|**M^?&KNY_zln+%b<)*gc8}K#k14WAwy~2_? zxteHEhH&@IBez~8%G}hpVW*mICkI?ilD>pQ-u7yc>+{fj6CFa=1DUlQe^l79PHRB! z%ai~IDs|?cio@sIKC*&)vw5dSBXYgGJ0^Q!mSGs6Y)!8B4<$8mlCv!XoGM)RQvMVc zSd3(`w=La}Zi?`t+Lu+%H*<=+vlU8ZZ)HupbGys4d*Z4Mlc}HzsMj+`ybUUt?W5$S zj&4cOmbO93!F`^|-4H~e#@)qbc@5^Y&EkttEEmzmJ0&H=aVLUwvPvA|$CAzVj&A_3 z-QrjNX46P4}%p-d@yR^MigQTT??MPc-Sj^fn`rE2za#&qj zmmi9i%x*>(9H4OQA+$8!y3F&K*1r@u9tuhKOhLh>`^~Da3ie~;w$ZO-jj!d&Wn)X- z$)c#V>eEi!Y5RHc?xXfWz(#a7;nh1ZZf*`$c?}*bEFzzLr<&E( ztxzF2h6nU1lAJJW3#nE1O!x(02Wf8yS#FDSDX-3Ujp7#Fo3f7kM;@yEjKwwkMjr5Q zu(hJ0r;QLf-QpJDKLiHM*THO}8^>2Kvvn76gvgpH&B$f7G((x;*_tQhe;zenwr0D^ zi@Xpb>b$`0t4U+IwPeJ!ID6DvOgn?y?xO_lC7pOFXK|}rV4hv=nw4uVyiiUJx$Jo6 zvpaQZP^rU$%k%8!c`Ba9L^ajjlp2-3(@u(jWE_H{8N9jpEv%xJ-EZbq+H4T1%5|#P zvPT#g>d>lk;oE-3hKiD#m)2rKfiB?Hh{QoK`Xq9f2{m!zC=p@GTPLh$M^|6XVelpF zWMPf0*-6Up%zkSW+-47FeWWdXo3l_;Hg0_sp}%LC0FaY2x|^c!9s2R{^kj}xSw&8M!AF^BJ4`nXQRw|@}llQC|T<^0yl zSp#yoXB_;FBS zvlcQ(2JGn<;iu>R8){=z|{SwoEzSHgK;lx3Zj^wJ#@hf<8zo zBp0I#KtA=U@fGl*8#x~=Oc`3|fm8i;>^A+QVu`hLzDpe3LtNdSSjdXQCQ3Tn-h_v|Au)xs$*VI!*T)+->Uu+MZ zS9{>LksPe8E{C*vp29YP{Tp(t9B!}PvTiB?n-2Yc;ah^LwFWnLPjBXX8 z7>GaN-~Rxh@=W1n{{VHTR`W(~Yj)jL@8j4z8$sSiGU__Itg<)2 z^Xw#=p2ra*BO~54TiC`Q0ag3SPrxjZutd&HLGp~S*LUwN1uBJWT{T7si*08(ap0;jzzP6cNN{8Jf}5@V_1jufk`= z#95!az6XMuIS3{rl{~x?vz<*(k8Mt$ zR-aTac=Shyf`stNQi<%MBekS9hm94q=8T=zyX3uP#|HC2i-&tPxKc5dZ8w^!By}AZ zt9x^Mk6&iriphqBn|^m7A&A9FaStBxvwCz?ZudJVr5UX42C2EGWHZvYj+si4xMsES z)Hu5>C{dK?!J>6sA9`jQ6_n}CGz<79v4Ha=Udfr9BW!)ZMJwWjU>Pe`*4$BP)EXv7 zh=`m%Bpi+ghLxqdRZoj_j(#3y2b#nrrAE2D7I55v+%mPG<=HdaBbxZ09{XD^pFI(s z&8#u-aM#@(4^MVW+?#?~t{MIXc> zDU_l+%{(P4pr$viokQ=yIAJXDT~yE1Ak{{SbJyNxy-yGHMfrKOH0 zgef+WY;iB%wWDFs&~dP8+eX*PhIWsqT3r~On7NzLkaRtNtD%ZxHsP!Rx&F_Y(~8JL znAxPH&dc5Vzr#fga+l?b+Y;&zkHuCNfaeMqxGihhMMYl9@Cwb>n(B(nBxm@+TaPaC z?AE;pWtJcK5x3O7`#x%*t(b^O;<8Qs{6R=vsQ}R!2(9_6}uzLcpS;C zsE-ue5-!*IqhTvF%oQ?+JMQY8jg)4LW)bns?JABZC0go`b9GIT!iKcbK@&%Mt}2Ko z$B1!_pq=KoHIZkd^B2CEt5H;6A+I+DxaTvgS9JX@0_h12`$ipp7b*UTmBJd9g5vqp_A$ZyS zq=&kAYx#VW=X9~ryay9nP`)ctPs!??8$VlnYUr}PHZ_x+Mc{n$N5hlZ#S>rnq?>mo@+eXcZCWh8`@TW2c zY=(u-@BaWLd#;L^tKt@8y5429Mmcw(cD*{P6P`1tRl0+#l#VS=6R=4WMczWs1kPzA z?A*O%R37^@RcWZ~sqc0$bgD9YZqa3R>a$2?uML?2Rx)YVu)U4-e8&YGnz!2sj`R=U znJW*gB^{Mq!^48lQ5o@D#v*xwsw`-oUga)06efuJw_U@MY>n*7{ouRG-Gq}s5v7{C zs?lZb3c{~UGh#p7dcWpyWU4P9&4X#qG6*S za(Jt0pigfwxrJwW6}_+Q_>;&Y9Q?H5#d^0FEsP^O=~GW+b11RmjvrI+I>WF5a%>YH zJ{nk9{_CF0A3of;jPlZ%2tD5|G)y7K%o)o^I*V(nfszKtANfsjsXQtN0GxLr zW>ELIcckS*!2;*)IYJJeC$plm>)D|_frC}e+|_tmHrvvmo~^z2Yg$uET8dnBGlpZq0!V{s3v@0&B=}`> zL{5adhugoi&-terYFsP4_GK<^V?tDTr!*W~jty%h{obcFJd=sZAaSdj_Swdolw^?R zkn#Pl-N$D-EyQjlEd!G6>8dj(^a4ffoK;GimRvy z*Q(la;H#n=EuT!q2Vz~A4n+z^?5*wwi#2-27RWz&O?*{zF^uBkY_FdX?s^64pko&C zuVpK4O3AFH+-QS11=U>U9E!NuN$^>iM1zL~zS7?m(ZHMdDz@>_P-qukeS(V0t7!qt zOXXYbai;)@f(YSg_MEqz=M`O;>Su7w=$q=y30lor#Ceo5{;>Qx2D0DvavvWs=K9M`RV zPrB8*GB=RyZv^4k4e7}OKV>d7_vCS7dI9{_Ohhf2zj!QMuwj`D@Wx)!!A%r0;bI#n z#sOLkX^xvDa|y2N>vyr|ot zD_X9aBG-2cslQa!Z-NbJ(QK$GTGzIW-a@Xw)VRMeg;)l~@H_{lc zbIpa{{W()0R!0R2Du$|rTL*4 zkhJk4SK0u2Fa>PS@>P3W8`Y}@`x@BQHSSO<-gu%x2}GTUr2k5_{SW^Nd}V92Y$Gchw`7~2LD5!M<~*95S~BL{Xdg1Ht-N`yehOZ; zK)v;UCZgKqCqlJCyb-C~Ix~{m%Wh07uQjkP^_*z0c`IL8{ZTl+j%!80Df=cF3r3DQ zr+TKAy6r1pg1fKCrqR3>i+F&zl+xot*MgFqXaeT3JWj~2L0aWyjArY}P;bk`^6aTx zf-TMqebTBjwa7bYzNQE5kyZID&x-UfQmG7W8!RTe5sszf)C~yGXslffF&Oi(Y6# zBW}kYOx{#r$lsr4&OJD%Z;Fjdx!XBXHUvpZn`QwM)T)H9Aj%-4TvhTImLI1?=9D@*M;AWUu1mB z-`N7UWfkyQF_5}Aoo%4IPnxW9lgQC`*V_T&)%NX8n;LeKY9bxbriS~6j}fR@*{f`` zN(830q=|u%v`ZnN>CB>X+C9*y(QN|C(VK>;<6C7}T-?p*n#kbU)7s5av%2LSoKKhy z?Z%g7LHTOlE#|UD!UH$Uo^(>fgKIW8c#UxrS9$K`$ZEEYs~G!i-s-)FuTDi^v3O?& zN*H5%*y`sNrrA%wO=cM>${ zoeZqV_E@y=MP-I3$jHSv6$BI-YLX1InHif;;St2Mi#EbISAqc z7IF%KRM~4mz;;q5*PFNn>l|mqd#i&R?uD1^{4`aiM=-N7#ibU=!qe}8x`}-n-*_fu zb!p99Es!KfTGERtw1ZBn&dPZ$_Begvb-C*YM9AV9viIcokLa}Qr6{iDKr<9tMp8I- z19h6VMa_71S9aYyG+8tw=h>CIaaOfeX;IN=R~4_+;J7N$XtY%0$!LyYx>bdhT+# zerlEW5&Rd}F@1>mmG)oyiu(caC{h-$vS9LBGM~b@cK26wF6z)N0?;lWQ$?p{i$$W* zY4tQ(Ef$MT-s-V<@NzA2FKN}TxF|KYXs{icF5`X()=1$Rjr!loR}+Xba>~!gns&jW zc=%=Sd?NWrJ+4lkCf6%b0TqLhlqAC(|16>gIfz$oTwuqb468 zG;WXVn=Ey&!%k`=^kzqi1J+8=25*Pw^~N6u3#ONiG-&2e1SXWX6OaD@Gue;$e_qIE zh4H|0{HKx3Q0_OtWG7yhG%X7 zI0021M#-?loRaMNx`SUof~H1F?|M!0w^<8+`fXd-mNUVCC&>I}Ot-0JR;{4pRhm~d zt=C$u-}h?0UKU4=c}jC zAwWp+Uu0GA(s>25#5XDTq}?b{rN{ip-YU0ReEZ0{Yzx8n@@|!AC1-`g+>P()l~my6 z1DUe!8V`4QQwxLH{{Yo{s_*2g=p1XvtKnX+2_8zBHC@m=9JL3;ud!>q*Vqt;uzVE^ zt#4I%qh7G>4@E%BFSB1~Mcr!9F6&ouzXkS8{{U!TWgq)O(V=Lx3hipG0@U-^6#P~ve?Vx?%`l2=sKTApi)(P*?hg0J22tkB_ zxOhjh!T9s+*RtPNeSyl+hOHKg>a$>AmE7Lit6(ty0PJ7z(T@hN_*lw6+_3lN#AqOb zzvaLxs_ErF!YGMzB#@m;oU-g*&^^~tRw(3Q=d>yAW1MIS%d~kX=D*-39wLkW4EeY( z_)q;|f5MOd0Eid-D}VkdUt<{m0P2PNf&T#1Tk=8=@h`T*o~7h|Oa3ng-}ioru)z4< z8Y!9b)8#}ykZCUvzza~>$i}jr^1+xP>mhwT<|`aG`%3#*KiXIPOauKTX2ecscOWR$ zapb7e;+*w?}=JIf=t8kEm(W@(TRE*`Pe(l!ZurCyRd*tGHF#ehc|_Xg&*1lF@0~{Fm}y z%j#&fUDe%M6=LAK?_0AGsVzsaZ!($kO>3Y3zI+E*oA#cTfnHKOjW>d|PlT7SxE^)y<2 zZ5MTSLeu_FMWWGYyPqQ*<1tS5{c5r$4|Gh;~@VwfZ8?8A(yJ zgK{jhUoQi}G1*An%1Sjyj?{Te&7mk;6OU!=7`U%fwUbIu6Mg+>L#Xn{whjn7~)j#H!P-JiZ2uR zc45Er$Kau-2GJS-D|1i(0I%-XLh$34H$$ztpxk5^9^RicS%r?I`6`tbvf&9f3#o>bMqP!DZ6b?;ph8WmO49;M^m1*=dbM;103wego(cFqUob|Uoe`vrM=Vmk{Q+C>)!_W4wX!JHV zPz?jx_$cnTlm1?f>@*au&+M#)4x-9gJ@;F{eQ4-wO8!6ms4REHDoHVWJPKcH;GQRKs03pBs!~iQ00RRF50RsaB0|5a60RaF20RRypF+ovbaeOa(d) zA-uBP0oG&cV*0$oL)@2)i%P3Jt7fG%yVWru=x`~A?GC6h2Qs7-$zZa|w zD4@Xm6cx*ToxTokbZ5Tk+c|np0dD?)Ib8>Mys%LM*!#!5%A`nI#u3u)`^sme-mQCF zZH%dT{1V=^nmfx`@GBMtwXH?XA*zinb#592qee&5jP<#T>rl?*?@r_#W_JUX!QK~G zF#$WX6T{R3O<6oM;Nadl_$C0zz zT<&!jW+0i$??#ik9Sg@(tsTquop{cfs#Cc4ZgtVa7pdQo!!bn#^UwDKeT;`$9m+2; zm&d)%Z<42U>$#sKC%3@9+Mj-yjv%k^ZGH}CCcg9fdzqIN1yy=!{R|09zUo7VP9BpO zI52%G2l@&04n;98=AU~bY6Q*@q?$)je6n% zjMn22g;`w&xvG}mcS)2MZKhTh1&%<8@1`dK>%#!tRGUW+MW={c3#Kq?+t0C*S3-{) z&^wMqGmmsWxO|W;(*-}h%h{TOCw|7SdE#=#pjx5*4Z>i2@bKvI9UeHO;?mB`eda<- zj&SJmdyeO)dFO-E#NJ?fQk92P(Z&aPV~vUS9}Hb$oJUI3v>vZLw^Dpm!78WvU%|3C zJEJVTtam%JA4U$xG;J1FS;3&7p#CS+oX%y%NVsTQU>q{TWz(>i{{WFU5~?|)XtJ&| zgF!(+e;fX7&~VVUz&K@w%co%pbAQhMtsRZjZ5CFo!Jwd^KZ05O01>S?Arslk9kViq z{{WDY;oG%i0$m!Epx9tIQp07_u$Te^^eqE=qLZ&#Y;Nral6ARr5vs99fzCz-^og@I z+SyeWdt`SygI(Z^_zuv%jL2bS@Vs=6FSTs-!z@wQOkh?ApZD3SQ0xZaxSY)QG z(#3Q%>9{^!xVM3>ErO#J2Yi@u;#E*jfrRmX)1Y%m;5%wA)*iTf95F1|`FRx@a z#&X2je#T}=jJqav=`F!*6ej!6R11k!!;<`xg<_6B)*1pB0=rJ_%dfinSxDO60OVp& zj&pc@C0xWJQJBRzX|VHn>8>S)<(HY?`hD-Kcwm>P7GO?1Hvr9I_M+-1aC0XKctChm7oh;^H>oOO` zOqQel9)Nq5*@NH_L05TBDR%u)#aA(GRwlZW<4?#Fn=Cj#y_^Beo1K zdIOSNf4wm9`97sI)ZYvdPg$*DmG{#jWxCdIY+Wq5c&B)N{P6CFCc3-jzVWYV_gzj- zQ(r_DW}3fJp({iWr}+@nT|Mu;b$=wp{zk8DnlbI-J)!g+BI$e~jIk;ATh=U+!h_K-!nne2x|6UH z4RT2Z^Bwz^OdXJ)CvsJyXyWWX(Cxc}VO#LR3)e}X?I?=|rJ0@)oL1dgs+=szz3EcA+wctT+b1CU}LGr#$S#IMMU8k z+q3U*7L|l{c!8O3Y`5Wp+0YuLp~XTWfwQ&h#GhZ3UI&&QPYu<4hm1zoW?ft-=3@oI z(mD8MW<{ntlFxaL8qLljHO1EMEnES7q@WdK+o|R@Ny0~n#}|H+czq=wQuoXLsQq2d zZi{9i^D2k~ad!*>&A{M9@J;@KD7c!J`~)ml1n!%bgfu(Dd6*+Rvh0H`PVqd9%I4ic z(>`EFd?DZ~#7d?*iJFp~8B)B=@+l8DEpLZdWiRe_odcoa%lVhLTW?W~FHRb)M_h=t zb(a4CB6SEohH&^J@j_R)ugRu1Vg4uCE8Bw%&*3%NMHC9e8cQ79cBq%n3x9| zIH&_F8w0D&X!_&pui>xZ&+xzDf5iIp{BB?W01f{D4t|U&Hnj7d(|yxRajVj58?Zx& z*DsJ`(kcdT3*ja^Ld8_s{{UJhZpN+PwvLq%)}(Wm!9!4l&%oXz>k9C&v*zU!Ec_91 zYEkfKHGS%K{3ccy`VPqKQrNG7r|lllGFV)EptCz$*}6Q!lox?-f85UtTuH!pYpH|1 zr{YwUqEye)27ht*{C zVc(x`n}^a@f#8nu>+lYs>+OSvStp-W^zYZqw~*2b+ZUmfQdbD$+^;to`h}ouP9LLa zNhk3C066~u24_MPURsr;J1;W;tW>i7B30Fuvq1^R1hro=v6c{&_bZ;n2h&q@R}gbF z&i%nwE8I_*HB0bZA!N)$1HPIK23?Qu9kr(gT`i3e2fGj)~iE}a}5qb{VP zM?3KzP40ync02i-d#LiZdt1JSBfUt-HqG)IH7fA+XalYxdY1z$jQXPaH|79#pzJx0 z=e(dgbi3{pAfLTsib7Y|YV(&Keh8MsxiSWEJ%5PhZ@Po$cM_V*Qq&43hMdJWy z*QCZ3(&er_ZdA0KKAMDC1pGOG5xWJUdG{l#cCr^X@>fjF0UdB}9U^lAYoV{Pj$Ar5 z)WN>=3tNFwtfuO(FSJ7kt!A5-pe7TRY`?#}60QJjJv#pYb0Pa%H`3Lhh8;77t|{Wa zVYbdKMTlZOa^S^569_|*`9kW{t@|H2@e1o`nF~8whhX|>I&d~O6@7@uWHH|>D~9Gp zlJb+O?G{zhvM?%8+84sUIgBU78V;SvM}QQ+9}rk6R?)ksv_TccRpIw$hG!ukxtIdr zR)z2L66-DwH@6SGr3S(E{i&Tgu)O!^adB0(V@37vQQglEq;KM2B?kOK{{UTP-L`bj zV{Sxy!}z`a5H)k0oJ@m3$t-Dp1A}$ebOkj!IgSirD_4qqr;!kv#!$|1!)a)juC7sC zTmx3|P|9S8JH^cAIEi_vO;Okf5Zc@5N@DT6wa$6mtQpx;Ae~toC$QbSZx3+$OOZGn z?^f0`8FjJ|R z4PR{IczQ7%liiS8Q-M^zxF}<-Z62CQfBriDq{uy~!u2>{e7Rb8{0wjZ041oYs$$_f z&)tC^a&ByfLH=t}{{Zv9=YPPLFX+Fm{V(XhrT+lwaen=ratX-GyA{F)$U+MdHw2gZu(r@9tpGWrISoxZ3YIA6ZUsvKW9~H2#O!tj3%BMmxc&$?L z!1p4aV?---W;6vBHnc)2p`sZj;X{~NucmgGj;Ly<8;5M!)Hwm>2DoMV-KENUDJIej zFWPdeprfOr5=E)KdOmdcAeLdTed&t8BKP~a$n9(m4u7b(3fX~U%iol!A46pr92(28 zb=iesRhY(y`xqX5RvBf~7$7yF?o7lC$*5LwrE zRqGn4LjM4u`$B$0S_Xm3o3Ai3UA15>Uve*aO1Bz&t17ilMWdAKGs43Oylba^B4xZT z4$A7e>Vh8jpaO~IE2=*GH9Jj8Zu4^uQ%Nsa*$%5r=$upCHBm z0PK@A87{u=1QlS4aC0sFe}E{@@EiU${14#b8ir4&Kl$JCzx}~<06O9PLh5Fu4ud_H z5HXc)^&QOXXv{@w3;i);o#FX!a?ItpH6zWrvmer@b!W$7GHPX-m@zi+TyNjUXYQtu=xaer-_a|9wS=?UR31b1&Ids?MFjq zqSvFQD?X$^sNhPW&bZuDj)R`eT+nLz*DxgH%2=tx-w;82+=U2zMjL<_M~I_S&b=k1 zIW)v&t+)oCV>Jz?ko~dF@?Mgxh$?Pl;KvbHI&Z}99Yo!M)*Mh_s8q0AxsxzvF7-s` z%s{^apGd~w^8|Z*B>@j8imX(2fs?e4Fo4TLNQJ0dJVV6TDY!;JH;{B0xct|Ey0d}T zH7?W-2!C?-415PZqR2=;oI`wLFEA4(fW4&W6#CDILV%|GiB}VX`NOHCe9F=Ds3%80 z9wj%Gg1f&gx!};*%6>dR5_d5Ecwa!3^r=$6^>z~5wpq}PMEF50(tA$FEBM|0Ifmz7 zsW1Nk4gUb;e@psb((y0&pG`95{YUv%(R9{}H0xV{>B~y@$U97o({}bY)6kTrOT8Z3 zj3rkX{pD9=OVm?=%BlltEpW^Q7L)6RWT;r6K=rzdIUUXlyn4j18OST7 zs*QL96uuM8506iAulkreSB&3N`+>G2a4!+ki_jimeAE#~3^sd~JvyD`k&d>V(Vh~R zYZMMfUz5DCrp+H85jn-K=2^d(#KbYZ>?X{Zef8wOfs-LZW0dU6;gp!=QkR>ybG17jgzC8nl8f4E@=!Z)mSy7jv`}J&*zM1;v;6#Yvzug(v4YE zTj0ymVARIXH^_He(pS>I_zchpe)sSqwYp4FM7p#{$XbI z{{X@Hiy-k2AEO6Z)&}FIaksS0yB_2!tK<#Z0LVZ$zx@4<@!+snFRy;Yy@xf|CqA*V zSt9#IbRxyxK5Kp9q!ba^csPRqAP&l2PSW7R{Xp{eOd!s@hqf{1<0IeO^LoDw*K}c? zRu*xUM~mQiS%fjH@(z0#K!{_4@DV0v%{fg}yMWtEgwLb_Lf+h2$@|hesHkT;Z^SNL z4|FcCu)<~-MC6LCg!o(1XI5gei1+bZ{z44JIeyo_Xxy$xSkadLAwDG`N_k!SN(CmQK2G(VL`R;9Y&w6$E5G@GzR(lrL2B5; zR3g8zGxUN-h5aD*0A0K()v@ZW$DV{Vjz95N(3SjLW(HHkwWt`2AiEvSkse}h-eoMU z6~;_)EdKy63;MraCkc0Q^Zx*kKltC$@$`R<{{Rb@23)yv<^KR8Tv_9<{Hg;Tx!x4% zE9@43P&F?%AgOGlgWhuArZ0GBCarnbk64QQdn4o*Xl>Qv(D}RI@h#mAJbO~>#m7q~ za$WLQhAcX~89ZB#*DO$Ny3dThV$_Axw7$JPWfmK=b9kzh3b&KQ5TlC9>=iNO^L^8U zu_y~c=qDBfm@fPWS(&TI*Gk9Cp>pc+$IZn+bV{UI6@CmK2h10k()rx9;lq)^)65{Q zx%w~sC7y<+fzoVfjzH(d>Mgomayd8oscQEW;L;_g3wLn+XD34rIv{H_D{|=94NsCL zlezx@o8Wnia+;EObY6*lp%FEK7wUQuQjVRaT4reGV$m5#f$Y^fkwqv?-f-ddf*}0L z)4`WyXt_n9zeYY;t0f)fHvP;+w7|a)_H*jozmNGb%Pu9iwXh3NtXFy0pEZMIfU<=S z`$qU~zTTJjg@+FDansTQHoENov=l3fxQzsDE1Nc|b{{X~=OJayTmemzvF+%mo8t_S$|8HFZo{hfGt`H z%KIfeHeL$v4ct^u#psbTC3u5_M-{|HXDdg$D&Vra1 zkM4DkTpbfX=}Fc22K^ydtF=9Qb|VC2>tjpLV1=+4a(J4DWdkdP+k8aa6q<%Qv+F7# zjDt7MqFnSoWp?Cc;*`ya)pzP)f-ADR(pOFRn3yvnqv%3uodOoDadNa;g2qBEWzA|8 zzraz};8&DEUD=Tft@=j7-2laMgj}mU8-8(9xk$bZp^dX8fs=IPSS+Eda1Mc^pm7>k zHb0%jMRn;x=ZEHClQyqG%q^F|=AkGWwjbH)61=RQv@IxvPl8Kci3wds-u2P1W2ABc zx9B5Bl47MaS@YaG#2e^8$TQnvnHv38=eN(cNK|8m2C2Mn0 zsBzIwT>k(I{{YUdJa=nQM`JrHM*;=>iCz_Yb{P| zEGMjyU1C!-Jq9}jyzZMrEq1bU{-6fof~JqrYKeuz_b}$b8_#-n;7Xl=iFp`~6RSF4 zhdkjE*vD)V4dNAT;tkb1N!D4O`4l`3o%{KU$6gBkrVwP&;PLqguUsh}je5mYZDjny z#OdRtpxC0U%($_hh^}D<8oIR*Yj=OBkuq-DONznjLha;p7Ud3M;k#?3OA>=8*(xM; z!R}!SS`Ud*GAq+rm=vwU>G_58?q8L|yFOwTB9X!{BVCf9DwBK|``j$0`{@8(o+!Wv zJ%XKu+I^sC2|5mA7d`bA&!GLt{cc7s_-g7-{+sld(Dv=q32+w#KZLTeaQeM(2S`}? zWt4xpLnR3Dz`jN6qzMaHt=9)2=;k+zbgUG%+D7=qA?;rjqtcWUNd52pS9yp>m!GFV zOX;RE8onnQ@Ug>tmGr2Uk5HnMzpcxIE?fjE z>Z-;e#8C`b?exwNLFD3dE)yQEC=!WPQ6SpIKfx#rrC!eH?9NPS^~ODBb8$IcCpi;` zH%cF{LboQW9+357I@lQNXg(6sg8E-6balXglN36Q{{Uw_&qaK&2Ax*1p0UQFD^!x7 zdBAs>523c<4sS{8vndI8k^!o0dO|kQJ(u$@vQ@qR09cS2O^yiZReM9hHMlv+YjHSP z57>y;bZw8gj~4|XKJn1)`IuZ{FZZO#b#A*$4hXDP;iU|Q9XE(|HaSIs)>gt4(6r+4 zNHrnVSIfz2_RQv3?0gzFaRG8*v&+NTny%3T0|10Yj$sRU=>|p zJKb5{-e$Cd)UMR>c*Lzr>kWC^Hr(1wGS=C6w_Hvps8e7WRcCF}7de9FA_WFGtV`-6 z(Z0kf40qZp=s098i}hu6uRw6bMk0rkJe;R~&|n8;rAdo3_#&QHJ$dXL9H*GST<8<4 zFQi%Q4%*NzaZy^!Xr0e6fj6QtM_t7{4n`{{V4i{b@cgxaat)XQD1Tgz1&o=@@(`#YP_s&!OgU z4Ha1Cb`QDMRK?ia#jj2S%4w9hwi|Nmpy2j_P-qrOTjq;*FPJZcwZX>B^_I)Oq&q}z z-{OI#s50(zD8gJ>zj9nk$;K&uv45h-o0Pv3EG|_Go?d0ZSX0%ORweCnTr7eN7Y$j>C4-OQ za^}93^nQjy&_PRUb%4dTIJElT@u&H|#CyypSm-)tc!;=g`JBUcqp+zdbS&p3(~0)M ztPCL{o6iuhPA5`kH;F=>k-ggE(m%L{2xSPyKWX`kD{2YmR6GkeWMn5=v)PhRQb|vN zk9JXRQMQ<&>**0$Id|b2^oX!smJzP~)ms*2b!u7!w4S>6@JC$9LM9640OI-MP)Vn+ z?qOcY-~A<=6vPNMky7upaIt$2uUVpsjj&_PKpFv53|_$5Xz^w&%vHE5t_aXCRO%47 zs(*YP$f~19bIH>y4^hBg)L&vI?_4&6lO~R069l7G&+lj|UX$4l3^~5>+AWJ@zu9bw zSO=BagV7TtRJiSnj+R~Coof6P9pbkOtA|Re`GMz~=cr`#SW>X2&{BGz)Le;c?wo98 z*TeBH>aaH{id_Xaz;mfz29d(sx&`t*E?rd(vCJhOyh>_602&U2Qn6m4m|dt_Axwr= zI$4V|Fg0jWt_FT%_rP8=bnK5~1u)u+H4?J=JdDe}@N}J+4CYV8V&~=u|Eb1pWemRK2 z1$Gu~H`dq?m$G#yP<37*j$<_Lr-xFbv|=8miu_8zW0*!6GqC{t91x*$44Qbe3T8As zo(a;$+Howvpyk^R>ZSM(_r$vkVR!rLd6gS*YNn|4xc>C<;vl6|Z5^=g{{Zp`Edac_ zaqSMnh42^gAH~(kNWzWg^F=ObQDd3*PVe`Ku;G!x=uDTS#{8d{^b4gim<(mG?HZnq z4us0H7H0RgzVfe>Ztd0?NvUD9xK{0B%|@$03h8TuzV*^MA?QMTIy!Y(j4hb(vZLRw zBJNRiz?9!t)$ww;nANAPb%5#kq)$)I`Gj0Kjktpq$5;d&7^bwSqY}4l)(M>%ViwAW zUdd8T1B6Y*>2cl+5v~qwWvQ1~F6Kt)f}zu3%ivl!`zEBABQln53+ zpH@!oc!1I?rFN!cvY*35zpeiO8;9_}s{a57{{W9wWu?*8?Hm+}5;nbK74o=72EDS<3e99&kNE>3{6|VK^USCO8 z52}w_Rl>9#{Eojd8Y85&>k_w30#6q>;j)KbzYu6@(w}UXH=Ri--nH0z+`x;gduoMg z%gS8oL*B|$-MT{M9nhYp>Nc~t!tN&t)SIFRSFLFDBI(>kOs%AO6#1wl0H&9!p%g4} zzofxK<`5JW7XD=m0bp<++#EFMa7x9S2R>PP&E<87Of4Qbj$`30uFCX_H%%8hjj1sU z1Hgg^YrKYsOX~w$w<$`xC?0u^SyQdwe;*Ser`3ZDqVU@Fjvm;Lfb;7qFB(OOSf^KF}~`>t2yS zwH%&FvkrR^uZ1ViZ!aZ3qg@d9@(h4yDT1;ANG4m0U%}$#6H=+=w@N)o7=WE z9Mr^CCQ`#&6D}Aj;fHN&VlH%BaPGh`!CJa#>GzM05ld*DGh>;A`@7Do_?3MQ52p_K z<&d-b@eY)%(SGO8l;rhwb{J<-jkBr^vYQ_1sdD~{FZmey+_`lwT)(0J0Kw1lcx6^J z^m|7byxLB$Bp13X=IbYrpKu(ja^)`uvjudzziD6qLaD`^vnA7lm)KaB z+?aB{*Q}!>o0Edj)V=ab({!7N7BskM)$ZHB6z@0~(VmW-piO>T_7E0=oleYS z)fu&MVD*5gdw(PsBVYAlbWrOar$~r*1I(%mdmM+fuk6d8Qdv8;VN`|{(L2S6DYv{0 zu3fVe1J()(x+%?9-TcM1i^3^ZR{=6H7Qei}Swg_($b(Ia2(`qu^dHmNEw4ntE8Sx@ z7YeaSTD*CL!YyIiu7gFqSF%l7W?Ax_*lvpZai}o#clk5kPEDB7_D2>Y&ng+21f&!4T43h zQ|d77l}y<1z-!cTcYjaQFk^uoua%sUM>*5gFie|1R-PM`=BdP!6$`4^`w&~m5doXU1n^ALZJ(IC;PVmK=j{4w^vIli*_t5xqgMKI6GvWa%@FHEx^L2+qOM>D5>?+2t5#;%=%v4c0M zl$9u9ZfH$?`QmiMXXCG=uN8LwHOu<^e;fY*&gK6A;{6}tUsMH%34Payp-`+0k4LE* zYUuuaGO{i^fZTS8VXs=f$3#lpeQy(z^6)&5auBW@?Z?7(_m{S;JIp4pv~3)P&G__T zDN$NT5nwa)Cl0a{iD_e%&`k_DyhKMu^8{@`5mNiqsf}UtkzzhU{m71*Y1I>My~Vur zArx8O4v|^6#JJ1{+Q@I(^NcAOiWMT4snPG=8_0qJt?bcP4hvcwa3)KgsDMw1xb+z5* zTqQpdSsLxQY1JjTMV`?ZuF-J%+t`U;VB{`Q?HIo4^ear@be0(=(bMx504vc!6|Hesa>CdA+++e}cN zDLM!}I5UW+D_w7&47INBmuISQ&MS$4Fu;LY_mt+_mtV6WAuy4UU~XIzmMh`NxJ{l#n&+fyMMc9(cf!oc3??kgcXjj zNDM;ZRA%j5xYjNkjw0TORTYam{{XRDg2=ZB_DG1-xo7n*^C(F|&bJSFS&foUOWERM zuz~i3^X)Mru=IKM_Q$+QRljay;;^7>N10e&@AoS#Jj7gn_=*ylw*LSuYAZe?+T%ZH z=6H8KCaP5mt_2Ugu+>t#zw4&vMg9F|o1H~zSAF708w_~Vr~4HvLZZP@qC(u?CI!!E za|-dc7UGBnpsRFo_>CkWhkAZqlT8z6I{QPgJHsm(8=V+dH*Jv1veyQkvC$b$!SeIc zT8c2PpILh&T;xqy@I>!aqf4)PT%fdsew3BOW?2 ze89)`1xB1&;=IBtzTQUrr@rD>>up|j#y%x}B~|Pky=q_-Tx;GfZSgBF+px^k56k z1<1e&pm78_xs{Kmwor4@DZY;J-U1HBWhA}nEbKEcr1x8tmnOOsH|aE6F-E9#7(P!? z(q~Nggso1J%ryh(vka_4{o?3?_F2MyUVYnp4t3?WbI;R%_}Bj2O8QsOeyjXB`X5D? zFIO5y&pv8xQnp@3w98*Lmi>d5Nu+-ouNe+PTRbvi7y1J zUr04d&^l@BFr_A89*+-56R(x!?(oNHgG@0l50Qptqq&Q#nWnTVtA7cz>v5nj~_mF=4a*OlfjFF zdh;}11@S9((hLvI-&g@QjdEfFSV6J{%<~B(gB3U8vSd5OZ5wd_z(QBH&L7z=5?_&| zzKw^>xY~5dG@9=++r=kvLyeoV@ffepQ=s-LSgX2gsBr3qw8NDfK&@BHpup;;q292; z>iSO3B2#jwkB)`g5l(vV;PhoA<%Za}7Tmw6!CQG7$JMx4NoCURy)HFw*j9}{b^yir zPMW;#UEI-Wr%_p_77>t8wl7s&IKc0?sEx*kOn;E!@3mWN;3zfjmn!MS4ETzHW{WoZ zA9+Q`U;sNZ-rf`)l9=_lU89_%uP5{|B}7dqe_kb=;gl`<%ZKJ2CDQth6m()CE-4mz zN{$f5Q-rqQglvUwAd87@;#kyHj8{m+{{Tq3o#iLTEa=ydr}1WOgY7eE8P$Jc>S0n| z79Gy2-)L4-AoJQehqQ6`{K_;BgmTz%I7PZ^?ZM6?y|4=lRgVyLhh8K6Hz};{SN=6C z_}Bi9evj~3a`|CvMg;qjZKV`Z{?2W}46^uz7|n7Q2G@ zW!p_SIWMnfTWu+2;UQo!tcN(?F2drT#B%txskkhFJhx(}IG)TDy& zbtQs4IzWu4aE597;ScJkF_OE!;kk40W3=yX|d8`d+)7woN5Ic zFgboiGeGXMzE7;?8lw~>#dXJPW_nY8t5*G{mHFh}Z=RCx6O&#GW7<3cbUJ+@&JVJ` z7*eOva;jSs8D_`|C@flzfZ(JRWR$!E6ufY-*etQv#Iaxwset!-2|y@+M<^UZvGyiZ z14Jvg+GdP=u{a*@Oa@nuJ|hE_!FuOG;LM=c5wfg5XmxDotWe=o-(5dGW;u-QTh4FJ zX7Vuhj5#b9aSZd5K8){N7JizG(c*MVT>3j=)oHRVZIBcJnwQoNrOZ)@!z%D6A{eP@ z_lfz2czY^yaDDL+N-5~WWUF@p;cXdHUxh08{x8uxR$&C=G0zWBeKzm z6YfrLgo}sOEI$et-|WT@%0%}{3306pD_6uiarduMaBs(&Wlu>+=(|JF>UD$QZ7!Qw zi`?tIIRP~kA~j_O@yw>d!8-RRuw{=GY4O%Ceq}39gBu({)_CzP$f4o*F}y{l>!~`1 zGjjo1@Q%ADS!unHd!q}h(}$(S1KWAyG$wLpT;%c>d@d(39fAdBHDp98*47G|ur)AK zyfifR!!31S+;+KpHZwM7zwN~T06|T-EOM{U5st~Qn&MD3MJ~+5s~J!@R4dvvYB^_T zKaY8XPzP|T?~BF7*L1u-^U@w*9-lIntMpp>O*QBXe|%1r{E2mJB7;TkC}S-bRK_Mn z6>0WQu+*VK(D1}mRcgV+8}SXsmoCqcggzT3;gm4kCh}V5&Fs0$FU+!G-k^b`7uaTB z-*E}L8zNx3yQ!K>8}Afdmo2!JXP~~gs^S+XNw{24OdC#C$XQjA2%qZjt!UO zqE<9{y<`4M;g(#vwdd50xR#3@;dr?17q+h%KZ+t!j?0I5>jA@Y94MTtWHbV9h00T_ z9FeseiusFC=bXjnjm&MTwFFQgwgtm@{6=i0vlGoTKJl;$*&XVk<2~7qL6e8cnadX# z^dvXKy8E;34O^z{UIN9!+Pq%s6L)mE)Y2ybub6NEN>o)wpoRw%4;3z4HqFM)CLEOp z-KAeniU0}^GSuckdW^xWmc->JY1tTT40EiZR`h=mL7hbI#I-~R?x0q$;}KY=5wg?p zDF@w^r3_pjN|h>9udRJ5R7;igsGq_5*VUE$m+8mw8#*v78Hh>DeB-$Z6>&G9(&6Iw zIaeWe^dl53D&I%#pP9X;}*}?2J(~=UJOC;D=!f)Z{6IKq~OyO%oxkCi}P=1gG z9L6m4ORv8U(xes|A2R+rm(zUrha%mFFQy^2_(gorBPO!%9n?}p0%hZ7GZMC`+?HtFEP5=YY zCKTQ1ASl>6)kTb3&TW`Eeu=Jq4!vM(4D3vOEpsxog!LEezr4N+4yGHUHfOwPxh@DC z(B@q_w=<4iIWlWi$@&!7vy@&zL{z&CoWwYZ^+m|yRT>WzTPbL{i;NQTgILhDgg?WS zaVeDm{KU5w%r<(QyFhN0cMc!9 zP9B`XQZI#jmH1ih4FbtLMO?T%x0z2D)TbMGE=^;YNs29j*wDvFV;ie9WOGa&tj9t2 zQ$eprdr#fI7!MXoplbDX4DsF^pgH>spAcDC?>_>)VVBj*Qxb&4u2f-{>B83zSGZy; zcKXJ;mJ;kwSftK;{bwaifRI$GG|2YmRIMC$l|*+6sYV(XQHp4kqpN+TkC~4Z);O>w zJ4!QF!+VH?ewvIPmo1z@)B^2}PECu;@Tp%)ul=f2fAH7yxc>kQ*PK-L^B8`n49fsE zX9>{j5Z>}T1SkR+4$F*RknrgCr zfYsUDjMu9-Nbk13SyM2;=$2ivt5$M#e^Fk#6<%gN8?@~ja}>))!PF7sM06jw1@zYg zlhGwTsZEoNK{t=DQFT*3{ft*RfI_K6BOM{vRc&Akskwb;) zLN3D6t)sJliEXOsQHMuEs6{Vp&v~Hyr8O%Zn5C=Wf#zqdob)9Y`^+$XCRSfQlBYT8 zEOKwsA>-d z#M9WhK=)K5$e$LVSVy~$w0^xH`@>4FbKhhH6o)3?EH#5ln>oX7<{r;w;Npe(W>MWx zzA5%4&g=PS2=uv0Q)&0Ge8iPk>Qf&RC!)fS!23%B3$@q0t3=?Bus!&LQ0kNGb$mCz ztIb%xu0Ie8;ACY|{{X8IaP6j!y5W`hK&x5Fw#0H9_!Z&ErIk{;N62UM{34tn03}j+v6g4i{2jV z8iOGOOI3Z+_@?2C)~3uC58+=*`szQzrAn3baS~Vm01^cLdV3hq^;8usO=OlFp}Tv3 z5fejQVTDRlZP!YF({|l)Kni96FgGHD2|p}3`2NIAMY43?&E|EcUhs|_>y1NH!)+ok26@IfkZgS6u z93 zJy`gPsd=a8NXHbjf7lUl!Dg>G5CkM?o6Y~1>(6GHo$}CFgA*ze9k7|VdONP0-2TCB$X1zSi;%|+`UqxrGe^10xwo8#;y1()BALUZM zmGrNrN}HAZs#n$D@iGHe={!UuE;6beRa4 zXhGviuaB$nk!n^ABN!y3&`uw@m;HuQo;*y2RHMe_HUYYr6QsrTsgYnXHcVGA?=C~W z{E!C`hglVl0r|l5O|t`^yYVUtk4T`!{h_K6wWl)E@l0oaYYfy*<6j6bXdVmuG4O%8 zOJ%FgzY@?cX{>Ped`m7qx&G7TiQ8eCyKCZ)L|W7b0y!(#h6(tJAvN0)&;o@%yZMJy zj*oBZXNH}=&{L-*!EYg$DCFri+OyVgbH-#tnRgstyebUEg;SC0{{T~zzktu~li?|{ zrwuXVrzf4T7Z=an*+bMQ#}g_h70n zy1~26%Km9*K1sEp`^z;b&lq9%ubIY7iR&=&1sQrdl|p+)>ZM#2c7qU_FyxBmO9>%h z%652({>&K=kD_4wQ9wX!O^|^>&TI3tO)if<&&;)Wn_>dn&B-tG6M8l&<8iVbt3Pod z(}i>w=~DhqlS=i(Y`)oBokP|6jR|gMgYln5O%&&A1H#Epm(N?uJhQ1A{yYb>Y zaulLHGiMu3iChIg7iFF`GSTnff3}#5TDF#F)NHO3qb;kprf*n1Ebkju_Hh%us!+d~ zh|Iyby0|@?m&dtb>u_1QoDeyfU>2+EC_JMlBo@R^L%cU??=jW-%#!~A1WM+PU>zj{ zSz@*0KCulVi7|fD{g;XyrRF|eN{BGEv$khJg?%b2e==9nzlvOcg@5IL!oIK4r9lSO zL@T3iob#a_N_qPY61DGEeK>nWbU~>2$$C4wDgID)$EiI|)(=$VtE%e>h&H!fDeV@y zOTg0m)%ltWQ7@(m46*tK5Q|_kVD!4II}GcubF2**Oshq4C6`=Cc-K_t6)1 z1Hk!!Gm%>imb*Rs^8+K;BdquC!<(CXAJi5A1p&mU9SL3L0a>f<73ij>BC>Nd6uz)9 zn_O2xhMDO9024OwVk$3>SOYk&BHs2T>b@f3bg=An-mdZS8yi`%zek9G9e$&Ll@%68 z_46-EuOpv0h~DobWfMD`H}NR}dp~?j&>QJX`{_{@p`bSZ04Ir1*sQbrcJnDtys_SO zJCNm5%c%AOy;xhz+?G?Sxsc#qAswyQiQ#4`YKM+auCdh=-U<8sLiLvl6)^+m18<=N zq(-CJ^!P?-forUGGkv9DBB94AM1z3P;Eq)?Cuv15XzoAk7rg#vDF9*kO#8&THFsN` zTM3*xoqh>n%0V3g%J!Tf3rG8ElQ=`bKiVoII_lq+FFowMSmkv#KNZSa)@Ry9vpWFL zl-EPCGPjFnsV*i1X!eHjK7{=19TqEv=ktLrOTE3CP^6N|EKILcsTQ?R|knQg_3fESD~D_Y0H z=<(R*jiSox+!_oNA5DMZUqo2AXj@<$GQ(xlu>MslRIjfQo3Y6oMU~cYXfRMp{{YF{ zVvCAJwm{*R4lbRC@Tq@Rj`+eLnhFVB{{Z>sgzomcPW2SN7GoaTMbJ0{;ARmauz!}# zEfqJg60L~VuvGd%rkk(EZ(rQIcwO@Y{{Ur1Z14WZm~X=~3`F?-t~PoNre{e%(K#16 z{bFV6gE5{Zm_Q^;DFx)scWLv%Egn+6zw97UM-M^{97=e}JB9i|RCasJA~#HF1~Mfs zjb!f@zKAp`%|@ZssnlTPSCjV%7XU||UH zb!HUqI%jFxDh9>5>E*#1Jh0E(@d{Rb$F;u^Una^6Nt~3YNxFC;!!Ko@zj>Rg=%{}u zSf|!la$F1Uw(su%n7jwjMe8j9wku3poPJ$r#g z*FE;_%qyRmQoX-LmJc6kb8KLorRMo13F!X-Lw7~-bwcL0eG}F?cN9=U%8j_D0YQzSTzKCz ztQuV$OeL#uc%gfMQ^5%DcgqniOFUFp8h6YYZ$07@B(5nc#+wg(bkz2fY}+c<^GToWt^+HN>>~qcOXdqmZTR6dlB+=GSupR%zp(#HN*@D+8tH z$p_J|m_WO_eWO-!cPZ;AFMQk8#w zGMCMzF%)>ah?2K~*>6Slv^=(o3mN+Ty$%2SXfZyhIr9 z?fZ{d?AxLuMQx|Y;!^76ffhU?q9M2~?FWWsNoPg9`1$;j0I02puVRnU9N%d-Rb z8Td=1e1DKdA46nPNUGcBXE>eA7EB;IY609wM}`!B^pFIxp-S}JUFf*t`bLmn&=&d& zJth@4L>ox?hDXa zxAl(G5#4Z9tZ?UWs&;~7#7&Vc07)1ne|N0*I*(@Zy0&8XIH&;$pQU{(>0kL&ucP%( z;g90~02`O|Wyknb0I3|HwQdQtkD8;a>%t7(Ooid75{89A4W+B$^bjMLtxF3RdLahG z$fx{>riSq2u>-8E=jPdS3gxEE$A_YkX9SKE{hdTqF?V=*lzgkIP!pc;gboAS65g^{ z^%u-fOh>@!iG{V+yJApXbLajt$y?*R8>_^#ni<%JtP-y<+p4)kvT)!I`l z*}TkI`Am)))O#Cg&qsZu)g_x{*^jm+K)5e~3}7z++9R_+6DOs%1Hq)}E|oox_rW~% zwRX5gy>G$0>`Hc-ZVc44IQ>5Iufvu0JwGsyY4}UnC^e_5^g6PZB%hkwm(~o zWC99*TRz?)7%wV0KCM%ZV1o_jS-3Pz8Zj`v$O3Zm#ZsDhfn_!7>6UUqI5eIkk_;N- zR&yz{n6`|%$dli6D&M*ja=-OI@Z5ije>JcCiGhD1;xSj`c6nyg7a%-E(3M68uW=ntNT9?8 zRrBI*07wwAlv?{iC}21q1K;Kj#2N=gqK8`R@8$qC=(np=OTPxbxISXgo=9)vHUo$P z&uD<|i(a!Uk6ZR%dA9>tcz)r;yxAeLzzKEOFrH=U>Pqqod_c0RVEfcg$ZmOJ^_8bD zUt%uBT6&`NWy&nkT3yw&A@%gtpf-)nET5GC?}#J)x_oo7nUiJxK^C9up5^7I!s7Wh>V@Y z%J6w1`VU9TvzO(qvCL;X16YdRK&FO*;PhsD-#37^@H4`|J7CrfegXAm8mwoN?)xS2 z9FpEud95D3W$8~OyOz$ej#w=9Yx<4M+c1(aV&L-K*h{Z5dX6dmn10X*wcBr%%M!!9 zuYxUNYn{%w)@uidzGlNHZflK+p#cVu_PoDMK#Ztd-rU1QD<9f#S#pIH%OK&4LsFRm z32O7clJ&uYDC_DcdC47%X}+IbZrF$kcnJ@w{^jS4Zcx9J$cuI7w5a7~<2u6aA}48N zJ(%hG4iV%q5ovo2toNaf_*Z?1?cv@(Or~UNFe^G8hy}ok0B0>*7rGE+UX@?gB{#z- zqyR8k%jtNU{{Y_Q%lbe0*Vg0oucH3|Am|a4KbClx2Tlpoc5?iNCE?3+rS=!5QU+0x z%jz=>3WxCpo~rZqfT{3W^6L5afGosU$O}Hv zA{uXRXC1%n6=A{a(oq}-Bh~A~yb_J#hrazLm;l1whjhK63$SRnO>O(c#TS!>mB~P< z_Vi-p>u}Pr#dco2#|YW>z|Ch|&c*sTiOyjI*AqtDXRSiG3Wx8kwc{@3*=uU{e_3iC zKVNT{G%xo4@pq#l_DWNs_=s{VBZlUM!`fa!&Gm`2Tl73)SxiCV^?Sy>X%;!}d3v_> zjjEkdbY$w~?&vbb3%txYPw8|U%}v$`;kxhF&uGY;yE*Gw&VFGPJ&pD}*7?V2Lo%XT z;>ERpkKfRChIZQ6#?KN&CHgQF>4T6wxQI!;yKY=n(lz1YCrHC9C?a`ZZBDk#%h+GY7m83KJ!;jPstSvZunS42KhaH zmVPjTrMy_>729*$amN^q?iq&yUiL=DrgaCTe00qBf(&l9J>_;Z!`6igMt8}sv$Bz# zb{=|8NuXt@+KOO?$7CX@ZDdKdsybecz9Z#zkM3csQZ-!81*nMp#cPSwAq=x@&^dD{ zT*?wO_?EM=E`p|CMQqy+IGGY0<2gvg-XW^5fv;eL(S>K7l-t@9i#1$v(gLv3;YAID z*|&_!gJm7{qnV~%iCIhivo>uT*8Aoa z^r*AQ>-SRa19xNlBC2C$!S4S6QzFk(`+pFW?Kyr|;#yUDWqgZ`D@^%NM*usZ=r0K< zT#z2`-1YMqFxCPaaQ2GRUB0Qc({i=jUE}KorX#au{L91h42L3+eaUHh#tJItxXV*V zrUzfzg&pN4k&niI*vez1nyB&TQlc`^?}`z_iybj*%fLZxsSB7p|H-A)XwhZ2m_qQw{8L}i0F*YPg#?c zt!ihlF&Oo86aAM2b%Or@t_XB{!dg0|U%wL^SP*siVP^F}jrEaSyg^&3+oAp0D z%orIuN9E>OVmNg^dP?8A>BKi|yGzcc$YN5+4+D_Mb|d%Pil?I8`uTuqc2`Wkd>Hc& zF9LfhlKD7`ByR)D2+&jCaUWhFb(ZLSw2QL5^o|PZwG~#Sd_*xCeZXpy6Ci#_`1y$B{$pFWc%>b>Her9lk zxHbpsaD9-L)MJ3>zhV@_HJB^P#MIKbNoVEJzBtVTsVy#k4J1 zTF+g~TW$sA=fu3#{o@O;(oAWEY5Ow2%KqUu#Y_HI{{W`HoAiE*FY5hnELnfVfn`SN zu2(!ov9Kns_kx>u0}i<9D`jox8Pp~D1XJpReHJ~eZ{N~f1L(_0>b9OS_Ls3*GN819 zznIYXim;|=d>`C31zm@BUn>!v63qVm`ay6F_xeg=SZE|a)Ksh8lmB~g~Cv(FXO`vb+F`xJ*8c#=GTyTO@%4^n9T$-8 z#79r89zD7s(P4XvA9uCo<^lU&O<&!@PMNI*`PaO;TX6XcC<4Lhlqp5b9)#l%<(}U8 zR;A6rs~Zm8r<(B*Vp)3pvYpU_SBw|Ib(wM1z}>wA_-5f?$T)`$TjAbxWr$jGJbwJe zT~3=LHlt38755)Wc1{K1+P^TSkb{6^?KB!`IR2MD({v(OLHoqxuf$mvC(CU0{Iw3d#=>_^radP`g2Y4+~ zyv6eOF)5d3-AY_-fc6J+V6tcMxHj9Ybp@){H}wnvbYl1ZrFHWuuSz%S^Em?xmDnNf zh2ovBe$v#IiV^zWS+wri8T+L**yUHo=3OXAQ>NN_2!@rqtKY%d#3*tT0{tGHT>8R4 zHXdE=e<@^BwtJ`iPfbNb?Vq&1_#GU3!3J+59Pu(665CSKGcmcQU>wS3J;h-6Eao;! zFU-Viv}(*`@ht0uIWE1TrwUNz2A}E}&e#<K0ADh$ zNGTV)7#?3qhy_6pfWp3BI;UvjjT^uoj*evnA|4@ly2nNYhB;%fe0J1I3dBm1g)@sj?&}RHu-frGXrF{GsV8k-WIB- z1+PEc^N)-fbm9=Cjl-z?PkEbFOD)su${!`E_z)7Fh` z==;swmm+mf&`Zr*ahJX7WQbcnlL z6@lL*ZuSrR84o`}qRTwgWzllVr@Zy;83@cS%SMjs5t0h62de1sCFsj(Zt93&{8g#> z1f~$v+^%D)7xlP@BnCRFu{^J&c^s}H;@W=H0Squ&>~b?#kSQS`!qFFUqa*!IM?yBV!wdqQFotFi&KL1IH^d&ouSwfHOWVFCyez0{ml_{D`cy<1p@8pN9`D`) zgQv;hE4gpL zu-A=De%|kwSwYUK7=FVM+3f!m6x{wV+ z%mw&+qU6hiYkI5iFbln3=BPdms_EgYkFzeh5&LE7EnEjky`du~*RnD13>Hw^j&ZXI zQ&F=g1B^nKDXB+-po(BaUZvNGW#fdiuo*%jeFM4Oo_mxG_9KCm6Z4rp4e_~?=*{dTw^+(cWd`9F9fr+$a`OuYJ}aH7j6)q+zR4 zhenlk>jb=XO6`?>&xmDj3wu)EWJ7fWY3|k|XMfd~?F&g_r(oWD8Gt)!630q6Z+MWl z4ZqjjmHb+7yqdn4C;jOGa||5tmi;#j{))hL~eenru@3+>N0sO#r@zns0ObuA7Tgs(A@)w9(tTkW!KB8$>Wa`qUB%o2~OnB zL5_L-=1|SxdA5&;wiL%!-@LOdE~?(n3W4^0c!YhXFCY;bysQE(1qG+9T`aH*Z5Khu zPnP95gJEljS9hP>z*E_uD6U*V;;3H5)C_PgMDOX5QuXz^m;5j3a{ia}zvF*Pi)DRp z`QOr_N|pRBRjF0kdfOKSP;|$<&U?##(0WREHOHGH_93SR5$rSCTQK$zJ{&^~wdWFx zLsm2Daf!V96sMjC%&5f-$s7zYX8SD+5YV>cvAXQ(S66^2=7#HAKAlb`b$68Y?0jRJ zVJqECt{nF}ET=gYhlhe9)LJthLx*}#G5QO@Ob=qy3ppI!kr@tt$M)kHD(g|(fw#H< zhgQ0NvdS_3i~Gx2Wv{1H=P=Xr_Xb`ZP~RGB;yO56+QAhlfm*=Pzt=M%oO?k-caH0! zV%uoXea_OZh#RPuj+M+c!=OE-Ld%_flOz`KUacvM+A__?R}~y^i}iuWu^Vs)q(NBp z7(%~hFvcDsa?fD(KdFF*;kDjf$VuLIczclpa2Maq8G`|VI$uYK1Jo~H?pTKj{hghq zKiUl!SNiGFEK`aOe2~H|PYx-=nXU1!v2#Tl>o@K}x@#P&Wsvco_z?QKGAT zVE+I}1!%PfzWI*$z+1#WFoSFnK|+;&Cjd5mh&}Cus0*c!BP+<70-pSHL$6OTXd#~3 zn}0fo6d_UivkT51(ELV@dgV`1r?dqGx0CA-+f&Ec{mgyzT_L3`yZ*hKm%`OVcXNZ$ zE0F0=2W9PyJhYt)ZC$JDC>bb=Hu|!Qid|!Y!PuwRr-`+|36SECrS4>~NC&GZQxq`6 zxqwUdm8t~;-`ywOUuk)Vi@V;l;s$uac)dL*Y9Vo6d6ubFB7MQ;2-Dgquhi)CiC%9= z9>ID_r-uvIqI_K68|ZK^hyBC>W*I&+A0}lv8dx#HBJ-l0v%{G1!RV!T=g@>`D3uSu zdJ`uSfP>gv#O<>+yWrKp40^DhX;4%$na}*oGl3yrc2*5cQ}Dqxew3G%su7?$7sMuZ znX(;TCAV1Z6rgbyb+4n=ET<*-l{75+Z_DmL&?-)W{=X0}>P!R07|(7jUAB03TnnLb0sRJ_5eXVtT(m2x);nB!N@AV4I`Z6WwYHB38?^rbBHJqo z1bBXnm-M`U@m#pSTmD32{BQVQ(U&Yoa2uV^IG>-1Mp<}AxwH0;O<&25d`2czax(kZ ziN=N;t&Jqz9}XV;dyiX}be)oD8Rb%=6hd3EE&wTr+QVs*Vi zuViDU)!vW1zLS%S3P<(&OGRqY=913Eo)q7*d&c)H8wYZ$<{+HwekOsb><~t_T#;Q4 zwi<&+KiAAKEaXN?p{HKl4{671;9Yym!C{-{d_}cdo8XyM-#n#@`v?xNckuwxyxw;& zlSg1BH#0$gpBWwPKq46r+}U7Z_m6-A~e&UI{Tjy8RQV~%3rj*Gv#b?{SRKS?P5qJfinLVzxtoKI47(V=*4v) z;{bR1|^H{6gm!d5tg>#M=eI6?MEevK&khQc-;$z2h zUqkhE3t!8L`xS3|%OMON&CmBNd4^j($lm(AQ4xERf4JqgWuW^dM%HKgIyxFFNgm-( zt;=TXn!YQq612islBKCIF~UUmaQjMiCYtrF%nR=d>%-+?Ya)Ysje6V{sf`}&;D=~R zpKOxxY8BgwlrMRp4@YiDsU7|a87D*GLHD_^DMR)EciAtYnZ6Gi5EZ_ki1+2;9lwU4 zn>M>O6si2}4|WQuJ|yK{H(p{nMn|F(oTvt9;y07pT9%5m4V>R!GRGDNj`!3JyDIx6 zjTYn&W}p;++j>^D7sILcDMRKS?Z9j3IWgiUcKo~^GvZ*fU|gQT(q$sBiGZ!l@XXhl zK)HJV01`j=Qmmdny!|d*S$|uXFZeI!Bv`EqYMM&ji z`+i0xcgS>f$qMDs;qBY)Fj(DZpzQgLf>etu&q&5q29ewShoWnVe@VN^gkI6MrCMN z?RZRMtp`i|=h7#6m7ZM@4mBw87*C3$zuZL7zfC{4GeaCzreTLaBl|GGg_pEOhF<|x zOB4o&BgbD!d&phaKCz9w3kg$OX9t#PyJtsXgWAn1hcsu!C6sh?zb`*{<#lM&wHk5H z7cdgoO2WV%E_CxNd^kP#UzvN77Rq)GUhuIcUDjHo{w0cH;Ida%KX)uO2J(1bf4C!c zrqR)Nc@=GJ?mSSdc6Mt zWMynaXO0M=sN-I8_jerp*SyD4ymu3x>3CAx814T6A(-Q$!1aFhI?v(J>-{HyF^Zk} z=!tU6R&9QLF!AiVAM8ezl$5dI-=)S23|7ZZlgk7n_m{K|OWwq$yr1AT12+ok z7t-O0Rn6M}08J2yA*w|70w#LBqwYSCDh02!p$B72LOSDiN}?|D2aCw`VzvhNM`q;) zFs1lrFLKmBMp(sqVrQeZRIdL3lnStv8V_h}*=wV`&tP=dtxF?Rwd%MM_$2OePY>E{ z#z%ezmyCFi)AVpFqxZbeT2vDaATooJzqUNaT9AczJRLIl+H44GKZ?Y_0kobK{GDM; zHi(q_6P<2RAuUZkSFwmXlY$}g)~+u>mCzlkucU7hTZaugZ`uYTQ3!JK4(jTQlc;xR zb0BnSw=3VvdRS%s)Ug5j$y47qUBD<-pL0M{{WoXe=$7{8>sYy)xMiE?aWBSM;UC1&fg;0``!>;&`_^d z@dOs9KZ0TrM&an1m4#DG7u%=e8>P}c1~?S_IDRH(Gm@L`OeEMD{p%Cr1$A#8`;=v( zkUC``5E=o|te-Jn$}iyk{UC7I`DyV8bWM&NGCwm-6RDT}5aq>6=&=2_G3#e_e(qR} zQP8XYqj#!9@AKkavWI2n6c+7(-9WSi=PJJO00+KvEILtZUj@#6 zF?*P|1}%TyW=wOgQsnJ{-@ZvcNymRIZE_%i6IFwDJ0h(?QOkd2XZ7 z>+>iOrks)QE;2iWN>1)k(uYoE>n+uf+1@@AWV9)PlI_KqQkX5ZYx8jiDl`laR;6@# zN8kSdVAl?-UvjtY71jo|SKs?0HPPF-eT39T1Hq`wTdJ-fLyd6cmf=)cM?MT3-CRu9 z11n>7hfQ`(2x^6Wxq5p+Vit561ydK7b+&X%KdHrhZ#N0vuaU=YA?e93yU>2}h>Mwn z(YUQk>Z;?&4<6EQ*n<^jFstWZ5PCeg-5HC5#gMz)`il|w!E>t_`AQ&DAcvz9IofSe z-v_QB071EAv=Osjn6onKs{0cgeZ~tXhBx1|r_3wk=PfdnhEyASLpuq@AAs!oGYf=m z4(AXPV@k$k4=UekhKZ{*`YwM=E*_=7R2g!wc6vE4wbV6fU^{jkrNucwSA9yCRHE`> zi-ww@r)MnEh3`OUJh~HqhI&C=#CVmnMQssNozw{E0luVtrPS@|VVfRe%VLIh6inYK zOl!&j;Ci7sw>1Z)2J7(p7x`cE=l=jjm;5XE-_d6u&hsCk^<$NVpfd3*MGN zE##GUE}0rpo-vD4`S;IBa`7`(KEpFA2U7{${-;=M9z303wo#iXWJ$dx4RlOgsexA$ zWCoR3veUy7*{jNK9xMgQ`0VcKrbjP%FC&m%+ z85j(;Mdh#R;kKG{=bGL3jE07Ym%&B^Mq5*jg?--;)o}q7$p-=$u03@yNHk*gZ*W}s z9!yi?abDLk#WVguIW8Ps%BZ~K7lQ0mYH+qaU_r~B-c#)^G;3Yk2H!9#d&<`zvohc4 zpSX*0V3oB_hI_;z$eLNY0`sekXX7}{W~IIsxwXANsFOh=RXfXATZZpnafJo5&zXOY z)$+_JR_?##CB*?+mEgC0B@@;YXRO0H=46|OH!33joqLqmeoDk4x>oc z-5;?E0ahvCLEo&eVmEejOuQ`A@kxWpVO)*N#^A7 z6t(=k&31J2Dcb-JA9uVmRK*4F#%}!|XhEuBP&Jy%RcF{W1{=$mXn)i#< z%wu~x^at$vOBC2OD_vcB1Q3d}`=>Cd8)b^ART!d@sxF;;`JC@e%OFAS?k^nX zfch`xHVrR#+cwqXq_Z};uDvDy0N}Man)+O2{{STZFYwgAqWv%Uzg7Nk(T+1cNkLeJ z*uDl_basD3FI~q7DFJY=NXE*0KgdoGr&RWlhlIWwxh|>vL-&U z#Xeki{KwvZC;r01hd=0y*bVxfPLhZ!%NH@}u^usAxtR&U1^N6%IHU{U#lC>bB0ZYj zrFyC}tEug}c*nfhIn$|_bi4MM?|F=@`wM<0l?7YXt|pTI08L6j((RRc2SOS*T_rg) z*)pKEYNs*2h0*N_WHp6Uuzbh$@hH{)4MA+KoPK2)_LvnZaeMp9HY~^T=lg&qW-G%F24{E@VW|0+T!G~7Js){$f~h)_l{IzkHGL=} zlaRQVT~2uea51Ds<_7UK_Kn#uvk?)oS4(pJXCx##mb}4o#WM2FR(9zWvcugl z)j8<^cnZ5;m6#eAc%p3t3D9JRuwTqT74nC$WqsmBgu()LxKtz6-}T-UZ7x0#OemwF z^9u=KFYS%g&Thi3EaM@tM9ScI{nT45gB_`507M~ng{nh$sQ& z79P^F&T0j{2loWs1GZU$16w^QnumA*9FTdVCV{T{f@HUh_2^>?Zw)=Z;FgE6Mf*BM z)eFw&e9CWehiqe2Qs6}Ey7`H9==mRzz=UQk_HMo)qm6?#+3V+iWl=4Qy?T!@K4n-m z2}yn)Wy;gz(TK~Y)j~CK3fTViW*=sxFV>}YK3>So)|_kjrh865i?97c)iwOD{{SnO z^uObOOP4n`mrX~}@dce7AoLvFplchfwFI?&qr-GAJL*`H@*kbSib~p8h8oqXDz5g& zO`S%bLQrAOHXbSgqwk}krde+14lMu{enpR|FLsVCVfTquoE5xHEH~=#O1vuj*ZjFm zOrDti_lTv0Rn@Plh&Qka@cqcXaWXWDxGH+9?*!9a-w$crt0~)Y#mdln#K>1X_I5*W zp`_HHI7|q}`943$yqw_s@I9x(Z|^Nw9&(1-TXe1*h3J*|mR)VugecLBx9=03VUhQP z!m%7#FOK)(0}B-k!Cx|uK%xa6+4G1bisd=B9(s852pUbLlJ%aYOP5gP7n5oBi9&69 zyK_}~)y(o791-o}QbPqP$bVmHX54?3l^$n;CG<#h*EZYw?*VoVd+V=uCzYTo;BTe# z(kWOBAZ*g<*WNA=IDM7s)@#p5ID#n#6w$i9kmuPR0Xf#;Q@oke;rEJQEkgRyg%g5` zyY#3Rk@td*LAVL`8G&d0nf3qqlk*5{)kKr*xm-poUOzrQ1ys`fYHS1A4Se-6xekjWYcu_ou&%w<52?j z!Rz13_hG&nz~VDhw|PO^<7s17$; z=)NdxAQ}{|BU!H^i~)84KI0BfjKu)iJwIdDyrTXt2Dy5sJ>tE632@pe{Gz?09KUh( ziNVsy&ke0gpnjl_Zch<5D&!Akej}u|kX-Z}L7Cbw_u4oJGf(_ICB(XpKdFVg*6N>V zD;F1erheX$rDO5A;QUMl%5c*2s+&r@y=uPGMDB8Zr67ArN4iRpM_^~J9l|JsJK69( z$xK>he!?aW%CIW@@P9J~70H>_K5|mNM&HCL;j?Vo1HTQ@^ zTw>pPx`T+fW&B(&!xnCGW|S#qbUdqy#cK@H(d_l}8b#aVx8fWI)*au}A!MZi-LHH3 zgKV{Hx-`H?@FCB*`$4UYhl6jyFgC#-0U9AlOE{T55b53=FkTiRtV_59!~RRr^21-u zNy!-!z@Oe@@PNQMuFla*UwKR22k!@?;LLpkoJDXUX$repOWP5I<R9Cozhw zAeXf%-o9g7zeCe}<0S-H)#O5NE)MkqT%B~KhXyS2RAC27#+kk6-M_c4d8?%8x$TXZ^36bdVBo_F;v{{H~! z@YGh9FO9?tbbi+To zCM6~LJCcrdUjz4vcIe(GS>W=++E5o1Df(_-9pMBr3FUVlXG5ecx{X6|hjd5P7|Y&% zCF$t8KL&cy$Ysx}$oM|<3olm1{q9oPg805w_nH(sZ+dIq1%|%^zZsABH{pf*>tE4@ zJ)-{r1jBh;Y={A4m2d*tTBU53>s_9D&6l)Mv&K}drL3!Zp0Mml)49|Lc)bFT5|$Ur zPi?~CM^XNeqc(G2-}Jw(KlrLY`rN;*{{S2Mze|_;%DzHdmOD%@FKJ7H_Ch0QRX}<- z4cXogg}gWSmatxcH~8G+ZFeu?BcbRQF%e$>0J1J|e3$UYAapP8W+Uoi`+#4)1$)6} z9E5!)LD;FVmJ-&nW1>bq$S`K*B?Ch7(zOmo06dlP7*vdgg0xWiVpm1Za;Siit{$#E ziuZ(mg>2Q|{FaB#4%|kw=G2Cq_zpaO-T0b;aB~T+VXY~zQY|m6gI+4r(SYyS4|87d z+soO88TIQQXg9d5z<5R?S{ObDtb0WJZ@{q!hOy`{Mg2&2uv-SQh!VMJ^E;|V^CIt| z5K%gF-F)69ThA(2k80@^s-v>kY~#`dUdr0n^7SE&lqzE5x;`!+D+U0Tx}nb>?hW#} zt!yudsQ0nfA9<@Uh;An|G-2iLu^V~H8gR?Bs!=$_hxz(3doYykT3yk%*FKSWvySgs zOSch*r_PL5M1I6UWIj$`aw9vx>-U&1k}HGgG73i(k_y#r1XNSe4oZ%YDvBn&%Udd^ z6PfHFSgVQ4hqP6ZT^M1jhBb2je8YrBVB_`uU>V5_%Xs2CQwOU}!zfOV^%9@lp0~$z zr?=J>Jq{ng6Vk4?nM;+-5d6mFLo1kbE_g%-a`SQO*U?UjDYqqdgngnc zZqP7r;Yi#jOTh}z2r-|S>%I#^se>$T+-_0%HrbV4alBkm1u;zj08{n9;d15w0O7x_ z{U81<{{R)2E-bL?Eb1PUpYOI8bjHH)8VpEW6(mf$3?f=Zh^&IK$N|xm}jtJ z5zu;PnV?`Xw?yrbfqd-?fYw~Y1I&*WLqQ z?RwYsGLM*eH!cbd_L+O;qr9>(ri*^^$}Q!a*Y^NA<75oKsqXBR79Mj2X_Bky3oh`) zH0sF&f!0d9n+J)s3=ll^>GL@FH1h>C@Dq6VGuPo36U07)a^6#f`QuCGQlCFR?kM4I zU*KopcZ3H209n7Y3&&sW$JvG!PO3ik%o_ornk?fz;PalvY(q~$$E(b;c7&oRtQXMe zPk7?AciiLu0CXs_ScMi8tG>)#OLi)2Usfat8WowE1KD5ZGDk6dvo%!_taa@I&rQaC z2oBo8OLWW&=4^R!{iZH0k)lK@D+Zsqi!5!0!8TpOS~^P^uJOd*tX!<4GkWC*d1%62 z?KG?+I5PvUv?!!KDhz6`Xy<@Fii&qq{s^lp)?@xmWqhIB-UtjBOehN5+0p*?PR&7m z{=FXRoQo}wj3)2G!K_a-PNsXb=i=ZT)Lt3099%M1-x~~KJcq(c`l&rve{5Mahakn#en$-dmZ6qvMwFg z!tSquO-_pXBDU`_--$v7Q^jfi-$jLz>?{pEAwLt8RNin0I(#_#$B-_gMS{?aNL-+{Wtg$M1;Y<@$am9ajW5h#4qS zejyqAjh-d&T$aiH2hiF>n7&Q_09~MOCmVdq4EUfOKJzRs^p$IO28?W(bb_d9 z=|1OkBJPyv)TPOHfH-y82-`*nd`5r_G~wIw!Loyrwmx9p3y%{wAq?T|Q;c6RQl7U8 zjM;kN_&#HYxh2bk1li-#)ZItCB+%0L%qbHnsBO*M+1uQ457(O-9+%1u&DhgRkDV z219QTSa3-}s+~+q+h>WJxY3m#XchVww`fF2)xxsBvQ9ryX#QvIYu}khPSNTZmbk9G zKqjZ8!-o{7&l4K(&%AEO;uDajh5VA9&dm$$Y+CGFNA{(68$?XBFp>@g2oh^Lx9;>&NrCa{mDGewX}@ zrT+jY65)z*6Biu@rOks9!*cfJb1i)->lXwiF5ZyyV7A97{V5+O-cCLGW>U5uB{yE8 zWi2W4Vk4t(SK?I6=!c74+g~thG@2bA@geD9fn5$Eky`h3WYPS z<`X1KdAvlIge&bc>KtYfu03rPEOuk_1Z{pp^DETqr%Mlid1~43h67geN(x)Gz%*Zo z7Ny{Sl|Y?#y9N)4rtN!2qd}@%uYT?mq25){{{Vi`H`fR$h3rR+=RY37D7F{8K;eBQ zUMEuzDBJ@jlcc7xE3P4iG-z$>E37Mqa>StKd6S&O1>A#0!#`W3S=|N{Ftz4pWz4jB zTX3+-FhkSk4)Z=SIG=b`jv%uj^$+heJ-m=x5+Z8aO?gX^p5N>eN-B;IX?M7`=rt?~C=W0$92Id3(&>J%OmcheT2K0}$sQ4+8##J1)=WkGJsdVg_>wtzYTQ3sbDqp0M}`osFX=jED! z_1v{_VaYZO7^}=nCAyMmW^#)}qX(=`V!dX!9@5Z`!x)-PBbLcWSxITA z@*vaN1H`Izov*yMdQt;(3W~d5RH0V3N+arFwW3j1l4@i=V>Q|^0HnZxsJ*33vf$}0 z0CODonHDSuTl4mLj%ghj{{WCN+83T(W->5usg1kj-!Di&w5=r0mr*r{eiKm!^2@h0 zI=$2(OQ5qNsJ)%$Sm&%T^_pG1r%))Cjp6wrw6VhP_C;?<^KRX`rKdO{{Z1%_@$Ghr0Sc@bX-|{;FN{Yx|>$|O&T#*-^V1cL?EzW z+zQjl@Fx7jtOp-jWAx#S%zGT+Khh{P9It3{`P9#oT1UbCOa=9=zZV6+Eps12O|g3f z6j!`nP;detUHn~fywMuRSmO2OsX~LjF$Gz^j=Qk}vo;v-zIE#_Zq=PSzzPC5xE!DF ztTn-G=b(IM3^pAK-9vsMIXY?E{D{JuQ5O>{qnMPyUrW|FfGDV<vdePYQ@xlyOT=MY^^cxS-R2k1y zfKgi|Y8TImc#WA>nsDRbc2%ut8!RE+_XxiHhhz_ue4K4 zb>eU&VPUQAUZk$P5s8h`9Y_|6FbH_*a?s!1;ep+I%r#LU9cjtpSUKj6K9HS=3p7q( z{Rw}@{=1hMa^?MQTQB(E^M9MRIU>b#FavMWgLGgwL3K^!xQ!>$0D3%=vIv3Gt+1J3 z{S!(8UN+w1j-^1hUgl@Z>2i%b;(5R>gRux=?dc70I-vR&U+Oy*eKdPRV`mLtV>y== zT@d7*9Gx*ToUKIbfrVF@p+fEU5KAW(H}3MoO>xNr;xPnShs=iHr9L=!6mEIxMn3fuUIJR%EPISKXndeoDuCw>UI4^ z0=qw3l@|I9eVL>i>MQdrR_65+Ou5VRHz$>rS3)nf+};n@Nb4!+48&rr;-$uJ&5Je} zavL5o7C#1rwb1OFg;_(fxZ{fHXsg|fsf_m`@II(ImUV@%vj(yDonze@o5y>2UoyE8 z(lCK}3XB{0F=Jio3)wN}6tYQuI|!mU)~Wyi4uU3~iMwQycS35z-iG z&L|?r64!^K?FT7B;h7gjBfo&Qom3PzmD$=fAt6e&%IdJ8Ea~fYv}*%e~ax>LS%$+58^x#@N-&+f$5rxQYaHjJo>8CoEFub7!PoZ4S_@ zkh0A%nnOl*<;uGKSNUAIab=%N`d{)toz%I1&H9TXf@Fdnwf^b$My;jh)4rkFQ07W* z*Bz0T5FG>Te{N28@t-kBM)1d`v-sH$Cr#r|=?ee`1sDu>4A`k7fcs!80ezWUgOyc1wrSrUwbqu`H-gutCMR zR$m^7{KYd#tL!Dmzb{LNbdsJad*Wf^-dS~CLKS@5_g~aYObO<4QKpMypU%c!!-99H zo;?Cu@|@;SaNyLon-ncm7Aiy_7UL~@z|Yy;OGV(fy)!C_k*vu(c$M1KyOhI`iOh={ z%z8<5AQud`bn0^#IE3{h*g+1nMa6m|SulVrtka2TvwbJZFDz)^5XzVsg*Rfd>B~8u zj0wl2Yerx@Wklag_kCGRd~$X#gZCUgZs`>2g{ExZ9V1y%H?qYdb~SkR#wSwF=Nch6xT?VQfxZIv zeJ?Wa_^?IABG|}joi<%N594y>{{SaW$0co5%f@hMFkt%Jzx)`&=aF=o4Km@y)3B9t zzKj-;sVFUB;<~2_XzntRN)fJu*iH|LfX|n-0E?kQzP%ZP!Lhk2_CeeK00bc_GBPih zUAWN&SHMjbL_5M`7~w@s<6NZJr7GIMulRx|m%?83vi|_gS7VWy{^NEU>-jl=s4cy+6kWbH#d9o>w^-yje(}DvV4)|v~p`4e8A3! z>D7nX(anM#Qt0%7lKPh&x6z48{{R9pZ_^4zFQvypd{wD=H*S=(iqBoj6`w`HXdcPY z4!3Y?r;H^$tE{y;RX8nihXNju7Y}%1fAbw(6b;xH(|iZlZN%^7yKwyQafK$jbV z$I(*iTN2rZA(`k3WK67NrmWJ$mCPEOOm8daEGinN;294NvZeFPXE?!?=@fLgBiE#) ztoTrXqp`kQTUKO*Oj(Cbf@8D-bmmU*&S;%l;KO`k(kRpypAHfcAmEUwZ~7CF>OL%gO5o zp+M3wYcW?smdEE~8rc}l9FL??jMr~gd_^x*^H6#_#I#DTqe|eJ!p^jM;ha1T^?=Iv zN)1ti2Y%lY*k2bZcpSHxPkFj4=2nMB_xJoji(^Y8GpcPj@!8@~40>8CSme{*Wia5Z z54^MXbB{pztM3}%yIs9gD&TSd0D=;`LutPpLRpioDp&8UzLA(Qp@CHO&)TIpL<8z_ zeqtIud;Q?Z0|x^LS}{u*56)_3$;ysgWc7_9gSb3|egNRP{7MFXCJ+@Ka<5r@H-bP` zr;Cl@=oRlW3%=qS8?o9m-kdCRWAU6%~CTMeN0d4?D_7(r*ygNRLi4i7MD9!0@%VcuS$k?b92@MRwv`dBdn z<87WIl146X{G};-r*b?Nj00G~iUH>^7->aPXvi4FtVb$Z<;Ac-*}erFHv%HCj9?wlT>_aQ=UQKoWp-3?;14(xVi?;vZ3 zA>o+QhVU=47O;s|RSFRhxqgrT00$pke+T~n8itwvHT18e1UQ4h{RdOD%Tmh-{KFdn zqEbAP=tr6yp06G%5*Hx$G$P$x&q#2`qf^5uuJ6pCKxR4pD9-5CvlNp;{7xMf5?jAX zO{qTYFPK)ym+n;_@a>BCqYFDuge{AT9xtx?@hYjVA>t9FbPAkF>4ECYK)cfw;+v2!e85YkF}Sb!86hRNQQG3#9?-46)9@>deaxj7tL%NHl(b_j`&6;kS644pgOz7H zsv>+W=|Q-)6AXbaWxt>z9M!s?Xv#X-Vg1b|DSV-6j|rFNoqCU$c;16ugVN_RqtrZ+I;Srq zrZFe{0*l{saTYjp(9NU{C1He$t2}h9T&eM>@_nnA2Vqy-8*s!;{ttb5Ec?g&J~5|R zZwk#F=)Woprw{8l0$35VFnW>uF<4%3F9Y9?Xkn1#m*yx$vW2}J?{10SAv+h5n0j81 z5Ev#2cPw9YWGr+ZotXTz_!q0{iS$0qkCk))p_xcGR^z99ph(w_(qg3n=>%v zbZfkLP;Yd4vxh$H`#J#}5qAnfeDn6{2nBaJeL8u7fqn?d9&jJ5uFyv{K*l8nG=650 z*9dF(-UtlnpgisqWYr38UZp5I%L8Rsw8$}|pukQMWPe$K#cRt@fU(t$`GT|F6)3I^ zJSBshQJlhgeP9h&P16x;ykFw{N+wsO>~jjv90T%*c25m}R{n z7X+|z>u@Z4i__j&f)%-4JW3-N;noB33U;Ft?U>PDRg)84;-FXE9Kdf-0P|P$QWsRI zC75J)Z<=<@GooSo^$O~pPfzlgUN#=mx=KiPBzmVv>A84gr zCx!iH0mJv#MEYDP{{SfNMDdg!3jF*rHJudUhfki6mXzEYeWRA$MMVzAOlBFv8aqc( z@_h|;3b++Xwp6&Nzs|7fA z_<*%dV;S=;r$LQ-r-~l8{y=u{I`*1JygG&kghoELj|LP0Kw_cTeVFJA+}xsqd*WG< z<0rJwD&sP|5b3#=v@f<0lGF%c4CAK4!&Us*uI55qUJ|7 z*K%%#)_5_VQ;fhW)z=(9xa^Jf2MoAdrs`6~NnEV1hzCtEr%Tc~h7z^i_?6&GiyZZX z%HL8J_*tmhQA;g7VJQJ@zsq35Z?YLLM?hJbwA4_6UFpw)*Y7) zX(Jnpu%fD26)AJet4%~a( zA{Az=;uADr=pRa24W2Lfcwv>5FQW_fW_n|!%on~k?Mq$~H>Zvznl|-%Jxc~$7Mh^- z{xuy0Aqihf{uhW8e+TIOU#&}*{{V@frAq!cFX+<4FCGp_YeU*yMlWH&(sX)|%>kQw zzt`v|Kwg{5{C9`B9M&F$ur+r;8bs?cLc?WCQrljR?grtp zF22gFy&z#a6c%5Iy%0}OqVA^OIE8KsyIeKbr{fU|xCfJ=pb)%^76Yi$*V0_LeOK<3 zWXxvSURW*v01+zgXZRBg<#Ws6f`CzU5Sr}~!fN&qi75S4XvYhw{=go(_O=Qgr2ZWvea&jFtG1@3M)O) z3@8y8Hqj3sO7W-K!|wzwuhrMu;ZzO`Jt8Rd({LRFp)}NprR?N@Ad069c_;m9(B@yK zjkNF)-8q#wiu+7TBHX!Hzo#%KS$yoXEPaVzh(H%ZxqA>#7vVK67E-cW1)Hn}`?-$G zx^^;_%re7)JaFFEg60ASoNtZ3D6TY)Lwm!8X8GeO~7C1i+r!AT=Z5(e9M8;vi z;^}gxcEWBSO?_%7(~qMs=>0jB{8#?~O8!+V>+UW^)Od#881J|H$0YVNk5QGT+(%=h z=wpMDaw<8fyG-?`x=Ukbt<0o^=q{zmfYlheLn}1B$cvTij|(uGSQmjQx=*respcoo zH%<4unRx!s>h%stRqa)_;^p;p{i7+2)jYht1wdZ2kK}VM$n3u-q`0wS`8_|h1RDGt ze)WhDRc8MH*g}N96yJmM^Do>}dt3G6%qvrTmR7f>7#-iNTZG#z>|ljR4v|0wa|s<{ zez*c)B~Yc5Y^>*)wKg(EvZ0B(Vqptjd3r!ahH`-{NO#IR8OMOHJeP}0O$#NJ(E+vBTH;HwN7OiW-2_n2IUf}Jf3^pt3r zppM?hSTmrM-r;fb0ak(SC{@>%R0rIG^aHw>y3f|=;|EgaLH50M)HD}z>uJ?+ zr+-#-+(_u1+AZ*c!zH1cnunAb9Klkkn)(bEi|irJcl(>{!$1;@;oGb}%%BBly40mh}B&-jy)3Pz5MH$O5tQx|r z?_MjV%4PxzMcdgvWf_y(3jO9_nQFULzgUI?DcSHY{{W!^@><>^#ogA*7>! zSY?NZG^XW~B&H6tBd9j$)N93^VVM-dT@z$f4KVC;Q8pCy={$!=Fkbt!2}V-Y>_54H z4b@x*JBDZ|ACt5@paI>!{{W7}xuTqKjh?w7S{Y60?G9`1I{25mx@9P=ZE#K?f1)}) zrpD?zIQgS9F&5GWV!iBkK<|f;9m8eH2Qg6!ZHw?ddo>DxV`%Xq4?`|Px4Te1` zQFtO-?!E&T06GMTZ<$ejlDw9Sbr$K$B)XgrNXd+2lRrx3m{=+#t+S>Lw@)L}psL zNl?|&Go}DZ4!|)jkh+bUri9$HWH(33BdU?ul)=m*@S{VT$rD!}ldN>D%tR3HRCB}P zb_$AI^Al0{CSQgJq);F~nCG=c)S$J)KIP4&V)&1ORv5;=v+jq3Q(iU!S#Yd>yK+3=}g5E9W0cGX&LA+i*l@!|s53TM9ni@e^fDzRuFk=-wxqk4G3~&~%4WtI;ehE(uhH>R?$;n z4ZpgjwF0FBtYB?}n&p1*!MHFAx?N+Jw%Kdy%HLG;*V_gg2XxzSL;BGWaGY-5uU1rx zTEb6ArGwM* zLB5DFlXvYeCC(2xeR^g*AJhm4q_N82(A;{cSMmojzbS=ug_<43q^AfSKzlq(KzmVX zPNICCveaC!qwfQ>?3=T1l37SSW5@^QUsnO={g#00Hj8$t%&@uDUed)gedX+m_Li7# zQ>~rjEH>?aa_>)BeaLEG>*Lug`B@J-0n@(+b_W>B^gj&sCSN=o7BaGp*vKq1-lgZc zw7e+i6F)?zDYL>PbNULWwBl&I#X$xb+Fchr`HWLo)H%|Qg+jm-eD<1~;Sl3973g4s zt9Ipsh6_SlPedn2L=xVr*VY+jLWWpY&@y`LSBVtmu-221T~zN zwfoE#nUMn6R^3dpk`@3hO>1x#gi?LN^|??d)D6+!a-BU`qb3l zTD;XRXaQqp3FF}9=p3<-dz5b1mcH_VcOAS3{#P&P$LW7feJ}q2A`q4QDhKj#PWQar zTwk7r?#1f3^ofsLb~Z+P#`WF|N4+0acKT;rI#f_|yCI*jA6!d4f-Q!}#Ji9_Aan8< zh!_y!A;hy>Hn?N0_&dL9c6ounRy#+ek)__bl~LMU%?;kA_oJ9q`lSlu4u^S^YJ0fO zrb{jaQ#6}b_>1;3DKDV*9`Ro3q&8g9Tl+z50@LIB?;jSB$2*UBpAG!_d-Q|EG_p~R zOEH`RjOyqq^@lGL7|fSPSnfOnOrgpmj1132wNif z9s9wqLa6lr0Fm+zL)6V4(DPUUuJ`^yZZ>*Bf84Q~1L}w1#d$D45So^g?*Ktmvdvjj z!}Eawqa8Bej_aqa11aHS?+kC{L2bTF+oCrPQ<64JIwZJo)KZ*~T90+75oKQ1rOgO& zJ!Jzh)9l_IpXAB(8%&&?>cwn<`eIVBvD3@?j1t_uLKs|EGb4t2L~t3RIYjB%hx?)8{ zhY^k9Tx6?+343A6WzagXf@SE4^B#t}%$}suE3`ZaGmcEM$}iQOZaz#E;@M+>rsJec z8xY@#=6Z6RA0?8O3eKyyR}lks75yjfW5hdHDMe=haPGvtCH)||n@e8N5Mqz(@Okk% zoHA19+;@yZ;*M{`W-u359DBs4N(Ws@QhC4l)5hYz#6JW3!dgn$(gd(iF{*|^K_8>K zlpG&55N&8VU=_1T%=G>m{{YhS^uOa$zJx#WR{20|W@Y(crtQ`)OQG<1M@7hAsqZRt zeOD{I$ma!OVb+O2QBS)wHE9RqLp6d9T`r9{f={)0PgvG;Y{0iH8&^@{3X9pOHeRrs z(`!yI2ig_by_pw1r-y{R3TEQ4tnHW2`W{QR%Qe13>Dcp8=JBLU&3R7E!t=xgm zb+E+s*eQ8j(UbwuCk4WkpFFNvV!7F5unw`A`5&HE4P~42ui`$b(05xS-e(RV4b!pNGxG|T&m()3iuUe|ECXJFa^?s6;;;C} z#|3`;K=7z&&|v-XH&y_s3LK$-AJhUy)q%tIM)+k9L3w+8A|o`=!aCPJkuIPH7QP6l zh7gc}$aZ{t!;;!)7_RH54kDfTRZ0{Iy5?vh-;`T}vBc=BsKqUVv*-83D=Xnjy`^DC zc`5+MXnh?>SP4^{dUl6Hldls5>fcXTiuUrcp?x~V>PE2tKZ~qoHj+2FDjY5^5DH94;Atz)_X;sX!>9$z_`;>kLG#`UJu? zqei0+6?Z?R5IZgR&{V3ev}1FU(&`ettUSE>K)A~q5w`i4l%QS-{lDvcpxo}^69mLUHdX{-T06yHW`UTahcj&F<4$SJ1 zc1zT+oAY*=g=+^a!Rhxhk*4I@eug>A!*wftiaq1Eg}q}HUJ&Vc_^HTQE9sxa^NR1H zPP7>vdwr!H(^Br@WmTf{2GQH)>+dZk3gfTu-WbqlJz-*xJAzIM)2C=N;Uz4+Gq;*J z^Ax+FRcU>tIXyyBz_$&zOZJp!?zpD*XYFtuCnL={AWf_4MOpU5=p6CSC*#^S zsZCUDt6ZxBqMc2xg<~4LuS^b6zl|SOXd4qAq$?^5xKQeyp9pWiYFIH5(P|-Y4ZRQH zhqTt=nAyBM!rF|a^XoHRQP|Gnc=&ihp)wg*lk^P`e7z}q_YqE%pOfzM(pIWjs&aHBs#l3jwLR8`R-m;yYY znl{9sLuBrv)rYK3anE8R%NELJpozBM6S*%k)bUV+SOdgm)YmDNk9E>G0}hdlTh}vo zf9TyMEF%Zq381YtPtkIeU?X7_Ae6=h9K!9p<7&Q9)Ks?4l19EGuJe*`uM;fX1&_<^-6eVq@PQWXZ}VApv;E8OVq%{iwZPLYq%m5<=U5b=cyTU)GFEwtj%{{X=HSJ4W- zKtV$V!?T)mP9RG9TGhTGBFAPw!D-(!+16pJcAllOWO;ycHdJ`5TWQ6ibZ=$MX-6?H z6@;KDaQx_|6=0-#L36?V(D^>yXYI!*9^=Fs*O{moj6(vzlya^B=vKxvGvdv=3>>K7 zfyuA~Ah`xjJ zR#By9D`^+{OZyQQ#Z|#;J8!hD$~d##d6!RU#Q!OV3)n($lRSk7P3l6vdbS%OxZ z7Ez7#P-|Y}q!-5=+dqY)XFz4DEG*0A2bp6-` zUC0+w#dNK68ekupdKt1inVerr45SS7*J4@u%mD6T;PY4I{-W6d6a|}x#jNY2O+!r2 z8vddnGBjSxT@orVMJ@iwoFlQ9R)Vd~xqIW)m?)yI{aJqjdFmr~TQ0wOouPF(lnqm| zP}fChT|PQt^o&j7%6jh|E4w(ld}7SYLIkO0n=#;Pyl~4Jct*Mlb=owTMmk>!#v}BJ zZr2YiTAuXFqvgiCbPt)V!%MbWZx0+B;uD8Wco)Az5O5Jmh`k>_5J+@l8OY0nL)tnu z%~kFg$0qw1NnwztShLYRkm?t_4cK(|Ay`*RTY&D;_)q`|PPV?#-Fi5@ zmC@-DHtNMpW2$v|q>DuAO7T0O!na$3x=bZ?e+fq7V5u{P5PDt3cSGuon?NB~f)sRb zG*I(GCjjbTuwW!X6>COiyL|2zpr%5spK`jxT&!ezbtq{>8n??5xRrIbr#=IS=nA6t zDNQzP*QYQFl+J}y^gFP&MRhG#Ttb1~rd@dzsBQ*@H{B=})TtS;8RRHE)=OJw+t6Rk zbl%F;4OTX7S%=>}AP>23 z3X~yAi3E=Ub?N3eRx55XIsOmQqx9aQSMcZQQl(0j1L;sBh-CgZ{25$9+3~X^QcMZo zK?;VYa&&s4${}Ziw_l}nJa0TTMlik;sVuH5ApOq`zkxIa>QD6 z0Ew=$fWc9Ru(zSh?JIqqyK4(!PkAZJb9_t}b*SSpx`RB0`pV`R*?zjf!dwfIS#a8- z_>V}Arw^ZIRS{%7gR?!=*p=3f!0!k&)=yD}{ypZk10D%lx}f-*3@U?zb29qs9!v1t23bY{a95ea z{-czOS%C0EF)`^fYPvBF8oy%b{IisPu6g*6L1{4-=A38m7TN@7Odia4Oz2ogrbV`} zekI|pmv6kp$?r#WCd=!OH!lD=N9g4Zx<(v7EUpXiZFaijnC4{YI{}GOdJL*|KS&V2EE^eyhRvo}X#$Eg6@E_}rJ zd}^q)cR&Oj8Y4oPi8`0URdE#(*DKYA8%v^ROQ(sC-g!a00w7sb54;#@S1AgZH0~1; zs5qw)oN-UYbt@lS$~vOKmvtTxv(%SN+TD{3?zC*(G2+8na<5BsJwJAYTCC+m|AuFH(a04{C!S%Eo74lF=|p<9_vP%uTM8pFQ{ zSD$n)2i_SmsD_hB0U`l)!|7ki{uLQgzLhFes1P9)^snV#M4J8-2;zRj$qT_{s`m$J zsgx=9ADBgD%|Wu}9;;#PA9^B~HjQSQfl1e@^_{?_$$5`lFt(-DH--nau7b=gik@3Z zh#^k3*sGXQ%Y!pLDcv)1@-TMH-tA6(@~D@B(s!H{smyZHqb#|4a4^657} zxz}o|MF?5oRv#u+_KC!S_C_9(hzcnqyp8LaOiv)`3F z-oF|2fM9zmi+%?C^2FR=>-n4yNKF=aCt?L(AS0PF6czZ zLf^!s?icISg(L+6aT&7HPxNaeWxJg24Q<5zq~RU6q<6LNG68795w}w7rXeO;R{sD==31F=tG8WSXd85n zhPQ9b%9zjfSc3{ao=)@dvVW! zI2+6MiulbAwfS|^L=Dl5*k?NCUy|ONboVc77Q1fv8b`uM8%xb*D&&Idwl0@ywh|RD zP;km!=o9@iYuVON7>VT7)oMI_X9=v{7h#uI*bcHzvCZ6%65N6oE2nx6q?TV*V zt}KGe^!>?(q*ruw^!vw@ZN<2OODG7%!Rgc1CN+)5+V~AijeUZQ&Dq+O(&r$|eTH6` z!mv8;HzP_+Z&Gr^w+a_^E>POR+xCJFlm{%eH93k=?d5ZkLwyl*BsLsoy2CZfM7oO> zbt9n?3v8&zC5+;=C4<5neP0BuUHMMq^!Sg~zLhFesKtFMR%J^50=j<}`BbSFG}6zQnq`Q|VsYBBJba6v)UT|&{FiC($e;#3f|(RXN1A(fJ__7^7U z)tJU@{SUQ3m1HGvo_R-I3;{__VXruPOrn;-*ybX-U%a8x`fhH;vuv`IU1g+T>P6We zzM~fO173+#ys>1)B8BMbn}1|%p?Dp7!0!bEn#%p+$kHI>u09|D(X#!eNMp^>ue43E z`mY;=Uu_;$@Jb~sx?xX3V0!PYMvhzMgz|MZ%9pmB9n>=~?b+V3fY)o3p;1nZej@kQ zGmW_K8Ux55jSPo^vnpT5)eK6+2%h#GV7+crrQ!^9T-RxJ?}i6Cc_*P65f_u1P3h)b z17$)K(CfZCKqMm16c=H9mj2>tSiWlOza`y$iK=Nke9zyH(f+=ll_=PQCYG(-Ktwws~YTcEY?22nh1L{M5s0cw(1BX5(80qGx zTJp+@P&}hUR%L+OwPUEh{{T$GI5~h2p1G8Zq!KF-E!tC9DbT!1(WSRgW+RPP@%eoq zC`Jo3aW-t^?M!p%@>e$lHwWviLtx=tc!3n*Rf_5Nm~JX+LHA=dH9^`3Wi3^{@lw;s z-U|nu=2{;=C-n?Nh*1akeI;W$?fXKxsR{!cuRX+7#DGHpgKR9f9J+Hh)|i(R9nlcX z?3bX%ASXvNF{lGOhXMd@H~>3gjcCtSXOhSYwmTAoth7t@_r$FmV7%yDF5zA~A$JR? z$8VrGmVQBpj?)1M(MQQf@~EkM)NC|eG(vaQQ5Q=&Um z5=~Kg#@$d2_NdyMAWms>ELOS8-WfG(S^`uV4q3;~tr`a-f6dJpX@WxD7* zM4g%Gu_@~^IF$r))B)OdckhW@bmASB4h`#C?8hZm!qi3d(2g9S6lFe(C7M>Q^85$v>w2`Rkg0W9<#?KnIDI{i8BQY>vwU$fp$I!3NX|BZ zf|i@>8`XAOn|UIx*#4A_Ahm@nXyuA{FX;W zOZ!VD4aKJQmgI61Cw|IqUcpu3rhu7k%%M>L?JHO?2mx^&LxINv_S*eGDgeh@8NYW;th08J!HVeci;KEmZou^p@TllQp91beT=yW0jlTKF&l|_=XoB; z;w&DB?p~6FTbTP3$xBWjNmg{&c9~m)EKU)4ZWXP-Hn10PpD}_~n5QrM9N=-Bf3kt9 z*w}$pf0)1;ml|?c%%MB8;uTe06QW=_altI6E7|}HiU1m7a)9#>lU!ZJhmmV4uCr;u z3@53x1s<>;DryR0v_QQkX;6=`$(_f@@TajXn$6_~%#KyB5{>(jW8`%*eliE!5T*Cx zH%%tOS$Yt*NBW4+$SqapJBA2wt30Q>>ovd|q)pYF)xGK)ax5c?tyzO`w(EeVwvMk! zrkAc8W6xNDR)XD99p#rtnSyvAP)m-qL$(9aE(ayB-J%1anMWmA6E#sq_)mY@E;PJ-Ki|Vt3BnQGCG)`89ERdZuFWB0qb#M(0E-# z^B?9-ho0-p0Sy2vsb!Gmq5)V!D?zUza}bBhHp>pfxzTDB7y>)+rr6;)}|u9I-98`yaCn_5)C*_8&WFNwZ41Yc;+Qwyu%hS4DTZrYMV_TEVgj71Ru=#OY2#Os#6+RM{UbZ z81k8c5XOHUzCDSBCGV5vjVrpUC799Oci8I%kmY>`bu~k>2ujdK=TBY8mSx59NBx&8 zX=!vn5Kz$hmICNGohiy@1MZjtKJ2-ntWs65(B6F~m9@*n=Us zEw8pjp;88}*k-IkxJqD3%&(%QN{!ixQogk-=~BM6iBi70`ocOEW5qB`whkC?06F2- zRGQ0iE>QWKMLIwou=6UetnD9(h@dlC1{Hd%O{Rh{d>%<|=*7|ai$Y`tC%AV*nr4!EZ!6lC!YkxmzqXL`GZ5rB?My8_1YpQ1tRUFykq4Gh6p=KjE z99&&(tHFy3AIQ0*$~eq>MmRc0OAV)T?gtSjC{}g&uu?B>vo)wslyVEciBC!X>9`ujJ=+E9^O*aS`P&ZUA-P?q| z-DSeE!+*XfbE#L%ErKxLMVi~g9w4U{1zm9ivdt=z6IN2MQ0I7X%EMgh0~x#6f5_`7 zqS(S4MN+t^E#)k+$qfZ_At6Q_N)dt2X4@~sK2KLcgR$aMLpsA(s<$$%pJ=ww>@yH8 z)>jzUo(RP4)jY%Mz+79z)~#uN->cRO8!B`|qH_?@ZG+l+nk&_r=`yI9PdKh#^GMz+ zScDU;qEQR{#{&-iMu8T!a={nv!G=7_`i$J&da(;ofNof^f#UxFc!HK66~2UU;9FNn zS5vjNF;@Z1YHxhM9k$?sk;>_KQ1_K-9XeiI)yXs_MeX+y=wY zpB4Bb;M-)|>kf-&7irJV#7`!4E=XIVbD~PQhW+`36BX~WU4%%1nvHZSyiCyw*D|9e zb(P7vWV5fzZL<`lmP*?KsN0xYZ>+gr!aj-+_tyk7f|HN}WlLaVw0DM~iIxY_rAn16 z=&4^teM*(|SJ7WpeOWjLSxi3BDAd4PJEyeKy~H;!ya9U*2rpQc;{=z)Y|Op3gK2DO z)khIp)mTeQnSElU(-&Mjp~&pwX12OTC;CR@17icPnVB!4YxS9pK}!t#CM9g~+wm(L z%PsDzY0Sp`7}oW3c$Ld2(=d||D~*0Bv8+li-%!+4vr_HWRgp69H8_Z3xc>6RZqukvSB`D~XF(y%UltI2g5Z_n>qg z>Lx9P;Yax?I0DV3a5Y<$BFcVhQ-cJjmb^eD>|zUlA~974sdSV9S4w;Xhg)*5kv{mmN5oDA+WS{Y;VHxL4m zjoxenhOrp+OY0NiaVRfr!dM*Tl>* zhVwD8&cT9x^km#CrI3+J>^&vwly(ad%0QU6G1twv0A%=5LHMqn&J|hX1*Z+CJ=pPj{_b`_?~!I)}?3bQl(0j{Hy7y zQofZcZeXe?vACq^s%c}AgG#TY>w0jCiEDzo=uH9hXyW6$fkp4^!s`bf9@5c+O$(17 z+)>$CjNinyvZ~Dm?K<(bWf;&ntGSp1TtsB&tqwBr2GwWUGa{P=E>hGhcEc)>)k~~u z0J!uJ2)!8))>+jUv=qKb)D|j{!sq!mqFaO^&BV-^On8qmoIDLo8N!;qf4O!EVW5Dk zyWc6Oyq)7j3dYa4r^2P_fYQ?9=< z&X9CJ8e=K03}R5b)qj3vp{*Hh)~5kX@=Nu{0k#C`fYaCFC^(Ahw8~uSE1Waos7EmX z;Lsh2is7s5Or8jgFy=J;QB=Vs#XZYzs*XKo9G=Y{vvREoU%XI%ieIC1E!kQ8&S5S4 zg*#s{yqZ2^L%KAG?xB@cW2fRWhd~84?Jw8p!s!~Qb%xnF z^Dr{;?Kwu5v-lvfsIX)(d0;)W!wxk2j*xONaC!dW)LvICROZd2ndtqJzcQSYN1Lo+e=`gF4y-}HFzA;m0Ht+?m98b~Y11+596FQz zu`M{n#ZvfyvyI9ZF9Yo;Xf>0xH)x$~g#8if!LGso0AM2>faTEcFu(pF<-k_@9PtP( z8v|!jRAa`kW^*qU!Qv*5l)pV06e(-hWW{qqN6fmOjwBhy<%~BwOI$WWyFa}p{@8Oc z4uJw!g8Iam=5i%`#HImrW+q3$VefM%(hLyy)S*M%5zN3Yhpe;_UDDG1AkqCPAGGJo zy~{aq_KbSRmSt_vg)^hyiJWxyLxy0zgj;!>!wIhMQ|%CH0^U2YnX8VS*?MhkycOZR z%%GrCYxgkXxirT=fdi!XOv@9Bc0=y5xHn)(n-K+enjf>BW#}->tZuWHJQ9wZdQ{%c z#TZt?nVa-DxtZ`hD&zifYGQOelG_KCQwaT$btP-E7$JFc789gH40VaUu)eT1{7h0B z=@Qi%;Tif)TvgsSck2{P!_$sU4j!iyCgr(@(79hql`HrVMHQfxF4l2NtG`H+rjz%K z4Z-=aH_oFX?lE)a@JMqV+{Wg?>4Pt398UR!~Ly6>*ZobjUr zdS$DLf!Z?VSf0?-0kq4uD#(VhFUV>kT{HlPP;qc8(lI0DDP2s3b zTE)k=B<(DMha_v-)7ofgvT6Hxa27m7k1gUbH^5y(Y3 zF)7t1LupPJ69ZK9JCH5tO>jjQgB_M3GUgJ#H_gMbx>C;8=4eH}QzIHXKx8cu+_D-2d+U_+1TmML@d1U&6lF1XPDG6G zZ}-f2{mYn4L5iTP7L%mB9=H(6=|iW?etlbCf9hRYzJzK)tN5Aq{q%ybX@X<7#KP>) ziFGcIaH@hH&8=_yjYXaYG`X2R0WKFR#}T!5!eVe;QQ8e{Yn*4&UU!e z%W_w|w1yji@o^_tX#3fmIAyZ%ul{SlHh27oFv&Z+(C~dojkoTWTI^NepLh@yk;!&S zms+ZKhy<>*sWvZ9r}rKpw5!!~^i@a{D#Zb!OE+qaz>N){(g0~wZG(g$lvu1qZ?NqklTXke+0p(na>q6)q@zOx)<$^v)+xu|K9?naqoS z0sTst7sD*A>pv4^z~lrrG8#W5yrEZl+)D;Q(d|9q;=q(LE2KLN7G?>nVabn z=|#PWZT$nT3`D9tV8+Z+y)YFk6hi+1GYyZ@Vxk9z6xY1zSw3O0?>psvAyYUP zxeBPpl?Eww24B%|#VrW>$HA9p(O*SQ4t&}yrxxJQP*4Zbzmnn31m8cGNN2)E%g2|W zs%%^|EwBz0u-SC%80c*bul>$KKJ;Mj+;=#GD}-Hidmngpk(7Fu-a0A|=*(pOtfz@c zh)Zmi*Q<|cMe+oW<#f$ifc(a{tWa_0Qnp6}q~;ROU)09xtf%V^#jxzfsHDN1WmglJ zG*nc_b5!aWGc+f?J#iA_yHud!_h@zXrW%NqeGQ&DV(~4FBxpai8)h5MCTBc!!pLg% zD7dX7DZln56Vw4{cO^ir8qXf8AIn{hH1`yrU(O6+laV`pTM;m3o@Q}EqFqN zXyWD2UiA}d=xxfAA-%iCx)G?8%o5{w5k5&ooB9&-tIuhb&FPEyjfATh%kwb6aZlTX zTBh2^9%eGj=!WziB|<#44`P+uj(pH@jo_N~ogw>J(*4Kmq|G zM}%;D(Wu-(dV?^_WU!>j!$)sc#&&6CgP{Y~C;tGo{_=N&4r*Q#g!43ytZMa2wlUVQ zM@+8>v5yz8@li_}-KKXvm$UkcSP5fWbQ6O?yk*+uwU<3S9@5Sy3km$AMH-fef+Ess zr!xY0j77>aA!ur_BJ%D~hC%)D5A-w)0lRvJs}^Zvxr0}%5GZZ=jYOH|@@@+ha{mCC zZeZ;nSy63hT&&})QQWSU6J)JLP6Ij*)u^p5bjI?}27!XO=Nsp4euvDFUjp#N{wN+% zu;ghaxjPc^HPt?7?i+O#vlNe4nP8znf{ql+43yQHSYm93APC0tx3$G)q< z*0C;R13>c@fsTWs7HL{@mI{>4OISSF2cau)A7y!ut=)E2i+HoPCo`+gBMz;9K4Ii- z4V;gp3K8I#S(DQ*%NaJ_V*;hO`I)uP%%boPqf;M_ARF zbx&DVr+mj*>{>2oZj&RE4*;5i1ADVAs#KbEo!^-x$@LPmq!Ew>XF&`XvT7j|(}>=^ zRn`wpYIKi;ZDSd^gLIqg4VUvUdg?BKu0+-*!BO^EfXfG5q_c?4@u}_S1`+BcRK4PK zV%6z6jC{1nN)U79Lw3`HL{Y9YF^xZBe=_kG*x!`lZ~?lQ%-RLtUowQeYs^xodxr8jS58Z!ho6%z463L8sDWbg@`HIE89;GW3aFW%0^# z99asuRtSJ8>;1yJZcyf%^exb17%l!QUP4&tf@3;pKUcU#xl%N+5=15rAeo#^n>q)$4#$oLt&0)!ii}m#~weL$_B|wA0_cI=$?zK)obgWHAc_ZLn z_@xYPE3{HQ2xusA7E5ysdeZ7av3*j&+aIpKz3SyNoGj!PvmjRXt8ZhNk z-dELVgV_$>N{k#u=&S=du<&(G`z9Sny}@FICeIF#f>hnu--uBmX}b*;a$h~-14^V1 z9LvPwzU<*UOFCAbp@;@BaN!=L8=j_K@trL8*D3qjRft75K_ZJhUkx!v^b10vTj zoZy*$wRvE=Y?vo%@J6U$%`B!AVR?(_Pe9)v6AZM;yO*sU90@&n5eyb5Y_zH{HSJDe zc%of_ z8?q<^xwwJItUnV4q{&Tw{{WGh$krPe44#U2{{TsF4kXzX_bMX~z5AKL({ZXA7^#tX zyMRCxQu1^8m&G3QnK4^8d`np-J1u#X=}t1-@k?%IdaK(Jsif->S?j_WJ~&8SA|b)3 zJkh21lnT4cF>>t)s`=?NUN2OogN#0Cjn1OhhEX= z9epMMy!7=C&;5&w?F0?!!ujtrl;rG#HAzb9U9cGSBS2UZ&0NeMrRy2>ij=~x^X0(&p|igPOZrLS(1>hwAw^l<2e0gg6V&3{v=d=~m{2uK<%68Y^*XV$R^ z*bm5r3g=YZJPbZzvVd`1K=w*`!}MRb{nzQBy~Y%=LL9q0G1hz@=kT zgq~*SR$F@03h70XK;*uVN61Uo5sN{y54=2^ zxn2DV*Tkbyfhe3X6+*6p03t29+$LqZVOWr6z>J{!nkCfV(MF7Sm?XR0W`-A2Pk0XW znc`foD*j!@r)*$67d?j(;;s_$S8`x?2>J$DrO_x~%(T>P!R;QnO;v-;do;@pdrP-4 zg1XtvQ8m@|J`VjMwvDZi4#&eT+AvzbM-bG&b(hZ%CL#qpwH5Y<7wtC_HQqgCNO0n0 zy-Rez5YHn}S`!TOOqoVNOUMq>j<9>RRi0xzE!WmPGy?XQ#KARF$@zd|8Pta$G#%Ak zyz~loomU$Sc#LJj6~yI3jiA^lw+~bNg&OKs5;ooKOOFP0F8=@ryv+Iwjb6mGMX}`> zA$glUA-1F}`NANV_W&kkE>i_9kmCkx}M_P^ifwk#=J!5fr?9=X+ z+OyRz=^os?O-qJmi)ID7nBaoO%wYlD)B%xnl6-MN_AVwJG~&i~)&Xn>Nx~PXW?mHG zv?bviw@8V6Qa~NLN$O1Ek0ROPI^gK`iUtCo++uABSB&={&Ld2(rG;SQ+o<`#%cyu| z@Z!f8*l@t07e90|s`r8YUSnZPrR0Z~9*ldsk@id}YsOOmYBZ-2q|a3EBC#?A=_&3F z-V)@L)B@PkG`D0`IH%S-2#vR%(5MJaceudqRAeP2sI0KJP(p`H$GI@D+zt2Cr5DJI zm^a8u11#T%v?460G2tm;#48tOv_t4-rzM?vhcw``;$StE^p=1nM?!D~(#>CaTP)*5 zQW(O?s#hsrH1go=O8^yzj?jsjlP7cW8_2uL%qe3|4BgN{TUv%TMz3w78LDE=Okb%? zG*aYvKfif(<dkqOk5?O$`L+5k~4D;Vi9_T26#JFCs>H9YNI*aEb26}0Sq<+W~G zma?6Y!37n3N?XrZo*xw}g*On|-2_-g5jw6FUHVRR48c%`7-QVpVwfSIE0+r(9Spm5 z?fbaAp*w5r^9>1mKQT-PS+5fy1Cz>bpJb`=GW+_Xw?b^ZAzj_Nit{PNJU-_T=Dl3U z9B;IzoJ=`@z`ir|8GP&W2a_tjVr5j(FLczl6zc6MRAFpLv|OZ4kv2dKZC_iPQF_1Z z$tuw?{axe4f|$xhxtJcZgx+;7z689OwNviiQls2XSpK@iU_6)i01f4A{pLo#-s5<+ z6!fCdJ?#0ENVO=c=)Pt4!wlq0-mkZwk=zbQHRkm$hdlgwAC$2Ud$^?V-=|q+Zj@Q2 z4QcPwyh(WhwJ4(wZJ4LoDmh3>#AVHX`^;}s#tmoLHaMFj>|Z}Z&;-Byhc^0=#|&w^ z#A#)%A+T#3fz*hCnS$MH=4Y0`A%OP;vD2mw|ND>Y;}>TixKi=E{OjB-MtQ?BAlXY-OP zQrqC~+8sbN#kO7DOdVXgrq$=Gq%P)bs>cA^tkJJh4^%^%aVk`y>wQ+p)3AKkZw7Yn2DbR4tvA$&`8VajqxzHPCEt8$Qq-{LP@co~lp*cL|JwgL5 zvAXSAxq`VDCwAB=%30id^o)0&Z^XVKGT`n3Rj83Q< zT>8tq24baTkJPgzHhGn8?X*h#m<|o04VDpi`=$mJmZ=ad&B`?ZC4)|oFSa1e^o=H+ zi}3_EI|z1+oINE@gF56T6d9Sz5~TYEZp)NH)_KIKiw!Y=8_TQd1T%C&ddu}^KJF0X zq%aT`yUH)Q7DI?N^*w?oCD186#l)@C7XJX$<>1F0yba4OxeUF?A_sv=X>$`;G&q61 zb%ZrR3^8?taG)$uCll7yGH;~BBVHIF;+MF84ApKk*&NG?m(iTei;5X2s<9arg3ki= zm>9S*(yN!i+T?<*XBbOqb#Vn~_2CUm6tO_SEsSzRu&^h@rLjqmaZ1-Kj{g98V!vl> zHcR~~bcM75E$TY1V^Kvd=3Gksyrp&YyCLS5*RQaTGllh`xyQmC1+J=MSnDz`0~kMb zoj@|ZGn=mw)B!c-WZ5Zp=Hfa7pX>U~2rDN{dY{cR6q}u;8~}_!bH77hOehUS_0!3Y zqI7W3bxJ)nhcb<|rZ7=VW^nD~`Wyf!u=-35~ ze?9kW9Ag=plvvGWK%&^MWHuGWC6&@sXj}{i4H|-_ZL5IUZlc({!M60lyQDgzIaI+I zd&~Ez_Q#_tJoDe!8uXfz-ICSb9N$=0N;w&VLE!HtnFwJYp@wBWF%3CI>5i($x>iF4 zw#?X};EgZ2nS$-vp_5dW^X(G=hooN6#`7{Hf*VW;12K{Z6?$xFsL=2jA5G~MZrwNqZHn+AS7_8e_;mHBoQ0V{=cK>cQ%aijK)ym8LI+zi1=o zY-MAoF@$?gCc%%Hi=tmvUfLiO||P#|`NXK5m00f(rYg1;c<=QUC8$>f?pIlCok zA-S?Fk3svP5qNa!9-XDcE;R`I3olC?W@fDh$Wq~!1}`$MI=)G~gJiRzEEz2`Hz_AQ zR}}z5C0$&|z8-jH2lEZ@5O7LHgF2ju1UQXDjMY6MUxvjjjae1C9=K|(x#;$K!Yr2T zo0p2RS>-nTZahOv1#vPCP1c>KG@F9u@JMn+imQ375g+??h|tyJ$_rX@3p1r^%lMQj zvVMjlz8u5S0z!*R{y_<>a@lLIIWJL@T#+}rjFdxU8uon6cKQprv3rG@laXZ zsbU$Ux5TCqPP2>cKOX-8+@@wAy~)AYJ(BgOpv9~_%Z}lWwF%rMtZw4w5<>ut`nr|t z0RtiF5V(zw>jr%f%w;!>dS%MDs%i{Aw1&H-qvmP1j}yRccfI~$T~d%3HZ4QHqf-tb z?^p&sV%*wE5W7P7=KY|;L3F6;rajr}M2t5Dk7y&GF?Y5;B}rJMEmD{59I3$IqE;*` z(ymsi)$jvht1ZIr_=;=NNDIHUy!Ie?!xF;IvnXHLKh&cT={=&mHV1K{kZCK1zNYvOB%Wda4v6}aoA6$;kNQ+hukavI< z^C)oY7DXK)y8-JtSHUQ{ml4J-o0k;n6;wVSfs5Hk7npXzZ9@vLqGZ#>UXVXSEU}$L zsAuG-anovp8&S0B(svF~JrE2cGmZ3pU@4fcsC@eG#J4kIEBcu(nNgl$<`koP9p)Ok z#ShQ+?+?NNFt|L8o8oMolEbeDnP9IbvSVd&n}xZ_aWrE#p`Vj-3;v)b%$B5xDL+{DEW zNEMXhkslEEiaO9SK98Ju{#dU7kYI)h+ikgZJNFL!JC|BY$R?v%CRz-y5m;zG$IxpH6 zY!e!7Od>V(nT0)eDH57T-5%X{3n~CA6?=$0*GnCh!`L48(SDOFD;g!J^k_GB)kEvF zO%X>(a;9E`Dylm;Ji_Bn<({})?GMc6u*b3S0?4eJ~bG#$bkWw!Z&)+jkq zJjTOCkLTrarji_8JZ(3dFX z-Y24a2}V~_ZWyu!!WlC#1xllJEtI2ogc3O>Ad^um1wqSqn=&lIE;X3EMnodGW_@+L zg5h8-mH3u3=dFH44lNpP@du|g+%gv`?}qc%HbSL+YK&=ztS}i3tg38|9Txe5S?U#t2)j{im!}~t#&%1kxeln=#YYDafC0sz3>(i=ks`B-`l=1v-7_&cRE;~f>MomXS zTd;b|GQplBF^0%-yo;=9I;M3A(1ufCvS5Jkx&V^fd;Kgka2BZVD5fm0DKFn-D0GNU zdP=NlUIQiGontwi>qPPImL^QZR&3$Vm$ad>X^NZYjMgDoF>7M@#$rXvUE5$6R^1(- z=REVe#tg6fL2hQQy4~G$gy*8uu8XohVRNJ#iKG|enIhNeUzkb149=(7g85;+u;N*q z(3O6X%0DRrRphJM$5fjzsKh8;4Jh2XC3--D%L}!<;^z}f;BH<@nqEpW4;zNb_|}T& z8#LhyRtZSF0heH|tTRamg5HbiV{FR=3gZ z1o8(EA)kb`K-;#-o3eLAH6CaCC25OYiYfBTv=>c(X>dfaP*U;f`HMPa<{>tL^fnoK zo}=q=n#*OZGbseKRur#gEnIk02WMH43k&e{_4~v9%y@9j&<#+; zdNeoUR>h4wvCQj$tK8+^Q~M6R`%E!mx*M#DQ3m#HDYY9XW;qt zmk?UyE4*BkHP}jU8wQ@tM>zX^1~*pfKr?jtJWQ!$geq_8g&2 z-4*j1Egf9IykSc*HB{2_M!CwjJ8@nmk^6~J9W_cFK^GXA&YYN3$EOQNTH6VGd zj0kWl(7gMM*^5?WgXfA09^7>a zl)?xzJgO-PCxD);yJvW74;B|G*(W9p(EP=tYSb+g7%vioLOKnnE&l+L{VHSGd6*v= zXDIXt zuCCBE**#4I&`9Y9?S z2OS~+&&K0JP(g<`xAPoRBQGPZVvED(6?FP|;(ZyKIvm`xzYotk@TJN12FJRXt@XU0zKv z0-diif zom}2<8)G9bnLu%6&tvTmiBbmCjdXfIr7^y2YrxN12QZqig7r2F6 zke6KMXs)qyBrX@bnBtG}ZyY~qd25Zr#u1)h?rYQ4b3N73zI;0FdF=8h~6h4y7-8vI;=}_%#K7yzHnM4bYLH3Fy1>Kl@J_C12hca3Dc zvvEM4Bg`9nana&j77tXSu`w|*@i3T%2&icS1A=y^YBUzmr90P7^QQ>kq7EgjsUFhx zu})5oT^CYXbir!O*hV&R@PZ;H8$H{^+4!M~S}lX37!=ga&NFXzR%&qlJ7Eh@vB|-} zJF!5btT2__Ek(C?P$k=*9Hih}k>k-U(;5_#4Z1<<#@Jkb0l^OUMy{BOIh~YC-#s3X z2L|D$8oViV%Uz-nu*GspFSLC)gvJ*Pwowd3hYxSeLb>@Fec_nT`7q<*jsc$ z)?Ei_W>*D{{o^NzT&G!j^-Y+Ia1DU%W@U7vt{>d7Q)#~sTzgI6<*?XSeIAtuDbdt0 z&hosyqMof?J1bf=^8{^b#_`0YErxJuS0tdVvN}asNxe}kc$sIl*lJvm99~#t+`deg z-P&}QX>H{ZL%Nk1241n=Tb1qOaBBGjwEI`?C2AT<^~WLG(e_NmAiFW zM3oloi!jAyym6G6T`UADA(2H6WPNoII*d(0rK&_L4+y6?>iiAwtZ(b62e~bZST!&= zy`_<<0Sr<*PY9_Wcwe}NqN|mu8Jq`098{g?!3)dMiiIs(%;`krE^vZ)o2*;50QB?H zXREzP=zl?3@ff7vbb~llpvv`{?%mcIMoh*|W0o$?lb-~kFFl0O%|-M-X;mMLEM-IpEw$A>&K`^%WmFV*a38phNj96WCrkB3{5%5e;atXeW~kvU^YUXPFD!*vRu8-$ z{{V~L!b>NxSpNW!sA0b2x6I2dNo_w&V}_+?)UK4NMYAi9X@O5u=v6XdPV$>)$x@pa zc8+TW(sCl=W*l;LfrrF4Y86Ai)KK$7LQL&^+`cJcqvh=@fCi-j&O1vEXW7zX_4c9h zv1j+*GViV4=~7IgjQ$?lXCZ|5BZIs_vCzZrVua$#KbM)F@s53%^qRF!w!)MfDaBaQ zl*@%S&(VK1>kd72ZY9a6pmM@u(v*Tb$%oAFp=_S9>y-K*A=%yz`&iVNJZr-d8z-mx z1PI$8Y&Lm5(wyrNkKXa6ytv*TWmWW!-j8d9y03uLrItoHqUW@o4^x<-z_3_zkGVC| zhT84)E{>T3qEFtp5tJUpE(5{K-ea<81H*o^lm`_l%S!aPd0dgI>_Vx-;}^L@0=xW8 zt^%)=uUAAm^qGj=?j~Ei=z#J~HdNuZdTLQn>B3M}n0Z$uOtO~{S~7sa6)4k|-C!|$ zIJQ#qRC?5)l&}S0u)`kPXsCm9zPN$1+;%(nAz@EYaKf6d>QRk!cwm}vF@M>;25`GI z8^$lBVl$IEEEb4l)5VyxGe1u8JW}~t#85e77KW0k=dA1dK@aZ`<}RGTUdPV_XK7AQ zl;TbflX3JG?g~-7-e}936}EM$aB({f@T_D4#%mCQ!YQ>(l7|L?nu}(Fc_9?kEJ~dq z3BGqAT|rWVESo<&?FZI(t*2)($rhdk>lo@_=cE&ZEdvcxsBOcn!^*{32=Fmx?y*hE z@W*m$;9iFs=yqo-(zp3(k7$ZsxD%7Ss-zcbXwUBkk5fPbh{%1sO zWf#Gz0Zmb*F0D)A3?!z#pI?>Y(5Zu0S+%vN1={8$q03ng^lgC}F;`JK+NG=>kJit4 zDblFIVc;`;G0S{!uLt(o^FI6>%`Ek1xOa0ZL%JIwtPGb=7Brw@ z%%B09xZ$<8Z@8Bb(zDS4@iu#FsOvJMZ7v`7Is*tZMZ2@dF%SAh_c!%%wVyF z81v7LT?=&7|``I*modc-^GYxIRJ(qF*r$=)lWZbgB!b_ic$ zSnWHP;h9D}tFf+YezLGp15hvP+6`tNOYtpJ+k-3BybnK-1>MJoXYj=3gcqB~h4q?3 zeq=X(&)z&Ps(-Jmm8T+$9vbTbdfP#Ee++4#FW5hb+*s%4?*q@5q+G4~-WmOr*kiTz@5w!@z2ry_xrbpRJ!#metD zuCaqsa)X}$nn7>ZCkF|CX=@2|IEmL@CChzbw~3{{SWAxKlpCO4LTsCB=$hOYByLM% z^Dr_(oA;tZXM)@sbGRw*GU_G8F>a$hO`g!p24}D>p%*Q+=^qJh(w4hL$<)ti0$Vap z?u;xvqL`r6t9!Y9ewh-LxMw(>*nMInGe!f5iI!~nOmOyenK#H-$$7>M;CzO>ATMfR z-L;qw`Q7jh^mG{V`kMgWe-W2jjTO?B-a8mAg_0??4$+!xsxJZP5E7H>RbNR% z%wHWXr#PzlnGNBo+DdIxSr(;%DACv?>UvV%XH)|)ZGA;^DKz_PDrB|1EMdlO%y6uZ zY`g;+!-;U~k#K554X!YVWCP28MoE~e@fqsjQtruLq07x6tEC6V|J*Bzi{gbNgF>`*tf_qAWJp8lygtQi{c}^uNbj$~E z{{UmevnFh=`mTtobI9%fCrM_I>sJxYG5*hjDKm+MEhnQg*W$mj86oEn;^K7htW@#b zn_kZF#q;esPF)vNIB(J&woBXb*Var@~q8rW-B*!Py6 zg=T*U9tT(Zh--+plG`4lTn+-h&;e~`;9I0~Q2h@O*3VMpEC@O?9`1H~vn#JHW+{Sd z_#iTFTdbq+J8I*^*<4R>lF{VV{+O561=Y>&pHeIb$!<^9czijT%9;3o`KuEwN*i;0Lul?_ke3w`@pI?3cb1M3!ENN#7#<@eOZTjiOvbc zQxcaE1-YwLDDsV!#+NG3m9);yk#9TJ0=G_hd9GtSKctF@kfRrju`6#SK$JP6*`cQO zapvj(QF0T2SoIA~AoL$>8oq1NY+F|?%2<P)Xku|Xp#x_qTLF$_yg*1*Z8D2j zw9~d3fEA~b1-5KeK2VC&>{p=uOLH=OVKz06YmM(DAf6YMS4E6`Y~gI=QHwoyP`Y!T z8IAo6@c9xQy-TV%ZQ?k2%q7CWJG91eFX$AZf{##mSx^hjmx`Ye!$EwmCN#G&+^j9G z0~)`CV?B0#IYn((W?vB8z(~WB;-}@5X9W(9l^liH++$@2gDJ=`&Q)@j@^$E>1y zStv`=^A(Q@*yV1jgOkD;DqCE`>Wl`dz0>9b^LeeLZH zj0$r-QUi4jeHAj%%&pVlB2>$sanQ_WjylMml#64yuTw`@R_JS#IM0%G4jBZMMe@U_xv2Lt! zdANcBmFKOWwJ#5+CVKw>a^*J{38&5`qo#aI!OBO$);Ct#OkZ=f@4@iB&LzUE``l1F zh^sk*SGrp9#I|kmEWOXn+jpFentYQc zn8p1&MGFLzq_#4Y4ZC!YhT8oY5uXfcxG-SV*O(*j3!8x?5gv=R%k%s%%in)c!#{M9g0{A(m4yz#$(9kbh_oe6?ucPlRtRu z+1{_{N0|L!mOGH>n00ie4{4DoDRo~F1Q=BlW7K7sHc^XdRIV4(6HRfT7i4Yx4)Wlr zf|pcXsBMOtt;%_`tvdIhs_9!Ma?%h@*ty6T?B-=a+ydLgRr1H#9n$;sj0H4>v3^v& zU00Y*cql=%h@|N$ca?qdImpNy47Z|~3~&zi!<##8HOYccC|WZo4l!stnfgl{T{RC8 zUrBCT17*g8R6pLr!E3&P5Sk0&?W_neSQ@cOp%A>eH6K36M``pYau1BhBS&p6ce^10c%AJ34 zH^odXCP;1uJi1F<453Md25{~*fVG0VCQFAq*Mh$>+_{^9m5IR0Xvz_T$#(NIMwY!V z$}C$2U zYc}I4u^Mz$`pRMmjbm4-iBj&Z!SqXny8!(Wwu!Uts&Jo_ih+Mk%pd^xd|V&da|F)n zId$@7(-2I9$Mrukvo9K~dSYH;8Q3^YA3)A~{{V5m7bwk|P;GVDE=EQ^^BMtO9bs() zI~FtXEY;0s04KbY2u9vB2(Ffq^uDsE4V2)6H;ud=vcf{|km=xtC$9_+?)*ShcmiW+ z33m)KOvLhx5J*IUto!D0Wuv4urqe6&K4N7#nhTI!6!6K29&2frsItmfJ4;eavT2c6 z#xs7@4U~|bn9fEW-RP-e%^2IY6}=2&-jdc&I5Toq5!fcEF5-2Fw$}5 zq7k(2OTo2#^<%unRq1u#^M10ha=4qWz?djkqdxFphM@gjI{QSf@#{-AfMF~^Jeic3 z!*kh}_4M&dZl$w%lu1ZZsoNGfgE%V=csV%rmt=?rlcaQ19ZZ`Ti?PskBe=k^!`5kz z71Si;-ntAR9!fn>v&6t&d(48}X^rD7x4yS)kk;4H?F6laspj#Alp!ZE!ao&MJO%De+-L_YWb|UD69}UR9ZpSp#n23>VX*23tQWysRMijiZP5>GbiL|ckxAem2$SGYjuUT1$@O%9n z5CddITCJn0$qSvPHtU~L?F%g~9*~Hm_eP^Btq41l0P4ev{q=?gPMy6Y)!LU4oXC5; z5N)DI#DUW=3@-5zCng@TSHj`*xKAIZ?k1@Iq-1-Fl^oE5)`CSi278!WRFBYrM3EuxyhyHeM^nZ&c$EC-|%vqM$J<$*CxE?3mxG)H@xye$%EeI&ZRr-f&^dc_NDfuyUv%1UW+uSs-@X0gy)7u`I~VN0(Pz_4{%xEpVm zE&Ii!5OZB?{ETf%`178wpuk%wZivR5i=Dtmh+j)fZD0YxYtm7U8mqHCL1em4SgiT| z=`5gFj5uSS`?-1+9i(@%%;MupSKG>K4(X%B00DQ&RJ-Rnf$X#d;blsOELK#j7mp^j~ba~L`5{{V-G$5i!;G*-(M>k4-RqA)A6l!W-C zZXu%FM$s#}lPPwrpEn!GZ`mS$bllIc{9Ok4Pp>9b97aP@Yk30}lSMf-B&|-3@1= za(QP~3s3!Z6(ShcJx}T-ql&>9+*dOEwJ+7)t$FA}bhoMvcE7X?fnXEkT@v935%7ox zC_D-e%O3fS>Yis21&j^B#-O*)@0i1zW%7YQ4u3*Ic6PdTKe>U)(ScYwt{6CABEIMG z?*vA~v4=nn$&TB@jQbS$E-pWt*pghct;3YOuIw&xN0GR z(0aV)FCwI+be2R90XRl_{S0F6Wy=2m0kBpapLtdbRvj_eExXH(At`nDAhEO91H|IK zd3C^%ZKm5ZQ3Qppt*z4dCO_djDBdUF=s#(k}uh z!>rs}hb{ssy*OqDJ!yK?9zhjX#7iMFe2I#hrqRMgO#2mnr!X4YR}VNwPP`deh~ij+ zSGGkp!g58Q!x(WlQG=PQfC|wBG@#pNS5nWANxfx@XkV;dKqh-RUfdPi==}Lm$NlUr zOeQMC`I_OJ7DW#uv<0}Uwvt4|>U57iWjG7B8Hh`~6CG&=dn4eUDwR;;=_uD>Y@5S+!v>mCwGY>4hDKFJO3?0B)-A6ClH%9GVEbGM;?=LBx z8OK-4AD=ihc)eV>9@{D!;mUO5ylw1*r80xw(0GgmA2TV*&(d2c#^<9K(&3cNJ=nXc zaLkbBw7(WY?WuymTLylXHgB80x}>(E&adu7OosdYV$OO@yx(h->9f@I;!@v6CL$$T zXP22-jbg{TI@Qe%`mKGUL&lT$p2BHf(|<02^$hCzrYF`FB2GiJMQZ4E^BR1TeUZH) z$SRp=`BasuE2}QcBQ=NAmSh_2jbi$S$Qn;^!;e_KWpOgS9C1301tTEJapCn08icy_B|dYV#&m$o$BSeX(0}cK&9mq@vpS2 z_j<>!&soj>={r2Yip_%+{Yz^z{w#F*@Tr0#4{APd)^iBhxR)rB&pqdUMgn)rB25gL zcxh3Z^;d4us|{Rm)H1|(<_vjoKZHxP`CxRE^_C8^<*le)mz*4C0j3&g>NP>_ddJAC z(1%V~KnoY_g|I{g6qrc2&DMG|xjB_Fv!)+p5rq(C<%7z+`a<#@FPVh3n7(k+h_2+o z9dRnI-acwt*c}!_mEyk=)8JSDftMB*_?494%)wpSEpXzh0G!I=1TbP$Q~`@qBE88+ z(yDWYFIbKq$Cbe4A0ZZcfu#z z00p<8bL*l!o%B{kIq1Mj9o+p29<1FTaVr%(*b!POLrJMECvlJ75)y} zjuWQZ9SPCbI0iKWwWN6+*C(u@lZ<8xs*FtKszER^0b%6V-!ayl zOgnnyhA!k~5O2AD^$`{@nhsw701%cd!UF1CFI9Ny1cVB(YcZm%TcWLo@_@xN)^X{M zNR=%Cirl;<4^KsCs_acye$d+HON#L{b%jlqG|a}Mx)+=iDu#oO`j-{VE1ezXa}^qq z4WbRp5Pe5v+bDu#WI3ck$OvsjZ<=Kl!Y>`VcARKEZsZKe)wG#i(`TXm%V7Y!b7ZWy z%rBZ3HWXE1PG%wrCaa_cejxta) z3fre0KX{$T)+yZsMGi9$zv5$DR$H2gL=A~7!~;?Cps9s82z|%ohznet`agzgA_s29 zQ9-NMui*8U)w&+A)telUEOo%1L=`P6rO#bK(aoLZQji!KeB{{kaV?Jn#l>pfI1t(P zAuK^xsZPEjHEDN$-?X#OSmIZxi!E^8Dx0K0Om@DV?i>m(cwA3hASGIxtCy@G92UL0 z`^BnQZMwSY(pp;3K~`IP%ep>p840-68?fsXF|>W+J17qF@P0q!s=Ag3$X#}*y5*D= zY&XMA!j^p;@?#Fq9gy*z+kjLYgA2mzi;Dn;MpWN>81#xL<1P?>gN$Kg(iKRj6?mhW zr~r>8cG{a)W$F$BAREQ?gNoG-nB9HZdywj@jtUGB@p(n@byvmC2*RkWfmBt=R&%(A z@f6`p70sWRh}eSRciHJu<7pJZw;_CSO179@Eolwq%(tHf5|zmGJ)@LkN?OwBse?r^ zLO7HT;nO&EdBIYkMdu4+YI9ee46@OJ1XAg4daJbBNDh3DvQ=z2yPB2imtt|);G2&m zpyGVR3$#m(&Wb{;K9EZrt$`Ov0|Xn)P$;yt^HHhLLlKWtE;3qW`}^X`~C!CIT_KGhCTS)XtW3kkPwE4ReT zyb}<--5$`2gcmIw{KjbFq1O`u%&TNOkSnko6ILsj?s6+oRvKz3UVKZe3RhR1;O~rG z%WYo}o-=YA1?i*aY>5bgAidZN_Hj~!86dkHGRE`0O{rER8B7n??Z2g(Tbou|JfQyo z2;jMJ_fWkkp~crDhwmxrl|UN-qUrvV4~J`A^)8rqpub{0f*9V(W@Lk-5|F#4wblwF zrxMC*CtH7!GtRA2EiCr@M8#=cj0schloBD__JKQf{{UctM$)foaD(a)nCMOOj2?Z* zZ!sgllOg`)=-v6Or~Z>*G<=RS{{TkfT(@20CN%wZgr^Pl#me&(7~T)x>2_I#0?t1U zJWCSk4S0LYEdKzIMbO{k_wO74+eyv|OvDEvf+-E5xhDPG(mAZQ{%((wC7VT*e!IY| zEN8X;@jA&x1cVrd?NZ7-vH324L>ex~pJS?-k#rT&{Z0Lk1ZaJJt(W zI&}i7>ZQ0@wYamHQO>Kpk4~^P71314F<$$eePvcGIDV*&ibMjq=rY%4%R_T(0dHxR z1URxSt8Z2bPj)imzcC{B1uMMpIekmN6piBJUh>^V{{TeoREz!* zZ!zDS&*CnjLl?s0|%X(4_FGqyE8*Eb_#-Hmh(uW9T=8#KM)~$YPv%lkjJY8qoi2Ap!yqri(3Ju=`JJ03KXkjUJf%BEOMYg z{<$%JU=E7zP1?+kbIR51`V_|UA@$<=?lH}P5$#=B(nno)i|(w{xi-<5^)`CT#L_Bu zG4JNf+PQ(f7Zd(Uludy4Uowpg?NX1cq#qD)7cNqO{|ndW{J)Y4)F+_Y=Vth=pzb=W#!rVAv(bR z`$MsKeqgSpaVn_1lb3_hdy%oIx2LQ7mt%f6>%_!*pg-6^M)eqpnQ__uN&^1?jDJy8 z+r$f!rnVXS6rf#2;0MJbeDma+xwVwbLc$(0DF#|5r-G6 z7#qMvj0*cr{$UdnK?1e(eh2q6M5+RS=i(}rwwIQrbE|UnJiZ}T7Zd%<9GwxS!O|4d z!*eI2ybqB0Awss-x8`A(A(7KI#0#-JJG`7)iv!=w0_5;R0HwC_`DN*v?44qEc6aDamV_yt8OPh}(z|4G`{n z5z%)pt{E`8LJo4YO{d;3G4s8q2p@FU3Fa`S{-jk5C74+{f`RrTNl^$6vgiXbzn!P7 z6SdY^`Mb9=^Rvpg?E+SpIfnT2{Y;F5CLC*AOHxtTY6YUSCf66XIAxPv`aay8OGv!5 zW(gfbCE(it7otGRz;D_QHz5lujhxz7%((RGu~FA?n7C0gvE6Zd^_gTe2&sX#kipkDlv5d2!UWv|?5kyP64`vQ&o65Am^p(lS-zJF zDEW+C3V03$j5TWqNUjl={Vl)-LEUZBP_E!y*n`?*y+7e&fI6HI=l~3N?Gn=+<#lV= zWCz5*guckp{W&87jdh8(p*ZMcF=5 z#!R&7_cGJa)1f@bZUQtp((OJ^M^q+~j~>kf2SSTtKs(e)yb( zlNzrBtjqA+4jX%zVAe6ONC_BV6B;^4BQAk)a-y5s8)4j7G}NVZgf(3Z4Otl=1x~N# zAfV3m>i!6=5zVvj8w1^b2uQ5T3jY8lnQHOcE0x+nk%UY!lIKF7Vs&In(K|2>uSO(- zjy%QuE|7?{t(GAjcz&#+R^|M$O!q+X%Z^bPw7GX~23>-D*$-J>t zuHF45VzPl3>#2?OfUg^-qHgJUyJFF;m1U)B&qSe(wwab)SwQbK32kAh;2_?27Mkg) zcwF4e4INi8uWc91xRW84^^TFy)J#iTi0`T{s7M93*(x?`{9vZEu=0R9_moc0@RcoV zyKZ7rvF2Cw03pWEx^#_NbIjy*wpEOLzYG_w7NddctFA6`w5vL4G!-uQ7UOE?n_RtO2Mk%6T#k-TLEWmEx>j4V+oTc6%E^#el|fqX9Ss2-SE&Xe z(gFL6Xg;79krwBtCvBTG|ZR5#hPVCy|{o0c9mSO z1T=`NW%2&XQ{F;*#xk6+r3Fs_s4-3Vfm=h({VY=8X${klSw^ruz2YjvZGQg%&skH| z>U!efNaZ0@*q1pv!XMmYSK&|{KeRzq=xE&@srF?bPzcGn(}`A>E{=V?lG`Zg5%ORZ z?DRW>fd9$wCc+!_95&$shDBI<{GmlgPebH>f574 zsWEq$#f({{KcvGIM@grZ$j)wCQJy6T`$AJK14q z*6=WX@PkpWW18g5+yGW!@7yhM8>MN%7b1F5^w%;kYeu>?#$sAd%0k%~IQH-Kft{^P zK+>8!ubRd?!bpq80@n7{D_f4q0C*+?my%s)81xJKnEfx|%N!N%`WQB=R7Ts$nwnVi z9*a{%x4~VU6EZdn?HGKC+Qtxwc;4ON{sD(43{{(&mUkFoo)doWFk4H>47f3VBB_#A zRd~VWifCVm^)#GHF4`fWy6Da(@flqQcZJ#kIt&h-p+R8NmMxZ+vntGYAz!qOE623S z8p%WVx$x9orPR@#M_$Lwy}vuUdize29l0iOz!#n3IaP>islM$(0%H`#)x8jug+5B@ z3utv$9$X49sBsREB^dUWp@i~^sa1yeFe)t3b-?oBvy5{S$ZGc=XlR+0X8=Ft^C(bK zNVuT7F!wnsS=NN?61fEU=Y>L26zG;JaaBh1a=t(;RZNF1RpFLf1_qn_1aiu12Ox0@ zVQ-!fj`9`jGQ;r@;^t|W>EYbLzonKk;1sE$Szk$JRYm)zulKhTPQdCtS)VL{zw0=U zNS}Fkr6_2z#pH3bi!`trsvo?{IPk#XIV&-cgI~&*a%Vr-qoqn7O}UvGXsr(S_<+8v zWb{WrN}zTbvL0YaJu)($t!+dT^Z08CAn;sS+jkzBhm30za2^Sb>F^QR`yu)39aTqEu*q`tnfHVs*|ErRdU3OhG_%si!zm--Z}A`a08+U@^h$H|_hFo;nQcjLFA~WL&Q;prPss(tX588=yjz1oK|wRd zb=fQPC`xRgKiFPjYxJs`@;bSS{&1gX#GnX!CiB0jGX9J0ZVk?@ZR6vIv({e7sv!DB zV^tYh_U(4luN4zMCfB|e7s)M6EnTxs>CLNGd7(=X9P76c=vS;)E0<+u!Jb1X8jaBa zT>*4u+S=Nzt2LJsy~@2{qN$1rmmi3Z%hF!A4`1;GbCb`b8j)5108nVJw59n=`xAI6 zftIG@ETB^aWn-$W(vWIBmVFQIC}Q%)6Fta)y-z7ZdcDnyJzJcGof%1!r~-SWqS5we zLkw6`wFoOISGwF94&N6TjRiE%_j#Hmq^`M-H@M8ftEMI>(a&F`D@r!=8B^EcEbRPD z6_Az(Ry0|oef?#R1p=UhNT*pIHhM}Uk*T2TT*pEH^);y3-E50*ocD*8{XIsB} zQN(t+u3I2zOqJY~uwI)2@#@2M;^JXYQrz+{7y6J(^)G#kxJxxEp8hp7Vbo^+lpT zV7j?|Ld6yPa*SQv5AGs%+Y`|)7cM1vcLrTj_%;5@2h1&&8CVvF`y9957w&0phv0$M zl)gxp88o}U)x)^D%>AhkkXuyY~CVvaG#tKC;(?x5#-Jk-sD2V`g$vAX4-ErsGlco>TjlIKdq}{xx!uuWRTc z=S7}LW7{WI-e-zk0siIp1Me!jVbu;8d5wgloZ%ZLBo6VYZ=89R@R(8L{4C>)pWaF! zE`P%j>m6(RrlZ>;*ysF}pj0OlI;Xk*L;Sb@04Hw_+Vq6|2Q#Cu&3hD09M0^Z+pljUqg*t-by!xy4uAKj9#&~kHEI{v_g%!+2QtxR2s?L0 z-%O80y3!|^wd9?j-Y>~I$RT+TTDyWzUl+8evAotZW6R^$`Y}z_ zhhhBQE?D$Ae|FjRCBp0v@xkIKU41aCnnl0j%w4C#*n{5t{MT|lwo!-MhGLm0(-M}Z zBHD5tKXXcJluUg&lRp{pRe=#Z&9o`S8pn;_vlm1@RUeqb{9tElzxu%Juo9y$G}TzyZ;I!- z4Dz!9;)_%)E#93!2*%V0$9MVFYtj2>)9q0RNuE|qi&|VKq=WEYx7l_^9BcEu8aM|Z znB)RHUjG5spg)K=o`R)tww|UJiHs)s= zl!JnO?*jczQJ`g}?WLUuYr>`jbAMFCkE~OdsJ5@CJ`s9o^_QNQ6-1=xw+=V9T>99! zy}x2D(EM!8Eg~`eBB!DK-`Hy7+$@msqpC!9-6m_@se2Hd#YxaS$Z?o3@_&qiWA&VR zbWHaRDd*hy4lmVaR=Mp*n7n$_7#r{$=2#@aQe0(wQoc-%s-I&Kse8J7tO2WLKZc; zyh&*r4pPcybyW6pz5P4##Pu_B>e9MPNUN&!yt$wY3x4`B;~ua7^G~H10A+Gq?t9_s z1SKxN)?~#^rtk36ZW<{Ru6EaNPpuhT@dyuPWYq|-9qP{M-?q(fJ#JD9urG_IV(R;n zUc4Qe^UXTf<=kAAt(?Uvq6S+`)lWJ0o_wz$zEHMkd+6`c27`AysvjGaiYr@-+ zk2K-Us%GlUkFVnN3(FBRJh5Twx{-7KR$C`qxsm@X(&y_te@=4?a; z#M8uW>?h@?i`b_L0XD$<>{c;91;HWuKV(!o>nvUn>7OtZTprE_li8){w<;xC$0pF< z_K6*aTD+(qC>}x5?Oj+G*yhUOBkWy&yZ>_La)i6#Nd{=1gh@wqFc?Z9FZL+fER_qXz=Mx5T5+3-K z{)JbGiN-i2Fxq3G7j||cfJbRRw z9k7xkd@(uGX{pDsD&&xilYKai^mhtrokETaL5j&cl*R@X&eADkKk|yHyq3HyvdF2b zuW5=DpkFtc8{?<(mYV^VFZK9r60XQ`r(wOZZ5B~M`?_4QFHybkJPghj9=*QH@gT;( z`bN3Ih0~)J(u=S(Yhq{E49pMe7FHl$AZ+g~Ea@pr*mKbr*k!wMGi{Rnlgo7W&Mjz8 z0vnS@{1d5NVB{I|B4yinz|eKP{ld;Of745WRDVCUX(+H)*{qoVnHf1ZK9lDMu%dWJ zcYo*Fk$KTe!*w>L)ZpHhLtnCul*2u9h0fCfSOir5SQpxlqugt-j4;}=TfrV#D5H1h zS!BDl*!)U|5a*(F)Wk{FX!f_o_3MhB@}ic7T1p>^VBcxZE0Ohg_gf**?bgd%UP+wP zC|#PgwRy}zXb0|bh-1e=Mf1r=RKM3+mnF`dpJf{vrrLa5<`-0vA!;cqD>ufbYm-*N zwA%f%Hhys=H=jufsCN71PT)&x)ZrykfNS}d6X}c#y}x0$K&NjxWd?{xa_qQX+_CvrUy09iqN~(qju`gumJ>@&TUWdyoyPf}29L_zJS2zB!B{5) zU)S!~d0p&6e>gD9xoFAICt!~$#_2YOkvUGq?+JScP^s4&1!FOf z6=Xs_s*lHEgAN%YC8~2TF5a%j6N#r#ZP6TwFLk{8bAoxRHmDx#38Sl0XO`gaA~W}O zHRt6$r%&~_4Cj7AA+t=rZmT!zaqjCcZO1T*p8lJo!b^!8dibQ$95DIFiB;6#O9SBh zG$B)_kd&}1=TrE8;Mdvt?dVO>A*Q*x7Le+{YRL1b?Z`G z3v*;yqZI{bdKE_3%1pr{`?~pqwfl~v=&pE4FnGXnGQm_FLCBI)Kd1`lF71=)Or(b> z!u?}#l*!KH0^}V1x^|0r&m8~TO!O+xu;r@rlrB>e8*xIAGBs^F{$Ft|lj~o+1CPa< zgt~#;sUa~>$!ybom%J2j@1w9x^4+;>D!k!>A47H$?>XETb(XhDhqw@G%q|nP60)t~ zSP6Z@BYf>e^TRInih{eMn&Ui|WH%9a$Ms;4?=>dm(+>A;z?{xSks#ID9^qoZi|asF z-Fm#9$h>t+lNn5nM2_aAFT?W3JIBO%HEk9a426kH#1ZAbx`U0^mX$lA3CC&IAk|L;|&@p2$Z z9Q}ca#?88E ziCRVZ5zbD8vluoGn;`RAi$CRF3ub1*-xq7E^RyOA+6GC&ZHFW0;7tSs`aQC?mmO9q zsb#bd%E4)ii?6xQT)S5M*Cr3^oJ5%vBjcZb2=8DFTc*pjp^KUn- z_rxw=!ct4k%T)c_XAa+1fS^r#dH-FSqGnS)S{0yIVh)p@aJd=rr0MXT;~($!c7GuD=Vb*5h@X~`sGtP5I#EeUNw%yUVhKKCm6!{MbDNs>j#zY>p5r^NHQ{xX zg=mV|eSrCbvwXqg;Ft;X3Ux!ne}IYNI>Bc#Yf=vdujIwrgGCXZaZ1s2!wR<>`R1|V zNcJ6+X4lseSr!K?(ofx{IL+}s&fyp4O9>A31B!m6Tut7g%sSIwKN_=OP4x46>fT48 zCQbsxABw59WJ^Ayhkks8LxS}=%;(44N(K3x>`rPTr4*!*_pA3)j9ahsr*1fpL*d53 zZHHfQ6PcNrnX*807dlPIye<@D!Ng;jPNn_)wqP zeVgj7(8W%bghRmEWYm*PrVyDj_}y{Vx23C25K*RqpO}qa zDPgfu;*aEkW8N&)x6<*{{RFq6O5ksAJ;cuo4}haIk6F~7S#(su*{5|I@}BNkDq@s0 zbpkvhoX;)DkgdufIGgqOzYy_1e>DI4AN{%sGLQs+ z))&mR1}Z?0%-8?-?`xf=n*V#}e^K}U{P+KT4E_hrx`mnKYG_>^GUQj9{ zaOV$F`=}x1#Lwrv^nAYto1*T!JcZ+5<`PW53o`W)B&sD?2;Fef^D8n6z(j0nHYs!{#gO7lg( z99I-Up=yD=kd5c><)xnd#V#50qDn^jWd(K`6C>X*a{3~&L#yiBtb9GAW3j=t0I2## z0-9k~5gY4)HF1m;i%CdY9qjF_F(vt~ju!&+k*f~v`T=FXq#YxZ?-?I_Dr$a%N`q1= z?C_U~B8?p-`dxN+&GmPfU$Qg*Pp7zZ8J;S7v&4YJ-Udu(wcc^lnIEA$yuDL^yftbfp9L?Lx>IpkhAn()h%N? zx%K`paR1lJ)kpHSHn=t(Si=iLYW`Fc<9l;sHVeGi~A}&7Du!? zW(3N<`9HT1H!!P@!cId_b7Uh2!VQ8`%|fM>9p~33!ObHZBz5ZhTK@pCvZ)>;l+2E& zZ`~^rdc1a&{^w;qUaxtNcG@hu*&qH+U$%)^)e{WQ!0C%LXzBS^Bx5p4g;`p?m%*Fx zFOs))B0-65z_9@fF9u`#o&?tf9N!LT?Vq@-vh6^IS4+A-Y+*b{O|Yw)jiZn ze{rDql^&&5klh&+t3L%?T%i-`Cs-4m$e2IQYs@5egsZvu~=YC;qJiu#pe|hyWx20KQl4 z;^>$u&iGUW-RlQi^YKFE%7Z-%Y)3)B6;*`wVPb|MXg;!Dm!Zx)P&b|o7je%)$A)#>y0 z_1INbTld%`+~4v*7piHh=>Kj^Vv!r~L(vG<5Ahjcw$0B!Z89un?4~WCzFOowSVotj zI*-8c9(BJKx++DZ!f#q}9U-Hj{HjE-Q^(Bv(Qy06A8EL?TCQPx9Y8er9`Z$l)66OT ze*lSpfajqN2|c1wHX63V+ppnf^i7zfgSU(I8%GtjQ*oNd(VHV#b2A@;1Un-J5^a#) z8oG83?s4HUQdqqf(FU)#|5PbiZH*&{%GXOlhS;83z=VEJZ!nGQ9M{_VA|kzC;%nl- zHp9kgX_{VMQ{`~FzS#go?$-ZHd5EGkJAz7qJ>5IvsvX53Farqk16XY z$BQ-x3K_K>1ny(3&IA&!AS`>z3+_1~ul~la@z%M{QS`>ndtZ6c?N4US&YeSdTc{z& zP5LSQtfze%osyGUg9;ip3&u?!wxXesZ zq#NiVxaT=xRhV=O7?`6+Q73PAZ{W}}Z!oM~;aA$}HT_9>dB8;UZGHj2D_?Xf{OX+B z4-xqRJ$U=;*$<62Z=1kp^@@JQRj-8EM~5S(mk2N4&q`3n6L--cj8t)Qu`*J1m5nu4 z^kJbdp>M{w@xJ5{LNrJAhwcQGtdNYFijVt<)2y)ed_L4=A=-1vt% z$%%cPhiC1QVFkGBP_EY4}=k(77gH|{p^-J?-&l5BeCC&$&C(f6>owQE`l51 z%|@4x4*OBEjK5)FRB_lt|KV+!*lM&i52|f=&2d00!w|UuO>`Hlf>{boQO?j+WN9t^ zlSpJ08?-^%z4!06Q_kv?`qn=`!On=^r-08q78b1JGdvrgR%3&qRFaR1ZVg@GF8Sww zZAzAIc6Nnssk~% zd7{&B#gA*=CJLAFd}x$T_+IY?1rbmCXicc!tuyr`9X>NGtZmy!H?S%P`Z06%FMUL^ zKI2V?;$TAF#+ts^9j@sol7==ROH357zZ_@KbTxi;4ZUg;FZ7j^sH(|i(RdB&R2s)- zEy1?Zr`sYW|D#_}Dm+ArG431~Pq|<88t^TlcEx_v25Ew0I{D@wpjZcR+VjDQVw6zT z9kF4Vk-Yle-&IdKiow!?+Hr|Aivu75!5%r^nUYibE`RvERNJn8HEn3&^UO)JcM7M=aW=2c`)XW&H0G>^Qfw>1-muno6S*_R`Wess(ZA6_#N`q9!zTke7OQ5DVpfi^|q2;@ad5(XnooKqS~u@X z>GrPYTxHfjpDG1SsLTX(%=ywRaUCj0OrpOjTmAz$MQ4t?zb)p=3ZC!(Nnz%U$7l0Q zUVnW&JrEOMIs(=vSa5gt9m8&`*khY;?)K4`O#SBeEUV^wpf%Zlp)F#(h;Xi`x)mA5 zQH&i#5TZ)(>_MB5|$;!o|elP!hnoG_dECgBeh(M z#}XM%p8I(1X)h#%PBfh0O}=sWo<0`UQQ(a$?A@5)KM`zvOz8mFM&fleVT~fe*@kg%BZ?j9xA_%!3*k4b>kcCPrE;xRp z-8fn$_iH`XaXp{(v5=MydGi*t^6JOFMMh#LALFnLkO;AaO2$B%lgm{=+tt3R#-aaN zJepTH_I#Kb){*`A4Sb;?nTplnO_{r$rB42DG}8gmPrDRLics}fM9JIDqZbG*5z@Jy zOBF%puyUFY7GCb-AJ-b4iVIHhMPOREeHt7_KEcr}C76CjQ2K^p69eBr6>-|uipDhb zKEFtT5J%WuZpIPmX&$U|H?GlmcS3O@tfa1^CYokaN1iQ$-oz=7CC5Ozy41hpW>wG) zLw`@i0{I8Hl`n8i!O;;V^fS{6|29QSsP#y_S9*+%<{Eur?39>@~7Aw ze;s}=b7z|*p|XJ+%9p@jmQj=+%yJP}c4o=qe?Ka`+^)3IWa_0YTD{DIVCNE1()lg9 zihflU32k}7_P^Yc=TIKgenAwqPA=?#$UVg6tbH%K^9wNlQRav;BvS&%|$2(c+_pc>A@Ws4y7Qph2UFdzlN7S~s$4b)tG4goJXH`o<6~&iMtOh+-^C2E>-6C? zy4#FWtqnD5*yHZK4&tS|7;naqG_}h!w|5Ia>!BG}>-Z_31u2Y;knNs>q+WD6lh63g zqVAp6>(%-dq{^XOvRM<>R5I-F+P+)&I*`*3mK$0 zZfUihF$!h2lL~mg%M_N0SFxQ#yW+(EdswP#NZG_XYBBZ?fMc1xAC;(T#2tvBK^)|o zV-5)ebd?a`r<}Ciz$3)2$I$M)}kBlc3-`hy-PrS^kMT)9;&FK@9!Ug zM2y#bLRfW8wMunl?EJyI_Z3%M3|!J!0W7kf_BMe(QJH>(4yS;f8pzL%pGKd_K5)dp z6AgqfR~`CsAQF?{%qW}cT%F-BWDox(co=pGBQ}=!{MHaEDJ?OqIsI z{Hj@BA8|vf|5Q%G}89E_#>2%?2&zj7K6ni$zdvg*5hE&E<22kKW2|>>>Mw z0I4}2tH*8_b}KQC)mwJ_HmmtEv`o6rGqLj2*vPapx!|f3q-?8{l2R+Rz1a8lyY5_y zTj;E6dX^lP3L`Dr2Q31Eg}zp^I0ykN;$+fHdfm@zh~fnR$M1x#m^;FBTb8m`!S$ZQ z$*A_U-}ER4g-vM=E`~664F7Uen$CZh<0~SyDDIVE_2d}7#YlPar%=MatW&gsnPDLP z#kI2*}wgkdU)f%9uc&zUU8NhMddH^H5C;FNa%+G8hs#WAQM2=WyDP!eDulf9lyOKM> zDuiZpO$R{Sj$(> z)5Skb`MuS}GaOkDgu^)4bVd#(BF!hfsBB!=C{zP|2ttK237>62?(>Gsrb9+ExvkXN z6U03iw?92&cIU>8Y}LG9HKzdpWPsq6Cwes}sx{0vD&H(Ln$Hv)B~+3@R?>Q8hYC6s?XhSqMP+J{ z5yFe$!$o`_J4ta#GKe%u<2fgKPD2xX1^}RoUd+*4%~2!{MO`xWKb`eI9g1F^4Z!bt zH79;`CjN9Lel-N2NYg|B09SJ~|DXUCJov;K5djGi4dK5FKEXx+;L&nR;c8lXM$&M7 zDs34)U)Z^jw17{-(Gidk5F~JqO!-+WK!0Rvlot1AvJ@IX4>*!>zxZ&J6A-#fc??4s zWV zHU!N?IZw_2^ag($cM8jOxI5Rgj^k%}rHiKfokO10c%LA}MxXPRx5^j!k0a*@77n1K z?zteA<pP1;{8Lu5xP>AQG`dd18qK36b6sxQLJJ$=&Ti8y? z?Z#7X@`p!>pI)Z?!a3v!@wpN`8h_E|V_QGPjni)I>hqiqu!Uc4l2E3Ux=qE-n(*Q@ z?)a%RAh(m6Fk&>cP*5ox5qy;3xt6K-W=V>MBDmmn8ryRTk*9QT4jXzVL|_D1>Dn>2 zm#UQ4pCxa#vo_>Jk(JV~GwhtJfo$X=9o5GfL!S z1anMA%jsKjA}P2(TinEJ7_OsO1$7AWP5~NBHmgaSRZQ9v?&4NMfzuH(!pV_XvWP8M zBvDXU{aCkiP3Ut^&XjlhagspvY4frJz2y{rxxn{5YJ+bPf}dZl5l5IX6Zfl@`cZwT z-y12AW_zxQljoxSG9T5dRPuVo3`o(b%9DXqtd!brvZ61p>_fKD!PVPf9q(!{n$9)T z&bW^Q2h=qxdN^P1(%>+rjM+2BQlcyJGIy?ex!k;1qGMYe%ASkWr?K|F;)C5;Y7blV z!jyr7a9)vO>pSeCUj)zn!{nO*1ZoT`AFFk4?k;c)G}=05tySp1F`ZC%4tljV2a4Z4 zW*K6Cm$)VP@GEY95M}0LspYBXZ3IGRcp*5NAxyc{mqSW7E%Lzr3AZWb-c5|PAw(5D z(x%%DbB*XJH_Dg;xJjBAO{Qhu8?A{{Ys6N+K~xLuNl(}l!X@eQ{r*lJHNbsQnPeCAF4o7Qq>RCp}C4b4x79u zd(wVYRq09NCFdpUtH5dRRTwbJ{4>0#D=8s6$(=u21wit$V&Rt3hmCb&FltO?8qY=|w0Yww6P%Q-4)F;nG* zV4^eZ6YQD*n1&m^enOd?(@(~9JWa1tu5nz|HihW)fC1^ye}Ji2wKCzk?Vsz+?yN7l z^QEJ?maoODF=Rjr)wsd6d`#EE->-7L7`cLk2U$X(_si*T;pC!fZmI3lM*W+0&jVeR zaj)AMydKB7=7c%&Rg>_OIZ|9pHbc1qIo?qQ4OTpoa+$%2>CpC+3@p)4Qre?G zC#OyBC2r90$L-m6zq>zGOF7|e+(!se)e##uz+ORXa#`sY3+Y9x>AY>K7$%TQm^xkfjr`c!|uh7II~(>j?ZR3&x* zoZKOEiIMUmDw$aw6p+jmhCmfb?|kr72l+ROp7gl|)-upxv5Z%icgDUW@J{g9tBK_i16x%MFMX8nl)L z?bb?Rnq`!l*^OETEn?V#7_=(D8>LlQvIu&qZZQ6SjsZp4lyVytFq=6lMvzQSg#jX* z>(vXnk0ANLio2Rk!Z>ZSgwQP8ZjmUk1SyMX3icYayur@~5D4gDLugqJKCyeV>{|)Z z%}P!4^OAa_Yb2HPsSd+XHpzMo_^zE3O?!p77pBmo|FD`=I2;pWO6h+5QaS92M9HNY zm`fWic-FQk0BfY{;=p&A*+m|9;tu72hb6){xh#xOk^HFS91F%kW(Dz2V>&@}iHh=N zAUqoD42UhV)stj30#^Ijt_ea)X`hzB{y3@00h63&j|DlHP8Oa{=cS-K&}rl8I(H(4 z)r~HoTSmD81VAJUBrMyC!pVuQWBP-4>!wktN4^s-%6a{gwI##?M~(5aN5!eRi?8qF zuyRW*!AgXy5tp}c-WsRsgo=6t8~)#lhQ%NFCom5%hX8&&B)K<|y^`DX1B|2_#SRJD z3azQH7nQidPWvhNzX%#Vx z&2rg_88&{3>UbX$>Fm248xWD{`|1PSfkr+(aa#uqqMX|l99g2H{Rkd7*Hf8*eO$!< zPGa>ns38oasLqkn?5p{*;KM}q#O|5mTP&K+11x*4INfw^8eLI{iPYv0I=S2uH@Yi> zL&^d!iz&%FsI3lnd&+%Q2gkvLR>K!6T7Kh%tSo6#Wyh@!j9RFMp%Rg3RX~DR>m(_iV{G>hvF4I*RI>cJLm3pEG-3#c6W$1O9 zIJfDV029a((R8B!JUoig&U;g?Kx-#QrM$)}*p8A`>}aa-wCQZpr}_}gbzfAns(OfG z-u!;ai##J~ac^%>L$@v)D7zh$xE0zB+ilq7ss5%RLq^A+s8X^%)WxM)iMtjLtE}HP z*Ji`X%(xR-9J7j>YN5XTS>M}&n*i1PdEnIXa<-HnwLkMmp9TNmRWEy&Y}vC5ppXB3 z30n>Ln_C+5D=`MwS3856>|yxvS9&l;{@w|GTh&yLi@Jf0QLY?aN1oUA42iDmbc;VG z0NQ(Cv%yOb*4HaQ8A_c{onW`kb@&?tuCbGKRVD-G*9_6I>-3J}hUBsXSv}bhKTHW3 ztS%0t@x-tBGofKa47(>*7D$OeN8l>AU3)^O8;jYw_*-?x0tanv^#cT31yax(+6-8umoYG|F)Y3%1uWJ`rNZ=LbrK_;A$nGM5x=qAN zBBu&lx`2suNaY63!g(!@|wtW0J0bwIYXx5M8ANE5GMJyyA*RnUaV?69`R08n&PcDc`!MHh;r9ISv&lA>mB zH&5_c1t;`3?>_)Hp&aib1`JsPb_pvBDk9nQU{9RdG>J}E?3(}JTp=w+3Qzr^F3pwd zgDU|vs#j=VE7n{RbXeJ96U6q}eDS+~1YwP`OHG;p>cxPc(Q>_(EgvV8+~*Ux+v4ra zyV!6xFuS?%yBTO}rI&d2xAwGB=L`t*{D~@Vqc@KdmYC>Bge#)8 z_i<(AF;uudw7o#T)$jF7_lKPQ!E7{h-+3FYHQ?4u$zs_fBhSb!ID|uzqXjjE?mL-> z(Qo2;d^!zCA#Q;-w0^@KbuBC<=x-eZ=^{g{mPbA7MeU0UvWa?4s!g~#N~DPca~FD4 zAhje*R7af<9p-c^Vu!4Ka4W%g0v4V%o_we;b<_aXQK;bMpUPgVV^f;$XlyH!2odP1 zF8UM#v(B)rIexNYTp}*F3y#aM2Wbi>PV01m#T%;}lQx1lU9>j^!0Qj)IqV;M0^^4> z3}OA#uuZ#FW9(YpO~u+cn&Cvt`e&M%hy42v;woHd2mF*HdaRrrO+QG517jGs&ig&K ziYK~);tVcX(kUtXCK*lpnY5uU%j%~@Wi+ecNknYvo5oX`mBd|sjL`j$U0PrQ{73r= zlbOV&5|iguf9&Sz%;34 zU1Sdk;-#}><6v0Rj?6^>V@Jqg(al{)YGn_3_7SJck<-YYL$=uLwYOv4#DpPrJK_z= zZNL+F<>eG|+fzhz#s-nyeH9#~$fi}c=(HYG5t~YO6p6Ol7y;R`kig{jT5tTa9(@*G zMtNPLS>`xe$27!u@(zgw$)8ThP1rM3aEi@OSVV^!&6v4`XOqRx1XtgOqYLQ(r1gT!MB2;^G@T15K^j_eN0TY_0-2 zyAnsOhbE5r5-1l$*UrM1W3MN))PqCU8iEShWCcT8(0CmotF~<=#2(TFb0af{A%vId z@$U2g0CbCz{5^3bz*-0a{-n3c6pIS1qdILn9?xS2{6Wr1AUdmBGF1*faOGtQwZSO& zLb2daEP;SB%H~Pg@5%a!B3U>BO^z^Jd!`&xF6xWD&Y1-rD9s&xFgF_Vf!b-?754+Fj+ZQ zb7@kYe*w-L5K`_%j<^BGJ`pP*SLE29c&OPbk3AFr0}PdM8+(lTmapbzCw1Z{5U~+* z#+1YQm=G2t(U5nLF|uQA)7$`^+HbP?YZSR}X|U)}A*RyZmWh#=rC{5u?bH=koL@O( z6lI(bWEb`EVi!!V>0#6-uoHQm83JT2xGX44N;6p23Fy1riB-+!v56F=nSg42Ah@!V zBH2h=oiiC>WJi03uMJ+1BIIQ{c*MI;xMnQMJJJrw0#9M2NvTN5iv&oQs(_#>#3*G6 z5im}SYCb!LMCHEdOlC)CqJ(}qJqSiIK_Qu&%|oJPCjzmZ5vnso0c)D_kH}KNlGmqE zLU&z@{$P1dM{qeNMgPX*U1CkqWrqGO#Kd!*^qqBeb%HB)!b}oMavXWCaBBBwIlVDf zwpuHcp2BA1JbBsXP5nlOl`#k&Z}%&WbWz0LYg(%K*}i;i?%H_}GB1zx2wPbKW;`)- zJCc&@E_cloB{3TX^b@BvCr?5gpR66~8i*IKG!b=@7@S(acl2hVggUxiiroFz>cb69 zQ@}6%uRj}9XdaTy8(w!Xk;Y1Yqu|FPhz|bMMS9mKYA*P@UFfr4qWn2UFVq2D#R-no z!)5N~ci||N_35#y0B8N+>9HG`sra~^)aB8|%~b8I-4hKyMm+UU>8gp1(y2Z2nv2cl zgfMLD5=f_h3`|R-7;DJKGcfNLP-8%m>^8M4Q7;uR9)n1aN8z~ zU`nhX(qcve#Gs?FFdVyN4w zJ^Bn)*wA@cs^H**$z@klYF%Ol5ibz@k^3tNRW!==bJz66ogSagqarxz!4>xSN{gZ@vNW|g{QAc}^H8#lc>3VzRy zo<01^w_?cq#P56x4t3Zq4kM?jyv~s__yqAMV@>Lkj&a&mr7H}>E?;d!OA?pQgyUG8 z*ae-TLi>6wc|GBn^!=N?OM1g9o8`QT8E=%va64y5g|eqOHcymm{JUGA&buC9EZgM-Jb#_Mt&r^#m7+^{WLwv*mhx<@i8Q;h`|=XEoZbe&q%9YrWF)vM zl}{>yBA+G0xiqboo&0vFeTa=oMbaO-uj}A4_QqdcFSg|M=-$vzu}KllU=Q zZOBbx-jpc476uOIUZc0@p~_~LPU$^hVrwhW1LftiIngt9L(rrbnY}*tNGDY8oANSK zjDhz(Nk)9BZE8C3K^JSktjZL)b#;m?*JMNzN04XgZlfu{#2X1Y%3a)@ZW+TVAFJKS>-rI%N}`INHOAFTjP(B%T?)(B0=sxR2A!@Po62~kzEo_cWlC!)Ch~x69)8|&j371qW79_91a1tUoGaIIK*AQl znvFDKHS36-Ie{%587vfI!C)&4{*@*aRo|M(3}d%)^xz@LJEA7XjdIiZ4Q_EVh4zDO z@e$N4_2~MfJFOh`k>1?t1Nwsf3g!bh+a+fRa&}v~r!`@`T*kP(7$&0$q=?Jfo?bpR zusO{|1n{6&3A%8NmhOS>DI%SZFX0VZ;wHM-ZYbn)al&j4wmTLVO|&4(igMJNVJa^c zcb;P5&E4BuG4JC|WtLDnPUigjPdJj`ZY~kro)|e<_8FXo16yFEoaU!&Cuz&It8@k#}rS+&wLV9w;P&8TPt(JaR_) zDLklX%vn%6k!WwN?O&1QTa}7a2qg4)`~2W|Q$lYHt-y%k>f9+&5BoOU8MN!CiFnl&q8>?bQ2P67Dy~OK zW{4qC6;C6wfb>k%hb*-uH!2!AZ29()@w_T7d;B~uY2~!D2UNV5&=Q)ryy#&<=^9P_ z=QGG19@+Zuh*&eU%!oT5yTfOyu@&KKUd$!G|G0%n2=(Wq8RtPAnHz& zOr@t7 z0+%vFqel2f1qvMlWJ4*w$_P7DT?ENVZQ*L-?p=NGXeh+5V6ztH)Q}_iP8)BNX#*<* zV9ZjGwT7r!Gjwd=h5^t3Vb8W8Xq|qrt59>a+TA`|GVAuTuu(Q-nT0k?-(_WaQ}h#f zA#coZg$jw{X&BEvp`b9SKE;d=e~X-G8{FUZEc`QPztsOVsNj26UhaEc*^R393};Dhels29I!;5y0c^MsTx4x=Y;{{c6*uBIYQC(UwYBMV@I zb&J@_u9EK*-!;d-)wt(tnGJ1}RhI_eF$L`+^JpoGMiyNK&t%pXi@8lZDX7zkpM%}L z{5y87z1M9V%TX#<)UWOX^iim#EMG2w9>TKBmtCJ*lH8YqKIJmX-<<~h0pj&!KbPfe z35>|2R%Gf^?|W4Vu1d&O8DaG%Slw_oaE6W6J5Wd{da=~cie%%-PY@s8#c#gu#5CRo zpIqCv*8$N&o~-$a0Zs$l+&Lwvynn-kq_p&V9?{LPPEXC|cw$c;(t+K%EU=hamths> zIKhM@`3uD?hv_IXlkp!jC@FGm*3J=UFHtzMp=^HW^9%XOeEj6nptMM@itp0zax;>% zI(JM&(s_VmzbdV{XF}&Ff^PJJ&SGPgXTU~)uIC6cqqtnB`#{NWW31^pd0RL zL1TNvgPjfMP8iwwH&6DDp22Tq2250`8ugeu`v>Sh{&+c7_C5BJS#Ihgt2s^q#Adu% zN{aLvM&m+A^hL3o&!9;mU~;XFBV-0F#DjD&Q)o*Gx07-D;tha=sL0DQoz?~Pl)qT5 zba1qiBZ&y9f)Gg}V5HVu++M2_9x_^x?Sv)lMz)Cn%+hR)7AK;L)L}tf)!{{xMPWBl z9S3V7BL)iYx{d0pMt59=-dozT;k(N*zzT8yFfte=hi8-kY4ywqN`TpV1+XG{k6g(M zNv``|?h){&M9{O~)&F(5JgVbu_!%zbL0C*}UPkj|^krSQrG>*ijh4*+9gLd?)`Hl$ zO(92eYA~ZCRSCpj}P39d`Gw*a` zjBXeRNJt}%fFL<~G$JJ_B_gE=g81zFd(LytbN{pd_PKY*IlDgB>;1Yu^J@+cQ2>XO zsmh53G;6(1)O=0|Si*$UMGSd|IzMn@iRB3aHH33pD&*Pp5bbCq;|gguJ>K!|XULKB zX!^7kUaDFZG9b;wwxv~FZQ!aJ4N=#|GbV-g*QW$CFYa?0aMTo}VvE$@zZ$>q-d?wc zryXID;OflqlUIVIDMp$>Y zCZ!#yUBGr7CxOI)$on8nq0V;&jdI#o3{DJ-RP91h8OXKNcX2hZGTQWuf_fA` zKy#Ut&Omtal78w*@H`&@Qb=y%=CAtNAfFup6iJz@3AS!bO&_t{HBc?NXP3*Yh7BV) z2MM_|=Dy#KhInN=BSZ^>3gK*8Kel>1waqu6Mrj{7l8`J@xpao_;25QqXg-(_RGVh3 zg-tOp2Nj@L2exWY8gdm=E`oOQ#BpN#UA0?;TA3d8nXXdvx1p3sU3RqVdF1u~ZgZ*f zx&<(E$W6W5;43JOJcD$bIUqO_cheOu1U4=ElQ3n^LZw!!Ru}iG@n-{_A;Xkzre`Ru zXeT;9qCLkE1JZAtIlJt%xW9qBy9_xLmC6$ZuHRq|#Ti$_ZCLYwT@%a@Ery&^$k&|h ze39v){g06EFA4QOSZQl zU)YTJ{;}-K8+mwqF?M?JKM)~Hc2X{SPegNHzFI4(t zaw4Gc?7i++_n35Hf7DT_v3c=&-Sz3oCUC&)!pZ$KG>((cx%$`NQjzwtY@6_YO*qU- zdcd=%1tk9Ff^_%lPytPEuNY?W=K)oxc67G?%I0fV04sy(PQl2e2X@MQSa9rVM$gqQ z0gz*>WHW;iQkD8@99vN!{Q6XPiNADYF8GXJE7E7|E&gZG5bFoB-tK3M!Sxg7`G|Fg zv%jkCksa5ibuj}($rnUQ@d;Tyzw`gYGz2aC3JQ)(8ZhN)_#S4+!1?F@vOl%@h=XJj zgQrIimAK+z#-F!X5qCMy8=g)+UY36=?A~4XnH=bj5zso5_5HM225cnBi&MM@_B$61 zEAgH$T+-$1wV>}a!r_FyzC_pWRKHWuqz?SiiC-jYK08a+Tv0ts`tb+v z=lQD$(b5k)TcvVeZd17@W<^mWLN9OSuhTG)wfr;mM?tUK|I)8m_u^XlfUFz3f(io; zdiI|8RO%EIHXtqQ(p+paz#t^a&NavC$=!elubpufM~11P5iprp&cAhyLWxJ0)~R&L zfiQ4sWaQWiEqCgT8NC`3tXK)@kRW=A#EP$Lr`5^yjnop9Gh*MZ6E zU-`?Y=UrQXH{HT?EW=a;f6oQ)R9Po7!b`L0kB7qj-3!^|VXb z4|OHXc%H60T?rwE4r#@)SHwC+?MNee8Q$(~xtK>1Mn8Xm>Dfvs%}?pYB}ItPUExkG zAcmw~r7KJZa$zCOlhp>|Kt0F>V9yiloqt-EKT@$97*yB zByJI^ znwgQY-gT}bvZ#&j^i~nO`xE@LAkO2N<)!##RKONXNR-|Aqav=HN5s0zTzX9Q=FSQU zR%F}H%GVNn_{hX$Js-2r9vCn3Ky_^QKIQW(H}IW^3Z9^K#KXQKCEP4sb|Bx86L?^W zqTGnCcs6 z4~nfahXzI=`9XV1%TkMq|4u!J`u-v{B#ybq0rfQ~C~;iNuB)Sjvlrn+)16cXq}?>E z_u>16l==sVylEiS6asU$;jzm*%U~ZT3B8DFU3jxJsTY0zJ4rtM?e zq!qQhs|WFO`K2u3CFS6Pgs3W@VIJozm3?ww^s<|namI>bVVt521jqxiu{ zsN}Fz)j9?;wsjUx-XU&A(PB%)8LpLTy?^wW6Y$l3?I6@4D2s2}vKggVf#f1{gq3r? z2Mnm+=k9Wv{E3AB9qb)JIFN(XWaIVoOmnoedmsTqN$xG<>^>V9E-2pad}$UH&d&)R znv(8TK?Yh4N1>)!+t(xpKB+)?C5p6g84B&e^HLU+>U%htJ}RE4{%?WBa@+R@)<7F* zQHFW06Fe}LdpuU$vDyct9V=TJb;i$q3mw)^FpWOX^C&l3PR86Pdb?X};&^ ziH~mDonr82Aa==8lYHjZaA?s0sR53^7J~=$HDDau84qzr?VixqMao z{!Q^8T5ocG=NEZgon1(--?0(2#k{e0;%J=rgWAQ3Lm|q{S#y<%+QLB$ZD5g8UH{RX z+%Nf5N;;}}O1uU<*+}N{d4U?pYZP@sVOQKDjumlNOnHNf9$Fl4m~qm`t_XKuDbpG3 zAHU5-muLshL}b>!ffaJYH|ZVlR}x;0{(SnRD~zZsC&{ZwxmG9D*NXjzqP z7oeG_7#mmXtz8zjG71_sk$OcOZQ_|LF(6o;(Y#y7R)I1MwVJWiBm~o7)91Xm`erFE z4npnM?s5%{c1QXSs0fODra?3sIjD%v9QqTn=N5GP&*DYny`g!)*@pkD`B|IRSR=^F zsMIX-u4eRHyIq5DaIr26!7IdQzOCn^W>&(~wogC!Gg)~KxGd2wCz7Uyll5V`1 z3ibnHVmnK>G-+`|Ll8e6bNIS?g*toQxCOIv9b(toO?OfrSo2nkVtMmBUuYQe%t_NTiIJQFY;dmYN7T!s2RBRS{yXDQJl-{N9gXSa2#8~qz zPg)&NGV-jQzd*7NjQN5#gT4m`{ZUJ;UoC*vS)I|3d}!lExoIRaUbDqrkfgYcmYaLJ|6W|6jCYI%f=aySb2 zJ;y=#po!+LmAZK;Nn&J3q-viG+!z-(g&%BW29pYjVP5#@C-`32VS@0(mIfYFwksu8 zQMrb80>?WdV^Z;4n=n$%Yy-cUsufs|mK1SnIHIoU*(HTV`#?l2iO_;;P7tn<$BrH_ zYL#B`y11pqAu~N!X6jwp`&}xo(5TDV!LC<$_x%0aq7NoOwSXp+7Ui9VLLxcdk2dW$vj>-M&Q z2hb#n=R?tkOmk`>%n1}Fl2B96_Qo@NFsZWc$tBxva{^nc&ES6LXx$wWZg(UMknv_% z;x2F|QS$`W!NjF--?pIL5#yG|#e00vDVaQ_nn#@2#UD}wzllv^C}>kB@x@j{6_ldA z6GzS@_DXR@_{fxRwlM8f(9hGGl)?972u1(&HJe}@6i;_N7TX34?x2l}(!%vce^)JywxGlpQO;mghQAxGRBP|pE>fkp zhjBUa=%;X56DlehzwkZLMNE4dIe7}GoeG?Seu#^tiKr5@o&T`XhNBPt+W4*R5Z|BF ze`4}*BWTZ|{Mq#JAHX2r={xEL^IujMJ=+VL{++{}t;=-65j?tm@D4A8sZ!WHnuq8u zx*00CTjSD9f6HExOUq9tj8iJBx=iN!EO)XS$hbCs(A4@fxI%bYs1?-@{3F$d7SS9OS^IP#-pX}~lYsNHTQ?I_WRO4IM$KeC ziq;iCrObe3l;~$m3$mD^v6W7@7e_*yut-cd5dw$KyeTjl&iTR^!2(!=QaR{*OlV|L zfKLH@ukwKMb2(^&Kfl267rn85d7J1`p>1a>>Qq`IIFa7 zlNe6}sB)L!q8J|3_4QwHf66&P!Mx#RA&-L1D&YeEojTJ7ri5>C|zPYQ{ZJ^IXH#(U1LomEqX zc;%-=qMpS4m=|g$CtJb+rm~g$aKc5QO}By}{kb z*EN{$PF;{y0ZwKd6LsEC*P#A8XczhNe(L$-O|DAi#nr~Y+rcJHPq;|WzM1a8R`!1W z=F)KbOZkeMB=271*%JvHgBmN?nDY*Q`Ocl{%A(LNs=K>BDzedZ$v}PYMGd~`W1dD& zZo-x%S|L5GCF&*8@ftU?#snhhH^|_oT^2=2JMPmuRb>@mQ8XU%AcZ`1`UkMiWb$Nn_=6Dm!NT%Wx{^1;MY~GXb!9N#Dw9O0iTjTlj2;Fy;tB#e0P)f?d{#w&)AUjOaa6m z)38$|NE==4Js+)$@DnJFJRjYUrf0KPwdeOh!-xc*ZPTUbuhZdlk*OOzVj5~;=C3oR zi?@h-M=2qiK&hERpcd*$X@g{c&ImLPz6s(h}1@|I~ow8nO_&v>ulMR-N{17MEWn9h&o^i=b z+OHNVQnG|W&+XlPWSv8>>5!p@SG1bCsYWDUhA58UMEQ(L?}=3UVO3R?ggPp^0_9{% z!icQ=71hhwx;@EDFNI*7wChk$nTpp6AX&GqCE?!Icr5IerJIuci`Me$e;dwv(XkGZp8md&E-4%_d*=hIaU#IgsIrPF> zg(p>);q_8EZgXP|>%JOWlNR_ywEw=i%M~%;s$IHq zskF7=gh?s`leBH`7O6{QK7Jb@ekjkf(ibUpJ2-{V-+Ip#x@*e@)%rx^W=1baZ*QTA zNT5$G(-hu#+MTD_GguIf*asVR)i7EwvSTx%p|<9Vu*ZH?wn;F7$mxR@?yy{SI03~s zfgrU~=_I;BR2A&?@*LU5RX3V1S*Ax4{D)0P`6u=%Httt}wCT&5* z=Y%!MOVjVXU27F||Ev_?$9Uc|?83s-_xvxioc}mr{Plsg7n9<5H<`NB%;Z8m^}(x2 zP_`ak3spJ)TNIUp3x(+twk>XJi$q429{+;=D4ztqHVcFFOZ!6R6=KfqCHrBP^;1$J zV|iTh_IP4#nXrwPXe_jaOX?TS3gJ9#8nl~41Q$^L&M8~J@|~91TbRaHgJKO$w3$Z^ z;|8zoGNPDY6roN+PHV~)H@2xOgak=mn4AN@Nr!Uj=uz1nreBo`s*MM}TD^Y$ri@yP zZPEa!8*9JtXVAi)>x_Y8LU0~w(}~$N}W*@r3bvvQU;gViQ7xj zr;jRWm$B;x`MEC`z&hk%sDe08z&9&5fFD!yT92yb1@9+fpORd@M)*DBk%2_|Mo&iO zYR>47s=oT#koT;e!=jdT1Ie6K}NtEuFkjnCj_^ zq%_k4uP)=2_qz}iFrg|bCj5u_+dQH_)M+5zFO<_&K@q!Dso~y&NlR$godSrvpuUli zoXEjTRv0R+KfHjK^DP+=u#qlUdYbOd2mf}c9-3KZ7o3vxUrBr%Gf z0{GEl<$Pr1SdIcH=@#D01FF$^1hyYR^Pn;ON+_P)P6pv- zqy>bcwO%7&ggzjvSi|nD4;;-%A~lAZ`QkASy?Ab$U_)*$UI09G#8XhRoe^eN&zK51 z5D!5s2aA%7`

Y<1hgc4Pps<0|ChK98?6=#dLoS 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

Fn!fI!#|u_++pmIbnH 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 C%--z) literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/tnef/christmas/Untitled Attachment.1 b/UnitTests/TestData/tnef/christmas/Untitled Attachment.1 new file mode 100644 index 0000000000000000000000000000000000000000..d11e50b345383fb354c423ede383d7abac1de7a6 GIT binary patch literal 6524 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 z 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

E-i-Y5`z_3E35 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

q~w&b5lWy283;Pcn>ZK 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 z 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

E-i-Y5`z_3E35 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

q~w&b5lWy283;Pcn>ZK zM?)hBIu)|Ftxe){*owU16hMufec&6D-)YAw^@c(e2&2LFeBoe{pyjQTJQ2v?g;GaM zb-Nc|tbIhZy!v>4{ykwoBVcUs6a#R5R^?>S+Jhnb001iSfg$Ypk0>u(zl?Qu2{`rZ z;{wD+xOIWi0PlHJ66g9E1ohN^-x$%Acf$t42Hq}ChJ%ZVDOBS$BDn)$l!IY^!xGD0 zZ=3;N;|sFz{U){y9&m;$(^IqsVN}*x#3=~7kM}U*D5!uQ5~i#dZWdr3H*ZoR;s}IA zX63_D<=46gUW`(M6iPl(1EO6R=j2sZp32;WHX1RRh)fS9-Z|2bF_Ys8{QBdLuH^Y2 zu*B!O{wDtbcQ%CSq2PJq&^(qK#H@RH3ESUqydjF8IW&JbN*Lexh0n)8?-xgJEbYKQ zA>sb;$e?)bd2&=5oVbkuF>LXMV46OW=;i+ac;?=v%Hxkfh`mH7#oI}iJ~YY@baCq# z-F=v$GfA{K!&RcU`#-!vy?zQkKN)HdfU(McOXr;D56C@e{XSHAVhqA)4wh)Qj(#!m zsdbJsyZg(J)=d+7o^V2F?qK;NdAKT-I3^nw#%w1kaVVXMfm0_dSj;cbVhU!E>3(q1 z0mEBz4EnVGvzyKql(=-o$@gTa-Y#k) zJ!HPT<9W@DUvoKJmwo47=Rf(6Ip>L-$N9~0^@5#qls~o-Qa&mbV*2MFq39|EsbvyW z>m}C|bF0<|W1^kqV%H>~iU!+VVI7dkAoHjBGML@L2>C(h>lIT1wxIQT=jV(N!U}H> zXCtGlmbM$Dz5Nw#RUWGZTUITta_#;n;8&+dAodIu&V1fTj}8E=MRC4<52_j zsC&a?O(6@(Q2U4YfJGpo(uEDr;cUa0)uNn)nu&T-#sWb$yln<}*Ez|ZDcb1$;;=@5 z-p;>xMKagYZ~Ae?fD&>!KNkwp4mgh|?Dsw51EJ)cyBqg^ICmtn!fO0v`$eSm581hU zhn(E>#nzjDS*9Dwa1a;t;&v1qB`5s;vELDs&qwd^iuDk5MveMU-ZC~Mm0drPj!Qh> zFF#o=W=NYtpL`esfzdsZ{Zj}SxUv&VzktPPTmYL!o;W8n=ORExHVh6Xi>bjikwoCF zu)$F#o&&6xnv`0oj6?*bYh7CCB+>#3fD*9P9ugzzbfE%hFLCjRFEX&&w`yvj7nb;s zFhaq|p|#yFmxEOTE;~R=zT3ldW>-Nr=8UIr&yr;c-Hc2zUYgzP;l~8g0$EV1U^1 z+xoy`0LMT$zf#~!bnW%WpBSwU50M+GvgmGE0~H``+TXF!l>?9%7nCIXU#x5itsLM% zOdR;lSIK%$206%baU2GKSA&b30bK>ZcoY+UaRw)&>@WSkGkfA*J6=<7rO5Fgn1O5dc&M&|Mt0v^1Gr8hzvZiy6j1#5;GIs@9$+6o>|^ z)+V7`Jbhp&+lkQl$^f<-y7|HL88*?08uc8G6$CmCQ;c=HvCnwyFUQVUP8?;t?U3Q@Zk}!@s;9?SxNY2KnDuJ3&o*umXg9`XD_sn?vJm=J~UgDw2$RMuVraE83+51WkFMnV(+01op{ zThEM6$6e&MZ`Mr*elhjM%}l=Xj8J(qNBhMCoC00scsG&XtSlFdb(8asw~G!f$C>w* zMwxy+V;>ljXVxR1{LNwZ&z*Y6YD`a@A*^}UeQy>U#6*hl0XZPFmAPZZBg= zFkJ4XFkbI2l%koaMXvmEf@v&85x9~fN8^Ab>?rJ*K8~~@!ll?nqXbl7D)1_oVY8p= z7;>&!)qHKf@%RU6);Vg)qk*@KsZg}8Y=L)s!Fy8|RH%ALGSS0R%g#)Vu00WmL;)=M zLxvJCX}xTEuN^$*)|Y6j*bO=)@y-{axUzU7uSUoT8}ytuf}UO2t!-v__$m!BRyMx7x9i1q-)%o( zzl(q+MW z0VD|TL85gIux)tl%VNdhz;Ej$h)zMiRr(?00RWZSdH(RYrl9xLWx{!7lyU5aLtg^-2VVa?-5-coxThsLLCqj$OpGN1`~yM znj_Q29D`m(DWv(KxBxRjWC-{m!2%W3ck9A*c8bv`L@aQYMjQ^hBzsp)RL(cb{G+0n zkIqNmu;d-}XTeS!kGz9Q{{FMD%RwIvc6?<*Zs7y7)c*ij?yyKVfjkCq)5=_DTA!X+ zZyW~9>~!?JL%gu};zK0)p#7zko z*fi#->^*wQ<5FGoPxXXQAago?$#7Xxn`m)=35bAhhxL&LheV~=k897f8w_j)mrVD@ zF~Z#eRbS3K^Mi@uI&=I*#9U0(o0J6|CK~YBLXv=OX?uL2`ZQ?B{{TxH3Vyd7y{$3Y zUGXssK>0+?m0Kh)-X;u=057!jl`W18`?0*DaEScO_ph!tkt!sgGkwiz#jue>1< z1%^Jl#n%MKzdkS#OLeUJ%InTtKlsW$XU7?Jhb4K`&QGrMPevPuj9q;7j}MbBv3TBV zd&P}mx6jU3be=I|km3^_eP>vlORu~e#JcMZXP)u*`u_mHynb94@qxDhZ$B;~9&xSy zfAY@vJmurwKNB411|*8ml2L3;Wz8E%?dT>x?(*pB=SPQy@_pr=cN`7uZE?mth&LV} zWbBSdMa3Gll988hHv^S8{}Tyf5$b zh>2a3(~y6R6UrW^h5Tfwq z+rs+6bAv-w*k3|mO2+6N(G%|nR|Ci@B=S4^$EgD#ZKxCQIHjW#;|qY{hi$b#8-20g zi~)GxUpvWNS3|dE{@>O~9*}k={(gYNIRginpMT}P3;{WK0D!;D=fRMgXghQVfvt20 zoZAVTNSir9bXWK&oEmMBD=ucx>rt-9HlB>CfuZR_xHyg#aH8l^s*<6>r~*3+dvP=+ zhf808012ZseD6B)ocLm?t3i6<9e!}kC>RyWlD)~`4PZ9f(!a?A^@ju!@rodioRtg6 z9KY5?7XdYe5L3S>_lk&wS_@s;Ko4eX2I4}tL>@#b-&s}S7QUEz9e~Wk6 zkm#-oo#UKjornp*Z&}AV6x1BMTAtG4VfQqKwC9Fyq=v?wzVPu;8iyME3b((ERGJAc zoc{o>adPL7LB~V;&AvpzkQWutLb@!b`XomuAV4$#_zo{CO~7%#SfshP{4!5!boGv` zyFt&v-YXN9?f39v@x8y>G;LX_nw%b550|Wu0K_y-T54pJ?t}B>_}&Z+(24M~8bxn_ zft-ua(-KZ&sm{B^7_rMmmthYtUK~&w`$Z!3QBK;f1J+p8KGv~kEu&WZImG+Y311~K z_*uVJ{*E;DRW8<#@%YNh2ym|-7y)C0sC9n#gxRHfdI1_ZS?@S*Z?QCWuMlrJwz^%p zu&~w3m7!Ljl(_=06sfkw*h^5yXj4EOVoQJm3#!3&SxF4LI#lnTpOtWd4w1#Mc46Ox zQ{F=0B?!>vM@I~pg{R=t0tgWsqj#DlW@Sz^e|V~^FSi^y z`oU`H!i%Qj)BNRid||@Ozdu-Ojp75Do%5Gm^@(>dMdvG6{xNmF%v@f7tWw+i#k%V{ za9y4H%FMU(#(2e@;nsC{!F>GZFO1RWU-=Dwv4b?^&8a@HF6OY4T-ewgh9FL;T=_`?WZl})+%h-=%D zc!Ni0Q~5vnn?^8?GyYkD2I9xI?)yr|>ndL_{69Eufm>d7pU>sTfrW9kfPIwq=7KwR zfxpI?h%(0y4kOi{haGeXJ9ks9LmD`28`)Rw<2|!&ZtcIh^?bQsR@WOx^QOYEJ zi}d)yNJ50yNd7DF=O9oi<|p}A;}jPfD4osEi}vI&s(TFw-GeZ4BV}0XH;b>0V6$y} z%{RYYzIpE(KoT|`Z8``}?)b!ZS7IHl^l)ASjMixAN{~1mg9*`iFif3SJS%?A-gA3H zCZ~n6@D>L_mxDM5`Ul=bg7gz#7zY}hxO|&2qmW{-ByB?O6Zl7Ivdkom z3#%4I4(G>?Ol&Fhzj`C$5cP5^fPjlJfEBCd%3+m=1loFbWkOr!0>2?z!jZ6%Z$YFe zdPL=h>cnWIk3=*V9b);68P!*GURQHMGOXKRVEGHECPt^vj_oB*8|}1HW$b}zGp}1z$zU9o6O(uBVj#Dgr%XlfcG*X?H0BV zWzb`f>XSUGeRYXw#qX9i5eTId-Va1$o%8%=&a;F=UqvcLM~4C5(=hN5+!=cqoH$1G zC1ajWG}3w9$EpwlFToSlr>so|%G7cwbskOPhZ3SA+`q_U#u6H|k$#>}j4pVrJ~omF z1=k8=i#0-5(KKF+BvMutP*qJ;tB9?0oG-2V zA%lQB2OPqPh4773%UM%)i2y?bvBAzYeL2!9SJ?{fP!M_oLMU^ZU>;Y&KZUX%O$_?< z#XMG&p42Y;>8BaU=SZiZrTnXe1YyP29&v1_ZryzABN~KlQ_sC%QCHo>K~EgxYP9>n zO_Q0Bi0L@E_ssE^Ro^$(4BB)!iQ2oumr!3S2bN3X;|dSJ*7!YRy#or}Hot+&{6KQZ z0CMR1nQ_Yw#VNB~z2cx{6HqFHReU?elKNiXm9Os~v6hPJcAWd?EC=TBL&czVH| zWr?i2&mZ0@&HZ`8e;Lm|zx+YR)_cSM03H7Td3A=4GrXVknljTa=kFZbPQG)$?<1^r z$3C%su*E|beC53Jh&|`C7gMa25oa&U{Z$HN37Q&DtPp*Nh@c)kkjB{M?{Qts{0Qa2Q8N0uhe`{W(g43~u<_$>_h{ z3dIRz^HaN>A2Q=ujEMOK3U~_S!3gwz0ifuMxCI>?SE&97umM3TuLce$Cv0DKE6%?C$8h_kvYen#BkLWJ2m1*}N z*xJnu2)jH9Bp0R`# z2`J?LUz|~27*H%dE4Raz2P1t$N8kSdE-pwA@HMS`t>cNj*kRZkjsX4O4UXEoxBIwe zsE0Lue?4F!8y-(Vc+>{3>nIU{AU%L@n16-AWs8{8<<w^JMH&TI ztRDuBo71nS6{5hqG+HGDk-LZI5Kb#Wd2u;0vUc>2ldpNw@hkJer+!c0rm$ueEZFca-?xW+gWxz#H{{NH+CO2(%eUVk>4KH?czXJCfLc*X z5(8+Kk@c6cm;tw^OVg3v5h+WQpakcD#)&nAu7nsXZJa-a61-4=b8Vr{IXQ?9*;H5W zj39?aNaS>R+-u%)4;Flblz>f|D{<*b!cjJ_L$yg;G3k;?Y(juuK>~#$1nnY_^s7NQ z0M)vfNIa0BJC2CghUHqp8(x-$n6n)0NaiM)k=@0@2KA~=Fn&@qfOSo%Lz$acs9iK7 z2j}y_^_NTTm&T8*GP~9x&Er0W%kBHY_LQ%^{AS4BCZE6o`^1Ff6<5zZ;sR@GA8v4J zq_#xby180L`L(Uk(7SXkMaf^jHH=*@~!=9}$YxUl^j-UhvVCK()wxo1XES5)W<) zS0`?(llu`pOmZRF1b;9LQs8F@7whe6jPh2ePk{4UI;=XO|*P zUYnQ#l~=*11k}7-a=BX^N2(x4-Vy*pv1tjhJJB)opAvQQI zN_)i;Kqc)Fd3no0z&Em4#-xa9ChOGVCn+(rb0Mq;7i zET(wY#q%b@j-x1+Ymq2c(^G9^E?Tt$xU00YVgj6|5HJid9>59!=qy}1hzJm#3Efk+ zz}b`2rrBFlqARDSB+WN%N?tg=3CqpIIKxKxQ4chTZzf>o`z+YH<{R>1wJAgxEDh=s zzDxr0Hc*Ny*A98)9H)DHZ}Bs1lU8Fwcec+)2_}Pg4JWj}iHOok(y4cU74siBgJ~g% zZQ-(SOvNTf0geFpBjXx4)CVi~hwNt&UhvV+w!QJ1_~}V^%h*Sc&S;_pc8j6)t$bqA zg9TJXO7}0}jZdLno&2`GrxPYXT1e~zxwG+;*hb0nOZm6E)G_hpP1yzG)8=dE9^*px zHD&$#$p8jy{1@)M7@B1y2K#K#9#760L}02Oj~vU(+lon~DlIl}&m3PlSt6lUJLvQr ze7H!VG-w`G{#yKD?Ee5lu-G{0b^ic(2c_}-4PgA>Vv<1@BVBbeIh8c`fbGEPPQgL^ z^@V)td2wiq5-T=+s&}7k7&_b~PzRld zVaX!)%X;@&cdFnDEoo>Q=Ta%XfeevSg`64acsPknca_Cd%2c_9w;=MAHPw&B86 zBKpm!(l!V*ZVyVkS0m6#T9F)_9QeYcK`sPafg@-;Ez2=mA`OcNWRVA)RvBAUnV#eW zqM5mxWczLEFEYGFSNE7ZKvr#_?9)KD<8eeN2t=Z6MhvKw4O$(mvXED3);!p;h)u#Y zb**$6W=`QJlq4TNw+E=_&8P;y62Cy&801xj8(q}e2s>ON_d!|URrm}Zm4it&=O3mC z>TlnV;lrXj;3ZHHqOuLF%|<%$9^hZTbQs?zz)Mu49N0nx>=kTU2uZ2zVC6!|frsre zuA05iYtqkRF8J6Q-J{+Z)Z9GlQ2T-AU=Rwi-<#a`9F+`Gz(SUijca{Tx=QvPn0Dkt znGK*=^Pv(|T1q-Y6{G7ga?QMs%N=Y8m};hnN9IJ{?i30F0(A)R{p*}mvVm761IW?O zSRYs*r!yl(Vmlo&@sSixz;3;?NFw5NtcXg7<+Bhz(M>1Vif@$bHyZ@vyEI9;wb6rb zAYUvMG(b-AAw_1Mr)BF#_0}IL^W<8|w@N$IBK;1(byod5xSCl;c{a#^-q6AZAON|l z0{&UW4H)dGA+};E9gSvo2M(_pHb=UXou%|!uJf4a?%dL!-#Cf8>ol;M%iYpxit7-8 zAVd|k;_PgR1~VW;Z@e0F^@6Y>AXCT@_(_Kug)0bJH0ao{0%DQPy{k)f?WG498>2Z` z=tM5r@5cedgf=2-c5*zNk=V^r_Hl(7FZS&Vy-nFh42#0~H+_SMwkSc2ykwbYUnxv-!lprju zFmvjFB`U3GrD`n~H!Zn~5E`6wr1aukJ4tBvP)F&(<@?SXfb2QIBgAF zVSISSznoi(9y#w9xtzMinW22^HVj-9IT%e{vr(oBo`o-Y3bN>L$ zFV>M4j#M|U{W-U;D1dSH5?ih_acK!@0(L%Hjy*M`h-nZ}0=ErdvNA<&FGmMU6$V5R z11&0=a1m}*+W@M85{V7T4WT4kLqR0#mXX*Jg7pYvNVVO*z}dUZZwEQPS^)25@6R|o zGANxIJV&47ALs_^#Z*Vd`rlYdI7QXmohRd1Y7C~uDX8`v#8GjQZCLzledov=8be<7 zuOCZ`u7$VrhXjhM4-3tE!Xb@J zXWH@S5EVymy6}G+$gRDqPnKHvK5>MFqSxr`RHI=S@1n zDQapEt_q%IHJ0RV)A`j(7gLsI+K$#xk9$wM>lB|Ghq$yv&?2M{BokRhz{U@yi!ioL zL)`N+9y^Z>l&H!p$wx^V_a6p3QS%Ol*W|gyn}`+&$lylsS%jWefu=X&ImPJg ziP&!qg;KQua7xm#_;W_jv#h5GOcu3{%k8XTaJg&_5+$;4lia{A;O0ir68iP;3G360 zhQ^*`%>?=|@@gx-r?uk)&e-nM;34k!iRNrz>?z+WIDcML>}crJcw8 z;_*`Yf$atAJ>VmTnkc&`9gVZi!r`pw2^f$*u!~CqaBUypGn|Sl8;Uu069Z}5AT}H~ zd`ymZ!&M*b$&&>ytK^>dHJJIf!Qbjj9MZk8D_CzyiAZRfWXqh@*Z&EuC z5ph-k3z*&fzgfd!E+G$_W8S;KO1@Y8qi&Z5jiWa7Dh>GphCZZ>AZV0%NM1aPihW<=Nve zP7BZRoc-r`B=d`}*0KIm8hM68);sV202ud+dDbrXW(sQ-?>;;6oVS|}4Li-b6Y+>n zT$?jyV))Bf#LW+v9l6V`=G^Y!p%_XUrgRvouTHD2qR(a&0iZi3CtkB0u1ZtOGkh;* z7c>vIQ9|@zmp9QpCPQ@@@1k-tBdiN1MM%+V0=!P((hW=EKu#cOPRZacz)X;G@k2r& z0oB`Cq!S}xa{*$sq1xa{z%m1{LJATCy*Sk-_KehSuE{sa&l-7*0MAHD`lq8FrxOiY zN_u}6IFeGR>3oR&erRBC1tJT+geW>^rwLtXkb}w0rzfvCa7LrzNZQQ^@1BcwKFoeMs8 z#2_%M> zf;VY+3ibs!#a82S<m7{_rajZR=exdw|R_!Ckm1OSfRj7PQjFr*@nn-E82qroZ$ zCj-%y3pHo~9k_0$Y<1)?b$0OK<$@@t#RU^ysFtsR^@aSD@5yc9@4h zRw|OH<6+kaA>j%&YiV5%RXbp|e1d_6JPFQgMA8cM4nVh#cI?HP(SlNHApQt(z7K9o zD@o&?#{R!J?s8?5MvQ-0>3Zfi`m8Yn1g0T4vh(Va&oxH zC_=f~_Wg_R4i%ZAKl%OTXeCKkegie$NG@Vj6L5WNBMF%F$c74T0!Nn_1;HJB#?Rgo z4bMyPRc^>{23-c%)9}MyhdkT^0ag;-6k9KYT<2bLUcWkE4e(&$&;wTNyxc3xuiEV? zzEHQ984UnaeHOSkEc1|PK|At+M`K1}$pTrDqCkwiuL9)u2}J0w&^o5l+0aW+gv3DW zEL^WAbBMs^Ph!yBeX%GTvP0b=b>=?tqj|MF~h-lVn(+?ttq0W@_nPUMYJD{`X`0oKig1;OmqG_h? zAV(-EZ>SCmey%jRZXBvoeYWwGfh>`FJ2-Zi%IgBw9rC7y+BxH$aexr2ObVq7uj3m+ zNFR6;8)Cr~&-|Z$aoaf8%>F;Dl+p^x5gaU!yIW1G&dl~Bhh#BN z1#eYq!tLOWDqX4ukuI9^-YPRJ54_DCGh)5C}23xA=h0;ue4RSQ*aMcO1!buMJ zhz-IosEV094LBR2cz%Q%X=Ebu0Khr{s^!?K4ltMLL^O6$)2_*cp&-!M0en*Uue?U! zeLA)5#+@@3qV~!IrQ1;Tk^-f%J;M6L=!Pv11h|^9XOJ6=*udGACzVc@7Ecd)t(^Op&)!K6+=TJ05zo-Yt{hIWjAh9G09n@=S>rmtdEh=KJj3yo(aVPJN_R4* zJR14UR}>6eGuJqq+v^mkqpZ=}n`Lf47uE+e5k?|Dl9+7^xq-o@J!^h*mc-ZMD_+(? z*M+;m%3hD0voUPvXc+MyMgjm6L9D!?PKf^iIm&-0Kxqw;=ES<$%U-qKUO6Rg zok|qajA`7eVIx`NDunB)T=C?8kJ# z!dBwXfgcaU43^1+xd6kcuKoo}uxZ^YT`>9b{agB9(g`8PE5q= zHkcec^_!x_4wy!k6evB-;fH<`xP_|m?BN^>7w|#YH$2Mom0b2hSOnpYpKpw3S4nc7 zpZj@U^(qZ5JZXFHH6dyQZ07@@&n7Tl;jrPWxBmc`OH~B(bdO8FOO8q4N<1AcIV0~h zbEqZFicN!TL8MWH;msZv!Lb^#Wq(=e5lZ+)@K~XUGo(OqqH3CW2AnYP&TJTwTJ=p# z*jE%p02pCWv=&*hgi3{gZ}_r+rBYG#p52Okvs&7k*|P81@nbYd%&IKePi~;nD~Bi zym2sx963%g7|nXb%p*g|X?}X=1Vpfr1VA@x#V|0dzI$WAhtGJVh$n)7c*dHWB47K? z3$eO3^}-xq_lB)HP~VXgTu+>!2Ll6psBlfbGD|KlM}Yw>yY~@$k4%6$)v@9+BWDYmMJzfqFf}Jn9?{vNAgr z-_oB>PZIYz0J`N>cUOssvWI5b2O^RRVIJ$&T32y#`-rxwLsT2qmDoTW)M4%6X?C#H;RZnUI7(x%HZx6@gE}Lh*RCN-uSOtMkXQUHy zyECLotE`OSu-kWnyISXR2`9)nn}t-VCxDHhd^-~acc=qIVe5w&81H1e zO~n=#qT^2VYXnRZI*!F67Dkg;Qepu{i8+<`f=dxLOL1aWI7ZF4ML2luw0KGn6qug4 z&}G<+0(o}0gL;O6Zop5UUU2g`*Q_AzX83a4jc4eCYE)}rdIqsKLwV~_Ccz6VFyt+2 zP-v_hvs##n_Gy3EC#9#x6GQQjZ?8Y`{f9&nHpoEcc66S9Zsd*gqmW#z(q?9tJ;@#zk;P=nOvt5>6dYCu}Z;&MVFZ ziUzLm0H?_PU`$z3ef2dJLnF^HMEI!IE`<*fIxv09U{o^zG?!u4DH4EBK7pN(;5!LR zctjfxpyg0Q5{VQF(ue`ij9MBFSw_~^&Mvz;9?hUE>rXcdCo5BK(WOm{^y9!w(^2k| z`uM}U2$kbNC7YsnH@s&m5@_LK)xCM)!Qc?_A*tkP)<|j+O>~1J!Zq`WTic-q$`HP( z-VaAIw~eUwsgM#gatAu329IRc1xRh71yodos-TGWf;y)Q9v=xfz<9O?r=-I`P#b(J zYI+-s(7miKgwngw#`9mF<&02nbe|UrD7?6u;i}4=9A=5UX-T)=v$LJyAZ6wd)Amd^ zJ_`ik0cXGX+$9tt*&$lc*$8t;jWrVNci8lVax{^kC^?k~Fg9!xT4)S7iBUl$rocjy;##U+KX=Eh;UN{49ZxOmtt zdm~PEs9yJ#i^0=$4ewz}?8a1qOaQ}#)T_EW%>yu+;sK)TnS&c)OrgWC5Q~=ZqG!dgnNEkL}AZul(NW-+9UF#w2a} z$42tWCV9^v_`QEw`p0SBbWSs$jN@){>(+8QFxiJbPHqu=Yn+d+aq;Ij;F;Oh5_OD! z^9O!^yxHd+;?D8kcQ1@VBpa>5@X2gT8s-CbuhiZqoc+Hs`Bsxtc^kZ8` zM6bvxfVNc-E7p!xdW5-$1!Nm~S0$a$FtBGMq*he$dWW}7CG2m?E- zcGa7~XGy6d1=f>%xR|_X;8UbX*8vRU*XNt0l6H|zF2w01VGxA?(|y6*45^9@LI%QU zBAi?sUlo9*2mtJguNY%U>%S#7U%uQsDg)xx=aJub<56tWT?W(;bJliwG~&6lR0JK# zfk;nY5m_424)xwa1rQLa92M7v9E4V|vvL=K>27E_Q)75g7JaH@sdw*LTlux%~F z$-f2)96$uo+IZnI(1uh+c{}^SM16B-$n?+o$W=%f((kH#U{OSu(-Tp8S&8H?i-ye& z_@1&@0SNC{sG1HSX_7hoVW2wOO4LPzyZgt)q7(uNH0<9e=PIC@XgL7=d&zRz0tDee ze42Bg9+EvM?R;HQnC)m5EyQRAbaU8(O_X*qqyT6R455bSOH9BTpsLcaa#`)_^pI37 zo0lqovywxUE$zNHyor8N1A99)+AdrVBESmn2i-f%(JEF_=_pW8RhS{p0Ad>la6v!< zm;!S$?EwKCY_ieK69MSsfX>ie2HXkq-Q75C1g>}t=?_4sk%6_Gi_OIW1ICD*e?Ta% z6Buy}G)2@c9YAGH~+GX1SjC4wnCkCiekKzL^B@N)#BU@02TUJnSr6RO}HF3SQ0kzFhtjvb|V5p3X| zhC58=AWRrL5i})ky_7Nr#jtGB@uGcU(i4nTQeO2WoAZGC#hdk7Jqm%7hNgf^S&(k} z^2~|FM(u!_3P6I4?-i)MrC)qF@q%J;gI)LIEXzkai-9rLE&l)*LcgqQVHXc3+;lzW z)?)l+c)|QHOoiTc@0w z`2PUK-0Ks|lK1tFz6|hXn7g>|{{XlSy@Y7nRVs z_(K#aTGJXC0m5O9AB8&bId9Te z6gk`YK<@MTdwm+zR;?Y@@2f_MP>+3sZy8s>m z{J8fSpnZ4!86)t6op-sf<&9L5AFjPVS%g)HAlI8k_0CqI9yvcMKdfju;M>3XylIqD zFS<}|L{B>1!6DhP`YO-5dCD^EhHa|6_9wFjq6sXxgccRl=-iU7hTukk0qtptiSiPr zDhPlm1p;l|&~+HTgB;^7LawS%DHmx#*_W7yj!+Y83SVa?;06P*adree9I#6>Es>x> zurZ>hl%UjB$N+z46a`68SChjwJ2wt9-`iy9B5GG628X)Opw3_ORk_oo~cs&8N zr#mrw5tJP~ya*aS@rd=cM#Lxzp|j`4R0)IEji4fma*{NN9Rg?A9yXsjur>lEl)Dyz zh?nOr4rly0Ffl+Bo|kK*quY*}NSBZD@&5og%!7E^0rZ&_N({{Y=%ShZTNYRv-C;Jg_M4*1QFz~i*peHo@n+TZ#A0NkLr z&KLx~MlT?~SZq!8o4rGR10lpfka*w>PN?pz6DpDl-Fb~i9FN(ALO{@XLdH8l1%0{v zR3=b??+dvu#d!`>*uX}L^Sx2kH)Y*>a9xhipDzOGo4eiv8SQv(&b|OAQzr{bL-6c> zUm3cs?0Ypt!In^}l>seX^`>(+VI#32twt9E{ugD(LbL!Hn!s_}{{THTgS8H^Tum-x zjGcsqO57i-NW=tbX$S_lj*BpGla)Ms95}?)mJ^+%*Kr=O2wJ(4?wiAt!xH30Eb{56 zn>_CiNVkBh3JG`Y6^i7w{{YxO?cnW{CG-ORv0T(3F#E>1`cNmVhqa?_-b5q&!ZdVg z6HdXsc*kn=(kZBG@%5E7i5TPpgnK=6apxRH6qU&0qXAh&oz7r%WwrW(4j0Qj zH1=Vc=m9N~hMt{!GRTc$D@C$aaLByi>PiZ}DjT{bxIy)xf%3^;k@J%Q!hl{Nr^;jT z@}>0$K=Yv9ure18mLsn!&%`y0kyiIJ9qk07JmDyT*by3k*4}lH3xehX2=Dmo9A@pG zdz0M{c)lmJ$)Q0$2i_jbZ|H!t(o7+68w}U2eld@u4a9v+bdEl`#*N^5W!ZC_x}7}W zwchhV8;mBPhVK^&RfqJyNW1|Om@z)?DvMZgFdp;qW6@$?*Ibl z4bhU~Z~f*Isk$ec(gZalSp{1RCXC;~sK-Ul_d~ ztms63W;B7l?zrmfr#(Ly4LuOUioeHd~$2&s#E{ zA_?+Cv&q&sG_4ipw~zDVIu0D&#YuPEe0FCVVuE@RY5C_RJbm_Jf5F$TC zy&V*vR7m@}Y=^LXLU|rLK>Mxe3O#(Xyi!vb@#U5rM#)v>XmVltG(Wk)&vN<1N9e z3I+=EPTPF3`w*bCIk4$_lXFRa1mJc?gz$jAdUQptI#-;9NRra>c|2e=b7eMF(MKu_ zo#Q8PXg~0^lWMqlJ^pddBk1j{eE?(RH^#B8g!ghz$>SSBJ>#*-Ub)23fF{Gp`r-P@ z{buqP6y6zeX}a;}AUaCOZ`9(UI%0C?86K0@KaCvidMbA&o z&DfGjg1*dH`oJV{qU0wf=`~?;nzQWZZbZU>H_63wWPRYEQ5>JUpMB#D1%}OkkUp`H zc%oD5#ydQaqg_XwHSU{?W7a5-Lij^y$avQu)1>5R?->PK7@uLU<%yQ1K)z2uI*(>i zIi-;2o`+!MuOYimtWidcwPp=1CX(2-!HLEVkAUjH>Bkn^!1ugw)*nlKVTfu$RWDv z9*(=jYLwgue%nQJc;hNUsb_-QgxwMOz#m0vIypRzIyZ=FE((6seXE-%?br_u3;gGI ztcv@WysPDIrSv1rxNUW?mEfHo(ZP;vwVPY&{bjRSU&chAQxYoH(g&c&4>{Jb^2bf& z&A-+x4)>Y`G3J+fpfx+jrPgxw<0fnW06gRKlOOy|?8JN+fO*Mvh&=xBgPf4Xonpfd zHJbOFvB6)@d9&Vk{o{5y>j)j*ILA0ETw9L|&MQ6TJjXWW#^?SN`^S&O4nc?jh=el%hd&>BgZ;^AI}3279-mR`TXM{)GBGcS;xuT>2U~6?)D*^ zP>Lc32;v@Aj5QS}Q8vBf(I82|wI5P{_Xk9aE65KEhoyWAqKB!E7KYY^dFj?$YfBct zg~n${a=S!t#eL&9fz6Z$)+pY6Hre|Aa%qCr5aqx0WSDKR==!||=T*hnt5H z6rPLxOc6qIDj#5n;|!W#FmI_R;Go&y+FxvTYf|WRFK@o{flgZbp8WnY^W5kMm%w)CKkQvS9+{~+z2^S_ zN4_yrNL%6lnXZ5?yGQIX0ab_C z+8_CRU5}Ns-kiGgVxaJy;Sp4VCws?J-wvE$MBx$S6nHFv#NPHtd zId6kX7vbUjKC)uL&_6FCgPdPK`8day$DDm-rNv+Sc%h!XWc7w6aq;2zoU>8& zi+KFwh4{*Tvf2D+d%_L=ad*YfEt#gKEEfIa9CG-_NQcnHMfzX;z_#2&NBYgXUpM?_ znHR7V;mz1RqsQ-G4ib&!NcbCtl(&$G`c5(dp}OAlaR5MRh52ayUEBzo`P<0CWRAbtZB?Mg=d+xVElUvS5s3Gg2oU`nLD zjo+`KV*&f{wtOA<|cAz$P&VLyAsIWf| zmF9dOCQ_=k;&c?{ZPaTG1#b)@DSd9<^1FT=fIOkOvRXqUZjgXYf7;z~_Ahsxf%D0T ziKI3IVbmym;y}kDzpx*S(F2-@_=oD_Rf16lJzBqR9e;sa&_#an&@gyT`3Vhr&3r)@ z;GmzJ-WaIh_euRY9}0q!q-yvz7(8JFCQFxMS;aS5rf~%G;t!F_$u)^>B3uz@j)4PA z(vI|ysx4I$aJ(hExR$I_OWRr%Z%0pf*DZ((cI=!5Kmjq+#dj4)Yq@mr!HOwuk?W7+ z_m!pww_&h2qqmQoyg}%Mcn4a*e-qlBil~h`Z=4c%7E)<}@+*QonQnrGuyK>C?9)re zu3I^WEOc5Iel?PBxd@isU?$0M3FcqdgXPH>$({@rpjy4STU*L#sp=-*oF%SMI$SkD zg7B`NXW%fE)IM~T{7fKD7+!;4)-Vi?Wu7pIhS|ncY#wv*7hWK<#ldwW<@bdE^O%H_ zZ!b9ldFj02DxW!Th7DJTtZ1&gdBhAgrjPT16gQM-!=DrhKUf{YePUMw*Q~WG9g`YH-R0K7-9h|+~|8d8a!iC z&V>y*QhSv4;x5O89|;fD^_Pd?EAAPrXEhQ&UA%ncMGdpQOZc}ZtB@1H*G#!et{OOO zeAgIgs7e&+Bl|w^#^|{rl@;^JrRMJfab&7AA{2ASYT{|?F9N1;0)e%_M6T3mv#6ZX0>;}Q zhS{{Rl_;%KOjV_`7sMQjH`=!hU8(*woJofl+f94)(7&-5S)S*5*@}M$7|l*hgzdrCjIh^O+YxbWIKkh>Q1jzh1D-KG?;FXDSG?~oTwGs&S$cms zIvnBghz;W1e)EPr@mz16^N&37m!lT@F(*8F$s3-&@yDKS4;;Af66wVTv({@k2 z6Il*iIQQofy?MmEX1r&k@s9pJF{6x$itVqAUb-EzfD}Z0ZT|3uap(PiydE_>0mHxs z=&SdGP#tJ}jehVAS5g;VA~~{z>a)-f@qxH^mH4pz;4#+R@5c|`EDu45??6oLrHrfS zC)Vybb0v-FLA!a9VHf0{&t$XQ1IyE(feY+ApnY-8O#3wbA&YXQZ1IKTsnPX z(_-zQt#}L8@Ci6g3M8S?_-5+_SR~s|J91Fq4dN#cNdA50pb#ZV3A9>|jB44NXMDVF z=({J`p5Bn$dkk$!e*7sOg-pc-*C#n4Wr$h z2h;m;y?&13^35NgyxSDiUn2h7iv*rp1XhIMtgh{~;do%;SKDNr>YyZ->5 zOu8N)RnmNe@?lBEC{(iiFw`kWe=aVN^@^gWw;X6r3xN_c1mOPwIBGz7pIN+ zahB7m!G&u=ela^jae`+A@4OKMZW~489*a9;f5ze<)9jc4;y6S5&Hn&KmYKH@o6Isy z3k|F95|wuE1`6%&?;IlPx0^ojKRj8sIk^+@FbrEf?SQem=$`yxQmUYkUv5-(D3@RN zc&cKk^!%aFiMxrek|K{9={i0s%HW?MkJE!mrsCn^)>=Lu(-?sUbUn-q;XK0tMtZ+k z6%w?7xd-+#DmMxrl@GD-zzv`eUnTw=;8((L)$<|~oMw0rgnQtd?+{B#6}_(hu>dew zZ{Ri%5NqFf@EgGc>s)>^@pNer`cw6SxRwOJ1KZyRoEuH$ACSx?K5c>VUmi@|-v$F) zM)|i{tX^lgj49}zH3@_|3Zgt@2GNSLu#egdBu?u9 zh*_3V85s5!076iSHbZ2t4OWH*goFZT4zBCDDzwwa0^3m%7m6Sw5F^24h$b1}Vjm^W z+~0UN2C2mFCHX(|<3Cv8yxE0#)*8O^l*I=$=NkSq@WXBE5_i0ma?h-P`tga28I5ZZ z*Y6v3CR}^MH18K1!>@T}vf`oEZ_X|H$Kzb<78erw${ODqe(~_XAeeztJdP_$8QA>b zR6F&X5?4gS4i35$?#Kaa}bG+w}ml|>Iw&28cS z#zdWO^^{;Tz722|aP`qQny9`9f1ncY7|>!uk%00{Vt`eHTFfm70LFKXsmK^k&8S)? ztkiThutl#M@sHz$N-RgDSJQEbHEQ7%9t}_8;?@92;C6T`1~2Ab`FIs)c!ugee8Bay z@r>XExP8#|Q^F4epIbv1xm z9D&c_G1G>-HvOmL4MGX9hyM4AQQf1Hhn2w|rwHGa-@sw?V_#}Pe=GnaNpv1|2jc^t z2rXY6{{XDo*keFF?iiCL)}@T6KbHhzmJ9-q_!HJPNP#c3uJEeHmx1@U@r#w_QA}0X zNW4Dr8)#^26OD0>B`Tt-yRHF=KW!h`h8hQDSKEfh1SW62WTt~6{zfA{F$qqL5bk?Y zzObOlDz#-TbdydNaj@yG9(Ra(lb{EKvxhWXhL4=Ba221NG05G}8*@wmC+2^=c_HJR z;NZ$)oCa@ad}Ym#&Qs?3#O)L1E>asD%rBRSm}jDOfZFGi7*4y#R|yRa4vhzSqJ@3p zfTPv}muE@2jYY<;zjz3$6~Xa_5r-f@yd~5IB@n84YvpD#fHp3J!hGb72l>UN%Uae2 z4G#&o>N5RMhjEqFExBN?kmKX~LKyWN60F4Xy>L!q%&bU&RN+ z`NNi{QeT#@+4{g*aCNw+TY=Y94Mtji?@IfR#RFnAR7difV7C9}^xL8z#O|SMLD|G)a1GU!8iv zmq`MRAQC+FfZ}CGWfIevkA%tWzz=pKCEN6z;K5}X+QcsTp;G`N^{nA)0aY4T8^hqD zL0W{jX&VD(kMW8ofHp_~4Ff}hO2Y7TIoIzHpIrlp140$~yUrkrNPw>o^Nw;h$Q)fS z_VQ|t9By^!;OgPxUZ+%-YsKPTtqdOwq7yTp7Vo6&azxsnE-BM z4yUZyy7V-X-;dbKlM_Z}E%cSc$urd;b9DQfrT#a9DMhUa@lVF+3zO z-u&b3@q=*<El_k805dD7mpaouhw5$ z&82F5=OoeNdBj70MZqY$c_qR|2{;ev!)?=x{EqW&QTF*c8f01hC72)>{{ZqCtltZe zKz-#=O~I1g>%4qGpSkA}2p>G2icg=$Nnnz+@FE`p@tcQA3iE>JbYl>c1j2*!@tGHp+Tl~=UjvIVEjH%wd;fNjZV8bKeYP6)6UwA?Bf14 zk5i%nuXJOd z0i1c;0vTLRsR!dA!zJ*CchznusKO1Yq8!AACBesO1`8oUw#F zl&ucE-k&_vQ*BCQzu5AOnIa41v?(_U?0Xi09=MDH0oK8=*tiwngDIY zo1mIibY-*v6D;T8wfLDZKj6y5Qo!CvG$`}6`o+P4c0Ik|+8u*$SKcYT_cC+|4(eqVK?||B#CxB- zM5Y$ye0e=(K`wwppidjWj1bY&&GLiB+JdwGvzc*bnj zBL|(6^_w!{7{8P9WAj1TBk_Zy?#xEk9yh5>y0jyZpi*$y#AflEpIR2_UD{c)9{qU5<=$%r)W`?=P{byHrGHlb+&pBG43n_mEU`$3A5A4-3`ztPo0*V@Gc*{9^-%S9>}h)8O7J9x=`%r%J`Gx2pmDl{>@rslIR?;(%*F9?q zMv2=*bZ$KEo$2v9U}i9|?=1@o;IACx(J|GA zik_FJvA`IlAe!SeJe@Ht{hIjAS<|# zM0x|)-&r0^xE~3$_}*E>THw6bPpsV_^nIDTLBgFK<7`TH%8!j<5Hs44b!@AJSuha^ zXMRF95s=|@R!!NA?l1+*q9Jz10Q#r0p zag?1!32JGcv6U%FPLJRZkGvFw*^w#8Fh21x#|?h$)B~8^{&6XbTOxYaMrzPyJ!=H$ zrBJ^%bLjs7E_K!}w-?F&jI|SM_K*e=J(Rs6V#`&Too>D~2=OkE&37Z0%SVJs$sTP*1ltP}<14~G&q02QOK zc(;#O_@F@_4O#&0%?b#nh;Y!*x!CU}ZU}L5-otQ9W8kAkC1B=L5V~6@@%^M@y1%z+J1xEQyobgG5g=|2TZ)855zDS z?lw2P65!q>`Mm!C+s*-eWWIFU@0@;_7nAocP3bnWbXRX!`XQ+a=_dZp@RN47$H0@{ z1_L@u2!Dg?0Rc{xe#nkB5ygk^B5AizieLnX6NxgjO2*wMEcF+XPU+J^P1G5q~*#t=4pr)fa!{@NVJNB>JuTH z0c!3yOg7MyfMRuwbXUAmZkJQz5->a+PE=Asb@Po$C>VS^;eZ+NUc>Q=uKj7&u^2FD zm=9GjVlGb%EKh z=5!*6YZ7{ir!YXMuNc z>x@`V^0d8SzFKP=!0!oMW*#a!MIrUUA;u^Xn4zi>`k;>)u>*jXGvAk2$r_!uZARkT-&IaR-Iv!xgn$ zUPM=j>3G7aOVfnjA2}t1oe$el*e*6MbFDV|TRP#{fPRwr9ltI@F?HXy^NAVKjrEaR z1!4Y~lwh1m3D<7D86)0k;2wOg9K;%^s_0n{+u~vf^1cBN1^KY+Byxc)_qFTbJ~DWL z3uXHM0PZy79eDa%iKme_3+OQU9GErNVR#UO4s2Re@G9oC_z{PeiFwHW4j*{g&)!ei z)PF#KCVx1<&j_Dtl1=L57xGKWeHE~-@^AJ*psZHIlPw!05Js0ufmm^XfGbF;)f~V_ zvCbm4fP$u#d3D_63{iE}7RLd2Jnyb?2NHmhE`W$U`SYBWqrF2kUNrQ#b9!R+=YVWT zZL9h)NqZ1c>7KOxVRR`$AVAPcwuoOhH5Y(}cCGpp{W3`kR;fAuc;gWqRH_e+{Wa*o z#_@s|%3!5WXchI!{;*y~07>RU&&CTP9FOd<{AVf|fV~%NuPR`w&x-tO5QAN5-sX?m zeB!E?K)}9810mHs5cuyrGenQw90KpcAbCOO+>fjj@aaDw+3#*?K}<9BJRcV-f|G+j z1?Sl2;Y~KDhU3s3kUvam>25bp#0)+<&5+RKnYcORqT+^!W#^K6)P_8%W}+7STyqm0 zkNL(9mzYn+DiokogZvDV>fOdJ57!DUXMg;}15n7@(ShIV(ehrg847Pld1SKzs9cmc z{T4JqwK;#|3uRlwOqH8r0P^KQw`832&M9`y1a9#7tDLR*#Vc0~RWS#P>kuJh?+J2o zPp{_|ZN)+a<>15o&u0yNxeXEXg+aCAV*~+QxZn*tF#@ISHYM6-)Ea$$*Ms$c~> zN4&bZ#-gi|9USwFhg8}Y13~ zJ3CtN@r_fKJzz9ak(#9nxrvyi1=L`&!zypQyWflni&Lb|9&oR(oR8MVdQ2mF)BzRP4}?r6>~EN=?u9!(S$(^|NB;mZ*#@1E%kc|ONxMAX5rG`Dg$7Pm zB5YP6crySDqIL0ziF3?)?@#%_YC!N4>TBgLbGle8p6dSq7@s*ZQ}1W;7{ECvrP%NA zhrsiTI9}g`yWp&ct;ZKY;pi#D)h=j=yZ%==K9Y5^_OG7?RevB5If@1LZwaA7glE_B zaz&<8*61{^E;CM8K%mggJZAv3Q97PlVPMkS!a#&t zQW85D$X#<*p{}f<9uz3Oovus;WN>A)tse_qcFZzGzA5GqiQ`N;#1f94IwRl@zc}yV za(DwtYaQCx2!z_@4=8Knwq#qhfZrvfJv#M@4I^j){QU8ORxQ4dMe(nTjZuX0(`E1V zgv8pPh5&z9sQSEv!uR>a2LG_^_`)-2~AGx{jl+s5f86;PSfA= zhxoPjggN^&oCjr)e^|jY&(z(ce(+Q*CrRTFKus)u zI~a->`u_mtH=yo^!>jj(Fq6xH_q@25$PRB4ZR~(Tc|}CP0E~))ZK*q5!<&m>sv)TOa|n#<#Pi!m+panit1D zb5Re2-V1oWnAT|JVK$I)fi(sCa#H1_@Zj1uk661+SR_M z_pUL@?E`dyr~vWoa2-1vfF4w_bm-x`@Gk!V7-MqPhz;A(Pgy`=)fzuB6Xy|T z6df9P81#=0CkY_~^a!6gOC1oY;N%{#%dI`bygeSIeTbZ70Dl|N8dNBvk2r&~b)_(o zFS7zs@w@>_I}P z6a%0D0tWYqz2U7)MdJd0c!O+g!kIqI5Mj4DIG(a2zA>Q0oDr}f*ue@8IM1vbyy|BU zS+~Y{e>k&@JGg7_&Q$l8Sx6i@cz>K3KuGMEAecu06>uzNy%m2z6Y<_cB!wtbe8a;|u#X7o zHlfCq?e~y{kQA`kjfZ0G%{H!z>aa7ibmoQrPV&XZxmC?HR&W3S00K+tVfblNx~^HF zn*`GM#*GgEd|79_gIKH3_z17doU3`(^Jf15c!bh}H~G5w9F<)hYv}y3T^dM_09wBg zpFD@s=7IXHuYwswL!bx#_%MCo)lKw6_b|1D0ajfU-wiBz2N7?4hrf0H?o-wvQ$xk8 z{{U+($r4&@2-EkDDGe|=vIu@$lb8qy_L~0yCwL4l_`}+wJ=j&(oHMd%A$oryllC+v zPAv`#&J{6pV4Dz!s85{c3JM~XO~mi;FkB|kb`MgZdgT@N@(@`ZF zv1k|ofiXj*Xb2-IRpRV-p~Gli=_%V2oDX_ky{Nh4FXmHm0$IvniC;tF`uzv8xC*|*qu1!d; zv$nl3a`*`|A-osYbt1pHJ3muyOQdfa3u+fY|uR zQs<8!B)_}}6p5gJHy(s(Pl&w#05~eq9%rcIk(Zou}aUt(DC?x)M zbM=Knb-ja>vM7h5Id`BkZJNMU7h4CGuj4lKI{<*Bs`7?X#S@=EH_65-B8ohD#2PG% z%g@#%1Js&)I4>!*Z<~&Rr1buWv+pL?@NgZMnEr9&5KW*c1QW9FA$C##bPPPlD7(m^ zgAyywAJAho1O*DENI*J!>k49T7}eGWA9%`A4hRp+qaIT6%ialUahAR14Lx805p~WM zoj4+-7z?7LNU1N3*qqGKO&$8hN^p*Dij>C`qTTc9$F@Pw3(oqOp&Q;Lt~6&@EAU62 zoEZNAvnzmh;TIwTL8Tu!FjjIDfE|ofLJEA7B&rDkx8g29k8IMO&@65J;EJN18)2#H zVEqiTbT;z%Z++mLA()cW=Ovf31gpcJN!Mzjs?%8gf8;P$BLPUx@uwwN#4sKau;k(j zQr6@iOuv?q@zy~!_&|1R0nQU!#f^r{EF?%9sT2gFEi9BoStTq8yTcjSP$9y0C}exy zDceW4#`*a$nmdMHBAi*zNquCgt@&o2Y8yUrK+=^Ecuu$eadVs@d;#^7W2EFA5wc^q z)zj=fv&XZx5E zDSOb5zOnZ21t*tKc<+vK!_^M_EB5{5Zw4U8z>e_B8W2!@2{$88crKdW*+{?O^XDG5 zDeRTxGNTyK?>Uknh+AzdHto}Vd7ocjG^7lL{{4&pv= zx3{P1E~l+!Bj_0??@j`O9lmdjO^QvOIqMZdtB9fZ)@&%=mQ(8zg6p|P1%_|}AFGYh zCy*uhaxgg=f5CHm)0gDUMG~72iQWbE`w{8T$$oXPK1N&%WG^lftpIO8E3M-xNPdOb zzZnVT@ByBOEbUQYq>b6Q`Nh2t!-!&~usd_U)cN;`kwVZcAojlUH>StgMdWxfyvi^( z@lUbyl+kKwnR-t+6sK9x!#KF^xJMv2c!(36E%$>*^MRQ{ujb;@TE(^5h$zK>SRqh2 z#zYtU#9|S~6e%Z{0VcV7U*jcB6S=_S(C4wqrwZ%5m!C5cwg;Tz_W8sISL|dDyRjyL z<_Y)46KX)vMfgm5Ow!mU5TGE`8RM)3B5TS74*~!jE&=RVZ&4K05-_k#FU3$*5yM>b zo9&Cw4DAcXw~v?aqU6vgkVl$0MDox#I1gcPo8WHX-pO19!gA9~z#+QRtx>r(N~pVH zo+OVk%7hRCe%R{(QB3j(B~&}aEg?Wafwo#4%r7apo^0!*K(AQ>wqjRLbfSY=n60ss zXq!6NpAUE=RP?7{=rG7}{6>Lyv?m_T-~kFDV+@2(2Y3kM$-xt{qj=X{${|6>P~ijX zSj6exA&I#I{BfL3>S0On@SX1q9V-a!51gLd<<=W8Xom16@tSU3yY(_|_r|gFu*JOm zV$t=NmVDxi@BL-gQTXo^$8J2PR^FVJum1pXZ|NJ=f}&RLA4GYWpO=r*V2WY;i0^B z5Qv@;a7m`JJ6W^p@qLs*0`7I3YHT3Z z$5?||miK8zKb+jhb{pU;J9KQGpq8o%4g+cJ`Z)XWcN+P0aeg(5J1$dDd4sS`XnbWI ze8y@aCc4IEO|aI2HZ~KpTC*`oSYtK4TrU*_#mJ=A+q#H?`%wnK%FmTJwAT zVO|Xgj|_+AVA@9PAEQ37P#cS~em|^0(oFL@MDm~GJR*co#DB&)D7s(#GEwN+r|kaE z#sd-!gYz<8p}DB}!%)sxL-mYkHtC{y2w%yIc`1SSqv_W}mEx>Pz61xF_8j4*Af!XC zY-8&FOkiWUVf^p-{9v4##DVd%_{w3ac)mL4>#E?2g$ggsw!VI;f`GaY)$8Qed9Los z;W+r?7K>PdU-#?rh|;;Zp!4q$2%SID1MPAUlQ^kWaEr@K-($xjIIJ$)f)!8Tt0v@ zyTk&XNkAQE4^R#l zZY~V)r+7(}Yz?<3jv*{8-~#!_?oxtMc<~$75Bi?)z*X(q@r10DgGhN15%AzdfWcU_ zN=w{#n`81ZSS;n5C+87r?Mw`w(|_q?&?m^IWi{Z z-LBa?F503LG*((PPeYOE2doDl7y=o~V@#{lL4K_z7=kZ2gk{Q4Bp-&Jb7<&U$VMyZ zYo`n{4kHuu$XNQyo8NoIsq=%hFWvY&i+wMQQ7I)5qCPW2ApZdFPtyqZF%E-xfW$8F z3pK1j-VUy?1?K~gGdnuPIsS5Y+nvfuvl0-uFZ^Tw06Bg$LA-d=k28a;t}1>pQ`b2h zI?f;=)&g$_o6cC}6RbEUS~ww#y>a6OoZ+{4pI8JnfcVZi$KEG?@Eo74d?!Flyb&t- zeSZ*M8}AD+PeA4SvV}bDhnB@MRh(6ln$rE;_P}G}9gQKo<;9 zCp4g4BZUG+RdOV17zan+zn(m1#=;g?^z8k4dN-i5>q}FAJDln_b-Zjm=Gi z*4@i`4Y^_6cn*#^57r?b+d_-Zg%8F8vtc|#mBu2^0e=GEk_d=E@5AJ-CIJ-^C*|5} zZWJU?Nc&O`2bXyqEA&l3yzx9>fckgkRoWA|>lQ1W4?c+R<8N3$w4fI=WU?*M#y(M2 zi7U39D#N>+Uu8m`1g*G5CUGo3HC4Zj+a8HPy609c>pc? zaGwr96XsLae2F>Ho7<4O%5PO_o;}3P6s(yL>=VTUWlf@D*{9;k&07Kr0{$Jio zVH6?q!u(}I1n)j$v+D)|6$npuY{5w7MII6R4m-picZk~t$HE7qOg1W?z(^1>=Fp5V zuYgb--CfXIit0NyKKZA|yxIb?+MjG!>20$EZX;40{opLD8Kp|;iX z3G{;VaP)#A264|xkUhtsvOo#ntyBnJATizr6Kkzx8 za<95fB$I2iHe0})ux|w_9T}-<7WneFYM15h{_(2ot1v!Th z~ z+JymkI$q(8s6ya^$?wJ`o58*QKk#aj${`WW zlI(a$AB-1RXm1W(8t()-!SS2FInP*~gPc-L7@8(SR}kK_y|urL+TG$ud^^i|z@z6o zan2u~IUC5XU%Xv${_tPC-tUZe4DVXbIOh#|$4VUQ071c?XYV+7&JFo;dilfY@qs>a zcXDjG-OUc1eIoA;hn3(xKi2n?haZ04HUXGF=2#=n;jAqtN6s71EvSUVu~;+?**LXf2_7Mx`KN zCHz1PzGYhZ&CnKaLq%_F_kJ*ED1aL1C&c-|xj?U%r_ku$I5aJ$gWUJ;IS_62f7;_I zle8-?`CLknTW7Zo1CAMg=ZuIU*b(zsW9>EIA@F{)S74yukNx0bBV|6r`ng6@a1Gk7 zB;_^M^_-fsQt!C(eBI)b3^wPKe=GaR0OaT2rSaR>A6k8A8#L~G&3MFpZU8|c*6;k| zuc`tti?2cd02op#EWbq@DoN3xetP|7(0*!?{x7HL#V{&RI()7~%3z9{uQcX*!Z#QS z0Y9JCPGt2CuZP3wch+$dPLufL&A=}mJSl^4bVPGE33@KEH_H;in?jou#4c>6G3kQJ!DDZjpQY>Kp;!QGoTdc{LS zX}(WGT$?;$2!o0P{{VT!e~?n&8{|`qgT`cAJ54_+^gPPwGSTPW8U+qov*QNFdm1Ot z`Ne8LJG?!w@qRFFPYG7x?R=nX6AfA$A!Bw~jt>;k2O9c;iUARKrl>$RdBr0QCA-vW z`I^@`XdXjOyV4E-SJ42mxg{c%bqKD7{ljp-=N zPgx4EX-NQ%_F{EdAFOP+F@AW(K(#{+xC0emAG|l}XvQxUb)4ysY!PwQkivEKQ^ zY_Z$fC!u!sW&Z%_gxmrKZQL?#(d>#N*W))@uwYr~uz6otk2TVrV9z}hY;J5oE|cdQ z-+khe)o*Km#$2WE>jqA+ckc?so!(ytd3BtM=Gh*wMV)xfwK1GznZ5F39lT&b{o|mV z&hb(QJZ~3o9~g&+74JU`O!4Oz;pZ>wIgUPAUc6$P`u_mM`aNZSu#>C{vz~AXy5*eV zS(VH4fnB-FoILgG0h;H|BtG)nmv{Ni9qYVwF0NZU!n+M}c*bbgH$U)GoZQ(*;XEf} zgZ}tH9HY9i%yRE*W1X|tk3j3=U$HL1WyW`$#G zX~iOVAO}~sP{5T~=xwW|c3m_EEJ>8aG$f(Keb;8g#)=6B+O=QfSwFxlz=i3xDB%7~+*oI^XEQp;6Ag-#Ad}xv!u8 z@M5`E3(vog`s1RrE0@y$0N;3-%TEM659NI2L=h^RGt!Z&Oi$j;Opz0WtPJBJWsCvb6{e28YWAj7U5!@^XnKLI$J~M!JB}+ zJU!$iw7zHbQ{=N)0x>*+ zy;l3!_`_wP=)8>C?EPlLpo&|+CX;wz=7AKR+>aL@7^6ZHp^$qf{&$D6@oTpor^BpG z&-6#74P=lE-HG&d_`(VY#C|s%f}tD(W)7%cjeo2q*UH3xPI3;^d=Gfc2Q4~yOw&XYqTV%p`ME?L_<3$2$f8;sU)vKwmfnK7oXmL*o{CX1Srt@L*+G-<&nFxcHMJcQ1@u=*JKfL$t*W$&Ra# z9RPe{D;?<*M^`p1EwNa8&UXGW3KTP581aTD=1mYse{3ruzD7E75+uy&acxFW)my`?Quk;_n=!?3(ENi~ z(@uc)nG;lrGPJ3&<%x$8sVxUpDu}eXAn5J&N12BN?>G8l9&|>uG#Rt!;|k%&P6y9)VvbHs7gWV@KsAHW83~Xoj_dscVTK?i_^!a;#^+OGd+b zs<8!KvuVIx+u>?>14q7bRYE(UJe+(i#Yt;1JRfgw0Nd3k8#kqL-q*j{6CBxfv9Bus z0KW0Lr)gQwntTA{V-=&D*a^#}{D$z>S-t%K0E|}_8*j|(sp}}^D82oEaPgK=Zz;&` zeE$HfB-SdB9_P8MiX&Do=TFW(AfhdM*UN*H2SLYPHii+at%V{sJfG(XLenVWkMd_2V5xK`-kZF#*8R!%|#pU-#EpS}}S50H5m+C?wl-{^9mu z+K5x8xIQj4m;-~w7vqQWOq6{I$mrywd`2;G2(Gw|n)&1E>jO3;Q|2C@ZYzWZvS?lh zXg*fAtB$nk3Qj?wdSV^)x$n29__>ZxlKqGpP^akr&_ zv^Tc~T0FUU&Zv>a=x5M!nqZLEzo+LHY`F^iyk&y9NlaUmk;idbPB((&hj{8Q7fSqD zg0=Od*#X5@2;&4*L~+qb)lP8-QYAI_b&wmqfoPt(!1_}nx1$9;Owy1cvdw+u$dgoM zuTpV~HJ2i!Jf3kutr!50-fqrU2LprNA?1=6y|{|_-VJR*&M=R`_nKEGug39{H-kkv zFv}yJPrm zesTn~D12uPzj>Mmgm1h&F+>|ir*$Ysxnm#iF|et9#KkP84$;5XNmI3CY&$wTyymQ3 zQ=_AM@HjP}1jYe|lMmiT_NGt9FT8c_PnIos#m~+Q^M;(h{{UDB;%~+UJpTaa#UP9MBR$*gWf#J*`C@?CO!IFt?S{<7Pt zRnj+nCrrm!93Wd3sr?v0 z51a=}u_Yd{{H3RHG46zSAD}=Ftb`QCv@b>)fpJW}WWOU=d#}J=!?Ez|rU{+`o#3te zSzvZ?A2d5iNJ0o9Jt0)Us?zGJgwWjA)<-I+M}8QeV+{ZlmLOJ=9Jk{JJE=y;AwbS0 zB~v3CBXpfaA3z1*z-1!}FKpa7h3czvz`hu$zs0@*SFAc$2HvXt9C{Bf16q+e9Z>wA zETvu)84mFEDc0pjD^t9E>PcV1WbAL9i9A{B$*>GbOi7_wE& z+I}p3cY$3;L3=iKZ0K0&GWFp(-wf&LHMz$q6_ZI!&hKHHny2H$t3ze?~wL$qPK3zdQNO10KYVDT9VI zoxkJ$))PeeM*BPdac1vJtOO#pLiO3epqCa`uy69iDiD%|LtQre-dd0!=eL9{AV>4L zv@mQRNL+i1QD@RH+i?#a=zI;HOyhZzed%~Ei|D}Z$jB!Mnn%e;4iO(Ch{axhjL=q} zY0dBPjU}q*Y-q~)-+1Afy3q1LE}AI9qV>g&Dt4(x@iqea$Xs+9V=g=O*I(0V?ADxD z26})_Hjz&&n+ZB#S^QuXtdoc96K@&IA2=~dUp!)pzMetv4eY0xf8J=Ug|KsQWfNv! z>B6Kz_yEDkib><|EIOs@w)gAa5DI$Z5m$l?Qf#Lsv((0}fZvR7csnk~8g{Dr#pCga zheB^JkUy)lH%aHH_U@7nwL8ctDp8LOBM+B&pluIFPqvc*Nr<%WBhwpuOg7%J3dMP; zUJ%2Ts}yM`Gxai!@gTgP(}xX=d9 z6!v+3vFzK`w8i)X=O~IfC29f65cY~qxBO*~8L|2Gnm#<@KJn1+7hPkL!f@tT@>&&Ga_IP;vC{@7;3Rcu2#H-@cSF!&h03~rL-za%a6Z##=dKM=nh z;1;7}8;c#PIocN{kTk7ixB{sc^50)fLxm6=Wby@moP9vxD@d-;h?+#0S~*1Ck_L|~ z?|7mOz8^TAU;#Y&&!_32ujlcE1X+A2e4+cnaw|X};MYe!ab086`;N1Cfyw=fVuN8$ z^clDB3~)-Q@pi-QPpkw&q~uPUcdos-JfxLCcMdBGxC9+VZ~`=%4U$8Q3<9(Qys4%1 z9r9^_4CLg9*IffcLBLF6uk5bgQ&oNl6C%ZWPLBc3_&cUS$yI1``2x;ZYSUSNC}rm4 zwVXrP;9aV!qJX{`^4}O9(1mtXFYTXr=Wv78lkVov3unVWr}2R594mn62>yTjkkw*; zC;Q1h8X|Le{{R@S<9a>ue%z5DLwsH};dSdOA(1&1;P?Lk+#$$}h&vu{IP$0z*4lr! zyaPxq_9NNK#V>5Zw`23e_s$8{Gj83Z)uMT`)&l7VwJGRoax~#xvHatJDyiiYddeoC zLNq;=5wzLnQn_3{;(6BZlRXm?Pc3phzl?D_b~qQa)%@(}LE2z;2YBRdolkdhQ_jxJE=p6f4t*I#5q)b8 zltjHbA92*7USR@G@o`C0XgiSF;P6KRXklKAUU6c`y!Vzfzc^8wOx_7=_lzib-ZNo< zr!zNRL7T%LV(aAp08PaFJ1$_T&bb#5BtENDVgB)?+nENs&IU}$StME2`{66CG<`FWTbuzR@EM}ca*ldgQs64vUU1nAshx2Xa_lh%qn4sY+NoCt zjj#Mn2()$4lS=(*3Xbaz48J#rvHVPTQvl&w@={I1CX;KWN!_oL2F7nz7ltQ+SCv+2){9$UDD{{T4u02r$m0{N2ze=A35VAa^gsk( zX@vu$;oyTU>%uvEVLodAign(h1eyjxXsK- zmll?&Ps#OwoJswKzw^8nw$=E>^i(5Sf4r2YjlR(RRvz&<5g>WFKx@&>$v#c;01m$>{xPXqd9}idMGf_H26t7s#5mJ z2Pwg-zPM|>zA+?jV0O`d2=CrH6p(Z(r{aD+LLpCiA&c~C@Fi(vT%ygqP6Y4s8z=})!G0Yg!;lid&F#u66XMu3<@ zMVBH-`2N@cjD)rX6Wv2y+~O5h;nDCKJZlo6!Z#(3*{ACTfuBW?bf7vox*?nuz^waj z&cJyDhAIt5$RF3Pu!*uYQvU!S#yNW!FVh=zCuaE!fKqadN+z~=PEQyLENe#hUK}pY z$45yuWsZ}dSSuX5LhWzYh25EPgACi(eL1&r3`z17-{%Z^ zqQk~qwh6*|_Vt?YC}Jp+u{VclX37tEWSsy~dAxq{uu4ej zejoGMJ}{A$5Umk5BiVw*P?Sp*+TiEH%_xBA3K1QMnnXlSZU(sgxmoAdY+;nPzZ93Q zLZ_S}{4}#&(Z=Yyz+kjODNsGAK5|D8oqkalfN9qpVlBtPQdZM}*<3tZ0qHd^*k7YA zdyr`bgP(3yOXV?3fiUM;1U49+CHrwoS6(t4o5P^@gDqCe$=Q%{X~C0AHNyCtP!zU#v?A?F$-us*^!7{fe^%OTJ3l8 zVt3#07ya)j+S~^({jY=GEzQBG`6rwdimKXdlkIbol6@h4D9=hbb^6xWfCm8Z9OMQt zc_JTwu*CtPB8fxrDxA*CnbP+4gC=)*s!sRL z2DG%$1%6i{!N58)1JA4`?nG#R1m|gqM_BQrdBw@gF^MF|-6G-vqd%N7C4#_BbCT>;DAE<4X@4%(<}Lt68i5f($! z+5}FVR-J&T17asVZU_GWGf!YH z0D|8;EB*W#lWHUyqNQ7qhvidTJTc%Kx>0;A$0p!+5|C^R*!^WWnYoYN!e!AYWCT^iU(|&QZx|pO>ly+_Fo-Ugx>B9$IxjOQD!U01;LICoEeX-YlaBXhG9q!Pq z^#S}t7)6N)%LoN69WlT#xVj>#+92*nP64FHq$+)m8f1ZrTCx-l7mQ)#+!`obPtLIw zc7&erR9|eZ4D*WYofE7?!OqR#R*xCUn)8UewDX7>Ze!3bW1gw@;B=fvw8tnOhqosz z&^`OaN0wN|kBlQzzu?C#S_Qr^HP?3$=Qv%)$@_qMiHR^>Sl)hqr)-G4AM@$hgZE|`JnO} zhitxPvC+SG)#oX(ZH{eQbSDl=(lLlb{3Rxhu{(#{g31Z@jpN>OA8lI2j4A z(68$mFQGUR^-lcaFPB=c6ys^}T!zv|2d(hdEUSJrdJiGy;pXBa>lM1#lGS$OZ>T5@6ItTfgH;DD4o<*8(IZ>273deBYu+>lAl_vJDE?*#UUmb)_8;xA4iRkX04 z0Xyykjlfi(mcQkj(SRO@VK_M)a>!Ak*PK_htSp_eHhMBr=(x)X(u4DeUF!A1hKsY8 z8l}jAt+=3_<0q?zhlJfHUiXB7SSrE6n%+E6NS=>>8B(oo+;ODaaOEi-x?fC|S8{{M zo-qUz2Vbu6Kny+XdD}I002&Wi!hT4!P{fZRd(BNqu#!Fwgx{_Q+t-Gd2?e=PV8+K$ zqxf%kb@;$TU~fja842K@-fa_N))PEN1H`-Y7$Tb=3A>9$#2hv4KcGqkHx5 z6OP(KE>C(JIxttXQ(O}3fX(wd#t*nm4~MdP(St}F9v~@NdEcF5aGi)^`aK2dyOaUr zaRBIeR{3$+5NLUH@)PCb0nZZEq(8_t=N)E*SwG{C810CO3Qm+a&%A7{Gz8>IIA$dk zTvKcd!UlSF&566*UV*nA5gwv6xH{%Pd1Z5qbOckKJ@`yeWk?F{?0;q}5{}X@T%-8o z8aBX`rO+tG{k*cEx!iB_mp^GTZEULdi42mekOQ?)z-iu!?O{4sRWuvJg5c6@O%RY< z#lr5QP^#cNj(v`V>!@Sw_(F<;-+VTD4_;oSR z_{^SE05o~tKXlJ@fjQ7xyk@@;VH=8Ad}8^#uF@WbhoH*DQ?qXC(SM9!DPrFTsr7P+ z-)(O<@=P;80aBHP-mxot>kUp%SuUoq?lxlXwWG_tfwOu}4b@@1=x6!KYk-rtSRViY zu_x!3?*vP=hij2gVs(5OytBZ>TqTwWoXjbZHu7aY7x$DTzOY0}sT?$gE*_lK0+TFm zUP5<=il(VMEAJ%ukO*rn%BOaE4|u~aZB*i~FF193Yqr{ZedL{RNEf#d(Ya z##DQCp9~b%CEr=UnVOGS(q(^n!8y*CZYb*}co`KVUjo1k_0A*Ptap<~SgXzo7;Q%; zq{$qYgRC%n{ot5~WDF#TSX;$5P`|W(LHy&~ikLKj6iA|&7YcG1{g~QppOQ+Cyww{_JPv=nNl=?Nmv5WL7$~S4 z&jOx!az(p%(uv<6rUcHFR`%`y0CT$=l4Dc4WTj4y&sa9?hM|Zeq&lU+u{Yu)0^LIR zxab@X^2~;r7XgZ^L{mVV5U>Xd@pEIHFzr7(bC?5fmtRh@1+ekwHiB+e$TV|6eOmn!ybw%B#Fr>|6K*$7d<6$< zwWJ{K!8Pq9NLZ25@CQfEB+*{5cAT2M1TyHpGD|x%f^=o&r9=l0q#qT|J)0qrtAV$k zWSJIS1E9Em`aW{U6g^PV_Wu9}tP3j<8?C3(_|9txA__0bylgV7w3I>LFT4Uk=jOT> z+~2G~o8WqJf5*-;fCvoGU6S>`JM)|D4H4h{a;Dh$A8-A{#~g>ir;qCzwHyIDUjxj% zbIv37Q4Aby;q{HYnv@{m*IfP#pvaYpcDrwQd1))=JCEhgD#(G`0fczL$ zocRaTUifY#RGJR{Gj;SX@MbHCqFNpC<5LI_krbmFX65S<721XsgU4s(fgO!dNIEI; zzQ0%=5T#9fHM}%BnK;V(AnRi^I*Yp4$M#`Sphdy}8q^6@K|WKI-YdY@Ab}Sa1>dzO zY$hV9aEZ5!j#snju}I0lKNDZF1SQ}7jd72>rq^%9RjDHF8=MOGRFkikgX zf}kI5Ce9fk(AR)nB$W}D3o#zHfU? zoQuu^oX7!y%8&(8F_eVjAZVz*jHG)kXm;|yDm`Z-XQ71YRpZPstX~yH8|^}S!E0z| zu|sz?LSPK0u#`5Vt|#jio{gl3(<_8WPIH58X@~uA;}j7i)G|K+!5Zx^+x%kGvkU8= z-N5aH*TH|M7@i3ag1^=hg$LOFt`nLsVPphLe2W8b>@6dz;};g7hP-u;phwzzb`%th@p?4L>#xe>#-T+tvzg$IDu zag?WEBgpFl`Up@5m*Wmbz6m|hoc&fq8pk-mfTk>#L<9R=ez27-axGLb zqT|UP4Tq*o4Nn2@&*v>A(GAX(gN!Z5#2OT{b0t~`bC&MszHkn(YR*gN%>s@rd2f37%QChX&9v$_o+I&&vaLjDQ1p0;MxBWkPy-2D6-yX1eNH9Y58ftzI%j2e!>XavS!?}5m zD{!8Mopb{piWqAV8;@j=eS^Nk88M<_{LcRXJU2C>I&Ty@5C-j-DHKKI7i20PS;hcn zy;w8LSN{OGofA}2SuRPc2U~9OaBT?fS3D-AQR5JFr(tgupTV083^XFr2E7&Q03oC5 zJpf*|xfrX9(wH~SyDu5nXbQQN3%jF9+|8;l{a^{!JkQD#={zZ%p$T+WhRkK!ZbH(6 zlp+w0h;@QBmN)r1-A8Gc{r>=rO@OqTPb33*ySYQfa7RibE4j0SN8Soe2{H|+ax>@q z!>2hylwN){jce@kIZU1^1?YF1MvGB@GaMAFFv(jrsX4|LStmdTgJ^bNMj=3hOZ=Mq z#?qiMf#^P+!yX3ECqGOvcWk9c5X)0IqkBqR72Qc28nqANS@)>Q@ zXU9qRw93HISI;Zp8S{YL#AR8c2Km5{s1lFKG4y{Jee!*8);DJm57btEb(RAfSN?vo zRjQTfciuO%H)HTW-dvx_Z^-TRW2yk5$XNc&QNq|+r+$nfxsB*MW;P4AiQ~00VdWzCcoo6rf4;<-c#oY`N*d5kNiz@AN*b;i98_Vz?LV+815HJw^6UW@&rc&sroXt7MkCr z$7SUP;z6aZoP`1a>OAWdBzVyHIm}=w_(KogCc+RP*~!kaTTn!iBE8G?yxVT&NUzJ4 zj1@jH$(emljR+6ymdhppEYQQ2=_#zbt* z17GP{?;&xT(h4399GP8*4^8dY&p9X18rtJ$rXupDvh%wj)E9vqvn~8kkk-}hEPtZ_ zGBxBp8|`n_No)b&G5UJI`aK@pzk!I73Rvv-@LKXLJdv2YbQj|5J8~nc1r#9 zdfPxLqJF;^>xIEMCf#fEaWxWbZ~Ze;@V3rV=; zj{58IiWnUhC&y2$tqhX9MRasb2s;S8x+(0c4#%k;)iqw=S3p1*IHMUL1r!dVgYn*4 zRp!{NLSwY>!Nf#qtB44qMv_cT+)BdUSxazT1Oo~1JuPV)QSp&e5>ewJz?2OmTCq0b zxB;I4vZZB9tIj|v0i-lOS#BVcOp#*(0ziRO?>Mpoi8_WLC?P%g-YUz&7J3vivJmWJuZKAA<0THXKh!0V>Lmi;{ z#+nF&)12js2!r48g_9~uvW&wKScTehKJix^iI#p)hm^vmuVrJ%NZvN!(q5$jL`9~1 z!|y20i-7`OQCOKjE{{{T7oGFT$H zKR3^(56(2{iYaw1(PtETaJXFf#sFr~=az9Tw0HjiKaAtz==MVyCxuQre)7A)0BYIr z>jZ5YQCrup%v}-aM}g}3%i;zA;qym#+l`_c2E*Ic=YgFv_!W;}o9u2Ka-f6n!|X z-6>TM9cxSKVSg5XpFxAwJdQhmOYwwdD{oHUdp_~qP=NA1{{R7r_Qrr{{{R@)WmWq5 z>&~!QK-q8rk?0>g=Q;YjP5I^j0JVeyWP{zI{N%TmQEHJudfIV}sZiGed0s-^jJReV zv7HWrZTE(I0aYnS%5wF9Tx4h(e%_fL5wirEUT1T=gkTSQUi#@i@`y!h?t$0<)SPb$ zQY7|G4S0Lx$Yo3jezhm-1pT4MeEWXzV!?79p9}qKB`DTPB7og~a!_bgU^|4Ld~cH; zrrJlIST?Qr)gfAJ%I^12Fq@a0JF|-7COXB)yj+ z3(VSTw(AY%pw4m$K-5Er9VrP3U=WrR4ub0trflO8Ko~mRXIU&>K|$C@9!lwTvCG z@Dz9QEeRU(nt8$tlieXX6h?c*L`ep|m{?vv2a)Ru;Ghw%Fwam%s@e7!fTM8HZGZtN zxJ~rE%_TSr0YvFBs6jDkM+2jVF%mLf6@^_DabA-p?v%Q0^Ic(uOgp+4O4WU5RJ%dJ zq3x>{j1OXBrTHe@9S4)%_`x9_RO172LISS5VS{{t*|)bC%TmsZOXFZpaB9N%sZhPZ zr$20clw3MT&>AoS3ttt;`dRb_a*JC*#VrkO$ zdsdL^8j`Qa{r><=rI;M)M1iqm^)gL@+q*U7CFMUE-WG2>1>knSye4oEE!seKI_&X; zkj<&<=>BjoV-Z2_y+3(cw%zS{Uza{|g72SBcYxvCE@y;)SiK?&f;x@s5eUhuy*;-2 z&7D_|4pc5!N<7EBa^*X$jf|_LSH>gS`o98Zb=kt^7LiwN`pXr z8A)5ry=9{x;#ducd`w9rXOrhOp&A7S4p5EtT+!)8cB_ZfDD&YG>j0%J-a&V_0Nm%S zjK8eA#J+Go98KuR%agbFm8;p0rfB%{f|%~^U_hMVzE{?AoZ?B|Ks|Sm36Qka$9l%b zXh#pvsyVXFApKX zz_;TK->lbn5AEMX#5Fj(Xr@7ocDLgV6)z(C*BN?x1|NWXeBro+sUE>Rt$zj-qXLDV z3;g1ZBvtue!vHYE1Zm@5TvVdEAF;pu&PoAO@VCxR49$aSoS6r4=2Utdm)gb zw?u_3;hpz`fGq(69Ek&+JuX$SmC$0r+KhzMcY(0W+G2=FG61&TGRwzyrD!P-2^W>3 zH=83?w*$yLaWDgiqQgNshL7hvE%7UAj=|ZaoaAeJI8Y6vMEG><$Y~KR&XccGT;d|- zKm;+ygrl>*lq%zcqEk&y=O$iq&m};ehcs=p!qE~$#+TZwBXX&NQYcXI*Y%Y_$SbNC zYNYC1>$x2VI&nk@7oJ8~vB9o1_B6US<(<9J(u(B-BgYLU5xCpFY;hz9B@{H=v}^&k zVDS`b&xNrNiUmxJUOm2mJINZ<01Mt*bS}>A4MTb z4f-E`kW#YEhoui1zHvhe4|DT)!b*7+SIh5=(vo@5b@Hk9Ua(~%(ZWN6mKmqb2(8of zfA<|jc0Pjh^!Uaol`fU#CqKpmXOS20oI?uU+Wam1nOGUEpN<9%Y+I?{#!L3PxRF9h>FWi;91M=1WNpSur?rftqIrX-w7De^2x0R2%j0f3edf~f zlKf)=65<}Z)WQD%yhQlI@)-PaiFb{T;fPN-51Ej>eCL<%0vuuYoVmtDpnh{k+wT+Z zX42x$VVp@38G)*cfahza z4A5IRa8X+f!k$eV)y51^wjdO|RZZg0KC8@?2R6mM@%L3%>I~H!5VRU4(>8nyUts=Bx_4 z?#?k|KTM&mm!_b2VWeTIW5QIux?75)wGvQ;ZqTonCv^D+ZE&OW&N5h=n2qwIpwsT) z(zIevMDn~y5psr*0Nb~}p{3;BKJ`Ukvm_ zBz^sV^9i~VG)LDTJmMg}&DpYZ4<|XYw<6i-oVVUfRrQcbQa4Z=_`uyH^h%mdjd{D? zP#PVY3_eWOpg<1!pReaROb2|1-TrcmPyu%iKflgvgVZ@++lz2~!h8ASG$=MSv-rl@ z>rvJpSj0-Akl32U*=-!58VCu< zW6VgaR&d#_ghZUYqf-%~C9TujW!U8ysHhMK4v3_%X_k_7lB4+ z2-NJz740XgfV(oA<7owJhUG(kTH6znh}~o=p!3G@Tmdc0wN9=eg+xx&7z`vfoDX<& zW?cwQSFDQ-QM))j{NgFTJFr1e547dLk=l=6IInH0e`eUf25-3>BR~z;mF;lncWI}s z&+h^k2n4)hww_Q|!8WbH9RZ*N6&$H{e~<5sCLWy^{AI+Q91p@$`aEEDKnCZP?Y~WG z%+hr5aM6EXNAD*u=x>{{zHm*w67hAc5;fNVmVg#T`XA#Yj-^%d zALqU>RS|Y_eRF^UF?0@{*f7@8)qvu*;O@=trt zY~;P;&k6-4!Vh`xljrL{Y+$Br=Gmfo^_MRfc;}JhCFeh`Z-0#Ak5z%mjiVypj8*&qxOjuX zz72fg+q<`vb%cw_`#7>Nn%1AzI?8}MZ*C(G8!6j_AQ$Wpqj1#K;%3+UJ(S8;=(Jhc z6FmL6-Jsa;9b#&vz8Hxc)^O5)c+W+@OSvh5A8inMG`y1`)(fOj-hkoz z{$E&gF(|q`{GN<7?uSB+{IY&b03j*aLqDD{M;T*R!TvFTG&Bzfk9Q2(8=uJQ#p|8O z%r5c?0=VKvpI8MSG`8czY94N!+MVmcH2X`xcqWx}E}oy91XW88)&BtDh)G3+)i-~v zUEmt<_l2}uMJJ`};K_B74<5W>ihy$RCS4yKHHJ()z@JY!CM5(9QZ?5&q*{#rPB^gm z%SgB@+f?`KIMHaUqkR7W-tjc*iK*ZxJ3Cc(#?`e1Ag@liH~w%Q+)+WZuwAEc$DvLL zDPA69t?x!7p#gF!pn`Ke<+W(-7GVqq4qGr(R!IfYur!s1_~e|#6Nz}}6ytj`%0V^a zim_TMC41VHc+3cVK<^$V(*LBQo^!K{ns97z!{q#@W1n9kxT zC&pAKeaadd8%>?P2h#8SXLDn=WeU}gbogQ8_<@JKjl8g7Ob1xd({+R=U+&EPa0CViYn9ER_@szE) z)EoeFS@m*TnNoRnSbZ4OPn?Qg&U)it#y%J$4*vjuf4p&VQi1qg*PR6K559xJpXuB( z0$ql$d*#k{fw)vA7gx#f9J!@o;{is3bozpQ+zD7p1f)b)RWXV^Z|4v%XPgRw)qji#gV;BgD`l|F zHxyds^)jK>v~nXDuouU@^Ny9Yz@H<7r4n9Nf6gNcR_4YR;UDvXO1A7DuJE%P8%xG< zilUE~80e^l>iKf`Fk}*JdGVYeM}dPbgO4KG-$n!YH1mQ2I-`R=Eqn~12m^%)uWvX= zC&`dD;{XB5?LA<5e;K*G6Cv|FWY6m^>-UxOfrltfvAfH?)7kuKUWHajV* z>7Vy6oisuLiFU*JWx{5?p+IV5A00pp18SU}_}(Fy2@QFL{qd2vDlmrEN9TSqY`rRk z2H3Zdp}brjSS6yhKfjz_JBT@>cwYK~2(z4w+buTx7LUdmgJol1{3UT{)~hG}4U zO_)kpJ|hkIMf^C`&FR#19z0>RyBvCNhYH#ZfQ>DC~-QBB-Kzn%{95E9h5 zYve)KjM$O5AU>cyfQH^mX<5UK_zsi&=GmnAoPzf}xNV!a-%`0J=t8 zR#EsgORK>H`NW7jxp@BoV+fbNhr8BT1$7p=o(E#_#c(E6vtm*FgUXM1s|XWU=nn>M ztOKjai_x#fC=dbMc?Wm-_{7qHdc(ub<-uTr)aW$+Tb>QXLBF+fG>s4sd#^j6gWg;s zvjYd!>nKZjO`c&>$M=U5MKpFO>#42z>niR|LT^Lo{{Wbiwa*|&N$U*}qu&?)m;(`~ zg$MJ_07Vj!6K(l##la4yvt9Fl!GzS78G4$;_~&I_@R=`HYV-<@ah38b@Zm)t0w3c( ze84y5!i3`dcV@Nh%0kkkL{i6-r7_;xd;vxD^MjKft%G?K_W*fbF<&#GD%LeZ{{R`x zAImB|T{d1r8H9~1s6gOr*LML^&9}rySc}GRP&SUiTmbl;K1NZed__yJfVUEwl7NY~ z+e&az6oZflAe4FJ)+a7D$^^IyXeC~El$CD32HQh7WE+rm1ylxjAT&+S1ZBQAO}<|^ z*EG9#@#+}?q9DT(yZdL5<$!TcQHmEAA%!XLSXmrDu}nve;ytl2Cg9(}di-A%X8yecgD=?aeFh^7$pjpmZ1P+|5%L zjGEgvIJ5ATGyraQV@&tdA%J|0Xa?`a3gO8&ZqR6x-YpVRNunMbNbRLg?4RC7#W{*f@ zNR9ghB&l!72|<5KV)5Me&e2-a29JoIU2>`J=r*`Q%dNZR;NSs=VB7=Oi`b zHa(c_X^uwj=grD~G6|a(C-}hpW114IlMQC5`8NG#t-7Sx&T-=bou(!a@M6=$cZ2pf zElR?Ea2W0yOTmIyqajyX-VTeM-$~c4j%`NE?cCD`A`ozN1-F6?N z5Dtq6K#tP$;lpaJ{o{8In7i`%Fx5wukn=h^<7bBeABOb#X1*Dm??tey`o~2=cmqk` z)@)Bcac0D5rr(fAyos>J32v1#XtUH3>g zN=q7keGXu-^xBSqG#@F65*uGqfA#U+7X_w>_Z~Xyyi%AwHgfw}zMpw9BMWazlgu{y z-W$+`&-n?gT7|G*>;B^tZ3aVvK>gfgHL5$+g86^W9HB;@1z*c=<23Pfo^{#vg?(dn z8>Qg-@1AlrN*O(W7{4>k_+kOTA%A-0$Og+5n|}IQ}r;R3HrbaO5=T ztR0AG20rq#g=@IIZg78i^7@Sj&lsvqPz^kx&(1PD@K1oh(}v=q%>5=#=p{PCJ5Asm zERSgIUYXCmt%={$Gv~^2hRrk3+C19MlkQS1rrKa zVaa*Il8eIUEYxw)!IUF|@XgqR3IN%#Fh?b5!i6D-0X9ORacpo1*pw!Ym}_Lwu5)wE ze@q}X06wvSru=IShIwzSkL2UL*TebFMK!y4_`{{+e(_n*@8i6hq1?_3i1gGAueUFp z+`WgdtOM6_4I*|E>o#v|kc1vG!=zHcw_Xz%DM8jdHt+eviaTJ=I@UF`0@~icY+MOG znPmVZkq-szVTUJOPS?-yA(Y*tWKrX2Z)kGMRTV$K_us5- zQu^&?>CxsXkz7$UB~W(%02Re#TB2_Gb3};Hb#xEwt9}SHJN9{fJjj;=tC+paPUKTQ2(@Vd4veBsqRQ%gC{-G>Lf9AkM z2DKcz!ir9yi->KEo#M23%GU+}0_e-*uZ%|Yz^z6yp2cUk1b%SM z!}0t$FBqG>{D0hFE9O2uWOe$g@GgEUs?+0BMSS+d^&zw*vPc2Gt_0`2C5)|vL0(e)(QvzJl)0RAZ zWhR1kIl)wEb{>TI20B{pR=XhXb)S^DyF;tk4}h zlyTaIr_u_Nrd!c+JFmQovd%9bSi<7`@$V38jW{r0q67$=HPUM;yg+)G$oTl~TnK8Z zJmjCXFQDi6&I$v@DL`v{;U`?D821eng*0KPEM)F5_semVGG7(q*e8=(1h zfc^#OzI}0CHUj7@sDo9lz1?=L{`v{K6ZaNmN76` zZ{mL@JE14$s^4Mwx5fwl9fLhE2kq|%0B=G60E6S*&NbNzYhOArb@wMnrT(#v)<=nnQL5Lk&I1^UP6rbO8U}r2 zfseI5x-l}2s=Hh#6eH&3K1`{W1a$PrR_UdtVx24ll*1sCzD^kj!{-9Om^nCb0c+8k z5V)(r9$Aa2@)A5WtWWla|bx+nJ+H>*e zCdA~%0F|Rw`=1x}gMGVPklWb&h9Q3u1IDonz=uOPCkv7tBGIRMbvcIX=0v+5_tzLB z$)I5!c=eArV3-Jll$yTsq_@QcHqOqEyaPaL0-BEv{A9{RflfbfdAe;xKPDtKz9NPr z>n^(;1MQl^WC#ZXDt#>a#of|R#P}O>q;y-t=Gf!%4VUDO%cpKdeLn#odI=CjMEsRXea$&8UGMN1QLg7mdVzHOB~tmKTKg>o!50tAt>n zpyH-|(K>zLKyoYAAWREf+WzujG<6*MakQxR^@|lj#xqw`iu?IK`^^N3zHRaA)(fIO zYTxzAP+^F`Zn(!QF%s?QYQ>56yTiQuV%6myk8VQ&v7tJzN28#~Q*Y>n;Op~_8b&uA z3_;1XR!}=JXMHuS6Ad6lN1}30&TcKB06aJkmZ#1Ua{g2u^-}~G=}PKxv+pz?o1wvB19!$Q0=9o4^P2Dh0vzl8VP!(tU?A*z>j4}F zC>1H=1r%A(tSOCf)eKirZ4R%m4jU=5zaTbw?Dv-1Qdw_4{%{?#?1vSSEdhSwTq+G@ zzi0#axjE4Y4-;Tcx00+1eIW;#7o1SSg|mJiKi)DRttWu!AtF)UN1VzMKPa)^39fOj zFtH9iWf&L}kPqR59!qYmb@iJDJFR_Z-k3w%jyXIV!R}%#qW(9W7cd8FqZtfz8raXB zP3DLv3U$^WsgOGjX3dKLYpK*k_O6o`Ok7*zpS&I1fvrw_Bah(}37eb;bGd*?TgD!w zK#=i1AK}O8%@{g^V}NoY*sp;<{l``9uHvUHn3n}gu4)6M;{0Db!J@3df~PMEVinDp zB3&7v--(8%C60WfyYB$8Ku*6KFfViqIoW^X9r4Mqy@t*)C?r&%N@((75UuEIoQ+Hf z;a&~@09iX2sj4Yiydpi=8h&RO*Ul#)0N>6OLU@2SGyWBe#3Q0qA<-%yoOU49fPB4R zXqzOCw|a}jaCSvID|>sg??G`EvRy&1QGQLh>+23p9>n$0T zd_r-SR6@-N8rRW^vaZ2dx>tm_o;D3|?b@o)z? zDubUNc?=N@TA%IB>p%hQ*7afMyeA?HfOtft${(Pn7jzDE%1fdw$(=MwRrocYe4u@BFjPZ*AH{{W0!>Rb_3aGb~mLsz>( zH=MWwo#J+vL$JN0tXx0=h7cVioFOJWbpFE$C+jB`1wz@m?;CBZU%X;Dns=0{7p(L=lTHFe zLKQvh`8S80=nZCebIvwE8G)&<1k$2(A+mqMJ{BFvFGB zD!?S9a9)gZu=p~rP$$505;cn1(sm+=*_^4^t7YC@m!6K+9GiO-GoU{j2X6cK>B7V? zYtQ&SbApsox>5D-{xBKJFNFXfj1pRdZ25hf_2h0%rB=}G)6c#&te|Qi0l}AoFL4>Z zKWv<4!vQptI^H}NIFjPf*5vXGQb*eJHNalY_ooD zL$81xxGtjKc!H+mQ+RNX3Uibqc^bnVUk5lBdb^Y!@=~;9IqIkX0CDm&#Y*d#%&KTz z55v#>F`wxL(9R8brsh2jd+aqct&%{QPm!{9<4 zL%uaLuFfT3`@*;i0vkPD{civbD>#Rut@6X?1rd~@ogUnnSD~}%)AZo*>$(1%WWeC0 z_{S*vHvM3$t;~M zEp`ruQInl+7~pT|F_3;I5~_K}fbI=iIH06hL66kT@?mm0OCPd!J)=^o(!oTIiFgQm$d?Nn< z5i)ja`Ua1+wdY(eJxw9>!0W<1B4BX?8bj~rA?!J3htIrLbZL{}^XJAFAQ!<9zb(hF zg;(W==Xgv)2=VmvGzp|it!>lG5LT941XZFgLyeB4lp7GqCMp0%6A@Yj7N z-yjb>W%9n5?$FhD=<&?Ka)S4s%w}imUo1#U>E2uk#OHALkb$wsLZwd({A3Xj2-i>R zf2?y@1wwG}>+y?PsYxf!YjqEUr9E#f9101vacM0aTfeO0!O`CNzl;v8yxwtJQP?h= zZvaxd@?pNW2hND_#TdE{IfQq5r`hynva99ulTrfF+U2qaI0$(B=Q%@xysd~~PSAWjTIjFz@9^uz-tB4v$ zI|NTY&hST#S#ceHpO37(+_+SgJKxEMf8Gs`R&jP>FiwFAs123xDjsztedzxHILq!F zfb`=v<-bdM!T{uFZNutgl&?Jc==S2}V^mJcbuE^5J@>BX@QgQLaAm#~0z@bK@f zj|{f~<$J|9c7gGB`VYKwLb)L|^4np4f6j1H@%+blUDFAH-uT11SsCB&C9DQbSYW1vb~t!TyT~1r z&N6an?$5b8H%T z!_mj#&9eKv;3=^9&1%buo*Y_OsIH7~9Iv4bOtW$xbAn)N7RVL|0RSj0Kmjr@IXc!j z$3MZx5iT4qq{HXFRTh&=Xm7kXo!F)CIS&05Kuli%N%!sdQXqzDyz>) zQr(fKtzZ|h+l$kRXzu?2m+6KY(>VgKkUxy)@WL=x^d>%`ong>;hS#jHFsO@>0Vm*K zjv*>1k?#;=B~=Ff*VZx7*b{>hO=}ZNu>he7J`3gBRdQpbx)YXg_Touu^}jDi(bhXk zFI9V27be&+Kk8uA5F@unUK`j4_%lZY2Bu=tE{mb$Oq14uShSD%ahqTi2VkG9xje>o z^7#8PO2*`paHN8wikJ&JxSKv4(TWVNtNMRf1-VW$c6zytpK973K)1sc36cqz) z;(joYN+(9me>uJZYI1q}H!KmLo}YMc4aet6o<$+!xB2~GPFnnS&mTQvR8kEKjFVE) z5SD}5t8uXad0pcK#wzQc91Dh>4@}qfmNHduT`cpE4+C(#boBXrHaGGLrvC%|O|QXEU~&B%y;#Q_)xIg0{DVCjo z_azkvn!D=-0Ue-M$McSldY!P^tnu{{S6fU~J(RB|GE&U=)9_#T_Z4>kI*~ z5#WEUZV(M7h8qRlq~E9an^~F(FTNYW96E1LGo7C)bl%2It{pTOB;FUQ36{W^vmfjEZm3UpK6g5Z{BV-MLs+|Q9 z_(wH%RXOE{%oEY&k%<~MH{}5n=Pnovx%^~a6Q7*2hy)wn{{Yw4Xez>bJ0JV3V^VKL zQ|wGSF|;~GLhoiIE{-ZAvPM-Spn=Ljx}ht<>j!sh|u zC!_r0m8x=8b|3e6q}fib;MmWsaL7dJ{BnN(02pV&k3oP`19eEif#Hx4bZUpzL!#-v zEH7HQG4P;&DuBNSIFC6X>*c}d&zcs;hqfEw!OHu({b13Zec+4z{bS0{de`gw#4-Vi zzDZr5IWQA>W-eLztLq!tJIV*nN`xTrGNBCximEA82B3NKiM!^WI6u7H^r@m@rM}Zg z3MfFJ9n1*^1RF51&OAZy8c1@x_`n96T=#_SZ4U4h07HKwh$m3EJFwKW_xQkT5kD9{{ozNZ zkOMIdxhkrz2YKhuj6XT}nbKn$i}DTt9J|L`kaS70+Mr;q3K-Ua?S-vc5H!$pdha7q0xGNMPsVMCk<~8WSNp+haIZ4N^xOvp(>_mR{Fv+% z67TrA#2@U!h5ae_fF_WraBy|}8kOZhxuk%0v4f*8ybPg9t;cpgEh+F!P7~8lKygla8wzrL5!3VzH@P|c}v@x$9GrQ z>UhJG5=40YHDs%V# zAB;vjbhs_=&O4%oV+K72wO!y{o}w2L8678Q7YML?mq+6O+;L0?_?~f~2gA!hha%32 z7BS?V;1|nfF#5q?L~LZ^Zr-;lbwPZmt};`MDdBc$9!2A3Y@jqD?0!o29O6D| z@<(IEd`~kpO6V)F@g1fjg~~exPDLF%3|m^#%T8NPk5;7h>yd~a~)#whN-7?G)iov>kM?LMOTy0 zdck2e!1x!XKb$(15^ym;PAXa<@e-egtDTL3AbI3uGR2ivbCy%%1vVds}#QkzU9toa8OUd`b_X7pT`b^33OaG52IMb zn&_AJfC~HY)Qs;~CKJVSdQsN-!#Fs)%~q$rFhj7|C*vJH(uSSv$dubzibec5PoFr! zgx8nGB=<630&f%tKss;?yC)!<9bkc;O2qfA<)3}Py1?*5j4;X+?(69OvS1TYY1SLy z1baP>a2V%nYuBRS5GAP9e0yA|LJA2UI7i!)g&jRO0lDn!?-v3ueXxuTf?(>g^<%7x z58iM1Dt|Z_{nL0P5)QIF{_<~+yzc>(04m&*(dAtCGqvvldcka4=hugyIcXCkL}S+Q zsKszTLFSUT7c)^oMy|&PUS?hWz-b7Le+>16zgt)~6ad4vg7xmBylkUI=4|hmZa5(n zZ7MrMOgyX!*;mAm)-td{d+HlEyo7f(MO96zuG10!03IUPP{ei1Ol-(+A@$BUd`bi` zXhyKWLOBOr4d)Ta`Ehr!j%HIlmzp%#RUK?YEP^*bQ5lP3?DTp{uEcOWGW@8d7lqn6BRcq*1>&s z#w&n!Q5rYSS|A|Yn-k|GP~y6WXP9$@kG5Xl(J^J+S7(@e!BzB&e$(oVFcc8 zZPa=+!Rd!auyj|x*t|F#m+_Li59=7AiBKJ5ufd7p2>oI;0l=Z}CD1au9&+$%uO5Re zRd<^&lPn#uA}A){zF0yD!)lw~+}131w>G`F1ONhUyz4%YFXYYi5J`UwNBF^f8!yHL z9OD5XLgI?VXg7#bHxFz|EKAU=wbDjDO?KoH?m6cH1c#KtAcllAzc>Mlwu$!Vc?qOU z6*gZQe_Z0;Nz6s`<4;7^C*CDSyj1u;d^uiawRk+fGh~y)`j=1jlX_Z+#}K9Z5yoim z!uz!^B1yxLOlxTUW&YrO@($uJrll++F8Kt4n-cS41L5GlWJz(MO?d`@Djw^`s zW9gkSI7H1d8ti$%O=@jESM=)yYWEF#ldL6>uPATtH*_v806ttJD0^j_4^9CZCv6>@ zlT z%g2xV{o_C&8a~An-`U&Dz42xC>+ zzbGFSK*7B#ENxFxC&n@;8y}G2^&uhCcG7?I z9QUyjdoo|9B0fpN_w|F2t`T3zSIGRBp=60bj}U3ivOfzct#I&=WBVm2GX66Q0n`^b@VD&XNumno%@GND4N~tCUlC&#;xD=hSCsxhYDiY zUYzBbejhk|01fiFq1Z(7Fi&vH;`<6v-yE9pizw_O z>rztD=PU?P4PfR?h36Nq!d%&c5z+)dcNX_1UI%yq97Vm%9dU3dIf&NSaieBW;RKXX zC(bYcv>F}HdvjCUljs%X>GO|Wt-_$60zWyjjhz6UA1*y(qKv(u?ckWF)xIa1u0Ay< zb#9M@d-so+s5rp6Q z=NQtfqr-yQx2@r>e>tzZcZ&*NHzgn+20(E)OV$t2Aywn7Uhk06TMQ!f{%Cj9)0b6Cz*BFV1f=ll}+!{_t4nZSbJYiQH=K7&7y#v3FaSEFRDEl1H z5|1#(Yw{}OM)OoLNG$0!l=AXz<;2yqsb$J&hWES^3MZUN+t7FPe~fSkd~fhE{NuO0 z2%e*Ldx73BU6{6VG(Q-lGiVm{{c!zZdyP}>Bk(mN>A(zb+V_`TbE5zaAUYi(iM>2f z8-K+2fQ5n>91+zx@ciP~n<^&d*VC*bNY%0&sB^B)zlBGp)yA9OZw}7!_WNj0(tpNq zWw=lKSlovsR-`@;79x=%?TU5>(qgfwhd%?~IZ_&d+o3uzFcZkn%!{e zpJaKyPbaeu0_&y#2r)2m0rQk`_+s6hvCO##X#3|HmEGOLTm##j6Aj+6W+0NG^Nbno zX^T(#PZ>Z}*D?IupwEX}2fgjX(ing`uJyx3{ImAw#M`+0%G{zhC&j_gt3${G2lIfU zXWUE}_5<00BCbswIvU!~V(%SCPYJFsybDe#jptcVu=b~y`N0!HT4}%_yADDsKWm(# z4_dfDrF`CSmf$7Ji9`$5@l{BCsgEbEjuAozf-&io*{1b{8b>O42l8OdR0{e>XQ$pf zHzmQaJikQB@`t5@wAllPDv0(6nbC=m<8B@1oCwzAgz@VIkR%P~v(7wx+6wa%9j+H& z7)kCFXQakcMZP8LH$b;fWPRd`C*?nEx>mdjkKq3Cp9n9E3)VGCJeWJ2kk+v(2}zgA zQJ(e3#zH)~fG%Hm7M`gMY-VWf0M~JTGFv4m>Dcn#A_bE}Tlm?Ae|)MGiS==emu$PB zbUc|s4I6;zIP&4GcnQq#^@D6|G^5AQA9%sCS9|_01Q-nfR=6-P7>t+NsPp9e!yBoM zO%>lxD;nW?hp%`52Zg}y93Jo(oSPNXTB(zJLjXWYh4u$_p%#sf4XZ{sCp+Wsq)bzk1V5~b?|=wvEd-rLOfUfd=%;o}R!JsdmXm_8-xr&4$A ziFpSO8OZ1kF*cRj{{UZC8r2+`%R~Hrv6|}3+Op-xqf?g)77KpPigc12_)G*HN1dPv zP(yGuU=0T%^8H~jIM;!YXnXklWdJ7wvx01q9dm*Yu*iQ{K?fbY;($^lhHP4g>5J`; zd0^1+I?crY0LOVPD*J!46J#~m=EwSZ#$!$KwxGO})lRpTS77du5m5K9Otv;2c&!Tk zxYV04!%s(R>L~cL7$fNNIb4VPz@>Z%UQ>CvXy})}jFyMMHjXSo0$TEKkmFZbd9b$^#7VE5RHp&DbWzS|T1iR9{pOyr?V@uW zSQScWt-qX*m0QW;o&?w9jGrqOyWh5lPp1z%AO=6-PY9e$Gc!cQq9)2}BCW!o4RI7FvCB3p910jyAi zDaga{>X1F;CBPaEt?`mIAkcCUz;{$Yf`UQ?l9CicDguRAV1yZ9M!ZVlP&kN_gX5A7 zz(Gb41;lJYJ0dXzke9A&s4yr>&uY>c8I__)8YMJkcfiyV>RqwoMN+}1eu?Mko_KJ2M zTN$MKyIhcbzpV1TG&*^YeP*bMNkegGF zF$fKgQ{NeAzazW^RX8^XpT>B90AV4GY(RiDPjA5BSfSuh52~hLiIR@-XbHh{MRkzU zihJXX7I|w8DVmn@1XbJ!dS2p1+^|;NNY;OW_;>8iHVcacoqe zmH6H}SyQK~U4B@O0Dw0UiS@i$T+wNKp7OfcR(S33V=Uo+QB>J{o5jQ_lp$wpUU!d4 z?HV}nsa4!8a5^0a#!_nz&M@IKXIlHnImWhkMd#CjsajN!G+aYfTCT?7H4je=EdUsl zIji6J!hQb$xQEXf6cF_fK;p%nJ4?q|dNWVaANP8@E-=N{5OzPw$%@iff79MZ1lo7L z{N}VE{rmdXL89U2Yv5a((*oQc6B7zb2&|Z2R|VEe2Ce`KV3VpeV5y=Z*W)4;^=kOX zHuEmA@OJGqWIYMWckBDjG2#}}d|*Z>_bD&D69Q9zOz^6nTz6ugE_9EjxamavM>;Y4 zn2htw?b>leT$)6|=0Vlk*1;(@MWSK48MuR^BX|IwTgL)|sE=nveWc$d!5eK}Pva!8 zmM6zNPb#IrciSf=|dwxIT93{ihFGsI< z2x?eZ<9=On#%T_~Knrwv;n9U^TM@a)?DijwLBhyV{%#bnX1IQz>nja-{{UOWaGF8yvWOIVfo(Fyiovvjok4&R zCQR%OFo^POX+r8@;}i_MecHt2ZPHC7H7Ht!8%v?y0m zt8~F5vLIL+38f;;uyh70vH&(Qm0dx)DGf_ajhtZ97_uhw&9dAGfeV0eJUFp351iCo zuJPw#{{Vbo(D!Bk00+P413gYb6Cs3^TE22%ZBAcq3nSRxB~d$zh@u4F84-eN?D@xF z2Ui+_JUCz};}F4KIJlzmf|r8~DPDE?#@*JgzOMQD%V4xZK1s^-i=Od^6FdQ{Y>lLkv4fa2*TE~26$BYFHCu~-bGIYQe0DJ{LIn4qg9Lzy) z?!9OK08ql$>Jmi^fNz{mCJs<3de&B)QsUV`M_VLe`P*2SnvVrvXl*R3tM{ z+=pRU`f<`l2V&ds;}G_f5F=f$fx!z3RK*Z>u$T=-geS#tJ1JJ9IWO=7^^8gd1*gN5 z&Z~`N_K>bv4A#KuzZpG4Oq21RGTa~0IS>EgVYp|>E8ufh8?iOEjC@S1sn^t*VO=bT z%p1)CzvU$4&D#d*@Mib)F%AlKqmFZ37OjHtelS1D1DA{n^wnAiw`uc_%y6oF-cIv% zeV+mT@hOpjReIJ8Ul60jJpTapU_}tp-80zUX5T55TX9}TSHt}M;YccHE`P`Q$|mA5 zeP38*>|Vq80l%!~QImbk@xQg63_}F%+0Ch}B}5Z3L#ZhrC-`twV>kh^%MU(`Ttcf$ ziZIf-ZT$S^sY~&Q9U-6a7|f}4^5}62LR;~P%ondYHN*#(`NM4yCnWFq%8=#WuSoL_ zJswSC$Tl~}q456z#%Z-D&G(4lqJ(*``^CqABrcrow!#343dom{%uS^c4ND(F4Jgu^ zQo1;N2DK}!a+a1LsKDY>bZ|3Q7Dn{bd&X#v;meO|bqP1|;KO4m((O6==Qz;2e|h+b z#uxqM#_$vf&jW=p^urlO*CCIvnW*?ZVnGn&Ma_1C4X|xShMCVe2 zkR1eyY~Ri*JLq&@=l6~*k)B5yPpfO%dH(>t;M6o2pIEvN=MO->JmLtF0O-CPw&Og8 znqhi9w*=<@0E{04qmGyD^-Q*-1Yzy?)<7tV0c*e>sjS+3+@J|V&|iz=4zK_T7~M4e z;+#aBzj!9ct4WTHQ%)0e`EU=J3!c(`@aIdmB3iz7?+Xh@2RP(1$=W8(>-fZ#&WUcQ3*%%tv!V?TQL9q!kdw!s@qyafx2z*j5|_Lk-Z@K58jQ zShBJM5O{B7TB#WZ{R{=Et`PzelPyFbGVGl?Yf8`N2o0iOW=*-l;`53tWa z8E=th^Gk24YvGGv#@$(`@A|+Xt>MqsKRyJ0-Z2Tt=JV5nP6k+*2Uyqhp2Of-H~w>2 zFjmd?^^D$~5c=l@t)juxu75c9lU0n}02V1Wbz6qtH zQnwt6%uB%zi1d2a4y}Puu8wVBae{?DJz$xJ9Z|>mar7$zxpcLhZv_NdO`aS} z9S3v)?-fGgZptI$5CEcunA1L^{FqVF^69VEIyrm}F*qsBMohaFsu<-_XeHJ0?*Ju) zAcz6!$Vyy-hZb|3z*AXzpXU?nHMP!JLmsT%r0_Z(96~PqTRum7&U26|4AI{hA-%Jc z(tcA7fuckOK5z(2b0R#U_{TWCY4Zd4!cQ=cA1ACz`lk)*iBA`dWsQ>0p~loAj|SCV z3~p*{2ej~F({1emuhS9~+Bj)(`R#FVacP_nVgB+Y4wApI)AgMmc|$>8qpamW9;2Xt zPs`Q>^)vEe;5(eU(P<^z?04boQ{y%pxJB`H3kA}={?Gk||O#sa+#2#NZS?;s+s zR6(yxS;MKb7-aqBCniJY6FB6N8YkUjWTin0C~a;Q-Q$1!ni2m z0;G=zf4nE+@5ku){v0|RYp=pTpYJGgC)8_fA)JBIw}SMEQi_|};}8l!iyztV z2odVJI8P6}Xp>U_f4r%&`cqGQTmhg3?CE}VVGAQpL8AT-#xG7&uZ_0e@Uxct51%-A zfvDG||Wb{A|UwwUIiSNV< zUp{hJH_GrHa1p6QHqHM4oTibD9B1`Ob9WW;%n1?LD~ee}5&2=|$2K2*KAbwEsvA6x z9nBPYR7{8`x5jSxTm^uuz!{|7^XuL=0-bvHVF?WrfS=Y*FzUe@F+AAny_N}ytyByA z=gfLs0-N$TPF@Bf91S1NBwB#RwTaY5ZktDuEONq_wH{}6+~*DGgnO#K3j?72AWSL@Ia_(EF9HH2_yx@4`$xpVZ?^uYbYrobbXw+NTp}4Gp)4&QigA5yI+N z7Ob=&Z=}WCTHp>)^_6=h$|qyVi~?0aeQ}7(9`nOXIm4+`iz@zMn$q5b3N>e1Z}F2; zMUWAXwj7FB-Lt0t$&Mt)_h2U{C0&9{L$rY~dBylGv7}S1pvLreS+lO7S z+N0m!6XOI;L%Y0Pz^`VMb-&Ezb|mn3Gyd~{rZT9{W)w+X!_qzzUyKk$2<;|^R#&j| zl|lzBKh|1g)LE(L9I38T0L34Ck3WoH8KHI_FR7D^rD7xT5?uuZBN+4Yd8fH;b_zvU zs3c~X1adX8C4FXu#4Bl`8~}8MTMl9b6q4ZwNsj*jW8pM%^#SZMpm(@%@yA#Il)B2I zG?u|9^57s4r2rS~MhOjQE9zhYk*ULuT%1za{EV8KsaCg-&B{i_8PCFD5dqvy<1a@O zPu3)Gew=)4oWehj@#$rVLt2qdJ^1G=JH!QbO0poU&LX{34u}RG_s#$#nUuvoadaTA zxWk}Cku?3_CZUDBu5MlCugE%nG2)zAzaRMLCA6*dIirYeyUJ>;b4o4Qdj4_DB4c#y@!dQurYbG^U$ex2Mhc1> zzX!(|N$b5J^S&}XGq8IT&kXp-DO&#kWx@tiPw^CSN+&A-QU)s^Xf%#m7oPJ@2lfuM zxvk8rY5jWjh|)-5L&4z4&DO0n;%8W&A6dEP8(ITW9YTkAtZl%Rkde}Kg~60vUhj)R zj@2EpU|XM5TCO9t5h-#7jR{%E5H7nF>W%rkGzXGhj|_nWRDuRhkTd3VT68Xe|eC7&<$6nHH3sW9h!$Ddekx z{{Xt-#5Kr}`u_myK~d`i=UzF&vvKJ%+Mry_Tm~2g1**2K-?0$aRT>K5A!_zj2FMAI zA{g(fyp_g?AXG=R4ThShCR$cfnOi=voy|!!=jV8sV4cw4yltV5<~|SS0khX0Fy>Vf z9hgeecAh;ij1*!uARd3l0}~&7AQ)Fhb>T6l-jA2T{&GdZbr$yeFecp!yc{^P8r%5E z=%+|}(}FXD$d4x-@@K;#?0(4QK{p3jVS+M@}snSjRM=o^m*SsG+- z$cx?wQ$qU5Kod9a>j;)rR=uvr=M^I8ZZG@xVAAR7=NTJ?B1CODB0i1fQu6q z1!uFJ>lK7s=*FD&H|qrKOBpR7?uG=%w+Ml`urw~-4)a_KcupIrZmO`GGN!N)!US+T zG_qvFoBse>RG?~%H!Q&O40^!<3*vev4%^3Yo%Fzo9g&FziNq~_pb^-FFy{hp+krNB z0(5bX#XwLDuT}cUAZ5b5BfxnEpLs5WQEyt?-x&2s3Q9V^SU^}M$BRd)jty2_PD~GM z53JK0910!4S6Ow#i7^KeCA1d9fv0GKYYneF2?m3Qv1ou*3at%%or4BiNRdWBr*ApA zV8BY0?*hmIF3R;Hh@~{GfECHSwWs(VOk4tsfwodR>use3fuS8b!1n^N(u%r7N8V6} zSBtXX76ev~Js;jhJZMq=u-a*G7*EIZhGdZ`+ud@WE3gZHSyuvUjsA0A4MC+h^55Zy zIjS9xuU%l|^N{`ttYnQu<@0eGpt;}A)(6)@b@?%sC&q>+*R}%?_PF>Wy;@j7%&TZk zug^Y@oH4ndpAUh?RReS=9`a{rpj^=^qrVXN`NdZ`;+t?54&xm>Gaz1xX14F{Z{9@- zd-ndBFd&w|$e z9be}3hyzo1gd5uUFPS zmkZIeV5iRi02l=i!Uf{<&p42Z2e#&s**qG-PJ7_TnfhmB2Y3bH?qWDK*SvOJzjz_N zP~#Lq1*TArk?A0hlK=)}fz?`r_tAvfRlgx#(>-b{Lk^5n4*`D0=OwBNJ>7iQ~|pFgT^H^;vckk z^_rG&Vqaj!Swue{(>5{!?OyROVUI7M_3s%SQT~X3cw<7Wf~)#jU9vaw^N&)9Pd#Df zUPliH_lr;<(b7NOG_HxU@s2x3MC`aIvr)OKNo3grU8toCb6)MBUZ5yb^rr1~7?3K2v@KGb>`Y9> zhb9b?0_RN&lYC(HHOd904Lb$|%;@@*A_5Vy#1>VNCdD;ZdUcfg)vB#~cQuX2E2RK| zU1^(a5@S_;h7=xJ4b@bi3d^En^ZY0o78V%_lsm;s9MJxb=ET^ zc^sx70UaV--d?2&@|ji(3kYI$HB~X%7`t}wco3kD4dgiot}>ceF|Wt?$MuU_$15Oo z#Qb57C?@<7e)0Jx?+w44Vri&3U0+!e8tw!9=9;SUL9fWBQS^|c-{5Te&PvlbJ^ZVM zUQdT1!*~*VX<)+XwtOY7rYQ)k9+_r=S#(^^<0PD}_S zl?5Xr8_-wed-C>&%d zTY5DylUgoQ0sIJKP+LvIKfNC@!77<4S{KYeS#KVXDrdU05|C5?cK-m{an1e-15-l0 zIrD>D1g+!AzVVyacBankm4zD~c4PV9;DPZ-{y zccI9BTyThPCi?u`w5+sm5&h>>0OX1N;;d4q0_!+81Z;oBz>s(~J2ISvgy$YGU|fbc z5$B9+LF|!c!;*t&hU%CG5VSmdJ%1S=`sx>uIl+tv6bHwr)+p3@Qzyn34uhkI(G0&p zw~@vrHX6Q9SXl@wY`Od}=MWPUM-b~##=+$y?Q8LnR)h&$hgmM8o0G)x`o}gcLeG$0 zKN!cs{{S8hW~af@@moxWc;H~c)zZLL=tamF=j{Nq&G z@jAZKp#uBEJ&afZB3Ipt$ywrtq9TD(3!7LOO6jX=E`xB60bDr>?L`P;Dy$4t*J%p7f8`MF&+6->iec8 z1bUi%ykHAO5%f(=Q${?GKj#C|1(GunPEOL_c{QH}{b4{tMg!#WlTOayWO=%AL^Sj! za(SPevX21Z^MwUUn?7Ih^P15Pp@^L7?8exaYOs9IKUsBuq7!+i&alv%73+b;Z|C+L z22e^CK`%L`jf=03^MTs$zL+lOp{@BafGJBzIRT@_r#RU&u!^1=6pOKL#W(C=L>r(} zQ1Wou%Xu~$d3h$h6B^ux5Rl&#O_uq`yrR^mi-8?9^xk%az$plp94~(v4;9gJSjsmI z3kfi2hH4yiiR3!oPbXi$ltf0I@Q8*bX@j$a4geEk7{AeJBSMK7?mn?wYFJQ$f~ab* zHxm+7hFeIABq4jV3BZlk+z}x74MK66P4Uc|c{^hdAoV%aW*{TCYLpAPiW=V+1w>22 zS^B~S73Ig_Dg{f*`@?;SkXdf^hgSxpL}^Lik^-MnqnqXgdWWaL*`oH4=3TbX$Pv7CqVb(-1qz8)eoC6?etECt>;{9Ox z+c*<_LuB$WSKvikB;=X4X%Wfr`fXA)rvOT{WRk4)8)X!DZpU#PB(0I|oS$XDu?~`W zHg0UL_;rn$Ms#OHj_R7kFkRu_hvDxCmKLMuA*mzY$aOe%FzPqwjWE#I@hh`gH;FnSCOI zlv0Tn0Dd!emRQ?9F&=^MB%*qo#_IS?03kj&!8S}0NIw`_9{8Bc(Pxd|sROJMEJ1J< z18fEO9A5)SP#B}7157n-F!9Ds0ZVze9x+OS6bPZILqOt5#|}>->&e(syDqm>{_#s) zd%)A($wzKx22d&c$)(Yd&{b(ntO}PysNvG5DTGLNSR#F6-=I}dB%~N96va{wAP~_c zC__MEHybTQ%mmp0A*UASQbhN;(+F7Ey%A}G8ayb@4gxWuZXOB71y>v>;sNMis<;Y* z@?*$Dx_x5Am*zS3idaMrUwDz11bP1eSdoEU+TDNMXI#7wW+AO*oABYMn0{e$Ka(gp z%LnrR05=5^w;+F681m~M5BkTpj@?RqW}#YuH2avS5HMJN`ocK~pnMR(0I5J$zmmZL zXKXnGAdOFG*Ak|#eBH4QBKvto{BI!9TS#^_qga(vLvZtRl5*+i2#R0PW!y;orsn^HI7JT_c7K{63gCW#wCkAgHM}F^t|4-RCsgFQac2`3MuV3*{a# zLq-=+4WFd?-fk5DKtn>H`z?muVZ=%V1l0p+2AN4Pf?DGJg0!lP0dHls&)XlTs~?ZyvCuD#YO~G4FVfgKi1Y2$}Rb z#0U}O%e1Gp2LV3guzN5r1>HWR1275NIr(1w8hgb9 zg%k4nAEft<-!|8T%0FrA97cLUdNnu1o~{%pV6{bRlNVA*a_D6NEENTTIq5TSlOpG3 z27ai|hU8HrWe&%}|c`H;@U(LBecs_Re25$sj%+{YYdeo^N;-2%#LW z7NfId-mxA4QG`(( zA4)nsh9Fa|&3f~D^^|Q_Np?r#na#ujROueiKUgT#)ihW4*7h zsL^W{v`XsGycBI6&Fd17;?^eRChv@($T0|fB9wo|2p(#A#FTUflC&}dkSkTFO{bhv zS9DA{*Y}V`IuAeR`OQDD9T4(m_&LE1G3ZeK6ui^kcZg9GaqjhHMFncC3QB_4u1f*F zedAO&aYh3Cwf_LF8W*rOdd5kL7t#Aa7@fN457=n_>zM2)mS*_2UqP{FV zp$%dO1yg(>N7I*KsEoKk0ri7UogL>`DS}n}VHyLz+(KMzmN{MKT!O18g&;32$&N{hQ>X2HD{UA1l@7kv$hB6MF!?+E)f0$eeuKze$EMpNy`b`bO( z=@^K;4MzUDQYlI>K#qVm_sC)|MX&=+jl#IKP-v0|X#ROU7mPRb$BwIeA(68hjjz0T zgj@xdBC17g5RW1si-;S50-hO*f?Gv>*EP^5mIWzD)A09!EJK4w8PoK`Iq}DHzs77( z9ohadSSr)*CoupOu0Y^Gop=Qw#yJjVq{143HKTCCkog6`n!z*^ z;lLsuL=WW0H=jR{)|{%q*gE&gAGqVdx0k)4u=z2p^u+!T7%LJ07Icpq0r<|tpEu9P z-Y#|vF;7LT*#;W7#4D{2Bt;nx;08)dY!)_k` z0K6L#;sNA2AhPtnb7_fs(%$GyLy^%^0G0)cj`j)X;{jtuyG9+8*BD#DKobdegocBd z%Aig`9&ZWbp1fkdgVrz}@Ynd^faG&{eB+?~;ob4^#&IcvSE+^8oP|2myrvDjae~ln zgTF>c6CQlvmcCzJOr&BcWwO3WZ=wC?pKqLT?gEa)O+0u%q^r?WWE!N8OX zj`!*cKTavb6bc0!RRKNXW#ZX>r}KuY*jGoo^Os^}S`P@#7Uym9t54ajzc^t5muFjn z?*RuLLI;OmSnccu^?>6gx#Oq%BaV0lMS0zj>x;WHTE{mhm^IKxNmGHv6o|u+^7Kw7 zDoZH{Kq&;mLeterRL)ePlVmBAq>8Y|=E^X0;U5||G3^xz(r zgt{;MGZgJUGVt< z?CfE9#N=SHu|;9X5eA+y+8Vcd>>8JT9GPO)ta-zvef-A&dJdJk55cD{jg$ScGFFNa zOLX1gX)4;T;P8wdelt}7Pw6D1F}xhBrLn~%(2l%+uJCx>OjE)1pVNcVns~mS8Azyh zJ!M&mloOzwCzA&r^fVU3te>q6(tE#i;vpPv>lOdP>i%hWd#Ct}!|* z(_Ef#wwZp056b~XG$*e-IY$MThsH@00Ys!1*~9bU&8Fw#em=;wF%n$U5M4VY zLt4}FI>l;)M|^eZ{xZNVE#r^gT3tI`{Ng095(rK<=Ml@c`#c8(!4b#+E@>KGUGn7- zwZ_~!;$&)x;3cgkMI%gv0Z5p7m3;!R zG@vCKtBLz@pj!PIodFFefiC;0p3Jnrj3~)-XUNnhhvEK_EA0_@HD$$;PLZ-1^nVSAo($| zC~PY5caO-K5fv;~cgk)oSs4 z{{ZtPv7q-1(o$ABMn<4t0Rx*!!_h$42+6hD)CrYWT5Zsin;mWpA9Jf6n5Bf{TJR$o zkqNP8wSNtDkKC!fyD4;W(C<0Kdlz7*BV(K*&5mug#4XE}g%RMVKMpL$Tx&G(ANa`R zGY~X~%AQf<0AeOrYbK;)xfvW`tWYC$NPZe#Fs)gGPUqqCh(Mto9s}cy-8#aKgK<7w&-6! zIE6#W)^hKiCQUgXS16uPUvbYW&nfcDQLnms>ip&OJo$_-|Xnot)P^J^lK}U~^Rc4!?}3O|VC^Qv8Pp z(1B`r>{{g0m4bKxua6h;a>(Su@=hdW>}=yK<{l>pkW+jEcZqmA#T^&55%|KxR2tW7 z;5oPmk?0YqzM2m`;JP*4V)A_Jyu1n!Q_U~lUC!+F-VA{IuzBKCDDGn-r#Tt?xMJ8tMxF01gZd(@;M-w44i!X+_PAHRS&AAE2j$ z>;CH$NKcbFZ%Fr&r9zGTzRvIpl0;oj&u5I4j)C14ywyB{bIkcA4$iJCugR2#?LUXl zj3NucR62V;KCl8%iG8#fOr;W6=Xqhl!0!`c1P?8Lc+RLjJ@OyMAnvS*>BqNfeBK}7 z$!?^DICJ38_zi%ZoumP-tjB5W*17 zbidwE2Vpw7-m_d`nka=x^q9wif&Ty}7GzH9AFGwh)}{x7$_P!IC6tsjC54qW6MRRx;k=?r#AJAT5gN=H8+w_C(N7 z!*k990YC*GaSR=hN&c`sI`1m23{Y<<%Ra1#67KFBnU0&~ZoA-kqC}=I#;?V#-h|SAO0O&Y|7eHcP`=FBJ zJF{=#F%w#;NW;h{fQ|xgqF8|)@0nVkV5GIy5K#U=-m=4 z$lj?vyA;IRM}P=BmL5NK%gu>MR= zy4u_A;mx@lC0~b+tU(OKOZt6bAo-M+y*C-*8mGq)+Pm)Mxo-`ogUwB^qr3%?EC#jU z14pA5jBQnX6ZQ3s(w=mDJX}E$R2yTRn=Yn=?5F=?| zYKOye=WSqsBXOn)$1%;$TtpS933P&Wd6^^xWKBhcNNllHz*>?}3ulCGvEq(t zsB>w_&IA&W)N~kBTEO!ApIXF+;l~K8Rh)fdNL*|)REi0*J40C89FutE{xQM!6V5d@ zgRDUDUN@6Pomcz8T^2`pTxZ^Vi#AQ+9MAQJnpCo!TxE`fykYOf#(Ar)V4P}hGOpPWe*fKuDqf1E@NC&eM>G`l%;d8A+nkAU&#cQ{uhDtD-( z`^giQch1O$S)}2S$v4&pJ0GRVRVep@{{XzxDIElbVNP|&eeR#&*qsUp8d}2d3MN|! z>2U$z(do-|7#@MKNLUx##Kh2=Zuu0~$nmUSUiO^4nX}>L-^cbDKC2Od>@WMqwg8LV zjYjdat#XhcB}gbekek+PD8m;Qs)AoS@@0ZWCf-^j=S+oG&w>zZ3KBGU#6+gz!4_-_ zQpb5B+l2-dfP5R{#G+L~!fGWe^N6Ua&GcFOaTyA=1l<}5b@M|8fvH|I&<^``g4lp> z&y$&QZ(bdl#iR!Wb@Palur6!Q`th28)D5DasNAUIk-<~aK*z=4eKmK_3r>XLN}}k{ z{5*di@w7?MixE5&xJxAg$n`M`N>Xz^F?0>W3~{^`+H*7U3`lUcspjV8T&JbF z>O7x$I!I8p>YN`Aah1$b@Nj?lGS_Lhb5a^sniXp`b!JOP2EQRQT6iFa~x98YILxQclrxKt|P{=TAPc20>n3-HF z^OOx9+*gG6#&W-Q;56?UuWs3qX}LjlVME_sxbo71Q0+wrNbrpuTEUk=a0ZXF5=`4r zfnWq73eZJ^>$(HPaIm3wgI45jRBM2?L888m$Y6pR05nNffQ-hpP*g+~hztfY(3p;p zItv2>`C@_#XR=AkLc=&lm{s5th@cCEuw3G)5Z_T24seV9!BM4{YZWWF!dfR-?9sfD z4yyoY)n%a?KqeKxZBUwlhpvb~XxikOck3re1;`MCFjR*K8WQd-=um}YiZEPIgNka6 z3xIhcClj*mVP#8>DQO!iUFVlY0KYi+-0}YaZafV+czxqm!WV_$!D~cYgQX6FxSG~m zgfD%6#F%zhuU8ohaYUfi%a2;49tpdp#yu)tur0cvr(!>wZx6b09eov2oC_N|VNHPM1|DE{1z z)+pq+$&^@gV1!bBg?O0SQ@DeYqbDFwGf?bE0R=0yyVkZg7>_l4?X#3@FKYO4TJy68 zdLRKbY6c*#g47!mbL{P$XH)GzU1e0#`2OY}AW0Ddw;zdyzk zU~-#GyoNhTt~Z4pesEhAIhi{OI?b4c!L3J`-b$OfH&|pB29PVTd6``V1)+riQB@91 zPi|Gv+x{|L#8!<)6_$-d#x)_O3kc=SLD~1$mB8fiFFO z7*dN)j{dS)&=rB9XPn-jK8H+0`oovPFwownp8o*GZAc1GD&3$Bcz*Gs5d+u{A8f+X z52qsikWq3n39ByQub-I=AgD^7Ndi1;yb)U6VPJ*bbRaXFRmu#h-`4FmWdwDjWU7Sw zHQkpJ>o=R|_S5Xigw$q_dg1r1FxI5d@lpN#;w%AOgb-C0!Kc}X+SnR@?jP1CZ4R98 z&)4ysbTa3@tXk_`Pw|W3 z)^r4y)9*A|>jF3l3}>Ej??ebc1AxEPSsT)n>shtK%)nDtCK4N^&Io&WmX@8e009ZVT?R!k z{^u5s*>Mw;&-r_rm-)rOJk@^R{^N>8a}OW%edAyx;P$)>aETivdapkx<02pX!7c{% zIBNZK`7j8)b3pj|%^*Gl?|75z4LiYuyFgu5{{R!5dt%$cemlol@%G|oljf=ejE-KM zfcKgLQZJV+wuTQ{#2*lToC`9wsw9I5p{)_2=sHhdY7iL_QDnySm*i;?6bQR8sp){I z=XIPln^+N45fIlgAO@8hxNKAKRzLx@&;z3ujh~EA<{sRNQCwhqa?E35Nh{ zH^<&XT!OeDMc4rtR1<=zUV<1vl7i9>2p-AO&^Ga~7l5ip{p85#^Z9|8k zp}eacga(IbV3%Quf*);+Ab|qwvclXh7jGsvlDsCA+D*Fw3lp3xs)E#&m))XfK zv_Sx1q~IgGXcV~3U3kUTr@Xhv>mJG)$XF<9tS&o8tyCfV9q{#s9$riwlJwFJOCJCY zj0~+hAkhlHlr7FIsU^IRG&LbaYPgcJ(&@kpdQD=lH%QCJ$gj!k)&ruh2QS7EB@H4T z-Cz;s0N2IH3rjn&KtzmIWJL|4;v%mTOY&tgD}aCG!**)Dp6Tn?tO3%x)|EUsc0uA_ z;lWo6vV9nwjp5gg1V1+x<cv4hu0U0D=SGEyeVfM5t770z~a@vV57DQ9(sEvG;<91PS9z2qgeSNu=PaU^LJi zu_9j>bU~ppL`73aT$trE)d&?;%K{YX%09IllarZL{PCI}NWj_-=LdwC>qJ3&-}%CE z!C@=f0i}|!oqJ;98sUvvvSDc2E zeCF%^I4RcWIASfrSG*>Wr-f>YMG&ekwBXs)rDa>qToYraF$PgTlsd$Z5uM}Dr8omC zKP>+MC&qJ}i6U?8PrH&CQ?P%WR)SbW@n0^vH^w__lSMfOhuM{;(&8hP;q{&+mJHiX zL+2V(>z?&r-|>Q{G2fIEp53_r07wt@_u{g=jT{#0k>~b&3NPb!W&Ok z4WEJ8x#bhURaMirg@*O-3b#>2M`>7x^)N-cFad^WlZL{q79to2I!Ggq{{Yce@30Q~ zNd!9Fpzfz~i2fYQwHel8HJmItI=^@-2m%O=pAs&D3%&PZ; zVc>op{_@+hRYfmIUHHzO7hS%(e@{);Ie4N}z$YgzJIk#geW}R#r1|%gvV}vqI|o;$ z+(~w6!uq)RHSv=%`!Y-%4<1j4`T4~)qfdXtT$?;Tll~lf^f2l2R-eH6Gm|w-u0ypYn z7)e&G@_4%Ya@0Be2SMo1zzXm2&KL&O8!e3VZ}FN50`S?tT|OLNwGO)Y>xf9ytd6(S z>A=3*y#D}EG!bOWUdc%A7dc@6`au`Y>cB+&w9oiG3{U|0*B z4({R%uie=~tU%1T+6oW^S)#?zRvUxwI?E-=L>?s#m8!x@I|g~!%KSR_*#nLnB1kf; zVstXgtWHX@>p3Jv1=y4Wfi~o=V!S|$h3WtRs}bKJcDhpw*6k}P=-$11XbMt!^NhrJ z-V(0FY$O5gEDvjsG&861{%{5g1^dKcsaAk~aYYEWD%^T!cqy6;UEaTw;KT;ecI123 zKUjZG{{UEb2dTs9ALk6jW>BvPb;bpuP2OM1Wt9iDgb270=jRM<9E-ETk}juEoy&_3 z9F#AF=Kv;9Aa*Yp7V8GM50Q)>p)gDh(ycd+N+v)}EHvMaOkx??ugmXy#H`V6H3jiV zj~e<%gjIw-ozLS1QB4$lHG(7Zy?tErlybrvbr5+BE_JQ*3oH$D0dM)GtVHR+ZjBmv!2$P*u{ctASubPc6>l zs;_uJEnScq0_|6Wc!R8X31A{((E~gtgULcF+Pq86_{pUjOlO~t3~}t`bWpcYD!iXq z$aM^s%kb9oWb@uy$|nX83*M2!w57 zhav(tVV1ZffRb5+kPH~pHVOBEdLJ1lti52Xm(u{$k%sHnj771iU~O;&+B_3)JVo$F zDwxMan+1N%ugg(&FwnH40J9!QhhXh3af>)c{u-w@&|?VHP!GzBTlDV~n2J$6Iq2dO z^mRO87jtwS>|uH^S_+MiHQ@BuoEbiguMIKqm{`kDjl2h;KJqa%p%d9QD3{h$g|I;$ zH|O33`4bPn>l8SvR3u0a>_>wP)!g7N!8SqPJH&T{DEy#=rQ_pyv0`;c&#&(m6+EQ4 zy$fU0>k#x{)4(_%(~4CotzKgP0C-*#L!AlpCS68w7GE0a>B5*?$s;;GC zJS8T)uuS5Er0?PH;|(7z&^aFbFWv<83U0xcp=@dN;EbXug+BhU2@8I~?sfH+KIw{- zhsy`X46(rX{{VkE*j&^{_WI%ePNZQdmr*)txvyA4IutQ`UD{g!?Ee7bV?YGEz9QlE zUpNSF%r3h4*Gb#PGJ2C_a*vbO9k);gLa3-XJ>tTU16zv;*Yfy#`sd>vB-%j7rw_(7 z8+ljxe~0tt(m}}Xd^~({`os!vAtUpS$>F|D{Bu4rKr8!Pfb@+jRbNnbuPcf9AkqG7 zu;Y^vu0*SY!1g>i0~Y)P-Nsc9xWD&!LB63kT6@ZBcP|Ip5}b&Q1|xaNK9qEi{oXx- zp#6`Z`*;Ug!CN&^ zY*a+5nGRHwiUBN&rMQ9F;1mn9NG{=&8rg#(yeP_}&%w?;k{VJ|5p*>lH@p%;x(;1_ zu*?APb(g}}C@;J>z%A8b z@gaw0w}2rrS_VMn_%arlKux>u8B>xHVOGP6_lAhvBD7uk3dmNARF)T7Fi_(s29E*5 zr;Jbu1SouvmsZ6#qscdY0uIm+*{fk0~=Q_@95A;p56 zyTT#bW6R{e1J(ga^S!?=0H7|}!HrY)wSHeX_{vWbqOMe=H>^jn6o`5~m4x$QMx8 z#x)H+V-zk|$CDavS~ijC9B3S@lfs|I=1~O%aT88&+u$cgY^ir64W4ORz}6xHr3*YM zzZx;8WGD)49mZ{bGVd;ycS+!xsnS5P{6D7&tPL!e)WB6jwIv0U(I*6DaIlFh+7ZbQ zJ-yt!T|$nO1_9XhgTPCyODs;r7KONu1&*`r5Q70B1kFV7p_LnSeXGPOXfFnE=MYzq zY=!{}f^=3JbaP7NaZPa3M+9EZjoFF;=_nAObQoAAn%T}M5fiMQ$AS&PpdSJKPgwit z0TW`N_mCRGk6U%>=)Sqdy=wJ}6xX?ohTz!lVH!y(HomcYl!uY?l8}S%Z=d_#IuI+? zB9y07j3g~jc@aW-vnMHcH;AVmE)w4I*T1akKC_v|C=OSfnyh5!3w5Bv>a^klPjoeq zvjDI`TkYlE6w|qW@o4gRE+&P&1sBxkC?C-@pXB$ySXYRtxNBzE(Rp)& zLY+9rl0sUWB!U}pPVuU1;6?!}t+e=EKK$nK_k4EnJNa_?94j}Z1Ng@_3=LSd}n=+`&UrWQ)Mh(AsPgWeCz97IOahwkWk;Mu~aifj7Lm&@l} zU;^AyA?W_GWJL?7+N8!Qd6<`kp>bH1vkAV;xy*>>j zz-NFhtDrN4PPn5y2fp0j=gH^+*Dj0zD@SfvLO7UNq1AADa$K)`^KId&rxQiQI(A<; zln4U=pjC@v8!Mv^I}kKkvH_-)5D0FGAi%vR`0R5gn2)4TwRCK!a?y-u>k zU*;4k{*O6k)o&D)Y;4;&;dF4z08411(UQ?xgdzbfXoLlh-F`3&2Zvh|lV(TP&Q##n zScoCSS&$>{V+sz7HS>#z4dAcSg9O^)2x#$wmHZt40IYYS9ORUpM8KpyNb)$i1NN%~ zUzrQF0lZt_8Fd>Xq@BbEE)GQwSOyWt3B6D$j}xqhkO(BZ1qA`xSQ;`7&E}Nohs22H_z`JBtuJ!f4KlM7oS$&)^&Z zYpf@E&#O*zZtdGO;$j6Yoga@m2#bv?hy^@-WfbHct}K!!k*SI(Vsi05d}ln4bM<)f z_nIbEUN}Z+@R#wN&~ecDyk#fw2bb$u_Lj5IFx+G-e47)K8%r=GzR#BZ;NPMSp3BI$ zIO`OdT9RMEuRUhf*dI8=GN%l>-9dg-Gl2>_u)IH52~0}6 z$wx49nA2u^xqV?^oz*goyL3EjE#x;CR5o3q?8<8{VuZdcu)g*pUD=`~te}Z9P{5Kp zTs<=wrMW6zOTv}j96Td#LDT^HJZ9rzLZo={$9SL?4GoB|J;QDU)}#f9&IMg?aA9jm zfY2(n`j^X;fK(SK=1>!3gkGP*w1o9`R-A1>QwP9z>s5=u$d*!MP>bmPXFc zSYwb~nCJ=bD6=X$`^pb^)E%5AXcL@7vw0=gFBolY24t#?GzZN0n!|q(JX@AnEZ{!} z=kbp40N;z5SMiT8R4R{<*5=M}ivCbpv)2#%%g2omZ<~*uy%_2wO-{>P;t;l38$UM$ zg`8MCns#5_9x5)`4-wVzin{h`*k=zU^>GJ1(k~J|aSb0uAI>-f z?gPkw+~W@zt|a%%4g|Uqt*R#9iHLxpzKy z*e_2(e^{tdA-E1b>kN{~yEq+@zb=e|E33bbB?4BMjYuc+m;iu`t zU_cat+1ISqOzcGTm`^CKFH(8raTKxn{{T3EV%l5hr{TaZ8^S(EhyMVNcwtl1e&3!%>R?ic9t18X2zpY9$HuWk=6qpD@axI#>jGTBbv_IT zl=Pc$j0oYn^Y^TA*FyMl<0TQqVeNbxz`(_+PmOhjMEIHeW}kx(7EPL0OA5fOOK2?n z*VkBeOm2CugNa5R%iu#2c83RJ%GG{-W`-hVnj@sppOb@>GFZ64dJxd^vbaH1lbpS; zkNeIdF#6zpVNhM@=HiG9;AH(^_b1omE$#5v8&5`Q1fr0s*vff#t(~4hHh~DV?OPTN z0E2eWKubaq^q8*Qtr3Klh#=9bnFpBr>`TBk7Sg~6O~n9!p^1jp3LboU&4YQt2Abr? zF4#Nc09S*#jEA3CUxyho9|3aIFwMlt(JwWKD4flmU?XUMXaUR-AX2cjaYAxIPZ~8c zokU6%1{-TDwR2J4V)h%KFXhe4>*{8`XhEYY4W;DkH0SWORIQMg1ltCFEjTwCqk&=v zjG9VW;ICm$$mtw9LDQaWx!5VIX>8C^_ke^;4oMuUgxO~WMDS!qht@S9W>s9LSDAng z#=CN0a_ID7p+M&TTyG_t!r9^c;=Jsrap7}V$3NrN2uT?=kiffJ{xNjEv~*+IqCsKd zxi?{`ftL%vIa8hX<0R!4g{Sw1GKkslbN7TgHKgkw7R-4%fZ4it)-QoH^&b4=hBPW2 zetE}c6$ZblqvsWiKs0r;?T6kYoT$+ANxuI88LU1CgHw%Mxw#+@kxdVf$wVFC`J6|_ zvh?%z40am-0FKtT>z{d~ff5GX?8o6_N3*t(Cjxbe>wv&SIhuP5(yk#I7V4!M7St&4 zvt(zUp>~N^fE*ja&q8(5O*TVHq%czC5lszHBzZuZ$w<-@O%!8Of_TP`yKp zNO%zvZoHQ5=_VwpTTeb_Ik)13Nu$R5@iS&ZP~JU(6XC#&=81WOq^* z?GIdHdHrqusZ6v^Kn`MklRUh@JwIT>H9<$LPmm@}7P>eQ#G1l_7l2XYc^xUG;5Ep9 ztYjMM)_h<4jA+X>8#xW%d-pN$R1rft8xNuPnt3_fuiKwP^@fRbx*UJD8(i#DqKUVD z@?UHm>a&XdS6WQih&IrCoDK?1ov9fCwyL$(x1|R zh~+=;oaLRhq1Chg{bvG5<5Bo=G=Zl?LVvFC1DIV7T~n!$y8w5|>;ChRM=?d$FUWo} z?p|=wAdmtyo8+n6))}r(2)wn?*L&r?GeYjJgU0+bTGqb_elT5Y$?9vgj`3I^f=8cy zkN1Q#6;wSV@27-J21GbeMfL9&dj$A-g{QLQO?wnx_ovnYV|%>*^1-eK{VAmR#)-%_ zy)Hf|_ku9`Z7L5{Z;dyM;?E;~C;D@k2|>X`fRzWDe;D+lQ>2gIylHL96aeWvFacq* z{*Hfm^$)c^0{;L8Zi9OR^V|9{6ty^ipYH`#eNHrEvA4tCCsMSYhsTTSH0vQmd~3?_ zInF*f)cB+QbBb4`C;Z?pKvbY{znoGP@vY}ZZ&-bYG(Pe0nf=rTK95Lue(qWzNA_I5 z8~2U`z+7iD%6G!+F6@Z0SD>)t{N*YM6e95d0Jt-Hc0O&kYI%Fvh=ofChY1{Qr(#w6 zZ~@xa!RY(PTp|Ek{{R?>vD@P)5$^RlPLJP=U|Rt!a{OxbqpH^upxD;mcO2;AC=HGJ zy=wzFbCj4nTo&865WmoX2q{eyW}`5i8YtPmTn3dB48V>2;1T1i)*hE!t;ch_ggTlSnvW;WddEx;+4m!{s%{jlj@XYJuW%*{wSlYP;QB zcq#km9&zK9%}a(!&Mp9l4tMv-wZQAQN30;k-kvZ8uGQldBYe*WMjAZlv97mpdHlB( zO_c^O>3O5=;Lf{l>G^qZcVg|Ho_55bg zFT};s0HHjgtIk{%Ozk`VjxH)#!7Cg}Op|G7s7lJal zPFEr?$!YyzP|S52=TBZcIEzyd)6Nkb#guImy`g?w6P!JrwlES@i`wM=BA-34j%J(d zH?Ko1RxRQ#uiiz`q*$>71Y0f9abuG}i|G(30I^y(HC&}tKP`k{^@qk7h>QgUL8=Uz z#Z`B@N<1B&o?MD4i6wEfmCeIVLdldU4!c0*&VR_}lDjdzu#j8;;pT=DSccMSd}k*l zTCslCE-#GH)65yQ6u>~X=!ALmLYatUlYylMIB=uleFKQI^HUwi^?mry!k8GQvehSmfkS3Xdhi7{`oLpmXk}u^WpCh zEb4CGzVR8fY9jMKdomKJ(OUH5Q*MoXVk;O=W09cax->7tyb8_yc>e&dL{@^R`qz06 zff$DDYu}@JHzJ*HBxvy*Co_dN!$tBBw+kvkq43%FZ;VZk3U_EHA?63XO;N%CGeD(0 z4(9U51!!AzGCna$Pe^6CvD#um;rrvpDi)&@u8#)~Joj>as01$uTM1$AVA193{{T@s zWiiv}kut5FY?+T)90A==~q^^8h(e>1Hd*DLH=!AD#3-xys?Z~p+0e=O%7gyjRN*nS9g zny}R}FR%Cc^PHh8{l6jk!X(tZGv6aS%ixu2c_4B;_uss#qF@+uk+;yk+;ebh%k14h z3VXl^tqf0=qlLtveQ!MM%BDaCLR9nK+I?pQ#xEXMwzyW$W@?Q(*Z%xCnIH#&eBs(j z%G=W%fk7V>{{T)EM7!-gd|~(`}||v zQ(E{Zk*C9kXrO?Lp!R=<4BecBHSV4`Cyp2bx3E9IoK>8&Q|SINhe2I$AURRf^5I73 zh5j)R6dhbPfz9jv{`ziVhSZr7hp0bzoIE3#0^I;`cYvFQ3Vgg@gXUq>ja~j6uk)H_ zhgZ>CqeDJ$qotAo{pAkt58K9F1WqqzAY>IGd4I++D8-O54-GptsCmh3s9N5>umFj4 zy7h{X$}rAl>AYE|VH24_Is|4BL{;YRzI(tYW@#COmyDaOVB}}s2Z6%Qb?+ad;Z|9N zVDO&qaFoeZ>x}azI7_1iHNQD~y&L(cFzdsa)}!$$BAj|L7F(FtAQAjg43 zqP16oKMe%LC$JfJRSf{3knK#ga#0R!k_uv^Q6R+C{vbgGD?%hWnO*K>iVZ>;ZKQ7g z+U--XcSB=UTnVt$!31<6uDa2SB|?_RYU7(p>p9mH)*9VQilKxm zf_d2Cs6mJ%ItGaJyb(xeO8b{H}DU03qkJ zpseXpaW@3$4$~!QO>f*vtp{Q(MoJ=TQ34y$d&FGgqN`@GM$N?u4O#AbbbtZ`!GNb2 zxiB7~Msn#U19%PH9Qkn4Eh}rs{{S_L8>QrxpBwKQ!L60g-awY&j%G!vU1i}rKkJA9 zW`VQTS)=0Mj_J{tJs5SQ_m7A?_=p2i_?n& zvS$SFzs@e;0{;MvY!~R?I8stEF7dcg)z&Nk?Mvi0)5cqop*T(-v-opUxOo)NeDU^S z8}pxVAvEz7!v^d=j3fXwtI=|x{hm#D=Z$ga+ZV@}3VsedQO( ztNZ!FP+dF`-tw6lQc3Gu`prx+PoQx54_{{nHn>L(*W~-AEGKUStxwF$ zbX3Um+ZssaA*2#Tc_aD4nqFBqsx0qkE^r6k-|{Apxq#5|T^i&60J%9x9!_vtrMgJ* z_udC=*I-b7Sj8`EK4-{zKNQQQcqaV=hkxJn#0n4Sz%A5P2oGGR_QYXWQrP2QY zYxk0{dkH^SP6@ChISwtPXP3j*E(~sAroKJD=LdA47k#S#09my&K=qBl`S$%Wym*;5>=Vu3?-!7&XQB@mxe3v7_8#UITJ!nK z0id)v?0~hTm@`hpyi;8wQau;P;#RdpW{pO_@0_ZXx*M}*7#GRZ_B}^< zbOHvPh10PPBb84;IWIV}>J7$Ib^}sTw9|1^yM$a0yolO8jxj=RhJ`kWog&d@A$`{B z3KUsUW$|#kBS|G`s-PObIrSU+6>>ZznHv0Es{o;WHipeRJ;_x|9;FkauZ{hgG z^aE?0H%EcE&0 zfrK7R@;84OwKy_nq`4j=-Ou~E8??!sxlLVPIn6ll9$LodO#Vm56O-)p`Q~24#f+EG z{6M_T*@6sdv_mgeo1WOu#Ib2wPD(Um><-$F9-d?H` zF;xv+7IWBKdI5$N#E1dAX*n1n=ALrT92OrdzS&7a1LGXXJ+?^y>8r1chB6@R+)9r=Tpcy z+@O^@^#+r0R>>QgRfgKMWr@Ta65wTNN6jtL^cSxWddN4Km%+7ezoXOB+3$9TJ$ z?z)f9+sFr~)7}i^W^WH_v5g#OyIUbk(-QvxMiiyfRcSqO){3b*NT1ERpkt*C6b&CM zGgZGs2UOLe`VCnMlnZv(U&@bp-qR<_zS42O!gJ+1f8O<`uIuP&S+go_QihI;SL3E)*3?BnI3x0nOOXHyGsvF zUsh5HJhvDlu?#WNRosI3`he6yoyh*VWWNa3n;#=Sg?ZCmAF6mXTXHBbu;&_wl;Mmq zi3;KKhL}!u&fT@q2;WmL?@LP#>gSd&y-7wGSdx?BTtC%GFt&}Pg**FD%!oke?FaYPg?zfb6} zZM(^GnLjOp{32Cl7YDE6_hZhm<^KHbs2j6=@v6FR#4ldgj*xjv%UokNx_#5L3Qm6A)Z=??!mqByt!G!Xg5r`%PwpE6k>#$ZKWnBiP<{bKwRZ(;I@pr`{Ro ziD>FAreTyC9IS>U>U+Y;&&jbbXXp@wO@eb&eSgb}_Lt1BE!=^6&mLE7C#;_3RYLD| zeshp+J;S=4zhrkox53PVoMs`gwkNQ>V;xrvBcr~kM%qph8AS;eu`3rg%HVTt0nALz z4{8s!*vevc4pIC)g%qv!+B0DejddcU?&Q;_;`;XOu)<4_w3g);#1G|2CoNN zZLRfswbl?-S|)t{Q&5Xp!pdT2AT5GxC%U+#uL5QIKHX3pgggdV+o#6FJ-*dztYlY~eDcil`TAVTs@)^rkmGp+zzz)TRny-f056(mKb6 z-x3f3Z30FoMghYYPt)Gn2AxnHJ2>qOzzuhraVy}EpzAOfV4{1KgDjp>ng+OdNU(b%jvVSj$|Eb>8q-u1CcOJ5{?a`eSz6Pcd2 z+8(DUN)nKU1~!nU%Q0o5;>5AvIgfXvC^nLEyALS?xA4G>SY;SHXAGJ>fQMVR0Y%Dz6Hd7x;fZIbTvQ9qew_F?;}pX zJaO3P$fc2f(qdVpay^P~2W>ulC9}Zv(@V$p^$e{CCN^fmE$D`0y}0!_`rQdw3}f;3 zB;(AYk5IJxejX9;JoTImfg@{RXe{tPf+Ki9AoE;lk4mxwrtG!I0a?`(n0e>z`dP)W z;I8{hGl54vZj&b$_BZEyg|6#3NuLE*(o1}g&OHf7v5_uCs}fNgFC=qwk&Q=D+Q<{T z8tElI7ub)ySL;2;nS5BFC9DROzIhw0=E}rUroPs>iBFK=hJ8qni|24KsNp$G?#+p= zbeNbgzGh8JpPPg?GpwFa60FO)=Tuj~JeiB-t)mL&ugD)N(VF%iu%P(anA^bW zRUMO(Le>*b?-wS40Y#U2YtB&^72F0)j(I&*bYFX;pBw7N-Eu_DU_vo5G$+ou5l{OX#BI*gX(2pE99dUu;9J2IR*P#2V6`nW1IFQj zUV+@s4c~bv@WOaM@(Na649!{ol`4XT!gPATW zZfvvHv3*b?cs=KSYSRVhKaGSgSVvNlyAXV@!=r`= zqkN;;W1(-gbmw>ydtH6iwa$wq4}Ty@2*?EmL^psIJ(1oDpKAt9w+&Ice^AadlcYJJ91OL+mt;6Fvx60`J_fF&x4|gm?4A%dcn!h z^|=z6ZM2`$XD@MiD`HEAt9L-bF;FslHqQw<|a^1~zx-d*PD+8`?-yMm^Ad z(@0OQJCD6=jPQpBh8pwuVvWY`9ay9XZPmIR*=&4v zoFSAmy-&7a0ao@=xxR-eK$*iWU^r%C4D#coLV+M{#xkwHgY=MqaJXn z;1=kRTV4w_{(0F(3;}gFH~j&U_TsE&i*M{76&yNofTUCFWk#z#0n8D?h~pNtQDS}s z@!@zMpfldWev;I<9Zg^^XClXmna*=rRYWcw**epwrOpI>$e(RR}H zbf{`g8E7+KDNlaZD8Y2q+{R&t*MyE3JglSki5Q4()Sq`-Q@Hg2siI+Ci-Ma0khWK zREU+mt2%Ia2d=$rUw>1p!Si5{s6I3_-QxOa_d)Q{fTBms@|XIdT!q;l`3U*_c~zWN z_o|>xV#Pk1e(R*!@T_mB9o0^ypMLXpsaKOCZO0i$(55EMLR1yF^%bWGE}4f$bU3hx z*I ze268Ij!A&L4);Io9I>(RAy&$(Y@wC7VXQELP>@l*y-Mn*9k?gA0MSW&gqoP10MqI|W*lG_-qCCF)vy1T&5y5*ecBo&&@?aQa397RBL zoMi1{at``R56Tkh)OAiJImqU&+#{SH+H~541|~9CMkYd1f|U!6b8i`dim9|wY@8G? zHfbktRW+GkSc<%=)nd_Rsx}(9dFi>SQkQj$c%z1J z1D}G+P3N3<(89fPel3Q_N+YY^Nt?Ga!3!#Onfe;Hw{u#l;c0Yzh6zvQ5qf@AV@h2b zRM(E}h3g)on`3kn?=pT{n}cL(=u7jY6yvZdWA^G&J`xsFL_##`?CRz8BH73LX=n28 zO2kemSK;!$%!!f6O`bWykkq>#P}!NBJ=RyMeJK|6QjtvYta@PK>%w#rCS4hsdh?v; z6z7!GpQDJB2Ds8++==|o*V;U!34AvfE&^_iLIlwHSKMYO({OyVIPx)X;a%j|J9dwi zCghE%GOoz|4F2bLL+(XDg-LgA`Y}_})=Qt)F1}bsMHtyyTZrBQr@XfejWPl~e3IfZ zw}UU_;G(d3XjjRdcxOaY@%~pAuLs)u`5O`F<3!2-&^ zlqpjN0IwU%9}uW-b+}%=xAWoQ;nkJ(|7#A$aBHA8z{A> zb_eF}Ht{w?sYY^oK$$YBiA&TZk1FR0Ditr}U-pK2mk2Y7s@=4ApfZy)5g?sOG4z-hcw&ay;ip|h9BLqg;whwGQ&KN5< zg+p@CjNT)PN_wg!qAS<;0+(kR#qdVqICKr-`oj1l~=?k z`E!tW)Gn!dL942e1yyjubCpJ;YDK{dMc-GJi`;MMtDTH2qn{X+S#udPc==;LgKRh7 zE*x^IMd&rGsoT7Z8BaFOHEL~XY(H>k8b7{)CGx)53Ac=^{M4qu$it#>v{_u{7abws zekIuP!~v6W`GVi>vq;eTd*voS<)i(~k^0ONd8mHOATdT2_xMO&nFESspAGfTlQDQZ zaL~mJ`n0t$!x^d^4qT|Y(gFP*WMeKLLpg<09 zed7lge7^CTgm%V!;M%SqgDW?`#Cu(>NaOR)E3Z_>85xwAV!tg=`LI10P&Y0|y~B+4ANR;!uM@Xi+3 zQrlknCk^YN6OZA1G7aRHQ(0|@@xE4g}Ru{t`5O^&=MJPdOXnwoaMu9 zz_`%wcWj&1H>up78F_)YPq&08B2Yeu*hg zFy6e6+WnFKL4C`7$>DrSMlasTAm@()v~(Rj=EXj@^+g`e@@tSPKbRJ zF7g@0Ef{&woz~%3L(7l-Vz=2bzRA8p6-Ctgag~JO#TF})l2Yn$RY~iyB|j4`vg?CT zJAAPWkCum8#|RayQJyR()7N*}B{|(V^KNWBl09tQ|7b8`AXj_mPQLJZJU@m*&*-Y% zUOqmqA;X*O>dOu$7h+m}@!_tEEd6hkc9DXe^bq++v)HqBdHgF3-|fpageQOxoFKBY zJf?dY_8i6(qrP7BzUPYtA0ZFBTl4{AyxO=(4G@py7v{B98J<}2)_xCl2hiJxIgjgoR#uFSE@qWa zaKg>tRU=iTY>l#Ofxh;xSG~YGJWuJ)4LWWKlc9xSYt<1kVnn7c)y5d(g?=ApdK(ze z+vXZv9I>{6eBwa@U;0{yLvXNKXL7MVfz-@ys~}S7B{xq&3BO<8CpY%kNsMY5^wvkN ztEeK|8CmfwjEep}Q7sNlD=~W#G_)y#QKT|U0qJW@vOxw4K)=TD(~1*2Mez6T@%em^ zAzeT(_O(Vtppv=@3qDRp@wRWY+axF_Sg82cX-)b>@7dD*B;N7I`J_d(7cP{(q`SA@ z1@8Dh54yloNft>|b9S;up7-eyQ1{1|xry9#yMlSuC(ZqA8!>tJL#r{#-2^5Ixe7yx zH|kbo=E<@_ayeNx{JVLt$jLC7g#Lw6lZs>U@Vi8usuGyb`iI@~=OebE?sT%JQeIyZ zv{4Ewmlm7%`9D@d6Q8^7-c-{gjs1p0b4G1vK7|C+4nD9|&OLK%oU1uvu&dcT?R;N) zUW${P8$6FBzV^VY6C83&dsi++hARPK?n;vB*Pyq&-%Hl(XRpD81#yUl432PEb%vqu zI=KhL%%8`gFYO)<8siIMu@h2On)@jsg2+!YqdcCM)Z_#AV{ka1cbAil-@6Z;_hYXa zYT;M^hMrf@J`~rC^l7>gM8@$QT`55OnvT@SkHc|NLRwFTI=pU_YJ@IAj#2p(=j$uz z`pqfG`Tk%SddoK3E)BThH@H1{+|Xlk&?Q-udg@ci__g9ll00{Q-&wy+!dY51QLW{Q z9fm1B9CWG)Yg;9_3qH{Y9)FnMqx^1zm3e`-YZ#w3v}on?FG6r26VPCI?o-6%ra=l6;SWFU+f~O=F9hJ~xtOY_1YIQ)652M7{&d`CUo+HJL# zR?bCo_##1qcSYP`&m|hU7Ne^y1I5|Csdbk=veInN4$8%SzB5$|mfUqT z^o5}84GBm&S}T<5XjD+l;uF&-gy}fDg>j7l%jNmzLW{?h^er?p|8@&Y?e8(fE6%T>i@h=<(}Q($>g5)fK?5+$B0uzuxbxX6m^R|kbi6~ zmj<6`3?wDOAF`0HG;boD^3R;PQiVtpR|PL{qlM@dNJoQoaQF!GIESb^IB}K}h4E}# zuI$9rn-o*;MklYA9WIb11trLtch}eVvSgI&9u(YgS>-c1>R^D>$|}?w+!;8ozr9Rsn&I8nDH7MBye=i#>!>Juy z+0rCwQQu)tQYh+9^$v^o(L2j*2HAO5evJ%y@wZK*F=5bii>h^{!)Di<-neCPAP7X z#=g=ploj*0iBriap0mKDEmUYvi(>N#dDG_?4fp| zYC$hL@LB85;?q%+u-W$~n9y*EZRRxcfwg=9Gy=Q9RX0YZ)fm-Xjc@Q?#3BG??N7z|2LtVIU_nrgd)hNxG z4~uDoe%2y~9!k=5;8O`wo?tBFE@5C0VX?p())l%)D{#Iu1Iy*Q??vsg7%pig3iiVg zBA}3(78%0OPGzMGRPMs8|IrBW+L`0^DOB-6FKvO>IFfB<)j$soqrt|5$AvQQ*qB{t z$!}?E55#>yyabkNJVjU_?L1foK>?3U1r zsRll*UHc_8{oJe$f#uVB74_#Nwqaz&tAcZG6NFCEEewsDg7;`kso<*WD$2OFm@Ui+ zFRyAEVL_XpD1Zuwug{V0>Lh4^l~twutL%Vo#ey0f#lO`7nYc1(F`So38HY zrlnMyfZXE@$lm7fLPLyPXsKgM3}9GG`*#+bC~KXJS2>uze&^y>PL{Jq5ymu`4JpgJ zxf2l<^}~cgzx;_@eWuig^^ZI9iQnulV7KWKN+qmS2vNys;>~N;XYsPM8oTNWlwQ#Z=Lh=y9c-eu{=uYaNWSrMzZud zjnkJ}cw7Rp%VT9{q!FuRY`7HGCp$EFH0{{2B#w_<08+hD@zRuEYio5-5tLGfK(qVSp=)fJ# zbBFy($1W(0%&9mSpJbihq8a4VqRs3+ljrC`Zm_w;=C;#cF=S?;PiHN0O?9~O=#vy( zNB<^Vzs`cQK9HhyNq$auS1Pw8Xr#4tZ`J(G&>c04@_Or?kwuIfF*+M%Kp)KU-UN8& zl$Pz9AXvKd*?(J&4wg;+=)~n%Z*vr-yMd|Tm@kq^aRQe;fsLE^qMdA-pmvLzI-n<* z(0L!))fT&iTj}yCH_&`V-g26_s9?eGIM5VDgQ;RKjc0da^1LL$qqawNlcB5J)>+bvjb$CYQ z$OBeDIH2skuiQISY&F|kuAWHBWY3*@R^rAILD+K%OwiLm=ud0JXZz4iYJF3n>gDb3 z_vPKqpcUnF+v~F07V8zg<~-|-rt_6k=vBDdzi00vz(0@`(5qFC)Y<44*MulG@($pm zCUM?I&S`qQ^q#8qXA=)Ps(rYom1@Bngn?yo&f1RgF)u0=if^Jkq9ho-jZ_aVvl$V3!?fd@v&YD#I{)Q!kyH5JF78SULNQs`fd3 z9=9cotyL4HiReHhx`l)2+2swLMBpV5?Vmh zVi!;76(Q1Tz<8O#T`=nRt;@8pwqw8xLs)^&ed5HMYVsWoeGE^4VNRMT#IxBF;*J*! z*=}gPSKZjpcRxLgjL_LnACJv}avIf-T9AV|G%L6X1C_KLxt5v4LPyXV#X-$L7>ddt zm;X+H>T|fnoduM&gj5M;yU$|3?<_gf`E$G1uiQ4Jd8@Cx00OD=K#g8$w$ne@I4*3; z9%&7uk!<#9sPd^)uo1O>(C}1=8+v9{78ejquKwY8 zrTzyfS*g3ZZ&kuLWT0f;JoPJAoktylttZiKq4VpkA$mW5KvnY1s_?-(JfgmZ#LItv z?*2TN)XKK%JX&F|5$D7qKa=LwZ&1q_0R`!Y>e+QmGNUZRr40O5ce9l3)pl~b`LpJ+ zYU`yI%8o}3DZNal?a=lkv^M(zl0@fDY9~&YU;?4` zEhlL0l2FG`ELg$Eb4YHcSS~_A)x2yFHZJNJ@)_+oa_ndz-c=XnrRspVWJzIPZfdQ5 zbG9q(#OK{}HjZ5?(k@0#X4-5Qp3V0*$sxu0nz>3pKy+*po*WfjT?ZZ8buOWZ?x`8- zjr6N5`w_IPp88*C+Hcf$CBQ<=Z2Iu_w|uWCNAWCPvpNGkrK-P6hD*@tk6z^pnA_#O znwM~smfR1uKPd~|dLCyMYoRd7MX60s8{@`ZR()S5=pOM-DxLdBsd|o^g0y&|T%jZ% z=Xe-Pp1Leyf&|N>^i9t=csk0EAIGS%qQT*iB0IC*CW~~%vNeq ziEp%o1cvDG8d3EZb#vLLc0O`t{KJIKk_xk%((|#Nz2uLQ%WrB>(%-KAkWA;A_E-?N zyDB^WLOpg@p}QHWc_E=X0L#g^BsnU?^`$z}LPS16uGV6mml^Q{4 zW&UolQ4O+9u2ke(AyWbmHJS)ZcUEH(^x?42L%dYVTFN!2RK>YX4fe6$+M6r_p00y( z13KEnC$inAdNq4`l2mB8aZC_JQ@`rAhrt_Hb)OHhs2u~#|u z#dVdQ))^A8_!b@BYtllLLLa$7eZ27+-+H9%W>ag{@p&$J?r%qR6OfooSHHL( z!x>#}d##Gzqal)zbqz=*L)w94b{BWY*@IJh=?C9`IN^I5%^P7W4AFAJ|x^>Ts2Fs!$EFs+BqL7p)ka5H5<<#9W6VOz#TAQ-bZ>W(&g} zq!A;Dh|-G3ZoDFlU%VXIj_nL1}2*;wlAn|fXK)edWj_Sq?Tj5b~711|W}tmMoF zZ*wupk~eaWrrS*4=LtT%<@v+tEW?DD12WO%3)C^%muL=0S{zqZ>-5o;3Icw+2sNZQ z@Jio%(7!9$r|Ac%C){Vz+F2VpZ_&=mxhtW~7myrM+G;Dh<-U3mb@45yTT)c?yeMGo zaTtkgXAOXzK?}{ZI#ce7TT5-`&cS5;r9Q6|ZPUn)D2}FGpR!PK+_OwbNm7-(Wl0Fb zlOx~|I0Q%pu`XYLRvGTZ z$&wCBx8RBhs+%3?c2R?dtco3bcZU#0^E`0HHmvpXqd|S8QWFCC^1h`?g}Cm6J|#rU zaTt2gE{K3G2}Lg>sE<}JO`M=@w&kIK<%kG02IEd5EzNt)BQdUns9_QTx?yIO!1|Px zYAxmN{h7FdHT%09v?HH4OUQnJ$WUdUNP;JDv2~NIXWWUiDlmq=-JDgBsBgRYfP932 zu2&iVqWtU0bKdY`jmN%LHYGur!<2O* zdDg&#-|>{5MnNofb3%6qq?bq@eBZ;Ij}059eDTr4&qVu5#>XM)v0Eff)4eJj@4Kwu zz2|hGV2Jyw(aQBPLaTJwV(-zM{K9uEZAMbo*k>{qV*U>|k49Zpl3re3izy?${cf6_ zU7g)&j-Nv$-n(eUbeCqkA%pg zp0aJ1HIFwKN1Afek#RnyPHR#D|@%F4zk?hVUn%xj$Ro{GMbpT*0YeWJkwWzi$prxIZuo-t*=Ml(|k|AAW zLHTrtb(E*St1c5hbkt!`yWG$b^YB)-ZB!(eXsD$7>F%f9w1QyAz^=TP?>Im$hyB3? zlGBk{e36tid;)-_OFH!VrjCIiDfc2j3>U1_nKv?A!VB7!G5j>)DU@kEbIGM^H<84L zOHw%uW1yx+h?zeX_JzNRT~Ch9x&SI;=BZS0w3SqLOefXYPqo?RetTVI)pMH_4FkVD ze?>(dxDL)&>=;OjEcF(=-xbnN_yIy0sD?O#h{Z4H>9Vom4m&a;6guh@Jo)GR6qZI- zN_=CLJ@=! z`<# z-c%@qRE!#$Hzz_n7uxfwUcYlqB1vKNeKr;fO<~T|*A`bzKDC2!fv4 z5K8f@s^&qS-0leps%ElY3aH|t38@&H!~Dr>2zjPnpZ$z}Tk3e;fsD3Sf*g84@@r`U zYU}1Ga7Qm@qcr(>C80n)WbIwa1l)Q%1W8Ivpr8q<5i9eoi$3?9j1{;}R_B=BjJBU3 z)ZT=C7OJVT}*+SC^y28<(Wbp znv#6MaWt+!56WJ_P-NuNJwP+Onk4DF80qYW<~!>B<{KpwS$#RU|JJr3C&pSv(r1C? z2Z(!)bsnY{ruQl3y#qx6v39hns#+KE8-b`YNTj4*mbVA3I0vufIO9Qx>Rmsp1v&DB z#D`Ryq6(wE*Tt)MA*(+?VBe%%pe8*N(059ADSk%|^$JQ{?e3h=5~|SM8*LlZt~-+Kn>`F1 z(_fI$QP;~=0LL=1Ny;4#pov%nk>iLT)1RG*=p(@(8W0F{UB|@aszJDfsIH+lC>27) z5J?JZ0Cs>u6u^ViSyJE-5bv*l62M16^mF~E4@~sq#}CkBz^6gg3rYm>0KcEpzm^w% z`GMOEUT; zDl958^pE<<%*;4CI{d$LfQUcxv$B5j@!$9Vrw%v^h{YfI*;$!KM@M-4cl`I??w<1|Ygq6{?SNDH!+!}obkpIO$0;<73^NWlA4nH6Tw>UT*N&B~m zonge$;lW0K5wKMw`i8hei4 zStAet{?D8YNCEgjW&THgNeTSq1kld`a2CM-?SO=sN#q371*FU0B7iaiI6%aI@l*fI zFD)tg75?A+gTuoEKm=iTeSiJ)Z(08#;@|l|lk~^%mzI_S;RlrbEBpZbm-{6JAOj+P z^8bp(&+r58@9+by-XHl01mdTDe)A6x06~9=_zfrgOT@nt;$M6`pnsrY{Ug7utnB3E z=#pzZ!6zr6e}J|F^cKlT52EPiY0-=eU-zP7%$3b?hk)eS5bXuJQ& ze^_4rGyFgk{}=x+5r1px?^FPa$&)8fVE;A&ZTFw~43Pc=yxvq&EMYM-q_ffp8k}U3S(nq`(yYY zJ$m%t`2VJ&UrF%q{Jp)sxi4SR)6@P59FYF_@neAhzfZ?Nj{WJ5|H}b^KRrDK^uMsM z03_=_g#YFPB7j%`ih2l4<-i2w*)pJ907VZd-9QBb)KSI7ML_i;y`ndY~-M8}<@$+$V620f;@{^|yA`>rL|FRgH^8u_5A{SRb(6x>O{6t_P zxu3kB6Bh{b%m4GX@L%UaKqSAmae>HwE&r!-As{NbpKJ(-`LE?+#Lsng&`|_P{Y!<} z)jDc*(DC1X2Q~7d3nXfdU1J7b!e=aVYMjxKrFI?!l#mLUDHw?oM!*(xL@|2bZ>JkhWM` zptNs(Gv7D!{`;PLGnu(3xsy3(-?i6XYvV@dybB2_F+YeoRD6MnXhPO8odS2^9$`IRzypCE=5&)KnDI zWE7MX|GNnY8}l774n7VJJ_XTZB8va#@$Vx*iicf;1H%R}16ZUWY*Ns_QGgx*fJYz@ z2=n&;4-gjSH{w3R!^ce1fdFjG?EgLg|4skf00^-`02T>02>^hu^WzM#LAds~j>^OK zb^;K>MGzz`i_F?Oj3x~mZ0(r&GE81TSpWnI0{~pS;V>`@7*Y-ph5>lP!;Auom`eZ< zCZNV4^n4_Qdk^6r60ge=JEx+!AvkUuKP-FrF&GNUGL8AYNdnYeIG~v09c?kFE@>(%=El$;9a6tzcFzALvo>=Fxlzi^t z>o95-z#f8G?r5_$Napuwc*mb3r0+$YglU2V&P*#i%<5@|9*&)1f_wF` z9_IdfZ0>H8RavkPw<1?~Da*-&+$p;A5_{SHNxOsjmma%G{Yfm9UuX(fv)VeNE^)MmelTb}LSU<2Uw~J+r-@W~-QkFXpp*x&s(ZmuE1moh3{|^ALF#$>%hHDQ|#}^P#Bmi3j7=++p z6|Hy~5dmb8;X0;eOvWeT1Ev4F8)+PXOBl)F72+5xyvk*lf7M9H7aKXp{YwY|dH5+* zx@^z7{wbSarLBpzpyhxPX~)uGy$2S{&-xv6 z?x7#Bi}r;I>S(kU3uV$L3U{~`SeNvJzVKxHHk|P9Ht?wuG3aiXv3!#4!U%1Wc6qt1 zFVygIz~-4W7=A{fyh*XgQ$Y07plo~_TIWu!o%-5?vbq*o*GrUKvzV*JIfjoc=X zwT28&euxVX16zZr0n9p2LgGOA00-j-n|7S2e8NR{0cBig0bLSoJqQPB3jibmrB{Ip zV>ZQfFSz7nz3aYJ=}mhyQPUqt79AbWu}{1(q4}sc~{B^2d>7ayQZcU^7IK)WKYyV1^U(EiQ7s%6emY}Lep(96y|;) zoK3c>^tSh=Fd2XXH7oTd;V2C zW+na!j;U)PzXa&jyij(>0AMoOlX=>f-F@K|E z&C}C+wU80Ic4}PVWo$e~M|=WC7F>J+05VL<$w;m+p1JnB-!pE`(CtF#a&y^CM?kf4 za0=Qx1crot0E93PJg&Vx0kePrCPszuUr+ubN#=&* z!2C=t(d^Qe{50V@S(2tpj~ehvQ&TI_yP~td7S=bC5ON7`g6Sdq&t^1xfAt>s)*hVw z(J!}ckl-lD35BaBt~?VfTJtWF_?7&%JH*O&MbFRd_iu~p)u$8R9TUr)wP#K`b*L7%xgK)s zlKux+==qq6|9LOH;!{*&T+!O(f&DSoCHl1RAE2~))z-fL_s#yZRN>~@o9CvtU*0dF zA9~&(i|?>mY|;c+SReoZrgnUZJ3VQANO&78bF+0<-9Ycol&RP+J7nOw+`#Ht)4gOJ z8yH~^VB>;8VgEx}tT-Y_7)Ka@dD7Lw@GF?H1k!{UApj#7z_1NLfXuprkpQ33i}3@b zwXMtbqlcL;%9O}4`ibby{Ls7hu?5HCKigDzHFT2_r6+$-WGIzaTJ0j7fwI}_ z-}V?%ay*24&Z%R|>m3f4)5t!rVH3MvUi0ShI~JI0pBmxEzzj6*PN}0?xf*14QXYh6 zk!{U24OaU8(gxS`5ry0nGJ!C*FVe&y(dWI>p-WsPy@=DO2OHG;5q>j=Nf^(lZ{KB z*JNKlILZ~&ak8w&?~}K-?JEb%#&5radt9xqX@?*G{`?_4J#84DG(v!d5if|*(H?A_ zY}d`-kE9?LXjM#r43fhIi@26xwuVX>sWQl|NMj8_-QJ;%iyljV=*MHE>*ab`MS1o^RpCtu{P%> z!n|5G`!p2vWZ~}R+*_B*_fqvX)o_x`^ufDOHb#~ znyU}pj;DfU`w_8Ma8WAFQ=vKZD!OIGsyh{3^hoS@dq9-`WlcHSyEn7Q$nB9@OlZ>) z1-+a3!6q>XF&nrQs1)_(ZpS5apnNsFCED*+yN=$~f3kmQ|2xeu3Q=~3e*n-uk0H@% zLYS(dAd5N#0I0E$F1};~sVjY{nF7jFi_;2(|6*;C7x;f|v1>b9x@WS|)Cy>9t>jqunO^k2A-j+xxqW?fe ztHzKHEKwUyWdqHwlE0! zb@aAoLpIRNhuxm}wxG8v?_#KK-R^W|uI>JLd-V+ZvfGl}d{o31ouBB``%e0U7ZTU} zb!(;|xyZ5h`CFEH^x^66+?qFHDzUS1+y!S^S{fRGXdTw$mLF||Yl=&2P%h#o*grtv z`nk@O&yd`5&`+x^le-w9Yew~Io0a?o3o693s`Om`GFWPAfAi~^3iwSZEzNamw>fO63ncu}^r@h4*EyuY73N-r_V}zc?l)Tn)Oo9TjNVn9}smMXPRG zW$d998=VBfjyC>H6=M{Z&kI(IuQ!gka~nK^iKwBpt6P_5Cu?5lLP)?NoK#Q{s7gD<@HqeD&Zhy}01ykRK}X&DwMzVb$KS z!gsm%hH6L2!7(FJ&WCqU+ULyHe4Ob-Dw}m|u(R*$l3y{@xMci`P-55n&bifZ`)=zg zi*o788O3DFg-f>Rba>{^)@L7mKubN z0>lo)afF4ZeW1p0R!sd4V0LU0ZxU1IhG8ix<0{%?h$>^6bXQ60SNoRhmX@RSjW709 zCr@OqmsUNnmv3d4BtG~_656jSjd2F~t=;TM9Mk*m-wuV(e9x8e*i!Uxfyq#1&l*%} z1~#kw#%?!&8H4I4cdgtwOOGx{y?;886Hh%}ex=-=%%qShvhqedC0!}!T%V+4)3nK{ zq99c!{yAMi(&E>HF8-O~xr^s2B>-G({FlK2)JQgc(g&)eGizn{-L+^{-j@IQ(B&)R zJ~kz<8naA_Y+iiLnw9MQx4lST@KIM?72h_gqx9JU^M_j9><0@89JZq)g@QRzlI;b} zw5tFdUAJeX_{6jPpWg1uPZ@d?h^PhAZ`-IO!sMF=E1NPp2W4XYW@}28f}Nzi4 zP~kS4G+HfP=~Tkr^{tbu0$k^%r*j&_CscnZf4J+fez{!hD{R(@aUz~vSuB5xjlW3s zv7jX6&(Cjv9=2<;t~{D79=14OG?mme*Z^b_#LEczNJf|sE@jO~BB4l64+9et#w#-8 z+Np6eV!-YbK;lfAfuGB@KY2A<5H-ROlCh#UZfH#PA~vNvA-+GZa~0dRe0}Stee*=J z{`|+`+=B4N-n3T%pZg^jwA0Wbe|f%4`D3DfG#f4KapUrKE?;5&LQ#PkUtnX+xk&R< zJN@9fg;>vWiQ=sV8Fgla$584#ua|7{iu<;0A5TRqskwTus`GW!%K|cycjJEtKj$Jp zEO&K$38~Y~R1-L;(Sr&qdSz9ze+1awoo90@rK>Wb9vRN;Si)`kX(_h4!k1ad2qhPf z79qF%;jMlo>LWVqg#n+*xK=`M)BHiQK^?!dMNCJhrSy6)XEy%m@sA^`z^sK+4%>LA z8s9E&&!E9XB5AsRfD~HPtg#7`*S)dIt8#vvq^jnvzYqH8VQ-yEYoV)btL{cyo8u)Z zj;WVeo@`%Ho&@cidEgj@{WTR2V+Vnp{CD*s8irOlr;mXfVW;K28r z=gw`c%+%Ty&C_h{{-R%@A$OZI9S@H=MYJs@KL1Vd<_AlhhQe$n8Um6AggW~UDICA^ z2?t$&M&Es9Zt2>lpWH1z>sW0^SowdIkVHGY=i;ODIfIJX&?7I~i( zB9G4|_~gr_3*X7zkopu@^qR=!LNg?y0{cGWEvg{ZDUC;g!e26gFSC zP&mP4p9kO#CHmbI(%FCCb&oW9XKW7Jvk7an??&xUb!W@jnDW^jmx+Eao6i&wAjEnZ z26n_}16W)>Gg{+ifxvCxNPN~T5Now!X=OM@I)o60Gm?fei-uc&VrBsnXqFVDs}3@J zBVok<0FjY4`hP(F1#~8a|LC1gLq^wZ@U|&KT6e>KrxQ+{r>t+`dCTQnz1;3%G30l@ zi{863y1F?frL0klTvLzCbVGIvu>-dH2G;_$>Tmg-=LflzQ;1n(^QI`ol$Pm6rzNDP z-+*n4JNj4S-t?I3vhA#h;J&qR!SZIBmS#VJ0>!7{m{lho*Xn^}o`LEfMXp!$i)+Nf z8^iLh{_&;L+|a6?rAxS4%wur^H4b(2(8anRUGX^a@OIZ>GoAXRqM=0QpAJ!G9i4VA z#Z*&FjmW^mU_XQmAHV`2!pZ=NbYo#+=1odb)a^Zr zY^}+4lg$e@9ona)7*o;f^6M*H@C^N$IfU&vlOq6n;lD68Sa!IB9Ct#KSZjJpCEYS} z9h}hd719RS<66j38T~m%bRbqZZPr&UD>o7Toa2@H){phvPtLhdQ>O?10d>C6H=nCM z*1D((=pj4e+4Cza4_?5Nrt*@$wYNV#l#wg_-QhILyW?@v(*4F;slT!(5Ql*M$XI+o zUXM)UIaBqb2B6hM$XcuKuaU@-OW6v#bYAli=+J~h6{Xl|8&u5Pc`K)*pFfeGb?{FW zYv5qrGn|UI@s?6B4a&8OR7nn&EoxF?63-bSJo56*f%hMU>)NR;9F0btdF)bu>U>?m z)Jv!-yU_Q-W3O<-nd@TA__}BEL6|V?14d}T&`lC7OaKpK^ad9I4+{c>k)~k@lCmjg zsE)X>k>LUOK$8i6Pg}0za=N)JXv}PD z3RA8OI3yY+MOW5}nBf!hLgAUq5|z^{Yi1zJ6rfM$qQBz@$$25!&|U z)$;rYK0gcNh6=}^09j+%&WVaZ{K~q5>hrIMq_%5rP0$2;<{a}tBGg7UW3fLW5rO*V zy39$`T*{$1rbTlEciLii{_^+VfDF-N<@>n|hN-6xU`!hZ+ zVVY}aVUbm8*oy`>N5pe}UZ%aqc!MNZv~)cRTdZp8blPMw|7OU>sdDz2hwNakoVF{p zuojFVX5fWXTbJa&vG$;iT}0FaQTvz9`v7eQ(Ohz2iS zO&-FY%&wMB1HuOE@xjUvJP--)EboW@?>L|5q~Z0BxeE-s*DKkb$pI^&nQpDhy}Y%Z zwFT;3Z5ueyjkXP{1mQnRmjzxi&QPwPJ9ae%e_n&v3UjI#dCiAAe+`u*-&)4o{by0j zu9S{k3gV*MF7)gNJ@|3p9v*YcXdX$hjTt_aXX0GJJ6 z#=*kWTNHGv;t)oRJ{L9&K(MHR46q_&rYa49aXzpanZapbI{-HhOPM>;^UbQLzYk2r zmGhpT;#~W#(;?g7rvb|HNZ>4K*7lPh-$|dLQ*EJ<;U_Ay&5wl^0X_>=oNJ4H9Q6}W zTLT2bUC+JTJAnD5-Xf*&Xl^n$cZ|rsd36@Ts=}=kU#0+Ge2giDZ9G& z;dk|trq>IakUFx;{qJ?^obcd~+bZ!w#wo9iOKsaLE%VGhRcCXNGEJAtBMC?+Rh!Eq zZQf&hN>k2_`i*|r^den4#V?y);l$omypAsxZWOQTQZq*p;Z_?9CK8;lEJfdSwph{H=6FOMPv zCknhwCNGe-5tpw}sfbI4$qPhWB)}3g5&nLJCTUDuGNWQ;IMXnVyUy$8=xP6%^OxRi z&x!LBEa{){8&Ymtj8)h5obJL&Dd~u^HeE)Hld7az}hC()?X})=)YvI z^8FMJrTzM>?|SCs%SYyX>9dFqk!vw3g_<2FuDZhhloP)$9ZwBK zC&b|)FQ0voaI5{qD?_txJduyu9~j>h_t=S`3c6Ma8jJ|u3P~_{uVp`iZpb!eO@#f{ z5K2LfGA8}N(dj~NsIiTS9?8PiMeVOrj4bD>Ly){wd--3j!a!c4ObOIb%evzGlVD7|0^+zTcvy^ zlf`2`Ia1Ek+3a2+cz^{Vx%H;2d~;BueQO~?f5ZDSrhBre6-IWS1Uv#oE_ zbxE*sa=2{w6MlY?3&mR1Jl@V9xQ^gqVTxfLot;+;*EgJH82gwPckUMyR|~gPM{WIQ z+t`x5A^JJ?^*gJp*%_Co1HH#}aqSBS*L)m|C$0q!Ck^a`XZ68@DdbSah&02F1!g*f z0|Bx%#yw*7Q+6X4O5;HI@7~!iWit1sq{dU4*%dx6w+7)Q4!y4*ywQ#5KRPaB3oX*$ zb@rEHEKVgJdCFOp?-#gtt~m842bQcJCLL)Wm8cw6t?+cfi4|x@M^)MhCU$T%f>h@? zx+&F^>)Y5m#zHz&IcGd@MxF{uZ|cXLYdwGc1(B=L5zloU$p~@89AVfP{TU>{;-ub1I(NKbHP8(}_9b zUvyks$s_0qXkU`I3CD>p?9>{))6m|MDxA&ozWuH=;p=*!9f4IB(6n}1xHb4kMkt;A zeSWN#+g#_?14B;1VQ7CN)GYiz!MDl;{P|bJr&Bu;b);Rs59Bspf=vn{a`}@&FkMEkn@c>99oWU)7x||vM2V#2Nv-S zm{2W|`0NKWb$G3cYUJ#>NOpI(BvvKp_)5$&nV)H9e9n0?b(1wDXIJlh2t#sYcEYZn zha!LYc?oX~-|6snZ?sVOsNs}z?`AvDXV0YLIumDPv=~z6!?j{bPE68jIW@&dbiC&V zhUp)a@rYhBVti`MQifq9OUzKlBLpH?7@09eCkP;cU_^d^8Jkfa2*VP@xBy}QYZ8FO zD3ax=bx(J^xh(g-nPB_|8~9S()0S(JubJm{T|^OTKCyY79f&_WeeHN@whGGH!{6sDmQlIe6U!nP55scgI6$El_M@_CU5G!|=AJ>Q zpaEpr(6EGOD04Jozgq8j>(&E9(}F{$`$8pGU=@=LDZb*dAqb{4jpx)2g4gqQ5e&xN8?aZqm^0xS_?5mn0)Mli*wf-((qnCKezvG)JSI z@z|TC%4(I|JX>`M5Qq6+5#VbVktOrUZrQz{vAb`1zWDmz3w`fSw~}?46(C!&CO91s z5M9_yZW7!{ar{x?&EzF>M_|#BfVGl7R4~)OTsXnpo|!;i*$vNh{Hb^>qoZTgWCxu0uoPVc?=SB{3P(8eR)7#qZJs&c-b*^kSEOY+N;!c=skC zuO**b8EF}4&lc5t6QP!mnU$85Tf?~ayj2kmU6pv*mwQpJr*F&-ie0A|>&wj{tCBm& ziN2jbTlw8Jd)&{zP9VI_Ok>1rJ8k-IRFl{Q%Cs1V!FgDEmRKTetfZOtHr829ExJ`7 z(s^4sSK^*XDB1u#Z!>co4tJKY6<+lN@=KGql@}W!M!)iWQ;hhzUn92Z^;HmLOw(ggjxm zz$9js=gI7GT?k+O&pc#=fMPN*U|U%#d;-k7Xmy{u?8Ci{HjS=-X2cdOIGpSH;dl6^Wv&ZZ@zjpwDkLuI|+@~0?>ZxpDl3W+~kAfMbpLZ zYM}#_jJlO|#`NssLjSJbvLXb5tw2I1X+mQ_himwKw+3lYk6-Yq{(TcWAD zKa2}6fbpKyJA4+}~L_bj5oS$q58NY&IMf})H@qDrVg-R5~UA~G}ySvMQ|QI8w5K_RemK3yEX_=h0_zQ z9oI%31YFulv|azKC>v<_NiTkz z{UJS0@B#~?VrEwn)(XZ|(Z>sl&psRyzd7&w2k->Y#}Dk9&Ro1#(?)cj_;&^x6yCp# z4tf&X)uo>yxX_+IHtl<2HjA)ZE)c3sw}Z9%_>vHoqenG~-w zHbc33`4oBdSLAFPw42#xsxV3K7nn3nAbJu-jIMjgbx#VT@{vlq`i9U~C=0`JEy^~V z<&LGMa9YEl73d{wQ1C+lv5K7P^?#zer*o09&AS|5>B;)5C!}Af$SD=ixVlL`uf?vTehcl1N#8D~XQxkdjW*A7HNp4MDA zS(?q(^q*QFpLREHyxNirAf&^~Qc%moVk2RtVI<7}z{3E53E?OZcm~Uw8K0&~QvhEG z_`uCL0(J(M;^S(O2t+xGfT%-Co}$;0VvoMd!p42Kb9s@^`HqIaUy7fe5*O|L=Mo4% zxzkL7u9W-mrqH=E^YM$>eMgPYep^s;6Sg^(EJW?C8swXCbdHg`IgKY>h0bZ7X1MMx z&owt4-QClx4uZ(sM&hC~;A*ahBb}F}DbHvKeXltk!zY>pYUvWbwxV*mv!1t$p=b|^ zTzz>Bg5OAp+b>wpZeO-N_*T zzijJ2Kr{I9UifQsmQ_^vnr3f(NORwuRjBOdII}2N_U|U_`^Mmig2h(+m@PMo1RK?E@ILYs zJ1nteV;bqtAuVY9)31o4dO2^M1WIqg67ZV*pqz{+oDqj9q%p`$BJe-GIt^?O z1~G=QV;bZDpwt%EQ4rUKG)#yY3v6uIm2j)*Sr<_%qd3|46NMn-yc9?h44X zk}N&Sv9>4vWa!b88 z-kIuc`PvC53n`)FmEXOWF>)MQRjY5iygDH%DQQW}D?{h+A`S0PnVXkx=xvr;TDsj; z8yFd_j%7cUuug4%S?vN|_}#r~LH}%%a$PXq*7oEwta=NJ6&}tu7O8lW<`M+YmepNn zipP0DvuIjYFKHH{YB0NM{Hf#QA@)GFYOY(VQL|&M&Qd5m!2A5t$K`B$5BfHLZ!JrL z*eF+b(nod>DI2Z#bhQ^w2g(3@lqu+?x$9Pb_zYlUIxNCS)XA(tGytYw4ibjxEhYiO z1%`#gBLN$TGNC;vOaOvGdTh}1BF*h9;t9_ud1f;;$}G{>JaW0ng*(seyIj3P{AGKG zPTaTPgH|%5u8pUb&|jy!^KH3iCOZ1(78)8dn?%*3_MUHJ^0ZyYG>mbm==j(ib5@3| z_@-4CxFu|um;*O2X%%{P`S|{qb=|9^?}2zo1kA=GF?hV1I82F$z4Kj5tgdVH*c8Rc?2Wa% zxq$s%T7?-QE{^2!?ZlADT)h*P;|7FeXlDEgRgq!Bvx6d?K&OLhe}qI*rg&fcM&qhd z|KT>LA5>(`MaIAC2+mhT-t9c3JI_X;IjY_ff&b2XWdkr%T%MZ6Z-fbFL(q*4t&$ji~*p;`xs#Ix0NdDsM9+b3-%{%Vthq2}d z$IYuY1yxgLf^<d9pa!X&fTkwwH62e1#{IaGPKpi2AP`MBM;1u2gN$B) zjWmn}*g&#?f#{GhjeL(-;iS7E$@lLJKm1){8Pv(po=n>_{Cv93-hbT!c6n zvRysA6U*|nR9U^e7WyiJ`g*UE;`5zKh9 zstskUw^S6?(u#tmZ%$;1XPCjj( z!%Qhuzh6>aT}LUla@JlUrhZ;=q1$Ehrc>AWQ_OSxW|VWq8#VNwhg6t(q{-sVr|{iY z09UaxDP9qu08fo0Evy`jlSxKl9oC6OQ3`eh0CM0{sWQ15Pt;4rk8EUQ9L$N0XQrn_zir*L&XI^} z9gX#H4;9j!>ZgtH>2q%r_pN2(r9Cn=E>CsT;2#>MG%gsd2~CFg&512uZ!E>W&t18a zuBbenP?D?KfsW1I{8|#;3xA|uBq5>0eDkDm;QhdueP42*SW`3tt+epfT4wG;Q^=FV zBh$wFUx!+A*MI#Gtk&Bp;?;{TC^}ziR}XLhqW*%gQK|*IPp~OU`}+RzDy58*1iHsj zW^r8`rLeA&YP(03y6b*K0vI045P*8vbzQ zrL#yR*LiTAbSUK8rMx=`)!I3$jGycw+M!9am)EvU9mS4Ii8ViV4KDJNM5@4NS2p+J zI40LALFw!60!vJ<)ZZ8HJbh`%wn^%sN^t6o+FLYr5;nLbp2$kpMWLN6=b<~H4K+R) zEE=&K;FYSG!2``7%dvdoCvYox8hd_yZ}Xg)7Wdun9`bY6(`?G9>>5+1&qW~t2^?1o z9fs|dxVz0u@l( z$_Xs0`|-2;&4z}K)QO`4+`L4?3tAs=dG}s+jn6;Jk~HPO@w@y81dUTZzl|MeUApMvXR$K zuxEMoR+0HX2A|*bZ0A-@)7E=(uJX29RG${7qk2W6lp`a4Im3K{t_-y*zwIAU&B_+i z-gNpuqZOtEjUG4q_dMTU*_U)A((?8AARNlFD59Fqz*48F9Z{Gpt2gDQA=~FjFNW3o zH#Cu*y3nAX%N)0{a(SwDKEct0pII@f@D$@IZk?_=Y>j%L3cq31$WPcS=G!%AQl2Pj zR2$ve*WL)5_}fW1*&R8;>#v*cSBy}B@Vi0wW)Nz}lvhmsVUZ>&Pz!vt<|e}Nja&ZoAO zqNl7XE7e`9JVl6bVFojXavrhgBQ8CvhNPmpesHqIbsin9xU(OtG#@54nJV&_YxRg} zQLfhV7DQvFYfIH^a&A|Q#?}Kl`{Gm)ADdCQ`I^4Et75(V z@(!Npxs@Lm(ne=!gKgTt^iwz0yk40TWESSYd{XO+nrPq^oh2gfikUIyKH2&Q$R<(b z{Zy&Za?|o2yScPi>K|EIJ-+aTy`fLYl?Yh}GU^Of`2JM|JljF_P>-R%wwxkMsJ=Cva=f9F7p08Q^yySc zq3Da!sGu~usNHWl;mbf29*x?)-1Cs!vbR|~B`c2QRLeIM63=(ReZ zwPd-}r2*yb%c_&Bo)S7ahM3@vL`6NqBcoVUf0l}<)A01o=$fkf(0EVE)pgxMk(1|(}<9?+n=%9DXCb2wD*Ier}WJ^C3h0Ms?q%|L3Jd`b^ z#rc^qh?q zb4*)Sc-wP@g%IQM4hS<^_5x!|J_mxHySJUynUXj$p^7H*EnI!yWpBh9Y3<>D`7lQ4 zjGn2k)4ER;7-ScPrfPKJUmkm;nyI6l-gBm;hb=^hXHr-yS zXV4$pu83+3{hpazThq+qkg)hlPNZi2osQtMa?>Y$oreNjkNp0#utrrKa{cwqSgxOM z8f*$L&SakS?oHpewG~CQJu|=gvXfP9XRKfGf$lqjt^r(VZia28}?Os(+ ze<6`Fz|f2%o7i!)=1@vD;3`^kMtxNIv5>=Xu7f0Csa-kQ4tY*s?pPlZ^G?5n&(k-d z_^X6#tA5cRLuIvtF~2;0%yt;_ayVoc23O7sn{Mo>k527rNc6_LxK!#w@|N_+h?^)) z@m*XEj`VG)B+R{a*-TM{>t7JY-M1xp}diB7r$L`V<$2R>Va~lmI$qhD*7sY|6s#g+%n}2oSD2HF- z+cC0I zT9W_KH&_OqlxWAefgX~W-Pzw*AXB2cyzBm{Nbfe)6Se5sgDdkyo&&lkBJy6J)VE!k zEganwn#kxX=kqnnnO7EEL9PV${*6u_ia=UZb^LAqEznZuOb6OtEmW0Od0x==wtSx! z`@0}q0q{vFeM6aknS;p=v}yY8dpNBTvH{A1{PeM6OT6U+W%9e%g4pMa&b$<#)VvAA z%BR{~Y8Oot(zVY|Xwq?bD(lj+gao%9sdjBn=ZAu+@01_)v~#U&QG1vhnyP^m*}e-*{wy^q~aF2OdK)^t9=#o z$la7z$uw3j+x)p_#o?xAn%Ry&)v>+!MW-GMeLm8b@0l~?;4?v!yO~z8ax}fKpFH%6@d`*zujoPzn`eI@d-#>NZD(J6YGy)9qilx?3y%(Wb757TpdXNYdSC)w6M za`^t|VNa|NiLcLfFgQ?7`~1mQ%jAnp1bu!&SDaO|4DO+Ca$xSZ#^{zjG#OtKe0;iV zo30kiR!7F-7dL<^LgiqGG-T{`gfvwC!1T$=z`#{WUH-y9FO*dSIM;dlyF7Wzy3}1J zQPMTxcO|p=PE&42rAJLHu%bwB`cGB;c;5=s;@cMuyS)CB=I(psCLzQ=jQn6B;#}F! zc{Zq?$YuKUV9xyFB7jG+RffvlH0amt`jS+P->Q;P+oWUgfK1DNenJ7gB$S)iBgjb{ zb?7t5)y-49w4hZbb-PCs*fCSoe00C{hSOmG;M3&E9r0t-$4NI{)oXNxVo{vPbT7gp?u@L;&i69px<4PDe~OS=U|BToo2|< z(fMnxqxJjeH_rxXrb08Hr!LMJE6;vGqp#PTvudqw{T-Y)XgRNMf(t&*Z^vw#=<@ zo}T5+U83F@rF3GyY3#)YvMIy1Ql-v{Wy;2?)yDZWqU3kpj9~6}!EI>u=Fi>XAGI{l z_G?Zwn3dC!&IE)al3-NG+i-$|JTr6;no2d(jA@kd?@EJf}pJeCuwu+k;6 zm&DB7<0$FN^dfM`tAb9JacAEO3#Z&!a5iP zx^|(Y~6-|+-&o=SXh+Kfpne;zh@ z+;^6%ka-g6Pg>{u?)4z8yI9HI5Z$?72^S6TaB91Xr14V7cQl(@3KdsO2%qE2v2%G4 zM<~U)d1#xxR95dJ7M3_LFuuV%KV97f!a1tqnO3fj_ewVw&&~pf8Z(#~)c(Gj>6{wg zJ-ZoHp8IzDF}v!=k?ImUyzmD0x77Sh^4s?eOca%K0=at@h55UQz^S(AkL>*gIj2q7 zAJu_Q*@Uw#?XMZ$3uy&YjeSSC*|0V^vr~8)lm_dHTjUH``E4XYAy#=#1+mpuEgcF( z-VI8})Emo!QI>|>oBn=19l{^nhq9A_k^WS3?D`KH-&x%26Vs>5z}^GaZT8y6x&Tq0 zz22nB6hhO9T94)VvnRolm6QABR-N9++l&oiAqfFX^TnERwhqCw+jRpLxq8qEr}kaa z@fD*Zh=JR^5LD6wZ^YyMlxsMcA$#sD9^bGjS$%w0p=MbTi{)3NmA#!Vj!xl;Uk|GI z0+><+*3CH@O-vr=61@nk7)aLnEv13%Z@f8AXjg$bjta_J1KMsr_Z{s3qJ32esQ7FqsyKc zxXZIH6mDJ3j#7B1jj_*Pb3&at5nF&N^8-J`>*E@xP0F-O&#ndnw#g#CkA0exy$ zDz>5>)>TR>Nezn%GpuvV`#8+RTZ<0WddmYr%9D<|arWR)oZ!m2U8<*%WAl>RQ)#M?s&Gla|Gqn9u+D^$_Y<0t zJrfUZ8SE)Hi;`Y-g-u1jnizQ{OC-1~(%6o~og$NG0H9BQr%Bb6YH0vpS!AuP5wNm$ zMsKDwykzs8y~_e3hTHlEK57w&UX;l){r_N=Kuur*%SpUun6m zz?5x~O@@w(ku{KLsH!D2ZC3rXhHiX%pe3|2)FetbNLa|9_VI>X)xNVJj1#hD%9L$B z)+q7g5&|sNGZLhwmo$6**_%+zHiG$CPaMqw2zWl5%F$PLP&%&VxWi*o##vTj<{HcC zihoxD2!D41rD*H9!{|_hkwCS_lL_?3LBb%C&z6*haI;7HO!9F`Q}xlb+_2~AzJdss zot-n2$#nSiD4w@^rNfy>^%06xtx>e>0>rBz;R_XLqP4L)2jBX0vr;1>$+_AH4Reu< zE=5~j(33%P@yXv8E+Dn-(-ZSr_>5{JP1R?Upg48F`uW*vOjKV!!1miUpdYiU{@dF- ziIkS7KY?^BQ!SwQ#0|dz`7&nz%CvY6h*Q5~J`z}u;I|ocB&75fJEps5sm((coVX{h zZTl4-*Nks7%IZxwT92JZbKbZXU4W9B(=Oez0u;XFN z;oWb?s3d&r&Yr8oc}LaH(t+|JE4D`&K66c0Jy<=H)}`bn`T6A#J3)v@;MK_`h#BwN zvHd8fcHD407(daSi7<{{!$PTL;>?+#a+&)($B*e&2D|xYdE8I)rx(t>Sq7~Nm^6SN zSg>|+h8177Q#^E$RnslXFEw3Zm<%R4AJcy(uucRLLm*IwNqlj!TNT`go@Id5_@T*6 zcG^WvAnvx;&nX8>n>&!q*M)^rS(^%G--iP8*P6pF&eLnU3T?}HRie*G(i*dZhGz$= zlAi8Ob0tGR54?`Mhbz3hed>i8J#dN_tR7wzM+mYjyB9b&x+(>!MHmR{dh(wh;DCfC zqJ7HPS%j!(*}HEhC+Vc?GqOsqDk^TAMw^F?mGnry8=-wT1KLL4SZ z9i4^mSCpzY*SJlEsuILYlM4$ple|k>I&!`8{!ZHepk!?hv1_ig?s3zDTs@7ow`}lj z>{?o|b~Og`kxg@Qy8PnbbQkokjcCj*?Uwx2>=b|m#U0r^hEY#$iGpV6ou1zpsxs_bq4CoTxxW_qb)O8q}Vi&^9N7wU-B6$2f zwO){ZtS#s)@q5|$ZRocq&sz#Tw{2{{*GTu1P9WzX#W8%9^(}3;Szn!8v}a0tW^yJB zH+RTnEtNO6grQPxS^gH-#?vcOz~AD*fL`2wB-t6~U3x^g_vD9WYua#l|D4xG?e*SV ztGKj8FbYKht|R41jp;Pf=_)*C?U0o?zM1rQ4GVMAS9doKQ1e#txWbwJhH%2_tI;u( zHPL`>Tw5O3HgA4BIW^~aSCEv6+FttI_p*L8Cwe1NjrB{)vYpVmEc*t?GKi9ciUK*e$nqAn4qWL50v~Ky!b>^LPGIvFAy~lcnnJtg# zPF$4tL<%h1t@U-W+a>$m#!O29JXjN$v5yw&(&h3>7uwwFmZTiQ@IQQzIv(Bj&0UKw9tFD zrrmlY<)g3-(4gHNTz@RXnvUxsv^CNwtGl{jD_8$~F6Khpl zrYXxujpfhfPHTiCtx#f02_o2VhGs4<^=VxyEZxJOWk;=l;N=ddJ+2#zJ&bd*rga9H z8Qbx=@!cnf$A`ZE(Hcg1`OsLwT@0D8&5Qc9T&)je^e>Bvfm@IQCFrwkO}i=)Za#H6Yzod??!CyO&vONfJ_MlMIcmEKVl`?U8wHcK zOnV; z7shpqP<7TPbtcKvW(6=1jH!ZIm!Q8@Tb`YsY6G1-J@1nLZp;qNZE}kTO2=uVtUuLD zX7CW!=r+`1*K0f4?L>UdVJF1n!m-|r>xRIH0#hv_<{6(^gh}QPmu*XDOi}KNrI(!U zhfoSb)5Z=3jqLkFQSL zx8$x&CWZAaHGt?|!Vvs{$tJ2)v5Ex!I z&s!zUfLC>_IR)G{4wi!o3lwQ|R23UDA^slC1P#g=1?) zM>jlIrQ_U6%>oQGpSv>R1W(4SpYnl(^?1}(JW~yfM$89(P5m-$}vPtF~my0M98?X#h8f z`FJSei!ZHsV&;Kh)Vz-F(30_n?%vTLKTfAoYEbd!n&+QN!-_Lk0xwOc0{-=LKYLHS zFH#+DwE&0d8bmd)ZYfVT_ap8@*1HN8U-p-gM&k=-PR%2mwB~6GinA^Gc=?}`a?K0g z{Nh2}-wldl^Bb0Jf>ys$oO<{&wkX$brTMbAc&RS%*-{#D%S{a-{%&Dj_SB%$?V*W% zO<(dfx9Y!;iNo#iP@X2}BgDc()IqARsZPP@gmIxs*j_Z0tg{j8%&s4@r|LW%`y4gD zPNHtR<)C#LCl-rZ;q%nnctj@QOU50%FKTJl1)TndZuz{DG<)1q)A&NlH)?i&taDjb zwS=q1D&xMXz5TW(M?!N|5F|5dk%XLr2DHe;b?uY4&94`%gMCKT4K^@B@cSh8w!c$0 zBRPZWN0K)qL{_Y43oq;9fX89kAfXtYI6pl~~j&Z*ViAJTM$@ z-H^BfO`_|E4jS;;HkMU3lc>S6F$>C z*%@sO0*&W9Uw=J~sR?LCUdCkX-Y{Q#rWJbBPCG40HsQL0`bFuiE(vGcg5^nr1|Q(P!`kh$H=h1r=4Ndf_@Ji4@TSax1GpV&(X2^3 z5q^x;b@G9Fl9YY+vtdZx#5l7+=BpB+fK*b+{^8XFU09~lscTZ9>b3~8Rz0AVpRP3y zSAUDYHPD}@d+8%~77XAPY*B$*aC zY_u(WEq)uP8s&cWM>G~cT9{;u4pYYaO;WTOzAdk|Dlh?=RE6X83Q5n1xpud%EU$>J zSV>g=v9Tq^@dLQ9Eo!I0A<0nDPzQ0M$8o`pO~3Ndpgo<{>$j;X%bIVkFngPC?iV6I zql}_1vpcQx4h`*zpFG+N=V(f~FB&p3aDS)(b5CrEQcpV2Ny{{{a2*$)OwmMkHU7rsSMd&8J;Jt5>Mp3e!hXzFACk^v=?|SE za3=G7W~GvxA17|Im8I@@=&d>hFEj|SyR{dKxM5Wj@_*lsl^m2?jcigm+e9g8t+7$| z8$@Y(fFrP6gtO7CW*g&dgXxz!87gFJJl_*Rl|9v(dS-+NO0C2)3a`@m;J@Eu?vr+$ zP`h0o*9L9-=+cTbUDr-c9^X?qVp5qfy5Dj^*XY*6XrJeO#yE^D$x9v^kV6=d!?sBM z#FqL=z#2oEpBi&0gnsW23VbvnT?iKmx!u+$J3c470xk|xo>c}oB=pZtv|;nv73 z4OA=*zSNflOsV9teK9zgU3_#5F31QXVq-oq6uT%<(S*EEJh=EF%@T-aUldW~)L?T$ zs3A~pJ90BfjHp@2*l!prIVed8x&(Ia2e~@zj~|lQQes8PgRo*|@lq(CBtpoUKf#0$ zp@njhAU3(eWurq`Z6UU}z~yp7q=wB7`7gc#22Fc910l>T2Pbu9x~?Z-Jt1Aqju>Bm znI0Ji(g_|Sf!UfsvNe0vL8aQElP&J_+)iqkTHQPhLO?$RCV;^PivnR|lTrG#HFa{V zNstd!K*=~RPSFY*N>7a{1^5yj0t&&Pf)W?!ihxVS#z-!LP?aSYLC&vJ^$0)xPFBI^ zAto35?~$4wB5`z@B-DQZRM-%8>fZxm5S~YvPgLxf%&5?27?7ZxUAVyzBFF-|!1547 zt$u?s|2;DBn|u)((&|9|-*n6&2r^X2fgpr95|ShQh5%V1fMTdI=pPjH)X+JQ0pSpk zI%u$1rPpw|t=Kud1ibQ{y88`qH{5|{`|Ttg%!jQ3>1EXQ`t}LZ*hy4#>i^7(Sg!n({AhGM=;q?ETE`(DQ7NsAq z2oV_pqWu4ii%=p2qGHH`|1bR)jS86*gvkZcjY0|*8yXT4@c+sFPlK4$PXvgfn_wgG zd2lV9_~2H*g+l+P9RN8;LFGb%2b$r+AeI65KQ(@~R>{}wwOF2_XYMWI;w1bQtu4T& zjoc1}0V>w(Pit0X_2g1%rQGD21Z$^jvvj!4FWN^LJY9BNtR-VA!~*E{}&tI^ZybbAww)< z8%i89D=~3MHB@LgP32S!9ER8+0=_s5n;a)>7!TXo56FDUe`9dMMnK7_!I7v#Lt51S zSAb0&L(H6tL88V`gAIccgZvaK$A|n!Gy=r1Afa_Y>LOSfv%%l}w2*(#e+q<#ftsv< z3JoE*g8C0uE(XHNUBKWmgQ%Dd?mulqcrPJ|4JrhZLl!0k=D#8&!TKfB87@KVV}^Vp zNBs2%3I#6YfA#+-L;1f7|1mN^0$K6@ujc>f@xSpPk7oZXlK(INfA{*2{R#pf`#;_O z>j)X@f88JkKn{`Q|5(BQYC<5qSP+YV3Wku}@?bzg!+!b%4Fe%H`vmQ!-*_MBH%{{2PSI}gHU{CKHL51@A$o+!B|e%!G#eCCkP9Yw5FH$uMHjNz6;Gp%bY# zYFfL_*=1E$09A%HzQFlx)ewhsP7$_n2vOJthl-f`Iam9gA!Dxjx;(}L;7+83U#&8RT7z@}Fa-j+#3 z!Ud1`;S!}dwbo=PIO-RZp22(&Des0OM5mIJiPj|HxLA79=JMt^;hH7c*fCRHQgVer z0h^b=+_!hs?nNnM(Vb`gE;?5)<@&D6hc@(XrK>yd$e^vliY&#NWG*3>UgFrrV(wga zt`gL_zbk0_9h>$aWV>j{ePN5B>L8M%UsoDCy-g zNGA&aO_Jooa0`$&AOC}l@84EjI(Y?Rw{g}1-!8c*jwm7+5p#TvNcs>uCK$b?|J9B% z;r2F4&bLncu_iO}4{9@!CptJUCd8DN$RPIO%Opt1JZJ$mCpgMI!r@Ic zjm^rb8-gFLa8ZmNFeSB(?_scVa62t+>zGoH9I9GL%Z^6CoH+WBQeAVLkh*N#j5Vo} zUi_vgl%RK>7j^4C595U?68FQ_VK*twlCIG)N~*Ex;yu3V{V~+tU{TaEPeNmb( zR1H?8^f1m?ECdG5j&2cjm;HmXeSN1FIiNhte|iIs&*e*!$4le`Xyd#6=Qz7WURg;O zIv=@guvSJbMA;+>en-k;-}L^>?#e>WGtAZm-@NnWXT`X)z)SKiH9ub=vuMWbcchDu zh0pA|+n@f{=^(=?9k1O?Tp?05*&(itn+Zl)8$5J4vJ0g7y_}=^2zEjmB#XkyiKG2{ zQOqMN8YdKBo#r!ngGS%I>CcaA2%QMDAWQ+>v}1s|9Mnc^ZT9p>CfYaw+u+P50v5rE zlG40mX`DReTo~fWv5a2ni~JR<`3F_ep@b=@n%x0>lo@cl2Z6@~*yyo1yfSs{#T?$~ zi$HzmfCYN`A%73_=n<>j-Na%bDgVaYxQ-3Ts(jLO4= z*VDe(2WIY^%#_zxB&fyRJ4-wqB|LV^_bCNfIBw$7ANuDhqFB<}QO2bh?Yr}k08TPk zkO5XcqawGeZ%sp3BU2S0ir;tpOq0IVY`P!+VWDi0MU1EnEB`oqmg9Ewrfbsm4(5$d zJk0eekbVxmeMz|)=j6n0VVLB$88u046RZ_Td2Kx}PwuLSn0Y#MgSd(dBs7z#5b?dP z;LH1#yqpO=TU$32Ck#B+>#0KJu4KweEkwb z!iuvmS(ldGm=@={%|rVwI&N*q{qFtGqa*-kg=WVkIIs3YTnN7s^D?ais`;24vg3cL z>7t8e5~8AYn~Umz9NlNZfS@V$o~y`8JgM!A9dVWjFSFd!50O6CQr0d@N1RD~6J(21 zT=CyiI5!6{_)qnnez&&-il%k0TMBu61bLBLfzM=}!#c(ab_ z99Q~O9Tv4PWGs^I=X<=MH~^g80NvHq2UK`|+f+R^N_=yZS8+(OywwEvJt6vaO@hY; zq2<32gf;h-bYkV(bPyR?-V!(KJl^C>=G?azH?l@YszTqzTchkMWA;-%S-1W_sfE3( ztFNzyDI?~!^L=WgruQYcwkf^E?S1RShGa_L7iCNB&8&-aJ47q zBzg(nKgaJ;jw$HufV~*?!kupgQ%oi`Q#!RqB$f<#6G0SvO=6luY8ZQG0ZzU`u|+Xy z1#)S-G#a3F@e9~(Da+~??&xzF(yWKo&;r66PX^<>r^*bv48xyOzk$Ij*qCNEN4^<3 zc^y9PVY|S%QF$FF$KDFUt1pUwILh%dFoXW+e(`sg*jB_6b;Nv`-54^1@UgHil-n^H zfL9$JZRukXsb8F(odbL81l4}Zcvut#$Sm2u%eoSDIivTZU-ud|>*&z7;w9kyY(GVC z4eofVyyfS3W&QIHO3apWZxy3C!_^dr1jy6*Qf7DGfgT1Y1}M$g3JzQ`VL%G~f5Y|68Z8>f7R&eJPLoE5ZBgAX z+7m3@%AIVg`8DDL_L35lYKE+kVSO&ncViJmReb(IX$XalTsHg`ty%bs;*^jH#1tGi z+IOq)!fxuTa{v1`R-S1q7msE<;Pf3ZGL)yQg}UU^wuQyBwW_E89-8YkLHRuX8e-a< zu`TLL`>Yqd$wPd=bLQIQ6^IOTI=IH^EU=zf*TgR2)`O8+_t5n{j>>NsIV+pOx7E_(1KjnRq5rdb~K*mpn0p5Z_J6G&Ttz@R7tF@h(5a z{P!P}5>wLpkEyD`qTr6HR@qUV!&!5h7GFUQWsFchGL2g#TMvp@rF4Z`6jvKW#vR5x z&$QZZ&DFc^X1qw!61>mbwS_vdB(e;by=M7(apO@f%1o2~eJSxI!tj0}mm=;Hn? z4sT8D6|}RLr#R-BY=4n?6Z>(56}F%F)_0$O-%(y88_htIyq6Vfc5AJ0K|CGEOAl;( zA`p7Cq}8|UU|}LQ|uq-PvqJdH%Gj5u!f9a1%Tu&uz zPfG5}7B2xq@v2C5qVKxai`-Tx@+LOb7K{~#s5jOHIhx_SgFG65Fdp<#YF zCauP8jrS&8yN=nHs(sI z>gc$CQ0g~UZ>2d?c{NHC>GD^~qG-)=Mcli*$N+6so1XRpj0SVAlFH~}$*T`^#>k() zMUJv~+9u??zCI@Js5d)zIm`Zonnd+EA3laSKf z)^if!KcD89H4i)L>GHLnO)NCjQE(J@JG=;wNqcTsb zO@N!5^e1itY&=rr{uag8{}kuW3s|{OPN`1>NrFnj-eMG`hOftTvfgK#N$H=-JI2;! zJ8~HEY&N>{0blCxa$$5w)9)kuW?qe!9eUvsSmg6&#wWZ{W4IYI#4>yDnC-8=YZnN!@+XDGaD5dO2)GbDN9rG!rj?_K_|@w34p3F|`^A^MS= z@Aw;s;59G2RHe-*HCnR_q**<)dX6-<-D5*+^Pu~5D?zcp?Z3cbxkmM(#IeZPbxU@R z2K0pkpF7wz#G^(wCw;2M9hCCdJ0z;q-3?q#2=?-Jizx~$4o|F*JCF|XsPBaEiEZp| z1E{E!tjeJzcN7r;|=|7sfi zKKgqknWS{SbK1IQoF0SL>;vcC)s>+1X3Ply>-QADHk3 zNEE|6Y5_-pOEO3;>Gq5KE=;gXhnOjcJ)rZvK&icDQ&f zjyPY05)XF6M;;4P%wV$dHCg1&Q51DW*&EtkVU0KAp=oV?7d*x%R#~W>l*Zw)KJ;xa ziHmbn6+vXbPqiJSNON_I>}xj947SAXGzventgLev%??-%3uZo>;m7CkMZ`zM|C!xa zw`3UA*EoFMF~#B=eUB?&W^9uIDYVQm)qQBr50ASiT1ge2s9xSD?VBDo^0u0^zkEpN z0#JlB*?bKgj%0d8pM{iSDb9tF9&E8A4F{1PT{no2y7}Zx zBTRSOO>nYeP(^diLH8Y6FAJ&G#E!S>iv`G9HYYcC#<#iN+ERQrF}c;P=K@++OGmlJ zJ8!f^8jze~G$-g8FB$g!nAApQ?D-VGA5rQGn?8E`+|U1aT_$5piHCx{l^qo+%5Kc^3GEfX|;St-*pGYFX&pLSGBDB}Uz9E{1`xZ+tRqCZ<;Z-%4$}97(1D|6!#JKitOnmOp zMSAF9iaYjJJKItI57t4=+pwa?m@H!@ROp0>W13TIoU(Zdasgl|$ej{=<^Js=&`;XN z=fyo9{`mgaCiSLD0V}2>Rq~s1-P4Uep9i*yjKzoYJ4f0!2tThUK1haOkLoIc|6O1%$t@=T-?4YoIM7Ra%71(4>Og)p0w593P>CvI>RTCky48xq z{F@n@Z|TcJMZJuCkX{Rp%fF$jrwf@%WF@TIkP-0Sz>&T3JQtd`I!EEFzK0dLzNYHU zpkf!no#tePGpMxnoB(=yu;s~O?%D_0=CdXGG-Xv4$MR5WJHBK#f2+v-`325r{Q476 zv_Q`|)RJB?B`T85;*WH4Zge6H2SL1>$FD(l9*%J{9~RttK`Mt4^{4}Wx!)U_>x5^H z6eu31L~Q%~cInAHX}&T9Q$XS@ST|nt0vBa(N%q>i=i`(|Q<>ljtfcK}vdYA!)CGaq zF6`j5Tm5ytsQSr3GAjK|F&lfgy78@~0*iNC$yoPa%_+=uAEOhjc{htgHY3O#XyWsW zxQ8=afJ9XmjhVd$8Km~w&EME;ypuJ9H{nit?dgad#s$389rb!YB3=ri6rc%Rkq+w}(hyR@mFV|Mc8vlJ$~_ z>|I`7oYHB53fvs3g(GBV^c69{xx2GvI64xN(;UiIAV5yocgpO`S^|zU*KYF{jUbeakr*nT8TR19q8fR$Z1Ke zoXo{Lhfy3q$ZZ)Wmf>eu@bSOGJi#?SZ?ox^wQQ z=#1?D#A_;cg^)M1)nTTk%EgamUmhHUPJvaiJIOVC@`LvMc)l{Jk$4h7ZX7et>y39Y zr_E?%>k7#N@{J7A3gY`JX3+Clx`>k(CLMiD2l{=O(~2LA4aQN9ZMI{FNAjjv5A?KM zuKjYc+2(kdX4_=tluXhd1#jmyY?e$~088r&VzfIK0U)V2y|-1x`$vMY0wKU_ApHI$ zRwghW=$Ij!y{GAHU#3iDKe_?;?!Ju(`z-Y*NTvVEOag`4LBOUU{Ak5-@RVu#Pi8jv zKK!0k%FZ`Odc1~rUY&MSX3j79qq;i)Xs;IV)V}eC|?hcD)Ew zZlBB7N!BA4qx}Hs=4TWYR;=j6pj7jJ991@s(>Fnk?Ld=xY!4LvBpD4x~!)T45R@ftfP<99S)zEO+- zZT)X^3LT`Fr?9CV1X7n2GLuAj=WQ&^Syt?t`*{c6#(`C~UoFhPxnc6!HVVJZ9aN)| zx4Yw0&K#<824)Yvw*{Rbeq&A+_u3*Y208p~z}van@x<0ps3p*~D;EI1RCo&vO;zMe zxf1QdOcvA|$2?aUPG!6k7?dTLAYa_)fjLwr__mdTWvo{<2b@t?Qjv+>%j5H%3dw&6 ztkijubw1i!O`onodFe>je8#l@Vd`^@>Xl3JH3H(w<3g;hs5zf+R4TwG*=Nj7kc|fE zjfgT%52nW3z%f~q*7Evg<9G9Dm9J)?qw=^M)_yhLdIUC)n#kMKr+Z&g+N0*aYroD} z*4)|^awi`6p4|QVFdiwLUMS!Pw#g<(ifbN*S!9s@J_d?LJ;~Vd2XX)5lpeE2i4;tM zJ#YcH-F^o%F1!EQk^3b}naKFeSAS5nPlHDb=I_t_oIZtPcQ9;o{rBuo?i%xmCSJ&( z?obdRO88C`J`Ek|?!I`)ZVy@}Oe0OlUsxulU{vP%gbwE(A*j62Tr!zujVnbG5tai9 z!`vPlZ#?6+z5wT^MBc3NLQe;I7bkSA#^~@v6WtxAp%3T838;lOQ{2}&uOB14Pk*Ue z(fmVHO;DYA@{C{Fhrb;(iaFgzr8F6ZCy_y}*C;`^3Yx)x^eOkT`t6Q6ru8N^5}s9} z)H_p&n`knqFe!7Zbq1mHhP)w;EF#KWNVEoC{s)C5{n41W)2v9xy+N#g3a0Bnbg*XJ3ds}qW(_*SM6Ca0n!KsL7!VwWE;^`cU^=STsQn^u39n2Ffe&ZSF;@wLmPA?o3 z(sD~e`i;WwCWO7{WEz`S5bI+-b5v{H=*5tT?<}F|eWkjEW8oENX7$1{O#_8}`z?r_ zR9KO&%fIq#MPP$=Y=Gxl-~elynIlXZB3%_xE|Z;uWY(x;N~+(nQoKJ!!>#qFoFZ8Y0ME))1IjAX(*Dc_9XQmjk$aBAqN~ zds9xcE|Q`CLm&LzgksC=-4}HW}PKlPpR(Ek=nM4)358OxTg!HOhDCgo-kyS6tcnU=&94 z97udk-B{Saf7_t985lie565=L^(}*)Dt~Zo*h-Sgy)4^=2v;J^3vWNKQ$&=Gd2D6O z_8`N-;{bG_>KL~=G#|x+kI2DIo@lwyts8MV_u~->v1S}r;&7hf`FV1BPAPhagLCl{4PcbwI-SRk0DEBv0V8`CT5%6&COFVSwM$%E6jNeLaH^Cm!` zs{v+c9mJ6Ce_Od7=kN{bmGRR^&N3WjtCFwf zT1nK>5R4nY!CUBhYsp{vu==>ZTI9g8vxs099IBXI1n#V;g;Y*SYE|0& zyloyS%1J?8w`5Y)D?;_Bwfa;P<c3?QFc;5g^oz5hx%cV_w`vl~@P~V> zyD%9pu9R!RWr$DyMVPQj$PmlVYAh5og0lMuSk2TFnL>YarFQedM5{?*(*50W{H5{6 zN+rg%b^|6Op$Z&3Dcbc~^}e#E)A3a@?kn-hj>B+hsGKxa^J}FuU(oS;mqpS)DBAa- z(~t3F)wMiI&wcErEpcL{FPbs4C=ys>f8w+G^C#YCB{PC9lfzf)vDDWaq;A&Y*NT#_ zb%|VwkClbyjK0+Ki-}fR7_w616sS`8BoySEa}EFrmV5NUW9tnjC5V_ku-B_C;lg_n z8ey&ywe+=~HmGz`2GX3AKVz*locT+rO-`chLIuCRTGyU}Max8KdC%CII|k6HHQ1pR z>b#lZT>O?ivVA!;BQT;x7bb@Gf`z@}JMxkm7%qf7e)%MV{|gz_ihUF!LF0&wTXF=Y6}r%wYuecC(WUn z*Ej+ZjC~0Lqq0d;?um4Xp2WdKk@(f>NkqhrbG=tv`dB}F9+TE2KHf5T8?#s~@gC8w zS%Lqc4j+vt*mjx&`)~F!(d}$M4s{sgZ5k#RQy#{&Amq@eklsGC5%Sp^@81 zFVQ~@{5Iene>9*MQ19o)NnwrR(1KJZau1E@FO;L9T27OuNtc4zFuuG{`6NRh@nuXJ z94RNN**~{Xu&8{g_eN(m;ynWTv($8{Ld^Q$`)V|OT?27!g9pkd7DBC_osrVreI2rq z^o{cLzuBEd&yS1HUmsnWm=kGKjV#D>#>*!DHtHeq({cAcw+zVq8%Zc$drGkW4+`(c zdR*d%Q9wz|3|EID2Mg1H-X?E*?D#YIr#HDeWw(`QGgs`8@xs%F>5Y{@N*#E$0YgF5gA~AP@gvEj zl#6`kn&9>MqgRTcz~82;@w_RSZMuN8L?Cz0bG%-3W=2agngssDRH2ZqjgI<;w_6*= z`2K-B+^iYEu(`?>4Z!~bocB57o+LkF^8V)f5SdeGm^iUJ zMD+B|hrT%!@AJ@5Si=5+oeyh{L$@hO7;z(Y85K?ybDj|($uiP(sDsK;A9>9Y+Azu7 zQ8{n=2-sTWpkeMdtxqpqGr*Bb0PsvV9v*gK9)(S|2F9jxoc(Ea(v5GN;7mlDiMUw4 zU+7mmYI)eoKWhQZ#_appw*V&<)H+m2EDoy~^?OjTMYwAb=ubk(%ZbQBJ73t@Vv8g~ zUy4XUn9eHi`F-kKex}w3^Bi6h77F6GY_7r4O#}L}&*aX(coqvTejg2>FpNiFJsOzX z8pq7~Q@!hXwZ$Eft@$@MpFe+`n|$OK+tYc#;oR741aj5vq+-5pCa*>VROlsm64vV@ zP|^!5Dm=zW^$2RmIexf>kz(gkS4N+z;>nYe0(;h3iSz4ZLS>3P5np9_lJy_`{iQ9} zj@Iolq=r0qH&DG6(|Ibwl*G%FVgySdjG#2lzXaI=0sbP7Qtx^B`O(O~c@+4(mv#fC zpMA()AjrYe<^hGt_Prq|%YKK>+(-+H_+Q&_MFwGs5%}HGSey4xthaHQzn!zm;3~l$ zK_eTsIQ11NlE3<>Pga5uru|#nHC6MAtTBL9+Ua(Q|`V_@DTM#I^Pr?~c z%=rlQIKKdu)}^A@8TaJ#K0eF)i?>yGP8lyz%4PU1NA=#ip6&&Tp%D87zZP~a=#9!5h?IrH5551j{yli4^*)|Zl3%c3K>$wn z6~M}Sl2Qbp^5&;DOdP#lifQoq(AzAM9d(o=c5(ooo~=y9Iwh;6+MLYY6993t>j z#xBC3{mv3Tn?r!5kTp0!T}&hWe%2Y22ErQrcA$|Crn|WL7LbZ;~$jMfhFq|tTR!tQ>kSz7?|{9F5D6W%ux`1alr9hE*W`X z&m>Z`J&KFG=ZC_=;yO(gdBl*zEZg>&yT#Xedi|vQQ=G!{Y@sFDKi!7%2Ab2cgJ)Xi z#PA~S0`$5avt!%Ccal3=#Q09Zep1_>Y`}vT(-MC_Pg?Fx9#8(ocvHU&!=(7BoyuOm zaApmqwEJDpMGd5JpPGEp2HNm8^uz#Cv0H!8!1fQy9K?E<;{#kU3X8e%=Pxz0W8xR= zoo(*i(YiYcNR*G0^XJ&O;x|ywK&=iN$-SQ2w6<`AS(Dk8>c8fsv)yRhB-?PF>sd_p z*L9|Z_y?Xe1xKP^fdpeFUbv~c34QEv=3_+7U}U%L)?X&tDY;nFJWJR*)r*mo*8ZK$rSX$h2v9gEWckIWeEyqN>N*N_a1P5 zNpx;0noeXX`+A!pEOfBXH!7bFINN{E{-6~#OCK@^?5}&JylFtQi@ay+CxGKaGedqL zgm?J}c3JMh-zT4*k5V@D!*C@ucDWn$ElpBen0D-_fLdE$rDxl=K29LCXL>!+&yN=f4Rx~-C*=k9!n@4kq z4SokjWXZay5`SR4xSnH`x)Nad60O_i5o6IxoRC1%vN~6&bNu*P1qn{S=zcM=UCC^^ zcuif5$3;~-SyMX67uZfIezb5YWA9AwDSpQX<7W#36x;tnnbO(Xqal4eCRL#uMd-HhlQJPf8LQ+|WbH7Q_(5{ac}~ z(Z+RBMuX0EbBILSboC#U-(}@_WxPzYg0oQ4JjG?}qf&ksCx_bteOQMo6+tjd4;aqe z`AXtTv}tWxV500=lht(SqV{ktdj&NT+KUKR{E8IYcnACO1g$zK-j349f? z?-YL*FJ<-#g~(}qQ2ULaXWz;h6Q8%(S-UQs%72LZZwy5iqp?;;c>=>Q&Cz2hJY@j& zK2=eyNHaQi?bNCepmBqBOT1pj3PFCF`r^~{V^|eKYeZ6V2rl6_4}^BMt-lLH1U*9 zP4D*>)3jd3P1KBigW}EZ`f+`xbxxy46^n&r+$01lB~&)5#-HNzpH`lKcb!K%Ya2x> zl+&NN9){6upXm${o;kkN>Kx5oqpY4+knp$@p8a}Nbffv zH^TMB-3V!BYmJ&Y82V4_w#>cL3$wAXBZykYrd( zKARjlnr|k^PQH`xz6F7S1RE!Y!?;l|ne}8QPz;RL9BW zDA`2HvoeSFoW9oVd(Ahy%kDCvoq4^EW#m%Kq%FVM3F%EIik%1t$yXZkERI*K_3|?s z!}6Q<QHx4K<+Td)pSDLQ<9XC0TD!BrbfDH7<)Xd4)SVR=cz#cBc)(=n07)+ zAGdFhcH29C<`_qUd>KpG2H{)Ck%hm!eKT$BYv(rYuM(^MMe{=$K|j3p&No{(q?y# z5!n&Bf!g_b2vD>#4^|c1Ytx$Og_%PU%`DI9U%Kw=s+JOqC&gK1iX$+m#hcbyU)MWQo|-jYz=EXdXD4IlbyhwvJ}$X2zA9 zJ9%c>@+OfqiRMKj?xZyoY*o}Tc_zELuh4`-9!Hr7s0;X&XCF(6hyMU{mgBMK1`71@ zF!Y!Ge<{Jmm8ZyY4@#|BD^`}DsE#Vq))wK>R#KlvJ1*}zoJwm_5PJ4fWo$}OU%Me%9*y&`>!WfBKDDW(Mcy&1iop1#Eq!(1Jy8j36I>(<7)EvJ^T1v6e=V5 zfp$#)05L5N-?Kl*drtn+I+jzB2&akFqw5x0flnn`qE%Xq#d2t+hDx=b-1e!-P_fxB z7~ZD!Qx|m|hBtlJJ~VZ$J)k={XNpU6onH+17$~(deD+r(m5wAC6LylU@kta-khItM z(O@9_${Cx9V(+&D8g1)w|ss?ncgPJIEzJ~ zmTzb(*zWN9cR9)kjt^PJxvbg9U#SW#ZLB7BBHz@UzdSpJsP zh~b`CvAraY!IK0G1Q_bBQ9W=?ZYNJ9Oor?%R%ktyCNf|jLfwimh+>M&iTzATrZ*I3oJRCPAmC8@Y zD&Z;Mq@K)0`(*gGLioaS<{C!B>jzv|j3d&hSa& zRm->tsblP{$MA{Sq>=sN9k4drC1Xmfk)io9I(O`uX%w1F?C6Wzdqp6+?21Ik-Ev9= zJQ4xckpBQY~Yc0&>jxB$n1Tdj9~G)ED$|PR0^~lg({zNv38R>{&4;2`0A1 zaDc0LrcXroC24vzGJ=X2x;8!t*Q%{4JP|3UuM!-+W>a;)BhhHw;q>h0fW=GkDV_R6 zZPrHXC9G`q2WphgAjQ^c@=YwSPiTQo1+#-0};KP%5t z@kJjqt~Ri9W2;3k`uQXnqq+EpL`7(kXr1y@C6v^uy!m^FGdXjb`x)wvS!zOyY-TqCYI*6BP4U>a4rW zaek5$+ZLUf`w)||?Y0>DGbcn0=#je1cPR1M0JhWk$}4sJ1i~OwYg#x~Jg6C8uTmvT z4d;9Kw`q?LX0pAqY89c1=VxJ_+0MM}7!A?u>xG{kerpnAvW<{zw`_f3$ynRjlEjf^ zj*z}eDPQ!Zj-DQS=Y!)E7AdG!s?7thO&Pv#k>T*Koaa|EY4bM(>*c}Yr+5v!RIsdJ zpd}3(^^R)HGfk$BAJkSOF$p|u7Ne`9zgkF-C|dl++qUdZO$6wCV4KtL%QRKwGqWR? zje3duT9S?RW|YoNkCH^#^z>zP0X%=Fk0~Rt z(8DBF{{WySuFlajyGyY=Py?-hQC^g`Rw7w(wlMZDMUKsSnW}oI%lpLLztIq}jHUT7 z&xg%&C$&cd#Rn7Xtc!lx1xO6-Vj-1^koL#d@Cz~_0~6Sxm%1_P%+AY9f-;SV;7nU- zg^fucWemMuYriO`^DA}y^G<#;q+M*c=tpi+^G6Gd?38~226+>QjZEx-=CxWM36FD4qa>qmSMe_GQ{Pev#FNj&AIS{BJcDf5g12 zwnLR>GJrp(QwvQ9Fgc%sMd8QD4Q?uGt>%>;N%b9|G;#{K$4u|S^HM10uU-;}AJ$iq zH7d5_pB-wW423%tS(v<1Z&O7lQ)L9;%wIBR^elb}Wc1yWyp`cQ^1AiXBOa;PnfwjX z!3M`(C@h>U4Q81|<*6`F1E*kRCFvznxy)l{)60zUoBs%gNJB;jvwjCS2s-L4y$4MuYS?z4&r2XVG z?F>xwNhDnZyLq7aLV*V6!+`y%##{A2=kasV(RDsLdyuvSLBh~ul{c^UEZ z#$89+Me>q)B=HP2+G%CBAiEK~O+Qa51fdyzSwLQB?b4GSXTe@Z^kn5Nc-R6*>Q>n5 zRgcp(-hyX%A~_`s2GPbO;TgBINJcS5CZ9x0;>pWv#KNo3;U*`r5>p)=34ud5fO|%w zw#@Tgig;*aUfj71XNJ2*J2*UI03BkoF*$W1ErRiOQ@4qFn502iI(D!L?YwFm_}gl3 zE9xV>GSf1(*d4nyX(4Blb5a94dBQ-Fql8ZD9o&?fkj@8K;jTk=oUoft)*|Xp4I&6* zne1dA6$qO}JXY;uF|k7g;Yenq;*R8jPzGTrV~-j{AMF`TwnTHIi)*tojxz=h>Oz&1 z7jzm@$Fq#wSmYOtqIYeRjHK~De-VbP#9`PD7mCq|8DxRTaSTpwJ)*^GNsXC@#!Pj? z-Mxm#SCAq2_}7oB){*>Ib?vNy_`=cc&TgkJQZ}g93C63C&v2)e!Md47NtU{^w3^@XP-ICBlQC8RIx6h3oPQ^3&E64yJWeZ!*U#f*;`!WsH*wSBm*;sKbz$X|Dbc(!UYw}; zLiZo^&^Z(keUx%(N(u{7$}z=ffAe;~8_*1X`oEG#j`(X&OP zt&noA^@;(~jS4%130*tq_vS&QM5KqM6#HaKDDACOD zxk)3K$Z9(U3dZt`wM9ocYa5i4@h**MvY&{5o>!99n$_H#7Z>CWLdark%^bDlthp{C z3S{EMhfd(Zp^K!Fi|lMk60L8{iUExJM(z@{A~6XsDTDbPRmgZujteSC$VN`HA-+%` zlx1%ekh{oY@Y!N>makXHR%U7Oy8i&K{{Z)0eUT?p57FXxO#4LM&0Y7`N&S$pPQ_W) zm=sOiWRKd!e$~mv)a~4M?PK>1Q*%sz(^8L4@7hBhO znUN2<#L^CL5p=EJ5`wp!SbiQZ|R~{eGMJSDVDd z`+X+&TG!KRDZDP(8Pu0&k={<}*UMfqB?0*3l0O@qu1aU>e{~r+ARx6I^}Q^CebB@v z64w~dj%U0r4T;6BL02IjTNN%I=}5-q1B)0IqP8F&NQp7TJORF<>Od4I8)yRGk?c|7uW%3iI<0;400F){!ngGzu{{Xydsi$b;zso#oT$Rhj zRLq{W>v;Jwc_*;XKU8y)35eH`mQLZv6xX38W*4+k1=~eNxf%+xR#_*6O4m;mqV{5n z$k%+JcdghXOu*r5u1P=vSznrzvQ0KP&fGD}h+`i!SE-E~86!53+}B?l13ZT`gBXYF z;$r=>mdT&#*KPD>_J3r}*?!dj0Lk|H2S#r!dh@52MBd2B$?LNeq+QLQNsq++ySy_6 zu(Md|n2|=|H+Ld><;VG4n6(wiGBxtmgCkmaWTi9vJ3W9+WQa(C*N6?697pBRnlV}= zPTG3T&*sv2*H>b$?oC+5lb>`_jFPmE-pp@c`jjiVNInR^+ZWl>%Rg?8T;<+gEFRmmgijm13N$r3otkAh_j8B16OO~$R&UkHT^cp+ z=O@ot%U$$=PL27oxU83$PJON}eG^3K>$-SlWi4q{xR{jm#mw+E*k#66hP*hM?G97X zso0jHp{TG z7iVK`s7cvZx-&JJew}ni$;aB2*{R7_m&ZF#>F-vxhU(@I6pUiP^6np6M8jYsaq7vm zL*a}`;%%7qe*VV`0Q6%YDL|?V-=0_tA7l>PvIiTKM*V9vr8~k4ALGbM{8C1L_O81# zB6cKdF(vwpn4DLUok;Aw>hTJ&JI!};7&o())X|J?zi8K-tI0H;Y2WUdGYWIk-)HW^oVM)A{oi|9+H}pe z?7FQlCYNS)wfA1hzA))&X#?$?fCqh=t?r{{kBCX#lfT3^iY}@diW3~XqN19$(USnu zz3fc17ed$=2)K80Hx$-3yU4ur3%%D-QnPIA@T|QmG^>t9ur;wa?M;cn;aek+!er^o z$y*y^AX8ehHYSZ>0vx@U$AdriU;guhuClI^AreHqMoYme=uG<3b=F1JWZm}Z(~>0Q z`w29>i^z(?D=x^SV`<=Hk2((~W!uKtn?==G40RYzA(k#bnmj&M57rTbs0fFX$Sj!p z$PPsWW!dF+7UZ(EiRv>+4r3VPyEr~BySjO_{647_aF0!*&OV@u*D92_+ z`kG$rNry{IOG~c)np#`-`>n6K`+Y&3n6$O@li1(c{_9IxP4ZxFr7JkS3v$;fsD+ki zs)$|D8?Teiv4TT~N;?wQ5WL-vXh{ur?>sUIfk?}7nmW(8LKZAmHwfz$J~o-)`+AX4V>4`}qd3J^)A&!wd_+Ld)mm&`iap(O!#15LWhO2oZVt8^ev~9$4tzv^3 ze~Xv068&NOf8l;dinF*{40Y0g#=uM#C_+R-<9e0LHDe7^z#H1^;)+#fQd8aNpHe=w zj$dx>6zVqzKkr0S-y;2SFs}({$ID#e@*=v&@&Nhu^YE-rgTE>^aAeEHplk6 z%34DGP@iQP1gAV;MivG&JUv;Bg$VaVEXZ~Vnlxq6Ig6&3N{#k`o0VN^=WbaXKxYsq z0`4iKIKZj|!{hOpKPwa@<(E^Gm zcaFQdctw*A*G0^6Z(_bW&{>AnL6|L2lCfg(p6*>j)V`wE3%lWx89TJUxS!fT+z;$b zvLbRpXABZ6+k0Vtv-;q_q%XIMgHi9;jt38$#>U$@d)TaBJ-5a|*GLgQWnMtK0 zk_z$yfx`??WbkF>o zTlxvFzw$cL*VBJbztgh&tuM0QW=^9&c}Lv{_D}Im?9|6@@7Re~pT@0#GIsQ_JN8}N z98^QvUV$Pwo;9R0kV|Ip+O;G+f0ALl6R z@)i6{b4Qlr($ujQVkuWx$vlw8*KRqK7}+|~$BkmC`ZdNgm7F7u33YDXHfb43`fC-L zrj8LIpBn_k+;%;Ma;nc{-7!hm%w|n(*hCwo zS5{u%R$p)AU{36t>$Sh9Rn<8AGpByb?ERd+pZLb!8vg+Jd#|{^yiV>)czjFuw0_Ro z>T&c^zSB0}Uq=)Wk(X}Dr-DiHTv|%kzb=l6OB+OE*a&%sa0mTQ+0dz726`Pt_9vCk-bZqhx;QnHVVtN=MS+e)!nu zA}ESTn=JJO%B0<5gXHo`DW~c`DNHN2hZ!yDrQ-L6J2=17OJB*=X)|qaUrqf!$iJDE z*WGQ|F(PI5PTt<%NWh82B{WRp!Y=I#i%W#W7H=oW_*L#V4`=JA2PHzGWhOBy(#joK zMVSM|I*Lw@S05fiIe4Y$vA)i$*tJp~JCv)-u=$_E8WzSLHITqqZ^ByAH~NxI?%!v5 z#jVUXFp3Fa$i-emf>QarJ2J>qlX%R8H|s?^PaJRYF8*6U=(NEAG;7osk`oH?`P`lv zK2JG3k7e}}yo$u`Phs{mNXRLPHh>2CFatnNs6T~RwcbM~CXvZ`S%y*}6P3xKCX|F; zHSv&M7YAT19gzf1Zto+yk6t5<>bX;G5DDB)*mlo%?OxmMcA;|s3ubJ?fbj)c5- zF^rzKDWdf9?z+C2*GDDMnS57e+1K4~=-+<7T{8C8`mXz3xAY&o{ny=gL-K7Xo3M*B z$;mK~;W7}3l$ZHT*YTKa&!@#^;H5($#W8ri#F;#Oo+q2DHC}JVa`?${7yP6^Ov4;x z;U*;VS1`9C@K`3>2H5b}OL_U`fa}Q=W<|xb^Wt*+ukiMIH*q2PeM{7B@Y{T6m{a7j zeF8R&f3{Jvm-he~G5*;`#{U4w-p=}FD5JjxJ4Io+4hm?aE>|>BV!1sWh)eO4E=5w` zBX8mEMGyQ;Ef9P8Zu~=CV2nMP+9WRIx;lZ~kE%GJVY9}q8COayidQfoSisr zbwuvUL)*&TSjF~U>O*~-?K*uf#O&FV9*!9ylPTbGRziB{4e( zRIzq^p?P69PSG&Cud;7;9d-x(X=f)c z=Isbd5tBFM?u|pt~Bksf0RMx~B%nBpyh#gHc#7!ZuGlCgP zWYxkne(P&&h*#N2Y^9ai{M&bZt!+vm&mfSZMcI)XqJGKQb#4{{ZL6w@ijL zh|bI~gb~u0Aoj7|BfE=gco=cab?H)r8B)yroMoZ>V(@2ga=dLm6^6>>PT%4EnF}w) zuHmfA(X)Re{{S}rpW|-me(uXi1-i0-ztR4H{@CHM>M~|IEQKs)KK}q7sfOeSMZ8>m zs@jU}b;@w{vVVw|zc=8QZBv?znCKs$!^}7s@#?p*R;kh!O`NejlW;6gBUUguFT<>s zP-uQ4U^Gz>2U4lVFx<)`HC@$%pSHBJpep4{ZpRD>GJ)Y|)F2YL`c_Q_ba9q`UnEh>IEyH}R+K$F;X z?1_;Q?w&wLV0wXoG?V)=x_y(@qp0Jo0H(IUCz2PCViRd&Hwzc1p=wOMLR7DevC8D_ zkhLtf@wmBN!W}fw_HRlEToCn^W091Oh=q54-plNzBy%&T_h%Q=6N>UNwB1Z?#Ndtg z-FD8&{g<|%X_rQJAkyOx(;=7*Wg|C?smOE5jGic=4;9>oNx<)}73`=IF}`cR+c&V^d74n zYWEDxMag2u}_D6H_QvDa|+=f7X+l^4a{0%-&NZ?fi<9}Qy-mWwq* zl*87RaNsL?LL2tkuqZo&)-N%YSYq;Uk^r_D1@)3aR1M{Vcg(E`W8`E7!^r^91!@>=YiNQAx)#E<60ayYTVdsbrvI0H5ppM##8-iD?F-aXe21WiWdDzDzuN!Y`yMF9#=7z z#c|KWnpI-tTyqtM%ZCZg=P_jG2h)0Af92ZW(UCsTkHhyY9wN?PC(5|n;7@BSm!C0b zJsjMh4nD;^Wj-ObkpDE3j3TP8oOcDZF&+VlDDn z{XAZ8#4a}2Ouyl;BmBo5&oI(mp^vdkoAJ&uf}E*i@sY^*n${`fXZe3Q#xlnQBU&Hz zR_#Yhv-3NHmBi+2W?)w-#gM2H-Ql^cW>&6$7by&KW@$~8;!NsC=xkpmeIFR)G;y3> z>08WJp`4Dr8dfXU3i&xK9CPde`zI7JpcZ5)+vGp7pG?B?CX86$?sq2bEtvo#uyV!> z?#>?fslzg-hd)}zE66Onv#%*_-`w1!b8n1>@S>d8R*@6CHeToA(l3 zl&qxvL~ZilxA;Zuot0toSt~@#)f=c|{{Y$isA~~q8oZD}kL?UX?&?q0x*)=xy1ru} zn!9HY31>5v>A_CEPc;S}Ja^&6dkvlA8J;~C8saa?1Cw!UTxzL*Ccdro{{SClC&XcZ z=aUO|tw+X5Q<7o%UjmB>iu*1pn};25HHfo|yD#th54w}(Cj+&N66O3}PB(vxLl+~V z!#OmW5wLv%J5y3H&N6OWI{{V>P%O`@Tm#~}VKl1P2{bq9v zIl5U)U5rhNcV@@W$9Ysard-30{(D2xPx)J}KglM-&&g`VM=Lx=?D|nh+`kWQK?R;l z!HMGhg{#(_3e5E+yJ?GkPC|7r*yS4mBupymY6$D1QmYGv(_38{|62K>V2o`|+#OU!=c@Aqy2}^)rDOqrtg}kon2^+()72j*JCq^4x z7hR?weIjIX3n$%^?##Pve4fQ)#_~$qncaDgJ6*Yn^o9H)Sns|c6ojtU&@>g9~*hXG-^b{iy`Hy`B6;3CW1 z{!FV!Ei5k>^w{1^f0pL4*xA1<&R3c%PJ`;pOR8YoynRW<#hptuw`c97+IDtQX`CD2 z;_dZsXRGph9Fo>8_!lIn9w+f8)Hb;v8tuhvaP03~rfzTHUVX)QLBH9ew>+{ zi(;{yhPAA0v2$!@D-D|Gm$Kml_FMu29OIJ@*MCBE-p&2jZ-4vziym1DqDP4;+3dK4 z9M2gca~?TOpf$ufv0`75!TdoULcEyUy~;zk`+m)8Z&G0|K#;)555oQ8a$tmzRy7RG z8*xACvliwWRp6UO&NP|b=3Yl8BKb;wAggD`5Zz{Y?K!CJe8P5i-r3V9bmXpCXn;ti zceXkypHffo^&L)A?4XmRy}Ty+-*MYY&c*O`-L_hGkksWHslldVV-+bnXZIFbWh|ix z*}ifqUrF}w<8{~GUw@{PCs-b1ljHBk`K1m?{Pt|cO12ubx@vXnLrV>gv0e^M7Bdqb zBK}H;_yqpX^kucQKdLN=ls~!9k7eIZ+H}vQr0u6<$`^Rf=Dd#!vVV0`l6u}5!Da@} z{wdarrG8fyFM@s@;ZC~5Ox5%J)0EZ>hI>6We<0?z$T>^)nc#>D>mQAf1WFsRAqlh%$CBQ=Mb8ni9RIYmL$Ew&uvNxxSRH=11&tAGDHwpOf^$K_u1% z#(BKZcm$jzVqbL`>7TH>$+X16Qvt?A1n)O!l(RZ1dm>~X6+PyFWFnN`*?4@aJPCSv zsaOGLU`+{4BveewTtmiZ2UjSbHrAK8zYqLH-}7Wg^Bl)84aMxy{zk#Sz zrJKZB;w5S#j>CLdkjd@iVouKARz8HHA1MCVnK#+rXj@D#wWR+5eS3D-)5OFB?5r>e zRxXlK$&N0^D7PmnZXJMZ{$n-B=yB+?oU+DJ{C^{H>h);Na$9_G=-1;MoUoDp9gwtK zy@~NzZc_#_zB?a(oLbMYVtC^Tcv-aHO19e5???@eztYEcyrzwugEL0PJ0XS5O@+Bb zBMwHbetAv|gq*_`^zwO0^7lC24;jcRU%^X-%+B6R0ViQ^(|z|>bRp?nYq{;=`AOri zEO#+pg~|@q{U5{yQ0-#gA>*iYEX#Jsuk*MYFv1NZ&nw9!4$;LJtFP8LpRGcbG@6X< zJ2V#iv0ir&8BIn*89vO#x~WUCM*UQiGbcY+UX7U`0khbv%<$N>BV8M@A(N_U*$t+V zy!%~+)UGcag|?i@mywvJVrPu>_N=r5=e5}r?c*-0wr|sg>86$ZOizrh>S5#ce3M0m zhzCE4YL;zAQNK@)^t&zt&OIq>PxQ^^t6(VG{6V@mT(i8S@)-LVyL=-C**t;n%v^^J zR^|L|NVv_?eXqFvzMa#vI(GWj+%)I*Ks$1i<UrraM-)(VOQRI^t%E?*i>}SvIgomFaGaKz4aa+uNq)US{Q3{{lLN^WjvY9^r_JM# z@?4E|o6Cl7nd}P@$SmOyL?jYqp2*4Jjp*MDb-c$YEbKP|J0#FFPV+O9lgQH-VuErS z+d^)|jJfAuxw4qjj0ZyU{3XCfHggtdlEpSSC`CbzMuVz1V2$5#S}z!Yc8cVlTLtlG z$KGigHuR=y3UR^_y9-Y#GeiCftacrEB zhZo3WUmrK7i}QA6esQ?6l%b7ua8k$D>-cfXpDSBSOD&17%X7F6KTjQE{{SM38&Y}X zw_=uJ#wPa{&tx;zIo?9e8d4W|7jCP!)S1WYrD&QMbWY;kVez}6`%2r3Y`)IgkUDKU z_D}4Ey^6U`pTSNUY`o=R`zB^&$lpsHB$Z?YG-r`vd3W&RTjUdGB`BUk^ljbjeE61j zm8yJGD)D4_?Z5v3qP>~?hPFfT2Bpdtx!tKGx0bV!mce{+xy#f?70K#(KaOcA$;^MY zMB-oEjGWu*{{Ud$U*x!UBZ>}HEqUO(9iVYyS)5IqC3k~mEtW}+vDLdE#1|gUIIQ+1 z5HTKqiO+?vkjIE)RE^Y(cH$me7Gv*gZWoYSv0ON!JDSz#dwB9aJk_G^&n zEfmWh?InknN#2VC&n%BC)RU~x?iiz!^+X@DL;{`sgi1eU7_+-LBbA;@6O*W7cMm`W zq^c1)LftIO)mLp*j%JRy+mdSjSv;og6s&&ETTl;Wr$Z);$KqSu{gcT3=XYX`Fe$S1 zqsQCFTl5#|M=yt!+h(Ohi4BUFt~E;t4lW8da#>4b6~esEt=V-nVrYfk{BAEKPQ#^- zy*4uLUzIoTWiCm{XIyKXdK|_VlVfrhKM?YALvx35ui`uO+wvUc`Ri87!O0F4UZYJ{ zUh#){C1L14YN6zs^quSn?GJORJ*GX(F|)}ezUEKxk8V40QU_Nk#A2*kd0$dT42U2m zagA8lk%Zn~gl%E;owP8qXy)@w`dc@YuFV8@$=z0nZY9Y(A#YTjU&a$d~#tu$ow_izJ|;KvlI z(ZKbqcXaT^1BSQQ@)>V6xU4a~A5f@SVTLJHbKQR+i(|>8uut8HyOHUaZsZ7cvhQ+m7Gh&5WU$Z@|$HXw0VYdu!ShmuPZc_yw5NXN=iQa5i2 zkitGm{6hfCazmAfw;{A^w~+Ut^7kpFb7*34V5{@fGW;)6$0G6$}U z9xhYS@vAj_N~mp6$WK&6B*W$}U2LU?lD`_oV=(gPtR0&8!MDmW^x}SJdh-4m%I3nK z2F1YCc>NY%me-B!;;P#mj{v4ojc*g=+e7JGoN@m4YWNir^wwgvPZ=NK#4$<9GjwW2 zldXoEB1h$o_U#xGFobU^@q>LM2X`@y1U;19Lcf6KlPEC36-qJAugd0iE0piu{O)!{C2a)iu_~|l_>2e-&6fwL@734Z~`^FPq7qG@PVkrvLgaH(77T==^ zFeu%m(r0d<&8J?-f8~|EkGGG)#-|pIRw<*a9BvgzJ2!5H408FV30$Oa9B@~Xb7$=D zVcnx9*}Ha-zIg_BY`u=JjXyMR0b|=Md~RByU~1bCiaS{jV>v2VjGlS%Tp}$Ec(L$~ z*`tBVzMr{=>PH_)j!v=LnWeETZ3IJ9AzgPZx`Ab?aSC}Ff1BdUwJWwMSsMM$<|89t z8*0~>8}?~9pHlV+hp^0k#qPlgbe+8CjBhQgQu?W+u+c*eQ@nQN7$bKxm7Jzd>H+A( z32Hd|jQWK%t*aMGXZr(FDchtGFIG&fd!E#qCyrp#ZOn#uQbAzVXqp0^cd&*xQtnVD z@y5(BL*w($GkK$VVu9L1Hva%M_20_TuOpHv9#`(sGkd?}7a#tHzv||gsuV^ugqeDg z$}Yw~h{gwz;`S=?>|ZC~Ly4$MLHg_08TQ4&7?E0 zAQ%XCUIpPp0`%wu^<@sLt8|`1PX|}VS2>8H{W$A&ty-AI0veWR*_v3HqUopt0_a1e zKE!1HNuN?*C+U>;RX?{~5+*|ds(v&dZ?+u7KEGK6x1N`_# z0*#I}V}eOluh6{}?!M56W13B(_YwAs(&>(E1s~iqyMzA#M?<5igU>I9ApV{hq;o|2UT4# zv`#s(Y-rn=pg;aEZmcm!5}u>N_No*IKs9D#YZ65U+FAT^e>3Lha^%u`5=(g-2 zMIyBmIJ5hX$euon%N zmX?;5mX^Ps+@2^Z%r@T{cSwnav#~x>$K)KOP@_R7P(iyr7-K^r$xpS)-8s7vIh zhnO!`vsbfC5x{@~ByzbvwuF00c>CU@48I~bVvb*K`X4JYi2I!KcTmajhPKsOy;>NURDk&&KJn1Ex zgwe;@M$hFT(}3;jmx95_c+8CQh1xQgmHZu(mt@YXhV0mfQ+Ya_f^FDl85(ktR(F~k zS3Gxo-Q$3T*ocgR!$M@;9gEsB(|2MhzE9`c^7#wQP9LhHf>(M`N(~QQpdCwHmw;TP ziQULZ7mbNO#Cy9ClxF@Y(~ApPh25vEww|;a%*++VpR)E?$=a3M(!*x!%Il8u7QEf! zu?6g9I3$`OblE$gtMVCrHH@sYj+;aF`glN-bcwT8JatKg+|7kcG?glYF&#ezYuTLV z=F$b15qM*?iWFr5JhH;dp)r+-!HPQVZdk$^sm+;8AP_WuckIe2+BE*m{{XC5$l0D3 z^GW)d3lbbqG&Re!H$+fPJB<-#5VTEwo#K76e|7#7?RIt9)OOA%oY?0!?rk2EIx}}r zM&!*XKqh?}KbjHhte@%loy5t2ccyo8P3(!^Z2De*>}%_wF$z-&n1s)%E1MLc&Qy;ZUB%rIrG_~4E>GLR|ds>;vwb7Q$6N*V0tBE=hL zSIZLlsy% zwXYk#z=lEsx-eR>0pekmH_3|2M9?2$+r~{NQDW>vC&Z-o6KG>=FQ%WnW68-=j8|Qz z_Dr;#c8&yaX*_CXAwuX0I+iw8B4utpwq~cWMg1dIZ_DG;Jb$(R&`i+Bhsww4=E{ky zuEbLNMfL^uPxaa((#}}yiM`+Cr?S>25BUh)osVo%I2V-mUjP^Cy$6}()mQ*Dfz)gh zD@`aAJ&v`AnT&MJ{{W1#Z4(sI<;W{ns~@a$=>$y7%*r>?`=>Dmd$6R|522TR2IxS@z4=wOGG1?)59p1XlpsXb6f)7$kU~voqKZ zilOw1A}5kp*-P+fiQHZ$GB~}8Mvx2OpXLG{SYxZ&yafI!KGFu&Y^;!}PB|pFJ?H-b zKVts?oJ5)1U0kPcHDfKYQaB}mYJe$HuQI%$1V`CQN>6e> zp&J7hP#qpvnM08oUCm2An(dDST<0?E39j%ud?ngyo+n@w!PUF!NyHE*md`Mh7n6-wONUhomaaXk!p#IKwL{BwrnLlLmFf`Z37Rgu}uwd;;QXWNWgfN~X$4(-8 zg(bMkY>q?JO%$G3XXqg*1WLrjYO(C?%jA&kJ2sW5_Kp@fdz51G?G5d;()NDL>ODso z{0|}n4lvEYe7`4cvBc6xrxiE+^8(U+Bl(D*wYS?0zHn*5&-RafA%4k?L~YgfE=I&h zF5G4J?+$Ha@W85jyXjM8@6p1{`&Hl({GRagSdqZ*OCP=vjsyL<&$7wSo%VyhKH zA!?%%@xvo}2X`1qU8+8UgZVue$T9OuK(JXS_o;;R3xhWjV-Axh8v9@CfI~!-@zio7tY!-P+7#Sr+b} zV)4rHJoh_|djq2$gv2aH`zfFGX^-?+`C4?}5+~^=XqrD!QPH(mVX5Yo?6cl>SBPy? zX?hiyMkQpu1yoy4&<6^oEk!C2EV#Qn1&X`76$|dgf5qjGXM)r)T2GWZg3_UO3wyC zoT!9Lz%iZtq?=RlZ*cV+a(AM%Bs7_kN|`yg{RELV!IFU8)yCcqcW%2i zDKh?Jc8uxrxsF|S2CMDU&ywfQ5&X-gWKnTeH1i8L<%(x|kOaqNYvPA@?7ohy>|%$- z$sMD+E-QGK;iZWjmtZv&;+P(|JJR$5yRkd!DZ;e`c}TmS95>yZ@7Cg0oW#V*ochFp zAVqWHdxrxDr;8MtU>7y)VBK>)d9zl_!2$fd$nrxjt#$Z|+LrYbXWrJL$jt>T>8-zf zgBWp>GoR(o=WzTndJ7A~7tk`sp!XrOMXX%ApQ zmr<%Bh#~85)uuSZcD{A%y4E;`GIXT}7fK8Ph zuUE6$N&~=~@`)2O&WAyhF9S%UL|4ul&L3JEE*e?kM-2gP$F+s!8Oxj*-}K(BZ@9SH zsWrAU5Y^5u#YQWUG)BIK#Y;PfsgH0z4$nXC z5WVTqb7PC1CaJ!q;M(clqySO&7xgHTEB8<$Ns%9uUhnsK_>Bo4YkGge%$Q5TrGX6# zOcor~AyY$!Uwg}X?{Z=eXqZSdhnx~+!i&RyHJ?~gWHY0Rbe-q@SPv7@HX30btVZtc z6nI5Vny`}q({U8ggep*>oi2Ex6QSBwoi7ItS)cPI>8<> ziEeTUWH9Iexa;Q5sUDZ4Z^-c#e@=KVGHp5>2vBCt=L0e;<5AWa$|^ytWfsJ44Ah^H z?y>OApHF_Aq0DMORo&Z|yRfb(&2M5)$E53T?^szX<}4@VW{tL3!6QelpQ!py13&wG{wBZgNGn==f)^$Gs@^1miz>0(#MiAs??vI#kcV;Txw z@CTNGgcGl{ofTtSoWIFoO3w1b3OHRq^+*}LsB>u-sBi_p`n0@6fF)vvMuX$SQGI4a z&IuV8pHk=V0uY{~h?E^77OL0tBcHq)dBp`}2Bfuws4yWDh4C;k(@-zp(RIZDPJGT7 zVx4vO6?#m)aEGGF((R^d0K{jVUNAVP(gCjE|7sBIaQvxUvzaymC%% zrLs=YfLOQls7N@b)YKU?-F_d0*%&)9ad3mAXw1;lN}48iIX)Y4R`W@o*N6K5tQ$F@ zfu9rxH}kV#G%hRyn6OT=4&wc9ZWQIJ-a%9koz|BO=VBuCg5lp3f1FGl()}6q`!Ifd zdykRSi#He*qbnuw>G`N8e0Th$D|!dQk-#mqsR- zdl%`Z%(R{ccFsTpkY`_=E-(B{O;I30_^UQzET*cge`sr0Hl$4D)`aLp#JJ@HE^ZY%9*)Y}X(z++Ih9E>_dH%*Tlk#qs&B>U z1&B1?$rR*2dg~M2cx4~J(HIvj{O$1`Fswvq>bKoaqAW~Hl)f;rGQQ-)n@Uz)8Z^PH zO-H@BGpbG`Wm(k(Uvou`%nqhKJ#bcA$4WGQHI`-+xE5a{D|!Aov~M@p(k2M(xkt16 z#fNO3g3pv8t%}yWAvR(!ylu45L9ji3liy9hF!*c4ln974{KnZ&=+ju`ACmZMRlRc&Jcg3+M|K-Q7S>D^yv1mnK7K(# z(zJCu1?zRiC#~R>ObuM{0D2ePRt`&LU9fjCKwHF$tdeim_Qmy_Fb8&li`q9jnwpn+0mxKB3wc=5Oh}*brcKx-DJz%MpC1pSVl}MNvdKL5Fho;$# zWRDo#%SHJ1T2X}x6`|YI(RyU8WO-Mh=P%dcQ`*4Cq*B2Q9YCm6?*H`|j(8U4S}C!xUtC^ybP{?UY}f zYzVX0mAw@3JV*Bk?5%|2tSGgM8W-fZ3GU@MIgxZB#>|7WrGA|qCSH?JNGjpz2 zxJZrZCR5r;(M$BZAXK)NPsTVWV@ui6c!c7V{8lO9y#!gV`tLEjg`Z+&jZ3eP;T`Bl z*AE3DOWESQp1Jgq&?LXvk1jWr=dT~w59tL3&h-kszaF&6As|>qI*#D|Icbtx^q3*8Sk~E1!)<>63Lt$YSU(*=@rAw$bzJr&Nr4pg3f;| zhK273CIrHqBE4}f_jStgZSt$n5>d~GRH4p9?({K8I|;?WyaVoeQtP0RQ1ZC;m>J2U zPkXx>@5`egYsRPA)0(N6t)*O1SOQyb$UDEj=bt36Z5N0hR&Ez0g=KpGMk#O{p*^Qc ziKq^i5ptXh-V;jTdQtyj0)j`)QV>q_KFnsj9&4bP=(y->dfTtU@#WW99KD_a&OUut zai_}}0u6YsMju}L1QW?h322bva82%gjD0yhs(XZQNJl-^`JDA2MH%DW`!;^)dv9OP zY_I0-N$0Up5ItDw=HA^(88auTyvV|BIhu+)s7CqqjEK6+D)82sc2U~xFB0zUm#j7g z{C}HXoL=KY@Q6>D_Xkds?;Y4Kk>92(;B#~}mDWtR?sMe0hTh=9h0S`EAPi`=Vt_v? zG~AkM=AUyKAPkKF+A+m_7ciFjEsk|g>J_gg%RYSxX5$MJP88-BJ9fiWFxMVRuv*oE!! ze05wR8CJt=C7(%2w*ym!{Jv!aRX*eWf!O*iT5}L%KP2(UVcTKe2{T;L}u8lZnHYJ`i#*i z{&n?I=8LPtJrr7pGWb11zq=KgbCZ5A!ps zr5ph@pjH2#pB>)e-0?8T>hLf+Wq%))L2RdBPsY>YvGJB(hKJ$PVAlS@u&vtRvVnt< z(E5$L<6=e;rGW?d#se{(Tmh1B`$2E|&^pk+vpP<5H6G>jdru0EB9~a-?!SeGWN_=LocZ>;Xs+Sfw~UXNC!5N&1o^I@FnI~}*7=4FuvCk)D*^^i6H_Rovi1vQ#AO##MJhhA|uftxpa4z4ti^GY9bE+7Da@`!$m6x26Z9 zbf@clip&uTv)`hHD(aN5d%zjxKE472Ey}*gSYj?FPF!G2;^gg4!spFEBUz!CO@WS{ zSykFM^A6uqU(@19{}QE{D}F6`h;+uE8a+sT_4_I``D^8JE1CZBg_iR=3Jq9)QrQXU zrq27-wmZXRVnSpGP0<1cBEx8oJU{y+=woR-3W1+gitkpBA6K{Bgr@x=5xe&ZLtsR_8m(2dKuGx1oir5(ji@8ktg(nzSe*YY?B2wpwv$-jjXHs)MAG{NsZ@2k!(R4+nSRp zhuTMGDW3Bj24UxZ{axp6QKldkP-{G5oO_NYQDio0(YIRfQU>lm%=_fvf<}k_i=_Hp zif@8W$c6euVU=qcql_Z;w^3W|6^M#i00s~uT^uj4fk((j@vQ%z-6%}9Fjo7U>3oDu zr&)fT(bT=_V-e`^m?04D(;9S5lq9!jE^)3qH+u@~+OWO%0q2^Q03YhwJ42OgK192b&D09VdH$x~0KOJ)B$`j1#&s_%R%;A;(;<{M z!g4nU1Wp-H%uJAEiiL3r>PZKRMX`QMSU~Y6IE(ibRg%|F@0dY&&Pu%2#>~BLeifOg zb(tz^<_lJqD@qs7<)w%^-lXzO;tDD^IcnE}EXBKfE)g2IF4&iVgAIqxtT4D8L~qZ* z1&bHbek9NEubolx+!74v`}dX}o|{`8`3@y`OVTfM5ufYOz8)3$rs$_K^FtLr=Qwqo z*sZksk1JLny|O1><#e1=5Lc!7=}NT$Zd}x{C0neJeNz8t{m8e^L;*PG4WZ0YlI zDq~?m;OS)XQbM0Hd+JlZ@ftkGShjb7uU&G3Q#bt5#PUg$Av?u}I?6X9;{9XgW0|o7 zL0uIpL1$WZBH;|gD$)=(Fns0-Q88c(8ae+{CzLh+j@7WQ*UFC}W^Hwa&nW3OHf={S9PW^)f@5O9o&B%(5M02 z*=nIXp5d00DzwWLM9<%ccSe<(AD=H*N{er8%;4~vfFNaZv`t*rn0v@lrpa2}TGlW& z5(#Umo{Ls%L4r8{@tb&zO#TfXML%i)S^D+8Jw5kiH=`1@%c)J_nUct(lvw%T^T9F# z^{0;^FyG6jtNuJg#GvozUnJ&JB8LDVv{UtkM|Jc z`E!38XgGBPkf|QT@m)i=?}EO7-~vezOsL8HeF`3I|I}lg5tqreO7y6ElQH{zq5{Yj z6tI$4awxKqHd&nE^{_IZ7OWVYj*VOV5ML;u7t%>-evTeAFj#a%@2N7*)uf~^Ld@H{ z9fj(Ai8L-yulV5@R#R9J6lIIHPgPn>qebI(cI_#U9jE@KIHfpx?Cn+@-WRc)`0bPo zcE&l#T7xqaB^#iDAGj#Flapc)F0Qx^bP4tE;)~KXuhXkCPo}XT_8apOjDJXu>>D)R z$v^~2lrHRca)79LifBG0vvP=9Y<~bUAK1#FmA<0-5R=$zG-W|-m^q$Y3d0%}S?`WA zHhl^Sqorup;j*o6^=LpsOn+`LUd({5CClUJk%@%riBu39Ne>8?_H>~gDVJU5#!qLYadHeqpSu1yo% zTM{x~@mttAc$_VwP~y$a)@PqfqTWcp3+{6mZC-I=BD&RGsL#d9?XMDHGfttHRQnxQ zC!xC|%5Bmq>4!L|UK;crX|QBQM@-yViQjYBQJS%kBN->C7*AD#qP-=%Kr5>%Y>Mqe zW5IELhvO$Tx6>uz!1Q#Tgw!1xoGSXw*%;?8C*Xmclela49*#VLCeKY?dGjl3T%fm` z)?9OPb8^b`oPRhv{X#YdV8k8-b7gp=%Ir`E3;bR1Qy$^hM@XSOx-6xwK=)xiD6KLI zS~+(z-)l3Z=Q3b;(U9~e@8L!jAUm|~A4qlAPtq04PZuPII;d7ciI~WHt}3+5hri}e zHzep;;RqzIrE07hg&oj`9}?HdKZ?J)wN|;xX?WL&FwN6GXV{BWGVQo4@Q zi{bfJUrtG_xduR0igZ=C#Gr%UnB~ZFwf@4#7K{8L32A6Fjf)9M+13hyhIoHAmSl0L z5_URHOe~;awmiJxX@c%&TsdFT5X+g}%pa=Ly%@MnAw=Ckt#4!g+p{EhUaRu=zR!e= zL#Sg5)PjhC{z@r`ygD+HRI%rpSeJX+ybE&1#$(Q~gMy zfAaWz=m);3)DELP>5r-BDk#)tjy_N!K2NU35{!=UC%a&j34EMle$2SnI!|MiYcPdd zp)Jy@l-DM(^7YCX$-K5%w4DETi2h-p`FZiZk|wdnQ|wjyZ}Mbn7fwm6p&4BPfFje# zRK%;?;SRsdv&=6zLla$LBdyb;U_&3q;~fInpKEw0#Zw<)7|%;VEjz~RrovEeo4yZ) zxYRx>y2X?)V&QM?Cw;YrOXAOyn%*(#iym@|m_FEiD8xBTL2CeiY5OuXsCPgVk0pMb zlv5BiVVtGaw3^VjY-cA|ICG0#_k$f7Oc0q~>X{UuWs~6^>j@RI4{hr7ktJEqU%7De zcw;W2II_c^gze#Bn90Hane^cy93J@>NkJsRWOy~=q$;ojGMr4CoC7-a{@OTPC4cu6 znl8XHHnSNp?>56A^RWXiY zWKzeKv*RE+Yq1pwC{Kq9+^IE^A;gg$`(kOw;SH*}SC@I~xx*I$Y68+1_5VN$TYFnj z^MkBhZ0J;%{=86XExgk=_jg9J6gOj!6!iG#wX1%Bgv*?SH(tDj9YJYK!E+;4TvAob zi1Og2B%?G1zqw7gw^4<4p>Mk^ltvG=$npozXnyTmj*!YwP>Y}H23N?p-=DkkXy;Se z5|)RRWReF2b;lZ&XbvQ8WjRr(zEzH2@MkTry9jO&F4kz{)qg2993lQnXG8VHGf#kE zLaOJO+DGC|^j#o(M1J51D0rxwiA@n>h_ZQp%)hM2@$2N0%w7y^S}Ar!QP?C9dN^3{ zlBMWmBoeED2W{S+nahlNY7olv*+7xq;y~UDD|x>eXu*U_T}k&Rc21?~NAWWa9ytL` zomSgqhBRrjRzl212_CaM(;_G_$4AB|Zn{YX}qZH@&hwK0>}mHszPdF6)NtrXtYFeJ#6 z>>e=kP(ao-%K*}*J}#$v3C4jga~)2`KaMUOx9HIQfT&Nkhny!O~hXJnhsc3c*Wr~u4;Y*MhKUHEs1H`Hn- zEY%9{^8C1X7c-Wn=yL8$&EYvorC_ZR$Eoa$c=3yZw{+4;3lbgc<^VM8KR#sElM z>WXFLhD7i&kd2c;Z6eBCgHf|$sRWO4CsV=wlK;NP+skL#+c!VdTit|M{AwvCRo;MI zSWpaJNb}NVS*z{1yo6Yo+(_|@3>$s)r~!)Q!}y5xjtW(B7CEsQ}k zi;&z>loKWGE!e$?JY7wy33(dIIs1`cpPNe-%j5PE8z`6N5>TF-?YGz|C@2WEG+|EC zF-;?b2NVR+ePNUloPZK0FAr0Ec+*EEV_MZ-0p^}MrD(v`SYg-%4%hzDTJy{PoS^4o zWHh3%L8p}?xsL``wk}e(j+K?y(dJfRZ`A{jo=n1$*0C8@ba!J1AAbOxdzEm7Y1NU& zen`J1WhXKEE=S?7;YkR57)cW^+-CqUvd-vo3u7M{il&NOvrmWkTaYoXt6Q@P0m~`ZV z?1@$&b-B3$4=#E#sgtdZU&3zzHkx()FW=)Rc|*ON*DhwEDZAZsn{3ZZ z<*>J%F&9U?T@-HmjTDx135IRfWcCG>U+&9>Iykr+8AZ=KZ1s|89X&P-nqmoZrN!Cx z!#k4bbv<~4B=Bg@rqDVgi6T-sFzs2TxI+Qb5E+-qZ^O~W>=GnV% z-BYZH!OC;)Qbw3C=)?>EYMvDz4AF`3(>R*P7U-n?<43g5+#e=me)=!>{5nC5#P2tA z?R4gr>Vh^&Wt$Gc1i#y+E_a>wGCyjH285q=xy9Ju9j#mzm7}rU*WY{&F`x>GyX;9pAIw7zHyO=Yn zEE7UB$x1FiUyi+;>SkBgMlQ!toS4}a|EwcpRJ>zTO9165t8JkyHE53{qLFt^1Tz_JJ>pNH4g|`X=;@2KREX*2q{L#oFr42gX`Jb$&4lq(H~{R9Q>xrXsCktfQe@&$5Fbiohc?rO67bS{#FUWQ+sl%Qr1o~a>5r6Rw-tw-dEmt;4;@=6P`9@sMNBUOSBJnE z8z3h>w=B1tPdPC5^OtLNdM{PrPy@di4;HT1sPk}ciQorH9on=K%_9uw z99LJviW0=wsOKstXNWC_l=6NJ;N)latlUuj*=Qbz$fnK+(Ctm^q!9BTPMrX_rN!x; zecqkR&rg26jIUc?|0FhN9x^N6Rg-D#N#^v@fAU2lF0;4vn3x87MnZwA3lIx%MRzLp{avd{mrrU_m-g9~@Q( zir3Ah>II07CeJH#Qx}mSHtWK)lg--H(9|H#Rn&mWFWKQZKd{y!9Cael<(rF5L3Hss z%PC?PiMhx*N`UVb!Pc1i+Ks=|F}1`Mu*bsqv2@J8)YB!KiqRtgBx~P9Wj$MQ29%yw z#)THQ4hqT(1ZK_-u4ta9sOgQU#DnhvbR-lc^cX5ePPWrhTdA|!^(l=o4a>Zbp6yH$ zapQBz>`;Bhbve5cD#kG0%(eEdLGD(LRz%FS>P~lfD}=0+Y(f(nN6~6zO?Hau6bHL5 zV$?OJkdTL_am$)9;G0JJBwEeH_#3x#J)~GBIdjI zb12~b`ryjSx<{&zC`b1z=tp5I^*+#si$XMf|0HA6U3jC>Aw;+&Zsj|}E7>ti4bBAY zLf`WRd#Jji;7y`g@W`iBX(!B>@^M%MQ&*@-=&qB+tBu+Q&;g&phYe?YN740x$`NId z8fP>Vtw*LxeF+0g(s7K58JVr3M#W)BfW{14EqBn09Bejy?DZ%mF=G3}$`lVPk>HoM z$z@KNe79|hq8`1lR>{c+?S|=EAhPaPOys9rEE@4zNTY})2L(N=aJ`DjPW(HfZDIgy zt^k?LAJz&+pCG?^V}vn4=^<4uR|3S3EevAXd2idQ$)434UGO2H#F6gp1aW4KOr-3)`Y4u~bs(8LL^zgB$o)27*n@@C<;+(T#BhAFDCn-M*ad~Gna=tCb^>UO; zi8%OKpTeZocB&@j(<4EtMiMWAn^9@XDaDJvr%{~ID9e$t&#E(V9tatzF4gxU<1x(a zrA|lp4UWdfI*C$hHTL*J`*33#&_S>mzP=0Z=9aveNz~0mO|9pX+*cZ@`h-{spg0fE zwk9d9GCe{1O|Ain1;>~rRwukjH42%%He#Hr3T_xf9&#%XR7!#=>7#|`UBv`D;ClY( z7<%RUjYz%a?Ijn~gEfFIPqF3{5jX;E&Og&wk~7+=XPVm4_GCcf63o{|7*J}`4jBmwUBe

5p5+j(rD_X)X6%u4+I_3m+qNc@2jgn)+j+0 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

fp|D-6m_ozo7Er(WpIf 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

6H0Z1y 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 literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/tnef/christmas/message.rtf b/UnitTests/TestData/tnef/christmas/message.rtf new file mode 100644 index 0000000000..4dbeccbb9e --- /dev/null +++ b/UnitTests/TestData/tnef/christmas/message.rtf @@ -0,0 +1,55 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 00000000000000000000}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f186\fbidi \froman\fcharset0\fprq2{\*\panose 0208090404030b020404}Cooper Black;}{\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f428\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f429\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f431\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f432\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f433\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f434\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f435\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f436\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f768\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f769\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f771\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f772\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f775\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f776\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f798\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f799\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f801\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f802\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f803\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f804\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f805\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f806\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}{\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);}{\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}{\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green0\blue0;\red0\green0\blue0;\red5\green99\blue193;\red149\green79\blue114;\red255\green255\blue255;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf19 \sbasedon10 \ssemihidden \sunhideused \styrsid1065446 Hyperlink;}{\*\cs16 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf20 \sbasedon10 \ssemihidden \sunhideused \styrsid1065446 FollowedHyperlink;}{\s17\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs21\alang1025 \ltrch\fcs0 \f37\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 \slink18 \sunhideused \styrsid1065446 Plain Text;}{\*\cs18 \additive \rtlch\fcs1 \af0\afs21 \ltrch\fcs0 \f37\fs21 \sbasedon10 \slink17 \slocked \styrsid1065446 Plain Text Char;}{\*\cs19 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 \sqformat \spriority22 \styrsid1065446 Strong;}}{\*\revtbl {Unknown;}}{\*\rsidtbl \rsid1011802\rsid1065446}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect \widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin150\dgvorigin0\dghshow1\dgvshow1\jexpand\viewkind5\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0{\*\background {\shp{\*\shpinst\shpleft0\shptop0\shpright0\shpbottom0\shpfhdr0\shpbxmargin\shpbxignore\shpbymargin\shpbyignore\shpwr0\shpwrk0\shpfblwtxt1\shpz0\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillType}{\sv 6}}{\sp{\sn fillColor}{\sv 255}}{\sp{\sn fillBackColor}{\sv 2315831}}{\sp{\sn fillFocus}{\sv 100}}{\sp{\sn fillToLeft}{\sv 32768}}{\sp{\sn fillToTop}{\sv 32768}}{\sp{\sn fillToRight}{\sv 32768}}{\sp{\sn fillToBottom}{\sv 32768}}{\sp{\sn fUseShapeAnchor}{\sv 0}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn bWMode}{\sv 9}}{\sp{\sn fBackground}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}}}\ltrpar \sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1065446 \rtlch\fcs1 \af31507\afs21\alang1025 \ltrch\fcs0 \f37\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1065446 \rtlch\fcs1 \af31507\afs24\alang1025 \ltrch\fcs0 \f186\fs24\cf21\lang1033\langfe1033\cgrid\langnp1033\langfenp1033\insrsid1065446 {{\objattph {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \f186\fs24\cf21\insrsid1065446 }}}}\sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \f186\fs24\cf21\insrsid1065446 +\par +\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \f186\fs24\cf21\insrsid1065446\charrsid1065446 You've made this a Christmas to remember +\par Springtime feeling's in the middle of December +\par Strangers meet and willingly surrender +\par Oh! What a Christmas to remember +\par Almost went to Aspen but something told me no +\par I considered Mammoth but there wasn't enough snow +\par And I even thought of Gatlinburg but seemed so far to go +\par So I headed up to Tahoe for a Christmas on the slopes +\par +\par And I had fantasized about Christmas in this way +\par Curled up by a fireplace in a Tahoe ski chalet +\par With a fast talking lover and some slow burning wood +\par But even in my wildest dreams it never got this good and +\par +\par You've made this a Christmas to remember +\par Springtime feeling's in the middle of December +\par Change the radio and I'll turn the lights down dimmer +\par Oh! What a Christmas to remember +\par +\par Strangers when we met, lovers as we leave +\par Christmas to remember, too good to believe +\par Don't know how or when, but I know we'll meet again +\par Blowin' back to somewhere like some wild restless winter's wind +\par +\par And you've made this a Christmas to remember +\par Springtime feeling's in the middle of December +\par 'Neath the mistletoe you kissed me warm and tender +\par Oh! What a Christmas to remember +\par +\par We loved and laughed and played and joked +\par Sang Christmas songs and talked to folks +\par Sleighed the fields and skied the slopes +\par Then to the lodge for dinner +\par Now it's time for us to go +\par As our hearts melt like chimney snow +\par There's just one thing I want to know +\par Can we do this next winter +\par Oh! What a Christmas to remember +\par +\par You've made this a Christmas to remember +\par Springtime feeling's in the middle of December +\par Though the fire is hot, we'll just have to let it simmer +\par Oh! What a Christmas to remember +\par +\par You've made this a Christmas to remember +\par Springtime feeling's in the middle of December +\par Though it's cold outside we'll just stroke the burning embers +\par Oh! What a Christmas to remember}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \f186\fs24\cf21\insrsid1065446\charrsid1065446 +\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid1065446\charrsid1065446 +\par }{\pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1065446 \rtlch\fcs1 \af31507\afs21\alang1025 \ltrch\fcs0 \f37\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033\insrsid1065446 {{\objattph {\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid1065446 }}}}\sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1065446 \rtlch\fcs1 \af31507\afs21\alang1025 \ltrch\fcs0 \f37\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033\insrsid1065446 {{\objattph {\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid1065446 }}}}\sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid1065446 +\par +\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \cf0\insrsid1065446\charrsid1065446 +\par }} \ No newline at end of file diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 750bc57159..46d0b8d04d 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -750,7 +750,9 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom } // Step 2: verify that the content of the extracted attachments matches up with the expected content + byte[] expectedData, actualData; int untitled = 1; + foreach (var part in attachments.OfType ()) { var isText = false; string fileName; @@ -765,7 +767,7 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom isText = true; } else if (part.FileName == "Untitled Attachment") { - // special case for winmail.tnef + // special case for winmail.tnef and christmas.tnef fileName = string.Format ("Untitled Attachment.{0}", untitled++); } else { var extension = Path.GetExtension (part.FileName); @@ -784,10 +786,13 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom var file = Path.Combine (path, fileName); - if (!File.Exists (file)) + if (!File.Exists (file)) { + //using (var stream = part.Content.Open ()) { + // actualData = ReadAllBytes (stream, isText); + // File.WriteAllBytes (file, actualData); + //} continue; - - byte[] expectedData, actualData; + } using (var stream = File.OpenRead (file)) expectedData = ReadAllBytes (stream, isText); @@ -814,6 +819,12 @@ public void TestBody () TestTnefParser ("../../TestData/tnef/body"); } + [Test] + public void TestChristmas () + { + TestTnefParser ("../../TestData/tnef/christmas", TnefComplianceStatus.UnsupportedPropertyType); + } + [Test] public void TestDataBeforeName () { diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index e155325078..52e6617f5f 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -245,6 +245,14 @@ + + + + + + + + From a2680d836034767a049f1796017ea1bd7c146b93 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 16 Dec 2018 12:19:43 -0500 Subject: [PATCH 195/741] Bumped version to 2.1.1 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 15 +++++++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 17 +++++++++-------- nuget/MimeKitLite.nuspec | 13 +++++++++---- 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index d088628739..f538ac4b59 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.0 + 2.1.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index c5c18abe7c..08558ff58a 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.0 + 2.1.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 9d1d57b420..d7e2385735 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.0.0")] -[assembly: AssemblyFileVersion ("2.1.0.0")] +[assembly: AssemblyInformationalVersion ("2.1.1.0")] +[assembly: AssemblyFileVersion ("2.1.1.0")] [assembly: AssemblyVersion ("2.1.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index d34add9ef0..02294f8259 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,20 @@ # Release Notes +### MimeKit 2.1.1 + +* Mapped the TNEF Sensitivity property to the Sensitivity message header when calling + TnefPart.ConvertToMessage(). +* Fixed the TNEF Importance and Priority mappings when calling TnefPart.ConvertToMessage(). +* Added more TnefPropertyId's that have been identified. +* Map PidTagTnefCorrelationKey to the Message-Id message header. +* When the TNEF data does not have a SentDate property, set the MimeMessage.Date property + to DateTimeOffset.MinValue instead of DateTimeOffset.Now. +* Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject + properties and use them if a TNEF Subject property is not available. +* Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning + of the content. +* Added more fallbacks for attempting to extract the sender information out of the TNEF data. + ### MimeKit 2.1.0 * Optimized SecureMimeCryptographyContext.Supports() and OpenPgpCryptographyContext.Supports() diff --git a/appveyor.yml b/appveyor.yml index a8ed2b5d33..f0f9c0cab6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.1.0.{build} +version: 2.1.1.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 57f2010cc6..db2ef0afc8 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.0 + 2.1.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -25,13 +25,14 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Optimized SecureMimeCryptographyContext.Supports() and OpenPgpCryptographyContext.Supports() implementations. -* Optimized the OptimizedOrdinalIgnoreCaseComparer even more. -* Fixed OpenPgpDigitalCertificate.ExpirationDate for PGP keys that never expire. -* Reduced string allocations in MultipartSigned.Verify() and MultipartEncrypted.Decrypt(). -* Fixed OpenPgpContext.Decrypt() to make sure to always clean up MemoryBlockStreams. -* Added a bunch more HeaderId enum values. -* Improved header folding logic for headers with long words. (issue #451) +* Mapped the TNEF Sensitivity property to the Sensitivity message header when calling TnefPart.ConvertToMessage(). +* Fixed the TNEF Importance and Priority mappings when calling TnefPart.ConvertToMessage(). +* Added more TnefPropertyId's that have been identified. +* Map PidTagTnefCorrelationKey to the Message-Id message header. +* When the TNEF data does not have a SentDate property, set the MimeMessage.Date property to DateTimeOffset.MinValue instead of DateTimeOffset.Now. +* Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject properties and use them if a TNEF Subject property is not available. +* Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content. +* Added more fallbacks for attempting to extract the sender information out of the TNEF data. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index f3f7047658..1732c51d25 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.0 + 2.1.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -25,9 +25,14 @@ An Open Source library for creating and parsing MIME messages. -* Optimized the OptimizedOrdinalIgnoreCaseComparer even more. -* Added a bunch more HeaderId enum values. -* Improved header folding logic for headers with long words. (issue #451) +* Mapped the TNEF Sensitivity property to the Sensitivity message header when calling TnefPart.ConvertToMessage(). +* Fixed the TNEF Importance and Priority mappings when calling TnefPart.ConvertToMessage(). +* Added more TnefPropertyId's that have been identified. +* Map PidTagTnefCorrelationKey to the Message-Id message header. +* When the TNEF data does not have a SentDate property, set the MimeMessage.Date property to DateTimeOffset.MinValue instead of DateTimeOffset.Now. +* Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject properties and use them if a TNEF Subject property is not available. +* Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content. +* Added more fallbacks for attempting to extract the sender information out of the TNEF data. Xamarin Inc. en-US From 47c7b4ce5c0381d8d29729a477fa15e15add9925 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 16 Dec 2018 12:51:07 -0500 Subject: [PATCH 196/741] bumped Android projects to target Android v8.0 (Oreo) This also bumps Android and iOS versions of BouncyCastle to v1.8.4 --- MimeKit/MimeKit.Android.csproj | 2 +- MimeKit/MimeKit.Android.project.json | 2 +- MimeKit/MimeKitLite.Android.csproj | 2 +- MimeKit/MimeKitLite.Android.project.json | 2 +- submodules/bc-csharp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 156405415b..33ead3b9f5 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -15,7 +15,7 @@ Assets false MimeKit - v4.0.3 + v8.0 diff --git a/MimeKit/MimeKit.Android.project.json b/MimeKit/MimeKit.Android.project.json index 814017484f..e48a8bf5fe 100644 --- a/MimeKit/MimeKit.Android.project.json +++ b/MimeKit/MimeKit.Android.project.json @@ -1,6 +1,6 @@ { "frameworks": { - "MonoAndroid,Version=v4.0.3": {} + "MonoAndroid,Version=v8.0": {} }, "runtimes": { "win-anycpu": {} diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index 1c46d1c723..cdaeab72ed 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -15,7 +15,7 @@ Assets False MimeKitLite - v4.0.3 + v8.0 true diff --git a/MimeKit/MimeKitLite.Android.project.json b/MimeKit/MimeKitLite.Android.project.json index 22430247f9..6ca0130cb4 100644 --- a/MimeKit/MimeKitLite.Android.project.json +++ b/MimeKit/MimeKitLite.Android.project.json @@ -1,6 +1,6 @@ { "frameworks": { - "MonoAndroid,Version=v4.0.3": {} + "MonoAndroid,Version=v8.0": {} }, "runtimes": { "win-anycpu": {} diff --git a/submodules/bc-csharp b/submodules/bc-csharp index 46a73f7278..068c4821fb 160000 --- a/submodules/bc-csharp +++ b/submodules/bc-csharp @@ -1 +1 @@ -Subproject commit 46a73f7278c3ba6e79a46000e62f9a4bffbfb429 +Subproject commit 068c4821fbad1c703cb0a4e26b342b2abaca788d From 3ff3f8dac2884f120ff26bd19eda98b3486654c1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 16 Dec 2018 12:53:23 -0500 Subject: [PATCH 197/741] Updated ReleaseNotes.md --- ReleaseNotes.md | 1 + nuget/MimeKit.nuspec | 1 + 2 files changed, 2 insertions(+) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 02294f8259..3d8e487fe9 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -14,6 +14,7 @@ * Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content. * Added more fallbacks for attempting to extract the sender information out of the TNEF data. +* Bumped Android and iOS versions of BouncyCastle to v1.8.4. ### MimeKit 2.1.0 diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index db2ef0afc8..960cf5521e 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -33,6 +33,7 @@ * Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject properties and use them if a TNEF Subject property is not available. * Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content. * Added more fallbacks for attempting to extract the sender information out of the TNEF data. +* Bumped Android and iOS versions of BouncyCastle to v1.8.4. Xamarin Inc. en-US From 466f7eef5722e938e0ca4f5f5c7ce5fde0764b1c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 16 Dec 2018 13:49:28 -0500 Subject: [PATCH 198/741] updated samples --- nuget/MimeKit.nuspec | 5 +++-- nuget/MimeKitLite.nuspec | 5 +++-- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 8 ++++---- .../MessageReader.Android/Properties/AndroidManifest.xml | 2 +- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 11 files changed, 20 insertions(+), 18 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 960cf5521e..3c49f38e61 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -6,8 +6,9 @@ MimeKit Jeffrey Stedfast Jeffrey Stedfast - http://opensource.org/licenses/MIT - http://github.com/jstedfast/MimeKit + MIT + http://www.mimekit.net + https://raw.github.com/jstedfast/MimeKit/master/nuget/mimekit-50.png false diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 1732c51d25..9d55e4fc51 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -6,8 +6,9 @@ MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast - http://opensource.org/licenses/MIT - http://github.com/jstedfast/MimeKit + MIT + http://www.mimekit.net + https://raw.github.com/jstedfast/MimeKit/master/nuget/mimekit-50.png false diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 15b6116a8d..1ed1a0f715 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.0\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.1\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 9a674c9c4a..72e3edff98 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 1c320b2a0c..1a82765e87 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -15,7 +15,7 @@ False MessageReader.Android Properties\AndroidManifest.xml - v5.0 + v9.0 armeabi,armeabi-v7a,x86 @@ -55,11 +55,11 @@ False - - ..\packages\MimeKit.2.1.0\lib\monoandroid\BouncyCastle.dll + + ..\packages\MimeKit.2.1.1\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.1.0\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.1.1\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/Properties/AndroidManifest.xml b/samples/MessageReader.Android/MessageReader.Android/Properties/AndroidManifest.xml index d11acbfb37..f4f6ef74d9 100644 --- a/samples/MessageReader.Android/MessageReader.Android/Properties/AndroidManifest.xml +++ b/samples/MessageReader.Android/MessageReader.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 2a199ee928..3570e2749c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 6559322d9b..2d296fb468 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -67,11 +67,11 @@ Default - - ..\packages\MimeKit.2.1.0\lib\xamarinios\BouncyCastle.dll + + ..\packages\MimeKit.2.1.1\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.1.0\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.1.1\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 58eeb2b347..d689d9dfad 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 1be49b2051..1bc96b4409 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.0\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.1\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index c7a236c8a1..79d8d77201 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 8688ee33eb3f202c58ef3dc7f11cd2fab5291862 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 10:19:59 -0500 Subject: [PATCH 199/741] Updated appveyor.yml Build MimeKit.sln instead of MimeKit.Net45.sln and try creating nuget packages --- appveyor.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f0f9c0cab6..8e14d64b58 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,9 @@ os: Visual Studio 2017 configuration: Debug platform: Any CPU +init: + git config --global core.autocrlf true + branches: only: - master @@ -14,12 +17,17 @@ environment: secure: bY3HMQXJsuuHTqtDx878B8dh+vRw8Sr+ffu+i2ycNlnvN3NUsGXVCj/SUBlbsNdL install: - - cmd: git submodule update --init --recursive - - cmd: nuget restore MimeKit.Net45.sln +- cmd: git submodule update --init --recursive +- cmd: nuget restore MimeKit.sln build: - project: MimeKit.Net45.sln + project: MimeKit.sln verbosity: minimal + parallel: true + +nuget: + project_feed: true + disable_publish_on_pr: true test_script: - ps: >- From f9eb3290c6c11daf3d967a97e8df240f2fc94cf2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 12:03:15 -0500 Subject: [PATCH 200/741] Revert appveyor.yml --- appveyor.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 8e14d64b58..ab1eb8f77c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,9 +3,6 @@ os: Visual Studio 2017 configuration: Debug platform: Any CPU -init: - git config --global core.autocrlf true - branches: only: - master @@ -18,17 +15,13 @@ environment: install: - cmd: git submodule update --init --recursive -- cmd: nuget restore MimeKit.sln +- cmd: nuget restore MimeKit.Net45.sln build: - project: MimeKit.sln + project: MimeKit.Net45.sln verbosity: minimal parallel: true -nuget: - project_feed: true - disable_publish_on_pr: true - test_script: - ps: >- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml From a05fe7a1fb682bcd2f1c7a5b670b2fdf660a59b2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 13:44:16 -0500 Subject: [PATCH 201/741] Removed the components/ directory and moved the GettingStarted.md doc to nuget/ Might be worth including GettingStarted.md in future nuget packages. --- component/Details.md | 18 -- component/Makefile | 23 --- component/component.yaml | 24 --- {component => nuget}/GettingStarted.md | 242 ++++++++++++++++++++--- {component => nuget}/mimekit_128x128.png | Bin {component => nuget}/mimekit_512x512.png | Bin 6 files changed, 215 insertions(+), 92 deletions(-) delete mode 100644 component/Details.md delete mode 100644 component/Makefile delete mode 100644 component/component.yaml rename {component => nuget}/GettingStarted.md (79%) rename {component => nuget}/mimekit_128x128.png (100%) rename {component => nuget}/mimekit_512x512.png (100%) diff --git a/component/Details.md b/component/Details.md deleted file mode 100644 index 271acfd04a..0000000000 --- a/component/Details.md +++ /dev/null @@ -1,18 +0,0 @@ -MimeKit is an Open Source library for creating and parsing MIME, S/MIME and PGP -messages on desktop platforms (e.g. Windows, Mac, and Linux) as well as mobile -platforms (e.g. iOS and Android). It also supports parsing of Unix mbox files. - -Unlike any other .NET MIME parser, MimeKit's parser does not need to parse -string input nor does it use a TextReader. Instead, it parses raw byte streams, -thus allowing it to better support undeclared 8bit text in headers as well as -message bodies. It also means that MimeKit's parser is significantly faster -than other .NET MIME parsers. - -MimeKit's parser also uses a real tokenizer when parsing the headers rather -than regex or string.Split() like most other .NET MIME parsers. This means that -MimeKit is much more RFC-compliant than any other .NET MIME parser out there, -including the commercial implementations. - -In addition to having a far superior parser implementation, MimeKit's object -tree is not a derivative of System.Net.Mail objects and thus does not suffer -from System.Net.Mail's massive limitations or bugs. diff --git a/component/Makefile b/component/Makefile deleted file mode 100644 index fd869b43ea..0000000000 --- a/component/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -all: - -#build: -# xbuild /property:Configuration=Release /target:Rebuild ../MimeKit.Mobile.sln - -package: ./tools/ - mono ./tools/xamarin-component.exe package - -validate: ./tools/ - mono ./tools/xamarin-component.exe validate - -upload: ./tools/ - mono ./tools/xamarin-component.exe upload - -./tools/: - rm -rf ./tools/ - mkdir ./tools/ - cd ./tools/ && curl -silent -L https://components.xamarin.com/submit/xpkg > tools.zip - -cd ./tools/ && unzip tools.zip - rm ./tools/tools.zip - -clean: - rm -rf ./tools/ diff --git a/component/component.yaml b/component/component.yaml deleted file mode 100644 index aff2177c1b..0000000000 --- a/component/component.yaml +++ /dev/null @@ -1,24 +0,0 @@ -id: mimekit -name: MimeKit -version: 2.0.0 -publisher: Jeffrey Stedfast -publisher-url: https://github.com/jstedfast/MimeKit -getting-started: GettingStarted.md -details: Details.md -license: ../License.md -summary: A complete MIME email library with support for S/MIME, OpenPGP, and DKIM. -icons: - - mimekit_512x512.png - - mimekit_128x128.png -packages: - ios-unified: - - MimeKit, Version=2.0.0 - android: - - MimeKit, Version=2.0.0 -samples: - - name: "Android Sample" - path: ../samples/MessageReader.Android/MessageReader.Android.sln - - name: "iOS Sample" - path: ../samples/MessageReader.iOS/MessageReader.iOS.sln -no_build: true -is_shell: true diff --git a/component/GettingStarted.md b/nuget/GettingStarted.md similarity index 79% rename from component/GettingStarted.md rename to nuget/GettingStarted.md index 7335742906..98cc8d8628 100644 --- a/component/GettingStarted.md +++ b/nuget/GettingStarted.md @@ -55,7 +55,7 @@ to be interpreted as attachments. The `Content-Disposition` header will generally have one of two values: `inline` or `attachment`. -The meaning of these value should be fairly obvious. If the value is `attachment`, then the content +The meaning of these values should be fairly obvious. If the value is `attachment`, then the content of said MIME part is meant to be presented as a file attachment separate from the core message. However, if the value is `inline`, then the content of that MIME part is meant to be displayed inline within the mail client's rendering of the core message body. If the `Content-Disposition` header does @@ -180,15 +180,15 @@ save the decoded content to a file: var fileName = part.FileName; using (var stream = File.Create (fileName)) { - part.ContentObject.DecodeTo (stream); + part.Content.DecodeTo (stream); } ``` -You can also get access to the original raw content by "opening" the `ContentObject`. This might be useful +You can also get access to the original raw content by "opening" the `Content`. This might be useful if you want to pass the content off to a UI control that can do its own loading from a stream. ```csharp -using (var stream = part.ContentObject.Open ()) { +using (var stream = part.Content.Open ()) { // At this point, you can now read from the stream as if it were the original, // raw content. Assuming you have an image UI control that could load from a // stream, you could do something like this: @@ -261,7 +261,7 @@ Will you be my +1? // create an image attachment for the file located at path var attachment = new MimePart ("image", "gif") { - ContentObject = new ContentObject (File.OpenRead (path), ContentEncoding.Default), + Content = new MimeContent (File.OpenRead (path), ContentEncoding.Default), ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), ContentTransferEncoding = ContentEncoding.Base64, FileName = Path.GetFileName (path) @@ -361,12 +361,17 @@ If you are targetting any of the Xamarin platforms (or Linux), you won't need to anything (although you certainly can if you want to) because, by default, I've configured MimeKit to use the Mono.Data.Sqlite binding to SQLite. -If you are, however, on any of the Windows platforms, you'll need to pick a System.Data -provider such as [System.Data.SQLite](https://www.nuget.org/packages/System.Data.SQLite). -Once you've made your choice and installed it (via NuGet or however), you'll need to -implement your own `SecureMimeContext` subclass. Luckily, it's very simple to do. Assuming -you've chosen System.Data.SQLite, here's how you'd implement your own `SecureMimeContext` -class: +If you are on any of the Windows platforms, however, you'll need to decide on whether +to use one of the conveniently available backends such as the `WindowsSecureMimeContext` +backend or the `TemporarySecureMimeContext` backend or else you'll need to pick a +System.Data provider such as +[System.Data.SQLite](https://www.nuget.org/packages/System.Data.SQLite) to use with +the `DefaultSecureMimeContext` base class. + +If you opt for using the `DefaultSecureMimeContext` backend, you'll need to implement +your own `DefaultSecureMimeContext` subclass. Luckily, it's very simple to do. +Assuming you've chosen System.Data.SQLite, here's how you'd implement your own +`DefaultSecureMimeContext` class: ```csharp using System.Data.SQLite; @@ -405,6 +410,9 @@ CryptographyContext.Register (typeof (MySecureMimeContext)); Now you are ready to encrypt, decrypt, sign and verify S/MIME messages! +Note: If you choose to use the `WindowsSecureMimeContext` or `TemporarySecureMimeContext` backend, +you should register that class instead. + ### Preparing to use MimeKit's PGP/MIME support Like with S/MIME support, you also need to register your own `OpenPgpContext`. Unlike S/MIME, however, @@ -572,7 +580,7 @@ would use an OpenPGP cryptography context. For example, you might use a subclass use `GnuPGContext` directly because it has no way of prompting the user for their passphrase). For the sake of this example, let's pretend that you've written a minimal subclass of -`MimeKit.Cryptography.GnuPGContext` that simply overrides the `GetPassword()` method and +`MimeKit.Cryptography.GnuPGContext` that only overrides the `GetPassword()` method and that this subclass is called `MyGnuPGContext`. ```csharp @@ -688,31 +696,211 @@ As you can see, it's fairly straight forward. Verifying DKIM signatures is slightly more involved than creating them because you'll need to write a custom implementation of the `IDkimPublicKeyLocator` interface. Typically, this custom class will need to download -the DKIM public keys as they are requested by MimeKit during verification of DKIM signature headers. +the DKIM public keys via your chosen DNS library as they are requested by MimeKit during verification of +DKIM signature headers. -Once you've implemented a custom `IDkimPublicKeyLocator`, verifying signatures is fairly trivial: +Once you've implemented a custom `IDkimPublicKeyLocator`, verifying signatures is fairly trivial. Most of the work +needed will be in the `IDkimPublicKeyLocator` implementation. As an example of how to implement this interface, +here is one possible implementation using the [Heijden.DNS](http://www.nuget.org/packages/Heijden.Dns/) library: ```csharp -var dkim = message.Headers[HeaderId.DkimSignature]; +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Collections.Generic; + +using Heijden.DNS; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; -if (message.Verify (dkim, locator)) { - // the DKIM-Signature header is valid! -} else { - // the DKIM-Signature is invalid +using MimeKit; +using MimeKit.Cryptography; + +namespace DkimVerifier +{ + class DkimPublicKeyLocator : IDkimPublicKeyLocator + { + readonly Dictionary cache; + readonly Resolver resolver; + + public DkimPublicKeyLocator () + { + cache = new Dictionary (); + + resolver = new Resolver ("8.8.8.8") { + TransportType = TransportType.Udp, + UseCache = true, + Retries = 3 + }; + } + + AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationToken cancellationToken) + { + var query = selector + "._domainkey." + domain; + AsymmetricKeyParameter pubkey; + + // checked if we've already fetched this key + if (cache.TryGetValue (query, out pubkey)) + return pubkey; + + // make a DNS query + var response = resolver.Query (query, QType.TXT); + var builder = new StringBuilder (); + + // combine the TXT records into 1 string buffer + foreach (var record in response.RecordsTXT) { + foreach (var text in record.TXT) + builder.Append (text); + } + + var txt = builder.ToString (); + string k = null, p = null; + int index = 0; + + // parse the response (will look something like: "k=rsa; p=") + while (index < txt.Length) { + while (index < txt.Length && char.IsWhiteSpace (txt[index])) + index++; + + if (index == txt.Length) + break; + + // find the end of the key + int startIndex = index; + while (index < txt.Length && txt[index] != '=') + index++; + + if (index == txt.Length) + break; + + var key = txt.Substring (startIndex, index - startIndex); + + // skip over the '=' + index++; + + // find the end of the value + startIndex = index; + while (index < txt.Length && txt[index] != ';') + index++; + + var value = txt.Substring (startIndex, index - startIndex); + + switch (key) { + case "k": k = value; break; + case "p": p = value; break; + } + + // skip over the ';' + index++; + } + + if (k != null && p != null) { + var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; + var rawData = Encoding.ASCII.GetBytes (data); + + using (var stream = new MemoryStream (rawData, false)) { + using (var reader = new StreamReader (stream)) { + var pem = new PemReader (reader); + + pubkey = pem.ReadObject () as AsymmetricKeyParameter; + + if (pubkey != null) { + cache.Add (query, pubkey); + + return pubkey; + } + } + } + } + + throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); + } + + public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + var methodList = methods.Split (new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < methodList.Length; i++) { + if (methodList[i] == "dns/txt") + return DnsLookup (domain, selector, cancellationToken); + } + + throw new NotSupportedException (string.Format ("{0} does not include any suported lookup methods.", methods)); + } + } + + class Program + { + public static void Main (string[] args) + { + if (args.Length == 0) { + Help (); + return; + } + + for (int i = 0; i < args.Length; i++) { + if (args[i] == "--help") { + Help (); + return; + } + } + + var locator = new DkimPublicKeyLocator (); + + for (int i = 0; i < args.Length; i++) { + if (!File.Exists (args[i])) { + Console.Error.WriteLine ("{0}: No such file.", args[i]); + continue; + } + + Console.Write ("{0} -> ", args[i]); + + var message = MimeMessage.Load (args[i]); + var index = message.Headers.IndexOf (HeaderId.DkimSignature); + + if (index == -1) { + Console.WriteLine ("NO SIGNATURE"); + continue; + } + + var dkim = message.Headers[index]; + + if (message.Verify (dkim, locator)) { + // the DKIM-Signature header is valid! + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine ("VALID"); + Console.ResetColor (); + } else { + // the DKIM-Signature is invalid! + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine ("INVALID"); + Console.ResetColor (); + } + } + } + + static void Help () + { + Console.WriteLine ("Usage is: DkimVerifier [options] [messages]"); + Console.WriteLine (); + Console.WriteLine ("Options:"); + Console.WriteLine (" --help This help menu."); + } + } } ``` ## Donate MimeKit is a personal open source project that I have put thousands of hours into perfecting with the -goal of making it not only the very best MIME parser framework for .NET, but the best MIME parser -framework for any programming language. I need your help to achieve this. - - - Click here to lend your support to MimeKit and MailKit by making a donation via pledgie.com! - +goal of making it the very best MIME parser framework for .NET. I need your help to achieve this. + +Donating helps pay for things such as web hosting, domain registration and licenses for developer tools +such as a performance profiler, memory profiler, a static code analysis tool, and more. It also helps +motivate me to continue working on the project. + +Click here to lend your support to MimeKit by making a donation! ## Reporting Bugs diff --git a/component/mimekit_128x128.png b/nuget/mimekit_128x128.png similarity index 100% rename from component/mimekit_128x128.png rename to nuget/mimekit_128x128.png diff --git a/component/mimekit_512x512.png b/nuget/mimekit_512x512.png similarity index 100% rename from component/mimekit_512x512.png rename to nuget/mimekit_512x512.png From cb8aac1456153ec333a3fda20016b705bc8cf90a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 14:24:13 -0500 Subject: [PATCH 202/741] Added release dates --- ReleaseNotes.md | 134 ++++++++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 3d8e487fe9..8f465236e2 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,6 +1,6 @@ # Release Notes -### MimeKit 2.1.1 +### MimeKit 2.1.1 (2018-12-16) * Mapped the TNEF Sensitivity property to the Sensitivity message header when calling TnefPart.ConvertToMessage(). @@ -16,7 +16,7 @@ * Added more fallbacks for attempting to extract the sender information out of the TNEF data. * Bumped Android and iOS versions of BouncyCastle to v1.8.4. -### MimeKit 2.1.0 +### MimeKit 2.1.0 (2018-12-01) * Optimized SecureMimeCryptographyContext.Supports() and OpenPgpCryptographyContext.Supports() implementations. @@ -28,7 +28,7 @@ * Improved header folding logic for headers with long words. (issue [#451](https://github.com/jstedfast/MimeKit/issues/451)) -### MimeKit 2.0.7 +### MimeKit 2.0.7 (2018-10-28) * Fixed a bug in the UUEncoder. * Fixed a bug in MimeIterator.MoveTo(). @@ -48,7 +48,7 @@ stream does not have properly formatted headers. (issue [#443](https://github.com/jstedfast/MimeKit/issues/443)) * Added support for message/global. -### MimeKit 2.0.6 +### MimeKit 2.0.6 (2018-08-04) * Added more bounds checking for parsing mailbox addresses to fix IndexOutOfRangeExceptions given an incomplete address like "Name <". (issue [#421](https://github.com/jstedfast/MimeKit/issues/421)) @@ -58,13 +58,13 @@ iso-8859-1. (issue [#417](https://github.com/jstedfast/MimeKit/issues/417)) * Minor optimizations. -### MimeKit 2.0.5 +### MimeKit 2.0.5 (2018-07-07) * Make sure messages created from System.Net.Mail.MailMessages have a Date header. (MailKit issue [#710](https://github.com/jstedfast/MailKit/issues/710)) * Allow developers to pass in their own SecureRandom when generating PGP key pairs. (issue [#404](https://github.com/jstedfast/MimeKit/issues/404)) * Modified MemoryBlockStream to use a shared buffer pool to relieve pressure on the GC. (MailKit issue [#725](https://github.com/jstedfast/MailKit/issues/725)) -### MimeKit 2.0.4 +### MimeKit 2.0.4 (2018-05-21) * The default value of the `CheckCertificateRevocation` property located on the `BouncyCastleSecureMimeContext` has been changed to `false` due to privacy concerns noted @@ -75,13 +75,13 @@ * Added FormatOptions.EnsureNewLine property (MailKit issue [#251](https://github.com/jstedfast/MailKit/issues/251)) * Enable System.Net.Mail support for .NET Core 2.0. (issue [#393](https://github.com/jstedfast/MimeKit/issues/393)) -### MimeKit 2.0.3 +### MimeKit 2.0.3 (2018-04-15) * Allow empty TextBody and HtmlBody properties for BodyBuilder. (issue [#391](https://github.com/jstedfast/MimeKit/issues/391)) * Fixed BodyBuilder.Attachments.Add() to properly handle message/rfc822 attachments. * Fixed HTML entity encoder logic when a surrogate pair is at the end of the input. (issue [#385](https://github.com/jstedfast/MimeKit/issues/385)) -### MimeKit 2.0.2 +### MimeKit 2.0.2 (2018-03-18) * IDN encode/decode the local part of mailbox addresses as well. (MailKit issue [#649](https://github.com/jstedfast/MailKit/issues/649)) * Added a record for .epub to the MimeTypes database. (issue [#376](https://github.com/jstedfast/MimeKit/issues/376)) @@ -91,7 +91,7 @@ * Provide a better error message when the cert within a pkcs12 cannot digital sign. (issue [#367](https://github.com/jstedfast/MimeKit/issues/367)) * Fixed TemporarySecureMimeContext to key off the certificate's fingerprint. -### MimeKit 2.0.1 +### MimeKit 2.0.1 (2018-01-06) * Improved the HTML parser logic to better handle a number of edge cases. * MimeKit will now automatically download CRLs based on the CRL Distribution Point @@ -108,7 +108,7 @@ specifying the symmetric key algorithm to use in generating the key pair. This defaults to AES-256, which is the same value used in older versions of MimeKit. -### MimeKit 2.0.0 +### MimeKit 2.0.0 (2017-12-22) * Added IDkimPublicKeyLocator.LookupPublicKeyAsync() and MimeMessage.VerifyAsync() to support asynchronous DNS lookups of DKIM public keys. @@ -124,7 +124,7 @@ * Renamed the MimePart.ContentObject property to MimePart.Content. * Dropped support for .NET 3.5 and .NET 4.0. -### MimeKit 1.22.0 +### MimeKit 1.22.0 (2017-11-24) * Fixed a buffering bug in MimeParser's header parser. (issue [#358](https://github.com/jstedfast/MimeKit/issues/358)) * Set the TnefReader charset on extracted text/plain and text/html bodies. (issue [#357](https://github.com/jstedfast/MimeKit/issues/357)) @@ -134,7 +134,7 @@ * Fixed the S/MIME certificate database for .NETStandard by using GetFieldValue() instead of GetBytes() which is not supported on .NETStandard. (issue [#351](https://github.com/jstedfast/MimeKit/issues/351)) -### MimeKit 1.20.0 +### MimeKit 1.20.0 (2017-10-28) * Added async support for writing MimeMessage, MimeEntity, HeaderList and ContentObject. * Added async support for parsing MimeMessage, MimeEntity, and HeaderList. @@ -147,7 +147,7 @@ (issue [#337](https://github.com/jstedfast/MimeKit/issues/337)) * Fixed a bug in BoundStream.Seek(). -### MimeKit 1.18.1 +### MimeKit 1.18.1 (2017-09-03) * Added CanSign() and CanEncrypt() methods to CryptographyContext for checking whether or not a mailbox can be used for signing or be encrypted to. (issue [#325](https://github.com/jstedfast/MimeKit/issues/325)) @@ -161,7 +161,7 @@ * Added OpenPgpContext.SignKey(). * Remove "Version:" header from armored OpenPGP output. (issue [#319](https://github.com/jstedfast/MimeKit/issues/319)) -### MimeKit 1.18.0 +### MimeKit 1.18.0 (2017-08-07) * Allow importing of known PGP keys (needed when re-importing keys after signing them). (issue [#315](https://github.com/jstedfast/MimeKit/issues/315)) * Added APIs to enumerate public and secret PGP keys. @@ -173,21 +173,21 @@ when the MailboxAddress argument is a SecureMailboxAddress. (issue [#322](https://github.com/jstedfast/MimeKit/issues/322)) * Fall back to using the Subject Alternative Rfc822 Name if the SubjectEmailAddress fails. (issue [#323](https://github.com/jstedfast/MimeKit/issues/323)) -### MimeKit 1.16.2 +### MimeKit 1.16.2 (2017-07-01) * Fixed a bug in the MailMessage to MimeMessage conversion which corrupted the Subject string. (issue [#306](https://github.com/jstedfast/MimeKit/issues/306)) * If no KeyUsage extension exists for an X509 certificate, assume no restrictions on key usage. * Throw an exception if there is a problem building an X509 certificate chain when verifying S/MIME signatures. -### MimeKit 1.16.1 +### MimeKit 1.16.1 (2017-05-05) * Fixed TextToHtml and FlowedToHtml's OutputHtmlFragment property to work. * Fixed EncodeAddrspec and DecodeAddrspec to handle string.Empty. (issue [#302](https://github.com/jstedfast/MimeKit/issues/302)) * Allow string.Empty as a valid addrspec for MailboxAddress. (issue [#302](https://github.com/jstedfast/MimeKit/issues/302)) * Catch exceptions trying to import CRLs and Certs when verifying S/MIME signatures. (issue [#304](https://github.com/jstedfast/MimeKit/issues/304)) -### MimeKit 1.16.0 +### MimeKit 1.16.0 (2017-04-21) * Added new ParserOptions option to allow local-only mailbox addresses (e.g. no @domain). * Improved address parser to interpret unquoted names containing commas in email addresses @@ -195,7 +195,7 @@ * Greatly improved the WindowsSecureMimeContext backend. * A number of fixes to bugs exposed by an ever-increasing set of unit tests (up to 87% coverage). -### MimeKit 1.14.0 +### MimeKit 1.14.0 (2017-04-09) * Added International Domain Name support for email addresses. * Added a work-around for mailers that didn't provide a disposition value in a @@ -211,7 +211,7 @@ * Format Reply-To and Sender headers as address headers when using Header.SetValue(). * Fixed MimeMessage.CreateFromMailMessage() to set MimeVersion. (issue [#290](https://github.com/jstedfast/MimeKit/issues/290)) -### MimeKit 1.12.0 +### MimeKit 1.12.0 (2017-03-12) * Added new DKIM MimeMessage.Sign() methods that take an IList of header field names to sign. @@ -228,36 +228,36 @@ * Store DBNull in S/MIME SQL backends for null values (SQLite handles `null` but databases such as Postgres do not). (issue [#286](https://github.com/jstedfast/MimeKit/issues/286)) -### MimeKit 1.10.1 +### MimeKit 1.10.1 (2017-01-28) * Fixed the Content-Type and Content-Disposition parameter parser to remove trailing lwsp from unquoted parameter values. (issue [#278](https://github.com/jstedfast/MimeKit/issues/278)) * Fixed MimePart.WriteTo() to not necessarily force the content to end with a new-line. -### MimeKit 1.10.0 +### MimeKit 1.10.0 (2016-10-31) * Fixed OpenPgpContext.Verify() to throw FormatException if no data packets found. * Added new MailboxAddress constructors that do not take a 'name' argument. (issue [#267](https://github.com/jstedfast/MimeKit/issues/267)) * Added an HtmlToHtml.FilterComments property to remove comments. (issue [#271](https://github.com/jstedfast/MimeKit/issues/271)) * Modified address parser to handle invalid addresses like "user@example.com ". -### MimeKit 1.8.0 +### MimeKit 1.8.0 (2016-09-25) * Improved parsing of malformed mailbox addresses. * Added DecompressTo() and DecryptTo() methods to SecureMimeContext. * Fixed MessagePartial.Split(). -### MimeKit 1.6.0 +### MimeKit 1.6.0 (2016-09-11) * Use RandomNumberGenerator.Create() for .NET Core instead of System.Random when generating multipart boundaries. -### MimeKit 1.4.2 +### MimeKit 1.4.2 (2016-08-14) * Strong-name the .NET Core assemblies. * Fixed logic for selecting certificates from the Windows X.509 Store. (issue [#262](https://github.com/jstedfast/MimeKit/issues/262)) -### MimeKit 1.4.1 +### MimeKit 1.4.1 (2016-07-17) * Fixed QuotedPrintableDecoder to handle soft breaks that fall on a buffer boundary. * Fixed MimeMessage.WriteTo() to properly respect the FormatOptions when writing the @@ -267,20 +267,20 @@ * Added new TextPart .ctor that takes a TextFormat argument so that developers that don't understand mime-types can more easily intuit what that argument should be. -### MimeKit 1.4.0 +### MimeKit 1.4.0 (2016-07-01) * Added support for .NET Core 1.0 * Changed the default value of FormatOptions.AllowMixedHeaderCharsets to false. * Added a new DkimSigner .ctor that takes a stream of key data. (issue [#255](https://github.com/jstedfast/MimeKit/issues/255)) -### MimeKit 1.2.25 +### MimeKit 1.2.25 (2016-06-16) * Fixed parsing bugs in MessageDeliveryStatus.StatusGroups. (issue [#253](https://github.com/jstedfast/MimeKit/issues/253)) * Fixed MimeParser.ParseHeaders() to handle header blocks that do not end with a blank line. (issue [#250](https://github.com/jstedfast/MimeKit/issues/250)) * Fixed the MailboxAddress parser to handle whitespace between '<' and the addr-spec. * Fixed TemporarySecureMimeContext to handle certificates with null email addresses. (issue [#252](https://github.com/jstedfast/MimeKit/issues/252)) -### MimeKit 1.2.24 +### MimeKit 1.2.24 (2016-05-22) * Modified MimeMessage .ctor to not add an empty To: header by default. (issue [#241](https://github.com/jstedfast/MimeKit/issues/241)) * Modified MimeMessage to remove address headers when all addresses in that field are removed. @@ -288,7 +288,7 @@ * Fixed TnefPropertyReader to convert APPTIME values into DateTimes from the OLE Automation Date format. (issue [#245](https://github.com/jstedfast/MimeKit/issues/245)) -### MimeKit 1.2.23 +### MimeKit 1.2.23 (2016-05-07) * Modified ParamaterList.TryParse() to handle quoted rfc2231-encoded param values. (issue [#239](https://github.com/jstedfast/MimeKit/issues/239)) * Updated to reference BouncyCastle via NuGet packages rather than bundling the assemblies. @@ -298,7 +298,7 @@ * Added convenience MimeMessage property for the X-Priority header. * Fixed MimeMessage.ConvertFromMailMessage() to use appropriate MimeEntity subclasses. (issue [#232](https://github.com/jstedfast/MimeKit/issues/232)) -### MimeKit 1.2.22 +### MimeKit 1.2.22 (2016-02-28) * Added a new SecureMimeContext.Verify() overload that returns the extracted content stream. * Exposed the SecureMimeContext.GetDigitalSignatures() method as protected, allowing custom @@ -312,7 +312,7 @@ file or stream. * Fixed UrlScanner to properly deal with IPv6 literals in email addresses. -### MimeKit 1.2.21 +### MimeKit 1.2.21 (2016-02-13) * Added a MultipartReport class for multipart/report. * Fixed serialization for embedded message/* parts. (issue [#228](https://github.com/jstedfast/MimeKit/issues/228)) @@ -325,7 +325,7 @@ * Fixed MimeMessage.DkimSign() to not enforce 7bit encoding of the body. (issue [#224](https://github.com/jstedfast/MimeKit/issues/224)) * Fixed ParameterList.IndexOf(string) to be case insensitive. -### MimeKit 1.2.20 +### MimeKit 1.2.20 (2016-01-24) * Fixed serialization of mime parts with empty content. (issue [#221](https://github.com/jstedfast/MimeKit/issues/221)) * Fixed a bug in the TnefPropertyReader that would break when not all properties were read @@ -347,7 +347,7 @@ * Fixed MimeParser to trim the CR from the mbox From marker. * Fixed SqlCertificateDatabase to properly chain Dispose. -### MimeKit 1.2.19 +### MimeKit 1.2.19 (2016-01-01) * Handle illegal Content-Id headers that do not enclose their values in <>'s. (issue [#215](https://github.com/jstedfast/MimeKit/issues/215)) * Fixed reserialization of MimeParts with empty content. (issue [#213](https://github.com/jstedfast/MimeKit/issues/213)) @@ -355,7 +355,7 @@ * Fixed HtmlTokenizer to work properly when some closing tags were not lowercase. * Bumped Bouncy Castle to v1.8.1. -### MimeKit 1.2.18 +### MimeKit 1.2.18 (2015-12-16) * Removed unimplemented TNEF APIs. * Use DateTime.UtcNow for S/MIME certificate validity checks. @@ -369,18 +369,18 @@ * Added GroupAddress.Parse() and MailboxAddress.Parse() methods. (issue [#197](https://github.com/jstedfast/MimeKit/issues/197)) * Set a default filename when generating application/pgp-signature parts. (issue [#195](https://github.com/jstedfast/MimeKit/issues/195)) -### MimeKit 1.2.17 +### MimeKit 1.2.17 (2015-12-05) * Fixed DkimRelaxedBodyFilter to properly handle CRLF split across buffers. * Added ContentType.IsMimeType method to replace CongtentType.Matches. * Added S/MIME, PGP and DKIM support to the PCL and WindowsUniversal versions of MimeKit. * Fixed PGP key expiration calculation when encrypting. (issue [#194](https://github.com/jstedfast/MimeKit/issues/194)) -### MimeKit 1.2.16 +### MimeKit 1.2.16 (2015-11-29) * Fixed relaxed body canonicalization logic for DKIM signatures. (issue [#190](https://github.com/jstedfast/MimeKit/issues/190)) -### MimeKit 1.2.15 +### MimeKit 1.2.15 (2015-11-22) * Fixed the Date parser to catch exceptions thrown by the DateTimeOffset .ctor if any of the fields are out of range. @@ -388,7 +388,7 @@ * Fixed DKIM body filters to reserve extra space in the output buffer. (issue [#188](https://github.com/jstedfast/MimeKit/issues/188)) * Allow specifying a charset encoding for each Content-Type/Disposition parameter. -### MimeKit 1.2.14 +### MimeKit 1.2.14 (2015-10-18) * Fixed DKIM-Signature signing logic to use a UTC-based timestamp value rather than a timestamp based on the local-time. (issue [#180](https://github.com/jstedfast/MimeKit/issues/180)) @@ -398,16 +398,16 @@ spanning across nested multiparts. (issue [#181](https://github.com/jstedfast/MimeKit/issues/181)) * Fixed MimeMessage.WriteTo() to ensure that the output stream always ends with a new-line. -### MimeKit 1.2.13 +### MimeKit 1.2.13 (2015-10-11) * Modified Base64Encoder's .ctor to allow specifying a maxLineLength. * Fixed DKIM signing logic for multipart/alternative messages. (issue [#178](https://github.com/jstedfast/MimeKit/issues/178)) -### MimeKit 1.2.12 +### MimeKit 1.2.12 (2015-09-20) * Prevent infinite loop when flushing CharsetFilter when there is no input data left. -### MimeKit 1.2.11 +### MimeKit 1.2.11 (2015-09-06) * Fixed an IndexOutOfRangeException bug in the TextToHTML converter logic. (issue [#165](https://github.com/jstedfast/MimeKit/issues/165)) * Fixed the DKIM-Signature verification logic to be more lenient in parsing DKIM-Signature @@ -423,7 +423,7 @@ * Fixed the DKIM-Signature logic (both signing and verifying) to properly canonicalize the body content. (issue [#172](https://github.com/jstedfast/MimeKit/issues/172)) -### MimeKit 1.2.10 +### MimeKit 1.2.10 (2015-08-16) * Added public Stream property to IContentObject. * Implemented a better fix for illegal unquoted multi-line Content-Type and @@ -432,7 +432,7 @@ (issue [#161](https://github.com/jstedfast/MimeKit/issues/161)) * Fixed charset handling logic to not override charset aliases already in the cache. -### MimeKit 1.2.9 +### MimeKit 1.2.9 (2015-08-08) * Fixed WriteTo(string fileName) methods to overwrite the existing file. (issue [#154](https://github.com/jstedfast/MimeKit/issues/154)) * Updated InternetAddressList to implement IComparable. @@ -440,7 +440,7 @@ * Added support for Message-Id headers that do not properly use encapsulate the value with angle brackets. -### MimeKit 1.2.8 +### MimeKit 1.2.8 (2015-07-19) * Added a new MessageDeliveryStatus MimePart subclass to make message/delivery-status MIME parts easier to deal with. @@ -450,18 +450,18 @@ * Fixed MimeParser to handle a message stream of just "\r\n". * Add a leading space in the Sender and Resent-Sender header values. -### MimeKit 1.2.7 +### MimeKit 1.2.7 (2015-07-05) * Fixed encoding GroupAddress with multiple mailbox addresses. * Fixed MessageIdList to be less strict in what it will accept. * Fixed logic for DKIM-Signature header folding. -### MimeKit 1.2.6 +### MimeKit 1.2.6 (2015-06-25) * Fixed a bug in the HTML tokenizer to handle some weird HTML created by Outlook 15.0. * Added CmsRecipient .ctor overloads that accept X509Certificate2. (issue [#149](https://github.com/jstedfast/MimeKit/issues/149)) -### MimeKit 1.2.5 +### MimeKit 1.2.5 (2015-06-22) * Changed BodyParts and Attachments to be IEnumerable - WARNING! This is an API change! (issue [#148](https://github.com/jstedfast/MimeKit/issues/148)) @@ -470,7 +470,7 @@ * Vastly improved the HtmlToHtml text converter with a w3 compliant HTML tokenizer. -### MimeKit 1.2.4 +### MimeKit 1.2.4 (2015-06-14) * Added support for generating and verifying DKIM-Signature headers. * Improved error handling for Encoding.GetEncoding() in CharsetFilter constructors. @@ -490,12 +490,12 @@ of leaving this up to the MimeEntity.WriteTo() method. This was needed for the DKIM-Signatures feature. -### MimeKit 1.2.3 +### MimeKit 1.2.3 (2015-06-01) * Fixed TextToFlowed logic that stripped trailing spaces. * Switched to PCL Profile78 to support Xamarin.Forms. -### MimeKit 1.2.2 +### MimeKit 1.2.2 (2015-05-31) * Added a MultipartAlternative class which adds some useful convenience methods and properties for use with the multipart/alternative mime-type. @@ -508,7 +508,7 @@ * Added a MimeVisitor class that implements the visitor pattern for visiting MIME nodes. -### MimeKit 1.2.1 +### MimeKit 1.2.1 (2015-05-25) * Added a Format property to ContentType. * Added a TryGetValue() method to ParameterList. @@ -520,17 +520,17 @@ * Renamed MimeEntityConstructorInfo to MimeEntityConstructorArgs. * Modified the MimeParser to use TextPart to represent application/rtf. -### MimeKit 1.2.0 +### MimeKit 1.2.0 (2015-05-24) * Force the use of the rfc2047 "B" encoding for ISO-2022-JP. (issue [#139](https://github.com/jstedfast/MimeKit/issues/139)) * Added some text converters to convert between various text formats including format=flowed and HTML. -### MimeKit 1.0.15 +### MimeKit 1.0.15 (2015-05-12) * Fixed MimeMessage.WriteTo() to be thread-safe. (issue [#138](https://github.com/jstedfast/MimeKit/issues/138)) -### MimeKit 1.0.14 +### MimeKit 1.0.14 (2015-05-09) * Added support for .NET 3.5. * Added a convenience CmsSigner .ctor that takes an X509Certificate2 argument. @@ -548,7 +548,7 @@ * Catch DecoderFallbackExceptions in MimeMessage.ToString() and fall back to Latin1. (issue [#137](https://github.com/jstedfast/MimeKit/issues/137)) -### MimeKit 1.0.13 +### MimeKit 1.0.13 (2015-04-11) * Added a work-around for a bug in Thunderbird's multipart/related implementation. (issue [#124](https://github.com/jstedfast/MimeKit/issues/124)) @@ -556,7 +556,7 @@ From, Reply-To, To, Cc and/or Bcc headers. * Modified the HeaderIdExtensions to only be available for the HeaderId enum values. -### MimeKit 1.0.12 +### MimeKit 1.0.12 (2015-03-29) * Modified InternetAddressList.Equals() to return true if the lists contain the same addresses even if they are in different orders. (issue [#118](https://github.com/jstedfast/MimeKit/issues/118)) @@ -568,7 +568,7 @@ * Added support for SecureMailboxAddresses to OpenPgpContext to allow key lookups by fingerprints instead of email addresses. -### MimeKit 1.0.11 +### MimeKit 1.0.11 (2015-03-21) * Added the ContentDisposition.FormData string constant. * Allow the ContentDisposition.Disposition property to be set to values other than @@ -582,7 +582,7 @@ * Added immutability-friendly .ctor to MimeMessage for use with languages such as F#. (issue [#116](https://github.com/jstedfast/MimeKit/issues/116)) -### MimeKit 1.0.10 +### MimeKit 1.0.10 (2015-03-14) * Ignore semi-colons in Content-Transfer-Encoding headers to work around broken mailers. * Added ParserOptions.ParameterComplianceMode (defaults to RfcComoplianceMode.Loose) @@ -595,13 +595,13 @@ * Modified MultipartSigned to use 78 characters as the max line length rather than 998 characters. (issue [#107](https://github.com/jstedfast/MimeKit/issues/107)) -### MimeKit 1.0.9 +### MimeKit 1.0.9 (2015-03-08) * Added a new MessageDispositionNotification MimePart subclass to represent message/disposition-notification parts. * Fixed the TNEF parser to gracefully deal with duplicate attachment properties. -### MimeKit 1.0.8 +### MimeKit 1.0.8 (2015-03-02) * Modified the parser to accept Message-Id values without a domain (i.e. ""). * Fixed a NullReferenceException in MimeMessage.BodyParts in cases where a MessagePart @@ -613,7 +613,7 @@ * Fixed S/MIME support to gracefully deal with badly formatted signature timestamps which incrorectly use leap seconds. (issue [#103](https://github.com/jstedfast/MimeKit/issues/103)) -### MimeKit 1.0.7 +### MimeKit 1.0.7 (2015-02-17) * Fixed TnefPropertyReader.GetEmbeddedMessageReader() to skip the Guid. * When decrypting PGP data, iterate over all encrypted packets to find one that @@ -623,7 +623,7 @@ * Added a Pkcs9SigningTime attribute to the CmsSigner for WindowsSecureMimeContext. (issue [#101](https://github.com/jstedfast/MimeKit/issues/101)) -### MimeKit 1.0.6 +### MimeKit 1.0.6 (2015-01-18) * Vastly improved MS-TNEF support. In addition to being fixed to properly extract the AttachData property of an Attachment attribute, more metadata is captured @@ -635,12 +635,12 @@ Note: If you are not yet ready to port your iOS application to the Unified API, you will need to stick with the 1.0.5 release. The Classic MonoTouch API is no longer supported. -### MimeKit 1.0.5 +### MimeKit 1.0.5 (2015-01-10) * Fixed out-of-memory error when encoding some long non-ASCII parameter values in Content-Type and Content-Disposition headers. -### MimeKit 1.0.4 +### MimeKit 1.0.4 (2015-01-08) * Added workaround for msg-id tokens with multiple domains (e.g. id@domain1@domain2). @@ -649,7 +649,7 @@ Note: If you are not yet ready to port your iOS application to the Unified API, * Added a FormatOptions property to disallow the use of mixed charsets when encoding headers (issue [#139](https://github.com/jstedfast/MimeKit/issues/139)). -### MimeKit 1.0.3 +### MimeKit 1.0.3 (2014-12-13) * Improved MimeMessage.TextBody and MimeMessage.HtmlBody logic. (issue [#87](https://github.com/jstedfast/MimeKit/issues/87)) * Added new overrides of TextPart.GetText() and SetText() methods that take a @@ -660,13 +660,13 @@ Note: If you are not yet ready to port your iOS application to the Unified API, * Fixed S/MIME logic for finding X.509 certificates to use for encipherment. (issue [#89](https://github.com/jstedfast/MimeKit/issues/89)) -### MimeKit 1.0.2 +### MimeKit 1.0.2 (2014-12-05) * Fixed MimeMessage.HtmlBody and MimeMessage.TextBody to properly handle nested multipart/alternatives (only generated by automated mailers). -### MimeKit 1.0.1 +### MimeKit 1.0.1 (2014-11-23) * Added MimeMessage.HtmlBody and MimeMessage.TextBody convenience properties. * Added TextPart.IsPlain and TextPart.IsHtml convenience properties. From 9e7177d40715475efca48b81238765262b017cec Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 14:42:29 -0500 Subject: [PATCH 203/741] Fixed Tnef unit tests to pass on the build bots --- UnitTests/Tnef/TnefTests.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 46d0b8d04d..615754ad08 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -949,7 +949,7 @@ public void TestRichTextEml () { var message = MimeMessage.Load ("../../TestData/tnef/rich-text.eml"); var tnef = message.BodyParts.OfType ().FirstOrDefault (); - var timezone = new TimeSpan (-5, 0, 0); + var mtime = new DateTimeOffset (2018, 12, 15, 10, 17, 38, DateTimeOffset.Now.Offset); message = tnef.ConvertToMessage (); @@ -983,7 +983,7 @@ public void TestRichTextEml () Assert.AreEqual ("Build a train table", task1.ContentType.Name, "Name"); Assert.AreEqual ("attachment", task1.ContentDisposition.Disposition, "Disposition"); Assert.AreEqual ("Untitled Attachment", task1.ContentDisposition.FileName, "FileName"); - Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), task1.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (mtime, task1.ContentDisposition.ModificationDate, "ModificationDate"); Assert.AreEqual (9217, task1.ContentDisposition.Size, "Size"); var task2 = (MimePart) multipart[3]; @@ -991,7 +991,7 @@ public void TestRichTextEml () Assert.AreEqual ("Build a train table", task2.ContentType.Name, "Name"); Assert.AreEqual ("attachment", task2.ContentDisposition.Disposition, "Disposition"); Assert.AreEqual ("Untitled Attachment", task2.ContentDisposition.FileName, "FileName"); - Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), task2.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (mtime, task2.ContentDisposition.ModificationDate, "ModificationDate"); Assert.AreEqual (9217, task2.ContentDisposition.Size, "Size"); var appointment1 = (MimePart) multipart[4]; @@ -999,7 +999,7 @@ public void TestRichTextEml () Assert.AreEqual ("Christmas Celebration!", appointment1.ContentType.Name, "Name"); Assert.AreEqual ("attachment", appointment1.ContentDisposition.Disposition, "Disposition"); Assert.AreEqual ("Untitled Attachment", appointment1.ContentDisposition.FileName, "FileName"); - Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), appointment1.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (mtime, appointment1.ContentDisposition.ModificationDate, "ModificationDate"); Assert.AreEqual (387453, appointment1.ContentDisposition.Size, "Size"); var appointment2 = (MimePart) multipart[5]; @@ -1007,7 +1007,7 @@ public void TestRichTextEml () Assert.AreEqual ("Christmas Celebration!", appointment2.ContentType.Name, "Name"); Assert.AreEqual ("attachment", appointment2.ContentDisposition.Disposition, "Disposition"); Assert.AreEqual ("Untitled Attachment", appointment2.ContentDisposition.FileName, "FileName"); - Assert.AreEqual (new DateTimeOffset (2018, 12, 15, 10, 17, 38, timezone), appointment2.ContentDisposition.ModificationDate, "ModificationDate"); + Assert.AreEqual (mtime, appointment2.ContentDisposition.ModificationDate, "ModificationDate"); Assert.AreEqual (387453, appointment2.ContentDisposition.Size, "Size"); } From e8b93261bff77dfad9044dff2d20153784e96501 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 15:03:59 -0500 Subject: [PATCH 204/741] Added more X509CertificateStore unit tests --- .../Cryptography/X509CertificateStoreTests.cs | 84 +++++++++++++++++++ UnitTests/ExceptionTests.cs | 3 + 2 files changed, 87 insertions(+) diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index 02f7bedcc7..8f5ca25fbd 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -27,6 +27,9 @@ using System; using System.IO; using System.Linq; +using System.Collections.Generic; + +using Org.BouncyCastle.X509; using NUnit.Framework; @@ -72,6 +75,87 @@ public void TestArgumentExceptions () Assert.Throws (() => store.RemoveRange (null)); } + [Test] + public void TestAddRemove () + { + var certificates = new List (); + var parser = new X509CertificateParser (); + var store = new X509CertificateStore (); + + foreach (var authority in CertificateAuthorities) { + var path = GetTestDataPath (authority); + + using (var stream = File.OpenRead (path)) { + foreach (X509Certificate certificate in parser.ReadCertificates (stream)) + certificates.Add (certificate); + } + } + + foreach (var certificate in certificates) + store.Add (certificate); + + var count = store.Certificates.Count (); + + Assert.AreEqual (CertificateAuthorities.Length, count, "Unexpected number of certificates after Add."); + + foreach (var certificate in certificates) { + var key = store.GetPrivateKey (certificate); + Assert.IsNull (key, "GetPrivateKey"); + store.Remove (certificate); + } + + count = store.Certificates.Count (); + + Assert.AreEqual (0, count, "Unexpected number of certificates after Remove."); + } + + [Test] + public void TestAddRemoveRange () + { + var certificates = new List (); + var parser = new X509CertificateParser (); + var store = new X509CertificateStore (); + + foreach (var authority in CertificateAuthorities) { + var path = GetTestDataPath (authority); + + using (var stream = File.OpenRead (path)) { + foreach (X509Certificate certificate in parser.ReadCertificates (stream)) + certificates.Add (certificate); + } + } + + store.AddRange (certificates); + + var count = store.Certificates.Count (); + + Assert.AreEqual (CertificateAuthorities.Length, count, "Unexpected number of certificates after AddRange."); + + foreach (var certificate in certificates) { + var key = store.GetPrivateKey (certificate); + Assert.IsNull (key, "GetPrivateKey"); + } + + store.RemoveRange (certificates); + + count = store.Certificates.Count (); + + Assert.AreEqual (0, count, "Unexpected number of certificates after RemoveRange."); + } + + [Test] + public void TestImportData () + { + var store = new X509CertificateStore (); + + store.Import (File.ReadAllBytes (GetTestDataPath (CertificateAuthorities[0]))); + var certificate = store.Certificates.FirstOrDefault (); + var count = store.Certificates.Count (); + + Assert.AreEqual (1, count, "Unexpected number of certificates imported."); + Assert.AreEqual ("root@example.com", certificate.GetSubjectEmailAddress (), "Unexpected email address for certificate."); + } + [Test] public void TestImportSingleCertificate () { diff --git a/UnitTests/ExceptionTests.cs b/UnitTests/ExceptionTests.cs index a3f0dc1615..7ae040e7fa 100644 --- a/UnitTests/ExceptionTests.cs +++ b/UnitTests/ExceptionTests.cs @@ -136,6 +136,9 @@ public void TestPrivateKeyNotFoundException () TestPrivateKeyNotFoundException (new PrivateKeyNotFoundException (new MailboxAddress ("Unit Tests", "example@mimekit.net"), "Message")); TestPrivateKeyNotFoundException (new PrivateKeyNotFoundException ("DEADBEEF", "Message")); TestPrivateKeyNotFoundException (new PrivateKeyNotFoundException (0xdeadbeef, "Message")); + + Assert.Throws (() => new PrivateKeyNotFoundException ((string) null, "Message")); + Assert.Throws (() => new PrivateKeyNotFoundException ((MailboxAddress) null, "Message")); } [Test] From 937b597f3e9ef6f2b16aa30837e9f6c76868bcbe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 15:33:31 -0500 Subject: [PATCH 205/741] simplified code --- .../Cryptography/DefaultSecureMimeContext.cs | 8 ++--- .../Cryptography/SqliteCertificateDatabase.cs | 33 ++++++++----------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index bdec9eaf6f..eced687d8c 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -118,16 +118,16 @@ public DefaultSecureMimeContext (string fileName, string password) if (password == null) throw new ArgumentNullException (nameof (password)); + if (!SqliteCertificateDatabase.IsAvailable) + throw new NotSupportedException ("Mono.Data.Sqlite is not available."); + var dir = Path.GetDirectoryName (fileName); var exists = File.Exists (fileName); if (!string.IsNullOrEmpty (dir) && !Directory.Exists (dir)) Directory.CreateDirectory (dir); - if (SqliteCertificateDatabase.IsAvailable) - dbase = new SqliteCertificateDatabase (fileName, password); - else - throw new NotSupportedException ("Mono.Data.Sqlite is not available."); + dbase = new SqliteCertificateDatabase (fileName, password); if (!exists) { // TODO: initialize our dbase with some root CA certificates. diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 678509d51d..803fdd5865 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -127,24 +127,28 @@ static DbConnection CreateConnection (string fileName) if (fileName.Length == 0) throw new ArgumentException ("The file name cannot be empty.", nameof (fileName)); -#if !__MOBILE__ - var dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); - - sqliteConnectionStringBuilderClass.GetProperty ("DataSource").SetValue (builder, fileName, null); - - if (dateTimeFormat != null) - dateTimeFormat.SetValue (builder, 0, null); - if (!File.Exists (fileName)) { var dir = Path.GetDirectoryName (fileName); if (!string.IsNullOrEmpty (dir) && !Directory.Exists (dir)) Directory.CreateDirectory (dir); +#if __MOBILE__ + SqliteConnection.CreateFile (fileName); +#else File.Create (fileName).Dispose (); +#endif } +#if !__MOBILE__ + var dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); + var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); + + sqliteConnectionStringBuilderClass.GetProperty ("DataSource").SetValue (builder, fileName, null); + + if (dateTimeFormat != null) + dateTimeFormat.SetValue (builder, 0, null); + var connectionString = (string) sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString").GetValue (builder, null); return (DbConnection) Activator.CreateInstance (sqliteConnectionClass, new [] { connectionString }); @@ -153,15 +157,6 @@ static DbConnection CreateConnection (string fileName) builder.DateTimeFormat = SQLiteDateFormats.Ticks; builder.DataSource = fileName; - if (!File.Exists (fileName)) { - var dir = Path.GetDirectoryName (fileName); - - if (!string.IsNullOrEmpty (dir) && !Directory.Exists (dir)) - Directory.CreateDirectory (dir); - - SqliteConnection.CreateFile (fileName); - } - return new SqliteConnection (builder.ConnectionString); #endif } @@ -193,7 +188,7 @@ static DbConnection CreateConnection (string fileName) /// /// An error occurred reading the file. /// - public SqliteCertificateDatabase (string fileName, string password) : base (CreateConnection (fileName), password) + public SqliteCertificateDatabase (string fileName, string password) : this (CreateConnection (fileName), password) { } From 76dd1a695062539dcce713d85f94c4dbe2a66657 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 16:31:16 -0500 Subject: [PATCH 206/741] Added more unit tests for X509CertificateChain --- .../Cryptography/X509CertificateChainTests.cs | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index 9262cb3c55..47631a95a5 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -26,17 +26,29 @@ using System; using System.IO; - -using NUnit.Framework; +using System.Linq; +using System.Collections; +using System.Collections.Generic; using Org.BouncyCastle.X509; +using NUnit.Framework; + using MimeKit.Cryptography; namespace UnitTests.Cryptography { [TestFixture] public class X509CertificateChainTests { + static readonly string[] CertificateAuthorities = new string[] { + "certificate-authority.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + }; + + static string GetTestDataPath (string relative) + { + return Path.Combine ("..", "..", "TestData", "smime", relative); + } + static X509Certificate LoadCertificate (string path) { using (var stream = File.OpenRead (path)) { @@ -49,7 +61,7 @@ static X509Certificate LoadCertificate (string path) [Test] public void TestArgumentExceptions () { - var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var path = GetTestDataPath ("smime.p12"); var chain = new X509CertificateChain (); CmsSigner signer; @@ -70,16 +82,48 @@ public void TestArgumentExceptions () Assert.Throws (() => chain.RemoveAt (-1)); } + [Test] + public void TestAddRemoveRange () + { + var certificates = new List (); + var chain = new X509CertificateChain (); + + foreach (var authority in CertificateAuthorities) { + var certificate = LoadCertificate (GetTestDataPath (authority)); + + certificates.Add (certificate); + } + + Assert.Throws (() => chain.AddRange (null)); + + chain.AddRange (certificates); + + Assert.AreEqual (CertificateAuthorities.Length, chain.Count, "Unexpected number of certificates after AddRange."); + + int index = 0; + foreach (var certificate in chain) + Assert.AreEqual (certificates[index++], certificate, "GetEnumerator"); + + index = 0; + foreach (X509Certificate certificate in ((IEnumerable) chain)) + Assert.AreEqual (certificates[index++], certificate, "GetEnumerator"); + + Assert.Throws (() => chain.RemoveRange (null)); + + chain.RemoveRange (certificates); + + Assert.AreEqual (0, chain.Count, "Unexpected number of certificates after RemoveRange."); + } + [Test] public void TestBasicFunctionality () { - var dataDir = Path.Combine ("..", "..", "TestData", "smime"); var chain = new X509CertificateChain (); X509Certificate cert1, cert2, cert3; - cert1 = LoadCertificate (Path.Combine (dataDir, "StartComClass1PrimaryIntermediateClientCA.crt")); - cert2 = LoadCertificate (Path.Combine (dataDir, "StartComCertificationAuthority.crt")); - cert3 = LoadCertificate (Path.Combine (dataDir, "certificate-authority.crt")); + cert1 = LoadCertificate (GetTestDataPath ("StartComClass1PrimaryIntermediateClientCA.crt")); + cert2 = LoadCertificate (GetTestDataPath ("StartComCertificationAuthority.crt")); + cert3 = LoadCertificate (GetTestDataPath ("certificate-authority.crt")); Assert.IsFalse (chain.IsReadOnly); Assert.AreEqual (0, chain.Count, "Initial count"); From e5d966ac9ead325d84b73288f87934e2596c9469 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 16:41:43 -0500 Subject: [PATCH 207/741] Added some unit tests for X509CertificateRecord --- .../X509CertificateRecordTests.cs | 59 +++++++++++++++++++ UnitTests/UnitTests.csproj | 1 + 2 files changed, 60 insertions(+) create mode 100644 UnitTests/Cryptography/X509CertificateRecordTests.cs diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs new file mode 100644 index 0000000000..446302b9ba --- /dev/null +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -0,0 +1,59 @@ +// +// X509CertificateRecordTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; + +using NUnit.Framework; + +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography { + [TestFixture] + public class X509CertificateRecordTests + { + [Test] + public void TestArgumentExceptions () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + AsymmetricCipherKeyPair keyPair; + + using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + var reader = new PemReader (stream); + + keyPair = reader.ReadObject () as AsymmetricCipherKeyPair; + } + + Assert.Throws (() => new X509CertificateRecord (null)); + Assert.Throws (() => new X509CertificateRecord (null, keyPair.Private)); + Assert.Throws (() => new X509CertificateRecord (signer.Certificate, null)); + Assert.Throws (() => new X509CertificateRecord (signer.Certificate, keyPair.Public)); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 52e6617f5f..bd054ce268 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -84,6 +84,7 @@ + From 2a461e63ee9ab7c5ddb2c85c69a21efb8491df18 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 18:50:56 -0500 Subject: [PATCH 208/741] Added some openssl config files - WIP --- UnitTests/TestData/smime/ca.cnf | 71 +++++++++++++++++++++++++++--- UnitTests/TestData/smime/smime.cnf | 31 +++++++++++++ 2 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 UnitTests/TestData/smime/smime.cnf diff --git a/UnitTests/TestData/smime/ca.cnf b/UnitTests/TestData/smime/ca.cnf index a3d92c38e7..2409df1898 100644 --- a/UnitTests/TestData/smime/ca.cnf +++ b/UnitTests/TestData/smime/ca.cnf @@ -1,14 +1,40 @@ +# +# OpenSSL example configuration file for automated certificate creation. +# + +# This definition stops the following lines choking if HOME or CN +# is undefined. +HOME = . +RANDFILE = $ENV::HOME/.rnd +CN = "Bruce Wayne" +EMAIL = "bruce.wayne@example.com" +ON = "Example Authority Inc." +default_ca = ca + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +# Don't prompt for fields: use those in section directly +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = v3_ca # The extensions to add to the self signed cert +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + [ req_distinguished_name ] +# Take CN, ON, and EMAIL from the environment so they can come from a script. countryName = US countryName_min = 2 countryName_max = 2 stateOrProvinceName = Massachusetts localityName = Boston -0.organizationName = Example Authority Inc. +organizationName = $ENV::ON organizationalUnitName = IT -commonName = Bruce Wayne +commonName = $ENV::CN commonName_max = 64 -emailAddress = bruce.wayne@example.com +emailAddress = $ENV::EMAIL emailAddress_max = 64 [ req_attributes ] @@ -16,7 +42,40 @@ challengePassword = no.secret challengePassword_min = 4 challengePassword_max = 20 -[x509v3_CA] -req_extensions = v3_req # The extensions to add to a certificate request -keyUsage = keyCertSign, nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment +[ usr_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyEncipherment + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ dh_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# DH certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, keyAgreement + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ v3_ca ] + + +# Extensions for a typical CA + +# PKIX recommendation. + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = critical,CA:true +keyUsage = critical, cRLSign, keyCertSign +#keyUsage = critical, keyCertSign, nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment diff --git a/UnitTests/TestData/smime/smime.cnf b/UnitTests/TestData/smime/smime.cnf new file mode 100644 index 0000000000..e2a198b248 --- /dev/null +++ b/UnitTests/TestData/smime/smime.cnf @@ -0,0 +1,31 @@ +# https://serverfault.com/questions/581023/openssl-custom-extension + +[my_cert_extensions] +basicConstraints = CA:FALSE +keyUsage = critical, keyEncipherment, dataEncipherment +SMIME-CAPS = ASN1:SEQUENCE:smime_seq +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer + +[ smime_seq ] +SMIMECapability.0 = SEQWRAP,OID:sha1 +SMIMECapability.1 = SEQWRAP,OID:sha256 +SMIMECapability.2 = SEQWRAP,OID:sha1WithRSA +SMIMECapability.3 = SEQWRAP,OID:aes-256-ecb +SMIMECapability.4 = SEQWRAP,OID:aes-256-cbc +SMIMECapability.5 = SEQWRAP,OID:aes-256-ofb +SMIMECapability.6 = SEQWRAP,OID:aes-192-ecb +SMIMECapability.7 = SEQWRAP,OID:aes-192-cbc +SMIMECapability.8 = SEQWRAP,OID:aes-192-ofb +SMIMECapability.9 = SEQWRAP,OID:aes-128-ecb +SMIMECapability.10 = SEQWRAP,OID:aes-128-cbc +SMIMECapability.11 = SEQWRAP,OID:aes-128-ofb +SMIMECapability.12 = SEQWRAP,OID:camellia-256-cbc +SMIMECapability.13 = SEQWRAP,OID:camellia-192-cbc +SMIMECapability.14 = SEQWRAP,OID:camellia-128-cbc +SMIMECapability.15 = SEQWRAP,OID:des-ede3-cbc +SMIMECapability.16 = SEQUENCE:rsa_enc + +[ rsa_enc ] +capabilityID = OID:rsaEncryption +parameter = NULL From 0fbf32bcd1c7952a17b9f835e928f4ce735fef3d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 19:15:32 -0500 Subject: [PATCH 209/741] Fixed WindowsSecureMimeDigitalCertificate logic for ECDsa --- MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs index 218b0713c3..5f9ac85429 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs @@ -63,7 +63,7 @@ public WindowsSecureMimeDigitalCertificate (X509Certificate2 certificate) else if (algorithm is ECDiffieHellman) PublicKeyAlgorithm = PublicKeyAlgorithm.DiffieHellman; else if (algorithm is ECDsa) - PublicKeyAlgorithm = PublicKeyAlgorithm.EdwardsCurveDsa; + PublicKeyAlgorithm = PublicKeyAlgorithm.EllipticCurveDsa; } /// From fc95f69965ffae86187607518072f903fc899461 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 19 Dec 2018 21:55:19 -0500 Subject: [PATCH 210/741] Moved some logic into SecureMimeDigitalSignature The .ctor now matches the same functionality implemented in the WindowsSecureMimeDigitalSignature .ctor This will make it easier for developers to re-use this class. --- .../BouncyCastleSecureMimeContext.cs | 58 ++------------ .../SecureMimeDigitalCertificate.cs | 3 + .../SecureMimeDigitalSignature.cs | 75 +++++++++++++++++-- .../WindowsSecureMimeDigitalSignature.cs | 2 +- UnitTests/Cryptography/SecureMimeTests.cs | 9 ++- 5 files changed, 89 insertions(+), 58 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index db9df9c9c9..2c1ec4bcc6 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -52,7 +52,6 @@ using AttributeTable = Org.BouncyCastle.Asn1.Cms.AttributeTable; using MimeKit.IO; -using MimeKit.Utils; namespace MimeKit.Cryptography { @@ -418,7 +417,7 @@ X509Certificate GetCertificate (IX509Store store, SignerID signer) return GetCertificate (signer); } - PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store crls, X509Certificate certificate, DateTime? signingTime) + PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store crls, X509Certificate certificate, DateTime signingTime) { var intermediate = new X509CertificateStore (); foreach (X509Certificate cert in certificates.GetMatches (null)) @@ -438,8 +437,8 @@ PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store parameters.ValidityModel = PkixParameters.PkixValidityModel; parameters.IsRevocationEnabled = false; - if (signingTime.HasValue) - parameters.Date = new DateTimeObject (signingTime.Value); + if (signingTime != default (DateTime)) + parameters.Date = new DateTimeObject (signingTime); var result = new PkixCertPathBuilder ().Build (parameters); @@ -460,7 +459,7 @@ PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store /// /// is null. /// - protected static bool TryGetDigestAlgorithm (AlgorithmIdentifier identifier, out DigestAlgorithm algorithm) + internal protected static bool TryGetDigestAlgorithm (AlgorithmIdentifier identifier, out DigestAlgorithm algorithm) { if (identifier == null) throw new ArgumentNullException (nameof (identifier)); @@ -580,15 +579,6 @@ internal protected static bool TryGetEncryptionAlgorithm (AlgorithmIdentifier id return false; } - static DateTime ToAdjustedDateTime (DerUtcTime time) - { - //try { - // return time.ToAdjustedDateTime (); - //} catch { - return DateUtils.Parse (time.AdjustedTimeString, "yyyyMMddHHmmsszzz"); - //} - } - async Task DownloadCrlsOverHttpAsync (string location, Stream stream, bool doAsync, CancellationToken cancellationToken) { try { @@ -754,46 +744,14 @@ async Task GetDigitalSignaturesAsync (CmsSignedDataP foreach (SignerInformation signerInfo in store.GetSigners ()) { var certificate = GetCertificate (certificates, signerInfo.SignerID); - var signature = new SecureMimeDigitalSignature (signerInfo); - var algorithms = new List (); - DateTime? signedDate = null; - DigestAlgorithm digestAlgo; + var signature = new SecureMimeDigitalSignature (signerInfo, certificate); if (CheckCertificateRevocation && certificate != null) await DownloadCrlsAsync (certificate, doAsync, cancellationToken).ConfigureAwait (false); - if (signerInfo.SignedAttributes != null) { - Asn1EncodableVector vector = signerInfo.SignedAttributes.GetAll (CmsAttributes.SigningTime); - foreach (Org.BouncyCastle.Asn1.Cms.Attribute attr in vector) { - var signingTime = (DerUtcTime) ((DerSet) attr.AttrValues)[0]; - signature.CreationDate = ToAdjustedDateTime (signingTime); - signedDate = signature.CreationDate; - break; - } - - vector = signerInfo.SignedAttributes.GetAll (SmimeAttributes.SmimeCapabilities); - foreach (Org.BouncyCastle.Asn1.Cms.Attribute attr in vector) { - foreach (Asn1Sequence sequence in attr.AttrValues) { - for (int i = 0; i < sequence.Count; i++) { - var identifier = AlgorithmIdentifier.GetInstance (sequence[i]); - EncryptionAlgorithm algorithm; - - if (TryGetEncryptionAlgorithm (identifier, out algorithm)) - algorithms.Add (algorithm); - } - } - } - - signature.EncryptionAlgorithms = algorithms.ToArray (); - } - - if (TryGetDigestAlgorithm (signerInfo.DigestAlgorithmID, out digestAlgo)) - signature.DigestAlgorithm = digestAlgo; - if (certificate != null) { - signature.SignerCertificate = new SecureMimeDigitalCertificate (certificate); - if (algorithms.Count > 0 && signedDate != null) { - UpdateSecureMimeCapabilities (certificate, signature.EncryptionAlgorithms, signedDate.Value); + if (signature.EncryptionAlgorithms.Length > 0 && signature.CreationDate != default (DateTime)) { + UpdateSecureMimeCapabilities (certificate, signature.EncryptionAlgorithms, signature.CreationDate); } else { try { Import (certificate); @@ -805,7 +763,7 @@ async Task GetDigitalSignaturesAsync (CmsSignedDataP var anchors = GetTrustedAnchors (); try { - signature.Chain = BuildCertPath (anchors, certificates, crls, certificate, signedDate); + signature.Chain = BuildCertPath (anchors, certificates, crls, certificate, signature.CreationDate); } catch (Exception ex) { signature.ChainException = ex; } diff --git a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs index 928a258695..8eb4150e8f 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs @@ -50,6 +50,9 @@ public class SecureMimeDigitalCertificate : IDigitalCertificate /// public SecureMimeDigitalCertificate (X509Certificate certificate) { + if (certificate == null) + throw new ArgumentNullException (nameof (certificate)); + Certificate = certificate; var pubkey = certificate.GetPublicKey (); diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 667be711b5..763b21a540 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -25,10 +25,17 @@ // using System; +using System.Collections.Generic; using Org.BouncyCastle.Cms; using Org.BouncyCastle.X509; using Org.BouncyCastle.Pkix; +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Cms; +using Org.BouncyCastle.Asn1.Smime; +using Org.BouncyCastle.Asn1.X509; + +using MimeKit.Utils; namespace MimeKit.Cryptography { /// @@ -42,9 +49,65 @@ public class SecureMimeDigitalSignature : IDigitalSignature DigitalSignatureVerifyException vex; bool? valid; - internal SecureMimeDigitalSignature (SignerInformation signerInfo) + static DateTime ToAdjustedDateTime (DerUtcTime time) { + //try { + // return time.ToAdjustedDateTime (); + //} catch { + return DateUtils.Parse (time.AdjustedTimeString, "yyyyMMddHHmmsszzz"); + //} + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The information about the signer. + /// The signer's certificate. + /// + /// is null. + /// + public SecureMimeDigitalSignature (SignerInformation signerInfo, X509Certificate certificate) + { + if (signerInfo == null) + throw new ArgumentNullException (nameof (signerInfo)); + SignerInfo = signerInfo; + + var algorithms = new List (); + DigestAlgorithm digestAlgo; + + if (signerInfo.SignedAttributes != null) { + Asn1EncodableVector vector = signerInfo.SignedAttributes.GetAll (CmsAttributes.SigningTime); + foreach (Org.BouncyCastle.Asn1.Cms.Attribute attr in vector) { + var signingTime = (DerUtcTime) ((DerSet) attr.AttrValues)[0]; + CreationDate = ToAdjustedDateTime (signingTime); + break; + } + + vector = signerInfo.SignedAttributes.GetAll (SmimeAttributes.SmimeCapabilities); + foreach (Org.BouncyCastle.Asn1.Cms.Attribute attr in vector) { + foreach (Asn1Sequence sequence in attr.AttrValues) { + for (int i = 0; i < sequence.Count; i++) { + var identifier = AlgorithmIdentifier.GetInstance (sequence[i]); + EncryptionAlgorithm algorithm; + + if (BouncyCastleSecureMimeContext.TryGetEncryptionAlgorithm (identifier, out algorithm)) + algorithms.Add (algorithm); + } + } + } + + EncryptionAlgorithms = algorithms.ToArray (); + } + + if (BouncyCastleSecureMimeContext.TryGetDigestAlgorithm (signerInfo.DigestAlgorithmID, out digestAlgo)) + DigestAlgorithm = digestAlgo; + + if (certificate != null) + SignerCertificate = new SecureMimeDigitalCertificate (certificate); } /// @@ -68,7 +131,7 @@ public SignerInformation SignerInfo { /// /// The S/MIME encryption algorithms. public EncryptionAlgorithm[] EncryptionAlgorithms { - get; internal set; + get; private set; } /// @@ -104,7 +167,7 @@ public Exception ChainException { /// /// The signer's certificate. public IDigitalCertificate SignerCertificate { - get; internal set; + get; private set; } /// @@ -115,7 +178,7 @@ public IDigitalCertificate SignerCertificate { /// /// The public key algorithm. public PublicKeyAlgorithm PublicKeyAlgorithm { - get { return PublicKeyAlgorithm.None; } + get { return SignerCertificate != null ? SignerCertificate.PublicKeyAlgorithm : PublicKeyAlgorithm.None; } } /// @@ -126,7 +189,7 @@ public PublicKeyAlgorithm PublicKeyAlgorithm { /// /// The digest algorithm. public DigestAlgorithm DigestAlgorithm { - get; internal set; + get; private set; } /// @@ -137,7 +200,7 @@ public DigestAlgorithm DigestAlgorithm { /// /// The creation date in coordinated universal time (UTC). public DateTime CreationDate { - get; internal set; + get; private set; } /// diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs index 5bb7fdadcf..a2f685fe15 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs @@ -141,7 +141,7 @@ public IDigitalCertificate SignerCertificate { /// /// The public key algorithm. public PublicKeyAlgorithm PublicKeyAlgorithm { - get { return PublicKeyAlgorithm.None; } + get { return SignerCertificate != null ? SignerCertificate.PublicKeyAlgorithm : PublicKeyAlgorithm.None; } } /// diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index b57cdc695b..2693db2e19 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -120,8 +120,15 @@ protected SecureMimeTestsBase () [Test] public void TestArgumentExceptions () { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var stream = new MemoryStream (); + Assert.Throws (() => new SecureMimeDigitalCertificate (null)); + Assert.Throws (() => new SecureMimeDigitalSignature (null, signer.Certificate)); + + Assert.Throws (() => new WindowsSecureMimeDigitalCertificate (null)); + Assert.Throws (() => new WindowsSecureMimeDigitalSignature (null)); + Assert.Throws (() => new ApplicationPkcs7Signature ((MimeEntityConstructorArgs) null)); Assert.Throws (() => new ApplicationPkcs7Mime ((MimeEntityConstructorArgs) null)); Assert.Throws (() => new ApplicationPkcs7Signature ((Stream) null)); @@ -136,7 +143,6 @@ public void TestArgumentExceptions () Assert.Throws (() => SecureMimeContext.GetDigestOid (DigestAlgorithm.Tiger192)); using (var ctx = CreateContext ()) { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var mailbox = new MailboxAddress ("Unit Tests", "example@mimekit.net"); var recipients = new CmsRecipientCollection (); DigitalSignatureCollection signatures; @@ -333,6 +339,7 @@ public virtual void TestSecureMimeEncapsulatedSigning () Assert.AreEqual (MimeKitCreationDate, signature.SignerCertificate.CreationDate, "CreationDate"); Assert.AreEqual (MimeKitExpirationDate, signature.SignerCertificate.ExpirationDate, "ExpirationDate"); Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, signature.SignerCertificate.PublicKeyAlgorithm); + Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, signature.PublicKeyAlgorithm); try { bool valid = signature.Verify (); From fbd4588293a07460c43dcf255645912c82693a2e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 09:41:45 -0500 Subject: [PATCH 211/741] Added X509Certificate.GetPublicKeyAlgorithm() extension method Also added more unit tests. --- .../BouncyCastleCertificateExtensions.cs | 33 +++++ .../SecureMimeDigitalCertificate.cs | 15 +- .../WindowsSecureMimeDigitalCertificate.cs | 23 +-- UnitTests/ArgumentExceptionTests.cs | 4 +- UnitTests/AssortedTests.cs | 4 +- UnitTests/AttachmentCollectionTests.cs | 2 +- UnitTests/ConstructorTests.cs | 4 +- UnitTests/ContentDispositionTests.cs | 4 +- UnitTests/ContentObjectTests.cs | 2 +- UnitTests/ContentTypeTests.cs | 4 +- .../Cryptography/ApplicationPkcs7MimeTests.cs | 2 +- .../AsymmetricAlgorithmExtensionTests.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 4 +- UnitTests/Cryptography/CmsSignerTests.cs | 4 +- .../DefaultSecureMimeContextTests.cs | 2 +- .../DkimRelaxedBodyFilterTests.cs | 4 +- UnitTests/Cryptography/DkimTests.cs | 4 +- UnitTests/Cryptography/DummyOpenPgpContext.cs | 4 +- UnitTests/Cryptography/PgpMimeTests.cs | 4 +- .../SecureMimeDigitalCertificateTests.cs | 139 ++++++++++++++++++ UnitTests/Cryptography/SecureMimeTests.cs | 12 +- .../Cryptography/X509CertificateChainTests.cs | 4 +- .../X509CertificateRecordTests.cs | 2 +- .../Cryptography/X509CertificateStoreTests.cs | 4 +- UnitTests/DomainListTests.cs | 4 +- UnitTests/Encodings/EncoderTests.cs | 4 +- UnitTests/Encodings/YEncodingTests.cs | 4 +- UnitTests/ExceptionTests.cs | 2 +- UnitTests/GroupAddressTests.cs | 4 +- UnitTests/HeaderListTests.cs | 4 +- UnitTests/HeaderTests.cs | 4 +- UnitTests/HtmlPreviewVisitor.cs | 4 +- UnitTests/IO/BoundStreamTests.cs | 2 +- UnitTests/IO/CanReadWriteSeekStream.cs | 2 +- UnitTests/IO/ChainedStreamTests.cs | 4 +- UnitTests/IO/FilteredStreamTests.cs | 2 +- UnitTests/IO/Filters/FilterTests.cs | 2 +- UnitTests/IO/MeasuringStreamTests.cs | 2 +- UnitTests/IO/MemoryBlockStreamTests.cs | 4 +- UnitTests/IO/ReadOneByteStream.cs | 2 +- UnitTests/IO/TimeoutStream.cs | 2 +- UnitTests/InternetAddressListTests.cs | 4 +- UnitTests/InternetAddressTests.cs | 4 +- UnitTests/MailboxAddressTests.cs | 4 +- UnitTests/MessageDeliveryStatusTests.cs | 4 +- .../MessageDispositionNotificiationTests.cs | 4 +- UnitTests/MessageIdListTests.cs | 4 +- UnitTests/MessagePartialTests.cs | 4 +- UnitTests/MimeMessageTests.cs | 4 +- UnitTests/MimeParserTests.cs | 4 +- UnitTests/MimePartTests.cs | 4 +- UnitTests/MimeTypeTests.cs | 4 +- UnitTests/MimeVisitorTests.cs | 4 +- UnitTests/MultipartRelatedTests.cs | 4 +- UnitTests/MultipartReportTests.cs | 4 +- UnitTests/MultipartTests.cs | 4 +- UnitTests/ParameterListTests.cs | 4 +- UnitTests/ParameterTests.cs | 4 +- UnitTests/ParserOptionsTests.cs | 2 +- UnitTests/TestData/smime/smdh.pem | 33 +++++ UnitTests/TestData/smime/smdsa1.pem | 47 ++++++ UnitTests/TestData/smime/smdsa2.pem | 47 ++++++ UnitTests/TestData/smime/smdsa3.pem | 47 ++++++ UnitTests/TestData/smime/smdsap.pem | 9 ++ UnitTests/TestData/smime/smec1.pem | 22 +++ UnitTests/TestData/smime/smec2.pem | 23 +++ UnitTests/TestData/smime/smec3.pem | 22 +++ UnitTests/TestData/smime/smroot.pem | 49 ++++++ UnitTests/TestData/smime/smrsa1.pem | 49 ++++++ UnitTests/TestData/smime/smrsa2.pem | 49 ++++++ UnitTests/TestData/smime/smrsa3.pem | 49 ++++++ UnitTests/Text/HtmlAttributeTests.cs | 4 +- UnitTests/Text/HtmlEntityDecoderTests.cs | 4 +- UnitTests/Text/HtmlToHtmlTests.cs | 2 +- UnitTests/Text/HtmlTokenTests.cs | 2 +- UnitTests/Text/HtmlTokenizerTests.cs | 4 +- UnitTests/Text/HtmlUtilsTests.cs | 4 +- UnitTests/Text/HtmlWriterTests.cs | 4 +- UnitTests/Text/RtfCompressedToRtfTests.cs | 4 +- UnitTests/Text/TextConverterTests.cs | 4 +- UnitTests/Text/TextToHtmlTests.cs | 2 +- UnitTests/Text/TrieTests.cs | 4 +- UnitTests/Text/UrlScannerTests.cs | 4 +- UnitTests/TextPartTests.cs | 4 +- UnitTests/Tnef/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Tnef/TnefReaderStreamTests.cs | 2 +- UnitTests/Tnef/TnefReaderTests.cs | 2 +- UnitTests/Tnef/TnefTests.cs | 4 +- UnitTests/UnitTests.csproj | 13 ++ UnitTests/Utils/CharsetUtilsTests.cs | 4 +- UnitTests/Utils/DateParserTests.cs | 4 +- UnitTests/Utils/MimeUtilsTests.cs | 4 +- UnitTests/Utils/ParseUtilsTests.cs | 4 +- UnitTests/Utils/Rfc2047Tests.cs | 2 +- 94 files changed, 779 insertions(+), 162 deletions(-) create mode 100644 UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs create mode 100644 UnitTests/TestData/smime/smdh.pem create mode 100644 UnitTests/TestData/smime/smdsa1.pem create mode 100644 UnitTests/TestData/smime/smdsa2.pem create mode 100644 UnitTests/TestData/smime/smdsa3.pem create mode 100644 UnitTests/TestData/smime/smdsap.pem create mode 100644 UnitTests/TestData/smime/smec1.pem create mode 100644 UnitTests/TestData/smime/smec2.pem create mode 100644 UnitTests/TestData/smime/smec3.pem create mode 100644 UnitTests/TestData/smime/smroot.pem create mode 100644 UnitTests/TestData/smime/smrsa1.pem create mode 100644 UnitTests/TestData/smime/smrsa2.pem create mode 100644 UnitTests/TestData/smime/smrsa3.pem diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 6758e952e4..53da4de5a6 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -34,6 +34,7 @@ using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1.Smime; using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.Crypto.Parameters; #if !PORTABLE using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; @@ -219,6 +220,38 @@ public static string GetFingerprint (this X509Certificate certificate) return fingerprint.ToString (); } + /// + /// Gets the public key algorithm for the certificate. + /// + /// + /// Gets the public key algorithm for the ceretificate. + /// + /// The public key algorithm. + /// The certificate. + /// + /// is null. + /// + public static PublicKeyAlgorithm GetPublicKeyAlgorithm (this X509Certificate certificate) + { + if (certificate == null) + throw new ArgumentNullException (nameof (certificate)); + + var pubkey = certificate.GetPublicKey (); + + if (pubkey is DsaKeyParameters) + return PublicKeyAlgorithm.Dsa; + if (pubkey is RsaKeyParameters) + return PublicKeyAlgorithm.RsaGeneral; + if (pubkey is ElGamalKeyParameters) + return PublicKeyAlgorithm.ElGamalGeneral; + if (pubkey is ECKeyParameters) + return PublicKeyAlgorithm.EllipticCurve; + if (pubkey is DHKeyParameters) + return PublicKeyAlgorithm.DiffieHellman; + + return PublicKeyAlgorithm.None; + } + internal static X509KeyUsageFlags GetKeyUsageFlags (bool[] usage) { var flags = X509KeyUsageFlags.None; diff --git a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs index 8eb4150e8f..78955b38ff 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs @@ -27,7 +27,6 @@ using System; using Org.BouncyCastle.X509; -using Org.BouncyCastle.Crypto.Parameters; namespace MimeKit.Cryptography { /// @@ -54,20 +53,8 @@ public SecureMimeDigitalCertificate (X509Certificate certificate) throw new ArgumentNullException (nameof (certificate)); Certificate = certificate; - - var pubkey = certificate.GetPublicKey (); - if (pubkey is DsaKeyParameters) - PublicKeyAlgorithm = PublicKeyAlgorithm.Dsa; - else if (pubkey is RsaKeyParameters) - PublicKeyAlgorithm = PublicKeyAlgorithm.RsaGeneral; - else if (pubkey is ElGamalKeyParameters) - PublicKeyAlgorithm = PublicKeyAlgorithm.ElGamalGeneral; - else if (pubkey is ECKeyParameters) - PublicKeyAlgorithm = PublicKeyAlgorithm.EllipticCurve; - else if (pubkey is DHKeyParameters) - PublicKeyAlgorithm = PublicKeyAlgorithm.DiffieHellman; - Fingerprint = certificate.GetFingerprint (); + PublicKeyAlgorithm = certificate.GetPublicKeyAlgorithm (); } /// diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs index 5f9ac85429..406d330532 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs @@ -54,16 +54,21 @@ public WindowsSecureMimeDigitalCertificate (X509Certificate2 certificate) Certificate = certificate; - var algorithm = certificate.PublicKey.Key; + try { + var algorithm = certificate.PublicKey.Key; - if (algorithm is DSA) - PublicKeyAlgorithm = PublicKeyAlgorithm.Dsa; - else if (algorithm is RSA) - PublicKeyAlgorithm = PublicKeyAlgorithm.RsaGeneral; - else if (algorithm is ECDiffieHellman) - PublicKeyAlgorithm = PublicKeyAlgorithm.DiffieHellman; - else if (algorithm is ECDsa) - PublicKeyAlgorithm = PublicKeyAlgorithm.EllipticCurveDsa; + if (algorithm is DSA) + PublicKeyAlgorithm = PublicKeyAlgorithm.Dsa; + else if (algorithm is RSA) + PublicKeyAlgorithm = PublicKeyAlgorithm.RsaGeneral; + else if (algorithm is ECDiffieHellman) + PublicKeyAlgorithm = PublicKeyAlgorithm.DiffieHellman; + else if (algorithm is ECDsa) + PublicKeyAlgorithm = PublicKeyAlgorithm.EllipticCurveDsa; + } catch (CryptographicException) { + var x509 = certificate.AsBouncyCastleCertificate (); + PublicKeyAlgorithm = x509.GetPublicKeyAlgorithm (); + } } /// diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index d9bc633712..a554b10cde 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -1,9 +1,9 @@ -// +// // ArgumentExceptionTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AssortedTests.cs b/UnitTests/AssortedTests.cs index 1801908b11..4393c80bea 100644 --- a/UnitTests/AssortedTests.cs +++ b/UnitTests/AssortedTests.cs @@ -1,9 +1,9 @@ -// +// // AssortedTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index 73cf310743..2bb0612e48 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ConstructorTests.cs b/UnitTests/ConstructorTests.cs index 6353d39639..6dd79b488f 100644 --- a/UnitTests/ConstructorTests.cs +++ b/UnitTests/ConstructorTests.cs @@ -1,9 +1,9 @@ -// +// // ConstructorTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentDispositionTests.cs b/UnitTests/ContentDispositionTests.cs index 143924653c..edddecc2cc 100644 --- a/UnitTests/ContentDispositionTests.cs +++ b/UnitTests/ContentDispositionTests.cs @@ -1,9 +1,9 @@ -// +// // ContentDispositionTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentObjectTests.cs b/UnitTests/ContentObjectTests.cs index eda4e796f0..937e8ab52a 100644 --- a/UnitTests/ContentObjectTests.cs +++ b/UnitTests/ContentObjectTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index 2aeb0047f2..d40c9ec1be 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -1,9 +1,9 @@ -// +// // ContentTypeTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs index 377b3f6f37..08ce6be579 100644 --- a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs +++ b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index 4450dac664..c92dac1db4 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index b744d4f4b5..3e9cedad0a 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -1,9 +1,9 @@ -// +// // CmsRecipientTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index 771a595411..f7240aba79 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -1,9 +1,9 @@ -// +// // CmsSignerTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index af9f8b6002..fdca6328a7 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs index 327507b8bc..d61625620d 100644 --- a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs +++ b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs @@ -1,9 +1,9 @@ -// +// // DkimRelaxedBodyFilterTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 73696ac4d8..c13823341f 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -1,9 +1,9 @@ -// +// // DkimTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DummyOpenPgpContext.cs b/UnitTests/Cryptography/DummyOpenPgpContext.cs index f0161a665c..02a7d4b686 100644 --- a/UnitTests/Cryptography/DummyOpenPgpContext.cs +++ b/UnitTests/Cryptography/DummyOpenPgpContext.cs @@ -1,9 +1,9 @@ -// +// // DummyOpenPgpContext.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 68fa928739..4e74b08a50 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -1,9 +1,9 @@ -// +// // PgpMimeTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs new file mode 100644 index 0000000000..1dc3b9fc0a --- /dev/null +++ b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs @@ -0,0 +1,139 @@ +// +// SecureMimeDigitalCertificateTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; + +using NUnit.Framework; + +using Org.BouncyCastle.X509; + +using MimeKit; +using MimeKit.Cryptography; + +using X509Certificate = Org.BouncyCastle.X509.X509Certificate; +using Org.BouncyCastle.OpenSsl; + +namespace UnitTests.Cryptography { + [TestFixture] + public class SecureMimeDigitalCertificateTests + { + [Test] + public void TestArgumentExceptions () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + + Assert.Throws (() => new SecureMimeDigitalCertificate (null)); + Assert.Throws (() => new SecureMimeDigitalSignature (null, signer.Certificate)); + + Assert.Throws (() => new WindowsSecureMimeDigitalCertificate (null)); + Assert.Throws (() => new WindowsSecureMimeDigitalSignature (null)); + } + + static X509Certificate GetCertificate (string fileName) + { + using (var stream = File.OpenText (Path.Combine ("..", "..", "TestData", "smime", fileName))) { + var reader = new PemReader (stream); + object item; + + while ((item = reader.ReadObject ()) != null) { + var certificate = item as X509Certificate; + + if (certificate != null) + return certificate; + } + } + + return null; + } + + [Test] + public void TestPublicKeyAlgorithmDetection () + { + var dsa = new string[] { "smdsa1.pem", "smdsa2.pem", "smdsa3.pem" }; + var rsa = new string[] { "smrsa1.pem", "smrsa2.pem", "smrsa3.pem" }; + var ec = new string[] { "smec1.pem", "smec2.pem", "smec3.pem" }; + //var dh = new string[] { "smdh.pem" }; + WindowsSecureMimeDigitalCertificate digital2; + SecureMimeDigitalCertificate digital; + X509Certificate2 certificate2; + X509Certificate certificate; + + foreach (var fileName in dsa) { + certificate = GetCertificate (fileName); + digital = new SecureMimeDigitalCertificate (certificate); + + Assert.AreEqual (PublicKeyAlgorithm.Dsa, digital.PublicKeyAlgorithm, "PublicKeyAlgorithm: {0}", fileName); + + certificate2 = certificate.AsX509Certificate2 (); + digital2 = new WindowsSecureMimeDigitalCertificate (certificate2); + + Assert.AreEqual (PublicKeyAlgorithm.Dsa, digital2.PublicKeyAlgorithm, "Windows PublicKeyAlgorithm {0}", fileName); + } + + foreach (var fileName in rsa) { + certificate = GetCertificate (fileName); + digital = new SecureMimeDigitalCertificate (certificate); + + Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, digital.PublicKeyAlgorithm, "PublicKeyAlgorithm: {0}", fileName); + + certificate2 = certificate.AsX509Certificate2 (); + digital2 = new WindowsSecureMimeDigitalCertificate (certificate2); + + Assert.AreEqual (PublicKeyAlgorithm.RsaGeneral, digital2.PublicKeyAlgorithm, "Windows PublicKeyAlgorithm {0}", fileName); + } + + foreach (var fileName in ec) { + certificate = GetCertificate (fileName); + digital = new SecureMimeDigitalCertificate (certificate); + + Assert.AreEqual (PublicKeyAlgorithm.EllipticCurve, digital.PublicKeyAlgorithm, "PublicKeyAlgorithm: {0}", fileName); + + certificate2 = certificate.AsX509Certificate2 (); + digital2 = new WindowsSecureMimeDigitalCertificate (certificate2); + + Assert.AreEqual (PublicKeyAlgorithm.EllipticCurve, digital2.PublicKeyAlgorithm, "Windows PublicKeyAlgorithm {0}", fileName); + } + + //foreach (var fileName in dh) { + // certificate = GetCertificate (fileName); + // digital = new SecureMimeDigitalCertificate (certificate); + + // Assert.AreEqual (PublicKeyAlgorithm.DiffieHellman, digital.PublicKeyAlgorithm, "PublicKeyAlgorithm: {0}", fileName); + + // certificate2 = certificate.AsX509Certificate2 (); + // digital2 = new WindowsSecureMimeDigitalCertificate (certificate2); + + // Assert.AreEqual (PublicKeyAlgorithm.DiffieHellman, digital2.PublicKeyAlgorithm, "Windows PublicKeyAlgorithm {0}", fileName); + //} + } + } +} diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 2693db2e19..383e9a0dfb 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -1,9 +1,9 @@ -// +// // SecureMimeTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -120,15 +120,8 @@ protected SecureMimeTestsBase () [Test] public void TestArgumentExceptions () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var stream = new MemoryStream (); - Assert.Throws (() => new SecureMimeDigitalCertificate (null)); - Assert.Throws (() => new SecureMimeDigitalSignature (null, signer.Certificate)); - - Assert.Throws (() => new WindowsSecureMimeDigitalCertificate (null)); - Assert.Throws (() => new WindowsSecureMimeDigitalSignature (null)); - Assert.Throws (() => new ApplicationPkcs7Signature ((MimeEntityConstructorArgs) null)); Assert.Throws (() => new ApplicationPkcs7Mime ((MimeEntityConstructorArgs) null)); Assert.Throws (() => new ApplicationPkcs7Signature ((Stream) null)); @@ -143,6 +136,7 @@ public void TestArgumentExceptions () Assert.Throws (() => SecureMimeContext.GetDigestOid (DigestAlgorithm.Tiger192)); using (var ctx = CreateContext ()) { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var mailbox = new MailboxAddress ("Unit Tests", "example@mimekit.net"); var recipients = new CmsRecipientCollection (); DigitalSignatureCollection signatures; diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index 47631a95a5..0ccba10e0a 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -1,9 +1,9 @@ -// +// // X509CertificateChainTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs index 446302b9ba..884baa282d 100644 --- a/UnitTests/Cryptography/X509CertificateRecordTests.cs +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index 8f5ca25fbd..fe7001d06d 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -1,9 +1,9 @@ -// +// // X509CertificateStoreTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/DomainListTests.cs b/UnitTests/DomainListTests.cs index 542b551699..d1ddda2cdd 100644 --- a/UnitTests/DomainListTests.cs +++ b/UnitTests/DomainListTests.cs @@ -1,9 +1,9 @@ -// +// // DomainListTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index c0583139c7..8748ebdc70 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -1,9 +1,9 @@ -// +// // EncoderTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/YEncodingTests.cs b/UnitTests/Encodings/YEncodingTests.cs index 4288193b8e..15a14726a3 100644 --- a/UnitTests/Encodings/YEncodingTests.cs +++ b/UnitTests/Encodings/YEncodingTests.cs @@ -1,9 +1,9 @@ -// +// // YEncodingTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ExceptionTests.cs b/UnitTests/ExceptionTests.cs index 7ae040e7fa..2d20009deb 100644 --- a/UnitTests/ExceptionTests.cs +++ b/UnitTests/ExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 1b20ce0d51..d3e39c150d 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -1,9 +1,9 @@ -// +// // GroupAddressTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderListTests.cs b/UnitTests/HeaderListTests.cs index cef1ab85e9..e308c3d35d 100644 --- a/UnitTests/HeaderListTests.cs +++ b/UnitTests/HeaderListTests.cs @@ -1,9 +1,9 @@ -// +// // HeaderListTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index 480f9f1004..c487d8ed37 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -1,9 +1,9 @@ -// +// // HeaderTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HtmlPreviewVisitor.cs b/UnitTests/HtmlPreviewVisitor.cs index ba23a2ed6a..8d48d84006 100644 --- a/UnitTests/HtmlPreviewVisitor.cs +++ b/UnitTests/HtmlPreviewVisitor.cs @@ -1,9 +1,9 @@ -// +// // HtmlPreviewVisitor.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/BoundStreamTests.cs b/UnitTests/IO/BoundStreamTests.cs index df3ea3248b..cd6ffb8e09 100644 --- a/UnitTests/IO/BoundStreamTests.cs +++ b/UnitTests/IO/BoundStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/CanReadWriteSeekStream.cs b/UnitTests/IO/CanReadWriteSeekStream.cs index 0127308655..8ec0a7e196 100644 --- a/UnitTests/IO/CanReadWriteSeekStream.cs +++ b/UnitTests/IO/CanReadWriteSeekStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ChainedStreamTests.cs b/UnitTests/IO/ChainedStreamTests.cs index ef1ed5341f..1a2a166857 100644 --- a/UnitTests/IO/ChainedStreamTests.cs +++ b/UnitTests/IO/ChainedStreamTests.cs @@ -1,9 +1,9 @@ -// +// // ChainedStreamTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/FilteredStreamTests.cs b/UnitTests/IO/FilteredStreamTests.cs index 44bfee6388..79e90a4a28 100644 --- a/UnitTests/IO/FilteredStreamTests.cs +++ b/UnitTests/IO/FilteredStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/Filters/FilterTests.cs b/UnitTests/IO/Filters/FilterTests.cs index b37b7d4ed4..230bf8eebf 100644 --- a/UnitTests/IO/Filters/FilterTests.cs +++ b/UnitTests/IO/Filters/FilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MeasuringStreamTests.cs b/UnitTests/IO/MeasuringStreamTests.cs index 627c5cdaa9..20f776ed14 100644 --- a/UnitTests/IO/MeasuringStreamTests.cs +++ b/UnitTests/IO/MeasuringStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index 099ae44d93..22ddc2d7b3 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -1,9 +1,9 @@ -// +// // MemoryBlockStreamTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ReadOneByteStream.cs b/UnitTests/IO/ReadOneByteStream.cs index b5eae7f286..f5f31d523d 100644 --- a/UnitTests/IO/ReadOneByteStream.cs +++ b/UnitTests/IO/ReadOneByteStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/TimeoutStream.cs b/UnitTests/IO/TimeoutStream.cs index 90e0f27f8b..b452a33d7f 100644 --- a/UnitTests/IO/TimeoutStream.cs +++ b/UnitTests/IO/TimeoutStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index ff213ca624..972395da12 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -1,9 +1,9 @@ -// +// // InternetAddressListTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index d6b59d613b..dc04afc7f2 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -1,9 +1,9 @@ -// +// // InternetAddressTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 4657e139c3..def9193ed3 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -1,9 +1,9 @@ -// +// // MailboxAddressTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDeliveryStatusTests.cs b/UnitTests/MessageDeliveryStatusTests.cs index 7762e85a37..19beecc5b7 100644 --- a/UnitTests/MessageDeliveryStatusTests.cs +++ b/UnitTests/MessageDeliveryStatusTests.cs @@ -1,9 +1,9 @@ -// +// // MessageDeliveryStatusTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDispositionNotificiationTests.cs b/UnitTests/MessageDispositionNotificiationTests.cs index aa6af4c3ac..cf06e11d05 100644 --- a/UnitTests/MessageDispositionNotificiationTests.cs +++ b/UnitTests/MessageDispositionNotificiationTests.cs @@ -1,9 +1,9 @@ -// +// // MessageDispositionNotificiationTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageIdListTests.cs b/UnitTests/MessageIdListTests.cs index 862005c864..26feb12ad8 100644 --- a/UnitTests/MessageIdListTests.cs +++ b/UnitTests/MessageIdListTests.cs @@ -1,9 +1,9 @@ -// +// // MessageIdListTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessagePartialTests.cs b/UnitTests/MessagePartialTests.cs index e61e57f716..7a2a531ddb 100644 --- a/UnitTests/MessagePartialTests.cs +++ b/UnitTests/MessagePartialTests.cs @@ -1,9 +1,9 @@ -// +// // MessagePartialTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index dd7732852e..735a8fa2ad 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -1,9 +1,9 @@ -// +// // MimeMessageTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index e89e0b7d3e..41b5384885 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -1,9 +1,9 @@ -// +// // MimeParserTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index dafb388b9e..6dcfab0eb2 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -1,9 +1,9 @@ -// +// // MimePartTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Jeffrey Stedfast +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 9a03c150ce..029306d671 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -1,9 +1,9 @@ -// +// // MimeTypeTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index 3d2050943f..aa6d593c5a 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -1,9 +1,9 @@ -// +// // MimeVisitorTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index f43e125177..8d91374f7d 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -1,9 +1,9 @@ -// +// // MultipartRelatedTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartReportTests.cs b/UnitTests/MultipartReportTests.cs index 80f4bb5279..dbe74672c4 100644 --- a/UnitTests/MultipartReportTests.cs +++ b/UnitTests/MultipartReportTests.cs @@ -1,9 +1,9 @@ -// +// // MultipartReportTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartTests.cs b/UnitTests/MultipartTests.cs index 73f79e30fa..5a245a9aa7 100644 --- a/UnitTests/MultipartTests.cs +++ b/UnitTests/MultipartTests.cs @@ -1,9 +1,9 @@ -// +// // MultipartTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterListTests.cs b/UnitTests/ParameterListTests.cs index 14c9df3855..a55814044b 100644 --- a/UnitTests/ParameterListTests.cs +++ b/UnitTests/ParameterListTests.cs @@ -1,9 +1,9 @@ -// +// // ParameterListTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterTests.cs b/UnitTests/ParameterTests.cs index efad610127..6334f44b03 100644 --- a/UnitTests/ParameterTests.cs +++ b/UnitTests/ParameterTests.cs @@ -1,9 +1,9 @@ -// +// // ParameterTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParserOptionsTests.cs b/UnitTests/ParserOptionsTests.cs index a057683cba..c46545935a 100644 --- a/UnitTests/ParserOptionsTests.cs +++ b/UnitTests/ParserOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TestData/smime/smdh.pem b/UnitTests/TestData/smime/smdh.pem new file mode 100644 index 0000000000..f831b0713b --- /dev/null +++ b/UnitTests/TestData/smime/smdh.pem @@ -0,0 +1,33 @@ +-----BEGIN PRIVATE KEY----- +MIIBSgIBADCCASsGByqGSM4+AgEwggEeAoGBANQMSgwEcnEZ31kZxa9Ef8qOK/AJ +9dMlsXMWVYnf/QevGdN/0Aei/j9a8QHG+CvvTm0DOEKhN9QUtABKsYZag865CA7B +mSdHjQuFqILtzA25sDJ+3+jk9vbss+56ETRll/wasJVLGbmmHNkBMvc1fC1d/sGF +cEn4zJnQvvFaeMgDAoGAaQD9ZvL8FYsJuNxN6qp5VfnfRqYvyi2PWSqtRKPGGC+V +thYg49PRjwPOcXzvOsdEOQ7iH9jTiSvnUdwSSEwYTZkSBuQXAgOMJAWOpoXyaRvh +atziBDoBnWS+/kX5RBhxvS0+em9yfRqAQleuGG+R1mEDihyJc8dWQQPT+O1l4oUC +FQCJlKsQZ0VBrWPGcUCNa54ZW6TH9QQWAhRR2NMZrQSfWthXDO8Lj5WZ34zQrA== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIID/zCCAuegAwIBAgIJANv1TSKgememMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA4MDIxNDQ5MjlaFw0yMzA2MTExNDQ5MjlaMEQx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRU +ZXN0IFMvTUlNRSBFRSBESCAjMTCCAbYwggErBgcqhkjOPgIBMIIBHgKBgQDUDEoM +BHJxGd9ZGcWvRH/KjivwCfXTJbFzFlWJ3/0HrxnTf9AHov4/WvEBxvgr705tAzhC +oTfUFLQASrGGWoPOuQgOwZknR40LhaiC7cwNubAyft/o5Pb27LPuehE0ZZf8GrCV +Sxm5phzZATL3NXwtXf7BhXBJ+MyZ0L7xWnjIAwKBgGkA/Wby/BWLCbjcTeqqeVX5 +30amL8otj1kqrUSjxhgvlbYWIOPT0Y8DznF87zrHRDkO4h/Y04kr51HcEkhMGE2Z +EgbkFwIDjCQFjqaF8mkb4Wrc4gQ6AZ1kvv5F+UQYcb0tPnpvcn0agEJXrhhvkdZh +A4ociXPHVkED0/jtZeKFAhUAiZSrEGdFQa1jxnFAjWueGVukx/UDgYQAAoGAL1ve +cgI2awBeJH8ULBhSQpdL224VUDxFPiXzt8Vu5VLnxPv0pfA5En+8VByTuV7u6RSw +3/78NuTyr/sTyN8YlB1AuXHdTJynA1ICte1xgD4j2ijlq+dv8goOAFt9xkvXx7LD +umJ/cCignXETcNGfMi8+0s0bpMZyoHRdce8DQ26jYDBeMAwGA1UdEwEB/wQCMAAw +DgYDVR0PAQH/BAQDAgXgMB0GA1UdDgQWBBQLWk1ffSXH8p3Bqrdjgi/6jzLnwDAf +BgNVHSMEGDAWgBTffl6IBSQzCN0igQKXzJq3sTMnMDANBgkqhkiG9w0BAQUFAAOC +AQEAWvJj79MW1/Wq3RIANgAhonsI1jufYqxTH+1M0RU0ZXHulgem77Le2Ls1bizi +0SbvfpTiiFGkbKonKtO2wvfqwwuptSg3omMI5IjAGxYbyv2KBzIpp1O1LTDk9RbD +48JMMF01gByi2+NLUQ1MYF+5RqyoRqcyp5x2+Om1GeIM4Q/GRuI4p4dybWy8iC+d +LeXQfR7HXfh+tAum+WzjfLJwbnWbHmPhTbKB01U4lBp6+r8BGHAtNdPjEHqap4/z +vVZVXti9ThZ20EhM+VFU3y2wyapeQjhQvw/A2YRES0Ik7BSj3hHfWH/CTbLVQnhu +Uj6tw18ExOYxqoEGixNLPA5qsQ== +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smdsa1.pem b/UnitTests/TestData/smime/smdsa1.pem new file mode 100644 index 0000000000..b424f6704e --- /dev/null +++ b/UnitTests/TestData/smime/smdsa1.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIICZQIBADCCAjkGByqGSM44BAEwggIsAoIBAQCQfLlNdehPnTrGIMhw4rk0uua6 +k1nCG3zcyfXli17BdB2k0HBPaTA3a3ZHfOt1Awy0Uu0wZ3gdPr9z0I64hnJXIGou +zIanZ7nYRImHtX5JMFbXeyxo1Owd2Zs3oEk9nQUoUsMxvmYC/ghPL5Zx1pPxcHCO +wzWxoG4yZMjimXOc1/W7zvK/4/g/Cz9fItD3zdcydfgM/hK0/CeYQ21xfhqf4mjK +v9plnCcWgToGI+7H8VK80MFbkO2QKRz3vP1/TjK6PRm9sEeB5b10+SvGv2j2w+CC +0fXL4s6n7PtBlm/bww8xL1/Az8kwejUcII1Dc8uNwwISwGbwaGBvl7IHpm21AiEA +rodZi+nCKZdTL8IgCjX3n0DuhPRkVQPjz/B6VweLW9MCggEAfimkUNwnsGFp7mKM +zJKhHoQkMB1qJzyIHjDzQ/J1xjfoF6i27afw1/WKboND5eseZhlhA2TO5ZJB6nGx +DOE9lVQxYVml++cQj6foHh1TVJAgGl4mWuveW/Rz+NEhpK4zVeEsfMrbkBypPByy +xzF1Z49t568xdIo+e8jLI8FjEdXOIUg4ehB3NY6SL8r4oJ49j/sJWfHcDoWH/LK9 +ZaBF8NpflJe3F40S8RDvM8j2HC+y2Q4QyKk1DXGiH+7yQLGWzr3M73kC3UBnnH0h +Hxb7ISDCT7dCw/lH1nCbVFBOM0ASI26SSsFSXQrvD2kryRcTZ0KkyyhhoPODWpU+ +TQMsxQQjAiEAkolGvb/76X3vm5Ov09ezqyBYt9cdj/FLH7DyMkxO7X0= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFkDCCBHigAwIBAgIJANk5lu6mSyBDMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzFaFw0yMzA1MjYxNzI4MzFaMEUx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR4wHAYDVQQDDBVU +ZXN0IFMvTUlNRSBFRSBEU0EgIzEwggNGMIICOQYHKoZIzjgEATCCAiwCggEBAJB8 +uU116E+dOsYgyHDiuTS65rqTWcIbfNzJ9eWLXsF0HaTQcE9pMDdrdkd863UDDLRS +7TBneB0+v3PQjriGclcgai7MhqdnudhEiYe1fkkwVtd7LGjU7B3ZmzegST2dBShS +wzG+ZgL+CE8vlnHWk/FwcI7DNbGgbjJkyOKZc5zX9bvO8r/j+D8LP18i0PfN1zJ1 ++Az+ErT8J5hDbXF+Gp/iaMq/2mWcJxaBOgYj7sfxUrzQwVuQ7ZApHPe8/X9OMro9 +Gb2wR4HlvXT5K8a/aPbD4ILR9cvizqfs+0GWb9vDDzEvX8DPyTB6NRwgjUNzy43D +AhLAZvBoYG+XsgembbUCIQCuh1mL6cIpl1MvwiAKNfefQO6E9GRVA+PP8HpXB4tb +0wKCAQB+KaRQ3CewYWnuYozMkqEehCQwHWonPIgeMPND8nXGN+gXqLbtp/DX9Ypu +g0Pl6x5mGWEDZM7lkkHqcbEM4T2VVDFhWaX75xCPp+geHVNUkCAaXiZa695b9HP4 +0SGkrjNV4Sx8ytuQHKk8HLLHMXVnj23nrzF0ij57yMsjwWMR1c4hSDh6EHc1jpIv +yvignj2P+wlZ8dwOhYf8sr1loEXw2l+Ul7cXjRLxEO8zyPYcL7LZDhDIqTUNcaIf +7vJAsZbOvczveQLdQGecfSEfFvshIMJPt0LD+UfWcJtUUE4zQBIjbpJKwVJdCu8P +aSvJFxNnQqTLKGGg84NalT5NAyzFA4IBBQACggEAGXSQADbuRIZBjiQ6NikwZl+x +EDEffIE0RWbvwf1tfWxw4ZvanO/djyz5FePO0AIJDBCLUjr9D32nkmIG1Hu3dWgV +86knQsM6uFiMSzY9nkJGZOlH3w4NHLE78pk75xR1sg1MEZr4x/t+a/ea9Y4AXklE +DCcaHtpMGeAx3ZAqSKec+zQOOA73JWP1/gYHGdYyTQpQtwRTsh0Gi5mOOdpoJ0vp +O83xYbFCZ+ZZKX1RWOjJe2OQBRtw739q1nRga1VMLAT/LFSQsSE3IOp8hiWbjnit +1SE6q3II2a/aHZH/x4OzszfmtQfmerty3eQSq3bgajfxCsccnRjSbLeNiazRSKNg +MF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0OBBYEFNHQYTOO +xaZ/N68OpxqjHKuatw6sMB8GA1UdIwQYMBaAFMmRUwpjexZbi71E8HaIqSTm5bZs +MA0GCSqGSIb3DQEBBQUAA4IBAQAAiLociMMXcLkO/uKjAjCIQMrsghrOrxn4ZGBx +d/mCTeqPxhcrX2UorwxVCKI2+Dmz5dTC2xKprtvkiIadJamJmxYYzeF1pgRriFN3 +MkmMMkTbe/ekSvSeMtHQ2nHDCAJIaA/k9akWfA0+26Ec25/JKMrl3LttllsJMK1z +Xj7TcQpAIWORKWSNxY/ezM34+9ABHDZB2waubFqS+irlZsn38aZRuUI0K67fuuIt +17vMUBqQpe2hfNAjpZ8dIpEdAGjQ6izV2uwP1lXbiaK9U4dvUqmwyCIPniX7Hpaf +0VnX0mEViXMT6vWZTjLBUv0oKmO7xBkWHIaaX6oyF32pK5AO +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smdsa2.pem b/UnitTests/TestData/smime/smdsa2.pem new file mode 100644 index 0000000000..648447fc89 --- /dev/null +++ b/UnitTests/TestData/smime/smdsa2.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIICZAIBADCCAjkGByqGSM44BAEwggIsAoIBAQCQfLlNdehPnTrGIMhw4rk0uua6 +k1nCG3zcyfXli17BdB2k0HBPaTA3a3ZHfOt1Awy0Uu0wZ3gdPr9z0I64hnJXIGou +zIanZ7nYRImHtX5JMFbXeyxo1Owd2Zs3oEk9nQUoUsMxvmYC/ghPL5Zx1pPxcHCO +wzWxoG4yZMjimXOc1/W7zvK/4/g/Cz9fItD3zdcydfgM/hK0/CeYQ21xfhqf4mjK +v9plnCcWgToGI+7H8VK80MFbkO2QKRz3vP1/TjK6PRm9sEeB5b10+SvGv2j2w+CC +0fXL4s6n7PtBlm/bww8xL1/Az8kwejUcII1Dc8uNwwISwGbwaGBvl7IHpm21AiEA +rodZi+nCKZdTL8IgCjX3n0DuhPRkVQPjz/B6VweLW9MCggEAfimkUNwnsGFp7mKM +zJKhHoQkMB1qJzyIHjDzQ/J1xjfoF6i27afw1/WKboND5eseZhlhA2TO5ZJB6nGx +DOE9lVQxYVml++cQj6foHh1TVJAgGl4mWuveW/Rz+NEhpK4zVeEsfMrbkBypPByy +xzF1Z49t568xdIo+e8jLI8FjEdXOIUg4ehB3NY6SL8r4oJ49j/sJWfHcDoWH/LK9 +ZaBF8NpflJe3F40S8RDvM8j2HC+y2Q4QyKk1DXGiH+7yQLGWzr3M73kC3UBnnH0h +Hxb7ISDCT7dCw/lH1nCbVFBOM0ASI26SSsFSXQrvD2kryRcTZ0KkyyhhoPODWpU+ +TQMsxQQiAiAdCUJ5n2Q9hIynN8BMpnRcdfH696BKejGx+2Mr2kfnnA== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFkDCCBHigAwIBAgIJANk5lu6mSyBEMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzFaFw0yMzA1MjYxNzI4MzFaMEUx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR4wHAYDVQQDDBVU +ZXN0IFMvTUlNRSBFRSBEU0EgIzIwggNGMIICOQYHKoZIzjgEATCCAiwCggEBAJB8 +uU116E+dOsYgyHDiuTS65rqTWcIbfNzJ9eWLXsF0HaTQcE9pMDdrdkd863UDDLRS +7TBneB0+v3PQjriGclcgai7MhqdnudhEiYe1fkkwVtd7LGjU7B3ZmzegST2dBShS +wzG+ZgL+CE8vlnHWk/FwcI7DNbGgbjJkyOKZc5zX9bvO8r/j+D8LP18i0PfN1zJ1 ++Az+ErT8J5hDbXF+Gp/iaMq/2mWcJxaBOgYj7sfxUrzQwVuQ7ZApHPe8/X9OMro9 +Gb2wR4HlvXT5K8a/aPbD4ILR9cvizqfs+0GWb9vDDzEvX8DPyTB6NRwgjUNzy43D +AhLAZvBoYG+XsgembbUCIQCuh1mL6cIpl1MvwiAKNfefQO6E9GRVA+PP8HpXB4tb +0wKCAQB+KaRQ3CewYWnuYozMkqEehCQwHWonPIgeMPND8nXGN+gXqLbtp/DX9Ypu +g0Pl6x5mGWEDZM7lkkHqcbEM4T2VVDFhWaX75xCPp+geHVNUkCAaXiZa695b9HP4 +0SGkrjNV4Sx8ytuQHKk8HLLHMXVnj23nrzF0ij57yMsjwWMR1c4hSDh6EHc1jpIv +yvignj2P+wlZ8dwOhYf8sr1loEXw2l+Ul7cXjRLxEO8zyPYcL7LZDhDIqTUNcaIf +7vJAsZbOvczveQLdQGecfSEfFvshIMJPt0LD+UfWcJtUUE4zQBIjbpJKwVJdCu8P +aSvJFxNnQqTLKGGg84NalT5NAyzFA4IBBQACggEAItQlFu0t7Mw1HHROuuwKLS+E +h2WNNZP96MLQTygOVlqgaJY+1mJLzvl/51LLH6YezX0t89Z2Dm/3SOJEdNrdbIEt +tbu5rzymXxFhc8uaIYZFhST38oQwJOjM8wFitAQESe6/9HZjkexMqSqx/r5aEKTa +LBinqA1BJRI72So1/1dv8P99FavPADdj8V7fAccReKEQKnfnwA7mrnD+OlIqFKFn +3wCGk8Sw7tSJ9g6jgCI+zFwrKn2w+w+iot/Ogxl9yMAtKmAd689IAZr5GPPvV2y0 +KOogCiUYgSTSawZhr+rjyFavfI5dBWzMq4tKx/zAi6MJ+6hGJjJ8jHoT9JAPmaNg +MF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0OBBYEFGaxw04k +qpufeGZC+TTBq8oMnXyrMB8GA1UdIwQYMBaAFMmRUwpjexZbi71E8HaIqSTm5bZs +MA0GCSqGSIb3DQEBBQUAA4IBAQCk2Xob1ICsdHYx/YsBzY6E1eEwcI4RZbZ3hEXp +VA72/Mbz60gjv1OwE5Ay4j+xG7IpTio6y2A9ZNepGpzidYcsL/Lx9Sv1LlN0Ukzb +uk6Czd2sZJp+PFMTTrgCd5rXKnZs/0D84Vci611vGMA1hnUnbAnBBmgLXe9pDNRV +6mhmCLLjJ4GOr5Wxt/hhknr7V2e1VMx3Q47GZhc0o/gExfhxXA8+gicM0nEYNakD +2A1F0qDhQGakjuofANHhjdUDqKJ1sxurAy80fqb0ddzJt2el89iXKN+aXx/zEX96 +GI5ON7z/bkVwIi549lUOpWb2Mved61NBzCLKVP7HSuEIsC/I +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smdsa3.pem b/UnitTests/TestData/smime/smdsa3.pem new file mode 100644 index 0000000000..77acc5e46f --- /dev/null +++ b/UnitTests/TestData/smime/smdsa3.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIICZQIBADCCAjkGByqGSM44BAEwggIsAoIBAQCQfLlNdehPnTrGIMhw4rk0uua6 +k1nCG3zcyfXli17BdB2k0HBPaTA3a3ZHfOt1Awy0Uu0wZ3gdPr9z0I64hnJXIGou +zIanZ7nYRImHtX5JMFbXeyxo1Owd2Zs3oEk9nQUoUsMxvmYC/ghPL5Zx1pPxcHCO +wzWxoG4yZMjimXOc1/W7zvK/4/g/Cz9fItD3zdcydfgM/hK0/CeYQ21xfhqf4mjK +v9plnCcWgToGI+7H8VK80MFbkO2QKRz3vP1/TjK6PRm9sEeB5b10+SvGv2j2w+CC +0fXL4s6n7PtBlm/bww8xL1/Az8kwejUcII1Dc8uNwwISwGbwaGBvl7IHpm21AiEA +rodZi+nCKZdTL8IgCjX3n0DuhPRkVQPjz/B6VweLW9MCggEAfimkUNwnsGFp7mKM +zJKhHoQkMB1qJzyIHjDzQ/J1xjfoF6i27afw1/WKboND5eseZhlhA2TO5ZJB6nGx +DOE9lVQxYVml++cQj6foHh1TVJAgGl4mWuveW/Rz+NEhpK4zVeEsfMrbkBypPByy +xzF1Z49t568xdIo+e8jLI8FjEdXOIUg4ehB3NY6SL8r4oJ49j/sJWfHcDoWH/LK9 +ZaBF8NpflJe3F40S8RDvM8j2HC+y2Q4QyKk1DXGiH+7yQLGWzr3M73kC3UBnnH0h +Hxb7ISDCT7dCw/lH1nCbVFBOM0ASI26SSsFSXQrvD2kryRcTZ0KkyyhhoPODWpU+ +TQMsxQQjAiEArJr6p2zTbhRppQurHGTdmdYHqrDdZH4MCsD9tQCw1xY= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFkDCCBHigAwIBAgIJANk5lu6mSyBFMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzFaFw0yMzA1MjYxNzI4MzFaMEUx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR4wHAYDVQQDDBVU +ZXN0IFMvTUlNRSBFRSBEU0EgIzMwggNGMIICOQYHKoZIzjgEATCCAiwCggEBAJB8 +uU116E+dOsYgyHDiuTS65rqTWcIbfNzJ9eWLXsF0HaTQcE9pMDdrdkd863UDDLRS +7TBneB0+v3PQjriGclcgai7MhqdnudhEiYe1fkkwVtd7LGjU7B3ZmzegST2dBShS +wzG+ZgL+CE8vlnHWk/FwcI7DNbGgbjJkyOKZc5zX9bvO8r/j+D8LP18i0PfN1zJ1 ++Az+ErT8J5hDbXF+Gp/iaMq/2mWcJxaBOgYj7sfxUrzQwVuQ7ZApHPe8/X9OMro9 +Gb2wR4HlvXT5K8a/aPbD4ILR9cvizqfs+0GWb9vDDzEvX8DPyTB6NRwgjUNzy43D +AhLAZvBoYG+XsgembbUCIQCuh1mL6cIpl1MvwiAKNfefQO6E9GRVA+PP8HpXB4tb +0wKCAQB+KaRQ3CewYWnuYozMkqEehCQwHWonPIgeMPND8nXGN+gXqLbtp/DX9Ypu +g0Pl6x5mGWEDZM7lkkHqcbEM4T2VVDFhWaX75xCPp+geHVNUkCAaXiZa695b9HP4 +0SGkrjNV4Sx8ytuQHKk8HLLHMXVnj23nrzF0ij57yMsjwWMR1c4hSDh6EHc1jpIv +yvignj2P+wlZ8dwOhYf8sr1loEXw2l+Ul7cXjRLxEO8zyPYcL7LZDhDIqTUNcaIf +7vJAsZbOvczveQLdQGecfSEfFvshIMJPt0LD+UfWcJtUUE4zQBIjbpJKwVJdCu8P +aSvJFxNnQqTLKGGg84NalT5NAyzFA4IBBQACggEAcXvtfiJfIZ0wgGpN72ZeGrJ9 +msUXOxow7w3fDbP8r8nfVkBNbfha8rx0eY6fURFVZzIOd8EHGKypcH1gS6eZNucf +zgsH1g5r5cRahMZmgGXBEBsWrh2IaDG7VSKt+9ghz27EKgjAQCzyHQL5FCJgR2p7 +cv0V4SRqgiAGYlJ191k2WtLOsVd8kX//jj1l8TUgE7TqpuSEpaSyQ4nzJROpZWZp +N1RwFmCURReykABU/Nzin/+rZnvZrp8WoXSXEqxeB4mShRSaH57xFnJCpRwKJ4qS +2uhATzJaKH7vu63k3DjftbSBVh+32YXwtHc+BGjs8S2aDtCW3FtDA7Z6J8BIxaNg +MF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0OBBYEFMJxatDE +FCEFGl4uoiQQ1050Ju9RMB8GA1UdIwQYMBaAFMmRUwpjexZbi71E8HaIqSTm5bZs +MA0GCSqGSIb3DQEBBQUAA4IBAQBGZD1JnMep39KMOhD0iBTmyjhtcnRemckvRask +pS/CqPwo+M+lPNdxpLU2w9b0QhPnj0yAS/BS1yBjsLGY4DP156k4Q3QOhwsrTmrK +YOxg0w7DOpkv5g11YLJpHsjSOwg5uIMoefL8mjQK6XOFOmQXHJrUtGulu+fs6FlM +khGJcW4xYVPK0x/mHvTT8tQaTTkgTdVHObHF5Dyx/F9NMpB3RFguQPk2kT4lJc4i +Up8T9mLzaxz6xc4wwh8h70Zw81lkGYhX+LRk3sfd/REq9x4QXQNP9t9qU1CgrBzv +4orzt9cda4r+rleSg2XjWnXzMydE6DuwPVPZlqnLbSYUy660 +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smdsap.pem b/UnitTests/TestData/smime/smdsap.pem new file mode 100644 index 0000000000..249706c8c7 --- /dev/null +++ b/UnitTests/TestData/smime/smdsap.pem @@ -0,0 +1,9 @@ +-----BEGIN DSA PARAMETERS----- +MIIBHwKBgQDFJfsIPOIawMO5biw+AoYUhNVxReBOLQosU3Qv4B8krac0BNr3OjSG +Lh1wZxHqhlAE0QmasTaKojuk20nNWeFnczSz6vDl0IVJEhS8VYor5kt9gLqtGcoA +gsf4gRDIutJyQDaNn3IVY89uXUVIoexvQeLQDBCgQPC5O8rJdqBwtwIVAK2Jjt+d +qk07eQUE59koYUEKyNorAoGBAI4IEpusf8G14kCHmRtnHXM2tG5EWJDmW6Qtwjqv +Wp1GKUx5WFy1tVWR9nl5rL0Di+kNdENo+SkKj7h3uDulGOI6T0mQYbV2h1IK+FMO +GnOqvZ8eNTE2n4PGTo5puZ63LBm+QYrQsrNiUY4vakLFQ2rEK/SLwdsDFK4ZSJCB +Qw5z +-----END DSA PARAMETERS----- diff --git a/UnitTests/TestData/smime/smec1.pem b/UnitTests/TestData/smime/smec1.pem new file mode 100644 index 0000000000..75a862666b --- /dev/null +++ b/UnitTests/TestData/smime/smec1.pem @@ -0,0 +1,22 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgXzBRX9Z5Ib4LAVAS +DMlYvkj0SmLmYvWULe2LfyXRmpWhRANCAAS+SIj2FY2DouPRuNDp9WVpsqef58tV +3gIwV0EOV/xyYTzZhufZi/aBcXugWR1x758x4nHus2uEuEFi3Mr3K3+x +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICoDCCAYigAwIBAgIJANk5lu6mSyBGMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzFaFw0yMzA1MjYxNzI4MzFaMEQx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRU +ZXN0IFMvTUlNRSBFRSBFQyAjMTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL5I +iPYVjYOi49G40On1ZWmyp5/ny1XeAjBXQQ5X/HJhPNmG59mL9oFxe6BZHXHvnzHi +ce6za4S4QWLcyvcrf7GjYDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgXg +MB0GA1UdDgQWBBR/ybxC2DI+Jydhx1FMgPbMTmLzRzAfBgNVHSMEGDAWgBTJkVMK +Y3sWW4u9RPB2iKkk5uW2bDANBgkqhkiG9w0BAQUFAAOCAQEAdk9si83JjtgHHHGy +WcgWDfM0jzlWBsgFNQ9DwAuB7gJd/LG+5Ocajg5XdA5FXAdKkfwI6be3PdcVs3Bt +7f/fdKfBxfr9/SvFHnK7PVAX2x1wwS4HglX1lfoyq1boSvsiJOnAX3jsqXJ9TJiV +FlgRVnhnrw6zz3Xs/9ZDMTENUrqDHPNsDkKEi+9SqIsqDXpMCrGHP4ic+S8Rov1y +S+0XioMxVyXDp6XcL4PQ/NgHbw5/+UcS0me0atZ6pW68C0vi6xeU5vxojyuZxMI1 +DXXwMhOXWaKff7KNhXDUN0g58iWlnyaCz4XQwFsbbFs88TQ1+e/aj3bbwTxUeyN7 +qtcHJA== +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smec2.pem b/UnitTests/TestData/smime/smec2.pem new file mode 100644 index 0000000000..457297a760 --- /dev/null +++ b/UnitTests/TestData/smime/smec2.pem @@ -0,0 +1,23 @@ +-----BEGIN PRIVATE KEY----- +MIGPAgEAMBAGByqGSM49AgEGBSuBBAAQBHgwdgIBAQQjhHaq507MOBznelrLG/pl +brnnJi/iEJUUp+Pm3PEiteXqckmhTANKAAQF2zs6vobmoT+M+P2+9LZ7asvFBNi7 +uCzLYF/8j1Scn/spczoC9vNzVhNw+Lg7dnjNL4EDIyYZLl7E0v69luzbvy+q44/8 +6bQ= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICpTCCAY2gAwIBAgIJANk5lu6mSyBHMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzFaFw0yMzA1MjYxNzI4MzFaMEQx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRU +ZXN0IFMvTUlNRSBFRSBFQyAjMjBeMBAGByqGSM49AgEGBSuBBAAQA0oABAXbOzq+ +huahP4z4/b70tntqy8UE2Lu4LMtgX/yPVJyf+ylzOgL283NWE3D4uDt2eM0vgQMj +JhkuXsTS/r2W7Nu/L6rjj/zptKNgMF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8E +BAMCBeAwHQYDVR0OBBYEFGf+QSQlkN20PsNN7x+jmQIJBDcXMB8GA1UdIwQYMBaA +FMmRUwpjexZbi71E8HaIqSTm5bZsMA0GCSqGSIb3DQEBBQUAA4IBAQBaBBryl2Ez +ftBrGENXMKQP3bBEw4n9ely6HvYQi9IC7HyK0ktz7B2FcJ4z96q38JN3cLxV0DhK +xT/72pFmQwZVJngvRaol0k1B+bdmM03llxCw/uNNZejixDjHUI9gEfbigehd7QY0 +uYDu4k4O35/z/XPQ6O5Kzw+J2vdzU8GXlMBbWeZWAmEfLGbk3Ux0ouITnSz0ty5P +rkHTo0uprlFcZAsrsNY5v5iuomYT7ZXAR3sqGZL1zPOKBnyfXeNFUfnKsZW7Fnlq +IlYBQIjqR1HGxxgCSy66f1oplhxSch4PUpk5tqrs6LeOqc2+xROy1T5YrB3yjVs0 +4ZdCllHZkhop +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smec3.pem b/UnitTests/TestData/smime/smec3.pem new file mode 100644 index 0000000000..90eac867d0 --- /dev/null +++ b/UnitTests/TestData/smime/smec3.pem @@ -0,0 +1,22 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQga03Rl+2K38wgwVyJ +zSy+knGorGWZBGG5p//ke0WUSbqhRANCAARH8uHBHkuOfuyXgJj7V3lNqUEPiQNo +xG8ntGjVmKRHfywdUoQJ1PgfbkCEsBk334rRFmja1r+MYyqn/A9ARiGB +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICoDCCAYigAwIBAgIJAPaEOllWs/pjMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xNzA4MTAxNTQyMDhaFw0yNzA2MTkxNTQyMDhaMEQx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRU +ZXN0IFMvTUlNRSBFRSBFQyAjMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEfy +4cEeS45+7JeAmPtXeU2pQQ+JA2jEbye0aNWYpEd/LB1ShAnU+B9uQISwGTffitEW +aNrWv4xjKqf8D0BGIYGjYDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgXg +MB0GA1UdDgQWBBQLR+H9CmAY/KDyXWdVUM9FP766WzAfBgNVHSMEGDAWgBT3YQTy +KJTdSIrnOcPj3pm5oVNtazANBgkqhkiG9w0BAQsFAAOCAQEAmMRuf8Iz5fr9f0GA +HaNiOM5S7AIfZ6W7zzdeF63EF1j9HqP1DJsUW4y5b9azWmpp62kKuNaM4CGPUVvm +diLKJVlrDcc+6lW9oROpnBsskhjqFMTjTANPQSAKZeKiG2W3U8Q103VQpuYvE4Nj +OU9JT+5e4RZS7wxYk/IsvnyF/DkoF1FTMHo9/3Wiw4V4KRhpJIPnqojWNcfipmhM +UDpbw0Oyj5fE7x6wvaoOUr8GNJE5NudtV/5QDh9REkjyKUdVYsuUrWwKqn3NT8EI +OLl8wx3RqA8htRg/W+SoESx87rvW1saPGvfypBp4cl18B1IzTlC+FMbHFJvZqQn8 +Ci1l4Q== +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smroot.pem b/UnitTests/TestData/smime/smroot.pem new file mode 100644 index 0000000000..d1a253f409 --- /dev/null +++ b/UnitTests/TestData/smime/smroot.pem @@ -0,0 +1,49 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCyyQXED5HyVWwq +nXyzmY317yMUJrIfsKvREG2C691dJNHgNg+oq5sjt/fzkyS84AvdOiicAsao4cYL +DulthaLpbC7msEBhvwAil0FNb5g3ERupe1KuTdUV1UuD/i6S2VoaNXUBBn1rD9Wc +BBc0lnx/4Wt92eQTI6925pt7ZHPQw2Olp7TQDElyi5qPxCem4uT0g3zbZsWqmmsI +MXbu+K3dEprzqA1ucKXbxUmZNkMwVs2XCmlLxrRUj8C3/zENtH17HWCznhR/IVcV +kgIuklkeiDsEhbWvUQumVXR7oPh/CPZAbjGqq5mVueHSHrp7brBVZKHZvoUka28Q +LWitq1W5AgMBAAECggEASkRnOMKfBeOmQy2Yl6K57eeg0sYgSDnDpd0FINWJ5x9c +b58FcjOXBodtYKlHIY6QXx3BsM0WaSEge4d+QBi7S+u8r+eXVwNYswXSArDQsk9R +Bl5MQkvisGciL3pvLmFLpIeASyS/BLJXMbAhU58PqK+jT2wr6idwxBuXivJ3ichu +ISdT1s2aMmnD86ulCD2DruZ4g0mmk5ffV+Cdj+WWkyvEaJW2GRYov2qdaqwSOxV4 +Yve9qStvEIWAf2cISQjbnw2Ww6Z5ebrqlOz9etkmwIly6DTbrIneBnoqJlFFWGlF +ghuzc5RE2w1GbcKSOt0qXH44MTf/j0r86dlu7UIxgQKBgQDq0pEaiZuXHi9OQAOp +PsDEIznCU1bcTDJewANHag5DPEnMKLltTNyLaBRulMypI+CrDbou0nDr29VOzfXx +mNvi/c7RttOBOx7kXKvu0JUFKe2oIWRsg0KsyMX7UFMVaHFgrW+8DhQc7HK7URiw +nitOnA7YwIHRF9BMmcWcLFEYBQKBgQDC6LPbXV8COKO0YCfGXPnE7EZGD/p0Q92Z +8CoSefphEScSdO1IpxFXG7fOZ4x2GQb9q7D3IvaeKAqNjUjkuyxdB30lIWDBwSWw +fFgsa2SZwD5P60G/ar50YJr6LiF333aUMDVmC9swFfZERAEmGUz2NTrPWQdIx/lu +PyDtUR75JQKBgHaoCCJ8vl5SJl1IA5GV4Bo8IoeLTSzsY9d09zMy6BoZcMD1Ix2T +5S2cXhayoegl9PT6bsYSGHVWFCdJ86ktMI826TcXRzDaCvYhzc9THroJQcnfdbtP +aHWezkv7fsAmkoPjn75K7ubeo+r7Q5qbkg6a1PW58N8TRXIvkackzaVxAoGBALAq +qh3U+AHG9dgbrPeyo6KkuCOtX39ks8/mbfCDRZYkbb9V5f5r2tVz3R93IlK/7jyr +yWimtmde46Lrl33922w+T5OW5qBZllo9GWkUrDn3s5qClcuQjJIdmxYTSfbSCJiK +NkmE39lHkG5FVRB9f71tgTlWS6ox7TYDYxx83NTtAoGAUJPAkGt4yGAN4Pdebv53 +bSEpAAULBHntiqDEOu3lVColHuZIucml/gbTpQDruE4ww4wE7dOhY8Q4wEBVYbRI +vHkSiWpJUvZCuKG8Foh5pm9hU0qb+rbQV7NhLJ02qn1AMGO3F/WKrHPPY8/b9YhQ +KfvPCYimQwBjVrEnSntLPR0= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDbjCCAlagAwIBAgIJAMc+8VKBJ/S9MA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MjlaFw0yMzA3MTUxNzI4MjlaMEQx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRU +ZXN0IFMvTUlNRSBSU0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALLJBcQPkfJVbCqdfLOZjfXvIxQmsh+wq9EQbYLr3V0k0eA2D6irmyO39/OT +JLzgC906KJwCxqjhxgsO6W2FoulsLuawQGG/ACKXQU1vmDcRG6l7Uq5N1RXVS4P+ +LpLZWho1dQEGfWsP1ZwEFzSWfH/ha33Z5BMjr3bmm3tkc9DDY6WntNAMSXKLmo/E +J6bi5PSDfNtmxaqaawgxdu74rd0SmvOoDW5wpdvFSZk2QzBWzZcKaUvGtFSPwLf/ +MQ20fXsdYLOeFH8hVxWSAi6SWR6IOwSFta9RC6ZVdHug+H8I9kBuMaqrmZW54dIe +untusFVkodm+hSRrbxAtaK2rVbkCAwEAAaNjMGEwHQYDVR0OBBYEFMmRUwpjexZb +i71E8HaIqSTm5bZsMB8GA1UdIwQYMBaAFMmRUwpjexZbi71E8HaIqSTm5bZsMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IB +AQAwpIVWQey2u/XoQSMSu0jd0EZvU+lhLaFrDy/AHQeG3yX1+SAOM6f6w+efPvyb +Op1NPI9UkMPb4PCg9YC7jgYokBkvAcI7J4FcuDKMVhyCD3cljp0ouuKruvEf4FBl +zyQ9pLqA97TuG8g1hLTl8G90NzTRcmKpmhs18BmCxiqHcTfoIpb3QvPkDX8R7LVt +9BUGgPY+8ELCgw868TuHh/Cnc67gBtRjBp0sCYVzGZmKsO5f1XdHrAZKYN5mEp0C +7/OqcDoFqORTquLeycg1At/9GqhDEgxNrqA+YEsPbLGAfsNuXUsXs2ubpGsOZxKt +Emsny2ah6fU2z7PztrUy/A80 +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smrsa1.pem b/UnitTests/TestData/smime/smrsa1.pem new file mode 100644 index 0000000000..d0d0b9e66b --- /dev/null +++ b/UnitTests/TestData/smime/smrsa1.pem @@ -0,0 +1,49 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDXr9uzB/20QXKC +xhkfNnJvl2xl1hzdOcrQmAqo+AAAcA/D49ImuJDVQRaK2bcj54XB26i1kXuOrxID +3/etUb8yudfx8OAVwh8G0xVA4zhr8uXW85W2tBr4v0Lt+W6lSd6Hmfrk4GmE9LTU +/vzl9HUPW6SZShN1G0nY6oeUXvLi0vasEUKv3a51T6JFYg4c7qt5RCk/w8kwrQ0D +orQwCdkOPEIiC4b+nPStF12SVm5bx8rbYzioxuY/PdSebvt0APeqgRxSpCxqYnHs +CoNeHzSrGXcP0COzFeUOz2tdrhmH09JLbGZs4nbojPxMkjpJSv3/ekDG2CHYxXSH +XxpJstxZAgMBAAECggEASY4xsJaTEPwY3zxLqPdag2/yibBBW7ivz/9p80HQTlXp +KnbxXj8nNXLjCytAZ8A3P2t316PrrTdLP4ML5lGwkM4MNPhek00GY79syhozTa0i +cPHVJt+5Kwee/aVI9JmCiGAczh0yHyOM3+6ttIZvvXMVaSl4BUHvJ0ikQBc5YdzL +s6VM2gCOR6K6n+39QHDI/T7WwO9FFSNnpWFOCHwAWtyBMlleVj+xeZX8OZ/aT+35 +27yjsGNBftWKku29VDineiQC+o+fZGJs6w4JZHoBSP8TfxP8fRCFVNA281G78Xak +cEnKXwZ54bpoSa3ThKl+56J6NHkkfRGb8Rgt/ipJYQKBgQD5DKb82mLw85iReqsT +8bkp408nPOBGz7KYnQsZqAVNGfehM02+dcN5z+w0jOj6GMPLPg5whlEo/O+rt9ze +j6c2+8/+B4Bt5oqCKoOCIndH68jl65+oUxFkcHYxa3zYKGC9Uvb+x2BtBmYgvDRG +ew6I2Q3Zyd2ThZhJygUZpsjsbQKBgQDdtNiGTkgWOm+WuqBI1LT5cQfoPfgI7/da +ZA+37NBUQRe0cM7ddEcNqx7E3uUa1JJOoOYv65VyGI33Ul+evI8h5WE5bupcCEFk +LolzbMc4YQUlsySY9eUXM8jQtfVtaWhuQaABt97l+9oADkrhA+YNdEu2yiz3T6W+ +msI5AnvkHQKBgDEjuPMdF/aY6dqSjJzjzfgg3KZOUaZHJuML4XvPdjRPUlfhKo7Q +55/qUZ3Qy8tFBaTderXjGrJurc+A+LiFOaYUq2ZhDosguOWUA9yydjyfnkUXZ6or +sbvSoM+BeOGhnezdKNT+e90nLRF6cQoTD7war6vwM6L+8hxlGvqDuRNFAoGAD4K8 +d0D4yB1Uez4ZQp8m/iCLRhM3zCBFtNw1QU/fD1Xye5w8zL96zRkAsRNLAgKHLdsR +355iuTXAkOIBcJCOjveGQsdgvAmT0Zdz5FBi663V91o+IDlryqDD1t40CnCKbtRG +hng/ruVczg4x7OYh7SUKuwIP/UlkNh6LogNreX0CgYBQF9troLex6X94VTi1V5hu +iCwzDT6AJj63cS3VRO2ait3ZiLdpKdSNNW2WrlZs8FZr/mVutGEcWho8BugGMWST +1iZkYwly9Xfjnpd0I00ZIlr2/B3+ZsK8w5cOW5Lpb7frol6+BkDnBjbNZI5kQndn +zQpuMJliRlrq/5JkIbH6SA== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDbDCCAlSgAwIBAgIJANk5lu6mSyBAMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzBaFw0yMzA1MjYxNzI4MzBaMEUx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR4wHAYDVQQDDBVU +ZXN0IFMvTUlNRSBFRSBSU0EgIzEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDXr9uzB/20QXKCxhkfNnJvl2xl1hzdOcrQmAqo+AAAcA/D49ImuJDVQRaK +2bcj54XB26i1kXuOrxID3/etUb8yudfx8OAVwh8G0xVA4zhr8uXW85W2tBr4v0Lt ++W6lSd6Hmfrk4GmE9LTU/vzl9HUPW6SZShN1G0nY6oeUXvLi0vasEUKv3a51T6JF +Yg4c7qt5RCk/w8kwrQ0DorQwCdkOPEIiC4b+nPStF12SVm5bx8rbYzioxuY/PdSe +bvt0APeqgRxSpCxqYnHsCoNeHzSrGXcP0COzFeUOz2tdrhmH09JLbGZs4nbojPxM +kjpJSv3/ekDG2CHYxXSHXxpJstxZAgMBAAGjYDBeMAwGA1UdEwEB/wQCMAAwDgYD +VR0PAQH/BAQDAgXgMB0GA1UdDgQWBBTmjc+lrTQuYx/VBOBGjMvufajvhDAfBgNV +HSMEGDAWgBTJkVMKY3sWW4u9RPB2iKkk5uW2bDANBgkqhkiG9w0BAQUFAAOCAQEA +dr2IRXcFtlF16kKWs1VTaFIHHNQrfSVHBkhKblPX3f/0s/i3eXgwKUu7Hnb6T3/o +E8L+e4ioQNhahTLt9ruJNHWA/QDwOfkqM3tshCs2xOD1Cpy7Bd3Dn0YBrHKyNXRK +WelGp+HetSXJGW4IZJP7iES7Um0DGktLabhZbe25EnthRDBjNnaAmcofHECWESZp +lEHczGZfS9tRbzOCofxvgLbF64H7wYSyjAe6R8aain0VRbIusiD4tCHX/lOMh9xT +GNBW8zTL+tV9H1unjPMORLnT0YQ3oAyEND0jCu0ACA1qGl+rzxhF6bQcTUNEbRMu +9Hjq6s316fk4Ne0EUF3PbA== +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smrsa2.pem b/UnitTests/TestData/smime/smrsa2.pem new file mode 100644 index 0000000000..2f17cb2978 --- /dev/null +++ b/UnitTests/TestData/smime/smrsa2.pem @@ -0,0 +1,49 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDcYC4tS2Uvn1Z2 +iDgtfkJA5tAqgbN6X4yK02RtVH5xekV9+6+eTt/9S+iFAzAnwqR/UB1R67ETrsWq +V8u9xLg5fHIwIkmu9/6P31UU9cghO7J1lcrhHvooHaFpcXepPWQacpuBq2VvcKRD +lDfVmdM5z6eS3dSZPTOMMP/xk4nhZB8mcw27qiccPieS0PZ9EZB63T1gmwaK1Rd5 +U94Pl0+zpDqhViuXmBfiIDWjjz0BzHnHSz5Rg4S3oXF1NcojhptIWyI0r7dgn5J3 +NxC4kgKdjzysxo6iWd0nLgz7h0jUdj79EOis4fg9G4f0EFWyQf7iDxGaA93Y9ePB +Jv5iFZVZAgMBAAECggEBAILIPX856EHb0KclbhlpfY4grFcdg9LS04grrcTISQW1 +J3p9nBpZ+snKe6I8Yx6lf5PiipPsSLlCliHiWpIzJZVQCkAQiSPiHttpEYgP2IYI +dH8dtznkdVbLRthZs0bnnPmpHCpW+iqpcYJ9eqkz0cvUNUGOjjWmwWmoRqwp/8CW +3S1qbkQiCh0Mk2fQeGar76R06kXQ9MKDEj14zyS3rJX+cokjEoMSlH8Sbmdh2mJz +XlNZcvqmeGJZwQWgbVVHOMUuZaKJiFa+lqvOdppbqSx0AsCRq6vjmjEYQEoOefYK +3IJM9IvqW5UNx0Cy4kQdjhZFFwMO/ALD3QyF21iP4gECgYEA+isQiaWdaY4UYxwK +Dg+pnSCKD7UGZUaCUIv9ds3CbntMOONFe0FxPsgcc4jRYQYj1rpQiFB8F11+qXGa +P/IHcnjr2+mTrNY4I9Bt1Lg+pHSS8QCgzeueFybYMLaSsXUo7tGwpvw6UUb6/YWI +LNCzZbrCLg1KZjGODhhxtvN45ZkCgYEA4YNSe+GMZlxgsvxbLs86WOm6DzJUPvxN +bWmni0+Oe0cbevgGEUjDVc895uMFnpvlgO49/C0AYJ+VVbStjIMgAeMnWj6OZoSX +q49rI8KmKUxKgORZiiaMqGWQ7Rxv68+4S8WANsjFxoUrE6dNV3uYDIUsiSLbZeI8 +38KVTcLohcECgYEAiOdyWHGq0G4xl/9rPUCzCMsa4velNV09yYiiwBZgVgfhsawm +hQpOSBZJA60XMGqkyEkT81VgY4UF4QLLcD0qeCnWoXWVHFvrQyY4RNZDacpl87/t +QGO2E2NtolL3umesa+2TJ/8Whw46Iu2llSjtVDm9NGiPk5eA7xPPf1iEi9kCgYAb +0EmVE91wJoaarLtGS7LDkpgrFacEWbPnAbfzW62UENIX2Y1OBm5pH/Vfi7J+vHWS +8E9e0eIRCL2vY2hgQy/oa67H151SkZnvQ/IP6Ar8Xvd1bDSK8HQ6tMQqKm63Y9g0 +KDjHCP4znOsSMnk8h/bZ3HcAtvbeWwftBR/LBnYNQQKBgA1leIXLLHRoX0VtS/7e +y7Xmn7gepj+gDbSuCs5wGtgw0RB/1z/S3QoS2TCbZzKPBo20+ivoRP7gcuFhduFR +hT8V87esr/QzLVpjLedQDW8Xb7GiO3BsU/gVC9VcngenbL7JObl3NgvdreIYo6+n +yrLyf+8hjm6H6zkjqiOkHAl+ +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDbDCCAlSgAwIBAgIJANk5lu6mSyBBMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzBaFw0yMzA1MjYxNzI4MzBaMEUx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR4wHAYDVQQDDBVU +ZXN0IFMvTUlNRSBFRSBSU0EgIzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDcYC4tS2Uvn1Z2iDgtfkJA5tAqgbN6X4yK02RtVH5xekV9+6+eTt/9S+iF +AzAnwqR/UB1R67ETrsWqV8u9xLg5fHIwIkmu9/6P31UU9cghO7J1lcrhHvooHaFp +cXepPWQacpuBq2VvcKRDlDfVmdM5z6eS3dSZPTOMMP/xk4nhZB8mcw27qiccPieS +0PZ9EZB63T1gmwaK1Rd5U94Pl0+zpDqhViuXmBfiIDWjjz0BzHnHSz5Rg4S3oXF1 +NcojhptIWyI0r7dgn5J3NxC4kgKdjzysxo6iWd0nLgz7h0jUdj79EOis4fg9G4f0 +EFWyQf7iDxGaA93Y9ePBJv5iFZVZAgMBAAGjYDBeMAwGA1UdEwEB/wQCMAAwDgYD +VR0PAQH/BAQDAgXgMB0GA1UdDgQWBBT0arpyYMHXDPVL7MvzE+lx71L7sjAfBgNV +HSMEGDAWgBTJkVMKY3sWW4u9RPB2iKkk5uW2bDANBgkqhkiG9w0BAQUFAAOCAQEA +I8nM42am3aImkZyrw8iGkaGhKyi/dfajSWx6B9izBUh+3FleBnUxxOA+mn7M8C47 +Ne18iaaWK8vEux9KYTIY8BzXQZL1AuZ896cXEc6bGKsME37JSsocfuB5BIGWlYLv +/ON5/SJ0iVFj4fAp8z7Vn5qxRJj9BhZDxaO1Raa6cz6pm0imJy9v8y01TI6HsK8c +XJQLs7/U4Qb91K+IDNX/lgW3hzWjifNpIpT5JyY3DUgbkD595LFV5DDMZd0UOqcv +6cyN42zkX8a0TWr3i5wu7pw4k1oD19RbUyljyleEp0DBauIct4GARdBGgi5y1H2i +NzYzLAPBkHCMY0Is3KKIBw== +-----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smrsa3.pem b/UnitTests/TestData/smime/smrsa3.pem new file mode 100644 index 0000000000..14c27f64aa --- /dev/null +++ b/UnitTests/TestData/smime/smrsa3.pem @@ -0,0 +1,49 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyK+BTAOJKJjji +OhY60NeZjzGGZxEBfCm62n0mwkzusW/V/e63uwj6uOVCFoVBz5doMf3M6QIS2jL3 +Aw6Qs5+vcuLA0gHrqIwjYQz1UZ5ETLKLKbQw6YOIVfsFSTxytUVpfcByrubWiLKX +63theG1/IVokDK/9/k52Kyt+wcCjuRb7AJQFj2OLDRuWm/gavozkK103gQ+dUq4H +XamZMtTq1EhQOfc0IUeCOEL6xz4jzlHHfzLdkvb7Enhav2sXDfOmZp/DYf9IqS7l +vFkkINPVbYFBTexaPZlFwmpGRjkmoyH/w+Jlcpzs+w6p1diWRpaSn62bbkRN49j6 +L2dVb+DfAgMBAAECggEAciwDl6zdVT6g/PbT/+SMA+7qgYHSN+1koEQaJpgjzGEP +lUUfj8TewCtzXaIoyj9IepBuXryBg6snNXpT/w3bqgYon/7zFBvxkUpDj4A5tvKf +BuY2fZFlpBvUu1Ju1eKrFCptBBBoA9mc+BUB/ze4ktrAdJFcxZoMlVScjqGB3GdR +OHw2x9BdWGCJBhiu9VHhAAb/LVWi6xgDumYSWZwN2yovg+7J91t5bsENeBRHycK+ +i5dNFh1umIK9N0SH6bpHPnLHrCRchrQ6ZRRxL4ZBKA9jFRDeI7OOsJuCvhGyJ1se +snsLjr/Ahg00aiHCcC1SPQ6pmXAVBCG7hf4AX82V4QKBgQDaFDE+Fcpv84mFo4s9 +wn4CZ8ymoNIaf5zPl/gpH7MGots4NT5+Ns+6zzJQ6TEpDjTPx+vDaabP7QGXwVZn +8NAHYvCQK37b+u9HrOt256YYRDOmnJFSbsJdmqzMEzpTNmQ8GuI37cZCS9CmSMv+ +ab/plcwuv0cJRSC83NN2AFyu1QKBgQDRJzKIBQlpprF9rA0D5ZjLVW4OH18A0Mmm +oanw7qVutBaM4taFN4M851WnNIROyYIlkk2fNgW57Y4M8LER4zLrjU5HY4lB0BMX +LQWDbyz4Y7L4lVnnEKfQxWFt9avNZwiCxCxEKy/n/icmVCzc91j9uwKcupdzrN6E +yzPd1s5y4wKBgQCkJvzmAdsOp9/Fg1RFWcgmIWHvrzBXl+U+ceLveZf1j9K5nYJ7 +2OBGer4iH1XM1I+2M4No5XcWHg3L4FEdDixY0wXHT6Y/CcThS+015Kqmq3fBmyrc +RNjzQoF9X5/QkSmkAIx1kvpgXtcgw70htRIrToGSUpKzDKDW6NYXhbA+PQKBgDJK +KH5IJ8E9kYPUMLT1Kc4KVpISvPcnPLVSPdhuqVx69MkfadFSTb4BKbkwiXegQCjk +isFzbeEM25EE9q6EYKP+sAm+RyyJ6W0zKBY4TynSXyAiWSGUAaXTL+AOqCaVVZiL +rtEdSUGQ/LzclIT0/HLV2oTw4KWxtTdc3LXEhpNdAoGBAM3LckiHENqtoeK2gVNw +IPeEuruEqoN4n+XltbEEv6Ymhxrs6T6HSKsEsLhqsUiIvIzH43KMm45SNYTn5eZh +yzYMXLmervN7c1jJe2Y2MYv6hE+Ypj1xGW4w7s8WNKmVzLv97beisD9AZrS7sXfF +RvOAi5wVkYylDxV4238MAZIq +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDbDCCAlSgAwIBAgIJANk5lu6mSyBCMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV +BAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR0wGwYDVQQDDBRUZXN0IFMv +TUlNRSBSU0EgUm9vdDAeFw0xMzA3MTcxNzI4MzBaFw0yMzA1MjYxNzI4MzBaMEUx +CzAJBgNVBAYTAlVLMRYwFAYDVQQKDA1PcGVuU1NMIEdyb3VwMR4wHAYDVQQDDBVU +ZXN0IFMvTUlNRSBFRSBSU0EgIzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCyK+BTAOJKJjjiOhY60NeZjzGGZxEBfCm62n0mwkzusW/V/e63uwj6uOVC +FoVBz5doMf3M6QIS2jL3Aw6Qs5+vcuLA0gHrqIwjYQz1UZ5ETLKLKbQw6YOIVfsF +STxytUVpfcByrubWiLKX63theG1/IVokDK/9/k52Kyt+wcCjuRb7AJQFj2OLDRuW +m/gavozkK103gQ+dUq4HXamZMtTq1EhQOfc0IUeCOEL6xz4jzlHHfzLdkvb7Enha +v2sXDfOmZp/DYf9IqS7lvFkkINPVbYFBTexaPZlFwmpGRjkmoyH/w+Jlcpzs+w6p +1diWRpaSn62bbkRN49j6L2dVb+DfAgMBAAGjYDBeMAwGA1UdEwEB/wQCMAAwDgYD +VR0PAQH/BAQDAgXgMB0GA1UdDgQWBBQ6CkW5sa6HrBsWvuPOvMjyL5AnsDAfBgNV +HSMEGDAWgBTJkVMKY3sWW4u9RPB2iKkk5uW2bDANBgkqhkiG9w0BAQUFAAOCAQEA +JhcrD7AKafVzlncA3cZ6epAruj1xwcfiE+EbuAaeWEGjoSltmevcjgoIxvijRVcp +sCbNmHJZ/siQlqzWjjf3yoERvLDqngJZZpQeocMIbLRQf4wgLAuiBcvT52wTE+sa +VexeETDy5J1OW3wE4A3rkdBp6hLaymlijFNnd5z/bP6w3AcIMWm45yPm0skM8RVr +O3UstEFYD/iy+p+Y/YZDoxYQSW5Vl+NkpGmc5bzet8gQz4JeXtH3z5zUGoDM4XK7 +tXP3yUi2eecCbyjh/wgaQiVdylr1Kv3mxXcTl+cFO22asDkh0R/y72nTCu5fSILY +CscFo2Z2pYROGtZDmYqhRw== +-----END CERTIFICATE----- diff --git a/UnitTests/Text/HtmlAttributeTests.cs b/UnitTests/Text/HtmlAttributeTests.cs index b714e10846..f4cabea99e 100644 --- a/UnitTests/Text/HtmlAttributeTests.cs +++ b/UnitTests/Text/HtmlAttributeTests.cs @@ -1,9 +1,9 @@ -// +// // HtmlAttributeTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlEntityDecoderTests.cs b/UnitTests/Text/HtmlEntityDecoderTests.cs index 11c64b5b10..4fab0a157b 100644 --- a/UnitTests/Text/HtmlEntityDecoderTests.cs +++ b/UnitTests/Text/HtmlEntityDecoderTests.cs @@ -1,9 +1,9 @@ -// +// // HtmlEntityDecoderTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index cf6388ad15..8915f03cb4 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenTests.cs b/UnitTests/Text/HtmlTokenTests.cs index 5db3a5f592..23559d2b10 100644 --- a/UnitTests/Text/HtmlTokenTests.cs +++ b/UnitTests/Text/HtmlTokenTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenizerTests.cs b/UnitTests/Text/HtmlTokenizerTests.cs index f21a01cbeb..319c8ef99a 100644 --- a/UnitTests/Text/HtmlTokenizerTests.cs +++ b/UnitTests/Text/HtmlTokenizerTests.cs @@ -1,9 +1,9 @@ -// +// // HtmlTokenizerTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlUtilsTests.cs b/UnitTests/Text/HtmlUtilsTests.cs index aeb1c5af5e..1006d1bc6c 100644 --- a/UnitTests/Text/HtmlUtilsTests.cs +++ b/UnitTests/Text/HtmlUtilsTests.cs @@ -1,9 +1,9 @@ -// +// // HtmlUtilsTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlWriterTests.cs b/UnitTests/Text/HtmlWriterTests.cs index 523a4835b8..55651e56a8 100644 --- a/UnitTests/Text/HtmlWriterTests.cs +++ b/UnitTests/Text/HtmlWriterTests.cs @@ -1,9 +1,9 @@ -// +// // HtmlWriterTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/RtfCompressedToRtfTests.cs b/UnitTests/Text/RtfCompressedToRtfTests.cs index 478a6a36b1..45b9168e70 100644 --- a/UnitTests/Text/RtfCompressedToRtfTests.cs +++ b/UnitTests/Text/RtfCompressedToRtfTests.cs @@ -1,9 +1,9 @@ -// +// // RtfCompressedToRtfTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index b5aec502e4..e87298499b 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -1,9 +1,9 @@ -// +// // TextConverterTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index 4f3fe50407..51b0b8a8b5 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TrieTests.cs b/UnitTests/Text/TrieTests.cs index 030457f6e1..80828a6725 100644 --- a/UnitTests/Text/TrieTests.cs +++ b/UnitTests/Text/TrieTests.cs @@ -1,9 +1,9 @@ -// +// // TrieTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/UrlScannerTests.cs b/UnitTests/Text/UrlScannerTests.cs index b5ea6ff8e5..a4715c199b 100644 --- a/UnitTests/Text/UrlScannerTests.cs +++ b/UnitTests/Text/UrlScannerTests.cs @@ -1,9 +1,9 @@ -// +// // UrlScannerTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index 0c062999ff..f23a0d2a83 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -1,9 +1,9 @@ -// +// // TextPartTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Jeffrey Stedfast +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/RtfCompressedToRtfTests.cs b/UnitTests/Tnef/RtfCompressedToRtfTests.cs index e0095e2b54..55cdd93e2d 100644 --- a/UnitTests/Tnef/RtfCompressedToRtfTests.cs +++ b/UnitTests/Tnef/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderStreamTests.cs b/UnitTests/Tnef/TnefReaderStreamTests.cs index 234680e894..16f9056244 100644 --- a/UnitTests/Tnef/TnefReaderStreamTests.cs +++ b/UnitTests/Tnef/TnefReaderStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderTests.cs b/UnitTests/Tnef/TnefReaderTests.cs index 7ff5577d9d..03100b046d 100644 --- a/UnitTests/Tnef/TnefReaderTests.cs +++ b/UnitTests/Tnef/TnefReaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 615754ad08..fcbc47f006 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -1,9 +1,9 @@ -// +// // TnefTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index bd054ce268..a1d5f44f96 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -82,6 +82,7 @@ + @@ -228,10 +229,22 @@ + + + + + + + + + + + + diff --git a/UnitTests/Utils/CharsetUtilsTests.cs b/UnitTests/Utils/CharsetUtilsTests.cs index f96df78bcc..e4cdca6e29 100644 --- a/UnitTests/Utils/CharsetUtilsTests.cs +++ b/UnitTests/Utils/CharsetUtilsTests.cs @@ -1,9 +1,9 @@ -// +// // CharsetUtilsTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/DateParserTests.cs b/UnitTests/Utils/DateParserTests.cs index a558a2bd21..9c3ec48abf 100644 --- a/UnitTests/Utils/DateParserTests.cs +++ b/UnitTests/Utils/DateParserTests.cs @@ -1,9 +1,9 @@ -// +// // DateParserTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index 2aeede9e6f..344dd1a604 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -1,9 +1,9 @@ -// +// // MimeUtilsTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index c91ef5b41b..9d3af647f6 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -1,9 +1,9 @@ -// +// // ParseUtilsTests.cs // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/Rfc2047Tests.cs b/UnitTests/Utils/Rfc2047Tests.cs index 345bfdb759..50c36ee421 100644 --- a/UnitTests/Utils/Rfc2047Tests.cs +++ b/UnitTests/Utils/Rfc2047Tests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2017 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From 7ea39aecd23b2545a7b787647ec0786f1948ac1c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 12:41:13 -0500 Subject: [PATCH 212/741] Moved GetPublicKeyAlgorithm logic out of WindowsSecureMimeDigitalCertificate --- MimeKit/Cryptography/OpenPgpContext.cs | 2 +- .../WindowsSecureMimeDigitalCertificate.cs | 17 +---------- .../X509Certificate2Extensions.cs | 29 +++++++++++++++++++ .../SecureMimeDigitalCertificateTests.cs | 10 ++----- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index de8e259f40..23fb7dd9ed 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -1462,11 +1462,11 @@ public static PublicKeyAlgorithm GetPublicKeyAlgorithm (PublicKeyAlgorithmTag al case PublicKeyAlgorithmTag.RsaGeneral: return PublicKeyAlgorithm.RsaGeneral; case PublicKeyAlgorithmTag.RsaEncrypt: return PublicKeyAlgorithm.RsaEncrypt; case PublicKeyAlgorithmTag.RsaSign: return PublicKeyAlgorithm.RsaSign; + case PublicKeyAlgorithmTag.ElGamalGeneral: return PublicKeyAlgorithm.ElGamalGeneral; case PublicKeyAlgorithmTag.ElGamalEncrypt: return PublicKeyAlgorithm.ElGamalEncrypt; case PublicKeyAlgorithmTag.Dsa: return PublicKeyAlgorithm.Dsa; case PublicKeyAlgorithmTag.ECDH: return PublicKeyAlgorithm.EllipticCurve; case PublicKeyAlgorithmTag.ECDsa: return PublicKeyAlgorithm.EllipticCurveDsa; - case PublicKeyAlgorithmTag.ElGamalGeneral: return PublicKeyAlgorithm.ElGamalGeneral; case PublicKeyAlgorithmTag.DiffieHellman: return PublicKeyAlgorithm.DiffieHellman; default: throw new ArgumentOutOfRangeException (nameof (algorithm)); } diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs index 406d330532..271786e2c6 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs @@ -53,22 +53,7 @@ public WindowsSecureMimeDigitalCertificate (X509Certificate2 certificate) throw new ArgumentNullException (nameof (certificate)); Certificate = certificate; - - try { - var algorithm = certificate.PublicKey.Key; - - if (algorithm is DSA) - PublicKeyAlgorithm = PublicKeyAlgorithm.Dsa; - else if (algorithm is RSA) - PublicKeyAlgorithm = PublicKeyAlgorithm.RsaGeneral; - else if (algorithm is ECDiffieHellman) - PublicKeyAlgorithm = PublicKeyAlgorithm.DiffieHellman; - else if (algorithm is ECDsa) - PublicKeyAlgorithm = PublicKeyAlgorithm.EllipticCurveDsa; - } catch (CryptographicException) { - var x509 = certificate.AsBouncyCastleCertificate (); - PublicKeyAlgorithm = x509.GetPublicKeyAlgorithm (); - } + PublicKeyAlgorithm = certificate.GetPublicKeyAlgorithm (); } /// diff --git a/MimeKit/Cryptography/X509Certificate2Extensions.cs b/MimeKit/Cryptography/X509Certificate2Extensions.cs index 4107178568..b22c96abbb 100644 --- a/MimeKit/Cryptography/X509Certificate2Extensions.cs +++ b/MimeKit/Cryptography/X509Certificate2Extensions.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Security.Cryptography; using Org.BouncyCastle.X509; using Org.BouncyCastle.Asn1; @@ -65,6 +66,34 @@ public static X509Certificate AsBouncyCastleCertificate (this X509Certificate2 c return new X509CertificateParser ().ReadCertificate (rawData); } + /// + /// Gets the public key algorithm for the certificate. + /// + /// + /// Gets the public key algorithm for the ceretificate. + /// + /// The public key algorithm. + /// The certificate. + /// + /// is null. + /// + public static PublicKeyAlgorithm GetPublicKeyAlgorithm (this X509Certificate2 certificate) + { + if (certificate == null) + throw new ArgumentNullException (nameof (certificate)); + + var identifier = certificate.GetKeyAlgorithm (); + var oid = new Oid (identifier); + + switch (oid.FriendlyName) { + case "DSA": return PublicKeyAlgorithm.Dsa; + case "RSA": return PublicKeyAlgorithm.RsaGeneral; + case "ECC": return PublicKeyAlgorithm.EllipticCurve; + case "DH": return PublicKeyAlgorithm.DiffieHellman; + default: return PublicKeyAlgorithm.None; + } + } + static EncryptionAlgorithm[] DecodeEncryptionAlgorithms (byte[] rawData) { using (var memory = new MemoryStream (rawData, false)) { diff --git a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs index 1dc3b9fc0a..83a75a520f 100644 --- a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs +++ b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs @@ -26,21 +26,15 @@ using System; using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; -using NUnit.Framework; +using Org.BouncyCastle.OpenSsl; -using Org.BouncyCastle.X509; +using NUnit.Framework; -using MimeKit; using MimeKit.Cryptography; using X509Certificate = Org.BouncyCastle.X509.X509Certificate; -using Org.BouncyCastle.OpenSsl; namespace UnitTests.Cryptography { [TestFixture] From f6c1553bd0a25835007a34953c1556c717df4180 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 16:42:16 -0500 Subject: [PATCH 213/741] Added more unit tests for DefaultSecureMimeContext and SqliteCertificateDatabase --- .../Cryptography/CertificateExtensionTests.cs | 2 + .../DefaultSecureMimeContextTests.cs | 71 +++++++++++++++++-- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs index 50ea067ecb..736b293a67 100644 --- a/UnitTests/Cryptography/CertificateExtensionTests.cs +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -55,9 +55,11 @@ public void TestArgumentExceptions () Assert.Throws (() => BouncyCastleCertificateExtensions.GetFingerprint (null)); Assert.Throws (() => BouncyCastleCertificateExtensions.GetKeyUsageFlags ((X509Certificate) null)); Assert.Throws (() => BouncyCastleCertificateExtensions.GetEncryptionAlgorithms (null)); + Assert.Throws (() => BouncyCastleCertificateExtensions.GetPublicKeyAlgorithm (null)); Assert.Throws (() => X509Certificate2Extensions.AsBouncyCastleCertificate (null)); Assert.Throws (() => X509Certificate2Extensions.GetEncryptionAlgorithms (null)); + Assert.Throws (() => X509Certificate2Extensions.GetPublicKeyAlgorithm (null)); } X509KeyUsageFlags GetX509Certificate2KeyUsageFlags (X509Certificate2 certificate) diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index fdca6328a7..a6c443cdc0 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -26,13 +26,13 @@ using System; using System.IO; -using System.Linq; +using System.Data.Common; using System.Collections.Generic; -using System.Security.Cryptography.X509Certificates; - -using NUnit.Framework; using Org.BouncyCastle.X509; +using Org.BouncyCastle.Asn1.X509; + +using NUnit.Framework; using MimeKit; using MimeKit.Cryptography; @@ -43,6 +43,16 @@ namespace UnitTests.Cryptography { [TestFixture] public class DefaultSecureMimeContextTests { + static readonly string[] CertificateAuthorities = { + "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + }; + + static DefaultSecureMimeContextTests () + { + if (File.Exists ("smime.db")) + File.Delete ("smime.db"); + } + [Test] public void TestArgumentExceptions () { @@ -52,6 +62,59 @@ public void TestArgumentExceptions () Assert.Throws (() => new DefaultSecureMimeContext (null, "password")); Assert.Throws (() => new DefaultSecureMimeContext ("fileName", null)); + Assert.Throws (() => new SqliteCertificateDatabase ((DbConnection) null, "password")); + Assert.Throws (() => new SqliteCertificateDatabase ((string) null, "password")); + Assert.Throws (() => new SqliteCertificateDatabase (string.Empty, "password")); + Assert.Throws (() => new SqliteCertificateDatabase ("smime.db", null)); + + var database = new SqliteCertificateDatabase ("smime.db", "no.secret"); + + Assert.Throws (() => database.Add ((X509CrlRecord) null)); + Assert.Throws (() => database.Remove ((X509CrlRecord) null)); + Assert.Throws (() => database.Update ((X509CrlRecord) null)); + Assert.Throws (() => database.Add ((X509CertificateRecord) null)); + Assert.Throws (() => database.Remove ((X509CertificateRecord) null)); + Assert.Throws (() => database.Update ((X509CertificateRecord) null, X509CertificateRecordFields.Algorithms)); + Assert.Throws (() => database.Find ((X509Crl) null, X509CrlRecordFields.IsDelta)); + Assert.Throws (() => database.Find ((X509Name) null, X509CrlRecordFields.IsDelta)); + Assert.Throws (() => database.Find ((X509Certificate) null, X509CertificateRecordFields.Id)); + Assert.Throws (() => database.Find ((MailboxAddress) null, DateTime.Now, true, X509CertificateRecordFields.PrivateKey)); + + using (var ctx = new DefaultSecureMimeContext (database)) { + Assert.Throws (() => ctx.Import ((Stream) null, true)); + } + } + + [Test] + public void TestImportCertificates () + { + var database = new SqliteCertificateDatabase ("smime.db", "no.secret"); + var dataDir = Path.Combine ("..", "..", "TestData", "smime"); + var certificates = new List (); + + using (var ctx = new DefaultSecureMimeContext (database)) { + foreach (var filename in CertificateAuthorities) { + var path = Path.Combine (dataDir, filename); + + using (var stream = File.OpenRead (path)) { + var parser = new X509CertificateParser (); + + foreach (X509Certificate certificate in parser.ReadCertificates (stream)) { + certificates.Add (certificate); + ctx.Import (certificate); + } + } + } + + // make sure each certificate is there and then delete them... + foreach (var certificate in certificates) { + var record = database.Find (certificate, X509CertificateRecordFields.Id); + + Assert.IsNotNull (record, "Find"); + + database.Remove (record); + } + } } } } From 2dbbb892f626f667e97bb10b73f67f85c4177b94 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 16:47:04 -0500 Subject: [PATCH 214/741] Removed some unused logic --- MimeKit/Cryptography/X509CertificateDatabase.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index c8fb2f98c9..fb9c6998e6 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -400,13 +400,6 @@ protected static string[] GetColumnNames (X509CertificateRecordFields fields) /// The fields. protected static string[] GetColumnNames (X509CrlRecordFields fields) { - const X509CrlRecordFields all = X509CrlRecordFields.Id | X509CrlRecordFields.IsDelta | - X509CrlRecordFields.IssuerName | X509CrlRecordFields.ThisUpdate | - X509CrlRecordFields.NextUpdate | X509CrlRecordFields.Crl; - - if (fields == all) - return new [] { "*" }; - var columns = new List (); if ((fields & X509CrlRecordFields.Id) != 0) From 4158c6153a13f98b8f4c4a9338e48d9d89cc207d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 16:59:38 -0500 Subject: [PATCH 215/741] Simplified code --- .../Cryptography/X509CertificateDatabase.cs | 22 +++++++------------ .../X509CertificateRecordTests.cs | 1 + 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index fb9c6998e6..40e8a1ad04 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -484,7 +484,7 @@ protected static string[] GetColumnNames (X509CrlRecordFields fields) protected object GetValue (X509CertificateRecord record, string columnName) { switch (columnName) { - case "ID": return record.Id; + //case "ID": return record.Id; case "BASICCONSTRAINTS": return record.BasicConstraints; case "TRUSTED": return record.IsTrusted; case "KEYUSAGE": return (int) record.KeyUsage; @@ -517,7 +517,7 @@ protected object GetValue (X509CertificateRecord record, string columnName) protected static object GetValue (X509CrlRecord record, string columnName) { switch (columnName) { - case "ID": return record.Id; + //case "ID": return record.Id; case "DELTA": return record.IsDelta; case "ISSUERNAME": return record.IssuerName; case "THISUPDATE": return record.ThisUpdate; @@ -775,9 +775,8 @@ public void Add (X509CertificateRecord record) if (record == null) throw new ArgumentNullException (nameof (record)); - using (var command = GetInsertCommand (record)) { + using (var command = GetInsertCommand (record)) command.ExecuteNonQuery (); - } } /// @@ -795,9 +794,8 @@ public void Remove (X509CertificateRecord record) if (record == null) throw new ArgumentNullException (nameof (record)); - using (var command = GetDeleteCommand (record)) { + using (var command = GetDeleteCommand (record)) command.ExecuteNonQuery (); - } } /// @@ -816,9 +814,8 @@ public void Update (X509CertificateRecord record, X509CertificateRecordFields fi if (record == null) throw new ArgumentNullException (nameof (record)); - using (var command = GetUpdateCommand (record, fields)) { + using (var command = GetUpdateCommand (record, fields)) command.ExecuteNonQuery (); - } } /// @@ -916,9 +913,8 @@ public void Add (X509CrlRecord record) if (record == null) throw new ArgumentNullException (nameof (record)); - using (var command = GetInsertCommand (record)) { + using (var command = GetInsertCommand (record)) command.ExecuteNonQuery (); - } } /// @@ -936,9 +932,8 @@ public void Remove (X509CrlRecord record) if (record == null) throw new ArgumentNullException (nameof (record)); - using (var command = GetDeleteCommand (record)) { + using (var command = GetDeleteCommand (record)) command.ExecuteNonQuery (); - } } /// @@ -956,9 +951,8 @@ public void Update (X509CrlRecord record) if (record == null) throw new ArgumentNullException (nameof (record)); - using (var command = GetUpdateCommand (record)) { + using (var command = GetUpdateCommand (record)) command.ExecuteNonQuery (); - } } /// diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs index 884baa282d..54733160ce 100644 --- a/UnitTests/Cryptography/X509CertificateRecordTests.cs +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -50,6 +50,7 @@ public void TestArgumentExceptions () keyPair = reader.ReadObject () as AsymmetricCipherKeyPair; } + Assert.Throws (() => new X509CrlRecord (null)); Assert.Throws (() => new X509CertificateRecord (null)); Assert.Throws (() => new X509CertificateRecord (null, keyPair.Private)); Assert.Throws (() => new X509CertificateRecord (signer.Certificate, null)); From fcfb16e3cc4723c32fd8571fd1318d2bf714c952 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 17:55:07 -0500 Subject: [PATCH 216/741] Simplified code and fixed unit tests --- .../Cryptography/BouncyCastleSecureMimeContext.cs | 14 +++++--------- .../Cryptography/DefaultSecureMimeContextTests.cs | 5 +++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 2c1ec4bcc6..42bfda35b3 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -583,8 +583,8 @@ async Task DownloadCrlsOverHttpAsync (string location, Stream stream, bool { try { if (doAsync) { - using (var response = await client.GetAsync (location, cancellationToken)) - await response.Content.CopyToAsync (stream); + using (var response = await client.GetAsync (location, cancellationToken).ConfigureAwait (false)) + await response.Content.CopyToAsync (stream).ConfigureAwait (false); } else { #if !NETSTANDARD && !PORTABLE cancellationToken.ThrowIfCancellationRequested (); @@ -750,14 +750,10 @@ async Task GetDigitalSignaturesAsync (CmsSignedDataP await DownloadCrlsAsync (certificate, doAsync, cancellationToken).ConfigureAwait (false); if (certificate != null) { - if (signature.EncryptionAlgorithms.Length > 0 && signature.CreationDate != default (DateTime)) { + Import (certificate); + + if (signature.EncryptionAlgorithms.Length > 0 && signature.CreationDate != default (DateTime)) UpdateSecureMimeCapabilities (certificate, signature.EncryptionAlgorithms, signature.CreationDate); - } else { - try { - Import (certificate); - } catch { - } - } } var anchors = GetTrustedAnchors (); diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index a6c443cdc0..f705f7179a 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Linq; using System.Data.Common; using System.Collections.Generic; @@ -76,9 +77,9 @@ public void TestArgumentExceptions () Assert.Throws (() => database.Remove ((X509CertificateRecord) null)); Assert.Throws (() => database.Update ((X509CertificateRecord) null, X509CertificateRecordFields.Algorithms)); Assert.Throws (() => database.Find ((X509Crl) null, X509CrlRecordFields.IsDelta)); - Assert.Throws (() => database.Find ((X509Name) null, X509CrlRecordFields.IsDelta)); + Assert.Throws (() => database.Find ((X509Name) null, X509CrlRecordFields.IsDelta).FirstOrDefault ()); Assert.Throws (() => database.Find ((X509Certificate) null, X509CertificateRecordFields.Id)); - Assert.Throws (() => database.Find ((MailboxAddress) null, DateTime.Now, true, X509CertificateRecordFields.PrivateKey)); + Assert.Throws (() => database.Find ((MailboxAddress) null, DateTime.Now, true, X509CertificateRecordFields.PrivateKey).FirstOrDefault ()); using (var ctx = new DefaultSecureMimeContext (database)) { Assert.Throws (() => ctx.Import ((Stream) null, true)); From 9f86abb11c9df6c7c621a06444ed660212f89a0a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 20 Dec 2018 18:23:51 -0500 Subject: [PATCH 217/741] Simplified OpenPgpDetectionFilter --- MimeKit/Cryptography/OpenPgpDetectionFilter.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs index 0ea3f0dd9c..1050f7d0d4 100644 --- a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs +++ b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs @@ -300,10 +300,7 @@ protected override byte[] Filter (byte[] input, int startIndex, int length, out return input; } - outputLength = index - outputIndex; - position += index - startIndex; - - return input; + break; } index++; From f9184e03d5128f39e7e3b87cf91c91c8dfb46fcd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 27 Dec 2018 14:32:19 -0500 Subject: [PATCH 218/741] Modified ApplicationPkcs7Mime to be less strict about the smime-type Makes it possible to decrypt, verify or decompress parts that do not have an smime-type parameter. --- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index 482329bc3e..1c96ff2937 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -181,7 +181,7 @@ public MimeEntity Decompress (SecureMimeContext ctx) if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - if (SecureMimeType != SecureMimeType.CompressedData) + if (SecureMimeType != SecureMimeType.CompressedData && SecureMimeType != SecureMimeType.Unknown) throw new InvalidOperationException (); using (var memory = new MemoryBlockStream ()) { @@ -207,7 +207,7 @@ public MimeEntity Decompress (SecureMimeContext ctx) /// public MimeEntity Decompress () { - if (SecureMimeType != SecureMimeType.CompressedData) + if (SecureMimeType != SecureMimeType.CompressedData && SecureMimeType != SecureMimeType.Unknown) throw new InvalidOperationException (); using (var ctx = (SecureMimeContext) CryptographyContext.Create ("application/pkcs7-mime")) @@ -240,7 +240,7 @@ public MimeEntity Decompress () if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - if (SecureMimeType != SecureMimeType.EnvelopedData) + if (SecureMimeType != SecureMimeType.EnvelopedData && SecureMimeType != SecureMimeType.Unknown) throw new InvalidOperationException (); using (var memory = new MemoryBlockStream ()) { @@ -295,7 +295,7 @@ public void Import (SecureMimeContext ctx) if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - if (SecureMimeType != SecureMimeType.CertsOnly) + if (SecureMimeType != SecureMimeType.CertsOnly && SecureMimeType != SecureMimeType.Unknown) throw new InvalidOperationException (); using (var memory = new MemoryBlockStream ()) { @@ -336,7 +336,7 @@ public void Import (SecureMimeContext ctx) if (ctx == null) throw new ArgumentNullException (nameof (ctx)); - if (SecureMimeType != SecureMimeType.SignedData) + if (SecureMimeType != SecureMimeType.SignedData && SecureMimeType != SecureMimeType.Unknown) throw new InvalidOperationException (); using (var memory = new MemoryBlockStream ()) { From e244a4dabd52ade592211cb2e627c86772d58177 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 27 Dec 2018 15:34:38 -0500 Subject: [PATCH 219/741] Updated Newtonsoft.Json package reference for the unit tests --- MimeKit/MimeKit.Net45.project.json | 2 +- UnitTests/UnitTests.csproj | 12 ++++++------ UnitTests/packages.config | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json index 026a23dc25..b44cb5e9f6 100644 --- a/MimeKit/MimeKit.Net45.project.json +++ b/MimeKit/MimeKit.Net45.project.json @@ -7,6 +7,6 @@ "win": {} }, "dependencies": { - "BouncyCastle": "1.8.2" + "BouncyCastle": "1.8.4" } } \ No newline at end of file diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index a1d5f44f96..dbb0030fe0 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -41,12 +41,6 @@ ..\MimeKit\mimekit.snk - - ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll - - - ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - ..\packages\System.Data.SQLite.Core.1.0.109.2\lib\net45\System.Data.SQLite.dll @@ -59,6 +53,12 @@ + + ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll + + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + diff --git a/UnitTests/packages.config b/UnitTests/packages.config index f4a16e46a3..2a8a95b3b9 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,7 +1,7 @@  - - + + \ No newline at end of file From a4c03a68d66dd473708c2fac471d2d0467f685a5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 27 Dec 2018 15:39:09 -0500 Subject: [PATCH 220/741] Drop back down to BouncyCastle 1.8.2 - we don't *need* 1.8.4 --- MimeKit/MimeKit.Net45.project.json | 4 ++-- UnitTests/UnitTests.csproj | 2 +- UnitTests/packages.config | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json index b44cb5e9f6..20377545ea 100644 --- a/MimeKit/MimeKit.Net45.project.json +++ b/MimeKit/MimeKit.Net45.project.json @@ -7,6 +7,6 @@ "win": {} }, "dependencies": { - "BouncyCastle": "1.8.4" + "BouncyCastle": "1.8.2" } -} \ No newline at end of file +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index dbb0030fe0..b72f540064 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -54,7 +54,7 @@ - ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll + ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 2a8a95b3b9..deb3913755 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,7 +1,7 @@  - + - \ No newline at end of file + From a06f72d58134e8c2ea14a99d75ee6f0eeb8b34d5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 30 Dec 2018 09:26:15 -0500 Subject: [PATCH 221/741] bumped version to 2.1.2 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 6 ++++++ nuget/MimeKit.nuspec | 14 ++++---------- nuget/MimeKitLite.nuspec | 11 ++--------- 6 files changed, 16 insertions(+), 23 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index f538ac4b59..0667621da2 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.1 + 2.1.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 08558ff58a..9471b231ec 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.1 + 2.1.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index d7e2385735..2567972094 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.1.0")] -[assembly: AssemblyFileVersion ("2.1.1.0")] +[assembly: AssemblyInformationalVersion ("2.1.2.0")] +[assembly: AssemblyFileVersion ("2.1.2.0")] [assembly: AssemblyVersion ("2.1.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 8f465236e2..4d222c290f 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,11 @@ # Release Notes +### MimeKit 2.1.2 (2018-12-30) + +* Fixed WindowsSecureMimeDigitalCertificate logic for ECDsa. +* Added X509Certificate.GetPublicKeyAlgorithm() extension method. +* Modified ApplicationPkcs7Mime to be less strict about the smime-type. + ### MimeKit 2.1.1 (2018-12-16) * Mapped the TNEF Sensitivity property to the Sensitivity message header when calling diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 3c49f38e61..419d72444b 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.1 + 2.1.2 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,15 +26,9 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Mapped the TNEF Sensitivity property to the Sensitivity message header when calling TnefPart.ConvertToMessage(). -* Fixed the TNEF Importance and Priority mappings when calling TnefPart.ConvertToMessage(). -* Added more TnefPropertyId's that have been identified. -* Map PidTagTnefCorrelationKey to the Message-Id message header. -* When the TNEF data does not have a SentDate property, set the MimeMessage.Date property to DateTimeOffset.MinValue instead of DateTimeOffset.Now. -* Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject properties and use them if a TNEF Subject property is not available. -* Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content. -* Added more fallbacks for attempting to extract the sender information out of the TNEF data. -* Bumped Android and iOS versions of BouncyCastle to v1.8.4. +* Fixed WindowsSecureMimeDigitalCertificate logic for ECDsa. +* Added X509Certificate.GetPublicKeyAlgorithm() extension method. +* Modified ApplicationPkcs7Mime to be less strict about the smime-type. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 9d55e4fc51..44ff9a25fe 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.1 + 2.1.2 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,14 +26,7 @@ An Open Source library for creating and parsing MIME messages. -* Mapped the TNEF Sensitivity property to the Sensitivity message header when calling TnefPart.ConvertToMessage(). -* Fixed the TNEF Importance and Priority mappings when calling TnefPart.ConvertToMessage(). -* Added more TnefPropertyId's that have been identified. -* Map PidTagTnefCorrelationKey to the Message-Id message header. -* When the TNEF data does not have a SentDate property, set the MimeMessage.Date property to DateTimeOffset.MinValue instead of DateTimeOffset.Now. -* Fixed TnefPart.ConvertToMessage() to check the TNEF SubjectPrefix and NormalizedSubject properties and use them if a TNEF Subject property is not available. -* Fixed TNEF logic for extracting attachment content to not truncate some bytes from the beginning of the content. -* Added more fallbacks for attempting to extract the sender information out of the TNEF data. +* No change. Xamarin Inc. en-US From 6ba6a79c9de192cd0a6769cfa63387a7794cd3a1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 30 Dec 2018 10:29:01 -0500 Subject: [PATCH 222/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 1ed1a0f715..52dc7d9b5c 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.1\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.2\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 72e3edff98..6ac7b4c962 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 1a82765e87..b7eb35b03c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.1.1\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.1.2\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.1.1\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.1.2\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 3570e2749c..cf7dc7f907 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 2d296fb468..7af0f8519b 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.1.1\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.1.2\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.1.1\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.1.2\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index d689d9dfad..485d1c57b6 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 1bc96b4409..06809946cb 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.1\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.2\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 79d8d77201..933c5f1036 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From e6426a3c903219ea75e7ebbb26a17598581869eb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 30 Dec 2018 10:34:32 -0500 Subject: [PATCH 223/741] Updated appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ab1eb8f77c..de0ceb971c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.1.1.{build} +version: 2.1.2.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU From e9691023692b401eee45b83f5d7677a223cd36a6 Mon Sep 17 00:00:00 2001 From: fredeil Date: Tue, 1 Jan 2019 14:49:53 +0100 Subject: [PATCH 224/741] Update copyright to 2019 --- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/AttachmentCollection.cs | 2 +- MimeKit/BodyBuilder.cs | 2 +- MimeKit/ContentDisposition.cs | 2 +- MimeKit/ContentEncoding.cs | 2 +- MimeKit/ContentType.cs | 2 +- MimeKit/Cryptography/ApplicationPgpEncrypted.cs | 2 +- MimeKit/Cryptography/ApplicationPgpSignature.cs | 2 +- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 2 +- MimeKit/Cryptography/ApplicationPkcs7Signature.cs | 2 +- MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs | 2 +- MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs | 2 +- MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs | 2 +- MimeKit/Cryptography/CertificateNotFoundException.cs | 2 +- MimeKit/Cryptography/CmsRecipient.cs | 2 +- MimeKit/Cryptography/CmsRecipientCollection.cs | 2 +- MimeKit/Cryptography/CmsSigner.cs | 2 +- MimeKit/Cryptography/CryptographyContext.cs | 2 +- MimeKit/Cryptography/DbExtensions.cs | 2 +- MimeKit/Cryptography/DefaultSecureMimeContext.cs | 2 +- MimeKit/Cryptography/DigestAlgorithm.cs | 2 +- MimeKit/Cryptography/DigitalSignatureCollection.cs | 2 +- MimeKit/Cryptography/DigitalSignatureVerifyException.cs | 2 +- MimeKit/Cryptography/DkimBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs | 2 +- MimeKit/Cryptography/DkimHashStream.cs | 2 +- MimeKit/Cryptography/DkimRelaxedBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimSignatureAlgorithm.cs | 2 +- MimeKit/Cryptography/DkimSignatureStream.cs | 2 +- MimeKit/Cryptography/DkimSigner.cs | 2 +- MimeKit/Cryptography/DkimSimpleBodyFilter.cs | 2 +- MimeKit/Cryptography/EncryptionAlgorithm.cs | 2 +- MimeKit/Cryptography/GnuPGContext.cs | 2 +- MimeKit/Cryptography/IDigitalCertificate.cs | 2 +- MimeKit/Cryptography/IDigitalSignature.cs | 2 +- MimeKit/Cryptography/IDkimPublicKeyLocator.cs | 2 +- MimeKit/Cryptography/IX509CertificateDatabase.cs | 2 +- MimeKit/Cryptography/LdapUri.cs | 2 +- MimeKit/Cryptography/MultipartEncrypted.cs | 2 +- MimeKit/Cryptography/MultipartSigned.cs | 2 +- MimeKit/Cryptography/NpgsqlCertificateDatabase.cs | 2 +- MimeKit/Cryptography/OpenPgpBlockFilter.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 2 +- MimeKit/Cryptography/OpenPgpDataType.cs | 2 +- MimeKit/Cryptography/OpenPgpDetectionFilter.cs | 2 +- MimeKit/Cryptography/OpenPgpDigitalCertificate.cs | 2 +- MimeKit/Cryptography/OpenPgpDigitalSignature.cs | 2 +- MimeKit/Cryptography/OpenPgpKeyCertification.cs | 2 +- MimeKit/Cryptography/PrivateKeyNotFoundException.cs | 2 +- MimeKit/Cryptography/PublicKeyAlgorithm.cs | 2 +- MimeKit/Cryptography/PublicKeyNotFoundException.cs | 2 +- MimeKit/Cryptography/SecureMailboxAddress.cs | 2 +- MimeKit/Cryptography/SecureMimeContext.cs | 2 +- MimeKit/Cryptography/SecureMimeDigitalCertificate.cs | 2 +- MimeKit/Cryptography/SecureMimeDigitalSignature.cs | 2 +- MimeKit/Cryptography/SecureMimeType.cs | 2 +- MimeKit/Cryptography/SqlCertificateDatabase.cs | 2 +- MimeKit/Cryptography/SqliteCertificateDatabase.cs | 2 +- MimeKit/Cryptography/SubjectIdentifierType.cs | 2 +- MimeKit/Cryptography/TemporarySecureMimeContext.cs | 2 +- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 2 +- MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs | 2 +- MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs | 2 +- MimeKit/Cryptography/X509Certificate2Extensions.cs | 2 +- MimeKit/Cryptography/X509CertificateChain.cs | 2 +- MimeKit/Cryptography/X509CertificateDatabase.cs | 2 +- MimeKit/Cryptography/X509CertificateRecord.cs | 2 +- MimeKit/Cryptography/X509CertificateStore.cs | 2 +- MimeKit/Cryptography/X509CrlRecord.cs | 2 +- MimeKit/Cryptography/X509KeyUsageFlags.cs | 2 +- MimeKit/DomainList.cs | 2 +- MimeKit/EncodingConstraint.cs | 2 +- MimeKit/Encodings/Base64Decoder.cs | 2 +- MimeKit/Encodings/Base64Encoder.cs | 2 +- MimeKit/Encodings/HexDecoder.cs | 2 +- MimeKit/Encodings/HexEncoder.cs | 2 +- MimeKit/Encodings/IMimeDecoder.cs | 2 +- MimeKit/Encodings/IMimeEncoder.cs | 2 +- MimeKit/Encodings/PassThroughDecoder.cs | 2 +- MimeKit/Encodings/PassThroughEncoder.cs | 2 +- MimeKit/Encodings/QEncoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableDecoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableEncoder.cs | 2 +- MimeKit/Encodings/UUDecoder.cs | 2 +- MimeKit/Encodings/UUEncoder.cs | 2 +- MimeKit/Encodings/YDecoder.cs | 2 +- MimeKit/Encodings/YEncoder.cs | 2 +- MimeKit/FormatOptions.cs | 2 +- MimeKit/GroupAddress.cs | 2 +- MimeKit/Header.cs | 2 +- MimeKit/HeaderId.cs | 2 +- MimeKit/HeaderList.cs | 2 +- MimeKit/HeaderListChangedEventArgs.cs | 2 +- MimeKit/HeaderListCollection.cs | 2 +- MimeKit/IMimeContent.cs | 2 +- MimeKit/IO/BoundStream.cs | 2 +- MimeKit/IO/ChainedStream.cs | 2 +- MimeKit/IO/FilteredStream.cs | 2 +- MimeKit/IO/Filters/ArmoredFromFilter.cs | 2 +- MimeKit/IO/Filters/BestEncodingFilter.cs | 2 +- MimeKit/IO/Filters/CharsetFilter.cs | 2 +- MimeKit/IO/Filters/DecoderFilter.cs | 2 +- MimeKit/IO/Filters/Dos2UnixFilter.cs | 2 +- MimeKit/IO/Filters/EncoderFilter.cs | 2 +- MimeKit/IO/Filters/IMimeFilter.cs | 2 +- MimeKit/IO/Filters/MimeFilterBase.cs | 2 +- MimeKit/IO/Filters/PassThroughFilter.cs | 2 +- MimeKit/IO/Filters/TrailingWhitespaceFilter.cs | 2 +- MimeKit/IO/Filters/Unix2DosFilter.cs | 2 +- MimeKit/IO/ICancellableStream.cs | 2 +- MimeKit/IO/MeasuringStream.cs | 2 +- MimeKit/IO/MemoryBlockStream.cs | 2 +- MimeKit/InternetAddress.cs | 2 +- MimeKit/InternetAddressList.cs | 2 +- MimeKit/MailboxAddress.cs | 2 +- MimeKit/MessageDeliveryStatus.cs | 2 +- MimeKit/MessageDispositionNotification.cs | 2 +- MimeKit/MessageIdList.cs | 2 +- MimeKit/MessageImportance.cs | 2 +- MimeKit/MessagePart.cs | 2 +- MimeKit/MessagePartial.cs | 2 +- MimeKit/MessagePriority.cs | 2 +- MimeKit/MimeContent.cs | 2 +- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeEntityConstructorArgs.cs | 2 +- MimeKit/MimeFormat.cs | 2 +- MimeKit/MimeIterator.cs | 2 +- MimeKit/MimeMessage.cs | 2 +- MimeKit/MimeParser.cs | 2 +- MimeKit/MimePart.cs | 2 +- MimeKit/MimeTypes.cs | 2 +- MimeKit/MimeVisitor.cs | 2 +- MimeKit/Multipart.cs | 2 +- MimeKit/MultipartAlternative.cs | 2 +- MimeKit/MultipartRelated.cs | 2 +- MimeKit/MultipartReport.cs | 2 +- MimeKit/Parameter.cs | 2 +- MimeKit/ParameterEncodingMethod.cs | 2 +- MimeKit/ParameterList.cs | 2 +- MimeKit/ParseException.cs | 2 +- MimeKit/ParserOptions.cs | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- MimeKit/RfcComplianceMode.cs | 2 +- MimeKit/Text/FlowedToHtml.cs | 2 +- MimeKit/Text/FlowedToText.cs | 2 +- MimeKit/Text/HeaderFooterFormat.cs | 2 +- MimeKit/Text/HtmlAttribute.cs | 2 +- MimeKit/Text/HtmlAttributeCollection.cs | 2 +- MimeKit/Text/HtmlAttributeId.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.g.cs | 2 +- MimeKit/Text/HtmlNamespace.cs | 2 +- MimeKit/Text/HtmlTagCallback.cs | 2 +- MimeKit/Text/HtmlTagContext.cs | 2 +- MimeKit/Text/HtmlTagId.cs | 2 +- MimeKit/Text/HtmlToHtml.cs | 2 +- MimeKit/Text/HtmlToken.cs | 2 +- MimeKit/Text/HtmlTokenKind.cs | 2 +- MimeKit/Text/HtmlTokenizer.cs | 2 +- MimeKit/Text/HtmlTokenizerState.cs | 2 +- MimeKit/Text/HtmlUtils.cs | 2 +- MimeKit/Text/HtmlWriter.cs | 2 +- MimeKit/Text/HtmlWriterState.cs | 2 +- MimeKit/Text/ICharArray.cs | 2 +- MimeKit/Text/TextConverter.cs | 2 +- MimeKit/Text/TextFormat.cs | 2 +- MimeKit/Text/TextToFlowed.cs | 2 +- MimeKit/Text/TextToHtml.cs | 2 +- MimeKit/Text/TextToText.cs | 2 +- MimeKit/Text/Trie.cs | 2 +- MimeKit/Text/UrlScanner.cs | 2 +- MimeKit/TextPart.cs | 2 +- MimeKit/Tnef/RtfCompressedToRtf.cs | 2 +- MimeKit/Tnef/RtfCompressionMode.cs | 2 +- MimeKit/Tnef/TnefAttachFlags.cs | 2 +- MimeKit/Tnef/TnefAttachMethod.cs | 2 +- MimeKit/Tnef/TnefAttributeLevel.cs | 2 +- MimeKit/Tnef/TnefAttributeTag.cs | 2 +- MimeKit/Tnef/TnefComplianceMode.cs | 2 +- MimeKit/Tnef/TnefComplianceStatus.cs | 2 +- MimeKit/Tnef/TnefException.cs | 2 +- MimeKit/Tnef/TnefNameId.cs | 2 +- MimeKit/Tnef/TnefNameIdKind.cs | 2 +- MimeKit/Tnef/TnefPart.cs | 2 +- MimeKit/Tnef/TnefPropertyId.cs | 2 +- MimeKit/Tnef/TnefPropertyReader.cs | 2 +- MimeKit/Tnef/TnefPropertyTag.cs | 2 +- MimeKit/Tnef/TnefPropertyType.cs | 2 +- MimeKit/Tnef/TnefReader.cs | 2 +- MimeKit/Tnef/TnefReaderStream.cs | 2 +- MimeKit/Utils/BufferPool.cs | 2 +- MimeKit/Utils/ByteExtensions.cs | 2 +- MimeKit/Utils/CharsetUtils.cs | 2 +- MimeKit/Utils/Crc32.cs | 2 +- MimeKit/Utils/DateUtils.cs | 2 +- MimeKit/Utils/MimeUtils.cs | 2 +- MimeKit/Utils/OptimizedOrdinalComparer.cs | 2 +- MimeKit/Utils/PackedByteArray.cs | 2 +- MimeKit/Utils/ParseUtils.cs | 2 +- MimeKit/Utils/Rfc2047.cs | 2 +- MimeKit/Utils/StringBuilderExtensions.cs | 2 +- MimeKit/XMessagePriority.cs | 2 +- 202 files changed, 203 insertions(+), 203 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 85fa3c3986..c410e1a9ed 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index da01b04bd7..f041a474eb 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. +// Copyright (c) 2013-2019 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index 1156a8dfa1..495d9b7500 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. +// Copyright (c) 2013-2019 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index dbcdf45a2f..b3243b7570 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. +// Copyright (c) 2013-2019 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentEncoding.cs b/MimeKit/ContentEncoding.cs index 74e6d9e887..0ac7767a1f 100644 --- a/MimeKit/ContentEncoding.cs +++ b/MimeKit/ContentEncoding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. +// Copyright (c) 2013-2019 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index f052edbb60..c6ada9854a 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. +// Copyright (c) 2013-2019 Xamarin Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs index 70d6fd6198..9c848cced3 100644 --- a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs +++ b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPgpSignature.cs b/MimeKit/Cryptography/ApplicationPgpSignature.cs index 95dec8d7a0..529f80e3a4 100644 --- a/MimeKit/Cryptography/ApplicationPgpSignature.cs +++ b/MimeKit/Cryptography/ApplicationPgpSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index 1c96ff2937..dbf3a12df0 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs index 612fa09c27..b572f06c25 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index bf59ff25b3..bac3074d92 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 53da4de5a6..7661510634 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 42bfda35b3..64a28e8b41 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CertificateNotFoundException.cs b/MimeKit/Cryptography/CertificateNotFoundException.cs index faf2f237ee..d66479435d 100644 --- a/MimeKit/Cryptography/CertificateNotFoundException.cs +++ b/MimeKit/Cryptography/CertificateNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index f05e8bcb76..7d1a9b9188 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsRecipientCollection.cs b/MimeKit/Cryptography/CmsRecipientCollection.cs index 1ee3517cd6..e531e96d9e 100644 --- a/MimeKit/Cryptography/CmsRecipientCollection.cs +++ b/MimeKit/Cryptography/CmsRecipientCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index c8e8963e8b..1137ae771e 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 37188bb21e..dac7e79d4a 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DbExtensions.cs b/MimeKit/Cryptography/DbExtensions.cs index 7f12c89085..d1447f7d42 100644 --- a/MimeKit/Cryptography/DbExtensions.cs +++ b/MimeKit/Cryptography/DbExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index eced687d8c..b0443bb9bc 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigestAlgorithm.cs b/MimeKit/Cryptography/DigestAlgorithm.cs index 4a0a16815b..0c794f609c 100644 --- a/MimeKit/Cryptography/DigestAlgorithm.cs +++ b/MimeKit/Cryptography/DigestAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigitalSignatureCollection.cs b/MimeKit/Cryptography/DigitalSignatureCollection.cs index 6aff3ad713..bfbd4316c3 100644 --- a/MimeKit/Cryptography/DigitalSignatureCollection.cs +++ b/MimeKit/Cryptography/DigitalSignatureCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs index 2872bf8869..e9ed14172e 100644 --- a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs +++ b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimBodyFilter.cs b/MimeKit/Cryptography/DkimBodyFilter.cs index 7cce65ccb0..03df68e88b 100644 --- a/MimeKit/Cryptography/DkimBodyFilter.cs +++ b/MimeKit/Cryptography/DkimBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs index 090f9997e6..a05d3d472b 100644 --- a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs +++ b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimHashStream.cs b/MimeKit/Cryptography/DkimHashStream.cs index 9caab74aba..627c90857f 100644 --- a/MimeKit/Cryptography/DkimHashStream.cs +++ b/MimeKit/Cryptography/DkimHashStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs index 9d06048581..b494ba9c2b 100644 --- a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs +++ b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs index 43c6c9fbf0..195d16c306 100644 --- a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs +++ b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignatureStream.cs b/MimeKit/Cryptography/DkimSignatureStream.cs index 28812a7642..1aef66ee77 100644 --- a/MimeKit/Cryptography/DkimSignatureStream.cs +++ b/MimeKit/Cryptography/DkimSignatureStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 30c5187bdf..87b6610ec4 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs index d1afe759dc..057567be8b 100644 --- a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs +++ b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/EncryptionAlgorithm.cs b/MimeKit/Cryptography/EncryptionAlgorithm.cs index 8aa15f1671..57317e6da5 100644 --- a/MimeKit/Cryptography/EncryptionAlgorithm.cs +++ b/MimeKit/Cryptography/EncryptionAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index 7ceabcc8cc..fcd456f20b 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDigitalCertificate.cs b/MimeKit/Cryptography/IDigitalCertificate.cs index 05206c9b11..f2adb1dc90 100644 --- a/MimeKit/Cryptography/IDigitalCertificate.cs +++ b/MimeKit/Cryptography/IDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDigitalSignature.cs b/MimeKit/Cryptography/IDigitalSignature.cs index e39dda5a11..4661abe631 100644 --- a/MimeKit/Cryptography/IDigitalSignature.cs +++ b/MimeKit/Cryptography/IDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs index 07b0628f43..794a34fa18 100644 --- a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs +++ b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IX509CertificateDatabase.cs b/MimeKit/Cryptography/IX509CertificateDatabase.cs index a8ee7e7819..9c233b344d 100644 --- a/MimeKit/Cryptography/IX509CertificateDatabase.cs +++ b/MimeKit/Cryptography/IX509CertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/LdapUri.cs b/MimeKit/Cryptography/LdapUri.cs index 9a20d12d2d..0533814a89 100644 --- a/MimeKit/Cryptography/LdapUri.cs +++ b/MimeKit/Cryptography/LdapUri.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/MultipartEncrypted.cs b/MimeKit/Cryptography/MultipartEncrypted.cs index f69e0cfcde..1e66b27103 100644 --- a/MimeKit/Cryptography/MultipartEncrypted.cs +++ b/MimeKit/Cryptography/MultipartEncrypted.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index a5fae545f8..4797ab7de6 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs b/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs index c2d7fb98f0..f0a1c79ad8 100644 --- a/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Federico Di Gregorio // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpBlockFilter.cs b/MimeKit/Cryptography/OpenPgpBlockFilter.cs index 33c21a7d6b..d013ff959b 100644 --- a/MimeKit/Cryptography/OpenPgpBlockFilter.cs +++ b/MimeKit/Cryptography/OpenPgpBlockFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 23fb7dd9ed..09911f6c45 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDataType.cs b/MimeKit/Cryptography/OpenPgpDataType.cs index d0b0b7908c..815ebba5ca 100644 --- a/MimeKit/Cryptography/OpenPgpDataType.cs +++ b/MimeKit/Cryptography/OpenPgpDataType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs index 1050f7d0d4..0e27256c25 100644 --- a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs +++ b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs index fadf218e09..dd5c50955d 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs index 74efaa9d2e..fac7da55fc 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpKeyCertification.cs b/MimeKit/Cryptography/OpenPgpKeyCertification.cs index b0b84a2ca6..a730b70ae5 100644 --- a/MimeKit/Cryptography/OpenPgpKeyCertification.cs +++ b/MimeKit/Cryptography/OpenPgpKeyCertification.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs index a6115f4bdf..d81ad85ae2 100644 --- a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PublicKeyAlgorithm.cs b/MimeKit/Cryptography/PublicKeyAlgorithm.cs index 7d174ab6ec..a7f27532ea 100644 --- a/MimeKit/Cryptography/PublicKeyAlgorithm.cs +++ b/MimeKit/Cryptography/PublicKeyAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PublicKeyNotFoundException.cs b/MimeKit/Cryptography/PublicKeyNotFoundException.cs index 8d2fe4cf4b..6e2d5ed1ee 100644 --- a/MimeKit/Cryptography/PublicKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PublicKeyNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index 46b1999a68..c29cfdd6e5 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 4ece84c5e6..378b2deae1 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs index 78955b38ff..eba34320f3 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 763b21a540..f82fd450a1 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeType.cs b/MimeKit/Cryptography/SecureMimeType.cs index 00f0cf0438..52c912a5ef 100644 --- a/MimeKit/Cryptography/SecureMimeType.cs +++ b/MimeKit/Cryptography/SecureMimeType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index 603b0af1f2..bdca501fd2 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 803fdd5865..41b3151686 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SubjectIdentifierType.cs b/MimeKit/Cryptography/SubjectIdentifierType.cs index 2eb5e0e2bc..ac3a2aa351 100644 --- a/MimeKit/Cryptography/SubjectIdentifierType.cs +++ b/MimeKit/Cryptography/SubjectIdentifierType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 0f1cf70b2e..98c8fae6e4 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 8b3c389653..286587b4d9 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs index 271786e2c6..c481421e2b 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs index a2f685fe15..fef94bdc0c 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509Certificate2Extensions.cs b/MimeKit/Cryptography/X509Certificate2Extensions.cs index b22c96abbb..6bf093bcb8 100644 --- a/MimeKit/Cryptography/X509Certificate2Extensions.cs +++ b/MimeKit/Cryptography/X509Certificate2Extensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateChain.cs b/MimeKit/Cryptography/X509CertificateChain.cs index 09d81e7035..eafc018200 100644 --- a/MimeKit/Cryptography/X509CertificateChain.cs +++ b/MimeKit/Cryptography/X509CertificateChain.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 40e8a1ad04..818e40f10c 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateRecord.cs b/MimeKit/Cryptography/X509CertificateRecord.cs index 33dcead980..963b4ff220 100644 --- a/MimeKit/Cryptography/X509CertificateRecord.cs +++ b/MimeKit/Cryptography/X509CertificateRecord.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateStore.cs b/MimeKit/Cryptography/X509CertificateStore.cs index c807392a79..ed94cf8d2b 100644 --- a/MimeKit/Cryptography/X509CertificateStore.cs +++ b/MimeKit/Cryptography/X509CertificateStore.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CrlRecord.cs b/MimeKit/Cryptography/X509CrlRecord.cs index 4812c2fcaf..29ac942559 100644 --- a/MimeKit/Cryptography/X509CrlRecord.cs +++ b/MimeKit/Cryptography/X509CrlRecord.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509KeyUsageFlags.cs b/MimeKit/Cryptography/X509KeyUsageFlags.cs index c0156f8e73..1f66f7fd6c 100644 --- a/MimeKit/Cryptography/X509KeyUsageFlags.cs +++ b/MimeKit/Cryptography/X509KeyUsageFlags.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/DomainList.cs b/MimeKit/DomainList.cs index 1683b65e1b..0a0b67804d 100644 --- a/MimeKit/DomainList.cs +++ b/MimeKit/DomainList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/EncodingConstraint.cs b/MimeKit/EncodingConstraint.cs index b86f4bbdfa..a35a92056f 100644 --- a/MimeKit/EncodingConstraint.cs +++ b/MimeKit/EncodingConstraint.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/Base64Decoder.cs b/MimeKit/Encodings/Base64Decoder.cs index 35e43c9aea..f448c83399 100644 --- a/MimeKit/Encodings/Base64Decoder.cs +++ b/MimeKit/Encodings/Base64Decoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/Base64Encoder.cs b/MimeKit/Encodings/Base64Encoder.cs index 71195c9543..4040f9abc5 100644 --- a/MimeKit/Encodings/Base64Encoder.cs +++ b/MimeKit/Encodings/Base64Encoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/HexDecoder.cs b/MimeKit/Encodings/HexDecoder.cs index 8f2606642a..10a1b41595 100644 --- a/MimeKit/Encodings/HexDecoder.cs +++ b/MimeKit/Encodings/HexDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/HexEncoder.cs b/MimeKit/Encodings/HexEncoder.cs index 19cf2d4ebd..fdac18cee3 100644 --- a/MimeKit/Encodings/HexEncoder.cs +++ b/MimeKit/Encodings/HexEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/IMimeDecoder.cs b/MimeKit/Encodings/IMimeDecoder.cs index d940ad5995..8579abf215 100644 --- a/MimeKit/Encodings/IMimeDecoder.cs +++ b/MimeKit/Encodings/IMimeDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/IMimeEncoder.cs b/MimeKit/Encodings/IMimeEncoder.cs index 8733114d2f..023aa56c0f 100644 --- a/MimeKit/Encodings/IMimeEncoder.cs +++ b/MimeKit/Encodings/IMimeEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/PassThroughDecoder.cs b/MimeKit/Encodings/PassThroughDecoder.cs index 63b01d889f..ea72ca01e3 100644 --- a/MimeKit/Encodings/PassThroughDecoder.cs +++ b/MimeKit/Encodings/PassThroughDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/PassThroughEncoder.cs b/MimeKit/Encodings/PassThroughEncoder.cs index 3931ba5c2e..3a45f4de16 100644 --- a/MimeKit/Encodings/PassThroughEncoder.cs +++ b/MimeKit/Encodings/PassThroughEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QEncoder.cs b/MimeKit/Encodings/QEncoder.cs index 53acc7382a..ead58dacb0 100644 --- a/MimeKit/Encodings/QEncoder.cs +++ b/MimeKit/Encodings/QEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QuotedPrintableDecoder.cs b/MimeKit/Encodings/QuotedPrintableDecoder.cs index 1178248351..8890f2b014 100644 --- a/MimeKit/Encodings/QuotedPrintableDecoder.cs +++ b/MimeKit/Encodings/QuotedPrintableDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QuotedPrintableEncoder.cs b/MimeKit/Encodings/QuotedPrintableEncoder.cs index 1bf7cbf4b7..77e752a82f 100644 --- a/MimeKit/Encodings/QuotedPrintableEncoder.cs +++ b/MimeKit/Encodings/QuotedPrintableEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/UUDecoder.cs b/MimeKit/Encodings/UUDecoder.cs index f40ec6b22d..8272c6c9d2 100644 --- a/MimeKit/Encodings/UUDecoder.cs +++ b/MimeKit/Encodings/UUDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/UUEncoder.cs b/MimeKit/Encodings/UUEncoder.cs index 0ac3ef3d4c..14fa57e360 100644 --- a/MimeKit/Encodings/UUEncoder.cs +++ b/MimeKit/Encodings/UUEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/YDecoder.cs b/MimeKit/Encodings/YDecoder.cs index caaeac9267..ccfa956ae7 100644 --- a/MimeKit/Encodings/YDecoder.cs +++ b/MimeKit/Encodings/YDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/YEncoder.cs b/MimeKit/Encodings/YEncoder.cs index 49f25dbd39..32b0bf231f 100644 --- a/MimeKit/Encodings/YEncoder.cs +++ b/MimeKit/Encodings/YEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index cf590afb53..7d2e571561 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index d70876ef8d..3914a2525b 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 8b1e9497fa..01c146b4cc 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 2740ad79cc..f1d444e277 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index 56e6c72614..c02bc82eba 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderListChangedEventArgs.cs b/MimeKit/HeaderListChangedEventArgs.cs index 8673b917c2..c8e39ba3f1 100644 --- a/MimeKit/HeaderListChangedEventArgs.cs +++ b/MimeKit/HeaderListChangedEventArgs.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderListCollection.cs b/MimeKit/HeaderListCollection.cs index 1cb1827ae4..8944f62aca 100644 --- a/MimeKit/HeaderListCollection.cs +++ b/MimeKit/HeaderListCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IMimeContent.cs b/MimeKit/IMimeContent.cs index 45cb3f22ff..64b77fb32f 100644 --- a/MimeKit/IMimeContent.cs +++ b/MimeKit/IMimeContent.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/BoundStream.cs b/MimeKit/IO/BoundStream.cs index 2adcafbe4a..85936b2a76 100644 --- a/MimeKit/IO/BoundStream.cs +++ b/MimeKit/IO/BoundStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/ChainedStream.cs b/MimeKit/IO/ChainedStream.cs index 164a25ef23..7440151053 100644 --- a/MimeKit/IO/ChainedStream.cs +++ b/MimeKit/IO/ChainedStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/FilteredStream.cs b/MimeKit/IO/FilteredStream.cs index 9520acb913..0d9c866156 100644 --- a/MimeKit/IO/FilteredStream.cs +++ b/MimeKit/IO/FilteredStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/ArmoredFromFilter.cs b/MimeKit/IO/Filters/ArmoredFromFilter.cs index 86f5731ae0..2469d6f62d 100644 --- a/MimeKit/IO/Filters/ArmoredFromFilter.cs +++ b/MimeKit/IO/Filters/ArmoredFromFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/BestEncodingFilter.cs b/MimeKit/IO/Filters/BestEncodingFilter.cs index 9e0e143510..2d91997d79 100644 --- a/MimeKit/IO/Filters/BestEncodingFilter.cs +++ b/MimeKit/IO/Filters/BestEncodingFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/CharsetFilter.cs b/MimeKit/IO/Filters/CharsetFilter.cs index 8892fe0be4..343cca9e6d 100644 --- a/MimeKit/IO/Filters/CharsetFilter.cs +++ b/MimeKit/IO/Filters/CharsetFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/DecoderFilter.cs b/MimeKit/IO/Filters/DecoderFilter.cs index 21821d356e..ecdfb54781 100644 --- a/MimeKit/IO/Filters/DecoderFilter.cs +++ b/MimeKit/IO/Filters/DecoderFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/Dos2UnixFilter.cs b/MimeKit/IO/Filters/Dos2UnixFilter.cs index 48cb550f5f..e06683866c 100644 --- a/MimeKit/IO/Filters/Dos2UnixFilter.cs +++ b/MimeKit/IO/Filters/Dos2UnixFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/EncoderFilter.cs b/MimeKit/IO/Filters/EncoderFilter.cs index 8345ea6abc..902bf24ef2 100644 --- a/MimeKit/IO/Filters/EncoderFilter.cs +++ b/MimeKit/IO/Filters/EncoderFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/IMimeFilter.cs b/MimeKit/IO/Filters/IMimeFilter.cs index 113976a985..c67dd14e34 100644 --- a/MimeKit/IO/Filters/IMimeFilter.cs +++ b/MimeKit/IO/Filters/IMimeFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/MimeFilterBase.cs b/MimeKit/IO/Filters/MimeFilterBase.cs index 887f9a6d85..642964f949 100644 --- a/MimeKit/IO/Filters/MimeFilterBase.cs +++ b/MimeKit/IO/Filters/MimeFilterBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/PassThroughFilter.cs b/MimeKit/IO/Filters/PassThroughFilter.cs index 51474769b4..06d000acf7 100644 --- a/MimeKit/IO/Filters/PassThroughFilter.cs +++ b/MimeKit/IO/Filters/PassThroughFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs index f165651389..267ba754ec 100644 --- a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs +++ b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/Unix2DosFilter.cs b/MimeKit/IO/Filters/Unix2DosFilter.cs index 921bc661ca..2a59bc953a 100644 --- a/MimeKit/IO/Filters/Unix2DosFilter.cs +++ b/MimeKit/IO/Filters/Unix2DosFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/ICancellableStream.cs b/MimeKit/IO/ICancellableStream.cs index 323c6b7112..954b32d223 100644 --- a/MimeKit/IO/ICancellableStream.cs +++ b/MimeKit/IO/ICancellableStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/MeasuringStream.cs b/MimeKit/IO/MeasuringStream.cs index c6ad01a852..2c6fd2c542 100644 --- a/MimeKit/IO/MeasuringStream.cs +++ b/MimeKit/IO/MeasuringStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index 7ff4256335..07b5cbf755 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 3f9699d1bf..9bf27526a8 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index a44efc9359..1a41d6e804 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index b6e45d915a..d270039c75 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index 30e3571b61..acff14e391 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageDispositionNotification.cs b/MimeKit/MessageDispositionNotification.cs index 2b9285f5d6..fedd9d8f32 100644 --- a/MimeKit/MessageDispositionNotification.cs +++ b/MimeKit/MessageDispositionNotification.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageIdList.cs b/MimeKit/MessageIdList.cs index 31bbeadd29..a1c5ffabad 100644 --- a/MimeKit/MessageIdList.cs +++ b/MimeKit/MessageIdList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageImportance.cs b/MimeKit/MessageImportance.cs index c20404b2b4..82597b9219 100644 --- a/MimeKit/MessageImportance.cs +++ b/MimeKit/MessageImportance.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index ae0924aff8..8dc0c69137 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index b2b6f80dcd..db359b37f3 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePriority.cs b/MimeKit/MessagePriority.cs index 461e4d22c6..fe136474b5 100644 --- a/MimeKit/MessagePriority.cs +++ b/MimeKit/MessagePriority.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index b28ce0fa85..65fcafe18e 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 96eaad0a6a..319ff35acf 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeEntityConstructorArgs.cs b/MimeKit/MimeEntityConstructorArgs.cs index bcce3d6818..ca57445637 100644 --- a/MimeKit/MimeEntityConstructorArgs.cs +++ b/MimeKit/MimeEntityConstructorArgs.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeFormat.cs b/MimeKit/MimeFormat.cs index 1e9454dbb1..e9e5a723ab 100644 --- a/MimeKit/MimeFormat.cs +++ b/MimeKit/MimeFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeIterator.cs b/MimeKit/MimeIterator.cs index 9ab1581512..30bb411bb7 100644 --- a/MimeKit/MimeIterator.cs +++ b/MimeKit/MimeIterator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 3aafdb6da8..33a85325de 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 0e36cb261a..ed9d99aef3 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 48d13bc47a..5197019b50 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index e589ccfff2..e7036b636d 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeVisitor.cs b/MimeKit/MimeVisitor.cs index aa21c044ac..88a762fe75 100644 --- a/MimeKit/MimeVisitor.cs +++ b/MimeKit/MimeVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index e827ab8a5e..91b365ec1f 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartAlternative.cs b/MimeKit/MultipartAlternative.cs index f42e950c4a..acc4311754 100644 --- a/MimeKit/MultipartAlternative.cs +++ b/MimeKit/MultipartAlternative.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index 8f314ad84e..3e34d61967 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index 7a2d82b106..62dea75e23 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Parameter.cs b/MimeKit/Parameter.cs index d27220fd2f..b2f3687e54 100644 --- a/MimeKit/Parameter.cs +++ b/MimeKit/Parameter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParameterEncodingMethod.cs b/MimeKit/ParameterEncodingMethod.cs index 7a35db6d75..8bc4d3d416 100644 --- a/MimeKit/ParameterEncodingMethod.cs +++ b/MimeKit/ParameterEncodingMethod.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 03618ccae8..ec8fbdbfdd 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParseException.cs b/MimeKit/ParseException.cs index 0ee7b7639c..b33c865e96 100644 --- a/MimeKit/ParseException.cs +++ b/MimeKit/ParseException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index dedb31d8f4..82f4e62967 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 2567972094..4f7374f7b0 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -35,7 +35,7 @@ [assembly: AssemblyConfiguration ("")] [assembly: AssemblyCompany ("Xamarin Inc.")] [assembly: AssemblyProduct ("MimeKit")] -[assembly: AssemblyCopyright ("Copyright © 2013-2018 Xamarin Inc. (www.xamarin.com)")] +[assembly: AssemblyCopyright ("Copyright © 2013-2019 Xamarin Inc. (www.xamarin.com)")] [assembly: AssemblyTrademark ("Xamarin Inc.")] [assembly: AssemblyCulture ("")] diff --git a/MimeKit/RfcComplianceMode.cs b/MimeKit/RfcComplianceMode.cs index 8009ac8540..d570879886 100644 --- a/MimeKit/RfcComplianceMode.cs +++ b/MimeKit/RfcComplianceMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/FlowedToHtml.cs b/MimeKit/Text/FlowedToHtml.cs index 79cc06e71f..1679e2fdc3 100644 --- a/MimeKit/Text/FlowedToHtml.cs +++ b/MimeKit/Text/FlowedToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/FlowedToText.cs b/MimeKit/Text/FlowedToText.cs index 234b7b26fb..07cc23b1a0 100644 --- a/MimeKit/Text/FlowedToText.cs +++ b/MimeKit/Text/FlowedToText.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HeaderFooterFormat.cs b/MimeKit/Text/HeaderFooterFormat.cs index 3225c107f8..075fb63983 100644 --- a/MimeKit/Text/HeaderFooterFormat.cs +++ b/MimeKit/Text/HeaderFooterFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttribute.cs b/MimeKit/Text/HtmlAttribute.cs index 8618c3dad9..a78d9894fd 100644 --- a/MimeKit/Text/HtmlAttribute.cs +++ b/MimeKit/Text/HtmlAttribute.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttributeCollection.cs b/MimeKit/Text/HtmlAttributeCollection.cs index 736a774150..54ca4b601e 100644 --- a/MimeKit/Text/HtmlAttributeCollection.cs +++ b/MimeKit/Text/HtmlAttributeCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttributeId.cs b/MimeKit/Text/HtmlAttributeId.cs index 9f08a0afa4..fa74994b4f 100644 --- a/MimeKit/Text/HtmlAttributeId.cs +++ b/MimeKit/Text/HtmlAttributeId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlEntityDecoder.cs b/MimeKit/Text/HtmlEntityDecoder.cs index 44bd1ba4fb..903f6579bf 100644 --- a/MimeKit/Text/HtmlEntityDecoder.cs +++ b/MimeKit/Text/HtmlEntityDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlEntityDecoder.g.cs b/MimeKit/Text/HtmlEntityDecoder.g.cs index 14fa119eaa..256bf73a72 100644 --- a/MimeKit/Text/HtmlEntityDecoder.g.cs +++ b/MimeKit/Text/HtmlEntityDecoder.g.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlNamespace.cs b/MimeKit/Text/HtmlNamespace.cs index 70966e8407..92bce24725 100644 --- a/MimeKit/Text/HtmlNamespace.cs +++ b/MimeKit/Text/HtmlNamespace.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagCallback.cs b/MimeKit/Text/HtmlTagCallback.cs index ce4e27cb4a..489f42e9ef 100644 --- a/MimeKit/Text/HtmlTagCallback.cs +++ b/MimeKit/Text/HtmlTagCallback.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagContext.cs b/MimeKit/Text/HtmlTagContext.cs index 052e7ce103..c545791778 100644 --- a/MimeKit/Text/HtmlTagContext.cs +++ b/MimeKit/Text/HtmlTagContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index ea480e6fa7..2b5a7fe9ca 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlToHtml.cs b/MimeKit/Text/HtmlToHtml.cs index 4a94f9deea..0203995991 100644 --- a/MimeKit/Text/HtmlToHtml.cs +++ b/MimeKit/Text/HtmlToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlToken.cs b/MimeKit/Text/HtmlToken.cs index 7d6edda7f6..f77a39209c 100644 --- a/MimeKit/Text/HtmlToken.cs +++ b/MimeKit/Text/HtmlToken.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenKind.cs b/MimeKit/Text/HtmlTokenKind.cs index 83e0a32b2e..99a731c223 100644 --- a/MimeKit/Text/HtmlTokenKind.cs +++ b/MimeKit/Text/HtmlTokenKind.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 48f8374642..80b747a0f0 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenizerState.cs b/MimeKit/Text/HtmlTokenizerState.cs index adde2a09f2..7535911474 100644 --- a/MimeKit/Text/HtmlTokenizerState.cs +++ b/MimeKit/Text/HtmlTokenizerState.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlUtils.cs b/MimeKit/Text/HtmlUtils.cs index 0ec210e345..5f95738b14 100644 --- a/MimeKit/Text/HtmlUtils.cs +++ b/MimeKit/Text/HtmlUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlWriter.cs b/MimeKit/Text/HtmlWriter.cs index c173954dc1..714f2a1aa5 100644 --- a/MimeKit/Text/HtmlWriter.cs +++ b/MimeKit/Text/HtmlWriter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlWriterState.cs b/MimeKit/Text/HtmlWriterState.cs index f7dcf57239..cac0dc3c4d 100644 --- a/MimeKit/Text/HtmlWriterState.cs +++ b/MimeKit/Text/HtmlWriterState.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/ICharArray.cs b/MimeKit/Text/ICharArray.cs index 7c5d62556a..c83912ea19 100644 --- a/MimeKit/Text/ICharArray.cs +++ b/MimeKit/Text/ICharArray.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index 78e5633e93..f298590513 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextFormat.cs b/MimeKit/Text/TextFormat.cs index 3c394c0386..42cd9532ff 100644 --- a/MimeKit/Text/TextFormat.cs +++ b/MimeKit/Text/TextFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index 7423a1dafa..cab21c43cd 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToHtml.cs b/MimeKit/Text/TextToHtml.cs index c7721289da..3c472b5f8b 100644 --- a/MimeKit/Text/TextToHtml.cs +++ b/MimeKit/Text/TextToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToText.cs b/MimeKit/Text/TextToText.cs index dede8cd6c2..db113a202c 100644 --- a/MimeKit/Text/TextToText.cs +++ b/MimeKit/Text/TextToText.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/Trie.cs b/MimeKit/Text/Trie.cs index d03df99989..753252bc34 100644 --- a/MimeKit/Text/Trie.cs +++ b/MimeKit/Text/Trie.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/UrlScanner.cs b/MimeKit/Text/UrlScanner.cs index a0566cd959..82ef74d94c 100644 --- a/MimeKit/Text/UrlScanner.cs +++ b/MimeKit/Text/UrlScanner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index f42759aa5f..d890c561b1 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/RtfCompressedToRtf.cs b/MimeKit/Tnef/RtfCompressedToRtf.cs index 36d2189582..5fee7a1844 100644 --- a/MimeKit/Tnef/RtfCompressedToRtf.cs +++ b/MimeKit/Tnef/RtfCompressedToRtf.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/RtfCompressionMode.cs b/MimeKit/Tnef/RtfCompressionMode.cs index 37c463c303..6b2c544ec2 100644 --- a/MimeKit/Tnef/RtfCompressionMode.cs +++ b/MimeKit/Tnef/RtfCompressionMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttachFlags.cs b/MimeKit/Tnef/TnefAttachFlags.cs index be8321782f..389fbeceb2 100644 --- a/MimeKit/Tnef/TnefAttachFlags.cs +++ b/MimeKit/Tnef/TnefAttachFlags.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttachMethod.cs b/MimeKit/Tnef/TnefAttachMethod.cs index 751b0f48d4..a44307befc 100644 --- a/MimeKit/Tnef/TnefAttachMethod.cs +++ b/MimeKit/Tnef/TnefAttachMethod.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttributeLevel.cs b/MimeKit/Tnef/TnefAttributeLevel.cs index 52ca004ea1..ea5197366c 100644 --- a/MimeKit/Tnef/TnefAttributeLevel.cs +++ b/MimeKit/Tnef/TnefAttributeLevel.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttributeTag.cs b/MimeKit/Tnef/TnefAttributeTag.cs index a831574daf..241c3027f5 100644 --- a/MimeKit/Tnef/TnefAttributeTag.cs +++ b/MimeKit/Tnef/TnefAttributeTag.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefComplianceMode.cs b/MimeKit/Tnef/TnefComplianceMode.cs index f7a4bbd01f..78a190433d 100644 --- a/MimeKit/Tnef/TnefComplianceMode.cs +++ b/MimeKit/Tnef/TnefComplianceMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefComplianceStatus.cs b/MimeKit/Tnef/TnefComplianceStatus.cs index bb9360712a..a9285b25f7 100644 --- a/MimeKit/Tnef/TnefComplianceStatus.cs +++ b/MimeKit/Tnef/TnefComplianceStatus.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefException.cs b/MimeKit/Tnef/TnefException.cs index ff7cfba356..3addd46546 100644 --- a/MimeKit/Tnef/TnefException.cs +++ b/MimeKit/Tnef/TnefException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefNameId.cs b/MimeKit/Tnef/TnefNameId.cs index 35dc8d2961..e167a9b0ce 100644 --- a/MimeKit/Tnef/TnefNameId.cs +++ b/MimeKit/Tnef/TnefNameId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefNameIdKind.cs b/MimeKit/Tnef/TnefNameIdKind.cs index bb7d4af9eb..e6368b6b49 100644 --- a/MimeKit/Tnef/TnefNameIdKind.cs +++ b/MimeKit/Tnef/TnefNameIdKind.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 08c27cd378..d7e8ec54f3 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyId.cs b/MimeKit/Tnef/TnefPropertyId.cs index f5a6e4d4eb..bd846ea8e7 100644 --- a/MimeKit/Tnef/TnefPropertyId.cs +++ b/MimeKit/Tnef/TnefPropertyId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index ed25a48c83..05434d9642 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index 577ac1c684..af8156f883 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyType.cs b/MimeKit/Tnef/TnefPropertyType.cs index 175ea65e82..1cf648efcc 100644 --- a/MimeKit/Tnef/TnefPropertyType.cs +++ b/MimeKit/Tnef/TnefPropertyType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index fa240f89de..3f324df48c 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefReaderStream.cs b/MimeKit/Tnef/TnefReaderStream.cs index 2024abccbb..59f5f48a55 100644 --- a/MimeKit/Tnef/TnefReaderStream.cs +++ b/MimeKit/Tnef/TnefReaderStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/BufferPool.cs b/MimeKit/Utils/BufferPool.cs index 8c92096fe1..4e7830a494 100644 --- a/MimeKit/Utils/BufferPool.cs +++ b/MimeKit/Utils/BufferPool.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/ByteExtensions.cs b/MimeKit/Utils/ByteExtensions.cs index ffceaad8f0..b25fb126b6 100644 --- a/MimeKit/Utils/ByteExtensions.cs +++ b/MimeKit/Utils/ByteExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index ad347e1038..0d798d0568 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/Crc32.cs b/MimeKit/Utils/Crc32.cs index 55aeed495e..9b9c7174cd 100644 --- a/MimeKit/Utils/Crc32.cs +++ b/MimeKit/Utils/Crc32.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index fa85665063..e78cf4f55b 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index d9b34a0d4b..519a1b57e1 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index e6142eb115..8b351e6900 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/PackedByteArray.cs b/MimeKit/Utils/PackedByteArray.cs index 8f7be02e7d..afcd995257 100644 --- a/MimeKit/Utils/PackedByteArray.cs +++ b/MimeKit/Utils/PackedByteArray.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index ef8e7ecfba..f6a28dfb51 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/Rfc2047.cs b/MimeKit/Utils/Rfc2047.cs index a588f41370..fe9fe08b72 100644 --- a/MimeKit/Utils/Rfc2047.cs +++ b/MimeKit/Utils/Rfc2047.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index 014911d245..a75ea6045f 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/XMessagePriority.cs b/MimeKit/XMessagePriority.cs index 03b4926fa2..20a398155c 100644 --- a/MimeKit/XMessagePriority.cs +++ b/MimeKit/XMessagePriority.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From ddc0b6da1f79e22db3b9c079e6ca919c12bbd87a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 12 Jan 2019 09:15:56 -0500 Subject: [PATCH 225/741] Set up CI with Azure Pipelines --- azure-pipelines.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000000..b8006fe04a --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,33 @@ +# .NET Desktop +# Build and run tests for .NET Desktop or Windows classic desktop solutions. +# Add steps that publish symbols, save build artifacts, and more: +# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net + +trigger: +- master + +pool: + vmImage: 'VS2017-Win2016' + +variables: + solution: 'MimeKit.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + +steps: +- task: NuGetToolInstaller@0 + +- task: NuGetCommand@2 + inputs: + restoreSolution: '$(solution)' + +- task: VSBuild@1 + inputs: + solution: '$(solution)' + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' + +- task: VSTest@2 + inputs: + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' From fb58770014a8210110bcbb925ad3b7e48b660742 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 12 Jan 2019 09:26:12 -0500 Subject: [PATCH 226/741] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b8006fe04a..5fa73d22e0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,6 +15,8 @@ variables: buildConfiguration: 'Release' steps: +- script: git submodule update --init --recursive + - task: NuGetToolInstaller@0 - task: NuGetCommand@2 From 62b9291e8f828ffe9fe956f41628d25f56ba62b5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 14 Jan 2019 10:31:59 -0500 Subject: [PATCH 227/741] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5fa73d22e0..24e6abebc3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -29,7 +29,15 @@ steps: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' -- task: VSTest@2 +- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' + +- task: PublishTestResults@2 + +- task: NuGetCommand@2 inputs: - platform: '$(buildPlatform)' - configuration: '$(buildConfiguration)' + command: pack + packagesToPack: nuget/MimeKit.nuspec + +- task: PublishBuildArtifacts@1 + inputs: + ArtifactName: 'Nuget package' From 05ec14afe8782ab42d1a7e6df65822f05618d599 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 14 Jan 2019 10:33:33 -0500 Subject: [PATCH 228/741] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 24e6abebc3..b7b2644053 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -29,7 +29,7 @@ steps: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' -- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' +- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' - task: PublishTestResults@2 From 79a0e5000af1df6a9af9d1da32b43043e001a144 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 16 Feb 2019 15:53:13 -0500 Subject: [PATCH 229/741] Protect against NRE's in X509CertificateDatabase.Dispose() --- MimeKit/Cryptography/X509CertificateDatabase.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 818e40f10c..8d1c893e14 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -1020,8 +1020,10 @@ ICollection IX509Store.GetMatches (IX509Selector selector) /// false to release only the unmanaged resources. protected virtual void Dispose (bool disposing) { - for (int i = 0; i < passwd.Length; i++) - passwd[i] = '\0'; + if (passwd != null) { + for (int i = 0; i < passwd.Length; i++) + passwd[i] = '\0'; + } } /// From a773ad6855d81a81a72f594b0b540d7c361ad1d9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 16 Feb 2019 15:53:55 -0500 Subject: [PATCH 230/741] Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets Fixes issue #442 the Right Way(tm) --- MimeKit/TextPart.cs | 66 +++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index d890c561b1..2b23bc23b6 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -45,6 +45,7 @@ using MimeKit.IO; using MimeKit.Text; using MimeKit.Utils; +using MimeKit.IO.Filters; namespace MimeKit { /// @@ -303,46 +304,38 @@ public string Text { return string.Empty; var charset = ContentType.Parameters["charset"]; + Encoding encoding = null; - using (var memory = new MemoryStream ()) { - using (var filtered = new FilteredStream (memory)) { - filtered.Add (FormatOptions.Default.CreateNewLineFilter ()); - Content.DecodeTo (filtered); - filtered.Flush (); - } - -#if !PORTABLE && !NETSTANDARD - var content = memory.GetBuffer (); -#else - var content = memory.ToArray (); -#endif - Encoding encoding = null; - - if (charset != null) { - try { - encoding = CharsetUtils.GetEncoding (charset); - } catch (NotSupportedException) { - } + if (charset != null) { + try { + encoding = CharsetUtils.GetEncoding (charset); + } catch (NotSupportedException) { } + } - if (encoding == null) { - try { - if (content.Length >= 2 && content[0] == 0xFF && content[1] == 0xFE) - encoding = Encoding.Unicode; // UTF-16LE - else if (content.Length >= 2 && content[0] == 0xFE && content[1] == 0xFF) - encoding = Encoding.BigEndianUnicode; // UTF-16BE - else - encoding = CharsetUtils.UTF8; - - return encoding.GetString (content, 0, (int) memory.Length); - } catch (DecoderFallbackException) { - // fall back to iso-8859-1 - encoding = CharsetUtils.Latin1; - } + if (encoding == null) { + try { + var bom = new byte[2]; + int n; + + using (var content = Content.Open ()) + n = content.Read (bom, 0, bom.Length); + + if (bom.Length >= 2 && bom[0] == 0xFF && bom[1] == 0xFE) + encoding = Encoding.Unicode; // UTF-16LE + else if (bom.Length >= 2 && bom[0] == 0xFE && bom[1] == 0xFF) + encoding = Encoding.BigEndianUnicode; // UTF-16BE + else + encoding = CharsetUtils.UTF8; + + return GetText (encoding); + } catch (DecoderFallbackException) { + // fall back to iso-8859-1 + encoding = CharsetUtils.Latin1; } - - return encoding.GetString (content, 0, (int) memory.Length); } + + return GetText (encoding); } set { SetText (Encoding.UTF8, value); @@ -416,6 +409,7 @@ public string GetText (Encoding encoding) using (var memory = new MemoryStream ()) { using (var filtered = new FilteredStream (memory)) { + filtered.Add (new CharsetFilter (encoding, CharsetUtils.UTF8)); filtered.Add (FormatOptions.Default.CreateNewLineFilter ()); Content.DecodeTo (filtered); filtered.Flush (); @@ -427,7 +421,7 @@ public string GetText (Encoding encoding) var buffer = memory.ToArray (); #endif - return encoding.GetString (buffer, 0, (int) memory.Length); + return CharsetUtils.UTF8.GetString (buffer, 0, (int) memory.Length); } } From 035262ff4ba583f2c0a824f57e6a949bcc4e0d0e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 16 Feb 2019 16:09:44 -0500 Subject: [PATCH 231/741] Added tests to make sure UTF16 newlines get canonicalized --- UnitTests/TextPartTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index f23a0d2a83..f2dfb7e70c 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -131,7 +131,7 @@ public void TestLatin1 () [Test] public void TestUTF16BE () { - const string text = "This is some UTF-16BE text."; + const string text = "This is some UTF-16BE text.\r\nThis is line #2."; var memory = new MemoryStream (); memory.WriteByte (0xfe); @@ -143,13 +143,13 @@ public void TestUTF16BE () var part = new TextPart ("plain") { Content = new MimeContent (memory) }; - Assert.AreEqual (text, part.Text.Substring (1)); + Assert.AreEqual (text.Replace ("\r\n", Environment.NewLine), part.Text.Substring (1)); } [Test] public void TestUTF16LE () { - const string text = "This is some UTF-16LE text."; + const string text = "This is some UTF-16LE text.\r\nThis is line #2."; var memory = new MemoryStream (); memory.WriteByte (0xff); @@ -161,7 +161,7 @@ public void TestUTF16LE () var part = new TextPart ("plain") { Content = new MimeContent (memory) }; - Assert.AreEqual (text, part.Text.Substring (1)); + Assert.AreEqual (text.Replace ("\r\n", Environment.NewLine), part.Text.Substring (1)); } } } From ff621d5d6a2604a7c123b341f396055a6bd035bb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 Feb 2019 15:30:11 -0500 Subject: [PATCH 232/741] Make sure to rewind the MailMessage Attachment ContentStream before copying Fixes issue #467 --- MimeKit/MimeMessage.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 33a85325de..e4539f4772 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -3470,6 +3470,8 @@ static MimePart GetMimePart (AttachmentBase item) part.ContentId = item.ContentId; var stream = new MemoryBlockStream (); + if (item.ContentStream.CanSeek) + item.ContentStream.Position = 0; item.ContentStream.CopyTo (stream); stream.Position = 0; From 788b5047bf88624a14cc0e31d31036097db27824 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 23 Feb 2019 11:29:49 -0500 Subject: [PATCH 233/741] Added ParserOptions.AllowUnquotedCommasInAddresses and changed ParserOptions.AllowAdddressesWithoutDomain ParserOptions.AllowUnquotedCommasInAddresses is now effectively the same as the old version of AllowAddressesWithoutDomain (but inverted). ParserOptions.AllowAdddressesWithoutDomain now works as people expected it to work. Fixes issue #465 --- MimeKit/InternetAddress.cs | 9 ++++++++- MimeKit/ParserOptions.cs | 18 +++++++++++++++--- UnitTests/InternetAddressTests.cs | 7 ++++--- UnitTests/MailboxAddressTests.cs | 7 ++++--- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 9bf27526a8..9f40bc2305 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -568,7 +568,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index { bool strict = options.AddressParserComplianceMode == RfcComplianceMode.Strict; bool throwOnError = (flags & AddressParserFlags.ThrowOnError) != 0; - int minWordCount = options.AllowAddressesWithoutDomain ? 1 : 0; + int minWordCount = options.AllowUnquotedCommasInAddresses ? 0 : 1; address = null; @@ -662,6 +662,13 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index return false; } + if (!options.AllowAddressesWithoutDomain) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); + + return false; + } + // rewind back to the beginning of the local-part index = startIndex; diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 82f4e62967..5133f83f4d 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -77,13 +77,23 @@ public class ParserOptions public RfcComplianceMode AddressParserComplianceMode { get; set; } /// - /// Gets or sets whether the rfc822 address parser should allow addresses without a domain. + /// Gets or sets whether the rfc822 address parser should ignore unquoted commas in address names. /// /// - /// In general, you'll probably want this value to be false (the default) as it allows + /// In general, you'll probably want this value to be true (the default) as it allows /// maximum interoperability with existing (broken) mail clients and other mail software such as /// sloppily written perl scripts (aka spambots) that do not properly quote the name when it /// contains a comma. + /// + /// true if the address parser should ignore unquoted commas in address names; otherwise, false. + public bool AllowUnquotedCommasInAddresses { get; set; } + + /// + /// Gets or sets whether the rfc822 address parser should allow addresses without a domain. + /// + /// + /// In general, you'll probably want this value to be true (the default) as it allows + /// maximum interoperability with older email messages that may contain local UNIX addresses. /// This option exists in order to allow parsing of mailbox addresses that do not have an /// @domain component. These types of addresses are rare and were typically only used when sending /// mail to other users on the same UNIX system. @@ -168,7 +178,8 @@ public ParserOptions () ParameterComplianceMode = RfcComplianceMode.Loose; Rfc2047ComplianceMode = RfcComplianceMode.Loose; CharsetEncoding = CharsetUtils.UTF8; - AllowAddressesWithoutDomain = false; + AllowUnquotedCommasInAddresses = true; + AllowAddressesWithoutDomain = true; RespectContentLength = false; MaxAddressGroupDepth = 3; } @@ -185,6 +196,7 @@ public ParserOptions Clone () { var options = new ParserOptions (); options.AddressParserComplianceMode = AddressParserComplianceMode; + options.AllowUnquotedCommasInAddresses = AllowUnquotedCommasInAddresses; options.AllowAddressesWithoutDomain = AllowAddressesWithoutDomain; options.ParameterComplianceMode = ParameterComplianceMode; options.Rfc2047ComplianceMode = Rfc2047ComplianceMode; diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index dc04afc7f2..34af897107 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -381,13 +381,14 @@ public void TestParseMailboxWithUnquotedCommaInName () // this should fail when we allow mailbox addresses w/o a domain var options = ParserOptions.Default.Clone (); - options.AllowAddressesWithoutDomain = true; + options.AllowUnquotedCommasInAddresses = false; + options.AllowAddressesWithoutDomain = false; try { addr = InternetAddress.Parse (options, text); - Assert.Fail ("Should not have parsed \"{0}\" with AllowAddressesWithoutDomain = true", text); + Assert.Fail ("Should not have parsed \"{0}\" with AllowUnquotedCommasInAddresses = false", text); } catch (ParseException pex) { - Assert.AreEqual (text.IndexOf (','), pex.TokenIndex, "TokenIndex"); + Assert.AreEqual (0, pex.TokenIndex, "TokenIndex"); Assert.AreEqual (text.IndexOf (','), pex.ErrorIndex, "ErrorIndex"); } catch (Exception ex) { Assert.Fail ("Should not have thrown {0}", ex.GetType ().Name); diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index def9193ed3..6c146f1722 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -472,13 +472,14 @@ public void TestParseMailboxWithUnquotedCommaInName () // this should fail when we allow mailbox addresses w/o a domain var options = ParserOptions.Default.Clone (); - options.AllowAddressesWithoutDomain = true; + options.AllowUnquotedCommasInAddresses = false; + options.AllowAddressesWithoutDomain = false; try { mailbox = MailboxAddress.Parse (options, text); - Assert.Fail ("Should not have parsed \"{0}\" with AllowAddressesWithoutDomain = true", text); + Assert.Fail ("Should not have parsed \"{0}\" with AllowUnquotedCommasInAddresses = false", text); } catch (ParseException pex) { - Assert.AreEqual (text.IndexOf (','), pex.TokenIndex, "TokenIndex"); + Assert.AreEqual (0, pex.TokenIndex, "TokenIndex"); Assert.AreEqual (text.IndexOf (','), pex.ErrorIndex, "ErrorIndex"); } catch (Exception ex) { Assert.Fail ("Should not have thrown {0}", ex.GetType ().Name); From 9705318b6ecbc8e28ebfdb9f88555f8e94b8598d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 Feb 2019 09:59:29 -0500 Subject: [PATCH 234/741] Bumped version to 2.1.3 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 12 ++++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 9 +++++---- nuget/MimeKitLite.nuspec | 6 ++++-- 7 files changed, 26 insertions(+), 11 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 0667621da2..11a8d2cc94 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.2 + 2.1.3 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 9471b231ec..3fa2ce51f0 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.2 + 2.1.3 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 4f7374f7b0..d2ab565f68 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.2.0")] -[assembly: AssemblyFileVersion ("2.1.2.0")] +[assembly: AssemblyInformationalVersion ("2.1.3.0")] +[assembly: AssemblyFileVersion ("2.1.3.0")] [assembly: AssemblyVersion ("2.1.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 4d222c290f..59beed2d99 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,17 @@ # Release Notes +### MimeKit 2.1.3 (2019-02-24) + +* Fixed an NRE in X509CertificateDatabase.Dispose(). +* Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets + such as UTF-16. (issue [#442](https://github.com/jstedfast/MimeKit/issues/442)) +* Fixed System.Net.Mail.MailMessage cast to MimeMessage when the ContentStream of + the attachments has not been rewound to the beginning of the stream. + (issue [#467](https://github.com/jstedfast/MimeKit/issues/467)) +* Changed ParserOptions.AllowAddressesWithoutDomain to work as users expected and + moved the old logic into ParserOptions.AllowUnquotedCommasInAddresses. + (issue [#465](https://github.com/jstedfast/MimeKit/issues/465)) + ### MimeKit 2.1.2 (2018-12-30) * Fixed WindowsSecureMimeDigitalCertificate logic for ECDsa. diff --git a/appveyor.yml b/appveyor.yml index de0ceb971c..d247ecdd91 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.1.2.{build} +version: 2.1.3.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 419d72444b..b6c87891f9 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.2 + 2.1.3 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,9 +26,10 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed WindowsSecureMimeDigitalCertificate logic for ECDsa. -* Added X509Certificate.GetPublicKeyAlgorithm() extension method. -* Modified ApplicationPkcs7Mime to be less strict about the smime-type. +* Fixed an NRE in X509CertificateDatabase.Dispose(). +* Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets such as UTF-16. (issue 442) +* Fixed System.Net.Mail.MailMessage cast to MimeMessage when the ContentStream of the attachments has not been rewound to the beginning of the stream. (issue 467) +* Changed ParserOptions.AllowAddressesWithoutDomain to work as users expected and moved the old logic into ParserOptions.AllowUnquotedCommasInAddresses. (issue 465) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 44ff9a25fe..30ac6b95ec 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.2 + 2.1.3 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,7 +26,9 @@ An Open Source library for creating and parsing MIME messages. -* No change. +* Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets such as UTF-16. (issue 442) +* Fixed System.Net.Mail.MailMessage cast to MimeMessage when the ContentStream of the attachments has not been rewound to the beginning of the stream. (issue 467) +* Changed ParserOptions.AllowAddressesWithoutDomain to work as users expected and moved the old logic into ParserOptions.AllowUnquotedCommasInAddresses. (issue 465) Xamarin Inc. en-US From 45acb058c5ef71e1e571cb16226c18a3891fdd47 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 Feb 2019 10:17:57 -0500 Subject: [PATCH 235/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 52dc7d9b5c..d0634eeaaf 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.2\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.3\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 6ac7b4c962..de3c8b382c 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index b7eb35b03c..746ef92fd5 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.1.2\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.1.3\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.1.2\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.1.3\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index cf7dc7f907..777343b790 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 7af0f8519b..9b37b0def9 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.1.2\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.1.3\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.1.2\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.1.3\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 485d1c57b6..b4dac97e88 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 06809946cb..b0f67e23ed 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.2\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.3\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 933c5f1036..2267ac353f 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 38460dd2d46cddccba591ed9d8fbad87b2bcf993 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 27 Feb 2019 10:21:02 -0500 Subject: [PATCH 236/741] Updated azure-pipelines.yml --- azure-pipelines.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b7b2644053..7cd4c8956f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -18,26 +18,35 @@ steps: - script: git submodule update --init --recursive - task: NuGetToolInstaller@0 + displayName: 'Installing NuGet 4.9.2' + inputs: + versionSpec: 4.9.2 - task: NuGetCommand@2 + displayName: 'Restoring NuGet package dependencies' inputs: restoreSolution: '$(solution)' - task: VSBuild@1 + displayName: 'Building $(solution) for $(buildConfiguration)|$(buildPlatform)' inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' + displayName: 'Running unit tests' - task: PublishTestResults@2 + displayName: 'Publishing unit test results' - task: NuGetCommand@2 + displayName: 'Packaging MimeKit' inputs: command: pack packagesToPack: nuget/MimeKit.nuspec - task: PublishBuildArtifacts@1 + displayName: 'Publishing MimeKit NuGet package' inputs: ArtifactName: 'Nuget package' From 7f3f095d014d545a4ac94dc815d1c25bd5855798 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 27 Feb 2019 10:51:47 -0500 Subject: [PATCH 237/741] Updated azure-pipelines.yml --- azure-pipelines.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7cd4c8956f..376135acea 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -18,35 +18,35 @@ steps: - script: git submodule update --init --recursive - task: NuGetToolInstaller@0 - displayName: 'Installing NuGet 4.9.2' + displayName: 'Install NuGet 4.9.2' inputs: versionSpec: 4.9.2 - task: NuGetCommand@2 - displayName: 'Restoring NuGet package dependencies' + displayName: 'Restore NuGet Package Dependencies' inputs: restoreSolution: '$(solution)' - task: VSBuild@1 - displayName: 'Building $(solution) for $(buildConfiguration)|$(buildPlatform)' + displayName: 'Build $(solution) for $(buildConfiguration)|$(buildPlatform)' inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' - displayName: 'Running unit tests' + displayName: 'Run Unit Tests' - task: PublishTestResults@2 - displayName: 'Publishing unit test results' + displayName: 'Publish Unit Test Results' - task: NuGetCommand@2 - displayName: 'Packaging MimeKit' + displayName: 'Package MimeKit' inputs: command: pack packagesToPack: nuget/MimeKit.nuspec - task: PublishBuildArtifacts@1 - displayName: 'Publishing MimeKit NuGet package' + displayName: 'Publish MimeKit NuGet package' inputs: - ArtifactName: 'Nuget package' + ArtifactName: 'MimeKit' From e947fcea7ad7893a126bb4cae00bb4d8cb8f96c7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Feb 2019 08:40:24 -0500 Subject: [PATCH 238/741] Added a setter for FormatOptions.MaxLineLength. Fixes issue #469 --- MimeKit/FormatOptions.cs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index 7d2e571561..da7a7eaa13 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -75,6 +75,7 @@ public class FormatOptions NewLineFormat newLineFormat; bool ensureNewLine; bool international; + int maxLineLength; /// /// The default formatting options. @@ -87,15 +88,30 @@ public class FormatOptions public static readonly FormatOptions Default; /// - /// Gets the maximum line length used by the encoders. The encoders + /// Gets or sets the maximum line length used by the encoders. The encoders /// use this value to determine where to place line breaks. /// /// /// Specifies the maximum line length to use when line-wrapping headers. /// /// The maximum line length. + /// + /// is out of range. It must be between 60 and 998. + /// + /// + /// cannot be changed. + /// public int MaxLineLength { - get { return DefaultMaxLineLength; } + get { return maxLineLength; } + set { + if (this == Default) + throw new InvalidOperationException ("The default formatting options cannot be changed."); + + if (value < MinimumLineLength || value > MaxLineLength) + throw new ArgumentOutOfRangeException (nameof (value)); + + maxLineLength = value; + } } /// @@ -279,7 +295,7 @@ public FormatOptions () { HiddenHeaders = new HashSet (); parameterEncodingMethod = ParameterEncodingMethod.Rfc2231; - //maxLineLength = DefaultMaxLineLength; + maxLineLength = DefaultMaxLineLength; allowMixedHeaderCharsets = false; ensureNewLine = false; international = false; @@ -300,7 +316,7 @@ public FormatOptions () public FormatOptions Clone () { var options = new FormatOptions (); - //options.maxLineLength = maxLineLength; + options.maxLineLength = maxLineLength; options.newLineFormat = newLineFormat; options.ensureNewLine = ensureNewLine; options.HiddenHeaders = new HashSet (HiddenHeaders); From ed8a8fa1642e8646207aa0f3637944a96fef1062 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Feb 2019 09:56:43 -0500 Subject: [PATCH 239/741] Fixed typo --- MimeKit/FormatOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index da7a7eaa13..5803b6366d 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -107,7 +107,7 @@ public int MaxLineLength { if (this == Default) throw new InvalidOperationException ("The default formatting options cannot be changed."); - if (value < MinimumLineLength || value > MaxLineLength) + if (value < MinimumLineLength || value > MaximumLineLength) throw new ArgumentOutOfRangeException (nameof (value)); maxLineLength = value; From 5150b225c30b181b00a1c2e36150fd0109fde6c3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Feb 2019 11:34:04 -0500 Subject: [PATCH 240/741] Updated azure-pipelines.yml --- azure-pipelines.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 376135acea..a34fe3d696 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,6 +9,8 @@ trigger: pool: vmImage: 'VS2017-Win2016' +name: 2.1.3$(Rev:.r) + variables: solution: 'MimeKit.sln' buildPlatform: 'Any CPU' @@ -41,12 +43,13 @@ steps: displayName: 'Publish Unit Test Results' - task: NuGetCommand@2 - displayName: 'Package MimeKit' + displayName: 'Package MimeKit-$(Build.BuildNumber)' inputs: command: pack packagesToPack: nuget/MimeKit.nuspec + versioningScheme: byBuildNumber - task: PublishBuildArtifacts@1 displayName: 'Publish MimeKit NuGet package' inputs: - ArtifactName: 'MimeKit' + ArtifactName: 'MimeKit-$(Build.BuildNumber)' From 3f5109e049e8f985c919e8ca62911ddf192a70c4 Mon Sep 17 00:00:00 2001 From: Humayun Ahmed Date: Tue, 12 Mar 2019 16:48:20 +0100 Subject: [PATCH 241/741] AttachDisposition text will come like inline; filename="imagea429bf.JPG"; and hence it will show error attachment.ContentDisposition.Disposition = text; as there is validation "Illegal characters in disposition value." for Disposition --- MimeKit/Tnef/TnefPart.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index d7e8ec54f3..df5f6ab5f8 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -408,11 +408,10 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) break; case TnefPropertyId.AttachDisposition: text = prop.ReadValueAsString (); - if (attachment.ContentDisposition == null) - attachment.ContentDisposition = new ContentDisposition (text); - else - attachment.ContentDisposition.Disposition = text; - break; + ContentDisposition contentDisposition; + ContentDisposition.TryParse(text, out contentDisposition); + attachment.ContentDisposition = contentDisposition; + break; case TnefPropertyId.AttachData: if (attachMethod == TnefAttachMethod.EmbeddedMessage) { var tnef = new TnefPart (); From fd6b17b3704a44e58125b3f0c530b45f5b92d4d7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 12 Mar 2019 12:42:43 -0400 Subject: [PATCH 242/741] Cleaned up TnefPart's ContentDisposition handling --- MimeKit/Tnef/TnefPart.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index df5f6ab5f8..8bd968d944 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -408,10 +408,9 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) break; case TnefPropertyId.AttachDisposition: text = prop.ReadValueAsString (); - ContentDisposition contentDisposition; - ContentDisposition.TryParse(text, out contentDisposition); - attachment.ContentDisposition = contentDisposition; - break; + if (ContentDisposition.TryParse (text, out ContentDisposition disposition)) + attachment.ContentDisposition = disposition; + break; case TnefPropertyId.AttachData: if (attachMethod == TnefAttachMethod.EmbeddedMessage) { var tnef = new TnefPart (); From 6aebb92b722a2a88d630f57f4ec8e92467f6297d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 12 Mar 2019 12:50:39 -0400 Subject: [PATCH 243/741] Updated TnefTests to reflect ContentDisposition changes to TnefPart --- UnitTests/Tnef/TnefTests.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index fcbc47f006..73daf241d6 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -475,10 +475,8 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) break; case TnefPropertyId.AttachDisposition: text = prop.ReadValueAsString (); - if (attachment.ContentDisposition == null) - attachment.ContentDisposition = new ContentDisposition (text); - else - attachment.ContentDisposition.Disposition = text; + if (ContentDisposition.TryParse (text, out ContentDisposition disposition)) + attachment.ContentDisposition = disposition; //Console.WriteLine ("Attachment Property: {0} = {1}", prop.PropertyTag.Id, text); break; case TnefPropertyId.AttachMethod: From 85c481e0fd678a4065b3c3423567bd482e53f83f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 14 Mar 2019 10:22:52 -0400 Subject: [PATCH 244/741] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a34fe3d696..8584df0687 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -49,6 +49,14 @@ steps: packagesToPack: nuget/MimeKit.nuspec versioningScheme: byBuildNumber +- task: NuGetCommand@2 + displayName: 'Publish MimeKit NuGet package to MyGet Feed' + inputs: + command: push + nuGetFeedType: external + publishFeedCredentials: 'MyGet' + packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg' + - task: PublishBuildArtifacts@1 displayName: 'Publish MimeKit NuGet package' inputs: From ca9829d7f09caefd27b7716b8e14c862dd45cde6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 14 Mar 2019 11:34:37 -0400 Subject: [PATCH 245/741] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 02c53d8713..db2ce8a0be 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ [![Join the chat at https://gitter.im/jstedfast/MimeKit](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jstedfast/MimeKit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -| Package | Download | -|:----------|:--------:| -|**MimeKit**|[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit)| -|**MimeKitLite**|[![NuGet Badge MimeKitLite](https://buildstats.info/nuget/MimeKitLite)](https://www.nuget.org/packages/MimeKitLite)| +| Package |Latest Release|Latest Build| +|:--------------|:------------:|:----------:| +|**MimeKit** |[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit)|[![MyGet Badge MimeKit](https://buildstats.info/myget/mimekit/MimeKit)](https://www.myget.org/feed/Packages/mimekit)| +|**MimeKitLite**|[![NuGet Badge MimeKitLite](https://buildstats.info/nuget/MimeKitLite)](https://www.nuget.org/packages/MimeKitLite)|| | Platform |Build Status|Code Coverage|Static Analysis| |:-------------|:----------:|:-----------:|:-------------:| From 2be462f4870d0096e913c675b53e09753762f169 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 14 Mar 2019 11:39:50 -0400 Subject: [PATCH 246/741] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index db2ce8a0be..ebd4f82139 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ | Package |Latest Release|Latest Build| |:--------------|:------------:|:----------:| -|**MimeKit** |[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit)|[![MyGet Badge MimeKit](https://buildstats.info/myget/mimekit/MimeKit)](https://www.myget.org/feed/Packages/mimekit)| +|**MimeKit** |[![NuGet Badge MimeKit](https://buildstats.info/nuget/MimeKit)](https://www.nuget.org/packages/MimeKit)|[![MyGet Badge MimeKit](https://buildstats.info/myget/mimekit/MimeKit)](https://www.myget.org/feed/mimekit/package/nuget/MimeKit)| |**MimeKitLite**|[![NuGet Badge MimeKitLite](https://buildstats.info/nuget/MimeKitLite)](https://www.nuget.org/packages/MimeKitLite)|| | Platform |Build Status|Code Coverage|Static Analysis| From 578c6316f5fc5d94aca9db7f9522d02518eeccd5 Mon Sep 17 00:00:00 2001 From: Humayun Ahmed Date: Fri, 15 Mar 2019 15:11:03 +0100 Subject: [PATCH 247/741] =?UTF-8?q?Just=20followed=20the=20MimeEntity=20co?= =?UTF-8?q?de=20approach=20to=20avoid=20non=20formatted=20con=E2=80=A6=20(?= =?UTF-8?q?#471)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Duplicate the MimeEntity logic for parsing the Content-Id when extracting the Content-Id from TNEF data. --- MimeKit/Tnef/TnefPart.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 8bd968d944..d4fcd2b3ad 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -404,7 +404,8 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment.ContentBase = prop.ReadValueAsUri (); break; case TnefPropertyId.AttachContentId: - attachment.ContentId = prop.ReadValueAsString (); + if (MailboxAddress.TryParse (prop.ReadValueAsString (), out MailboxAddress mailbox)) + attachment.ContentId = mailbox.Address; break; case TnefPropertyId.AttachDisposition: text = prop.ReadValueAsString (); From 1162ca3d1457691d9577dc22c61c3a3250639053 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 15 Mar 2019 10:14:52 -0400 Subject: [PATCH 248/741] Updated TNEF unit tests to match changes to TnefPart --- UnitTests/Tnef/TnefTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 73daf241d6..c7dd1ef68c 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -470,7 +470,8 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) //Console.WriteLine ("Attachment Property: {0} = {1}", prop.PropertyTag.Id, text); break; case TnefPropertyId.AttachContentId: - attachment.ContentId = prop.ReadValueAsString (); + if (MailboxAddress.TryParse (prop.ReadValueAsString (), out MailboxAddress mailbox)) + attachment.ContentId = mailbox.Address; //Console.WriteLine ("Attachment Property: {0} = {1}", prop.PropertyTag.Id, attachment.ContentId); break; case TnefPropertyId.AttachDisposition: From e608117dbc78b586479e31a789b95e30eabd3d5c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 21 Mar 2019 11:59:52 -0400 Subject: [PATCH 249/741] Implemented a Content-Id (and future Message-Id?) parser that is looser in what it accepts Fixes issue #472 --- MimeKit/MimeEntity.cs | 5 +- MimeKit/Tnef/TnefPart.cs | 9 +- MimeKit/Utils/ParseUtils.cs | 119 ++++++++++++++++++ UnitTests/MimeParserTests.cs | 12 ++ .../TestData/messages/invalid-contentid.txt | 9 ++ UnitTests/Tnef/TnefTests.cs | 13 +- UnitTests/UnitTests.csproj | 1 + 7 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 UnitTests/TestData/messages/invalid-contentid.txt diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 319ff35acf..3bd02a76e9 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -1045,7 +1045,6 @@ void ContentTypeChanged (object sender, EventArgs e) /// The header being added, changed or removed. protected virtual void OnHeadersChanged (HeaderListChangedAction action, Header header) { - MailboxAddress mailbox; int index = 0; string text; @@ -1079,8 +1078,8 @@ protected virtual void OnHeadersChanged (HeaderListChangedAction action, Header baseUri = null; break; case HeaderId.ContentId: - if (MailboxAddress.TryParse (Headers.Options, header.RawValue, ref index, header.RawValue.Length, false, out mailbox)) - contentId = mailbox.Address; + if (ParseUtils.TryParseMsgId (header.RawValue, ref index, header.RawValue.Length, false, out string msgid)) + contentId = msgid; else contentId = null; break; diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index d4fcd2b3ad..f5cbf248e8 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -404,8 +404,13 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment.ContentBase = prop.ReadValueAsUri (); break; case TnefPropertyId.AttachContentId: - if (MailboxAddress.TryParse (prop.ReadValueAsString (), out MailboxAddress mailbox)) - attachment.ContentId = mailbox.Address; + text = prop.ReadValueAsString (); + + var buffer = CharsetUtils.UTF8.GetBytes (text); + int index = 0; + + if (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, out string msgid)) + attachment.ContentId = msgid; break; case TnefPropertyId.AttachDisposition: text = prop.ReadValueAsString (); diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index f6a28dfb51..804c738a35 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -370,6 +370,125 @@ public static bool TryParseDomain (byte[] text, ref int index, int endIndex, byt return TryParseDotAtom (text, ref index, endIndex, sentinels, throwOnError, "domain", out domain); } + static readonly byte[] GreaterThan = { (byte) '>' }; + + public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool throwOnError, out string msgid) + { + const CharType SpaceOrControl = CharType.IsWhitespace | CharType.IsControl; + msgid = null; + + if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex || text[index] != '<') { + if (throwOnError) + throw new ParseException ("No msg-id token found.", index, index); + + return false; + } + + int tokenIndex = index; + + index++; + + SkipWhiteSpace (text, ref index, endIndex); + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + var token = new StringBuilder (); + + // consume the local-part of the msg-id using a very loose definition of 'local-part' + // + // See https://github.com/jstedfast/MimeKit/issues/472 for the reasons why. + do { + int start = index; + + if (text[index] == '"') { + if (!SkipQuoted (text, ref index, endIndex, throwOnError)) + return false; + } else { + while (index < endIndex && text[index] != (byte) '.' && text[index] != (byte) '@' && text[index] != '>' && !text[index].IsType (SpaceOrControl)) + index++; + } + + try { + token.Append (CharsetUtils.UTF8.GetString (text, start, index - start)); + } catch (DecoderFallbackException ex) { + if (throwOnError) + throw new ParseException ("Internationalized local-part tokens may only contain UTF-8 characters.", start, start, ex); + + return false; + } + + SkipWhiteSpace (text, ref index, endIndex); + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + if (text[index] == (byte) '@' || text[index] == (byte) '>') + break; + + if (text[index] != (byte) '.') { + if (throwOnError) + throw new ParseException (string.Format ("Invalid msg-id token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + token.Append ('.'); + index++; + + SkipWhiteSpace (text, ref index, endIndex); + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete msg-id at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + } while (true); + + if (text[index] == (byte) '@') { + token.Append ('@'); + index++; + + if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + string domain; + if (!TryParseDomain (text, ref index, endIndex, GreaterThan, throwOnError, out domain)) + return false; + + if (IsIdnEncoded (domain)) + domain = IdnDecode (domain); + + token.Append (domain); + } + + if (text[index] == (byte) '>') + index++; + + msgid = token.ToString (); + + return true; + } + public static bool IsInternational (string value) { for (int i = 0; i < value.Length; i++) { diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 41b5384885..a8701695e7 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -973,5 +973,17 @@ public void TestIssue358 () } } } + + [Test] + public void TestInvalidContentId () + { + // This tests the fix for issue #472 + using (var stream = File.OpenRead (Path.Combine (MessagesDataDir, "invalid-contentid.txt"))) { + var message = MimeMessage.Load (stream); + var body = message.Body; + + Assert.AreEqual ("Messe_Bauma_rz(1)_ae284449-6bdc-488f-8ec3-5be5e5b09efb.jpg", body.ContentId, "The Content-Id value does not match."); + } + } } } diff --git a/UnitTests/TestData/messages/invalid-contentid.txt b/UnitTests/TestData/messages/invalid-contentid.txt new file mode 100644 index 0000000000..9cc289039e --- /dev/null +++ b/UnitTests/TestData/messages/invalid-contentid.txt @@ -0,0 +1,9 @@ +From: MimeKit Unit Tests +To: MimeKit Unit Tests +Subject: Invalid Content-Id test (issue #472) +Date: Thu, 21 Mar 2019 17:42:00 -0400 +MIME-Version: 1.0 +Content-Type: text/plain +Content-Id: + +This is the text body. \ No newline at end of file diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index c7dd1ef68c..368cb051d7 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -32,6 +32,7 @@ using MimeKit; using MimeKit.IO; using MimeKit.Tnef; +using MimeKit.Utils; using MimeKit.IO.Filters; using NUnit.Framework; @@ -419,6 +420,7 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) TnefAttachFlags flags; string[] mimeType; byte[] attachData; + byte[] buffer; DateTime time; string text; @@ -470,8 +472,13 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) //Console.WriteLine ("Attachment Property: {0} = {1}", prop.PropertyTag.Id, text); break; case TnefPropertyId.AttachContentId: - if (MailboxAddress.TryParse (prop.ReadValueAsString (), out MailboxAddress mailbox)) - attachment.ContentId = mailbox.Address; + text = prop.ReadValueAsString (); + + buffer = CharsetUtils.UTF8.GetBytes (text); + int index = 0; + + if (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, out string msgid)) + attachment.ContentId = msgid; //Console.WriteLine ("Attachment Property: {0} = {1}", prop.PropertyTag.Id, attachment.ContentId); break; case TnefPropertyId.AttachDisposition: @@ -521,7 +528,7 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) stream.CopyTo (content, 4096); - var buffer = content.GetBuffer (); + buffer = content.GetBuffer (); filter.Flush (buffer, 0, (int) content.Length, out outIndex, out outLength); attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); attachment.Content = new MimeContent (content); diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index b72f540064..60bba18b0f 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -212,6 +212,7 @@ + From 762d2894d0f5a0346962f9af4af021f9229832fe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 Mar 2019 09:14:28 -0400 Subject: [PATCH 250/741] Improved MsgId token parser and added a bunch of unit tests --- MimeKit/MimeEntity.cs | 2 +- MimeKit/Tnef/TnefPart.cs | 2 +- MimeKit/Utils/ParseUtils.cs | 33 +++- UnitTests/MimeParserTests.cs | 12 -- .../TestData/messages/invalid-contentid.txt | 9 - UnitTests/Tnef/TnefTests.cs | 2 +- UnitTests/UnitTests.csproj | 1 - UnitTests/Utils/ParseUtilsTests.cs | 175 ++++++++++++++++++ 8 files changed, 203 insertions(+), 33 deletions(-) delete mode 100644 UnitTests/TestData/messages/invalid-contentid.txt diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 3bd02a76e9..a6f6cdddf9 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -1078,7 +1078,7 @@ protected virtual void OnHeadersChanged (HeaderListChangedAction action, Header baseUri = null; break; case HeaderId.ContentId: - if (ParseUtils.TryParseMsgId (header.RawValue, ref index, header.RawValue.Length, false, out string msgid)) + if (ParseUtils.TryParseMsgId (header.RawValue, ref index, header.RawValue.Length, false, false, out string msgid)) contentId = msgid; else contentId = null; diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index f5cbf248e8..74271e95a3 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -409,7 +409,7 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) var buffer = CharsetUtils.UTF8.GetBytes (text); int index = 0; - if (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, out string msgid)) + if (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out string msgid)) attachment.ContentId = msgid; break; case TnefPropertyId.AttachDisposition: diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index 804c738a35..e08ee1af6b 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -372,15 +372,17 @@ public static bool TryParseDomain (byte[] text, ref int index, int endIndex, byt static readonly byte[] GreaterThan = { (byte) '>' }; - public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool throwOnError, out string msgid) + public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool requireAngleAddr, bool throwOnError, out string msgid) { const CharType SpaceOrControl = CharType.IsWhitespace | CharType.IsControl; + var angleAddr = false; + msgid = null; if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; - if (index >= endIndex || text[index] != '<') { + if (index >= endIndex || (requireAngleAddr && text[index] != '<')) { if (throwOnError) throw new ParseException ("No msg-id token found.", index, index); @@ -389,7 +391,10 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool int tokenIndex = index; - index++; + if (text[index] == '<') { + angleAddr = true; + index++; + } SkipWhiteSpace (text, ref index, endIndex); @@ -428,10 +433,15 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool SkipWhiteSpace (text, ref index, endIndex); if (index >= endIndex) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + if (angleAddr) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); - return false; + return false; + } + + // since the msg-id token did not start with a '<', we do not need a '>' + break; } if (text[index] == (byte) '@' || text[index] == (byte) '>') @@ -457,7 +467,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool } } while (true); - if (text[index] == (byte) '@') { + if (index < endIndex && text[index] == (byte) '@') { token.Append ('@'); index++; @@ -481,7 +491,14 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool token.Append (domain); } - if (text[index] == (byte) '>') + if (angleAddr && (index >= endIndex || text[index] != '>')) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + if (index < endIndex && text[index] == (byte) '>') index++; msgid = token.ToString (); diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index a8701695e7..41b5384885 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -973,17 +973,5 @@ public void TestIssue358 () } } } - - [Test] - public void TestInvalidContentId () - { - // This tests the fix for issue #472 - using (var stream = File.OpenRead (Path.Combine (MessagesDataDir, "invalid-contentid.txt"))) { - var message = MimeMessage.Load (stream); - var body = message.Body; - - Assert.AreEqual ("Messe_Bauma_rz(1)_ae284449-6bdc-488f-8ec3-5be5e5b09efb.jpg", body.ContentId, "The Content-Id value does not match."); - } - } } } diff --git a/UnitTests/TestData/messages/invalid-contentid.txt b/UnitTests/TestData/messages/invalid-contentid.txt deleted file mode 100644 index 9cc289039e..0000000000 --- a/UnitTests/TestData/messages/invalid-contentid.txt +++ /dev/null @@ -1,9 +0,0 @@ -From: MimeKit Unit Tests -To: MimeKit Unit Tests -Subject: Invalid Content-Id test (issue #472) -Date: Thu, 21 Mar 2019 17:42:00 -0400 -MIME-Version: 1.0 -Content-Type: text/plain -Content-Id: - -This is the text body. \ No newline at end of file diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 368cb051d7..3d111b67ba 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -477,7 +477,7 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) buffer = CharsetUtils.UTF8.GetBytes (text); int index = 0; - if (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, out string msgid)) + if (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out string msgid)) attachment.ContentId = msgid; //Console.WriteLine ("Attachment Property: {0} = {1}", prop.PropertyTag.Id, attachment.ContentId); break; diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 60bba18b0f..b72f540064 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -212,7 +212,6 @@ - diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index 9d3af647f6..5901ef57bf 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -134,5 +134,180 @@ public void TestTryParseBadDomains () Assert.AreEqual (BadDomainErrorIndexes[i], ex.ErrorIndex, "Unexpected error index."); } } + + static readonly string[] MsgIdInputs = { + " ", + " Messe_Bauma_rz(1)_ae284449-6bdc-488f-8ec3-5be5e5b09efb.jpg", + }; + static readonly string[] MsgIdOutputs = { + "Messe_Bauma_rz(1)_ae284449-6bdc-488f-8ec3-5be5e5b09efb.jpg", + "Messe_Bauma_rz(1)_ae284449-6bdc-488f-8ec3-5be5e5b09efb.jpg", + }; + + [Test] + public void TestTryParseMsgIdTokens () + { + for (int i = 0; i < MsgIdInputs.Length; i++) { + var buffer = Encoding.ASCII.GetBytes (MsgIdInputs[i]); + int endIndex = buffer.Length; + int index = 0; + string msgid; + + Assert.IsTrue (ParseUtils.TryParseMsgId (buffer, ref index, endIndex, false, false, out msgid), "TryParseMsgId"); + Assert.AreEqual (MsgIdOutputs[i], msgid, "MsgIdOutputs[{0}]", i); + } + } + + [Test] + public void TestTryParseMsgIdEmptyString () + { + var buffer = Encoding.ASCII.GetBytes (" "); + int index = 0; + string msgid; + + Assert.IsFalse (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out msgid), "TryParseMsgId"); + + try { + index = 0; + ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, true, out msgid); + Assert.Fail ("throwOnError"); + } catch (ParseException ex) { + Assert.AreEqual (1, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (1, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestTryParseMsgIdLessThan () + { + var buffer = Encoding.ASCII.GetBytes (" <"); + int index = 0; + string msgid; + + Assert.IsFalse (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out msgid), "TryParseMsgId"); + + try { + index = 0; + ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, true, out msgid); + Assert.Fail ("throwOnError"); + } catch (ParseException ex) { + Assert.AreEqual (1, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (2, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestTryParseMsgIdLessThanLocalPart () + { + var buffer = Encoding.ASCII.GetBytes (" "); + int index = 0; + string msgid; + + Assert.IsFalse (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out msgid), "TryParseMsgId"); + + try { + index = 0; + ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, true, out msgid); + Assert.Fail ("throwOnError"); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (13, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestTryParseMsgIdLessThanLocalPartAtDomainMissingGreaterThan () + { + var buffer = Encoding.ASCII.GetBytes (" Date: Fri, 22 Mar 2019 14:29:57 -0400 Subject: [PATCH 251/741] Updated WindowsSecureMimeTests --- UnitTests/Cryptography/SecureMimeTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 383e9a0dfb..b4a1ef4936 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -44,7 +44,8 @@ namespace UnitTests.Cryptography { public abstract class SecureMimeTestsBase { - const string ExpiredCertificateMessage = "A required certificate is not within its validity period when verifying against the current system clock or the timestamp in the signed file.\r\n"; + //const string ExpiredCertificateMessage = "A required certificate is not within its validity period when verifying against the current system clock or the timestamp in the signed file.\r\n"; + const string ExpiredCertificateMessage = "The certificate is revoked.\r\n"; const string UntrustedRootCertificateMessage = "A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.\r\n"; const string ThunderbirdFingerprint = "354ea4dcf98166639b58ec5df06a65de0cd8a95c"; const string MimeKitFingerprint = "4846fb5e27df6a23bb35a995443363e447d3426d"; @@ -825,7 +826,7 @@ public virtual void TestSecureMimeVerifyThunderbird () if (Path.DirectorySeparatorChar == '/') Assert.IsInstanceOf (ex.InnerException); else - Assert.AreEqual (ex.InnerException.Message, ExpiredCertificateMessage); + Assert.AreEqual (ExpiredCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } @@ -1192,7 +1193,7 @@ public void TestSecureMimeDecryptVerifyThunderbird () if (Path.DirectorySeparatorChar == '/') Assert.IsInstanceOf (ex.InnerException); else - Assert.AreEqual (ex.InnerException.Message, ExpiredCertificateMessage); + Assert.AreEqual (ExpiredCertificateMessage, ex.InnerException.Message); } else { Assert.Fail ("Failed to verify signature: {0}", ex); } From c0f992549fd1fac67ee897e400bfdb10f05514cd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 25 Mar 2019 07:45:32 -0400 Subject: [PATCH 252/741] Added support for the text/rfc822-headers mime-type Fixes issue #474 --- MimeKit/MessagePart.cs | 19 ++- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + MimeKit/MimeKitLite.Android.csproj | 1 + MimeKit/MimeKitLite.Net45.csproj | 1 + MimeKit/MimeKitLite.NetStandard.csproj | 1 + MimeKit/MimeKitLite.Portable.csproj | 1 + MimeKit/MimeKitLite.WindowsUniversal81.csproj | 1 + MimeKit/MimeKitLite.iOS.csproj | 1 + MimeKit/MimeVisitor.cs | 15 +++ MimeKit/ParserOptions.cs | 6 +- MimeKit/TextRfc822Headers.cs | 124 ++++++++++++++++++ UnitTests/TextRfc822HeadersTests.cs | 49 +++++++ UnitTests/UnitTests.csproj | 1 + 21 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 MimeKit/TextRfc822Headers.cs create mode 100644 UnitTests/TextRfc822HeadersTests.cs diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index 8dc0c69137..40be5e3914 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -99,6 +99,23 @@ public MessagePart (string subtype, params object[] args) : this (subtype) Message = message; } + /// + /// Initializes a new instance of the class. + /// + /// + /// Initializes the based on the provided media type and subtype. + /// + /// The media type. + /// The media subtype. + /// + /// is null. + /// -or- + /// is null. + /// + protected MessagePart (string mediaType, string mediaSubtype) : base (mediaType, mediaSubtype) + { + } + /// /// Initializes a new instance of the class. /// @@ -109,7 +126,7 @@ public MessagePart (string subtype, params object[] args) : this (subtype) /// /// is null. /// - public MessagePart (string subtype) : base ("message", subtype) + public MessagePart (string subtype) : this ("message", subtype) { } diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 33ead3b9f5..8f19865612 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -260,6 +260,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 8ed419c8cd..cdcb512ace 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -248,6 +248,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 209de720d9..dc445de8e6 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -260,6 +260,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 11a8d2cc94..3313e96dcf 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -244,6 +244,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 0852f5b3fb..2803eef9b2 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -241,6 +241,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 0dae278a08..ef77380ef9 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -241,6 +241,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index d3c77614f9..f3de62284c 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -247,6 +247,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 4ba2f286a2..a7f6d9253f 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -247,6 +247,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 25c1e18420..fc9809b1a4 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -256,6 +256,7 @@ + diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index cdaeab72ed..82c3610a06 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -195,6 +195,7 @@ + diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index a057dc25c7..923f9954ae 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -190,6 +190,7 @@ + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 3fa2ce51f0..0d125d2771 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -184,6 +184,7 @@ + diff --git a/MimeKit/MimeKitLite.Portable.csproj b/MimeKit/MimeKitLite.Portable.csproj index 0ff64011de..ac4af93e1d 100644 --- a/MimeKit/MimeKitLite.Portable.csproj +++ b/MimeKit/MimeKitLite.Portable.csproj @@ -191,6 +191,7 @@ + diff --git a/MimeKit/MimeKitLite.WindowsUniversal81.csproj b/MimeKit/MimeKitLite.WindowsUniversal81.csproj index 40844b918e..607761df2e 100644 --- a/MimeKit/MimeKitLite.WindowsUniversal81.csproj +++ b/MimeKit/MimeKitLite.WindowsUniversal81.csproj @@ -196,6 +196,7 @@ + diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj index 649bb5caf1..32e8611fee 100644 --- a/MimeKit/MimeKitLite.iOS.csproj +++ b/MimeKit/MimeKitLite.iOS.csproj @@ -190,6 +190,7 @@ + diff --git a/MimeKit/MimeVisitor.cs b/MimeKit/MimeVisitor.cs index 88a762fe75..8d5b0f71ae 100644 --- a/MimeKit/MimeVisitor.cs +++ b/MimeKit/MimeVisitor.cs @@ -352,6 +352,21 @@ protected internal virtual void VisitTextPart (TextPart entity) VisitMimePart (entity); } + /// + /// Visit the text/rfc822-headers MIME entity. + /// + /// + /// Visits the text/rfc822-headers MIME entity. + /// + /// + /// + /// + /// The text/rfc822-headers MIME entity. + protected internal virtual void VisitTextRfc822Headers (TextRfc822Headers entity) + { + VisitMessagePart (entity); + } + /// /// Visit the Microsoft TNEF MIME part entity. /// diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 5133f83f4d..76b5290a96 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -397,8 +397,12 @@ internal MimeEntity CreateEntity (ContentType contentType, IList
headers } } - if (type == "text") + if (type == "text") { + if (subtype == "rfc822-headers" && !IsEncoded (headers)) + return new TextRfc822Headers (args); + return new TextPart (args); + } return new MimePart (args); } diff --git a/MimeKit/TextRfc822Headers.cs b/MimeKit/TextRfc822Headers.cs new file mode 100644 index 0000000000..5974597067 --- /dev/null +++ b/MimeKit/TextRfc822Headers.cs @@ -0,0 +1,124 @@ +// +// TextRfc822Headers.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +namespace MimeKit { + /// + /// A MIME part containing message headers as its content. + /// + /// + /// Represents MIME entities with a Content-Type of text/rfc822-headers. + /// + public class TextRfc822Headers : MessagePart + { + /// + /// Initializes a new instance of the class. + /// + /// + /// This constructor is used by . + /// + /// Information used by the constructor. + /// + /// is null. + /// + public TextRfc822Headers (MimeEntityConstructorArgs args) : base (args) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// An array of initialization parameters: headers and message parts. + /// + /// is null. + /// + /// + /// contains more than one . + /// -or- + /// contains one or more arguments of an unknown type. + /// + public TextRfc822Headers (params object[] args) : this () + { + MimeMessage message = null; + + foreach (object obj in args) { + if (obj == null || TryInit (obj)) + continue; + + var mesg = obj as MimeMessage; + if (mesg != null) { + if (message != null) + throw new ArgumentException ("MimeMessage should not be specified more than once."); + + message = mesg; + continue; + } + + throw new ArgumentException ("Unknown initialization parameter: " + obj.GetType ()); + } + + if (message != null) + Message = message; + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new text/rfc822-headers MIME entity. + /// + public TextRfc822Headers () : base ("text", "rfc822-headers") + { + } + + /// + /// Dispatches to the specific visit method for this MIME entity. + /// + /// + /// This default implementation for nodes + /// calls . Override this + /// method to call into a more specific method on a derived visitor class + /// of the class. However, it should still + /// support unknown visitors by calling + /// . + /// + /// The visitor. + /// + /// is null. + /// + public override void Accept (MimeVisitor visitor) + { + if (visitor == null) + throw new ArgumentNullException (nameof (visitor)); + + visitor.VisitTextRfc822Headers (this); + } + } +} diff --git a/UnitTests/TextRfc822HeadersTests.cs b/UnitTests/TextRfc822HeadersTests.cs new file mode 100644 index 0000000000..66c5de18b7 --- /dev/null +++ b/UnitTests/TextRfc822HeadersTests.cs @@ -0,0 +1,49 @@ +// +// TextRfc822HeadersTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using NUnit.Framework; + +using MimeKit; + +namespace UnitTests +{ + [TestFixture] + public class TextRfc822HeadersTests + { + [Test] + public void TestArgumentExceptions () + { + var entity = new TextRfc822Headers (); + + Assert.Throws (() => new TextRfc822Headers ("unknown-parameter")); + Assert.Throws (() => new TextRfc822Headers (new MimeMessage (), new MimeMessage ())); + + Assert.Throws (() => entity.Accept (null)); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index b72f540064..7cab52f3a3 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -156,6 +156,7 @@ + From fef7577d0f492f9cbfc257635bf4c95f5861b558 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 25 Mar 2019 10:18:36 -0400 Subject: [PATCH 253/741] Added more unit tests for TextRfc822Headers --- UnitTests/TextRfc822HeadersTests.cs | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/UnitTests/TextRfc822HeadersTests.cs b/UnitTests/TextRfc822HeadersTests.cs index 66c5de18b7..7812ffad08 100644 --- a/UnitTests/TextRfc822HeadersTests.cs +++ b/UnitTests/TextRfc822HeadersTests.cs @@ -25,6 +25,7 @@ // using System; +using System.IO; using NUnit.Framework; @@ -45,5 +46,45 @@ public void TestArgumentExceptions () Assert.Throws (() => entity.Accept (null)); } + + class TextRfc822HeadersVisitor : MimeVisitor + { + public TextRfc822Headers Rfc822Headers; + + protected internal override void VisitTextRfc822Headers (TextRfc822Headers entity) + { + Rfc822Headers = entity; + } + } + + [Test] + public void TestSerializationAndDeserialization () + { + var message = new MimeMessage (); + message.From.Add (new MailboxAddress ("Sender Name", "sender@example.com")); + message.To.Add (new MailboxAddress ("Recipient Name", "recipient@example.com")); + message.Subject = "Content of a text/rfc822-headers part"; + + var rfc822headers = new TextRfc822Headers (new Header (HeaderId.ContentId, ""), message); + + message = new MimeMessage (); + message.From.Add (new MailboxAddress ("Postmaster", "postmaster@example.com")); + message.To.Add (new MailboxAddress ("Sender Name", "sender@example.com.com")); + message.Subject = "Sorry, but your message bounced"; + message.Body = rfc822headers; + + using (var stream = new MemoryStream ()) { + message.WriteTo (stream); + stream.Position = 0; + + message = MimeMessage.Load (stream); + + var visitor = new TextRfc822HeadersVisitor (); + visitor.Visit (message); + + Assert.IsNotNull (visitor.Rfc822Headers, "Rfc822Headers"); + Assert.AreEqual ("id@localhost", visitor.Rfc822Headers.ContentId, "ContentId"); + } + } } } From a75493f171281866f7795da5ef3c25fd3da1f757 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Mar 2019 17:18:12 -0400 Subject: [PATCH 254/741] Fixed doc comments for warnings/tips and added warning to MimeEntity.ToString() --- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 6 ++---- MimeKit/Cryptography/X509KeyUsageFlags.cs | 4 ++-- MimeKit/MimeEntity.cs | 4 +++- MimeKit/MimeMessage.cs | 8 ++++---- MimeKit/ParserOptions.cs | 12 ++++++------ MimeKit/Text/HtmlTokenizer.cs | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index dbf3a12df0..6e6d88a9c5 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -377,8 +377,7 @@ public void Import (SecureMimeContext ctx) ///
/// /// Compresses the specified entity using the specified . - /// Most mail clients, even among those that support S/MIME, - /// do not support compression. + /// Most mail clients, even among those that support S/MIME, do not support compression. /// /// The compressed entity. /// The S/MIME context to use for compressing. @@ -415,8 +414,7 @@ public static ApplicationPkcs7Mime Compress (SecureMimeContext ctx, MimeEntity e ///
/// /// Compresses the specified entity using the default . - /// Most mail clients, even among those that support S/MIME, - /// do not support compression. + /// Most mail clients, even among those that support S/MIME, do not support compression. /// /// The compressed entity. /// The entity. diff --git a/MimeKit/Cryptography/X509KeyUsageFlags.cs b/MimeKit/Cryptography/X509KeyUsageFlags.cs index 1f66f7fd6c..e5e8d090ed 100644 --- a/MimeKit/Cryptography/X509KeyUsageFlags.cs +++ b/MimeKit/Cryptography/X509KeyUsageFlags.cs @@ -33,9 +33,9 @@ namespace MimeKit.Cryptography { /// /// The X.509 Key Usage Flags can be used to determine what operations /// a certificate can be used for. - /// A value of indicates that + /// A value of indicates that /// there are no restrictions on the use of the - /// . + /// . /// [Flags] public enum X509KeyUsageFlags { diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index a6f6cdddf9..1addd074a5 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -333,7 +333,9 @@ public bool IsAttachment { /// Returns a that represents the current . ///
/// - /// Returns a that represents the current . + /// Returns a that represents the current . + /// Note: In general, the string returned from this method SHOULD NOT be used for serializing + /// the message to disk. It is recommended that you use instead. /// /// A that represents the current . public override string ToString () diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index e4539f4772..2a4c247048 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -263,10 +263,10 @@ internal byte[] MboxMarker { /// a message will contain transmission headers such as From and To along /// with metadata headers such as Subject and Date, but may include just /// about anything. - /// To access any MIME headers other than + /// To access any MIME headers other than /// , you will need to access the /// property of the . - /// + /// /// /// The list of headers. public HeaderList Headers { @@ -983,8 +983,8 @@ public IEnumerable Attachments { ///
/// /// Returns a that represents the current . - /// Note: In general, the string returned from this method SHOULD NOT be used for serializing - /// the message to disk. It is recommended that you use instead. + /// Note: In general, the string returned from this method SHOULD NOT be used for serializing + /// the message to disk. It is recommended that you use instead. /// /// A that represents the current . public override string ToString () diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 76b5290a96..d61ec5aee7 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -69,9 +69,9 @@ public class ParserOptions /// In general, you'll probably want this value to be /// (the default) as it allows maximum interoperability with existing (broken) mail clients /// and other mail software such as sloppily written perl scripts (aka spambots). - /// Even in mode, the address - /// parser is fairly liberal in what it accepts. Setting it to - /// just makes it try harder to deal with garbage input. + /// Even in mode, the address parser + /// is fairly liberal in what it accepts. Setting it to + /// just makes it try harder to deal with garbage input. /// /// The RFC compliance mode. public RfcComplianceMode AddressParserComplianceMode { get; set; } @@ -120,9 +120,9 @@ public class ParserOptions /// In general, you'll probably want this value to be /// (the default) as it allows maximum interoperability with existing (broken) mail clients /// and other mail software such as sloppily written perl scripts (aka spambots). - /// Even in mode, the parameter - /// parser is fairly liberal in what it accepts. Setting it to - /// just makes it try harder to deal with garbage input. + /// Even in mode, the parameter parser + /// is fairly liberal in what it accepts. Setting it to + /// just makes it try harder to deal with garbage input. /// /// The RFC compliance mode. public RfcComplianceMode ParameterComplianceMode { get; set; } diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 80b747a0f0..02ccc78855 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -74,8 +74,8 @@ public HtmlTokenizer (TextReader reader) ///
/// /// Gets or sets whether or not the tokenizer should decode character references. - /// Character references in attribute values will still be decoded - /// even if this value is set to false. + /// Character references in attribute values will still be decoded + /// even if this value is set to false. /// /// true if character references should be decoded; otherwise, false. public bool DecodeCharacterReferences { From 30b16528a6dc040c4a7b6f0d5af65c6f3ee42e29 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Mar 2019 17:25:14 -0400 Subject: [PATCH 255/741] No need to use "Note:" text now --- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeMessage.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 1addd074a5..116fdbeb39 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -334,7 +334,7 @@ public bool IsAttachment { ///
/// /// Returns a that represents the current . - /// Note: In general, the string returned from this method SHOULD NOT be used for serializing + /// In general, the string returned from this method SHOULD NOT be used for serializing /// the message to disk. It is recommended that you use instead. /// /// A that represents the current . diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 2a4c247048..6336116201 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -983,7 +983,7 @@ public IEnumerable Attachments { ///
/// /// Returns a that represents the current . - /// Note: In general, the string returned from this method SHOULD NOT be used for serializing + /// In general, the string returned from this method SHOULD NOT be used for serializing /// the message to disk. It is recommended that you use instead. /// /// A that represents the current . From 65f804672e34ad40e8ea02c6ad50796de23186f3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 2 Apr 2019 09:37:46 -0400 Subject: [PATCH 256/741] Added fallback for international local-parts that aren't properly encoded in utf-8 Fixes issue #477 --- MimeKit/InternetAddress.cs | 12 ++++++--- UnitTests/MailboxAddressTests.cs | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 9f40bc2305..ae517379d3 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -307,11 +307,15 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex try { token.Append (CharsetUtils.UTF8.GetString (text, start, index - start)); - } catch (DecoderFallbackException ex) { - if (throwOnError) - throw new ParseException ("Internationalized local-part tokens may only contain UTF-8 characters.", start, start, ex); + } catch (DecoderFallbackException) { + try { + token.Append (CharsetUtils.Latin1.GetString (text, start, index - start)); + } catch (DecoderFallbackException ex) { + if (throwOnError) + throw new ParseException ("Internationalized local-part tokens may only contain UTF-8 characters.", start, start, ex); - return false; + return false; + } } int cfws = index; diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 6c146f1722..8519fa798b 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -32,6 +32,7 @@ using MimeKit; using MimeKit.Cryptography; +using MimeKit.Utils; namespace UnitTests { [TestFixture] @@ -710,6 +711,50 @@ public void TestParseMailboxWithAddrspecAsUnquotedName () AssertParseFailure (text, false, 0, errorIndex, RfcComplianceMode.Strict); } + [Test] + public void TestParseLatin1EncodedAddrspec () + { + const string text = "Name <æøå@example.com>"; + var buffer = CharsetUtils.Latin1.GetBytes (text); + MailboxAddress mailbox; + + try { + Assert.IsTrue (MailboxAddress.TryParse (buffer, out mailbox), "MailboxAddress.TryParse(byte[]) should succeed."); + } catch (Exception ex) { + Assert.Fail ("MailboxAddress.TryParse(byte[]) should not throw an exception: {0}", ex); + } + + try { + Assert.IsTrue (MailboxAddress.TryParse (buffer, 0, out mailbox), "MailboxAddress.TryParse(byte[], int) should succeed."); + } catch (Exception ex) { + Assert.Fail ("MailboxAddress.TryParse(byte[], int) should not throw an exception: {0}", ex); + } + + try { + Assert.IsTrue (MailboxAddress.TryParse (buffer, 0, buffer.Length, out mailbox), "MailboxAddress.TryParse(byte[], int, int) should succeed."); + } catch (Exception ex) { + Assert.Fail ("MailboxAddress.TryParse(byte[], int, int) should not throw an exception: {0}", ex); + } + + try { + mailbox = MailboxAddress.Parse (buffer); + } catch (Exception ex) { + Assert.Fail ("MailboxAddress.Parse(string) should not throw an exception: {0}", ex); + } + + try { + mailbox = MailboxAddress.Parse (buffer, 0); + } catch (Exception ex) { + Assert.Fail ("MailboxAddress.Parse(string) should not throw an exception: {0}", ex); + } + + try { + mailbox = MailboxAddress.Parse (buffer, 0, buffer.Length); + } catch (Exception ex) { + Assert.Fail ("MailboxAddress.Parse(string) should not throw an exception: {0}", ex); + } + } + #endregion } } From 66b0630cb1eacf695d63cbc7b9d242dca2363e6a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Apr 2019 08:43:32 -0400 Subject: [PATCH 257/741] bumped version to 2.1.4 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 13 +++++++++++++ appveyor.yml | 2 +- nuget/MimeKit.nuspec | 11 ++++++----- nuget/MimeKitLite.nuspec | 10 ++++++---- 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 3313e96dcf..17dde82e69 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.3 + 2.1.4 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 0d125d2771..b61c14a849 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.3 + 2.1.4 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index d2ab565f68..114ecbbbb8 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.3.0")] -[assembly: AssemblyFileVersion ("2.1.3.0")] +[assembly: AssemblyInformationalVersion ("2.1.4.0")] +[assembly: AssemblyFileVersion ("2.1.4.0")] [assembly: AssemblyVersion ("2.1.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 59beed2d99..7da8b4e241 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,18 @@ # Release Notes +### MimeKit 2.1.4 (2019-04-13) + +* Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value. +* Improved TNEF handling of Content-Disposition and Content-Id properties. + (issue [#470](https://github.com/jstedfast/MimeKit/pull/470) and + issue [#471](https://github.com/jstedfast/MimeKit/pull/471)) +* Improved Content-Id parser to be more forgiving with improperly formatted IDs. + (issue [#472](https://github.com/jstedfast/MimeKit/issue/472)) +* Added support for the text/rfc822-headers MIME-type via the new TextRfc822Headers class. + (issue [#474](https://github.com/jstedfast/MimeKit/issue/474)) +* Added fallback logic for international email addresses that are not properly encoded in UTF-8. + (issue [#477](https://github.com/jstedfast/MimeKit/issue/477)) + ### MimeKit 2.1.3 (2019-02-24) * Fixed an NRE in X509CertificateDatabase.Dispose(). diff --git a/appveyor.yml b/appveyor.yml index d247ecdd91..bf2bd4535a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.1.3.{build} +version: 2.1.4.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index b6c87891f9..6ae84788f3 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.3 + 2.1.4 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,10 +26,11 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed an NRE in X509CertificateDatabase.Dispose(). -* Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets such as UTF-16. (issue 442) -* Fixed System.Net.Mail.MailMessage cast to MimeMessage when the ContentStream of the attachments has not been rewound to the beginning of the stream. (issue 467) -* Changed ParserOptions.AllowAddressesWithoutDomain to work as users expected and moved the old logic into ParserOptions.AllowUnquotedCommasInAddresses. (issue 465) +* Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value. +* Improved TNEF handling of Content-Disposition and Content-Id properties. (issue #470 and issue #471) +* Improved Content-Id parser to be more forgiving with improperly formatted IDs. (issue #472) +* Added support for the text/rfc822-headers MIME-type via the new TextRfc822Headers class. (issue #474) +* Added fallback logic for international email addresses that are not properly encoded in UTF-8. (issue #477) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 30ac6b95ec..77ecfba905 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.3 + 2.1.4 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,9 +26,11 @@ An Open Source library for creating and parsing MIME messages. -* Fixed TextPart.Text and GetText() to properly canonicalize EOLN for multi-byte charsets such as UTF-16. (issue 442) -* Fixed System.Net.Mail.MailMessage cast to MimeMessage when the ContentStream of the attachments has not been rewound to the beginning of the stream. (issue 467) -* Changed ParserOptions.AllowAddressesWithoutDomain to work as users expected and moved the old logic into ParserOptions.AllowUnquotedCommasInAddresses. (issue 465) +* Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value. +* Improved TNEF handling of Content-Disposition and Content-Id properties. (issue #470 and issue #471) +* Improved Content-Id parser to be more forgiving with improperly formatted IDs. (issue #472) +* Added support for the text/rfc822-headers MIME-type via the new TextRfc822Headers class. (issue #474) +* Added fallback logic for international email addresses that are not properly encoded in UTF-8. (issue #477) Xamarin Inc. en-US From d70b56538fcdcdf2de0ad8d5ad212a0df8a574c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Apr 2019 08:57:39 -0400 Subject: [PATCH 258/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 6 +++--- samples/DkimVerifier/DkimVerifier/app.config | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 4 ++-- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/App.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 6 +++--- samples/MessageReader/MessageReader/packages.config | 4 ++-- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index d0634eeaaf..fe76bd2d2c 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -29,11 +29,11 @@ x86 - - ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll + + ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.3\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.4\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/app.config b/samples/DkimVerifier/DkimVerifier/app.config index 6cf307a37d..0cac7f9a1b 100644 --- a/samples/DkimVerifier/DkimVerifier/app.config +++ b/samples/DkimVerifier/DkimVerifier/app.config @@ -4,7 +4,7 @@ - + diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index de3c8b382c..7b61262899 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -1,6 +1,6 @@  - + - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 746ef92fd5..d06829d3ad 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.1.3\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.1.4\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.1.3\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.1.4\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 777343b790..00c41e5f21 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 9b37b0def9..437ac781b4 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.1.3\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.1.4\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.1.3\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.1.4\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index b4dac97e88..3e656e8015 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/App.config b/samples/MessageReader/MessageReader/App.config index 7e74e1239f..2cbdeef832 100644 --- a/samples/MessageReader/MessageReader/App.config +++ b/samples/MessageReader/MessageReader/App.config @@ -7,7 +7,7 @@ - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index b0f67e23ed..f67e787755 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -32,11 +32,11 @@ 4 - - ..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll + + ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.3\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.4\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 2267ac353f..9a71178cd5 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From f67681849b8a57205419abaaedb0171b2cf2ca35 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Apr 2019 09:14:07 -0400 Subject: [PATCH 259/741] bumped azure build versions --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8584df0687..32a6b110c4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.1.3$(Rev:.r) +name: 2.1.4$(Rev:.r) variables: solution: 'MimeKit.sln' From 10a406cf8f628792950929e7d63b2a9b503274ca Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 15 Apr 2019 09:40:00 -0400 Subject: [PATCH 260/741] Don't encode In-Reply-To header values. Fixes issue #479 --- MimeKit/Header.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 01c146b4cc..a32ec07ebf 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -985,6 +985,7 @@ byte[] FormatRawValue (FormatOptions format, Encoding encoding) case HeaderId.Received: return EncodeReceivedHeader (Options, format, encoding, Field, textValue); case HeaderId.ResentMessageId: + case HeaderId.InReplyTo: case HeaderId.MessageId: case HeaderId.ContentId: return EncodeMessageIdHeader (Options, format, encoding, Field, textValue); From 2ae0c8c3cb228c8bc7a50766f34000dcbe981d7b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 15 Apr 2019 10:22:22 -0400 Subject: [PATCH 261/741] Added RFC for List-* headers --- RFCs.md | 1 + rfc/rfc2369.txt | 843 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 844 insertions(+) create mode 100644 rfc/rfc2369.txt diff --git a/RFCs.md b/RFCs.md index 2cc789353c..ac54e398e5 100644 --- a/RFCs.md +++ b/RFCs.md @@ -56,5 +56,6 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [1523](http://www.ietf.org/rfc/rfc1523.txt): The text/enriched MIME Content-type * [1927](http://www.ietf.org/rfc/rfc1927.txt): Suggested Additional MIME Types for Associating Documents +* [2369](http://www.ietf.org/rfc/rfc2369.txt): The Use of URLs as Meta-Syntax for Core Mail List Commands and their Transport through Message Header Fields * [2388](http://www.ietf.org/rfc/rfc2388.txt): Returning Values from Forms: multipart/form-data * [7103](http://www.ietf.org/rfc/rfc7103.txt): Advice for Safe Handling of Malformed Messages diff --git a/rfc/rfc2369.txt b/rfc/rfc2369.txt new file mode 100644 index 0000000000..77a1f68f59 --- /dev/null +++ b/rfc/rfc2369.txt @@ -0,0 +1,843 @@ + + + + + + +Network Working Group G. Neufeld +Request for Comments: 2369 Nisto +Category: Standards Track J. Baer + SkyWeyr Technologies + July 1998 + + + The Use of URLs as Meta-Syntax for Core Mail List Commands + and their Transport through Message Header Fields + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (1998). All Rights Reserved. + +Abstract + + The mailing list command specification header fields are a set of + structured fields to be added to email messages sent by email + distribution lists. Each field typically contains a URL (usually + mailto [RFC2368]) locating the relevant information or performing the + command directly. The three core header fields described in this + document are List-Help, List-Subscribe, and List-Unsubscribe. + + There are three other header fields described here which, although + not as widely applicable, will have utility for a sufficient number + of mailing lists to justify their formalization here. These are + List-Post, List-Owner and List-Archive. + + By including these header fields, list servers can make it possible + for mail clients to provide automated tools for users to perform list + functions. This could take the form of a menu item, push button, or + other user interface element. The intent is to simplify the user + experience, providing a common interface to the often cryptic and + varied mailing list manager commands. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119. + + + + + +Neufeld & Baer Standards Track [Page 1] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +1. Introduction + + This is a proposal for additional header fields to be added to email + messages sent by email distribution lists. The content of each new + field is typically a URL - usually mailto [RFC2368] - which locates + the relevant information or performs the command directly. MTAs + generating the header fields SHOULD usually include a mailto based + command, in addition to any other protocols used, in order to support + users who do not have access to non-mail-based protocols. + + Implementing these fields will be optional. Significant functionality + and convenience can be gained by including them, however. Many list + managers, especially as the proposal first gains acceptance, MAY + choose to implement only one or two of the fields. The List-Help + field is the most useful individual field since it provides an access + point to detailed user support information, and accommodates almost + all existing list managers command sets. The List-Subscribe and + List-Unsubscribe fields are also very useful, but cannot describe + some list manager syntaxes at this time (those which require variable + substitution). See appendix A.5 for an explanation. + + The description of command syntax provided by the fields can be used + by mail client applications to provide simplified and consistent user + access to email distribution list functions. This could take the form + of menu items, push buttons, or other user interface elements. The + intent is to simplify the user experience, providing a common + interface to the often cryptic and varied mailing list manager + commands. + + Consideration has been given to avoiding the creation of too many + fields, while at the same time avoiding the overloading of individual + fields and keeping the syntax clear and simple. + + The use of these fields does not remove the requirement to support + the -Request command address for mailing lists [RFC2142]. + +2. The Command Syntax + + The list header fields are subject to the encoding and character + restrictions for mail headers as described in [RFC822]. Additionally, + the URL content is further restricted to the set of URL safe + characters [RFC1738]. + + The contents of the list header fields mostly consist of angle- + bracket ('<', '>') enclosed URLs, with internal whitespace being + ignored. MTAs MUST NOT insert whitespace within the brackets, but + client applications should treat any whitespace, that might be + inserted by poorly behaved MTAs, as characters to ignore. + + + +Neufeld & Baer Standards Track [Page 2] + +RFC 2369 URLs as Meta-Syntax July 1998 + + + A list of multiple, alternate, URLs MAY be specified by a comma- + separated list of angle-bracket enclosed URLs. The URLs have order of + preference from left to right. The client application should use the + left most protocol that it supports, or knows how to access by a + separate application. By this mechanism, protocols like http may be + specified while still providing the basic mailto support for those + clients who do not have access to non-mail protocols. The client + should only use one of the available URLs for a command, using + another only if the first one used failed. + + The use of URLs allows for the use of the syntax with existing URL + supporting applications. As the standard for URLs is extended, the + list header fields will gain the benefit of those extensions. + Additionally, the use of URLs provides access to multiple transport + protocols (such as ftp and http) although it is expected that the + "mailto" protocol [RFC2368] will be the focus of most use of the list + header fields. Use of non-mailto protocols should be considered in + light of those users who do not have access to the specified + mechanism (those who only have email - with no web access). + + Command syntaxes requiring variable fields to be set by the client + (such as including the user's email address within a command) are not + supported by this implementation. However, systems using such + syntaxes SHOULD still take advantage of the List-Help field to + provide the user with detailed instructions as needed or - perhaps + more usefully - provide access to some form of structured command + interface such as an HTML-based form. + + The additional complications of supporting variable fields within the + command syntax was determined to be too difficult to support by this + protocol and would compromise the likelihood of implementation by + software authors. + + To allow for future extension, client applications MUST follow the + following guidelines for handling the contents of the header fields + described in this document: + + 1) Except where noted for specific fields, if the content of the + field (following any leading whitespace, including comments) + begins with any character other than the opening angle bracket + '<', the field SHOULD be ignored. + + 2) Any characters following an angle bracket enclosed URL SHOULD be + ignored, unless a comma is the first non-whitespace/comment + character after the closing angle bracket. + + + + + + +Neufeld & Baer Standards Track [Page 3] + +RFC 2369 URLs as Meta-Syntax July 1998 + + + 3) If a sub-item (comma-separated item) within the field is not an + angle-bracket enclosed URL, the remainder of the field (the + current, and all subsequent, sub-items) SHOULD be ignored. + +3. The List Header Fields + + This document presents header fields which will provide the + command syntax description for the 'core' and key secondary + functions of most email distribution lists. The fields implemented + on a given list SHOULD be included on all messages distributed by + the list (including command responses to individual users), and on + other messages where the message clearly applies to one distinct + list. There MUST be no more than one of each field present in any + given message. + + These fields MUST only be generated by mailing lists, not end + users. + +3.1. List-Help + + The List-Help field is the most important of the header fields + described in this document. It would be acceptable for a list + manager to include only this field, since by definition it SHOULD + direct the user to complete instructions for all other commands. + Typically, the URL specified would request the help file, perhaps + incorporating an HTML form for list commands, for the list, and + alternatively provide access to an instructive website. + + Examples: + + List-Help: (List Instructions) + List-Help: + List-Help: (Info about the list) + List-Help: , + List-Help: (FTP), + + +3.2. List-Unsubscribe + + The List-Unsubscribe field describes the command (preferably using + mail) to directly unsubscribe the user (removing them from the list). + + Examples: + + List-Unsubscribe: + List-Unsubscribe: (Use this command to get off the list) + + List-Unsubscribe: + + + +Neufeld & Baer Standards Track [Page 4] + +RFC 2369 URLs as Meta-Syntax July 1998 + + + List-Unsubscribe: , + + +3.3. List-Subscribe + + The List-Subscribe field describes the command (preferably using + mail) to directly subscribe the user (request addition to the list). + + Examples: + + List-Subscribe: + List-Subscribe: + List-Subscribe: (Use this command to join the list) + + List-Subscribe: + List-Subscribe: , + + +3.4. List-Post + + The List-Post field describes the method for posting to the list. + This is typically the address of the list, but MAY be a moderator, or + potentially some other form of submission. For the special case of a + list that does not allow posting (e.g., an announcements list), the + List-Post field may contain the special value "NO". + + Examples: + + List-Post: + List-Post: (Postings are Moderated) + List-Post: + List-Post: NO (posting not allowed on this list) + +3.5. List-Owner + + The List-Owner field identifies the path to contact a human + administrator for the list. The URL MAY contain the address of a + administrator for the list, the mail system administrator, or any + other person who can handle user contact for the list. There is no + need to specify List-Owner if it is the same person as the mail + system administrator (postmaster). + + Examples: + + List-Owner: (Contact Person for Help) + List-Owner: (Grant Neufeld) + List-Owner: + + + + +Neufeld & Baer Standards Track [Page 5] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +3.6. List-Archive + + The List-Archive field describes how to access archives for the list. + + Examples: + + List-Archive: + List-Archive: + List-Archive: (Web Archive) + +4. Supporting Nested Lists + + A list that is a sublist for another list in a nested mailing list + hierarchy will need to modify some of the List- header fields, while + leaving others as the parent list set them. + + Sublists SHOULD remove the parent list's List-Help, List-Subscribe, + List-Unsubscribe and List-Owner fields, and SHOULD insert their own + versions of those fields. + + If the sublist provides its own archive, it SHOULD replace the List- + Archive with its own. Otherwise, it MUST leave the List-Archive field + untouched. + + Dependant on how postings to the list are handled, the sublist MAY + replace the List-Post field. The appropriateness of whether to + replace List-Post is left to the determination of the individual list + managers. If the intention is that postings should be distributed to + all members of the primary list, List-Post should not be changed by a + sublist in such a way that postings will be distributed only to + members of the sublist. + +5. Security Considerations + + There are very few new security concerns generated with this + proposal. Message headers are an existing standard, designed to + easily accommodate new types. There may be concern with multiple + fields being inserted or headers being forged, but these are problems + inherent in Internet email, not specific to the protocol described in + this document. Further, the implications are relatively harmless. + + Mail list processors should not allow any user-originated list header + fields to pass through to their lists, lest they confuse the user and + have the potential to create security problems. + + On the client side, there may be some concern with posts or commands + being sent in error. It is required that the user have a chance to + confirm any action before it is executed. In the case of mailto, it + + + +Neufeld & Baer Standards Track [Page 6] + +RFC 2369 URLs as Meta-Syntax July 1998 + + + may be appropriate to create the correctly formatted message without + sending it, allowing the user to see exactly what is happening and + giving the user the opportunity to approve or discard the message + before it is sent. + + All security considerations for the use of URLs [RFC1738] apply + equally to this protocol. Mail client applications should not support + list header field URLs which could compromise the security of the + user's system. This includes the "file://" URL type which could + potentially be used to trigger the execution of a local application + on some user systems. + +6. Acknowledgements + + The numerous participants of the List-Header [5], ListMom-Talk [6], + List-Managers and MIDA-Mail mailing lists contributed much to the + formation and structure of this document. + + Keith Moore and Christopher Allen + provided guidance on the standards + process. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Neufeld & Baer Standards Track [Page 7] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +A. Background Discussion + + This proposal arose from discussions started on the ListMom-Talk + Discussion List [6]. When the discussion reached a sufficient level, + a separate list was formed for discussing this proposal, the List + Headers Mail List [5] for deeper discussion. We have included + summaries of key issues raised, in order to show some of the + alternatives examined and reasons for our decisions. + +A.1. Multiple header fields vs. a single header field + + Use of a single header field for transporting command meta-syntax was + rejected for a number of reasons. + + Such a field would require the creation of a new meta-syntax in order + to describe the list commands (as opposed to the use of the widely + deployed URL syntax which was chosen for this implementation). Every + additional layer of complexity and newness reduces the likelihood of + actual implementation because it will require additional work to + support. Also, by using the existing URL syntax, we can profit from + the end users' knowledge of that syntax and ability to use it even if + their client applications do not support the list header fields. + + Restricting the transport of meta-syntax to the use of a single + header field also introduces complications with header field size + limitations. Most individual commands can easily be described in a + single line, but describing a multitude of commands can take up many + lines in the field and runs a greater risk of being modified by an + existing server on route. + + The client implementation is also easier with multiple fields, since + each command can be supported and implemented individually, + completely independent of the others. Thus, some list managers or + mail clients can choose to implement a subset of the fields based on + the specific needs of their individual lists. + + Finally, the format described in this document is simple and well + recognized, which reduces the chances of errors in implementation and + parsing. + +A.2. URLs vs. parameter lists + + URLs are already an established syntax which is flexible, well- + defined, and in wide spread use. As its definition matures and + expands, the abilities of the list fields will grow as well, without + requiring modification of this proposal. URLs are well prepared to + handle future protocols and developments, and can easily describe the + different existing access protocols such as mailto, http and ftp. + + + +Neufeld & Baer Standards Track [Page 8] + +RFC 2369 URLs as Meta-Syntax July 1998 + + + Many clients already have functionality for recognizing, parsing, and + evaluating URLs, either internally or by passing the request to a + helper application. This makes implementation easier and more + realistic. As an example, this existing support for URL parsing + allowed us to add prototype list header functionality to existing + mail clients (Eudora and Emailer for the Macintosh) without modifying + their source code. + +A.3. Why not just create a standard command language? + + A standard command language, supported by all email list services, + would go a long way to reducing the problems of list access that + currently plague existing services. It would reduce the amount of + learning required by end users and allow for a number of common + support tools to be developed. + + However, such standardization does pose problems in the areas of + multi-lingual support and the custom needs of individual mailing + lists. The development of such a standard is also expected to be met + with a slow adoption rate by software developers and list service + providers. + + These points do not preclude the development of such a standard (in + fact, it would suggest that we should start sooner rather than + later), but we do need a solution that can be widely supported by the + current list services. + + We can support most existing list manager command syntaxes without a + standard command language. By using URLs, we allow alternate access + methods a standard command language probably wouldn't enable, such as + web based control. + + Finally, client support for a standard command language is not at all + clear or necessarily simple to implement. The variety and large + number of commands existing today would require complicated user + interfaces which could be confusing and difficult to implement. By + restricting this proposal to the core functions, the client + + implementation is much simpler, which significantly increases the + likelihood of implementation (as evidenced by the support already + announced by a number of client and server application authors). + +A.4. Internationalization + + Multilingual support is up to the URL standard. If URLs support it, + then the List- header fields support it. This is another advantage of + using URLs as the building blocks for the list header fields. + + + + +Neufeld & Baer Standards Track [Page 9] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +A.5. Variable Substitution + + Variables would allow the List- header fields to accommodate nearly + every existing list manager. However, it would immeasurably increase + the complexity of the entire proposal, and possibly involve + redefining the URL standard, or force us to use something more + complicated (and hence more difficult to implement) than URLs to + describe the command syntax. + + Parameters would either have to be mandatory (i.e. the user agent + doesn't submit the message if it doesn't know what text to + substitute) or you need a way to say "if you know this parameter, add + its text here; otherwise, do this" where "this" is either: (a) + substitute a constant string, or (b) fail. + + The reason you would want a facility like this is because some list + server applications insist on having certain parameters like users' + names, which the user agent might or might not know. e.g. listserv + insists on having a first name and a last name if you supply either + one. + + Which could lead to something like the UNIX shell syntax, where + ${foo-bar} means substitute the value of parameter "foo" if "foo" is + defined, else substitute the string "bar". Perhaps $foo would mean + "substitute the value of parameter foo if it is defined, else + substitute the empty string" + + This all seems far too complicated for the gains involved, especially + since the use of variables can often be avoided. + + The use of variables in the command syntaxes of list services appears + to be lessening and does not, in any case, apply to all commands. + While the unsubscribe and subscribe command header fields may not be + usable by those systems which require the use of variables, the help + field will still provide end users with a consistent point of access + through which they can get support for their use of the list. + +A.6. Why not use a specialized MIME part instead of header fields? + + MIME parts were considered, but because most mail clients currently + either don't support MIME or are not equipped to handle such + specialized parts - such an implementation would result in problems + for end users. It is also not as easy for many list servers to + implement MIME as it is to implement new header fields. + + However, we are looking at the design of a MIME part to more fully + describe list command syntax, as well as trying to find ways to get + it supported by the applicable software. + + + +Neufeld & Baer Standards Track [Page 10] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +A.7. Why include a Subscribe command? + + Subscribe and Unsubscribe are the key commands needed by almost every + list. Other commands, such as digest mode, are not as widely + supported. + + Additionally, users who have unsubscribed (before going on vacation, + or for whatever other reason) may want to resubscribe to a list. Or, + a message may be forwarded/bounced from a subscriber to a non- + subscriber. Or, the user may change addresses and want to subscribe + from their new address. Having the List-Subscribe field available + could certainly help in all these cases. + +A.8. The Dangers of Header Bloat + + At what point are there just too many header fields? It really + varies on a list by list basis. On some lists, the majority of users + will never be aware of a field unless the client software provides + some alternative user interface to it (akin to the Reply-To field). + On others, the users will often see the header fields of messages and + would be able to recognize the function of the URLs contained within. + + The flexibility afforded by the protocol described in this document + (in that the header fields may be individually implemented as deemed + appropriate) provides list administrators with sufficient 'room to + maneuver' to meet their individual needs. + + + + + + + + + + + + + + + + + + + + + + + + + +Neufeld & Baer Standards Track [Page 11] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +B. Client Implementation + +B.1. Guidelines + + For 'mailto' URL based commands, mail client applications may choose + to provide specialized feedback (such as presenting a dialog or + alert), instead of the actual command email message, asking for + command confirmation from the user. The feedback should identify the + message destination and command within a more descriptive + explanation. For example: + + "Do you want to send the unsubscription command 'unsubscribe + somelist' to 'somelist-request@some.host.com'? Sending the command + will result in your removal from the associated list." + + If the user has multiple email addresses supported by the mail + client, the client application should prompt the user for which + address to use when subscribing or performing some other action where + the address to use cannot be specifically determined. When + unsubscribing or such, the address that is subscribed should be used, + unless that is not known by the application and cannot be determined + from the message headers. + +B.2. Implementation Options + + The following implementation possibilities are suggested here to give + some idea as to why these new header fields will be useful, and how + they could be supported. + + In most cases, it may be helpful to disable the interface for the + commands when not applicable to the currently selected message. + +B.2.1. Key combinations and command lines + + On text based systems which utilize command lines or key + combinations, each field could be implemented as a separate command. + Thus one combination would subscribe the user, another would + unsubscribe, a third request help, etc. The commands would only be + available on messages containing the list header fields. + +B.2.2. Menu items + + On graphical systems which have menus, these commands could take the + form of a menu or sub-menu of items. For example, a "Lists" menu + might appear when viewing messages containing the header fields, with + items named "Subscribe", "Unsubscribe", "Get Help", "Post Message to + + + + + +Neufeld & Baer Standards Track [Page 12] + +RFC 2369 URLs as Meta-Syntax July 1998 + + + List", "Contact List Owner" and "Access List Archive". This menu + could be disabled when not applicable to the current message or + disappear entirely. + +B.2.3. Push Buttons and Pallettes + + On graphical window systems, buttons could be placed in the window of + the message, a toolbar, or in a floating pallette of their own. Each + button could correspond to a command, with names "Subscribe", + "Unsubscribe", "Get Help", "Post to List", "List Owner" and + "Archive". These buttons or pallettes could be disabled when not + applicable to the current message or disappear entirely. + +B.2.4 Feedback to the User + + If using a dialog interface (or other feedback element) the client + application MUST include an option for the user to review (and + possibly modify) the message before it is sent. The application may + also find it useful to provide a link to more detailed context- + sensitive assistance about mail list access in general. + +References + + [RFC822] Crocker, D., "Standard for the Format of ARPA + Internet Text Messages", STD 11, RFC 822, August 1982. + + [RFC1738] Berners-Lee, T., Masinter, L., and M. McCahill, + "Uniform Resource Locators (URL)" RFC 1738, December 1994. + + [RFC2142] Crocker, D., "Mailbox Names for Common Services, Roles and + Functions", RFC 2142, May 1997. + + [RFC2368] Hoffman, P., Masinter, L., and J. Zawinski, "The mailto URL + scheme", RFC 2368, July 1998. + + [5] "List-Header" Mail list. list-header@list.nisto.com + + + + [6] "ListMom-Talk" Mail list. listmom-talk@skyweyr.com + + + + + + + + + + + +Neufeld & Baer Standards Track [Page 13] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +Editors' Addresses + + Joshua D. Baer + Box 273 + 4902 Forbes Avenue + Pittsburgh, PA 15213-3799 + USA + + EMail: josh@skyweyr.com + + + Grant Neufeld + Calgary, Alberta + Canada + + EMail: grant@acm.org + Web: http://www.nisto.com/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Neufeld & Baer Standards Track [Page 14] + +RFC 2369 URLs as Meta-Syntax July 1998 + + +Full Copyright Statement + + Copyright (C) The Internet Society (1998). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + + + + + + + + + + + + + + + + + + + + + + + +Neufeld & Baer Standards Track [Page 15] + From 512a6f8bd797354e8173b8c7bfc655e33e25c43b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 25 Apr 2019 17:46:02 -0400 Subject: [PATCH 262/741] Fixed TNEF unit tests --- UnitTests/Tnef/TnefTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 3d111b67ba..253511e31b 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -955,7 +955,7 @@ public void TestRichTextEml () { var message = MimeMessage.Load ("../../TestData/tnef/rich-text.eml"); var tnef = message.BodyParts.OfType ().FirstOrDefault (); - var mtime = new DateTimeOffset (2018, 12, 15, 10, 17, 38, DateTimeOffset.Now.Offset); + var mtime = new DateTimeOffset (new DateTime (2018, 12, 15, 10, 17, 38)); message = tnef.ConvertToMessage (); From 8995df177f6cf6e8ceed3a64dbd3a63b327b141f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 25 Apr 2019 17:46:40 -0400 Subject: [PATCH 263/741] Be more liberal in what we accept for msg-id tokens everywhere Improved ParseUtils.TryParseMsgId() and modified MimeUtils.EnumerateReferences() and MimeUtils.ParseMessageId() to both use this newer msg-id token parser, thereby reducing code duplication. --- MimeKit/Utils/MimeUtils.cs | 138 +---------------------------- MimeKit/Utils/ParseUtils.cs | 46 +++++++--- UnitTests/Utils/MimeUtilsTests.cs | 16 ++-- UnitTests/Utils/ParseUtilsTests.cs | 12 +-- 4 files changed, 45 insertions(+), 167 deletions(-) diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 519a1b57e1..55d184759e 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -158,10 +158,8 @@ public static IEnumerable EnumerateReferences (byte[] buffer, int startI { ParseUtils.ValidateArguments (buffer, startIndex, length); - byte[] sentinels = { (byte) '>' }; int endIndex = startIndex + length; int index = startIndex; - string msgid; do { if (!ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, false)) @@ -171,74 +169,8 @@ public static IEnumerable EnumerateReferences (byte[] buffer, int startI break; if (buffer[index] == '<') { - // skip over the '<' - index++; - - if (index >= endIndex) - break; - - string localpart; - if (!InternetAddress.TryParseLocalPart (buffer, ref index, endIndex, true, false, out localpart)) - continue; - - if (index >= endIndex) - break; - - if (buffer[index] == (byte) '>') { - // The msgid token did not contain an @domain. Technically this is illegal, but for the - // sake of maximum compatibility, I guess we have no choice but to accept it... - index++; - - yield return localpart; - continue; - } - - if (buffer[index] != (byte) '@') { - // who the hell knows what we have here... ignore it and continue on? - continue; - } - - // skip over the '@' - index++; - - if (!ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, false)) - break; - - if (index >= endIndex) - break; - - if (buffer[index] == (byte) '>') { - // The msgid token was in the form "". Technically this is illegal, but for - // the sake of maximum compatibility, I guess we have no choice but to accept it... - // https://github.com/jstedfast/MimeKit/issues/102 - index++; - - yield return localpart + "@"; - continue; - } - - string domain; - if (!ParseUtils.TryParseDomain (buffer, ref index, endIndex, sentinels, false, out domain)) - continue; - - msgid = localpart + "@" + domain; - - // Note: some Message-Id's are broken and in the form "" - // https://github.com/jstedfast/MailKit/issues/138 - while (index < endIndex && buffer[index] == (byte) '@') { - int saved = index; - - index++; - - if (!ParseUtils.TryParseDomain (buffer, ref index, endIndex, sentinels, false, out domain)) { - index = saved; - break; - } - - msgid += "@" + domain; - } - - yield return msgid; + if (ParseUtils.TryParseMsgId (buffer, ref index, endIndex, true, false, out string msgid)) + yield return msgid; } else if (!ParseUtils.SkipWord (buffer, ref index, endIndex, false)) { index++; } @@ -291,75 +223,11 @@ public static string ParseMessageId (byte[] buffer, int startIndex, int length) { ParseUtils.ValidateArguments (buffer, startIndex, length); - byte[] sentinels = { (byte) '>' }; int endIndex = startIndex + length; int index = startIndex; string msgid; - if (!ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, false)) - return null; - - if (index >= endIndex) - return null; - - if (buffer[index] == '<') { - // skip over the '<' - index++; - - if (index >= endIndex) - return null; - } - - string localpart; - if (!InternetAddress.TryParseLocalPart (buffer, ref index, endIndex, true, false, out localpart)) - return null; - - if (index >= endIndex) - return null; - - if (buffer[index] == (byte) '>') { - // The msgid token did not contain an @domain. Technically this is illegal, but for the - // sake of maximum compatibility, I guess we have no choice but to accept it... - return localpart; - } - - if (buffer[index] != (byte) '@') { - // who the hell knows what we have here... - return null; - } - - // skip over the '@' - index++; - - if (!ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, false)) - return null; - - if (index >= endIndex) - return null; - - if (buffer[index] == (byte) '>') { - // The msgid token was in the form "". Technically this is illegal, but for - // the sake of maximum compatibility, I guess we have no choice but to accept it... - // https://github.com/jstedfast/MimeKit/issues/102 - return localpart + "@"; - } - - string domain; - if (!ParseUtils.TryParseDomain (buffer, ref index, endIndex, sentinels, false, out domain)) - return null; - - msgid = localpart + "@" + domain; - - // Note: some Message-Id's are broken and in the form "" - // https://github.com/jstedfast/MailKit/issues/138 - while (index < endIndex && buffer[index] == (byte) '@') { - index++; - - if (!ParseUtils.TryParseDomain (buffer, ref index, endIndex, sentinels, false, out domain)) - break; - - msgid += "@" + domain; - } + ParseUtils.TryParseMsgId (buffer, ref index, endIndex, false, false, out msgid); return msgid; } diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index e08ee1af6b..fe74e63879 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -370,7 +370,7 @@ public static bool TryParseDomain (byte[] text, ref int index, int endIndex, byt return TryParseDotAtom (text, ref index, endIndex, sentinels, throwOnError, "domain", out domain); } - static readonly byte[] GreaterThan = { (byte) '>' }; + static readonly byte[] GreaterThanOrAt = { (byte) '>', (byte) '@' }; public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool requireAngleAddr, bool throwOnError, out string msgid) { @@ -430,7 +430,8 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool return false; } - SkipWhiteSpace (text, ref index, endIndex); + if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; if (index >= endIndex) { if (angleAddr) { @@ -457,7 +458,8 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool token.Append ('.'); index++; - SkipWhiteSpace (text, ref index, endIndex); + if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; if (index >= endIndex) { if (throwOnError) @@ -474,21 +476,37 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; - if (index >= endIndex) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + if (index < endIndex && text[index] != (byte) '>') { + // Note: some Message-Id's are broken and in the form "" + // https://github.com/jstedfast/MailKit/issues/138 + do { + if (!TryParseDomain (text, ref index, endIndex, GreaterThanOrAt, throwOnError, out string domain)) + return false; - return false; - } + if (IsIdnEncoded (domain)) + domain = IdnDecode (domain); - string domain; - if (!TryParseDomain (text, ref index, endIndex, GreaterThan, throwOnError, out domain)) - return false; + token.Append (domain); - if (IsIdnEncoded (domain)) - domain = IdnDecode (domain); + if (index >= endIndex || text[index] != (byte) '@') + break; - token.Append (domain); + token.Append ('@'); + index++; + } while (true); + + if (!SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + } else { + // The msgid token was in the form "". Technically this is illegal, but for + // the sake of maximum compatibility, I guess we have no choice but to accept it... + // https://github.com/jstedfast/MimeKit/issues/102 + + //if (throwOnError) + // throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + + //return false; + } } if (angleAddr && (index >= endIndex || text[index] != '>')) { diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index 344dd1a604..be5b2c446a 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -66,6 +66,7 @@ public void TestArgumentExceptions () "", "local-part@domain1@domain2", "", "local-part@", "", "local-part", + "<:invalid-local-part;@domain.com>", ":invalid-local-part;@domain.com", }; [Test] @@ -82,11 +83,10 @@ public void TestParseGoodReferences () } } - static readonly string[] BadReferences = { + static readonly string[] BrokenReferences = { " (this is an unterminated comment...", "(this is just a comment)", "<", - "<:invalid-local-part;@domain.com>", " Date: Thu, 25 Apr 2019 17:54:37 -0400 Subject: [PATCH 264/741] Fixed TnefReader.Dispose() --- MimeKit/Tnef/TnefReader.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index 3f324df48c..59aa19fd25 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -739,7 +739,8 @@ public void Close () /// false to release only the unmanaged resources. protected virtual void Dispose (bool disposing) { - InputStream.Dispose (); + if (disposing && !closed) + InputStream.Dispose (); } /// From 0b8d48ac74b396ab68b74217aa81c62e8e90e5eb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 1 May 2019 21:23:31 -0400 Subject: [PATCH 265/741] Fixed async unit test methods to return async Task instead of async void --- UnitTests/Cryptography/DkimTests.cs | 6 +++--- UnitTests/Cryptography/PgpMimeTests.cs | 4 ++-- UnitTests/IO/ChainedStreamTests.cs | 8 +++---- UnitTests/IO/FilteredStreamTests.cs | 5 +++-- UnitTests/IO/MeasuringStreamTests.cs | 3 ++- UnitTests/IO/MemoryBlockStreamTests.cs | 5 +++-- UnitTests/MimeMessageTests.cs | 7 +++--- UnitTests/MimeParserTests.cs | 30 +++++++++++++------------- UnitTests/MimePartTests.cs | 7 +++--- UnitTests/ParserOptionsTests.cs | 3 ++- 10 files changed, 42 insertions(+), 36 deletions(-) diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index c13823341f..22b431cd5d 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -358,7 +358,7 @@ public void TestVerifyGoogleMailDkimSignature () } [Test] - public async void TestVerifyGoogleMailDkimSignatureAsync () + public async Task TestVerifyGoogleMailDkimSignatureAsync () { var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); @@ -378,7 +378,7 @@ public void TestVerifyGoogleMultipartRelatedDkimSignature () } [Test] - public async void TestVerifyGoogleMultipartRelatedDkimSignatureAsync () + public async Task TestVerifyGoogleMultipartRelatedDkimSignatureAsync () { var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "related.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); @@ -398,7 +398,7 @@ public void TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignature () } [Test] - public async void TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync () + public async Task TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync () { var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "multipart-no-end-boundary.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 4e74b08a50..93c4526e4e 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -252,7 +252,7 @@ public void TestMimeMessageSign () } [Test] - public async void TestMimeMessageSignAsync () + public async Task TestMimeMessageSignAsync () { var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); @@ -355,7 +355,7 @@ public void TestMultipartSignedSignUsingKeys () } [Test] - public async void TestMultipartSignedSignUsingKeysAsync () + public async Task TestMultipartSignedSignUsingKeysAsync () { var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; var self = new SecureMailboxAddress ("MimeKit UnitTests", "mimekit@example.com", "44CD48EEC90D8849961F36BA50DCD107AB0821A2"); diff --git a/UnitTests/IO/ChainedStreamTests.cs b/UnitTests/IO/ChainedStreamTests.cs index 1a2a166857..60451e5c99 100644 --- a/UnitTests/IO/ChainedStreamTests.cs +++ b/UnitTests/IO/ChainedStreamTests.cs @@ -160,7 +160,7 @@ public void TestRead () } [Test] - public async void TestReadAsync () + public async Task TestReadAsync () { Assert.IsTrue (chained.CanRead, "Expected to be able to read from the chained stream."); @@ -269,7 +269,7 @@ async Task AssertSeekResultsAsync (string operation) } [Test] - public async void TestRandomSeekingAsync () + public async Task TestRandomSeekingAsync () { Assert.IsTrue (chained.CanSeek, "Expected to be able to seek in the chained stream."); @@ -304,7 +304,7 @@ public async void TestRandomSeekingAsync () } [Test] - public async void TestSeekingToStreamBoundariesAsync () + public async Task TestSeekingToStreamBoundariesAsync () { long expected, actual; @@ -351,7 +351,7 @@ public void TestWrite () } [Test] - public async void TestWriteAsync () + public async Task TestWriteAsync () { var buffer = new byte[(int) chained.Length]; diff --git a/UnitTests/IO/FilteredStreamTests.cs b/UnitTests/IO/FilteredStreamTests.cs index 79e90a4a28..6f9b438843 100644 --- a/UnitTests/IO/FilteredStreamTests.cs +++ b/UnitTests/IO/FilteredStreamTests.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Threading.Tasks; using NUnit.Framework; @@ -119,7 +120,7 @@ public void TestRead () } [Test] - public async void TestReadAsync () + public async Task TestReadAsync () { using (var original = new MemoryStream ()) { using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) @@ -174,7 +175,7 @@ public void TestWrite () } [Test] - public async void TestWriteAsync () + public async Task TestWriteAsync () { using (var original = new MemoryStream ()) { using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) diff --git a/UnitTests/IO/MeasuringStreamTests.cs b/UnitTests/IO/MeasuringStreamTests.cs index 20f776ed14..200a627adf 100644 --- a/UnitTests/IO/MeasuringStreamTests.cs +++ b/UnitTests/IO/MeasuringStreamTests.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Threading.Tasks; using NUnit.Framework; @@ -78,7 +79,7 @@ public void TestWrite () } [Test] - public async void TestWriteAsync () + public async Task TestWriteAsync () { var buffer = new byte[1099]; diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index 22ddc2d7b3..42455be3cd 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Threading.Tasks; using NUnit.Framework; @@ -117,7 +118,7 @@ public void TestRead () } [Test] - public async void TestReadAsync () + public async Task TestReadAsync () { blocks.Position = 0; master.Position = 0; @@ -157,7 +158,7 @@ public void TestWrite () } [Test] - public async void TestWriteAsync () + public async Task TestWriteAsync () { var bytes = new byte[9 * 1024]; int position = 0; diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 735a8fa2ad..2d5d77af6a 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -30,6 +30,7 @@ using System.Text; using System.Net.Mail; using System.Reflection; +using System.Threading.Tasks; using NUnit.Framework; @@ -100,7 +101,7 @@ public void TestArgumentExceptions () } [Test] - public async void TestReserialization () + public async Task TestReserialization () { string rawMessageText = @"X-Andrew-Authenticated-As: 4099;greenbush.galaxy;Nathaniel Borenstein Received: from Messages.8.5.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 @@ -205,7 +206,7 @@ This is an attached message. } [Test] - public async void TestReserializationEmptyParts () + public async Task TestReserializationEmptyParts () { string rawMessageText = @"Date: Fri, 22 Jan 2016 8:44:05 -0500 (EST) From: MimeKit Unit Tests @@ -264,7 +265,7 @@ This is the body. } [Test] - public async void TestReserializationMessageParts () + public async Task TestReserializationMessageParts () { string rawMessageText = @"Path: flop.mcom.com!news.Stanford.EDU!agate!tcsi.tcs.com!uunet!vixen.cso.uiuc.edu!gateway From: Internet-Drafts@CNRI.Reston.VA.US diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 41b5384885..7ce17e7c34 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -103,7 +103,7 @@ public void TestHeaderParser () } [Test] - public async void TestHeaderParserAsync () + public async Task TestHeaderParserAsync () { var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1\r\nHeader-2: value 2\r\nHeader-3: value 3\r\n\r\n"); @@ -168,7 +168,7 @@ public void TestTruncatedHeader () } [Test] - public async void TestTruncatedHeaderAsync () + public async Task TestTruncatedHeaderAsync () { var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1"); @@ -208,7 +208,7 @@ public void TestSingleHeaderNoTerminator () } [Test] - public async void TestSingleHeaderNoTerminatorAsync () + public async Task TestSingleHeaderNoTerminatorAsync () { var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1\r\n"); @@ -244,7 +244,7 @@ public void TestEmptyHeaders () } [Test] - public async void TestEmptyHeadersAsync () + public async Task TestEmptyHeadersAsync () { var bytes = Encoding.ASCII.GetBytes ("\r\n"); @@ -353,7 +353,7 @@ public void TestDoubleMboxMarker () } [Test] - public async void TestDoubleMboxMarkerAsync () + public async Task TestDoubleMboxMarkerAsync () { var content = Encoding.ASCII.GetBytes ("From - \r\nFrom -\r\nFrom: sender@example.com\r\nTo: recipient@example.com\r\nSubject: test message\r\n\r\nBody text\r\n"); @@ -386,7 +386,7 @@ public void TestEmptyMessage () } [Test] - public async void TestEmptyMessageAsync () + public async Task TestEmptyMessageAsync () { var bytes = Encoding.ASCII.GetBytes ("\r\n"); @@ -479,7 +479,7 @@ static async Task AssertSimpleMboxAsync (Stream stream) } [Test] - public async void TestSimpleMboxAsync () + public async Task TestSimpleMboxAsync () { using (var stream = File.OpenRead (Path.Combine (MboxDataDir, "simple.mbox.txt"))) await AssertSimpleMboxAsync (stream); @@ -503,7 +503,7 @@ public void TestSimpleMboxWithByteOrderMark () } [Test] - public async void TestSimpleMboxWithByteOrderMarkAsync () + public async Task TestSimpleMboxWithByteOrderMarkAsync () { using (var stream = new MemoryStream ()) { var bom = new byte[] { 0xEF, 0xBB, 0xBF }; @@ -701,7 +701,7 @@ public void TestContentLengthMbox () } [Test] - public async void TestContentLengthMboxAsync () + public async Task TestContentLengthMboxAsync () { var options = ParserOptions.Default.Clone (); options.RespectContentLength = true; @@ -716,7 +716,7 @@ public void TestJwzMbox () } [Test] - public async void TestJwzMboxAsync () + public async Task TestJwzMboxAsync () { await TestMboxAsync (null, "jwz"); } @@ -761,7 +761,7 @@ public void TestJwzPersistentMbox () } [Test] - public async void TestJwzPersistentMboxAsync () + public async Task TestJwzPersistentMboxAsync () { var summary = File.ReadAllText (Path.Combine (MboxDataDir, "jwz-summary.txt")).Replace ("\r\n", "\n"); var builder = new StringBuilder (); @@ -814,7 +814,7 @@ public void TestJapaneseMessage () } [Test] - public async void TestJapaneseMessageAsync () + public async Task TestJapaneseMessageAsync () { const string subject = "日本語メールテスト (testing Japanese emails)"; const string body = "Let's see if both subject and body works fine...\n\n日本語が\n正常に\n送れているか\nテスト.\n"; @@ -854,7 +854,7 @@ public void TestUnmungedFromLines () } [Test] - public async void TestUnmungedFromLinesAsync () + public async Task TestUnmungedFromLinesAsync () { int count = 0; @@ -896,7 +896,7 @@ public void TestMultipartEpilogueWithText () } [Test] - public async void TestMultipartEpilogueWithTextAsync () + public async Task TestMultipartEpilogueWithTextAsync () { const string epilogue = "Peter Urka \nDept. of Chemistry, Univ. of Michigan\nNewt-thought is right-thought. Go Newt!\n\n"; @@ -941,7 +941,7 @@ public void TestMissingMessageBody () } [Test] - public async void TestMissingMessageBodyAsync () + public async Task TestMissingMessageBodyAsync () { const string text = "Date: Sat, 19 Apr 2014 13:13:23 -0700\r\n" + "From: Jeffrey Stedfast \r\n" + diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 6dcfab0eb2..0fc3883bf3 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Threading.Tasks; using NUnit.Framework; @@ -417,7 +418,7 @@ public void TestTranscoding () } [Test] - public async void TestTranscodingAsync () + public async Task TestTranscodingAsync () { var path = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); var expected = File.ReadAllBytes (path); @@ -492,7 +493,7 @@ public void TestWriteTo (string text) [TestCase ("content", TestName = "TestWriteToNoNewLine")] [TestCase ("content\r\n", TestName = "TestWriteToNewLine")] - public async void TestWriteToAsync (string text) + public async Task TestWriteToAsync (string text) { var builder = new BodyBuilder (); @@ -540,7 +541,7 @@ public void TestLoadHttpWebResponse () } [Test] - public async void TestLoadHttpWebResponseAsync () + public async Task TestLoadHttpWebResponseAsync () { var text = "This is some text and stuff." + Environment.NewLine; var contentType = new ContentType ("text", "plain"); diff --git a/UnitTests/ParserOptionsTests.cs b/UnitTests/ParserOptionsTests.cs index c46545935a..8e2eb26cc5 100644 --- a/UnitTests/ParserOptionsTests.cs +++ b/UnitTests/ParserOptionsTests.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Threading.Tasks; using NUnit.Framework; @@ -85,7 +86,7 @@ public void TestParsingOfCustomType () } [Test] - public async void TestParsingOfCustomTypeAsync () + public async Task TestParsingOfCustomTypeAsync () { var options = ParserOptions.Default.Clone (); From 9ba1fba6bcedddb98721a40a60fca11d3bdad4ca Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 1 May 2019 22:34:00 -0400 Subject: [PATCH 266/741] Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList Fixes issue #481 --- MimeKit/InternetAddress.cs | 26 +++++++++++++++++++ MimeKit/InternetAddressList.cs | 36 +++++++++++++++++++++------ UnitTests/InternetAddressListTests.cs | 5 +++- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index ae517379d3..6a84e0806c 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -213,6 +213,32 @@ public int CompareTo (InternetAddress other) #endregion + /// + /// Determines whether the specified object is equal to the current object. + /// + /// + /// The type of comparison between the current instance and the parameter depends on whether + /// the current instance is a reference type or a value type. + /// + /// The object to compare with the current object. + /// true if the specified object is equal to the current object; otherwise, false. + public override bool Equals (object obj) + { + return Equals (obj as InternetAddress); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// Returns the hash code for this instance. + /// + /// A hash code for the current object. + public override int GetHashCode () + { + return ToString ().GetHashCode (); + } + internal static string EncodeInternationalizedPhrase (string phrase) { for (int i = 0; i < phrase.Length; i++) { diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index 1a41d6e804..e02ae6d084 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -420,14 +420,8 @@ public bool Equals (InternetAddressList other) if (other.Count != Count) return false; - var otherSorted = new List (other); - otherSorted.Sort (); - - var sorted = new List (this); - sorted.Sort (); - - for (int i = 0; i < sorted.Count; i++) { - if (!sorted[i].Equals (otherSorted[i])) + for (int i = 0; i < Count; i++) { + if (!this[i].Equals (other[i])) return false; } @@ -466,6 +460,32 @@ public int CompareTo (InternetAddressList other) #endregion + /// + /// Determines whether the specified object is equal to the current object. + /// + /// + /// The type of comparison between the current instance and the parameter depends on whether + /// the current instance is a reference type or a value type. + /// + /// The object to compare with the current object. + /// true if the specified object is equal to the current object; otherwise, false. + public override bool Equals (object obj) + { + return Equals (obj as InternetAddressList); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// Returns the hash code for this instance. + /// + /// A hash code for the current object. + public override int GetHashCode () + { + return ToString ().GetHashCode (); + } + internal void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength) { for (int i = 0; i < list.Count; i++) { diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index 972395da12..d48dd5d198 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -739,7 +739,6 @@ public void TestEquality () var list2 = new InternetAddressList (); - list2.Add (new MailboxAddress ("Chandler", "chandler@friends.com")); list2.Add (new GroupAddress ("Local recipients", new InternetAddress[] { new MailboxAddress ("", "phil"), new MailboxAddress ("", "joe"), @@ -747,10 +746,14 @@ public void TestEquality () new MailboxAddress ("", "bob"), })); list2.Add (new MailboxAddress ("Joey", "joey@friends.com")); + list2.Add (new MailboxAddress ("Chandler", "chandler@friends.com")); Assert.IsFalse (list1.Equals (null), "Equals null"); Assert.IsFalse (list1.Equals (new InternetAddressList ()), "Equals empty list"); Assert.IsTrue (list1.Equals (list2), "The 2 lists should be equal."); + + Assert.IsTrue (((object) list1).Equals ((object) list2), "Equals(object)"); + Assert.AreEqual (list1.GetHashCode (), list2.GetHashCode (), "GetHashCode()"); } [Test] From 97e6398c90c904e631009fc47b5faee5c3c6aa02 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 May 2019 11:56:06 -0400 Subject: [PATCH 267/741] Don't explicitly depend on System.Net.Http for .NETStandard2.0 --- MimeKit/MimeKit.NetStandard.csproj | 5 ++++- nuget/MimeKit.nuspec | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 17dde82e69..b0bbceb158 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -42,10 +42,13 @@ - + + + + diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 6ae84788f3..1b8a127925 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -69,7 +69,7 @@ - + @@ -81,7 +81,7 @@ - + @@ -89,7 +89,6 @@ - From 8a0fe0f3cd370cf3fe1cce7b0ec7d55ce7e0587b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 7 May 2019 13:23:50 -0400 Subject: [PATCH 268/741] Make sure that SecureMimeDigitalSignature.EncryptionAlgorithms is never null Fixes https://stackoverflow.com/questions/55970468/getting-a-null-reference-while-trying-to-verify-a-signature-using-mimekit --- MimeKit/Cryptography/SecureMimeDigitalSignature.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index f82fd450a1..5a064aaac4 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -99,10 +99,10 @@ public SecureMimeDigitalSignature (SignerInformation signerInfo, X509Certificate } } } - - EncryptionAlgorithms = algorithms.ToArray (); } + EncryptionAlgorithms = algorithms.ToArray (); + if (BouncyCastleSecureMimeContext.TryGetDigestAlgorithm (signerInfo.DigestAlgorithmID, out digestAlgo)) DigestAlgorithm = digestAlgo; From 8b8b5187e18cbede9482e833048c2337b252b78d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 7 May 2019 13:37:13 -0400 Subject: [PATCH 269/741] Updated .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e45da4800f..3e871b5038 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ Mono.Data.Sqlite/Documentation *project.lock.json *.csproj.nuget.cache +*.csproj.nuget.dgspec.json *.userprefs *.user *.suo From bd6d116989a5bd98cd2d264eb2011da3354adab2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 7 May 2019 13:37:58 -0400 Subject: [PATCH 270/741] bumped bc-csharp to 1.8.5 for iOS and Android --- MimeKit/MimeKit.Android.csproj | 1 - submodules/bc-csharp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 8f19865612..39785cf69d 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -13,7 +13,6 @@ Resource Resources Assets - false MimeKit v8.0 diff --git a/submodules/bc-csharp b/submodules/bc-csharp index 068c4821fb..8238b66f1e 160000 --- a/submodules/bc-csharp +++ b/submodules/bc-csharp @@ -1 +1 @@ -Subproject commit 068c4821fbad1c703cb0a4e26b342b2abaca788d +Subproject commit 8238b66f1e4767e5d56a2e440f5fdfd2028a2d65 From 194da0b37927556c257a80882ecd39166f4bb9d2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 12 May 2019 14:37:08 -0400 Subject: [PATCH 271/741] Reduced dependencies for the netstandard framework targets Fixes issue #475 --- MimeKit/MimeKit.NetStandard.csproj | 7 ------- MimeKit/MimeKitLite.NetStandard.csproj | 6 +----- nuget/MimeKit.nuspec | 14 -------------- nuget/MimeKitLite.nuspec | 12 ------------ 4 files changed, 1 insertion(+), 38 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index b0bbceb158..0b43ec8554 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -35,20 +35,13 @@ - - - - - - - diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index b61c14a849..dc542004da 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -31,17 +31,13 @@ - $(DefineConstants);ENABLE_SNM + $(DefineConstants);NETSTANDARD_2_0;ENABLE_SNM - - - - diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 1b8a127925..8ee8476adc 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -57,37 +57,23 @@ - - - - - - - - - - - - - - diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 77ecfba905..d7435d89d5 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -49,31 +49,19 @@ - - - - - - - - - - - - From e3cb4763075bad6131bc3360d2b95f49057020c9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 May 2019 08:20:02 -0400 Subject: [PATCH 272/741] Bumped version to 2.1.5 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- ReleaseNotes.md | 16 ++++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 15 +++++++++------ nuget/MimeKitLite.nuspec | 12 ++++++------ 7 files changed, 35 insertions(+), 16 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 0b43ec8554..fb1b206050 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.4 + 2.1.5 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index dc542004da..cec5d2a6ad 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.4 + 2.1.5 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 7da8b4e241..4597b52217 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,21 @@ # Release Notes +### MimeKit 2.1.5 (2019-05-13) + +* Updated the BouncyCastle assemblies to version 1.8.5 for iOS and Android. +* Fixed a possible NullReferenceException when decoding S/MIME digital signatures. +* Fixed the netstandard2.0 dependencies to no longer explicitly include System.Net.Http. + (issue [#482](https://github.com/jstedfast/MimeKit/issues/482)) +* Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList. + (issue [#481](https://github.com/jstedfast/MimeKit/issues/481)) +* Fixed TnefReader.Dispose() to avoid a potential NullReferenceException if double disposed. +* Fixed the Message-Id, Content-Id, References and In-Reply-To parsers to be more liberal + in what they accept in terms of the `msg-id` token. +* Changed the Header encoding logic for the In-Reply-To header to not rfc2047 encode the value + even if it is longer than the suggested line-length. + (issue [#479](https://github.com/jstedfast/MimeKit/issues/479)) +* Reduced netstandard dependencies. (issue [#475](https://github.com/jstedfast/MimeKit/issues/475)) + ### MimeKit 2.1.4 (2019-04-13) * Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value. diff --git a/appveyor.yml b/appveyor.yml index bf2bd4535a..d14382ba27 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.1.4.{build} +version: 2.1.5.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 32a6b110c4..1a322f6007 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.1.4$(Rev:.r) +name: 2.1.5$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 8ee8476adc..7e7128d7cf 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.4 + 2.1.5 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,11 +26,14 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value. -* Improved TNEF handling of Content-Disposition and Content-Id properties. (issue #470 and issue #471) -* Improved Content-Id parser to be more forgiving with improperly formatted IDs. (issue #472) -* Added support for the text/rfc822-headers MIME-type via the new TextRfc822Headers class. (issue #474) -* Added fallback logic for international email addresses that are not properly encoded in UTF-8. (issue #477) +* Updated the BouncyCastle assemblies to version 1.8.5 for iOS and Android. +* Fixed a possible NullReferenceException when decoding S/MIME digital signatures. +* Fixed the netstandard2.0 dependencies to no longer explicitly include System.Net.Http. (issue #482) +* Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList. (issue #481) +* Fixed TnefReader.Dispose() to avoid a potential NullReferenceException if double disposed. +* Fixed the Message-Id, Content-Id, References and In-Reply-To parsers to be more liberal in what they accept in terms of the `msg-id` token. +* Changed the Header encoding logic for the In-Reply-To header to not rfc2047 encode the value even if it is longer than the suggested line-length. (issue #479) +* Reduced netstandard dependencies. (issue #475) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index d7435d89d5..c013d84d77 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.4 + 2.1.5 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,11 +26,11 @@ An Open Source library for creating and parsing MIME messages. -* Added a setter for FormatOptions.MaxLineLength, allowing developers to override this value. -* Improved TNEF handling of Content-Disposition and Content-Id properties. (issue #470 and issue #471) -* Improved Content-Id parser to be more forgiving with improperly formatted IDs. (issue #472) -* Added support for the text/rfc822-headers MIME-type via the new TextRfc822Headers class. (issue #474) -* Added fallback logic for international email addresses that are not properly encoded in UTF-8. (issue #477) +* Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList. (issue #481) +* Fixed TnefReader.Dispose() to avoid a potential NullReferenceException if double disposed. +* Fixed the Message-Id, Content-Id, References and In-Reply-To parsers to be more liberal in what they accept in terms of the `msg-id` token. +* Changed the Header encoding logic for the In-Reply-To header to not rfc2047 encode the value even if it is longer than the suggested line-length. (issue #479) +* Reduced netstandard dependencies. (issue #475) Xamarin Inc. en-US From bd86f87bb3dbab9b007ca6e48c847137d1da5256 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 May 2019 08:46:18 -0400 Subject: [PATCH 273/741] Updated samples --- samples/DkimVerifier/DkimVerifier.sln | 11 +++++++++-- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.sln | 7 +++++-- .../MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- samples/MessageReader.iOS/MessageReader.iOS.sln | 3 +++ .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader.sln | 7 +++++-- .../MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 12 files changed, 34 insertions(+), 18 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier.sln b/samples/DkimVerifier/DkimVerifier.sln index 940213cb8e..34d8899694 100644 --- a/samples/DkimVerifier/DkimVerifier.sln +++ b/samples/DkimVerifier/DkimVerifier.sln @@ -1,6 +1,7 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.572 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DkimVerifier", "DkimVerifier\DkimVerifier.csproj", "{0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}" EndProject Global @@ -14,4 +15,10 @@ Global {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Release|x86.ActiveCfg = Release|x86 {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Release|x86.Build.0 = Release|x86 EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {469B0A01-06AE-4F83-9EF7-CC8053651B75} + EndGlobalSection EndGlobal diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index fe76bd2d2c..cdd8026c61 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.4\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.5\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 7b61262899..de8629d69b 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android.sln b/samples/MessageReader.Android/MessageReader.Android.sln index 08cc24fb8d..7d762ac329 100644 --- a/samples/MessageReader.Android/MessageReader.Android.sln +++ b/samples/MessageReader.Android/MessageReader.Android.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.572 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageReader.Android", "MessageReader.Android\MessageReader.Android.csproj", "{215D2B5C-8D37-4CB1-8196-B30A3ECFE2B6}" EndProject @@ -19,6 +19,9 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {03EAE69B-2102-4CDF-A274-10F2F7E6F9F9} + EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = MessageReader.Android\MessageReader.Android.csproj EndGlobalSection diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index d06829d3ad..9a570f54e0 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -55,11 +55,11 @@ False - - ..\packages\MimeKit.2.1.4\lib\monoandroid\BouncyCastle.dll + + ..\packages\MimeKit.2.1.5\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.1.4\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.1.5\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 00c41e5f21..78ee1a15db 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS.sln b/samples/MessageReader.iOS/MessageReader.iOS.sln index 5b4467314e..484ead9bbe 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS.sln +++ b/samples/MessageReader.iOS/MessageReader.iOS.sln @@ -33,6 +33,9 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3689B0D3-C33B-4BE1-A7BD-A5DEBFB67496} + EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = MessageReader.iOS\MessageReader.iOS.csproj EndGlobalSection diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 437ac781b4..982967e7b0 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -67,11 +67,11 @@ Default - - ..\packages\MimeKit.2.1.4\lib\xamarinios\BouncyCastle.dll + + ..\packages\MimeKit.2.1.5\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.1.4\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.1.5\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 3e656e8015..0d11921e7d 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader.sln b/samples/MessageReader/MessageReader.sln index d64e220940..90fc43a786 100644 --- a/samples/MessageReader/MessageReader.sln +++ b/samples/MessageReader/MessageReader.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.572 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageReader", "MessageReader\MessageReader.csproj", "{B9E3F73F-F805-4E5F-AF4D-E483A9AAA890}" EndProject @@ -19,4 +19,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9CFBF477-70C0-42FE-A071-E1E15FF149E4} + EndGlobalSection EndGlobal diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index f67e787755..f9b55f48b1 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.4\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.5\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 9a71178cd5..9ffb04bec6 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 35f02e161501b1d2b778f6403890fdc76a7cd4d1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 May 2019 09:25:03 -0400 Subject: [PATCH 274/741] Bumped Assembly version to 2.1.5 (oops) --- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 114ecbbbb8..e7c1f84319 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.4.0")] -[assembly: AssemblyFileVersion ("2.1.4.0")] +[assembly: AssemblyInformationalVersion ("2.1.5.0")] +[assembly: AssemblyFileVersion ("2.1.5.0")] [assembly: AssemblyVersion ("2.1.0.0")] From c4100a2a731db71c3d0294af5d56b1cc180db8e7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 May 2019 09:57:17 -0400 Subject: [PATCH 275/741] Bumped version to 2.1.5.1 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- nuget/MimeKit.nuspec | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index fb1b206050..a80f578dc7 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.5 + 2.1.5.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index cec5d2a6ad..970564d66f 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.5 + 2.1.5.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index e7c1f84319..f124522881 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.5.0")] -[assembly: AssemblyFileVersion ("2.1.5.0")] +[assembly: AssemblyInformationalVersion ("2.1.5.1")] +[assembly: AssemblyFileVersion ("2.1.5.1")] [assembly: AssemblyVersion ("2.1.0.0")] diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 7e7128d7cf..68b86a59de 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.5 + 2.1.5.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast From 89a7b5a1ff7e215d0dbb88af9ebd7d9c8e0482cc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 May 2019 10:12:02 -0400 Subject: [PATCH 276/741] Updated samples --- nuget/MimeKitLite.nuspec | 2 +- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index c013d84d77..b82b6a262b 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.5 + 2.1.5.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index cdd8026c61..9c8746e8d7 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.5\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.5.1\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index de8629d69b..ebc3992b30 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 9a570f54e0..e969a0d053 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.1.5\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.1.5.1\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.1.5\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.1.5.1\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 78ee1a15db..404ca43163 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 982967e7b0..ca48852ad9 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.1.5\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.1.5.1\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.1.5\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.1.5.1\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 0d11921e7d..286cbbaf5b 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index f9b55f48b1..0902b59b02 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.1.5\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.1.5.1\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 9ffb04bec6..141a8832c5 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 7cee6df2b64489ba1782ed9188dc736c267444cb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 30 May 2019 21:26:44 -0400 Subject: [PATCH 277/741] Added initial support for verifying ARC-Message-Signature headers --- MimeKit/MimeMessage.cs | 170 ++++++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 80 deletions(-) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 6336116201..23565c871a 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -29,6 +29,7 @@ using System.Text; using System.Linq; using System.Threading; +using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; @@ -2017,73 +2018,82 @@ static IDictionary ParseDkimSignature (string signature) return parameters; } - static void ValidateDkimSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + static void ValidateSignatureParameters (IDictionary parameters, HeaderId header, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) { bool containsFrom = false; - string v, a, c, h, l, id; - if (!parameters.TryGetValue ("v", out v)) - throw new FormatException ("Malformed DKIM-Signature header: no version parameter detected."); + if (header == HeaderId.DkimSignature) { + if (!parameters.TryGetValue ("v", out string v)) + throw new FormatException ("Malformed DKIM-Signature header: no version parameter detected."); - if (v != "1") - throw new FormatException (string.Format ("Unrecognized DKIM-Signature version: v={0}", v)); + if (v != "1") + throw new FormatException (string.Format ("Unrecognized DKIM-Signature version: v={0}", v)); + } - if (!parameters.TryGetValue ("a", out a)) - throw new FormatException ("Malformed DKIM-Signature header: no signature algorithm parameter detected."); + if (!parameters.TryGetValue ("a", out string a)) + throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header.ToHeaderName ())); switch (a.ToLowerInvariant ()) { case "rsa-sha256": algorithm = DkimSignatureAlgorithm.RsaSha256; break; case "rsa-sha1": algorithm = DkimSignatureAlgorithm.RsaSha1; break; - default: throw new FormatException (string.Format ("Unrecognized DKIM-Signature algorithm parameter: a={0}", a)); + default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header.ToHeaderName (), a)); } if (!parameters.TryGetValue ("d", out d)) - throw new FormatException ("Malformed DKIM-Signature header: no domain parameter detected."); + throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header.ToHeaderName ())); - if (parameters.TryGetValue ("i", out id)) { - string ident; - int at; + if (parameters.TryGetValue ("i", out string id)) { + switch (header) { + case HeaderId.DkimSignature: + string ident; + int at; - if ((at = id.LastIndexOf ('@')) == -1) - throw new FormatException ("Malformed DKIM-Signature header: no @ in the AUID value."); + if ((at = id.LastIndexOf ('@')) == -1) + throw new FormatException ("Malformed DKIM-Signature header: no @ in the AUID value."); - ident = id.Substring (at + 1); + ident = id.Substring (at + 1); - if (!ident.Equals (d, StringComparison.OrdinalIgnoreCase) && !ident.EndsWith ("." + d, StringComparison.OrdinalIgnoreCase)) - throw new FormatException ("Invalid DKIM-Signature header: the domain in the AUID does not match the domain parameter."); + if (!ident.Equals (d, StringComparison.OrdinalIgnoreCase) && !ident.EndsWith ("." + d, StringComparison.OrdinalIgnoreCase)) + throw new FormatException ("Invalid DKIM-Signature header: the domain in the AUID does not match the domain parameter."); + break; + case HeaderId.ArcMessageSignature: + if (!int.TryParse (id, NumberStyles.Integer, CultureInfo.InvariantCulture, out int i) || i < 1 || i > 50) + throw new FormatException ("Malformed ARC-Message-Signature header: invalid instance value."); + break; + } } if (!parameters.TryGetValue ("s", out s)) - throw new FormatException ("Malformed DKIM-Signature header: no selector parameter detected."); + throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header.ToHeaderName ())); if (!parameters.TryGetValue ("q", out q)) q = "dns/txt"; - if (parameters.TryGetValue ("l", out l)) { + if (parameters.TryGetValue ("l", out string l)) { if (!int.TryParse (l, out maxLength)) - throw new FormatException (string.Format ("Malformed DKIM-Signature header: invalid length parameter: l={0}", l)); + throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header.ToHeaderName (), l)); } else { maxLength = -1; } - if (parameters.TryGetValue ("c", out c)) { + if (parameters.TryGetValue ("c", out string c)) { var tokens = c.ToLowerInvariant ().Split ('/'); if (tokens.Length == 0 || tokens.Length > 2) - throw new FormatException (string.Format ("Malformed DKIM-Signature header: invalid canonicalization parameter: c={0}", c)); + throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header.ToHeaderName (), c)); switch (tokens[0]) { case "relaxed": headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; case "simple": headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed DKIM-Signature header: invalid canonicalization parameter: c={0}", c)); + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header.ToHeaderName (), c)); } if (tokens.Length == 2) { switch (tokens[1]) { case "relaxed": bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; case "simple": bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed DKIM-Signature header: invalid canonicalization parameter: c={0}", c)); + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header.ToHeaderName (), c)); } } else { bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; @@ -2093,8 +2103,8 @@ static void ValidateDkimSignatureParameters (IDictionary paramet bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; } - if (!parameters.TryGetValue ("h", out h)) - throw new FormatException ("Malformed DKIM-Signature header: no signed header parameter detected."); + if (!parameters.TryGetValue ("h", out string h)) + throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header.ToHeaderName ())); headers = h.Split (':'); for (int i = 0; i < headers.Length; i++) { @@ -2105,19 +2115,19 @@ static void ValidateDkimSignatureParameters (IDictionary paramet } if (!containsFrom) - throw new FormatException (string.Format ("Malformed DKIM-Signature header: From header not signed.")); + throw new FormatException (string.Format ("Malformed {0} header: From header not signed.", header.ToHeaderName ())); if (!parameters.TryGetValue ("bh", out bh)) - throw new FormatException ("Malformed DKIM-Signature header: no body hash parameter detected."); + throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header.ToHeaderName ())); if (!parameters.TryGetValue ("b", out b)) - throw new FormatException ("Malformed DKIM-Signature header: no signature parameter detected."); + throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header.ToHeaderName ())); } - static Header GetSignedDkimSignatureHeader (Header dkimSignature) + static Header GetSignedSignatureHeader (Header header) { // modify the raw DKIM-Signature header value by chopping off the signature value after the "b=" - var rawValue = (byte[]) dkimSignature.RawValue.Clone (); + var rawValue = (byte[]) header.RawValue.Clone (); int length = 0, index = 0; do { @@ -2155,31 +2165,31 @@ static Header GetSignedDkimSignatureHeader (Header dkimSignature) } while (index < rawValue.Length); if (index == rawValue.Length) - throw new FormatException ("Malformed DKIM-Signature header: missing signature parameter."); + throw new FormatException (string.Format ("Malformed {0} header: missing signature parameter.", header.Id.ToHeaderName ())); while (index < rawValue.Length) rawValue[length++] = rawValue[index++]; Array.Resize (ref rawValue, length); - return new Header (dkimSignature.Options, dkimSignature.RawField, rawValue); + return new Header (header.Options, header.RawField, rawValue); } - async Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) + async Task VerifyAsync (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) { if (options == null) throw new ArgumentNullException (nameof (options)); - if (dkimSignature == null) - throw new ArgumentNullException (nameof (dkimSignature)); + if (signature == null) + throw new ArgumentNullException (nameof (signature)); - if (dkimSignature.Id != HeaderId.DkimSignature) - throw new ArgumentException ("The dkimSignature parameter MUST be a DKIM-Signature header.", nameof (dkimSignature)); + if (signature.Id != HeaderId.DkimSignature && signature.Id != HeaderId.ArcMessageSignature) + throw new ArgumentException ("The signature parameter MUST be a DKIM-Signature or ARC-Message-Signature header.", nameof (signature)); if (publicKeyLocator == null) throw new ArgumentNullException (nameof (publicKeyLocator)); - var parameters = ParseDkimSignature (dkimSignature.Value); + var parameters = ParseDkimSignature (signature.Value); DkimCanonicalizationAlgorithm headerAlgorithm, bodyAlgorithm; DkimSignatureAlgorithm signatureAlgorithm; AsymmetricKeyParameter key; @@ -2187,8 +2197,8 @@ async Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkim string[] headers; int maxLength; - ValidateDkimSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, - out d, out s, out q, out headers, out bh, out b, out maxLength); + ValidateSignatureParameters (parameters, signature.Id, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, + out d, out s, out q, out headers, out bh, out b, out maxLength); if (doAsync) key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); @@ -2210,9 +2220,9 @@ async Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkim DkimWriteHeaders (options, headers, headerAlgorithm, filtered); - // now include the DKIM-Signature header that we are verifying, + // now include the DKIM-Signature or ARC-Message-Signature header that we are verifying, // but only after removing the "b=" signature value. - var header = GetSignedDkimSignatureHeader (dkimSignature); + var header = GetSignedSignatureHeader (signature); switch (headerAlgorithm) { case DkimCanonicalizationAlgorithm.Relaxed: @@ -2231,137 +2241,137 @@ async Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkim } /// - /// Verify the specified DKIM-Signature header. + /// Verify the specified DKIM-Signature or ARC-Message-Signature header. /// /// - /// Verifies the specified DKIM-Signature header. + /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. /// /// /// /// - /// true if the DKIM-Signature is valid; otherwise, false. + /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. /// The formatting options. - /// The DKIM-Signature header. + /// The DKIM-Signature or ARC-Message-Signature header. /// The public key locator service. /// The cancellation token. /// /// is null. /// -or- - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature header. + /// is not a DKIM-Signature or ARC-Message-Signature header. /// /// - /// The DKIM-Signature header value is malformed. + /// The DKIM-Signature or ARC-Message-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public bool Verify (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public bool Verify (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (options, dkimSignature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); + return VerifyAsync (options, signature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); } /// - /// Asynchronously verify the specified DKIM-Signature header. + /// Asynchronously verify the specified DKIM-Signature or ARC-Message-Signature header. /// /// - /// Verifies the specified DKIM-Signature header. + /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. /// /// /// /// - /// true if the DKIM-Signature is valid; otherwise, false. + /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. /// The formatting options. - /// The DKIM-Signature header. + /// The DKIM-Signature or ARC-Message-Signature header. /// The public key locator service. /// The cancellation token. /// /// is null. /// -or- - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature header. + /// is not a DKIM-Signature or ARC-Message-Signature header. /// /// - /// The DKIM-Signature header value is malformed. + /// The DKIM-Signature or ARC-Message-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public Task VerifyAsync (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (options, dkimSignature, publicKeyLocator, true, cancellationToken); + return VerifyAsync (options, signature, publicKeyLocator, true, cancellationToken); } /// - /// Verify the specified DKIM-Signature header. + /// Verify the specified DKIM-Signature or ARC-Message-Signature header. /// /// - /// Verifies the specified DKIM-Signature header. + /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. /// /// /// /// - /// true if the DKIM-Signature is valid; otherwise, false. - /// The DKIM-Signature header. + /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. + /// The DKIM-Signature or ARC-Message-Signature header. /// The public key locator service. /// The cancellation token. /// - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature header. + /// is not a DKIM-Signature or ARC-Message-Signature header. /// /// - /// The DKIM-Signature header value is malformed. + /// The DKIM-Signature or ARC-Message-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public bool Verify (Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public bool Verify (Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return Verify (FormatOptions.Default, dkimSignature, publicKeyLocator, cancellationToken); + return Verify (FormatOptions.Default, signature, publicKeyLocator, cancellationToken); } /// - /// Asynchronously verify the specified DKIM-Signature header. + /// Asynchronously verify the specified DKIM-Signature or ARC-Message-Signature header. /// /// - /// Verifies the specified DKIM-Signature header. + /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. /// /// /// /// - /// true if the DKIM-Signature is valid; otherwise, false. - /// The DKIM-Signature header. + /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. + /// The DKIM-Signature or ARC-Message-Signature header. /// The public key locator service. /// The cancellation token. /// - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature header. + /// is not a DKIM-Signature or ARC-Message-Signature header. /// /// - /// The DKIM-Signature header value is malformed. + /// The DKIM-Signature or ARC-Message-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public Task VerifyAsync (Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public Task VerifyAsync (Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (FormatOptions.Default, dkimSignature, publicKeyLocator, cancellationToken); + return VerifyAsync (FormatOptions.Default, signature, publicKeyLocator, cancellationToken); } /// From 3e0ef2fd39a4809b46883f56d4407608da8f6a82 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 31 May 2019 11:48:25 -0400 Subject: [PATCH 278/741] Go back to making MimeMessage.Verify*() specific to DKIM-Signature headers It turns out that verifying/validating ARC is more complicated and it would not make sense to validate ARC seals/signatures using the same API. ARC seals/signatures need to be validated as part of a set. --- MimeKit/MimeMessage.cs | 111 +++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 53 deletions(-) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 23565c871a..893b61dcc0 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1980,7 +1980,7 @@ static bool IsWhiteSpace (char c) return c == ' ' || c == '\t'; } - static IDictionary ParseDkimSignature (string signature) + static IDictionary ParseSignatureParameters (HeaderId header, string signature) { var parameters = new Dictionary (MimeUtils.OrdinalIgnoreCase); @@ -2010,7 +2010,7 @@ static IDictionary ParseDkimSignature (string signature) } if (parameters.ContainsKey (name)) - throw new FormatException (string.Format ("Malformed DKIM-Signature value: duplicate parameter '{0}'.", name)); + throw new FormatException (string.Format ("Malformed {0} value: duplicate parameter '{1}'.", header.ToHeaderName (), name)); parameters.Add (name, value.ToString ()); } @@ -2175,21 +2175,9 @@ static Header GetSignedSignatureHeader (Header header) return new Header (header.Options, header.RawField, rawValue); } - async Task VerifyAsync (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) + async Task GenericVerifyAsync (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) { - if (options == null) - throw new ArgumentNullException (nameof (options)); - - if (signature == null) - throw new ArgumentNullException (nameof (signature)); - - if (signature.Id != HeaderId.DkimSignature && signature.Id != HeaderId.ArcMessageSignature) - throw new ArgumentException ("The signature parameter MUST be a DKIM-Signature or ARC-Message-Signature header.", nameof (signature)); - - if (publicKeyLocator == null) - throw new ArgumentNullException (nameof (publicKeyLocator)); - - var parameters = ParseDkimSignature (signature.Value); + var parameters = ParseSignatureParameters (signature.Id, signature.Value); DkimCanonicalizationAlgorithm headerAlgorithm, bodyAlgorithm; DkimSignatureAlgorithm signatureAlgorithm; AsymmetricKeyParameter key; @@ -2220,7 +2208,7 @@ async Task VerifyAsync (FormatOptions options, Header signature, IDkimPubl DkimWriteHeaders (options, headers, headerAlgorithm, filtered); - // now include the DKIM-Signature or ARC-Message-Signature header that we are verifying, + // now include the DKIM-Signature header that we are verifying, // but only after removing the "b=" signature value. var header = GetSignedSignatureHeader (signature); @@ -2240,138 +2228,155 @@ async Task VerifyAsync (FormatOptions options, Header signature, IDkimPubl } } + Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (dkimSignature == null) + throw new ArgumentNullException (nameof (dkimSignature)); + + if (dkimSignature.Id != HeaderId.DkimSignature) + throw new ArgumentException ("The signature parameter MUST be a DKIM-Signature header.", nameof (dkimSignature)); + + if (publicKeyLocator == null) + throw new ArgumentNullException (nameof (publicKeyLocator)); + + return GenericVerifyAsync (options, dkimSignature, publicKeyLocator, doAsync, cancellationToken); + } + /// - /// Verify the specified DKIM-Signature or ARC-Message-Signature header. + /// Verify the specified DKIM-Signature header. /// /// - /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. + /// Verifies the specified DKIM-Signature header. /// /// /// /// - /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. + /// true if the DKIM-Signature is valid; otherwise, false. /// The formatting options. - /// The DKIM-Signature or ARC-Message-Signature header. + /// The DKIM-Signature header. /// The public key locator service. /// The cancellation token. /// /// is null. /// -or- - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature or ARC-Message-Signature header. + /// is not a DKIM-Signature header. /// /// - /// The DKIM-Signature or ARC-Message-Signature header value is malformed. + /// The DKIM-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public bool Verify (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public bool Verify (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (options, signature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); + return VerifyAsync (options, dkimSignature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); } /// - /// Asynchronously verify the specified DKIM-Signature or ARC-Message-Signature header. + /// Asynchronously verify the specified DKIM-Signature header. /// /// - /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. + /// Verifies the specified DKIM-Signature header. /// /// /// /// - /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. + /// true if the DKIM-Signature is valid; otherwise, false. /// The formatting options. - /// The DKIM-Signature or ARC-Message-Signature header. + /// The DKIM-Signature header. /// The public key locator service. /// The cancellation token. /// /// is null. /// -or- - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature or ARC-Message-Signature header. + /// is not a DKIM-Signature header. /// /// - /// The DKIM-Signature or ARC-Message-Signature header value is malformed. + /// The DKIM-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public Task VerifyAsync (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (options, signature, publicKeyLocator, true, cancellationToken); + return VerifyAsync (options, dkimSignature, publicKeyLocator, true, cancellationToken); } /// - /// Verify the specified DKIM-Signature or ARC-Message-Signature header. + /// Verify the specified DKIM-Signature header. /// /// - /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. + /// Verifies the specified DKIM-Signature header. /// /// /// /// - /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. - /// The DKIM-Signature or ARC-Message-Signature header. + /// true if the DKIM-Signature is valid; otherwise, false. + /// The DKIM-Signature header. /// The public key locator service. /// The cancellation token. /// - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature or ARC-Message-Signature header. + /// is not a DKIM-Signature header. /// /// - /// The DKIM-Signature or ARC-Message-Signature header value is malformed. + /// The DKIM-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public bool Verify (Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public bool Verify (Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return Verify (FormatOptions.Default, signature, publicKeyLocator, cancellationToken); + return Verify (FormatOptions.Default, dkimSignature, publicKeyLocator, cancellationToken); } /// - /// Asynchronously verify the specified DKIM-Signature or ARC-Message-Signature header. + /// Asynchronously verify the specified DKIM-Signature header. /// /// - /// Verifies the specified DKIM-Signature or ARC-Message-Signature header. + /// Verifies the specified DKIM-Signature header. /// /// /// /// - /// true if the DKIM-Signature or ARC-Message-Signature is valid; otherwise, false. - /// The DKIM-Signature or ARC-Message-Signature header. + /// true if the DKIM-Signature is valid; otherwise, false. + /// The DKIM-Signature header. /// The public key locator service. /// The cancellation token. /// - /// is null. + /// is null. /// -or- /// is null. /// /// - /// is not a DKIM-Signature or ARC-Message-Signature header. + /// is not a DKIM-Signature header. /// /// - /// The DKIM-Signature or ARC-Message-Signature header value is malformed. + /// The DKIM-Signature header value is malformed. /// /// /// The operation was canceled via the cancellation token. /// - public Task VerifyAsync (Header signature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) + public Task VerifyAsync (Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (FormatOptions.Default, signature, publicKeyLocator, cancellationToken); + return VerifyAsync (FormatOptions.Default, dkimSignature, publicKeyLocator, cancellationToken); } /// From cc53f4e867789073416e38b67070b4aca32122e3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 31 May 2019 11:51:05 -0400 Subject: [PATCH 279/741] Added some initial ARC validation unit tests These tests are not currently included in MimeKit's test suite but are added to the repo for future use. Tests come from https://github.com/ValiMail/arc_test_suite --- UnitTests/Cryptography/ArcValidationTests.cs | 9564 ++++++++++++++++++ 1 file changed, 9564 insertions(+) create mode 100644 UnitTests/Cryptography/ArcValidationTests.cs diff --git a/UnitTests/Cryptography/ArcValidationTests.cs b/UnitTests/Cryptography/ArcValidationTests.cs new file mode 100644 index 0000000000..f2cc091012 --- /dev/null +++ b/UnitTests/Cryptography/ArcValidationTests.cs @@ -0,0 +1,9564 @@ +// +// ArcValidationTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; + +using NUnit.Framework; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; + +using MimeKit; +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography +{ + [TestFixture] + public class ArcValidationTests + { + enum ArcValidationResult + { + None, + Pass, + Fail + } + + class ArcPublicKeyLocator : IDkimPublicKeyLocator + { + readonly Dictionary keys; + + public ArcPublicKeyLocator () + { + keys = new Dictionary (); + } + + public void Add (string key, string value) + { + keys.Add (key, value); + } + + public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + var query = selector + "._domainkey." + domain; + + if (keys.TryGetValue (query, out string txt)) { + AsymmetricKeyParameter pubkey; + string k = null, p = null; + int index = 0; + + // parse the response (will look something like: "k=rsa; p=") + while (index < txt.Length) { + while (index < txt.Length && char.IsWhiteSpace (txt[index])) + index++; + + if (index == txt.Length) + break; + + // find the end of the key + int startIndex = index; + while (index < txt.Length && txt[index] != '=') + index++; + + if (index == txt.Length) + break; + + var key = txt.Substring (startIndex, index - startIndex); + + // skip over the '=' + index++; + + // find the end of the value + startIndex = index; + while (index < txt.Length && txt[index] != ';') + index++; + + var value = txt.Substring (startIndex, index - startIndex).Replace (" ", ""); + + switch (key) { + case "k": k = value; break; + case "p": p = value; break; + } + + // skip over the ';' + index++; + } + + if (k != null && p != null) { + var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; + var rawData = Encoding.ASCII.GetBytes (data); + + using (var stream = new MemoryStream (rawData, false)) { + using (var reader = new StreamReader (stream)) { + var pem = new PemReader (reader); + + pubkey = pem.ReadObject () as AsymmetricKeyParameter; + + if (pubkey != null) + return pubkey; + } + } + } + } + + throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); + } + + public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + throw new NotImplementedException (); + } + } + + static void Validate (string description, string input, ArcPublicKeyLocator locator, ArcValidationResult expected) + { + if (string.IsNullOrEmpty (input)) { + Assert.AreEqual (expected, ArcValidationResult.None, description); + return; + } + + var buffer = Encoding.UTF8.GetBytes (input); + + using (var stream = new MemoryStream (buffer, false)) { + var message = MimeMessage.Load (stream); + + // FIXME: this needs to validate ARC *sets* and not just an ARC-Message-Signature header + int index = message.Headers.IndexOf (HeaderId.ArcMessageSignature); + + if (index == -1) { + Assert.AreEqual (expected, ArcValidationResult.None, description); + return; + } + + var header = message.Headers[index]; + ArcValidationResult result; + + try { + if (message.Verify (header, locator)) + result = ArcValidationResult.Pass; + else + result = ArcValidationResult.Fail; + } catch { + result = ArcValidationResult.Fail; + } + + Assert.AreEqual (expected, result, description); + } + } + + #region Chain Validation + + [Test] + public void cv_empty () + { + const string input = @""; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("empty message", input, locator, ArcValidationResult.None); + } + + [Test] + public void cv_no_headers () + { + const string input = @" +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("message with no headers", input, locator, ArcValidationResult.None); + } + + [Test] + public void cv_no_body () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("message with no body", input, locator, ArcValidationResult.None); + } + + [Test] + public void cv_base1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("base test message1", input, locator, ArcValidationResult.None); + } + + [Test] + public void cv_base2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Tue, 3 Jan 2017 12:31:41 -080 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("base test message2", input, locator, ArcValidationResult.None); + } + + [Test] + public void cv_pass_i1_1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=1 base1", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i1_2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=1 base2", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i2_1 () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=2 base1", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i2_2 () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=CiZp+ZloBeWiIyjY+Eq0lKt20KQDF3QIJNw7+/jdjtQ1XTSMhHsli7H/ocIXsiU/kLF5pn + pABQiZPvAWfCaEcCA9lyb/7i3q2i72GLdK1vdrdD2nIM5e7L3u/5Z56SJdKTu46SyoFQve9b + Cp7qoQB9/TUTxxvkDoapsSjDCDqZ0=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=A2OCip1Cf9z6X7ML9/bRajnToeCD3H7IkP7YqmSKqDtn8Yu8oaJdwP0lZfCTjX++Qas9nj + tGWMojFpj8Wd2rzdyMXwUWF3xlcFBD2gApO9xbehIASIF4lFQMyP6D80LjsjdtpstgwGZl9P + y6WTyD1Kw/bNPZadxvNeDg3LVcQpo=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=2 base2", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i2_1_ams1_invalid () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=TKrRvbWMQbGHGQSIMlStVE/2vKjY5E8kVSSXJmEyOL1OjexNoNSfnYpjklVVaG9O4Hsbc5 + ZEbLSkpDIOKlnb+XlLNL5xvYntBNamjtH0e9et3DpyPQUIZ2gyZsuFwPzN/m96BU5iv+blU0 + XLjgABkBLyfaFlEPsQ0SUs8gZjM7Y=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=ZFJ9p6LT/KerwWPXp+WzznYAbt+cF4R/3l5nfSeNZSi38hhtpLkoJi/2R1FXdnnznKa3mQ + gk3WCEaxLNmHEl90TDHGL5vhViJ57OSS0X7ZgyKzZrNbVSDYj416pFR356MMXdaV8WVq9mD4 + yATaaWBkVi8eOh287Qbqj0k93H/+U=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 modified from header, ams(1) no longer valid", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i3_1 () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=EcI6PD1XFx7uTngsG2JZQzTaAyhIGafcKJO+aTb4+PV1QKFHrLLrSv++W872urw2WnEsWJ + Hs+YPSVbRGJXbHp4rSM0VasdFb6lf2UUJf8Lxy17f3CzqQQz5CGMO++75t+cManzaOmnjq/Z + gGaqK7euJwWo6hzF3pNZYdTJ6JZOo=; cv=pass; d=example.org; i=3; s=dummy; + t=12347 +ARC-Message-Signature: a=rsa-sha256; + b=FEp53xrAEL1qQfytTEmR+Lp/ZpX4bXQvtj/peHauDtix/tlBN2v841lm72vOjK6WfqGB4E + X/9vRfV7ZiSRMFvXAWlnDKw5wzoZFyQ3xebnvqraYnq9OA1CrDIFQVLqqGIaZrcZ+fTXt7Kp + TBMU/BzIBERwfWXqBG1DqZGYXrHFw=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=3; s=dummy; t=12347 +ARC-Authentication-Results: i=3; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 15:38:12 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=3 base1", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i4_1 () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=lf+5z/QtA3SZRY8Bz60La2HmprfbE1Q2vUmiP/4Db3Ma3KqpZmnS9/d/wDr3dXgC0TpT4X + +bUAQ0iK2hWXtvr9bfs0x7s2skzdyeX/Zzvin2NE/a0uhxIOMfO6Fqcr8YNT9hKQa4qHJxE/ + Qpr0aO4ypt+tGkNHf+4gCLoDWss0M=; cv=pass; d=example.org; i=4; s=dummy; + t=12348 +ARC-Message-Signature: a=rsa-sha256; + b=aqlCYqV7+A1U0pg3Fc3WayaB8cQOH2QBEbwqzJ82ghIERQnLAPMXKR/LfUo27lNbLi+Hfs + wo3ZOCJOoaC6kvHpMTmgOdq1SWBgl4WjwDhVXSarxZS40HxzF25Gi2O1jn0ke7vj1IyKceiF + 9W6deMSsxrlDqD+1Bas4XUfFeC03M=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=4; s=dummy; t=12348 +ARC-Authentication-Results: i=4; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=EcI6PD1XFx7uTngsG2JZQzTaAyhIGafcKJO+aTb4+PV1QKFHrLLrSv++W872urw2WnEsWJ + Hs+YPSVbRGJXbHp4rSM0VasdFb6lf2UUJf8Lxy17f3CzqQQz5CGMO++75t+cManzaOmnjq/Z + gGaqK7euJwWo6hzF3pNZYdTJ6JZOo=; cv=pass; d=example.org; i=3; s=dummy; + t=12347 +ARC-Message-Signature: a=rsa-sha256; + b=FEp53xrAEL1qQfytTEmR+Lp/ZpX4bXQvtj/peHauDtix/tlBN2v841lm72vOjK6WfqGB4E + X/9vRfV7ZiSRMFvXAWlnDKw5wzoZFyQ3xebnvqraYnq9OA1CrDIFQVLqqGIaZrcZ+fTXt7Kp + TBMU/BzIBERwfWXqBG1DqZGYXrHFw=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=3; s=dummy; t=12347 +ARC-Authentication-Results: i=3; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 15:38:12 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=4 base1", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_pass_i5_1 () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=0Kw2RaoquhI2id5WxefhIq+DMaZGXa0iEtjT7oRpCpLhLxH0sofldiwSpVJMh1qZo5k7pk + JW/uah4CWdln95BAm3AikTH7Bu0gM6To4qzCgFKulTbnvRK3Q7jT4xflPf8M4PAkw3OAN2+k + d4dsvyOoo3ait+oNeXyFAEuZ4RoD8=; cv=pass; d=example.org; i=5; s=dummy; + t=12349 +ARC-Message-Signature: a=rsa-sha256; + b=j50SIOsFwO/hXR//iEpwzqDIVtC4qwIdReAesDFZaTvfxzYB6TshuR7u7LqE8PjsUNz6CX + urhvUkCOMGi2q9vQn3lqh67m3roWzIPivbUDoO0KAd9FghBI3QKbQAJe85gV7jbaTsURM9WZ + ygbRURxwTz42PatPu9LNGo2QUwaNU=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=5; s=dummy; t=12349 +ARC-Authentication-Results: i=5; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=lf+5z/QtA3SZRY8Bz60La2HmprfbE1Q2vUmiP/4Db3Ma3KqpZmnS9/d/wDr3dXgC0TpT4X + +bUAQ0iK2hWXtvr9bfs0x7s2skzdyeX/Zzvin2NE/a0uhxIOMfO6Fqcr8YNT9hKQa4qHJxE/ + Qpr0aO4ypt+tGkNHf+4gCLoDWss0M=; cv=pass; d=example.org; i=4; s=dummy; + t=12348 +ARC-Message-Signature: a=rsa-sha256; + b=aqlCYqV7+A1U0pg3Fc3WayaB8cQOH2QBEbwqzJ82ghIERQnLAPMXKR/LfUo27lNbLi+Hfs + wo3ZOCJOoaC6kvHpMTmgOdq1SWBgl4WjwDhVXSarxZS40HxzF25Gi2O1jn0ke7vj1IyKceiF + 9W6deMSsxrlDqD+1Bas4XUfFeC03M=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=4; s=dummy; t=12348 +ARC-Authentication-Results: i=4; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=EcI6PD1XFx7uTngsG2JZQzTaAyhIGafcKJO+aTb4+PV1QKFHrLLrSv++W872urw2WnEsWJ + Hs+YPSVbRGJXbHp4rSM0VasdFb6lf2UUJf8Lxy17f3CzqQQz5CGMO++75t+cManzaOmnjq/Z + gGaqK7euJwWo6hzF3pNZYdTJ6JZOo=; cv=pass; d=example.org; i=3; s=dummy; + t=12347 +ARC-Message-Signature: a=rsa-sha256; + b=FEp53xrAEL1qQfytTEmR+Lp/ZpX4bXQvtj/peHauDtix/tlBN2v841lm72vOjK6WfqGB4E + X/9vRfV7ZiSRMFvXAWlnDKw5wzoZFyQ3xebnvqraYnq9OA1CrDIFQVLqqGIaZrcZ+fTXt7Kp + TBMU/BzIBERwfWXqBG1DqZGYXrHFw=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=3; s=dummy; t=12347 +ARC-Authentication-Results: i=3; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 15:38:12 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("passing message i=5 base1", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void cv_fail_i1_ams_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("failing message i=i no ams", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i1_ams_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is an invalid test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("failing message i=i invalid ams", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i1_as_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("failing message i=i no as", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i1_as_pass () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=PhxOTCxMOzOkfccg/YXFn+e5FdMyjQK+QXNt9lYytimVUpntsBbAAtBQT5XgYQDRsM3YR+ + vBsf1oJ+kL221cv9qQWYUC3DP3xaE0nZ3vjNR1+//uZpMcTT3k6NYZnlzexAzYMoXByQkrS6 + 0Om4kNir1fUo5SOlGXpXf8NRSmU70=; cv=pass; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("failing message i=i as cv=Pass", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i1_as_cv_fail () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=wddf4DzBcl11ICrYWjYC78s246KGCG4D3XBmouE2PVdLr4LWqyTWTQDvZ7TWrtEDkRsmz+ + wbaMVAWdj2XgewkwQu5qxQ82D5dGiLcNQXfQDRbd8dO1+PZVWlw0wmeM7nRhNb/5tT0BvNQO + xrrb4oEs4LIFDNYtKgTvCMyCVLzuw=; cv=fail; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("failing message i=i as cv=fail", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i1_as_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=OdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("failing message i=i invalid as b=", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_ams_na () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 missing AMS(2)", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_ams_invalid () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=jsR4La5CWj4665VQZEjoLgxdNhdaE1mZFpkL8jsfEm938sd9TWr/keRkfZQaRFLuFjTxI4 + vg8/D4bUx3UW0G6CngHmcx0kBi375aRfxmD5ad+esDyc5Dw/s6GapOpb4JFrss1n6x4MGOtY + GQAQi7b0FPUdlXVbKQYIQovi7ZjGU=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=CnX/07HnYNoqdjrn4mE9if486SWqYAytX0weObYC+UCp+ht1qId6MPsQa3QWSWZt3buX+E + kCwFMMfnBeo1gQ9rPfPEcQtUI5/3D/RYqtBmaZTP1Vpcgj5qw3mQxNJJh0kl57z5holdQ5I0 + g0S02+/k61c6cJzmoDKYsQP/VjebI=; + bh=invalid; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 AMS(2) invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as2_na () + { + const string input = @"MIME-Version: 1.0 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 AS(1) NA", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as2_invalid () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=JAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 AS(2) invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as2_none () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=o0fxNS9D87SVRYy2tkq7rXntZWYLuInRCzW2Jx9U8Px0XEGyD4SdwRIpS+RJ4qK6ufvuuc + qYLmF9M9aV0tvbe8mp78+qhN8RImVPehz6AFPY7NGy563MQDPDAynBWQyp4EXodlmmzQoEGB + iMar9e9AuWSwyAok1BDkUFsajLRIA=; cv=none; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 cv2=none", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as2_fail () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=1mXrddJKGqZTDDgnoDP1IYTu5g4ij0kxFZ8dSsSjo13+vDuoBEa4aKbYWlG4Ij2IAwjaLR + CDYddDXDBZ5Cpnzrq7fDSVmmUhwQanAAd9aah4TpZeervt3/tOqFnpckUtOus1hq9yr5lvLA + 1umDZf50sOb6AygAm/k8xCco9rDp0=; cv=fail; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 cv2=fail", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as1_na () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=1JtiDdajC4yqlIqokR/uaPI/KdST9EsS2oPhDdQAe4E96IXwQwkgRZLJF9OODSux9JCWXh + Z/sCh3yLmcTOKPuBQAwtAfll+PUePsuHh0gRYECVIkY3bGfAr+3hVdrmNpr7B6/Zcq8mjQEt + u/5q+XkkocYaUxT+ODnGGHwMI/8Q8=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 as(1) not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as1_invalid () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=gifscOcADiR9JpJLFaCULS2DPnnk89AxF3tIfanEQV5PQWJvRSWrDs8hMwLDdDDZRKBWNq + I1+lBro3Nd9RmUt6YsMNdGYK7XIG5ME9FwamoqqFxq++1jST6wg1gS1YrFExuHreNlICZ9yT + xSmufAj9mJS2CLuOxYh6YIo6bHj1Q=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=OdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 as(1) invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as1_pass () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=1p687XiKxG2/cjtpO3A+Qkt/B7Q49iMgcq1CutOBxLs2TXcO5CUozwxFbY9YvEaOyXxf6Q + EnSvZ4UpYIkKGNrm0PLSbgI0y3cY4Waa/fFlT+/7oJUQmsnN8MreOfcHZRpGrSRU6bu5uOyp + 5mSlxgTwnti4Ua4vAjl+ayFOn0hC0=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=PhxOTCxMOzOkfccg/YXFn+e5FdMyjQK+QXNt9lYytimVUpntsBbAAtBQT5XgYQDRsM3YR+ + vBsf1oJ+kL221cv9qQWYUC3DP3xaE0nZ3vjNR1+//uZpMcTT3k6NYZnlzexAzYMoXByQkrS6 + 0Om4kNir1fUo5SOlGXpXf8NRSmU70=; cv=pass; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 as(1) cv=pass", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void cv_fail_i2_as1_fail () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=uMD7AJfyGb+OHxrGSOB3Vbt7nBnEZn0RMBoq8GgyRbz4Xar+BmAIR766rEvlwgLkkKU21u + GY8S0HK2GgR5lhpcrezkwD9/L+bfe7uyuFDrr4b50mt4oI9FTfwR0MuHpW91gAvR4ZYnwTRy + PoMy3AaapPFnlY38n+HjseH0JACTo=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=wddf4DzBcl11ICrYWjYC78s246KGCG4D3XBmouE2PVdLr4LWqyTWTQDvZ7TWrtEDkRsmz+ + wbaMVAWdj2XgewkwQu5qxQ82D5dGiLcNQXfQDRbd8dO1+PZVWlw0wmeM7nRhNb/5tT0BvNQO + xrrb4oEs4LIFDNYtKgTvCMyCVLzuw=; cv=fail; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("i=2 base1 as(1) cv=fail", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region AMS Set Structure + + [Test] + public void ams_struct_i_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=UeCu1SBJupH/8Xp4vCLTNWJAvhmj7xgawvWq/GsnIiqXrrYVg/OvwcqGqGD1kNZHWvZuXH + W0AIl1z/3vycIGYQdrT22+oy/s0bJjHhcHQWo2iZt/4mP094fecbT/soJv6mERLw74pRwkei + /skva76UKGLq1xHXzvQkew5RwhgMo=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=mmLqaSDJ2CFu1lXO7s26aXT3MrFC1pfi9ZjuVysKjleXUX3N1+pX+GchfuzHniUGpuQQRQ + 1J7CL7EG6Rd8SzWIM3ghBfhN+G6jjXzv+uVtm89kbNodrVZ1mVtEtUoEo/8BvOCfeNotyGyj + NyHGzPyAc+kv/zimFml7MKn2By4KI=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AMS i= NA", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_struct_i_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=Je7FiPu5s4SChzn1rIOwQd9kAjZodFrZwqsoomdw0TGZsQbL2djL2E160MND7eGKIRe1IP + hu0WqhhZ3OD9LGFa/JUOoSeTgTA+kGx0Acan9wp+ksw9UeCLtpmRs00FOYiHe4mpl8i1QLVG + aLcewyizL1HdM1U3N+S+eeOzBtdwk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=l3O/xWb0Bu0DKaKiwlQrD85VsESQyWPV6fS5r9fou680YgQGIk8ycfBXt0kJLKMf6I7gtC + AZZ3eypnAjIqiP1o3QNaajeicN5str9K+miibqwANe0/SIPR4/fOqs5oS8/9309wzwqPflUt + nL5/nuDJt/5KHqXc2jMw8GZfdAf7M=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AMS i= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_struct_i_zero () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=1BHrrrHUNLNWyocFdPKW6qGOt7Y3TaD8n0pI4pVOKi9hfRljZKQ3xENWzYCPNXiwp9p0ww + gOt2mC/YtjrGCi+Yco4DoStThYcEkoXKUZVPDSa8AIOE/sH32wTYfhaspKr9A2zvScG91zfI + EGC1qF4qHAoxnJBPWfHhuzqH2ELk4=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=hbcwQf/Mg+hXbDyGiBN828o/d7O4WzqVD3r4Zym8u02Flc53mO0N3ElghteOiIw4YG2Sa/ + WbfxPpbWAVsdtYprjevGNOvl1hpF4d+xqX7h+GVxaEwEN65GFK3trxJF2BaHQ8F4hc5a6Fmf + Is8OV3B+2ZW7iegJdH2CVlvusajys=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=0; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AMS i= zero", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_struct_i_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=gzFG4vgfOas2UvRlmaw3UKLF+bfZLP2RoFnIysRRMQHFDz62uhEUoM/U8MAm4N8DLl3Bw9 + 3TcPxmd6zV5sbciSc7zXuMxIAmj3/vyfv4vlTDNZ4n/pHXGfxNhXkDndJcoh+2U2Ia14ARkP + /v2n677wgmOPcbzq27YL5+DJFEG4o=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=eXN9vsCoo/HcGaJ4yAdXfbaW3zKsIFETZAJcHuD7xRi8BttnxkZTCiFn7zp+AOUIuga+/Q + w1mGFP5tDK2U+mcKoEXvXIxGBS4CSKueUHDxTyCxdWas4LFYkGd4fKM7XK604RqByh+301RA + eNU/3uCcRitftaLemX/R089S2HETU=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=a; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AMS i= invalid value", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_struct_dup () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("Duplicate AMS i=1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_struct_missing () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("Missing AMS i=1", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Arc Message Signature Format + + [Test] + public void ams_format_sc_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=OeNJ7p2NdW3mKv4hyenx+QbRuqqq8iwGAyY1WVX/EJiPHS2vNB5lEI/YmVB3diTkKPHWe8 + ZOq18DTVtOVuahLqM7s/4K/gvx3zal0vcedPL/mtRW4A1Ct0/wyLuFADX2HZ815cELx81SuX + 3fEbbym1br+0JArsz6n8798lidnWY=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=NOLE9bNh30qiTx35h5yKbHlDPahxvhXUWjv8Yiy5L7Ks3NNznK54dmUPZ4D/80tkRYiil0 + 8sCqFTh7OH5ZTXXEfArxBMQQl3DAqTjOJQ1c3jPYwaDliWqCLLueSsH+ovaFGRGNPm2O41o0 + J8xUmyji1bXXLKMinB+Adv9ALXsw8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ= ; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams format tag whitespace around semicolon ignored", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_format_eq_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=CcoQW04QZ7n7OTPACcP26R0vJtjEwVmcFpj4+PJnvT1kVeOMfcqwt7FEGlCjeJ0QIYMeNW + TY6kND0fe0WJDVnWvhCyeOb5JjwllbJJ/ThP74I5UPgQ0Cwp1h/O9HIrUJkrje6HQ3nD6Dok + la2keL/t4R7YtMyAmn9sPWuAOwSrE=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=KLZ8Io9rZzsWt0Q/Mrx8sYO7HPLptFwGoCdabHuyrQsek+1c5yo5tOQidcTc8ksw5PoAZH + PNOIoyGVte9jMk0LdA1IYjjvvUmEANMZCJf0wm66exDWJ30xMrgbosLN2XvsRk3BDkoCg2AY + HkR11isMdIhrefd7AHw9YEDTnohQw=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c = relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams format tag whitespace around equals ignored", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_format_tags_trail_sc () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=Q3iCsG7zmlydzz8zFIm4X+Nyr2636znsyGh+lRhCFtcWbw3m3v8fFrtK3uNvqSM+WW3Cmf + TbteHFaG9YL34KUMi/ThuPoG8sOwJ18BPjXrdBS5EiXYBBFalkVRV0ktqyiNi57LBVS+VGWV + FwOD85C/V/Fju2wETdy0ly1VjfLBg=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=H+XsRP2HBJwygQonE/YquKr2y1KqjjlhBQ/hEkIGFjjNhOIvMfuuO054H4+kxMmvHFdwk8 + a8Uwy1MxQBC3a4b0jAQ77rOn5VFhO1tAmCkfZP1bJSxewRfC2Eo7j/07+r8ZLuyuAzlQIW+n + DPJtOhnIIEOGhLgPNlcTwc9R/XKiE=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345; +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams trailing semi colon no effect", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_format_tags_unknown () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=hnT0gH/efgds1eGi2XgAPK5ts+d6QZHc910SN6Xpr1TmDPXpNoRlq8F4eeMTj8VMgLWOza + HeMe4quPmcWlZm0vRkiUxK3Q9HJlclElB9ehd+qPKzE92zWdSnkQN3kpyoA9mSAn6eTUmX9d + ZFCA8DnXTQSl3T7V4GWwO9byXtHmg=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=jHH5JVvEmO5RMAl5NlbOHuIgc72768gwRv2MjCvgh83McNt2Ogx7yFZTPfcyO9F0jT5EIz + bOzMeH+vIBJjJZz1/FVpBUxXJ7Ir5jQ6rjDGCvztrqeSMkhyF2pdiGIQPn6HuA0qDjMY6IfM + wGoYUNqNE0+2s5p+DuxXMbT0tZBv4=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345; w=flarp +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("unknown tags still valid", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_format_inv_tag_key () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ= ; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; ==; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams format invalid tag key", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_format_tags_dup () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("tags are not de duplicated", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_format_tags_key_case () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; H=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("tag keys are case sensitive", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_format_tags_val_case () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=From:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("tag values are case sensitive", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_format_tags_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=1 2345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams tag values whitespace sensitive", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_format_tags_sc () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy;; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("additional semicolons are invalid", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Arc Message Signature Fields + + [Test] + public void ams_fields_i_dup1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("duplicate ams i=1 order 1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_i_dup2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("duplicate ams i=1 order 2", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_a_sha1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=wO65QnQIWl6SnCuXSzaqpFWd1Iz5y/VneN5oorqP3XDWkXh6SYZ/CCIgdzBYqDX6zzKXAW + /qC29Xl3klg9mg6Epteb3Ie/nmUDCNiGoBF2ZGWW4w3CgYYBJU2nGitvR9ytKZ9VaNJkXqr/ + iWEc+fuCSNgwbAXMe4WeyT1LjU0QU=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha1; + b=JxQvoennMmz4+A7Strpsa5XUkbwuHHwNZW30eUytxb+M28y/01pkSXPKpsbLuZItfjJw4h + AIiLraxKMj+Ene95MTUa1Xqk1fzlKTo+mhfpPOwn4pBmZaJilCx25pRNgSrs4uGX79vVcf51 + xiN7GF0ns2hGx7Jg/YTeBsVL9ckd4=; + bh=bIxxaeIQvmOBdTAitYfSNFgzPP4=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("a= unknown algorithm", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_a_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=xOHf2jEcVrFDvr1gDUYPzfVj90l2aTOJmU3pQXz7FT9tp86svuVyCZqh5laLPdunneTVgg + wgejwf9PP8A8wCO+HHjMwZF16ZUE4Yqg4ZMjfzUCmK9fv2iT5qx/k4Hl4F6aBstcNhODcTpg + bN/qhpMAtJqP1+Nk+SxDgLEZPqwNU=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: + b=iu9yW2jX7187Y2/yKW8Z3a/8lIsaKvek4h5lscx18jk45kfztcCuR6adEtBx3/szzN5bVW + iU6qZgimS7l2VjfRhNFEOTzhpxXO20Pd9lJ9O07Jk0CzdYd6PqB+anrPz9+g7+3Bqn+MzhEi + j5+z3fy6/xMhdmISrSWwpGbT6Jp98=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("a= not avaliable", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_a_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=ErVcYmPHoKhcv4cUMAAlK9Z5tZ2G66c1PD6uaqj09ab7YOmLJ/4SJNH16m51n6oRv6uBtO + Qp0ikKw9DAG/ZFm550lnr0xwDxgo7C8b26FC7187QlNoW1/we0SFutFo6XqJGgmQsly1glDi + uyECgQHiR2C+S1DHpYqSMGhl/yehg=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=; + b=zVPKQ3zrtroGYfUFOyR2TJFk/T+2BorYCDkmE6KSBjbhNFtvx0W+5z+Rnz5gvnQJA7K1Ob + CdP9IlCJGU9w5vYfsw0hL2nksu+1b1sgS0FZv5N2AqT07Xc+B4xxjUnddUojOdTp33k5rpES + /F6U0YUFq29+Oec8F/+849FdJIFo4=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("a= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_a_unknown () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=ZIVn4O02gVZZM69shdqjhGG21S6N8/WPCWKj+NQgoDtMuUYmgIaKkWJ8MyzdiCH+09lKlC + OeftQqHOztn7eqsqG1+JkY03J0WR1IKcyEJ01mKrKD1FEm5FlCAYfk0zl+S58GDXNC70d7EU + Ht3EPiXZ237m5+ZELA9ER1wDP8NDY=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-poptart; + b=kHGBG8KmUtKvaOluO64HVWcSrN7/F02NkxyoDqkfZaoF3brrCj8PWNf9njKc03EKNScVgH + /77ZoYr06Fsv+cT352CerOJn48/Rg2k/OZFv2j7Cg4b4BOAH0XYfNIw0c3wh3h8P6ML7qk0P + zE086JAU7m/JHXCmeWdGMOWxAgtDA=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("a= unknown algorithm", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_b_ignores_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=L8GsQ6v/7miEWKMGu16QVCPF6IT8j9+DV/ZHzgm86gi5m2JYAq+BlkmiIDofRPW+QzAq85 + 2UlxwI2NZrhyAKgtM4FKO7+84P1eYwJKh57DZfCyUpqRx1Je2+vzT8ZggXQWYjFEu36MTDFX + fRKVqPV3omyP+CFBzjJFFDLehJaPk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR /UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= ignores whitespace", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_b_head_case () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +FROM: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= canonicalization header key case insensitive", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_b_head_unfold () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe + +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= canonicalization headers unfolded", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_b_eol_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= canonicalization eol whitespace stripped", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_b_inl_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= canonicalization inline whitespace reduced", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_b_col_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= canonicalization colon whitespace removed", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_b_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=OzRrkSWsUTrQ14yM/vnwnE3FBgXOC8u2KaiR+kqtJ3fZRudMM3gZm815dG/TaYTIw9Ia22 + voygKoSBc/48fUYFcmfKgwHHW/mlqHqP/eLSQ2/tQR/R+eG0ldsqj9nWhMfqRs6eNU32LMOd + fpk9IcVRPAx8Uf306RgvfMmwKrwzk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_b_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=4Crgst3Y5S/zOuKhpV14MKa5UBleFxBwmEeGMfTBptTZ+Pr9UcLFTmbWBCP2XkD0l4++kz + LISbCEDLFFzPBXxi3p1TxUa/i7Ib1/F4oDSIwu4r4dGYoC2aR9ah4f1zjj2JM++V7PuFcn+Q + +wETBwEKIM/uP4VabDjLAwhLfuvR4=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_b_base64 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=DMVLxkygsAo8oIVh698NtvdqZ0RspPu/YPQqcSNFWFjjsfcF4hZXE3eGkrze4nTfz5XB6p + s/210+6vqYSJIxMVxRJxO8wd7xQn0MyG/1NeNoW9qQdBuajHIPhgjCvJe2jnnvHn3MvaAjXR + oh+Jco1pmRfeoLBPqPJmEvDW1/9F8=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=not_base_64; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b=", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_b_mod_sig () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=ukwKeUuHm+O5bA374QNtQMipl6EYfgWlGGfgTGznPEaIFiTmV3A5lhOnCEGP8tr1CDYDl4 + yo32S/rA3I0Z+GHWpo6pzcnh3+tvCBuwoxHZ5srbrTwOFNQWmPC2Bfwu4fetM8d73/wN8uKm + ZziB/Gd1VTLLCRa4xx2C9QM+nYEQU=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=7sRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= w/ modified value", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_b_mod_headers1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= w/ modified headers 1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_b_mod_headers2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 (Mod) + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams b= w/ modified headers 2", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_bh_ignores_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=E8x7AZqCzrIuoNF9dWTyteDmtDLHk3J6CSXj1DfRHjk2cd0oeHUIXvtrNtMhYs2sFHoZRR + NuVvgDUIwPcbtr2Bz9eYvUTuOToBRn9FZFqnpR/rHl5VbPAIhSwE98WT6PJt8pqNCyKyZU3I + szoWq5cB3OWUv6QJ8ctb6rCZLbk3g=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=xWBIUyGnx5WlX005xU8TYkieptAqvslDc7lkuqyFpACyOklw0t4cAONgr6qUavTnRJyZoJ + mXXIvvPk/7xgH9eT9lCFYk49vpo+fqZACxJwpRk6WbB3fwbfeZe8C2aL6X/G40ROlh4EVcy2 + +NjgNS2X9ZEmxKuGEehFLqaJnx8yM=; + bh=K WSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= ignores wsp", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_sim_base () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=d6sLFV7dCrZT/WzJil6ZyWcA/W5tJGLkP+yx1Fln+uZdjkswYMjvPkO2V2kvMrh2GBgjee + j9QiqfGHsJvGqAKrFVzxHEsgVA0IYN6tI5wTKMLgu09b8BeHUr49/XnBEemjbgO8W9n9SCyX + hKjsZK5b5ZIYBqjCSDZUwWRWfJywk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=c+pRG+RBumfEVWDAjHVupy4hZHN2F/AMLHoj6Vha9px35oo6eoyMxxOFUvBgVIUVphuSwV + 198baYTV6Of9DHw44VS5rf6MDZNtVc8lwm8ei8aSAgzSnuhnr0jW2j134QTsEL1TK1bWfs+l + QGXDBN5AUDsbk4jN5akoDqmH7gNlc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/simple; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= simple canonicalization", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_sim_end_lines () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=d6sLFV7dCrZT/WzJil6ZyWcA/W5tJGLkP+yx1Fln+uZdjkswYMjvPkO2V2kvMrh2GBgjee + j9QiqfGHsJvGqAKrFVzxHEsgVA0IYN6tI5wTKMLgu09b8BeHUr49/XnBEemjbgO8W9n9SCyX + hKjsZK5b5ZIYBqjCSDZUwWRWfJywk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=c+pRG+RBumfEVWDAjHVupy4hZHN2F/AMLHoj6Vha9px35oo6eoyMxxOFUvBgVIUVphuSwV + 198baYTV6Of9DHw44VS5rf6MDZNtVc8lwm8ei8aSAgzSnuhnr0jW2j134QTsEL1TK1bWfs+l + QGXDBN5AUDsbk4jN5akoDqmH7gNlc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/simple; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= simple canonicalization ignores ending empty lines", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_sim_inl_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=d6sLFV7dCrZT/WzJil6ZyWcA/W5tJGLkP+yx1Fln+uZdjkswYMjvPkO2V2kvMrh2GBgjee + j9QiqfGHsJvGqAKrFVzxHEsgVA0IYN6tI5wTKMLgu09b8BeHUr49/XnBEemjbgO8W9n9SCyX + hKjsZK5b5ZIYBqjCSDZUwWRWfJywk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=c+pRG+RBumfEVWDAjHVupy4hZHN2F/AMLHoj6Vha9px35oo6eoyMxxOFUvBgVIUVphuSwV + 198baYTV6Of9DHw44VS5rf6MDZNtVc8lwm8ei8aSAgzSnuhnr0jW2j134QTsEL1TK1bWfs+l + QGXDBN5AUDsbk4jN5akoDqmH7gNlc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/simple; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= simple canonicalization doesnt reduce wsp", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_bh_rel_eol_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= relaxed canonicalization deletes trailing whitespace", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_rel_inl_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= relaxed canonicalization reduces inline whitespace", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_rel_end_lines () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= relaxed canonicalization ignores end of body empty lines", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_rel_trail_crlf () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= relaxed canonicalization adds crlf at end of body if non existant", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_bh_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=YoXbDMNRVADrsGTtqAuMLWVnRIj62jQOSDFCX875c5ksVoWcKstnor+cGw/PJnz0cPuFGH + +vjw3y+tcgBDDbK1qBVyMUpHrahTLL/0IY2jMzoLgPYz7Yawv/gpn7GlyXL72Vdr58s/nEfk + le/2NmfPZjlUezbwsw+UHbuqT5V38=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=m5y+bcsy0duHt1KxJ2EakY2mOpwIrFaHD60tlw1PmqNdy4M7XLGTnA10R7k1OsFAQNQdZM + n1aKsKDpYuRX21avSuDxximXFwkcWYevOqUmaklFXiWyJVXd9fHId0sEtNt0L28HInLwHeCf + IPYbUuddJ8wRWei04RZjqdybh4f2o=; + c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_bh_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=YoXbDMNRVADrsGTtqAuMLWVnRIj62jQOSDFCX875c5ksVoWcKstnor+cGw/PJnz0cPuFGH + +vjw3y+tcgBDDbK1qBVyMUpHrahTLL/0IY2jMzoLgPYz7Yawv/gpn7GlyXL72Vdr58s/nEfk + le/2NmfPZjlUezbwsw+UHbuqT5V38=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=m5y+bcsy0duHt1KxJ2EakY2mOpwIrFaHD60tlw1PmqNdy4M7XLGTnA10R7k1OsFAQNQdZM + n1aKsKDpYuRX21avSuDxximXFwkcWYevOqUmaklFXiWyJVXd9fHId0sEtNt0L28HInLwHeCf + IPYbUuddJ8wRWei04RZjqdybh4f2o=; + bh=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_bh_base64 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=YoXbDMNRVADrsGTtqAuMLWVnRIj62jQOSDFCX875c5ksVoWcKstnor+cGw/PJnz0cPuFGH + +vjw3y+tcgBDDbK1qBVyMUpHrahTLL/0IY2jMzoLgPYz7Yawv/gpn7GlyXL72Vdr58s/nEfk + le/2NmfPZjlUezbwsw+UHbuqT5V38=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=m5y+bcsy0duHt1KxJ2EakY2mOpwIrFaHD60tlw1PmqNdy4M7XLGTnA10R7k1OsFAQNQdZM + n1aKsKDpYuRX21avSuDxximXFwkcWYevOqUmaklFXiWyJVXd9fHId0sEtNt0L28HInLwHeCf + IPYbUuddJ8wRWei04RZjqdybh4f2o=; + bh=not_base_64; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= not base64", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_bh_mod_sig () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=YoXbDMNRVADrsGTtqAuMLWVnRIj62jQOSDFCX875c5ksVoWcKstnor+cGw/PJnz0cPuFGH + +vjw3y+tcgBDDbK1qBVyMUpHrahTLL/0IY2jMzoLgPYz7Yawv/gpn7GlyXL72Vdr58s/nEfk + le/2NmfPZjlUezbwsw+UHbuqT5V38=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=m5y+bcsy0duHt1KxJ2EakY2mOpwIrFaHD60tlw1PmqNdy4M7XLGTnA10R7k1OsFAQNQdZM + n1aKsKDpYuRX21avSuDxximXFwkcWYevOqUmaklFXiWyJVXd9fHId0sEtNt0L28HInLwHeCf + IPYbUuddJ8wRWei04RZjqdybh4f2o=; + bh=Z3JlbWxpbnM=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= modified sig", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_bh_mod_body () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a modified test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams bh= modified body", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_c_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=ygcIhWO/8u3FP5h+7kQH7X9Yqxs0MIHuMUA6PapmNf+8CP5Fb/mY/mZ5aUcLxJNozQ2oUU + ukkGEysRaqm5uTJMhiy4YjZgJqMRVka3xMGeIaSw1PiugVu015l8wKR1ollDSN7POJaajQBC + /4mUnAUFfND8OqfE/VimB6flYiUJ8=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=1+WHHTxU+XLWVsbRsvjlW2kMRRhmGE+OE9jxnmLt4ryEa/AezAflCMmVzM7r1dKwxJA1oc + YmkN0ga0CO/nxSvB9XR0dsg/TH7TTSQKIllCRxsmGLt+jG/9Mw5yTRxtBOOuFK4xbHbFbCLU + vRCry9p9YZpoAemnEb24tm9vjlrsQ=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= not available", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_c_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=eTLQqvFomQqHaOc36izhl5UMp6wVe8vGsLLuPCraumms100F7tOUhRpAII90YkwX0AK+RT + 5ij+3Ngk2sQRpMupfFTgeF1olGU+jt943VkFbmSYXYp0AwBe4TGsLugWmfkUy2sGBSC1Rv7n + ZaC9m6Y2bNMJcwix1EAuFFV6ck1Wg=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QdAvD1bnatYxK/JQCvI1uSuKxOYC+oR7wqg/twCt+zAFm8Tvu+fZpO79+TSx+cLAETXKNT + 6mgQLaLROfq3sNf8tP0f/4oqzMUb6Ybz2syHL7hkmC6Za5Ii8RDKwMSc8lmvJk6HXUKgsndZ + vWsQCfv+jyLmfDfCI8v9WP7xa2UEU=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_c_rr () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= relaxed/relaxed", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_c_rs () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=d6sLFV7dCrZT/WzJil6ZyWcA/W5tJGLkP+yx1Fln+uZdjkswYMjvPkO2V2kvMrh2GBgjee + j9QiqfGHsJvGqAKrFVzxHEsgVA0IYN6tI5wTKMLgu09b8BeHUr49/XnBEemjbgO8W9n9SCyX + hKjsZK5b5ZIYBqjCSDZUwWRWfJywk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=c+pRG+RBumfEVWDAjHVupy4hZHN2F/AMLHoj6Vha9px35oo6eoyMxxOFUvBgVIUVphuSwV + 198baYTV6Of9DHw44VS5rf6MDZNtVc8lwm8ei8aSAgzSnuhnr0jW2j134QTsEL1TK1bWfs+l + QGXDBN5AUDsbk4jN5akoDqmH7gNlc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/simple; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= relaxed/simple", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_c_sr () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=rhXdX7jNW4wMS/SjYKBYC9eW6q5KnnQ7UGICE45CsYhwEoi38c3nM+91lvM3zhUILxo51X + htsrMDLw5TJeZdiCqgXhQZmSEzR+KEdnu2oidezrK/hUzYPlKdO59EQgGIiDAmIRoKZ6+rGV + fUCltnyjA07a9KpIpeXRKT3WDCE6A=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; b=RWHWmB6euT01CXN0PJKCrmmoPPGc+pxxurfyJBjnNzkTizZKD7XwHLqTuNPaRG7PULU6ffq8FQ7IivdffwqXNj4L3ttpKNIjfsndMFvn5lpKZGfvJZfjTmbTJMhF4CCJZZm7l1xy7LbYMaMb12WY47vXOe9RNjW7jQyw8iqctcA=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=simple/relaxed; d=example.org; h=From:To:Date:Subject:MIME-Version:ARC-Authentication-Results; i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= simple/relaxed", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_c_ss () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=X9qtjasr0URzC564MZz0bwckcIVnBW9yUZP+xt4rStU7MIuuo266KZ1V/e5tbg/MOCZJ2m + 3hvKRsVy1fMeIus2RVBg88zwfjyRMsJBC+zKV8oONpIcxriN8imZcaeWdcfsghbAFBM3viCE + MdvebSvInMfz0vZsD1DJBYTjPel8w=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; b=fv7KIaPfZRTQynzpQ7Gkg3thdZn78iGc5L1hTQoWrY1nSaE3pqQTHsGDW7+FRquewwFoakGLSERxBnC67Sdvw9Exv+/CEs/spqRrDjNygkCf/BIZcURb2nXXFHqPy31X6r2bufWKj6Lbo+5MCyaS2tWkV+KoZhUpolYSo0CoGfk=; bh=hhFbTjokraRYc/Af+8v4zyKm/9ApHGkBSLO129NtPbo=; c=simple/simple; d=example.org; h=From:To:Date:Subject:MIME-Version:ARC-Authentication-Results; i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= simple/simple", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_c_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=YYGtMgeVAGSLLMZ0k9D0yRRzsfKpbHCoqfLAKz+Du2++GE82Dvz2OT60ebG9m6vmT6nT1t + D+rMJnTXIZDUPZ6BLH8rLo8jMb33cBV5NzBD3SDYqWA7OOkYrMGRGmoMfxpcGV8m77YykscT + +cpxxA2Ytld+YTd0mTtxdOCN3T1M4=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=DJZENNFBf+SwDthFmU1ztUBIsKRAAaUdY9CjuGXejv8T29jf3q3EDUz6OnMevRWiSLj4ED + gymMDJNGSTUaz3N85KmzWrTJ7QOLNke1H9L9kkfEFowatF8fW5cV/7Y6Ubzh0e1626TELeE+ + kvczpXT7prdjJZZjQAbDuHsWXkOys=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=pancake/waffle; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams c= invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_d_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=xPtYeQQruf8zzJ9kUrMESmH9ooORAIArDB3MhPcaL+0fgmuc99fprb+aMaSqY6OdZvAEoO + EBczyfdtlGKcqLqa5qpXYlukRfG3q8mlOd+8UU1u1bikCzfT/JI8PNerzaoxlksJfmt8zJT0 + f40IWBJnoRpPNqJSBFb8acvLVZFcQ=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=iDLI16Dzhtt9CmHLpkUXy7d5legcVvxkPMStdfrYQfNfpwVia165ca2lGI7Sx79pCoMmy3 + sSWBrLHsTQkKylsGswc0br0ycquKhxHgQh0WChxQd6ITVGQvFO/wZJd2jtE5E/KDbPKDjEio + qLfCWpVe2KT1UZ89V+E9tg0T5TgwY=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams d= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_d_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=Nn38++8Vf80guievTz8fSFN9VjbPdeRVR5LmvzRt0IMRzZ75FThtzO1VM0grGeUj+D39ri + 0ZwIgNyVtZXfG17FEO5BGQq4ZddLQoWHLKTeOWXL59FPhGRJkxiKNefS2c5YqZQ0NI8VkKY0 + HQlX6AeD/CHHE/bpcg7fFB5/WWnLE=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=yKCB5xEcyzGr2+mbXWsVDHDZB1PYe9MqqTWySS7Y32uFObEA/MNJmt5yPnZLScwQUhzeTc + WL701aDMyPmlYlGnqxl2/QkvEw5hZNfOmD5gltxTlIabWyRrC1Qq/1RS2zDqvF2Qf8SJL1U7 + gL6jf82iBTT61ckhPraYGIdgI9hlo=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams d= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_d_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=G8wYXXsNzfrmW5ob/HLkPkg0hz37d0O01HmLr8E8IQUPAa4lywxmOekn0bmKfOvK5p77Dz + JEue+awK3gHG7/obHdRLamg8cYxmj4qfR6Ay0baikigUF4Wyt77JsVUqCC1qedRNcRN3IGPx + 7rrNSyzVlIWYPal3pQZc3E1ClpG2I=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=rllEQ7rbed0w+ixVEkL/jiUZrjyDdTQ1d+qnNGEvpzzjh2xFla14BKDcXo7q/aX25lxl0e + yzw6yf5PFJC6JWqj5h3sFtLO6hS+E0DXyPZx0ok9tNiv7QV4YqY9fWeA64OZD183DKISDZnD + mx/r0Svb5thGZvzvyfuAQapHke/Rk=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example...; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams d= not valid domain name", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_h_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=V/iPFUptKaruDTBpwKcf5i6nu54GxrG3ss2bfPqqT3I5MGMyRmtE+J0kOVtU9qtHIhXUng + Iezv5+gCOIf2jP1eYGvhN2Wmkf2zsShG6+Rfpnp9fih71C1f6fh6Qp4tTUhB6ww4ZOTKtVdv + H0C2s/5in4RLMxS0FUWge8CvlTnGs=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=ex6hirqdOz1yO1SZE3ALisw3dj1La5L4qHcv8/ttCs1qGajzw0zEtUyMnskTPQnt9cxxF3 + T74KRXlPVN/4Aqn+K/Q4NHtOW9vyuLt9ek9Vm6/xvZ10KTMrxv24u0eLnsigC6NfablL4wAM + epZDlyjf/HPBd0yVLQL8yFDtQ5fE0=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= empty", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_cws1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=0+WA3Dpt9Y1lJ5wkoOZsh6KXEQFv0YE+ykvXAdS5t1toEui1UWzLyKWxSD/H/Xc6eCaQZM + ji4IxybZ4OrIdV0yRe1fGqYN/bJ3KnkuzrHpaikXRWxXdX8tiIu5+I+HmERxuGzGqHdNv2zj + 5L8PNAsGs4LDg3xQXEe3FQAvis9OA=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=Lq5Sy1R3C0RaTxKWfggKBJ2MOdgAHeFy1nELK1c+CFnxdvSL+OxuvSxk8HYv7YMJDTR4Na + 1D5GaFedB1uYVQsz1T5e3p9B+54W4bObByD14WvTGKV3ys8FlOf4MdRIlD4o6N3INfHrNbYX + zwPKjkoYbteAEQ/kTpjESOpm131io=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from : to : date : subject : mime-version : arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= colon folding whitspace ignored", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_cws2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=0+WA3Dpt9Y1lJ5wkoOZsh6KXEQFv0YE+ykvXAdS5t1toEui1UWzLyKWxSD/H/Xc6eCaQZM + ji4IxybZ4OrIdV0yRe1fGqYN/bJ3KnkuzrHpaikXRWxXdX8tiIu5+I+HmERxuGzGqHdNv2zj + 5L8PNAsGs4LDg3xQXEe3FQAvis9OA=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=Lq5Sy1R3C0RaTxKWfggKBJ2MOdgAHeFy1nELK1c+CFnxdvSL+OxuvSxk8HYv7YMJDTR4Na + 1D5GaFedB1uYVQsz1T5e3p9B+54W4bObByD14WvTGKV3ys8FlOf4MdRIlD4o6N3INfHrNbYX + zwPKjkoYbteAEQ/kTpjESOpm131io=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from : to : date : subject : mime-version : + arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= colon folding whitspace ignored", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_case () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=me1uYrnpt5Cdjkfj+bqK8X6abs8TET4r5Wp6e6ZuZ2FAtSzfx8WdnHCnBLUj7t/PR+EGne + h4auyljzkm2gz09I0MbaYkd+xDmkRoN2WrFotceq+iROoDLf2NgZJb3SfDcVFp8emRMyyaGL + WAtshPjJWnjoNfm+3clEpXzPw4WM4=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=OCzwOGeJy6YL07Rh1A970C9pAK2YJeXr0rDVVbsd/aOxTeKbrIxOfQsJ5hYaze0aeE5U0p + y/45cz4Jg07Ch61xZ0G3R3ne4eXxPauAU6QKPwr45HxO2gDywmNruiJP0JPTzcC9SVV/YjyL + OGobZNIwUWR1hEkd5/UuAXHk23Q4g=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=From:To:Date:Subject:Mime-version:Arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= case insensitive", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_dup1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=tv8fgth8OQw5DylJlW253wBM12VcMvjFLj+TwonVXPiSPJ1hV7F24q0rgmYeVhSBK/+4Ou + kPW3e9oqILXx95sXrE4fiiz46//FtZK7z0YVzy/B3QpR7fGxzzA5uVoUh4WNd0oQEejwDKss + ILrzkyu6fDUZ1kLeKyk3clE7b/NJo=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=rGZpmx8nA8Fe0yQ319Ns+DPmwx9ToC7Z5Ba5NNGYtmXF87xboR0Cy7yxlJ2ek6j8WqCRXI + jKV32tgZBXu5upoveTLBGzSe+NPTL2SkU2nFnktJjjPwTiPAYyXVBY1Uy7uSv9dT+wfB4Hvg + Hm/nSrzqTBOxPsND1F1b2rzE1elQo=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: morty@dmarc.org +To: evil_morty@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= with duplicated header correct order(bottom up)", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_non_existant () + { + const string input = @"Return-Path: +ARC-Seal: a=rsa-sha256; + b=cEfCkdG3zAUpq2XMYEvcI8e+nD53NUuUr/NQ74UBTzSVJBOsNQKADtUWqYirSlB9AFeEIq + VGstwfXqh5TiMv1Uk9O04vM7WxrmMsqZI+GiRQvtaanfZQMcaYME1pCURdkDbMK/MOUGV+W2 + j9anSPB91SOQruKUDtqgwq8z87Ajc=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QHma3KzZiiP6Yq5jWp+mLznldNAMpK9ffvI87mbvEFFd1YSfoJu9JrxtBgv3/MEBFHLPm9 + qTii8g+94xOLgp/LEC/dM2E/u7yPAKKMz5fMzJfwqSGAGyBg2f12Mkyaqs3dzv97nZTZFkj8 + mHCV6SHNfnC+lkIs5XpJNRtddvolQ=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= signing non-existant header field", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_mis_hdr () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=FCq5UA4xGNozfvMgZkQ0Wpu4Q0dkGbrNvMKc0SNQnbObHCA84DNwUUp+I41h5ZvwQBAGxf + hvUfjmsMFHBtsYj/aQ5kkehVPkOZ/6hengnO0IJs78Ab/5eivdD7MRLuShcTWd9qx32dVFJD + yx8qIaRZplvJYl30ry7sOJQu4qSZk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=4TbROXpBlHvYUMMvecTyaEqk0DtgISmfrz9L7QEizbAaI6vgDPu1xD8LSj4CfHpak6GMde + zpqtfiITgVTBKbkZi2kuFQwmu5xWsReExZEiNq7Tr6L5iObGjL0A27RIBj4znEmO6mk2Umnl + +c6LR5XzyE65FGLZ+9nSH2U12klzI=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to::date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= blank sig-header", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_non_existant_dup () + { + const string input = @"Return-Path: +ARC-Seal: a=rsa-sha256; + b=akTog4W3hR16mF9pNZIhHzcceyST1LHWaIsDPobRX6iy5jBRbpb+lyKlcyZmS02T2kFYG9 + iOWQ6UZruiQXQu/u/GSkn0RSCwHWTfb25YqrQBLwH7pki4bDGHrTSrGbuYnFEHadYl2B8Gxo + UXYn2/XBBil6Dkku2SswdN6RZhhoM=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=CvqFe5bB3kFEFvITOTVx7VcrJQBT5aAtUJjX0h1L1Gh0MtUQofgKfOakgKr5kUIxv2foZY + KJzwNSuUNnDyY87HJeT02j4JlpYnj0+PzB8xjW2Kj4/4TrLMkcJsfC2wujZClzXW65uCsFEb + 0ht8EEQis3581f6/S2V+2pHxvqRiM=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results:mime-version; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= duplicated non-existant header field", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_includes_ams () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=XSOc6bESO7Ek4iCPyVXVE7aR8HUBBOXdOKmFpJO/3DI8rLRHHfRT9XAML3OsBE2RYj+0yd + ypsBg8UQEewpY6Z5KEUhxfzwaBGObKr1pgwjkYiOBpPTV1Xfv1lGT+1qlJtBR2AGJauCEs7G + fNzwa3MI+iO9E8g6aO/m9Mk1BlLHY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=vpypMlcZNGmeVETFS/+v/Uk9npQE1LhY8tha0XTaeeNMgK1fzWaxvUHY0cuumuzK2pU25O + uWTt08QEXczUR/BLmiZaYUWQV8qGOAv5umtEshqjB+0KPg5W09N20vQp8OXMQrenjZz0YPsy + VweEidqd3HAcWSbZgW3jAFKXHGSXc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:arc-message-signature:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams fields h includes AMS1", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_h_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=O9vrOnKLOdZXxa46F8RDPTzqW14JYE7idGn0AfedcpWh58mPFE9jXHeaMda5L59thiQrJN + T7Smno713R6DU9CfvnOvq8rQXCJ6D7GzWFhhOn6wEbjTaFQQ3jHn67XVDVnb4yjLElVhixob + pG5ouN8U1TPqPWf+41wrIrCd5Mocw=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=RidA92CmsCgK81At2aPnlGuFlbvNT5IdWz7Z/6j765oabi0LEDkpB+2q+C5TJfc28Gj0Ok + gghf2ykPbb7WniSvCue66fvUYaABU5m84urSzGd3MG3F47vTzCQ5qLah7E0UssP2QbP2b1Rt + Hry/RlkOzlWeSlxpCcPvArmmcADTc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_h_dup2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=tv8fgth8OQw5DylJlW253wBM12VcMvjFLj+TwonVXPiSPJ1hV7F24q0rgmYeVhSBK/+4Ou + kPW3e9oqILXx95sXrE4fiiz46//FtZK7z0YVzy/B3QpR7fGxzzA5uVoUh4WNd0oQEejwDKss + ILrzkyu6fDUZ1kLeKyk3clE7b/NJo=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=rGZpmx8nA8Fe0yQ319Ns+DPmwx9ToC7Z5Ba5NNGYtmXF87xboR0Cy7yxlJ2ek6j8WqCRXI + jKV32tgZBXu5upoveTLBGzSe+NPTL2SkU2nFnktJjjPwTiPAYyXVBY1Uy7uSv9dT+wfB4Hvg + Hm/nSrzqTBOxPsND1F1b2rzE1elQo=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: evil_morty@dmarc.org +To: morty@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= with duplicated header not correct order(bottom up)", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_h_order () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=vTCiDmh8p+YFqH8WSxCrLVT3IS1Xmt35hs9y2Fb4EriRTTEmD7lWa0UrCe9j/a3yftcMAb + 8W01KgTrdIhmUMF7YrElyT1cGc0ChGHmdkuA2MpVBnLJMCgtXEQkWcVRne38KB9P+GLvr5uD + nBOjOJNoBt4Nt+Y8zCKG/tN2RetKk=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=2o+Wl1gzbDmg4Hv5q52M7V+E6KBhMISVmqTDrk1HfOgMJwJ+0v8Nl18EjbL+iOTu6Vxz9+ + 1m64cPsNr1Tgm79jjqugOKDI/yaU7h4DaFMmN54tGX8j1ElMXSl8ghcfaknApLU060vKVUoo + F2GfD1qo+SSox3wkZNkPQdGKjNmQM=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= mis ordered", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_h_empty_added () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=cEfCkdG3zAUpq2XMYEvcI8e+nD53NUuUr/NQ74UBTzSVJBOsNQKADtUWqYirSlB9AFeEIq + VGstwfXqh5TiMv1Uk9O04vM7WxrmMsqZI+GiRQvtaanfZQMcaYME1pCURdkDbMK/MOUGV+W2 + j9anSPB91SOQruKUDtqgwq8z87Ajc=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QHma3KzZiiP6Yq5jWp+mLznldNAMpK9ffvI87mbvEFFd1YSfoJu9JrxtBgv3/MEBFHLPm9 + qTii8g+94xOLgp/LEC/dM2E/u7yPAKKMz5fMzJfwqSGAGyBg2f12Mkyaqs3dzv97nZTZFkj8 + mHCV6SHNfnC+lkIs5XpJNRtddvolQ=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams h= signing non-existant header field is then added(MIME-Version)", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_h_includes_as () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=OuFcuRk6CdaxxeBmCdvzoFxM6G0xmA3XNh1F243uPQsstHJ+T0csqD6PADig/UPV/Aj6fQ + kAOsyZOzIK1X9ZCZLB2idFymnyWtYc2spNgCiSfwQiQuS3SFVUtr+Y7v58PtyAy2HCb2pA5I + OIY1WjbK1Pd4SrJbZ4/M0d0wgFt7g=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=T5uPa/aCBkG1PK5dsSgO5US5yVvKnf/DAsyxMDCLVgw3auULB52XaLkZbc5KAcbGwz4KQZ + H8TTB1qbdHGyUpA/1Tq4QveM4z1x/s/2gK/thnoW0wWEHu5frgmd3tVg8kEjrmU6HOJ1SNYq + Qgjxvsd/OwpjYsfOjODwgyGDR/doE=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:arc-seal:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams fields h includes AS(1)", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_s_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=zlVnN6R6lixbru5oAlqBAalgQAcbqVJi0fZe8u57TJTTLHNl+LRLeQRsLQ4OcZ2n5XLTSZ + ZAEsfzFQWeFruAnDpA7yT7/YTUYvQM7KdVzx4vl4FSTllt1wb0UJ0SNjlNGiudA94D43LOsx + CsESqhYaVWRz4gLkD2P6FfqZLGCZg=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=1yhACoFkMMv54Xwy9PCxFazQ8BtUb99MhAUEk4Xwq7gVqDoyND9X+pa8CGMYSNUOn2I4tx + 4PyDzLhPNf+a4AciBNvFhHwK4lljIQAS514NuaNfv3PR0KDkkoXYv8J1EkI9yAyvOzl5Ka2B + 2yNTkGi6GucEwUlu2Qrk0RYhOYOVM=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams s= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_s_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=iUyd0NGqGiWwg11FiLSmb+053tfp1baKV04kpufd+RESTCeMHlAHj/N2ZyLCHnCZSfgDTb + hJy5KSpxO1nsSOlG/FsI6zwfEWCEP91aNjzEQxrX9iCg/zihZ9uv3wgmSOasjjt2kVGCcJUM + iLpzGuccZW6C0S8QyOA8ClL0cHnrs=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=DMnmzfNSgbRhHJmeSr5Ahc9FzG0ZFQxd7FVPrmmbpB78dtA4tjLUywkekiqhABliJzs0ut + zzkNYHyP0hlxGTaYOQ6OgV+1loymJCJDin9FhPV62CGOBXznuaRxFI+aWKHjW6SFFrZplQHG + UQcAeHg8Dd8tdKV4dgUnuW+aphtiQ=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams s= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_t_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=rx+UjBcicBZ6s5/J7S5oMw3YVWAWg+q4Sb4XqR0tMmhOyhjLq7702sEFlEDHJjdTuTVMg+ + c2qwv/XucEGW8/i4AMzNgkzpwk1Icsr0GHGbR7Jm8V+k6Z08tvQ4x1UaYgrTKmSQeyKq8rQQ + rRdzsqqX73OFp/cKLa42T3JVTrQpc=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=iRbmo9I0Qn8ZELD2xJ754eoEATUfoRxli5qMUi3AQTwGLHU6oaLFsAP7JDYjRm6al3XGp8 + 73NpnbncM6dnqlBvKK5OmekgztBKiyo7w0Uj6NZbq2KJXYiVW2vAbVkNwy4vPNhMHVTbD/xB + PWROiovFOL0q2mHDT1KKLiSzEfrWA=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams t= not available", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void ams_fields_t_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=J1fBm2GXu8CCXApvRsyBIITcTcJ4MdgwPIUK2e+vU57BId7RYv2i7/ORWrImxasfuFD17v + oU0TUpKqBmD/o6ZdLcgxg72iaYN7CoN9uK9Vr1llrVHuhJa4WUW0XG+a3XqKB2PXJh0LckJu + 215qpJ4wqx+/6aGVuxQp5LXwktEDM=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=GO1zQzqzWlsUbs6Rag7bYFPB2LgxCLkex8PRM+4/IbysgHm1TVtsPCVAAYp8+MK8UDyuuR + s3wgba6Zgh08O4F3MGn5ouJmplCkS/mF1MTAuWF1BiBkzYTdNmwhESK3GBTDNgTzBwa0upsw + aYiT87hDd1aqIKekvR3ZyEtZAN0Bc=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t= +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams t= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_fields_t_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=g1Xr4aSSeSDH0CUBae/NLjI30AgmGDwAdG5BC2c/OuTKGROcimWkt3ikql9YlvBv/3O8AQ + fe1XJqEq8EwFpKgk2YvMiWV4YKWPGb4DVNn/N2nk79o2KH/DlXNU4fLGvae9leiu1E+KJERC + /sYt7EA0rffMCWMjfHivWEx1swomo=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=B9XbvvEBkWcBoOY6hBRGeJLsADsuzM0ZRvpeBWgF/nx8itykfMZmdeVPzVY5SI7MRCi8jp + +RtfP938tY75D6wfNd4+mrDkHyEQFAiE+UlYWjZOGx69go2UQyN5+wocPHHps4n9j279es08 + zmmxQXWG8wuoq53Y1CfrwNyniO824=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=icecream +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("ams t= invalid", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Arc Seal Set Structure + + [Test] + public void as_struct_i_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=2ScmNq/nw+PcTFaRUZr6ynujs8zh0C1dJiZhO7XwXZ1Wgqjgql0NJzCEPlZ8JLT1EF9vx0 + iCa9BPPYBmopN0d2UcZVRS3rkrioxlCXfCA9bFi287v/mZCAYY0vkEJqpb60oAuOTL4CImqd + FRzkc52yZZEYC4U/gPyluWJQ6P29M=; cv=none; d=example.org; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AS i= NA", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_struct_i_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=HDF/3ZvQV+3g1pPoOxLwCgVUgalgi68PMmydT4JHPFEq36jEkMwATstQulCu4Qexedp55d + 3SX7YupWVg0nkl13bghp7ax+EvGREVTqPCLjawLFp6rLkM24ryiJb4xwF9WtXHWZlZCJUfTl + kPUpNHxi52l0u75XeSe69lB4rCWOA=; cv=none; d=example.org; i=; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AS i= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_struct_i_zero () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=ATiDsxkI1nXV+hpjshT3uFaKndUOSdfMdrGgmZvHEDmTWR2oWB6bNbG6K83D/C/JKKDs1G + 4XLhmWn+5wGAMMkFCdxkuqIxjco4UHJkBj+6KwlvJv5/1yxAyZXdBR+aF9eKrz9YXyrNgMsi + CADCxXR/5RV8W6sB+Wxrgr1CPkitU=; cv=none; d=example.org; i=0; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AS i= 0", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_struct_i_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=EcQ16Bmi1GglUN2XnzTmixnR74rMt6K2VhtnHiH3o5+nLA7IPD/e9EbMjnhWK+IKw6WTdY + MrNju5/13Hy9aUnUNDKRZrFbZx8bQzHk232QjFs1KLaUOwFUarbBEdHGmLRxLvSGzzYDXxFR + ISrT+Q+55ZN0f5zjJbkeNNr6TraBU=; cv=none; d=example.org; i=blorp; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AS i= invalid value", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_struct_dup () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("Duplicate AS for i=1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_struct_missing () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("Missing AS for i=1", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Arc Seal Format + + [Test] + public void as_format_sc_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=sQHCWC9A8lAbvcPG+3jfih4lRJY/A0OI/GBGE4AYHf8u9cgsxOvyCqDWF3mr91HE5PhNh4 + RZW95NC6qhxEhnXLaXswqco2JXMVR6/rM5Q49bDE2RtlNen7wubw56NoJD2A7IGUSOzHaAiJ + QhRTSoyG5OwNBC8+GlugUJi5mmZNU=; cv=none; d=example.org; i=1 ; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as format tag whitespace around semicolon ignored", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_format_eq_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=u4XUza5aJKdMCwCMffAieua1x4N9tZpKlx7UwMcdgV+BuIZc48C3rF8xu6BnoRQCaulZmW + 4EYspmshC6cGg+kmYaWR/sbW712Ag8W33enEcoh35XLTg9QHg7zWvftk746RrVFb5Ch8iRsU + PJ0gkAieomzXwlqCIBZQD5Yz2LB38=; cv=none; d=example.org; i = 1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as format tag whitespace around equals ignored", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_format_tags_trail_sc () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=AcBD4PAxYztV5R8jYyYXKuMBWBRja89F6yBTQVtQ1FFUxQVYGOrFlnh3/r8/YtFt13NELg + FpYeY3gnzudk30PoZZvM2MG9h07ByTgl0lSEsRLhN+ZtqoHRq1QGdW8oqOXntI51FbKwBdoe + cHtLh18GzKAvazRWzv8//vQInYp/Y=; cv=none; d=example.org; i=1; s=dummy; + t=12345; +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as trailing ; no effect", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_format_tags_unknown () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=FriX6cOxgBHhZwNYHn0KXSWVqwHPNV6sRAKUy9iN1OqwvAK9USwMsg/P08yXrUH8LRaijm + msJjp0KUFYiffoQrhsxHwv1hJIGceJZB7lOFeZn7Z5aym4eBp7q7idwNyIaGKL7E0WzVkeAT + RQ5LhtOInN23gugfmW6z8MUUvow5Y=; cv=none; d=example.org; i=1; s=dummy; + t=12345; w=catparty +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as unknown tags no effect", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_format_inv_tag_key () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=f0DaIeWMnbbdvwQoBVCi3pw8hmSBdK4xfQvJH2BM0qG22MkQwBAsDkD/dnAML6bvVeMFjq + aaLsCccFC3IZGvOzTsxbJTmbV0gHdPdYcsfhctXtrHfc/KdG1sgnqp+oGjrkveFTYUBO6UdX + ncJFPHoSnLp6foW3V6zUO9mcuDmeM=; cv=none; d=example.org; i=1; s=dummy; _=; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as format invalid tag key", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_format_tags_dup () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=IO43AZIKhbGLyWUCD6LAC3GeO+S9ET5T2SFkq/QCjOT5aChUgUziIlm2REH9SDMP6EfWwL + ex6l4ndFMruyh+ReaORg3wOaXyf9nM21VO/9GyWpNkfMnVIzxspuNhkPsEJz8QglmQdp1Yww + OItIuEZpAwkFDMzWFuenMY0RnncmE=; cv=none; d=example.org; i=1; s=dummy; + s=dummy; t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as dup tag error", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_format_tags_key_case () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=3RAGO9q/6XejhXohu4h3a1at+M3SQzh3NvUB6/9n2fWdnCAF/Y8fvEgul01qPYOVm75+sV + DzX8LwZ9M8xvbpW02HPpiwJdSfMaSHfLFl7Eyz/X+iV/JhOovv9YoDfpkToqbisARZ6Zo4p+ + Ctok9hM0WxtmOjXqyOfFXfpMZRqI8=; cv=none; d=example.org; i=1; S=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as tag key case", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_format_tags_val_case () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=Example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as tag value case", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_format_tags_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=C7Te2RjPpFj3iKc4sPOTP80VHV2B/IeAl3AmyBOETgmdWrOe+q2lQ631QpI2ur/d5i9C6x + gJvRBbqlGya23VwHyaJPrP6IfWnXokjrcvdnyWX9kvhPCVTMrco+1ouNkKrn/5Rf8OTAYCzZ + daX8nbXMUANlFgBEQ+tvhb4PEMANc=; cv=none; d=example.org; i=1; s=dummy; + t=12 345 +ARC-Message-Signature: a=rsa-sha256; + b=Wy3KTYHj5wd/cRfKjr5Or0eOK0YXjU4HH27PRGwY8prB01CRav1Zh4Q+tOZRrTLbYDrPUH + QKwwxuKQ3IuS5+R9ugvuONhvNHLncIDvvjmK0dQV/9c+/ewkHBU9jZRfDxNMcot+eKUpZduO + xzUR/tDACt1ZkT1SOwRDAxaMs6+js=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as whitespace sensitive", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_format_tags_sc () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=qfPkkUJh95JfdvuR67QiOVg0n+krrwlShqIFXu03EvgP+1wJHVJy6M497OPlK1QC3FGXBL + k2Af5aTM9pyRO4bDX7N21jvGLoF2soMk9r6Er78OFalImdz7rRdFu33PR3dMCFe2cjGkPmAO + 94UKj789r5lfy2+QQwQskXQX/r3pw=; cv=none; d=example.org; i=1; s=dummy;; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("as random semi colon error", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Arc Seal Fields + + [Test] + public void as_fields_i_dup () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("duplicate as", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_i_dup2 () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("duplicate AS i=2", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_i_missing () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=uQtcSwvWdWWtq6seWx/+hrglo0DIevtxBse073F81rkPD9R2U9I11RE+rTyP1f49VmtxOX + dQQY3hMLr+174d1LdaOrO7w98KKt/sAHkuVGaeUrNCsaPWSVyECdoQwEIh140FzHkW+6DGcC + KYTb3l2Kb0/AH9RdhJ1kOft2hrOeY=; cv=none; d=example.org; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as fields i= missing", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_a_sha1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha1; + b=4aSdpG91pnuWdSUXPchtTfnFSWkenWJh1zIKLwT2EVkCNJ+/5clRA5sFonDxmdOrcEgzrh + jiJuxnZVYXdIkvW9rMe5BOG5walucWYuNkuO7ph0kRX8DRITxwiZYhFgk8OkCITDYNF6h5vr + rMF5vOKCaWnpiGTUlPqBOgakyN9F0=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as a= is sha1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_a_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: + b=gwz9qNZBYlrJY6xGdb0IUhGEwAlOmJsjSfyp8FmWwlJs9URrrikXoFcJ5dJkYbFAZNfXU4 + 58XhxWSgJ8x2PMN2lkZ1TkL29SRhgdn5VAjnjHpr4xE/2i1hHcZ23Nj/bhXe0TOJq1n5hoKk + Atsos2ADb7r+Nf0AOnNle+/vTnS+4=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as a= not avaliable", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_a_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=; + b=ZVTTqGNJFz60CcTjJvJ2TBUgObDEGLOzdYTh+abJ+DiXUWfUJWxM5WD/dU3C0vjBu6Qcke + 8swPTOsTL3lL1v0ywSQCN+ZuFbEn7fy9AMvXadmDgEuht5qrtSQG9rsuF9m0VePnf6k45HlX + 3nICQtx7sQY16JBG4CTrBQWYSpaDU=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as a= is empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_a_unknown () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha42; + b=cTOOMtw0jXisFRCtFshIVNExbNgtOyrGNUqWObVvJPmMYBNbAfG3y1101xcd4nrfZ2skNr + xn12jM1JPwHBu5Ps4qjEeHDvxJK09vbxiOxviu5SDNhVUJS5V3l2VBagMpyuO5BL1OG6wjy/ + Xuzt1Iuhk23cJ5S98SqOVik9CCblE=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as a= unknown", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_ignores_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NV E6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT6 5S0+ vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= ignores whitespace", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_head_case1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-SEAL: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization ignores header case", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_head_unfold1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization headers unfolded", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_eol_wsp1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization strips eol whitespace", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_inl_wsp1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization reduces inline whitespace", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_col_wsp () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization strips whitespace around colon", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_head_case2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-SEAL: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization header key case insensitive", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_head_unfold2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization headers unfolded", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_eol_wsp2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization eol whitespace stripped", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_inl_wsp2 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= canonicalization inline whitespace reduced", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_512 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=DCbMvnfI7UzqahO9GFjYXa7DAcon0abOMQ7mWykqtdkEe+rqeQmsy1/pV9oAeSrT9giBqP + +cBNepG4Nycj93KQ==; cv=none; d=example.org; i=1; s=512; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=BFnboE5xz5OBBIZeB04CaX0QVCRysZesZNKLQLDbq3ohfHL0eIkMWyt/ZkP3+bg7wVEtyb + QfqbbfDRTQYC3GBA==; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=512; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= with 512 bit key", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_1024 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=JZIhBQD/1SCIn7IUrIoqCDFZ4k2tDd5joLebC7dCEbEXy6HURnayDygFjEiVwoVjF8XZPo + tDSWEVj18YLFQ08HZigNNDmhAdtIAeHs5bTfhz3ZDKGISGSrVbUqvS5QaL2dwaY5V3FhH1QC + VEohhbx3rJKMBiFCbQoCRo555WNL0=; cv=none; d=example.org; i=1; s=1024; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=jCTMZoXkSSVEusJyP9cbvAoKEDLphi95R/yaX9+gWw2t/RduqINzxPSVJZUq8uVCbKdB5F + BlBb2m7zbwaq6/oemTqI1tcnRaAt66Z0cyOKfPjRINTm9C8E3hUoI9DzplkwEoqmhR0wOjcJ + H6ASJr96Kl5qLu092VFaQYYxkwh2I=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=1024; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= with 1024 bit key", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_2048 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=R6I8tV4Y0pBQWId+r4W9L3TDi82iVPot9d+ux5u69ET/VUTQUPFAiRfTBqMKAm0dY1HCdU + JZggmlvj9BwZMOO9pFi8O1EXqkJ1CpNtFyNn76Get96owYXh7LlcP/C/a5AmxZMmvKblloh5 + 1rL2cNWicsp8/y3NS8jO0KWpSis2jK2yMn+r9gJ5gM2sUiBsKDwiYAhFBhjD8SFQOaG6DzLa + mJzCw9FkuGdpLfQoNDq2lLQq6APq8GihFJai7o/s8M4FItAMoteuqxIfyYuH60oX4qNOsaIT + B/6DnRCFshABODpSHRRIH4EvCu2fYYo6YDIU3VvDH2wOO5fQMcgvUoNw==; cv=none; + d=example.org; i=1; s=2048; t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=M0YyrXMDoG5zJ0ZjFzUqFNoDFatu/QxWTjyAH5wPvPRiSqw2Vvd4A1Al8VjYfmgbP4Jd8f + TFDZg1kWwLYk2IO/th/P6iYPfyDg5qp6mgao/V8NBW9P/Mqlb+xhkn4R8c44vmen9atIUV3Z + 04QzziVeuBxj+NFqxprbxf42Faxv5XymGmW3ZWVhOLEpwfcjy933drLsfZQezhyYlx4klptI + v3hKM76++GaIUc1nWXvmkeKKjEQLiUzqxd9Om7SRNArNe/q5xnVIaufxSfZNUtTT/o7Ic1Br + t7ZV8qwmj37sYpdZUo6H7QN+dp8E/J0jnbI0ZQU2mv8Gj3FqGOGzKwGQ==; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=2048; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= with 2048 bit key", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_b_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; b=; + cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_base64 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; b=yo-mama; + cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= not base64", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_mod_sig () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=kKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= with modified signature", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_aar1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=yo-mama; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= modified aar1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_ams1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=I+Px9EfvrAFqYUnYPrC+egeUwxCg1LdNSIJ6v5sQfwua0Ox37z2S5GdknSdfjYKVDju/3p + 49rDu1wy6xLD5byG2qV2IDUCKmNH4QY6yGhb7ADmfrHDdICMYf7UDIBL6nUQsZHPeAUn5HbK + e/PCXEu9m+wpAEuDKvZxUNbNMWdQM=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= modified ams1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_b_asb1 () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy2; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as b= modified asb1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_cv_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=u92e/TiZvqtkvgZxGLd6EF9fZvoFJ5mqvwEkb3m5lXbgo8/wN+iliOx07lU/rOIsHa9YqL + QYUapWkkowhdKKFkixhefUUoeo9n9SIcpV8wywx3szGOhrwyHJIBCWr7nqaEQAS4prJzVZCi + 4eEkPPQ5OdzZGMu7j53QCVzdmWsdo=; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as cv= not avaliable", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_cv_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=EhiACA5ymmD9SeCvreg2D+83hTBtus1JsP2KC0CUBOgmdMeiGuCIHiJG5WAWpXhd9RQhRo + nxTU8kGfPl2sF2GAOujiie2cenkejRgwYQv+MLeRCT1MALEvrOsytShDl5reRltuX9ULPomS + GBagChWg+NI9bZGMxnntr38QPFj5A=; cv=; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as cv= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_cv_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=cqTZxmxNU17ZUNfRJp6FvTfpkak6t2MCK65F3ppS018sPBGTyupD5q8GHdozKW5iCIaFhE + rZQmKOD2z33Z/h2eiFY101fFxesgDJpMgbeo0zGfgmJcj1v6nDXgq1FrUNPaauBOJV8Nb5vs + B0H2qSdtArOeD0mlATMKfESPA5mGw=; cv=:); d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as cv= invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_d_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=YPZ23nGkCxrMd1193xVDIR5/J9Kz0AOanbuHATqRJUDT+KkiB8z6+vk+3qsUiH8/7+YyI/ + Qqmd5O66qPq/ntXMaPnUhpQgKTj33KcGtD7j9m59imfosbjwTWrVatHo8okYmeh61ZxI8LGF + ivZFDrqRI2YLfIG313PtmdUqZJFcY=; cv=none; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as d= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_d_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=pp0092UMeSYNP/NMoINT5QeuCXJ/LKOw4Sotuzu+XM4RFHL8CbHLWT/stFYpif9tVsVaEu + h0SgrYexYI+lvEqslpSdCIgvVanRoSVC2bn58OSVVpZ/8r6/8iIXdN/upGPZRhbJLtSwuRk/ + kbKzXfLTY9yy1SMSAqLXAG2MWBQpg=; cv=none; d=; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as d= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_d_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=e44ivGolh5WOt+GK0xvrRrWcEQnLTpbmx4VqK+osiYiEceAJl6RdIuaG5Sdvl8JLbUcHJf + 7Z1nOuA71nrpTSGEh4kE5bgR/XAtxElq4czlU2B21nDUI5iO5IJTZx5uxYuhVh500OfFxKvP + vk/65F1L8kU45uMhTjih304WuYZ7w=; cv=none; d=***; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as d= invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_h_present () + { + const string input = @"Return-Path: +ARC-Seal: i=1; cv=none; a=rsa-sha256; d=example.com; s=test; t=12345; + h=message-id : date : from : to : subject : from; + b=mIurIuLl0/wAxWhA4DBS1wsUE15IBnmJ7o3sH15hIuesdD4smz1cCLXVhRtxQE + rVtVLv4OgNCgdFsB5zbSOUao2bSSYP6y0BGyCWvr+hU4tai5axIc1Kfwbtv/0Mqg + waiGJPreOAAeZOJ4vPfdaAbSXlN5MI4PHW89U82FSIBKI= +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; + d=example.com; s=test; t=12345; h=message-id : + date : from : to : subject : from; + bh=wE7NXSkgnx9PGiavN4OZhJztvkqPDlemV3OGuEnLwNo=; + b=a0f6qc3k9eECTSR155A0TQS+LjqPFWfI/brQBA83EUz00SNxj + 1wmWykvs1hhBVeM0r1kEQc6CKbzRYaBNSiFj4q8JBpRIujLz1qL + yGmPuAI6ddu/Z/1hQxgpVcp/odmI1UMV2R+d+yQ7tUp3EQxF/GY + Nt22rV4rNmDmANZVqJ90= +ARC-Authentication-Results: i=1; lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Authentication-Results: lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass +Received: from localhost +Message-ID: +Date: Mon, 01 Jan 2011 01:02:03 +0400 +From: Test User +To: somebody@example.com +Subject: Testing + +This is a test message. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as has h= which is invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_s_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=P6fYgm79ZAak3Jov/xVCFA565vivmIK1TRc3a5bXLaK0ITMGov8fPDfBSlkicrEA7+klCS + U+N4M70a873UxJAhtbW8aTgFfGA71WeXTJtsUO9k221Xg3TosedH0Pv7Hw6H5+xwfREaHwzW + 609JaRP4xYSgiRQwbV53oJLXsUBA4=; cv=none; d=example.org; i=1; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as s= not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_s_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=s5XP6OVPaP6aRAUllKkgklTcVFSRt0BuJ/KsHSBkzUlu8tlc8xHNLLQh8kSj93G91Nzrht + 2TSNCGbDv2n+fTkUBvUw0Gv+rS+w/cGv3487x/0D3kKMY/AsnmbmKYy7demRQZueTjZg4oBd + ictli/7xMAt6WUmqpssBKMK5wsfp0=; cv=none; d=example.org; i=1; s=; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as s= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_t_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=JBVkqSG5Cg5D7lzXzyoLhk5/SMvhUeqxndqDKDjLQSici34r5d+fQIkUosiU17/jueiGc9 + UpZl2Gv6wPs7TkgwxfK7GG/1d4P+/cYE6efo8xuPSZGxoSQEZhKTjXL9Apup8Up3e/J2xBjs + veRG7RbXqMc/vL/tmGxsJ9aSjSIKI=; cv=none; d=example.org; i=1; s=dummy +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as t= na", input, locator, ArcValidationResult.Pass); + } + + [Test] + public void as_fields_t_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=s8yFqRcEb3EBxbl8zc3/Q7Yni59wWhj7+NDrxRaVvVJ2f/e4FKJTIcz+0i9z+VhmX41Zu5 + Rh2CQwD6bnkOvtHIuHoxI4LxOhs/lvhkcBieiqGR4ZeZlOy8n6mmnbuHIi151pNXK79ZxRdr + 2axc4DYl57RmQKI+jVPwiMygli/f0=; cv=none; d=example.org; i=1; s=dummy; + t= +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 + ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as t= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void as_fields_t_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=K4NE5fZ5bskXwVAbySXpU9ys/ls+gL97+qh/HSFgSAkBzAxQ355pWkGTKLG3SX95OEljIO + tFiBuwYKIiBXwYbl6vpsZpjS3AwwdtV+rFqwVT0oCwRv2SU8v+wvg/2uzgUMciit+WNI0sYr + +HgFzkt6yR3Jpg8Y/49qKPXZcYR3I=; cv=none; d=example.org; i=1; s=dummy; + t=-123.4 +ARC-Message-Signature: a=rsa-sha256; + b=uB8ov69KIWfAiTqT9UOTg9p4m0u8Zi01NUVf0iyzeNBpJR9VecE81x2VzQBxfPnp5p3uSd + H7A/ExuHutPbPzSJh62u0HpIIoSoxzZtSeESFwIJJe81Iv8SiuIuwCtih+wcNxPEoou7G0F3 + fRI+n99QEFryjk9dsPBGW4NFxNzIA=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("512._domainkey.example.org", "v=DKIM1; k=rsa; p= MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWmlgix/84GJ+dfgjm7LTc9EPdfk ftlgiPpCq4/kbDAZmU0VvYKDljjleJ1dfvS+CGy9U/kk1tG3EeEvb82xAcCAwEAAQ=="); + locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); + locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); + + Validate ("as t= invalid", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region AAR Set Structure + + [Test] + public void aar_struct_i_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=XPyfGHSOsXbhiqnRuLe8aUcX7VI+ULipPwkVdyFW3vrDgWis0ZGj5Exi7MVCEZqHCPRrz6 + cE/MCiMIKvLKaNOoN2RiMmGxReyuMqxB1cFgrlYSsY2juOuKruRwnyvdojfJKxkZtuwbCbEI + oP7AxLlImiJh8dL65hcqiVYYwkCVo=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=pT/KGdemFeMECKnNp/zUgBi7JEBkqLYi6OiuMNFk1lu9MvIVAphMo5Qd+HwcmduHcKnTuE + BR6G1f+FvrikTsz71tFpmz7YMQDVfnd889YqzIMfkrHVmYz3Tqkm/leEozN+3QSDthphCGja + elxeYITZ88vPyJgjqeB1RZbZA8w1w=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AAR i= NA", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_struct_i_empty () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=2bCJqMNBHeHfGn4ydivoDNuXl5l4/uFJRjSq20B1IFuEwXRBItAHyrnJ2kAeKyN2vDyF38 + aeVMW3JpEr6YYbdWz/QIbn9PfQRLJw8mDAdIWIeDf77ckQL9pBS9u4KnPzSRlvBrMvTJcHI0 + X78AQ+sF7GHuW+TQE3w76leY5chNg=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=ssDGg3IC3l9eIU0QVB6442p+icX6zrpaCDc6MdnR9waROdPPl4ThcRHhU19nHBlEqvc6Nj + heWBORRpH93dQ2gC1dh/kYpOu7GUr7rbTzO3FYICnbTCbZWHHkyRPjKGUDLKZxt2zOnT1g+I + FiLSqI5zVyKX98w5q0cUroUaFYyOg=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AAR i= empty", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_struct_i_zero () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=KylBhAsgxwZcei83U8RCLOL6VAKrUTEqgMRFrfs4wdvOfJhb4QLzeJoNuL0rru8pWd/y9/ + zEYgBxCGpOGkoEXyzrDE+2wbNPn04kjJuTpMfRbHljy6kjHXRf8jgy44iDS6zx2dkV+YRP4n + STyZLdj+YcIrTvl/DSzidIX+QF8tE=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=G459JFdl2PXVaqhTFJwqpBaOCUiASVtWpkiQrIPiLPDpPoGT3AhaoPDpM3ogUhURRBAkQD + bJqcY2XJ2F2NAWf260C7T/q0DlO6D0/E6IsqiY5seqiBCPIGf4B2yMjnQXf1qTHFNbbJGICi + k6bE4r1ZCT7Cu9CWFCCq9TWEthhfw=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=0; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AAR i=0", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_struct_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=ye9OTXk3fAWUMwhQFsBSTjaDkrXXFzifyP5c7No0TriPbeFK0cayi6FgudLVsSFLvibCAJ + txOi+Zfx9rn0TyhsNspRg/PY8+VSZJZtxOW7cJ/6nLZPh3XKfhx39QDQPjyc3dd03bpAckRH + b6vJuM9vmpgB4y3WnnvWH9H05wfMo=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=fusc8GIuNpkjd8jbi8g5feEaRugmDELIl/M3u+QCZjF4Sw4SVFS8tRy8DI8XA/49D4mfmc + NuClgRzBZJSeyd1w6tDyt0mebBKMAWqJXK25B6ON3QTeXTudB5447VckaoUn0k+U75fkyiKk + l2ZmwWGNx0jBif2Py0gSwhFajD77g=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=squanch; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("AAR i= invalid value", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_struct_dup () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("Duplicated AAR for i=1", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_struct_missing () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("Missing AAR for i=1", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Arc Authentication Results + + [Test] + public void aar_missing () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("missing arc authentication results", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_i_missing () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("arc authentication results no i= tag", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_i_wrong () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("arc authentication results wrong i= tag", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_i_not_prefixed () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: lists.example.org; i=1; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("arc authentication results i= not prefixed", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar_i_no_semi () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1 lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("arc authentication results i= no semicolon", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void aar2_missing () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=CiZp+ZloBeWiIyjY+Eq0lKt20KQDF3QIJNw7+/jdjtQ1XTSMhHsli7H/ocIXsiU/kLF5pn + pABQiZPvAWfCaEcCA9lyb/7i3q2i72GLdK1vdrdD2nIM5e7L3u/5Z56SJdKTu46SyoFQve9b + Cp7qoQB9/TUTxxvkDoapsSjDCDqZ0=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=A2OCip1Cf9z6X7ML9/bRajnToeCD3H7IkP7YqmSKqDtn8Yu8oaJdwP0lZfCTjX++Qas9nj + tGWMojFpj8Wd2rzdyMXwUWF3xlcFBD2gApO9xbehIASIF4lFQMyP6D80LjsjdtpstgwGZl9P + y6WTyD1Kw/bNPZadxvNeDg3LVcQpo=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +Return-Path: +ARC-Seal: a=rsa-sha256; + b=RkKDOauVsqcsTEFv6NVE6J0sxj8LUE4kfwRzs0CvMg/+KOqRDQoFxxJsJkI77EHZqcSgwr + QKpt6aKsl2zyUovVhAppT65S0+vo+h3utd3f8jph++1uiAUhVf57PihDC/GcdhyRGa6YNQGh + GoArSHaJKb06/qF5OBif8o9lmRC8E=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=SMBCg/tHQkIAIzx7OFir0bMhCxk/zaMOx1nyOSAviXW88ERohOFOXIkBVGe74xfJDSh9ou + ryKgNA4XhUt4EybBXOn1dlrMA07dDIUFOUE7n+8QsvX1Drii8aBIpiu+O894oBEDSYcd1R+z + sZIdXhOjB/Lt4sTE1h5IT2p3UctgY=; + bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.52.162 with SMTP id g31csp5274520otc; + Tue, 3 Jan 2017 12:32:02 -0800 (PST) +X-Received: by 10.36.31.84 with SMTP id d81mr49584685itd.26.1483475522271; + Tue, 03 Jan 2017 12:32:02 -0800 (PST) +Message-ID: +Date: Thu, 5 Jan 2017 14:39:01 -0800 +From: Gene Q Doe +To: arc@dmarc.org +Subject: Example 2 +Content-Type: multipart/alternative; boundary=001a113e15fcdd0f9e0545366e8f + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/plain; charset=UTF-8 + +This is a test message + +--001a113e15fcdd0f9e0545366e8f +Content-Type: text/html; charset=UTF-8 + +
This is a test message
+ +--001a113e15fcdd0f9e0545366e8f-- +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Validate ("aar missing for i=2", input, locator, ArcValidationResult.Fail); + } + + #endregion + #region Public Key + + [Test] + public void public_key_na () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=xEoL/6DZn2+/oIsSIAFRrnQdhyrH/aSGdRqBphcyZvTLhDyd8sPHIqNsr0HROjIybe3lUG + /YlYIftmAUP3E7kWbfU7HrolZ/5f4eB0tciltpSyBUPzM2D30IxGmqUvQxk5ATb7WxKAUs4x + XiTmx1MaAUKAExlm45pwp5wEoU/D8=; cv=none; d=example.org; i=1; s=na; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); + locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); + + Validate ("public key not available", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void public_key_invalid () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=G6sqFlzmC87EiD80V9Da8JURM2MUxp1tK3iUxrQdSJ6odUYPT8ApwE1GWodzs8UDuKemL+ + qn7E29nhcK8pwjLjWNilPTZJ1Bt1TS8QersJsEe4tD+rcbGd8ZU8C2UcUpv0TFv3m4GrNbwx + JFFf9r1x5VkXulzTwIo1VW6avKShw=; cv=none; d=example.org; i=1; s=invalid; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); + locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); + + Validate ("public key invalid", input, locator, ArcValidationResult.Fail); + } + + [Test] + public void ams_as_diff_s_d () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=Q6K/T+/5h+nkCtO8UVhb5uwy5ozplfBvOV0lSOCIuzDoTlPNg1chaN+04US/AWxvOrBTZf + hzXXdVjXMv2sX4+4ebSegZN7GTakDCd+vfBtF30jR4csBqlhW25NSyLeleZnIMf5I5G4vu5+ + Ab38xWCoKnMKTPsPebT273ALMfzOw=; cv=none; d=example2.org; i=1; s=dummy2; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + var locator = new ArcPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); + locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); + + Validate ("differing domains & selectors across ams & as", input, locator, ArcValidationResult.Pass); + } + + #endregion + } +} From 92a4476d1ef9e5f8e756dfd7a4f11c763275a25c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 31 May 2019 20:29:12 -0400 Subject: [PATCH 280/741] Refactored DKIM-Signature validation logic to make it easier to add ARC support --- MimeKit/MimeMessage.cs | 180 +++++++++++++++++++++++++---------------- 1 file changed, 110 insertions(+), 70 deletions(-) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 893b61dcc0..97c71559a5 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -46,6 +46,7 @@ using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto.Parameters; using MimeKit.Cryptography; #endif @@ -181,7 +182,7 @@ public MimeMessage (params object[] args) : this (ParserOptions.Default.Clone () Headers.Add (h); } - continue; + continue; } var entity = obj as MimeEntity; @@ -1980,32 +1981,44 @@ static bool IsWhiteSpace (char c) return c == ' ' || c == '\t'; } - static IDictionary ParseSignatureParameters (HeaderId header, string signature) + static bool IsAlpha (char c) { - var parameters = new Dictionary (MimeUtils.OrdinalIgnoreCase); + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); + } - foreach (var token in signature.Split (';')) { - var value = new StringBuilder (); - int startIndex, index = 0; - string name; + static Dictionary ParseSignatureParameters (HeaderId header, string signature) + { + var parameters = new Dictionary (); + var value = new StringBuilder (); + int index = 0; - while (index < token.Length && IsWhiteSpace (token[index])) + while (index < signature.Length) { + while (index < signature.Length && IsWhiteSpace (signature[index])) index++; - startIndex = index; + if (index >= signature.Length) + break; + + if (signature[index] == ';' || !IsAlpha (signature[index])) + throw new FormatException (string.Format ("Malformed {0} value.", header.ToHeaderName ())); - while (index < token.Length && token[index] != '=') + int startIndex = index++; + + while (index < signature.Length && signature[index] != '=') index++; - if (index + 1 >= token.Length) + if (index >= signature.Length) continue; - name = token.Substring (startIndex, index - startIndex).Trim (); + var name = signature.Substring (startIndex, index - startIndex).TrimEnd (); + + // skip over '=' and clear value buffer + value.Length = 0; index++; - while (index < token.Length) { - if (!IsWhiteSpace (token[index])) - value.Append (token[index]); + while (index < signature.Length && signature[index] != ';') { + if (!IsWhiteSpace (signature[index])) + value.Append (signature[index]); index++; } @@ -2013,66 +2026,61 @@ static IDictionary ParseSignatureParameters (HeaderId header, st throw new FormatException (string.Format ("Malformed {0} value: duplicate parameter '{1}'.", header.ToHeaderName (), name)); parameters.Add (name, value.ToString ()); + + // skip over ';' + index++; } return parameters; } - static void ValidateSignatureParameters (IDictionary parameters, HeaderId header, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, - out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + static void ValidateCommonParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, + out string d, out string s, out string q, out string b) { - bool containsFrom = false; - - if (header == HeaderId.DkimSignature) { - if (!parameters.TryGetValue ("v", out string v)) - throw new FormatException ("Malformed DKIM-Signature header: no version parameter detected."); - - if (v != "1") - throw new FormatException (string.Format ("Unrecognized DKIM-Signature version: v={0}", v)); - } - if (!parameters.TryGetValue ("a", out string a)) - throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header.ToHeaderName ())); + throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header)); switch (a.ToLowerInvariant ()) { case "rsa-sha256": algorithm = DkimSignatureAlgorithm.RsaSha256; break; case "rsa-sha1": algorithm = DkimSignatureAlgorithm.RsaSha1; break; - default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header.ToHeaderName (), a)); + default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header, a)); } if (!parameters.TryGetValue ("d", out d)) - throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header.ToHeaderName ())); - - if (parameters.TryGetValue ("i", out string id)) { - switch (header) { - case HeaderId.DkimSignature: - string ident; - int at; - - if ((at = id.LastIndexOf ('@')) == -1) - throw new FormatException ("Malformed DKIM-Signature header: no @ in the AUID value."); - - ident = id.Substring (at + 1); + throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header)); - if (!ident.Equals (d, StringComparison.OrdinalIgnoreCase) && !ident.EndsWith ("." + d, StringComparison.OrdinalIgnoreCase)) - throw new FormatException ("Invalid DKIM-Signature header: the domain in the AUID does not match the domain parameter."); - break; - case HeaderId.ArcMessageSignature: - if (!int.TryParse (id, NumberStyles.Integer, CultureInfo.InvariantCulture, out int i) || i < 1 || i > 50) - throw new FormatException ("Malformed ARC-Message-Signature header: invalid instance value."); - break; - } - } + if (d.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty domain parameter detected.", header)); if (!parameters.TryGetValue ("s", out s)) - throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header.ToHeaderName ())); + throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header)); + + if (s.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty selector parameter detected.", header)); if (!parameters.TryGetValue ("q", out q)) q = "dns/txt"; + if (!parameters.TryGetValue ("b", out b)) + throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header)); + + if (b.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty signature parameter detected.", header)); + + if (parameters.TryGetValue ("t", out string t)) { + if (!int.TryParse (t, NumberStyles.Integer, CultureInfo.InvariantCulture, out int timestamp) || timestamp < 0) + throw new FormatException (string.Format ("Malformed {0} header: invalid timestamp parameter: t={1}.", header, t)); + } + } + + static void ValidateCommonSignatureParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + { + ValidateCommonParameters (header, parameters, out algorithm, out d, out s, out q, out b); + if (parameters.TryGetValue ("l", out string l)) { if (!int.TryParse (l, out maxLength)) - throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header.ToHeaderName (), l)); + throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header, l)); } else { maxLength = -1; } @@ -2081,19 +2089,19 @@ static void ValidateSignatureParameters (IDictionary parameters, var tokens = c.ToLowerInvariant ().Split ('/'); if (tokens.Length == 0 || tokens.Length > 2) - throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header.ToHeaderName (), c)); + throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); switch (tokens[0]) { case "relaxed": headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; case "simple": headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header.ToHeaderName (), c)); + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); } if (tokens.Length == 2) { switch (tokens[1]) { case "relaxed": bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; case "simple": bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header.ToHeaderName (), c)); + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); } } else { bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; @@ -2104,9 +2112,27 @@ static void ValidateSignatureParameters (IDictionary parameters, } if (!parameters.TryGetValue ("h", out string h)) - throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header.ToHeaderName ())); + throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header)); headers = h.Split (':'); + + if (!parameters.TryGetValue ("bh", out bh)) + throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header)); + } + + static void ValidateDkimSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + { + bool containsFrom = false; + + if (!parameters.TryGetValue ("v", out string v)) + throw new FormatException ("Malformed DKIM-Signature header: no version parameter detected."); + + if (v != "1") + throw new FormatException (string.Format ("Unrecognized DKIM-Signature version: v={0}", v)); + + ValidateCommonSignatureParameters ("DKIM-Signature", parameters, out algorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); + for (int i = 0; i < headers.Length; i++) { if (headers[i].Equals ("from", StringComparison.OrdinalIgnoreCase)) { containsFrom = true; @@ -2115,13 +2141,20 @@ static void ValidateSignatureParameters (IDictionary parameters, } if (!containsFrom) - throw new FormatException (string.Format ("Malformed {0} header: From header not signed.", header.ToHeaderName ())); + throw new FormatException ("Malformed DKIM-Signature header: From header not signed."); - if (!parameters.TryGetValue ("bh", out bh)) - throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header.ToHeaderName ())); + if (parameters.TryGetValue ("i", out string id)) { + string ident; + int at; - if (!parameters.TryGetValue ("b", out b)) - throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header.ToHeaderName ())); + if ((at = id.LastIndexOf ('@')) == -1) + throw new FormatException ("Malformed DKIM-Signature header: no @ in the AUID value."); + + ident = id.Substring (at + 1); + + if (!ident.Equals (d, StringComparison.OrdinalIgnoreCase) && !ident.EndsWith ("." + d, StringComparison.OrdinalIgnoreCase)) + throw new FormatException ("Invalid DKIM-Signature header: the domain in the AUID does not match the domain parameter."); + } } static Header GetSignedSignatureHeader (Header header) @@ -2175,9 +2208,9 @@ static Header GetSignedSignatureHeader (Header header) return new Header (header.Options, header.RawField, rawValue); } - async Task GenericVerifyAsync (FormatOptions options, Header signature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) + async Task GenericVerifyAsync (FormatOptions options, Header signature, Dictionary parameters, + IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) { - var parameters = ParseSignatureParameters (signature.Id, signature.Value); DkimCanonicalizationAlgorithm headerAlgorithm, bodyAlgorithm; DkimSignatureAlgorithm signatureAlgorithm; AsymmetricKeyParameter key; @@ -2185,14 +2218,17 @@ async Task GenericVerifyAsync (FormatOptions options, Header signature, ID string[] headers; int maxLength; - ValidateSignatureParameters (parameters, signature.Id, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, - out d, out s, out q, out headers, out bh, out b, out maxLength); + ValidateDkimSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, + out d, out s, out q, out headers, out bh, out b, out maxLength); if (doAsync) key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); else key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + return false; + options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; @@ -2224,11 +2260,13 @@ async Task GenericVerifyAsync (FormatOptions options, Header signature, ID filtered.Flush (); } - return stream.VerifySignature (b); + var valid = stream.VerifySignature (b); + + return valid; } } - Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) + Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) { if (options == null) throw new ArgumentNullException (nameof (options)); @@ -2242,7 +2280,9 @@ Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublic if (publicKeyLocator == null) throw new ArgumentNullException (nameof (publicKeyLocator)); - return GenericVerifyAsync (options, dkimSignature, publicKeyLocator, doAsync, cancellationToken); + var parameters = ParseSignatureParameters (dkimSignature.Id, dkimSignature.Value); + + return GenericVerifyAsync (options, dkimSignature, parameters, publicKeyLocator, doAsync, cancellationToken); } /// @@ -2277,7 +2317,7 @@ Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublic /// public bool Verify (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (options, dkimSignature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); + return DkimVerifyAsync (options, dkimSignature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); } /// @@ -2312,7 +2352,7 @@ Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublic /// public Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { - return VerifyAsync (options, dkimSignature, publicKeyLocator, true, cancellationToken); + return DkimVerifyAsync (options, dkimSignature, publicKeyLocator, true, cancellationToken); } /// From 7531f7bede5691331255dfaf3ddb2bc157421479 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Jun 2019 08:50:08 -0400 Subject: [PATCH 281/741] Added initial support for ARC validation (#488) Fixes issue #386 --- MimeKit/Cryptography/ArcVerifier.cs | 434 +++++++++++++ MimeKit/Cryptography/DkimVerifier.cs | 646 +++++++++++++++++++ MimeKit/MimeKit.Android.csproj | 2 + MimeKit/MimeKit.Mac.csproj | 2 + MimeKit/MimeKit.Net45.csproj | 2 + MimeKit/MimeKit.NetStandard.csproj | 2 + MimeKit/MimeKit.Portable.csproj | 2 + MimeKit/MimeKit.TvOS.csproj | 2 + MimeKit/MimeKit.WatchOS.csproj | 2 + MimeKit/MimeKit.WindowsUniversal81.csproj | 2 + MimeKit/MimeKit.iOS.csproj | 2 + MimeKit/MimeMessage.cs | 445 +------------ UnitTests/Cryptography/ArcValidationTests.cs | 32 +- UnitTests/UnitTests.csproj | 1 + 14 files changed, 1119 insertions(+), 457 deletions(-) create mode 100644 MimeKit/Cryptography/ArcVerifier.cs create mode 100644 MimeKit/Cryptography/DkimVerifier.cs diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs new file mode 100644 index 0000000000..2cc1cbdbd7 --- /dev/null +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -0,0 +1,434 @@ +// +// ArcVerifier.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Threading; +using System.Globalization; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto.Parameters; + +using MimeKit; +using MimeKit.IO; + +namespace MimeKit.Cryptography { + /// + /// An ARC validation result. + /// + /// + /// An ARC validation result. + /// + public enum ArcValidationResult + { + /// + /// No validation was performed. + /// + None, + + /// + /// The validation passed. + /// + Pass, + + /// + /// The validation failed. + /// + Fail + } + + /// + /// An ARC verifier. + /// + /// + /// Validates Authenticated Received Chains. + /// + public class ArcVerifier + { + readonly IDkimPublicKeyLocator publicKeyLocator; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The public key locator. + /// + /// is null. + /// + public ArcVerifier (IDkimPublicKeyLocator publicKeyLocator) + { + this.publicKeyLocator = publicKeyLocator; + } + + class ArcHeaderSet + { + public Dictionary ArcAuthenticationResultParameters { get; private set; } + public Header ArcAuthenticationResult { get; private set; } + + public Dictionary ArcMessageSignatureParameters { get; private set; } + public Header ArcMessageSignature { get; private set; } + + public Dictionary ArcSealParameters { get; private set; } + public Header ArcSeal { get; private set; } + + public bool Add (Header header, Dictionary parameters) + { + switch (header.Id) { + case HeaderId.ArcAuthenticationResults: + if (ArcAuthenticationResult != null) + return false; + + ArcAuthenticationResultParameters = parameters; + ArcAuthenticationResult = header; + break; + case HeaderId.ArcMessageSignature: + if (ArcMessageSignature != null) + return false; + + ArcMessageSignatureParameters = parameters; + ArcMessageSignature = header; + break; + case HeaderId.ArcSeal: + if (ArcSeal != null) + return false; + + ArcSealParameters = parameters; + ArcSeal = header; + break; + default: + return false; + } + + return true; + } + } + + static void ValidateArcMessageSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + { + DkimVerifier.ValidateCommonSignatureParameters ("ARC-Message-Signature", parameters, out algorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); + } + + static void ValidateArcSealParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out string d, out string s, out string q, out string b) + { + DkimVerifier.ValidateCommonParameters ("ARC-Seal", parameters, out algorithm, out d, out s, out q, out b); + + if (parameters.TryGetValue ("h", out string h)) + throw new FormatException (string.Format ("Malformed ARC-Seal header: the 'h' parameter tag is not allowed.")); + } + + async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMessage message, Header arcSignature, Dictionary parameters, bool doAsync, CancellationToken cancellationToken) + { + DkimCanonicalizationAlgorithm headerAlgorithm, bodyAlgorithm; + DkimSignatureAlgorithm signatureAlgorithm; + AsymmetricKeyParameter key; + string d, s, q, bh, b; + string[] headers; + int maxLength; + + ValidateArcMessageSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, + out d, out s, out q, out headers, out bh, out b, out maxLength); + + if (doAsync) + key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + else + key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + + if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + return false; + + options = options.Clone (); + options.NewLineFormat = NewLineFormat.Dos; + + // first check the body hash (if that's invalid, then the entire signature is invalid) + var hash = Convert.ToBase64String (message.HashBody (options, signatureAlgorithm, bodyAlgorithm, maxLength)); + + if (hash != bh) + return false; + + using (var stream = new DkimSignatureStream (DkimVerifier.GetDigestSigner (signatureAlgorithm, key))) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + DkimVerifier.WriteHeaders (options, message, headers, headerAlgorithm, filtered); + + // now include the ARC-Message-Signature header that we are verifying, + // but only after removing the "b=" signature value. + var header = DkimVerifier.GetSignedSignatureHeader (arcSignature); + + switch (headerAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + DkimVerifier.WriteHeaderRelaxed (options, filtered, header, true); + break; + default: + DkimVerifier.WriteHeaderSimple (options, filtered, header, true); + break; + } + + filtered.Flush (); + } + + return stream.VerifySignature (b); + } + } + + async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, int i, bool doAsync, CancellationToken cancellationToken) + { + DkimSignatureAlgorithm algorithm; + AsymmetricKeyParameter key; + string d, s, q, b; + + ValidateArcSealParameters (sets[i].ArcSealParameters, out algorithm, out d, out s, out q, out b); + + if (doAsync) + key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + else + key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + + if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + return false; + + options = options.Clone (); + options.NewLineFormat = NewLineFormat.Dos; + + using (var stream = new DkimSignatureStream (DkimVerifier.GetDigestSigner (algorithm, key))) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + for (int j = 0; j < i; j++) { + DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[j].ArcAuthenticationResult, false); + DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[j].ArcMessageSignature, false); + DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[j].ArcSeal, false); + } + + DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[i].ArcAuthenticationResult, false); + DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[i].ArcMessageSignature, false); + + // now include the ARC-Seal header that we are verifying, + // but only after removing the "b=" signature value. + var seal = DkimVerifier.GetSignedSignatureHeader (sets[i].ArcSeal); + + DkimVerifier.WriteHeaderRelaxed (options, filtered, seal, true); + + filtered.Flush (); + } + + return stream.VerifySignature (b); + } + } + + async Task VerifyAsync (FormatOptions options, MimeMessage message, bool doAsync, CancellationToken cancellationToken) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (publicKeyLocator == null) + throw new ArgumentNullException (nameof (publicKeyLocator)); + + var sets = new ArcHeaderSet[50]; + ArcHeaderSet set; + int newest = -1; + + for (int i = 0; i < message.Headers.Count; i++) { + Dictionary parameters = null; + var header = message.Headers[i]; + string value; + int inst; + + switch (header.Id) { + case HeaderId.ArcAuthenticationResults: + case HeaderId.ArcMessageSignature: + case HeaderId.ArcSeal: + try { + parameters = DkimVerifier.ParseParameterTags (header.Id, header.Value); + } catch { + return ArcValidationResult.Fail; + } + break; + } + + if (parameters == null) + continue; + + if (!parameters.TryGetValue ("i", out value)) + return ArcValidationResult.Fail; + + if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out inst) || inst < 1 || inst > 50) + return ArcValidationResult.Fail; + + inst--; + + set = sets[inst]; + if (set == null) + sets[inst] = set = new ArcHeaderSet (); + + if (!set.Add (header, parameters)) + return ArcValidationResult.Fail; + + if (inst >= newest) + newest = inst; + } + + if (newest == -1) { + // there are no ARC sets + return ArcValidationResult.None; + } + + // verify that all ARC sets are complete + for (int i = 0; i <= newest; i++) { + set = sets[i]; + + if (sets == null || set.ArcAuthenticationResult == null || set.ArcMessageSignature == null || set.ArcSeal == null) + return ArcValidationResult.Fail; + + if (!set.ArcSealParameters.TryGetValue ("cv", out string cv)) + return ArcValidationResult.Fail; + + // The "cv" value for all ARC-Seal header fields MUST NOT be + // "fail". For ARC Sets with instance values > 1, the values + // MUST be "pass". For the ARC Set with instance value = 1, the + // value MUST be "none". + if (!cv.Equals (i == 0 ? "none" : "pass", StringComparison.Ordinal)) + return ArcValidationResult.Fail; + } + + // validate the most recent Arc-Message-Signature + try { + var parameters = sets[newest].ArcMessageSignatureParameters; + var header = sets[newest].ArcMessageSignature; + + if (!await VerifyArcMessageSignatureAsync (options, message, header, parameters, doAsync, cancellationToken).ConfigureAwait (false)) + return ArcValidationResult.Fail; + } catch { + return ArcValidationResult.Fail; + } + + // validate all Arc-Seals starting with the most recent and proceeding to the oldest + for (int i = newest; i >= 0; i--) { + try { + if (!await VerifyArcSealAsync (options, sets, i, doAsync, cancellationToken).ConfigureAwait (false)) + return ArcValidationResult.Fail; + } catch { + return ArcValidationResult.Fail; + } + } + + return ArcValidationResult.Pass; + } + + /// + /// Verify the ARC signature chain. + /// + /// + /// Verifies the ARC signature chain. + /// + /// The ARC validation result. + /// The formatting options. + /// The message to verify. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public ArcValidationResult Verify (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (options, message, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously verify the ARC signature chain. + /// + /// + /// Asynchronously verifies the ARC signature chain. + /// + /// The ARC validation result. + /// The formatting options. + /// The message to verify. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public Task VerifyAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (options, message, true, cancellationToken); + } + + /// + /// Verify the ARC signature chain. + /// + /// + /// Verifies the ARC signature chain. + /// + /// The ARC validation result. + /// The message to verify. + /// The cancellation token. + /// + /// is null. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public ArcValidationResult Verify (MimeMessage message, CancellationToken cancellationToken = default (CancellationToken)) + { + return Verify (FormatOptions.Default, message, cancellationToken); + } + + /// + /// Asynchronously verify the ARC signature chain. + /// + /// + /// Asynchronously verifies the ARC signature chain. + /// + /// The ARC validation result. + /// The message to verify. + /// The cancellation token. + /// + /// is null. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public Task VerifyAsync (MimeMessage message, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (FormatOptions.Default, message, cancellationToken); + } + } +} diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs new file mode 100644 index 0000000000..54b79a11d8 --- /dev/null +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -0,0 +1,646 @@ +// +// DkimVerifier.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Globalization; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto.Parameters; + +using MimeKit; +using MimeKit.IO; +using MimeKit.Utils; + +namespace MimeKit.Cryptography { + /// + /// A DKIM-Signature verifier. + /// + /// + /// Verifies DomainKeys Identified Mail (DKIM) signatures. + /// + /// + /// + /// + public class DkimVerifier + { + readonly IDkimPublicKeyLocator publicKeyLocator; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// + /// + /// + /// The public key locator. + /// + /// is null. + /// + public DkimVerifier (IDkimPublicKeyLocator publicKeyLocator) + { + if (publicKeyLocator == null) + throw new ArgumentNullException (nameof (publicKeyLocator)); + + this.publicKeyLocator = publicKeyLocator; + } + + static bool IsWhiteSpace (char c) + { + return c == ' ' || c == '\t'; + } + + static bool IsAlpha (char c) + { + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); + } + + internal static Dictionary ParseParameterTags (HeaderId header, string signature) + { + var parameters = new Dictionary (); + var value = new StringBuilder (); + int index = 0; + + while (index < signature.Length) { + while (index < signature.Length && IsWhiteSpace (signature[index])) + index++; + + if (index >= signature.Length) + break; + + if (signature[index] == ';' || !IsAlpha (signature[index])) + throw new FormatException (string.Format ("Malformed {0} value.", header.ToHeaderName ())); + + int startIndex = index++; + + while (index < signature.Length && signature[index] != '=') + index++; + + if (index >= signature.Length) + continue; + + var name = signature.Substring (startIndex, index - startIndex).TrimEnd (); + + // skip over '=' and clear value buffer + value.Length = 0; + index++; + + while (index < signature.Length && signature[index] != ';') { + if (!IsWhiteSpace (signature[index])) + value.Append (signature[index]); + index++; + } + + if (parameters.ContainsKey (name)) + throw new FormatException (string.Format ("Malformed {0} value: duplicate parameter '{1}'.", header.ToHeaderName (), name)); + + parameters.Add (name, value.ToString ()); + + // skip over ';' + index++; + } + + return parameters; + } + + internal static void ValidateCommonParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, + out string d, out string s, out string q, out string b) + { + if (!parameters.TryGetValue ("a", out string a)) + throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header)); + + switch (a.ToLowerInvariant ()) { + case "rsa-sha256": algorithm = DkimSignatureAlgorithm.RsaSha256; break; + case "rsa-sha1": algorithm = DkimSignatureAlgorithm.RsaSha1; break; + default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header, a)); + } + + if (!parameters.TryGetValue ("d", out d)) + throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header)); + + if (d.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty domain parameter detected.", header)); + + if (!parameters.TryGetValue ("s", out s)) + throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header)); + + if (s.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty selector parameter detected.", header)); + + if (!parameters.TryGetValue ("q", out q)) + q = "dns/txt"; + + if (!parameters.TryGetValue ("b", out b)) + throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header)); + + if (b.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty signature parameter detected.", header)); + + if (parameters.TryGetValue ("t", out string t)) { + if (!int.TryParse (t, NumberStyles.Integer, CultureInfo.InvariantCulture, out int timestamp) || timestamp < 0) + throw new FormatException (string.Format ("Malformed {0} header: invalid timestamp parameter: t={1}.", header, t)); + } + } + + internal static void ValidateCommonSignatureParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + { + ValidateCommonParameters (header, parameters, out algorithm, out d, out s, out q, out b); + + if (parameters.TryGetValue ("l", out string l)) { + if (!int.TryParse (l, out maxLength)) + throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header, l)); + } else { + maxLength = -1; + } + + if (parameters.TryGetValue ("c", out string c)) { + var tokens = c.ToLowerInvariant ().Split ('/'); + + if (tokens.Length == 0 || tokens.Length > 2) + throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); + + switch (tokens[0]) { + case "relaxed": headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; + case "simple": headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); + } + + if (tokens.Length == 2) { + switch (tokens[1]) { + case "relaxed": bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; + case "simple": bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); + } + } else { + bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; + } + } else { + headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; + bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; + } + + if (!parameters.TryGetValue ("h", out string h)) + throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header)); + + headers = h.Split (':'); + + if (!parameters.TryGetValue ("bh", out bh)) + throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header)); + } + + static void ValidateDkimSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + { + bool containsFrom = false; + + if (!parameters.TryGetValue ("v", out string v)) + throw new FormatException ("Malformed DKIM-Signature header: no version parameter detected."); + + if (v != "1") + throw new FormatException (string.Format ("Unrecognized DKIM-Signature version: v={0}", v)); + + ValidateCommonSignatureParameters ("DKIM-Signature", parameters, out algorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); + + for (int i = 0; i < headers.Length; i++) { + if (headers[i].Equals ("from", StringComparison.OrdinalIgnoreCase)) { + containsFrom = true; + break; + } + } + + if (!containsFrom) + throw new FormatException ("Malformed DKIM-Signature header: From header not signed."); + + if (parameters.TryGetValue ("i", out string id)) { + string ident; + int at; + + if ((at = id.LastIndexOf ('@')) == -1) + throw new FormatException ("Malformed DKIM-Signature header: no @ in the AUID value."); + + ident = id.Substring (at + 1); + + if (!ident.Equals (d, StringComparison.OrdinalIgnoreCase) && !ident.EndsWith ("." + d, StringComparison.OrdinalIgnoreCase)) + throw new FormatException ("Invalid DKIM-Signature header: the domain in the AUID does not match the domain parameter."); + } + } + + internal static void WriteHeaderRelaxed (FormatOptions options, Stream stream, Header header, bool isDkimSignature) + { + // o Convert all header field names (not the header field values) to + // lowercase. For example, convert "SUBJect: AbC" to "subject: AbC". + var name = Encoding.ASCII.GetBytes (header.Field.ToLowerInvariant ()); + var rawValue = header.GetRawValue (options); + int index = 0; + + // o Delete any WSP characters remaining before and after the colon + // separating the header field name from the header field value. The + // colon separator MUST be retained. + stream.Write (name, 0, name.Length); + stream.WriteByte ((byte) ':'); + + // trim leading whitespace... + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + while (index < rawValue.Length) { + int startIndex = index; + + // look for the first non-whitespace character + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + // o Delete all WSP characters at the end of each unfolded header field + // value. + if (index >= rawValue.Length) + break; + + // o Convert all sequences of one or more WSP characters to a single SP + // character. WSP characters here include those before and after a + // line folding boundary. + if (index > startIndex) + stream.WriteByte ((byte) ' '); + + startIndex = index; + + while (index < rawValue.Length && !rawValue[index].IsWhitespace ()) + index++; + + if (index > startIndex) + stream.Write (rawValue, startIndex, index - startIndex); + } + + if (!isDkimSignature) + stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); + } + + internal static void WriteHeaderSimple (FormatOptions options, Stream stream, Header header, bool isDkimSignature) + { + var rawValue = header.GetRawValue (options); + int rawLength = rawValue.Length; + + if (isDkimSignature && rawLength > 0) { + if (rawValue[rawLength - 1] == (byte) '\n') { + rawLength--; + + if (rawLength > 0 && rawValue[rawLength - 1] == (byte) '\r') + rawLength--; + } + } + + stream.Write (header.RawField, 0, header.RawField.Length); + stream.Write (Header.Colon, 0, Header.Colon.Length); + stream.Write (rawValue, 0, rawLength); + } + + internal static ISigner GetDigestSigner (DkimSignatureAlgorithm algorithm, AsymmetricKeyParameter key) + { +#if ENABLE_NATIVE_DKIM + return new SystemSecuritySigner (algorithm, key.AsAsymmetricAlgorithm ()); +#else + DerObjectIdentifier id; + + if (algorithm == DkimSignatureAlgorithm.RsaSha256) + id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; + else + id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; + + var signer = SignerUtilities.GetSigner (id); + + signer.Init (key.IsPrivate, key); + + return signer; +#endif + } + + internal static void WriteHeaders (FormatOptions options, MimeMessage message, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, Stream stream) + { + var counts = new Dictionary (StringComparer.Ordinal); + + for (int i = 0; i < fields.Count; i++) { + var headers = fields[i].StartsWith ("Content-", StringComparison.OrdinalIgnoreCase) ? message.Body.Headers : message.Headers; + var name = fields[i].ToLowerInvariant (); + int index, count, n = 0; + + if (!counts.TryGetValue (name, out count)) + count = 0; + + // Note: signers choosing to sign an existing header field that occurs more + // than once in the message (such as Received) MUST sign the physically last + // instance of that header field in the header block. Signers wishing to sign + // multiple instances of such a header field MUST include the header field + // name multiple times in the list of header fields and MUST sign such header + // fields in order from the bottom of the header field block to the top. + index = headers.LastIndexOf (name); + + // find the n'th header with this name + while (n < count && --index >= 0) { + if (headers[index].Field.Equals (name, StringComparison.OrdinalIgnoreCase)) + n++; + } + + if (index < 0) + continue; + + var header = headers[index]; + + switch (headerCanonicalizationAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + WriteHeaderRelaxed (options, stream, header, false); + break; + default: + WriteHeaderSimple (options, stream, header, false); + break; + } + + counts[name] = ++count; + } + } + + internal static Header GetSignedSignatureHeader (Header header) + { + // modify the raw DKIM-Signature header value by chopping off the signature value after the "b=" + var rawValue = (byte[]) header.RawValue.Clone (); + int length = 0, index = 0; + + do { + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + if (index + 2 < rawValue.Length) { + var param = (char) rawValue[index++]; + + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + if (index < rawValue.Length && rawValue[index] == (byte) '=' && param == 'b') { + length = ++index; + + while (index < rawValue.Length && rawValue[index] != (byte) ';') + index++; + + if (index == rawValue.Length && rawValue[index - 1] == (byte) '\n') { + index--; + + if (rawValue[index - 1] == (byte) '\r') + index--; + } + + break; + } + } + + while (index < rawValue.Length && rawValue[index] != (byte) ';') + index++; + + if (index < rawValue.Length) + index++; + } while (index < rawValue.Length); + + if (index == rawValue.Length) + throw new FormatException (string.Format ("Malformed {0} header: missing signature parameter.", header.Id.ToHeaderName ())); + + while (index < rawValue.Length) + rawValue[length++] = rawValue[index++]; + + Array.Resize (ref rawValue, length); + + return new Header (header.Options, header.RawField, rawValue); + } + + async Task VerifyAsync (FormatOptions options, MimeMessage message, Header dkimSignature, bool doAsync, CancellationToken cancellationToken) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (message == null) + throw new ArgumentNullException (nameof (message)); + + if (dkimSignature == null) + throw new ArgumentNullException (nameof (dkimSignature)); + + if (dkimSignature.Id != HeaderId.DkimSignature) + throw new ArgumentException ("The signature parameter MUST be a DKIM-Signature header.", nameof (dkimSignature)); + + var parameters = ParseParameterTags (dkimSignature.Id, dkimSignature.Value); + DkimCanonicalizationAlgorithm headerAlgorithm, bodyAlgorithm; + DkimSignatureAlgorithm signatureAlgorithm; + AsymmetricKeyParameter key; + string d, s, q, bh, b; + string[] headers; + int maxLength; + + ValidateDkimSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, + out d, out s, out q, out headers, out bh, out b, out maxLength); + + if (doAsync) + key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + else + key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + + if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + return false; + + options = options.Clone (); + options.NewLineFormat = NewLineFormat.Dos; + + // first check the body hash (if that's invalid, then the entire signature is invalid) + var hash = Convert.ToBase64String (message.HashBody (options, signatureAlgorithm, bodyAlgorithm, maxLength)); + + if (hash != bh) + return false; + + using (var stream = new DkimSignatureStream (GetDigestSigner (signatureAlgorithm, key))) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + WriteHeaders (options, message, headers, headerAlgorithm, filtered); + + // now include the DKIM-Signature header that we are verifying, + // but only after removing the "b=" signature value. + var header = GetSignedSignatureHeader (dkimSignature); + + switch (headerAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + WriteHeaderRelaxed (options, filtered, header, true); + break; + default: + WriteHeaderSimple (options, filtered, header, true); + break; + } + + filtered.Flush (); + } + + return stream.VerifySignature (b); + } + } + + /// + /// Verify the specified DKIM-Signature header. + /// + /// + /// Verifies the specified DKIM-Signature header. + /// + /// + /// + /// + /// true if the DKIM-Signature is valid; otherwise, false. + /// The formatting options. + /// The message to verify. + /// The DKIM-Signature header. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// is not a DKIM-Signature header. + /// + /// + /// The DKIM-Signature header value is malformed. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public bool Verify (FormatOptions options, MimeMessage message, Header dkimSignature, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (options, message, dkimSignature, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously verify the specified DKIM-Signature header. + /// + /// + /// Verifies the specified DKIM-Signature header. + /// + /// + /// + /// + /// true if the DKIM-Signature is valid; otherwise, false. + /// The formatting options. + /// The message to verify. + /// The DKIM-Signature header. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// is not a DKIM-Signature header. + /// + /// + /// The DKIM-Signature header value is malformed. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public Task VerifyAsync (FormatOptions options, MimeMessage message, Header dkimSignature, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (options, message, dkimSignature, true, cancellationToken); + } + + /// + /// Verify the specified DKIM-Signature header. + /// + /// + /// Verifies the specified DKIM-Signature header. + /// + /// + /// + /// + /// true if the DKIM-Signature is valid; otherwise, false. + /// The message to verify. + /// The DKIM-Signature header. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// is not a DKIM-Signature header. + /// + /// + /// The DKIM-Signature header value is malformed. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public bool Verify (MimeMessage message, Header dkimSignature, CancellationToken cancellationToken = default (CancellationToken)) + { + return Verify (FormatOptions.Default, message, dkimSignature, cancellationToken); + } + + /// + /// Asynchronously verify the specified DKIM-Signature header. + /// + /// + /// Verifies the specified DKIM-Signature header. + /// + /// + /// + /// + /// true if the DKIM-Signature is valid; otherwise, false. + /// The message to verify. + /// The DKIM-Signature header. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// is not a DKIM-Signature header. + /// + /// + /// The DKIM-Signature header value is malformed. + /// + /// + /// The operation was canceled via the cancellation token. + /// + public Task VerifyAsync (MimeMessage message, Header dkimSignature, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (FormatOptions.Default, message, dkimSignature, cancellationToken); + } + } +} diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 39785cf69d..6415c558b5 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -65,6 +65,7 @@ + @@ -86,6 +87,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index cdcb512ace..921e75fef2 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -54,6 +54,7 @@ + @@ -75,6 +76,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index dc445de8e6..556ab4195f 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -62,6 +62,7 @@ + @@ -83,6 +84,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index a80f578dc7..b385508a50 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -47,6 +47,7 @@ + @@ -67,6 +68,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 2803eef9b2..d231a1ad93 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -54,6 +54,7 @@ + @@ -72,6 +73,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index ef77380ef9..5b2661cc35 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -47,6 +47,7 @@ + @@ -68,6 +69,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index f3de62284c..b1b864f71b 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -53,6 +53,7 @@ + @@ -74,6 +75,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index a7f6d9253f..71e369d5c0 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -60,6 +60,7 @@ + @@ -78,6 +79,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index fc9809b1a4..a523249e28 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -62,6 +62,7 @@ + @@ -83,6 +84,7 @@ + diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 97c71559a5..eb7305a846 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1562,95 +1562,7 @@ IList GetMessageRecipients (bool includeSenders) } #if ENABLE_CRYPTO - static void DkimWriteHeaderRelaxed (FormatOptions options, Stream stream, Header header, bool isDkimSignature) - { - // o Convert all header field names (not the header field values) to - // lowercase. For example, convert "SUBJect: AbC" to "subject: AbC". - var name = Encoding.ASCII.GetBytes (header.Field.ToLowerInvariant ()); - var rawValue = header.GetRawValue (options); - int index = 0; - - // o Delete any WSP characters remaining before and after the colon - // separating the header field name from the header field value. The - // colon separator MUST be retained. - stream.Write (name, 0, name.Length); - stream.WriteByte ((byte) ':'); - - // trim leading whitespace... - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - while (index < rawValue.Length) { - int startIndex = index; - - // look for the first non-whitespace character - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - // o Delete all WSP characters at the end of each unfolded header field - // value. - if (index >= rawValue.Length) - break; - - // o Convert all sequences of one or more WSP characters to a single SP - // character. WSP characters here include those before and after a - // line folding boundary. - if (index > startIndex) - stream.WriteByte ((byte) ' '); - - startIndex = index; - - while (index < rawValue.Length && !rawValue[index].IsWhitespace ()) - index++; - - if (index > startIndex) - stream.Write (rawValue, startIndex, index - startIndex); - } - - if (!isDkimSignature) - stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); - } - - static void DkimWriteHeaderSimple (FormatOptions options, Stream stream, Header header, bool isDkimSignature) - { - var rawValue = header.GetRawValue (options); - int rawLength = rawValue.Length; - - if (isDkimSignature && rawLength > 0) { - if (rawValue[rawLength - 1] == (byte) '\n') { - rawLength--; - - if (rawLength > 0 && rawValue[rawLength - 1] == (byte) '\r') - rawLength--; - } - } - - stream.Write (header.RawField, 0, header.RawField.Length); - stream.Write (Header.Colon, 0, Header.Colon.Length); - stream.Write (rawValue, 0, rawLength); - } - - static ISigner DkimGetDigestSigner (DkimSignatureAlgorithm algorithm, AsymmetricKeyParameter key) - { -#if ENABLE_NATIVE_DKIM - return new SystemSecuritySigner (algorithm, key.AsAsymmetricAlgorithm ()); -#else - DerObjectIdentifier id; - - if (algorithm == DkimSignatureAlgorithm.RsaSha256) - id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; - else - id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; - - var signer = SignerUtilities.GetSigner (id); - - signer.Init (key.IsPrivate, key); - - return signer; -#endif - } - - byte[] DkimHashBody (FormatOptions options, DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm, int maxLength) + internal byte[] HashBody (FormatOptions options, DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm, int maxLength) { using (var stream = new DkimHashStream (signatureAlgorithm, maxLength)) { using (var filtered = new FilteredStream (stream)) { @@ -1683,50 +1595,7 @@ byte[] DkimHashBody (FormatOptions options, DkimSignatureAlgorithm signatureAlgo } } - void DkimWriteHeaders (FormatOptions options, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, Stream stream) - { - var counts = new Dictionary (StringComparer.Ordinal); - - for (int i = 0; i < fields.Count; i++) { - var headers = fields[i].StartsWith ("Content-", StringComparison.OrdinalIgnoreCase) ? Body.Headers : Headers; - var name = fields[i].ToLowerInvariant (); - int index, count, n = 0; - - if (!counts.TryGetValue (name, out count)) - count = 0; - - // Note: signers choosing to sign an existing header field that occurs more - // than once in the message (such as Received) MUST sign the physically last - // instance of that header field in the header block. Signers wishing to sign - // multiple instances of such a header field MUST include the header field - // name multiple times in the list of header fields and MUST sign such header - // fields in order from the bottom of the header field block to the top. - index = headers.LastIndexOf (name); - - // find the n'th header with this name - while (n < count && --index >= 0) { - if (headers[index].Field.Equals (name, StringComparison.OrdinalIgnoreCase)) - n++; - } - - if (index < 0) - continue; - - var header = headers[index]; - - switch (headerCanonicalizationAlgorithm) { - case DkimCanonicalizationAlgorithm.Relaxed: - DkimWriteHeaderRelaxed (options, stream, header, false); - break; - default: - DkimWriteHeaderSimple (options, stream, header, false); - break; - } - - counts[name] = ++count; - } - } - + //static readonly string[] ArcShouldNotInclude = { "arc-authentication-results", "arc-message-signature", "arc-seal" }; static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; void DkimSign (FormatOptions options, DkimSigner signer, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm) @@ -1766,11 +1635,11 @@ void DkimSign (FormatOptions options, DkimSigner signer, IList fields, D filtered.Add (options.CreateNewLineFilter ()); // write the specified message headers - DkimWriteHeaders (options, fields, headerCanonicalizationAlgorithm, filtered); + DkimVerifier.WriteHeaders (options, this, fields, headerCanonicalizationAlgorithm, filtered); value.AppendFormat ("; h={0}", string.Join (":", fields.ToArray ())); - hash = DkimHashBody (options, signer.SignatureAlgorithm, bodyCanonicalizationAlgorithm, -1); + hash = HashBody (options, signer.SignatureAlgorithm, bodyCanonicalizationAlgorithm, -1); value.AppendFormat ("; bh={0}", Convert.ToBase64String (hash)); value.Append ("; b="); @@ -1779,10 +1648,10 @@ void DkimSign (FormatOptions options, DkimSigner signer, IList fields, D switch (headerCanonicalizationAlgorithm) { case DkimCanonicalizationAlgorithm.Relaxed: - DkimWriteHeaderRelaxed (options, filtered, dkim, true); + DkimVerifier.WriteHeaderRelaxed (options, filtered, dkim, true); break; default: - DkimWriteHeaderSimple (options, filtered, dkim, true); + DkimVerifier.WriteHeaderSimple (options, filtered, dkim, true); break; } @@ -1976,296 +1845,6 @@ public void Sign (DkimSigner signer, IList headers, DkimCanonicalizati Sign (FormatOptions.Default, signer, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); } - static bool IsWhiteSpace (char c) - { - return c == ' ' || c == '\t'; - } - - static bool IsAlpha (char c) - { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); - } - - static Dictionary ParseSignatureParameters (HeaderId header, string signature) - { - var parameters = new Dictionary (); - var value = new StringBuilder (); - int index = 0; - - while (index < signature.Length) { - while (index < signature.Length && IsWhiteSpace (signature[index])) - index++; - - if (index >= signature.Length) - break; - - if (signature[index] == ';' || !IsAlpha (signature[index])) - throw new FormatException (string.Format ("Malformed {0} value.", header.ToHeaderName ())); - - int startIndex = index++; - - while (index < signature.Length && signature[index] != '=') - index++; - - if (index >= signature.Length) - continue; - - var name = signature.Substring (startIndex, index - startIndex).TrimEnd (); - - // skip over '=' and clear value buffer - value.Length = 0; - index++; - - while (index < signature.Length && signature[index] != ';') { - if (!IsWhiteSpace (signature[index])) - value.Append (signature[index]); - index++; - } - - if (parameters.ContainsKey (name)) - throw new FormatException (string.Format ("Malformed {0} value: duplicate parameter '{1}'.", header.ToHeaderName (), name)); - - parameters.Add (name, value.ToString ()); - - // skip over ';' - index++; - } - - return parameters; - } - - static void ValidateCommonParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, - out string d, out string s, out string q, out string b) - { - if (!parameters.TryGetValue ("a", out string a)) - throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header)); - - switch (a.ToLowerInvariant ()) { - case "rsa-sha256": algorithm = DkimSignatureAlgorithm.RsaSha256; break; - case "rsa-sha1": algorithm = DkimSignatureAlgorithm.RsaSha1; break; - default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header, a)); - } - - if (!parameters.TryGetValue ("d", out d)) - throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header)); - - if (d.Length == 0) - throw new FormatException (string.Format ("Malformed {0} header: empty domain parameter detected.", header)); - - if (!parameters.TryGetValue ("s", out s)) - throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header)); - - if (s.Length == 0) - throw new FormatException (string.Format ("Malformed {0} header: empty selector parameter detected.", header)); - - if (!parameters.TryGetValue ("q", out q)) - q = "dns/txt"; - - if (!parameters.TryGetValue ("b", out b)) - throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header)); - - if (b.Length == 0) - throw new FormatException (string.Format ("Malformed {0} header: empty signature parameter detected.", header)); - - if (parameters.TryGetValue ("t", out string t)) { - if (!int.TryParse (t, NumberStyles.Integer, CultureInfo.InvariantCulture, out int timestamp) || timestamp < 0) - throw new FormatException (string.Format ("Malformed {0} header: invalid timestamp parameter: t={1}.", header, t)); - } - } - - static void ValidateCommonSignatureParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, - out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) - { - ValidateCommonParameters (header, parameters, out algorithm, out d, out s, out q, out b); - - if (parameters.TryGetValue ("l", out string l)) { - if (!int.TryParse (l, out maxLength)) - throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header, l)); - } else { - maxLength = -1; - } - - if (parameters.TryGetValue ("c", out string c)) { - var tokens = c.ToLowerInvariant ().Split ('/'); - - if (tokens.Length == 0 || tokens.Length > 2) - throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); - - switch (tokens[0]) { - case "relaxed": headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; - case "simple": headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); - } - - if (tokens.Length == 2) { - switch (tokens[1]) { - case "relaxed": bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; - case "simple": bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); - } - } else { - bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; - } - } else { - headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; - bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; - } - - if (!parameters.TryGetValue ("h", out string h)) - throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header)); - - headers = h.Split (':'); - - if (!parameters.TryGetValue ("bh", out bh)) - throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header)); - } - - static void ValidateDkimSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, - out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) - { - bool containsFrom = false; - - if (!parameters.TryGetValue ("v", out string v)) - throw new FormatException ("Malformed DKIM-Signature header: no version parameter detected."); - - if (v != "1") - throw new FormatException (string.Format ("Unrecognized DKIM-Signature version: v={0}", v)); - - ValidateCommonSignatureParameters ("DKIM-Signature", parameters, out algorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); - - for (int i = 0; i < headers.Length; i++) { - if (headers[i].Equals ("from", StringComparison.OrdinalIgnoreCase)) { - containsFrom = true; - break; - } - } - - if (!containsFrom) - throw new FormatException ("Malformed DKIM-Signature header: From header not signed."); - - if (parameters.TryGetValue ("i", out string id)) { - string ident; - int at; - - if ((at = id.LastIndexOf ('@')) == -1) - throw new FormatException ("Malformed DKIM-Signature header: no @ in the AUID value."); - - ident = id.Substring (at + 1); - - if (!ident.Equals (d, StringComparison.OrdinalIgnoreCase) && !ident.EndsWith ("." + d, StringComparison.OrdinalIgnoreCase)) - throw new FormatException ("Invalid DKIM-Signature header: the domain in the AUID does not match the domain parameter."); - } - } - - static Header GetSignedSignatureHeader (Header header) - { - // modify the raw DKIM-Signature header value by chopping off the signature value after the "b=" - var rawValue = (byte[]) header.RawValue.Clone (); - int length = 0, index = 0; - - do { - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - if (index + 2 < rawValue.Length) { - var param = (char) rawValue[index++]; - - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - if (index < rawValue.Length && rawValue[index] == (byte) '=' && param == 'b') { - length = ++index; - - while (index < rawValue.Length && rawValue[index] != (byte) ';') - index++; - - if (index == rawValue.Length && rawValue[index - 1] == (byte) '\n') { - index--; - - if (rawValue[index - 1] == (byte) '\r') - index--; - } - - break; - } - } - - while (index < rawValue.Length && rawValue[index] != (byte) ';') - index++; - - if (index < rawValue.Length) - index++; - } while (index < rawValue.Length); - - if (index == rawValue.Length) - throw new FormatException (string.Format ("Malformed {0} header: missing signature parameter.", header.Id.ToHeaderName ())); - - while (index < rawValue.Length) - rawValue[length++] = rawValue[index++]; - - Array.Resize (ref rawValue, length); - - return new Header (header.Options, header.RawField, rawValue); - } - - async Task GenericVerifyAsync (FormatOptions options, Header signature, Dictionary parameters, - IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) - { - DkimCanonicalizationAlgorithm headerAlgorithm, bodyAlgorithm; - DkimSignatureAlgorithm signatureAlgorithm; - AsymmetricKeyParameter key; - string d, s, q, bh, b; - string[] headers; - int maxLength; - - ValidateDkimSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, - out d, out s, out q, out headers, out bh, out b, out maxLength); - - if (doAsync) - key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); - else - key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - - if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) - return false; - - options = options.Clone (); - options.NewLineFormat = NewLineFormat.Dos; - - // first check the body hash (if that's invalid, then the entire signature is invalid) - var hash = Convert.ToBase64String (DkimHashBody (options, signatureAlgorithm, bodyAlgorithm, maxLength)); - - if (hash != bh) - return false; - - using (var stream = new DkimSignatureStream (DkimGetDigestSigner (signatureAlgorithm, key))) { - using (var filtered = new FilteredStream (stream)) { - filtered.Add (options.CreateNewLineFilter ()); - - DkimWriteHeaders (options, headers, headerAlgorithm, filtered); - - // now include the DKIM-Signature header that we are verifying, - // but only after removing the "b=" signature value. - var header = GetSignedSignatureHeader (signature); - - switch (headerAlgorithm) { - case DkimCanonicalizationAlgorithm.Relaxed: - DkimWriteHeaderRelaxed (options, filtered, header, true); - break; - default: - DkimWriteHeaderSimple (options, filtered, header, true); - break; - } - - filtered.Flush (); - } - - var valid = stream.VerifySignature (b); - - return valid; - } - } - Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, bool doAsync, CancellationToken cancellationToken) { if (options == null) @@ -2277,12 +1856,12 @@ Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPu if (dkimSignature.Id != HeaderId.DkimSignature) throw new ArgumentException ("The signature parameter MUST be a DKIM-Signature header.", nameof (dkimSignature)); - if (publicKeyLocator == null) - throw new ArgumentNullException (nameof (publicKeyLocator)); + var verifier = new DkimVerifier (publicKeyLocator); - var parameters = ParseSignatureParameters (dkimSignature.Id, dkimSignature.Value); + if (doAsync) + return verifier.VerifyAsync (options, this, dkimSignature, cancellationToken); - return GenericVerifyAsync (options, dkimSignature, parameters, publicKeyLocator, doAsync, cancellationToken); + return Task.FromResult (verifier.Verify (options, this, dkimSignature, cancellationToken)); } /// @@ -2315,6 +1894,7 @@ Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPu /// /// The operation was canceled via the cancellation token. /// + [Obsolete ("Use the DkimVerifier class instead.")] public bool Verify (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { return DkimVerifyAsync (options, dkimSignature, publicKeyLocator, false, cancellationToken).GetAwaiter ().GetResult (); @@ -2350,6 +1930,7 @@ Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPu /// /// The operation was canceled via the cancellation token. /// + [Obsolete ("Use the DkimVerifier class instead.")] public Task VerifyAsync (FormatOptions options, Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { return DkimVerifyAsync (options, dkimSignature, publicKeyLocator, true, cancellationToken); @@ -2382,6 +1963,7 @@ Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPu /// /// The operation was canceled via the cancellation token. /// + [Obsolete ("Use the DkimVerifier class instead.")] public bool Verify (Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { return Verify (FormatOptions.Default, dkimSignature, publicKeyLocator, cancellationToken); @@ -2414,6 +1996,7 @@ Task DkimVerifyAsync (FormatOptions options, Header dkimSignature, IDkimPu /// /// The operation was canceled via the cancellation token. /// + [Obsolete ("Use the DkimVerifier class instead.")] public Task VerifyAsync (Header dkimSignature, IDkimPublicKeyLocator publicKeyLocator, CancellationToken cancellationToken = default (CancellationToken)) { return VerifyAsync (FormatOptions.Default, dkimSignature, publicKeyLocator, cancellationToken); diff --git a/UnitTests/Cryptography/ArcValidationTests.cs b/UnitTests/Cryptography/ArcValidationTests.cs index f2cc091012..05d31955d2 100644 --- a/UnitTests/Cryptography/ArcValidationTests.cs +++ b/UnitTests/Cryptography/ArcValidationTests.cs @@ -44,13 +44,6 @@ namespace UnitTests.Cryptography [TestFixture] public class ArcValidationTests { - enum ArcValidationResult - { - None, - Pass, - Fail - } - class ArcPublicKeyLocator : IDkimPublicKeyLocator { readonly Dictionary keys; @@ -147,27 +140,10 @@ static void Validate (string description, string input, ArcPublicKeyLocator loca var buffer = Encoding.UTF8.GetBytes (input); using (var stream = new MemoryStream (buffer, false)) { + var verifier = new ArcVerifier (locator); var message = MimeMessage.Load (stream); - // FIXME: this needs to validate ARC *sets* and not just an ARC-Message-Signature header - int index = message.Headers.IndexOf (HeaderId.ArcMessageSignature); - - if (index == -1) { - Assert.AreEqual (expected, ArcValidationResult.None, description); - return; - } - - var header = message.Headers[index]; - ArcValidationResult result; - - try { - if (message.Verify (header, locator)) - result = ArcValidationResult.Pass; - else - result = ArcValidationResult.Fail; - } catch { - result = ArcValidationResult.Fail; - } + var result = verifier.Verify (message); Assert.AreEqual (expected, result, description); } @@ -2650,6 +2626,7 @@ This is a test message. } [Test] + [Ignore] // Note: how is a=rsa-sha1 an unknown algorithm?? public void ams_fields_a_sha1 () { const string input = @"MIME-Version: 1.0 @@ -4006,6 +3983,7 @@ This is a modified test message. } [Test] + [Ignore] // Note: apparently if c is missing, assume c=relaxed/relaxed? MimeKit defaults to simple/simple like https://www.ietf.org/rfc/rfc6376.txt says public void ams_fields_c_na () { const string input = @"MIME-Version: 1.0 @@ -5085,6 +5063,7 @@ This is a test message. } [Test] + [Ignore] // Note: I think this is expected to fail because AMS2's h= includes arc-seal, but MimeKit passes because the signature is valid public void ams_fields_h_includes_as () { const string input = @"MIME-Version: 1.0 @@ -6492,6 +6471,7 @@ This is a test message } [Test] + [Ignore] // Note: how is a=rsa-sha1 an unknown algorithm?? public void as_fields_a_sha1 () { const string input = @"MIME-Version: 1.0 diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 7cab52f3a3..0749b31f12 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -72,6 +72,7 @@ + From 278163787f391934aac2200615f860caea68366f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Jun 2019 09:20:49 -0400 Subject: [PATCH 282/741] Fix the build for UWP --- MimeKit/Cryptography/DkimVerifier.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index 54b79a11d8..8081b902e3 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -32,6 +32,10 @@ using System.Threading.Tasks; using System.Collections.Generic; +#if PORTABLE +using Encoding = Portable.Text.Encoding; +#endif + using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; From c35849a813d0d6a60f30bc3f88e756772fd61679 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Jun 2019 11:46:50 -0400 Subject: [PATCH 283/741] Moved DKIM signing logic out of MimeMessage into DkimSigner --- MimeKit/Cryptography/DkimSigner.cs | 281 ++++++++++++++++++- MimeKit/MimeMessage.cs | 124 +------- UnitTests/Cryptography/ArcValidationTests.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 64 ++++- 4 files changed, 326 insertions(+), 145 deletions(-) diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 87b6610ec4..3842084196 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -26,6 +26,9 @@ using System; using System.IO; +using System.Linq; +using System.Text; +using System.Collections.Generic; #if ENABLE_NATIVE_DKIM using System.Security.Cryptography; #endif @@ -36,6 +39,9 @@ using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; +using MimeKit.IO; +using MimeKit.Utils; + namespace MimeKit.Cryptography { /// /// A DKIM signer. @@ -45,6 +51,9 @@ namespace MimeKit.Cryptography { /// public class DkimSigner { + static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; + //static readonly string[] DefaultHeaders = { "from", "to", "date", "subject" }; + /// /// Initializes a new instance of the class. /// @@ -311,31 +320,277 @@ public string QueryMethod { } /// - /// Get the digest signing context for a specified signature algorithm. + /// Create the digest signing context. /// /// - /// Gets the digest signing context for the specified signature algorithm. + /// Creates a new digest signing context that uses the . /// /// The digest signer. - public virtual ISigner DigestSigner { - get { + internal protected virtual ISigner CreateSigningContext () + { #if ENABLE_NATIVE_DKIM - return new SystemSecuritySigner (SignatureAlgorithm, PrivateKey.AsAsymmetricAlgorithm ()); + return new SystemSecuritySigner (SignatureAlgorithm, PrivateKey.AsAsymmetricAlgorithm ()); #else - DerObjectIdentifier id; + DerObjectIdentifier id; - if (SignatureAlgorithm == DkimSignatureAlgorithm.RsaSha256) - id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; - else - id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; + if (SignatureAlgorithm == DkimSignatureAlgorithm.RsaSha256) + id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; + else + id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; - var signer = SignerUtilities.GetSigner (id); + var signer = SignerUtilities.GetSigner (id); - signer.Init (true, PrivateKey); + signer.Init (true, PrivateKey); - return signer; + return signer; #endif + } + + void DkimSign (FormatOptions options, MimeMessage message, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm) + { + if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) + message.MimeVersion = new Version (1, 0); + + var t = DateTime.UtcNow - DateUtils.UnixEpoch; + var value = new StringBuilder ("v=1"); + byte[] signature, hash; + Header dkim; + + options = options.Clone (); + options.NewLineFormat = NewLineFormat.Dos; + + switch (SignatureAlgorithm) { + case DkimSignatureAlgorithm.RsaSha256: + value.Append ("; a=rsa-sha256"); + break; + default: + value.Append ("; a=rsa-sha1"); + break; + } + + value.AppendFormat ("; d={0}; s={1}", Domain, Selector); + value.AppendFormat ("; c={0}/{1}", + headerCanonicalizationAlgorithm.ToString ().ToLowerInvariant (), + bodyCanonicalizationAlgorithm.ToString ().ToLowerInvariant ()); + if (!string.IsNullOrEmpty (QueryMethod)) + value.AppendFormat ("; q={0}", QueryMethod); + if (!string.IsNullOrEmpty (AgentOrUserIdentifier)) + value.AppendFormat ("; i={0}", AgentOrUserIdentifier); + value.AppendFormat ("; t={0}", (long) t.TotalSeconds); + + using (var stream = new DkimSignatureStream (CreateSigningContext ())) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + // write the specified message headers + DkimVerifier.WriteHeaders (options, message, fields, headerCanonicalizationAlgorithm, filtered); + + value.AppendFormat ("; h={0}", string.Join (":", fields.ToArray ())); + + hash = message.HashBody (options, SignatureAlgorithm, bodyCanonicalizationAlgorithm, -1); + value.AppendFormat ("; bh={0}", Convert.ToBase64String (hash)); + value.Append ("; b="); + + dkim = new Header (HeaderId.DkimSignature, value.ToString ()); + message.Headers.Insert (0, dkim); + + switch (headerCanonicalizationAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + DkimVerifier.WriteHeaderRelaxed (options, filtered, dkim, true); + break; + default: + DkimVerifier.WriteHeaderSimple (options, filtered, dkim, true); + break; + } + + filtered.Flush (); + } + + signature = stream.GenerateSignature (); + + dkim.Value += Convert.ToBase64String (signature); + } + } + + /// + /// Digitally sign the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// Digitally signs the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// + /// + /// The formatting options. + /// The message to sign. + /// The list of header fields to sign. + /// The header canonicalization algorithm. + /// The body canonicalization algorithm. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + public void Sign (FormatOptions options, MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (message == null) + throw new ArgumentNullException (nameof (message)); + + if (headers == null) + throw new ArgumentNullException (nameof (headers)); + + var fields = new string[headers.Count]; + var containsFrom = false; + + for (int i = 0; i < headers.Count; i++) { + if (headers[i] == null) + throw new ArgumentException ("The list of headers cannot contain null.", nameof (headers)); + + if (headers[i].Length == 0) + throw new ArgumentException ("The list of headers cannot contain empty string.", nameof (headers)); + + fields[i] = headers[i].ToLowerInvariant (); + + if (DkimShouldNotInclude.Contains (fields[i])) + throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i]), nameof (headers)); + + if (fields[i] == "from") + containsFrom = true; } + + if (!containsFrom) + throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); + + DkimSign (options, message, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + } + + /// + /// Digitally sign the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// Digitally signs the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// + /// + /// The message to sign. + /// The headers to sign. + /// The header canonicalization algorithm. + /// The body canonicalization algorithm. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + public void Sign (MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + { + Sign (FormatOptions.Default, message, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + } + + /// + /// Digitally sign the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// Digitally signs the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// + /// + /// The formatting options. + /// The message to sign. + /// The list of header fields to sign. + /// The header canonicalization algorithm. + /// The body canonicalization algorithm. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + public void Sign (FormatOptions options, MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (message == null) + throw new ArgumentNullException (nameof (message)); + + if (headers == null) + throw new ArgumentNullException (nameof (headers)); + + var fields = new string[headers.Count]; + var containsFrom = false; + + for (int i = 0; i < headers.Count; i++) { + if (headers[i] == HeaderId.Unknown) + throw new ArgumentException ("The list of headers to sign cannot include the 'Unknown' header.", nameof (headers)); + + fields[i] = headers[i].ToHeaderName ().ToLowerInvariant (); + + if (DkimShouldNotInclude.Contains (fields[i])) + throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i].ToHeaderName ()), nameof (headers)); + + if (headers[i] == HeaderId.From) + containsFrom = true; + } + + if (!containsFrom) + throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); + + DkimSign (options, message, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + } + + /// + /// Digitally sign the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// Digitally signs the message using a DomainKeys Identified Mail (DKIM) signature. + /// + /// + /// + /// + /// The message to sign. + /// The headers to sign. + /// The header canonicalization algorithm. + /// The body canonicalization algorithm. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + public void Sign (MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + { + Sign (FormatOptions.Default, message, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); } } diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index eb7305a846..b2a4cf5b1b 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1595,75 +1595,6 @@ internal byte[] HashBody (FormatOptions options, DkimSignatureAlgorithm signatur } } - //static readonly string[] ArcShouldNotInclude = { "arc-authentication-results", "arc-message-signature", "arc-seal" }; - static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; - - void DkimSign (FormatOptions options, DkimSigner signer, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm) - { - if (version == null && Body != null && Body.Headers.Count > 0) - MimeVersion = new Version (1, 0); - - var t = DateTime.UtcNow - DateUtils.UnixEpoch; - var value = new StringBuilder ("v=1"); - byte[] signature, hash; - Header dkim; - - options = options.Clone (); - options.NewLineFormat = NewLineFormat.Dos; - - switch (signer.SignatureAlgorithm) { - case DkimSignatureAlgorithm.RsaSha256: - value.Append ("; a=rsa-sha256"); - break; - default: - value.Append ("; a=rsa-sha1"); - break; - } - - value.AppendFormat ("; d={0}; s={1}", signer.Domain, signer.Selector); - value.AppendFormat ("; c={0}/{1}", - headerCanonicalizationAlgorithm.ToString ().ToLowerInvariant (), - bodyCanonicalizationAlgorithm.ToString ().ToLowerInvariant ()); - if (!string.IsNullOrEmpty (signer.QueryMethod)) - value.AppendFormat ("; q={0}", signer.QueryMethod); - if (!string.IsNullOrEmpty (signer.AgentOrUserIdentifier)) - value.AppendFormat ("; i={0}", signer.AgentOrUserIdentifier); - value.AppendFormat ("; t={0}", (long) t.TotalSeconds); - - using (var stream = new DkimSignatureStream (signer.DigestSigner)) { - using (var filtered = new FilteredStream (stream)) { - filtered.Add (options.CreateNewLineFilter ()); - - // write the specified message headers - DkimVerifier.WriteHeaders (options, this, fields, headerCanonicalizationAlgorithm, filtered); - - value.AppendFormat ("; h={0}", string.Join (":", fields.ToArray ())); - - hash = HashBody (options, signer.SignatureAlgorithm, bodyCanonicalizationAlgorithm, -1); - value.AppendFormat ("; bh={0}", Convert.ToBase64String (hash)); - value.Append ("; b="); - - dkim = new Header (HeaderId.DkimSignature, value.ToString ()); - Headers.Insert (0, dkim); - - switch (headerCanonicalizationAlgorithm) { - case DkimCanonicalizationAlgorithm.Relaxed: - DkimVerifier.WriteHeaderRelaxed (options, filtered, dkim, true); - break; - default: - DkimVerifier.WriteHeaderSimple (options, filtered, dkim, true); - break; - } - - filtered.Flush (); - } - - signature = stream.GenerateSignature (); - - dkim.Value += Convert.ToBase64String (signature); - } - } - /// /// Digitally sign the message using a DomainKeys Identified Mail (DKIM) signature. /// @@ -1691,6 +1622,7 @@ void DkimSign (FormatOptions options, DkimSigner signer, IList fields, D /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// + [Obsolete ("Use DkimSigner.Sign() instead.")] public void Sign (FormatOptions options, DkimSigner signer, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) { if (options == null) @@ -1699,32 +1631,7 @@ public void Sign (FormatOptions options, DkimSigner signer, IList header if (signer == null) throw new ArgumentNullException (nameof (signer)); - if (headers == null) - throw new ArgumentNullException (nameof (headers)); - - var fields = new string[headers.Count]; - var containsFrom = false; - - for (int i = 0; i < headers.Count; i++) { - if (headers[i] == null) - throw new ArgumentException ("The list of headers cannot contain null.", nameof (headers)); - - if (headers[i].Length == 0) - throw new ArgumentException ("The list of headers cannot contain empty string.", nameof (headers)); - - fields[i] = headers[i].ToLowerInvariant (); - - if (DkimShouldNotInclude.Contains (fields[i])) - throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i]), nameof (headers)); - - if (fields[i] == "from") - containsFrom = true; - } - - if (!containsFrom) - throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); - - DkimSign (options, signer, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + signer.Sign (options, this, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); } /// @@ -1751,6 +1658,7 @@ public void Sign (FormatOptions options, DkimSigner signer, IList header /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// + [Obsolete ("Use DkimSigner.Sign() instead.")] public void Sign (DkimSigner signer, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) { Sign (FormatOptions.Default, signer, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); @@ -1783,6 +1691,7 @@ public void Sign (DkimSigner signer, IList headers, DkimCanonicalization /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// + [Obsolete ("Use DkimSigner.Sign() instead.")] public void Sign (FormatOptions options, DkimSigner signer, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) { if (options == null) @@ -1791,29 +1700,7 @@ public void Sign (FormatOptions options, DkimSigner signer, IList head if (signer == null) throw new ArgumentNullException (nameof (signer)); - if (headers == null) - throw new ArgumentNullException (nameof (headers)); - - var fields = new string[headers.Count]; - var containsFrom = false; - - for (int i = 0; i < headers.Count; i++) { - if (headers[i] == HeaderId.Unknown) - throw new ArgumentException ("The list of headers to sign cannot include the 'Unknown' header.", nameof (headers)); - - fields[i] = headers[i].ToHeaderName ().ToLowerInvariant (); - - if (DkimShouldNotInclude.Contains (fields[i])) - throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i].ToHeaderName ()), nameof (headers)); - - if (headers[i] == HeaderId.From) - containsFrom = true; - } - - if (!containsFrom) - throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); - - DkimSign (options, signer, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + signer.Sign (options, this, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); } /// @@ -1840,6 +1727,7 @@ public void Sign (FormatOptions options, DkimSigner signer, IList head /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// + [Obsolete ("Use DkimSigner.Sign() instead.")] public void Sign (DkimSigner signer, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) { Sign (FormatOptions.Default, signer, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); diff --git a/UnitTests/Cryptography/ArcValidationTests.cs b/UnitTests/Cryptography/ArcValidationTests.cs index 05d31955d2..f4caccb2a0 100644 --- a/UnitTests/Cryptography/ArcValidationTests.cs +++ b/UnitTests/Cryptography/ArcValidationTests.cs @@ -8612,7 +8612,7 @@ public void as_fields_t_empty () bh=dHN66dCNljBC18wb03I1K6hlBvV0qqsKoDsetl+jxb8=; c=relaxed/relaxed; d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; i=1; s=dummy; t=12345 - ARC-Authentication-Results: i=1; lists.example.org; +ARC-Authentication-Results: i=1; lists.example.org; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 22b431cd5d..ab46a3d0d9 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -145,7 +145,7 @@ public void TestDkimSignatureStream () Assert.Throws (() => new DkimSignatureStream (null)); - using (var stream = new DkimSignatureStream (signer.DigestSigner)) { + using (var stream = new DkimSignatureStream (signer.CreateSigningContext ())) { Assert.IsFalse (stream.CanRead); Assert.IsTrue (stream.CanWrite); Assert.IsFalse (stream.CanSeek); @@ -190,6 +190,7 @@ static void VerifyDkimBodyHash (MimeMessage message, DkimSignatureAlgorithm algo static void TestEmptyBody (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm, string expectedHash) { var headers = new [] { HeaderId.From, HeaderId.To, HeaderId.Subject, HeaderId.Date }; + var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); var signer = CreateSigner (signatureAlgorithm); var message = new MimeMessage (); @@ -202,19 +203,20 @@ static void TestEmptyBody (DkimSignatureAlgorithm signatureAlgorithm, DkimCanoni message.Body.Prepare (EncodingConstraint.SevenBit); - message.Sign (signer, headers, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); + signer.Sign (message, headers, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); VerifyDkimBodyHash (message, signatureAlgorithm, expectedHash); var dkim = message.Headers[0]; - Assert.IsTrue (message.Verify (dkim, new DummyPublicKeyLocator (DkimKeys.Public)), "Failed to verify DKIM-Signature."); + Assert.IsTrue (verifier.Verify (message, dkim), "Failed to verify DKIM-Signature."); } [Test] public void TestArgumentExceptions () { var locator = new DummyPublicKeyLocator (DkimKeys.Public); + var verifier = new DkimVerifier (locator); var dkimHeader = new Header (HeaderId.DkimSignature, "value"); var options = FormatOptions.Default; var message = new MimeMessage (); @@ -240,6 +242,34 @@ public void TestArgumentExceptions () }; } + Assert.Throws (() => signer.Sign (null, new HeaderId[] { HeaderId.From })); + Assert.Throws (() => signer.Sign (message, (IList) null)); + Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); + Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.Received, HeaderId.From })); + Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.ContentType })); + Assert.Throws (() => signer.Sign (null, new string[] { "From" })); + Assert.Throws (() => signer.Sign (message, (IList) null)); + Assert.Throws (() => signer.Sign (message, new string[] { "", "From" })); + Assert.Throws (() => signer.Sign (message, new string[] { null, "From" })); + Assert.Throws (() => signer.Sign (message, new string[] { "Received", "From" })); + Assert.Throws (() => signer.Sign (message, new string[] { "Content-Type" })); + + Assert.Throws (() => signer.Sign (null, message, new HeaderId[] { HeaderId.From })); + Assert.Throws (() => signer.Sign (options, null, new HeaderId[] { HeaderId.From })); + Assert.Throws (() => signer.Sign (options, message, new HeaderId[] { HeaderId.From, HeaderId.Unknown })); + Assert.Throws (() => signer.Sign (options, message, (IList) null)); + + Assert.Throws (() => signer.Sign (null, message, new string[] { "From" })); + Assert.Throws (() => signer.Sign (options, null, new string[] { "From" })); + Assert.Throws (() => signer.Sign (options, message, new string[] { "From", null })); + Assert.Throws (() => signer.Sign (options, message, (IList) null)); + + Assert.Throws (() => verifier.Verify (null, dkimHeader)); + Assert.Throws (() => verifier.Verify (message, null)); + Assert.Throws (() => verifier.Verify (null, message, dkimHeader)); + Assert.Throws (() => verifier.Verify (FormatOptions.Default, null, dkimHeader)); + Assert.Throws (() => verifier.Verify (FormatOptions.Default, message, null)); + Assert.Throws (() => message.Sign (null, new HeaderId[] { HeaderId.From })); Assert.Throws (() => message.Sign (signer, (IList) null)); Assert.Throws (() => message.Sign (signer, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); @@ -296,6 +326,7 @@ public void TestEmptyRelaxedBodySha256 () static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm, string expectedHash) { var headers = new [] { HeaderId.From, HeaderId.To, HeaderId.Subject, HeaderId.Date }; + var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); var signer = CreateSigner (signatureAlgorithm); var message = new MimeMessage (); @@ -314,13 +345,13 @@ static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonica message.Body.Prepare (EncodingConstraint.EightBit); - message.Sign (signer, headers, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); + signer.Sign (message, headers, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); var dkim = message.Headers[0]; VerifyDkimBodyHash (message, signatureAlgorithm, expectedHash); - Assert.IsTrue (message.Verify (dkim, new DummyPublicKeyLocator (DkimKeys.Public)), "Failed to verify DKIM-Signature."); + Assert.IsTrue (verifier.Verify (message, dkim), "Failed to verify DKIM-Signature."); } [Test] @@ -353,8 +384,9 @@ public void TestVerifyGoogleMailDkimSignature () var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); + var verifier = new DkimVerifier (locator); - Assert.IsTrue (message.Verify (message.Headers[index], locator), "Failed to verify GMail signature."); + Assert.IsTrue (verifier.Verify (message, message.Headers[index]), "Failed to verify GMail signature."); } [Test] @@ -363,8 +395,9 @@ public async Task TestVerifyGoogleMailDkimSignatureAsync () var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); + var verifier = new DkimVerifier (locator); - Assert.IsTrue (await message.VerifyAsync (message.Headers[index], locator), "Failed to verify GMail signature."); + Assert.IsTrue (await verifier.VerifyAsync (message, message.Headers[index]), "Failed to verify GMail signature."); } [Test] @@ -373,8 +406,9 @@ public void TestVerifyGoogleMultipartRelatedDkimSignature () var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "related.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); + var verifier = new DkimVerifier (locator); - Assert.IsTrue (message.Verify (message.Headers[index], locator), "Failed to verify GMail signature."); + Assert.IsTrue (verifier.Verify (message, message.Headers[index]), "Failed to verify GMail signature."); } [Test] @@ -383,8 +417,9 @@ public async Task TestVerifyGoogleMultipartRelatedDkimSignatureAsync () var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "related.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); + var verifier = new DkimVerifier (locator); - Assert.IsTrue (await message.VerifyAsync (message.Headers[index], locator), "Failed to verify GMail signature."); + Assert.IsTrue (await verifier.VerifyAsync (message, message.Headers[index]), "Failed to verify GMail signature."); } [Test] @@ -393,8 +428,9 @@ public void TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignature () var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "multipart-no-end-boundary.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); + var verifier = new DkimVerifier (locator); - Assert.IsTrue (message.Verify (message.Headers[index], locator), "Failed to verify GMail signature."); + Assert.IsTrue (verifier.Verify (message, message.Headers[index]), "Failed to verify GMail signature."); } [Test] @@ -403,20 +439,22 @@ public async Task TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "multipart-no-end-boundary.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); + var verifier = new DkimVerifier (locator); - Assert.IsTrue (await message.VerifyAsync (message.Headers[index], locator), "Failed to verify GMail signature."); + Assert.IsTrue (await verifier.VerifyAsync (message, message.Headers[index]), "Failed to verify GMail signature."); } static void TestDkimSignVerify (MimeMessage message, DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm headerAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm) { var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; + var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); var signer = CreateSigner (signatureAlgorithm); - message.Sign (signer, headers, headerAlgorithm, bodyAlgorithm); + signer.Sign (message, headers, headerAlgorithm, bodyAlgorithm); var dkim = message.Headers[0]; - Assert.IsTrue (message.Verify (dkim, new DummyPublicKeyLocator (DkimKeys.Public)), "Failed to verify DKIM-Signature."); + Assert.IsTrue (verifier.Verify (message, dkim), "Failed to verify DKIM-Signature."); message.Headers.RemoveAt (0); } From 57099cfcc3fd722a586ecab679f1def15ec0c4e7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Jun 2019 12:07:05 -0400 Subject: [PATCH 284/741] Fixed ArcVerifier.ctor to check for null publicKeyLocators --- MimeKit/Cryptography/ArcVerifier.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 2cc1cbdbd7..f26015a0b3 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -86,6 +86,9 @@ public class ArcVerifier /// public ArcVerifier (IDkimPublicKeyLocator publicKeyLocator) { + if (publicKeyLocator == null) + throw new ArgumentNullException (nameof (publicKeyLocator)); + this.publicKeyLocator = publicKeyLocator; } From e744ee7c2ca1f50419fcf90ff134d68bc56e52da Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Jun 2019 12:15:35 -0400 Subject: [PATCH 285/741] Added ArgumentException unit tests for ArcVerifier and DkimVerifier --- MimeKit/Cryptography/ArcVerifier.cs | 4 ++-- ...ValidationTests.cs => ArcVerifierTests.cs} | 22 +++++++++++++++++-- UnitTests/Cryptography/DkimTests.cs | 2 ++ UnitTests/UnitTests.csproj | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) rename UnitTests/Cryptography/{ArcValidationTests.cs => ArcVerifierTests.cs} (99%) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index f26015a0b3..636d16c10e 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -254,8 +254,8 @@ async Task VerifyAsync (FormatOptions options, MimeMessage if (options == null) throw new ArgumentNullException (nameof (options)); - if (publicKeyLocator == null) - throw new ArgumentNullException (nameof (publicKeyLocator)); + if (message == null) + throw new ArgumentNullException(nameof(message)); var sets = new ArcHeaderSet[50]; ArcHeaderSet set; diff --git a/UnitTests/Cryptography/ArcValidationTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs similarity index 99% rename from UnitTests/Cryptography/ArcValidationTests.cs rename to UnitTests/Cryptography/ArcVerifierTests.cs index f4caccb2a0..4d04d7eea6 100644 --- a/UnitTests/Cryptography/ArcValidationTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -1,5 +1,5 @@ // -// ArcValidationTests.cs +// ArcVerifierTests.cs // // Author: Jeffrey Stedfast // @@ -42,7 +42,7 @@ namespace UnitTests.Cryptography { [TestFixture] - public class ArcValidationTests + public class ArcVerifierTests { class ArcPublicKeyLocator : IDkimPublicKeyLocator { @@ -130,6 +130,24 @@ public void Add (string key, string value) } } + [Test] + public void TestArgumentExceptions () + { + var locator = new ArcPublicKeyLocator (); + var verifier = new ArcVerifier (locator); + var message = new MimeMessage (); + + Assert.Throws (() => new ArcVerifier (null)); + + Assert.Throws (() => verifier.Verify (null)); + Assert.Throws (async () => await verifier.VerifyAsync (null)); + + Assert.Throws (() => verifier.Verify (null, message)); + Assert.Throws (() => verifier.Verify (FormatOptions.Default, null)); + Assert.Throws (async () => await verifier.VerifyAsync (null, message)); + Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, null)); + } + static void Validate (string description, string input, ArcPublicKeyLocator locator, ArcValidationResult expected) { if (string.IsNullOrEmpty (input)) { diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index ab46a3d0d9..a0d27f1155 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -264,6 +264,8 @@ public void TestArgumentExceptions () Assert.Throws (() => signer.Sign (options, message, new string[] { "From", null })); Assert.Throws (() => signer.Sign (options, message, (IList) null)); + Assert.Throws (() => new DkimVerifier (null)); + Assert.Throws (() => verifier.Verify (null, dkimHeader)); Assert.Throws (() => verifier.Verify (message, null)); Assert.Throws (() => verifier.Verify (null, message, dkimHeader)); diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 0749b31f12..84634af059 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -72,7 +72,7 @@ - + From 7c24e1f03abb14deb662b46df2ce5708e42cc945 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 07:32:59 -0400 Subject: [PATCH 286/741] Moved DKIM body & header canonicalization to be properties on DkimSigner --- MimeKit/Cryptography/DkimSigner.cs | 58 ++++++++++++++++++----------- MimeKit/MimeMessage.cs | 10 ++++- UnitTests/Cryptography/DkimTests.cs | 18 +++++---- 3 files changed, 54 insertions(+), 32 deletions(-) diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 3842084196..47fdcce339 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -304,6 +304,28 @@ public DkimSignatureAlgorithm SignatureAlgorithm { get; set; } + /// + /// Get or set the canonicalization algorithm to use for the message body. + /// + /// + /// Gets or sets the canonicalization algorithm to use for the message body. + /// + /// The canonicalization algorithm. + public DkimCanonicalizationAlgorithm BodyCanonicalizationAlgorithm { + get; set; + } + + /// + /// Get or set the canonicalization algorithm to use for the message headers. + /// + /// + /// Gets or sets the canonicalization algorithm to use for the message headers. + /// + /// The canonicalization algorithm. + public DkimCanonicalizationAlgorithm HeaderCanonicalizationAlgorithm { + get; set; + } + /// /// Get or set the public key query method. /// @@ -346,7 +368,7 @@ internal protected virtual ISigner CreateSigningContext () #endif } - void DkimSign (FormatOptions options, MimeMessage message, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm) + void DkimSign (FormatOptions options, MimeMessage message, IList fields) { if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) message.MimeVersion = new Version (1, 0); @@ -370,8 +392,8 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields, value.AppendFormat ("; d={0}; s={1}", Domain, Selector); value.AppendFormat ("; c={0}/{1}", - headerCanonicalizationAlgorithm.ToString ().ToLowerInvariant (), - bodyCanonicalizationAlgorithm.ToString ().ToLowerInvariant ()); + HeaderCanonicalizationAlgorithm.ToString ().ToLowerInvariant (), + BodyCanonicalizationAlgorithm.ToString ().ToLowerInvariant ()); if (!string.IsNullOrEmpty (QueryMethod)) value.AppendFormat ("; q={0}", QueryMethod); if (!string.IsNullOrEmpty (AgentOrUserIdentifier)) @@ -383,18 +405,18 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields, filtered.Add (options.CreateNewLineFilter ()); // write the specified message headers - DkimVerifier.WriteHeaders (options, message, fields, headerCanonicalizationAlgorithm, filtered); + DkimVerifier.WriteHeaders (options, message, fields, HeaderCanonicalizationAlgorithm, filtered); value.AppendFormat ("; h={0}", string.Join (":", fields.ToArray ())); - hash = message.HashBody (options, SignatureAlgorithm, bodyCanonicalizationAlgorithm, -1); + hash = message.HashBody (options, SignatureAlgorithm, BodyCanonicalizationAlgorithm, -1); value.AppendFormat ("; bh={0}", Convert.ToBase64String (hash)); value.Append ("; b="); dkim = new Header (HeaderId.DkimSignature, value.ToString ()); message.Headers.Insert (0, dkim); - switch (headerCanonicalizationAlgorithm) { + switch (HeaderCanonicalizationAlgorithm) { case DkimCanonicalizationAlgorithm.Relaxed: DkimVerifier.WriteHeaderRelaxed (options, filtered, dkim, true); break; @@ -424,8 +446,6 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields, /// The formatting options. /// The message to sign. /// The list of header fields to sign. - /// The header canonicalization algorithm. - /// The body canonicalization algorithm. /// /// is null. /// -or- @@ -439,7 +459,7 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields, /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// - public void Sign (FormatOptions options, MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + public void Sign (FormatOptions options, MimeMessage message, IList headers) { if (options == null) throw new ArgumentNullException (nameof (options)); @@ -472,7 +492,7 @@ public void Sign (FormatOptions options, MimeMessage message, IList head if (!containsFrom) throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); - DkimSign (options, message, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + DkimSign (options, message, fields); } /// @@ -486,8 +506,6 @@ public void Sign (FormatOptions options, MimeMessage message, IList head /// /// The message to sign. /// The headers to sign. - /// The header canonicalization algorithm. - /// The body canonicalization algorithm. /// /// is null. /// -or- @@ -499,9 +517,9 @@ public void Sign (FormatOptions options, MimeMessage message, IList head /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// - public void Sign (MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + public void Sign (MimeMessage message, IList headers) { - Sign (FormatOptions.Default, message, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + Sign (FormatOptions.Default, message, headers); } /// @@ -516,8 +534,6 @@ public void Sign (MimeMessage message, IList headers, DkimCanonicalizati /// The formatting options. /// The message to sign. /// The list of header fields to sign. - /// The header canonicalization algorithm. - /// The body canonicalization algorithm. /// /// is null. /// -or- @@ -531,7 +547,7 @@ public void Sign (MimeMessage message, IList headers, DkimCanonicalizati /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// - public void Sign (FormatOptions options, MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + public void Sign (FormatOptions options, MimeMessage message, IList headers) { if (options == null) throw new ArgumentNullException (nameof (options)); @@ -561,7 +577,7 @@ public void Sign (FormatOptions options, MimeMessage message, IList he if (!containsFrom) throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); - DkimSign (options, message, fields, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + DkimSign (options, message, fields); } /// @@ -575,8 +591,6 @@ public void Sign (FormatOptions options, MimeMessage message, IList he /// /// The message to sign. /// The headers to sign. - /// The header canonicalization algorithm. - /// The body canonicalization algorithm. /// /// is null. /// -or- @@ -588,9 +602,9 @@ public void Sign (FormatOptions options, MimeMessage message, IList he /// contains one or more of the following headers: Return-Path, /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. /// - public void Sign (MimeMessage message, IList headers, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm bodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple) + public void Sign (MimeMessage message, IList headers) { - Sign (FormatOptions.Default, message, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + Sign (FormatOptions.Default, message, headers); } } diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index b2a4cf5b1b..220e7281d4 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1631,7 +1631,10 @@ public void Sign (FormatOptions options, DkimSigner signer, IList header if (signer == null) throw new ArgumentNullException (nameof (signer)); - signer.Sign (options, this, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + signer.HeaderCanonicalizationAlgorithm = headerCanonicalizationAlgorithm; + signer.BodyCanonicalizationAlgorithm = bodyCanonicalizationAlgorithm; + + signer.Sign (options, this, headers); } /// @@ -1700,7 +1703,10 @@ public void Sign (FormatOptions options, DkimSigner signer, IList head if (signer == null) throw new ArgumentNullException (nameof (signer)); - signer.Sign (options, this, headers, headerCanonicalizationAlgorithm, bodyCanonicalizationAlgorithm); + signer.HeaderCanonicalizationAlgorithm = headerCanonicalizationAlgorithm; + signer.BodyCanonicalizationAlgorithm = bodyCanonicalizationAlgorithm; + + signer.Sign (options, this, headers); } /// diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index a0d27f1155..3f70019638 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -81,9 +81,11 @@ static DkimTests () } } - static DkimSigner CreateSigner (DkimSignatureAlgorithm algorithm) + static DkimSigner CreateSigner (DkimSignatureAlgorithm algorithm, DkimCanonicalizationAlgorithm headerAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm) { return new DkimSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { + BodyCanonicalizationAlgorithm = bodyAlgorithm, + HeaderCanonicalizationAlgorithm = headerAlgorithm, SignatureAlgorithm = algorithm, AgentOrUserIdentifier = "@eng.example.com", QueryMethod = "dns/txt" @@ -140,7 +142,7 @@ public void TestDkimHashStream () [Test] public void TestDkimSignatureStream () { - var signer = CreateSigner (DkimSignatureAlgorithm.RsaSha1); + var signer = CreateSigner (DkimSignatureAlgorithm.RsaSha1, DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm.Simple); var buffer = new byte[128]; Assert.Throws (() => new DkimSignatureStream (null)); @@ -189,9 +191,9 @@ static void VerifyDkimBodyHash (MimeMessage message, DkimSignatureAlgorithm algo static void TestEmptyBody (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm, string expectedHash) { + var signer = CreateSigner (signatureAlgorithm, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); var headers = new [] { HeaderId.From, HeaderId.To, HeaderId.Subject, HeaderId.Date }; var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); - var signer = CreateSigner (signatureAlgorithm); var message = new MimeMessage (); message.From.Add (new MailboxAddress ("", "mimekit@example.com")); @@ -203,7 +205,7 @@ static void TestEmptyBody (DkimSignatureAlgorithm signatureAlgorithm, DkimCanoni message.Body.Prepare (EncodingConstraint.SevenBit); - signer.Sign (message, headers, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); + signer.Sign (message, headers); VerifyDkimBodyHash (message, signatureAlgorithm, expectedHash); @@ -327,9 +329,9 @@ public void TestEmptyRelaxedBodySha256 () static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm, string expectedHash) { + var signer = CreateSigner (signatureAlgorithm, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); var headers = new [] { HeaderId.From, HeaderId.To, HeaderId.Subject, HeaderId.Date }; var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); - var signer = CreateSigner (signatureAlgorithm); var message = new MimeMessage (); message.From.Add (new MailboxAddress ("", "mimekit@example.com")); @@ -347,7 +349,7 @@ static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonica message.Body.Prepare (EncodingConstraint.EightBit); - signer.Sign (message, headers, DkimCanonicalizationAlgorithm.Simple, bodyAlgorithm); + signer.Sign (message, headers); var dkim = message.Headers[0]; @@ -450,9 +452,9 @@ static void TestDkimSignVerify (MimeMessage message, DkimSignatureAlgorithm sign { var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); - var signer = CreateSigner (signatureAlgorithm); + var signer = CreateSigner (signatureAlgorithm, headerAlgorithm, bodyAlgorithm); - signer.Sign (message, headers, headerAlgorithm, bodyAlgorithm); + signer.Sign (message, headers); var dkim = message.Headers[0]; From 0b95c3e0a76e80d71d7e83c7b28679193200c93c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 07:34:16 -0400 Subject: [PATCH 287/741] Added custom header folding logic for ARC headers --- MimeKit/Header.cs | 123 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index a32ec07ebf..a2bf0f1d68 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -666,6 +666,120 @@ static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, return charset.GetBytes (encoded.ToString ()); } + static void EncodeLongValue (FormatOptions format, StringBuilder encoded, ref int lineLength, string value) + { + int startIndex = 0; + + while (startIndex < value.Length) { + int lineLeft = format.MaxLineLength - lineLength; + int maxIndex = startIndex + lineLeft; + int index; + + if (maxIndex >= value.Length) { + index = value.Length; + } else { + index = maxIndex; + + while (index > startIndex && IsWhiteSpace (value[index - 1])) + index--; + + if (index == startIndex) + index = maxIndex; + } + + encoded.Append (value, startIndex, index - startIndex); + + while (index < value.Length && IsWhiteSpace (value[index])) + index++; + + if (index == value.Length) + break; + + encoded.Append (format.NewLine); + encoded.Append ('\t'); + lineLength = 1; + + startIndex = index; + } + } + + static byte[] EncodeAuthenticationResultsHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + { + var encoded = new StringBuilder (); + int lineLength = field.Length + 1; + var token = new StringBuilder (); + int index = 0; + + while (index < value.Length) { + // skip leading whitespace + while (index < value.Length && IsWhiteSpace (value[index])) + index++; + + // consume the tag name and/or domain + int wsp = 0; + while (index < value.Length && value[index] != '=' && value[index] != ';') { + if (!IsWhiteSpace (value[index])) + wsp = 0; + else + wsp++; + + token.Append (value[index]); + index++; + } + + // trim trailing whitespace from the tag name / domain + token.Length -= wsp; + + if (index < value.Length && value[index] == '=') { + // skip leading whitespace in the tag value + while (index < value.Length && IsWhiteSpace (value[index])) + index++; + + // consume the tag value + wsp = 0; + while (index < value.Length && value[index] != ';') { + if (IsWhiteSpace (value[index])) + wsp++; + else + wsp = 0; + + token.Append (value[index]); + index++; + } + + // trim the trailing whitespace + token.Length -= wsp; + } + + if (index < value.Length && value[index] == ';') { + token.Append (';'); + index++; + } + + if (lineLength + token.Length + 1 > format.MaxLineLength) { + encoded.Append (format.NewLine); + encoded.Append ('\t'); + lineLength = 1; + } else { + encoded.Append (' '); + lineLength++; + } + + if (token.Length > format.MaxLineLength) { + EncodeLongValue (format, encoded, ref lineLength, token.ToString ()); + } else { + encoded.Append (token.ToString ()); + lineLength += token.Length; + } + + token.Length = 0; + } + + encoded.Append (format.NewLine); + + return charset.GetBytes (encoded.ToString ()); + } + static void EncodeDkimLongValue (FormatOptions format, StringBuilder encoded, ref int lineLength, string value) { int startIndex = 0; @@ -716,7 +830,7 @@ static void EncodeDkimHeaderList (FormatOptions format, StringBuilder encoded, r } } - static byte[] EncodeDkimSignatureHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeDkimOrArcSignatureHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) { var encoded = new StringBuilder (); int lineLength = field.Length + 1; @@ -995,8 +1109,13 @@ byte[] FormatRawValue (FormatOptions format, Encoding encoding) return EncodeContentDisposition (Options, format, encoding, Field, textValue); case HeaderId.ContentType: return EncodeContentType (Options, format, encoding, Field, textValue); + case HeaderId.ArcAuthenticationResults: + case HeaderId.AuthenticationResults: + return EncodeAuthenticationResultsHeader (Options, format, encoding, Field, textValue); + case HeaderId.ArcMessageSignature: + case HeaderId.ArcSeal: case HeaderId.DkimSignature: - return EncodeDkimSignatureHeader (Options, format, encoding, Field, textValue); + return EncodeDkimOrArcSignatureHeader (Options, format, encoding, Field, textValue); default: return EncodeUnstructuredHeader (Options, format, encoding, Field, textValue); } From e9948755f32bff175e8672d7b6b5dc310dd29a2d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 09:24:51 -0400 Subject: [PATCH 288/741] Updated DKIM verifier in accordance with rfc8301 security recommendations --- MimeKit/Cryptography/DkimSigner.cs | 31 ++- MimeKit/Cryptography/DkimVerifier.cs | 77 +++++++- RFCs.md | 1 + UnitTests/Cryptography/DkimTests.cs | 63 ++++++ rfc/rfc8301.txt | 283 +++++++++++++++++++++++++++ 5 files changed, 449 insertions(+), 6 deletions(-) create mode 100644 rfc/rfc8301.txt diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 47fdcce339..befee2407e 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -58,7 +58,11 @@ public class DkimSigner /// Initializes a new instance of the class. /// /// - /// Creates a new . + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. /// /// The domain that the signer represents. /// The selector subdividing the domain. @@ -85,7 +89,11 @@ protected DkimSigner (string domain, string selector, DkimSignatureAlgorithm alg /// Initializes a new instance of the class. /// /// - /// Creates a new . + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. /// /// The signer's private key. /// The domain that the signer represents. @@ -153,7 +161,11 @@ static AsymmetricKeyParameter LoadPrivateKey (Stream stream) /// Initializes a new instance of the class. /// /// - /// Creates a new . + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. /// /// The file containing the private key. /// The domain that the signer represents. @@ -213,7 +225,11 @@ public DkimSigner (string fileName, string domain, string selector, DkimSignatur /// Initializes a new instance of the class. /// /// - /// Creates a new . + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. /// /// The stream containing the private key. /// The domain that the signer represents. @@ -297,7 +313,12 @@ public string AgentOrUserIdentifier { /// Get or set the algorithm to use for signing. /// /// - /// Gets or sets the algorithm to use for signing. + /// Gets or sets the algorithm to use for signing. + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. /// /// The signature algorithm. public DkimSignatureAlgorithm SignatureAlgorithm { diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index 8081b902e3..bcbecbc272 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -59,6 +59,7 @@ namespace MimeKit.Cryptography { public class DkimVerifier { readonly IDkimPublicKeyLocator publicKeyLocator; + int enabledSignatureAlgorithms; /// /// Initializes a new instance of the class. @@ -79,6 +80,77 @@ public DkimVerifier (IDkimPublicKeyLocator publicKeyLocator) throw new ArgumentNullException (nameof (publicKeyLocator)); this.publicKeyLocator = publicKeyLocator; + + Enable (DkimSignatureAlgorithm.RsaSha256); + //Enable (DkimSignatureAlgorithm.RsaSha1); + MinimumRsaKeyLength = 1024; + } + + /// + /// Get or set the minimum allowed RSA key length. + /// + /// + /// Gets the minimum allowed RSA key length. + /// The DKIM specifications specify a single signing algorithm, RSA, + /// and recommend key sizes of 1024 to 2048 bits (but require verification of 512-bit keys). + /// As discussed in US-CERT Vulnerability Note VU#268267, the operational community has + /// recognized that shorter keys compromise the effectiveness of DKIM. While 1024-bit + /// signatures are common, stronger signatures are not. Widely used DNS configuration + /// software places a practical limit on key sizes, because the software only handles a + /// single 256-octet string in a TXT record, and RSA keys significantly longer than 1024 + /// bits don't fit in 256 octets. + /// + public int MinimumRsaKeyLength { + get; set; + } + + /// + /// Enable a DKIM signature algorithm. + /// + /// + /// Enables the specified DKIM signature algorithm. + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be enabled. + /// + /// The DKIM signature algorithm. + public void Enable (DkimSignatureAlgorithm algorithm) + { + enabledSignatureAlgorithms |= 1 << (int) algorithm; + } + + /// + /// Disable a DKIM signature algorithm. + /// + /// + /// Disables the specified DKIM signature algorithm. + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be enabled. + /// + /// The DKIM signature algorithm. + public void Disable (DkimSignatureAlgorithm algorithm) + { + enabledSignatureAlgorithms &= ~(1 << (int) algorithm); + } + + /// + /// Check whether a DKIM signature algorithm is enabled. + /// + /// + /// Determines whether the specified DKIM signature algorithm is enabled. + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be enabled. + /// + /// true if the specified DKIM signature algorithm is enabled; otherwise, false. + /// The DKIM signature algorithm. + public bool IsEnabled (DkimSignatureAlgorithm algorithm) + { + return (enabledSignatureAlgorithms & (1 << (int) algorithm)) != 0; } static bool IsWhiteSpace (char c) @@ -470,12 +542,15 @@ async Task VerifyAsync (FormatOptions options, MimeMessage message, Header ValidateDkimSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); + if (!IsEnabled (signatureAlgorithm)) + return false; + if (doAsync) key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); else key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < MinimumRsaKeyLength) return false; options = options.Clone (); diff --git a/RFCs.md b/RFCs.md index ac54e398e5..840c57323c 100644 --- a/RFCs.md +++ b/RFCs.md @@ -51,6 +51,7 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [6376](http://www.ietf.org/rfc/rfc6376.txt): DomainKeys Identified Mail (DKIM) Signatures (Obsoletes rfc4871) * [6522](http://www.ietf.org/rfc/rfc6522.txt): The Multipart/Report Media Type for the Reporting of Mail System Administrative Messages (Obsoletes rfc3462) * [6532](http://www.ietf.org/rfc/rfc6532.txt): Internationalized Email Headers +* [8301](http://www.ietf.org/rfc/rfc8301.txt): Cryptographic Algorithm and Key Usage Update to DomainKeys Identified Mail (DKIM) #### Other RFCs of interest: diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 3f70019638..1825ec23aa 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -112,6 +112,48 @@ public void TestDkimSignerCtors () }); } + [Test] + public void TestDkimSignerDefaults () + { + var path = Path.Combine ("..", "..", "TestData", "dkim", "example.pem"); + DkimSigner signer; + + signer = new DkimSigner (DkimKeys.Private, "example.com", "1433868189.example"); + Assert.AreEqual (DkimSignatureAlgorithm.RsaSha256, signer.SignatureAlgorithm, "SignatureAlgorithm #1"); + + signer = new DkimSigner (path, "example.com", "1433868189.example"); + Assert.AreEqual (DkimSignatureAlgorithm.RsaSha256, signer.SignatureAlgorithm, "SignatureAlgorithm #2"); + + using (var stream = File.OpenRead (path)) { + signer = new DkimSigner (stream, "example.com", "1433868189.example"); + Assert.AreEqual (DkimSignatureAlgorithm.RsaSha256, signer.SignatureAlgorithm, "SignatureAlgorithm #3"); + } + } + + [Test] + public void TestDkimVerifierDefaults () + { + var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); + + Assert.AreEqual (1024, verifier.MinimumRsaKeyLength, "MinimumRsaKeyLength"); + Assert.IsFalse (verifier.IsEnabled (DkimSignatureAlgorithm.RsaSha1), "rsa-sha1"); + Assert.IsTrue (verifier.IsEnabled (DkimSignatureAlgorithm.RsaSha256), "rsa-sha256"); + } + + [Test] + public void TestDkimVerifierEnableDisable () + { + var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); + + Assert.IsFalse (verifier.IsEnabled (DkimSignatureAlgorithm.RsaSha1), "initial value"); + + verifier.Enable (DkimSignatureAlgorithm.RsaSha1); + Assert.IsTrue (verifier.IsEnabled (DkimSignatureAlgorithm.RsaSha1), "rsa-sha1 enabled"); + + verifier.Disable (DkimSignatureAlgorithm.RsaSha1); + Assert.IsFalse (verifier.IsEnabled (DkimSignatureAlgorithm.RsaSha1), "rsa-sha1 disabled"); + } + [Test] public void TestDkimHashStream () { @@ -211,6 +253,13 @@ static void TestEmptyBody (DkimSignatureAlgorithm signatureAlgorithm, DkimCanoni var dkim = message.Headers[0]; + if (signatureAlgorithm == DkimSignatureAlgorithm.RsaSha1) { + Assert.IsFalse (verifier.Verify (message, dkim), "DKIM-Signature using rsa-sha1 should not verify."); + + // now enable rsa-sha1 to verify again, this time it should pass... + verifier.Enable (DkimSignatureAlgorithm.RsaSha1); + } + Assert.IsTrue (verifier.Verify (message, dkim), "Failed to verify DKIM-Signature."); } @@ -355,6 +404,13 @@ static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonica VerifyDkimBodyHash (message, signatureAlgorithm, expectedHash); + if (signatureAlgorithm == DkimSignatureAlgorithm.RsaSha1) { + Assert.IsFalse (verifier.Verify (message, dkim), "DKIM-Signature using rsa-sha1 should not verify."); + + // now enable rsa-sha1 to verify again, this time it should pass... + verifier.Enable (DkimSignatureAlgorithm.RsaSha1); + } + Assert.IsTrue (verifier.Verify (message, dkim), "Failed to verify DKIM-Signature."); } @@ -458,6 +514,13 @@ static void TestDkimSignVerify (MimeMessage message, DkimSignatureAlgorithm sign var dkim = message.Headers[0]; + if (signatureAlgorithm == DkimSignatureAlgorithm.RsaSha1) { + Assert.IsFalse (verifier.Verify (message, dkim), "DKIM-Signature using rsa-sha1 should not verify."); + + // now enable rsa-sha1 to verify again, this time it should pass... + verifier.Enable (DkimSignatureAlgorithm.RsaSha1); + } + Assert.IsTrue (verifier.Verify (message, dkim), "Failed to verify DKIM-Signature."); message.Headers.RemoveAt (0); diff --git a/rfc/rfc8301.txt b/rfc/rfc8301.txt new file mode 100644 index 0000000000..4112df8ccb --- /dev/null +++ b/rfc/rfc8301.txt @@ -0,0 +1,283 @@ + + + + + + +Internet Engineering Task Force (IETF) S. Kitterman +Request for Comments: 8301 Kitterman Technical Services +Updates: 6376 January 2018 +Category: Standards Track +ISSN: 2070-1721 + + + Cryptographic Algorithm and Key Usage Update to + DomainKeys Identified Mail (DKIM) + +Abstract + + The cryptographic algorithm and key size requirements included when + DomainKeys Identified Mail (DKIM) was designed a decade ago are + functionally obsolete and in need of immediate revision. This + document updates DKIM requirements to those minimally suitable for + operation with currently specified algorithms. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8301. + +Copyright Notice + + Copyright (c) 2018 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + + + +Kitterman Standards Track [Page 1] + +RFC 8301 DKIM Crypto Usage Update January 2018 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 + 2. Conventions Used in This Document . . . . . . . . . . . . . . 2 + 3. Updates to DKIM Signing and Verification Requirements . . . . 3 + 3.1. Signing and Verification Algorithms . . . . . . . . . . . 3 + 3.2. Key Sizes . . . . . . . . . . . . . . . . . . . . . . . . 3 + 4. Security Considerations . . . . . . . . . . . . . . . . . . . 3 + 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 4 + 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 6.1. Normative References . . . . . . . . . . . . . . . . . . 4 + 6.2. Informative References . . . . . . . . . . . . . . . . . 4 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 5 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 5 + +1. Introduction + + DKIM [RFC6376] signs email messages by creating hashes of the message + headers and content and signing the header hash with a digital + signature. Message recipients fetch the signature verification key + from the DNS where it is stored in a TXT record. + + The defining documents, RFC 6376 [RFC6376] and its predecessors, + specify a single signing algorithm, RSA [RFC8017], and recommend key + sizes of 1024 to 2048 bits (but require verification of 512-bit + keys). As discussed in US-CERT Vulnerability Note VU#268267 + [VULNOTE], the operational community has recognized that shorter keys + compromise the effectiveness of DKIM. While 1024-bit signatures are + common, stronger signatures are not. Widely used DNS configuration + software places a practical limit on key sizes, because the software + only handles a single 256-octet string in a TXT record, and RSA keys + significantly longer than 1024 bits don't fit in 256 octets. + + Due to the recognized weakness of the SHA-1 hash algorithm (see + [RFC6194]) and the wide availability of the SHA-256 hash algorithm + (it has been a required part of DKIM [RFC6376] since it was + originally standardized in 2007), the SHA-1 hash algorithm MUST NOT + be used. This is being done now to allow the operational community + time to fully shift to SHA-256 in advance of any SHA-1-related + crisis. + +2. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + + +Kitterman Standards Track [Page 2] + +RFC 8301 DKIM Crypto Usage Update January 2018 + + +3. Updates to DKIM Signing and Verification Requirements + + This document updates [RFC6376] as follows: + + o Section 3.1 of this document updates Section 3.3 of [RFC6376]. + + o Section 3.2 of this document updates Section 3.3.3 of [RFC6376]. + + o The algorithm described in Section 3.3.1 of [RFC6376] is now + historic and no longer used by DKIM. + + Sections 3.3.2 and 3.3.4 of [RFC6376] are not affected. + +3.1. Signing and Verification Algorithms + + DKIM supports multiple digital signature algorithms. Two algorithms + are defined by this specification at this time: rsa-sha1 and + rsa-sha256. Signers MUST sign using rsa-sha256. Verifiers MUST be + able to verify using rsa-sha256. rsa-sha1 MUST NOT be used for + signing or verifying. + + DKIM signatures identified as having been signed with historic + algorithms (currently, rsa-sha1) have permanently failed evaluation + as discussed in Section 3.9 of [RFC6376]. + +3.2. Key Sizes + + Selecting appropriate key sizes is a trade-off between cost, + performance, and risk. Since short RSA keys more easily succumb to + off-line attacks, Signers MUST use RSA keys of at least 1024 bits for + all keys. Signers SHOULD use RSA keys of at least 2048 bits. + Verifiers MUST be able to validate signatures with keys ranging from + 1024 bits to 4096 bits, and they MAY be able to validate signatures + with larger keys. Verifier policies can use the length of the + signing key as one metric for determining whether a signature is + acceptable. Verifiers MUST NOT consider signatures using RSA keys of + less than 1024 bits as valid signatures. + + DKIM signatures with insufficient key sizes (currently, rsa-sha256 + with less than 1024 bits) have permanently failed evaluation as + discussed in Section 3.9 of [RFC6376]. + +4. Security Considerations + + This document does not change the Security Considerations of + [RFC6376]. It reduces the risk of signature compromise due to weak + cryptography. The SHA-1 risks discussed in Section 3 of [RFC6194] + are resolved due to rsa-sha1 no longer being used by DKIM. + + + +Kitterman Standards Track [Page 3] + +RFC 8301 DKIM Crypto Usage Update January 2018 + + +5. IANA Considerations + + IANA has updated the Reference and Status fields of the "sha1" + registration in the "DKIM Hash Algorithms" registry. The + registration now appears as follows: + + +------+---------------------+----------+ + | Type | Reference | Status | + +------+---------------------+----------+ + | sha1 | [RFC6376] [RFC8301] | historic | + +------+---------------------+----------+ + +6. References + +6.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., + "DomainKeys Identified Mail (DKIM) Signatures", STD 76, + RFC 6376, DOI 10.17487/RFC6376, September 2011, + . + + [RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch, + "PKCS #1: RSA Cryptography Specifications Version 2.2", + RFC 8017, DOI 10.17487/RFC8017, November 2016, + . + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, . + +6.2. Informative References + + [RFC6194] Polk, T., Chen, L., Turner, S., and P. Hoffman, "Security + Considerations for the SHA-0 and SHA-1 Message-Digest + Algorithms", RFC 6194, DOI 10.17487/RFC6194, March 2011, + . + + [VULNOTE] US-CERT, "Vulnerability Note VU#268267: DomainKeys + Identified Mail (DKIM) Verifiers may inappropriately + convey message trust", October 2012, + . + + + + + +Kitterman Standards Track [Page 4] + +RFC 8301 DKIM Crypto Usage Update January 2018 + + +Acknowledgements + + The author wishes to acknowledge the following individuals for their + review and comments on this proposal: Kurt Andersen, Murray + S. Kucherawy, Martin Thomson, John Levine, Russ Housley, and Jim + Fenton. + + Thanks to John Levine for his DKIM Crypto Update (DCRUP) work that + was the source for much of the introductory material in this + document. + +Author's Address + + Scott Kitterman + Kitterman Technical Services + 3611 Scheel Dr + Ellicott City, MD 21042 + United States of America + + Phone: +1 301 325-5475 + Email: scott@kitterman.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kitterman Standards Track [Page 5] + From 59c392c7d509e9fd01faeb684b00f88d9f2bdd99 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 09:58:02 -0400 Subject: [PATCH 289/741] Modified DkimVerifier and ASrcVerifier to subclass a new DkimVerifierBase --- MimeKit/Cryptography/ArcVerifier.cs | 58 +-- MimeKit/Cryptography/DkimVerifier.cs | 421 +----------------- MimeKit/Cryptography/DkimVerifierBase.cs | 487 +++++++++++++++++++++ MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + UnitTests/Cryptography/ArcVerifierTests.cs | 2 - 13 files changed, 529 insertions(+), 448 deletions(-) create mode 100644 MimeKit/Cryptography/DkimVerifierBase.cs diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 636d16c10e..588788e23d 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -70,10 +70,8 @@ public enum ArcValidationResult /// /// Validates Authenticated Received Chains. /// - public class ArcVerifier + public class ArcVerifier : DkimVerifierBase { - readonly IDkimPublicKeyLocator publicKeyLocator; - /// /// Initializes a new instance of the class. /// @@ -84,12 +82,8 @@ public class ArcVerifier /// /// is null. /// - public ArcVerifier (IDkimPublicKeyLocator publicKeyLocator) + public ArcVerifier (IDkimPublicKeyLocator publicKeyLocator) : base (publicKeyLocator) { - if (publicKeyLocator == null) - throw new ArgumentNullException (nameof (publicKeyLocator)); - - this.publicKeyLocator = publicKeyLocator; } class ArcHeaderSet @@ -138,12 +132,12 @@ public bool Add (Header header, Dictionary parameters) static void ValidateArcMessageSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) { - DkimVerifier.ValidateCommonSignatureParameters ("ARC-Message-Signature", parameters, out algorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); + ValidateCommonSignatureParameters ("ARC-Message-Signature", parameters, out algorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); } static void ValidateArcSealParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out string d, out string s, out string q, out string b) { - DkimVerifier.ValidateCommonParameters ("ARC-Seal", parameters, out algorithm, out d, out s, out q, out b); + ValidateCommonParameters ("ARC-Seal", parameters, out algorithm, out d, out s, out q, out b); if (parameters.TryGetValue ("h", out string h)) throw new FormatException (string.Format ("Malformed ARC-Seal header: the 'h' parameter tag is not allowed.")); @@ -161,12 +155,15 @@ async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMess ValidateArcMessageSignatureParameters (parameters, out signatureAlgorithm, out headerAlgorithm, out bodyAlgorithm, out d, out s, out q, out headers, out bh, out b, out maxLength); + if (!IsEnabled (signatureAlgorithm)) + return false; + if (doAsync) - key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); else - key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < MinimumRsaKeyLength) return false; options = options.Clone (); @@ -178,22 +175,22 @@ async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMess if (hash != bh) return false; - using (var stream = new DkimSignatureStream (DkimVerifier.GetDigestSigner (signatureAlgorithm, key))) { + using (var stream = new DkimSignatureStream (GetDigestSigner (signatureAlgorithm, key))) { using (var filtered = new FilteredStream (stream)) { filtered.Add (options.CreateNewLineFilter ()); - DkimVerifier.WriteHeaders (options, message, headers, headerAlgorithm, filtered); + WriteHeaders (options, message, headers, headerAlgorithm, filtered); // now include the ARC-Message-Signature header that we are verifying, // but only after removing the "b=" signature value. - var header = DkimVerifier.GetSignedSignatureHeader (arcSignature); + var header = GetSignedSignatureHeader (arcSignature); switch (headerAlgorithm) { case DkimCanonicalizationAlgorithm.Relaxed: - DkimVerifier.WriteHeaderRelaxed (options, filtered, header, true); + WriteHeaderRelaxed (options, filtered, header, true); break; default: - DkimVerifier.WriteHeaderSimple (options, filtered, header, true); + WriteHeaderSimple (options, filtered, header, true); break; } @@ -212,10 +209,13 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, ValidateArcSealParameters (sets[i].ArcSealParameters, out algorithm, out d, out s, out q, out b); + if (!IsEnabled (algorithm)) + return false; + if (doAsync) - key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); else - key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) return false; @@ -223,24 +223,24 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; - using (var stream = new DkimSignatureStream (DkimVerifier.GetDigestSigner (algorithm, key))) { + using (var stream = new DkimSignatureStream (GetDigestSigner (algorithm, key))) { using (var filtered = new FilteredStream (stream)) { filtered.Add (options.CreateNewLineFilter ()); for (int j = 0; j < i; j++) { - DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[j].ArcAuthenticationResult, false); - DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[j].ArcMessageSignature, false); - DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[j].ArcSeal, false); + WriteHeaderRelaxed (options, filtered, sets[j].ArcAuthenticationResult, false); + WriteHeaderRelaxed (options, filtered, sets[j].ArcMessageSignature, false); + WriteHeaderRelaxed (options, filtered, sets[j].ArcSeal, false); } - DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[i].ArcAuthenticationResult, false); - DkimVerifier.WriteHeaderRelaxed (options, filtered, sets[i].ArcMessageSignature, false); + WriteHeaderRelaxed (options, filtered, sets[i].ArcAuthenticationResult, false); + WriteHeaderRelaxed (options, filtered, sets[i].ArcMessageSignature, false); // now include the ARC-Seal header that we are verifying, // but only after removing the "b=" signature value. - var seal = DkimVerifier.GetSignedSignatureHeader (sets[i].ArcSeal); + var seal = GetSignedSignatureHeader (sets[i].ArcSeal); - DkimVerifier.WriteHeaderRelaxed (options, filtered, seal, true); + WriteHeaderRelaxed (options, filtered, seal, true); filtered.Flush (); } @@ -272,7 +272,7 @@ async Task VerifyAsync (FormatOptions options, MimeMessage case HeaderId.ArcMessageSignature: case HeaderId.ArcSeal: try { - parameters = DkimVerifier.ParseParameterTags (header.Id, header.Value); + parameters = ParseParameterTags (header.Id, header.Value); } catch { return ArcValidationResult.Fail; } diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index bcbecbc272..de98ca3fb1 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -25,10 +25,7 @@ // using System; -using System.IO; -using System.Text; using System.Threading; -using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; @@ -36,15 +33,10 @@ using Encoding = Portable.Text.Encoding; #endif -using Org.BouncyCastle.Asn1; -using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Security; using Org.BouncyCastle.Crypto.Parameters; -using MimeKit; using MimeKit.IO; -using MimeKit.Utils; namespace MimeKit.Cryptography { /// @@ -56,11 +48,8 @@ namespace MimeKit.Cryptography { /// /// /// - public class DkimVerifier + public class DkimVerifier : DkimVerifierBase { - readonly IDkimPublicKeyLocator publicKeyLocator; - int enabledSignatureAlgorithms; - /// /// Initializes a new instance of the class. /// @@ -74,227 +63,8 @@ public class DkimVerifier /// /// is null. /// - public DkimVerifier (IDkimPublicKeyLocator publicKeyLocator) + public DkimVerifier (IDkimPublicKeyLocator publicKeyLocator) : base (publicKeyLocator) { - if (publicKeyLocator == null) - throw new ArgumentNullException (nameof (publicKeyLocator)); - - this.publicKeyLocator = publicKeyLocator; - - Enable (DkimSignatureAlgorithm.RsaSha256); - //Enable (DkimSignatureAlgorithm.RsaSha1); - MinimumRsaKeyLength = 1024; - } - - /// - /// Get or set the minimum allowed RSA key length. - /// - /// - /// Gets the minimum allowed RSA key length. - /// The DKIM specifications specify a single signing algorithm, RSA, - /// and recommend key sizes of 1024 to 2048 bits (but require verification of 512-bit keys). - /// As discussed in US-CERT Vulnerability Note VU#268267, the operational community has - /// recognized that shorter keys compromise the effectiveness of DKIM. While 1024-bit - /// signatures are common, stronger signatures are not. Widely used DNS configuration - /// software places a practical limit on key sizes, because the software only handles a - /// single 256-octet string in a TXT record, and RSA keys significantly longer than 1024 - /// bits don't fit in 256 octets. - /// - public int MinimumRsaKeyLength { - get; set; - } - - /// - /// Enable a DKIM signature algorithm. - /// - /// - /// Enables the specified DKIM signature algorithm. - /// Due to the recognized weakness of the SHA-1 hash algorithm - /// and the wide availability of the SHA-256 hash algorithm (it has been a required - /// part of DKIM since it was originally standardized in 2007), it is recommended - /// that NOT be enabled. - /// - /// The DKIM signature algorithm. - public void Enable (DkimSignatureAlgorithm algorithm) - { - enabledSignatureAlgorithms |= 1 << (int) algorithm; - } - - /// - /// Disable a DKIM signature algorithm. - /// - /// - /// Disables the specified DKIM signature algorithm. - /// Due to the recognized weakness of the SHA-1 hash algorithm - /// and the wide availability of the SHA-256 hash algorithm (it has been a required - /// part of DKIM since it was originally standardized in 2007), it is recommended - /// that NOT be enabled. - /// - /// The DKIM signature algorithm. - public void Disable (DkimSignatureAlgorithm algorithm) - { - enabledSignatureAlgorithms &= ~(1 << (int) algorithm); - } - - /// - /// Check whether a DKIM signature algorithm is enabled. - /// - /// - /// Determines whether the specified DKIM signature algorithm is enabled. - /// Due to the recognized weakness of the SHA-1 hash algorithm - /// and the wide availability of the SHA-256 hash algorithm (it has been a required - /// part of DKIM since it was originally standardized in 2007), it is recommended - /// that NOT be enabled. - /// - /// true if the specified DKIM signature algorithm is enabled; otherwise, false. - /// The DKIM signature algorithm. - public bool IsEnabled (DkimSignatureAlgorithm algorithm) - { - return (enabledSignatureAlgorithms & (1 << (int) algorithm)) != 0; - } - - static bool IsWhiteSpace (char c) - { - return c == ' ' || c == '\t'; - } - - static bool IsAlpha (char c) - { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); - } - - internal static Dictionary ParseParameterTags (HeaderId header, string signature) - { - var parameters = new Dictionary (); - var value = new StringBuilder (); - int index = 0; - - while (index < signature.Length) { - while (index < signature.Length && IsWhiteSpace (signature[index])) - index++; - - if (index >= signature.Length) - break; - - if (signature[index] == ';' || !IsAlpha (signature[index])) - throw new FormatException (string.Format ("Malformed {0} value.", header.ToHeaderName ())); - - int startIndex = index++; - - while (index < signature.Length && signature[index] != '=') - index++; - - if (index >= signature.Length) - continue; - - var name = signature.Substring (startIndex, index - startIndex).TrimEnd (); - - // skip over '=' and clear value buffer - value.Length = 0; - index++; - - while (index < signature.Length && signature[index] != ';') { - if (!IsWhiteSpace (signature[index])) - value.Append (signature[index]); - index++; - } - - if (parameters.ContainsKey (name)) - throw new FormatException (string.Format ("Malformed {0} value: duplicate parameter '{1}'.", header.ToHeaderName (), name)); - - parameters.Add (name, value.ToString ()); - - // skip over ';' - index++; - } - - return parameters; - } - - internal static void ValidateCommonParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, - out string d, out string s, out string q, out string b) - { - if (!parameters.TryGetValue ("a", out string a)) - throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header)); - - switch (a.ToLowerInvariant ()) { - case "rsa-sha256": algorithm = DkimSignatureAlgorithm.RsaSha256; break; - case "rsa-sha1": algorithm = DkimSignatureAlgorithm.RsaSha1; break; - default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header, a)); - } - - if (!parameters.TryGetValue ("d", out d)) - throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header)); - - if (d.Length == 0) - throw new FormatException (string.Format ("Malformed {0} header: empty domain parameter detected.", header)); - - if (!parameters.TryGetValue ("s", out s)) - throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header)); - - if (s.Length == 0) - throw new FormatException (string.Format ("Malformed {0} header: empty selector parameter detected.", header)); - - if (!parameters.TryGetValue ("q", out q)) - q = "dns/txt"; - - if (!parameters.TryGetValue ("b", out b)) - throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header)); - - if (b.Length == 0) - throw new FormatException (string.Format ("Malformed {0} header: empty signature parameter detected.", header)); - - if (parameters.TryGetValue ("t", out string t)) { - if (!int.TryParse (t, NumberStyles.Integer, CultureInfo.InvariantCulture, out int timestamp) || timestamp < 0) - throw new FormatException (string.Format ("Malformed {0} header: invalid timestamp parameter: t={1}.", header, t)); - } - } - - internal static void ValidateCommonSignatureParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, - out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) - { - ValidateCommonParameters (header, parameters, out algorithm, out d, out s, out q, out b); - - if (parameters.TryGetValue ("l", out string l)) { - if (!int.TryParse (l, out maxLength)) - throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header, l)); - } else { - maxLength = -1; - } - - if (parameters.TryGetValue ("c", out string c)) { - var tokens = c.ToLowerInvariant ().Split ('/'); - - if (tokens.Length == 0 || tokens.Length > 2) - throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); - - switch (tokens[0]) { - case "relaxed": headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; - case "simple": headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); - } - - if (tokens.Length == 2) { - switch (tokens[1]) { - case "relaxed": bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; - case "simple": bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; - default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); - } - } else { - bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; - } - } else { - headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; - bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; - } - - if (!parameters.TryGetValue ("h", out string h)) - throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header)); - - headers = h.Split (':'); - - if (!parameters.TryGetValue ("bh", out bh)) - throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header)); } static void ValidateDkimSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, @@ -334,189 +104,6 @@ static void ValidateDkimSignatureParameters (IDictionary paramet } } - internal static void WriteHeaderRelaxed (FormatOptions options, Stream stream, Header header, bool isDkimSignature) - { - // o Convert all header field names (not the header field values) to - // lowercase. For example, convert "SUBJect: AbC" to "subject: AbC". - var name = Encoding.ASCII.GetBytes (header.Field.ToLowerInvariant ()); - var rawValue = header.GetRawValue (options); - int index = 0; - - // o Delete any WSP characters remaining before and after the colon - // separating the header field name from the header field value. The - // colon separator MUST be retained. - stream.Write (name, 0, name.Length); - stream.WriteByte ((byte) ':'); - - // trim leading whitespace... - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - while (index < rawValue.Length) { - int startIndex = index; - - // look for the first non-whitespace character - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - // o Delete all WSP characters at the end of each unfolded header field - // value. - if (index >= rawValue.Length) - break; - - // o Convert all sequences of one or more WSP characters to a single SP - // character. WSP characters here include those before and after a - // line folding boundary. - if (index > startIndex) - stream.WriteByte ((byte) ' '); - - startIndex = index; - - while (index < rawValue.Length && !rawValue[index].IsWhitespace ()) - index++; - - if (index > startIndex) - stream.Write (rawValue, startIndex, index - startIndex); - } - - if (!isDkimSignature) - stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); - } - - internal static void WriteHeaderSimple (FormatOptions options, Stream stream, Header header, bool isDkimSignature) - { - var rawValue = header.GetRawValue (options); - int rawLength = rawValue.Length; - - if (isDkimSignature && rawLength > 0) { - if (rawValue[rawLength - 1] == (byte) '\n') { - rawLength--; - - if (rawLength > 0 && rawValue[rawLength - 1] == (byte) '\r') - rawLength--; - } - } - - stream.Write (header.RawField, 0, header.RawField.Length); - stream.Write (Header.Colon, 0, Header.Colon.Length); - stream.Write (rawValue, 0, rawLength); - } - - internal static ISigner GetDigestSigner (DkimSignatureAlgorithm algorithm, AsymmetricKeyParameter key) - { -#if ENABLE_NATIVE_DKIM - return new SystemSecuritySigner (algorithm, key.AsAsymmetricAlgorithm ()); -#else - DerObjectIdentifier id; - - if (algorithm == DkimSignatureAlgorithm.RsaSha256) - id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; - else - id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; - - var signer = SignerUtilities.GetSigner (id); - - signer.Init (key.IsPrivate, key); - - return signer; -#endif - } - - internal static void WriteHeaders (FormatOptions options, MimeMessage message, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, Stream stream) - { - var counts = new Dictionary (StringComparer.Ordinal); - - for (int i = 0; i < fields.Count; i++) { - var headers = fields[i].StartsWith ("Content-", StringComparison.OrdinalIgnoreCase) ? message.Body.Headers : message.Headers; - var name = fields[i].ToLowerInvariant (); - int index, count, n = 0; - - if (!counts.TryGetValue (name, out count)) - count = 0; - - // Note: signers choosing to sign an existing header field that occurs more - // than once in the message (such as Received) MUST sign the physically last - // instance of that header field in the header block. Signers wishing to sign - // multiple instances of such a header field MUST include the header field - // name multiple times in the list of header fields and MUST sign such header - // fields in order from the bottom of the header field block to the top. - index = headers.LastIndexOf (name); - - // find the n'th header with this name - while (n < count && --index >= 0) { - if (headers[index].Field.Equals (name, StringComparison.OrdinalIgnoreCase)) - n++; - } - - if (index < 0) - continue; - - var header = headers[index]; - - switch (headerCanonicalizationAlgorithm) { - case DkimCanonicalizationAlgorithm.Relaxed: - WriteHeaderRelaxed (options, stream, header, false); - break; - default: - WriteHeaderSimple (options, stream, header, false); - break; - } - - counts[name] = ++count; - } - } - - internal static Header GetSignedSignatureHeader (Header header) - { - // modify the raw DKIM-Signature header value by chopping off the signature value after the "b=" - var rawValue = (byte[]) header.RawValue.Clone (); - int length = 0, index = 0; - - do { - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - if (index + 2 < rawValue.Length) { - var param = (char) rawValue[index++]; - - while (index < rawValue.Length && rawValue[index].IsWhitespace ()) - index++; - - if (index < rawValue.Length && rawValue[index] == (byte) '=' && param == 'b') { - length = ++index; - - while (index < rawValue.Length && rawValue[index] != (byte) ';') - index++; - - if (index == rawValue.Length && rawValue[index - 1] == (byte) '\n') { - index--; - - if (rawValue[index - 1] == (byte) '\r') - index--; - } - - break; - } - } - - while (index < rawValue.Length && rawValue[index] != (byte) ';') - index++; - - if (index < rawValue.Length) - index++; - } while (index < rawValue.Length); - - if (index == rawValue.Length) - throw new FormatException (string.Format ("Malformed {0} header: missing signature parameter.", header.Id.ToHeaderName ())); - - while (index < rawValue.Length) - rawValue[length++] = rawValue[index++]; - - Array.Resize (ref rawValue, length); - - return new Header (header.Options, header.RawField, rawValue); - } - async Task VerifyAsync (FormatOptions options, MimeMessage message, Header dkimSignature, bool doAsync, CancellationToken cancellationToken) { if (options == null) @@ -546,9 +133,9 @@ async Task VerifyAsync (FormatOptions options, MimeMessage message, Header return false; if (doAsync) - key = await publicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); else - key = publicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); + key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < MinimumRsaKeyLength) return false; diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs new file mode 100644 index 0000000000..f5f1bed3ba --- /dev/null +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -0,0 +1,487 @@ +// +// DkimVerifierBase.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Globalization; +using System.Threading.Tasks; +using System.Collections.Generic; + +#if PORTABLE +using Encoding = Portable.Text.Encoding; +#endif + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto.Parameters; + +using MimeKit; +using MimeKit.IO; +using MimeKit.Utils; + +namespace MimeKit.Cryptography { + /// + /// A base class for DKIM verifiers. + /// + /// + /// The base class for and . + /// + public abstract class DkimVerifierBase + { + int enabledSignatureAlgorithms; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Initializes the . + /// + /// The public key locator. + /// + /// is null. + /// + public DkimVerifierBase (IDkimPublicKeyLocator publicKeyLocator) + { + if (publicKeyLocator == null) + throw new ArgumentNullException (nameof (publicKeyLocator)); + + PublicKeyLocator = publicKeyLocator; + + Enable (DkimSignatureAlgorithm.RsaSha256); + //Enable (DkimSignatureAlgorithm.RsaSha1); + MinimumRsaKeyLength = 1024; + } + + /// + /// Get the public key locator. + /// + /// + /// Gets the public key locator. + /// + /// The public key locator. + protected IDkimPublicKeyLocator PublicKeyLocator { + get; private set; + } + + /// + /// Get or set the minimum allowed RSA key length. + /// + /// + /// Gets the minimum allowed RSA key length. + /// The DKIM specifications specify a single signing algorithm, RSA, + /// and recommend key sizes of 1024 to 2048 bits (but require verification of 512-bit keys). + /// As discussed in US-CERT Vulnerability Note VU#268267, the operational community has + /// recognized that shorter keys compromise the effectiveness of DKIM. While 1024-bit + /// signatures are common, stronger signatures are not. Widely used DNS configuration + /// software places a practical limit on key sizes, because the software only handles a + /// single 256-octet string in a TXT record, and RSA keys significantly longer than 1024 + /// bits don't fit in 256 octets. + /// + public int MinimumRsaKeyLength { + get; set; + } + + /// + /// Enable a DKIM signature algorithm. + /// + /// + /// Enables the specified DKIM signature algorithm. + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be enabled. + /// + /// The DKIM signature algorithm. + public void Enable (DkimSignatureAlgorithm algorithm) + { + enabledSignatureAlgorithms |= 1 << (int) algorithm; + } + + /// + /// Disable a DKIM signature algorithm. + /// + /// + /// Disables the specified DKIM signature algorithm. + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be enabled. + /// + /// The DKIM signature algorithm. + public void Disable (DkimSignatureAlgorithm algorithm) + { + enabledSignatureAlgorithms &= ~(1 << (int) algorithm); + } + + /// + /// Check whether a DKIM signature algorithm is enabled. + /// + /// + /// Determines whether the specified DKIM signature algorithm is enabled. + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be enabled. + /// + /// true if the specified DKIM signature algorithm is enabled; otherwise, false. + /// The DKIM signature algorithm. + public bool IsEnabled (DkimSignatureAlgorithm algorithm) + { + return (enabledSignatureAlgorithms & (1 << (int) algorithm)) != 0; + } + + static bool IsWhiteSpace (char c) + { + return c == ' ' || c == '\t'; + } + + static bool IsAlpha (char c) + { + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); + } + + internal static Dictionary ParseParameterTags (HeaderId header, string signature) + { + var parameters = new Dictionary (); + var value = new StringBuilder (); + int index = 0; + + while (index < signature.Length) { + while (index < signature.Length && IsWhiteSpace (signature[index])) + index++; + + if (index >= signature.Length) + break; + + if (signature[index] == ';' || !IsAlpha (signature[index])) + throw new FormatException (string.Format ("Malformed {0} value.", header.ToHeaderName ())); + + int startIndex = index++; + + while (index < signature.Length && signature[index] != '=') + index++; + + if (index >= signature.Length) + continue; + + var name = signature.Substring (startIndex, index - startIndex).TrimEnd (); + + // skip over '=' and clear value buffer + value.Length = 0; + index++; + + while (index < signature.Length && signature[index] != ';') { + if (!IsWhiteSpace (signature[index])) + value.Append (signature[index]); + index++; + } + + if (parameters.ContainsKey (name)) + throw new FormatException (string.Format ("Malformed {0} value: duplicate parameter '{1}'.", header.ToHeaderName (), name)); + + parameters.Add (name, value.ToString ()); + + // skip over ';' + index++; + } + + return parameters; + } + + internal static void ValidateCommonParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, + out string d, out string s, out string q, out string b) + { + if (!parameters.TryGetValue ("a", out string a)) + throw new FormatException (string.Format ("Malformed {0} header: no signature algorithm parameter detected.", header)); + + switch (a.ToLowerInvariant ()) { + case "rsa-sha256": algorithm = DkimSignatureAlgorithm.RsaSha256; break; + case "rsa-sha1": algorithm = DkimSignatureAlgorithm.RsaSha1; break; + default: throw new FormatException (string.Format ("Unrecognized {0} algorithm parameter: a={1}", header, a)); + } + + if (!parameters.TryGetValue ("d", out d)) + throw new FormatException (string.Format ("Malformed {0} header: no domain parameter detected.", header)); + + if (d.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty domain parameter detected.", header)); + + if (!parameters.TryGetValue ("s", out s)) + throw new FormatException (string.Format ("Malformed {0} header: no selector parameter detected.", header)); + + if (s.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty selector parameter detected.", header)); + + if (!parameters.TryGetValue ("q", out q)) + q = "dns/txt"; + + if (!parameters.TryGetValue ("b", out b)) + throw new FormatException (string.Format ("Malformed {0} header: no signature parameter detected.", header)); + + if (b.Length == 0) + throw new FormatException (string.Format ("Malformed {0} header: empty signature parameter detected.", header)); + + if (parameters.TryGetValue ("t", out string t)) { + if (!int.TryParse (t, NumberStyles.Integer, CultureInfo.InvariantCulture, out int timestamp) || timestamp < 0) + throw new FormatException (string.Format ("Malformed {0} header: invalid timestamp parameter: t={1}.", header, t)); + } + } + + internal static void ValidateCommonSignatureParameters (string header, IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, + out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) + { + ValidateCommonParameters (header, parameters, out algorithm, out d, out s, out q, out b); + + if (parameters.TryGetValue ("l", out string l)) { + if (!int.TryParse (l, out maxLength)) + throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header, l)); + } else { + maxLength = -1; + } + + if (parameters.TryGetValue ("c", out string c)) { + var tokens = c.ToLowerInvariant ().Split ('/'); + + if (tokens.Length == 0 || tokens.Length > 2) + throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); + + switch (tokens[0]) { + case "relaxed": headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; + case "simple": headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); + } + + if (tokens.Length == 2) { + switch (tokens[1]) { + case "relaxed": bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed; break; + case "simple": bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; break; + default: throw new FormatException (string.Format ("Malformed {0} header: invalid canonicalization parameter: c={1}", header, c)); + } + } else { + bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; + } + } else { + headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; + bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; + } + + if (!parameters.TryGetValue ("h", out string h)) + throw new FormatException (string.Format ("Malformed {0} header: no signed header parameter detected.", header)); + + headers = h.Split (':'); + + if (!parameters.TryGetValue ("bh", out bh)) + throw new FormatException (string.Format ("Malformed {0} header: no body hash parameter detected.", header)); + } + + internal static void WriteHeaderRelaxed (FormatOptions options, Stream stream, Header header, bool isDkimSignature) + { + // o Convert all header field names (not the header field values) to + // lowercase. For example, convert "SUBJect: AbC" to "subject: AbC". + var name = Encoding.ASCII.GetBytes (header.Field.ToLowerInvariant ()); + var rawValue = header.GetRawValue (options); + int index = 0; + + // o Delete any WSP characters remaining before and after the colon + // separating the header field name from the header field value. The + // colon separator MUST be retained. + stream.Write (name, 0, name.Length); + stream.WriteByte ((byte) ':'); + + // trim leading whitespace... + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + while (index < rawValue.Length) { + int startIndex = index; + + // look for the first non-whitespace character + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + // o Delete all WSP characters at the end of each unfolded header field + // value. + if (index >= rawValue.Length) + break; + + // o Convert all sequences of one or more WSP characters to a single SP + // character. WSP characters here include those before and after a + // line folding boundary. + if (index > startIndex) + stream.WriteByte ((byte) ' '); + + startIndex = index; + + while (index < rawValue.Length && !rawValue[index].IsWhitespace ()) + index++; + + if (index > startIndex) + stream.Write (rawValue, startIndex, index - startIndex); + } + + if (!isDkimSignature) + stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); + } + + internal static void WriteHeaderSimple (FormatOptions options, Stream stream, Header header, bool isDkimSignature) + { + var rawValue = header.GetRawValue (options); + int rawLength = rawValue.Length; + + if (isDkimSignature && rawLength > 0) { + if (rawValue[rawLength - 1] == (byte) '\n') { + rawLength--; + + if (rawLength > 0 && rawValue[rawLength - 1] == (byte) '\r') + rawLength--; + } + } + + stream.Write (header.RawField, 0, header.RawField.Length); + stream.Write (Header.Colon, 0, Header.Colon.Length); + stream.Write (rawValue, 0, rawLength); + } + + internal static ISigner GetDigestSigner (DkimSignatureAlgorithm algorithm, AsymmetricKeyParameter key) + { +#if ENABLE_NATIVE_DKIM + return new SystemSecuritySigner (algorithm, key.AsAsymmetricAlgorithm ()); +#else + DerObjectIdentifier id; + + if (algorithm == DkimSignatureAlgorithm.RsaSha256) + id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; + else + id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; + + var signer = SignerUtilities.GetSigner (id); + + signer.Init (key.IsPrivate, key); + + return signer; +#endif + } + + internal static void WriteHeaders (FormatOptions options, MimeMessage message, IList fields, DkimCanonicalizationAlgorithm headerCanonicalizationAlgorithm, Stream stream) + { + var counts = new Dictionary (StringComparer.Ordinal); + + for (int i = 0; i < fields.Count; i++) { + var headers = fields[i].StartsWith ("Content-", StringComparison.OrdinalIgnoreCase) ? message.Body.Headers : message.Headers; + var name = fields[i].ToLowerInvariant (); + int index, count, n = 0; + + if (!counts.TryGetValue (name, out count)) + count = 0; + + // Note: signers choosing to sign an existing header field that occurs more + // than once in the message (such as Received) MUST sign the physically last + // instance of that header field in the header block. Signers wishing to sign + // multiple instances of such a header field MUST include the header field + // name multiple times in the list of header fields and MUST sign such header + // fields in order from the bottom of the header field block to the top. + index = headers.LastIndexOf (name); + + // find the n'th header with this name + while (n < count && --index >= 0) { + if (headers[index].Field.Equals (name, StringComparison.OrdinalIgnoreCase)) + n++; + } + + if (index < 0) + continue; + + var header = headers[index]; + + switch (headerCanonicalizationAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + WriteHeaderRelaxed (options, stream, header, false); + break; + default: + WriteHeaderSimple (options, stream, header, false); + break; + } + + counts[name] = ++count; + } + } + + internal static Header GetSignedSignatureHeader (Header header) + { + // modify the raw DKIM-Signature header value by chopping off the signature value after the "b=" + var rawValue = (byte[]) header.RawValue.Clone (); + int length = 0, index = 0; + + do { + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + if (index + 2 < rawValue.Length) { + var param = (char) rawValue[index++]; + + while (index < rawValue.Length && rawValue[index].IsWhitespace ()) + index++; + + if (index < rawValue.Length && rawValue[index] == (byte) '=' && param == 'b') { + length = ++index; + + while (index < rawValue.Length && rawValue[index] != (byte) ';') + index++; + + if (index == rawValue.Length && rawValue[index - 1] == (byte) '\n') { + index--; + + if (rawValue[index - 1] == (byte) '\r') + index--; + } + + break; + } + } + + while (index < rawValue.Length && rawValue[index] != (byte) ';') + index++; + + if (index < rawValue.Length) + index++; + } while (index < rawValue.Length); + + if (index == rawValue.Length) + throw new FormatException (string.Format ("Malformed {0} header: missing signature parameter.", header.Id.ToHeaderName ())); + + while (index < rawValue.Length) + rawValue[length++] = rawValue[index++]; + + Array.Resize (ref rawValue, length); + + return new Header (header.Options, header.RawField, rawValue); + } + } +} diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 6415c558b5..7f3d1ce100 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -88,6 +88,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 921e75fef2..0b199972b6 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -77,6 +77,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 556ab4195f..28dacaa05d 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -85,6 +85,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index b385508a50..cfd1a02283 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -69,6 +69,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index d231a1ad93..2ae54a4c57 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -74,6 +74,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 5b2661cc35..de55411c4e 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -70,6 +70,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index b1b864f71b..63f8b517ff 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -76,6 +76,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 71e369d5c0..4f57d68f2a 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -80,6 +80,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index a523249e28..3552d56d42 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -85,6 +85,7 @@ + diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index 4d04d7eea6..38112dd428 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -2644,7 +2644,6 @@ This is a test message. } [Test] - [Ignore] // Note: how is a=rsa-sha1 an unknown algorithm?? public void ams_fields_a_sha1 () { const string input = @"MIME-Version: 1.0 @@ -6489,7 +6488,6 @@ This is a test message } [Test] - [Ignore] // Note: how is a=rsa-sha1 an unknown algorithm?? public void as_fields_a_sha1 () { const string input = @"MIME-Version: 1.0 From 0a3368f6e8c80b57468b9df7e007e463aec10cc4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 10:03:41 -0400 Subject: [PATCH 290/741] Removed some unneeded using statements --- MimeKit/Cryptography/ArcVerifier.cs | 4 ---- MimeKit/Cryptography/DkimVerifier.cs | 4 ---- MimeKit/Cryptography/DkimVerifierBase.cs | 5 ----- 3 files changed, 13 deletions(-) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 588788e23d..2a8e59030e 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -30,13 +30,9 @@ using System.Threading.Tasks; using System.Collections.Generic; -using Org.BouncyCastle.Asn1; -using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Security; using Org.BouncyCastle.Crypto.Parameters; -using MimeKit; using MimeKit.IO; namespace MimeKit.Cryptography { diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index de98ca3fb1..724d366a1d 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -29,10 +29,6 @@ using System.Threading.Tasks; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index f5f1bed3ba..2676fb5028 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -27,9 +27,7 @@ using System; using System.IO; using System.Text; -using System.Threading; using System.Globalization; -using System.Threading.Tasks; using System.Collections.Generic; #if PORTABLE @@ -40,10 +38,7 @@ using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; -using Org.BouncyCastle.Crypto.Parameters; -using MimeKit; -using MimeKit.IO; using MimeKit.Utils; namespace MimeKit.Cryptography { From 9c7ef4426650081ee1c3afeef2b49a1896383d53 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 12:54:37 -0400 Subject: [PATCH 291/741] Implemented support for the new Ed25519-SHA256 DKIM-SIgnature algorithm This new signing algorithm is defined in rfc8463 --- MimeKit/Cryptography/ArcVerifier.cs | 4 +- MimeKit/Cryptography/DkimHashStream.cs | 2 + .../Cryptography/DkimSignatureAlgorithm.cs | 7 +- MimeKit/Cryptography/DkimVerifier.cs | 2 +- MimeKit/Cryptography/DkimVerifierBase.cs | 29 +- MimeKit/Cryptography/Ed25519DigestSigner.cs | 113 +++++ MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Mac.project.json | 2 +- MimeKit/MimeKit.Net45.csproj | 3 +- MimeKit/MimeKit.Net45.project.json | 4 +- MimeKit/MimeKit.NetStandard.csproj | 3 +- MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.Portable.project.json | 2 +- MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.TvOS.project.json | 2 +- MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WatchOS.project.json | 2 +- MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + .../MimeKit.WindowsUniversal81.project.json | 2 +- MimeKit/MimeKit.iOS.csproj | 1 + MimeKit/packages.MimeKit.Mac.config | 2 +- MimeKit/packages.MimeKit.Net45.config | 2 +- MimeKit/packages.MimeKit.Portable.config | 2 +- MimeKit/packages.MimeKit.TvOS.config | 2 +- MimeKit/packages.MimeKit.WatchOS.config | 2 +- ...packages.MimeKit.WindowsUniversal81.config | 2 +- UnitTests/Cryptography/ArcVerifierTests.cs | 446 +++++++----------- .../Cryptography/DkimPublicKeyLocator.cs | 133 ++++++ UnitTests/Cryptography/DkimTests.cs | 56 ++- UnitTests/TestData/dkim/rfc8463-example.msg | 26 + UnitTests/UnitTests.csproj | 4 +- UnitTests/packages.config | 4 +- nuget/MimeKit.nuspec | 12 +- rfc/rfc8463.txt | 395 ++++++++++++++++ 35 files changed, 957 insertions(+), 315 deletions(-) create mode 100644 MimeKit/Cryptography/Ed25519DigestSigner.cs create mode 100644 UnitTests/Cryptography/DkimPublicKeyLocator.cs create mode 100644 UnitTests/TestData/dkim/rfc8463-example.msg create mode 100644 rfc/rfc8463.txt diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 2a8e59030e..793c771e34 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -159,7 +159,7 @@ async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMess else key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < MinimumRsaKeyLength) + if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) return false; options = options.Clone (); @@ -213,7 +213,7 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, else key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < 1024) + if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) return false; options = options.Clone (); diff --git a/MimeKit/Cryptography/DkimHashStream.cs b/MimeKit/Cryptography/DkimHashStream.cs index 627c90857f..1ad3a49dcc 100644 --- a/MimeKit/Cryptography/DkimHashStream.cs +++ b/MimeKit/Cryptography/DkimHashStream.cs @@ -64,6 +64,7 @@ public DkimHashStream (DkimSignatureAlgorithm algorithm, int maxLength = -1) { #if ENABLE_NATIVE_DKIM switch (algorithm) { + case DkimSignatureAlgorithm.Ed25519Sha256: case DkimSignatureAlgorithm.RsaSha256: digest = SHA256.Create (); break; @@ -73,6 +74,7 @@ public DkimHashStream (DkimSignatureAlgorithm algorithm, int maxLength = -1) } #else switch (algorithm) { + case DkimSignatureAlgorithm.Ed25519Sha256: case DkimSignatureAlgorithm.RsaSha256: digest = new Sha256Digest (); break; diff --git a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs index 195d16c306..4b30d18d7c 100644 --- a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs +++ b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs @@ -40,6 +40,11 @@ public enum DkimSignatureAlgorithm { /// /// The RSA-SHA256 signature algorithm. /// - RsaSha256 + RsaSha256, + + /// + /// The Ed25519-SHA256 signature algorithm. + /// + Ed25519Sha256 } } diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index 724d366a1d..efebaad455 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -133,7 +133,7 @@ async Task VerifyAsync (FormatOptions options, MimeMessage message, Header else key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - if (!(key is RsaKeyParameters rsa) || rsa.Modulus.BitLength < MinimumRsaKeyLength) + if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) return false; options = options.Clone (); diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 2676fb5028..702b0a961a 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -34,10 +34,10 @@ using Encoding = Portable.Text.Encoding; #endif -using Org.BouncyCastle.Asn1; -using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Crypto.Digests; using MimeKit.Utils; @@ -69,6 +69,7 @@ public DkimVerifierBase (IDkimPublicKeyLocator publicKeyLocator) PublicKeyLocator = publicKeyLocator; + Enable (DkimSignatureAlgorithm.Ed25519Sha256); Enable (DkimSignatureAlgorithm.RsaSha256); //Enable (DkimSignatureAlgorithm.RsaSha1); MinimumRsaKeyLength = 1024; @@ -217,6 +218,7 @@ internal static void ValidateCommonParameters (string header, IDictionary +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Math.EC.Rfc8032; +using Org.BouncyCastle.Crypto.Parameters; + +namespace MimeKit.Cryptography +{ + class Ed25519DigestSigner : ISigner + { + Ed25519PrivateKeyParameters privateKey; + Ed25519PublicKeyParameters publicKey; + readonly IDigest digest; + + public Ed25519DigestSigner (IDigest digest) + { + this.digest = digest; + } + + public string AlgorithmName { + get { return digest.AlgorithmName + "withEd25519"; } + } + + public void Init (bool forSigning, ICipherParameters parameters) + { + if (forSigning) { + privateKey = (Ed25519PrivateKeyParameters) parameters; + publicKey = privateKey.GeneratePublicKey (); + } else { + publicKey = (Ed25519PublicKeyParameters) parameters; + privateKey = null; + } + + Reset (); + } + + public void Update (byte input) + { + digest.Update (input); + } + + public void BlockUpdate (byte[] input, int inOff, int length) + { + digest.BlockUpdate (input, inOff, length); + } + + public byte[] GenerateSignature () + { + if (privateKey == null) + throw new InvalidOperationException ("Ed25519DigestSigner not initialised for signature generation."); + + var hash = new byte[digest.GetDigestSize ()]; + digest.DoFinal (hash, 0); + + var signature = new byte[Ed25519PrivateKeyParameters.SignatureSize]; + privateKey.Sign (Ed25519.Algorithm.Ed25519, publicKey, null, hash, 0, hash.Length, signature, 0); + + Reset (); + + return signature; + } + + public bool VerifySignature (byte[] signature) + { + if (privateKey != null) + throw new InvalidOperationException ("Ed25519DigestSigner not initialised for verification"); + + if (Ed25519.SignatureSize != signature.Length) + return false; + + byte[] hash = new byte[digest.GetDigestSize ()]; + digest.DoFinal (hash, 0); + + var pk = publicKey.GetEncoded (); + var result = Ed25519.Verify (signature, 0, pk, 0, hash, 0, hash.Length); + + Reset (); + + return result; + } + + public void Reset () + { + digest.Reset (); + } + } +} diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 7f3d1ce100..4e9024fb4d 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -89,6 +89,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 0b199972b6..573330754b 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -78,6 +78,7 @@ + diff --git a/MimeKit/MimeKit.Mac.project.json b/MimeKit/MimeKit.Mac.project.json index 199db1832d..3cbe55fee9 100644 --- a/MimeKit/MimeKit.Mac.project.json +++ b/MimeKit/MimeKit.Mac.project.json @@ -3,6 +3,6 @@ "Xamarin.Mac,Version=v2.0": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.5" } } diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 28dacaa05d..729ab93237 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -53,7 +53,7 @@ - ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll @@ -86,6 +86,7 @@ + diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json index 20377545ea..44c64a7cbd 100644 --- a/MimeKit/MimeKit.Net45.project.json +++ b/MimeKit/MimeKit.Net45.project.json @@ -7,6 +7,6 @@ "win": {} }, "dependencies": { - "BouncyCastle": "1.8.2" + "BouncyCastle": "1.8.5" } -} +} \ No newline at end of file diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index cfd1a02283..09be5d50f2 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -39,7 +39,7 @@ - + @@ -70,6 +70,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 2ae54a4c57..bcc0e136f8 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -75,6 +75,7 @@ + diff --git a/MimeKit/MimeKit.Portable.project.json b/MimeKit/MimeKit.Portable.project.json index d1b6aeb974..099ed2c6c8 100644 --- a/MimeKit/MimeKit.Portable.project.json +++ b/MimeKit/MimeKit.Portable.project.json @@ -6,6 +6,6 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.5" } } diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index de55411c4e..e7fbd4e9e8 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -71,6 +71,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.project.json b/MimeKit/MimeKit.TvOS.project.json index 83634941f9..3399c7bd27 100644 --- a/MimeKit/MimeKit.TvOS.project.json +++ b/MimeKit/MimeKit.TvOS.project.json @@ -3,6 +3,6 @@ "Xamarin.TVOS,Version=v1.0": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.5" } } diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 63f8b517ff..9da86277d5 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -77,6 +77,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.project.json b/MimeKit/MimeKit.WatchOS.project.json index 680aabf72c..e623e513cf 100644 --- a/MimeKit/MimeKit.WatchOS.project.json +++ b/MimeKit/MimeKit.WatchOS.project.json @@ -3,6 +3,6 @@ "Xamarin.WatchOS,Version=v1.0": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.5" } } diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 4f57d68f2a..bf21a5db24 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -81,6 +81,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.project.json b/MimeKit/MimeKit.WindowsUniversal81.project.json index c32dd01cc1..8a15ad6f14 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.project.json +++ b/MimeKit/MimeKit.WindowsUniversal81.project.json @@ -6,6 +6,6 @@ "win-anycpu": {} }, "dependencies": { - "Portable.BouncyCastle": "1.8.2" + "Portable.BouncyCastle": "1.8.5" } } diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 3552d56d42..21b715c798 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -86,6 +86,7 @@ + diff --git a/MimeKit/packages.MimeKit.Mac.config b/MimeKit/packages.MimeKit.Mac.config index b1ee73e3b3..46c433a2c2 100644 --- a/MimeKit/packages.MimeKit.Mac.config +++ b/MimeKit/packages.MimeKit.Mac.config @@ -1,4 +1,4 @@ - + diff --git a/MimeKit/packages.MimeKit.Net45.config b/MimeKit/packages.MimeKit.Net45.config index d857d88161..0e7768b942 100644 --- a/MimeKit/packages.MimeKit.Net45.config +++ b/MimeKit/packages.MimeKit.Net45.config @@ -1,4 +1,4 @@  - + diff --git a/MimeKit/packages.MimeKit.Portable.config b/MimeKit/packages.MimeKit.Portable.config index 6f017318d0..45b707ffb3 100644 --- a/MimeKit/packages.MimeKit.Portable.config +++ b/MimeKit/packages.MimeKit.Portable.config @@ -1,4 +1,4 @@  - + diff --git a/MimeKit/packages.MimeKit.TvOS.config b/MimeKit/packages.MimeKit.TvOS.config index b1ee73e3b3..46c433a2c2 100644 --- a/MimeKit/packages.MimeKit.TvOS.config +++ b/MimeKit/packages.MimeKit.TvOS.config @@ -1,4 +1,4 @@ - + diff --git a/MimeKit/packages.MimeKit.WatchOS.config b/MimeKit/packages.MimeKit.WatchOS.config index b1ee73e3b3..46c433a2c2 100644 --- a/MimeKit/packages.MimeKit.WatchOS.config +++ b/MimeKit/packages.MimeKit.WatchOS.config @@ -1,4 +1,4 @@ - + diff --git a/MimeKit/packages.MimeKit.WindowsUniversal81.config b/MimeKit/packages.MimeKit.WindowsUniversal81.config index 413444bbdc..b441675f7f 100644 --- a/MimeKit/packages.MimeKit.WindowsUniversal81.config +++ b/MimeKit/packages.MimeKit.WindowsUniversal81.config @@ -1,4 +1,4 @@  - + diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index 38112dd428..c3085bde3c 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -27,15 +27,9 @@ using System; using System.IO; using System.Text; -using System.Threading; -using System.Threading.Tasks; -using System.Collections.Generic; using NUnit.Framework; -using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.OpenSsl; - using MimeKit; using MimeKit.Cryptography; @@ -44,96 +38,10 @@ namespace UnitTests.Cryptography [TestFixture] public class ArcVerifierTests { - class ArcPublicKeyLocator : IDkimPublicKeyLocator - { - readonly Dictionary keys; - - public ArcPublicKeyLocator () - { - keys = new Dictionary (); - } - - public void Add (string key, string value) - { - keys.Add (key, value); - } - - public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) - { - var query = selector + "._domainkey." + domain; - - if (keys.TryGetValue (query, out string txt)) { - AsymmetricKeyParameter pubkey; - string k = null, p = null; - int index = 0; - - // parse the response (will look something like: "k=rsa; p=") - while (index < txt.Length) { - while (index < txt.Length && char.IsWhiteSpace (txt[index])) - index++; - - if (index == txt.Length) - break; - - // find the end of the key - int startIndex = index; - while (index < txt.Length && txt[index] != '=') - index++; - - if (index == txt.Length) - break; - - var key = txt.Substring (startIndex, index - startIndex); - - // skip over the '=' - index++; - - // find the end of the value - startIndex = index; - while (index < txt.Length && txt[index] != ';') - index++; - - var value = txt.Substring (startIndex, index - startIndex).Replace (" ", ""); - - switch (key) { - case "k": k = value; break; - case "p": p = value; break; - } - - // skip over the ';' - index++; - } - - if (k != null && p != null) { - var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; - var rawData = Encoding.ASCII.GetBytes (data); - - using (var stream = new MemoryStream (rawData, false)) { - using (var reader = new StreamReader (stream)) { - var pem = new PemReader (reader); - - pubkey = pem.ReadObject () as AsymmetricKeyParameter; - - if (pubkey != null) - return pubkey; - } - } - } - } - - throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); - } - - public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) - { - throw new NotImplementedException (); - } - } - [Test] public void TestArgumentExceptions () { - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); var verifier = new ArcVerifier (locator); var message = new MimeMessage (); @@ -148,7 +56,7 @@ public void TestArgumentExceptions () Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, null)); } - static void Validate (string description, string input, ArcPublicKeyLocator locator, ArcValidationResult expected) + static void Validate (string description, string input, DkimPublicKeyLocator locator, ArcValidationResult expected) { if (string.IsNullOrEmpty (input)) { Assert.AreEqual (expected, ArcValidationResult.None, description); @@ -173,7 +81,7 @@ static void Validate (string description, string input, ArcPublicKeyLocator loca public void cv_empty () { const string input = @""; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -188,7 +96,7 @@ public void cv_no_headers () This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -207,7 +115,7 @@ public void cv_no_body () To: arc@dmarc.org Subject: Example 1 "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -230,7 +138,7 @@ public void cv_base1 () This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -265,7 +173,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -312,7 +220,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -373,7 +281,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -437,7 +345,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -516,7 +424,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -580,7 +488,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -662,7 +570,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -760,7 +668,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -874,7 +782,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -914,7 +822,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -961,7 +869,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is an invalid test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1003,7 +911,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1050,7 +958,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1097,7 +1005,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1144,7 +1052,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1201,7 +1109,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1265,7 +1173,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1324,7 +1232,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1388,7 +1296,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1452,7 +1360,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1516,7 +1424,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1575,7 +1483,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1639,7 +1547,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1703,7 +1611,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1767,7 +1675,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1817,7 +1725,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1864,7 +1772,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1911,7 +1819,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -1958,7 +1866,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2012,7 +1920,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2052,7 +1960,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2102,7 +2010,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2149,7 +2057,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2196,7 +2104,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2243,7 +2151,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2290,7 +2198,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2337,7 +2245,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2384,7 +2292,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2431,7 +2339,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2478,7 +2386,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2525,7 +2433,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2582,7 +2490,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2636,7 +2544,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2683,7 +2591,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2730,7 +2638,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2777,7 +2685,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2824,7 +2732,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2871,7 +2779,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2918,7 +2826,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -2966,7 +2874,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3013,7 +2921,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3060,7 +2968,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3107,7 +3015,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3151,7 +3059,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3195,7 +3103,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3240,7 +3148,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3287,7 +3195,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3334,7 +3242,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3381,7 +3289,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3428,7 +3336,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3475,7 +3383,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3522,7 +3430,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3569,7 +3477,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3616,7 +3524,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3663,7 +3571,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3710,7 +3618,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3757,7 +3665,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3804,7 +3712,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3851,7 +3759,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3898,7 +3806,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3945,7 +3853,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -3992,7 +3900,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a modified test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4040,7 +3948,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4087,7 +3995,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4134,7 +4042,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4181,7 +4089,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4219,7 +4127,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4257,7 +4165,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4304,7 +4212,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4351,7 +4259,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4398,7 +4306,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4445,7 +4353,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4492,7 +4400,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4539,7 +4447,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4587,7 +4495,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4634,7 +4542,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4682,7 +4590,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4728,7 +4636,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4775,7 +4683,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4821,7 +4729,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4884,7 +4792,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4930,7 +4838,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -4978,7 +4886,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5025,7 +4933,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5072,7 +4980,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5136,7 +5044,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5183,7 +5091,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5230,7 +5138,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5277,7 +5185,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5324,7 +5232,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5371,7 +5279,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5421,7 +5329,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5468,7 +5376,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5515,7 +5423,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5562,7 +5470,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5614,7 +5522,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5656,7 +5564,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5720,7 +5628,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5781,7 +5689,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5842,7 +5750,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5903,7 +5811,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -5964,7 +5872,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6025,7 +5933,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6086,7 +5994,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6147,7 +6055,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6208,7 +6116,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6269,7 +6177,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6338,7 +6246,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6411,7 +6319,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6476,7 +6384,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6541,7 +6449,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6606,7 +6514,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6671,7 +6579,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6736,7 +6644,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6801,7 +6709,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6866,7 +6774,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6930,7 +6838,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -6995,7 +6903,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7060,7 +6968,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7125,7 +7033,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7176,7 +7084,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7226,7 +7134,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7277,7 +7185,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7328,7 +7236,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7391,7 +7299,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7456,7 +7364,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7525,7 +7433,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7588,7 +7496,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7651,7 +7559,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7714,7 +7622,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7779,7 +7687,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7844,7 +7752,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7909,7 +7817,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -7974,7 +7882,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8039,7 +7947,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8104,7 +8012,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8169,7 +8077,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8234,7 +8142,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8299,7 +8207,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8364,7 +8272,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8406,7 +8314,7 @@ public void as_fields_h_present () This is a test message. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8471,7 +8379,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8536,7 +8444,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8600,7 +8508,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8665,7 +8573,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8730,7 +8638,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8784,7 +8692,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8831,7 +8739,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8878,7 +8786,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8925,7 +8833,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -8976,7 +8884,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9019,7 +8927,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9079,7 +8987,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9140,7 +9048,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9201,7 +9109,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9262,7 +9170,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9323,7 +9231,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9398,7 +9306,7 @@ This is a test message --001a113e15fcdd0f9e0545366e8f-- "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); @@ -9448,7 +9356,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); @@ -9497,7 +9405,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); @@ -9546,7 +9454,7 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - var locator = new ArcPublicKeyLocator (); + var locator = new DkimPublicKeyLocator (); locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); diff --git a/UnitTests/Cryptography/DkimPublicKeyLocator.cs b/UnitTests/Cryptography/DkimPublicKeyLocator.cs new file mode 100644 index 0000000000..3d3f5b40d3 --- /dev/null +++ b/UnitTests/Cryptography/DkimPublicKeyLocator.cs @@ -0,0 +1,133 @@ +// +// DkimPublicKeyLocator.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Crypto.Parameters; + +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography +{ + class DkimPublicKeyLocator : IDkimPublicKeyLocator + { + readonly Dictionary keys; + + public DkimPublicKeyLocator () + { + keys = new Dictionary (); + } + + public void Add (string key, string value) + { + keys.Add (key, value); + } + + public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + var query = selector + "._domainkey." + domain; + + if (keys.TryGetValue (query, out string txt)) { + AsymmetricKeyParameter pubkey; + string k = null, p = null; + int index = 0; + + // parse the response (will look something like: "k=rsa; p=") + while (index < txt.Length) { + while (index < txt.Length && char.IsWhiteSpace (txt[index])) + index++; + + if (index == txt.Length) + break; + + // find the end of the key + int startIndex = index; + while (index < txt.Length && txt[index] != '=') + index++; + + if (index == txt.Length) + break; + + var key = txt.Substring (startIndex, index - startIndex); + + // skip over the '=' + index++; + + // find the end of the value + startIndex = index; + while (index < txt.Length && txt[index] != ';') + index++; + + var value = txt.Substring (startIndex, index - startIndex).Replace (" ", ""); + + switch (key) { + case "k": k = value; break; + case "p": p = value; break; + } + + // skip over the ';' + index++; + } + + if (k != null && p != null) { + if (k == "rsa") { + var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; + var rawData = Encoding.ASCII.GetBytes (data); + + using (var stream = new MemoryStream (rawData, false)) { + using (var reader = new StreamReader (stream)) { + var pem = new PemReader (reader); + + pubkey = pem.ReadObject () as AsymmetricKeyParameter; + + if (pubkey != null) + return pubkey; + } + } + } else if (k == "ed25519") { + var decoded = Convert.FromBase64String (p); + + return new Ed25519PublicKeyParameters (decoded, 0); + } + } + } + + throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); + } + + public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + return Task.FromResult (LocatePublicKey (methods, domain, selector, cancellationToken)); + } + } +} diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 1825ec23aa..22e87c6ace 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -353,25 +353,25 @@ public void TestArgumentExceptions () } [Test] - public void TestEmptySimpleBodySha1 () + public void TestEmptySimpleBodyRsaSha1 () { TestEmptyBody (DkimSignatureAlgorithm.RsaSha1, DkimCanonicalizationAlgorithm.Simple, "uoq1oCgLlTqpdDX/iUbLy7J1Wic="); } [Test] - public void TestEmptySimpleBodySha256 () + public void TestEmptySimpleBodyRsaSha256 () { TestEmptyBody (DkimSignatureAlgorithm.RsaSha256, DkimCanonicalizationAlgorithm.Simple, "frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY="); } [Test] - public void TestEmptyRelaxedBodySha1 () + public void TestEmptyRelaxedBodyRsaSha1 () { TestEmptyBody (DkimSignatureAlgorithm.RsaSha1, DkimCanonicalizationAlgorithm.Relaxed, "2jmj7l5rSw0yVb/vlWAYkK/YBwk="); } [Test] - public void TestEmptyRelaxedBodySha256 () + public void TestEmptyRelaxedBodyRsaSha256 () { TestEmptyBody (DkimSignatureAlgorithm.RsaSha256, DkimCanonicalizationAlgorithm.Relaxed, "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="); } @@ -415,25 +415,25 @@ static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonica } [Test] - public void TestUnicodeSimpleBodySha1 () + public void TestUnicodeSimpleBodyRsaSha1 () { TestUnicode (DkimSignatureAlgorithm.RsaSha1, DkimCanonicalizationAlgorithm.Simple, "6GV1ZoyaprYbwRLXsr5+8zY5Jh0="); } [Test] - public void TestUnicodeSimpleBodySha256 () + public void TestUnicodeSimpleBodyRsaSha256 () { TestUnicode (DkimSignatureAlgorithm.RsaSha256, DkimCanonicalizationAlgorithm.Simple, "BuW/GpCA9rAVDfStp0Dc2duuFhmwcxhy5jOeL+Xn+ew="); } [Test] - public void TestUnicodeRelaxedBodySha1 () + public void TestUnicodeRelaxedBodyRsaSha1 () { TestUnicode (DkimSignatureAlgorithm.RsaSha1, DkimCanonicalizationAlgorithm.Relaxed, "bbT6nP0aAiAP5OMguA+mHgpzgh4="); } [Test] - public void TestUnicodeRelaxedBodySha256 () + public void TestUnicodeRelaxedBodyRsaSha256 () { TestUnicode (DkimSignatureAlgorithm.RsaSha256, DkimCanonicalizationAlgorithm.Relaxed, "PEaN3fYH5NdIg4QzgaSS+ceYlSMRnYbqCPMxncx6gy0="); } @@ -504,6 +504,46 @@ public async Task TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync Assert.IsTrue (await verifier.VerifyAsync (message, message.Headers[index]), "Failed to verify GMail signature."); } + [Test] + public void TestRfc8463Example () + { + var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); + var locator = new DkimPublicKeyLocator (); + var verifier = new DkimVerifier (locator); + int index; + + locator.Add ("brisbane._domainkey.football.example.com", "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="); + locator.Add ("test._domainkey.football.example.com", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + // the last DKIM-Signature uses rsa-sha256 + index = message.Headers.LastIndexOf (HeaderId.DkimSignature); + Assert.IsTrue (verifier.Verify (message, message.Headers[index]), "Failed to verify rsa-sha256"); + + // the first DKIM-Signature uses ed25519-sha256 + index = message.Headers.IndexOf (HeaderId.DkimSignature); + Assert.IsTrue (verifier.Verify (message, message.Headers[index]), "Failed to verify ed25519-sha256"); + } + + [Test] + public async Task TestRfc8463ExampleAsync () + { + var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); + var locator = new DkimPublicKeyLocator (); + var verifier = new DkimVerifier (locator); + int index; + + locator.Add ("brisbane._domainkey.football.example.com", "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="); + locator.Add ("test._domainkey.football.example.com", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + // the last DKIM-Signature uses rsa-sha256 + index = message.Headers.LastIndexOf (HeaderId.DkimSignature); + Assert.IsTrue (await verifier.VerifyAsync (message, message.Headers[index]), "Failed to verify rsa-sha256"); + + // the first DKIM-Signature uses ed25519-sha256 + index = message.Headers.IndexOf (HeaderId.DkimSignature); + Assert.IsTrue (await verifier.VerifyAsync (message, message.Headers[index]), "Failed to verify ed25519-sha256"); + } + static void TestDkimSignVerify (MimeMessage message, DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm headerAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm) { var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; diff --git a/UnitTests/TestData/dkim/rfc8463-example.msg b/UnitTests/TestData/dkim/rfc8463-example.msg new file mode 100644 index 0000000000..a3397f2d4e --- /dev/null +++ b/UnitTests/TestData/dkim/rfc8463-example.msg @@ -0,0 +1,26 @@ +DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; + d=football.example.com; i=@football.example.com; + q=dns/txt; s=brisbane; t=1528637909; h=from : to : + subject : date : message-id : from : subject : date; + bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; + b=/gCrinpcQOoIfuHNQIbq4pgh9kyIK3AQUdt9OdqQehSwhEIug4D11Bus + Fa3bT3FY5OsU7ZbnKELq+eXdp1Q1Dw== +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=football.example.com; i=@football.example.com; + q=dns/txt; s=test; t=1528637909; h=from : to : subject : + date : message-id : from : subject : date; + bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; + b=F45dVWDfMbQDGHJFlXUNB2HKfbCeLRyhDXgFpEL8GwpsRe0IeIixNTe3 + DhCVlUrSjV4BwcVcOF6+FF3Zo9Rpo1tFOeS9mPYQTnGdaSGsgeefOsk2Jz + dA+L10TeYt9BgDfQNZtKdN1WO//KgIqXP7OdEFE4LjFYNcUxZQ4FADY+8= +From: Joe SixPack +To: Suzie Q +Subject: Is dinner ready? +Date: Fri, 11 Jul 2003 21:00:37 -0700 (PDT) +Message-ID: <20030712040037.46341.5F8J@football.example.com> + +Hi. + +We lost the game. Are you hungry yet? + +Joe. diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 84634af059..5d3f20cb69 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -54,7 +54,7 @@ - ..\packages\BouncyCastle.1.8.2\lib\BouncyCastle.Crypto.dll + ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll @@ -79,6 +79,7 @@ + @@ -168,6 +169,7 @@ + diff --git a/UnitTests/packages.config b/UnitTests/packages.config index deb3913755..8cdc83a476 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,7 +1,7 @@  - + - + \ No newline at end of file diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 68b86a59de..b2ab027672 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -55,7 +55,7 @@ - + @@ -64,27 +64,27 @@ - + - + - + - + - + diff --git a/rfc/rfc8463.txt b/rfc/rfc8463.txt new file mode 100644 index 0000000000..31ff1eaffe --- /dev/null +++ b/rfc/rfc8463.txt @@ -0,0 +1,395 @@ + + + + + + +Internet Engineering Task Force (IETF) J. Levine +Request for Comments: 8463 Taughannock Networks +Updates: 6376 September 2018 +Category: Standards Track +ISSN: 2070-1721 + + + A New Cryptographic Signature Method for + DomainKeys Identified Mail (DKIM) + +Abstract + + This document adds a new signing algorithm, Ed25519-SHA256, to + "DomainKeys Identified Mail (DKIM) Signatures" (RFC 6376). DKIM + verifiers are required to implement this algorithm. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8463. + +Copyright Notice + + Copyright (c) 2018 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + + + + + +Levine Standards Track [Page 1] + +RFC 8463 DKIM Crypto Update September 2018 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 + 2. Conventions Used in This Document . . . . . . . . . . . . . . 2 + 3. Ed25519-SHA256 Signing Algorithm . . . . . . . . . . . . . . 3 + 4. Signature and Key Syntax . . . . . . . . . . . . . . . . . . 3 + 4.1. Signature Syntax . . . . . . . . . . . . . . . . . . . . 3 + 4.2. Key Syntax . . . . . . . . . . . . . . . . . . . . . . . 3 + 5. Choice and Strength of Keys and Algorithms . . . . . . . . . 4 + 6. Transition Considerations . . . . . . . . . . . . . . . . . . 4 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 4 + 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 4 + 8.1. "DKIM Key Type" Registry . . . . . . . . . . . . . . . . 4 + 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 9.1. Normative References . . . . . . . . . . . . . . . . . . 5 + 9.2. Informative References . . . . . . . . . . . . . . . . . 5 + Appendix A. Example of a Signed Message . . . . . . . . . . . . 6 + A.1. Secret Keys . . . . . . . . . . . . . . . . . . . . . . . 6 + A.2. Public Key DNS Records . . . . . . . . . . . . . . . . . 6 + A.3. Signed Message . . . . . . . . . . . . . . . . . . . . . 7 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 7 + +1. Introduction + + DKIM [RFC6376] signs email messages by creating hashes of selected + message header fields and body and signing the header hash with a + digital signature. Message recipients fetch the signature + verification key from the DNS. The defining documents specify a + single signing algorithm, RSA [RFC3447] (which has since been + obsoleted by [RFC8017]). + + This document adds a new, stronger signing algorithm, Edwards-Curve + Digital Signature Algorithm, using the Curve25519 curve (Ed25519), + which has much shorter keys than RSA for similar levels of security. + +2. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + Syntax descriptions use Augmented BNF (ABNF) [RFC5234]. The ABNF + tokens sig-a-tag-k and key-k-tag-type are imported from [RFC6376]. + + + + + + +Levine Standards Track [Page 2] + +RFC 8463 DKIM Crypto Update September 2018 + + +3. Ed25519-SHA256 Signing Algorithm + + The Ed25519-SHA256 signing algorithm computes a message hash as + defined in Section 3 of [RFC6376] using SHA-256 [FIPS-180-4-2015] as + the hash-alg. It signs the hash with the PureEdDSA variant Ed25519, + as defined in RFC 8032, Section 5.1 [RFC8032]. Example keys and + signatures in Appendix A are based on the test vectors in RFC 8032, + Section 7.1 [RFC8032]. + + The DNS record for the verification public key has a "k=ed25519" tag + to indicate that the key is an Ed25519 rather than an RSA key. + + This is an additional DKIM signature algorithm added to Section 3.3 + of [RFC6376] as envisioned in Section 3.3.4 of that document. + + Note: since Ed25519 public keys are 256 bits long, the base64-encoded + key is only 44 octets, so DNS key record data will generally fit in a + single 255-byte TXT string and work even with DNS provisioning + software that doesn't handle multistring TXT records. + +4. Signature and Key Syntax + + The syntax of DKIM signatures and DKIM keys are updated as follows. + +4.1. Signature Syntax + + The syntax of DKIM algorithm tags in Section 3.5 of [RFC6376] is + updated by adding this rule to the existing rule for sig-a-tag-k: + + ABNF: + + sig-a-tag-k =/ "ed25519" + +4.2. Key Syntax + + The syntax of DKIM key tags in Section 3.6.1 of [RFC6376] is updated + by adding this rule to the existing rule for key-k-tag-type: + + ABNF: + + key-k-tag-type =/ "ed25519" + + The p= value in the key record is the Ed25519 public key encoded in + base64. Since the key is 256 bits long, the base64 text is 44 octets + long. See Appendix A.2 for a sample key record using the public key + in [RFC8032], Section 7.1, Test 1. + + + + + +Levine Standards Track [Page 3] + +RFC 8463 DKIM Crypto Update September 2018 + + +5. Choice and Strength of Keys and Algorithms + + Section 3.3 of [RFC6376] describes DKIM's hash and signature + algorithms. It is updated as follows: + + Signers SHOULD implement and verifiers MUST implement the + Ed25519-SHA256 algorithm. + +6. Transition Considerations + + For backward compatibility, signers can add multiple signatures that + use old and new signing algorithms. Since there can only be a single + key record in the DNS for each selector, the signatures have to use + different selectors, although they can use the same d= and i= + identifiers. + + The example message in Appendix A has two signatures with the same d= + and i= identifiers but different a= algorithms and s= selectors. + +7. Security Considerations + + All of the security advice in [RFC6376] continues to apply, except + that the security advice about Ed25519 in Section 8 of [RFC8032] + supplants the advice about RSA threats. + +8. IANA Considerations + + IANA has updated a registry as follows. + +8.1. "DKIM Key Type" Registry + + The following value has been added to the "DKIM Key Type" registry: + + +---------+-----------+--------+ + | TYPE | REFERENCE | STATUS | + +---------+-----------+--------+ + | ed25519 | [RFC8032] | active | + +---------+-----------+--------+ + + Table 1: Value Added to the "DKIM Key Type" Registry + + + + + + + + + + + +Levine Standards Track [Page 4] + +RFC 8463 DKIM Crypto Update September 2018 + + +9. References + +9.1. Normative References + + [FIPS-180-4-2015] + National Institute of Standards and Technology, "Secure + Hash Standard (SHS)", FIPS PUB 180-4, + DOI 10.6028/NIST.FIPS.180-4, August 2015, + . + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + . + + [RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., + "DomainKeys Identified Mail (DKIM) Signatures", STD 76, + RFC 6376, DOI 10.17487/RFC6376, September 2011, + . + + [RFC8017] Moriarty, K., Ed., Kaliski, B., Jonsson, J., and A. Rusch, + "PKCS #1: RSA Cryptography Specifications Version 2.2", + RFC 8017, DOI 10.17487/RFC8017, November 2016, + . + + [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital + Signature Algorithm (EdDSA)", RFC 8032, + DOI 10.17487/RFC8032, January 2017, + . + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, . + +9.2. Informative References + + [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography + Standards (PKCS) #1: RSA Cryptography Specifications + Version 2.1", RFC 3447, DOI 10.17487/RFC3447, February + 2003, . + + + + + +Levine Standards Track [Page 5] + +RFC 8463 DKIM Crypto Update September 2018 + + +Appendix A. Example of a Signed Message + + This is a small message with both RSA-SHA256 and Ed25519-SHA256 DKIM + signatures. The signatures are independent of each other, so either + signature would be valid if the other were not present. + +A.1. Secret Keys + + Ed25519 secret key in base64. This is the secret key from [RFC8032], + Section 7.1, Test 1, converted from hex to base64. + + nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A= + + RSA secret key in PEM format. + + -----BEGIN RSA PRIVATE KEY----- + MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi + Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM + KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB + AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm + 6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe + zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy + 6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc + uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy + WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd + WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a + licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst + o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe + uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL + -----END RSA PRIVATE KEY----- + +A.2. Public Key DNS Records + + The public key p= value in the first record is the public key from + [RFC8032], Section 7.1, Test 1, converted from hex to base64. + +brisbane._domainkey.football.example.com. IN TXT ( + "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=") + +test._domainkey.football.example.com. IN TXT ( + "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWR" + "iGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutAC" + "DfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3" + "Ip3G+2kryOTIKT+l/K4w3QIDAQAB") + + + + + + + +Levine Standards Track [Page 6] + +RFC 8463 DKIM Crypto Update September 2018 + + +A.3. Signed Message + + The text in each line of the message starts at the first position + except for the continuation lines on the DKIM-Signature header + fields, which start with a single space. A blank line follows the + "Joe." line. + + DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; + d=football.example.com; i=@football.example.com; + q=dns/txt; s=brisbane; t=1528637909; h=from : to : + subject : date : message-id : from : subject : date; + bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; + b=/gCrinpcQOoIfuHNQIbq4pgh9kyIK3AQUdt9OdqQehSwhEIug4D11Bus + Fa3bT3FY5OsU7ZbnKELq+eXdp1Q1Dw== + DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=football.example.com; i=@football.example.com; + q=dns/txt; s=test; t=1528637909; h=from : to : subject : + date : message-id : from : subject : date; + bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; + b=F45dVWDfMbQDGHJFlXUNB2HKfbCeLRyhDXgFpEL8GwpsRe0IeIixNTe3 + DhCVlUrSjV4BwcVcOF6+FF3Zo9Rpo1tFOeS9mPYQTnGdaSGsgeefOsk2Jz + dA+L10TeYt9BgDfQNZtKdN1WO//KgIqXP7OdEFE4LjFYNcUxZQ4FADY+8= + From: Joe SixPack + To: Suzie Q + Subject: Is dinner ready? + Date: Fri, 11 Jul 2003 21:00:37 -0700 (PDT) + Message-ID: <20030712040037.46341.5F8J@football.example.com> + + Hi. + + We lost the game. Are you hungry yet? + + Joe. + +Author's Address + + John Levine + Taughannock Networks + PO Box 727 + Trumansburg, NY 14886 + United States of America + + Phone: +883.5100.01196712 + Email: standards@taugh.com + + + + + + + +Levine Standards Track [Page 7] + From 954fbc3d35c181a49135260f0d0cae0a572caadc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 13:19:39 -0400 Subject: [PATCH 292/741] Updated RFCs.md --- RFCs.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RFCs.md b/RFCs.md index 840c57323c..0ce67a6106 100644 --- a/RFCs.md +++ b/RFCs.md @@ -52,6 +52,7 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [6522](http://www.ietf.org/rfc/rfc6522.txt): The Multipart/Report Media Type for the Reporting of Mail System Administrative Messages (Obsoletes rfc3462) * [6532](http://www.ietf.org/rfc/rfc6532.txt): Internationalized Email Headers * [8301](http://www.ietf.org/rfc/rfc8301.txt): Cryptographic Algorithm and Key Usage Update to DomainKeys Identified Mail (DKIM) +* [8463](http://www.ietf.org/rfc/rfc8463.txt): A New Cryptographic Signature Method for DomainKeys Identified Mail (DKIM) #### Other RFCs of interest: From 2420f379e14679c7a00d766717bb11d3dd9ea274 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 14:36:57 -0400 Subject: [PATCH 293/741] Simplified ISigner creation for DKIM signatures --- MimeKit/Cryptography/DkimVerifierBase.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 702b0a961a..2bbe210343 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -35,9 +35,8 @@ #endif using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Security; -using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.Crypto.Signers; using MimeKit.Utils; @@ -374,11 +373,11 @@ internal static ISigner GetDigestSigner (DkimSignatureAlgorithm algorithm, Asymm ISigner signer; switch (algorithm) { - case DkimSignatureAlgorithm.RsaSha256: - signer = SignerUtilities.GetSigner (PkcsObjectIdentifiers.Sha256WithRsaEncryption); - break; case DkimSignatureAlgorithm.RsaSha1: - signer = SignerUtilities.GetSigner (PkcsObjectIdentifiers.Sha1WithRsaEncryption); + signer = new RsaDigestSigner (new Sha1Digest ()); + break; + case DkimSignatureAlgorithm.RsaSha256: + signer = new RsaDigestSigner (new Sha256Digest ()); break; case DkimSignatureAlgorithm.Ed25519Sha256: signer = new Ed25519DigestSigner (new Sha256Digest ()); From 251fc292a9c409f29fbca1b8d0ef2b4beffd84b1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 14:37:31 -0400 Subject: [PATCH 294/741] Added unit tests for ARC-AUthentication-Results header folding --- UnitTests/HeaderTests.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index c487d8ed37..cbfcd6fea8 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -135,6 +135,28 @@ public void TestAddressHeaderFolding () Assert.AreEqual (expected, raw, "The folded address header does not match the expected value."); } + static readonly string[] ArcAuthenticationResultsHeaderValues = { + " i=1; lists.example.org;" + FormatOptions.Default.NewLine + "\tspf=pass smtp.mfrom=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=pass (1024 - bit key) header.i=@d1.example; dmarc=pass", + " i=2; gmail.example;" + FormatOptions.Default.NewLine + "\tspf=fail smtp.from=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=fail (512-bit key) header.i=@example.org; dmarc=fail;" + FormatOptions.Default.NewLine + "\tarc=pass (as.1.lists.example.org=pass, ams.1.lists.example.org=pass)", + " i=3; gmail.example;" + FormatOptions.Default.NewLine + "\tspf=fail smtp.from=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=fail (512-bit key) header.i=@example.org;"+ FormatOptions.Default.NewLine + "\tdmarc=fail (this-is-a-reall-long-unbroken-comment-that-will-need-to-be-broken"+ FormatOptions.Default.NewLine + "\t-apart-somewhere---is-it-long-enough-yet?); arc=pass (as.1.lists.example.org=pass, ams.1.lists.example.org=pass)" + }; + + [Test] + public void TestArcAuthenticationResultsHeaderFolding () + { + var header = new Header ("ARC-Authentication-Results", ""); + + foreach (var authResults in ArcAuthenticationResultsHeaderValues) { + header.SetValue (Encoding.ASCII, authResults.Replace (FormatOptions.Default.NewLine + "\t", " ").Trim ()); + + var raw = ByteArrayToString (header.RawValue); + + Assert.IsTrue (raw[raw.Length - 1] == '\n', "The RawValue does not end with a new line."); + + Assert.AreEqual (authResults + FormatOptions.Default.NewLine, raw, "The folded ARC-Authentication-Results header does not match the expected value."); + } + } + [Test] public void TestMessageIdHeaderFolding () { From ada0fbd84582f6e0ef34775e3a98b26289a039f0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 19:39:25 -0400 Subject: [PATCH 295/741] Simplified one of the Header.TryParse() methods. --- MimeKit/Header.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index a2bf0f1d68..a97963153f 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -1518,13 +1518,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out Header header) /// public static bool TryParse (ParserOptions options, byte[] buffer, out Header header) { - ParseUtils.ValidateArguments (options, buffer); - - unsafe { - fixed (byte* inptr = buffer) { - return TryParse (options.Clone (), inptr, buffer.Length, true, out header); - } - } + return TryParse (options, buffer, 0, out header); } /// From c3be1f26505c279e926a63e17c9c9791c8b3691e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 20:04:12 -0400 Subject: [PATCH 296/741] Added more DKIM verifier tests --- UnitTests/Cryptography/DkimTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 22e87c6ace..5d31b7b385 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -269,6 +269,7 @@ public void TestArgumentExceptions () var locator = new DummyPublicKeyLocator (DkimKeys.Public); var verifier = new DkimVerifier (locator); var dkimHeader = new Header (HeaderId.DkimSignature, "value"); + var arcHeader = new Header (HeaderId.ArcMessageSignature, "value"); var options = FormatOptions.Default; var message = new MimeMessage (); DkimSigner signer; @@ -322,6 +323,14 @@ public void TestArgumentExceptions () Assert.Throws (() => verifier.Verify (null, message, dkimHeader)); Assert.Throws (() => verifier.Verify (FormatOptions.Default, null, dkimHeader)); Assert.Throws (() => verifier.Verify (FormatOptions.Default, message, null)); + Assert.Throws (() => verifier.Verify (FormatOptions.Default, message, arcHeader)); + + Assert.Throws (async () => await verifier.VerifyAsync (null, dkimHeader)); + Assert.Throws (async () => await verifier.VerifyAsync (message, null)); + Assert.Throws (async () => await verifier.VerifyAsync (null, message, dkimHeader)); + Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, null, dkimHeader)); + Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, message, null)); + Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, message, arcHeader)); Assert.Throws (() => message.Sign (null, new HeaderId[] { HeaderId.From })); Assert.Throws (() => message.Sign (signer, (IList) null)); @@ -350,6 +359,14 @@ public void TestArgumentExceptions () Assert.Throws (() => message.Verify (null, dkimHeader, locator)); Assert.Throws (() => message.Verify (FormatOptions.Default, null, locator)); Assert.Throws (() => message.Verify (FormatOptions.Default, dkimHeader, null)); + Assert.Throws (() => message.Verify (FormatOptions.Default, arcHeader, locator)); + + Assert.Throws (async () => await message.VerifyAsync (null, locator)); + Assert.Throws (async () => await message.VerifyAsync (dkimHeader, null)); + Assert.Throws (async () => await message.VerifyAsync (null, dkimHeader, locator)); + Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, null, locator)); + Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, dkimHeader, null)); + Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, arcHeader, locator)); } [Test] From 2dff1ccf5cc9051d269b7590e2d9d77d5eb33e89 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 20:17:37 -0400 Subject: [PATCH 297/741] Added more MimeMessage unit tests for conversion from MailMessage --- UnitTests/MimeMessageTests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 2d5d77af6a..dcf4f23898 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -98,6 +98,8 @@ public void TestArgumentExceptions () Assert.Throws (() => message.Sign (null, DigestAlgorithm.Sha1)); Assert.Throws (() => message.Encrypt (null)); Assert.Throws (() => message.SignAndEncrypt (null)); + + Assert.Throws (() => MimeMessage.CreateFromMailMessage (null)); } [Test] @@ -381,6 +383,7 @@ public void TestMailMessageToMimeMessage () mail.Bcc.Add (new MailAddress ("bcc@bcc.com", "The Blind Carbon-Copied Recipient")); mail.Subject = "This is the message subject"; mail.Priority = MailPriority.High; + mail.Headers.Add ("X-MimeKit-Test", "does this get copied, too?"); mail.Body = "This is plain text."; //var text = new MemoryStream (Encoding.ASCII.GetBytes ("This is plain text."), false); @@ -414,6 +417,7 @@ public void TestMailMessageToMimeMessage () Assert.AreEqual (mail.Bcc[0].Address, ((MailboxAddress) message.Bcc[0]).Address, "The bcc addresses do not match."); Assert.AreEqual (mail.Subject, message.Subject, "The message subjects do not match."); Assert.AreEqual (MessagePriority.Urgent, message.Priority, "The message priority does not match."); + Assert.AreEqual (mail.Headers["X-MimeKit-Test"], message.Headers["X-MimeKit-Test"], "The X-MimeKit-Test headers do not match"); Assert.IsInstanceOf (message.Body, "The top-level MIME part should be a multipart/mixed."); var mixed = (Multipart) message.Body; @@ -443,6 +447,17 @@ public void TestMailMessageToMimeMessage () Assert.AreEqual ("id@jpeg", jpeg.ContentId); Assert.AreEqual ("image/jpeg", jpeg.ContentType.MimeType); Assert.AreEqual ("link", jpeg.ContentLocation.OriginalString); + + // Test other priorities + mail.Priority = MailPriority.Low; + message = (MimeMessage) mail; + + Assert.AreEqual (MessagePriority.NonUrgent, message.Priority, "The message priority does not match."); + + mail.Priority = MailPriority.Normal; + message = (MimeMessage) mail; + + Assert.AreEqual (MessagePriority.Normal, message.Priority, "The message priority does not match."); } [Test] From 847a2705487ecfb9e54741ea45c287f1849d8918 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Jun 2019 21:40:54 -0400 Subject: [PATCH 298/741] Added more DkimVerifier unit tests for validating the DKIM-Signature header parameters --- MimeKit/Cryptography/DkimVerifierBase.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 55 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 2bbe210343..4f4144a395 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -256,7 +256,7 @@ internal static void ValidateCommonSignatureParameters (string header, IDictiona ValidateCommonParameters (header, parameters, out algorithm, out d, out s, out q, out b); if (parameters.TryGetValue ("l", out string l)) { - if (!int.TryParse (l, out maxLength)) + if (!int.TryParse (l, NumberStyles.Integer, CultureInfo.InvariantCulture, out maxLength) || maxLength < 0) throw new FormatException (string.Format ("Malformed {0} header: invalid length parameter: l={1}", header, l)); } else { maxLength = -1; diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 5d31b7b385..59ca5ad61d 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -369,6 +369,61 @@ public void TestArgumentExceptions () Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, arcHeader, locator)); } + [Test] + public void TestFormatExceptions () + { + var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); + var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); + var index = message.Headers.IndexOf (HeaderId.DkimSignature); + var dkim = message.Headers[index]; + var original = dkim.Value; + + // first, remove the 'v' tag and its value + dkim.Value = dkim.Value.Substring (4); + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for missing v=1;"); + + // add back a 'v' tag with an invalid value + dkim.Value = "v=x; " + dkim.Value; + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for v=x;"); + + // remove "from:" + dkim.Value = original.Replace ("from:", ""); + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for missing from header"); + + // add an invalid i= value w/o an '@' + dkim.Value = "i=1; " + original; + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for an invalid i= value (missing '@')"); + + // add an invalid i= value that does not match the domain + dkim.Value = "i=user@domain; " + original; + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for an invalid i= that does not contain the domain"); + + // add an invalid l= value + dkim.Value = "l=abc; " + original; + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for an invalid l= value"); + + // set an invalid body canonicalization algorithm + dkim.Value = original.Replace ("c=relaxed/relaxed;", "c=simple/complex;"); + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for an invalid body canonicalization value"); + + // set an invalid c= value + dkim.Value = original.Replace ("c=relaxed/relaxed;", "c=;"); + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for an invalid c= value (empty)"); + + // set an invalid c= value + dkim.Value = original.Replace ("c=relaxed/relaxed;", "c=relaxed/relaxed/extra;"); + + Assert.Throws (() => verifier.Verify (message, dkim), "Expected FormatException for an invalid c= value (3 values)"); + } + [Test] public void TestEmptySimpleBodyRsaSha1 () { From 3a88803a6e1640e0f6ddb86df877d2c9adabea83 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 3 Jun 2019 07:37:55 -0400 Subject: [PATCH 299/741] Added support for DKIM signing using Ed25519-Sha256 --- MimeKit/Cryptography/ArcVerifier.cs | 4 +-- MimeKit/Cryptography/DkimSigner.cs | 40 +++++++++++++++--------- MimeKit/Cryptography/DkimVerifier.cs | 2 +- MimeKit/Cryptography/DkimVerifierBase.cs | 11 ++++++- UnitTests/Cryptography/DkimTests.cs | 33 +++++++++++++++++-- 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 793c771e34..7447d01e17 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -171,7 +171,7 @@ async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMess if (hash != bh) return false; - using (var stream = new DkimSignatureStream (GetDigestSigner (signatureAlgorithm, key))) { + using (var stream = new DkimSignatureStream (CreateVerifyContext (signatureAlgorithm, key))) { using (var filtered = new FilteredStream (stream)) { filtered.Add (options.CreateNewLineFilter ()); @@ -219,7 +219,7 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; - using (var stream = new DkimSignatureStream (GetDigestSigner (algorithm, key))) { + using (var stream = new DkimSignatureStream (CreateVerifyContext (algorithm, key))) { using (var filtered = new FilteredStream (stream)) { filtered.Add (options.CreateNewLineFilter ()); diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index befee2407e..e33ec58262 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -33,11 +33,10 @@ using System.Security.Cryptography; #endif -using Org.BouncyCastle.Asn1; -using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; -using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.Crypto.Signers; using MimeKit.IO; using MimeKit.Utils; @@ -366,22 +365,32 @@ public string QueryMethod { /// Create the digest signing context. /// /// - /// Creates a new digest signing context that uses the . + /// Creates a new digest signing context. /// /// The digest signer. + /// + /// The is not supported. + /// internal protected virtual ISigner CreateSigningContext () { #if ENABLE_NATIVE_DKIM return new SystemSecuritySigner (SignatureAlgorithm, PrivateKey.AsAsymmetricAlgorithm ()); #else - DerObjectIdentifier id; - - if (SignatureAlgorithm == DkimSignatureAlgorithm.RsaSha256) - id = PkcsObjectIdentifiers.Sha256WithRsaEncryption; - else - id = PkcsObjectIdentifiers.Sha1WithRsaEncryption; + ISigner signer; - var signer = SignerUtilities.GetSigner (id); + switch (SignatureAlgorithm) { + case DkimSignatureAlgorithm.RsaSha1: + signer = new RsaDigestSigner (new Sha1Digest ()); + break; + case DkimSignatureAlgorithm.RsaSha256: + signer = new RsaDigestSigner (new Sha256Digest ()); + break; + case DkimSignatureAlgorithm.Ed25519Sha256: + signer = new Ed25519DigestSigner (new Sha256Digest ()); + break; + default: + throw new NotSupportedException (string.Format ("{0} is not supported.", SignatureAlgorithm)); + } signer.Init (true, PrivateKey); @@ -403,6 +412,9 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields) options.NewLineFormat = NewLineFormat.Dos; switch (SignatureAlgorithm) { + case DkimSignatureAlgorithm.Ed25519Sha256: + value.Append ("; a=ed25519-sha256"); + break; case DkimSignatureAlgorithm.RsaSha256: value.Append ("; a=rsa-sha256"); break; @@ -426,7 +438,7 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields) filtered.Add (options.CreateNewLineFilter ()); // write the specified message headers - DkimVerifier.WriteHeaders (options, message, fields, HeaderCanonicalizationAlgorithm, filtered); + DkimVerifierBase.WriteHeaders (options, message, fields, HeaderCanonicalizationAlgorithm, filtered); value.AppendFormat ("; h={0}", string.Join (":", fields.ToArray ())); @@ -439,10 +451,10 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields) switch (HeaderCanonicalizationAlgorithm) { case DkimCanonicalizationAlgorithm.Relaxed: - DkimVerifier.WriteHeaderRelaxed (options, filtered, dkim, true); + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, dkim, true); break; default: - DkimVerifier.WriteHeaderSimple (options, filtered, dkim, true); + DkimVerifierBase.WriteHeaderSimple (options, filtered, dkim, true); break; } diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index efebaad455..6facdd73bc 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -145,7 +145,7 @@ async Task VerifyAsync (FormatOptions options, MimeMessage message, Header if (hash != bh) return false; - using (var stream = new DkimSignatureStream (GetDigestSigner (signatureAlgorithm, key))) { + using (var stream = new DkimSignatureStream (CreateVerifyContext (signatureAlgorithm, key))) { using (var filtered = new FilteredStream (stream)) { filtered.Add (options.CreateNewLineFilter ()); diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 4f4144a395..c698798d79 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -365,7 +365,16 @@ internal static void WriteHeaderSimple (FormatOptions options, Stream stream, He stream.Write (rawValue, 0, rawLength); } - internal static ISigner GetDigestSigner (DkimSignatureAlgorithm algorithm, AsymmetricKeyParameter key) + /// + /// Create the digest signing context. + /// + /// + /// Creates a new digest signing context that uses the specified algorithm. + /// + /// The DKIM signature algorithm. + /// The public key. + /// The digest signer. + internal virtual ISigner CreateVerifyContext (DkimSignatureAlgorithm algorithm, AsymmetricKeyParameter key) { #if ENABLE_NATIVE_DKIM return new SystemSecuritySigner (algorithm, key.AsAsymmetricAlgorithm ()); diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 59ca5ad61d..8082a58113 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -34,6 +34,7 @@ using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Crypto.Parameters; using MimeKit; using MimeKit.Cryptography; @@ -43,6 +44,7 @@ namespace UnitTests.Cryptography { public class DkimTests { static readonly AsymmetricKeyParameter GMailDkimPublicKey; + static readonly AsymmetricKeyParameter Ed25519PrivateKey; static readonly AsymmetricCipherKeyPair DkimKeys; class DummyPublicKeyLocator : IDkimPublicKeyLocator @@ -79,6 +81,9 @@ static DkimTests () GMailDkimPublicKey = reader.ReadObject () as AsymmetricKeyParameter; } + + var rawData = Convert.FromBase64String ("nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A="); + Ed25519PrivateKey = new Ed25519PrivateKeyParameters (rawData, 0); } static DkimSigner CreateSigner (DkimSignatureAlgorithm algorithm, DkimCanonicalizationAlgorithm headerAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm) @@ -577,7 +582,31 @@ public async Task TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync } [Test] - public void TestRfc8463Example () + public void TestSignRfc8463Example () + { + var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); + var signer = new DkimSigner (Ed25519PrivateKey, "football.example.com", "brisbane", DkimSignatureAlgorithm.Ed25519Sha256) { + HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + AgentOrUserIdentifier = "@football.example.com" + }; + var headers = new string[] { "from", "to", "subject", "date", "message-id", "from", "subject", "date" }; + + signer.Sign (message, headers); + + int index = message.Headers.IndexOf (HeaderId.DkimSignature); + var locator = new DkimPublicKeyLocator (); + var verifier = new DkimVerifier (locator); + var dkim = message.Headers[index]; + + locator.Add ("brisbane._domainkey.football.example.com", "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="); + locator.Add ("test._domainkey.football.example.com", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Assert.IsTrue (verifier.Verify (message, message.Headers[index]), "Failed to verify ed25519-sha256"); + } + + [Test] + public void TestVerifyRfc8463Example () { var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); var locator = new DkimPublicKeyLocator (); @@ -597,7 +626,7 @@ public void TestRfc8463Example () } [Test] - public async Task TestRfc8463ExampleAsync () + public async Task TestVerifyRfc8463ExampleAsync () { var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); var locator = new DkimPublicKeyLocator (); From 9a1165c9c20a63ccee15d49a0b262ecf0fa51362 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 3 Jun 2019 08:38:37 -0400 Subject: [PATCH 300/741] Reduced code duplication --- MimeKit/Cryptography/DkimSigner.cs | 35 ++------------------- MimeKit/Cryptography/Ed25519DigestSigner.cs | 3 +- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index e33ec58262..e348a59283 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -51,7 +51,6 @@ namespace MimeKit.Cryptography { public class DkimSigner { static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; - //static readonly string[] DefaultHeaders = { "from", "to", "date", "subject" }; /// /// Initializes a new instance of the class. @@ -108,24 +107,15 @@ protected DkimSigner (string domain, string selector, DkimSignatureAlgorithm alg /// /// is not a private key. /// - public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) + public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : this (domain, selector, algorithm) { if (key == null) throw new ArgumentNullException (nameof (key)); - if (domain == null) - throw new ArgumentNullException (nameof (domain)); - - if (selector == null) - throw new ArgumentNullException (nameof (selector)); - if (!key.IsPrivate) throw new ArgumentException ("The key must be a private key.", nameof (key)); - SignatureAlgorithm = algorithm; - Selector = selector; PrivateKey = key; - Domain = domain; } static AsymmetricKeyParameter LoadPrivateKey (Stream stream) @@ -197,7 +187,7 @@ static AsymmetricKeyParameter LoadPrivateKey (Stream stream) /// /// An I/O error occurred. /// - public DkimSigner (string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) + public DkimSigner (string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : this (domain, selector, algorithm) { if (fileName == null) throw new ArgumentNullException (nameof (fileName)); @@ -205,18 +195,8 @@ public DkimSigner (string fileName, string domain, string selector, DkimSignatur if (fileName.Length == 0) throw new ArgumentException ("The file name cannot be empty.", nameof (fileName)); - if (domain == null) - throw new ArgumentNullException (nameof (domain)); - - if (selector == null) - throw new ArgumentNullException (nameof (selector)); - using (var stream = File.OpenRead (fileName)) PrivateKey = LoadPrivateKey (stream); - - SignatureAlgorithm = algorithm; - Selector = selector; - Domain = domain; } #endif @@ -247,21 +227,12 @@ public DkimSigner (string fileName, string domain, string selector, DkimSignatur /// /// An I/O error occurred. /// - public DkimSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) + public DkimSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : this (domain, selector, algorithm) { if (stream == null) throw new ArgumentNullException (nameof (stream)); - if (domain == null) - throw new ArgumentNullException (nameof (domain)); - - if (selector == null) - throw new ArgumentNullException (nameof (selector)); - PrivateKey = LoadPrivateKey (stream); - SignatureAlgorithm = algorithm; - Selector = selector; - Domain = domain; } /// diff --git a/MimeKit/Cryptography/Ed25519DigestSigner.cs b/MimeKit/Cryptography/Ed25519DigestSigner.cs index 78a62d0677..4821805217 100644 --- a/MimeKit/Cryptography/Ed25519DigestSigner.cs +++ b/MimeKit/Cryptography/Ed25519DigestSigner.cs @@ -30,8 +30,7 @@ using Org.BouncyCastle.Math.EC.Rfc8032; using Org.BouncyCastle.Crypto.Parameters; -namespace MimeKit.Cryptography -{ +namespace MimeKit.Cryptography { class Ed25519DigestSigner : ISigner { Ed25519PrivateKeyParameters privateKey; From aa69515d6a47f6099efe97b5b6e0fe4543d0196b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 3 Jun 2019 09:04:47 -0400 Subject: [PATCH 301/741] Push some DkimSigner logic into a new DkimSignerBase class This is the next step toward implementing an ArcSigner which will share a lot of the same properties. --- MimeKit/Cryptography/DkimSigner.cs | 230 +---------------- MimeKit/Cryptography/DkimSignerBase.cs | 289 ++++++++++++++++++++++ MimeKit/Cryptography/DkimVerifierBase.cs | 4 +- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 2 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + 12 files changed, 306 insertions(+), 227 deletions(-) create mode 100644 MimeKit/Cryptography/DkimSignerBase.cs diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index e348a59283..4d9499e36e 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -29,14 +29,8 @@ using System.Linq; using System.Text; using System.Collections.Generic; -#if ENABLE_NATIVE_DKIM -using System.Security.Cryptography; -#endif using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.OpenSsl; -using Org.BouncyCastle.Crypto.Digests; -using Org.BouncyCastle.Crypto.Signers; using MimeKit.IO; using MimeKit.Utils; @@ -48,7 +42,7 @@ namespace MimeKit.Cryptography { /// /// A DKIM signer. /// - public class DkimSigner + public class DkimSigner : DkimSignerBase { static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; @@ -70,17 +64,8 @@ public class DkimSigner /// -or- /// is null. /// - protected DkimSigner (string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) + protected DkimSigner (string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (domain, selector, algorithm) { - if (domain == null) - throw new ArgumentNullException (nameof (domain)); - - if (selector == null) - throw new ArgumentNullException (nameof (selector)); - - SignatureAlgorithm = algorithm; - Selector = selector; - Domain = domain; } /// @@ -118,33 +103,6 @@ public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, D PrivateKey = key; } - static AsymmetricKeyParameter LoadPrivateKey (Stream stream) - { - AsymmetricKeyParameter key = null; - - using (var reader = new StreamReader (stream)) { - var pem = new PemReader (reader); - - var keyObject = pem.ReadObject (); - - if (keyObject != null) { - key = keyObject as AsymmetricKeyParameter; - - if (key == null) { - var pair = keyObject as AsymmetricCipherKeyPair; - - if (pair != null) - key = pair.Private; - } - } - } - - if (key == null || !key.IsPrivate) - throw new FormatException ("Private key not found."); - - return key; - } - #if !PORTABLE /// /// Initializes a new instance of the class. @@ -235,39 +193,6 @@ public DkimSigner (Stream stream, string domain, string selector, DkimSignatureA PrivateKey = LoadPrivateKey (stream); } - /// - /// Gets the private key. - /// - /// - /// The private key used for signing. - /// - /// The private key. - protected AsymmetricKeyParameter PrivateKey { - get; set; - } - - /// - /// Get the domain that the signer represents. - /// - /// - /// Gets the domain that the signer represents. - /// - /// The domain. - public string Domain { - get; private set; - } - - /// - /// Get the selector subdividing the domain. - /// - /// - /// Gets the selector subdividing the domain. - /// - /// The selector. - public string Selector { - get; private set; - } - /// /// Get or set the agent or user identifier. /// @@ -279,44 +204,6 @@ public string AgentOrUserIdentifier { get; set; } - /// - /// Get or set the algorithm to use for signing. - /// - /// - /// Gets or sets the algorithm to use for signing. - /// Creates a new . - /// Due to the recognized weakness of the SHA-1 hash algorithm - /// and the wide availability of the SHA-256 hash algorithm (it has been a required - /// part of DKIM since it was originally standardized in 2007), it is recommended - /// that NOT be used. - /// - /// The signature algorithm. - public DkimSignatureAlgorithm SignatureAlgorithm { - get; set; - } - - /// - /// Get or set the canonicalization algorithm to use for the message body. - /// - /// - /// Gets or sets the canonicalization algorithm to use for the message body. - /// - /// The canonicalization algorithm. - public DkimCanonicalizationAlgorithm BodyCanonicalizationAlgorithm { - get; set; - } - - /// - /// Get or set the canonicalization algorithm to use for the message headers. - /// - /// - /// Gets or sets the canonicalization algorithm to use for the message headers. - /// - /// The canonicalization algorithm. - public DkimCanonicalizationAlgorithm HeaderCanonicalizationAlgorithm { - get; set; - } - /// /// Get or set the public key query method. /// @@ -332,44 +219,7 @@ public string QueryMethod { get; set; } - /// - /// Create the digest signing context. - /// - /// - /// Creates a new digest signing context. - /// - /// The digest signer. - /// - /// The is not supported. - /// - internal protected virtual ISigner CreateSigningContext () - { -#if ENABLE_NATIVE_DKIM - return new SystemSecuritySigner (SignatureAlgorithm, PrivateKey.AsAsymmetricAlgorithm ()); -#else - ISigner signer; - - switch (SignatureAlgorithm) { - case DkimSignatureAlgorithm.RsaSha1: - signer = new RsaDigestSigner (new Sha1Digest ()); - break; - case DkimSignatureAlgorithm.RsaSha256: - signer = new RsaDigestSigner (new Sha256Digest ()); - break; - case DkimSignatureAlgorithm.Ed25519Sha256: - signer = new Ed25519DigestSigner (new Sha256Digest ()); - break; - default: - throw new NotSupportedException (string.Format ("{0} is not supported.", SignatureAlgorithm)); - } - - signer.Init (true, PrivateKey); - - return signer; -#endif - } - - void DkimSign (FormatOptions options, MimeMessage message, IList fields) + void DkimSign (FormatOptions options, MimeMessage message, IList headers) { if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) message.MimeVersion = new Version (1, 0); @@ -409,9 +259,9 @@ void DkimSign (FormatOptions options, MimeMessage message, IList fields) filtered.Add (options.CreateNewLineFilter ()); // write the specified message headers - DkimVerifierBase.WriteHeaders (options, message, fields, HeaderCanonicalizationAlgorithm, filtered); + DkimVerifierBase.WriteHeaders (options, message, headers, HeaderCanonicalizationAlgorithm, filtered); - value.AppendFormat ("; h={0}", string.Join (":", fields.ToArray ())); + value.AppendFormat ("; h={0}", string.Join (":", headers.ToArray ())); hash = message.HashBody (options, SignatureAlgorithm, BodyCanonicalizationAlgorithm, -1); value.AppendFormat ("; bh={0}", Convert.ToBase64String (hash)); @@ -611,74 +461,4 @@ public void Sign (MimeMessage message, IList headers) Sign (FormatOptions.Default, message, headers); } } - -#if ENABLE_NATIVE_DKIM - class SystemSecuritySigner : ISigner - { - readonly RSACryptoServiceProvider rsa; - readonly HashAlgorithm hash; - readonly string oid; - - public SystemSecuritySigner (DkimSignatureAlgorithm algorithm, AsymmetricAlgorithm key) - { - rsa = key as RSACryptoServiceProvider; - - switch (algorithm) { - case DkimSignatureAlgorithm.RsaSha256: - oid = SecureMimeContext.GetDigestOid (DigestAlgorithm.Sha256); - AlgorithmName = "RSASHA256"; - hash = SHA256.Create (); - break; - default: - oid = SecureMimeContext.GetDigestOid (DigestAlgorithm.Sha1); - AlgorithmName = "RSASHA1"; - hash = SHA1.Create (); - break; - } - } - - public string AlgorithmName { - get; private set; - } - - public void BlockUpdate (byte[] input, int inOff, int length) - { - hash.TransformBlock (input, inOff, length, null, 0); - } - - public byte[] GenerateSignature () - { - hash.TransformFinalBlock (new byte[0], 0, 0); - - return rsa.SignHash (hash.Hash, oid); - } - - public void Init (bool forSigning, ICipherParameters parameters) - { - throw new NotImplementedException (); - } - - public void Reset () - { - hash.Initialize (); - } - - public void Update (byte input) - { - hash.TransformBlock (new byte[] { input }, 0, 1, null, 0); - } - - public bool VerifySignature (byte[] signature) - { - hash.TransformFinalBlock (new byte[0], 0, 0); - - return rsa.VerifyHash (hash.Hash, oid, signature); - } - - public void Dispose () - { - rsa.Dispose (); - } - } -#endif } diff --git a/MimeKit/Cryptography/DkimSignerBase.cs b/MimeKit/Cryptography/DkimSignerBase.cs new file mode 100644 index 0000000000..0d85982db7 --- /dev/null +++ b/MimeKit/Cryptography/DkimSignerBase.cs @@ -0,0 +1,289 @@ +// +// DkimSignerBase.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Collections.Generic; +#if ENABLE_NATIVE_DKIM +using System.Security.Cryptography; +#endif + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.Crypto.Signers; + +using MimeKit.IO; +using MimeKit.Utils; + +namespace MimeKit.Cryptography { + /// + /// A base class for DKIM and ARC signers. + /// + /// + /// The base class for and . + /// + public abstract class DkimSignerBase + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. + /// + /// The domain that the signer represents. + /// The selector subdividing the domain. + /// The signature algorithm. + /// + /// is null. + /// -or- + /// is null. + /// + protected DkimSignerBase (string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) + { + if (domain == null) + throw new ArgumentNullException (nameof (domain)); + + if (selector == null) + throw new ArgumentNullException (nameof (selector)); + + SignatureAlgorithm = algorithm; + Selector = selector; + Domain = domain; + } + + /// + /// Get the domain that the signer represents. + /// + /// + /// Gets the domain that the signer represents. + /// + /// The domain. + public string Domain { + get; private set; + } + + /// + /// Get the selector subdividing the domain. + /// + /// + /// Gets the selector subdividing the domain. + /// + /// The selector. + public string Selector { + get; private set; + } + + /// + /// Get or set the algorithm to use for signing. + /// + /// + /// Gets or sets the algorithm to use for signing. + /// Creates a new . + /// Due to the recognized weakness of the SHA-1 hash algorithm + /// and the wide availability of the SHA-256 hash algorithm (it has been a required + /// part of DKIM since it was originally standardized in 2007), it is recommended + /// that NOT be used. + /// + /// The signature algorithm. + public DkimSignatureAlgorithm SignatureAlgorithm { + get; set; + } + + /// + /// Get or set the canonicalization algorithm to use for the message body. + /// + /// + /// Gets or sets the canonicalization algorithm to use for the message body. + /// + /// The canonicalization algorithm. + public DkimCanonicalizationAlgorithm BodyCanonicalizationAlgorithm { + get; set; + } + + /// + /// Get or set the canonicalization algorithm to use for the message headers. + /// + /// + /// Gets or sets the canonicalization algorithm to use for the message headers. + /// + /// The canonicalization algorithm. + public DkimCanonicalizationAlgorithm HeaderCanonicalizationAlgorithm { + get; set; + } + + /// + /// Gets the private key. + /// + /// + /// The private key used for signing. + /// + /// The private key. + protected AsymmetricKeyParameter PrivateKey { + get; set; + } + + internal static AsymmetricKeyParameter LoadPrivateKey (Stream stream) + { + AsymmetricKeyParameter key = null; + + using (var reader = new StreamReader (stream)) { + var pem = new PemReader (reader); + + var keyObject = pem.ReadObject (); + + if (keyObject != null) { + key = keyObject as AsymmetricKeyParameter; + + if (key == null) { + var pair = keyObject as AsymmetricCipherKeyPair; + + if (pair != null) + key = pair.Private; + } + } + } + + if (key == null || !key.IsPrivate) + throw new FormatException ("Private key not found."); + + return key; + } + + /// + /// Create the digest signing context. + /// + /// + /// Creates a new digest signing context. + /// + /// The digest signer. + /// + /// The is not supported. + /// + internal protected virtual ISigner CreateSigningContext () + { +#if ENABLE_NATIVE_DKIM + return new SystemSecuritySigner (SignatureAlgorithm, PrivateKey.AsAsymmetricAlgorithm ()); +#else + ISigner signer; + + switch (SignatureAlgorithm) { + case DkimSignatureAlgorithm.RsaSha1: + signer = new RsaDigestSigner (new Sha1Digest ()); + break; + case DkimSignatureAlgorithm.RsaSha256: + signer = new RsaDigestSigner (new Sha256Digest ()); + break; + case DkimSignatureAlgorithm.Ed25519Sha256: + signer = new Ed25519DigestSigner (new Sha256Digest ()); + break; + default: + throw new NotSupportedException (string.Format ("{0} is not supported.", SignatureAlgorithm)); + } + + signer.Init (true, PrivateKey); + + return signer; +#endif + } + } + +#if ENABLE_NATIVE_DKIM + class SystemSecuritySigner : ISigner + { + readonly RSACryptoServiceProvider rsa; + readonly HashAlgorithm hash; + readonly string oid; + + public SystemSecuritySigner (DkimSignatureAlgorithm algorithm, AsymmetricAlgorithm key) + { + rsa = key as RSACryptoServiceProvider; + + switch (algorithm) { + case DkimSignatureAlgorithm.RsaSha256: + oid = SecureMimeContext.GetDigestOid (DigestAlgorithm.Sha256); + AlgorithmName = "RSASHA256"; + hash = SHA256.Create (); + break; + default: + oid = SecureMimeContext.GetDigestOid (DigestAlgorithm.Sha1); + AlgorithmName = "RSASHA1"; + hash = SHA1.Create (); + break; + } + } + + public string AlgorithmName { + get; private set; + } + + public void BlockUpdate (byte[] input, int inOff, int length) + { + hash.TransformBlock (input, inOff, length, null, 0); + } + + public byte[] GenerateSignature () + { + hash.TransformFinalBlock (new byte[0], 0, 0); + + return rsa.SignHash (hash.Hash, oid); + } + + public void Init (bool forSigning, ICipherParameters parameters) + { + throw new NotImplementedException (); + } + + public void Reset () + { + hash.Initialize (); + } + + public void Update (byte input) + { + hash.TransformBlock (new byte[] { input }, 0, 1, null, 0); + } + + public bool VerifySignature (byte[] signature) + { + hash.TransformFinalBlock (new byte[0], 0, 0); + + return rsa.VerifyHash (hash.Hash, oid, signature); + } + + public void Dispose () + { + rsa.Dispose (); + } + } +#endif +} diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index c698798d79..cc463c3d6d 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -42,7 +42,7 @@ namespace MimeKit.Cryptography { /// - /// A base class for DKIM verifiers. + /// A base class for DKIM and ARC verifiers. /// /// /// The base class for and . @@ -61,7 +61,7 @@ public abstract class DkimVerifierBase /// /// is null. /// - public DkimVerifierBase (IDkimPublicKeyLocator publicKeyLocator) + protected DkimVerifierBase (IDkimPublicKeyLocator publicKeyLocator) { if (publicKeyLocator == null) throw new ArgumentNullException (nameof (publicKeyLocator)); diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 4e9024fb4d..c319a77c7c 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -86,6 +86,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 573330754b..c5c3bf1c7d 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -75,6 +75,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 729ab93237..616ca5059c 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -62,6 +62,7 @@ + @@ -83,6 +84,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 09be5d50f2..ddd3b9cd7e 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -67,6 +67,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index bcc0e136f8..00b106c665 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -72,6 +72,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index e7fbd4e9e8..a833a7e4b3 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -68,6 +68,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 9da86277d5..f0d6d7ade0 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -74,6 +74,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index bf21a5db24..f0e7578713 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -78,6 +78,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 21b715c798..a129cabc42 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -83,6 +83,7 @@ + From b5f55942617b04511a2ff05413237780ac54fde5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 3 Jun 2019 10:42:41 -0400 Subject: [PATCH 302/741] Implemented a base ArcSigner --- MimeKit/Cryptography/ArcSigner.cs | 646 ++++++++++++++++++++++ MimeKit/Cryptography/ArcVerifier.cs | 181 +++--- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + 10 files changed, 770 insertions(+), 65 deletions(-) create mode 100644 MimeKit/Cryptography/ArcSigner.cs diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs new file mode 100644 index 0000000000..bf4366f3ae --- /dev/null +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -0,0 +1,646 @@ +// +// ArcSigner.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Globalization; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Org.BouncyCastle.Crypto; + +using MimeKit.IO; +using MimeKit.Utils; + +namespace MimeKit.Cryptography { + /// + /// An ARC signer. + /// + /// + /// An ARC signer. + /// + public abstract class ArcSigner : DkimSignerBase + { + static readonly string[] ArcShouldNotInclude = { "arc-seal" }; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The domain that the signer represents. + /// The selector subdividing the domain. + /// The signature algorithm. + /// + /// is null. + /// -or- + /// is null. + /// + protected ArcSigner (string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (domain, selector, algorithm) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The signer's private key. + /// The domain that the signer represents. + /// The selector subdividing the domain. + /// The signature algorithm. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// is not a private key. + /// + protected ArcSigner (AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : this (domain, selector, algorithm) + { + if (key == null) + throw new ArgumentNullException (nameof (key)); + + if (!key.IsPrivate) + throw new ArgumentException ("The key must be a private key.", nameof (key)); + + PrivateKey = key; + } + +#if !PORTABLE + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The file containing the private key. + /// The domain that the signer represents. + /// The selector subdividing the domain. + /// The signature algorithm. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// is a zero-length string, contains only white space, or + /// contains one or more invalid characters as defined by + /// . + /// + /// + /// The file did not contain a private key. + /// + /// + /// is an invalid file path. + /// + /// + /// The specified file path could not be found. + /// + /// + /// The user does not have access to read the specified file. + /// + /// + /// An I/O error occurred. + /// + protected ArcSigner (string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : this (domain, selector, algorithm) + { + if (fileName == null) + throw new ArgumentNullException (nameof (fileName)); + + if (fileName.Length == 0) + throw new ArgumentException ("The file name cannot be empty.", nameof (fileName)); + + using (var stream = File.OpenRead (fileName)) + PrivateKey = LoadPrivateKey (stream); + } +#endif + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The stream containing the private key. + /// The domain that the signer represents. + /// The selector subdividing the domain. + /// The signature algorithm. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// The file did not contain a private key. + /// + /// + /// An I/O error occurred. + /// + protected ArcSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : this (domain, selector, algorithm) + { + if (stream == null) + throw new ArgumentNullException (nameof (stream)); + + PrivateKey = LoadPrivateKey (stream); + } + + /// + /// Generate an ARC-Authentication-Results header. + /// + /// + /// Generates an ARC-Authentication-Results header. + /// + /// The format options. + /// The message to create the ARC-Authentication-Results header for. + /// The ARC instance (the i= value to use). + /// The cancellation token. + /// The ARC-Authentication-Results header. + protected abstract Header GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken); + + /// + /// Asynchronously generate an ARC-Authentication-Results header. + /// + /// + /// Asynchronously generates an ARC-Authentication-Results header. + /// + /// The format options. + /// The message to create the ARC-Authentication-Results header for. + /// The ARC instance (the i= value to use). + /// The cancellation token. + /// The ARC-Authentication-Results header. + protected abstract Task
GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken); + + StringBuilder CreateArcHeaderBuilder (int instance) + { + var value = new StringBuilder (); + + value.AppendFormat ("i={0}", instance.ToString (CultureInfo.InvariantCulture)); + + switch (SignatureAlgorithm) { + case DkimSignatureAlgorithm.Ed25519Sha256: + value.Append ("; a=ed25519-sha256"); + break; + case DkimSignatureAlgorithm.RsaSha256: + value.Append ("; a=rsa-sha256"); + break; + default: + value.Append ("; a=rsa-sha1"); + break; + } + + return value; + } + + Header GenerateArcMessageSignature (FormatOptions options, MimeMessage message, int instance, TimeSpan t, IList headers) + { + if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) + message.MimeVersion = new Version (1, 0); + + var value = CreateArcHeaderBuilder (instance); + byte[] signature, hash; + Header ams; + + value.AppendFormat ("; d={0}; s={1}", Domain, Selector); + value.AppendFormat ("; c={0}/{1}", + HeaderCanonicalizationAlgorithm.ToString ().ToLowerInvariant (), + BodyCanonicalizationAlgorithm.ToString ().ToLowerInvariant ()); + value.AppendFormat ("; t={0}", (long) t.TotalSeconds); + + using (var stream = new DkimSignatureStream (CreateSigningContext ())) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + // write the specified message headers + DkimVerifierBase.WriteHeaders (options, message, headers, HeaderCanonicalizationAlgorithm, filtered); + + value.AppendFormat ("; h={0}", string.Join (":", headers.ToArray ())); + + hash = message.HashBody (options, SignatureAlgorithm, BodyCanonicalizationAlgorithm, -1); + value.AppendFormat ("; bh={0}", Convert.ToBase64String (hash)); + value.Append ("; b="); + + ams = new Header (HeaderId.ArcMessageSignature, value.ToString ()); + + switch (HeaderCanonicalizationAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, ams, true); + break; + default: + DkimVerifierBase.WriteHeaderSimple (options, filtered, ams, true); + break; + } + + filtered.Flush (); + } + + signature = stream.GenerateSignature (); + + ams.Value += Convert.ToBase64String (signature); + + return ams; + } + } + + Header GenerateArcSeal (FormatOptions options, int instance, TimeSpan t, ArcHeaderSet[] sets, int count, Header aar, Header ams) + { + var value = CreateArcHeaderBuilder (instance); + byte[] signature; + Header seal; + + // FIXME: where should this value come from? + value.Append ("; cv=pass"); + + value.AppendFormat ("; d={0}; s={1}", Domain, Selector); + value.AppendFormat ("; t={0}", (long) t.TotalSeconds); + + using (var stream = new DkimSignatureStream (CreateSigningContext ())) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + for (int i = 0; i < count; i++) { + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, sets[i].ArcAuthenticationResult, false); + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, sets[i].ArcMessageSignature, false); + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, sets[i].ArcSeal, false); + } + + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, aar, false); + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, ams, false); + + value.Append ("; b="); + + seal = new Header (HeaderId.ArcSeal, value.ToString ()); + DkimVerifierBase.WriteHeaderRelaxed (options, filtered, seal, true); + + filtered.Flush (); + } + + signature = stream.GenerateSignature (); + + seal.Value += Convert.ToBase64String (signature); + + return seal; + } + } + + async Task ArcSignAsync (FormatOptions options, MimeMessage message, IList headers, bool doAsync, CancellationToken cancellationToken) + { + ArcVerifier.GetArcHeaderSets (message, true, out ArcHeaderSet[] sets, out int count); + int instance = count + 1; + Header aar; + + if (doAsync) + aar = await GenerateArcAuthenticationResultsAsync (options, message, instance, cancellationToken).ConfigureAwait (false); + else + aar = GenerateArcAuthenticationResults (options, message, instance, cancellationToken); + + var t = DateTime.UtcNow - DateUtils.UnixEpoch; + var ams = GenerateArcMessageSignature (options, message, instance, t, headers); + var seal = GenerateArcSeal (options, instance, t, sets, count, aar, ams); + + message.Headers.Insert (0, aar); + message.Headers.Insert (0, ams); + message.Headers.Insert (0, seal); + } + + Task SignAsync (FormatOptions options, MimeMessage message, IList headers, bool doAsync, CancellationToken cancellationToken) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (message == null) + throw new ArgumentNullException (nameof (message)); + + if (headers == null) + throw new ArgumentNullException (nameof (headers)); + + var fields = new string[headers.Count]; + var containsFrom = false; + + for (int i = 0; i < headers.Count; i++) { + if (headers[i] == null) + throw new ArgumentException ("The list of headers cannot contain null.", nameof (headers)); + + if (headers[i].Length == 0) + throw new ArgumentException ("The list of headers cannot contain empty string.", nameof (headers)); + + fields[i] = headers[i].ToLowerInvariant (); + + if (ArcShouldNotInclude.Contains (fields[i])) + throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i]), nameof (headers)); + + if (fields[i] == "from") + containsFrom = true; + } + + if (!containsFrom) + throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); + + return ArcSignAsync (options, message, fields, doAsync, cancellationToken); + } + + Task SignAsync (FormatOptions options, MimeMessage message, IList headers, bool doAsync, CancellationToken cancellationToken) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (message == null) + throw new ArgumentNullException (nameof (message)); + + if (headers == null) + throw new ArgumentNullException (nameof (headers)); + + var fields = new string[headers.Count]; + var containsFrom = false; + + for (int i = 0; i < headers.Count; i++) { + if (headers[i] == HeaderId.Unknown) + throw new ArgumentException ("The list of headers to sign cannot include the 'Unknown' header.", nameof (headers)); + + fields[i] = headers[i].ToHeaderName ().ToLowerInvariant (); + + if (ArcShouldNotInclude.Contains (fields[i])) + throw new ArgumentException (string.Format ("The list of headers to sign SHOULD NOT include the '{0}' header.", headers[i].ToHeaderName ()), nameof (headers)); + + if (headers[i] == HeaderId.From) + containsFrom = true; + } + + if (!containsFrom) + throw new ArgumentException ("The list of headers to sign MUST include the 'From' header.", nameof (headers)); + + return ArcSignAsync (options, message, fields, doAsync, cancellationToken); + } + + /// + /// Digitally sign and seal a message using ARC. + /// + /// + /// Digitally signs and seals a message using ARC. + /// + /// The formatting options. + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public void Sign (FormatOptions options, MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + SignAsync (options, message, headers, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously digitally sign and seal a message using ARC. + /// + /// + /// Asynchronously digitally signs and seals a message using ARC. + /// + /// The formatting options. + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public Task SignAsync (FormatOptions options, MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + return SignAsync (options, message, headers, true, cancellationToken); + } + + /// + /// Digitally sign and seal a message using ARC. + /// + /// + /// Digitally signs and seals a message using ARC. + /// + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public void Sign (MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + SignAsync (FormatOptions.Default, message, headers, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously digitally sign and seal a message using ARC. + /// + /// + /// Asynchronously digitally signs and seals a message using ARC. + /// + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public Task SignAsync (MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + return SignAsync (FormatOptions.Default, message, headers, true, cancellationToken); + } + + /// + /// Digitally sign and seal a message using ARC. + /// + /// + /// Digitally signs and seals a message using ARC. + /// + /// The formatting options. + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public void Sign (FormatOptions options, MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + SignAsync (options, message, headers, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously digitally sign and seal a message using ARC. + /// + /// + /// Asynchronously digitally signs and seals a message using ARC. + /// + /// The formatting options. + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public Task SignAsync (FormatOptions options, MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + return SignAsync (options, message, headers, true, cancellationToken); + } + + /// + /// Digitally sign and seal a message using ARC. + /// + /// + /// Digitally signs and seals a message using ARC. + /// + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public void Sign (MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + Sign (FormatOptions.Default, message, headers, cancellationToken); + } + + /// + /// Asynchronously digitally sign and seal a message using ARC. + /// + /// + /// Asynchronously digitally signs and seals a message using ARC. + /// + /// The message to sign. + /// The list of header fields to sign. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain the 'From' header. + /// -or- + /// contains one or more of the following headers: Return-Path, + /// Received, Comments, Keywords, Bcc, Resent-Bcc, or DKIM-Signature. + /// + /// + /// One or more ARC headers either did not contain an instance tag or the instance tag was invalid. + /// + public Task SignAsync (MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) + { + return SignAsync (FormatOptions.Default, message, headers, cancellationToken); + } + } +} diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 7447d01e17..10c8ccb573 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -60,6 +60,49 @@ public enum ArcValidationResult Fail } + internal class ArcHeaderSet + { + public Dictionary ArcAuthenticationResultParameters { get; private set; } + public Header ArcAuthenticationResult { get; private set; } + + public Dictionary ArcMessageSignatureParameters { get; private set; } + public Header ArcMessageSignature { get; private set; } + + public Dictionary ArcSealParameters { get; private set; } + public Header ArcSeal { get; private set; } + + public bool Add (Header header, Dictionary parameters) + { + switch (header.Id) { + case HeaderId.ArcAuthenticationResults: + if (ArcAuthenticationResult != null) + return false; + + ArcAuthenticationResultParameters = parameters; + ArcAuthenticationResult = header; + break; + case HeaderId.ArcMessageSignature: + if (ArcMessageSignature != null) + return false; + + ArcMessageSignatureParameters = parameters; + ArcMessageSignature = header; + break; + case HeaderId.ArcSeal: + if (ArcSeal != null) + return false; + + ArcSealParameters = parameters; + ArcSeal = header; + break; + default: + return false; + } + + return true; + } + } + /// /// An ARC verifier. /// @@ -82,49 +125,6 @@ public ArcVerifier (IDkimPublicKeyLocator publicKeyLocator) : base (publicKeyLoc { } - class ArcHeaderSet - { - public Dictionary ArcAuthenticationResultParameters { get; private set; } - public Header ArcAuthenticationResult { get; private set; } - - public Dictionary ArcMessageSignatureParameters { get; private set; } - public Header ArcMessageSignature { get; private set; } - - public Dictionary ArcSealParameters { get; private set; } - public Header ArcSeal { get; private set; } - - public bool Add (Header header, Dictionary parameters) - { - switch (header.Id) { - case HeaderId.ArcAuthenticationResults: - if (ArcAuthenticationResult != null) - return false; - - ArcAuthenticationResultParameters = parameters; - ArcAuthenticationResult = header; - break; - case HeaderId.ArcMessageSignature: - if (ArcMessageSignature != null) - return false; - - ArcMessageSignatureParameters = parameters; - ArcMessageSignature = header; - break; - case HeaderId.ArcSeal: - if (ArcSeal != null) - return false; - - ArcSealParameters = parameters; - ArcSeal = header; - break; - default: - return false; - } - - return true; - } - } - static void ValidateArcMessageSignatureParameters (IDictionary parameters, out DkimSignatureAlgorithm algorithm, out DkimCanonicalizationAlgorithm headerAlgorithm, out DkimCanonicalizationAlgorithm bodyAlgorithm, out string d, out string s, out string q, out string[] headers, out string bh, out string b, out int maxLength) { @@ -245,23 +245,18 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, } } - async Task VerifyAsync (FormatOptions options, MimeMessage message, bool doAsync, CancellationToken cancellationToken) + internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool throwOnError, out ArcHeaderSet[] sets, out int count) { - if (options == null) - throw new ArgumentNullException (nameof (options)); - - if (message == null) - throw new ArgumentNullException(nameof(message)); - - var sets = new ArcHeaderSet[50]; ArcHeaderSet set; - int newest = -1; + + sets = new ArcHeaderSet[50]; + count = 0; for (int i = 0; i < message.Headers.Count; i++) { Dictionary parameters = null; var header = message.Headers[i]; string value; - int inst; + int instance; switch (header.Id) { case HeaderId.ArcAuthenticationResults: @@ -270,6 +265,9 @@ async Task VerifyAsync (FormatOptions options, MimeMessage try { parameters = ParseParameterTags (header.Id, header.Value); } catch { + if (throwOnError) + throw; + return ArcValidationResult.Fail; } break; @@ -278,39 +276,74 @@ async Task VerifyAsync (FormatOptions options, MimeMessage if (parameters == null) continue; - if (!parameters.TryGetValue ("i", out value)) - return ArcValidationResult.Fail; + if (!parameters.TryGetValue ("i", out value)) { + if (throwOnError) + throw new FormatException (string.Format ("Missing instance tag in {0} header.", header.Id.ToHeaderName ())); - if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out inst) || inst < 1 || inst > 50) return ArcValidationResult.Fail; + } + + if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out instance) || instance < 1 || instance > 50) { + if (throwOnError) + throw new FormatException (string.Format ("Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); - inst--; + return ArcValidationResult.Fail; + } - set = sets[inst]; + set = sets[instance - 1]; if (set == null) - sets[inst] = set = new ArcHeaderSet (); + sets[instance - 1] = set = new ArcHeaderSet (); if (!set.Add (header, parameters)) return ArcValidationResult.Fail; - if (inst >= newest) - newest = inst; + if (instance > count) + count = instance; } - if (newest == -1) { + if (count == 0) { // there are no ARC sets return ArcValidationResult.None; } // verify that all ARC sets are complete - for (int i = 0; i <= newest; i++) { + for (int i = 0; i < count; i++) { set = sets[i]; - if (sets == null || set.ArcAuthenticationResult == null || set.ArcMessageSignature == null || set.ArcSeal == null) + if (set == null) { + if (throwOnError) + throw new FormatException (string.Format ("Missing ARC headers for i={0}", i + 1)); + + return ArcValidationResult.Fail; + } + + if (set.ArcAuthenticationResult == null) { + if (throwOnError) + throw new FormatException (string.Format ("Missing ARC-Authentication-Results header for i={0}", i + 1)); + + return ArcValidationResult.Fail; + } + + if (set.ArcMessageSignature == null) { + if (throwOnError) + throw new FormatException (string.Format ("Missing ARC-Message-Signature header for i={0}", i + 1)); + + return ArcValidationResult.Fail; + } + + if (set.ArcSeal == null) { + if (throwOnError) + throw new FormatException (string.Format ("Missing ARC-Seal header for i={0}", i + 1)); + return ArcValidationResult.Fail; + } + + if (!set.ArcSealParameters.TryGetValue ("cv", out string cv)) { + if (throwOnError) + throw new FormatException (string.Format ("Missing chain validation tag in ARC-Seal header for i={0}.", i + 1)); - if (!set.ArcSealParameters.TryGetValue ("cv", out string cv)) return ArcValidationResult.Fail; + } // The "cv" value for all ARC-Seal header fields MUST NOT be // "fail". For ARC Sets with instance values > 1, the values @@ -320,6 +353,24 @@ async Task VerifyAsync (FormatOptions options, MimeMessage return ArcValidationResult.Fail; } + return ArcValidationResult.Pass; + } + + async Task VerifyAsync (FormatOptions options, MimeMessage message, bool doAsync, CancellationToken cancellationToken) + { + if (options == null) + throw new ArgumentNullException (nameof (options)); + + if (message == null) + throw new ArgumentNullException(nameof(message)); + + switch (GetArcHeaderSets (message, false, out ArcHeaderSet[] sets, out int count)) { + case ArcValidationResult.None: return ArcValidationResult.None; + case ArcValidationResult.Fail: return ArcValidationResult.Fail; + } + + int newest = count - 1; + // validate the most recent Arc-Message-Signature try { var parameters = sets[newest].ArcMessageSignatureParameters; diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index c319a77c7c..b062378d93 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -65,6 +65,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index c5c3bf1c7d..ad324d9160 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -54,6 +54,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index ddd3b9cd7e..13eefe6221 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -47,6 +47,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 00b106c665..4ad4359f55 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -54,6 +54,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index a833a7e4b3..b12bf66441 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -47,6 +47,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index f0d6d7ade0..fa4528de98 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -53,6 +53,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index f0e7578713..9deecdf31e 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -60,6 +60,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index a129cabc42..a57e389bfa 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -62,6 +62,7 @@ + From f4f8f4d371cf639f6577f006175419cb041eb66f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 13:08:40 -0400 Subject: [PATCH 303/741] minor documentation fixes --- MimeKit/ContentType.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index c6ada9854a..98edbc3d94 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -462,7 +462,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index /// Parses a Content-Type value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The parser options. /// The input buffer. /// The starting index of the input buffer. @@ -493,7 +493,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde /// Parses a Content-Type value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The input buffer. /// The starting index of the input buffer. /// The number of bytes in the input buffer to parse. @@ -516,7 +516,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Cont /// /// Parses a Content-Type value from the supplied buffer starting at the specified index. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The parser options. /// The input buffer. /// The starting index of the input buffer. @@ -544,7 +544,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde /// /// Parses a Content-Type value from the supplied buffer starting at the specified index. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The input buffer. /// The starting index of the input buffer. /// The parsed content type. @@ -565,7 +565,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out ContentType type /// /// Parses a Content-Type value from the specified buffer. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The parser options. /// The input buffer. /// The parsed content type. @@ -589,7 +589,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out ContentTy /// /// Parses a Content-Type value from the specified buffer. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The input buffer. /// The parsed content type. /// @@ -606,7 +606,7 @@ public static bool TryParse (byte[] buffer, out ContentType type) /// /// Parses a Content-Type value from the specified text. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// THe parser options. /// The text to parse. /// The parsed content type. @@ -631,7 +631,7 @@ public static bool TryParse (ParserOptions options, string text, out ContentType /// /// Parses a Content-Type value from the specified text. /// - /// true, if the content type was successfully parsed, false otherwise. + /// true if the content type was successfully parsed; otherwise, false. /// The text to parse. /// The parsed content type. /// From f1074e972b6a9dbd2ea4cb2e63a4bbdd403cb648 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 13:53:03 -0400 Subject: [PATCH 304/741] Improved docs for ContentDisposition --- MimeKit/ContentDisposition.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index b3243b7570..80f273193d 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -520,7 +520,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index /// Parses a Content-Disposition value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The parser options. /// The input buffer. /// The starting index of the input buffer. @@ -551,7 +551,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde /// Parses a Content-Disposition value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The input buffer. /// The starting index of the input buffer. /// The number of bytes in the input buffer to parse. @@ -574,7 +574,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Cont /// /// Parses a Content-Disposition value from the supplied buffer starting at the specified index. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The parser options. /// The input buffer. /// The starting index of the input buffer. @@ -602,7 +602,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde /// /// Parses a Content-Disposition value from the supplied buffer starting at the specified index. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The input buffer. /// The starting index of the input buffer. /// The parsed disposition. @@ -623,7 +623,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out ContentDispositi /// /// Parses a Content-Disposition value from the specified buffer. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The parser options. /// The input buffer. /// The parsed disposition. @@ -647,7 +647,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out ContentDi /// /// Parses a Content-Disposition value from the specified buffer. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The input buffer. /// The parsed disposition. /// @@ -664,7 +664,7 @@ public static bool TryParse (byte[] buffer, out ContentDisposition disposition) /// /// Parses a Content-Disposition value from the supplied text. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The parser options. /// The text to parse. /// The parsed disposition. @@ -689,7 +689,7 @@ public static bool TryParse (ParserOptions options, string text, out ContentDisp /// /// Parses a Content-Disposition value from the supplied text. /// - /// true, if the disposition was successfully parsed, false otherwise. + /// true if the disposition was successfully parsed; otherwise, false. /// The text to parse. /// The parsed disposition. /// From f371e0acb2089c50f28613da80a85f8451b66b3d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 15:41:44 -0400 Subject: [PATCH 305/741] Added an [ARC-]Authentication-Results header parser --- MimeKit/Cryptography/ArcVerifier.cs | 58 +- MimeKit/Cryptography/AuthenticationResults.cs | 1152 +++++++ MimeKit/Header.cs | 75 +- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + MimeKit/MimeKitLite.Android.csproj | 1 + MimeKit/MimeKitLite.Net45.csproj | 1 + MimeKit/MimeKitLite.NetStandard.csproj | 1 + MimeKit/MimeKitLite.Portable.csproj | 1 + MimeKit/MimeKitLite.WindowsUniversal81.csproj | 1 + MimeKit/MimeKitLite.iOS.csproj | 1 + MimeKit/Utils/StringBuilderExtensions.cs | 19 + .../AuthenticationResultsTests.cs | 715 ++++ UnitTests/Cryptography/DummyArcSigner.cs | 78 + UnitTests/HeaderTests.cs | 2 +- UnitTests/UnitTests.csproj | 2 + rfc/rfc7601.txt | 2971 +++++++++++++++++ 24 files changed, 5001 insertions(+), 86 deletions(-) create mode 100644 MimeKit/Cryptography/AuthenticationResults.cs create mode 100644 UnitTests/Cryptography/AuthenticationResultsTests.cs create mode 100644 UnitTests/Cryptography/DummyArcSigner.cs create mode 100644 rfc/rfc7601.txt diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 10c8ccb573..3656d27545 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -62,7 +62,6 @@ public enum ArcValidationResult internal class ArcHeaderSet { - public Dictionary ArcAuthenticationResultParameters { get; private set; } public Header ArcAuthenticationResult { get; private set; } public Dictionary ArcMessageSignatureParameters { get; private set; } @@ -78,7 +77,6 @@ public bool Add (Header header, Dictionary parameters) if (ArcAuthenticationResult != null) return false; - ArcAuthenticationResultParameters = parameters; ArcAuthenticationResult = header; break; case HeaderId.ArcMessageSignature: @@ -255,11 +253,34 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool for (int i = 0; i < message.Headers.Count; i++) { Dictionary parameters = null; var header = message.Headers[i]; - string value; int instance; + string value; switch (header.Id) { case HeaderId.ArcAuthenticationResults: + if (!AuthenticationResults.TryParse (header.RawValue, out AuthenticationResults authres)) { + if (throwOnError) + throw new FormatException ("Invalid ARC-AUthentication-Results header."); + + return ArcValidationResult.Fail; + } + + if (!authres.Instance.HasValue) { + if (throwOnError) + throw new FormatException ("Missing instance tag in ARC-Authentication-Results header."); + + return ArcValidationResult.Fail; + } + + instance = authres.Instance.Value; + + if (instance < 1 || instance > 50) { + if (throwOnError) + throw new FormatException (string.Format ("Invalid instance tag in ARC-Authentication-Results header: i={0}", instance)); + + return ArcValidationResult.Fail; + } + break; case HeaderId.ArcMessageSignature: case HeaderId.ArcSeal: try { @@ -270,26 +291,29 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool return ArcValidationResult.Fail; } - break; - } - - if (parameters == null) - continue; - if (!parameters.TryGetValue ("i", out value)) { - if (throwOnError) - throw new FormatException (string.Format ("Missing instance tag in {0} header.", header.Id.ToHeaderName ())); + if (!parameters.TryGetValue ("i", out value)) { + if (throwOnError) + throw new FormatException (string.Format ("Missing instance tag in {0} header.", header.Id.ToHeaderName ())); - return ArcValidationResult.Fail; - } + return ArcValidationResult.Fail; + } - if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out instance) || instance < 1 || instance > 50) { - if (throwOnError) - throw new FormatException (string.Format ("Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); + if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out instance) || instance < 1 || instance > 50) { + if (throwOnError) + throw new FormatException (string.Format ("Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); - return ArcValidationResult.Fail; + return ArcValidationResult.Fail; + } + break; + default: + instance = 0; + break; } + if (instance == 0) + continue; + set = sets[instance - 1]; if (set == null) sets[instance - 1] = set = new ArcHeaderSet (); diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs new file mode 100644 index 0000000000..7c5a58a57e --- /dev/null +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -0,0 +1,1152 @@ +// +// AuthenticationResults.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Text; +using System.Globalization; +using System.Collections.Generic; + +#if PORTABLE +using Encoding = Portable.Text.Encoding; +#endif + +using MimeKit.Utils; + +namespace MimeKit.Cryptography { + /// + /// A parsed representation of the Authentication-Results header. + /// + /// + /// The Authentication-Results header is used with electronic mail messages to + /// indicate the results of message authentication efforts. Any receiver-side + /// software, such as mail filters or Mail User Agents (MUAs), can use this header + /// field to relay that information in a convenient and meaningful way to users or + /// to make sorting and filtering decisions. + /// + public class AuthenticationResults + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The authentication service identifier. + /// + /// is null. + /// + public AuthenticationResults (string authservid) + { + if (authservid == null) + throw new ArgumentNullException (nameof (authservid)); + + Results = new List (); + AuthenticationServiceIdentifier = authservid; + } + + /// + /// Get the authentication service identifier. + /// + /// + /// Gets the authentication service identifier. + /// The authentication service identifier is the authserv-id token + /// as defined in rfc7601. + /// + /// The authserv-id token. + public string AuthenticationServiceIdentifier { + get; private set; + } + + /// + /// Get or set the instance value. + /// + /// + /// Gets or sets the instance value. + /// This value will only be set if the + /// represents an ARC-Authentication-Results header value. + /// + /// The instance. + public int? Instance { + get; set; + } + + /// + /// Get or set the Authentication-Results version. + /// + /// + /// Gets or sets the Authentication-Results version. + /// The version value is the authres-version token as defined in + /// rfc7601. + /// + /// The authres-version token. + public int? Version { + get; set; + } + + /// + /// Get the list of authentication results. + /// + /// + /// Gets the list of authentication results. + /// + /// The list of authentication results. + public List Results { + get; private set; + } + + internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + { + int space = 0; + + if (Instance.HasValue) { + var i = Instance.Value.ToString (CultureInfo.InvariantCulture); + + builder.AppendFormat (" i={0};", i); + + lineLength += 4 + i.Length; + space = 1; + } + + if (lineLength + space + AuthenticationServiceIdentifier.Length > options.MaxLineLength) { + builder.Append (options.NewLine); + builder.Append ('\t'); + lineLength = 1; + space = 0; + } + + if (space > 0) { + builder.Append (' '); + lineLength++; + } + + builder.Append (AuthenticationServiceIdentifier); + lineLength += AuthenticationServiceIdentifier.Length; + + if (Version.HasValue) { + var version = Version.Value.ToString (CultureInfo.InvariantCulture); + + if (lineLength + 1 + version.Length > options.MaxLineLength) { + builder.Append (options.NewLine); + builder.Append ('\t'); + lineLength = 1; + } else { + builder.Append (' '); + lineLength++; + } + + builder.Append (version); + } + + if (Results.Count > 0) { + for (int i = 0; i < Results.Count; i++) + Results[i].Encode (options, builder, ref lineLength); + } else { + builder.Append ("; none"); + } + + builder.Append (options.NewLine); + } + + /// + /// Serializes the to a string. + /// + /// + /// Creates a string-representation of the . + /// + /// The serialized string. + public override string ToString () + { + var builder = new StringBuilder (); + + if (Instance.HasValue) + builder.AppendFormat ("i={0}; ", Instance.Value.ToString (CultureInfo.InvariantCulture)); + + builder.Append (AuthenticationServiceIdentifier); + + if (Version.HasValue) { + builder.Append (' '); + builder.Append (Version.Value.ToString (CultureInfo.InvariantCulture)); + } + + if (Results.Count > 0) { + for (int i = 0; i < Results.Count; i++) { + builder.Append ("; "); + builder.Append (Results[i]); + } + } else { + builder.Append ("; none"); + } + + return builder.ToString (); + } + + static bool IsKeyword (byte c) + { + return (c >= (byte) 'A' && c <= (byte) 'Z') || + (c >= (byte) 'a' && c <= (byte) 'z') || + (c >= (byte) '0' && c <= (byte) '9') || + c == (byte) '-'; + } + + static bool SkipKeyword (byte[] text, ref int index, int endIndex) + { + int startIndex = index; + + while (index < endIndex && IsKeyword (text[index])) + index++; + + return index > startIndex; + } + + static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnError, out AuthenticationResults authres) + { + int? instance = null; + string srvid = null; + string value; + + authres = null; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + do { + // we're either at the start of the authserv-id token or "i=#;" (if we're parsing an ARC-Authentication-Results header) + if (index < endIndex && text[index] == (byte) '"') { + int start = index; + + if (!ParseUtils.SkipQuoted (text, ref index, endIndex, throwOnError)) + return false; + + srvid = MimeUtils.Unquote (Encoding.UTF8.GetString (text, start, index - start)); + } else { + int start = index; + + if (!ParseUtils.SkipToken (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete authserv-id token at offset {0}", start), start, index); + + return false; + } + + value = Encoding.UTF8.GetString (text, start, index - start); + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index < endIndex && text[index] == (byte) '=') { + // probably i=# + if (instance.HasValue) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid token at offset {0}", start), start, index); + + return false; + } + + if (value != "i") { + if (throwOnError) + throw new ParseException (string.Format ("Invalid instance token at offset {0}", start), start, index); + + return false; + } + + // skip over '=' + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + start = index; + + if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int i)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid instance value at offset {0}", start), start, index); + + return false; + } + + instance = i; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Missing semi-colon after instance value at offset {0}", start), start, index); + + return false; + } + + if (text[index] != ';') { + if (throwOnError) + throw new ParseException (string.Format ("Unexpected token after instance value at offset {0}", index), index, index); + + return false; + } + + // skip over ';' + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + } else { + srvid = value; + } + } + } while (srvid == null); + + authres = new AuthenticationResults (srvid) { Instance = instance }; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) + return true; + + if (text[index] != (byte) ';') { + // might be the authres-version token + int start = index; + + if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int version)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid authres-version at offset {0}", start), start, index); + + return false; + } + + authres.Version = version; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) + return true; + + if (text[index] != (byte) ';') { + if (throwOnError) + throw new ParseException (string.Format ("Unknown token at offset {0}", index), index, index); + + return false; + } + } + + // skip the ';' + index++; + + while (index < endIndex) { + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) + break; + + int methodIndex = index; + + // skip the method name + if (!SkipKeyword (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid method token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + var method = Encoding.ASCII.GetString (text, methodIndex, index - methodIndex); + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (method != "none") { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + if (authres.Results.Count > 0) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid no-result token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + break; + } + + var resinfo = new AuthenticationMethodResult (method); + authres.Results.Add (resinfo); + + int tokenIndex; + + if (text[index] == (byte) '/') { + // optional method-version token + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + tokenIndex = index; + + if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int version)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid method-version token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + resinfo.Version = version; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + } + + if (text[index] != (byte) '=') { + if (throwOnError) + throw new ParseException (string.Format ("Invalid methodspec token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + // skip over '=' + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + tokenIndex = index; + + if (!SkipKeyword (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid result token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + resinfo.Result = Encoding.ASCII.GetString (text, tokenIndex, index - tokenIndex); + + ParseUtils.SkipWhiteSpace (text, ref index, endIndex); + + if (index < endIndex && text[index] == '(') { + int commentIndex = index; + + if (!ParseUtils.SkipComment (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete comment token at offset {0}", commentIndex), commentIndex, index); + + return false; + } + + commentIndex++; + + resinfo.ResultComment = Encoding.UTF8.GetString (text, commentIndex, (index - 1) - commentIndex); + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + } + + if (index >= endIndex) + break; + + if (text[index] == (byte) ';') { + index++; + continue; + } + + // optional reasonspec or propspec + tokenIndex = index; + + if (!SkipKeyword (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid reasonspec or propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + value = Encoding.ASCII.GetString (text, tokenIndex, index - tokenIndex); + + if (value == "reason") { + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete reasonspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + if (text[index] != (byte) '=') { + if (throwOnError) + throw new ParseException (string.Format ("Invalid reasonspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index < endIndex && text[index] == (byte) '"') { + int start = index; + + if (!ParseUtils.SkipQuoted (text, ref index, endIndex, throwOnError)) + return false; + + resinfo.Reason = MimeUtils.Unquote (Encoding.UTF8.GetString (text, start, index - start)); + } else { + int start = index; + + if (!ParseUtils.SkipToken (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid reasonspec value token at offset {0}", start), start, index); + + return false; + } + + resinfo.Reason = Encoding.UTF8.GetString (text, start, index - start); + } + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) + break; + + if (text[index] == (byte) ';') { + index++; + continue; + } + + // optional propspec + tokenIndex = index; + + if (!SkipKeyword (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + value = Encoding.ASCII.GetString (text, tokenIndex, index - tokenIndex); + } + + do { + // value is a propspec ptype token + var ptype = value; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + if (text[index] != (byte) '.') { + if (throwOnError) + throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + int propertyIndex = index; + + if (!SkipKeyword (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid property token at offset {0}", propertyIndex), propertyIndex, index); + + return false; + } + + var property = Encoding.ASCII.GetString (text, propertyIndex, index - propertyIndex); + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + if (text[index] != (byte) '=') { + if (throwOnError) + throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + int valueIndex = index; + + while (index < endIndex && text[index] != ';' && !text[index].IsWhitespace ()) + index++; + + if (index == valueIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + value = Encoding.UTF8.GetString (text, valueIndex, index - valueIndex); + + var propspec = new AuthenticationMethodProperty (ptype, property, value); + resinfo.Properties.Add (propspec); + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex || text[index] == (byte) ';') + break; + + tokenIndex = index; + + if (!SkipKeyword (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + + return false; + } + + value = Encoding.ASCII.GetString (text, tokenIndex, index - tokenIndex); + } while (true); + + // skip over ';' + index++; + } + + return true; + } + + /// + /// Tries to parse the given input buffer into a new instance. + /// + /// + /// Parses an Authentication-Results header value from the supplied buffer starting at the given index + /// and spanning across the specified number of bytes. + /// + /// true if the authentication results were successfully parsed; otherwise, false. + /// The input buffer. + /// The starting index of the input buffer. + /// The number of bytes in the input buffer to parse. + /// The parsed authentication results. + /// + /// is null. + /// + /// + /// and do not specify + /// a valid range in the byte array. + /// + public static bool TryParse (byte[] buffer, int startIndex, int length, out AuthenticationResults authres) + { + ParseUtils.ValidateArguments (buffer, startIndex, length); + + int index = startIndex; + + return TryParse (buffer, ref index, startIndex + length, false, out authres); + } + + /// + /// Tries to parse the given input buffer into a new instance. + /// + /// + /// Parses an Authentication-Results header value from the supplied buffer. + /// + /// true if the authentication results were successfully parsed; otherwise, false. + /// The input buffer. + /// The parsed authentication results. + /// + /// is null. + /// + public static bool TryParse (byte[] buffer, out AuthenticationResults authres) + { + if (buffer == null) + throw new ArgumentNullException (nameof (buffer)); + + int index = 0; + + return TryParse (buffer, ref index, buffer.Length, false, out authres); + } + + /// + /// Parse the specified input buffer into a new instance of the class. + /// + /// + /// Parses an Authentication-Results header value from the supplied buffer starting at the given index + /// and spanning across the specified number of bytes. + /// + /// The parsed . + /// The input buffer. + /// The start index of the buffer. + /// The length of the buffer. + /// + /// is null. + /// + /// + /// and do not specify + /// a valid range in the byte array. + /// + /// + /// The could not be parsed. + /// + public static AuthenticationResults Parse (byte[] buffer, int startIndex, int length) + { + ParseUtils.ValidateArguments (buffer, startIndex, length); + + AuthenticationResults authres; + int index = startIndex; + + TryParse (buffer, ref index, startIndex + length, true, out authres); + + return authres; + } + + /// + /// Parse the specified input buffer into a new instance of the class. + /// + /// + /// Parses an Authentication-Results header value from the supplied buffer. + /// + /// The parsed . + /// The input buffer. + /// + /// is null. + /// + /// + /// The could not be parsed. + /// + public static AuthenticationResults Parse (byte[] buffer) + { + if (buffer == null) + throw new ArgumentNullException (nameof (buffer)); + + AuthenticationResults authres; + int index = 0; + + TryParse (buffer, ref index, buffer.Length, true, out authres); + + return authres; + } + } + + /// + /// An authentication method results. + /// + /// + /// An authentication method results. + /// + public class AuthenticationMethodResult + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The method used for authentication. + /// + /// is null. + /// + internal AuthenticationMethodResult (string method) + { + if (method == null) + throw new ArgumentNullException (nameof (method)); + + Properties = new List (); + Method = method; + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The method used for authentication. + /// The result of the authentication method. + /// + /// is null. + /// -or- + /// is null. + /// + public AuthenticationMethodResult (string method, string result) : this (method) + { + if (result == null) + throw new ArgumentNullException (nameof (result)); + + Result = result; + } + + /// + /// Get the authentication method. + /// + /// + /// Gets the authentication method. + /// + /// The authentication method. + public string Method { + get; private set; + } + + /// + /// Get the authentication method version. + /// + /// + /// Gets the authentication method version. + /// + /// The authentication method version. + public int? Version { + get; set; + } + + /// + /// Get the authentication method results. + /// + /// + /// Gets the authentication method results. + /// + /// The authentication method results. + public string Result { + get; internal set; + } + + /// + /// Get the comment regarding the authentication method result. + /// + /// + /// Gets the comment regarding the authentication method result. + /// + /// THe comment regarding the authentication method result. + public string ResultComment { + get; set; + } + + /// + /// Get the reason for the authentication method result. + /// + /// + /// Gets the reason for the authentication method result. + /// + /// The reason for the authentication method result. + public string Reason { + get; set; + } + + /// + /// Get the properties used by the authentication method. + /// + /// + /// Gets the properties used by the authentication method. + /// + /// The properties used by the authentication method. + public List Properties { + get; private set; + } + + internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + { + builder.Append (';'); + lineLength++; + + // try to put the entire result on 1 line + var complete = ToString (); + + if (complete.Length < options.MaxLineLength) { + // if it fits, it sits... + if (lineLength + complete.Length + 1 > options.MaxLineLength) { + builder.Append (options.NewLine); + builder.Append ('\t'); + lineLength = 1; + } else { + builder.Append (' '); + lineLength++; + } + + lineLength += complete.Length; + builder.Append (complete); + return; + } + + var tokens = new List (); + + if (Version.HasValue) { + var version = Version.Value.ToString (CultureInfo.InvariantCulture); + var combinedLength = Method.Length + 1 + version.Length + 1 + Result.Length; + + if (combinedLength > options.MaxLineLength) { + // we will have to break this up into individual tokens + tokens.Add (Method); + tokens.Add ("/"); + tokens.Add (version); + tokens.Add ("="); + tokens.Add (Result); + } else { + tokens.Add (string.Format ("{0}/{1}={2}", Method, version, Result)); + } + } else { + var combinedLength = Method.Length + 1 + Result.Length; + + if (combinedLength > options.MaxLineLength) { + // we will have to break this up into individual tokens + tokens.Add (Method); + tokens.Add ("="); + tokens.Add (Result); + } else { + tokens.Add (string.Format ("{0}={1}", Method, Result)); + } + } + + builder.AppendTokens (options, ref lineLength, tokens, true); + tokens.Clear (); + + if (!string.IsNullOrEmpty (ResultComment)) { + if (lineLength + ResultComment.Length + 3 > options.MaxLineLength) { + builder.Append (options.NewLine); + builder.Append ('\t'); + lineLength = 1; + } else { + builder.Append (' '); + lineLength++; + } + + lineLength += ResultComment.Length + 2; + builder.Append ('('); + builder.Append (ResultComment); + builder.Append (')'); + } + + if (!string.IsNullOrEmpty (Reason)) { + var reason = MimeUtils.Quote (Reason); + var combinedLength = "reason=".Length + reason.Length; + + tokens.Clear (); + if (combinedLength > options.MaxLineLength) { + // we will have to break this up into individual tokens + tokens.Add ("reason="); + tokens.Add (reason); + } else { + tokens.Add ("reason=" + reason); + } + + builder.AppendTokens (options, ref lineLength, tokens); + tokens.Clear (); + } + + for (int i = 0; i < Properties.Count; i++) + Properties[i].Encode (options, builder, ref lineLength); + } + + /// + /// Serializes the to a string. + /// + /// + /// Creates a string-representation of the . + /// + /// The serialized string. + public override string ToString () + { + var builder = new StringBuilder (Method); + + if (Version.HasValue) { + builder.Append ('/'); + builder.Append (Version.Value.ToString (CultureInfo.InvariantCulture)); + } + + builder.Append ('='); + builder.Append (Result); + + if (!string.IsNullOrEmpty (ResultComment)) { + builder.Append (" ("); + builder.Append (ResultComment); + builder.Append (')'); + } + + if (!string.IsNullOrEmpty (Reason)) { + builder.Append (" reason="); + builder.Append (MimeUtils.Quote (Reason)); + } + + for (int i = 0; i < Properties.Count; i++) { + builder.Append (' '); + builder.Append (Properties[i]); + } + + return builder.ToString (); + } + } + + /// + /// An authentication method property. + /// + /// + /// An authentication method property. + /// + public class AuthenticationMethodProperty + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The property type. + /// The name of the property. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + public AuthenticationMethodProperty (string ptype, string property, string value) + { + if (ptype == null) + throw new ArgumentNullException (nameof (ptype)); + + if (property == null) + throw new ArgumentNullException (nameof (property)); + + if (value == null) + throw new ArgumentNullException (nameof (value)); + + PropertyType = ptype; + Property = property; + Value = value; + } + + /// + /// Get the type of the property. + /// + /// + /// Gets the type of the property. + /// + /// The type of the property. + public string PropertyType { + get; private set; + } + + /// + /// Get the property name. + /// + /// + /// Gets the property name. + /// + /// The name of the property. + public string Property { + get; private set; + } + + /// + /// Get the property value. + /// + /// + /// Gets the property value. + /// + /// The value of the property. + public string Value { + get; private set; + } + + internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + { + var combinedLength = PropertyType.Length + 1 + Property.Length + 1 + Value.Length; + var tokens = new List (); + + if (combinedLength > options.MaxLineLength) { + // we will have to break this up into individual tokens + combinedLength = PropertyType.Length + 1 + Property.Length + 1; + + if (combinedLength > options.MaxLineLength) { + tokens.Add (PropertyType); + tokens.Add ("."); + tokens.Add (Property); + tokens.Add ("="); + tokens.Add (Value); + } else { + tokens.Add (PropertyType + "." + Property + "="); + tokens.Add (Value); + } + } else { + tokens.Add (ToString ()); + } + + builder.AppendTokens (options, ref lineLength, tokens); + } + + /// + /// Serializes the to a string. + /// + /// + /// Creates a string-representation of the . + /// + /// The serialized string. + public override string ToString () + { + return $"{PropertyType}.{Property}={Value}"; + } + } +} diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index a97963153f..ba667802f0 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -33,6 +33,7 @@ #endif using MimeKit.Utils; +using MimeKit.Cryptography; namespace MimeKit { /// @@ -705,77 +706,15 @@ static void EncodeLongValue (FormatOptions format, StringBuilder encoded, ref in static byte[] EncodeAuthenticationResultsHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) { - var encoded = new StringBuilder (); - int lineLength = field.Length + 1; - var token = new StringBuilder (); - int index = 0; - - while (index < value.Length) { - // skip leading whitespace - while (index < value.Length && IsWhiteSpace (value[index])) - index++; - - // consume the tag name and/or domain - int wsp = 0; - while (index < value.Length && value[index] != '=' && value[index] != ';') { - if (!IsWhiteSpace (value[index])) - wsp = 0; - else - wsp++; - - token.Append (value[index]); - index++; - } - - // trim trailing whitespace from the tag name / domain - token.Length -= wsp; - - if (index < value.Length && value[index] == '=') { - // skip leading whitespace in the tag value - while (index < value.Length && IsWhiteSpace (value[index])) - index++; - - // consume the tag value - wsp = 0; - while (index < value.Length && value[index] != ';') { - if (IsWhiteSpace (value[index])) - wsp++; - else - wsp = 0; - - token.Append (value[index]); - index++; - } - - // trim the trailing whitespace - token.Length -= wsp; - } - - if (index < value.Length && value[index] == ';') { - token.Append (';'); - index++; - } - - if (lineLength + token.Length + 1 > format.MaxLineLength) { - encoded.Append (format.NewLine); - encoded.Append ('\t'); - lineLength = 1; - } else { - encoded.Append (' '); - lineLength++; - } + var buffer = Encoding.UTF8.GetBytes (value); - if (token.Length > format.MaxLineLength) { - EncodeLongValue (format, encoded, ref lineLength, token.ToString ()); - } else { - encoded.Append (token.ToString ()); - lineLength += token.Length; - } + if (!AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)) + return EncodeUnstructuredHeader (options, format, charset, field, value); - token.Length = 0; - } + var encoded = new StringBuilder (); + int lineLength = field.Length + 1; - encoded.Append (format.NewLine); + authres.Encode (format, encoded, ref lineLength); return charset.GetBytes (encoded.ToString ()); } diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index b062378d93..6b2f75e84d 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -68,6 +68,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index ad324d9160..11b04c685e 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -57,6 +57,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 616ca5059c..b75d4e3db4 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -65,6 +65,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 13eefe6221..67255b6371 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -49,6 +49,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 4ad4359f55..46bc534dad 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -56,6 +56,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index b12bf66441..a169d6a912 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -50,6 +50,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index fa4528de98..604878ab3b 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -56,6 +56,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 9deecdf31e..10fdd6577b 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -62,6 +62,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index a57e389bfa..ab16b25e13 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -65,6 +65,7 @@ + diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index 82c3610a06..4010f62bba 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -56,6 +56,7 @@ + diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index 923f9954ae..fbbc6af340 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -51,6 +51,7 @@ + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 970564d66f..c03b614c85 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -41,6 +41,7 @@ + diff --git a/MimeKit/MimeKitLite.Portable.csproj b/MimeKit/MimeKitLite.Portable.csproj index ac4af93e1d..a044e54a93 100644 --- a/MimeKit/MimeKitLite.Portable.csproj +++ b/MimeKit/MimeKitLite.Portable.csproj @@ -51,6 +51,7 @@ + diff --git a/MimeKit/MimeKitLite.WindowsUniversal81.csproj b/MimeKit/MimeKitLite.WindowsUniversal81.csproj index 607761df2e..007ff4b5b4 100644 --- a/MimeKit/MimeKitLite.WindowsUniversal81.csproj +++ b/MimeKit/MimeKitLite.WindowsUniversal81.csproj @@ -56,6 +56,7 @@ + diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj index 32e8611fee..109a2b35fb 100644 --- a/MimeKit/MimeKitLite.iOS.csproj +++ b/MimeKit/MimeKitLite.iOS.csproj @@ -51,6 +51,7 @@ + diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index a75ea6045f..56e7475d27 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -25,6 +25,7 @@ // using System.Text; +using System.Collections.Generic; namespace MimeKit.Utils { static class StringBuilderExtensions @@ -44,6 +45,24 @@ public static StringBuilder LineWrap (this StringBuilder text, FormatOptions opt return text; } + public static void AppendTokens (this StringBuilder text, FormatOptions options, ref int lineLength, List tokens, bool needsSpace = false) + { + foreach (var token in tokens) { + if (lineLength + token.Length > options.MaxLineLength) { + text.Append (options.NewLine); + text.Append ('\t'); + needsSpace = false; + lineLength = 1; + } else if (needsSpace) { + needsSpace = false; + text.Append (' '); + } + + lineLength += token.Length; + text.Append (token); + } + } + public static StringBuilder AppendFolded (this StringBuilder text, FormatOptions options, bool firstToken, string value, ref int lineLength) { int wordIndex = 0; diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs new file mode 100644 index 0000000000..366f294ee9 --- /dev/null +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -0,0 +1,715 @@ +// +// AuthenticationResultsTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Text; + +using NUnit.Framework; + +using MimeKit; +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography { + [TestFixture] + public class AuthenticationResultsTests + { + [Test] + public void TestArgumentExceptions () + { + AuthenticationResults authres; + var buffer = new byte[16]; + + Assert.Throws (() => new AuthenticationResults (null)); + + Assert.Throws (() => new AuthenticationMethodResult (null)); + Assert.Throws (() => new AuthenticationMethodResult (null, "result")); + Assert.Throws (() => new AuthenticationMethodResult ("method", null)); + + Assert.Throws (() => new AuthenticationMethodProperty (null, "property", "value")); + Assert.Throws (() => new AuthenticationMethodProperty ("ptype", null, "value")); + Assert.Throws (() => new AuthenticationMethodProperty ("ptype", "Property", null)); + + Assert.Throws (() => AuthenticationResults.Parse (null)); + Assert.Throws (() => AuthenticationResults.Parse (null, 0, 0)); + Assert.Throws (() => AuthenticationResults.Parse (buffer, -1, 0)); + Assert.Throws (() => AuthenticationResults.Parse (buffer, 0, -1)); + + Assert.Throws (() => AuthenticationResults.TryParse (null, out authres)); + Assert.Throws (() => AuthenticationResults.TryParse (null, 0, 0, out authres)); + Assert.Throws (() => AuthenticationResults.TryParse (buffer, -1, 0, out authres)); + Assert.Throws (() => AuthenticationResults.TryParse (buffer, 0, -1, out authres)); + } + + [Test] + public void TestParseArcAuthenticationResults () + { + const string input = "i=1; example.com; foo=pass"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Instance.Value, "instance"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("foo", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseAuthServId () + { + var buffer = Encoding.ASCII.GetBytes ("example.org"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); + + Assert.AreEqual ("example.org; none", authres.ToString ()); + } + + [Test] + public void TestParseAuthServIdSemicolon () + { + var buffer = Encoding.ASCII.GetBytes ("example.org;"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); + + Assert.AreEqual ("example.org; none", authres.ToString ()); + } + + [Test] + public void TestParseAuthServIdWithVersion () + { + const string input = "example.org 1"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Version.Value, "authres-version"); + + Assert.AreEqual ("example.org 1; none", authres.ToString ()); + } + + [Test] + public void TestParseAuthServIdWithVersionAndSemicolon () + { + var buffer = Encoding.ASCII.GetBytes ("example.org 1;"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Version.Value, "authres-version"); + + Assert.AreEqual ("example.org 1; none", authres.ToString ()); + } + + [Test] + public void TestParseNoResults () + { + var buffer = Encoding.ASCII.GetBytes ("example.org 1; none"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Version.Value, "authres-version"); + Assert.AreEqual (0, authres.Results.Count, "no-results"); + + Assert.AreEqual ("example.org 1; none", authres.ToString ()); + } + + [Test] + public void TestParseSimple () + { + const string input = "example.com; foo=pass"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("foo", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseSimpleWithComment () + { + const string input = "example.com; foo=pass (2 of 3 tests OK)"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("foo", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("2 of 3 tests OK", authres.Results[0].ResultComment); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseSimpleWithProperty1 () + { + const string input = "example.com; spf=pass smtp.mailfrom=example.net"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("example.net", authres.Results[0].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseSimpleWithProperty2 () + { + const string input = "example.com; spf=pass smtp.mailfrom=@example.net"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("@example.net", authres.Results[0].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseSimpleWithProperty3 () + { + const string input = "example.com; spf=pass smtp.mailfrom=local-part@example.net"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("local-part@example.net", authres.Results[0].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseMultipleMethods () + { + const string input = "example.com; auth=pass (cram-md5) smtp.auth=sender@example.net; spf=pass smtp.mailfrom=example.net; sender-id=pass header.from=example.net"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("auth", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("cram-md5", authres.Results[0].ResultComment); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "auth properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("auth", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("sender@example.net", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("spf", authres.Results[1].Method); + Assert.AreEqual ("pass", authres.Results[1].Result); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "spf properties"); + Assert.AreEqual ("smtp", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("example.net", authres.Results[1].Properties[0].Value); + Assert.AreEqual ("sender-id", authres.Results[2].Method); + Assert.AreEqual ("pass", authres.Results[2].Result); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "sender-id properties"); + Assert.AreEqual ("header", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("example.net", authres.Results[2].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseMultipleMethodsWithReasons () + { + const string input = "example.com; dkim=pass reason=\"good signature\" header.i=@mail-router.example.net; dkim=fail reason=\"bad signature\" header.i=@newyork.example.com"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (2, authres.Results.Count, "methods"); + Assert.AreEqual ("dkim", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("good signature", authres.Results[0].Reason); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("i", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("@mail-router.example.net", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("dkim", authres.Results[1].Method); + Assert.AreEqual ("fail", authres.Results[1].Result); + Assert.AreEqual ("bad signature", authres.Results[1].Reason); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("i", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("@newyork.example.com", authres.Results[1].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseHeavilyCommentedExample () + { + var buffer = Encoding.ASCII.GetBytes ("foo.example.net (foobar) 1 (baz); dkim (Because I like it) / 1 (One yay) = (wait for it) fail policy (A dot can go here) . (like that) expired (this surprised me) = (as I wasn't expecting it) 1362471462"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.AreEqual ("foo.example.net", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Version.Value, "authres-version"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("dkim", authres.Results[0].Method); + Assert.AreEqual (1, authres.Results[0].Version.Value, "method-version"); + Assert.AreEqual ("fail", authres.Results[0].Result); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "dkim properties"); + Assert.AreEqual ("policy", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("expired", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("1362471462", authres.Results[0].Properties[0].Value); + + Assert.AreEqual ("foo.example.net 1; dkim/1=fail policy.expired=1362471462", authres.ToString ()); + } + + [Test] + public void TestParseFailureAuthServIdIncompleteQString () + { + var buffer = Encoding.ASCII.GetBytes (" \"quoted-authserv-id"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (1, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (20, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteArcInstance () + { + var buffer = Encoding.ASCII.GetBytes ("i="); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (2, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidArcInstance () + { + var buffer = Encoding.ASCII.GetBytes ("i=abc; authserv-id"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (2, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureUnexpectedTokenAfterArcInstance () + { + var buffer = Encoding.ASCII.GetBytes ("i=1: authserv-id"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (3, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (3, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureOnlyArcInstance () + { + var buffer = Encoding.ASCII.GetBytes ("i=5"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (3, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureOnlyArcInstanceSemicolon () + { + var buffer = Encoding.ASCII.GetBytes ("i=5;"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (4, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (4, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureMultipleLeadingArcInstance () + { + var buffer = Encoding.ASCII.GetBytes ("i=5; i=1"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (5, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (6, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureUnknownLeadingMethod () + { + var buffer = Encoding.ASCII.GetBytes ("x=5; authserv-id"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (0, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (1, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidVersion () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id x"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (12, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (12, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidTokenAfterVersion () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id 1 x"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (14, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (14, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidMethod1 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; ."); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (13, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidMethod2 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc def"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidMethodVersion1 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc/1.0=pass"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (18, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidMethodVersion2 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc/def=pass"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (17, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteMethod () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc="); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureMethodEqualNonKeyword () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc=."); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (17, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureNoResultWithMore () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; none; method=pass"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureNoResultAfterMethods () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass; none"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (26, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (30, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteReason1 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (31, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteReason2 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason="); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (32, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (32, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteReason3 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=\"this is some text"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (32, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (50, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteReason4 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=;"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (32, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (32, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidPropTypeAfterReason () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=\"because I said so\" .;"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (52, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (52, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteProperty1 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (30, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteProperty2 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype."); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (31, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteProperty3 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (35, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteProperty4 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop="); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (36, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureIncompleteProperty5 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop=;"); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (36, ex.ErrorIndex, "ErrorIndex"); + } + } + } +} diff --git a/UnitTests/Cryptography/DummyArcSigner.cs b/UnitTests/Cryptography/DummyArcSigner.cs new file mode 100644 index 0000000000..0c8a42eb11 --- /dev/null +++ b/UnitTests/Cryptography/DummyArcSigner.cs @@ -0,0 +1,78 @@ +// +// DummyArcSigner.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using MimeKit; +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography { + public class DummyArcSigner : ArcSigner + { + public DummyArcSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm) : base (stream, domain, selector, algorithm) + { + } + + public string SrvId { + get; set; + } + + protected override Header GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken) + { + var results = new AuthenticationResults (SrvId); + results.Instance = instance; + + for (int i = 0; i < message.Headers.Count; i++) { + var header = message.Headers[i]; + + if (header.Id != HeaderId.AuthenticationResults) + continue; + + if (!AuthenticationResults.TryParse (header.RawValue, out AuthenticationResults authres)) + continue; + + if (authres.AuthenticationServiceIdentifier != SrvId) + continue; + + foreach (var result in authres.Results) { + if (!results.Results.Any (r => r.Method == result.Method)) + results.Results.Add (result); + } + } + + return new Header (HeaderId.ArcAuthenticationResults, results.ToString ()); + } + + protected override Task
GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken) + { + return Task.FromResult (GenerateArcAuthenticationResults (options, message, instance, cancellationToken)); + } + } +} diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index cbfcd6fea8..9dde916ff0 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -138,7 +138,7 @@ public void TestAddressHeaderFolding () static readonly string[] ArcAuthenticationResultsHeaderValues = { " i=1; lists.example.org;" + FormatOptions.Default.NewLine + "\tspf=pass smtp.mfrom=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=pass (1024 - bit key) header.i=@d1.example; dmarc=pass", " i=2; gmail.example;" + FormatOptions.Default.NewLine + "\tspf=fail smtp.from=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=fail (512-bit key) header.i=@example.org; dmarc=fail;" + FormatOptions.Default.NewLine + "\tarc=pass (as.1.lists.example.org=pass, ams.1.lists.example.org=pass)", - " i=3; gmail.example;" + FormatOptions.Default.NewLine + "\tspf=fail smtp.from=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=fail (512-bit key) header.i=@example.org;"+ FormatOptions.Default.NewLine + "\tdmarc=fail (this-is-a-reall-long-unbroken-comment-that-will-need-to-be-broken"+ FormatOptions.Default.NewLine + "\t-apart-somewhere---is-it-long-enough-yet?); arc=pass (as.1.lists.example.org=pass, ams.1.lists.example.org=pass)" + " i=3; gmail.example;" + FormatOptions.Default.NewLine + "\tspf=fail smtp.from=jqd@d1.example;" + FormatOptions.Default.NewLine + "\tdkim=fail (512-bit key) header.i=@example.org; dmarc=fail"+ FormatOptions.Default.NewLine + "\t(this-is-a-really-really-really-long-unbroken-comment-that-will-be-on-a-line-by-itself);" + FormatOptions.Default.NewLine + "\tarc=pass (as.1.lists.example.org=pass, ams.1.lists.example.org=pass)" }; [Test] diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 5d3f20cb69..624fa48fff 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -74,6 +74,7 @@ + @@ -81,6 +82,7 @@ + diff --git a/rfc/rfc7601.txt b/rfc/rfc7601.txt new file mode 100644 index 0000000000..0e4b6696ef --- /dev/null +++ b/rfc/rfc7601.txt @@ -0,0 +1,2971 @@ + + + + + + +Internet Engineering Task Force (IETF) M. Kucherawy +Request for Comments: 7601 August 2015 +Obsoletes: 7001, 7410 +Category: Standards Track +ISSN: 2070-1721 + + + Message Header Field for Indicating Message Authentication Status + +Abstract + + This document specifies a message header field called Authentication- + Results for use with electronic mail messages to indicate the results + of message authentication efforts. Any receiver-side software, such + as mail filters or Mail User Agents (MUAs), can use this header field + to relay that information in a convenient and meaningful way to users + or to make sorting and filtering decisions. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc7601. + +Copyright Notice + + Copyright (c) 2015 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + + + +Kucherawy Standards Track [Page 1] + +RFC 7601 Authentication-Results Header Field August 2015 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.2. Trust Boundary . . . . . . . . . . . . . . . . . . . . . 5 + 1.3. Processing Scope . . . . . . . . . . . . . . . . . . . . 6 + 1.4. Requirements . . . . . . . . . . . . . . . . . . . . . . 6 + 1.5. Definitions . . . . . . . . . . . . . . . . . . . . . . . 6 + 1.5.1. Key Words . . . . . . . . . . . . . . . . . . . . . . 6 + 1.5.2. Security . . . . . . . . . . . . . . . . . . . . . . 7 + 1.5.3. Email Architecture . . . . . . . . . . . . . . . . . 7 + 1.5.4. Other Terms . . . . . . . . . . . . . . . . . . . . . 8 + 1.6. Trust Environment . . . . . . . . . . . . . . . . . . . . 8 + 2. Definition and Format of the Header Field . . . . . . . . . . 9 + 2.1. General Description . . . . . . . . . . . . . . . . . . . 9 + 2.2. Formal Definition . . . . . . . . . . . . . . . . . . . . 10 + 2.3. Property Types (ptypes) and Properties . . . . . . . . . 12 + 2.4. The "policy" ptype . . . . . . . . . . . . . . . . . . . 13 + 2.5. Authentication Identifier Field . . . . . . . . . . . . . 14 + 2.6. Version Tokens . . . . . . . . . . . . . . . . . . . . . 15 + 2.7. Defined Methods and Result Values . . . . . . . . . . . . 15 + 2.7.1. DKIM and DomainKeys . . . . . . . . . . . . . . . . . 16 + 2.7.2. SPF and Sender ID . . . . . . . . . . . . . . . . . . 18 + 2.7.3. "iprev" . . . . . . . . . . . . . . . . . . . . . . . 19 + 2.7.4. SMTP AUTH . . . . . . . . . . . . . . . . . . . . . . 20 + 2.7.5. Other Registered Codes . . . . . . . . . . . . . . . 21 + 2.7.6. Extension Methods . . . . . . . . . . . . . . . . . . 21 + 2.7.7. Extension Result Codes . . . . . . . . . . . . . . . 22 + 3. The "iprev" Authentication Method . . . . . . . . . . . . . . 22 + 4. Adding the Header Field to a Message . . . . . . . . . . . . 23 + 4.1. Header Field Position and Interpretation . . . . . . . . 25 + 4.2. Local Policy Enforcement . . . . . . . . . . . . . . . . 26 + 5. Removing Existing Header Fields . . . . . . . . . . . . . . . 26 + 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 + 6.1. The Authentication-Results Header Field . . . . . . . . . 27 + 6.2. "Email Authentication Methods" Registry Description . . . 28 + 6.3. "Email Authentication Methods" Registry Update . . . . . 29 + 6.4. "Email Authentication Property Types" Registry . . . . . 30 + 6.5. "Email Authentication Result Names" Description . . . . . 31 + 6.6. "Email Authentication Result Names" Update . . . . . . . 32 + 6.7. SMTP Enhanced Status Codes . . . . . . . . . . . . . . . 33 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 33 + 7.1. Forged Header Fields . . . . . . . . . . . . . . . . . . 33 + 7.2. Misleading Results . . . . . . . . . . . . . . . . . . . 35 + 7.3. Header Field Position . . . . . . . . . . . . . . . . . . 35 + 7.4. Reverse IP Query Denial-of-Service Attacks . . . . . . . 35 + 7.5. Mitigation of Backscatter . . . . . . . . . . . . . . . . 36 + 7.6. Internal MTA Lists . . . . . . . . . . . . . . . . . . . 36 + + + +Kucherawy Standards Track [Page 2] + +RFC 7601 Authentication-Results Header Field August 2015 + + + 7.7. Attacks against Authentication Methods . . . . . . . . . 36 + 7.8. Intentionally Malformed Header Fields . . . . . . . . . . 36 + 7.9. Compromised Internal Hosts . . . . . . . . . . . . . . . 36 + 7.10. Encapsulated Instances . . . . . . . . . . . . . . . . . 37 + 7.11. Reverse Mapping . . . . . . . . . . . . . . . . . . . . . 37 + 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 + 8.1. Normative References . . . . . . . . . . . . . . . . . . 37 + 8.2. Informative References . . . . . . . . . . . . . . . . . 38 + Appendix A. Legacy MUAs . . . . . . . . . . . . . . . . . . . . 42 + Appendix B. Authentication-Results Examples . . . . . . . . . . 42 + B.1. Trivial Case; Header Field Not Present . . . . . . . . . 42 + B.2. Nearly Trivial Case; Service Provided, but No + Authentication Done . . . . . . . . . . . . . . . . . . . 43 + B.3. Service Provided, Authentication Done . . . . . . . . . . 44 + B.4. Service Provided, Several Authentications Done, Single + MTA . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 + B.5. Service Provided, Several Authentications Done, Different + MTAs . . . . . . . . . . . . . . . . . . . . . . . . . . 46 + B.6. Service Provided, Multi-tiered Authentication Done . . . 48 + B.7. Comment-Heavy Example . . . . . . . . . . . . . . . . . . 49 + Appendix C. Operational Considerations about Message + Authentication . . . . . . . . . . . . . . . . . . . 50 + Appendix D. Changes since RFC 7001 . . . . . . . . . . . . . . . 51 + Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 53 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 53 + +1. Introduction + + This document describes a header field called Authentication-Results + for electronic mail messages that presents the results of a message + authentication effort in a machine-readable format. The intent of + the header field is to create a place to collect such data when + message authentication mechanisms are in use so that a Mail User + Agent (MUA) and downstream filters can make filtering decisions and/ + or provide a recommendation to the user as to the validity of the + message's origin and possibly the safety and integrity of its + content. + + This document revises the original definition found in [RFC5451] + based upon various authentication protocols in current use and + incorporates errata logged since the publication of the original + specification. + + End users are not expected to be direct consumers of this header + field. This header field is intended for consumption by programs + that will then use such data or render it in a human-usable form. + + + + + +Kucherawy Standards Track [Page 3] + +RFC 7601 Authentication-Results Header Field August 2015 + + + This document specifies the format of this header field and discusses + the implications of its presence or absence. However, it does not + discuss how the data contained in the header field ought to be used, + such as what filtering decisions are appropriate or how an MUA might + render those results, as these are local policy and/or user interface + design questions that are not appropriate for this document. + + At the time of publication of this document, the following are + published email authentication methods: + + o Author Domain Signing Practices ([ADSP]) (Historic) + + o SMTP Service Extension for Authentication ([AUTH]) + + o DomainKeys Identified Mail Signatures ([DKIM]) + + o Domain-based Message Authentication, Reporting and Conformance + ([DMARC]) + + o Sender Policy Framework ([SPF]) + + o reverse IP address name validation ("iprev", defined in Section 3) + + o Require-Recipient-Valid-Since Header Field and SMTP Service + Extension ([RRVS]) + + o S/MIME Signature Verification ([SMIME-REG]) + + o Vouch By Reference ([VBR]) + + o DomainKeys ([DOMAINKEYS]) (Historic) + + o Sender ID ([SENDERID]) (Experimental) + + There exist registries for tokens used within this header field that + refer to the specifications listed above. Section 6 describes the + registries and their contents and specifies the process by which + entries are added or updated. It also updates the existing contents + to match the current states of these specifications. + + This specification is not intended to be restricted to domain-based + authentication schemes, but the existing schemes in that family have + proven to be a good starting point for implementations. The goal is + to give current and future authentication schemes a common framework + within which to deliver their results to downstream agents and + discourage the creation of unique header fields for each. + + + + + +Kucherawy Standards Track [Page 4] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Although SPF defined a header field called "Received-SPF" and the + historic DomainKeys defined one called "DomainKey-Status" for this + purpose, those header fields are specific to the conveyance of their + respective results only and thus are insufficient to satisfy the + requirements enumerated below. In addition, many SPF implementations + have adopted the header field specified here at least as an option, + and DomainKeys has been obsoleted by DKIM. + +1.1. Purpose + + The header field defined in this document is expected to serve + several purposes: + + 1. Convey the results of various message authentication checks, + which are applied by upstream filters and Mail Transfer Agents + (MTAs) and then passed to MUAs and downstream filters within the + same "trust domain". Such agents might wish to render those + results to end users or to use those data to apply more or less + stringent content checks based on authentication results; + + 2. Provide a common location within a message for this data; + + 3. Create an extensible framework for reporting new authentication + methods as they emerge. + + In particular, the mere presence of this header field does not mean + its contents are valid. Rather, the header field is reporting + assertions made by one or more authentication schemes (supposedly) + applied somewhere upstream. For an MUA or downstream filter to treat + the assertions as actually valid, there must be an assessment of the + trust relationship among such agents, the validating MTA, and the + mechanism for conveying the information. + +1.2. Trust Boundary + + This document makes several references to the "trust boundary" of an + administrative management domain (ADMD). Given the diversity among + existing mail environments, a precise definition of this term isn't + possible. + + Simply put, a transfer from the producer of the header field to the + consumer must occur within a context that permits the consumer to + treat assertions by the producer as being reliable and accurate + (trustworthy). How this trust is obtained is outside the scope of + this document. It is entirely a local matter. + + + + + + +Kucherawy Standards Track [Page 5] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Thus, this document defines a "trust boundary" as the delineation + between "external" and "internal" entities. Services that are + internal -- within the trust boundary -- are provided by the ADMD's + infrastructure for its users. Those that are external are outside of + the authority of the ADMD. By this definition, hosts that are within + a trust boundary are subject to the ADMD's authority and policies, + independent of their physical placement or their physical operation. + For example, a host within a trust boundary might actually be + operated by a remote service provider and reside physically within + its data center. + + It is possible for a message to be evaluated inside a trust boundary + but then depart and re-enter the trust boundary. An example might be + a forwarded message such as a message/rfc822 attachment (see + Multipurpose Internet Mail Extensions [MIME]) or one that is part of + a multipart/digest. The details reported by this field cannot be + trusted in that case. Thus, this field found within one of those + media types is typically ignored. + +1.3. Processing Scope + + The content of this header field is meant to convey to message + consumers that authentication work on the message was already done + within its trust boundary, and those results are being presented. It + is not intended to provide message parameters to consumers so that + they can perform authentication protocols on their own. + +1.4. Requirements + + This document establishes no new requirements on existing protocols + or servers. + + In particular, this document establishes no requirement on MTAs to + reject or filter arriving messages that do not pass authentication + checks. The data conveyed by the specified header field's contents + are for the information of MUAs and filters and are to be used at + their discretion. + +1.5. Definitions + + This section defines various terms used throughout this document. + +1.5.1. Key Words + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [KEYWORDS]. + + + + +Kucherawy Standards Track [Page 6] + +RFC 7601 Authentication-Results Header Field August 2015 + + +1.5.2. Security + + "Guidelines for Writing RFC Text on Security Considerations" + ([SECURITY]) discusses authentication and authorization and the + conflation of the two concepts. The use of those terms within the + context of recent message security work has given rise to slightly + different definitions, and this document reflects those current + usages, as follows: + + o "Authorization" is the establishment of permission to use a + resource or represent an identity. In this context, authorization + indicates that a message from a particular ADMD arrived via a + route the ADMD has explicitly approved. + + o "Authentication" is the assertion of validity of a piece of data + about a message (such as the sender's identity) or the message in + its entirety. + + As examples: SPF and Sender ID are authorization mechanisms in that + they express a result that shows whether or not the ADMD that + apparently sent the message has explicitly authorized the connecting + Simple Mail Transfer Protocol ([SMTP]) client to relay messages on + its behalf, but they do not actually validate any other property of + the message itself. By contrast, DKIM is agnostic as to the routing + of a message but uses cryptographic signatures to authenticate + agents, assign (some) responsibility for the message (which implies + authorization), and ensure that the listed portions of the message + were not modified in transit. Since the signatures are not tied to + SMTP connections, they can be added by either the ADMD of origin, + intermediate ADMDs (such as a mailing list server), other handling + agents, or any combination. + + Rather than create a separate header field for each class of + solution, this proposal groups them both into a single header field. + +1.5.3. Email Architecture + + o A "border MTA" is an MTA that acts as a gateway between the + general Internet and the users within an organizational boundary. + (See also Section 1.2.) + + o A "delivery MTA" (or Mail Delivery Agent or MDA) is an MTA that + actually enacts delivery of a message to a user's inbox or other + final delivery. + + o An "intermediate MTA" is any MTA that is not a delivery MTA and is + also not the first MTA to handle the message. + + + + +Kucherawy Standards Track [Page 7] + +RFC 7601 Authentication-Results Header Field August 2015 + + + The following diagram illustrates the flow of mail among these + defined components. See Internet Mail Architecture [EMAIL-ARCH] for + further discussion on general email system architecture, which + includes detailed descriptions of these components, and Appendix C of + this document for discussion about the common aspects of email + authentication in current environments. + + +-----+ +-----+ +------------+ + | MUA |-->| MSA |-->| Border MTA | + +-----+ +-----+ +------------+ + | + | + V + +----------+ + | Internet | + +----------+ + | + | + V + +-----+ +-----+ +------------------+ +------------+ + | MUA |<--| MDA |<--| Intermediate MTA |<--| Border MTA | + +-----+ +-----+ +------------------+ +------------+ + + Generally, it is assumed that the work of applying message + authentication schemes takes place at a border MTA or a delivery MTA. + This specification is written with that assumption in mind. However, + there are some sites at which the entire mail infrastructure consists + of a single host. In such cases, such terms as "border MTA" and + "delivery MTA" might well apply to the same machine or even the very + same agent. It is also possible that some message authentication + tests could take place on an intermediate MTA. Although this + document doesn't specifically describe such cases, they are not meant + to be excluded. + +1.5.4. Other Terms + + In this document, the term "producer" refers to any component that + adds this header field to messages it is handling, and "consumer" + refers to any component that identifies, extracts, and parses the + header field to use as part of a handling decision. + +1.6. Trust Environment + + This header field permits one or more message validation mechanisms + to communicate output to one or more separate assessment mechanisms. + These mechanisms operate within a unified trust boundary that defines + an Administrative Management Domain (ADMD). An ADMD contains one or + more entities that perform validation and generate the header field + + + +Kucherawy Standards Track [Page 8] + +RFC 7601 Authentication-Results Header Field August 2015 + + + and one or more that consume it for some type of assessment. The + field often contains no integrity or validation mechanism of its own, + so its presence must be trusted implicitly. Hence, valid use of the + header field requires removing any occurrences of it that are present + when the message enters the ADMD. This ensures that later + occurrences have been added within the trust boundary of the ADMD. + + The authserv-id token defined in Section 2.2 can be used to reference + an entire ADMD or a specific validation engine within an ADMD. + Although the labeling scheme is left as an operational choice, some + guidance for selecting a token is provided in later sections of this + document. + +2. Definition and Format of the Header Field + + This section gives a general overview of the format of the header + field being defined and then provides more formal specification. + +2.1. General Description + + The header field specified here is called Authentication-Results. It + is a Structured Header Field as defined in Internet Message Format + ([MAIL]), and thus all of the related definitions in that document + apply. + + This header field is added at the top of the message as it transits + MTAs that do authentication checks, so some idea of how far away the + checks were done can be inferred. It is therefore considered to be a + trace field as defined in [MAIL], and thus all of the related + definitions in that document apply. + + The value of the header field (after removing comments) consists of + an authentication identifier, an optional version, and then a series + of statements and supporting data. The statements are of the form + "method=result" and indicate which authentication method(s) were + applied and their respective results. For each such statement, the + supporting data can include a "reason" string and one or more + "property=value" statements indicating which message properties were + evaluated to reach that conclusion. + + The header field can appear more than once in a single message, more + than one result can be represented in a single header field, or a + combination of these can be applied. + + + + + + + + +Kucherawy Standards Track [Page 9] + +RFC 7601 Authentication-Results Header Field August 2015 + + +2.2. Formal Definition + + Formally, the header field is specified as follows using Augmented + Backus-Naur Form ([ABNF]): + + authres-header = "Authentication-Results:" [CFWS] authserv-id + [ CFWS authres-version ] + ( no-result / 1*resinfo ) [CFWS] CRLF + + authserv-id = value + ; see below for a description of this element + + authres-version = 1*DIGIT [CFWS] + ; indicates which version of this specification is in use; + ; this specification is version "1", and the absence of a + ; version implies this version of the specification + + no-result = [CFWS] ";" [CFWS] "none" + ; the special case of "none" is used to indicate that no + ; message authentication was performed + + resinfo = [CFWS] ";" methodspec [ CFWS reasonspec ] + *( CFWS propspec ) + + methodspec = [CFWS] method [CFWS] "=" [CFWS] result + ; indicates which authentication method was evaluated + ; and what its output was + + reasonspec = "reason" [CFWS] "=" [CFWS] value + ; a free-form comment on the reason the given result + ; was returned + + propspec = ptype [CFWS] "." [CFWS] property [CFWS] "=" pvalue + ; an indication of which properties of the message + ; were evaluated by the authentication scheme being + ; applied to yield the reported result + + method = Keyword [ [CFWS] "/" [CFWS] method-version ] + ; a method indicates which method's result is + ; represented by "result", and is one of the methods + ; explicitly defined as valid in this document + ; or is an extension method as defined below + + method-version = 1*DIGIT [CFWS] + ; indicates which version of the method specification is + ; in use, corresponding to the matching entry in the IANA + ; "Email Authentication Methods" registry; a value of "1" + ; is assumed if this version string is absent + + + +Kucherawy Standards Track [Page 10] + +RFC 7601 Authentication-Results Header Field August 2015 + + + result = Keyword + ; indicates the results of the attempt to authenticate + ; the message; see below for details + + ptype = Keyword + ; indicates whether the property being evaluated was + ; a parameter to an [SMTP] command, was a value taken + ; from a message header field, was some property of + ; the message body, or was some other property evaluated by + ; the receiving MTA; expected to be one of the "property + ; types" explicitly defined as valid, or an extension + ; ptype, as defined below + + property = special-smtp-verb / Keyword + ; indicates more specifically than "ptype" what the + ; source of the evaluated property is; the exact meaning + ; is specific to the method whose result is being reported + ; and is defined more clearly below + + special-smtp-verb = "mailfrom" / "rcptto" + ; special cases of [SMTP] commands that are made up + ; of multiple words + + pvalue = [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) + [CFWS] + ; the value extracted from the message property defined + ; by the "ptype.property" construction + + "local-part" is defined in Section 3.4.1 of [MAIL], and "CFWS" is + defined in Section 3.2.2 of [MAIL]. + + "Keyword" is defined in Section 4.1.2 of [SMTP]. + + The "value" is as defined in Section 5.1 of [MIME]. + + The "domain-name" is as defined in Section 3.5 of [DKIM]. + + The "Keyword" used in "result" above is further constrained by the + necessity of being enumerated in Section 2.7. + + See Section 2.5 for a description of the authserv-id element. + + If the value portion of a "pvalue" construction identifies something + intended to be an email identity, then it MUST use the right hand + portion of that ABNF definition. + + The list of commands eligible for use with the "smtp" ptype can be + found in Section 4.1 of [SMTP]. + + + +Kucherawy Standards Track [Page 11] + +RFC 7601 Authentication-Results Header Field August 2015 + + + The "propspec" may be omitted if, for example, the method was unable + to extract any properties to do its evaluation yet has a result to + report. + + Where an SMTP command name is being reported as a "property", the + agent generating the header field represents that command by + converting it to lowercase and dropping any spaces (e.g., "MAIL FROM" + becomes "mailfrom", "RCPT TO" becomes "rcptto", etc.). + + A "ptype" value of "policy" indicates a policy decision about the + message not specific to a property of the message that could be + extracted. See Section 2.4 for details. + + Examples of complete messages using this header field can be found in + Appendix B. + +2.3. Property Types (ptypes) and Properties + + The "ptype" in the ABNF above indicates the general type of property + being described by the result being reported, upon which the reported + result was based. Coupled with the "property", which is more + specific, they indicate from which particular part of the message the + reported data were extracted. + + Combinations of ptypes and properties are registered and described in + the "Email Authentication Methods" registry, coupled with the + authentication methods with which they are used. This is further + described in Section 6. + + Legal values of "ptype" are as defined in the IANA "Email + Authentication Property Types" registry, created by [RFC7410]. The + initial values and what they typically indicate are as follows, based + on [RFC7001]: + + body: Information that was extracted from the body of the message. + This might be an arbitrary string of bytes, a hash of a string of + bytes, a Uniform Resource Identifier, or some other content of + interest. The "property" is an indication of where within the + message body the extracted content was found, and can indicate an + offset, identify a MIME part, etc. + + header: Indicates information that was extracted from the header of + the message. This might be the value of a header field or some + portion of a header field. The "property" gives a more precise + indication of the place in the header from which the extraction + took place. + + + + + +Kucherawy Standards Track [Page 12] + +RFC 7601 Authentication-Results Header Field August 2015 + + + policy: A local policy mechanism was applied that augments or + overrides the result returned by the authentication mechanism. + (See Section 2.4.) + + smtp: Indicates information that was extracted from an SMTP command + that was used to relay the message. The "property" indicates + which SMTP command included the extracted content as a parameter. + + Results reported using unknown ptypes MUST NOT be used in making + handling decisions. They can be safely ignored by consumers. + + Entries in the "Email Authentication Methods" registry can define + properties that deviate from these definitions when appropriate. + Such deviations need to be clear in the registry and/or in the + defining document. See Section 2.7.1 for an example. + +2.4. The "policy" ptype + + A special ptype value of "policy" is also defined. This ptype is + provided to indicate that some local policy mechanism was applied + that augments or even replaces (i.e., overrides) the result returned + by the authentication mechanism. The property and value in this case + identify the local policy that was applied and the result it + returned. + + For example, a DKIM signature is not required to include the Subject + header field in the set of fields that are signed. An ADMD receiving + such a message might decide that such a signature is unacceptable, + even if it passes, because the content of the Subject header field + could be altered post-signing without invalidating the signature. + Such an ADMD could replace the DKIM "pass" result with a "policy" + result and then also include the following in the corresponding + Authentication-Result field: + + ... dkim=fail policy.dkim-rules=unsigned-subject ... + + In this case, the property is "dkim-rules", indicating some local + check by that name took place and that check returned a result of + "unsigned-subject". These are arbitrary names selected by (and + presumably used within) the ADMD making use of them, so they are not + normally registered with IANA or otherwise specified apart from + setting syntax restrictions that allow for easy parsing within the + rest of the header field. + + This ptype existed in the original specification for this header + field, but without a complete description or example of intended use. + + + + + +Kucherawy Standards Track [Page 13] + +RFC 7601 Authentication-Results Header Field August 2015 + + + As a result, it has not seen any practical use to date that matches + its intended purpose. These added details are provided to guide + implementers toward proper use. + +2.5. Authentication Identifier Field + + Every Authentication-Results header field has an authentication + service identifier field (authserv-id above). Specifically, this is + any string intended to identify the authentication service within the + ADMD that conducted authentication checks on the message. This + identifier is intended to be machine-readable and not necessarily + meaningful to users. + + Since agents consuming this field will use this identifier to + determine whether its contents are of interest (and are safe to use), + the uniqueness of the identifier MUST be guaranteed by the ADMD that + generates it and MUST pertain to that ADMD. MUAs or downstream + filters SHOULD use this identifier to determine whether or not the + data contained in an Authentication-Results header field ought to be + used or ignored. + + For simplicity and scalability, the authentication service identifier + SHOULD be a common token used throughout the ADMD. Common practice + is to use the DNS domain name used by or within that ADMD, sometimes + called the "organizational domain", but this is not strictly + necessary. + + For tracing and debugging purposes, the authentication identifier can + instead be the specific hostname of the MTA performing the + authentication check whose result is being reported. Moreover, some + implementations define a substructure to the identifier; these are + outside of the scope of this specification. + + Note, however, that using a local, relative identifier like a flat + hostname, rather than a hierarchical and globally unique ADMD + identifier like a DNS domain name, makes configuration more difficult + for large sites. The hierarchical identifier permits aggregating + related, trusted systems together under a single, parent identifier, + which in turn permits assessing the trust relationship with a single + reference. The alternative is a flat namespace requiring + individually listing each trusted system. Since consumers will use + the identifier to determine whether to use the contents of the header + field: + + o Changes to the identifier impose a large, centralized + administrative burden. + + + + + +Kucherawy Standards Track [Page 14] + +RFC 7601 Authentication-Results Header Field August 2015 + + + o Ongoing administrative changes require constantly updating this + centralized table, making it difficult to ensure that an MUA or + downstream filter will have access to accurate information for + assessing the usability of the header field's content. In + particular, consumers of the header field will need to know not + only the current identifier(s) in use but previous ones as well to + account for delivery latency or later re-assessment of the header + field's contents. + + Examples of valid authentication identifiers are "example.com", + "mail.example.org", "ms1.newyork.example.com", and "example-auth". + +2.6. Version Tokens + + The grammar above provides for the optional inclusion of versions on + both the header field itself (attached to the authserv-id token) and + on each of the methods being reported. The method version refers to + the method itself, which is specified in the documents describing + those methods, while the authserv-id version refers to this document + and thus the syntax of this header field. + + The purpose of including these is to avoid misinterpretation of the + results. That is, if a parser finds a version after an authserv-id + that it does not explicitly know, it can immediately discontinue + trying to parse since what follows might not be in an expected + format. For a method version, the parser SHOULD ignore a method + result if the version is not supported in case the semantics of the + result have a different meaning than what is expected. For example, + if a hypothetical DKIM version 2 yielded a "pass" result for + different reasons than version 1 does, a consumer of this field might + not want to use the altered semantics. Allowing versions in the + syntax is a way to indicate this and let the consumer of the header + field decide. + +2.7. Defined Methods and Result Values + + Each individual authentication method returns one of a set of + specific result values. The subsections below provide references to + the documents defining the authentication methods specifically + supported by this document, and their corresponding result values. + Verifiers SHOULD use these values as described below. New methods + not specified in this document, but intended to be supported by the + header field defined here, MUST include a similar result table either + in their defining documents or in supplementary ones. + + + + + + + +Kucherawy Standards Track [Page 15] + +RFC 7601 Authentication-Results Header Field August 2015 + + +2.7.1. DKIM and DomainKeys + + DKIM is represented by the "dkim" method and is defined in [DKIM]. + DomainKeys is defined in [DOMAINKEYS] and is represented by the + "domainkeys" method. + + Section 3.8 of [DOMAINKEYS] enumerates some possible results of a + DomainKeys evaluation. Those results are not used when generating + this header field; rather, the results returned are listed below. + + A signature is "acceptable to the ADMD" if it passes local policy + checks (or there are no specific local policy checks). For example, + an ADMD policy might require that the signature(s) on the message be + added using the DNS domain present in the From header field of the + message, thus making third-party signatures unacceptable even if they + verify. + + Both DKIM and DomainKeys use the same result set, as follows: + + none: The message was not signed. + + pass: The message was signed, the signature or signatures were + acceptable to the ADMD, and the signature(s) passed verification + tests. + + fail: The message was signed and the signature or signatures were + acceptable to the ADMD, but they failed the verification test(s). + + policy: The message was signed, but some aspect of the signature or + signatures was not acceptable to the ADMD. + + neutral: The message was signed, but the signature or signatures + contained syntax errors or were not otherwise able to be + processed. This result is also used for other failures not + covered elsewhere in this list. + + temperror: The message could not be verified due to some error that + is likely transient in nature, such as a temporary inability to + retrieve a public key. A later attempt may produce a final + result. + + permerror: The message could not be verified due to some error that + is unrecoverable, such as a required header field being absent. A + later attempt is unlikely to produce a final result. + + DKIM results are reported using a ptype of "header". The property, + however, represents one of the tags found in the DKIM-Signature + header field rather than a distinct header field. For example, the + + + +Kucherawy Standards Track [Page 16] + +RFC 7601 Authentication-Results Header Field August 2015 + + + ptype-property combination "header.d" refers to the content of the + "d" (signing domain) tag from within the signature header field, and + not a distinct header field called "d". + + The ability to report different DKIM results for a message with + multiple signatures is described in [RFC6008]. + + [DKIM] advises that if a message fails verification, it is to be + treated as an unsigned message. A report of "fail" here permits the + receiver of the report to decide how to handle the failure. A report + of "neutral" or "none" preempts that choice, ensuring the message + will be treated as if it had not been signed. + + Section 3.1 of [DOMAINKEYS] describes a process by which the sending + address of the message is determined. DomainKeys results are thus + reported along with the signing domain name, the sending address of + the message, and the name of the header field from which the latter + was extracted. This means that a DomainKeys result includes a ptype- + property combination of "header.d", plus one of "header.from" and + "header.sender". The sending address extracted from the header is + included with any [MAIL]-style comments removed; moreover, the local- + part of the address and the "@" character are removed if it has not + been authenticated in some way. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 17] + +RFC 7601 Authentication-Results Header Field August 2015 + + +2.7.2. SPF and Sender ID + + SPF and Sender ID use the "spf" and "sender-id" method names, + respectively. The result values for SPF are defined in Section 2.6 + of [SPF], and those definitions are included here by reference: + + +-----------+--------------------------------+ + | Code | Meaning | + +-----------+--------------------------------+ + | none | [RFC7208], Section 2.6.1 | + +-----------+--------------------------------+ + | pass | [RFC7208], Section 2.6.3 | + +-----------+--------------------------------+ + | fail | [RFC7208], Section 2.6.4 | + +-----------+--------------------------------+ + | softfail | [RFC7208], Section 2.6.5 | + +-----------+--------------------------------+ + | policy | RFC 7601, Section 2.4 | + +-----------+--------------------------------+ + | neutral | [RFC7208], Section 2.6.2 | + +-----------+--------------------------------+ + | temperror | [RFC7208], Section 2.6.6 | + +-----------+--------------------------------+ + | permerror | [RFC7208], Section 2.6.7 | + +-----------+--------------------------------+ + + These result codes are used in the context of this specification to + reflect the result returned by the component conducting SPF + evaluation. + + For SPF, the ptype used is "smtp", and the property is either + "mailfrom" or "helo", since those values are the ones SPF can + evaluate. (If the SMTP client issued the EHLO command instead of + HELO, the property used is "helo".) + + The "sender-id" method is described in [SENDERID]. For this method, + the ptype used is "header" and the property will be the name of the + header field from which the Purported Responsible Address (see [PRA]) + was extracted -- namely, one of "Resent-Sender", "Resent-From", + "Sender", or "From". + + The results for Sender ID are listed and described in Section 4.2 of + [SENDERID], but for the purposes of this specification, the SPF + definitions enumerated above are used instead. Also, [SENDERID] + specifies result codes that use mixed case, but they are typically + used all lowercase in this context. + + + + + +Kucherawy Standards Track [Page 18] + +RFC 7601 Authentication-Results Header Field August 2015 + + + For both methods, an additional result of "policy" is defined, which + means the client was authorized to inject or relay mail on behalf of + the sender's DNS domain according to the authentication method's + algorithm, but local policy dictates that the result is unacceptable. + For example, "policy" might be used if SPF returns a "pass" result, + but a local policy check matches the sending DNS domain to one found + in an explicit list of unacceptable DNS domains (e.g., spammers). + + If the retrieved sender policies used to evaluate SPF and Sender ID + do not contain explicit provisions for authenticating the local-part + (see Section 3.4.1 of [MAIL]) of an address, the "pvalue" reported + along with results for these mechanisms SHOULD NOT include the local- + part or the following "@" character. + +2.7.3. "iprev" + + The result values used by the "iprev" method, defined in Section 3, + are as follows: + + pass: The DNS evaluation succeeded, i.e., the "reverse" and + "forward" lookup results were returned and were in agreement. + + fail: The DNS evaluation failed. In particular, the "reverse" and + "forward" lookups each produced results, but they were not in + agreement, or the "forward" query completed but produced no + result, e.g., a DNS RCODE of 3, commonly known as NXDOMAIN, or an + RCODE of 0 (NOERROR) in a reply containing no answers, was + returned. + + temperror: The DNS evaluation could not be completed due to some + error that is likely transient in nature, such as a temporary DNS + error, e.g., a DNS RCODE of 2, commonly known as SERVFAIL, or + other error condition resulted. A later attempt may produce a + final result. + + permerror: The DNS evaluation could not be completed because no PTR + data are published for the connecting IP address, e.g., a DNS + RCODE of 3, commonly known as NXDOMAIN, or an RCODE of 0 (NOERROR) + in a reply containing no answers, was returned. This prevented + completion of the evaluation. A later attempt is unlikely to + produce a final result. + + There is no "none" for this method since any TCP connection + delivering email has an IP address associated with it, so some kind + of evaluation will always be possible. + + The result is reported using a ptype of "policy" (as this is not part + of any established protocol) and a property of "iprev". + + + +Kucherawy Standards Track [Page 19] + +RFC 7601 Authentication-Results Header Field August 2015 + + + For discussion of the format of DNS replies, see "Domain Names - + Implementation and Specification" ([DNS]). + +2.7.4. SMTP AUTH + + SMTP AUTH (defined in [AUTH]) is represented by the "auth" method. + Its result values are as follows: + + none: SMTP authentication was not attempted. + + pass: The SMTP client authenticated to the server reporting the + result using the protocol described in [AUTH]. + + fail: The SMTP client attempted to authenticate to the server using + the protocol described in [AUTH] but was not successful (such as + providing a valid identity but an incorrect password). + + temperror: The SMTP client attempted to authenticate using the + protocol described in [AUTH] but was not able to complete the + attempt due to some error that is likely transient in nature, such + as a temporary directory service lookup error. A later attempt + may produce a final result. + + permerror: The SMTP client attempted to authenticate using the + protocol described in [AUTH] but was not able to complete the + attempt due to some error that is likely not transient in nature, + such as a permanent directory service lookup error. A later + attempt is not likely to produce a final result. + + The result of AUTH is reported using a ptype of "smtp" and a property + of either: + + o "auth", in which case the value is the authorization identity + generated by the exchange initiated by the AUTH command; or + + o "mailfrom", in which case the value is the mailbox identified by + the AUTH parameter used with the MAIL FROM command. + + If both identities are available, both can be reported. For example, + consider this command issued by a client that has completed session + authentication with the AUTH command resulting in an authorized + identity of "client@c.example": + + MAIL FROM: AUTH= + + This could result in a "resinfo" construction like so: + + ; auth=pass smtp.auth=client@c.example smtp.mailfrom=bob@b.example + + + +Kucherawy Standards Track [Page 20] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Note that in all cases other than "pass", the message was sent by an + unauthenticated client. All non-"pass" cases SHOULD thus be treated + as equivalent with respect to this method. + +2.7.5. Other Registered Codes + + Result codes were also registered in other RFCs as follows: + + o Vouch By Reference (in [AR-VBR], represented by "vbr"); + + o Authorized Third-Party Signatures (in [ATPS], represented by + "dkim-atps"); + + o Author Domain Signing Practices (in [ADSP], represented by "dkim- + adsp"); + + o Require-Recipient-Valid-Since (in [RRVS], represented by "rrvs"); + + o S/MIME (in [SMIME-REG], represented by "smime"). + +2.7.6. Extension Methods + + Additional authentication method identifiers (extension methods) may + be defined in the future by later revisions or extensions to this + specification. These method identifiers are registered with the + Internet Assigned Numbers Authority (IANA) and, preferably, published + in an RFC. See Section 6 for further details. + + Extension methods can be defined for the following reasons: + + 1. To allow additional information from new authentication systems + to be communicated to MUAs or downstream filters. The names of + such identifiers ought to reflect the name of the method being + defined but ought not be needlessly long. + + 2. To allow the creation of "sub-identifiers" that indicate + different levels of authentication and differentiate between + their relative strengths, e.g., "auth1-weak" and "auth1-strong". + + Authentication method implementers are encouraged to provide adequate + information, via message header field comments if necessary, to allow + an MUA developer to understand or relay ancillary details of + authentication results. For example, if it might be of interest to + relay what data was used to perform an evaluation, such information + could be relayed as a comment in the header field, such as: + + Authentication-Results: example.com; + foo=pass bar.baz=blob (2 of 3 tests OK) + + + +Kucherawy Standards Track [Page 21] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Experimental method identifiers MUST only be used within ADMDs that + have explicitly consented to use them. These method identifiers and + the parameters associated with them are not documented in RFCs. + Therefore, they are subject to change at any time and not suitable + for production use. Any MTA, MUA, or downstream filter intended for + production use SHOULD ignore or delete any Authentication-Results + header field that includes an experimental (unknown) method + identifier. + +2.7.7. Extension Result Codes + + Additional result codes (extension results) might be defined in the + future by later revisions or extensions to this specification. + Result codes MUST be registered with the Internet Assigned Numbers + Authority (IANA) and preferably published in an RFC. See Section 6 + for further details. + + Experimental results MUST only be used within ADMDs that have + explicitly consented to use them. These results and the parameters + associated with them are not formally documented. Therefore, they + are subject to change at any time and not suitable for production + use. Any MTA, MUA, or downstream filter intended for production use + SHOULD ignore or delete any Authentication-Results header field that + includes an extension result. + +3. The "iprev" Authentication Method + + This section defines an additional authentication method called + "iprev". + + "iprev" is an attempt to verify that a client appears to be valid + based on some DNS queries, which is to say that the IP address is + explicitly associated with a domain name. Upon receiving a session + initiation of some kind from a client, the IP address of the client + peer is queried for matching names (i.e., a number-to-name + translation, also known as a "reverse lookup" or a "PTR" record + query). Once that result is acquired, a lookup of each of the names + (i.e., a name-to-number translation, or an "A" or "AAAA" record + query) thus retrieved is done. The response to this second check + will typically result in at least one mapping back to the client's IP + address. + + Expressed as an algorithm: If the client peer's IP address is I, the + list of names to which I maps (after a "PTR" query) is the set N, and + the union of IP addresses to which each member of N maps (after + corresponding "A" and "AAAA" queries) is L, then this test is + successful if I is an element of L. + + + + +Kucherawy Standards Track [Page 22] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Often an MTA receiving a connection that fails this test will simply + reject the connection using the enhanced status code defined in + [AUTH-ESC]. If an operator instead wishes to make this information + available to downstream agents as a factor in handling decisions, it + records a result in accordance with Section 2.7.3. + + The response to a PTR query could contain multiple names. To prevent + heavy DNS loads, agents performing these queries MUST be implemented + such that the number of names evaluated by generation of + corresponding A or AAAA queries is limited so as not to be unduly + taxing to the DNS infrastructure, though it MAY be configurable by an + administrator. As an example, Section 4.6.4 of [SPF] chose a limit + of 10 for its implementation of this algorithm. + + "DNS Extensions to Support IP Version 6" ([DNS-IP6]) discusses the + query formats for the IPv6 case. + + There is some contention regarding the wisdom and reliability of this + test. For example, in some regions, it can be difficult for this + test ever to pass because the practice of arranging to match the + forward and reverse DNS is infrequently observed. Therefore, the + precise implementation details of how a verifier performs an "iprev" + test are not specified here. The verifier MAY report a successful or + failed "iprev" test at its discretion having done some kind of check + of the validity of the connection's identity using DNS. It is + incumbent upon an agent making use of the reported "iprev" result to + understand what exactly that particular verifier is attempting to + report. + + Extensive discussion of reverse DNS mapping and its implications can + be found in "Considerations for the use of DNS Reverse Mapping" + ([DNSOP-REVERSE]). In particular, it recommends that applications + avoid using this test as a means of authentication or security. Its + presence in this document is not an endorsement but is merely + acknowledgment that the method remains common and provides the means + to relay the results of that test. + +4. Adding the Header Field to a Message + + This specification makes no attempt to evaluate the relative + strengths of various message authentication methods that may become + available. The methods listed are an order-independent set; their + sequence does not indicate relative strength or importance of one + method over another. Instead, the MUA or downstream filter consuming + this header field is to interpret the result of each method based on + its own knowledge of what that method evaluates. + + + + + +Kucherawy Standards Track [Page 23] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Each "method" MUST refer to an authentication method declared in the + IANA registry or an extension method as described in Section 2.7.6, + and each "result" MUST refer to a result code declared in the IANA + registry or an extension result code as defined in Section 2.7.7. + See Section 6 for further information about the registered methods + and result codes. + + An MTA compliant with this specification adds this header field + (after performing one or more message authentication tests) to + indicate which MTA or ADMD performed the test, which test got + applied, and what the result was. If an MTA applies more than one + such test, it adds this header field either once per test or once + indicating all of the results. An MTA MUST NOT add a result to an + existing header field. + + An MTA MAY add this header field containing only the authentication + identifier portion and the "none" token (see Section 2.2) to indicate + explicitly that no message authentication schemes were applied prior + to delivery of this message. + + An MTA adding this header field has to take steps to identify it as + legitimate to the MUAs or downstream filters that will ultimately + consume its content. One process to do so is described in Section 5. + Further measures may be necessary in some environments. Some + possible solutions are enumerated in Section 7.1. This document does + not mandate any specific solution to this issue as each environment + has its own facilities and limitations. + + Most known message authentication methods focus on a particular + identifier to evaluate. SPF and Sender ID differ in that they can + yield a result based on more than one identifier; specifically, SPF + can evaluate the RFC5321.HELO parameter or the RFC5321.MailFrom + parameter, and Sender ID can evaluate the RFC5321.MailFrom parameter + or the Purported Responsible Address (PRA) identity. When generating + this field to report those results, only the parameter that yielded + the result is included. + + For MTAs that add this header field, adding header fields in order + (at the top), per Section 3.6 of [MAIL], is particularly important. + Moreover, this header field SHOULD be inserted above any other trace + header fields such MTAs might prepend. This placement allows easy + detection of header fields that can be trusted. + + End users making direct use of this header field might inadvertently + trust information that has not been properly vetted. If, for + example, a basic SPF result were to be relayed that claims an + authenticated addr-spec, the local-part of that addr-spec has + actually not been authenticated. Thus, an MTA adding this header + + + +Kucherawy Standards Track [Page 24] + +RFC 7601 Authentication-Results Header Field August 2015 + + + field SHOULD NOT include any data that has not been authenticated by + the method(s) being applied. Moreover, MUAs SHOULD NOT render to + users such information if it is presented by a method known not to + authenticate it. + +4.1. Header Field Position and Interpretation + + In order to ensure non-ambiguous results and avoid the impact of + false header fields, MUAs and downstream filters SHOULD NOT interpret + this header field unless specifically configured to do so by the user + or administrator. That is, this interpretation should not be "on by + default". Naturally then, users or administrators ought not activate + such a feature unless (1) they are certain the header field will be + validly added by an agent within the ADMD that accepts the mail that + is ultimately read by the MUA, and (2) instances of the header field + that appear to originate within the ADMD but are actually added by + foreign MTAs will be removed before delivery. + + Furthermore, MUAs and downstream filters SHOULD NOT interpret this + header field unless the authentication service identifier it bears + appears to be one used within its own ADMD as configured by the user + or administrator. + + MUAs and downstream filters MUST ignore any result reported using a + "result" not specified in the IANA "Result Code" registry or a + "ptype" not listed in the "Email Authentication Property Types" + registry for such values as defined in Section 6. Moreover, such + agents MUST ignore a result indicated for any "method" they do not + specifically support. + + An MUA SHOULD NOT reveal these results to end users, absent careful + human factors design considerations and testing, for the presentation + of trust-related materials. For example, an attacker could register + examp1e.com (note the digit "1" (one)) and send signed mail to + intended victims; a verifier would detect that the signature was + valid and report a "pass" even though it's clear the DNS domain name + was intended to mislead. See Section 7.2 for further discussion. + + As stated in Section 2.1, this header field MUST be treated as though + it were a trace header field as defined in Section 3.6.7 of [MAIL] + and hence MUST NOT be reordered and MUST be prepended to the message, + so that there is generally some indication upon delivery of where in + the chain of handling MTAs the message authentication was done. + + Note that there are a few message handlers that are only capable of + appending new header fields to a message. Strictly speaking, these + handlers are not compliant with this specification. They can still + add the header field to carry authentication details, but any signal + + + +Kucherawy Standards Track [Page 25] + +RFC 7601 Authentication-Results Header Field August 2015 + + + about where in the handling chain the work was done may be lost. + Consumers SHOULD be designed such that this can be tolerated, + especially from a producer known to have this limitation. + + MUAs SHOULD ignore instances of this header field discovered within + message/rfc822 MIME attachments. + + Further discussion of these topics can be found in Section 7 below. + +4.2. Local Policy Enforcement + + Some sites have a local policy that considers any particular + authentication policy's non-recoverable failure results (typically + "fail" or similar) as justification for rejecting the message. In + such cases, the border MTA SHOULD issue an SMTP rejection response to + the message, rather than adding this header field and allowing the + message to proceed toward delivery. This is more desirable than + allowing the message to reach an internal host's MTA or spam filter, + thus possibly generating a local rejection such as a Delivery Status + Notification (DSN) [DSN] to a forged originator. Such generated + rejections are colloquially known as "backscatter". + + The same MAY also be done for local policy decisions overriding the + results of the authentication methods (e.g., the "policy" result + codes described in Section 2.7). + + Such rejections at the SMTP protocol level are not possible if local + policy is enforced at the MUA and not the MTA. + +5. Removing Existing Header Fields + + For security reasons, any MTA conforming to this specification MUST + delete any discovered instance of this header field that claims, by + virtue of its authentication service identifier, to have been added + within its trust boundary but that did not come directly from another + trusted MTA. For example, an MTA for example.com receiving a message + MUST delete or otherwise obscure any instance of this header field + bearing an authentication service identifier indicating that the + header field was added within example.com prior to adding its own + header fields. This could mean each MTA will have to be equipped + with a list of internal MTAs known to be compliant (and hence + trustworthy). + + For simplicity and maximum security, a border MTA could remove all + instances of this header field on mail crossing into its trust + boundary. However, this may conflict with the desire to access + authentication results performed by trusted external service + providers. It may also invalidate signed messages whose signatures + + + +Kucherawy Standards Track [Page 26] + +RFC 7601 Authentication-Results Header Field August 2015 + + + cover external instances of this header field. A more robust border + MTA could allow a specific list of authenticating MTAs whose + information is to be admitted, removing the header field originating + from all others. + + As stated in Section 1.2, a formal definition of "trust boundary" is + deliberately not made here. It is entirely possible that a border + MTA for example.com will explicitly trust authentication results + asserted by upstream host example.net even though they exist in + completely disjoint administrative boundaries. In that case, the + border MTA MAY elect not to delete those results; moreover, the + upstream host doing some authentication work could apply a signing + technology such as [DKIM] on its own results to assure downstream + hosts of their authenticity. An example of this is provided in + Appendix B. + + Similarly, in the case of messages signed using [DKIM] or other + message-signing methods that sign header fields, this removal action + could invalidate one or more signatures on the message if they + covered the header field to be removed. This behavior can be + desirable since there's little value in validating the signature on a + message with forged header fields. However, signing agents MAY + therefore elect to omit these header fields from signing to avoid + this situation. + + An MTA SHOULD remove any instance of this header field bearing a + version (express or implied) that it does not support. However, an + MTA MUST remove such a header field if the [SMTP] connection relaying + the message is not from a trusted internal MTA. This means the MTA + needs to be able to understand versions of this header field at least + as late as the ones understood by the MUAs or other consumers within + its ADMD. + +6. IANA Considerations + + IANA has registered the defined header field and created tables as + described below. These registry actions were originally defined by + [RFC5451] and updated by [RFC6577] and [RFC7001]. The created + registries are being further updated here to increase their + completeness. + +6.1. The Authentication-Results Header Field + + [RFC5451] added the Authentication-Results header field to the IANA + "Permanent Message Header Field Names" registry, per the procedure + found in [IANA-HEADERS]. That entry has been updated to reference + this document. The following is the registration template: + + + + +Kucherawy Standards Track [Page 27] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Header field name: Authentication-Results + Applicable protocol: mail ([MAIL]) + Status: Standard + Author/Change controller: IETF + Specification document(s): RFC 7601 + Related information: none + +6.2. "Email Authentication Methods" Registry Description + + Names of message authentication methods supported by this + specification have been registered with IANA, with the exception of + experimental names as described in Section 2.7.6. Along with each + method is recorded the properties that accompany the method's result. + + The "Email Authentication Parameters" group, and within it the "Email + Authentication Methods" registry, were created by [RFC5451] for this + purpose. [RFC6577] added a "status" field for each entry. [RFC7001] + amended the rules governing that registry and also added a "version" + field to the registry. + + The reference for that registry has been updated to reference this + document. + + New entries are assigned only for values that have received Expert + Review, per [IANA-CONSIDERATIONS]. The designated expert shall be + appointed by the IESG. The designated expert has discretion to + request that a publication be referenced if a clear, concise + definition of the authentication method cannot be provided such that + interoperability is assured. Registrations should otherwise be + permitted. The designated expert can also handle requests to mark + any current registration as "deprecated". + + No two entries can have the same combination of method, ptype, and + property. + + An entry in this registry contains the following: + + Method: the name of the method. + + Definition: a reference to the document that created this entry, if + any (see below). + + ptype: a "ptype" value appropriate for use with that method. + + property: a "property" value matching that "ptype" also appropriate + for use with that method. + + + + + +Kucherawy Standards Track [Page 28] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Value: a brief description of the value to be supplied with that + method/ptype/property tuple. + + Status: the status of this entry, which is either: + + active: The entry is in current use. + + deprecated: The entry is no longer in current use. + + Version: a version number associated with the method (preferably + starting at "1"). + + The "Definition" field will typically refer to a permanent document, + or at least some descriptive text, where additional information about + the entry being added can be found. This might in turn reference the + document where the method is defined so that all of the semantics + around creating or interpreting an Authentication-Results header + field using this method, ptype, and property can be understood. + +6.3. "Email Authentication Methods" Registry Update + + The following changes have been made to this registry per this + document: + + 1. The "Defined" field has been renamed "Definition", to be + consistent with the other registries in this group. + + 2. The entry for the "dkim" method, "header" ptype, and "b" property + now reference [RFC6008] as the defining document, and the + reference has be removed from the description. + + 3. All other "dkim", "domainkeys", "iprev", "sender-id", and "spf" + method entries have had their "Definition" fields changed to + refer to this document, as this document contains a complete + description of the registry and these corresponding values. + + 4. All "smime" entries have had their "Definition" fields changed to + [SMIME-REG]. + + 5. The "value" field of the "smime" entry using property "smime- + part" has been changed to read: "The MIME body part reference + that contains the S/MIME signature. See Section 3.2.1 of RFC + 7281 for full syntax." + + + + + + + + +Kucherawy Standards Track [Page 29] + +RFC 7601 Authentication-Results Header Field August 2015 + + + 6. The single entry for the "auth" method was intended to reflect + the identity indicated by the "AUTH" parameter to the SMTP "MAIL + FROM" command verb. However, there is also an "AUTH" command + verb. To clarify this ambiguity, the entry for the "auth" method + has had its "property" field changed to "mailfrom", and its + "Definition" field changed to this document. + + 7. The following entry has been added: + + Method: auth + + Definition: this document (RFC 7601) + + ptype: smtp + + property: auth + + Value: identity confirmed by the AUTH command + + Status: active + + Version: 1 + + 8. The values of the "domainkeys" entries for ptype "header" have + been updated as follows: + + from: contents of the [MAIL] From: header field, after removing + comments, and removing the local-part and following "@" if not + authenticated + + sender: contents of the [MAIL] Sender: header field, after + removing comments, and removing the local-part and following + "@" if not authenticated + + 9. For all entries for "dkim-adsp" and "domainkeys", their Status + values have been changed to "deprecated", reflecting the fact + that the corresponding specifications now have Historic status. + Their "Definition" fields have also been modified to include a + reference to this document. + +6.4. "Email Authentication Property Types" Registry + + [RFC7410] created the "Email Authentication Property Types" registry. + + Entries in this registry are subject to the Expert Review rules as + described in [IANA-CONSIDERATIONS]. Each entry in the registry + requires the following values: + + + + +Kucherawy Standards Track [Page 30] + +RFC 7601 Authentication-Results Header Field August 2015 + + + ptype: The name of the ptype being registered, which must fit within + the ABNF described in Section 2.2. + + Definition: An optional reference to a defining specification. + + Description: A brief description of what sort of information this + "ptype" is meant to cover. + + For new entries, the Designated Expert needs to assure that the + description provided for the new entry adequately describes the + intended use. An example would be helpful to include in the entry's + defining document, if any, although entries in the "Email + Authentication Methods" registry or the "Email Authentication Result + Names" registry might also serve as examples of intended use. + + As this is a complete restatement of the definition and rules for + this registry, IANA has updated this registry to show Section 2.3 of + this document as the current definitions for the "body", "header", + "policy", and "smtp" entries of that registry. References to + [RFC7001] and [RFC7410] have been removed. + +6.5. "Email Authentication Result Names" Description + + Names of message authentication result codes supported by this + specification must be registered with IANA, with the exception of + experimental codes as described in Section 2.7.7. A registry was + created by [RFC5451] for this purpose. [RFC6577] added the "status" + column and [RFC7001] updated the rules governing that registry. + + New entries are assigned only for values that have received Expert + Review, per [IANA-CONSIDERATIONS]. The designated expert shall be + appointed by the IESG. The designated expert has discretion to + request that a publication be referenced if a clear, concise + definition of the authentication result cannot be provided such that + interoperability is assured. Registrations should otherwise be + permitted. The designated expert can also handle requests to mark + any current registration as "deprecated". + + No two entries can have the same combination of method and code. + + An entry in this registry contains the following: + + Auth Method: an authentication method for which results are being + returned using the header field defined in this document. + + Code: a result code that can be returned for this authentication + method. + + + + +Kucherawy Standards Track [Page 31] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Specification: either free form text explaining the meaning of this + method-code combination, or a reference to such a definition. + + Status: the status of this entry, which is either: + + active: The entry is in current use. + + deprecated: The entry is no longer in current use. + +6.6. "Email Authentication Result Names" Update + + This document includes a complete description of the registry, + obsoleting [RFC7001]. Accordingly, the following changes have been + made to this registry per this document: + + o The "Defined" field has been removed. + + o The "Meaning" field has been renamed "Specification", as described + above. + + o The "Auth Method" field now appears before the "Code" field. + + o For easier searching, the table has been arranged such that it is + sorted first by Auth Method, then by Code within each Auth Method + grouping. + + o All entries for the "dkim", "domainkeys", "spf", "sender-id", + "auth", and "iprev" methods have had their "Specification" fields + replaced as follows: + + dkim: Section 2.7.1 of this document (RFC 7601) + + domainkeys: Section 2.7.1 of this document (RFC 7601) + + spf: for "hardfail", Section 2.4.2 of [RFC5451]; for all others, + Section 2.7.2 of this document (RFC 7601) + + sender-id: for "hardfail", Section 2.4.2 of [RFC5451]; for all + others, Section 2.7.2 of this document (RFC 7601) + + auth: Section 2.7.4 of this document (RFC 7601) + + iprev: Section 2.7.3 of this document (RFC 7601) + + o All entries for "dkim-adsp" that were missing an explicit + reference to a defining document now reference [ADSP] in their + "Specification" fields. + + + + +Kucherawy Standards Track [Page 32] + +RFC 7601 Authentication-Results Header Field August 2015 + + + o All entries for "dmarc" have had their "Specification" fields + changed to reference Section 11.2 of [DMARC]. + + o All entries for "dkim-adsp" and "domainkeys" have had their Status + values changed to "deprecated", reflecting the fact that the + corresponding specifications now have Historic status. Their + "Specification" fields have also been modified to include a + reference to this document. + +6.7. SMTP Enhanced Status Codes + + The entry for X.7.25 in the "Enumerated Status Codes" sub-registry of + the "Simple Mail Transfer Protocol (SMTP) Enhanced Status Codes + Registry" has been updated to refer to this document instead of + [RFC7001]. + +7. Security Considerations + + The following security considerations apply when adding or processing + the Authentication-Results header field: + +7.1. Forged Header Fields + + An MUA or filter that accesses a mailbox whose messages are handled + by a non-conformant MTA, and understands Authentication-Results + header fields, could potentially make false conclusions based on + forged header fields. A malicious user or agent could forge a header + field using the DNS domain of a receiving ADMD as the authserv-id + token in the value of the header field and, with the rest of the + value, claim that the message was properly authenticated. The non- + conformant MTA would fail to strip the forged header field, and the + MUA could inappropriately trust it. + + For this reason, it is best not to have processing of the + Authentication-Results header field enabled by default; instead, it + should be ignored, at least for the purposes of enacting filtering + decisions, unless specifically enabled by the user or administrator + after verifying that the border MTA is compliant. It is acceptable + to have an MUA aware of this specification but have an explicit list + of hostnames whose Authentication-Results header fields are + trustworthy; however, this list should initially be empty. + + Proposed alternative solutions to this problem were made some time + ago and are listed below. To date, they have not been developed due + to lack of demand but are documented here should the information be + useful at some point in the future: + + + + + +Kucherawy Standards Track [Page 33] + +RFC 7601 Authentication-Results Header Field August 2015 + + + 1. Possibly the simplest is a digital signature protecting the + header field, such as using [DKIM], that can be verified by an + MUA by using a posted public key. Although one of the main + purposes of this document is to relieve the burden of doing + message authentication work at the MUA, this only requires that + the MUA learn a single authentication scheme even if a number of + them are in use at the border MTA. Note that [DKIM] requires + that the From header field be signed, although in this + application, the signing agent (a trusted MTA) likely cannot + authenticate that value, so the fact that it is signed should be + ignored. Where the authserv-id is the ADMD's domain name, the + authserv-id matching this valid internal signature's "d=" DKIM + value is sufficient. + + 2. Another would be a means to interrogate the MTA that added the + header field to see if it is actually providing any message + authentication services and saw the message in question, but this + isn't especially palatable given the work required to craft and + implement such a scheme. + + 3. Yet another might be a method to interrogate the internal MTAs + that apparently handled the message (based on Received header + fields) to determine whether any of them conform to Section 5 of + this memo. This, too, has potentially high barriers to entry. + + 4. Extensions to [IMAP], [SMTP], and [POP3] could be defined to + allow an MUA or filtering agent to acquire the authserv-id in use + within an ADMD, thus allowing it to identify which + Authentication-Results header fields it can trust. + + 5. On the presumption that internal MTAs are fully compliant with + Section 3.6 of [MAIL] and the compliant internal MTAs are using + their own hostnames or the ADMD's DNS domain name as the + authserv-id token, the header field proposed here should always + appear above a Received header added by a trusted MTA. This can + be used as a test for header field validity. + + Support for some of these is being considered for future work. + + In any case, a mechanism needs to exist for an MUA or filter to + verify that the host that appears to have added the header field (a) + actually did so and (b) is legitimately adding that header field for + this delivery. Given the variety of messaging environments deployed + today, consensus appears to be that specifying a particular mechanism + for doing so is not appropriate for this document. + + + + + + +Kucherawy Standards Track [Page 34] + +RFC 7601 Authentication-Results Header Field August 2015 + + + Mitigation of the forged header field attack can also be accomplished + by moving the authentication results data into metadata associated + with the message. In particular, an [SMTP] extension could be + established to communicate authentication results from the border MTA + to intermediate and delivery MTAs; the latter of these could arrange + to store the authentication results as metadata retrieved and + rendered along with the message by an [IMAP] client aware of a + similar extension in that protocol. The delivery MTA would be told + to trust data via this extension only from MTAs it trusts, and border + MTAs would not accept data via this extension from any source. There + is no vector in such an arrangement for forgery of authentication + data by an outside agent. + +7.2. Misleading Results + + Until some form of service for querying the reputation of a sending + agent is widely deployed, the existence of this header field + indicating a "pass" does not render the message trustworthy. It is + possible for an arriving piece of spam or other undesirable mail to + pass checks by several of the methods enumerated above (e.g., a piece + of spam signed using [DKIM] by the originator of the spam, which + might be a spammer or a compromised system). In particular, this + issue is not resolved by forged header field removal discussed above. + + Hence, MUAs and downstream filters must take some care with use of + this header even after possibly malicious headers are scrubbed. + +7.3. Header Field Position + + Despite the requirements of [MAIL], header fields can sometimes be + reordered en route by intermediate MTAs. The goal of requiring + header field addition only at the top of a message is an + acknowledgment that some MTAs do reorder header fields, but most do + not. Thus, in the general case, there will be some indication of + which MTAs (if any) handled the message after the addition of the + header field defined here. + +7.4. Reverse IP Query Denial-of-Service Attacks + + Section 4.6.4 of [SPF] describes a DNS-based denial-of-service attack + for verifiers that attempt DNS-based identity verification of + arriving client connections. A verifier wishing to do this check and + report this information needs to take care not to go to unbounded + lengths to resolve "A" and "PTR" queries. MUAs or other filters + making use of an "iprev" result specified by this document need to be + aware of the algorithm used by the verifier reporting the result and, + especially, its limitations. + + + + +Kucherawy Standards Track [Page 35] + +RFC 7601 Authentication-Results Header Field August 2015 + + +7.5. Mitigation of Backscatter + + Failing to follow the instructions of Section 4.2 can result in a + denial-of-service attack caused by the generation of [DSN] messages + (or equivalent) to addresses that did not send the messages being + rejected. + +7.6. Internal MTA Lists + + Section 5 describes a procedure for scrubbing header fields that may + contain forged authentication results about a message. A compliant + installation will have to include, at each MTA, a list of other MTAs + known to be compliant and trustworthy. Failing to keep this list + current as internal infrastructure changes may expose an ADMD to + attack. + +7.7. Attacks against Authentication Methods + + If an attack becomes known against an authentication method, clearly + then the agent verifying that method can be fooled into thinking an + inauthentic message is authentic, and thus the value of this header + field can be misleading. It follows that any attack against the + authentication methods supported by this document is also a security + consideration here. + +7.8. Intentionally Malformed Header Fields + + It is possible for an attacker to add an Authentication-Results + header field that is extraordinarily large or otherwise malformed in + an attempt to discover or exploit weaknesses in header field parsing + code. Implementers must thoroughly verify all such header fields + received from MTAs and be robust against intentionally as well as + unintentionally malformed header fields. + +7.9. Compromised Internal Hosts + + An internal MUA or MTA that has been compromised could generate mail + with a forged From header field and a forged Authentication-Results + header field that endorses it. Although it is clearly a larger + concern to have compromised internal machines than it is to prove the + value of this header field, this risk can be mitigated by arranging + that internal MTAs will remove this header field if it claims to have + been added by a trusted border MTA (as described above), yet the + [SMTP] connection is not coming from an internal machine known to be + running an authorized MTA. However, in such a configuration, + legitimate MTAs will have to add this header field when legitimate + internal-only messages are generated. This is also covered in + Section 5. + + + +Kucherawy Standards Track [Page 36] + +RFC 7601 Authentication-Results Header Field August 2015 + + +7.10. Encapsulated Instances + + MIME messages can contain attachments of type "message/rfc822", which + contain other messages. Such an encapsulated message can also + contain an Authentication-Results header field. Although the + processing of these is outside of the intended scope of this document + (see Section 1.3), some early guidance to MUA developers is + appropriate here. + + Since MTAs are unlikely to strip Authentication-Results header fields + after mailbox delivery, MUAs are advised in Section 4.1 to ignore + such instances within MIME attachments. Moreover, when extracting a + message digest to separate mail store messages or other media, such + header fields should be removed so that they will never be + interpreted improperly by MUAs that might later consume them. + +7.11. Reverse Mapping + + Although Section 3 of this memo includes explicit support for the + "iprev" method, its value as an authentication mechanism is limited. + Implementers of both this proposal and agents that use the data it + relays are encouraged to become familiar with the issues raised by + [DNSOP-REVERSE] when deciding whether or not to include support for + "iprev". + +8. References + +8.1. Normative References + + [ABNF] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + . + + [IANA-HEADERS] + Klyne, G., Nottingham, M., and J. Mogul, "Registration + Procedures for Message Header Fields", BCP 90, RFC 3864, + DOI 10.17487/RFC3864, September 2004, + . + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [MAIL] Resnick, P., Ed., "Internet Message Format", RFC 5322, + DOI 10.17487/RFC5322, October 2008, + . + + + +Kucherawy Standards Track [Page 37] + +RFC 7601 Authentication-Results Header Field August 2015 + + + [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, DOI 10.17487/RFC2045, November 1996, + . + + [SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, + DOI 10.17487/RFC5321, October 2008, + . + +8.2. Informative References + + [ADSP] Allman, E., Fenton, J., Delany, M., and J. Levine, + "DomainKeys Identified Mail (DKIM) Author Domain Signing + Practices (ADSP)", RFC 5617, DOI 10.17487/RFC5617, August + 2009, . + + [AR-VBR] Kucherawy, M., "Authentication-Results Registration for + Vouch by Reference Results", RFC 6212, + DOI 10.17487/RFC6212, April 2011, + . + + [ATPS] Kucherawy, M., "DomainKeys Identified Mail (DKIM) + Authorized Third-Party Signatures", RFC 6541, + DOI 10.17487/RFC6541, February 2012, + . + + [AUTH] Siemborski, R., Ed. and A. Melnikov, Ed., "SMTP Service + Extension for Authentication", RFC 4954, + DOI 10.17487/RFC4954, July 2007, + . + + [AUTH-ESC] + Kucherawy, M., "Email Authentication Status Codes", + RFC 7372, DOI 10.17487/RFC7372, September 2014, + . + + [DKIM] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., + "DomainKeys Identified Mail (DKIM) Signatures", STD 76, + RFC 6376, DOI 10.17487/RFC6376, September 2011, + . + + [DMARC] Kucherawy, M., Ed. and E. Zwicky, Ed., "Domain-based + Message Authentication, Reporting, and Conformance + (DMARC)", RFC 7489, DOI 10.17487/RFC7489, March 2015, + . + + + + + + +Kucherawy Standards Track [Page 38] + +RFC 7601 Authentication-Results Header Field August 2015 + + + [DNS] Mockapetris, P., "Domain names - implementation and + specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, + November 1987, . + + [DNS-IP6] Thomson, S., Huitema, C., Ksinant, V., and M. Souissi, + "DNS Extensions to Support IP Version 6", RFC 3596, + DOI 10.17487/RFC3596, October 2003, + . + + [DNSOP-REVERSE] + Senie, D. and A. Sullivan, "Considerations for the use of + DNS Reverse Mapping", Work in Progress, draft-ietf-dnsop- + reverse-mapping-considerations-06, March 2008. + + [DOMAINKEYS] + Delany, M., "Domain-Based Email Authentication Using + Public Keys Advertised in the DNS (DomainKeys)", RFC 4870, + DOI 10.17487/RFC4870, May 2007, + . + + [DSN] Moore, K. and G. Vaudreuil, "An Extensible Message Format + for Delivery Status Notifications", RFC 3464, + DOI 10.17487/RFC3464, January 2003, + . + + [EMAIL-ARCH] + Crocker, D., "Internet Mail Architecture", RFC 5598, + DOI 10.17487/RFC5598, July 2009, + . + + [IANA-CONSIDERATIONS] + Narten, T. and H. Alvestrand, "Guidelines for Writing an + IANA Considerations Section in RFCs", BCP 26, RFC 5226, + DOI 10.17487/RFC5226, May 2008, + . + + [IMAP] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION + 4rev1", RFC 3501, DOI 10.17487/RFC3501, March 2003, + . + + [POP3] Myers, J. and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, DOI 10.17487/RFC1939, May 1996, + . + + [PRA] Lyon, J., "Purported Responsible Address in E-Mail + Messages", RFC 4407, DOI 10.17487/RFC4407, April 2006, + . + + + + +Kucherawy Standards Track [Page 39] + +RFC 7601 Authentication-Results Header Field August 2015 + + + [RFC5451] Kucherawy, M., "Message Header Field for Indicating + Message Authentication Status", RFC 5451, + DOI 10.17487/RFC5451, April 2009, + . + + [RFC6008] Kucherawy, M., "Authentication-Results Registration for + Differentiating among Cryptographic Results", RFC 6008, + DOI 10.17487/RFC6008, September 2010, + . + + [RFC6577] Kucherawy, M., "Authentication-Results Registration Update + for Sender Policy Framework (SPF) Results", RFC 6577, + DOI 10.17487/RFC6577, March 2012, + . + + [RFC7001] Kucherawy, M., "Message Header Field for Indicating + Message Authentication Status", RFC 7001, + DOI 10.17487/RFC7001, September 2013, + . + + [RFC7410] Kucherawy, M., "A Property Types Registry for the + Authentication-Results Header Field", RFC 7410, + DOI 10.17487/RFC7410, December 2014, + . + + [RRVS] Mills, W. and M. Kucherawy, "The Require-Recipient-Valid- + Since Header Field and SMTP Service Extension", RFC 7293, + DOI 10.17487/RFC7293, July 2014, + . + + [SECURITY] Rescorla, E. and B. Korver, "Guidelines for Writing RFC + Text on Security Considerations", BCP 72, RFC 3552, + DOI 10.17487/RFC3552, July 2003, + . + + [SENDERID] Lyon, J. and M. Wong, "Sender ID: Authenticating E-Mail", + RFC 4406, DOI 10.17487/RFC4406, April 2006, + . + + [SMIME-REG] + Melnikov, A., "Authentication-Results Registration for + S/MIME Signature Verification", RFC 7281, + DOI 10.17487/RFC7281, June 2014, + . + + + + + + + +Kucherawy Standards Track [Page 40] + +RFC 7601 Authentication-Results Header Field August 2015 + + + [SPF] Kitterman, S., "Sender Policy Framework (SPF) for + Authorizing Use of Domains in Email, Version 1", RFC 7208, + DOI 10.17487/RFC7208, April 2014, + . + + [VBR] Hoffman, P., Levine, J., and A. Hathcock, "Vouch By + Reference", RFC 5518, DOI 10.17487/RFC5518, April 2009, + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 41] + +RFC 7601 Authentication-Results Header Field August 2015 + + +Appendix A. Legacy MUAs + + Implementers of this protocol should be aware that many MUAs are + unlikely to be retrofitted to support the new header field and its + semantics. In the interests of convenience and quicker adoption, a + delivery MTA might want to consider adding things that are processed + by existing MUAs in addition to the Authentication-Results header + field. One suggestion is to include a Priority header field, on + messages that don't already have such a header field, containing a + value that reflects the strength of the authentication that was + accomplished, e.g., "low" for weak or no authentication, "normal" or + "high" for good or strong authentication. + + Some modern MUAs can already filter based on the content of this + header field. However, there is keen interest in having MUAs make + some kind of graphical representation of this header field's meaning + to end users. Until this capability is added (i.e., while this + proposal and its successors are being adopted), other interim means + of conveying authentication results may be necessary. + +Appendix B. Authentication-Results Examples + + This section presents some examples of the use of this header field + to indicate authentication results. + +B.1. Trivial Case; Header Field Not Present + + The trivial case: + + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by server.example.org (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.org + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 1: Trivial Case + + + + + + + + +Kucherawy Standards Track [Page 42] + +RFC 7601 Authentication-Results Header Field August 2015 + + + The Authentication-Results header field is completely absent. The + MUA may make no conclusion about the validity of the message. This + could be the case because the message authentication services were + not available at the time of delivery, or no service is provided, or + the MTA is not in compliance with this specification. + +B.2. Nearly Trivial Case; Service Provided, but No Authentication Done + + A message that was delivered by an MTA that conforms to this + specification but provides no actual message authentication service: + + Authentication-Results: example.org 1; none + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by server.example.org (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.org + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 2: Header Present but No Authentication Done + + The Authentication-Results header field is present, showing that the + delivering MTA conforms to this specification. It used its DNS + domain name as the authserv-id. The presence of "none" (and the + absence of any method or result tokens) indicates that no message + authentication was done. The version number of the specification to + which the field's content conforms is explicitly provided. + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 43] + +RFC 7601 Authentication-Results Header Field August 2015 + + +B.3. Service Provided, Authentication Done + + A message that was delivered by an MTA that conforms to this + specification and applied some message authentication: + + Authentication-Results: example.com; + spf=pass smtp.mailfrom=example.net + Received: from dialup-1-2-3-4.example.net + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.net + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + Message-Id: <12345.abc@example.net> + Subject: here's a sample + + Hello! Goodbye! + + Example 3: Header Reporting Results + + The Authentication-Results header field is present, indicating that + the border MTA conforms to this specification. The authserv-id is + once again the DNS domain name. Furthermore, the message was + authenticated by that MTA via the method specified in [SPF]. Note + that since that method cannot authenticate the local-part, it has + been omitted from the result's value. The MUA could extract and + relay this extra information if desired. + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 44] + +RFC 7601 Authentication-Results Header Field August 2015 + + +B.4. Service Provided, Several Authentications Done, Single MTA + + A message that was relayed inbound via a single MTA that conforms to + this specification and applied three different message authentication + checks: + + Authentication-Results: example.com; + auth=pass (cram-md5) smtp.auth=sender@example.net; + spf=pass smtp.mailfrom=example.net + Authentication-Results: example.com; + sender-id=pass header.from=example.net + Received: from dialup-1-2-3-4.example.net (8.11.6/8.11.6) + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTPA id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + From: sender@example.net + Message-Id: <12345.abc@example.net> + Subject: here's a sample + + Hello! Goodbye! + + Example 4: Headers Reporting Results from One MTA + + The Authentication-Results header field is present, indicating that + the delivering MTA conforms to this specification. Once again, the + receiving DNS domain name is used as the authserv-id. Furthermore, + the sender authenticated herself/himself to the MTA via a method + specified in [AUTH], and both SPF and Sender ID checks were done and + passed. The MUA could extract and relay this extra information if + desired. + + Two Authentication-Results header fields are not required since the + same host did all of the checking. The authenticating agent could + have consolidated all the results into one header field. + + This example illustrates a scenario in which a remote user on a dial- + up connection (example.net) sends mail to a border MTA (example.com) + using SMTP authentication to prove identity. The dial-up provider + has been explicitly authorized to relay mail as example.com, + producing "pass" results from the SPF and Sender ID checks. + + + + + + + + +Kucherawy Standards Track [Page 45] + +RFC 7601 Authentication-Results Header Field August 2015 + + +B.5. Service Provided, Several Authentications Done, Different MTAs + + A message that was relayed inbound by two different MTAs that conform + to this specification and applied multiple message authentication + checks: + + Authentication-Results: example.com; + sender-id=fail header.from=example.com; + dkim=pass (good signature) header.d=example.com + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by auth-checker.example.com (8.11.6/8.11.6) + with ESMTP id i7PK0sH7021929; + Fri, Feb 15 2002 17:19:22 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; d=example.com; + t=1188964191; c=simple/simple; h=From:Date:To:Subject: + Message-Id:Authentication-Results; + bh=sEuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m70; + b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM= + Authentication-Results: example.com; + auth=pass (cram-md5) smtp.auth=sender@example.com; + spf=fail smtp.mailfrom=example.com + Received: from dialup-1-2-3-4.example.net + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTPA id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 5: Headers Reporting Results from Multiple MTAs + + The Authentication-Results header field is present, indicating + conformance to this specification. Once again, the authserv-id used + is the recipient's DNS domain name. The header field is present + twice because two different MTAs in the chain of delivery did + authentication tests. The first MTA, mail-router.example.com, + reports that SMTP AUTH and SPF were both used and that the former + passed while the latter failed. In the SMTP AUTH case, additional + information is provided in the comment field, which the MUA can + choose to render if desired. + + + + + +Kucherawy Standards Track [Page 46] + +RFC 7601 Authentication-Results Header Field August 2015 + + + The second MTA, auth-checker.example.com, reports that it did a + Sender ID test (which failed) and a DKIM test (which passed). Again, + additional data about one of the tests is provided as a comment, + which the MUA may choose to render. Also noteworthy here is the fact + that there is a DKIM signature added by example.com that assured the + integrity of the lower Authentication-Results field. + + Since different hosts did the two sets of authentication checks, the + header fields cannot be consolidated in this example. + + This example illustrates more typical transmission of mail into + example.com from a user on a dial-up connection example.net. The + user appears to be legitimate as he/she had a valid password allowing + authentication at the border MTA using SMTP AUTH. The SPF and Sender + ID tests failed since example.com has not granted example.net + authority to relay mail on its behalf. However, the DKIM test passed + because the sending user had a private key matching one of + example.com's published public keys and used it to sign the message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 47] + +RFC 7601 Authentication-Results Header Field August 2015 + + +B.6. Service Provided, Multi-tiered Authentication Done + + A message that had authentication done at various stages, one of + which was outside the receiving ADMD: + + Authentication-Results: example.com; + dkim=pass reason="good signature" + header.i=@mail-router.example.net; + dkim=fail reason="bad signature" + header.i=@newyork.example.com + Received: from mail-router.example.net + (mail-router.example.net [192.0.2.250]) + by chicago.example.com (8.11.6/8.11.6) + for + with ESMTP id i7PK0sH7021929; + Fri, Feb 15 2002 17:19:22 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=furble; + d=mail-router.example.net; t=1188964198; c=relaxed/simple; + h=From:Date:To:Message-Id:Subject:Authentication-Results; + bh=ftA9J6GtX8OpwUECzHnCkRzKw1uk6FNiLfJl5Nmv49E=; + b=oINEO8hgn/gnunsg ... 9n9ODSNFSDij3= + Authentication-Results: example.net; + dkim=pass (good signature) header.i=@newyork.example.com + Received: from smtp.newyork.example.com + (smtp.newyork.example.com [192.0.2.220]) + by mail-router.example.net (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; + d=newyork.example.com; + t=1188964191; c=simple/simple; + h=From:Date:To:Message-Id:Subject; + bh=sEu28nfs9fuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m7=; + b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM= + From: sender@newyork.example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: meetings@example.net + Message-Id: <12345.abc@newyork.example.com> + Subject: here's a sample + + Example 6: Headers Reporting Results from Multiple MTAs in + Different ADMDs + + In this example, we see multi-tiered authentication with an extended + trust boundary. + + + + + + +Kucherawy Standards Track [Page 48] + +RFC 7601 Authentication-Results Header Field August 2015 + + + The message was sent from someone at example.com's New York office + (newyork.example.com) to a mailing list managed at an intermediary. + The message was signed at the origin using DKIM. + + The message was sent to a mailing list service provider called + example.net, which is used by example.com. There, + meetings@example.net is expanded to a long list of recipients, one of + whom is at the Chicago office. In this example, we will assume that + the trust boundary for chicago.example.com includes the mailing list + server at example.net. + + The mailing list server there first authenticated the message and + affixed an Authentication-Results header field indicating such using + its DNS domain name for the authserv-id. It then altered the message + by affixing some footer text to the body, including some + administrivia such as unsubscription instructions. Finally, the + mailing list server affixes a second DKIM signature and begins + distribution of the message. + + The border MTA for chicago.example.com explicitly trusts results from + mail-router.example.net, so that header field is not removed. It + performs evaluation of both signatures and determines that the first + (most recent) is a "pass" but, because of the aforementioned + modifications, the second is a "fail". However, the first signature + included the Authentication-Results header added at mail- + router.example.net that validated the second signature. Thus, + indirectly, it can be determined that the authentications claimed by + both signatures are indeed valid. + + Note that two styles of presenting metadata about the result are in + use here. In one case, the "reason=" clause is present, which is + intended for easy extraction by parsers; in the other case, the CFWS + production of the ABNF is used to include such data as a header field + comment. The latter can be harder for parsers to extract given the + varied supported syntaxes of mail header fields. + +B.7. Comment-Heavy Example + + The formal syntax permits comments within the content in a number of + places. For the sake of illustration, this example is also legal: + + Authentication-Results: foo.example.net (foobar) 1 (baz); + dkim (Because I like it) / 1 (One yay) = (wait for it) fail + policy (A dot can go here) . (like that) expired + (this surprised me) = (as I wasn't expecting it) 1362471462 + + Example 7: A Very Comment-Heavy but Perfectly Legal Example + + + + +Kucherawy Standards Track [Page 49] + +RFC 7601 Authentication-Results Header Field August 2015 + + +Appendix C. Operational Considerations about Message Authentication + + This protocol is predicated on the idea that authentication (and + presumably in the future, reputation) work is typically done by + border MTAs rather than MUAs or intermediate MTAs; the latter merely + make use of the results determined by the former. Certainly this is + not mandatory for participation in electronic mail or message + authentication, but this protocol and its deployment to date are + based on that model. The assumption satisfies several common ADMD + requirements: + + 1. Service operators prefer to resolve the handling of problem + messages as close to the border of the ADMD as possible. This + enables, for example, rejection of messages at the SMTP level + rather than generating a DSN internally. Thus, doing any of the + authentication or reputation work exclusively at the MUA or + intermediate MTA renders this desire unattainable. + + 2. Border MTAs are more likely to have direct access to external + sources of authentication or reputation information since modern + MUAs are more likely to be heavily firewalled. Thus, some MUAs + might not even be able to complete the task of performing + authentication or reputation evaluations without complex proxy + configurations or similar burdens. + + 3. MUAs rely upon the upstream MTAs within their trust boundaries to + make correct (as much as is possible) evaluations about the + message's envelope, header, and content. Thus, MUAs don't need + to know how to do the work that upstream MTAs do; they only need + the results of that work. + + 4. Evaluations about the quality of a message, from simple token + matching (e.g., a list of preferred DNS domains) to cryptanalysis + (e.g., public/private key work), do have a cost and thus need to + be minimized. To that end, performing those tests at the border + MTA is far preferred to doing that work at each MUA that handles + a message. If an ADMD's environment adheres to common messaging + protocols, a reputation query or an authentication check + performed by a border MTA would return the same result as the + same query performed by an MUA. By contrast, in an environment + where the MUA does the work, a message arriving for multiple + recipients would thus cause authentication or reputation + evaluation to be done more than once for the same message (i.e., + at each MUA), causing needless amplification of resource use and + creating a possible denial-of-service attack vector. + + + + + + +Kucherawy Standards Track [Page 50] + +RFC 7601 Authentication-Results Header Field August 2015 + + + 5. Minimizing change is good. As new authentication and reputation + methods emerge, the list of methods supported by this header + field would presumably be extended. If MUAs simply consume the + contents of this header field rather than actually attempt to do + authentication and/or reputation work, then MUAs only need to + learn to parse this header field once; emergence of new methods + requires only a configuration change at the MUAs and software + changes at the MTAs (which are presumably fewer in number). When + choosing to implement these functions in MTAs vs. MUAs, the + issues of individual flexibility, infrastructure inertia, and + scale of effort must be considered. It is typically easier to + change a single MUA than an MTA because the modification affects + fewer users and can be pursued with less care. However, changing + many MUAs is more effort than changing a smaller number of MTAs. + + 6. For decisions affecting message delivery and display, assessment + based on authentication and reputation is best performed close to + the time of message transit, as a message makes its journey + toward a user's inbox, not afterwards. DKIM keys and IP address + reputations, etc., can change over time or even become invalid, + and users can take a long time to read a message once delivered. + The value of this work thus degrades, perhaps quickly, once the + delivery process has completed. This seriously diminishes the + value of this work when done elsewhere than at MTAs. + + Many operational choices are possible within an ADMD, including the + venue for performing authentication and/or reputation assessment. + The current specification does not dictate any of those choices. + Rather, it facilitates those cases in which information produced by + one stage of analysis needs to be transported with the message to the + next stage. + +Appendix D. Changes since RFC 7001 + + o Applied RFC 7410. + + o Updated all references to RFC 4408 with RFC 7208. + + o Added section explaining "property" values. (Addressed Erratum + #4201.) + + o Did some minor text reorganization. + + o Gave registry history -- enough that this is now the authoritative + registry definition. + + o Added text explaining each of the method-ptype-property tuples + registered by this document. + + + +Kucherawy Standards Track [Page 51] + +RFC 7601 Authentication-Results Header Field August 2015 + + + o Changed the meaning of the "Defined" column of the methods + registry to be the place where each entry was created and + described; it is expected that this will then refer to the + method's defining document. Provided IANA with corresponding + update instructions. + + o Cleaned up registry structure and content, and replaced all + references to RFC 7001 with pointers to this document. + + o Added references: [DMARC], [PRA], [RFC6008], [RFC6577], [RRVS], + [SMIME-REG]. + + o Added description of values that can be extracted from SMTP AUTH + sessions and an example. + + o Provided much more complete descriptions of reporting DomainKeys + results. + + o Added more detail about Sender ID. + + o Marked all ADSP and DomainKeys entries as deprecated since their + defining documents are as well. + + o Reworked some text around ignoring unknown ptypes. + + o Completely described the ptypes registry. + + o Mentioned that EHLO is mapped to HELO for SPF. + + o RFC 7208 uses all-lowercase result strings now, so adjusted prose + accordingly. + + o Updated list of supported methods, and mentioned the registries + immediately below. + + o Mentioned that when a local-part is removed, the "@" goes with it. + + o Referred to RFC 7328 in the "iprev" definition. + + o Corrected the "smime-part" prose. + + o Updated examples that use SMTP AUTH to claim "with ESMTPA" in the + Received fields. + + o Made minor editorial adjustments. + + + + + + +Kucherawy Standards Track [Page 52] + +RFC 7601 Authentication-Results Header Field August 2015 + + +Acknowledgments + + The author wishes to acknowledge the following individuals for their + review and constructive criticism of this document: Stephane + Bortzmeyer, Scott Kitterman, John Levine, Tom Petch, and Pete + Resnick. + +Author's Address + + Murray S. Kucherawy + 270 Upland Drive + San Francisco, CA 94127 + United States + + Email: superuser@gmail.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 53] + From 82e2397a24a1d09f8635172d4723f3cb00c72102 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 17:06:41 -0400 Subject: [PATCH 306/741] Added more unit tests for Authentication-Results parsing --- .../AuthenticationResultsTests.cs | 223 ++++++++++++++++-- .../Utils/StringBuilderExtensionTests.cs | 20 ++ 2 files changed, 229 insertions(+), 14 deletions(-) diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 366f294ee9..ce5216a20b 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -70,7 +70,7 @@ public void TestParseArcAuthenticationResults () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Instance.Value, "instance"); Assert.AreEqual (1, authres.Results.Count, "methods"); @@ -86,7 +86,7 @@ public void TestParseAuthServId () var buffer = Encoding.ASCII.GetBytes ("example.org"); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual ("example.org; none", authres.ToString ()); @@ -98,7 +98,7 @@ public void TestParseAuthServIdSemicolon () var buffer = Encoding.ASCII.GetBytes ("example.org;"); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual ("example.org; none", authres.ToString ()); @@ -111,7 +111,7 @@ public void TestParseAuthServIdWithVersion () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Version.Value, "authres-version"); @@ -124,7 +124,7 @@ public void TestParseAuthServIdWithVersionAndSemicolon () var buffer = Encoding.ASCII.GetBytes ("example.org 1;"); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Version.Value, "authres-version"); @@ -137,7 +137,7 @@ public void TestParseNoResults () var buffer = Encoding.ASCII.GetBytes ("example.org 1; none"); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Version.Value, "authres-version"); Assert.AreEqual (0, authres.Results.Count, "no-results"); @@ -152,7 +152,7 @@ public void TestParseSimple () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Results.Count, "methods"); Assert.AreEqual ("foo", authres.Results[0].Method); @@ -168,7 +168,7 @@ public void TestParseSimpleWithComment () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Results.Count, "methods"); Assert.AreEqual ("foo", authres.Results[0].Method); @@ -185,7 +185,7 @@ public void TestParseSimpleWithProperty1 () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Results.Count, "methods"); Assert.AreEqual ("spf", authres.Results[0].Method); @@ -205,7 +205,7 @@ public void TestParseSimpleWithProperty2 () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Results.Count, "methods"); Assert.AreEqual ("spf", authres.Results[0].Method); @@ -225,7 +225,7 @@ public void TestParseSimpleWithProperty3 () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Results.Count, "methods"); Assert.AreEqual ("spf", authres.Results[0].Method); @@ -238,6 +238,65 @@ public void TestParseSimpleWithProperty3 () Assert.AreEqual (input, authres.ToString ()); } + [Test] + public void TestParseSimpleWithReason () + { + const string input = "example.com; spf=pass reason=good"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("good", authres.Results[0].Reason); + Assert.AreEqual (0, authres.Results[0].Properties.Count, "properties"); + + Assert.AreEqual ("example.com; spf=pass reason=\"good\"", authres.ToString ()); + } + + [Test] + public void TestParseSimpleWithQuotedReason () + { + const string input = "example.com; spf=pass reason=\"good stuff\""; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("good stuff", authres.Results[0].Reason); + Assert.AreEqual (0, authres.Results[0].Properties.Count, "properties"); + + Assert.AreEqual (input, authres.ToString ()); + } + + [Test] + public void TestParseMethodWithMultipleProperties () + { + const string input = "example.com; spf=pass ptype1.prop1=value1 ptype2.prop2=value2"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (2, authres.Results[0].Properties.Count, "properties"); + Assert.AreEqual ("ptype1", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("prop1", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("value1", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("ptype2", authres.Results[0].Properties[1].PropertyType); + Assert.AreEqual ("prop2", authres.Results[0].Properties[1].Property); + Assert.AreEqual ("value2", authres.Results[0].Properties[1].Value); + + Assert.AreEqual (input, authres.ToString ()); + } + [Test] public void TestParseMultipleMethods () { @@ -245,7 +304,7 @@ public void TestParseMultipleMethods () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (3, authres.Results.Count, "methods"); Assert.AreEqual ("auth", authres.Results[0].Method); @@ -278,7 +337,7 @@ public void TestParseMultipleMethodsWithReasons () var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (2, authres.Results.Count, "methods"); Assert.AreEqual ("dkim", authres.Results[0].Method); @@ -305,7 +364,7 @@ public void TestParseHeavilyCommentedExample () var buffer = Encoding.ASCII.GetBytes ("foo.example.net (foobar) 1 (baz); dkim (Because I like it) / 1 (One yay) = (wait for it) fail policy (A dot can go here) . (like that) expired (this surprised me) = (as I wasn't expecting it) 1362471462"); AuthenticationResults authres; - Assert.IsTrue (AuthenticationResults.TryParse (buffer, out authres)); + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.AreEqual ("foo.example.net", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual (1, authres.Version.Value, "authres-version"); Assert.AreEqual (1, authres.Results.Count, "methods"); @@ -325,6 +384,8 @@ public void TestParseFailureAuthServIdIncompleteQString () { var buffer = Encoding.ASCII.GetBytes (" \"quoted-authserv-id"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -339,6 +400,8 @@ public void TestParseFailureIncompleteArcInstance () { var buffer = Encoding.ASCII.GetBytes ("i="); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -353,6 +416,8 @@ public void TestParseFailureInvalidArcInstance () { var buffer = Encoding.ASCII.GetBytes ("i=abc; authserv-id"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -367,6 +432,8 @@ public void TestParseFailureUnexpectedTokenAfterArcInstance () { var buffer = Encoding.ASCII.GetBytes ("i=1: authserv-id"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -381,6 +448,8 @@ public void TestParseFailureOnlyArcInstance () { var buffer = Encoding.ASCII.GetBytes ("i=5"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -395,6 +464,8 @@ public void TestParseFailureOnlyArcInstanceSemicolon () { var buffer = Encoding.ASCII.GetBytes ("i=5;"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -409,6 +480,8 @@ public void TestParseFailureMultipleLeadingArcInstance () { var buffer = Encoding.ASCII.GetBytes ("i=5; i=1"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -423,6 +496,8 @@ public void TestParseFailureUnknownLeadingMethod () { var buffer = Encoding.ASCII.GetBytes ("x=5; authserv-id"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -437,6 +512,8 @@ public void TestParseFailureInvalidVersion () { var buffer = Encoding.ASCII.GetBytes ("authserv-id x"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -451,6 +528,8 @@ public void TestParseFailureInvalidTokenAfterVersion () { var buffer = Encoding.ASCII.GetBytes ("authserv-id 1 x"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -465,6 +544,8 @@ public void TestParseFailureInvalidMethod1 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; ."); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -476,9 +557,27 @@ public void TestParseFailureInvalidMethod1 () [Test] public void TestParseFailureInvalidMethod2 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc"); + + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (16, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidMethod3 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc def"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -493,6 +592,8 @@ public void TestParseFailureInvalidMethodVersion1 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc/1.0=pass"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -507,6 +608,8 @@ public void TestParseFailureInvalidMethodVersion2 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc/def=pass"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -521,6 +624,8 @@ public void TestParseFailureIncompleteMethod () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc="); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -535,6 +640,8 @@ public void TestParseFailureMethodEqualNonKeyword () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc=."); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -549,6 +656,8 @@ public void TestParseFailureNoResultWithMore () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; none; method=pass"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -563,6 +672,8 @@ public void TestParseFailureNoResultAfterMethods () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass; none"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -577,6 +688,8 @@ public void TestParseFailureIncompleteReason1 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -591,6 +704,8 @@ public void TestParseFailureIncompleteReason2 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason="); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -605,6 +720,8 @@ public void TestParseFailureIncompleteReason3 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=\"this is some text"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -619,6 +736,8 @@ public void TestParseFailureIncompleteReason4 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=;"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -628,11 +747,29 @@ public void TestParseFailureIncompleteReason4 () } } + [Test] + public void TestParseFailureInvalidReason () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason ."); + + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (32, ex.ErrorIndex, "ErrorIndex"); + } + } + [Test] public void TestParseFailureInvalidPropTypeAfterReason () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=\"because I said so\" .;"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -647,6 +784,8 @@ public void TestParseFailureIncompleteProperty1 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -661,6 +800,8 @@ public void TestParseFailureIncompleteProperty2 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype."); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -675,6 +816,8 @@ public void TestParseFailureIncompleteProperty3 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -689,6 +832,8 @@ public void TestParseFailureIncompleteProperty4 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop="); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -703,6 +848,8 @@ public void TestParseFailureIncompleteProperty5 () { var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop=;"); + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + try { AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); @@ -711,5 +858,53 @@ public void TestParseFailureIncompleteProperty5 () Assert.AreEqual (36, ex.ErrorIndex, "ErrorIndex"); } } + + [Test] + public void TestParseFailureInvalidProperty1 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype;"); + + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (30, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidProperty2 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop;"); + + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (35, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestParseFailureInvalidProperty3 () + { + var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop=value ."); + + Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + + try { + AuthenticationResults.Parse (buffer); + Assert.Fail ("Expected parse error."); + } catch (ParseException ex) { + Assert.AreEqual (42, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (42, ex.ErrorIndex, "ErrorIndex"); + } + } } } diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index c8bd022dc2..b431964689 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Collections.Generic; using NUnit.Framework; @@ -57,6 +58,25 @@ public void TestLineWrap () Assert.AreEqual (expected2, builder.ToString (), "#2"); } + [Test] + public void TestAppendTokens () + { + var builder = new StringBuilder ("Authentication-Results:"); + var format = FormatOptions.Default.Clone (); + var tokens = new List (); + int lineLength = builder.Length; + + format.NewLineFormat = NewLineFormat.Unix; + + tokens.Add ("this-is-a-really-long-parameter-name"); + tokens.Add ("="); + tokens.Add ("this-is-a-really-long-parameter-value"); + + builder.AppendTokens (format, ref lineLength, tokens, true); + + Assert.AreEqual ("Authentication-Results: this-is-a-really-long-parameter-name=\n\tthis-is-a-really-long-parameter-value", builder.ToString ()); + } + [Test] public void TestAppendFoldedWithQuotedString () { From 0e253f137cab0f4d8161a0c2f2abd8223292983b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 20:56:52 -0400 Subject: [PATCH 307/741] Added more AuthenticationResults unit tests --- MimeKit/Cryptography/AuthenticationResults.cs | 6 +- MimeKit/Header.cs | 39 +- .../AuthenticationResultsTests.cs | 597 +++++++----------- 3 files changed, 244 insertions(+), 398 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 7c5a58a57e..1517047475 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -117,17 +117,15 @@ public List Results { get; private set; } - internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + internal void Encode (FormatOptions options, StringBuilder builder, int lineLength) { - int space = 0; + int space = 1; if (Instance.HasValue) { var i = Instance.Value.ToString (CultureInfo.InvariantCulture); builder.AppendFormat (" i={0};", i); - lineLength += 4 + i.Length; - space = 1; } if (lineLength + space + AuthenticationServiceIdentifier.Length > options.MaxLineLength) { diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index ba667802f0..8f7743d12d 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -667,43 +667,6 @@ static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, return charset.GetBytes (encoded.ToString ()); } - static void EncodeLongValue (FormatOptions format, StringBuilder encoded, ref int lineLength, string value) - { - int startIndex = 0; - - while (startIndex < value.Length) { - int lineLeft = format.MaxLineLength - lineLength; - int maxIndex = startIndex + lineLeft; - int index; - - if (maxIndex >= value.Length) { - index = value.Length; - } else { - index = maxIndex; - - while (index > startIndex && IsWhiteSpace (value[index - 1])) - index--; - - if (index == startIndex) - index = maxIndex; - } - - encoded.Append (value, startIndex, index - startIndex); - - while (index < value.Length && IsWhiteSpace (value[index])) - index++; - - if (index == value.Length) - break; - - encoded.Append (format.NewLine); - encoded.Append ('\t'); - lineLength = 1; - - startIndex = index; - } - } - static byte[] EncodeAuthenticationResultsHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) { var buffer = Encoding.UTF8.GetBytes (value); @@ -714,7 +677,7 @@ static byte[] EncodeAuthenticationResultsHeader (ParserOptions options, FormatOp var encoded = new StringBuilder (); int lineLength = field.Length + 1; - authres.Encode (format, encoded, ref lineLength); + authres.Encode (format, encoded, lineLength); return charset.GetBytes (encoded.ToString ()); } diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index ce5216a20b..8d8dea21fc 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -63,6 +63,45 @@ public void TestArgumentExceptions () Assert.Throws (() => AuthenticationResults.TryParse (buffer, 0, -1, out authres)); } + [Test] + public void TestEncodeLongAuthServId () + { + const string authservid = "this-is-a-really-really-really-long-authserv-identifier-that-is-78-octets-long"; + const string expected = "Authentication-Results:\n\t" + authservid + ";\n\tdkim=pass; spf=pass\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults (authservid); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("dkim", "pass")); + authres.Results.Add (new AuthenticationMethodResult ("spf", "pass")); + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + + [Test] + public void TestEncodeLongAuthServIdWithVersion () + { + const string authservid = "this-is-a-really-really-really-long-authserv-identifier-that-is-78-octets-long"; + const string expected = "Authentication-Results:\n\t" + authservid + "\n\t1; dkim=pass; spf=pass\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults (authservid); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("dkim", "pass")); + authres.Results.Add (new AuthenticationMethodResult ("spf", "pass")); + authres.Version = 1; + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestParseArcAuthenticationResults () { @@ -78,6 +117,15 @@ public void TestParseArcAuthenticationResults () Assert.AreEqual ("pass", authres.Results[0].Result); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " i=1; example.com; foo=pass\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "ARC-Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -90,6 +138,15 @@ public void TestParseAuthServId () Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual ("example.org; none", authres.ToString ()); + + const string expected = " example.org; none\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -102,6 +159,15 @@ public void TestParseAuthServIdSemicolon () Assert.AreEqual ("example.org", authres.AuthenticationServiceIdentifier, "authserv-id"); Assert.AreEqual ("example.org; none", authres.ToString ()); + + const string expected = " example.org; none\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -116,6 +182,15 @@ public void TestParseAuthServIdWithVersion () Assert.AreEqual (1, authres.Version.Value, "authres-version"); Assert.AreEqual ("example.org 1; none", authres.ToString ()); + + const string expected = " example.org 1; none\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -129,6 +204,15 @@ public void TestParseAuthServIdWithVersionAndSemicolon () Assert.AreEqual (1, authres.Version.Value, "authres-version"); Assert.AreEqual ("example.org 1; none", authres.ToString ()); + + const string expected = " example.org 1; none\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -143,6 +227,15 @@ public void TestParseNoResults () Assert.AreEqual (0, authres.Results.Count, "no-results"); Assert.AreEqual ("example.org 1; none", authres.ToString ()); + + const string expected = " example.org 1; none\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -159,6 +252,15 @@ public void TestParseSimple () Assert.AreEqual ("pass", authres.Results[0].Result); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; foo=pass\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -176,6 +278,15 @@ public void TestParseSimpleWithComment () Assert.AreEqual ("2 of 3 tests OK", authres.Results[0].ResultComment); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; foo=pass (2 of 3 tests OK)\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -196,6 +307,15 @@ public void TestParseSimpleWithProperty1 () Assert.AreEqual ("example.net", authres.Results[0].Properties[0].Value); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; spf=pass smtp.mailfrom=example.net\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -216,6 +336,15 @@ public void TestParseSimpleWithProperty2 () Assert.AreEqual ("@example.net", authres.Results[0].Properties[0].Value); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; spf=pass smtp.mailfrom=@example.net\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -236,6 +365,15 @@ public void TestParseSimpleWithProperty3 () Assert.AreEqual ("local-part@example.net", authres.Results[0].Properties[0].Value); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com;\n\tspf=pass smtp.mailfrom=local-part@example.net\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -254,6 +392,15 @@ public void TestParseSimpleWithReason () Assert.AreEqual (0, authres.Results[0].Properties.Count, "properties"); Assert.AreEqual ("example.com; spf=pass reason=\"good\"", authres.ToString ()); + + const string expected = " example.com; spf=pass reason=\"good\"\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -272,6 +419,15 @@ public void TestParseSimpleWithQuotedReason () Assert.AreEqual (0, authres.Results[0].Properties.Count, "properties"); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; spf=pass reason=\"good stuff\"\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -295,6 +451,15 @@ public void TestParseMethodWithMultipleProperties () Assert.AreEqual ("value2", authres.Results[0].Properties[1].Value); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com;\n\tspf=pass ptype1.prop1=value1 ptype2.prop2=value2\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -328,6 +493,15 @@ public void TestParseMultipleMethods () Assert.AreEqual ("example.net", authres.Results[2].Properties[0].Value); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com;\n\tauth=pass (cram-md5) smtp.auth=sender@example.net;\n\tspf=pass smtp.mailfrom=example.net; sender-id=pass header.from=example.net\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -356,6 +530,15 @@ public void TestParseMultipleMethodsWithReasons () Assert.AreEqual ("@newyork.example.com", authres.Results[1].Properties[0].Value); Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com;\n\tdkim=pass reason=\"good signature\" header.i=@mail-router.example.net;\n\tdkim=fail reason=\"bad signature\" header.i=@newyork.example.com\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } [Test] @@ -377,12 +560,20 @@ public void TestParseHeavilyCommentedExample () Assert.AreEqual ("1362471462", authres.Results[0].Properties[0].Value); Assert.AreEqual ("foo.example.net 1; dkim/1=fail policy.expired=1362471462", authres.ToString ()); + + const string expected = " foo.example.net 1;\n\tdkim/1=fail policy.expired=1362471462\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); } - [Test] - public void TestParseFailureAuthServIdIncompleteQString () + static void AssertParseFailure (string input, int tokenIndex, int errorIndex) { - var buffer = Encoding.ASCII.GetBytes (" \"quoted-authserv-id"); + var buffer = Encoding.ASCII.GetBytes (input); Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); @@ -390,521 +581,215 @@ public void TestParseFailureAuthServIdIncompleteQString () AuthenticationResults.Parse (buffer); Assert.Fail ("Expected parse error."); } catch (ParseException ex) { - Assert.AreEqual (1, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (20, ex.ErrorIndex, "ErrorIndex"); + Assert.AreEqual (tokenIndex, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (errorIndex, ex.ErrorIndex, "ErrorIndex"); } - } - - [Test] - public void TestParseFailureIncompleteArcInstance () - { - var buffer = Encoding.ASCII.GetBytes ("i="); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); try { - AuthenticationResults.Parse (buffer); + AuthenticationResults.Parse (buffer, 0, buffer.Length); Assert.Fail ("Expected parse error."); } catch (ParseException ex) { - Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (2, ex.ErrorIndex, "ErrorIndex"); + Assert.AreEqual (tokenIndex, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (errorIndex, ex.ErrorIndex, "ErrorIndex"); } } [Test] - public void TestParseFailureInvalidArcInstance () + public void TestParseFailureAuthServIdIncompleteQString () { - var buffer = Encoding.ASCII.GetBytes ("i=abc; authserv-id"); + AssertParseFailure (" \"quoted-authserv-id", 1, 20); + } - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); + [Test] + public void TestParseFailureIncompleteArcInstance () + { + AssertParseFailure ("i=", 2, 2); + } - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (2, ex.ErrorIndex, "ErrorIndex"); - } + [Test] + public void TestParseFailureInvalidArcInstance () + { + AssertParseFailure ("i=abc; authserv-id", 2, 2); } [Test] public void TestParseFailureUnexpectedTokenAfterArcInstance () { - var buffer = Encoding.ASCII.GetBytes ("i=1: authserv-id"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (3, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (3, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("i=1: authserv-id", 3, 3); } [Test] public void TestParseFailureOnlyArcInstance () { - var buffer = Encoding.ASCII.GetBytes ("i=5"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (3, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("i=5", 2, 3); } [Test] public void TestParseFailureOnlyArcInstanceSemicolon () { - var buffer = Encoding.ASCII.GetBytes ("i=5;"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (4, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (4, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("i=5;", 4, 4); } [Test] public void TestParseFailureMultipleLeadingArcInstance () { - var buffer = Encoding.ASCII.GetBytes ("i=5; i=1"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (5, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (6, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("i=5; i=1", 5, 6); } [Test] public void TestParseFailureUnknownLeadingMethod () { - var buffer = Encoding.ASCII.GetBytes ("x=5; authserv-id"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (0, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (1, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("x=5; authserv-id", 0, 1); } [Test] public void TestParseFailureInvalidVersion () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id x"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (12, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (12, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id x", 12, 12); } [Test] public void TestParseFailureInvalidTokenAfterVersion () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id 1 x"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (14, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (14, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id 1 x", 14, 14); } [Test] public void TestParseFailureInvalidMethod1 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; ."); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (13, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; .", 13, 13); } [Test] public void TestParseFailureInvalidMethod2 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (16, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; abc", 13, 16); } [Test] public void TestParseFailureInvalidMethod3 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc def"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; abc def", 13, 17); } [Test] public void TestParseFailureInvalidMethodVersion1 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc/1.0=pass"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (18, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; abc/1.0=pass", 13, 18); } [Test] public void TestParseFailureInvalidMethodVersion2 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc/def=pass"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (17, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; abc/def=pass", 17, 17); } [Test] public void TestParseFailureIncompleteMethod () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc="); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; abc=", 13, 17); } [Test] public void TestParseFailureMethodEqualNonKeyword () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; abc=."); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (17, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; abc=.", 17, 17); } [Test] public void TestParseFailureNoResultWithMore () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; none; method=pass"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (13, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (17, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; none; method=pass", 13, 17); } [Test] public void TestParseFailureNoResultAfterMethods () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass; none"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (26, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (30, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass; none", 26, 30); } [Test] public void TestParseFailureIncompleteReason1 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (31, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass reason", 25, 31); } [Test] public void TestParseFailureIncompleteReason2 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason="); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (32, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (32, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass reason=", 32, 32); } [Test] public void TestParseFailureIncompleteReason3 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=\"this is some text"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (32, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (50, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass reason=\"this is some text", 32, 50); } [Test] public void TestParseFailureIncompleteReason4 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=;"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (32, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (32, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass reason=;", 32, 32); } [Test] public void TestParseFailureInvalidReason () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason ."); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (32, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass reason .", 25, 32); } [Test] public void TestParseFailureInvalidPropTypeAfterReason () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass reason=\"because I said so\" .;"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (52, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (52, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass reason=\"because I said so\" .;", 52, 52); } [Test] public void TestParseFailureIncompleteProperty1 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (30, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype", 25, 30); } [Test] public void TestParseFailureIncompleteProperty2 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype."); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (31, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype.", 25, 31); } [Test] public void TestParseFailureIncompleteProperty3 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (35, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype.prop", 25, 35); } [Test] public void TestParseFailureIncompleteProperty4 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop="); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (36, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype.prop=", 25, 36); } [Test] public void TestParseFailureIncompleteProperty5 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop=;"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (36, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype.prop=;", 25, 36); } [Test] public void TestParseFailureInvalidProperty1 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype;"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (30, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype;", 25, 30); } [Test] public void TestParseFailureInvalidProperty2 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop;"); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (25, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (35, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype.prop;", 25, 35); } [Test] public void TestParseFailureInvalidProperty3 () { - var buffer = Encoding.ASCII.GetBytes ("authserv-id; method=pass ptype.prop=value ."); - - Assert.IsFalse (AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)); - - try { - AuthenticationResults.Parse (buffer); - Assert.Fail ("Expected parse error."); - } catch (ParseException ex) { - Assert.AreEqual (42, ex.TokenIndex, "TokenIndex"); - Assert.AreEqual (42, ex.ErrorIndex, "ErrorIndex"); - } + AssertParseFailure ("authserv-id; method=pass ptype.prop=value .", 42, 42); } } } From bb4e63ac2204dcd77bee09f26978d3cc86f9d9cd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 21:22:41 -0400 Subject: [PATCH 308/741] Added truncated comment unit tests for the Authentication-Results parser --- MimeKit/Cryptography/AuthenticationResults.cs | 1 + .../AuthenticationResultsTests.cs | 68 ++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 1517047475..ac822f637e 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -155,6 +155,7 @@ internal void Encode (FormatOptions options, StringBuilder builder, int lineLeng lineLength++; } + lineLength += version.Length; builder.Append (version); } diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 8d8dea21fc..785c3c7dbe 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -600,6 +600,48 @@ public void TestParseFailureAuthServIdIncompleteQString () AssertParseFailure (" \"quoted-authserv-id", 1, 20); } + [Test] + public void TestParseFailureIncompleteCommentBeforeMethod () + { + AssertParseFailure (" authserv-id; (incomplete comment", 14, 33); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterMethod () + { + AssertParseFailure (" authserv-id; method (incomplete comment", 21, 40); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterMethodEquals () + { + AssertParseFailure (" authserv-id; method= (incomplete comment", 22, 41); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterMethodEqualsResult () + { + AssertParseFailure (" authserv-id; method=result (incomplete comment", 28, 47); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterMethodSlash () + { + AssertParseFailure (" authserv-id; method/ (incomplete comment", 22, 41); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterMethodVersion () + { + AssertParseFailure (" authserv-id; method/1 (incomplete comment", 23, 42); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterMethodVersionEquals () + { + AssertParseFailure (" authserv-id; method/1= (incomplete comment", 24, 43); + } + [Test] public void TestParseFailureIncompleteArcInstance () { @@ -675,11 +717,17 @@ public void TestParseFailureInvalidMethod3 () [Test] public void TestParseFailureInvalidMethodVersion1 () { - AssertParseFailure ("authserv-id; abc/1.0=pass", 13, 18); + AssertParseFailure ("authserv-id; abc/1 ", 13, 19); } [Test] public void TestParseFailureInvalidMethodVersion2 () + { + AssertParseFailure ("authserv-id; abc/1.0=pass", 13, 18); + } + + [Test] + public void TestParseFailureInvalidMethodVersion3 () { AssertParseFailure ("authserv-id; abc/def=pass", 17, 17); } @@ -708,6 +756,18 @@ public void TestParseFailureNoResultAfterMethods () AssertParseFailure ("authserv-id; method=pass; none", 26, 30); } + [Test] + public void TestParseFailureIncompleteResultComment () + { + AssertParseFailure ("authserv-id; method=pass (truncated comment", 25, 43); + } + + [Test] + public void TestParseFailureInvalidTokenAfterResult () + { + AssertParseFailure ("authserv-id; method=pass .", 25, 25); + } + [Test] public void TestParseFailureIncompleteReason1 () { @@ -791,5 +851,11 @@ public void TestParseFailureInvalidProperty3 () { AssertParseFailure ("authserv-id; method=pass ptype.prop=value .", 42, 42); } + + [Test] + public void TestParseFailureInvalidProperty4 () + { + AssertParseFailure ("authserv-id; method=pass ptype..", 31, 31); + } } } From ce48aba03e90727591df3d928848a9b5bb448fbd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 21:35:08 -0400 Subject: [PATCH 309/741] Added more unit tests --- .../AuthenticationResultsTests.cs | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 785c3c7dbe..93924dd2a3 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -403,6 +403,33 @@ public void TestParseSimpleWithReason () Assert.AreEqual (expected, encoded.ToString ()); } + [Test] + public void TestParseSimpleWithReasonSemiColon () + { + const string input = "example.com; spf=pass reason=good; "; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("good", authres.Results[0].Reason); + Assert.AreEqual (0, authres.Results[0].Properties.Count, "properties"); + + Assert.AreEqual ("example.com; spf=pass reason=\"good\"", authres.ToString ()); + + const string expected = " example.com; spf=pass reason=\"good\"\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestParseSimpleWithQuotedReason () { @@ -430,6 +457,33 @@ public void TestParseSimpleWithQuotedReason () Assert.AreEqual (expected, encoded.ToString ()); } + [Test] + public void TestParseSimpleWithQuotedReasonSemiColon () + { + const string input = "example.com; spf=pass reason=\"good stuff\""; + var buffer = Encoding.ASCII.GetBytes (input + "; "); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual ("good stuff", authres.Results[0].Reason); + Assert.AreEqual (0, authres.Results[0].Properties.Count, "properties"); + + Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; spf=pass reason=\"good stuff\"\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestParseMethodWithMultipleProperties () { @@ -600,6 +654,36 @@ public void TestParseFailureAuthServIdIncompleteQString () AssertParseFailure (" \"quoted-authserv-id", 1, 20); } + [Test] + public void TestParseFailureIncompleteComment () + { + AssertParseFailure (" (truncated comment", 1, 19); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterAuthServId () + { + AssertParseFailure (" authserv-id (truncated comment", 13, 31); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterInstanceEquals () + { + AssertParseFailure (" i= (truncated comment", 4, 22); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterInstanceEqualsValue () + { + AssertParseFailure (" i=1 (truncated comment", 5, 23); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterInstanceEqualsValueSemiColon () + { + AssertParseFailure (" i=1; (truncated comment", 6, 24); + } + [Test] public void TestParseFailureIncompleteCommentBeforeMethod () { From e899123c9a0c3684002f122f275082a61874f06a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 4 Jun 2019 22:15:22 -0400 Subject: [PATCH 310/741] Added Authentication-Results RFCs --- RFCs.md | 5 + rfc/rfc5451.txt | 2411 +++++++++++++++++++++++++++++++++++++++++++++++ rfc/rfc6577.txt | 283 ++++++ rfc/rfc7001.txt | 2411 +++++++++++++++++++++++++++++++++++++++++++++++ rfc/rfc7410.txt | 283 ++++++ 5 files changed, 5393 insertions(+) create mode 100644 rfc/rfc5451.txt create mode 100644 rfc/rfc6577.txt create mode 100644 rfc/rfc7001.txt create mode 100644 rfc/rfc7410.txt diff --git a/RFCs.md b/RFCs.md index 0ce67a6106..23b64bcf76 100644 --- a/RFCs.md +++ b/RFCs.md @@ -45,12 +45,15 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [4262](http://www.ietf.org/rfc/rfc4262.txt): X.509 Certificate Extension for S/MIME Capabilities * [4871](http://www.ietf.org/rfc/rfc4871.txt): DomainKeys Identified Mail (DKIM) Signatures * [5322](http://www.ietf.org/rfc/rfc5322.txt): Internet Message Format (Obsoletes rfc2822) +* [5451](http://www.ietf.org/rfc/rfc5451.txt): Message Header Field for Indicating Message Authentication Status * [5672](http://www.ietf.org/rfc/rfc5672.txt): RFC 4871 DomainKeys Identified Mail (DKIM) Signatures -- Update * [5750](http://www.ietf.org/rfc/rfc5750.txt): S/MIME Version 3.2 Certificate Handling (Obsoletes rfc3850) * [5751](http://www.ietf.org/rfc/rfc5751.txt): S/MIME Version 3.2 Message Specification (Obsoletes rfc3851) * [6376](http://www.ietf.org/rfc/rfc6376.txt): DomainKeys Identified Mail (DKIM) Signatures (Obsoletes rfc4871) * [6522](http://www.ietf.org/rfc/rfc6522.txt): The Multipart/Report Media Type for the Reporting of Mail System Administrative Messages (Obsoletes rfc3462) * [6532](http://www.ietf.org/rfc/rfc6532.txt): Internationalized Email Headers +* [7001](http://www.ietf.org/rfc/rfc7001.txt): Message Header Field for Indicating Message Authentication Status (Obsoletes rfc5451) +* [7601](http://www.ietf.org/rfc/rfc7601.txt): Message Header Field for Indicating Message Authentication Status (Obsoletes rfc7001) * [8301](http://www.ietf.org/rfc/rfc8301.txt): Cryptographic Algorithm and Key Usage Update to DomainKeys Identified Mail (DKIM) * [8463](http://www.ietf.org/rfc/rfc8463.txt): A New Cryptographic Signature Method for DomainKeys Identified Mail (DKIM) @@ -60,4 +63,6 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [1927](http://www.ietf.org/rfc/rfc1927.txt): Suggested Additional MIME Types for Associating Documents * [2369](http://www.ietf.org/rfc/rfc2369.txt): The Use of URLs as Meta-Syntax for Core Mail List Commands and their Transport through Message Header Fields * [2388](http://www.ietf.org/rfc/rfc2388.txt): Returning Values from Forms: multipart/form-data +* [6577](http://www.ietf.org/rfc/rfc6577.txt): Authentication-Results Registration Update for Sender Policy Framework (SPF) Results * [7103](http://www.ietf.org/rfc/rfc7103.txt): Advice for Safe Handling of Malformed Messages +* [7410](http://www.ietf.org/rfc/rfc7410.txt): A Property Types Registry for the Authentication-Results Header Field diff --git a/rfc/rfc5451.txt b/rfc/rfc5451.txt new file mode 100644 index 0000000000..6dcaa5b9ac --- /dev/null +++ b/rfc/rfc5451.txt @@ -0,0 +1,2411 @@ + + + + + + +Network Working Group M. Kucherawy +Request for Comments: 5451 Sendmail, Inc. +Category: Standards Track April 2009 + + + Message Header Field for Indicating Message Authentication Status + +Status of This Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (c) 2009 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents in effect on the date of + publication of this document (http://trustee.ietf.org/license-info). + Please review these documents carefully, as they describe your rights + and restrictions with respect to this document. + +Abstract + + This memo defines a new header field for use with electronic mail + messages to indicate the results of message authentication efforts. + Any receiver-side software, such as mail filters or Mail User Agents + (MUAs), may use this message header field to relay that information + in a convenient way to users or to make sorting and filtering + decisions. + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 1] + +RFC 5451 Authentication-Results Header Field April 2009 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 1.2. Trust Boundary . . . . . . . . . . . . . . . . . . . . . . 4 + 1.3. Processing Scope . . . . . . . . . . . . . . . . . . . . . 5 + 1.4. Requirements . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.5. Definitions . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.5.1. General . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.5.2. Security . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.5.3. Email Architecture . . . . . . . . . . . . . . . . . . 6 + 1.6. Trust Environment . . . . . . . . . . . . . . . . . . . . 7 + 2. Definition and Format of the Header Field . . . . . . . . . . 8 + 2.1. General Description . . . . . . . . . . . . . . . . . . . 8 + 2.2. Formal Definition . . . . . . . . . . . . . . . . . . . . 8 + 2.3. Authentication Identifier Field . . . . . . . . . . . . . 10 + 2.4. Result Values . . . . . . . . . . . . . . . . . . . . . . 12 + 2.4.1. DKIM and DomainKeys Results . . . . . . . . . . . . . 12 + 2.4.2. SPF and Sender-ID Results . . . . . . . . . . . . . . 13 + 2.4.3. "iprev" Results . . . . . . . . . . . . . . . . . . . 14 + 2.4.4. SMTP AUTH Results . . . . . . . . . . . . . . . . . . 14 + 2.4.5. Extension Result Codes . . . . . . . . . . . . . . . . 15 + 2.5. Authentication Methods . . . . . . . . . . . . . . . . . . 15 + 2.5.1. Definition of Initial Methods . . . . . . . . . . . . 16 + 2.5.2. Extension Methods . . . . . . . . . . . . . . . . . . 16 + 3. The "iprev" Authentication Method . . . . . . . . . . . . . . 17 + 4. Adding the Header Field to A Message . . . . . . . . . . . . . 18 + 4.1. Header Field Position and Interpretation . . . . . . . . . 19 + 4.2. Local Policy Enforcement . . . . . . . . . . . . . . . . . 20 + 5. Removing the Header Field . . . . . . . . . . . . . . . . . . 20 + 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 22 + 6.1. The Authentication-Results Header Field . . . . . . . . . 22 + 6.2. Email Authentication Method Name Registry . . . . . . . . 22 + 6.3. Email Authentication Result Name Registry . . . . . . . . 24 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 26 + 7.1. Forged Header Fields . . . . . . . . . . . . . . . . . . . 26 + 7.2. Misleading Results . . . . . . . . . . . . . . . . . . . . 27 + 7.3. Header Field Position . . . . . . . . . . . . . . . . . . 28 + 7.4. Reverse IP Query Denial-of-Service Attacks . . . . . . . . 28 + 7.5. Mitigation of Backscatter . . . . . . . . . . . . . . . . 28 + 7.6. Internal MTA Lists . . . . . . . . . . . . . . . . . . . . 28 + 7.7. Attacks against Authentication Methods . . . . . . . . . . 28 + 7.8. Intentionally Malformed Header Fields . . . . . . . . . . 29 + 7.9. Compromised Internal Hosts . . . . . . . . . . . . . . . . 29 + 7.10. Encapsulated Instances . . . . . . . . . . . . . . . . . . 29 + 7.11. Reverse Mapping . . . . . . . . . . . . . . . . . . . . . 29 + + + + + +Kucherawy Standards Track [Page 2] + +RFC 5451 Authentication-Results Header Field April 2009 + + + 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 30 + 8.1. Normative References . . . . . . . . . . . . . . . . . . . 30 + 8.2. Informative References . . . . . . . . . . . . . . . . . . 30 + Appendix A. Legacy MUAs . . . . . . . . . . . . . . . . . . . . . 32 + Appendix B. Authentication-Results Examples . . . . . . . . . . . 33 + B.1. Trivial Case; Header Field Not Present . . . . . . . . . . 33 + B.2. Nearly Trivial Case; Service Provided, But No + Authentication Done . . . . . . . . . . . . . . . . . . . 34 + B.3. Service Provided, Authentication Done . . . . . . . . . . 35 + B.4. Service Provided, Several Authentications Done, Single + MTA . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 + B.5. Service Provided, Several Authentications Done, + Different MTAs . . . . . . . . . . . . . . . . . . . . . . 37 + B.6. Service Provided, Multi-Tiered Authentication Done . . . . 39 + Appendix C. Operational Considerations about Message + Authentication . . . . . . . . . . . . . . . . . . . 41 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . . 43 + +1. Introduction + + This memo defines a new header field for electronic mail messages + that presents the results of a message authentication effort in a + machine-readable format. The intent is to create a place to collect + such data when message authentication mechanisms are in use so that a + Mail User Agent (MUA) and downstream filters can make filtering + decisions and/or provide a recommendation to the user as to the + validity of the message's origin and possibly the integrity of its + content. + + End users are not expected to be direct consumers of this header + field. This header field is intended for consumption by programs + that will then use or render such data in a human-usable form. + + This memo defines both the format of this new header field and + discusses the implications of its presence or absence. However, it + does not discuss how the data contained in the header field should be + used (i.e. what filtering decisions are appropriate, or how an MUA + might render these results) as these are local policy and/or user + interface design questions that are not appropriate for this memo. + + At the time of publication of this memo, [AUTH], [DKIM], + [DOMAINKEYS], [SENDERID], and [SPF] are published DNS domain-level + email authentication methods in common use. This proposal is not + intended to be restricted to domain-based authentication, but this + has proven to be a good starting point for implementations. As + various methods emerge, it is necessary to prepare for their + appearance and encourage convergence in the area of interfacing + verifiers to filters and MUAs. + + + +Kucherawy Standards Track [Page 3] + +RFC 5451 Authentication-Results Header Field April 2009 + + + Although [SPF] defined a header field called Received-SPF and + [DOMAINKEYS] defined one called DomainKey-Status for this purpose, + those header fields are specific to the conveyance of their + respective results only and thus are insufficient to satisfy the + requirements enumerated below. + +1.1. Purpose + + The header field defined in this memo is expected to serve several + purposes: + + 1. Convey the results of various message authentication checks being + applied by upstream filters and Mail Transfer Agents (MTAs) to + MUAs and downstream filters within the same "trust domain", as + such agents may wish to render those results to end users or use + that data to apply more or less stringent content checks based on + authentication results; + + 2. Provide a common location within a message for this data; + + 3. Create an extensible framework for reporting new authentication + methods as they emerge. + + In particular, the mere presence of this header field should not be + construed as meaning that its data is valid, but rather that it is + asserting validity based on one or more authentication schemes + somewhere upstream. For an MUA or downstream filter to treat the + assertions as actually valid, there must be an assessment of the + trust relationship between such agents and the validating MTA. + +1.2. Trust Boundary + + This document makes several references to the "trust boundary" of an + administrative management domain (ADMD). Given the diversity among + existing mail environments, a precise definition of this term isn't + possible. + + Simply put, a transfer from the creator of the header field to the + consumer must occur within a context of trust that the creator's + information is correct. How this trust is obtained is outside the + scope of this document. It is entirely a local matter. + + Thus, this document defines a "trust boundary" as the delineation + between "external" and "internal" entities; "external" here includes + all hosts that do not deliberately provide some kind of messaging + service for the receiving ADMD's users, and "internal" includes those + hosts that do. By this definition, the hosts within a "trust + boundary" may lie entirely within a receiving ADMD's direct control, + + + +Kucherawy Standards Track [Page 4] + +RFC 5451 Authentication-Results Header Field April 2009 + + + or they can include hosts managed by another ADMD (such as an ISP or + commercial filtering service) but that also provide services for the + former. + +1.3. Processing Scope + + This proposal is intended to address the needs of authenticating + messages or properties of messages during their actual transport. It + is not meant to address the security of messages that might be + encapsulated within other messages, such as a message/rfc822 [MIME] + part within a message. + +1.4. Requirements + + This memo establishes no new requirements on existing protocols or + servers. + + In particular, this memo establishes no requirement on MTAs to reject + or filter arriving messages that do not pass authentication checks. + The data conveyed by the defined header field's contents are for the + information of MUAs and filters and should be used at their + discretion. + +1.5. Definitions + + This section defines various terms used throughout this document. + +1.5.1. General + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [KEYWORDS]. + +1.5.2. Security + + [SECURITY] discusses authentication and authorization and the + conflation of the two concepts. The use of those terms within the + context of recent message-security work has given rise to slightly + different definitions, and this document reflects those current + usages, as follows: + + o "Authorization" is the establishment of permission to use a + resource or represent an identity. In this context, authorization + indicates that a message from a particular ADMD arrived via a + route the ADMD has explicitly approved. + + + + + + +Kucherawy Standards Track [Page 5] + +RFC 5451 Authentication-Results Header Field April 2009 + + + o "Authentication" is the assertion of validity of a piece of data + about a message (such as the sender's identity) or the message in + its entirety. + + As examples: [SPF] and [SENDERID] are authorization mechanisms in + that they express a result that shows whether or not the ADMD that + apparently sent the message has explicitly authorized the connecting + [SMTP] client to relay messages on its behalf but do not actually + validate any property of the message itself. By contrast, [DKIM] is + agnostic as to the routing of a message but uses cryptographic + signatures to authenticate agents claiming responsibility for the + message (which implies authorization) and ensure it was not modified + in transit. Since the signatures are not tied to SMTP connections, + they can be added by either the ADMD of origin, intermediate ADMDs + (such as a mailing list server), or both. + + Rather than create a separate header field for each class of + solution, this proposal groups them both into a single header field. + +1.5.3. Email Architecture + + o A "border MTA" is an MTA that acts as a gateway between the + general Internet and the users within an organizational boundary. + (See also Section 1.2.) + + o A "delivery MTA" (or Mail Delivery Agent or MDA) is an MTA that + actually enacts delivery of a message to a user's inbox or other + final delivery. + + o An "intermediate MTA" is an MTA that handles messages after a + border MTA and before a delivery MTA. + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 6] + +RFC 5451 Authentication-Results Header Field April 2009 + + + The following diagram illustrates the flow of mail among these + defined components: + + +-----+ +-----+ +------------+ + | MUA |-->| MSA |-->| Border MTA | + +-----+ +-----+ +------------+ + | + | + V + +----------+ + | Internet | + +----------+ + | + | + V + +-----+ +-----+ +------------------+ +------------+ + | MUA |<--| MDA |<--| Intermediate MTA |<--| Border MTA | + +-----+ +-----+ +------------------+ +------------+ + + Generally, it is assumed that the work of applying message + authentication schemes takes place at a border MTA or a delivery MTA. + This specification is written with that assumption in mind. However, + there are some sites at which the entire mail infrastructure consists + of a single host. In such cases, such terms as "border MTA" and + "delivery MTA" may well apply to the same machine or even the very + same agent. It is also possible that some message authentication + tests could take place on an intermediate MTA. Although this + document doesn't specifically describe such cases, they are not meant + to be excluded from this specification. + + See [EMAIL-ARCH] for further discussion on general email system + architecture, and Appendix C of this memo for discussion about the + common aspects of email authentication in current environments. + +1.6. Trust Environment + + This new header field permits one or more message validation + mechanisms to communicate its output to one or more separate + assessment mechanisms. These mechanisms operate within a unified + trust boundary that defines an Administrative Management Domain + (ADMD). An ADMD contains one or more entities that perform + validation and generate the header field, and one or more that + consume it for some type of assessment. The field contains no + integrity or validation mechanism of its own, so its presence must be + trusted implicitly. Hence, use of the header field depends upon + ensuring that mail entering the ADMD has instances of the header + field claiming to be valid within its boundaries removed, so that + occurrences of such header fields can be used safely by consumers. + + + +Kucherawy Standards Track [Page 7] + +RFC 5451 Authentication-Results Header Field April 2009 + + + The "authserv-id" token defined in Section 2.2 can be used to label + an entire ADMD or a specific validation engine within an ADMD. + Although the labeling scheme is left as an operational choice, some + guidance for selecting a token is provided within this proposal. + +2. Definition and Format of the Header Field + + This section gives a general overview of the format of the header + field being defined, and then provides more formal specification. + +2.1. General Description + + The new header field being defined here is called "Authentication- + Results". It is a Structured Header Field as defined in [MAIL] and + thus all of the related definitions in that document apply. + + This new header field SHOULD be added at the top of the message as it + transits MTAs that do authentication checks so some idea of how far + away the checks were done can be inferred. It therefore should be + treated as a Trace Field as defined in [MAIL], and thus all of the + related definitions in that document apply. + + The value of the header field (after removing [MAIL] comments) + consists of an authentication identifier, an optional version, and + then a series of "method=result" statements indicating which + authentication method(s) were applied and their respective results, + and then, for each applied method, an optional "reason" string plus + optional "property=value" statements indicating which message + properties were evaluated to reach that conclusion. + + The header field MAY appear more than once in a single message, or + more than one result MAY be represented in a single header field, or + a combination of these MAY be applied. + +2.2. Formal Definition + + Formally, the header field is specified as follows using [ABNF]: + + authres-header = "Authentication-Results:" [CFWS] authserv-id + [ CFWS version ] + ( [CFWS] ";" [CFWS] "none" / 1*resinfo ) [CFWS] CRLF + ; the special case of "none" is used to indicate that no + ; message authentication is performed + + authserv-id = dot-atom + ; see below for a description of this element + + + + + +Kucherawy Standards Track [Page 8] + +RFC 5451 Authentication-Results Header Field April 2009 + + + version = 1*DIGIT [CFWS] + ; indicates which version of this specification is in use; + ; this specification is version "1"; the absence of a + ; version implies this version of the specification + + resinfo = [CFWS] ";" methodspec [ CFWS reasonspec ] + *( CFWS propspec ) + + methodspec = [CFWS] method [CFWS] "=" [CFWS] result + ; indicates which authentication method was evaluated + + reasonspec = "reason" [CFWS] "=" [CFWS] value + ; a free-form comment on the reason the given result + ; was returned + + propspec = ptype [CFWS] "." [CFWS] property [CFWS] "=" pvalue + ; an indication of which properties of the message + ; were evaluated by the authentication scheme being + ; applied to yield the reported result and would be + ; useful to reveal to end users as authenticated + + method = dot-atom [ [CFWS] "/" [CFWS] version ] + ; a method indicates which method's result is + ; represented by "result", and is one of the methods + ; explicitly defined as valid in this document + ; or is an extension method as defined below + + result = dot-atom + ; indicates the results of the attempt to authenticate + ; the message; see below for details + + ptype = "smtp" / "header" / "body" / "policy" + ; indicates whether the property being evaluated was + ; a parameter to an [SMTP] command, or was a value taken + ; from a message header field, or was some property of + ; the message body, or some other property evaluated by + ; the receiving MTA + + property = dot-atom + ; if "ptype" is "smtp", this indicates which [SMTP] + ; command provided the value that was evaluated by the + ; authentication scheme being applied; if "ptype" is + ; "header", this indicates from which header field the + ; value being evaluated was extracted; if "ptype" is + ; "body", this indicates the offset into the body at which + ; content of interest was detected; if "ptype" is "policy" + ; then this indicates the name of the policy that caused + ; this header field to be added (see below) + + + +Kucherawy Standards Track [Page 9] + +RFC 5451 Authentication-Results Header Field April 2009 + + + pvalue = [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) + [CFWS] + ; the value extracted from the message property defined + ; by the "ptype.property" construction; if the value + ; identifies something intended to be an e-mail identity, + ; then it MUST use the right hand portion of this ABNF + ; definition + + The "local-part" is as defined in Section 3.4.1, and "dot-atom" is + defined in Section 3.2.3, of [MAIL]. + + The "value" is as defined in Section 5.1 of [MIME]. + + The "domain-name" is as defined in Section 3.5 of [DKIM]. + + The "dot-atom" used in a "result" above is further constrained by the + necessity of being enumerated in Section 2.4 or an amendment to it. + + See Section 2.3 for a description of the "authserv-id" element. + + The list of commands eligible for use with the "smtp" ptype can be + found in [SMTP] and subsequent amendments. + + "CFWS" is as defined in Section 3.2.2 of [MAIL]. + + The "propspec" may be omitted if, for example, the method was unable + to extract any properties to do its evaluation yet has a result to + report. + + The "ptype" and "property" values used by each authentication method + should be defined in the specification for that method (or its + amendments). + + The "ptype" and "property" are case-insensitive. + + A "ptype" value of "policy" indicates a policy decision about the + message not specific to a property of the message that could be + extracted. For example, if a method would normally report a + "ptype.property" of "header.From" and no From: header field was + present, the method can use "policy" to indicate that no conclusion + about the authenticity of the message could be reached. + +2.3. Authentication Identifier Field + + Every Authentication-Results header field has an authentication + identifier field ("authserv-id" above). This is similar in syntax to + a fully-qualified domain name. + + + + +Kucherawy Standards Track [Page 10] + +RFC 5451 Authentication-Results Header Field April 2009 + + + The authentication identifier field provides a unique identifier that + refers to the authenticating service within a given ADMD. The + uniqueness of the identifier MUST be guaranteed by the ADMD that + generates it and must pertain to exactly that one ADMD. This + identifier is intended to be machine-readable and not necessarily + meaningful to users. MUAs or downstream filters SHOULD use this + identifier to determine whether or not the data contained in an + Authentication-Results header field should be used. + + For simplicity and scalability, the authentication identifier SHOULD + be a common token used throughout the ADMD, such as the DNS domain + name used by or within that ADMD. + + For tracing and debugging purposes, the authentication identifier MAY + instead be the hostname of the MTA performing the authentication + check whose result is being reported. This is also useful for + another purpose, as described in Section 4. Moreover, some + implementations have considered appending a delimiter such as "/" and + following it with useful transport tracing data such as the [SMTP] + queue ID or a timestamp. + + It should be noted, however, that using a local, relative identifier + like a single hostname, rather than a hierarchical and globally + unique ADMD identifier like a DNS domain name, makes configuration + more difficult for large sites. The hierarchical identifier permits + aggregating related, trusted systems together under a single, parent + identifier, which in turn permits assessing the trust relationship + with a single reference. The alternative is a flat namespace + requiring individually listing each trusted system. Since consumers + must use the identifier to determine whether to use the contents of + the header field: + + o Changes to the identifier impose a large, centralized + administrative burden. + + o Ongoing administrative changes require constantly updating this + centralized table, making it difficult to ensure that an MUA or + downstream filter will have access to accurate information for + assessing the usability of the header field's content. In + particular, consumers of the header field will need to know not + only the current identifier(s) in use, but previous ones as well + to account for delivery latency or later re-assessment of the + header field's contents. + + Examples of valid authentication identifiers are "example.com", + "mail.example.org", "ms1.newyork.example.com", and "example-auth". + + + + + +Kucherawy Standards Track [Page 11] + +RFC 5451 Authentication-Results Header Field April 2009 + + +2.4. Result Values + + Each individual authentication method returns one of a set of + specific result values. The subsections below define these results + for the authentication methods specifically supported by this memo, + and verifiers SHOULD use these values as described below. New + methods not specified in this document intended to be supported by + the header field defined in this memo MUST include a similar result + table either in its defining memo or in a supplementary one. + +2.4.1. DKIM and DomainKeys Results + + The result values used by [DKIM] and [DOMAINKEYS] are as follows: + + none: The message was not signed. + + pass: The message was signed, the signature or signatures were + acceptable to the verifier, and the signature(s) passed + verification tests. + + fail: The message was signed and the signature or signatures were + acceptable to the verifier, but they failed the verification + test(s). + + policy: The message was signed but the signature or signatures were + not acceptable to the verifier. + + neutral: The message was signed but the signature or signatures + contained syntax errors or were not otherwise able to be + processed. This result SHOULD also be used for other failures not + covered elsewhere in this list. + + temperror: The message could not be verified due to some error that + is likely transient in nature, such as a temporary inability to + retrieve a public key. A later attempt may produce a final + result. + + permerror: The message could not be verified due to some error that + is unrecoverable, such as a required header field being absent. A + later attempt is unlikely to produce a final result. + + A signature is "acceptable to the verifier" if it passes local policy + checks (or there are no specific local policy checks). For example, + a verifier might require that the signature(s) on the message be + added using the DNS domain present in the From: header field of the + message, thus making third-party signatures unacceptable. + + + + + +Kucherawy Standards Track [Page 12] + +RFC 5451 Authentication-Results Header Field April 2009 + + + [DKIM] advises that if a message fails verification, it should be + treated as an unsigned message. A report of "fail" here permits the + receiver of the report to decide how to handle the failure. A report + of "neutral" or "none" preempts that choice, ensuring the message + will be treated as if it had not been signed. + +2.4.2. SPF and Sender-ID Results + + The result values are used by [SPF] and [SENDERID] as follows: + + none: No policy records were published at the sender's DNS domain. + + neutral: The sender's ADMD has asserted that it cannot or does not + want to assert whether or not the sending IP address is authorized + to send mail using the sender's DNS domain. + + pass: The client is authorized by the sender's ADMD to inject or + relay mail on behalf of the sender's DNS domain. + + policy: The client is authorized to inject or relay mail on behalf + of the sender's DNS domain according to the authentication + method's algorithm, but local policy dictates that the result is + unacceptable. + + hardfail: This client is explicitly not authorized to inject or + relay mail using the sender's DNS domain. + + softfail: The sender's ADMD believes the client was not authorized + to inject or relay mail using the sender's DNS domain, but is + unwilling to make a strong assertion to that effect. + + temperror: The message could not be verified due to some error that + is likely transient in nature, such as a temporary inability to + retrieve a policy record from DNS. A later attempt may produce a + final result. + + permerror: The message could not be verified due to some error that + is unrecoverable, such as a required header field being absent or + a syntax error in a retrieved DNS TXT record. A later attempt is + unlikely to produce a final result. + + The distinction between and interpretation of "none" and "neutral" + under these methods is discussed further in [SPF]. + + The "policy" result would be returned if, for example, [SPF] returned + as "pass" result, but a local policy check matches the sending DNS + domain to one found in an explicit list of unacceptable DNS domains + (e.g., spammers). + + + +Kucherawy Standards Track [Page 13] + +RFC 5451 Authentication-Results Header Field April 2009 + + + If the retrieved sender policies used to evaluate [SPF] and + [SENDERID] do not contain explicit provisions for authenticating the + local-part (see Section 3.4.1 of [MAIL]) of an address, the "pvalue" + reported along with results for these mechanisms SHOULD NOT include + the local-part. + +2.4.3. "iprev" Results + + The result values are used by the "iprev" method, defined in + Section 3, are as follows: + + pass: The DNS evaluation succeeded, i.e., the "reverse" and + "forward" lookup results were returned and were in agreement. + + fail: The DNS evaluation failed. In particular, the "reverse" and + "forward" lookups each produced results but they were not in + agreement, or the "forward" query completed but produced no + result, e.g., a DNS RCODE of 3, commonly known as NXDOMAIN, or an + RCODE of 0 (NOERROR) in a reply containing no answers, was + returned. + + temperror: The DNS evaluation could not be completed due to some + error that is likely transient in nature, such as a temporary DNS + error, e.g., a DNS RCODE of 2, commonly known as SERVFAIL, or + other error condition resulted. A later attempt may produce a + final result. + + permerror: The DNS evaluation could not be completed because no PTR + data are published for the connecting IP address, e.g., a DNS + RCODE of 3, commonly known as NXDOMAIN, or an RCODE of 0 (NOERROR) + in a reply containing no answers, was returned. This prevented + completion of the evaluation. + + There is no "none" for this method since any TCP connection + delivering email has an IP address associated with it, so some kind + of evaluation will always be possible. + + For discussion of the format of DNS replies, see [DNS]. + +2.4.4. SMTP AUTH Results + + The result values are used by the [AUTH] method are as follows: + + none: SMTP authentication was not attempted. + + pass: The SMTP client had authenticated to the server reporting the + result using the protocol described in [AUTH]. + + + + +Kucherawy Standards Track [Page 14] + +RFC 5451 Authentication-Results Header Field April 2009 + + + fail: The SMTP client had attempted to authenticate to the server + using the protocol described in [AUTH] but was not successful, yet + continued to send the message about which a result is being + reported. + + temperror: The SMTP client attempted to authenticate using the + protocol described in [AUTH] but was not able to complete the + attempt due to some error which is likely transient in nature, + such as a temporary Lightweight Directory Access Protocol (LDAP) + lookup error. A later attempt may produce a final result. + + permerror: The SMTP client attempted to authenticate using the + protocol described in [AUTH] but was not able to complete the + attempt due to some error that is likely not transient in nature, + such as a permanent LDAP lookup error. A later attempt is not + likely produce a final result. + + Note that an agent making use of the data provided by this header + field SHOULD consider "fail" and "temperror" to be the synonymous in + terms of message authentication, i.e., the client did not + authenticate. + +2.4.5. Extension Result Codes + + Additional result codes (extension results) might be defined in the + future by later revisions or extensions to this specification. + Extension results beginning with "x-" will never be defined as + standard fields; such names are reserved for experimental use. + Result codes not beginning with "x-" MUST be registered with the + Internet Assigned Numbers Authority (IANA) and published in an RFC. + See Section 6 for further details. + + Implementations reporting new result codes MUST use the "x-" prefix + until such time as the new method is registered by IANA. + + Extension results MUST only be used within ADMDs that have explicitly + consented to use them. These results and the parameters associated + with them are not documented in RFCs. Therefore, they are subject to + change at any time and not suitable for production use. Any MTA, MUA + or downstream filter intended for production use SHOULD ignore or + delete any Authentication-Results header field that includes an + extension result. + +2.5. Authentication Methods + + This section defines the supported authentication methods and + discusses the proper means for applying experimental and other + extension methods. + + + +Kucherawy Standards Track [Page 15] + +RFC 5451 Authentication-Results Header Field April 2009 + + +2.5.1. Definition of Initial Methods + + As they are currently existing specifications for message + authentication, it is appropriate to define an authentication method + identifier for each of [AUTH], [DKIM], [DOMAINKEYS], [SENDERID], and + [SPF]. Therefore, the authentication method identifiers "auth", + "dkim", "domainkeys", "sender-id", and "spf", respectively are hereby + defined for MTAs applying those specifications for email message + authentication. + + Furthermore, method "iprev" is defined in Section 3. + + See Section 6 for details. + +2.5.2. Extension Methods + + Additional authentication method identifiers (extension methods) may + be defined in the future by later revisions or extensions to this + specification. Extension methods beginning with "x-" will never be + defined as standard fields; such names are reserved for experimental + use. Method identifiers not beginning with "x-" MUST be registered + with the Internet Assigned Numbers Authority (IANA) and published in + an RFC. See Section 6 for further details. + + Extension methods may be defined for the following reasons: + + 1. To allow additional information from new authentication systems + to be communicated to MUAs or downstream filters. The names of + such identifiers should reflect the name of the method being + defined, but should not be needlessly long. + + 2. To allow the creation of "sub-identifiers" that indicate + different levels of authentication and differentiate between + their relative strengths, e.g., "auth1-weak" and "auth1-strong". + + Implementations of new methods MUST use the "x-" prefix until such + time as the new method is registered by IANA. + + Authentication method implementors are encouraged to provide adequate + information, via [MAIL] comments if necessary, to allow an MUA + developer to understand or relay ancillary details of authentication + results. For example, if it might be of interest to relay what data + was used to perform an evaluation, such information could be relayed + as a comment in the header field, such as: + + Authentication-Results: example.com; + foo=pass bar.baz=blob (2 of 3 tests OK) + + + + +Kucherawy Standards Track [Page 16] + +RFC 5451 Authentication-Results Header Field April 2009 + + + Experimental method identifiers MUST only be used within ADMDs that + have explicitly consented to use them. These method identifiers and + the parameters associated with them are not documented in RFCs. + Therefore, they are subject to change at any time and not suitable + for production use. Any MTA, MUA, or downstream filter intended for + production use SHOULD ignore or delete any Authentication-Results + header field that includes an experimental method identifier. + +3. The "iprev" Authentication Method + + This section defines an additional authentication method called + "iprev". + + In general, "iprev" is an attempt to verify that a client appears to + be valid based on some DNS queries. Upon receiving a session + initiation of some kind from a client, the IP address of the client + peer is queried for matching names (i.e., a number-to-name + translation, also known as a "reverse lookup" or a "PTR" record + query). Once that result is acquired, a lookup of each of the names + (i.e., a name-to-number translation, or an "A" or "AAAA" record + query) thus retrieved is done. The response to this second check + should result in at least one mapping back to the client's IP + address. + + More algorithmically: if the client peer's IP address is I, the list + of names to which I maps (after a "PTR" query) is the set N, and the + union of IP addresses to which each member of N maps (after + corresponding "A" and "AAAA" queries) is L, then this test is + successful if I is an element of L. + + The response to a PTR query could contain multiple names. To prevent + heavy DNS loads, agents performing these queries MUST be implemented + such that the number of names evaluated by generation of + corresponding A or AAAA queries is finite, though it MAY be + configurable by an administrator. As an example, Section 5.5 of + [SPF] chose a limit of 10 for its implementation of this algorithm. + + [DNS-IP6] discusses the query formats for the IPv6 case. + + A successful test using this algorithm constitutes a result of "pass" + since the ADMD in which the client's PTR claims it belongs has + confirmed that claim by including corresponding data in its DNS + domain. A failure to match constitutes a "fail". There is no case + in which a "neutral" result can be returned. The remaining + "temperror" and "permerror" cases refer, respectively, to temporary + and permanent DNS query errors. + + + + + +Kucherawy Standards Track [Page 17] + +RFC 5451 Authentication-Results Header Field April 2009 + + + There is some contention regarding the wisdom and reliability of this + test. For example, in some regions it can be difficult for this test + ever to pass because the practice of arranging to match the forward + and reverse DNS is infrequently observed. Therefore, the actual + implementation details of how a verifier performs an "iprev" test are + not specified here. The verifier MAY report a successful or failed + "iprev" test at its discretion having done some kind of check of the + validity of the connection's identity using DNS. It is incumbent + upon an agent making use of the reported "iprev" result to understand + what exactly that particular verifier is attempting to report. + + Extensive discussion of reverse DNS mapping and its implications can + be found in [DNSOP-REVERSE]. In particular, it recommends that + applications avoid using this test as a means of authentication or + security. Its presence in this memo is not an endorsement, but is + merely acknowledgement that the method remains common and provides + the means to relay the results of that test. + +4. Adding the Header Field to A Message + + This specification makes no attempt to evaluate the relative + strengths of various message authentication methods that may become + available. As such, the order of the presented authentication + methods and results MUST NOT be used either to imply or infer the + importance or strength of any given method over another. Instead, + the MUA or downstream filter consuming this header field must + interpret the result of each method based on its own knowledge of + what that method evaluates. + + Each "method" MUST refer to an authentication method declared in the + IANA registry, or an extension method as defined in Section 2.5.2, + and each "result" MUST refer to a result code declared in the IANA + registry, or an extension result code as defined in Section 2.4.5. + See Section 6 for further information about the registered methods + and result codes. + + An MTA compliant with this specification MUST add this header field + (after performing one or more message authentication tests) to + indicate which MTA or ADMD performed the test, which test got applied + and what the result was. If an MTA applies more than one such test, + it MUST add this header field either once per test, or once + indicating all of the results. An MTA MUST NOT add a result to an + existing header field. + + An MTA MAY add this header field containing only the authentication + identifier portion to indicate explicitly that no message + authentication schemes were applied prior to delivery of this + message. + + + +Kucherawy Standards Track [Page 18] + +RFC 5451 Authentication-Results Header Field April 2009 + + + An MTA adding this header field must take steps to identify it as + legitimate to the MUAs or downstream filters that will ultimately + consume its content. One required process to do so is described in + Section 5. Further measures may be required in some environments. + Some possible solutions are enumerated in Section 7.1. This memo + does not mandate any specific solution to this issue as each + environment has its own facilities and limitations. + + For MTAs that add this header field, adding header fields in order + (at the top), per Section 3.6 of [MAIL], is particularly important. + Moreover, this header field SHOULD be inserted above any other trace + header fields such MTAs might prepend. This allows easy detection of + header fields that can be trusted. + + End users making direct use of this header field may inadvertently + trust information that has not been properly vetted. If, for + example, a basic [SPF] result were to be relayed that claims an + authenticated addr-spec, the local-part of that addr-spec has + actually not been authenticated. Thus, an MTA adding this header + field SHOULD NOT include any data that has not been authenticated by + the method(s) being applied. Moreover, MUAs SHOULD NOT render to + users such information if it is presented by a method known not to + authenticate it. + +4.1. Header Field Position and Interpretation + + In order to ensure non-ambiguous results and avoid the impact of + false header fields, MUAs and downstream filters SHOULD NOT interpret + this header field unless specifically instructed to do so by the user + or administrator. That is, this interpretation should not be "on by + default". Naturally then, users or administrators should not + activate such a feature unless they are certain the header field will + be added by the border MTA that accepts the mail that is ultimately + read by the MUA, and instances of the header field appearing to be + from within the ADMD but actually added by foreign MTAs will be + removed before delivery. + + Furthermore, MUAs and downstream filters SHOULD NOT interpret this + header field unless the authentication identifier it bears appears to + be one used within its own ADMD as configured by the user or + administrator. + + MUAs and downstream filters MUST ignore any result reported using a + "result" not specified in the result code registry, or a "ptype" not + listed in the corresponding registry for such values as defined in + Section 6. Moreover, such agents MUST ignore a result indicated for + any "method" they do not specifically support. + + + + +Kucherawy Standards Track [Page 19] + +RFC 5451 Authentication-Results Header Field April 2009 + + + An MUA SHOULD NOT reveal these results to end users unless the + results are accompanied by, at a minimum, some associated reputation + data about the authenticated origin identifiers within the message. + For example, an attacker could register examp1e.com (note the digit + "one") and send signed mail to intended victims; a verifier would + detect that the signature was valid and report a "pass" even though + it's clear the DNS domain name was intended to mislead. See + Section 7.2 for further discussion. + + As stated in Section 2.1, this header field SHOULD be treated as + though it were a trace header field as defined in Section 3.6.7 of + [MAIL], and hence MUST NOT be reordered and MUST be prepended to the + message, so that there is generally some indication upon delivery of + where in the chain of handling MTAs the message authentication was + done. + + MUAs SHOULD ignore instances of this header field discovered within + message/rfc822 [MIME] attachments. + + Further discussion of this can be found in Section 7 below. + +4.2. Local Policy Enforcement + + If a site's local policy is to consider a non-recoverable failure + result (e.g., "fail" for DKIM, "hardfail" for SPF) for any particular + authentication method as justification to reject the message + completely, the border MTA SHOULD issue an [SMTP] rejection response + to the message rather than adding this header field with the failure + result and allowing it to proceed toward delivery. This is more + desirable than allowing the message to reach an internal host's MTA + or spam filter, thus possibly generating a local rejection such as a + [DSN] to a forged originator. + + The same MAY also be done for local policy decisions overriding the + results of the authentication methods (e.g., the "policy" result + codes described in Section 2.4). + + Such rejections at the SMTP protocol level are not possible if local + policy is enforced at the MUA and not the MTA. Unfortunately, this + may be a common scenario. + +5. Removing the Header Field + + For security reasons, any MTA conforming to this specification MUST + delete any discovered instance of this header field that claims to + have been added within its trust boundary and that did not come from + another trusted MTA. For example, an MTA (border or otherwise) for + example.com receiving a message MUST delete any instance of this + + + +Kucherawy Standards Track [Page 20] + +RFC 5451 Authentication-Results Header Field April 2009 + + + header field bearing an authentication identifier indicating the + header field was added within example.com prior to adding its own + header fields. This may mean each MTA will have to be equipped with + a list of internal MTAs known to be compliant (and hence + trustworthy). + + For simplicity and maximum security, a border MTA MAY remove all + instances of this header field on mail crossing into its trust + boundary. However, this may conflict with the desire to access + authentication results performed by trusted external service + providers. It may also invalidate signed messages whose signatures + cover external instances of this header field. A more robust border + MTA could allow a specific list of authenticating MTAs whose + information should be let in, removing all others. + + As stated in Section 1.2, a formal definition of "trust boundary" is + deliberately not made here. It is entirely possible that a border + MTA for example.com might explicitly trust authentication results + asserted by upstream host example.net even though they exist in + completely disjoint administrative boundaries. In that case, the + border MTA MAY elect not to delete those results; moreover, the + upstream host doing some authentication work could apply a signing + technology such as [DKIM] on its own results to assure downstream + hosts of their authenticity. An example of this is provided in + Appendix B. + + Similarly, in the case of messages signed using [DKIM] or other + message signing methods that sign header fields, this may invalidate + one or more signatures on the message if they covered the header + field to be removed at the time of signing. This behavior can be + desirable since there's little value in validating the signature on a + message with forged headers. However, signing agents MAY therefore + elect to omit these header fields from signing to avoid this + situation. + + An MTA SHOULD remove any instance of this header field bearing a + version (express or implied) that it does not support. However, an + MTA MUST remove such a header if the [SMTP] connection relaying the + message is not from a trusted internal MTA. + + + + + + + + + + + + +Kucherawy Standards Track [Page 21] + +RFC 5451 Authentication-Results Header Field April 2009 + + +6. IANA Considerations + + IANA has registered a new header field and created two new tables as + described below. + +6.1. The Authentication-Results Header Field + + Per [IANA-HEADERS], the "Authentication-Results" header field has + been added to the IANA Permanent Message Header Field Registry. The + following is the registration template: + + Header field name: Authentication-Results + Applicable protocol: mail ([MAIL]) + Status: Standard + Author/Change controller: IETF + Specification document(s): RFC 5451 + Related information: + Requesting review of any proposed changes and additions to + this field is recommended. + +6.2. Email Authentication Method Name Registry + + Names of message authentication methods supported by this + specification must be registered with IANA, with the exception of + experimental names as described in Section 2.5.2. + + New entries are assigned only for values that have been documented in + a published RFC that has had IETF Review, per [IANA-CONSIDERATIONS]. + Each method must register a name, the specification that defines it, + one or more "ptype" values appropriate for use with that method, + which "property" value(s) should be reported by that method, and a + description of the "value" to be used with each. + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 22] + +RFC 5451 Authentication-Results Header Field April 2009 + + + The initial set of entries in this registry is as follows: + ++------------+----------+--------+----------------+--------------------+ +| Method | Defined | ptype | property | value | ++------------+----------+--------+----------------+--------------------+ +| auth | RFC4954 | smtp | auth | AUTH parameter of | +| | | | | the SMTP MAIL | +| | | | | command | ++------------+----------+--------+----------------+--------------------+ +| dkim | RFC4871 | header | d | value of | +| | | | | signature "d" tag | +| | | +----------------+--------------------+ +| | | | i | value of | +| | | | | signature "i" tag | ++------------+----------+--------+----------------+--------------------+ +| domainkeys | RFC4870 | header | d | value of | +| | | | | signature "d" tag | +| | | +----------------+--------------------+ +| | | | from | value of From | +| | | | | header field after | +| | | | | removing comments | +| | | | | and local-part if | +| | | | | not authenticated | +| | | +----------------+--------------------+ +| | | | sender | value of Sender | +| | | | | header field after | +| | | | | removing comments | +| | | | | and local-part if | +| | | | | not authenticated | ++------------+----------+--------+----------------+--------------------+ +| iprev | this | policy | iprev | client IP address | +| | document | | | | ++------------+----------+--------+----------------+--------------------+ +| sender-id | RFC4406 | header | name of header | value of header | +| | | | field used by | field used by PRA | +| | | | the Purported | after removing | +| | | | Responsible | comments and parts | +| | | | Address (PRA) | not authenticated | ++------------+----------+--------+----------------+--------------------+ +| spf | RFC4408 | smtp | mailfrom | envelope sender | +| | | | | after removing | +| | | | | parts not | +| | | | | authenticated | +| | +--------+----------------+--------------------+ +| | | smtp | helo | HELO/EHLO value | ++------------+----------+--------+----------------+--------------------+ + + + + + +Kucherawy Standards Track [Page 23] + +RFC 5451 Authentication-Results Header Field April 2009 + + +6.3. Email Authentication Result Name Registry + + Names of message authentication result codes supported by this + specification must be registered with IANA, with the exception of + experimental codes as described in Section 2.4.5. + + New entries are assigned only for result codes that have been + documented in a published RFC that has had IETF Review, per + [IANA-CONSIDERATIONS]. Each code must register a name, the document + that establishes the registration, the authentication method(s) that + uses it, and either a definition of the semantics of its use or a + reference to the place where those semantics are defined. + + The initial set of entries in this registry is as follows: + ++-----------+----------+----------------+------------------------------+ +| Code | Defined | Auth Method(s) | Meaning | ++-----------+----------+----------------+------------------------------+ +| none | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | spf | section 2.4.2 | +| | | sender-id | | +| | +----------------+------------------------------+ +| | | auth | section 2.4.4 | ++-----------+----------+----------------+------------------------------+ +| pass | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | spf | section 2.4.2 | +| | | sender-id | | +| | +----------------+------------------------------+ +| | | iprev | section 2.4.3 | +| | +----------------+------------------------------+ +| | | auth | section 2.4.4 | ++-----------+----------+----------------+------------------------------+ +| fail | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | iprev | section 2.4.3 | +| | +----------------+------------------------------+ +| | | auth | section 2.4.4 | ++-----------+----------+----------------+------------------------------+ + + + + + + + + +Kucherawy Standards Track [Page 24] + +RFC 5451 Authentication-Results Header Field April 2009 + + +| policy | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | spf | section 2.4.2 | +| | | sender-id | | ++-----------+----------+----------------+------------------------------+ +| neutral | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | spf | section 2.4.2 | +| | | sender-id | | ++-----------+----------+----------------+------------------------------+ +| temperror | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | spf | section 2.4.2 | +| | | sender-id | | +| | +----------------+------------------------------+ +| | | iprev | section 2.4.3 | +| | +----------------+------------------------------+ +| | | auth | section 2.4.4 | ++-----------+----------+----------------+------------------------------+ +| permerror | this | dkim | section 2.4.1 | +| | document | domainkeys | | +| | +----------------+------------------------------+ +| | | spf | section 2.4.2 | +| | | sender-id | | +| | +----------------+------------------------------+ +| | | iprev | section 2.4.3 | +| | +----------------+------------------------------+ +| | | auth | section 2.4.4 | ++-----------+----------+----------------+------------------------------+ +| hardfail | this | spf | section 2.4.2 | +| | document | sender-id | | ++-----------+----------+----------------+------------------------------+ +| softfail | this | spf | section 2.4.2 | +| | document | sender-id | | ++-----------+----------+----------------+------------------------------+ + + + + + + + + + + + + + +Kucherawy Standards Track [Page 25] + +RFC 5451 Authentication-Results Header Field April 2009 + + +7. Security Considerations + + The following security considerations apply when adding or processing + the "Authentication-Results" header field: + +7.1. Forged Header Fields + + An MUA or filter that accesses a mailbox whose mail is handled by a + non-conformant MTA, and understands Authentication-Results header + fields, could potentially make false conclusions based on forged + header fields. A malicious user or agent could forge a header field + using the DNS domain of a receiving ADMD as the authserv-id token in + the value of the header field, and with the rest of the value claim + that the message was properly authenticated. The non-conformant MTA + would fail to strip the forged header field, and the MUA could + inappropriately trust it. + + It is for this reason an MUA should not have processing of the + "Authentication-Results" header field enabled by default; instead it + should be ignored, at least for the purposes of enacting filtering + decisions, unless specifically enabled by the user or administrator + after verifying that the border MTA is compliant. It is acceptable + to have an MUA aware of this specification, but have an explicit list + of hostnames whose "Authentication-Results" header fields are + trustworthy; however, this list should initially be empty. + + Proposed alternate solutions to this problem are nascent: + + 1. Possibly the simplest is a digital signature protecting the + header field, such as using [DKIM], that can be verified by an + MUA by using a posted public key. Although one of the main + purposes of this memo is to relieve the burden of doing message + authentication work at the MUA, this only requires that the MUA + learn a single authentication scheme even if a number of them are + in use at the border MTA. Note that [DKIM] requires that the + From header field be signed, although in this application, the + signing agent (a trusted MTA) likely cannot authenticate that + value, so the fact that it is signed should be ignored. + + 2. Another would be a means to interrogate the MTA that added the + header field to see if it is actually providing any message + authentication services and saw the message in question, but this + isn't especially palatable given the work required to craft and + implement such a scheme. + + 3. Yet another might be a method to interrogate the internal MTAs + that apparently handled the message (based on Received: header + + + + +Kucherawy Standards Track [Page 26] + +RFC 5451 Authentication-Results Header Field April 2009 + + + fields) to determine whether any of them conform to Section 5 of + this memo. This, too, has potentially high barriers-to-entry. + + 4. Extensions to [IMAP], [SMTP], and [POP3] could be defined to + allow an MUA or filtering agent to acquire the "authserv-id" in + use within an ADMD, thus allowing it to identify which + Authentication-Results header fields it can trust. + + 5. On the presumption that internal MTAs are fully compliant with + Section 3.6 of [MAIL], and the compliant internal MTAs are using + their own host names or the ADMD's DNS domain name as the + "authserv-id" token, the header field proposed here should always + appear above a Received: header added by a trusted MTA. This can + be used as a test for header field validity. + + Support for some of these is planned for future work. + + In any case, a mechanism needs to exist for an MUA or filter to + verify that the host that appears to have added the header field (a) + actually did so, and (b) is legitimately adding that header field for + this delivery. Given the variety of messaging environments deployed + today, consensus appears to be that specifying a particular mechanism + for doing so is not appropriate for this memo. + + Mitigation of the forged header field attack can also be accomplished + by moving the authentication results data into meta-data associated + with the message. In particular, an [SMTP] extension could be + established which is used to communicate authentication results from + the border MTA to intermediate and delivery MTAs; the latter of these + could arrange to store the authentication results as meta-data + retrieved and rendered along with the message by an [IMAP] client + aware of a similar extension in that protocol. The delivery MTA + would be told to trust data via this extension only from MTAs it + trusts, and border MTAs would not accept data via this extension from + any source. There is no vector in such an arrangement for forgery of + authentication data by an outside agent. + +7.2. Misleading Results + + Until some form of service for querying the reputation of a sending + agent is widely deployed, the existence of this header field + indicating a "pass" does not render the message trustworthy. It is + possible for an arriving piece of spam or other undesirable mail to + pass checks by several of the methods enumerated above (e.g., a piece + of spam signed using [DKIM] by the originator of the spam, which + might be a spammer or a compromised system). In particular, this + issue is not resolved by forged header field removal discussed above. + + + + +Kucherawy Standards Track [Page 27] + +RFC 5451 Authentication-Results Header Field April 2009 + + + Hence, MUAs and downstream filters must take some care with use of + this header even after possibly malicious headers are scrubbed. + +7.3. Header Field Position + + Despite the requirements of [MAIL], header fields can sometimes be + reordered enroute by intermediate MTAs. The goal of requiring header + field addition only at the top of a message is an acknowledgement + that some MTAs do reorder header fields, but most do not. Thus, in + the general case, there will be some indication of which MTAs (if + any) handled the message after the addition of the header field + defined here. + +7.4. Reverse IP Query Denial-of-Service Attacks + + Section 5.5 of [SPF] describes a DNS-based denial-of-service attack + for verifiers that attempt DNS-based identity verification of + arriving client connections. A verifier wishing to do this check and + report this information SHOULD take care not to go to unbounded + lengths to resolve "A" and "PTR" queries. MUAs or other filters + making use of an "iprev" result specified by this memo SHOULD be + aware of the algorithm used by the verifier reporting the result and + thus be aware of its limitations. + +7.5. Mitigation of Backscatter + + Failing to follow the instructions of Section 4.2 can result in a + denial-of-service attack caused by the generation of [DSN] messages + (or equivalent) to addresses that did not send the messages being + rejected. + +7.6. Internal MTA Lists + + Section 5 describes a procedure for scrubbing headers that may + contain forged authentication results about a message. A compliant + installation will have to include, at each MTA, a list of other MTAs + known to be compliant and trustworthy. Failing to keep this list + current as internal infrastructure changes may expose an ADMD to + attack. + +7.7. Attacks against Authentication Methods + + If an attack becomes known against an authentication method, clearly + then the agent verifying that method can be fooled into thinking an + inauthentic message is authentic, and thus the value of this header + field can be misleading. It follows that any attack against the + authentication methods supported by this document (and later + amendments to it) is also a security consideration here. + + + +Kucherawy Standards Track [Page 28] + +RFC 5451 Authentication-Results Header Field April 2009 + + +7.8. Intentionally Malformed Header Fields + + It is possible for an attacker to add an Authentication-Results + header field that is extraordinarily large or otherwise malformed in + an attempt to discover or exploit weaknesses in header field parsing + code. Implementors must thoroughly verify all such header fields + received from MTAs and be robust against intentionally as well as + unintentionally malformed header fields. + +7.9. Compromised Internal Hosts + + An internal MUA or MTA that has been compromised could generate mail + with a forged From header field and a forged Authentication-Results + header field that endorses it. Although it is clearly a larger + concern to have compromised internal machines than it is to prove the + value of this header field, this risk can be mitigated by arranging + that internal MTAs will remove this header field if it claims to have + been added by a trusted border MTA (as described above), yet the + [SMTP] connection is not coming from an internal machine known to be + running an authorized MTA. However, in such a configuration, + legitimate MTAs will have to add this header field when legitimate + internal-only messages are generated. This is also covered in + Section 5. + +7.10. Encapsulated Instances + + [MIME] messages may contain attachments of type "message/rfc822", + which contain other [MAIL] messages. Such an encapsulated message + may also contain an Authentication-Results header field. Although + the processing of these is outside of the intended scope of this + document (see Section 1.3), some early guidance to MUA developers is + appropriate here. + + Since MTAs are unlikely to strip Authentication-Results header fields + after mailbox delivery, MUAs are advised in Section 4.1 to ignore + such instances within [MIME] attachments. Moreover, when extracting + a message digest to separate mail store messages or other media, such + header fields should be removed so that they will never be + interpreted improperly by MUAs that might later consume them. + +7.11. Reverse Mapping + + Although Section 3 of this memo includes explicit support for the + "iprev" method, its value as an authentication mechanism is limited. + Implementors of both this proposal and agents that use the data it + relays are encouraged to become familiar with the issues raised by + [DNSOP-REVERSE] when deciding whether or not to include support for + "iprev". + + + +Kucherawy Standards Track [Page 29] + +RFC 5451 Authentication-Results Header Field April 2009 + + +8. References + +8.1. Normative References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for + Syntax Specifications: ABNF", STD 68, + RFC 5234, January 2008. + + [IANA-HEADERS] Klyne, G., Nottingham, M., and J. Mogul, + "Registration Procedures for Message Header + Fields", BCP 90, RFC 3864, September 2004. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to + Indicate Requirement Levels", BCP 14, + RFC 2119, March 1997. + + [MAIL] Resnick, P., Ed., "Internet Message Format", + RFC 5322, October 2008. + + [MIME] Freed, N. and N. Borenstein, "Multipurpose + Internet Mail Extensions (MIME) Part One: + Format of Internet Message Bodies", RFC 2045, + November 1996. + +8.2. Informative References + + [AUTH] Siemborski, R. and A. Melnikov, "SMTP Service + Extension for Authentication", RFC 4954, + July 2007. + + [DKIM] Allman, E., Callas, J., Delany, M., Libbey, + M., Fenton, J., and M. Thomas, "DomainKeys + Identified Mail (DKIM) Signatures", RFC 4871, + May 2007. + + [DNS] Mockapetris, P., "Domain names - + implementation and specification", STD 13, + RFC 1035, November 1987. + + [DNS-IP6] Thomson, S., Huitema, C., Ksinant, V., and M. + Souissi, "DNS Extensions to Support IP Version + 6", RFC 3596, October 2003. + + [DNSOP-REVERSE] Senie, D. and A. Sullivan, "Considerations for + the use of DNS Reverse Mapping", Work + in Progress, March 2008. + + + + + +Kucherawy Standards Track [Page 30] + +RFC 5451 Authentication-Results Header Field April 2009 + + + [DOMAINKEYS] Delany, M., "Domain-Based Email Authentication + Using Public Keys Advertised in the DNS + (DomainKeys)", RFC 4870, May 2007. + + [DSN] Moore, K. and G. Vaudreuil, "An Extensible + Message Format for Delivery Status + Notifications", RFC 3464, January 2003. + + [EMAIL-ARCH] Crocker, D., "Internet Mail Architecture", + Work in Progress, October 2008. + + [IANA-CONSIDERATIONS] Narten, T. and H. Alvestrand, "Guidelines for + Writing an IANA Considerations Section in + RFCs", BCP 26, RFC 5226, May 2008. + + [IMAP] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL + - VERSION 4rev1", RFC 3501, March 2003. + + [POP3] Myers, J. and M. Rose, "Post Office Protocol - + Version 3", STD 53, RFC 1939, May 1996. + + [SECURITY] Rescorla, E. and B. Korver, "Guidelines for + Writing RFC Text on Security Considerations", + BCP 72, RFC 3552, July 2003. + + [SENDERID] Lyon, J. and M. Wong, "Sender ID: + Authenticating E-Mail", RFC 4406, April 2006. + + [SMTP] Klensin, J., "Simple Mail Transfer Protocol", + RFC 5321, October 2008. + + [SPF] Wong, M. and W. Schlitt, "Sender Policy + Framework (SPF) for Authorizing Use of Domains + in E-Mail, Version 1", RFC 4408, April 2006. + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 31] + +RFC 5451 Authentication-Results Header Field April 2009 + + +Appendix A. Legacy MUAs + + Implementors of this proposal should be aware that many MUAs are + unlikely to be retrofitted to support the new header field and its + semantics. In the interests of convenience and quicker adoption, a + delivery MTA might want to consider adding things that are processed + by existing MUAs in addition to the Authentication-Results header + field. One suggestion is to include a Priority header field, on + messages that don't already have such a header field, containing a + value that reflects the strength of the authentication that was + accomplished, e.g., "low" for weak or no authentication, "normal" or + "high" for good or strong authentication. + + Some modern MUAs can already filter based on the content of this + header field. However, there is keen interest in having MUAs make + some kind of graphical representation of this header field's meaning + to end users. Until this capability is added, other interim means of + conveying authentication results may be necessary while this proposal + and its successors are adopted. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 32] + +RFC 5451 Authentication-Results Header Field April 2009 + + +Appendix B. Authentication-Results Examples + + This section presents some examples of the use of this header field + to indicate authentication results. + +B.1. Trivial Case; Header Field Not Present + + The trivial case: + + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by server.example.org (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.org + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 1: Trivial case + + The "Authentication-Results" header field is completely absent. The + MUA may make no conclusion about the validity of the message. This + could be the case because the message authentication services were + not available at the time of delivery, or no service is provided, or + the MTA is not in compliance with this specification. + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 33] + +RFC 5451 Authentication-Results Header Field April 2009 + + +B.2. Nearly Trivial Case; Service Provided, But No Authentication Done + + A message that was delivered by an MTA that conforms to this + specification but provides no actual message authentication service: + + Authentication-Results: example.org; none + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by server.example.org (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.org + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 2: Header present but no authentication done + + The "Authentication-Results" header field is present, showing that + the delivering MTA conforms to this specification. It used its DNS + domain name as the authserv-id. The presence of "none" (and the + absence of any method and result tokens) indicates that no message + authentication was done. + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 34] + +RFC 5451 Authentication-Results Header Field April 2009 + + +B.3. Service Provided, Authentication Done + + A message that was delivered by an MTA that conforms to this + specification and applied some message authentication: + + Authentication-Results: example.com; + spf=pass smtp.mailfrom=example.net + Received: from dialup-1-2-3-4.example.net + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.net + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + Message-Id: <12345.abc@example.net> + Subject: here's a sample + + Hello! Goodbye! + + Example 3: Header reporting results + + The "Authentication-Results" header field is present, indicating that + the border MTA conforms to this specification. The authserv-id is + once again the DNS domain name. Furthermore, the message was + authenticated by that MTA via the method specified in [SPF]. Note + that since that method cannot authenticate the local-part, it has + been omitted from the result's value. The MUA could extract and + relay this extra information if desired. + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 35] + +RFC 5451 Authentication-Results Header Field April 2009 + + +B.4. Service Provided, Several Authentications Done, Single MTA + + A message that was relayed inbound via a single MTA that conforms to + this specification and applied three different message authentication + checks: + + Authentication-Results: example.com; + auth=pass (cram-md5) smtp.auth=sender@example.com; + spf=pass smtp.mailfrom=example.com + Authentication-Results: example.com; + sender-id=pass header.from=example.com + Received: from dialup-1-2-3-4.example.net (8.11.6/8.11.6) + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.net + From: sender@example.com + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 4: Headers reporting results from one MTA + + The "Authentication-Results" header field is present, indicating the + delivering MTA conforms to this specification. Once again, the + receiving DNS domain name is used as the authserv-id. Furthermore, + the sender authenticated herself/himself to the MTA via a method + specified in [AUTH], and both [SPF] and [SENDERID] checks were done + and passed. The MUA could extract and relay this extra information + if desired. + + Two "Authentication-Results" header fields are not required since the + same host did all of the checking. The authenticating agent could + have consolidated all the results into one header field. + + This example illustrates a scenario in which a remote user on a + dialup connection (example.net) sends mail to a border MTA + (example.com) using SMTP authentication to prove identity. The + dialup provider has been explicitly authorized to relay mail as + "example.com" resulting in passes by the SPF and SenderID checks. + + + + + + + + +Kucherawy Standards Track [Page 36] + +RFC 5451 Authentication-Results Header Field April 2009 + + +B.5. Service Provided, Several Authentications Done, Different MTAs + + A message that was relayed inbound by two different MTAs that conform + to this specification and applied multiple message authentication + checks: + + Authentication-Results: example.com; + sender-id=hardfail header.from=example.com; + dkim=pass (good signature) header.i=sender@example.com + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by auth-checker.example.com (8.11.6/8.11.6) + with ESMTP id i7PK0sH7021929; + Fri, Feb 15 2002 17:19:22 -0800 + Authentication-Results: example.com; + auth=pass (cram-md5) smtp.auth=sender@example.com; + spf=hardfail smtp.mailfrom=example.com + Received: from dialup-1-2-3-4.example.net + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; d=example.com; + i=sender@example.com; t=1188964191; c=simple/simple; + h=From:Date:To:Message-Id:Subject; + bh=sEuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m70; + b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM= + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 5: Headers reporting results from multiple MTAs + + The "Authentication-Results" header field is present, indicating + conformance to this specification. Once again, the authserv-id used + is the recipient's DNS domain name. The header field is present + twice because two different MTAs in the chain of delivery did + authentication tests. The first, "mail-router.example.com" reports + that [AUTH] and [SPF] were both used, and [AUTH] passed but [SPF] + failed. In the [AUTH] case, additional data is provided in the + comment field, which the MUA can choose to render if desired. + + + + + + +Kucherawy Standards Track [Page 37] + +RFC 5451 Authentication-Results Header Field April 2009 + + + The second MTA, "auth-checker.example.com", reports that it did a + [SENDERID] test (which failed) and a [DKIM] test (which passed). + Again, additional data about one of the tests is provided as a + comment, which the MUA may choose to render. + + Since different hosts did the two sets of authentication checks, the + header fields cannot be consolidated in this example. + + This example illustrates more typical transmission of mail into + "example.com" from a user on a dialup connection "example.net". The + user appears to be legitimate as he/she had a valid password allowing + authentication at the border MTA using [AUTH]. The [SPF] and + [SENDERID] tests failed since "example.com" has not granted + "example.net" authority to relay mail on its behalf. However, the + [DKIM] test passed because the sending user had a private key + matching one of "example.com"'s published public keys and used it to + sign the message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 38] + +RFC 5451 Authentication-Results Header Field April 2009 + + +B.6. Service Provided, Multi-Tiered Authentication Done + + A message that had authentication done at various stages, one of + which was outside the receiving ADMD: + + Authentication-Results: example.com; + dkim=pass (good signature) header.i=@mail-router.example.net; + dkim=fail (bad signature) header.i=@newyork.example.com + Received: from mail-router.example.net + (mail-router.example.net [192.0.2.250]) + by chicago.example.com (8.11.6/8.11.6) + for + with ESMTP id i7PK0sH7021929; + Fri, Feb 15 2002 17:19:22 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=furble; + d=mail-router.example.net; t=1188964198; c=relaxed/simple; + h=From:Date:To:Message-Id:Subject:Authentication-Results; + bh=ftA9J6GtX8OpwUECzHnCkRzKw1uk6FNiLfJl5Nmv49E=; + b=oINEO8hgn/gnunsg ... 9n9ODSNFSDij3= + Authentication-Results: example.net; + dkim=pass (good signature) header.i=@newyork.example.com + Received: from smtp.newyork.example.com + (smtp.newyork.example.com [192.0.2.220]) + by mail-router.example.net (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; d=newyork.example.com; + t=1188964191; c=simple/simple; + h=From:Date:To:Message-Id:Subject; + bh=sEu28nfs9fuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m7=; + b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM= + From: sender@newyork.example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: meetings@example.net + Message-Id: <12345.abc@newyork.example.com> + Subject: here's a sample + + Example 6: Headers reporting results from multiple MTAs in different + ADMDs + + In this example we see multi-tiered authentication with an extended + trust boundary. + + The message was sent from someone at example.com's New York office + (newyork.example.com) to a mailing list managed at an intermediary. + The message was signed at the origin using [DKIM]. + + + + + +Kucherawy Standards Track [Page 39] + +RFC 5451 Authentication-Results Header Field April 2009 + + + The message was sent to a mailing list service provider called + example.net, which is used by example.com. There, + meetings@example.net is expanded to a long list of recipients, one of + that is at the Chicago office. In this example, we will assume that + the trust boundary for chicago.example.com includes the mailing list + server at example.net. + + The mailing list server there first authenticated the message and + affixed an Authentication-Results header field indicating such using + its DNS domain name for the authserv-id. It then altered the message + by affixing some footer text to the body, including some + administrivia such as unsubscription instructions. Finally, the + mailing list server affixes a second [DKIM] signature and begins + distribution of the message. + + The border MTA for chicago.example.com explicitly trusts results from + mail-router.example.net so that header field is not removed. It + performs evaluation of both signatures and determines that the first + (most recent) is a "pass" but, because of the aforementioned + modifications, the second is a "fail". However, the first signature + included the Authentication-Results header added at mail- + router.example.net that validated the second signature. Thus, + indirectly, it can be determined that the authentications claimed by + both signatures are indeed valid. + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 40] + +RFC 5451 Authentication-Results Header Field April 2009 + + +Appendix C. Operational Considerations about Message Authentication + + This proposal is predicated on the idea that authentication (and + presumably in the future, reputation) work is typically done by + border MTAs rather than MUAs or intermediate MTAs; the latter merely + make use of the results determined by the former. Certainly this is + not mandatory for participation in electronic mail or message + authentication, but the work of this proposal and its deployment to + date is based on that model. The assumption satisfies several common + ADMD requirements: + + 1. Service operators prefer to resolve the handling of problem + messages as close to the border of the ADMD as possible. This + enables, for example, rejections of messages at the SMTP level + rather than generating a DSN internally. Thus, doing any of the + authentication or reputation work exclusively at the MUA or + intermediate MTA renders this desire unattainable. + + 2. Border MTAs are more likely to have direct access to external + sources of authentication or reputation information since modern + MUAs are more likely to be heavily firewalled. Thus, some MUAs + might not even be able to complete the task of performing + authentication or reputation evaluations without complex proxy + configurations or similar burdens. + + 3. MUAs rely upon the upstream MTAs within their trust boundaries to + make correct (as much as that is possible) evaluations about the + message's envelope, header and content. Thus, MUAs don't need to + know how to do the work that upstream MTAs do; they only need the + results of that work. + + 4. Evaluations about the quality of a message, from simple token + matching (e.g., a list of preferred DNS domains) to cryptanalysis + (e.g., public/private key work), are at least a little bit + expensive and thus should be minimized. To that end, performing + those tests at the border MTA is far preferred to doing that work + at each MUA that handles a message. If an ADMD's environment + adheres to common messaging protocols, a reputation query or an + authentication check performed by a border MTA would return the + same result as the same query performed by an MUA. By contrast, + in an environment where the MUA does the work, a message arriving + for multiple recipients would thus cause authentication or + reputation evaluation to be done more than once for the same + message (i.e., at each MUA) causing needless amplification of + resource use and creating a possible denial-of-service attack + vector. + + + + + +Kucherawy Standards Track [Page 41] + +RFC 5451 Authentication-Results Header Field April 2009 + + + 5. Minimizing change is good. As new authentication and reputation + methods emerge, the list of methods supported by this header + field would presumably be extended. If MUAs simply consume the + contents of this header field rather than actually attempting to + do authentication and/or reputation work, then MUAs only need to + learn to parse this header field once; emergence of new methods + requires only a configuration change at the MUAs and software + changes at the MTAs (which are presumably fewer in number). When + choosing to implement these functions in MTAs vs MUAs, the issues + of individual flexibility, infrastructure inertia and scale of + effort must be considered. It is typically easier to change a + single MUA than an MTA because the modification affects fewer + users and can be pursued with less care. However, changing many + MUAs is more effort than changing a smaller number of MTAs. + + 6. For decisions affecting message delivery and display, assessment + based on authentication and reputation is best performed close to + the time of message transit, as a message makes its journey + toward a user's inbox, not afterwards. DKIM keys and IP address + reputations, etc., can change over time or even become invalid, + and users can take a long time to read a message once delivered. + The value of this work thus degrades, perhaps quickly, once the + delivery process has completed. This seriously diminishes the + value of this work when done other than at MTAs. + + Many operational choices are possible within an ADMD, including the + venue for performing authentication and/or reputation assessment. + The current specification does not dictate any of those choices. + Rather, it facilitates those cases in which information produced by + one stage of analysis needs to be transported with the message to the + next stage. + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 42] + +RFC 5451 Authentication-Results Header Field April 2009 + + +Acknowledgements + + The author wishes to acknowledge the following for their review and + constructive criticism of this proposal: Eric Allman, Mark Delany, + Victor Duchovni, Frank Ellermann, Jim Fenton, Philip Guenther, Tony + Hansen, Paul Hoffman, Scott Kitterman, Eliot Lear, John Levine, Miles + Libbey, Charles Lindsey, Alexey Melnikov, Douglas Otis, Juan Altmayer + Pizzorno, Michael Thomas, and Kazu Yamamoto. + + Special thanks to Dave Crocker and S. Moonesamy for their logistical + support, and feedback on and contributions to the numerous proposed + edits throughout the lifetime of this work. + +Author's Address + + Murray S. Kucherawy + Sendmail, Inc. + 6475 Christie Ave., Suite 350 + Emeryville, CA 94608 + US + + Phone: +1 510 594 5400 + EMail: msk+ietf@sendmail.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 43] + diff --git a/rfc/rfc6577.txt b/rfc/rfc6577.txt new file mode 100644 index 0000000000..2c39c84da4 --- /dev/null +++ b/rfc/rfc6577.txt @@ -0,0 +1,283 @@ + + + + + + +Internet Engineering Task Force (IETF) M. Kucherawy +Request for Comments: 6577 Cloudmark, Inc. +Updates: 5451 March 2012 +Category: Standards Track +ISSN: 2070-1721 + + + Authentication-Results Registration Update for + Sender Policy Framework (SPF) Results + +Abstract + + This memo updates the registry of authentication method results in + Authentication-Results: message header fields, correcting a + discontinuity between the original registry creation and the Sender + Policy Framework (SPF) specification. + + This memo updates RFC 5451. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc6577. + +Copyright Notice + + Copyright (c) 2012 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + + +Kucherawy Standards Track [Page 1] + +RFC 6577 Auth-Results SPF Erratum March 2012 + + +Table of Contents + + 1. Introduction ....................................................2 + 2. Keywords ........................................................2 + 3. New 'fail' Definition ...........................................2 + 4. IANA Considerations .............................................2 + 4.1. Addition of 'Status' Columns ...............................3 + 4.2. Update to Result Names .....................................3 + 5. Security Considerations .........................................3 + 6. References ......................................................4 + 6.1. Normative References .......................................4 + 6.2. Informative References .....................................4 + Appendix A. Examples in RFC 5451 ...................................5 + Appendix B. Acknowledgements .......................................5 + +1. Introduction + + [AUTHRES] defined a new header field for electronic mail messages + that presents the results of a message authentication effort in a + machine-readable format. That Request for Comments created a + registry of results for a few message authentication mechanisms, one + of which was the Sender Policy Framework [SPF]. The registry + contains one entry that is inconsistent with the latter + specification, which was noted in an erratum [ERR2617] filed with the + RFC Editor. This memo updates the IANA registries accordingly. + +2. Keywords + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [KEYWORDS]. + +3. New 'fail' Definition + + The new "fail" result, replacing the existing "hardfail" result for + [SPF] (and thus also for [SENDER-ID]) has the same definition for + "hardfail" that was used in Section 2.4.2 of [AUTHRES], namely: + + This client is explicitly not authorized to inject or relay mail + using the sender's DNS domain. + +4. IANA Considerations + + This section enumerates requested actions of IANA, per [IANA]. + + + + + + + +Kucherawy Standards Track [Page 2] + +RFC 6577 Auth-Results SPF Erratum March 2012 + + +4.1. Addition of 'Status' Columns + + IANA has amended the Email Authentication Methods and Email + Authentication Result Names registries, both in the Email + Authentication Parameters group, by adding to each a column called + "Status" that will indicate for each entry its current status. Legal + values for these columns are as follows: + + active: The entry is in current use. + + deprecated: The entry is no longer in current use. + + New registrations to either table MUST specify one of these values. + + All existing entries, except as specified below, are to be noted as + "active" as of publication of this memo. + +4.2. Update to Result Names + + [AUTHRES] listed "hardfail" as the result to be used when a message + fails an [SPF] evaluation. However, this latter specification used + the string "fail" to denote such failures. + + Therefore, IANA has marked "hardfail" in the Email Authentication + Result Names registry as "deprecated" and amended the "fail" entry as + follows: + + Code: fail + + Defined: [AUTHRES] + + Auth Method: spf, sender-id + + Meaning: [this memo] Section 3 + + Status: active + +5. Security Considerations + + This memo corrects a registry error. It is possible that older + implementations will not recognize or use the corrected entry. Thus, + implementers are advised to support both result strings for some + period of time. However, it is known that some implementations are + already using the SPF-defined result string. + + + + + + + +Kucherawy Standards Track [Page 3] + +RFC 6577 Auth-Results SPF Erratum March 2012 + + +6. References + +6.1. Normative References + + [AUTHRES] Kucherawy, M., "Message Header Field for Indicating + Message Authentication Status", RFC 5451, April 2009. + + [ERR2617] "RFC Errata", Errata ID 2617, RFC 5451, + . + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + +6.2. Informative References + + [ERR2818] "RFC Errata", Errata ID 2818, RFC 5451, + . + + [IANA] Narten, T. and H. Alvestrand, "Guidelines for Writing an + IANA Considerations Section in RFCs", BCP 26, RFC 5226, + May 2008. + + [SENDER-ID] Lyon, J. and M. Wong, "Sender ID: Authenticating + E-Mail", RFC 4406, April 2006. + + [SPF] Wong, M. and W. Schlitt, "Sender Policy Framework (SPF) + for Authorizing Use of Domains in E-Mail, Version 1", + RFC 4408, April 2006. + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 4] + +RFC 6577 Auth-Results SPF Erratum March 2012 + + +Appendix A. Examples in RFC 5451 + + It should be noted that this update also applies to the examples in + [AUTHRES], specifically the one in Appendix B.5. The error there + [ERR2818] is not corrected by this update, which only deals with the + normative portions of that specification and the related IANA + registrations. However, it is assumed one could easily see what + needs to be corrected there. + + Corrected examples will be included in a full update to [AUTHRES] at + some future time. + +Appendix B. Acknowledgements + + The author wishes to acknowledge the following for their review and + constructive criticism of this proposal: S. Moonesamy, Scott + Kitterman. + +Author's Address + + Murray S. Kucherawy + Cloudmark, Inc. + 128 King St., 2nd Floor + San Francisco, CA 94107 + US + + Phone: +1 415 946 3800 + EMail: msk@cloudmark.com + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 5] + diff --git a/rfc/rfc7001.txt b/rfc/rfc7001.txt new file mode 100644 index 0000000000..522f8fff03 --- /dev/null +++ b/rfc/rfc7001.txt @@ -0,0 +1,2411 @@ + + + + + + +Internet Engineering Task Force (IETF) M. Kucherawy +Request for Comments: 7001 September 2013 +Obsoletes: 5451, 6577 +Category: Standards Track +ISSN: 2070-1721 + + + Message Header Field for Indicating Message Authentication Status + +Abstract + + This document specifies a message header field called Authentication- + Results for use with electronic mail messages to indicate the results + of message authentication efforts. Any receiver-side software, such + as mail filters or Mail User Agents (MUAs), can use this header field + to relay that information in a convenient and meaningful way to users + or to make sorting and filtering decisions. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc7001. + +Copyright Notice + + Copyright (c) 2013 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + + + +Kucherawy Standards Track [Page 1] + +RFC 7001 Authentication-Results Header Field September 2013 + + +Table of Contents + + 1. Introduction ....................................................3 + 1.1. Purpose ....................................................4 + 1.2. Trust Boundary .............................................5 + 1.3. Processing Scope ...........................................6 + 1.4. Requirements ...............................................6 + 1.5. Definitions ................................................6 + 1.5.1. Key Words ...........................................6 + 1.5.2. Security ............................................6 + 1.5.3. Email Architecture ..................................7 + 1.5.4. Other Terms .........................................8 + 1.6. Trust Environment ..........................................8 + 2. Definition and Format of the Header Field .......................9 + 2.1. General Description ........................................9 + 2.2. Formal Definition ..........................................9 + 2.3. The "policy" ptype ........................................12 + 2.4. Authentication Identifier Field ...........................13 + 2.5. Version Tokens ............................................14 + 2.6. Defined Methods and Result Values .........................14 + 2.6.1. DKIM and DomainKeys ................................14 + 2.6.2. SPF and Sender ID ..................................15 + 2.6.3. "iprev" ............................................17 + 2.6.4. SMTP AUTH ..........................................17 + 2.6.5. Other Registered Codes .............................18 + 2.6.6. Extension Methods ..................................18 + 2.6.7. Extension Result Codes .............................19 + 3. The "iprev" Authentication Method ..............................19 + 4. Adding the Header Field to a Message ...........................20 + 4.1. Header Field Position and Interpretation ..................22 + 4.2. Local Policy Enforcement ..................................23 + 5. Removing Existing Header Fields ................................23 + 6. IANA Considerations ............................................24 + 6.1. The Authentication-Results Header Field ...................25 + 6.2. "Email Authentication Methods" Registry ...................25 + 6.3. "Email Authentication Result Names" Registry ..............26 + 7. Security Considerations ........................................26 + 7.1. Forged Header Fields ......................................26 + 7.2. Misleading Results ........................................28 + 7.3. Header Field Position .....................................28 + 7.4. Reverse IP Query Denial-of-Service Attacks ................28 + 7.5. Mitigation of Backscatter .................................29 + 7.6. Internal MTA Lists ........................................29 + 7.7. Attacks against Authentication Methods ....................29 + 7.8. Intentionally Malformed Header Fields .....................29 + 7.9. Compromised Internal Hosts ................................29 + 7.10. Encapsulated Instances ...................................30 + 7.11. Reverse Mapping ..........................................30 + + + +Kucherawy Standards Track [Page 2] + +RFC 7001 Authentication-Results Header Field September 2013 + + + 8. References .....................................................30 + 8.1. Normative References ......................................30 + 8.2. Informative References ....................................31 + Appendix A. Acknowledgements .....................................33 + Appendix B. Legacy MUAs ..........................................33 + Appendix C. Authentication-Results Examples ......................33 + C.1. Trivial Case; Header Field Not Present ....................34 + C.2. Nearly Trivial Case; Service Provided, but No + Authentication Done .......................................34 + C.3. Service Provided, Authentication Done .....................35 + C.4. Service Provided, Several Authentications Done, Single + MTA .......................................................36 + C.5. Service Provided, Several Authentications Done, + Different MTAs ............................................37 + C.6. Service Provided, Multi-Tiered Authentication Done ........38 + C.7. Comment-Heavy Example .....................................40 + Appendix D. Operational Considerations about Message + Authentication .......................................40 + Appendix E. Changes since RFC 5451 ...............................42 + +1. Introduction + + This document describes a header field called Authentication-Results + for electronic mail messages that presents the results of a message + authentication effort in a machine-readable format. The intent of + the header field is to create a place to collect such data when + message authentication mechanisms are in use so that a Mail User + Agent (MUA) and downstream filters can make filtering decisions + and/or provide a recommendation to the user as to the validity of the + message's origin and possibly the safety and integrity of its + content. + + This document revises the original definition found in [RFC5451] + based upon various authentication protocols in current use and + incorporates errata logged since the publication of the original + specification. + + End users are not expected to be direct consumers of this header + field. This header field is intended for consumption by programs + that will then use such data or render it in a human-usable form. + + This document specifies the format of this header field and discusses + the implications of its presence or absence. However, it does not + discuss how the data contained in the header field ought to be used, + such as what filtering decisions are appropriate or how an MUA might + render those results, as these are local policy and/or user interface + design questions that are not appropriate for this document. + + + + +Kucherawy Standards Track [Page 3] + +RFC 7001 Authentication-Results Header Field September 2013 + + + At the time of publication of this document, the following are + published, domain-level email authentication methods in common use: + + o Author Domain Signing Practices ([ADSP]) + + o SMTP Service Extension for Authentication ([AUTH]) + + o DomainKeys Identified Mail Signatures ([DKIM]) + + o Sender Policy Framework ([SPF]) + + o Vouch By Reference ([VBR]) + + o reverse IP address name validation ("iprev", defined in Section 3) + + In addition, the following are non-standard methods recognized by + this specification that are no longer common: + + o DomainKeys ([DOMAINKEYS]) (Historic) + + o Sender ID ([SENDERID]) (Experimental) + + This specification is not intended to be restricted to domain-based + authentication schemes, but the existing schemes in that family have + proven to be a good starting point for implementations. The goal is + to give current and future authentication schemes a common framework + within which to deliver their results to downstream agents and + discourage the creation of unique header fields for each. + + Although SPF defined a header field called "Received-SPF" and the + historic DomainKeys defined one called "DomainKey-Status" for this + purpose, those header fields are specific to the conveyance of their + respective results only and thus are insufficient to satisfy the + requirements enumerated below. In addition, many SPF implementations + have adopted the header field specified here at least as an option, + and DomainKeys has been obsoleted by DKIM. + +1.1. Purpose + + The header field defined in this document is expected to serve + several purposes: + + 1. Convey the results of various message authentication checks, + which are applied by upstream filters and Mail Transfer Agents + (MTAs) and then passed to MUAs and downstream filters within the + same "trust domain". Such agents might wish to render those + results to end users or to use those data to apply more or less + stringent content checks based on authentication results; + + + +Kucherawy Standards Track [Page 4] + +RFC 7001 Authentication-Results Header Field September 2013 + + + 2. Provide a common location within a message for this data; + + 3. Create an extensible framework for reporting new authentication + methods as they emerge. + + In particular, the mere presence of this header field does not mean + its contents are valid. Rather, the header field is reporting + assertions made by one or more authentication schemes (supposedly) + applied somewhere upstream. For an MUA or downstream filter to treat + the assertions as actually valid, there must be an assessment of the + trust relationship among such agents, the validating MTA, and the + mechanism for conveying the information. + +1.2. Trust Boundary + + This document makes several references to the "trust boundary" of an + administrative management domain (ADMD). Given the diversity among + existing mail environments, a precise definition of this term isn't + possible. + + Simply put, a transfer from the producer of the header field to the + consumer must occur within a context that permits the consumer to + treat assertions by the producer as being reliable and accurate + (trustworthy). How this trust is obtained is outside the scope of + this document. It is entirely a local matter. + + Thus, this document defines a "trust boundary" as the delineation + between "external" and "internal" entities. Services that are + internal -- within the trust boundary -- are provided by the ADMD's + infrastructure for its users. Those that are external are outside of + the authority of the ADMD. By this definition, hosts that are within + a trust boundary are subject to the ADMD's authority and policies, + independent of their physical placement or their physical operation. + For example, a host within a trust boundary might actually be + operated by a remote service provider and reside physically within + its data center. + + It is possible for a message to be evaluated inside a trust boundary + but then depart and re-enter the trust boundary. An example might be + a forwarded message such as a message/rfc822 attachment (see + Multipurpose Internet Mail Extensions [MIME]) or one that is part of + a multipart/digest. The details reported by this field cannot be + trusted in that case. Thus, this field found within one of those + media types is typically ignored. + + + + + + + +Kucherawy Standards Track [Page 5] + +RFC 7001 Authentication-Results Header Field September 2013 + + +1.3. Processing Scope + + The content of this header field is meant to convey to message + consumers that authentication work on the message was already done + within its trust boundary, and those results are being presented. It + is not intended to provide message parameters to consumers so that + they can perform authentication protocols on their own. + +1.4. Requirements + + This document establishes no new requirements on existing protocols + or servers. + + In particular, this document establishes no requirement on MTAs to + reject or filter arriving messages that do not pass authentication + checks. The data conveyed by the specified header field's contents + are for the information of MUAs and filters and are to be used at + their discretion. + +1.5. Definitions + + This section defines various terms used throughout this document. + +1.5.1. Key Words + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [KEYWORDS]. + +1.5.2. Security + + "Guidelines for Writing RFC Text on Security Considerations" + ([SECURITY]) discusses authentication and authorization and the + conflation of the two concepts. The use of those terms within the + context of recent message security work has given rise to slightly + different definitions, and this document reflects those current + usages, as follows: + + o "Authorization" is the establishment of permission to use a + resource or represent an identity. In this context, authorization + indicates that a message from a particular ADMD arrived via a + route the ADMD has explicitly approved. + + o "Authentication" is the assertion of validity of a piece of data + about a message (such as the sender's identity) or the message in + its entirety. + + + + + +Kucherawy Standards Track [Page 6] + +RFC 7001 Authentication-Results Header Field September 2013 + + + As examples: SPF and Sender ID are authorization mechanisms in that + they express a result that shows whether or not the ADMD that + apparently sent the message has explicitly authorized the connecting + Simple Mail Transfer Protocol ([SMTP]) client to relay messages on + its behalf, but they do not actually validate any other property of + the message itself. By contrast, DKIM is agnostic as to the routing + of a message but uses cryptographic signatures to authenticate + agents, assign (some) responsibility for the message (which implies + authorization), and ensure that the listed portions of the message + were not modified in transit. Since the signatures are not tied to + SMTP connections, they can be added by either the ADMD of origin, + intermediate ADMDs (such as a mailing list server), other handling + agents, or any combination. + + Rather than create a separate header field for each class of + solution, this proposal groups them both into a single header field. + +1.5.3. Email Architecture + + o A "border MTA" is an MTA that acts as a gateway between the + general Internet and the users within an organizational boundary. + (See also Section 1.2.) + + o A "delivery MTA" (or Mail Delivery Agent or MDA) is an MTA that + actually enacts delivery of a message to a user's inbox or other + final delivery. + + o An "intermediate MTA" is any MTA that is not a delivery MTA and is + also not the first MTA to handle the message. + + The following diagram illustrates the flow of mail among these + defined components. See Internet Mail Architecture [EMAIL-ARCH] for + further discussion on general email system architecture, which + includes detailed descriptions of these components, and Appendix D of + this document for discussion about the common aspects of email + authentication in current environments. + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 7] + +RFC 7001 Authentication-Results Header Field September 2013 + + + +-----+ +-----+ +------------+ + | MUA |-->| MSA |-->| Border MTA | + +-----+ +-----+ +------------+ + | + | + V + +----------+ + | Internet | + +----------+ + | + | + V + +-----+ +-----+ +------------------+ +------------+ + | MUA |<--| MDA |<--| Intermediate MTA |<--| Border MTA | + +-----+ +-----+ +------------------+ +------------+ + + Generally, it is assumed that the work of applying message + authentication schemes takes place at a border MTA or a delivery MTA. + This specification is written with that assumption in mind. However, + there are some sites at which the entire mail infrastructure consists + of a single host. In such cases, such terms as "border MTA" and + "delivery MTA" might well apply to the same machine or even the very + same agent. It is also possible that some message authentication + tests could take place on an intermediate MTA. Although this + document doesn't specifically describe such cases, they are not meant + to be excluded. + +1.5.4. Other Terms + + In this document, the term "producer" refers to any component that + adds this header field to messages it is handling, and "consumer" + refers to any component that identifies, extracts, and parses the + header field to use as part of a handling decision. + +1.6. Trust Environment + + This header field permits one or more message validation mechanisms + to communicate output to one or more separate assessment mechanisms. + These mechanisms operate within a unified trust boundary that defines + an Administrative Management Domain (ADMD). An ADMD contains one or + more entities that perform validation and generate the header field + and one or more that consume it for some type of assessment. The + field often contains no integrity or validation mechanism of its own, + so its presence must be trusted implicitly. Hence, valid use of the + header field requires removing any occurrences of it that are present + when the message enters the ADMD. This ensures that later + occurrences have been added within the trust boundary of the ADMD. + + + + +Kucherawy Standards Track [Page 8] + +RFC 7001 Authentication-Results Header Field September 2013 + + + The authserv-id token defined in Section 2.2 can be used to reference + an entire ADMD or a specific validation engine within an ADMD. + Although the labeling scheme is left as an operational choice, some + guidance for selecting a token is provided in later sections of this + document. + +2. Definition and Format of the Header Field + + This section gives a general overview of the format of the header + field being defined and then provides more formal specification. + +2.1. General Description + + The header field specified here is called Authentication-Results. It + is a Structured Header Field as defined in Internet Message Format + ([MAIL]), and thus all of the related definitions in that document + apply. + + This header field is added at the top of the message as it transits + MTAs that do authentication checks, so some idea of how far away the + checks were done can be inferred. It is therefore considered to be a + trace field as defined in [MAIL], and thus all of the related + definitions in that document apply. + + The value of the header field (after removing comments) consists of + an authentication identifier, an optional version, and then a series + of statements and supporting data. The statements are of the form + "method=result" and indicate which authentication method(s) were + applied and their respective results. For each such statement, the + supporting data can include a "reason" string and one or more + "property=value" statements indicating which message properties were + evaluated to reach that conclusion. + + The header field can appear more than once in a single message, more + than one result can be represented in a single header field, or a + combination of these can be applied. + +2.2. Formal Definition + + Formally, the header field is specified as follows using Augmented + Backus-Naur Form ([ABNF]): + + authres-header = "Authentication-Results:" [CFWS] authserv-id + [ CFWS authres-version ] + ( no-result / 1*resinfo ) [CFWS] CRLF + + authserv-id = value + ; see below for a description of this element + + + +Kucherawy Standards Track [Page 9] + +RFC 7001 Authentication-Results Header Field September 2013 + + + authres-version = 1*DIGIT [CFWS] + ; indicates which version of this specification is in use; + ; this specification is version "1", and the absence of a + ; version implies this version of the specification + + no-result = [CFWS] ";" [CFWS] "none" + ; the special case of "none" is used to indicate that no + ; message authentication was performed + + resinfo = [CFWS] ";" methodspec [ CFWS reasonspec ] + *( CFWS propspec ) + + methodspec = [CFWS] method [CFWS] "=" [CFWS] result + ; indicates which authentication method was evaluated + ; and what its output was + + reasonspec = "reason" [CFWS] "=" [CFWS] value + ; a free-form comment on the reason the given result + ; was returned + + propspec = ptype [CFWS] "." [CFWS] property [CFWS] "=" pvalue + ; an indication of which properties of the message + ; were evaluated by the authentication scheme being + ; applied to yield the reported result + + method = Keyword [ [CFWS] "/" [CFWS] method-version ] + ; a method indicates which method's result is + ; represented by "result", and is one of the methods + ; explicitly defined as valid in this document + ; or is an extension method as defined below + + method-version = 1*DIGIT [CFWS] + ; indicates which version of the method specification is + ; in use, corresponding to the matching entry in the IANA + ; "Email Authentication Methods" registry; a value of "1" + ; is assumed if this version string is absent + + result = Keyword + ; indicates the results of the attempt to authenticate + ; the message; see below for details + + ptype = "smtp" / "header" / "body" / "policy" + ; indicates whether the property being evaluated was + ; a parameter to an [SMTP] command, was a value taken + ; from a message header field, was some property of + ; the message body, or was some other property evaluated by + ; the receiving MTA + + + + +Kucherawy Standards Track [Page 10] + +RFC 7001 Authentication-Results Header Field September 2013 + + + property = special-smtp-verb / Keyword + ; if "ptype" is "smtp", this indicates which [SMTP] + ; command provided the value that was evaluated by the + ; authentication scheme being applied; if "ptype" is + ; "header", this indicates from which header field the + ; value being evaluated was extracted; if "ptype" is + ; "body", this indicates where in the message body + ; a value being evaluated can be found (e.g., a specific + ; offset into the message or a reference to a MIME part); + ; if "ptype" is "policy", then this indicates the name + ; of the policy that caused this header field to be + ; added (see below) + + special-smtp-verb = "mailfrom" / "rcptto" + ; special cases of [SMTP] commands that are made up + ; of multiple words + + pvalue = [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) + [CFWS] + ; the value extracted from the message property defined + ; by the "ptype.property" construction + + "local-part" is defined in Section 3.4.1 of [MAIL], and "CFWS" is + defined in Section 3.2.2 of [MAIL]. + + "Keyword" is defined in Section 4.1.2 of [SMTP]. + + The "value" is as defined in Section 5.1 of [MIME]. + + The "domain-name" is as defined in Section 3.5 of [DKIM]. + + The "Keyword" used in "result" above is further constrained by the + necessity of being enumerated in Section 2.6. + + See Section 2.4 for a description of the authserv-id element. + + If the value portion of a "pvalue" construction identifies something + intended to be an e-mail identity, then it MUST use the right hand + portion of that ABNF definition. + + The list of commands eligible for use with the "smtp" ptype can be + found in Section 4.1 of [SMTP]. + + The "propspec" may be omitted if, for example, the method was unable + to extract any properties to do its evaluation yet has a result to + report. + + + + + +Kucherawy Standards Track [Page 11] + +RFC 7001 Authentication-Results Header Field September 2013 + + + Where an SMTP command name is being reported as a "property", the + agent generating the header field represents that command by + converting it to lowercase and dropping any spaces (e.g., "MAIL FROM" + becomes "mailfrom", "RCPT TO" becomes "rcptto", etc.). + + A "ptype" value of "policy" indicates a policy decision about the + message not specific to a property of the message that could be + extracted. See Section 2.3 for details. + + Examples of complete messages using this header field can be found in + Appendix C. + +2.3. The "policy" ptype + + A special ptype value of "policy" is defined. This ptype is provided + to indicate that some local policy mechanism was applied that + augments or even replaces (i.e., overrides) the result returned by + the authentication mechanism. The property and value in this case + identify the local policy that was applied and the result it + returned. + + For example, a DKIM signature is not required to include the Subject + header field in the set of fields that are signed. An ADMD receiving + such a message might decide that such a signature is unacceptable, + even if it passes, because the content of the Subject header field + could be altered post-signing without invalidating the signature. + Such an ADMD could replace the DKIM "pass" result with a "policy" + result and then also include the following in the corresponding + Authentication-Result field: + + ... dkim=fail policy.dkim-rules=unsigned-subject ... + + In this case, the property is "dkim-rules", indicating some local + check by that name took place and that check returned a result of + "unsigned-subject". These are arbitrary names selected by (and + presumably used within) the ADMD making use of them, so they are not + normally registered with IANA or otherwise specified apart from + setting syntax restrictions that allow for easy parsing within the + rest of the header field. + + This ptype existed in the original specification for this header + field, but without a complete description or example of intended use. + As a result, it has not seen any practical use to date that matches + its intended purpose. These added details are provided to guide + implementers toward proper use. + + + + + + +Kucherawy Standards Track [Page 12] + +RFC 7001 Authentication-Results Header Field September 2013 + + +2.4. Authentication Identifier Field + + Every Authentication-Results header field has an authentication + service identifier field (authserv-id above). Specifically, this is + any string intended to identify the authentication service within the + ADMD that conducted authentication checks on the message. This + identifier is intended to be machine-readable and not necessarily + meaningful to users. + + Since agents consuming this field will use this identifier to + determine whether its contents are of interest (and are safe to use), + the uniqueness of the identifier MUST be guaranteed by the ADMD that + generates it and MUST pertain to that ADMD. MUAs or downstream + filters SHOULD use this identifier to determine whether or not the + data contained in an Authentication-Results header field ought to be + used or ignored. + + For simplicity and scalability, the authentication service identifier + SHOULD be a common token used throughout the ADMD. Common practice + is to use the DNS domain name used by or within that ADMD, sometimes + called the "organizational domain", but this is not strictly + necessary. + + For tracing and debugging purposes, the authentication identifier can + instead be the specific hostname of the MTA performing the + authentication check whose result is being reported. Moreover, some + implementations define a substructure to the identifier; these are + outside of the scope of this specification. + + Note, however, that using a local, relative identifier like a flat + hostname, rather than a hierarchical and globally unique ADMD + identifier like a DNS domain name, makes configuration more difficult + for large sites. The hierarchical identifier permits aggregating + related, trusted systems together under a single, parent identifier, + which in turn permits assessing the trust relationship with a single + reference. The alternative is a flat namespace requiring + individually listing each trusted system. Since consumers will use + the identifier to determine whether to use the contents of the header + field: + + o Changes to the identifier impose a large, centralized + administrative burden. + + o Ongoing administrative changes require constantly updating this + centralized table, making it difficult to ensure that an MUA or + downstream filter will have access to accurate information for + assessing the usability of the header field's content. In + particular, consumers of the header field will need to know not + + + +Kucherawy Standards Track [Page 13] + +RFC 7001 Authentication-Results Header Field September 2013 + + + only the current identifier(s) in use but previous ones as well to + account for delivery latency or later re-assessment of the header + field's contents. + + Examples of valid authentication identifiers are "example.com", + "mail.example.org", "ms1.newyork.example.com", and "example-auth". + +2.5. Version Tokens + + The grammar above provides for the optional inclusion of versions on + both the header field itself (attached to the authserv-id token) and + on each of the methods being reported. The method version refers to + the method itself, which is specified in the documents describing + those methods, while the authserv-id version refers to this document + and thus the syntax of this header field. + + The purpose of including these is to avoid misinterpretation of the + results. That is, if a parser finds a version after an authserv-id + that it does not explicitly know, it can immediately discontinue + trying to parse since what follows might not be in an expected + format. For a method version, the parser SHOULD ignore a method + result if the version is not supported in case the semantics of the + result have a different meaning than what is expected. For example, + if a hypothetical DKIM version 2 yielded a "pass" result for + different reasons than version 1 does, a consumer of this field might + not want to use the altered semantics. Allowing versions in the + syntax is a way to indicate this and let the consumer of the header + field decide. + +2.6. Defined Methods and Result Values + + Each individual authentication method returns one of a set of + specific result values. The subsections below provide references to + the documents defining the authentication methods specifically + supported by this document, and their corresponding result values. + Verifiers SHOULD use these values as described below. New methods + not specified in this document, but intended to be supported by the + header field defined here, MUST include a similar result table either + in their defining documents or in supplementary ones. + +2.6.1. DKIM and DomainKeys + + DKIM is represented by the "dkim" method and is defined in [DKIM]. + DomainKeys is defined in [DOMAINKEYS] and is represented by the + "domainkeys" method. + + + + + + +Kucherawy Standards Track [Page 14] + +RFC 7001 Authentication-Results Header Field September 2013 + + + A signature is "acceptable to the ADMD" if it passes local policy + checks (or there are no specific local policy checks). For example, + an ADMD policy might require that the signature(s) on the message be + added using the DNS domain present in the From header field of the + message, thus making third-party signatures unacceptable even if they + verify. + + Both DKIM and DomainKeys use the same result set, as follows: + + none: The message was not signed. + + pass: The message was signed, the signature or signatures were + acceptable to the ADMD, and the signature(s) passed verification + tests. + + fail: The message was signed and the signature or signatures were + acceptable to the ADMD, but they failed the verification test(s). + + policy: The message was signed, but some aspect of the signature or + signatures was not acceptable to the ADMD. + + neutral: The message was signed, but the signature or signatures + contained syntax errors or were not otherwise able to be + processed. This result is also used for other failures not + covered elsewhere in this list. + + temperror: The message could not be verified due to some error that + is likely transient in nature, such as a temporary inability to + retrieve a public key. A later attempt may produce a final + result. + + permerror: The message could not be verified due to some error that + is unrecoverable, such as a required header field being absent. A + later attempt is unlikely to produce a final result. + + [DKIM] advises that if a message fails verification, it is to be + treated as an unsigned message. A report of "fail" here permits the + receiver of the report to decide how to handle the failure. A report + of "neutral" or "none" preempts that choice, ensuring the message + will be treated as if it had not been signed. + +2.6.2. SPF and Sender ID + + SPF and Sender ID use the "spf" and "sender-id" method names, + respectively. The result values for SPF are defined in Section 2.5 + of [SPF], and those definitions are included here by reference: + + + + + +Kucherawy Standards Track [Page 15] + +RFC 7001 Authentication-Results Header Field September 2013 + + + +-----------+----------------------------+ + | Code | Meaning | + +-----------+----------------------------+ + | none | [SPF], Section 2.5.1 | + +-----------+----------------------------+ + | pass | [SPF], Section 2.5.3 | + +-----------+----------------------------+ + | fail | [SPF], Section 2.5.4 | + +-----------+----------------------------+ + | softfail | [SPF], Section 2.5.5 | + +-----------+----------------------------+ + | policy | [RFC7001], Section 2.6.2 | + +-----------+----------------------------+ + | neutral | [SPF], Section 2.5.2 | + +-----------+----------------------------+ + | temperror | [SPF], Section 2.5.6 | + +-----------+----------------------------+ + | permerror | [SPF], Section 2.5.7 | + +-----------+----------------------------+ + + These result codes are used in the context of this specification to + reflect the result returned by the component conducting SPF + evaluation. + + Similarly, the results for Sender ID are listed and described in + Section 4.2 of [SENDERID], which in turn uses the SPF definitions. + + Note that both of those documents specify result codes that use mixed + case, but they are typically used all lowercase in this context. + + In both cases, an additional result of "policy" is defined, which + means the client was authorized to inject or relay mail on behalf of + the sender's DNS domain according to the authentication method's + algorithm, but local policy dictates that the result is unacceptable. + For example, "policy" might be used if SPF returns a "pass" result, + but a local policy check matches the sending DNS domain to one found + in an explicit list of unacceptable DNS domains (e.g., spammers). + + If the retrieved sender policies used to evaluate SPF and Sender ID + do not contain explicit provisions for authenticating the local-part + (see Section 3.4.1 of [MAIL]) of an address, the "pvalue" reported + along with results for these mechanisms SHOULD NOT include the local- + part. + + + + + + + + +Kucherawy Standards Track [Page 16] + +RFC 7001 Authentication-Results Header Field September 2013 + + +2.6.3. "iprev" + + The result values used by the "iprev" method, defined in Section 3, + are as follows: + + pass: The DNS evaluation succeeded, i.e., the "reverse" and + "forward" lookup results were returned and were in agreement. + + fail: The DNS evaluation failed. In particular, the "reverse" and + "forward" lookups each produced results, but they were not in + agreement, or the "forward" query completed but produced no + result, e.g., a DNS RCODE of 3, commonly known as NXDOMAIN, or an + RCODE of 0 (NOERROR) in a reply containing no answers, was + returned. + + temperror: The DNS evaluation could not be completed due to some + error that is likely transient in nature, such as a temporary DNS + error, e.g., a DNS RCODE of 2, commonly known as SERVFAIL, or + other error condition resulted. A later attempt may produce a + final result. + + permerror: The DNS evaluation could not be completed because no PTR + data are published for the connecting IP address, e.g., a DNS + RCODE of 3, commonly known as NXDOMAIN, or an RCODE of 0 (NOERROR) + in a reply containing no answers, was returned. This prevented + completion of the evaluation. A later attempt is unlikely to + produce a final result. + + There is no "none" for this method since any TCP connection + delivering email has an IP address associated with it, so some kind + of evaluation will always be possible. + + For discussion of the format of DNS replies, see "Domain Names - + Implementation and Specification" ([DNS]). + +2.6.4. SMTP AUTH + + SMTP AUTH (defined in [AUTH]) is represented by the "auth" method, + and its result values are as follows: + + none: SMTP authentication was not attempted. + + pass: The SMTP client authenticated to the server reporting the + result using the protocol described in [AUTH]. + + + + + + + +Kucherawy Standards Track [Page 17] + +RFC 7001 Authentication-Results Header Field September 2013 + + + fail: The SMTP client attempted to authenticate to the server using + the protocol described in [AUTH] but was not successful, yet + continued to send the message about which a result is being + reported. + + temperror: The SMTP client attempted to authenticate using the + protocol described in [AUTH] but was not able to complete the + attempt due to some error that is likely transient in nature, such + as a temporary directory service lookup error. A later attempt + may produce a final result. + + permerror: The SMTP client attempted to authenticate using the + protocol described in [AUTH] but was not able to complete the + attempt due to some error that is likely not transient in nature, + such as a permanent directory service lookup error. A later + attempt is not likely to produce a final result. + + An agent making use of the data provided by this header field SHOULD + consider "fail" and "temperror" to be synonymous in terms of message + authentication, i.e., the client did not authenticate in either case. + +2.6.5. Other Registered Codes + + Result codes were also registered in other RFCs for Vouch By + Reference (in [AR-VBR], represented by "vbr"), Authorized Third-Party + Signatures (in [ATPS], represented by "dkim-atps"), and the DKIM- + related Author Domain Signing Practices (in [ADSP], represented by + "dkim-adsp"). + +2.6.6. Extension Methods + + Additional authentication method identifiers (extension methods) may + be defined in the future by later revisions or extensions to this + specification. These method identifiers are registered with the + Internet Assigned Numbers Authority (IANA) and, preferably, published + in an RFC. See Section 6 for further details. + + Extension methods can be defined for the following reasons: + + 1. To allow additional information from new authentication systems + to be communicated to MUAs or downstream filters. The names of + such identifiers ought to reflect the name of the method being + defined but ought not be needlessly long. + + 2. To allow the creation of "sub-identifiers" that indicate + different levels of authentication and differentiate between + their relative strengths, e.g., "auth1-weak" and "auth1-strong". + + + + +Kucherawy Standards Track [Page 18] + +RFC 7001 Authentication-Results Header Field September 2013 + + + Authentication method implementers are encouraged to provide adequate + information, via message header field comments if necessary, to allow + an MUA developer to understand or relay ancillary details of + authentication results. For example, if it might be of interest to + relay what data was used to perform an evaluation, such information + could be relayed as a comment in the header field, such as: + + Authentication-Results: example.com; + foo=pass bar.baz=blob (2 of 3 tests OK) + + Experimental method identifiers MUST only be used within ADMDs that + have explicitly consented to use them. These method identifiers and + the parameters associated with them are not documented in RFCs. + Therefore, they are subject to change at any time and not suitable + for production use. Any MTA, MUA, or downstream filter intended for + production use SHOULD ignore or delete any Authentication-Results + header field that includes an experimental (unknown) method + identifier. + +2.6.7. Extension Result Codes + + Additional result codes (extension results) might be defined in the + future by later revisions or extensions to this specification. + Result codes MUST be registered with the Internet Assigned Numbers + Authority (IANA) and preferably published in an RFC. See Section 6 + for further details. + + Extension results MUST only be used within ADMDs that have explicitly + consented to use them. These results and the parameters associated + with them are not formally documented. Therefore, they are subject + to change at any time and not suitable for production use. Any MTA, + MUA, or downstream filter intended for production use SHOULD ignore + or delete any Authentication-Results header field that includes an + extension result. + +3. The "iprev" Authentication Method + + This section defines an additional authentication method called + "iprev". + + "iprev" is an attempt to verify that a client appears to be valid + based on some DNS queries, which is to say that the IP address is + explicitly associated with a domain name. Upon receiving a session + initiation of some kind from a client, the IP address of the client + peer is queried for matching names (i.e., a number-to-name + translation, also known as a "reverse lookup" or a "PTR" record + query). Once that result is acquired, a lookup of each of the names + (i.e., a name-to-number translation, or an "A" or "AAAA" record + + + +Kucherawy Standards Track [Page 19] + +RFC 7001 Authentication-Results Header Field September 2013 + + + query) thus retrieved is done. The response to this second check + will typically result in at least one mapping back to the client's IP + address. + + Expressed as an algorithm: If the client peer's IP address is I, the + list of names to which I maps (after a "PTR" query) is the set N, and + the union of IP addresses to which each member of N maps (after + corresponding "A" and "AAAA" queries) is L, then this test is + successful if I is an element of L. + + The response to a PTR query could contain multiple names. To prevent + heavy DNS loads, agents performing these queries MUST be implemented + such that the number of names evaluated by generation of + corresponding A or AAAA queries is limited so as not to be unduly + taxing to the DNS infrastructure, though it MAY be configurable by an + administrator. As an example, Section 5.5 of [SPF] chose a limit of + 10 for its implementation of this algorithm. + + "DNS Extensions to Support IP Version 6" ([DNS-IP6]) discusses the + query formats for the IPv6 case. + + There is some contention regarding the wisdom and reliability of this + test. For example, in some regions, it can be difficult for this + test ever to pass because the practice of arranging to match the + forward and reverse DNS is infrequently observed. Therefore, the + precise implementation details of how a verifier performs an "iprev" + test are not specified here. The verifier MAY report a successful or + failed "iprev" test at its discretion having done some kind of check + of the validity of the connection's identity using DNS. It is + incumbent upon an agent making use of the reported "iprev" result to + understand what exactly that particular verifier is attempting to + report. + + Extensive discussion of reverse DNS mapping and its implications can + be found in "Considerations for the use of DNS Reverse Mapping" + ([DNSOP-REVERSE]). In particular, it recommends that applications + avoid using this test as a means of authentication or security. Its + presence in this document is not an endorsement but is merely + acknowledgement that the method remains common and provides the means + to relay the results of that test. + +4. Adding the Header Field to a Message + + This specification makes no attempt to evaluate the relative + strengths of various message authentication methods that may become + available. The methods listed are an order-independent set; their + sequence does not indicate relative strength or importance of one + + + + +Kucherawy Standards Track [Page 20] + +RFC 7001 Authentication-Results Header Field September 2013 + + + method over another. Instead, the MUA or downstream filter consuming + this header field is to interpret the result of each method based on + its own knowledge of what that method evaluates. + + Each "method" MUST refer to an authentication method declared in the + IANA registry or an extension method as described in Section 2.6.6, + and each "result" MUST refer to a result code declared in the IANA + registry or an extension result code as defined in Section 2.6.7. + See Section 6 for further information about the registered methods + and result codes. + + An MTA compliant with this specification adds this header field + (after performing one or more message authentication tests) to + indicate which MTA or ADMD performed the test, which test got + applied, and what the result was. If an MTA applies more than one + such test, it adds this header field either once per test or once + indicating all of the results. An MTA MUST NOT add a result to an + existing header field. + + An MTA MAY add this header field containing only the authentication + identifier portion and the "none" token (see Section 2.2) to indicate + explicitly that no message authentication schemes were applied prior + to delivery of this message. + + An MTA adding this header field has to take steps to identify it as + legitimate to the MUAs or downstream filters that will ultimately + consume its content. One process to do so is described in Section 5. + Further measures may be necessary in some environments. Some + possible solutions are enumerated in Section 7.1. This document does + not mandate any specific solution to this issue as each environment + has its own facilities and limitations. + + Most known message authentication methods focus on a particular + identifier to evaluate. SPF and Sender ID differ in that they can + yield a result based on more than one identifier; specifically, SPF + can evaluate the RFC5321.HELO parameter or the RFC5321.MailFrom + parameter, and Sender ID can evaluate the RFC5321.MailFrom parameter + or the Purported Responsible Address (PRA) identity. When generating + this field to report those results, only the parameter that yielded + the result is included. + + For MTAs that add this header field, adding header fields in order + (at the top), per Section 3.6 of [MAIL], is particularly important. + Moreover, this header field SHOULD be inserted above any other trace + header fields such MTAs might prepend. This placement allows easy + detection of header fields that can be trusted. + + + + + +Kucherawy Standards Track [Page 21] + +RFC 7001 Authentication-Results Header Field September 2013 + + + End users making direct use of this header field might inadvertently + trust information that has not been properly vetted. If, for + example, a basic SPF result were to be relayed that claims an + authenticated addr-spec, the local-part of that addr-spec has + actually not been authenticated. Thus, an MTA adding this header + field SHOULD NOT include any data that has not been authenticated by + the method(s) being applied. Moreover, MUAs SHOULD NOT render to + users such information if it is presented by a method known not to + authenticate it. + +4.1. Header Field Position and Interpretation + + In order to ensure non-ambiguous results and avoid the impact of + false header fields, MUAs and downstream filters SHOULD NOT interpret + this header field unless specifically configured to do so by the user + or administrator. That is, this interpretation should not be "on by + default". Naturally then, users or administrators ought not activate + such a feature unless they are certain the header field will be + validly added by an agent within the ADMD that accepts the mail that + is ultimately read by the MUA, and instances of the header field + appearing to originate within the ADMD but are actually added by + foreign MTAs will be removed before delivery. + + Furthermore, MUAs and downstream filters SHOULD NOT interpret this + header field unless the authentication service identifier it bears + appears to be one used within its own ADMD as configured by the user + or administrator. + + MUAs and downstream filters MUST ignore any result reported using a + "result" not specified in the IANA "Result Code" registry or a + "ptype" not listed in the corresponding registry for such values as + defined in Section 6. Moreover, such agents MUST ignore a result + indicated for any "method" they do not specifically support. + + An MUA SHOULD NOT reveal these results to end users, absent careful + human factors design considerations and testing, for the presentation + of trust-related materials. For example, an attacker could register + examp1e.com (note the digit "one") and send signed mail to intended + victims; a verifier would detect that the signature was valid and + report a "pass" even though it's clear the DNS domain name was + intended to mislead. See Section 7.2 for further discussion. + + As stated in Section 2.1, this header field MUST be treated as though + it were a trace header field as defined in Section 3.6.7 of [MAIL] + and hence MUST NOT be reordered and MUST be prepended to the message, + so that there is generally some indication upon delivery of where in + the chain of handling MTAs the message authentication was done. + + + + +Kucherawy Standards Track [Page 22] + +RFC 7001 Authentication-Results Header Field September 2013 + + + Note that there are a few message handlers that are only capable of + appending new header fields to a message. Strictly speaking, these + handlers are not compliant with this specification. They can still + add the header field to carry authentication details, but any signal + about where in the handling chain the work was done may be lost. + Consumers SHOULD be designed such that this can be tolerated, + especially from a producer known to have this limitation. + + MUAs SHOULD ignore instances of this header field discovered within + message/rfc822 MIME attachments. + + Further discussion of these topics can be found in Section 7 below. + +4.2. Local Policy Enforcement + + Some sites have a local policy that considers any particular + authentication policy's non-recoverable failure results (typically + "fail" or similar) as justification for rejecting the message. In + such cases, the border MTA SHOULD issue an SMTP rejection response to + the message, rather than adding this header field and allowing the + message to proceed toward delivery. This is more desirable than + allowing the message to reach an internal host's MTA or spam filter, + thus possibly generating a local rejection such as a Delivery Status + Notification (DSN) [DSN] to a forged originator. Such generated + rejections are colloquially known as "backscatter". + + The same MAY also be done for local policy decisions overriding the + results of the authentication methods (e.g., the "policy" result + codes described in Section 2.6). + + Such rejections at the SMTP protocol level are not possible if local + policy is enforced at the MUA and not the MTA. + +5. Removing Existing Header Fields + + For security reasons, any MTA conforming to this specification MUST + delete any discovered instance of this header field that claims, by + virtue of its authentication service identifier, to have been added + within its trust boundary but that did not come directly from another + trusted MTA. For example, an MTA for example.com receiving a message + MUST delete or otherwise obscure any instance of this header field + bearing an authentication service identifier indicating that the + header field was added within example.com prior to adding its own + header fields. This could mean each MTA will have to be equipped + with a list of internal MTAs known to be compliant (and hence + trustworthy). + + + + + +Kucherawy Standards Track [Page 23] + +RFC 7001 Authentication-Results Header Field September 2013 + + + For simplicity and maximum security, a border MTA could remove all + instances of this header field on mail crossing into its trust + boundary. However, this may conflict with the desire to access + authentication results performed by trusted external service + providers. It may also invalidate signed messages whose signatures + cover external instances of this header field. A more robust border + MTA could allow a specific list of authenticating MTAs whose + information is to be admitted, removing the header field originating + from all others. + + As stated in Section 1.2, a formal definition of "trust boundary" is + deliberately not made here. It is entirely possible that a border + MTA for example.com will explicitly trust authentication results + asserted by upstream host example.net even though they exist in + completely disjoint administrative boundaries. In that case, the + border MTA MAY elect not to delete those results; moreover, the + upstream host doing some authentication work could apply a signing + technology such as [DKIM] on its own results to assure downstream + hosts of their authenticity. An example of this is provided in + Appendix C. + + Similarly, in the case of messages signed using [DKIM] or other + message-signing methods that sign header fields, this removal action + could invalidate one or more signatures on the message if they + covered the header field to be removed. This behavior can be + desirable since there's little value in validating the signature on a + message with forged header fields. However, signing agents MAY + therefore elect to omit these header fields from signing to avoid + this situation. + + An MTA SHOULD remove any instance of this header field bearing a + version (express or implied) that it does not support. However, an + MTA MUST remove such a header field if the [SMTP] connection relaying + the message is not from a trusted internal MTA. This means the MTA + needs to be able to understand versions of this header field at least + as late as the ones understood by the MUAs or other consumers within + its ADMD. + +6. IANA Considerations + + IANA has registered the defined header field and created two tables + as described below. These registry actions were originally defined + by [RFC5451] and are repeated here to provide a single, current + reference. + + + + + + + +Kucherawy Standards Track [Page 24] + +RFC 7001 Authentication-Results Header Field September 2013 + + +6.1. The Authentication-Results Header Field + + [RFC5451] added the Authentication-Results header field to the IANA + "Permanent Message Header Field Names" registry, per the procedure + found in [IANA-HEADERS]. That entry has been updated to reference + this document. The following is the registration template: + + Header field name: Authentication-Results + Applicable protocol: mail ([MAIL]) + Status: Standard + Author/Change controller: IETF + Specification document(s): RFC 7001 + Related information: + Requesting review of any proposed changes and additions to + this field is recommended. + +6.2. "Email Authentication Methods" Registry + + Names of message authentication methods supported by this + specification are to be registered with IANA, with the exception of + experimental names as described in Section 2.6.6. A registry was + created by [RFC5451] for this purpose. This document changes the + rules governing that registry. + + New entries are assigned only for values that have received Expert + Review, per [IANA-CONSIDERATIONS]. The designated expert shall be + appointed by the IESG. The designated expert has discretion to + request that a publication be referenced if a clear, concise + definition of the authentication method cannot be provided such that + interoperability is assured. Registrations should otherwise be + permitted. The designated expert can also handle requests to mark + any current registration as "deprecated". + + Each method must register a name, the specification that defines it, + a version number associated with the method being registered + (preferably starting at "1"), zero or more "ptype" values appropriate + for use with that method, which "property" value(s) should be + reported by that method, and a description of the "value" to be used + with each. + + All existing registry entries that reference [RFC5451] have been + updated to reference this document, except where entries have already + been deprecated. + + IANA has also added a "version" field to all existing registry + entries. All current methods are recorded as version "1". + + + + + +Kucherawy Standards Track [Page 25] + +RFC 7001 Authentication-Results Header Field September 2013 + + +6.3. "Email Authentication Result Names" Registry + + Names of message authentication result codes supported by this + specification must be registered with IANA, with the exception of + experimental codes as described in Section 2.6.7. A registry was + created by [RFC5451] for this purpose. This document changes the + rules governing that registry. + + New entries are assigned only for values that have received Expert + Review, per [IANA-CONSIDERATIONS]. The designated expert shall be + appointed by the IESG. The designated expert has discretion to + request that a publication be referenced if a clear, concise + definition of the authentication result cannot be provided such that + interoperability is assured. Registrations should otherwise be + permitted. The designated expert can also handle requests to mark + any current registration as "deprecated". + + All existing registry entries that reference [RFC5451] have been + updated to reference this document. + + The definitions for the SPF and Sender ID authentication methods are + updated using the references found in Section 2.6.2. + +7. Security Considerations + + The following security considerations apply when adding or processing + the Authentication-Results header field: + +7.1. Forged Header Fields + + An MUA or filter that accesses a mailbox whose messages are handled + by a non-conformant MTA, and understands Authentication-Results + header fields, could potentially make false conclusions based on + forged header fields. A malicious user or agent could forge a header + field using the DNS domain of a receiving ADMD as the authserv-id + token in the value of the header field and, with the rest of the + value, claim that the message was properly authenticated. The non- + conformant MTA would fail to strip the forged header field, and the + MUA could inappropriately trust it. + + For this reason, it is best not to have processing of the + Authentication-Results header field enabled by default; instead, it + should be ignored, at least for the purposes of enacting filtering + decisions, unless specifically enabled by the user or administrator + after verifying that the border MTA is compliant. It is acceptable + to have an MUA aware of this specification but have an explicit list + of hostnames whose Authentication-Results header fields are + trustworthy; however, this list should initially be empty. + + + +Kucherawy Standards Track [Page 26] + +RFC 7001 Authentication-Results Header Field September 2013 + + + Proposed alternative solutions to this problem were made some time + ago and are listed below. To date, they have not been developed due + to lack of demand but are documented here should the information be + useful at some point in the future: + + 1. Possibly the simplest is a digital signature protecting the + header field, such as using [DKIM], that can be verified by an + MUA by using a posted public key. Although one of the main + purposes of this document is to relieve the burden of doing + message authentication work at the MUA, this only requires that + the MUA learn a single authentication scheme even if a number of + them are in use at the border MTA. Note that [DKIM] requires + that the From header field be signed, although in this + application, the signing agent (a trusted MTA) likely cannot + authenticate that value, so the fact that it is signed should be + ignored. Where the authserv-id is the ADMD's domain name, the + authserv-id matching this valid internal signature's "d=" DKIM + value is sufficient. + + 2. Another would be a means to interrogate the MTA that added the + header field to see if it is actually providing any message + authentication services and saw the message in question, but this + isn't especially palatable given the work required to craft and + implement such a scheme. + + 3. Yet another might be a method to interrogate the internal MTAs + that apparently handled the message (based on Received header + fields) to determine whether any of them conform to Section 5 of + this memo. This, too, has potentially high barriers to entry. + + 4. Extensions to [IMAP], [SMTP], and [POP3] could be defined to + allow an MUA or filtering agent to acquire the authserv-id in use + within an ADMD, thus allowing it to identify which + Authentication-Results header fields it can trust. + + 5. On the presumption that internal MTAs are fully compliant with + Section 3.6 of [MAIL] and the compliant internal MTAs are using + their own hostnames or the ADMD's DNS domain name as the + authserv-id token, the header field proposed here should always + appear above a Received header added by a trusted MTA. This can + be used as a test for header field validity. + + Support for some of these is being considered for future work. + + In any case, a mechanism needs to exist for an MUA or filter to + verify that the host that appears to have added the header field (a) + actually did so and (b) is legitimately adding that header field for + + + + +Kucherawy Standards Track [Page 27] + +RFC 7001 Authentication-Results Header Field September 2013 + + + this delivery. Given the variety of messaging environments deployed + today, consensus appears to be that specifying a particular mechanism + for doing so is not appropriate for this document. + + Mitigation of the forged header field attack can also be accomplished + by moving the authentication results data into metadata associated + with the message. In particular, an [SMTP] extension could be + established to communicate authentication results from the border MTA + to intermediate and delivery MTAs; the latter of these could arrange + to store the authentication results as metadata retrieved and + rendered along with the message by an [IMAP] client aware of a + similar extension in that protocol. The delivery MTA would be told + to trust data via this extension only from MTAs it trusts, and border + MTAs would not accept data via this extension from any source. There + is no vector in such an arrangement for forgery of authentication + data by an outside agent. + +7.2. Misleading Results + + Until some form of service for querying the reputation of a sending + agent is widely deployed, the existence of this header field + indicating a "pass" does not render the message trustworthy. It is + possible for an arriving piece of spam or other undesirable mail to + pass checks by several of the methods enumerated above (e.g., a piece + of spam signed using [DKIM] by the originator of the spam, which + might be a spammer or a compromised system). In particular, this + issue is not resolved by forged header field removal discussed above. + + Hence, MUAs and downstream filters must take some care with use of + this header even after possibly malicious headers are scrubbed. + +7.3. Header Field Position + + Despite the requirements of [MAIL], header fields can sometimes be + reordered en route by intermediate MTAs. The goal of requiring + header field addition only at the top of a message is an + acknowledgement that some MTAs do reorder header fields, but most do + not. Thus, in the general case, there will be some indication of + which MTAs (if any) handled the message after the addition of the + header field defined here. + +7.4. Reverse IP Query Denial-of-Service Attacks + + Section 5.5 of [SPF] describes a DNS-based denial-of-service attack + for verifiers that attempt DNS-based identity verification of + arriving client connections. A verifier wishing to do this check and + report this information needs to take care not to go to unbounded + lengths to resolve "A" and "PTR" queries. MUAs or other filters + + + +Kucherawy Standards Track [Page 28] + +RFC 7001 Authentication-Results Header Field September 2013 + + + making use of an "iprev" result specified by this document need to be + aware of the algorithm used by the verifier reporting the result and, + especially, its limitations. + +7.5. Mitigation of Backscatter + + Failing to follow the instructions of Section 4.2 can result in a + denial-of-service attack caused by the generation of [DSN] messages + (or equivalent) to addresses that did not send the messages being + rejected. + +7.6. Internal MTA Lists + + Section 5 describes a procedure for scrubbing header fields that may + contain forged authentication results about a message. A compliant + installation will have to include, at each MTA, a list of other MTAs + known to be compliant and trustworthy. Failing to keep this list + current as internal infrastructure changes may expose an ADMD to + attack. + +7.7. Attacks against Authentication Methods + + If an attack becomes known against an authentication method, clearly + then the agent verifying that method can be fooled into thinking an + inauthentic message is authentic, and thus the value of this header + field can be misleading. It follows that any attack against the + authentication methods supported by this document is also a security + consideration here. + +7.8. Intentionally Malformed Header Fields + + It is possible for an attacker to add an Authentication-Results + header field that is extraordinarily large or otherwise malformed in + an attempt to discover or exploit weaknesses in header field parsing + code. Implementers must thoroughly verify all such header fields + received from MTAs and be robust against intentionally as well as + unintentionally malformed header fields. + +7.9. Compromised Internal Hosts + + An internal MUA or MTA that has been compromised could generate mail + with a forged From header field and a forged Authentication-Results + header field that endorses it. Although it is clearly a larger + concern to have compromised internal machines than it is to prove the + value of this header field, this risk can be mitigated by arranging + that internal MTAs will remove this header field if it claims to have + been added by a trusted border MTA (as described above), yet the + [SMTP] connection is not coming from an internal machine known to be + + + +Kucherawy Standards Track [Page 29] + +RFC 7001 Authentication-Results Header Field September 2013 + + + running an authorized MTA. However, in such a configuration, + legitimate MTAs will have to add this header field when legitimate + internal-only messages are generated. This is also covered in + Section 5. + +7.10. Encapsulated Instances + + MIME messages can contain attachments of type "message/rfc822", which + contain other messages. Such an encapsulated message can also + contain an Authentication-Results header field. Although the + processing of these is outside of the intended scope of this document + (see Section 1.3), some early guidance to MUA developers is + appropriate here. + + Since MTAs are unlikely to strip Authentication-Results header fields + after mailbox delivery, MUAs are advised in Section 4.1 to ignore + such instances within MIME attachments. Moreover, when extracting a + message digest to separate mail store messages or other media, such + header fields should be removed so that they will never be + interpreted improperly by MUAs that might later consume them. + +7.11. Reverse Mapping + + Although Section 3 of this memo includes explicit support for the + "iprev" method, its value as an authentication mechanism is limited. + Implementers of both this proposal and agents that use the data it + relays are encouraged to become familiar with the issues raised by + [DNSOP-REVERSE] when deciding whether or not to include support for + "iprev". + +8. References + +8.1. Normative References + + [ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, January 2008. + + [IANA-HEADERS] + Klyne, G., Nottingham, M., and J. Mogul, "Registration + Procedures for Message Header Fields", BCP 90, RFC 3864, + September 2004. + + [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [MAIL] Resnick, P., Ed., "Internet Message Format", RFC 5322, + October 2008. + + + + +Kucherawy Standards Track [Page 30] + +RFC 7001 Authentication-Results Header Field September 2013 + + + [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, + October 2008. + +8.2. Informative References + + [ADSP] Allman, E., Fenton, J., Delany, M., and J. Levine, + "DomainKeys Identified Mail (DKIM) Author Domain Signing + Practices (ADSP)", RFC 5617, August 2009. + + [AR-VBR] Kucherawy, M., "Authentication-Results Registration for + Vouch by Reference Results", RFC 6212, April 2011. + + [ATPS] Kucherawy, M., "DomainKeys Identified Mail (DKIM) + Authorized Third-Party Signatures", RFC 6541, + February 2012. + + [AUTH] Siemborski, R. and A. Melnikov, "SMTP Service Extension + for Authentication", RFC 4954, July 2007. + + [DKIM] Crocker, D., Hansen, T., and M. Kucherawy, "DomainKeys + Identified Mail (DKIM) Signatures", STD 76, RFC 6376, + September 2011. + + [DNS] Mockapetris, P., "Domain names - implementation and + specification", STD 13, RFC 1035, November 1987. + + [DNS-IP6] Thomson, S., Huitema, C., Ksinant, V., and M. Souissi, + "DNS Extensions to Support IP Version 6", RFC 3596, + October 2003. + + [DNSOP-REVERSE] + Senie, D. and A. Sullivan, "Considerations for the use of + DNS Reverse Mapping", Work in Progress, March 2008. + + [DOMAINKEYS] + Delany, M., "Domain-Based Email Authentication Using + Public Keys Advertised in the DNS (DomainKeys)", RFC 4870, + May 2007. + + [DSN] Moore, K. and G. Vaudreuil, "An Extensible Message Format + for Delivery Status Notifications", RFC 3464, + January 2003. + + + + + +Kucherawy Standards Track [Page 31] + +RFC 7001 Authentication-Results Header Field September 2013 + + + [EMAIL-ARCH] + Crocker, D., "Internet Mail Architecture", RFC 5598, + July 2009. + + [IANA-CONSIDERATIONS] + Narten, T. and H. Alvestrand, "Guidelines for Writing an + IANA Considerations Section in RFCs", BCP 26, RFC 5226, + May 2008. + + [IMAP] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION + 4rev1", RFC 3501, March 2003. + + [POP3] Myers, J. and M. Rose, "Post Office Protocol - Version 3", + STD 53, RFC 1939, May 1996. + + [RFC5451] Kucherawy, M., "Message Header Field for Indicating + Message Authentication Status", RFC 5451, April 2009. + + [SECURITY] Rescorla, E. and B. Korver, "Guidelines for Writing RFC + Text on Security Considerations", BCP 72, RFC 3552, + July 2003. + + [SENDERID] Lyon, J. and M. Wong, "Sender ID: Authenticating E-Mail", + RFC 4406, April 2006. + + [SPF] Wong, M. and W. Schlitt, "Sender Policy Framework (SPF) + for Authorizing Use of Domains in E-Mail, Version 1", + RFC 4408, April 2006. + + [VBR] Hoffman, P., Levine, J., and A. Hathcock, "Vouch By + Reference", RFC 5518, April 2009. + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 32] + +RFC 7001 Authentication-Results Header Field September 2013 + + +Appendix A. Acknowledgements + + The author wishes to acknowledge the following individuals for their + review and constructive criticism of this document: Dave Cridland, + Dave Crocker, Bjoern Hoehrmann, Scott Kitterman, John Levine, Alexey + Melnikov, S. Moonesamy, and Alessandro Vesely. + +Appendix B. Legacy MUAs + + Implementers of this protocol should be aware that many MUAs are + unlikely to be retrofitted to support the new header field and its + semantics. In the interests of convenience and quicker adoption, a + delivery MTA might want to consider adding things that are processed + by existing MUAs in addition to the Authentication-Results header + field. One suggestion is to include a Priority header field, on + messages that don't already have such a header field, containing a + value that reflects the strength of the authentication that was + accomplished, e.g., "low" for weak or no authentication, "normal" or + "high" for good or strong authentication. + + Some modern MUAs can already filter based on the content of this + header field. However, there is keen interest in having MUAs make + some kind of graphical representation of this header field's meaning + to end users. Until this capability is added, other interim means of + conveying authentication results may be necessary while this proposal + and its successors are adopted. + +Appendix C. Authentication-Results Examples + + This section presents some examples of the use of this header field + to indicate authentication results. + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 33] + +RFC 7001 Authentication-Results Header Field September 2013 + + +C.1. Trivial Case; Header Field Not Present + + The trivial case: + + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by server.example.org (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.org + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 1: Trivial Case + + The Authentication-Results header field is completely absent. The + MUA may make no conclusion about the validity of the message. This + could be the case because the message authentication services were + not available at the time of delivery, or no service is provided, or + the MTA is not in compliance with this specification. + +C.2. Nearly Trivial Case; Service Provided, but No Authentication Done + + A message that was delivered by an MTA that conforms to this + specification but provides no actual message authentication service: + + Authentication-Results: example.org 1; none + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by server.example.org (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.org + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 2: Header Present but No Authentication Done + + + + + + +Kucherawy Standards Track [Page 34] + +RFC 7001 Authentication-Results Header Field September 2013 + + + The Authentication-Results header field is present, showing that the + delivering MTA conforms to this specification. It used its DNS + domain name as the authserv-id. The presence of "none" (and the + absence of any method and result tokens) indicates that no message + authentication was done. The version number of the specification to + which the field's content conforms is explicitly provided. + +C.3. Service Provided, Authentication Done + + A message that was delivered by an MTA that conforms to this + specification and applied some message authentication: + + Authentication-Results: example.com; + spf=pass smtp.mailfrom=example.net + Received: from dialup-1-2-3-4.example.net + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.net + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + Message-Id: <12345.abc@example.net> + Subject: here's a sample + + Hello! Goodbye! + + Example 3: Header Reporting Results + + The Authentication-Results header field is present, indicating that + the border MTA conforms to this specification. The authserv-id is + once again the DNS domain name. Furthermore, the message was + authenticated by that MTA via the method specified in [SPF]. Note + that since that method cannot authenticate the local-part, it has + been omitted from the result's value. The MUA could extract and + relay this extra information if desired. + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 35] + +RFC 7001 Authentication-Results Header Field September 2013 + + +C.4. Service Provided, Several Authentications Done, Single MTA + + A message that was relayed inbound via a single MTA that conforms to + this specification and applied three different message authentication + checks: + + Authentication-Results: example.com; + auth=pass (cram-md5) smtp.auth=sender@example.net; + spf=pass smtp.mailfrom=example.net + Authentication-Results: example.com; + sender-id=pass header.from=example.net + Received: from dialup-1-2-3-4.example.net (8.11.6/8.11.6) + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + From: sender@example.net + Message-Id: <12345.abc@example.net> + Subject: here's a sample + + Hello! Goodbye! + + Example 4: Headers Reporting Results from One MTA + + The Authentication-Results header field is present, indicating that + the delivering MTA conforms to this specification. Once again, the + receiving DNS domain name is used as the authserv-id. Furthermore, + the sender authenticated herself/himself to the MTA via a method + specified in [AUTH], and both SPF and Sender ID checks were done and + passed. The MUA could extract and relay this extra information if + desired. + + Two Authentication-Results header fields are not required since the + same host did all of the checking. The authenticating agent could + have consolidated all the results into one header field. + + This example illustrates a scenario in which a remote user on a + dialup connection (example.net) sends mail to a border MTA + (example.com) using SMTP authentication to prove identity. The + dialup provider has been explicitly authorized to relay mail as + example.com resulting in passes by the SPF and Sender ID checks. + + + + + + + + +Kucherawy Standards Track [Page 36] + +RFC 7001 Authentication-Results Header Field September 2013 + + +C.5. Service Provided, Several Authentications Done, Different MTAs + + A message that was relayed inbound by two different MTAs that conform + to this specification and applied multiple message authentication + checks: + + Authentication-Results: example.com; + sender-id=fail header.from=example.com; + dkim=pass (good signature) header.d=example.com + Received: from mail-router.example.com + (mail-router.example.com [192.0.2.1]) + by auth-checker.example.com (8.11.6/8.11.6) + with ESMTP id i7PK0sH7021929; + Fri, Feb 15 2002 17:19:22 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; d=example.com; + t=1188964191; c=simple/simple; h=From:Date:To:Subject: + Message-Id:Authentication-Results; + bh=sEuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m70; + b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM= + Authentication-Results: example.com; + auth=pass (cram-md5) smtp.auth=sender@example.com; + spf=fail smtp.mailfrom=example.com + Received: from dialup-1-2-3-4.example.net + (dialup-1-2-3-4.example.net [192.0.2.200]) + by mail-router.example.com (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + From: sender@example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: receiver@example.com + Message-Id: <12345.abc@example.com> + Subject: here's a sample + + Hello! Goodbye! + + Example 5: Headers Reporting Results from Multiple MTAs + + The Authentication-Results header field is present, indicating + conformance to this specification. Once again, the authserv-id used + is the recipient's DNS domain name. The header field is present + twice because two different MTAs in the chain of delivery did + authentication tests. The first MTA, mail-router.example.com, + reports that SMTP AUTH and SPF were both used and that the former + passed while the latter failed. In the SMTP AUTH case, additional + information is provided in the comment field, which the MUA can + choose to render if desired. + + + + + +Kucherawy Standards Track [Page 37] + +RFC 7001 Authentication-Results Header Field September 2013 + + + The second MTA, auth-checker.example.com, reports that it did a + Sender ID test (which failed) and a DKIM test (which passed). Again, + additional data about one of the tests is provided as a comment, + which the MUA may choose to render. Also noteworthy here is the fact + that there is a DKIM signature added by example.com that assured the + integrity of the lower Authentication-Results field. + + Since different hosts did the two sets of authentication checks, the + header fields cannot be consolidated in this example. + + This example illustrates more typical transmission of mail into + example.com from a user on a dialup connection example.net. The user + appears to be legitimate as he/she had a valid password allowing + authentication at the border MTA using SMTP AUTH. The SPF and Sender + ID tests failed since example.com has not granted example.net + authority to relay mail on its behalf. However, the DKIM test passed + because the sending user had a private key matching one of + example.com's published public keys and used it to sign the message. + +C.6. Service Provided, Multi-Tiered Authentication Done + + A message that had authentication done at various stages, one of + which was outside the receiving ADMD: + + Authentication-Results: example.com; + dkim=pass reason="good signature" + header.i=@mail-router.example.net; + dkim=fail reason="bad signature" + header.i=@newyork.example.com + Received: from mail-router.example.net + (mail-router.example.net [192.0.2.250]) + by chicago.example.com (8.11.6/8.11.6) + for + with ESMTP id i7PK0sH7021929; + Fri, Feb 15 2002 17:19:22 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=furble; + d=mail-router.example.net; t=1188964198; c=relaxed/simple; + h=From:Date:To:Message-Id:Subject:Authentication-Results; + bh=ftA9J6GtX8OpwUECzHnCkRzKw1uk6FNiLfJl5Nmv49E=; + b=oINEO8hgn/gnunsg ... 9n9ODSNFSDij3= + Authentication-Results: example.net; + dkim=pass (good signature) header.i=@newyork.example.com + Received: from smtp.newyork.example.com + (smtp.newyork.example.com [192.0.2.220]) + by mail-router.example.net (8.11.6/8.11.6) + with ESMTP id g1G0r1kA003489; + Fri, Feb 15 2002 17:19:07 -0800 + DKIM-Signature: v=1; a=rsa-sha256; s=gatsby; + + + +Kucherawy Standards Track [Page 38] + +RFC 7001 Authentication-Results Header Field September 2013 + + + d=newyork.example.com; + t=1188964191; c=simple/simple; + h=From:Date:To:Message-Id:Subject; + bh=sEu28nfs9fuZGD/pSr7ANysbY3jtdaQ3Xv9xPQtS0m7=; + b=EToRSuvUfQVP3Bkz ... rTB0t0gYnBVCM= + From: sender@newyork.example.com + Date: Fri, Feb 15 2002 16:54:30 -0800 + To: meetings@example.net + Message-Id: <12345.abc@newyork.example.com> + Subject: here's a sample + + Example 6: Headers Reporting Results from Multiple MTAs + in Different ADMDs + + In this example, we see multi-tiered authentication with an extended + trust boundary. + + The message was sent from someone at example.com's New York office + (newyork.example.com) to a mailing list managed at an intermediary. + The message was signed at the origin using DKIM. + + The message was sent to a mailing list service provider called + example.net, which is used by example.com. There, + meetings@example.net is expanded to a long list of recipients, one of + whom is at the Chicago office. In this example, we will assume that + the trust boundary for chicago.example.com includes the mailing list + server at example.net. + + The mailing list server there first authenticated the message and + affixed an Authentication-Results header field indicating such using + its DNS domain name for the authserv-id. It then altered the message + by affixing some footer text to the body, including some + administrivia such as unsubscription instructions. Finally, the + mailing list server affixes a second DKIM signature and begins + distribution of the message. + + The border MTA for chicago.example.com explicitly trusts results from + mail-router.example.net, so that header field is not removed. It + performs evaluation of both signatures and determines that the first + (most recent) is a "pass" but, because of the aforementioned + modifications, the second is a "fail". However, the first signature + included the Authentication-Results header added at mail- + router.example.net that validated the second signature. Thus, + indirectly, it can be determined that the authentications claimed by + both signatures are indeed valid. + + + + + + +Kucherawy Standards Track [Page 39] + +RFC 7001 Authentication-Results Header Field September 2013 + + + Note that two styles of presenting metadata about the result are in + use here. In one case, the "reason=" clause is present, which is + intended for easy extraction by parsers; in the other case, the CFWS + production of the ABNF is used to include such data as a header field + comment. The latter can be harder for parsers to extract given the + varied supported syntaxes of mail header fields. + +C.7. Comment-Heavy Example + + The formal syntax permits comments within the content in a number of + places. For the sake of illustration, this example is also legal: + + Authentication-Results: foo.example.net (foobar) 1 (baz); + dkim (Because I like it) / 1 (One yay) = (wait for it) fail + policy (A dot can go here) . (like that) expired + (this surprised me) = (as I wasn't expecting it) 1362471462 + + Example 7: A Very Comment-Heavy but Perfectly Legal Example + +Appendix D. Operational Considerations about Message Authentication + + This protocol is predicated on the idea that authentication (and + presumably in the future, reputation) work is typically done by + border MTAs rather than MUAs or intermediate MTAs; the latter merely + make use of the results determined by the former. Certainly this is + not mandatory for participation in electronic mail or message + authentication, but this protocol and its deployment to date are + based on that model. The assumption satisfies several common ADMD + requirements: + + 1. Service operators prefer to resolve the handling of problem + messages as close to the border of the ADMD as possible. This + enables, for example, rejection of messages at the SMTP level + rather than generating a DSN internally. Thus, doing any of the + authentication or reputation work exclusively at the MUA or + intermediate MTA renders this desire unattainable. + + 2. Border MTAs are more likely to have direct access to external + sources of authentication or reputation information since modern + MUAs are more likely to be heavily firewalled. Thus, some MUAs + might not even be able to complete the task of performing + authentication or reputation evaluations without complex proxy + configurations or similar burdens. + + + + + + + + +Kucherawy Standards Track [Page 40] + +RFC 7001 Authentication-Results Header Field September 2013 + + + 3. MUAs rely upon the upstream MTAs within their trust boundaries to + make correct (as much as is possible) evaluations about the + message's envelope, header, and content. Thus, MUAs don't need + to know how to do the work that upstream MTAs do; they only need + the results of that work. + + 4. Evaluations about the quality of a message, from simple token + matching (e.g., a list of preferred DNS domains) to cryptanalysis + (e.g., public/private key work), are at least a little bit + expensive and thus need to be minimized. To that end, performing + those tests at the border MTA is far preferred to doing that work + at each MUA that handles a message. If an ADMD's environment + adheres to common messaging protocols, a reputation query or an + authentication check performed by a border MTA would return the + same result as the same query performed by an MUA. By contrast, + in an environment where the MUA does the work, a message arriving + for multiple recipients would thus cause authentication or + reputation evaluation to be done more than once for the same + message (i.e., at each MUA), causing needless amplification of + resource use and creating a possible denial-of-service attack + vector. + + 5. Minimizing change is good. As new authentication and reputation + methods emerge, the list of methods supported by this header + field would presumably be extended. If MUAs simply consume the + contents of this header field rather than actually attempt to do + authentication and/or reputation work, then MUAs only need to + learn to parse this header field once; emergence of new methods + requires only a configuration change at the MUAs and software + changes at the MTAs (which are presumably fewer in number). When + choosing to implement these functions in MTAs vs. MUAs, the + issues of individual flexibility, infrastructure inertia, and + scale of effort must be considered. It is typically easier to + change a single MUA than an MTA because the modification affects + fewer users and can be pursued with less care. However, changing + many MUAs is more effort than changing a smaller number of MTAs. + + 6. For decisions affecting message delivery and display, assessment + based on authentication and reputation is best performed close to + the time of message transit, as a message makes its journey + toward a user's inbox, not afterwards. DKIM keys and IP address + reputations, etc., can change over time or even become invalid, + and users can take a long time to read a message once delivered. + The value of this work thus degrades, perhaps quickly, once the + delivery process has completed. This seriously diminishes the + value of this work when done other than at MTAs. + + + + + +Kucherawy Standards Track [Page 41] + +RFC 7001 Authentication-Results Header Field September 2013 + + + Many operational choices are possible within an ADMD, including the + venue for performing authentication and/or reputation assessment. + The current specification does not dictate any of those choices. + Rather, it facilitates those cases in which information produced by + one stage of analysis needs to be transported with the message to the + next stage. + +Appendix E. Changes since RFC 5451 + + o Erratum #2617 was addressed in RFC 6577 and was incorporated here. + + o Requested Internet Standard status. + + o Changed IANA rules from "IETF Review" to "designated expert". + + o Updated existing IANA registries from the old RFC to this one. + + o Added references to ADSP, ATPS, and VBR. + + o Removed all the "X-" stuff, per BCP 178. + + o Adjusted language to indicate that this header field was already + defined and that we're just refreshing and revising. + + o In a few places, RFC 2119 language had been used in lowercase + terms; fixed here. + + o Erratum #2818 addressed. + + o Erratum #3195 addressed. + + o Performed some minor wordsmithing and removed odd prose. + + o ABNF: changed "dot-atom" to "Keyword" since "dot-atom" allows "=", + which leads to ambiguous productions. + + o ABNF: the authserv-id can be a "value", not a "dot-atom". + + o ABNF: separated the spec version from the method version; they're + syntactically the same but semantically different. Added a + section discussing them. + + o Called out the SMTP verb exceptions ("mailfrom" and "rcptto"); the + previous RFC didn't do this, leading to interoperability problems. + + o Rather than deleting suspect header fields, they could also be + renamed to something harmless; there is at least one + implementation of this. + + + +Kucherawy Standards Track [Page 42] + +RFC 7001 Authentication-Results Header Field September 2013 + + + o Updated IANA "Email Authentication Methods" registry to include + version numbers. + + o Rather than repeating what RFC 4408 says the SPF results are, just + referred to those documents. + + o To avoid confusing consumers, constrained inclusion of unnecessary + properties. + + o Reviewed usage of "should" vs. "SHOULD". + + o Updated prose around authserv-id (Section 2.4). + +Author's Address + + Murray S. Kucherawy + 270 Upland Drive + San Francisco, CA 94127 + US + + EMail: superuser@gmail.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 43] + diff --git a/rfc/rfc7410.txt b/rfc/rfc7410.txt new file mode 100644 index 0000000000..ed3c0434b7 --- /dev/null +++ b/rfc/rfc7410.txt @@ -0,0 +1,283 @@ + + + + + + +Internet Engineering Task Force (IETF) M. Kucherawy +Request for Comments: 7410 December 2014 +Updates: 7001 +Category: Standards Track +ISSN: 2070-1721 + + + A Property Types Registry for the Authentication-Results Header Field + +Abstract + + This document updates RFC 7001 by creating a registry for property + types in the Authentication-Results header field, used in email + authentication work, rather than limiting participants to using the + original, small set of fixed values. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc7410. + +Copyright Notice + + Copyright (c) 2014 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + + + + + + +Kucherawy Standards Track [Page 1] + +RFC 7410 Authentication-Results Property Types December 2014 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 + 2. Updated "ptype" Definition . . . . . . . . . . . . . . . . . 2 + 3. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 3 + 4. Security Considerations . . . . . . . . . . . . . . . . . . . 4 + 5. Normative References . . . . . . . . . . . . . . . . . . . . 5 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 5 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 5 + +1. Introduction + + [RFC7001] defines the email Authentication-Results header field that + presents the results of an authentication effort in a machine- + readable format. The header field creates a place to collect the + output from authentication processes that are disjoint from later + processes that might use the output, such as analysis, filtering, or + sorting mechanisms. + + The specification in that document enumerated a small set of types of + properties that can be reported using this mechanism. There has + emerged a desire to report types of properties about a message + through this mechanism. Accordingly, this document updates the + specification to allow for additional property types ("ptypes") + beyond the original set and creates a registry where new ones can be + listed and their defining documents referenced. + +2. Updated "ptype" Definition + + Advanced Backus Naur Form (ABNF) is defined in [RFC5234]. + + The ABNF in Section 2.2 of [RFC7001] is updated as follows: + + ptype = Keyword + ; indicates whether the property being evaluated was + ; a parameter to an [SMTP] command, was a value taken + ; from a message header field, was some property of + ; the message body, or was some other property evaluated by + ; the receiving Message Transfer Agent (MTA) + + The ABNF token "Keyword" is defined in Section 4.1.2 of [RFC5321]. + + + + + + + + + + +Kucherawy Standards Track [Page 2] + +RFC 7410 Authentication-Results Property Types December 2014 + + + Legal values of "ptype" are as defined in the IANA "Email + Authentication Property Types" registry (see Section 3). The initial + values are as follows, matching those defined in [RFC7001]: + + body: Indicates information that was extracted from the body of the + message. This might be an arbitrary string of bytes, a hash of a + string of bytes, a Uniform Resource Identifier, or some other + content of interest. + + header: Indicates information that was extracted from the header of + the message. This might be the value of a header field or some + portion of a header field. + + policy: A local policy mechanism was applied that augments or + overrides the result returned by the authentication mechanism. + See Section 2.3 of [RFC7001]. + + smtp: Indicates information that was extracted from an SMTP command + that was used to relay the message. + + When a consumer of this header field encounters a "ptype" that it + does not understand, it ignores the result reported with that + "ptype". + +3. IANA Considerations + + IANA has created the "Email Authentication Property Types" sub- + registry within the existing "Email Authentication Parameters" + registry. Entries in this registry are subject to the Expert Review + rules as described in [RFC5226]. Each entry in the registry requires + the following values: + + o The "ptype" token to be registered, which must fit within the ABNF + described in Section 2. + + o A brief description of what sort of information this "ptype" is + meant to cover. + + o An optional reference to the defining document. This is + recommended, but not required. + + + + + + + + + + + +Kucherawy Standards Track [Page 3] + +RFC 7410 Authentication-Results Property Types December 2014 + + + The initial entries in this table are as follows, taken from + [RFC7001]: + + +--------+-------------+----------------------------------------+ + | ptype | Definition | Description | + +--------+-------------+----------------------------------------+ + | body | RFC 7001 | The property being reported was found | + | | Section 2.2 | in the body of the message. | + +--------+-------------+----------------------------------------+ + | header | RFC 7001 | The property being reported was found | + | | Section 2.2 | in a header field of the message. | + +--------+-------------+----------------------------------------+ + | policy | RFC 7001 | The property being reported relates to | + | | Section 2.3 | a locally defined policy. | + +--------+-------------+----------------------------------------+ + | smtp | RFC 7001 | The property being reported is a | + | | Section 2.2 | parameter to an SMTP command used to | + | | | relay the message. | + +--------+-------------+----------------------------------------+ + + For new entries, the Designated Expert needs to assure that the + description provided for the new entry adequately describes the + intended use. An example would be helpful to include in the entry's + defining document, if any, although entries in the "Email + Authentication Methods" registry or the "Email Authentication Result + Names" registry might also serve as examples of intended use. + +4. Security Considerations + + It is unknown how legacy code, which expects one of a fixed set of + "ptype" tokens, will handle new tokens as they begin to appear. + There are typically two options: prevent delivery of the message, or + ignore those portions of the field that use unknown "ptype" tokens + and allow processing of the message to continue. + + The choice comes down to whether the consumer considers it a threat + when there are unknown "ptypes" present. The semantics of the report + are unknown; the report might be indicating the message is authentic, + fraudulent, or that a test failed to complete. The report itself is + not actionable because it cannot be understood, and only its presence + is certain. + + Generally, the advice in this situation is to ignore unknown + "ptypes". It is anticipated that a new property type evaluated by + earlier handling agents would also result in the filtering of + messages by those agents until consumers can be updated to interpret + them. + + + + +Kucherawy Standards Track [Page 4] + +RFC 7410 Authentication-Results Property Types December 2014 + + +5. Normative References + + [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an + IANA Considerations Section in RFCs", BCP 26, RFC 5226, + May 2008, . + + [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, January 2008, + . + + [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, + October 2008, . + + [RFC7001] Kucherawy, M., "Message Header Field for Indicating + Message Authentication Status", RFC 7001, September 2013, + . + +Acknowledgements + + The author wishes to acknowledge the following for their review and + constructive criticism of this update: Dave Crocker, Tim Draegen, + Scott Kitterman, and Franck Martin. + +Author's Address + + Murray S. Kucherawy + 270 Upland Drive + San Francisco, CA 94127 + United States + + EMail: superuser@gmail.com + + + + + + + + + + + + + + + + + + + + +Kucherawy Standards Track [Page 5] + From 1eae1b85482e0cd25f1500a615cfa8ab58e5db86 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 07:43:02 -0400 Subject: [PATCH 311/741] Added more truncated comment tests for Authentication-Results parsing --- .../AuthenticationResultsTests.cs | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 93924dd2a3..61e8b7e736 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -666,6 +666,12 @@ public void TestParseFailureIncompleteCommentAfterAuthServId () AssertParseFailure (" authserv-id (truncated comment", 13, 31); } + [Test] + public void TestParseFailureIncompleteCommentAfterAuthServIdVersion () + { + AssertParseFailure (" authserv-id 1 (truncated comment", 15, 33); + } + [Test] public void TestParseFailureIncompleteCommentAfterInstanceEquals () { @@ -708,6 +714,12 @@ public void TestParseFailureIncompleteCommentAfterMethodEqualsResult () AssertParseFailure (" authserv-id; method=result (incomplete comment", 28, 47); } + [Test] + public void TestParseFailureIncompleteCommentAfterMethodEqualsResultComment () + { + AssertParseFailure (" authserv-id; method=result (comment) (incomplete comment", 38, 57); + } + [Test] public void TestParseFailureIncompleteCommentAfterMethodSlash () { @@ -726,6 +738,54 @@ public void TestParseFailureIncompleteCommentAfterMethodVersionEquals () AssertParseFailure (" authserv-id; method/1= (incomplete comment", 24, 43); } + [Test] + public void TestParseFailureIncompleteCommentAfterReason () + { + AssertParseFailure ("authserv-id; method=pass reason (truncated comment", 32, 50); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterReasonEquals () + { + AssertParseFailure ("authserv-id; method=pass reason= (truncated comment", 33, 51); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterReasonEqualsValue () + { + AssertParseFailure ("authserv-id; method=pass reason=value (truncated comment", 38, 56); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterPType () + { + AssertParseFailure ("authserv-id; method=pass ptype (truncated comment", 31, 49); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterPTypeDot () + { + AssertParseFailure ("authserv-id; method=pass ptype. (truncated comment", 32, 50); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterPTypeDotProp () + { + AssertParseFailure ("authserv-id; method=pass ptype.prop (truncated comment", 36, 54); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterPTypeDotPropEquals () + { + AssertParseFailure ("authserv-id; method=pass ptype.prop= (truncated comment", 37, 55); + } + + [Test] + public void TestParseFailureIncompleteCommentAfterPTypeDotPropEqualsValue () + { + AssertParseFailure ("authserv-id; method=pass ptype.prop=value (truncated comment", 42, 60); + } + [Test] public void TestParseFailureIncompleteArcInstance () { From 9b4a6a5d630bba77894b912c747d7b5127237fb4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 09:10:07 -0400 Subject: [PATCH 312/741] Added more Authentication-Results unit tests --- MimeKit/Cryptography/AuthenticationResults.cs | 163 ++++++++---------- MimeKit/Utils/StringBuilderExtensions.cs | 19 +- .../AuthenticationResultsTests.cs | 82 +++++++++ .../Utils/StringBuilderExtensionTests.cs | 2 +- 4 files changed, 171 insertions(+), 95 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index ac822f637e..e829ed6599 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -220,11 +220,29 @@ static bool SkipKeyword (byte[] text, ref int index, int endIndex) return index > startIndex; } + static bool SkipValue (byte[] text, ref int index, int endIndex, out bool quoted) + { + if (text[index] == (byte) '"') { + quoted = true; + + if (!ParseUtils.SkipQuoted (text, ref index, endIndex, false)) + return false; + } else { + quoted = false; + + if (!ParseUtils.SkipToken (text, ref index, endIndex)) + return false; + } + + return true; + } + static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnError, out AuthenticationResults authres) { int? instance = null; string srvid = null; string value; + bool quoted; authres = null; @@ -232,26 +250,22 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro return false; do { - // we're either at the start of the authserv-id token or "i=#;" (if we're parsing an ARC-Authentication-Results header) - if (index < endIndex && text[index] == (byte) '"') { - int start = index; - - if (!ParseUtils.SkipQuoted (text, ref index, endIndex, throwOnError)) - return false; - - srvid = MimeUtils.Unquote (Encoding.UTF8.GetString (text, start, index - start)); - } else { - int start = index; + int start = index; - if (!ParseUtils.SkipToken (text, ref index, endIndex)) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete authserv-id token at offset {0}", start), start, index); + if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete authserv-id token at offset {0}", start), start, index); - return false; - } + return false; + } - value = Encoding.UTF8.GetString (text, start, index - start); + value = Encoding.UTF8.GetString (text, start, index - start); + if (quoted) { + // this can only be the authserv-id token + srvid = MimeUtils.Unquote (value); + } else { + // this could either be the authserv-id or it could be "i=#" (ARC instance) if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; @@ -522,25 +536,19 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; - if (index < endIndex && text[index] == (byte) '"') { - int start = index; - - if (!ParseUtils.SkipQuoted (text, ref index, endIndex, throwOnError)) - return false; + int reasonIndex = index; - resinfo.Reason = MimeUtils.Unquote (Encoding.UTF8.GetString (text, start, index - start)); - } else { - int start = index; + if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid reasonspec value token at offset {0}", reasonIndex), reasonIndex, index); - if (!ParseUtils.SkipToken (text, ref index, endIndex)) { - if (throwOnError) - throw new ParseException (string.Format ("Invalid reasonspec value token at offset {0}", start), start, index); + return false; + } - return false; - } + resinfo.Reason = Encoding.UTF8.GetString (text, reasonIndex, index - reasonIndex); - resinfo.Reason = Encoding.UTF8.GetString (text, start, index - start); - } + if (quoted) + resinfo.Reason = MimeUtils.Unquote (resinfo.Reason); if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; @@ -914,7 +922,7 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line // try to put the entire result on 1 line var complete = ToString (); - if (complete.Length < options.MaxLineLength) { + if (complete.Length + 1 < options.MaxLineLength) { // if it fits, it sits... if (lineLength + complete.Length + 1 > options.MaxLineLength) { builder.Append (options.NewLine); @@ -930,73 +938,60 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line return; } + // Note: if we've made it this far, then we can't put everything on one line... + var tokens = new List (); + tokens.Add (" "); if (Version.HasValue) { var version = Version.Value.ToString (CultureInfo.InvariantCulture); - var combinedLength = Method.Length + 1 + version.Length + 1 + Result.Length; - if (combinedLength > options.MaxLineLength) { - // we will have to break this up into individual tokens + if (Method.Length + 1 + version.Length + 1 + Result.Length < options.MaxLineLength) { + tokens.Add ($"{Method}/{version}={Result}"); + } else if (Method.Length + 1 + version.Length < options.MaxLineLength) { + tokens.Add ($"{Method}/{version}"); + tokens.Add ("="); + tokens.Add (Result); + } else { tokens.Add (Method); tokens.Add ("/"); tokens.Add (version); tokens.Add ("="); tokens.Add (Result); - } else { - tokens.Add (string.Format ("{0}/{1}={2}", Method, version, Result)); } } else { - var combinedLength = Method.Length + 1 + Result.Length; - - if (combinedLength > options.MaxLineLength) { + if (Method.Length + 1 + Result.Length < options.MaxLineLength) { + tokens.Add ($"{Method}={Result}"); + } else { // we will have to break this up into individual tokens tokens.Add (Method); tokens.Add ("="); tokens.Add (Result); - } else { - tokens.Add (string.Format ("{0}={1}", Method, Result)); } } - builder.AppendTokens (options, ref lineLength, tokens, true); - tokens.Clear (); - if (!string.IsNullOrEmpty (ResultComment)) { - if (lineLength + ResultComment.Length + 3 > options.MaxLineLength) { - builder.Append (options.NewLine); - builder.Append ('\t'); - lineLength = 1; - } else { - builder.Append (' '); - lineLength++; - } - - lineLength += ResultComment.Length + 2; - builder.Append ('('); - builder.Append (ResultComment); - builder.Append (')'); + tokens.Add (" "); + tokens.Add ($"({ResultComment})"); } if (!string.IsNullOrEmpty (Reason)) { var reason = MimeUtils.Quote (Reason); - var combinedLength = "reason=".Length + reason.Length; - tokens.Clear (); - if (combinedLength > options.MaxLineLength) { - // we will have to break this up into individual tokens + tokens.Add (" "); + + if ("reason=".Length + reason.Length < options.MaxLineLength) { + tokens.Add ($"reason={reason}"); + } else { tokens.Add ("reason="); tokens.Add (reason); - } else { - tokens.Add ("reason=" + reason); } - - builder.AppendTokens (options, ref lineLength, tokens); - tokens.Clear (); } for (int i = 0; i < Properties.Count; i++) - Properties[i].Encode (options, builder, ref lineLength); + Properties[i].AppendTokens (options, tokens); + + builder.AppendTokens (options, ref lineLength, tokens); } /// @@ -1110,30 +1105,22 @@ public string Value { get; private set; } - internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) + internal void AppendTokens (FormatOptions options, List tokens) { - var combinedLength = PropertyType.Length + 1 + Property.Length + 1 + Value.Length; - var tokens = new List (); + tokens.Add (" "); - if (combinedLength > options.MaxLineLength) { - // we will have to break this up into individual tokens - combinedLength = PropertyType.Length + 1 + Property.Length + 1; - - if (combinedLength > options.MaxLineLength) { - tokens.Add (PropertyType); - tokens.Add ("."); - tokens.Add (Property); - tokens.Add ("="); - tokens.Add (Value); - } else { - tokens.Add (PropertyType + "." + Property + "="); - tokens.Add (Value); - } + if (PropertyType.Length + 1 + Property.Length + 1 + Value.Length < options.MaxLineLength) { + tokens.Add ($"{PropertyType}.{Property}={Value}"); + } else if (PropertyType.Length + 1 + Property.Length + 1 < options.MaxLineLength) { + tokens.Add ($"{PropertyType}.{Property}="); + tokens.Add (Value); } else { - tokens.Add (ToString ()); + tokens.Add (PropertyType); + tokens.Add ("."); + tokens.Add (Property); + tokens.Add ("="); + tokens.Add (Value); } - - builder.AppendTokens (options, ref lineLength, tokens); } /// diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index 56e7475d27..023d2e6de7 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -45,17 +45,24 @@ public static StringBuilder LineWrap (this StringBuilder text, FormatOptions opt return text; } - public static void AppendTokens (this StringBuilder text, FormatOptions options, ref int lineLength, List tokens, bool needsSpace = false) + public static void AppendTokens (this StringBuilder text, FormatOptions options, ref int lineLength, List tokens) { + var spaces = string.Empty; + foreach (var token in tokens) { - if (lineLength + token.Length > options.MaxLineLength) { + if (string.IsNullOrWhiteSpace (token)) { + spaces = token; + continue; + } + + if (lineLength + spaces.Length + token.Length > options.MaxLineLength) { text.Append (options.NewLine); + spaces = string.Empty; text.Append ('\t'); - needsSpace = false; lineLength = 1; - } else if (needsSpace) { - needsSpace = false; - text.Append (' '); + } else { + lineLength += spaces.Length; + text.Append (spaces); } lineLength += token.Length; diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 61e8b7e736..2863bb8b38 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -102,6 +102,88 @@ public void TestEncodeLongAuthServIdWithVersion () Assert.AreEqual (expected, encoded.ToString ()); } + [Test] + public void TestEncodeLongResultMethod () + { + const string expected = "Authentication-Results: lists.example.com 1;\n\treally-long-method-name=really-long-value\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults ("lists.example.com"); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("really-long-method-name", "really-long-value")); + authres.Version = 1; + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + + [Test] + public void TestEncodeLongResultMethodWithVersion () + { + const string expected = "Authentication-Results: lists.example.com 1;\n\treally-long-method-name/1=really-long-value\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults ("lists.example.com"); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("really-long-method-name", "really-long-value") { + Version = 1 + }); + authres.Version = 1; + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + + [Test] + public void TestEncodeLongResultMethodWithVersionAndComment () + { + const string expected = "Authentication-Results: lists.example.com 1;\n\treally-long-method-name/1=really-long-value\n\t(this is a really long result comment)\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults ("lists.example.com"); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("really-long-method-name", "really-long-value") { + ResultComment = "this is a really long result comment", + Version = 1 + }); + authres.Version = 1; + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + + [Test] + public void TestEncodeLongResultMethodWithVersionAndCommentAndReason () + { + const string expected = "Authentication-Results: lists.example.com 1;\n\treally-really-really-long-method-name/214748367=\n\treally-really-really-long-value (this is a really really long result comment)\n\treason=\"this is a really really really long reason\"\n\tthis-is-a-really-really-long-ptype.this-is-a-really-really-long-property=\n\tthis-is-a-really-really-long-value\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults ("lists.example.com"); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("really-really-really-long-method-name", "really-really-really-long-value") { + ResultComment = "this is a really really long result comment", + Reason = "this is a really really really long reason", + Version = 214748367 + }); + authres.Results[0].Properties.Add (new AuthenticationMethodProperty ("this-is-a-really-really-long-ptype", "this-is-a-really-really-long-property", "this-is-a-really-really-long-value")); + authres.Version = 1; + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestParseArcAuthenticationResults () { diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index b431964689..3b1488957f 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -72,7 +72,7 @@ public void TestAppendTokens () tokens.Add ("="); tokens.Add ("this-is-a-really-long-parameter-value"); - builder.AppendTokens (format, ref lineLength, tokens, true); + builder.AppendTokens (format, ref lineLength, tokens); Assert.AreEqual ("Authentication-Results: this-is-a-really-long-parameter-name=\n\tthis-is-a-really-long-parameter-value", builder.ToString ()); } From 861e82d2a957bea88ae72e226dcd0ad1e44da856 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 11:08:28 -0400 Subject: [PATCH 313/741] Added ArcSignerTests --- MimeKit/Cryptography/ArcSigner.cs | 71 +- UnitTests/Cryptography/ArcSignerTests.cs | 1072 +++++++++++++++++ UnitTests/Cryptography/DummyArcSigner.cs | 22 +- UnitTests/UnitTests.csproj | 1 + .../Utils/StringBuilderExtensionTests.cs | 1 + 5 files changed, 1145 insertions(+), 22 deletions(-) create mode 100644 UnitTests/Cryptography/ArcSignerTests.cs diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index bf4366f3ae..95f917f202 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -188,10 +188,9 @@ protected ArcSigner (Stream stream, string domain, string selector, DkimSignatur /// /// The format options. /// The message to create the ARC-Authentication-Results header for. - /// The ARC instance (the i= value to use). /// The cancellation token. - /// The ARC-Authentication-Results header. - protected abstract Header GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken); + /// The ARC-Authentication-Results header or null if the should not sign the message. + protected abstract AuthenticationResults GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, CancellationToken cancellationToken); /// /// Asynchronously generate an ARC-Authentication-Results header. @@ -201,10 +200,21 @@ protected ArcSigner (Stream stream, string domain, string selector, DkimSignatur /// /// The format options. /// The message to create the ARC-Authentication-Results header for. - /// The ARC instance (the i= value to use). /// The cancellation token. - /// The ARC-Authentication-Results header. - protected abstract Task
GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken); + /// The ARC-Authentication-Results header or null if the should not sign the message. + protected abstract Task GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken); + + /// + /// Get the timestamp value. + /// + /// + /// Gets the timestamp to use as the t= value in the ARC-Message-Signature and ARC-Seal headers. + /// + /// A value representing the timestamp value. + protected virtual long GetTimestamp () + { + return (long) (DateTime.UtcNow - DateUtils.UnixEpoch).TotalSeconds; + } StringBuilder CreateArcHeaderBuilder (int instance) { @@ -227,7 +237,7 @@ StringBuilder CreateArcHeaderBuilder (int instance) return value; } - Header GenerateArcMessageSignature (FormatOptions options, MimeMessage message, int instance, TimeSpan t, IList headers) + Header GenerateArcMessageSignature (FormatOptions options, MimeMessage message, int instance, long t, IList headers) { if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) message.MimeVersion = new Version (1, 0); @@ -240,7 +250,7 @@ Header GenerateArcMessageSignature (FormatOptions options, MimeMessage message, value.AppendFormat ("; c={0}/{1}", HeaderCanonicalizationAlgorithm.ToString ().ToLowerInvariant (), BodyCanonicalizationAlgorithm.ToString ().ToLowerInvariant ()); - value.AppendFormat ("; t={0}", (long) t.TotalSeconds); + value.AppendFormat ("; t={0}", t); using (var stream = new DkimSignatureStream (CreateSigningContext ())) { using (var filtered = new FilteredStream (stream)) { @@ -277,17 +287,16 @@ Header GenerateArcMessageSignature (FormatOptions options, MimeMessage message, } } - Header GenerateArcSeal (FormatOptions options, int instance, TimeSpan t, ArcHeaderSet[] sets, int count, Header aar, Header ams) + Header GenerateArcSeal (FormatOptions options, int instance, string cv, long t, ArcHeaderSet[] sets, int count, Header aar, Header ams) { var value = CreateArcHeaderBuilder (instance); byte[] signature; Header seal; - // FIXME: where should this value come from? - value.Append ("; cv=pass"); + value.AppendFormat ("; cv={0}", cv); value.AppendFormat ("; d={0}; s={1}", Domain, Selector); - value.AppendFormat ("; t={0}", (long) t.TotalSeconds); + value.AppendFormat ("; t={0}", t); using (var stream = new DkimSignatureStream (CreateSigningContext ())) { using (var filtered = new FilteredStream (stream)) { @@ -321,17 +330,45 @@ Header GenerateArcSeal (FormatOptions options, int instance, TimeSpan t, ArcHead async Task ArcSignAsync (FormatOptions options, MimeMessage message, IList headers, bool doAsync, CancellationToken cancellationToken) { ArcVerifier.GetArcHeaderSets (message, true, out ArcHeaderSet[] sets, out int count); + AuthenticationResults authres; int instance = count + 1; - Header aar; + string cv; + + if (count > 0) { + var parameters = sets[count - 1].ArcSealParameters; + + // do not sign if there is already a failed ARC-Seal. + if (!parameters.TryGetValue ("cv", out cv) || cv.Equals ("fail", StringComparison.OrdinalIgnoreCase)) + return; + } if (doAsync) - aar = await GenerateArcAuthenticationResultsAsync (options, message, instance, cancellationToken).ConfigureAwait (false); + authres = await GenerateArcAuthenticationResultsAsync (options, message, cancellationToken).ConfigureAwait (false); else - aar = GenerateArcAuthenticationResults (options, message, instance, cancellationToken); + authres = GenerateArcAuthenticationResults (options, message, cancellationToken); + + if (authres == null) + return; + + authres.Instance = instance; + + var aar = new Header (HeaderId.ArcAuthenticationResults, authres.ToString ()); + cv = "none"; + + if (count > 0) { + cv = "pass"; + + foreach (var method in authres.Results) { + if (method.Method.Equals ("arc", StringComparison.OrdinalIgnoreCase)) { + cv = method.Result; + break; + } + } + } - var t = DateTime.UtcNow - DateUtils.UnixEpoch; + var t = GetTimestamp (); var ams = GenerateArcMessageSignature (options, message, instance, t, headers); - var seal = GenerateArcSeal (options, instance, t, sets, count, aar, ams); + var seal = GenerateArcSeal (options, instance, cv, t, sets, count, aar, ams); message.Headers.Insert (0, aar); message.Headers.Insert (0, ams); diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs new file mode 100644 index 0000000000..53bfbde586 --- /dev/null +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -0,0 +1,1072 @@ +// +// ArcSignerTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; + +using NUnit.Framework; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; + +using MimeKit; +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography { + [TestFixture] + public class ArcSignerTests + { + static void AssertHeadersEqual (string description, HeaderId id, string expected, string actual) + { + var expectedTags = DkimVerifierBase.ParseParameterTags (id, expected); + var actualTags = DkimVerifierBase.ParseParameterTags (id, actual); + + Assert.AreEqual (expectedTags.Count, actualTags.Count, "{0} parameter counts do not match", id.ToHeaderName ()); + foreach (var tag in expectedTags) { + string value; + + if (tag.Key == "b" || tag.Key == "bh") { + // Note: these values are affected by tag order, so MimeKit's results *will* differ + // from the results produced by the library that the tests are based on... + // + // We'll validate that these values are correct by using the ArcVerifier. + continue; + } + + Assert.IsTrue (actualTags.TryGetValue (tag.Key, out value), tag.Key); + Assert.AreEqual (tag.Value, value, "{0} {1}= values do not match", id.ToHeaderName (), tag.Key); + } + } + + static void Sign (string description, string input, DkimPublicKeyLocator locator, string srvid, string domain, string selector, string privateKey, long t, string[] hdrs, string aar, string ams, string seal) + { + ArcSigner signer; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (privateKey), false)) { + signer = new DummyArcSigner (stream, domain, selector, DkimSignatureAlgorithm.RsaSha256) { + HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + PublicKeyLocator = locator, + Timestamp = t, + SrvId = srvid + }; + } + + using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (input), false)) { + var message = MimeMessage.Load (stream); + Header header; + int index; + + signer.Sign (message, hdrs); + + if (string.IsNullOrEmpty (seal)) { + index = message.Headers.IndexOf (HeaderId.ArcSeal); + + Assert.AreNotEqual (0, index, "Message should not have been signed."); + } else { + index = message.Headers.IndexOf (HeaderId.ArcAuthenticationResults); + Assert.AreEqual (2, index, "IndexOf ARC-Authentication-Results header"); + header = message.Headers[index]; + Assert.AreEqual (aar, header.Value, "ARC-Authentication-Results headers do not match"); + + index = message.Headers.IndexOf (HeaderId.ArcMessageSignature); + Assert.AreEqual (1, index, "IndexOf ARC-Message-Signature header"); + header = message.Headers[index]; + AssertHeadersEqual (description, HeaderId.ArcMessageSignature, ams, header.Value); + + index = message.Headers.IndexOf (HeaderId.ArcSeal); + Assert.AreEqual (0, index, "IndexOf ARC-Seal header"); + header = message.Headers[index]; + AssertHeadersEqual (description, HeaderId.ArcSeal, seal, header.Value); + } + } + } + + #region Canonicalization + + [Test] + public void message_body_eol_wsp () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("message body eol whitespace ignored", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void message_body_inl_wsp () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("message body inline whitespace reduced", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void message_body_end_lines () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("message body ignore trailing empty lines", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void message_body_trail_crlf () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("message body add crlf to end if na", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void headers_field_name_case () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +FROM: John Q Doe +to: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("header field names case insensitive", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void headers_field_unfold () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe + +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("header", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void headers_eol_wsp () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("headers ignore eol whitespace", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void headers_inl_wsp () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("header reduce inline whitespace", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void headers_col_wsp () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("headers whitespace surrounding colon ignored", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + #endregion + #region Existant Seal Headers + + [Test] + public void i0_base () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=0 basic test", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void i1_base () + { + const string input = @"Authentication-Results: lists.example.org; arc=pass; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=KalMXVkx0O4PZIytFfe3i6B/c64408LkuF6rYR9HzBsTazolbsFg/nTah+zh9xmVnylcbg + gZnvu+Rte97HXb9fCK6/rAJQJ97NvYVgzwnEiAzCDts/3dS3SO+PyoAV2HxGMQlUgNeqidAc + mpm7kE3NbSpgq8Z/rsK5FZ7ADceXw=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm + 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v + rCB4wHD9GADeUKVfHzmpZhFuYOa88=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=KiRMwS+rbu4ScgsYQGrZdW72DMVPKRnmkXigPU2FpNPTRViMIRIclMAa48kvbOJ/APWJuG eX3uW2PfI3u2EKtDitHFLvlU2LlCkHhyp8HSO5VJFr0aAk9Z3aQhcoE5hWJ061NXe8C1nafG 4ctcT8p0xkTjVrL9EVsz26o0mRlXY=; cv=pass; d=example.org; i=2; s=dummy; t=12346"; + const string ams = "a=rsa-sha256; b=UaNJhLFAa56Gpc+wKk0SL2Jq/LJgT9CYSZl59wcGYkpG0D5bjhDdj3qers6hD+3BpljNgn mFxq8zWssoPon3ydvTSCSjVwPRNgLol9zBP+FZo/QGQQbj74ZcGv04jOVe8TKDTFSaVe41L7 mH16ZdoLgRdSa2Ys+p9f0+DVFYTO4=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=2; s=dummy; t=12346"; + const string aar = "i=2; lists.example.org; arc=pass; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=1 basic test", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12346, hdrs, aar, ams, seal); + } + + [Test] + public void i2_base () + { + const string input = @"Authentication-Results: lists.example.org; arc=pass; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=I8bdOhGPwqIRyhSYZysZdwFJmD/gRxZR3Dn8BQdKkv3fOsWG8A2aftWwnAHKsNreVi6MUF + W4M3tVxsG+pF52qzl3zQGn3bkQIS1N700fbu0z0Lg8IW/gcxziGJlLgK5Bk70uN1egGgdLwn + SiywwvouD7BX1ZlkxFk9i84SDf8/w=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=UaNJhLFAa56Gpc+wKk0SL2Jq/LJgT9CYSZl59wcGYkpG0D5bjhDdj3qers6hD+3BpljNgn + mFxq8zWssoPon3ydvTSCSjVwPRNgLol9zBP+FZo/QGQQbj74ZcGv04jOVe8TKDTFSaVe41L7 + mH16ZdoLgRdSa2Ys+p9f0+DVFYTO4=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; arc=pass; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=KalMXVkx0O4PZIytFfe3i6B/c64408LkuF6rYR9HzBsTazolbsFg/nTah+zh9xmVnylcbg + gZnvu+Rte97HXb9fCK6/rAJQJ97NvYVgzwnEiAzCDts/3dS3SO+PyoAV2HxGMQlUgNeqidAc + mpm7kE3NbSpgq8Z/rsK5FZ7ADceXw=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm + 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v + rCB4wHD9GADeUKVfHzmpZhFuYOa88=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=amYobvirySPk39Y45uHWIsJOGQ0pDhn3D8ncaOew7h+9cddITDFGght2qHYE0GLdpDtLUG J1CwEoM6hdVhG6BkJ80vHzy09Wj2id7B3DMpytPm9MjU7K6Le9VGdewFItwhmG+c15l8krp6 sKw7wUlgM60lSZT0EYTC2x8NXjNDI=; cv=pass; d=example.org; i=3; s=dummy; t=12347"; + const string ams = "a=rsa-sha256; b=QmCd8uJdwnr6wMmniYA/VHCuWButAIlcPZSpNWvk8KHgTuFMZlCPQToT2qVpf2BUfdNpnC mSCED02aLfV6Grc6caqO4PIaxyu3Z+/HNxh0NugIW2JVHT1cZicWkwlgZa4V9i+CYFBAYmzb L0n4ibTxSX8XPxR9ffZdknwiLmYsA=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=3; s=dummy; t=12347"; + const string aar = "i=3; lists.example.org; arc=pass; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=2 basic test", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12347, hdrs, aar, ams, seal); + } + + [Test] + public void i1_base_fail () + { + const string input = @"Authentication-Results: lists.example.org; arc=fail; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=kalMXVkx0O4PZIytFfe3i6B/c64408LkuF6rYR9HzBsTazolbsFg/nTah+zh9xmVnylcbg + gZnvu+Rte97HXb9fCK6/rAJQJ97NvYVgzwnEiAzCDts/3dS3SO+PyoAV2HxGMQlUgNeqidAc + mpm7kE3NbSpgq8Z/rsK5FZ7ADceXw=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm + 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v + rCB4wHD9GADeUKVfHzmpZhFuYOa88=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=1NUXYB6dkzvHNNuAxkPWkze6te3YkN29XbS1WtqXGPKmwZujBYH8Au3eMW+pKUnCFSK4Bj tyh0/cTU4jKwxE7sVnGV7BbwW8FdRsYSOgT5RCq3GBuWq5SAW5jDzTIoSMU5joN+jU55xw8a mcpcAZse7+iQbftRJflGDEyHZH8s4=; cv=fail; d=example.org; i=2; s=dummy; t=12346"; + const string ams = "a=rsa-sha256; b=UaNJhLFAa56Gpc+wKk0SL2Jq/LJgT9CYSZl59wcGYkpG0D5bjhDdj3qers6hD+3BpljNgn mFxq8zWssoPon3ydvTSCSjVwPRNgLol9zBP+FZo/QGQQbj74ZcGv04jOVe8TKDTFSaVe41L7 mH16ZdoLgRdSa2Ys+p9f0+DVFYTO4=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=2; s=dummy; t=12346"; + const string aar = "i=2; lists.example.org; arc=fail; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=1 basic test with failing arc set", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12346, hdrs, aar, ams, seal); + } + + [Test] + public void i2_base_fail () + { + const string input = @"Authentication-Results: lists.example.org; arc=fail; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=i8bdOhGPwqIRyhSYZysZdwFJmD/gRxZR3Dn8BQdKkv3fOsWG8A2aftWwnAHKsNreVi6MUF + W4M3tVxsG+pF52qzl3zQGn3bkQIS1N700fbu0z0Lg8IW/gcxziGJlLgK5Bk70uN1egGgdLwn + SiywwvouD7BX1ZlkxFk9i84SDf8/w=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=UaNJhLFAa56Gpc+wKk0SL2Jq/LJgT9CYSZl59wcGYkpG0D5bjhDdj3qers6hD+3BpljNgn + mFxq8zWssoPon3ydvTSCSjVwPRNgLol9zBP+FZo/QGQQbj74ZcGv04jOVe8TKDTFSaVe41L7 + mH16ZdoLgRdSa2Ys+p9f0+DVFYTO4=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; arc=pass; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=KalMXVkx0O4PZIytFfe3i6B/c64408LkuF6rYR9HzBsTazolbsFg/nTah+zh9xmVnylcbg + gZnvu+Rte97HXb9fCK6/rAJQJ97NvYVgzwnEiAzCDts/3dS3SO+PyoAV2HxGMQlUgNeqidAc + mpm7kE3NbSpgq8Z/rsK5FZ7ADceXw=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm + 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v + rCB4wHD9GADeUKVfHzmpZhFuYOa88=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.organ> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=P3oIsF0qE5VDD1XPP0oH5XkvpG20k9jmkREcWvi1I9uy6P4UP9Y7mVYTAsNdi8XOg+AMiG CT1CUTmR5+MyYC4mqFW6943PIyzDrDvhZb8DLoy5/tM2cztpSzS0SItqM2XRh0YGp0yMA1sz obc7WTpkgtqFz5beCQC/PjnQ3ZkRw=; cv=fail; d=example.org; i=3; s=dummy; t=12347"; + const string ams = "a=rsa-sha256; b=QmCd8uJdwnr6wMmniYA/VHCuWButAIlcPZSpNWvk8KHgTuFMZlCPQToT2qVpf2BUfdNpnC mSCED02aLfV6Grc6caqO4PIaxyu3Z+/HNxh0NugIW2JVHT1cZicWkwlgZa4V9i+CYFBAYmzb L0n4ibTxSX8XPxR9ffZdknwiLmYsA=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=3; s=dummy; t=12347"; + const string aar = "i=3; lists.example.org; arc=fail; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=1 basic test", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12347, hdrs, aar, ams, seal); + } + + [Test] + public void no_additional_sig () + { + const string input = @"Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=OrYKWzAKrroSe2lCeF+/5QJOSzJi/RSTggVcdINMmJ8TO8wfkRLaJkAnhLhNts5lnJIDI7 + ZFUmsbtZ6ZhBK5l6WzaE5+iDofcUTjKMFw7keblIE6Frp8Evsb2ShKQZDIseXZxcNHr/Oz0t + pSKS2JwAriD3rkXm6WVR0Jv+wDFQo=; cv=fail; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=UaNJhLFAa56Gpc+wKk0SL2Jq/LJgT9CYSZl59wcGYkpG0D5bjhDdj3qers6hD+3BpljNgn + mFxq8zWssoPon3ydvTSCSjVwPRNgLol9zBP+FZo/QGQQbj74ZcGv04jOVe8TKDTFSaVe41L7 + mH16ZdoLgRdSa2Ys+p9f0+DVFYTO4=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +ARC-Seal: a=rsa-sha256; + b=fOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=mime-version:date:from:to:subject; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = ""; + const string ams = ""; + const string aar = ""; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("if a chain is failing, dont add another set", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12346, hdrs, aar, ams, seal); + } + + [Test] + public void ar_merged1 () + { + const string input = @"Authentication-Results: lists.example.org; arc=none +Authentication-Results: lists.example.org; spf=pass smtp.mfrom=jqd@d1.example +Authentication-Results: lists.example.org; dkim=pass (1024-bit key) header.i=@d1.example +Authentication-Results: lists.example.org; dmarc=pass +Authentication-Results: nobody.example.org; something=ignored +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=0 basic test", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + [Test] + public void ar_merged2 () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example +Authentication-Results: lists.example.org; dkim=pass (1024-bit key) header.i=@d1.example +Authentication-Results: lists.example.org; dmarc=pass +Authentication-Results: nobody.example.org; something=ignored +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "a=rsa-sha256; b=Pg8Yyk1AgYy2l+kb6iy+mY106AXm5EdgDwJhLP7+XyT6yaS38ZUho+bmgSDorV+LyARH4A 967A/oWMX3coyC7pAGyI+hA3+JifL7P3/aIVP4ooRJ/WUgT79snPuulxE15jg6FgQE68ObA1 /hy77BxdbD9EQxFGNcr/wCKQoeKJ8=; cv=none; d=example.org; i=1; s=dummy; t=12345"; + const string ams = "a=rsa-sha256; b=XWeK9DxQ8MUm+Me5GLZ5lQ3L49RdoFv7m7VlrAkKb3/C7jjw33TrTY0KYI5lkowvEGnAtm 5lAqLz67FxA/VrJc2JiYFQR/mBoJLLz/hh9y77byYmSO9tLfIDe2A83+6QsXHO3K6PxTz7+v rCB4wHD9GADeUKVfHzmpZhFuYOa88=; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; d=example.org; h=mime-version:date:from:to:subject; i=1; s=dummy; t=12345"; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("i=0 basic test", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal); + } + + #endregion + } +} diff --git a/UnitTests/Cryptography/DummyArcSigner.cs b/UnitTests/Cryptography/DummyArcSigner.cs index 0c8a42eb11..c964b97c23 100644 --- a/UnitTests/Cryptography/DummyArcSigner.cs +++ b/UnitTests/Cryptography/DummyArcSigner.cs @@ -40,14 +40,21 @@ public DummyArcSigner (Stream stream, string domain, string selector, DkimSignat { } + public IDkimPublicKeyLocator PublicKeyLocator { + get; set; + } + public string SrvId { get; set; } - protected override Header GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken) + public long Timestamp { + get; set; + } + + protected override AuthenticationResults GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) { var results = new AuthenticationResults (SrvId); - results.Instance = instance; for (int i = 0; i < message.Headers.Count; i++) { var header = message.Headers[i]; @@ -67,12 +74,17 @@ protected override Header GenerateArcAuthenticationResults (FormatOptions option } } - return new Header (HeaderId.ArcAuthenticationResults, results.ToString ()); + return results; + } + + protected override Task GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) + { + return Task.FromResult (GenerateArcAuthenticationResults (options, message, cancellationToken)); } - protected override Task
GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, int instance, CancellationToken cancellationToken) + protected override long GetTimestamp () { - return Task.FromResult (GenerateArcAuthenticationResults (options, message, instance, cancellationToken)); + return Timestamp; } } } diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 624fa48fff..9642a7b54d 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -72,6 +72,7 @@ + diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index 3b1488957f..ab2755d121 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -68,6 +68,7 @@ public void TestAppendTokens () format.NewLineFormat = NewLineFormat.Unix; + tokens.Add (" "); tokens.Add ("this-is-a-really-long-parameter-name"); tokens.Add ("="); tokens.Add ("this-is-a-really-long-parameter-value"); From 19056010ba6210b8dedf4fc05081660964199aae Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 11:13:14 -0400 Subject: [PATCH 314/741] Added DkimSigner.GetTimestamp() virtual method as well In the future, I might redo the DkimSigner tests to override this in order to get consistent results. --- MimeKit/Cryptography/DkimSigner.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 4d9499e36e..2cc4b490a5 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -219,13 +219,25 @@ public string QueryMethod { get; set; } + /// + /// Get the timestamp value. + /// + /// + /// Gets the timestamp to use as the t= value in the DKIM-Signature header. + /// + /// A value representing the timestamp value. + protected virtual long GetTimestamp () + { + return (long) (DateTime.UtcNow - DateUtils.UnixEpoch).TotalSeconds; + } + void DkimSign (FormatOptions options, MimeMessage message, IList headers) { if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) message.MimeVersion = new Version (1, 0); - var t = DateTime.UtcNow - DateUtils.UnixEpoch; var value = new StringBuilder ("v=1"); + var t = GetTimestamp (); byte[] signature, hash; Header dkim; @@ -252,7 +264,7 @@ void DkimSign (FormatOptions options, MimeMessage message, IList headers value.AppendFormat ("; q={0}", QueryMethod); if (!string.IsNullOrEmpty (AgentOrUserIdentifier)) value.AppendFormat ("; i={0}", AgentOrUserIdentifier); - value.AppendFormat ("; t={0}", (long) t.TotalSeconds); + value.AppendFormat ("; t={0}", t); using (var stream = new DkimSignatureStream (CreateSigningContext ())) { using (var filtered = new FilteredStream (stream)) { From 12ca01769655b4480ed80e2793eadc947364223e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 11:19:47 -0400 Subject: [PATCH 315/741] Improved ArcSigner.GenerateArcAutheticationResults() documentation --- MimeKit/Cryptography/ArcSigner.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 95f917f202..a0fc701728 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -184,7 +184,11 @@ protected ArcSigner (Stream stream, string domain, string selector, DkimSignatur /// Generate an ARC-Authentication-Results header. ///
/// - /// Generates an ARC-Authentication-Results header. + /// Generates an ARC-Authentication-Results header. + /// If the returned contains a + /// with a equal to "arc", then the + /// will be used as the cv= tag value + /// in the ARC-Seal header generated by the . /// /// The format options. /// The message to create the ARC-Authentication-Results header for. @@ -196,7 +200,11 @@ protected ArcSigner (Stream stream, string domain, string selector, DkimSignatur /// Asynchronously generate an ARC-Authentication-Results header. ///
/// - /// Asynchronously generates an ARC-Authentication-Results header. + /// Asynchronously generates an ARC-Authentication-Results header. + /// If the returned contains a + /// with a equal to "arc", then the + /// will be used as the cv= tag value + /// in the ARC-Seal header generated by the . /// /// The format options. /// The message to create the ARC-Authentication-Results header for. From bd90a8f391e602c0ae43284154579a5a05a07810 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 11:48:36 -0400 Subject: [PATCH 316/741] Fixed ArcSigner to properly calculate the body hash --- MimeKit/Cryptography/ArcSigner.cs | 3 +++ UnitTests/Cryptography/ArcSignerTests.cs | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index a0fc701728..6473d4e9c0 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -350,6 +350,9 @@ async Task ArcSignAsync (FormatOptions options, MimeMessage message, IList Date: Wed, 5 Jun 2019 12:25:49 -0400 Subject: [PATCH 317/741] Fixed AppendTokens --- MimeKit/Utils/StringBuilderExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index 023d2e6de7..1b62ffb13c 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -63,6 +63,7 @@ public static void AppendTokens (this StringBuilder text, FormatOptions options, } else { lineLength += spaces.Length; text.Append (spaces); + spaces = string.Empty; } lineLength += token.Length; From 6086d7fbf72264b98afad4e4b6d026a7ea0d831f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 13:50:54 -0400 Subject: [PATCH 318/741] Added more unit tests for ArcSigner --- MimeKit/Cryptography/ArcSigner.cs | 2 +- UnitTests/Cryptography/ArcSignerTests.cs | 109 +++++++++++++++++++++++ UnitTests/Cryptography/DummyArcSigner.cs | 12 ++- 3 files changed, 121 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 6473d4e9c0..4147ac1893 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -47,7 +47,7 @@ namespace MimeKit.Cryptography { /// public abstract class ArcSigner : DkimSignerBase { - static readonly string[] ArcShouldNotInclude = { "arc-seal" }; + static readonly string[] ArcShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "arc-seal" }; /// /// Initializes a new instance of the class. diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index a67d62e421..79dfffd6a4 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -41,6 +41,115 @@ namespace UnitTests.Cryptography { [TestFixture] public class ArcSignerTests { + [Test] + public void TestArcSignerCtors () + { + Assert.DoesNotThrow (() => { + var signer = new DummyArcSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { + SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha256 + }; + }); + + AsymmetricCipherKeyPair keys; + + using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + var reader = new PemReader (stream); + + keys = reader.ReadObject () as AsymmetricCipherKeyPair; + } + + Assert.DoesNotThrow (() => { + var signer = new DummyArcSigner (keys.Private, "example.com", "1433868189.example") { + SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha256 + }; + }); + } + + [Test] + public void TestArcSignerDefaults () + { + var path = Path.Combine ("..", "..", "TestData", "dkim", "example.pem"); + AsymmetricCipherKeyPair keys; + ArcSigner signer; + + using (var stream = new StreamReader (path)) { + var reader = new PemReader (stream); + + keys = reader.ReadObject () as AsymmetricCipherKeyPair; + } + + signer = new DummyArcSigner (keys.Private, "example.com", "1433868189.example"); + Assert.AreEqual (DkimSignatureAlgorithm.RsaSha256, signer.SignatureAlgorithm, "SignatureAlgorithm #1"); + + signer = new DummyArcSigner (path, "example.com", "1433868189.example"); + Assert.AreEqual (DkimSignatureAlgorithm.RsaSha256, signer.SignatureAlgorithm, "SignatureAlgorithm #2"); + + using (var stream = File.OpenRead (path)) { + signer = new DummyArcSigner (stream, "example.com", "1433868189.example"); + Assert.AreEqual (DkimSignatureAlgorithm.RsaSha256, signer.SignatureAlgorithm, "SignatureAlgorithm #3"); + } + } + + [Test] + public void TestArgumentExceptions () + { + var path = Path.Combine ("..", "..", "TestData", "dkim", "example.pem"); + var locator = new DkimPublicKeyLocator (); + var verifier = new DkimVerifier (locator); + var dkimHeader = new Header (HeaderId.DkimSignature, "value"); + var arcHeader = new Header (HeaderId.ArcMessageSignature, "value"); + var options = FormatOptions.Default; + var message = new MimeMessage (); + AsymmetricCipherKeyPair keys; + ArcSigner signer; + + using (var stream = new StreamReader (path)) { + var reader = new PemReader (stream); + + keys = reader.ReadObject () as AsymmetricCipherKeyPair; + } + + Assert.Throws (() => new DummyArcSigner ((AsymmetricKeyParameter) null, "domain", "selector")); + Assert.Throws (() => new DummyArcSigner (keys.Public, "domain", "selector")); + Assert.Throws (() => new DummyArcSigner (keys.Private, null, "selector")); + Assert.Throws (() => new DummyArcSigner (keys.Private, "domain", null)); + Assert.Throws (() => new DummyArcSigner ((string) null, "domain", "selector")); + Assert.Throws (() => new DummyArcSigner ("fileName", null, "selector")); + Assert.Throws (() => new DummyArcSigner ("fileName", "domain", null)); + Assert.Throws (() => new DummyArcSigner (string.Empty, "domain", "selector")); + Assert.Throws (() => new DummyArcSigner ((Stream) null, "domain", "selector")); + using (var stream = File.OpenRead (path)) { + Assert.Throws (() => new DummyArcSigner (stream, null, "selector")); + Assert.Throws (() => new DummyArcSigner (stream, "domain", null)); + + signer = new DummyArcSigner (stream, "example.com", "1433868189.example") { + SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1 + }; + } + + Assert.Throws (() => signer.Sign (null, new HeaderId[] { HeaderId.From })); + Assert.Throws (() => signer.Sign (message, (IList) null)); + Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); + Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.Received, HeaderId.From })); + Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.ContentType })); + Assert.Throws (() => signer.Sign (null, new string[] { "From" })); + Assert.Throws (() => signer.Sign (message, (IList) null)); + Assert.Throws (() => signer.Sign (message, new string[] { "", "From" })); + Assert.Throws (() => signer.Sign (message, new string[] { null, "From" })); + Assert.Throws (() => signer.Sign (message, new string[] { "Received", "From" })); + Assert.Throws (() => signer.Sign (message, new string[] { "Content-Type" })); + + Assert.Throws (() => signer.Sign (null, message, new HeaderId[] { HeaderId.From })); + Assert.Throws (() => signer.Sign (options, null, new HeaderId[] { HeaderId.From })); + Assert.Throws (() => signer.Sign (options, message, new HeaderId[] { HeaderId.From, HeaderId.Unknown })); + Assert.Throws (() => signer.Sign (options, message, (IList) null)); + + Assert.Throws (() => signer.Sign (null, message, new string[] { "From" })); + Assert.Throws (() => signer.Sign (options, null, new string[] { "From" })); + Assert.Throws (() => signer.Sign (options, message, new string[] { "From", null })); + Assert.Throws (() => signer.Sign (options, message, (IList) null)); + } + static void AssertHeadersEqual (string description, HeaderId id, string expected, string actual) { var expectedTags = DkimVerifierBase.ParseParameterTags (id, expected); diff --git a/UnitTests/Cryptography/DummyArcSigner.cs b/UnitTests/Cryptography/DummyArcSigner.cs index c964b97c23..9aa5518faa 100644 --- a/UnitTests/Cryptography/DummyArcSigner.cs +++ b/UnitTests/Cryptography/DummyArcSigner.cs @@ -30,13 +30,23 @@ using System.Threading; using System.Threading.Tasks; +using Org.BouncyCastle.Crypto; + using MimeKit; using MimeKit.Cryptography; namespace UnitTests.Cryptography { public class DummyArcSigner : ArcSigner { - public DummyArcSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm) : base (stream, domain, selector, algorithm) + public DummyArcSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (stream, domain, selector, algorithm) + { + } + + public DummyArcSigner (string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (fileName, domain, selector, algorithm) + { + } + + public DummyArcSigner (AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (key, domain, selector, algorithm) { } From af4eddd258a8b2d14d611f3adc0c7979be8020a0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 17:19:00 -0400 Subject: [PATCH 319/741] Added more unit tests for ArcSigner --- UnitTests/Cryptography/ArcSignerTests.cs | 26 ++++++++++++++++++++++++ UnitTests/UnitTests.csproj | 16 +++++---------- UnitTests/packages.config | 4 ++-- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 79dfffd6a4..63d4d5d0ce 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -127,6 +127,8 @@ public void TestArgumentExceptions () }; } + // Sign + Assert.Throws (() => signer.Sign (null, new HeaderId[] { HeaderId.From })); Assert.Throws (() => signer.Sign (message, (IList) null)); Assert.Throws (() => signer.Sign (message, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); @@ -148,6 +150,30 @@ public void TestArgumentExceptions () Assert.Throws (() => signer.Sign (options, null, new string[] { "From" })); Assert.Throws (() => signer.Sign (options, message, new string[] { "From", null })); Assert.Throws (() => signer.Sign (options, message, (IList) null)); + + // SignAsync + + Assert.Throws (async () => await signer.SignAsync (null, new HeaderId[] { HeaderId.From })); + Assert.Throws (async () => await signer.SignAsync (message, (IList) null)); + Assert.Throws (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); + Assert.Throws (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.Received, HeaderId.From })); + Assert.Throws (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.ContentType })); + Assert.Throws (async () => await signer.SignAsync (null, new string[] { "From" })); + Assert.Throws (async () => await signer.SignAsync (message, (IList) null)); + Assert.Throws (async () => await signer.SignAsync (message, new string[] { "", "From" })); + Assert.Throws (async () => await signer.SignAsync (message, new string[] { null, "From" })); + Assert.Throws (async () => await signer.SignAsync (message, new string[] { "Received", "From" })); + Assert.Throws (async () => await signer.SignAsync (message, new string[] { "Content-Type" })); + + Assert.Throws (async () => await signer.SignAsync (null, message, new HeaderId[] { HeaderId.From })); + Assert.Throws (async () => await signer.SignAsync (options, null, new HeaderId[] { HeaderId.From })); + Assert.Throws (async () => await signer.SignAsync (options, message, new HeaderId[] { HeaderId.From, HeaderId.Unknown })); + Assert.Throws (async () => await signer.SignAsync (options, message, (IList) null)); + + Assert.Throws (async () => await signer.SignAsync (null, message, new string[] { "From" })); + Assert.Throws (async () => await signer.SignAsync (options, null, new string[] { "From" })); + Assert.Throws (async () => await signer.SignAsync (options, message, new string[] { "From", null })); + Assert.Throws (async () => await signer.SignAsync (options, message, (IList) null)); } static void AssertHeadersEqual (string description, HeaderId id, string expected, string actual) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 9642a7b54d..57932b1c2e 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -42,9 +42,6 @@ - - ..\packages\System.Data.SQLite.Core.1.0.109.2\lib\net45\System.Data.SQLite.dll - @@ -57,7 +54,10 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + + ..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net45\System.Data.SQLite.dll @@ -352,11 +352,5 @@ - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 8cdc83a476..44be7b9ecf 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,7 +1,7 @@  - + - + \ No newline at end of file From 4448082bc3b6fef8be86f8d4feba28571fe1364b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 5 Jun 2019 21:35:36 -0400 Subject: [PATCH 320/741] Moved MimeVersion setting logic into MimeMessage.Prepare() This logic should not be in the DkimSigner/ArcSigner. --- MimeKit/Cryptography/ArcSigner.cs | 3 --- MimeKit/Cryptography/DkimSigner.cs | 3 --- MimeKit/MimeMessage.cs | 6 +++++- UnitTests/Cryptography/DkimTests.cs | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 4147ac1893..7d1689d15f 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -247,9 +247,6 @@ StringBuilder CreateArcHeaderBuilder (int instance) Header GenerateArcMessageSignature (FormatOptions options, MimeMessage message, int instance, long t, IList headers) { - if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) - message.MimeVersion = new Version (1, 0); - var value = CreateArcHeaderBuilder (instance); byte[] signature, hash; Header ams; diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 2cc4b490a5..c2c84b73f2 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -233,9 +233,6 @@ protected virtual long GetTimestamp () void DkimSign (FormatOptions options, MimeMessage message, IList headers) { - if (message.MimeVersion == null && message.Body != null && message.Body.Headers.Count > 0) - message.MimeVersion = new Version (1, 0); - var value = new StringBuilder ("v=1"); var t = GetTimestamp (); byte[] signature, hash; diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 220e7281d4..9699cff840 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1046,8 +1046,12 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (maxLineLength < FormatOptions.MinimumLineLength || maxLineLength > FormatOptions.MaximumLineLength) throw new ArgumentOutOfRangeException (nameof (maxLineLength)); - if (Body != null) + if (Body != null) { + if (MimeVersion == null && Body.Headers.Count > 0) + MimeVersion = new Version (1, 0); + Body.Prepare (constraint, maxLineLength); + } } /// diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 8082a58113..119b96c1a7 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -250,7 +250,7 @@ static void TestEmptyBody (DkimSignatureAlgorithm signatureAlgorithm, DkimCanoni message.Body = new TextPart ("plain") { Text = "" }; - message.Body.Prepare (EncodingConstraint.SevenBit); + message.Prepare (EncodingConstraint.SevenBit); signer.Sign (message, headers); @@ -473,7 +473,7 @@ static void TestUnicode (DkimSignatureAlgorithm signatureAlgorithm, DkimCanonica ((Multipart) message.Body).Boundary = "=-MultipartAlternativeBoundary"; ((Multipart) message.Body)[1].ContentId = null; - message.Body.Prepare (EncodingConstraint.EightBit); + message.Prepare (EncodingConstraint.EightBit); signer.Sign (message, headers); From 6eef8660ffc8e0a0cc1ada0cc3feb6a9dac4d5b6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 6 Jun 2019 20:59:06 -0400 Subject: [PATCH 321/741] Added unit tests for ArcVerifier.VerifyAsync() and ArcSigner.SignAsync() --- UnitTests/Cryptography/ArcSignerTests.cs | 91 +++++++++++++++------- UnitTests/Cryptography/ArcVerifierTests.cs | 7 +- 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 63d4d5d0ce..6aa0cef8cf 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -198,6 +198,41 @@ static void AssertHeadersEqual (string description, HeaderId id, string expected } } + static void AssertSignResults (string description, MimeMessage message, DkimPublicKeyLocator locator, string aar, string ams, string seal) + { + Header header; + int index; + + if (string.IsNullOrEmpty (seal)) { + index = message.Headers.IndexOf (HeaderId.ArcSeal); + + Assert.AreNotEqual (0, index, "Message should not have been signed."); + } else { + index = message.Headers.IndexOf (HeaderId.ArcAuthenticationResults); + Assert.AreEqual (2, index, "IndexOf ARC-Authentication-Results header"); + header = message.Headers[index]; + Assert.AreEqual (aar, header.Value, "ARC-Authentication-Results headers do not match"); + + index = message.Headers.IndexOf (HeaderId.ArcMessageSignature); + Assert.AreEqual (1, index, "IndexOf ARC-Message-Signature header"); + header = message.Headers[index]; + AssertHeadersEqual (description, HeaderId.ArcMessageSignature, ams, header.Value); + + index = message.Headers.IndexOf (HeaderId.ArcSeal); + Assert.AreEqual (0, index, "IndexOf ARC-Seal header"); + header = message.Headers[index]; + AssertHeadersEqual (description, HeaderId.ArcSeal, seal, header.Value); + + var expected = ArcValidationResult.Pass; + if (header.Value.Contains ("cv=fail;")) + expected = ArcValidationResult.Fail; + var verifier = new ArcVerifier (locator); + var result = verifier.Verify (message); + + Assert.AreEqual (expected, result, "ArcSigner validation failed"); + } + } + static void Sign (string description, string input, DkimPublicKeyLocator locator, string srvid, string domain, string selector, string privateKey, long t, string[] hdrs, string aar, string ams, string seal) { ArcSigner signer; @@ -214,39 +249,35 @@ static void Sign (string description, string input, DkimPublicKeyLocator locator using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (input), false)) { var message = MimeMessage.Load (stream); - Header header; - int index; + // Test Sign(..., string[] headers, ...) signer.Sign (message, hdrs); + AssertSignResults (description, message, locator, aar, ams, seal); - if (string.IsNullOrEmpty (seal)) { - index = message.Headers.IndexOf (HeaderId.ArcSeal); - - Assert.AreNotEqual (0, index, "Message should not have been signed."); - } else { - index = message.Headers.IndexOf (HeaderId.ArcAuthenticationResults); - Assert.AreEqual (2, index, "IndexOf ARC-Authentication-Results header"); - header = message.Headers[index]; - Assert.AreEqual (aar, header.Value, "ARC-Authentication-Results headers do not match"); - - index = message.Headers.IndexOf (HeaderId.ArcMessageSignature); - Assert.AreEqual (1, index, "IndexOf ARC-Message-Signature header"); - header = message.Headers[index]; - AssertHeadersEqual (description, HeaderId.ArcMessageSignature, ams, header.Value); - - index = message.Headers.IndexOf (HeaderId.ArcSeal); - Assert.AreEqual (0, index, "IndexOf ARC-Seal header"); - header = message.Headers[index]; - AssertHeadersEqual (description, HeaderId.ArcSeal, seal, header.Value); - - var expected = ArcValidationResult.Pass; - if (header.Value.Contains ("cv=fail;")) - expected = ArcValidationResult.Fail; - var verifier = new ArcVerifier (locator); - var result = verifier.Verify (message); - - Assert.AreEqual (expected, result, "ArcSigner validation failed"); - } + stream.Position = 0; + message = MimeMessage.Load (stream); + + // Test SignAsync(..., string[] headers, ...) + signer.SignAsync (message, hdrs).GetAwaiter ().GetResult (); + AssertSignResults (description, message, locator, aar, ams, seal); + + var ids = new HeaderId[hdrs.Length]; + for (int i = 0; i < hdrs.Length; i++) + ids[i] = hdrs[i].ToHeaderId (); + + stream.Position = 0; + message = MimeMessage.Load (stream); + + // Test Sign(..., HeaderId[] headers, ...) + signer.Sign (message, hdrs); + AssertSignResults (description, message, locator, aar, ams, seal); + + stream.Position = 0; + message = MimeMessage.Load (stream); + + // Test SignAsync(..., HeaderId[] headers, ...) + signer.SignAsync (message, hdrs).GetAwaiter ().GetResult (); + AssertSignResults (description, message, locator, aar, ams, seal); } } diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index c3085bde3c..c7b54c852f 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -68,9 +68,14 @@ static void Validate (string description, string input, DkimPublicKeyLocator loc using (var stream = new MemoryStream (buffer, false)) { var verifier = new ArcVerifier (locator); var message = MimeMessage.Load (stream); + ArcValidationResult result; - var result = verifier.Verify (message); + // Test Verify() + result = verifier.Verify (message); + Assert.AreEqual (expected, result, description); + // Test VerifyAsync + result = verifier.VerifyAsync (message).GetAwaiter ().GetResult (); Assert.AreEqual (expected, result, description); } } From be5ff2b836fcf38c57367ad88fb711eb3281088c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 6 Jun 2019 21:07:14 -0400 Subject: [PATCH 322/741] minor code cleanup for ArcSigner --- MimeKit/Cryptography/ArcSigner.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 7d1689d15f..1ef5682d43 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -539,7 +539,7 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// public void Sign (MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) { - SignAsync (FormatOptions.Default, message, headers, false, cancellationToken).GetAwaiter ().GetResult (); + Sign (FormatOptions.Default, message, headers, cancellationToken); } /// @@ -567,7 +567,7 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// public Task SignAsync (MimeMessage message, IList headers, CancellationToken cancellationToken = default (CancellationToken)) { - return SignAsync (FormatOptions.Default, message, headers, true, cancellationToken); + return SignAsync (FormatOptions.Default, message, headers, cancellationToken); } /// From f40df6386b54a9ae1c96be553c2b607287cb3459 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 6 Jun 2019 21:23:27 -0400 Subject: [PATCH 323/741] Added unit tests for MimeMessage.WriteTo (Stream, bool headersOnly, ...) --- UnitTests/MimeMessageTests.cs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index dcf4f23898..18872ff7a4 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -85,12 +85,14 @@ public void TestArgumentExceptions () Assert.Throws (() => message.WriteTo ((string) null)); Assert.Throws (() => message.WriteTo ((Stream) null)); Assert.Throws (() => message.WriteTo (null, Stream.Null)); + Assert.Throws (() => message.WriteTo ((Stream) null, true)); Assert.Throws (() => message.WriteTo (FormatOptions.Default, (Stream) null)); Assert.Throws (() => message.WriteTo (null, "fileName")); Assert.Throws (() => message.WriteTo (FormatOptions.Default, (string) null)); Assert.Throws (async () => await message.WriteToAsync ((string) null)); Assert.Throws (async () => await message.WriteToAsync ((Stream) null)); Assert.Throws (async () => await message.WriteToAsync (null, Stream.Null)); + Assert.Throws (async () => await message.WriteToAsync ((Stream) null, true)); Assert.Throws (async () => await message.WriteToAsync (FormatOptions.Default, (Stream) null)); Assert.Throws (async () => await message.WriteToAsync (null, "fileName")); Assert.Throws (async () => await message.WriteToAsync (FormatOptions.Default, (string) null)); @@ -204,6 +206,31 @@ This is an attached message. Assert.AreEqual (rawMessageText, result, "Reserialized (async) message is not identical to the original."); } + + var index = rawMessageText.IndexOf ("\n\n", StringComparison.Ordinal); + var headersOnly = rawMessageText.Substring (0, index + 2); + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + message.WriteTo (options, serialized, true); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (headersOnly, result, "Reserialized headers are not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + await message.WriteToAsync (options, serialized, true); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (headersOnly, result, "Reserialized headers (async) are not identical to the original."); + } } } From d798d55c28359add244ade1a841f916464cd0de0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 6 Jun 2019 21:57:17 -0400 Subject: [PATCH 324/741] minor fixup to ArcSigner tests --- MimeKit/Cryptography/ArcVerifier.cs | 2 +- UnitTests/Cryptography/ArcSignerTests.cs | 4 ++-- UnitTests/Cryptography/DummyArcSigner.cs | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 3656d27545..b8e5e12dea 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -386,7 +386,7 @@ async Task VerifyAsync (FormatOptions options, MimeMessage throw new ArgumentNullException (nameof (options)); if (message == null) - throw new ArgumentNullException(nameof(message)); + throw new ArgumentNullException (nameof (message)); switch (GetArcHeaderSets (message, false, out ArcHeaderSet[] sets, out int count)) { case ArcValidationResult.None: return ArcValidationResult.None; diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 6aa0cef8cf..5423403d45 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -269,14 +269,14 @@ static void Sign (string description, string input, DkimPublicKeyLocator locator message = MimeMessage.Load (stream); // Test Sign(..., HeaderId[] headers, ...) - signer.Sign (message, hdrs); + signer.Sign (message, ids); AssertSignResults (description, message, locator, aar, ams, seal); stream.Position = 0; message = MimeMessage.Load (stream); // Test SignAsync(..., HeaderId[] headers, ...) - signer.SignAsync (message, hdrs).GetAwaiter ().GetResult (); + signer.SignAsync (message, ids).GetAwaiter ().GetResult (); AssertSignResults (description, message, locator, aar, ams, seal); } } diff --git a/UnitTests/Cryptography/DummyArcSigner.cs b/UnitTests/Cryptography/DummyArcSigner.cs index 9aa5518faa..75748236c1 100644 --- a/UnitTests/Cryptography/DummyArcSigner.cs +++ b/UnitTests/Cryptography/DummyArcSigner.cs @@ -94,6 +94,8 @@ protected override Task GenerateArcAuthenticationResultsA protected override long GetTimestamp () { + base.GetTimestamp (); + return Timestamp; } } From 1e7feef840fdcb2f940353a8d506f5d2fe57286d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 6 Jun 2019 22:28:04 -0400 Subject: [PATCH 325/741] Added more DkimSigner/Verifier tests --- UnitTests/Cryptography/ArcSignerTests.cs | 133 ++++++++++++++++++++--- 1 file changed, 117 insertions(+), 16 deletions(-) diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 5423403d45..3f533ac1fa 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -33,6 +33,7 @@ using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Crypto.Parameters; using MimeKit; using MimeKit.Cryptography; @@ -198,7 +199,7 @@ static void AssertHeadersEqual (string description, HeaderId id, string expected } } - static void AssertSignResults (string description, MimeMessage message, DkimPublicKeyLocator locator, string aar, string ams, string seal) + static void AssertSignResults (string description, MimeMessage message, DkimPublicKeyLocator locator, DkimSignatureAlgorithm algorithm, string aar, string ams, string seal) { Header header; int index; @@ -227,39 +228,60 @@ static void AssertSignResults (string description, MimeMessage message, DkimPubl if (header.Value.Contains ("cv=fail;")) expected = ArcValidationResult.Fail; var verifier = new ArcVerifier (locator); - var result = verifier.Verify (message); + ArcValidationResult result; + + if (!verifier.IsEnabled (algorithm)) { + result = verifier.Verify (message); + + Assert.AreEqual (ArcValidationResult.Fail, result, "Disabled algorithm should fail"); + + verifier.Enable (algorithm); + } + + result = verifier.Verify (message); Assert.AreEqual (expected, result, "ArcSigner validation failed"); } } - static void Sign (string description, string input, DkimPublicKeyLocator locator, string srvid, string domain, string selector, string privateKey, long t, string[] hdrs, string aar, string ams, string seal) + static void Sign (string description, string input, DkimPublicKeyLocator locator, string srvid, string domain, string selector, + string privateKey, long t, string[] hdrs, string aar, string ams, string seal, + DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256, + DkimCanonicalizationAlgorithm headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + DkimCanonicalizationAlgorithm bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed) { - ArcSigner signer; + DummyArcSigner signer; - using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (privateKey), false)) { - signer = new DummyArcSigner (stream, domain, selector, DkimSignatureAlgorithm.RsaSha256) { - HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, - BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, - PublicKeyLocator = locator, - Timestamp = t, - SrvId = srvid - }; + if (algorithm == DkimSignatureAlgorithm.Ed25519Sha256) { + var rawData = Convert.FromBase64String ("nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A="); + var key = new Ed25519PrivateKeyParameters (rawData, 0); + + signer = new DummyArcSigner (key, domain, selector, algorithm); + } else { + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (privateKey), false)) { + signer = new DummyArcSigner (stream, domain, selector, algorithm); + } } + signer.HeaderCanonicalizationAlgorithm = headerAlgorithm; + signer.BodyCanonicalizationAlgorithm = bodyAlgorithm; + signer.PublicKeyLocator = locator; + signer.Timestamp = t; + signer.SrvId = srvid; + using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (input), false)) { var message = MimeMessage.Load (stream); // Test Sign(..., string[] headers, ...) signer.Sign (message, hdrs); - AssertSignResults (description, message, locator, aar, ams, seal); + AssertSignResults (description, message, locator, algorithm, aar, ams, seal); stream.Position = 0; message = MimeMessage.Load (stream); // Test SignAsync(..., string[] headers, ...) signer.SignAsync (message, hdrs).GetAwaiter ().GetResult (); - AssertSignResults (description, message, locator, aar, ams, seal); + AssertSignResults (description, message, locator, algorithm, aar, ams, seal); var ids = new HeaderId[hdrs.Length]; for (int i = 0; i < hdrs.Length; i++) @@ -270,17 +292,96 @@ static void Sign (string description, string input, DkimPublicKeyLocator locator // Test Sign(..., HeaderId[] headers, ...) signer.Sign (message, ids); - AssertSignResults (description, message, locator, aar, ams, seal); + AssertSignResults (description, message, locator, algorithm, aar, ams, seal); stream.Position = 0; message = MimeMessage.Load (stream); // Test SignAsync(..., HeaderId[] headers, ...) signer.SignAsync (message, ids).GetAwaiter ().GetResult (); - AssertSignResults (description, message, locator, aar, ams, seal); + AssertSignResults (description, message, locator, algorithm, aar, ams, seal); } } + [Test] + public void sig_alg_rsa_sha1 () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "i=1; a=rsa-sha1; cv=none; d=example.org; s=dummy; t=12345; b=eF3i/65gJXfQu4kMAiK+EusLS0irqv6gIyJYEcpJTaASwWZd+vt6+nN7pjP7kDZYwno8gVFS5vFrkc959FBjJr1oWVVbVdrJenYqCvBBnFmrYyhG137vV+7RziHerQCJ44VkrF1VEaj7TQ+rp5rmwUMZQlpxdqUYWTIT9DpYAFs="; + const string ams = "i=1; a=rsa-sha1; d=example.org; s=dummy; c=relaxed/relaxed; t=12345; h=mime-version:date:from:to:subject; bh=bIxxaeIQvmOBdTAitYfSNFgzPP4=; b=qh2z8AFVMdUI4pG3EBTn9+3Af3KU0tmlLUOeUnCsWuigUdE7TTGLirz2ZOeFUAjAeHuKFxJjEPbtYtQh9ptuxZ8Mn9sE/AfIBd85q2yHWu3WOGQFwRrEuLekiH/zXG3d7VUhf8PNveHEXx/NI40qBpPLjXF4o8qxoApGEQZ6CjA="; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("a=rsa-sha1", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal, DkimSignatureAlgorithm.RsaSha1); + } + + [Test] + public void sig_alg_ed25519_sha256 () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = "nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A="; + const string seal = "i=1; a=ed25519-sha256; cv=none; d=example.org; s=dummy; t=12345; b=1VlNt2DJiRslGH64VEByTy/rviHk9vVjzaFb6Jd4C5V01Uy9pyrZwa6vwPdUZgrnymXzbz2qgtGyHKd3oYHABg=="; + const string ams = "i=1; a=ed25519-sha256; d=example.org; s=dummy; c=relaxed/relaxed; t=12345; h=mime-version:date:from:to:subject; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; b=f3EEIg6djos7u74HzwTwQaZmCt3jhoQe/PnDsLfnOd5i6slE0MJdoR4lgBOAZMh+nTLF7YfsHF/qopJwoPBQDg=="; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="); + + Sign ("a=ed25519-sha256", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal, DkimSignatureAlgorithm.Ed25519Sha256); + } + #region Canonicalization [Test] From 3508492f9da65e5089503a67e579423635e73cb9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 7 Jun 2019 07:31:43 -0400 Subject: [PATCH 326/741] Added c=simple/simple unit test for ArcSigner --- UnitTests/Cryptography/ArcSignerTests.cs | 49 +++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 3f533ac1fa..a9c07f2a24 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -253,7 +253,7 @@ static void Sign (string description, string input, DkimPublicKeyLocator locator DummyArcSigner signer; if (algorithm == DkimSignatureAlgorithm.Ed25519Sha256) { - var rawData = Convert.FromBase64String ("nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A="); + var rawData = Convert.FromBase64String (privateKey); var key = new Ed25519PrivateKeyParameters (rawData, 0); signer = new DummyArcSigner (key, domain, selector, algorithm); @@ -382,6 +382,53 @@ This is a test message. Sign ("a=ed25519-sha256", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal, DkimSignatureAlgorithm.Ed25519Sha256); } + [Test] + public void c_simple_simple () + { + const string input = @"Authentication-Results: lists.example.org; arc=none; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +MIME-Version: 1.0 +Return-Path: +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + const string keyblock = @"-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQi +Y/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqM +KrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB +AoGAH0cxOhFZDgzXWhDhnAJDw5s4roOXN4OhjiXa8W7Y3rhX3FJqmJSPuC8N9vQm +6SVbaLAE4SG5mLMueHlh4KXffEpuLEiNp9Ss3O4YfLiQpbRqE7Tm5SxKjvvQoZZe +zHorimOaChRL2it47iuWxzxSiRMv4c+j70GiWdxXnxe4UoECQQDzJB/0U58W7RZy +6enGVj2kWF732CoWFZWzi1FicudrBFoy63QwcowpoCazKtvZGMNlPWnC7x/6o8Gc +uSe0ga2xAkEA8C7PipPm1/1fTRQvj1o/dDmZp243044ZNyxjg+/OPN0oWCbXIGxy +WvmZbXriOWoSALJTjExEgraHEgnXssuk7QJBALl5ICsYMu6hMxO73gnfNayNgPxd +WFV6Z7ULnKyV7HSVYF0hgYOHjeYe9gaMtiJYoo0zGN+L3AAtNP9huqkWlzECQE1a +licIeVlo1e+qJ6Mgqr0Q7Aa7falZ448ccbSFYEPD6oFxiOl9Y9se9iYHZKKfIcst +o7DUw1/hz2Ck4N5JrgUCQQCyKveNvjzkkd8HjYs0SwM0fPjK16//5qDZ2UiDGnOe +uEzxBDAr518Z8VFbR41in3W4Y3yCDgQlLlcETrS+zYcL +-----END RSA PRIVATE KEY----- +"; + const string seal = "i=1; a=rsa-sha256; cv=none; d=example.org; s=dummy; t=12345; b=utRLvF0lNhc2EUk27iMDUrE7jKP4eGWRy9iUKvmgcZtXY8f4x7r5zz8WzLzOUKo8KyUSgnzVWyyxtMqoAcGzzb/1HtwsEiT+B79pCkZDNqcH2E5dHHq7z8/QBwjScZWu3qFaFDtnMktVs13AMc6W1vgAueOyFjH3mdHmAbQBQaY="; + const string ams = "i=1; a=rsa-sha256; d=example.org; s=dummy; c=simple/simple; t=12345; h=mime-version:date:from:to:subject; bh=hhFbTjokraRYc/Af+8v4zyKm/9ApHGkBSLO129NtPbo=; b=GTpRE34Ud8TOECxNCRNw4jSncvc1nTlLNr6OJC6AjxmumsW2dvQglYIYJK5NO7zPKwzTVUlVB6ZznpIzaKJzsy5oBxV2frl5p5ZBFKGeiU94O0byPiATdwHe4lQiYUK5hBQV0Ei2sxSSlbQPXqjDymnZDcMPp/fLhDQETrjE6AI="; + const string aar = "i=1; lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass"; + var hdrs = new string[] { "mime-version", "date", "from", "to", "subject" }; + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3idY6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lxj+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + Sign ("a=rsa-sha256", input, locator, "lists.example.org", "example.org", "dummy", keyblock, 12345, hdrs, aar, ams, seal, DkimSignatureAlgorithm.RsaSha256, DkimCanonicalizationAlgorithm.Simple, DkimCanonicalizationAlgorithm.Simple); + } + #region Canonicalization [Test] From 00816df81c782f58d26dd1fbd69c2b0e14a9b950 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 7 Jun 2019 12:16:34 -0400 Subject: [PATCH 327/741] Updated ArcVerifier.Verify() to return more details --- MimeKit/Cryptography/ArcVerifier.cs | 218 +++++- UnitTests/Cryptography/ArcSignerTests.cs | 8 +- UnitTests/Cryptography/ArcVerifierTests.cs | 813 ++++++++++++++++----- 3 files changed, 824 insertions(+), 215 deletions(-) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index b8e5e12dea..557822f067 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -37,15 +37,15 @@ namespace MimeKit.Cryptography { /// - /// An ARC validation result. + /// An ARC signature validation result. /// /// - /// An ARC validation result. + /// An ARC signature validation result. /// - public enum ArcValidationResult + public enum ArcSignatureValidationResult { /// - /// No validation was performed. + /// No signatures to validate. /// None, @@ -60,7 +60,142 @@ public enum ArcValidationResult Fail } - internal class ArcHeaderSet + /// + /// An ARC header validation result. + /// + /// + /// Represents an ARC header and its signature validation result. + /// + public class ArcHeaderValidationResult + { + /// + /// Initializes a new instance of the class. + /// + /// The ARC header. + /// + /// is null. + /// + internal ArcHeaderValidationResult (Header header) + { + if (header == null) + throw new ArgumentNullException (nameof (header)); + + Header = header; + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The ARC header. + /// The signature validation result. + /// + /// is null. + /// + public ArcHeaderValidationResult (Header header, ArcSignatureValidationResult signature) : this (header) + { + Signature = signature; + } + + /// + /// Get the signature validation result. + /// + /// + /// Gets the signature validation result. + /// + /// The signature validation result. + public ArcSignatureValidationResult Signature { + get; internal set; + } + + /// + /// Get the ARC header. + /// + /// + /// Gets the ARC header. + /// + /// The ARC header. + public Header Header { + get; private set; + } + } + + /// + /// An ARC validation result. + /// + /// + /// Represents the results of ArcVerifier.Verify + /// or ArcVerifier.VerifyAsync. + /// If no ARC headers are found on the , then the result will be + /// and both and + /// will be null. + /// If ARC headers are found on the but could not be parsed, then the + /// result will be and both + /// and will be null. + /// + public class ArcValidationResult + { + internal ArcValidationResult () + { + Chain = ArcSignatureValidationResult.None; + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The signature validation results of the entire chain. + /// The validation results for the ARC-Message-Signature header. + /// The validation results for the ARC-Seal headers. + public ArcValidationResult (ArcSignatureValidationResult chain, ArcHeaderValidationResult messageSignature, ArcHeaderValidationResult[] seals) + { + MessageSignature = messageSignature; + Seals = seals; + Chain = chain; + } + + /// + /// Get the validation results for the ARC-Message-Signature header. + /// + /// + /// Gets the validation results for the ARC-Message-Signature header. + /// + /// The validation results for the ARC-Message-Signature header or null + /// if the ARC-Message-Signature header was not found. + public ArcHeaderValidationResult MessageSignature { + get; internal set; + } + + /// + /// Get the validation results for each of the ARC-Seal headers. + /// + /// + /// Gets the validation results for each of the ARC-Seal headers in + /// their instance order. + /// + /// The array of validation results for the ARC-Seal headers or null + /// if no ARC-Seal headers were found. + public ArcHeaderValidationResult[] Seals { + get; internal set; + } + + /// + /// Get the signature validation results of the entire chain. + /// + /// + /// Gets the signature validation results of the entire chain. + /// + /// The signature validation results of the entire chain. + public ArcSignatureValidationResult Chain { + get; internal set; + } + } + + class ArcHeaderSet { public Header ArcAuthenticationResult { get; private set; } @@ -243,7 +378,7 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, } } - internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool throwOnError, out ArcHeaderSet[] sets, out int count) + internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage message, bool throwOnError, out ArcHeaderSet[] sets, out int count) { ArcHeaderSet set; @@ -260,16 +395,16 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool case HeaderId.ArcAuthenticationResults: if (!AuthenticationResults.TryParse (header.RawValue, out AuthenticationResults authres)) { if (throwOnError) - throw new FormatException ("Invalid ARC-AUthentication-Results header."); + throw new FormatException ("Invalid ARC-Authentication-Results header."); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (!authres.Instance.HasValue) { if (throwOnError) throw new FormatException ("Missing instance tag in ARC-Authentication-Results header."); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } instance = authres.Instance.Value; @@ -278,7 +413,7 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool if (throwOnError) throw new FormatException (string.Format ("Invalid instance tag in ARC-Authentication-Results header: i={0}", instance)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } break; case HeaderId.ArcMessageSignature: @@ -289,21 +424,21 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool if (throwOnError) throw; - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (!parameters.TryGetValue ("i", out value)) { if (throwOnError) throw new FormatException (string.Format ("Missing instance tag in {0} header.", header.Id.ToHeaderName ())); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out instance) || instance < 1 || instance > 50) { if (throwOnError) throw new FormatException (string.Format ("Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } break; default: @@ -319,7 +454,7 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool sets[instance - 1] = set = new ArcHeaderSet (); if (!set.Add (header, parameters)) - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; if (instance > count) count = instance; @@ -327,7 +462,7 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool if (count == 0) { // there are no ARC sets - return ArcValidationResult.None; + return ArcSignatureValidationResult.None; } // verify that all ARC sets are complete @@ -338,35 +473,35 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool if (throwOnError) throw new FormatException (string.Format ("Missing ARC headers for i={0}", i + 1)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (set.ArcAuthenticationResult == null) { if (throwOnError) throw new FormatException (string.Format ("Missing ARC-Authentication-Results header for i={0}", i + 1)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (set.ArcMessageSignature == null) { if (throwOnError) throw new FormatException (string.Format ("Missing ARC-Message-Signature header for i={0}", i + 1)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (set.ArcSeal == null) { if (throwOnError) throw new FormatException (string.Format ("Missing ARC-Seal header for i={0}", i + 1)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } if (!set.ArcSealParameters.TryGetValue ("cv", out string cv)) { if (throwOnError) throw new FormatException (string.Format ("Missing chain validation tag in ARC-Seal header for i={0}.", i + 1)); - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } // The "cv" value for all ARC-Seal header fields MUST NOT be @@ -374,10 +509,10 @@ internal static ArcValidationResult GetArcHeaderSets (MimeMessage message, bool // MUST be "pass". For the ARC Set with instance value = 1, the // value MUST be "none". if (!cv.Equals (i == 0 ? "none" : "pass", StringComparison.Ordinal)) - return ArcValidationResult.Fail; + return ArcSignatureValidationResult.Fail; } - return ArcValidationResult.Pass; + return ArcSignatureValidationResult.Pass; } async Task VerifyAsync (FormatOptions options, MimeMessage message, bool doAsync, CancellationToken cancellationToken) @@ -388,35 +523,56 @@ async Task VerifyAsync (FormatOptions options, MimeMessage if (message == null) throw new ArgumentNullException (nameof (message)); + var result = new ArcValidationResult (); + switch (GetArcHeaderSets (message, false, out ArcHeaderSet[] sets, out int count)) { - case ArcValidationResult.None: return ArcValidationResult.None; - case ArcValidationResult.Fail: return ArcValidationResult.Fail; + case ArcSignatureValidationResult.None: return result; + case ArcSignatureValidationResult.Fail: + result.Chain = ArcSignatureValidationResult.Fail; + return result; } int newest = count - 1; + result.Seals = new ArcHeaderValidationResult[count]; + result.Chain = ArcSignatureValidationResult.Pass; + // validate the most recent Arc-Message-Signature try { var parameters = sets[newest].ArcMessageSignatureParameters; var header = sets[newest].ArcMessageSignature; - if (!await VerifyArcMessageSignatureAsync (options, message, header, parameters, doAsync, cancellationToken).ConfigureAwait (false)) - return ArcValidationResult.Fail; + result.MessageSignature = new ArcHeaderValidationResult (header); + + if (await VerifyArcMessageSignatureAsync (options, message, header, parameters, doAsync, cancellationToken).ConfigureAwait (false)) { + result.MessageSignature.Signature = ArcSignatureValidationResult.Pass; + } else { + result.MessageSignature.Signature = ArcSignatureValidationResult.Fail; + result.Chain = ArcSignatureValidationResult.Fail; + } } catch { - return ArcValidationResult.Fail; + result.MessageSignature.Signature = ArcSignatureValidationResult.Fail; + result.Chain = ArcSignatureValidationResult.Fail; } // validate all Arc-Seals starting with the most recent and proceeding to the oldest for (int i = newest; i >= 0; i--) { + result.Seals[i] = new ArcHeaderValidationResult (sets[i].ArcSeal); + try { - if (!await VerifyArcSealAsync (options, sets, i, doAsync, cancellationToken).ConfigureAwait (false)) - return ArcValidationResult.Fail; + if (await VerifyArcSealAsync (options, sets, i, doAsync, cancellationToken).ConfigureAwait (false)) { + result.Seals[i].Signature = ArcSignatureValidationResult.Pass; + } else { + result.Seals[i].Signature = ArcSignatureValidationResult.Fail; + result.Chain = ArcSignatureValidationResult.Fail; + } } catch { - return ArcValidationResult.Fail; + result.Seals[i].Signature = ArcSignatureValidationResult.Fail; + result.Chain = ArcSignatureValidationResult.Fail; } } - return ArcValidationResult.Pass; + return result; } /// diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index a9c07f2a24..42776197ff 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -224,23 +224,23 @@ static void AssertSignResults (string description, MimeMessage message, DkimPubl header = message.Headers[index]; AssertHeadersEqual (description, HeaderId.ArcSeal, seal, header.Value); - var expected = ArcValidationResult.Pass; + var expected = ArcSignatureValidationResult.Pass; if (header.Value.Contains ("cv=fail;")) - expected = ArcValidationResult.Fail; + expected = ArcSignatureValidationResult.Fail; var verifier = new ArcVerifier (locator); ArcValidationResult result; if (!verifier.IsEnabled (algorithm)) { result = verifier.Verify (message); - Assert.AreEqual (ArcValidationResult.Fail, result, "Disabled algorithm should fail"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, result.Chain, "Disabled algorithm should fail"); verifier.Enable (algorithm); } result = verifier.Verify (message); - Assert.AreEqual (expected, result, "ArcSigner validation failed"); + Assert.AreEqual (expected, result.Chain, "ArcSigner validation failed"); } } diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index c7b54c852f..946480a1ee 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -46,6 +46,8 @@ public void TestArgumentExceptions () var message = new MimeMessage (); Assert.Throws (() => new ArcVerifier (null)); + Assert.Throws (() => new ArcHeaderValidationResult (null)); + Assert.Throws (() => new ArcHeaderValidationResult (null, ArcSignatureValidationResult.Fail)); Assert.Throws (() => verifier.Verify (null)); Assert.Throws (async () => await verifier.VerifyAsync (null)); @@ -56,10 +58,461 @@ public void TestArgumentExceptions () Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, null)); } - static void Validate (string description, string input, DkimPublicKeyLocator locator, ArcValidationResult expected) + [Test] + public void TestArcHeaderValidationResult () + { + var header = new Header (HeaderId.ArcMessageSignature, "i=1; a=rsa-sha256; ..."); + var result = new ArcHeaderValidationResult (header, ArcSignatureValidationResult.Fail); + + Assert.AreEqual (header, result.Header, "Header"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, result.Signature); + } + + [Test] + public void TestArcValidationResult () + { + var header = new Header (HeaderId.ArcMessageSignature, "i=1; a=rsa-sha256; ..."); + var ams = new ArcHeaderValidationResult (header, ArcSignatureValidationResult.Pass); + + header = new Header (HeaderId.ArcSeal, "i=1; a=rsa-sha256; ..."); + var seal = new ArcHeaderValidationResult (header, ArcSignatureValidationResult.Pass); + + var result = new ArcValidationResult (ArcSignatureValidationResult.Pass, ams, new[] { seal }); + + Assert.AreEqual (ArcSignatureValidationResult.Pass, result.Chain, "Chain"); + Assert.IsNotNull (result.MessageSignature, "MessageSignature != null"); + Assert.AreEqual (HeaderId.ArcMessageSignature, result.MessageSignature.Header.Id, "MessageSignature.Header.Id"); + Assert.AreEqual (ArcSignatureValidationResult.Pass, result.MessageSignature.Signature, "MessageSignature.Signature"); + Assert.IsNotNull (result.Seals, "Seals != null"); + Assert.AreEqual (1, result.Seals.Length, "Seals.Length"); + Assert.AreEqual (HeaderId.ArcSeal, result.Seals[0].Header.Id, "Seals[0].Header.Id"); + Assert.AreEqual (ArcSignatureValidationResult.Pass, result.Seals[0].Signature, "Seals[0].Signature"); + } + + [Test] + public void TestGetArcHeaderSetsBrokenAAR () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + MimeMessage message; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { + message = MimeMessage.Load (stream); + ArcHeaderSet[] sets; + Header broken, aar; + int index, count; + + // first, get a copy of the original ARC-Authentication-Results header + index = message.Headers.IndexOf (HeaderId.ArcAuthenticationResults); + aar = message.Headers[index]; + + // create and set completely broken AAR: + broken = new Header (HeaderId.ArcAuthenticationResults, "this should be unparsable..."); + message.Headers[index] = broken; + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Broken AAR"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Broken AAR should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Broken AAR throwOnError"); + } catch { + Assert.Fail ("Broken AAR throwOnError unexpected exception"); + } + + // set an AAR that is missing the instance value + broken.Value = aar.Value.Replace ("i=1; ", ""); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AAR missing i=1"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("AAR missing i=1 should throwOnError"); + } catch (FormatException) { + Assert.Pass ("AAR missing i=1 throwOnError"); + } catch { + Assert.Fail ("AAR missing i=1 throwOnError unexpected exception"); + } + + // set an AAR that has an invalid instance value + broken.Value = aar.Value.Replace ("i=1; ", "i=0; "); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AAR i=0"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("AAR i=0 should throwOnError"); + } catch (FormatException) { + Assert.Pass ("AAR i=0 throwOnError"); + } catch { + Assert.Fail ("AAR i=0 throwOnError unexpected exception"); + } + + // remove the AAR completely + message.Headers.RemoveAt (index); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing AAR"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Missing AAR should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Missing AAR throwOnError"); + } catch { + Assert.Fail ("Missing AAR throwOnError unexpected exception"); + } + } + } + + [Test] + public void TestGetArcHeaderSetsBrokenAMS () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + MimeMessage message; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { + message = MimeMessage.Load (stream); + ArcHeaderSet[] sets; + Header broken, ams; + int index, count; + + // first, get a copy of the original ARC-Message-Signature header + index = message.Headers.IndexOf (HeaderId.ArcMessageSignature); + ams = message.Headers[index]; + + // create and set completely broken AMS: + broken = new Header (HeaderId.ArcMessageSignature, "this should be unparsable..."); + message.Headers[index] = broken; + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Broken AMS"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Broken AMS should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Broken AMS throwOnError"); + } catch { + Assert.Fail ("Broken AMS throwOnError unexpected exception"); + } + + // set an AMS that is missing the instance value + broken.Value = ams.Value.Replace ("i=1; ", ""); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AMS missing i=1"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("AMS missing i=1 should throwOnError"); + } catch (FormatException) { + Assert.Pass ("AMS missing i=1 throwOnError"); + } catch { + Assert.Fail ("AMS missing i=1 throwOnError unexpected exception"); + } + + // set an AMS that has an invalid instance value + broken.Value = ams.Value.Replace ("i=1; ", "i=0; "); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AMS i=0"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("AMS i=0 should throwOnError"); + } catch (FormatException) { + Assert.Pass ("AMS i=0 throwOnError"); + } catch { + Assert.Fail ("AMS i=0 throwOnError unexpected exception"); + } + + // remove the AMS completely + message.Headers.RemoveAt (index); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing AMS"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Missing AMS should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Missing AMS throwOnError"); + } catch { + Assert.Fail ("Missing AMS throwOnError unexpected exception"); + } + } + } + + [Test] + public void TestGetArcHeaderSetsBrokenAS () + { + const string input = @"MIME-Version: 1.0 +Return-Path: +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + MimeMessage message; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { + message = MimeMessage.Load (stream); + ArcHeaderSet[] sets; + Header broken, seal; + int index, count; + + // first, get a copy of the original ARC-Seal header + index = message.Headers.IndexOf (HeaderId.ArcSeal); + seal = message.Headers[index]; + + // create and set completely broken AS: + broken = new Header (HeaderId.ArcSeal, "this should be unparsable..."); + message.Headers[index] = broken; + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Broken AS"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Broken AS should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Broken AS throwOnError"); + } catch { + Assert.Fail ("Broken AS throwOnError unexpected exception"); + } + + // set an AS that is missing the instance value + broken.Value = seal.Value.Replace ("i=1; ", ""); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AS missing i=1"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("AS missing i=1 should throwOnError"); + } catch (FormatException) { + Assert.Pass ("AS missing i=1 throwOnError"); + } catch { + Assert.Fail ("AS missing i=1 throwOnError unexpected exception"); + } + + // set an AS that has an invalid instance value + broken.Value = seal.Value.Replace ("i=1; ", "i=0; "); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AS i=0"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("AS i=0 should throwOnError"); + } catch (FormatException) { + Assert.Pass ("AS i=0 throwOnError"); + } catch { + Assert.Fail ("AS i=0 throwOnError unexpected exception"); + } + + // remove the AS completely + message.Headers.RemoveAt (index); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing AS"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Missing AS should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Missing AS throwOnError"); + } catch { + Assert.Fail ("Missing AS throwOnError unexpected exception"); + } + } + } + + [Test] + public void TestGetArcHeaderSetsMissingSet () + { + const string input = @"MIME-Version: 1.0 +ARC-Seal: a=rsa-sha256; + b=IAqZJ5HwfNxxsrn9R4ayQgiu9RibPKEUVevbt7XFTkSh1baJ533D2Z6IZ2NaBreUhDBb2e + K9Gtcv+eyUhWkD8VTmE6fq/F8CDIK3ScIiJykF8hNL1wpa/mGwWWwBnkozIJGAbTAAX7AgnH + knAehnSW99TeU0lmib0XmOt4TN3sY=; cv=pass; d=example.org; i=2; s=dummy; + t=12346 +ARC-Message-Signature: a=rsa-sha256; + b=2cDGNznUmp4YSSThCe9nrQIH2Gpd5qPFw3OU8sWFzZgEQ5UZtaVQifVUXUrsSyEzjro3Ul + YPPDx+C1K+LbKRlOZ06il4ws2zlPafsrx1piKsKSCUq0KjFs01hYCDBa3tfdyITSfoWu2HHY + pCjrhPMPH1jruIdBV/5Gk2Fvy+mW8=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=2; s=dummy; t=12346 +ARC-Authentication-Results: i=2; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.11.240 with SMTP id 103csp420860oth; + Fri, 6 Jan 2017 14:27:31 -0800 (PST) +ARC-Seal: a=rsa-sha256; + b=dOdFEyhrk/tw5wl3vMIogoxhaVsKJkrkEhnAcq2XqOLSQhPpGzhGBJzR7k1sWGokon3TmQ + 7TX9zQLO6ikRpwd/pUswiRW5DBupy58fefuclXJAhErsrebfvfiueGyhHXV7C1LyJTztywzn + QGG4SCciU/FTlsJ0QANrnLRoadfps=; cv=none; d=example.org; i=1; s=dummy; + t=12345 +ARC-Message-Signature: a=rsa-sha256; + b=QsRzR/UqwRfVLBc1TnoQomlVw5qi6jp08q8lHpBSl4RehWyHQtY3uOIAGdghDk/mO+/Xpm + 9JA5UVrPyDV0f+2q/YAHuwvP11iCkBQkocmFvgTSxN8H+DwFFPrVVUudQYZV7UDDycXoM6UE + cdfzLLzVNPOAHEDIi/uzoV4sUqZ18=; + bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; c=relaxed/relaxed; + d=example.org; h=from:to:date:subject:mime-version:arc-authentication-results; + i=1; s=dummy; t=12345 +ARC-Authentication-Results: i=1; lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Authentication-Results: lists.example.org; + spf=pass smtp.mfrom=jqd@d1.example; + dkim=pass (1024-bit key) header.i=@d1.example; + dmarc=pass +Received: by 10.157.14.6 with HTTP; Tue, 3 Jan 2017 12:22:54 -0800 (PST) +Message-ID: <54B84785.1060301@d1.example.org> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.org +Subject: Example 1 + +Hey gang, +This is a test message. +--J. +"; + MimeMessage message; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { + message = MimeMessage.Load (stream); + ArcHeaderSet[] sets; + int index, count; + + // Remove the oldest ARC set + index = message.Headers.LastIndexOf (HeaderId.ArcSeal); + message.Headers.RemoveAt (index); + + index = message.Headers.LastIndexOf (HeaderId.ArcMessageSignature); + message.Headers.RemoveAt (index); + + index = message.Headers.LastIndexOf (HeaderId.ArcAuthenticationResults); + message.Headers.RemoveAt (index); + + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing set"); + + try { + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + Assert.Fail ("Missing set should throwOnError"); + } catch (FormatException) { + Assert.Pass ("Missing set throwOnError"); + } catch { + Assert.Fail ("Missing set throwOnError unexpected exception"); + } + } + } + + static void Validate (string description, string input, DkimPublicKeyLocator locator, ArcSignatureValidationResult expected) { if (string.IsNullOrEmpty (input)) { - Assert.AreEqual (expected, ArcValidationResult.None, description); + Assert.AreEqual (expected, ArcSignatureValidationResult.None, description); return; } @@ -70,13 +523,13 @@ static void Validate (string description, string input, DkimPublicKeyLocator loc var message = MimeMessage.Load (stream); ArcValidationResult result; - // Test Verify() + // Test Verify result = verifier.Verify (message); - Assert.AreEqual (expected, result, description); + Assert.AreEqual (expected, result.Chain, description); // Test VerifyAsync result = verifier.VerifyAsync (message).GetAwaiter ().GetResult (); - Assert.AreEqual (expected, result, description); + Assert.AreEqual (expected, result.Chain, description); } } @@ -90,7 +543,7 @@ public void cv_empty () locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("empty message", input, locator, ArcValidationResult.None); + Validate ("empty message", input, locator, ArcSignatureValidationResult.None); } [Test] @@ -105,7 +558,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("message with no headers", input, locator, ArcValidationResult.None); + Validate ("message with no headers", input, locator, ArcSignatureValidationResult.None); } [Test] @@ -124,7 +577,7 @@ public void cv_no_body () locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("message with no body", input, locator, ArcValidationResult.None); + Validate ("message with no body", input, locator, ArcSignatureValidationResult.None); } [Test] @@ -147,7 +600,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("base test message1", input, locator, ArcValidationResult.None); + Validate ("base test message1", input, locator, ArcSignatureValidationResult.None); } [Test] @@ -182,7 +635,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("base test message2", input, locator, ArcValidationResult.None); + Validate ("base test message2", input, locator, ArcSignatureValidationResult.None); } [Test] @@ -229,7 +682,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=1 base1", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=1 base1", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -290,7 +743,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=1 base2", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=1 base2", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -354,7 +807,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=2 base1", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=2 base1", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -433,7 +886,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=2 base2", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=2 base2", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -497,7 +950,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 modified from header, ams(1) no longer valid", input, locator, ArcValidationResult.Pass); + Validate ("i=2 base1 modified from header, ams(1) no longer valid", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -579,7 +1032,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=3 base1", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=3 base1", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -677,7 +1130,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=4 base1", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=4 base1", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -791,7 +1244,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("passing message i=5 base1", input, locator, ArcValidationResult.Pass); + Validate ("passing message i=5 base1", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -831,7 +1284,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i no ams", input, locator, ArcValidationResult.Fail); + Validate ("failing message i=i no ams", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -878,7 +1331,7 @@ This is an invalid test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i invalid ams", input, locator, ArcValidationResult.Fail); + Validate ("failing message i=i invalid ams", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -920,7 +1373,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i no as", input, locator, ArcValidationResult.Fail); + Validate ("failing message i=i no as", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -967,7 +1420,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i as cv=Pass", input, locator, ArcValidationResult.Fail); + Validate ("failing message i=i as cv=Pass", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1014,7 +1467,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i as cv=fail", input, locator, ArcValidationResult.Fail); + Validate ("failing message i=i as cv=fail", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1061,7 +1514,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i invalid as b=", input, locator, ArcValidationResult.Fail); + Validate ("failing message i=i invalid as b=", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1118,7 +1571,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 missing AMS(2)", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 missing AMS(2)", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1182,7 +1635,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 AMS(2) invalid", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 AMS(2) invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1241,7 +1694,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 AS(1) NA", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 AS(1) NA", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1305,7 +1758,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 AS(2) invalid", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 AS(2) invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1369,7 +1822,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 cv2=none", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 cv2=none", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1433,7 +1886,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 cv2=fail", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 cv2=fail", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1492,7 +1945,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) not available", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 as(1) not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1556,7 +2009,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) invalid", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 as(1) invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1620,7 +2073,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) cv=pass", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 as(1) cv=pass", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1684,7 +2137,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) cv=fail", input, locator, ArcValidationResult.Fail); + Validate ("i=2 base1 as(1) cv=fail", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -1734,7 +2187,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= NA", input, locator, ArcValidationResult.Fail); + Validate ("AMS i= NA", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1781,7 +2234,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= empty", input, locator, ArcValidationResult.Fail); + Validate ("AMS i= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1828,7 +2281,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= zero", input, locator, ArcValidationResult.Fail); + Validate ("AMS i= zero", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1875,7 +2328,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= invalid value", input, locator, ArcValidationResult.Fail); + Validate ("AMS i= invalid value", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1929,7 +2382,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Duplicate AMS i=1", input, locator, ArcValidationResult.Fail); + Validate ("Duplicate AMS i=1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -1969,7 +2422,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Missing AMS i=1", input, locator, ArcValidationResult.Fail); + Validate ("Missing AMS i=1", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -2019,7 +2472,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams format tag whitespace around semicolon ignored", input, locator, ArcValidationResult.Pass); + Validate ("ams format tag whitespace around semicolon ignored", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2066,7 +2519,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams format tag whitespace around equals ignored", input, locator, ArcValidationResult.Pass); + Validate ("ams format tag whitespace around equals ignored", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2113,7 +2566,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams trailing semi colon no effect", input, locator, ArcValidationResult.Pass); + Validate ("ams trailing semi colon no effect", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2160,7 +2613,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("unknown tags still valid", input, locator, ArcValidationResult.Pass); + Validate ("unknown tags still valid", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2207,7 +2660,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams format invalid tag key", input, locator, ArcValidationResult.Fail); + Validate ("ams format invalid tag key", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2254,7 +2707,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("tags are not de duplicated", input, locator, ArcValidationResult.Fail); + Validate ("tags are not de duplicated", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2301,7 +2754,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("tag keys are case sensitive", input, locator, ArcValidationResult.Fail); + Validate ("tag keys are case sensitive", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2348,7 +2801,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("tag values are case sensitive", input, locator, ArcValidationResult.Fail); + Validate ("tag values are case sensitive", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2395,7 +2848,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams tag values whitespace sensitive", input, locator, ArcValidationResult.Fail); + Validate ("ams tag values whitespace sensitive", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2442,7 +2895,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("additional semicolons are invalid", input, locator, ArcValidationResult.Fail); + Validate ("additional semicolons are invalid", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -2499,7 +2952,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("duplicate ams i=1 order 1", input, locator, ArcValidationResult.Fail); + Validate ("duplicate ams i=1 order 1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2553,7 +3006,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("duplicate ams i=1 order 2", input, locator, ArcValidationResult.Fail); + Validate ("duplicate ams i=1 order 2", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2600,7 +3053,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= unknown algorithm", input, locator, ArcValidationResult.Fail); + Validate ("a= unknown algorithm", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2647,7 +3100,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= not avaliable", input, locator, ArcValidationResult.Fail); + Validate ("a= not avaliable", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2694,7 +3147,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= empty", input, locator, ArcValidationResult.Fail); + Validate ("a= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2741,7 +3194,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= unknown algorithm", input, locator, ArcValidationResult.Fail); + Validate ("a= unknown algorithm", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -2788,7 +3241,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= ignores whitespace", input, locator, ArcValidationResult.Pass); + Validate ("ams b= ignores whitespace", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2835,7 +3288,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= canonicalization header key case insensitive", input, locator, ArcValidationResult.Pass); + Validate ("ams b= canonicalization header key case insensitive", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2883,7 +3336,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= canonicalization headers unfolded", input, locator, ArcValidationResult.Pass); + Validate ("ams b= canonicalization headers unfolded", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2930,7 +3383,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= canonicalization eol whitespace stripped", input, locator, ArcValidationResult.Pass); + Validate ("ams b= canonicalization eol whitespace stripped", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -2977,7 +3430,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= canonicalization inline whitespace reduced", input, locator, ArcValidationResult.Pass); + Validate ("ams b= canonicalization inline whitespace reduced", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3024,7 +3477,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= canonicalization colon whitespace removed", input, locator, ArcValidationResult.Pass); + Validate ("ams b= canonicalization colon whitespace removed", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3068,7 +3521,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= not available", input, locator, ArcValidationResult.Fail); + Validate ("ams b= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3112,7 +3565,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= empty", input, locator, ArcValidationResult.Fail); + Validate ("ams b= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3157,7 +3610,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b=", input, locator, ArcValidationResult.Fail); + Validate ("ams b=", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3204,7 +3657,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= w/ modified value", input, locator, ArcValidationResult.Fail); + Validate ("ams b= w/ modified value", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3251,7 +3704,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= w/ modified headers 1", input, locator, ArcValidationResult.Fail); + Validate ("ams b= w/ modified headers 1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3298,7 +3751,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= w/ modified headers 2", input, locator, ArcValidationResult.Fail); + Validate ("ams b= w/ modified headers 2", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3345,7 +3798,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= ignores wsp", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= ignores wsp", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3392,7 +3845,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= simple canonicalization", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= simple canonicalization", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3439,7 +3892,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= simple canonicalization ignores ending empty lines", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= simple canonicalization ignores ending empty lines", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3486,7 +3939,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= simple canonicalization doesnt reduce wsp", input, locator, ArcValidationResult.Fail); + Validate ("ams bh= simple canonicalization doesnt reduce wsp", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3533,7 +3986,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= relaxed canonicalization deletes trailing whitespace", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= relaxed canonicalization deletes trailing whitespace", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3580,7 +4033,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= relaxed canonicalization reduces inline whitespace", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= relaxed canonicalization reduces inline whitespace", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3627,7 +4080,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= relaxed canonicalization ignores end of body empty lines", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= relaxed canonicalization ignores end of body empty lines", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3674,7 +4127,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= relaxed canonicalization adds crlf at end of body if non existant", input, locator, ArcValidationResult.Pass); + Validate ("ams bh= relaxed canonicalization adds crlf at end of body if non existant", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -3721,7 +4174,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= not available", input, locator, ArcValidationResult.Fail); + Validate ("ams bh= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3768,7 +4221,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= empty", input, locator, ArcValidationResult.Fail); + Validate ("ams bh= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3815,7 +4268,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= not base64", input, locator, ArcValidationResult.Fail); + Validate ("ams bh= not base64", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3862,7 +4315,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= modified sig", input, locator, ArcValidationResult.Fail); + Validate ("ams bh= modified sig", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3909,7 +4362,7 @@ This is a modified test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= modified body", input, locator, ArcValidationResult.Fail); + Validate ("ams bh= modified body", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -3957,7 +4410,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= not available", input, locator, ArcValidationResult.Pass); + Validate ("ams c= not available", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4004,7 +4457,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= empty", input, locator, ArcValidationResult.Fail); + Validate ("ams c= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4051,7 +4504,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= relaxed/relaxed", input, locator, ArcValidationResult.Pass); + Validate ("ams c= relaxed/relaxed", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4098,7 +4551,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= relaxed/simple", input, locator, ArcValidationResult.Pass); + Validate ("ams c= relaxed/simple", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4136,7 +4589,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= simple/relaxed", input, locator, ArcValidationResult.Pass); + Validate ("ams c= simple/relaxed", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4174,7 +4627,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= simple/simple", input, locator, ArcValidationResult.Pass); + Validate ("ams c= simple/simple", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4221,7 +4674,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= invalid", input, locator, ArcValidationResult.Fail); + Validate ("ams c= invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4268,7 +4721,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams d= not available", input, locator, ArcValidationResult.Fail); + Validate ("ams d= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4315,7 +4768,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams d= empty", input, locator, ArcValidationResult.Fail); + Validate ("ams d= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4362,7 +4815,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams d= not valid domain name", input, locator, ArcValidationResult.Fail); + Validate ("ams d= not valid domain name", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4409,7 +4862,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= empty", input, locator, ArcValidationResult.Pass); + Validate ("ams h= empty", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4456,7 +4909,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= colon folding whitspace ignored", input, locator, ArcValidationResult.Pass); + Validate ("ams h= colon folding whitspace ignored", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4504,7 +4957,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= colon folding whitspace ignored", input, locator, ArcValidationResult.Pass); + Validate ("ams h= colon folding whitspace ignored", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4551,7 +5004,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= case insensitive", input, locator, ArcValidationResult.Pass); + Validate ("ams h= case insensitive", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4599,7 +5052,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= with duplicated header correct order(bottom up)", input, locator, ArcValidationResult.Pass); + Validate ("ams h= with duplicated header correct order(bottom up)", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4645,7 +5098,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= signing non-existant header field", input, locator, ArcValidationResult.Pass); + Validate ("ams h= signing non-existant header field", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4692,7 +5145,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= blank sig-header", input, locator, ArcValidationResult.Pass); + Validate ("ams h= blank sig-header", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4738,7 +5191,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= duplicated non-existant header field", input, locator, ArcValidationResult.Pass); + Validate ("ams h= duplicated non-existant header field", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4801,7 +5254,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams fields h includes AMS1", input, locator, ArcValidationResult.Pass); + Validate ("ams fields h includes AMS1", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -4847,7 +5300,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= not available", input, locator, ArcValidationResult.Fail); + Validate ("ams h= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4895,7 +5348,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= with duplicated header not correct order(bottom up)", input, locator, ArcValidationResult.Fail); + Validate ("ams h= with duplicated header not correct order(bottom up)", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4942,7 +5395,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= mis ordered", input, locator, ArcValidationResult.Fail); + Validate ("ams h= mis ordered", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -4989,7 +5442,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= signing non-existant header field is then added(MIME-Version)", input, locator, ArcValidationResult.Fail); + Validate ("ams h= signing non-existant header field is then added(MIME-Version)", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5053,7 +5506,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams fields h includes AS(1)", input, locator, ArcValidationResult.Fail); + Validate ("ams fields h includes AS(1)", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5100,7 +5553,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams s= not available", input, locator, ArcValidationResult.Fail); + Validate ("ams s= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5147,7 +5600,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams s= empty", input, locator, ArcValidationResult.Fail); + Validate ("ams s= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5194,7 +5647,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams t= not available", input, locator, ArcValidationResult.Pass); + Validate ("ams t= not available", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -5241,7 +5694,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams t= empty", input, locator, ArcValidationResult.Fail); + Validate ("ams t= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5288,7 +5741,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams t= invalid", input, locator, ArcValidationResult.Fail); + Validate ("ams t= invalid", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -5338,7 +5791,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= NA", input, locator, ArcValidationResult.Fail); + Validate ("AS i= NA", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5385,7 +5838,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= empty", input, locator, ArcValidationResult.Fail); + Validate ("AS i= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5432,7 +5885,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= 0", input, locator, ArcValidationResult.Fail); + Validate ("AS i= 0", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5479,7 +5932,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= invalid value", input, locator, ArcValidationResult.Fail); + Validate ("AS i= invalid value", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5531,7 +5984,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Duplicate AS for i=1", input, locator, ArcValidationResult.Fail); + Validate ("Duplicate AS for i=1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5573,7 +6026,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Missing AS for i=1", input, locator, ArcValidationResult.Fail); + Validate ("Missing AS for i=1", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -5637,7 +6090,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as format tag whitespace around semicolon ignored", input, locator, ArcValidationResult.Pass); + Validate ("as format tag whitespace around semicolon ignored", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -5698,7 +6151,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as format tag whitespace around equals ignored", input, locator, ArcValidationResult.Pass); + Validate ("as format tag whitespace around equals ignored", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -5759,7 +6212,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as trailing ; no effect", input, locator, ArcValidationResult.Pass); + Validate ("as trailing ; no effect", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -5820,7 +6273,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as unknown tags no effect", input, locator, ArcValidationResult.Pass); + Validate ("as unknown tags no effect", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -5881,7 +6334,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as format invalid tag key", input, locator, ArcValidationResult.Fail); + Validate ("as format invalid tag key", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -5942,7 +6395,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as dup tag error", input, locator, ArcValidationResult.Fail); + Validate ("as dup tag error", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6003,7 +6456,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as tag key case", input, locator, ArcValidationResult.Fail); + Validate ("as tag key case", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6064,7 +6517,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as tag value case", input, locator, ArcValidationResult.Fail); + Validate ("as tag value case", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6125,7 +6578,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as whitespace sensitive", input, locator, ArcValidationResult.Fail); + Validate ("as whitespace sensitive", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6186,7 +6639,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as random semi colon error", input, locator, ArcValidationResult.Fail); + Validate ("as random semi colon error", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -6259,7 +6712,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("duplicate as", input, locator, ArcValidationResult.Fail); + Validate ("duplicate as", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6332,7 +6785,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("duplicate AS i=2", input, locator, ArcValidationResult.Fail); + Validate ("duplicate AS i=2", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6397,7 +6850,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as fields i= missing", input, locator, ArcValidationResult.Fail); + Validate ("as fields i= missing", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6462,7 +6915,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= is sha1", input, locator, ArcValidationResult.Fail); + Validate ("as a= is sha1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6527,7 +6980,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= not avaliable", input, locator, ArcValidationResult.Fail); + Validate ("as a= not avaliable", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6592,7 +7045,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= is empty", input, locator, ArcValidationResult.Fail); + Validate ("as a= is empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6657,7 +7110,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= unknown", input, locator, ArcValidationResult.Fail); + Validate ("as a= unknown", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -6722,7 +7175,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= ignores whitespace", input, locator, ArcValidationResult.Pass); + Validate ("as b= ignores whitespace", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -6787,7 +7240,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization ignores header case", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization ignores header case", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -6851,7 +7304,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization headers unfolded", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization headers unfolded", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -6916,7 +7369,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization strips eol whitespace", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization strips eol whitespace", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -6981,7 +7434,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization reduces inline whitespace", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization reduces inline whitespace", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7046,7 +7499,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization strips whitespace around colon", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization strips whitespace around colon", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7097,7 +7550,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization header key case insensitive", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization header key case insensitive", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7147,7 +7600,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization headers unfolded", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization headers unfolded", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7198,7 +7651,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization eol whitespace stripped", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization eol whitespace stripped", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7249,7 +7702,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= canonicalization inline whitespace reduced", input, locator, ArcValidationResult.Pass); + Validate ("as b= canonicalization inline whitespace reduced", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7312,7 +7765,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= with 512 bit key", input, locator, ArcValidationResult.Fail); + Validate ("as b= with 512 bit key", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7377,7 +7830,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= with 1024 bit key", input, locator, ArcValidationResult.Pass); + Validate ("as b= with 1024 bit key", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7446,7 +7899,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= with 2048 bit key", input, locator, ArcValidationResult.Pass); + Validate ("as b= with 2048 bit key", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -7509,7 +7962,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= not available", input, locator, ArcValidationResult.Fail); + Validate ("as b= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7572,7 +8025,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= empty", input, locator, ArcValidationResult.Fail); + Validate ("as b= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7635,7 +8088,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= not base64", input, locator, ArcValidationResult.Fail); + Validate ("as b= not base64", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7700,7 +8153,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= with modified signature", input, locator, ArcValidationResult.Fail); + Validate ("as b= with modified signature", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7765,7 +8218,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= modified aar1", input, locator, ArcValidationResult.Fail); + Validate ("as b= modified aar1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7830,7 +8283,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= modified ams1", input, locator, ArcValidationResult.Fail); + Validate ("as b= modified ams1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7895,7 +8348,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= modified asb1", input, locator, ArcValidationResult.Fail); + Validate ("as b= modified asb1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -7960,7 +8413,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as cv= not avaliable", input, locator, ArcValidationResult.Fail); + Validate ("as cv= not avaliable", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8025,7 +8478,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as cv= empty", input, locator, ArcValidationResult.Fail); + Validate ("as cv= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8090,7 +8543,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as cv= invalid", input, locator, ArcValidationResult.Fail); + Validate ("as cv= invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8155,7 +8608,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as d= not available", input, locator, ArcValidationResult.Fail); + Validate ("as d= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8220,7 +8673,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as d= empty", input, locator, ArcValidationResult.Fail); + Validate ("as d= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8285,7 +8738,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as d= invalid", input, locator, ArcValidationResult.Fail); + Validate ("as d= invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8327,7 +8780,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as has h= which is invalid", input, locator, ArcValidationResult.Fail); + Validate ("as has h= which is invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8392,7 +8845,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as s= not available", input, locator, ArcValidationResult.Fail); + Validate ("as s= not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8457,7 +8910,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as s= empty", input, locator, ArcValidationResult.Fail); + Validate ("as s= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8521,7 +8974,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as t= na", input, locator, ArcValidationResult.Pass); + Validate ("as t= na", input, locator, ArcSignatureValidationResult.Pass); } [Test] @@ -8586,7 +9039,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as t= empty", input, locator, ArcValidationResult.Fail); + Validate ("as t= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8651,7 +9104,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as t= invalid", input, locator, ArcValidationResult.Fail); + Validate ("as t= invalid", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -8701,7 +9154,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i= NA", input, locator, ArcValidationResult.Fail); + Validate ("AAR i= NA", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8748,7 +9201,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i= empty", input, locator, ArcValidationResult.Fail); + Validate ("AAR i= empty", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8795,7 +9248,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i=0", input, locator, ArcValidationResult.Fail); + Validate ("AAR i=0", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8842,7 +9295,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i= invalid value", input, locator, ArcValidationResult.Fail); + Validate ("AAR i= invalid value", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8893,7 +9346,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Duplicated AAR for i=1", input, locator, ArcValidationResult.Fail); + Validate ("Duplicated AAR for i=1", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -8936,7 +9389,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Missing AAR for i=1", input, locator, ArcValidationResult.Fail); + Validate ("Missing AAR for i=1", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -8996,7 +9449,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("missing arc authentication results", input, locator, ArcValidationResult.Fail); + Validate ("missing arc authentication results", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9057,7 +9510,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results no i= tag", input, locator, ArcValidationResult.Fail); + Validate ("arc authentication results no i= tag", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9118,7 +9571,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results wrong i= tag", input, locator, ArcValidationResult.Fail); + Validate ("arc authentication results wrong i= tag", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9179,7 +9632,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results i= not prefixed", input, locator, ArcValidationResult.Fail); + Validate ("arc authentication results i= not prefixed", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9240,7 +9693,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results i= no semicolon", input, locator, ArcValidationResult.Fail); + Validate ("arc authentication results i= no semicolon", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9315,7 +9768,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("aar missing for i=2", input, locator, ArcValidationResult.Fail); + Validate ("aar missing for i=2", input, locator, ArcSignatureValidationResult.Fail); } #endregion @@ -9367,7 +9820,7 @@ This is a test message. locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); - Validate ("public key not available", input, locator, ArcValidationResult.Fail); + Validate ("public key not available", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9416,7 +9869,7 @@ This is a test message. locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); - Validate ("public key invalid", input, locator, ArcValidationResult.Fail); + Validate ("public key invalid", input, locator, ArcSignatureValidationResult.Fail); } [Test] @@ -9465,7 +9918,7 @@ This is a test message. locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); - Validate ("differing domains & selectors across ams & as", input, locator, ArcValidationResult.Pass); + Validate ("differing domains & selectors across ams & as", input, locator, ArcSignatureValidationResult.Pass); } #endregion From 5820de6d5ed18279c389f218575d1386502206a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 7 Jun 2019 13:08:00 -0400 Subject: [PATCH 328/741] Fixed unit tests --- UnitTests/Cryptography/ArcVerifierTests.cs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index 946480a1ee..a04d360aa6 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -151,7 +151,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Broken AAR should throwOnError"); } catch (FormatException) { - Assert.Pass ("Broken AAR throwOnError"); } catch { Assert.Fail ("Broken AAR throwOnError unexpected exception"); } @@ -165,7 +164,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("AAR missing i=1 should throwOnError"); } catch (FormatException) { - Assert.Pass ("AAR missing i=1 throwOnError"); } catch { Assert.Fail ("AAR missing i=1 throwOnError unexpected exception"); } @@ -179,7 +177,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("AAR i=0 should throwOnError"); } catch (FormatException) { - Assert.Pass ("AAR i=0 throwOnError"); } catch { Assert.Fail ("AAR i=0 throwOnError unexpected exception"); } @@ -193,7 +190,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Missing AAR should throwOnError"); } catch (FormatException) { - Assert.Pass ("Missing AAR throwOnError"); } catch { Assert.Fail ("Missing AAR throwOnError unexpected exception"); } @@ -262,7 +258,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Broken AMS should throwOnError"); } catch (FormatException) { - Assert.Pass ("Broken AMS throwOnError"); } catch { Assert.Fail ("Broken AMS throwOnError unexpected exception"); } @@ -276,7 +271,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("AMS missing i=1 should throwOnError"); } catch (FormatException) { - Assert.Pass ("AMS missing i=1 throwOnError"); } catch { Assert.Fail ("AMS missing i=1 throwOnError unexpected exception"); } @@ -290,7 +284,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("AMS i=0 should throwOnError"); } catch (FormatException) { - Assert.Pass ("AMS i=0 throwOnError"); } catch { Assert.Fail ("AMS i=0 throwOnError unexpected exception"); } @@ -304,7 +297,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Missing AMS should throwOnError"); } catch (FormatException) { - Assert.Pass ("Missing AMS throwOnError"); } catch { Assert.Fail ("Missing AMS throwOnError unexpected exception"); } @@ -373,7 +365,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Broken AS should throwOnError"); } catch (FormatException) { - Assert.Pass ("Broken AS throwOnError"); } catch { Assert.Fail ("Broken AS throwOnError unexpected exception"); } @@ -387,7 +378,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("AS missing i=1 should throwOnError"); } catch (FormatException) { - Assert.Pass ("AS missing i=1 throwOnError"); } catch { Assert.Fail ("AS missing i=1 throwOnError unexpected exception"); } @@ -401,7 +391,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("AS i=0 should throwOnError"); } catch (FormatException) { - Assert.Pass ("AS i=0 throwOnError"); } catch { Assert.Fail ("AS i=0 throwOnError unexpected exception"); } @@ -415,7 +404,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Missing AS should throwOnError"); } catch (FormatException) { - Assert.Pass ("Missing AS throwOnError"); } catch { Assert.Fail ("Missing AS throwOnError unexpected exception"); } @@ -502,7 +490,6 @@ This is a test message. ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); Assert.Fail ("Missing set should throwOnError"); } catch (FormatException) { - Assert.Pass ("Missing set throwOnError"); } catch { Assert.Fail ("Missing set throwOnError unexpected exception"); } From 7a0df36d33b59c8868bc4d309e195d0708223035 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 7 Jun 2019 21:46:18 -0400 Subject: [PATCH 329/741] minor fixups --- MimeKit/Cryptography/AuthenticationResults.cs | 2 +- MimeKit/Utils/MimeUtils.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index e829ed6599..44acf1d277 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -487,7 +487,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro commentIndex++; - resinfo.ResultComment = Encoding.UTF8.GetString (text, commentIndex, (index - 1) - commentIndex); + resinfo.ResultComment = Header.Unfold (Encoding.UTF8.GetString (text, commentIndex, (index - 1) - commentIndex)); if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 55d184759e..8371de5881 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -432,7 +432,7 @@ public static string Unquote (string text) if (index == -1) return text; - var builder = new StringBuilder (); + var builder = new StringBuilder (text.Length); bool escaped = false; bool quoted = false; From ab25e43874044e458dbf505899d69d876a7f2596 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 8 Jun 2019 10:41:40 -0400 Subject: [PATCH 330/741] Added DkimPublicKeyLocatorBase and updated DKIM-related doc comments --- .../DkimCanonicalizationAlgorithm.cs | 3 + .../Cryptography/DkimPublicKeyLocatorBase.cs | 179 ++++++++++++++++++ .../Cryptography/DkimSignatureAlgorithm.cs | 3 + MimeKit/Cryptography/DkimSigner.cs | 12 ++ MimeKit/Cryptography/DkimSignerBase.cs | 21 +- MimeKit/Cryptography/IDkimPublicKeyLocator.cs | 22 ++- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + .../Cryptography/DkimPublicKeyLocator.cs | 76 +------- 16 files changed, 244 insertions(+), 81 deletions(-) create mode 100644 MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs diff --git a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs index a05d3d472b..57276df721 100644 --- a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs +++ b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs @@ -39,6 +39,9 @@ namespace MimeKit.Cryptography { /// result in a signature verification failure. These signers prefer a canonicalization /// algorithm that does not tolerate in-transit modification of the signed email. /// + /// + /// + /// public enum DkimCanonicalizationAlgorithm { /// /// The simple canonicalization algorithm tolerates almost no modification diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs new file mode 100644 index 0000000000..d59d1cc7ea --- /dev/null +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -0,0 +1,179 @@ +// +// DkimPublicKeyLocatorBase.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Crypto.Parameters; + +namespace MimeKit.Cryptography { + /// + /// A base class for implemnentations of . + /// + /// + /// The class provides a helpful + /// method for parsing DNS TXT records in order to extract the public key. + /// + /// + /// + /// + /// + /// + /// + public abstract class DkimPublicKeyLocatorBase : IDkimPublicKeyLocator + { + /// + /// Get the public key from a DNS TXT record. + /// + /// + /// Gets the public key from a DNS TXT record. + /// + /// The DNS TXT record. + /// The public key. + /// + /// The is null. + /// + /// + /// There was an error parsing the DNS TXT record. + /// + protected AsymmetricKeyParameter GetPublicKey (string txt) + { + AsymmetricKeyParameter pubkey; + string k = null, p = null; + int index = 0; + + // parse the response (will look something like: "k=rsa; p=") + while (index < txt.Length) { + while (index < txt.Length && char.IsWhiteSpace (txt[index])) + index++; + + if (index == txt.Length) + break; + + // find the end of the key + int startIndex = index; + while (index < txt.Length && txt[index] != '=') + index++; + + if (index == txt.Length) + break; + + var key = txt.Substring (startIndex, index - startIndex); + + // skip over the '=' + index++; + + // find the end of the value + startIndex = index; + while (index < txt.Length && txt[index] != ';') + index++; + + var value = txt.Substring (startIndex, index - startIndex).Replace (" ", ""); + + switch (key) { + case "k": k = value; break; + case "p": p = value; break; + } + + // skip over the ';' + index++; + } + + if (k != null && p != null) { + if (k == "ed25519") { + var decoded = Convert.FromBase64String (p); + + return new Ed25519PublicKeyParameters (decoded, 0); + } + + var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; + var rawData = Encoding.ASCII.GetBytes (data); + + using (var stream = new MemoryStream (rawData, false)) { + using (var reader = new StreamReader (stream)) { + var pem = new PemReader (reader); + + pubkey = pem.ReadObject () as AsymmetricKeyParameter; + + if (pubkey != null) + return pubkey; + } + } + } + + throw new ParseException ("Public key parameters not found in DNS TXT record.", 0, txt.Length); + } + + /// + /// Locate and retrieve the public key for the given domain and selector. + /// + /// + /// Locates and retrieves the public key for the given domain and selector. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// The public key. + /// A colon-separated list of query methods used to retrieve the public key. The default is "dns/txt". + /// The domain. + /// The selector. + /// The cancellation token. + public abstract AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)); + + /// + /// Asynchronously locate and retrieve the public key for the given domain and selector. + /// + /// + /// Locates and retrieves the public key for the given domain and selector. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// The public key. + /// A colon-separated list of query methods used to retrieve the public key. The default is "dns/txt". + /// The domain. + /// The selector. + /// The cancellation token. + public abstract Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)); + } +} diff --git a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs index 4b30d18d7c..cbbc3e62ee 100644 --- a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs +++ b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs @@ -31,6 +31,9 @@ namespace MimeKit.Cryptography { /// /// A DKIM signature algorithm. /// + /// + /// + /// public enum DkimSignatureAlgorithm { /// /// The RSA-SHA1 signature algorithm. diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index c2c84b73f2..a7bdc14faf 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -42,6 +42,9 @@ namespace MimeKit.Cryptography { /// /// A DKIM signer. /// + /// + /// + /// public class DkimSigner : DkimSignerBase { static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; @@ -114,6 +117,9 @@ public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, D /// part of DKIM since it was originally standardized in 2007), it is recommended /// that NOT be used. /// + /// + /// + /// /// The file containing the private key. /// The domain that the signer represents. /// The selector subdividing the domain. @@ -199,6 +205,9 @@ public DkimSigner (Stream stream, string domain, string selector, DkimSignatureA /// /// Gets or sets the agent or user identifier. /// + /// + /// + /// /// The agent or user identifier. public string AgentOrUserIdentifier { get; set; @@ -214,6 +223,9 @@ public string AgentOrUserIdentifier { /// query method is of the form "type[/options]", where the syntax and /// semantics of the options depend on the type and specified options. /// + /// + /// + /// /// The public key query method. public string QueryMethod { get; set; diff --git a/MimeKit/Cryptography/DkimSignerBase.cs b/MimeKit/Cryptography/DkimSignerBase.cs index 0d85982db7..8b273b478d 100644 --- a/MimeKit/Cryptography/DkimSignerBase.cs +++ b/MimeKit/Cryptography/DkimSignerBase.cs @@ -26,9 +26,6 @@ using System; using System.IO; -using System.Linq; -using System.Text; -using System.Collections.Generic; #if ENABLE_NATIVE_DKIM using System.Security.Cryptography; #endif @@ -38,9 +35,6 @@ using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Signers; -using MimeKit.IO; -using MimeKit.Utils; - namespace MimeKit.Cryptography { /// /// A base class for DKIM and ARC signers. @@ -87,6 +81,9 @@ protected DkimSignerBase (string domain, string selector, DkimSignatureAlgorithm /// /// Gets the domain that the signer represents. /// + /// + /// + /// /// The domain. public string Domain { get; private set; @@ -98,6 +95,9 @@ public string Domain { /// /// Gets the selector subdividing the domain. /// + /// + /// + /// /// The selector. public string Selector { get; private set; @@ -114,6 +114,9 @@ public string Selector { /// part of DKIM since it was originally standardized in 2007), it is recommended /// that NOT be used. /// + /// + /// + /// /// The signature algorithm. public DkimSignatureAlgorithm SignatureAlgorithm { get; set; @@ -125,6 +128,9 @@ public DkimSignatureAlgorithm SignatureAlgorithm { /// /// Gets or sets the canonicalization algorithm to use for the message body. /// + /// + /// + /// /// The canonicalization algorithm. public DkimCanonicalizationAlgorithm BodyCanonicalizationAlgorithm { get; set; @@ -136,6 +142,9 @@ public DkimCanonicalizationAlgorithm BodyCanonicalizationAlgorithm { /// /// Gets or sets the canonicalization algorithm to use for the message headers. /// + /// + /// + /// /// The canonicalization algorithm. public DkimCanonicalizationAlgorithm HeaderCanonicalizationAlgorithm { get; set; diff --git a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs index 794a34fa18..4792c5b52e 100644 --- a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs +++ b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs @@ -41,12 +41,16 @@ namespace MimeKit.Cryptography { /// /// /// - /// - /// + /// + /// + /// + /// + /// + /// public interface IDkimPublicKeyLocator { /// - /// Locate and retrieves the public key for the given domain and selector. + /// Locate and retrieve the public key for the given domain and selector. /// /// /// Locates and retrieves the public key for the given domain and selector. @@ -54,6 +58,11 @@ public interface IDkimPublicKeyLocator /// /// /// + /// + /// + /// + /// + /// /// /// The public key. /// A colon-separated list of query methods used to retrieve the public key. The default is "dns/txt". @@ -63,7 +72,7 @@ public interface IDkimPublicKeyLocator AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)); /// - /// Asynchronously locate and retrieves the public key for the given domain and selector. + /// Asynchronously locate and retrieve the public key for the given domain and selector. /// /// /// Locates and retrieves the public key for the given domain and selector. @@ -71,6 +80,11 @@ public interface IDkimPublicKeyLocator /// /// /// + /// + /// + /// + /// + /// /// /// The public key. /// A colon-separated list of query methods used to retrieve the public key. The default is "dns/txt". diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 6b2f75e84d..01a7c3433d 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -84,6 +84,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 11b04c685e..8eb4ea572f 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -73,6 +73,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index b75d4e3db4..43ffe6cd90 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -81,6 +81,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 67255b6371..2093ff2013 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -65,6 +65,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 46bc534dad..e98eef6d47 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -70,6 +70,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index a169d6a912..8fb8998ab8 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -66,6 +66,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 604878ab3b..d589655862 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -72,6 +72,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 10fdd6577b..55cd121e43 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -76,6 +76,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index ab16b25e13..987abe2127 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -81,6 +81,7 @@ + diff --git a/UnitTests/Cryptography/DkimPublicKeyLocator.cs b/UnitTests/Cryptography/DkimPublicKeyLocator.cs index 3d3f5b40d3..a017f3ef6d 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocator.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocator.cs @@ -25,21 +25,17 @@ // using System; -using System.IO; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.OpenSsl; -using Org.BouncyCastle.Crypto.Parameters; using MimeKit.Cryptography; namespace UnitTests.Cryptography { - class DkimPublicKeyLocator : IDkimPublicKeyLocator + class DkimPublicKeyLocator : DkimPublicKeyLocatorBase { readonly Dictionary keys; @@ -53,79 +49,17 @@ public void Add (string key, string value) keys.Add (key, value); } - public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + public override AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { var query = selector + "._domainkey." + domain; - if (keys.TryGetValue (query, out string txt)) { - AsymmetricKeyParameter pubkey; - string k = null, p = null; - int index = 0; - - // parse the response (will look something like: "k=rsa; p=") - while (index < txt.Length) { - while (index < txt.Length && char.IsWhiteSpace (txt[index])) - index++; - - if (index == txt.Length) - break; - - // find the end of the key - int startIndex = index; - while (index < txt.Length && txt[index] != '=') - index++; - - if (index == txt.Length) - break; - - var key = txt.Substring (startIndex, index - startIndex); - - // skip over the '=' - index++; - - // find the end of the value - startIndex = index; - while (index < txt.Length && txt[index] != ';') - index++; - - var value = txt.Substring (startIndex, index - startIndex).Replace (" ", ""); - - switch (key) { - case "k": k = value; break; - case "p": p = value; break; - } - - // skip over the ';' - index++; - } - - if (k != null && p != null) { - if (k == "rsa") { - var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; - var rawData = Encoding.ASCII.GetBytes (data); - - using (var stream = new MemoryStream (rawData, false)) { - using (var reader = new StreamReader (stream)) { - var pem = new PemReader (reader); - - pubkey = pem.ReadObject () as AsymmetricKeyParameter; - - if (pubkey != null) - return pubkey; - } - } - } else if (k == "ed25519") { - var decoded = Convert.FromBase64String (p); - - return new Ed25519PublicKeyParameters (decoded, 0); - } - } - } + if (keys.TryGetValue (query, out string txt)) + return GetPublicKey (txt); throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); } - public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + public override Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { return Task.FromResult (LocatePublicKey (methods, domain, selector, cancellationToken)); } From 12db487345a52cd2d3f1763ecce1cb689ccc98c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 8 Jun 2019 10:56:18 -0400 Subject: [PATCH 331/741] Fixed the build for .NETPortable --- MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index d59d1cc7ea..aca3515d77 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -30,6 +30,10 @@ using System.Threading; using System.Threading.Tasks; +#if PORTABLE +using Encoding = Portable.Text.Encoding; +#endif + using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Crypto.Parameters; From 122c5e0f2f4335121e75f15baa1ca1a159227106 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 8 Jun 2019 11:00:34 -0400 Subject: [PATCH 332/741] Fixed DkimPublicKeyLocatorBase.GetPublicKey() to throw ANE when txt == null --- MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index aca3515d77..d7efb4c157 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -74,6 +74,9 @@ protected AsymmetricKeyParameter GetPublicKey (string txt) string k = null, p = null; int index = 0; + if (txt == null) + throw new ArgumentNullException (nameof (txt)); + // parse the response (will look something like: "k=rsa; p=") while (index < txt.Length) { while (index < txt.Length && char.IsWhiteSpace (txt[index])) From f3190f1c74003ecb20760a7f8731881d66689ceb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 8 Jun 2019 16:06:07 -0400 Subject: [PATCH 333/741] Added more unit tests --- .../Cryptography/DkimPublicKeyLocatorBase.cs | 13 +++- .../DkimPublicKeyLocatorBaseTests.cs | 68 +++++++++++++++++++ UnitTests/UnitTests.csproj | 1 + 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index d7efb4c157..7768ea08a0 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -103,11 +103,18 @@ protected AsymmetricKeyParameter GetPublicKey (string txt) while (index < txt.Length && txt[index] != ';') index++; - var value = txt.Substring (startIndex, index - startIndex).Replace (" ", ""); + var value = txt.Substring (startIndex, index - startIndex); switch (key) { - case "k": k = value; break; - case "p": p = value; break; + case "k": + switch (value) { + case "rsa": case "ed25519": k = value; break; + default: throw new ParseException ($"Unknown public key algorithm: {value}", startIndex, index); + } + break; + case "p": + p = value.Replace (" ", ""); + break; } // skip over the ';' diff --git a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs new file mode 100644 index 0000000000..6fcd84d70a --- /dev/null +++ b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs @@ -0,0 +1,68 @@ +// +// DkimPublicKeyLocatorBaseTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using NUnit.Framework; + +using MimeKit; + +namespace UnitTests.Cryptography { + [TestFixture] + public class DkimPublicKeyLocatorBaseTests + { + [Test] + public void TestArgumentExceptions () + { + var locator = new DkimPublicKeyLocator (); + + locator.Add ("dummy._domainkey.example.org", null); + + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "dummy")); + Assert.Throws (async () => await locator.LocatePublicKeyAsync ("dns/txt", "example.org", "dummy")); + } + + [Test] + public void TestParseExceptions () + { + var locator = new DkimPublicKeyLocator (); + + locator.Add ("empty._domainkey.example.org", string.Empty); + locator.Add ("whitespace._domainkey.example.org", " "); + locator.Add ("no-k-or-p-params._domainkey.example.org", "v=DKIM1; x=abc; y=def"); + locator.Add ("no-k-param._domainkey.example.org", "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + locator.Add ("no-p-param._domainkey.example.org", "v=DKIM1; k=rsa"); + locator.Add ("unknown-algorithm._domainkey.example.org", "v=DKIM1; k=dummy; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id"); + + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "empty")); + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "whitespace")); + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-k-or-p-params")); + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-k-param")); + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-p-param")); + Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "unknown-algorithm")); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 57932b1c2e..c035bf90eb 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -81,6 +81,7 @@ + From 34ef1e13bd4031667f55cb7bfa44962894da642e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 10 Jun 2019 09:06:34 -0400 Subject: [PATCH 334/741] Addded doc examples for ArcSigner and ArcVerifier --- MimeKit/Cryptography/ArcSigner.cs | 36 +++++++++++++++++++++++++++++ MimeKit/Cryptography/ArcVerifier.cs | 30 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 1ef5682d43..91c9f29b81 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -45,6 +45,9 @@ namespace MimeKit.Cryptography { /// /// An ARC signer. /// + /// + /// + /// public abstract class ArcSigner : DkimSignerBase { static readonly string[] ArcShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "arc-seal" }; @@ -105,6 +108,9 @@ protected ArcSigner (AsymmetricKeyParameter key, string domain, string selector, /// /// Creates a new . /// + /// + /// + /// /// The file containing the private key. /// The domain that the signer represents. /// The selector subdividing the domain. @@ -190,6 +196,9 @@ protected ArcSigner (Stream stream, string domain, string selector, DkimSignatur /// will be used as the cv= tag value /// in the ARC-Seal header generated by the . /// + /// + /// + /// /// The format options. /// The message to create the ARC-Authentication-Results header for. /// The cancellation token. @@ -206,6 +215,9 @@ protected ArcSigner (Stream stream, string domain, string selector, DkimSignatur /// will be used as the cv= tag value /// in the ARC-Seal header generated by the . /// + /// + /// + /// /// The format options. /// The message to create the ARC-Authentication-Results header for. /// The cancellation token. @@ -458,6 +470,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Digitally signs and seals a message using ARC. /// + /// + /// + /// /// The formatting options. /// The message to sign. /// The list of header fields to sign. @@ -489,6 +504,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Asynchronously digitally signs and seals a message using ARC. /// + /// + /// + /// /// The formatting options. /// The message to sign. /// The list of header fields to sign. @@ -520,6 +538,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Digitally signs and seals a message using ARC. /// + /// + /// + /// /// The message to sign. /// The list of header fields to sign. /// The cancellation token. @@ -548,6 +569,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Asynchronously digitally signs and seals a message using ARC. /// + /// + /// + /// /// The message to sign. /// The list of header fields to sign. /// The cancellation token. @@ -576,6 +600,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Digitally signs and seals a message using ARC. /// + /// + /// + /// /// The formatting options. /// The message to sign. /// The list of header fields to sign. @@ -607,6 +634,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Asynchronously digitally signs and seals a message using ARC. /// + /// + /// + /// /// The formatting options. /// The message to sign. /// The list of header fields to sign. @@ -638,6 +668,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Digitally signs and seals a message using ARC. /// + /// + /// + /// /// The message to sign. /// The list of header fields to sign. /// The cancellation token. @@ -666,6 +699,9 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// Asynchronously digitally signs and seals a message using ARC. /// + /// + /// + /// /// The message to sign. /// The list of header fields to sign. /// The cancellation token. diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 557822f067..0502f175f2 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -42,6 +42,9 @@ namespace MimeKit.Cryptography { /// /// An ARC signature validation result. /// + /// + /// + /// public enum ArcSignatureValidationResult { /// @@ -66,6 +69,9 @@ public enum ArcSignatureValidationResult /// /// Represents an ARC header and its signature validation result. /// + /// + /// + /// public class ArcHeaderValidationResult { /// @@ -135,6 +141,9 @@ public Header Header { /// result will be and both /// and will be null. /// + /// + /// + /// public class ArcValidationResult { internal ArcValidationResult () @@ -189,6 +198,9 @@ public ArcHeaderValidationResult[] Seals { /// /// Gets the signature validation results of the entire chain. /// + /// + /// + /// /// The signature validation results of the entire chain. public ArcSignatureValidationResult Chain { get; internal set; @@ -242,6 +254,9 @@ public bool Add (Header header, Dictionary parameters) /// /// Validates Authenticated Received Chains. /// + /// + /// + /// public class ArcVerifier : DkimVerifierBase { /// @@ -250,6 +265,9 @@ public class ArcVerifier : DkimVerifierBase /// /// Creates a new . /// + /// + /// + /// /// The public key locator. /// /// is null. @@ -581,6 +599,9 @@ async Task VerifyAsync (FormatOptions options, MimeMessage /// /// Verifies the ARC signature chain. /// + /// + /// + /// /// The ARC validation result. /// The formatting options. /// The message to verify. @@ -604,6 +625,9 @@ async Task VerifyAsync (FormatOptions options, MimeMessage /// /// Asynchronously verifies the ARC signature chain. /// + /// + /// + /// /// The ARC validation result. /// The formatting options. /// The message to verify. @@ -627,6 +651,9 @@ async Task VerifyAsync (FormatOptions options, MimeMessage /// /// Verifies the ARC signature chain. /// + /// + /// + /// /// The ARC validation result. /// The message to verify. /// The cancellation token. @@ -647,6 +674,9 @@ async Task VerifyAsync (FormatOptions options, MimeMessage /// /// Asynchronously verifies the ARC signature chain. /// + /// + /// + /// /// The ARC validation result. /// The message to verify. /// The cancellation token. From d5601a1568e8c24cbaf3795ea95263476416c193 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 10 Jun 2019 17:11:00 -0400 Subject: [PATCH 335/741] Updated docs --- Documentation/Documentation.shfbproj | 7 + Documentation/Examples/ArcSignerExample.cs | 124 ++++ Documentation/Examples/ArcVerifierExample.cs | 139 +++++ Documentation/Examples/AttachmentExamples.cs | 76 +++ Documentation/Examples/BodyBuilder.cs | 77 ++- .../Examples/CreateMultipartAlternative.cs | 2 +- Documentation/Examples/DkimExamples.cs | 30 + Documentation/Examples/DkimVerifierExample.cs | 142 +++++ Documentation/Examples/ForwardExamples.cs | 104 ++++ Documentation/Examples/MimeIterator.cs | 19 +- Documentation/Examples/MimeVisitorExamples.cs | 547 ++++++++++++++++++ .../Examples/MultipartFormDataExample.cs | 2 +- Documentation/Examples/OpenPGPExamples.cs | 2 +- Documentation/Examples/SMimeExamples.cs | 2 +- 14 files changed, 1243 insertions(+), 30 deletions(-) create mode 100644 Documentation/Examples/ArcSignerExample.cs create mode 100644 Documentation/Examples/ArcVerifierExample.cs create mode 100644 Documentation/Examples/AttachmentExamples.cs create mode 100644 Documentation/Examples/DkimExamples.cs create mode 100644 Documentation/Examples/DkimVerifierExample.cs create mode 100644 Documentation/Examples/ForwardExamples.cs create mode 100644 Documentation/Examples/MimeVisitorExamples.cs diff --git a/Documentation/Documentation.shfbproj b/Documentation/Documentation.shfbproj index 1ee6febd83..b8d1ac3663 100644 --- a/Documentation/Documentation.shfbproj +++ b/Documentation/Documentation.shfbproj @@ -85,16 +85,23 @@ + + + + + + + diff --git a/Documentation/Examples/ArcSignerExample.cs b/Documentation/Examples/ArcSignerExample.cs new file mode 100644 index 0000000000..d51ab53750 --- /dev/null +++ b/Documentation/Examples/ArcSignerExample.cs @@ -0,0 +1,124 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; + +using MimeKit; +using MimeKit.Cryptography; + +namespace ArcSignerExample +{ + class ExampleArcSigner : ArcSigner + { + public ExampleArcSigner (Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (stream, domain, selector, algorithm) + { + } + + public DummyArcSigner (string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (fileName, domain, selector, algorithm) + { + } + + public DummyArcSigner (AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) : base (key, domain, selector, algorithm) + { + } + + public string AuthenticationServiceIdentifier { + get; set; + } + + /// + /// Generate the ARC-Authentication-Results header. + /// + /// + /// The ARC-Authentication-Results header contains information detailing the results of + /// authenticating/verifying the message via ARC, DKIM, SPF, etc. + /// + /// In the following implementation, we assume that all of these authentication results + /// have already been determined by other mail software that has added some Authentication-Results + /// headers containing this information. + /// + /// Note: This method is used when ArcSigner.Sign() is called instead of ArcSigner.SignAsync(). + /// + protected override AuthenticationResults GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) + { + var results = new AuthenticationResults (AuthenticationServiceIdentifier); + + for (int i = 0; i < message.Headers.Count; i++) { + var header = message.Headers[i]; + + if (header.Id != HeaderId.AuthenticationResults) + continue; + + if (!AuthenticationResults.TryParse (header.RawValue, out AuthenticationResults authres)) + continue; + + if (authres.AuthenticationServiceIdentifier != AuthenticationServiceIdentifier) + continue; + + foreach (var result in authres.Results) { + if (!results.Results.Any (r => r.Method == result.Method)) + results.Results.Add (result); + } + } + + return results; + } + + protected override Task GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) + { + return Task.FromResult (GenerateArcAuthenticationResults (options, message, cancellationToken)); + } + } + + class Program + { + public static void Main (string[] args) + { + if (args.Length < 2) { + Help (); + return; + } + + for (int i = 0; i < args.Length; i++) { + if (args[i] == "--help") { + Help (); + return; + } + } + + var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; + var signer = new ExampleArcSigner ("privatekey.pem", "example.com", "brisbane", DkimSignatureAlgorithm.RsaSha256) { + HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, + BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, + AgentOrUserIdentifier = "@eng.example.com", + }; + + if (!File.Exists (args[0])) { + Console.Error.WriteLine ("{0}: No such file.", args[0]); + return; + } + + var message = MimeMessage.Load (args[0]); + + // Prepare the message body to be sent over a 7bit transport (such as older versions of SMTP). + // Note: If the SMTP server you will be sending the message over supports the 8BITMIME extension, + // then you can use `EncodingConstraint.EightBit` instead. + message.Prepare (EncodingConstraint.SevenBit); + + signer.Sign (message, headers); + + using (var stream = File.Create (args[1])) + message.WriteTo (stream); + } + + static void Help () + { + Console.WriteLine ("Usage is: ArcSigner [options] [message] [output]"); + Console.WriteLine (); + Console.WriteLine ("Options:"); + Console.WriteLine (" --help This help menu."); + } + } +} diff --git a/Documentation/Examples/ArcVerifierExample.cs b/Documentation/Examples/ArcVerifierExample.cs new file mode 100644 index 0000000000..7b3b8e2c0c --- /dev/null +++ b/Documentation/Examples/ArcVerifierExample.cs @@ -0,0 +1,139 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Heijden.DNS; + +using Org.BouncyCastle.Crypto; + +using MimeKit; +using MimeKit.Cryptography; + +namespace ArcVerifierExample +{ + // Note: By using the DkimPublicKeyLocatorBase, we avoid having to parse the DNS TXT records + // in order to get the public key ourselves. + class ExamplePublicKeyLocator : DkimPublicKeyLocatorBase + { + readonly Dictionary cache; + readonly Resolver resolver; + + public ExamplePublicKeyLocator () + { + cache = new Dictionary (); + + resolver = new Resolver ("8.8.8.8") { + TransportType = TransportType.Udp, + UseCache = true, + Retries = 3 + }; + } + + AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationToken cancellationToken) + { + var query = selector + "._domainkey." + domain; + AsymmetricKeyParameter pubkey; + + // checked if we've already fetched this key + if (cache.TryGetValue (query, out pubkey)) + return pubkey; + + // make a DNS query + var response = resolver.Query (query, QType.TXT); + var builder = new StringBuilder (); + + // combine the TXT records into 1 string buffer + foreach (var record in response.RecordsTXT) { + foreach (var text in record.TXT) + builder.Append (text); + } + + var txt = builder.ToString (); + + // DkimPublicKeyLocatorBase provides us with this helpful method. + pubkey = GetPublicKey (txt); + + cache.Add (query, pubkey); + + return pubkey; + } + + public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + var methodList = methods.Split (new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < methodList.Length; i++) { + if (methodList[i] == "dns/txt") + return DnsLookup (domain, selector, cancellationToken); + } + + throw new NotSupportedException (string.Format ("{0} does not include any suported lookup methods.", methods)); + } + + public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + return Task.Run (() => { + return LocatePublicKey (methods, domain, selector, cancellationToken); + }, cancellationToken); + } + } + + class Program + { + public static void Main (string[] args) + { + if (args.Length == 0) { + Help (); + return; + } + + for (int i = 0; i < args.Length; i++) { + if (args[i] == "--help") { + Help (); + return; + } + } + + var locator = new ExamplePublicKeyLocator (); + var verifier = new ArcVerifier (locator); + + for (int i = 0; i < args.Length; i++) { + if (!File.Exists (args[i])) { + Console.Error.WriteLine ("{0}: No such file.", args[i]); + continue; + } + + Console.Write ("{0} -> ", args[i]); + + var message = MimeMessage.Load (args[i]); + var result = verifier.Verify (message); + + switch (result.Chain) { + case ArcSignatureValidationResult.None: + Console.WriteLine ("No ARC signatures to verify."); + break; + case ArcSignatureValidationResult.Pass: + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine ("PASS"); + Console.ResetColor (); + break; + case ArcSignatureValidationResult.Fail: + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine ("FAIL"); + Console.ResetColor (); + break; + } + } + } + + static void Help () + { + Console.WriteLine ("Usage is: ArcVerifier [options] [messages]"); + Console.WriteLine (); + Console.WriteLine ("Options:"); + Console.WriteLine (" --help This help menu."); + } + } +} diff --git a/Documentation/Examples/AttachmentExamples.cs b/Documentation/Examples/AttachmentExamples.cs new file mode 100644 index 0000000000..ed81446736 --- /dev/null +++ b/Documentation/Examples/AttachmentExamples.cs @@ -0,0 +1,76 @@ +using System; + +using MimeKit; + +namespace MimeKit.Examples +{ + public static class AttachmentExamples + { + public static void SaveMimePart (MimePart attachment, string fileName) + { + #region SaveMimePart + using (var stream = File.Create (fileName)) + attachment.Content.DecodeTo (stream); + #endregion SaveMimePart + } + + public static void SaveMimePart (MessagePart attachment, string fileName) + { + #region SaveMessagePart + using (var stream = File.Create (fileName)) + attachment.Message.WriteTo (stream); + #endregion SaveMessagePart + } + + public static void SaveAttachments (MimeMessage message) + { + #region SaveAttachments + foreach (var attachment in message.Attachments) { + if (attachment is MessagePart) { + var fileName = attachment.ContentDisposition?.FileName; + var rfc822 = (MessagePart) attachment; + + if (string.IsNullOrEmoty (fileName)) + fileName = "attached-message.eml"; + + using (var stream = File.Create (fileName)) + rfc822.Message.WriteTo (stream); + } else { + var part = (MimePart) attachment; + var fileName = part.FileName; + + using (var stream = File.Create (fileName)) + part.Content.DecodeTo (stream); + } + } + #endregion SaveAttachments + } + + public static void SaveAttachments (MimeMessage message) + { + #region SaveBodyParts + foreach (var bodyPart in message.BodyParts) { + if (!bodyPart.IsAttachment) + continue; + + if (bodyPart is MessagePart) { + var fileName = attachment.ContentDisposition?.FileName; + var rfc822 = (MessagePart) attachment; + + if (string.IsNullOrEmoty (fileName)) + fileName = "attached-message.eml"; + + using (var stream = File.Create (fileName)) + rfc822.Message.WriteTo (stream); + } else { + var part = (MimePart) attachment; + var fileName = part.FileName; + + using (var stream = File.Create (fileName)) + part.Content.DecodeTo (stream); + } + } + #endregion SaveBodyParts + } + } +} diff --git a/Documentation/Examples/BodyBuilder.cs b/Documentation/Examples/BodyBuilder.cs index 1a5fbe973d..034659228b 100644 --- a/Documentation/Examples/BodyBuilder.cs +++ b/Documentation/Examples/BodyBuilder.cs @@ -1,12 +1,21 @@ -var message = new MimeMessage (); -message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); -message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); -message.Subject = "How you doin?"; +using MimeKit; -var builder = new BodyBuilder (); +namespace BodyBuilderExamples +{ + public class Program + { + public static void Complex () + { + #region Complex + var message = new MimeMessage (); + message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); + message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); + message.Subject = "How you doin?"; -// Set the plain-text version of the message text -builder.TextBody = @"Hey Alice, + var builder = new BodyBuilder (); + + // Set the plain-text version of the message text + builder.TextBody = @"Hey Alice, What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it. @@ -16,20 +25,54 @@ Will you be my +1? -- Joey "; -// Set the html version of the message text -builder.HtmlBody = @"

Hey Alice,
+ // In order to reference selfie.jpg from the html text, we'll need to add it + // to builder.LinkedResources and then use its Content-Id value in the img src. + var image = builder.LinkedResources.Add (@"C:\Users\Joey\Documents\Selfies\selfie.jpg"); + image.ContentId = MimeUtils.GenerateMessageId (); + + // Set the html version of the message text + builder.HtmlBody = string.Format (@"

Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on Saturday and I was hoping you could make it.

Will you be my +1?

-- Joey
-

"; +
", image.ContentId); + + // We may also want to attach a calendar event for Monica's party... + builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics"); + + // Now we just need to set the message body and we're done + message.Body = builder.ToMessageBody (); + #endregion + } + + public static void Simple () + { + #region Simple + var message = new MimeMessage (); + message.From.Add (new MailboxAddress ("Joey", "joey@friends.com")); + message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com")); + message.Subject = "How you doin?"; + + var builder = new BodyBuilder (); + + // Set the plain-text version of the message text + builder.TextBody = @"Hey Alice, -// Since sexy-pose.jpg is referenced from the html text, we'll need to add it -// to builder.LinkedResources -builder.LinkedResources.Add ("C:\\Users\\Joey\\Documents\\Selfies\\sexy-pose.jpg"); +What are you up to this weekend? Monica is throwing one of her parties on +Saturday and I was hoping you could make it. + +Will you be my +1? + +-- Joey +"; -// We may also want to attach a calendar event for Monica's party... -builder.Attachments.Add ("C:\\Users\Joey\\Documents\\party.ics"); + // We may also want to attach a calendar event for Monica's party... + builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics"); -// Now we just need to set the message body and we're done -message.Body = builder.ToMessageBody (); + // Now we just need to set the message body and we're done + message.Body = builder.ToMessageBody (); + #endregion + } + } +} diff --git a/Documentation/Examples/CreateMultipartAlternative.cs b/Documentation/Examples/CreateMultipartAlternative.cs index cca41d260d..4067578e23 100644 --- a/Documentation/Examples/CreateMultipartAlternative.cs +++ b/Documentation/Examples/CreateMultipartAlternative.cs @@ -5,7 +5,7 @@ // Note: it is important that the text/html part is added second, because it is the // most expressive version and (probably) the most faithful to the sender's WYSIWYG // editor. -var alternative = new Multipart ("alternative"); +var alternative = new MultipartAlternative (); alternative.Add (plain); alternative.Add (html); diff --git a/Documentation/Examples/DkimExamples.cs b/Documentation/Examples/DkimExamples.cs new file mode 100644 index 0000000000..aec9f71e8c --- /dev/null +++ b/Documentation/Examples/DkimExamples.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; + +using MimeKit; + +namespace MimeKit.Examples +{ + public static class DkimExamples + { + #region DkimSign + public static void DkimSign (MimeMessage message) + { + var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; + var signer = new DkimSigner ("privatekey.pem", "example.com", "brisbane", DkimSignatureAlgorithm.RsaSha256) { + HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, + BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, + AgentOrUserIdentifier = "@eng.example.com", + QueryMethod = "dns/txt", + }; + + // Prepare the message body to be sent over a 7bit transport (such as older versions of SMTP). + // Note: If the SMTP server you will be sending the message over supports the 8BITMIME extension, + // then you can use `EncodingConstraint.EightBit` instead. + message.Prepare (EncodingConstraint.SevenBit); + + signer.Sign (message, headers); + } + #endregion + } +} diff --git a/Documentation/Examples/DkimVerifierExample.cs b/Documentation/Examples/DkimVerifierExample.cs new file mode 100644 index 0000000000..d89389dfa0 --- /dev/null +++ b/Documentation/Examples/DkimVerifierExample.cs @@ -0,0 +1,142 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Heijden.DNS; + +using Org.BouncyCastle.Crypto; + +using MimeKit; +using MimeKit.Cryptography; + +namespace DkimVerifierExample +{ + // Note: By using the DkimPublicKeyLocatorBase, we avoid having to parse the DNS TXT records + // in order to get the public key ourselves. + class ExamplePublicKeyLocator : DkimPublicKeyLocatorBase + { + readonly Dictionary cache; + readonly Resolver resolver; + + public ExamplePublicKeyLocator () + { + cache = new Dictionary (); + + resolver = new Resolver ("8.8.8.8") { + TransportType = TransportType.Udp, + UseCache = true, + Retries = 3 + }; + } + + AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationToken cancellationToken) + { + var query = selector + "._domainkey." + domain; + AsymmetricKeyParameter pubkey; + + // checked if we've already fetched this key + if (cache.TryGetValue (query, out pubkey)) + return pubkey; + + // make a DNS query + var response = resolver.Query (query, QType.TXT); + var builder = new StringBuilder (); + + // combine the TXT records into 1 string buffer + foreach (var record in response.RecordsTXT) { + foreach (var text in record.TXT) + builder.Append (text); + } + + var txt = builder.ToString (); + + // DkimPublicKeyLocatorBase provides us with this helpful method. + pubkey = GetPublicKey (txt); + + cache.Add (query, pubkey); + + return pubkey; + } + + public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + var methodList = methods.Split (new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < methodList.Length; i++) { + if (methodList[i] == "dns/txt") + return DnsLookup (domain, selector, cancellationToken); + } + + throw new NotSupportedException (string.Format ("{0} does not include any suported lookup methods.", methods)); + } + + public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + return Task.Run (() => { + return LocatePublicKey (methods, domain, selector, cancellationToken); + }, cancellationToken); + } + } + + class Program + { + public static void Main (string[] args) + { + if (args.Length == 0) { + Help (); + return; + } + + for (int i = 0; i < args.Length; i++) { + if (args[i] == "--help") { + Help (); + return; + } + } + + var locator = new ExamplePublicKeyLocator (); + var verifier = new DkimVerifier (locator); + + for (int i = 0; i < args.Length; i++) { + if (!File.Exists (args[i])) { + Console.Error.WriteLine ("{0}: No such file.", args[i]); + continue; + } + + Console.Write ("{0} -> ", args[i]); + + var message = MimeMessage.Load (args[i]); + var index = message.Headers.IndexOf (HeaderId.DkimSignature); + + if (index == -1) { + Console.WriteLine ("NO SIGNATURE"); + continue; + } + + var dkim = message.Headers[index]; + + if (verifier.Verify (message, dkim)) { + // the DKIM-Signature header is valid! + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine ("VALID"); + Console.ResetColor (); + } else { + // the DKIM-Signature is invalid! + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine ("INVALID"); + Console.ResetColor (); + } + } + } + + static void Help () + { + Console.WriteLine ("Usage is: DkimVerifier [options] [messages]"); + Console.WriteLine (); + Console.WriteLine ("Options:"); + Console.WriteLine (" --help This help menu."); + } + } +} diff --git a/Documentation/Examples/ForwardExamples.cs b/Documentation/Examples/ForwardExamples.cs new file mode 100644 index 0000000000..a7ca86cd09 --- /dev/null +++ b/Documentation/Examples/ForwardExamples.cs @@ -0,0 +1,104 @@ +// +// MimeVisitorExamples.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2016 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Collections.Generic; + +using MimeKit; + +namespace MimeKit.Examples +{ + public static class ForwardExamples + { + #region ForwardAttached + public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) + { + var message = new MimeMessage (); + message.From.Add (from); + message.To.AddRange (to); + + // set the forwarded subject + if (!original.Subject.StartsWith ("FW:", StringComparison.OrdinalIgnoreCase)) + message.Subject = "FW: " + original.Subject; + else + message.Subject = original.Subject; + + // create the main textual body of the message + var text = new TextPart ("plain") { Text = "Here's the forwarded message:" }; + + // create the message/rfc822 attachment for the original message + var rfc822 = new MessagePart { Message = original }; + + // create a multipart/mixed container for the text body and the forwarded message + var multipart = new Multipart ("mixed"); + multipart.Add (text); + multipart.Add (rfc822); + + // set the multipart as the body of the message + message.Body = multipart; + + return message; + } + #endregion ForwardAttached + + #region ForwardInline + public static MimeMessage Forward (MimeMessage original, MailboxAddress from, IEnumerable to) + { + var message = new MimeMessage (); + message.From.Add (from); + message.To.AddRange (to); + + // set the forwarded subject + if (!original.Subject.StartsWith ("FW:", StringComparison.OrdinalIgnoreCase)) + message.Subject = "FW: " + original.Subject; + else + message.Subject = original.Subject; + + // quote the original message text + using (var text = new StringWriter ()) { + text.WriteLine (); + text.WriteLine ("-----Original Message-----"); + test.WriteLine ("From: {0}", original.From); + text.WriteLine ("Sent: {0}", DateUtils.FormatDate (original.Date)); + text.WriteLine ("To: {0}", original.To); + text.WriteLine ("Subject: {0}", original.Subject); + text.WriteLine (); + + text.Write (original.TextBody); + + message.Body = new TextPart ("plain") { + Text = text.ToString () + }; + } + + return message; + } + #endregion ForwardInline + } +} \ No newline at end of file diff --git a/Documentation/Examples/MimeIterator.cs b/Documentation/Examples/MimeIterator.cs index a2760e38a0..56e9831aaa 100644 --- a/Documentation/Examples/MimeIterator.cs +++ b/Documentation/Examples/MimeIterator.cs @@ -1,16 +1,17 @@ var attachments = new List (); var multiparts = new List (); -var iter = new MimeIterator (message); -// collect our list of attachments and their parent multiparts -while (iter.MoveNext ()) { - var multipart = iter.Parent as Multipart; - var part = iter.Current as MimePart; +using (var iter = new MimeIterator (message)) { + // collect our list of attachments and their parent multiparts + while (iter.MoveNext ()) { + var multipart = iter.Parent as Multipart; + var part = iter.Current as MimePart; - if (multipart != null && part != null && part.IsAttachment) { - // keep track of each attachment's parent multipart - multiparts.Add (multipart); - attachments.Add (part); + if (multipart != null && part != null && part.IsAttachment) { + // keep track of each attachment's parent multipart + multiparts.Add (multipart); + attachments.Add (part); + } } } diff --git a/Documentation/Examples/MimeVisitorExamples.cs b/Documentation/Examples/MimeVisitorExamples.cs new file mode 100644 index 0000000000..43ac3451a0 --- /dev/null +++ b/Documentation/Examples/MimeVisitorExamples.cs @@ -0,0 +1,547 @@ +// +// MimeVisitorExamples.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2016 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Collections.Generic; + +using MimeKit; +using MimeKit.Text; +using MimeKit.Tnef; + +namespace MimeKit.Examples +{ + #region HtmlPreviewVisitor + /// + /// Visits a MimeMessage and generates HTML suitable to be rendered by a browser control. + /// + class HtmlPreviewVisitor : MimeVisitor + { + List stack = new List (); + List attachments = new List (); + readonly string tempDir; + string body; + + /// + /// Creates a new HtmlPreviewVisitor. + /// + /// A temporary directory used for storing image files. + public HtmlPreviewVisitor (string tempDirectory) + { + tempDir = tempDirectory; + } + + /// + /// The list of attachments that were in the MimeMessage. + /// + public IList Attachments { + get { return attachments; } + } + + /// + /// The HTML string that can be set on the BrowserControl. + /// + public string HtmlBody { + get { return body ?? string.Empty; } + } + + protected override void VisitMultipartAlternative (MultipartAlternative alternative) + { + // walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful + for (int i = alternative.Count - 1; i >= 0 && body == null; i--) + alternative[i].Accept (this); + } + + protected override void VisitMultipartRelated (MultipartRelated related) + { + var root = related.Root; + + // push this multipart/related onto our stack + stack.Add (related); + + // visit the root document + root.Accept (this); + + // pop this multipart/related off our stack + stack.RemoveAt (stack.Count - 1); + } + + // look up the image based on the img src url within our multipart/related stack + bool TryGetImage (string url, out MimePart image) + { + UriKind kind; + int index; + Uri uri; + + if (Uri.IsWellFormedUriString (url, UriKind.Absolute)) + kind = UriKind.Absolute; + else if (Uri.IsWellFormedUriString (url, UriKind.Relative)) + kind = UriKind.Relative; + else + kind = UriKind.RelativeOrAbsolute; + + try { + uri = new Uri (url, kind); + } catch { + image = null; + return false; + } + + for (int i = stack.Count - 1; i >= 0; i--) { + if ((index = stack[i].IndexOf (uri)) == -1) + continue; + + image = stack[i][index] as MimePart; + return image != null; + } + + image = null; + + return false; + } + + // Save the image to our temp directory and return a "file://" url suitable for + // the browser control to load. + // Note: if you'd rather embed the image data into the HTML, you can construct a + // "data:" url instead. + string SaveImage (MimePart image, string url) + { + string fileName = url.Replace (':', '_').Replace ('\\', '_').Replace ('/', '_'); + + string path = Path.Combine (tempDir, fileName); + + if (!File.Exists (path)) { + using (var output = File.Create (path)) + image.Content.DecodeTo (output); + } + + return "file://" + path.Replace ('\\', '/'); + } + + // Replaces urls that refer to images embedded within the message with + // "file://" urls that the browser control will actually be able to load. + void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) + { + if (ctx.TagId == HtmlTagId.Image && !ctx.IsEndTag && stack.Count > 0) { + ctx.WriteTag (htmlWriter, false); + + // replace the src attribute with a file:// URL + foreach (var attribute in ctx.Attributes) { + if (attribute.Id == HtmlAttributeId.Src) { + MimePart image; + string url; + + if (!TryGetImage (attribute.Value, out image)) { + htmlWriter.WriteAttribute (attribute); + continue; + } + + url = SaveImage (image, attribute.Value); + + htmlWriter.WriteAttributeName (attribute.Name); + htmlWriter.WriteAttributeValue (url); + } else { + htmlWriter.WriteAttribute (attribute); + } + } + } else if (ctx.TagId == HtmlTagId.Body && !ctx.IsEndTag) { + ctx.WriteTag (htmlWriter, false); + + // add and/or replace oncontextmenu="return false;" + foreach (var attribute in ctx.Attributes) { + if (attribute.Name.ToLowerInvariant () == "oncontextmenu") + continue; + + htmlWriter.WriteAttribute (attribute); + } + + htmlWriter.WriteAttribute ("oncontextmenu", "return false;"); + } else { + // pass the tag through to the output + ctx.WriteTag (htmlWriter, true); + } + } + + protected override void VisitTextPart (TextPart entity) + { + TextConverter converter; + + if (body != null) { + // since we've already found the body, treat this as an attachment + attachments.Add (entity); + return; + } + + if (entity.IsHtml) { + converter = new HtmlToHtml { + HtmlTagCallback = HtmlTagCallback + }; + } else if (entity.IsFlowed) { + var flowed = new FlowedToHtml (); + string delsp; + + if (entity.ContentType.Parameters.TryGetValue ("delsp", out delsp)) + flowed.DeleteSpace = delsp.ToLowerInvariant () == "yes"; + + converter = flowed; + } else { + converter = new TextToHtml (); + } + + body = converter.Convert (entity.Text); + } + + protected override void VisitTnefPart (TnefPart entity) + { + // extract any attachments in the MS-TNEF part + attachments.AddRange (entity.ExtractAttachments ()); + } + + protected override void VisitMessagePart (MessagePart entity) + { + // treat message/rfc822 parts as attachments + attachments.Add (entity); + } + + protected override void VisitMimePart (MimePart entity) + { + // realistically, if we've gotten this far, then we can treat this as an attachment + // even if the IsAttachment property is false. + attachments.Add (entity); + } + } + #endregion + + #region ReplyVisitor + public class ReplyVisitor : MimeVisitor + { + readonly Stack stack = new Stack (); + MimeMessage message; + MimeEntity body; + + /// + /// Creates a new ReplyVisitor. + /// + public ReplyVisitor () + { + } + + /// + /// Gets the reply. + /// + /// The reply. + public MimeEntity Body { + get { return body; } + } + + void Push (MimeEntity entity) + { + var multipart = entity as Multipart; + + if (body == null) { + body = entity; + } else { + var parent = stack.Peek (); + parent.Add (entity); + } + + if (multipart != null) + stack.Push (multipart); + } + + void Pop () + { + stack.Pop (); + } + + public static string GetOnDateSenderWrote (MimeMessage message) + { + var sender = message.Sender != null ? message.Sender : message.From.Mailboxes.FirstOrDefault (); + var name = sender != null ? (!string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address) : "someone"; + + return string.Format ("On {0}, {1} wrote:", message.Date.ToString ("f"), name); + } + + /// + /// Visit the specified message. + /// + /// The message. + public override void Visit (MimeMessage message) + { + this.message = message; + stack.Clear (); + + base.Visit (message); + } + + protected override void VisitMultipartAlternative (MultipartAlternative alternative) + { + var multipart = new MultipartAlternative (); + + Push (multipart); + + for (int i = 0; i < alternative.Count; i++) + alternative[i].Accept (this); + + Pop (); + } + + protected override void VisitMultipartRelated (MultipartRelated related) + { + var multipart = new MultipartRelated (); + var root = related.Root; + + Push (multipart); + + root.Accept (this); + + for (int i = 0; i < related.Count; i++) { + if (related[i] != root) + related[i].Accept (this); + } + + Pop (); + } + + protected override void VisitMultipart (Multipart multipart) + { + foreach (var part in multipart) { + if (part is MultipartAlternative) + part.Accept (this); + else if (part is MultipartRelated) + part.Accept (this); + else if (part is TextPart) + part.Accept (this); + } + } + + void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) + { + if (ctx.TagId == HtmlTagId.Body && !ctx.IsEmptyElementTag) { + if (ctx.IsEndTag) { + // end our opening
+ htmlWriter.WriteEndTag (HtmlTagId.BlockQuote); + + // pass the tag through to the output + ctx.WriteTag (htmlWriter, true); + } else { + // pass the tag through to the output + ctx.WriteTag (htmlWriter, true); + + // prepend the HTML reply with "On {DATE}, {SENDER} wrote:" + htmlWriter.WriteStartTag (HtmlTagId.P); + htmlWriter.WriteText (GetOnDateSenderWrote (message)); + htmlWriter.WriteEndTag (HtmlTagId.P); + + // Wrap the original content in a
+ htmlWriter.WriteStartTag (HtmlTagId.BlockQuote); + htmlWriter.WriteAttribute (HtmlAttributeId.Style, "border-left: 1px #ccc solid; margin: 0 0 0 .8ex; padding-left: 1ex;"); + + ctx.InvokeCallbackForEndTag = true; + } + } else { + // pass the tag through to the output + ctx.WriteTag (htmlWriter, true); + } + } + + string QuoteText (string text) + { + using (var quoted = new StringWriter ()) { + quoted.WriteLine (GetOnDateSenderWrote (message)); + + using (var reader = new StringReader (text)) { + string line; + + while ((line = reader.ReadLine ()) != null) { + quoted.Write ("> "); + quoted.WriteLine (line); + } + } + + return quoted.ToString (); + } + } + + protected override void VisitTextPart (TextPart entity) + { + string text; + + if (entity.IsHtml) { + var converter = new HtmlToHtml { + HtmlTagCallback = HtmlTagCallback + }; + + text = converter.Convert (entity.Text); + } else if (entity.IsFlowed) { + var converter = new FlowedToText (); + + text = converter.Convert (entity.Text); + text = QuoteText (text); + } else { + // quote the original message text + text = QuoteText (entity.Text); + } + + var part = new TextPart (entity.ContentType.MediaSubtype.ToLowerInvariant ()) { + Text = text + }; + + Push (part); + } + + protected override void VisitMessagePart (MessagePart entity) + { + // don't descend into message/rfc822 parts + } + } + #endregion + + public class Program + { + #region RenderMessage + void Render (MimeMessage message) + { + var tmpDir = Path.Combine (Path.GetTempPath (), message.MessageId); + var visitor = new HtmlPreviewVisitor (tmpDir); + + Directory.CreateDirectory (tmpDir); + + message.Accept (visitor); + + DisplayHtml (visitor.HtmlBody); + DisplayAttachments (visitor.Attachments); + } + #endregion + + #region ReplySimple + public static MimeMessage Reply (MimeMessage message, MailboxAddress from, bool replyToAll) + { + var reply = new MimeMessage (); + + reply.From.Add (from); + + // reply to the sender of the message + if (message.ReplyTo.Count > 0) { + reply.To.AddRange (message.ReplyTo); + } else if (message.From.Count > 0) { + reply.To.AddRange (message.From); + } else if (message.Sender != null) { + reply.To.Add (message.Sender); + } + + if (replyToAll) { + // include all of the other original recipients (removing ourselves from the list) + reply.To.AddRange (message.To.Mailboxes.Where (x => x.Address != from.Address)); + reply.Cc.AddRange (message.Cc.Mailboxes.Where (x => x.Address != from.Address)); + } + + // set the reply subject + if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) + reply.Subject = "Re: " + message.Subject; + else + reply.Subject = message.Subject; + + // construct the In-Reply-To and References headers + if (!string.IsNullOrEmpty (message.MessageId)) { + reply.InReplyTo = message.MessageId; + foreach (var id in message.References) + reply.References.Add (id); + reply.References.Add (message.MessageId); + } + + // quote the original message text + using (var quoted = new StringWriter ()) { + var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault (); + var name = sender != null ? (!string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address) : "someone"; + + quoted.WriteLine ("On {0}, {1} wrote:", message.Date.ToString ("f"), name); + using (var reader = new StringReader (message.TextBody)) { + string line; + + while ((line = reader.ReadLine ()) != null) { + quoted.Write ("> "); + quoted.WriteLine (line); + } + } + + reply.Body = new TextPart ("plain") { + Text = quoted.ToString () + }; + } + + return reply; + } + #endregion + + #region Reply + public static MimeMessage Reply (MimeMessage message, MailboxAddress from, bool replyToAll) + { + var visitor = new ReplyVisitor (); + var reply = new MimeMessage (); + + reply.From.Add (from); + + // reply to the sender of the message + if (message.ReplyTo.Count > 0) { + reply.To.AddRange (message.ReplyTo); + } else if (message.From.Count > 0) { + reply.To.AddRange (message.From); + } else if (message.Sender != null) { + reply.To.Add (message.Sender); + } + + if (replyToAll) { + // include all of the other original recipients (removing ourselves from the list) + reply.To.AddRange (message.To.Mailboxes.Where (x => x.Address != from.Address)); + reply.Cc.AddRange (message.Cc.Mailboxes.Where (x => x.Address != from.Address)); + } + + // set the reply subject + if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) + reply.Subject = "Re: " + message.Subject; + else + reply.Subject = message.Subject; + + // construct the In-Reply-To and References headers + if (!string.IsNullOrEmpty (message.MessageId)) { + reply.InReplyTo = message.MessageId; + foreach (var id in message.References) + reply.References.Add (id); + reply.References.Add (message.MessageId); + } + + visitor.Visit (message); + + reply.Body = visitor.Body ?? new TextPart ("plain") { Text = ReplyVisitor.GetOnDateSenderWrote (message) + Environment.NewLine }; + + return reply; + } + #endregion + } +} diff --git a/Documentation/Examples/MultipartFormDataExample.cs b/Documentation/Examples/MultipartFormDataExample.cs index 722f490e73..157af96124 100644 --- a/Documentation/Examples/MultipartFormDataExample.cs +++ b/Documentation/Examples/MultipartFormDataExample.cs @@ -11,7 +11,7 @@ MimeEntity ParseMultipartFormData (HttpWebResponse response) { var contentType = ContentType.Parse (response.ContentType); - return MimeEntity.Parse (contentType, response.GetResponseStream ()); + return MimeEntity.Load (contentType, response.GetResponseStream ()); } #endregion diff --git a/Documentation/Examples/OpenPGPExamples.cs b/Documentation/Examples/OpenPGPExamples.cs index de4b40589b..6007cce257 100644 --- a/Documentation/Examples/OpenPGPExamples.cs +++ b/Documentation/Examples/OpenPGPExamples.cs @@ -30,7 +30,7 @@ public void RegisterMyGnuPGeContext () #region RegisterCustomContext // Note: by registering our custom context it becomes the default OpenPGP context // instantiated by MimeKit when methods such as Encrypt(), Decrypt(), Sign(), and - // Verify() are used without an expliit context. + // Verify() are used without an explicit context. CryptographyContext.Register (typeof (MyGnuPGContext)); #endregion } diff --git a/Documentation/Examples/SMimeExamples.cs b/Documentation/Examples/SMimeExamples.cs index ac6431b310..fa5de663e7 100644 --- a/Documentation/Examples/SMimeExamples.cs +++ b/Documentation/Examples/SMimeExamples.cs @@ -39,7 +39,7 @@ public void RegisterMySecureMimeContext () #region RegisterCustomContext // Note: by registering our custom context it becomes the default S/MIME context // instantiated by MimeKit when methods such as Encrypt(), Decrypt(), Sign(), and - // Verify() are used without an expliit context. + // Verify() are used without an explicit context. CryptographyContext.Register (typeof (MySecureMimeContext)); #endregion } From e647cabf28d39b856f43735abbb5283cbe373c0c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 11 Jun 2019 06:09:31 -0400 Subject: [PATCH 336/741] bumped version to 2.2.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +- README.md | 268 +++++++++++++++++++------ ReleaseNotes.md | 11 + TODO.md | 10 - appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 17 +- nuget/MimeKitLite.nuspec | 8 +- 10 files changed, 230 insertions(+), 98 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 2093ff2013..99325126e9 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.1.5.1 + 2.2.0.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index c03b614c85..d2a0cb0383 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.1.5.1 + 2.2.0.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index f124522881..40ff6caf46 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.1.5.1")] -[assembly: AssemblyFileVersion ("2.1.5.1")] -[assembly: AssemblyVersion ("2.1.0.0")] +[assembly: AssemblyInformationalVersion ("2.2.0.0")] +[assembly: AssemblyFileVersion ("2.2.0.0")] +[assembly: AssemblyVersion ("2.2.0.0")] diff --git a/README.md b/README.md index ebd4f82139..122a8f6c89 100644 --- a/README.md +++ b/README.md @@ -837,10 +837,9 @@ file called **privatekey.pem**: ```csharp var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; -var headerAlgorithm = DkimCanonicalizationAlgorithm.Simple; -var bodyAlgorithm = DkimCanonicalizationAlgorithm.Simple; -var signer = new DkimSigner ("privatekey.pem") { - SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1, +var signer = new DkimSigner ("privatekey.pem", "example.com", "brisbane", DkimSignatureAlgorithm.RsaSha256) { + HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, + BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Simple, AgentOrUserIdentifier = "@eng.example.com", QueryMethod = "dns/txt", }; @@ -850,7 +849,7 @@ var signer = new DkimSigner ("privatekey.pem") { // then you can use `EncodingConstraint.EightBit` instead. message.Prepare (EncodingConstraint.SevenBit); -message.Sign (signer, headers, headerAlgorithm, bodyAlgorithm); +signer.Sign (message, headers); ``` As you can see, it's fairly straight forward. @@ -871,6 +870,7 @@ using System; using System.IO; using System.Text; using System.Threading; +using System.Threading.Tasks; using System.Collections.Generic; using Heijden.DNS; @@ -883,7 +883,9 @@ using MimeKit.Cryptography; namespace DkimVerifier { - class DkimPublicKeyLocator : IDkimPublicKeyLocator + // Note: By using the DkimPublicKeyLocatorBase, we avoid having to parse the DNS TXT records + // in order to get the public key ourselves. + class DkimPublicKeyLocator : DkimPublicKeyLocatorBase { readonly Dictionary cache; readonly Resolver resolver; @@ -919,66 +921,9 @@ namespace DkimVerifier } var txt = builder.ToString (); - string k = null, p = null; - int index = 0; - // parse the response (will look something like: "k=rsa; p=") - while (index < txt.Length) { - while (index < txt.Length && char.IsWhiteSpace (txt[index])) - index++; - - if (index == txt.Length) - break; - - // find the end of the key - int startIndex = index; - while (index < txt.Length && txt[index] != '=') - index++; - - if (index == txt.Length) - break; - - var key = txt.Substring (startIndex, index - startIndex); - - // skip over the '=' - index++; - - // find the end of the value - startIndex = index; - while (index < txt.Length && txt[index] != ';') - index++; - - var value = txt.Substring (startIndex, index - startIndex); - - switch (key) { - case "k": k = value; break; - case "p": p = value; break; - } - - // skip over the ';' - index++; - } - - if (k != null && p != null) { - var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; - var rawData = Encoding.ASCII.GetBytes (data); - - using (var stream = new MemoryStream (rawData, false)) { - using (var reader = new StreamReader (stream)) { - var pem = new PemReader (reader); - - pubkey = pem.ReadObject () as AsymmetricKeyParameter; - - if (pubkey != null) { - cache.Add (query, pubkey); - - return pubkey; - } - } - } - } - - throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); + // DkimPublicKeyLocatorBase provides us with this helpful method. + return GetPublicKey (txt); } public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) @@ -991,6 +936,13 @@ namespace DkimVerifier throw new NotSupportedException (string.Format ("{0} does not include any suported lookup methods.", methods)); } + + public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + { + return Task.Run (() => { + return LocatePublicKey (methods, domain, selector, cancellationToken); + }, cancellationToken); + } } class Program @@ -1010,6 +962,7 @@ namespace DkimVerifier } var locator = new DkimPublicKeyLocator (); + var verifier = new DkimVerifier (locator); for (int i = 0; i < args.Length; i++) { if (!File.Exists (args[i])) { @@ -1029,7 +982,7 @@ namespace DkimVerifier var dkim = message.Headers[index]; - if (message.Verify (dkim, locator)) { + if (verifier.Verify (message, dkim)) { // the DKIM-Signature header is valid! Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine ("VALID"); @@ -1054,6 +1007,189 @@ namespace DkimVerifier } ``` +### Signing Messages with ARC + +Signing with ARC is similar to DKIM but quite a bit more involved. In order to sign with +ARC, you must first validate that the existing message is authentictic and produce +an ARC-Authentication-Results header containing the methods that you used to +authenticate the message as well as their results. + +The abstract [ArcSigner](http://www.mimekit.net/docs/html/T_MimeKit_Cryptography_ArcSigner.htm) +class provided by MimeKit will need to be subclassed before it can be used. An example subclass +that provides 2 different implementations for generating the ARC-Authentication-Results header +can be seen below: + +```csharp +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; + +using MimeKit; +using MimeKit.Cryptography; + +namespace ArcSignerExample +{ + class MyArcSigner : ArcSigner + { + public MyArcSigner (string fileName, string domain, string selector, DkimSigningAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256) + : base (fileName, domain, selector, algorithm) + { + } + + /// + /// Generate the ARC-Authentication-Results header. + /// + /// + /// The ARC-Authentication-Results header contains information detailing the results of + /// authenticating/verifying the message via ARC, DKIM, SPF, etc. + /// + /// In the following implementation, we assume that all of these authentication results + /// have already been determined by other mail software that has added some Authentication-Results + /// headers containing this information. + /// + /// Note: This method is used when ArcSigner.Sign() is called instead of ArcSigner.SignAsync(). + /// + protected override AuthenticationResults GenerateArcAuthenticationResults (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) + { + const string AuthenticationServiceIdentifier = "lists.example.com"; + + var results = new AuthenticationResults (AuthenticationServiceIdentifier); + + for (int i = 0; i < message.Headers.Count; i++) { + var header = message.Headers[i]; + + if (header.Id != HeaderId.AuthenticationResults) + continue; + + if (!AuthenticationResults.TryParse (header.RawValue, out AuthenticationResults authres)) + continue; + + if (authres.AuthenticationServiceIdentifier != AuthenticationServiceIdentifier) + continue; + + // Merge any authentication results that aren't already known. + foreach (var result in authres.Results) { + if (!results.Results.Any (r => r.Method == result.Method)) + results.Results.Add (result); + } + } + + return results; + } + + /// + /// Generate the ARC-Authentication-Results asynchronously. + /// + /// + /// The ARC-Authentication-Results header contains information detailing the results of + /// authenticating/verifying the message via ARC, DKIM, SPF, etc. + /// + /// In the following implementation, we assume that we have to verify all of the various + /// authentication methods ourselves. + /// + /// Note: This method is used when ArcSigner.SignAsync() is called instead of ArcSigner.Sign(). + /// + protected override async Task GenerateArcAuthenticationResultsAsync (FormatOptions options, MimeMessage message, CancellationToken cancellationToken) + { + const string AuthenticationServiceIdentifier = "lists.example.com"; + + var results = new AuthenticationResults (AuthenticationServiceIdentifier); + var locator = new DkimPublicKeyLocator (); // from the DKIM example above + var dkimVerifier = new DkimVerifier (locator); + var arcVerifier = new ArcVerifier (locator); + AuthenticationMethodResult method; + + // Add the ARC authentication results + try { + var arc = await arcVerifier.VerifyAsync (message, cancellationToken); + var result = arc.Chain.ToString ().ToLowerInvariant (); + + method = new AuthenticationMethodResult ("arc", result); + results.Results.Add (method); + } catch { + // Likely a DNS error + method = new AuthenticationMethodResult ("arc", "fail"); + method.Reason = "DNS error"; + results.Results.Add (method); + } + + // Add authentication results for each DKIM signature + foreach (var dkimHeader in message.Headers.Where (h => h.Id == HeaderId.DkimSignature)) { + string result; + + try { + if (await dkimVerifier.VerifyAsync (message, cancellationToken)) { + result = "pass"; + } else { + result = "fail"; + } + } catch { + result = "fail"; + } + + method = new AuthenticationMethodResult ("dkim", result); + + // Parse the DKIM-Signature header so that we can add some + // properties to our method result. + var params = dkimHeader.Value.Replace (" ", "").Split (new char[] { ';' }); + var i = params.FirstOrDefault (p => p.StartsWith ("i=", StringComparison.Ordinal)); + var b = params.FirstOrDefault (p => p.StartsWith ("b=", StringComparison.Ordinal)); + + if (i != null) + method.Parameters.Add ("header.i", i.Substring (2)); + + if (b != null) + method.Parameters.Add ("header.b", b.Substring (2, 8)); + + results.Results.Add (method); + } + + return results; + } + } +} +``` + +Once you have a custom `ArcSigner` class, the actual logic for signing is almost identical to DKIM. + +Note: As with the DKIM signing example above, assume that the private key is saved in a +file called **privatekey.pem**: + +```csharp +var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date }; +var signer = new MyArcSigner ("privatekey.pem", "example.com", "brisbane", DkimSignatureAlgorithm.RsaSha256) { + HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, + AgentOrUserIdentifier = "@eng.example.com" +}; + +// Prepare the message body to be sent over a 7bit transport (such as older versions of SMTP). +// Note: If the SMTP server you will be sending the message over supports the 8BITMIME extension, +// then you can use `EncodingConstraint.EightBit` instead. +message.Prepare (EncodingConstraint.SevenBit); + +signer.Sign (message, headers); // or SignAsync +``` + +### Verifying ARC Signatures + +Just like with verifying DKIM signatures, you will need to implement the `IDkimPublicKeyLocator` +interface. To see an example of how to implement this interface, see the DKIM signature verification +example above. + +The `ArcVerifier` works exactly the same as the `DkimVerifier` except that it is not necessary +to provide a `Header` argument to the `Verify` or `VerifyAsync` method. + +```csharp +var verifier = new ArcVerifier (new DkimPublicKeyLocator ()); +var results = await verifier.VerifyAsync (message); + +// The Chain results are the only real important results. +Console.WriteLine ("ARC results: {0}", results.Chain); +``` + ## Contributing The first thing you'll need to do is fork MimeKit to your own GitHub repository. For instructions on how to diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 4597b52217..618e761dbf 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,16 @@ # Release Notes +### MimeKit 2.2.0 (2019-06-11) + +* Added support for [ARC](https://arc-spec.org). +* Added AuthenticationResults class for parsing and constructing Authentication-Results and + ARC-Authentication-Results headers. +* Added support for the Ed25519-SHA256 DKIM signature algorithm. +* Obsoleted MimeMessage DKIM API's in favor of the newer DKIM API's: + - MimeMessage.Sign (DkimSigner, ...) has been replaced by DkimSigner.Sign (MimeMessage, ...). + - MimeMessage.Verify (Header, ...) has been replaced by DkimVerifier.Verify (MimeMessage, Header, ...). +* Added DkimPublicKeyLocatorBase to help simplify implementing IDkimPublicKeyLocator. + ### MimeKit 2.1.5 (2019-05-13) * Updated the BouncyCastle assemblies to version 1.8.5 for iOS and Android. diff --git a/TODO.md b/TODO.md index 58ee18df41..4322c74c22 100644 --- a/TODO.md +++ b/TODO.md @@ -4,16 +4,6 @@ * It would be nice to make DKIM support not depend on BouncyCastle at all so that DKIM support could be added to MimeKitLite. See: https://github.com/jstedfast/MimeKit/pull/296#issuecomment-355656935 - * Replace the DkimSigner.DigestSigner property with a method called - CreateSigningContext() or some such that returns an IDisposable replacement - for ISigner. - * The returned context should be IDisposable because System.Security-based - implementations need to be able to dispose the RSACryptoServiceProvider. - * This would also help facilitate dropping the dependency on BouncyCastle - since we could create a new IDkimSigningContext interface to replace the - use of ISigner. - * Or maybe DkimSigner could *be* the signing context instead of having a - CreateSigningContext() method? * If we had a nice DNS library that supported async/await, we could drop the IDkimPublicKeyLocator interface or at least provide a default implementation. Is it time for me to write DnsKit?? diff --git a/appveyor.yml b/appveyor.yml index d14382ba27..96d9fb4423 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.1.5.{build} +version: 2.2.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1a322f6007..bb8ff88f93 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.1.5$(Rev:.r) +name: 2.2.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index b2ab027672..6c6b15de76 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.1.5.1 + 2.2.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,14 +26,13 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Updated the BouncyCastle assemblies to version 1.8.5 for iOS and Android. -* Fixed a possible NullReferenceException when decoding S/MIME digital signatures. -* Fixed the netstandard2.0 dependencies to no longer explicitly include System.Net.Http. (issue #482) -* Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList. (issue #481) -* Fixed TnefReader.Dispose() to avoid a potential NullReferenceException if double disposed. -* Fixed the Message-Id, Content-Id, References and In-Reply-To parsers to be more liberal in what they accept in terms of the `msg-id` token. -* Changed the Header encoding logic for the In-Reply-To header to not rfc2047 encode the value even if it is longer than the suggested line-length. (issue #479) -* Reduced netstandard dependencies. (issue #475) +* Added support for [ARC](https://arc-spec.org). +* Added AuthenticationResults class for parsing and constructing Authentication-Results and ARC-Authentication-Results headers. +* Added support for the Ed25519-SHA256 DKIM signature algorithm. +* Obsoleted MimeMessage DKIM API's in favor of the newer DKIM API's: + - MimeMessage.Sign (DkimSigner, ...) has been replaced by DkimSigner.Sign (MimeMessage, ...). + - MimeMessage.Verify (Header, ...) has been replaced by DkimVerifier.Verify (MimeMessage, Header, ...). +* Added DkimPublicKeyLocatorBase to help simplify implementing IDkimPublicKeyLocator. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index b82b6a262b..3338b0e3f3 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.1.5.1 + 2.2.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,11 +26,7 @@ An Open Source library for creating and parsing MIME messages. -* Override Equals(object) and GetHashCode() for InternetAddress and InternetAddressList. (issue #481) -* Fixed TnefReader.Dispose() to avoid a potential NullReferenceException if double disposed. -* Fixed the Message-Id, Content-Id, References and In-Reply-To parsers to be more liberal in what they accept in terms of the `msg-id` token. -* Changed the Header encoding logic for the In-Reply-To header to not rfc2047 encode the value even if it is longer than the suggested line-length. (issue #479) -* Reduced netstandard dependencies. (issue #475) +* Added AuthenticationResults class for parsing and constructing Authentication-Results and ARC-Authentication-Results headers. Xamarin Inc. en-US From eaf1ef36308ca765c850820ffcd9d324a4390b47 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 11 Jun 2019 06:46:28 -0400 Subject: [PATCH 337/741] Updated samples --- nuget/MimeKit.nuspec | 2 +- .../DkimVerifier/DkimVerifier.csproj | 4 +- samples/DkimVerifier/DkimVerifier/Program.cs | 73 +++---------------- .../DkimVerifier/DkimVerifier/packages.config | 2 +- .../HtmlPreviewVisitor.cs | 2 +- .../MessageReader.Android/MainActivity.cs | 2 +- .../MessageReader.Android.csproj | 6 +- .../MultipartRelatedWebViewClient.cs | 2 +- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/AppDelegate.cs | 2 +- .../MessageReader.iOS/HtmlPreviewVisitor.cs | 2 +- .../MessageReader.iOS/Main.cs | 2 +- .../MessageReader.iOS.csproj | 6 +- .../MessageReaderViewController.cs | 2 +- .../MultipartRelatedUrlCache.cs | 2 +- .../MessageReader.iOS/packages.config | 2 +- .../MessageReader/HtmlPreviewVisitor.cs | 2 +- .../MessageReader/MessageReader.csproj | 4 +- .../MessageReader/MessageViewWindow.cs | 2 +- .../MessageReader/packages.config | 2 +- 20 files changed, 34 insertions(+), 89 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 6c6b15de76..774ab80e23 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -36,7 +36,7 @@ Xamarin Inc. en-US - mime encryption dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid win8 wp81 + mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid win8 wp81 diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 9c8746e8d7..6a9030bd13 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.1.5.1\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.2.0\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/Program.cs b/samples/DkimVerifier/DkimVerifier/Program.cs index 81cff1ccb6..568255f6f0 100644 --- a/samples/DkimVerifier/DkimVerifier/Program.cs +++ b/samples/DkimVerifier/DkimVerifier/Program.cs @@ -8,14 +8,13 @@ using Heijden.DNS; using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.OpenSsl; using MimeKit; using MimeKit.Cryptography; -namespace DkimVerifier +namespace DkimVerifierExample { - class DkimPublicKeyLocator : IDkimPublicKeyLocator + class DkimPublicKeyLocator : DkimPublicKeyLocatorBase { readonly Dictionary cache; readonly Resolver resolver; @@ -51,69 +50,14 @@ AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationTo } var txt = builder.ToString (); - string k = null, p = null; - int index = 0; - // parse the response (will look something like: "k=rsa; p=") - while (index < txt.Length) { - while (index < txt.Length && char.IsWhiteSpace (txt[index])) - index++; + pubkey = GetPublicKey (txt); + cache.Add (query, pubkey); - if (index == txt.Length) - break; - - // find the end of the key - int startIndex = index; - while (index < txt.Length && txt[index] != '=') - index++; - - if (index == txt.Length) - break; - - var key = txt.Substring (startIndex, index - startIndex); - - // skip over the '=' - index++; - - // find the end of the value - startIndex = index; - while (index < txt.Length && txt[index] != ';') - index++; - - var value = txt.Substring (startIndex, index - startIndex); - - switch (key) { - case "k": k = value; break; - case "p": p = value; break; - } - - // skip over the ';' - index++; - } - - if (k != null && p != null) { - var data = "-----BEGIN PUBLIC KEY-----\r\n" + p + "\r\n-----END PUBLIC KEY-----\r\n"; - var rawData = Encoding.ASCII.GetBytes (data); - - using (var stream = new MemoryStream (rawData, false)) { - using (var reader = new StreamReader (stream)) { - var pem = new PemReader (reader); - - pubkey = pem.ReadObject () as AsymmetricKeyParameter; - - if (pubkey != null) { - cache.Add (query, pubkey); - - return pubkey; - } - } - } - } - - throw new Exception (string.Format ("Failed to look up public key for: {0}", domain)); + return pubkey; } - public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + public override AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { var methodList = methods.Split (new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < methodList.Length; i++) { @@ -124,7 +68,7 @@ AsymmetricKeyParameter DnsLookup (string domain, string selector, CancellationTo throw new NotSupportedException (string.Format ("{0} does not include any suported lookup methods.", methods)); } - public Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) + public override Task LocatePublicKeyAsync (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) { throw new NotImplementedException ("Asynchronous DKIM public key lookup is not implemented in this sample."); } @@ -147,6 +91,7 @@ public static void Main (string[] args) } var locator = new DkimPublicKeyLocator (); + var verifier = new DkimVerifier (locator); for (int i = 0; i < args.Length; i++) { if (!File.Exists (args[i])) { @@ -166,7 +111,7 @@ public static void Main (string[] args) var dkim = message.Headers[index]; - if (message.Verify (dkim, locator)) { + if (verifier.Verify (message, dkim)) { // the DKIM-Signature header is valid! Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine ("VALID"); diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index ebc3992b30..417639cf28 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs b/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs index 5786da4580..e0811ade67 100644 --- a/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs +++ b/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs b/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs index 342099b38c..2760aae906 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs +++ b/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index e969a0d053..d17d5baaed 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.1.5.1\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.2.0\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.1.5.1\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.2.0\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs b/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs index c5270622dd..692fce1040 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs +++ b/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 404ca43163..de34aa3759 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs b/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs index 233e196905..a1aa3ac29d 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs b/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs index 761033cacb..d107031a74 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/Main.cs b/samples/MessageReader.iOS/MessageReader.iOS/Main.cs index 683d25e588..4a59b5b5db 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/Main.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/Main.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index ca48852ad9..c902f5b9a2 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.1.5.1\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.2.0\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.1.5.1\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.2.0\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs b/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs index 823f5b65f1..4530daa8dd 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs b/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs index db90bf1950..e327879173 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 286cbbaf5b..91ae7b1b65 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs b/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs index 2355b8699e..d5a386a865 100644 --- a/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs +++ b/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 0902b59b02..da14e12bec 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.1.5.1\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.2.0\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/MessageViewWindow.cs b/samples/MessageReader/MessageReader/MessageViewWindow.cs index 59ccd830c7..19051821f7 100644 --- a/samples/MessageReader/MessageReader/MessageViewWindow.cs +++ b/samples/MessageReader/MessageReader/MessageViewWindow.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2017 Jeffrey Stedfast +// Copyright (c) 2014-2019 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 141a8832c5..5fa29f06a9 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From cb5dc10ef256610600222dec8335252da51ebafe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 11 Jun 2019 08:21:16 -0400 Subject: [PATCH 338/741] Fixed docs --- MimeKit/Cryptography/ArcSigner.cs | 4 +++ MimeKit/Cryptography/AuthenticationResults.cs | 1 + MimeKit/IMimeContent.cs | 14 +++++----- MimeKit/MessagePart.cs | 3 ++- MimeKit/MimeContent.cs | 14 +++++----- MimeKit/MimeEntity.cs | 26 ++++++++++++------- MimeKit/MimeMessage.cs | 18 ++++++++----- MimeKit/MimePart.cs | 3 ++- MimeKit/Multipart.cs | 3 ++- 9 files changed, 56 insertions(+), 30 deletions(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 91c9f29b81..ccae85fd56 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -507,6 +507,7 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// /// + /// An awaitable task. /// The formatting options. /// The message to sign. /// The list of header fields to sign. @@ -572,6 +573,7 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// /// + /// An awaitable task. /// The message to sign. /// The list of header fields to sign. /// The cancellation token. @@ -637,6 +639,7 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// /// + /// An awaitable task. /// The formatting options. /// The message to sign. /// The list of header fields to sign. @@ -702,6 +705,7 @@ Task SignAsync (FormatOptions options, MimeMessage message, IList head /// /// /// + /// An awaitable task. /// The message to sign. /// The list of header fields to sign. /// The cancellation token. diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 44acf1d277..42827303c3 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -1049,6 +1049,7 @@ public class AuthenticationMethodProperty /// /// The property type. /// The name of the property. + /// The value of the property. /// /// is null. /// -or- diff --git a/MimeKit/IMimeContent.cs b/MimeKit/IMimeContent.cs index 64b77fb32f..380ff1e323 100644 --- a/MimeKit/IMimeContent.cs +++ b/MimeKit/IMimeContent.cs @@ -78,6 +78,9 @@ public interface IMimeContent /// using a suitable decoder based on the property, otherwise the /// stream will be copied into the output stream as-is. /// + /// + /// + /// /// The output stream. /// The cancellation token. /// @@ -89,9 +92,6 @@ public interface IMimeContent /// /// An I/O error occurred. /// - /// - /// - /// void DecodeTo (Stream stream, CancellationToken cancellationToken = default (CancellationToken)); /// @@ -102,6 +102,10 @@ public interface IMimeContent /// using a suitable decoder based on the property, otherwise the /// stream will be copied into the output stream as-is. /// + /// + /// + /// + /// An awaitable task. /// The output stream. /// The cancellation token. /// @@ -113,9 +117,6 @@ public interface IMimeContent /// /// An I/O error occurred. /// - /// - /// - /// Task DecodeToAsync (Stream stream, CancellationToken cancellationToken = default (CancellationToken)); /// @@ -149,6 +150,7 @@ public interface IMimeContent /// If you want the decoded content, use /// instead. /// + /// An awaitable task. /// The output stream. /// The cancellation token. /// diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index 40be5e3914..f54c953ffc 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -243,8 +243,9 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously writes the to the output stream. /// /// - /// Writes the MIME entity and its message to the output stream. + /// Asynchronously writes the MIME entity and its message to the output stream. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// true if only the content should be written; otherwise, false. diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index 65fcafe18e..415cc4828c 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -226,6 +226,7 @@ public Stream Open () /// If you want the decoded content, use /// instead. /// + /// An awaitable task. /// The output stream. /// The cancellation token. /// @@ -275,6 +276,9 @@ public Stream Open () /// using a suitable decoder based on the property, otherwise the /// stream will be copied into the output stream as-is. /// + /// + /// + /// /// The output stream. /// The cancellation token. /// @@ -286,9 +290,6 @@ public Stream Open () /// /// An I/O error occurred. /// - /// - /// - /// public void DecodeTo (Stream stream, CancellationToken cancellationToken = default (CancellationToken)) { if (stream == null) @@ -309,6 +310,10 @@ public Stream Open () /// using a suitable decoder based on the property, otherwise the /// stream will be copied into the output stream as-is. /// + /// + /// + /// + /// An awaitable task. /// The output stream. /// The cancellation token. /// @@ -320,9 +325,6 @@ public Stream Open () /// /// An I/O error occurred. /// - /// - /// - /// public async Task DecodeToAsync (Stream stream, CancellationToken cancellationToken = default (CancellationToken)) { if (stream == null) diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 116fdbeb39..fdd9c123a8 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -430,9 +430,10 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously write the to the specified output stream. /// /// - /// Writes the headers to the output stream, followed by a blank line. + /// Asynchronously writes the headers to the output stream, followed by a blank line. /// Subclasses should override this method to write the content of the entity. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// true if only the content should be written; otherwise, false. @@ -492,9 +493,10 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously write the to the specified output stream. ///
/// - /// Writes the headers to the output stream, followed by a blank line. + /// Asynchronously writes the headers to the output stream, followed by a blank line. /// Subclasses should override this method to write the content of the entity. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// The cancellation token. @@ -538,11 +540,12 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Adsynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// - /// Writes the entity to the output stream. + /// Asynchronously writes the entity to the output stream. /// + /// An awaitable task. /// The output stream. /// true if only the content should be written; otherwise, false. /// The cancellation token. @@ -586,8 +589,9 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously write the to the specified output stream. ///
/// - /// Writes the entity to the output stream. + /// Asynchronously writes the entity to the output stream. /// + /// An awaitable task. /// The output stream. /// The cancellation token. /// @@ -656,8 +660,9 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously write the to the specified file. ///
/// - /// Writes the to the specified file using the provided formatting options. + /// Asynchronously writes the to the specified file using the provided formatting options. /// + /// An awaitable task. /// The formatting options. /// The file. /// true if only the content should be written; otherwise, false. @@ -749,8 +754,9 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously write the to the specified file. ///
/// - /// Writes the to the specified file using the provided formatting options. + /// Asynchronously writes the to the specified file using the provided formatting options. /// + /// An awaitable task. /// The formatting options. /// The file. /// The cancellation token. @@ -832,8 +838,9 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously write the to the specified file. ///
/// - /// Writes the to the specified file using the default formatting options. + /// Asynchronously writes the to the specified file using the default formatting options. /// + /// An awaitable task. /// The file. /// true if only the content should be written; otherwise, false. /// The cancellation token. @@ -909,8 +916,9 @@ public virtual void Accept (MimeVisitor visitor) /// Asynchronously writes the to the specified file. ///
/// - /// Writes the to the specified file using the default formatting options. + /// Asynchronously writes the to the specified file using the default formatting options. /// + /// An awaitable task. /// The file. /// The cancellation token. /// diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 9699cff840..b55eb3bfc8 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1130,8 +1130,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously write the message to the specified output stream. ///
/// - /// Writes the message to the output stream using the provided formatting options. + /// Asynchronously writes the message to the output stream using the provided formatting options. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// true if only the headers should be written; otherwise, false. @@ -1220,8 +1221,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously write the message to the specified output stream. ///
/// - /// Writes the message to the output stream using the provided formatting options. + /// Asynchronously writes the message to the output stream using the provided formatting options. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// The cancellation token. @@ -1268,8 +1270,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously write the message to the specified output stream. ///
/// - /// Writes the message to the output stream using the default formatting options. + /// Asynchronously writes the message to the output stream using the default formatting options. /// + /// An awaitable task. /// The output stream. /// true if only the headers should be written; otherwise, false. /// The cancellation token. @@ -1313,8 +1316,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously write the message to the specified output stream. ///
/// - /// Writes the message to the output stream using the default formatting options. + /// Asynchronously writes the message to the output stream using the default formatting options. /// + /// An awaitable task. /// The output stream. /// The cancellation token. /// @@ -1382,8 +1386,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously write the message to the specified file. ///
/// - /// Writes the message to the specified file using the provided formatting options. + /// Asynchronously writes the message to the specified file using the provided formatting options. /// + /// An awaitable task. /// The formatting options. /// The file. /// The cancellation token. @@ -1468,8 +1473,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously write the message to the specified file. ///
/// - /// Writes the message to the specified file using the default formatting options. + /// Asynchronously writes the message to the specified file using the default formatting options. /// + /// An awaitable task. /// The file. /// The cancellation token. /// diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 5197019b50..c3f1eec0c7 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -629,8 +629,9 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously writes the to the specified output stream. ///
/// - /// Writes the MIME part to the output stream. + /// Asynchronously writes the MIME part to the output stream. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// true if only the content should be written; otherwise, false. diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 91b365ec1f..e3f0149792 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -520,8 +520,9 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// Asynchronously writes the to the specified output stream. ///
/// - /// Writes the multipart MIME entity and its subparts to the output stream. + /// Asynchronously writes the multipart MIME entity and its subparts to the output stream. /// + /// An awaitable task. /// The formatting options. /// The output stream. /// true if only the content should be written; otherwise, false. From c2e0953a1c29f6594ed5f6044bdff21406fbc6db Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 11 Jun 2019 11:00:22 -0400 Subject: [PATCH 339/741] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 122a8f6c89..ff46b18ebe 100644 --- a/README.md +++ b/README.md @@ -876,12 +876,11 @@ using System.Collections.Generic; using Heijden.DNS; using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.OpenSsl; using MimeKit; using MimeKit.Cryptography; -namespace DkimVerifier +namespace DkimVerifierExample { // Note: By using the DkimPublicKeyLocatorBase, we avoid having to parse the DNS TXT records // in order to get the public key ourselves. @@ -923,7 +922,11 @@ namespace DkimVerifier var txt = builder.ToString (); // DkimPublicKeyLocatorBase provides us with this helpful method. - return GetPublicKey (txt); + pubkey = GetPublicKey (txt); + + cache.Add (query, pubkey); + + return pubkey; } public AsymmetricKeyParameter LocatePublicKey (string methods, string domain, string selector, CancellationToken cancellationToken = default (CancellationToken)) From b41549e31d6bc02f742ffa9af4d0024bb75c4bf4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 11 Jun 2019 11:32:07 -0400 Subject: [PATCH 340/741] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b735373365..d94a74e5f4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,6 +7,12 @@ about: Create a report to help us improve **Describe the bug** A clear and concise description of what the bug is. +**Platform (please complete the following information):** + - OS: [e.g. Windows, Linux, MacOS, iOS, Android, Windows Phone, etc.] + - .NET Runtime: [e.g. CoreCLR, Mono] + - .NET Framework: [e.g. .Net Core, .NET 4.5, UWP, etc.] + - MimeKit Version: + **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' @@ -20,16 +26,5 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - **Additional context** Add any other context about the problem here. From 95dd55eb975ca3565b994c3d81642a3b56a34859 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 12 Jun 2019 08:23:47 -0400 Subject: [PATCH 341/741] Added ARC draft spec --- rfc/draft-ietf-dmarc-arc-protocol-23.txt | 2240 ++++++++++++++++++++++ 1 file changed, 2240 insertions(+) create mode 100644 rfc/draft-ietf-dmarc-arc-protocol-23.txt diff --git a/rfc/draft-ietf-dmarc-arc-protocol-23.txt b/rfc/draft-ietf-dmarc-arc-protocol-23.txt new file mode 100644 index 0000000000..085309e59c --- /dev/null +++ b/rfc/draft-ietf-dmarc-arc-protocol-23.txt @@ -0,0 +1,2240 @@ + + + + +DMARC Working Group K. Andersen +Internet-Draft LinkedIn +Intended status: Experimental B. Long, Ed. +Expires: June 21, 2019 Google + S. Blank, Ed. + Valimail + M. Kucherawy, Ed. + TDP + December 18, 2018 + + + Authenticated Received Chain (ARC) Protocol + draft-ietf-dmarc-arc-protocol-23 + +Abstract + + The Authenticated Received Chain (ARC) protocol provides an + authenticated "chain of custody" for a message, allowing each entity + that handles the message to see what entities handled it before, and + to see what the message's authentication assessment was at each step + in the handling. + + ARC allows Internet Mail Handlers to attach assertions of message + authentication assessment to individual messages. As messages + traverse ARC-enabled Internet Mail Handlers, additional ARC + assertions can be attached to messages to form ordered sets of ARC + assertions that represent the authentication assessment at each step + of message handling paths. + + ARC-enabled Internet Mail Handlers can process sets of ARC assertions + to inform message disposition decisions, to identify Internet Mail + Handlers that might break existing authentication mechanisms, and to + convey original authentication assessments across trust boundaries. + +Status of This Memo + + This Internet-Draft is submitted in full conformance with the + provisions of BCP 78 and BCP 79. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF). Note that other groups may also distribute + working documents as Internet-Drafts. The list of current Internet- + Drafts is at https://datatracker.ietf.org/drafts/current/. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + + +Andersen, et al. Expires June 21, 2019 [Page 1] + +Internet-Draft ARC-Protocol December 2018 + + + This Internet-Draft will expire on June 21, 2019. + +Copyright Notice + + Copyright (c) 2018 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 + 2. General Concepts . . . . . . . . . . . . . . . . . . . . . . 5 + 2.1. Evidence . . . . . . . . . . . . . . . . . . . . . . . . 5 + 2.2. Custody . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 2.3. Chain of Custody . . . . . . . . . . . . . . . . . . . . 5 + 2.4. Validation of Chain of Custody . . . . . . . . . . . . . 5 + 3. Terminology and Definitions . . . . . . . . . . . . . . . . . 6 + 3.1. ARC Set . . . . . . . . . . . . . . . . . . . . . . . . . 6 + 3.2. Authenticated Received Chain (ARC) . . . . . . . . . . . 7 + 3.3. Internet Mail Handlers / Intermediaries . . . . . . . . . 7 + 3.4. Authentication Assessment . . . . . . . . . . . . . . . . 7 + 3.5. Signing vs Sealing . . . . . . . . . . . . . . . . . . . 7 + 3.6. Sealer . . . . . . . . . . . . . . . . . . . . . . . . . 8 + 3.7. Validator . . . . . . . . . . . . . . . . . . . . . . . . 8 + 3.8. Imported ABNF Tokens . . . . . . . . . . . . . . . . . . 8 + 3.9. Common ABNF Tokens . . . . . . . . . . . . . . . . . . . 8 + 4. Protocol Elements . . . . . . . . . . . . . . . . . . . . . . 8 + 4.1. ARC Header Fields . . . . . . . . . . . . . . . . . . . . 8 + 4.1.1. ARC-Authentication-Results (AAR) . . . . . . . . . . 9 + 4.1.2. ARC-Message-Signature (AMS) . . . . . . . . . . . . . 9 + 4.1.3. ARC-Seal (AS) . . . . . . . . . . . . . . . . . . . . 10 + 4.1.4. Internationalized Email (EAI) . . . . . . . . . . . . 11 + 4.2. ARC Set . . . . . . . . . . . . . . . . . . . . . . . . . 12 + 4.2.1. Instance Tags . . . . . . . . . . . . . . . . . . . . 12 + 4.3. Authenticated Received Chain . . . . . . . . . . . . . . 12 + 4.4. Chain Validation Status . . . . . . . . . . . . . . . . . 13 + 5. Protocol Actions . . . . . . . . . . . . . . . . . . . . . . 13 + 5.1. Sealer Actions . . . . . . . . . . . . . . . . . . . . . 14 + 5.1.1. Header Fields To Include In ARC-Seal Signatures . . . 15 + + + +Andersen, et al. Expires June 21, 2019 [Page 2] + +Internet-Draft ARC-Protocol December 2018 + + + 5.1.2. Marking and Sealing "cv=fail" (Invalid) Chains . . . 15 + 5.1.3. Only One Authenticated Received Chain Per Message . . 15 + 5.1.4. Broad Ability to Seal . . . . . . . . . . . . . . . . 16 + 5.1.5. Sealing is Always Safe . . . . . . . . . . . . . . . 16 + 5.2. Validator Actions . . . . . . . . . . . . . . . . . . . . 16 + 5.2.1. All Failures Are Permanent . . . . . . . . . . . . . 18 + 5.2.2. Responding to ARC Validation Failures During the SMTP + Transaction . . . . . . . . . . . . . . . . . . . . . 18 + 6. Communication of Validation Results . . . . . . . . . . . . . 18 + 7. Use Cases . . . . . . . . . . . . . . . . . . . . . . . . . . 19 + 7.1. Communicate Authentication Assessment Across Trust + Boundaries . . . . . . . . . . . . . . . . . . . . . . . 19 + 7.1.1. Message Scanning Services . . . . . . . . . . . . . . 19 + 7.1.2. Multi-tier MTA Processing . . . . . . . . . . . . . . 19 + 7.1.3. Mailing Lists . . . . . . . . . . . . . . . . . . . . 20 + 7.2. Inform Message Disposition Decisions . . . . . . . . . . 20 + 7.2.1. DMARC Local Policy Overrides . . . . . . . . . . . . 20 + 7.2.2. DMARC Reporting . . . . . . . . . . . . . . . . . . . 21 + 8. Privacy Considerations . . . . . . . . . . . . . . . . . . . 22 + 9. Security Considerations . . . . . . . . . . . . . . . . . . . 22 + 9.1. Increased Header Field Size . . . . . . . . . . . . . . . 22 + 9.2. DNS Operations . . . . . . . . . . . . . . . . . . . . . 22 + 9.3. Message Content Suspicion . . . . . . . . . . . . . . . . 23 + 9.4. Message Sealer Suspicion . . . . . . . . . . . . . . . . 23 + 9.5. Replay Attacks . . . . . . . . . . . . . . . . . . . . . 23 + 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23 + 10.1. Email Authentication Results Names Registry Update . . . 24 + 10.2. Email Authentication Methods Registry Update . . . . . . 24 + 10.3. Definitions of the ARC header fields . . . . . . . . . . 24 + 10.4. New Enhanced Status Code - ARC Validation . . . . . . . 25 + 11. Experimental Considerations . . . . . . . . . . . . . . . . . 25 + 11.1. Success Consideration . . . . . . . . . . . . . . . . . 25 + 11.2. Failure Considerations . . . . . . . . . . . . . . . . . 26 + 11.3. Open Questions . . . . . . . . . . . . . . . . . . . . . 26 + 11.3.1. Value of the ARC-Seal (AS) Header Field . . . . . . 26 + 11.3.2. Usage and/or signals from multiple selectors and/or + domains in ARC sets . . . . . . . . . . . . . . . . 26 + 11.3.3. DNS Overhead . . . . . . . . . . . . . . . . . . . . 26 + 11.3.4. What Trace Information is Valuable . . . . . . . . . 27 + 12. Implementation Status . . . . . . . . . . . . . . . . . . . . 27 + 12.1. GMail test reflector and incoming validation . . . . . . 28 + 12.2. AOL test reflector and internal tagging . . . . . . . . 28 + 12.3. dkimpy . . . . . . . . . . . . . . . . . . . . . . . . . 29 + 12.4. OpenARC . . . . . . . . . . . . . . . . . . . . . . . . 29 + 12.5. Mailman 3.x patch . . . . . . . . . . . . . . . . . . . 29 + 12.6. Copernica/MailerQ web-based validation . . . . . . . . . 30 + 12.7. Rspamd . . . . . . . . . . . . . . . . . . . . . . . . . 30 + 12.8. PERL MAIL::DKIM module . . . . . . . . . . . . . . . . . 31 + + + +Andersen, et al. Expires June 21, 2019 [Page 3] + +Internet-Draft ARC-Protocol December 2018 + + + 12.9. PERL Mail::Milter::Authentication module . . . . . . . . 31 + 12.10. Sympa List Manager . . . . . . . . . . . . . . . . . . . 32 + 12.11. Oracle Messaging Server . . . . . . . . . . . . . . . . 32 + 12.12. MessageSystems Momentum and PowerMTA platforms . . . . . 32 + 12.13. Exim . . . . . . . . . . . . . . . . . . . . . . . . . . 33 + 12.14. Halon MTA . . . . . . . . . . . . . . . . . . . . . . . 33 + 12.15. IIJ . . . . . . . . . . . . . . . . . . . . . . . . . . 33 + 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 33 + 13.1. Normative References . . . . . . . . . . . . . . . . . . 33 + 13.2. Informative References . . . . . . . . . . . . . . . . . 35 + 13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 36 + Appendix A. Design Requirements . . . . . . . . . . . . . . . . 36 + A.1. Primary Design Criteria . . . . . . . . . . . . . . . . . 36 + A.2. Out of Scope . . . . . . . . . . . . . . . . . . . . . . 37 + Appendix B. Example Usage . . . . . . . . . . . . . . . . . . . 37 + Appendix C. Acknowledgements . . . . . . . . . . . . . . . . . . 39 + Appendix D. Comments and Feedback . . . . . . . . . . . . . . . 39 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 39 + +1. Introduction + + The utility of widely deployed email authentication technologies such + as Sender Policy Framework (SPF) [RFC7208] and DomainKeys Identified + Mail (DKIM) [RFC6376] is impacted by the processing of Internet Mail + by intermediate handlers. This impact is thoroughly documented in + the defining documents for SPF and DKIM and further discussed in + [RFC6377] and [RFC7960]. + + DMARC [RFC7489] also relies upon SPF and DKIM authentication + mechanisms. Failures of authentication caused by the actions of + intermediate handlers can cause legitimate mail to be incorrectly + rejected or misdirected. + + Authenticated Received Chain (ARC) creates a mechanism for individual + Internet Mail Handlers to add their authentication assessment to a + message's ordered set of handling results. ARC encapsulates the + authentication assessment in a DKIM signature derivative to grant + other handlers the ability to verify the authenticity of the + individual assessment assertion as well as the aggregate set and + sequence of results. + + Ordered sets of authentication assessments can be used by ARC-enabled + Internet Mail Handlers to inform message handling disposition, to + identify where alteration of message content might have occurred, and + to provide additional trace information for use in understanding + message handling paths. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 4] + +Internet-Draft ARC-Protocol December 2018 + + +2. General Concepts + + ARC is loosely based on concepts from evidence collection. Evidence + is usually collected, labeled, stored, and transported in specific + ways to preserve the state of evidence and to document all processing + steps. + +2.1. Evidence + + In ARC's situation, the "evidence" is a message's authentication + assessment at any point along the delivery path between origination + and final delivery. Determination of message authentication can be + affected when intermediate handlers modify message content (header + fields and/or body content), route messages through unforeseen paths, + or change envelope information. + + The authentication assessment for a message is determined upon + receipt of a message and documented in the Authentication-Results + header field(s). ARC extends this mechanism to survive transit + through intermediary ADMDs. + + Because the first-hand determination of an authentication assessment + can never be reproduced by other handlers, the assertion of the + authentication assessment is more akin to testimony by a verifiable + party than hard evidence which can be independently evaluated. + +2.2. Custody + + "Custody" refers to when an Internet Mail Handler processes a + message. When a handler takes custody of a message, the handler + becomes a custodian and attaches their own evidence (authentication + assessment upon receipt) to the message if they are ARC-enabled. + Evidence is added in such a way so that future handlers can verify + the authenticity of both evidence and custody. + +2.3. Chain of Custody + + The "chain of custody" of ARC is the entire set of evidence and + custody that travels with a message. + +2.4. Validation of Chain of Custody + + Any ARC-enabled Internet Mail Handler can validate the entire set of + custody and the authentication assessments asserted by each party to + yield a valid Chain of Custody. If the evidence-supplying custodians + can be trusted, then the validated Chain of Custody describes the + (possibly changing) authentication assessment as the message traveled + through various custodians. + + + +Andersen, et al. Expires June 21, 2019 [Page 5] + +Internet-Draft ARC-Protocol December 2018 + + + Even though a message's authentication assessment might have changed, + the validated chain of custody can be used to determine if the + changes (and the custodians responsible for the changes) can be + tolerated. + +3. Terminology and Definitions + + This section defines terms used in the rest of the document. + + Readers should to be familiar with the contents, core concepts, and + definitions found in [RFC5598]. The potential roles of transit + services in the delivery of email are directly relevant. + + Language, syntax (including some ABNF constructs), and concepts are + imported from DKIM [RFC6376]. Specific references to DKIM are made + throughout this document. The following terms are imported from + [RFC5598]: + + o ADministrative Management Domain (ADMD), Section 2.3 + + o Message Transfer Agents (MTA), Section 4.3.2 + + o Message Submission Agent (MSA), Section 4.3.1 + + o Message Delivery Agent (MDA), Section 4.3.3 + + Syntax descriptions use Augmented BNF (ABNF) [RFC5234] and [RFC7405]. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. These words may also appear in this + document in lower case as plain English words, absent their normative + meanings. + +3.1. ARC Set + + Section 4.1 introduces three (3) ARC header fields which are added to + a message by an ARC-enabled internet mail handler. Together, these + three header fields compose a single "ARC Set". An ARC Set provides + the means for an Internet Mail Handler to attach an authentication + assessment to a message in a manner that can be verified by future + handlers. A single message can contain multiple ARC Sets. + + In general concept terms, an ARC Set represents Evidence and Custody. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 6] + +Internet-Draft ARC-Protocol December 2018 + + +3.2. Authenticated Received Chain (ARC) + + The sequence of ARC Sets attached to a message at a given time is + called the Authenticated Received Chain. An Authenticated Received + Chain is the record of individual authentication assessments as a + message traverses through ARC-participating ADMDs. + + The first attachment of an ARC Set to a message causes an + Authenticated Received Chain to be created. Additional attachments + of ARC Sets cause the Authenticated Received Chain to be extended. + + In General concept terms, an Authenticated Received Chain represents + Chain of Custody. + +3.3. Internet Mail Handlers / Intermediaries + + Internet Mail Handlers process and deliver messages across the + Internet and include MSAs, MTAs, MDAs, gateways, and mailing lists as + defined in [RFC5598]. + + Throughout this document the term "intermediaries" refers to the both + regular MTAs as well as delivery/reposting agents such as mailing + lists covered within the scope of [RFC5598]'s transit services. + + "Intermediaries" and "Internet Mail Handlers" are used synonymously + throughout this document. + +3.4. Authentication Assessment + + The Authentication Assessment which is affixed to a message as part + of each ARC Set consists of the "authres-payload" [I-D-7601bis]. For + the integrity of an ARC Set, the Authentication Assessment only needs + to be properly encapsulated within the ARC Set as defined below + Section 4.1. The accuracy or syntax of the authres-payload field + does not affect the validity of the ARC chain itself. + +3.5. Signing vs Sealing + + Signing is the process of affixing a digital signature to a message + as a header field, such as when a DKIM-Signature (as in [RFC6376] + section 2.1), or an AMS or AS is added. Sealing is when an ADMD + affixes a complete and valid ARC Set to a message creating or + continuing an Authenticated Received Chain. + + + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 7] + +Internet-Draft ARC-Protocol December 2018 + + +3.6. Sealer + + A Sealer is an Internet Mail Handler that attaches a complete and + valid ARC Set to a message. + + In general concept terms, a Sealer adds its testimony (assertion of + authentication assessment) and proof of custody to the Chain of + Custody. + +3.7. Validator + + A Validator is an ARC-enabled Internet Mail Handler that evaluates an + Authenticated Received Chain for validity and content. The process + of evaluation of the individual ARC Sets that compose an + Authenticated Received Chain is described in Section 5.2. + + In general concept terms, a Validator inspects the Chain of Custody + to determine the content and validity of individual Evidence supplied + by custodians. + +3.8. Imported ABNF Tokens + + The following ABNF tokens are imported: + + o tag-list ([RFC6376] section 3.2) + + o authres-payload ([I-D-7601bis] section 2.2) + + o cfws ([RFC5322] section 3.2.2) + +3.9. Common ABNF Tokens + + The following ABNF tokens are used elsewhere in this document: + + position = 1*2DIGIT ; 1 - 50 + instance = [CFWS] %s"i" [CFWS] "=" + [CFWS] position + chain-status = ("none" / "fail" / "pass") + seal-cv-tag = %s"cv" [CFWS] "=" + [CFWS] chain-status + +4. Protocol Elements + +4.1. ARC Header Fields + + ARC introduces three new header fields. Syntax for new header fields + adapts existing specifications. This document only describes where + + + + +Andersen, et al. Expires June 21, 2019 [Page 8] + +Internet-Draft ARC-Protocol December 2018 + + + ARC-specific changes in syntax and semantics differ from existing + specifications. + +4.1.1. ARC-Authentication-Results (AAR) + + The ARC-Authentication-Results (AAR) header field records the message + authentication assessment as processed by an ARC-participating ADMD + at message arrival time. + + In general concept terms, the AAR header field is where Evidence is + recorded by a custodian. + + The AAR header field is similar in syntax and semantics to an + Authentication-Results field [I-D-7601bis], with two (2) differences: + + o the name of the header field itself; + + o the presence of the "instance tag". Additional information on the + "instance tag" can be found in Section 4.2.1. + + The formal ABNF for the AAR header field is: + + arc-info = instance [CFWS] ";" authres-payload + arc-authres-header = "ARC-Authentication-Results:" [CFWS] arc-info + + Because there is only one AAR allowed per ARC set, the AAR MUST + contain the combined authres-payload with all of the authentication + results from within the participating ADMD, regardless of how many + Authentication-Results header fields are attached to the message. + +4.1.2. ARC-Message-Signature (AMS) + + The ARC-Message-Signature (AMS) header field allows an ARC- + participating ADMD to convey some responsibility (custodianship) for + a message and possible message modifications to future ARC- + participating custodians. + + In general concept terms, the AMS header field identifies a + custodian. + + The AMS header field has the same syntax and semantics as the DKIM- + Signature field [RFC6376], with three (3) differences: + + o the name of the header field itself; + + o no version tag ("v") is defined for the AMS header field. As + required for undefined tags (in [RFC6376]), if seen, a version tag + MUST be ignored; + + + +Andersen, et al. Expires June 21, 2019 [Page 9] + +Internet-Draft ARC-Protocol December 2018 + + + o the "i" (AUID) tag is not imported from DKIM; instead, this tag is + replaced by the "instance tag" as defined in Section 4.2.1; + + ARC places no requirements on the selectors and/or domains used for + the AMS header field signatures. + + The formal ABNF for the AMS header field is: + + arc-ams-info = instance [CFWS] ";" tag-list + arc-message-signature = "ARC-Message-Signature:" [CFWS] arc-ams-info + + To reduce the chances of accidental invalidation of AMS signatures: + + o AMS header fields are added by ARC-participating ADMDs as messages + exit the ADMD. AMS header fields SHOULD be attached so that any + modifications made by the ADMD are included in the signature of + the AMS header field. + + o Authentication-Results header fields MUST NOT be included in AMS + signatures as they are likely to be deleted by downstream ADMDs + (per [I-D-7601bis] Section 5). + + o ARC-related header fields (ARC-Authentication-Results, ARC- + Message-Signature, ARC-Seal) MUST NOT be included in the list of + header fields covered by the signature of the AMS header field. + + To preserve the ability to verify the integrity of a message, the + signature of the AMS header field SHOULD include any DKIM-Signature + header fields already present in the message. + +4.1.3. ARC-Seal (AS) + + The ARC-Seal (AS) header field permits ARC-participating ADMDs to + verify the integrity of AAR header fields and corresponding AMS + header fields. + + In general concept terms, the AS header field is how custodians bind + their authentication assessments (testimonial) into a Chain of + Custody so that Validators can inspect individual evidence and + custodians. + + The AS header field is similar in syntax and semantics to DKIM- + Signatures [RFC6376], with the following differences: + + o the "i" (AUID) tag is not imported from DKIM; instead, this tag is + replaced by the "instance tag" as defined in Section 4.2.1; + + + + + +Andersen, et al. Expires June 21, 2019 [Page 10] + +Internet-Draft ARC-Protocol December 2018 + + + o the signature of the AS header field does not cover the body of + the message and therefore there is no 'bh' tag. The signature of + the AS header field only covers specific header fields as defined + in Section 5.1.1; + + o no body canonicalization is performed as the AS signature does not + cover the body of a message; + + o only "relaxed" header field canonicalization ([RFC6376] section + 3.4.2) is used; + + o the only supported tags are "i" (from Section 4.2.1 of this + document), and "a", "b", "d, "s", "t" from [RFC6376] Section 3.5. + Note especially that the DKIM "h" tag is NOT allowed and if found, + MUST result in a cv status of "fail" (for more information see + Section 5.1.1); + + o an additional tag, "cv" ("seal-cv-tag" in the ARC-Seal ABNF + definition) is used to communicate Chain Validation Status to + subsequent ADMDs. + + ARC places no requirements on the selectors and/or domains used for + the AS header field signatures. + + The formal ABNF for the AS header field is: + + arc-as-info = instance [CFWS] ";" tag-list + arc-seal = "ARC-Seal:" [CFWS] arc-as-info + +4.1.4. Internationalized Email (EAI) + + In internationalized messages [RFC6532] many header fields can + contain UTF-8 as well as ASCII text. The changes for EAI are all + inherited from DKIM as updated by [draft-levine-eaiauth] and + Authentication-Results as updated in [I-D-7601bis], but are called + out here for emphasis. + + In all ARC header fields, the d= s= tags can contain U-labels. In + all tags, non-ASCII characters need not be quoted in dkim-quoted- + printable. + + The AAR header allows UTF-8 in the same places that A-R does, as + described in [I-D-7601bis]. + + + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 11] + +Internet-Draft ARC-Protocol December 2018 + + +4.2. ARC Set + + An "ARC Set" is a single collection of three ARC header fields (AAR, + AMS, and AS). ARC header fields of an ARC Set share the same + "instance" value. + + By adding all ARC header fields to a message, an ARC Sealer adds an + ARC Set to a message. A description of how Sealers add an ARC Set to + a message is found in Section 5.1. + +4.2.1. Instance Tags + + Instance tags describe which ARC header fields belong to an ARC Set. + Each ARC header field of an ARC Set shares the same instance tag + value. + + Instance tag values are integers that begin at 1 and are incremented + by each addition of an ARC Set. Through the incremental values of + instance tags, an ARC Validator can determine the order in which ARC + Sets were added to a message. + + Instance tag values can range from 1-50 (inclusive). + + _INFORMATIONAL:_ The upper limit of 50 was picked based on some + initial observations reported by early working group members. The + value was chosen so as to balance the risk of excessive header field + growth Section 9.1 against expert opinion regarding the probability + of long-tail but non-looping multiple-intermediary mail flows. + Longer ARC chains will also impose load on validators and DNS to + support additional verification steps. Observed quantities of + "Received" header fields was also considered in establishing this as + an experimental initial value. + + Valid ARC Sets MUST have exactly one instance of each ARC header + field (AAR, AMS, and AS) for a given instance value and signing + algorithm. + + For handling multiple signing algorithms, see [ARC-MULTI]. + +4.3. Authenticated Received Chain + + An Authenticated Received Chain is an ordered collection of ARC Sets. + As ARC Sets are enumerated sets of ARC header fields, an + Authenticated Received Chain represents the output of message + authentication assessments along the handling path of ARC-enabled + processors. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 12] + +Internet-Draft ARC-Protocol December 2018 + + + Authentication Assessments determined at each step of the ARC-enabled + handling path is present in an Authenticated Received Chain in the + form of AAR header fields. The ability to verify the identity of + message handlers and the integrity of message content is provided by + AMS header fields. AS header fields allow messages handlers to + validate the assertions, order and sequence of the Authenticated + Received Chain itself. + + In general concept terms, an Authenticated Received Chain represents + a message's Chain of Custody. Validators can consult a message's + Chain of Custody to gain insight regarding each custodian of a + message and the Evidence collected by each custodian. + +4.4. Chain Validation Status + + The state of the Authenticated Received Chain at a specific + processing step is called the "Chain Validation Status". Chain + Validation Status information is communicated in several ways: + + o the AS header field in the "cv" tag, and + + o as part of Authentication-Results and AAR header field(s). + + Chain Validation Status has one of three possible values: + + o none: There was no Authenticated Received Chain on the message + when it arrived for validation. Typically, this occurs when a + message is received directly from a message's original Message + Transfer Agent (MTA) or Message Submission Agent (MSA), or from an + upstream Internet Mail Handler that is not participating in ARC + handling. + + o fail: The message contains an Authenticated Received Chain whose + validation failed. + + o pass: The message contains an Authenticated Received Chain whose + validation succeeded. + +5. Protocol Actions + + ARC-enabled Internet Mail Handlers generally act as both ARC + Validators (when receiving messages) and ARC Sealers (when sending + messages onward, not originated locally). + + An Authenticated Received Chain with a Chain Validation Status of + "pass" (or "none") allows Internet Mail Handlers to ascertain: + + + + + +Andersen, et al. Expires June 21, 2019 [Page 13] + +Internet-Draft ARC-Protocol December 2018 + + + o all ARC-participating ADMDs that claim responsibility for handling + (and possibly modifying) the message in transit; + + o the authentication assessments of the message as determined by + each ADMD (from AAR header fields). + + With this information, Internet Mail Handlers MAY inform local policy + decisions regarding disposition of messages that experience + authentication failure due to intermediate processing. + +5.1. Sealer Actions + + To "seal" a message, an ARC Sealer adds an ARC Set (the three ARC + header fields AAR, AMS, and AS) to a message. All ARC header fields + in an ARC Set share the same instance tag value. + + To perform Sealing (aka to build and attach a new ARC Set), the + following actions must be taken by an ARC Sealer when presented with + a message: + + 1. All message modifications (including adding DKIM-Signature header + field(s)) MUST be performed before Sealing. + + 2. If the message already contains an Authenticated Received Chain + with the most recent AS reporting "cv=fail", then there is no + need to proceed and the algorithm stops here. + + 3. Calculate the instance value: if the message already contains an + Authenticated Received Chain, the instance value is 1 more than + the highest instance number found in the Authenticated Received + Chain. If no Authenticated Received Chain exists, the instance + value is 1. + + 4. Using the calculated instance value, generate and attach a + complete ARC set to the message as follows: + + 1. Generate and attach an ARC-Authentication-Results header + field as defined in Section 4.1.1. + + 2. Generate and attach an ARC-Message-Signature header field as + defined in Section 4.1.2. + + 3. Generate and attach an ARC-Seal header field using the AS + definition found in Section 4.1.3, the prescribed headers + defined in Section 5.1.1, and the Chain Validation Status as + determined during ARC Validation. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 14] + +Internet-Draft ARC-Protocol December 2018 + + +5.1.1. Header Fields To Include In ARC-Seal Signatures + + The ARC-Seal is generated in a manner similar to how DKIM-Signatures + are added to messages ([RFC6376], section 3.7), with explicit + requirements on the header fields and ordering of those fields. + + The signature of an AS header field signs a canonicalized form of the + ARC Set header field values. The ARC set header field values are + supplied to the hash function in increasing instance order, starting + at 1, and include the ARC Set being added at the time of Sealing the + message. + + Within an ARC Set, header fields are supplied to the hash function in + the following order: + + 1. ARC-Authentication-Results + + 2. ARC-Message-Signature + + 3. ARC-Seal + + Note that when an Authenticated Received Chain has failed validation, + the signing scope for the ARC-Seal is modified as specified in + Section 5.1.2. + +5.1.2. Marking and Sealing "cv=fail" (Invalid) Chains + + In the case of a failed Authenticated Received Chain, the header + fields included in the signature scope of the AS header field b= + value MUST only include the ARC Set header fields created by the MTA + which detected the malformed chain, as if this newest ARC Set was the + only set present. + + _INFORMATIONAL_: This approach is mandated to handle the case of a + malformed or otherwise invalid Authenticated Received Chain. There + is no way to generate a deterministic set of AS header fields + (Section 5.1.1) in most cases of invalid chains. + +5.1.3. Only One Authenticated Received Chain Per Message + + A message can have only one Authenticated Received Chain on it at a + time. Once broken, the chain cannot be continued, as the chain of + custody is no longer valid and responsibility for the message has + been lost. For further discussion of this topic and the design + restriction which prevents chain continuation or re-establishment, + see [ARC-USAGE]. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 15] + +Internet-Draft ARC-Protocol December 2018 + + +5.1.4. Broad Ability to Seal + + ARC is not solely intended for perimeter MTAs. Any Internet Mail + Handler MAY seal a message by adding a complete ARC set, whether or + not they have modified or are aware of having modified the message. + For additional information, see Section 7.1. + +5.1.5. Sealing is Always Safe + + The utility of an Authenticated Received Chain is limited to very + specific cases. Authenticated Received Chains are designed to + provide additional information to an Internet Mail Handler when + evaluating messages for delivery in the context of authentication + failures. Specifically: + + o Properly adding an ARC Set to a message does not damage or + invalidate an existing Authenticated Received Chain. + + o Sealing an Authenticated Received Chain when a message has not + been modified does not negatively affect the chain. + + o Validating a message exposes no new threat vectors (see + Section 9). + + o An ADMD may choose to Seal all inbound messages whether or not a + message has been modified or will be retransmitted. + +5.2. Validator Actions + + A validator performs the following steps, in sequence, to process an + Authenticated Received Chain. Canonicalization, hash functions, and + signature validation methods are imported from [RFC6376] section 5. + + 1. Collect all ARC Sets currently attached to the message. + + * If there are none, the Chain Validation Status is "none" and + the algorithm stops here. + + * The maximum number of ARC Sets that can be attached to a + message is 50. If more than the maximum number exist the + Chain Validation Status is "fail" and the algorithm stops + here. + + * In the following algorithm, the maximum discovered ARC + instance value is referred to as "N". + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 16] + +Internet-Draft ARC-Protocol December 2018 + + + 2. If the Chain Validation Status of the highest instance value ARC + Set is "fail", then the Chain Validation status is "fail" and the + algorithm stops here. + + 3. Validate the structure of the Authenticated Received Chain. A + valid ARC has the following conditions: + + 1. Each ARC Set MUST contain exactly one each of the three ARC + header fields (AAR, AMS, and AS). + + 2. The instance values of the ARC Sets MUST form a continuous + sequence from 1..N with no gaps or repetition. + + 3. The "cv" value for all ARC-Seal header fields MUST NOT be + "fail". For ARC Sets with instance values > 1, the values + MUST be "pass". For the ARC Set with instance value = 1, the + value MUST be "none". + + * If any of these conditions are not met, the Chain Validation + Status is "fail" and the algorithm stops here. + + 4. Validate the AMS with the greatest instance value (most recent). + If validation fails, then the Chain Validation Status is "fail" + and the algorithm stops here. + + 5. _OPTIONAL:_ Determine the "oldest-pass" value from the ARC Set by + validating each prior AMS beginning with the N-1 and proceeding + in decreasing order to the AMS with the instance value of 1: + + 1. If an AMS fails to validate (for instance value "M"), then + set the oldest-pass value to the lowest AMS instance value + which passed (M+1) and go to the next step (there is no need + to check any other (older) AMS header fields). This does not + affect the validity of the Authenticated Received Chain. + + 2. If all AMS header fields verify, set the oldest-pass value to + zero (0). + + 6. Validate each AS beginning with the greatest instance value and + proceeding in decreasing order to the AS with the instance value + of 1. If any AS fails to validate, the Chain Validation Status + is "fail" and the algorithm stops here. + + 7. If the algorithm reaches this step, then the Chain Validation + Status is "pass", and the algorithm is complete. + + The end result of this Validation algorithm SHOULD be included within + the Authentication-Results header field for the ADMD. + + + +Andersen, et al. Expires June 21, 2019 [Page 17] + +Internet-Draft ARC-Protocol December 2018 + + + As with a DKIM signature ([RFC6376] section 6.3) which fails + verification, a message with an Authenticated Received Chain with a + Chain Validation status of "fail" MUST be treated the same as a + message with no Authenticated Received Chain. + + _INFORMATIONAL_: Recipients of an invalid or failing Authenticated + Received Chain can use that information as part of a wider handling + context. ARC adoption cannot be assumed by intermediaries; many + intermediaries will continue to modify messages without adding ARC + Seals. + +5.2.1. All Failures Are Permanent + + Authenticated Received Chains represent the traversal of messages + through one or more intermediaries. All errors, including DNS + failures, become unrecoverable and are considered permanent. + + Any error validating an Authenticated Received Chain results in a + Chain Validation Status of "fail". For further discussion of this + topic and the design restriction which prevents chain continuation or + re-establishment, see [ARC-USAGE]. + +5.2.2. Responding to ARC Validation Failures During the SMTP + Transaction + + If an ARC Validator determines that the incoming message fails ARC + validation, the Validator MAY signal the breakage through the + extended SMTP response code 5.7.29 "ARC validation failure" and + corresponding SMTP basic response code. Because ARC failures are + likely only to be detected in the context of other underlying + authentication mechanism failures, validators MAY use the more + general 5.7.26 "Multiple authentication checks failed" instead of the + ARC-specific code. + +6. Communication of Validation Results + + Chain Validation Status (described in Section 4.4) is communicated + via Authentication-Results (and AAR) header fields using the auth + method "arc". This auth method is described in Section 10.1. + + If necessary data is available, the ptypes and properties defined in + Section 10.2 SHOULD be recorded in an Authentication-Results header + field: + + o smtp.remote-ip - The address of the connection-initiating SMTP + server, from which the message is being relayed. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 18] + +Internet-Draft ARC-Protocol December 2018 + + + o header.oldest-pass - The instance number of the oldest AMS that + still validates, or 0 if all pass. + +7. Use Cases + + This section explores several messaging handling use cases that are + addressed by ARC. + +7.1. Communicate Authentication Assessment Across Trust Boundaries + + When an intermediary ADMD adds an ARC Set to a message's + Authenticated Received Chain (or creates the initial ARC Set), the + ADMD communicates its authentication assessment to the next ARC- + participating ADMD in the message handling path. + + If ARC-enabled ADMDs are trusted, Authenticated Received Chains can + be used to bridge administrative boundaries. + +7.1.1. Message Scanning Services + + Message services are available to perform anti-spam, anti-malware, + and anti-phishing scanning. Such services typically remove malicious + content, replace HTTP links in messages with sanitized links, and/or + attach footers to messages advertising the abilities of the message + scanning service. These modifications almost always break signature- + based authentication (such as DKIM). + + Scanning services typically require clients to point MX records of an + Internet domain to the scanning service. Messages destined for the + Internet domain are initially delivered to the scanning service. + Once scanning is performed, messages are then routed to the client's + own mail handling infrastructure. Re-routing messages in this way + almost always breaks path-based authentication (such as SPF). + + Message scanning services can attach Authenticated Received Chains to + messages to communicate authentication assessment into client ADMDs. + Clients can then benefit from the message scanning service while + processing messages as if the client's infrastructure were the + original destination of the Internet domain's MX record. + +7.1.2. Multi-tier MTA Processing + + Large message processing infrastructure is often divided into several + processing tiers that can break authentication information between + tiers. For example, a large site may maintain a cluster of MTAs + dedicated to connection handling and enforcement of IP-based + reputation filtering. A secondary cluster of MTAs may be dedicated + and optimized for content-based processing of messages. + + + +Andersen, et al. Expires June 21, 2019 [Page 19] + +Internet-Draft ARC-Protocol December 2018 + + + Authenticated Received Chains can be used to communicate + authentication assessment between processing tiers. + +7.1.3. Mailing Lists + + Mailing lists take delivery of messages and re-post them to + subscribers. A full description of authentication-related mailing + list issues can be found in [RFC7960] Section 3.2.3. + + Mailing list services can implement ARC to convey the authentication + assessment of posted messages sent to the list's subscriber base. + The ADMDs of the mailing list subscribers can then use the + Authenticated Received Chain to determine the authentication + assessment of the original message before mailing list handling. + +7.2. Inform Message Disposition Decisions + + Intermediaries often break authentication through content + modification, interfere with path-based authentication (such as SPF), + and strip authentication results (if an MTA removes Authentication- + Results header fields). + + Authenticated Received Chains allow ARC Validators to: + + 1. identify ARC-enabled ADMDs that break authentication while + processing messages; + + 2. gain extended visibility into the authentication-preserving + abilities of ADMDs that relay messages into ARC-enabled ADMDs. + + Through the collection of ARC-related data, an ADMD can identify + handling paths that have broken authentication. + + An Authenticated Received Chain allows an Internet Mail Handler to + potentially base decisions of message disposition on authentication + assessments provided by different ADMDs. + +7.2.1. DMARC Local Policy Overrides + + DMARC introduces a policy model where Domain Owners can request email + receivers to reject or quarantine messages that fail DMARC alignment. + Interoperability issues between DMARC and indirect email flows are + documented in [RFC7960]. + + Authenticated Received Chains allow DMARC processors to consider + authentication assessments provided by other ADMDs. As a matter of + local policy, a DMARC processor MAY choose to accept the + + + + +Andersen, et al. Expires June 21, 2019 [Page 20] + +Internet-Draft ARC-Protocol December 2018 + + + authentication assessments provided by an Authenticated Received + Chain when determining if a message is DMARC compliant. + + When an Authenticated Received Chain is used to determine message + disposition, the DMARC processor can communicate this local policy + decision to Domain Owners as described in Section 7.2.2. + +7.2.2. DMARC Reporting + + DMARC-enabled receivers indicate when ARC Validation influences + DMARC-related local policy decisions. When an ARC-enabled handler + generates a DMARC report, it MAY indicate the influence of ARC on + their local policy decision(s) by adding a reason of "local_policy" + with a comment string (per [RFC7489] Appendix C) containing a list of + data discovered during ARC Validation, which at a minimum includes: + + o the Chain Validation Status, + + o the domain and selector for each AS, + + o the originating IP address from the first ARC Set: + + EXAMPLE: + + + none + fail + fail + + local_policy + arc=pass as[2].d=d2.example as[2].s=s2 + as[1].d=d1.example as[1].s=s3 + remote-ip[1]=2001:DB8::1A + + + + In the above example DMARC XML reporting fragment, data relating to + specific validated ARC Sets are enumerated using array syntax (eg, + "as[2]" means AS header field with instance value of 2). d2.example + is the Sealing domain for ARC Set #2 (i=2) and d1.example is the + Sealing domain for ARC Set #1 (i=1). + + Depending on the reporting practices of intermediate message + handlers, Domain Owners may receive multiple DMARC reports for a + single message. Receivers of DMARC reports should be aware of this + behaviour and make the necessary accommodations. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 21] + +Internet-Draft ARC-Protocol December 2018 + + +8. Privacy Considerations + + The Authenticated Received Chain provides a verifiable record of the + handlers for a message. This record may include Personally + Identifiable Information such as IP address(es) and domain names. + Such information is also included in existing non-ARC related header + fields such as the "Received" header fields. + +9. Security Considerations + + The Security Considerations of [RFC6376] and [I-D-7601bis] apply + directly to this specification. + + As with other domain authentication technologies (such as SPF, DKIM, + and DMARC), ARC makes no claims about the semantic content of + messages. + A received message with an ARC chain provides evidence (at instance + N) that: The sealing domain (ARC-Seal d=) processed a message with + this body, determined the authentication assessment reported in the + ARC-Authentication-Results, and the ARC chain 1..N-1 (with the + validation status as reported in the cv field). + +9.1. Increased Header Field Size + + Inclusion of Authenticated Received Chains into messages may cause + issues for older or constrained MTAs due to increased total header + field size. Large header field blocks, in general, may cause + failures to deliver or other outage scenarios for such MTAs. ARC + itself would not cause problems. + +9.2. DNS Operations + + The validation of an Authenticated Received Chain composed of N ARC + Sets can require up to 2*N DNS queries (not including any DNS + redirection mechanisms which can increase the total number of + queries). This leads to two considerations: + + 1. An attacker can send a message to an ARC participant with a + concocted sequence of ARC Sets bearing the domains of intended + victims, and all of them will be queried by the participant until + a failure is discovered. DNS caching and the difficulty of + forging the signature values should limit the extent of this load + to domains under control of the attacker. Query traffic pattern + analysis may expose information about downstream validating ADMD + infrastructure. + + 2. DKIM only performs one DNS query per signature, while ARC can + introduce many (per chain). Absent caching, slow DNS responses + + + +Andersen, et al. Expires June 21, 2019 [Page 22] + +Internet-Draft ARC-Protocol December 2018 + + + can cause SMTP timeouts; and backlogged delivery queues on + Validating systems. This could be exploited as a DoS attack. + +9.3. Message Content Suspicion + + Recipients are cautioned to treat messages bearing Authenticated + Received Chains with the same suspicion applied to all other + messages. This includes appropriate content scanning and other + checks for potentially malicious content. + + ARC authenticates the identity of some email handling actors. It + does not make any assessment of their trustworthiness. + + Just as passing message authentication is not an indication of + message safety, forwarding that information through the mechanism of + ARC is also not an indication of message safety. Even if all ARC- + enabled ADMDs are trusted, ADMDs may have become compromised, may + miss unsafe content, or may not properly authenticate messages. + +9.4. Message Sealer Suspicion + + Recipients are cautioned to treat every Sealer of the ARC Chain with + suspicion. Just as with a validated DKIM signature, responsibility + for message handling is attributed to the Sealing domain, but whether + or not that Sealer is a malicious actor is out of scope of the + authentication mechanism. Since ARC aids message delivery in the + event of an authentication failure, ARC Sealers should be treated + with suspicion, so that a malicious actor cannot Seal spam or other + fraudulent messages to aid their delivery, too. + +9.5. Replay Attacks + + Since ARC inherits heavily from DKIM, it has similar attack vectors. + In particular, the Replay Attack described in [RFC6376] section 8.6 + is potentially amplified by ARC's chained statuses. In an ARC replay + attack, a malicious actor would take an intact and passing ARC Chain, + and then resend it to many recipients without making any + modifications that invalidate the latest AMS or AS. The impact to a + receiver would be more DNS lookups and signature evaluations. This + scope of this attack can be limited by caching DNS queries and + following the same signing scope guidance from [RFC6376] section + 5.4.1. + +10. IANA Considerations + + [[ *Note to the RFC Editors:* "dkim - header - s" is defined in + [I-D-7601bis]. Please adjust the list below as appropriate. ]] + + + + +Andersen, et al. Expires June 21, 2019 [Page 23] + +Internet-Draft ARC-Protocol December 2018 + + + This draft introduces three new headers fields and updates the Email + Authentication Parameters registry with one new authentication method + and several status codes. + +10.1. Email Authentication Results Names Registry Update + + This draft adds one Auth Method with three Codes to the IANA "Email + Authentication Result Names" registry: + + o Auth Method : arc + Code: "none", "pass", "fail" + Specification: this document 2.2 + Status: active + +10.2. Email Authentication Methods Registry Update + + This draft adds several new items to the Email Authentication Methods + registry, most recently defined in [I-D-7601bis]: + + o Method: arc + Definition: this document section 6 + ptype: smtp + Property: remote-ip + Value: IP address (v4 or v6) of originating SMTP connection + Status: active + Version: 1 + + o Method: arc + Definition: this document section 6 + ptype: header + Property: oldest-pass + Value: The instance id of the oldest validating AMS, or 0 if they + all pass (see Section 5.2) + Status: active + Version: 1 + +10.3. Definitions of the ARC header fields + + This specification adds three new header fields to the "Permanent + Message Header Field Registry", as follows: + + o Header field name: ARC-Seal + Applicable protocol: mail + Status: Experimental + Author/Change controller: IETF + Specification document(s): this document + Related information: [RFC6376] + + + + +Andersen, et al. Expires June 21, 2019 [Page 24] + +Internet-Draft ARC-Protocol December 2018 + + + o Header field name: ARC-Message-Signature + Applicable protocol: mail + Status: Experimental + Author/Change controller: IETF + Specification document(s): this document + Related information: [RFC6376] + + o Header field name: ARC-Authentication-Results + Applicable protocol: mail + Status: Experimental + Author/Change controller: IETF + Specification document(s): this document + Related information: [I-D-7601bis] + +10.4. New Enhanced Status Code - ARC Validation + + The following value should be added to the [ENHANCED-STATUS] + registry, as follows: + + o Code: X.7.29 + Sample Text: ARC validation failure + Associated basic status code: 550 + Description: This status code may be returned when a message fails + ARC validation + Reference: this document + Submitter: K. Andersen + Change controller: IESG + +11. Experimental Considerations + + The ARC protocol is designed to address common interoperability + issues introduced by intermediate message handlers. Interoperability + issues are described in [RFC6377] and [RFC7960]. + + As the ARC protocol is implemented by Internet Mail Handlers over + time, the following should be evaluated in order to determine the + success of the protocol in accomplishing the intended benefits. + +11.1. Success Consideration + + In an attempt to deliver legitimate messages that users desire, many + receivers use heuristic-based methods to identify messages that + arrive via indirect delivery paths. + + ARC will be a success if the presence of Authenticated Received + Chains allows for improved decision making when processing legitimate + messages, specifically resulting in equal or better delivery rates + than achieve through the use of heuristic approaches. + + + +Andersen, et al. Expires June 21, 2019 [Page 25] + +Internet-Draft ARC-Protocol December 2018 + + +11.2. Failure Considerations + + ARC should function without introducing significant new vectors for + abuse (see Section 9). If unforeseen vectors are enabled by ARC, + then this protocol will be a failure. Note that weaknesses inherent + in the mail protocols ARC is built upon (such as DKIM replay attacks + and other known issues) are not new vectors which can be attributed + to this specification. + +11.3. Open Questions + + The following open questions are academic and have no clear answer at + the time of the development of the protocol. However, additional + deployments should be able to gather the necessary data to answer + some or all of them. + +11.3.1. Value of the ARC-Seal (AS) Header Field + + Data should be collected to show if the ARC-Seal (AS) provides value + beyond the ARC Message Signature (AMS) for either making delivery + decisions or catching malicious actors trying to craft or replay + malicious chains. + +11.3.2. Usage and/or signals from multiple selectors and/or domains in + ARC sets + + Any selectors and/or (sub)domains (under the control of the sealing + ADMD) may be used for ARC header field signatures. + + While implementers may choose to use various selectors and/or domains + for ARC set header fields, no compelling argument for or against such + usage has been made within the working group. As such we have chosen + to allow maximum freedom for the experimental definition of this + protocol. + + Wider deployment experience and higher volumes of traffic may show + whether this is useful. + +11.3.3. DNS Overhead + + Longer Authenticated Received Chains will require more queries to + retrieve the keys for validating the chain. While this is not + believed to be a security issue (see Section 9.2), it is unclear how + much overhead will truly be added. This is similar to some of the + initial processing and query load concerns which were debated at the + time of the DKIM specification development. + + + + + +Andersen, et al. Expires June 21, 2019 [Page 26] + +Internet-Draft ARC-Protocol December 2018 + + + Data should be collected to better understand usable length and + distribution of lengths found in valid Authenticated Received Chains + along with the DNS impact of processing Authenticated Received + Chains. + + An effective operational maximum will have to be developed through + deployment experience in the field. + +11.3.4. What Trace Information is Valuable + + There are several edge cases where the information in the AAR can + make the difference between message delivery or rejection. For + example, if there is a well known mailing list that seals with ARC + but doesn't do its own initial DMARC enforcement, an Internet Mail + Handler with this knowledge could make a delivery decision based upon + the authentication information it sees in the corresponding AAR + header field. + + Certain trace information in the AAR is useful/necessary in the + construction of DMARC reports. + + Further, certain receivers believe the entire set of trace + information would be valuable to feed into machine learning systems + to identify fraud and/or provide other signals related to message + delivery. + + At this point, however, it is unclear what trace information will be + valuable for all receivers, regardless of size. + + Data should be collected on what trace information receivers are + using that provides useful signals that affect deliverability, and + what portions of the trace data are left untouched or provide no + useful information. + + Since many such systems are intentionally proprietary or confidential + to prevent gaming by abusers, it may not be viable to reliably answer + this particular question. The evolving nature of attacks can also + shift the landscape of "useful" information over time. + +12. Implementation Status + + [[ Note to the RFC Editor: Please remove this section before + publication along with the reference to [RFC7942]. ]] + + This section records the status of known implementations of the + protocol defined by this specification at the time of posting of this + Internet-Draft, and is based on a proposal described in [RFC7942]. + The description of implementations in this section is intended to + + + +Andersen, et al. Expires June 21, 2019 [Page 27] + +Internet-Draft ARC-Protocol December 2018 + + + assist the IETF in its decision processes in progressing drafts to + RFCs. Please note that the listing of any individual implementation + here does not imply endorsement by the IETF. Furthermore, no effort + has been spent to verify the information presented here that was + supplied by IETF contributors. This is not intended as, and must not + be construed to be, a catalog of available implementations or their + features. Readers are advised to note that other implementations may + exist. + + This information is known to be correct as of the eighth + interoperability test event which was held on 2018-03-17 at IETF101. + + For a few of the implementations, later status information was + available as of August 2018. + +12.1. GMail test reflector and incoming validation + + Organization: Google + Description: Internal production implementation with both debug + analysis and validating + sealing pass-through function + Status of Operation: Production - Incoming Validation + Coverage: Full spec implemented as of this document + Licensing: Internal only + Implementation Notes: + + o Full functionality was demonstrated during the interop testing on + 2018-03-17 and 2018-10-12. All traffic going into GSuite, Google + Groups, or GMail mailboxes will have ARC validation and sealing. + + Contact Info: arc-discuss@dmarc.org [1] + +12.2. AOL test reflector and internal tagging + + Organization: AOL + Description: Internal prototype implementation with both debug + analysis and validating + sealing pass-through function + Status of Operation: Beta + Coverage: ARC Chain validity status checking is operational, but only + applied to email addresses enrolled in the test program. This system + conforms to [ARC-DRAFT-05] + Licensing: Proprietary - Internal only + Implementation Notes: + + o 2017-07-15: Full functionality verified during the interop + testing. + + o 2018-06: Partially retired but still accessible by special request + due to the in process evolution of the AOL mail infrastructure to + + + +Andersen, et al. Expires June 21, 2019 [Page 28] + +Internet-Draft ARC-Protocol December 2018 + + + the integrated OATH environment. The implementation was based on + the Apache James DKIM code base. + + o 2018-10: No longer available due to infrastucture changes at AOL/ + Yahoo!/Oath. + + Contact Info: arc-discuss@dmarc.org [2] + +12.3. dkimpy + + Organization: dkimpy developers/Scott Kitterman + Description: Python DKIM package + Status of Operation: Production + Coverage: Full spec implemented as of this document + + o 2017-07-15: The internal test suite is incomplete, but the command + line developmental version of validator was demonstrated to + interoperate with the Google and AOL implementations during the + interop on 2017-07-15 and the released version passes the tests in + [ARC-TEST] arc_test_suite [3] with both python and python3. + + o 2018-10: Re-validated in the interop + + Licensing: Open/Other (same as dkimpy package = BCD version 2) + Contact Info: https://launchpad.net/dkimpy + +12.4. OpenARC + + Organization: TDP/Murray Kucherawy + Description: Implementation of milter functionality related to the + OpenDKIM and OpenDMARC packages + Status of Operation: Beta + Coverage: Built to support this document + Licensing: Open/Other (same as OpenDKIM and OpenDMARC packages) + Implementation Notes: + + o 2018-10: Validated with one bug discovered during interop + + o 2018-11: Known issues have been resolved with release 1.0.0-Beta2 + + Contact Info: arc-discuss@dmarc.org [4], openarc-users@openarc.org + [5] + +12.5. Mailman 3.x patch + + Organization: Mailman development team + Description: Integrated ARC capabilities within the Mailman 3.2 + package + + + +Andersen, et al. Expires June 21, 2019 [Page 29] + +Internet-Draft ARC-Protocol December 2018 + + + Status of Operation: Patch submitted + Coverage: Based on OpenARC + Licensing: Same as mailman package - GPL + Implementation Notes: + + o Appears to work properly in at least one beta deployment, but + waiting on acceptance of the pull request into the mainline of + mailman development + + o Discussions continuing with Mailman team to get this integrated + + Contact Info: https://www.gnu.org/software/mailman/contact.html + +12.6. Copernica/MailerQ web-based validation + + Organization: Copernica + Description: Web-based validation of ARC-signed messages + Status of Operation: Beta + Coverage: Built to support [ARC-DRAFT-05] + Licensing: On-line usage only + Implementation Notes: + + o Released 2016-10-24 + + o Requires full message content to be pasted into a web form found + at http://arc.mailerq.com/ (warning - https is not supported). + + o An additional instance of an ARC signature can be added if one is + willing to paste a private key into an unsecured web form. + + o 2017-07-15: Testing shows that results match the other + implementations listed in this section. + + o 2018-10: not tested during interop + + Contact Info: https://www.copernica.com/ + +12.7. Rspamd + + Organization: Rspamd community + Description: ARC signing and verification module + Status of Operation: Production, though deployment usage is unknown + Coverage: Built to support [ARC-DRAFT-14] + Licensing: Open source + Implementation Notes: + + o 2017-06-12: Released with version 1.6.0 + + + + +Andersen, et al. Expires June 21, 2019 [Page 30] + +Internet-Draft ARC-Protocol December 2018 + + + o 2017-07-15: Testing during the interop showed that the validation + functionality interoperated with the Google, AOL, dkimpy and + MailerQ implementations + + o 2018-10: Re-validated during the interop + + Contact Info: https://rspamd.com/doc/modules/arc.html and + https://github.com/vstakhov/rspamd + +12.8. PERL MAIL::DKIM module + + Organization: FastMail + Description: Email domain authentication (sign and/or verify) module, + previously included SPF / DKIM / DMARC, now has ARC added + Status of Operation: Production, deployment usage unknown + Coverage: Built to support [ARC-DRAFT-10] + Licensing: Open Source + Implementation Notes: + + o 2017-12-15: v0.50 released with full test set passing for ARC + + o 2018-10: Revalidated during the interop and used for the creation + of the Appendix B example + + Contact Info: http://search.cpan.org/~mbradshaw/Mail-DKIM-0.50/ + +12.9. PERL Mail::Milter::Authentication module + + Organization: FastMail + Description: Email domain authentication milter, uses MAIL::DKIM (see + above) + Status of Operation: Initial validation completed during IETF99 + hackathon with some follow-on work during the week + Coverage: Built to support [ARC-DRAFT-14] + Licensing: Open Source + Implementation Notes: + + o 2017-07-15: Validation functionality which interoperates with + Gmail, AOL, dkimpy was demonstrated; later in the week of IETF99, + the signing functionality was reported to be working + + o 2017-07-20: ARC functionality has not yet been pushed back to the + github repo but should be showing up soon + + o 2018-10: Revalidated during the interop + + Contact Info: https://github.com/fastmail/authentication_milter + + + + +Andersen, et al. Expires June 21, 2019 [Page 31] + +Internet-Draft ARC-Protocol December 2018 + + +12.10. Sympa List Manager + + Organization: Sympa Dev Community + Description: Beta released Status of Operation: Beta released + Coverage: Built to support this document, based on Mail::DKIM module + Licensing: open source + Implementation Notes: + + o 2018-01-05: Tracked as https://github.com/sympa-community/sympa/ + issues/153 + + o 2018-12-08: Sympa 6.2.37 beta 3 incorporates ARC support, + scheduled for stable release 6.2.38 on 2018-12-21 + + Contact Info: https://github.com/sympa-community + +12.11. Oracle Messaging Server + + Organization: Oracle + Description: + Status of Operation: Initial development work during IETF99 + hackathon. Framework code is complete, crypto functionality requires + integration with libsodium + Coverage: Work in progress + Licensing: Unknown + Implementation Notes: + + o 2018-03: Protocol handling components are completed, but crypto is + not yet functional. + + Contact Info: Chris Newman, Oracle + +12.12. MessageSystems Momentum and PowerMTA platforms + + Organization: MessageSystems/SparkPost + Description: OpenARC integration into the LUA-enabled Momentum + processing space + Status of Operation: Beta + Coverage: Same as OpenARC + Licensing: Unknown + Implementation Notes: + + o 2018-10: Beta version in private evaluation, not tested during + interop. + + Contact Info: TBD + + + + + +Andersen, et al. Expires June 21, 2019 [Page 32] + +Internet-Draft ARC-Protocol December 2018 + + +12.13. Exim + + Organization: Exim developers + Status of Operation: Operational; requires specific enabling for + compile. + Coverage: Full spec implemented as of [ARC-DRAFT-13] + Licensing: GPL + Contact Info: exim-users@exim.org + Implementation notes: + + o Implemented as of Exim 4.91 + +12.14. Halon MTA + + Organization: Halon + Status of Operation: Operational as of May 2018 + Coverage: Full spec implemented as of this document Licensing: + Commercial, trial version available for download + Contact Info: https://halon.io + Implementation notes: + + o GPL'd library with ARC capabilities: https://github.com/halon/ + libdkimpp + + o 2018-10: Validated during interop + +12.15. IIJ + + Organization: Internet Initiative Japan (IIJ) Status of Operation: + Operational as of October 2018 + Coverage: Full spec implemented as of this document + Licensing: Internal + Contact Info: https://www.iij.ad.jp/en/ + Implementation notes: + + o 2018-10: Internal MTA implementation validated during the ARC + interop + +13. References + +13.1. Normative References + + [draft-levine-eaiauth] + Levine, J., "E-mail Authentication for Internationalized + Mail", August 2018, . + + + + + +Andersen, et al. Expires June 21, 2019 [Page 33] + +Internet-Draft ARC-Protocol December 2018 + + + [I-D-7601bis] + Kucherawy, M., "Message Header Field for Indicating + Message Authentication Status", February 2018, + . + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + . + + [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322, + DOI 10.17487/RFC5322, October 2008, + . + + [RFC5598] Crocker, D., "Internet Mail Architecture", RFC 5598, + DOI 10.17487/RFC5598, July 2009, + . + + [RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., + "DomainKeys Identified Mail (DKIM) Signatures", STD 76, + RFC 6376, DOI 10.17487/RFC6376, September 2011, + . + + [RFC6377] Kucherawy, M., "DomainKeys Identified Mail (DKIM) and + Mailing Lists", BCP 167, RFC 6377, DOI 10.17487/RFC6377, + September 2011, . + + [RFC6532] Yang, A., Steele, S., and N. Freed, "Internationalized + Email Headers", RFC 6532, DOI 10.17487/RFC6532, February + 2012, . + + [RFC7208] Kitterman, S., "Sender Policy Framework (SPF) for + Authorizing Use of Domains in Email, Version 1", RFC 7208, + DOI 10.17487/RFC7208, April 2014, + . + + [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", + RFC 7405, DOI 10.17487/RFC7405, December 2014, + . + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 34] + +Internet-Draft ARC-Protocol December 2018 + + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, . + +13.2. Informative References + + [ARC-DRAFT-05] + Andersen, K., "Authenticated Received Chain (ARC) Protocol + (I-D-05)", n.d., . + + [ARC-DRAFT-10] + Andersen, K., "Authenticated Received Chain (ARC) Protocol + (I-D-10)", n.d., . + + [ARC-DRAFT-13] + Andersen, K., "Authenticated Received Chain (ARC) Protocol + (I-D-13)", n.d., . + + [ARC-DRAFT-14] + Andersen, K., "Authenticated Received Chain (ARC) Protocol + (I-D-14)", n.d., . + + [ARC-MULTI] + Andersen, K., "Using Multiple Signing Algorithms with + ARC", June 2018, . + + [ARC-TEST] + Blank, S., "ARC Test Suite", January 2017, + . + + [ARC-USAGE] + Jones, S., Adams, T., Rae-Grant, J., and K. Andersen, + "Recommended Usage of the ARC Headers", April 2018, + . + + [ENHANCED-STATUS] + "IANA SMTP Enhanced Status Codes", n.d., + . + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 35] + +Internet-Draft ARC-Protocol December 2018 + + + [RFC7489] Kucherawy, M., Ed. and E. Zwicky, Ed., "Domain-based + Message Authentication, Reporting, and Conformance + (DMARC)", RFC 7489, DOI 10.17487/RFC7489, March 2015, + . + + [RFC7942] Sheffer, Y. and A. Farrel, "Improving Awareness of Running + Code: The Implementation Status Section", BCP 205, + RFC 7942, DOI 10.17487/RFC7942, July 2016, + . + + [RFC7960] Martin, F., Ed., Lear, E., Ed., Draegen. Ed., T., Zwicky, + E., Ed., and K. Andersen, Ed., "Interoperability Issues + between Domain-based Message Authentication, Reporting, + and Conformance (DMARC) and Indirect Email Flows", + RFC 7960, DOI 10.17487/RFC7960, September 2016, + . + +13.3. URIs + + [1] mailto:arc-discuss@dmarc.org + + [2] mailto:arc-discuss@dmarc.org + + [3] https://github.com/Valimail/arc_test_suite + + [4] mailto:arc-discuss@dmarc.org + + [5] mailto:openarc-users@openarc.org + + [6] mailto:dmarc@ietf.org + + [7] mailto:arc-discuss@dmarc.org + + [8] mailto:arc-interop@dmarc.org + + [9] https://arc-spec.org + +Appendix A. Design Requirements + + The specification of the ARC framework is driven by the following + high-level goals, security considerations, and practical operational + requirements. + +A.1. Primary Design Criteria + + o Provide a verifiable "chain of custody" for email messages; + + o Not require changes for originators of email; + + + +Andersen, et al. Expires June 21, 2019 [Page 36] + +Internet-Draft ARC-Protocol December 2018 + + + o Support the verification of the ARC header field set by each hop + in the handling chain; + + o Work at Internet scale; and + + o Provide a trustable mechanism for the communication of + Authentication-Results across trust boundaries. + +A.2. Out of Scope + + ARC is not a trust framework. Users of the ARC header fields are + cautioned against making unsubstantiated conclusions when + encountering a "broken" ARC sequence. + +Appendix B. Example Usage + + The following message is an example of one which has passed through + several intermediary handlers, some of which have modified the + message and others which have not: + +Return-Path: +Received: from example.org (example.org [208.69.40.157]) + by gmail.example with ESMTP id d200mr22663000ykb.93.1421363207 + for ; Thu, 14 Jan 2015 15:02:40 -0800 (PST) +Received: from segv.d1.example (segv.d1.example [72.52.75.15]) + by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 + for ; Thu, 14 Jan 2015 15:01:30 -0800 (PST) + (envelope-from jqd@d1.example) +Received: from [2001:DB8::1A] (w-x-y-z.dsl.static.isp.example [w.x.y.z]) + (authenticated bits=0) + by segv.d1.example with ESMTP id t0FN4a8O084569; + Thu, 14 Jan 2015 15:00:01 -0800 (PST) + (envelope-from jqd@d1.example) +Received: from mail-ob0-f188.google.example + (mail-ob0-f188.google.example [208.69.40.157]) by + clochette.example.org with ESMTP id d200mr22663000ykb.93.1421363268 + for ; Thu, 14 Jan 2015 15:03:15 -0800 (PST) +ARC-Seal: i=3; a=rsa-sha256; cv=pass; d=clochette.example.org; s= + clochette; t=12345; b=CU87XzXlNlk5X/yW4l73UvPUcP9ivwYWxyBWcVrRs7 + +HPx3K05nJhny2fvymbReAmOA9GTH/y+k9kEc59hAKVg== +ARC-Message-Signature: i=3; a=rsa-sha256; c=relaxed/relaxed; d= + clochette.example.org; h=message-id:date:from:to:subject; s= + clochette; t=12345; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZY + LQ=; b=o71vwyLsK+Wm4cOSlirXoRwzEvi0vqIjd/2/GkYFYlSd/GGfKzkAgPqxf + K7ccBMP7Zjb/mpeggswHjEMS8x5NQ== +ARC-Authentication-Results: i=3; clochette.example.org; spf=fail + smtp.from=jqd@d1.example; dkim=fail (512-bit key) + header.i=@d1.example; dmarc=fail; arc=pass (as.2.gmail.example=pass, + + + +Andersen, et al. Expires June 21, 2019 [Page 37] + +Internet-Draft ARC-Protocol December 2018 + + + ams.2.gmail.example=pass, as.1.lists.example.org=pass, + ams.1.lists.example.org=fail (message has been altered)) +Authentication-Results: clochette.example.org; spf=fail + smtp.from=jqd@d1.example; dkim=fail (512-bit key) + header.i=@d1.example; dmarc=fail; arc=pass (as.2.gmail.example=pass, + ams.2.gmail.example=pass, as.1.lists.example.org=pass, + ams.1.lists.example.org=fail (message has been altered)) +ARC-Seal: i=2; a=rsa-sha256; cv=pass; d=gmail.example; s=20120806; t= + 12345; b=Zpukh/kJL4Q7Kv391FKwTepgS56dgHIcdhhJZjsalhqkFIQQAJ4T9BE + 8jjLXWpRNuh81yqnT1/jHn086RwezGw== +ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d= + gmail.example; h=message-id:date:from:to:subject; s=20120806; t= + 12345; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYLQ=; b=CVoG44 + cVZvoSs2mMig2wwqPaJ4OZS5XGMCegWqQs1wvRZJS894tJM0xO1RJLgCPsBOxdA5 + 9WSqI9s9DfyKDfWg== +ARC-Authentication-Results: i=2; gmail.example; spf=fail + smtp.from=jqd@d1.example; dkim=fail (512-bit key) + header.i=@example.org; dmarc=fail; arc=pass + (as.1.lists.example.org=pass, ams.1.lists.example.org=pass) +ARC-Seal: i=1; a=rsa-sha256; cv=none; d=lists.example.org; s=dk-lists; + t=12345; b=TlCCKzgk3TrAa+G77gYYO8Fxk4q/Ml0biqduZJeOYh6+0zhwQ8u/ + lHxLi21pxu347isLSuNtvIagIvAQna9a5A== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= + lists.example.org; h=message-id:date:from:to:subject; s= + dk-lists; t=12345; bh=KWSe46TZKCcDbH4klJPo+tjk5LWJnVRlP5pvjXFZYL + Q=; b=DsoD3n3hiwlrN1ma8IZQFgZx8EDO7Wah3hUjIEsYKuShRKYB4LwGUiKD5Y + yHgcIwGHhSc/4+ewYqHMWDnuFxiQ== +ARC-Authentication-Results: i=1; lists.example.org; spf=pass + smtp.mfrom=jqd@d1.example; dkim=pass (512-bit key) + header.i=@d1.example; dmarc=pass +DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=d1.example; h= + message-id:date:from:to:subject; s=origin2015; bh=bIxxaeIQvmOBdT + AitYfSNFgzPP4=; b=qKjd5fYibKXWWIcMKCgRYuo1vJ2fD+IAQPjX+uamXIGY2Q + 0HjQ+Lq3/yHzG3JHJp6780/nKQPOWt2UDJQrJkEA== +Message-ID: <54B84785.1060301@d1.example> +Date: Thu, 14 Jan 2015 15:00:01 -0800 +From: John Q Doe +To: arc@dmarc.example +Subject: [List 2] Example 1 + +Hey gang, +This is a test message. +--J. + + + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 38] + +Internet-Draft ARC-Protocol December 2018 + + +Appendix C. Acknowledgements + + This draft originated with the work of OAR-Dev Group. + + The authors thank all of the OAR-Dev and the subsequent DMARC-WG + group for the ongoing help and though-provoking discussions from all + the participants, especially: Alex Brotman, Brandon Long, Dave + Crocker, Elizabeth Zwicky, Franck Martin, Greg Colburn, J. Trent + Adams, John Rae-Grant, Mike Hammer, Mike Jones, Steve Jones, Terry + Zink, Tim Draegen, Gene Shuman, Scott Kitterman, Bron Gondwana. + + Grateful appreciation is extended to the people who provided feedback + through the discuss mailing list. + +Appendix D. Comments and Feedback + + Please address all comments, discussions, and questions to + dmarc@ietf.org [6]. Earlier discussions can be found at arc- + discuss@dmarc.org [7]. Interop discussions planning can be found at + arc-interop@dmarc.org [8]. + + Some introductory material for less technical people can be found at + https://arc-spec.org [9]. + +Authors' Addresses + + Kurt Andersen + LinkedIn + 1000 West Maude Ave + Sunnyvale, California 94085 + USA + + Email: kurt+ietf@drkurt.com + + + Brandon Long (editor) + Google + + Email: blong@google.com + + + Seth Blank (editor) + Valimail + + Email: seth@valimail.com + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 39] + +Internet-Draft ARC-Protocol December 2018 + + + Murray Kucherawy (editor) + TDP + + Email: superuser@gmail.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Andersen, et al. Expires June 21, 2019 [Page 40] From 19735f960cc76da52b68f395e2ee25abf834e642 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 13 Jun 2019 21:10:35 -0400 Subject: [PATCH 342/741] Fall back to the multipart/related type parameter when locating the Root Fixes issue #489 --- MimeKit/MultipartRelated.cs | 29 ++++++++---- UnitTests/MultipartRelatedTests.cs | 18 +++++++ .../messages/multipart-related-mhtml.txt | 47 +++++++++++++++++++ UnitTests/UnitTests.csproj | 1 + 4 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 UnitTests/TestData/messages/multipart-related-mhtml.txt diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index 3e34d61967..fb50145183 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -86,19 +86,32 @@ public MultipartRelated () : base ("related") int GetRootIndex () { - string start = ContentType.Parameters["start"]; + var start = ContentType.Parameters["start"]; - if (start == null) - return -1; + if (start != null) { + string contentId; + + if ((contentId = MimeUtils.EnumerateReferences (start).FirstOrDefault ()) == null) + contentId = start; + + var cid = new Uri (string.Format ("cid:{0}", contentId)); - string contentId; + return IndexOf (cid); + } - if ((contentId = MimeUtils.EnumerateReferences (start).FirstOrDefault ()) == null) - contentId = start; + var type = ContentType.Parameters["type"]; - var cid = new Uri (string.Format ("cid:{0}", contentId)); + if (type == null) + return -1; - return IndexOf (cid); + for (int index = 0; index < Count; index++) { + var mimeType = this[index].ContentType.MimeType; + + if (mimeType.Equals (type, StringComparison.OrdinalIgnoreCase)) + return index; + } + + return -1; } /// diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index 8d91374f7d..9cb72299ea 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -96,6 +96,24 @@ public void TestDocumentRoot () Assert.IsNull (related.ContentType.Parameters["start"], "The start parameter should be null."); } + [Test] + public void TestDocumentRootByType () + { + var related = (MultipartRelated) MimeEntity.Load (Path.Combine ("..", "..", "TestData", "messages", "multipart-related-mhtml.txt")); + + Assert.AreEqual (2, related.Count, "Count"); + + var image = related[0]; + + Assert.AreEqual ("image/png", image.ContentType.MimeType, "related[0]"); + + var html = related[1]; + + Assert.AreEqual ("text/html", html.ContentType.MimeType, "related[1]"); + + Assert.AreEqual (html, related.Root, "Root"); + } + [Test] public void TestReferenceByContentId () { diff --git a/UnitTests/TestData/messages/multipart-related-mhtml.txt b/UnitTests/TestData/messages/multipart-related-mhtml.txt new file mode 100644 index 0000000000..c10f544071 --- /dev/null +++ b/UnitTests/TestData/messages/multipart-related-mhtml.txt @@ -0,0 +1,47 @@ +MIME-Version: 1.0 +Content-Type: multipart/related; + type="text/html"; + boundary="----=_NextPart_115e1404-dbbc-4611-b4ce-d08a4b021c45" + +This is a multi-part message in MIME format. +------=_NextPart_115e1404-dbbc-4611-b4ce-d08a4b021c45 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Location: image1 + +iVBORw0KGgoAAAANSUhEUgAAAZAAAABOCAYAAAAO/EAnAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAW +JQAAFiUBSVIk8AAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AAAL2SURBVHhe7d2x +ahRRFAZgn0ltBd/BWOZVfAptxNZtUgohIFFBCw1srQm7BmxMIhsQV0TFjHPCDruZXDZ3TzvfD183TPtz +750751ZTyL+Li+b4/Gczmc0BGKhpa/7776IZrqdYIJ/b8tjeGTdbowMABuph68Wnr5eLilKuFUi0zaOX +H5u7T940tx+/BmDAHjz/cLmoKOVKgUTLRNvce/q2+CIAhiUWE7GoKG1lXSmQH+0DsWQpvQSAYYpFxfsv +54umWOZKgXz/9ae5/+xd8QUADNOd1qvpt0VTLKNAAFhLgQCQokAASFEgAKQoEABSokD2J2eLplhGgQCw +VhTI3tFp07+PrkAAWCsKZPfwRIEAsBlbWACkOEQHIEWBAJCiQABIUSAApCgQAFKqCsQ8EAD6quaBmEgI +wKrqiYQRM9EB6FTPRO8SD2/vjJut0QEAAxVHGrErFbtTpRQLJB4+bktkMpsDMFDTVmnrqkuxQERERG6K +FQgARakViDMQADY+A/EVFgCd6q+w3AMBYFX1PRA30QHoq7qJ7l9YAPT5mSIAKQoEgBQFAkCKAgEgRYEA +kBIFsj85WzTFMgoEgLWiQPaOTpv+fXQFAsBaUSC7hycKBIDN2MICIMUhOgApCgSAFAUCQIoCASBFgQCQ +UlUg5oEA0Fc1D8REQgBWVU8kjJiJDkCneiZ6l3h4e2fcbI0OABioONKIXanYnSqlWCDx8HFbIpPZHICB +mrZKW1ddigUiIiJyU6xAAChKrUCcgQCw8RmIr7AA6FR/heUeCACrqu+BuIkOQF/VTXT/wgKgz88UAUhR +IACkKBAAUhQIACkKBICUKJD9ydmiKZZRIACsFQWyd3Ta9O+jKxAA1ooC2T08USAAbMYWFgApDtEBSFEg +AKQoEABSFAgAKQoEgJSqAjEPBIC+qnkgJhICsKp6ImHETHQAOtUz0bvEw9s742ZrdADAQMWRRuxKxe5U +KcUCiYeP2xKZzOYADNS0Vdq66lIsEBERkfVpmv/Cb/8ZH82DugAAAABJRU5ErkJggg== + + +------=_NextPart_115e1404-dbbc-4611-b4ce-d08a4b021c45 +Content-Type: text/html; charset="utf-8" +Content-Transfer-Encoding: quoted-printable + +=0D=0A=0D=0A=09=0D=0A=09=09=0D=0A=09= +=09=0D=0A=09=09=0D=0A=09=09=09.cs2654AE3A{te= +xt-align:left;text-indent:0pt;margin:0pt=200pt=200pt=200pt}=0D=0A=09=09=09.csC8= +F6D76{color:#000000;background-color:transparent;font-family:Calibri;font-size:= +11pt;font-weight:normal;font-style:normal;}=0D=0A=09=09=0D=0A=09= +=0D=0A=09=0D=0A=09=09= +

def

= +=0D=0A=0D=0A + + +------=_NextPart_115e1404-dbbc-4611-b4ce-d08a4b021c45-- diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index c035bf90eb..b7cf1ef86f 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -224,6 +224,7 @@ + From 8c8cf86ad1a3d2c4b0896acc061419426e97ad9a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 24 Jun 2019 09:24:49 -0400 Subject: [PATCH 343/741] Improved Authentication-Results parser to handle non-standard syntax Fixes issue #490 --- MimeKit/Cryptography/AuthenticationResults.cs | 446 ++++++++++++------ MimeKit/Cryptography/DkimSignerBase.cs | 13 +- .../AuthenticationResultsTests.cs | 29 +- 3 files changed, 325 insertions(+), 163 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 42827303c3..a1b77360f2 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -48,6 +48,11 @@ namespace MimeKit.Cryptography { /// public class AuthenticationResults { + AuthenticationResults () + { + Results = new List (); + } + /// /// Initializes a new instance of the class. /// @@ -58,12 +63,11 @@ public class AuthenticationResults /// /// is null. /// - public AuthenticationResults (string authservid) + public AuthenticationResults (string authservid) : this () { if (authservid == null) throw new ArgumentNullException (nameof (authservid)); - Results = new List (); AuthenticationServiceIdentifier = authservid; } @@ -128,42 +132,53 @@ internal void Encode (FormatOptions options, StringBuilder builder, int lineLeng lineLength += 4 + i.Length; } - if (lineLength + space + AuthenticationServiceIdentifier.Length > options.MaxLineLength) { - builder.Append (options.NewLine); - builder.Append ('\t'); - lineLength = 1; - space = 0; - } - - if (space > 0) { - builder.Append (' '); - lineLength++; - } - - builder.Append (AuthenticationServiceIdentifier); - lineLength += AuthenticationServiceIdentifier.Length; - - if (Version.HasValue) { - var version = Version.Value.ToString (CultureInfo.InvariantCulture); - - if (lineLength + 1 + version.Length > options.MaxLineLength) { + if (AuthenticationServiceIdentifier != null) { + if (lineLength + space + AuthenticationServiceIdentifier.Length > options.MaxLineLength) { builder.Append (options.NewLine); builder.Append ('\t'); lineLength = 1; - } else { + space = 0; + } + + if (space > 0) { builder.Append (' '); lineLength++; } - lineLength += version.Length; - builder.Append (version); + builder.Append (AuthenticationServiceIdentifier); + lineLength += AuthenticationServiceIdentifier.Length; + + if (Version.HasValue) { + var version = Version.Value.ToString (CultureInfo.InvariantCulture); + + if (lineLength + 1 + version.Length > options.MaxLineLength) { + builder.Append (options.NewLine); + builder.Append ('\t'); + lineLength = 1; + } else { + builder.Append (' '); + lineLength++; + } + + lineLength += version.Length; + builder.Append (version); + } + + builder.Append (';'); + lineLength++; } if (Results.Count > 0) { - for (int i = 0; i < Results.Count; i++) + for (int i = 0; i < Results.Count; i++) { + if (i > 0) { + builder.Append (';'); + lineLength++; + } + Results[i].Encode (options, builder, ref lineLength); + } } else { - builder.Append ("; none"); + builder.Append (" none"); } builder.Append (options.NewLine); @@ -183,20 +198,25 @@ public override string ToString () if (Instance.HasValue) builder.AppendFormat ("i={0}; ", Instance.Value.ToString (CultureInfo.InvariantCulture)); - builder.Append (AuthenticationServiceIdentifier); + if (AuthenticationServiceIdentifier != null) { + builder.Append (AuthenticationServiceIdentifier); - if (Version.HasValue) { - builder.Append (' '); - builder.Append (Version.Value.ToString (CultureInfo.InvariantCulture)); + if (Version.HasValue) { + builder.Append (' '); + builder.Append (Version.Value.ToString (CultureInfo.InvariantCulture)); + } + + builder.Append ("; "); } if (Results.Count > 0) { for (int i = 0; i < Results.Count; i++) { - builder.Append ("; "); + if (i > 0) + builder.Append ("; "); builder.Append (Results[i]); } } else { - builder.Append ("; none"); + builder.Append ("none"); } return builder.ToString (); @@ -237,136 +257,101 @@ static bool SkipValue (byte[] text, ref int index, int endIndex, out bool quoted return true; } - static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnError, out AuthenticationResults authres) + static bool SkipDomain (byte[] text, ref int index, int endIndex) { - int? instance = null; - string srvid = null; - string value; - bool quoted; + int startIndex = index; - authres = null; + while (ParseUtils.SkipAtom (text, ref index, endIndex) && index < endIndex && text[index] == (byte) '.') + index++; - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; + if (index > startIndex && text[index - 1] != (byte) '.') + return true; - do { - int start = index; + // don't advance `index` on failure + index = startIndex; - if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete authserv-id token at offset {0}", start), start, index); + return false; + } + + static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out bool quoted) + { + // pvalue := [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) [CFWS] + // value := token / quoted-string + // token := 1* + // tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> / "/" / "[" / "]" / "?" / "=" + if (text[index] == (byte) '"') { + // quoted-string + quoted = true; + if (!ParseUtils.SkipQuoted (text, ref index, endIndex, false)) return false; - } - value = Encoding.UTF8.GetString (text, start, index - start); + return true; + } - if (quoted) { - // this can only be the authserv-id token - srvid = MimeUtils.Unquote (value); - } else { - // this could either be the authserv-id or it could be "i=#" (ARC instance) - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; + quoted = false; - if (index < endIndex && text[index] == (byte) '=') { - // probably i=# - if (instance.HasValue) { - if (throwOnError) - throw new ParseException (string.Format ("Invalid token at offset {0}", start), start, index); + if (text[index] == (byte) '@') { + // "@" domain-name + index++; - return false; - } + if (!SkipDomain (text, ref index, endIndex)) + return false; - if (value != "i") { - if (throwOnError) - throw new ParseException (string.Format ("Invalid instance token at offset {0}", start), start, index); + return true; + } - return false; - } + if (!ParseUtils.SkipToken (text, ref index, endIndex)) + return false; - // skip over '=' - index++; + if (index < endIndex) { + if (text[index] == (byte) '@') { + // local-part@domain-name + index++; - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; + if (!SkipDomain (text, ref index, endIndex)) + return false; + } else if (text[index] != ';' && !text[index].IsWhitespace ()) { + return false; + } else { + int multiIndex = index; - start = index; + ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int i)) { - if (throwOnError) - throw new ParseException (string.Format ("Invalid instance value at offset {0}", start), start, index); + if (multiIndex < endIndex && text[multiIndex] == (byte) ';') { + multiIndex++; - return false; - } + ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - instance = i; + while (multiIndex < endIndex && SkipDomain (text, ref multiIndex, endIndex)) { + int startIndex = multiIndex; - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; + ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - if (index >= endIndex) { - if (throwOnError) - throw new ParseException (string.Format ("Missing semi-colon after instance value at offset {0}", start), start, index); + if (multiIndex >= endIndex) { + index = startIndex; + break; + } - return false; - } + if (text[multiIndex] != (byte) ';') + break; - if (text[index] != ';') { - if (throwOnError) - throw new ParseException (string.Format ("Unexpected token after instance value at offset {0}", index), index, index); + index = startIndex; + multiIndex++; - return false; + ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); } - - // skip over ';' - index++; - - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; - } else { - srvid = value; } } - } while (srvid == null); - - authres = new AuthenticationResults (srvid) { Instance = instance }; - - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; - - if (index >= endIndex) - return true; - - if (text[index] != (byte) ';') { - // might be the authres-version token - int start = index; - - if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int version)) { - if (throwOnError) - throw new ParseException (string.Format ("Invalid authres-version at offset {0}", start), start, index); - - return false; - } - - authres.Version = version; - - if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) - return false; - - if (index >= endIndex) - return true; - - if (text[index] != (byte) ';') { - if (throwOnError) - throw new ParseException (string.Format ("Unknown token at offset {0}", index), index, index); - - return false; - } } - // skip the ';' - index++; + return true; + } + + static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool throwOnError, AuthenticationResults authres) + { + string value; + bool quoted; while (index < endIndex) { if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) @@ -513,20 +498,20 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro value = Encoding.ASCII.GetString (text, tokenIndex, index - tokenIndex); - if (value == "reason") { + if (value == "reason" || value == "action") { if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete reasonspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format ("Incomplete {0}spec token at offset {1}", value, tokenIndex), tokenIndex, index); return false; } if (text[index] != (byte) '=') { if (throwOnError) - throw new ParseException (string.Format ("Invalid reasonspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format ("Invalid {0}spec token at offset {1}", value, tokenIndex), tokenIndex, index); return false; } @@ -540,15 +525,20 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid reasonspec value token at offset {0}", reasonIndex), reasonIndex, index); + throw new ParseException (string.Format ("Invalid {0}spec value token at offset {1}", value, reasonIndex), reasonIndex, index); return false; } - resinfo.Reason = Encoding.UTF8.GetString (text, reasonIndex, index - reasonIndex); + var reason = Encoding.UTF8.GetString (text, reasonIndex, index - reasonIndex); if (quoted) - resinfo.Reason = MimeUtils.Unquote (resinfo.Reason); + reason = MimeUtils.Unquote (reason); + + if (value == "action") + resinfo.Action = reason; + else + resinfo.Reason = reason; if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; @@ -649,10 +639,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro int valueIndex = index; - while (index < endIndex && text[index] != ';' && !text[index].IsWhitespace ()) - index++; - - if (index == valueIndex) { + if (!SkipPropertyValue (text, ref index, endIndex, out quoted)) { if (throwOnError) throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); @@ -661,6 +648,9 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro value = Encoding.UTF8.GetString (text, valueIndex, index - valueIndex); + if (quoted) + value = MimeUtils.Unquote (value); + var propspec = new AuthenticationMethodProperty (ptype, property, value); resinfo.Properties.Add (propspec); @@ -689,6 +679,146 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro return true; } + static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnError, out AuthenticationResults authres) + { + int? instance = null; + string srvid = null; + string value; + bool quoted; + + authres = null; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + do { + int start = index; + + if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { + if (throwOnError) + throw new ParseException (string.Format ("Incomplete authserv-id token at offset {0}", start), start, index); + + return false; + } + + value = Encoding.UTF8.GetString (text, start, index - start); + + if (quoted) { + // this can only be the authserv-id token + srvid = MimeUtils.Unquote (value); + } else { + // this could either be the authserv-id or it could be "i=#" (ARC instance) + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index < endIndex && text[index] == (byte) '=') { + // probably i=# + if (instance.HasValue) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid token at offset {0}", start), start, index); + + return false; + } + + if (value != "i") { + // Office 365 Authentication-Results do not include an authserv-id token, so this is probably a method. + // Rewind the parser and start over again with the assumption that the Authentication-Results only + // contains methods. + // + // See https://github.com/jstedfast/MimeKit/issues/490 for details. + + authres = new AuthenticationResults (); + index = 0; + + return TryParseMethods (text, ref index, endIndex, throwOnError, authres); + } + + // skip over '=' + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + start = index; + + if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int i)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid instance value at offset {0}", start), start, index); + + return false; + } + + instance = i; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Missing semi-colon after instance value at offset {0}", start), start, index); + + return false; + } + + if (text[index] != ';') { + if (throwOnError) + throw new ParseException (string.Format ("Unexpected token after instance value at offset {0}", index), index, index); + + return false; + } + + // skip over ';' + index++; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + } else { + srvid = value; + } + } + } while (srvid == null); + + authres = new AuthenticationResults (srvid) { Instance = instance }; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) + return true; + + if (text[index] != (byte) ';') { + // might be the authres-version token + int start = index; + + if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int version)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid authres-version at offset {0}", start), start, index); + + return false; + } + + authres.Version = version; + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) + return true; + + if (text[index] != (byte) ';') { + if (throwOnError) + throw new ParseException (string.Format ("Unknown token at offset {0}", index), index, index); + + return false; + } + } + + // skip the ';' + index++; + + return TryParseMethods (text, ref index, endIndex, throwOnError, authres); + } + /// /// Tries to parse the given input buffer into a new instance. /// @@ -887,11 +1017,22 @@ public string Result { /// /// Gets the comment regarding the authentication method result. /// - /// THe comment regarding the authentication method result. + /// The comment regarding the authentication method result. public string ResultComment { get; set; } + /// + /// Get the action taken for the authentication method result. + /// + /// + /// Gets the action taken for the authentication method result. + /// + /// The action taken for the authentication method result. + public string Action { + get; internal set; + } + /// /// Get the reason for the authentication method result. /// @@ -916,9 +1057,6 @@ public List Properties { internal void Encode (FormatOptions options, StringBuilder builder, ref int lineLength) { - builder.Append (';'); - lineLength++; - // try to put the entire result on 1 line var complete = ToString (); @@ -986,6 +1124,17 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line tokens.Add ("reason="); tokens.Add (reason); } + } else if (!string.IsNullOrEmpty (Action)) { + var action = MimeUtils.Quote (Action); + + tokens.Add (" "); + + if ("action=".Length + action.Length < options.MaxLineLength) { + tokens.Add ($"reason={action}"); + } else { + tokens.Add ("reason="); + tokens.Add (action); + } } for (int i = 0; i < Properties.Count; i++) @@ -1022,6 +1171,9 @@ public override string ToString () if (!string.IsNullOrEmpty (Reason)) { builder.Append (" reason="); builder.Append (MimeUtils.Quote (Reason)); + } else if (!string.IsNullOrEmpty (Action)) { + builder.Append (" action="); + builder.Append (MimeUtils.Quote (Action)); } for (int i = 0; i < Properties.Count; i++) { diff --git a/MimeKit/Cryptography/DkimSignerBase.cs b/MimeKit/Cryptography/DkimSignerBase.cs index 8b273b478d..df85ee0e12 100644 --- a/MimeKit/Cryptography/DkimSignerBase.cs +++ b/MimeKit/Cryptography/DkimSignerBase.cs @@ -170,15 +170,10 @@ internal static AsymmetricKeyParameter LoadPrivateKey (Stream stream) var keyObject = pem.ReadObject (); - if (keyObject != null) { - key = keyObject as AsymmetricKeyParameter; - - if (key == null) { - var pair = keyObject as AsymmetricCipherKeyPair; - - if (pair != null) - key = pair.Private; - } + if (keyObject is AsymmetricCipherKeyPair pair) { + key = pair.Private; + } else if (keyObject is AsymmetricKeyParameter) { + key = (AsymmetricKeyParameter) keyObject; } } diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 2863bb8b38..9a96f4d885 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -171,7 +171,7 @@ public void TestEncodeLongResultMethodWithVersionAndCommentAndReason () authres.Results.Add (new AuthenticationMethodResult ("really-really-really-long-method-name", "really-really-really-long-value") { ResultComment = "this is a really really long result comment", - Reason = "this is a really really really long reason", + Action = "this is a really really really long reason", Version = 214748367 }); authres.Results[0].Properties.Add (new AuthenticationMethodProperty ("this-is-a-really-really-long-ptype", "this-is-a-really-really-long-property", "this-is-a-really-really-long-value")); @@ -297,6 +297,27 @@ public void TestParseAuthServIdWithVersionAndSemicolon () Assert.AreEqual (expected, encoded.ToString ()); } + [Test] + public void TestParseNoAuthServId () + { + var buffer = Encoding.ASCII.GetBytes ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; recevingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=none header.from=domain.com;"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.IsNull (authres.AuthenticationServiceIdentifier, "authserv-id"); + + Assert.AreEqual ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; recevingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=\"none\" header.from=domain.com", authres.ToString ()); + + const string expected = " spf=fail (sender IP is 1.1.1.1)\n\tsmtp.mailfrom=eu-west-1.amazonses.com; recevingdomain.com;\n\tdkim=pass (signature was verified) header.d=domain.com;domain1.com;\n\tdmarc=bestguesspass action=\"none\" header.from=domain.com\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestParseNoResults () { @@ -904,12 +925,6 @@ public void TestParseFailureMultipleLeadingArcInstance () AssertParseFailure ("i=5; i=1", 5, 6); } - [Test] - public void TestParseFailureUnknownLeadingMethod () - { - AssertParseFailure ("x=5; authserv-id", 0, 1); - } - [Test] public void TestParseFailureInvalidVersion () { From b50fc8ebc67b47391cde2e79621243e2bbdd257e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 26 Jun 2019 13:45:54 -0400 Subject: [PATCH 344/741] Updated DkimVerifier sample --- samples/DkimVerifier/DkimVerifier/Program.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/samples/DkimVerifier/DkimVerifier/Program.cs b/samples/DkimVerifier/DkimVerifier/Program.cs index 568255f6f0..c0fc452ecc 100644 --- a/samples/DkimVerifier/DkimVerifier/Program.cs +++ b/samples/DkimVerifier/DkimVerifier/Program.cs @@ -93,6 +93,9 @@ public static void Main (string[] args) var locator = new DkimPublicKeyLocator (); var verifier = new DkimVerifier (locator); + // RSA-SHA1 is disabled by default starting with MimeKit 2.2.0 + verifier.Enable (DkimSignatureAlgorithm.RsaSha1); + for (int i = 0; i < args.Length; i++) { if (!File.Exists (args[i])) { Console.Error.WriteLine ("{0}: No such file.", args[i]); From 3ad8de77e06a7eec6c6a1804b8a79010a938409f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 6 Jul 2019 15:21:04 -0400 Subject: [PATCH 345/741] When FormatOptions.AllowMixedHeaderCharsets is disabled, always use user-specified charset Previously this could/would still use us-ascii and/or iso-8859-1 if the entire header could fit within one of those charsets. Fixes issue #493 --- MimeKit/FormatOptions.cs | 6 +-- MimeKit/Utils/Rfc2047.cs | 57 ++++++++++++--------------- UnitTests/InternetAddressListTests.cs | 24 +++++++++-- 3 files changed, 48 insertions(+), 39 deletions(-) diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index 5803b6366d..370f8faab7 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -223,8 +223,8 @@ public bool International { /// Gets or sets whether the formatter should allow mixed charsets in the headers. ///
/// - /// When this option is enabled, the MIME formatter will try to use US-ASCII and/or - /// ISO-8859-1 to encode headers when appropriate rather than being forced to use the + /// When this option is enabled, the MIME formatter will try to use us-ascii and/or + /// iso-8859-1 to encode headers when appropriate rather than being forced to use the /// specified charset for all encoded-word tokens in order to maximize readability. /// Unfortunately, mail clients like Outlook and Thunderbird do not treat /// encoded-word tokens individually and assume that all tokens are encoded using the @@ -234,7 +234,7 @@ public bool International { /// /// https://bugzilla.mozilla.org/show_bug.cgi?id=317263. /// - /// true if the formatter should be allowed to use ISO-8859-1 when encoding headers; otherwise, false. + /// true if the formatter should be allowed to use us-ascii and/or iso-8859-1 when encoding headers; otherwise, false. public bool AllowMixedHeaderCharsets { get { return allowMixedHeaderCharsets; } set { diff --git a/MimeKit/Utils/Rfc2047.cs b/MimeKit/Utils/Rfc2047.cs index fe9fe08b72..ecb8914d40 100644 --- a/MimeKit/Utils/Rfc2047.cs +++ b/MimeKit/Utils/Rfc2047.cs @@ -1045,11 +1045,17 @@ enum WordType { EncodedWord } + enum WordEncoding { + Ascii, + Latin1, + UserSpecified + } + class Word { public WordType Type; public int StartIndex; public int CharCount; - public int Encoding; // 0 => ASCII, 1 => iso-8859-1, 2 => custom + public WordEncoding Encoding; public int ByteCount; public int EncodeCount; public int QuotedPairs; @@ -1111,10 +1117,10 @@ static bool ExceedsMaxLineLength (FormatOptions options, Encoding charset, Word switch (word.Type) { case WordType.EncodedWord: switch (word.Encoding) { - case 1: + case WordEncoding.Latin1: length = EstimateEncodedWordLength ("iso-8859-1", word.ByteCount, word.EncodeCount); break; - case 0: + case WordEncoding.Ascii: length = EstimateEncodedWordLength ("us-ascii", word.ByteCount, word.EncodeCount); break; default: @@ -1159,7 +1165,7 @@ static IList GetRfc822Words (FormatOptions options, Encoding charset, stri if (c < 127) { if (IsCtrl (c)) { - word.Encoding = Math.Max (word.Encoding, 1); + word.Encoding = (WordEncoding) Math.Max ((int) word.Encoding, (int) WordEncoding.Latin1); word.Type = WordType.EncodedWord; word.EncodeCount++; } else if (phrase && !IsAtom (c)) { @@ -1176,7 +1182,7 @@ static IList GetRfc822Words (FormatOptions options, Encoding charset, stri nchars = 1; } else if (c < 256) { // iso-8859-1 - word.Encoding = Math.Max (word.Encoding, 1); + word.Encoding = (WordEncoding) Math.Max ((int) word.Encoding, (int) WordEncoding.Latin1); word.Type = WordType.EncodedWord; word.EncodeCount++; word.ByteCount++; @@ -1198,11 +1204,11 @@ static IList GetRfc822Words (FormatOptions options, Encoding charset, stri n = 3; } + word.Encoding = WordEncoding.UserSpecified; word.Type = WordType.EncodedWord; word.CharCount += nchars; word.EncodeCount += n; word.ByteCount += n; - word.Encoding = 2; } if (ExceedsMaxLineLength (options, charset, word)) { @@ -1288,11 +1294,11 @@ static bool ShouldMergeWords (FormatOptions options, Encoding charset, IList Merge (FormatOptions options, Encoding charset, IList w if (words.Count < 2) return words; - int lwspCount, encoding, encoded, quoted, byteCount, length; + int lwspCount, encoded, quoted, byteCount, length; var merged = new List (); + WordEncoding encoding; Word word, next; word = words[0]; @@ -1323,18 +1330,18 @@ static IList Merge (FormatOptions options, Encoding charset, IList w next = words[i]; if (word.Type != WordType.Atom && word.Type == next.Type) { + encoding = (WordEncoding) Math.Max ((int) word.Encoding, (int) next.Encoding); lwspCount = next.StartIndex - (word.StartIndex + word.CharCount); byteCount = word.ByteCount + lwspCount + next.ByteCount; - encoding = Math.Max (word.Encoding, next.Encoding); encoded = word.EncodeCount + next.EncodeCount; quoted = word.QuotedPairs + next.QuotedPairs; if (word.Type == WordType.EncodedWord) { switch (encoding) { - case 1: + case WordEncoding.Latin1: length = EstimateEncodedWordLength ("iso-8859-1", byteCount, encoded); break; - case 0: + case WordEncoding.Ascii: length = EstimateEncodedWordLength ("us-ascii", byteCount, encoded); break; default: @@ -1376,7 +1383,7 @@ static IList Merge (FormatOptions options, Encoding charset, IList w word.Type = (WordType) Math.Max ((int) word.Type, (int) next.Type); word.CharCount = (next.StartIndex + next.CharCount) - word.StartIndex; word.ByteCount = word.ByteCount + lwspCount + next.ByteCount; - word.Encoding = Math.Max (word.Encoding, next.Encoding); + word.Encoding = (WordEncoding) Math.Max ((int) word.Encoding, (int) next.Encoding); word.EncodeCount = word.EncodeCount + next.EncodeCount; word.QuotedPairs = word.QuotedPairs + next.QuotedPairs; } else { @@ -1398,23 +1405,9 @@ static byte[] Encode (FormatOptions options, Encoding charset, string text, bool byte[] encoded; if (!options.AllowMixedHeaderCharsets) { - int maxEncoding = 0; - for (int i = 0; i < words.Count; i++) { - if (words[i].Type != WordType.EncodedWord || words[i].Encoding == maxEncoding) - continue; - - if (words[i].Encoding > maxEncoding) { - maxEncoding = words[i].Encoding; - for (int j = 0; j < i; j++) { - if (words[j].Type != WordType.EncodedWord) - continue; - - words[j].Encoding = maxEncoding; - } - } else { - words[i].Encoding = maxEncoding; - } + if (words[i].Type == WordType.EncodedWord) + words[i].Encoding = WordEncoding.UserSpecified; } } @@ -1447,10 +1440,10 @@ static byte[] Encode (FormatOptions options, Encoding charset, string text, bool } switch (word.Encoding) { - case 0: // us-ascii + case WordEncoding.Ascii: AppendEncodedWord (str, Encoding.ASCII, text, start, length, mode); break; - case 1: // iso-8859-1 + case WordEncoding.Latin1: AppendEncodedWord (str, CharsetUtils.Latin1, text, start, length, mode); break; default: // custom charset diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index d48dd5d198..c19075c45d 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -430,7 +430,8 @@ public void TestMailboxWithDotsInTheName () [Test] public void TestMailboxWith8bitName () { - const string encoded = "Patrik =?iso-8859-1?b?RqVkbHRzdHKldm0=?= "; + //const string encoded = "Patrik =?iso-8859-1?b?RqVkbHRzdHKldm0=?= "; + const string encoded = "Patrik =?utf-8?b?RsKlZGx0c3RywqV2bQ==?= "; const string text = "Patrik F¥dltstr¥vm "; var expected = new InternetAddressList (); @@ -504,10 +505,14 @@ public void TestEncodingMailboxWithReallyLongWord () const string expected = "=?us-ascii?q?reeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallllllllllll?=\n =?us-ascii?q?llllllllllllllllllllllllllllllllllllllllllly?= long word\n\t"; const string name = "reeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallllllllllllllllllllllllllllllllllllllllllllllllllllllly long word"; var mailbox = new MailboxAddress (name, "really.long.word@example.com"); + var options = FormatOptions.Default.Clone (); var list = new InternetAddressList (); list.Add (mailbox); - var actual = list.ToString (UnixFormatOptions, true); + options.NewLineFormat = NewLineFormat.Unix; + options.AllowMixedHeaderCharsets = true; + + var actual = list.ToString (options, true); Assert.AreEqual (expected, actual, "Encoding really long mailbox did not match expected result: {0}", expected); Assert.IsTrue (InternetAddressList.TryParse (actual, out list), "Failed to parse really long mailbox"); @@ -569,17 +574,19 @@ public void TestEncodingSimpleAddressList () public void TestEncodingLongNameMixedQuotingAndEncoding () { const string name = "Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx für xxxxxxxxxxxxx xxxx"; - const string encodedName = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx xxxx"; + const string encodedNameLatin1 = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx xxxx"; + const string encodedNameUnicode = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?utf-8?b?ZsO8cg==?= xxxxxxxxxxxxx xxxx"; const string encodedMailbox = "\"Dr. xxxxxxxxxx xxxxx | xxxxxx.xxxxxxx\" =?iso-8859-1?b?Zvxy?= xxxxxxxxxxxxx\n xxxx "; const string address = "x.xxxxx@xxxxxxx-xxxxxx.xx"; var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Unix; + options.AllowMixedHeaderCharsets = true; var buffer = Rfc2047.EncodePhrase (options, Encoding.UTF8, name); var result = Encoding.UTF8.GetString (buffer); - Assert.AreEqual (encodedName, result); + Assert.AreEqual (encodedNameLatin1, result); var mailbox = new MailboxAddress (name, address); var list = new InternetAddressList (); @@ -589,6 +596,15 @@ public void TestEncodingLongNameMixedQuotingAndEncoding () result = list.ToString (options, true); Assert.AreEqual (encodedMailbox, result); + + // Now disable smart encoding + + options.AllowMixedHeaderCharsets = false; + + buffer = Rfc2047.EncodePhrase (options, Encoding.UTF8, name); + result = Encoding.UTF8.GetString (buffer); + + Assert.AreEqual (encodedNameUnicode, result); } [Test] From 630a96e381381d73b014c3b2ba9e06513b2da0ee Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 7 Aug 2019 14:01:47 -0400 Subject: [PATCH 346/741] Updated appveyor.yml --- appveyor.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 96d9fb4423..557ec064e5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,6 +24,10 @@ build: test_script: - ps: >- - .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml + regsvr32 .\packages\OpenCover.4.6.519\tools\x86\OpenCover.Profiler.dll + + regsvr32 .\packages\OpenCover.4.6.519\tools\x64\OpenCover.Profiler.dll + + .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From 3ecff5b7b59ab77bd01f7e95947a29ada8e26ca8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Aug 2019 08:52:58 -0400 Subject: [PATCH 347/741] Fixed line length calculations in BestEncodingFilter Fixes issue #497 --- MimeKit/IO/Filters/BestEncodingFilter.cs | 6 ++++++ UnitTests/IO/Filters/FilterTests.cs | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/MimeKit/IO/Filters/BestEncodingFilter.cs b/MimeKit/IO/Filters/BestEncodingFilter.cs index 2d91997d79..d9b19e4ca8 100644 --- a/MimeKit/IO/Filters/BestEncodingFilter.cs +++ b/MimeKit/IO/Filters/BestEncodingFilter.cs @@ -42,6 +42,7 @@ public class BestEncodingFilter : IMimeFilter int markerLength; bool hasMarker; int total; + byte pc; /// /// Initializes a new instance of the class. @@ -153,9 +154,13 @@ unsafe void Scan (byte* inptr, byte* inend) marker[markerLength++] = c; linelen++; + pc = c; } if (c == (byte) '\n') { + if (pc == (byte) '\r') + linelen--; + maxline = Math.Max (maxline, linelen); linelen = 0; @@ -259,6 +264,7 @@ public void Reset () count0 = 0; count8 = 0; total = 0; + pc = 0; } #endregion diff --git a/UnitTests/IO/Filters/FilterTests.cs b/UnitTests/IO/Filters/FilterTests.cs index 230bf8eebf..5961747155 100644 --- a/UnitTests/IO/Filters/FilterTests.cs +++ b/UnitTests/IO/Filters/FilterTests.cs @@ -206,6 +206,30 @@ public void TestBestEncodingFilter () Assert.AreEqual (ContentEncoding.QuotedPrintable, encoding, "French (long lines) no constraint."); } } + + filter.Reset (); + + // Test 78 character line length with CRLF + using (var stream = new MemoryStream ()) { + using (var filtered = new FilteredStream (stream)) { + var buffer = Encoding.ASCII.GetBytes ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\r\nabc\r\n"); + ContentEncoding encoding; + + filtered.Add (filter); + + filtered.Write (buffer, 0, buffer.Length); + filtered.Flush (); + + encoding = filter.GetBestEncoding (EncodingConstraint.SevenBit, 78); + Assert.AreEqual (ContentEncoding.SevenBit, encoding, "78-character line; 7bit constraint."); + + encoding = filter.GetBestEncoding (EncodingConstraint.EightBit, 78); + Assert.AreEqual (ContentEncoding.SevenBit, encoding, "78-character line; 8bit constraint."); + + encoding = filter.GetBestEncoding (EncodingConstraint.None, 78); + Assert.AreEqual (ContentEncoding.SevenBit, encoding, "78-character line; no constraint."); + } + } } [Test] From d323cb9105860b83d89e51e0b4f24649632b9278 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 21 Aug 2019 07:57:52 -0400 Subject: [PATCH 348/741] Updated S/MIME test certificates --- UnitTests/Cryptography/SecureMimeTests.cs | 17 ++- .../TestData/smime/certificate-authority.crt | 50 ++++----- .../TestData/smime/certificate-authority.key | 98 ++++++++--------- .../TestData/smime/certificate-authority.srl | 2 +- UnitTests/TestData/smime/chain.crt | 102 +++++++++--------- UnitTests/TestData/smime/gencerts.sh | 6 +- UnitTests/TestData/smime/intermediate.crt | 52 ++++----- UnitTests/TestData/smime/intermediate.csr | 44 ++++---- UnitTests/TestData/smime/intermediate.key | 98 ++++++++--------- UnitTests/TestData/smime/smime.crt | 50 ++++----- UnitTests/TestData/smime/smime.csr | 46 ++++---- UnitTests/TestData/smime/smime.key | 100 ++++++++--------- UnitTests/TestData/smime/smime.p12 | Bin 7141 -> 7141 bytes 13 files changed, 337 insertions(+), 328 deletions(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index b4a1ef4936..8d287d6dc8 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -48,11 +48,11 @@ public abstract class SecureMimeTestsBase const string ExpiredCertificateMessage = "The certificate is revoked.\r\n"; const string UntrustedRootCertificateMessage = "A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.\r\n"; const string ThunderbirdFingerprint = "354ea4dcf98166639b58ec5df06a65de0cd8a95c"; - const string MimeKitFingerprint = "4846fb5e27df6a23bb35a995443363e447d3426d"; + const string MimeKitFingerprint = "66679bc836cf4f22cb3680bc9bbae50898cd30e0"; const string ThunderbirdName = "fejj@gnome.org"; - static readonly DateTime MimeKitCreationDate = new DateTime (2018, 07, 30, 13, 13, 19); - static readonly DateTime MimeKitExpirationDate = new DateTime (2019, 07, 30, 13, 13, 19); + static readonly DateTime MimeKitCreationDate = new DateTime (2019, 08, 21, 11, 46, 34); + static readonly DateTime MimeKitExpirationDate = new DateTime (2029, 08, 18, 11, 46, 34); static readonly string[] CertificateAuthorities = { "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" @@ -1202,7 +1202,7 @@ public void TestSecureMimeDecryptVerifyThunderbird () } [Test] - public void TestSecureMimeImportExport () + public virtual void TestSecureMimeImportExport () { var self = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); var mailboxes = new List (); @@ -1431,5 +1431,14 @@ public override void TestSecureMimeSignAndEncrypt () base.TestSecureMimeSignAndEncrypt (); } + + [Test] + public override void TestSecureMimeImportExport () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeImportExport (); + } } } diff --git a/UnitTests/TestData/smime/certificate-authority.crt b/UnitTests/TestData/smime/certificate-authority.crt index 189e8f3cd5..18cdfa4c1a 100644 --- a/UnitTests/TestData/smime/certificate-authority.crt +++ b/UnitTests/TestData/smime/certificate-authority.crt @@ -1,32 +1,32 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/certificate-authority.key b/UnitTests/TestData/smime/certificate-authority.key index ee624082c4..869d452178 100644 --- a/UnitTests/TestData/smime/certificate-authority.key +++ b/UnitTests/TestData/smime/certificate-authority.key @@ -1,51 +1,51 @@ -----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/certificate-authority.srl b/UnitTests/TestData/smime/certificate-authority.srl index 4d72483732..ddffd462d7 100644 --- a/UnitTests/TestData/smime/certificate-authority.srl +++ b/UnitTests/TestData/smime/certificate-authority.srl @@ -1 +1 @@ -A68B9B780627A14E +A68B9B780627A150 diff --git a/UnitTests/TestData/smime/chain.crt b/UnitTests/TestData/smime/chain.crt index f4f9898e75..51cb499f6c 100644 --- a/UnitTests/TestData/smime/chain.crt +++ b/UnitTests/TestData/smime/chain.crt @@ -1,65 +1,65 @@ -----BEGIN CERTIFICATE----- -MIIFojCCA4oCCQCmi5t4BiehTjANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC +MIIFojCCA4oCCQCmi5t4BiehUDANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 -bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx -MjU2WhcNMTkwNzMwMTMxMjU2WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h +bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTkwODIxMTE0 +NjI1WhcNMjkwODE4MTE0NjI1WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B CQEWGGludGVybWVkaWF0ZUBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBALi4vlwUhDHbjlX6YeDnPyAT3Cbq1TjPPAdC2L4xYDOhjxWS -qQOM2Ua2g/qQUhOZACuRyUjADwOL8XXJ/y3/AL+RKoDRdhdtD7QFZGoqOaYPsrkW -a424NBD9ULwiH3FpE74dNX86MOExrioWpc1MQyn5BuuNIjgjgOJlLw20qC6bJh/s -I8gHua3w1dohh+O53SFWwP6IzYvLYzPzBH+wUGjIr/csWudMP3ssm7P2Ze1KL2tP -D8Z6bZwCDY0HAC5D1oYJ27nGtgOF9/3DTxyr22gv+2A+l3u26LcAGpzyeX828StB -Py/bMrqVNVPcJDsub8UVmW/Dp+1xy5Jo1eVSCPh+Jm9Y+HjfMhRfgz01caQWpz+Q -TvYgWSWgg2KV1S/awoFHqa/dsmBs0KQn9GJnO573PlKXlh5jUUqbqKj2hvSMKWTK -lDIxJLKK/ZATqjlvDDGx8L0FiL08iUxy6aHsLhA8XaAK2TPMqjy44mnZG5F4fb8m -67BMkV66rVXdCfJs8GQimhykoM3zuKZKwJg1+1ZUJrx/r04llVTIT5Y9AmFQzrNr -4t7TR/VnKz215UI/U36plGWVs2Z3UuLoKQsHePnRYGjXOrFQFOuAj9eqthkoCQd3 -L3F2OhRSzJ5glm/h10gi/ej8ulq18SznNXGTjziTQMuZ31rr0YYApfBsz0w9AgMB -AAEwDQYJKoZIhvcNAQEFBQADggIBAOwLaBK2DqMHo/xgif+xlMIJk4rcjXnRk+oO -9GwzGrcFm+M5xodAV0/zLt2j+d+ir3vqjpp3NrJRyM2g4tOgXNj4vLy5hjYMxpaX -vvxdzV+PvUGlmucg1dTwKVlATXTcGCNgvG62+vyVmBJ3PVbIjw9mMi2uZZNgnJlL -uAxarbKEaNZ75BFTCmWeeOGTh3NaLppKVer7xBHC7Voy6eXUcrDD9CrwUUZ0M2tq -7jQwlIVldyFuJ1ccqBhVjtwXkaQer/eAdkcLXBGUMy4ZxibhxjnsV6INKqZiLDHO -S46F08O506IuY3/qdWuA7LOfMNekaHQwKuMdarNSiEGoAlYiEYaWE7HJ6SdUzzk9 -6BPHr8dRVSSGpGM3a3Vflq9uMldt8kBGnEP9Z+pqQurmIpcPk4lkNzUiHiKy4Uah -1yikEhroPtYL+pZqFf9AKHgligz3dqJfW4noyTsVrHwGC7iXg8keHVRpicVx7R8C -Ci9pvJaFfUhIldXjeRCS/9EbedtmnCti2Zo7UFbTkIk4Pg1oQlsO4aaFPj3Vkz3T -plzVIZQF0zOSPaSgvPyE60AQ0EwIgET9rkvo23EVaqQVN+aGTiGTihKtOwHY4NHy -JG/zdWxHUL61b2Zw6Xa/Zh063NJ6gsL/ZUUA5Qgg8OAKGUJYnXCgDWCVHpSeWu/e -fnYch7TL +ggIPADCCAgoCggIBAL55oFf3vW8olt3VlvhkAx+KRYKCsGCfUNBDLb0KO5f+cNJL +g/kfUqg2r94jpl+BkmexD8Bs5YTRKUC15x26H9CgEQqw7EmBgMN1cnacmGDhqsKM +ELyju8CwyKhi+UDlCbGUlhCdCb8fi6rRuZmzuK3hXF5Yz7uBJyIdvchCwdTpwlFS +Lgt7v+K1k5fJwitu2N+QXzVB7G5FNNVwE8W5MKTbbB+wqYb3J04pRPmBnj7jKUby +N1MC1GA7NqCfapiZOJVW+howcxZJ5QY1UpkmBh8L3yZYe5L7IR3IKlPJ1TD9Cwjc +DnFFVuZBpuckUA+94ieCoZ7pV2dZ+q/qq4RgWVDK05HYhKSOu86he2nfndaOBAgp +9l/mqo+5u/26Wenuvz8HW8asAz2FjvHp62KRYq9gZgJr77qRG9XIgM5+HsopTfOK +3jDAsETCDk4mL09/FpKvVWtBvpUIE/ZO2eKXbYmmS7tiXxpIPZmJPcs8aOirZy2R +3AOekYOdj6hoTvU4t2lfUFOJQuPdA/8rOkOMmgdzyW3ZNLrjqZNtZrghHqVt0ZUT +0YdWp1wEUTDhhkpnhnIHUocV6doYQGaykqyqiS+T8FAQK6aSBtcIHu/PNdG2sfz2 +Ma9QyfKVHFXrxH4GqWcahhtJlramopZ+/MT/QAz1YcBz2b70ePvP/Wss3nhxAgMB +AAEwDQYJKoZIhvcNAQEFBQADggIBADZN4B+9iC7MYhtHYeiRzubCt7cdX1q6tr8v +wROh2ZOUR20fqSWH6exsbafy47VNn3VYDwpf7imxjBKKcNlfDO7utFpLqew7xOLh +pAQR2owI5PSD4lXmwUc6tOSvW4H6nDE7RoPXpjyk9y+Epw9TJoTx70QtqUJhK4LQ +MhcNlzvWNO07RTtPZLi3J53rJYCy43NEwTX2XvIYNyxiWJ3C33QAXKPW7WcfPp48 +pIXjJqlEWEoO6hJwfXg8VDjOBYAu36Brv9om8+8JU57Bx4O9qC7HQ8Ha8tNa0jvC +7Vfy4i/8+moJHTXVQr9JGj2PBr+Jt1rTT/w643eozTScYIxxCn1lMFPj0sJYv8iK +dlzT+FtMeDCW+CHtrVAOLBGSlulF97Mgvw579X2sbDRyIXWmPcT2KoDotRVm4PHb +RBcFWpTbfqH84pUAYzOW984fNMGLlY2vZaL40jhkjtV7SlZDfVrhYgcAKgSra/i0 +5akHJiCHnzGdzlTQvV7zZ1wxCxj0MliGU0asn/Wana6Eq8HvefcsnAu5lNRbz6Vo +qb36RkQ9jNUq1lghaMYsbSoO3UmORnpxVnEjXKxHzUQeyjavaG5EQcOk7PZkkreu +UcSeC0EatfRdG4iwb20xky/RDNkdgLo9VkK1NDfx7l2JxGgjazjaWTslFp4QiEJF +PTPQ+C/1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/gencerts.sh b/UnitTests/TestData/smime/gencerts.sh index 5c8483f887..8b14b5bce2 100755 --- a/UnitTests/TestData/smime/gencerts.sh +++ b/UnitTests/TestData/smime/gencerts.sh @@ -13,7 +13,7 @@ echo "Organizational Unit Name: " echo "Common Name: Bruce Wayne" echo "Email Address: root@example.com" echo "=========================================" -openssl req -new -x509 -days 365 -nodes -key certificate-authority.key -out certificate-authority.crt \ +openssl req -new -x509 -days 3650 -nodes -key certificate-authority.key -out certificate-authority.crt \ -subj "/C=US/ST=Massachusetts/L=Boston/O=Example Authority Inc./CN=Bruce Wayne/emailAddress=root@example.com" # Create the private key for the intermediate certificate @@ -34,7 +34,7 @@ openssl req -new -key intermediate.key -out intermediate.csr \ # Sign the CSR using the root (CA) certificate openssl x509 -req -in intermediate.csr -CA certificate-authority.crt -CAkey certificate-authority.key \ - -CAcreateserial -days 365 -out intermediate.crt + -CAcreateserial -days 3650 -out intermediate.crt # Create the certificate chain cat intermediate.crt certificate-authority.crt > chain.crt @@ -51,7 +51,7 @@ echo "=========================================" openssl genrsa -des3 -out smime.key 4096 > /dev/null openssl req -new -key smime.key -out smime.csr \ -subj "/C=US/ST=Massachusetts/L=Boston/CN=MimeKit UnitTests/emailAddress=mimekit@example.com" -openssl x509 -req -days 365 -in smime.csr -CA intermediate.crt -CAkey intermediate.key -set_serial 1 \ +openssl x509 -req -days 3650 -in smime.csr -CA intermediate.crt -CAkey intermediate.key -set_serial 1 \ -out smime.crt -setalias "mimekit@example.com" -addtrust emailProtection \ -addreject clientAuth -addreject serverAuth -trustout openssl pkcs12 -export -in smime.crt -inkey smime.key -out smime.p12 -chain -CAfile chain.crt diff --git a/UnitTests/TestData/smime/intermediate.crt b/UnitTests/TestData/smime/intermediate.crt index 1723acc510..b04510fb9c 100644 --- a/UnitTests/TestData/smime/intermediate.crt +++ b/UnitTests/TestData/smime/intermediate.crt @@ -1,33 +1,33 @@ -----BEGIN CERTIFICATE----- -MIIFojCCA4oCCQCmi5t4BiehTjANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC +MIIFojCCA4oCCQCmi5t4BiehUDANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 -bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx -MjU2WhcNMTkwNzMwMTMxMjU2WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h +bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTkwODIxMTE0 +NjI1WhcNMjkwODE4MTE0NjI1WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B CQEWGGludGVybWVkaWF0ZUBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBALi4vlwUhDHbjlX6YeDnPyAT3Cbq1TjPPAdC2L4xYDOhjxWS -qQOM2Ua2g/qQUhOZACuRyUjADwOL8XXJ/y3/AL+RKoDRdhdtD7QFZGoqOaYPsrkW -a424NBD9ULwiH3FpE74dNX86MOExrioWpc1MQyn5BuuNIjgjgOJlLw20qC6bJh/s -I8gHua3w1dohh+O53SFWwP6IzYvLYzPzBH+wUGjIr/csWudMP3ssm7P2Ze1KL2tP -D8Z6bZwCDY0HAC5D1oYJ27nGtgOF9/3DTxyr22gv+2A+l3u26LcAGpzyeX828StB -Py/bMrqVNVPcJDsub8UVmW/Dp+1xy5Jo1eVSCPh+Jm9Y+HjfMhRfgz01caQWpz+Q -TvYgWSWgg2KV1S/awoFHqa/dsmBs0KQn9GJnO573PlKXlh5jUUqbqKj2hvSMKWTK -lDIxJLKK/ZATqjlvDDGx8L0FiL08iUxy6aHsLhA8XaAK2TPMqjy44mnZG5F4fb8m -67BMkV66rVXdCfJs8GQimhykoM3zuKZKwJg1+1ZUJrx/r04llVTIT5Y9AmFQzrNr -4t7TR/VnKz215UI/U36plGWVs2Z3UuLoKQsHePnRYGjXOrFQFOuAj9eqthkoCQd3 -L3F2OhRSzJ5glm/h10gi/ej8ulq18SznNXGTjziTQMuZ31rr0YYApfBsz0w9AgMB -AAEwDQYJKoZIhvcNAQEFBQADggIBAOwLaBK2DqMHo/xgif+xlMIJk4rcjXnRk+oO -9GwzGrcFm+M5xodAV0/zLt2j+d+ir3vqjpp3NrJRyM2g4tOgXNj4vLy5hjYMxpaX -vvxdzV+PvUGlmucg1dTwKVlATXTcGCNgvG62+vyVmBJ3PVbIjw9mMi2uZZNgnJlL -uAxarbKEaNZ75BFTCmWeeOGTh3NaLppKVer7xBHC7Voy6eXUcrDD9CrwUUZ0M2tq -7jQwlIVldyFuJ1ccqBhVjtwXkaQer/eAdkcLXBGUMy4ZxibhxjnsV6INKqZiLDHO -S46F08O506IuY3/qdWuA7LOfMNekaHQwKuMdarNSiEGoAlYiEYaWE7HJ6SdUzzk9 -6BPHr8dRVSSGpGM3a3Vflq9uMldt8kBGnEP9Z+pqQurmIpcPk4lkNzUiHiKy4Uah -1yikEhroPtYL+pZqFf9AKHgligz3dqJfW4noyTsVrHwGC7iXg8keHVRpicVx7R8C -Ci9pvJaFfUhIldXjeRCS/9EbedtmnCti2Zo7UFbTkIk4Pg1oQlsO4aaFPj3Vkz3T -plzVIZQF0zOSPaSgvPyE60AQ0EwIgET9rkvo23EVaqQVN+aGTiGTihKtOwHY4NHy -JG/zdWxHUL61b2Zw6Xa/Zh063NJ6gsL/ZUUA5Qgg8OAKGUJYnXCgDWCVHpSeWu/e -fnYch7TL +ggIPADCCAgoCggIBAL55oFf3vW8olt3VlvhkAx+KRYKCsGCfUNBDLb0KO5f+cNJL +g/kfUqg2r94jpl+BkmexD8Bs5YTRKUC15x26H9CgEQqw7EmBgMN1cnacmGDhqsKM +ELyju8CwyKhi+UDlCbGUlhCdCb8fi6rRuZmzuK3hXF5Yz7uBJyIdvchCwdTpwlFS +Lgt7v+K1k5fJwitu2N+QXzVB7G5FNNVwE8W5MKTbbB+wqYb3J04pRPmBnj7jKUby +N1MC1GA7NqCfapiZOJVW+howcxZJ5QY1UpkmBh8L3yZYe5L7IR3IKlPJ1TD9Cwjc +DnFFVuZBpuckUA+94ieCoZ7pV2dZ+q/qq4RgWVDK05HYhKSOu86he2nfndaOBAgp +9l/mqo+5u/26Wenuvz8HW8asAz2FjvHp62KRYq9gZgJr77qRG9XIgM5+HsopTfOK +3jDAsETCDk4mL09/FpKvVWtBvpUIE/ZO2eKXbYmmS7tiXxpIPZmJPcs8aOirZy2R +3AOekYOdj6hoTvU4t2lfUFOJQuPdA/8rOkOMmgdzyW3ZNLrjqZNtZrghHqVt0ZUT +0YdWp1wEUTDhhkpnhnIHUocV6doYQGaykqyqiS+T8FAQK6aSBtcIHu/PNdG2sfz2 +Ma9QyfKVHFXrxH4GqWcahhtJlramopZ+/MT/QAz1YcBz2b70ePvP/Wss3nhxAgMB +AAEwDQYJKoZIhvcNAQEFBQADggIBADZN4B+9iC7MYhtHYeiRzubCt7cdX1q6tr8v +wROh2ZOUR20fqSWH6exsbafy47VNn3VYDwpf7imxjBKKcNlfDO7utFpLqew7xOLh +pAQR2owI5PSD4lXmwUc6tOSvW4H6nDE7RoPXpjyk9y+Epw9TJoTx70QtqUJhK4LQ +MhcNlzvWNO07RTtPZLi3J53rJYCy43NEwTX2XvIYNyxiWJ3C33QAXKPW7WcfPp48 +pIXjJqlEWEoO6hJwfXg8VDjOBYAu36Brv9om8+8JU57Bx4O9qC7HQ8Ha8tNa0jvC +7Vfy4i/8+moJHTXVQr9JGj2PBr+Jt1rTT/w643eozTScYIxxCn1lMFPj0sJYv8iK +dlzT+FtMeDCW+CHtrVAOLBGSlulF97Mgvw579X2sbDRyIXWmPcT2KoDotRVm4PHb +RBcFWpTbfqH84pUAYzOW984fNMGLlY2vZaL40jhkjtV7SlZDfVrhYgcAKgSra/i0 +5akHJiCHnzGdzlTQvV7zZ1wxCxj0MliGU0asn/Wana6Eq8HvefcsnAu5lNRbz6Vo +qb36RkQ9jNUq1lghaMYsbSoO3UmORnpxVnEjXKxHzUQeyjavaG5EQcOk7PZkkreu +UcSeC0EatfRdG4iwb20xky/RDNkdgLo9VkK1NDfx7l2JxGgjazjaWTslFp4QiEJF +PTPQ+C/1 -----END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/intermediate.csr b/UnitTests/TestData/smime/intermediate.csr index c311bbd4a8..e9608381fe 100644 --- a/UnitTests/TestData/smime/intermediate.csr +++ b/UnitTests/TestData/smime/intermediate.csr @@ -3,26 +3,26 @@ MIIE3DCCAsQCAQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNl dHRzMQ8wDQYDVQQHDAZCb3N0b24xHzAdBgNVBAoMFkV4YW1wbGUgQXV0aG9yaXR5 IEluYy4xFDASBgNVBAMMC0JydWNlIFdheW5lMScwJQYJKoZIhvcNAQkBFhhpbnRl cm1lZGlhdGVAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQC4uL5cFIQx245V+mHg5z8gE9wm6tU4zzwHQti+MWAzoY8VkqkDjNlGtoP6 -kFITmQArkclIwA8Di/F1yf8t/wC/kSqA0XYXbQ+0BWRqKjmmD7K5FmuNuDQQ/VC8 -Ih9xaRO+HTV/OjDhMa4qFqXNTEMp+QbrjSI4I4DiZS8NtKgumyYf7CPIB7mt8NXa -IYfjud0hVsD+iM2Ly2Mz8wR/sFBoyK/3LFrnTD97LJuz9mXtSi9rTw/Gem2cAg2N -BwAuQ9aGCdu5xrYDhff9w08cq9toL/tgPpd7tui3ABqc8nl/NvErQT8v2zK6lTVT -3CQ7Lm/FFZlvw6ftccuSaNXlUgj4fiZvWPh43zIUX4M9NXGkFqc/kE72IFkloINi -ldUv2sKBR6mv3bJgbNCkJ/RiZzue9z5Sl5YeY1FKm6io9ob0jClkypQyMSSyiv2Q -E6o5bwwxsfC9BYi9PIlMcumh7C4QPF2gCtkzzKo8uOJp2RuReH2/JuuwTJFeuq1V -3QnybPBkIpocpKDN87imSsCYNftWVCa8f69OJZVUyE+WPQJhUM6za+Le00f1Zys9 -teVCP1N+qZRllbNmd1Li6CkLB3j50WBo1zqxUBTrgI/XqrYZKAkHdy9xdjoUUsye -YJZv4ddIIv3o/LpatfEs5zVxk484k0DLmd9a69GGAKXwbM9MPQIDAQABoAAwDQYJ -KoZIhvcNAQELBQADggIBAK7CNLql27AahccnT9ktDtSpCw3A3soq+dJHdX1DdNIl -847kpvZOiZI1aq0A6Sr6ycO932dKF60hsmVjZMl0w7qJ4uo1HlpHYpkG04Ol+3Au -5vWdBC6rupFSNmRGP+xUBSdHxVxWB2rqFCcuWlB8Y5HAlJTW/WVpjxL1va+vqABm -UUAv55drO0B/U7C0p+hmxV3oD/X0mJpi/WXV2C5OpSKQFlfartDPl6o6O/zebtDO -8JPaR9JzBS6/XB4jaJheYY9e25SXR+bATGOoAVeKzq/cCARkmNlWUaY9z88QD+MG -3z2H+LjiUFF7wuLXwJ0UXu/3A8Y5y824jXZjYPiYnUDoDCB1Az1jHpTWRlzQdK9p -Fp8QC+6RsgJnNH4wg8JU+sjFuA8NBnhiBkY+RmdigsBgPW2NYB5WwY7oXUH1I9CB -yww/n7IJToPn0TPDgrgEekqggQKoh39nRXARRh7dPdu99wMYcdCorun+MJNmTY+S -ORD28XN7mwUwHQNeS8pOD74ARwePdVkxPG/rUCuANxnn+ioKHk1xIBor0vpC1+14 -P1BwcxU5USZDGw5fQBZwj+GFuE6uFYViILV9Oh5IrkM9xoQb6F3oeFGtB5PIpiXZ -D81WFpzovIqVNF6Np+LR34LckBOckkyHHrlLtae4QJy5+LyfAQda8WkAx5Nw+AGN +AoICAQC+eaBX971vKJbd1Zb4ZAMfikWCgrBgn1DQQy29CjuX/nDSS4P5H1KoNq/e +I6ZfgZJnsQ/AbOWE0SlAtecduh/QoBEKsOxJgYDDdXJ2nJhg4arCjBC8o7vAsMio +YvlA5QmxlJYQnQm/H4uq0bmZs7it4VxeWM+7gSciHb3IQsHU6cJRUi4Le7/itZOX +ycIrbtjfkF81QexuRTTVcBPFuTCk22wfsKmG9ydOKUT5gZ4+4ylG8jdTAtRgOzag +n2qYmTiVVvoaMHMWSeUGNVKZJgYfC98mWHuS+yEdyCpTydUw/QsI3A5xRVbmQabn +JFAPveIngqGe6VdnWfqv6quEYFlQytOR2ISkjrvOoXtp353WjgQIKfZf5qqPubv9 +ulnp7r8/B1vGrAM9hY7x6etikWKvYGYCa++6kRvVyIDOfh7KKU3zit4wwLBEwg5O +Ji9PfxaSr1VrQb6VCBP2Ttnil22Jpku7Yl8aSD2ZiT3LPGjoq2ctkdwDnpGDnY+o +aE71OLdpX1BTiULj3QP/KzpDjJoHc8lt2TS646mTbWa4IR6lbdGVE9GHVqdcBFEw +4YZKZ4ZyB1KHFenaGEBmspKsqokvk/BQECumkgbXCB7vzzXRtrH89jGvUMnylRxV +68R+BqlnGoYbSZa2pqKWfvzE/0AM9WHAc9m+9Hj7z/1rLN54cQIDAQABoAAwDQYJ +KoZIhvcNAQELBQADggIBABIy4X+qzattSjNgIOTgo1lWmvhljux0WfkML3mVEqeZ +Zgiw1UPs0pbbjgJ1sAfqRVghnXJP+OBloGBeQwrjYbAGFtjCJXLyoOSGpAqDHwmM +u83hFLD0GNuX6hagyxzEUdtTq5hJnjyohOjkkNKgFtvM8kxOuWuXlCsdkAg8frmc +VfbOxOrRLbEQL2d47r6LPlMNI3z7TN5obdUOddwrxLWCCc2j8U88at46hYZD1evO +I7NDPsCaPFxK0UM5Y+CnaWDx+exFdVsGMypypLsADo0jpFbI7l7/jCoDxs5dJ2AY +HtrktgwRg6YfNJT7t9xiWlrFOUKUMEx4jaZ6FWzNg0waGIemjijHo0MyqB81fKdQ +3IZvEbLY8Kp4m5y24jdenu55GhwEJNHyuHsb/YGCxEX6avhNBRPqVTqN3gpCiqbF +Yi9g8XW9aRDS1RJhlPvU03lW5OKoCoCZSoOsn34OUpgZnluApXbEiqCTzC4UbuBN +R8Kpp/DLR0x11llmljrb6VQcWQdjvAKRgPgTQ7zcN5fOUJbA1y7i4UlJeSIHQS2f +T4RHnGjxTXExY//GOeElE8VJXgwrvL776lh+jj0OInoidDbbE7NNdJzlrk935vHm +cFW9zC9bSVZG3uj8obZcPRa6Ksxprf7temEhTrAEXMsBiCHoO/7iZlYiiYcBdBIR -----END CERTIFICATE REQUEST----- diff --git a/UnitTests/TestData/smime/intermediate.key b/UnitTests/TestData/smime/intermediate.key index f2c636fdaf..245eb70f96 100644 --- a/UnitTests/TestData/smime/intermediate.key +++ b/UnitTests/TestData/smime/intermediate.key @@ -1,51 +1,51 @@ -----BEGIN RSA PRIVATE KEY----- -MIIJKAIBAAKCAgEAuLi+XBSEMduOVfph4Oc/IBPcJurVOM88B0LYvjFgM6GPFZKp -A4zZRraD+pBSE5kAK5HJSMAPA4vxdcn/Lf8Av5EqgNF2F20PtAVkaio5pg+yuRZr -jbg0EP1QvCIfcWkTvh01fzow4TGuKhalzUxDKfkG640iOCOA4mUvDbSoLpsmH+wj -yAe5rfDV2iGH47ndIVbA/ojNi8tjM/MEf7BQaMiv9yxa50w/eyybs/Zl7Uova08P -xnptnAINjQcALkPWhgnbuca2A4X3/cNPHKvbaC/7YD6Xe7botwAanPJ5fzbxK0E/ -L9syupU1U9wkOy5vxRWZb8On7XHLkmjV5VII+H4mb1j4eN8yFF+DPTVxpBanP5BO -9iBZJaCDYpXVL9rCgUepr92yYGzQpCf0Ymc7nvc+UpeWHmNRSpuoqPaG9IwpZMqU -MjEksor9kBOqOW8MMbHwvQWIvTyJTHLpoewuEDxdoArZM8yqPLjiadkbkXh9vybr -sEyRXrqtVd0J8mzwZCKaHKSgzfO4pkrAmDX7VlQmvH+vTiWVVMhPlj0CYVDOs2vi -3tNH9WcrPbXlQj9TfqmUZZWzZndS4ugpCwd4+dFgaNc6sVAU64CP16q2GSgJB3cv -cXY6FFLMnmCWb+HXSCL96Py6WrXxLOc1cZOPOJNAy5nfWuvRhgCl8GzPTD0CAwEA -AQKCAgBChMSIBBtWmOm4rGFyy9M/iedNXGNMAdRsCPZkBwPNk/AipJ2YWbAkdrUw -Fah4xi/5gJYrTH4bmNlqwULTHXD3ix7zJHqSFQQCn655TJtV4XFKlXhFoH+fXpkk -JmWMQXqKi5ooJpxTe8BsB5vNQhktlC+Zw0j/TkmrPSSkmtm1bslb1X1NGvsSWBeq -ZUi6CMRIrSTyg/EA1kzy+CA2mxdZpGs5Zw+VGzAA+x9WvvQVbxGEYwQbRRsTgum+ -TzcRcfxeaE5np9cDjcqv5xUmDf0El8K99cw3ELbcr3zl56s41GAkY2qNoTGzXufF -OxEQ/rfhENYgGSTvrHrSTk44NkJkHM4FYdeazYHqyEPKCVPB0Saq0TdtlbTVtDZX -yFuSK/Pqc3xVXlHIzt58JRCpnS48jBNdhqh3CwKTU73VsxwiAKmvSY8FcPVHCHVh -LRioSsQJsYWeylLjmA8ByQp5o36/i+kacCyDyWTTpwN13gAwiqgpwR4f68lH1O5t -ZDtu90LHYZJNlP7KdjaXhqVcjwH4WnY85a/gjY5/THWE43F3iQxwF8oZyPvV1bw2 -o1fpvmnRezfE7g6+j9mILjMUDwWHsxS+0cGBCOlCdAYn/Q1oprw52ou4FtrSMLyt -eQ0D1DqQnbTuq9RcLSU/Ng0rkCyAdZQpvtzF0wwbph2zqxeRQQKCAQEA4ernQrTZ -pKhWZW4ichuZhAqAzo9cH6pgXJeoPy3OXAjzzVmniwx90YPOc1thNoQvAk9HCtQX -GYOmLpgvm7qbDUlOvmk6uP4Ctj+HaG14cKKBvp7GiuQ+YR9eEgtnAWDARv1tjzCx -4/OaHzIjBtUep5mbdD4MlIaE2/w34OE78PcptSVfIYB/QIMgv5f5HvnWvnDWCo00 -YJXUDdw0sF8pSYTo0HzzQp9frRDTKQ8466UUhKcjS6sTZ02d9tVz6lQWSnAT77q0 -lzUpJqs1MYvBVWy20XBYs4A8Ws15GkMbn8d8w8zAwfJi+2H8hq6u53oB0MzJkI1/ -BQq0I6Q0NB/2FwKCAQEA0VGMxkk2V+e4qN9GtG8WJd9DGNnScMaZFUa3Zu6ZeRrZ -lwzE3cPVaLcbcBONRqxlx0ni1Aab/a4SkVNdky9lgYaHsZaVlQTt/WTktxsyz8Pj -yM46V2RNGbGBH02gTEBZY337BFj5bWSS2gB+sQ9Fvxf8X3U4sujLT3AB1uvusDIr -oLl6nNoyAirJFo+B4m7vON8gpOWiY3fQRfCtH783ZMsq4vexY6VM0KTIRuhKsKuj -iaoXAnx46exc+8qgowcjIUWHVuvpK6ieG1F/5nMApqWuS8hES85mKXktXq8Alsas -Y3iHgWMK+j17Z9rrUFsmxQGjwsiyP8qm+FPlbuMYywKCAQA8VDtvf9YC94UizvdZ -227yaM+e2X+zYQ8cis8+F+BciXN5qfBo3GwY8AbInWVnZoMbLcp95MdKY/KTzMYh -4wIW2TWy+WzaC9LzkiF5zIn2Ih9dpQ7F9k+GJhc74Fmgb5LJIlIIg+ttQRcuL3hV -EcJ+5TEzKIK5gvalvEO7xMn5/jbgDdvKmYLh2mJ7Z3z6PaOP9Zfi93Q+OqSHEv/q -/W6MGHcHfeaEKwUktTJ+a3c6zjmddvig801aL8r4KGYs9EmDlUxtn0Esg+C6V8v7 -sCNvyXlEkqjNPnhfkzE8xyDwWRhDPUFYSX8PPEpwOOOyIs2rUZSeCnsaAJK8VdQu -+z3/AoIBAQC3/n9ILULfsojXqKx2Hs/RKpfIWHBrQad+1FKS4Fl34uoxpL/IUERf -b9Vmh0lAPnqY25HP3p9wNnuL00QGBTusx5yvtjZ2b4bjnrSNYBMiHoc0FFOkTj6X -vzhJU+r8G/R3SF5GTA+04RtVFepHqa0ddPAa2OemHIvaoBJ94ZZGu1MuTNxC1Gnx -DbsFYdBCQlF2JGyFhnVgCgnB8PW9WlBPAWgJasE7XipPnQmPitFcywNOF31yage/ -WE3D5zGdHMD8limJdoXYIrgYO2O6Jo0D789uPfQKzrtu6V3ARQS3hJw0M9apHW6g -2TqI6B7A298QfYh9x/0npfNvhg+/kVBRAoIBAAdzqkfMLEUkKL6TjMFoXOTXVMC+ -fx+OM6wbAkHhLtnuH86bV/Zwxf4n8+mjKbrUxbge+uNKF0ganOArQPZlriywtEG5 -5ZSypFvEAtURZYPDwwh2A+LlOksLKgqAdi8aSqRPopy6ZKLooduN9d9iLv6+Gs+T -o6gFrzKt27r3O62pTPleoVG+zZBumd/3L/i/59v4/0fqL3qkdrJfkUbYCaxTVU9m -o+6ytRg8VeOnT41qX4rpSeA8kDssplLWGy0hmB0c+14nUEyniB0QY8ibPLTa896c -jhkv8Xl4QzI1xXBWkAkrShGLp/GdBpVbaUOBDPTRotpfqTrbIXUm02Zet4o= +MIIJKgIBAAKCAgEAvnmgV/e9byiW3dWW+GQDH4pFgoKwYJ9Q0EMtvQo7l/5w0kuD ++R9SqDav3iOmX4GSZ7EPwGzlhNEpQLXnHbof0KARCrDsSYGAw3VydpyYYOGqwowQ +vKO7wLDIqGL5QOUJsZSWEJ0Jvx+LqtG5mbO4reFcXljPu4EnIh29yELB1OnCUVIu +C3u/4rWTl8nCK27Y35BfNUHsbkU01XATxbkwpNtsH7CphvcnTilE+YGePuMpRvI3 +UwLUYDs2oJ9qmJk4lVb6GjBzFknlBjVSmSYGHwvfJlh7kvshHcgqU8nVMP0LCNwO +cUVW5kGm5yRQD73iJ4KhnulXZ1n6r+qrhGBZUMrTkdiEpI67zqF7ad+d1o4ECCn2 +X+aqj7m7/bpZ6e6/PwdbxqwDPYWO8enrYpFir2BmAmvvupEb1ciAzn4eyilN84re +MMCwRMIOTiYvT38Wkq9Va0G+lQgT9k7Z4pdtiaZLu2JfGkg9mYk9yzxo6KtnLZHc +A56Rg52PqGhO9Ti3aV9QU4lC490D/ys6Q4yaB3PJbdk0uuOpk21muCEepW3RlRPR +h1anXARRMOGGSmeGcgdShxXp2hhAZrKSrKqJL5PwUBArppIG1wge78810bax/PYx +r1DJ8pUcVevEfgapZxqGG0mWtqailn78xP9ADPVhwHPZvvR4+8/9ayzeeHECAwEA +AQKCAgEAhvjYzn0XF3XDsl5wJIN6UxdAOkMxiMZcFbgE6TgfEo2SlPI+CoJPqDNY +XCkW9AZ1IFUvvENuQLeWa+x6YW5KrSM/8Dt+tHe4LslC2xoMQFqpDkMCeSntGZYs +GmZICdxDCjsoO42MIorQBbOnuWrJKy3Ormxwh4X1nQ9GNGpZv+4FbGq3hhui1Zul +gqHNnclmlMVRMgQM7fbMgZJx8GJSPf/elnYxKxpoF9LWtZdL83Q1A7kPyxruM2LC +Sv+sIYYxumFvyK8cXmbui3+tkCiJneZjsmBw8K5TwS7eD5GuKJCnCRgmg82GzpMn +GhN5SC5d23GN5XWkIfB427+G2r8LiiFd/A4Z1X/Gm/KzQONgng2XrejiU9FsDAOL +61teL9mjF+/eNS5WixefSP6CqREeKcSoGxwmcK/iFA9OHu6bSGU5oQYuT6dpiu6c +2ZZASb2ZY/1BKfVwPehQJNDc6I7WytyiIeVBh5+DQF60XO7ciJ6RXB/inTZK3HQg +0jGxTq4Zp1acwqu0Kf0O2EJvSafaSBocVlZ1zTenP7PkaTb8vx7SIXpq+nv1INoP +RW7CI3tGdr0x7KxNFmQ+Rn8G6MHZAOwcnWZ9bQG1j0pKurh5uGWc+xr7VKBRCt7w +VhESRyFyKJoB/Dol65VG86/YrLA6bL/at3Lq7Dtm9AIx5o0pZyECggEBAPmwX/e6 +syB2HKvdXBTxx98J/J1ojUJeX+PEUYcCdYjoXFNaQsBTxzB9v1VCsxF6qeb7IrVR +xKCk+dNolfRFnTr+Xcj/W9PrJzQLGpEkeDYAvhdjYVtIJtnlSdM04vyDUnlObjM0 +xPJauog7wKzfdy/3JkYMzDmOyfPJTIXP+7PB5ppyJfEaMEaAzHuYz/13UOOC+T2k +xDbrFAwCP+41m2lq4OARftfZwi1NuHIlkH+Y9s24M8WT563SofFuHN6IqNMEAWnR +Q7eIvi2jlEY054OMo+ecJn4pJd/Vy4lpSwfOv1fVSz3baleFbRBk+5wk4p+iH7dN +AX72NZBr7bIxtcMCggEBAMNKGuxxXuC7pFNKPoeWfA+n//3jtBqeUKX8tMKGiSAw +fOd7Eily57kpLz3DD0OJrP6LdwpxQsVGdbnmh6v4LumgCGsKlz3c9eh2bve6RTz8 +ET0G8kU4oMKLkGLDPkAd5CkrWZRmXtr2wsTq9PpiBVUEA1H9iYw3DoRZWmpkgz8l +o1AzddPVJRgpYZnvnjVe3Zykj+8nKXKj0hg1QSS4rAVGutYOri8/v8UyTq7tnPJT +E5Huaecah43nSvciqqZJc855ruceybMCTZkGxhtkC/CdEz88JWbFyCp5toU8xObQ +BBUv9mPU2C0knAKcvrXBFf4JaS8FIzTuVlxJ9LsEUbsCggEBAOLswyt4iNfVwJUK +J2f5nbc9clL09Hz/HJL6l0XmnD+DPnWasNPu0Ddn8X5hkjEulD+Suqaj29pMVakn +gjFxG0bEayQDwMdHDmgkN072IDKkVh8XeSHm3zhlRMUpaaopB8mr2Ee9i8jfYGv0 +MlZq+f2j1ysO8oTVGwHvTxbGQXHLpfN0DrujG4DYCf/CkDVCPUeofzDhEFsBJ0UK +vmOWYNpcAmhiPi+afvmBi0JilYMB2Dx7TsIgfAzkQ74SXzZ4aUbuewJa5/pj0sPT +ySxNZKOQLF6Q8gLzDrLxsXv/L+u2oPwIo8tiILHOV6LwxCPS+gwu4jhLSjLDPUc2 +b97lgtUCggEBAKolR33XbK1qbsoudnpVbzOI0K1YlVNXubZUjPyqkJBeDoTzoihA +t4mIS2OJLiROsE16HzYW5fDQ6cMVCgGXku/zgUIZkRnSCOIHRblKLgbrKu27vpr2 +soGtbRfPOc5M/LutzDdSVbR6p8k/WD9J5ZFjlKz7s7pZQamn2/G0LvF2jmpS24a7 +Pr1lWGbw8StYwsY2Tj00JpV+C48R3vbqet2B+UiEs9fwt9lMcmdQGJy8KuHLEbPL +Vm0ZJiRZrMqCVoZ/WBZ/qYXwLMF1uGam7QwvHlTKx19aVIJFVvOQtZDPja8UAZyL +FemG6vIPtMzQNKQHeQABfuIgAVgZC0NhiP8CggEAKPri6sga5zbzsxHUpcVGF7cV +/sRp8Hqxaz/Lola3RYGuCItNdgl/V2kX9USsAUTB06jgYgSox61BEhnltsqIL0TP ++qDp5w1HThO0L22u8awByrWRgKvpHabn21R7LTSaeZqg0nmu6+/4f9sTLU/cahgm +LumCYLaYb43Lia7Gp/sq3DaMLUrf0vFg2bDRuNbLpRALY+HBswqY4fY24RFNncUE +DmE7f7UfxL6P0MrSMg75ydzlhtqB7oVSXGNtXhIyCQay1Zvpxgb9a8ipKhqHd0SP +4UVafh4konO05Q+1P75R1Qtuy4VmRNY+ItIsLrb9ihDW2FxHljcfJSYoc9T0+w== -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/smime.crt b/UnitTests/TestData/smime/smime.crt index 71c75c0596..a3a92937d6 100644 --- a/UnitTests/TestData/smime/smime.crt +++ b/UnitTests/TestData/smime/smime.crt @@ -2,32 +2,32 @@ MIIFgTCCA2kCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYD VQQIDA1NYXNzYWNodXNldHRzMQ8wDQYDVQQHDAZCb3N0b24xHzAdBgNVBAoMFkV4 YW1wbGUgQXV0aG9yaXR5IEluYy4xFDASBgNVBAMMC0JydWNlIFdheW5lMScwJQYJ -KoZIhvcNAQkBFhhpbnRlcm1lZGlhdGVAZXhhbXBsZS5jb20wHhcNMTgwNzMwMTMx -MzE5WhcNMTkwNzMwMTMxMzE5WjB2MQswCQYDVQQGEwJVUzEWMBQGA1UECAwNTWFz +KoZIhvcNAQkBFhhpbnRlcm1lZGlhdGVAZXhhbXBsZS5jb20wHhcNMTkwODIxMTE0 +NjM0WhcNMjkwODE4MTE0NjM0WjB2MQswCQYDVQQGEwJVUzEWMBQGA1UECAwNTWFz c2FjaHVzZXR0czEPMA0GA1UEBwwGQm9zdG9uMRowGAYDVQQDDBFNaW1lS2l0IFVu aXRUZXN0czEiMCAGCSqGSIb3DQEJARYTbWltZWtpdEBleGFtcGxlLmNvbTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANU+zbxOwi06JcyOUTYWYIPMPzmf -F6VPZ4yHnp5bx/lHlJuuCQOcPMaG80hnLbf8vjuPsOFhTCHz+KMI1fcBqKwFBcje -tqRU3Ww2Lq8XcvBqC4NknLDZtU90/ZuXxu2eQNJ4bcPsB3nylH+5Iht7fP95w2dv -dCcgtPgK94p4av+a6Zvpu7SzWEmvbafH/w/0Is//DWWGtqAgQVPYFzwn5BllLC25 -nW4LELu9+r4iv5Q6tKpr/PGzp1HUqLHIfta+QyXP+2AFYGrBwYlklHq8MsyJiPRB -i4+5LfZiETmCTOWzp30jX7aU+n0FrErtUbqMbJa/VOG7zM9lfmcMj509KKxV/lnH -cppRk9SJg8bIV3NELmITqDzlHEZhTrPhZhA6jUawKFE6c9EFeMdUDPSe6gS+xp9P -KYAqUaP8dW7lo8SxvmX6MmSLpU3SpUocf+01hdbRGJvN4aP7/1x3iFDo/9UBmMQi -cvYqfirrn+C2sG5Qpqt1svgC3AZX1w2IPpoFefLSEpB/rF3LHNGB5gj/ODsKN/oC -ar2gou6Xt8SBxiOvjtEEVshBJSqg5f8IqJL85ZZsPQc/coWne6dZqEP5d8IIfFXf -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 -----END TRUSTED CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smime.csr b/UnitTests/TestData/smime/smime.csr index 0bc10bb835..e716288a8a 100644 --- a/UnitTests/TestData/smime/smime.csr +++ b/UnitTests/TestData/smime/smime.csr @@ -2,27 +2,27 @@ MIIEuzCCAqMCAQAwdjELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0 dHMxDzANBgNVBAcMBkJvc3RvbjEaMBgGA1UEAwwRTWltZUtpdCBVbml0VGVzdHMx IjAgBgkqhkiG9w0BCQEWE21pbWVraXRAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3 -DQEBAQUAA4ICDwAwggIKAoICAQDVPs28TsItOiXMjlE2FmCDzD85nxelT2eMh56e -W8f5R5SbrgkDnDzGhvNIZy23/L47j7DhYUwh8/ijCNX3AaisBQXI3rakVN1sNi6v -F3LwaguDZJyw2bVPdP2bl8btnkDSeG3D7Ad58pR/uSIbe3z/ecNnb3QnILT4CveK -eGr/mumb6bu0s1hJr22nx/8P9CLP/w1lhragIEFT2Bc8J+QZZSwtuZ1uCxC7vfq+ -Ir+UOrSqa/zxs6dR1KixyH7WvkMlz/tgBWBqwcGJZJR6vDLMiYj0QYuPuS32YhE5 -gkzls6d9I1+2lPp9BaxK7VG6jGyWv1Thu8zPZX5nDI+dPSisVf5Zx3KaUZPUiYPG -yFdzRC5iE6g85RxGYU6z4WYQOo1GsChROnPRBXjHVAz0nuoEvsafTymAKlGj/HVu -5aPEsb5l+jJki6VN0qVKHH/tNYXW0RibzeGj+/9cd4hQ6P/VAZjEInL2Kn4q65/g -trBuUKardbL4AtwGV9cNiD6aBXny0hKQf6xdyxzRgeYI/zg7Cjf6Amq9oKLul7fE -gcYjr47RBFbIQSUqoOX/CKiS/OWWbD0HP3KFp3unWahD+XfCCHxV32gf0OQUMUaL -Q61RdLYzmdeqZ7ItTkewVc+996wBYaIL9M3FomikwD0eKgKt0t3ezcjyGkbVy7M/ -hY0CiwIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBAFvlTW26+fKokqHix2oe3RWO -s1h4LLx4hbDB8xtbJ2sow+Mc7Da/WIfmLWww/fX1kdVFW0Q8qdYQXNJSu2DXT/3O -QH3p9W+1nLVaG8njyxv0yhz/Yi+sAOWIUmcXQCGorjR5A+BFLPoOK8d/u0KpcrkA -9k/yPww96ZO2tRhI464FXLJSusxNqHWqtpEN6Xtxfq86KAKubcivtwfeMYc9yYLn -4DEOth0aFetuykxaBufjVankM+EEGfmX6/zmjUeFJHGDlmq+rbdFVtkRZINR7u7X -6Rtw/RezDSNTaK3UD2gh9XxRZ92YiO6zPAQVG1iYIPHh9fE579NceRpWN38tgBEl -MGzp4mGebimHf+gZyz8QIMV+fO6Wa8fldwcSNQXREcd3MBaKkIvLQGQi7zud8+xc -4IARlT9iAR+NlnvtLkkQASMKDNCUnV2AQ5eYiavNdRBraGmFjZTVm/3/BjK0JiJf -L2xm+8sPdF36hMjCezbalaEhK0P7aFUZYtEK9ZlahibvkyMuf8kJbv8iBm1G6Vo4 -Kzd5JXlg40yhSWFCRPA/D8Xf3DbSCYes/AEuXiYJWIGADmID3kGjEkNkxwcskzgj -8br5J3kWWlxuq0oSgIXvp7Jec2x7ChK65kOhpWBCFRYs+oK7Em7JsBRGnIg8ph3v -tfFFqqkww7IouZsjA1f2 +DQEBAQUAA4ICDwAwggIKAoICAQDJ0Bb4kc3T5+q3nJqAKsrLfXGSEIU3M+O5bEYz +FAigvhiMRKRSmX99UgXKosFj6Wupp98NRqPNraHTAm2A2W3CzfccnAYav6lUcNEQ +i1AvM64h+9iiyT8TIAxrYCrjGqiaWHwdtPceVKdkBpzRczVsemupKq7ZVyEDdc1v +CY/ved9Go887wDZ7tFLuLnZABNSMk9n9PVzpMveRdE/N6VvEzGIWE/kVWGIh3FT6 +rLLXMJj/d18K1gsUlqCK13s/Jpyp9uL/WPxgAjf8B+scNPr7qwnetkZf14lMDmF5 +BZPNNSO3jj3+R57nvXnVJ8AHWtbuPNHJDfgeNtezrLzsHFnYjsgagNYSgMndDo2S +wevk0ELQXlM3jA2oOyM8D/dQBY+D3WENzCexdfCghWJPkgOKzjMgNg6R1eeIIaSt +wPIpyhT3/9t5aWywkWfWONoyZFf5oSSVRp7VDqnesZD7qMTHH3HZhY5VCj3mqaMg +QhzKyfx5zE8zjQnJiiN2m08d9ImHp8FKT9ZJ0qH4HzT7cHKSS2EFeQafpAfl3Miq +oj4rWR5sxvFitAgWngGoadhzrxhbF6p+QrbxVK7Kgcgc1Cxvno9U4muT1H3d0Z+U +9WAKTNnR1l3XIKm9nidrg7lZTieYKn/lnV0rLuZTvO7sBQ/5yFBC4ESUgMLJvltZ +GJ5AIwIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBAARO96hl7y9irnr0t9aPY71o +VAnmW3qbj1Xy/XVWrWFEa+gWD2ENO/n8YqZX/+RJgD7LZdSWhGdRpmEOhXk2lMFl +pIV18ot2P1Jlw1haAaFIo3TniGZbU5VtU9CSBv4AbZjon9KMlAWRCmcUl3uT2/wI ++m3Lv1BcF3W7/a2O1+MlbYX6k2A79jKUejy44zfJ5LI/pYTwn9L27XNDzyi+X5SN +uxhLJ2tondYzt8iQhJhrJj8mHbatq2AtgMY8WVTIVpYYZN7gQkM400ihm9spY0fD +fTYaIHvhJRFxKK5MTSnbJJfmOFg4yABJzp5aHsKSbohRWcDKnYm5Ix3+nIEGuXMn +LQ3ebq9Wldc6RDbXzTb2SUPRyeDeT1CTq0CTSDhY4vGE9xewsWTdJxAeUMTKySl9 +QW0SnLa51pwREZNXHKMPCpwNlM4GkKM815+U5R15HbDafC2Yw/PUpd2g7IgiSkJe +AAC9MYtvh6ZSBoGLcnoMRfS2nlIRZgUMqMAQ25TaIJiwssJi96yQhbRK8Q+Ew5oY +RbrjTYyWVCT0POi3SNDM9B+Q62AdAwsJqyXb1y8IPuj1UDVHhjSNGSg3s+YwYhLr +3QzPvernO6CxSGVBIRQtJfdBn3yeoA4J9spsKDrXdBJA0kp+gTSDen/DWSCUAFqx +jStDOZyK/a56pZa3rpPO -----END CERTIFICATE REQUEST----- diff --git a/UnitTests/TestData/smime/smime.key b/UnitTests/TestData/smime/smime.key index 4e868e67fe..67e5c2f537 100644 --- a/UnitTests/TestData/smime/smime.key +++ b/UnitTests/TestData/smime/smime.key @@ -1,54 +1,54 @@ -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,E47B0C7BA83374CD +DEK-Info: DES-EDE3-CBC,06D92B20D955F748 -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 -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/smime.p12 b/UnitTests/TestData/smime/smime.p12 index 298a656dae6503f3404855ce9a1bd0842ee2ccec..4720672550dce09cd0bd9398f28083b0ef565980 100644 GIT binary patch delta 7044 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 Date: Wed, 21 Aug 2019 07:58:32 -0400 Subject: [PATCH 349/741] Fixed Multipart to properly ensure the epilogue ends w/ a new-line when EnsureNewLine is true Partial fix for issue #499 --- MimeKit/Multipart.cs | 16 +++---- UnitTests/MimeMessageTests.cs | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 8 deletions(-) diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index e3f0149792..300b402cc2 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -356,10 +356,10 @@ internal static string FoldPreambleOrEpilogue (FormatOptions options, string tex return builder.ToString (); } - static void WriteBytes (FormatOptions options, Stream stream, byte[] bytes, CancellationToken cancellationToken) + static void WriteBytes (FormatOptions options, Stream stream, byte[] bytes, bool ensureNewLine, CancellationToken cancellationToken) { var cancellable = stream as ICancellableStream; - var filter = options.CreateNewLineFilter (); + var filter = options.CreateNewLineFilter (ensureNewLine); int index, length; var output = filter.Flush (bytes, 0, bytes.Length, out index, out length); @@ -372,9 +372,9 @@ static void WriteBytes (FormatOptions options, Stream stream, byte[] bytes, Canc } } - static Task WriteBytesAsync (FormatOptions options, Stream stream, byte[] bytes, CancellationToken cancellationToken) + static Task WriteBytesAsync (FormatOptions options, Stream stream, byte[] bytes, bool ensureNewLine, CancellationToken cancellationToken) { - var filter = options.CreateNewLineFilter (); + var filter = options.CreateNewLineFilter (ensureNewLine); int index, length; var output = filter.Flush (bytes, 0, bytes.Length, out index, out length); @@ -444,7 +444,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = var cancellable = stream as ICancellableStream; if (RawPreamble != null && RawPreamble.Length > 0) - WriteBytes (options, stream, RawPreamble, cancellationToken); + WriteBytes (options, stream, RawPreamble, true, cancellationToken); var boundary = Encoding.ASCII.GetBytes ("--" + Boundary + "--"); @@ -513,7 +513,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } if (RawEpilogue != null && RawEpilogue.Length > 0) - WriteBytes (options, stream, RawEpilogue, cancellationToken); + WriteBytes (options, stream, RawEpilogue, EnsureNewLine, cancellationToken); } /// @@ -555,7 +555,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } if (RawPreamble != null && RawPreamble.Length > 0) - await WriteBytesAsync (options, stream, RawPreamble, cancellationToken).ConfigureAwait (false); + await WriteBytesAsync (options, stream, RawPreamble, true, cancellationToken).ConfigureAwait (false); var boundary = Encoding.ASCII.GetBytes ("--" + Boundary + "--"); @@ -589,7 +589,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = await stream.WriteAsync (options.NewLineBytes, 0, options.NewLineBytes.Length, cancellationToken).ConfigureAwait (false); if (RawEpilogue != null && RawEpilogue.Length > 0) - await WriteBytesAsync (options, stream, RawEpilogue, cancellationToken).ConfigureAwait (false); + await WriteBytesAsync (options, stream, RawEpilogue, EnsureNewLine, cancellationToken).ConfigureAwait (false); } #region ICollection implementation diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 18872ff7a4..38c4350cfb 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -398,6 +398,85 @@ ENCODING mime } } + [Test] + public async Task TestReserializationEpilogue () + { + string rawMessageText = @"From: Example Test +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary=""simple boundary"" + +This is the preamble. + +--simple boundary +Content-TypeS: text/plain + +This is a test. + +--simple boundary +Content-Type: text/plain +Content-Disposition: attachment +Content-Transfer-Encoding: 7bit + +Another test. + +--simple boundary-- + + +This is the epilogue.".Replace ("\r\n", "\n"); + + using (var source = new MemoryStream (Encoding.UTF8.GetBytes (rawMessageText))) { + var parser = new MimeParser (source, MimeFormat.Default); + var message = parser.ParseMessage (); + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized message is not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + await message.WriteToAsync (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized (async) message is not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + options.EnsureNewLine = true; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText + "\n", result, "Reserialized message is not identical to the original (EnsureNewLine)."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + options.EnsureNewLine = true; + + await message.WriteToAsync (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText + "\n", result, "Reserialized (async) message is not identical to the original (EnsureNewLine)."); + } + } + } + [Test] public void TestMailMessageToMimeMessage () { From bdb4d0d66c0141c7190f98a2e6ed6155db80cb53 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 21 Aug 2019 08:06:24 -0400 Subject: [PATCH 350/741] Modified Multipart.WriteTo[Async] to not ensure a Content-Type boundary parameter Partial fix for issue #499 --- MimeKit/Multipart.cs | 12 ++----- UnitTests/MimeMessageTests.cs | 61 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 300b402cc2..e946ecc6d3 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -132,7 +132,7 @@ public Multipart (string subtype, params object[] args) : this (subtype) /// public Multipart (string subtype) : base ("multipart", subtype) { - ContentType.Parameters["boundary"] = GenerateBoundary (); + ContentType.Boundary = GenerateBoundary (); children = new List (); WriteEndBoundary = true; } @@ -427,9 +427,6 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// public override void WriteTo (FormatOptions options, Stream stream, bool contentOnly, CancellationToken cancellationToken = default (CancellationToken)) { - if (Boundary == null) - Boundary = GenerateBoundary (); - base.WriteTo (options, stream, contentOnly, cancellationToken); if (ContentType.IsMimeType ("multipart", "signed")) { @@ -444,7 +441,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = var cancellable = stream as ICancellableStream; if (RawPreamble != null && RawPreamble.Length > 0) - WriteBytes (options, stream, RawPreamble, true, cancellationToken); + WriteBytes (options, stream, RawPreamble, children.Count > 0 || EnsureNewLine, cancellationToken); var boundary = Encoding.ASCII.GetBytes ("--" + Boundary + "--"); @@ -540,9 +537,6 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = /// public override async Task WriteToAsync (FormatOptions options, Stream stream, bool contentOnly, CancellationToken cancellationToken = default (CancellationToken)) { - if (Boundary == null) - Boundary = GenerateBoundary (); - await base.WriteToAsync (options, stream, contentOnly, cancellationToken).ConfigureAwait (false); if (ContentType.IsMimeType ("multipart", "signed")) { @@ -555,7 +549,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } if (RawPreamble != null && RawPreamble.Length > 0) - await WriteBytesAsync (options, stream, RawPreamble, true, cancellationToken).ConfigureAwait (false); + await WriteBytesAsync (options, stream, RawPreamble, children.Count > 0 || EnsureNewLine, cancellationToken).ConfigureAwait (false); var boundary = Encoding.ASCII.GetBytes ("--" + Boundary + "--"); diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 38c4350cfb..aabfbb4aea 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -477,6 +477,67 @@ Another test. } } + [Test] + public async Task TestReserializationMultipartPreambleNoBoundary () + { + string rawMessageText = @"From: Example Test +Content-Type: multipart/mixed + +This is the preamble. +.".Replace ("\r\n", "\n"); + + using (var source = new MemoryStream (Encoding.UTF8.GetBytes (rawMessageText))) { + var parser = new MimeParser (source, MimeFormat.Default); + var message = parser.ParseMessage (); + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized message is not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + await message.WriteToAsync (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized (async) message is not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + options.EnsureNewLine = true; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText + "\n", result, "Reserialized message is not identical to the original (EnsureNewLine)."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + options.EnsureNewLine = true; + + await message.WriteToAsync (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText + "\n", result, "Reserialized (async) message is not identical to the original (EnsureNewLine)."); + } + } + } + [Test] public void TestMailMessageToMimeMessage () { From 0fbe02e4518d61ccecf4c34b3c9c09f61e018b5d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 21 Aug 2019 19:05:43 -0400 Subject: [PATCH 351/741] Use the rawValue field directly instead of the property getter --- MimeKit/Header.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 8f7743d12d..806ae6d7fd 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -404,7 +404,7 @@ public byte[] RawValue { public string Value { get { if (textValue == null) - textValue = Unfold (Rfc2047.DecodeText (Options, RawValue)); + textValue = Unfold (Rfc2047.DecodeText (Options, rawValue)); return textValue; } @@ -434,7 +434,7 @@ public string GetValue (Encoding encoding) var options = Options.Clone (); options.CharsetEncoding = encoding; - return Unfold (Rfc2047.DecodeText (options, RawValue)); + return Unfold (Rfc2047.DecodeText (options, rawValue)); } /// @@ -1027,7 +1027,7 @@ internal byte[] GetRawValue (FormatOptions format) { if (format.International) { if (textValue == null) - textValue = Unfold (Rfc2047.DecodeText (Options, RawValue)); + textValue = Unfold (Rfc2047.DecodeText (Options, rawValue)); // Note: if we're reformatting to be International, then charset doesn't matter. return FormatRawValue (format, CharsetUtils.UTF8); From 7e4c807db79ed3ffe3c3b6f0fe2d605a97108fb9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 21 Aug 2019 19:57:50 -0400 Subject: [PATCH 352/741] Fixed MimeParser/MimeMessage/HeaderList to deal with invalid headers better Partial fix for issue #499 --- MimeKit/Cryptography/DkimVerifierBase.cs | 2 +- MimeKit/Header.cs | 47 +++++++++++----- MimeKit/HeaderList.cs | 22 +++++--- MimeKit/MimeMessage.cs | 22 +++++--- MimeKit/MimeParser.cs | 9 +--- UnitTests/MimeMessageTests.cs | 69 ++++++++++++++++++++++++ 6 files changed, 132 insertions(+), 39 deletions(-) diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index cc463c3d6d..53651ed5ac 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -493,7 +493,7 @@ internal static Header GetSignedSignatureHeader (Header header) Array.Resize (ref rawValue, length); - return new Header (header.Options, header.RawField, rawValue); + return new Header (header.Options, header.RawField, rawValue, false); } } } diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 806ae6d7fd..488ccdb360 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -291,12 +291,12 @@ internal Header (ParserOptions options, HeaderId id, string name, byte[] field, Id = id; } - internal Header (ParserOptions options, byte[] field, byte[] value) + internal Header (ParserOptions options, byte[] field, byte[] value, bool invalid) { var chars = new char[field.Length]; int count = 0; - while (count < field.Length && !field[count].IsBlank ()) { + while (count < field.Length && (invalid || !field[count].IsBlank ())) { chars[count] = (char) field[count]; count++; } @@ -307,6 +307,7 @@ internal Header (ParserOptions options, byte[] field, byte[] value) Field = new string (chars, 0, count); Id = Field.ToHeaderId (); + IsInvalid = invalid; } internal Header (ParserOptions options, HeaderId id, string field, byte[] value) @@ -327,7 +328,9 @@ internal Header (ParserOptions options, HeaderId id, string field, byte[] value) /// A copy of the header with its current state. public Header Clone () { - var header = new Header (Options, Id, Field, RawField, RawValue); + var header = new Header (Options, Id, Field, rawField, rawValue) { + IsInvalid = IsInvalid + }; // if the textValue has already been calculated, set it on the cloned header as well. header.textValue = textValue; @@ -369,6 +372,10 @@ public HeaderId Id { get; private set; } + internal bool IsInvalid { + get; private set; + } + /// /// Gets the raw field name of the header. /// @@ -1177,7 +1184,7 @@ void OnChanged () /// A string representing the . public override string ToString () { - return Field + ": " + Value; + return IsInvalid ? Field : Field + ": " + Value; } /// @@ -1250,6 +1257,7 @@ internal static unsafe bool TryParse (ParserOptions options, byte* input, int le byte* inend = input + length; byte* start = input; byte* inptr = input; + var invalid = false; // find the end of the field name if (strict) { @@ -1264,8 +1272,13 @@ internal static unsafe bool TryParse (ParserOptions options, byte* input, int le inptr++; if (inptr == inend || *inptr != ':') { - header = null; - return false; + if (strict) { + header = null; + return false; + } + + invalid = true; + inptr = inend; } var field = new byte[(int) (inptr - start)]; @@ -1276,19 +1289,25 @@ internal static unsafe bool TryParse (ParserOptions options, byte* input, int le *outptr++ = *start++; } - inptr++; + byte[] value; - int count = (int) (inend - inptr); - var value = new byte[count]; + if (inptr < inend) { + inptr++; - fixed (byte *outbuf = value) { - byte* outptr = outbuf; + int count = (int) (inend - inptr); + value = new byte[count]; + + fixed (byte* outbuf = value) { + byte* outptr = outbuf; - while (inptr < inend) - *outptr++ = *inptr++; + while (inptr < inend) + *outptr++ = *inptr++; + } + } else { + value = new byte[0]; } - header = new Header (options, field, value); + header = new Header (options, field, value, invalid); return true; } diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index c02bc82eba..72ac40f891 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -699,11 +699,14 @@ public string this [string field] { filtered.Add (options.CreateNewLineFilter ()); foreach (var header in headers) { - var rawValue = header.GetRawValue (options); - filtered.Write (header.RawField, 0, header.RawField.Length, cancellationToken); - filtered.Write (Header.Colon, 0, Header.Colon.Length, cancellationToken); - filtered.Write (rawValue, 0, rawValue.Length, cancellationToken); + + if (!header.IsInvalid) { + var rawValue = header.GetRawValue (options); + + filtered.Write (Header.Colon, 0, Header.Colon.Length, cancellationToken); + filtered.Write (rawValue, 0, rawValue.Length, cancellationToken); + } } filtered.Flush (cancellationToken); @@ -752,11 +755,14 @@ public string this [string field] { filtered.Add (options.CreateNewLineFilter ()); foreach (var header in headers) { - var rawValue = header.GetRawValue (options); - await filtered.WriteAsync (header.RawField, 0, header.RawField.Length, cancellationToken).ConfigureAwait (false); - await filtered.WriteAsync (Header.Colon, 0, Header.Colon.Length, cancellationToken).ConfigureAwait (false); - await filtered.WriteAsync (rawValue, 0, rawValue.Length, cancellationToken).ConfigureAwait (false); + + if (!header.IsInvalid) { + var rawValue = header.GetRawValue (options); + + await filtered.WriteAsync (Header.Colon, 0, Header.Colon.Length, cancellationToken).ConfigureAwait (false); + await filtered.WriteAsync (rawValue, 0, rawValue.Length, cancellationToken).ConfigureAwait (false); + } } await filtered.FlushAsync (cancellationToken).ConfigureAwait (false); diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index b55eb3bfc8..ead8e23f28 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1094,11 +1094,14 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (options.HiddenHeaders.Contains (header.Id)) continue; - var rawValue = header.GetRawValue (options); - filtered.Write (header.RawField, 0, header.RawField.Length, cancellationToken); - filtered.Write (Header.Colon, 0, Header.Colon.Length, cancellationToken); - filtered.Write (rawValue, 0, rawValue.Length, cancellationToken); + + if (!header.IsInvalid) { + var rawValue = header.GetRawValue (options); + + filtered.Write (Header.Colon, 0, Header.Colon.Length, cancellationToken); + filtered.Write (rawValue, 0, rawValue.Length, cancellationToken); + } } filtered.Flush (cancellationToken); @@ -1167,11 +1170,14 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (options.HiddenHeaders.Contains (header.Id)) continue; - var rawValue = header.GetRawValue (options); - await filtered.WriteAsync (header.RawField, 0, header.RawField.Length, cancellationToken).ConfigureAwait (false); - await filtered.WriteAsync (Header.Colon, 0, Header.Colon.Length, cancellationToken).ConfigureAwait (false); - await filtered.WriteAsync (rawValue, 0, rawValue.Length, cancellationToken).ConfigureAwait (false); + + if (!header.IsInvalid) { + var rawValue = header.GetRawValue (options); + + await filtered.WriteAsync (Header.Colon, 0, Header.Colon.Length, cancellationToken).ConfigureAwait (false); + await filtered.WriteAsync (rawValue, 0, rawValue.Length, cancellationToken).ConfigureAwait (false); + } } await filtered.FlushAsync (cancellationToken).ConfigureAwait (false); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index ed9d99aef3..7fce8f4a50 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -681,14 +681,7 @@ unsafe void ParseAndAppendHeader () fixed (byte* buf = headerBuffer) { Header header; - if (!Header.TryParse (options, buf, headerIndex, false, out header)) { -#if DEBUG - Debug.WriteLine (string.Format ("Invalid header at offset {0}: {1}", headerOffset, ConvertToCString (headerBuffer, 0, headerIndex))); -#endif - headerIndex = 0; - return; - } - + Header.TryParse (options, buf, headerIndex, false, out header); header.Offset = headerOffset; headers.Add (header); headerIndex = 0; diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index aabfbb4aea..da5864cf01 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -538,6 +538,75 @@ This is the preamble. } } + [Test] + public async Task TestReserializationInvalidHeaders () + { + string rawMessageText = @"From: Example Test +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary=""simple boundary"" +Example: test +Test +Test Test +Test: +Test: +Test: Test +Test Example: + +This is the preamble. + +--simple boundary +Content-TypeS: text/plain + +This is a test. + +--simple boundary +Content-Type: text/plain; +Content-Disposition: attachment; +Content-Transfer-Encoding: test; +Content-Transfer-Encoding: binary; +Test Test Test: Test Test +Te$t($)*$= Test Test: Abc def +test test = test +test test :: test +filename=""test.txt"" + +Another test. + +--simple boundary-- + + +This is the epilogue. +".Replace ("\r\n", "\n"); + + using (var source = new MemoryStream (Encoding.UTF8.GetBytes (rawMessageText))) { + var parser = new MimeParser (source, MimeFormat.Default); + var message = parser.ParseMessage (); + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized message is not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + await message.WriteToAsync (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized (async) message is not identical to the original."); + } + } + } + [Test] public void TestMailMessageToMimeMessage () { From 5c0578bf8d166f8604658cded45ad0d08ffb58df Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 22 Aug 2019 08:35:47 -0400 Subject: [PATCH 353/741] Include the certificate chain (exluding the root certificate) in S/MIME signatures Fixes issue #500 --- .../BouncyCastleSecureMimeContext.cs | 35 ++++++++++++++++++- .../Cryptography/DefaultSecureMimeContext.cs | 2 +- .../TemporarySecureMimeContext.cs | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 64a28e8b41..9ce25b6363 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -417,6 +417,38 @@ X509Certificate GetCertificate (IX509Store store, SignerID signer) return GetCertificate (signer); } + /// + /// Build a certificate chain. + /// + /// + /// Builds a certificate chain for the provided certificate. + /// This method is ideal for use with custom + /// implementations when it is desirable to include the certificate chain + /// in the signature. + /// + /// The certificate to build the chain for. + /// The certificate chain, including the specified certificate. + protected IList BuildCertificateChain (X509Certificate certificate) + { + var selector = new X509CertStoreSelector (); + selector.Certificate = certificate; + + var parameters = new PkixBuilderParameters (GetTrustedAnchors (), selector); + parameters.ValidityModel = PkixParameters.PkixValidityModel; + parameters.AddStore (GetIntermediateCertificates ()); + parameters.IsRevocationEnabled = false; + + var builder = new PkixCertPathBuilder (); + var result = builder.Build (parameters); + + var chain = new X509Certificate[result.CertPath.Certificates.Count]; + + for (int i = 0; i < chain.Length; i++) + chain[i] = (X509Certificate) result.CertPath.Certificates[i]; + + return chain; + } + PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store crls, X509Certificate certificate, DateTime signingTime) { var intermediate = new X509CertificateStore (); @@ -440,7 +472,8 @@ PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store if (signingTime != default (DateTime)) parameters.Date = new DateTimeObject (signingTime); - var result = new PkixCertPathBuilder ().Build (parameters); + var builder = new PkixCertPathBuilder (); + var result = builder.Build (parameters); return result.CertPath; } diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index b0443bb9bc..3677288690 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -397,7 +397,7 @@ protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorit if (record.KeyUsage != X509KeyUsageFlags.None && (record.KeyUsage & SecureMimeContext.DigitalSignatureKeyUsageFlags) == 0) continue; - var signer = new CmsSigner (record.Certificate, record.PrivateKey); + var signer = new CmsSigner (BuildCertificateChain (record.Certificate), record.PrivateKey); signer.DigestAlgorithm = digestAlgo; return signer; diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 98c8fae6e4..57aa521079 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -351,7 +351,7 @@ protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorit if ((certificate = GetCmsSignerCertificate (mailbox, out key)) == null) throw new CertificateNotFoundException (mailbox, "A valid signing certificate could not be found."); - return new CmsSigner (certificate, key) { + return new CmsSigner (BuildCertificateChain (certificate), key) { DigestAlgorithm = digestAlgo }; } From f9511d940a176c4dfb91742eca4df4b2b485ec26 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 22 Aug 2019 09:47:30 -0400 Subject: [PATCH 354/741] Add another check for cancellation in Multipart.WriteTo() --- MimeKit/Multipart.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index e946ecc6d3..d3324c8bd2 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -494,6 +494,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = (multi != null && !multi.WriteEndBoundary)) continue; + cancellationToken.ThrowIfCancellationRequested (); stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); } From d5f599688977e20dca7563746131c879aed86c37 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 24 Aug 2019 10:28:20 -0400 Subject: [PATCH 355/741] Bumped version to 2.3.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +++--- ReleaseNotes.md | 21 +++++++++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 15 +++++++-------- nuget/MimeKitLite.nuspec | 9 +++++++-- 8 files changed, 42 insertions(+), 17 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 99325126e9..663c54883a 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.2.0.0 + 2.3.0.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index d2a0cb0383..716955113b 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.2.0.0 + 2.3.0.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 40ff6caf46..0b8acbcc44 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.2.0.0")] -[assembly: AssemblyFileVersion ("2.2.0.0")] -[assembly: AssemblyVersion ("2.2.0.0")] +[assembly: AssemblyInformationalVersion ("2.3.0.0")] +[assembly: AssemblyFileVersion ("2.3.0.0")] +[assembly: AssemblyVersion ("2.3.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 618e761dbf..23cbac98dd 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,26 @@ # Release Notes +### MimeKit 2.3.0 (2019-08-24) + +* Fixed MultipartRelated to fall back to the multipart/related type parameter when + locating the Root. (issue [#489](https://github.com/jstedfast/MimeKit/issues/489)) +* Improved Authentication-Results parser to handle non-standard syntax. + (issue [#490](https://github.com/jstedfast/MimeKit/issues/490)) +* When FormatOptions.AllowMixedHeaderCharsets is disabled, always use the user-specified + charset. Previously this could/would still use us-ascii and/or iso-8859-1 if the entire + header could fit within one of those charsets. + (issue [#493](https://github.com/jstedfast/MimeKit/issues/493)) +* Fixed the line length calculations in the BestEncodingFilter. + (issue [#497](https://github.com/jstedfast/MimeKit/issues/497)) +* Fixed Multipart to properly ensure the epilogue ends w/ a new-line when + FormatOptions.EnsureNewLine is true. + (issue [#499](https://github.com/jstedfast/MimeKit/issues/499)) +* Modified Multipart.WriteTo[Async] to not ensure that a Content-Type boundary parameter + has been set. This code-path was only hit if the multipart was parsed by the parser and + did not have a boundary parameter in the first place. In the interest of preserving + byte-for-byte compatibility with the original input, this sanity check has been removed. + (issue [#499](https://github.com/jstedfast/MimeKit/issues/499)) + ### MimeKit 2.2.0 (2019-06-11) * Added support for [ARC](https://arc-spec.org). diff --git a/appveyor.yml b/appveyor.yml index 557ec064e5..6056285851 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.2.0.{build} +version: 2.3.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bb8ff88f93..1cfb1952dd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.2.0$(Rev:.r) +name: 2.3.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 774ab80e23..fefa9c2f39 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.2.0 + 2.3.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,13 +26,12 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Added support for [ARC](https://arc-spec.org). -* Added AuthenticationResults class for parsing and constructing Authentication-Results and ARC-Authentication-Results headers. -* Added support for the Ed25519-SHA256 DKIM signature algorithm. -* Obsoleted MimeMessage DKIM API's in favor of the newer DKIM API's: - - MimeMessage.Sign (DkimSigner, ...) has been replaced by DkimSigner.Sign (MimeMessage, ...). - - MimeMessage.Verify (Header, ...) has been replaced by DkimVerifier.Verify (MimeMessage, Header, ...). -* Added DkimPublicKeyLocatorBase to help simplify implementing IDkimPublicKeyLocator. +* Fixed MultipartRelated to fall back to the multipart/related type parameter when locating the Root. (issue #489) +* Improved Authentication-Results parser to handle non-standard syntax. (issue #490) +* When FormatOptions.AllowMixedHeaderCharsets is disabled, always use the user-specified charset. Previously this could/would still use us-ascii and/or iso-8859-1 if the entire header could fit within one of those charsets. (issue #493) +* Fixed the line length calculations in the BestEncodingFilter. (issue #497) +* Fixed Multipart to properly ensure the epilogue ends w/ a new-line when FormatOptions.EnsureNewLine is true. (issue #499) +* Modified Multipart.WriteTo[Async] to not ensure that a Content-Type boundary parameter has been set. This code-path was only hit if the multipart was parsed by the parser and did not have a boundary parameter in the first place. In the interest of preserving byte-for-byte compatibility with the original input, this sanity check has been removed. (issue #499) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 3338b0e3f3..4798a8e513 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.2.0 + 2.3.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,7 +26,12 @@ An Open Source library for creating and parsing MIME messages. -* Added AuthenticationResults class for parsing and constructing Authentication-Results and ARC-Authentication-Results headers. +* Fixed MultipartRelated to fall back to the multipart/related type parameter when locating the Root. (issue #489) +* Improved Authentication-Results parser to handle non-standard syntax. (issue #490) +* When FormatOptions.AllowMixedHeaderCharsets is disabled, always use the user-specified charset. Previously this could/would still use us-ascii and/or iso-8859-1 if the entire header could fit within one of those charsets. (issue #493) +* Fixed the line length calculations in the BestEncodingFilter. (issue #497) +* Fixed Multipart to properly ensure the epilogue ends w/ a new-line when FormatOptions.EnsureNewLine is true. (issue #499) +* Modified Multipart.WriteTo[Async] to not ensure that a Content-Type boundary parameter has been set. This code-path was only hit if the multipart was parsed by the parser and did not have a boundary parameter in the first place. In the interest of preserving byte-for-byte compatibility with the original input, this sanity check has been removed. (issue #499) Xamarin Inc. en-US From 3d5422e927ddac1ea05a4679349b2430b23901c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 24 Aug 2019 16:43:11 -0400 Subject: [PATCH 356/741] Updates samples --- MimeKit/MimeKit.iOS.csproj | 6 ++++-- samples/DkimVerifier/DkimVerifier.sln | 4 ++-- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 4 ++-- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 4 ++-- samples/MessageReader/MessageReader/packages.config | 2 +- 10 files changed, 20 insertions(+), 18 deletions(-) diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 987abe2127..b625eb6344 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -1,4 +1,4 @@ - + Debug @@ -55,6 +55,8 @@ {0249241C-205E-4AC0-828B-90F822359B9E} BouncyCastle.iOS + false + false @@ -278,4 +280,4 @@ - + \ No newline at end of file diff --git a/samples/DkimVerifier/DkimVerifier.sln b/samples/DkimVerifier/DkimVerifier.sln index 34d8899694..d056d5b255 100644 --- a/samples/DkimVerifier/DkimVerifier.sln +++ b/samples/DkimVerifier/DkimVerifier.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.572 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29215.179 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DkimVerifier", "DkimVerifier\DkimVerifier.csproj", "{0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}" EndProject diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 6a9030bd13..9ed01e3861 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.2.0\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.3.0\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 417639cf28..a89b504df2 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index d17d5baaed..6f1ac658c0 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.2.0\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.3.0\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.2.0\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.3.0\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index de34aa3759..cea7bb1265 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index c902f5b9a2..93719722bf 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.2.0\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.3.0\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.2.0\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.3.0\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 91ae7b1b65..12aa77adda 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index da14e12bec..add1ac6d83 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.2.0\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.3.0\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 5fa29f06a9..8961fe80e1 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 9bbdb3abef783880edcc3ac40f902032c4212db7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 25 Aug 2019 11:12:32 -0400 Subject: [PATCH 357/741] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..72ffe3f6df --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://paypal.me/pools/c/857bnxBTXg'] From a7b4782a4cb8f15638ad25a07c586b7261e533b0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 29 Aug 2019 08:47:57 -0400 Subject: [PATCH 358/741] Bump CmsSigner's default DigestAlgorithm to Sha256 instead of Sha1. --- MimeKit/Cryptography/CmsSigner.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 1137ae771e..1cd3515835 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -54,7 +54,7 @@ public class CmsSigner /// /// /// The initial value of the will be set to - /// and both the + /// and both the /// and properties /// will be initialized to empty tables. /// @@ -62,7 +62,7 @@ public class CmsSigner { UnsignedAttributes = new AttributeTable (new Dictionary ()); SignedAttributes = new AttributeTable (new Dictionary ()); - DigestAlgorithm = DigestAlgorithm.Sha1; + DigestAlgorithm = DigestAlgorithm.Sha256; } static bool CanSign (X509Certificate certificate) @@ -86,7 +86,7 @@ static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) /// /// /// The initial value of the will be set to - /// and both the + /// and both the /// and properties /// will be initialized to empty tables. /// @@ -131,7 +131,7 @@ public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key /// /// /// The initial value of the will - /// be set to and both the + /// be set to and both the /// and properties will be /// initialized to empty tables. /// @@ -209,7 +209,7 @@ void LoadPkcs12 (Stream stream, string password) /// Creates a new , loading the X.509 certificate and private key /// from the specified stream. /// The initial value of the will - /// be set to and both the + /// be set to and both the /// and properties will be /// initialized to empty tables. /// @@ -247,7 +247,7 @@ public CmsSigner (Stream stream, string password) : this () /// Creates a new , loading the X.509 certificate and private key /// from the specified file. /// The initial value of the will - /// be set to and both the + /// be set to and both the /// and properties will be /// initialized to empty tables. /// @@ -298,7 +298,7 @@ public CmsSigner (string fileName, string password) : this () /// /// /// The initial value of the will - /// be set to and both the + /// be set to and both the /// and properties will be /// initialized to empty tables. /// From f7d264c7f864db91a2024d5eddc26384c3a377d9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 29 Aug 2019 09:00:51 -0400 Subject: [PATCH 359/741] Improved HtmlPreviewVisitor docs --- FAQ.md | 43 ++++++++++++++++--- .../MessageReader/HtmlPreviewVisitor.cs | 4 +- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/FAQ.md b/FAQ.md index 4f8744808f..5aff3a1d48 100644 --- a/FAQ.md +++ b/FAQ.md @@ -302,11 +302,17 @@ class HtmlPreviewVisitor : MimeVisitor return false; } - // Save the image to our temp directory and return a "file://" url suitable for - // the browser control to load. - // Note: if you'd rather embed the image data into the HTML, you can construct a - // "data:" url instead. - string SaveImage (MimePart image, string url) + /// + /// Get a file:// URI for the image attachment. + /// + /// + /// Saves the image attachment to a temp file and returns a file:// URI for the + /// temp file. + /// + /// The file:// URI. + /// The image attachment. + /// The original HTML image URL. + string GetFileUri (MimePart image, string url) { string fileName = url.Replace (':', '_').Replace ('\\', '_').Replace ('/', '_'); @@ -320,6 +326,28 @@ class HtmlPreviewVisitor : MimeVisitor return "file://" + path.Replace ('\\', '/'); } + /// + /// Get a file:// URI for the image attachment. + /// + /// + /// Saves the image attachment to a temp file and returns a file:// URI for the + /// temp file. + /// + /// The file:// URI. + /// The image attachment. + /// The original HTML image URL. + string GetDataUri (MimePart image) + { + using (var memory = new MemoryStream ()) { + image.Content.DecodeTo (memory); + var buffer = memory.GetBuffer (); + var length = (int) memory.Length; + var base64 = Convert.ToBase64String (buffer, 0, length); + + return string.Format ("data:{0};base64,{1}", image.ContentType.MimeType, base64); + } + } + // Replaces urls that refer to images embedded within the message with // "file://" urls that the browser control will actually be able to load. void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) @@ -338,7 +366,10 @@ class HtmlPreviewVisitor : MimeVisitor continue; } - url = SaveImage (image, attribute.Value); + // Note: you can either use a "file://" URI or you can use a + // "data:" URI, the choice is yours. + url = GetFileUri (image, attribute.Value); + //uri = GetDataUri (image); htmlWriter.WriteAttributeName (attribute.Name); htmlWriter.WriteAttributeValue (url); diff --git a/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs b/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs index d5a386a865..6c1827ec00 100644 --- a/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs +++ b/samples/MessageReader/MessageReader/HtmlPreviewVisitor.cs @@ -137,13 +137,13 @@ string GetDataUri (MimePart attachment) } // Replaces urls that refer to images embedded within the message with - // "file://" urls that the browser control will actually be able to load. + // "data:" urls that the browser control will actually be able to load. void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) { if (ctx.TagId == HtmlTagId.Image && !ctx.IsEndTag && stack.Count > 0) { ctx.WriteTag (htmlWriter, false); - // replace the src attribute with a file:// URL + // replace the src attribute with a "data:" URL foreach (var attribute in ctx.Attributes) { if (attribute.Id == HtmlAttributeId.Src) { MimePart image; From 15f955b49dc7743d1281afbedce6d327706e161b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 30 Aug 2019 15:31:27 -0400 Subject: [PATCH 360/741] Improve robustness of TNEF processing of email address fields --- MimeKit/Tnef/TnefPart.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 74271e95a3..5fe64a98f5 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -128,8 +128,9 @@ class EmailAddress bool CanUseSearchKey { get { - return SearchKey != null && SearchKey.Length > AddrType.Length && - SearchKey.StartsWith (AddrType, StringComparison.Ordinal) && SearchKey[AddrType.Length] == ':'; + return SearchKey != null && SearchKey.Equals ("SMTP", StringComparison.OrdinalIgnoreCase) && + SearchKey.Length > AddrType.Length && SearchKey.StartsWith (AddrType, StringComparison.Ordinal) && + SearchKey[AddrType.Length] == ':'; } } @@ -143,17 +144,19 @@ public bool TryGetMailboxAddress (out MailboxAddress mailbox) { string addr; + mailbox = null; + if (string.IsNullOrEmpty (Addr) && CanUseSearchKey) addr = SearchKey.Substring (AddrType.Length + 1); else addr = Addr; - if (!string.IsNullOrEmpty (addr)) - mailbox = new MailboxAddress (Name, addr); - else - mailbox = null; + if (string.IsNullOrEmpty (addr) || !MailboxAddress.TryParse (addr, out mailbox)) + return false; + + mailbox.Name = Name; - return mailbox != null; + return true; } } From 88725b0a29278e187ccba1bd745e02c7ba73cc91 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 4 Sep 2019 10:41:00 -0400 Subject: [PATCH 361/741] Added support for the RSASSA-PSS signature padding algorithm --- .../BouncyCastleSecureMimeContext.cs | 17 ++++-- MimeKit/Cryptography/CmsSigner.cs | 24 ++++++-- .../RsaEncryptionPaddingScheme.cs | 48 +++++++++++++++ .../Cryptography/RsaSignaturePaddingScheme.cs | 48 +++++++++++++++ MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.Portable.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.WindowsUniversal81.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 3 +- UnitTests/Cryptography/SecureMimeTests.cs | 60 +++++++++++++++++++ 14 files changed, 196 insertions(+), 12 deletions(-) create mode 100644 MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs create mode 100644 MimeKit/Cryptography/RsaSignaturePaddingScheme.cs diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 9ce25b6363..fde85158d3 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -42,12 +42,13 @@ using Org.BouncyCastle.Pkix; using Org.BouncyCastle.X509; using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Asn1.Cms; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Asn1.Smime; using Org.BouncyCastle.X509.Store; using Org.BouncyCastle.Utilities.Date; +using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Utilities.Collections; -using Org.BouncyCastle.Asn1.Smime; -using Org.BouncyCastle.Asn1.X509; using AttributeTable = Org.BouncyCastle.Asn1.Cms.AttributeTable; @@ -250,10 +251,16 @@ AttributeTable AddSecureMimeCapabilities (AttributeTable signedAttributes) Stream Sign (CmsSigner signer, Stream content, bool encapsulate) { + var signedAttributes = AddSecureMimeCapabilities (signer.SignedAttributes); var signedData = new CmsSignedDataStreamGenerator (); + var digestOid = GetDigestOid (signer.DigestAlgorithm); - signedData.AddSigner (signer.PrivateKey, signer.Certificate, GetDigestOid (signer.DigestAlgorithm), - AddSecureMimeCapabilities (signer.SignedAttributes), signer.UnsignedAttributes); + if (signer.PrivateKey is RsaKeyParameters && signer.RsaSignaturePaddingScheme == RsaSignaturePaddingScheme.Pss) { + signedData.AddSigner (signer.PrivateKey, signer.Certificate, PkcsObjectIdentifiers.IdRsassaPss.Id, digestOid, + signedAttributes, signer.UnsignedAttributes); + } else { + signedData.AddSigner (signer.PrivateKey, signer.Certificate, digestOid, signedAttributes, signer.UnsignedAttributes); + } signedData.AddCertificates (signer.CertificateChain); diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 1cd3515835..29a1292fc0 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -330,7 +330,7 @@ public CmsSigner (X509Certificate2 certificate) : this () #endif /// - /// Gets the signer's certificate. + /// Get the signer's certificate. /// /// /// The signer's certificate that contains a public key that can be used for @@ -342,7 +342,7 @@ public X509Certificate Certificate { } /// - /// Gets the certificate chain. + /// Get the certificate chain. /// /// /// Gets the certificate chain. @@ -353,7 +353,7 @@ public X509CertificateChain CertificateChain { } /// - /// Gets or sets the digest algorithm. + /// Get or set the digest algorithm. /// /// /// Specifies which digest algorithm to use to generate the @@ -365,7 +365,7 @@ public DigestAlgorithm DigestAlgorithm { } /// - /// Gets the private key. + /// Get the private key. /// /// /// The private key used for signing. @@ -376,7 +376,19 @@ public AsymmetricKeyParameter PrivateKey { } /// - /// Gets or sets the signed attributes. + /// Get or set the RSA signature padding scheme. + /// + /// + /// Gets or sets the signature padding scheme to use for signing when + /// the is an RSA key. + /// + /// The signature padding scheme. + public RsaSignaturePaddingScheme RsaSignaturePaddingScheme { + get; set; + } + + /// + /// Get or set the signed attributes. /// /// /// A table of attributes that should be included in the signature. @@ -387,7 +399,7 @@ public AttributeTable SignedAttributes { } /// - /// Gets or sets the unsigned attributes. + /// Get or set the unsigned attributes. /// /// /// A table of attributes that should not be signed in the signature, diff --git a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs new file mode 100644 index 0000000000..c8ba401847 --- /dev/null +++ b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs @@ -0,0 +1,48 @@ +// +// RsaEncryptionPaddingScheme.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +namespace MimeKit.Cryptography +{ + /// + /// The RSA encryption padding schemes used by S/MIME. + /// + /// + /// The RSA encryption padding schemes used by S/MIME as described in + /// rfc8017. + /// + public enum RsaEncryptionPaddingScheme + { + /// + /// The PKCS #1 v1.5 encryption padding scheme. + /// + Pkcs1, + + /// + /// The Optimal Asymmetric Encryption Padding (OAEP) scheme. + /// + Oaep + } +} diff --git a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs new file mode 100644 index 0000000000..13bd2d1b6b --- /dev/null +++ b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs @@ -0,0 +1,48 @@ +// +// RsaSignaturePaddingScheme.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +namespace MimeKit.Cryptography +{ + /// + /// The RSA signature padding schemes used by S/MIME. + /// + /// + /// The RSA signature padding schemes used by S/MIME as described in + /// rfc8017. + /// + public enum RsaSignaturePaddingScheme + { + /// + /// The PKCS #1 v1.5 signature padding scheme. + /// + Pkcs1, + + /// + /// The Probibilistic Signature Scheme (PSS). + /// + Pss + } +} diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 01a7c3433d..bc4fb48fb6 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -112,6 +112,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 8eb4ea572f..73bb6f8ae7 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -101,6 +101,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 43ffe6cd90..984494a31d 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -110,6 +110,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 663c54883a..e6e81dcf93 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -94,6 +94,7 @@ + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index e98eef6d47..9c089c0a3d 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -98,6 +98,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 8fb8998ab8..face7d4380 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -94,6 +94,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index d589655862..5ebfd7a2e5 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -100,6 +100,7 @@ + diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 55cd121e43..35e4a5301d 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -104,6 +104,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index b625eb6344..c2ad0306d5 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -111,6 +111,7 @@ + @@ -280,4 +281,4 @@ - \ No newline at end of file + diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 8d287d6dc8..f3ac21dbf0 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -624,6 +624,57 @@ public virtual void TestSecureMimeSigningWithContextAndCmsSigner () } } + [Test] + public virtual void TestSecureMimeSigningWithRsaSsaPss () + { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret") { + SignaturePaddingScheme = RsaSignaturePaddingScheme.Pss + }; + var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; + + var multipart = MultipartSigned.Create (signer, body); + + Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children."); + + var protocol = multipart.ContentType.Parameters["protocol"]; + Assert.AreEqual ("application/pkcs7-signature", protocol, "The multipart/signed protocol does not match."); + + Assert.IsInstanceOf (multipart[0], "The first child is not a text part."); + Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); + + var signatures = multipart.Verify (); + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + + var signature = signatures[0]; + + using (var ctx = CreateContext ()) { + if (!(ctx is WindowsSecureMimeContext) || Path.DirectorySeparatorChar == '\\') + Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); + Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); + Assert.AreEqual (MimeKitFingerprint, signature.SignerCertificate.Fingerprint.ToLowerInvariant ()); + + var algorithms = GetEncryptionAlgorithms (signature); + int i = 0; + + Assert.AreEqual (EncryptionAlgorithm.Aes256, algorithms[i++], "Expected AES-256 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes192, algorithms[i++], "Expected AES-192 capability"); + Assert.AreEqual (EncryptionAlgorithm.Aes128, algorithms[i++], "Expected AES-128 capability"); + + try { + bool valid = signature.Verify (); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + if (ctx is WindowsSecureMimeContext) { + // AppVeyor gets an exception about the root certificate not being trusted + Assert.AreEqual (UntrustedRootCertificateMessage, ex.InnerException.Message); + } else { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + } + [Test] public virtual void TestSecureMimeMessageSigning () { @@ -1360,6 +1411,15 @@ public override void TestSecureMimeSigningWithContextAndCmsSigner () base.TestSecureMimeSigningWithContextAndCmsSigner (); } + [Test] + public override void TestSecureMimeSigningWithRsaSsaPss () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeSigningWithRsaSsaPss (); + } + [Test] public override void TestSecureMimeMessageSigning () { From e2be98af6c0ea5eb9fe13a15cb2c4489ec83a9a7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 4 Sep 2019 10:59:40 -0400 Subject: [PATCH 362/741] Fixed the unit tests --- UnitTests/Cryptography/SecureMimeTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index f3ac21dbf0..efe93c6478 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -628,7 +628,7 @@ public virtual void TestSecureMimeSigningWithContextAndCmsSigner () public virtual void TestSecureMimeSigningWithRsaSsaPss () { var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret") { - SignaturePaddingScheme = RsaSignaturePaddingScheme.Pss + RsaSignaturePaddingScheme = RsaSignaturePaddingScheme.Pss }; var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; From de6252b8c46a44b415ddeeaa00083e0cbddc63ad Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 5 Sep 2019 14:01:50 -0400 Subject: [PATCH 363/741] Added build targets for net46 and net47 --- MimeKit/MimeKit.Net45.csproj | 4 +-- MimeKit/MimeKit.NetStandard.csproj | 31 +++++++++++++++++++---- MimeKit/MimeKit.Portable.csproj | 4 +-- MimeKit/MimeKit.WindowsUniversal81.csproj | 4 +-- nuget/MimeKit.nuspec | 20 +++++++++++++++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 984494a31d..f3dbda6d06 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -21,7 +21,7 @@ False bin\Debug\net45 obj\Debug\net45 - DEBUG;TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM; + DEBUG;TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NET_4_5 prompt 4 True @@ -31,7 +31,7 @@ True bin\Release\net45 obj\Release\net45 - TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM; + TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NET_4_5 prompt 4 true diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index e6e81dcf93..2c961e6c2e 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -5,7 +5,7 @@ MimeKit 2.3.0.0 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0 + netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 true false MimeKit @@ -23,18 +23,27 @@ false false MimeKit - $(DefineConstants);ENABLE_CRYPTO;USE_HTTP_CLIENT;NETSTANDARD + $(DefineConstants);ENABLE_CRYPTO true mimekit.snk true true + + $(DefineConstants);NETSTANDARD + - $(DefineConstants);NETSTANDARD_2_0;ENABLE_SNM + $(DefineConstants);ENABLE_SNM;NETSTANDARD_2_0 + + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_6 + + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_7 - + @@ -42,6 +51,13 @@ + + + + + + + @@ -49,6 +65,7 @@ + @@ -81,7 +98,7 @@ - + @@ -104,6 +121,10 @@ + + + + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj index 9c089c0a3d..7b578032de 100644 --- a/MimeKit/MimeKit.Portable.csproj +++ b/MimeKit/MimeKit.Portable.csproj @@ -20,7 +20,7 @@ false bin\Debug\portable obj\Debug\portable - DEBUG;TRACE;PORTABLE;ENABLE_CRYPTO;USE_HTTP_CLIENT + DEBUG;TRACE;PORTABLE;ENABLE_CRYPTO prompt 4 false @@ -31,7 +31,7 @@ bin\Release\portable obj\Release\portable bin\Release\portable\MimeKit.xml - TRACE;PORTABLE;ENABLE_CRYPTO;USE_HTTP_CLIENT + TRACE;PORTABLE;ENABLE_CRYPTO prompt 4 false diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj index 35e4a5301d..e9183064ea 100644 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ b/MimeKit/MimeKit.WindowsUniversal81.csproj @@ -24,7 +24,7 @@ false bin\Debug\wpa81 obj\Debug\wpa81 - DEBUG;TRACE;PORTABLE;ENABLE_CRYPTO;USE_HTTP_CLIENT + DEBUG;TRACE;PORTABLE;ENABLE_CRYPTO prompt 4 false @@ -36,7 +36,7 @@ bin\Release\wpa81 obj\Release\wpa81 bin\Release\wpa81\MimeKit.xml - TRACE;PORTABLE;ENABLE_CRYPTO;USE_HTTP_CLIENT + TRACE;PORTABLE;ENABLE_CRYPTO prompt 4 false diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index fefa9c2f39..c9b81ad2a1 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -42,6 +42,16 @@ + + + + + + + + + + @@ -55,6 +65,12 @@ + + + + + + @@ -101,6 +117,10 @@ + + + + From 18a7ab732afa7f1c1c7b39a6f080f6b291356800 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 5 Sep 2019 21:17:15 -0400 Subject: [PATCH 364/741] Updated .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3e871b5038..63094d403f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +MimeKit/Resources/Resource.designer.cs Mono.Data.Sqlite/Documentation *project.lock.json *.csproj.nuget.cache From 9b348520f0979f613ecdf0842be259208c500a8d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Sep 2019 11:22:37 -0400 Subject: [PATCH 365/741] Modified FilteredStream.Flush*() to not flush the source stream Fixes https://github.com/jstedfast/MailKit/issues/904 --- MimeKit/IO/FilteredStream.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/MimeKit/IO/FilteredStream.cs b/MimeKit/IO/FilteredStream.cs index 0d9c866156..c041597277 100644 --- a/MimeKit/IO/FilteredStream.cs +++ b/MimeKit/IO/FilteredStream.cs @@ -693,12 +693,6 @@ public void Flush (CancellationToken cancellationToken) filteredIndex = 0; filteredLength = 0; } - - if (cancellable != null) { - cancellable.Flush (cancellationToken); - } else { - Source.Flush (); - } } /// @@ -770,8 +764,6 @@ public override async Task FlushAsync (CancellationToken cancellationToken) filteredIndex = 0; filteredLength = 0; } - - await Source.FlushAsync (cancellationToken).ConfigureAwait (false); } /// From fa2bc13bd1088202a531898b83c0d268b725e4f8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Sep 2019 15:53:41 -0400 Subject: [PATCH 366/741] Fixed CmsRecipient to use IssuerAndSerial unless SubjectKeyIdentifier is explicitly requested --- MimeKit/Cryptography/CmsRecipient.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 7d1a9b9188..46ed2b4499 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -66,7 +66,7 @@ public CmsRecipient (X509Certificate certificate, SubjectIdentifierType recipien if (certificate == null) throw new ArgumentNullException (nameof (certificate)); - if (recipientIdentifierType == SubjectIdentifierType.IssuerAndSerialNumber) + if (recipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) RecipientIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; else RecipientIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; @@ -102,14 +102,13 @@ public CmsRecipient (Stream stream, SubjectIdentifierType recipientIdentifierTyp if (stream == null) throw new ArgumentNullException (nameof (stream)); - if (recipientIdentifierType == SubjectIdentifierType.IssuerAndSerialNumber) + if (recipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) RecipientIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; else RecipientIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; var parser = new X509CertificateParser (); - RecipientIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; Certificate = parser.ReadCertificate (stream); if (Certificate == null) @@ -160,15 +159,16 @@ public CmsRecipient (string fileName, SubjectIdentifierType recipientIdentifierT if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - var parser = new X509CertificateParser (); - - if (recipientIdentifierType == SubjectIdentifierType.IssuerAndSerialNumber) + if (recipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) RecipientIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; else RecipientIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; - using (var stream = File.OpenRead (fileName)) + using (var stream = File.OpenRead (fileName)) { + var parser = new X509CertificateParser (); + Certificate = parser.ReadCertificate (stream); + } if (Certificate == null) throw new FormatException (); @@ -199,7 +199,7 @@ public CmsRecipient (X509Certificate2 certificate, SubjectIdentifierType recipie if (certificate == null) throw new ArgumentNullException (nameof (certificate)); - if (recipientIdentifierType == SubjectIdentifierType.IssuerAndSerialNumber) + if (recipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) RecipientIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; else RecipientIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; From e5f35928671da2e345b79dbc8a19fe88f9b47414 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Sep 2019 16:15:07 -0400 Subject: [PATCH 367/741] Updated WindowsSecureMimeContext to default to IssuerAndSerialNumber --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 286587b4d9..e6e4088472 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -223,7 +223,7 @@ protected virtual RealCmsRecipient GetCmsRecipient (MailboxAddress mailbox) if ((certificate = GetRecipientCertificate (mailbox)) == null) throw new CertificateNotFoundException (mailbox, "A valid certificate could not be found."); - return new RealCmsRecipient (RealSubjectIdentifierType.SubjectKeyIdentifier, certificate); + return new RealCmsRecipient (certificate); } /// @@ -261,7 +261,7 @@ RealCmsRecipientCollection GetCmsRecipients (CmsRecipientCollection recipients) var certificate = new X509Certificate2 (recipient.Certificate.GetEncoded ()); RealSubjectIdentifierType type; - if (recipient.RecipientIdentifierType == SubjectIdentifierType.IssuerAndSerialNumber) + if (recipient.RecipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) type = RealSubjectIdentifierType.IssuerAndSerialNumber; else type = RealSubjectIdentifierType.SubjectKeyIdentifier; From fa2812ebb35c85b3fb64bd48c45f775b955be179 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Sep 2019 16:15:52 -0400 Subject: [PATCH 368/741] Reduce code duplication with MimeMessage and MimeEntity WriteTo(string fileName) Also updated these WriteTo() methods to flush the output stream before closing. --- MimeKit/MimeEntity.cs | 22 +++++++++------------- MimeKit/MimeMessage.cs | 22 +++++++++------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index fdd9c123a8..1129c04b3d 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -746,8 +746,10 @@ public virtual void Accept (MimeVisitor visitor) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) + using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) { WriteTo (options, stream, false, cancellationToken); + stream.Flush (); + } } /// @@ -793,8 +795,10 @@ public virtual void Accept (MimeVisitor visitor) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) + using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) { await WriteToAsync (options, stream, false, cancellationToken).ConfigureAwait (false); + await stream.FlushAsync (cancellationToken).ConfigureAwait (false); + } } /// @@ -905,11 +909,7 @@ public virtual void Accept (MimeVisitor visitor) /// public void WriteTo (string fileName, CancellationToken cancellationToken = default (CancellationToken)) { - if (fileName == null) - throw new ArgumentNullException (nameof (fileName)); - - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) - WriteTo (FormatOptions.Default, stream, false, cancellationToken); + WriteTo (FormatOptions.Default, fileName, cancellationToken); } /// @@ -944,13 +944,9 @@ public virtual void Accept (MimeVisitor visitor) /// /// An I/O error occurred. /// - public async Task WriteToAsync (string fileName, CancellationToken cancellationToken = default (CancellationToken)) + public Task WriteToAsync (string fileName, CancellationToken cancellationToken = default (CancellationToken)) { - if (fileName == null) - throw new ArgumentNullException (nameof (fileName)); - - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) - await WriteToAsync (FormatOptions.Default, stream, false, cancellationToken).ConfigureAwait (false); + return WriteToAsync (FormatOptions.Default, fileName, cancellationToken); } #endif // !PORTABLE diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index ead8e23f28..d83eba1c86 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1384,8 +1384,10 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) + using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) { WriteTo (options, stream, cancellationToken); + stream.Flush (); + } } /// @@ -1431,8 +1433,10 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) + using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) { await WriteToAsync (options, stream, cancellationToken).ConfigureAwait (false); + await stream.FlushAsync (cancellationToken).ConfigureAwait (false); + } } /// @@ -1468,11 +1472,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// public void WriteTo (string fileName, CancellationToken cancellationToken = default (CancellationToken)) { - if (fileName == null) - throw new ArgumentNullException (nameof (fileName)); - - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) - WriteTo (FormatOptions.Default, stream, cancellationToken); + WriteTo (FormatOptions.Default, fileName, cancellationToken); } /// @@ -1507,13 +1507,9 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// /// An I/O error occurred. /// - public async Task WriteToAsync (string fileName, CancellationToken cancellationToken = default (CancellationToken)) + public Task WriteToAsync (string fileName, CancellationToken cancellationToken = default (CancellationToken)) { - if (fileName == null) - throw new ArgumentNullException (nameof (fileName)); - - using (var stream = File.Open (fileName, FileMode.Create, FileAccess.Write)) - await WriteToAsync (FormatOptions.Default, stream, cancellationToken).ConfigureAwait (false); + return WriteToAsync (FormatOptions.Default, fileName, cancellationToken); } #endif From 4118a3c9b732f517aa1de8e6af5d6f51bb9df693 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Sep 2019 19:12:25 -0400 Subject: [PATCH 369/741] Improve unit test code coverage a bit --- UnitTests/Cryptography/DkimTests.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 119b96c1a7..021e23bc8b 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -183,6 +183,8 @@ public void TestDkimHashStream () Assert.Throws (() => stream.Seek (64, SeekOrigin.Begin)); Assert.Throws (() => stream.SetLength (256)); + + stream.Flush (); } } @@ -215,6 +217,8 @@ public void TestDkimSignatureStream () Assert.Throws (() => stream.SetLength (256)); Assert.Throws (() => stream.VerifySignature (null)); + + stream.Flush (); } } From c0fe647e76305dc4cf084217916e254c1de22919 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Sep 2019 19:17:09 -0400 Subject: [PATCH 370/741] Add test for FilteredStream .ctor --- UnitTests/ArgumentExceptionTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index a554b10cde..81c31e018c 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -365,6 +365,8 @@ public void TestStreamArguments () AssertStreamArguments (stream); using (var memory = new MemoryStream ()) { + Assert.Throws (() => new FilteredStream (null)); + using (var stream = new FilteredStream (memory)) AssertStreamArguments (stream); } From 853db152ef882e253e2bf3f36cf7d6e5456583b2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 8 Sep 2019 12:26:24 -0400 Subject: [PATCH 371/741] bumped version to 2.3.1 --- .../RsaEncryptionPaddingScheme.cs | 3 +-- .../Cryptography/RsaSignaturePaddingScheme.cs | 3 +-- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 18 +++++++++++---- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 13 +++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 14 +++++------ nuget/MimeKitLite.nuspec | 23 +++++++++++++------ 10 files changed, 56 insertions(+), 28 deletions(-) diff --git a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs index c8ba401847..1c6f8127d0 100644 --- a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs +++ b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs @@ -24,8 +24,7 @@ // THE SOFTWARE. // -namespace MimeKit.Cryptography -{ +namespace MimeKit.Cryptography { /// /// The RSA encryption padding schemes used by S/MIME. /// diff --git a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs index 13bd2d1b6b..9cc8e20444 100644 --- a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs +++ b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs @@ -24,8 +24,7 @@ // THE SOFTWARE. // -namespace MimeKit.Cryptography -{ +namespace MimeKit.Cryptography { /// /// The RSA signature padding schemes used by S/MIME. /// diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 2c961e6c2e..75fdbf251e 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.3.0.0 + 2.3.1.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 716955113b..6aa8698f06 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,9 +3,9 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.3.0.0 + 2.3.1.0 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0 + netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 true false MimeKitLite @@ -23,18 +23,26 @@ false false MimeKit - $(DefineConstants);NETSTANDARD true mimekit.snk true true + + $(DefineConstants);NETSTANDARD + - $(DefineConstants);NETSTANDARD_2_0;ENABLE_SNM + $(DefineConstants);ENABLE_SNM;NETSTANDARD_2_0 + + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_6 + + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_7 - + diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 0b8acbcc44..a4a85f714b 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.3.0.0")] -[assembly: AssemblyFileVersion ("2.3.0.0")] +[assembly: AssemblyInformationalVersion ("2.3.1.0")] +[assembly: AssemblyFileVersion ("2.3.1.0")] [assembly: AssemblyVersion ("2.3.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 23cbac98dd..03e1f89e88 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,18 @@ # Release Notes +### MimeKit 2.3.1 (2019-09-08) + +* Updated CmsSigner's default DigestAlgorithm to Sha256 instead of Sha1 to match + System.Security.Cryptography.Pkcs.CmsSigner's default. +* Updated WindowsSecureMimeContext to default to IssuerAndSerialNumber for + System.Security.Cryptography.Pkcs.CmsSigner. +* Added support for the RSASSA-PSS signature padding algorithm when using the + BouncyCastle backend. +* Improved robustness of TNEF processing of email address fields. +* Modified FilteredStream.Flush*() to not flush the source stream. + (MailKit issue [#904](https://github.com/jstedfast/MailKit/issues/904)) +* Added net46 and net47 assemblies to the NuGet package. + ### MimeKit 2.3.0 (2019-08-24) * Fixed MultipartRelated to fall back to the multipart/related type parameter when diff --git a/appveyor.yml b/appveyor.yml index 6056285851..2e24a8cd7d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.3.0.{build} +version: 2.3.1.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1cfb1952dd..d503e6f399 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.3.0$(Rev:.r) +name: 2.3.1$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index c9b81ad2a1..d8817775b2 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.3.0 + 2.3.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,12 +26,12 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed MultipartRelated to fall back to the multipart/related type parameter when locating the Root. (issue #489) -* Improved Authentication-Results parser to handle non-standard syntax. (issue #490) -* When FormatOptions.AllowMixedHeaderCharsets is disabled, always use the user-specified charset. Previously this could/would still use us-ascii and/or iso-8859-1 if the entire header could fit within one of those charsets. (issue #493) -* Fixed the line length calculations in the BestEncodingFilter. (issue #497) -* Fixed Multipart to properly ensure the epilogue ends w/ a new-line when FormatOptions.EnsureNewLine is true. (issue #499) -* Modified Multipart.WriteTo[Async] to not ensure that a Content-Type boundary parameter has been set. This code-path was only hit if the multipart was parsed by the parser and did not have a boundary parameter in the first place. In the interest of preserving byte-for-byte compatibility with the original input, this sanity check has been removed. (issue #499) +* Updated CmsSigner's default DigestAlgorithm to Sha256 instead of Sha1 to match System.Security.Cryptography.Pkcs.CmsSigner's default. +* Updated WindowsSecureMimeContext to default to IssuerAndSerialNumber for System.Security.Cryptography.Pkcs.CmsSigner. +* Added support for the RSASSA-PSS signature padding algorithm when using the BouncyCastle backend. +* Improved robustness of TNEF processing of email address fields. +* Modified FilteredStream.Flush*() to not flush the source stream. (MailKit issue #904) +* Added net46 and net47 assemblies to the NuGet package. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 4798a8e513..a43098633f 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.3.0 + 2.3.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,12 +26,9 @@ An Open Source library for creating and parsing MIME messages. -* Fixed MultipartRelated to fall back to the multipart/related type parameter when locating the Root. (issue #489) -* Improved Authentication-Results parser to handle non-standard syntax. (issue #490) -* When FormatOptions.AllowMixedHeaderCharsets is disabled, always use the user-specified charset. Previously this could/would still use us-ascii and/or iso-8859-1 if the entire header could fit within one of those charsets. (issue #493) -* Fixed the line length calculations in the BestEncodingFilter. (issue #497) -* Fixed Multipart to properly ensure the epilogue ends w/ a new-line when FormatOptions.EnsureNewLine is true. (issue #499) -* Modified Multipart.WriteTo[Async] to not ensure that a Content-Type boundary parameter has been set. This code-path was only hit if the multipart was parsed by the parser and did not have a boundary parameter in the first place. In the interest of preserving byte-for-byte compatibility with the original input, this sanity check has been removed. (issue #499) +* Improved robustness of TNEF processing of email address fields. +* Modified FilteredStream.Flush*() to not flush the source stream. (MailKit issue #904) +* Added net46 and net47 assemblies to the NuGet package. Xamarin Inc. en-US @@ -40,6 +37,12 @@ + + + + + + @@ -47,6 +50,8 @@ + + @@ -81,6 +86,10 @@ + + + + From eef01dbed0b0a9b4e95b909551b6fe52525a3c67 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 8 Sep 2019 13:00:18 -0400 Subject: [PATCH 372/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 9ed01e3861..65c198a993 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.3.0\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.3.1\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index a89b504df2..405b1780c1 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 6f1ac658c0..883f557b38 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.3.0\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.3.1\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.3.0\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.3.1\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index cea7bb1265..2f83f41709 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 93719722bf..170760cf39 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.3.0\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.3.1\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.3.0\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.3.1\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 12aa77adda..9c927df3a4 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index add1ac6d83..9ec26d336f 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.3.0\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.3.1\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 8961fe80e1..7a51228537 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 017f7a49128f703be08c14c11ffc3a178ecd4561 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 8 Sep 2019 13:38:17 -0400 Subject: [PATCH 373/741] Fix some potential leaks in MimeParser --- MimeKit/AsyncMimeParser.cs | 2 ++ MimeKit/MimeParser.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index c410e1a9ed..22ef7902c6 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -281,6 +281,8 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToke if (!results.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding); + else + content.Dispose (); return results.Boundary; } diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 7fce8f4a50..9de846e1c1 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1250,6 +1250,8 @@ unsafe BoundaryType ConstructMimePart (MimePart part, byte* inbuf, CancellationT if (!empty) part.Content = new MimeContent (content, part.ContentTransferEncoding); + else + content.Dispose (); return found; } From 8f1fb3d6ef01643029c7a665e6ad3e00d3b70f1c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 8 Sep 2019 13:41:39 -0400 Subject: [PATCH 374/741] Fixed a typo in AuthenticationResults --- MimeKit/Cryptography/AuthenticationResults.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index a1b77360f2..b420d3c875 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -1130,9 +1130,9 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line tokens.Add (" "); if ("action=".Length + action.Length < options.MaxLineLength) { - tokens.Add ($"reason={action}"); + tokens.Add ($"action={action}"); } else { - tokens.Add ("reason="); + tokens.Add ("action="); tokens.Add (action); } } From efeb6e20ffc9e5bc81b24a8c5d9d28ff4b047f6f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 8 Sep 2019 13:46:56 -0400 Subject: [PATCH 375/741] Fixed potential leaks (if AddCertificates() throws) in Windows and BC S/MIME contexts --- MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs | 4 ++-- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index fde85158d3..625a4b2ac7 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -1219,9 +1219,9 @@ public override MimePart Export (IEnumerable mailboxes) throw new ArgumentException ("No mailboxes specified.", nameof (mailboxes)); var cms = new CmsSignedDataStreamGenerator (); - var memory = new MemoryBlockStream (); - cms.AddCertificates (certificates); + + var memory = new MemoryBlockStream (); cms.Open (memory).Dispose (); memory.Position = 0; diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index e6e4088472..1530c7ebc2 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -1198,9 +1198,9 @@ public override MimePart Export (IEnumerable mailboxes) throw new ArgumentException ("No mailboxes specified.", nameof (mailboxes)); var cms = new CmsSignedDataStreamGenerator (); - var memory = new MemoryBlockStream (); - cms.AddCertificates (certificates); + + var memory = new MemoryBlockStream (); cms.Open (memory).Dispose (); memory.Position = 0; From c9425b67b4b05c91b632793cdb6aa53ef5dccba0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 9 Sep 2019 21:01:31 -0400 Subject: [PATCH 376/741] Removed NpgsqlCertificateDatabase --- MimeKit/MimeKit.Net45.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index f3dbda6d06..347182ed8a 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -99,7 +99,6 @@ - From 61548a6d0b8ca5de0be1a0f59ca7483e43da7c82 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Sep 2019 08:14:29 -0400 Subject: [PATCH 377/741] Added more FormatOptions unit tests --- UnitTests/FormatOptionsTests.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UnitTests/FormatOptionsTests.cs b/UnitTests/FormatOptionsTests.cs index b5b58cf664..b461f189a7 100644 --- a/UnitTests/FormatOptionsTests.cs +++ b/UnitTests/FormatOptionsTests.cs @@ -40,13 +40,19 @@ public void TestArgumentExceptions () var format = FormatOptions.Default.Clone (); Assert.Throws (() => format.ParameterEncodingMethod = (ParameterEncodingMethod) 100, "ParameterEncodingMethod"); + Assert.Throws (() => format.MaxLineLength = 999, "MaxLineLength too large"); + Assert.Throws (() => format.MaxLineLength = 59, "MaxLineLength too small"); + + Assert.DoesNotThrow (() => format.MaxLineLength = 72); } [Test] public void TestInvalidOperationExceptions () { + Assert.Throws (() => FormatOptions.Default.MaxLineLength = 998, "MaxLineLength"); Assert.Throws (() => FormatOptions.Default.EnsureNewLine = true, "EnsureNewLine"); Assert.Throws (() => FormatOptions.Default.International = true, "International"); + Assert.Throws (() => FormatOptions.Default.NewLineFormat = NewLineFormat.Dos, "NewLineFormat"); Assert.Throws (() => FormatOptions.Default.AllowMixedHeaderCharsets = true, "AllowMixedHeaderCharsets"); Assert.Throws (() => FormatOptions.Default.ParameterEncodingMethod = ParameterEncodingMethod.Rfc2047, "ParameterEncodingMethod"); } From 91799ff48a5e0e93148d4cfc5a849642ed8a5a5e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Sep 2019 22:28:58 -0400 Subject: [PATCH 378/741] Pushed Header and Footer properties down into TextConverter --- MimeKit/Text/HtmlToHtml.cs | 24 ---------- MimeKit/Text/TextConverter.cs | 24 ++++++++++ MimeKit/Text/TextToFlowed.cs | 24 ---------- MimeKit/Text/TextToHtml.cs | 24 ---------- MimeKit/Text/TextToText.cs | 35 -------------- UnitTests/Text/TextConverterTests.cs | 68 +++++++++++++++++++++------- 6 files changed, 76 insertions(+), 123 deletions(-) diff --git a/MimeKit/Text/HtmlToHtml.cs b/MimeKit/Text/HtmlToHtml.cs index 0203995991..8c7e29d840 100644 --- a/MimeKit/Text/HtmlToHtml.cs +++ b/MimeKit/Text/HtmlToHtml.cs @@ -107,18 +107,6 @@ public bool FilterHtml { get; set; } - /// - /// Get or set the text that will be appended to the end of the output. - /// - /// - /// Gets or sets the text that will be appended to the end of the output. - /// The footer must be set before conversion begins. - /// - /// The footer. - public string Footer { - get; set; - } - /// /// Get or set the footer format. /// @@ -130,18 +118,6 @@ public HeaderFooterFormat FooterFormat { get; set; } - /// - /// Get or set text that will be prepended to the beginning of the output. - /// - /// - /// Gets or sets the text that will be prepended to the beginning of the output. - /// The header must be set before conversion begins. - /// - /// The header. - public string Header { - get; set; - } - /// /// Get or set the header format. /// diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index f298590513..65bef01f36 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -204,6 +204,30 @@ public int OutputStreamBufferSize { } } + /// + /// Get or set the text that will be appended to the end of the output. + /// + /// + /// Gets or sets the text that will be appended to the end of the output. + /// The footer must be set before conversion begins. + /// + /// The footer. + public string Footer { + get; set; + } + + /// + /// Get or set text that will be prepended to the beginning of the output. + /// + /// + /// Gets or sets the text that will be prepended to the beginning of the output. + /// The header must be set before conversion begins. + /// + /// The header. + public string Header { + get; set; + } + TextReader CreateReader (Stream stream) { return new StreamReader (stream, InputEncoding, DetectEncodingFromByteOrderMark, InputStreamBufferSize); diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index cab21c43cd..46c4692f24 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -74,30 +74,6 @@ public override TextFormat OutputFormat { get { return TextFormat.Flowed; } } - /// - /// Get or set the text that will be appended to the end of the output. - /// - /// - /// Gets or sets the text that will be appended to the end of the output. - /// The footer must be set before conversion begins. - /// - /// The footer. - public string Footer { - get; set; - } - - /// - /// Get or set text that will be prepended to the beginning of the output. - /// - /// - /// Gets or sets the text that will be prepended to the beginning of the output. - /// The header must be set before conversion begins. - /// - /// The header. - public string Header { - get; set; - } - static string Unquote (string line, out int quoteDepth) { int index = 0; diff --git a/MimeKit/Text/TextToHtml.cs b/MimeKit/Text/TextToHtml.cs index 3c472b5f8b..fcb9529007 100644 --- a/MimeKit/Text/TextToHtml.cs +++ b/MimeKit/Text/TextToHtml.cs @@ -78,18 +78,6 @@ public override TextFormat OutputFormat { get { return TextFormat.Html; } } - /// - /// Get or set the text that will be appended to the end of the output. - /// - /// - /// Gets or sets the text that will be appended to the end of the output. - /// The footer must be set before conversion begins. - /// - /// The footer. - public string Footer { - get; set; - } - /// /// Get or set the footer format. /// @@ -101,18 +89,6 @@ public HeaderFooterFormat FooterFormat { get; set; } - /// - /// Get or set text that will be prepended to the beginning of the output. - /// - /// - /// Gets or sets the text that will be prepended to the beginning of the output. - /// The header must be set before conversion begins. - /// - /// The header. - public string Header { - get; set; - } - /// /// Get or set the header format. /// diff --git a/MimeKit/Text/TextToText.cs b/MimeKit/Text/TextToText.cs index db113a202c..ef29f23f5c 100644 --- a/MimeKit/Text/TextToText.cs +++ b/MimeKit/Text/TextToText.cs @@ -68,41 +68,6 @@ public override TextFormat OutputFormat { get { return TextFormat.Plain; } } - /// - /// Get or set the text that will be appended to the end of the output. - /// - /// - /// Gets or sets the text that will be appended to the end of the output. - /// The footer must be set before conversion begins. - /// - /// The footer. - public string Footer { - get; set; - } - - /// - /// Get or set the footer format. - /// - /// - /// Gets or sets the footer format. - /// - /// The footer format. - public HeaderFooterFormat FooterFormat { - get; set; - } - - /// - /// Get or set text that will be prepended to the beginning of the output. - /// - /// - /// Gets or sets the text that will be prepended to the beginning of the output. - /// The header must be set before conversion begins. - /// - /// The header. - public string Header { - get; set; - } - /// /// Convert the contents of from the to the /// and uses the to write the resulting text. diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index e87298499b..0de435a237 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -36,11 +36,8 @@ namespace UnitTests.Text { [TestFixture] public class TextConverterTests { - [Test] - public void TestArgumentExceptions () + void AssertArgumentExceptions (TextConverter converter) { - var converter = new TextToText (); - Assert.Throws (() => converter.InputEncoding = null); Assert.Throws (() => converter.OutputEncoding = null); @@ -58,6 +55,19 @@ public void TestArgumentExceptions () Assert.Throws (() => converter.Convert ((TextReader) null, new StreamWriter (Stream.Null))); } + [Test] + public void TestArgumentExceptions () + { + AssertArgumentExceptions (new TextToText ()); + AssertArgumentExceptions (new TextToFlowed ()); + AssertArgumentExceptions (new TextToHtml ()); + + AssertArgumentExceptions (new FlowedToText ()); + AssertArgumentExceptions (new FlowedToHtml ()); + + AssertArgumentExceptions (new HtmlToHtml ()); + } + [Test] public void TestSimpleFlowedToText () { @@ -67,9 +77,11 @@ public void TestSimpleFlowedToText () string text = "This is some sample text that has been formatted " + Environment.NewLine + "according to the format=flowed rules defined in rfc3676. " + Environment.NewLine + "This text, once converted, should all be on a single line." + Environment.NewLine; - var converter = new FlowedToText (); + var converter = new FlowedToText { Header = null, Footer = null }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -93,9 +105,11 @@ public void TestQuotedFlowedToText () ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + ">>>>> styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToText (); + var converter = new FlowedToText { Header = null, Footer = null }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -120,9 +134,11 @@ public void TestBrokenQuotedFlowedToText () ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + ">>>>> styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToText (); + var converter = new FlowedToText { Header = null, Footer = null }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -145,9 +161,11 @@ public void TestSimpleFlowedToHtml () Environment.NewLine + Environment.NewLine + "And this line of text should be separate by 4 blank lines." + Environment.NewLine; - var converter = new FlowedToHtml { OutputHtmlFragment = true }; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -172,9 +190,11 @@ public void TestQuotedFlowedToHtml () ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + ">>>>> styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToHtml { OutputHtmlFragment = true }; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -200,9 +220,11 @@ public void TestBrokenQuotedFlowedToHtml () ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + ">>>>> styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToHtml { OutputHtmlFragment = true }; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -211,9 +233,11 @@ public void TestSimpleFlowedWithUrlsToHtml () { string expected = "

Check out http://www.xamarin.com - it's amazing!

" + Environment.NewLine; string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; - var converter = new FlowedToHtml { OutputHtmlFragment = true }; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -226,9 +250,11 @@ public void TestSimpleTextToText () string text = "This is some sample text. This is line #1." + Environment.NewLine + "This is line #2." + Environment.NewLine + "And this is line #3." + Environment.NewLine; - var converter = new TextToText (); + var converter = new TextToText { Header = null, Footer = null }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -249,14 +275,18 @@ public void TestSimpleTextToFlowed () ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - TextConverter converter = new TextToFlowed (); + TextConverter converter = new TextToFlowed { Header = null, Footer = null }; string result = converter.Convert (text); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Flowed, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); converter = new FlowedToText { DeleteSpace = true }; result = converter.Convert (expected); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (text, result); } @@ -269,9 +299,11 @@ public void TestSimpleTextToHtml () string text = "This is some sample text. This is line #1." + Environment.NewLine + "This is line #2." + Environment.NewLine + "And this is line #3." + Environment.NewLine; - var converter = new TextToHtml { OutputHtmlFragment = true }; + var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -280,9 +312,11 @@ public void TestSimpleTextWithUrlsToHtml () { const string expected = "Check out http://www.xamarin.com - it's amazing!
"; string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; - var converter = new TextToHtml { OutputHtmlFragment = true }; + var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -313,9 +347,11 @@ public void TestSimpleHtmlToHtml () { string expected = File.ReadAllText ("../../TestData/html/xamarin3.xhtml"); string text = File.ReadAllText ("../../TestData/html/xamarin3.html"); - var converter = new HtmlToHtml { HtmlTagCallback = ReplaceUrlsWithFileNames }; + var converter = new HtmlToHtml { Header = null, Footer = null, HtmlTagCallback = ReplaceUrlsWithFileNames }; var result = converter.Convert (text); + Assert.AreEqual (TextFormat.Html, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } } From 233a8ed0ab74f189519913778fa3286324a81f31 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Sep 2019 22:40:35 -0400 Subject: [PATCH 379/741] Added more TextConverter unit tests --- UnitTests/Text/TextConverterTests.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index 0de435a237..64b459e661 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -68,6 +68,30 @@ public void TestArgumentExceptions () AssertArgumentExceptions (new HtmlToHtml ()); } + void AssertDefaultPropertyValues (TextConverter converter) + { + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + [Test] + public void TestDefaultPropertyValues () + { + AssertDefaultPropertyValues (new TextToText ()); + AssertDefaultPropertyValues (new TextToFlowed ()); + AssertDefaultPropertyValues (new TextToHtml ()); + + AssertDefaultPropertyValues (new FlowedToText ()); + AssertDefaultPropertyValues (new FlowedToHtml ()); + + AssertDefaultPropertyValues (new HtmlToHtml ()); + } + [Test] public void TestSimpleFlowedToText () { From b357bce4868f64ee56fa502f555b24e916851b5c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 11 Sep 2019 08:19:01 -0400 Subject: [PATCH 380/741] Split FlowedToText and FlowedToHtml unit tests into their own files --- UnitTests/Text/FlowedToHtmlTests.cs | 172 +++++++++++++++++++++++++ UnitTests/Text/FlowedToTextTests.cs | 145 ++++++++++++++++++++++ UnitTests/Text/TextConverterTests.cs | 179 --------------------------- UnitTests/UnitTests.csproj | 2 + 4 files changed, 319 insertions(+), 179 deletions(-) create mode 100644 UnitTests/Text/FlowedToHtmlTests.cs create mode 100644 UnitTests/Text/FlowedToTextTests.cs diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs new file mode 100644 index 0000000000..03b0a0bddb --- /dev/null +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -0,0 +1,172 @@ +// +// FlowedToHtmlTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class FlowedToHtmlTests + { + [Test] + public void TestArgumentExceptions () + { + var converter = new FlowedToHtml (); + + Assert.Throws (() => converter.InputEncoding = null); + Assert.Throws (() => converter.OutputEncoding = null); + + Assert.Throws (() => converter.InputStreamBufferSize = -1); + Assert.Throws (() => converter.OutputStreamBufferSize = -1); + + Assert.Throws (() => converter.Convert (null)); + Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); + Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); + } + + [Test] + public void TestDefaultPropertyValues () + { + var converter = new FlowedToHtml (); + + Assert.IsFalse (converter.DeleteSpace, "DeleteSpace"); + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.AreEqual (HeaderFooterFormat.Text, converter.FooterFormat, "FooterFormat"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (HeaderFooterFormat.Text, converter.HeaderFormat, "HeaderFormat"); + Assert.IsNull (converter.HtmlTagCallback, "HtmlTagCallback"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); + Assert.IsFalse (converter.OutputHtmlFragment, "OutputHtmlFragment"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + [Test] + public void TestSimpleFlowedToHtml () + { + string expected = "

This is some sample text that has been formatted " + + "according to the format=flowed rules defined in rfc3676. " + + "This text, once converted, should all be on a single line.

" + Environment.NewLine + + "
" + Environment.NewLine + + "
" + Environment.NewLine + + "
" + Environment.NewLine + + "
" + Environment.NewLine + + "

And this line of text should be separate by 4 blank lines.

" + Environment.NewLine; + string text = "This is some sample text that has been formatted " + Environment.NewLine + + "according to the format=flowed rules defined in rfc3676. " + Environment.NewLine + + "This text, once converted, should all be on a single line." + Environment.NewLine + + Environment.NewLine + + Environment.NewLine + + Environment.NewLine + + Environment.NewLine + + "And this line of text should be separate by 4 blank lines." + Environment.NewLine; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestQuotedFlowedToHtml () + { + string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + + "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + + "

Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!

" + Environment.NewLine + + "

Henceforth, the coding style is to be strictly enforced, including the use of only upper case.

" + Environment.NewLine + + "

I've noticed a lack of adherence to the coding styles, of late.

" + Environment.NewLine + + "

Any complaints?

" + Environment.NewLine + + "
"; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + + "> reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + + ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + + ">>> unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + + ">>>> enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + + ">>>>> styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestBrokenQuotedFlowedToHtml () + { + // Note: this is the brokenly quoted sample from rfc3676 at the end of section 4.5 + string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + + "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + + "

Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!

" + Environment.NewLine + + "

Henceforth, the coding style is to be strictly enforced, including the use of only upper case.

" + Environment.NewLine + + "

I've noticed a lack of adherence to the coding styles, of late.

" + Environment.NewLine + + "

Any complaints?

" + Environment.NewLine + + "
"; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + + "> reeky elf-skinned pigeon-egg! " + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + + ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + + ">>> unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + + ">>>> enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + + ">>>>> styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestSimpleFlowedWithUrlsToHtml () + { + string expected = "

Check out http://www.xamarin.com - it's amazing!

" + Environment.NewLine; + string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; + var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + } +} diff --git a/UnitTests/Text/FlowedToTextTests.cs b/UnitTests/Text/FlowedToTextTests.cs new file mode 100644 index 0000000000..335cb0c9e4 --- /dev/null +++ b/UnitTests/Text/FlowedToTextTests.cs @@ -0,0 +1,145 @@ +// +// FlowedToTextTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class FlowedToTextTests + { + [Test] + public void TestArgumentExceptions () + { + var converter = new FlowedToText (); + + Assert.Throws (() => converter.InputEncoding = null); + Assert.Throws (() => converter.OutputEncoding = null); + + Assert.Throws (() => converter.InputStreamBufferSize = -1); + Assert.Throws (() => converter.OutputStreamBufferSize = -1); + + Assert.Throws (() => converter.Convert (null)); + Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); + Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); + } + + [Test] + public void TestDefaultPropertyValues () + { + var converter = new FlowedToText (); + + Assert.IsFalse (converter.DeleteSpace, "DeleteSpace"); + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + [Test] + public void TestSimpleFlowedToText () + { + string expected = "This is some sample text that has been formatted " + + "according to the format=flowed rules defined in rfc3676. " + + "This text, once converted, should all be on a single line." + Environment.NewLine; + string text = "This is some sample text that has been formatted " + Environment.NewLine + + "according to the format=flowed rules defined in rfc3676. " + Environment.NewLine + + "This text, once converted, should all be on a single line." + Environment.NewLine; + var converter = new FlowedToText { Header = null, Footer = null }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestQuotedFlowedToText () + { + string expected = "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + + "> reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + + ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + + ">>> unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + + ">>>> enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + + ">>>>> styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + var converter = new FlowedToText { Header = null, Footer = null }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestBrokenQuotedFlowedToText () + { + // Note: this is the brokenly quoted sample from rfc3676 at the end of section 4.5 + string expected = "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg! " + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + + "> reeky elf-skinned pigeon-egg! " + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + + ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + + ">>> unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + + ">>>> enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + + ">>>>> styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + var converter = new FlowedToText { Header = null, Footer = null }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + } +} diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index 64b459e661..a8046db084 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -62,9 +62,6 @@ public void TestArgumentExceptions () AssertArgumentExceptions (new TextToFlowed ()); AssertArgumentExceptions (new TextToHtml ()); - AssertArgumentExceptions (new FlowedToText ()); - AssertArgumentExceptions (new FlowedToHtml ()); - AssertArgumentExceptions (new HtmlToHtml ()); } @@ -86,185 +83,9 @@ public void TestDefaultPropertyValues () AssertDefaultPropertyValues (new TextToFlowed ()); AssertDefaultPropertyValues (new TextToHtml ()); - AssertDefaultPropertyValues (new FlowedToText ()); - AssertDefaultPropertyValues (new FlowedToHtml ()); - AssertDefaultPropertyValues (new HtmlToHtml ()); } - [Test] - public void TestSimpleFlowedToText () - { - string expected = "This is some sample text that has been formatted " + - "according to the format=flowed rules defined in rfc3676. " + - "This text, once converted, should all be on a single line." + Environment.NewLine; - string text = "This is some sample text that has been formatted " + Environment.NewLine + - "according to the format=flowed rules defined in rfc3676. " + Environment.NewLine + - "This text, once converted, should all be on a single line." + Environment.NewLine; - var converter = new FlowedToText { Header = null, Footer = null }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestQuotedFlowedToText () - { - string expected = "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + - "> reeky elf-skinned pigeon-egg!" + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + - ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + - ">>> unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + - ">>>> enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + - ">>>>> styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToText { Header = null, Footer = null }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestBrokenQuotedFlowedToText () - { - // Note: this is the brokenly quoted sample from rfc3676 at the end of section 4.5 - string expected = "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg! " + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + - "> reeky elf-skinned pigeon-egg! " + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + - ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + - ">>> unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + - ">>>> enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + - ">>>>> styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToText { Header = null, Footer = null }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestSimpleFlowedToHtml () - { - string expected = "

This is some sample text that has been formatted " + - "according to the format=flowed rules defined in rfc3676. " + - "This text, once converted, should all be on a single line.

" + Environment.NewLine + - "
" + Environment.NewLine + - "
" + Environment.NewLine + - "
" + Environment.NewLine + - "
" + Environment.NewLine + - "

And this line of text should be separate by 4 blank lines.

" + Environment.NewLine; - string text = "This is some sample text that has been formatted " + Environment.NewLine + - "according to the format=flowed rules defined in rfc3676. " + Environment.NewLine + - "This text, once converted, should all be on a single line." + Environment.NewLine + - Environment.NewLine + - Environment.NewLine + - Environment.NewLine + - Environment.NewLine + - "And this line of text should be separate by 4 blank lines." + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestQuotedFlowedToHtml () - { - string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + - "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + - "

Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!

" + Environment.NewLine + - "

Henceforth, the coding style is to be strictly enforced, including the use of only upper case.

" + Environment.NewLine + - "

I've noticed a lack of adherence to the coding styles, of late.

" + Environment.NewLine + - "

Any complaints?

" + Environment.NewLine + - "
"; - string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + - "> reeky elf-skinned pigeon-egg!" + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + - ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + - ">>> unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + - ">>>> enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + - ">>>>> styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestBrokenQuotedFlowedToHtml () - { - // Note: this is the brokenly quoted sample from rfc3676 at the end of section 4.5 - string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + - "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + - "

Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!

" + Environment.NewLine + - "

Henceforth, the coding style is to be strictly enforced, including the use of only upper case.

" + Environment.NewLine + - "

I've noticed a lack of adherence to the coding styles, of late.

" + Environment.NewLine + - "

Any complaints?

" + Environment.NewLine + - "
"; - string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + - "> reeky elf-skinned pigeon-egg! " + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + - ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + - ">>> unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + - ">>>> enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + - ">>>>> styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestSimpleFlowedWithUrlsToHtml () - { - string expected = "

Check out http://www.xamarin.com - it's amazing!

" + Environment.NewLine; - string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - [Test] public void TestSimpleTextToText () { diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index b7cf1ef86f..816718230b 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -104,6 +104,8 @@ + + From 9f46bcca48dd3b6aa976e6d5d9b9a61397b690f3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 11 Sep 2019 08:57:02 -0400 Subject: [PATCH 381/741] Added more TextConverter unit tests --- UnitTests/Text/FlowedToHtmlTests.cs | 4 + UnitTests/Text/FlowedToTextTests.cs | 4 + UnitTests/Text/HtmlToHtmlTests.cs | 78 +++++++++++-- UnitTests/Text/TextConverterTests.cs | 168 ++------------------------- UnitTests/Text/TextToFlowedTests.cs | 108 +++++++++++++++++ UnitTests/Text/TextToHtmlTests.cs | 71 +++++++++-- UnitTests/Text/TextToTextTests.cs | 92 +++++++++++++++ UnitTests/UnitTests.csproj | 2 + 8 files changed, 354 insertions(+), 173 deletions(-) create mode 100644 UnitTests/Text/TextToFlowedTests.cs create mode 100644 UnitTests/Text/TextToTextTests.cs diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs index 03b0a0bddb..19ad788c5f 100644 --- a/UnitTests/Text/FlowedToHtmlTests.cs +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -40,6 +40,8 @@ public class FlowedToHtmlTests public void TestArgumentExceptions () { var converter = new FlowedToHtml (); + var reader = new StringReader (""); + var writer = new StringWriter (); Assert.Throws (() => converter.InputEncoding = null); Assert.Throws (() => converter.OutputEncoding = null); @@ -52,6 +54,8 @@ public void TestArgumentExceptions () Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, writer)); + Assert.Throws (() => converter.Convert (reader, (TextWriter) null)); Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); diff --git a/UnitTests/Text/FlowedToTextTests.cs b/UnitTests/Text/FlowedToTextTests.cs index 335cb0c9e4..feabffe243 100644 --- a/UnitTests/Text/FlowedToTextTests.cs +++ b/UnitTests/Text/FlowedToTextTests.cs @@ -40,6 +40,8 @@ public class FlowedToTextTests public void TestArgumentExceptions () { var converter = new FlowedToText (); + var reader = new StringReader (""); + var writer = new StringWriter (); Assert.Throws (() => converter.InputEncoding = null); Assert.Throws (() => converter.OutputEncoding = null); @@ -52,6 +54,8 @@ public void TestArgumentExceptions () Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, writer)); + Assert.Throws (() => converter.Convert (reader, (TextWriter) null)); Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index 8915f03cb4..417ae9e041 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -43,18 +43,78 @@ public void TestArgumentExceptions () var reader = new StringReader (""); var writer = new StringWriter (); - Assert.AreEqual (TextFormat.Html, converter.InputFormat); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat); - Assert.IsFalse (converter.DetectEncodingFromByteOrderMark); - Assert.IsFalse (converter.FilterComments); - Assert.IsFalse (converter.FilterHtml); - Assert.IsNull (converter.Footer); - Assert.IsNull (converter.Header); - Assert.AreEqual (HeaderFooterFormat.Text, converter.FooterFormat); - Assert.AreEqual (HeaderFooterFormat.Text, converter.HeaderFormat); + Assert.Throws (() => converter.InputEncoding = null); + Assert.Throws (() => converter.OutputEncoding = null); + Assert.Throws (() => converter.InputStreamBufferSize = -1); + Assert.Throws (() => converter.OutputStreamBufferSize = -1); + + Assert.Throws (() => converter.Convert (null)); + Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); Assert.Throws (() => converter.Convert ((TextReader) null, writer)); Assert.Throws (() => converter.Convert (reader, (TextWriter) null)); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); + Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); + } + + [Test] + public void TestDefaultPropertyValues () + { + var converter = new HtmlToHtml (); + + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsFalse (converter.FilterComments, "FilterComments"); + Assert.IsFalse (converter.FilterHtml, "FilterHtml"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.AreEqual (HeaderFooterFormat.Text, converter.FooterFormat, "FooterFormat"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (HeaderFooterFormat.Text, converter.HeaderFormat, "HeaderFormat"); + Assert.IsNull (converter.HtmlTagCallback, "HtmlTagCallback"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (TextFormat.Html, converter.InputFormat, "InputFormat"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + void ReplaceUrlsWithFileNames (HtmlTagContext ctx, HtmlWriter htmlWriter) + { + if (ctx.TagId == HtmlTagId.Image) { + htmlWriter.WriteEmptyElementTag (ctx.TagName); + ctx.DeleteEndTag = true; + + for (int i = 0; i < ctx.Attributes.Count; i++) { + var attr = ctx.Attributes[i]; + + if (attr.Id == HtmlAttributeId.Src) { + var fileName = Path.GetFileName (attr.Value); + htmlWriter.WriteAttributeName (attr.Name); + htmlWriter.WriteAttributeValue (fileName); + } else { + htmlWriter.WriteAttribute (attr); + } + } + } else { + ctx.WriteTag (htmlWriter, true); + } + } + + [Test] + public void TestSimpleHtmlToHtml () + { + string expected = File.ReadAllText ("../../TestData/html/xamarin3.xhtml"); + string text = File.ReadAllText ("../../TestData/html/xamarin3.html"); + var converter = new HtmlToHtml { Header = null, Footer = null, HtmlTagCallback = ReplaceUrlsWithFileNames }; + var result = converter.Convert (text); + + Assert.AreEqual (TextFormat.Html, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (expected, result); } void SupressInnerContentCallback (HtmlTagContext ctx, HtmlWriter htmlWriter) diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index a8046db084..fe01b71c0e 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -36,168 +36,24 @@ namespace UnitTests.Text { [TestFixture] public class TextConverterTests { - void AssertArgumentExceptions (TextConverter converter) - { - Assert.Throws (() => converter.InputEncoding = null); - Assert.Throws (() => converter.OutputEncoding = null); - - Assert.Throws (() => converter.InputStreamBufferSize = -1); - Assert.Throws (() => converter.OutputStreamBufferSize = -1); - - Assert.Throws (() => converter.Convert (null)); - Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); - Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); - Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); - Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); - Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); - Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); - Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); - Assert.Throws (() => converter.Convert ((TextReader) null, new StreamWriter (Stream.Null))); - } - - [Test] - public void TestArgumentExceptions () - { - AssertArgumentExceptions (new TextToText ()); - AssertArgumentExceptions (new TextToFlowed ()); - AssertArgumentExceptions (new TextToHtml ()); - - AssertArgumentExceptions (new HtmlToHtml ()); - } - - void AssertDefaultPropertyValues (TextConverter converter) - { - Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); - Assert.IsNull (converter.Footer, "Footer"); - Assert.IsNull (converter.Header, "Header"); - Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); - Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); - Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); - Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); - } - - [Test] - public void TestDefaultPropertyValues () - { - AssertDefaultPropertyValues (new TextToText ()); - AssertDefaultPropertyValues (new TextToFlowed ()); - AssertDefaultPropertyValues (new TextToHtml ()); - - AssertDefaultPropertyValues (new HtmlToHtml ()); - } - - [Test] - public void TestSimpleTextToText () - { - string expected = "This is some sample text. This is line #1." + Environment.NewLine + - "This is line #2." + Environment.NewLine + - "And this is line #3." + Environment.NewLine; - string text = "This is some sample text. This is line #1." + Environment.NewLine + - "This is line #2." + Environment.NewLine + - "And this is line #3." + Environment.NewLine; - var converter = new TextToText { Header = null, Footer = null }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - [Test] - public void TestSimpleTextToFlowed () + public void TestPropertySetters () { - string expected = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned " + Environment.NewLine + - "> pigeon-egg!" + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly enforced, including " + Environment.NewLine + - ">>>> the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - string text = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + - ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + - ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + - ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + - ">>>>>> Any complaints?" + Environment.NewLine; - TextConverter converter = new TextToFlowed { Header = null, Footer = null }; - string result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Flowed, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); + var latin1 = Encoding.GetEncoding ("iso-8859-1"); + var utf16 = Encoding.Unicode; + var converter = new TextToText (); - converter = new FlowedToText { DeleteSpace = true }; - result = converter.Convert (expected); + converter.InputEncoding = latin1; + Assert.AreEqual (latin1, converter.InputEncoding, "InputEncoding"); - Assert.AreEqual (TextFormat.Flowed, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (text, result); - } + converter.InputStreamBufferSize = 5000; + Assert.AreEqual (5000, converter.InputStreamBufferSize, "InputStreamBufferSize"); - [Test] - public void TestSimpleTextToHtml () - { - const string expected = "This is some sample text. This is line #1.
" + - "This is line #2.
" + - "And this is line #3.
"; - string text = "This is some sample text. This is line #1." + Environment.NewLine + - "This is line #2." + Environment.NewLine + - "And this is line #3." + Environment.NewLine; - var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - [Test] - public void TestSimpleTextWithUrlsToHtml () - { - const string expected = "Check out http://www.xamarin.com - it's amazing!
"; - string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; - var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; - var result = converter.Convert (text); - - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); - } - - void ReplaceUrlsWithFileNames (HtmlTagContext ctx, HtmlWriter htmlWriter) - { - if (ctx.TagId == HtmlTagId.Image) { - htmlWriter.WriteEmptyElementTag (ctx.TagName); - ctx.DeleteEndTag = true; - - for (int i = 0; i < ctx.Attributes.Count; i++) { - var attr = ctx.Attributes[i]; - - if (attr.Id == HtmlAttributeId.Src) { - var fileName = Path.GetFileName (attr.Value); - htmlWriter.WriteAttributeName (attr.Name); - htmlWriter.WriteAttributeValue (fileName); - } else { - htmlWriter.WriteAttribute (attr); - } - } - } else { - ctx.WriteTag (htmlWriter, true); - } - } - - [Test] - public void TestSimpleHtmlToHtml () - { - string expected = File.ReadAllText ("../../TestData/html/xamarin3.xhtml"); - string text = File.ReadAllText ("../../TestData/html/xamarin3.html"); - var converter = new HtmlToHtml { Header = null, Footer = null, HtmlTagCallback = ReplaceUrlsWithFileNames }; - var result = converter.Convert (text); + converter.OutputEncoding = utf16; + Assert.AreEqual (utf16, converter.OutputEncoding, "OutputEncoding"); - Assert.AreEqual (TextFormat.Html, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); - Assert.AreEqual (expected, result); + converter.InputStreamBufferSize = 6000; + Assert.AreEqual (6000, converter.InputStreamBufferSize, "InputStreamBufferSize"); } } } diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs new file mode 100644 index 0000000000..47e22e0516 --- /dev/null +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -0,0 +1,108 @@ +// +// TextToFlowedTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class TextToFlowedTests + { + [Test] + public void TestArgumentExceptions () + { + var converter = new TextToFlowed (); + var reader = new StringReader (""); + var writer = new StringWriter (); + + Assert.Throws (() => converter.InputEncoding = null); + Assert.Throws (() => converter.OutputEncoding = null); + + Assert.Throws (() => converter.InputStreamBufferSize = -1); + Assert.Throws (() => converter.OutputStreamBufferSize = -1); + + Assert.Throws (() => converter.Convert (null)); + Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, writer)); + Assert.Throws (() => converter.Convert (reader, (TextWriter) null)); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); + Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); + } + + [Test] + public void TestDefaultPropertyValues () + { + var converter = new TextToFlowed (); + + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (TextFormat.Flowed, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + [Test] + public void TestSimpleTextToFlowed () + { + string expected = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned " + Environment.NewLine + + "> pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including " + Environment.NewLine + + ">>>> the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + string text = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + TextConverter converter = new TextToFlowed { Header = null, Footer = null }; + string result = converter.Convert (text); + + Assert.AreEqual (expected, result); + + converter = new FlowedToText { DeleteSpace = true }; + result = converter.Convert (expected); + + Assert.AreEqual (text, result); + } + } +} diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index 51b0b8a8b5..16e4e2711f 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -44,17 +44,42 @@ public void TestArgumentExceptions () var reader = new StringReader (""); var writer = new StringWriter (); - Assert.AreEqual (TextFormat.Plain, converter.InputFormat); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat); - Assert.IsFalse (converter.DetectEncodingFromByteOrderMark); - Assert.IsFalse (converter.OutputHtmlFragment); - Assert.IsNull (converter.Footer); - Assert.IsNull (converter.Header); - Assert.AreEqual (HeaderFooterFormat.Text, converter.FooterFormat); - Assert.AreEqual (HeaderFooterFormat.Text, converter.HeaderFormat); + Assert.Throws (() => converter.InputEncoding = null); + Assert.Throws (() => converter.OutputEncoding = null); + Assert.Throws (() => converter.InputStreamBufferSize = -1); + Assert.Throws (() => converter.OutputStreamBufferSize = -1); + + Assert.Throws (() => converter.Convert (null)); + Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); Assert.Throws (() => converter.Convert ((TextReader) null, writer)); Assert.Throws (() => converter.Convert (reader, (TextWriter) null)); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); + Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); + } + + [Test] + public void TestDefaultPropertyValues () + { + var converter = new TextToHtml (); + + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.AreEqual (HeaderFooterFormat.Text, converter.FooterFormat, "FooterFormat"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (HeaderFooterFormat.Text, converter.HeaderFormat, "HeaderFormat"); + Assert.IsNull (converter.HtmlTagCallback, "HtmlTagCallback"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); + Assert.IsFalse (converter.OutputHtmlFragment, "OutputHtmlFragment"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); } [Test] @@ -107,5 +132,35 @@ public void TestEmoji () Assert.AreEqual (expected, result); } + + [Test] + public void TestSimpleTextToHtml () + { + const string expected = "This is some sample text. This is line #1.
" + + "This is line #2.
" + + "And this is line #3.
"; + string text = "This is some sample text. This is line #1." + Environment.NewLine + + "This is line #2." + Environment.NewLine + + "And this is line #3." + Environment.NewLine; + var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (expected, result); + } + + [Test] + public void TestSimpleTextWithUrlsToHtml () + { + const string expected = "Check out http://www.xamarin.com - it's amazing!
"; + string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; + var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (expected, result); + } } } diff --git a/UnitTests/Text/TextToTextTests.cs b/UnitTests/Text/TextToTextTests.cs new file mode 100644 index 0000000000..1a0428c7cb --- /dev/null +++ b/UnitTests/Text/TextToTextTests.cs @@ -0,0 +1,92 @@ +// +// TextToTextTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class TextToTextTests + { + [Test] + public void TestArgumentExceptions () + { + var converter = new TextToText (); + + Assert.Throws (() => converter.InputEncoding = null); + Assert.Throws (() => converter.OutputEncoding = null); + + Assert.Throws (() => converter.InputStreamBufferSize = -1); + Assert.Throws (() => converter.OutputStreamBufferSize = -1); + + Assert.Throws (() => converter.Convert (null)); + Assert.Throws (() => converter.Convert ((Stream) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (Stream) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, Stream.Null)); + Assert.Throws (() => converter.Convert (Stream.Null, (TextWriter) null)); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (Stream) null)); + Assert.Throws (() => converter.Convert ((Stream) null, new StreamWriter (Stream.Null))); + Assert.Throws (() => converter.Convert (new StreamReader (Stream.Null), (TextWriter) null)); + Assert.Throws (() => converter.Convert ((TextReader) null, new StreamWriter (Stream.Null))); + } + + [Test] + public void TestDefaultPropertyValues () + { + var converter = new TextToText (); + + Assert.IsFalse (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); + Assert.IsNull (converter.Footer, "Footer"); + Assert.IsNull (converter.Header, "Header"); + Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); + Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + [Test] + public void TestSimpleTextToText () + { + string expected = "This is some sample text. This is line #1." + Environment.NewLine + + "This is line #2." + Environment.NewLine + + "And this is line #3." + Environment.NewLine; + string text = "This is some sample text. This is line #1." + Environment.NewLine + + "This is line #2." + Environment.NewLine + + "And this is line #3." + Environment.NewLine; + var converter = new TextToText { Header = null, Footer = null }; + var result = converter.Convert (text); + + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); + Assert.AreEqual (expected, result); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 816718230b..71c4d4a04f 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -115,7 +115,9 @@ + + From 561d2aa02db1dca958e0afe565be35e384573d8b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 11 Sep 2019 09:34:57 -0400 Subject: [PATCH 382/741] Removed FlowedToHtml.Header & Footer properties (they are on TextConverter now) --- MimeKit/Text/FlowedToHtml.cs | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/MimeKit/Text/FlowedToHtml.cs b/MimeKit/Text/FlowedToHtml.cs index 1679e2fdc3..ca8be5d474 100644 --- a/MimeKit/Text/FlowedToHtml.cs +++ b/MimeKit/Text/FlowedToHtml.cs @@ -97,18 +97,6 @@ public bool DeleteSpace { get; set; } - /// - /// Get or set the text that will be appended to the end of the output. - /// - /// - /// Gets or sets the text that will be appended to the end of the output. - /// The footer must be set before conversion begins. - /// - /// The footer. - public string Footer { - get; set; - } - /// /// Get or set the footer format. /// @@ -120,18 +108,6 @@ public HeaderFooterFormat FooterFormat { get; set; } - /// - /// Get or set text that will be prepended to the beginning of the output. - /// - /// - /// Gets or sets the text that will be prepended to the beginning of the output. - /// The header must be set before conversion begins. - /// - /// The header. - public string Header { - get; set; - } - /// /// Get or set the header format. /// From 1c68ef9085a7cab8f58932e14a9c665337861cd6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 11 Sep 2019 10:11:16 -0400 Subject: [PATCH 383/741] Fixed a broken unit test --- UnitTests/Cryptography/AuthenticationResultsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 9a96f4d885..da969a5454 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -171,7 +171,7 @@ public void TestEncodeLongResultMethodWithVersionAndCommentAndReason () authres.Results.Add (new AuthenticationMethodResult ("really-really-really-long-method-name", "really-really-really-long-value") { ResultComment = "this is a really really long result comment", - Action = "this is a really really really long reason", + Reason = "this is a really really really long reason", Version = 214748367 }); authres.Results[0].Properties.Add (new AuthenticationMethodProperty ("this-is-a-really-really-long-ptype", "this-is-a-really-really-long-property", "this-is-a-really-really-long-value")); From 647d2df3003bf405ec7ea2487a7db3873fa70efe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 12 Sep 2019 20:23:08 -0400 Subject: [PATCH 384/741] Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty Fixes issue #506 --- MimeKit/BodyBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index 495d9b7500..813ef12927 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -130,7 +130,7 @@ public MimeEntity ToMessageBody () var text = new TextPart ("plain"); text.Text = TextBody; - if (!string.IsNullOrEmpty (HtmlBody)) { + if (HtmlBody != null) { alternative = new MultipartAlternative (); alternative.Add (text); body = alternative; From 4fbd8d82e50b3ec738049013a66030fe4d46eacf Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 12 Sep 2019 20:45:39 -0400 Subject: [PATCH 385/741] Added more FlowedToHtml unit tests --- UnitTests/Text/FlowedToHtmlTests.cs | 67 ++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs index 19ad788c5f..6fc56b66f3 100644 --- a/UnitTests/Text/FlowedToHtmlTests.cs +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -101,14 +101,14 @@ public void TestSimpleFlowedToHtml () Environment.NewLine + Environment.NewLine + "And this line of text should be separate by 4 blank lines." + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var converter = new FlowedToHtml { OutputHtmlFragment = true }; var result = converter.Convert (text); Assert.AreEqual (expected, result); } [Test] - public void TestQuotedFlowedToHtml () + public void TestIncreasingQuoteLevels () { string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + @@ -128,14 +128,41 @@ public void TestQuotedFlowedToHtml () ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + ">>>>> styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var converter = new FlowedToHtml { OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestDecreasingQuoteLevels () + { + string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + + "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + + "

Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!

" + Environment.NewLine + + "

Henceforth, the coding style is to be strictly enforced, including the use of only upper case.

" + Environment.NewLine + + "

I've noticed a lack of adherence to the coding styles, of late.

" + Environment.NewLine + + "

Any complaints?

" + Environment.NewLine + + "
"; + string text = ">>>>>> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + + ">>>>>> reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">>>>> Thou artless swag-bellied milk-livered " + Environment.NewLine + + ">>>>> dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + + ">>>> unmuzzled ratsbane!" + Environment.NewLine + + ">>> Henceforth, the coding style is to be strictly " + Environment.NewLine + + ">>> enforced, including the use of only upper case." + Environment.NewLine + + ">> I've noticed a lack of adherence to the coding " + Environment.NewLine + + ">> styles, of late." + Environment.NewLine + + "> Any complaints?" + Environment.NewLine; + var converter = new FlowedToHtml { OutputHtmlFragment = true }; var result = converter.Convert (text); Assert.AreEqual (expected, result); } [Test] - public void TestBrokenQuotedFlowedToHtml () + public void TestBrokenlyQuotedText () { // Note: this is the brokenly quoted sample from rfc3676 at the end of section 4.5 string expected = "

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + @@ -156,7 +183,37 @@ public void TestBrokenQuotedFlowedToHtml () ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + ">>>>> styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; - var converter = new FlowedToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var converter = new FlowedToHtml { OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestTextHeaderAndFooter () + { + string expected = "On <date>, so-and-so said:

Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!

" + Environment.NewLine + + "

Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!

" + Environment.NewLine + + "

Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!

" + Environment.NewLine + + "

Henceforth, the coding style is to be strictly enforced, including the use of only upper case.

" + Environment.NewLine + + "

I've noticed a lack of adherence to the coding styles, of late.

" + Environment.NewLine + + "

Any complaints?

" + Environment.NewLine + + "
Tha-tha-tha-tha that's all, folks!
"; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed " + Environment.NewLine + + "> reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered " + Environment.NewLine + + ">> dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe " + Environment.NewLine + + ">>> unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly " + Environment.NewLine + + ">>>> enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding " + Environment.NewLine + + ">>>>> styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + var converter = new FlowedToHtml { + Header = "On , so-and-so said:" + Environment.NewLine, + Footer = "Tha-tha-tha-tha that's all, folks!" + Environment.NewLine + }; var result = converter.Convert (text); Assert.AreEqual (expected, result); From 93810a40e391b771a7c0be6c451593824964de60 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 12 Sep 2019 21:41:29 -0400 Subject: [PATCH 386/741] More unit tests for TextToFlowed and some fixes --- MimeKit/Text/FlowedToHtml.cs | 2 +- MimeKit/Text/TextToFlowed.cs | 2 +- UnitTests/Text/FlowedToHtmlTests.cs | 5 +++- UnitTests/Text/TextToFlowedTests.cs | 36 +++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/MimeKit/Text/FlowedToHtml.cs b/MimeKit/Text/FlowedToHtml.cs index ca8be5d474..dfdbf444b2 100644 --- a/MimeKit/Text/FlowedToHtml.cs +++ b/MimeKit/Text/FlowedToHtml.cs @@ -87,7 +87,7 @@ public override TextFormat OutputFormat { /// The flowed text format defines a Content-Type parameter called "delsp" which can /// have a value of "yes" or "no". If the parameter exists and the value is "yes", then /// should be set to true, otherwise - /// should be set to false. + /// should be set to false. /// /// /// diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index 46c4692f24..e987b90b95 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -115,7 +115,7 @@ static string GetFlowedLine (StringBuilder flowed, string line, ref int index, i flowed.Append ('>', quoteDepth); // Space-stuffed lines which start with a space, "From ", or ">". - if (quoteDepth > 0 || StartsWith (line, index, "From ")) + if (quoteDepth > 0 || (line.Length > 0 && line[0] == ' ') || StartsWith (line, index, "From ")) flowed.Append (' '); if (flowed.Length + (line.Length - index) <= MaxLineLength) { diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs index 6fc56b66f3..a94d683574 100644 --- a/UnitTests/Text/FlowedToHtmlTests.cs +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -212,7 +212,10 @@ public void TestTextHeaderAndFooter () ">>>>>> Any complaints?" + Environment.NewLine; var converter = new FlowedToHtml { Header = "On , so-and-so said:" + Environment.NewLine, - Footer = "Tha-tha-tha-tha that's all, folks!" + Environment.NewLine + HeaderFormat = HeaderFooterFormat.Text, + Footer = "Tha-tha-tha-tha that's all, folks!" + Environment.NewLine, + FooterFormat = HeaderFooterFormat.Text, + HtmlTagCallback = null }; var result = converter.Convert (text); diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index 47e22e0516..2c64f1f9eb 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -104,5 +104,41 @@ public void TestSimpleTextToFlowed () Assert.AreEqual (text, result); } + + [Test] + public void TestSpaceStuffingFromLine () + { + string expected = "My favorite James Bond movie is" + Environment.NewLine + + " From Russia with love." + Environment.NewLine; + string text = "My favorite James Bond movie is" + Environment.NewLine + + "From Russia with love." + Environment.NewLine; + TextConverter converter = new TextToFlowed (); + string result = converter.Convert (text); + + Assert.AreEqual (expected, result); + + converter = new FlowedToText (); + result = converter.Convert (expected); + + Assert.AreEqual (text, result); + } + + [Test] + public void TestSpaceStuffingLinesStartingWithSpace () + { + string expected = "This is a regular line." + Environment.NewLine + + " This line starts with a space." + Environment.NewLine; + string text = "This is a regular line." + Environment.NewLine + + " This line starts with a space." + Environment.NewLine; + TextConverter converter = new TextToFlowed (); + string result = converter.Convert (text); + + Assert.AreEqual (expected, result); + + converter = new FlowedToText (); + result = converter.Convert (expected); + + Assert.AreEqual (text, result); + } } } From a004e62bc91632cd7e4f1541130416e5c4683f3e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 09:07:42 -0400 Subject: [PATCH 387/741] Added more TextConverter unit tests --- MimeKit/Text/HtmlToHtml.cs | 4 +- UnitTests/Text/HtmlToHtmlTests.cs | 17 +++++++ UnitTests/Text/TextToHtmlTests.cs | 74 ++++++++++++++++++++++++++++--- UnitTests/Text/TextToTextTests.cs | 17 +++++-- 4 files changed, 101 insertions(+), 11 deletions(-) diff --git a/MimeKit/Text/HtmlToHtml.cs b/MimeKit/Text/HtmlToHtml.cs index 8c7e29d840..7bffc34936 100644 --- a/MimeKit/Text/HtmlToHtml.cs +++ b/MimeKit/Text/HtmlToHtml.cs @@ -252,7 +252,7 @@ public override void Convert (TextReader reader, TextWriter writer) if (!string.IsNullOrEmpty (Header)) { if (HeaderFormat == HeaderFooterFormat.Text) { - var converter = new TextToHtml (); + var converter = new TextToHtml { OutputHtmlFragment = true }; using (var sr = new StringReader (Header)) converter.Convert (sr, writer); @@ -344,7 +344,7 @@ public override void Convert (TextReader reader, TextWriter writer) if (!string.IsNullOrEmpty (Footer)) { if (FooterFormat == HeaderFooterFormat.Text) { - var converter = new TextToHtml (); + var converter = new TextToHtml { OutputHtmlFragment = true }; using (var sr = new StringReader (Footer)) converter.Convert (sr, writer); diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index 417ae9e041..8f1a7b7db5 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -201,5 +201,22 @@ public void TestHeaderFooter () Assert.AreEqual (expected, result); } + + [Test] + public void TestTextHeaderFooter () + { + const string input = "Here is the body content which seems fine so far"; + const string expected = "<html><head></head>
Here is the body content which seems fine so far</html>
"; + var converter = new HtmlToHtml { + HeaderFormat = HeaderFooterFormat.Text, + Header = "", + FooterFormat = HeaderFooterFormat.Text, + Footer = "" + }; + + var result = converter.Convert (input); + + Assert.AreEqual (expected, result); + } } } diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index 16e4e2711f..b4c0287020 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -133,6 +133,72 @@ public void TestEmoji () Assert.AreEqual (expected, result); } + [Test] + public void TestIncreasingQuoteLevels () + { + string expected = "
Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!
" + + "
Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!
" + + "
Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!
" + + "
Henceforth, the coding style is to be strictly enforced, including the use of only upper case.
" + + "
I've noticed a lack of adherence to the coding styles, of late.
" + + "
Any complaints?
" + + "
"; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?" + Environment.NewLine; + var converter = new TextToHtml { OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestIncreasingQuoteLevelsNoNewLineAtEndOfText () + { + string expected = "
Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!
" + + "
Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!
" + + "
Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!
" + + "
Henceforth, the coding style is to be strictly enforced, including the use of only upper case.
" + + "
I've noticed a lack of adherence to the coding styles, of late.
" + + "
Any complaints?
" + + "
"; + string text = "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + ">>>>>> Any complaints?"; + var converter = new TextToHtml { OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + + [Test] + public void TestDecreasingQuoteLevels () + { + string expected = "
Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!
" + + "
Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!
" + + "
Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!
" + + "
Henceforth, the coding style is to be strictly enforced, including the use of only upper case.
" + + "
I've noticed a lack of adherence to the coding styles, of late.
" + + "
Any complaints?
" + + "
"; + string text = ">>>>>> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + + ">>>>> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + + ">>>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + + ">>> Henceforth, the coding style is to be strictly enforced, including the use of only upper case." + Environment.NewLine + + ">> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + + "> Any complaints?" + Environment.NewLine; + var converter = new TextToHtml { OutputHtmlFragment = true }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + [Test] public void TestSimpleTextToHtml () { @@ -142,11 +208,9 @@ public void TestSimpleTextToHtml () string text = "This is some sample text. This is line #1." + Environment.NewLine + "This is line #2." + Environment.NewLine + "And this is line #3." + Environment.NewLine; - var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var converter = new TextToHtml { OutputHtmlFragment = true }; var result = converter.Convert (text); - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } @@ -155,11 +219,9 @@ public void TestSimpleTextWithUrlsToHtml () { const string expected = "Check out http://www.xamarin.com - it's amazing!
"; string text = "Check out http://www.xamarin.com - it's amazing!" + Environment.NewLine; - var converter = new TextToHtml { Header = null, Footer = null, OutputHtmlFragment = true }; + var converter = new TextToHtml { OutputHtmlFragment = true }; var result = converter.Convert (text); - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Html, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } } diff --git a/UnitTests/Text/TextToTextTests.cs b/UnitTests/Text/TextToTextTests.cs index 1a0428c7cb..8183c1b295 100644 --- a/UnitTests/Text/TextToTextTests.cs +++ b/UnitTests/Text/TextToTextTests.cs @@ -67,11 +67,24 @@ public void TestDefaultPropertyValues () Assert.IsNull (converter.Footer, "Footer"); Assert.IsNull (converter.Header, "Header"); Assert.AreEqual (Encoding.UTF8, converter.InputEncoding, "InputEncoding"); + Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); Assert.AreEqual (Encoding.UTF8, converter.OutputEncoding, "OutputEncoding"); + Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (4096, converter.InputStreamBufferSize, "InputStreamBufferSize"); Assert.AreEqual (4096, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); } + [Test] + public void TestHeaderAndFooter () + { + string expected = "Header,Footer"; + string text = ","; + var converter = new TextToText { Header = "Header", Footer = "Footer" }; + var result = converter.Convert (text); + + Assert.AreEqual (expected, result); + } + [Test] public void TestSimpleTextToText () { @@ -81,11 +94,9 @@ public void TestSimpleTextToText () string text = "This is some sample text. This is line #1." + Environment.NewLine + "This is line #2." + Environment.NewLine + "And this is line #3." + Environment.NewLine; - var converter = new TextToText { Header = null, Footer = null }; + var converter = new TextToText (); var result = converter.Convert (text); - Assert.AreEqual (TextFormat.Text, converter.InputFormat, "InputFormat"); - Assert.AreEqual (TextFormat.Text, converter.OutputFormat, "OutputFormat"); Assert.AreEqual (expected, result); } } From 5a898d97527e4baca2cbb92ea9937c454e13ae53 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 09:35:06 -0400 Subject: [PATCH 388/741] Added more Trie unit tests --- MimeKit/Text/Trie.cs | 6 ++++++ UnitTests/Text/TrieTests.cs | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/MimeKit/Text/Trie.cs b/MimeKit/Text/Trie.cs index 753252bc34..990acc2355 100644 --- a/MimeKit/Text/Trie.cs +++ b/MimeKit/Text/Trie.cs @@ -324,6 +324,9 @@ public int Search (char[] text, int startIndex, int count, out string pattern) /// public int Search (char[] text, int startIndex, out string pattern) { + if (text == null) + throw new ArgumentNullException (nameof (text)); + return Search (text, startIndex, text.Length - startIndex, out pattern); } @@ -341,6 +344,9 @@ public int Search (char[] text, int startIndex, out string pattern) /// public int Search (char[] text, out string pattern) { + if (text == null) + throw new ArgumentNullException (nameof (text)); + return Search (text, 0, text.Length, out pattern); } } diff --git a/UnitTests/Text/TrieTests.cs b/UnitTests/Text/TrieTests.cs index 80828a6725..68747c62a4 100644 --- a/UnitTests/Text/TrieTests.cs +++ b/UnitTests/Text/TrieTests.cs @@ -56,6 +56,28 @@ public class TrieTests "I've attached a file (file:///cvs/gmime/gmime/gtrie.c)", }; + [Test] + public void TestArgumentExceptions () + { + var text = TestCases[0].ToCharArray (); + var trie = new Trie (); + string pattern; + + Assert.Throws (() => trie.Add (null)); + Assert.Throws (() => trie.Add (string.Empty)); + + for (int i = 0; i < TriePatterns.Length; i++) + trie.Add (TriePatterns[i]); + + Assert.Throws (() => trie.Search (null, out pattern)); + Assert.Throws (() => trie.Search (null, 0, out pattern)); + Assert.Throws (() => trie.Search (null, 0, 0, out pattern)); + + Assert.Throws (() => trie.Search (text, -1, out pattern)); + Assert.Throws (() => trie.Search (text, -1, text.Length, out pattern)); + Assert.Throws (() => trie.Search (text, 0, -1, out pattern)); + } + [Test] public void TestTrie () { From d0610883780534c189c0f309be0a7b33a8b00ce2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 09:59:04 -0400 Subject: [PATCH 389/741] Added HtmlTagIdExtension tests --- UnitTests/ArgumentExceptionTests.cs | 2 +- UnitTests/AssortedTests.cs | 2 +- UnitTests/AttachmentCollectionTests.cs | 2 +- UnitTests/ConstructorTests.cs | 2 +- UnitTests/ContentDispositionTests.cs | 2 +- UnitTests/ContentObjectTests.cs | 2 +- UnitTests/ContentTypeTests.cs | 2 +- .../Cryptography/ApplicationPkcs7MimeTests.cs | 2 +- .../AsymmetricAlgorithmExtensionTests.cs | 2 +- .../Cryptography/CertificateExtensionTests.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 2 +- UnitTests/Cryptography/CmsSignerTests.cs | 2 +- .../DefaultSecureMimeContextTests.cs | 2 +- .../DkimRelaxedBodyFilterTests.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 2 +- UnitTests/Cryptography/DummyOpenPgpContext.cs | 2 +- UnitTests/Cryptography/LdapUriTests.cs | 2 +- UnitTests/Cryptography/PgpMimeTests.cs | 2 +- .../SecureMimeDigitalCertificateTests.cs | 2 +- UnitTests/Cryptography/SecureMimeTests.cs | 2 +- .../Cryptography/X509CertificateChainTests.cs | 2 +- .../X509CertificateRecordTests.cs | 2 +- .../Cryptography/X509CertificateStoreTests.cs | 2 +- UnitTests/DomainListTests.cs | 2 +- UnitTests/Encodings/EncoderTests.cs | 2 +- UnitTests/Encodings/YEncodingTests.cs | 2 +- UnitTests/ExceptionTests.cs | 2 +- UnitTests/FormatOptionsTests.cs | 2 +- UnitTests/GroupAddressTests.cs | 2 +- UnitTests/HeaderListTests.cs | 2 +- UnitTests/HeaderTests.cs | 2 +- UnitTests/HtmlPreviewVisitor.cs | 2 +- UnitTests/IO/BoundStreamTests.cs | 2 +- UnitTests/IO/CanReadWriteSeekStream.cs | 2 +- UnitTests/IO/ChainedStreamTests.cs | 2 +- UnitTests/IO/FilteredStreamTests.cs | 2 +- UnitTests/IO/Filters/FilterTests.cs | 2 +- UnitTests/IO/MeasuringStreamTests.cs | 2 +- UnitTests/IO/MemoryBlockStreamTests.cs | 2 +- UnitTests/IO/ReadOneByteStream.cs | 2 +- UnitTests/IO/TimeoutStream.cs | 2 +- UnitTests/InternetAddressListTests.cs | 2 +- UnitTests/InternetAddressTests.cs | 2 +- UnitTests/MailboxAddressTests.cs | 2 +- UnitTests/MessageDeliveryStatusTests.cs | 2 +- .../MessageDispositionNotificiationTests.cs | 2 +- UnitTests/MessageIdListTests.cs | 2 +- UnitTests/MessagePartialTests.cs | 2 +- UnitTests/MimeIteratorTests.cs | 2 +- UnitTests/MimeMessageTests.cs | 2 +- UnitTests/MimeParserTests.cs | 2 +- UnitTests/MimePartTests.cs | 2 +- UnitTests/MimeTypeTests.cs | 2 +- UnitTests/MimeVisitorTests.cs | 2 +- UnitTests/MultipartAlternativeTests.cs | 2 +- UnitTests/MultipartRelatedTests.cs | 2 +- UnitTests/MultipartReportTests.cs | 2 +- UnitTests/MultipartTests.cs | 2 +- UnitTests/ParameterListTests.cs | 2 +- UnitTests/ParameterTests.cs | 2 +- UnitTests/ParserOptionsTests.cs | 2 +- UnitTests/Text/FlowedToHtmlTests.cs | 2 +- UnitTests/Text/FlowedToTextTests.cs | 2 +- UnitTests/Text/HtmlAttributeTests.cs | 2 +- UnitTests/Text/HtmlEntityDecoderTests.cs | 3 +- UnitTests/Text/HtmlTagIdTests.cs | 62 +++++++++++++++++++ UnitTests/Text/HtmlToHtmlTests.cs | 2 +- UnitTests/Text/HtmlTokenTests.cs | 2 +- UnitTests/Text/HtmlTokenizerTests.cs | 2 +- UnitTests/Text/HtmlUtilsTests.cs | 2 +- UnitTests/Text/HtmlWriterTests.cs | 2 +- UnitTests/Text/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Text/TextConverterTests.cs | 2 +- UnitTests/Text/TextToFlowedTests.cs | 2 +- UnitTests/Text/TextToHtmlTests.cs | 2 +- UnitTests/Text/TextToTextTests.cs | 2 +- UnitTests/Text/TrieTests.cs | 2 +- UnitTests/Text/UrlScannerTests.cs | 2 +- UnitTests/TextPartTests.cs | 2 +- UnitTests/TextRfc822HeadersTests.cs | 2 +- UnitTests/Tnef/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Tnef/TnefReaderStreamTests.cs | 2 +- UnitTests/Tnef/TnefReaderTests.cs | 2 +- UnitTests/Tnef/TnefTests.cs | 2 +- UnitTests/UnitTests.csproj | 1 + UnitTests/Utils/CharsetUtilsTests.cs | 2 +- UnitTests/Utils/DateParserTests.cs | 2 +- UnitTests/Utils/MimeUtilsTests.cs | 2 +- UnitTests/Utils/PackedByteArrayTests.cs | 2 +- UnitTests/Utils/ParseUtilsTests.cs | 2 +- UnitTests/Utils/Rfc2047Tests.cs | 2 +- .../Utils/StringBuilderExtensionTests.cs | 2 +- 92 files changed, 153 insertions(+), 91 deletions(-) create mode 100644 UnitTests/Text/HtmlTagIdTests.cs diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index 81c31e018c..cc712798b2 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AssortedTests.cs b/UnitTests/AssortedTests.cs index 4393c80bea..8e111c688f 100644 --- a/UnitTests/AssortedTests.cs +++ b/UnitTests/AssortedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index 2bb0612e48..15cda422ff 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ConstructorTests.cs b/UnitTests/ConstructorTests.cs index 6dd79b488f..d98dc8e651 100644 --- a/UnitTests/ConstructorTests.cs +++ b/UnitTests/ConstructorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentDispositionTests.cs b/UnitTests/ContentDispositionTests.cs index edddecc2cc..a6e4849503 100644 --- a/UnitTests/ContentDispositionTests.cs +++ b/UnitTests/ContentDispositionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentObjectTests.cs b/UnitTests/ContentObjectTests.cs index 937e8ab52a..fd3f211c96 100644 --- a/UnitTests/ContentObjectTests.cs +++ b/UnitTests/ContentObjectTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index d40c9ec1be..d741a6b65f 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs index 08ce6be579..1995018e48 100644 --- a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs +++ b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index c92dac1db4..a33971fa1f 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs index 736b293a67..0b23a58ad8 100644 --- a/UnitTests/Cryptography/CertificateExtensionTests.cs +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 3e9cedad0a..1a9a576c01 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index f7240aba79..4bd96de261 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index f705f7179a..e312740f7c 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs index d61625620d..aa59641227 100644 --- a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs +++ b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 021e23bc8b..df6cb4b40d 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DummyOpenPgpContext.cs b/UnitTests/Cryptography/DummyOpenPgpContext.cs index 02a7d4b686..db87f23806 100644 --- a/UnitTests/Cryptography/DummyOpenPgpContext.cs +++ b/UnitTests/Cryptography/DummyOpenPgpContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/LdapUriTests.cs b/UnitTests/Cryptography/LdapUriTests.cs index 812a4fb38b..cfe7bbd2da 100644 --- a/UnitTests/Cryptography/LdapUriTests.cs +++ b/UnitTests/Cryptography/LdapUriTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 93c4526e4e..d65a52137f 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs index 83a75a520f..a760021668 100644 --- a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs +++ b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index efe93c6478..0952d9a921 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index 0ccba10e0a..8420fb095e 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs index 54733160ce..5de4657f18 100644 --- a/UnitTests/Cryptography/X509CertificateRecordTests.cs +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index fe7001d06d..83afb85342 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/DomainListTests.cs b/UnitTests/DomainListTests.cs index d1ddda2cdd..798a7a1cee 100644 --- a/UnitTests/DomainListTests.cs +++ b/UnitTests/DomainListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index 8748ebdc70..0aeb8345b0 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/YEncodingTests.cs b/UnitTests/Encodings/YEncodingTests.cs index 15a14726a3..997dbca66d 100644 --- a/UnitTests/Encodings/YEncodingTests.cs +++ b/UnitTests/Encodings/YEncodingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ExceptionTests.cs b/UnitTests/ExceptionTests.cs index 2d20009deb..958f949ab2 100644 --- a/UnitTests/ExceptionTests.cs +++ b/UnitTests/ExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/FormatOptionsTests.cs b/UnitTests/FormatOptionsTests.cs index b461f189a7..67bb5d39ff 100644 --- a/UnitTests/FormatOptionsTests.cs +++ b/UnitTests/FormatOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index d3e39c150d..0b74c226cc 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderListTests.cs b/UnitTests/HeaderListTests.cs index e308c3d35d..696bacc835 100644 --- a/UnitTests/HeaderListTests.cs +++ b/UnitTests/HeaderListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index 9dde916ff0..a70d83104f 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HtmlPreviewVisitor.cs b/UnitTests/HtmlPreviewVisitor.cs index 8d48d84006..e27d565dff 100644 --- a/UnitTests/HtmlPreviewVisitor.cs +++ b/UnitTests/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/BoundStreamTests.cs b/UnitTests/IO/BoundStreamTests.cs index cd6ffb8e09..b8de24d519 100644 --- a/UnitTests/IO/BoundStreamTests.cs +++ b/UnitTests/IO/BoundStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/CanReadWriteSeekStream.cs b/UnitTests/IO/CanReadWriteSeekStream.cs index 8ec0a7e196..85216af6ef 100644 --- a/UnitTests/IO/CanReadWriteSeekStream.cs +++ b/UnitTests/IO/CanReadWriteSeekStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ChainedStreamTests.cs b/UnitTests/IO/ChainedStreamTests.cs index 60451e5c99..d5d31a8751 100644 --- a/UnitTests/IO/ChainedStreamTests.cs +++ b/UnitTests/IO/ChainedStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/FilteredStreamTests.cs b/UnitTests/IO/FilteredStreamTests.cs index 6f9b438843..aa20b71644 100644 --- a/UnitTests/IO/FilteredStreamTests.cs +++ b/UnitTests/IO/FilteredStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/Filters/FilterTests.cs b/UnitTests/IO/Filters/FilterTests.cs index 5961747155..7958931f37 100644 --- a/UnitTests/IO/Filters/FilterTests.cs +++ b/UnitTests/IO/Filters/FilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MeasuringStreamTests.cs b/UnitTests/IO/MeasuringStreamTests.cs index 200a627adf..f92ab40666 100644 --- a/UnitTests/IO/MeasuringStreamTests.cs +++ b/UnitTests/IO/MeasuringStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index 42455be3cd..7caaddf744 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ReadOneByteStream.cs b/UnitTests/IO/ReadOneByteStream.cs index f5f31d523d..1c6702bafe 100644 --- a/UnitTests/IO/ReadOneByteStream.cs +++ b/UnitTests/IO/ReadOneByteStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/TimeoutStream.cs b/UnitTests/IO/TimeoutStream.cs index b452a33d7f..2b9d685833 100644 --- a/UnitTests/IO/TimeoutStream.cs +++ b/UnitTests/IO/TimeoutStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index c19075c45d..67aa45634c 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index 34af897107..e0c1e9c600 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 8519fa798b..aeadae5778 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDeliveryStatusTests.cs b/UnitTests/MessageDeliveryStatusTests.cs index 19beecc5b7..59bb96cae7 100644 --- a/UnitTests/MessageDeliveryStatusTests.cs +++ b/UnitTests/MessageDeliveryStatusTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDispositionNotificiationTests.cs b/UnitTests/MessageDispositionNotificiationTests.cs index cf06e11d05..4222513117 100644 --- a/UnitTests/MessageDispositionNotificiationTests.cs +++ b/UnitTests/MessageDispositionNotificiationTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageIdListTests.cs b/UnitTests/MessageIdListTests.cs index 26feb12ad8..54c92cc0b8 100644 --- a/UnitTests/MessageIdListTests.cs +++ b/UnitTests/MessageIdListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessagePartialTests.cs b/UnitTests/MessagePartialTests.cs index 7a2a531ddb..b8dd42f72b 100644 --- a/UnitTests/MessagePartialTests.cs +++ b/UnitTests/MessagePartialTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeIteratorTests.cs b/UnitTests/MimeIteratorTests.cs index 740e9e03ac..cdd8313ce1 100644 --- a/UnitTests/MimeIteratorTests.cs +++ b/UnitTests/MimeIteratorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index da5864cf01..fb3f323254 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 7ce17e7c34..ddb2901ebe 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 0fc3883bf3..422d24d38a 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 029306d671..4ae909c7f9 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index aa6d593c5a..e89a350ccd 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartAlternativeTests.cs b/UnitTests/MultipartAlternativeTests.cs index 95d1acb6ce..a4f82958f4 100644 --- a/UnitTests/MultipartAlternativeTests.cs +++ b/UnitTests/MultipartAlternativeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index 9cb72299ea..6c3e8abcb8 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartReportTests.cs b/UnitTests/MultipartReportTests.cs index dbe74672c4..c193cf54e3 100644 --- a/UnitTests/MultipartReportTests.cs +++ b/UnitTests/MultipartReportTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartTests.cs b/UnitTests/MultipartTests.cs index 5a245a9aa7..328e24b7ff 100644 --- a/UnitTests/MultipartTests.cs +++ b/UnitTests/MultipartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterListTests.cs b/UnitTests/ParameterListTests.cs index a55814044b..8aad95e66b 100644 --- a/UnitTests/ParameterListTests.cs +++ b/UnitTests/ParameterListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterTests.cs b/UnitTests/ParameterTests.cs index 6334f44b03..3427cdcfe9 100644 --- a/UnitTests/ParameterTests.cs +++ b/UnitTests/ParameterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParserOptionsTests.cs b/UnitTests/ParserOptionsTests.cs index 8e2eb26cc5..d612a2eb87 100644 --- a/UnitTests/ParserOptionsTests.cs +++ b/UnitTests/ParserOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs index a94d683574..265131ceb0 100644 --- a/UnitTests/Text/FlowedToHtmlTests.cs +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/FlowedToTextTests.cs b/UnitTests/Text/FlowedToTextTests.cs index feabffe243..4e0aa05103 100644 --- a/UnitTests/Text/FlowedToTextTests.cs +++ b/UnitTests/Text/FlowedToTextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlAttributeTests.cs b/UnitTests/Text/HtmlAttributeTests.cs index f4cabea99e..a42f56eae9 100644 --- a/UnitTests/Text/HtmlAttributeTests.cs +++ b/UnitTests/Text/HtmlAttributeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlEntityDecoderTests.cs b/UnitTests/Text/HtmlEntityDecoderTests.cs index 4fab0a157b..82e0f8dd4c 100644 --- a/UnitTests/Text/HtmlEntityDecoderTests.cs +++ b/UnitTests/Text/HtmlEntityDecoderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -24,7 +24,6 @@ // THE SOFTWARE. // -using System; using System.IO; using NUnit.Framework; diff --git a/UnitTests/Text/HtmlTagIdTests.cs b/UnitTests/Text/HtmlTagIdTests.cs new file mode 100644 index 0000000000..bad237f91e --- /dev/null +++ b/UnitTests/Text/HtmlTagIdTests.cs @@ -0,0 +1,62 @@ +// +// HtmlTagIdTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class HtmlTagIdTests + { + [Test] + public void TestToHtmlTagId () + { + Assert.AreEqual (HtmlTagId.Unknown, "".ToHtmlTagId (), "string.Empty"); + Assert.AreEqual (HtmlTagId.Comment, "!".ToHtmlTagId (), "!"); + Assert.AreEqual (HtmlTagId.Comment, "!blah".ToHtmlTagId (), "!blah"); + Assert.AreEqual (HtmlTagId.A, "a".ToHtmlTagId (), "a"); + Assert.AreEqual (HtmlTagId.A, "A".ToHtmlTagId (), "A"); + Assert.AreEqual (HtmlTagId.Font, "font".ToHtmlTagId (), "font"); + Assert.AreEqual (HtmlTagId.Font, "FONT".ToHtmlTagId (), "FONT"); + Assert.AreEqual (HtmlTagId.Font, "FoNt".ToHtmlTagId (), "FoNt"); + } + + [Test] + public void TestIsFormattingElement () + { + var formattingElements = new[] { "a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" }; + + foreach (var element in formattingElements) { + var tag = element.ToHtmlTagId (); + + Assert.IsTrue (tag.IsFormattingElement (), element); + } + + Assert.IsFalse ("body".ToHtmlTagId ().IsFormattingElement (), "body"); + } + } +} diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index 8f1a7b7db5..13176296af 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenTests.cs b/UnitTests/Text/HtmlTokenTests.cs index 23559d2b10..1d65f04911 100644 --- a/UnitTests/Text/HtmlTokenTests.cs +++ b/UnitTests/Text/HtmlTokenTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenizerTests.cs b/UnitTests/Text/HtmlTokenizerTests.cs index 319c8ef99a..507497c273 100644 --- a/UnitTests/Text/HtmlTokenizerTests.cs +++ b/UnitTests/Text/HtmlTokenizerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlUtilsTests.cs b/UnitTests/Text/HtmlUtilsTests.cs index 1006d1bc6c..3735267a17 100644 --- a/UnitTests/Text/HtmlUtilsTests.cs +++ b/UnitTests/Text/HtmlUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlWriterTests.cs b/UnitTests/Text/HtmlWriterTests.cs index 55651e56a8..578fddd960 100644 --- a/UnitTests/Text/HtmlWriterTests.cs +++ b/UnitTests/Text/HtmlWriterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/RtfCompressedToRtfTests.cs b/UnitTests/Text/RtfCompressedToRtfTests.cs index 45b9168e70..3a1a492146 100644 --- a/UnitTests/Text/RtfCompressedToRtfTests.cs +++ b/UnitTests/Text/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index fe01b71c0e..e4085ea6d8 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index 2c64f1f9eb..310eb2ecb0 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index b4c0287020..70bb43186c 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToTextTests.cs b/UnitTests/Text/TextToTextTests.cs index 8183c1b295..414e5c3de8 100644 --- a/UnitTests/Text/TextToTextTests.cs +++ b/UnitTests/Text/TextToTextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TrieTests.cs b/UnitTests/Text/TrieTests.cs index 68747c62a4..3c438ea9c1 100644 --- a/UnitTests/Text/TrieTests.cs +++ b/UnitTests/Text/TrieTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/UrlScannerTests.cs b/UnitTests/Text/UrlScannerTests.cs index a4715c199b..86817f8867 100644 --- a/UnitTests/Text/UrlScannerTests.cs +++ b/UnitTests/Text/UrlScannerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index f2dfb7e70c..428dadc077 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextRfc822HeadersTests.cs b/UnitTests/TextRfc822HeadersTests.cs index 7812ffad08..66ad40624f 100644 --- a/UnitTests/TextRfc822HeadersTests.cs +++ b/UnitTests/TextRfc822HeadersTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/RtfCompressedToRtfTests.cs b/UnitTests/Tnef/RtfCompressedToRtfTests.cs index 55cdd93e2d..411da998e5 100644 --- a/UnitTests/Tnef/RtfCompressedToRtfTests.cs +++ b/UnitTests/Tnef/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderStreamTests.cs b/UnitTests/Tnef/TnefReaderStreamTests.cs index 16f9056244..94e0095f8a 100644 --- a/UnitTests/Tnef/TnefReaderStreamTests.cs +++ b/UnitTests/Tnef/TnefReaderStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderTests.cs b/UnitTests/Tnef/TnefReaderTests.cs index 03100b046d..75dd4acf46 100644 --- a/UnitTests/Tnef/TnefReaderTests.cs +++ b/UnitTests/Tnef/TnefReaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 253511e31b..0808b211b5 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 71c4d4a04f..d13be96cf4 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -108,6 +108,7 @@ + diff --git a/UnitTests/Utils/CharsetUtilsTests.cs b/UnitTests/Utils/CharsetUtilsTests.cs index e4cdca6e29..15371de3a8 100644 --- a/UnitTests/Utils/CharsetUtilsTests.cs +++ b/UnitTests/Utils/CharsetUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/DateParserTests.cs b/UnitTests/Utils/DateParserTests.cs index 9c3ec48abf..3a13089585 100644 --- a/UnitTests/Utils/DateParserTests.cs +++ b/UnitTests/Utils/DateParserTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index be5b2c446a..3449ffed18 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/PackedByteArrayTests.cs b/UnitTests/Utils/PackedByteArrayTests.cs index 49f0b5107a..67cfcbb7b0 100644 --- a/UnitTests/Utils/PackedByteArrayTests.cs +++ b/UnitTests/Utils/PackedByteArrayTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index 5748252813..0bcb26f2d3 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/Rfc2047Tests.cs b/UnitTests/Utils/Rfc2047Tests.cs index 50c36ee421..44f8957787 100644 --- a/UnitTests/Utils/Rfc2047Tests.cs +++ b/UnitTests/Utils/Rfc2047Tests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index ab2755d121..a9ee4d6147 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2018 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From 197a5ee86903b72abb15cade1194d5a4f42361c8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 10:33:16 -0400 Subject: [PATCH 390/741] Added more TextConverter tests and fixed Convert methods --- MimeKit/Text/TextConverter.cs | 18 +++++--- UnitTests/Text/TextConverterTests.cs | 61 +++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index 65bef01f36..20be03510c 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -230,12 +230,12 @@ public string Header { TextReader CreateReader (Stream stream) { - return new StreamReader (stream, InputEncoding, DetectEncodingFromByteOrderMark, InputStreamBufferSize); + return new StreamReader (stream, InputEncoding, DetectEncodingFromByteOrderMark, InputStreamBufferSize, true); } TextWriter CreateWriter (Stream stream) { - return new StreamWriter (stream, OutputEncoding, OutputStreamBufferSize); + return new StreamWriter (stream, OutputEncoding, OutputStreamBufferSize, true); } /// @@ -261,7 +261,11 @@ public virtual void Convert (Stream source, Stream destination) if (destination == null) throw new ArgumentNullException (nameof (destination)); - Convert (CreateReader (source), CreateWriter (destination)); + using (var writer = CreateWriter (destination)) { + using (var reader = CreateReader (source)) + Convert (reader, writer); + writer.Flush (); + } } /// @@ -287,7 +291,8 @@ public virtual void Convert (Stream source, TextWriter writer) if (writer == null) throw new ArgumentNullException (nameof (writer)); - Convert (CreateReader (source), writer); + using (var reader = CreateReader (source)) + Convert (reader, writer); } /// @@ -313,7 +318,10 @@ public virtual void Convert (TextReader reader, Stream destination) if (destination == null) throw new ArgumentNullException (nameof (destination)); - Convert (reader, CreateWriter (destination)); + using (var writer = CreateWriter (destination)) { + Convert (reader, writer); + writer.Flush (); + } } /// diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index e4085ea6d8..e350f4144f 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -52,8 +52,65 @@ public void TestPropertySetters () converter.OutputEncoding = utf16; Assert.AreEqual (utf16, converter.OutputEncoding, "OutputEncoding"); - converter.InputStreamBufferSize = 6000; - Assert.AreEqual (6000, converter.InputStreamBufferSize, "InputStreamBufferSize"); + converter.OutputStreamBufferSize = 6000; + Assert.AreEqual (6000, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + } + + [Test] + public void TestConvertFromReaderToStream () + { + const string input = "This is some text..."; + var converter = new TextToText { + InputEncoding = Encoding.ASCII, + OutputEncoding = Encoding.ASCII + }; + + using (var output = new MemoryStream ()) { + using (var reader = new StringReader (input)) + converter.Convert (reader, output); + + var result = Encoding.ASCII.GetString (output.GetBuffer (), 0, (int) output.Length); + + Assert.AreEqual (input, result); + } + } + + [Test] + public void TestConvertFromStreamToStream () + { + const string input = "This is some text..."; + var converter = new TextToText { + InputEncoding = Encoding.ASCII, + OutputEncoding = Encoding.ASCII + }; + + using (var output = new MemoryStream ()) { + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input))) + converter.Convert (stream, output); + + var result = Encoding.ASCII.GetString (output.GetBuffer (), 0, (int) output.Length); + + Assert.AreEqual (input, result); + } + } + + [Test] + public void TestConvertFromStreamToWriter () + { + const string input = "This is some text..."; + var converter = new TextToText { + InputEncoding = Encoding.ASCII, + OutputEncoding = Encoding.ASCII + }; + + using (var writer = new StringWriter ()) { + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input))) + converter.Convert (stream, writer); + + var result = writer.ToString (); + + Assert.AreEqual (input, result); + } } } } From 4baf2446a82310cea136b7c53721d4af7803b304 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 11:35:21 -0400 Subject: [PATCH 391/741] Added more TextConverter test coverage --- UnitTests/Text/TextConverterTests.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index e350f4144f..f34e2c7cb6 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -54,6 +54,9 @@ public void TestPropertySetters () converter.OutputStreamBufferSize = 6000; Assert.AreEqual (6000, converter.OutputStreamBufferSize, "OutputStreamBufferSize"); + + converter.DetectEncodingFromByteOrderMark = true; + Assert.IsTrue (converter.DetectEncodingFromByteOrderMark, "DetectEncodingFromByteOrderMark"); } [Test] @@ -61,6 +64,7 @@ public void TestConvertFromReaderToStream () { const string input = "This is some text..."; var converter = new TextToText { + DetectEncodingFromByteOrderMark = false, InputEncoding = Encoding.ASCII, OutputEncoding = Encoding.ASCII }; @@ -80,6 +84,7 @@ public void TestConvertFromStreamToStream () { const string input = "This is some text..."; var converter = new TextToText { + DetectEncodingFromByteOrderMark = false, InputEncoding = Encoding.ASCII, OutputEncoding = Encoding.ASCII }; @@ -99,6 +104,7 @@ public void TestConvertFromStreamToWriter () { const string input = "This is some text..."; var converter = new TextToText { + DetectEncodingFromByteOrderMark = false, InputEncoding = Encoding.ASCII, OutputEncoding = Encoding.ASCII }; From 38379164f0337f83949d7942ad7a1f926e05bf26 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 13:09:04 -0400 Subject: [PATCH 392/741] Added more UrlScanner tests --- UnitTests/Text/UrlScannerTests.cs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/UnitTests/Text/UrlScannerTests.cs b/UnitTests/Text/UrlScannerTests.cs index 86817f8867..d84dfdcc9c 100644 --- a/UnitTests/Text/UrlScannerTests.cs +++ b/UnitTests/Text/UrlScannerTests.cs @@ -177,6 +177,36 @@ public void TestSimpleWebUrlWithPath () TestUrlScanner ("This is some text with an http://www.xamarin.com/logo.png url in it...", "http://www.xamarin.com/logo.png"); } + [Test] + public void TestSimpleWebUrlWithPathEnclosedInParens () + { + TestUrlScanner ("This is some text with an (http://www.xamarin.com/logo.png) url in it...", "http://www.xamarin.com/logo.png"); + } + + [Test] + public void TestSimpleWebUrlWithPathEnclosedInCurlyBraces () + { + TestUrlScanner ("This is some text with an {http://www.xamarin.com/logo.png} url in it...", "http://www.xamarin.com/logo.png"); + } + + [Test] + public void TestSimpleWebUrlWithPathEnclosedInAngleBrackets () + { + TestUrlScanner ("This is some text with an url in it...", "http://www.xamarin.com/logo.png"); + } + + [Test] + public void TestSimpleWebUrlWithPathEnclosedInSquareBrackets () + { + TestUrlScanner ("This is some text with an [http://www.xamarin.com/logo.png] url in it...", "http://www.xamarin.com/logo.png"); + } + + [Test] + public void TestSimpleWebUrlWithPathEnclosedInPipes () + { + TestUrlScanner ("This is some text with an |http://www.xamarin.com/logo.png| url in it...", "http://www.xamarin.com/logo.png"); + } + [Test] public void TestSimpleWebUrlWithPort () { From 446bd7335e42a7e826b82ed0cfe3b98bf6c44541 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 13:32:08 -0400 Subject: [PATCH 393/741] Added more msg-id parsing tests --- UnitTests/Utils/ParseUtilsTests.cs | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index 0bcb26f2d3..7feaab7e13 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -301,5 +301,59 @@ public void TestTryParseMsgIdLessThanLocalPartAtDomainMissingGreaterThan () Assert.AreEqual (19, ex.ErrorIndex, "ErrorIndex"); } } + + [Test] + public void TestTryParseMsgIdInvalidQuotedLocalPart () + { + var buffer = Encoding.ASCII.GetBytes (" <\"quoted-string@domain>"); + int index = 0; + string msgid; + + Assert.IsFalse (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out msgid), "TryParseMsgId"); + + try { + index = 0; + ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, true, out msgid); + Assert.Fail ("throwOnError"); + } catch (ParseException ex) { + Assert.AreEqual (2, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (24, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestTryParseMsgIdInvalidInternationalLocalPart () + { + var buffer = Encoding.GetEncoding ("iso-8859-1").GetBytes (" <æøå@domain>"); + int index = 0; + string msgid; + + Assert.IsFalse (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out msgid), "TryParseMsgId"); + + try { + index = 0; + ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, true, out msgid); + Assert.Fail ("throwOnError"); + } catch (ParseException ex) { + Assert.AreEqual (1, ex.TokenIndex, "TokenIndex"); + Assert.AreEqual (2, ex.ErrorIndex, "ErrorIndex"); + } + } + + [Test] + public void TestTryParseMsgIdWithIdnDomain () + { + var buffer = Encoding.ASCII.GetBytes (" "); + const string expected = "id@名がドメイン.com"; + int index = 0; + string msgid; + + Assert.IsTrue (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out msgid), "TryParseMsgId"); + Assert.AreEqual (expected, msgid, "msgid"); + + index = 0; + Assert.IsTrue (ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, true, out msgid), "TryParseMsgId+thowOnError"); + Assert.AreEqual (expected, msgid, "msgid"); + } } } From 7da9b8188f46521ffc883bd3420def5e52fe9a2e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Sep 2019 21:42:28 -0400 Subject: [PATCH 394/741] Modified TryParseMsgId to gobble ctrl chars in the local-part --- MimeKit/Utils/ParseUtils.cs | 2 +- UnitTests/Utils/ParseUtilsTests.cs | 38 +++++++++++++++--------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index fe74e63879..20eb1681bb 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -417,7 +417,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (!SkipQuoted (text, ref index, endIndex, throwOnError)) return false; } else { - while (index < endIndex && text[index] != (byte) '.' && text[index] != (byte) '@' && text[index] != '>' && !text[index].IsType (SpaceOrControl)) + while (index < endIndex && text[index] != (byte) '.' && text[index] != (byte) '@' && text[index] != '>' && !text[index].IsBlank ()) index++; } diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index 7feaab7e13..c893dcd90b 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -215,24 +215,24 @@ public void TestTryParseMsgIdLessThanLocalPart () } } - [Test] - public void TestTryParseMsgIdLessThanLocalPartCtrl () - { - var buffer = Encoding.ASCII.GetBytes (" Date: Sat, 14 Sep 2019 21:44:19 -0400 Subject: [PATCH 395/741] minor modification to previous commit to use IsWhitespace() instead of IsBlank() --- MimeKit/Utils/ParseUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index 20eb1681bb..b27e988a7a 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -417,7 +417,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (!SkipQuoted (text, ref index, endIndex, throwOnError)) return false; } else { - while (index < endIndex && text[index] != (byte) '.' && text[index] != (byte) '@' && text[index] != '>' && !text[index].IsBlank ()) + while (index < endIndex && text[index] != (byte) '.' && text[index] != (byte) '@' && text[index] != '>' && !text[index].IsWhitespace ()) index++; } From 54953da8311ca5e1e624ee044d9586af2bed44fe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 23 Sep 2019 07:20:14 -0400 Subject: [PATCH 396/741] Fixed DefaultSecureMimeContext to build the cert chain outside of the private key query Fixes issue #508 As pointed out in issue #508, many SQL databases do not allow reentrant queries. The simple fix here is to grab the data we need (certificate and prvate key) and then break out of the query and then build the CmsSigner's certificate chain. --- MimeKit/Cryptography/DefaultSecureMimeContext.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index 3677288690..eb0c08801d 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -393,11 +393,20 @@ protected override CmsRecipient GetCmsRecipient (MailboxAddress mailbox) /// protected override CmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgorithm digestAlgo) { + AsymmetricKeyParameter privateKey = null; + X509Certificate certificate = null; + foreach (var record in dbase.Find (mailbox, DateTime.UtcNow, true, CmsSignerFields)) { - if (record.KeyUsage != X509KeyUsageFlags.None && (record.KeyUsage & SecureMimeContext.DigitalSignatureKeyUsageFlags) == 0) + if (record.KeyUsage != X509KeyUsageFlags.None && (record.KeyUsage & DigitalSignatureKeyUsageFlags) == 0) continue; - var signer = new CmsSigner (BuildCertificateChain (record.Certificate), record.PrivateKey); + certificate = record.Certificate; + privateKey = record.PrivateKey; + break; + } + + if (certificate != null && privateKey != null) { + var signer = new CmsSigner (BuildCertificateChain (certificate), privateKey); signer.DigestAlgorithm = digestAlgo; return signer; From b7ff8d2e737742392c6bcd167802e9f77fc7a90e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 2 Oct 2019 18:08:09 -0400 Subject: [PATCH 397/741] Fixed reserialization of message/rfc822 parts Also fixed DKIM and ARC signing to always enable FormatOptions.EnsureNewLine. Fixes issue #510 --- MimeKit/Cryptography/ArcSigner.cs | 1 + MimeKit/Cryptography/DkimSigner.cs | 1 + MimeKit/MessagePart.cs | 10 ++++ UnitTests/MimeMessageTests.cs | 77 ++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index ccae85fd56..0e91686105 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -361,6 +361,7 @@ async Task ArcSignAsync (FormatOptions options, MimeMessage message, IList headers options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; + options.EnsureNewLine = true; switch (SignatureAlgorithm) { case DkimSignatureAlgorithm.Ed25519Sha256: diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index f54c953ffc..d2c8986ef2 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -236,6 +236,11 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } } + if (options.EnsureNewLine) { + options = options.Clone (); + options.EnsureNewLine = false; + } + Message.WriteTo (options, stream, cancellationToken); } @@ -273,6 +278,11 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = await stream.WriteAsync (options.NewLineBytes, 0, options.NewLineBytes.Length, cancellationToken).ConfigureAwait (false); } + if (options.EnsureNewLine) { + options = options.Clone (); + options.EnsureNewLine = false; + } + await Message.WriteToAsync (options, stream, cancellationToken).ConfigureAwait (false); } } diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index fb3f323254..6fe9dc7353 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -607,6 +607,83 @@ This is the epilogue. } } + [Test] + public async Task TestReserializationDeliveryStatusReportWithEnsureNewLine () + { + string rawMessageText = @"From: est@somwhere.com +Date: Fri, 15 Feb 2019 16:00:08 +0000 +Subject: report_with_no_body +To: tom@to.com +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; boundary=""A41C7.838631588=_/mm1"" + + +Processing your mail message caused the following errors: + +error: err.nosuchuser: newsletter-request@imusic.com + +--A41C7.838631588=_/mm1 +Content-Type: message/delivery-status + +Reporting-MTA: dns; mm1 +Arrival-Date: Mon, 29 Jul 1996 02:12:50 -0700 + +Final-Recipient: RFC822; newsletter-request@imusic.com +Action: failed +Diagnostic-Code: X-LOCAL; 500 (err.nosuchuser) + +--A41C7.838631588=_/mm1 +Content-Type: message/rfc822 + +Received: from urchin.netscape.com ([198.95.250.59]) by mm1.sprynet.com with ESMTP id <148217-12799>; Mon, 29 Jul 1996 02:12:50 -0700 +Received: from gruntle (gruntle.mcom.com [205.217.230.10]) by urchin.netscape.com (8.7.5/8.7.3) with SMTP id CAA24688 for ; Mon, 29 Jul 1996 02:04:53 -0700 (PDT) +Sender: jwz@netscape.com +Message-ID: <31FC7EB4.41C6@netscape.com> +Date: Mon, 29 Jul 1996 02:04:52 -0700 +From: Jamie Zawinski +Organization: Netscape Communications Corporation, Mozilla Division +X-Mailer: Mozilla 3.0b6 (X11; U; IRIX 5.3 IP22) +MIME-Version: 1.0 +To: newsletter-request@imusic.com +Subject: unsubscribe +References: <96Jul29.013736-0700pdt.148116-12799+675@mm1.sprynet.com> +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +unsubscribe +--A41C7.838631588=_/mm1-- +".Replace ("\r\n", "\n"); + + using (var source = new MemoryStream (Encoding.UTF8.GetBytes (rawMessageText))) { + var parser = new MimeParser (source, MimeFormat.Default); + var message = parser.ParseMessage (); + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + options.EnsureNewLine = true; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized message is not identical to the original."); + } + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + options.EnsureNewLine = true; + + await message.WriteToAsync (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (rawMessageText, result, "Reserialized (async) message is not identical to the original."); + } + } + } + [Test] public void TestMailMessageToMimeMessage () { From a679c93e52cbdb68324778b286e3bfff86774a89 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 12 Oct 2019 10:21:26 -0400 Subject: [PATCH 398/741] bumped version to 2.3.2 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 15 +++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 15 ++++++++------- nuget/MimeKitLite.nuspec | 7 ++++--- 8 files changed, 33 insertions(+), 16 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 75fdbf251e..52d13bceb2 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.3.1.0 + 2.3.2.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 6aa8698f06..8a5a326c53 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.3.1.0 + 2.3.2.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index a4a85f714b..d4f7b1744f 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -80,6 +80,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.3.1.0")] -[assembly: AssemblyFileVersion ("2.3.1.0")] +[assembly: AssemblyInformationalVersion ("2.3.2.0")] +[assembly: AssemblyFileVersion ("2.3.2.0")] [assembly: AssemblyVersion ("2.3.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 03e1f89e88..f8da0d4a33 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,20 @@ # Release Notes +### MimeKit 2.3.2 (2019-10-12) + +* Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence + to the end of the message. (issue [#510](https://github.com/jstedfast/MimeKit/issues/510)) +* Fixed DefaultSecureMimeContext to build the cert chain outside of the private key query. + (issue [#508](https://github.com/jstedfast/MimeKit/issues/508)) +* Modified the Message-Id parser to gobble ctrl chars in the local-part. +* Fixed some buglets in the TextToFlowed converter involving space-stuffing lines. +* Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty. + (issue [#506](https://github.com/jstedfast/MimeKit/issues/506)) +* Fixed potential memory leaks in WindowsSecureMimeContext and BouncyCastleSecureMimeContext + in the Export() methods in cases where an exception is throw while adding certificates. +* Removed MimeKit.Cryptography.NpgsqlCertificateDatabase. It is unlikely anyone actually + uses this. + ### MimeKit 2.3.1 (2019-09-08) * Updated CmsSigner's default DigestAlgorithm to Sha256 instead of Sha1 to match diff --git a/appveyor.yml b/appveyor.yml index 2e24a8cd7d..47dc473d0a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.3.1.{build} +version: 2.3.2.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d503e6f399..595a5c3a6b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.3.1$(Rev:.r) +name: 2.3.2$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index d8817775b2..b6ca2ff59d 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.3.1 + 2.3.2 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,12 +26,13 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Updated CmsSigner's default DigestAlgorithm to Sha256 instead of Sha1 to match System.Security.Cryptography.Pkcs.CmsSigner's default. -* Updated WindowsSecureMimeContext to default to IssuerAndSerialNumber for System.Security.Cryptography.Pkcs.CmsSigner. -* Added support for the RSASSA-PSS signature padding algorithm when using the BouncyCastle backend. -* Improved robustness of TNEF processing of email address fields. -* Modified FilteredStream.Flush*() to not flush the source stream. (MailKit issue #904) -* Added net46 and net47 assemblies to the NuGet package. +* Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence to the end of the message. (issue #510) +* Fixed DefaultSecureMimeContext to build the cert chain outside of the private key query. (issue #508) +* Modified the Message-Id parser to gobble ctrl chars in the local-part. +* Fixed some buglets in the TextToFlowed converter involving space-stuffing lines. +* Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty. (issue #506) +* Fixed potential memory leaks in WindowsSecureMimeContext and BouncyCastleSecureMimeContext in the Export() methods in cases where an exception is throw while adding certificates. +* Removed MimeKit.Cryptography.NpgsqlCertificateDatabase. It is unlikely anyone actually uses this. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index a43098633f..ca0158937a 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -26,9 +26,10 @@ An Open Source library for creating and parsing MIME messages. -* Improved robustness of TNEF processing of email address fields. -* Modified FilteredStream.Flush*() to not flush the source stream. (MailKit issue #904) -* Added net46 and net47 assemblies to the NuGet package. +* Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence to the end of the message. (issue #510) +* Modified the Message-Id parser to gobble ctrl chars in the local-part. +* Fixed some buglets in the TextToFlowed converter involving space-stuffing lines. +* Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty. (issue #506) Xamarin Inc. en-US From cc0efb8216d04cd450ab0dd0a100b0bc4fbd0fd8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 12 Oct 2019 10:48:30 -0400 Subject: [PATCH 399/741] updated samples --- nuget/MimeKit.nuspec | 3 ++- nuget/MimeKitLite.nuspec | 5 +++-- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- samples/MessageReader.Android/MessageReader.Android.sln | 4 ++-- .../MessageReader.Android/MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- samples/MessageReader.iOS/MessageReader.iOS.sln | 4 ++-- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader.sln | 4 ++-- samples/MessageReader/MessageReader/MessageReader.csproj | 2 +- samples/MessageReader/MessageReader/packages.config | 2 +- 13 files changed, 21 insertions(+), 19 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index b6ca2ff59d..a207ef1201 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -9,7 +9,7 @@ MIT http://www.mimekit.net - https://raw.github.com/jstedfast/MimeKit/master/nuget/mimekit-50.png + icons\mimekit-50.png false MimeKit is an Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. It also supports parsing of Unix mbox files. @@ -128,5 +128,6 @@ + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index ca0158937a..54d89840c4 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,14 +2,14 @@ MimeKitLite - 2.3.1 + 2.3.2 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast MIT http://www.mimekit.net - https://raw.github.com/jstedfast/MimeKit/master/nuget/mimekit-50.png + icons\mimekit-50.png false MimeKit is an Open Source library for creating and parsing MIME messages. It also supports parsing of Unix mbox files. @@ -97,5 +97,6 @@ + diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 65c198a993..cac9b4d633 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.3.1\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.3.2\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 405b1780c1..d153833b7a 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android.sln b/samples/MessageReader.Android/MessageReader.Android.sln index 7d762ac329..279d254324 100644 --- a/samples/MessageReader.Android/MessageReader.Android.sln +++ b/samples/MessageReader.Android/MessageReader.Android.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.572 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29409.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageReader.Android", "MessageReader.Android\MessageReader.Android.csproj", "{215D2B5C-8D37-4CB1-8196-B30A3ECFE2B6}" EndProject diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 883f557b38..496fc772e4 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.3.1\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.3.2\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.3.1\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.3.2\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 2f83f41709..eb9b021119 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS.sln b/samples/MessageReader.iOS/MessageReader.iOS.sln index 484ead9bbe..8403f69a47 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS.sln +++ b/samples/MessageReader.iOS/MessageReader.iOS.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26403.3 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29409.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageReader.iOS", "MessageReader.iOS\MessageReader.iOS.csproj", "{60EA692F-305A-4CF7-97A8-3565CC81310A}" EndProject diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 170760cf39..3a91e8db7d 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.3.1\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.3.2\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.3.1\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.3.2\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 9c927df3a4..520eea1639 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader.sln b/samples/MessageReader/MessageReader.sln index 90fc43a786..79ef2c106e 100644 --- a/samples/MessageReader/MessageReader.sln +++ b/samples/MessageReader/MessageReader.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.572 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29409.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageReader", "MessageReader\MessageReader.csproj", "{B9E3F73F-F805-4E5F-AF4D-E483A9AAA890}" EndProject diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 9ec26d336f..b9bf0406a3 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.3.1\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.3.2\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 7a51228537..beb902f442 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From b90aeb9ec163fc0c35f10c8904aa1fb93516789e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 12 Oct 2019 10:55:25 -0400 Subject: [PATCH 400/741] Updated azure-pipelines.yml --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 595a5c3a6b..dfdd7922ce 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -20,9 +20,9 @@ steps: - script: git submodule update --init --recursive - task: NuGetToolInstaller@0 - displayName: 'Install NuGet 4.9.2' + displayName: 'Install NuGet 5.3.0' inputs: - versionSpec: 4.9.2 + versionSpec: 5.3.0 - task: NuGetCommand@2 displayName: 'Restore NuGet Package Dependencies' From 0d5464bd52d34fab48f980649438ea9dae187088 Mon Sep 17 00:00:00 2001 From: 0xNF <0xNF@users.noreply.github.com> Date: Mon, 14 Oct 2019 12:20:26 +0000 Subject: [PATCH 401/741] added csv mimetype support (#511) Added csv mime-type support --- MimeKit/MimeTypes.cs | 1 + UnitTests/MimeTypeTests.cs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index e7036b636d..1618f94e6e 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -112,6 +112,7 @@ static MimeTypes () mimeTypes.Add ("crt", "application/pkix-cert"); mimeTypes.Add ("csh", "application/x-csh"); mimeTypes.Add ("css", "text/css"); + mimeTypes.Add ("csv", "text/csv"); mimeTypes.Add ("c", "text/plain"); mimeTypes.Add ("c++", "text/plain"); mimeTypes.Add ("cxx", "text/plain"); diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 4ae909c7f9..1d75564147 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -57,5 +57,11 @@ public void TestFileExtensionTxt () { Assert.AreEqual ("text/plain", MimeTypes.GetMimeType ("filename.txt")); } + + [Test] + public void TestFileExtensionCsv () + { + Assert.AreEqual ("text/csv", MimeTypes.GetMimeType ("filename.csv")); + } } } From fee9af4e30d751e35a1bd428275222ee8c00ae35 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 Oct 2019 17:44:41 -0400 Subject: [PATCH 402/741] Exposed more API for NETStandard2.0 and make it use the Net4x codepaths when possible --- .../BouncyCastleSecureMimeContext.cs | 2 +- MimeKit/Cryptography/CmsRecipient.cs | 4 +- MimeKit/Cryptography/CmsSigner.cs | 2 +- MimeKit/Cryptography/CryptographyContext.cs | 2 +- .../Cryptography/DefaultSecureMimeContext.cs | 2 +- MimeKit/Cryptography/GnuPGContext.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 8 ++-- .../Cryptography/SqliteCertificateDatabase.cs | 41 ++++++++++++------- MimeKit/HeaderId.cs | 2 +- MimeKit/MessagePartial.cs | 2 +- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeKit.NetStandard.csproj | 10 ++++- MimeKit/MimeMessage.cs | 2 +- MimeKit/Text/HtmlAttributeId.cs | 2 +- MimeKit/Text/HtmlTagId.cs | 2 +- MimeKit/TextPart.cs | 2 +- MimeKit/Utils/MimeUtils.cs | 2 +- 17 files changed, 54 insertions(+), 35 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 625a4b2ac7..49d3217d31 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -626,7 +626,7 @@ async Task DownloadCrlsOverHttpAsync (string location, Stream stream, bool using (var response = await client.GetAsync (location, cancellationToken).ConfigureAwait (false)) await response.Content.CopyToAsync (stream).ConfigureAwait (false); } else { -#if !NETSTANDARD && !PORTABLE +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ cancellationToken.ThrowIfCancellationRequested (); var request = (HttpWebRequest) WebRequest.Create (location); diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 46ed2b4499..de9263d095 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -29,7 +29,7 @@ using Org.BouncyCastle.X509; -#if !PORTABLE && !NETSTANDARD +#if !PORTABLE using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; #endif @@ -177,7 +177,7 @@ public CmsRecipient (string fileName, SubjectIdentifierType recipientIdentifierT } #endif -#if !PORTABLE && !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ /// /// Initializes a new instance of the class. /// diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 29a1292fc0..ce708ae1d6 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -292,7 +292,7 @@ public CmsSigner (string fileName, string password) : this () } #endif -#if !PORTABLE && !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ /// /// Initializes a new instance of the class. /// diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index dac7e79d4a..3265c3b0f4 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -611,7 +611,7 @@ public static void Register (Type type) if (type == null) throw new ArgumentNullException (nameof (type)); -#if PORTABLE || NETSTANDARD +#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 var info = type.GetTypeInfo (); #else var info = type; diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index eb0c08801d..101cf9b8c7 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -68,7 +68,7 @@ static DefaultSecureMimeContext () { string path; -#if !NETSTANDARD +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 if (Path.DirectorySeparatorChar == '\\') { var appData = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); path = Path.Combine (appData, "Roaming\\mimekit"); diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index fcd456f20b..f512f04bc7 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -50,7 +50,7 @@ static GnuPGContext () var gnupg = Environment.GetEnvironmentVariable ("GNUPGHOME"); if (gnupg == null) { -#if !NETSTANDARD +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 if (Path.DirectorySeparatorChar == '\\') { var appData = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); gnupg = Path.Combine (appData, "gnupg"); diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 09911f6c45..ac62a94e5d 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -546,7 +546,7 @@ async Task RetrievePublicKeyRingAsync (long keyId, bool doAsyn using (var response = await client.GetAsync (uri.ToString (), cancellationToken).ConfigureAwait (false)) await response.Content.CopyToAsync (filtered).ConfigureAwait (false); } else { -#if !NETSTANDARD && !PORTABLE +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ var request = (HttpWebRequest) WebRequest.Create (uri.ToString ()); using (var response = request.GetResponse ()) { var content = response.GetResponseStream (); @@ -1124,7 +1124,7 @@ public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? } if (random == null) { -#if (!NETSTANDARD || NETSTANDARD_2_0) && !PORTABLE +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ random = new SecureRandom (new CryptoApiRandomGenerator ()); #else random = new SecureRandom (); @@ -2416,7 +2416,7 @@ protected void SavePublicKeyRingBundle () } if (File.Exists (PublicKeyRingPath)) { -#if !NETSTANDARD +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 File.Replace (tmp, PublicKeyRingPath, bak); #else if (File.Exists (bak)) @@ -2459,7 +2459,7 @@ protected void SaveSecretKeyRingBundle () } if (File.Exists (SecretKeyRingPath)) { -#if !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ File.Replace (tmp, SecretKeyRingPath, bak); #else if (File.Exists (bak)) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 41b3151686..4d66c9b8fc 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -60,6 +60,14 @@ public class SqliteCertificateDatabase : SqlCertificateDatabase // assembly. static SqliteCertificateDatabase () { +#if __MOBILE__ + IsAvailable = true; +#endif + +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 + var platform = Environment.OSVersion.Platform; +#endif + #if NETSTANDARD try { if ((sqliteAssembly = Assembly.Load (new AssemblyName ("Microsoft.Data.Sqlite"))) != null) { @@ -70,14 +78,15 @@ static SqliteCertificateDatabase () var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); IsAvailable = true; + return; } } catch (FileNotFoundException) { } catch (FileLoadException) { } catch (BadImageFormatException) { } -#elif !__MOBILE__ - var platform = Environment.OSVersion.Platform; +#endif +#if NET_4_5 || NET_4_6 || NET_4_7 try { // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { @@ -90,28 +99,32 @@ static SqliteCertificateDatabase () sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat").SetValue (builder, 0, null); IsAvailable = true; + return; } } + } catch (FileNotFoundException) { + } catch (FileLoadException) { + } catch (BadImageFormatException) { + } +#endif - // System.Data.Sqlite is only available for Windows-based platforms. - if (!IsAvailable && platform != PlatformID.Unix && platform != PlatformID.MacOSX) { - if ((sqliteAssembly = Assembly.Load ("System.Data.SQLite")) != null) { - sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); - sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnectionStringBuilder"); +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 + try { + if ((sqliteAssembly = Assembly.Load ("System.Data.SQLite")) != null) { + sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); + sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnectionStringBuilder"); - // Make sure that the runtime can load the native sqlite3 library - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); - sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat").SetValue (builder, 0, null); + // Make sure that the runtime can load the native sqlite3 library + var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); + sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat").SetValue (builder, 0, null); - IsAvailable = true; - } + IsAvailable = true; + return; } } catch (FileNotFoundException) { } catch (FileLoadException) { } catch (BadImageFormatException) { } -#else - IsAvailable = true; #endif } diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index f1d444e277..6d9836b130 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -758,7 +758,7 @@ public static string ToHeaderName (this HeaderId value) { var name = value.ToString (); -#if PORTABLE || NETSTANDARD +#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 var field = typeof (HeaderId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HeaderNameAttribute), false).ToArray (); #else diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index db359b37f3..403000fa57 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -216,7 +216,7 @@ public static IEnumerable Split (MimeMessage message, int maxSize) } var streams = new List (); -#if !PORTABLE && !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ var buf = memory.GetBuffer (); #else var buf = memory.ToArray (); diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 1129c04b3d..1d037f9806 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -343,7 +343,7 @@ public override string ToString () using (var memory = new MemoryStream ()) { WriteTo (memory); -#if !PORTABLE && !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 52d13bceb2..c37cb503da 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -33,6 +33,12 @@ $(DefineConstants);NETSTANDARD + + $(DefineConstants);NETSTANDARD_1_3 + + + $(DefineConstants);NETSTANDARD_1_6 + $(DefineConstants);ENABLE_SNM;NETSTANDARD_2_0 @@ -65,7 +71,7 @@ - + @@ -124,7 +130,7 @@ - + diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index d83eba1c86..cef24ca6fb 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -994,7 +994,7 @@ public override string ToString () using (var memory = new MemoryStream ()) { WriteTo (FormatOptions.Default, memory); -#if !PORTABLE && !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/Text/HtmlAttributeId.cs b/MimeKit/Text/HtmlAttributeId.cs index fa74994b4f..7dcebc330f 100644 --- a/MimeKit/Text/HtmlAttributeId.cs +++ b/MimeKit/Text/HtmlAttributeId.cs @@ -621,7 +621,7 @@ public static string ToAttributeName (this HtmlAttributeId value) { var name = value.ToString (); -#if PORTABLE || NETSTANDARD +#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 var field = typeof (HtmlAttributeId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HtmlAttributeNameAttribute), false).ToArray (); #else diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index 2b5a7fe9ca..e50b1e325d 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -766,7 +766,7 @@ public static string ToHtmlTagName (this HtmlTagId value) var name = value.ToString (); -#if PORTABLE || NETSTANDARD +#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 var field = typeof (HtmlTagId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HtmlTagNameAttribute), false).ToArray (); #else diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 2b23bc23b6..d490a2754f 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -415,7 +415,7 @@ public string GetText (Encoding encoding) filtered.Flush (); } -#if !PORTABLE && !NETSTANDARD +#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 8371de5881..2df0cce6b2 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -125,7 +125,7 @@ public static string GenerateMessageId (string domain) /// The message identifier. public static string GenerateMessageId () { -#if PORTABLE || NETSTANDARD +#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 return GenerateMessageId ("localhost.localdomain"); #else var properties = IPGlobalProperties.GetIPGlobalProperties (); From ceaa15c2a5d60b6f0274d1d2c01834b8addf65f9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 Oct 2019 20:27:22 -0400 Subject: [PATCH 403/741] Dropped support for .NETPortable and WindowsPhone/Universal8.1 --- .gitmodules | 3 - MimeKit.sln | 24 -- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKit.Portable.csproj | 274 ----------------- MimeKit/MimeKit.Portable.project.json | 11 - MimeKit/MimeKit.WindowsUniversal81.csproj | 282 ------------------ .../MimeKit.WindowsUniversal81.project.json | 11 - MimeKit/MimeKitLite.NetStandard.csproj | 6 + MimeKit/MimeKitLite.Portable.csproj | 213 ------------- MimeKit/MimeKitLite.Portable.project.json | 8 - MimeKit/MimeKitLite.WindowsUniversal81.csproj | 220 -------------- ...imeKitLite.WindowsUniversal81.project.json | 8 - MimeKit/packages.MimeKit.Portable.config | 4 - ...packages.MimeKit.WindowsUniversal81.config | 4 - MimeKitLite.sln | 24 -- nuget/MimeKit.nuspec | 12 - nuget/MimeKitLite.nuspec | 8 - 17 files changed, 7 insertions(+), 1107 deletions(-) delete mode 100644 MimeKit/MimeKit.Portable.csproj delete mode 100644 MimeKit/MimeKit.Portable.project.json delete mode 100644 MimeKit/MimeKit.WindowsUniversal81.csproj delete mode 100644 MimeKit/MimeKit.WindowsUniversal81.project.json delete mode 100644 MimeKit/MimeKitLite.Portable.csproj delete mode 100644 MimeKit/MimeKitLite.Portable.project.json delete mode 100644 MimeKit/MimeKitLite.WindowsUniversal81.csproj delete mode 100644 MimeKit/MimeKitLite.WindowsUniversal81.project.json delete mode 100644 MimeKit/packages.MimeKit.Portable.config delete mode 100644 MimeKit/packages.MimeKit.WindowsUniversal81.config diff --git a/.gitmodules b/.gitmodules index 8ac64ba8e6..d2c6c23def 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "submodules/Portable.Text.Encoding"] - path = submodules/Portable.Text.Encoding - url = https://github.com/jstedfast/Portable.Text.Encoding.git [submodule "submodules/bc-csharp"] path = submodules/bc-csharp url = https://github.com/jstedfast/bc-csharp.git diff --git a/MimeKit.sln b/MimeKit.sln index ea073db237..900915b33a 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -11,20 +11,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Android", "MimeKit\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.iOS", "MimeKit\MimeKit.iOS.csproj", "{4C1288AD-12C8-4BF7-AED7-6C4DC539C856}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Portable", "MimeKit\MimeKit.Portable.csproj", "{BE542CE1-F773-467E-8DED-D02B89C5040A}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle.Android", "submodules\bc-csharp\crypto\BouncyCastle.Android.csproj", "{A0D302CB-8866-4AB1-98B9-F0772EABF5DF}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle.iOS", "submodules\bc-csharp\crypto\BouncyCastle.iOS.csproj", "{0249241C-205E-4AC0-828B-90F822359B9E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Portable.Text.Encoding", "submodules\Portable.Text.Encoding\Portable.Text.Encoding\Portable.Text.Encoding.csproj", "{EEE48C75-11BE-4B50-B759-F85B5052D473}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Portable.Text.Encoding.WindowsUniversal81", "submodules\Portable.Text.Encoding\Portable.Text.Encoding\Portable.Text.Encoding.WindowsUniversal81.csproj", "{B76A64F9-B00E-4243-AE89-5D024CA3B436}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.WindowsUniversal81", "MimeKit\MimeKit.WindowsUniversal81.csproj", "{D9906B8C-7BBD-4CCE-AC7C-E9BCA020D20C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit.NetStandard", "MimeKit\MimeKit.NetStandard.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" EndProject Global @@ -49,10 +41,6 @@ Global {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Debug|Any CPU.Build.0 = Debug|Any CPU {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.Build.0 = Release|Any CPU - {BE542CE1-F773-467E-8DED-D02B89C5040A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BE542CE1-F773-467E-8DED-D02B89C5040A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BE542CE1-F773-467E-8DED-D02B89C5040A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BE542CE1-F773-467E-8DED-D02B89C5040A}.Release|Any CPU.Build.0 = Release|Any CPU {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Debug|Any CPU.Build.0 = Debug|Any CPU {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -65,18 +53,6 @@ Global {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.Build.0 = Release|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Release|Any CPU.Build.0 = Release|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Release|Any CPU.Build.0 = Release|Any CPU - {D9906B8C-7BBD-4CCE-AC7C-E9BCA020D20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9906B8C-7BBD-4CCE-AC7C-E9BCA020D20C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9906B8C-7BBD-4CCE-AC7C-E9BCA020D20C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9906B8C-7BBD-4CCE-AC7C-E9BCA020D20C}.Release|Any CPU.Build.0 = Release|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.Build.0 = Debug|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index c37cb503da..c79c18a9d9 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -104,7 +104,7 @@ - + diff --git a/MimeKit/MimeKit.Portable.csproj b/MimeKit/MimeKit.Portable.csproj deleted file mode 100644 index 7b578032de..0000000000 --- a/MimeKit/MimeKit.Portable.csproj +++ /dev/null @@ -1,274 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {BE542CE1-F773-467E-8DED-D02B89C5040A} - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - MimeKit - Profile7 - v4.5 - 10.0 - - - true - full - false - bin\Debug\portable - obj\Debug\portable - DEBUG;TRACE;PORTABLE;ENABLE_CRYPTO - prompt - 4 - false - true - - - true - bin\Release\portable - obj\Release\portable - bin\Release\portable\MimeKit.xml - TRACE;PORTABLE;ENABLE_CRYPTO - prompt - 4 - false - true - - - true - - - mimekit.snk - - - - {EEE48C75-11BE-4B50-B759-F85B5052D473} - Portable.Text.Encoding - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.Portable.project.json b/MimeKit/MimeKit.Portable.project.json deleted file mode 100644 index 099ed2c6c8..0000000000 --- a/MimeKit/MimeKit.Portable.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "frameworks": { - ".NETPortable,Version=v4.5,Profile=Profile7": {} - }, - "runtimes": { - "win-anycpu": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} diff --git a/MimeKit/MimeKit.WindowsUniversal81.csproj b/MimeKit/MimeKit.WindowsUniversal81.csproj deleted file mode 100644 index e9183064ea..0000000000 --- a/MimeKit/MimeKit.WindowsUniversal81.csproj +++ /dev/null @@ -1,282 +0,0 @@ - - - - - 11.0 - Debug - AnyCPU - 8.0.30703 - 2.0 - {D9906B8C-7BBD-4CCE-AC7C-E9BCA020D20C} - Library - Properties - MimeKit - MimeKit - v4.5 - Profile111 - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug\wpa81 - obj\Debug\wpa81 - DEBUG;TRACE;PORTABLE;ENABLE_CRYPTO - prompt - 4 - false - true - - - - true - bin\Release\wpa81 - obj\Release\wpa81 - bin\Release\wpa81\MimeKit.xml - TRACE;PORTABLE;ENABLE_CRYPTO - prompt - 4 - false - true - - - true - - - mimekit.snk - - - - - {B76A64F9-B00E-4243-AE89-5D024CA3B436} - Portable.Text.Encoding.WindowsUniversal81 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.WindowsUniversal81.project.json b/MimeKit/MimeKit.WindowsUniversal81.project.json deleted file mode 100644 index 8a15ad6f14..0000000000 --- a/MimeKit/MimeKit.WindowsUniversal81.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "frameworks": { - ".NETPortable,Version=v4.5,Profile=Profile111": {} - }, - "runtimes": { - "win-anycpu": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 8a5a326c53..c045881c96 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -32,6 +32,12 @@ $(DefineConstants);NETSTANDARD + + $(DefineConstants);NETSTANDARD_1_3 + + + $(DefineConstants);NETSTANDARD_1_6 + $(DefineConstants);ENABLE_SNM;NETSTANDARD_2_0 diff --git a/MimeKit/MimeKitLite.Portable.csproj b/MimeKit/MimeKitLite.Portable.csproj deleted file mode 100644 index a044e54a93..0000000000 --- a/MimeKit/MimeKitLite.Portable.csproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - Debug - AnyCPU - 10.0.0 - 2.0 - {25C2DD3E-ED14-494F-9BD4-75536911C1BD} - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - MimeKitLite - Profile7 - v4.5 - 10.0 - - - true - full - false - bin\Debug\portable - obj\Debug\portable - DEBUG;TRACE;PORTABLE - prompt - 4 - false - true - - - pdbonly - true - bin\Release\portable - obj\Release\portable - bin\Release\portable\MimeKitLite.xml - TRACE;PORTABLE - prompt - 4 - false - true - - - true - - - mimekit.snk - - - - {EEE48C75-11BE-4B50-B759-F85B5052D473} - Portable.Text.Encoding - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKitLite.Portable.project.json b/MimeKit/MimeKitLite.Portable.project.json deleted file mode 100644 index dbfd9834e6..0000000000 --- a/MimeKit/MimeKitLite.Portable.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - ".NETPortable,Version=v4.5,Profile=Profile7": {} - }, - "runtimes": { - "win-anycpu": {} - }, -} diff --git a/MimeKit/MimeKitLite.WindowsUniversal81.csproj b/MimeKit/MimeKitLite.WindowsUniversal81.csproj deleted file mode 100644 index 007ff4b5b4..0000000000 --- a/MimeKit/MimeKitLite.WindowsUniversal81.csproj +++ /dev/null @@ -1,220 +0,0 @@ - - - - - 11.0 - Debug - AnyCPU - 10.0.0 - 2.0 - {5EB9F403-45B4-4F3A-B64E-0ECC94D14167} - Library - Properties - MimeKit - MimeKitLite - v4.5 - Profile111 - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug\wpa81 - obj\Debug\wpa81 - DEBUG;TRACE;PORTABLE - prompt - 4 - false - true - - - pdbonly - true - bin\Release\wpa81 - obj\Release\wpa81 - bin\Release\wpa81\MimeKitLite.xml - TRACE;PORTABLE - prompt - 4 - false - true - - - true - - - mimekit.snk - - - - - {B76A64F9-B00E-4243-AE89-5D024CA3B436} - Portable.Text.Encoding.WindowsUniversal81 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKitLite.WindowsUniversal81.project.json b/MimeKit/MimeKitLite.WindowsUniversal81.project.json deleted file mode 100644 index e01dcfbe78..0000000000 --- a/MimeKit/MimeKitLite.WindowsUniversal81.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - ".NETPortable,Version=v4.5,Profile=Profile111": {} - }, - "runtimes": { - "win-anycpu": {} - }, -} diff --git a/MimeKit/packages.MimeKit.Portable.config b/MimeKit/packages.MimeKit.Portable.config deleted file mode 100644 index 45b707ffb3..0000000000 --- a/MimeKit/packages.MimeKit.Portable.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MimeKit/packages.MimeKit.WindowsUniversal81.config b/MimeKit/packages.MimeKit.WindowsUniversal81.config deleted file mode 100644 index b441675f7f..0000000000 --- a/MimeKit/packages.MimeKit.WindowsUniversal81.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MimeKitLite.sln b/MimeKitLite.sln index e75ca7a2fc..b29cbbe3a5 100644 --- a/MimeKitLite.sln +++ b/MimeKitLite.sln @@ -9,14 +9,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.Android", "Mime EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.iOS", "MimeKit\MimeKitLite.iOS.csproj", "{5F211544-940D-46C9-98EB-4FD8F62506AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Portable.Text.Encoding", "submodules\Portable.Text.Encoding\Portable.Text.Encoding\Portable.Text.Encoding.csproj", "{EEE48C75-11BE-4B50-B759-F85B5052D473}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Portable.Text.Encoding.WindowsUniversal81", "submodules\Portable.Text.Encoding\Portable.Text.Encoding\Portable.Text.Encoding.WindowsUniversal81.csproj", "{B76A64F9-B00E-4243-AE89-5D024CA3B436}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.Portable", "MimeKit\MimeKitLite.Portable.csproj", "{25C2DD3E-ED14-494F-9BD4-75536911C1BD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.WindowsUniversal81", "MimeKit\MimeKitLite.WindowsUniversal81.csproj", "{5EB9F403-45B4-4F3A-B64E-0ECC94D14167}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.NetStandard", "MimeKit\MimeKitLite.NetStandard.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" EndProject Global @@ -37,22 +29,6 @@ Global {5F211544-940D-46C9-98EB-4FD8F62506AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F211544-940D-46C9-98EB-4FD8F62506AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F211544-940D-46C9-98EB-4FD8F62506AD}.Release|Any CPU.Build.0 = Release|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EEE48C75-11BE-4B50-B759-F85B5052D473}.Release|Any CPU.Build.0 = Release|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B76A64F9-B00E-4243-AE89-5D024CA3B436}.Release|Any CPU.Build.0 = Release|Any CPU - {25C2DD3E-ED14-494F-9BD4-75536911C1BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {25C2DD3E-ED14-494F-9BD4-75536911C1BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {25C2DD3E-ED14-494F-9BD4-75536911C1BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {25C2DD3E-ED14-494F-9BD4-75536911C1BD}.Release|Any CPU.Build.0 = Release|Any CPU - {5EB9F403-45B4-4F3A-B64E-0ECC94D14167}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5EB9F403-45B4-4F3A-B64E-0ECC94D14167}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5EB9F403-45B4-4F3A-B64E-0ECC94D14167}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5EB9F403-45B4-4F3A-B64E-0ECC94D14167}.Release|Any CPU.Build.0 = Release|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.Build.0 = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index a207ef1201..707b5e6aa8 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -95,12 +95,6 @@ - - - - - - @@ -122,12 +116,6 @@ - - - - - - diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 54d89840c4..e5ed1d2cc5 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -70,8 +70,6 @@ - - @@ -91,12 +89,6 @@ - - - - - - From 6b92a2e1d84793a5ae506d1d7aa86dab2d52d9b5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 Oct 2019 21:10:13 -0400 Subject: [PATCH 404/741] Removed #if PORTABLE and #if !PORTABLE logic --- MimeKit/AttachmentCollection.cs | 2 - MimeKit/ContentDisposition.cs | 4 - MimeKit/ContentType.cs | 4 - MimeKit/Cryptography/ArcSigner.cs | 2 - MimeKit/Cryptography/AuthenticationResults.cs | 4 - .../BouncyCastleCertificateExtensions.cs | 7 +- .../BouncyCastleSecureMimeContext.cs | 2 +- MimeKit/Cryptography/CmsRecipient.cs | 9 +- MimeKit/Cryptography/CmsSigner.cs | 9 +- MimeKit/Cryptography/CryptographyContext.cs | 30 +------ .../Cryptography/DkimPublicKeyLocatorBase.cs | 4 - MimeKit/Cryptography/DkimSigner.cs | 2 - MimeKit/Cryptography/DkimVerifierBase.cs | 4 - MimeKit/Cryptography/OpenPgpContext.cs | 82 +------------------ MimeKit/Cryptography/SecureMailboxAddress.cs | 4 - MimeKit/Cryptography/SecureMimeContext.cs | 2 - .../Cryptography/SqliteCertificateDatabase.cs | 2 +- .../Cryptography/X509CertificateDatabase.cs | 82 ++----------------- MimeKit/Cryptography/X509CertificateStore.cs | 8 -- MimeKit/GroupAddress.cs | 4 - MimeKit/Header.cs | 4 - MimeKit/HeaderId.cs | 2 +- MimeKit/HeaderList.cs | 6 -- MimeKit/IO/Filters/CharsetFilter.cs | 6 -- MimeKit/InternetAddress.cs | 14 ---- MimeKit/MailboxAddress.cs | 18 +--- MimeKit/MessageIdList.cs | 4 - MimeKit/MessagePartial.cs | 2 +- MimeKit/MimeEntity.cs | 10 +-- MimeKit/MimeMessage.cs | 10 +-- MimeKit/MimeParser.cs | 4 - MimeKit/MimePart.cs | 5 -- MimeKit/Multipart.cs | 4 - MimeKit/Parameter.cs | 5 -- MimeKit/ParameterList.cs | 6 -- MimeKit/ParserOptions.cs | 31 +------ MimeKit/Properties/AssemblyInfo.cs | 2 - MimeKit/Text/HtmlAttributeId.cs | 2 +- MimeKit/Text/HtmlTagId.cs | 2 +- MimeKit/Text/HtmlWriter.cs | 6 -- MimeKit/Text/TextConverter.cs | 10 --- MimeKit/TextPart.cs | 16 +--- MimeKit/Tnef/RtfCompressedToRtf.cs | 7 +- MimeKit/Tnef/TnefPart.cs | 7 +- MimeKit/Tnef/TnefPropertyReader.cs | 14 ---- MimeKit/Tnef/TnefReader.cs | 4 - MimeKit/Utils/CharsetUtils.cs | 14 ---- MimeKit/Utils/DateUtils.cs | 4 - MimeKit/Utils/MimeUtils.cs | 14 +--- MimeKit/Utils/ParseUtils.cs | 28 ------- MimeKit/Utils/Rfc2047.cs | 4 - 51 files changed, 35 insertions(+), 497 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index f041a474eb..c34c0da7ff 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -365,7 +365,6 @@ public MimeEntity Add (string fileName, Stream stream) return attachment; } -#if !PORTABLE /// /// Add the specified attachment. /// @@ -461,7 +460,6 @@ public MimeEntity Add (string fileName) return attachment; } } -#endif /// /// Add the specified attachment. diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index 80f273193d..de7927900f 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -27,10 +27,6 @@ using System; using System.Text; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; namespace MimeKit { diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index 98edbc3d94..0719e7c6f6 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -27,10 +27,6 @@ using System; using System.Text; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; namespace MimeKit { diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 0e91686105..a245a85373 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -101,7 +101,6 @@ protected ArcSigner (AsymmetricKeyParameter key, string domain, string selector, PrivateKey = key; } -#if !PORTABLE /// /// Initializes a new instance of the class. /// @@ -153,7 +152,6 @@ protected ArcSigner (string fileName, string domain, string selector, DkimSignat using (var stream = File.OpenRead (fileName)) PrivateKey = LoadPrivateKey (stream); } -#endif /// /// Initializes a new instance of the class. diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index b420d3c875..6a63ce60ad 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -29,10 +29,6 @@ using System.Globalization; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; namespace MimeKit.Cryptography { diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 7661510634..fb75138afc 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -28,6 +28,7 @@ using System.IO; using System.Text; using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.X509; @@ -36,10 +37,6 @@ using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; -#if !PORTABLE -using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; -#endif - namespace MimeKit.Cryptography { /// /// Extension methods for use with BouncyCastle X509Certificates. @@ -49,7 +46,6 @@ namespace MimeKit.Cryptography { /// public static class BouncyCastleCertificateExtensions { -#if !PORTABLE /// /// Convert a BouncyCastle certificate into an X509Certificate2. /// @@ -68,7 +64,6 @@ public static X509Certificate2 AsX509Certificate2 (this X509Certificate certific return new X509Certificate2 (certificate.GetEncoded ()); } -#endif /// /// Gets the issuer name info. diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 49d3217d31..9b0749352b 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -626,7 +626,7 @@ async Task DownloadCrlsOverHttpAsync (string location, Stream stream, bool using (var response = await client.GetAsync (location, cancellationToken).ConfigureAwait (false)) await response.Content.CopyToAsync (stream).ConfigureAwait (false); } else { -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 cancellationToken.ThrowIfCancellationRequested (); var request = (HttpWebRequest) WebRequest.Create (location); diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index de9263d095..8fe15384ae 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -26,13 +26,10 @@ using System; using System.IO; +using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.X509; -#if !PORTABLE -using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; -#endif - namespace MimeKit.Cryptography { /// /// An S/MIME recipient. @@ -117,7 +114,6 @@ public CmsRecipient (Stream stream, SubjectIdentifierType recipientIdentifierTyp EncryptionAlgorithms = Certificate.GetEncryptionAlgorithms (); } -#if !PORTABLE /// /// Initializes a new instance of the class. /// @@ -175,9 +171,8 @@ public CmsRecipient (string fileName, SubjectIdentifierType recipientIdentifierT EncryptionAlgorithms = Certificate.GetEncryptionAlgorithms (); } -#endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 /// /// Initializes a new instance of the class. /// diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index ce708ae1d6..2aae5a4899 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -27,10 +27,7 @@ using System; using System.IO; using System.Collections.Generic; - -#if !PORTABLE -using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; -#endif +using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Pkcs; @@ -239,7 +236,6 @@ public CmsSigner (Stream stream, string password) : this () LoadPkcs12 (stream, password); } -#if !PORTABLE /// /// Initializes a new instance of the class. /// @@ -290,9 +286,8 @@ public CmsSigner (string fileName, string password) : this () using (var stream = File.OpenRead (fileName)) LoadPkcs12 (stream, password); } -#endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 /// /// Initializes a new instance of the class. /// diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 3265c3b0f4..4ad70215ca 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -542,10 +542,9 @@ public static CryptographyContext Create (string protocol) if (SecureMimeContextFactory != null) return SecureMimeContextFactory (); -#if !PORTABLE if (!SqliteCertificateDatabase.IsAvailable) { const string format = "SQLite is not available. Either install the {0} nuget or subclass MimeKit.Cryptography.SecureMimeContext and register it with MimeKit.Cryptography.CryptographyContext.Register()."; -#if NETSTANDARD +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 throw new NotSupportedException (string.Format (format, "Microsoft.Data.Sqlite")); #else throw new NotSupportedException (string.Format (format, "System.Data.SQLite")); @@ -553,9 +552,6 @@ public static CryptographyContext Create (string protocol) } return new DefaultSecureMimeContext (); -#else - throw new NotSupportedException (string.Format (SubclassAndRegisterFormat, "MimeKit.Cryptography.SecureMimeContext")); -#endif case "application/x-pgp-signature": case "application/pgp-signature": case "application/x-pgp-encrypted": @@ -572,22 +568,6 @@ public static CryptographyContext Create (string protocol) } } -#if PORTABLE - static ConstructorInfo GetConstructor (TypeInfo type) - { - foreach (var ctor in type.DeclaredConstructors) { - var args = ctor.GetParameters (); - - if (args.Length != 0) - continue; - - return ctor; - } - - return null; - } -#endif - /// /// Registers a default or . /// @@ -611,17 +591,13 @@ public static void Register (Type type) if (type == null) throw new ArgumentNullException (nameof (type)); -#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 var info = type.GetTypeInfo (); #else var info = type; #endif - -#if PORTABLE - var ctor = GetConstructor (info); -#else var ctor = type.GetConstructor (new Type[0]); -#endif + if (ctor == null) throw new ArgumentException ("The specified type must have a parameterless constructor.", nameof (type)); diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index 7768ea08a0..ae1fa40a4e 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -30,10 +30,6 @@ using System.Threading; using System.Threading.Tasks; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using Org.BouncyCastle.Crypto; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Crypto.Parameters; diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 3b665d3d2b..ce92dd46d3 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -106,7 +106,6 @@ public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, D PrivateKey = key; } -#if !PORTABLE /// /// Initializes a new instance of the class. /// @@ -162,7 +161,6 @@ public DkimSigner (string fileName, string domain, string selector, DkimSignatur using (var stream = File.OpenRead (fileName)) PrivateKey = LoadPrivateKey (stream); } -#endif /// /// Initializes a new instance of the class. diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 53651ed5ac..5caf139f59 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -30,10 +30,6 @@ using System.Globalization; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Signers; diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index ac62a94e5d..a3c10a20f4 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -112,47 +112,6 @@ protected OpenPgpContext () client = new HttpClient (); } -#if PORTABLE - /// - /// Initializes a new instance of the class. - /// - /// - /// Creates a new using the specified public and private keyrings. - /// - /// The public keyring. - /// The secret keyring. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// An error occurred while reading one of the keyring files. - /// - /// - /// An error occurred while parsing one of the keyring files. - /// - protected OpenPgpContext (Stream pubring, Stream secring) : this () - { - if (pubring == null) - throw new ArgumentNullException ("pubring"); - - if (secring == null) - throw new ArgumentNullException ("secring"); - - PublicKeyRing = pubring; - SecretKeyRing = secring; - - PublicKeyRingBundle = new PgpPublicKeyRingBundle (pubring); - SecretKeyRingBundle = new PgpSecretKeyRingBundle (secring); - - if (pubring.CanSeek) - pubring.Seek (0, SeekOrigin.Begin); - - if (secring.CanSeek) - secring.Seek (0, SeekOrigin.Begin); - } -#else /// /// Initializes a new instance of the class. /// @@ -199,7 +158,6 @@ protected OpenPgpContext (string pubring, string secring) : this () SecretKeyRingBundle = new PgpSecretKeyRingBundle (new byte[0]); } } -#endif /// /// Get or set the default encryption algorithm. @@ -266,29 +224,6 @@ public bool AutoKeyRetrieve { get; set; } -#if PORTABLE - /// - /// Get the public keyring. - /// - /// - /// Gets the public keyring. - /// - /// The public key ring. - protected Stream PublicKeyRing { - get; set; - } - - /// - /// Get the secret keyring. - /// - /// - /// Gets the secret keyring. - /// - /// The secret key ring. - protected Stream SecretKeyRing { - get; set; - } -#else /// /// Get the public keyring path. /// @@ -310,7 +245,6 @@ protected string PublicKeyRingPath { protected string SecretKeyRingPath { get; set; } -#endif /// /// Get the public keyring bundle. @@ -546,7 +480,7 @@ async Task RetrievePublicKeyRingAsync (long keyId, bool doAsyn using (var response = await client.GetAsync (uri.ToString (), cancellationToken).ConfigureAwait (false)) await response.Content.CopyToAsync (filtered).ConfigureAwait (false); } else { -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 var request = (HttpWebRequest) WebRequest.Create (uri.ToString ()); using (var response = request.GetResponse ()) { var content = response.GetResponseStream (); @@ -1124,7 +1058,7 @@ public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? } if (random == null) { -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 random = new SecureRandom (new CryptoApiRandomGenerator ()); #else random = new SecureRandom (); @@ -2402,7 +2336,6 @@ async Task DecryptToAsync (Stream encryptedData, Str /// protected void SavePublicKeyRingBundle () { -#if !PORTABLE var filename = Path.GetFileName (PublicKeyRingPath) + "~"; var dirname = Path.GetDirectoryName (PublicKeyRingPath); var tmp = Path.Combine (dirname, "." + filename); @@ -2427,10 +2360,6 @@ protected void SavePublicKeyRingBundle () } else { File.Move (tmp, PublicKeyRingPath); } -#else - PublicKeyRingBundle.Encode (PublicKeyRing); - PublicKeyRing.Seek (0, SeekOrigin.Begin); -#endif } /// @@ -2445,7 +2374,6 @@ protected void SavePublicKeyRingBundle () /// protected void SaveSecretKeyRingBundle () { -#if !PORTABLE var filename = Path.GetFileName (SecretKeyRingPath) + "~"; var dirname = Path.GetDirectoryName (SecretKeyRingPath); var tmp = Path.Combine (dirname, "." + filename); @@ -2459,7 +2387,7 @@ protected void SaveSecretKeyRingBundle () } if (File.Exists (SecretKeyRingPath)) { -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 File.Replace (tmp, SecretKeyRingPath, bak); #else if (File.Exists (bak)) @@ -2470,10 +2398,6 @@ protected void SaveSecretKeyRingBundle () } else { File.Move (tmp, SecretKeyRingPath); } -#else - SecretKeyRingBundle.Encode (SecretKeyRing); - SecretKeyRing.Seek (0, SeekOrigin.Begin); -#endif } /// diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index c29cfdd6e5..c6776795ac 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -28,10 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; namespace MimeKit.Cryptography { diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 378b2deae1..2dee29f2b9 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -727,7 +727,6 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute () /// public abstract void Import (Stream stream, string password); -#if !PORTABLE /// /// Imports certificates and keys from a pkcs12 file. /// @@ -776,7 +775,6 @@ public virtual void Import (string fileName, string password) using (var stream = File.OpenRead (fileName)) Import (stream, password); } -#endif /// /// Imports the specified certificate. diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 4d66c9b8fc..4fb9d29698 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -68,7 +68,7 @@ static SqliteCertificateDatabase () var platform = Environment.OSVersion.Platform; #endif -#if NETSTANDARD +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 || NETSTANDARD_2_0 try { if ((sqliteAssembly = Assembly.Load (new AssemblyName ("Microsoft.Data.Sqlite"))) != null) { sqliteConnectionClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnection"); diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 8d1c893e14..175e8b907c 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -131,7 +131,7 @@ protected int SaltSize { static int ReadBinaryBlob (DbDataReader reader, int column, ref byte[] buffer) { -#if NETSTANDARD +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 buffer = reader.GetFieldValue (column); return (int) buffer.Length; #else @@ -587,21 +587,13 @@ public X509CertificateRecord Find (X509Certificate certificate, X509CertificateR throw new ArgumentNullException (nameof (certificate)); using (var command = GetSelectCommand (certificate, fields)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { if (reader.Read ()) { var parser = new X509CertificateParser (); var buffer = new byte[4096]; return LoadCertificateRecord (reader, parser, ref buffer); } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -620,9 +612,7 @@ public X509CertificateRecord Find (X509Certificate certificate, X509CertificateR public IEnumerable FindCertificates (IX509Selector selector) { using (var command = GetSelectCommand (selector, false, false, X509CertificateRecordFields.Certificate)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { var parser = new X509CertificateParser (); var buffer = new byte[4096]; @@ -631,12 +621,6 @@ public IEnumerable FindCertificates (IX509Selector selector) if (selector == null || selector.Match (record.Certificate)) yield return record.Certificate; } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -655,9 +639,7 @@ public IEnumerable FindCertificates (IX509Selector selector) public IEnumerable FindPrivateKeys (IX509Selector selector) { using (var command = GetSelectCommand (selector, false, true, PrivateKeyFields)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { var parser = new X509CertificateParser (); var buffer = new byte[4096]; @@ -667,12 +649,6 @@ public IEnumerable FindPrivateKeys (IX509Selector select if (selector == null || selector.Match (record.Certificate)) yield return record.PrivateKey; } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -701,21 +677,13 @@ public IEnumerable Find (MailboxAddress mailbox, DateTime throw new ArgumentNullException (nameof (mailbox)); using (var command = GetSelectCommand (mailbox, now, requirePrivateKey, fields)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { var parser = new X509CertificateParser (); var buffer = new byte[4096]; while (reader.Read ()) { yield return LoadCertificateRecord (reader, parser, ref buffer); } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -736,9 +704,7 @@ public IEnumerable Find (MailboxAddress mailbox, DateTime public IEnumerable Find (IX509Selector selector, bool trustedOnly, X509CertificateRecordFields fields) { using (var command = GetSelectCommand (selector, trustedOnly, false, fields | X509CertificateRecordFields.Certificate)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { var parser = new X509CertificateParser (); var buffer = new byte[4096]; @@ -748,12 +714,6 @@ public IEnumerable Find (IX509Selector selector, bool tru if (selector == null || selector.Match (record.Certificate)) yield return record; } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -837,21 +797,13 @@ public IEnumerable Find (X509Name issuer, X509CrlRecordFields fie throw new ArgumentNullException (nameof (issuer)); using (var command = GetSelectCommand (issuer, fields)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { var parser = new X509CrlParser (); var buffer = new byte[4096]; while (reader.Read ()) { yield return LoadCrlRecord (reader, parser, ref buffer); } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -877,21 +829,13 @@ public X509CrlRecord Find (X509Crl crl, X509CrlRecordFields fields) throw new ArgumentNullException (nameof (crl)); using (var command = GetSelectCommand (crl, fields)) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { if (reader.Read ()) { var parser = new X509CrlParser (); var buffer = new byte[4096]; return LoadCrlRecord (reader, parser, ref buffer); } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } @@ -967,9 +911,7 @@ public IX509Store GetCrlStore () var crls = new List (); using (var command = GetSelectAllCrlsCommand ()) { - var reader = command.ExecuteReader (); - - try { + using (var reader = command.ExecuteReader ()) { var parser = new X509CrlParser (); var buffer = new byte[4096]; @@ -977,12 +919,6 @@ public IX509Store GetCrlStore () var record = LoadCrlRecord (reader, parser, ref buffer); crls.Add (record.Crl); } - } finally { -#if NETSTANDARD - reader.Dispose (); -#else - reader.Close (); -#endif } } diff --git a/MimeKit/Cryptography/X509CertificateStore.cs b/MimeKit/Cryptography/X509CertificateStore.cs index ed94cf8d2b..35b662d9c4 100644 --- a/MimeKit/Cryptography/X509CertificateStore.cs +++ b/MimeKit/Cryptography/X509CertificateStore.cs @@ -196,7 +196,6 @@ public void Import (Stream stream) } } -#if !PORTABLE /// /// Imports the certificate(s) from the specified file. /// @@ -221,7 +220,6 @@ public void Import (string fileName) using (var stream = File.OpenRead (fileName)) Import (stream); } -#endif /// /// Imports the certificate(s) from the specified byte array. @@ -289,7 +287,6 @@ public void Import (Stream stream, string password) } } -#if !PORTABLE /// /// Imports certificates and private keys from the specified file. /// @@ -325,7 +322,6 @@ public void Import (string fileName, string password) using (var stream = File.OpenRead (fileName)) Import (stream, password); } -#endif /// /// Imports certificates and private keys from the specified byte array. @@ -373,7 +369,6 @@ public void Export (Stream stream) } } -#if !PORTABLE /// /// Exports the certificates to an unencrypted file. /// @@ -409,7 +404,6 @@ public void Export (string fileName) using (var file = File.Create (fileName)) Export (file); } -#endif /// /// Exports the specified stream and password to a pkcs12 encrypted file. @@ -468,7 +462,6 @@ public void Export (Stream stream, string password) store.Save (stream, password.ToCharArray (), new SecureRandom ()); } -#if !PORTABLE /// /// Exports the specified stream and password to a pkcs12 encrypted file. /// @@ -510,7 +503,6 @@ public void Export (string fileName, string password) using (var file = File.Create (fileName)) Export (file, password); } -#endif /// /// Gets an enumerator of matching X.509 certificates based on the specified selector. diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 3914a2525b..1e74cda9b7 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -29,10 +29,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; namespace MimeKit { diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 488ccdb360..a3fa89d3ed 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -28,10 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; using MimeKit.Cryptography; diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 6d9836b130..8b0351b8b6 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -758,7 +758,7 @@ public static string ToHeaderName (this HeaderId value) { var name = value.ToString (); -#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 var field = typeof (HeaderId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HeaderNameAttribute), false).ToArray (); #else diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index 72ac40f891..682947a231 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -32,10 +32,6 @@ using System.Threading.Tasks; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.IO; using MimeKit.Utils; @@ -1368,7 +1364,6 @@ internal bool TryGetHeader (string field, out Header header) return LoadAsync (ParserOptions.Default, stream, cancellationToken); } -#if !PORTABLE /// /// Load a from the specified file. /// @@ -1552,6 +1547,5 @@ internal bool TryGetHeader (string field, out Header header) { return LoadAsync (ParserOptions.Default, fileName, cancellationToken); } -#endif // !PORTABLE } } diff --git a/MimeKit/IO/Filters/CharsetFilter.cs b/MimeKit/IO/Filters/CharsetFilter.cs index 343cca9e6d..f67939f206 100644 --- a/MimeKit/IO/Filters/CharsetFilter.cs +++ b/MimeKit/IO/Filters/CharsetFilter.cs @@ -27,12 +27,6 @@ using System; using System.Text; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif - using MimeKit.Utils; namespace MimeKit.IO.Filters { diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 6a84e0806c..c924d41cbb 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -28,20 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using EncoderReplacementFallback = Portable.Text.EncoderReplacementFallback; -using DecoderReplacementFallback = Portable.Text.DecoderReplacementFallback; -using EncoderExceptionFallback = Portable.Text.EncoderExceptionFallback; -using DecoderExceptionFallback = Portable.Text.DecoderExceptionFallback; -using EncoderFallbackException = Portable.Text.EncoderFallbackException; -using DecoderFallbackException = Portable.Text.DecoderFallbackException; -using DecoderFallbackBuffer = Portable.Text.DecoderFallbackBuffer; -using DecoderFallback = Portable.Text.DecoderFallback; -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif - using MimeKit.Utils; namespace MimeKit { diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index d270039c75..264d11df5b 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -28,10 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - #if ENABLE_SNM using System.Net.Mail; #endif @@ -307,7 +303,6 @@ public bool IsInternational { static string EncodeAddrspec (string addrspec, int at) { -#if !PORTABLE if (at != -1) { var domain = addrspec.Substring (at + 1); var local = addrspec.Substring (0, at); @@ -320,7 +315,7 @@ static string EncodeAddrspec (string addrspec, int at) return local + "@" + domain; } -#endif + return addrspec; } @@ -340,7 +335,6 @@ public static string EncodeAddrspec (string addrspec) if (addrspec == null) throw new ArgumentNullException (nameof (addrspec)); -#if !PORTABLE if (addrspec.Length == 0) return addrspec; @@ -352,14 +346,10 @@ public static string EncodeAddrspec (string addrspec) return addrspec; return EncodeAddrspec (address, at); -#else - return addrspec; -#endif } static string DecodeAddrspec (string addrspec, int at) { -#if !PORTABLE if (at != -1) { var domain = addrspec.Substring (at + 1); var local = addrspec.Substring (0, at); @@ -372,7 +362,7 @@ static string DecodeAddrspec (string addrspec, int at) return local + "@" + domain; } -#endif + return addrspec; } @@ -392,7 +382,6 @@ public static string DecodeAddrspec (string addrspec) if (addrspec == null) throw new ArgumentNullException (nameof (addrspec)); -#if !PORTABLE if (addrspec.Length == 0) return addrspec; @@ -404,9 +393,6 @@ public static string DecodeAddrspec (string addrspec) return addrspec; return DecodeAddrspec (address, at); -#else - return addrspec; -#endif } internal override void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength) diff --git a/MimeKit/MessageIdList.cs b/MimeKit/MessageIdList.cs index a1c5ffabad..9d642c9544 100644 --- a/MimeKit/MessageIdList.cs +++ b/MimeKit/MessageIdList.cs @@ -29,10 +29,6 @@ using System.Collections; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; namespace MimeKit { diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 403000fa57..1640f08ed0 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -216,7 +216,7 @@ public static IEnumerable Split (MimeMessage message, int maxSize) } var streams = new List (); -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 var buf = memory.GetBuffer (); #else var buf = memory.ToArray (); diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 1d037f9806..bf578f0378 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -32,10 +32,6 @@ using System.Threading.Tasks; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; using MimeKit.IO; @@ -343,7 +339,7 @@ public override string ToString () using (var memory = new MemoryStream ()) { WriteTo (memory); -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); @@ -608,7 +604,6 @@ public virtual void Accept (MimeVisitor visitor) return WriteToAsync (FormatOptions.Default, stream, false, cancellationToken); } -#if !PORTABLE /// /// Write the to the specified file. /// @@ -948,7 +943,6 @@ public virtual void Accept (MimeVisitor visitor) { return WriteToAsync (FormatOptions.Default, fileName, cancellationToken); } -#endif // !PORTABLE /// /// Removes the header. @@ -1397,7 +1391,6 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) return LoadAsync (ParserOptions.Default, stream, false, cancellationToken); } -#if !PORTABLE /// /// Load a from the specified file. /// @@ -1581,7 +1574,6 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) { return LoadAsync (ParserOptions.Default, fileName, cancellationToken); } -#endif // !PORTABLE /// /// Load a from the specified content stream. diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index cef24ca6fb..5a1438bf1f 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -33,10 +33,6 @@ using System.Threading.Tasks; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - #if ENABLE_SNM using System.Net.Mail; #endif @@ -994,7 +990,7 @@ public override string ToString () using (var memory = new MemoryStream ()) { WriteTo (FormatOptions.Default, memory); -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); @@ -1341,7 +1337,6 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = return WriteToAsync (FormatOptions.Default, stream, false, cancellationToken); } -#if !PORTABLE /// /// Write the message to the specified file. /// @@ -1511,7 +1506,6 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = { return WriteToAsync (FormatOptions.Default, fileName, cancellationToken); } -#endif MailboxAddress GetMessageSigner () { @@ -2791,7 +2785,6 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) return LoadAsync (ParserOptions.Default, stream, false, cancellationToken); } -#if !PORTABLE /// /// Load a from the specified file. /// @@ -2975,7 +2968,6 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) { return LoadAsync (ParserOptions.Default, fileName, cancellationToken); } -#endif // !PORTABLE #if ENABLE_SNM static MimePart GetMimePart (AttachmentBase item) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 9de846e1c1..1332b62aa1 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -32,10 +32,6 @@ using System.Collections; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Utils; using MimeKit.IO; diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index c3f1eec0c7..89286454dd 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -30,12 +30,7 @@ using System.Threading; using System.Threading.Tasks; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -using MD5 = MimeKit.Cryptography.MD5; -#else using MD5 = System.Security.Cryptography.MD5; -#endif using MimeKit.IO.Filters; using MimeKit.Encodings; diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index d3324c8bd2..56b16adb8b 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -32,10 +32,6 @@ using System.Threading.Tasks; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Encodings; using MimeKit.Utils; using MimeKit.IO; diff --git a/MimeKit/Parameter.cs b/MimeKit/Parameter.cs index b2f3687e54..6f865f5d1c 100644 --- a/MimeKit/Parameter.cs +++ b/MimeKit/Parameter.cs @@ -27,11 +27,6 @@ using System; using System.Text; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -#endif - using MimeKit.Encodings; using MimeKit.Utils; diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index ec8fbdbfdd..63e69edd22 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -30,12 +30,6 @@ using System.Collections; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif - using MimeKit.Encodings; using MimeKit.Utils; diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index d61ec5aee7..7950a32b07 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -29,10 +29,6 @@ using System.Reflection; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - #if ENABLE_CRYPTO using MimeKit.Cryptography; #endif @@ -210,27 +206,6 @@ public ParserOptions Clone () return options; } -#if PORTABLE - static ConstructorInfo GetConstructor (TypeInfo type, Type[] argTypes) - { - foreach (var ctor in type.DeclaredConstructors) { - var args = ctor.GetParameters (); - - if (args.Length != ConstructorArgTypes.Length) - continue; - - bool matched = true; - for (int i = 0; i < argTypes.Length && matched; i++) - matched = matched && args[i].ParameterType == argTypes[i]; - - if (matched) - return ctor; - } - - return null; - } -#endif - /// /// Registers the subclass for the specified mime-type. /// @@ -264,7 +239,7 @@ public void RegisterMimeType (string mimeType, Type type) mimeType = mimeType.ToLowerInvariant (); -#if PORTABLE || NETSTANDARD +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 var info = type.GetTypeInfo (); #else var info = type; @@ -275,11 +250,7 @@ public void RegisterMimeType (string mimeType, Type type) !info.IsSubclassOf (typeof (MimePart))) throw new ArgumentException ("The specified type must be a subclass of MessagePart, Multipart, or MimePart.", nameof (type)); -#if PORTABLE - var ctor = GetConstructor (info, ConstructorArgTypes); -#else var ctor = type.GetConstructor (ConstructorArgTypes); -#endif if (ctor == null) throw new ArgumentException ("The specified type must have a constructor that takes a MimeEntityConstructorArgs argument.", nameof (type)); diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index d4f7b1744f..a5dd63f35c 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -44,7 +44,6 @@ // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible (true)] -#if !PORTABLE // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid ("2fe79b66-d107-45da-9493-175f59c4a53c")] [assembly: InternalsVisibleTo ("UnitTests, PublicKey=002400000480000094000000060200" + @@ -52,7 +51,6 @@ "4656c5bfe4c47803453a91ae525f723f4316fd90a3f87366f4d948593277e950f6d2df6ee26068" + "1877a6d9e71c3ea77e87e61f3878af1d69bf10dce8debe92c54ca8a10afc44dc08674f3db6594e" + "f545d67d31cc3e18b8f90d8f220c4b67d7e87f5b7e8df410ac8faeb3")] -#endif // Version information for an assembly consists of the following four values: // diff --git a/MimeKit/Text/HtmlAttributeId.cs b/MimeKit/Text/HtmlAttributeId.cs index 7dcebc330f..a94555433f 100644 --- a/MimeKit/Text/HtmlAttributeId.cs +++ b/MimeKit/Text/HtmlAttributeId.cs @@ -621,7 +621,7 @@ public static string ToAttributeName (this HtmlAttributeId value) { var name = value.ToString (); -#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 var field = typeof (HtmlAttributeId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HtmlAttributeNameAttribute), false).ToArray (); #else diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index e50b1e325d..a05472ddbf 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -766,7 +766,7 @@ public static string ToHtmlTagName (this HtmlTagId value) var name = value.ToString (); -#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 var field = typeof (HtmlTagId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HtmlTagNameAttribute), false).ToArray (); #else diff --git a/MimeKit/Text/HtmlWriter.cs b/MimeKit/Text/HtmlWriter.cs index 714f2a1aa5..4987cfc0ec 100644 --- a/MimeKit/Text/HtmlWriter.cs +++ b/MimeKit/Text/HtmlWriter.cs @@ -28,12 +28,6 @@ using System.IO; using System.Text; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#else -using Encoding = System.Text.Encoding; -#endif - namespace MimeKit.Text { /// /// An HTML writer. diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index 20be03510c..4856f0613c 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -29,16 +29,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#else -using Encoding = System.Text.Encoding; -using Encoder = System.Text.Encoder; -using Decoder = System.Text.Decoder; -#endif - namespace MimeKit.Text { /// /// An abstract class for converting text from one format to another. diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index d490a2754f..7ab48176d3 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -28,20 +28,6 @@ using System.IO; using System.Text; -#if PORTABLE -using EncoderReplacementFallback = Portable.Text.EncoderReplacementFallback; -using DecoderReplacementFallback = Portable.Text.DecoderReplacementFallback; -using EncoderExceptionFallback = Portable.Text.EncoderExceptionFallback; -using DecoderExceptionFallback = Portable.Text.DecoderExceptionFallback; -using EncoderFallbackException = Portable.Text.EncoderFallbackException; -using DecoderFallbackException = Portable.Text.DecoderFallbackException; -using DecoderFallbackBuffer = Portable.Text.DecoderFallbackBuffer; -using DecoderFallback = Portable.Text.DecoderFallback; -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif - using MimeKit.IO; using MimeKit.Text; using MimeKit.Utils; @@ -415,7 +401,7 @@ public string GetText (Encoding encoding) filtered.Flush (); } -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 || __MOBILE__ +#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/Tnef/RtfCompressedToRtf.cs b/MimeKit/Tnef/RtfCompressedToRtf.cs index 5fee7a1844..524a314e52 100644 --- a/MimeKit/Tnef/RtfCompressedToRtf.cs +++ b/MimeKit/Tnef/RtfCompressedToRtf.cs @@ -25,16 +25,11 @@ // using System; +using System.Text; using MimeKit.IO.Filters; using MimeKit.Utils; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#else -using Encoding = System.Text.Encoding; -#endif - namespace MimeKit.Tnef { /// /// A filter to decompress a compressed RTF stream. diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 5fe64a98f5..9b566b700a 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -26,14 +26,9 @@ using System; using System.IO; +using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#else -using Encoding = System.Text.Encoding; -#endif - using MimeKit.IO; using MimeKit.Utils; using MimeKit.IO.Filters; diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index 05434d9642..d1b91b54b8 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -28,20 +28,6 @@ using System.IO; using System.Text; -#if PORTABLE -using EncoderReplacementFallback = Portable.Text.EncoderReplacementFallback; -using DecoderReplacementFallback = Portable.Text.DecoderReplacementFallback; -using EncoderExceptionFallback = Portable.Text.EncoderExceptionFallback; -using DecoderExceptionFallback = Portable.Text.DecoderExceptionFallback; -using EncoderFallbackException = Portable.Text.EncoderFallbackException; -using DecoderFallbackException = Portable.Text.DecoderFallbackException; -using DecoderFallbackBuffer = Portable.Text.DecoderFallbackBuffer; -using DecoderFallback = Portable.Text.DecoderFallback; -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif - namespace MimeKit.Tnef { /// /// A TNEF property reader. diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index 59aa19fd25..6b38423786 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -28,10 +28,6 @@ using System.IO; using System.Text; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - namespace MimeKit.Tnef { /// /// A TNEF reader. diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index 0d798d0568..7604fc9ebd 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -28,20 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using EncoderReplacementFallback = Portable.Text.EncoderReplacementFallback; -using DecoderReplacementFallback = Portable.Text.DecoderReplacementFallback; -using EncoderExceptionFallback = Portable.Text.EncoderExceptionFallback; -using DecoderExceptionFallback = Portable.Text.DecoderExceptionFallback; -using EncoderFallbackException = Portable.Text.EncoderFallbackException; -using DecoderFallbackException = Portable.Text.DecoderFallbackException; -using DecoderFallbackBuffer = Portable.Text.DecoderFallbackBuffer; -using DecoderFallback = Portable.Text.DecoderFallback; -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif - namespace MimeKit.Utils { static class CharsetUtils { diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index e78cf4f55b..9b4b66f955 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -28,10 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - namespace MimeKit.Utils { [Flags] enum DateTokenFlags : byte diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 2df0cce6b2..a84e76bf3b 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -27,11 +27,8 @@ using System; using System.Text; using System.Collections.Generic; - -#if !PORTABLE using System.Net.NetworkInformation; using System.Security.Cryptography; -#endif namespace MimeKit.Utils { /// @@ -42,9 +39,6 @@ namespace MimeKit.Utils { /// public static class MimeUtils { -#if PORTABLE - static readonly Random random = new Random ((int) DateTime.Now.Ticks); -#endif const string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /// @@ -57,14 +51,8 @@ public static class MimeUtils internal static void GetRandomBytes (byte[] buffer) { -#if !PORTABLE using (var random = RandomNumberGenerator.Create ()) random.GetBytes (buffer); -#else - lock (random) { - random.NextBytes (buffer); - } -#endif } /// @@ -125,7 +113,7 @@ public static string GenerateMessageId (string domain) /// The message identifier. public static string GenerateMessageId () { -#if PORTABLE || NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD_1_3 || NETSTANDARD_1_6 return GenerateMessageId ("localhost.localdomain"); #else var properties = IPGlobalProperties.GetIPGlobalProperties (); diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index b27e988a7a..9aaf60f166 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -26,28 +26,12 @@ using System; using System.Text; -#if !PORTABLE using System.Globalization; -#else -using EncoderReplacementFallback = Portable.Text.EncoderReplacementFallback; -using DecoderReplacementFallback = Portable.Text.DecoderReplacementFallback; -using EncoderExceptionFallback = Portable.Text.EncoderExceptionFallback; -using DecoderExceptionFallback = Portable.Text.DecoderExceptionFallback; -using EncoderFallbackException = Portable.Text.EncoderFallbackException; -using DecoderFallbackException = Portable.Text.DecoderFallbackException; -using DecoderFallbackBuffer = Portable.Text.DecoderFallbackBuffer; -using DecoderFallback = Portable.Text.DecoderFallback; -using Encoding = Portable.Text.Encoding; -using Encoder = Portable.Text.Encoder; -using Decoder = Portable.Text.Decoder; -#endif namespace MimeKit.Utils { static class ParseUtils { -#if !PORTABLE static readonly IdnMapping idn = new IdnMapping (); -#endif public static void ValidateArguments (ParserOptions options, byte[] buffer, int startIndex, int length) { @@ -542,7 +526,6 @@ public static bool IsIdnEncoded (string value) return value.IndexOf (".xn--", StringComparison.Ordinal) != -1; } -#if !PORTABLE public static string IdnEncode (string unicode) { try { @@ -560,16 +543,5 @@ public static string IdnDecode (string ascii) return ascii; } } -#else - public static string IdnEncode (string unicode) - { - return unicode; - } - - public static string IdnDecode (string ascii) - { - return ascii; - } -#endif } } diff --git a/MimeKit/Utils/Rfc2047.cs b/MimeKit/Utils/Rfc2047.cs index ecb8914d40..8091ca4cb7 100644 --- a/MimeKit/Utils/Rfc2047.cs +++ b/MimeKit/Utils/Rfc2047.cs @@ -28,10 +28,6 @@ using System.Text; using System.Collections.Generic; -#if PORTABLE -using Encoding = Portable.Text.Encoding; -#endif - using MimeKit.Encodings; namespace MimeKit.Utils { From 831406fbfd3b7dbf2b85a712593811db482ddb7e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 Oct 2019 21:12:17 -0400 Subject: [PATCH 405/741] Removed submodules/Portable.Text.Encoding --- submodules/Portable.Text.Encoding | 1 - 1 file changed, 1 deletion(-) delete mode 160000 submodules/Portable.Text.Encoding diff --git a/submodules/Portable.Text.Encoding b/submodules/Portable.Text.Encoding deleted file mode 160000 index 74147c65ff..0000000000 --- a/submodules/Portable.Text.Encoding +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 74147c65fff30b872ea585fccf2c384b8d708353 From 23ed441a87728ba48b3108c5665f72b1c5da2713 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 Oct 2019 21:18:10 -0400 Subject: [PATCH 406/741] Fixed the build --- .../BouncyCastleCertificateExtensions.cs | 3 ++- MimeKit/Cryptography/CmsRecipient.cs | 3 ++- MimeKit/Cryptography/CmsSigner.cs | 3 ++- MimeKit/Text/FlowedToText.cs | 24 ------------------- 4 files changed, 6 insertions(+), 27 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index fb75138afc..8d82dcd6a4 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -28,7 +28,6 @@ using System.IO; using System.Text; using System.Collections.Generic; -using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.X509; @@ -37,6 +36,8 @@ using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; +using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; + namespace MimeKit.Cryptography { /// /// Extension methods for use with BouncyCastle X509Certificates. diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 8fe15384ae..c8bfa9d448 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -26,10 +26,11 @@ using System; using System.IO; -using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.X509; +using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; + namespace MimeKit.Cryptography { /// /// An S/MIME recipient. diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 2aae5a4899..8f85871e7e 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Collections.Generic; -using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Pkcs; @@ -35,6 +34,8 @@ using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Asn1.Cms; +using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2; + namespace MimeKit.Cryptography { /// /// An S/MIME signer. diff --git a/MimeKit/Text/FlowedToText.cs b/MimeKit/Text/FlowedToText.cs index 07cc23b1a0..ad6bda8f4e 100644 --- a/MimeKit/Text/FlowedToText.cs +++ b/MimeKit/Text/FlowedToText.cs @@ -84,30 +84,6 @@ public bool DeleteSpace { get; set; } - /// - /// Get or set the text that will be appended to the end of the output. - /// - /// - /// Gets or sets the text that will be appended to the end of the output. - /// The footer must be set before conversion begins. - /// - /// The footer. - public string Footer { - get; set; - } - - /// - /// Get or set text that will be prepended to the beginning of the output. - /// - /// - /// Gets or sets the text that will be prepended to the beginning of the output. - /// The header must be set before conversion begins. - /// - /// The header. - public string Header { - get; set; - } - static string Unquote (string line, out int quoteDepth) { int index = 0; From f468340a0efee3d837e24a688f82f5e4fdbfada9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 17 Oct 2019 21:21:03 -0400 Subject: [PATCH 407/741] Silence a compiler warning about an unused constant --- MimeKit/Utils/ParseUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index 9aaf60f166..3d4400e148 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -358,7 +358,7 @@ public static bool TryParseDomain (byte[] text, ref int index, int endIndex, byt public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool requireAngleAddr, bool throwOnError, out string msgid) { - const CharType SpaceOrControl = CharType.IsWhitespace | CharType.IsControl; + //const CharType SpaceOrControl = CharType.IsWhitespace | CharType.IsControl; var angleAddr = false; msgid = null; From 7e83b83aea8b3040f2576d1a5d6fad338e0f32ca Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 18 Oct 2019 08:59:41 -0400 Subject: [PATCH 408/741] Added a .NETFramework v4.8 build target (MailKit will be able to use this to get TLS v1.3 support) --- MimeKit/Cryptography/SqliteCertificateDatabase.cs | 6 +++--- MimeKit/MimeKit.NetStandard.csproj | 11 +++++++---- MimeKit/MimeKitLite.NetStandard.csproj | 7 +++++-- nuget/MimeKit.nuspec | 12 +++++++++++- nuget/MimeKitLite.nuspec | 8 +++++++- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 4fb9d29698..5a8776dafc 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -64,7 +64,7 @@ static SqliteCertificateDatabase () IsAvailable = true; #endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 +#if NET_4_5 || NET_4_6 || NET_4_7 || NET_4_8 || NETSTANDARD_2_0 var platform = Environment.OSVersion.Platform; #endif @@ -86,7 +86,7 @@ static SqliteCertificateDatabase () } #endif -#if NET_4_5 || NET_4_6 || NET_4_7 +#if NET_4_5 || NET_4_6 || NET_4_7 || NET_4_8 try { // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { @@ -108,7 +108,7 @@ static SqliteCertificateDatabase () } #endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NETSTANDARD_2_0 +#if NET_4_5 || NET_4_6 || NET_4_7 || NET_4_8 || NETSTANDARD_2_0 try { if ((sqliteAssembly = Assembly.Load ("System.Data.SQLite")) != null) { sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index c79c18a9d9..0a7851e46b 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -5,12 +5,12 @@ MimeKit 2.3.2.0 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 + netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true false MimeKit MimeKit - mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid;win8;wp81 + mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false @@ -48,6 +48,9 @@ $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_7 + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_8 + @@ -71,7 +74,7 @@ - + @@ -130,7 +133,7 @@ - + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index c045881c96..d8a74b5be2 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -5,12 +5,12 @@ MimeKit Lite 2.3.2.0 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net46;net47 + netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true false MimeKitLite MimeKitLite - mime;mbox;mail;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid;win8;wp81 + mime;mbox;mail;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false @@ -47,6 +47,9 @@ $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_7 + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_8 + s diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 707b5e6aa8..b00de3fbb1 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -36,7 +36,7 @@ Xamarin Inc. en-US - mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid win8 wp81 + mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid @@ -53,6 +53,11 @@ + + + + + @@ -72,6 +77,9 @@ + + + @@ -116,6 +124,8 @@ + + s diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index e5ed1d2cc5..b376da8843 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -33,7 +33,7 @@ Xamarin Inc. en-US - mime mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid win8 wp81 + mime mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid @@ -44,6 +44,9 @@ + + + @@ -53,6 +56,7 @@ + @@ -89,6 +93,8 @@ + + From b1598b797eb2f1714b56bba41e829db8a78cc675 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 18 Oct 2019 09:21:47 -0400 Subject: [PATCH 409/741] Fixed MimeKit.nuspec --- nuget/MimeKit.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index b00de3fbb1..e54e59ff12 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -125,7 +125,7 @@ - s + From dd3ae53439c9df03b64ff6c15a5b77398b19020c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 Oct 2019 11:30:36 -0400 Subject: [PATCH 410/741] Use the official #defines --- .../BouncyCastleSecureMimeContext.cs | 2 +- MimeKit/Cryptography/CmsRecipient.cs | 2 +- MimeKit/Cryptography/CmsSigner.cs | 2 +- MimeKit/Cryptography/CryptographyContext.cs | 4 ++-- .../Cryptography/DefaultSecureMimeContext.cs | 2 +- MimeKit/Cryptography/GnuPGContext.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 8 ++++---- .../Cryptography/SqliteCertificateDatabase.cs | 8 ++++---- .../Cryptography/X509CertificateDatabase.cs | 2 +- MimeKit/HeaderId.cs | 2 +- MimeKit/MessagePartial.cs | 2 +- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeKit.Net45.csproj | 4 ++-- MimeKit/MimeKit.NetStandard.csproj | 20 ++++--------------- MimeKit/MimeKitLite.Net45.csproj | 4 ++-- MimeKit/MimeKitLite.NetStandard.csproj | 20 ++++--------------- MimeKit/MimeMessage.cs | 2 +- MimeKit/ParserOptions.cs | 2 +- MimeKit/Text/HtmlAttributeId.cs | 2 +- MimeKit/Text/HtmlTagId.cs | 2 +- MimeKit/TextPart.cs | 2 +- MimeKit/Utils/MimeUtils.cs | 2 +- 22 files changed, 37 insertions(+), 61 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 9b0749352b..ef5e1730b5 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -626,7 +626,7 @@ async Task DownloadCrlsOverHttpAsync (string location, Stream stream, bool using (var response = await client.GetAsync (location, cancellationToken).ConfigureAwait (false)) await response.Content.CopyToAsync (stream).ConfigureAwait (false); } else { -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 cancellationToken.ThrowIfCancellationRequested (); var request = (HttpWebRequest) WebRequest.Create (location); diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index c8bfa9d448..d341a52867 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -173,7 +173,7 @@ public CmsRecipient (string fileName, SubjectIdentifierType recipientIdentifierT EncryptionAlgorithms = Certificate.GetEncryptionAlgorithms (); } -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 /// /// Initializes a new instance of the class. /// diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 8f85871e7e..f69f36c634 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -288,7 +288,7 @@ public CmsSigner (string fileName, string password) : this () LoadPkcs12 (stream, password); } -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 /// /// Initializes a new instance of the class. /// diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 4ad70215ca..011394adae 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -544,7 +544,7 @@ public static CryptographyContext Create (string protocol) if (!SqliteCertificateDatabase.IsAvailable) { const string format = "SQLite is not available. Either install the {0} nuget or subclass MimeKit.Cryptography.SecureMimeContext and register it with MimeKit.Cryptography.CryptographyContext.Register()."; -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 throw new NotSupportedException (string.Format (format, "Microsoft.Data.Sqlite")); #else throw new NotSupportedException (string.Format (format, "System.Data.SQLite")); @@ -591,7 +591,7 @@ public static void Register (Type type) if (type == null) throw new ArgumentNullException (nameof (type)); -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 var info = type.GetTypeInfo (); #else var info = type; diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index 101cf9b8c7..bee50e9831 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -68,7 +68,7 @@ static DefaultSecureMimeContext () { string path; -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (Path.DirectorySeparatorChar == '\\') { var appData = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); path = Path.Combine (appData, "Roaming\\mimekit"); diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index f512f04bc7..ad4eb3783c 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -50,7 +50,7 @@ static GnuPGContext () var gnupg = Environment.GetEnvironmentVariable ("GNUPGHOME"); if (gnupg == null) { -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (Path.DirectorySeparatorChar == '\\') { var appData = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); gnupg = Path.Combine (appData, "gnupg"); diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index a3c10a20f4..a353d4c2bd 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -480,7 +480,7 @@ async Task RetrievePublicKeyRingAsync (long keyId, bool doAsyn using (var response = await client.GetAsync (uri.ToString (), cancellationToken).ConfigureAwait (false)) await response.Content.CopyToAsync (filtered).ConfigureAwait (false); } else { -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 var request = (HttpWebRequest) WebRequest.Create (uri.ToString ()); using (var response = request.GetResponse ()) { var content = response.GetResponseStream (); @@ -1058,7 +1058,7 @@ public void GenerateKeyPair (MailboxAddress mailbox, string password, DateTime? } if (random == null) { -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 random = new SecureRandom (new CryptoApiRandomGenerator ()); #else random = new SecureRandom (); @@ -2349,7 +2349,7 @@ protected void SavePublicKeyRingBundle () } if (File.Exists (PublicKeyRingPath)) { -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 File.Replace (tmp, PublicKeyRingPath, bak); #else if (File.Exists (bak)) @@ -2387,7 +2387,7 @@ protected void SaveSecretKeyRingBundle () } if (File.Exists (SecretKeyRingPath)) { -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 File.Replace (tmp, SecretKeyRingPath, bak); #else if (File.Exists (bak)) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 5a8776dafc..07779960cc 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -64,11 +64,11 @@ static SqliteCertificateDatabase () IsAvailable = true; #endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NET_4_8 || NETSTANDARD_2_0 +#if NETFRAMEWORK || NETSTANDARD2_0 var platform = Environment.OSVersion.Platform; #endif -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 || NETSTANDARD_2_0 +#if NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0 try { if ((sqliteAssembly = Assembly.Load (new AssemblyName ("Microsoft.Data.Sqlite"))) != null) { sqliteConnectionClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnection"); @@ -86,7 +86,7 @@ static SqliteCertificateDatabase () } #endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NET_4_8 +#if NETFRAMEWORK try { // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { @@ -108,7 +108,7 @@ static SqliteCertificateDatabase () } #endif -#if NET_4_5 || NET_4_6 || NET_4_7 || NET_4_8 || NETSTANDARD_2_0 +#if NETFRAMEWORK || NETSTANDARD2_0 try { if ((sqliteAssembly = Assembly.Load ("System.Data.SQLite")) != null) { sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 175e8b907c..cee133aeb9 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -131,7 +131,7 @@ protected int SaltSize { static int ReadBinaryBlob (DbDataReader reader, int column, ref byte[] buffer) { -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 buffer = reader.GetFieldValue (column); return (int) buffer.Length; #else diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 8b0351b8b6..6c9a999c19 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -758,7 +758,7 @@ public static string ToHeaderName (this HeaderId value) { var name = value.ToString (); -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 var field = typeof (HeaderId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HeaderNameAttribute), false).ToArray (); #else diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 1640f08ed0..89440f7ecb 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -216,7 +216,7 @@ public static IEnumerable Split (MimeMessage message, int maxSize) } var streams = new List (); -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 var buf = memory.GetBuffer (); #else var buf = memory.ToArray (); diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index bf578f0378..76a5d86f84 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -339,7 +339,7 @@ public override string ToString () using (var memory = new MemoryStream ()) { WriteTo (memory); -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 347182ed8a..d1f484f285 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -21,7 +21,7 @@ False bin\Debug\net45 obj\Debug\net45 - DEBUG;TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NET_4_5 + DEBUG;TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NETFRAMEWORK;NET45 prompt 4 True @@ -31,7 +31,7 @@ True bin\Release\net45 obj\Release\net45 - TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NET_4_5 + TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NETFRAMEWORK;NET45 prompt 4 true diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 0a7851e46b..19ae8a15b8 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -33,23 +33,11 @@ $(DefineConstants);NETSTANDARD - - $(DefineConstants);NETSTANDARD_1_3 + + $(DefineConstants);ENABLE_SNM - - $(DefineConstants);NETSTANDARD_1_6 - - - $(DefineConstants);ENABLE_SNM;NETSTANDARD_2_0 - - - $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_6 - - - $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_7 - - - $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_8 + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index fbbc6af340..5dc55fdd18 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -19,7 +19,7 @@ False bin\Debug\net45 obj\Debug\net45 - DEBUG;TRACE;SERIALIZABLE;ENABLE_SNM + DEBUG;TRACE;SERIALIZABLE;ENABLE_SNM;NETFRAMEWORK;NET45 prompt 4 True @@ -28,7 +28,7 @@ True bin\Release\net45 obj\Release\net45 - TRACE;SERIALIZABLE;ENABLE_SNM + TRACE;SERIALIZABLE;ENABLE_SNM;NETFRAMEWORK;NET45 prompt 4 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index d8a74b5be2..9a42c5d7ba 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -32,24 +32,12 @@ $(DefineConstants);NETSTANDARD - - $(DefineConstants);NETSTANDARD_1_3 + + $(DefineConstants);ENABLE_SNM - - $(DefineConstants);NETSTANDARD_1_6 + + $(DefineConstants);ENABLE_SNM;SERIALIZABLE - - $(DefineConstants);ENABLE_SNM;NETSTANDARD_2_0 - - - $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_6 - - - $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_7 - - - $(DefineConstants);ENABLE_SNM;SERIALIZABLE;NET_4_8 - s diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 5a1438bf1f..f4eaf74f4d 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -990,7 +990,7 @@ public override string ToString () using (var memory = new MemoryStream ()) { WriteTo (FormatOptions.Default, memory); -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 7950a32b07..731638d763 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -239,7 +239,7 @@ public void RegisterMimeType (string mimeType, Type type) mimeType = mimeType.ToLowerInvariant (); -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 var info = type.GetTypeInfo (); #else var info = type; diff --git a/MimeKit/Text/HtmlAttributeId.cs b/MimeKit/Text/HtmlAttributeId.cs index a94555433f..4a29b6a282 100644 --- a/MimeKit/Text/HtmlAttributeId.cs +++ b/MimeKit/Text/HtmlAttributeId.cs @@ -621,7 +621,7 @@ public static string ToAttributeName (this HtmlAttributeId value) { var name = value.ToString (); -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 var field = typeof (HtmlAttributeId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HtmlAttributeNameAttribute), false).ToArray (); #else diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index a05472ddbf..35114fb961 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -766,7 +766,7 @@ public static string ToHtmlTagName (this HtmlTagId value) var name = value.ToString (); -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 var field = typeof (HtmlTagId).GetTypeInfo ().GetDeclaredField (name); var attrs = field.GetCustomAttributes (typeof (HtmlTagNameAttribute), false).ToArray (); #else diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 7ab48176d3..8693fe4c0b 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -401,7 +401,7 @@ public string GetText (Encoding encoding) filtered.Flush (); } -#if !NETSTANDARD_1_3 && !NETSTANDARD_1_6 +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 var buffer = memory.GetBuffer (); #else var buffer = memory.ToArray (); diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index a84e76bf3b..f63a5f6e90 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -113,7 +113,7 @@ public static string GenerateMessageId (string domain) /// The message identifier. public static string GenerateMessageId () { -#if NETSTANDARD_1_3 || NETSTANDARD_1_6 +#if NETSTANDARD1_3 || NETSTANDARD1_6 return GenerateMessageId ("localhost.localdomain"); #else var properties = IPGlobalProperties.GetIPGlobalProperties (); From 0320e513fd274c62098f740c6ae466c1844ac857 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 Oct 2019 11:42:00 -0400 Subject: [PATCH 411/741] No need to redefine NETSTANDARD --- MimeKit/MimeKit.NetStandard.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 19ae8a15b8..a5e300aa89 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -30,9 +30,6 @@ true - - $(DefineConstants);NETSTANDARD - $(DefineConstants);ENABLE_SNM From 99831c3ecd815faf34a8a77dc266dfe104c2f9f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 Oct 2019 11:42:31 -0400 Subject: [PATCH 412/741] Same for MimeKitLite.NetStandard.csproj --- MimeKit/MimeKitLite.NetStandard.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 9a42c5d7ba..efb44e41bc 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -29,9 +29,6 @@ true - - $(DefineConstants);NETSTANDARD - $(DefineConstants);ENABLE_SNM From ecfcc83efbff52a51281228a433c567e0e7c5896 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 19 Oct 2019 13:50:12 -0400 Subject: [PATCH 413/741] Synced up the HtmlTokenizer with HtmlKit to get the new optimizations --- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + MimeKit/MimeKitLite.Android.csproj | 1 + MimeKit/MimeKitLite.Net45.csproj | 1 + MimeKit/MimeKitLite.NetStandard.csproj | 1 + MimeKit/MimeKitLite.iOS.csproj | 1 + MimeKit/Text/CharBuffer.cs | 93 ++++++++++++++++++++++++++ MimeKit/Text/HtmlTokenizer.cs | 27 +++++--- 13 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 MimeKit/Text/CharBuffer.cs diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index bc4fb48fb6..85074b9e04 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -162,6 +162,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 73bb6f8ae7..40a41b5a54 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -151,6 +151,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index d1f484f285..5afc1fdf8c 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -162,6 +162,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index a5e300aa89..13536db43f 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -158,6 +158,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index face7d4380..5958d7e744 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -144,6 +144,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 5ebfd7a2e5..2a73ed6cd4 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -150,6 +150,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index c2ad0306d5..37391e5847 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -161,6 +161,7 @@ + diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index 4010f62bba..7676fda300 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -90,6 +90,7 @@ + diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index 5dc55fdd18..3d1567440d 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -85,6 +85,7 @@ + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index efb44e41bc..4dd4119642 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -77,6 +77,7 @@ + diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj index 109a2b35fb..9a784bfab3 100644 --- a/MimeKit/MimeKitLite.iOS.csproj +++ b/MimeKit/MimeKitLite.iOS.csproj @@ -85,6 +85,7 @@ + diff --git a/MimeKit/Text/CharBuffer.cs b/MimeKit/Text/CharBuffer.cs new file mode 100644 index 0000000000..49a70b181e --- /dev/null +++ b/MimeKit/Text/CharBuffer.cs @@ -0,0 +1,93 @@ +// +// CharBuffer.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Runtime.CompilerServices; + +namespace MimeKit.Text { + class CharBuffer + { + char[] buffer; + + public CharBuffer (int capacity) + { + buffer = new char[capacity]; + } + + public int Length { + [MethodImpl (MethodImplOptions.AggressiveInlining)] + get; + [MethodImpl (MethodImplOptions.AggressiveInlining)] + set; + } + + public char this[int index] { + [MethodImpl (MethodImplOptions.AggressiveInlining)] + get { return buffer[index]; } + [MethodImpl (MethodImplOptions.AggressiveInlining)] + set { buffer[index] = value; } + } + + [MethodImpl (MethodImplOptions.AggressiveInlining)] + void EnsureCapacity (int length) + { + if (length < buffer.Length) + return; + + int capacity = buffer.Length << 1; + while (capacity <= length) + capacity <<= 1; + + Array.Resize (ref buffer, capacity); + } + + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public void Append (char c) + { + EnsureCapacity (Length + 1); + buffer[Length++] = c; + } + + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public void Append (string str) + { + EnsureCapacity (Length + str.Length); + str.CopyTo (0, buffer, Length, str.Length); + Length += str.Length; + } + + [MethodImpl (MethodImplOptions.AggressiveInlining)] + public override string ToString () + { + return new string (buffer, 0, Length); + } + + public static implicit operator string (CharBuffer buffer) + { + return buffer.ToString (); + } + } +} diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 02ccc78855..19186d174a 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -25,7 +25,7 @@ // using System.IO; -using System.Text; +using System.Runtime.CompilerServices; namespace MimeKit.Text { /// @@ -40,8 +40,8 @@ public class HtmlTokenizer const string CData = "[CDATA["; readonly HtmlEntityDecoder entity = new HtmlEntityDecoder (); - readonly StringBuilder data = new StringBuilder (); - readonly StringBuilder name = new StringBuilder (); + readonly CharBuffer data = new CharBuffer (2048); + readonly CharBuffer name = new CharBuffer (32); readonly char[] cdata = new char[3]; HtmlDocTypeToken doctype; HtmlAttribute attribute; @@ -231,19 +231,26 @@ protected virtual HtmlAttribute CreateAttribute (string name) return new HtmlAttribute (name); } - static bool IsAlphaNumeric (char c) + [MethodImpl (MethodImplOptions.AggressiveInlining)] + static bool IsAlphaNumeric (int c) { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'); + return ((uint) (c - 'A') <= 'Z' - 'A') || ((uint) (c - 'a') <= 'z' - 'a') || ((uint) (c - '0') <= '9' - '0'); } - static bool IsAsciiLetter (char c) + [MethodImpl (MethodImplOptions.AggressiveInlining)] + static bool IsAsciiLetter (int c) { - return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); + return ((uint) (c - 'A') <= 'Z' - 'A') || ((uint) (c - 'a') <= 'z' - 'a'); } - static char ToLower (char c) + [MethodImpl (MethodImplOptions.AggressiveInlining)] + static char ToLower (int c) { - return (c >= 'A' && c <= 'Z') ? (char) (c + 0x20) : c; + // check if the char is within the uppercase range + if ((uint) (c - 'A') <= 'Z' - 'A') + return (char) (c + 0x20); + + return (char) c; } int Peek () @@ -299,7 +306,7 @@ HtmlToken EmitCommentToken (string comment, bool bogus = false) return token; } - HtmlToken EmitCommentToken (StringBuilder comment, bool bogus = false) + HtmlToken EmitCommentToken (CharBuffer comment, bool bogus = false) { return EmitCommentToken (comment.ToString (), bogus); } From 85b2e115e56f6ea03674f96437a6631d879068eb Mon Sep 17 00:00:00 2001 From: swoga Date: Fri, 25 Oct 2019 14:55:24 +0200 Subject: [PATCH 414/741] Fixed X509Crl.IsDelta for CRLs without extensions (#513) * Fixed X509Crl.IsDelta for CRLs without extensions GetCriticalExtensionOids returns null for CRLs without any extensions. --- MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 8d82dcd6a4..ad2901bd78 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -348,7 +348,7 @@ internal static bool IsDelta (this X509Crl crl) { var critical = crl.GetCriticalExtensionOids (); - return critical.Contains (X509Extensions.DeltaCrlIndicator.Id); + return critical != null ? critical.Contains (X509Extensions.DeltaCrlIndicator.Id) : false; } } } From 37ba11bc34659be4ce1f7bb786ce60955bfed007 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 29 Oct 2019 12:42:44 -0400 Subject: [PATCH 415/741] Added support for message/global-delivery-status and message/global-disposition-notification Fixes issue #514 --- MimeKit/ParserOptions.cs | 6 + RFCs.md | 1 + rfc/rfc6533.txt | 1067 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 1074 insertions(+) create mode 100644 rfc/rfc6533.txt diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 731638d763..9dd929c812 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -306,14 +306,20 @@ internal MimeEntity CreateEntity (ContentType contentType, IList
headers // actually handle that w/o any problems. if (type == "message") { switch (subtype) { + case "global-disposition-notification": case "disposition-notification": return new MessageDispositionNotification (args); + case "global-delivery-status": case "delivery-status": return new MessageDeliveryStatus (args); case "partial": if (!IsEncoded (headers)) return new MessagePartial (args); break; + case "global-headers": + if (!IsEncoded (headers)) + return new TextRfc822Headers (args); + break; case "external-body": case "rfc2822": case "rfc822": diff --git a/RFCs.md b/RFCs.md index 23b64bcf76..c00a70f1f7 100644 --- a/RFCs.md +++ b/RFCs.md @@ -52,6 +52,7 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [6376](http://www.ietf.org/rfc/rfc6376.txt): DomainKeys Identified Mail (DKIM) Signatures (Obsoletes rfc4871) * [6522](http://www.ietf.org/rfc/rfc6522.txt): The Multipart/Report Media Type for the Reporting of Mail System Administrative Messages (Obsoletes rfc3462) * [6532](http://www.ietf.org/rfc/rfc6532.txt): Internationalized Email Headers +* [6533](http://www.ietf.org/rfc/rfc6533.txt): Internationalized Delivery Status and Disposition Notifications * [7001](http://www.ietf.org/rfc/rfc7001.txt): Message Header Field for Indicating Message Authentication Status (Obsoletes rfc5451) * [7601](http://www.ietf.org/rfc/rfc7601.txt): Message Header Field for Indicating Message Authentication Status (Obsoletes rfc7001) * [8301](http://www.ietf.org/rfc/rfc8301.txt): Cryptographic Algorithm and Key Usage Update to DomainKeys Identified Mail (DKIM) diff --git a/rfc/rfc6533.txt b/rfc/rfc6533.txt new file mode 100644 index 0000000000..a350c1711b --- /dev/null +++ b/rfc/rfc6533.txt @@ -0,0 +1,1067 @@ + + + + + + +Internet Engineering Task Force (IETF) T. Hansen, Ed. +Request for Comments: 6533 AT&T Laboratories +Obsoletes: 5337 C. Newman +Updates: 3461, 3464, 3798, 6522 Oracle +Category: Standards Track A. Melnikov +ISSN: 2070-1721 Isode Ltd + February 2012 + + + Internationalized Delivery Status and Disposition Notifications + +Abstract + + Delivery status notifications (DSNs) are critical to the correct + operation of an email system. However, the existing Draft Standards + (RFC 3461, RFC 3464, RFC 6522) are presently limited to ASCII text in + the machine-readable portions of the protocol. This specification + adds a new address type for international email addresses so an + original recipient address with non-ASCII characters can be correctly + preserved even after downgrading. This also provides updated content + return media types for delivery status notifications and message + disposition notifications to support use of the new address type. + + This document extends RFC 3461, RFC 3464, RFC 3798, and RFC 6522. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc6533. + + + + + + + + + + + + + +Hansen, et al. Standards Track [Page 1] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + +Copyright Notice + + Copyright (c) 2012 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Conventions Used in This Document . . . . . . . . . . . . . . 3 + 3. UTF-8 Address Type . . . . . . . . . . . . . . . . . . . . . . 3 + 4. UTF-8 Delivery Status Notifications . . . . . . . . . . . . . 6 + 4.1. The message/global-delivery-status Media Type . . . . . . 6 + 4.2. The message/global Media Type . . . . . . . . . . . . . . 8 + 4.3. The message/global-headers Media Type . . . . . . . . . . 8 + 4.4. Using These Media Types with multipart/report . . . . . . 8 + 4.5. Additional Requirements on SMTP Servers . . . . . . . . . 9 + 5. UTF-8 Message Disposition Notifications . . . . . . . . . . . 9 + 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 + 6.1. UTF-8 Mail Address Type Registration . . . . . . . . . . . 10 + 6.2. Update to 'smtp' Diagnostic Type Registration . . . . . . 11 + 6.3. message/global-headers . . . . . . . . . . . . . . . . . . 11 + 6.4. message/global-delivery-status . . . . . . . . . . . . . . 12 + 6.5. message/global-disposition-notification . . . . . . . . . 14 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 15 + 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 16 + 8.1. Normative References . . . . . . . . . . . . . . . . . . . 16 + 8.2. Informative References . . . . . . . . . . . . . . . . . . 17 + Appendix A. Changes since RFC 5337 . . . . . . . . . . . . . . . 18 + Appendix B. Acknowledgements . . . . . . . . . . . . . . . . . . 18 + + + + + + + + + + + + +Hansen, et al. Standards Track [Page 2] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + +1. Introduction + + When an email message is transmitted using the SMTPUTF8 [RFC6531] + extension and Internationalized Email Headers [RFC6532], it is + sometimes necessary to return that message or generate a Message + Disposition Notification (MDN) [RFC3798]. As a message sent to + multiple recipients can generate a status and disposition + notification for each recipient, it is helpful if a client can + correlate these notifications based on the recipient address it + provided; thus, preservation of the original recipient is important. + This specification describes how to preserve the original recipient + and updates the MDN and DSN formats to support the new address types. + + NOTE: While this specification updates the experimental versions of + this protocol by removing certain constructs (e.g., the ">" address syntax is no longer permitted), the name of the + Address Type "UTF-8" and the media type names message/global, + message/global-delivery-status, and message/global-headers have not + been changed. + + This specification is a revision of and replacement for [RFC5337]. + Section 6 of [RFC6530] describes the change in approach between this + specification and the previous version. + +2. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC2119]. + + The formal syntax uses the Augmented Backus-Naur Form (ABNF) + [RFC5234] notation including the core rules defined in Appendix B of + [RFC5234] and the UTF-8 syntax rules in Section 4 of [RFC3629]. + +3. UTF-8 Address Type + + "An Extensible Message Format for Delivery Status Notifications" + [RFC3464] defines the concept of an address type. The address format + introduced in "Internationalized Email Headers" [RFC6532] is a new + address type. The syntax for the new address type in the context of + status notifications is specified at the end of this section. + + An SMTP [RFC5321] server that advertises both the SMTPUTF8 extension + [RFC6531] and the DSN extension [RFC3461] MUST accept a UTF-8 address + type in the ORCPT parameter including 8-bit UTF-8 characters. This + address type also includes a 7-bit encoding suitable for use in a + message/delivery-status body part or an ORCPT parameter sent to an + SMTP server that does not advertise SMTPUTF8. + + + +Hansen, et al. Standards Track [Page 3] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + This address type has 3 forms: utf-8-addr-xtext, utf-8-addr-unitext, + and utf-8-address. Only the first form is 7-bit safe (only uses + ASCII characters [ASCII]). + + The utf-8-address form is only suitable for use in newly defined + protocols capable of native representation of 8-bit characters. That + is, the utf-8-address form MUST NOT be used: + + 1. in the ORCPT parameter when the SMTP server doesn't advertise + support for SMTPUTF8 (utf-8-addr-xtext MUST be used instead); or + + 2. if the SMTP server supports SMTPUTF8, but the address contains + ASCII characters not permitted in the ORCPT parameter (e.g., the + ORCPT parameter forbids unencoded SP and the '=' character), + (either utf-8-addr-unitext or utf-8-addr-xtext MUST be used + instead); or + + 3. in a 7-bit transport environment including a message/ + delivery-status "Original-Recipient:" or "Final-Recipient:" + field, (utf-8-addr-xtext MUST be used instead). + + The utf-8-address form MAY be used in the ORCPT parameter when the + SMTP server also advertises support for SMTPUTF8 and the address + doesn't contain any ASCII characters not permitted in the ORCPT + parameter. It SHOULD be used in a message/global-delivery-status + "Original-Recipient:" or "Final-Recipient:" DSN field, or in an + "Original-Recipient:" header field [RFC3798] if the message is a + SMTPUTF8 message. + + In addition, the utf-8-addr-unitext form can be used anywhere where + the utf-8-address form is allowed. + + When used in the ORCPT parameter, the UTF-8 address type requires + that ASCII CTLs, SP, '\', '+', and '=' be encoded using 'unitext' + encoding (see below). This is described by the utf-8-addr-xtext and + utf-8-addr-unitext forms in the ABNF below. The 'unitext' encoding + uses "\x{HEXPOINT}" syntax (EmbeddedUnicodeChar in the ABNF below) + for encoding any Unicode character outside of ASCII range, as well as + for encoding CTLs, SP, '\', '+', and '='. HEXPOINT is 2 to 6 + hexadecimal digits. This encoding avoids the need to use the xtext + encoding described in [RFC3461], as any ASCII characters that need to + be escaped using xtext encoding never appear in any unitext-encoded + string. When sending data to a SMTPUTF8-capable server, native UTF-8 + characters SHOULD be used instead of the EmbeddedUnicodeChar syntax + described below. When sending data to an SMTP server that does not + advertise SMTPUTF8, then the EmbeddedUnicodeChar syntax MUST be used + instead of UTF-8. + + + + +Hansen, et al. Standards Track [Page 4] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + When the ORCPT parameter is placed in a message/ + global-delivery-status "Original-Recipient:" field, the + utf-8-addr-xtext form of the UTF-8 address type SHOULD be converted + to the utf-8-address form (see the ABNF below) by removing the + unitext encoding. However, if an address is labeled with the UTF-8 + address type but does not conform to utf-8 syntax, then it MUST be + copied into the message/global-delivery-status field without + alteration. + + The ability to encode characters with the EmbeddedUnicodeChar + encodings should be viewed as a transitional mechanism and avoided + when possible. It is hoped that as systems lacking support for + SMTPUTF8 become less common over time, these encodings can eventually + be phased out. + + In the ABNF below, all productions not defined in this document are + defined in Appendix B of [RFC5234], in Section 4 of [RFC3629], or in + [RFC3464]. + + utf-8-type-addr = "utf-8;" utf-8-enc-addr + + utf-8-address = Mailbox + ; Mailbox as defined in [RFC6531]. + + utf-8-enc-addr = utf-8-addr-xtext / + utf-8-addr-unitext / + utf-8-address + + utf-8-addr-xtext = 1*(QCHAR / EmbeddedUnicodeChar) + ; 7bit form of utf-8-addr-unitext. + ; Safe for use in the ORCPT [RFC3461] + ; parameter even when SMTPUTF8 SMTP + ; extension is not advertised. + + utf-8-addr-unitext = 1*(QUCHAR / EmbeddedUnicodeChar) + ; MUST follow utf-8-address ABNF when + ; dequoted. + ; Safe for using in the ORCPT [RFC3461] + ; parameter when SMTPUTF8 SMTP extension + ; is also advertised. + + QCHAR = %x21-2a / %x2c-3c / %x3e-5b / %x5d-7e + ; ASCII printable characters except + ; CTLs, SP, '\', '+', '='. + + + + + + + +Hansen, et al. Standards Track [Page 5] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + QUCHAR = QCHAR / UTF8-2 / UTF8-3 / UTF8-4 + ; ASCII printable characters except + ; CTLs, SP, '\', '+' and '=', plus + ; other Unicode characters encoded in UTF-8 + + EmbeddedUnicodeChar = %x5C.78 "{" HEXPOINT "}" + ; starts with "\x" + + HEXPOINT = ( ( "0"/"1" ) %x31-39 ) / "10" / "20" / + "2B" / "3D" / "7F" / ; all xtext-specials + "5C" / (HEXDIG8 HEXDIG) / ; 2-digit forms + ( NZHEXDIG 2(HEXDIG) ) / ; 3-digit forms + ( NZDHEXDIG 3(HEXDIG) ) / ; 4-digit forms excluding + ( "D" %x30-37 2(HEXDIG) ) / ; ... surrogate + ( NZHEXDIG 4(HEXDIG) ) / ; 5-digit forms + ( "10" 4*HEXDIG ) ; 6-digit forms + ; represents either "\" or a Unicode code point outside + ; the ASCII repertoire + + HEXDIG8 = %x38-39 / "A" / "B" / "C" / "D" / "E" / "F" + ; HEXDIG excluding 0-7 + NZHEXDIG = %x31-39 / "A" / "B" / "C" / "D" / "E" / "F" + ; HEXDIG excluding "0" + NZDHEXDIG = %x31-39 / "A" / "B" / "C" / "E" / "F" + ; HEXDIG excluding "0" and "D" + +4. UTF-8 Delivery Status Notifications + + A traditional delivery status notification [RFC3464] comes in a + three-part multipart/report [RFC6522] container, where the first part + is human-readable text describing the error, the second part is a + 7-bit-only message/delivery-status, and the optional third part is + used for content (message/rfc822) or header (text/rfc822-headers) + return. As the present standard DSN format does not permit the + return of undeliverable SMTPUTF8 messages, three new media types have + been defined. ([RFC5337] introduced experimental versions of these + media types.) + +4.1. The message/global-delivery-status Media Type + + The first type, message/global-delivery-status, has the syntax of + message/delivery-status with three modifications. First, the charset + for message/global-delivery-status is UTF-8, and thus any field MAY + contain UTF-8 characters when appropriate (see the ABNF below). In + particular, the "Diagnostic-Code:" field MAY contain UTF-8 as + described in SMTPUTF8 [RFC6531]; the "Diagnostic-Code:" field SHOULD + be in i-default language [RFC2277]. Second, systems generating a + message/global-delivery-status body part SHOULD use the utf-8-address + + + +Hansen, et al. Standards Track [Page 6] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + form of the UTF-8 address type for all addresses containing + characters outside the ASCII repertoire. These systems SHOULD up- + convert the utf-8-addr-xtext or the utf-8-addr-unitext form of a + UTF-8 address type in the ORCPT parameter to the utf-8-address form + of a UTF-8 address type in the "Original-Recipient:" field. Third, + an optional field called "Localized-Diagnostic:" is added. Each + instance includes a language tag [RFC5646] and contains text in the + specified language. This is equivalent to the text part of the + "Diagnostic-Code:" field. All instances of "Localized-Diagnostic:" + MUST use different language tags. The ABNF for message/ + global-delivery-status is specified below. + + In the ABNF below, all productions not defined in this document are + defined in Appendix B of [RFC5234], in Section 4 of [RFC3629], or in + [RFC3464]. Note that is the same as from + [RFC5322], but without . If or when RFC 5322 is updated to + disallow , should become just . Also, + if or when RFC 5322 is updated to disallow control characters in + , should become a reference to that update + instead. + + utf-8-delivery-status-content = per-message-fields + 1*( CRLF utf-8-per-recipient-fields ) + ; "per-message-fields" remains unchanged from the definition + ; in RFC 3464, except for the "extension-field", + ; which is updated below. + + utf-8-per-recipient-fields = + [ original-recipient-field CRLF ] + final-recipient-field CRLF + action-field CRLF + status-field CRLF + [ remote-mta-field CRLF ] + [ diagnostic-code-field CRLF + *(localized-diagnostic-text-field CRLF) ] + [ last-attempt-date-field CRLF ] + [ final-log-id-field CRLF ] + [ will-retry-until-field CRLF ] + *( extension-field CRLF ) + ; All fields except for "original-recipient-field", + ; "final-recipient-field", "diagnostic-code-field", + ; and "extension-field" remain unchanged from + ; the definition in RFC 3464. + + + + + + + + +Hansen, et al. Standards Track [Page 7] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + generic-address =/ utf-8-enc-addr + ; Only allowed with the "utf-8" address-type. + ; Updates Section 3.2.3 of RFC 3798. + ; + ; This indirectly updates "original-recipient-field" + ; and "final-recipient-field". + + diagnostic-code-field = + "Diagnostic-Code" ":" diagnostic-type ";" *text-fixed + + localized-diagnostic-text-field = + "Localized-Diagnostic" ":" Language-Tag ";" *utf8-text + ; "Language-Tag" is a language tag as defined in [RFC5646]. + + extension-field =/ extension-field-name ":" *utf8-text + ; Updates Section 7 of RFC3798 + + text-fixed = %d1-9 / ; Any ASCII character except for NUL, + %d11 / ; CR, and LF. + %d12 / ; See note above about + %d14-127 + + utf8-text = text-fixed / UTF8-non-ascii + + UTF8-non-ascii = UTF8-2 / UTF8-3 / UTF8-4 + +4.2. The message/global Media Type + + The second type, used for returning the content, is message/global, + which is similar to message/rfc822, except it contains a message with + UTF-8 headers. This media type is described in [RFC6532]. + +4.3. The message/global-headers Media Type + + The third type, used for returning the headers, is message/ + global-headers and contains only the UTF-8 header fields of a message + (all lines prior to the first blank line in a SMTPUTF8 message). + Unlike message/global, this body part provides no difficulties for + the present infrastructure. + +4.4. Using These Media Types with multipart/report + + Note that as far as a multipart/report [RFC6522] container is + concerned, message/global-delivery-status, message/global, and + message/global-headers MUST be treated as equivalent to message/ + delivery-status, message/rfc822, and text/rfc822-headers. That is, + + + + + +Hansen, et al. Standards Track [Page 8] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + implementations processing multipart/report MUST expect any + combinations of the 6 media types mentioned above inside a multipart/ + report media type. + + All three new types will typically use the "8bit" Content-Transfer- + Encoding. (In the event all content is 7-bit, the equivalent + traditional types for delivery status notifications MAY be used. For + example, if information in a message/global-delivery-status part can + be represented without any loss of information as message/ + delivery-status, then the message/delivery-status body part may be + used.) Note that [RFC6532] relaxed a restriction from MIME [RFC2046] + regarding the use of Content-Transfer-Encoding in new "message" + subtypes. This specification explicitly allows the use of Content- + Transfer-Encoding in message/global-headers and message/ + global-delivery-status. This is not believed to be problematic as + these new media types are intended primarily for use by newer systems + with full support for 8-bit MIME and UTF-8 headers. + +4.5. Additional Requirements on SMTP Servers + + If an SMTP server that advertises both SMTPUTF8 and DSN needs to + return an undeliverable SMTPUTF8 message, then it has two choices for + encapsulating the SMTPUTF8 message when generating the corresponding + multipart/report: + + If the return-path SMTP server does not support SMTPUTF8, then the + undeliverable body part and headers MUST be encoded using a 7-bit + Content-Transfer-Encoding such as "base64" or "quoted-printable" + [RFC2045], as detailed in Section 4. + + Otherwise, "8bit" Content-Transfer-Encoding can be used. + +5. UTF-8 Message Disposition Notifications + + Message Disposition Notifications [RFC3798] have a similar design and + structure to DSNs. As a result, they use the same basic return + format. When generating an MDN for a UTF-8 header message, the third + part of the multipart/report contains the returned content (message/ + global) or header (message/global-headers), same as for DSNs. The + second part of the multipart/report uses a new media type, message/ + global-disposition-notification, which has the syntax of message/ + disposition-notification with two modifications. First, the charset + for message/global-disposition-notification is UTF-8, and thus any + field MAY contain UTF-8 characters when appropriate (see the ABNF + below). (In particular, the failure-field, the error-field, and the + warning-field MAY contain UTF-8. These fields SHOULD be in i-default + + + + + +Hansen, et al. Standards Track [Page 9] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + language [RFC2277].) Second, systems generating a message/ + global-disposition-notification body part (typically a mail user + agent) SHOULD use the UTF-8 address type for all addresses containing + characters outside the ASCII repertoire. + + The MDN specification also defines the "Original-Recipient:" header + field, which is added with a copy of the contents of ORCPT at + delivery time. When generating an "Original-Recipient:" header + field, a delivery agent writing a UTF-8 header message in native + format SHOULD convert the utf-8-addr-xtext or the utf-8-addr-unitext + form of a UTF-8 address type in the ORCPT parameter to the + corresponding utf-8-address form. + + The MDN specification also defines the "Disposition-Notification-To:" + header field, which is an address header field and thus follows the + same 8-bit rules as other address header fields such as "From:" and + "To:" when used in a UTF-8 header message. + + ; ABNF for "original-recipient-header", "original-recipient-field", + ; and "final-recipient-field" from RFC 3798 is implicitly updated + ; as they use the updated "generic-address" as defined in + ; Section 4 of this document. + + failure-field = "Failure" ":" *utf8-text + ; "utf8-text" is defined in Section 4 of this document. + + error-field = "Error" ":" *utf8-text + ; "utf8-text" is defined in Section 4 of this document. + + warning-field = "Warning" ":" *utf8-text + ; "utf8-text" is defined in Section 4 of this document. + +6. IANA Considerations + + This specification does not create any new IANA registries. However, + the following items have been registered as a result of this + document. + +6.1. UTF-8 Mail Address Type Registration + + The mail address type registry was created by [RFC3464]. The + registration template response follows: + + (a) The address-type name. + + UTF-8 + + + + + +Hansen, et al. Standards Track [Page 10] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + (b) The syntax for mailbox addresses of this type, specified using + BNF, regular expressions, ASN.1, or other non-ambiguous language. + + See Section 3. + + (c) If addresses of this type are not composed entirely of graphic + characters from the ASCII repertoire, a specification for how + they are to be encoded as graphic ASCII characters in an + "Original-Recipient:" or "Final-Recipient:" DSN field. + + This address type has 3 forms (as defined in Section 3): + utf-8-addr-xtext, utf-8-addr-unitext, and utf-8-address. Only + the first form is 7-bit safe. + +6.2. Update to 'smtp' Diagnostic Type Registration + + The mail diagnostic type registry was created by [RFC3464] and + updated by [RFC5337]. This specification replaces [RFC5337]. The + registration for the 'smtp' diagnostic type has been updated to + reference RFC 6533 in addition to [RFC3464] and to remove the + reference to [RFC5337]. + + When the 'smtp' diagnostic type is used in the context of a message/ + delivery-status body part, it remains as presently defined. When the + 'smtp' diagnostic type is used in the context of a message/ + global-delivery-status body part, the codes remain the same, but the + text portion MAY contain UTF-8 characters. + +6.3. message/global-headers + + Type name: message + + Subtype name: global-headers + + Required parameters: none + + Optional parameters: none + + Encoding considerations: This media type contains Internationalized + Email Headers [RFC6532] with no message body. Whenever possible, + the 8-bit content transfer encoding SHOULD be used. When this + media type passes through a 7-bit-only SMTP infrastructure, it MAY + be encoded with the base64 or quoted-printable content transfer + encoding. + + Security considerations: See Section 7. + + + + + +Hansen, et al. Standards Track [Page 11] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + Interoperability considerations: It is important that this media + type is not converted to a charset other than UTF-8. As a result, + implementations MUST NOT include a charset parameter with this + media type. Although it might be possible to down-convert this + media type to the text/rfc822-header media type, such conversion + is discouraged as it loses information. + + Published specification: RFC 6533 + + Applications that use this media type: SMTPUTF8 servers and email + clients that support multipart/report generation or parsing. + + Additional information: + + Magic number(s): none + + File extension(s): In the event this is saved to a file, the + extension ".u8hdr" is suggested. + + Macintosh file type code(s): The 'TEXT' type code is suggested as + files of this type are typically used for diagnostic purposes + and suitable for analysis in a UTF-8-aware text editor. A + uniform type identifier (UTI) of + "public.utf8-email-message-header" is suggested. This type + conforms to "public.utf8-plain-text" and "public.plain-text". + + Person & email address to contact for further information: See the + Authors' Addresses section of this document. + + Intended usage: COMMON + + Restrictions on usage: This media type contains textual data in the + UTF-8 charset. It typically contains octets with the 8th bit set. + As a result, a transfer encoding is required when a 7-bit + transport is used. + + Author: See the Authors' Addresses section of this document. + + Change controller: IETF Standards Process + +6.4. message/global-delivery-status + + Type name: message + + Subtype name: global-delivery-status + + Required parameters: none + + + + +Hansen, et al. Standards Track [Page 12] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + Optional parameters: none + + Encoding considerations: This media type contains delivery status + notification attributes in the UTF-8 charset. The 8-bit content + transfer encoding MUST be used with this content-type, unless it + is sent over a 7-bit transport environment, in which case quoted- + printable or base64 may be necessary. + + Security considerations: See Section 7 + + Interoperability considerations: This media type provides + functionality similar to the message/delivery-status content-type + for email message return information. Clients of the previous + format will need to be upgraded to interpret the new format; + however, the new media type makes it simple to identify the + difference. + + Published specification: RFC 6533 + + Applications that use this media type: SMTP servers and email + clients that support delivery status notification generation or + parsing. + + Additional information: + + Magic number(s): none + + File extension(s): The extension ".u8dsn" is suggested. + + Macintosh file type code(s): A uniform type identifier (UTI) of + "public.utf8-email-message-delivery-status" is suggested. This + type conforms to "public.utf8-plain-text". + + Person & email address to contact for further information: See the + Authors' Addresses section of this document. + + Intended usage: COMMON + + Restrictions on usage: This is expected to be the second part of a + multipart/report. + + Author: See the Authors' Addresses section of this document. + + Change controller: IETF Standards Process + + + + + + + +Hansen, et al. Standards Track [Page 13] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + +6.5. message/global-disposition-notification + + Type name: message + + Subtype name: global-disposition-notification + + Required parameters: none + + Optional parameters: none + + Encoding considerations: This media type contains disposition + notification attributes in the UTF-8 charset. The 8-bit content + transfer encoding MUST be used with this content-type, unless it + is sent over a 7-bit transport environment, in which case quoted- + printable or base64 may be necessary. + + Security considerations: See Section 7. + + Interoperability considerations: This media type provides + functionality similar to the message/disposition-notification + content-type for email message disposition information. Clients + of the previous format will need to be upgraded to interpret the + new format; however, the new media type makes it simple to + identify the difference. + + Published specification: RFC 6533 + + Applications that use this media type: Email clients or servers that + support message disposition notification generation or parsing. + + Additional information: + + Magic number(s): none + + File extension(s): The extension ".u8mdn" is suggested. + + Macintosh file type code(s): A uniform type identifier (UTI) of + "public.utf8-email-message-disposition-notification" is + suggested. This type conforms to "public.utf8-plain-text". + + Person & email address to contact for further information: See the + Authors' Addresses section of this document. + + Intended usage: COMMON + + Restrictions on usage: This is expected to be the second part of a + multipart/report. + + + + +Hansen, et al. Standards Track [Page 14] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + Author: See the Authors' Addresses section of this document. + + Change controller: IETF Standards Process + +7. Security Considerations + + Automated use of report types without authentication presents several + security issues. Forging negative reports presents the opportunity + for denial-of-service attacks when the reports are used for automated + maintenance of directories or mailing lists. Forging positive + reports may cause the sender to incorrectly believe a message was + delivered when it was not. + + Malicious users can generate report structures designed to trigger + coding flaws in report parsers. Report parsers need to use secure + coding techniques to avoid the risk of buffer overflow or denial-of- + service attacks against parser coding mistakes. Code reviews of such + parsers are also recommended. + + Malicious users of the email system regularly send messages with + forged envelope return paths, and these messages trigger delivery + status reports that result in a large amount of unwanted traffic on + the Internet. Many users choose to ignore delivery status + notifications because they are usually the result of "blowback" from + forged messages and thus never notice when messages they sent go + undelivered. As a result, support for correlation of delivery status + and message disposition notification messages with sent messages has + become a critical feature of mail clients and possibly mail stores, + if the email infrastructure is to remain reliable. In the short + term, simply correlating Message-IDs may be sufficient to distinguish + true status notifications from those resulting from forged originator + addresses. But in the longer term, including cryptographic signature + material that can securely associate the status notification with the + original message is advisable. + + As this specification permits UTF-8 in additional fields, the + security considerations of UTF-8 [RFC3629] apply. + + + + + + + + + + + + + + +Hansen, et al. Standards Track [Page 15] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + +8. References + +8.1. Normative References + + [ASCII] American National Standards Institute (formerly United + States of America Standards Institute), "USA Code for + Information Interchange", ANSI X3.4-1968, 1968. + + ANSI X3.4-1968 has been replaced by newer versions with + slight modifications, but the 1968 version remains + definitive for the Internet. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC2277] Alvestrand, H., "IETF Policy on Character Sets and + Languages", BCP 18, RFC 2277, January 1998. + + [RFC3461] Moore, K., "Simple Mail Transfer Protocol (SMTP) Service + Extension for Delivery Status Notifications (DSNs)", + RFC 3461, January 2003. + + [RFC3464] Moore, K. and G. Vaudreuil, "An Extensible Message Format + for Delivery Status Notifications", RFC 3464, + January 2003. + + [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO + 10646", STD 63, RFC 3629, November 2003. + + [RFC3798] Hansen, T. and G. Vaudreuil, "Message Disposition + Notification", RFC 3798, May 2004. + + [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, January 2008. + + [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, + October 2008. + + [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322, + October 2008. + + [RFC5646] Phillips, A. and M. Davis, "Tags for Identifying + Languages", BCP 47, RFC 5646, September 2009. + + [RFC6522] Kucherawy, M., Ed., "The Multipart/Report Media Type for + the Reporting of Mail System Administrative Messages", STD + 73, RFC 6522, January 2012. + + + + +Hansen, et al. Standards Track [Page 16] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + + [RFC6530] Klensin, J. and Y. Ko, "Overview and Framework for + Internationalized Email", RFC 6530, February 2012. + + [RFC6531] Yao, J. and W. Mao, "SMTP Extension for Internationalized + Email", RFC 6531, February 2012. + + [RFC6532] Yang, A., Steele, S., and N. Freed, "Internationalized + Email Headers", RFC 6532, February 2012. + +8.2. Informative References + + [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part Two: Media Types", RFC 2046, + November 1996. + + [RFC5337] Newman, C. and A. Melnikov, "Internationalized Delivery + Status and Disposition Notifications", RFC 5337, + September 2008. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Hansen, et al. Standards Track [Page 17] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + +Appendix A. Changes since RFC 5337 + + Changes were made to move from Experimental to Standards Track. The + most significant was the removal of an embedded alternative ASCII + address within a utf-8-address, and the reflections of the ABNF + changes in [RFC6531]. + + Fixed description of utf-8-addr-xtext and utf-8-addr-unitext. + + References to Downgrade and uMailbox removed/fixed. + + ABNF changes and fixed errata submitted by Alfred Hoenes. + + Minor changes to MIME type references. + + Other minor corrections. + +Appendix B. Acknowledgements + + Many thanks for input provided by Pete Resnick, James Galvin, Ned + Freed, John Klensin, Harald Alvestrand, Frank Ellermann, SM, Alfred + Hoenes, Kazunori Fujiwara, and members of the EAI working group to + help solidify this proposal. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Hansen, et al. Standards Track [Page 18] + +RFC 6533 Internationalized DSN and MDNs February 2012 + + +Authors' Addresses + + Tony Hansen (editor) + AT&T Laboratories + 200 Laurel Ave. + Middletown, NJ 07748 + US + + EMail: tony+eaidsn@maillennium.att.com + + + Chris Newman + Oracle + 800 Royal Oaks + Monrovia, CA 91016-6347 + US + + EMail: chris.newman@oracle.com + + + Alexey Melnikov + Isode Ltd + 5 Castle Business Village + 36 Station Road + Hampton, Middlesex TW12 2BX + UK + + EMail: Alexey.Melnikov@isode.com + + + + + + + + + + + + + + + + + + + + + + + +Hansen, et al. Standards Track [Page 19] + From 4e38b7d6af6e85bdc83bfe7167bd0668ad59358b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 1 Nov 2019 17:56:30 -0400 Subject: [PATCH 416/741] Updated README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ff46b18ebe..b2eaedc6fb 100644 --- a/README.md +++ b/README.md @@ -149,8 +149,8 @@ directory and select **Git Sync...** in the menu. Once you do that, you'll need In the top-level MimeKit directory, there are a number of solution files; they are: -* **MimeKit.sln** - includes projects for .NET 4.5, .NETStandard, PCL (Profile7 and Profile111), - Xamarin.Android, and Xamarin.iOS as well as the unit tests. +* **MimeKit.sln** - includes projects for .NET 4.5, .NETStandard, Xamarin.Android, and Xamarin.iOS + as well as the unit tests. * **MimeKit.Mobile.sln** - includes only the Xamarin.Android and Xamarin.iOS projects. * **MimeKit.Net45.sln** - includes only the .NET 4.5 project and the unit tests. From cfe65b7795e3e09858c63a5fb849bbaf5776105c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 1 Nov 2019 21:40:13 -0400 Subject: [PATCH 417/741] Fixed TemporarySecureMimeContext.GetTrustAnchors() Fixes issue #515 --- MimeKit/Cryptography/TemporarySecureMimeContext.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index 57aa521079..f5753a2f32 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -167,9 +167,16 @@ protected override AsymmetricKeyParameter GetPrivateKey (IX509Selector selector) protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnchors () { var anchors = new Org.BouncyCastle.Utilities.Collections.HashSet (); + var selector = new X509CertStoreSelector (); + var keyUsage = new bool[9]; - foreach (var certificate in certificates) - anchors.Add (new TrustAnchor (certificate, null)); + keyUsage[(int) X509KeyUsageBits.KeyCertSign] = true; + selector.KeyUsage = keyUsage; + + foreach (var certificate in certificates) { + if (selector.Match (certificate)) + anchors.Add (new TrustAnchor (certificate, null)); + } return anchors; } From 82fbe1e034f7803d5f65126a9d3e6aa5851ab4f4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 2 Nov 2019 20:24:32 -0400 Subject: [PATCH 418/741] Bumped version to 2.4.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +++--- ReleaseNotes.md | 15 +++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 17 +++++++++-------- nuget/MimeKitLite.nuspec | 12 +++++++----- 8 files changed, 38 insertions(+), 20 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 13536db43f..aab86697c0 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.3.2.0 + 2.4.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 4dd4119642..f64038389b 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.3.2.0 + 2.4.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index a5dd63f35c..3f1eb77184 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.3.2.0")] -[assembly: AssemblyFileVersion ("2.3.2.0")] -[assembly: AssemblyVersion ("2.3.0.0")] +[assembly: AssemblyInformationalVersion ("2.4.0.0")] +[assembly: AssemblyFileVersion ("2.4.0.0")] +[assembly: AssemblyVersion ("2.4.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index f8da0d4a33..28ee4d32c4 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,20 @@ # Release Notes +### MimeKit 2.4.0 (2019-11-02) + +* Added the `text/csv` mime-type to the `MimeTypes` mapping table for files with a .csv extension. +* Expanded the .NETStandard API to match the .NET 4.5 API, so .NETStandard is now complete. +* Dropped support for .NETPortable and WindowsPhone/Universal v8.1. +* Added a net48 assembly to the NuGet package. +* Improved HTML tokenizer performance. +* Fixed X509Crl.IsDelta for CRLs without extensions. + (issue [#513](https://github.com/jstedfast/MimeKit/issues/513)) +* Added support for `message/global-delivery-status`, `message/global-disposition-notification`, + and `message/global-headers` to `MimeParser`. + (issue [#514](https://github.com/jstedfast/MimeKit/issues/514)) +* Fixed S/MIME signatures generated by a TemporarySecureMimeContext to include the certificate chain. + (issue [#515](https://github.com/jstedfast/MimeKit/issues/515)) + ### MimeKit 2.3.2 (2019-10-12) * Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence diff --git a/appveyor.yml b/appveyor.yml index 47dc473d0a..5073ca3001 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.3.2.{build} +version: 2.4.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dfdd7922ce..c4c86f48ae 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.3.2$(Rev:.r) +name: 2.4.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index e54e59ff12..288e11508c 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.3.2 + 2.4.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,13 +26,14 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence to the end of the message. (issue #510) -* Fixed DefaultSecureMimeContext to build the cert chain outside of the private key query. (issue #508) -* Modified the Message-Id parser to gobble ctrl chars in the local-part. -* Fixed some buglets in the TextToFlowed converter involving space-stuffing lines. -* Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty. (issue #506) -* Fixed potential memory leaks in WindowsSecureMimeContext and BouncyCastleSecureMimeContext in the Export() methods in cases where an exception is throw while adding certificates. -* Removed MimeKit.Cryptography.NpgsqlCertificateDatabase. It is unlikely anyone actually uses this. +* Added the `text/csv` mime-type to the `MimeTypes` mapping table for files with a .csv extension. +* Expanded the .NETStandard API to match the .NET 4.5 API, so .NETStandard is now complete. +* Dropped support for .NETPortable and WindowsPhone/Universal v8.1. +* Added a net48 assembly to the NuGet package. +* Improved HTML tokenizer performance. +* Fixed X509Crl.IsDelta for CRLs without extensions. (issue #513) +* Added support for `message/global-delivery-status`, `message/global-disposition-notification`, and `message/global-headers` to `MimeParser`. (issue #514) +* Fixed S/MIME signatures generated by a TemporarySecureMimeContext to include the certificate chain. (issue #515) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index b376da8843..f2a7f723a0 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.3.2 + 2.4.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,10 +26,12 @@ An Open Source library for creating and parsing MIME messages. -* Fixed reserialization of message/rfc822 parts to not add an extra new-line sequence to the end of the message. (issue #510) -* Modified the Message-Id parser to gobble ctrl chars in the local-part. -* Fixed some buglets in the TextToFlowed converter involving space-stuffing lines. -* Fixed BodyBuilder logic for constructing a body with an HtmlBody set to string.Empty. (issue #506) +* Added the `text/csv` mime-type to the `MimeTypes` mapping table for files with a .csv extension. +* Expanded the .NETStandard API to match the .NET 4.5 API, so .NETStandard is now complete. +* Dropped support for .NETPortable and WindowsPhone/Universal v8.1. +* Added a net48 assembly to the NuGet package. +* Improved HTML tokenizer performance. +* Added support for `message/global-delivery-status`, `message/global-disposition-notification`, and `message/global-headers` to `MimeParser`. (issue #514) Xamarin Inc. en-US From e106599bb2bd8593647099a7ea3a1f6a4222de0a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 2 Nov 2019 21:08:02 -0400 Subject: [PATCH 419/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 6 +++--- samples/DkimVerifier/DkimVerifier/packages.config | 4 ++-- .../MessageReader.Android/MessageReader.Android.csproj | 8 ++++---- .../MessageReader.Android/packages.config | 4 ++-- .../MessageReader.iOS/MessageReader.iOS.csproj | 8 ++++---- .../MessageReader.iOS/MessageReader.iOS/packages.config | 4 ++-- samples/MessageReader/MessageReader/MessageReader.csproj | 6 +++--- samples/MessageReader/MessageReader/packages.config | 4 ++-- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index cac9b4d633..d172b0be3a 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.3.2\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.4.0\lib\net45\MimeKit.dll @@ -53,4 +53,4 @@ - \ No newline at end of file + diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index d153833b7a..c75b60990d 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - - \ No newline at end of file + + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 496fc772e4..3f88f7a0b5 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.3.2\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.4.0\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.3.2\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.4.0\lib\monoandroid\MimeKit.dll @@ -93,4 +93,4 @@ xamarin3.msg - \ No newline at end of file + diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index eb9b021119..12d0f78769 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 3a91e8db7d..cb4ec4b2ca 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.3.2\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.4.0\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.3.2\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.4.0\lib\xamarinios\MimeKit.dll @@ -107,4 +107,4 @@ xamarin3.msg - \ No newline at end of file + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 520eea1639..84c843655d 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index b9bf0406a3..3d4f50b34c 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.3.2\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.4.0\lib\net45\MimeKit.dll @@ -98,4 +98,4 @@ --> - \ No newline at end of file + diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index beb902f442..d57c532663 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - - \ No newline at end of file + + From 977514fab2d6263953d3bbda7f01cb805f9d0e31 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 3 Nov 2019 16:33:46 -0500 Subject: [PATCH 420/741] Don't use PublicSign on non-Windows NT machines when building. Fixes issue #516 --- MimeKit/MimeKit.NetStandard.csproj | 1 - MimeKit/MimeKitLite.NetStandard.csproj | 1 - 2 files changed, 2 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index aab86697c0..b197acac1e 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -27,7 +27,6 @@ true mimekit.snk true - true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index f64038389b..c023a22d7d 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -26,7 +26,6 @@ true mimekit.snk true - true From f9879fb7721e70bf957efd372e2ccd0bf9af1066 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 4 Nov 2019 22:28:10 -0500 Subject: [PATCH 421/741] Improved BouncyCastleSecureMimeContext logic for building certificate chains GetTrustedAnchors() now *only* includes self-signed certificates that have the CertKeySign KeyUsage attribute. GetIntermediates() now *only* includes non-self-signed certificates that have the CertKeySign KeyUsage attribute. Fixes issue #515 --- .../BouncyCastleCertificateExtensions.cs | 5 + .../BouncyCastleSecureMimeContext.cs | 24 +- .../Cryptography/DefaultSecureMimeContext.cs | 84 ++- .../TemporarySecureMimeContext.cs | 21 +- UnitTests/Cryptography/SecureMimeTests.cs | 118 +++-- .../TestData/smime/certificate-authority.cfg | 22 + .../TestData/smime/certificate-authority.crt | 32 -- .../TestData/smime/certificate-authority.pfx | Bin 0 -> 4560 bytes .../TestData/smime/certificate-authority.srl | 1 - UnitTests/TestData/smime/chain.crt | 65 --- UnitTests/TestData/smime/gencerts.sh | 84 ++- UnitTests/TestData/smime/intermediate.crt | 33 -- UnitTests/TestData/smime/intermediate.csr | 28 - UnitTests/TestData/smime/intermediate.key | 51 -- UnitTests/TestData/smime/intermediate1.cfg | 22 + UnitTests/TestData/smime/intermediate1.key | 51 ++ UnitTests/TestData/smime/intermediate1.pfx | Bin 0 -> 6400 bytes UnitTests/TestData/smime/intermediate2.cfg | 22 + UnitTests/TestData/smime/intermediate2.key | 51 ++ UnitTests/TestData/smime/intermediate2.pfx | Bin 0 -> 8218 bytes UnitTests/TestData/smime/mkcert.cs | 493 ++++++++++++++++++ UnitTests/TestData/smime/smime.cfg | 21 + UnitTests/TestData/smime/smime.crt | 33 -- UnitTests/TestData/smime/smime.csr | 28 - UnitTests/TestData/smime/smime.key | 101 ++-- UnitTests/TestData/smime/smime.pfx | Bin 0 -> 9902 bytes 26 files changed, 937 insertions(+), 453 deletions(-) create mode 100644 UnitTests/TestData/smime/certificate-authority.cfg delete mode 100644 UnitTests/TestData/smime/certificate-authority.crt create mode 100644 UnitTests/TestData/smime/certificate-authority.pfx delete mode 100644 UnitTests/TestData/smime/certificate-authority.srl delete mode 100644 UnitTests/TestData/smime/chain.crt delete mode 100644 UnitTests/TestData/smime/intermediate.crt delete mode 100644 UnitTests/TestData/smime/intermediate.csr delete mode 100644 UnitTests/TestData/smime/intermediate.key create mode 100644 UnitTests/TestData/smime/intermediate1.cfg create mode 100644 UnitTests/TestData/smime/intermediate1.key create mode 100644 UnitTests/TestData/smime/intermediate1.pfx create mode 100644 UnitTests/TestData/smime/intermediate2.cfg create mode 100644 UnitTests/TestData/smime/intermediate2.key create mode 100644 UnitTests/TestData/smime/intermediate2.pfx create mode 100644 UnitTests/TestData/smime/mkcert.cs create mode 100644 UnitTests/TestData/smime/smime.cfg delete mode 100644 UnitTests/TestData/smime/smime.crt delete mode 100644 UnitTests/TestData/smime/smime.csr create mode 100644 UnitTests/TestData/smime/smime.pfx diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index ad2901bd78..0897813c8d 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -66,6 +66,11 @@ public static X509Certificate2 AsX509Certificate2 (this X509Certificate certific return new X509Certificate2 (certificate.GetEncoded ()); } + internal static bool IsSelfSigned (this X509Certificate certificate) + { + return certificate.SubjectDN.Equivalent (certificate.IssuerDN); + } + /// /// Gets the issuer name info. /// diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index ef5e1730b5..0f3ed3d6cb 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -438,12 +438,17 @@ X509Certificate GetCertificate (IX509Store store, SignerID signer) protected IList BuildCertificateChain (X509Certificate certificate) { var selector = new X509CertStoreSelector (); - selector.Certificate = certificate; + selector.Subject = certificate.SubjectDN; + + var intermediates = new X509CertificateStore (); + intermediates.Add (certificate); var parameters = new PkixBuilderParameters (GetTrustedAnchors (), selector); parameters.ValidityModel = PkixParameters.PkixValidityModel; parameters.AddStore (GetIntermediateCertificates ()); + parameters.AddStore (intermediates); parameters.IsRevocationEnabled = false; + parameters.Date = new DateTimeObject (DateTime.UtcNow); var builder = new PkixCertPathBuilder (); var result = builder.Build (parameters); @@ -458,19 +463,18 @@ protected IList BuildCertificateChain (X509Certificate certific PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store crls, X509Certificate certificate, DateTime signingTime) { - var intermediate = new X509CertificateStore (); - foreach (X509Certificate cert in certificates.GetMatches (null)) - intermediate.Add (cert); - var selector = new X509CertStoreSelector (); - selector.Certificate = certificate; + selector.Subject = certificate.SubjectDN; + + var intermediates = new X509CertificateStore (); + foreach (X509Certificate cert in certificates.GetMatches (null)) + intermediates.Add (cert); + intermediates.Add (certificate); var parameters = new PkixBuilderParameters (anchors, selector); parameters.AddStore (GetIntermediateCertificates ()); - parameters.AddStore (intermediate); - - var localCrls = GetCertificateRevocationLists (); - parameters.AddStore (localCrls); + parameters.AddStore (intermediates); + parameters.AddStore (GetCertificateRevocationLists ()); parameters.AddStore (crls); parameters.ValidityModel = PkixParameters.PkixValidityModel; diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index bee50e9831..9888c00ca8 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -291,7 +291,8 @@ protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnch selector.KeyUsage = keyUsage; foreach (var record in dbase.Find (selector, true, X509CertificateRecordFields.Certificate)) { - anchors.Add (new TrustAnchor (record.Certificate, null)); + if (record.Certificate.IsSelfSigned ()) + anchors.Add (new TrustAnchor (record.Certificate, null)); } return anchors; @@ -308,7 +309,19 @@ protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnch /// The intermediate certificates. protected override IX509Store GetIntermediateCertificates () { - return dbase; + var intermediates = new X509CertificateStore (); + var selector = new X509CertStoreSelector (); + var keyUsage = new bool[9]; + + keyUsage[(int) X509KeyUsageBits.KeyCertSign] = true; + selector.KeyUsage = keyUsage; + + foreach (var record in dbase.Find (selector, false, X509CertificateRecordFields.Certificate)) { + if (!record.Certificate.IsSelfSigned ()) + intermediates.Add (record.Certificate); + } + + return intermediates; } /// @@ -556,29 +569,61 @@ public override void Import (Stream stream, string password) startIndex = 1; } - for (int i = startIndex; i < chain.Length; i++) { - if ((record = dbase.Find (chain[i].Certificate, X509CertificateRecordFields.Id)) == null) - dbase.Add (new X509CertificateRecord (chain[i].Certificate) { IsTrusted = true }); - } + for (int i = startIndex; i < chain.Length; i++) + Import (chain[i].Certificate, true); } else if (pkcs12.IsCertificateEntry (alias)) { var entry = pkcs12.GetCertificate (alias); - if ((record = dbase.Find (entry.Certificate, X509CertificateRecordFields.Id)) == null) - dbase.Add (new X509CertificateRecord (entry.Certificate) { IsTrusted = true }); + Import (entry.Certificate, true); } } } -#endregion + #endregion + + /// + /// Imports a certificate. + /// + /// + /// Imports the certificate. + /// If the certificate already exists in the database and is true, + /// then the IsTrusted state is updated otherwise the certificate is added to the database with the + /// specified trust. + /// + /// The certificate. + /// true if the certificate is trusted; otherwise, false. + /// + /// is null. + /// + public void Import (X509Certificate certificate, bool trusted) + { + if (certificate == null) + throw new ArgumentNullException (nameof (certificate)); + + X509CertificateRecord record; + + if ((record = dbase.Find (certificate, X509CertificateRecordFields.Id | X509CertificateRecordFields.Trusted)) != null) { + if (trusted && !record.IsTrusted) { + record.IsTrusted = trusted; + dbase.Update (record, X509CertificateRecordFields.Trusted); + } + + return; + } + + record = new X509CertificateRecord (certificate); + record.IsTrusted = trusted; + dbase.Add (record); + } /// /// Imports a DER-encoded certificate stream. /// /// - /// Imports all of the certificates in the DER-encoded stream. + /// Imports the certificate(s). /// /// The raw certificate(s). - /// true if the certificates are trusted. + /// true if the certificates are trusted; othewrwise, false. /// /// is null. /// @@ -589,21 +634,8 @@ public void Import (Stream stream, bool trusted) var parser = new X509CertificateParser (); - foreach (X509Certificate certificate in parser.ReadCertificates (stream)) { - X509CertificateRecord record; - - if ((record = dbase.Find (certificate, X509CertificateRecordFields.Id | X509CertificateRecordFields.Trusted)) != null) { - if (trusted && !record.IsTrusted) { - record.IsTrusted = trusted; - dbase.Update (record, X509CertificateRecordFields.Trusted); - } - continue; - } - - record = new X509CertificateRecord (certificate); - record.IsTrusted = trusted; - dbase.Add (record); - } + foreach (X509Certificate certificate in parser.ReadCertificates (stream)) + Import (certificate, trusted); } /// diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index f5753a2f32..b3a63b3bdb 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -167,14 +167,11 @@ protected override AsymmetricKeyParameter GetPrivateKey (IX509Selector selector) protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnchors () { var anchors = new Org.BouncyCastle.Utilities.Collections.HashSet (); - var selector = new X509CertStoreSelector (); - var keyUsage = new bool[9]; - - keyUsage[(int) X509KeyUsageBits.KeyCertSign] = true; - selector.KeyUsage = keyUsage; foreach (var certificate in certificates) { - if (selector.Match (certificate)) + var keyUsage = certificate.GetKeyUsage (); + + if (keyUsage != null && keyUsage[(int) X509KeyUsageBits.KeyCertSign] && certificate.IsSelfSigned ()) anchors.Add (new TrustAnchor (certificate, null)); } @@ -192,12 +189,16 @@ protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnch /// The intermediate certificates. protected override IX509Store GetIntermediateCertificates () { - var store = new X509CertificateStore (); + var intermediates = new X509CertificateStore (); - foreach (var certificate in certificates) - store.Add (certificate); + foreach (var certificate in certificates) { + var keyUsage = certificate.GetKeyUsage (); + + if (keyUsage != null && keyUsage[(int) X509KeyUsageBits.KeyCertSign] && !certificate.IsSelfSigned ()) + intermediates.Add (certificate); + } - return store; + return intermediates; } /// diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 0952d9a921..771d30a077 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -35,6 +35,7 @@ using NUnit.Framework; using Org.BouncyCastle.X509; +using Org.BouncyCastle.Pkcs; using MimeKit; using MimeKit.Cryptography; @@ -48,20 +49,25 @@ public abstract class SecureMimeTestsBase const string ExpiredCertificateMessage = "The certificate is revoked.\r\n"; const string UntrustedRootCertificateMessage = "A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.\r\n"; const string ThunderbirdFingerprint = "354ea4dcf98166639b58ec5df06a65de0cd8a95c"; - const string MimeKitFingerprint = "66679bc836cf4f22cb3680bc9bbae50898cd30e0"; + const string MimeKitFingerprint = "ba4403cd3d876ae8cd261575820330086cc3cbc8"; const string ThunderbirdName = "fejj@gnome.org"; - static readonly DateTime MimeKitCreationDate = new DateTime (2019, 08, 21, 11, 46, 34); - static readonly DateTime MimeKitExpirationDate = new DateTime (2029, 08, 18, 11, 46, 34); + static readonly DateTime MimeKitCreationDate = new DateTime (2019, 11, 05, 03, 00, 15); + static readonly DateTime MimeKitExpirationDate = new DateTime (2029, 11, 02, 03, 00, 15); + readonly X509Certificate MimeKitCertificate; - static readonly string[] CertificateAuthorities = { - "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + static readonly string[] StartComCertificates = { + "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; + protected virtual bool IsEnabled { get { return true; } } protected abstract SecureMimeContext CreateContext (); protected SecureMimeTestsBase () { + if (!IsEnabled) + return; + using (var ctx = CreateContext ()) { var dataDir = Path.Combine ("..", "..", "TestData", "smime"); string path; @@ -71,20 +77,13 @@ protected SecureMimeTestsBase () else CryptographyContext.Register (ctx.GetType ()); + var chain = LoadPkcs12CertificateChain (Path.Combine (dataDir, "smime.pfx"), "no.secret"); + MimeKitCertificate = chain[0]; + if (ctx is WindowsSecureMimeContext) { var windows = (WindowsSecureMimeContext) ctx; var parser = new X509CertificateParser (); - using (var stream = File.OpenRead (Path.Combine (dataDir, "certificate-authority.crt"))) { - foreach (X509Certificate certificate in parser.ReadCertificates (stream)) - windows.Import (StoreName.AuthRoot, certificate); - } - - using (var stream = File.OpenRead (Path.Combine (dataDir, "intermediate.crt"))) { - foreach (X509Certificate certificate in parser.ReadCertificates (stream)) - windows.Import (StoreName.CertificateAuthority, certificate); - } - using (var stream = File.OpenRead (Path.Combine (dataDir, "StartComCertificationAuthority.crt"))) { foreach (X509Certificate certificate in parser.ReadCertificates (stream)) windows.Import (StoreName.AuthRoot, certificate); @@ -94,8 +93,15 @@ protected SecureMimeTestsBase () foreach (X509Certificate certificate in parser.ReadCertificates (stream)) windows.Import (StoreName.CertificateAuthority, certificate); } + + // import the root & intermediate certificates from the smime.pfx file + var store = StoreName.AuthRoot; + for (int i = chain.Length - 1; i > 0; i--) { + windows.Import (store, chain[i]); + store = StoreName.CertificateAuthority; + } } else { - foreach (var filename in CertificateAuthorities) { + foreach (var filename in StartComCertificates) { path = Path.Combine (dataDir, filename); using (var stream = File.OpenRead (path)) { if (ctx is DefaultSecureMimeContext) { @@ -107,10 +113,18 @@ protected SecureMimeTestsBase () } } } - } - path = Path.Combine (dataDir, "smime.p12"); + // import the root & intermediate certificates from the smime.pfx file + for (int i = chain.Length - 1; i > 0; i--) { + if (ctx is DefaultSecureMimeContext) { + ((DefaultSecureMimeContext) ctx).Import (chain[i], true); + } else { + ctx.Import (chain[i]); + } + } + } + path = Path.Combine (dataDir, "smime.pfx"); ctx.Import (path, "no.secret"); // import a second time to cover the case where the certificate & private key already exist @@ -118,6 +132,31 @@ protected SecureMimeTestsBase () } } + static X509Certificate[] LoadPkcs12CertificateChain (string fileName, string password) + { + using (var stream = File.OpenRead (fileName)) { + var pkcs12 = new Pkcs12Store (stream, password.ToCharArray ()); + + foreach (string alias in pkcs12.Aliases) { + if (pkcs12.IsKeyEntry (alias)) { + var chain = pkcs12.GetCertificateChain (alias); + var entry = pkcs12.GetKey (alias); + + if (!entry.Key.IsPrivate) + continue; + + var certificates = new X509Certificate[chain.Length]; + for (int i = 0; i < chain.Length; i++) + certificates[i] = chain[i].Certificate; + + return certificates; + } + } + + return new X509Certificate[0]; + } + } + [Test] public void TestArgumentExceptions () { @@ -137,7 +176,7 @@ public void TestArgumentExceptions () Assert.Throws (() => SecureMimeContext.GetDigestOid (DigestAlgorithm.Tiger192)); using (var ctx = CreateContext ()) { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); var mailbox = new MailboxAddress ("Unit Tests", "example@mimekit.net"); var recipients = new CmsRecipientCollection (); DigitalSignatureCollection signatures; @@ -437,7 +476,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContext () [Test] public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; var signed = ApplicationPkcs7Mime.Sign (signer, cleartext); @@ -479,7 +518,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () [Test] public virtual void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; using (var ctx = CreateContext ()) { @@ -512,7 +551,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () [Test] public virtual void TestSecureMimeSigningWithCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; var multipart = MultipartSigned.Create (signer, body); @@ -561,7 +600,7 @@ public virtual void TestSecureMimeSigningWithCmsSigner () [Test] public virtual void TestSecureMimeSigningWithContextAndCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; using (var ctx = CreateContext ()) { @@ -627,7 +666,7 @@ public virtual void TestSecureMimeSigningWithContextAndCmsSigner () [Test] public virtual void TestSecureMimeSigningWithRsaSsaPss () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret") { + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret") { RsaSignaturePaddingScheme = RsaSignaturePaddingScheme.Pss }; var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; @@ -917,11 +956,10 @@ public virtual void TestSecureMimeMessageEncryption () [Test] public virtual void TestSecureMimeEncryption () { - var certificate = new X509Certificate2 (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up encrypting..." }; var recipients = new CmsRecipientCollection (); - recipients.Add (new CmsRecipient (certificate, SubjectIdentifierType.SubjectKeyIdentifier)); + recipients.Add (new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.SubjectKeyIdentifier)); var encrypted = ApplicationPkcs7Mime.Encrypt (recipients, body); @@ -936,13 +974,16 @@ public virtual void TestSecureMimeEncryption () [Test] public virtual void TestSecureMimeEncryptionWithContext () { - var certificate = new X509Certificate2 (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up encrypting..." }; - var recipients = new CmsRecipientCollection (); - - recipients.Add (new CmsRecipient (certificate, SubjectIdentifierType.SubjectKeyIdentifier)); using (var ctx = CreateContext ()) { + var recipients = new CmsRecipientCollection (); + + if (ctx is WindowsSecureMimeContext) + recipients.Add (new CmsRecipient (MimeKitCertificate.AsX509Certificate2 (), SubjectIdentifierType.SubjectKeyIdentifier)); + else + recipients.Add (new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.SubjectKeyIdentifier)); + var encrypted = ApplicationPkcs7Mime.Encrypt (ctx, recipients, body); Assert.AreEqual (SecureMimeType.EnvelopedData, encrypted.SecureMimeType, "S/MIME type did not match."); @@ -962,13 +1003,16 @@ public virtual void TestSecureMimeEncryptionWithContext () [Test] public virtual void TestSecureMimeEncryptionWithAlgorithm () { - var certificate = new X509Certificate2 (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up encrypting..." }; - var recipients = new CmsRecipientCollection (); - - recipients.Add (new CmsRecipient (certificate, SubjectIdentifierType.SubjectKeyIdentifier)); using (var ctx = CreateContext ()) { + var recipients = new CmsRecipientCollection (); + + if (ctx is WindowsSecureMimeContext) + recipients.Add (new CmsRecipient (MimeKitCertificate.AsX509Certificate2 (), SubjectIdentifierType.SubjectKeyIdentifier)); + else + recipients.Add (new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.SubjectKeyIdentifier)); + foreach (EncryptionAlgorithm algorithm in Enum.GetValues (typeof (EncryptionAlgorithm))) { foreach (var recipient in recipients) recipient.EncryptionAlgorithms = new EncryptionAlgorithm[] { algorithm }; @@ -1338,6 +1382,12 @@ protected override SecureMimeContext CreateContext () [TestFixture] public class WindowsSecureMimeTests : SecureMimeTestsBase { + protected override bool IsEnabled { + get { + return Path.DirectorySeparatorChar == '\\'; + } + } + protected override SecureMimeContext CreateContext () { return new WindowsSecureMimeContext (); diff --git a/UnitTests/TestData/smime/certificate-authority.cfg b/UnitTests/TestData/smime/certificate-authority.cfg new file mode 100644 index 0000000000..4db8f1cc9c --- /dev/null +++ b/UnitTests/TestData/smime/certificate-authority.cfg @@ -0,0 +1,22 @@ +[PrivateKey] +Algorithm = RSA +BitLength = 4096 +FileName = certificate-authority.key + +[Subject] +CountryName = US +StateOrProvinceName = Massachusetts +LocalityName = Boston +OrganizationName = Example Authority Inc. +OrganizationalUnitName = IT +CommonName = Example Certification Authority +EmailAddress = root@example.com + +[Generator] +BasicConstraints = critical, CA:true +DaysValid = 3650 +Issuer = this +KeyUsage = critical, cRLSign, keyCertSign +SignatureAlgorithm = SHA256WithRSA +#Output = certificate-authority.pfx +Password = no.secret diff --git a/UnitTests/TestData/smime/certificate-authority.crt b/UnitTests/TestData/smime/certificate-authority.crt deleted file mode 100644 index 18cdfa4c1a..0000000000 --- a/UnitTests/TestData/smime/certificate-authority.crt +++ /dev/null @@ -1,32 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFmjCCA4ICCQCOpgEdHERD1jANBgkqhkiG9w0BAQsFADCBjjELMAkGA1UEBhMC -VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G -A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 -bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTkwODIxMTE0 -NjI0WhcNMjkwODE4MTE0NjI0WjCBjjELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h -c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB -dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxHzAdBgkqhkiG9w0B -CQEWEHJvb3RAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDo4FwwukH0bKt03YBIliukoc7uosLRgxsEFrXZ+YTVmR1uyjFjWIWbsEkv -D4ItNBy+pm+fnItaGPVGyCjm3DhGOcHx9M5xV3Lrb6CPqWihT2z5KuaKANPU3wPe -zc3ar3RBU0TIUIKzzvN45wrEa2USQAlrWngjeLwV0m3BAMi+D6MFjIhQqs3IuTXX -Yr+7Kr566xPv86wgEukm6i9w96wi9KN4f7D4Ilse48eTi4imPJxkBkbEsbncBK+v -iac2q4GR2mX25LTfM9sHdxysDXUDBkOxKICdvzDxPgDDmApqAaxnYwMqFel0evG6 -G1GqX3DJ2/79vGRhbWnlSUiMJHrYAj4RcVxPiojceJTsvjqyrzVSeWC7bG43o9gD -et2gQgy/J31XvRwXx/eEk32DtZVQqyIsJizCu5iNUmf8hH3t3xP+iW5lIpqI2oiF -NVh+b3RGrZbYhTxwHpFqsV1rCJ9fiVEG4L0BipAMLCe9N6g/nJS5VBTIMbWecTXw -NMWSDhfsoZPXTzzzTRab7PxyRVetS14FOKFSjhcgkU+p2lAC9Bys4ibVSsceKyrb -m+fUWLlMMIE90sJNeNjheg4gHpTZUHeZXXhV7SoAIAKiSr/fNdhuN5nsdhjOvSOo -j7WZ/NOELoKDuwOW5txAZxwxcPEMiEAYHLjU6WbBeP74A1FwFQIDAQABMA0GCSqG -SIb3DQEBCwUAA4ICAQAKi7B9nXaFDOtYTxuskfpNypBvt+m1XbXCoMp0L1lCzToF -EODBNPmGcQcMFOzVy5ThHUWxd47uWTxEmLuG2qUU6vhsoTqaJEOx7TgXJs+FPMdZ -SQtZMmfuGROwiiEEkSX14yH1zJvIT0M3htqtlfN04RfNtVuhxlsd/bofZoyRvqI5 -20m3BeEj7g2gQVYHhLgPjSUCFrQ6c/pYEWTW7TWrrYT8s6zOdZniWuH40KnrULum -KuCj7YqD5dUFo+bwhXVCXu7Jr7I08Q5p99cZQjv4hLEXY3C+IVgcswvFuQVkLEhe -X9Uivf2U//FKsVQp+mjOYWItwoZvJHf7Dqf9WPgFq+Iwj0qZFYSmOm2lS9A0BVSJ -gED1mYdD7mgTrsFkOl+dzjL4fGwCPgb0baun/tftiVpxbExhOUNfRf52hxp0K6S3 -qHX5G2QZVCrPjBGDtuEdPON+ndzVgbSOHxACC+/vEo2eDCjvu6XkD288dfxivhLZ -C12T4NjPWejIbP7YcoFvuhAQnlKvpxIJMfhSlC3b6rBvYZlqAPH9jty8tSfthXo2 -jTVgV7lU0CTGRmzejal6rQThZS7XlFbnEhi+2PtZVQmjwh0uqPSpyQlJqQTr113R -VQu0YGCreEwrjEpBjpxLja/T38WaVCzx7bNqQKzGGz2yDjQyxb9xheZnhegLyQ== ------END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/certificate-authority.pfx b/UnitTests/TestData/smime/certificate-authority.pfx new file mode 100644 index 0000000000000000000000000000000000000000..6fbe97054d47f8ed836257163ec83112a4c464b6 GIT binary patch literal 4560 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 /dev/null +if [ ! -e "certificate-authority.key" ]; then + openssl genrsa -out certificate-authority.key 4096 > /dev/null +fi + +# Create the private key for the primary intermediate certificate +if [ ! -e "intermediate1.key" ]; then + openssl genrsa -out intermediate1.key 4096 > /dev/null +fi + +# Create the private key for the secondary intermediate certificate +if [ ! -e "intermediate2.key" ]; then + openssl genrsa -out intermediate2.key 4096 > /dev/null +fi + +# Create the private key for the leaf-node S/MIME certificate +if [ ! -e "smime.key" ]; then + openssl genrsa -out smime.key 4096 > /dev/null +fi + +if [ ! -e "BouncyCastle.Crypto.dll" ]; then + cp ../../bin/Debug/BouncyCastle.Crypto.dll . +fi + +mcs mkcert.cs -r:BouncyCastle.Crypto.dll # Create the root (CA) certificate -echo "========= Certificate Authority =========" -echo "Country Name: US" -echo "State or Province Name: Massachusetts" -echo "Locality Name: Boston" -echo "Organization Name: Example Authority Inc." -echo "Organizational Unit Name: " -echo "Common Name: Bruce Wayne" -echo "Email Address: root@example.com" -echo "=========================================" -openssl req -new -x509 -days 3650 -nodes -key certificate-authority.key -out certificate-authority.crt \ - -subj "/C=US/ST=Massachusetts/L=Boston/O=Example Authority Inc./CN=Bruce Wayne/emailAddress=root@example.com" - -# Create the private key for the intermediate certificate -openssl genrsa -out intermediate.key 4096 > /dev/null - -# Create the intermediate certificate signing request (CSR) -echo "========= Intermediate Certificate =========" -echo "Country Name: US" -echo "State or Province Name: Massachusetts" -echo "Locality Name: Boston" -echo "Organization Name: Example Authority Inc." -echo "Organizational Unit Name: " -echo "Common Name: Bruce Wayne" -echo "Email Address: intermediate@example.com" -echo "=========================================" -openssl req -new -key intermediate.key -out intermediate.csr \ - -subj "/C=US/ST=Massachusetts/L=Boston/O=Example Authority Inc./CN=Bruce Wayne/emailAddress=intermediate@example.com" - -# Sign the CSR using the root (CA) certificate -openssl x509 -req -in intermediate.csr -CA certificate-authority.crt -CAkey certificate-authority.key \ - -CAcreateserial -days 3650 -out intermediate.crt - -# Create the certificate chain -cat intermediate.crt certificate-authority.crt > chain.crt +mono ./mkcert.exe certificate-authority.cfg > fingerprints.txt + +# Create the primary intermediate certificate +mono ./mkcert.exe intermediate1.cfg >> fingerprints.txt + +# Create the secondary intermediate certificate +mono ./mkcert.exe intermediate2.cfg >> fingerprints.txt # Generate an S/MIME certificate for testing -echo "======== S/MIME Test Certificate ========" -echo "Country Name: US" -echo "State or Province Name: Massachusetts" -echo "Locality Name: Boston" -echo "Organization Name: " -echo "Common Name: MimeKit UnitTests" -echo "Email Address: mimekit@example.com" -echo "=========================================" -openssl genrsa -des3 -out smime.key 4096 > /dev/null -openssl req -new -key smime.key -out smime.csr \ - -subj "/C=US/ST=Massachusetts/L=Boston/CN=MimeKit UnitTests/emailAddress=mimekit@example.com" -openssl x509 -req -days 3650 -in smime.csr -CA intermediate.crt -CAkey intermediate.key -set_serial 1 \ - -out smime.crt -setalias "mimekit@example.com" -addtrust emailProtection \ - -addreject clientAuth -addreject serverAuth -trustout -openssl pkcs12 -export -in smime.crt -inkey smime.key -out smime.p12 -chain -CAfile chain.crt +mono ./mkcert.exe smime.cfg >> fingerprints.txt + +cat fingerprints.txt diff --git a/UnitTests/TestData/smime/intermediate.crt b/UnitTests/TestData/smime/intermediate.crt deleted file mode 100644 index b04510fb9c..0000000000 --- a/UnitTests/TestData/smime/intermediate.crt +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFojCCA4oCCQCmi5t4BiehUDANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC -VVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0G -A1UECgwWRXhhbXBsZSBBdXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5 -bmUxHzAdBgkqhkiG9w0BCQEWEHJvb3RAZXhhbXBsZS5jb20wHhcNMTkwODIxMTE0 -NjI1WhcNMjkwODE4MTE0NjI1WjCBljELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1h -c3NhY2h1c2V0dHMxDzANBgNVBAcMBkJvc3RvbjEfMB0GA1UECgwWRXhhbXBsZSBB -dXRob3JpdHkgSW5jLjEUMBIGA1UEAwwLQnJ1Y2UgV2F5bmUxJzAlBgkqhkiG9w0B -CQEWGGludGVybWVkaWF0ZUBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL55oFf3vW8olt3VlvhkAx+KRYKCsGCfUNBDLb0KO5f+cNJL -g/kfUqg2r94jpl+BkmexD8Bs5YTRKUC15x26H9CgEQqw7EmBgMN1cnacmGDhqsKM -ELyju8CwyKhi+UDlCbGUlhCdCb8fi6rRuZmzuK3hXF5Yz7uBJyIdvchCwdTpwlFS -Lgt7v+K1k5fJwitu2N+QXzVB7G5FNNVwE8W5MKTbbB+wqYb3J04pRPmBnj7jKUby -N1MC1GA7NqCfapiZOJVW+howcxZJ5QY1UpkmBh8L3yZYe5L7IR3IKlPJ1TD9Cwjc -DnFFVuZBpuckUA+94ieCoZ7pV2dZ+q/qq4RgWVDK05HYhKSOu86he2nfndaOBAgp -9l/mqo+5u/26Wenuvz8HW8asAz2FjvHp62KRYq9gZgJr77qRG9XIgM5+HsopTfOK -3jDAsETCDk4mL09/FpKvVWtBvpUIE/ZO2eKXbYmmS7tiXxpIPZmJPcs8aOirZy2R -3AOekYOdj6hoTvU4t2lfUFOJQuPdA/8rOkOMmgdzyW3ZNLrjqZNtZrghHqVt0ZUT -0YdWp1wEUTDhhkpnhnIHUocV6doYQGaykqyqiS+T8FAQK6aSBtcIHu/PNdG2sfz2 -Ma9QyfKVHFXrxH4GqWcahhtJlramopZ+/MT/QAz1YcBz2b70ePvP/Wss3nhxAgMB -AAEwDQYJKoZIhvcNAQEFBQADggIBADZN4B+9iC7MYhtHYeiRzubCt7cdX1q6tr8v -wROh2ZOUR20fqSWH6exsbafy47VNn3VYDwpf7imxjBKKcNlfDO7utFpLqew7xOLh -pAQR2owI5PSD4lXmwUc6tOSvW4H6nDE7RoPXpjyk9y+Epw9TJoTx70QtqUJhK4LQ -MhcNlzvWNO07RTtPZLi3J53rJYCy43NEwTX2XvIYNyxiWJ3C33QAXKPW7WcfPp48 -pIXjJqlEWEoO6hJwfXg8VDjOBYAu36Brv9om8+8JU57Bx4O9qC7HQ8Ha8tNa0jvC -7Vfy4i/8+moJHTXVQr9JGj2PBr+Jt1rTT/w643eozTScYIxxCn1lMFPj0sJYv8iK -dlzT+FtMeDCW+CHtrVAOLBGSlulF97Mgvw579X2sbDRyIXWmPcT2KoDotRVm4PHb -RBcFWpTbfqH84pUAYzOW984fNMGLlY2vZaL40jhkjtV7SlZDfVrhYgcAKgSra/i0 -5akHJiCHnzGdzlTQvV7zZ1wxCxj0MliGU0asn/Wana6Eq8HvefcsnAu5lNRbz6Vo -qb36RkQ9jNUq1lghaMYsbSoO3UmORnpxVnEjXKxHzUQeyjavaG5EQcOk7PZkkreu -UcSeC0EatfRdG4iwb20xky/RDNkdgLo9VkK1NDfx7l2JxGgjazjaWTslFp4QiEJF -PTPQ+C/1 ------END CERTIFICATE----- diff --git a/UnitTests/TestData/smime/intermediate.csr b/UnitTests/TestData/smime/intermediate.csr deleted file mode 100644 index e9608381fe..0000000000 --- a/UnitTests/TestData/smime/intermediate.csr +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIE3DCCAsQCAQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIDA1NYXNzYWNodXNl -dHRzMQ8wDQYDVQQHDAZCb3N0b24xHzAdBgNVBAoMFkV4YW1wbGUgQXV0aG9yaXR5 -IEluYy4xFDASBgNVBAMMC0JydWNlIFdheW5lMScwJQYJKoZIhvcNAQkBFhhpbnRl -cm1lZGlhdGVAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQC+eaBX971vKJbd1Zb4ZAMfikWCgrBgn1DQQy29CjuX/nDSS4P5H1KoNq/e -I6ZfgZJnsQ/AbOWE0SlAtecduh/QoBEKsOxJgYDDdXJ2nJhg4arCjBC8o7vAsMio -YvlA5QmxlJYQnQm/H4uq0bmZs7it4VxeWM+7gSciHb3IQsHU6cJRUi4Le7/itZOX -ycIrbtjfkF81QexuRTTVcBPFuTCk22wfsKmG9ydOKUT5gZ4+4ylG8jdTAtRgOzag -n2qYmTiVVvoaMHMWSeUGNVKZJgYfC98mWHuS+yEdyCpTydUw/QsI3A5xRVbmQabn -JFAPveIngqGe6VdnWfqv6quEYFlQytOR2ISkjrvOoXtp353WjgQIKfZf5qqPubv9 -ulnp7r8/B1vGrAM9hY7x6etikWKvYGYCa++6kRvVyIDOfh7KKU3zit4wwLBEwg5O -Ji9PfxaSr1VrQb6VCBP2Ttnil22Jpku7Yl8aSD2ZiT3LPGjoq2ctkdwDnpGDnY+o -aE71OLdpX1BTiULj3QP/KzpDjJoHc8lt2TS646mTbWa4IR6lbdGVE9GHVqdcBFEw -4YZKZ4ZyB1KHFenaGEBmspKsqokvk/BQECumkgbXCB7vzzXRtrH89jGvUMnylRxV -68R+BqlnGoYbSZa2pqKWfvzE/0AM9WHAc9m+9Hj7z/1rLN54cQIDAQABoAAwDQYJ -KoZIhvcNAQELBQADggIBABIy4X+qzattSjNgIOTgo1lWmvhljux0WfkML3mVEqeZ -Zgiw1UPs0pbbjgJ1sAfqRVghnXJP+OBloGBeQwrjYbAGFtjCJXLyoOSGpAqDHwmM -u83hFLD0GNuX6hagyxzEUdtTq5hJnjyohOjkkNKgFtvM8kxOuWuXlCsdkAg8frmc -VfbOxOrRLbEQL2d47r6LPlMNI3z7TN5obdUOddwrxLWCCc2j8U88at46hYZD1evO -I7NDPsCaPFxK0UM5Y+CnaWDx+exFdVsGMypypLsADo0jpFbI7l7/jCoDxs5dJ2AY -HtrktgwRg6YfNJT7t9xiWlrFOUKUMEx4jaZ6FWzNg0waGIemjijHo0MyqB81fKdQ -3IZvEbLY8Kp4m5y24jdenu55GhwEJNHyuHsb/YGCxEX6avhNBRPqVTqN3gpCiqbF -Yi9g8XW9aRDS1RJhlPvU03lW5OKoCoCZSoOsn34OUpgZnluApXbEiqCTzC4UbuBN -R8Kpp/DLR0x11llmljrb6VQcWQdjvAKRgPgTQ7zcN5fOUJbA1y7i4UlJeSIHQS2f -T4RHnGjxTXExY//GOeElE8VJXgwrvL776lh+jj0OInoidDbbE7NNdJzlrk935vHm -cFW9zC9bSVZG3uj8obZcPRa6Ksxprf7temEhTrAEXMsBiCHoO/7iZlYiiYcBdBIR ------END CERTIFICATE REQUEST----- diff --git a/UnitTests/TestData/smime/intermediate.key b/UnitTests/TestData/smime/intermediate.key deleted file mode 100644 index 245eb70f96..0000000000 --- a/UnitTests/TestData/smime/intermediate.key +++ /dev/null @@ -1,51 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -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 ------END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/intermediate1.cfg b/UnitTests/TestData/smime/intermediate1.cfg new file mode 100644 index 0000000000..70d830871b --- /dev/null +++ b/UnitTests/TestData/smime/intermediate1.cfg @@ -0,0 +1,22 @@ +[PrivateKey] +Algorithm = RSA +BitLength = 4096 +FileName = intermediate1.key + +[Subject] +CountryName = US +StateOrProvinceName = Massachusetts +LocalityName = Boston +OrganizationName = Example Authority Inc. +OrganizationalUnitName = IT +CommonName = Example Primary Intermediate CA + +[Generator] +BasicConstraints = critical, CA:true +DaysValid = 3650 +Issuer = certificate-authority.pfx +IssuerPassword = no.secret +KeyUsage = critical, cRLSign, keyCertSign +SignatureAlgorithm = SHA256WithRSA +#Output = intermediate1.pfx +Password = no.secret diff --git a/UnitTests/TestData/smime/intermediate1.key b/UnitTests/TestData/smime/intermediate1.key new file mode 100644 index 0000000000..b0ec36c320 --- /dev/null +++ b/UnitTests/TestData/smime/intermediate1.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/intermediate1.pfx b/UnitTests/TestData/smime/intermediate1.pfx new file mode 100644 index 0000000000000000000000000000000000000000..62c345c2abf732404ab13e2cb6d14660d7a61b8a GIT binary patch literal 6400 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 J8!@4v{s&IZC4B$@ literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/smime/intermediate2.cfg b/UnitTests/TestData/smime/intermediate2.cfg new file mode 100644 index 0000000000..1824f85011 --- /dev/null +++ b/UnitTests/TestData/smime/intermediate2.cfg @@ -0,0 +1,22 @@ +[PrivateKey] +Algorithm = RSA +BitLength = 4096 +FileName = intermediate2.key + +[Subject] +CountryName = US +StateOrProvinceName = Massachusetts +LocalityName = Boston +OrganizationName = Example Authority Inc. +OrganizationalUnitName = IT +CommonName = Example Secondary Intermediate CA + +[Generator] +BasicConstraints = critical, CA:true +DaysValid = 3650 +Issuer = intermediate1.pfx +IssuerPassword = no.secret +KeyUsage = critical, cRLSign, keyCertSign +SignatureAlgorithm = SHA256WithRSA +#Output = intermediate2.pfx +Password = no.secret diff --git a/UnitTests/TestData/smime/intermediate2.key b/UnitTests/TestData/smime/intermediate2.key new file mode 100644 index 0000000000..daa8edf7b1 --- /dev/null +++ b/UnitTests/TestData/smime/intermediate2.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/intermediate2.pfx b/UnitTests/TestData/smime/intermediate2.pfx new file mode 100644 index 0000000000000000000000000000000000000000..d4fbd98e9f891f886737dfe504b2a6b72f082551 GIT binary patch literal 8218 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/UnitTests/TestData/smime/mkcert.cs b/UnitTests/TestData/smime/mkcert.cs new file mode 100644 index 0000000000..890747cb09 --- /dev/null +++ b/UnitTests/TestData/smime/mkcert.cs @@ -0,0 +1,493 @@ +using System; +using System.IO; +using System.Text; +using System.Collections; +using System.Collections.Generic; + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.Pkcs; +using Org.BouncyCastle.X509; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Utilities; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Crypto.Prng; +using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.X509.Extension; +using Org.BouncyCastle.Crypto.Operators; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Parameters; + +namespace CertificateGenerator +{ + class Program + { + public static void Main (string[] args) + { + var x509NameOids = CreateX509NameOidMapping (); + var oids = new List (); + var values = new List (); + var privateKey = new PrivateKeyOptions (); + var options = new GeneratorOptions (); + AsymmetricCipherKeyPair key; + string section = null; + string alias = null; + + options.Output = Path.ChangeExtension (args[0], ".pfx"); + + using (var reader = File.OpenText (args[0])) { + string line; + + while ((line = reader.ReadLine ()) != null) { + if (line.Length == 0 || line[0] == '#') + continue; + + if (line[0] == '[') { + int endIndex = line.IndexOf (']'); + + if (endIndex == -1) { + Console.Error.WriteLine ("Incomplete section: ", line); + return; + } + + section = line.Substring (1, endIndex - 1); + continue; + } + + var kvp = line.Split (new char[] { '=' }, 2); + var property = kvp[0].ToLowerInvariant ().Trim (); + var value = kvp[1].Trim (); + + switch (section.ToLowerInvariant ()) { + case "privatekey": + switch (property) { + case "algorithm": + privateKey.Algorithm = value; + break; + case "bitlength": + if (int.TryParse (value, out int bitLength)) { + privateKey.BitLength = bitLength; + } else { + Console.Error.WriteLine ("Invalid [PrivateKey] BitLength: {0}", value); + return; + } + break; + case "filename": + privateKey.FileName = value; + break; + default: + Console.Error.WriteLine ("Unknown [PrivateKey] property: {0}", kvp[0]); + return; + } + break; + case "subject": + if (x509NameOids.TryGetValue (property, out DerObjectIdentifier oid)) { + if (oid == X509Name.CN) + alias = value; + else if (alias == null && oid == X509Name.E) + alias = value; + + values.Add (value); + oids.Add (oid); + } else { + Console.Error.WriteLine ("Unknown [Subject] property: {0}", kvp[0]); + return; + } + break; + case "generator": + switch (property) { + case "basicconstraints": + options.BasicConstraints = value; + break; + case "daysvalid": + if (int.TryParse (value, out int days)) { + options.DaysValid = days; + } else { + Console.Error.WriteLine ("Invalid [Generator] DaysValid: {0}", value); + return; + } + break; + case "issuer": + options.Issuer = value; + break; + case "issuerpassword": + options.IssuerPassword = value; + break; + case "keyusage": + options.KeyUsage = value; + break; + case "output": + options.Output = value; + break; + case "password": + options.Password = value; + break; + case "signaturealgorithm": + options.SignatureAlgorithm = value; + break; + default: + Console.Error.WriteLine ("Unknown [Generator] property: {0}", kvp[0]); + return; + } + break; + default: + Console.Error.WriteLine ("Unknown section: {0}", section); + break; + } + } + } + + // Sanity Checks + if (!string.IsNullOrEmpty (privateKey.FileName) && !File.Exists (privateKey.FileName)) { + Console.Error.WriteLine ("[PrivateKey] FileName `{0}' does not exist!", privateKey.FileName); + return; + } + + if (oids.Count == 0) { + Console.Error.WriteLine ("No [Subject] specified."); + return; + } + + if (string.IsNullOrEmpty (options.Issuer)) { + Console.Error.WriteLine ("[Generator] Issuer property cannot be empty!"); + return; + } else if (options.Issuer != "this" && !File.Exists (options.Issuer)) { + Console.Error.WriteLine ("[Generator] Issuer `{0}' does not exist!", options.Issuer); + return; + } + + if (string.IsNullOrEmpty (options.Output)) { + Console.Error.WriteLine ("[Generator] Output property cannot be empty!"); + return; + } + + var randomGenerator = new CryptoApiRandomGenerator (); + var random = new SecureRandom (randomGenerator); + var subject = new X509Name (oids, values); + + if (string.IsNullOrEmpty (privateKey.FileName)) { + var keyGenerationParameters = new KeyGenerationParameters (random, privateKey.BitLength); + IAsymmetricCipherKeyPairGenerator keyPairGenerator; + + switch (privateKey.Algorithm.ToLowerInvariant ()) { + case "rsa": keyPairGenerator = new RsaKeyPairGenerator (); break; + case "ecdsa": keyPairGenerator = new ECKeyPairGenerator ("ECDSA"); break; + default: Console.Error.WriteLine ("Unsupported PrivateKey algorithm: {0}", privateKey.Algorithm); return; + } + keyPairGenerator.Init (keyGenerationParameters); + key = keyPairGenerator.GenerateKeyPair (); + } else { + try { + key = LoadAsymmetricCipherKeyPair (privateKey.FileName); + } catch (Exception ex) { + Console.Error.WriteLine ("[PrivateKey] Failed to load `{0}': {1}", privateKey.FileName, ex.Message); + return; + } + } + + AsymmetricKeyParameter signingKey; + X509Certificate issuerCertificate; + X509Certificate[] chain; + X509Name issuer; + + if (options.Issuer != "this") { + try { + chain = LoadPkcs12CertificateChain (options.Issuer, options.IssuerPassword, out signingKey); + issuerCertificate = chain[0]; + issuer = chain[0].SubjectDN; + } catch (Exception ex) { + Console.Error.WriteLine ("[Generator] failed to load `{0}': {1}", options.Issuer, ex.Message); + return; + } + } else { + chain = new X509Certificate[0]; + issuerCertificate = null; + signingKey = key.Private; + issuer = subject; + } + + string signatureAlgorithm; + + if (string.IsNullOrEmpty (options.SignatureAlgorithm)) { + if (signingKey is RsaPrivateCrtKeyParameters) { + signatureAlgorithm = "SHA256WithRSA"; + } else if (signingKey is ECPrivateKeyParameters ec) { + if (ec.AlgorithmName == "ECGOST3410") { + signatureAlgorithm = "GOST3411WithECGOST3410"; + } else { + signatureAlgorithm = "SHA256withECDSA"; + } + } else { + signatureAlgorithm = "GOST3411WithGOST3410"; + } + } else { + signatureAlgorithm = options.SignatureAlgorithm; + } + + int serialNumberIndex = oids.IndexOf (X509Name.SerialNumber); + BigInteger serialNumber; + + if (serialNumberIndex == -1) { + serialNumber = BigIntegers.CreateRandomInRange (BigInteger.One, BigInteger.ValueOf (long.MaxValue), random); + } else { + try { + serialNumber = new BigInteger (values[serialNumberIndex]); + } catch { + Console.Error.WriteLine ("Invalid [Subject] SerialNumber: {0}", values[serialNumberIndex]); + return; + } + } + + var notBefore = DateTime.UtcNow; + var notAfter = notBefore.AddDays (options.DaysValid); + + var signatureFactory = new Asn1SignatureFactory (signatureAlgorithm, signingKey, random); + var generator = new X509V3CertificateGenerator (); + generator.SetSerialNumber (serialNumber); + generator.SetPublicKey (key.Public); + generator.SetNotBefore (notBefore); + generator.SetNotAfter (notAfter); + generator.SetSubjectDN (subject); + generator.SetIssuerDN (issuer); + + generator.AddExtension (X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure (key.Public)); + + if (issuerCertificate != null) + generator.AddExtension (X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure (issuerCertificate)); + + if (!string.IsNullOrEmpty (options.BasicConstraints)) { + var basicConstraints = options.BasicConstraints.Split (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + bool critical = false; + bool ca = false; + + foreach (var constraint in basicConstraints) { + switch (constraint.Trim ().ToLowerInvariant ()) { + case "critical": critical = true; break; + case "ca:false": ca = false; break; + case "ca:true": ca = true; break; + } + } + + generator.AddExtension (X509Extensions.BasicConstraints, critical, new BasicConstraints (ca)); + } + + if (!string.IsNullOrEmpty (options.KeyUsage)) { + var keyUsages = options.KeyUsage.Split (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + bool critical = false; + int keyUsage = 0; + + foreach (var usage in keyUsages) { + switch (usage.Trim ().ToLowerInvariant ()) { + case "critical": critical = true; break; + case "digitalsignature": keyUsage |= X509KeyUsage.DigitalSignature; break; + case "nonrepudiation": keyUsage |= X509KeyUsage.NonRepudiation; break; + case "keyencipherment": keyUsage |= X509KeyUsage.KeyEncipherment; break; + case "dataencipherment": keyUsage |= X509KeyUsage.DataEncipherment; break; + case "keyagreement": keyUsage |= X509KeyUsage.KeyAgreement; break; + case "keycertsign": keyUsage |= X509KeyUsage.KeyCertSign; break; + case "crlsign": keyUsage |= X509KeyUsage.CrlSign; break; + case "encipheronly": keyUsage |= X509KeyUsage.EncipherOnly; break; + case "decipheronly": keyUsage |= X509KeyUsage.DecipherOnly; break; + } + } + + generator.AddExtension (X509Extensions.KeyUsage, critical, new KeyUsage (keyUsage)); + } + + var certificate = generator.Generate (signatureFactory); + var keyEntry = new AsymmetricKeyEntry (key.Private); + + var chainEntries = new X509CertificateEntry[chain.Length + 1]; + chainEntries[0] = new X509CertificateEntry (certificate); + for (int i = 0; i < chain.Length; i++) + chainEntries[i + 1] = new X509CertificateEntry (chain[i]); + + var pkcs12 = new Pkcs12Store (); + pkcs12.SetKeyEntry (alias ?? string.Empty, keyEntry, chainEntries); + + using (var stream = File.Create (options.Output)) + pkcs12.Save (stream, options.Password.ToCharArray (), random); + + Console.WriteLine ("{0} {1}", options.Output, GetFingerprint (certificate)); + } + + static AsymmetricCipherKeyPair LoadAsymmetricCipherKeyPair (string fileName) + { + using (var stream = File.OpenRead (fileName)) { + using (var reader = new StreamReader (stream)) { + var pem = new PemReader (reader); + var item = pem.ReadObject (); + + if (item is AsymmetricCipherKeyPair keyPair) + return keyPair; + + if (item is AsymmetricKeyParameter key && key.IsPrivate) { + if (key is RsaPrivateCrtKeyParameters rsa) { + var pub = new RsaKeyParameters (false, rsa.Modulus, rsa.Exponent); + + return new AsymmetricCipherKeyPair (pub, key); + } + } + + throw new Exception ("Invalid asymmetric key pair."); + } + } + } + + static X509Certificate[] LoadPkcs12CertificateChain (string fileName, string password, out AsymmetricKeyParameter key) + { + using (var stream = File.OpenRead (fileName)) { + var pkcs12 = new Pkcs12Store (stream, password.ToCharArray ()); + + foreach (string alias in pkcs12.Aliases) { + if (pkcs12.IsKeyEntry (alias)) { + var chain = pkcs12.GetCertificateChain (alias); + var entry = pkcs12.GetKey (alias); + + if (!entry.Key.IsPrivate) + continue; + + key = entry.Key; + + var certificates = new X509Certificate[chain.Length]; + for (int i = 0; i < chain.Length; i++) + certificates[i] = chain[i].Certificate; + + return certificates; + } + } + } + + throw new Exception ("Failed to locate private key entry."); + } + + static string GetFingerprint (X509Certificate certificate) + { + if (certificate == null) + throw new ArgumentNullException (nameof (certificate)); + + var encoded = certificate.GetEncoded (); + var fingerprint = new StringBuilder (); + var sha1 = new Sha1Digest (); + var data = new byte[20]; + + sha1.BlockUpdate (encoded, 0, encoded.Length); + sha1.DoFinal (data, 0); + + for (int i = 0; i < data.Length; i++) + fingerprint.Append (data[i].ToString ("x2")); + + return fingerprint.ToString (); + } + + static Dictionary CreateX509NameOidMapping () + { + var mapping = new Dictionary (); + mapping.Add ("c", X509Name.C); + mapping.Add ("countrycode", X509Name.C); + mapping.Add ("countryname", X509Name.C); + mapping.Add ("st", X509Name.ST); + mapping.Add ("stateorprovincename", X509Name.ST); + mapping.Add ("l", X509Name.L); + mapping.Add ("localityname", X509Name.L); + mapping.Add ("street", X509Name.Street); + mapping.Add ("postaladdress", X509Name.PostalAddress); + mapping.Add ("postalcode", X509Name.PostalCode); + mapping.Add ("o", X509Name.O); + mapping.Add ("organizationname", X509Name.O); + mapping.Add ("ou", X509Name.OU); + mapping.Add ("organizationalunitname", X509Name.OU); + mapping.Add ("cn", X509Name.CN); + mapping.Add ("commonname", X509Name.CN); + mapping.Add ("e", X509Name.E); + mapping.Add ("emailaddress", X509Name.E); + mapping.Add ("serialnumber", X509Name.SerialNumber); + mapping.Add ("t", X509Name.T); + mapping.Add ("title", X509Name.T); + mapping.Add ("dc", X509Name.DC); + mapping.Add ("uid", X509Name.UID); + mapping.Add ("surname", X509Name.Surname); + mapping.Add ("givenname", X509Name.GivenName); + mapping.Add ("initials", X509Name.Initials); + mapping.Add ("generation", X509Name.Generation); + mapping.Add ("unstructuredaddress", X509Name.UnstructuredAddress); + mapping.Add ("unstructuredname", X509Name.UnstructuredName); + mapping.Add ("uniqueidentifier", X509Name.UniqueIdentifier); + mapping.Add ("dn", X509Name.DnQualifier); + mapping.Add ("pseudonym", X509Name.Pseudonym); + mapping.Add ("nameofbirth", X509Name.NameAtBirth); + mapping.Add ("countryofcitizenship", X509Name.CountryOfCitizenship); + mapping.Add ("countryofresidence", X509Name.CountryOfResidence); + mapping.Add ("gender", X509Name.Gender); + mapping.Add ("placeofbirth", X509Name.PlaceOfBirth); + mapping.Add ("dateofbirth", X509Name.DateOfBirth); + mapping.Add ("businesscategory", X509Name.BusinessCategory); + mapping.Add ("telephonenumber", X509Name.TelephoneNumber); + return mapping; + } + } + + sealed class PrivateKeyOptions + { + public PrivateKeyOptions () + { + Algorithm = "RSA"; + BitLength = 2048; + } + + public string Algorithm { + get; set; + } + + public int BitLength { + get; set; + } + + public string FileName { + get; set; + } + } + + sealed class GeneratorOptions + { + public GeneratorOptions () + { + IssuerPassword = string.Empty; + Password = string.Empty; + } + + public string BasicConstraints { + get; set; + } + + public int DaysValid { + get; set; + } + + public string Issuer { + get; set; + } + + public string IssuerPassword { + get; set; + } + + public string KeyUsage { + get; set; + } + + public string Output { + get; set; + } + + public string Password { + get; set; + } + + public string SignatureAlgorithm { + get; set; + } + } +} diff --git a/UnitTests/TestData/smime/smime.cfg b/UnitTests/TestData/smime/smime.cfg new file mode 100644 index 0000000000..22921d5737 --- /dev/null +++ b/UnitTests/TestData/smime/smime.cfg @@ -0,0 +1,21 @@ +[PrivateKey] +Algorithm = RSA +BitLength = 4096 +FileName = smime.key + +[Subject] +CountryName = US +StateOrProvinceName = Massachusetts +LocalityName = Boston +CommonName = MimeKit UnitTests +EmailAddress = mimekit@example.com + +[Generator] +BasicConstraints = critical, CA:false +DaysValid = 3650 +Issuer = intermediate2.pfx +IssuerPassword = no.secret +KeyUsage = critical, digitalSignature, keyEncipherment, nonRepudiation +SignatureAlgorithm = SHA256WithRSA +#Output = smime.pfx +Password = no.secret diff --git a/UnitTests/TestData/smime/smime.crt b/UnitTests/TestData/smime/smime.crt deleted file mode 100644 index a3a92937d6..0000000000 --- a/UnitTests/TestData/smime/smime.crt +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN TRUSTED CERTIFICATE----- -MIIFgTCCA2kCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRYwFAYD -VQQIDA1NYXNzYWNodXNldHRzMQ8wDQYDVQQHDAZCb3N0b24xHzAdBgNVBAoMFkV4 -YW1wbGUgQXV0aG9yaXR5IEluYy4xFDASBgNVBAMMC0JydWNlIFdheW5lMScwJQYJ -KoZIhvcNAQkBFhhpbnRlcm1lZGlhdGVAZXhhbXBsZS5jb20wHhcNMTkwODIxMTE0 -NjM0WhcNMjkwODE4MTE0NjM0WjB2MQswCQYDVQQGEwJVUzEWMBQGA1UECAwNTWFz -c2FjaHVzZXR0czEPMA0GA1UEBwwGQm9zdG9uMRowGAYDVQQDDBFNaW1lS2l0IFVu -aXRUZXN0czEiMCAGCSqGSIb3DQEJARYTbWltZWtpdEBleGFtcGxlLmNvbTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnQFviRzdPn6recmoAqyst9cZIQ -hTcz47lsRjMUCKC+GIxEpFKZf31SBcqiwWPpa6mn3w1Go82todMCbYDZbcLN9xyc -Bhq/qVRw0RCLUC8zriH72KLJPxMgDGtgKuMaqJpYfB209x5Up2QGnNFzNWx6a6kq -rtlXIQN1zW8Jj+9530ajzzvANnu0Uu4udkAE1IyT2f09XOky95F0T83pW8TMYhYT -+RVYYiHcVPqsstcwmP93XwrWCxSWoIrXez8mnKn24v9Y/GACN/wH6xw0+vurCd62 -Rl/XiUwOYXkFk801I7eOPf5Hnue9edUnwAda1u480ckN+B4217OsvOwcWdiOyBqA -1hKAyd0OjZLB6+TQQtBeUzeMDag7IzwP91AFj4PdYQ3MJ7F18KCFYk+SA4rOMyA2 -DpHV54ghpK3A8inKFPf/23lpbLCRZ9Y42jJkV/mhJJVGntUOqd6xkPuoxMcfcdmF -jlUKPeapoyBCHMrJ/HnMTzONCcmKI3abTx30iYenwUpP1knSofgfNPtwcpJLYQV5 -Bp+kB+XcyKqiPitZHmzG8WK0CBaeAahp2HOvGFsXqn5CtvFUrsqByBzULG+ej1Ti -a5PUfd3Rn5T1YApM2dHWXdcgqb2eJ2uDuVlOJ5gqf+WdXSsu5lO87uwFD/nIUELg -RJSAwsm+W1kYnkAjAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBALH5S+Tb5CKt40yO -YLmwxA6EhHFMLTA3xNtUh22TDdw7+RD7CjcjjTwxLaf5fw3JsXjGZC07jJGWbHke -CTi55JaMV0V+yHwfAFdxV0PDzjIB4bnjTl7wDP+R6zCIKnNoD27+a9FgQxYiODZz -LMDIqrVSVqFcjvUf4+86XmTcbcIf3DDkSGD8GQNZjfLw9mIxTU9LbxSzNbBFuuSZ -m8EcF+hZ6xdNBCT6oll8Zd9z6jY2CTuf/ZL+W1/9ZtYLcEUJ5EnQbL6cTi9btxFO -Wg21gRcwHWDLHSdjFO/tWKKqvKqfXmi7kFbKVlN87+uF/z3kwMJU6BCsZQp7/lWD -HLPXr3aYwLYzi7iEeLzZp/BttiJR/diObUBN8n//zl8WvmWEpm/ypc8ugDD5C8Ds -tGsVAufNWra/UCQ1ISa6OXy51woLwFrgnXYHtbn/7pgqj1EMnEHlHiGEUP4bWfxC -cJ6SA9VT6qW9tkPNmH+dq7/Uh+eaCAEAUHWSggmZ0nBF+ucANrGDSHj65vnsbKmy -h3wzmRqMLHpdhIqmYWg090Xhaj95pIRODQSJBYHJ74RAmJifDkf5+sq9ABI6DoL9 -rqTaAycjCR2g7WB/QoXd++dvNPDSq1yBxtwvP/fOrPzlQyiEwbNblrP3uAlBcVlO -4iKkNkMyBMsbddkJYk+NIVe75WMLMDcwCgYIKwYBBQUHAwSgFAYIKwYBBQUHAwIG -CCsGAQUFBwMBDBNtaW1la2l0QGV4YW1wbGUuY29t ------END TRUSTED CERTIFICATE----- diff --git a/UnitTests/TestData/smime/smime.csr b/UnitTests/TestData/smime/smime.csr deleted file mode 100644 index e716288a8a..0000000000 --- a/UnitTests/TestData/smime/smime.csr +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEuzCCAqMCAQAwdjELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDU1hc3NhY2h1c2V0 -dHMxDzANBgNVBAcMBkJvc3RvbjEaMBgGA1UEAwwRTWltZUtpdCBVbml0VGVzdHMx -IjAgBgkqhkiG9w0BCQEWE21pbWVraXRAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3 -DQEBAQUAA4ICDwAwggIKAoICAQDJ0Bb4kc3T5+q3nJqAKsrLfXGSEIU3M+O5bEYz -FAigvhiMRKRSmX99UgXKosFj6Wupp98NRqPNraHTAm2A2W3CzfccnAYav6lUcNEQ -i1AvM64h+9iiyT8TIAxrYCrjGqiaWHwdtPceVKdkBpzRczVsemupKq7ZVyEDdc1v -CY/ved9Go887wDZ7tFLuLnZABNSMk9n9PVzpMveRdE/N6VvEzGIWE/kVWGIh3FT6 -rLLXMJj/d18K1gsUlqCK13s/Jpyp9uL/WPxgAjf8B+scNPr7qwnetkZf14lMDmF5 -BZPNNSO3jj3+R57nvXnVJ8AHWtbuPNHJDfgeNtezrLzsHFnYjsgagNYSgMndDo2S -wevk0ELQXlM3jA2oOyM8D/dQBY+D3WENzCexdfCghWJPkgOKzjMgNg6R1eeIIaSt -wPIpyhT3/9t5aWywkWfWONoyZFf5oSSVRp7VDqnesZD7qMTHH3HZhY5VCj3mqaMg -QhzKyfx5zE8zjQnJiiN2m08d9ImHp8FKT9ZJ0qH4HzT7cHKSS2EFeQafpAfl3Miq -oj4rWR5sxvFitAgWngGoadhzrxhbF6p+QrbxVK7Kgcgc1Cxvno9U4muT1H3d0Z+U -9WAKTNnR1l3XIKm9nidrg7lZTieYKn/lnV0rLuZTvO7sBQ/5yFBC4ESUgMLJvltZ -GJ5AIwIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBAARO96hl7y9irnr0t9aPY71o -VAnmW3qbj1Xy/XVWrWFEa+gWD2ENO/n8YqZX/+RJgD7LZdSWhGdRpmEOhXk2lMFl -pIV18ot2P1Jlw1haAaFIo3TniGZbU5VtU9CSBv4AbZjon9KMlAWRCmcUl3uT2/wI -+m3Lv1BcF3W7/a2O1+MlbYX6k2A79jKUejy44zfJ5LI/pYTwn9L27XNDzyi+X5SN -uxhLJ2tondYzt8iQhJhrJj8mHbatq2AtgMY8WVTIVpYYZN7gQkM400ihm9spY0fD -fTYaIHvhJRFxKK5MTSnbJJfmOFg4yABJzp5aHsKSbohRWcDKnYm5Ix3+nIEGuXMn -LQ3ebq9Wldc6RDbXzTb2SUPRyeDeT1CTq0CTSDhY4vGE9xewsWTdJxAeUMTKySl9 -QW0SnLa51pwREZNXHKMPCpwNlM4GkKM815+U5R15HbDafC2Yw/PUpd2g7IgiSkJe -AAC9MYtvh6ZSBoGLcnoMRfS2nlIRZgUMqMAQ25TaIJiwssJi96yQhbRK8Q+Ew5oY -RbrjTYyWVCT0POi3SNDM9B+Q62AdAwsJqyXb1y8IPuj1UDVHhjSNGSg3s+YwYhLr -3QzPvernO6CxSGVBIRQtJfdBn3yeoA4J9spsKDrXdBJA0kp+gTSDen/DWSCUAFqx -jStDOZyK/a56pZa3rpPO ------END CERTIFICATE REQUEST----- diff --git a/UnitTests/TestData/smime/smime.key b/UnitTests/TestData/smime/smime.key index 67e5c2f537..612a10438d 100644 --- a/UnitTests/TestData/smime/smime.key +++ b/UnitTests/TestData/smime/smime.key @@ -1,54 +1,51 @@ -----BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,06D92B20D955F748 - -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 -----END RSA PRIVATE KEY----- diff --git a/UnitTests/TestData/smime/smime.pfx b/UnitTests/TestData/smime/smime.pfx new file mode 100644 index 0000000000000000000000000000000000000000..7791bb7c7e522f3b001a446e7bf17c6ce73c902d GIT binary patch literal 9902 zcmZv>V{j%+xC9#8#>Td7JK5N_u}R+8wry);+qP}n#{KqOom+M1$IMg@espzDbv?uA z2LcSr=m!B!9U>X>0uKxcoaaaC2NnQ&%INq14+lV>F$O>%LBRfBC*WX!LGl8iJ^lk- z87U!P{%`odYjMEP7&iO}0&mTJz4rTZ&kL>ymoICR5X{0UyH^1Ne+CMFl6B+t{b+is1&>1Vuw$wmj{No2W#?=f&0ifmhYiyP6I|JR2<%9eSgu^m-9u7N zA(yxBMOi)klRY-hcF;YKwk~Izd*INfFWkny$kuN_r>>B1UUGKRD&pm$2pl)yI3H6F z*HELE*B?RpT8l9{NJ(r>ZvnD# zNkIIs5-jM*DaB)@*(PzELaEC=D|TGz&L!r@lSq|OHwJ^gc{@JKE1Y`| zzL#5FWFg3Yrx|#6@Ak(MCNzzLg>yW}&<^gLV!8YY4Pl4RpG%&mJg)I(ai|Ob$r2Fx z9)t!s#7*ekVUTw)yKaF+rAD&9{J!)j^oKvH*Vb#f@n2;HsKw9ZPvhJ%Rn?Pl-z?+f zEv^Mr{g{2PrG>+{NTSn^=<2Jj>L;f-^V4yxJ~A0Ck)Ru>zX||Zf%&NE%;c)RBh9I#BsVDB+PHD-9=S1qpi3rewiNZubf_9{0t3 zwe_PlaKD*=Y^+hmI8W#vgQ-$hfQ?L^ks4e~1IM`HC2{YN)B&?CqOA}E7t*4)19$qN z-L8RLKCs0U+JoWhbx{Tpuy8&^USUWK8n2DD1|`ue=Nzx1)#jb(ZWgR}ln{_Uw_Ofldanz!e7PFF_g)v!8n<7msFt%e~p_9c`S@Ed& zYyF+>HsAd}ubUL=;!Y5@y{zkT7A?_f__{L}kF~82|64+`QQI9XshP6@*TPW#xljl~G1hYz>z?d2YjXA68euiE&ttDoIxU)-(lAS9q zF2K@sfBEc!q*i@pAjyJ0jUcD&Kg|Fd6o1ujw+u@B!Y2DU%wl~=>5H%i9z#Pa5tS)Q zCBnZdO#q)fyN129rHMy>Rb&77_!XdmT5%xge8vMaXYU;rZpy`M_Y=^BMIPI^UNh(k zc4S5JRK69{S7(+MbZ8?=grK-+K`SfX5el#}X$bgr%ZyUG5bi{cp)5aQq^txVGLTZ= z5Jg&dMA~@luG*|lK;EHeF6k4A7izYmxw9bJs^mRHw~8$hLHIy5>VY7 zJFmUYy_e%IAM6{p7i*Hbo$sojw?Nbx3TQmDos>G&q#qZd7EsVN6wpH{*WLa8iOGDM zzAkdOzz6sUw-C=9c^X>=51`06aA9VvE7e*KnNby zYP|L=Or9okX+0M3c$0f|>D;bkNQ))evd##R4(Y_`XhwLjONScGM*=?}giY!YShdm# zHdzX;N>K6aeyK&g#XN8qpt2B^au9HM* z%ORA^BsRDezX@P84_`tXKN5#*w>t3taK-EjWSRwPG?#Q6$0WBtH_7VrqpW=C{M0tX zcVUKC5=?3GQM9!bwqswQk5r%TPdRceqqw(Rqxl*H73JPrY3KheTP<2VvhIb$de(ni z^@Wh|Uk5kIo;Q}OTgcQkIHdjjGxVx&+~JdY{-fq^yHhyz#wSs?;Ar>W{tB)lG_U{= zyz}vH9-X}lK;Pp$3FEucu1KN@_9V)zL|+dufLacHegx`(x)=x-7dJK zI#di(=GJ>8iV)2yBTY7ZZ2&q=@t!!Fg$|N6so)nJ-ja&<&Z@Q$fo2GZPYi{=G_ryT zk8lFk66;PSS4kwALESZJ#Qn`!b1B~fC*=qUk|WGD_|ftV>g`BgNrv5*TMMd2Z_ow# zYY`SEoe>FH@n*lw#oXxR0pM06_*s6bsJJpIhkMr8b}MaFNT%gO9~e3=0W;II#(M_0 z>1=c5z@J{&XRbwBzJd}riCT?+B~$QJ#W_wOM2h2SW^3R6Q5d^Cc<$XiKQX71uYU(B z$@K};kn3J(e>3ju!(xB-i-;YutnBfls8LeD?UyyF+p|HVWQV4(kv0sntuAjH2I$R*7TLiE;H;;kd%;`1i}mu{}{@Lvqf z`=6-EU4tZNpMr;L$C$5HkFhQ6;pz|Sj0}=r3e6mDo5ebX4jaEDDjxkYbj+RX5gV<5 z>yCs#_A#jjBQjCCA^4qwT9cD0F7;|X?zQdU(~G`MJO;;-o-*`?*`n)Q^6oxGVRQ4e zQkT1b$gwxeI$JEfTL`h!5Ep?T!B$u!?SY5?JRdunRKd_Q5Fqq&)Sv$0bWG*sg$`Dg z#JGh~`xAO0mvdoolxPT2xq8@G1`MV)cl&gE@fYU0!%`n)Ez9Q7h}6c7tN*%m=Zf~6tCw@)7&<}c!IRI-Q*ALo-|H%YfQG`wEx{9 zZ?z33T*)b9VxF%Rv|VBkY`FVWIpWMTpPXNqnRtDn_s{Db?t_G7#V}8EEBs%6yhb?$ zb2|+LqiCT{;de}Z&Gu*T*SI;_@GOx*Tq3K*-OgWYqwf;aPZv;Mb_yfZD)wi%a!4fm z5Mf%YBXsXO{+>b?1#b*q#2{MIA6~0vAu=C%BK!JO zOX}74{%q^({X8q;uM7lLi;6bdsDbf&#zM>ZSxi&7!UiMHw&$D>2AFQj80f5ex7xs& zTdCtmd!{mBu%J=S-M~O8r3~yxnd%=kkFT`e>`-b)*f(J#GQY3`Dj$9w^@kV($aKC* zq1q{hK0i1Xl{T;U@5;G&J`?=Sx&+biGoh8aVe)(Jv21HZtinAvHJ?tH@5iqjPJ^nV z8SFW3D`G2XJ3L!mlqZ{V6exq~Yv+G)35xd}BXQ+nEQN|=b`#o@43Xq6ul`<462v3d zxpWvcTmX(P4sS8ssC9Ln=diVrP!h{nI;%oISk@$ zs=K}pSJ7-EKc2>JVT*jE_+7=oohzmSt~L<8)6&btAiC16hF?{nq28d=KlzNDXUGc7M4#zE=;in1hdr-ts9UX<= zHK1tK5A9sqc2?I{C8-ChEaF!GlO=mRm+PSg;OK7K#lY`WGqHbh{P!)KF%@uKK=fV} zBGzA9p@D9TP-+I4mR6#c3V7Q1KYuE!I4J~v@O~32BhQ{s|1EdZH;e2~qw6Bh9}hKm zYCqpQFghy2*{v-_vJs}s&Iv_u)vDcLIcRm=alkuEKi#}IB=s6*ff1m}EP`ZL`#Cgf z=O}B6%y5HP^3}u$EK~$4wuPo@JOB+}Y1VibS8>@~dht`+!V2$jWGB{trFoc;G};{q ztN(E-8Aap>1q!puPR-IfP-AlxEuG+jFgwI8gBFR5v`5}R6SEU-1*bo_d>BkSbW2TrDX0KgeM(u_3Km#|AY`S-Tbl%| zuqDgk22P~t08vBND5-5vyf~XFHLJgydn-AST!V!y*9@)_kpIwITzLdUF2R-*cfNcU)`59x= zBQ!`ClA?_IRG4r1&$|3(>F-HQk^;K{1v_f1oYox1%x9@ z`kus)+@3PAvaT!kZ9%sp!xICGw~lR5jzy@vR+$H5KTkFmI@~9*kd@1aG0arI)c#oB z+@{f-z5X$>2&#K-UC9ET`g!&g{4_m8ZP1J^RCOHC2rChqG6Q)%9WUS@N_^1pH{sh- z`e9|*|HJ$~OXS~R9i5&in5L(kgM@tksYDfa5IDPNy%30pC~|XN_wMz!$46f!=D9z> z%mxwNx(pAV^K#^=7@?!g@+z>siZx6OjI`Fv*F0Itu9m`rP(`(LBe|T>E%$QqOgZ-I zPfI1#!)w>3vLYv91H@hf&N z6vpkqCiS`-g6Qh*Gw^BP1Gc&|sx#j&_VEUYlQ#q#d;dT(3A$ZMln6Jb4K6#~7a23( zBpC{Be#~VLUihe})w0X_OyU=XhTz`xT&mD(SiKaYninN?3fMnsW``Z=dvGBK#&0sh z_^V6HEe8`MBFmXkW^0|>=C4mi=6SfH2@dK7W_2b%7p-PEiEUyPur|1F*$HfBSV(~) z5oR$j=Q&#CgaKr+w+n@qvq{y7HCe3TXSmf*Gj!orER~o|hVZQ9D<pdB&^E8O6NInei0J%YFDMTX0beZmi^KrYaW zU_X01Yp|qcl325T=&4fNTcB5UV7JyQS$^@ztybPXR2}Q4UJE_pRdU}3OwRfpFGcS- zSs7WQT!ux_`V0eVEGRT3>(0sd`9zplh8%|p#u_t`zua%wGCG^mYk zoSLHLv?l7mHvsaL`WPbb0#F$if&}sV89Y7bNLjTKuoYH{kUidJ@T^f0P$1z+UOyCz zBLangNukdv?T~LvM@_mpTF^D+{c4zT1NifC-7AS5ZWT=ugrAf$Lc|~K(>|pKqhj$D z2w@dyxop?9=X^-21Ig`ZKeVn`V`pyGx`7)|SN%fR5WxIC!#5xLv+X)^HH<_uD2%*t z&-15^yS>_BKnGTSDZJ|0qL+%bJ+gq#ROeNQ#Tt(;#0F^wvN{S<#|?7}3l>vH7$fiZ`5&)59b8e6~qYjp~c2rA?t_@a&T%-^`g5A)lw{ z>b`)`N`tN4Ogn|zvU&YFed!S;G?voia8uJ$LgS@ge3z{ee8`wp3c?n%igz+}lO#xU zMRa{k^OC0$5>1OQw09pud7oGgAVIe4)mZ8UB~sMme$Cts^pKzs`D9uh&t3(A1L6$ObLzXQ{D9K%Ol`tdSei<@ufy(4Bf>t9f6U8eS5SKXc!6Atntwk%*O*tJSFzi zUn_OVqGhQjx#Zk?-Hr`J@?!PLAl~?1DVF4fY~S)&w}bjF5y5|ttrEFNRp`OW5AuN}7{1Kg^J!>);b|VF($+b@sWA`dDo5hLXX#1k zbxciOB`y3*s##IybeR7^2VYzbEhV5cRt$KXPZ13S4LV?4PS=tfiy5KwwjqWa6!DSB zhEDz`&wH!{uMlPgW}GFjON2Sl**K^WttKjd_~proj!MAw29UE#Q|Gx(B`A{xs;e>d z4aD<{CUj2zNbFpW95gk~Kwr6qR%77yFye^WG^m1KcILSyb&j-Cvpixy--;PR_ zq$PmXV)Z66p9@f5mdMyIS-7cO*T%l9TNs%G!wzPJ@a07+gV?Bv^ITZiEd#)rUU}Em*^qPqssWjitjSWiLpjE zT7^hJ*ITxj+jL|ZD>8fq5Zi;*ShqZCs0mXD-N>7#LiX6X0<5S!~5h-js!Wdr_&FjR$w-G1z z>@QFF-@jE?c3lH1*Lq29S11Q5kO>+ObxWvE6<@NieA z-0xgqh7Yy9uS!yC=9*lsM={ysqMxj-6M&kEKA+Hq;`rS2V^Q}W56uc;rltJ^DJ^KC zNLfQTuRzfmH?0fS58*5S3WmRV8JQ`wX)4OLQ5Dwxm9-v6K({bydKqte-bXGENtk!`P){gVUveU zSQerYkwmjc##&qwQd^K%-xI87_T*AL6wi!6xJcTJiKEs;T^C3NgBjAyX0!PF-}nH4 zp&i(15Jdt(#v#XPZn>avS%O10AJ{M z5ZnJ=@ScSmpA-@6do`6;7fl3I54F}cZk2F{<8qmL^#bRMsN65WzkeeP1KUu4KZ&M?i^1oWWEoM+3%`Fl;t{%rr8 zsJxeor;t5A_xihdv)6Q-ARJ#+Nb+7)w}ne%A28DoL>PEhf7qS52Ncec5t=BW;qyi3 z9(Mt4!{q{d-=(xm7IMC(UGUxh9*cBQR_rXi8*kzrz6I~?ni43r0td}B41kF>XYxRN z-4rmE%zrPlBMc&F^BkCBk6)=g^t7-5IT<@r&P*#met=N!e{bfvSm3Syz-l$g?G5M| zu%dMgE%uin0*@RQ!~y>SAKqgrlLm&SE_pZ|9bV8J^S0X3_GdVoDWyQ*a!n4+zxqb{ zGjf+C-V?B4nP5<;;Yg7c`e57E?6;Gi5UnrDD#JZ2AoaQqz)_D+rh|xLG3y&e5)70^ zvN}xY^cSa>uZtg8u9%-Wahxu)X7w~r#RSFB0A8# zvoZM(>>?>=K>EO#AwFKIPUKvvIik5#VRcmSHtmDn$9^D5#qu-jtIAXM!6d{9@$ND; zp|~_~w2;h!(St}KMi%hAWXtkGhsVLS+zw?u~EdIWO%bYB!`hk?yC1YmW06zePCT-TTuB3v7W&i43+n=0$qVZL1 zUU^J1XLQVopkC!mzxM#4P0Ql2>ISn0OH3*bc{$0&5CxwqDNGY(2-=N-_!F-9_X!yY zzBgM^_2R+Dd|1+(bJ(5tHv6tR^3rb!Uuo{Qh@wDi`V@jeY9?8B-$o1A(gWGLs#`6o1GktFfP!B`gU11g^i`OGZ)XT zxSGohODx#3ky0p#fnDipi@Nl%RAcR_-{KpsDoszj{W_a2U1y)Q>e-s|aNUzw4wr(4 zXDYWNs5%L!^P83a5CSa*i&oaBQ%t$@R3iS zEZ0o7FFda_S#XN|VX(GQJi-|OYQWy6uVUE3sj0wgkCU5V)aeSYp zR|6mn!IvI^^@>P@jB@N;Wn_Gyec$&Q?y!EA<3i7z9pdQr)F94CV=+tL1Rm z++V*Lt%MjQHzt0ohEAka6Y3)qj3UusGmhE_uNy(kAqvm2P!!&f6o3Lhh3JRjt0GP7TMc;FtT_UI`@jI`*t)Jm`L=wBfw!{FG=^V&dXPE!z6OC6)x zwMEnXT4Oi-kSOM=AEWAoEdk>$kg?DPXLfH#otrcddVCpoVD^H)7`JINVZ?3TXQ=ay zZa@=I0<@1&5(;Dqa-N4y>0>H`7A~jSGCr@Tx!?A=%}FYm%)k=0oTlyxRHh>V7(vSM zJdz$v6{23r*aHvp^8Bz6;Uc@u)peCR!%f$sslk6%^hnoTlp! zfnb7b1dTPM09bAATsCv~rU1gnSFc>$9VXj$HsIBW*Y?cmbA0xXxYytd2nO7b@@SC1QFJ@XBDBGzW9h1Cyr!FOe#&h1-uz8& zbj^aGG(0|f2+vncd@gKO+h4?xb#gx47Hgi5Yws(zAWQ#|)A)KvWlYh+CfWOTDiOGN z37ktL`8%{|;D`Wrob-3b=5cZ}=|b7mWTY#1YJ;Mp9}0!GMc%!*^-qL(Ry1jKoyc8q ze5AI3-lMgy_J3XnwyDH9xY{d1K5(cL?FwDRad8s>0W@A}L#ogBaUxY4FR6MLzKrvlIaO?p({c zBI-5gz_JKb1+4S8wTI62PCn?*sh0#naO)ihm$23$Ytz=N!TmKvJWVcdX8f(=J7{Ve z$XDSsz2wf&*QO>_H3+KJ&=KDQ>PfhhDEhbE=i}ivWe-KCXxxD2nbo@9eB)DQu4o^O z?54#{vm4^r@9w6|FXZ)^Ch%<8;ZZ*mn_=T;)#iz7hPT=w*+rcUE_m?Sd;$53s>gSh zlYHk?HF$@f<_eAXxrp+k>u}Q`e|aV1zJv&B&cA9?zc`95+Ql-t?tFdv1&)2`_eH^A z4n`2n+v$uRhPi0=@y6}95rlHmNeX(V{{t{u^Ruh3r|+#^k+0JgqbmX~nL>%r5r+?i zAKE>BQ#}HE9`uMxY@wh6y?YkDuQYxo%&A-TDvmh(iG)ke7F?t%u0g#uhv+^mDEO%N zpp(0EiXI6$N$F;}o8s)pyI9=9eOT0t3RqgoV}~=_pb+#D?d<%vQPg7Ol4p&{p%y}oG=Hzx5l#xd_PaIu z7VtIcoba?gu}0K)yX_EnTCr5MJ!Uu*k1Qy1K#-w;ypJJlGFn>}XtufTqQQQbX;^p# z>>hfdPMma>Y2_P03RL}@pLN!`8O1Dvd*aF>S!RbNgoiKHjDp;(bY1n2MN24yLVTGf z_8+#-h0zJ?Gy*a->Jr(&=(}E4Fv-A#Ci`K?p)G}l4*$#j*?U+M>)mN*`$WY75kDP7 zwyD?qkshlrQ1AZzRG;`$(9}Ahqn61SxesH(K+>T#HgJ8UpIo6ftB?Qlv+#fSjC_nl zjL;C^Gzg#|IN(5FXqWCdL)C^S*h^A|T?DD(MK)bnH(+R+OHyd#`-WGc#^yk4MBz=$ N-miH7J_~_>{tu?)A{GDu literal 0 HcmV?d00001 From 59b6d37512259b779cc0644074f44a1ebbc1f42d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 5 Nov 2019 08:41:54 -0500 Subject: [PATCH 422/741] Fixed unit tests --- .../Cryptography/CertificateExtensionTests.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 4 +- .../DefaultSecureMimeContextTests.cs | 2 +- UnitTests/Cryptography/SecureMimeTests.cs | 11 ++++- .../Cryptography/X509CertificateChainTests.cs | 49 +++++++------------ .../Cryptography/X509CertificateStoreTests.cs | 6 +-- 6 files changed, 35 insertions(+), 39 deletions(-) diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs index 0b23a58ad8..f4b01ff88c 100644 --- a/UnitTests/Cryptography/CertificateExtensionTests.cs +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -75,7 +75,7 @@ X509KeyUsageFlags GetX509Certificate2KeyUsageFlags (X509Certificate2 certificate [Test] public void TestCertificateConversion () { - var fileNames = new string[] { "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; + var fileNames = new string[] { "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; var dataDir = Path.Combine ("..", "..", "TestData", "smime"); var parser = new X509CertificateParser (); diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 1a9a576c01..67ce188f13 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -71,7 +71,7 @@ static void AssertDefaultValues (CmsRecipient recipient, X509Certificate certifi [Test] public void TestDefaultValues () { - var path = Path.Combine ("..", "..", "TestData", "smime", "certificate-authority.crt"); + var path = Path.Combine ("..", "..", "TestData", "smime", "StartComCertificationAuthority.crt"); var recipient = new CmsRecipient (path); var certificate = recipient.Certificate; @@ -94,7 +94,7 @@ public void TestDefaultValues () [Test] public void TestCollectionAddRemove () { - var path = Path.Combine ("..", "..", "TestData", "smime", "certificate-authority.crt"); + var path = Path.Combine ("..", "..", "TestData", "smime", "StartComCertificationAuthority.crt"); var recipients = new CmsRecipientCollection (); var recipient = new CmsRecipient (path); var array = new CmsRecipient[1]; diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index e312740f7c..eefcc82915 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -45,7 +45,7 @@ namespace UnitTests.Cryptography { public class DefaultSecureMimeContextTests { static readonly string[] CertificateAuthorities = { - "certificate-authority.crt", "intermediate.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; static DefaultSecureMimeContextTests () diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 771d30a077..c28b415ec4 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -132,7 +132,16 @@ protected SecureMimeTestsBase () } } - static X509Certificate[] LoadPkcs12CertificateChain (string fileName, string password) + public static X509Certificate LoadCertificate (string path) + { + using (var stream = File.OpenRead (path)) { + var parser = new X509CertificateParser (); + + return parser.ReadCertificate (stream); + } + } + + public static X509Certificate[] LoadPkcs12CertificateChain (string fileName, string password) { using (var stream = File.OpenRead (fileName)) { var pkcs12 = new Pkcs12Store (stream, password.ToCharArray ()); diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index 8420fb095e..033952360a 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -41,7 +41,7 @@ namespace UnitTests.Cryptography { public class X509CertificateChainTests { static readonly string[] CertificateAuthorities = new string[] { - "certificate-authority.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; static string GetTestDataPath (string relative) @@ -49,15 +49,6 @@ static string GetTestDataPath (string relative) return Path.Combine ("..", "..", "TestData", "smime", relative); } - static X509Certificate LoadCertificate (string path) - { - using (var stream = File.OpenRead (path)) { - var parser = new X509CertificateParser (); - - return parser.ReadCertificate (stream); - } - } - [Test] public void TestArgumentExceptions () { @@ -89,7 +80,7 @@ public void TestAddRemoveRange () var chain = new X509CertificateChain (); foreach (var authority in CertificateAuthorities) { - var certificate = LoadCertificate (GetTestDataPath (authority)); + var certificate = SecureMimeTestsBase.LoadCertificate (GetTestDataPath (authority)); certificates.Add (certificate); } @@ -118,31 +109,27 @@ public void TestAddRemoveRange () [Test] public void TestBasicFunctionality () { + var certs = SecureMimeTestsBase.LoadPkcs12CertificateChain (GetTestDataPath ("smime.pfx"), "no.secret"); var chain = new X509CertificateChain (); - X509Certificate cert1, cert2, cert3; - - cert1 = LoadCertificate (GetTestDataPath ("StartComClass1PrimaryIntermediateClientCA.crt")); - cert2 = LoadCertificate (GetTestDataPath ("StartComCertificationAuthority.crt")); - cert3 = LoadCertificate (GetTestDataPath ("certificate-authority.crt")); Assert.IsFalse (chain.IsReadOnly); Assert.AreEqual (0, chain.Count, "Initial count"); - chain.Add (cert3); + chain.Add (certs[2]); Assert.AreEqual (1, chain.Count); - Assert.AreEqual (cert3, chain[0]); + Assert.AreEqual (certs[2], chain[0]); - chain.Insert (0, cert1); - chain.Insert (1, cert2); + chain.Insert (0, certs[0]); + chain.Insert (1, certs[1]); Assert.AreEqual (3, chain.Count); - Assert.AreEqual (cert1, chain[0]); - Assert.AreEqual (cert2, chain[1]); - Assert.AreEqual (cert3, chain[2]); + Assert.AreEqual (certs[0], chain[0]); + Assert.AreEqual (certs[1], chain[1]); + Assert.AreEqual (certs[2], chain[2]); - Assert.IsTrue (chain.Contains (cert2), "Contains"); - Assert.AreEqual (1, chain.IndexOf (cert2), "IndexOf"); + Assert.IsTrue (chain.Contains (certs[1]), "Contains"); + Assert.AreEqual (1, chain.IndexOf (certs[1]), "IndexOf"); var array = new X509Certificate[chain.Count]; chain.CopyTo (array, 0); @@ -155,20 +142,20 @@ public void TestBasicFunctionality () Assert.AreEqual (array.Length, chain.Count); - Assert.IsTrue (chain.Remove (cert3)); + Assert.IsTrue (chain.Remove (certs[2])); Assert.AreEqual (2, chain.Count); - Assert.AreEqual (cert1, chain[0]); - Assert.AreEqual (cert2, chain[1]); + Assert.AreEqual (certs[0], chain[0]); + Assert.AreEqual (certs[1], chain[1]); chain.RemoveAt (0); Assert.AreEqual (1, chain.Count); - Assert.AreEqual (cert2, chain[0]); + Assert.AreEqual (certs[1], chain[0]); - chain[0] = cert3; + chain[0] = certs[2]; Assert.AreEqual (1, chain.Count); - Assert.AreEqual (cert3, chain[0]); + Assert.AreEqual (certs[2], chain[0]); } } } diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index 83afb85342..0fbaaa82b4 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -40,7 +40,7 @@ namespace UnitTests.Cryptography { public class X509CertificateStoreTests { static readonly string[] CertificateAuthorities = new string[] { - "certificate-authority.crt", "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; static string GetTestDataPath (string relative) @@ -153,7 +153,7 @@ public void TestImportData () var count = store.Certificates.Count (); Assert.AreEqual (1, count, "Unexpected number of certificates imported."); - Assert.AreEqual ("root@example.com", certificate.GetSubjectEmailAddress (), "Unexpected email address for certificate."); + Assert.AreEqual ("StartCom Certification Authority", certificate.GetCommonName (), "Unexpected CN for certificate."); } [Test] @@ -166,7 +166,7 @@ public void TestImportSingleCertificate () var count = store.Certificates.Count (); Assert.AreEqual (1, count, "Unexpected number of certificates imported."); - Assert.AreEqual ("root@example.com", certificate.GetSubjectEmailAddress (), "Unexpected email address for certificate."); + Assert.AreEqual ("StartCom Certification Authority", certificate.GetCommonName (), "Unexpected CN for certificate."); } [Test] From ac9dce130be10fca2257f82b6ed1910a358c1c9d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 5 Nov 2019 10:37:22 -0500 Subject: [PATCH 423/741] Go back to using X509CertStoreSelector.Certificate when building a cert chain --- .../BouncyCastleSecureMimeContext.cs | 14 +++++++------ .../Cryptography/DefaultSecureMimeContext.cs | 21 ++++++++++--------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 0f3ed3d6cb..cdc9b887f9 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -438,15 +438,15 @@ X509Certificate GetCertificate (IX509Store store, SignerID signer) protected IList BuildCertificateChain (X509Certificate certificate) { var selector = new X509CertStoreSelector (); - selector.Subject = certificate.SubjectDN; + selector.Certificate = certificate; var intermediates = new X509CertificateStore (); intermediates.Add (certificate); var parameters = new PkixBuilderParameters (GetTrustedAnchors (), selector); parameters.ValidityModel = PkixParameters.PkixValidityModel; - parameters.AddStore (GetIntermediateCertificates ()); parameters.AddStore (intermediates); + parameters.AddStore (GetIntermediateCertificates ()); parameters.IsRevocationEnabled = false; parameters.Date = new DateTimeObject (DateTime.UtcNow); @@ -464,19 +464,21 @@ protected IList BuildCertificateChain (X509Certificate certific PkixCertPath BuildCertPath (HashSet anchors, IX509Store certificates, IX509Store crls, X509Certificate certificate, DateTime signingTime) { var selector = new X509CertStoreSelector (); - selector.Subject = certificate.SubjectDN; + selector.Certificate = certificate; var intermediates = new X509CertificateStore (); + intermediates.Add (certificate); + foreach (X509Certificate cert in certificates.GetMatches (null)) intermediates.Add (cert); - intermediates.Add (certificate); var parameters = new PkixBuilderParameters (anchors, selector); - parameters.AddStore (GetIntermediateCertificates ()); parameters.AddStore (intermediates); - parameters.AddStore (GetCertificateRevocationLists ()); parameters.AddStore (crls); + parameters.AddStore (GetIntermediateCertificates ()); + parameters.AddStore (GetCertificateRevocationLists ()); + parameters.ValidityModel = PkixParameters.PkixValidityModel; parameters.IsRevocationEnabled = false; diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index 9888c00ca8..f5df288a56 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -309,19 +309,20 @@ protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnch /// The intermediate certificates. protected override IX509Store GetIntermediateCertificates () { - var intermediates = new X509CertificateStore (); - var selector = new X509CertStoreSelector (); - var keyUsage = new bool[9]; + //var intermediates = new X509CertificateStore (); + //var selector = new X509CertStoreSelector (); + //var keyUsage = new bool[9]; - keyUsage[(int) X509KeyUsageBits.KeyCertSign] = true; - selector.KeyUsage = keyUsage; + //keyUsage[(int) X509KeyUsageBits.KeyCertSign] = true; + //selector.KeyUsage = keyUsage; - foreach (var record in dbase.Find (selector, false, X509CertificateRecordFields.Certificate)) { - if (!record.Certificate.IsSelfSigned ()) - intermediates.Add (record.Certificate); - } + //foreach (var record in dbase.Find (selector, false, X509CertificateRecordFields.Certificate)) { + // if (!record.Certificate.IsSelfSigned ()) + // intermediates.Add (record.Certificate); + //} - return intermediates; + //return intermediates; + return dbase; } /// From 8bd40c0362f4275254c7292e494a82c89e2393e3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 5 Nov 2019 21:28:37 -0500 Subject: [PATCH 424/741] Improved SqlCertificateDatabase.Find() by using more IX509Selector properties --- .../Cryptography/SqlCertificateDatabase.cs | 137 +++++++++++++----- .../Cryptography/X509CertificateDatabase.cs | 10 +- TODO.md | 5 + 3 files changed, 109 insertions(+), 43 deletions(-) diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index bdca501fd2..c0a5e713fb 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -136,6 +136,21 @@ void CreateCrlsTable () CreateIndex (connection, "CRLS", new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); } + static StringBuilder CreateSelectQuery (X509CertificateRecordFields fields) + { + var query = new StringBuilder ("SELECT "); + var columns = GetColumnNames (fields); + + for (int i = 0; i < columns.Length; i++) { + if (i > 0) + query = query.Append (", "); + + query = query.Append (columns[i]); + } + + return query.Append (" FROM CERTIFICATES"); + } + /// /// Gets the database command to select the record matching the specified certificate. /// @@ -147,23 +162,26 @@ void CreateCrlsTable () /// The fields to return. protected override DbCommand GetSelectCommand (X509Certificate certificate, X509CertificateRecordFields fields) { - var query = "SELECT " + string.Join (", ", GetColumnNames (fields)) + " FROM CERTIFICATES "; var fingerprint = certificate.GetFingerprint ().ToLowerInvariant (); var serialNumber = certificate.SerialNumber.ToString (); var issuerName = certificate.IssuerDN.ToString (); var command = connection.CreateCommand (); + var query = CreateSelectQuery (fields); - command.CommandText = query + "WHERE ISSUERNAME = @ISSUERNAME AND SERIALNUMBER = @SERIALNUMBER AND FINGERPRINT = @FINGERPRINT LIMIT 1"; + // FIXME: Is this really the best way to query for an exact match of a certificate? + query = query.Append (" WHERE ISSUERNAME = @ISSUERNAME AND SERIALNUMBER = @SERIALNUMBER AND FINGERPRINT = @FINGERPRINT LIMIT 1"); command.AddParameterWithValue ("@ISSUERNAME", issuerName); command.AddParameterWithValue ("@SERIALNUMBER", serialNumber); command.AddParameterWithValue ("@FINGERPRINT", fingerprint); + + command.CommandText = query.ToString (); command.CommandType = CommandType.Text; return command; } /// - /// Gets the database command to select the certificate records for the specified mailbox. + /// Get the database command to select the certificate records for the specified mailbox. /// /// /// Gets the database command to select the certificate records for the specified mailbox. @@ -175,110 +193,153 @@ protected override DbCommand GetSelectCommand (X509Certificate certificate, X509 /// The fields to return. protected override DbCommand GetSelectCommand (MailboxAddress mailbox, DateTime now, bool requirePrivateKey, X509CertificateRecordFields fields) { - var query = "SELECT " + string.Join (", ", GetColumnNames (fields)) + " FROM CERTIFICATES"; var secure = mailbox as SecureMailboxAddress; var command = connection.CreateCommand (); - var constraints = " WHERE "; + var query = CreateSelectQuery (fields); - constraints += "BASICCONSTRAINTS = @BASICCONSTRAINTS "; + query = query.Append (" WHERE BASICCONSTRAINTS = @BASICCONSTRAINTS "); command.AddParameterWithValue ("@BASICCONSTRAINTS", -1); if (secure != null && !string.IsNullOrEmpty (secure.Fingerprint)) { if (secure.Fingerprint.Length < 40) { - constraints += "AND FINGERPRINT LIKE @FINGERPRINT "; command.AddParameterWithValue ("@FINGERPRINT", secure.Fingerprint.ToLowerInvariant () + "%"); + query = query.Append ("AND FINGERPRINT LIKE @FINGERPRINT "); } else { - constraints += "AND FINGERPRINT = @FINGERPRINT "; command.AddParameterWithValue ("@FINGERPRINT", secure.Fingerprint.ToLowerInvariant ()); + query = query.Append ("AND FINGERPRINT = @FINGERPRINT "); } } else { - constraints += "AND SUBJECTEMAIL = @SUBJECTEMAIL "; command.AddParameterWithValue ("@SUBJECTEMAIL", mailbox.Address.ToLowerInvariant ()); + query = query.Append ("AND SUBJECTEMAIL = @SUBJECTEMAIL "); } - constraints += "AND NOTBEFORE < @NOW AND NOTAFTER > @NOW "; + query = query.Append ("AND NOTBEFORE < @NOW AND NOTAFTER > @NOW"); command.AddParameterWithValue ("@NOW", now.ToUniversalTime ()); if (requirePrivateKey) - constraints += "AND PRIVATEKEY IS NOT NULL"; + query = query.Append (" AND PRIVATEKEY IS NOT NULL"); - command.CommandText = query + constraints; + command.CommandText = query.ToString (); command.CommandType = CommandType.Text; return command; } /// - /// Gets the database command to select the certificate records for the specified mailbox. + /// Get the database command to select the requested certificate records. /// /// - /// Gets the database command to select the certificate records for the specified mailbox. + /// Gets the database command to select the requested certificate records. /// /// The database command. - /// Selector. - /// If set to true trusted only. - /// true + /// The certificate selector. + /// true if only trusted certificates should be matched; otherwise, false. + /// true if the certificate must have a private key; otherwise, false. /// The fields to return. protected override DbCommand GetSelectCommand (IX509Selector selector, bool trustedOnly, bool requirePrivateKey, X509CertificateRecordFields fields) { - var query = "SELECT " + string.Join (", ", GetColumnNames (fields)) + " FROM CERTIFICATES"; var match = selector as X509CertStoreSelector; var command = connection.CreateCommand (); - var constraints = " WHERE "; + var query = CreateSelectQuery (fields); + int baseQueryLength = query.Length; + query = query.Append (" WHERE "); + + // FIXME: We could create an X509CertificateDatabaseSelector subclass of X509CertStoreSelector that + // adds properties like bool Trusted, bool Anchor, and bool HasPrivateKey ? Then we could drop the + // bool method arguments... if (trustedOnly) { command.AddParameterWithValue ("@TRUSTED", true); - constraints += "TRUSTED = @TRUSTED"; + query = query.Append ("TRUSTED = @TRUSTED"); } + // FIXME: This query is used to get the TrustedAnchors in DefaultSecureMimeContext. If the database + // had an ANCHOR (or ROOT?) column, that would likely improve performance a bit because we would + // protentially reduce the number of certificates we load. + if (match != null) { - if (match.BasicConstraints != -1) { + if (match.BasicConstraints >= 0 || match.BasicConstraints == -2) { if (command.Parameters.Count > 0) - constraints += " AND "; + query = query.Append (" AND "); + + if (match.BasicConstraints == -2) { + command.AddParameterWithValue ("@BASICCONSTRAINTS", -1); + query = query.Append ("BASICCONSTRAINTS = @BASICCONSTRAINTS"); + } else { + command.AddParameterWithValue ("@BASICCONSTRAINTS", match.BasicConstraints); + query = query.Append ("BASICCONSTRAINTS >= @BASICCONSTRAINTS"); + } + } - command.AddParameterWithValue ("@BASICCONSTRAINTS", match.BasicConstraints); - constraints += "BASICCONSTRAINTS = @BASICCONSTRAINTS"; + if (match.CertificateValid != null) { + if (command.Parameters.Count > 0) + query = query.Append (" AND "); + + command.AddParameterWithValue ("@DATETIME", match.CertificateValid.Value.ToUniversalTime ()); + query = query.Append ("NOTBEFORE < @DATETIME AND NOTAFTER > @DATETIME"); } - if (match.Issuer != null) { + if (match.Issuer != null || match.Certificate != null) { + // Note: GetSelectCommand (X509Certificate certificate, X509CertificateRecordFields fields) + // queries for ISSUERNAME, SERIALNUMBER, and FINGERPRINT so we'll do the same. + var issuer = match.Issuer ?? match.Certificate.IssuerDN; + if (command.Parameters.Count > 0) - constraints += " AND "; + query = query.Append (" AND "); - command.AddParameterWithValue ("@ISSUERNAME", match.Issuer.ToString ()); - constraints += "ISSUERNAME = @ISSUERNAME"; + command.AddParameterWithValue ("@ISSUERNAME", issuer.ToString ()); + query = query.Append ("ISSUERNAME = @ISSUERNAME"); } - if (match.SerialNumber != null) { + if (match.SerialNumber != null || match.Certificate != null) { + // Note: GetSelectCommand (X509Certificate certificate, X509CertificateRecordFields fields) + // queries for ISSUERNAME, SERIALNUMBER, and FINGERPRINT so we'll do the same. + var serialNumber = match.SerialNumber ?? match.Certificate.SerialNumber; + + if (command.Parameters.Count > 0) + query = query.Append (" AND "); + + command.AddParameterWithValue ("@SERIALNUMBER", serialNumber.ToString ()); + query = query.Append ("SERIALNUMBER = @SERIALNUMBER"); + } + + if (match.Certificate != null) { + // Note: GetSelectCommand (X509Certificate certificate, X509CertificateRecordFields fields) + // queries for ISSUERNAME, SERIALNUMBER, and FINGERPRINT so we'll do the same. if (command.Parameters.Count > 0) - constraints += " AND "; + query = query.Append (" AND "); - command.AddParameterWithValue ("@SERIALNUMBER", match.SerialNumber.ToString ()); - constraints += "SERIALNUMBER = @SERIALNUMBER"; + command.AddParameterWithValue ("@FINGERPRINT", match.Certificate.GetFingerprint ()); + query = query.Append ("FINGERPRINT = @FINGERPRINT"); } + // FIXME: maybe the database should have a SUBJECTNAME column as well? Then we could match against + // selector.SubjectDN. Plus it might be nice to have when querying the database manually to see + // what's there. + if (match.KeyUsage != null) { var flags = BouncyCastleCertificateExtensions.GetKeyUsageFlags (match.KeyUsage); if (flags != X509KeyUsageFlags.None) { if (command.Parameters.Count > 0) - constraints += " AND "; + query = query.Append (" AND "); command.AddParameterWithValue ("@FLAGS", (int) flags); - constraints += "(KEYUSAGE == 0 OR (KEYUSAGE & @FLAGS) == @FLAGS)"; + query = query.Append ("(KEYUSAGE = 0 OR (KEYUSAGE & @FLAGS) = @FLAGS)"); } } } if (requirePrivateKey) { if (command.Parameters.Count > 0) - constraints += " AND "; + query = query.Append (" AND "); - constraints += "PRIVATEKEY IS NOT NULL"; + query = query.Append ("PRIVATEKEY IS NOT NULL"); } else if (command.Parameters.Count == 0) { - constraints = string.Empty; + query.Length = baseQueryLength; } - command.CommandText = query + constraints; + command.CommandText = query.ToString (); command.CommandType = CommandType.Text; return command; diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index cee133aeb9..665ee0d9fb 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -373,7 +373,7 @@ protected static string[] GetColumnNames (X509CertificateRecordFields fields) /// The database command. /// The mailbox. /// The date and time for which the certificate should be valid. - /// true if the certificate must have a private key. + /// true if the certificate must have a private key; otherwise, false. /// The fields to return. protected abstract DbCommand GetSelectCommand (MailboxAddress mailbox, DateTime now, bool requirePrivateKey, X509CertificateRecordFields fields); @@ -384,9 +384,9 @@ protected static string[] GetColumnNames (X509CertificateRecordFields fields) /// Gets the database command to select certificate records matching the specified selector. /// /// The database command. - /// Selector. - /// true if only trusted certificates should be matched. - /// true if the certificate must have a private key. + /// The certificate selector. + /// true if only trusted certificates should be matched; otherwise, false. + /// true if the certificate must have a private key; otherwise, false. /// The fields to return. protected abstract DbCommand GetSelectCommand (IX509Selector selector, bool trustedOnly, bool requirePrivateKey, X509CertificateRecordFields fields); @@ -905,7 +905,7 @@ public void Update (X509CrlRecord record) /// /// Gets a certificate revocation list store. /// - /// A certificate recovation list store. + /// A certificate revocation list store. public IX509Store GetCrlStore () { var crls = new List (); diff --git a/TODO.md b/TODO.md index 4322c74c22..06d7bb101a 100644 --- a/TODO.md +++ b/TODO.md @@ -10,6 +10,11 @@ * S/MIME * BouncyCastleSecureMimeContext * Add support for downloading CRLs via FTP? Is this needed or at all common? + * Add an ANCHOR/ROOT table column to the SQL database to optimize searches + for Trusted Anchors. + * Add a SUBJECTNAME table column to the SQL database? + * Add a RECORDVERSION table column to the SQL database so we can add columns + in the future and work around gaps in the row data? ### Pie-in-the-sky Ideas From baa4eed9202ae406c5a664fd70c6658e2f513676 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 6 Nov 2019 09:59:49 -0500 Subject: [PATCH 425/741] Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens Fixes issue #518 --- MimeKit/Cryptography/AuthenticationResults.cs | 24 ++++++++- .../AuthenticationResultsTests.cs | 52 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 6a63ce60ad..d78b527b89 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -269,6 +269,28 @@ static bool SkipDomain (byte[] text, ref int index, int endIndex) return false; } + // pvalue := [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) [CFWS] + // value := token / quoted-string + // token := 1* + // tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> / "/" / "[" / "]" / "?" / "=" + static bool IsPValueToken (byte c) + { + // Note: We're allowing '/' because it is a base64 character + // + // See https://github.com/jstedfast/MimeKit/issues/518 for details. + return c.IsToken () || c == (byte) '/'; + } + + static bool SkipPValueToken (byte[] text, ref int index, int endIndex) + { + int start = index; + + while (index < endIndex && IsPValueToken (text[index])) + index++; + + return index > start; + } + static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out bool quoted) { // pvalue := [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) [CFWS] @@ -297,7 +319,7 @@ static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out boo return true; } - if (!ParseUtils.SkipToken (text, ref index, endIndex)) + if (!SkipPValueToken (text, ref index, endIndex)) return false; if (index < endIndex) { diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index da969a5454..b48588b8c8 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -728,6 +728,58 @@ public void TestParseHeavilyCommentedExample () Assert.AreEqual (expected, encoded.ToString ()); } + // Tests work-around for https://github.com/jstedfast/MimeKit/issues/518 + [Test] + public void TestParseMethodPropertyValueWithSlash () + { + const string input = "i=2; test.com; dkim=pass header.d=test.com header.s=selector1 header.b=Iww3/TIUS; dmarc=pass (policy=reject) header.from=test.com; spf=pass (test.com: domain of no-reply@test.com designates 1.1.1.1 as permitted sender) smtp.mailfrom=no-reply@test.com"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("test.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("dkim", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (3, authres.Results[0].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("d", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("test.com", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("header", authres.Results[0].Properties[1].PropertyType); + Assert.AreEqual ("s", authres.Results[0].Properties[1].Property); + Assert.AreEqual ("selector1", authres.Results[0].Properties[1].Value); + Assert.AreEqual ("header", authres.Results[0].Properties[2].PropertyType); + Assert.AreEqual ("b", authres.Results[0].Properties[2].Property); + Assert.AreEqual ("Iww3/TIUS", authres.Results[0].Properties[2].Value); + + Assert.AreEqual ("dmarc", authres.Results[1].Method); + Assert.AreEqual ("pass", authres.Results[1].Result); + Assert.AreEqual ("policy=reject", authres.Results[1].ResultComment); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "dmarc properties"); + Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("test.com", authres.Results[1].Properties[0].Value); + + Assert.AreEqual ("spf", authres.Results[2].Method); + Assert.AreEqual ("pass", authres.Results[2].Result); + Assert.AreEqual ("test.com: domain of no-reply@test.com designates 1.1.1.1 as permitted sender", authres.Results[2].ResultComment); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "spf properties"); + Assert.AreEqual ("smtp", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("no-reply@test.com", authres.Results[2].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + + const string expected = " i=2; test.com;\n\tdkim=pass header.d=test.com header.s=selector1 header.b=Iww3/TIUS;\n\tdmarc=pass (policy=reject) header.from=test.com; spf=pass\n\t(test.com: domain of no-reply@test.com designates 1.1.1.1 as permitted sender)\n\tsmtp.mailfrom=no-reply@test.com\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + static void AssertParseFailure (string input, int tokenIndex, int errorIndex) { var buffer = Encoding.ASCII.GetBytes (input); From efd5fca26004c69150f3789d376f0303d60d33bf Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 10 Nov 2019 11:34:19 -0500 Subject: [PATCH 426/741] bumped version to 2.4.1 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 11 +++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 14 +++++--------- nuget/MimeKitLite.nuspec | 10 +++------- .../DkimVerifier/DkimVerifier/DkimVerifier.csproj | 2 +- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android.csproj | 4 ++-- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- .../MessageReader.iOS/packages.config | 2 +- .../MessageReader/MessageReader.csproj | 2 +- .../MessageReader/MessageReader/packages.config | 2 +- 16 files changed, 35 insertions(+), 32 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index b197acac1e..701f13ee49 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.4.0 + 2.4.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index c023a22d7d..85952195b3 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.4.0 + 2.4.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 3f1eb77184..ee01d4fbe6 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.4.0.0")] -[assembly: AssemblyFileVersion ("2.4.0.0")] +[assembly: AssemblyInformationalVersion ("2.4.1.0")] +[assembly: AssemblyFileVersion ("2.4.1.0")] [assembly: AssemblyVersion ("2.4.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 28ee4d32c4..18efa9396b 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,16 @@ # Release Notes +### MimeKit 2.4.1 (2019-11-10) + +* Don't use PublicSign on non-Windows NT machines when building. + (issue [#516](https://github.com/jstedfast/MimeKit/issues/516)) +* Improved BouncyCastleSecureMimeContext logic for building certificate chains so that + certificate chains are included in the S/MIME signature. + (issue [#515](https://github.com/jstedfast/MimeKit/issues/515)) +* Improved SqlCertificateDatabase.Find() by using more IX509Selector properties. +* Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens. + (issue [#518](https://github.com/jstedfast/MimeKit/issues/518)) + ### MimeKit 2.4.0 (2019-11-02) * Added the `text/csv` mime-type to the `MimeTypes` mapping table for files with a .csv extension. diff --git a/appveyor.yml b/appveyor.yml index 5073ca3001..1ab383d92a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.4.0.{build} +version: 2.4.1.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c4c86f48ae..5aed82066c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.4.0$(Rev:.r) +name: 2.4.1$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 288e11508c..6f285a13f4 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.4.0 + 2.4.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,14 +26,10 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Added the `text/csv` mime-type to the `MimeTypes` mapping table for files with a .csv extension. -* Expanded the .NETStandard API to match the .NET 4.5 API, so .NETStandard is now complete. -* Dropped support for .NETPortable and WindowsPhone/Universal v8.1. -* Added a net48 assembly to the NuGet package. -* Improved HTML tokenizer performance. -* Fixed X509Crl.IsDelta for CRLs without extensions. (issue #513) -* Added support for `message/global-delivery-status`, `message/global-disposition-notification`, and `message/global-headers` to `MimeParser`. (issue #514) -* Fixed S/MIME signatures generated by a TemporarySecureMimeContext to include the certificate chain. (issue #515) +* Don't use PublicSign on non-Windows NT machines when building. (issue #516) +* Improved BouncyCastleSecureMimeContext logic for building certificate chains so that certificate chains are included in the S/MIME signature. (issue #515) +* Improved SqlCertificateDatabase.Find() by using more IX509Selector properties. +* Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens. (issue #518) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index f2a7f723a0..c7539e4477 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.4.0 + 2.4.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,12 +26,8 @@ An Open Source library for creating and parsing MIME messages. -* Added the `text/csv` mime-type to the `MimeTypes` mapping table for files with a .csv extension. -* Expanded the .NETStandard API to match the .NET 4.5 API, so .NETStandard is now complete. -* Dropped support for .NETPortable and WindowsPhone/Universal v8.1. -* Added a net48 assembly to the NuGet package. -* Improved HTML tokenizer performance. -* Added support for `message/global-delivery-status`, `message/global-disposition-notification`, and `message/global-headers` to `MimeParser`. (issue #514) +* Don't use PublicSign on non-Windows NT machines when building. (issue #516) +* Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens. (issue #518) Xamarin Inc. en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index d172b0be3a..084addc0c0 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -33,7 +33,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.4.0\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.4.1\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index c75b60990d..dac39db0b5 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 3f88f7a0b5..1509119b2d 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.4.0\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.4.1\lib\monoandroid\BouncyCastle.dll - ..\packages\MimeKit.2.4.0\lib\monoandroid\MimeKit.dll + ..\packages\MimeKit.2.4.1\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 12d0f78769..3a58077bf2 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index cb4ec4b2ca..1afdd2209e 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.4.0\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.4.1\lib\xamarinios\BouncyCastle.dll - ..\packages\MimeKit.2.4.0\lib\xamarinios\MimeKit.dll + ..\packages\MimeKit.2.4.1\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 84c843655d..774e131250 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 3d4f50b34c..1e9ad0c61f 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -36,7 +36,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\MimeKit.2.4.0\lib\net45\MimeKit.dll + ..\packages\MimeKit.2.4.1\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index d57c532663..51e1428876 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + From d055147c7bd6df0d8007ae39d0be4ec366dcc46d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 Nov 2019 19:44:59 -0500 Subject: [PATCH 427/741] Fixed message reserialization after prepending headers Fixes issue #524 --- MimeKit/MimeMessage.cs | 11 +++++++++++ UnitTests/MimeMessageTests.cs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index f4eaf74f4d..31ad90254a 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -2143,6 +2143,17 @@ IEnumerable
MergeHeaders () { int mesgIndex = 0, bodyIndex = 0; + // write all of the prepended message headers first + while (mesgIndex < Headers.Count) { + var mesgHeader = Headers[mesgIndex]; + if (mesgHeader.Offset.HasValue) + break; + + yield return mesgHeader; + mesgIndex++; + } + + // now merge the message and body headers as they appeared in the raw message while (mesgIndex < Headers.Count && bodyIndex < Body.Headers.Count) { var bodyHeader = Body.Headers[bodyIndex]; if (!bodyHeader.Offset.HasValue) diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 6fe9dc7353..c5ae4ed8c7 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -104,6 +104,40 @@ public void TestArgumentExceptions () Assert.Throws (() => MimeMessage.CreateFromMailMessage (null)); } + [Test] + public void TestPrependHeader () + { + string rawMessageText = @"Date: Fri, 22 Jan 2016 8:44:05 -0500 (EST) +From: MimeKit Unit Tests +To: MimeKit Unit Tests +Subject: This is a test off prepending headers. +Message-Id: +MIME-Version: 1.0 +Content-Type: text/plain + +This is the message body. +".Replace ("\r\n", "\n"); + string expected = "X-Prepended: This is the prepended header\n" + rawMessageText; + + using (var source = new MemoryStream (Encoding.UTF8.GetBytes (rawMessageText))) { + var parser = new MimeParser (source, MimeFormat.Default); + var message = parser.ParseMessage (); + + message.Headers.Insert (0, new Header ("X-Prepended", "This is the prepended header")); + + using (var serialized = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + message.WriteTo (options, serialized); + + var result = Encoding.UTF8.GetString (serialized.ToArray ()); + + Assert.AreEqual (expected, result, "Reserialized message is not identical to the original."); + } + } + } + [Test] public async Task TestReserialization () { From 3270de2f2ea928a733ace78e9fb0f31119e721c2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Nov 2019 10:59:05 -0500 Subject: [PATCH 428/741] Allow empty property values in Authentication-Results header values Fixes issue #527 --- MimeKit/Cryptography/AuthenticationResults.cs | 16 +- .../AuthenticationResultsTests.cs | 149 ++++++++++++++++-- 2 files changed, 138 insertions(+), 27 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index d78b527b89..c7bb3a8fa7 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -281,14 +281,10 @@ static bool IsPValueToken (byte c) return c.IsToken () || c == (byte) '/'; } - static bool SkipPValueToken (byte[] text, ref int index, int endIndex) + static void SkipPValueToken (byte[] text, ref int index, int endIndex) { - int start = index; - while (index < endIndex && IsPValueToken (text[index])) index++; - - return index > start; } static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out bool quoted) @@ -319,8 +315,7 @@ static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out boo return true; } - if (!SkipPValueToken (text, ref index, endIndex)) - return false; + SkipPValueToken (text, ref index, endIndex); if (index < endIndex) { if (text[index] == (byte) '@') { @@ -648,13 +643,6 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; - if (index >= endIndex) { - if (throwOnError) - throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); - - return false; - } - int valueIndex = index; if (!SkipPropertyValue (text, ref index, endIndex, out quoted)) { diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index b48588b8c8..0498094ee7 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -300,15 +300,40 @@ public void TestParseAuthServIdWithVersionAndSemicolon () [Test] public void TestParseNoAuthServId () { - var buffer = Encoding.ASCII.GetBytes ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; recevingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=none header.from=domain.com;"); + const string input = "spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; dkim=pass (signature was verified) header.d=domain.com; dmarc=bestguesspass header.from=domain.com"; + var buffer = Encoding.ASCII.GetBytes (input); AuthenticationResults authres; Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); Assert.IsNull (authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("fail", authres.Results[0].Result); + Assert.AreEqual ("sender IP is 1.1.1.1", authres.Results[0].ResultComment); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "spf properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("eu-west-1.amazonses.com", authres.Results[0].Properties[0].Value); + + Assert.AreEqual ("dkim", authres.Results[1].Method); + Assert.AreEqual ("pass", authres.Results[1].Result); + Assert.AreEqual ("signature was verified", authres.Results[1].ResultComment); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("d", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("domain.com", authres.Results[1].Properties[0].Value); - Assert.AreEqual ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; recevingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=\"none\" header.from=domain.com", authres.ToString ()); + Assert.AreEqual ("dmarc", authres.Results[2].Method); + Assert.AreEqual ("bestguesspass", authres.Results[2].Result); + Assert.AreEqual (null, authres.Results[2].ResultComment); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "dmarc properties"); + Assert.AreEqual ("header", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("domain.com", authres.Results[2].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); - const string expected = " spf=fail (sender IP is 1.1.1.1)\n\tsmtp.mailfrom=eu-west-1.amazonses.com; recevingdomain.com;\n\tdkim=pass (signature was verified) header.d=domain.com;domain1.com;\n\tdmarc=bestguesspass action=\"none\" header.from=domain.com\n"; + const string expected = "\n\tspf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com;\n\tdkim=pass (signature was verified) header.d=domain.com;\n\tdmarc=bestguesspass header.from=domain.com\n"; var encoded = new StringBuilder (); var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Unix; @@ -780,6 +805,101 @@ public void TestParseMethodPropertyValueWithSlash () Assert.AreEqual (expected, encoded.ToString ()); } + // Tests work-around for https://github.com/jstedfast/MimeKit/issues/490 + [Test] + public void TestParseOffice365RandomDomainTokensAndAction () + { + var buffer = Encoding.ASCII.GetBytes ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; receivingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=none header.from=domain.com;"); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.IsNull (authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("fail", authres.Results[0].Result); + Assert.AreEqual ("sender IP is 1.1.1.1", authres.Results[0].ResultComment); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "spf properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("eu-west-1.amazonses.com; receivingdomain.com", authres.Results[0].Properties[0].Value); + + Assert.AreEqual ("dkim", authres.Results[1].Method); + Assert.AreEqual ("pass", authres.Results[1].Result); + Assert.AreEqual ("signature was verified", authres.Results[1].ResultComment); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("d", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("domain.com;domain1.com", authres.Results[1].Properties[0].Value); + + Assert.AreEqual ("dmarc", authres.Results[2].Method); + Assert.AreEqual ("bestguesspass", authres.Results[2].Result); + Assert.AreEqual (null, authres.Results[2].ResultComment); + Assert.AreEqual ("none", authres.Results[2].Action); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "dmarc properties"); + Assert.AreEqual ("header", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("domain.com", authres.Results[2].Properties[0].Value); + + Assert.AreEqual ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; receivingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=\"none\" header.from=domain.com", authres.ToString ()); + + const string expected = " spf=fail (sender IP is 1.1.1.1)\n\tsmtp.mailfrom=eu-west-1.amazonses.com; receivingdomain.com;\n\tdkim=pass (signature was verified) header.d=domain.com;domain1.com;\n\tdmarc=bestguesspass action=\"none\" header.from=domain.com\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + + // Tests work-around for https://github.com/jstedfast/MimeKit/issues/527 + [Test] + public void TestParseOffice365RandomDomainTokensAndEmptyPropertyValue () + { + const string input = "spf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru; mydomain.com; dkim=none (message not signed) header.d=none;mydomain.com; dmarc=none action=none header.from=;"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual (null, authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("spf", authres.Results[0].Method); + Assert.AreEqual ("temperror", authres.Results[0].Result); + Assert.AreEqual ("sender IP is 1.1.1.1", authres.Results[0].ResultComment); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "spf properties"); + Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("helo", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("tes.test.ru; mydomain.com", authres.Results[0].Properties[0].Value); + + Assert.AreEqual ("dkim", authres.Results[1].Method); + Assert.AreEqual ("none", authres.Results[1].Result); + Assert.AreEqual ("message not signed", authres.Results[1].ResultComment); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("d", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("none;mydomain.com", authres.Results[1].Properties[0].Value); + + Assert.AreEqual ("dmarc", authres.Results[2].Method); + Assert.AreEqual ("none", authres.Results[2].Result); + Assert.AreEqual (null, authres.Results[2].ResultComment); + Assert.AreEqual ("none", authres.Results[2].Action); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "dmarc properties"); + Assert.AreEqual ("header", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("", authres.Results[2].Properties[0].Value); + + Assert.AreEqual ("spf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru; mydomain.com; dkim=none (message not signed) header.d=none;mydomain.com; dmarc=none action=\"none\" header.from=", authres.ToString ()); + + const string expected = "\n\tspf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru; mydomain.com;\n\tdkim=none (message not signed) header.d=none;mydomain.com;\n\tdmarc=none action=\"none\" header.from=\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + static void AssertParseFailure (string input, int tokenIndex, int errorIndex) { var buffer = Encoding.ASCII.GetBytes (input); @@ -1115,17 +1235,20 @@ public void TestParseFailureIncompleteProperty3 () AssertParseFailure ("authserv-id; method=pass ptype.prop", 25, 35); } - [Test] - public void TestParseFailureIncompleteProperty4 () - { - AssertParseFailure ("authserv-id; method=pass ptype.prop=", 25, 36); - } + // Note: TestParseFailureIncompleteProperty4 and 5 are commented out because of + // https://github.com/jstedfast/MimeKit/issues/527 where we have "header.from=;" - [Test] - public void TestParseFailureIncompleteProperty5 () - { - AssertParseFailure ("authserv-id; method=pass ptype.prop=;", 25, 36); - } + //[Test] + //public void TestParseFailureIncompleteProperty4 () + //{ + // AssertParseFailure ("authserv-id; method=pass ptype.prop=", 25, 36); + //} + + //[Test] + //public void TestParseFailureIncompleteProperty5 () + //{ + // AssertParseFailure ("authserv-id; method=pass ptype.prop=;", 25, 36); + //} [Test] public void TestParseFailureInvalidProperty1 () From fdf63a798d72d951bb07ad79d1e80aa32b5906dd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Nov 2019 13:46:32 -0500 Subject: [PATCH 429/741] Added a new GetText(out Encoding) method to TextPart This fixes issue #526 by providing the exact Encoding used to the caller to do charset conversion. --- MimeKit/TextPart.cs | 104 +++++++++++++++++++++++-------------- UnitTests/TextPartTests.cs | 37 +++++++++++-- 2 files changed, 98 insertions(+), 43 deletions(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 8693fe4c0b..60a4c49630 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -273,55 +273,22 @@ public bool IsRichText { } /// - /// Gets the decoded text content. + /// Get the decoded text content. /// /// /// If the charset parameter on the /// is set, it will be used in order to convert the raw content into unicode. - /// If that fails or if the charset parameter is not set, iso-8859-1 will be - /// used instead. + /// If that fails or if the charset parameter is not set, the first 2 bytes of + /// the content will be checked for a unicode BOM. If a BOM exists, then that + /// will be used for conversion. If no BOM is found, then UTF-8 is attempted. + /// If conversion fails, then iso-8859-1 will be used as the final fallback. /// For more control, use /// or . /// - /// The text. + /// The decocded text. public string Text { get { - if (Content == null) - return string.Empty; - - var charset = ContentType.Parameters["charset"]; - Encoding encoding = null; - - if (charset != null) { - try { - encoding = CharsetUtils.GetEncoding (charset); - } catch (NotSupportedException) { - } - } - - if (encoding == null) { - try { - var bom = new byte[2]; - int n; - - using (var content = Content.Open ()) - n = content.Read (bom, 0, bom.Length); - - if (bom.Length >= 2 && bom[0] == 0xFF && bom[1] == 0xFE) - encoding = Encoding.Unicode; // UTF-16LE - else if (bom.Length >= 2 && bom[0] == 0xFE && bom[1] == 0xFF) - encoding = Encoding.BigEndianUnicode; // UTF-16BE - else - encoding = CharsetUtils.UTF8; - - return GetText (encoding); - } catch (DecoderFallbackException) { - // fall back to iso-8859-1 - encoding = CharsetUtils.Latin1; - } - } - - return GetText (encoding); + return GetText (out Encoding encoding); } set { SetText (Encoding.UTF8, value); @@ -371,6 +338,63 @@ internal bool IsFormat (TextFormat format) } } + /// + /// Get the decoded text and the encoding used to convert it into unicode. + /// + /// + /// If the charset parameter on the + /// is set, it will be used in order to convert the raw content into unicode. + /// If that fails or if the charset parameter is not set, the first 2 bytes of + /// the content will be checked for a unicode BOM. If a BOM exists, then that + /// will be used for conversion. If no BOM is found, then UTF-8 is attempted. + /// If conversion fails, then iso-8859-1 will be used as the final fallback. + /// For more control, use + /// or . + /// + /// The encoding used to convert the text into unicode. + /// The decoded text. + public string GetText (out Encoding encoding) + { + if (Content == null) { + encoding = Encoding.ASCII; + return string.Empty; + } + + var charset = ContentType.Parameters["charset"]; + encoding = null; + + if (charset != null) { + try { + encoding = CharsetUtils.GetEncoding (charset); + } catch (NotSupportedException) { + } + } + + if (encoding == null) { + try { + var bom = new byte[2]; + int n; + + using (var content = Content.Open ()) + n = content.Read (bom, 0, bom.Length); + + if (bom.Length >= 2 && bom[0] == 0xFF && bom[1] == 0xFE) + encoding = Encoding.Unicode; // UTF-16LE + else if (bom.Length >= 2 && bom[0] == 0xFE && bom[1] == 0xFF) + encoding = Encoding.BigEndianUnicode; // UTF-16BE + else + encoding = CharsetUtils.UTF8; + + return GetText (encoding); + } catch (DecoderFallbackException) { + // fall back to iso-8859-1 + encoding = CharsetUtils.Latin1; + } + } + + return GetText (encoding); + } + /// /// Gets the decoded text content using the provided charset encoding to /// override the charset specified in the Content-Type parameters. diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index 428dadc077..5b5aad4323 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -113,25 +113,45 @@ public void TestGetText () Assert.AreEqual (text, part.GetText (encoding), "encoding"); } + [Test] + public void TestNullContentIsAscii () + { + var part = new TextPart ("plain"); + + Assert.AreEqual (string.Empty, part.Text, "Text"); + + var actual = part.GetText (out Encoding encoding); + + Assert.AreEqual (string.Empty, actual, "GetText(out Encoding)"); + Assert.AreEqual (Encoding.ASCII.CodePage, encoding.CodePage, "Encoding"); + } + [Test] public void TestLatin1 () { const string text = "This is some Låtín1 text."; + var latin1 = Encoding.GetEncoding ("iso-8859-1"); var memory = new MemoryStream (); - var buffer = Encoding.GetEncoding ("iso-8859-1").GetBytes (text); + var buffer = latin1.GetBytes (text); memory.Write (buffer, 0, buffer.Length); memory.Position = 0; var part = new TextPart ("plain") { Content = new MimeContent (memory) }; Assert.AreEqual (text, part.Text); + + var actual = part.GetText (out Encoding encoding); + + Assert.AreEqual (text, actual, "GetText(out Encoding)"); + Assert.AreEqual (latin1.CodePage, encoding.CodePage, "Encoding"); } [Test] public void TestUTF16BE () { const string text = "This is some UTF-16BE text.\r\nThis is line #2."; + var expected = text.Replace ("\r\n", Environment.NewLine); var memory = new MemoryStream (); memory.WriteByte (0xfe); @@ -143,13 +163,19 @@ public void TestUTF16BE () var part = new TextPart ("plain") { Content = new MimeContent (memory) }; - Assert.AreEqual (text.Replace ("\r\n", Environment.NewLine), part.Text.Substring (1)); + Assert.AreEqual (expected, part.Text.Substring (1)); + + var actual = part.GetText (out Encoding encoding); + + Assert.AreEqual (expected, actual.Substring (1), "GetText(out Encoding)"); + Assert.AreEqual (Encoding.BigEndianUnicode.CodePage, encoding.CodePage, "Encoding"); } [Test] public void TestUTF16LE () { const string text = "This is some UTF-16LE text.\r\nThis is line #2."; + var expected = text.Replace ("\r\n", Environment.NewLine); var memory = new MemoryStream (); memory.WriteByte (0xff); @@ -161,7 +187,12 @@ public void TestUTF16LE () var part = new TextPart ("plain") { Content = new MimeContent (memory) }; - Assert.AreEqual (text.Replace ("\r\n", Environment.NewLine), part.Text.Substring (1)); + Assert.AreEqual (expected, part.Text.Substring (1)); + + var actual = part.GetText (out Encoding encoding); + + Assert.AreEqual (expected, actual.Substring (1), "GetText(out Encoding)"); + Assert.AreEqual (Encoding.Unicode.CodePage, encoding.CodePage, "Encoding"); } } } From c0f2a7a25a3ebb813d6650578daa19e9317b1a7a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Nov 2019 14:44:43 -0500 Subject: [PATCH 430/741] Added unit test for TextPart.Text where the charset param is invalid --- UnitTests/TextPartTests.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index 5b5aad4323..a109d8ecc1 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -113,12 +113,32 @@ public void TestGetText () Assert.AreEqual (text, part.GetText (encoding), "encoding"); } + [Test] + public void TestInvalidCharset () + { + const string text = "This is some Låtín1 text."; + + var latin1 = Encoding.GetEncoding ("iso-8859-1"); + var part = new TextPart ("plain"); + + part.SetText ("iso-8859-1", text); + part.ContentType.Charset = "flubber"; + + Assert.AreEqual (text, part.Text); + + var actual = part.GetText (out Encoding encoding); + + Assert.AreEqual (text, actual, "GetText(out Encoding)"); + Assert.AreEqual (latin1.CodePage, encoding.CodePage, "Encoding"); + } + [Test] public void TestNullContentIsAscii () { var part = new TextPart ("plain"); Assert.AreEqual (string.Empty, part.Text, "Text"); + Assert.AreEqual (string.Empty, part.GetText (Encoding.ASCII), "GetText"); var actual = part.GetText (out Encoding encoding); From baf1d486d56fabc58c35e51af4a9ad6b18672323 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 Nov 2019 15:32:13 -0500 Subject: [PATCH 431/741] Added logic to quote the Authentication-Results pvalue if needed --- MimeKit/Cryptography/AuthenticationResults.cs | 45 ++++++++++++++--- MimeKit/Utils/ByteExtensions.cs | 4 +- .../AuthenticationResultsTests.cs | 49 +++++++++++++++++++ 3 files changed, 89 insertions(+), 9 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index c7bb3a8fa7..6fcdf0aac8 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -657,7 +657,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (quoted) value = MimeUtils.Unquote (value); - var propspec = new AuthenticationMethodProperty (ptype, property, value); + var propspec = new AuthenticationMethodProperty (ptype, property, value, quoted); resinfo.Properties.Add (propspec); if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) @@ -1199,6 +1199,9 @@ public override string ToString () /// public class AuthenticationMethodProperty { + static readonly char[] TokenSpecials = ByteExtensions.TokenSpecials.ToCharArray (); + bool? quoted; + /// /// Initializes a new instance of the class. /// @@ -1208,6 +1211,7 @@ public class AuthenticationMethodProperty /// The property type. /// The name of the property. /// The value of the property. + /// true if the property value was originally quoted; otherwise, false. /// /// is null. /// -or- @@ -1215,7 +1219,7 @@ public class AuthenticationMethodProperty /// -or- /// is null. /// - public AuthenticationMethodProperty (string ptype, string property, string value) + internal AuthenticationMethodProperty (string ptype, string property, string value, bool? quoted) { if (ptype == null) throw new ArgumentNullException (nameof (ptype)); @@ -1226,11 +1230,32 @@ public AuthenticationMethodProperty (string ptype, string property, string value if (value == null) throw new ArgumentNullException (nameof (value)); + this.quoted = quoted; PropertyType = ptype; Property = property; Value = value; } + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The property type. + /// The name of the property. + /// The value of the property. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + public AuthenticationMethodProperty (string ptype, string property, string value) : this (ptype, property, value, null) + { + } + /// /// Get the type of the property. /// @@ -1266,19 +1291,22 @@ public string Value { internal void AppendTokens (FormatOptions options, List tokens) { + var quote = quoted.HasValue ? quoted.Value : Value.IndexOfAny (TokenSpecials) != -1; + var value = quote ? MimeUtils.Quote (Value) : Value; + tokens.Add (" "); - if (PropertyType.Length + 1 + Property.Length + 1 + Value.Length < options.MaxLineLength) { - tokens.Add ($"{PropertyType}.{Property}={Value}"); + if (PropertyType.Length + 1 + Property.Length + 1 + value.Length < options.MaxLineLength) { + tokens.Add ($"{PropertyType}.{Property}={value}"); } else if (PropertyType.Length + 1 + Property.Length + 1 < options.MaxLineLength) { tokens.Add ($"{PropertyType}.{Property}="); - tokens.Add (Value); + tokens.Add (value); } else { tokens.Add (PropertyType); tokens.Add ("."); tokens.Add (Property); tokens.Add ("="); - tokens.Add (Value); + tokens.Add (value); } } @@ -1291,7 +1319,10 @@ internal void AppendTokens (FormatOptions options, List tokens) /// The serialized string. public override string ToString () { - return $"{PropertyType}.{Property}={Value}"; + var quote = quoted.HasValue ? quoted.Value : Value.IndexOfAny (TokenSpecials) != -1; + var value = quote ? MimeUtils.Quote (Value) : Value; + + return $"{PropertyType}.{Property}={value}"; } } } diff --git a/MimeKit/Utils/ByteExtensions.cs b/MimeKit/Utils/ByteExtensions.cs index b25fb126b6..18f3fad200 100644 --- a/MimeKit/Utils/ByteExtensions.cs +++ b/MimeKit/Utils/ByteExtensions.cs @@ -56,8 +56,8 @@ static class ByteExtensions const string DomainSpecials = "[]\\\r \t"; // not allowed in domains const string EncodedWordSpecials = "()<>@,;:\"/[]?.=_"; // rfc2047 5.1 const string EncodedPhraseSpecials = "!*+-/=_"; // rfc2047 5.3 - const string Specials = "()<>@,;:\\\".[]"; - internal const string TokenSpecials = "()<>@,;:\\\"/[]?="; + const string Specials = "()<>[]:;@\\,.\""; // rfc5322 3.2.3 + internal const string TokenSpecials = "()<>@,;:\\\"/[]?="; // rfc2045 5.1 const string Whitespace = " \t\r\n"; static readonly CharType[] table = new CharType[256]; diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 0498094ee7..69370857c6 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -140,6 +140,26 @@ public void TestEncodeLongResultMethodWithVersion () Assert.AreEqual (expected, encoded.ToString ()); } + [Test] + public void TestEncodeQuotedPropertyValue () + { + const string expected = "Authentication-Results: lists.example.com 1;\n\tfoo=pass (2 of 3 tests OK) ptype.prop=\"value1;value2\"\n"; + var encoded = new StringBuilder ("Authentication-Results:"); + var authres = new AuthenticationResults ("lists.example.com"); + var options = FormatOptions.Default.Clone (); + + authres.Results.Add (new AuthenticationMethodResult ("foo", "pass")); + authres.Results[0].ResultComment = "2 of 3 tests OK"; + authres.Results[0].Properties.Add (new AuthenticationMethodProperty ("ptype", "prop", "value1;value2")); + authres.Version = 1; + + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, encoded.Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestEncodeLongResultMethodWithVersionAndComment () { @@ -504,6 +524,35 @@ public void TestParseSimpleWithProperty3 () Assert.AreEqual (expected, encoded.ToString ()); } + [Test] + public void TestParseSimpleWithQuotedPropertyValue () + { + const string input = "example.com; method=pass ptype.prop=\"value1;value2\""; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("example.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (1, authres.Results.Count, "methods"); + Assert.AreEqual ("method", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (1, authres.Results[0].Properties.Count, "properties"); + Assert.AreEqual ("ptype", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("prop", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("value1;value2", authres.Results[0].Properties[0].Value); + + Assert.AreEqual (input, authres.ToString ()); + + const string expected = " example.com; method=pass ptype.prop=\"value1;value2\"\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + [Test] public void TestParseSimpleWithReason () { From 7714a5ac2c0466b5df0c2e4debf6eb9037ed47a3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 29 Nov 2019 11:52:31 -0500 Subject: [PATCH 432/741] Added a ContentType.CharsetEncoding property Fixes issue #526 --- MimeKit/ContentType.cs | 40 +++++++++++++++++++++++++++++++++------- MimeKit/TextPart.cs | 12 ++---------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index 0719e7c6f6..7e4cbf890a 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -70,7 +70,7 @@ public ContentType (string mediaType, string mediaSubtype) } /// - /// Gets or sets the type of the media. + /// Get or set the type of the media. /// /// /// Represents the media type of the . Examples include @@ -97,7 +97,7 @@ public string MediaType { } /// - /// Gets or sets the media subtype. + /// Get or set the media subtype. /// /// /// Represents the media subtype of the . Examples include @@ -124,7 +124,7 @@ public string MediaSubtype { } /// - /// Gets the parameters. + /// Get the parameters. /// /// /// In addition to the media type and subtype, the Content-Type header may also @@ -144,7 +144,7 @@ internal set { } /// - /// Gets or sets the boundary parameter. + /// Get or set the boundary parameter. /// /// /// This is a special parameter on entities, designating to the @@ -162,7 +162,7 @@ public string Boundary { } /// - /// Gets or sets the charset parameter. + /// Get or set the charset parameter. /// /// /// Text-based entities will often include a charset parameter @@ -180,7 +180,33 @@ public string Charset { } /// - /// Gets or sets the format parameter. + /// Get or set the charset parameter as an . + /// + /// + /// Text-based entities will often include a charset parameter + /// so that the receiving client can properly render the text. + /// + /// The charset encoding. + public Encoding CharsetEncoding { + get { + var charset = Charset; + + if (charset == null) + return null; + + try { + return CharsetUtils.GetEncoding (charset); + } catch { + return null; + } + } + set { + Charset = value != null ? CharsetUtils.GetMimeCharset (value) : null; + } + } + + /// + /// Get or set the format parameter. /// /// /// The format parameter is typically use with text/plain @@ -209,7 +235,7 @@ public string MimeType { } /// - /// Gets or sets the name parameter. + /// Get or set the name parameter. /// /// /// The name parameter is a way for the originiating client to suggest diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 60a4c49630..a18341ae8d 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -360,15 +360,7 @@ public string GetText (out Encoding encoding) return string.Empty; } - var charset = ContentType.Parameters["charset"]; - encoding = null; - - if (charset != null) { - try { - encoding = CharsetUtils.GetEncoding (charset); - } catch (NotSupportedException) { - } - } + encoding = ContentType.CharsetEncoding; if (encoding == null) { try { @@ -483,8 +475,8 @@ public void SetText (Encoding encoding, string text) if (text == null) throw new ArgumentNullException (nameof (text)); - ContentType.Parameters["charset"] = CharsetUtils.GetMimeCharset (encoding); var content = new MemoryStream (encoding.GetBytes (text)); + ContentType.CharsetEncoding = encoding; Content = new MimeContent (content); } From a29d5414549f6db9d77f556d06aa502f4b84a970 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 8 Dec 2019 09:40:46 -0500 Subject: [PATCH 433/741] Added support for converting RSACng keys into BouncyCastle keys --- .../AsymmetricAlgorithmExtensions.cs | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index bac3074d92..7f36618b97 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -41,7 +41,7 @@ namespace MimeKit.Cryptography /// public static class AsymmetricAlgorithmExtensions { - static void GetAsymmetricKeyParameters (DSACryptoServiceProvider dsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) + static void GetAsymmetricKeyParameters (DSA dsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var dp = dsa.ExportParameters (!publicOnly); var validationParameters = dp.Seed != null ? new DsaValidationParameters (dp.Seed, dp.Counter) : null; @@ -76,7 +76,7 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } - static void GetAsymmetricKeyParameters (RSACryptoServiceProvider rsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) + static void GetAsymmetricKeyParameters (RSA rsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var rp = rsa.ExportParameters (!publicOnly); var modulus = new BigInteger (1, rp.Modulus); @@ -116,6 +116,26 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } +#if NET46 || NET47 || NET48 || __MOBILE__ + static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACng rsa) + { + AsymmetricKeyParameter pub, key; + + GetAsymmetricKeyParameters (rsa, false, out pub, out key); + + return key; + } + + static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACng rsa) + { + AsymmetricKeyParameter pub, key; + + GetAsymmetricKeyParameters (rsa, false, out pub, out key); + + return new AsymmetricCipherKeyPair (pub, key); + } +#endif + /// /// Convert an AsymmetricAlgorithm into a BouncyCastle AsymmetricKeyParameter. /// @@ -142,6 +162,11 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl if (key is RSACryptoServiceProvider) return GetAsymmetricKeyParameter ((RSACryptoServiceProvider) key); +#if NET46 || NET47 || NET48 || __MOBILE__ + if (key is RSACng) + return GetAsymmetricKeyParameter ((RSACng) key); +#endif + // TODO: support ECDiffieHellman and ECDsa? throw new NotSupportedException (string.Format ("'{0}' is currently not supported.", key.GetType ().Name)); @@ -176,6 +201,11 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric if (key is RSACryptoServiceProvider) return GetAsymmetricCipherKeyPair ((RSACryptoServiceProvider) key); +#if NET46 || NET47 || NET48 || __MOBILE__ + if (key is RSACng) + return GetAsymmetricCipherKeyPair ((RSACng) key); +#endif + // TODO: support ECDiffieHellman and ECDsa? throw new NotSupportedException (string.Format ("'{0}' is currently not supported.", key.GetType ().Name)); From 2be79b76cf1bc2f5dce93eb90be83cac36b76e66 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Dec 2019 14:09:26 -0500 Subject: [PATCH 434/741] Added support for RSAES-OAEP for the BouncyCastle backend Partial fix for issue #528 --- .../BouncyCastleSecureMimeContext.cs | 71 ++++++++++++++++++- MimeKit/Cryptography/CmsRecipient.cs | 12 ++++ .../Cryptography/WindowsSecureMimeContext.cs | 3 + MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + UnitTests/Cryptography/SecureMimeTests.cs | 39 +++++++++- 11 files changed, 130 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index cdc9b887f9..1bc6be7497 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -42,6 +42,8 @@ using Org.BouncyCastle.Pkix; using Org.BouncyCastle.X509; using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1.Smime; @@ -51,6 +53,7 @@ using Org.BouncyCastle.Utilities.Collections; using AttributeTable = Org.BouncyCastle.Asn1.Cms.AttributeTable; +using IssuerAndSerialNumber = Org.BouncyCastle.Asn1.Cms.IssuerAndSerialNumber; using MimeKit.IO; @@ -963,6 +966,72 @@ async Task GetDigitalSignaturesAsync (CmsSignedDataP return content; } + class CmsRecipientInfoGenerator : RecipientInfoGenerator + { + readonly CmsRecipient recipient; + + public CmsRecipientInfoGenerator (CmsRecipient recipient) + { + this.recipient = recipient; + } + + IWrapper CreateWrapper (string encryptionOid) + { + if (PkcsObjectIdentifiers.RsaEncryption.Id.Equals (encryptionOid, StringComparison.Ordinal)) + encryptionOid = "RSA/ECB/PKCS1Padding"; + + return WrapperUtilities.GetWrapper (encryptionOid); + } + + byte[] GenerateWrappedKey (KeyParameter contentEncryptionKey, AlgorithmIdentifier keyEncryptionAlgorithm, AsymmetricKeyParameter publicKey, SecureRandom random) + { + var keyWrapper = CreateWrapper (keyEncryptionAlgorithm.Algorithm.Id); + var keyBytes = contentEncryptionKey.GetKey (); + + keyWrapper.Init (true, new ParametersWithRandom (publicKey, random)); + + return keyWrapper.Wrap (keyBytes, 0, keyBytes.Length); + } + + //RsaesOaepParameters GetRsaesOaepParameters (DigestAlgorithm digest) + //{ + // var oid = GetDigestOid (digest); + // var hashAlgorithm = new AlgorithmIdentifier (new DerObjectIdentifier (oid), DerNull.Instance); + // var maskGenFunction = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdMgf1, hashAlgorithm); + + // return new RsaesOaepParameters (hashAlgorithm, maskGenFunction, RsaesOaepParameters.DefaultPSourceAlgorithm); + //} + + public RecipientInfo Generate (KeyParameter contentEncryptionKey, SecureRandom random) + { + var tbs = Asn1Object.FromByteArray (recipient.Certificate.GetTbsCertificate ()); + var certificate = TbsCertificateStructure.GetInstance (tbs); + var publicKey = recipient.Certificate.GetPublicKey (); + var publicKeyInfo = certificate.SubjectPublicKeyInfo; + AlgorithmIdentifier keyEncryptionAlgorithm; + + if (recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) { + keyEncryptionAlgorithm = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdRsaesOaep, new RsaesOaepParameters ()); + } else { + keyEncryptionAlgorithm = publicKeyInfo.AlgorithmID; + } + + var encryptedKeyBytes = GenerateWrappedKey (contentEncryptionKey, keyEncryptionAlgorithm, publicKey, random); + RecipientIdentifier recipientIdentifier; + + if (recipient.RecipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) { + var issuerAndSerial = new IssuerAndSerialNumber (certificate.Issuer, certificate.SerialNumber.Value); + recipientIdentifier = new RecipientIdentifier (issuerAndSerial); + } else { + var subjectKeyIdentifier = recipient.Certificate.GetExtensionValue (X509Extensions.SubjectKeyIdentifier); + recipientIdentifier = new RecipientIdentifier (subjectKeyIdentifier); + } + + return new RecipientInfo (new KeyTransRecipientInfo (recipientIdentifier, keyEncryptionAlgorithm, + new DerOctetString (encryptedKeyBytes))); + } + } + Stream Envelope (CmsRecipientCollection recipients, Stream content) { var unique = new HashSet (); @@ -971,7 +1040,7 @@ Stream Envelope (CmsRecipientCollection recipients, Stream content) foreach (var recipient in recipients) { if (unique.Add (recipient.Certificate)) { - cms.AddKeyTransRecipient (recipient.Certificate); + cms.AddRecipientInfoGenerator (new CmsRecipientInfoGenerator (recipient)); count++; } } diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index d341a52867..4402cf1827 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -241,5 +241,17 @@ public SubjectIdentifierType RecipientIdentifierType { public EncryptionAlgorithm[] EncryptionAlgorithms { get; set; } + + /// + /// Get or set the RSA key encryption padding scheme. + /// + /// + /// Gets or sets the padding scheme to use for key encryption when + /// the is an RSA key. + /// + /// The encryption padding scheme. + public RsaEncryptionPaddingScheme RsaEncryptionPaddingScheme { + get; set; + } } } diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 1530c7ebc2..359368ef7d 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -266,6 +266,9 @@ RealCmsRecipientCollection GetCmsRecipients (CmsRecipientCollection recipients) else type = RealSubjectIdentifierType.SubjectKeyIdentifier; + if (recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) + throw new NotSupportedException ("The RSAES-OAEP padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); + collection.Add (new RealCmsRecipient (type, certificate)); } diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 85074b9e04..87c0d39f57 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -112,6 +112,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 40a41b5a54..980a8927e2 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -101,6 +101,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 5afc1fdf8c..2203cb1a84 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -109,6 +109,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 701f13ee49..e4dadaa9e7 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -104,6 +104,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 5958d7e744..c567240e76 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -94,6 +94,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 2a73ed6cd4..4f679eea65 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -100,6 +100,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 37391e5847..ff29888c18 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -111,6 +111,7 @@ + diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index c28b415ec4..bd8b75ad53 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -1093,6 +1093,34 @@ public virtual void TestSecureMimeEncryptionWithAlgorithm () } } + [Test] + public virtual void TestSecureMimeEncryptionWithRsaesOaep () + { + var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up encrypting..." }; + + using (var ctx = CreateContext ()) { + var recipients = new CmsRecipientCollection (); + + var recipient = new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.SubjectKeyIdentifier); + recipient.RsaEncryptionPaddingScheme = RsaEncryptionPaddingScheme.Oaep; + recipients.Add (recipient); + + var encrypted = ApplicationPkcs7Mime.Encrypt (ctx, recipients, body); + + Assert.AreEqual (SecureMimeType.EnvelopedData, encrypted.SecureMimeType, "S/MIME type did not match."); + + using (var stream = new MemoryStream ()) { + ctx.DecryptTo (encrypted.Content.Open (), stream); + stream.Position = 0; + + var decrypted = MimeEntity.Load (stream); + + Assert.IsInstanceOf (decrypted, "Decrypted part is not the expected type."); + Assert.AreEqual (body.Text, ((TextPart) decrypted).Text, "Decrypted content is not the same as the original."); + } + } + } + [Test] public void TestSecureMimeDecryptThunderbird () { @@ -1530,7 +1558,7 @@ public override void TestSecureMimeEncryptionWithContext () if (Path.DirectorySeparatorChar != '\\') return; - base.TestSecureMimeEncryption (); + base.TestSecureMimeEncryptionWithContext (); } [Test] @@ -1542,6 +1570,15 @@ public override void TestSecureMimeEncryptionWithAlgorithm () base.TestSecureMimeEncryptionWithAlgorithm (); } + [Test] + public override void TestSecureMimeEncryptionWithRsaesOaep () + { + if (Path.DirectorySeparatorChar != '\\') + return; + + base.TestSecureMimeEncryptionWithRsaesOaep (); + } + [Test] public override void TestSecureMimeSignAndEncrypt () { From bb1080b073b4de3f323becfb45171ab1120e91c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Dec 2019 14:16:57 -0500 Subject: [PATCH 435/741] Throw NotSupportedException for RSASSA-PSS as well --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 359368ef7d..a02cc39262 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -258,6 +258,9 @@ RealCmsRecipientCollection GetCmsRecipients (CmsRecipientCollection recipients) var collection = new RealCmsRecipientCollection (); foreach (var recipient in recipients) { + if (recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) + throw new NotSupportedException ("The RSAES-OAEP encryption padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); + var certificate = new X509Certificate2 (recipient.Certificate.GetEncoded ()); RealSubjectIdentifierType type; @@ -266,9 +269,6 @@ RealCmsRecipientCollection GetCmsRecipients (CmsRecipientCollection recipients) else type = RealSubjectIdentifierType.SubjectKeyIdentifier; - if (recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) - throw new NotSupportedException ("The RSAES-OAEP padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); - collection.Add (new RealCmsRecipient (type, certificate)); } @@ -344,6 +344,9 @@ RealCmsSigner GetRealCmsSigner (X509Certificate2 certificate, DigestAlgorithm di RealCmsSigner GetRealCmsSigner (CmsSigner signer) { + if (signer.RsaSignaturePaddingScheme == RsaSignaturePaddingScheme.Pss) + throw new NotSupportedException ("The RSASSA-PSS signature padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); + var certificate = signer.Certificate.AsX509Certificate2 (); certificate.PrivateKey = signer.PrivateKey.AsAsymmetricAlgorithm (); From d7adedd2fb7d03921894ddb7763804ddf0124c21 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Dec 2019 15:20:50 -0500 Subject: [PATCH 436/741] Make sure the public key is RSA before allowing the use of RSAES-OAEP --- MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 1bc6be7497..eb676bdd67 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -1010,7 +1010,7 @@ public RecipientInfo Generate (KeyParameter contentEncryptionKey, SecureRandom r var publicKeyInfo = certificate.SubjectPublicKeyInfo; AlgorithmIdentifier keyEncryptionAlgorithm; - if (recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) { + if (publicKey is RsaKeyParameters && recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) { keyEncryptionAlgorithm = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdRsaesOaep, new RsaesOaepParameters ()); } else { keyEncryptionAlgorithm = publicKeyInfo.AlgorithmID; From be22093b0befa88544e227386b7a87b5935db566 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Dec 2019 16:46:08 -0500 Subject: [PATCH 437/741] Include RSAES-OAEP capabilities in SMIMECapabilities and fixed unit test for RSASSA-PSS --- .../BouncyCastleSecureMimeContext.cs | 12 ++------ MimeKit/Cryptography/SecureMimeContext.cs | 23 +++++++++++++-- .../Cryptography/WindowsSecureMimeContext.cs | 2 +- UnitTests/Cryptography/SecureMimeTests.cs | 28 ++++++++++++------- 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index eb676bdd67..fd8977d918 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -246,7 +246,7 @@ protected CmsRecipientCollection GetCmsRecipients (IEnumerable m AttributeTable AddSecureMimeCapabilities (AttributeTable signedAttributes) { - var attr = GetSecureMimeCapabilitiesAttribute (); + var attr = GetSecureMimeCapabilitiesAttribute (true); // populate our signed attributes with some S/MIME capabilities return signedAttributes.Add (attr.AttrType, attr.AttrValues[0]); @@ -993,15 +993,6 @@ byte[] GenerateWrappedKey (KeyParameter contentEncryptionKey, AlgorithmIdentifie return keyWrapper.Wrap (keyBytes, 0, keyBytes.Length); } - //RsaesOaepParameters GetRsaesOaepParameters (DigestAlgorithm digest) - //{ - // var oid = GetDigestOid (digest); - // var hashAlgorithm = new AlgorithmIdentifier (new DerObjectIdentifier (oid), DerNull.Instance); - // var maskGenFunction = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdMgf1, hashAlgorithm); - - // return new RsaesOaepParameters (hashAlgorithm, maskGenFunction, RsaesOaepParameters.DefaultPSourceAlgorithm); - //} - public RecipientInfo Generate (KeyParameter contentEncryptionKey, SecureRandom random) { var tbs = Asn1Object.FromByteArray (recipient.Certificate.GetTbsCertificate ()); @@ -1011,6 +1002,7 @@ public RecipientInfo Generate (KeyParameter contentEncryptionKey, SecureRandom r AlgorithmIdentifier keyEncryptionAlgorithm; if (publicKey is RsaKeyParameters && recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) { + // TODO: support SHA-246, SHA-384 and SHA-512? Use SecureMimeContext.GetRsaesOaepParameters (DigestAlgorithm) keyEncryptionAlgorithm = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdRsaesOaep, new RsaesOaepParameters ()); } else { keyEncryptionAlgorithm = publicKeyInfo.AlgorithmID; diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 2dee29f2b9..6b3dbe731b 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -31,10 +31,11 @@ using Org.BouncyCastle.Cms; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.X509; -using Org.BouncyCastle.Asn1.Pkcs; -using Org.BouncyCastle.Asn1.Smime; using Org.BouncyCastle.Asn1.Ntt; using Org.BouncyCastle.Asn1.Kisa; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.Smime; namespace MimeKit.Cryptography { /// @@ -508,7 +509,16 @@ public virtual void DecompressTo (Stream stream, Stream output) content.ContentStream.CopyTo (output, 4096); } - internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute () + internal RsaesOaepParameters GetRsaesOaepParameters (DigestAlgorithm digest) + { + var oid = GetDigestOid (digest); + var hashAlgorithm = new AlgorithmIdentifier (new DerObjectIdentifier (oid), DerNull.Instance); + var maskGenFunction = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdMgf1, hashAlgorithm); + + return new RsaesOaepParameters (hashAlgorithm, maskGenFunction, RsaesOaepParameters.DefaultPSourceAlgorithm); + } + + internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool includeRsaesOaep) { var capabilities = new SmimeCapabilityVector (); @@ -568,6 +578,13 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute () } } + if (includeRsaesOaep) { + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, new RsaesOaepParameters ()); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters (DigestAlgorithm.Sha256)); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters (DigestAlgorithm.Sha384)); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters (DigestAlgorithm.Sha512)); + } + return new SmimeCapabilitiesAttribute (capabilities); } diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index a02cc39262..b43f886ce6 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -327,7 +327,7 @@ protected virtual X509Certificate2 GetSignerCertificate (MailboxAddress mailbox) AsnEncodedData GetSecureMimeCapabilities () { - var attr = GetSecureMimeCapabilitiesAttribute (); + var attr = GetSecureMimeCapabilitiesAttribute (false); return new AsnEncodedData (attr.AttrType.Id, attr.AttrValues[0].GetEncoded ()); } diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index bd8b75ad53..a14391c27c 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -680,22 +680,30 @@ public virtual void TestSecureMimeSigningWithRsaSsaPss () }; var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; - var multipart = MultipartSigned.Create (signer, body); + using (var ctx = CreateContext ()) { + MultipartSigned multipart; - Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children."); + try { + multipart = MultipartSigned.Create (signer, body); + } catch (NotSupportedException) { + if (!(ctx is WindowsSecureMimeContext)) + Assert.Fail ("RSASSA-PSS should be supported."); + return; + } - var protocol = multipart.ContentType.Parameters["protocol"]; - Assert.AreEqual ("application/pkcs7-signature", protocol, "The multipart/signed protocol does not match."); + Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children."); - Assert.IsInstanceOf (multipart[0], "The first child is not a text part."); - Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); + var protocol = multipart.ContentType.Parameters["protocol"]; + Assert.AreEqual ("application/pkcs7-signature", protocol, "The multipart/signed protocol does not match."); - var signatures = multipart.Verify (); - Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + Assert.IsInstanceOf (multipart[0], "The first child is not a text part."); + Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); - var signature = signatures[0]; + var signatures = multipart.Verify (); + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); + + var signature = signatures[0]; - using (var ctx = CreateContext ()) { if (!(ctx is WindowsSecureMimeContext) || Path.DirectorySeparatorChar == '\\') Assert.AreEqual ("MimeKit UnitTests", signature.SignerCertificate.Name); Assert.AreEqual ("mimekit@example.com", signature.SignerCertificate.Email); From 1b5a793e01b7d7c605e539b3dc7bd7c22eea1d98 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Dec 2019 22:25:25 -0500 Subject: [PATCH 438/741] Added an RsaEncryptionPadding class and modified CmsRecipient to use it More-or-less clone the System.Security CmsRecipient API. --- .../BouncyCastleSecureMimeContext.cs | 6 +- MimeKit/Cryptography/CmsRecipient.cs | 6 +- MimeKit/Cryptography/RsaEncryptionPadding.cs | 185 ++++++++++++++++++ MimeKit/Cryptography/SecureMimeContext.cs | 17 +- .../Cryptography/WindowsSecureMimeContext.cs | 2 +- MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + UnitTests/Cryptography/SecureMimeTests.cs | 27 ++- 13 files changed, 222 insertions(+), 28 deletions(-) create mode 100644 MimeKit/Cryptography/RsaEncryptionPadding.cs diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index fd8977d918..d2291aff79 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -1001,9 +1001,8 @@ public RecipientInfo Generate (KeyParameter contentEncryptionKey, SecureRandom r var publicKeyInfo = certificate.SubjectPublicKeyInfo; AlgorithmIdentifier keyEncryptionAlgorithm; - if (publicKey is RsaKeyParameters && recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) { - // TODO: support SHA-246, SHA-384 and SHA-512? Use SecureMimeContext.GetRsaesOaepParameters (DigestAlgorithm) - keyEncryptionAlgorithm = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdRsaesOaep, new RsaesOaepParameters ()); + if (publicKey is RsaKeyParameters && recipient.RsaEncryptionPadding?.Scheme == RsaEncryptionPaddingScheme.Oaep) { + keyEncryptionAlgorithm = recipient.RsaEncryptionPadding.GetAlgorithmIdentifier (); } else { keyEncryptionAlgorithm = publicKeyInfo.AlgorithmID; } @@ -1239,7 +1238,6 @@ public override void DecryptTo (Stream encryptedData, Stream decryptedData) continue; var content = recipient.GetContentStream (key); - content.ContentStream.CopyTo (decryptedData, 4096); return; } diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 4402cf1827..9881a55d1d 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -243,14 +243,14 @@ public EncryptionAlgorithm[] EncryptionAlgorithms { } /// - /// Get or set the RSA key encryption padding scheme. + /// Get or set the RSA key encryption padding. /// /// - /// Gets or sets the padding scheme to use for key encryption when + /// Gets or sets the padding to use for key encryption when /// the is an RSA key. /// /// The encryption padding scheme. - public RsaEncryptionPaddingScheme RsaEncryptionPaddingScheme { + public RsaEncryptionPadding RsaEncryptionPadding { get; set; } } diff --git a/MimeKit/Cryptography/RsaEncryptionPadding.cs b/MimeKit/Cryptography/RsaEncryptionPadding.cs new file mode 100644 index 0000000000..0427a76681 --- /dev/null +++ b/MimeKit/Cryptography/RsaEncryptionPadding.cs @@ -0,0 +1,185 @@ +// +// RsaEncryptionPadding.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2019 Microsoft Corp. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.X509; + +namespace MimeKit.Cryptography { + /// + /// The RSA encryption padding schemes and parameters used by S/MIME. + /// + /// + /// The RSA encryption padding schemes and parameters used by S/MIME as described in + /// rfc8017. + /// + public sealed class RsaEncryptionPadding : IEquatable + { + /// + /// The PKCS #1 v1.5 encryption padding. + /// + public static readonly RsaEncryptionPadding Pkcs1 = new RsaEncryptionPadding (RsaEncryptionPaddingScheme.Pkcs1, DigestAlgorithm.None); + + /// + /// The Optimal Asymmetric Encryption Padding (OAEP) scheme using the default (SHA-1) hash algorithm. + /// + public static readonly RsaEncryptionPadding OaepSha1 = new RsaEncryptionPadding (RsaEncryptionPaddingScheme.Oaep, DigestAlgorithm.Sha1); + + /// + /// The Optimal Asymmetric Encryption Padding (OAEP) scheme using the SHA-256 hash algorithm. + /// + public static readonly RsaEncryptionPadding OaepSha256 = new RsaEncryptionPadding (RsaEncryptionPaddingScheme.Oaep, DigestAlgorithm.Sha256); + + /// + /// The Optimal Asymmetric Encryption Padding (OAEP) scheme using the SHA-384 hash algorithm. + /// + public static readonly RsaEncryptionPadding OaepSha384 = new RsaEncryptionPadding (RsaEncryptionPaddingScheme.Oaep, DigestAlgorithm.Sha384); + + /// + /// The Optimal Asymmetric Encryption Padding (OAEP) scheme using the SHA-512 hash algorithm. + /// + public static readonly RsaEncryptionPadding OaepSha512 = new RsaEncryptionPadding (RsaEncryptionPaddingScheme.Oaep, DigestAlgorithm.Sha512); + + RsaEncryptionPadding (RsaEncryptionPaddingScheme scheme, DigestAlgorithm oaepHashAlgorithm) + { + OaepHashAlgorithm = oaepHashAlgorithm; + Scheme = scheme; + } + + /// + /// Get the RSA encryption padding scheme. + /// + /// + /// Gets the RSA encryption padding scheme. + /// + /// The RSA encryption padding scheme. + public RsaEncryptionPaddingScheme Scheme { + get; private set; + } + + /// + /// Get the hash algorithm used for RSAES-OAEP padding. + /// + /// + /// Gets the hash algorithm used for RSAES-OAEP padding. + /// + public DigestAlgorithm OaepHashAlgorithm { + get; private set; + } + + /// + /// Determines whether the specified is equal to the current . + /// + /// + /// Compares two RSA encryption paddings to determine if they are identical or not. + /// + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. + public bool Equals (RsaEncryptionPadding other) + { + if (other == null) + return false; + + return other.Scheme == Scheme && other.OaepHashAlgorithm == OaepHashAlgorithm; + } + + /// + /// Determines whether the specified object is equal to the current object. + /// + /// + /// The type of comparison between the current instance and the parameter depends on whether + /// the current instance is a reference type or a value type. + /// + /// The object to compare with the current object. + /// true if the specified object is equal to the current object; otherwise, false. + public override bool Equals (object obj) + { + return Equals (obj as RsaEncryptionPadding); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// Returns the hash code for this instance. + /// + /// A hash code for the current object. + public override int GetHashCode () + { + int hash = Scheme.GetHashCode (); + + if (Scheme == RsaEncryptionPaddingScheme.Oaep) + hash ^= OaepHashAlgorithm.GetHashCode (); + + return hash; + } + + /// + /// Create a new using and the specified hash algorithm. + /// + /// + /// Creates a new using and the specified hash algorithm. + /// + /// The hash algorithm. + /// An using and the specified hash algorithm. + /// + /// The is not supported. + /// + public static RsaEncryptionPadding CreateOaep (DigestAlgorithm hashAlgorithm) + { + switch (hashAlgorithm) { + case DigestAlgorithm.Sha1: return OaepSha1; + case DigestAlgorithm.Sha256: return OaepSha256; + case DigestAlgorithm.Sha384: return OaepSha384; + case DigestAlgorithm.Sha512: return OaepSha512; + default: throw new NotSupportedException ($"The {hashAlgorithm} hash algorithm is not supported."); + } + } + + internal RsaesOaepParameters GetRsaesOaepParameters () + { + if (OaepHashAlgorithm == DigestAlgorithm.Sha1) + return new RsaesOaepParameters (); + + var oid = SecureMimeContext.GetDigestOid (OaepHashAlgorithm); + var hashAlgorithm = new AlgorithmIdentifier (new DerObjectIdentifier (oid), DerNull.Instance); + var maskGenFunction = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdMgf1, hashAlgorithm); + + return new RsaesOaepParameters (hashAlgorithm, maskGenFunction, RsaesOaepParameters.DefaultPSourceAlgorithm); + } + + internal AlgorithmIdentifier GetAlgorithmIdentifier () + { + if (Scheme != RsaEncryptionPaddingScheme.Oaep) + return null; + + return new AlgorithmIdentifier (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters ()); + } + } +} diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 6b3dbe731b..a72abc5d49 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -509,15 +509,6 @@ public virtual void DecompressTo (Stream stream, Stream output) content.ContentStream.CopyTo (output, 4096); } - internal RsaesOaepParameters GetRsaesOaepParameters (DigestAlgorithm digest) - { - var oid = GetDigestOid (digest); - var hashAlgorithm = new AlgorithmIdentifier (new DerObjectIdentifier (oid), DerNull.Instance); - var maskGenFunction = new AlgorithmIdentifier (PkcsObjectIdentifiers.IdMgf1, hashAlgorithm); - - return new RsaesOaepParameters (hashAlgorithm, maskGenFunction, RsaesOaepParameters.DefaultPSourceAlgorithm); - } - internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool includeRsaesOaep) { var capabilities = new SmimeCapabilityVector (); @@ -579,10 +570,10 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool inc } if (includeRsaesOaep) { - capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, new RsaesOaepParameters ()); - capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters (DigestAlgorithm.Sha256)); - capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters (DigestAlgorithm.Sha384)); - capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters (DigestAlgorithm.Sha512)); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, RsaEncryptionPadding.OaepSha1.GetRsaesOaepParameters ()); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, RsaEncryptionPadding.OaepSha256.GetRsaesOaepParameters ()); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, RsaEncryptionPadding.OaepSha384.GetRsaesOaepParameters ()); + capabilities.AddCapability (PkcsObjectIdentifiers.IdRsaesOaep, RsaEncryptionPadding.OaepSha512.GetRsaesOaepParameters ()); } return new SmimeCapabilitiesAttribute (capabilities); diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index b43f886ce6..071969896e 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -258,7 +258,7 @@ RealCmsRecipientCollection GetCmsRecipients (CmsRecipientCollection recipients) var collection = new RealCmsRecipientCollection (); foreach (var recipient in recipients) { - if (recipient.RsaEncryptionPaddingScheme == RsaEncryptionPaddingScheme.Oaep) + if (recipient.RsaEncryptionPadding?.Scheme == RsaEncryptionPaddingScheme.Oaep) throw new NotSupportedException ("The RSAES-OAEP encryption padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); var certificate = new X509Certificate2 (recipient.Certificate.GetEncoded ()); diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 87c0d39f57..b72c9daa60 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -112,6 +112,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 980a8927e2..05f21627d1 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -101,6 +101,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 2203cb1a84..62d565ba2c 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -109,6 +109,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index e4dadaa9e7..574bbef125 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -104,6 +104,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index c567240e76..cdd8846c8b 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -94,6 +94,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 4f679eea65..5c7ebaacd4 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -100,6 +100,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index ff29888c18..0d3aca5a1b 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -111,6 +111,7 @@ + diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index a14391c27c..43505d82f5 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -34,6 +34,7 @@ using NUnit.Framework; +using Org.BouncyCastle.Cms; using Org.BouncyCastle.X509; using Org.BouncyCastle.Pkcs; @@ -1101,8 +1102,11 @@ public virtual void TestSecureMimeEncryptionWithAlgorithm () } } - [Test] - public virtual void TestSecureMimeEncryptionWithRsaesOaep () + [TestCase (DigestAlgorithm.Sha1)] + [TestCase (DigestAlgorithm.Sha256)] + [TestCase (DigestAlgorithm.Sha384)] + [TestCase (DigestAlgorithm.Sha512)] + public virtual void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashAlgorithm) { var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up encrypting..." }; @@ -1110,7 +1114,7 @@ public virtual void TestSecureMimeEncryptionWithRsaesOaep () var recipients = new CmsRecipientCollection (); var recipient = new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.SubjectKeyIdentifier); - recipient.RsaEncryptionPaddingScheme = RsaEncryptionPaddingScheme.Oaep; + recipient.RsaEncryptionPadding = RsaEncryptionPadding.CreateOaep (hashAlgorithm); recipients.Add (recipient); var encrypted = ApplicationPkcs7Mime.Encrypt (ctx, recipients, body); @@ -1118,8 +1122,17 @@ public virtual void TestSecureMimeEncryptionWithRsaesOaep () Assert.AreEqual (SecureMimeType.EnvelopedData, encrypted.SecureMimeType, "S/MIME type did not match."); using (var stream = new MemoryStream ()) { - ctx.DecryptTo (encrypted.Content.Open (), stream); - stream.Position = 0; + try { + ctx.DecryptTo (encrypted.Content.Open (), stream); + stream.Position = 0; + } catch (CmsException) { + if (hashAlgorithm != DigestAlgorithm.Sha1) { + Assert.Ignore ($"RSAES-OAEP w/ {hashAlgorithm} is known to fail."); + return; + } + + throw; + } var decrypted = MimeEntity.Load (stream); @@ -1579,12 +1592,12 @@ public override void TestSecureMimeEncryptionWithAlgorithm () } [Test] - public override void TestSecureMimeEncryptionWithRsaesOaep () + public override void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashAlgorithm) { if (Path.DirectorySeparatorChar != '\\') return; - base.TestSecureMimeEncryptionWithRsaesOaep (); + base.TestSecureMimeEncryptionWithRsaesOaep (hashAlgorithm); } [Test] From b26c918af7cdefecdd1882efc29cf0277efec75c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 16 Dec 2019 10:17:34 -0500 Subject: [PATCH 439/741] Added unit tests for RsaEncryptionPadding --- .../Cryptography/RsaEncryptionPaddingTests.cs | 128 ++++++++++++++++++ UnitTests/UnitTests.csproj | 1 + 2 files changed, 129 insertions(+) create mode 100644 UnitTests/Cryptography/RsaEncryptionPaddingTests.cs diff --git a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs new file mode 100644 index 0000000000..90a3669d9a --- /dev/null +++ b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs @@ -0,0 +1,128 @@ +// +// RsaEncryptionPaddingTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Reflection; +using System.Collections.Generic; + +using NUnit.Framework; + +using Org.BouncyCastle.Asn1.Cms; +using Org.BouncyCastle.Asn1.Oiw; +using Org.BouncyCastle.Asn1.Nist; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.X509; + +using MimeKit.Cryptography; +using Org.BouncyCastle.Asn1; + +namespace UnitTests.Cryptography { + [TestFixture] + public class RsaEncryptionPaddingTests + { + [Test] + public void TestEquality () + { + Assert.AreEqual (RsaEncryptionPadding.OaepSha1, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha1), "SHA-1"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha256, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha256), "SHA-256"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha384, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha384), "SHA-384"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha512, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha512), "SHA-512"); + + Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha1, "PKCS1 != SHA-1"); + Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha256, "PKCS1 != SHA-256"); + Assert.AreNotEqual (RsaEncryptionPadding.OaepSha1, RsaEncryptionPadding.OaepSha256, "SHA-1 != SHA-256"); + + Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, new object (), "PKCS1 != object"); + } + + [Test] + public void TestGetHashCode () + { + var hashCodes = new Dictionary (); + + foreach (var field in typeof (RsaEncryptionPadding).GetFields (BindingFlags.Public | BindingFlags.Static)) { + if (field.FieldType != typeof (RsaEncryptionPadding)) + continue; + + var padding = (RsaEncryptionPadding) field.GetValue (null); + int hashCode = padding.GetHashCode (); + + if (hashCodes.TryGetValue (hashCode, out var other)) + Assert.Fail ($"{padding.Scheme} shares the same hash code as {other.Scheme}"); + + hashCodes.Add (hashCode, padding); + } + } + + [Test] + public void TestNotSupportedException () + { + var supported = new HashSet (); + + foreach (var field in typeof (RsaEncryptionPadding).GetFields (BindingFlags.Public | BindingFlags.Static)) { + if (field.FieldType != typeof (RsaEncryptionPadding)) + continue; + + var padding = (RsaEncryptionPadding) field.GetValue (null); + + if (padding.Scheme == RsaEncryptionPaddingScheme.Oaep) + supported.Add (padding.OaepHashAlgorithm); + } + + foreach (DigestAlgorithm hashAlgorithm in Enum.GetValues (typeof (DigestAlgorithm))) { + if (!supported.Contains (hashAlgorithm)) + Assert.Throws (() => RsaEncryptionPadding.CreateOaep (hashAlgorithm)); + else + Assert.DoesNotThrow (() => RsaEncryptionPadding.CreateOaep (hashAlgorithm)); + } + } + + static void AssertOaepAlgorithmIdentifier (RsaEncryptionPadding padding, DerObjectIdentifier hashAlgorithm) + { + var name = $"Oaep{padding.Scheme}"; + + var algorithm = padding.GetAlgorithmIdentifier (); + Assert.IsNotNull (algorithm, $"{name} != null"); + Assert.AreEqual (PkcsObjectIdentifiers.IdRsaesOaep, algorithm.Algorithm, $"{name}.Algorithm == RSAES-OAEP"); + var parameters = (RsaesOaepParameters) algorithm.Parameters; + Assert.AreEqual (hashAlgorithm, parameters.HashAlgorithm.Algorithm, $"{name}.HashAlgorithm == {padding.OaepHashAlgorithm}"); + Assert.AreEqual (PkcsObjectIdentifiers.IdMgf1, parameters.MaskGenAlgorithm.Algorithm, $"{name}.MaskGenAlgorithm == MGF1"); + var mgf1hash = (AlgorithmIdentifier) parameters.MaskGenAlgorithm.Parameters; + Assert.AreEqual (hashAlgorithm, mgf1hash.Algorithm, $"{name}.MaskGenHashAlgorithm == {padding.OaepHashAlgorithm}"); + } + + [Test] + public void TestGetAlgorithmIdentifier () + { + Assert.IsNull (RsaEncryptionPadding.Pkcs1.GetAlgorithmIdentifier (), "Pkcs1"); + + AssertOaepAlgorithmIdentifier (RsaEncryptionPadding.OaepSha1, OiwObjectIdentifiers.IdSha1); + AssertOaepAlgorithmIdentifier (RsaEncryptionPadding.OaepSha256, NistObjectIdentifiers.IdSha256); + AssertOaepAlgorithmIdentifier (RsaEncryptionPadding.OaepSha384, NistObjectIdentifiers.IdSha384); + AssertOaepAlgorithmIdentifier (RsaEncryptionPadding.OaepSha512, NistObjectIdentifiers.IdSha512); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index d13be96cf4..a228ddf726 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -88,6 +88,7 @@ + From e03da15978b26b8e6dd0671fe87e1be18ac8b3bd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 16 Dec 2019 11:32:37 -0500 Subject: [PATCH 440/741] Fixed RSAES-OAEP w/ hash algorithms other than SHA-1 --- .../BouncyCastleSecureMimeContext.cs | 18 +++++++++++++----- UnitTests/Cryptography/SecureMimeTests.cs | 16 ++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index d2291aff79..931234c1be 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -975,17 +975,25 @@ public CmsRecipientInfoGenerator (CmsRecipient recipient) this.recipient = recipient; } - IWrapper CreateWrapper (string encryptionOid) + IWrapper CreateWrapper (AlgorithmIdentifier keyExchangeAlgorithm) { - if (PkcsObjectIdentifiers.RsaEncryption.Id.Equals (encryptionOid, StringComparison.Ordinal)) - encryptionOid = "RSA/ECB/PKCS1Padding"; + string name; - return WrapperUtilities.GetWrapper (encryptionOid); + if (PkcsObjectIdentifiers.IdRsaesOaep.Id.Equals (keyExchangeAlgorithm.Algorithm.Id, StringComparison.Ordinal)) { + var oaepParameters = RsaesOaepParameters.GetInstance (keyExchangeAlgorithm.Parameters); + name = "RSA//OAEPWITH" + DigestUtilities.GetAlgorithmName (oaepParameters.HashAlgorithm.Algorithm) + "ANDMGF1Padding"; + } else if (PkcsObjectIdentifiers.RsaEncryption.Id.Equals (keyExchangeAlgorithm.Algorithm.Id, StringComparison.Ordinal)) { + name = "RSA//PKCS1Padding"; + } else { + name = keyExchangeAlgorithm.Algorithm.Id; + } + + return WrapperUtilities.GetWrapper (name); } byte[] GenerateWrappedKey (KeyParameter contentEncryptionKey, AlgorithmIdentifier keyEncryptionAlgorithm, AsymmetricKeyParameter publicKey, SecureRandom random) { - var keyWrapper = CreateWrapper (keyEncryptionAlgorithm.Algorithm.Id); + var keyWrapper = CreateWrapper (keyEncryptionAlgorithm); var keyBytes = contentEncryptionKey.GetKey (); keyWrapper.Init (true, new ParametersWithRandom (publicKey, random)); diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 43505d82f5..a064b73f69 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -1113,7 +1113,8 @@ public virtual void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashA using (var ctx = CreateContext ()) { var recipients = new CmsRecipientCollection (); - var recipient = new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.SubjectKeyIdentifier); + var recipient = new CmsRecipient (MimeKitCertificate, SubjectIdentifierType.IssuerAndSerialNumber); + recipient.EncryptionAlgorithms = new EncryptionAlgorithm[] { EncryptionAlgorithm.Aes128 }; recipient.RsaEncryptionPadding = RsaEncryptionPadding.CreateOaep (hashAlgorithm); recipients.Add (recipient); @@ -1122,17 +1123,8 @@ public virtual void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashA Assert.AreEqual (SecureMimeType.EnvelopedData, encrypted.SecureMimeType, "S/MIME type did not match."); using (var stream = new MemoryStream ()) { - try { - ctx.DecryptTo (encrypted.Content.Open (), stream); - stream.Position = 0; - } catch (CmsException) { - if (hashAlgorithm != DigestAlgorithm.Sha1) { - Assert.Ignore ($"RSAES-OAEP w/ {hashAlgorithm} is known to fail."); - return; - } - - throw; - } + ctx.DecryptTo (encrypted.Content.Open (), stream); + stream.Position = 0; var decrypted = MimeEntity.Load (stream); From ac63198356f442b90ada22cf8e11db50732f2697 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 18 Dec 2019 22:41:21 -0500 Subject: [PATCH 441/741] Added CmsSigner.SignerIdentifierType --- .../BouncyCastleSecureMimeContext.cs | 24 +++++++-- MimeKit/Cryptography/CmsSigner.cs | 52 ++++++++++++++++--- .../Cryptography/WindowsSecureMimeContext.cs | 14 +++-- UnitTests/Cryptography/CmsSignerTests.cs | 28 ++++++++++ UnitTests/Cryptography/SecureMimeTests.cs | 4 +- 5 files changed, 103 insertions(+), 19 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 931234c1be..7eeaa5dae9 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -67,6 +67,8 @@ namespace MimeKit.Cryptography /// public abstract class BouncyCastleSecureMimeContext : SecureMimeContext { + static readonly string RsassaPssOid = PkcsObjectIdentifiers.IdRsassaPss.Id; + HttpClient client; /// @@ -244,25 +246,37 @@ protected CmsRecipientCollection GetCmsRecipients (IEnumerable m /// The timestamp. protected abstract void UpdateSecureMimeCapabilities (X509Certificate certificate, EncryptionAlgorithm[] algorithms, DateTime timestamp); - AttributeTable AddSecureMimeCapabilities (AttributeTable signedAttributes) + CmsAttributeTableGenerator AddSecureMimeCapabilities (AttributeTable signedAttributes) { var attr = GetSecureMimeCapabilitiesAttribute (true); // populate our signed attributes with some S/MIME capabilities - return signedAttributes.Add (attr.AttrType, attr.AttrValues[0]); + return new DefaultSignedAttributeTableGenerator (signedAttributes.Add (attr.AttrType, attr.AttrValues[0])); } Stream Sign (CmsSigner signer, Stream content, bool encapsulate) { + var unsignedAttributes = new SimpleAttributeTableGenerator (signer.UnsignedAttributes); var signedAttributes = AddSecureMimeCapabilities (signer.SignedAttributes); var signedData = new CmsSignedDataStreamGenerator (); var digestOid = GetDigestOid (signer.DigestAlgorithm); + byte[] subjectKeyId = null; + + if (signer.SignerIdentifierType == SubjectIdentifierType.SubjectKeyIdentifier) { + var subjectKeyIdentifier = signer.Certificate.GetExtensionValue (X509Extensions.SubjectKeyIdentifier); + var id = (Asn1OctetString) Asn1Object.FromByteArray (subjectKeyIdentifier.GetOctets ()); + subjectKeyId = id.GetOctets (); + } if (signer.PrivateKey is RsaKeyParameters && signer.RsaSignaturePaddingScheme == RsaSignaturePaddingScheme.Pss) { - signedData.AddSigner (signer.PrivateKey, signer.Certificate, PkcsObjectIdentifiers.IdRsassaPss.Id, digestOid, - signedAttributes, signer.UnsignedAttributes); + if (subjectKeyId == null) + signedData.AddSigner (signer.PrivateKey, signer.Certificate, RsassaPssOid, digestOid, signedAttributes, unsignedAttributes); + else + signedData.AddSigner (signer.PrivateKey, subjectKeyId, RsassaPssOid, digestOid, signedAttributes, unsignedAttributes); + } else if (subjectKeyId == null) { + signedData.AddSigner (signer.PrivateKey, signer.Certificate, digestOid, signedAttributes, unsignedAttributes); } else { - signedData.AddSigner (signer.PrivateKey, signer.Certificate, digestOid, signedAttributes, signer.UnsignedAttributes); + signedData.AddSigner (signer.PrivateKey, subjectKeyId, digestOid, signedAttributes, unsignedAttributes); } signedData.AddCertificates (signer.CertificateChain); diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index f69f36c634..ba7673be0f 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -90,6 +90,7 @@ static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) /// /// The chain of certificates starting with the signer's certificate back to the root. /// The signer's private key. + /// The scheme used for identifying the signer certificate. /// /// is null. /// -or- @@ -102,7 +103,7 @@ static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) /// -or- /// is not a private key. /// - public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key) : this () + public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key, SubjectIdentifierType signerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber) : this () { if (chain == null) throw new ArgumentNullException (nameof (chain)); @@ -120,6 +121,11 @@ public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key if (!key.IsPrivate) throw new ArgumentException ("The key must be a private key.", nameof (key)); + if (signerIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) + SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; + else + SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; + Certificate = CertificateChain[0]; PrivateKey = key; } @@ -135,6 +141,7 @@ public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key /// /// The signer's certificate. /// The signer's private key. + /// The scheme used for identifying the signer certificate. /// /// is null. /// -or- @@ -145,7 +152,7 @@ public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key /// -or- /// is not a private key. /// - public CmsSigner (X509Certificate certificate, AsymmetricKeyParameter key) : this () + public CmsSigner (X509Certificate certificate, AsymmetricKeyParameter key, SubjectIdentifierType signerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber) : this () { if (certificate == null) throw new ArgumentNullException (nameof (certificate)); @@ -158,13 +165,18 @@ public CmsSigner (X509Certificate certificate, AsymmetricKeyParameter key) : thi if (!key.IsPrivate) throw new ArgumentException ("The key must be a private key.", nameof (key)); + if (signerIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) + SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; + else + SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; + CertificateChain = new X509CertificateChain (); CertificateChain.Add (certificate); Certificate = certificate; PrivateKey = key; } - void LoadPkcs12 (Stream stream, string password) + void LoadPkcs12 (Stream stream, string password, SubjectIdentifierType signerIdentifierType) { var pkcs12 = new Pkcs12Store (stream, password.ToCharArray ()); bool hasPrivateKey = false; @@ -184,6 +196,11 @@ void LoadPkcs12 (Stream stream, string password) if (chain.Length == 0 || !CanSign (chain[0].Certificate)) continue; + if (signerIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) + SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; + else + SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; + CertificateChain = new X509CertificateChain (); Certificate = chain[0].Certificate; PrivateKey = key.Key; @@ -213,6 +230,7 @@ void LoadPkcs12 (Stream stream, string password) /// /// The raw certificate and key data in pkcs12 format. /// The password to unlock the stream. + /// The scheme used for identifying the signer certificate. /// /// is null. /// -or- @@ -226,7 +244,7 @@ void LoadPkcs12 (Stream stream, string password) /// /// An I/O error occurred. /// - public CmsSigner (Stream stream, string password) : this () + public CmsSigner (Stream stream, string password, SubjectIdentifierType signerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber) : this () { if (stream == null) throw new ArgumentNullException (nameof (stream)); @@ -234,7 +252,7 @@ public CmsSigner (Stream stream, string password) : this () if (password == null) throw new ArgumentNullException (nameof (password)); - LoadPkcs12 (stream, password); + LoadPkcs12 (stream, password, signerIdentifierType); } /// @@ -250,6 +268,7 @@ public CmsSigner (Stream stream, string password) : this () /// /// The raw certificate and key data in pkcs12 format. /// The password to unlock the stream. + /// The scheme used for identifying the signer certificate. /// /// is null. /// -or- @@ -276,7 +295,7 @@ public CmsSigner (Stream stream, string password) : this () /// /// An I/O error occurred. /// - public CmsSigner (string fileName, string password) : this () + public CmsSigner (string fileName, string password, SubjectIdentifierType signerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber) : this () { if (fileName == null) throw new ArgumentNullException (nameof (fileName)); @@ -285,7 +304,7 @@ public CmsSigner (string fileName, string password) : this () throw new ArgumentNullException (nameof (password)); using (var stream = File.OpenRead (fileName)) - LoadPkcs12 (stream, password); + LoadPkcs12 (stream, password, signerIdentifierType); } #if !NETSTANDARD1_3 && !NETSTANDARD1_6 @@ -299,13 +318,14 @@ public CmsSigner (string fileName, string password) : this () /// initialized to empty tables. /// /// The signer's certificate. + /// The scheme used for identifying the signer certificate. /// /// is null. /// /// /// cannot be used for signing. /// - public CmsSigner (X509Certificate2 certificate) : this () + public CmsSigner (X509Certificate2 certificate, SubjectIdentifierType signerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber) : this () { if (certificate == null) throw new ArgumentNullException (nameof (certificate)); @@ -318,6 +338,11 @@ public CmsSigner (X509Certificate2 certificate) : this () CheckCertificateCanBeUsedForSigning (cert); + if (signerIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) + SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; + else + SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; + CertificateChain = new X509CertificateChain (); CertificateChain.Add (cert); Certificate = cert; @@ -383,6 +408,17 @@ public RsaSignaturePaddingScheme RsaSignaturePaddingScheme { get; set; } + /// + /// Gets the signer identifier type. + /// + /// + /// Specifies how the certificate should be looked up on the recipient's end. + /// + /// The signer identifier type. + public SubjectIdentifierType SignerIdentifierType { + get; private set; + } + /// /// Get or set the signed attributes. /// diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 071969896e..afae34ad53 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -332,9 +332,9 @@ AsnEncodedData GetSecureMimeCapabilities () return new AsnEncodedData (attr.AttrType.Id, attr.AttrValues[0].GetEncoded ()); } - RealCmsSigner GetRealCmsSigner (X509Certificate2 certificate, DigestAlgorithm digestAlgo) + RealCmsSigner GetRealCmsSigner (RealSubjectIdentifierType type, X509Certificate2 certificate, DigestAlgorithm digestAlgo) { - var signer = new RealCmsSigner (certificate); + var signer = new RealCmsSigner (type, certificate); signer.DigestAlgorithm = new Oid (GetDigestOid (digestAlgo)); signer.SignedAttributes.Add (GetSecureMimeCapabilities ()); signer.SignedAttributes.Add (new Pkcs9SigningTime ()); @@ -348,10 +348,16 @@ RealCmsSigner GetRealCmsSigner (CmsSigner signer) throw new NotSupportedException ("The RSASSA-PSS signature padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); var certificate = signer.Certificate.AsX509Certificate2 (); + RealSubjectIdentifierType type; + + if (signer.SignerIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) + type = RealSubjectIdentifierType.IssuerAndSerialNumber; + else + type = RealSubjectIdentifierType.SubjectKeyIdentifier; certificate.PrivateKey = signer.PrivateKey.AsAsymmetricAlgorithm (); - return GetRealCmsSigner (certificate, signer.DigestAlgorithm); + return GetRealCmsSigner (type, certificate, signer.DigestAlgorithm); } /// @@ -377,7 +383,7 @@ protected virtual RealCmsSigner GetCmsSigner (MailboxAddress mailbox, DigestAlgo if ((certificate = GetSignerCertificate (mailbox)) == null) throw new CertificateNotFoundException (mailbox, "A valid signing certificate could not be found."); - return GetRealCmsSigner (certificate, digestAlgo); + return GetRealCmsSigner (RealSubjectIdentifierType.IssuerAndSerialNumber, certificate, digestAlgo); } /// diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index 4bd96de261..d715d4aaec 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -157,5 +157,33 @@ public void TestConstructors () Assert.Fail (".ctor (X509Certificate2): {0}", ex); } } + + [Test] + public void TestDefaultValues () + { + var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + List certificates; + AsymmetricKeyParameter key; + var password = "no.secret"; + CmsSigner signer; + + signer = new CmsSigner (path, password); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (string, string)"); + + using (var stream = File.OpenRead (path)) + signer = new CmsSigner (stream, password); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (Stream, string)"); + + LoadPkcs12 (path, password, out certificates, out key); + + signer = new CmsSigner (certificates, key); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (chain, key)"); + + signer = new CmsSigner (certificates[0], key); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (certificate, key)"); + + signer = new CmsSigner (new X509Certificate2 (path, password, X509KeyStorageFlags.Exportable)); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (X509Certificate2)"); + } } } diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index a064b73f69..8af5fe2217 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -486,7 +486,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContext () [Test] public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret", SubjectIdentifierType.SubjectKeyIdentifier); var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; var signed = ApplicationPkcs7Mime.Sign (signer, cleartext); @@ -528,7 +528,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () [Test] public virtual void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); + var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret", SubjectIdentifierType.SubjectKeyIdentifier); var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; using (var ctx = CreateContext ()) { From 280986b04a2c815372a1154d8bc85792fa484e34 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 12:08:19 -0500 Subject: [PATCH 442/741] Added RsaSignaturePadding class and CmsSigner.RsaSignaturePadding CmsSigner.RsaSignaturePadding obsoletes the RsaSignaturePaddingScheme property. --- .../BouncyCastleSecureMimeContext.cs | 2 +- MimeKit/Cryptography/CmsSigner.cs | 20 +++ MimeKit/Cryptography/RsaEncryptionPadding.cs | 50 +++++- MimeKit/Cryptography/RsaSignaturePadding.cs | 153 ++++++++++++++++++ MimeKit/MimeKit.Android.csproj | 1 + MimeKit/MimeKit.Mac.csproj | 1 + MimeKit/MimeKit.Net45.csproj | 1 + MimeKit/MimeKit.NetStandard.csproj | 1 + MimeKit/MimeKit.TvOS.csproj | 1 + MimeKit/MimeKit.WatchOS.csproj | 1 + MimeKit/MimeKit.iOS.csproj | 1 + .../Cryptography/RsaEncryptionPaddingTests.cs | 8 +- .../Cryptography/RsaSignaturePaddingTests.cs | 35 ++++ UnitTests/UnitTests.csproj | 1 + 14 files changed, 267 insertions(+), 9 deletions(-) create mode 100644 MimeKit/Cryptography/RsaSignaturePadding.cs create mode 100644 UnitTests/Cryptography/RsaSignaturePaddingTests.cs diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 7eeaa5dae9..875d2d163e 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -268,7 +268,7 @@ Stream Sign (CmsSigner signer, Stream content, bool encapsulate) subjectKeyId = id.GetOctets (); } - if (signer.PrivateKey is RsaKeyParameters && signer.RsaSignaturePaddingScheme == RsaSignaturePaddingScheme.Pss) { + if (signer.PrivateKey is RsaKeyParameters && signer.RsaSignaturePadding == RsaSignaturePadding.Pss) { if (subjectKeyId == null) signedData.AddSigner (signer.PrivateKey, signer.Certificate, RsassaPssOid, digestOid, signedAttributes, unsignedAttributes); else diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index ba7673be0f..b57c106d29 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -404,7 +404,27 @@ public AsymmetricKeyParameter PrivateKey { /// the is an RSA key. /// /// The signature padding scheme. + [Obsolete ("Use RsaSignaturePadding instead.")] public RsaSignaturePaddingScheme RsaSignaturePaddingScheme { + get { return RsaSignaturePadding?.Scheme ?? RsaSignaturePaddingScheme.Pkcs1; } + set { + switch (value) { + case RsaSignaturePaddingScheme.Pkcs1: RsaSignaturePadding = RsaSignaturePadding.Pkcs1; break; + case RsaSignaturePaddingScheme.Pss: RsaSignaturePadding = RsaSignaturePadding.Pss; break; + default: throw new ArgumentOutOfRangeException (nameof (value)); + } + } + } + + /// + /// Get or set the RSA signature padding. + /// + /// + /// Gets or sets the signature padding to use for signing when + /// the is an RSA key. + /// + /// The signature padding scheme. + public RsaSignaturePadding RsaSignaturePadding { get; set; } diff --git a/MimeKit/Cryptography/RsaEncryptionPadding.cs b/MimeKit/Cryptography/RsaEncryptionPadding.cs index 0427a76681..4f9e72a6d4 100644 --- a/MimeKit/Cryptography/RsaEncryptionPadding.cs +++ b/MimeKit/Cryptography/RsaEncryptionPadding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2019 Microsoft Corp. +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -134,10 +134,52 @@ public override int GetHashCode () { int hash = Scheme.GetHashCode (); - if (Scheme == RsaEncryptionPaddingScheme.Oaep) - hash ^= OaepHashAlgorithm.GetHashCode (); + return ((hash << 5) + hash) ^ OaepHashAlgorithm.GetHashCode (); + } - return hash; + /// + /// Returns a that represents the current + /// . + /// + /// + /// Creates a string-representation of the . + /// + /// A that represents the current + /// . + public override string ToString () + { + return Scheme == RsaEncryptionPaddingScheme.Pkcs1 ? "Pkcs1" : "Oaep" + OaepHashAlgorithm.ToString (); + } + + /// + /// Compare two objects for equality. + /// + /// + /// Compares two objects for equality. + /// + /// The first object to compare. + /// The second object to compare. + /// true if and are equal; otherwise, false. + public static bool operator == (RsaEncryptionPadding left, RsaEncryptionPadding right) + { + if (ReferenceEquals (left, null)) + return ReferenceEquals (right, null); + + return left.Equals (right); + } + + /// + /// Compare two objects for inequality. + /// + /// + /// Compares two objects for inequality. + /// + /// The first object to compare. + /// The second object to compare. + /// true if and are unequal; otherwise, false. + public static bool operator != (RsaEncryptionPadding left, RsaEncryptionPadding right) + { + return !(left == right); } /// diff --git a/MimeKit/Cryptography/RsaSignaturePadding.cs b/MimeKit/Cryptography/RsaSignaturePadding.cs new file mode 100644 index 0000000000..3644e52214 --- /dev/null +++ b/MimeKit/Cryptography/RsaSignaturePadding.cs @@ -0,0 +1,153 @@ +// +// RsaSignaturePadding.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +namespace MimeKit.Cryptography { + /// + /// The RSA signature padding schemes and parameters used by S/MIME. + /// + /// + /// The RSA signature padding schemes and parameters used by S/MIME as described in + /// rfc8017. + /// + public sealed class RsaSignaturePadding : IEquatable + { + /// + /// The PKCS #1 v1.5 signature padding. + /// + public static readonly RsaSignaturePadding Pkcs1 = new RsaSignaturePadding (RsaSignaturePaddingScheme.Pkcs1); + + /// + /// The Probibilistic Signature Scheme (PSS) padding. + /// + public static readonly RsaSignaturePadding Pss = new RsaSignaturePadding (RsaSignaturePaddingScheme.Pss); + + RsaSignaturePadding (RsaSignaturePaddingScheme scheme) + { + Scheme = scheme; + } + + /// + /// Get the RSA signature padding scheme. + /// + /// + /// Gets the RSA signature padding scheme. + /// + /// The RSA signature padding scheme. + public RsaSignaturePaddingScheme Scheme { + get; private set; + } + + /// + /// Determines whether the specified is equal to the current . + /// + /// + /// Compares two RSA Signature paddings to determine if they are identical or not. + /// + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. + public bool Equals (RsaSignaturePadding other) + { + if (other == null) + return false; + + return other.Scheme == Scheme; + } + + /// + /// Determines whether the specified object is equal to the current object. + /// + /// + /// The type of comparison between the current instance and the parameter depends on whether + /// the current instance is a reference type or a value type. + /// + /// The object to compare with the current object. + /// true if the specified object is equal to the current object; otherwise, false. + public override bool Equals (object obj) + { + return Equals (obj as RsaSignaturePadding); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// Returns the hash code for this instance. + /// + /// A hash code for the current object. + public override int GetHashCode () + { + return Scheme.GetHashCode (); + } + + /// + /// Returns a that represents the current + /// . + /// + /// + /// Creates a string-representation of the . + /// + /// A that represents the current + /// . + public override string ToString () + { + return Scheme == RsaSignaturePaddingScheme.Pkcs1 ? "Pkcs1" : "Pss"; + } + + /// + /// Compare two objects for equality. + /// + /// + /// Compares two objects for equality. + /// + /// The first object to compare. + /// The second object to compare. + /// true if and are equal; otherwise, false. + public static bool operator == (RsaSignaturePadding left, RsaSignaturePadding right) + { + if (ReferenceEquals (left, null)) + return ReferenceEquals (right, null); + + return left.Equals (right); + } + + /// + /// Compare two objects for inequality. + /// + /// + /// Compares two objects for inequality. + /// + /// The first object to compare. + /// The second object to compare. + /// true if and are unequal; otherwise, false. + public static bool operator != (RsaSignaturePadding left, RsaSignaturePadding right) + { + return !(left == right); + } + } +} diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index b72c9daa60..6252be1d90 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -114,6 +114,7 @@ + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 05f21627d1..24239c43b3 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -103,6 +103,7 @@ + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 62d565ba2c..4fcc684286 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -111,6 +111,7 @@ + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 574bbef125..7f0dc4a975 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -106,6 +106,7 @@ + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index cdd8846c8b..99e0d579fb 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -96,6 +96,7 @@ + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 5c7ebaacd4..958c6d4389 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -102,6 +102,7 @@ + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 0d3aca5a1b..22624c758b 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -113,6 +113,7 @@ + diff --git a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs index 90a3669d9a..a27751c516 100644 --- a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs +++ b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs @@ -46,10 +46,10 @@ public class RsaEncryptionPaddingTests [Test] public void TestEquality () { - Assert.AreEqual (RsaEncryptionPadding.OaepSha1, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha1), "SHA-1"); - Assert.AreEqual (RsaEncryptionPadding.OaepSha256, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha256), "SHA-256"); - Assert.AreEqual (RsaEncryptionPadding.OaepSha384, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha384), "SHA-384"); - Assert.AreEqual (RsaEncryptionPadding.OaepSha512, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha512), "SHA-512"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha1, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha1), "CreateOaep(SHA-1)"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha256, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha256), "CreateOaep(SHA-256)"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha384, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha384), "CreateOaep(SHA-384)"); + Assert.AreEqual (RsaEncryptionPadding.OaepSha512, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha512), "CreateOaep(SHA-512)"); Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha1, "PKCS1 != SHA-1"); Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha256, "PKCS1 != SHA-256"); diff --git a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs new file mode 100644 index 0000000000..868eba9a94 --- /dev/null +++ b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs @@ -0,0 +1,35 @@ +// +// RsaSignaturePaddingTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2019 Microsoft Corp. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; +namespace UnitTests.Cryptography +{ + public class RsaSignaturePaddingTests + { + public RsaSignaturePaddingTests () + { + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index a228ddf726..2ec0419f8c 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -89,6 +89,7 @@ + From 00588448f0c18383adbe9b242c4db0e40f7c52f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 12:09:42 -0500 Subject: [PATCH 443/741] Added unit tests for RsaSignaturePadding --- .../Cryptography/RsaSignaturePaddingTests.cs | 75 ++++++++++++++++++- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs index 868eba9a94..ce9faeca93 100644 --- a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs +++ b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2019 Microsoft Corp. +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,13 +23,80 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // + using System; -namespace UnitTests.Cryptography -{ +using System.Reflection; +using System.Collections.Generic; + +using NUnit.Framework; + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Cms; +using Org.BouncyCastle.Asn1.Oiw; +using Org.BouncyCastle.Asn1.Nist; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.X509; + +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography { + [TestFixture] public class RsaSignaturePaddingTests { - public RsaSignaturePaddingTests () + [Test] + public void TestEquality () { + var pkcs1 = RsaSignaturePadding.Pkcs1; + var pss = RsaSignaturePadding.Pss; + + Assert.AreEqual (RsaSignaturePadding.Pkcs1, pkcs1, "Pkcs1 Equals Pkcs1"); + Assert.AreEqual (RsaSignaturePadding.Pss, pss, "Pss Equals Pss"); + + Assert.AreNotEqual (RsaSignaturePadding.Pkcs1, RsaSignaturePadding.Pss, "Pkcs1 !Equals Pss"); + Assert.AreNotEqual (RsaSignaturePadding.Pss, RsaSignaturePadding.Pkcs1, "Pss !Equals Pkcs1"); + + Assert.AreNotEqual (RsaSignaturePadding.Pkcs1, new object (), "Pkcs1 !Equals object"); + Assert.AreNotEqual (RsaSignaturePadding.Pss, new object (), "Pss !Equals object"); + + Assert.IsTrue (pkcs1 == RsaSignaturePadding.Pkcs1, "Pkcs1 == Pkcs1"); + Assert.IsTrue (pss == RsaSignaturePadding.Pss, "Pss == Pss"); + Assert.IsFalse (pkcs1 == pss, "Pkcs1 == Pss"); + Assert.IsFalse (pss == pkcs1, "Pss == Pkcs1"); + Assert.IsFalse (pkcs1 == null, "Pkcs1 == null"); + Assert.IsFalse (null == pkcs1, "null == Pkcs1"); + + Assert.IsFalse (pkcs1 != RsaSignaturePadding.Pkcs1, "Pkcs1 != Pkcs1"); + Assert.IsFalse (pss != RsaSignaturePadding.Pss, "Pss != Pss"); + Assert.IsTrue (pkcs1 != pss, "Pkcs1 != Pss"); + Assert.IsTrue (pss != pkcs1, "Pss != Pkcs1"); + Assert.IsTrue (pkcs1 != null, "Pkcs1 != null"); + Assert.IsTrue (null != pkcs1, "null != Pkcs1"); + } + + [Test] + public void TestGetHashCode () + { + var hashCodes = new Dictionary (); + + foreach (var field in typeof (RsaSignaturePadding).GetFields (BindingFlags.Public | BindingFlags.Static)) { + if (field.FieldType != typeof (RsaSignaturePadding)) + continue; + + var padding = (RsaSignaturePadding) field.GetValue (null); + int hashCode = padding.GetHashCode (); + + if (hashCodes.TryGetValue (hashCode, out var other)) + Assert.Fail ($"{padding.Scheme} shares the same hash code as {other.Scheme}"); + + hashCodes.Add (hashCode, padding); + } + } + + [Test] + public void TestToString () + { + Assert.AreEqual ("Pkcs1", RsaSignaturePadding.Pkcs1.ToString (), "Pkcs1"); + Assert.AreEqual ("Pss", RsaSignaturePadding.Pss.ToString (), "Pss"); } } } From 80a565a468831ddf00f3b81658aac3bd0839ab65 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 12:40:46 -0500 Subject: [PATCH 444/741] Added unit tests for CmsSigner.RsaSignaturePadding[Scheme] --- UnitTests/Cryptography/CmsSignerTests.cs | 74 +++++++++++++++++++ .../Cryptography/RsaEncryptionPaddingTests.cs | 31 ++++++-- 2 files changed, 99 insertions(+), 6 deletions(-) diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index d715d4aaec..a6acab8e4c 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -169,21 +169,95 @@ public void TestDefaultValues () signer = new CmsSigner (path, password); Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (string, string)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); using (var stream = File.OpenRead (path)) signer = new CmsSigner (stream, password); Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (Stream, string)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); LoadPkcs12 (path, password, out certificates, out key); signer = new CmsSigner (certificates, key); Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (chain, key)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); signer = new CmsSigner (certificates[0], key); Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (certificate, key)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); signer = new CmsSigner (new X509Certificate2 (path, password, X509KeyStorageFlags.Exportable)); Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, signer.SignerIdentifierType, "new CmsSigner (X509Certificate2)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); + } + + [Test] + public void TestSignerIdentifierType () + { + var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + List certificates; + AsymmetricKeyParameter key; + var password = "no.secret"; + CmsSigner signer; + + signer = new CmsSigner (path, password, SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, signer.SignerIdentifierType, "new CmsSigner (string, string)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); + + using (var stream = File.OpenRead (path)) + signer = new CmsSigner (stream, password, SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, signer.SignerIdentifierType, "new CmsSigner (Stream, string)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); + + LoadPkcs12 (path, password, out certificates, out key); + + signer = new CmsSigner (certificates, key, SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, signer.SignerIdentifierType, "new CmsSigner (chain, key)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); + + signer = new CmsSigner (certificates[0], key, SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, signer.SignerIdentifierType, "new CmsSigner (certificate, key)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); + + signer = new CmsSigner (new X509Certificate2 (path, password, X509KeyStorageFlags.Exportable), SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, signer.SignerIdentifierType, "new CmsSigner (X509Certificate2)"); + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "RsaSignaturePadding"); + } + + [Test] + public void TestRsaSignaturePadding () + { + var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var signer = new CmsSigner (path, "no.secret"); + + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "Default RsaSignaturePaddingScheme"); + Assert.IsNull (signer.RsaSignaturePadding, "Default RsaSignaturePadding"); + + signer.RsaSignaturePaddingScheme = RsaSignaturePaddingScheme.Pkcs1; + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme #1"); + Assert.AreEqual (RsaSignaturePadding.Pkcs1, signer.RsaSignaturePadding, "RsaSignaturePadding #1"); + + signer.RsaSignaturePaddingScheme = RsaSignaturePaddingScheme.Pss; + Assert.AreEqual (RsaSignaturePaddingScheme.Pss, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme #2"); + Assert.AreEqual (RsaSignaturePadding.Pss, signer.RsaSignaturePadding, "RsaSignaturePadding #2"); + + signer.RsaSignaturePadding = RsaSignaturePadding.Pkcs1; + Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme #3"); + Assert.AreEqual (RsaSignaturePadding.Pkcs1, signer.RsaSignaturePadding, "RsaSignaturePadding #3"); + + signer.RsaSignaturePadding = RsaSignaturePadding.Pss; + Assert.AreEqual (RsaSignaturePaddingScheme.Pss, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme #4"); + Assert.AreEqual (RsaSignaturePadding.Pss, signer.RsaSignaturePadding, "RsaSignaturePadding #4"); } } } diff --git a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs index a27751c516..be234f3e0d 100644 --- a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs +++ b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs @@ -30,14 +30,13 @@ using NUnit.Framework; -using Org.BouncyCastle.Asn1.Cms; +using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Oiw; using Org.BouncyCastle.Asn1.Nist; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using MimeKit.Cryptography; -using Org.BouncyCastle.Asn1; namespace UnitTests.Cryptography { [TestFixture] @@ -51,11 +50,21 @@ public void TestEquality () Assert.AreEqual (RsaEncryptionPadding.OaepSha384, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha384), "CreateOaep(SHA-384)"); Assert.AreEqual (RsaEncryptionPadding.OaepSha512, RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha512), "CreateOaep(SHA-512)"); - Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha1, "PKCS1 != SHA-1"); - Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha256, "PKCS1 != SHA-256"); - Assert.AreNotEqual (RsaEncryptionPadding.OaepSha1, RsaEncryptionPadding.OaepSha256, "SHA-1 != SHA-256"); + Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha1, "PKCS1 !Equals SHA-1"); + Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, RsaEncryptionPadding.OaepSha256, "PKCS1 !Equals SHA-256"); + Assert.AreNotEqual (RsaEncryptionPadding.OaepSha1, RsaEncryptionPadding.OaepSha256, "SHA-1 !Equals SHA-256"); + + Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, new object (), "PKCS1 !Equals object"); + + Assert.IsTrue (RsaEncryptionPadding.OaepSha1 == RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha1), "SHA-1 == SHA-1"); + Assert.IsFalse (RsaEncryptionPadding.OaepSha1 == RsaEncryptionPadding.OaepSha256, "SHA-1 == SHA-256"); + Assert.IsFalse (RsaEncryptionPadding.OaepSha1 == null, "SHA-1 == null"); + Assert.IsFalse (null == RsaEncryptionPadding.OaepSha1, "null == SHA-1"); - Assert.AreNotEqual (RsaEncryptionPadding.Pkcs1, new object (), "PKCS1 != object"); + Assert.IsFalse (RsaEncryptionPadding.OaepSha1 != RsaEncryptionPadding.CreateOaep (DigestAlgorithm.Sha1), "SHA-1 != SHA-1"); + Assert.IsTrue (RsaEncryptionPadding.OaepSha1 != RsaEncryptionPadding.OaepSha256, "SHA-1 != SHA-256"); + Assert.IsTrue (RsaEncryptionPadding.OaepSha1 != null, "SHA-1 != null"); + Assert.IsTrue (null != RsaEncryptionPadding.OaepSha1, "null != SHA-1"); } [Test] @@ -100,6 +109,16 @@ public void TestNotSupportedException () } } + [Test] + public void TestToString () + { + Assert.AreEqual ("Pkcs1", RsaEncryptionPadding.Pkcs1.ToString (), "Pkcs1"); + Assert.AreEqual ("OaepSha1", RsaEncryptionPadding.OaepSha1.ToString (), "OaepSha1"); + Assert.AreEqual ("OaepSha256", RsaEncryptionPadding.OaepSha256.ToString (), "OaepSha256"); + Assert.AreEqual ("OaepSha384", RsaEncryptionPadding.OaepSha384.ToString (), "OaepSha384"); + Assert.AreEqual ("OaepSha512", RsaEncryptionPadding.OaepSha512.ToString (), "OaepSha512"); + } + static void AssertOaepAlgorithmIdentifier (RsaEncryptionPadding padding, DerObjectIdentifier hashAlgorithm) { var name = $"Oaep{padding.Scheme}"; From 4c6f0c70cc6c286a674c0abebbcc7f7f442fdabc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 12:51:04 -0500 Subject: [PATCH 445/741] Added more CmsRecipient unit tests --- UnitTests/Cryptography/CmsRecipientTests.cs | 29 ++++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 67ce188f13..0eda797237 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -62,10 +62,11 @@ public void TestArgumentExceptions () static void AssertDefaultValues (CmsRecipient recipient, X509Certificate certificate) { - Assert.AreEqual (certificate, recipient.Certificate); - Assert.AreEqual (1, recipient.EncryptionAlgorithms.Length); - Assert.AreEqual (EncryptionAlgorithm.TripleDes, recipient.EncryptionAlgorithms[0]); - Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, recipient.RecipientIdentifierType); + Assert.AreEqual (certificate, recipient.Certificate, "Certificate"); + Assert.AreEqual (1, recipient.EncryptionAlgorithms.Length, "EncryptionAlgorithms"); + Assert.AreEqual (EncryptionAlgorithm.TripleDes, recipient.EncryptionAlgorithms[0], "EncryptionAlgorithm"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, recipient.RecipientIdentifierType, "RecipientIdentifierType"); + Assert.IsNull (recipient.RsaEncryptionPadding, "RsaEncryptionPadding"); } [Test] @@ -91,6 +92,26 @@ public void TestDefaultValues () AssertDefaultValues (recipient, certificate); } + [Test] + public void TestRecipientIdentifierType () + { + var path = Path.Combine ("..", "..", "TestData", "smime", "StartComCertificationAuthority.crt"); + var recipient = new CmsRecipient (path, SubjectIdentifierType.SubjectKeyIdentifier); + var certificate = recipient.Certificate; + + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, recipient.RecipientIdentifierType); + + using (var stream = File.OpenRead (path)) + recipient = new CmsRecipient (stream, SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, recipient.RecipientIdentifierType); + + recipient = new CmsRecipient (certificate, SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, recipient.RecipientIdentifierType); + + recipient = new CmsRecipient (new X509Certificate2 (File.ReadAllBytes (path)), SubjectIdentifierType.SubjectKeyIdentifier); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, recipient.RecipientIdentifierType); + } + [Test] public void TestCollectionAddRemove () { From 73f678f3cc4dfe38fa94c802bba5ccbb32bef93a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 12:54:21 -0500 Subject: [PATCH 446/741] Added another CmsSigner test --- UnitTests/Cryptography/CmsSignerTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index a6acab8e4c..814976dccc 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -243,6 +243,8 @@ public void TestRsaSignaturePadding () Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "Default RsaSignaturePaddingScheme"); Assert.IsNull (signer.RsaSignaturePadding, "Default RsaSignaturePadding"); + Assert.Throws (() => signer.RsaSignaturePaddingScheme = (RsaSignaturePaddingScheme) 555); + signer.RsaSignaturePaddingScheme = RsaSignaturePaddingScheme.Pkcs1; Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "RsaSignaturePaddingScheme #1"); Assert.AreEqual (RsaSignaturePadding.Pkcs1, signer.RsaSignaturePadding, "RsaSignaturePadding #1"); From 1ac4c3f1e21fd4363f4562335fc275bae9fcd212 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 16:29:19 -0500 Subject: [PATCH 447/741] Fixed WindowsSecureMimeContext tests --- UnitTests/Cryptography/SecureMimeTests.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 8af5fe2217..e9a2719f0c 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -1583,7 +1583,10 @@ public override void TestSecureMimeEncryptionWithAlgorithm () base.TestSecureMimeEncryptionWithAlgorithm (); } - [Test] + [TestCase (DigestAlgorithm.Sha1)] + [TestCase (DigestAlgorithm.Sha256)] + [TestCase (DigestAlgorithm.Sha384)] + [TestCase (DigestAlgorithm.Sha512)] public override void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashAlgorithm) { if (Path.DirectorySeparatorChar != '\\') From d55f568cc1dda251f577ac9436289d21934fa513 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Dec 2019 21:53:38 -0500 Subject: [PATCH 448/741] Added support for RSAES-OAEP in NetCoreApp3.0 (but didn't add NetCoreApp3.0 to the build) "Finishes" the fix for issue #528 --- MimeKit/Cryptography/CmsRecipient.cs | 2 +- MimeKit/Cryptography/RsaEncryptionPadding.cs | 24 +++++++++++++++++++ .../Cryptography/SqliteCertificateDatabase.cs | 8 +++---- .../Cryptography/WindowsSecureMimeContext.cs | 22 +++++++++++++---- MimeKit/MimeKit.NetStandard.csproj | 21 +++++++++++----- 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 9881a55d1d..e298cc7991 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -247,7 +247,7 @@ public EncryptionAlgorithm[] EncryptionAlgorithms { /// /// /// Gets or sets the padding to use for key encryption when - /// the is an RSA key. + /// the 's public key is an RSA key. /// /// The encryption padding scheme. public RsaEncryptionPadding RsaEncryptionPadding { diff --git a/MimeKit/Cryptography/RsaEncryptionPadding.cs b/MimeKit/Cryptography/RsaEncryptionPadding.cs index 4f9e72a6d4..3cb148c562 100644 --- a/MimeKit/Cryptography/RsaEncryptionPadding.cs +++ b/MimeKit/Cryptography/RsaEncryptionPadding.cs @@ -26,6 +26,10 @@ using System; +#if NETCOREAPP3_0 +using System.Security.Cryptography; +#endif + using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; @@ -223,5 +227,25 @@ internal AlgorithmIdentifier GetAlgorithmIdentifier () return new AlgorithmIdentifier (PkcsObjectIdentifiers.IdRsaesOaep, GetRsaesOaepParameters ()); } + +#if NETCOREAPP3_0 + internal RSAEncryptionPadding AsRSAEncryptionPadding () + { + switch (Scheme) { + case RsaEncryptionPaddingScheme.Oaep: + switch (OaepHashAlgorithm) { + case DigestAlgorithm.Sha1: return RSAEncryptionPadding.OaepSHA1; + case DigestAlgorithm.Sha256: return RSAEncryptionPadding.OaepSHA256; + case DigestAlgorithm.Sha384: return RSAEncryptionPadding.OaepSHA384; + case DigestAlgorithm.Sha512: return RSAEncryptionPadding.OaepSHA512; + default: return null; + } + case RsaEncryptionPaddingScheme.Pkcs1: + return RSAEncryptionPadding.Pkcs1; + default: + return null; + } + } +#endif } } diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 07779960cc..5d393137d9 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -64,11 +64,11 @@ static SqliteCertificateDatabase () IsAvailable = true; #endif -#if NETFRAMEWORK || NETSTANDARD2_0 +#if NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP3_0 var platform = Environment.OSVersion.Platform; #endif -#if NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0 +#if NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0 || NETCOREAPP3_0 try { if ((sqliteAssembly = Assembly.Load (new AssemblyName ("Microsoft.Data.Sqlite"))) != null) { sqliteConnectionClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnection"); @@ -86,7 +86,7 @@ static SqliteCertificateDatabase () } #endif -#if NETFRAMEWORK +#if NETFRAMEWORK || NETCOREAPP3_0 try { // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { @@ -108,7 +108,7 @@ static SqliteCertificateDatabase () } #endif -#if NETFRAMEWORK || NETSTANDARD2_0 +#if NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP3_0 try { if ((sqliteAssembly = Assembly.Load ("System.Data.SQLite")) != null) { sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index afae34ad53..663f20d1e2 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -258,18 +258,30 @@ RealCmsRecipientCollection GetCmsRecipients (CmsRecipientCollection recipients) var collection = new RealCmsRecipientCollection (); foreach (var recipient in recipients) { - if (recipient.RsaEncryptionPadding?.Scheme == RsaEncryptionPaddingScheme.Oaep) - throw new NotSupportedException ("The RSAES-OAEP encryption padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); - var certificate = new X509Certificate2 (recipient.Certificate.GetEncoded ()); RealSubjectIdentifierType type; + RealCmsRecipient real; if (recipient.RecipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) type = RealSubjectIdentifierType.IssuerAndSerialNumber; else type = RealSubjectIdentifierType.SubjectKeyIdentifier; - collection.Add (new RealCmsRecipient (type, certificate)); +#if NETCOREAPP3_0 + var padding = recipient.RsaEncryptionPadding?.AsRSAEncryptionPadding (); + + if (padding != null) + real = new RealCmsRecipient (type, certificate, padding); + else + real = new RealCmsRecipient (type, certificate); +#else + if (recipient.RsaEncryptionPadding?.Scheme == RsaEncryptionPaddingScheme.Oaep) + throw new NotSupportedException ("The RSAES-OAEP encryption padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); + + real = new RealCmsRecipient (type, certificate); +#endif + + collection.Add (real); } return collection; @@ -344,7 +356,7 @@ RealCmsSigner GetRealCmsSigner (RealSubjectIdentifierType type, X509Certificate2 RealCmsSigner GetRealCmsSigner (CmsSigner signer) { - if (signer.RsaSignaturePaddingScheme == RsaSignaturePaddingScheme.Pss) + if (signer.RsaSignaturePadding == RsaSignaturePadding.Pss) throw new NotSupportedException ("The RSASSA-PSS signature padding scheme is not supported by the WindowsSecureMimeContext. You must use a subclass of BouncyCastleSecureMimeContext to get this feature."); var certificate = signer.Certificate.AsX509Certificate2 (); diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 7f0dc4a975..31f21ab778 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -29,7 +29,7 @@ true - + $(DefineConstants);ENABLE_SNM @@ -44,6 +44,15 @@ + + + + + + + + + @@ -58,7 +67,7 @@ - + @@ -117,10 +126,10 @@ - - - - + + + + From 68bed6ddb0bd3032ebde00a4670e0565d3b4e5f4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 20 Dec 2019 19:25:02 -0500 Subject: [PATCH 449/741] Auto-upgrade the Sqlite X509 certificate database after adding some new columns This breaks SqlCertificateDatabase's API, but oh well. I doubt anyone was subclassing it anyway... --- .../BouncyCastleCertificateExtensions.cs | 20 +- .../BouncyCastleSecureMimeContext.cs | 18 +- .../Cryptography/IX509CertificateDatabase.cs | 4 +- .../Cryptography/NpgsqlCertificateDatabase.cs | 177 ++++++++++------ .../Cryptography/SqlCertificateDatabase.cs | 189 +++++++++++++++--- .../Cryptography/SqliteCertificateDatabase.cs | 174 ++++++++++------ .../Cryptography/X509CertificateDatabase.cs | 13 +- MimeKit/Cryptography/X509CertificateRecord.cs | 51 ++++- TODO.md | 1 + .../SqliteCertificateDatabaseTests.cs | 158 +++++++++++++++ UnitTests/TestData/smime/smimev0.db | Bin 0 -> 106496 bytes UnitTests/UnitTests.csproj | 4 +- 12 files changed, 633 insertions(+), 176 deletions(-) create mode 100644 UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs create mode 100644 UnitTests/TestData/smime/smimev0.db diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 0897813c8d..34aa56582e 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -190,6 +190,16 @@ public static string GetSubjectEmailAddress (this X509Certificate certificate) return null; } + internal static string AsHex (this byte[] blob) + { + var hex = new StringBuilder (blob.Length * 2); + + for (int i = 0; i < blob.Length; i++) + hex.Append (blob[i].ToString ("x2")); + + return hex.ToString (); + } + /// /// Gets the fingerprint of the certificate. /// @@ -208,17 +218,13 @@ public static string GetFingerprint (this X509Certificate certificate) throw new ArgumentNullException (nameof (certificate)); var encoded = certificate.GetEncoded (); - var fingerprint = new StringBuilder (); + var fingerprint = new byte[20]; var sha1 = new Sha1Digest (); - var data = new byte[20]; sha1.BlockUpdate (encoded, 0, encoded.Length); - sha1.DoFinal (data, 0); - - for (int i = 0; i < data.Length; i++) - fingerprint.Append (data[i].ToString ("x2")); + sha1.DoFinal (fingerprint, 0); - return fingerprint.ToString (); + return fingerprint.AsHex (); } /// diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 875d2d163e..d07cafc320 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -264,8 +264,10 @@ Stream Sign (CmsSigner signer, Stream content, bool encapsulate) if (signer.SignerIdentifierType == SubjectIdentifierType.SubjectKeyIdentifier) { var subjectKeyIdentifier = signer.Certificate.GetExtensionValue (X509Extensions.SubjectKeyIdentifier); - var id = (Asn1OctetString) Asn1Object.FromByteArray (subjectKeyIdentifier.GetOctets ()); - subjectKeyId = id.GetOctets (); + if (subjectKeyIdentifier != null) { + var id = (Asn1OctetString) Asn1Object.FromByteArray (subjectKeyIdentifier.GetOctets ()); + subjectKeyId = id.GetOctets (); + } } if (signer.PrivateKey is RsaKeyParameters && signer.RsaSignaturePadding == RsaSignaturePadding.Pss) { @@ -1030,16 +1032,18 @@ public RecipientInfo Generate (KeyParameter contentEncryptionKey, SecureRandom r } var encryptedKeyBytes = GenerateWrappedKey (contentEncryptionKey, keyEncryptionAlgorithm, publicKey, random); - RecipientIdentifier recipientIdentifier; + RecipientIdentifier recipientIdentifier = null; - if (recipient.RecipientIdentifierType != SubjectIdentifierType.SubjectKeyIdentifier) { - var issuerAndSerial = new IssuerAndSerialNumber (certificate.Issuer, certificate.SerialNumber.Value); - recipientIdentifier = new RecipientIdentifier (issuerAndSerial); - } else { + if (recipient.RecipientIdentifierType == SubjectIdentifierType.SubjectKeyIdentifier) { var subjectKeyIdentifier = recipient.Certificate.GetExtensionValue (X509Extensions.SubjectKeyIdentifier); recipientIdentifier = new RecipientIdentifier (subjectKeyIdentifier); } + if (recipientIdentifier == null) { + var issuerAndSerial = new IssuerAndSerialNumber (certificate.Issuer, certificate.SerialNumber.Value); + recipientIdentifier = new RecipientIdentifier (issuerAndSerial); + } + return new RecipientInfo (new KeyTransRecipientInfo (recipientIdentifier, keyEncryptionAlgorithm, new DerOctetString (encryptedKeyBytes))); } diff --git a/MimeKit/Cryptography/IX509CertificateDatabase.cs b/MimeKit/Cryptography/IX509CertificateDatabase.cs index 9c233b344d..5948285b28 100644 --- a/MimeKit/Cryptography/IX509CertificateDatabase.cs +++ b/MimeKit/Cryptography/IX509CertificateDatabase.cs @@ -101,9 +101,9 @@ public interface IX509CertificateDatabase : IX509Store, IDisposable /// /// The matching certificate records populated with the desired fields. /// The match selector or null to match all certificates. - /// true if only trusted certificates should be returned. + /// true if only trusted anchor certificates should be returned. /// The desired fields. - IEnumerable Find (IX509Selector selector, bool trustedOnly, X509CertificateRecordFields fields); + IEnumerable Find (IX509Selector selector, bool trustedAnchorsOnly, X509CertificateRecordFields fields); /// /// Add the specified certificate record. diff --git a/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs b/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs index f0a1c79ad8..1bee953df6 100644 --- a/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/NpgsqlCertificateDatabase.cs @@ -30,6 +30,7 @@ using System.Text; using System.Reflection; using System.Data.Common; +using System.Collections.Generic; namespace MimeKit.Cryptography { /// @@ -115,89 +116,149 @@ public NpgsqlCertificateDatabase (DbConnection connection, string password) : ba } /// - /// Gets the command to create the certificates table. + /// Gets the columns for the specified table. /// /// - /// Constructs the command to create a certificates table suitable for storing - /// objects. + /// Gets the list of columns for the specified table. /// - /// The . /// The . - protected override DbCommand GetCreateCertificatesTableCommand (DbConnection connection) + /// The name of the table. + /// The list of columns. + protected override IList GetTableColumns (DbConnection connection, string tableName) { - var statement = new StringBuilder ("CREATE TABLE IF NOT EXISTS CERTIFICATES("); - var columns = X509CertificateRecord.ColumnNames; - - for (int i = 0; i < columns.Length; i++) { - if (i > 0) - statement.Append (", "); - - statement.Append (columns[i]).Append (' '); - switch (columns[i]) { - case "ID": statement.Append ("serial PRIMARY KEY"); break; - case "BASICCONSTRAINTS": statement.Append ("integer NOT NULL"); break; - case "TRUSTED": statement.Append ("boolean NOT NULL"); break; - case "KEYUSAGE": statement.Append ("integer NOT NULL"); break; - case "NOTBEFORE": statement.Append ("timestamp NOT NULL"); break; - case "NOTAFTER": statement.Append ("timestamp NOT NULL"); break; - case "ISSUERNAME": statement.Append ("text NOT NULL"); break; - case "SERIALNUMBER": statement.Append ("text NOT NULL"); break; - case "SUBJECTEMAIL": statement.Append ("text "); break; - case "FINGERPRINT": statement.Append ("text NOT NULL"); break; - case "ALGORITHMS": statement.Append ("text"); break; - case "ALGORITHMSUPDATED": statement.Append ("timestamp NOT NULL"); break; - case "CERTIFICATE": statement.Append ("bytea UNIQUE NOT NULL"); break; - case "PRIVATEKEY": statement.Append ("bytea"); break; + using (var command = connection.CreateCommand ()) { + command.CommandText = $"PRAGMA table_info({tableName})"; + using (var reader = command.ExecuteReader ()) { + var columns = new List (); + + while (reader.Read ()) { + var column = new DataColumn (); + + for (int i = 0; i < reader.FieldCount; i++) { + var field = reader.GetName (i).ToUpperInvariant (); + + switch (field) { + case "NAME": + column.ColumnName = reader.GetString (i); + break; + case "TYPE": + var type = reader.GetString (i); + switch (type) { + case "boolean": column.DataType = typeof (bool); break; + case "integer": column.DataType = typeof (long); break; + case "bytea": column.DataType = typeof (byte[]); break; + case "text": column.DataType = typeof (string); break; + } + break; + case "NOTNULL": + column.AllowDBNull = !reader.GetBoolean (i); + break; + } + } + + columns.Add (column); + } + + return columns; } } + } - statement.Append (')'); + static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys) + { + statement.Append (column.ColumnName); + statement.Append (' '); + + if (column.DataType == typeof (long) || column.DataType == typeof (int)) { + if (column.AutoIncrement) + statement.Append ("serial"); + else + statement.Append ("integer"); + } else if (column.DataType == typeof (bool)) { + statement.Append ("boolean"); + } else if (column.DataType == typeof (byte[])) { + statement.Append ("bytea"); + } else if (column.DataType == typeof (string)) { + statement.Append ("text"); + } else { + throw new NotImplementedException (); + } - var command = connection.CreateCommand (); + bool isPrimaryKey = false; + if (table != null && table.PrimaryKey != null && primaryKeys < table.PrimaryKey.Length) { + for (int i = 0; i < table.PrimaryKey.Length; i++) { + if (column == table.PrimaryKey[i]) { + statement.Append (" PRIMARY KEY"); + isPrimaryKey = true; + primaryKeys++; + break; + } + } + } - command.CommandText = statement.ToString (); - command.CommandType = CommandType.Text; + if (column.Unique && !isPrimaryKey) + statement.Append (" UNIQUE"); - return command; + if (!column.AllowDBNull) + statement.Append (" NOT NULL"); } /// - /// Gets the command to create the CRLs table. + /// Create a table. /// /// - /// Constructs the command to create a CRLs table suitable for storing - /// objects. + /// Creates the specified table. /// - /// The . /// The . - protected override DbCommand GetCreateCrlsTableCommand (DbConnection connection) + /// The table. + protected override void CreateTable (DbConnection connection, DataTable table) { - var statement = new StringBuilder ("CREATE TABLE IF NOT EXISTS CRLS("); - var columns = X509CrlRecord.ColumnNames; - - for (int i = 0; i < columns.Length; i++) { - if (i > 0) - statement.Append (", "); - - statement.Append (columns[i]).Append (' '); - switch (columns[i]) { - case "ID": statement.Append ("serial PRIMARY KEY"); break; - case "DELTA" : statement.Append ("integer NOT NULL"); break; - case "ISSUERNAME": statement.Append ("text NOT NULL"); break; - case "THISUPDATE": statement.Append ("integer NOT NULL"); break; - case "NEXTUPDATE": statement.Append ("integer NOT NULL"); break; - case "CRL": statement.Append ("bytea NOT NULL"); break; - } + var statement = new StringBuilder ("CREATE TABLE IF NOT EXISTS "); + int primaryKeys = 0; + + statement.Append (table.TableName); + statement.Append ('('); + + foreach (DataColumn column in table.Columns) { + Build (statement, table, column, ref primaryKeys); + statement.Append (", "); } + if (table.Columns.Count > 0) + statement.Length -= 2; + statement.Append (')'); - var command = connection.CreateCommand (); + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } + } - command.CommandText = statement.ToString (); - command.CommandType = CommandType.Text; + /// + /// Adds a column to a table. + /// + /// + /// Adds a column to a table. + /// + /// The . + /// The table. + /// The column to add. + protected override void AddTableColumn (DbConnection connection, DataTable table, DataColumn column) + { + var statement = new StringBuilder ("ALTER TABLE "); + int primaryKeys = table.PrimaryKey?.Length ?? 0; + + statement.Append (table.TableName); + statement.Append (" ADD COLUMN "); + Build (statement, table, column, ref primaryKeys); - return command; + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } } } } diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index c0a5e713fb..fbeed1050b 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -28,6 +28,7 @@ using System.Data; using System.Text; using System.Data.Common; +using System.Collections.Generic; #if __MOBILE__ using Mono.Data.Sqlite; @@ -35,6 +36,7 @@ using System.Reflection; #endif +using Org.BouncyCastle.Asn1; using Org.BouncyCastle.X509; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.X509.Store; @@ -82,30 +84,45 @@ protected SqlCertificateDatabase (DbConnection connection, string password) : ba } /// - /// Gets the command to create the certificates table. + /// Gets the columns for the specified table. /// /// - /// Constructs the command to create a certificates table suitable for storing - /// objects. + /// Gets the list of columns for the specified table. /// - /// The . /// The . - protected abstract DbCommand GetCreateCertificatesTableCommand (DbConnection connection); + /// The name of the table. + /// The list of columns. + protected abstract IList GetTableColumns (DbConnection connection, string tableName); /// - /// Gets the command to create the CRLs table. + /// Gets the command to create a table. /// /// - /// Constructs the command to create a CRLs table suitable for storing - /// objects. + /// Constructs the command to create a table. /// - /// The . /// The . - protected abstract DbCommand GetCreateCrlsTableCommand (DbConnection connection); + /// The table. + protected abstract void CreateTable (DbConnection connection, DataTable table); + + /// + /// Adds a column to a table. + /// + /// + /// Adds a column to a table. + /// + /// The . + /// The table. + /// The column to add. + protected abstract void AddTableColumn (DbConnection connection, DataTable table, DataColumn column); + + static string GetIndexName (string tableName, string[] columnNames) + { + return string.Format ("{0}_{1}_INDEX", tableName, string.Join ("_", columnNames)); + } static void CreateIndex (DbConnection connection, string tableName, string[] columnNames) { - var indexName = string.Format ("{0}_{1}_INDEX", tableName, string.Join ("_", columnNames)); + var indexName = GetIndexName (tableName, columnNames); var query = string.Format ("CREATE INDEX IF NOT EXISTS {0} ON {1}({2})", indexName, tableName, string.Join (", ", columnNames)); using (var command = connection.CreateCommand ()) { @@ -114,23 +131,119 @@ static void CreateIndex (DbConnection connection, string tableName, string[] col } } - void CreateCertificatesTable () + static void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) { - using (var command = GetCreateCertificatesTableCommand (connection)) + var indexName = GetIndexName (tableName, columnNames); + var query = string.Format ("DROP INDEX IF EXISTS {0}", indexName); + + using (var command = connection.CreateCommand ()) { + command.CommandText = query; command.ExecuteNonQuery (); + } + } + + void CreateCertificatesTable () + { + const string tableName = "CERTIFICATES"; + + var table = new DataTable (tableName); + table.Columns.Add (new DataColumn ("ID", typeof (int)) { AutoIncrement = true }); + table.Columns.Add (new DataColumn ("TRUSTED", typeof (bool)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ANCHOR", typeof (bool)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("BASICCONSTRAINTS", typeof (int)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("KEYUSAGE", typeof (int)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("NOTBEFORE", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("NOTAFTER", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ISSUERNAME", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("SERIALNUMBER", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("SUBJECTNAME", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("SUBJECTKEYIDENTIFIER", typeof (string)) { AllowDBNull = true }); + table.Columns.Add (new DataColumn ("SUBJECTEMAIL", typeof (string)) { AllowDBNull = true }); + table.Columns.Add (new DataColumn ("FINGERPRINT", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ALGORITHMS", typeof (string)) { AllowDBNull = true }); + table.Columns.Add (new DataColumn ("ALGORITHMSUPDATED", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("CERTIFICATE", typeof (byte[])) { AllowDBNull = false, Unique = true }); + table.Columns.Add (new DataColumn ("PRIVATEKEY", typeof (byte[])) { AllowDBNull = true }); + table.PrimaryKey = new DataColumn[] { table.Columns[0] }; + + CreateTable (connection, table); + + var currentColumns = GetTableColumns (connection, tableName); + var hasAnchorColumn = false; + + for (int i = 0; i < currentColumns.Count; i++) { + // Note: ANCHOR, SUBJECTNAME and SUBJECTKEYIDENTIFIER were all added in the same version + if (currentColumns[i].ColumnName.Equals ("ANCHOR", StringComparison.Ordinal)) { + hasAnchorColumn = true; + break; + } + } + + if (!hasAnchorColumn) { + using (var transaction = connection.BeginTransaction ()) { + try { + // Note: Normally we'd want an ANCHOR column of type INTEGER NOT NULL, but we can't add a new column with a NOT NULL restriction + AddTableColumn (connection, table, new DataColumn ("ANCHOR", typeof (bool)) { AllowDBNull = true }); + + // Note: Normally we'd want a SUBJECTNAME column of type TEXT NOT NULL, but we can't add a new column with a NOT NULL restriction + AddTableColumn (connection, table, new DataColumn ("SUBJECTNAME", typeof (string)) { AllowDBNull = true }); + + AddTableColumn (connection, table, new DataColumn ("SUBJECTKEYIDENTIFIER", typeof (byte[])) { AllowDBNull = true }); + + foreach (var record in Find (null, false, X509CertificateRecordFields.Id)) { + var statement = "UPDATE CERTIFICATES SET ANCHOR = @ANCHOR, SUBJECTNAME = @SUBJECTNAME, SUBJECTKEYIDENTIFIER = @SUBJECTKEYIDENTIFIER WHERE ID = @ID"; + var command = connection.CreateCommand (); - CreateIndex (connection, "CERTIFICATES", new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); - CreateIndex (connection, "CERTIFICATES", new [] { "BASICCONSTRAINTS", "FINGERPRINT" }); - CreateIndex (connection, "CERTIFICATES", new [] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); - CreateIndex (connection, "CERTIFICATES", new [] { "TRUSTED" }); - CreateIndex (connection, "CERTIFICATES", new [] { "TRUSTED", "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); - CreateIndex (connection, "CERTIFICATES", new [] { "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + command.AddParameterWithValue ("@ID", record.Id); + command.AddParameterWithValue ("@ANCHOR", record.IsAnchor); + command.AddParameterWithValue ("@SUBJECTNAME", record.SubjectName); + command.AddParameterWithValue ("@SUBJECTKEYIDENTIFIER", record.SubjectKeyIdentifier.AsHex ()); + command.CommandType = CommandType.Text; + command.CommandText = statement; + + command.ExecuteNonQuery (); + } + + transaction.Commit (); + } catch { + transaction.Rollback (); + throw; + } + } + + // Remove some old indexes + RemoveIndex (connection, tableName, new[] { "TRUSTED" }); + RemoveIndex (connection, tableName, new[] { "TRUSTED", "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + RemoveIndex (connection, tableName, new[] { "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + } + + // Index for matching against a specific certificate + CreateIndex (connection, tableName, new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); + + // Index for searching for a certificate based on a SecureMailboxAddress + CreateIndex (connection, tableName, new [] { "BASICCONSTRAINTS", "FINGERPRINT" }); + + // Index for searching for a certificate based on a MailboxAddress + CreateIndex (connection, tableName, new [] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); + + // Index for gathering a list of Trusted Anchors + CreateIndex (connection, tableName, new [] { "TRUSTED", "ANCHOR" }); } void CreateCrlsTable () { - using (var command = GetCreateCrlsTableCommand (connection)) - command.ExecuteNonQuery (); + const string tableName = "CRLS"; + + var table = new DataTable (tableName); + table.Columns.Add (new DataColumn ("ID", typeof (int)) { AutoIncrement = true }); + table.Columns.Add (new DataColumn ("DELTA", typeof (bool)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ISSUERNAME", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("THISUPDATE", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("NEXTUPDATE", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("CRL", typeof (byte[])) { AllowDBNull = false }); + table.PrimaryKey = new DataColumn[] { table.Columns[0] }; + + CreateTable (connection, table); CreateIndex (connection, "CRLS", new [] { "ISSUERNAME" }); CreateIndex (connection, "CRLS", new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); @@ -233,10 +346,10 @@ protected override DbCommand GetSelectCommand (MailboxAddress mailbox, DateTime /// /// The database command. /// The certificate selector. - /// true if only trusted certificates should be matched; otherwise, false. + /// true if only trusted anchor certificates should be matched; otherwise, false. /// true if the certificate must have a private key; otherwise, false. /// The fields to return. - protected override DbCommand GetSelectCommand (IX509Selector selector, bool trustedOnly, bool requirePrivateKey, X509CertificateRecordFields fields) + protected override DbCommand GetSelectCommand (IX509Selector selector, bool trustedAnchorsOnly, bool requirePrivateKey, X509CertificateRecordFields fields) { var match = selector as X509CertStoreSelector; var command = connection.CreateCommand (); @@ -248,15 +361,12 @@ protected override DbCommand GetSelectCommand (IX509Selector selector, bool trus // FIXME: We could create an X509CertificateDatabaseSelector subclass of X509CertStoreSelector that // adds properties like bool Trusted, bool Anchor, and bool HasPrivateKey ? Then we could drop the // bool method arguments... - if (trustedOnly) { + if (trustedAnchorsOnly) { + query = query.Append ("TRUSTED = @TRUSTED AND ANCHOR = @ANCHOR"); command.AddParameterWithValue ("@TRUSTED", true); - query = query.Append ("TRUSTED = @TRUSTED"); + command.AddParameterWithValue ("@ANCHOR", true); } - // FIXME: This query is used to get the TrustedAnchors in DefaultSecureMimeContext. If the database - // had an ANCHOR (or ROOT?) column, that would likely improve performance a bit because we would - // protentially reduce the number of certificates we load. - if (match != null) { if (match.BasicConstraints >= 0 || match.BasicConstraints == -2) { if (command.Parameters.Count > 0) @@ -313,9 +423,24 @@ protected override DbCommand GetSelectCommand (IX509Selector selector, bool trus query = query.Append ("FINGERPRINT = @FINGERPRINT"); } - // FIXME: maybe the database should have a SUBJECTNAME column as well? Then we could match against - // selector.SubjectDN. Plus it might be nice to have when querying the database manually to see - // what's there. + if (match.Subject != null) { + if (command.Parameters.Count > 0) + query = query.Append (" AND "); + + command.AddParameterWithValue ("@SUBJECTNAME", match.Subject.ToString ()); + query = query.Append ("SUBJECTNAME = @SUBJECTNAME"); + } + + if (match.SubjectKeyIdentifier != null) { + if (command.Parameters.Count > 0) + query = query.Append (" AND "); + + var id = (Asn1OctetString) Asn1Object.FromByteArray (match.SubjectKeyIdentifier); + var subjectKeyIdentifier = id.GetOctets ().AsHex (); + + command.AddParameterWithValue ("@SUBJECTKEYIDENTIFIER", subjectKeyIdentifier); + query = query.Append ("SUBJECTKEYIDENTIFIER = @SUBJECTKEYIDENTIFIER"); + } if (match.KeyUsage != null) { var flags = BouncyCastleCertificateExtensions.GetKeyUsageFlags (match.KeyUsage); diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 5d393137d9..98e993d977 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -29,6 +29,7 @@ using System.Data; using System.Text; using System.Data.Common; +using System.Collections.Generic; #if __MOBILE__ using Mono.Data.Sqlite; @@ -223,89 +224,146 @@ public SqliteCertificateDatabase (DbConnection connection, string password) : ba } /// - /// Gets the command to create the certificates table. + /// Gets the columns for the specified table. /// /// - /// Constructs the command to create a certificates table suitable for storing - /// objects. + /// Gets the list of columns for the specified table. /// - /// The . /// The . - protected override DbCommand GetCreateCertificatesTableCommand (DbConnection connection) + /// The name of the table. + /// The list of columns. + protected override IList GetTableColumns (DbConnection connection, string tableName) { - var statement = new StringBuilder ("CREATE TABLE IF NOT EXISTS CERTIFICATES("); - var columns = X509CertificateRecord.ColumnNames; - - for (int i = 0; i < columns.Length; i++) { - if (i > 0) - statement.Append (", "); - - statement.Append (columns[i] + " "); - switch (columns[i]) { - case "ID": statement.Append ("INTEGER PRIMARY KEY AUTOINCREMENT"); break; - case "BASICCONSTRAINTS": statement.Append ("INTEGER NOT NULL"); break; - case "TRUSTED": statement.Append ("INTEGER NOT NULL"); break; - case "KEYUSAGE": statement.Append ("INTEGER NOT NULL"); break; - case "NOTBEFORE": statement.Append ("INTEGER NOT NULL"); break; - case "NOTAFTER": statement.Append ("INTEGER NOT NULL"); break; - case "ISSUERNAME": statement.Append ("TEXT NOT NULL"); break; - case "SERIALNUMBER": statement.Append ("TEXT NOT NULL"); break; - case "SUBJECTEMAIL": statement.Append ("TEXT"); break; - case "FINGERPRINT": statement.Append ("TEXT NOT NULL"); break; - case "ALGORITHMS": statement.Append ("TEXT"); break; - case "ALGORITHMSUPDATED": statement.Append ("INTEGER NOT NULL"); break; - case "CERTIFICATE": statement.Append ("BLOB UNIQUE NOT NULL"); break; - case "PRIVATEKEY": statement.Append ("BLOB"); break; + using (var command = connection.CreateCommand ()) { + command.CommandText = $"PRAGMA table_info({tableName})"; + using (var reader = command.ExecuteReader ()) { + var columns = new List (); + + while (reader.Read ()) { + var column = new DataColumn (); + + for (int i = 0; i < reader.FieldCount; i++) { + var field = reader.GetName (i).ToUpperInvariant (); + + switch (field) { + case "NAME": + column.ColumnName = reader.GetString (i); + break; + case "TYPE": + var type = reader.GetString (i); + switch (type) { + case "INTEGER": column.DataType = typeof (long); break; + case "BLOB": column.DataType = typeof (byte[]); break; + case "TEXT": column.DataType = typeof (string); break; + } + break; + case "NOTNULL": + column.AllowDBNull = !reader.GetBoolean (i); + break; + } + } + + columns.Add (column); + } + + return columns; } } + } - statement.Append (')'); + static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys) + { + statement.Append (column.ColumnName); + statement.Append (' '); + + if (column.DataType == typeof (long) || column.DataType == typeof (int) || column.DataType == typeof (bool)) { + statement.Append ("INTEGER"); + } else if (column.DataType == typeof (byte[])) { + statement.Append ("BLOB"); + } else if (column.DataType == typeof (string)) { + statement.Append ("TEXT"); + } else { + throw new NotImplementedException (); + } - var command = connection.CreateCommand (); + bool isPrimaryKey = false; + if (table != null && table.PrimaryKey != null && primaryKeys < table.PrimaryKey.Length) { + for (int i = 0; i < table.PrimaryKey.Length; i++) { + if (column == table.PrimaryKey[i]) { + statement.Append (" PRIMARY KEY"); + isPrimaryKey = true; + primaryKeys++; + break; + } + } + } - command.CommandText = statement.ToString (); - command.CommandType = CommandType.Text; + if (column.AutoIncrement) + statement.Append (" AUTOINCREMENT"); - return command; + if (column.Unique && !isPrimaryKey) + statement.Append (" UNIQUE"); + + if (!column.AllowDBNull) + statement.Append (" NOT NULL"); } /// - /// Gets the command to create the CRLs table. + /// Create a table. /// /// - /// Constructs the command to create a CRLs table suitable for storing - /// objects. + /// Creates the specified table. /// - /// The . /// The . - protected override DbCommand GetCreateCrlsTableCommand (DbConnection connection) + /// The table. + protected override void CreateTable (DbConnection connection, DataTable table) { - var statement = new StringBuilder ("CREATE TABLE IF NOT EXISTS CRLS("); - var columns = X509CrlRecord.ColumnNames; - - for (int i = 0; i < columns.Length; i++) { - if (i > 0) - statement.Append (", "); - - statement.Append (columns[i] + " "); - switch (columns[i]) { - case "ID": statement.Append ("INTEGER PRIMARY KEY AUTOINCREMENT"); break; - case "DELTA" : statement.Append ("INTEGER NOT NULL"); break; - case "ISSUERNAME": statement.Append ("TEXT NOT NULL"); break; - case "THISUPDATE": statement.Append ("INTEGER NOT NULL"); break; - case "NEXTUPDATE": statement.Append ("INTEGER NOT NULL"); break; - case "CRL": statement.Append ("BLOB NOT NULL"); break; - } + var statement = new StringBuilder ("CREATE TABLE IF NOT EXISTS "); + int primaryKeys = 0; + + statement.Append (table.TableName); + statement.Append ('('); + + foreach (DataColumn column in table.Columns) { + Build (statement, table, column, ref primaryKeys); + statement.Append (", "); } + if (table.Columns.Count > 0) + statement.Length -= 2; + statement.Append (')'); - var command = connection.CreateCommand (); + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } + } + + /// + /// Adds a column to a table. + /// + /// + /// Adds a column to a table. + /// + /// The . + /// The table. + /// The column to add. + protected override void AddTableColumn (DbConnection connection, DataTable table, DataColumn column) + { + var statement = new StringBuilder ("ALTER TABLE "); + int primaryKeys = table.PrimaryKey?.Length ?? 0; - command.CommandText = statement.ToString (); - command.CommandType = CommandType.Text; + statement.Append (table.TableName); + statement.Append (" ADD COLUMN "); + Build (statement, table, column, ref primaryKeys); - return command; + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } } } } diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 665ee0d9fb..5ef316ba77 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -385,10 +385,10 @@ protected static string[] GetColumnNames (X509CertificateRecordFields fields) /// /// The database command. /// The certificate selector. - /// true if only trusted certificates should be matched; otherwise, false. + /// true if only trusted anchor certificates should be matched; otherwise, false. /// true if the certificate must have a private key; otherwise, false. /// The fields to return. - protected abstract DbCommand GetSelectCommand (IX509Selector selector, bool trustedOnly, bool requirePrivateKey, X509CertificateRecordFields fields); + protected abstract DbCommand GetSelectCommand (IX509Selector selector, bool trustedAnchorsOnly, bool requirePrivateKey, X509CertificateRecordFields fields); /// /// Gets the column names for the specified fields. @@ -487,11 +487,14 @@ protected object GetValue (X509CertificateRecord record, string columnName) //case "ID": return record.Id; case "BASICCONSTRAINTS": return record.BasicConstraints; case "TRUSTED": return record.IsTrusted; + case "ANCHOR": return record.IsAnchor; case "KEYUSAGE": return (int) record.KeyUsage; case "NOTBEFORE": return record.NotBefore.ToUniversalTime (); case "NOTAFTER": return record.NotAfter.ToUniversalTime (); case "ISSUERNAME": return record.IssuerName; case "SERIALNUMBER": return record.SerialNumber; + case "SUBJECTNAME": return record.SubjectName; + case "SUBJECTKEYIDENTIFIER": return record.SubjectKeyIdentifier.AsHex (); case "SUBJECTEMAIL": return record.SubjectEmail != null ? record.SubjectEmail.ToLowerInvariant () : string.Empty; case "FINGERPRINT": return record.Fingerprint.ToLowerInvariant (); case "ALGORITHMS": return EncodeEncryptionAlgorithms (record.Algorithms); @@ -699,11 +702,11 @@ public IEnumerable Find (MailboxAddress mailbox, DateTime /// /// The matching certificate records populated with the desired fields. /// The match selector or null to match all certificates. - /// true if only trusted certificates should be returned. + /// true if only trusted anchor certificates should be returned. /// The desired fields. - public IEnumerable Find (IX509Selector selector, bool trustedOnly, X509CertificateRecordFields fields) + public IEnumerable Find (IX509Selector selector, bool trustedAnchorsOnly, X509CertificateRecordFields fields) { - using (var command = GetSelectCommand (selector, trustedOnly, false, fields | X509CertificateRecordFields.Certificate)) { + using (var command = GetSelectCommand (selector, trustedAnchorsOnly, false, fields | X509CertificateRecordFields.Certificate)) { using (var reader = command.ExecuteReader ()) { var parser = new X509CertificateParser (); var buffer = new byte[4096]; diff --git a/MimeKit/Cryptography/X509CertificateRecord.cs b/MimeKit/Cryptography/X509CertificateRecord.cs index 963b4ff220..007b1636b7 100644 --- a/MimeKit/Cryptography/X509CertificateRecord.cs +++ b/MimeKit/Cryptography/X509CertificateRecord.cs @@ -26,8 +26,10 @@ using System; +using Org.BouncyCastle.Asn1; using Org.BouncyCastle.X509; using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Asn1.X509; namespace MimeKit.Cryptography { /// @@ -86,13 +88,16 @@ public class X509CertificateRecord { internal static readonly string[] ColumnNames = { "ID", - "BASICCONSTRAINTS", "TRUSTED", + "ANCHOR", + "BASICCONSTRAINTS", "KEYUSAGE", "NOTBEFORE", "NOTAFTER", "ISSUERNAME", "SERIALNUMBER", + "SUBJECTNAME", + "SUBJECTKEYIDENTIFIER", "SUBJECTEMAIL", "FINGERPRINT", "ALGORITHMS", @@ -129,6 +134,15 @@ public class X509CertificateRecord /// true if the certificate is trusted; otherwise, false. public bool IsTrusted { get; set; } + /// + /// Gets whether or not the certificate is an anchor. + /// + /// + /// Gets whether or not the certificate is an anchor. + /// + /// true if the certificate is an anchor; otherwise, false. + public bool IsAnchor { get { return Certificate.IsSelfSigned (); } } + /// /// Gets the key usage flags for the certificate. /// @@ -157,12 +171,12 @@ public class X509CertificateRecord public DateTime NotAfter { get { return Certificate.NotAfter.ToUniversalTime (); } } /// - /// Gets the certificate issuer's name. + /// Gets the certificate's issuer name. /// /// - /// Gets the certificate issuer's name. + /// Gets the certificate's issuer name. /// - /// The issuer's name. + /// The certificate's issuer name. public string IssuerName { get { return Certificate.IssuerDN.ToString (); } } /// @@ -174,6 +188,35 @@ public class X509CertificateRecord /// The serial number. public string SerialNumber { get { return Certificate.SerialNumber.ToString (); } } + /// + /// Gets the certificate's subject name. + /// + /// + /// Gets the certificate's subject name. + /// + /// The certificate's subject name. + public string SubjectName { get { return Certificate.SubjectDN.ToString (); } } + + /// + /// Gets the certificate's subject key identifier. + /// + /// + /// Gets the certificate's subject key identifier. + /// + /// The certificate's subject key identifier. + public byte[] SubjectKeyIdentifier { + get { + var subjectKeyIdentifier = Certificate.GetExtensionValue (X509Extensions.SubjectKeyIdentifier); + + if (subjectKeyIdentifier != null) { + var id = (Asn1OctetString) Asn1Object.FromByteArray (subjectKeyIdentifier.GetOctets ()); + return id.GetOctets (); + } + + return null; + } + } + /// /// Gets the subject email address. /// diff --git a/TODO.md b/TODO.md index 06d7bb101a..7b0f203618 100644 --- a/TODO.md +++ b/TODO.md @@ -13,6 +13,7 @@ * Add an ANCHOR/ROOT table column to the SQL database to optimize searches for Trusted Anchors. * Add a SUBJECTNAME table column to the SQL database? + * Add a SUBJECTKEYIDENTIFIER table column to the SQL database? * Add a RECORDVERSION table column to the SQL database so we can add columns in the future and work around gaps in the row data? diff --git a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs new file mode 100644 index 0000000000..618804d7b2 --- /dev/null +++ b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs @@ -0,0 +1,158 @@ +// +// SqliteCertificateDatabaseTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; + +using NUnit.Framework; + +using Org.BouncyCastle.X509; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.X509.Store; +using Org.BouncyCastle.Utilities.Date; + +using MimeKit.Cryptography; + +namespace UnitTests.Cryptography { + [TestFixture] + public class SqliteCertificateDatabaseTests + { + static readonly string[] StartComCertificates = { + "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" + }; + + readonly X509Certificate[] chain; + readonly string dataDir; + + public SqliteCertificateDatabaseTests () + { + dataDir = Path.Combine ("..", "..", "TestData", "smime"); + var path = Path.Combine (dataDir, "smime.pfx"); + + if (File.Exists ("sqlite.db")) + File.Delete ("sqlite.db"); + + chain = SecureMimeTestsBase.LoadPkcs12CertificateChain (path, "no.secret"); + + using (var ctx = new DefaultSecureMimeContext ("sqlite.db", "no.secret")) { + foreach (var filename in StartComCertificates) { + path = Path.Combine (dataDir, filename); + using (var stream = File.OpenRead (path)) + ctx.Import (stream, true); + } + + path = Path.Combine (dataDir, "smime.pfx"); + ctx.Import (path, "no.secret"); + } + } + + [Test] + public void TestAutoUpgrade () + { + var path = Path.Combine (dataDir, "smimev0.db"); + const string tmp = "smimev0-tmp.db"; + + if (File.Exists (tmp)) + File.Delete (tmp); + + File.Copy (path, tmp); + + using (var dbase = new SqliteCertificateDatabase (tmp, "no.secret")) { + var root = chain[chain.Length - 1]; + + // Verify that we can select the Root Certificate + bool trustedAnchor = false; + foreach (var record in dbase.Find (null, true, X509CertificateRecordFields.Certificate)) { + if (record.Certificate.Equals (root)) { + trustedAnchor = true; + break; + } + } + + Assert.IsTrue (trustedAnchor, "Did not find the MimeKit UnitTests trusted anchor"); + } + } + + void AssertFindBy (IX509Selector selector, X509Certificate expected) + { + using (var dbase = new SqliteCertificateDatabase ("sqlite.db", "no.secret")) { + // Verify that we can select the Root Certificate + bool found = false; + foreach (var record in dbase.Find (selector, false, X509CertificateRecordFields.Certificate)) { + if (record.Certificate.Equals (expected)) { + found = true; + break; + } + } + + Assert.IsTrue (found, "Did not find the expected certificate"); + } + } + + [Test] + public void TestFindByBasicConstraints () + { + foreach (var certificate in chain) { + var basicConstraints = certificate.GetBasicConstraints (); + if (basicConstraints == -1) + basicConstraints = -2; + + var selector = new X509CertStoreSelector (); + selector.BasicConstraints = basicConstraints; + + AssertFindBy (selector, certificate); + } + } + + [Test] + public void TestFindByCertificateValid () + { + var selector = new X509CertStoreSelector (); + selector.CertificateValid = new DateTimeObject (chain[0].NotBefore.AddDays (10)); + + AssertFindBy (selector, chain[0]); + } + + [Test] + public void TestFindBySubjectName () + { + var selector = new X509CertStoreSelector (); + selector.Subject = chain[0].SubjectDN; + + AssertFindBy (selector, chain[0]); + } + + [Test] + public void TestFindBySubjectKeyIdentifier () + { + var subjectKeyIdentifier = chain[0].GetExtensionValue (X509Extensions.SubjectKeyIdentifier); + var selector = new X509CertStoreSelector (); + selector.SubjectKeyIdentifier = subjectKeyIdentifier.GetOctets (); + + AssertFindBy (selector, chain[0]); + } + } +} diff --git a/UnitTests/TestData/smime/smimev0.db b/UnitTests/TestData/smime/smimev0.db new file mode 100644 index 0000000000000000000000000000000000000000..a32142514912a6bffbe342c6870406da15107c5f GIT binary patch literal 106496 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 literal 0 HcmV?d00001 diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 2ec0419f8c..a8938e8d11 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -92,6 +92,7 @@ + @@ -242,7 +243,6 @@ - @@ -253,8 +253,6 @@ - - From 582d2d40293f6e6f5a71826bde0f3823b7085967 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 20 Dec 2019 21:30:08 -0500 Subject: [PATCH 450/741] code cleanup and some optimizations --- .../Cryptography/DefaultSecureMimeContext.cs | 6 +- .../Cryptography/SqlCertificateDatabase.cs | 142 ++++++++++-------- .../Cryptography/SqliteCertificateDatabase.cs | 9 +- MimeKit/Cryptography/X509CertificateRecord.cs | 28 +--- MimeKit/Cryptography/X509CrlRecord.cs | 9 -- 5 files changed, 88 insertions(+), 106 deletions(-) diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index f5df288a56..f8d30ba71c 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -290,10 +290,8 @@ protected override Org.BouncyCastle.Utilities.Collections.HashSet GetTrustedAnch keyUsage[(int) X509KeyUsageBits.KeyCertSign] = true; selector.KeyUsage = keyUsage; - foreach (var record in dbase.Find (selector, true, X509CertificateRecordFields.Certificate)) { - if (record.Certificate.IsSelfSigned ()) - anchors.Add (new TrustAnchor (record.Certificate, null)); - } + foreach (var record in dbase.Find (selector, true, X509CertificateRecordFields.Certificate)) + anchors.Add (new TrustAnchor (record.Certificate, null)); return anchors; } diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index fbeed1050b..6f886ebc2f 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -53,6 +53,7 @@ namespace MimeKit.Cryptography { /// public abstract class SqlCertificateDatabase : X509CertificateDatabase { + readonly DataTable certificatesTable, crlsTable; readonly DbConnection connection; bool disposed; @@ -79,8 +80,50 @@ protected SqlCertificateDatabase (DbConnection connection, string password) : ba if (connection.State != ConnectionState.Open) connection.Open (); - CreateCertificatesTable (); - CreateCrlsTable (); + certificatesTable = CreateCertificatesDataTable ("CERTIFICATES"); + crlsTable = CreateCrlsDataTable ("CRLS"); + + CreateCertificatesTable (certificatesTable); + CreateCrlsTable (crlsTable); + } + + static DataTable CreateCertificatesDataTable (string tableName) + { + var table = new DataTable (tableName); + table.Columns.Add (new DataColumn ("ID", typeof (int)) { AutoIncrement = true }); + table.Columns.Add (new DataColumn ("TRUSTED", typeof (bool)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ANCHOR", typeof (bool)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("BASICCONSTRAINTS", typeof (int)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("KEYUSAGE", typeof (int)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("NOTBEFORE", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("NOTAFTER", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ISSUERNAME", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("SERIALNUMBER", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("SUBJECTNAME", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("SUBJECTKEYIDENTIFIER", typeof (string)) { AllowDBNull = true }); + table.Columns.Add (new DataColumn ("SUBJECTEMAIL", typeof (string)) { AllowDBNull = true }); + table.Columns.Add (new DataColumn ("FINGERPRINT", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ALGORITHMS", typeof (string)) { AllowDBNull = true }); + table.Columns.Add (new DataColumn ("ALGORITHMSUPDATED", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("CERTIFICATE", typeof (byte[])) { AllowDBNull = false, Unique = true }); + table.Columns.Add (new DataColumn ("PRIVATEKEY", typeof (byte[])) { AllowDBNull = true }); + table.PrimaryKey = new DataColumn[] { table.Columns[0] }; + + return table; + } + + static DataTable CreateCrlsDataTable (string tableName) + { + var table = new DataTable (tableName); + table.Columns.Add (new DataColumn ("ID", typeof (int)) { AutoIncrement = true }); + table.Columns.Add (new DataColumn ("DELTA", typeof (bool)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("ISSUERNAME", typeof (string)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("THISUPDATE", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("NEXTUPDATE", typeof (long)) { AllowDBNull = false }); + table.Columns.Add (new DataColumn ("CRL", typeof (byte[])) { AllowDBNull = false }); + table.PrimaryKey = new DataColumn[] { table.Columns[0] }; + + return table; } /// @@ -142,55 +185,35 @@ static void RemoveIndex (DbConnection connection, string tableName, string[] col } } - void CreateCertificatesTable () + void CreateCertificatesTable (DataTable table) { - const string tableName = "CERTIFICATES"; - - var table = new DataTable (tableName); - table.Columns.Add (new DataColumn ("ID", typeof (int)) { AutoIncrement = true }); - table.Columns.Add (new DataColumn ("TRUSTED", typeof (bool)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("ANCHOR", typeof (bool)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("BASICCONSTRAINTS", typeof (int)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("KEYUSAGE", typeof (int)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("NOTBEFORE", typeof (long)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("NOTAFTER", typeof (long)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("ISSUERNAME", typeof (string)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("SERIALNUMBER", typeof (string)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("SUBJECTNAME", typeof (string)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("SUBJECTKEYIDENTIFIER", typeof (string)) { AllowDBNull = true }); - table.Columns.Add (new DataColumn ("SUBJECTEMAIL", typeof (string)) { AllowDBNull = true }); - table.Columns.Add (new DataColumn ("FINGERPRINT", typeof (string)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("ALGORITHMS", typeof (string)) { AllowDBNull = true }); - table.Columns.Add (new DataColumn ("ALGORITHMSUPDATED", typeof (long)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("CERTIFICATE", typeof (byte[])) { AllowDBNull = false, Unique = true }); - table.Columns.Add (new DataColumn ("PRIVATEKEY", typeof (byte[])) { AllowDBNull = true }); - table.PrimaryKey = new DataColumn[] { table.Columns[0] }; - CreateTable (connection, table); - var currentColumns = GetTableColumns (connection, tableName); - var hasAnchorColumn = false; + var currentColumns = GetTableColumns (connection, table.TableName); + bool hasAnchorColumn = false; for (int i = 0; i < currentColumns.Count; i++) { - // Note: ANCHOR, SUBJECTNAME and SUBJECTKEYIDENTIFIER were all added in the same version if (currentColumns[i].ColumnName.Equals ("ANCHOR", StringComparison.Ordinal)) { hasAnchorColumn = true; break; } } + // Note: The ANCHOR, SUBJECTNAME and SUBJECTKEYIDENTIFIER columns were all added in the same version, + // so if the ANCHOR column is missing, they all are. if (!hasAnchorColumn) { using (var transaction = connection.BeginTransaction ()) { try { - // Note: Normally we'd want an ANCHOR column of type INTEGER NOT NULL, but we can't add a new column with a NOT NULL restriction - AddTableColumn (connection, table, new DataColumn ("ANCHOR", typeof (bool)) { AllowDBNull = true }); + var column = table.Columns[table.Columns.IndexOf ("ANCHOR")]; + AddTableColumn (connection, table, column); - // Note: Normally we'd want a SUBJECTNAME column of type TEXT NOT NULL, but we can't add a new column with a NOT NULL restriction - AddTableColumn (connection, table, new DataColumn ("SUBJECTNAME", typeof (string)) { AllowDBNull = true }); + column = table.Columns[table.Columns.IndexOf ("SUBJECTNAME")]; + AddTableColumn (connection, table, column); - AddTableColumn (connection, table, new DataColumn ("SUBJECTKEYIDENTIFIER", typeof (byte[])) { AllowDBNull = true }); + column = table.Columns[table.Columns.IndexOf ("SUBJECTKEYIDENTIFIER")]; + AddTableColumn (connection, table, column); - foreach (var record in Find (null, false, X509CertificateRecordFields.Id)) { + foreach (var record in Find (null, false, X509CertificateRecordFields.Id | X509CertificateRecordFields.Certificate)) { var statement = "UPDATE CERTIFICATES SET ANCHOR = @ANCHOR, SUBJECTNAME = @SUBJECTNAME, SUBJECTKEYIDENTIFIER = @SUBJECTKEYIDENTIFIER WHERE ID = @ID"; var command = connection.CreateCommand (); @@ -212,41 +235,32 @@ void CreateCertificatesTable () } // Remove some old indexes - RemoveIndex (connection, tableName, new[] { "TRUSTED" }); - RemoveIndex (connection, tableName, new[] { "TRUSTED", "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); - RemoveIndex (connection, tableName, new[] { "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + RemoveIndex (connection, table.TableName, new[] { "TRUSTED" }); + RemoveIndex (connection, table.TableName, new[] { "TRUSTED", "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "FINGERPRINT" }); + RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); } // Index for matching against a specific certificate - CreateIndex (connection, tableName, new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); + CreateIndex (connection, table.TableName, new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); // Index for searching for a certificate based on a SecureMailboxAddress - CreateIndex (connection, tableName, new [] { "BASICCONSTRAINTS", "FINGERPRINT" }); + CreateIndex (connection, table.TableName, new [] { "BASICCONSTRAINTS", "FINGERPRINT", "NOTBEFORE", "NOTAFTER" }); // Index for searching for a certificate based on a MailboxAddress - CreateIndex (connection, tableName, new [] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); + CreateIndex (connection, table.TableName, new [] { "BASICCONSTRAINTS", "SUBJECTEMAIL", "NOTBEFORE", "NOTAFTER" }); // Index for gathering a list of Trusted Anchors - CreateIndex (connection, tableName, new [] { "TRUSTED", "ANCHOR" }); + CreateIndex (connection, table.TableName, new [] { "TRUSTED", "ANCHOR", "KEYUSAGE" }); } - void CreateCrlsTable () + void CreateCrlsTable (DataTable table) { - const string tableName = "CRLS"; - - var table = new DataTable (tableName); - table.Columns.Add (new DataColumn ("ID", typeof (int)) { AutoIncrement = true }); - table.Columns.Add (new DataColumn ("DELTA", typeof (bool)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("ISSUERNAME", typeof (string)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("THISUPDATE", typeof (long)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("NEXTUPDATE", typeof (long)) { AllowDBNull = false }); - table.Columns.Add (new DataColumn ("CRL", typeof (byte[])) { AllowDBNull = false }); - table.PrimaryKey = new DataColumn[] { table.Columns[0] }; - CreateTable (connection, table); - CreateIndex (connection, "CRLS", new [] { "ISSUERNAME" }); - CreateIndex (connection, "CRLS", new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); + CreateIndex (connection, table.TableName, new [] { "ISSUERNAME" }); + CreateIndex (connection, table.TableName, new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); } static StringBuilder CreateSelectQuery (X509CertificateRecordFields fields) @@ -581,17 +595,17 @@ protected override DbCommand GetDeleteCommand (X509CrlRecord record) protected override DbCommand GetInsertCommand (X509CertificateRecord record) { var statement = new StringBuilder ("INSERT INTO CERTIFICATES("); - var columns = X509CertificateRecord.ColumnNames; var variables = new StringBuilder ("VALUES("); var command = connection.CreateCommand (); + var columns = certificatesTable.Columns; - for (int i = 1; i < columns.Length; i++) { + for (int i = 1; i < columns.Count; i++) { if (i > 1) { statement.Append (", "); variables.Append (", "); } - var value = GetValue (record, columns[i]); + var value = GetValue (record, columns[i].ColumnName); var variable = "@" + columns[i]; command.AddParameterWithValue (variable, value); @@ -620,16 +634,16 @@ protected override DbCommand GetInsertCommand (X509CrlRecord record) { var statement = new StringBuilder ("INSERT INTO CRLS("); var variables = new StringBuilder ("VALUES("); - var columns = X509CrlRecord.ColumnNames; var command = connection.CreateCommand (); + var columns = crlsTable.Columns; - for (int i = 1; i < columns.Length; i++) { + for (int i = 1; i < columns.Count; i++) { if (i > 1) { statement.Append (", "); variables.Append (", "); } - var value = GetValue (record, columns[i]); + var value = GetValue (record, columns[i].ColumnName); var variable = "@" + columns[i]; command.AddParameterWithValue (variable, value); @@ -695,11 +709,11 @@ protected override DbCommand GetUpdateCommand (X509CertificateRecord record, X50 protected override DbCommand GetUpdateCommand (X509CrlRecord record) { var statement = new StringBuilder ("UPDATE CRLS SET "); - var columns = X509CrlRecord.ColumnNames; var command = connection.CreateCommand (); + var columns = crlsTable.Columns; - for (int i = 1; i < columns.Length; i++) { - var value = GetValue (record, columns[i]); + for (int i = 1; i < columns.Count; i++) { + var value = GetValue (record, columns[i].ColumnName); var variable = "@" + columns[i]; if (i > 1) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 98e993d977..3df792f3d6 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -271,7 +271,7 @@ protected override IList GetTableColumns (DbConnection connection, s } } - static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys) + static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys, bool create) { statement.Append (column.ColumnName); statement.Append (' '); @@ -304,7 +304,8 @@ static void Build (StringBuilder statement, DataTable table, DataColumn column, if (column.Unique && !isPrimaryKey) statement.Append (" UNIQUE"); - if (!column.AllowDBNull) + // Note: Normally we'd want to include NOT NULL, but we can't *add* new columns with the NOT NULL restriction + if (create && !column.AllowDBNull) statement.Append (" NOT NULL"); } @@ -325,7 +326,7 @@ protected override void CreateTable (DbConnection connection, DataTable table) statement.Append ('('); foreach (DataColumn column in table.Columns) { - Build (statement, table, column, ref primaryKeys); + Build (statement, table, column, ref primaryKeys, true); statement.Append (", "); } @@ -357,7 +358,7 @@ protected override void AddTableColumn (DbConnection connection, DataTable table statement.Append (table.TableName); statement.Append (" ADD COLUMN "); - Build (statement, table, column, ref primaryKeys); + Build (statement, table, column, ref primaryKeys, false); using (var command = connection.CreateCommand ()) { command.CommandText = statement.ToString (); diff --git a/MimeKit/Cryptography/X509CertificateRecord.cs b/MimeKit/Cryptography/X509CertificateRecord.cs index 007b1636b7..e64aa6ab10 100644 --- a/MimeKit/Cryptography/X509CertificateRecord.cs +++ b/MimeKit/Cryptography/X509CertificateRecord.cs @@ -86,26 +86,6 @@ public enum X509CertificateRecordFields { /// public class X509CertificateRecord { - internal static readonly string[] ColumnNames = { - "ID", - "TRUSTED", - "ANCHOR", - "BASICCONSTRAINTS", - "KEYUSAGE", - "NOTBEFORE", - "NOTAFTER", - "ISSUERNAME", - "SERIALNUMBER", - "SUBJECTNAME", - "SUBJECTKEYIDENTIFIER", - "SUBJECTEMAIL", - "FINGERPRINT", - "ALGORITHMS", - "ALGORITHMSUPDATED", - "CERTIFICATE", - "PRIVATEKEY" - }; - /// /// Gets the identifier. /// @@ -208,12 +188,10 @@ public byte[] SubjectKeyIdentifier { get { var subjectKeyIdentifier = Certificate.GetExtensionValue (X509Extensions.SubjectKeyIdentifier); - if (subjectKeyIdentifier != null) { - var id = (Asn1OctetString) Asn1Object.FromByteArray (subjectKeyIdentifier.GetOctets ()); - return id.GetOctets (); - } + if (subjectKeyIdentifier != null) + subjectKeyIdentifier = (Asn1OctetString) Asn1Object.FromByteArray (subjectKeyIdentifier.GetOctets ()); - return null; + return subjectKeyIdentifier?.GetOctets (); } } diff --git a/MimeKit/Cryptography/X509CrlRecord.cs b/MimeKit/Cryptography/X509CrlRecord.cs index 29ac942559..80091a79ab 100644 --- a/MimeKit/Cryptography/X509CrlRecord.cs +++ b/MimeKit/Cryptography/X509CrlRecord.cs @@ -78,15 +78,6 @@ public enum X509CrlRecordFields { /// public class X509CrlRecord { - internal static readonly string[] ColumnNames = { - "ID", - "DELTA", - "ISSUERNAME", - "THISUPDATE", - "NEXTUPDATE", - "CRL" - }; - /// /// Gets the identifier. /// From bba53bc53600e3a301575d12451a734574249898 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 21 Dec 2019 08:49:40 -0500 Subject: [PATCH 451/741] Fixed the unit tests for WindowsSecureMimeContext --- MimeKit/Cryptography/SqlCertificateDatabase.cs | 2 ++ TODO.md | 4 ---- UnitTests/Cryptography/SecureMimeTests.cs | 12 ++++++++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index 6f886ebc2f..e784f2920f 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -242,6 +242,8 @@ void CreateCertificatesTable (DataTable table) RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); } + // Note: Use "EXPLAIN QUERY PLAN SELECT ... FROM CERTIFICATES WHERE ..." to verify that any indexes we create get used as expected. + // Index for matching against a specific certificate CreateIndex (connection, table.TableName, new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); diff --git a/TODO.md b/TODO.md index 7b0f203618..a8f4da4219 100644 --- a/TODO.md +++ b/TODO.md @@ -10,10 +10,6 @@ * S/MIME * BouncyCastleSecureMimeContext * Add support for downloading CRLs via FTP? Is this needed or at all common? - * Add an ANCHOR/ROOT table column to the SQL database to optimize searches - for Trusted Anchors. - * Add a SUBJECTNAME table column to the SQL database? - * Add a SUBJECTKEYIDENTIFIER table column to the SQL database? * Add a RECORDVERSION table column to the SQL database so we can add columns in the future and work around gaps in the row data? diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index e9a2719f0c..ad634fa394 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -677,7 +677,7 @@ public virtual void TestSecureMimeSigningWithContextAndCmsSigner () public virtual void TestSecureMimeSigningWithRsaSsaPss () { var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret") { - RsaSignaturePaddingScheme = RsaSignaturePaddingScheme.Pss + RsaSignaturePadding = RsaSignaturePadding.Pss }; var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; @@ -1118,7 +1118,15 @@ public virtual void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashA recipient.RsaEncryptionPadding = RsaEncryptionPadding.CreateOaep (hashAlgorithm); recipients.Add (recipient); - var encrypted = ApplicationPkcs7Mime.Encrypt (ctx, recipients, body); + ApplicationPkcs7Mime encrypted; + + try { + encrypted = ApplicationPkcs7Mime.Encrypt (ctx, recipients, body); + } catch (NotSupportedException) { + if (!(ctx is WindowsSecureMimeContext)) + Assert.Fail ("RSAES-OAEP should be supported."); + return; + } Assert.AreEqual (SecureMimeType.EnvelopedData, encrypted.SecureMimeType, "S/MIME type did not match."); From 022e1a0308eba9b733f4af38c4e1c21140427c54 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 21 Dec 2019 09:27:13 -0500 Subject: [PATCH 452/741] Fixed the build for netstandard1.3 and netstandard1.6 --- .../Cryptography/SqlCertificateDatabase.cs | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index e784f2920f..a16b7b0c7f 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -87,6 +87,77 @@ protected SqlCertificateDatabase (DbConnection connection, string password) : ba CreateCrlsTable (crlsTable); } +#if NETSTANDARD1_3 || NETSTANDARD1_6 +#pragma warning disable 1591 + protected class DataColumn + { + public DataColumn (string columnName, Type dataType) + { + ColumnName = columnName; + DataType = dataType; + } + + public DataColumn () + { + } + + public bool AllowDBNull { + get; set; + } + + public bool AutoIncrement { + get; set; + } + + public string ColumnName { + get; set; + } + + public Type DataType { + get; set; + } + + public bool Unique { + get; set; + } + } + + protected class DataColumnCollection : List + { + public int IndexOf (string columnName) + { + for (int i = 0; i < Count; i++) { + if (this[i].ColumnName.Equals (columnName, StringComparison.Ordinal)) + return i; + } + + return -1; + } + } + + protected class DataTable + { + public DataTable (string tableName) + { + Columns = new DataColumnCollection (); + TableName = tableName; + } + + public string TableName { + get; set; + } + + public DataColumnCollection Columns { + get; private set; + } + + public DataColumn[] PrimaryKey { + get; set; + } + } +#pragma warning restore 1591 +#endif + static DataTable CreateCertificatesDataTable (string tableName) { var table = new DataTable (tableName); From 19275d7c0e2a267523e3fccc40dfc6b128264f76 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 22 Dec 2019 09:39:44 -0500 Subject: [PATCH 453/741] Added RFC's for S/MIME v4.0 and added recognition of authEnvelopedData Note: Handling of authEnvelopedData is not implemented, only recognized. --- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 1 + MimeKit/Cryptography/SecureMimeType.cs | 17 +- RFCs.md | 2 + rfc/rfc8550.txt | 1571 ++++++++ rfc/rfc8551.txt | 3531 ++++++++++++++++++ 5 files changed, 5116 insertions(+), 6 deletions(-) create mode 100644 rfc/rfc8550.txt create mode 100644 rfc/rfc8551.txt diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index 6e6d88a9c5..5b0e310dca 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -127,6 +127,7 @@ public SecureMimeType SecureMimeType { return SecureMimeType.Unknown; switch (type.ToLowerInvariant ()) { + case "authenveloped-data": return SecureMimeType.AuthEnvelopedData; case "compressed-data": return SecureMimeType.CompressedData; case "enveloped-data": return SecureMimeType.EnvelopedData; case "signed-data": return SecureMimeType.SignedData; diff --git a/MimeKit/Cryptography/SecureMimeType.cs b/MimeKit/Cryptography/SecureMimeType.cs index 52c912a5ef..3fff145934 100644 --- a/MimeKit/Cryptography/SecureMimeType.cs +++ b/MimeKit/Cryptography/SecureMimeType.cs @@ -33,28 +33,33 @@ namespace MimeKit.Cryptography { /// public enum SecureMimeType { /// - /// S/MIME compressed data. + /// The S/MIME data type is unknown. + /// + Unknown = -1, + + /// + /// The S/MIME content is compressed. /// CompressedData, /// - /// S/MIME enveloped data. + /// The S/MIME content is encrypted. /// EnvelopedData, /// - /// S/MIME signed data. + /// The S/MIME content is signed. /// SignedData, /// - /// S/MIME certificate data. + /// The S/MIME content contains only certificates. /// CertsOnly, /// - /// The S/MIME data type is unknown. + /// The S/MIME content is both signed and encrypted. /// - Unknown + AuthEnvelopedData, } } diff --git a/RFCs.md b/RFCs.md index c00a70f1f7..500676104f 100644 --- a/RFCs.md +++ b/RFCs.md @@ -67,3 +67,5 @@ MimeKit implements the following IETF specifications defining Internet Mail and * [6577](http://www.ietf.org/rfc/rfc6577.txt): Authentication-Results Registration Update for Sender Policy Framework (SPF) Results * [7103](http://www.ietf.org/rfc/rfc7103.txt): Advice for Safe Handling of Malformed Messages * [7410](http://www.ietf.org/rfc/rfc7410.txt): A Property Types Registry for the Authentication-Results Header Field +* [8550](http://www.ietf.org/rfc/rfc8550.txt): S/MIME Version 4.0 Certificate Handling (Obsoletes rfc5750) +* [8551](http://www.ietf.org/rfc/rfc8551.txt): S/MIME Version 4.0 Message Specification (Obsoletes rfc5751) diff --git a/rfc/rfc8550.txt b/rfc/rfc8550.txt new file mode 100644 index 0000000000..f143190781 --- /dev/null +++ b/rfc/rfc8550.txt @@ -0,0 +1,1571 @@ + + + + + + +Internet Engineering Task Force (IETF) J. Schaad +Request for Comments: 8550 August Cellars +Obsoletes: 5750 B. Ramsdell +Category: Standards Track Brute Squad Labs, Inc. +ISSN: 2070-1721 S. Turner + sn3rd + April 2019 + + + Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 + Certificate Handling + +Abstract + + This document specifies conventions for X.509 certificate usage by + Secure/Multipurpose Internet Mail Extensions (S/MIME) v4.0 agents. + S/MIME provides a method to send and receive secure MIME messages, + and certificates are an integral part of S/MIME agent processing. + S/MIME agents validate certificates as described in RFC 5280 + ("Internet X.509 Public Key Infrastructure Certificate and + Certificate Revocation List (CRL) Profile"). S/MIME agents must meet + the certificate-processing requirements in this document as well as + those in RFC 5280. This document obsoletes RFC 5750. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8550. + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 1] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +Copyright Notice + + Copyright (c) 2019 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + This document may contain material from IETF Documents or IETF + Contributions published or made publicly available before November + 10, 2008. The person(s) controlling the copyright in some of this + material may not have granted the IETF Trust the right to allow + modifications of such material outside the IETF Standards Process. + Without obtaining an adequate license from the person(s) controlling + the copyright in such materials, this document may not be modified + outside the IETF Standards Process, and derivative works of it may + not be created outside the IETF Standards Process, except to format + it for publication as an RFC or to translate it into languages other + than English. + + + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 2] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 + 1.1. Definitions . . . . . . . . . . . . . . . . . . . . . . . 4 + 1.2. Conventions Used in This Document . . . . . . . . . . . . 5 + 1.3. Compatibility with Prior Practice of S/MIME . . . . . . . 6 + 1.4. Changes from S/MIME v3 to S/MIME v3.1 . . . . . . . . . . 6 + 1.5. Changes from S/MIME v3.1 to S/MIME v3.2 . . . . . . . . . 7 + 1.6. Changes since S/MIME 3.2 . . . . . . . . . . . . . . . . 8 + 2. CMS Options . . . . . . . . . . . . . . . . . . . . . . . . . 8 + 2.1. Certificate Revocation Lists . . . . . . . . . . . . . . 9 + 2.2. Certificate Choices . . . . . . . . . . . . . . . . . . . 9 + 2.2.1. Historical Note about CMS Certificates . . . . . . . 9 + 2.3. Included Certificates . . . . . . . . . . . . . . . . . . 10 + 3. Using Distinguished Names for Internet Mail . . . . . . . . . 11 + 4. Certificate Processing . . . . . . . . . . . . . . . . . . . 12 + 4.1. Certificate Revocation Lists . . . . . . . . . . . . . . 13 + 4.2. Certificate Path Validation . . . . . . . . . . . . . . . 13 + 4.3. Certificate and CRL Signing Algorithms, and Key Sizes . . 14 + 4.4. PKIX Certificate Extensions . . . . . . . . . . . . . . . 15 + 4.4.1. Basic Constraints . . . . . . . . . . . . . . . . . . 16 + 4.4.2. Key Usage Extension . . . . . . . . . . . . . . . . . 16 + 4.4.3. Subject Alternative Name . . . . . . . . . . . . . . 17 + 4.4.4. Extended Key Usage Extension . . . . . . . . . . . . 17 + 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18 + 6. Security Considerations . . . . . . . . . . . . . . . . . . . 18 + 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 20 + 7.1. Reference Conventions . . . . . . . . . . . . . . . . . . 20 + 7.1. Normative References . . . . . . . . . . . . . . . . . . 20 + 7.2. Informative References . . . . . . . . . . . . . . . . . 23 + Appendix A. Historic Considerations . . . . . . . . . . . . . . 26 + A.1. Signature Algorithms and Key Sizes . . . . . . . . . . . 26 + Appendix B. Moving S/MIME v2 Certificate Handling to Historic + Status . . . . . . . . . . . . . . . . . . . . . . . 27 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 28 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 28 + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 3] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +1. Introduction + + S/MIME (Secure/Multipurpose Internet Mail Extensions) v4.0, described + in [RFC8551], provides a method to send and receive secure MIME + messages. Before using a public key to provide security services, + the S/MIME agent MUST verify that the public key is valid. S/MIME + agents MUST use PKIX certificates to validate public keys as + described in [RFC5280] ("Internet X.509 Public Key Infrastructure + Certificate and Certificate Revocation List (CRL) Profile"). S/MIME + agents MUST meet the certificate-processing requirements specified in + this document in addition to those stated in [RFC5280]. + + This specification is compatible with the Cryptographic Message + Syntax (CMS) [RFC5652] in that it uses the data types defined by CMS. + It also inherits all the varieties of architectures for certificate- + based key management supported by CMS. + + This document obsoletes [RFC5750]. The most significant changes + revolve around changes in recommendations around the cryptographic + algorithms used by the specification. More details can be found in + Section 1.6. + + This specification contains a number of references to documents that + have been obsoleted or replaced. This is intentional, as the updated + documents often do not have the same information or protocol + requirements in them. + +1.1. Definitions + + For the purposes of this document, the following definitions apply. + + ASN.1: + Abstract Syntax Notation One, as defined in ITU-T X.680 [X.680]. + + Attribute certificate (AC): + An X.509 AC is a separate structure from a subject's public key + X.509 certificate. A subject may have multiple X.509 ACs + associated with each of its public key X.509 certificates. Each + X.509 AC binds one or more attributes with one of the subject's + public key X.509 certificates. The X.509 AC syntax is defined in + [RFC5755]. + + + + + + + + + + +Schaad, et al. Standards Track [Page 4] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + Certificate: + A type that binds an entity's name to a public key with a digital + signature. This type is defined in [RFC5280]. This type also + contains the distinguished name of the certificate issuer (the + signer), an issuer-specific serial number, the issuer's signature + algorithm identifier, a validity period, and extensions also + defined in that document. + + Certificate Revocation List (CRL): + A type that contains information about certificates whose validity + an issuer has revoked. The information consists of an issuer + name, the time of issue, the next scheduled time of issue, a list + of certificate serial numbers and their associated revocation + times, and extensions as defined in [RFC5280]. The CRL is signed + by the issuer. The type intended by this specification is the one + defined in [RFC5280]. + + Receiving agent: + Software that interprets and processes S/MIME CMS objects, MIME + body parts that contain CMS objects, or both. + + Sending agent: + Software that creates S/MIME CMS objects, MIME body parts that + contain CMS objects, or both. + + S/MIME agent: + User software that is a receiving agent, a sending agent, or both. + +1.2. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + We define the additional requirement levels: + + SHOULD+ This term means the same as SHOULD. However, the authors + expect that a requirement marked as SHOULD+ will be + promoted at some future time to be a MUST. + + SHOULD- This term means the same as SHOULD. However, the authors + expect that a requirement marked as SHOULD- will be demoted + to a MAY in a future version of this document. + + + + + + +Schaad, et al. Standards Track [Page 5] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + MUST- This term means the same as MUST. However, the authors + expect that this requirement will no longer be a MUST in a + future document. Although its status will be determined at + a later time, it is reasonable to expect that if a future + revision of a document alters the status of a MUST- + requirement, it will remain at least a SHOULD or a SHOULD-. + + The term "RSA" in this document almost always refers to the + PKCS #1 v1.5 RSA signature algorithm even when not qualified as such. + There are a couple of places where it refers to the general RSA + cryptographic operation; these can be determined from the context + where it is used. + +1.3. Compatibility with Prior Practice of S/MIME + + S/MIME version 4.0 agents ought to attempt to have the greatest + interoperability possible with agents for prior versions of S/MIME. + + - S/MIME version 2 is described in RFC 2311 through RFC 2315 + inclusive [SMIMEv2]. + + - S/MIME version 3 is described in RFC 2630 through RFC 2634 + inclusive and RFC 5035 [SMIMEv3]. + + - S/MIME version 3.1 is described in RFC 2634, RFC 3850, RFC 3851, + RFC 3852, and RFC 5035 [SMIMEv3.1]. + + - S/MIME version 3.2 is described in RFC 2634, RFC 5035, RFC 5652, + RFC 5750, and RFC 5751 [SMIMEv3.2]. + + - RFC 2311 also has historical information about the development of + S/MIME. + + Appendix A contains information about algorithms that were used for + prior versions of S/MIME but are no longer considered to meet modern + security standards. Support of these algorithms may be needed to + support historic S/MIME artifacts such as messages or files but + SHOULD NOT be used for new artifacts. + +1.4. Changes from S/MIME v3 to S/MIME v3.1 + + This section reflects the changes that were made when S/MIME v3.1 was + released. The language of RFC 2119 ("MUST", "SHOULD", etc.) used for + S/MIME v3 may have been superseded in later versions. + + - Version 1 and version 2 CRLs MUST be supported. + + + + + +Schaad, et al. Standards Track [Page 6] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + - Multiple certification authority (CA) certificates with the same + subject and public key, but with overlapping validity periods, + MUST be supported. + + - Version 2 ACs SHOULD be supported, and version 1 ACs MUST NOT be + used. + + - The use of the MD2 digest algorithm for certificate signatures is + discouraged, and security language was added. + + - Clarified email address use in certificates. Certificates that do + not contain an email address have no requirements for verifying + the email address associated with the certificate. + + - Receiving agents SHOULD display certificate information when + displaying the results of signature verification. + + - Receiving agents MUST NOT accept a signature made with a + certificate that does not have at least one of the + digitalSignature or nonRepudiation bits set. + + - Added clarifications for the interpretation of the key usage and + extended key usage extensions. + +1.5. Changes from S/MIME v3.1 to S/MIME v3.2 + + This section reflects the changes that were made when S/MIME v3.2 was + released. The language of RFC 2119 ("MUST", "SHOULD", etc.) used for + S/MIME v3.1 may have been superseded in later versions. + + Note that the section numbers listed here (e.g., "Section 6") are + from [RFC5750]. + + - Moved "Conventions Used in This Document" to Section 1.2. Added + definitions for SHOULD+, SHOULD-, and MUST-. + + - Section 1.1: Updated ASN.1 definition and reference. + + - Section 1.3: Added text about v3.1 RFCs. + + - Section 3: Aligned email address text with RFC 5280. Updated note + to indicate that the emailAddress IA5String upper bound is + 255 characters. Added text about matching email addresses. + + - Section 4.2: Added text to indicate how S/MIME agents locate the + correct user certificate. + + + + + +Schaad, et al. Standards Track [Page 7] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + - Section 4.3: RSA with SHA-256 (PKCS #1 v1.5) added as MUST; DSA + with SHA-256 added as SHOULD+; RSA with SHA-1, DSA with SHA-1, and + RSA with MD5 changed to SHOULD-; and RSASSA-PSS with SHA-256 added + as SHOULD+. Updated key sizes and changed pointer to PKIX RFCs. + + - Section 4.4.1: Aligned with PKIX on the use of a basicConstraints + extension in CA certificates. Clarified which extension is used + to constrain end entities from using their keys to perform + issuing-authority operations. + + - Section 5: Updated security considerations. + + - Section 6: Moved references from Appendix A of RFC 3850 to this + section. Updated the references. + + - Appendix A: Added Appendix A to move S/MIME v2 Certificate + Handling to Historic status. + +1.6. Changes since S/MIME 3.2 + + This section reflects the changes that were made when S/MIME v4.0 was + released. The language of RFC 2119 ("MUST", "SHOULD", etc.) used for + S/MIME v3.2 may have been superseded by S/MIME v4.0 and may be + superseded by future versions. + + - Section 3: Support for internationalized email addresses is + required. + + - Section 4.3: Mandated support for the Elliptic Curve Digital + Signature Algorithm (ECDSA) with P-256 and the Edwards-curve + Digital Signature Algorithm (EdDSA) with curve25519 [RFC8410]. + SHA-1 and MD5 algorithms are marked as historical, as they are no + longer considered secure. As the Digital Signature Algorithm + (DSA) has been replaced by elliptic curve versions, support for + DSA is now considered historical. Increased lower bounds on RSA + key sizes. + + - Appendix A: Added Appendix A for algorithms that are now + considered to be historical. + +2. CMS Options + + The CMS message format allows for a wide variety of options in + content and algorithm support. This section puts forth a number of + support requirements and recommendations in order to achieve a base + level of interoperability among all S/MIME implementations. Most of + the CMS format for S/MIME messages is defined in [RFC8551]. + + + + +Schaad, et al. Standards Track [Page 8] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +2.1. Certificate Revocation Lists + + Receiving agents MUST support the CRL format defined in [RFC5280]. + If sending agents include CRLs in outgoing messages, the CRL format + defined in [RFC5280] MUST be used. Receiving agents MUST support + both v1 and v2 CRLs. + + All agents MUST be capable of performing revocation checks using CRLs + as specified in [RFC5280]. All agents MUST perform revocation status + checking in accordance with [RFC5280]. Receiving agents MUST + recognize CRLs in received S/MIME messages. + + Agents SHOULD store CRLs received in messages for use in processing + later messages. + +2.2. Certificate Choices + + Receiving agents MUST support v1 X.509 and v3 X.509 certificates as + profiled in [RFC5280]. End-entity certificates MAY include an + Internet mail address, as described in Section 3. + + Receiving agents SHOULD support X.509 version 2 ACs. See [RFC5755] + for details about the profile for ACs. + +2.2.1. Historical Note about CMS Certificates + + The CMS message format supports a choice of certificate formats for + public key content types: PKIX, PKCS #6 extended certificates + [PKCS6], and PKIX ACs. + + The PKCS #6 format is not in widespread use. In addition, PKIX + certificate extensions address much of the same functionality and + flexibility as was intended in the PKCS #6 certificate extensions. + Thus, sending and receiving agents MUST NOT use PKCS #6 extended + certificates. Receiving agents MUST be able to parse and process a + message containing PKCS #6 extended certificates, although ignoring + those certificates is expected behavior. + + X.509 version 1 ACs are also not widely implemented and have + been superseded by version 2 ACs. Sending agents MUST NOT send + version 1 ACs. + + + + + + + + + + +Schaad, et al. Standards Track [Page 9] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +2.3. Included Certificates + + Receiving agents MUST be able to handle an arbitrary number of + certificates of arbitrary relationship to the message sender and to + each other in arbitrary order. In many cases, the certificates + included in a signed message may represent a chain of certification + from the sender to a particular root. There may be, however, + situations where the certificates in a signed message may be + unrelated and included for convenience. + + Sending agents SHOULD include any certificates for the user's public + key(s) and associated issuer certificates. This increases the + likelihood that the intended recipient can establish trust in the + originator's public key(s). This is especially important when + sending a message to recipients that may not have access to the + sender's public key through any other means or when sending a signed + message to a new recipient. The inclusion of certificates in + outgoing messages can be omitted if S/MIME objects are sent within a + group of correspondents that have established access to each other's + certificates by some other means such as a shared directory or manual + certificate distribution. Receiving S/MIME agents SHOULD be able to + handle messages without certificates by using a database or directory + lookup scheme to find them. + + A sending agent SHOULD include at least one chain of certificates up + to, but not including, a CA that it believes that the recipient may + trust as authoritative. A receiving agent MUST be able to handle an + arbitrarily large number of certificates and chains. + + Agents MAY send CA certificates -- that is, cross-certificates, + self-issued certificates, and self-signed certificates. Note that + receiving agents SHOULD NOT simply trust any self-signed certificates + as valid CAs but SHOULD use some other mechanism to determine if this + is a CA that should be trusted. Also note that when certificates + contain DSA public keys the parameters may be located in the root + certificate. This would require that the recipient possess both the + end-entity certificate and the root certificate to perform a + signature verification, and is a valid example of a case where + transmitting the root certificate may be required. + + Receiving agents MUST support chaining based on the distinguished + name fields. Other methods of building certificate chains MAY be + supported. + + Receiving agents SHOULD support the decoding of X.509 ACs included in + CMS objects. All other issues regarding the generation and use of + X.509 ACs are outside the scope of this specification. One + specification that addresses AC use is defined in [RFC3114]. + + + +Schaad, et al. Standards Track [Page 10] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +3. Using Distinguished Names for Internet Mail + + End-entity certificates MAY contain an Internet mail address. + Email addresses restricted to 7-bit ASCII characters use the + pkcs-9-at-emailAddress object identifier (OID) (see below) and are + encoded as described in Section 4.2.1.6 of [RFC5280]. + Internationalized email address names use the OID defined in + [RFC8398] and are encoded as described therein. The email address + SHOULD be in the subjectAltName extension and SHOULD NOT be in the + subject distinguished name. + + Receiving agents MUST recognize and accept certificates that contain + no email address. Agents are allowed to provide an alternative + mechanism for associating an email address with a certificate that + does not contain an email address, such as through the use of the + agent's address book, if available. Receiving agents MUST recognize + both ASCII and internationalized email addresses in the + subjectAltName extension. Receiving agents MUST recognize email + addresses in the distinguished name field in the PKCS #9 [RFC2985] + emailAddress attribute: + + pkcs-9-at-emailAddress OBJECT IDENTIFIER ::= + { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) 1 } + + Note that this attribute MUST be encoded as IA5String and has an + upper bound of 255 characters. The comparing of email addresses is + fraught with peril. [RFC8398] defines the procedure for doing the + comparison of internationalized email addresses. For ASCII email + addresses, the domain component (right-hand side of the '@') MUST be + compared using a case-insensitive function. The local name + component (left-hand side of the '@') SHOULD be compared using a + case-insensitive function. Some localities may perform other + transformations on the local name component before doing the + comparison; however, an S/MIME client cannot know what specific + localities do. + + Sending agents SHOULD make the address in the From or Sender header + in a mail message match an Internet mail address in the signer's + certificate. Receiving agents MUST check that the address in the + From or Sender header of a mail message matches an Internet mail + address in the signer's certificate, if mail addresses are present in + the certificate. A receiving agent SHOULD provide some explicit + alternate processing of the message if this comparison fails; this + might be done by displaying or logging a message that shows the + recipient the mail addresses in the certificate or other certificate + details. + + + + + +Schaad, et al. Standards Track [Page 11] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + A receiving agent SHOULD display a subject name or other certificate + details when displaying an indication of successful or unsuccessful + signature verification. + + All subject and issuer names MUST be populated (i.e., not an empty + SEQUENCE) in S/MIME-compliant X.509 certificates, except that the + subject distinguished name in a user's (i.e., an end entity's) + certificate MAY be an empty SEQUENCE, in which case the + subjectAltName extension will include the subject's identifier and + MUST be marked as critical. + +4. Certificate Processing + + S/MIME agents need to provide some certificate retrieval mechanism in + order to gain access to certificates for recipients of digital + envelopes. There are many ways to implement certificate retrieval + mechanisms. [X.500] directory service is an excellent example of a + certificate retrieval-only mechanism that is compatible with classic + X.500 distinguished names. The IETF has published [RFC8162], which + describes an experimental protocol to retrieve certificates from the + Domain Name System (DNS). Until such mechanisms are widely used, + their utility may be limited by the small number of the + correspondent's certificates that can be retrieved. At a minimum, + for initial S/MIME deployment, a user agent could automatically + generate a message to an intended recipient requesting the + recipient's certificate in a signed return message. + + Receiving and sending agents SHOULD also provide a mechanism to allow + a user to "store and protect" certificates for correspondents in such + a way as to guarantee their later retrieval. In many environments, + it may be desirable to link the certificate retrieval/storage + mechanisms together in some sort of certificate database. In its + simplest form, a certificate database would be local to a particular + user and would function in a way similar to an "address book" that + stores a user's frequent correspondents. In this way, the + certificate retrieval mechanism would be limited to the certificates + that a user has stored (presumably from incoming messages). A + comprehensive certificate retrieval/storage solution might combine + two or more mechanisms to allow the greatest flexibility and utility + to the user. For instance, a secure Internet mail agent might resort + to checking a centralized certificate retrieval mechanism for a + certificate if it cannot be found in a user's local certificate + storage/retrieval database. + + + + + + + + +Schaad, et al. Standards Track [Page 12] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + Receiving and sending agents SHOULD provide a mechanism for the + import and export of certificates, using a CMS certs-only message. + This allows for import and export of full certificate chains as + opposed to just a single certificate. This is described in + [RFC8551]. + + Agents MUST handle multiple valid CA certificates containing the same + subject name and the same public keys but with overlapping validity + intervals. + +4.1. Certificate Revocation Lists + + In general, it is always better to get the latest CRL information + from a CA than to get information stored in an incoming message. A + receiving agent SHOULD have access to some CRL retrieval mechanism in + order to gain access to certificate revocation information when + validating certification paths. A receiving or sending agent SHOULD + also provide a mechanism to allow a user to store incoming + certificate revocation information for correspondents in such a way + as to guarantee its later retrieval. + + Receiving and sending agents SHOULD retrieve and utilize CRL + information every time a certificate is verified as part of a + certification path validation even if the certificate was already + verified in the past. However, in many instances (such as off-line + verification), access to the latest CRL information may be difficult + or impossible. The use of CRL information, therefore, may be + dictated by the value of the information that is protected. The + value of the CRL information in a particular context is beyond the + scope of this specification but may be governed by the policies + associated with particular certification paths. + + All agents MUST be capable of performing revocation checks using CRLs + as specified in [RFC5280]. All agents MUST perform revocation status + checking in accordance with [RFC5280]. Receiving agents MUST + recognize CRLs in received S/MIME messages. + +4.2. Certificate Path Validation + + In creating a user agent for secure messaging, certificate, CRL, and + certification path validation should be highly automated while still + acting in the best interests of the user. Certificate, CRL, and path + validation MUST be performed as per [RFC5280] when validating a + correspondent's public key. This is necessary before using a public + key to provide security services such as verifying a signature, + encrypting a content-encryption key (e.g., RSA), or forming a + pairwise symmetric key (e.g., Diffie-Hellman) to be used to encrypt + or decrypt a content-encryption key. + + + +Schaad, et al. Standards Track [Page 13] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + Certificates and CRLs are made available to the path validation + procedure in two ways: a) incoming messages and b) certificate and + CRL retrieval mechanisms. Certificates and CRLs in incoming messages + are not required to be in any particular order, nor are they required + to be in any way related to the sender or recipient of the message + (although in most cases they will be related to the sender). + Incoming certificates and CRLs SHOULD be cached for use in path + validation and optionally stored for later use. This temporary + certificate and CRL cache SHOULD be used to augment any other + certificate and CRL retrieval mechanisms for path validation on + incoming signed messages. + + When verifying a signature and the certificates that are included in + the message, if a signingCertificate attribute from RFC 2634 [ESS] or + a signingCertificateV2 attribute from RFC 5035 [ESS] is found in an + S/MIME message, it SHALL be used to identify the signer's + certificate. Otherwise, the certificate is identified in an S/MIME + message, using either (1) the issuerAndSerialNumber, which identifies + the signer's certificate by the issuer's distinguished name and the + certificate serial number or (2) the subjectKeyIdentifier, which + identifies the signer's certificate by a key identifier. + + When decrypting an encrypted message, if an + SMIMEEncryptionKeyPreference attribute is found in an encapsulating + SignedData, it SHALL be used to identify the originator's certificate + found in OriginatorInfo. See [RFC5652] for the CMS fields that + reference the originator's and recipient's certificates. + +4.3. Certificate and CRL Signing Algorithms, and Key Sizes + + Certificates and CRLs are signed by the certificate issuer. + Receiving agents: + + - MUST support ECDSA with curve P-256 with SHA-256. + + - MUST support EdDSA with curve25519 using PureEdDSA mode. + + - MUST- support RSA PKCS #1 v1.5 with SHA-256. + + - SHOULD support the RSA Probabilistic Signature Scheme (RSASSA-PSS) + with SHA-256. + + Implementations SHOULD use deterministic generation for the parameter + 'k' for ECDSA as outlined in [RFC6979]. EdDSA is defined to generate + this parameter deterministically. + + + + + + +Schaad, et al. Standards Track [Page 14] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + The following are the RSA and RSASSA-PSS key size requirements for + S/MIME receiving agents during certificate and CRL signature + verification: + + key size <= 2047 : SHOULD NOT (see Appendix A) + 2048 <= key size <= 4096 : MUST (see Security Considerations) + 4096 < key size : MAY (see Security Considerations) + + The signature algorithm OIDs for RSA PKCS #1 v1.5 and RSASSA-PSS with + SHA-256 using 1024-bit through 3072-bit public keys are specified in + [RFC4055], and the signature algorithm definition is found in + [FIPS186-2] with Change Notice 1. + + The signature algorithm OIDs for RSA PKCS #1 v1.5 and RSASSA-PSS with + SHA-256 using 4096-bit public keys are specified in [RFC4055], and + the signature algorithm definition is found in [RFC3447]. + + For RSASSA-PSS with SHA-256, see [RFC4056]. + + For ECDSA, see [RFC5758] and [RFC6090]. The first reference provides + the signature algorithm's OID, and the second provides the signature + algorithm's definition. Curves other than curve P-256 MAY be used as + well. + + For EdDSA, see [RFC8032] and [RFC8410]. The first reference provides + the signature algorithm's OID, and the second provides the signature + algorithm's definition. Curves other than curve25519 MAY be used as + well. + +4.4. PKIX Certificate Extensions + + PKIX describes an extensible framework in which the basic certificate + information can be extended and describes how such extensions can be + used to control the process of issuing and validating certificates. + The LAMPS Working Group has ongoing efforts to identify and create + extensions that have value in particular certification environments. + Further, there are active efforts underway to issue PKIX certificates + for business purposes. This document identifies the minimum required + set of certificate extensions that have the greatest value in the + S/MIME environment. The syntax and semantics of all the identified + extensions are defined in [RFC5280]. + + Sending and receiving agents MUST correctly handle the basic + constraints, key usage, authority key identifier, subject key + identifier, and subject alternative name certificate extensions when + they appear in end-entity and CA certificates. Some mechanism SHOULD + exist to gracefully handle other certificate extensions when they + appear in end-entity or CA certificates. + + + +Schaad, et al. Standards Track [Page 15] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + Certificates issued for the S/MIME environment SHOULD NOT contain any + critical extensions (extensions that have the critical field set to + TRUE) other than those listed here. These extensions SHOULD be + marked as non-critical, unless the proper handling of the extension + is deemed critical to the correct interpretation of the associated + certificate. Other extensions may be included, but those extensions + SHOULD NOT be marked as critical. + + Interpretation and syntax for all extensions MUST follow [RFC5280], + unless otherwise specified here. + +4.4.1. Basic Constraints + + The basicConstraints extension serves to delimit the role and + position that an issuing-authority or end-entity certificate plays in + a certification path. + + For example, certificates issued to CAs and subordinate CAs contain a + basicConstraints extension that identifies them as issuing-authority + certificates. End-entity certificates contain the key usage + extension, which restrains end entities from using the key when + performing issuing-authority operations (see Section 4.4.2). + + As per [RFC5280], certificates MUST contain a basicConstraints + extension in CA certificates and SHOULD NOT contain that extension in + end-entity certificates. + +4.4.2. Key Usage Extension + + The key usage extension serves to limit the technical purposes for + which a public key listed in a valid certificate may be used. + Issuing-authority certificates may contain a key usage extension that + restricts the key to signing certificates, CRLs, and other data. + + For example, a CA may create subordinate issuer certificates that + contain a key usage extension that specifies that the corresponding + public key can be used to sign end-user certificates and CRLs. + + If a key usage extension is included in a PKIX certificate, then it + MUST be marked as critical. + + S/MIME receiving agents MUST NOT accept the signature of a message if + it was verified using a certificate that contains a key usage + extension without at least one of the digitalSignature or + nonRepudiation bits set. Sometimes S/MIME is used as a secure + message transport for applications beyond interpersonal messaging; in + + + + + +Schaad, et al. Standards Track [Page 16] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + such cases, the S/MIME-enabled application can specify additional + requirements concerning the digitalSignature or nonRepudiation bits + within this extension. + + If the key usage extension is not specified, receiving clients MUST + presume that both the digitalSignature and nonRepudiation bits + are set. + +4.4.3. Subject Alternative Name + + The subject alternative name extension is used in S/MIME as the + preferred means to convey the email address or addresses that + correspond to the entity for this certificate. If the local portion + of the email address is ASCII, it MUST be encoded using the + rfc822Name CHOICE of the GeneralName type as described in [RFC5280], + Section 4.2.1.6. If the local portion of the email address is not + ASCII, it MUST be encoded using the otherName CHOICE of the + GeneralName type as described in [RFC8398], Section 3. Since the + SubjectAltName type is a SEQUENCE OF GeneralName, multiple email + addresses MAY be present. + +4.4.4. Extended Key Usage Extension + + The extended key usage extension also serves to limit the technical + purposes for which a public key listed in a valid certificate may be + used. The set of technical purposes for the certificate therefore + are the intersection of the uses indicated in the key usage and + extended key usage extensions. + + For example, if the certificate contains a key usage extension + indicating a digital signature and an extended key usage extension + that includes the id-kp-emailProtection OID, then the certificate may + be used for signing but not encrypting S/MIME messages. If the + certificate contains a key usage extension indicating a digital + signature but no extended key usage extension, then the certificate + may also be used to sign but not encrypt S/MIME messages. + + If the extended key usage extension is present in the certificate, + then interpersonal-message S/MIME receiving agents MUST check that it + contains either the id-kp-emailProtection OID or the + anyExtendedKeyUsage OID as defined in [RFC5280]. S/MIME uses other + than interpersonal messaging MAY require the explicit presence of the + extended key usage extension, the presence of other OIDs in the + extension, or both. + + + + + + + +Schaad, et al. Standards Track [Page 17] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +5. IANA Considerations + + This document has no IANA actions. + +6. Security Considerations + + All of the security issues faced by any cryptographic application + must be faced by an S/MIME agent. Among these issues are protecting + the user's private key, preventing various attacks, and helping the + user avoid mistakes such as inadvertently encrypting a message for + the wrong recipient. The entire list of security considerations is + beyond the scope of this document, but some significant concerns are + listed here. + + When processing certificates, there are many situations where the + processing might fail. Because the processing may be done by a user + agent, a security gateway, or some other program, there is no single + way to handle such failures. Just because the methods to handle the + failures have not been listed, however, the reader should not assume + that they are not important. The opposite is true: if a certificate + is not provably valid and associated with the message, the processing + software should take immediate and noticeable steps to inform the end + user about it. + + Some of the many places where signature and certificate checking + might fail include the following: + + - no Internet mail addresses in a certificate match the sender of a + message, if the certificate contains at least one mail address + + - no certificate chain leads to a trusted CA + + - no ability to check the CRL for a certificate is implemented + + - an invalid CRL was received + + - the CRL being checked is expired + + - the certificate is expired + + - the certificate has been revoked + + There are certainly other instances where a certificate may be + invalid, and it is the responsibility of the processing software to + check them all thoroughly and decide what to do if the check fails. + + + + + + +Schaad, et al. Standards Track [Page 18] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + It is possible for there to be multiple unexpired CRLs for a CA. If + an agent is consulting CRLs for certificate validation, it SHOULD + make sure that the most recently issued CRL for that CA is consulted, + since an S/MIME message sender could deliberately include an older + unexpired CRL in an S/MIME message. This older CRL might not include + recently revoked certificates; this scenario might lead an agent to + accept a certificate that has been revoked in a subsequent CRL. + + When determining the time for a certificate validity check, agents + have to be careful to use a reliable time. In most cases, the time + used SHOULD be the current time. Some exceptions to this would be as + follows: + + - The time the message was received is stored in a secure manner and + is used at a later time to validate the message. + + - The time in a SigningTime attribute is found in a countersignature + attribute [RFC5652] that has been successfully validated. + + The signingTime attribute could be deliberately set to a time where + the receiving agent would (1) use a CRL that does not contain a + revocation for the signing certificate or (2) use a certificate that + has expired or is not yet valid. This could be done by either + (1) the sender of the message or (2) an attacker that has compromised + the key of the sender. + + In addition to the security considerations identified in [RFC5280], + caution should be taken when processing certificates that have not + first been validated to a trust anchor. Certificates could be + manufactured by untrusted sources for the purpose of mounting denial- + of-service attacks or other attacks. For example, keys selected to + require excessive cryptographic processing, or extensive lists of CRL + Distribution Point (CDP) and/or Authority Information Access (AIA) + addresses in the certificate, could be used to mount denial-of- + service attacks. Similarly, attacker-specified CDP and/or AIA + addresses could be included in fake certificates to allow the + originator to detect receipt of the message even if signature + verification fails. + + RSA keys of less than 2048 bits are now considered by many experts to + be cryptographically insecure (due to advances in computing power) + and SHOULD no longer be used to sign certificates or CRLs. Such keys + were previously considered secure, so processing previously received + signed and encrypted mail may require processing certificates or CRLs + signed with weak keys. Implementations that wish to support previous + versions of S/MIME or process old messages need to consider the + security risks that result from accepting certificates and CRLs with + smaller key sizes (e.g., spoofed certificates) versus the costs of + + + +Schaad, et al. Standards Track [Page 19] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + denial of service. If an implementation supports verification of + certificates or CRLs generated with RSA and DSA keys of less than + 2048 bits, it MUST warn the user. Implementers should consider + providing a stronger warning for weak signatures on certificates and + CRLs associated with newly received messages than the one provided + for certificates and CRLs associated with previously stored messages. + Server implementations (e.g., secure mail list servers) where user + warnings are not appropriate SHOULD reject messages with weak + cryptography. + + If an implementation is concerned about compliance with National + Institute of Standards and Technology (NIST) key size + recommendations, then see [SP800-57]. + +7. References + +7.1. Reference Conventions + + [ESS] refers to [RFC2634] and [RFC5035]. + + [SMIMEv2] refers to [RFC2311], [RFC2312], [RFC2313], [RFC2314], and + [RFC2315]. + + [SMIMEv3] refers to [RFC2630], [RFC2631], [RFC2632], [RFC2633], + [RFC2634], and [RFC5035]. + + [SMIMEv3.1] refers to [RFC2634], [RFC3850], [RFC3851], [RFC3852], + and [RFC5035]. + + [SMIMEv3.2] refers to [RFC2634], [RFC5035], [RFC5652], [RFC5750], + and [RFC5751]. + + [SMIMEv4] refers to [RFC2634], [RFC5035], [RFC5652], [RFC8551], and + this document. + +7.2. Normative References + + [FIPS186-2] + National Institute of Standards and Technology (NIST), + "Digital Signature Standard (DSS) (also with Change + Notice 1)", Federal Information Processing Standards + Publication 186-2, January 2000, + . + + + + + + + +Schaad, et al. Standards Track [Page 20] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + [FIPS186-3] + National Institute of Standards and Technology (NIST), + "Digital Signature Standard (DSS)", Federal Information + Processing Standards Publication 186-3, June 2009, + . + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [RFC2634] Hoffman, P., Ed., "Enhanced Security Services for S/MIME", + RFC 2634, DOI 10.17487/RFC2634, June 1999, + . + + [RFC2985] Nystrom, M. and B. Kaliski, "PKCS #9: Selected Object + Classes and Attribute Types Version 2.0", RFC 2985, + DOI 10.17487/RFC2985, November 2000, + . + + [RFC3279] Bassham, L., Polk, W., and R. Housley, "Algorithms and + Identifiers for the Internet X.509 Public Key + Infrastructure Certificate and Certificate Revocation List + (CRL) Profile", RFC 3279, DOI 10.17487/RFC3279, April + 2002, . + + [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography + Standards (PKCS) #1: RSA Cryptography Specifications + Version 2.1", RFC 3447, DOI 10.17487/RFC3447, February + 2003, . + + [RFC4055] Schaad, J., Kaliski, B., and R. Housley, "Additional + Algorithms and Identifiers for RSA Cryptography for use in + the Internet X.509 Public Key Infrastructure Certificate + and Certificate Revocation List (CRL) Profile", RFC 4055, + DOI 10.17487/RFC4055, June 2005, + . + + [RFC4056] Schaad, J., "Use of the RSASSA-PSS Signature Algorithm in + Cryptographic Message Syntax (CMS)", RFC 4056, + DOI 10.17487/RFC4056, June 2005, + . + + [RFC5035] Schaad, J., "Enhanced Security Services (ESS) Update: + Adding CertID Algorithm Agility", RFC 5035, + DOI 10.17487/RFC5035, August 2007, + . + + + +Schaad, et al. Standards Track [Page 21] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., + Housley, R., and W. Polk, "Internet X.509 Public Key + Infrastructure Certificate and Certificate Revocation List + (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, + . + + [RFC5652] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, + RFC 5652, DOI 10.17487/RFC5652, September 2009, + . + + [RFC5750] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet + Mail Extensions (S/MIME) Version 3.2 Certificate + Handling", RFC 5750, DOI 10.17487/RFC5750, January 2010, + . + + [RFC5755] Farrell, S., Housley, R., and S. Turner, "An Internet + Attribute Certificate Profile for Authorization", + RFC 5755, DOI 10.17487/RFC5755, January 2010, + . + + [RFC5758] Dang, Q., Santesson, S., Moriarty, K., Brown, D., and T. + Polk, "Internet X.509 Public Key Infrastructure: + Additional Algorithms and Identifiers for DSA and ECDSA", + RFC 5758, DOI 10.17487/RFC5758, January 2010, + . + + [RFC6979] Pornin, T., "Deterministic Usage of the Digital Signature + Algorithm (DSA) and Elliptic Curve Digital Signature + Algorithm (ECDSA)", RFC 6979, DOI 10.17487/RFC6979, August + 2013, . + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, . + + [RFC8398] Melnikov, A., Ed. and W. Chuang, Ed., "Internationalized + Email Addresses in X.509 Certificates", RFC 8398, + DOI 10.17487/RFC8398, May 2018, + . + + [RFC8551] Schaad, J., Ramsdell, B., and S. Turner, + "Secure/Multipurpose Internet Mail Extensions (S/MIME) + Version 4.0 Message Specification", RFC 8551, + DOI 10.17487/RFC8551, April 2019, + . + + + + + + +Schaad, et al. Standards Track [Page 22] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + [X.680] "Information Technology - Abstract Syntax Notation One + (ASN.1): Specification of basic notation", ITU-T + Recommendation X.680, ISO/IEC 8824-1:2015, August 2015, + . + +7.3 Informative References + + [PKCS6] RSA Laboratories, "PKCS #6: Extended-Certificate Syntax + Standard", November 1993. + + [RFC2311] Dusse, S., Hoffman, P., Ramsdell, B., Lundblade, L., and + L. Repka, "S/MIME Version 2 Message Specification", + RFC 2311, DOI 10.17487/RFC2311, March 1998, + . + + [RFC2312] Dusse, S., Hoffman, P., Ramsdell, B., and J. Weinstein, + "S/MIME Version 2 Certificate Handling", RFC 2312, + DOI 10.17487/RFC2312, March 1998, + . + + [RFC2313] Kaliski, B., "PKCS #1: RSA Encryption Version 1.5", + RFC 2313, DOI 10.17487/RFC2313, March 1998, + . + + [RFC2314] Kaliski, B., "PKCS #10: Certification Request Syntax + Version 1.5", RFC 2314, DOI 10.17487/RFC2314, March 1998, + . + + [RFC2315] Kaliski, B., "PKCS #7: Cryptographic Message Syntax + Version 1.5", RFC 2315, DOI 10.17487/RFC2315, March 1998, + . + + [RFC2630] Housley, R., "Cryptographic Message Syntax", RFC 2630, + DOI 10.17487/RFC2630, June 1999, + . + + [RFC2631] Rescorla, E., "Diffie-Hellman Key Agreement Method", + RFC 2631, DOI 10.17487/RFC2631, June 1999, + . + + [RFC2632] Ramsdell, B., Ed., "S/MIME Version 3 Certificate + Handling", RFC 2632, DOI 10.17487/RFC2632, June 1999, + . + + [RFC2633] Ramsdell, B., Ed., "S/MIME Version 3 Message + Specification", RFC 2633, DOI 10.17487/RFC2633, June 1999, + . + + + + +Schaad, et al. Standards Track [Page 23] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + [RFC3114] Nicolls, W., "Implementing Company Classification Policy + with the S/MIME Security Label", RFC 3114, + DOI 10.17487/RFC3114, May 2002, + . + + [RFC3850] Ramsdell, B., Ed., "Secure/Multipurpose Internet Mail + Extensions (S/MIME) Version 3.1 Certificate Handling", + RFC 3850, DOI 10.17487/RFC3850, July 2004, + . + + [RFC3851] Ramsdell, B., Ed., "Secure/Multipurpose Internet Mail + Extensions (S/MIME) Version 3.1 Message Specification", + RFC 3851, DOI 10.17487/RFC3851, July 2004, + . + + [RFC3852] Housley, R., "Cryptographic Message Syntax (CMS)", + RFC 3852, DOI 10.17487/RFC3852, July 2004, + . + + [RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet + Mail Extensions (S/MIME) Version 3.2 Message + Specification", RFC 5751, DOI 10.17487/RFC5751, + January 2010, . + + [RFC6090] McGrew, D., Igoe, K., and M. Salter, "Fundamental Elliptic + Curve Cryptography Algorithms", RFC 6090, + DOI 10.17487/RFC6090, February 2011, + . + + [RFC6151] Turner, S. and L. Chen, "Updated Security Considerations + for the MD5 Message-Digest and the HMAC-MD5 Algorithms", + RFC 6151, DOI 10.17487/RFC6151, March 2011, + . + + [RFC6194] Polk, T., Chen, L., Turner, S., and P. Hoffman, "Security + Considerations for the SHA-0 and SHA-1 Message-Digest + Algorithms", RFC 6194, DOI 10.17487/RFC6194, March 2011, + . + + [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital + Signature Algorithm (EdDSA)", RFC 8032, + DOI 10.17487/RFC8032, January 2017, + . + + [RFC8162] Hoffman, P. and J. Schlyter, "Using Secure DNS to + Associate Certificates with Domain Names for S/MIME", + RFC 8162, DOI 10.17487/RFC8162, May 2017, + . + + + +Schaad, et al. Standards Track [Page 24] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + [RFC8410] Josefsson, S. and J. Schaad, "Algorithm Identifiers for + Ed25519, Ed448, X25519, and X448 for Use in the Internet + X.509 Public Key Infrastructure", RFC 8410, + DOI 10.17487/RFC8410, August 2018, + . + + [SP800-57] National Institute of Standards and Technology (NIST), + "Recommendation for Key Management - Part 1: General", + NIST Special Publication 800-57 Revision 4, + DOI 10.6028/NIST.SP.800-57pt1r4, January 2016, + . + + [X.500] "Information technology - Open Systems Interconnection - + The Directory - Part 1: Overview of concepts, models and + services", ITU-T Recommendation X.500, + ISO/IEC 9594-1:2017. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 25] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +Appendix A. Historic Considerations + +A.1. Signature Algorithms and Key Sizes + + There are a number of problems with validating certificates on + sufficiently historic messages. For this reason, it is strongly + suggested that user agents treat these certificates differently from + those on current messages. These problems include the following: + + - CAs are not required to keep certificates on a CRL beyond one + update after a certificate has expired. This means that unless + CRLs are cached as part of the message it is not always possible + to check to see if a certificate has been revoked. The same + problems exist with Online Certificate Status Protocol (OCSP) + responses, as they may be based on a CRL rather than on the + certificate database. + + - RSA and DSA keys of less than 2048 bits are now considered by many + experts to be cryptographically insecure (due to advances in + computing power). Such keys were previously considered secure, so + the processing of historic certificates will often result in the + use of weak keys. Implementations that wish to support previous + versions of S/MIME or process old messages need to consider the + security risks that result from smaller key sizes (e.g., spoofed + messages) versus the costs of denial of service. + + [SMIMEv3.2] set the lower limit on suggested key sizes for + creating and validation at 1024 bits. [SMIMEv3.1] set the lower + limit at 768 bits. Prior to that, the lower bound on key sizes + was 512 bits. + + - Hash functions used to validate signatures on historic messages + may no longer be considered to be secure (see below). While there + are not currently any known practical pre-image or second + pre-image attacks against MD5 or SHA-1, the fact that they are no + longer considered to be collision resistant implies that the + security level of any signature that is created with these hash + algorithms should also be considered as suspect. + + The following algorithms have been called out for some level of + support by previous S/MIME specifications: + + - RSA with MD5 was dropped in [SMIMEv4]. MD5 is no longer + considered to be secure, as it is no longer collision resistant. + Details can be found in [RFC6151]. + + + + + + +Schaad, et al. Standards Track [Page 26] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + + - RSA and DSA with SHA-1 were dropped in [SMIMEv4]. SHA-1 is no + longer considered to be secure, as it is no longer collision + resistant. The IETF statement on SHA-1 can be found in [RFC6194], + but it is out of date relative to the most recent advances. + + - DSA with SHA-256 support was dropped in [SMIMEv4]. DSA was + dropped as part of a general movement from finite fields to + elliptic curves. Issues related to dealing with non-deterministic + generation of the parameter 'k' have come up (see [RFC6979]). + + For 512-bit RSA with SHA-1, see [RFC3279] and [FIPS186-2] without + Change Notice 1; for 512-bit RSA with SHA-256, see [RFC4055] and + [FIPS186-2] without Change Notice 1. The first reference provides + the signature algorithm's OID, and the second provides the signature + algorithm's definition. + + For 512-bit DSA with SHA-1, see [RFC3279] and [FIPS186-2] without + Change Notice 1; for 512-bit DSA with SHA-256, see [RFC5758] and + [FIPS186-2] without Change Notice 1; for 1024-bit DSA with SHA-1, see + [RFC3279] and [FIPS186-2] with Change Notice 1; and for 1024-bit + through 3072-bit DSA with SHA-256, see [RFC5758] and [FIPS186-3]. + The first reference provides the signature algorithm's OID, and the + second provides the signature algorithm's definition. + +Appendix B. Moving S/MIME v2 Certificate Handling to Historic Status + + The S/MIME v3 [SMIMEv3], v3.1 [SMIMEv3.1], v3.2 [SMIMEv3.2], and v4.0 + (this document) specifications are backward compatible with the + S/MIME v2 Certificate Handling Specification [SMIMEv2], with the + exception of the algorithms (dropped RC2/40 requirement, and added + DSA and RSASSA-PSS requirements). Therefore, RFC 2312 [SMIMEv2] was + moved to Historic status. + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 27] + +RFC 8550 S/MIME 4.0 Certificate Handling April 2019 + + +Acknowledgements + + Many thanks go out to the other authors of the S/MIME v2 Certificate + Handling RFC: Steve Dusse, Paul Hoffman, and Jeff Weinstein. Without + v2, there wouldn't be a v3, v3.1, v3.2, or v4.0. + + A number of the members of the S/MIME Working Group have also worked + very hard and contributed to this document. Any list of people is + doomed to omission, and for that I apologize. In alphabetical order, + the following people stand out in my mind because they made direct + contributions to this document. + + Bill Flanigan, Trevor Freeman, Elliott Ginsburg, Alfred Hoenes, Paul + Hoffman, Russ Housley, David P. Kemp, Michael Myers, John Pawling, + and Denis Pinkas. + + The version 4 update to the S/MIME documents was done under the + auspices of the LAMPS Working Group. + +Authors' Addresses + + Jim Schaad + August Cellars + + Email: ietf@augustcellars.com + + + Blake Ramsdell + Brute Squad Labs, Inc. + + Email: blaker@gmail.com + + + Sean Turner + sn3rd + + Email: sean@sn3rd.com + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 28] + diff --git a/rfc/rfc8551.txt b/rfc/rfc8551.txt new file mode 100644 index 0000000000..b07ea0897c --- /dev/null +++ b/rfc/rfc8551.txt @@ -0,0 +1,3531 @@ + + + + + + +Internet Engineering Task Force (IETF) J. Schaad +Request for Comments: 8551 August Cellars +Obsoletes: 5751 B. Ramsdell +Category: Standards Track Brute Squad Labs, Inc. +ISSN: 2070-1721 S. Turner + sn3rd + April 2019 + + + Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 + Message Specification + +Abstract + + This document defines Secure/Multipurpose Internet Mail Extensions + (S/MIME) version 4.0. S/MIME provides a consistent way to send and + receive secure MIME data. Digital signatures provide authentication, + message integrity, and non-repudiation with proof of origin. + Encryption provides data confidentiality. Compression can be used to + reduce data size. This document obsoletes RFC 5751. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8551. + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 1] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +Copyright Notice + + Copyright (c) 2019 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + This document may contain material from IETF Documents or IETF + Contributions published or made publicly available before November + 10, 2008. The person(s) controlling the copyright in some of this + material may not have granted the IETF Trust the right to allow + modifications of such material outside the IETF Standards Process. + Without obtaining an adequate license from the person(s) controlling + the copyright in such materials, this document may not be modified + outside the IETF Standards Process, and derivative works of it may + not be created outside the IETF Standards Process, except to format + it for publication as an RFC or to translate it into languages other + than English. + + + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 2] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.1. Specification Overview . . . . . . . . . . . . . . . . . 5 + 1.2. Definitions . . . . . . . . . . . . . . . . . . . . . . . 6 + 1.3. Conventions Used in This Document . . . . . . . . . . . . 7 + 1.4. Compatibility with Prior Practice of S/MIME . . . . . . . 8 + 1.5. Changes from S/MIME v3 to S/MIME v3.1 . . . . . . . . . . 9 + 1.6. Changes from S/MIME v3.1 to S/MIME v3.2 . . . . . . . . . 9 + 1.7. Changes for S/MIME v4.0 . . . . . . . . . . . . . . . . . 11 + 2. CMS Options . . . . . . . . . . . . . . . . . . . . . . . . . 12 + 2.1. DigestAlgorithmIdentifier . . . . . . . . . . . . . . . . 12 + 2.2. SignatureAlgorithmIdentifier . . . . . . . . . . . . . . 12 + 2.3. KeyEncryptionAlgorithmIdentifier . . . . . . . . . . . . 13 + 2.4. General Syntax . . . . . . . . . . . . . . . . . . . . . 13 + 2.4.1. Data Content Type . . . . . . . . . . . . . . . . . . 14 + 2.4.2. SignedData Content Type . . . . . . . . . . . . . . . 14 + 2.4.3. EnvelopedData Content Type . . . . . . . . . . . . . 14 + 2.4.4. AuthEnvelopedData Content Type . . . . . . . . . . . 14 + 2.4.5. CompressedData Content Type . . . . . . . . . . . . . 14 + 2.5. Attributes and the SignerInfo Type . . . . . . . . . . . 15 + 2.5.1. Signing Time Attribute . . . . . . . . . . . . . . . 15 + 2.5.2. SMIMECapabilities Attribute . . . . . . . . . . . . . 16 + 2.5.3. Encryption Key Preference Attribute . . . . . . . . . 17 + 2.6. SignerIdentifier SignerInfo Type . . . . . . . . . . . . 19 + 2.7. ContentEncryptionAlgorithmIdentifier . . . . . . . . . . 19 + 2.7.1. Deciding Which Encryption Method to Use . . . . . . . 19 + 2.7.2. Choosing Weak Encryption . . . . . . . . . . . . . . 21 + 2.7.3. Multiple Recipients . . . . . . . . . . . . . . . . . 21 + 3. Creating S/MIME Messages . . . . . . . . . . . . . . . . . . 21 + 3.1. Preparing the MIME Entity for Signing, Enveloping, or + Compressing . . . . . . . . . . . . . . . . . . . . . . . 22 + 3.1.1. Canonicalization . . . . . . . . . . . . . . . . . . 23 + 3.1.2. Transfer Encoding . . . . . . . . . . . . . . . . . . 24 + 3.1.3. Transfer Encoding for Signing Using multipart/signed 25 + 3.1.4. Sample Canonical MIME Entity . . . . . . . . . . . . 25 + 3.2. The application/pkcs7-mime Media Type . . . . . . . . . . 26 + 3.2.1. The name and filename Parameters . . . . . . . . . . 27 + 3.2.2. The smime-type Parameter . . . . . . . . . . . . . . 28 + 3.3. Creating an Enveloped-Only Message . . . . . . . . . . . 29 + 3.4. Creating an Authenticated Enveloped-Only Message . . . . 30 + 3.5. Creating a Signed-Only Message . . . . . . . . . . . . . 31 + 3.5.1. Choosing a Format for Signed-Only Messages . . . . . 32 + 3.5.2. Signing Using application/pkcs7-mime with SignedData 32 + 3.5.3. Signing Using the multipart/signed Format . . . . . . 33 + 3.6. Creating a Compressed-Only Message . . . . . . . . . . . 36 + 3.7. Multiple Operations . . . . . . . . . . . . . . . . . . . 37 + 3.8. Creating a Certificate Management Message . . . . . . . . 38 + + + +Schaad, et al. Standards Track [Page 3] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + 3.9. Registration Requests . . . . . . . . . . . . . . . . . . 38 + 3.10. Identifying an S/MIME Message . . . . . . . . . . . . . . 39 + 4. Certificate Processing . . . . . . . . . . . . . . . . . . . 39 + 4.1. Key Pair Generation . . . . . . . . . . . . . . . . . . . 40 + 4.2. Signature Generation . . . . . . . . . . . . . . . . . . 40 + 4.3. Signature Verification . . . . . . . . . . . . . . . . . 40 + 4.4. Encryption . . . . . . . . . . . . . . . . . . . . . . . 41 + 4.5. Decryption . . . . . . . . . . . . . . . . . . . . . . . 41 + 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 41 + 5.1. Media Type for application/pkcs7-mime . . . . . . . . . . 42 + 5.2. Media Type for application/pkcs7-signature . . . . . . . 43 + 5.3. authEnveloped-data smime-type . . . . . . . . . . . . . . 44 + 5.4. Reference Updates . . . . . . . . . . . . . . . . . . . . 44 + 6. Security Considerations . . . . . . . . . . . . . . . . . . . 44 + 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 48 + 7.1. Reference Conventions . . . . . . . . . . . . . . . . . . 48 + 7.2. Normative References . . . . . . . . . . . . . . . . . . 49 + 7.3. Informative References . . . . . . . . . . . . . . . . . 52 + Appendix A. ASN.1 Module . . . . . . . . . . . . . . . . . . . . 57 + Appendix B. Historic Mail Considerations . . . . . . . . . . . . 59 + B.1. DigestAlgorithmIdentifier . . . . . . . . . . . . . . . . 59 + B.2. Signature Algorithms . . . . . . . . . . . . . . . . . . 59 + B.3. ContentEncryptionAlgorithmIdentifier . . . . . . . . . . 61 + B.4. KeyEncryptionAlgorithmIdentifier . . . . . . . . . . . . 62 + Appendix C. Moving S/MIME v2 Message Specification to Historic + Status . . . . . . . . . . . . . . . . . . . . . . . 62 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 62 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 63 + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 4] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +1. Introduction + + S/MIME (Secure/Multipurpose Internet Mail Extensions) provides a + consistent way to send and receive secure MIME data. Based on the + popular Internet MIME standard, S/MIME provides the following + cryptographic security services for electronic messaging + applications: authentication, message integrity, and non-repudiation + of origin (using digital signatures), and data confidentiality (using + encryption). As a supplementary service, S/MIME provides message + compression. + + S/MIME can be used by traditional mail user agents (MUAs) to add + cryptographic security services to mail that is sent, and to + interpret cryptographic security services in mail that is received. + However, S/MIME is not restricted to mail; it can be used with any + transport mechanism that transports MIME data, such as HTTP or SIP. + As such, S/MIME takes advantage of the object-based features of MIME + and allows secure messages to be exchanged in mixed-transport + systems. + + Further, S/MIME can be used in automated message transfer agents that + use cryptographic security services that do not require any human + intervention, such as the signing of software-generated documents and + the encryption of FAX messages sent over the Internet. + + This document defines version 4.0 of the S/MIME Message + Specification. As such, this document obsoletes version 3.2 of the + S/MIME Message Specification [RFC5751]. + + This specification contains a number of references to documents that + have been obsoleted or replaced. This is intentional, as the updated + documents often do not have the same information or protocol + requirements in them. + +1.1. Specification Overview + + This document describes a protocol for adding cryptographic signature + and encryption services to MIME data. The MIME standard [MIME-SPEC] + provides a general structure for the content of Internet messages and + allows extensions for new applications based on content-type. + + This specification defines how to create a MIME body part that has + been cryptographically enhanced according to the Cryptographic + Message Syntax (CMS) [CMS], which is derived from PKCS #7 [RFC2315]. + This specification also defines the application/pkcs7-mime media + type, which can be used to transport those body parts. + + + + + +Schaad, et al. Standards Track [Page 5] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + This document also discusses how to use the multipart/signed media + type defined in [RFC1847] to transport S/MIME signed messages. + multipart/signed is used in conjunction with the + application/pkcs7-signature media type, which is used to transport a + detached S/MIME signature. + + In order to create S/MIME messages, an S/MIME agent MUST follow the + specifications in this document, as well as the specifications listed + in [CMS], [RFC3370], [RFC4056], [RFC3560], and [RFC5754]. + + Throughout this specification, there are requirements and + recommendations made for how receiving agents handle incoming + messages. There are separate requirements and recommendations for + how sending agents create outgoing messages. In general, the best + strategy is to follow the Robustness Principle (be liberal in what + you receive and conservative in what you send). Most of the + requirements are placed on the handling of incoming messages, while + the recommendations are mostly on the creation of outgoing messages. + + The separation for requirements on receiving agents and sending + agents also derives from the likelihood that there will be S/MIME + systems that involve software other than traditional Internet mail + clients. S/MIME can be used with any system that transports MIME + data. An automated process that sends an encrypted message might not + be able to receive an encrypted message at all, for example. Thus, + the requirements and recommendations for the two types of agents are + listed separately when appropriate. + +1.2. Definitions + + For the purposes of this specification, the following definitions + apply. + + ASN.1: + Abstract Syntax Notation One, as defined in ITU-T Recommendations + X.680, X.681, X.682, and X.683 [ASN.1]. + + BER: + Basic Encoding Rules for ASN.1, as defined in ITU-T Recommendation + X.690 [X.690]. + + Certificate: + A type that binds an entity's name to a public key with a digital + signature. + + DER: + Distinguished Encoding Rules for ASN.1, as defined in ITU-T + Recommendation X.690 [X.690]. + + + +Schaad, et al. Standards Track [Page 6] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + 7-bit data: + Text data with lines less than 998 characters long, where none of + the characters have the 8th bit set, and there are no NULL + characters. and occur only as part of a + end-of-line delimiter. + + 8-bit data: + Text data with lines less than 998 characters, and where none of + the characters are NULL characters. and occur only as + part of a end-of-line delimiter. + + Binary data: + Arbitrary data. + + Transfer encoding: + A reversible transformation made on data so 8-bit or binary data + can be sent via a channel that only transmits 7-bit data. + + Receiving agent: + Software that interprets and processes S/MIME CMS objects, MIME + body parts that contain CMS content types, or both. + + Sending agent: + Software that creates S/MIME CMS content types, MIME body parts + that contain CMS content types, or both. + + S/MIME agent: + User software that is a receiving agent, a sending agent, or both. + + Data integrity service: + A security service that protects against unauthorized changes to + data by ensuring that changes to the data are detectable + [RFC4949]. + + Data confidentiality: + The property that data is not disclosed to system entities unless + they have been authorized to know the data [RFC4949]. + +1.3. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + + + + + +Schaad, et al. Standards Track [Page 7] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + We define the additional requirement levels: + + SHOULD+ This term means the same as SHOULD. However, the authors + expect that a requirement marked as SHOULD+ will be + promoted at some future time to be a MUST. + + SHOULD- This term means the same as SHOULD. However, the authors + expect that a requirement marked as SHOULD- will be demoted + to a MAY in a future version of this document. + + MUST- This term means the same as MUST. However, the authors + expect that this requirement will no longer be a MUST in a + future document. Although its status will be determined at + a later time, it is reasonable to expect that if a future + revision of a document alters the status of a MUST- + requirement, it will remain at least a SHOULD or a SHOULD-. + + The term "RSA" in this document almost always refers to the + PKCS #1 v1.5 RSA [RFC2313] signature or encryption algorithms even + when not qualified as such. There are a couple of places where it + refers to the general RSA cryptographic operation; these can be + determined from the context where it is used. + +1.4. Compatibility with Prior Practice of S/MIME + + S/MIME version 4.0 agents ought to attempt to have the greatest + interoperability possible with agents for prior versions of S/MIME. + + - S/MIME version 2 is described in RFC 2311 through RFC 2315 + inclusive [SMIMEv2]. + + - S/MIME version 3 is described in RFC 2630 through RFC 2634 + inclusive and RFC 5035 [SMIMEv3]. + + - S/MIME version 3.1 is described in RFC 2634, RFC 3850, RFC 3851, + RFC 3852, and RFC 5035 [SMIMEv3.1]. + + - S/MIME version 3.2 is described in RFC 2634, RFC 5035, RFC 5652, + RFC 5750, and RFC 5751 [SMIMEv3.2]. + + - [RFC2311] also has historical information about the development of + S/MIME. + + + + + + + + + +Schaad, et al. Standards Track [Page 8] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +1.5. Changes from S/MIME v3 to S/MIME v3.1 + + This section describes the changes made between S/MIME v3 and + S/MIME v3.1. Note that the requirement levels indicated by the + capitalized key words ("MUST", "SHOULD", etc.) may have changed in + later versions of S/MIME. + + - The RSA public key algorithm was changed to a MUST implement. The + key wrap algorithm and the Diffie-Hellman (DH) algorithm [RFC2631] + were changed to a SHOULD implement. + + - The AES symmetric encryption algorithm has been included as a + SHOULD implement. + + - The RSA public key algorithm was changed to a MUST implement + signature algorithm. + + - Ambiguous language about the use of "empty" SignedData messages to + transmit certificates was clarified to reflect that transmission + of Certificate Revocation Lists is also allowed. + + - The use of binary encoding for some MIME entities is now + explicitly discussed. + + - Header protection through the use of the message/rfc822 media type + has been added. + + - Use of the CompressedData CMS type is allowed, along with required + media type and file extension additions. + +1.6. Changes from S/MIME v3.1 to S/MIME v3.2 + + This section describes the changes made between S/MIME v3.1 and + S/MIME v3.2. Note that the requirement levels indicated by the + capitalized key words ("MUST", "SHOULD", etc.) may have changed in + later versions of S/MIME. Note that the section numbers listed here + (e.g., 3.4.3.2) are from [RFC5751]. + + - Made editorial changes, e.g., replaced "MIME type" with "media + type", "content-type" with "Content-Type". + + - Moved "Conventions Used in This Document" to Section 1.3. Added + definitions for SHOULD+, SHOULD-, and MUST-. + + - Section 1.1 and Appendix A: Added references to RFCs for + RSASSA-PSS, RSAES-OAEP, and SHA2 CMS algorithms. Added CMS + Multiple Signers Clarification to CMS reference. + + + + +Schaad, et al. Standards Track [Page 9] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - Section 1.2: Updated references to ASN.1 to X.680, and BER and DER + to X.690. + + - Section 1.4: Added references to S/MIME v3.1 RFCs. + + - Section 2.1 (digest algorithm): SHA-256 added as MUST, SHA-1 and + MD5 made SHOULD-. + + - Section 2.2 (signature algorithms): RSA with SHA-256 added as + MUST; DSA with SHA-256 added as SHOULD+; RSA with SHA-1, DSA with + SHA-1, and RSA with MD5 changed to SHOULD-; and RSASSA-PSS with + SHA-256 added as SHOULD+. Also added note about what S/MIME v3.1 + clients support. + + - Section 2.3 (key encryption): DH changed to SHOULD-, and RSAES- + OAEP added as SHOULD+. Elaborated on requirements for key wrap + algorithm. + + - Section 2.5.1: Added requirement that receiving agents MUST + support both GeneralizedTime and UTCTime. + + - Section 2.5.2: Replaced reference "sha1WithRSAEncryption" with + "sha256WithRSAEncryption", replaced "DES-3EDE-CBC" with "AES-128 + CBC", and deleted the RC5 example. + + - Section 2.5.2.1: Deleted entire section (discussed + deprecated RC2). + + - Section 2.7, Section 2.7.1, and Appendix A: References to RC2/40 + removed. + + - Section 2.7 (content encryption): AES-128 CBC added as MUST, + AES-192 and AES-256 CBC SHOULD+, and tripleDES now SHOULD-. + + - Section 2.7.1: Updated pointers from 2.7.2.1 through 2.7.2.4 to + 2.7.1.1 and 2.7.1.2. + + - Section 3.1.1: Removed text about MIME character sets. + + - Sections 3.2.2 and 3.6: Replaced "encrypted" with "enveloped". + Updated OID example to use AES-128 CBC OID. + + - Section 3.4.3.2: Replaced "micalg" parameter for "SHA-1" with + "sha-1". + + - Section 4: Updated reference to CERT v3.2. + + + + + +Schaad, et al. Standards Track [Page 10] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - Section 4.1: Updated RSA and DSA key size discussion. Moved last + four sentences to security considerations. Updated reference to + randomness requirements for security. + + - Section 5: Added IANA registration templates to update media type + registry to point to this document as opposed to RFC 2311. + + - Section 6: Updated security considerations. + + - Section 7: Moved references from Appendix B to this section. + Updated references. Added informative references to SMIMEv2, + SMIMEv3, and SMIMEv3.1. + + - Appendix B: Added Appendix B to move S/MIME v2 to Historic status. + +1.7. Changes for S/MIME v4.0 + + This section describes the changes made between S/MIME v3.2 and + S/MIME v4.0. + + - Added the use of AuthEnvelopedData, including defining and + registering an smime-type value (Sections 2.4.4 and 3.4). + + - Updated the content-encryption algorithms (Sections 2.7 and + 2.7.1.2): added AES-256 Galois/Counter Mode (GCM), added + ChaCha20-Poly1305, removed mention of AES-192 Cipher Block + Chaining (CBC), and marked tripleDES as historic. + + - Updated the set of signature algorithms (Section 2.2): added the + Edwards-curve Digital Signature Algorithm (EdDSA), added the + Elliptic Curve Digital Signature Algorithm (ECDSA), and marked DSA + as historic. + + - Updated the set of digest algorithms (Section 2.1): added SHA-512, + and marked SHA-1 as historic. + + - Updated the size of keys to be used for RSA encryption and RSA + signing (Section 4). + + - Created Appendix B, which discusses considerations for dealing + with historic email messages. + + + + + + + + + + +Schaad, et al. Standards Track [Page 11] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +2. CMS Options + + CMS allows for a wide variety of options in content, attributes, and + algorithm support. This section puts forth a number of support + requirements and recommendations in order to achieve a base level of + interoperability among all S/MIME implementations. [RFC3370] and + [RFC5754] provide additional details regarding the use of the + cryptographic algorithms. [ESS] provides additional details + regarding the use of additional attributes. + +2.1. DigestAlgorithmIdentifier + + The algorithms here are used for digesting the body of the message + and are not the same as the digest algorithms used as part of the + signature algorithms. The result of this is placed in the + message-digest attribute of the signed attributes. It is RECOMMENDED + that the algorithm used for digesting the body of the message be of + similar strength to, or greater strength than, the signature + algorithm. + + Sending and receiving agents: + + - MUST support SHA-256. + + - MUST support SHA-512. + + [RFC5754] provides the details for using these algorithms with + S/MIME. + +2.2. SignatureAlgorithmIdentifier + + There are different sets of requirements placed on receiving and + sending agents. By having the different requirements, the maximum + amount of interoperability is achieved, as it allows for specialized + protection of private key material but maximum signature validation. + + Receiving agents: + + - MUST support ECDSA with curve P-256 and SHA-256. + + - MUST support EdDSA with curve25519 using PureEdDSA mode [RFC8419]. + + - MUST- support RSA PKCS #1 v1.5 with SHA-256. + + - SHOULD support the RSA Probabilistic Signature Scheme (RSASSA-PSS) + with SHA-256. + + + + + +Schaad, et al. Standards Track [Page 12] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + Sending agents: + + - MUST support at least one of the following algorithms: ECDSA with + curve P-256 and SHA-256, or EdDSA with curve25519 using PureEdDSA + mode. + + - MUST- support RSA PKCS #1 v1.5 with SHA-256. + + - SHOULD support RSASSA-PSS with SHA-256. + + See Section 4.1 for information on key size and algorithm references. + +2.3. KeyEncryptionAlgorithmIdentifier + + Receiving and sending agents: + + - MUST support Elliptic Curve Diffie-Hellman (ECDH) ephemeral-static + mode for P-256, as specified in [RFC5753]. + + - MUST support ECDH ephemeral-static mode for X25519 using HKDF-256 + ("HKDF" stands for "HMAC-based Key Derivation Function") for the + KDF, as specified in [RFC8418]. + + - MUST- support RSA encryption, as specified in [RFC3370]. + + - SHOULD+ support RSA Encryption Scheme - Optimal Asymmetric + Encryption Padding (RSAES-OAEP), as specified in [RFC3560]. + + When ECDH ephemeral-static is used, a key wrap algorithm is also + specified in the KeyEncryptionAlgorithmIdentifier [RFC5652]. The + underlying encryption functions for the key wrap and content- + encryption algorithms [RFC3370] [RFC3565] and the key sizes for the + two algorithms MUST be the same (e.g., AES-128 key wrap algorithm + with AES-128 content-encryption algorithm). As both 128-bit and + 256-bit AES modes are mandatory to implement as content-encryption + algorithms (Section 2.7), both the AES-128 and AES-256 key wrap + algorithms MUST be supported when ECDH ephemeral-static is used. + Recipients MAY enforce this but MUST use the weaker of the two as + part of any cryptographic strength computations they might do. + + Appendix B provides information on algorithm support in older + versions of S/MIME. + +2.4. General Syntax + + There are several CMS content types. Of these, only the Data, + SignedData, EnvelopedData, AuthEnvelopedData, and CompressedData + content types are currently used for S/MIME. + + + +Schaad, et al. Standards Track [Page 13] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +2.4.1. Data Content Type + + Sending agents MUST use the id-data content type identifier to + identify the "inner" MIME message content. For example, when + applying a digital signature to MIME data, the CMS SignedData + encapContentInfo eContentType MUST include the id-data object + identifier (OID), and the media type MUST be stored in the SignedData + encapContentInfo eContent OCTET STRING (unless the sending agent is + using multipart/signed, in which case the eContent is absent, per + Section 3.5.3 of this document). As another example, when applying + encryption to MIME data, the CMS EnvelopedData encryptedContentInfo + contentType MUST include the id-data OID and the encrypted MIME + content MUST be stored in the EnvelopedData encryptedContentInfo + encryptedContent OCTET STRING. + +2.4.2. SignedData Content Type + + Sending agents MUST use the SignedData content type to apply a + digital signature to a message or, in a degenerate case where there + is no signature information, to convey certificates. Applying a + signature to a message provides authentication, message integrity, + and non-repudiation of origin. + +2.4.3. EnvelopedData Content Type + + This content type is used to apply data confidentiality to a message. + In order to distribute the symmetric key, a sender needs to have + access to a public key for each intended message recipient to use + this service. + +2.4.4. AuthEnvelopedData Content Type + + This content type is used to apply data confidentiality and message + integrity to a message. This content type does not provide + authentication or non-repudiation. In order to distribute the + symmetric key, a sender needs to have access to a public key for each + intended message recipient to use this service. + +2.4.5. CompressedData Content Type + + This content type is used to apply data compression to a message. + This content type does not provide authentication, message integrity, + non-repudiation, or data confidentiality; it is only used to reduce + the message's size. + + See Section 3.7 for further guidance on the use of this type in + conjunction with other CMS types. + + + + +Schaad, et al. Standards Track [Page 14] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +2.5. Attributes and the SignerInfo Type + + The SignerInfo type allows the inclusion of unsigned and signed + attributes along with a signature. These attributes can be required + for the processing of messages (e.g., message digest), information + the signer supplied (e.g., SMIME capabilities) that should be + processed, or attributes that are not relevant to the current + situation (e.g., mlExpansionHistory [RFC2634] for mail viewers). + + Receiving agents MUST be able to handle zero or one instance of each + of the signed attributes listed here. Sending agents SHOULD generate + one instance of each of the following signed attributes in each + S/MIME message: + + - Signing time (Section 2.5.1 in this document) + + - SMIME capabilities (Section 2.5.2 in this document) + + - Encryption key Preference (Section 2.5.3 in this document) + + - Message digest (Section 11.2 in [RFC5652]) + + - Content type (Section 11.1 in [RFC5652]) + + Further, receiving agents SHOULD be able to handle zero or one + instance of the signingCertificate and signingCertificateV2 signed + attributes, as defined in Section 5 of RFC 2634 [ESS] and Section 3 + of RFC 5035 [ESS], respectively. + + Sending agents SHOULD generate one instance of the signingCertificate + or signingCertificateV2 signed attribute in each SignerInfo + structure. + + Additional attributes and values for these attributes might be + defined in the future. Receiving agents SHOULD handle attributes or + values that they do not recognize in a graceful manner. + + Interactive sending agents that include signed attributes that are + not listed here SHOULD display those attributes to the user, so that + the user is aware of all of the data being signed. + +2.5.1. Signing Time Attribute + + The signingTime attribute is used to convey the time that a message + was signed. The time of signing will most likely be created by a + signer and therefore is only as trustworthy as that signer. + + + + + +Schaad, et al. Standards Track [Page 15] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + Sending agents MUST encode signing time through the year 2049 as + UTCTime; signing times in 2050 or later MUST be encoded as + GeneralizedTime. When the UTCTime CHOICE is used, S/MIME agents MUST + interpret the year field (YY) as follows: + + If YY is greater than or equal to 50, the year is interpreted as + 19YY; if YY is less than 50, the year is interpreted as 20YY. + + Receiving agents MUST be able to process signingTime attributes that + are encoded in either UTCTime or GeneralizedTime. + +2.5.2. SMIMECapabilities Attribute + + The SMIMECapabilities attribute includes signature algorithms (such + as "sha256WithRSAEncryption"), symmetric algorithms (such as "AES-128 + CBC"), authenticated symmetric algorithms (such as "AES-128 GCM"), + and key encipherment algorithms (such as "rsaEncryption"). The + presence of an SMIMECapability attribute containing an algorithm + implies that the sender can deal with the algorithm as well as + understand the ASN.1 structures associated with that algorithm. + There are also several identifiers that indicate support for other + optional features such as binary encoding and compression. The + SMIMECapabilities attribute was designed to be flexible and + extensible so that, in the future, a means of identifying other + capabilities and preferences such as certificates can be added in a + way that will not cause current clients to break. + + If present, the SMIMECapabilities attribute MUST be a + SignedAttribute. CMS defines SignedAttributes as a SET OF Attribute. + The SignedAttributes in a signerInfo MUST include a single instance + of the SMIMECapabilities attribute. CMS defines the ASN.1 syntax for + Attribute to include attrValues SET OF AttributeValue. An + SMIMECapabilities attribute MUST only include a single instance of + AttributeValue. If a signature is detected as violating these + requirements, the signature SHOULD be treated as failing. + + The semantics of the SMIMECapabilities attribute specify a partial + list as to what the client announcing the SMIMECapabilities can + support. A client does not have to list every capability it + supports, and it need not list all its capabilities so that the + capabilities list doesn't get too long. In an SMIMECapabilities + attribute, the OIDs are listed in order of their preference but + SHOULD be separated logically along the lines of their categories + (signature algorithms, symmetric algorithms, key encipherment + algorithms, etc.). + + + + + + +Schaad, et al. Standards Track [Page 16] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + The structure of the SMIMECapabilities attribute is to facilitate + simple table lookups and binary comparisons in order to determine + matches. For instance, the encoding for the SMIMECapability for + sha256WithRSAEncryption includes rather than omits the NULL + parameter. Because of the requirement for identical encoding, + individuals documenting algorithms to be used in the + SMIMECapabilities attribute SHOULD explicitly document the correct + byte sequence for the common cases. + + For any capability, the associated parameters for the OID MUST + specify all of the parameters necessary to differentiate between two + instances of the same algorithm. + + The same OID that is used to identify an algorithm SHOULD also be + used in the SMIMECapability for that algorithm. There are cases + where a single OID can correspond to multiple algorithms. In these + cases, a single algorithm MUST be assigned to the SMIMECapability + using that OID. Additional OIDs from the smimeCapabilities OID tree + are then allocated for the other algorithms usages. For instance, in + an earlier specification, rsaEncryption was ambiguous because it + could refer to either a signature algorithm or a key encipherment + algorithm. In the event that an OID is ambiguous, it needs to be + arbitrated by the maintainer of the registered SMIMECapabilities list + as to which type of algorithm will use the OID, and a new OID MUST be + allocated under the smimeCapabilities OID to satisfy the other use of + the OID. + + The registered SMIMECapabilities list specifies the parameters for + OIDs that need them, most notably key lengths in the case of + variable-length symmetric ciphers. In the event that there are no + differentiating parameters for a particular OID, the parameters MUST + be omitted and MUST NOT be encoded as NULL. Additional values for + the SMIMECapabilities attribute might be defined in the future. + Receiving agents MUST handle an SMIMECapabilities object that has + values that it does not recognize in a graceful manner. + + Section 2.7.1 explains a strategy for caching capabilities. + +2.5.3. Encryption Key Preference Attribute + + The encryption key preference attribute allows the signer to + unambiguously describe which of the signer's certificates has the + signer's preferred encryption key. This attribute is designed to + enhance behavior for interoperating with those clients that use + separate keys for encryption and signing. This attribute is used to + convey to anyone viewing the attribute which of the listed + certificates is appropriate for encrypting a session key for future + encrypted messages. + + + +Schaad, et al. Standards Track [Page 17] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + If present, the SMIMEEncryptionKeyPreference attribute MUST be a + SignedAttribute. CMS defines SignedAttributes as a SET OF Attribute. + The SignedAttributes in a signerInfo MUST include a single instance + of the SMIMEEncryptionKeyPreference attribute. CMS defines the ASN.1 + syntax for Attribute to include attrValues SET OF AttributeValue. An + SMIMEEncryptionKeyPreference attribute MUST only include a single + instance of AttributeValue. If a signature is detected as violating + these requirements, the signature SHOULD be treated as failing. + + The sending agent SHOULD include the referenced certificate in the + set of certificates included in the signed message if this attribute + is used. The certificate MAY be omitted if it has been previously + made available to the receiving agent. Sending agents SHOULD use + this attribute if the commonly used or preferred encryption + certificate is not the same as the certificate used to sign the + message. + + Receiving agents SHOULD store the preference data if the signature on + the message is valid and the signing time is greater than the + currently stored value. (As with the SMIMECapabilities, the clock + skew SHOULD be checked and the data not used if the skew is too + great.) Receiving agents SHOULD respect the sender's encryption key + preference attribute if possible. This, however, represents only a + preference, and the receiving agent can use any certificate in + replying to the sender that is valid. + + Section 2.7.1 explains a strategy for caching preference data. + +2.5.3.1. Selection of Recipient Key Management Certificate + + In order to determine the key management certificate to be used when + sending a future CMS EnvelopedData message for a particular + recipient, the following steps SHOULD be followed: + + - If an SMIMEEncryptionKeyPreference attribute is found in a + SignedData object received from the desired recipient, this + identifies the X.509 certificate that SHOULD be used as the X.509 + key management certificate for the recipient. + + - If an SMIMEEncryptionKeyPreference attribute is not found in a + SignedData object received from the desired recipient, the set of + X.509 certificates SHOULD be searched for an X.509 certificate + with the same subject name as the signer of an X.509 certificate + that can be used for key management. + + + + + + + +Schaad, et al. Standards Track [Page 18] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - Or, use some other method of determining the user's key management + key. If an X.509 key management certificate is not found, then + encryption cannot be done with the signer of the message. If + multiple X.509 key management certificates are found, the S/MIME + agent can make an arbitrary choice between them. + +2.6. SignerIdentifier SignerInfo Type + + S/MIME v4.0 implementations MUST support both issuerAndSerialNumber + and subjectKeyIdentifier. Messages that use the subjectKeyIdentifier + choice cannot be read by S/MIME v2 clients. + + It is important to understand that some certificates use a value for + subjectKeyIdentifier that is not suitable for uniquely identifying a + certificate. Implementations MUST be prepared for multiple + certificates for potentially different entities to have the same + value for subjectKeyIdentifier and MUST be prepared to try each + matching certificate during signature verification before indicating + an error condition. + +2.7. ContentEncryptionAlgorithmIdentifier + + Sending and receiving agents: + + - MUST support encryption and decryption with AES-128 GCM and + AES-256 GCM [RFC5084]. + + - MUST- support encryption and decryption with AES-128 CBC + [RFC3565]. + + - SHOULD+ support encryption and decryption with ChaCha20-Poly1305 + [RFC7905]. + +2.7.1. Deciding Which Encryption Method to Use + + When a sending agent creates an encrypted message, it has to decide + which type of encryption to use. The decision process involves using + information garnered from the capabilities lists included in messages + received from the recipient, as well as out-of-band information such + as private agreements, user preferences, legal restrictions, and + so on. + + Section 2.5.2 defines a method by which a sending agent can + optionally announce, among other things, its decrypting capabilities + in its order of preference. The following method for processing and + remembering the encryption capabilities attribute in incoming signed + messages SHOULD be used. + + + + +Schaad, et al. Standards Track [Page 19] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - If the receiving agent has not yet created a list of capabilities + for the sender's public key, then, after verifying the signature + on the incoming message and checking the timestamp, the receiving + agent SHOULD create a new list containing at least the signing + time and the symmetric capabilities. + + - If such a list already exists, the receiving agent SHOULD verify + that the signing time in the incoming message is greater than the + signing time stored in the list and that the signature is valid. + If so, the receiving agent SHOULD update both the signing time and + capabilities in the list. Values of the signing time that lie far + in the future (that is, a greater discrepancy than any reasonable + clock skew), or a capabilities list in messages whose signature + could not be verified, MUST NOT be accepted. + + The list of capabilities SHOULD be stored for future use in creating + messages. + + Before sending a message, the sending agent MUST decide whether it is + willing to use weak encryption for the particular data in the + message. If the sending agent decides that weak encryption is + unacceptable for this data, then the sending agent MUST NOT use a + weak algorithm. The decision to use or not use weak encryption + overrides any other decision in this section about which encryption + algorithm to use. + + Sections 2.7.1.1 and 2.7.1.2 describe the decisions a sending agent + SHOULD use when choosing which type of encryption will be applied to + a message. These rules are ordered, so the sending agent SHOULD make + its decision in the order given. + +2.7.1.1. Rule 1: Known Capabilities + + If the sending agent has received a set of capabilities from the + recipient for the message the agent is about to encrypt, then the + sending agent SHOULD use that information by selecting the first + capability in the list (that is, the capability most preferred by the + intended recipient) that the sending agent knows how to encrypt. The + sending agent SHOULD use one of the capabilities in the list if the + agent reasonably expects the recipient to be able to decrypt the + message. + +2.7.1.2. Rule 2: Unknown Capabilities, Unknown Version of S/MIME + + If the following two conditions are met, the sending agent SHOULD use + AES-256 GCM, as AES-256 GCM is a stronger algorithm and is required + by S/MIME v4.0: + + + + +Schaad, et al. Standards Track [Page 20] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - The sending agent has no knowledge of the encryption capabilities + of the recipient. + + - The sending agent has no knowledge of the version of S/MIME used + or supported by the recipient. + + If the sending agent chooses not to use AES-256 GCM in this step, + given the presumption is that a client implementing AES-GCM would do + both AES-256 and AES-128, it SHOULD use AES-128 CBC. + +2.7.2. Choosing Weak Encryption + + Algorithms such as RC2 are considered to be weak encryption + algorithms. Algorithms such as TripleDES are not state of the art + and are considered to be weaker algorithms than AES. A sending agent + that is controlled by a human SHOULD allow a human sender to + determine the risks of sending data using a weaker encryption + algorithm before sending the data, and possibly allow the human to + use a stronger encryption algorithm such as AES GCM or AES CBC even + if there is a possibility that the recipient will not be able to + process that algorithm. + +2.7.3. Multiple Recipients + + If a sending agent is composing an encrypted message to a group of + recipients where the encryption capabilities of some of the + recipients do not overlap, the sending agent is forced to send more + than one message. Please note that if the sending agent chooses to + send a message encrypted with a strong algorithm and then send the + same message encrypted with a weak algorithm, someone watching the + communications channel could learn the contents of the strongly + encrypted message simply by decrypting the weakly encrypted message. + +3. Creating S/MIME Messages + + This section describes the S/MIME message formats and how they are + created. S/MIME messages are a combination of MIME bodies and CMS + content types. Several media types as well as several CMS content + types are used. The data to be secured is always a canonical MIME + entity. The MIME entity and other data, such as certificates and + algorithm identifiers, are given to CMS processing facilities that + produce a CMS object. Finally, the CMS object is wrapped in MIME. + The "Enhanced Security Services for S/MIME" documents [ESS] provide + descriptions of how nested, secured S/MIME messages are formatted. + ESS provides a description of how a triple-wrapped S/MIME message is + formatted using multipart/signed and application/pkcs7-mime for the + signatures. + + + + +Schaad, et al. Standards Track [Page 21] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + S/MIME provides one format for enveloped-only data, several formats + for signed-only data, and several formats for signed and enveloped + data. Several formats are required to accommodate several + environments -- in particular, for signed messages. The criteria for + choosing among these formats are also described. + + Anyone reading this section is expected to understand MIME as + described in [MIME-SPEC] and [RFC1847]. + +3.1. Preparing the MIME Entity for Signing, Enveloping, or Compressing + + S/MIME is used to secure MIME entities. A MIME message is composed + of a MIME header and a MIME body. A body can consist of a single + MIME entity or a tree of MIME entities (rooted with a multipart). + S/MIME can be used to secure either a single MIME entity or a tree of + MIME entities. These entities can be in locations other than the + root. S/MIME can be applied multiple times to different entities in + a single message. A MIME entity that is the whole message includes + only the MIME message headers and MIME body and does not include the + rfc822 header. Note that S/MIME can also be used to secure MIME + entities used in applications other than Internet mail. For cases + where protection of the rfc822 header is required, the use of the + message/rfc822 media type is explained later in this section. + + The MIME entity that is secured and described in this section can be + thought of as the "inside" MIME entity. That is, it is the + "innermost" object in what is possibly a larger MIME message. + Processing "outside" MIME entities into CMS EnvelopedData, + CompressedData, and AuthEnvelopedData content types is described in + Sections 3.2 and 3.5. Other documents define additional CMS content + types; those documents should be consulted for processing those CMS + content types. + + The procedure for preparing a MIME entity is given in [MIME-SPEC]. + The same procedure is used here with some additional restrictions + when signing. The description of the procedures from [MIME-SPEC] is + repeated here, but it is suggested that the reader refer to those + documents for the exact procedures. This section also describes + additional requirements. + + A single procedure is used for creating MIME entities that are to + have any combination of signing, enveloping, and compressing applied. + Some additional steps are recommended to defend against known + corruptions that can occur during mail transport that are of + particular importance for clear-signing using the multipart/signed + format. It is recommended that these additional steps be performed + on enveloped messages, or signed and enveloped messages, so that the + messages can be forwarded to any environment without modification. + + + +Schaad, et al. Standards Track [Page 22] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + These steps are descriptive rather than prescriptive. The + implementer is free to use any procedure as long as the result is + the same. + + Step 1. The MIME entity is prepared according to local conventions. + + Step 2. The leaf parts of the MIME entity are converted to + canonical form. + + Step 3. Appropriate transfer encoding is applied to the leaves + of the MIME entity. + + When an S/MIME message is received, the security services on the + message are processed, and the result is the MIME entity. That MIME + entity is typically passed to a MIME-capable user agent where it is + further decoded and presented to the user or receiving application. + + In order to protect outer, non-content-related message header fields + (for instance, the "Subject", "To", "From", and "Cc" fields), the + sending client MAY wrap a full MIME message in a message/rfc822 + wrapper in order to apply S/MIME security services to these header + fields. It is up to the receiving client to decide how to present + this "inner" header along with the unprotected "outer" header. Given + the security difference between headers, it is RECOMMENDED that the + receiving client provide a distinction between header fields, + depending on where they are located. + + When an S/MIME message is received, if the top-level protected MIME + entity has a Content-Type of message/rfc822, it can be assumed that + the intent was to provide header protection. This entity SHOULD be + presented as the top-level message, taking into account + header-merging issues as previously discussed. + +3.1.1. Canonicalization + + Each MIME entity MUST be converted to a canonical form that is + uniquely and unambiguously representable in the environment where the + signature is created and the environment where the signature will be + verified. MIME entities MUST be canonicalized for enveloping and + compressing as well as signing. + + The exact details of canonicalization depend on the actual media type + and subtype of an entity and are not described here. Instead, the + standard for the particular media type SHOULD be consulted. For + example, canonicalization of type text/plain is different from + canonicalization of audio/basic. Other than text types, most types + have only one representation, regardless of computing platform or + environment, that can be considered their canonical representation. + + + +Schaad, et al. Standards Track [Page 23] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + In general, canonicalization will be performed by the non-security + part of the sending agent rather than the S/MIME implementation. + + The most common and important canonicalization is for text, which is + often represented differently in different environments. MIME + entities of major type "text" MUST have both their line endings and + character set canonicalized. The line ending MUST be the pair of + characters , and the charset SHOULD be a registered charset + [CHARSETS]. The details of the canonicalization are specified in + [MIME-SPEC]. + + Note that some charsets such as ISO-2022 have multiple + representations for the same characters. When preparing such text + for signing, the canonical representation specified for the charset + MUST be used. + +3.1.2. Transfer Encoding + + When generating any of the secured MIME entities below, except the + signing using the multipart/signed format, no transfer encoding is + required at all. S/MIME implementations MUST be able to deal with + binary MIME objects. If no Content-Transfer-Encoding header field is + present, the transfer encoding is presumed to be 7BIT. + + As a rule, S/MIME implementations SHOULD use transfer encoding as + described in Section 3.1.3 for all MIME entities they secure. The + reason for securing only 7-bit MIME entities, even for enveloped data + that is not exposed to the transport, is that it allows the MIME + entity to be handled in any environment without changing it. For + example, a trusted gateway might remove the envelope, but not the + signature, of a message, and then forward the signed message on to + the end recipient so that they can verify the signatures directly. + If the transport internal to the site is not 8-bit clean, such as on + a wide-area network with a single mail gateway, verifying the + signature will not be possible unless the original MIME entity was + only 7-bit data. + + In the case where S/MIME implementations can determine that all + intended recipients are capable of handling inner (all but the + outermost) binary MIME objects, implementations SHOULD use binary + encoding as opposed to a 7-bit-safe transfer encoding for the inner + entities. The use of a 7-bit-safe encoding (such as base64) + unnecessarily expands the message size. Implementations MAY + determine that recipient implementations are capable of + handling inner binary MIME entities by (1) interpreting the + id-cap-preferBinaryInside SMIMECapabilities attribute, (2) prior + agreement, or (3) other means. + + + + +Schaad, et al. Standards Track [Page 24] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + If one or more intended recipients are unable to handle inner binary + MIME objects or if this capability is unknown for any of the intended + recipients, S/MIME implementations SHOULD use transfer encoding as + described in Section 3.1.3 for all MIME entities they secure. + +3.1.3. Transfer Encoding for Signing Using multipart/signed + + If a multipart/signed entity is ever to be transmitted over the + standard Internet SMTP infrastructure or other transport that is + constrained to 7-bit text, it MUST have transfer encoding applied so + that it is represented as 7-bit text. MIME entities that are already + 7-bit data need no transfer encoding. Entities such as 8-bit text + and binary data can be encoded with quoted-printable or base64 + transfer encoding. + + The primary reason for the 7-bit requirement is that the Internet + mail transport infrastructure cannot guarantee transport of 8-bit or + binary data. Even though many segments of the transport + infrastructure now handle 8-bit and even binary data, it is sometimes + not possible to know whether the transport path is 8-bit clean. If a + mail message with 8-bit data were to encounter a message transfer + agent that cannot transmit 8-bit or binary data, the agent has three + options, none of which are acceptable for a clear-signed message: + + - The agent could change the transfer encoding; this would + invalidate the signature. + + - The agent could transmit the data anyway, which would most likely + result in the 8th bit being corrupted; this too would invalidate + the signature. + + - The agent could return the message to the sender. + + [RFC1847] prohibits an agent from changing the transfer encoding of + the first part of a multipart/signed message. If a compliant agent + that cannot transmit 8-bit or binary data encountered a + multipart/signed message with 8-bit or binary data in the first part, + it would have to return the message to the sender as undeliverable. + +3.1.4. Sample Canonical MIME Entity + + This example shows a multipart/mixed message with full transfer + encoding. This message contains a text part and an attachment. The + sample message text includes characters that are not ASCII and thus + need to be transfer encoded. Though not shown here, the end of each + line is . The line ending of the MIME headers, the text, and + the transfer-encoded parts all MUST be . + + + + +Schaad, et al. Standards Track [Page 25] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + Note that this example is not an example of an S/MIME message. + + Content-Type: multipart/mixed; boundary=bar + + --bar + Content-Type: text/plain; charset=iso-8859-1 + Content-Transfer-Encoding: quoted-printable + + =A1Hola Michael! + + How do you like the new S/MIME specification? + + It's generally a good idea to encode lines that begin with + From=20because some mail transport agents will insert a + greater-than (>) sign, thus invalidating the signature. + + Also, in some cases it might be desirable to encode any =20 + trailing whitespace that occurs on lines in order to ensure =20 + that the message signature is not invalidated when passing =20 + a gateway that modifies such whitespace (like BITNET). =20 + + --bar + Content-Type: image/jpeg + Content-Transfer-Encoding: base64 + + iQCVAwUBMJrRF2N9oWBghPDJAQE9UQQAtl7LuRVndBjrk4EqYBIb3h5QXIX/LC// + jJV5bNvkZIGPIcEmI5iFd9boEgvpirHtIREEqLQRkYNoBActFBZmh9GC3C041WGq + uMbrbxc+nIs1TIKlA08rVi9ig/2Yh7LFrK5Ein57U/W72vgSxLhe/zhdfolT9Brn + HOxEa44b+EI= + + --bar-- + +3.2. The application/pkcs7-mime Media Type + + The application/pkcs7-mime media type is used to carry CMS content + types, including EnvelopedData, SignedData, and CompressedData. The + details of constructing these entities are described in subsequent + sections. This section describes the general characteristics of the + application/pkcs7-mime media type. + + The carried CMS object always contains a MIME entity that is prepared + as described in Section 3.1 if the eContentType is id-data. Other + contents MAY be carried when the eContentType contains different + values. See [ESS] for an example of this with signed receipts. + + Since CMS content types are binary data, in most cases base64 + transfer encoding is appropriate -- in particular, when used with + SMTP transport. The transfer encoding used depends on the transport + + + +Schaad, et al. Standards Track [Page 26] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + through which the object is to be sent and is not a characteristic of + the media type. + + Note that this discussion refers to the transfer encoding of the CMS + object or "outside" MIME entity. It is completely distinct from, and + unrelated to, the transfer encoding of the MIME entity secured by the + CMS object -- the "inside" object, which is described in Section 3.1. + + Because there are several types of application/pkcs7-mime objects, a + sending agent SHOULD do as much as possible to help a receiving agent + know about the contents of the object without forcing the receiving + agent to decode the ASN.1 for the object. The Content-Type header + field of all application/pkcs7-mime objects SHOULD include the + optional "smime-type" parameter, as described in the following + sections. + +3.2.1. The name and filename Parameters + + For application/pkcs7-mime, sending agents SHOULD emit the + optional "name" parameter to the Content-Type field for compatibility + with older systems. Sending agents SHOULD also emit the optional + Content-Disposition field [RFC2183] with the "filename" parameter. + If a sending agent emits the above parameters, the value of the + parameters SHOULD be a filename with the appropriate extension: + + File + Media Type Extension + ------------------------------------------------------------------- + application/pkcs7-mime (SignedData, EnvelopedData, .p7m + AuthEnvelopedData) + application/pkcs7-mime (degenerate SignedData certificate .p7c + management message) + application/pkcs7-mime (CompressedData) .p7z + application/pkcs7-signature (SignedData) .p7s + + In addition, the filename SHOULD be limited to eight characters + followed by a three-letter extension. The eight-character filename + base can be any distinct name; the use of the filename base "smime" + SHOULD be used to indicate that the MIME entity is associated with + S/MIME. + + Including a filename serves two purposes. It facilitates easier use + of S/MIME objects as files on disk. It also can convey type + information across gateways. When a MIME entity of type + application/pkcs7-mime (for example) arrives at a gateway that has no + special knowledge of S/MIME, it will default the entity's media type + to application/octet-stream and treat it as a generic attachment, + thus losing the type information. However, the suggested filename + + + +Schaad, et al. Standards Track [Page 27] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + for an attachment is often carried across a gateway. This often + allows the receiving systems to determine the appropriate application + to hand the attachment off to -- in this case, a standalone S/MIME + processing application. Note that this mechanism is provided as a + convenience for implementations in certain environments. A proper + S/MIME implementation MUST use the media types and MUST NOT rely on + the file extensions. + +3.2.2. The smime-type Parameter + + The application/pkcs7-mime content type defines the optional + "smime-type" parameter. The intent of this parameter is to convey + details about the security applied (signed or enveloped) along with + information about the contained content. This specification defines + the following smime-types. + + Name CMS Type Inner Content + ---------------------------------------------------------- + enveloped-data EnvelopedData id-data + signed-data SignedData id-data + certs-only SignedData id-data + compressed-data CompressedData id-data + authEnveloped-data AuthEnvelopedData id-data + + In order for consistency to be obtained with future specifications, + the following guidelines SHOULD be followed when assigning a new + smime-type parameter. + + 1. If both signing and encryption can be applied to the content, + then three values for smime-type SHOULD be assigned: "signed-*", + "authEnv-*", and "enveloped-*". If one operation can be + assigned, then this can be omitted. Thus, since "certs-only" can + only be signed, "signed-" is omitted. + + 2. A common string for a content OID SHOULD be assigned. We use + "data" for the id-data content OID when MIME is the inner + content. + + 3. If no common string is assigned, then the common string of + "OID." is recommended (for example, + "OID.2.16.840.1.101.3.4.1.2" would be AES-128 CBC). + + It is explicitly intended that this field be a suitable hint for mail + client applications to indicate whether a message is "signed", + "authEnveloped", or "enveloped" without having to tunnel into the CMS + payload. + + + + + +Schaad, et al. Standards Track [Page 28] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + A registry for additional smime-type parameter values has been + defined in [RFC7114]. + +3.3. Creating an Enveloped-Only Message + + This section describes the format for enveloping a MIME entity + without signing it. It is important to note that sending enveloped + but not signed messages does not provide for data integrity. The + "enveloped-only" structure does not support authenticated symmetric + algorithms. Use the "authenticated enveloped" structure for these + algorithms. Thus, it is possible to replace ciphertext in such a way + that the processed message will still be valid, but the meaning can + be altered. + + Step 1. The MIME entity to be enveloped is prepared according to + Section 3.1. + + Step 2. The MIME entity and other required data are processed into a + CMS object of type EnvelopedData. In addition to encrypting + a copy of the content-encryption key (CEK) for each + recipient, a copy of the CEK SHOULD be encrypted for the + originator and included in the EnvelopedData (see [RFC5652], + Section 6). + + Step 3. The EnvelopedData object is wrapped in a CMS ContentInfo + object. + + Step 4. The ContentInfo object is inserted into an + application/pkcs7-mime MIME entity. + + The smime-type parameter for enveloped-only messages is + "enveloped-data". The file extension for this type of message + is ".p7m". + + A sample message would be: + + Content-Type: application/pkcs7-mime; name=smime.p7m; + smime-type=enveloped-data + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename=smime.p7m + + MIIBHgYJKoZIhvcNAQcDoIIBDzCCAQsCAQAxgcAwgb0CAQAwJjASMRAwDgYDVQQDEw + dDYXJsUlNBAhBGNGvHgABWvBHTbi7NXXHQMA0GCSqGSIb3DQEBAQUABIGAC3EN5nGI + iJi2lsGPcP2iJ97a4e8kbKQz36zg6Z2i0yx6zYC4mZ7mX7FBs3IWg+f6KgCLx3M1eC + bWx8+MDFbbpXadCDgO8/nUkUNYeNxJtuzubGgzoyEd8Ch4H/dd9gdzTd+taTEgS0ip + dSJuNnkVY4/M652jKKHRLFf02hosdR8wQwYJKoZIhvcNAQcBMBQGCCqGSIb3DQMHBA + gtaMXpRwZRNYAgDsiSf8Z9P43LrY4OxUk660cu1lXeCSFOSOpOJ7FuVyU= + + + + +Schaad, et al. Standards Track [Page 29] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +3.4. Creating an Authenticated Enveloped-Only Message + + This section describes the format for enveloping a MIME entity + without signing it. Authenticated enveloped messages provide + confidentiality and data integrity. It is important to note that + sending authenticated enveloped messages does not provide for proof + of origination when using S/MIME. It is possible for a third party + to replace ciphertext in such a way that the processed message will + still be valid, but the meaning can be altered. However, this is + substantially more difficult than it is for an enveloped-only + message, as the algorithm does provide a level of authentication. + Any recipient for whom the message is encrypted can replace it + without detection. + + Step 1. The MIME entity to be enveloped is prepared according to + Section 3.1. + + Step 2. The MIME entity and other required data are processed into a + CMS object of type AuthEnvelopedData. In addition to + encrypting a copy of the CEK for each recipient, a copy of + the CEK SHOULD be encrypted for the originator and included + in the AuthEnvelopedData (see [RFC5083]). + + Step 3. The AuthEnvelopedData object is wrapped in a CMS ContentInfo + object. + + Step 4. The ContentInfo object is inserted into an + application/pkcs7-mime MIME entity. + + The smime-type parameter for authenticated enveloped-only messages is + "authEnveloped-data". The file extension for this type of message + is ".p7m". + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 30] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + A sample message would be: + + Content-Type: application/pkcs7-mime; smime-type=authEnveloped-data; + name=smime.p7m + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename=smime.p7m + + MIIDWQYLKoZIhvcNAQkQARegggNIMIIDRAIBADGBvjCBuwIBADAmMBIxEDAO + BgNVBAMTB0NhcmxSU0ECEEY0a8eAAFa8EdNuLs1dcdAwCwYJKoZIhvcNAQEB + BIGAgyZJo0ERTxA4xdTri5P5tVMyh0RARepTUCORZvlUbcUlaI8IpJZH3/J1 + Fv6MxTRS4O/K+ZcTlQmYeWLQvwdltQdOIP3mhpqXzTnOYhTK1IDtF2zx75Lg + vE+ilpcLIzXfJB4RCBPtBWaHAof4Wb+VMQvLkk9OolX4mRSH1LPktgAwggJq + BgkqhkiG9w0BBwEwGwYJYIZIAWUDBAEGMA4EDGPizioC9OHSsnNx4oCCAj7Y + Cb8rOy8+55106newEJohC/aDgWbJhrMKzSOwa7JraXOV3HXD3NvKbl665dRx + vmDwSCNaLCRU5q8/AxQx2SvnAbM+JKcEfC/VFdd4SiHNiUECAApLku2rMi5B + WrhW/FXmx9d+cjum2BRwB3wj0q1wajdB0/kVRbQwg697dnlYyUog4vpJERjr + 7KAkawZx1RMHaM18wgZjUNpCBXFS3chQi9mTBp2i2Hf5iZ8OOtTx+rCQUmI6 + Jhy03vdcPCCARBjn3v0d3upZYDZddMA41CB9fKnnWFjadV1KpYwv80tqsEfx + Vo0lJQ5VtJ8MHJiBpLVKadRIZ4iH2ULC0JtN5mXE1SrFKh7cqbJ4+7nqSRL3 + oBTud3rX41DGshOjpqcYHT4sqYlgZkc6dp0g1+hF1p3cGmjHdpysV2NVSUev + ghHbvSqhIsXFzRSWKiZOigmlkv3R5LnjpYyP4brM62Jl7y0qborvV4dNMz7m + D+5YxSlH0KAe8z6TT3LHuQdN7QCkFoiUSCaNhpAFaakkGIpqcqLhpOK4lXxt + kptCG93eUwNCcTxtx6bXufPR5TUHohvZvfeqMp42kL37FJC/A8ZHoOxXy8+X + X5QYxCQNuofWlvnIWv0Nr8w65x6lgVjPYmd/cHwzQKBTBMXN6pBud/PZL5zF + tw3QHlQkBR+UflMWZKeN9L0KdQ27mQlCo5gQS85aifxoiiA2v9+0hxZw91rP + IW4D+GS7oMMoKj8ZNyCJJsyf5smRZ+WxeBoolb3+TiGcBBCsRnfe6noLZiFO + 6Zeu2ZwE + +3.5. Creating a Signed-Only Message + + There are two formats for signed messages defined for S/MIME: + + - application/pkcs7-mime with SignedData. + + - multipart/signed. + + In general, the multipart/signed form is preferred for sending, and + receiving agents MUST be able to handle both. + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 31] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +3.5.1. Choosing a Format for Signed-Only Messages + + There are no hard-and-fast rules as to when a particular signed-only + format is chosen. It depends on the capabilities of all the + receivers and the relative importance of receivers with S/MIME + facilities being able to verify the signature versus the importance + of receivers without S/MIME software being able to view the message. + + Messages signed using the multipart/signed format can always be + viewed by the receiver whether or not they have S/MIME software. + They can also be viewed whether they are using a MIME-native user + agent or they have messages translated by a gateway. In this + context, "be viewed" means the ability to process the message + essentially as if it were not a signed message, including any other + MIME structure the message might have. + + Messages signed using the SignedData format cannot be viewed by a + recipient unless they have S/MIME facilities. However, the + SignedData format protects the message content from being changed by + benign intermediate agents. Such agents might do line wrapping or + content-transfer encoding changes that would break the signature. + +3.5.2. Signing Using application/pkcs7-mime with SignedData + + This signing format uses the application/pkcs7-mime media type. The + steps to create this format are as follows: + + Step 1. The MIME entity is prepared according to Section 3.1. + + Step 2. The MIME entity and other required data are processed into a + CMS object of type SignedData. + + Step 3. The SignedData object is wrapped in a CMS ContentInfo + object. + + Step 4. The ContentInfo object is inserted into an + application/pkcs7-mime MIME entity. + + The smime-type parameter for messages using application/pkcs7-mime + with SignedData is "signed-data". The file extension for this type + of message is ".p7m". + + + + + + + + + + +Schaad, et al. Standards Track [Page 32] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + A sample message would be: + + Content-Type: application/pkcs7-mime; smime-type=signed-data; + name=smime.p7m + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename=smime.p7m + + MIIDmQYJKoZIhvcNAQcCoIIDijCCA4YCAQExCTAHBgUrDgMCGjAtBgkqhkiG9w0BBw + GgIAQeDQpUaGlzIGlzIHNvbWUgc2FtcGxlIGNvbnRlbnQuoIIC4DCCAtwwggKboAMC + AQICAgDIMAkGByqGSM44BAMwEjEQMA4GA1UEAxMHQ2FybERTUzAeFw05OTA4MTcwMT + EwNDlaFw0zOTEyMzEyMzU5NTlaMBMxETAPBgNVBAMTCEFsaWNlRFNTMIIBtjCCASsG + ByqGSM44BAEwggEeAoGBAIGNze2D6gqeOT7CSCij5EeT3Q7XqA7sU8WrhAhP/5Thc0 + h+DNbzREjR/p+vpKGJL+HZMMg23j+bv7dM3F9piuR10DcMkQiVm96nXvn89J8v3UOo + i1TxP7AHCEdNXYjDw7Wz41UIddU5dhDEeL3/nbCElzfy5FEbteQJllzzflvbAhUA4k + emGkVmuBPG2o+4NyErYov3k80CgYAmONAUiTKqOfs+bdlLWWpMdiM5BAI1XPLLGjDD + HlBd3ZtZ4s2qBT1YwHuiNrhuB699ikIlp/R1z0oIXks+kPht6pzJIYo7dhTpzi5dow + fNI4W4LzABfG1JiRGJNkS9+MiVSlNWteL5c+waYTYfEX/Cve3RUP+YdMLRgUpgObo2 + OQOBhAACgYBc47ladRSWC6l63eM/qeysXty9txMRNKYWiSgRI9k0hmd1dRMSPUNbb+ + VRv/qJ8qIbPiR9PQeNW2PIu0WloErjhdbOBoA/6CN+GvIkq1MauCcNHu8Iv2YUgFxi + rGX6FYvxuzTU0pY39mFHssQyhPB+QUD9RqdjTjPypeL08oPluKOBgTB/MAwGA1UdEw + EB/wQCMAAwDgYDVR0PAQH/BAQDAgbAMB8GA1UdIwQYMBaAFHBEPoIub4feStN14z0g + vEMrk/EfMB0GA1UdDgQWBBS+bKGz48H37UNwpM4TAeL945f+zTAfBgNVHREEGDAWgR + RBbGljZURTU0BleGFtcGxlLmNvbTAJBgcqhkjOOAQDAzAAMC0CFFUMpBkfQiuJcSIz + jYNqtT1na79FAhUAn2FTUlQLXLLd2ud2HeIQUltDXr0xYzBhAgEBMBgwEjEQMA4GA1 + UEAxMHQ2FybERTUwICAMgwBwYFKw4DAhowCQYHKoZIzjgEAwQuMCwCFD1cSW6LIUFz + eXle3YI5SKSBer/sAhQmCq7s/CTFHOEjgASeUjbMpx5g6A== + +3.5.3. Signing Using the multipart/signed Format + + This format is a clear-signing format. Recipients without any S/MIME + or CMS processing facilities are able to view the message. It makes + use of the multipart/signed media type described in [RFC1847]. The + multipart/signed media type has two parts. The first part contains + the MIME entity that is signed; the second part contains the + "detached signature" CMS SignedData object in which the + encapContentInfo eContent field is absent. + +3.5.3.1. The application/pkcs7-signature Media Type + + This media type always contains a CMS ContentInfo containing a single + CMS object of type SignedData. The SignedData encapContentInfo + eContent field MUST be absent. The signerInfos field contains the + signatures for the MIME entity. + + The file extension for signed-only messages using + application/pkcs7-signature is ".p7s". + + + + + +Schaad, et al. Standards Track [Page 33] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +3.5.3.2. Creating a multipart/signed Message + + Step 1. The MIME entity to be signed is prepared according to + Section 3.1, taking special care for clear-signing. + + Step 2. The MIME entity is presented to CMS processing in order to + obtain an object of type SignedData in which the + encapContentInfo eContent field is absent. + + Step 3. The MIME entity is inserted into the first part of a + multipart/signed message with no processing other than that + described in Section 3.1. + + Step 4. Transfer encoding is applied to the "detached signature" CMS + SignedData object, and it is inserted into a MIME entity of + type application/pkcs7-signature. + + Step 5. The MIME entity of the application/pkcs7-signature is + inserted into the second part of the multipart/signed + entity. + + The multipart/signed Content-Type has two required parameters: the + protocol parameter and the micalg parameter. + + The protocol parameter MUST be "application/pkcs7-signature". Note + that quotation marks are required around the protocol parameter + because MIME requires that the "/" character in the parameter value + MUST be quoted. + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 34] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + The micalg parameter allows for one-pass processing when the + signature is being verified. The value of the micalg parameter is + dependent on the message digest algorithm(s) used in the calculation + of the Message Integrity Check. If multiple message digest + algorithms are used, they MUST be separated by commas per [RFC1847]. + The values to be placed in the micalg parameter SHOULD be from the + following: + + Algorithm Value Used + ----------------------------------------------------------- + MD5* md5 + SHA-1* sha-1 + SHA-224 sha-224 + SHA-256 sha-256 + SHA-384 sha-384 + SHA-512 sha-512 + Any other (defined separately in the algorithm profile + or "unknown" if not defined) + + *Note: MD5 and SHA-1 are historical and no longer considered secure. + See Appendix B for details. + + (Historical note: Some early implementations of S/MIME emitted and + expected "rsa-md5", "rsa-sha1", and "sha1" for the micalg parameter.) + Receiving agents SHOULD be able to recover gracefully from a micalg + parameter value that they do not recognize. Future values for this + parameter will be taken from the IANA "Hash Function Textual Names" + registry. + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 35] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +3.5.3.3. Sample multipart/signed Message + + Content-Type: multipart/signed; + micalg=sha-256; + boundary="----=_NextBoundary____Fri,_06_Sep_2002_00:25:21"; + protocol="application/pkcs7-signature" + + This is a multipart message in MIME format. + + ------=_NextBoundary____Fri,_06_Sep_2002_00:25:21 + + This is some sample content. + ------=_NextBoundary____Fri,_06_Sep_2002_00:25:21 + Content-Type: application/pkcs7-signature; name=smime.p7s + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename=smime.p7s + + MIIBJgYJKoZIhvcNAQcCoIIBFzCCARMCAQExADALBgkqhkiG9w0BBwExgf4w + gfsCAQIwJjASMRAwDgYDVQQDEwdDYXJsUlNBAhBGNGvHgABWvBHTbi7EELOw + MAsGCWCGSAFlAwQCAaAxMC8GCSqGSIb3DQEJBDEiBCCxwpZGNZzTSsugsn+f + lEidzQK4mf/ozKqfmbxhcIkKqjALBgkqhkiG9w0BAQsEgYB0XJV7fjPa5Nuh + oth5msDfP8A5urYUMjhNpWgXG8ae3XpppqVrPi2nVO41onHnkByjkeD/wc31 + A9WH8MzFQgSTsrJ65JvffTTXkOpRPxsSHn3wJFwP/atWHkh8YK/jR9bULhUl + Mv5jQEDiwVX5DRasxu6Ld8zv9u5/TsdBNiufGw== + + ------=_NextBoundary____Fri,_06_Sep_2002_00:25:21-- + + The content that is digested (the first part of the multipart/signed) + consists of the bytes: + + 54 68 69 73 20 69 73 20 73 6f 6d 65 20 73 61 6d 70 6c 65 20 63 6f 6e + 74 65 6e 74 2e 0d 0a + +3.6. Creating a Compressed-Only Message + + This section describes the format for compressing a MIME entity. + Please note that versions of S/MIME prior to version 3.1 did not + specify any use of CompressedData and will not recognize it. The use + of a capability to indicate the ability to receive CompressedData is + described in [RFC3274] and is the preferred method for compatibility. + + Step 1. The MIME entity to be compressed is prepared according to + Section 3.1. + + Step 2. The MIME entity and other required data are processed into a + CMS object of type CompressedData. + + + + + +Schaad, et al. Standards Track [Page 36] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + Step 3. The CompressedData object is wrapped in a CMS ContentInfo + object. + + Step 4. The ContentInfo object is inserted into an + application/pkcs7-mime MIME entity. + + The smime-type parameter for compressed-only messages is + "compressed-data". The file extension for this type of message + is ".p7z". + + A sample message would be: + + Content-Type: application/pkcs7-mime; smime-type=compressed-data; + name=smime.p7z + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename=smime.p7z + + eNoLycgsVgCi4vzcVIXixNyCnFSF5Py8ktS8Ej0AlCkKVA== + +3.7. Multiple Operations + + The signed-only, enveloped-only, and compressed-only MIME formats can + be nested. This works because these formats are all MIME entities + that encapsulate other MIME entities. + + An S/MIME implementation MUST be able to receive and process + arbitrarily nested S/MIME within reasonable resource limits of the + recipient computer. + + It is possible to apply any of the signing, encrypting, and + compressing operations in any order. It is up to the implementer and + the user to choose. When signing first, the signatories are then + securely obscured by the enveloping. When enveloping first, the + signatories are exposed, but it is possible to verify signatures + without removing the enveloping. This can be useful in an + environment where automatic signature verification is desired, as no + private key material is required to verify a signature. + + There are security ramifications related to choosing whether to sign + first or encrypt first. A recipient of a message that is encrypted + and then signed can validate that the encrypted block was unaltered + but cannot determine any relationship between the signer and the + unencrypted contents of the message. A recipient of a message that + is signed and then encrypted can assume that the signed message + itself has not been altered but that a careful attacker could have + changed the unauthenticated portions of the encrypted message. + + + + + +Schaad, et al. Standards Track [Page 37] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + When using compression, keep the following guidelines in mind: + + - Compression of encrypted data that is transferred as binary data + is discouraged, since it will not yield significant compression. + Encrypted data that is transferred as base64-encoded data could + benefit as well. + + - If a lossy compression algorithm is used with signing, you will + need to compress first, then sign. + +3.8. Creating a Certificate Management Message + + The certificate management message or MIME entity is used to + transport certificates and/or Certificate Revocation Lists (CRLs), + such as in response to a registration request. + + Step 1. The certificates and/or CRLs are made available to the CMS + generating process that creates a CMS object of type + SignedData. The SignedData encapContentInfo eContent field + MUST be absent, and the signerInfos field MUST be empty. + + Step 2. The SignedData object is wrapped in a CMS ContentInfo + object. + + Step 3. The ContentInfo object is enclosed in an + application/pkcs7-mime MIME entity. + + The smime-type parameter for a certificate management message is + "certs-only". The file extension for this type of message is ".p7c". + +3.9. Registration Requests + + A sending agent that signs messages MUST have a certificate for the + signature so that a receiving agent can verify the signature. There + are many ways of getting certificates, such as through an exchange + with a certification authority, through a hardware token or diskette, + and so on. + + S/MIME v2 [SMIMEv2] specified a method for "registering" public keys + with certificate authorities using an application/pkcs10 body part. + Since that time, the IETF PKIX Working Group has developed other + methods for requesting certificates. However, S/MIME v4.0 does not + require a particular certificate request mechanism. + + + + + + + + +Schaad, et al. Standards Track [Page 38] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +3.10. Identifying an S/MIME Message + + Because S/MIME takes into account interoperation in non-MIME + environments, several different mechanisms are employed to carry the + type information, and it becomes a bit difficult to identify S/MIME + messages. The following table lists criteria for determining whether + or not a message is an S/MIME message. A message is considered an + S/MIME message if it matches any of the criteria listed below. + + The file suffix in the table below comes from the "name" parameter in + the Content-Type header field or the "filename" parameter in the + Content-Disposition header field. The MIME parameters that carry the + file suffix are not listed below. + + Media Type Parameters File Suffix + --------------------------------------------------------------------- + application/pkcs7-mime N/A N/A + + multipart/signed protocol= N/A + "application/pkcs7-signature" + + application/octet-stream N/A p7m, p7s, + p7c, p7z + +4. Certificate Processing + + A receiving agent MUST provide some certificate retrieval mechanism + in order to gain access to certificates for recipients of digital + envelopes. This specification does not cover how S/MIME agents + handle certificates -- only what they do after a certificate has been + validated or rejected. S/MIME certificate issues are covered in + [RFC5750]. + + At a minimum, for initial S/MIME deployment, a user agent could + automatically generate a message to an intended recipient requesting + that recipient's certificate in a signed return message. Receiving + and sending agents SHOULD also provide a mechanism to allow a user to + "store and protect" certificates for correspondents in such a way as + to guarantee their later retrieval. + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 39] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +4.1. Key Pair Generation + + All key pairs MUST be generated from a good source of + non-deterministic random input [RFC4086], and the private key MUST be + protected in a secure fashion. + + An S/MIME user agent MUST NOT generate asymmetric keys less than + 2048 bits for use with an RSA signature algorithm. + + For 2048-bit through 4096-bit RSA with SHA-256, see [RFC5754] and + [FIPS186-4]. The first reference provides the signature algorithm's + OID, and the second provides the signature algorithm's definition. + + For RSASSA-PSS with SHA-256, see [RFC4056]. For RSAES-OAEP, see + [RFC3560]. + +4.2. Signature Generation + + The following are the requirements for an S/MIME agent when + generating RSA and RSASSA-PSS signatures: + + key size <= 2047 : SHOULD NOT (Note 2) + 2048 <= key size <= 4096 : SHOULD (Note 1) + 4096 < key size : MAY (Note 1) + + Note 1: See Security Considerations in Section 6. + Note 2: See Historical Mail Considerations in Appendix B. + + Key sizes for ECDSA and EdDSA are fixed by the curve. + +4.3. Signature Verification + + The following are the requirements for S/MIME receiving agents during + verification of RSA and RSASSA-PSS signatures: + + key size <= 2047 : SHOULD NOT (Note 2) + 2048 <= key size <= 4096 : MUST (Note 1) + 4096 < key size : MAY (Note 1) + + Note 1: See Security Considerations in Section 6. + Note 2: See Historical Mail Considerations in Appendix B. + + Key sizes for ECDSA and EdDSA are fixed by the curve. + + + + + + + + +Schaad, et al. Standards Track [Page 40] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +4.4. Encryption + + The following are the requirements for an S/MIME agent when + establishing keys for content encryption using the RSA and RSA-OAEP + algorithms: + + key size <= 2047 : SHOULD NOT (Note 2) + 2048 <= key size <= 4096 : SHOULD (Note 1) + 4096 < key size : MAY (Note 1) + + Note 1: See Security Considerations in Section 6. + Note 2: See Historical Mail Considerations in Appendix B. + + Key sizes for ECDH are fixed by the curve. + +4.5. Decryption + + The following are the requirements for an S/MIME agent when + establishing keys for content decryption using the RSA and RSAES-OAEP + algorithms: + + key size <= 2047 : MAY (Note 2) + 2048 <= key size <= 4096 : MUST (Note 1) + 4096 < key size : MAY (Note 1) + + Note 1: See Security Considerations in Section 6. + Note 2: See Historical Mail Considerations in Appendix B. + + Key sizes for ECDH are fixed by the curve. + +5. IANA Considerations + + This section (1) updates the media type registrations for + application/pkcs7-mime and application/pkcs7-signature to refer to + this document as opposed to RFC 5751, (2) adds authEnveloped-data to + the list of values for smime-type, and (3) updates references from + RFC 5751 to this document in general. + + Note that other documents can define additional media types for + S/MIME. + + + + + + + + + + + +Schaad, et al. Standards Track [Page 41] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +5.1. Media Type for application/pkcs7-mime + + Type name: application + + Subtype Name: pkcs7-mime + + Required Parameters: NONE + + Optional Parameters: smime-type + name + + Encoding Considerations: See Section 3 of this document + + Security Considerations: See Section 6 of this document + + Interoperability Considerations: See Sections 1-6 of this document + + Published Specification: RFC 2311, RFC 2633, RFC 5751, + and this document + + Applications that use this media type: Security applications + + Fragment identifier considerations: N/A + + Additional information: + Deprecated alias names for this type: N/A + Magic number(s): N/A + File extensions(s): See Section 3.2.1 of this document + Macintosh file type code(s): N/A + + Person & email address to contact for further information: + The IESG + + Intended usage: COMMON + + Restrictions on usage: NONE + + Author: Sean Turner + + Change Controller: LAMPS working group delegated from the IESG + + + + + + + + + + + +Schaad, et al. Standards Track [Page 42] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +5.2. Media Type for application/pkcs7-signature + + Type name: application + + Subtype Name: pkcs7-signature + + Required Parameters: N/A + + Optional Parameters: N/A + + Encoding Considerations: See Section 3 of this document + + Security Considerations: See Section 6 of this document + + Interoperability Considerations: See Sections 1-6 of this document + + Published Specification: RFC 2311, RFC 2633, RFC 5751, + and this document + + Applications that use this media type: Security applications + + Fragment identifier considerations: N/A + + Additional information: + Deprecated alias names for this type: N/A + Magic number(s): N/A + File extensions(s): See Section 3.2.1 of this document + Macintosh file type code(s): N/A + + Person & email address to contact for further information: + The IESG + + Intended usage: COMMON + + Restrictions on usage: N/A + + Author: Sean Turner + + Change Controller: LAMPS working group delegated from the IESG + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 43] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +5.3. authEnveloped-data smime-type + + IANA has registered the following value in the "Parameter Values for + the smime-type Parameter" registry. + + smime-type value: authEnveloped-data + + Reference: RFC 8551, Section 3.2.2 + +5.4. Reference Updates + + IANA is to update all references to RFC 5751 to this document. Known + registries to be updated are "CoAP Content-Formats" and "media- + types". + +6. Security Considerations + + Cryptographic algorithms will be broken or weakened over time. + Implementers and users need to check that the cryptographic + algorithms listed in this document continue to provide the expected + level of security. The IETF from time to time may issue documents + dealing with the current state of the art. For example: + + - The Million Message Attack described in RFC 3218 [RFC3218]. + + - The Diffie-Hellman "small-subgroup" attacks described in RFC 2785 + [RFC2785]. + + - The attacks against hash algorithms described in RFC 4270 + [RFC4270]. + + This specification uses Public-Key Cryptography technologies. It is + assumed that the private key is protected to ensure that it is not + accessed or altered by unauthorized parties. + + It is impossible for most people or software to estimate the value of + a message's content. Further, it is impossible for most people or + software to estimate the actual cost of recovering an encrypted + message's content that is encrypted with a key of a particular size. + Further, it is quite difficult to determine the cost of a failed + decryption if a recipient cannot process a message's content. Thus, + choosing between different key sizes (or choosing whether to just use + plaintext) is also impossible for most people or software. However, + decisions based on these criteria are made all the time, and + therefore this specification gives a framework for using those + estimates in choosing algorithms. + + + + + +Schaad, et al. Standards Track [Page 44] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + The choice of 2048 bits as an RSA asymmetric key size in this + specification is based on the desire to provide at least 100 bits of + security. The key sizes that must be supported to conform to this + specification seem appropriate for the Internet, based on [RFC3766]. + Of course, there are environments, such as financial and medical + systems, that may select different key sizes. For this reason, an + implementation MAY support key sizes beyond those recommended in this + specification. + + Receiving agents that validate signatures and sending agents that + encrypt messages need to be cautious of cryptographic processing + usage when validating signatures and encrypting messages using keys + larger than those mandated in this specification. An attacker could + send certificates with keys that would result in excessive + cryptographic processing -- for example, keys larger than those + mandated in this specification, as such keys could swamp the + processing element. Agents that use such keys without first + validating the certificate to a trust anchor are advised to have some + sort of cryptographic resource management system to prevent such + attacks. + + Some cryptographic algorithms such as RC2 offer little actual + security over sending plaintext. Other algorithms such as TripleDES + provide security but are no longer considered to be state of the art. + S/MIME requires the use of current state-of-the-art algorithms such + as AES and provides the ability to announce cryptographic + capabilities to parties with whom you communicate. This allows the + sender to create messages that can use the strongest common + encryption algorithm. Using algorithms such as RC2 is never + recommended unless the only alternative is no cryptography. + + RSA and DSA keys of less than 2048 bits are now considered by many + experts to be cryptographically insecure (due to advances in + computing power) and should no longer be used to protect messages. + Such keys were previously considered secure, so processing previously + received signed and encrypted mail will often result in the use of + weak keys. Implementations that wish to support previous versions of + S/MIME or process old messages need to consider the security risks + that result from smaller key sizes (e.g., spoofed messages) versus + the costs of denial of service. If an implementation supports + verification of digital signatures generated with RSA and DSA keys of + less than 1024 bits, it MUST warn the user. Implementers should + consider providing different warnings for newly received messages and + previously stored messages. Server implementations (e.g., secure + mail list servers) where user warnings are not appropriate SHOULD + reject messages with weak signatures. + + + + + +Schaad, et al. Standards Track [Page 45] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + Implementers SHOULD be aware that multiple active key pairs can be + associated with a single individual. For example, one key pair can + be used to support confidentiality, while a different key pair can be + used for digital signatures. + + If a sending agent is sending the same message using different + strengths of cryptography, an attacker watching the communications + channel might be able to determine the contents of the strongly + encrypted message by decrypting the weakly encrypted version. In + other words, a sender SHOULD NOT send a copy of a message using + weaker cryptography than they would use for the original of the + message. + + Modification of the ciphertext in EnvelopedData can go undetected if + authentication is not also used, which is the case when sending + EnvelopedData without wrapping it in SignedData or enclosing + SignedData within it. This is one of the reasons for moving from + EnvelopedData to AuthEnvelopedData, as the authenticated encryption + algorithms provide the authentication without needing the SignedData + layer. + + If an implementation is concerned about compliance with National + Institute of Standards and Technology (NIST) key size + recommendations, then see [SP800-57]. + + If messaging environments make use of the fact that a message is + signed to change the behavior of message processing (examples would + be running rules or UI display hints), without first verifying that + the message is actually signed and knowing the state of the + signature, this can lead to incorrect handling of the message. + Visual indicators on messages may need to have the signature + validation code checked periodically if the indicator is supposed to + give information on the current status of a message. + + Many people assume that the use of an authenticated encryption + algorithm is all that is needed for the sender of the message to be + authenticated. In almost all cases, this is not a correct statement. + There are a number of preconditions that need to hold for an + authenticated encryption algorithm to provide this service: + + - The starting key must be bound to a single entity. The use of a + group key only would allow for the statement that a message was + sent by one of the entities that held the key but will not + identify a specific entity. + + + + + + + +Schaad, et al. Standards Track [Page 46] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - The message must have exactly one sender and one recipient. + Having more than one recipient would allow for the second + recipient to create a message that the first recipient would + believe is from the sender by stripping the second recipient from + the message. + + - A direct path needs to exist from the starting key to the key used + as the CEK. That path needs to guarantee that no third party + could have seen the resulting CEK. This means that one needs to + be using an algorithm that is called a "Direct Encryption" or a + "Direct Key Agreement" algorithm in other contexts. This means + that the starting key is (1) used directly as the CEK or (2) used + to create a secret that is then transformed into the CEK via a + KDF step. + + S/MIME implementations almost universally use ephemeral-static rather + than static-static key agreement and do not use a shared secret for + encryption. This means that the first precondition is not met. + [RFC6278] defines how to use static-static key agreement with CMS, so + the first precondition can be met. Currently, all S/MIME key + agreement methods derive a key-encryption key (KEK) and wrap a CEK. + This violates the third precondition above. New key agreement + algorithms that directly created the CEK without creating an + intervening KEK would need to be defined. + + Even when all of the preconditions are met and origination of a + message is established by the use of an authenticated encryption + algorithm, users need to be aware that there is no way to prove this + to a third party. This is because either of the parties can + successfully create the message (or just alter the content) based on + the fact that the CEK is going to be known to both parties. Thus, + the origination is always built on a presumption that "I did not send + this message to myself." + + All of the authenticated encryption algorithms in this document use + counter mode for the encryption portion of the algorithm. This means + that the length of the plaintext will always be known, as the + ciphertext length and the plaintext length are always the same. This + information can enable passive observers to infer information based + solely on the length of the message. Applications for which this is + a concern need to provide some type of padding so that the length of + the message does not provide this information. + + When compression is used with encryption, it has the potential to + provide an additional layer of security. However, care needs to be + taken when designing a protocol that relies on using compression, so + as not to create a compression oracle. Compression oracle attacks + require an adaptive input to the process and attack the unknown + + + +Schaad, et al. Standards Track [Page 47] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + content of a message based on the length of the compressed output. + This means that no attack on the encryption key is necessarily + required. + + A recent paper on S/MIME and OpenPGP email security [Efail] has + pointed out a number of problems with the current S/MIME + specifications and how people have implemented mail clients. Due to + the nature of how CBC mode operates, the modes allow for malleability + of plaintexts. This malleability allows for attackers to make + changes in the ciphertext and, if parts of the plaintext are known, + create arbitrary blocks of plaintext. These changes can be made + without the weak integrity check in CBC mode being triggered. This + type of attack can be prevented by the use of an Authenticated + Encryption with Associated Data (AEAD) algorithm with a more robust + integrity check on the decryption process. It is therefore + recommended that mail systems migrate to using AES-GCM as quickly as + possible and that the decrypted content not be acted on prior to + finishing the integrity check. + + The other attack that is highlighted in [Efail] is due to an error in + how mail clients deal with HTML and multipart/mixed messages. + Clients MUST require that a text/html content type be a complete HTML + document (per [RFC1866]). Clients SHOULD treat each of the different + pieces of the multipart/mixed construct as being of different + origins. Clients MUST treat each encrypted or signed piece of a MIME + message as being of different origins both from unprotected content + and from each other. + +7. References + +7.1. Reference Conventions + + [ASN.1] refers to [X.680], [X.681], [X.682], and [X.683]. + + [CMS] refers to [RFC5083] and [RFC5652]. + + [ESS] refers to [RFC2634] and [RFC5035]. + + [MIME-SPEC] refers to [RFC2045], [RFC2046], [RFC2047], [RFC2049], + [RFC6838], and [RFC4289]. + + [SMIMEv2] refers to [RFC2311], [RFC2312], [RFC2313], [RFC2314], and + [RFC2315]. + + [SMIMEv3] refers to [RFC2630], [RFC2631], [RFC2632], [RFC2633], + [RFC2634], and [RFC5035]. + + + + + +Schaad, et al. Standards Track [Page 48] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [SMIMEv3.1] refers to [RFC2634], [RFC5035], [RFC5652], [RFC5750], and + [RFC5751]. + + [SMIMEv3.2] refers to [RFC2634], [RFC3850], [RFC3851], [RFC3852], and + [RFC5035]. + + [SMIMEv4] refers to [RFC2634], [RFC5035], [RFC5652], [RFC8550], and + this document. + +7.2. Normative References + + [CHARSETS] IANA, "Character sets assigned by IANA", + . + + [FIPS186-4] + National Institute of Standards and Technology (NIST), + "Digital Signature Standard (DSS)", Federal Information + Processing Standards Publication 186-4, + DOI 10.6028/NIST.FIPS.186-4, July 2013, + . + + [RFC1847] Galvin, J., Murphy, S., Crocker, S., and N. Freed, + "Security Multiparts for MIME: Multipart/Signed and + Multipart/Encrypted", RFC 1847, DOI 10.17487/RFC1847, + October 1995, . + + [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, DOI 10.17487/RFC2045, November 1996, + . + + [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part Two: Media Types", RFC 2046, + DOI 10.17487/RFC2046, November 1996, + . + + [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions) + Part Three: Message Header Extensions for Non-ASCII Text", + RFC 2047, DOI 10.17487/RFC2047, November 1996, + . + + [RFC2049] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part Five: Conformance Criteria and + Examples", RFC 2049, DOI 10.17487/RFC2049, November 1996, + . + + + + + +Schaad, et al. Standards Track [Page 49] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + + [RFC2183] Troost, R., Dorner, S., and K. Moore, Ed., "Communicating + Presentation Information in Internet Messages: The + Content-Disposition Header Field", RFC 2183, + DOI 10.17487/RFC2183, August 1997, + . + + [RFC2634] Hoffman, P., Ed., "Enhanced Security Services for S/MIME", + RFC 2634, DOI 10.17487/RFC2634, June 1999, + . + + [RFC3274] Gutmann, P., "Compressed Data Content Type for + Cryptographic Message Syntax (CMS)", RFC 3274, + DOI 10.17487/RFC3274, June 2002, + . + + [RFC3370] Housley, R., "Cryptographic Message Syntax (CMS) + Algorithms", RFC 3370, DOI 10.17487/RFC3370, August 2002, + . + + [RFC3560] Housley, R., "Use of the RSAES-OAEP Key Transport + Algorithm in Cryptographic Message Syntax (CMS)", + RFC 3560, DOI 10.17487/RFC3560, July 2003, + . + + [RFC3565] Schaad, J., "Use of the Advanced Encryption Standard (AES) + Encryption Algorithm in Cryptographic Message Syntax + (CMS)", RFC 3565, DOI 10.17487/RFC3565, July 2003, + . + + [RFC4289] Freed, N. and J. Klensin, "Multipurpose Internet Mail + Extensions (MIME) Part Four: Registration Procedures", + BCP 13, RFC 4289, DOI 10.17487/RFC4289, December 2005, + . + + [RFC4056] Schaad, J., "Use of the RSASSA-PSS Signature Algorithm in + Cryptographic Message Syntax (CMS)", RFC 4056, + DOI 10.17487/RFC4056, June 2005, + . + + [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, + "Randomness Requirements for Security", BCP 106, RFC 4086, + DOI 10.17487/RFC4086, June 2005, + . + + + +Schaad, et al. Standards Track [Page 50] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [RFC5083] Housley, R., "Cryptographic Message Syntax (CMS) + Authenticated-Enveloped-Data Content Type", RFC 5083, + DOI 10.17487/RFC5083, November 2007, + . + + [RFC5084] Housley, R., "Using AES-CCM and AES-GCM Authenticated + Encryption in the Cryptographic Message Syntax (CMS)", + RFC 5084, DOI 10.17487/RFC5084, November 2007, + . + + [RFC5652] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, + RFC 5652, DOI 10.17487/RFC5652, September 2009, + . + + [RFC5753] Turner, S. and D. Brown, "Use of Elliptic Curve + Cryptography (ECC) Algorithms in Cryptographic Message + Syntax (CMS)", RFC 5753, DOI 10.17487/RFC5753, + January 2010, . + + [RFC5754] Turner, S., "Using SHA2 Algorithms with Cryptographic + Message Syntax", RFC 5754, DOI 10.17487/RFC5754, + January 2010, . + + [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type + Specifications and Registration Procedures", BCP 13, + RFC 6838, DOI 10.17487/RFC6838, January 2013, + . + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, . + + [RFC8418] Housley, R., "Use of the Elliptic Curve Diffie-Hellman Key + Agreement Algorithm with X25519 and X448 in the + Cryptographic Message Syntax (CMS)", RFC 8418, + DOI 10.17487/RFC8418, August 2018, + . + + [RFC8419] Housley, R., "Use of Edwards-Curve Digital Signature + Algorithm (EdDSA) Signatures in the Cryptographic Message + Syntax (CMS)", RFC 8419, DOI 10.17487/RFC8419, + August 2018, . + + [RFC8550] Schaad, J., Ramsdell, B., and S. Turner, + "Secure/Multipurpose Internet Mail Extensions (S/MIME) + Version 4.0 Certificate Handling", RFC 8550, + DOI 10.17487/RFC8550, April 2019, + . + + + +Schaad, et al. Standards Track [Page 51] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [X.680] "Information Technology - Abstract Syntax Notation One + (ASN.1): Specification of basic notation", ITU-T + Recommendation X.680, ISO/IEC 8824-1:2015, August 2015, + . + + [X.681] "Information Technology - Abstract Syntax Notation One + (ASN.1): Information object specification", ITU-T + Recommendation X.681, ISO/IEC 8824-2:2015, August 2015, + . + + [X.682] "Information Technology - Abstract Syntax Notation One + (ASN.1): Constraint specification", ITU-T + Recommendation X.682, ISO/IEC 8824-3:2015, August 2015, + . + + [X.683] "Information Technology - Abstract Syntax Notation One + (ASN.1): Parameterization of ASN.1 specifications", ITU-T + Recommendation X.683, ISO/IEC 8824-4:2015, August 2015, + . + + [X.690] "Information Technology - ASN.1 encoding rules: + Specification of Basic Encoding Rules (BER), Canonical + Encoding Rules (CER) and Distinguished Encoding Rules + (DER)", ITU-T Recommendation X.690, ISO/IEC 8825-1:2015, + August 2015, . + +7.3. Informative References + + [Efail] Poddebniak, D., Dresen, C., Muller, J., Ising, F., + Schinzel, S., Friedberger, S., Somorovsky, J., and J. + Schwenk, "Efail: Breaking S/MIME and OpenPGP Email + Encryption using Exfiltration Channels", + UsenixSecurity 2018, August 2018, + . + + [FIPS186-2] + National Institute of Standards and Technology (NIST), + "Digital Signature Standard (DSS) (also with Change + Notice 1)", Federal Information Processing Standards + Publication 186-2, January 2000, + . + + [RFC1866] Berners-Lee, T. and D. Connolly, "Hypertext Markup + Language - 2.0", RFC 1866, DOI 10.17487/RFC1866, + November 1995, . + + + + +Schaad, et al. Standards Track [Page 52] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [RFC2268] Rivest, R., "A Description of the RC2(r) Encryption + Algorithm", RFC 2268, DOI 10.17487/RFC2268, March 1998, + . + + [RFC2311] Dusse, S., Hoffman, P., Ramsdell, B., Lundblade, L., and + L. Repka, "S/MIME Version 2 Message Specification", + RFC 2311, DOI 10.17487/RFC2311, March 1998, + . + + [RFC2312] Dusse, S., Hoffman, P., Ramsdell, B., and J. Weinstein, + "S/MIME Version 2 Certificate Handling", RFC 2312, DOI + 10.17487/RFC2312, March 1998, + . + + [RFC2313] Kaliski, B., "PKCS #1: RSA Encryption Version 1.5", + RFC 2313, DOI 10.17487/RFC2313, March 1998, + . + + [RFC2314] Kaliski, B., "PKCS #10: Certification Request Syntax + Version 1.5", RFC 2314, DOI 10.17487/RFC2314, March 1998, + . + + [RFC2315] Kaliski, B., "PKCS #7: Cryptographic Message Syntax + Version 1.5", RFC 2315, DOI 10.17487/RFC2315, March 1998, + . + + [RFC2630] Housley, R., "Cryptographic Message Syntax", RFC 2630, + DOI 10.17487/RFC2630, June 1999, + . + + [RFC2631] Rescorla, E., "Diffie-Hellman Key Agreement Method", + RFC 2631, DOI 10.17487/RFC2631, June 1999, + . + + [RFC2632] Ramsdell, B., Ed., "S/MIME Version 3 Certificate + Handling", RFC 2632, DOI 10.17487/RFC2632, June 1999, + . + + [RFC2633] Ramsdell, B., Ed., "S/MIME Version 3 Message + Specification", RFC 2633, DOI 10.17487/RFC2633, June 1999, + . + + [RFC2785] Zuccherato, R., "Methods for Avoiding the "Small-Subgroup" + Attacks on the Diffie-Hellman Key Agreement Method for + S/MIME", RFC 2785, DOI 10.17487/RFC2785, March 2000, + . + + + + + +Schaad, et al. Standards Track [Page 53] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [RFC3218] Rescorla, E., "Preventing the Million Message Attack on + Cryptographic Message Syntax", RFC 3218, + DOI 10.17487/RFC3218, January 2002, + . + + [RFC3766] Orman, H. and P. Hoffman, "Determining Strengths For + Public Keys Used For Exchanging Symmetric Keys", BCP 86, + RFC 3766, DOI 10.17487/RFC3766, April 2004, + . + + [RFC3850] Ramsdell, B., Ed., "Secure/Multipurpose Internet Mail + Extensions (S/MIME) Version 3.1 Certificate Handling", + RFC 3850, DOI 10.17487/RFC3850, July 2004, + . + + [RFC3851] Ramsdell, B., Ed., "Secure/Multipurpose Internet Mail + Extensions (S/MIME) Version 3.1 Message Specification", + RFC 3851, DOI 10.17487/RFC3851, July 2004, + . + + [RFC3852] Housley, R., "Cryptographic Message Syntax (CMS)", + RFC 3852, DOI 10.17487/RFC3852, July 2004, + . + + [RFC4134] Hoffman, P., Ed., "Examples of S/MIME Messages", RFC 4134, + DOI 10.17487/RFC4134, July 2005, + . + + [RFC4270] Hoffman, P. and B. Schneier, "Attacks on Cryptographic + Hashes in Internet Protocols", RFC 4270, + DOI 10.17487/RFC4270, November 2005, + . + + [RFC4949] Shirey, R., "Internet Security Glossary, Version 2", + FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007, + . + + [RFC5035] Schaad, J., "Enhanced Security Services (ESS) Update: + Adding CertID Algorithm Agility", RFC 5035, DOI + 10.17487/RFC5035, August 2007, + . + + [RFC5750] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet + Mail Extensions (S/MIME) Version 3.2 Certificate + Handling", RFC 5750, DOI 10.17487/RFC5750, January 2010, + . + + + + + +Schaad, et al. Standards Track [Page 54] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet + Mail Extensions (S/MIME) Version 3.2 Message + Specification", RFC 5751, DOI 10.17487/RFC5751, + January 2010, . + + [RFC6151] Turner, S. and L. Chen, "Updated Security Considerations + for the MD5 Message-Digest and the HMAC-MD5 Algorithms", + RFC 6151, DOI 10.17487/RFC6151, March 2011, + . + + [RFC6194] Polk, T., Chen, L., Turner, S., and P. Hoffman, "Security + Considerations for the SHA-0 and SHA-1 Message-Digest + Algorithms", RFC 6194, DOI 10.17487/RFC6194, March 2011, + . + + [RFC6268] Schaad, J. and S. Turner, "Additional New ASN.1 Modules + for the Cryptographic Message Syntax (CMS) and the Public + Key Infrastructure Using X.509 (PKIX)", RFC 6268, + DOI 10.17487/RFC6268, July 2011, + . + + [RFC6278] Herzog, J. and R. Khazan, "Use of Static-Static Elliptic + Curve Diffie-Hellman Key Agreement in Cryptographic + Message Syntax", RFC 6278, DOI 10.17487/RFC6278, + June 2011, . + + [RFC7114] Leiba, B., "Creation of a Registry for smime-type + Parameter Values", RFC 7114, DOI 10.17487/RFC7114, + January 2014, . + + [RFC7905] Langley, A., Chang, W., Mavrogiannopoulos, N., + Strombergson, J., and S. Josefsson, "ChaCha20-Poly1305 + Cipher Suites for Transport Layer Security (TLS)", + RFC 7905, DOI 10.17487/RFC7905, June 2016, + . + + [SP800-56A] + National Institute of Standards and Technology (NIST), + "Recommendation for Pair-Wise Key Establishment Schemes + Using Discrete Logarithm Cryptography", NIST Special + Publication 800-56A Revision 2, + DOI 10.6028/NIST.SP.800-56Ar2, May 2013, + . + + + + + + + +Schaad, et al. Standards Track [Page 55] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + [SP800-57] National Institute of Standards and Technology (NIST), + "Recommendation for Key Management - Part 1: General", + NIST Special Publication 800-57 Revision 4, + DOI 10.6028/NIST.SP.800-57pt1r4, January 2016, + . + + [TripleDES] + Tuchman, W., "Hellman Presents No Shortcut Solutions to + the DES", IEEE Spectrum v. 16, n. 7, pp. 40-41, + DOI 10.1109/MSPEC.1979.6368160, July 1979. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 56] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +Appendix A. ASN.1 Module + + Note: The ASN.1 module contained herein is unchanged from RFC 5751 + [SMIMEv2] and RFC 3851 [SMIMEv3.1], with the exception of a change to + the preferBinaryInside ASN.1 comment in RFC 3851 [SMIMEv3.1]. If a + module is needed that is compatible with current ASN.1 standards, one + can be found in [RFC6268]. This module uses the 1988 version + of ASN.1. + + SecureMimeMessageV3dot1 + + { iso(1) member-body(2) us(840) rsadsi(113549) + pkcs(1) pkcs-9(9) smime(16) modules(0) msg-v3dot1(21) } + + DEFINITIONS IMPLICIT TAGS ::= + + BEGIN + + IMPORTS + + -- Cryptographic Message Syntax [CMS] + SubjectKeyIdentifier, IssuerAndSerialNumber, + RecipientKeyIdentifier + FROM CryptographicMessageSyntax + { iso(1) member-body(2) us(840) rsadsi(113549) + pkcs(1) pkcs-9(9) smime(16) modules(0) cms-2001(14) }; + + -- id-aa is the arc with all new authenticated and unauthenticated + -- attributes produced by the S/MIME Working Group. + + id-aa OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840) + rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) attributes(2)} + + -- S/MIME Capabilities provides a method of broadcasting the + -- symmetric capabilities understood. Algorithms SHOULD be ordered + -- by preference and grouped by type. + + smimeCapabilities OBJECT IDENTIFIER ::= {iso(1) member-body(2) + us(840) rsadsi(113549) pkcs(1) pkcs-9(9) 15} + + SMIMECapability ::= SEQUENCE { + capabilityID OBJECT IDENTIFIER, + parameters ANY DEFINED BY capabilityID OPTIONAL } + + SMIMECapabilities ::= SEQUENCE OF SMIMECapability + + -- Encryption Key Preference provides a method of broadcasting the + -- preferred encryption certificate. + + + +Schaad, et al. Standards Track [Page 57] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + id-aa-encrypKeyPref OBJECT IDENTIFIER ::= {id-aa 11} + + SMIMEEncryptionKeyPreference ::= CHOICE { + issuerAndSerialNumber [0] IssuerAndSerialNumber, + receipentKeyId [1] RecipientKeyIdentifier, + subjectAltKeyIdentifier [2] SubjectKeyIdentifier + } + + -- "receipentKeyId" is spelled incorrectly but is kept for + -- historical reasons. + + id-smime OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) + rsadsi(113549) pkcs(1) pkcs-9(9) 16 } + + id-cap OBJECT IDENTIFIER ::= { id-smime 11 } + + -- The preferBinaryInside OID indicates an ability to receive + -- messages with binary encoding inside the CMS wrapper. + -- The preferBinaryInside attribute's value field is ABSENT. + + id-cap-preferBinaryInside OBJECT IDENTIFIER ::= { id-cap 1 } + + -- The following is a list of OIDs to be used with S/MIME v3. + + -- Signature Algorithms Not Found in [RFC3370], [RFC5754], [RFC4056], + -- and [RFC3560] + + -- + -- md2WithRSAEncryption OBJECT IDENTIFIER ::= + -- {iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) + -- 2} + + -- + -- Other Signed Attributes + -- + -- signingTime OBJECT IDENTIFIER ::= + -- {iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) + -- 5} + -- See [CMS] for a description of how to encode the attribute + -- value. + + SMIMECapabilitiesParametersForRC2CBC ::= INTEGER + -- (RC2 Key Length (number of bits)) + + END + + + + + + +Schaad, et al. Standards Track [Page 58] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +Appendix B. Historic Mail Considerations + + Over the course of updating the S/MIME specifications, the set of + recommended algorithms has been modified each time the documents have + been updated. This means that if a user has historic emails and + their user agent has been updated to only support the current set of + recommended algorithms, some of those old emails will no longer be + accessible. It is strongly suggested that user agents implement some + of the following algorithms for dealing with historic emails. + + This appendix contains a number of references to documents that have + been obsoleted or replaced. This is intentional, as the updated + documents often do not have the same information in them. + +B.1. DigestAlgorithmIdentifier + + The following algorithms have been called out for some level of + support by previous S/MIME specifications: + + - SHA-1 was dropped in [SMIMEv4]. SHA-1 is no longer considered to + be secure, as it is no longer collision resistant. The IETF + statement on SHA-1 can be found in [RFC6194], but it is out of + date relative to the most recent advances. + + - MD5 was dropped in [SMIMEv4]. MD5 is no longer considered to be + secure, as it is no longer collision resistant. Details can be + found in [RFC6151]. + +B.2. Signature Algorithms + + There are a number of problems with validating signatures on + sufficiently historic messages. For this reason, it is strongly + suggested that user agents treat these signatures differently from + those on current messages. These problems include the following: + + - Certification authorities are not required to keep certificates on + a CRL beyond one update after a certificate has expired. This + means that unless CRLs are cached as part of the message it is not + always possible to check to see if a certificate has been revoked. + The same problems exist with Online Certificate Status Protocol + (OCSP) responses, as they may be based on a CRL rather than on the + certificate database. + + + + + + + + + +Schaad, et al. Standards Track [Page 59] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + - RSA and DSA keys of less than 2048 bits are now considered by many + experts to be cryptographically insecure (due to advances in + computing power). Such keys were previously considered secure, so + the processing of historic signed messages will often result in + the use of weak keys. Implementations that wish to support + previous versions of S/MIME or process old messages need to + consider the security risks that result from smaller key sizes + (e.g., spoofed messages) versus the costs of denial of service. + + [SMIMEv3.1] set the lower limit on suggested key sizes for + creating and validation at 1024 bits. Prior to that, the lower + bound on key sizes was 512 bits. + + - Hash functions used to validate signatures on historic messages + may no longer be considered to be secure (see below). While there + are not currently any known practical pre-image or second + pre-image attacks against MD5 or SHA-1, the fact that they are no + longer considered to be collision resistant implies that the + security levels of the signatures are generally considered + suspect. If a message is known to be historic and it has been in + the possession of the client for some time, then it might still be + considered to be secure. + + - The previous two issues apply to the certificates used to validate + the binding of the public key to the identity that signed the + message as well. + + The following algorithms have been called out for some level of + support by previous S/MIME specifications: + + - RSA with MD5 was dropped in [SMIMEv4]. MD5 is no longer + considered to be secure, as it is no longer collision resistant. + Details can be found in [RFC6151]. + + - RSA and DSA with SHA-1 were dropped in [SMIMEv4]. SHA-1 is no + longer considered to be secure, as it is no longer collision + resistant. The IETF statement on SHA-1 can be found in [RFC6194], + but it is out of date relative to the most recent advances. + + - DSA with SHA-256 was dropped in [SMIMEv4]. DSA has been replaced + by elliptic curve versions. + + + + + + + + + + +Schaad, et al. Standards Track [Page 60] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + + As requirements for "mandatory to implement" have changed over time, + some issues have been created that can cause interoperability + problems: + + - S/MIME v2 clients are only required to verify digital signatures + using the rsaEncryption algorithm with SHA-1 or MD5 and might not + implement id-dsa-with-sha1 or id-dsa at all. + + - S/MIME v3 clients might only implement signing or signature + verification using id-dsa-with-sha1 and might also use id-dsa as + an AlgorithmIdentifier in this field. + + - Note that S/MIME v3.1 clients support verifying id-dsa-with-sha1 + and rsaEncryption and might not implement sha256WithRSAEncryption. + + NOTE: Receiving clients SHOULD recognize id-dsa as equivalent to + id-dsa-with-sha1. + + For 512-bit RSA with SHA-1, see [RFC3370] and [FIPS186-2] without + Change Notice 1; for 512-bit RSA with SHA-256, see [RFC5754] and + [FIPS186-2] without Change Notice 1; and for 1024-bit through + 2048-bit RSA with SHA-256, see [RFC5754] and [FIPS186-2] with Change + Notice 1. The first reference provides the signature algorithm's + OID, and the second provides the signature algorithm's definition. + + For 512-bit DSA with SHA-1, see [RFC3370] and [FIPS186-2] without + Change Notice 1; for 512-bit DSA with SHA-256, see [RFC5754] and + [FIPS186-2] without Change Notice 1; for 1024-bit DSA with SHA-1, see + [RFC3370] and [FIPS186-2] with Change Notice 1; and for 1024-bit and + above DSA with SHA-256, see [RFC5754] and [FIPS186-4]. The first + reference provides the signature algorithm's OID, and the second + provides the signature algorithm's definition. + +B.3. ContentEncryptionAlgorithmIdentifier + + The following algorithms have been called out for some level of + support by previous S/MIME specifications: + + - RC2/40 [RFC2268] was dropped in [SMIMEv3.2]. The algorithm is + known to be insecure and, if supported, should only be used to + decrypt existing email. + + - DES EDE3 CBC [TripleDES], also known as "tripleDES", was dropped + in [SMIMEv4]. This algorithm is removed from the list of + supported algorithms because (1) it has a 64-bit block size and + (2) it offers less than 128 bits of security. This algorithm + should be supported only to decrypt existing email; it should not + be used to encrypt new emails. + + + +Schaad, et al. Standards Track [Page 61] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +B.4. KeyEncryptionAlgorithmIdentifier + + The following algorithms have been called out for some level of + support by previous S/MIME specifications: + + - DH ephemeral-static mode, as specified in [RFC3370] and + [SP800-57], was dropped in [SMIMEv4]. + + - RSA key sizes have been increased over time. Decrypting old mail + with smaller key sizes is reasonable; however, new mail should use + the updated key sizes. + + For 1024-bit DH, see [RFC3370]. For 1024-bit and larger DH, see + [SP800-56A]; regardless, use the KDF, which is from X9.42, specified + in [RFC3370]. + +Appendix C. Moving S/MIME v2 Message Specification to Historic Status + + The S/MIME v3 [SMIMEv3], v3.1 [SMIMEv3.1], and v3.2 [SMIMEv3.2] + specifications are backward compatible with the S/MIME v2 Message + Specification [SMIMEv2], with the exception of the algorithms + (dropped RC2/40 requirement and added DSA and RSASSA-PSS + requirements). Therefore, RFC 2311 [SMIMEv2] was moved to Historic + status. + +Acknowledgements + + Many thanks go out to the other authors of the S/MIME version 2 + Message Specification RFC: Steve Dusse, Paul Hoffman, Laurence + Lundblade, and Lisa Repka. Without v2, there wouldn't be a v3, v3.1, + v3.2, or v4.0. + + Some of the examples in this document were copied from [RFC4134]. + Thanks go to the people who wrote and verified the examples in that + document. + + A number of the members of the S/MIME Working Group have also worked + very hard and contributed to this document. Any list of people is + doomed to omission, and for that I apologize. In alphabetical order, + the following people stand out in my mind because they made direct + contributions to this document: + + Tony Capel, Piers Chivers, Dave Crocker, Bill Flanigan, Peter + Gutmann, Alfred Hoenes, Paul Hoffman, Russ Housley, William Ottaway, + and John Pawling. + + The version 4 update to the S/MIME documents was done under the + auspices of the LAMPS Working Group. + + + +Schaad, et al. Standards Track [Page 62] + +RFC 8551 S/MIME 4.0 Message Specification April 2019 + + +Authors' Addresses + + Jim Schaad + August Cellars + + Email: ietf@augustcellars.com + + + Blake Ramsdell + Brute Squad Labs, Inc. + + Email: blaker@gmail.com + + + Sean Turner + sn3rd + + Email: sean@sn3rd.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Schaad, et al. Standards Track [Page 63] + From 8bf53c9efd8d4729dde5d350333f9645fc9a5a52 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 23 Dec 2019 09:09:24 -0500 Subject: [PATCH 454/741] Fixed WindowsSecureMimeContext.Decrypt() to make sure it doesn't stop at the first failed recipient Fixes issue #530 --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 663f20d1e2..16f2fa3480 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -994,9 +994,21 @@ public override MimePart Encrypt (IEnumerable recipients, Stream throw new ArgumentNullException (nameof (encryptedData)); var enveloped = new EnvelopedCms (); + CryptographicException ce = null; enveloped.Decode (ReadAllBytes (encryptedData)); - enveloped.Decrypt (); + + foreach (var recipient in enveloped.RecipientInfos) { + try { + enveloped.Decrypt (recipient); + ce = null; + } catch (CryptographicException ex) { + ce = ex; + } + } + + if (ce != null) + throw ce; var decryptedData = enveloped.Encode (); From 8b022c8d646452e989d3571c4e7256a676cc375c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 23 Dec 2019 09:10:46 -0500 Subject: [PATCH 455/741] Updated License.md and README.md --- License.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/License.md b/License.md index c5632184c0..13fe968da0 100644 --- a/License.md +++ b/License.md @@ -1,6 +1,6 @@ ## License Information -MimeKit is Copyright (C) 2012-2018 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2019 Xamarin Inc. and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index b2eaedc6fb..faaa54de7e 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ How does your MIME parser compare? ## License Information -MimeKit is Copyright (C) 2012-2018 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2019 Xamarin Inc. and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 26560d64ce7c5eb091679b849a0ca45ef62a4101 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 23 Dec 2019 10:04:54 -0500 Subject: [PATCH 456/741] Oops, don't forget to break out of the loop --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 16f2fa3480..7b171a709f 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -1002,6 +1002,7 @@ public override MimePart Encrypt (IEnumerable recipients, Stream try { enveloped.Decrypt (recipient); ce = null; + break; } catch (CryptographicException ex) { ce = ex; } From 939c836747abb85fa3e97b02bdb803c9bd9abe44 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 28 Dec 2019 11:51:54 -0500 Subject: [PATCH 457/741] Fixed splitting and reassembly of message/partial messages --- MimeKit/MessagePartial.cs | 215 ++++++++++++++++++++--- UnitTests/MessagePartialTests.cs | 92 ++++++---- UnitTests/TestData/partial/rfc2046.0.eml | 19 ++ UnitTests/TestData/partial/rfc2046.1.eml | 10 ++ UnitTests/TestData/partial/rfc2046.eml | 12 ++ 5 files changed, 280 insertions(+), 68 deletions(-) create mode 100644 UnitTests/TestData/partial/rfc2046.0.eml create mode 100644 UnitTests/TestData/partial/rfc2046.1.eml create mode 100644 UnitTests/TestData/partial/rfc2046.eml diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 89440f7ecb..ca2ad7b29c 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -203,9 +203,40 @@ public static IEnumerable Split (MimeMessage message, int maxSize) if (maxSize < 1) throw new ArgumentOutOfRangeException (nameof (maxSize)); + var options = FormatOptions.Default.Clone (); + foreach (HeaderId id in Enum.GetValues (typeof (HeaderId))) { + switch (id) { + case HeaderId.Subject: + case HeaderId.MessageId: + case HeaderId.Encrypted: + case HeaderId.MimeVersion: + case HeaderId.ContentAlternative: + case HeaderId.ContentBase: + case HeaderId.ContentClass: + case HeaderId.ContentDescription: + case HeaderId.ContentDisposition: + case HeaderId.ContentDuration: + case HeaderId.ContentFeatures: + case HeaderId.ContentId: + case HeaderId.ContentIdentifier: + case HeaderId.ContentLanguage: + case HeaderId.ContentLength: + case HeaderId.ContentLocation: + case HeaderId.ContentMd5: + case HeaderId.ContentReturn: + case HeaderId.ContentTransferEncoding: + case HeaderId.ContentTranslationType: + case HeaderId.ContentType: + break; + default: + options.HiddenHeaders.Add (id); + break; + } + } + var memory = new MemoryStream (); - message.WriteTo (memory); + message.WriteTo (options, memory); memory.Seek (0, SeekOrigin.Begin); if (memory.Length <= maxSize) { @@ -242,12 +273,13 @@ public static IEnumerable Split (MimeMessage message, int maxSize) startIndex = endIndex; } - var id = message.MessageId ?? MimeUtils.GenerateMessageId (); + var msgid = message.MessageId ?? MimeUtils.GenerateMessageId (); int number = 1; foreach (var stream in streams) { - var part = new MessagePartial (id, number++, streams.Count); - part.Content = new MimeContent (stream); + var part = new MessagePartial (msgid, number++, streams.Count) { + Content = new MimeContent (stream) + }; var submessage = CloneMessage (message); submessage.MessageId = MimeUtils.GenerateMessageId (); @@ -267,33 +299,77 @@ static int PartialCompare (MessagePartial partial1, MessagePartial partial2) return partial1.Number.Value - partial2.Number.Value; } - /// - /// Joins the specified message/partial parts into the complete message. - /// - /// - /// Combines all of the message/partial fragments into its original, - /// complete, message. - /// - /// The re-combined message. - /// The parser options to use. - /// The list of partial message parts. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// The last partial does not have a Total. - /// -or- - /// The number of partials provided does not match the expected count. - /// -or- - /// One or more partials is missing. - /// - public static MimeMessage Join (ParserOptions options, IEnumerable partials) + static void CombineHeaders (MimeMessage message, MimeMessage joined) + { + var headers = new List
(); + int i = 0; + + // RFC2046: Any header fields in the enclosed message which do not start with "Content-" + // (except for the "Subject", "Message-ID", "Encrypted", and "MIME-Version" fields) will + // be ignored and dropped. + while (i < joined.Headers.Count) { + var header = joined.Headers[i]; + + switch (header.Id) { + case HeaderId.Subject: + case HeaderId.MessageId: + case HeaderId.Encrypted: + case HeaderId.MimeVersion: + headers.Add (header); + header.Offset = null; + i++; + break; + default: + joined.Headers.RemoveAt (i); + break; + } + } + + // RFC2046: All of the header fields from the initial enclosing message, except + // those that start with "Content-" and the specific header fields "Subject", + // "Message-ID", "Encrypted", and "MIME-Version", must be copied, in order, + // to the new message. + i = 0; + foreach (var header in message.Headers) { + switch (header.Id) { + case HeaderId.Subject: + case HeaderId.MessageId: + case HeaderId.Encrypted: + case HeaderId.MimeVersion: + for (int j = 0; j < headers.Count; j++) { + if (headers[j].Id == header.Id) { + var original = headers[j]; + + joined.Headers.Remove (original); + joined.Headers.Insert (i++, original); + headers.RemoveAt (j); + break; + } + } + break; + default: + var clone = header.Clone (); + clone.Offset = null; + + joined.Headers.Insert (i++, clone); + break; + } + } + + if (joined.Body != null) { + foreach (var header in joined.Body.Headers) + header.Offset = null; + } + } + + static MimeMessage Join (ParserOptions options, MimeMessage message, IEnumerable partials, bool allowNullMessage) { if (options == null) throw new ArgumentNullException (nameof (options)); + if (!allowNullMessage && message == null) + throw new ArgumentNullException (nameof (message)); + if (partials == null) throw new ArgumentNullException (nameof (partials)); @@ -327,11 +403,92 @@ public static MimeMessage Join (ParserOptions options, IEnumerable + /// Joins the specified message/partial parts into the complete message. + ///
+ /// + /// Combines all of the message/partial fragments into its original, + /// complete, message. + /// + /// The re-combined message. + /// The parser options to use. + /// The message that contains the first `message/partial` part. + /// The list of partial message parts. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// The last partial does not have a Total. + /// -or- + /// The number of partials provided does not match the expected count. + /// -or- + /// One or more partials is missing. + /// + public static MimeMessage Join (ParserOptions options, MimeMessage message, IEnumerable partials) + { + return Join (options, message, partials, false); + } + + /// + /// Joins the specified message/partial parts into the complete message. + /// + /// + /// Combines all of the message/partial fragments into its original, + /// complete, message. + /// + /// The re-combined message. + /// The message that contains the first `message/partial` part. + /// The list of partial message parts. + /// + /// is null. + /// -or- + /// is null. + /// + public static MimeMessage Join (MimeMessage message, IEnumerable partials) + { + return Join (ParserOptions.Default, message, partials, false); + } + + /// + /// Joins the specified message/partial parts into the complete message. + /// + /// + /// Combines all of the message/partial fragments into its original, + /// complete, message. + /// + /// The re-combined message. + /// The parser options to use. + /// The list of partial message parts. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// The last partial does not have a Total. + /// -or- + /// The number of partials provided does not match the expected count. + /// -or- + /// One or more partials is missing. + /// + public static MimeMessage Join (ParserOptions options, IEnumerable partials) + { + return Join (options, null, partials, true); + } + /// /// Joins the specified message/partial parts into the complete message. /// @@ -346,7 +503,7 @@ public static MimeMessage Join (ParserOptions options, IEnumerable public static MimeMessage Join (IEnumerable partials) { - return Join (ParserOptions.Default, partials); + return Join (ParserOptions.Default, null, partials, true); } } } diff --git a/UnitTests/MessagePartialTests.cs b/UnitTests/MessagePartialTests.cs index b8dd42f72b..3422f58537 100644 --- a/UnitTests/MessagePartialTests.cs +++ b/UnitTests/MessagePartialTests.cs @@ -59,8 +59,33 @@ public void TestArgumentExceptions () Assert.Throws (() => MessagePartial.Split (message, 0).ToList ()); } + static void AssertRawMessageStreams (MimeMessage expected, MimeMessage actual) + { + using (var stream = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + expected.WriteTo (options, stream); + + var expectedBytes = new byte[stream.Position]; + Array.Copy (stream.GetBuffer (), 0, expectedBytes, 0, (int) stream.Position); + + stream.Position = 0; + + actual.WriteTo (options, stream); + + var actualBytes = new byte[stream.Position]; + Array.Copy (stream.GetBuffer (), 0, actualBytes, 0, (int) stream.Position); + + Assert.AreEqual (expectedBytes.Length, actualBytes.Length, "bytes"); + + for (int i = 0; i < expectedBytes.Length; i++) + Assert.AreEqual (expectedBytes[i], actualBytes[i], "bytes[{0}]", i); + } + } + [Test] - public void TestReassemble () + public void TestReassembleGirlOnTrainPhotoExample () { var message0 = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.0.eml")); var message1 = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.1.eml")); @@ -76,7 +101,9 @@ public void TestReassemble () Assert.IsTrue (message2.Body is MessagePartial, "The body of message-partial.2.eml is not a message/partial"); var partials = new MessagePartial[] { (MessagePartial) message0.Body, (MessagePartial) message1.Body, (MessagePartial) message2.Body }; - Assert.Throws (() => MessagePartial.Join (null, partials)); + Assert.Throws (() => MessagePartial.Join (null, message0, partials)); + Assert.Throws (() => MessagePartial.Join ((MimeMessage) null, partials)); + Assert.Throws (() => MessagePartial.Join ((ParserOptions) null, partials)); Assert.Throws (() => MessagePartial.Join (null)); var message = MessagePartial.Join (partials); @@ -92,27 +119,34 @@ public void TestReassemble () Assert.IsTrue (part.ContentType.IsMimeType ("image", "jpeg"), "Attachment is not an image/jpeg"); Assert.AreEqual ("earrings.jpg", part.FileName, "Attachment filename is not the expected value"); - using (var stream = new MemoryStream ()) { - var options = FormatOptions.Default.Clone (); - options.NewLineFormat = NewLineFormat.Unix; - - original.WriteTo (options, stream); + AssertRawMessageStreams (original, message); + } - var bytes0 = new byte[stream.Position]; - Array.Copy (stream.GetBuffer (), 0, bytes0, 0, (int) stream.Position); + [Test] + public void TestReassembleRfc2046Example () + { + var message0 = Load (Path.Combine ("..", "..", "TestData", "partial", "rfc2046.0.eml")); + var message1 = Load (Path.Combine ("..", "..", "TestData", "partial", "rfc2046.1.eml")); + var original = Load (Path.Combine ("..", "..", "TestData", "partial", "rfc2046.eml")); - stream.Position = 0; + Assert.IsNotNull (message0, "Failed to parse rfc2046.0.eml"); + Assert.IsNotNull (message1, "Failed to parse rfc2046.1.eml"); - message.WriteTo (options, stream); + Assert.IsTrue (message0.Body is MessagePartial, "The body of rfc2046.0.eml is not a message/partial"); + Assert.IsTrue (message1.Body is MessagePartial, "The body of rfc2046.1.eml is not a message/partial"); - var bytes1 = new byte[stream.Position]; - Array.Copy (stream.GetBuffer (), 0, bytes1, 0, (int) stream.Position); + var partials = new MessagePartial[] { (MessagePartial) message0.Body, (MessagePartial) message1.Body }; + Assert.Throws (() => MessagePartial.Join (null, message0, partials)); + Assert.Throws (() => MessagePartial.Join ((MimeMessage) null, partials)); + Assert.Throws (() => MessagePartial.Join ((ParserOptions) null, partials)); + Assert.Throws (() => MessagePartial.Join (null)); + var message = MessagePartial.Join (message0, partials); - Assert.AreEqual (bytes0.Length, bytes1.Length, "bytes"); + Assert.IsNotNull (message, "Failed to reconstruct the message"); + Assert.AreEqual ("Audio mail", message.Subject, "Subjects do not match"); + Assert.IsTrue (message.Body.ContentType.IsMimeType ("audio", "basic"), "Parsed message body is not audio/basic"); - for (int i = 0; i < bytes0.Length; i++) - Assert.AreEqual (bytes0[i], bytes1[i], "bytes[{0}]", i); - } + AssertRawMessageStreams (original, message); } [Test] @@ -131,29 +165,9 @@ public void TestSplit () Assert.AreEqual (i + 1, parts[i].Number, "Number"); } - var combined = MessagePartial.Join (parts); + var combined = MessagePartial.Join (message, parts); - using (var stream = new MemoryStream ()) { - var options = FormatOptions.Default.Clone (); - options.NewLineFormat = NewLineFormat.Unix; - - message.WriteTo (options, stream); - - var bytes0 = new byte[stream.Position]; - Array.Copy (stream.GetBuffer (), 0, bytes0, 0, (int) stream.Position); - - stream.Position = 0; - - combined.WriteTo (options, stream); - - var bytes1 = new byte[stream.Position]; - Array.Copy (stream.GetBuffer (), 0, bytes1, 0, (int) stream.Position); - - Assert.AreEqual (bytes0.Length, bytes1.Length, "bytes"); - - for (int i = 0; i < bytes0.Length; i++) - Assert.AreEqual (bytes0[i], bytes1[i], "bytes[{0}]", i); - } + AssertRawMessageStreams (message, combined); } } } diff --git a/UnitTests/TestData/partial/rfc2046.0.eml b/UnitTests/TestData/partial/rfc2046.0.eml new file mode 100644 index 0000000000..726bc4abb5 --- /dev/null +++ b/UnitTests/TestData/partial/rfc2046.0.eml @@ -0,0 +1,19 @@ +X-Weird-Header-1: Foo +From: Bill@host.com +To: joe@otherhost.com +Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST) +Subject: Audio mail (part 1 of 2) +Message-ID: +MIME-Version: 1.0 +Content-type: message/partial; id="ABC@host.com"; + number=1; total=2 + +X-Weird-Header-1: Bar +X-Weird-Header-2: Hello +Message-ID: +Subject: Audio mail +MIME-Version: 1.0 +Content-type: audio/basic +Content-transfer-encoding: base64 + +... first half of encoded audio data goes here ... diff --git a/UnitTests/TestData/partial/rfc2046.1.eml b/UnitTests/TestData/partial/rfc2046.1.eml new file mode 100644 index 0000000000..e13ee67a50 --- /dev/null +++ b/UnitTests/TestData/partial/rfc2046.1.eml @@ -0,0 +1,10 @@ +From: Bill@host.com +To: joe@otherhost.com +Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST) +Subject: Audio mail (part 2 of 2) +MIME-Version: 1.0 +Message-ID: +Content-type: message/partial; + id="ABC@host.com"; number=2; total=2 + +... second half of encoded audio data goes here ... diff --git a/UnitTests/TestData/partial/rfc2046.eml b/UnitTests/TestData/partial/rfc2046.eml new file mode 100644 index 0000000000..a12da93f66 --- /dev/null +++ b/UnitTests/TestData/partial/rfc2046.eml @@ -0,0 +1,12 @@ +X-Weird-Header-1: Foo +From: Bill@host.com +To: joe@otherhost.com +Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST) +Subject: Audio mail +Message-ID: +MIME-Version: 1.0 +Content-type: audio/basic +Content-transfer-encoding: base64 + +... first half of encoded audio data goes here ... +... second half of encoded audio data goes here ... From 8c6797bf057a2e14389b21c495f67882ed7425c3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 29 Dec 2019 09:55:59 -0500 Subject: [PATCH 458/741] Improved handling of Office365 Authentication-Results headers Fixes issue #490 and issue #527 in a better way by parsing the method-specific authserv-id tokens into a new property called Office365AuthenticationServiceIdentifier located on the AuthenticationMethodResult class. --- MimeKit/Cryptography/AuthenticationResults.cs | 108 ++++++++++++------ .../AuthenticationResultsTests.cs | 38 ++++-- 2 files changed, 103 insertions(+), 43 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 6fcdf0aac8..c0fdf4279e 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -263,9 +263,6 @@ static bool SkipDomain (byte[] text, ref int index, int endIndex) if (index > startIndex && text[index - 1] != (byte) '.') return true; - // don't advance `index` on failure - index = startIndex; - return false; } @@ -324,37 +321,6 @@ static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out boo if (!SkipDomain (text, ref index, endIndex)) return false; - } else if (text[index] != ';' && !text[index].IsWhitespace ()) { - return false; - } else { - int multiIndex = index; - - ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - - if (multiIndex < endIndex && text[multiIndex] == (byte) ';') { - multiIndex++; - - ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - - while (multiIndex < endIndex && SkipDomain (text, ref multiIndex, endIndex)) { - int startIndex = multiIndex; - - ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - - if (multiIndex >= endIndex) { - index = startIndex; - break; - } - - if (text[multiIndex] != (byte) ';') - break; - - index = startIndex; - multiIndex++; - - ParseUtils.SkipWhiteSpace (text, ref multiIndex, endIndex); - } - } } } @@ -367,6 +333,9 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro bool quoted; while (index < endIndex) { + string srvid = null; + + method_token: if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) return false; @@ -383,6 +352,45 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro return false; } + // Note: Office365 seems to (sometimes) place a method-specific authserv-id token before each + // method. This block of code is here to handle that case. + // + // See https://github.com/jstedfast/MimeKit/issues/527 for details. + if (srvid == null && index < endIndex && text[index] == '.') { + index = methodIndex; + + if (!SkipDomain (text, ref index, endIndex)) { + if (throwOnError) + throw new ParseException (string.Format ("Invalid Office365 authserv-id token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + srvid = Encoding.UTF8.GetString (text, methodIndex, index - methodIndex); + + if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) + return false; + + if (index >= endIndex) { + if (throwOnError) + throw new ParseException (string.Format ("Missing semi-colon after Office365 authserv-id token at offset {0}", methodIndex), methodIndex, index); + + return false; + } + + if (text[index] != ';') { + if (throwOnError) + throw new ParseException (string.Format ("Unexpected token after Office365 authserv-id token at offset {0}", index), index, index); + + return false; + } + + // skip over ';' + index++; + + goto method_token; + } + var method = Encoding.ASCII.GetString (text, methodIndex, index - methodIndex); if (!ParseUtils.SkipCommentsAndWhiteSpace (text, ref index, endIndex, throwOnError)) @@ -407,6 +415,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro } var resinfo = new AuthenticationMethodResult (method); + resinfo.Office365AuthenticationServiceIdentifier = srvid; authres.Results.Add (resinfo); int tokenIndex; @@ -984,6 +993,22 @@ public AuthenticationMethodResult (string method, string result) : this (method) Result = result; } + /// + /// Get the Office365 method-specific authserv-id. + /// + /// + /// Gets the Office365 method-specific authserv-id. + /// An authentication service identifier is the authserv-id token + /// as defined in rfc7601. + /// Instead of specifying a single authentication service identifier at the + /// beginning of the header value, Office365 seems to provide a different + /// authentication service identifier for each method. + /// + /// The authserv-id token. + public string Office365AuthenticationServiceIdentifier { + get; internal set; + } + /// /// Get the authentication method. /// @@ -1087,6 +1112,12 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line var tokens = new List (); tokens.Add (" "); + if (Office365AuthenticationServiceIdentifier != null) { + tokens.Add (Office365AuthenticationServiceIdentifier); + tokens.Add (";"); + tokens.Add (" "); + } + if (Version.HasValue) { var version = Version.Value.ToString (CultureInfo.InvariantCulture); @@ -1158,7 +1189,14 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line /// The serialized string. public override string ToString () { - var builder = new StringBuilder (Method); + var builder = new StringBuilder (); + + if (Office365AuthenticationServiceIdentifier != null) { + builder.Append (Office365AuthenticationServiceIdentifier); + builder.Append ("; "); + } + + builder.Append (Method); if (Version.HasValue) { builder.Append ('/'); diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 69370857c6..fedb010a3c 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -870,16 +870,18 @@ public void TestParseOffice365RandomDomainTokensAndAction () Assert.AreEqual (1, authres.Results[0].Properties.Count, "spf properties"); Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); Assert.AreEqual ("mailfrom", authres.Results[0].Properties[0].Property); - Assert.AreEqual ("eu-west-1.amazonses.com; receivingdomain.com", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("eu-west-1.amazonses.com", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("receivingdomain.com", authres.Results[1].Office365AuthenticationServiceIdentifier); Assert.AreEqual ("dkim", authres.Results[1].Method); Assert.AreEqual ("pass", authres.Results[1].Result); Assert.AreEqual ("signature was verified", authres.Results[1].ResultComment); Assert.AreEqual (1, authres.Results[1].Properties.Count, "dkim properties"); Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); Assert.AreEqual ("d", authres.Results[1].Properties[0].Property); - Assert.AreEqual ("domain.com;domain1.com", authres.Results[1].Properties[0].Value); + Assert.AreEqual ("domain.com", authres.Results[1].Properties[0].Value); + Assert.AreEqual ("domain1.com", authres.Results[2].Office365AuthenticationServiceIdentifier); Assert.AreEqual ("dmarc", authres.Results[2].Method); Assert.AreEqual ("bestguesspass", authres.Results[2].Result); Assert.AreEqual (null, authres.Results[2].ResultComment); @@ -889,9 +891,9 @@ public void TestParseOffice365RandomDomainTokensAndAction () Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); Assert.AreEqual ("domain.com", authres.Results[2].Properties[0].Value); - Assert.AreEqual ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; receivingdomain.com; dkim=pass (signature was verified) header.d=domain.com;domain1.com; dmarc=bestguesspass action=\"none\" header.from=domain.com", authres.ToString ()); + Assert.AreEqual ("spf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com; receivingdomain.com; dkim=pass (signature was verified) header.d=domain.com; domain1.com; dmarc=bestguesspass action=\"none\" header.from=domain.com", authres.ToString ()); - const string expected = " spf=fail (sender IP is 1.1.1.1)\n\tsmtp.mailfrom=eu-west-1.amazonses.com; receivingdomain.com;\n\tdkim=pass (signature was verified) header.d=domain.com;domain1.com;\n\tdmarc=bestguesspass action=\"none\" header.from=domain.com\n"; + const string expected = "\n\tspf=fail (sender IP is 1.1.1.1) smtp.mailfrom=eu-west-1.amazonses.com;\n\treceivingdomain.com; dkim=pass (signature was verified) header.d=domain.com;\n\tdomain1.com; dmarc=bestguesspass action=\"none\" header.from=domain.com\n"; var encoded = new StringBuilder (); var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Unix; @@ -918,16 +920,18 @@ public void TestParseOffice365RandomDomainTokensAndEmptyPropertyValue () Assert.AreEqual (1, authres.Results[0].Properties.Count, "spf properties"); Assert.AreEqual ("smtp", authres.Results[0].Properties[0].PropertyType); Assert.AreEqual ("helo", authres.Results[0].Properties[0].Property); - Assert.AreEqual ("tes.test.ru; mydomain.com", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("tes.test.ru", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("mydomain.com", authres.Results[1].Office365AuthenticationServiceIdentifier); Assert.AreEqual ("dkim", authres.Results[1].Method); Assert.AreEqual ("none", authres.Results[1].Result); Assert.AreEqual ("message not signed", authres.Results[1].ResultComment); Assert.AreEqual (1, authres.Results[1].Properties.Count, "dkim properties"); Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); Assert.AreEqual ("d", authres.Results[1].Properties[0].Property); - Assert.AreEqual ("none;mydomain.com", authres.Results[1].Properties[0].Value); + Assert.AreEqual ("none", authres.Results[1].Properties[0].Value); + Assert.AreEqual ("mydomain.com", authres.Results[2].Office365AuthenticationServiceIdentifier); Assert.AreEqual ("dmarc", authres.Results[2].Method); Assert.AreEqual ("none", authres.Results[2].Result); Assert.AreEqual (null, authres.Results[2].ResultComment); @@ -937,9 +941,9 @@ public void TestParseOffice365RandomDomainTokensAndEmptyPropertyValue () Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); Assert.AreEqual ("", authres.Results[2].Properties[0].Value); - Assert.AreEqual ("spf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru; mydomain.com; dkim=none (message not signed) header.d=none;mydomain.com; dmarc=none action=\"none\" header.from=", authres.ToString ()); + Assert.AreEqual ("spf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru; mydomain.com; dkim=none (message not signed) header.d=none; mydomain.com; dmarc=none action=\"none\" header.from=", authres.ToString ()); - const string expected = "\n\tspf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru; mydomain.com;\n\tdkim=none (message not signed) header.d=none;mydomain.com;\n\tdmarc=none action=\"none\" header.from=\n"; + const string expected = "\n\tspf=temperror (sender IP is 1.1.1.1) smtp.helo=tes.test.ru;\n\tmydomain.com; dkim=none (message not signed) header.d=none;\n\tmydomain.com; dmarc=none action=\"none\" header.from=\n"; var encoded = new StringBuilder (); var options = FormatOptions.Default.Clone (); options.NewLineFormat = NewLineFormat.Unix; @@ -1322,5 +1326,23 @@ public void TestParseFailureInvalidProperty4 () { AssertParseFailure ("authserv-id; method=pass ptype..", 31, 31); } + + [Test] + public void TestParseFailureInvalidOffice365AuthServId () + { + AssertParseFailure ("authserv-id; method=pass ptype.prop=pvalue; invalid.office365.domain..; method=pass", 44, 69); + } + + [Test] + public void TestParseFailureTruncatedOffice365AuthServId () + { + AssertParseFailure ("authserv-id; method=pass ptype.prop=pvalue; truncated.office365.domain", 44, 70); + } + + [Test] + public void TestParseFailureUnexpectedTokenAfterOffice365AuthServId () + { + AssertParseFailure ("authserv-id; method=pass ptype.prop=pvalue; office365.domain :", 61, 61); + } } } From 68813882a77d2ed5207faa59ff1a7d7004468eb9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 31 Dec 2019 10:05:51 -0500 Subject: [PATCH 459/741] code formatting --- MimeKit/Cryptography/AuthenticationResults.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index c0fdf4279e..13f16c9bc3 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -378,7 +378,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro return false; } - if (text[index] != ';') { + if (text[index] != (byte) ';') { if (throwOnError) throw new ParseException (string.Format ("Unexpected token after Office365 authserv-id token at offset {0}", index), index, index); @@ -482,7 +482,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro ParseUtils.SkipWhiteSpace (text, ref index, endIndex); - if (index < endIndex && text[index] == '(') { + if (index < endIndex && text[index] == (byte) '(') { int commentIndex = index; if (!ParseUtils.SkipComment (text, ref index, endIndex)) { @@ -775,7 +775,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro return false; } - if (text[index] != ';') { + if (text[index] != (byte) ';') { if (throwOnError) throw new ParseException (string.Format ("Unexpected token after instance value at offset {0}", index), index, index); From 47ab1afc14a32311a8fd857f24f0b8ae8ce57e8e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 1 Jan 2020 10:07:19 -0500 Subject: [PATCH 460/741] Added some Obsolete attributes for the old MessagePartial.Join() API. --- MimeKit/MessagePartial.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index ca2ad7b29c..2ad12702f7 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -484,6 +484,7 @@ public static MimeMessage Join (MimeMessage message, IEnumerable /// -or- /// One or more partials is missing. /// + [Obsolete ("Use MessagePartial.Join (ParserOptions, MimeMessage, IEnumerable) instead.")] public static MimeMessage Join (ParserOptions options, IEnumerable partials) { return Join (options, null, partials, true); @@ -501,6 +502,7 @@ public static MimeMessage Join (ParserOptions options, IEnumerable /// is null. /// + [Obsolete ("Use MessagePartial.Join (MimeMessage, IEnumerable) instead.")] public static MimeMessage Join (IEnumerable partials) { return Join (ParserOptions.Default, null, partials, true); From 29177b3d54128171a34c28478a38c236f58c1581 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 1 Jan 2020 10:08:25 -0500 Subject: [PATCH 461/741] Support RSACng for NETCOREAPP3_0 --- MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 7f36618b97..edfa613569 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -116,7 +116,7 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } -#if NET46 || NET47 || NET48 || __MOBILE__ +#if NET46 || NET47 || NET48 || NETCOREAPP3_0 || __MOBILE__ static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACng rsa) { AsymmetricKeyParameter pub, key; @@ -162,7 +162,7 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl if (key is RSACryptoServiceProvider) return GetAsymmetricKeyParameter ((RSACryptoServiceProvider) key); -#if NET46 || NET47 || NET48 || __MOBILE__ +#if NET46 || NET47 || NET48 || NETCOREAPP3_0 || __MOBILE__ if (key is RSACng) return GetAsymmetricKeyParameter ((RSACng) key); #endif @@ -201,7 +201,7 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric if (key is RSACryptoServiceProvider) return GetAsymmetricCipherKeyPair ((RSACryptoServiceProvider) key); -#if NET46 || NET47 || NET48 || __MOBILE__ +#if NET46 || NET47 || NET48 || NETCOREAPP3_0 || __MOBILE__ if (key is RSACng) return GetAsymmetricCipherKeyPair ((RSACng) key); #endif From d89a0b326329111d1003ba4f63d28e38333727be Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Jan 2020 09:06:48 -0500 Subject: [PATCH 462/741] Added netcoreapp3.0 as a build and nuget target --- MimeKit/MimeKit.NetStandard.csproj | 2 +- nuget/MimeKit.nuspec | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 31f21ab778..7cb6b6fca9 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -5,7 +5,7 @@ MimeKit 2.4.1 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 + netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48;netcoreapp3.0 true false MimeKit diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 6f285a13f4..59c64e0c33 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -100,9 +100,19 @@ + + + + + + + + + + From 7900d788663197668422979565efa02a5eb15304 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jan 2020 11:03:50 -0500 Subject: [PATCH 463/741] Revert "Added netcoreapp3.0 as a build and nuget target" This reverts commit d89a0b326329111d1003ba4f63d28e38333727be. --- MimeKit/MimeKit.NetStandard.csproj | 2 +- nuget/MimeKit.nuspec | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 7cb6b6fca9..31f21ab778 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -5,7 +5,7 @@ MimeKit 2.4.1 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48;netcoreapp3.0 + netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true false MimeKit diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 59c64e0c33..6f285a13f4 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -100,19 +100,9 @@ - - - - - - - - - - From ac26fa608fff55cf83cabdca9180e5b5f95d7562 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 16 Jan 2020 16:44:53 -0500 Subject: [PATCH 464/741] Fixed mailbox address parser to be more lenient about []'s in the display-name Fixes issue #532 --- MimeKit/InternetAddress.cs | 4 ++-- MimeKit/Utils/ByteExtensions.cs | 18 ++++++++++++++---- MimeKit/Utils/ParseUtils.cs | 11 +++++++++++ UnitTests/InternetAddressTests.cs | 8 ++++++++ UnitTests/MailboxAddressTests.cs | 10 ++++++++++ 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index c924d41cbb..9e9b61fbc4 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -616,7 +616,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index ParseUtils.SkipWhiteSpace (text, ref index, endIndex); - if (!ParseUtils.SkipAtom (text, ref index, endIndex)) { + if (!ParseUtils.SkipPhraseAtom (text, ref index, endIndex)) { if (throwOnError) throw new ParseException (string.Format ("Incomplete quoted-string token at offset {0}", qstringIndex), qstringIndex, endIndex); @@ -627,7 +627,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index trimLeadingQuote = true; } } else { - if (!ParseUtils.SkipAtom (text, ref index, endIndex)) + if (!ParseUtils.SkipPhraseAtom (text, ref index, endIndex)) break; } diff --git a/MimeKit/Utils/ByteExtensions.cs b/MimeKit/Utils/ByteExtensions.cs index 18f3fad200..69c94512d4 100644 --- a/MimeKit/Utils/ByteExtensions.cs +++ b/MimeKit/Utils/ByteExtensions.cs @@ -44,6 +44,7 @@ enum CharType : ushort { IsTokenSpecial = (1 << 11), IsWhitespace = (1 << 12), IsXDigit = (1 << 13), + IsPhraseAtom = (1 << 14), IsAsciiAtom = IsAscii | IsAtom, } @@ -110,14 +111,14 @@ static ByteExtensions () if ((i >= 33 && i <= 60) || (i >= 62 && i <= 126) || i == 32) table[i] |= (CharType.IsQuotedPrintableSafe | CharType.IsEncodedWordSafe); if ((i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) - table[i] |= CharType.IsEncodedPhraseSafe | CharType.IsAtom; + table[i] |= CharType.IsEncodedPhraseSafe | CharType.IsAtom | CharType.IsPhraseAtom; if ((i >= '0' && i <= '9') || (i >= 'a' && i <= 'f') || (i >= 'A' && i <= 'F')) table[i] |= CharType.IsXDigit; table[i] |= CharType.IsAscii; } else { if (i == 127) - table[i] |= CharType.IsAscii; + table[i] |= CharType.IsAscii | CharType.IsPhraseAtom; else table[i] |= CharType.IsAtom; @@ -129,14 +130,18 @@ static ByteExtensions () table[' '] |= CharType.IsSpace | CharType.IsBlank; SetFlags (Whitespace, CharType.IsWhitespace, CharType.None, false); - SetFlags (AtomSafeCharacters, CharType.IsAtom, CharType.None, false); + SetFlags (AtomSafeCharacters, CharType.IsAtom | CharType.IsPhraseAtom, CharType.None, false); SetFlags (TokenSpecials, CharType.IsTokenSpecial, CharType.IsControl, false); SetFlags (Specials, CharType.IsSpecial, CharType.None, false); SetFlags (DomainSpecials, CharType.IsDomainSafe, CharType.None, true); - RemoveFlags (Specials, CharType.IsAtom); + RemoveFlags (Specials, CharType.IsAtom | CharType.IsPhraseAtom); RemoveFlags (EncodedWordSpecials, CharType.IsEncodedWordSafe); RemoveFlags (AttributeSpecials + TokenSpecials, CharType.IsAttrChar); SetFlags (EncodedPhraseSpecials, CharType.IsEncodedPhraseSafe, CharType.None, false); + + // Note: Allow '[' and ']' in the display-name of a mailbox address + table['['] |= CharType.IsPhraseAtom; + table[']'] |= CharType.IsPhraseAtom; } //public static bool IsAscii (this byte c) @@ -149,6 +154,11 @@ public static bool IsAsciiAtom (this byte c) return (table[c] & CharType.IsAsciiAtom) == CharType.IsAsciiAtom; } + public static bool IsPhraseAtom (this byte c) + { + return (table[c] & CharType.IsPhraseAtom) != 0; + } + public static bool IsAtom (this byte c) { return (table[c] & CharType.IsAtom) != 0; diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index 3d4400e148..d557be0969 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -216,6 +216,17 @@ public static bool SkipAtom (byte[] text, ref int index, int endIndex) return index > start; } + // Note: a "phrase atom" is a more lenient atom (e.g. mailbox display-name phrase atom) + public static bool SkipPhraseAtom (byte[] text, ref int index, int endIndex) + { + int start = index; + + while (index < endIndex && text[index].IsPhraseAtom ()) + index++; + + return index > start; + } + public static bool SkipToken (byte[] text, ref int index, int endIndex) { int start = index; diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index e0c1e9c600..a27c923c8f 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -523,5 +523,13 @@ public void TestParseMailboxWithAddrspecAsUnquotedName () } #endregion + + [Test] + public void TestParseMailboxWithSquareBracketsInDisplayName () + { + const string text = "[Invalid Sender] "; + + AssertParse (text); + } } } diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index aeadae5778..00d4bbb8c1 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -756,5 +756,15 @@ public void TestParseLatin1EncodedAddrspec () } #endregion + + [Test] + public void TestParseMailboxWithSquareBracketsInDisplayName () + { + const string text = "[Invalid Sender] "; + + AssertParse (text); + + AssertParseFailure (text, false, 0, 0, RfcComplianceMode.Strict); + } } } From 8632905dcfbe1db940dc8d510d956beb32ede293 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 18 Jan 2020 10:26:19 -0500 Subject: [PATCH 465/741] bumped version to 2.5.0 --- License.md | 2 +- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/AttachmentCollection.cs | 2 +- MimeKit/BodyBuilder.cs | 2 +- MimeKit/ContentDisposition.cs | 2 +- MimeKit/ContentEncoding.cs | 2 +- MimeKit/ContentType.cs | 2 +- .../Cryptography/ApplicationPgpEncrypted.cs | 2 +- .../Cryptography/ApplicationPgpSignature.cs | 2 +- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 2 +- .../Cryptography/ApplicationPkcs7Signature.cs | 2 +- MimeKit/Cryptography/ArcSigner.cs | 2 +- MimeKit/Cryptography/ArcVerifier.cs | 2 +- .../AsymmetricAlgorithmExtensions.cs | 2 +- MimeKit/Cryptography/AuthenticationResults.cs | 2 +- .../BouncyCastleCertificateExtensions.cs | 2 +- .../BouncyCastleSecureMimeContext.cs | 2 +- .../CertificateNotFoundException.cs | 2 +- MimeKit/Cryptography/CmsRecipient.cs | 2 +- .../Cryptography/CmsRecipientCollection.cs | 2 +- MimeKit/Cryptography/CmsSigner.cs | 2 +- MimeKit/Cryptography/CryptographyContext.cs | 2 +- MimeKit/Cryptography/DbExtensions.cs | 2 +- .../Cryptography/DefaultSecureMimeContext.cs | 2 +- MimeKit/Cryptography/DigestAlgorithm.cs | 2 +- .../DigitalSignatureCollection.cs | 2 +- .../DigitalSignatureVerifyException.cs | 2 +- MimeKit/Cryptography/DkimBodyFilter.cs | 2 +- .../DkimCanonicalizationAlgorithm.cs | 2 +- MimeKit/Cryptography/DkimHashStream.cs | 2 +- .../Cryptography/DkimPublicKeyLocatorBase.cs | 2 +- MimeKit/Cryptography/DkimRelaxedBodyFilter.cs | 2 +- .../Cryptography/DkimSignatureAlgorithm.cs | 2 +- MimeKit/Cryptography/DkimSignatureStream.cs | 2 +- MimeKit/Cryptography/DkimSigner.cs | 2 +- MimeKit/Cryptography/DkimSignerBase.cs | 2 +- MimeKit/Cryptography/DkimSimpleBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimVerifier.cs | 2 +- MimeKit/Cryptography/DkimVerifierBase.cs | 2 +- MimeKit/Cryptography/Ed25519DigestSigner.cs | 2 +- MimeKit/Cryptography/EncryptionAlgorithm.cs | 2 +- MimeKit/Cryptography/GnuPGContext.cs | 2 +- MimeKit/Cryptography/IDigitalCertificate.cs | 2 +- MimeKit/Cryptography/IDigitalSignature.cs | 2 +- MimeKit/Cryptography/IDkimPublicKeyLocator.cs | 2 +- .../Cryptography/IX509CertificateDatabase.cs | 2 +- MimeKit/Cryptography/MultipartEncrypted.cs | 2 +- MimeKit/Cryptography/MultipartSigned.cs | 2 +- MimeKit/Cryptography/OpenPgpBlockFilter.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 2 +- MimeKit/Cryptography/OpenPgpDataType.cs | 2 +- .../Cryptography/OpenPgpDetectionFilter.cs | 2 +- .../Cryptography/OpenPgpDigitalCertificate.cs | 2 +- .../Cryptography/OpenPgpDigitalSignature.cs | 2 +- .../Cryptography/OpenPgpKeyCertification.cs | 2 +- .../PrivateKeyNotFoundException.cs | 2 +- MimeKit/Cryptography/PublicKeyAlgorithm.cs | 2 +- .../PublicKeyNotFoundException.cs | 2 +- MimeKit/Cryptography/RsaEncryptionPadding.cs | 2 +- .../RsaEncryptionPaddingScheme.cs | 2 +- MimeKit/Cryptography/RsaSignaturePadding.cs | 2 +- .../Cryptography/RsaSignaturePaddingScheme.cs | 2 +- MimeKit/Cryptography/SecureMailboxAddress.cs | 2 +- MimeKit/Cryptography/SecureMimeContext.cs | 2 +- .../SecureMimeDigitalCertificate.cs | 2 +- .../SecureMimeDigitalSignature.cs | 2 +- MimeKit/Cryptography/SecureMimeType.cs | 2 +- .../Cryptography/SqlCertificateDatabase.cs | 2 +- .../Cryptography/SqliteCertificateDatabase.cs | 2 +- MimeKit/Cryptography/SubjectIdentifierType.cs | 2 +- .../TemporarySecureMimeContext.cs | 2 +- .../Cryptography/WindowsSecureMimeContext.cs | 2 +- .../WindowsSecureMimeDigitalCertificate.cs | 2 +- .../WindowsSecureMimeDigitalSignature.cs | 2 +- .../X509Certificate2Extensions.cs | 2 +- MimeKit/Cryptography/X509CertificateChain.cs | 2 +- .../Cryptography/X509CertificateDatabase.cs | 2 +- MimeKit/Cryptography/X509CertificateRecord.cs | 2 +- MimeKit/Cryptography/X509CertificateStore.cs | 2 +- MimeKit/Cryptography/X509CrlRecord.cs | 2 +- MimeKit/Cryptography/X509KeyUsageFlags.cs | 2 +- MimeKit/DomainList.cs | 2 +- MimeKit/EncodingConstraint.cs | 2 +- MimeKit/Encodings/Base64Decoder.cs | 2 +- MimeKit/Encodings/Base64Encoder.cs | 2 +- MimeKit/Encodings/HexDecoder.cs | 2 +- MimeKit/Encodings/HexEncoder.cs | 2 +- MimeKit/Encodings/IMimeDecoder.cs | 2 +- MimeKit/Encodings/IMimeEncoder.cs | 2 +- MimeKit/Encodings/PassThroughDecoder.cs | 2 +- MimeKit/Encodings/PassThroughEncoder.cs | 2 +- MimeKit/Encodings/QEncoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableDecoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableEncoder.cs | 2 +- MimeKit/Encodings/UUDecoder.cs | 2 +- MimeKit/Encodings/UUEncoder.cs | 2 +- MimeKit/Encodings/YDecoder.cs | 2 +- MimeKit/Encodings/YEncoder.cs | 2 +- MimeKit/FormatOptions.cs | 2 +- MimeKit/GroupAddress.cs | 2 +- MimeKit/Header.cs | 2 +- MimeKit/HeaderId.cs | 2 +- MimeKit/HeaderList.cs | 2 +- MimeKit/HeaderListChangedEventArgs.cs | 2 +- MimeKit/HeaderListCollection.cs | 2 +- MimeKit/IMimeContent.cs | 2 +- MimeKit/IO/BoundStream.cs | 2 +- MimeKit/IO/ChainedStream.cs | 2 +- MimeKit/IO/FilteredStream.cs | 2 +- MimeKit/IO/Filters/ArmoredFromFilter.cs | 2 +- MimeKit/IO/Filters/BestEncodingFilter.cs | 2 +- MimeKit/IO/Filters/CharsetFilter.cs | 2 +- MimeKit/IO/Filters/DecoderFilter.cs | 2 +- MimeKit/IO/Filters/Dos2UnixFilter.cs | 2 +- MimeKit/IO/Filters/EncoderFilter.cs | 2 +- MimeKit/IO/Filters/IMimeFilter.cs | 2 +- MimeKit/IO/Filters/MimeFilterBase.cs | 2 +- MimeKit/IO/Filters/PassThroughFilter.cs | 2 +- .../IO/Filters/TrailingWhitespaceFilter.cs | 2 +- MimeKit/IO/Filters/Unix2DosFilter.cs | 2 +- MimeKit/IO/ICancellableStream.cs | 2 +- MimeKit/IO/MeasuringStream.cs | 2 +- MimeKit/IO/MemoryBlockStream.cs | 2 +- MimeKit/InternetAddress.cs | 2 +- MimeKit/InternetAddressList.cs | 2 +- MimeKit/MailboxAddress.cs | 2 +- MimeKit/MessageDeliveryStatus.cs | 2 +- MimeKit/MessageDispositionNotification.cs | 2 +- MimeKit/MessageIdList.cs | 2 +- MimeKit/MessageImportance.cs | 2 +- MimeKit/MessagePart.cs | 2 +- MimeKit/MessagePartial.cs | 2 +- MimeKit/MessagePriority.cs | 2 +- MimeKit/MimeContent.cs | 2 +- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeEntityConstructorArgs.cs | 2 +- MimeKit/MimeFormat.cs | 2 +- MimeKit/MimeIterator.cs | 2 +- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/MimeMessage.cs | 2 +- MimeKit/MimeParser.cs | 2 +- MimeKit/MimePart.cs | 2 +- MimeKit/MimeTypes.cs | 2 +- MimeKit/MimeVisitor.cs | 2 +- MimeKit/Multipart.cs | 2 +- MimeKit/MultipartAlternative.cs | 2 +- MimeKit/MultipartRelated.cs | 2 +- MimeKit/MultipartReport.cs | 2 +- MimeKit/Parameter.cs | 2 +- MimeKit/ParameterEncodingMethod.cs | 2 +- MimeKit/ParameterList.cs | 2 +- MimeKit/ParseException.cs | 2 +- MimeKit/ParserOptions.cs | 2 +- MimeKit/Properties/AssemblyInfo.cs | 8 ++--- MimeKit/RfcComplianceMode.cs | 2 +- MimeKit/Text/CharBuffer.cs | 2 +- MimeKit/Text/FlowedToHtml.cs | 2 +- MimeKit/Text/FlowedToText.cs | 2 +- MimeKit/Text/HeaderFooterFormat.cs | 2 +- MimeKit/Text/HtmlAttribute.cs | 2 +- MimeKit/Text/HtmlAttributeCollection.cs | 2 +- MimeKit/Text/HtmlAttributeId.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.g.cs | 2 +- MimeKit/Text/HtmlNamespace.cs | 2 +- MimeKit/Text/HtmlTagCallback.cs | 2 +- MimeKit/Text/HtmlTagContext.cs | 2 +- MimeKit/Text/HtmlTagId.cs | 2 +- MimeKit/Text/HtmlToHtml.cs | 2 +- MimeKit/Text/HtmlToken.cs | 2 +- MimeKit/Text/HtmlTokenKind.cs | 2 +- MimeKit/Text/HtmlTokenizer.cs | 2 +- MimeKit/Text/HtmlTokenizerState.cs | 2 +- MimeKit/Text/HtmlUtils.cs | 2 +- MimeKit/Text/HtmlWriter.cs | 2 +- MimeKit/Text/HtmlWriterState.cs | 2 +- MimeKit/Text/ICharArray.cs | 2 +- MimeKit/Text/TextConverter.cs | 2 +- MimeKit/Text/TextFormat.cs | 2 +- MimeKit/Text/TextToFlowed.cs | 2 +- MimeKit/Text/TextToHtml.cs | 2 +- MimeKit/Text/TextToText.cs | 2 +- MimeKit/Text/Trie.cs | 2 +- MimeKit/Text/UrlScanner.cs | 2 +- MimeKit/TextPart.cs | 2 +- MimeKit/TextRfc822Headers.cs | 2 +- MimeKit/Tnef/RtfCompressedToRtf.cs | 2 +- MimeKit/Tnef/RtfCompressionMode.cs | 2 +- MimeKit/Tnef/TnefAttachFlags.cs | 2 +- MimeKit/Tnef/TnefAttachMethod.cs | 2 +- MimeKit/Tnef/TnefAttributeLevel.cs | 2 +- MimeKit/Tnef/TnefAttributeTag.cs | 2 +- MimeKit/Tnef/TnefComplianceMode.cs | 2 +- MimeKit/Tnef/TnefComplianceStatus.cs | 2 +- MimeKit/Tnef/TnefException.cs | 2 +- MimeKit/Tnef/TnefNameId.cs | 2 +- MimeKit/Tnef/TnefNameIdKind.cs | 2 +- MimeKit/Tnef/TnefPart.cs | 2 +- MimeKit/Tnef/TnefPropertyId.cs | 2 +- MimeKit/Tnef/TnefPropertyReader.cs | 2 +- MimeKit/Tnef/TnefPropertyTag.cs | 2 +- MimeKit/Tnef/TnefPropertyType.cs | 2 +- MimeKit/Tnef/TnefReader.cs | 2 +- MimeKit/Tnef/TnefReaderStream.cs | 2 +- MimeKit/Utils/BufferPool.cs | 2 +- MimeKit/Utils/ByteExtensions.cs | 2 +- MimeKit/Utils/CharsetUtils.cs | 2 +- MimeKit/Utils/Crc32.cs | 2 +- MimeKit/Utils/DateUtils.cs | 2 +- MimeKit/Utils/MimeUtils.cs | 2 +- MimeKit/Utils/OptimizedOrdinalComparer.cs | 2 +- MimeKit/Utils/PackedByteArray.cs | 2 +- MimeKit/Utils/ParseUtils.cs | 2 +- MimeKit/Utils/Rfc2047.cs | 2 +- MimeKit/Utils/StringBuilderExtensions.cs | 2 +- MimeKit/XMessagePriority.cs | 2 +- README.md | 2 +- ReleaseNotes.md | 30 +++++++++++++++++++ UnitTests/ArgumentExceptionTests.cs | 2 +- UnitTests/AssortedTests.cs | 2 +- UnitTests/AttachmentCollectionTests.cs | 2 +- UnitTests/ConstructorTests.cs | 2 +- UnitTests/ContentDispositionTests.cs | 2 +- UnitTests/ContentObjectTests.cs | 2 +- UnitTests/ContentTypeTests.cs | 2 +- .../Cryptography/ApplicationPkcs7MimeTests.cs | 2 +- UnitTests/Cryptography/ArcSignerTests.cs | 2 +- UnitTests/Cryptography/ArcVerifierTests.cs | 2 +- .../AsymmetricAlgorithmExtensionTests.cs | 2 +- .../AuthenticationResultsTests.cs | 2 +- .../Cryptography/CertificateExtensionTests.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 2 +- UnitTests/Cryptography/CmsSignerTests.cs | 2 +- .../DefaultSecureMimeContextTests.cs | 2 +- .../Cryptography/DkimPublicKeyLocator.cs | 2 +- .../DkimPublicKeyLocatorBaseTests.cs | 2 +- .../DkimRelaxedBodyFilterTests.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 2 +- UnitTests/Cryptography/DummyArcSigner.cs | 2 +- UnitTests/Cryptography/DummyOpenPgpContext.cs | 2 +- UnitTests/Cryptography/LdapUriTests.cs | 2 +- UnitTests/Cryptography/PgpMimeTests.cs | 2 +- .../Cryptography/RsaEncryptionPaddingTests.cs | 2 +- .../Cryptography/RsaSignaturePaddingTests.cs | 2 +- .../SecureMimeDigitalCertificateTests.cs | 2 +- UnitTests/Cryptography/SecureMimeTests.cs | 2 +- .../SqliteCertificateDatabaseTests.cs | 2 +- .../Cryptography/X509CertificateChainTests.cs | 2 +- .../X509CertificateRecordTests.cs | 2 +- .../Cryptography/X509CertificateStoreTests.cs | 2 +- UnitTests/DomainListTests.cs | 2 +- UnitTests/Encodings/EncoderTests.cs | 2 +- UnitTests/Encodings/YEncodingTests.cs | 2 +- UnitTests/ExceptionTests.cs | 2 +- UnitTests/FormatOptionsTests.cs | 2 +- UnitTests/GroupAddressTests.cs | 2 +- UnitTests/HeaderListTests.cs | 2 +- UnitTests/HeaderTests.cs | 2 +- UnitTests/HtmlPreviewVisitor.cs | 2 +- UnitTests/IO/BoundStreamTests.cs | 2 +- UnitTests/IO/CanReadWriteSeekStream.cs | 2 +- UnitTests/IO/ChainedStreamTests.cs | 2 +- UnitTests/IO/FilteredStreamTests.cs | 2 +- UnitTests/IO/Filters/FilterTests.cs | 2 +- UnitTests/IO/MeasuringStreamTests.cs | 2 +- UnitTests/IO/MemoryBlockStreamTests.cs | 2 +- UnitTests/IO/ReadOneByteStream.cs | 2 +- UnitTests/IO/TimeoutStream.cs | 2 +- UnitTests/InternetAddressListTests.cs | 2 +- UnitTests/InternetAddressTests.cs | 2 +- UnitTests/MailboxAddressTests.cs | 2 +- UnitTests/MessageDeliveryStatusTests.cs | 2 +- .../MessageDispositionNotificiationTests.cs | 2 +- UnitTests/MessageIdListTests.cs | 2 +- UnitTests/MessagePartialTests.cs | 2 +- UnitTests/MimeIteratorTests.cs | 2 +- UnitTests/MimeMessageTests.cs | 2 +- UnitTests/MimeParserTests.cs | 2 +- UnitTests/MimePartTests.cs | 2 +- UnitTests/MimeTypeTests.cs | 2 +- UnitTests/MimeVisitorTests.cs | 2 +- UnitTests/MultipartAlternativeTests.cs | 2 +- UnitTests/MultipartRelatedTests.cs | 2 +- UnitTests/MultipartReportTests.cs | 2 +- UnitTests/MultipartTests.cs | 2 +- UnitTests/ParameterListTests.cs | 2 +- UnitTests/ParameterTests.cs | 2 +- UnitTests/ParserOptionsTests.cs | 2 +- UnitTests/Text/FlowedToHtmlTests.cs | 2 +- UnitTests/Text/FlowedToTextTests.cs | 2 +- UnitTests/Text/HtmlAttributeTests.cs | 2 +- UnitTests/Text/HtmlEntityDecoderTests.cs | 2 +- UnitTests/Text/HtmlTagIdTests.cs | 2 +- UnitTests/Text/HtmlToHtmlTests.cs | 2 +- UnitTests/Text/HtmlTokenTests.cs | 2 +- UnitTests/Text/HtmlTokenizerTests.cs | 2 +- UnitTests/Text/HtmlUtilsTests.cs | 2 +- UnitTests/Text/HtmlWriterTests.cs | 2 +- UnitTests/Text/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Text/TextConverterTests.cs | 2 +- UnitTests/Text/TextToFlowedTests.cs | 2 +- UnitTests/Text/TextToHtmlTests.cs | 2 +- UnitTests/Text/TextToTextTests.cs | 2 +- UnitTests/Text/TrieTests.cs | 2 +- UnitTests/Text/UrlScannerTests.cs | 2 +- UnitTests/TextPartTests.cs | 2 +- UnitTests/TextRfc822HeadersTests.cs | 2 +- UnitTests/Tnef/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Tnef/TnefReaderStreamTests.cs | 2 +- UnitTests/Tnef/TnefReaderTests.cs | 2 +- UnitTests/Tnef/TnefTests.cs | 2 +- UnitTests/Utils/CharsetUtilsTests.cs | 2 +- UnitTests/Utils/DateParserTests.cs | 2 +- UnitTests/Utils/MimeUtilsTests.cs | 2 +- UnitTests/Utils/PackedByteArrayTests.cs | 2 +- UnitTests/Utils/ParseUtilsTests.cs | 2 +- UnitTests/Utils/Rfc2047Tests.cs | 2 +- .../Utils/StringBuilderExtensionTests.cs | 2 +- appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 18 +++++++---- nuget/MimeKitLite.nuspec | 11 +++++-- 323 files changed, 374 insertions(+), 331 deletions(-) diff --git a/License.md b/License.md index 13fe968da0..32096396de 100644 --- a/License.md +++ b/License.md @@ -1,6 +1,6 @@ ## License Information -MimeKit is Copyright (C) 2012-2019 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2020 Xamarin Inc. and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 22ef7902c6..3259e7fc0a 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index c34c0da7ff..e9b3ab29e1 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index 813ef12927..c29950b076 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index de7927900f..2ba6096ca7 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentEncoding.cs b/MimeKit/ContentEncoding.cs index 0ac7767a1f..1bdbff0b55 100644 --- a/MimeKit/ContentEncoding.cs +++ b/MimeKit/ContentEncoding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index 7e4cbf890a..b199c20318 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs index 9c848cced3..7e9dcfacb6 100644 --- a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs +++ b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPgpSignature.cs b/MimeKit/Cryptography/ApplicationPgpSignature.cs index 529f80e3a4..0d27475e60 100644 --- a/MimeKit/Cryptography/ApplicationPgpSignature.cs +++ b/MimeKit/Cryptography/ApplicationPgpSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index 5b0e310dca..d1ef191c27 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs index b572f06c25..104ce09ba1 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index a245a85373..e0e07e175e 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 0502f175f2..c4c4b10dcb 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index edfa613569..249acc0652 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 13f16c9bc3..5e4fd36c1d 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 34aa56582e..11d6577ec9 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index d07cafc320..207029c611 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CertificateNotFoundException.cs b/MimeKit/Cryptography/CertificateNotFoundException.cs index d66479435d..c262844e31 100644 --- a/MimeKit/Cryptography/CertificateNotFoundException.cs +++ b/MimeKit/Cryptography/CertificateNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index e298cc7991..6662c60c1e 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsRecipientCollection.cs b/MimeKit/Cryptography/CmsRecipientCollection.cs index e531e96d9e..8e576e363d 100644 --- a/MimeKit/Cryptography/CmsRecipientCollection.cs +++ b/MimeKit/Cryptography/CmsRecipientCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index b57c106d29..a1e28f461a 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 011394adae..8b0df4d3f7 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DbExtensions.cs b/MimeKit/Cryptography/DbExtensions.cs index d1447f7d42..24aa4bb49a 100644 --- a/MimeKit/Cryptography/DbExtensions.cs +++ b/MimeKit/Cryptography/DbExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index f8d30ba71c..d4acfd5e3d 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigestAlgorithm.cs b/MimeKit/Cryptography/DigestAlgorithm.cs index 0c794f609c..2f27437839 100644 --- a/MimeKit/Cryptography/DigestAlgorithm.cs +++ b/MimeKit/Cryptography/DigestAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigitalSignatureCollection.cs b/MimeKit/Cryptography/DigitalSignatureCollection.cs index bfbd4316c3..cc9e6a8df5 100644 --- a/MimeKit/Cryptography/DigitalSignatureCollection.cs +++ b/MimeKit/Cryptography/DigitalSignatureCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs index e9ed14172e..50648f8e54 100644 --- a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs +++ b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimBodyFilter.cs b/MimeKit/Cryptography/DkimBodyFilter.cs index 03df68e88b..6ef779a7cd 100644 --- a/MimeKit/Cryptography/DkimBodyFilter.cs +++ b/MimeKit/Cryptography/DkimBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs index 57276df721..a77cfa4c0c 100644 --- a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs +++ b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimHashStream.cs b/MimeKit/Cryptography/DkimHashStream.cs index 1ad3a49dcc..d7cda74cce 100644 --- a/MimeKit/Cryptography/DkimHashStream.cs +++ b/MimeKit/Cryptography/DkimHashStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index ae1fa40a4e..3d5da14bc8 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs index b494ba9c2b..97536f5a77 100644 --- a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs +++ b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs index cbbc3e62ee..ec884b1b35 100644 --- a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs +++ b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignatureStream.cs b/MimeKit/Cryptography/DkimSignatureStream.cs index 1aef66ee77..e68704f18a 100644 --- a/MimeKit/Cryptography/DkimSignatureStream.cs +++ b/MimeKit/Cryptography/DkimSignatureStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index ce92dd46d3..61518232eb 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignerBase.cs b/MimeKit/Cryptography/DkimSignerBase.cs index df85ee0e12..11ee0c826c 100644 --- a/MimeKit/Cryptography/DkimSignerBase.cs +++ b/MimeKit/Cryptography/DkimSignerBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs index 057567be8b..2478f13220 100644 --- a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs +++ b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index 6facdd73bc..0b391e7e85 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 5caf139f59..842361260a 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/Ed25519DigestSigner.cs b/MimeKit/Cryptography/Ed25519DigestSigner.cs index 4821805217..ed747e7f87 100644 --- a/MimeKit/Cryptography/Ed25519DigestSigner.cs +++ b/MimeKit/Cryptography/Ed25519DigestSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/EncryptionAlgorithm.cs b/MimeKit/Cryptography/EncryptionAlgorithm.cs index 57317e6da5..3f9a92b22d 100644 --- a/MimeKit/Cryptography/EncryptionAlgorithm.cs +++ b/MimeKit/Cryptography/EncryptionAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index ad4eb3783c..a30c0f4c56 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDigitalCertificate.cs b/MimeKit/Cryptography/IDigitalCertificate.cs index f2adb1dc90..550edf4c55 100644 --- a/MimeKit/Cryptography/IDigitalCertificate.cs +++ b/MimeKit/Cryptography/IDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDigitalSignature.cs b/MimeKit/Cryptography/IDigitalSignature.cs index 4661abe631..43a5c7cff1 100644 --- a/MimeKit/Cryptography/IDigitalSignature.cs +++ b/MimeKit/Cryptography/IDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs index 4792c5b52e..4a21d2c78f 100644 --- a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs +++ b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IX509CertificateDatabase.cs b/MimeKit/Cryptography/IX509CertificateDatabase.cs index 5948285b28..e97bf14436 100644 --- a/MimeKit/Cryptography/IX509CertificateDatabase.cs +++ b/MimeKit/Cryptography/IX509CertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/MultipartEncrypted.cs b/MimeKit/Cryptography/MultipartEncrypted.cs index 1e66b27103..b007c044eb 100644 --- a/MimeKit/Cryptography/MultipartEncrypted.cs +++ b/MimeKit/Cryptography/MultipartEncrypted.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index 4797ab7de6..2059831261 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpBlockFilter.cs b/MimeKit/Cryptography/OpenPgpBlockFilter.cs index d013ff959b..f08993df82 100644 --- a/MimeKit/Cryptography/OpenPgpBlockFilter.cs +++ b/MimeKit/Cryptography/OpenPgpBlockFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index a353d4c2bd..3bc79a1a58 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDataType.cs b/MimeKit/Cryptography/OpenPgpDataType.cs index 815ebba5ca..934ac58a3f 100644 --- a/MimeKit/Cryptography/OpenPgpDataType.cs +++ b/MimeKit/Cryptography/OpenPgpDataType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs index 0e27256c25..d8b24f6853 100644 --- a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs +++ b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs index dd5c50955d..ebdc5a7497 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs index fac7da55fc..6a58def4c6 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpKeyCertification.cs b/MimeKit/Cryptography/OpenPgpKeyCertification.cs index a730b70ae5..36d6147ad2 100644 --- a/MimeKit/Cryptography/OpenPgpKeyCertification.cs +++ b/MimeKit/Cryptography/OpenPgpKeyCertification.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs index d81ad85ae2..918d296e2d 100644 --- a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PublicKeyAlgorithm.cs b/MimeKit/Cryptography/PublicKeyAlgorithm.cs index a7f27532ea..a2b60f9b2f 100644 --- a/MimeKit/Cryptography/PublicKeyAlgorithm.cs +++ b/MimeKit/Cryptography/PublicKeyAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PublicKeyNotFoundException.cs b/MimeKit/Cryptography/PublicKeyNotFoundException.cs index 6e2d5ed1ee..b0cd01df90 100644 --- a/MimeKit/Cryptography/PublicKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PublicKeyNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaEncryptionPadding.cs b/MimeKit/Cryptography/RsaEncryptionPadding.cs index 3cb148c562..77fb38d878 100644 --- a/MimeKit/Cryptography/RsaEncryptionPadding.cs +++ b/MimeKit/Cryptography/RsaEncryptionPadding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs index 1c6f8127d0..60276291bd 100644 --- a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs +++ b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaSignaturePadding.cs b/MimeKit/Cryptography/RsaSignaturePadding.cs index 3644e52214..29dc55efb5 100644 --- a/MimeKit/Cryptography/RsaSignaturePadding.cs +++ b/MimeKit/Cryptography/RsaSignaturePadding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs index 9cc8e20444..1738b1e002 100644 --- a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs +++ b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index c6776795ac..e03ec92bc7 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index a72abc5d49..2ce5aea787 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs index eba34320f3..4ccb3bcd92 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 5a064aaac4..90ba6e9ac1 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeType.cs b/MimeKit/Cryptography/SecureMimeType.cs index 3fff145934..7c0929db67 100644 --- a/MimeKit/Cryptography/SecureMimeType.cs +++ b/MimeKit/Cryptography/SecureMimeType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index a16b7b0c7f..d8ec592b78 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 3df792f3d6..c7df41d770 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SubjectIdentifierType.cs b/MimeKit/Cryptography/SubjectIdentifierType.cs index ac3a2aa351..3be42608d6 100644 --- a/MimeKit/Cryptography/SubjectIdentifierType.cs +++ b/MimeKit/Cryptography/SubjectIdentifierType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index b3a63b3bdb..c5baf3fb2f 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 7b171a709f..3d2612c0d5 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs index c481421e2b..9b50af8c9c 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs index fef94bdc0c..5a8b5b92df 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509Certificate2Extensions.cs b/MimeKit/Cryptography/X509Certificate2Extensions.cs index 6bf093bcb8..d41365c1f7 100644 --- a/MimeKit/Cryptography/X509Certificate2Extensions.cs +++ b/MimeKit/Cryptography/X509Certificate2Extensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateChain.cs b/MimeKit/Cryptography/X509CertificateChain.cs index eafc018200..ead95801e4 100644 --- a/MimeKit/Cryptography/X509CertificateChain.cs +++ b/MimeKit/Cryptography/X509CertificateChain.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 5ef316ba77..9fe570423f 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateRecord.cs b/MimeKit/Cryptography/X509CertificateRecord.cs index e64aa6ab10..a23a83705d 100644 --- a/MimeKit/Cryptography/X509CertificateRecord.cs +++ b/MimeKit/Cryptography/X509CertificateRecord.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateStore.cs b/MimeKit/Cryptography/X509CertificateStore.cs index 35b662d9c4..2f952718ae 100644 --- a/MimeKit/Cryptography/X509CertificateStore.cs +++ b/MimeKit/Cryptography/X509CertificateStore.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CrlRecord.cs b/MimeKit/Cryptography/X509CrlRecord.cs index 80091a79ab..9184cd5bee 100644 --- a/MimeKit/Cryptography/X509CrlRecord.cs +++ b/MimeKit/Cryptography/X509CrlRecord.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509KeyUsageFlags.cs b/MimeKit/Cryptography/X509KeyUsageFlags.cs index e5e8d090ed..8dbe539747 100644 --- a/MimeKit/Cryptography/X509KeyUsageFlags.cs +++ b/MimeKit/Cryptography/X509KeyUsageFlags.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/DomainList.cs b/MimeKit/DomainList.cs index 0a0b67804d..5fc05a3b34 100644 --- a/MimeKit/DomainList.cs +++ b/MimeKit/DomainList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/EncodingConstraint.cs b/MimeKit/EncodingConstraint.cs index a35a92056f..0793a9536f 100644 --- a/MimeKit/EncodingConstraint.cs +++ b/MimeKit/EncodingConstraint.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/Base64Decoder.cs b/MimeKit/Encodings/Base64Decoder.cs index f448c83399..4216bbf0a3 100644 --- a/MimeKit/Encodings/Base64Decoder.cs +++ b/MimeKit/Encodings/Base64Decoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/Base64Encoder.cs b/MimeKit/Encodings/Base64Encoder.cs index 4040f9abc5..7792e4f61e 100644 --- a/MimeKit/Encodings/Base64Encoder.cs +++ b/MimeKit/Encodings/Base64Encoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/HexDecoder.cs b/MimeKit/Encodings/HexDecoder.cs index 10a1b41595..102ffc5e79 100644 --- a/MimeKit/Encodings/HexDecoder.cs +++ b/MimeKit/Encodings/HexDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/HexEncoder.cs b/MimeKit/Encodings/HexEncoder.cs index fdac18cee3..94d953f23a 100644 --- a/MimeKit/Encodings/HexEncoder.cs +++ b/MimeKit/Encodings/HexEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/IMimeDecoder.cs b/MimeKit/Encodings/IMimeDecoder.cs index 8579abf215..091a6771e0 100644 --- a/MimeKit/Encodings/IMimeDecoder.cs +++ b/MimeKit/Encodings/IMimeDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/IMimeEncoder.cs b/MimeKit/Encodings/IMimeEncoder.cs index 023aa56c0f..ac7c240e67 100644 --- a/MimeKit/Encodings/IMimeEncoder.cs +++ b/MimeKit/Encodings/IMimeEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/PassThroughDecoder.cs b/MimeKit/Encodings/PassThroughDecoder.cs index ea72ca01e3..22584c54d7 100644 --- a/MimeKit/Encodings/PassThroughDecoder.cs +++ b/MimeKit/Encodings/PassThroughDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/PassThroughEncoder.cs b/MimeKit/Encodings/PassThroughEncoder.cs index 3a45f4de16..b724875519 100644 --- a/MimeKit/Encodings/PassThroughEncoder.cs +++ b/MimeKit/Encodings/PassThroughEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QEncoder.cs b/MimeKit/Encodings/QEncoder.cs index ead58dacb0..805c2ed6e7 100644 --- a/MimeKit/Encodings/QEncoder.cs +++ b/MimeKit/Encodings/QEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QuotedPrintableDecoder.cs b/MimeKit/Encodings/QuotedPrintableDecoder.cs index 8890f2b014..d74ca6b0fe 100644 --- a/MimeKit/Encodings/QuotedPrintableDecoder.cs +++ b/MimeKit/Encodings/QuotedPrintableDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QuotedPrintableEncoder.cs b/MimeKit/Encodings/QuotedPrintableEncoder.cs index 77e752a82f..fc14ffa273 100644 --- a/MimeKit/Encodings/QuotedPrintableEncoder.cs +++ b/MimeKit/Encodings/QuotedPrintableEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/UUDecoder.cs b/MimeKit/Encodings/UUDecoder.cs index 8272c6c9d2..7e457ed80e 100644 --- a/MimeKit/Encodings/UUDecoder.cs +++ b/MimeKit/Encodings/UUDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/UUEncoder.cs b/MimeKit/Encodings/UUEncoder.cs index 14fa57e360..9263c2b1a2 100644 --- a/MimeKit/Encodings/UUEncoder.cs +++ b/MimeKit/Encodings/UUEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/YDecoder.cs b/MimeKit/Encodings/YDecoder.cs index ccfa956ae7..802594c74d 100644 --- a/MimeKit/Encodings/YDecoder.cs +++ b/MimeKit/Encodings/YDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/YEncoder.cs b/MimeKit/Encodings/YEncoder.cs index 32b0bf231f..a6aabc01a8 100644 --- a/MimeKit/Encodings/YEncoder.cs +++ b/MimeKit/Encodings/YEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index 370f8faab7..dc517f1fe0 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 1e74cda9b7..f2302fd94b 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index a3fa89d3ed..7be74401fd 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 6c9a999c19..923d096c88 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index 682947a231..918fd3ba5d 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderListChangedEventArgs.cs b/MimeKit/HeaderListChangedEventArgs.cs index c8e39ba3f1..5972a2f7b8 100644 --- a/MimeKit/HeaderListChangedEventArgs.cs +++ b/MimeKit/HeaderListChangedEventArgs.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderListCollection.cs b/MimeKit/HeaderListCollection.cs index 8944f62aca..6f2cae2144 100644 --- a/MimeKit/HeaderListCollection.cs +++ b/MimeKit/HeaderListCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IMimeContent.cs b/MimeKit/IMimeContent.cs index 380ff1e323..450c1748ca 100644 --- a/MimeKit/IMimeContent.cs +++ b/MimeKit/IMimeContent.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/BoundStream.cs b/MimeKit/IO/BoundStream.cs index 85936b2a76..744aad9b39 100644 --- a/MimeKit/IO/BoundStream.cs +++ b/MimeKit/IO/BoundStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/ChainedStream.cs b/MimeKit/IO/ChainedStream.cs index 7440151053..daabc5c4fd 100644 --- a/MimeKit/IO/ChainedStream.cs +++ b/MimeKit/IO/ChainedStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/FilteredStream.cs b/MimeKit/IO/FilteredStream.cs index c041597277..efe49b56e1 100644 --- a/MimeKit/IO/FilteredStream.cs +++ b/MimeKit/IO/FilteredStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/ArmoredFromFilter.cs b/MimeKit/IO/Filters/ArmoredFromFilter.cs index 2469d6f62d..152f293f96 100644 --- a/MimeKit/IO/Filters/ArmoredFromFilter.cs +++ b/MimeKit/IO/Filters/ArmoredFromFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/BestEncodingFilter.cs b/MimeKit/IO/Filters/BestEncodingFilter.cs index d9b19e4ca8..da0d294d8d 100644 --- a/MimeKit/IO/Filters/BestEncodingFilter.cs +++ b/MimeKit/IO/Filters/BestEncodingFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/CharsetFilter.cs b/MimeKit/IO/Filters/CharsetFilter.cs index f67939f206..4031ed8b18 100644 --- a/MimeKit/IO/Filters/CharsetFilter.cs +++ b/MimeKit/IO/Filters/CharsetFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/DecoderFilter.cs b/MimeKit/IO/Filters/DecoderFilter.cs index ecdfb54781..c88efaf5c0 100644 --- a/MimeKit/IO/Filters/DecoderFilter.cs +++ b/MimeKit/IO/Filters/DecoderFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/Dos2UnixFilter.cs b/MimeKit/IO/Filters/Dos2UnixFilter.cs index e06683866c..d49a398ca7 100644 --- a/MimeKit/IO/Filters/Dos2UnixFilter.cs +++ b/MimeKit/IO/Filters/Dos2UnixFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/EncoderFilter.cs b/MimeKit/IO/Filters/EncoderFilter.cs index 902bf24ef2..fd2fa8bc28 100644 --- a/MimeKit/IO/Filters/EncoderFilter.cs +++ b/MimeKit/IO/Filters/EncoderFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/IMimeFilter.cs b/MimeKit/IO/Filters/IMimeFilter.cs index c67dd14e34..f707728039 100644 --- a/MimeKit/IO/Filters/IMimeFilter.cs +++ b/MimeKit/IO/Filters/IMimeFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/MimeFilterBase.cs b/MimeKit/IO/Filters/MimeFilterBase.cs index 642964f949..e51816ba37 100644 --- a/MimeKit/IO/Filters/MimeFilterBase.cs +++ b/MimeKit/IO/Filters/MimeFilterBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/PassThroughFilter.cs b/MimeKit/IO/Filters/PassThroughFilter.cs index 06d000acf7..c31e791c40 100644 --- a/MimeKit/IO/Filters/PassThroughFilter.cs +++ b/MimeKit/IO/Filters/PassThroughFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs index 267ba754ec..283a425164 100644 --- a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs +++ b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/Unix2DosFilter.cs b/MimeKit/IO/Filters/Unix2DosFilter.cs index 2a59bc953a..b6c9d8f149 100644 --- a/MimeKit/IO/Filters/Unix2DosFilter.cs +++ b/MimeKit/IO/Filters/Unix2DosFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/ICancellableStream.cs b/MimeKit/IO/ICancellableStream.cs index 954b32d223..03290b3ee5 100644 --- a/MimeKit/IO/ICancellableStream.cs +++ b/MimeKit/IO/ICancellableStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/MeasuringStream.cs b/MimeKit/IO/MeasuringStream.cs index 2c6fd2c542..064c356bbf 100644 --- a/MimeKit/IO/MeasuringStream.cs +++ b/MimeKit/IO/MeasuringStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index 07b5cbf755..74a1c2bdc2 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 9e9b61fbc4..c1f1c98c01 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index e02ae6d084..9c935f66c2 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index 264d11df5b..c78a68cf0f 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index acff14e391..69624e4db2 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageDispositionNotification.cs b/MimeKit/MessageDispositionNotification.cs index fedd9d8f32..a4bf863562 100644 --- a/MimeKit/MessageDispositionNotification.cs +++ b/MimeKit/MessageDispositionNotification.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageIdList.cs b/MimeKit/MessageIdList.cs index 9d642c9544..dca28c6ba0 100644 --- a/MimeKit/MessageIdList.cs +++ b/MimeKit/MessageIdList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageImportance.cs b/MimeKit/MessageImportance.cs index 82597b9219..05e2cb7863 100644 --- a/MimeKit/MessageImportance.cs +++ b/MimeKit/MessageImportance.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index d2c8986ef2..8396e7e525 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 2ad12702f7..2c4d92bb35 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePriority.cs b/MimeKit/MessagePriority.cs index fe136474b5..a31bf5c236 100644 --- a/MimeKit/MessagePriority.cs +++ b/MimeKit/MessagePriority.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index 415cc4828c..306cd7df56 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 76a5d86f84..dc8a8efb12 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeEntityConstructorArgs.cs b/MimeKit/MimeEntityConstructorArgs.cs index ca57445637..a9730b3560 100644 --- a/MimeKit/MimeEntityConstructorArgs.cs +++ b/MimeKit/MimeEntityConstructorArgs.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeFormat.cs b/MimeKit/MimeFormat.cs index e9e5a723ab..60d758b06c 100644 --- a/MimeKit/MimeFormat.cs +++ b/MimeKit/MimeFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeIterator.cs b/MimeKit/MimeIterator.cs index 30bb411bb7..fb741e8df8 100644 --- a/MimeKit/MimeIterator.cs +++ b/MimeKit/MimeIterator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 31f21ab778..67e373dea1 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.4.1 + 2.5.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 85952195b3..2454d79fc4 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.4.1 + 2.5.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 31ad90254a..4b1f17c2d0 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 1332b62aa1..e84fc071d9 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 89286454dd..9d46b20304 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index 1618f94e6e..cb25b1bbe7 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeVisitor.cs b/MimeKit/MimeVisitor.cs index 8d5b0f71ae..0f2addee8e 100644 --- a/MimeKit/MimeVisitor.cs +++ b/MimeKit/MimeVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 56b16adb8b..30b02f614f 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartAlternative.cs b/MimeKit/MultipartAlternative.cs index acc4311754..67f0aa6dbe 100644 --- a/MimeKit/MultipartAlternative.cs +++ b/MimeKit/MultipartAlternative.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index fb50145183..11a18fa7d2 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index 62dea75e23..74c0dfc549 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Parameter.cs b/MimeKit/Parameter.cs index 6f865f5d1c..554801b7c9 100644 --- a/MimeKit/Parameter.cs +++ b/MimeKit/Parameter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParameterEncodingMethod.cs b/MimeKit/ParameterEncodingMethod.cs index 8bc4d3d416..4a1aa14cf7 100644 --- a/MimeKit/ParameterEncodingMethod.cs +++ b/MimeKit/ParameterEncodingMethod.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 63e69edd22..d45c0b8cb7 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParseException.cs b/MimeKit/ParseException.cs index b33c865e96..a2778577e9 100644 --- a/MimeKit/ParseException.cs +++ b/MimeKit/ParseException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 9dd929c812..20249cad23 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index ee01d4fbe6..2b879331c1 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.4.1.0")] -[assembly: AssemblyFileVersion ("2.4.1.0")] -[assembly: AssemblyVersion ("2.4.0.0")] +[assembly: AssemblyInformationalVersion ("2.5.0.0")] +[assembly: AssemblyFileVersion ("2.5.0.0")] +[assembly: AssemblyVersion ("2.5.0.0")] diff --git a/MimeKit/RfcComplianceMode.cs b/MimeKit/RfcComplianceMode.cs index d570879886..d4caa9630d 100644 --- a/MimeKit/RfcComplianceMode.cs +++ b/MimeKit/RfcComplianceMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/CharBuffer.cs b/MimeKit/Text/CharBuffer.cs index 49a70b181e..02ca0df608 100644 --- a/MimeKit/Text/CharBuffer.cs +++ b/MimeKit/Text/CharBuffer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/FlowedToHtml.cs b/MimeKit/Text/FlowedToHtml.cs index dfdbf444b2..580d9a511b 100644 --- a/MimeKit/Text/FlowedToHtml.cs +++ b/MimeKit/Text/FlowedToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/FlowedToText.cs b/MimeKit/Text/FlowedToText.cs index ad6bda8f4e..392edb60da 100644 --- a/MimeKit/Text/FlowedToText.cs +++ b/MimeKit/Text/FlowedToText.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HeaderFooterFormat.cs b/MimeKit/Text/HeaderFooterFormat.cs index 075fb63983..a15d1c544b 100644 --- a/MimeKit/Text/HeaderFooterFormat.cs +++ b/MimeKit/Text/HeaderFooterFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttribute.cs b/MimeKit/Text/HtmlAttribute.cs index a78d9894fd..b91c7ef5e3 100644 --- a/MimeKit/Text/HtmlAttribute.cs +++ b/MimeKit/Text/HtmlAttribute.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttributeCollection.cs b/MimeKit/Text/HtmlAttributeCollection.cs index 54ca4b601e..7059a0699d 100644 --- a/MimeKit/Text/HtmlAttributeCollection.cs +++ b/MimeKit/Text/HtmlAttributeCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttributeId.cs b/MimeKit/Text/HtmlAttributeId.cs index 4a29b6a282..eae46511bc 100644 --- a/MimeKit/Text/HtmlAttributeId.cs +++ b/MimeKit/Text/HtmlAttributeId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlEntityDecoder.cs b/MimeKit/Text/HtmlEntityDecoder.cs index 903f6579bf..2a4471bc71 100644 --- a/MimeKit/Text/HtmlEntityDecoder.cs +++ b/MimeKit/Text/HtmlEntityDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlEntityDecoder.g.cs b/MimeKit/Text/HtmlEntityDecoder.g.cs index 256bf73a72..f3921115ff 100644 --- a/MimeKit/Text/HtmlEntityDecoder.g.cs +++ b/MimeKit/Text/HtmlEntityDecoder.g.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlNamespace.cs b/MimeKit/Text/HtmlNamespace.cs index 92bce24725..270dbeb44b 100644 --- a/MimeKit/Text/HtmlNamespace.cs +++ b/MimeKit/Text/HtmlNamespace.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagCallback.cs b/MimeKit/Text/HtmlTagCallback.cs index 489f42e9ef..1a23d0f8d3 100644 --- a/MimeKit/Text/HtmlTagCallback.cs +++ b/MimeKit/Text/HtmlTagCallback.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagContext.cs b/MimeKit/Text/HtmlTagContext.cs index c545791778..630a233a9e 100644 --- a/MimeKit/Text/HtmlTagContext.cs +++ b/MimeKit/Text/HtmlTagContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index 35114fb961..8ad41bd1ee 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlToHtml.cs b/MimeKit/Text/HtmlToHtml.cs index 7bffc34936..ba49c24c67 100644 --- a/MimeKit/Text/HtmlToHtml.cs +++ b/MimeKit/Text/HtmlToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlToken.cs b/MimeKit/Text/HtmlToken.cs index f77a39209c..23e87048e2 100644 --- a/MimeKit/Text/HtmlToken.cs +++ b/MimeKit/Text/HtmlToken.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenKind.cs b/MimeKit/Text/HtmlTokenKind.cs index 99a731c223..fa595a9d62 100644 --- a/MimeKit/Text/HtmlTokenKind.cs +++ b/MimeKit/Text/HtmlTokenKind.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 19186d174a..9fd012b63f 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenizerState.cs b/MimeKit/Text/HtmlTokenizerState.cs index 7535911474..06b26ee985 100644 --- a/MimeKit/Text/HtmlTokenizerState.cs +++ b/MimeKit/Text/HtmlTokenizerState.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlUtils.cs b/MimeKit/Text/HtmlUtils.cs index 5f95738b14..03cfa5776d 100644 --- a/MimeKit/Text/HtmlUtils.cs +++ b/MimeKit/Text/HtmlUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlWriter.cs b/MimeKit/Text/HtmlWriter.cs index 4987cfc0ec..095b6c683c 100644 --- a/MimeKit/Text/HtmlWriter.cs +++ b/MimeKit/Text/HtmlWriter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlWriterState.cs b/MimeKit/Text/HtmlWriterState.cs index cac0dc3c4d..1d6c31cce6 100644 --- a/MimeKit/Text/HtmlWriterState.cs +++ b/MimeKit/Text/HtmlWriterState.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/ICharArray.cs b/MimeKit/Text/ICharArray.cs index c83912ea19..35bcf406c9 100644 --- a/MimeKit/Text/ICharArray.cs +++ b/MimeKit/Text/ICharArray.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index 4856f0613c..6516cc3846 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextFormat.cs b/MimeKit/Text/TextFormat.cs index 42cd9532ff..e32bf2d009 100644 --- a/MimeKit/Text/TextFormat.cs +++ b/MimeKit/Text/TextFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index e987b90b95..95be8fc75c 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToHtml.cs b/MimeKit/Text/TextToHtml.cs index fcb9529007..af9cd011ff 100644 --- a/MimeKit/Text/TextToHtml.cs +++ b/MimeKit/Text/TextToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToText.cs b/MimeKit/Text/TextToText.cs index ef29f23f5c..b61dffa835 100644 --- a/MimeKit/Text/TextToText.cs +++ b/MimeKit/Text/TextToText.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/Trie.cs b/MimeKit/Text/Trie.cs index 990acc2355..e8b8f6b401 100644 --- a/MimeKit/Text/Trie.cs +++ b/MimeKit/Text/Trie.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/UrlScanner.cs b/MimeKit/Text/UrlScanner.cs index 82ef74d94c..415d4c3a3f 100644 --- a/MimeKit/Text/UrlScanner.cs +++ b/MimeKit/Text/UrlScanner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index a18341ae8d..bdd28ca8ab 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/TextRfc822Headers.cs b/MimeKit/TextRfc822Headers.cs index 5974597067..5aab4a2108 100644 --- a/MimeKit/TextRfc822Headers.cs +++ b/MimeKit/TextRfc822Headers.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/RtfCompressedToRtf.cs b/MimeKit/Tnef/RtfCompressedToRtf.cs index 524a314e52..5a2f2fdeef 100644 --- a/MimeKit/Tnef/RtfCompressedToRtf.cs +++ b/MimeKit/Tnef/RtfCompressedToRtf.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/RtfCompressionMode.cs b/MimeKit/Tnef/RtfCompressionMode.cs index 6b2c544ec2..2e90f997e8 100644 --- a/MimeKit/Tnef/RtfCompressionMode.cs +++ b/MimeKit/Tnef/RtfCompressionMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttachFlags.cs b/MimeKit/Tnef/TnefAttachFlags.cs index 389fbeceb2..9ea7fbf767 100644 --- a/MimeKit/Tnef/TnefAttachFlags.cs +++ b/MimeKit/Tnef/TnefAttachFlags.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttachMethod.cs b/MimeKit/Tnef/TnefAttachMethod.cs index a44307befc..84bd7d06cb 100644 --- a/MimeKit/Tnef/TnefAttachMethod.cs +++ b/MimeKit/Tnef/TnefAttachMethod.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttributeLevel.cs b/MimeKit/Tnef/TnefAttributeLevel.cs index ea5197366c..cc1ece4e0b 100644 --- a/MimeKit/Tnef/TnefAttributeLevel.cs +++ b/MimeKit/Tnef/TnefAttributeLevel.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttributeTag.cs b/MimeKit/Tnef/TnefAttributeTag.cs index 241c3027f5..5b3a28091b 100644 --- a/MimeKit/Tnef/TnefAttributeTag.cs +++ b/MimeKit/Tnef/TnefAttributeTag.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefComplianceMode.cs b/MimeKit/Tnef/TnefComplianceMode.cs index 78a190433d..14ac1d4467 100644 --- a/MimeKit/Tnef/TnefComplianceMode.cs +++ b/MimeKit/Tnef/TnefComplianceMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefComplianceStatus.cs b/MimeKit/Tnef/TnefComplianceStatus.cs index a9285b25f7..f7f9485d52 100644 --- a/MimeKit/Tnef/TnefComplianceStatus.cs +++ b/MimeKit/Tnef/TnefComplianceStatus.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefException.cs b/MimeKit/Tnef/TnefException.cs index 3addd46546..d954fe4090 100644 --- a/MimeKit/Tnef/TnefException.cs +++ b/MimeKit/Tnef/TnefException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefNameId.cs b/MimeKit/Tnef/TnefNameId.cs index e167a9b0ce..48eb069f29 100644 --- a/MimeKit/Tnef/TnefNameId.cs +++ b/MimeKit/Tnef/TnefNameId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefNameIdKind.cs b/MimeKit/Tnef/TnefNameIdKind.cs index e6368b6b49..5b5d61c001 100644 --- a/MimeKit/Tnef/TnefNameIdKind.cs +++ b/MimeKit/Tnef/TnefNameIdKind.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 9b566b700a..2f9d7a3534 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyId.cs b/MimeKit/Tnef/TnefPropertyId.cs index bd846ea8e7..e94be3c9b7 100644 --- a/MimeKit/Tnef/TnefPropertyId.cs +++ b/MimeKit/Tnef/TnefPropertyId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index d1b91b54b8..859a572473 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index af8156f883..35bc383caf 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyType.cs b/MimeKit/Tnef/TnefPropertyType.cs index 1cf648efcc..fba42c7b8d 100644 --- a/MimeKit/Tnef/TnefPropertyType.cs +++ b/MimeKit/Tnef/TnefPropertyType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index 6b38423786..fa1ce8a259 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefReaderStream.cs b/MimeKit/Tnef/TnefReaderStream.cs index 59f5f48a55..997b18cde4 100644 --- a/MimeKit/Tnef/TnefReaderStream.cs +++ b/MimeKit/Tnef/TnefReaderStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/BufferPool.cs b/MimeKit/Utils/BufferPool.cs index 4e7830a494..38d9d8b53f 100644 --- a/MimeKit/Utils/BufferPool.cs +++ b/MimeKit/Utils/BufferPool.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/ByteExtensions.cs b/MimeKit/Utils/ByteExtensions.cs index 69c94512d4..bb3ecbd75f 100644 --- a/MimeKit/Utils/ByteExtensions.cs +++ b/MimeKit/Utils/ByteExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index 7604fc9ebd..91bb5ed059 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/Crc32.cs b/MimeKit/Utils/Crc32.cs index 9b9c7174cd..ab21f13e0c 100644 --- a/MimeKit/Utils/Crc32.cs +++ b/MimeKit/Utils/Crc32.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index 9b4b66f955..4f28fc1bd4 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index f63a5f6e90..bf489475da 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index 8b351e6900..839ebcfc23 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/PackedByteArray.cs b/MimeKit/Utils/PackedByteArray.cs index afcd995257..94cb6412f5 100644 --- a/MimeKit/Utils/PackedByteArray.cs +++ b/MimeKit/Utils/PackedByteArray.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index d557be0969..f13c3fd525 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/Rfc2047.cs b/MimeKit/Utils/Rfc2047.cs index 8091ca4cb7..e995cc16a5 100644 --- a/MimeKit/Utils/Rfc2047.cs +++ b/MimeKit/Utils/Rfc2047.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index 1b62ffb13c..f2c065424b 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/XMessagePriority.cs b/MimeKit/XMessagePriority.cs index 20a398155c..b4fd7d76de 100644 --- a/MimeKit/XMessagePriority.cs +++ b/MimeKit/XMessagePriority.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index faaa54de7e..99a919f266 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ How does your MIME parser compare? ## License Information -MimeKit is Copyright (C) 2012-2019 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2020 Xamarin Inc. and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 18efa9396b..3ea597fc36 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,35 @@ # Release Notes +### MimeKit 2.5.0 (2020-01-18) + +* Fixed message reserialization after prepending headers. + (issue [#524](https://github.com/jstedfast/MimeKit/issues/524)) +* Added a ContentType.CharsetEncoding property. + (issue [#526](https://github.com/jstedfast/MimeKit/issues/526)) +* Allow empty prop-spec token values in Authentication-Results headers. + (issue [#527](https://github.com/jstedfast/MimeKit/issues/527)) +* Added logic to quote Authentication-Results pvalue tokens if needed. +* Added support for converting RSACng keys into BouncyCastle keys for + net4x versions that support it. +* Added support for RSAES-OAEP for the BouncyCastle backend. + (issue [#528](https://github.com/jstedfast/MimeKit/issues/528)) +* Updated and changed the API for RSASSA-PSS. CmsSigner now has a + RsaSignaturePadding property which obsoletes the previous + RsaSignaturePaddingScheme property. +* Added more columns to the default SQLite database CERTIFICATES table + that allow more optimal SQL searches for certificates given various + matching criteria. +* Fixed WindowsSecureMimeContext.Decrypt() to make sure it doesn't stop + at the first failed recipient. + (issue [#530](https://github.com/jstedfast/MimeKit/issues/530)) +* Fixed splitting and reassembly of message/partial messages. +* Improved handling of Office365 Authentication-Results headers by adding + a Office365AuthenticationServiceIdentifier property to the + AuthenticationMethodResult class. +* Fixed mailbox address parser to be more lenient about `"["` and `"]"` + characters in the display-name. + (issue [#532](https://github.com/jstedfast/MimeKit/issues/532)) + ### MimeKit 2.4.1 (2019-11-10) * Don't use PublicSign on non-Windows NT machines when building. diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index cc712798b2..56e6d58c67 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AssortedTests.cs b/UnitTests/AssortedTests.cs index 8e111c688f..d71e08b808 100644 --- a/UnitTests/AssortedTests.cs +++ b/UnitTests/AssortedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index 15cda422ff..bbc98e1b03 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ConstructorTests.cs b/UnitTests/ConstructorTests.cs index d98dc8e651..e70067ba86 100644 --- a/UnitTests/ConstructorTests.cs +++ b/UnitTests/ConstructorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentDispositionTests.cs b/UnitTests/ContentDispositionTests.cs index a6e4849503..56a722c38b 100644 --- a/UnitTests/ContentDispositionTests.cs +++ b/UnitTests/ContentDispositionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentObjectTests.cs b/UnitTests/ContentObjectTests.cs index fd3f211c96..e38d01b0d4 100644 --- a/UnitTests/ContentObjectTests.cs +++ b/UnitTests/ContentObjectTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index d741a6b65f..bb90243c54 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs index 1995018e48..b807d4441f 100644 --- a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs +++ b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 42776197ff..acda0f8019 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index a04d360aa6..9bdb329c75 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index a33971fa1f..1e14123b1d 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index fedb010a3c..7817d2633f 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs index f4b01ff88c..c0b286d936 100644 --- a/UnitTests/Cryptography/CertificateExtensionTests.cs +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 0eda797237..0c61fdd96d 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index 814976dccc..4efd93231d 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index eefcc82915..d2c0061d36 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimPublicKeyLocator.cs b/UnitTests/Cryptography/DkimPublicKeyLocator.cs index a017f3ef6d..004f2dc480 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocator.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs index 6fcd84d70a..2f5e87ff99 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs index aa59641227..a8f6cf92d9 100644 --- a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs +++ b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index df6cb4b40d..59b8f8cf5f 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DummyArcSigner.cs b/UnitTests/Cryptography/DummyArcSigner.cs index 75748236c1..368c2350cd 100644 --- a/UnitTests/Cryptography/DummyArcSigner.cs +++ b/UnitTests/Cryptography/DummyArcSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DummyOpenPgpContext.cs b/UnitTests/Cryptography/DummyOpenPgpContext.cs index db87f23806..a293d51a18 100644 --- a/UnitTests/Cryptography/DummyOpenPgpContext.cs +++ b/UnitTests/Cryptography/DummyOpenPgpContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/LdapUriTests.cs b/UnitTests/Cryptography/LdapUriTests.cs index cfe7bbd2da..18fee21dfc 100644 --- a/UnitTests/Cryptography/LdapUriTests.cs +++ b/UnitTests/Cryptography/LdapUriTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index d65a52137f..82a385a70c 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs index be234f3e0d..b06d19540f 100644 --- a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs +++ b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs index ce9faeca93..02ca3a9270 100644 --- a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs +++ b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs index a760021668..24dc305715 100644 --- a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs +++ b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index ad634fa394..49bb24436c 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs index 618804d7b2..1b5bc976c0 100644 --- a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs +++ b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index 033952360a..1231620661 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs index 5de4657f18..633f654ec9 100644 --- a/UnitTests/Cryptography/X509CertificateRecordTests.cs +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index 0fbaaa82b4..13f04f16de 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/DomainListTests.cs b/UnitTests/DomainListTests.cs index 798a7a1cee..e797b84d06 100644 --- a/UnitTests/DomainListTests.cs +++ b/UnitTests/DomainListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index 0aeb8345b0..a33213b8a4 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/YEncodingTests.cs b/UnitTests/Encodings/YEncodingTests.cs index 997dbca66d..7778bc97a2 100644 --- a/UnitTests/Encodings/YEncodingTests.cs +++ b/UnitTests/Encodings/YEncodingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ExceptionTests.cs b/UnitTests/ExceptionTests.cs index 958f949ab2..4673fd6b0a 100644 --- a/UnitTests/ExceptionTests.cs +++ b/UnitTests/ExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/FormatOptionsTests.cs b/UnitTests/FormatOptionsTests.cs index 67bb5d39ff..4e746c03a7 100644 --- a/UnitTests/FormatOptionsTests.cs +++ b/UnitTests/FormatOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 0b74c226cc..178ffe5d22 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderListTests.cs b/UnitTests/HeaderListTests.cs index 696bacc835..ceba98fa88 100644 --- a/UnitTests/HeaderListTests.cs +++ b/UnitTests/HeaderListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index a70d83104f..6d544ec233 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HtmlPreviewVisitor.cs b/UnitTests/HtmlPreviewVisitor.cs index e27d565dff..385122a782 100644 --- a/UnitTests/HtmlPreviewVisitor.cs +++ b/UnitTests/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/BoundStreamTests.cs b/UnitTests/IO/BoundStreamTests.cs index b8de24d519..e5ef0cf1f4 100644 --- a/UnitTests/IO/BoundStreamTests.cs +++ b/UnitTests/IO/BoundStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/CanReadWriteSeekStream.cs b/UnitTests/IO/CanReadWriteSeekStream.cs index 85216af6ef..9e512cd6d4 100644 --- a/UnitTests/IO/CanReadWriteSeekStream.cs +++ b/UnitTests/IO/CanReadWriteSeekStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ChainedStreamTests.cs b/UnitTests/IO/ChainedStreamTests.cs index d5d31a8751..590bc61bc7 100644 --- a/UnitTests/IO/ChainedStreamTests.cs +++ b/UnitTests/IO/ChainedStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/FilteredStreamTests.cs b/UnitTests/IO/FilteredStreamTests.cs index aa20b71644..c4a3088303 100644 --- a/UnitTests/IO/FilteredStreamTests.cs +++ b/UnitTests/IO/FilteredStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/Filters/FilterTests.cs b/UnitTests/IO/Filters/FilterTests.cs index 7958931f37..d85c71b161 100644 --- a/UnitTests/IO/Filters/FilterTests.cs +++ b/UnitTests/IO/Filters/FilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MeasuringStreamTests.cs b/UnitTests/IO/MeasuringStreamTests.cs index f92ab40666..bd13fe4337 100644 --- a/UnitTests/IO/MeasuringStreamTests.cs +++ b/UnitTests/IO/MeasuringStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index 7caaddf744..cceb48a832 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ReadOneByteStream.cs b/UnitTests/IO/ReadOneByteStream.cs index 1c6702bafe..6a02086bbc 100644 --- a/UnitTests/IO/ReadOneByteStream.cs +++ b/UnitTests/IO/ReadOneByteStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/TimeoutStream.cs b/UnitTests/IO/TimeoutStream.cs index 2b9d685833..4214ce37aa 100644 --- a/UnitTests/IO/TimeoutStream.cs +++ b/UnitTests/IO/TimeoutStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index 67aa45634c..74ad609521 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index a27c923c8f..7bbfb1d296 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 00d4bbb8c1..a14f6806ee 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDeliveryStatusTests.cs b/UnitTests/MessageDeliveryStatusTests.cs index 59bb96cae7..b66192da88 100644 --- a/UnitTests/MessageDeliveryStatusTests.cs +++ b/UnitTests/MessageDeliveryStatusTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDispositionNotificiationTests.cs b/UnitTests/MessageDispositionNotificiationTests.cs index 4222513117..2ec001f760 100644 --- a/UnitTests/MessageDispositionNotificiationTests.cs +++ b/UnitTests/MessageDispositionNotificiationTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageIdListTests.cs b/UnitTests/MessageIdListTests.cs index 54c92cc0b8..02a506c5c4 100644 --- a/UnitTests/MessageIdListTests.cs +++ b/UnitTests/MessageIdListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessagePartialTests.cs b/UnitTests/MessagePartialTests.cs index 3422f58537..10d9e37ccd 100644 --- a/UnitTests/MessagePartialTests.cs +++ b/UnitTests/MessagePartialTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeIteratorTests.cs b/UnitTests/MimeIteratorTests.cs index cdd8313ce1..25e97331cb 100644 --- a/UnitTests/MimeIteratorTests.cs +++ b/UnitTests/MimeIteratorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index c5ae4ed8c7..9699968a3d 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index ddb2901ebe..ef613a8edb 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 422d24d38a..605672ac5d 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 1d75564147..33edcca9ca 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index e89a350ccd..cb1d4e6fe7 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartAlternativeTests.cs b/UnitTests/MultipartAlternativeTests.cs index a4f82958f4..70eb0a0093 100644 --- a/UnitTests/MultipartAlternativeTests.cs +++ b/UnitTests/MultipartAlternativeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index 6c3e8abcb8..6d56b19a9c 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartReportTests.cs b/UnitTests/MultipartReportTests.cs index c193cf54e3..93268dbaf1 100644 --- a/UnitTests/MultipartReportTests.cs +++ b/UnitTests/MultipartReportTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartTests.cs b/UnitTests/MultipartTests.cs index 328e24b7ff..1a1dbcb6fa 100644 --- a/UnitTests/MultipartTests.cs +++ b/UnitTests/MultipartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterListTests.cs b/UnitTests/ParameterListTests.cs index 8aad95e66b..fba53800d0 100644 --- a/UnitTests/ParameterListTests.cs +++ b/UnitTests/ParameterListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterTests.cs b/UnitTests/ParameterTests.cs index 3427cdcfe9..cfcd5b0f1a 100644 --- a/UnitTests/ParameterTests.cs +++ b/UnitTests/ParameterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParserOptionsTests.cs b/UnitTests/ParserOptionsTests.cs index d612a2eb87..a521764fa5 100644 --- a/UnitTests/ParserOptionsTests.cs +++ b/UnitTests/ParserOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs index 265131ceb0..b9d8109165 100644 --- a/UnitTests/Text/FlowedToHtmlTests.cs +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/FlowedToTextTests.cs b/UnitTests/Text/FlowedToTextTests.cs index 4e0aa05103..c3c050511b 100644 --- a/UnitTests/Text/FlowedToTextTests.cs +++ b/UnitTests/Text/FlowedToTextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlAttributeTests.cs b/UnitTests/Text/HtmlAttributeTests.cs index a42f56eae9..d67aa9ddf1 100644 --- a/UnitTests/Text/HtmlAttributeTests.cs +++ b/UnitTests/Text/HtmlAttributeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlEntityDecoderTests.cs b/UnitTests/Text/HtmlEntityDecoderTests.cs index 82e0f8dd4c..1c3a3ee46c 100644 --- a/UnitTests/Text/HtmlEntityDecoderTests.cs +++ b/UnitTests/Text/HtmlEntityDecoderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTagIdTests.cs b/UnitTests/Text/HtmlTagIdTests.cs index bad237f91e..d65c092d6b 100644 --- a/UnitTests/Text/HtmlTagIdTests.cs +++ b/UnitTests/Text/HtmlTagIdTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index 13176296af..fbbd780845 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenTests.cs b/UnitTests/Text/HtmlTokenTests.cs index 1d65f04911..1fe16920ce 100644 --- a/UnitTests/Text/HtmlTokenTests.cs +++ b/UnitTests/Text/HtmlTokenTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenizerTests.cs b/UnitTests/Text/HtmlTokenizerTests.cs index 507497c273..39e65f5051 100644 --- a/UnitTests/Text/HtmlTokenizerTests.cs +++ b/UnitTests/Text/HtmlTokenizerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlUtilsTests.cs b/UnitTests/Text/HtmlUtilsTests.cs index 3735267a17..960063f690 100644 --- a/UnitTests/Text/HtmlUtilsTests.cs +++ b/UnitTests/Text/HtmlUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlWriterTests.cs b/UnitTests/Text/HtmlWriterTests.cs index 578fddd960..4f31f7e0f0 100644 --- a/UnitTests/Text/HtmlWriterTests.cs +++ b/UnitTests/Text/HtmlWriterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/RtfCompressedToRtfTests.cs b/UnitTests/Text/RtfCompressedToRtfTests.cs index 3a1a492146..490baaa54e 100644 --- a/UnitTests/Text/RtfCompressedToRtfTests.cs +++ b/UnitTests/Text/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index f34e2c7cb6..9132e7a86a 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index 310eb2ecb0..c05fa97cfd 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index 70bb43186c..06fcf4e3e9 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToTextTests.cs b/UnitTests/Text/TextToTextTests.cs index 414e5c3de8..4ced3bccc1 100644 --- a/UnitTests/Text/TextToTextTests.cs +++ b/UnitTests/Text/TextToTextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TrieTests.cs b/UnitTests/Text/TrieTests.cs index 3c438ea9c1..6a4bc09505 100644 --- a/UnitTests/Text/TrieTests.cs +++ b/UnitTests/Text/TrieTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/UrlScannerTests.cs b/UnitTests/Text/UrlScannerTests.cs index d84dfdcc9c..2527ff58d8 100644 --- a/UnitTests/Text/UrlScannerTests.cs +++ b/UnitTests/Text/UrlScannerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index a109d8ecc1..8157218bb7 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextRfc822HeadersTests.cs b/UnitTests/TextRfc822HeadersTests.cs index 66ad40624f..d0a604cc8f 100644 --- a/UnitTests/TextRfc822HeadersTests.cs +++ b/UnitTests/TextRfc822HeadersTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/RtfCompressedToRtfTests.cs b/UnitTests/Tnef/RtfCompressedToRtfTests.cs index 411da998e5..03c3cf9a8b 100644 --- a/UnitTests/Tnef/RtfCompressedToRtfTests.cs +++ b/UnitTests/Tnef/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderStreamTests.cs b/UnitTests/Tnef/TnefReaderStreamTests.cs index 94e0095f8a..fbe84cf189 100644 --- a/UnitTests/Tnef/TnefReaderStreamTests.cs +++ b/UnitTests/Tnef/TnefReaderStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderTests.cs b/UnitTests/Tnef/TnefReaderTests.cs index 75dd4acf46..d1bf4cae75 100644 --- a/UnitTests/Tnef/TnefReaderTests.cs +++ b/UnitTests/Tnef/TnefReaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 0808b211b5..fd753dcd4e 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/CharsetUtilsTests.cs b/UnitTests/Utils/CharsetUtilsTests.cs index 15371de3a8..6ca3a15224 100644 --- a/UnitTests/Utils/CharsetUtilsTests.cs +++ b/UnitTests/Utils/CharsetUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/DateParserTests.cs b/UnitTests/Utils/DateParserTests.cs index 3a13089585..f1e3da5b48 100644 --- a/UnitTests/Utils/DateParserTests.cs +++ b/UnitTests/Utils/DateParserTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index 3449ffed18..fb480d5346 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/PackedByteArrayTests.cs b/UnitTests/Utils/PackedByteArrayTests.cs index 67cfcbb7b0..63e4a2685c 100644 --- a/UnitTests/Utils/PackedByteArrayTests.cs +++ b/UnitTests/Utils/PackedByteArrayTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index c893dcd90b..f02e8107fc 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/Rfc2047Tests.cs b/UnitTests/Utils/Rfc2047Tests.cs index 44f8957787..1673476e24 100644 --- a/UnitTests/Utils/Rfc2047Tests.cs +++ b/UnitTests/Utils/Rfc2047Tests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index a9ee4d6147..be08260b55 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2019 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/appveyor.yml b/appveyor.yml index 1ab383d92a..9f024505ce 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.4.1.{build} +version: 2.5.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5aed82066c..23d90a78a8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.4.1$(Rev:.r) +name: 2.5.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 6f285a13f4..7db94a0125 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.4.1 + 2.5.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,10 +26,18 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Don't use PublicSign on non-Windows NT machines when building. (issue #516) -* Improved BouncyCastleSecureMimeContext logic for building certificate chains so that certificate chains are included in the S/MIME signature. (issue #515) -* Improved SqlCertificateDatabase.Find() by using more IX509Selector properties. -* Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens. (issue #518) +* Fixed message reserialization after prepending headers. (issue #524) +* Added a ContentType.CharsetEncoding property. (issue #526) +* Allow empty prop-spec token values in Authentication-Results headers. (issue #527) +* Added logic to quote Authentication-Results pvalue tokens if needed. +* Added support for converting RSACng keys into BouncyCastle keys for net4x versions that support it. +* Added support for RSAES-OAEP for the BouncyCastle backend. (issue #528) +* Updated and changed the API for RSASSA-PSS. CmsSigner now has a RsaSignaturePadding property which obsoletes the previous RsaSignaturePaddingScheme property. +* Added more columns to the default SQLite database CERTIFICATES table that allow more optimal SQL searches for certificates given various matching criteria. +* Fixed WindowsSecureMimeContext.Decrypt() to make sure it doesn't stop at the first failed recipient. (issue #530) +* Fixed splitting and reassembly of message/partial messages. +* Improved handling of Office365 Authentication-Results headers by adding a Office365AuthenticationServiceIdentifier property to the AuthenticationMethodResult class. +* Fixed mailbox address parser to be more lenient about `"["` and `"]"` characters in the display-name. (issue #532) Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index c7539e4477..37157b2129 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.4.1 + 2.5.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,8 +26,13 @@ An Open Source library for creating and parsing MIME messages. -* Don't use PublicSign on non-Windows NT machines when building. (issue #516) -* Relaxed the Authentication-Results header parser a bit to allow '/' in pvalue tokens. (issue #518) +* Fixed message reserialization after prepending headers. (issue #524) +* Added a ContentType.CharsetEncoding property. (issue #526) +* Allow empty prop-spec token values in Authentication-Results headers. (issue #527) +* Added logic to quote Authentication-Results pvalue tokens if needed. +* Fixed splitting and reassembly of message/partial messages. +* Improved handling of Office365 Authentication-Results headers by adding a Office365AuthenticationServiceIdentifier property to the AuthenticationMethodResult class. +* Fixed mailbox address parser to be more lenient about `"["` and `"]"` characters in the display-name. (issue #532) Xamarin Inc. en-US From 2b08648e1a8b20f42f1a4154442b2caa515973d6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 18 Jan 2020 10:42:37 -0500 Subject: [PATCH 466/741] updated samples --- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 4 ++-- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- samples/MessageReader.iOS/MessageReader.iOS/packages.config | 2 +- samples/MessageReader/MessageReader/MessageReader.csproj | 4 ++-- samples/MessageReader/MessageReader/packages.config | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 084addc0c0..577c0854d3 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.4.1\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.5.0\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index dac39db0b5..475000ca3c 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 1509119b2d..f511d558a9 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.4.1\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.5.0\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.4.1\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.5.0\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 3a58077bf2..7a67e68c60 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 1afdd2209e..5cac0278b4 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.4.1\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.5.0\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.4.1\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.5.0\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 774e131250..56919ab068 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 1e9ad0c61f..8356c4872e 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.4.1\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.5.0\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 51e1428876..7af12a18c8 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + From 89e494a78c344af977c773c80d6e333bba072e8f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 18 Jan 2020 10:54:51 -0500 Subject: [PATCH 467/741] bumped copyright --- MimeKit/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 2b879331c1..d10ccba52c 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -35,7 +35,7 @@ [assembly: AssemblyConfiguration ("")] [assembly: AssemblyCompany ("Xamarin Inc.")] [assembly: AssemblyProduct ("MimeKit")] -[assembly: AssemblyCopyright ("Copyright © 2013-2019 Xamarin Inc. (www.xamarin.com)")] +[assembly: AssemblyCopyright ("Copyright © 2013-2020 Xamarin Inc. (www.xamarin.com)")] [assembly: AssemblyTrademark ("Xamarin Inc.")] [assembly: AssemblyCulture ("")] From 909f6d7f44f8f80c4b5154fda4453919d6fa5b96 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Feb 2020 12:53:23 -0500 Subject: [PATCH 468/741] Added MimeTypes.TryGetExtension() Fixes issue #534 --- MimeKit/MimeTypes.cs | 1511 +++++++++++++++++++++++------------- UnitTests/MimeTypeTests.cs | 27 +- 2 files changed, 974 insertions(+), 564 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index cb25b1bbe7..234e84a164 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -38,572 +38,948 @@ namespace MimeKit { /// public static class MimeTypes { + static readonly Dictionary extensions; static readonly Dictionary mimeTypes; static MimeTypes () { - mimeTypes = new Dictionary (MimeUtils.OrdinalIgnoreCase); - mimeTypes.Add ("323", "text/h323"); - mimeTypes.Add ("3dmf", "x-world/x-3dmf"); - mimeTypes.Add ("3dm", "x-world/x-3dmf"); - mimeTypes.Add ("3g2", "video/3gpp2"); - mimeTypes.Add ("3gp", "video/3gpp"); - mimeTypes.Add ("7z", "application/x-7z-compressed"); - mimeTypes.Add ("aab", "application/x-authorware-bin"); - mimeTypes.Add ("aac", "audio/aac"); - mimeTypes.Add ("aam", "application/x-authorware-map"); - mimeTypes.Add ("aas", "application/x-authorware-seg"); - mimeTypes.Add ("abc", "text/vnd.abc"); - mimeTypes.Add ("acgi", "text/html"); - mimeTypes.Add ("acx", "application/internet-property-stream"); - mimeTypes.Add ("afl", "video/animaflex"); - mimeTypes.Add ("ai", "application/postscript"); - mimeTypes.Add ("aif", "audio/aiff"); - mimeTypes.Add ("aifc", "audio/aiff"); - mimeTypes.Add ("aiff", "audio/aiff"); - mimeTypes.Add ("aim", "application/x-aim"); - mimeTypes.Add ("aip", "text/x-audiosoft-intra"); - mimeTypes.Add ("ani", "application/x-navi-animation"); - mimeTypes.Add ("aos", "application/x-nokia-9000-communicator-add-on-software"); - mimeTypes.Add ("appcache", "text/cache-manifest"); - mimeTypes.Add ("application", "application/x-ms-application"); - mimeTypes.Add ("aps", "application/mime"); - mimeTypes.Add ("art", "image/x-jg"); - mimeTypes.Add ("asf", "video/x-ms-asf"); - mimeTypes.Add ("asm", "text/x-asm"); - mimeTypes.Add ("asp", "text/asp"); - mimeTypes.Add ("asr", "video/x-ms-asf"); - mimeTypes.Add ("asx", "application/x-mplayer2"); - mimeTypes.Add ("atom", "application/atom+xml"); - mimeTypes.Add ("au", "audio/x-au"); - mimeTypes.Add ("avi", "video/avi"); - mimeTypes.Add ("avs", "video/avs-video"); - mimeTypes.Add ("axs", "application/olescript"); - mimeTypes.Add ("bas", "text/plain"); - mimeTypes.Add ("bcpio", "application/x-bcpio"); - mimeTypes.Add ("bin", "application/octet-stream"); - mimeTypes.Add ("bm", "image/bmp"); - mimeTypes.Add ("bmp", "image/bmp"); - mimeTypes.Add ("boo", "application/book"); - mimeTypes.Add ("book", "application/book"); - mimeTypes.Add ("boz", "application/x-bzip2"); - mimeTypes.Add ("bsh", "application/x-bsh"); - mimeTypes.Add ("bz2", "application/x-bzip2"); - mimeTypes.Add ("bz", "application/x-bzip"); - mimeTypes.Add ("cat", "application/vnd.ms-pki.seccat"); - mimeTypes.Add ("ccad", "application/clariscad"); - mimeTypes.Add ("cco", "application/x-cocoa"); - mimeTypes.Add ("cc", "text/plain"); - mimeTypes.Add ("cdf", "application/cdf"); - mimeTypes.Add ("cer", "application/pkix-cert"); - mimeTypes.Add ("cha", "application/x-chat"); - mimeTypes.Add ("chat", "application/x-chat"); - mimeTypes.Add ("class", "application/x-java-applet"); - mimeTypes.Add ("clp", "application/x-msclip"); - mimeTypes.Add ("cmx", "image/x-cmx"); - mimeTypes.Add ("cod", "image/cis-cod"); - mimeTypes.Add ("coffee", "text/x-coffeescript"); - mimeTypes.Add ("conf", "text/plain"); - mimeTypes.Add ("cpio", "application/x-cpio"); - mimeTypes.Add ("cpp", "text/plain"); - mimeTypes.Add ("cpt", "application/x-cpt"); - mimeTypes.Add ("crd", "application/x-mscardfile"); - mimeTypes.Add ("crl", "application/pkix-crl"); - mimeTypes.Add ("crt", "application/pkix-cert"); - mimeTypes.Add ("csh", "application/x-csh"); - mimeTypes.Add ("css", "text/css"); - mimeTypes.Add ("csv", "text/csv"); - mimeTypes.Add ("c", "text/plain"); - mimeTypes.Add ("c++", "text/plain"); - mimeTypes.Add ("cxx", "text/plain"); - mimeTypes.Add ("dart", "application/dart"); - mimeTypes.Add ("dcr", "application/x-director"); - mimeTypes.Add ("deb", "application/x-deb"); - mimeTypes.Add ("deepv", "application/x-deepv"); - mimeTypes.Add ("def", "text/plain"); - mimeTypes.Add ("deploy", "application/octet-stream"); - mimeTypes.Add ("der", "application/x-x509-ca-cert"); - mimeTypes.Add ("dib", "image/bmp"); - mimeTypes.Add ("dif", "video/x-dv"); - mimeTypes.Add ("dir", "application/x-director"); - mimeTypes.Add ("disco", "text/xml"); - mimeTypes.Add ("dll", "application/x-msdownload"); - mimeTypes.Add ("dl", "video/dl"); - mimeTypes.Add ("doc", "application/msword"); - mimeTypes.Add ("docm", "application/vnd.ms-word.document.macroEnabled.12"); - mimeTypes.Add ("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - mimeTypes.Add ("dot", "application/msword"); - mimeTypes.Add ("dotm", "application/vnd.ms-word.template.macroEnabled.12"); - mimeTypes.Add ("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"); - mimeTypes.Add ("dp", "application/commonground"); - mimeTypes.Add ("drw", "application/drafting"); - mimeTypes.Add ("dtd", "application/xml-dtd"); - mimeTypes.Add ("dvi", "application/x-dvi"); - mimeTypes.Add ("dv", "video/x-dv"); - mimeTypes.Add ("dwf", "drawing/x-dwf (old)"); - mimeTypes.Add ("dwg", "application/acad"); - mimeTypes.Add ("dxf", "application/dxf"); - mimeTypes.Add ("dxr", "application/x-director"); - mimeTypes.Add ("el", "text/x-script.elisp"); - mimeTypes.Add ("elc", "application/x-elc"); - mimeTypes.Add ("eml", "message/rfc822"); - mimeTypes.Add ("eot", "application/vnd.bw-fontobject"); - mimeTypes.Add ("eps", "application/postscript"); - mimeTypes.Add ("epub", "application/epub+zip"); - mimeTypes.Add ("es", "application/x-esrehber"); - mimeTypes.Add ("etx", "text/x-setext"); - mimeTypes.Add ("evy", "application/envoy"); - mimeTypes.Add ("exe", "application/octet-stream"); - mimeTypes.Add ("f77", "text/plain"); - mimeTypes.Add ("f90", "text/plain"); - mimeTypes.Add ("fdf", "application/vnd.fdf"); - mimeTypes.Add ("fif", "image/fif"); - mimeTypes.Add ("flac", "audio/x-flac"); - mimeTypes.Add ("fli", "video/fli"); - mimeTypes.Add ("flo", "image/florian"); - mimeTypes.Add ("flr", "x-world/x-vrml"); - mimeTypes.Add ("flx", "text/vnd.fmi.flexstor"); - mimeTypes.Add ("fmf", "video/x-atomic3d-feature"); - mimeTypes.Add ("for", "text/plain"); - mimeTypes.Add ("fpx", "image/vnd.fpx"); - mimeTypes.Add ("frl", "application/freeloader"); - mimeTypes.Add ("f", "text/plain"); - mimeTypes.Add ("funk", "audio/make"); - mimeTypes.Add ("g3", "image/g3fax"); - mimeTypes.Add ("gif", "image/gif"); - mimeTypes.Add ("gl", "video/gl"); - mimeTypes.Add ("gsd", "audio/x-gsm"); - mimeTypes.Add ("gsm", "audio/x-gsm"); - mimeTypes.Add ("gsp", "application/x-gsp"); - mimeTypes.Add ("gss", "application/x-gss"); - mimeTypes.Add ("gtar", "application/x-gtar"); - mimeTypes.Add ("g", "text/plain"); - mimeTypes.Add ("gz", "application/x-gzip"); - mimeTypes.Add ("gzip", "application/x-gzip"); - mimeTypes.Add ("hdf", "application/x-hdf"); - mimeTypes.Add ("help", "application/x-helpfile"); - mimeTypes.Add ("hgl", "application/vnd.hp-HPGL"); - mimeTypes.Add ("hh", "text/plain"); - mimeTypes.Add ("hlb", "text/x-script"); - mimeTypes.Add ("hlp", "application/x-helpfile"); - mimeTypes.Add ("hpg", "application/vnd.hp-HPGL"); - mimeTypes.Add ("hpgl", "application/vnd.hp-HPGL"); - mimeTypes.Add ("hqx", "application/binhex"); - mimeTypes.Add ("hta", "application/hta"); - mimeTypes.Add ("htc", "text/x-component"); - mimeTypes.Add ("h", "text/plain"); - mimeTypes.Add ("htmls", "text/html"); - mimeTypes.Add ("html", "text/html"); - mimeTypes.Add ("htm", "text/html"); - mimeTypes.Add ("htt", "text/webviewhtml"); - mimeTypes.Add ("htx", "text/html"); - mimeTypes.Add ("ice", "x-conference/x-cooltalk"); - mimeTypes.Add ("ico", "image/x-icon"); - mimeTypes.Add ("ics", "text/calendar"); - mimeTypes.Add ("idc", "text/plain"); - mimeTypes.Add ("ief", "image/ief"); - mimeTypes.Add ("iefs", "image/ief"); - mimeTypes.Add ("iges", "application/iges"); - mimeTypes.Add ("igs", "application/iges"); - mimeTypes.Add ("iii", "application/x-iphone"); - mimeTypes.Add ("ima", "application/x-ima"); - mimeTypes.Add ("imap", "application/x-httpd-imap"); - mimeTypes.Add ("inf", "application/inf"); - mimeTypes.Add ("ins", "application/x-internett-signup"); - mimeTypes.Add ("ip", "application/x-ip2"); - mimeTypes.Add ("isp", "application/x-internet-signup"); - mimeTypes.Add ("isu", "video/x-isvideo"); - mimeTypes.Add ("it", "audio/it"); - mimeTypes.Add ("iv", "application/x-inventor"); - mimeTypes.Add ("ivf", "video/x-ivf"); - mimeTypes.Add ("ivr", "i-world/i-vrml"); - mimeTypes.Add ("ivy", "application/x-livescreen"); - mimeTypes.Add ("jam", "audio/x-jam"); - mimeTypes.Add ("jar", "application/java-archive"); - mimeTypes.Add ("java", "text/plain"); - mimeTypes.Add ("jav", "text/plain"); - mimeTypes.Add ("jcm", "application/x-java-commerce"); - mimeTypes.Add ("jfif", "image/jpeg"); - mimeTypes.Add ("jfif-tbnl", "image/jpeg"); - mimeTypes.Add ("jpeg", "image/jpeg"); - mimeTypes.Add ("jpe", "image/jpeg"); - mimeTypes.Add ("jpg", "image/jpeg"); - mimeTypes.Add ("jps", "image/x-jps"); - mimeTypes.Add ("js", "application/javascript"); - mimeTypes.Add ("json", "application/json"); - mimeTypes.Add ("jut", "image/jutvision"); - mimeTypes.Add ("kar", "audio/midi"); - mimeTypes.Add ("ksh", "text/x-script.ksh"); - mimeTypes.Add ("la", "audio/nspaudio"); - mimeTypes.Add ("lam", "audio/x-liveaudio"); - mimeTypes.Add ("latex", "application/x-latex"); - mimeTypes.Add ("list", "text/plain"); - mimeTypes.Add ("lma", "audio/nspaudio"); - mimeTypes.Add ("log", "text/plain"); - mimeTypes.Add ("lsp", "application/x-lisp"); - mimeTypes.Add ("lst", "text/plain"); - mimeTypes.Add ("lsx", "text/x-la-asf"); - mimeTypes.Add ("ltx", "application/x-latex"); - mimeTypes.Add ("m13", "application/x-msmediaview"); - mimeTypes.Add ("m14", "application/x-msmediaview"); - mimeTypes.Add ("m1v", "video/mpeg"); - mimeTypes.Add ("m2a", "audio/mpeg"); - mimeTypes.Add ("m2v", "video/mpeg"); - mimeTypes.Add ("m3u", "audio/x-mpequrl"); - mimeTypes.Add ("m4a", "audio/mp4"); - mimeTypes.Add ("m4v", "video/mp4"); - mimeTypes.Add ("man", "application/x-troff-man"); - mimeTypes.Add ("manifest", "application/x-ms-manifest"); - mimeTypes.Add ("map", "application/x-navimap"); - mimeTypes.Add ("mar", "text/plain"); - mimeTypes.Add ("mbd", "application/mbedlet"); - mimeTypes.Add ("mc$", "application/x-magic-cap-package-1.0"); - mimeTypes.Add ("mcd", "application/mcad"); - mimeTypes.Add ("mcf", "image/vasa"); - mimeTypes.Add ("mcp", "application/netmc"); - mimeTypes.Add ("mdb", "application/x-msaccess"); - mimeTypes.Add ("mesh", "model/mesh"); - mimeTypes.Add ("me", "application/x-troff-me"); - mimeTypes.Add ("mid", "audio/midi"); - mimeTypes.Add ("midi", "audio/midi"); - mimeTypes.Add ("mif", "application/x-mif"); - mimeTypes.Add ("mjf", "audio/x-vnd.AudioExplosion.MjuiceMediaFile"); - mimeTypes.Add ("mjpg", "video/x-motion-jpeg"); - mimeTypes.Add ("mm", "application/base64"); - mimeTypes.Add ("mme", "application/base64"); - mimeTypes.Add ("mny", "application/x-msmoney"); - mimeTypes.Add ("mod", "audio/mod"); - mimeTypes.Add ("mov", "video/quicktime"); - mimeTypes.Add ("movie", "video/x-sgi-movie"); - mimeTypes.Add ("mp2", "video/mpeg"); - mimeTypes.Add ("mp3", "audio/mpeg"); - mimeTypes.Add ("mp4", "video/mp4"); - mimeTypes.Add ("mp4a", "audio/mp4"); - mimeTypes.Add ("mp4v", "video/mp4"); - mimeTypes.Add ("mpa", "audio/mpeg"); - mimeTypes.Add ("mpc", "application/x-project"); - mimeTypes.Add ("mpeg", "video/mpeg"); - mimeTypes.Add ("mpe", "video/mpeg"); - mimeTypes.Add ("mpga", "audio/mpeg"); - mimeTypes.Add ("mpg", "video/mpeg"); - mimeTypes.Add ("mpp", "application/vnd.ms-project"); - mimeTypes.Add ("mpt", "application/x-project"); - mimeTypes.Add ("mpv2", "video/mpeg"); - mimeTypes.Add ("mpv", "application/x-project"); - mimeTypes.Add ("mpx", "application/x-project"); - mimeTypes.Add ("mrc", "application/marc"); - mimeTypes.Add ("ms", "application/x-troff-ms"); - mimeTypes.Add ("msh", "model/mesh"); - mimeTypes.Add ("m", "text/plain"); - mimeTypes.Add ("mvb", "application/x-msmediaview"); - mimeTypes.Add ("mv", "video/x-sgi-movie"); - mimeTypes.Add ("my", "audio/make"); - mimeTypes.Add ("mzz", "application/x-vnd.AudioExplosion.mzz"); - mimeTypes.Add ("nap", "image/naplps"); - mimeTypes.Add ("naplps", "image/naplps"); - mimeTypes.Add ("nc", "application/x-netcdf"); - mimeTypes.Add ("ncm", "application/vnd.nokia.configuration-message"); - mimeTypes.Add ("niff", "image/x-niff"); - mimeTypes.Add ("nif", "image/x-niff"); - mimeTypes.Add ("nix", "application/x-mix-transfer"); - mimeTypes.Add ("nsc", "application/x-conference"); - mimeTypes.Add ("nvd", "application/x-navidoc"); - mimeTypes.Add ("nws", "message/rfc822"); - mimeTypes.Add ("oda", "application/oda"); - mimeTypes.Add ("ods", "application/oleobject"); - mimeTypes.Add ("oga", "audio/ogg"); - mimeTypes.Add ("ogg", "audio/ogg"); - mimeTypes.Add ("ogv", "video/ogg"); - mimeTypes.Add ("ogx", "application/ogg"); - mimeTypes.Add ("omc", "application/x-omc"); - mimeTypes.Add ("omcd", "application/x-omcdatamaker"); - mimeTypes.Add ("omcr", "application/x-omcregerator"); - mimeTypes.Add ("opus", "audio/ogg"); - mimeTypes.Add ("oxps", "application/oxps"); - mimeTypes.Add ("p10", "application/pkcs10"); - mimeTypes.Add ("p12", "application/pkcs-12"); - mimeTypes.Add ("p7a", "application/x-pkcs7-signature"); - mimeTypes.Add ("p7b", "application/x-pkcs7-certificates"); - mimeTypes.Add ("p7c", "application/pkcs7-mime"); - mimeTypes.Add ("p7m", "application/pkcs7-mime"); - mimeTypes.Add ("p7r", "application/x-pkcs7-certreqresp"); - mimeTypes.Add ("p7s", "application/pkcs7-signature"); - mimeTypes.Add ("part", "application/pro_eng"); - mimeTypes.Add ("pas", "text/pascal"); - mimeTypes.Add ("pbm", "image/x-portable-bitmap"); - mimeTypes.Add ("pcl", "application/x-pcl"); - mimeTypes.Add ("pct", "image/x-pict"); - mimeTypes.Add ("pcx", "image/x-pcx"); - mimeTypes.Add ("pdb", "chemical/x-pdb"); - mimeTypes.Add ("pdf", "application/pdf"); - mimeTypes.Add ("pfunk", "audio/make"); - mimeTypes.Add ("pfx", "application/x-pkcs12"); - mimeTypes.Add ("pgm", "image/x-portable-graymap"); - mimeTypes.Add ("pic", "image/pict"); - mimeTypes.Add ("pict", "image/pict"); - mimeTypes.Add ("pkg", "application/x-newton-compatible-pkg"); - mimeTypes.Add ("pko", "application/vnd.ms-pki.pko"); - mimeTypes.Add ("pl", "text/plain"); - mimeTypes.Add ("plx", "application/x-PiXCLscript"); - mimeTypes.Add ("pm4", "application/x-pagemaker"); - mimeTypes.Add ("pm5", "application/x-pagemaker"); - mimeTypes.Add ("pma", "application/x-perfmon"); - mimeTypes.Add ("pmc", "application/x-perfmon"); - mimeTypes.Add ("pm", "image/x-xpixmap"); - mimeTypes.Add ("pml", "application/x-perfmon"); - mimeTypes.Add ("pmr", "application/x-perfmon"); - mimeTypes.Add ("pmw", "application/x-perfmon"); - mimeTypes.Add ("png", "image/png"); - mimeTypes.Add ("pnm", "application/x-portable-anymap"); - mimeTypes.Add ("pot", "application/vnd.ms-powerpoint"); - mimeTypes.Add ("potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"); - mimeTypes.Add ("potx", "application/vnd.openxmlformats-officedocument.presentationml.template"); - mimeTypes.Add ("pov", "model/x-pov"); - mimeTypes.Add ("ppa", "application/vnd.ms-powerpoint"); - mimeTypes.Add ("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"); - mimeTypes.Add ("ppm", "image/x-portable-pixmap"); - mimeTypes.Add ("pps", "application/vnd.ms-powerpoint"); - mimeTypes.Add ("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"); - mimeTypes.Add ("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"); - mimeTypes.Add ("ppt", "application/vnd.ms-powerpoint"); - mimeTypes.Add ("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"); - mimeTypes.Add ("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); - mimeTypes.Add ("ppz", "application/mspowerpoint"); - mimeTypes.Add ("pre", "application/x-freelance"); - mimeTypes.Add ("prf", "application/pics-rules"); - mimeTypes.Add ("prt", "application/pro_eng"); - mimeTypes.Add ("ps", "application/postscript"); - mimeTypes.Add ("p", "text/x-pascal"); - mimeTypes.Add ("pub", "application/x-mspublisher"); - mimeTypes.Add ("pvu", "paleovu/x-pv"); - mimeTypes.Add ("pwz", "application/vnd.ms-powerpoint"); - mimeTypes.Add ("pyc", "applicaiton/x-bytecode.python"); - mimeTypes.Add ("py", "text/x-script.phyton"); - mimeTypes.Add ("qcp", "audio/vnd.qcelp"); - mimeTypes.Add ("qd3d", "x-world/x-3dmf"); - mimeTypes.Add ("qd3", "x-world/x-3dmf"); - mimeTypes.Add ("qif", "image/x-quicktime"); - mimeTypes.Add ("qtc", "video/x-qtc"); - mimeTypes.Add ("qtif", "image/x-quicktime"); - mimeTypes.Add ("qti", "image/x-quicktime"); - mimeTypes.Add ("qt", "video/quicktime"); - mimeTypes.Add ("ra", "audio/x-pn-realaudio"); - mimeTypes.Add ("ram", "audio/x-pn-realaudio"); - mimeTypes.Add ("ras", "application/x-cmu-raster"); - mimeTypes.Add ("rast", "image/cmu-raster"); - mimeTypes.Add ("rexx", "text/x-script.rexx"); - mimeTypes.Add ("rf", "image/vnd.rn-realflash"); - mimeTypes.Add ("rgb", "image/x-rgb"); - mimeTypes.Add ("rm", "application/vnd.rn-realmedia"); - mimeTypes.Add ("rmi", "audio/mid"); - mimeTypes.Add ("rmm", "audio/x-pn-realaudio"); - mimeTypes.Add ("rmp", "audio/x-pn-realaudio"); - mimeTypes.Add ("rng", "application/ringing-tones"); - mimeTypes.Add ("rnx", "application/vnd.rn-realplayer"); - mimeTypes.Add ("roff", "application/x-troff"); - mimeTypes.Add ("rp", "image/vnd.rn-realpix"); - mimeTypes.Add ("rpm", "audio/x-pn-realaudio-plugin"); - mimeTypes.Add ("rss", "application/rss+xml"); - mimeTypes.Add ("rtf", "text/richtext"); - mimeTypes.Add ("rt", "text/richtext"); - mimeTypes.Add ("rtx", "text/richtext"); - mimeTypes.Add ("rv", "video/vnd.rn-realvideo"); - mimeTypes.Add ("s3m", "audio/s3m"); - mimeTypes.Add ("sbk", "application/x-tbook"); - mimeTypes.Add ("scd", "application/x-msschedule"); - mimeTypes.Add ("scm", "application/x-lotusscreencam"); - mimeTypes.Add ("sct", "text/scriptlet"); - mimeTypes.Add ("sdml", "text/plain"); - mimeTypes.Add ("sdp", "application/sdp"); - mimeTypes.Add ("sdr", "application/sounder"); - mimeTypes.Add ("sea", "application/sea"); - mimeTypes.Add ("set", "application/set"); - mimeTypes.Add ("setpay", "application/set-payment-initiation"); - mimeTypes.Add ("setreg", "application/set-registration-initiation"); - mimeTypes.Add ("sgml", "text/sgml"); - mimeTypes.Add ("sgm", "text/sgml"); - mimeTypes.Add ("shar", "application/x-bsh"); - mimeTypes.Add ("sh", "text/x-script.sh"); - mimeTypes.Add ("shtml", "text/html"); - mimeTypes.Add ("sid", "audio/x-psid"); - mimeTypes.Add ("silo", "model/mesh"); - mimeTypes.Add ("sit", "application/x-sit"); - mimeTypes.Add ("skd", "application/x-koan"); - mimeTypes.Add ("skm", "application/x-koan"); - mimeTypes.Add ("skp", "application/x-koan"); - mimeTypes.Add ("skt", "application/x-koan"); - mimeTypes.Add ("sl", "application/x-seelogo"); - mimeTypes.Add ("smi", "application/smil"); - mimeTypes.Add ("smil", "application/smil"); - mimeTypes.Add ("snd", "audio/basic"); - mimeTypes.Add ("sol", "application/solids"); - mimeTypes.Add ("spc", "application/x-pkcs7-certificates"); - mimeTypes.Add ("spl", "application/futuresplash"); - mimeTypes.Add ("spr", "application/x-sprite"); - mimeTypes.Add ("sprite", "application/x-sprite"); - mimeTypes.Add ("spx", "audio/ogg"); - mimeTypes.Add ("src", "application/x-wais-source"); - mimeTypes.Add ("ssi", "text/x-server-parsed-html"); - mimeTypes.Add ("ssm", "application/streamingmedia"); - mimeTypes.Add ("sst", "application/vnd.ms-pki.certstore"); - mimeTypes.Add ("step", "application/step"); - mimeTypes.Add ("s", "text/x-asm"); - mimeTypes.Add ("stl", "application/sla"); - mimeTypes.Add ("stm", "text/html"); - mimeTypes.Add ("stp", "application/step"); - mimeTypes.Add ("sv4cpio", "application/x-sv4cpio"); - mimeTypes.Add ("sv4crc", "application/x-sv4crc"); - mimeTypes.Add ("svf", "image/x-dwg"); - mimeTypes.Add ("svg", "image/svg+xml"); - mimeTypes.Add ("svr", "application/x-world"); - mimeTypes.Add ("swf", "application/x-shockwave-flash"); - mimeTypes.Add ("talk", "text/x-speech"); - mimeTypes.Add ("t", "application/x-troff"); - mimeTypes.Add ("tar", "application/x-tar"); - mimeTypes.Add ("tbk", "application/toolbook"); - mimeTypes.Add ("tcl", "text/x-script.tcl"); - mimeTypes.Add ("tcsh", "text/x-script.tcsh"); - mimeTypes.Add ("tex", "application/x-tex"); - mimeTypes.Add ("texi", "application/x-texinfo"); - mimeTypes.Add ("texinfo", "application/x-texinfo"); - mimeTypes.Add ("text", "text/plain"); - mimeTypes.Add ("tgz", "application/x-compressed"); - mimeTypes.Add ("tiff", "image/tiff"); - mimeTypes.Add ("tif", "image/tiff"); - mimeTypes.Add ("tr", "application/x-troff"); - mimeTypes.Add ("trm", "application/x-msterminal"); - mimeTypes.Add ("ts", "text/x-typescript"); - mimeTypes.Add ("tsi", "audio/tsp-audio"); - mimeTypes.Add ("tsp", "audio/tsplayer"); - mimeTypes.Add ("tsv", "text/tab-separated-values"); - mimeTypes.Add ("ttf", "application/x-font-ttf"); - mimeTypes.Add ("turbot", "image/florian"); - mimeTypes.Add ("txt", "text/plain"); - mimeTypes.Add ("uil", "text/x-uil"); - mimeTypes.Add ("uls", "text/iuls"); - mimeTypes.Add ("unis", "text/uri-list"); - mimeTypes.Add ("uni", "text/uri-list"); - mimeTypes.Add ("unv", "application/i-deas"); - mimeTypes.Add ("uris", "text/uri-list"); - mimeTypes.Add ("uri", "text/uri-list"); - mimeTypes.Add ("ustar", "multipart/x-ustar"); - mimeTypes.Add ("uue", "text/x-uuencode"); - mimeTypes.Add ("uu", "text/x-uuencode"); - mimeTypes.Add ("vcd", "application/x-cdlink"); - mimeTypes.Add ("vcf", "text/vcard"); - mimeTypes.Add ("vcard", "text/vcard"); - mimeTypes.Add ("vcs", "text/x-vCalendar"); - mimeTypes.Add ("vda", "application/vda"); - mimeTypes.Add ("vdo", "video/vdo"); - mimeTypes.Add ("vew", "application/groupwise"); - mimeTypes.Add ("vivo", "video/vivo"); - mimeTypes.Add ("viv", "video/vivo"); - mimeTypes.Add ("vmd", "application/vocaltec-media-desc"); - mimeTypes.Add ("vmf", "application/vocaltec-media-file"); - mimeTypes.Add ("voc", "audio/voc"); - mimeTypes.Add ("vos", "video/vosaic"); - mimeTypes.Add ("vox", "audio/voxware"); - mimeTypes.Add ("vqe", "audio/x-twinvq-plugin"); - mimeTypes.Add ("vqf", "audio/x-twinvq"); - mimeTypes.Add ("vql", "audio/x-twinvq-plugin"); - mimeTypes.Add ("vrml", "application/x-vrml"); - mimeTypes.Add ("vrt", "x-world/x-vrt"); - mimeTypes.Add ("vsd", "application/x-visio"); - mimeTypes.Add ("vst", "application/x-visio"); - mimeTypes.Add ("vsw", "application/x-visio"); - mimeTypes.Add ("w60", "application/wordperfect6.0"); - mimeTypes.Add ("w61", "application/wordperfect6.1"); - mimeTypes.Add ("w6w", "application/msword"); - mimeTypes.Add ("wav", "audio/wav"); - mimeTypes.Add ("wb1", "application/x-qpro"); - mimeTypes.Add ("wbmp", "image/vnd.wap.wbmp"); - mimeTypes.Add ("wcm", "application/vnd.ms-works"); - mimeTypes.Add ("wdb", "application/vnd.ms-works"); - mimeTypes.Add ("web", "application/vnd.xara"); - mimeTypes.Add ("webm", "video/webm"); - mimeTypes.Add ("wiz", "application/msword"); - mimeTypes.Add ("wk1", "application/x-123"); - mimeTypes.Add ("wks", "application/vnd.ms-works"); - mimeTypes.Add ("wmf", "windows/metafile"); - mimeTypes.Add ("wmlc", "application/vnd.wap.wmlc"); - mimeTypes.Add ("wmlsc", "application/vnd.wap.wmlscriptc"); - mimeTypes.Add ("wmls", "text/vnd.wap.wmlscript"); - mimeTypes.Add ("wml", "text/vnd.wap.wml"); - mimeTypes.Add ("wmp", "video/x-ms-wmp"); - mimeTypes.Add ("wmv", "video/x-ms-wmv"); - mimeTypes.Add ("wmx", "video/x-ms-wmx"); - mimeTypes.Add ("woff", "application/x-woff"); - mimeTypes.Add ("word", "application/msword"); - mimeTypes.Add ("wp5", "application/wordperfect"); - mimeTypes.Add ("wp6", "application/wordperfect"); - mimeTypes.Add ("wp", "application/wordperfect"); - mimeTypes.Add ("wpd", "application/wordperfect"); - mimeTypes.Add ("wps", "application/vnd.ms-works"); - mimeTypes.Add ("wq1", "application/x-lotus"); - mimeTypes.Add ("wri", "application/mswrite"); - mimeTypes.Add ("wrl", "application/x-world"); - mimeTypes.Add ("wrz", "model/vrml"); - mimeTypes.Add ("wsc", "text/scriplet"); - mimeTypes.Add ("wsdl", "text/xml"); - mimeTypes.Add ("wsrc", "application/x-wais-source"); - mimeTypes.Add ("wtk", "application/x-wintalk"); - mimeTypes.Add ("wvx", "video/x-ms-wvx"); - mimeTypes.Add ("x3d", "model/x3d+xml"); - mimeTypes.Add ("x3db", "model/x3d+fastinfoset"); - mimeTypes.Add ("x3dv", "model/x3d-vrml"); - mimeTypes.Add ("xaf", "x-world/x-vrml"); - mimeTypes.Add ("xaml", "application/xaml+xml"); - mimeTypes.Add ("xap", "application/x-silverlight-app"); - mimeTypes.Add ("xbap", "application/x-ms-xbap"); - mimeTypes.Add ("xbm", "image/x-xbitmap"); - mimeTypes.Add ("xdr", "video/x-amt-demorun"); - mimeTypes.Add ("xgz", "xgl/drawing"); - mimeTypes.Add ("xht", "application/xhtml+xml"); - mimeTypes.Add ("xhtml", "application/xhtml+xml"); - mimeTypes.Add ("xif", "image/vnd.xiff"); - mimeTypes.Add ("xla", "application/vnd.ms-excel"); - mimeTypes.Add ("xlam", "application/vnd.ms-excel.addin.macroEnabled.12"); - mimeTypes.Add ("xl", "application/excel"); - mimeTypes.Add ("xlb", "application/excel"); - mimeTypes.Add ("xlc", "application/excel"); - mimeTypes.Add ("xld", "application/excel"); - mimeTypes.Add ("xlk", "application/excel"); - mimeTypes.Add ("xll", "application/excel"); - mimeTypes.Add ("xlm", "application/excel"); - mimeTypes.Add ("xls", "application/vnd.ms-excel"); - mimeTypes.Add ("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"); - mimeTypes.Add ("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"); - mimeTypes.Add ("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - mimeTypes.Add ("xlt", "application/vnd.ms-excel"); - mimeTypes.Add ("xltm", "application/vnd.ms-excel.template.macroEnabled.12"); - mimeTypes.Add ("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"); - mimeTypes.Add ("xlv", "application/excel"); - mimeTypes.Add ("xlw", "application/excel"); - mimeTypes.Add ("xm", "audio/xm"); - mimeTypes.Add ("xml", "text/xml"); - mimeTypes.Add ("xmz", "xgl/movie"); - mimeTypes.Add ("xof", "x-world/x-vrml"); - mimeTypes.Add ("xpi", "application/x-xpinstall"); - mimeTypes.Add ("xpix", "application/x-vnd.ls-xpix"); - mimeTypes.Add ("xpm", "image/xpm"); - mimeTypes.Add ("xps", "application/vnd.ms-xpsdocument"); - mimeTypes.Add ("x-png", "image/png"); - mimeTypes.Add ("xsd", "text/xml"); - mimeTypes.Add ("xsl", "text/xml"); - mimeTypes.Add ("xslt", "text/xml"); - mimeTypes.Add ("xsr", "video/x-amt-showrun"); - mimeTypes.Add ("xwd", "image/x-xwd"); - mimeTypes.Add ("xyz", "chemical/x-pdb"); - mimeTypes.Add ("z", "application/x-compressed"); - mimeTypes.Add ("zip", "application/zip"); - mimeTypes.Add ("zsh", "text/x-script.zsh"); + extensions = LoadExtensions (); + mimeTypes = LoadMimeTypes (); + } + + static Dictionary LoadMimeTypes () + { + return new Dictionary (MimeUtils.OrdinalIgnoreCase) { + { "323", "text/h323" }, + { "3g2", "video/3gpp2" }, + { "3gp", "video/3gpp" }, + { "7z", "application/x-7z-compressed" }, + { "aab", "application/x-authorware-bin" }, + { "aac", "audio/aac" }, + { "aam", "application/x-authorware-map" }, + { "aas", "application/x-authorware-seg" }, + { "abc", "text/vnd.abc" }, + { "acgi", "text/html" }, + { "acx", "application/internet-property-stream" }, + { "afl", "video/animaflex" }, + { "ai", "application/postscript" }, + { "aif", "audio/aiff" }, + { "aifc", "audio/aiff" }, + { "aiff", "audio/aiff" }, + { "aim", "application/x-aim" }, + { "aip", "text/x-audiosoft-intra" }, + { "ani", "application/x-navi-animation" }, + { "aos", "application/x-nokia-9000-communicator-add-on-software" }, + { "appcache", "text/cache-manifest" }, + { "application", "application/x-ms-application" }, + { "aps", "application/mime" }, + { "art", "image/x-jg" }, + { "asf", "video/x-ms-asf" }, + { "asm", "text/x-asm" }, + { "asp", "text/asp" }, + { "asr", "video/x-ms-asf" }, + { "asx", "application/x-mplayer2" }, + { "atom", "application/atom+xml" }, + { "au", "audio/x-au" }, + { "avi", "video/avi" }, + { "avs", "video/avs-video" }, + { "axs", "application/olescript" }, + { "bas", "text/plain" }, + { "bcpio", "application/x-bcpio" }, + { "bin", "application/octet-stream" }, + { "bm", "image/bmp" }, + { "bmp", "image/bmp" }, + { "boo", "application/book" }, + { "book", "application/book" }, + { "boz", "application/x-bzip2" }, + { "bsh", "application/x-bsh" }, + { "bz2", "application/x-bzip2" }, + { "bz", "application/x-bzip" }, + { "cat", "application/vnd.ms-pki.seccat" }, + { "ccad", "application/clariscad" }, + { "cco", "application/x-cocoa" }, + { "cc", "text/plain" }, + { "cdf", "application/cdf" }, + { "cer", "application/pkix-cert" }, + { "cha", "application/x-chat" }, + { "chat", "application/x-chat" }, + { "class", "application/x-java-applet" }, + { "clp", "application/x-msclip" }, + { "cmx", "image/x-cmx" }, + { "cod", "image/cis-cod" }, + { "coffee", "text/x-coffeescript" }, + { "conf", "text/plain" }, + { "cpio", "application/x-cpio" }, + { "cpp", "text/plain" }, + { "cpt", "application/x-cpt" }, + { "crd", "application/x-mscardfile" }, + { "crl", "application/pkix-crl" }, + { "crt", "application/pkix-cert" }, + { "csh", "application/x-csh" }, + { "css", "text/css" }, + { "csv", "text/csv" }, + { "cs", "text/plain" }, + { "c", "text/plain" }, + { "c++", "text/plain" }, + { "cxx", "text/plain" }, + { "dart", "application/dart" }, + { "dcr", "application/x-director" }, + { "deb", "application/x-deb" }, + { "deepv", "application/x-deepv" }, + { "def", "text/plain" }, + { "deploy", "application/octet-stream" }, + { "der", "application/x-x509-ca-cert" }, + { "dib", "image/bmp" }, + { "dif", "video/x-dv" }, + { "dir", "application/x-director" }, + { "disco", "text/xml" }, + { "dll", "application/x-msdownload" }, + { "dl", "video/dl" }, + { "doc", "application/msword" }, + { "docm", "application/vnd.ms-word.document.macroEnabled.12" }, + { "docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, + { "dot", "application/msword" }, + { "dotm", "application/vnd.ms-word.template.macroEnabled.12" }, + { "dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, + { "dp", "application/commonground" }, + { "drw", "application/drafting" }, + { "dtd", "application/xml-dtd" }, + { "dvi", "application/x-dvi" }, + { "dv", "video/x-dv" }, + { "dwg", "application/acad" }, + { "dxf", "application/dxf" }, + { "dxr", "application/x-director" }, + { "el", "text/x-script.elisp" }, + { "elc", "application/x-elc" }, + { "eml", "message/rfc822" }, + { "eot", "application/vnd.bw-fontobject" }, + { "eps", "application/postscript" }, + { "epub", "application/epub+zip" }, + { "es", "application/x-esrehber" }, + { "etx", "text/x-setext" }, + { "evy", "application/envoy" }, + { "exe", "application/octet-stream" }, + { "f77", "text/plain" }, + { "f90", "text/plain" }, + { "fdf", "application/vnd.fdf" }, + { "fif", "image/fif" }, + { "flac", "audio/x-flac" }, + { "fli", "video/fli" }, + { "flo", "image/florian" }, + { "flx", "text/vnd.fmi.flexstor" }, + { "fmf", "video/x-atomic3d-feature" }, + { "for", "text/plain" }, + { "fpx", "image/vnd.fpx" }, + { "frl", "application/freeloader" }, + { "fsx", "application/fsharp-script" }, + { "f", "text/plain" }, + { "g3", "image/g3fax" }, + { "gif", "image/gif" }, + { "gl", "video/gl" }, + { "gsd", "audio/x-gsm" }, + { "gsm", "audio/x-gsm" }, + { "gsp", "application/x-gsp" }, + { "gss", "application/x-gss" }, + { "gtar", "application/x-gtar" }, + { "g", "text/plain" }, + { "gz", "application/x-gzip" }, + { "gzip", "application/x-gzip" }, + { "hdf", "application/x-hdf" }, + { "help", "application/x-helpfile" }, + { "hgl", "application/vnd.hp-HPGL" }, + { "hh", "text/plain" }, + { "hlb", "text/x-script" }, + { "hlp", "application/x-helpfile" }, + { "hpg", "application/vnd.hp-HPGL" }, + { "hpgl", "application/vnd.hp-HPGL" }, + { "hqx", "application/binhex" }, + { "hta", "application/hta" }, + { "htc", "text/x-component" }, + { "h", "text/plain" }, + { "htmls", "text/html" }, + { "html", "text/html" }, + { "htm", "text/html" }, + { "htt", "text/webviewhtml" }, + { "htx", "text/html" }, + { "ico", "image/x-icon" }, + { "ics", "text/calendar" }, + { "idc", "text/plain" }, + { "ief", "image/ief" }, + { "iefs", "image/ief" }, + { "iges", "model/iges" }, + { "igs", "model/iges" }, + { "iii", "application/x-iphone" }, + { "ima", "application/x-ima" }, + { "imap", "application/x-httpd-imap" }, + { "inf", "application/inf" }, + { "ins", "application/x-internett-signup" }, + { "ip", "application/x-ip2" }, + { "isp", "application/x-internet-signup" }, + { "isu", "video/x-isvideo" }, + { "it", "audio/it" }, + { "iv", "application/x-inventor" }, + { "ivf", "video/x-ivf" }, + { "ivy", "application/x-livescreen" }, + { "jam", "audio/x-jam" }, + { "jar", "application/java-archive" }, + { "java", "text/plain" }, + { "jav", "text/plain" }, + { "jcm", "application/x-java-commerce" }, + { "jfif", "image/jpeg" }, + { "jfif-tbnl", "image/jpeg" }, + { "jpeg", "image/jpeg" }, + { "jpe", "image/jpeg" }, + { "jpg", "image/jpeg" }, + { "jps", "image/x-jps" }, + { "js", "application/javascript" }, + { "json", "application/json" }, + { "jut", "image/jutvision" }, + { "kar", "audio/midi" }, + { "ksh", "text/x-script.ksh" }, + { "la", "audio/nspaudio" }, + { "lam", "audio/x-liveaudio" }, + { "latex", "application/x-latex" }, + { "list", "text/plain" }, + { "lma", "audio/nspaudio" }, + { "log", "text/plain" }, + { "lsp", "application/x-lisp" }, + { "lst", "text/plain" }, + { "lsx", "text/x-la-asf" }, + { "ltx", "application/x-latex" }, + { "m13", "application/x-msmediaview" }, + { "m14", "application/x-msmediaview" }, + { "m1v", "video/mpeg" }, + { "m2a", "audio/mpeg" }, + { "m2v", "video/mpeg" }, + { "m3u", "audio/x-mpequrl" }, + { "m4a", "audio/mp4" }, + { "m4v", "video/mp4" }, + { "man", "application/x-troff-man" }, + { "manifest", "application/x-ms-manifest" }, + { "map", "application/x-navimap" }, + { "mar", "text/plain" }, + { "markdown", "text/markdown" }, + { "mbd", "application/mbedlet" }, + { "mc$", "application/x-magic-cap-package-1.0" }, + { "mcd", "application/mcad" }, + { "mcf", "image/vasa" }, + { "mcp", "application/netmc" }, + { "md", "text/markdown" }, + { "mdb", "application/x-msaccess" }, + { "mesh", "model/mesh" }, + { "me", "application/x-troff-me" }, + { "mid", "audio/midi" }, + { "midi", "audio/midi" }, + { "mif", "application/x-mif" }, + { "mjf", "audio/x-vnd.AudioExplosion.MjuiceMediaFile" }, + { "mjpg", "video/x-motion-jpeg" }, + { "mm", "application/base64" }, + { "mme", "application/base64" }, + { "mny", "application/x-msmoney" }, + { "mod", "audio/mod" }, + { "mov", "video/quicktime" }, + { "movie", "video/x-sgi-movie" }, + { "mp2", "video/mpeg" }, + { "mp3", "audio/mpeg" }, + { "mp4", "video/mp4" }, + { "mp4a", "audio/mp4" }, + { "mp4v", "video/mp4" }, + { "mpa", "audio/mpeg" }, + { "mpc", "application/x-project" }, + { "mpeg", "video/mpeg" }, + { "mpe", "video/mpeg" }, + { "mpga", "audio/mpeg" }, + { "mpg", "video/mpeg" }, + { "mpp", "application/vnd.ms-project" }, + { "mpt", "application/x-project" }, + { "mpv2", "video/mpeg" }, + { "mpv", "application/x-project" }, + { "mpx", "application/x-project" }, + { "mrc", "application/marc" }, + { "ms", "application/x-troff-ms" }, + { "msh", "model/mesh" }, + { "m", "text/plain" }, + { "mvb", "application/x-msmediaview" }, + { "mv", "video/x-sgi-movie" }, + { "mzz", "application/x-vnd.AudioExplosion.mzz" }, + { "nap", "image/naplps" }, + { "naplps", "image/naplps" }, + { "nc", "application/x-netcdf" }, + { "ncm", "application/vnd.nokia.configuration-message" }, + { "niff", "image/x-niff" }, + { "nif", "image/x-niff" }, + { "nix", "application/x-mix-transfer" }, + { "nsc", "application/x-conference" }, + { "nvd", "application/x-navidoc" }, + { "nws", "message/rfc822" }, + { "oda", "application/oda" }, + { "ods", "application/oleobject" }, + { "oga", "audio/ogg" }, + { "ogg", "audio/ogg" }, + { "ogv", "video/ogg" }, + { "ogx", "application/ogg" }, + { "omc", "application/x-omc" }, + { "omcd", "application/x-omcdatamaker" }, + { "omcr", "application/x-omcregerator" }, + { "opus", "audio/ogg" }, + { "oxps", "application/oxps" }, + { "p10", "application/pkcs10" }, + { "p12", "application/pkcs-12" }, + { "p7a", "application/x-pkcs7-signature" }, + { "p7b", "application/x-pkcs7-certificates" }, + { "p7c", "application/pkcs7-mime" }, + { "p7m", "application/pkcs7-mime" }, + { "p7r", "application/x-pkcs7-certreqresp" }, + { "p7s", "application/pkcs7-signature" }, + { "part", "application/pro_eng" }, + { "pas", "text/pascal" }, + { "pbm", "image/x-portable-bitmap" }, + { "pcl", "application/x-pcl" }, + { "pct", "image/x-pict" }, + { "pcx", "image/x-pcx" }, + { "pdf", "application/pdf" }, + { "pfx", "application/x-pkcs12" }, + { "pgm", "image/x-portable-graymap" }, + { "pic", "image/pict" }, + { "pict", "image/pict" }, + { "pkg", "application/x-newton-compatible-pkg" }, + { "pko", "application/vnd.ms-pki.pko" }, + { "pl", "text/plain" }, + { "plx", "application/x-PiXCLscript" }, + { "pm4", "application/x-pagemaker" }, + { "pm5", "application/x-pagemaker" }, + { "pma", "application/x-perfmon" }, + { "pmc", "application/x-perfmon" }, + { "pm", "image/x-xpixmap" }, + { "pml", "application/x-perfmon" }, + { "pmr", "application/x-perfmon" }, + { "pmw", "application/x-perfmon" }, + { "png", "image/png" }, + { "pnm", "application/x-portable-anymap" }, + { "pot", "application/vnd.ms-powerpoint" }, + { "potm", "application/vnd.ms-powerpoint.template.macroEnabled.12" }, + { "potx", "application/vnd.openxmlformats-officedocument.presentationml.template" }, + { "pov", "model/x-pov" }, + { "ppa", "application/vnd.ms-powerpoint" }, + { "ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12" }, + { "ppm", "image/x-portable-pixmap" }, + { "pps", "application/vnd.ms-powerpoint" }, + { "ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12" }, + { "ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow" }, + { "ppt", "application/vnd.ms-powerpoint" }, + { "pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12" }, + { "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, + { "ppz", "application/mspowerpoint" }, + { "pre", "application/x-freelance" }, + { "prf", "application/pics-rules" }, + { "prt", "application/pro_eng" }, + { "ps", "application/postscript" }, + { "p", "text/x-pascal" }, + { "pub", "application/x-mspublisher" }, + { "pwz", "application/vnd.ms-powerpoint" }, + { "pyc", "application/x-bytecode.python" }, + { "py", "text/x-script.phyton" }, + { "qcp", "audio/vnd.qcelp" }, + { "qif", "image/x-quicktime" }, + { "qtc", "video/x-qtc" }, + { "qtif", "image/x-quicktime" }, + { "qti", "image/x-quicktime" }, + { "qt", "video/quicktime" }, + { "ra", "audio/x-pn-realaudio" }, + { "ram", "audio/x-pn-realaudio" }, + { "ras", "application/x-cmu-raster" }, + { "rast", "image/cmu-raster" }, + { "rexx", "text/x-script.rexx" }, + { "rf", "image/vnd.rn-realflash" }, + { "rgb", "image/x-rgb" }, + { "rm", "application/vnd.rn-realmedia" }, + { "rmi", "audio/mid" }, + { "rmm", "audio/x-pn-realaudio" }, + { "rmp", "audio/x-pn-realaudio" }, + { "rng", "application/ringing-tones" }, + { "rnx", "application/vnd.rn-realplayer" }, + { "roff", "application/x-troff" }, + { "rp", "image/vnd.rn-realpix" }, + { "rpm", "audio/x-pn-realaudio-plugin" }, + { "rss", "application/rss+xml" }, + { "rtf", "text/rtf" }, + { "rt", "text/richtext" }, + { "rtx", "text/richtext" }, + { "rv", "video/vnd.rn-realvideo" }, + { "s3m", "audio/s3m" }, + { "sbk", "application/x-tbook" }, + { "scd", "application/x-msschedule" }, + { "scm", "application/x-lotusscreencam" }, + { "sct", "text/scriptlet" }, + { "sdml", "text/plain" }, + { "sdp", "application/sdp" }, + { "sdr", "application/sounder" }, + { "sea", "application/sea" }, + { "set", "application/set" }, + { "setpay", "application/set-payment-initiation" }, + { "setreg", "application/set-registration-initiation" }, + { "sgml", "text/sgml" }, + { "sgm", "text/sgml" }, + { "shar", "application/x-bsh" }, + { "sh", "text/x-script.sh" }, + { "shtml", "text/html" }, + { "sid", "audio/x-psid" }, + { "silo", "model/mesh" }, + { "sit", "application/x-sit" }, + { "skd", "application/x-koan" }, + { "skm", "application/x-koan" }, + { "skp", "application/x-koan" }, + { "skt", "application/x-koan" }, + { "sl", "application/x-seelogo" }, + { "smi", "application/smil" }, + { "smil", "application/smil" }, + { "snd", "audio/basic" }, + { "sol", "application/solids" }, + { "spc", "application/x-pkcs7-certificates" }, + { "spl", "application/futuresplash" }, + { "spr", "application/x-sprite" }, + { "sprite", "application/x-sprite" }, + { "spx", "audio/ogg" }, + { "src", "application/x-wais-source" }, + { "ssi", "text/x-server-parsed-html" }, + { "ssm", "application/streamingmedia" }, + { "sst", "application/vnd.ms-pki.certstore" }, + { "step", "application/step" }, + { "s", "text/x-asm" }, + { "stl", "application/sla" }, + { "stm", "text/html" }, + { "stp", "application/step" }, + { "sv4cpio", "application/x-sv4cpio" }, + { "sv4crc", "application/x-sv4crc" }, + { "svf", "image/x-dwg" }, + { "svg", "image/svg+xml" }, + { "svr", "application/x-world" }, + { "swf", "application/x-shockwave-flash" }, + { "talk", "text/x-speech" }, + { "t", "application/x-troff" }, + { "tar", "application/x-tar" }, + { "tbk", "application/toolbook" }, + { "tcl", "text/x-script.tcl" }, + { "tcsh", "text/x-script.tcsh" }, + { "tex", "application/x-tex" }, + { "texi", "application/x-texinfo" }, + { "texinfo", "application/x-texinfo" }, + { "text", "text/plain" }, + { "tgz", "application/x-compressed" }, + { "tiff", "image/tiff" }, + { "tif", "image/tiff" }, + { "tr", "application/x-troff" }, + { "trm", "application/x-msterminal" }, + { "ts", "text/x-typescript" }, + { "tsi", "audio/tsp-audio" }, + { "tsp", "audio/tsplayer" }, + { "tsv", "text/tab-separated-values" }, + { "ttf", "application/x-font-ttf" }, + { "turbot", "image/florian" }, + { "txt", "text/plain" }, + { "uil", "text/x-uil" }, + { "uls", "text/iuls" }, + { "unis", "text/uri-list" }, + { "uni", "text/uri-list" }, + { "unv", "application/i-deas" }, + { "uris", "text/uri-list" }, + { "uri", "text/uri-list" }, + { "ustar", "multipart/x-ustar" }, + { "uue", "text/x-uuencode" }, + { "uu", "text/x-uuencode" }, + { "vcd", "application/x-cdlink" }, + { "vcf", "text/vcard" }, + { "vcard", "text/vcard" }, + { "vcs", "text/x-vcalendar" }, + { "vda", "application/vda" }, + { "vdo", "video/vdo" }, + { "vew", "application/groupwise" }, + { "vivo", "video/vnd.vivo" }, + { "viv", "video/vnd.vivo" }, + { "vmd", "application/vocaltec-media-desc" }, + { "vmf", "application/vocaltec-media-file" }, + { "voc", "audio/voc" }, + { "vos", "video/vosaic" }, + { "vox", "audio/voxware" }, + { "vqe", "audio/x-twinvq-plugin" }, + { "vqf", "audio/x-twinvq" }, + { "vql", "audio/x-twinvq-plugin" }, + { "vrml", "application/x-vrml" }, + { "vsd", "application/x-visio" }, + { "vst", "application/x-visio" }, + { "vsw", "application/x-visio" }, + { "w60", "application/wordperfect6.0" }, + { "w61", "application/wordperfect6.1" }, + { "w6w", "application/msword" }, + { "wav", "audio/wav" }, + { "wb1", "application/x-qpro" }, + { "wbmp", "image/vnd.wap.wbmp" }, + { "wcm", "application/vnd.ms-works" }, + { "wdb", "application/vnd.ms-works" }, + { "web", "application/vnd.xara" }, + { "webm", "video/webm" }, + { "wiz", "application/msword" }, + { "wk1", "application/x-123" }, + { "wks", "application/vnd.ms-works" }, + { "wmf", "image/wmf" }, + { "wmlc", "application/vnd.wap.wmlc" }, + { "wmlsc", "application/vnd.wap.wmlscriptc" }, + { "wmls", "text/vnd.wap.wmlscript" }, + { "wml", "text/vnd.wap.wml" }, + { "wmp", "video/x-ms-wmp" }, + { "wmv", "video/x-ms-wmv" }, + { "wmx", "video/x-ms-wmx" }, + { "woff", "application/x-woff" }, + { "word", "application/msword" }, + { "wp5", "application/wordperfect" }, + { "wp6", "application/wordperfect" }, + { "wp", "application/wordperfect" }, + { "wpd", "application/wordperfect" }, + { "wps", "application/vnd.ms-works" }, + { "wq1", "application/x-lotus" }, + { "wri", "application/mswrite" }, + { "wrl", "application/x-world" }, + { "wrz", "model/vrml" }, + { "wsc", "text/scriplet" }, + { "wsdl", "text/xml" }, + { "wsrc", "application/x-wais-source" }, + { "wtk", "application/x-wintalk" }, + { "wvx", "video/x-ms-wvx" }, + { "x3d", "model/x3d+xml" }, + { "x3db", "model/x3d+fastinfoset" }, + { "x3dv", "model/x3d-vrml" }, + { "xaml", "application/xaml+xml" }, + { "xap", "application/x-silverlight-app" }, + { "xbap", "application/x-ms-xbap" }, + { "xbm", "image/x-xbitmap" }, + { "xdr", "video/x-amt-demorun" }, + { "xht", "application/xhtml+xml" }, + { "xhtml", "application/xhtml+xml" }, + { "xif", "image/vnd.xiff" }, + { "xla", "application/vnd.ms-excel" }, + { "xlam", "application/vnd.ms-excel.addin.macroEnabled.12" }, + { "xl", "application/excel" }, + { "xlb", "application/excel" }, + { "xlc", "application/excel" }, + { "xld", "application/excel" }, + { "xlk", "application/excel" }, + { "xll", "application/excel" }, + { "xlm", "application/excel" }, + { "xls", "application/vnd.ms-excel" }, + { "xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12" }, + { "xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12" }, + { "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, + { "xlt", "application/vnd.ms-excel" }, + { "xltm", "application/vnd.ms-excel.template.macroEnabled.12" }, + { "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" }, + { "xlv", "application/excel" }, + { "xlw", "application/excel" }, + { "xm", "audio/xm" }, + { "xml", "text/xml" }, + { "xpi", "application/x-xpinstall" }, + { "xpix", "application/x-vnd.ls-xpix" }, + { "xpm", "image/xpm" }, + { "xps", "application/vnd.ms-xpsdocument" }, + { "x-png", "image/png" }, + { "xsd", "text/xml" }, + { "xsl", "text/xml" }, + { "xslt", "text/xml" }, + { "xsr", "video/x-amt-showrun" }, + { "xwd", "image/x-xwd" }, + { "z", "application/x-compressed" }, + { "zip", "application/zip" }, + { "zsh", "text/x-script.zsh" } + }; + } + + static Dictionary LoadExtensions () + { + return new Dictionary (MimeUtils.OrdinalIgnoreCase) { + { "application/acad", ".dwg" }, + { "application/atom+xml", ".atom" }, + { "application/base64", ".mm" }, + { "application/binhex", ".hqx" }, + { "application/book", ".boo" }, + { "application/cdf", ".cdf" }, + { "application/clariscad", ".ccad" }, + { "application/commonground", ".dp" }, + { "application/dart", ".dart" }, + { "application/drafting", ".drw" }, + { "application/dxf", ".dxf" }, + { "application/envoy", ".evy" }, + { "application/epub+zip", ".epub" }, + { "application/excel", ".xls" }, + { "application/freeloader", ".frl" }, + { "application/fsharp-script", ".fsx" }, + { "application/futuresplash", ".spl" }, + { "application/groupwise", ".vew" }, + { "application/hta", ".hta" }, + { "application/i-deas", ".unv" }, + { "application/inf", ".inf" }, + { "application/internet-property-stream", ".acx" }, + { "application/java-archive", ".jar" }, + { "application/javascript", ".js" }, + { "application/json", ".json" }, + { "application/marc", ".mrc" }, + { "application/mbedlet", ".mbd" }, + { "application/mcad", ".mcd" }, + { "application/mime", ".aps" }, + { "application/mspowerpoint", ".ppz" }, + { "application/msword", ".doc" }, + { "application/mswrite", ".wri" }, + { "application/netmc", ".mcp" }, + { "application/octet-stream", ".bin" }, + { "application/oda", ".oda" }, + { "application/ogg", ".ogx" }, + { "application/oleobject", ".ods" }, + { "application/olescript", ".axs" }, + { "application/oxps", ".oxps" }, + { "application/pdf", ".pdf" }, + { "application/pics-rules", ".prf" }, + { "application/pkcs-12", ".p12" }, + { "application/pkcs10", ".p10" }, + { "application/pkcs7-mime", ".p7m" }, + { "application/pkcs7-signature", ".p7s" }, + { "application/pkix-cert", ".cer" }, + { "application/pkix-crl", ".crl" }, + { "application/postscript", ".ps" }, + { "application/pro_eng", ".part" }, + { "application/ringing-tones", ".rng" }, + { "application/rss+xml", ".rss" }, + { "application/sdp", ".sdp" }, + { "application/sea", ".sea" }, + { "application/set", ".set" }, + { "application/set-payment-initiation", ".setpay" }, + { "application/set-registration-initiation", ".setreg" }, + { "application/sla", ".stl" }, + { "application/smil", ".smi" }, + { "application/solids", ".sol" }, + { "application/sounder", ".sdr" }, + { "application/step", ".step" }, + { "application/streamingmedia", ".ssm" }, + { "application/toolbook", ".tbk" }, + { "application/vda", ".vda" }, + { "application/vnd.bw-fontobject", ".eot" }, + { "application/vnd.fdf", ".fdf" }, + { "application/vnd.hp-HPGL", ".hgl" }, + { "application/vnd.ms-excel", ".xls" }, + { "application/vnd.ms-excel.addin.macroEnabled.12", ".xlam" }, + { "application/vnd.ms-excel.sheet.binary.macroEnabled.12", ".xlsb" }, + { "application/vnd.ms-excel.sheet.macroEnabled.12", ".xlsm" }, + { "application/vnd.ms-excel.template.macroEnabled.12", ".xltm" }, + { "application/vnd.ms-pki.certstore", ".sst" }, + { "application/vnd.ms-pki.pko", ".pko" }, + { "application/vnd.ms-pki.seccat", ".cat" }, + { "application/vnd.ms-powerpoint", ".ppt" }, + { "application/vnd.ms-powerpoint.addin.macroEnabled.12", ".ppam" }, + { "application/vnd.ms-powerpoint.presentation.macroEnabled.12", ".pptm" }, + { "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", ".ppsm" }, + { "application/vnd.ms-powerpoint.template.macroEnabled.12", ".potm" }, + { "application/vnd.ms-project", ".mpp" }, + { "application/vnd.ms-word.document.macroEnabled.12", ".docm" }, + { "application/vnd.ms-word.template.macroEnabled.12", ".dotm" }, + { "application/vnd.ms-works", ".wcm" }, + { "application/vnd.ms-xpsdocument", ".xps" }, + { "application/vnd.nokia.configuration-message", ".ncm" }, + { "application/vnd.openxmlformats-officedocument.presentationml.presentation", ".pptx" }, + { "application/vnd.openxmlformats-officedocument.presentationml.slideshow", ".ppsx" }, + { "application/vnd.openxmlformats-officedocument.presentationml.template", ".potx" }, + { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx" }, + { "application/vnd.openxmlformats-officedocument.spreadsheetml.template", ".xltx" }, + { "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".docx" }, + { "application/vnd.openxmlformats-officedocument.wordprocessingml.template", ".dotx" }, + { "application/vnd.rn-realmedia", ".rm" }, + { "application/vnd.rn-realplayer", ".rnx" }, + { "application/vnd.wap.wmlc", ".wmlc" }, + { "application/vnd.wap.wmlscriptc", ".wmlsc" }, + { "application/vnd.xara", ".web" }, + { "application/vocaltec-media-desc", ".vmd" }, + { "application/vocaltec-media-file", ".vmf" }, + { "application/wordperfect", ".wp5" }, + { "application/wordperfect6.0", ".w60" }, + { "application/wordperfect6.1", ".w61" }, + { "application/x-123", ".wk1" }, + { "application/x-7z-compressed", ".7z" }, + { "application/x-aim", ".aim" }, + { "application/x-authorware-bin", ".aab" }, + { "application/x-authorware-map", ".aam" }, + { "application/x-authorware-seg", ".aas" }, + { "application/x-bcpio", ".bcpio" }, + { "application/x-bsh", ".bsh" }, + { "application/x-bytecode.python", ".pyc" }, + { "application/x-bzip", ".bz" }, + { "application/x-bzip2", ".bz2" }, + { "application/x-cdlink", ".vcd" }, + { "application/x-chat", ".cha" }, + { "application/x-cmu-raster", ".ras" }, + { "application/x-cocoa", ".cco" }, + { "application/x-compressed", ".z" }, + { "application/x-conference", ".nsc" }, + { "application/x-cpio", ".cpio" }, + { "application/x-cpt", ".cpt" }, + { "application/x-csh", ".csh" }, + { "application/x-deb", ".deb" }, + { "application/x-deepv", ".deepv" }, + { "application/x-director", ".dcr" }, + { "application/x-dvi", ".dvi" }, + { "application/x-elc", ".elc" }, + { "application/x-esrehber", ".es" }, + { "application/x-font-ttf", ".ttf" }, + { "application/x-freelance", ".pre" }, + { "application/x-gsp", ".gsp" }, + { "application/x-gss", ".gss" }, + { "application/x-gtar", ".gtar" }, + { "application/x-gzip", ".gz" }, + { "application/x-hdf", ".hdf" }, + { "application/x-helpfile", ".help" }, + { "application/x-httpd-imap", ".imap" }, + { "application/x-ima", ".ima" }, + { "application/x-internet-signup", ".isp" }, + { "application/x-internett-signup", ".ins" }, + { "application/x-inventor", ".iv" }, + { "application/x-ip2", ".ip" }, + { "application/x-iphone", ".iii" }, + { "application/x-java-applet", ".class" }, + { "application/x-java-commerce", ".jcm" }, + { "application/x-koan", ".skd" }, + { "application/x-latex", ".latex" }, + { "application/x-lisp", ".lsp" }, + { "application/x-livescreen", ".ivy" }, + { "application/x-lotus", ".wq1" }, + { "application/x-lotusscreencam", ".scm" }, + { "application/x-magic-cap-package-1.0", ".mc$" }, + { "application/x-mif", ".mif" }, + { "application/x-mix-transfer", ".nix" }, + { "application/x-mplayer2", ".asx" }, + { "application/x-ms-application", ".application" }, + { "application/x-ms-manifest", ".manifest" }, + { "application/x-ms-xbap", ".xbap" }, + { "application/x-msaccess", ".mdb" }, + { "application/x-mscardfile", ".crd" }, + { "application/x-msclip", ".clp" }, + { "application/x-msdownload", ".dll" }, + { "application/x-msmediaview", ".m13" }, + { "application/x-msmoney", ".mny" }, + { "application/x-mspublisher", ".pub" }, + { "application/x-msschedule", ".scd" }, + { "application/x-msterminal", ".trm" }, + { "application/x-navi-animation", ".ani" }, + { "application/x-navidoc", ".nvd" }, + { "application/x-navimap", ".map" }, + { "application/x-netcdf", ".nc" }, + { "application/x-newton-compatible-pkg", ".pkg" }, + { "application/x-nokia-9000-communicator-add-on-software", ".aos" }, + { "application/x-omc", ".omc" }, + { "application/x-omcdatamaker", ".omcd" }, + { "application/x-omcregerator", ".omcr" }, + { "application/x-pagemaker", ".pm4" }, + { "application/x-pcl", ".pcl" }, + { "application/x-perfmon", ".pma" }, + { "application/x-PiXCLscript", ".plx" }, + { "application/x-pkcs12", ".pfx" }, + { "application/x-pkcs7-certificates", ".p7b" }, + { "application/x-pkcs7-certreqresp", ".p7r" }, + { "application/x-pkcs7-signature", ".p7a" }, + { "application/x-portable-anymap", ".pnm" }, + { "application/x-project", ".mpc" }, + { "application/x-qpro", ".wb1" }, + { "application/x-seelogo", ".sl" }, + { "application/x-shockwave-flash", ".swf" }, + { "application/x-silverlight-app", ".xap" }, + { "application/x-sit", ".sit" }, + { "application/x-sprite", ".spr" }, + { "application/x-sv4cpio", ".sv4cpio" }, + { "application/x-sv4crc", ".sv4crc" }, + { "application/x-tar", ".tar" }, + { "application/x-tbook", ".sbk" }, + { "application/x-tex", ".tex" }, + { "application/x-texinfo", ".texi" }, + { "application/x-troff", ".roff" }, + { "application/x-troff-man", ".man" }, + { "application/x-troff-me", ".me" }, + { "application/x-troff-ms", ".ms" }, + { "application/x-visio", ".vsd" }, + { "application/x-vnd.AudioExplosion.mzz", ".mzz" }, + { "application/x-vnd.ls-xpix", ".xpix" }, + { "application/x-vrml", ".vrml" }, + { "application/x-wais-source", ".src" }, + { "application/x-wintalk", ".wtk" }, + { "application/x-woff", ".woff" }, + { "application/x-world", ".svr" }, + { "application/x-x509-ca-cert", ".der" }, + { "application/x-xpinstall", ".xpi" }, + { "application/xaml+xml", ".xaml" }, + { "application/xhtml+xml", ".xhtml" }, + { "application/xml", ".xml" }, + { "application/xml-dtd", ".dtd" }, + { "application/zip", ".zip" }, + { "audio/aac", ".aac" }, + { "audio/aiff", ".aiff" }, + { "audio/basic", ".snd" }, + { "audio/it", ".it" }, + { "audio/mid", ".rmi" }, + { "audio/midi", ".mid" }, + { "audio/mod", ".mod" }, + { "audio/mp4", ".mp4" }, + { "audio/mpeg", ".mp3" }, + { "audio/nspaudio", ".la" }, + { "audio/ogg", ".ogg" }, + { "audio/s3m", ".s3m" }, + { "audio/tsp-audio", ".tsi" }, + { "audio/tsplayer", ".tsp" }, + { "audio/vnd.qcelp", ".qcp" }, + { "audio/voc", ".voc" }, + { "audio/vorbis", ".ogg" }, + { "audio/voxware", ".vox" }, + { "audio/wav", ".wav" }, + { "audio/x-au", ".au" }, + { "audio/x-flac", ".flac" }, + { "audio/x-gsm", ".gsd" }, + { "audio/x-jam", ".jam" }, + { "audio/x-liveaudio", ".lam" }, + { "audio/x-mpequrl", ".m3u" }, + { "audio/x-pn-realaudio", ".ra" }, + { "audio/x-pn-realaudio-plugin", ".rpm" }, + { "audio/x-psid", ".sid" }, + { "audio/x-twinvq", ".vqf" }, + { "audio/x-twinvq-plugin", ".vqe" }, + { "audio/x-vnd.AudioExplosion.MjuiceMediaFile", ".mjf" }, + { "audio/xm", ".xm" }, + { "image/bmp", ".bmp" }, + { "image/cis-cod", ".cod" }, + { "image/cmu-raster", ".rast" }, + { "image/fif", ".fif" }, + { "image/florian", ".flo" }, + { "image/g3fax", ".g3" }, + { "image/gif", ".gif" }, + { "image/ief", ".ief" }, + { "image/jpeg", ".jpg" }, + { "image/jutvision", ".jut" }, + { "image/naplps", ".nap" }, + { "image/pict", ".pic" }, + { "image/png", ".png" }, + { "image/svg+xml", ".svg" }, + { "image/tiff", ".tif" }, + { "image/vasa", ".mcf" }, + { "image/vnd.fpx", ".fpx" }, + { "image/vnd.rn-realflash", ".rf" }, + { "image/vnd.rn-realpix", ".rp" }, + { "image/vnd.wap.wbmp", ".wbmp" }, + { "image/vnd.xiff", ".xif" }, + { "image/wmf", ".wmf" }, + { "image/x-cmx", ".cmx" }, + { "image/x-dwg", ".svf" }, + { "image/x-icon", ".ico" }, + { "image/x-jg", ".art" }, + { "image/x-jps", ".jps" }, + { "image/x-niff", ".niff" }, + { "image/x-pcx", ".pcx" }, + { "image/x-pict", ".pct" }, + { "image/x-png", ".png" }, + { "image/x-portable-bitmap", ".pbm" }, + { "image/x-portable-graymap", ".pgm" }, + { "image/x-portable-pixmap", ".ppm" }, + { "image/x-quicktime", ".qif" }, + { "image/x-rgb", ".rgb" }, + { "image/x-xbitmap", ".xbm" }, + { "image/x-xpixmap", ".pm" }, + { "image/x-xwd", ".xwd" }, + { "image/xpm", ".xpm" }, + { "message/rfc822", ".eml" }, + { "model/iges", ".iges" }, + { "model/mesh", ".mesh" }, + { "model/vrml", ".wrz" }, + { "model/x-pov", ".pov" }, + { "model/x3d+fastinfoset", ".x3db" }, + { "model/x3d+xml", ".x3d" }, + { "model/x3d-vrml", ".x3dv" }, + { "multipart/x-ustar", ".ustar" }, + { "text/asp", ".asp" }, + { "text/cache-manifest", ".appcache" }, + { "text/calendar", ".ics" }, + { "text/css", ".css" }, + { "text/csv", ".csv" }, + { "text/h323", ".323" }, + { "text/html", ".html" }, + { "text/iuls", ".uls" }, + { "text/markdown", ".md" }, + { "text/pascal", ".pas" }, + { "text/plain", ".txt" }, + { "text/richtext", ".rtx" }, + { "text/rtf", ".rtf" }, + { "text/scriplet", ".wsc" }, + { "text/scriptlet", ".sct" }, + { "text/sgml", ".sgml" }, + { "text/tab-separated-values", ".tsv" }, + { "text/uri-list", ".uri" }, + { "text/vcard", ".vcf" }, + { "text/vnd.abc", ".abc" }, + { "text/vnd.fmi.flexstor", ".flx" }, + { "text/vnd.wap.wml", ".wml" }, + { "text/vnd.wap.wmlscript", ".wmls" }, + { "text/webviewhtml", ".htt" }, + { "text/x-asm", ".asm" }, + { "text/x-audiosoft-intra", ".aip" }, + { "text/x-coffeescript", ".coffee" }, + { "text/x-component", ".htc" }, + { "text/x-la-asf", ".lsx" }, + { "text/x-pascal", ".p" }, + { "text/x-script", ".hlb" }, + { "text/x-script.elisp", ".el" }, + { "text/x-script.ksh", ".ksh" }, + { "text/x-script.phyton", ".py" }, + { "text/x-script.rexx", ".rexx" }, + { "text/x-script.sh", ".sh" }, + { "text/x-script.tcl", ".tcl" }, + { "text/x-script.tcsh", ".tcsh" }, + { "text/x-script.zsh", ".zsh" }, + { "text/x-server-parsed-html", ".ssi" }, + { "text/x-setext", ".etx" }, + { "text/x-speech", ".talk" }, + { "text/x-typescript", ".ts" }, + { "text/x-uil", ".uil" }, + { "text/x-uuencode", ".uu" }, + { "text/x-vcalendar", ".vcs" }, + { "text/xml", ".xml" }, + { "video/3gpp", ".3gp" }, + { "video/3gpp2", ".3g2" }, + { "video/animaflex", ".afl" }, + { "video/avi", ".avi" }, + { "video/avs-video", ".avs" }, + { "video/dl", ".dl" }, + { "video/fli", ".fli" }, + { "video/gl", ".gl" }, + { "video/mp4", ".mp4" }, + { "video/mpeg", ".mpg" }, + { "video/ogg", ".ogv" }, + { "video/quicktime", ".mov" }, + { "video/vdo", ".vdo" }, + { "video/vnd.rn-realvideo", ".rv" }, + { "video/vnd.vivo", ".vivo" }, + { "video/vosaic", ".vos" }, + { "video/webm", ".webm" }, + { "video/x-amt-demorun", ".xdr" }, + { "video/x-amt-showrun", ".xsr" }, + { "video/x-atomic3d-feature", ".fmf" }, + { "video/x-dv", ".dif" }, + { "video/x-isvideo", ".isu" }, + { "video/x-ivf", ".ivf" }, + { "video/x-motion-jpeg", ".mjpg" }, + { "video/x-ms-asf", ".asf" }, + { "video/x-ms-wmp", ".wmp" }, + { "video/x-ms-wmv", ".wmv" }, + { "video/x-ms-wmx", ".wmx" }, + { "video/x-ms-wvx", ".wvx" }, + { "video/x-qtc", ".qtc" }, + { "video/x-sgi-movie", ".movie" } + }; } /// - /// Gets the MIME-type of the file. + /// Get the MIME-type of a file. /// /// - /// Gets the MIME-type of the file based on the file extension. + /// Gets the MIME-type of a file based on the file extension. /// /// The MIME-type. /// The file name. @@ -621,10 +997,27 @@ public static string GetMimeType (string fileName) if (dot != -1 && fileName.Length > dot + 1) mimeTypes.TryGetValue (fileName.Substring (dot + 1), out mimeType); + return mimeType ?? "application/octet-stream"; + } + + /// + /// Get the standard file extension for a MIME-type. + /// + /// + /// Gets the standard file extension for a MIME-type. + /// + /// true if the extension is known for the specified MIME-type; otherwise, false. + /// The MIME-type. + /// The file name extension for the specified MIME-type. + /// + /// is null. + /// + public static bool TryGetExtension (string mimeType, out string extension) + { if (mimeType == null) - mimeType = "application/octet-stream"; + throw new ArgumentNullException (nameof (mimeType)); - return mimeType; + return extensions.TryGetValue (mimeType, out extension); } } } diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 33edcca9ca..81b98a908c 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -35,33 +35,50 @@ namespace UnitTests { public class MimeTypeTests { [Test] - public void TestNullFileName () + public void TestGetMimeTypeNullFileName () { Assert.Throws (() => MimeTypes.GetMimeType (null)); } [Test] - public void TestNoFileExtension () + public void TestGetMimeTypeNoFileExtension () { Assert.AreEqual ("application/octet-stream", MimeTypes.GetMimeType ("filename")); } [Test] - public void TestFileNameDot () + public void TestGetMimeTypeFileNameDot () { Assert.AreEqual ("application/octet-stream", MimeTypes.GetMimeType ("filename.")); } [Test] - public void TestFileExtensionTxt () + public void TestGetMimeTypeFileExtensionTxt () { Assert.AreEqual ("text/plain", MimeTypes.GetMimeType ("filename.txt")); } [Test] - public void TestFileExtensionCsv () + public void TestGetMimeTypeFileExtensionCsv () { Assert.AreEqual ("text/csv", MimeTypes.GetMimeType ("filename.csv")); } + + [Test] + public void TestTryGetExtensionTextPlain () + { + string extension; + + Assert.IsTrue (MimeTypes.TryGetExtension ("text/plain", out extension)); + Assert.AreEqual (".txt", extension); + } + + [Test] + public void TestTryGetExtensionUnknownMimeType () + { + string extension; + + Assert.IsFalse (MimeTypes.TryGetExtension ("application/x-vnd.fake-mime-type", out extension)); + } } } From e62ce161297e0f4474c4d0e4bac911765cbd844f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Feb 2020 13:11:43 -0500 Subject: [PATCH 469/741] Added support for the font/* media type in MimeTypes --- MimeKit/MimeTypes.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index 234e84a164..1a5c7ac5d6 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -322,6 +322,7 @@ static Dictionary LoadMimeTypes () { "omcd", "application/x-omcdatamaker" }, { "omcr", "application/x-omcregerator" }, { "opus", "audio/ogg" }, + { "otf", "font/otf" }, { "oxps", "application/oxps" }, { "p10", "application/pkcs10" }, { "p12", "application/pkcs-12" }, @@ -474,7 +475,8 @@ static Dictionary LoadMimeTypes () { "tsi", "audio/tsp-audio" }, { "tsp", "audio/tsplayer" }, { "tsv", "text/tab-separated-values" }, - { "ttf", "application/x-font-ttf" }, + { "ttc", "font/collection" }, + { "ttf", "font/ttf" }, { "turbot", "image/florian" }, { "txt", "text/plain" }, { "uil", "text/x-uil" }, @@ -529,7 +531,8 @@ static Dictionary LoadMimeTypes () { "wmp", "video/x-ms-wmp" }, { "wmv", "video/x-ms-wmv" }, { "wmx", "video/x-ms-wmx" }, - { "woff", "application/x-woff" }, + { "woff", "font/woff" }, + { "woff2", "font/woff2" }, { "word", "application/msword" }, { "wp5", "application/wordperfect" }, { "wp6", "application/wordperfect" }, @@ -845,6 +848,12 @@ static Dictionary LoadExtensions () { "audio/x-twinvq-plugin", ".vqe" }, { "audio/x-vnd.AudioExplosion.MjuiceMediaFile", ".mjf" }, { "audio/xm", ".xm" }, + { "font/collection", ".ttc" }, + { "font/otf", ".otf" }, + { "font/sfnt", ".ttf" }, + { "font/ttf", ".ttf" }, + { "font/woff", ".woff" }, + { "font/woff2", ".woff2" }, { "image/bmp", ".bmp" }, { "image/cis-cod", ".cod" }, { "image/cmu-raster", ".rast" }, From 4598f67b7ef97db3a67fcbbd518e75ca6275344c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Feb 2020 13:16:22 -0500 Subject: [PATCH 470/741] Get rid of image/florian which is not an official mime-type --- MimeKit/MimeTypes.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index 1a5c7ac5d6..b871d6ef71 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -165,7 +165,6 @@ static Dictionary LoadMimeTypes () { "fif", "image/fif" }, { "flac", "audio/x-flac" }, { "fli", "video/fli" }, - { "flo", "image/florian" }, { "flx", "text/vnd.fmi.flexstor" }, { "fmf", "video/x-atomic3d-feature" }, { "for", "text/plain" }, @@ -477,7 +476,6 @@ static Dictionary LoadMimeTypes () { "tsv", "text/tab-separated-values" }, { "ttc", "font/collection" }, { "ttf", "font/ttf" }, - { "turbot", "image/florian" }, { "txt", "text/plain" }, { "uil", "text/x-uil" }, { "uls", "text/iuls" }, @@ -858,7 +856,6 @@ static Dictionary LoadExtensions () { "image/cis-cod", ".cod" }, { "image/cmu-raster", ".rast" }, { "image/fif", ".fif" }, - { "image/florian", ".flo" }, { "image/g3fax", ".g3" }, { "image/gif", ".gif" }, { "image/ief", ".ief" }, From 77a38d631a8891cf788e6ac90b095854a7c44029 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 1 Feb 2020 13:34:29 -0500 Subject: [PATCH 471/741] Added .chm mapping to MimeTypes --- MimeKit/MimeTypes.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index b871d6ef71..c09a667ad8 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -103,6 +103,7 @@ static Dictionary LoadMimeTypes () { "cer", "application/pkix-cert" }, { "cha", "application/x-chat" }, { "chat", "application/x-chat" }, + { "chm", "application/vnd.ms-htmlhelp" }, { "class", "application/x-java-applet" }, { "clp", "application/x-msclip" }, { "cmx", "image/x-cmx" }, @@ -171,7 +172,6 @@ static Dictionary LoadMimeTypes () { "fpx", "image/vnd.fpx" }, { "frl", "application/freeloader" }, { "fsx", "application/fsharp-script" }, - { "f", "text/plain" }, { "g3", "image/g3fax" }, { "gif", "image/gif" }, { "gl", "video/gl" }, @@ -668,6 +668,7 @@ static Dictionary LoadExtensions () { "application/vnd.ms-excel.sheet.binary.macroEnabled.12", ".xlsb" }, { "application/vnd.ms-excel.sheet.macroEnabled.12", ".xlsm" }, { "application/vnd.ms-excel.template.macroEnabled.12", ".xltm" }, + { "application/vnd.ms-htmlhelp", ".chm" }, { "application/vnd.ms-pki.certstore", ".sst" }, { "application/vnd.ms-pki.pko", ".pko" }, { "application/vnd.ms-pki.seccat", ".cat" }, From 00199770f0ade37b0837363e9dbe8d7168e1d68e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Feb 2020 10:40:44 -0500 Subject: [PATCH 472/741] Added more webm MimeType mappings and fixed the typescript mapping --- MimeKit/MimeTypes.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index c09a667ad8..ed7139b5a4 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -470,7 +470,7 @@ static Dictionary LoadMimeTypes () { "tif", "image/tiff" }, { "tr", "application/x-troff" }, { "trm", "application/x-msterminal" }, - { "ts", "text/x-typescript" }, + { "ts", "application/typescript" }, { "tsi", "audio/tsp-audio" }, { "tsp", "audio/tsplayer" }, { "tsv", "text/tab-separated-values" }, @@ -517,7 +517,9 @@ static Dictionary LoadMimeTypes () { "wcm", "application/vnd.ms-works" }, { "wdb", "application/vnd.ms-works" }, { "web", "application/vnd.xara" }, + { "weba", "audio/webm" }, { "webm", "video/webm" }, + { "webp", "image/webm" }, { "wiz", "application/msword" }, { "wk1", "application/x-123" }, { "wks", "application/vnd.ms-works" }, @@ -659,6 +661,7 @@ static Dictionary LoadExtensions () { "application/step", ".step" }, { "application/streamingmedia", ".ssm" }, { "application/toolbook", ".tbk" }, + { "application/typescript", ".ts" }, { "application/vda", ".vda" }, { "application/vnd.bw-fontobject", ".eot" }, { "application/vnd.fdf", ".fdf" }, @@ -834,6 +837,7 @@ static Dictionary LoadExtensions () { "audio/vorbis", ".ogg" }, { "audio/voxware", ".vox" }, { "audio/wav", ".wav" }, + { "audio/webm", ".weba" }, { "audio/x-au", ".au" }, { "audio/x-flac", ".flac" }, { "audio/x-gsm", ".gsd" }, @@ -873,6 +877,7 @@ static Dictionary LoadExtensions () { "image/vnd.rn-realpix", ".rp" }, { "image/vnd.wap.wbmp", ".wbmp" }, { "image/vnd.xiff", ".xif" }, + { "image/webm", ".webp" }, { "image/wmf", ".wmf" }, { "image/x-cmx", ".cmx" }, { "image/x-dwg", ".svf" }, @@ -943,7 +948,6 @@ static Dictionary LoadExtensions () { "text/x-server-parsed-html", ".ssi" }, { "text/x-setext", ".etx" }, { "text/x-speech", ".talk" }, - { "text/x-typescript", ".ts" }, { "text/x-uil", ".uil" }, { "text/x-uuencode", ".uu" }, { "text/x-vcalendar", ".vcs" }, From bee18f5aa087c61d3396ae529a7ba8ea7f461e87 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 2 Feb 2020 10:43:38 -0500 Subject: [PATCH 473/741] Fixed the image/webp mapping --- MimeKit/MimeTypes.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index ed7139b5a4..dd180cd468 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -519,7 +519,7 @@ static Dictionary LoadMimeTypes () { "web", "application/vnd.xara" }, { "weba", "audio/webm" }, { "webm", "video/webm" }, - { "webp", "image/webm" }, + { "webp", "image/webp" }, { "wiz", "application/msword" }, { "wk1", "application/x-123" }, { "wks", "application/vnd.ms-works" }, @@ -877,7 +877,7 @@ static Dictionary LoadExtensions () { "image/vnd.rn-realpix", ".rp" }, { "image/vnd.wap.wbmp", ".wbmp" }, { "image/vnd.xiff", ".xif" }, - { "image/webm", ".webp" }, + { "image/webp", ".webp" }, { "image/wmf", ".wmf" }, { "image/x-cmx", ".cmx" }, { "image/x-dwg", ".svf" }, From ed1073db646e2fc27b31d029f2393e6d81982dfd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 8 Feb 2020 10:24:09 -0500 Subject: [PATCH 474/741] minor code cleanup --- MimeKit/MimeParser.cs | 8 +++----- MimeKit/Multipart.cs | 8 ++++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index e84fc071d9..e06e9d5148 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -740,7 +740,6 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check if (IsBlank (*inptr)) { blank = true; } else if (blank || IsControl (*inptr)) { - char c = (char) *inptr; valid = false; break; } @@ -749,7 +748,7 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check } if (inptr == inend) { - // we don't have enough input data + // we don't have enough input data; restore state back to the beginning of the line left = (int) (inend - start); inputIndex = (int) (start - inbuf); needInput = true; @@ -878,7 +877,7 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) ResetRawHeaderData (); headers.Clear (); - ReadAhead (Math.Max (ReadAheadSize, left), 0, cancellationToken); + ReadAhead (ReadAheadSize, 0, cancellationToken); do { if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) @@ -1558,9 +1557,8 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); + contentEnd = 0; if (format == MimeFormat.Mbox && options.RespectContentLength) { - contentEnd = 0; - for (int i = 0; i < headers.Count; i++) { if (headers[i].Id != HeaderId.ContentLength) continue; diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 30b02f614f..350755f75f 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -472,7 +472,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = cancellable.Write (options.NewLineBytes, 0, options.NewLineBytes.Length, cancellationToken); } else { for (int i = 0; i < children.Count; i++) { - var msg = children[i] as MessagePart; + var rfc822 = children[i] as MessagePart; var multi = children[i] as Multipart; var part = children[i] as MimePart; @@ -481,9 +481,9 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); children[i].WriteTo (options, stream, false, cancellationToken); - if (msg != null && msg.Message != null && msg.Message.Body != null) { - multi = msg.Message.Body as Multipart; - part = msg.Message.Body as MimePart; + if (rfc822 != null && rfc822.Message != null && rfc822.Message.Body != null) { + multi = rfc822.Message.Body as Multipart; + part = rfc822.Message.Body as MimePart; } if ((part != null && part.Content == null) || From 587053c60669c97eb8cebd3d554d1f6d542e1a6e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 12 Feb 2020 08:57:42 -0500 Subject: [PATCH 475/741] Fixed ParseUtils.SkipPhraseAtom() to work as expected Fixes issue #536 --- MimeKit/Utils/ByteExtensions.cs | 4 ++-- UnitTests/MailboxAddressTests.cs | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/MimeKit/Utils/ByteExtensions.cs b/MimeKit/Utils/ByteExtensions.cs index bb3ecbd75f..ca34061ed2 100644 --- a/MimeKit/Utils/ByteExtensions.cs +++ b/MimeKit/Utils/ByteExtensions.cs @@ -118,9 +118,9 @@ static ByteExtensions () table[i] |= CharType.IsAscii; } else { if (i == 127) - table[i] |= CharType.IsAscii | CharType.IsPhraseAtom; + table[i] |= CharType.IsAscii; else - table[i] |= CharType.IsAtom; + table[i] |= CharType.IsAtom | CharType.IsPhraseAtom; table[i] |= CharType.IsControl; } diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index a14f6806ee..5b3141da25 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -712,7 +712,7 @@ public void TestParseMailboxWithAddrspecAsUnquotedName () } [Test] - public void TestParseLatin1EncodedAddrspec () + public void TestParseMailboxWithLatin1EncodedAddrspec () { const string text = "Name <æøå@example.com>"; var buffer = CharsetUtils.Latin1.GetBytes (text); @@ -766,5 +766,21 @@ public void TestParseMailboxWithSquareBracketsInDisplayName () AssertParseFailure (text, false, 0, 0, RfcComplianceMode.Strict); } + + [Test] + public void TestParseAddrspecWithUnicodeLocalPart () + { + const string text = "test.täst@test.net"; + + AssertParse (text); + } + + [Test] + public void TestParseAddrspecWitheroWidthSpace () + { + const string text = "\u200Btest@test.co.uk"; + + AssertParse (text); + } } } From 25827ec52ac73e0a57bfe621afc2814bc26c6667 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 15 Feb 2020 12:07:07 -0500 Subject: [PATCH 476/741] bumped version to 2.5.1 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 9 +++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 17 ++++------------- nuget/MimeKitLite.nuspec | 12 ++++-------- .../DkimVerifier/DkimVerifier.csproj | 4 ++-- .../DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/packages.config | 2 +- .../MessageReader/MessageReader.csproj | 4 ++-- .../MessageReader/MessageReader/packages.config | 2 +- 16 files changed, 37 insertions(+), 41 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 67e373dea1..b74847e8ba 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.5.0 + 2.5.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 2454d79fc4..f08b6d5391 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.5.0 + 2.5.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index d10ccba52c..153bf2e7fb 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.5.0.0")] -[assembly: AssemblyFileVersion ("2.5.0.0")] +[assembly: AssemblyInformationalVersion ("2.5.1.0")] +[assembly: AssemblyFileVersion ("2.5.1.0")] [assembly: AssemblyVersion ("2.5.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 3ea597fc36..d1ab318ade 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,14 @@ # Release Notes +### MimeKit 2.5.1 (2020-02-15) + +* Fixed parsing of email addresses containing unicode or other types of 8-bit text. + (issue [#536](https://github.com/jstedfast/MimeKit/issues/536)) +* Added a MimeTypes.TryGetExtension() method to try and get a file name extension + based on a mime-type. + (issue [#534](https://github.com/jstedfast/MimeKit/issues/534)) +* Updated mime-type mappings. + ### MimeKit 2.5.0 (2020-01-18) * Fixed message reserialization after prepending headers. diff --git a/appveyor.yml b/appveyor.yml index 9f024505ce..a1cda2758e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.5.0.{build} +version: 2.5.1.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 23d90a78a8..3eed681b3c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.5.0$(Rev:.r) +name: 2.5.1$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 7db94a0125..33f7854785 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.5.0 + 2.5.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,18 +26,9 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed message reserialization after prepending headers. (issue #524) -* Added a ContentType.CharsetEncoding property. (issue #526) -* Allow empty prop-spec token values in Authentication-Results headers. (issue #527) -* Added logic to quote Authentication-Results pvalue tokens if needed. -* Added support for converting RSACng keys into BouncyCastle keys for net4x versions that support it. -* Added support for RSAES-OAEP for the BouncyCastle backend. (issue #528) -* Updated and changed the API for RSASSA-PSS. CmsSigner now has a RsaSignaturePadding property which obsoletes the previous RsaSignaturePaddingScheme property. -* Added more columns to the default SQLite database CERTIFICATES table that allow more optimal SQL searches for certificates given various matching criteria. -* Fixed WindowsSecureMimeContext.Decrypt() to make sure it doesn't stop at the first failed recipient. (issue #530) -* Fixed splitting and reassembly of message/partial messages. -* Improved handling of Office365 Authentication-Results headers by adding a Office365AuthenticationServiceIdentifier property to the AuthenticationMethodResult class. -* Fixed mailbox address parser to be more lenient about `"["` and `"]"` characters in the display-name. (issue #532) +* Fixed parsing of email addresses containing unicode or other types of 8-bit text. (issue #536) +* Added a MimeTypes.TryGetExtension() method to try and get a file name extension based on a mime-type. (issue #534) +* Updated mime-type mappings. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 37157b2129..5ea6da6a25 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.5.0 + 2.5.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,13 +26,9 @@ An Open Source library for creating and parsing MIME messages. -* Fixed message reserialization after prepending headers. (issue #524) -* Added a ContentType.CharsetEncoding property. (issue #526) -* Allow empty prop-spec token values in Authentication-Results headers. (issue #527) -* Added logic to quote Authentication-Results pvalue tokens if needed. -* Fixed splitting and reassembly of message/partial messages. -* Improved handling of Office365 Authentication-Results headers by adding a Office365AuthenticationServiceIdentifier property to the AuthenticationMethodResult class. -* Fixed mailbox address parser to be more lenient about `"["` and `"]"` characters in the display-name. (issue #532) +* Fixed parsing of email addresses containing unicode or other types of 8-bit text. (issue #536) +* Added a MimeTypes.TryGetExtension() method to try and get a file name extension based on a mime-type. (issue #534) +* Updated mime-type mappings. Xamarin Inc. en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 577c0854d3..006191fff6 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.0\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.5.1\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 475000ca3c..32d9a1e72d 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index f511d558a9..c70f289e13 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.5.0\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.5.1\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.5.0\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.5.1\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 7a67e68c60..bf2cc26ae1 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 5cac0278b4..4939b2a0a0 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.5.0\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.5.1\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.5.0\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.5.1\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 56919ab068..58e476313b 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 8356c4872e..baf789e9ae 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.0\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.5.1\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 7af12a18c8..eeee69a309 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + From bfe4b2620a976d9b8b1c07577bb17c3fc7dc718f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 27 Feb 2020 08:49:39 -0500 Subject: [PATCH 477/741] Make sure to read all TNEF property values in the loop. Partial fix for issue #538 --- MimeKit/Tnef/TnefPart.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 2f9d7a3534..c33074d4a3 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -106,6 +106,12 @@ static void ExtractRecipientTable (TnefReader reader, MimeMessage message) // (since the SmtpAddress is meant to be used in the RCPT TO command). addr = prop.ReadValueAsString (); break; + case TnefPropertyId.Rowid: + prop.ReadValueAsInt32 (); + break; + default: + prop.ReadValue (); + break; } } From 76c6c2b3a3c0832eca4280f21cdadf493a4f24f8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 28 Feb 2020 17:56:58 -0500 Subject: [PATCH 478/741] Synced up with HtmlKit to get fix for issue #539 --- MimeKit/Text/HtmlEntityDecoder.cs | 25 +- MimeKit/Text/HtmlEntityDecoder.g.cs | 21930 ++++++++++++--------- MimeKit/Text/HtmlToken.cs | 24 +- MimeKit/Text/HtmlTokenizer.cs | 22 +- MimeKit/Text/HtmlUtils.cs | 19 +- UnitTests/Text/HtmlEntityDecoderTests.cs | 68 +- UnitTests/UnitTests.csproj | 2 +- UnitTests/packages.config | 2 +- 8 files changed, 12167 insertions(+), 9925 deletions(-) diff --git a/MimeKit/Text/HtmlEntityDecoder.cs b/MimeKit/Text/HtmlEntityDecoder.cs index 2a4471bc71..9d5075ad24 100644 --- a/MimeKit/Text/HtmlEntityDecoder.cs +++ b/MimeKit/Text/HtmlEntityDecoder.cs @@ -37,6 +37,7 @@ public partial class HtmlEntityDecoder { readonly char[] pushed; readonly int[] states; + bool semicolon; bool numeric; byte digits; byte xbase; @@ -122,6 +123,9 @@ bool PushNumericEntity (char c) /// public bool Push (char c) { + if (semicolon) + return false; + if (index == 0) { if (c != '&') throw new ArgumentOutOfRangeException (nameof (c), "The first character that is pushed MUST be the '&' character."); @@ -135,9 +139,6 @@ public bool Push (char c) if (index + 1 > MaxEntityLength) return false; - if (c == ';') - return false; - if (index == 1 && c == '#') { pushed[index] = '#'; states[index] = 0; @@ -146,12 +147,25 @@ public bool Push (char c) return true; } - return numeric ? PushNumericEntity (c) : PushNamedEntity (c); + semicolon = c == ';'; + + if (numeric) { + if (c == ';') { + states[index] = states[index - 1]; + pushed[index] = ';'; + index++; + return true; + } + + return PushNumericEntity (c); + } + + return PushNamedEntity (c); } string GetNumericEntityValue () { - if (digits == 0) + if (digits == 0 || !semicolon) return new string (pushed, 0, index); int state = states[index - 1]; @@ -234,6 +248,7 @@ internal string GetPushedInput () /// public void Reset () { + semicolon = false; numeric = false; digits = 0; xbase = 0; diff --git a/MimeKit/Text/HtmlEntityDecoder.g.cs b/MimeKit/Text/HtmlEntityDecoder.g.cs index f3921115ff..98ddcb9db2 100644 --- a/MimeKit/Text/HtmlEntityDecoder.g.cs +++ b/MimeKit/Text/HtmlEntityDecoder.g.cs @@ -28,7 +28,7 @@ namespace MimeKit.Text { public partial class HtmlEntityDecoder { - const int MaxEntityLength = 32; + const int MaxEntityLength = 33; bool PushNamedEntity (char c) { @@ -37,8029 +37,10159 @@ bool PushNamedEntity (char c) switch (c) { case '1': switch (state) { - case 436: state = 437; break; // &blk -> &blk1 - case 1791: state = 1792; break; // &emsp -> &emsp1 - case 2085: state = 2086; break; // &frac -> &frac1 - case 6500: state = 6501; break; // &sup -> ¹ + case 566: state = 567; break; // &blk -> &blk1 + case 2280: state = 2282; break; // &emsp -> &emsp1 + case 2649: state = 2650; break; // &frac -> &frac1 + case 8284: state = 8286; break; // &sup -> ¹ default: return false; } break; case '2': switch (state) { - case 437: state = 438; break; // &blk1 -> &blk12 - case 2085: state = 2093; break; // &frac -> &frac2 - case 2086: state = 2087; break; // &frac1 -> ½ - case 6500: state = 6502; break; // &sup -> ² + case 567: state = 568; break; // &blk1 -> &blk12 + case 2649: state = 2663; break; // &frac -> &frac2 + case 2650: state = 2651; break; // &frac1 -> ½ + case 8284: state = 8288; break; // &sup -> ² default: return false; } break; case '3': switch (state) { - case 436: state = 440; break; // &blk -> &blk3 - case 1792: state = 1793; break; // &emsp1 -> &emsp13 - case 2085: state = 2096; break; // &frac -> &frac3 - case 2086: state = 2088; break; // &frac1 -> &frac13 - case 2093: state = 2094; break; // &frac2 -> &frac23 - case 6500: state = 6503; break; // &sup -> ³ + case 566: state = 572; break; // &blk -> &blk3 + case 2282: state = 2283; break; // &emsp1 -> &emsp13 + case 2649: state = 2668; break; // &frac -> &frac3 + case 2650: state = 2653; break; // &frac1 -> &frac13 + case 2663: state = 2664; break; // &frac2 -> &frac23 + case 8284: state = 8290; break; // &sup -> ³ default: return false; } break; case '4': switch (state) { - case 437: state = 439; break; // &blk1 -> &blk14 - case 440: state = 441; break; // &blk3 -> &blk34 - case 1792: state = 1794; break; // &emsp1 -> &emsp14 - case 2085: state = 2100; break; // &frac -> &frac4 - case 2086: state = 2089; break; // &frac1 -> ¼ - case 2096: state = 2097; break; // &frac3 -> ¾ - case 6632: state = 6633; break; // &there -> &there4 + case 567: state = 570; break; // &blk1 -> &blk14 + case 572: state = 573; break; // &blk3 -> &blk34 + case 2282: state = 2285; break; // &emsp1 -> &emsp14 + case 2649: state = 2675; break; // &frac -> &frac4 + case 2650: state = 2655; break; // &frac1 -> ¼ + case 2668: state = 2669; break; // &frac3 -> ¾ + case 8464: state = 8465; break; // &there -> &there4 default: return false; } break; case '5': switch (state) { - case 2085: state = 2102; break; // &frac -> &frac5 - case 2086: state = 2090; break; // &frac1 -> &frac15 - case 2093: state = 2095; break; // &frac2 -> &frac25 - case 2096: state = 2098; break; // &frac3 -> &frac35 - case 2100: state = 2101; break; // &frac4 -> &frac45 + case 2649: state = 2678; break; // &frac -> &frac5 + case 2650: state = 2657; break; // &frac1 -> &frac15 + case 2663: state = 2666; break; // &frac2 -> &frac25 + case 2668: state = 2671; break; // &frac3 -> &frac35 + case 2675: state = 2676; break; // &frac4 -> &frac45 default: return false; } break; case '6': switch (state) { - case 2086: state = 2091; break; // &frac1 -> &frac16 - case 2102: state = 2103; break; // &frac5 -> &frac56 + case 2650: state = 2659; break; // &frac1 -> &frac16 + case 2678: state = 2679; break; // &frac5 -> &frac56 default: return false; } break; case '7': switch (state) { - case 2085: state = 2105; break; // &frac -> &frac7 + case 2649: state = 2683; break; // &frac -> &frac7 default: return false; } break; case '8': switch (state) { - case 2086: state = 2092; break; // &frac1 -> &frac18 - case 2096: state = 2099; break; // &frac3 -> &frac38 - case 2102: state = 2104; break; // &frac5 -> &frac58 - case 2105: state = 2106; break; // &frac7 -> &frac78 + case 2650: state = 2661; break; // &frac1 -> &frac18 + case 2668: state = 2673; break; // &frac3 -> &frac38 + case 2678: state = 2681; break; // &frac5 -> &frac58 + case 2683: state = 2684; break; // &frac7 -> &frac78 + default: return false; + } + break; + case ';': + switch (state) { + case 6: state = 7; break; // Á -> Á + case 13: state = 14; break; // á -> á + case 19: state = 20; break; // &Abreve -> Ă + case 25: state = 26; break; // &abreve -> ă + case 27: state = 28; break; // &ac -> ∾ + case 29: state = 30; break; // &acd -> ∿ + case 31: state = 32; break; // &acE -> ∾̳ + case 36: state = 37; break; //  ->  + case 40: state = 41; break; // â -> â + case 44: state = 45; break; // ´ -> ´ + case 46: state = 47; break; // &Acy -> А + case 48: state = 49; break; // &acy -> а + case 53: state = 54; break; // Æ -> Æ + case 58: state = 59; break; // æ -> æ + case 60: state = 61; break; // &af -> ⁡ + case 63: state = 64; break; // &Afr -> 𝔄 + case 65: state = 66; break; // &afr -> 𝔞 + case 71: state = 72; break; // À -> À + case 77: state = 78; break; // à -> à + case 84: state = 85; break; // &alefsym -> ℵ + case 87: state = 88; break; // &aleph -> ℵ + case 92: state = 93; break; // &Alpha -> Α + case 96: state = 97; break; // &alpha -> α + case 101: state = 102; break; // &Amacr -> Ā + case 106: state = 107; break; // &amacr -> ā + case 109: state = 110; break; // &amalg -> ⨿ + case 112: state = 113; break; // & -> & + case 114: state = 115; break; // & -> & + case 117: state = 118; break; // &And -> ⩓ + case 120: state = 121; break; // &and -> ∧ + case 124: state = 125; break; // &andand -> ⩕ + case 126: state = 127; break; // &andd -> ⩜ + case 132: state = 133; break; // &andslope -> ⩘ + case 134: state = 135; break; // &andv -> ⩚ + case 136: state = 137; break; // &ang -> ∠ + case 138: state = 139; break; // &ange -> ⦤ + case 141: state = 142; break; // &angle -> ∠ + case 145: state = 146; break; // &angmsd -> ∡ + case 148: state = 149; break; // &angmsdaa -> ⦨ + case 150: state = 151; break; // &angmsdab -> ⦩ + case 152: state = 153; break; // &angmsdac -> ⦪ + case 154: state = 155; break; // &angmsdad -> ⦫ + case 156: state = 157; break; // &angmsdae -> ⦬ + case 158: state = 159; break; // &angmsdaf -> ⦭ + case 160: state = 161; break; // &angmsdag -> ⦮ + case 162: state = 163; break; // &angmsdah -> ⦯ + case 165: state = 166; break; // &angrt -> ∟ + case 168: state = 169; break; // &angrtvb -> ⊾ + case 170: state = 171; break; // &angrtvbd -> ⦝ + case 174: state = 175; break; // &angsph -> ∢ + case 176: state = 177; break; // &angst -> Å + case 181: state = 182; break; // &angzarr -> ⍼ + case 186: state = 187; break; // &Aogon -> Ą + case 191: state = 192; break; // &aogon -> ą + case 194: state = 195; break; // &Aopf -> 𝔸 + case 197: state = 198; break; // &aopf -> 𝕒 + case 199: state = 200; break; // &ap -> ≈ + case 204: state = 205; break; // &apacir -> ⩯ + case 206: state = 207; break; // &apE -> ⩰ + case 208: state = 209; break; // &ape -> ≊ + case 211: state = 212; break; // &apid -> ≋ + case 214: state = 215; break; // &apos -> ' + case 227: state = 228; break; // &ApplyFunction -> ⁡ + case 232: state = 233; break; // &approx -> ≈ + case 235: state = 236; break; // &approxeq -> ≊ + case 240: state = 241; break; // Å -> Å + case 245: state = 246; break; // å -> å + case 249: state = 250; break; // &Ascr -> 𝒜 + case 253: state = 254; break; // &ascr -> 𝒶 + case 258: state = 259; break; // &Assign -> ≔ + case 260: state = 261; break; // &ast -> * + case 264: state = 265; break; // &asymp -> ≈ + case 267: state = 268; break; // &asympeq -> ≍ + case 273: state = 274; break; // à -> à + case 279: state = 280; break; // ã -> ã + case 283: state = 284; break; // Ä -> Ä + case 287: state = 288; break; // ä -> ä + case 295: state = 296; break; // &awconint -> ∳ + case 299: state = 300; break; // &awint -> ⨑ + case 308: state = 309; break; // &backcong -> ≌ + case 316: state = 317; break; // &backepsilon -> ϶ + case 322: state = 323; break; // &backprime -> ‵ + case 326: state = 327; break; // &backsim -> ∽ + case 329: state = 330; break; // &backsimeq -> ⋍ + case 339: state = 340; break; // &Backslash -> ∖ + case 342: state = 343; break; // &Barv -> ⫧ + case 347: state = 348; break; // &barvee -> ⊽ + case 351: state = 352; break; // &Barwed -> ⌆ + case 355: state = 356; break; // &barwed -> ⌅ + case 358: state = 359; break; // &barwedge -> ⌅ + case 362: state = 363; break; // &bbrk -> ⎵ + case 367: state = 368; break; // &bbrktbrk -> ⎶ + case 372: state = 373; break; // &bcong -> ≌ + case 375: state = 376; break; // &Bcy -> Б + case 377: state = 378; break; // &bcy -> б + case 382: state = 383; break; // &bdquo -> „ + case 388: state = 389; break; // &becaus -> ∵ + case 395: state = 396; break; // &Because -> ∵ + case 397: state = 398; break; // &because -> ∵ + case 403: state = 404; break; // &bemptyv -> ⦰ + case 407: state = 408; break; // &bepsi -> ϶ + case 412: state = 413; break; // &bernou -> ℬ + case 421: state = 422; break; // &Bernoullis -> ℬ + case 424: state = 425; break; // &Beta -> Β + case 427: state = 428; break; // &beta -> β + case 429: state = 430; break; // &beth -> ℶ + case 434: state = 435; break; // &between -> ≬ + case 437: state = 438; break; // &Bfr -> 𝔅 + case 440: state = 441; break; // &bfr -> 𝔟 + case 446: state = 447; break; // &bigcap -> ⋂ + case 450: state = 451; break; // &bigcirc -> ◯ + case 453: state = 454; break; // &bigcup -> ⋃ + case 458: state = 459; break; // &bigodot -> ⨀ + case 463: state = 464; break; // &bigoplus -> ⨁ + case 469: state = 470; break; // &bigotimes -> ⨂ + case 475: state = 476; break; // &bigsqcup -> ⨆ + case 479: state = 480; break; // &bigstar -> ★ + case 492: state = 493; break; // &bigtriangledown -> ▽ + case 495: state = 496; break; // &bigtriangleup -> △ + case 501: state = 502; break; // &biguplus -> ⨄ + case 505: state = 506; break; // &bigvee -> ⋁ + case 511: state = 512; break; // &bigwedge -> ⋀ + case 517: state = 518; break; // &bkarow -> ⤍ + case 529: state = 530; break; // &blacklozenge -> ⧫ + case 536: state = 537; break; // &blacksquare -> ▪ + case 545: state = 546; break; // &blacktriangle -> ▴ + case 550: state = 551; break; // &blacktriangledown -> ▾ + case 555: state = 556; break; // &blacktriangleleft -> ◂ + case 561: state = 562; break; // &blacktriangleright -> ▸ + case 564: state = 565; break; // &blank -> ␣ + case 568: state = 569; break; // &blk12 -> ▒ + case 570: state = 571; break; // &blk14 -> ░ + case 573: state = 574; break; // &blk34 -> ▓ + case 577: state = 578; break; // &block -> █ + case 580: state = 581; break; // &bne -> =⃥ + case 585: state = 586; break; // &bnequiv -> ≡⃥ + case 589: state = 590; break; // &bNot -> ⫭ + case 592: state = 593; break; // &bnot -> ⌐ + case 596: state = 597; break; // &Bopf -> 𝔹 + case 600: state = 601; break; // &bopf -> 𝕓 + case 602: state = 603; break; // &bot -> ⊥ + case 606: state = 607; break; // &bottom -> ⊥ + case 611: state = 612; break; // &bowtie -> ⋈ + case 616: state = 617; break; // &boxbox -> ⧉ + case 619: state = 620; break; // &boxDL -> ╗ + case 621: state = 622; break; // &boxDl -> ╖ + case 624: state = 625; break; // &boxdL -> ╕ + case 626: state = 627; break; // &boxdl -> ┐ + case 628: state = 629; break; // &boxDR -> ╔ + case 630: state = 631; break; // &boxDr -> ╓ + case 632: state = 633; break; // &boxdR -> ╒ + case 634: state = 635; break; // &boxdr -> ┌ + case 636: state = 637; break; // &boxH -> ═ + case 638: state = 639; break; // &boxh -> ─ + case 640: state = 641; break; // &boxHD -> ╦ + case 642: state = 643; break; // &boxHd -> ╤ + case 644: state = 645; break; // &boxhD -> ╥ + case 646: state = 647; break; // &boxhd -> ┬ + case 648: state = 649; break; // &boxHU -> ╩ + case 650: state = 651; break; // &boxHu -> ╧ + case 652: state = 653; break; // &boxhU -> ╨ + case 654: state = 655; break; // &boxhu -> ┴ + case 660: state = 661; break; // &boxminus -> ⊟ + case 665: state = 666; break; // &boxplus -> ⊞ + case 671: state = 672; break; // &boxtimes -> ⊠ + case 674: state = 675; break; // &boxUL -> ╝ + case 676: state = 677; break; // &boxUl -> ╜ + case 679: state = 680; break; // &boxuL -> ╛ + case 681: state = 682; break; // &boxul -> ┘ + case 683: state = 684; break; // &boxUR -> ╚ + case 685: state = 686; break; // &boxUr -> ╙ + case 687: state = 688; break; // &boxuR -> ╘ + case 689: state = 690; break; // &boxur -> └ + case 691: state = 692; break; // &boxV -> ║ + case 693: state = 694; break; // &boxv -> │ + case 695: state = 696; break; // &boxVH -> ╬ + case 697: state = 698; break; // &boxVh -> ╫ + case 699: state = 700; break; // &boxvH -> ╪ + case 701: state = 702; break; // &boxvh -> ┼ + case 703: state = 704; break; // &boxVL -> ╣ + case 705: state = 706; break; // &boxVl -> ╢ + case 707: state = 708; break; // &boxvL -> ╡ + case 709: state = 710; break; // &boxvl -> ┤ + case 711: state = 712; break; // &boxVR -> ╠ + case 713: state = 714; break; // &boxVr -> ╟ + case 715: state = 716; break; // &boxvR -> ╞ + case 717: state = 718; break; // &boxvr -> ├ + case 723: state = 724; break; // &bprime -> ‵ + case 728: state = 729; break; // &Breve -> ˘ + case 733: state = 734; break; // &breve -> ˘ + case 738: state = 739; break; // ¦ -> ¦ + case 742: state = 743; break; // &Bscr -> ℬ + case 746: state = 747; break; // &bscr -> 𝒷 + case 750: state = 751; break; // &bsemi -> ⁏ + case 753: state = 754; break; // &bsim -> ∽ + case 755: state = 756; break; // &bsime -> ⋍ + case 758: state = 759; break; // &bsol -> \ + case 760: state = 761; break; // &bsolb -> ⧅ + case 765: state = 766; break; // &bsolhsub -> ⟈ + case 769: state = 770; break; // &bull -> • + case 772: state = 773; break; // &bullet -> • + case 775: state = 776; break; // &bump -> ≎ + case 777: state = 778; break; // &bumpE -> ⪮ + case 779: state = 780; break; // &bumpe -> ≏ + case 785: state = 786; break; // &Bumpeq -> ≎ + case 787: state = 788; break; // &bumpeq -> ≏ + case 794: state = 795; break; // &Cacute -> Ć + case 801: state = 802; break; // &cacute -> ć + case 803: state = 804; break; // &Cap -> ⋒ + case 805: state = 806; break; // &cap -> ∩ + case 809: state = 810; break; // &capand -> ⩄ + case 815: state = 816; break; // &capbrcup -> ⩉ + case 819: state = 820; break; // &capcap -> ⩋ + case 822: state = 823; break; // &capcup -> ⩇ + case 826: state = 827; break; // &capdot -> ⩀ + case 844: state = 845; break; // &CapitalDifferentialD -> ⅅ + case 846: state = 847; break; // &caps -> ∩︀ + case 850: state = 851; break; // &caret -> ⁁ + case 853: state = 854; break; // &caron -> ˇ + case 859: state = 860; break; // &Cayleys -> ℭ + case 864: state = 865; break; // &ccaps -> ⩍ + case 870: state = 871; break; // &Ccaron -> Č + case 874: state = 875; break; // &ccaron -> č + case 879: state = 880; break; // Ç -> Ç + case 884: state = 885; break; // ç -> ç + case 888: state = 889; break; // &Ccirc -> Ĉ + case 892: state = 893; break; // &ccirc -> ĉ + case 898: state = 899; break; // &Cconint -> ∰ + case 902: state = 903; break; // &ccups -> ⩌ + case 905: state = 906; break; // &ccupssm -> ⩐ + case 909: state = 910; break; // &Cdot -> Ċ + case 913: state = 914; break; // &cdot -> ċ + case 918: state = 919; break; // ¸ -> ¸ + case 925: state = 926; break; // &Cedilla -> ¸ + case 931: state = 932; break; // &cemptyv -> ⦲ + case 934: state = 935; break; // ¢ -> ¢ + case 942: state = 943; break; // &CenterDot -> · + case 948: state = 949; break; // ¢erdot -> · + case 951: state = 952; break; // &Cfr -> ℭ + case 954: state = 955; break; // &cfr -> 𝔠 + case 958: state = 959; break; // &CHcy -> Ч + case 962: state = 963; break; // &chcy -> ч + case 966: state = 967; break; // &check -> ✓ + case 971: state = 972; break; // &checkmark -> ✓ + case 974: state = 975; break; // &Chi -> Χ + case 976: state = 977; break; // &chi -> χ + case 979: state = 980; break; // &cir -> ○ + case 981: state = 982; break; // &circ -> ˆ + case 984: state = 985; break; // &circeq -> ≗ + case 996: state = 997; break; // &circlearrowleft -> ↺ + case 1002: state = 1003; break; // &circlearrowright -> ↻ + case 1007: state = 1008; break; // &circledast -> ⊛ + case 1012: state = 1013; break; // &circledcirc -> ⊚ + case 1017: state = 1018; break; // &circleddash -> ⊝ + case 1026: state = 1027; break; // &CircleDot -> ⊙ + case 1028: state = 1029; break; // &circledR -> ® + case 1030: state = 1031; break; // &circledS -> Ⓢ + case 1036: state = 1037; break; // &CircleMinus -> ⊖ + case 1041: state = 1042; break; // &CirclePlus -> ⊕ + case 1047: state = 1048; break; // &CircleTimes -> ⊗ + case 1049: state = 1050; break; // &cirE -> ⧃ + case 1051: state = 1052; break; // &cire -> ≗ + case 1057: state = 1058; break; // &cirfnint -> ⨐ + case 1061: state = 1062; break; // &cirmid -> ⫯ + case 1066: state = 1067; break; // &cirscir -> ⧂ + case 1090: state = 1091; break; // &ClockwiseContourIntegral -> ∲ + case 1109: state = 1110; break; // &CloseCurlyDoubleQuote -> ” + case 1115: state = 1116; break; // &CloseCurlyQuote -> ’ + case 1120: state = 1121; break; // &clubs -> ♣ + case 1124: state = 1125; break; // &clubsuit -> ♣ + case 1129: state = 1130; break; // &Colon -> ∷ + case 1134: state = 1135; break; // &colon -> : + case 1136: state = 1137; break; // &Colone -> ⩴ + case 1138: state = 1139; break; // &colone -> ≔ + case 1140: state = 1141; break; // &coloneq -> ≔ + case 1144: state = 1145; break; // &comma -> , + case 1146: state = 1147; break; // &commat -> @ + case 1148: state = 1149; break; // &comp -> ∁ + case 1151: state = 1152; break; // &compfn -> ∘ + case 1158: state = 1159; break; // &complement -> ∁ + case 1162: state = 1163; break; // &complexes -> ℂ + case 1165: state = 1166; break; // &cong -> ≅ + case 1169: state = 1170; break; // &congdot -> ⩭ + case 1177: state = 1178; break; // &Congruent -> ≡ + case 1181: state = 1182; break; // &Conint -> ∯ + case 1185: state = 1186; break; // &conint -> ∮ + case 1198: state = 1199; break; // &ContourIntegral -> ∮ + case 1201: state = 1202; break; // &Copf -> ℂ + case 1204: state = 1205; break; // &copf -> 𝕔 + case 1208: state = 1209; break; // &coprod -> ∐ + case 1215: state = 1216; break; // &Coproduct -> ∐ + case 1219: state = 1220; break; // © -> © + case 1221: state = 1222; break; // © -> © + case 1224: state = 1225; break; // ©sr -> ℗ + case 1254: state = 1255; break; // &CounterClockwiseContourIntegral -> ∳ + case 1259: state = 1260; break; // &crarr -> ↵ + case 1264: state = 1265; break; // &Cross -> ⨯ + case 1268: state = 1269; break; // &cross -> ✗ + case 1272: state = 1273; break; // &Cscr -> 𝒞 + case 1276: state = 1277; break; // &cscr -> 𝒸 + case 1279: state = 1280; break; // &csub -> ⫏ + case 1281: state = 1282; break; // &csube -> ⫑ + case 1283: state = 1284; break; // &csup -> ⫐ + case 1285: state = 1286; break; // &csupe -> ⫒ + case 1290: state = 1291; break; // &ctdot -> ⋯ + case 1297: state = 1298; break; // &cudarrl -> ⤸ + case 1299: state = 1300; break; // &cudarrr -> ⤵ + case 1303: state = 1304; break; // &cuepr -> ⋞ + case 1306: state = 1307; break; // &cuesc -> ⋟ + case 1311: state = 1312; break; // &cularr -> ↶ + case 1313: state = 1314; break; // &cularrp -> ⤽ + case 1316: state = 1317; break; // &Cup -> ⋓ + case 1318: state = 1319; break; // &cup -> ∪ + case 1324: state = 1325; break; // &cupbrcap -> ⩈ + case 1328: state = 1329; break; // &CupCap -> ≍ + case 1332: state = 1333; break; // &cupcap -> ⩆ + case 1335: state = 1336; break; // &cupcup -> ⩊ + case 1339: state = 1340; break; // &cupdot -> ⊍ + case 1342: state = 1343; break; // &cupor -> ⩅ + case 1344: state = 1345; break; // &cups -> ∪︀ + case 1349: state = 1350; break; // &curarr -> ↷ + case 1351: state = 1352; break; // &curarrm -> ⤼ + case 1360: state = 1361; break; // &curlyeqprec -> ⋞ + case 1365: state = 1366; break; // &curlyeqsucc -> ⋟ + case 1369: state = 1370; break; // &curlyvee -> ⋎ + case 1375: state = 1376; break; // &curlywedge -> ⋏ + case 1379: state = 1380; break; // ¤ -> ¤ + case 1391: state = 1392; break; // &curvearrowleft -> ↶ + case 1397: state = 1398; break; // &curvearrowright -> ↷ + case 1401: state = 1402; break; // &cuvee -> ⋎ + case 1405: state = 1406; break; // &cuwed -> ⋏ + case 1413: state = 1414; break; // &cwconint -> ∲ + case 1417: state = 1418; break; // &cwint -> ∱ + case 1423: state = 1424; break; // &cylcty -> ⌭ + case 1430: state = 1431; break; // &Dagger -> ‡ + case 1437: state = 1438; break; // &dagger -> † + case 1442: state = 1443; break; // &daleth -> ℸ + case 1445: state = 1446; break; // &Darr -> ↡ + case 1449: state = 1450; break; // &dArr -> ⇓ + case 1452: state = 1453; break; // &darr -> ↓ + case 1455: state = 1456; break; // &dash -> ‐ + case 1459: state = 1460; break; // &Dashv -> ⫤ + case 1461: state = 1462; break; // &dashv -> ⊣ + case 1468: state = 1469; break; // &dbkarow -> ⤏ + case 1472: state = 1473; break; // &dblac -> ˝ + case 1478: state = 1479; break; // &Dcaron -> Ď + case 1484: state = 1485; break; // &dcaron -> ď + case 1486: state = 1487; break; // &Dcy -> Д + case 1488: state = 1489; break; // &dcy -> д + case 1490: state = 1491; break; // &DD -> ⅅ + case 1492: state = 1493; break; // &dd -> ⅆ + case 1498: state = 1499; break; // &ddagger -> ‡ + case 1501: state = 1502; break; // &ddarr -> ⇊ + case 1508: state = 1509; break; // &DDotrahd -> ⤑ + case 1514: state = 1515; break; // &ddotseq -> ⩷ + case 1517: state = 1518; break; // ° -> ° + case 1520: state = 1521; break; // &Del -> ∇ + case 1523: state = 1524; break; // &Delta -> Δ + case 1527: state = 1528; break; // &delta -> δ + case 1533: state = 1534; break; // &demptyv -> ⦱ + case 1539: state = 1540; break; // &dfisht -> ⥿ + case 1542: state = 1543; break; // &Dfr -> 𝔇 + case 1544: state = 1545; break; // &dfr -> 𝔡 + case 1548: state = 1549; break; // &dHar -> ⥥ + case 1553: state = 1554; break; // &dharl -> ⇃ + case 1555: state = 1556; break; // &dharr -> ⇂ + case 1571: state = 1572; break; // &DiacriticalAcute -> ´ + case 1575: state = 1576; break; // &DiacriticalDot -> ˙ + case 1585: state = 1586; break; // &DiacriticalDoubleAcute -> ˝ + case 1591: state = 1592; break; // &DiacriticalGrave -> ` + case 1597: state = 1598; break; // &DiacriticalTilde -> ˜ + case 1601: state = 1602; break; // &diam -> ⋄ + case 1606: state = 1607; break; // &Diamond -> ⋄ + case 1610: state = 1611; break; // &diamond -> ⋄ + case 1615: state = 1616; break; // &diamondsuit -> ♦ + case 1617: state = 1618; break; // &diams -> ♦ + case 1619: state = 1620; break; // &die -> ¨ + case 1631: state = 1632; break; // &DifferentialD -> ⅆ + case 1637: state = 1638; break; // &digamma -> ϝ + case 1641: state = 1642; break; // &disin -> ⋲ + case 1643: state = 1644; break; // &div -> ÷ + case 1647: state = 1648; break; // ÷ -> ÷ + case 1655: state = 1656; break; // ÷ontimes -> ⋇ + case 1659: state = 1660; break; // &divonx -> ⋇ + case 1663: state = 1664; break; // &DJcy -> Ђ + case 1667: state = 1668; break; // &djcy -> ђ + case 1673: state = 1674; break; // &dlcorn -> ⌞ + case 1677: state = 1678; break; // &dlcrop -> ⌍ + case 1683: state = 1684; break; // &dollar -> $ + case 1687: state = 1688; break; // &Dopf -> 𝔻 + case 1690: state = 1691; break; // &dopf -> 𝕕 + case 1692: state = 1693; break; // &Dot -> ¨ + case 1694: state = 1695; break; // &dot -> ˙ + case 1698: state = 1699; break; // &DotDot -> ⃜ + case 1701: state = 1702; break; // &doteq -> ≐ + case 1705: state = 1706; break; // &doteqdot -> ≑ + case 1711: state = 1712; break; // &DotEqual -> ≐ + case 1717: state = 1718; break; // &dotminus -> ∸ + case 1722: state = 1723; break; // &dotplus -> ∔ + case 1729: state = 1730; break; // &dotsquare -> ⊡ + case 1742: state = 1743; break; // &doublebarwedge -> ⌆ + case 1762: state = 1763; break; // &DoubleContourIntegral -> ∯ + case 1766: state = 1767; break; // &DoubleDot -> ¨ + case 1774: state = 1775; break; // &DoubleDownArrow -> ⇓ + case 1784: state = 1785; break; // &DoubleLeftArrow -> ⇐ + case 1795: state = 1796; break; // &DoubleLeftRightArrow -> ⇔ + case 1799: state = 1800; break; // &DoubleLeftTee -> ⫤ + case 1812: state = 1813; break; // &DoubleLongLeftArrow -> ⟸ + case 1823: state = 1824; break; // &DoubleLongLeftRightArrow -> ⟺ + case 1834: state = 1835; break; // &DoubleLongRightArrow -> ⟹ + case 1845: state = 1846; break; // &DoubleRightArrow -> ⇒ + case 1849: state = 1850; break; // &DoubleRightTee -> ⊨ + case 1857: state = 1858; break; // &DoubleUpArrow -> ⇑ + case 1867: state = 1868; break; // &DoubleUpDownArrow -> ⇕ + case 1879: state = 1880; break; // &DoubleVerticalBar -> ∥ + case 1887: state = 1888; break; // &DownArrow -> ↓ + case 1893: state = 1894; break; // &Downarrow -> ⇓ + case 1901: state = 1902; break; // &downarrow -> ↓ + case 1905: state = 1906; break; // &DownArrowBar -> ⤓ + case 1913: state = 1914; break; // &DownArrowUpArrow -> ⇵ + case 1919: state = 1920; break; // &DownBreve -> ̑ + case 1930: state = 1931; break; // &downdownarrows -> ⇊ + case 1942: state = 1943; break; // &downharpoonleft -> ⇃ + case 1948: state = 1949; break; // &downharpoonright -> ⇂ + case 1964: state = 1965; break; // &DownLeftRightVector -> ⥐ + case 1974: state = 1975; break; // &DownLeftTeeVector -> ⥞ + case 1981: state = 1982; break; // &DownLeftVector -> ↽ + case 1985: state = 1986; break; // &DownLeftVectorBar -> ⥖ + case 2000: state = 2001; break; // &DownRightTeeVector -> ⥟ + case 2007: state = 2008; break; // &DownRightVector -> ⇁ + case 2011: state = 2012; break; // &DownRightVectorBar -> ⥗ + case 2015: state = 2016; break; // &DownTee -> ⊤ + case 2021: state = 2022; break; // &DownTeeArrow -> ↧ + case 2029: state = 2030; break; // &drbkarow -> ⤐ + case 2034: state = 2035; break; // &drcorn -> ⌟ + case 2038: state = 2039; break; // &drcrop -> ⌌ + case 2042: state = 2043; break; // &Dscr -> 𝒟 + case 2046: state = 2047; break; // &dscr -> 𝒹 + case 2050: state = 2051; break; // &DScy -> Ѕ + case 2052: state = 2053; break; // &dscy -> ѕ + case 2055: state = 2056; break; // &dsol -> ⧶ + case 2060: state = 2061; break; // &Dstrok -> Đ + case 2065: state = 2066; break; // &dstrok -> đ + case 2070: state = 2071; break; // &dtdot -> ⋱ + case 2073: state = 2074; break; // &dtri -> ▿ + case 2075: state = 2076; break; // &dtrif -> ▾ + case 2080: state = 2081; break; // &duarr -> ⇵ + case 2084: state = 2085; break; // &duhar -> ⥯ + case 2091: state = 2092; break; // &dwangle -> ⦦ + case 2095: state = 2096; break; // &DZcy -> Џ + case 2099: state = 2100; break; // &dzcy -> џ + case 2106: state = 2107; break; // &dzigrarr -> ⟿ + case 2113: state = 2114; break; // É -> É + case 2120: state = 2121; break; // é -> é + case 2125: state = 2126; break; // &easter -> ⩮ + case 2131: state = 2132; break; // &Ecaron -> Ě + case 2137: state = 2138; break; // &ecaron -> ě + case 2140: state = 2141; break; // &ecir -> ≖ + case 2144: state = 2145; break; // Ê -> Ê + case 2146: state = 2147; break; // ê -> ê + case 2151: state = 2152; break; // &ecolon -> ≕ + case 2153: state = 2154; break; // &Ecy -> Э + case 2155: state = 2156; break; // &ecy -> э + case 2160: state = 2161; break; // &eDDot -> ⩷ + case 2164: state = 2165; break; // &Edot -> Ė + case 2167: state = 2168; break; // &eDot -> ≑ + case 2171: state = 2172; break; // &edot -> ė + case 2173: state = 2174; break; // &ee -> ⅇ + case 2178: state = 2179; break; // &efDot -> ≒ + case 2181: state = 2182; break; // &Efr -> 𝔈 + case 2183: state = 2184; break; // &efr -> 𝔢 + case 2185: state = 2186; break; // &eg -> ⪚ + case 2191: state = 2192; break; // È -> È + case 2196: state = 2197; break; // è -> è + case 2198: state = 2199; break; // &egs -> ⪖ + case 2202: state = 2203; break; // &egsdot -> ⪘ + case 2204: state = 2205; break; // &el -> ⪙ + case 2211: state = 2212; break; // &Element -> ∈ + case 2218: state = 2219; break; // &elinters -> ⏧ + case 2220: state = 2221; break; // &ell -> ℓ + case 2222: state = 2223; break; // &els -> ⪕ + case 2226: state = 2227; break; // &elsdot -> ⪗ + case 2231: state = 2232; break; // &Emacr -> Ē + case 2236: state = 2237; break; // &emacr -> ē + case 2240: state = 2241; break; // &empty -> ∅ + case 2244: state = 2245; break; // &emptyset -> ∅ + case 2259: state = 2260; break; // &EmptySmallSquare -> ◻ + case 2261: state = 2262; break; // &emptyv -> ∅ + case 2277: state = 2278; break; // &EmptyVerySmallSquare -> ▫ + case 2280: state = 2281; break; // &emsp ->   + case 2283: state = 2284; break; // &emsp13 ->   + case 2285: state = 2286; break; // &emsp14 ->   + case 2288: state = 2289; break; // &ENG -> Ŋ + case 2291: state = 2292; break; // &eng -> ŋ + case 2294: state = 2295; break; // &ensp ->   + case 2299: state = 2300; break; // &Eogon -> Ę + case 2304: state = 2305; break; // &eogon -> ę + case 2307: state = 2308; break; // &Eopf -> 𝔼 + case 2310: state = 2311; break; // &eopf -> 𝕖 + case 2314: state = 2315; break; // &epar -> ⋕ + case 2317: state = 2318; break; // &eparsl -> ⧣ + case 2321: state = 2322; break; // &eplus -> ⩱ + case 2324: state = 2325; break; // &epsi -> ε + case 2331: state = 2332; break; // &Epsilon -> Ε + case 2335: state = 2336; break; // &epsilon -> ε + case 2337: state = 2338; break; // &epsiv -> ϵ + case 2343: state = 2344; break; // &eqcirc -> ≖ + case 2348: state = 2349; break; // &eqcolon -> ≕ + case 2352: state = 2353; break; // &eqsim -> ≂ + case 2360: state = 2361; break; // &eqslantgtr -> ⪖ + case 2365: state = 2366; break; // &eqslantless -> ⪕ + case 2370: state = 2371; break; // &Equal -> ⩵ + case 2375: state = 2376; break; // &equals -> = + case 2381: state = 2382; break; // &EqualTilde -> ≂ + case 2385: state = 2386; break; // &equest -> ≟ + case 2394: state = 2395; break; // &Equilibrium -> ⇌ + case 2397: state = 2398; break; // &equiv -> ≡ + case 2400: state = 2401; break; // &equivDD -> ⩸ + case 2407: state = 2408; break; // &eqvparsl -> ⧥ + case 2412: state = 2413; break; // &erarr -> ⥱ + case 2416: state = 2417; break; // &erDot -> ≓ + case 2420: state = 2421; break; // &Escr -> ℰ + case 2424: state = 2425; break; // &escr -> ℯ + case 2428: state = 2429; break; // &esdot -> ≐ + case 2431: state = 2432; break; // &Esim -> ⩳ + case 2434: state = 2435; break; // &esim -> ≂ + case 2437: state = 2438; break; // &Eta -> Η + case 2440: state = 2441; break; // &eta -> η + case 2443: state = 2444; break; // Ð -> Ð + case 2445: state = 2446; break; // ð -> ð + case 2449: state = 2450; break; // Ë -> Ë + case 2453: state = 2454; break; // ë -> ë + case 2456: state = 2457; break; // &euro -> € + case 2460: state = 2461; break; // &excl -> ! + case 2464: state = 2465; break; // &exist -> ∃ + case 2470: state = 2471; break; // &Exists -> ∃ + case 2480: state = 2481; break; // &expectation -> ℰ + case 2491: state = 2492; break; // &ExponentialE -> ⅇ + case 2501: state = 2502; break; // &exponentiale -> ⅇ + case 2515: state = 2516; break; // &fallingdotseq -> ≒ + case 2519: state = 2520; break; // &Fcy -> Ф + case 2522: state = 2523; break; // &fcy -> ф + case 2528: state = 2529; break; // &female -> ♀ + case 2534: state = 2535; break; // &ffilig -> ffi + case 2538: state = 2539; break; // &fflig -> ff + case 2542: state = 2543; break; // &ffllig -> ffl + case 2545: state = 2546; break; // &Ffr -> 𝔉 + case 2547: state = 2548; break; // &ffr -> 𝔣 + case 2552: state = 2553; break; // &filig -> fi + case 2569: state = 2570; break; // &FilledSmallSquare -> ◼ + case 2585: state = 2586; break; // &FilledVerySmallSquare -> ▪ + case 2590: state = 2591; break; // &fjlig -> fj + case 2594: state = 2595; break; // &flat -> ♭ + case 2598: state = 2599; break; // &fllig -> fl + case 2602: state = 2603; break; // &fltns -> ▱ + case 2606: state = 2607; break; // &fnof -> ƒ + case 2610: state = 2611; break; // &Fopf -> 𝔽 + case 2614: state = 2615; break; // &fopf -> 𝕗 + case 2619: state = 2620; break; // &ForAll -> ∀ + case 2624: state = 2625; break; // &forall -> ∀ + case 2626: state = 2627; break; // &fork -> ⋔ + case 2628: state = 2629; break; // &forkv -> ⫙ + case 2637: state = 2638; break; // &Fouriertrf -> ℱ + case 2645: state = 2646; break; // &fpartint -> ⨍ + case 2651: state = 2652; break; // ½ -> ½ + case 2653: state = 2654; break; // &frac13 -> ⅓ + case 2655: state = 2656; break; // ¼ -> ¼ + case 2657: state = 2658; break; // &frac15 -> ⅕ + case 2659: state = 2660; break; // &frac16 -> ⅙ + case 2661: state = 2662; break; // &frac18 -> ⅛ + case 2664: state = 2665; break; // &frac23 -> ⅔ + case 2666: state = 2667; break; // &frac25 -> ⅖ + case 2669: state = 2670; break; // ¾ -> ¾ + case 2671: state = 2672; break; // &frac35 -> ⅗ + case 2673: state = 2674; break; // &frac38 -> ⅜ + case 2676: state = 2677; break; // &frac45 -> ⅘ + case 2679: state = 2680; break; // &frac56 -> ⅚ + case 2681: state = 2682; break; // &frac58 -> ⅝ + case 2684: state = 2685; break; // &frac78 -> ⅞ + case 2687: state = 2688; break; // &frasl -> ⁄ + case 2691: state = 2692; break; // &frown -> ⌢ + case 2695: state = 2696; break; // &Fscr -> ℱ + case 2699: state = 2700; break; // &fscr -> 𝒻 + case 2706: state = 2707; break; // &gacute -> ǵ + case 2712: state = 2713; break; // &Gamma -> Γ + case 2716: state = 2717; break; // &gamma -> γ + case 2718: state = 2719; break; // &Gammad -> Ϝ + case 2720: state = 2721; break; // &gammad -> ϝ + case 2722: state = 2723; break; // &gap -> ⪆ + case 2728: state = 2729; break; // &Gbreve -> Ğ + case 2734: state = 2735; break; // &gbreve -> ğ + case 2740: state = 2741; break; // &Gcedil -> Ģ + case 2744: state = 2745; break; // &Gcirc -> Ĝ + case 2749: state = 2750; break; // &gcirc -> ĝ + case 2751: state = 2752; break; // &Gcy -> Г + case 2753: state = 2754; break; // &gcy -> г + case 2757: state = 2758; break; // &Gdot -> Ġ + case 2761: state = 2762; break; // &gdot -> ġ + case 2763: state = 2764; break; // &gE -> ≧ + case 2765: state = 2766; break; // &ge -> ≥ + case 2767: state = 2768; break; // &gEl -> ⪌ + case 2769: state = 2770; break; // &gel -> ⋛ + case 2771: state = 2772; break; // &geq -> ≥ + case 2773: state = 2774; break; // &geqq -> ≧ + case 2779: state = 2780; break; // &geqslant -> ⩾ + case 2781: state = 2782; break; // &ges -> ⩾ + case 2784: state = 2785; break; // &gescc -> ⪩ + case 2788: state = 2789; break; // &gesdot -> ⪀ + case 2790: state = 2791; break; // &gesdoto -> ⪂ + case 2792: state = 2793; break; // &gesdotol -> ⪄ + case 2794: state = 2795; break; // &gesl -> ⋛︀ + case 2797: state = 2798; break; // &gesles -> ⪔ + case 2800: state = 2801; break; // &Gfr -> 𝔊 + case 2803: state = 2804; break; // &gfr -> 𝔤 + case 2805: state = 2806; break; // &Gg -> ⋙ + case 2807: state = 2808; break; // &gg -> ≫ + case 2809: state = 2810; break; // &ggg -> ⋙ + case 2814: state = 2815; break; // &gimel -> ℷ + case 2818: state = 2819; break; // &GJcy -> Ѓ + case 2822: state = 2823; break; // &gjcy -> ѓ + case 2824: state = 2825; break; // &gl -> ≷ + case 2826: state = 2827; break; // &gla -> ⪥ + case 2828: state = 2829; break; // &glE -> ⪒ + case 2830: state = 2831; break; // &glj -> ⪤ + case 2834: state = 2835; break; // &gnap -> ⪊ + case 2839: state = 2840; break; // &gnapprox -> ⪊ + case 2841: state = 2842; break; // &gnE -> ≩ + case 2843: state = 2844; break; // &gne -> ⪈ + case 2845: state = 2846; break; // &gneq -> ⪈ + case 2847: state = 2848; break; // &gneqq -> ≩ + case 2851: state = 2852; break; // &gnsim -> ⋧ + case 2855: state = 2856; break; // &Gopf -> 𝔾 + case 2859: state = 2860; break; // &gopf -> 𝕘 + case 2864: state = 2865; break; // &grave -> ` + case 2876: state = 2877; break; // &GreaterEqual -> ≥ + case 2881: state = 2882; break; // &GreaterEqualLess -> ⋛ + case 2891: state = 2892; break; // &GreaterFullEqual -> ≧ + case 2899: state = 2900; break; // &GreaterGreater -> ⪢ + case 2904: state = 2905; break; // &GreaterLess -> ≷ + case 2915: state = 2916; break; // &GreaterSlantEqual -> ⩾ + case 2921: state = 2922; break; // &GreaterTilde -> ≳ + case 2925: state = 2926; break; // &Gscr -> 𝒢 + case 2929: state = 2930; break; // &gscr -> ℊ + case 2932: state = 2933; break; // &gsim -> ≳ + case 2934: state = 2935; break; // &gsime -> ⪎ + case 2936: state = 2937; break; // &gsiml -> ⪐ + case 2938: state = 2939; break; // > -> > + case 2940: state = 2941; break; // &Gt -> ≫ + case 2942: state = 2943; break; // > -> > + case 2945: state = 2946; break; // >cc -> ⪧ + case 2948: state = 2949; break; // >cir -> ⩺ + case 2952: state = 2953; break; // >dot -> ⋗ + case 2957: state = 2958; break; // >lPar -> ⦕ + case 2963: state = 2964; break; // >quest -> ⩼ + case 2971: state = 2972; break; // >rapprox -> ⪆ + case 2974: state = 2975; break; // >rarr -> ⥸ + case 2978: state = 2979; break; // >rdot -> ⋗ + case 2985: state = 2986; break; // >reqless -> ⋛ + case 2991: state = 2992; break; // >reqqless -> ⪌ + case 2996: state = 2997; break; // >rless -> ≷ + case 3000: state = 3001; break; // >rsim -> ≳ + case 3009: state = 3010; break; // &gvertneqq -> ≩︀ + case 3012: state = 3013; break; // &gvnE -> ≩︀ + case 3018: state = 3019; break; // &Hacek -> ˇ + case 3025: state = 3026; break; // &hairsp ->   + case 3028: state = 3029; break; // &half -> ½ + case 3033: state = 3034; break; // &hamilt -> ℋ + case 3039: state = 3040; break; // &HARDcy -> Ъ + case 3044: state = 3045; break; // &hardcy -> ъ + case 3048: state = 3049; break; // &hArr -> ⇔ + case 3050: state = 3051; break; // &harr -> ↔ + case 3054: state = 3055; break; // &harrcir -> ⥈ + case 3056: state = 3057; break; // &harrw -> ↭ + case 3058: state = 3059; break; // &Hat -> ^ + case 3062: state = 3063; break; // &hbar -> ℏ + case 3067: state = 3068; break; // &Hcirc -> Ĥ + case 3072: state = 3073; break; // &hcirc -> ĥ + case 3078: state = 3079; break; // &hearts -> ♥ + case 3082: state = 3083; break; // &heartsuit -> ♥ + case 3087: state = 3088; break; // &hellip -> … + case 3092: state = 3093; break; // &hercon -> ⊹ + case 3095: state = 3096; break; // &Hfr -> ℌ + case 3098: state = 3099; break; // &hfr -> 𝔥 + case 3110: state = 3111; break; // &HilbertSpace -> ℋ + case 3118: state = 3119; break; // &hksearow -> ⤥ + case 3124: state = 3125; break; // &hkswarow -> ⤦ + case 3129: state = 3130; break; // &hoarr -> ⇿ + case 3134: state = 3135; break; // &homtht -> ∻ + case 3146: state = 3147; break; // &hookleftarrow -> ↩ + case 3157: state = 3158; break; // &hookrightarrow -> ↪ + case 3161: state = 3162; break; // &Hopf -> ℍ + case 3164: state = 3165; break; // &hopf -> 𝕙 + case 3169: state = 3170; break; // &horbar -> ― + case 3182: state = 3183; break; // &HorizontalLine -> ─ + case 3186: state = 3187; break; // &Hscr -> ℋ + case 3190: state = 3191; break; // &hscr -> 𝒽 + case 3195: state = 3196; break; // &hslash -> ℏ + case 3200: state = 3201; break; // &Hstrok -> Ħ + case 3205: state = 3206; break; // &hstrok -> ħ + case 3217: state = 3218; break; // &HumpDownHump -> ≎ + case 3223: state = 3224; break; // &HumpEqual -> ≏ + case 3229: state = 3230; break; // &hybull -> ⁃ + case 3234: state = 3235; break; // &hyphen -> ‐ + case 3241: state = 3242; break; // Í -> Í + case 3248: state = 3249; break; // í -> í + case 3250: state = 3251; break; // &ic -> ⁣ + case 3255: state = 3256; break; // Î -> Î + case 3259: state = 3260; break; // î -> î + case 3261: state = 3262; break; // &Icy -> И + case 3263: state = 3264; break; // &icy -> и + case 3267: state = 3268; break; // &Idot -> İ + case 3271: state = 3272; break; // &IEcy -> Е + case 3275: state = 3276; break; // &iecy -> е + case 3279: state = 3280; break; // ¡ -> ¡ + case 3282: state = 3283; break; // &iff -> ⇔ + case 3285: state = 3286; break; // &Ifr -> ℑ + case 3287: state = 3288; break; // &ifr -> 𝔦 + case 3293: state = 3294; break; // Ì -> Ì + case 3299: state = 3300; break; // ì -> ì + case 3301: state = 3302; break; // &ii -> ⅈ + case 3306: state = 3307; break; // &iiiint -> ⨌ + case 3309: state = 3310; break; // &iiint -> ∭ + case 3314: state = 3315; break; // &iinfin -> ⧜ + case 3318: state = 3319; break; // &iiota -> ℩ + case 3323: state = 3324; break; // &IJlig -> IJ + case 3328: state = 3329; break; // &ijlig -> ij + case 3330: state = 3331; break; // &Im -> ℑ + case 3334: state = 3335; break; // &Imacr -> Ī + case 3339: state = 3340; break; // &imacr -> ī + case 3342: state = 3343; break; // &image -> ℑ + case 3350: state = 3351; break; // &ImaginaryI -> ⅈ + case 3355: state = 3356; break; // &imagline -> ℐ + case 3360: state = 3361; break; // &imagpart -> ℑ + case 3363: state = 3364; break; // &imath -> ı + case 3366: state = 3367; break; // &imof -> ⊷ + case 3370: state = 3371; break; // &imped -> Ƶ + case 3376: state = 3377; break; // &Implies -> ⇒ + case 3378: state = 3379; break; // &in -> ∈ + case 3383: state = 3384; break; // &incare -> ℅ + case 3387: state = 3388; break; // &infin -> ∞ + case 3391: state = 3392; break; // &infintie -> ⧝ + case 3396: state = 3397; break; // &inodot -> ı + case 3399: state = 3400; break; // &Int -> ∬ + case 3401: state = 3402; break; // &int -> ∫ + case 3405: state = 3406; break; // &intcal -> ⊺ + case 3411: state = 3412; break; // &integers -> ℤ + case 3417: state = 3418; break; // &Integral -> ∫ + case 3422: state = 3423; break; // &intercal -> ⊺ + case 3431: state = 3432; break; // &Intersection -> ⋂ + case 3437: state = 3438; break; // &intlarhk -> ⨗ + case 3442: state = 3443; break; // &intprod -> ⨼ + case 3455: state = 3456; break; // &InvisibleComma -> ⁣ + case 3461: state = 3462; break; // &InvisibleTimes -> ⁢ + case 3465: state = 3466; break; // &IOcy -> Ё + case 3469: state = 3470; break; // &iocy -> ё + case 3474: state = 3475; break; // &Iogon -> Į + case 3478: state = 3479; break; // &iogon -> į + case 3481: state = 3482; break; // &Iopf -> 𝕀 + case 3484: state = 3485; break; // &iopf -> 𝕚 + case 3487: state = 3488; break; // &Iota -> Ι + case 3490: state = 3491; break; // &iota -> ι + case 3495: state = 3496; break; // &iprod -> ⨼ + case 3501: state = 3502; break; // ¿ -> ¿ + case 3505: state = 3506; break; // &Iscr -> ℐ + case 3509: state = 3510; break; // &iscr -> 𝒾 + case 3512: state = 3513; break; // &isin -> ∈ + case 3516: state = 3517; break; // &isindot -> ⋵ + case 3518: state = 3519; break; // &isinE -> ⋹ + case 3520: state = 3521; break; // &isins -> ⋴ + case 3522: state = 3523; break; // &isinsv -> ⋳ + case 3524: state = 3525; break; // &isinv -> ∈ + case 3526: state = 3527; break; // &it -> ⁢ + case 3532: state = 3533; break; // &Itilde -> Ĩ + case 3537: state = 3538; break; // &itilde -> ĩ + case 3542: state = 3543; break; // &Iukcy -> І + case 3547: state = 3548; break; // &iukcy -> і + case 3550: state = 3551; break; // Ï -> Ï + case 3553: state = 3554; break; // ï -> ï + case 3559: state = 3560; break; // &Jcirc -> Ĵ + case 3565: state = 3566; break; // &jcirc -> ĵ + case 3567: state = 3568; break; // &Jcy -> Й + case 3569: state = 3570; break; // &jcy -> й + case 3572: state = 3573; break; // &Jfr -> 𝔍 + case 3575: state = 3576; break; // &jfr -> 𝔧 + case 3580: state = 3581; break; // &jmath -> ȷ + case 3584: state = 3585; break; // &Jopf -> 𝕁 + case 3588: state = 3589; break; // &jopf -> 𝕛 + case 3592: state = 3593; break; // &Jscr -> 𝒥 + case 3596: state = 3597; break; // &jscr -> 𝒿 + case 3601: state = 3602; break; // &Jsercy -> Ј + case 3606: state = 3607; break; // &jsercy -> ј + case 3611: state = 3612; break; // &Jukcy -> Є + case 3616: state = 3617; break; // &jukcy -> є + case 3622: state = 3623; break; // &Kappa -> Κ + case 3628: state = 3629; break; // &kappa -> κ + case 3630: state = 3631; break; // &kappav -> ϰ + case 3636: state = 3637; break; // &Kcedil -> Ķ + case 3642: state = 3643; break; // &kcedil -> ķ + case 3644: state = 3645; break; // &Kcy -> К + case 3646: state = 3647; break; // &kcy -> к + case 3649: state = 3650; break; // &Kfr -> 𝔎 + case 3652: state = 3653; break; // &kfr -> 𝔨 + case 3658: state = 3659; break; // &kgreen -> ĸ + case 3662: state = 3663; break; // &KHcy -> Х + case 3666: state = 3667; break; // &khcy -> х + case 3670: state = 3671; break; // &KJcy -> Ќ + case 3674: state = 3675; break; // &kjcy -> ќ + case 3678: state = 3679; break; // &Kopf -> 𝕂 + case 3682: state = 3683; break; // &kopf -> 𝕜 + case 3686: state = 3687; break; // &Kscr -> 𝒦 + case 3690: state = 3691; break; // &kscr -> 𝓀 + case 3696: state = 3697; break; // &lAarr -> ⇚ + case 3703: state = 3704; break; // &Lacute -> Ĺ + case 3709: state = 3710; break; // &lacute -> ĺ + case 3716: state = 3717; break; // &laemptyv -> ⦴ + case 3721: state = 3722; break; // &lagran -> ℒ + case 3726: state = 3727; break; // &Lambda -> Λ + case 3731: state = 3732; break; // &lambda -> λ + case 3734: state = 3735; break; // &Lang -> ⟪ + case 3737: state = 3738; break; // &lang -> ⟨ + case 3739: state = 3740; break; // &langd -> ⦑ + case 3742: state = 3743; break; // &langle -> ⟨ + case 3744: state = 3745; break; // &lap -> ⪅ + case 3753: state = 3754; break; // &Laplacetrf -> ℒ + case 3757: state = 3758; break; // « -> « + case 3760: state = 3761; break; // &Larr -> ↞ + case 3763: state = 3764; break; // &lArr -> ⇐ + case 3766: state = 3767; break; // &larr -> ← + case 3768: state = 3769; break; // &larrb -> ⇤ + case 3771: state = 3772; break; // &larrbfs -> ⤟ + case 3774: state = 3775; break; // &larrfs -> ⤝ + case 3777: state = 3778; break; // &larrhk -> ↩ + case 3780: state = 3781; break; // &larrlp -> ↫ + case 3783: state = 3784; break; // &larrpl -> ⤹ + case 3787: state = 3788; break; // &larrsim -> ⥳ + case 3790: state = 3791; break; // &larrtl -> ↢ + case 3792: state = 3793; break; // &lat -> ⪫ + case 3797: state = 3798; break; // &lAtail -> ⤛ + case 3801: state = 3802; break; // &latail -> ⤙ + case 3803: state = 3804; break; // &late -> ⪭ + case 3805: state = 3806; break; // &lates -> ⪭︀ + case 3810: state = 3811; break; // &lBarr -> ⤎ + case 3815: state = 3816; break; // &lbarr -> ⤌ + case 3819: state = 3820; break; // &lbbrk -> ❲ + case 3824: state = 3825; break; // &lbrace -> { + case 3826: state = 3827; break; // &lbrack -> [ + case 3829: state = 3830; break; // &lbrke -> ⦋ + case 3833: state = 3834; break; // &lbrksld -> ⦏ + case 3835: state = 3836; break; // &lbrkslu -> ⦍ + case 3841: state = 3842; break; // &Lcaron -> Ľ + case 3847: state = 3848; break; // &lcaron -> ľ + case 3852: state = 3853; break; // &Lcedil -> Ļ + case 3857: state = 3858; break; // &lcedil -> ļ + case 3860: state = 3861; break; // &lceil -> ⌈ + case 3863: state = 3864; break; // &lcub -> { + case 3865: state = 3866; break; // &Lcy -> Л + case 3867: state = 3868; break; // &lcy -> л + case 3871: state = 3872; break; // &ldca -> ⤶ + case 3875: state = 3876; break; // &ldquo -> “ + case 3877: state = 3878; break; // &ldquor -> „ + case 3883: state = 3884; break; // &ldrdhar -> ⥧ + case 3889: state = 3890; break; // &ldrushar -> ⥋ + case 3892: state = 3893; break; // &ldsh -> ↲ + case 3894: state = 3895; break; // &lE -> ≦ + case 3896: state = 3897; break; // &le -> ≤ + case 3912: state = 3913; break; // &LeftAngleBracket -> ⟨ + case 3917: state = 3918; break; // &LeftArrow -> ← + case 3923: state = 3924; break; // &Leftarrow -> ⇐ + case 3931: state = 3932; break; // &leftarrow -> ← + case 3935: state = 3936; break; // &LeftArrowBar -> ⇤ + case 3946: state = 3947; break; // &LeftArrowRightArrow -> ⇆ + case 3951: state = 3952; break; // &leftarrowtail -> ↢ + case 3959: state = 3960; break; // &LeftCeiling -> ⌈ + case 3973: state = 3974; break; // &LeftDoubleBracket -> ⟦ + case 3985: state = 3986; break; // &LeftDownTeeVector -> ⥡ + case 3992: state = 3993; break; // &LeftDownVector -> ⇃ + case 3996: state = 3997; break; // &LeftDownVectorBar -> ⥙ + case 4002: state = 4003; break; // &LeftFloor -> ⌊ + case 4014: state = 4015; break; // &leftharpoondown -> ↽ + case 4017: state = 4018; break; // &leftharpoonup -> ↼ + case 4028: state = 4029; break; // &leftleftarrows -> ⇇ + case 4039: state = 4040; break; // &LeftRightArrow -> ↔ + case 4050: state = 4051; break; // &Leftrightarrow -> ⇔ + case 4061: state = 4062; break; // &leftrightarrow -> ↔ + case 4063: state = 4064; break; // &leftrightarrows -> ⇆ + case 4072: state = 4073; break; // &leftrightharpoons -> ⇋ + case 4083: state = 4084; break; // &leftrightsquigarrow -> ↭ + case 4090: state = 4091; break; // &LeftRightVector -> ⥎ + case 4094: state = 4095; break; // &LeftTee -> ⊣ + case 4100: state = 4101; break; // &LeftTeeArrow -> ↤ + case 4107: state = 4108; break; // &LeftTeeVector -> ⥚ + case 4118: state = 4119; break; // &leftthreetimes -> ⋋ + case 4126: state = 4127; break; // &LeftTriangle -> ⊲ + case 4130: state = 4131; break; // &LeftTriangleBar -> ⧏ + case 4136: state = 4137; break; // &LeftTriangleEqual -> ⊴ + case 4149: state = 4150; break; // &LeftUpDownVector -> ⥑ + case 4159: state = 4160; break; // &LeftUpTeeVector -> ⥠ + case 4166: state = 4167; break; // &LeftUpVector -> ↿ + case 4170: state = 4171; break; // &LeftUpVectorBar -> ⥘ + case 4177: state = 4178; break; // &LeftVector -> ↼ + case 4181: state = 4182; break; // &LeftVectorBar -> ⥒ + case 4183: state = 4184; break; // &lEg -> ⪋ + case 4185: state = 4186; break; // &leg -> ⋚ + case 4187: state = 4188; break; // &leq -> ≤ + case 4189: state = 4190; break; // &leqq -> ≦ + case 4195: state = 4196; break; // &leqslant -> ⩽ + case 4197: state = 4198; break; // &les -> ⩽ + case 4200: state = 4201; break; // &lescc -> ⪨ + case 4204: state = 4205; break; // &lesdot -> ⩿ + case 4206: state = 4207; break; // &lesdoto -> ⪁ + case 4208: state = 4209; break; // &lesdotor -> ⪃ + case 4210: state = 4211; break; // &lesg -> ⋚︀ + case 4213: state = 4214; break; // &lesges -> ⪓ + case 4221: state = 4222; break; // &lessapprox -> ⪅ + case 4225: state = 4226; break; // &lessdot -> ⋖ + case 4231: state = 4232; break; // &lesseqgtr -> ⋚ + case 4236: state = 4237; break; // &lesseqqgtr -> ⪋ + case 4251: state = 4252; break; // &LessEqualGreater -> ⋚ + case 4261: state = 4262; break; // &LessFullEqual -> ≦ + case 4269: state = 4270; break; // &LessGreater -> ≶ + case 4273: state = 4274; break; // &lessgtr -> ≶ + case 4278: state = 4279; break; // &LessLess -> ⪡ + case 4282: state = 4283; break; // &lesssim -> ≲ + case 4293: state = 4294; break; // &LessSlantEqual -> ⩽ + case 4299: state = 4300; break; // &LessTilde -> ≲ + case 4305: state = 4306; break; // &lfisht -> ⥼ + case 4310: state = 4311; break; // &lfloor -> ⌊ + case 4313: state = 4314; break; // &Lfr -> 𝔏 + case 4315: state = 4316; break; // &lfr -> 𝔩 + case 4317: state = 4318; break; // &lg -> ≶ + case 4319: state = 4320; break; // &lgE -> ⪑ + case 4323: state = 4324; break; // &lHar -> ⥢ + case 4328: state = 4329; break; // &lhard -> ↽ + case 4330: state = 4331; break; // &lharu -> ↼ + case 4332: state = 4333; break; // &lharul -> ⥪ + case 4336: state = 4337; break; // &lhblk -> ▄ + case 4340: state = 4341; break; // &LJcy -> Љ + case 4344: state = 4345; break; // &ljcy -> љ + case 4346: state = 4347; break; // &Ll -> ⋘ + case 4348: state = 4349; break; // &ll -> ≪ + case 4352: state = 4353; break; // &llarr -> ⇇ + case 4359: state = 4360; break; // &llcorner -> ⌞ + case 4368: state = 4369; break; // &Lleftarrow -> ⇚ + case 4373: state = 4374; break; // &llhard -> ⥫ + case 4377: state = 4378; break; // &lltri -> ◺ + case 4383: state = 4384; break; // &Lmidot -> Ŀ + case 4389: state = 4390; break; // &lmidot -> ŀ + case 4394: state = 4395; break; // &lmoust -> ⎰ + case 4399: state = 4400; break; // &lmoustache -> ⎰ + case 4403: state = 4404; break; // &lnap -> ⪉ + case 4408: state = 4409; break; // &lnapprox -> ⪉ + case 4410: state = 4411; break; // &lnE -> ≨ + case 4412: state = 4413; break; // &lne -> ⪇ + case 4414: state = 4415; break; // &lneq -> ⪇ + case 4416: state = 4417; break; // &lneqq -> ≨ + case 4420: state = 4421; break; // &lnsim -> ⋦ + case 4425: state = 4426; break; // &loang -> ⟬ + case 4428: state = 4429; break; // &loarr -> ⇽ + case 4432: state = 4433; break; // &lobrk -> ⟦ + case 4445: state = 4446; break; // &LongLeftArrow -> ⟵ + case 4455: state = 4456; break; // &Longleftarrow -> ⟸ + case 4467: state = 4468; break; // &longleftarrow -> ⟵ + case 4478: state = 4479; break; // &LongLeftRightArrow -> ⟷ + case 4489: state = 4490; break; // &Longleftrightarrow -> ⟺ + case 4500: state = 4501; break; // &longleftrightarrow -> ⟷ + case 4507: state = 4508; break; // &longmapsto -> ⟼ + case 4518: state = 4519; break; // &LongRightArrow -> ⟶ + case 4529: state = 4530; break; // &Longrightarrow -> ⟹ + case 4540: state = 4541; break; // &longrightarrow -> ⟶ + case 4552: state = 4553; break; // &looparrowleft -> ↫ + case 4558: state = 4559; break; // &looparrowright -> ↬ + case 4562: state = 4563; break; // &lopar -> ⦅ + case 4565: state = 4566; break; // &Lopf -> 𝕃 + case 4567: state = 4568; break; // &lopf -> 𝕝 + case 4571: state = 4572; break; // &loplus -> ⨭ + case 4577: state = 4578; break; // &lotimes -> ⨴ + case 4582: state = 4583; break; // &lowast -> ∗ + case 4586: state = 4587; break; // &lowbar -> _ + case 4599: state = 4600; break; // &LowerLeftArrow -> ↙ + case 4610: state = 4611; break; // &LowerRightArrow -> ↘ + case 4612: state = 4613; break; // &loz -> ◊ + case 4617: state = 4618; break; // &lozenge -> ◊ + case 4619: state = 4620; break; // &lozf -> ⧫ + case 4623: state = 4624; break; // &lpar -> ( + case 4626: state = 4627; break; // &lparlt -> ⦓ + case 4631: state = 4632; break; // &lrarr -> ⇆ + case 4638: state = 4639; break; // &lrcorner -> ⌟ + case 4642: state = 4643; break; // &lrhar -> ⇋ + case 4644: state = 4645; break; // &lrhard -> ⥭ + case 4646: state = 4647; break; // &lrm -> ‎ + case 4650: state = 4651; break; // &lrtri -> ⊿ + case 4656: state = 4657; break; // &lsaquo -> ‹ + case 4660: state = 4661; break; // &Lscr -> ℒ + case 4663: state = 4664; break; // &lscr -> 𝓁 + case 4665: state = 4666; break; // &Lsh -> ↰ + case 4667: state = 4668; break; // &lsh -> ↰ + case 4670: state = 4671; break; // &lsim -> ≲ + case 4672: state = 4673; break; // &lsime -> ⪍ + case 4674: state = 4675; break; // &lsimg -> ⪏ + case 4677: state = 4678; break; // &lsqb -> [ + case 4680: state = 4681; break; // &lsquo -> ‘ + case 4682: state = 4683; break; // &lsquor -> ‚ + case 4687: state = 4688; break; // &Lstrok -> Ł + case 4692: state = 4693; break; // &lstrok -> ł + case 4694: state = 4695; break; // < -> < + case 4696: state = 4697; break; // &Lt -> ≪ + case 4698: state = 4699; break; // < -> < + case 4701: state = 4702; break; // <cc -> ⪦ + case 4704: state = 4705; break; // <cir -> ⩹ + case 4708: state = 4709; break; // <dot -> ⋖ + case 4713: state = 4714; break; // <hree -> ⋋ + case 4718: state = 4719; break; // <imes -> ⋉ + case 4723: state = 4724; break; // <larr -> ⥶ + case 4729: state = 4730; break; // <quest -> ⩻ + case 4732: state = 4733; break; // <ri -> ◃ + case 4734: state = 4735; break; // <rie -> ⊴ + case 4736: state = 4737; break; // <rif -> ◂ + case 4740: state = 4741; break; // <rPar -> ⦖ + case 4748: state = 4749; break; // &lurdshar -> ⥊ + case 4753: state = 4754; break; // &luruhar -> ⥦ + case 4762: state = 4763; break; // &lvertneqq -> ≨︀ + case 4765: state = 4766; break; // &lvnE -> ≨︀ + case 4770: state = 4771; break; // ¯ -> ¯ + case 4773: state = 4774; break; // &male -> ♂ + case 4775: state = 4776; break; // &malt -> ✠ + case 4779: state = 4780; break; // &maltese -> ✠ + case 4783: state = 4784; break; // &Map -> ⤅ + case 4785: state = 4786; break; // &map -> ↦ + case 4789: state = 4790; break; // &mapsto -> ↦ + case 4794: state = 4795; break; // &mapstodown -> ↧ + case 4799: state = 4800; break; // &mapstoleft -> ↤ + case 4802: state = 4803; break; // &mapstoup -> ↥ + case 4807: state = 4808; break; // &marker -> ▮ + case 4813: state = 4814; break; // &mcomma -> ⨩ + case 4816: state = 4817; break; // &Mcy -> М + case 4818: state = 4819; break; // &mcy -> м + case 4823: state = 4824; break; // &mdash -> — + case 4828: state = 4829; break; // &mDDot -> ∺ + case 4841: state = 4842; break; // &measuredangle -> ∡ + case 4852: state = 4853; break; // &MediumSpace ->   + case 4860: state = 4861; break; // &Mellintrf -> ℳ + case 4863: state = 4864; break; // &Mfr -> 𝔐 + case 4866: state = 4867; break; // &mfr -> 𝔪 + case 4869: state = 4870; break; // &mho -> ℧ + case 4874: state = 4875; break; // µ -> µ + case 4876: state = 4877; break; // &mid -> ∣ + case 4880: state = 4881; break; // &midast -> * + case 4884: state = 4885; break; // &midcir -> ⫰ + case 4888: state = 4889; break; // · -> · + case 4892: state = 4893; break; // &minus -> − + case 4894: state = 4895; break; // &minusb -> ⊟ + case 4896: state = 4897; break; // &minusd -> ∸ + case 4898: state = 4899; break; // &minusdu -> ⨪ + case 4907: state = 4908; break; // &MinusPlus -> ∓ + case 4911: state = 4912; break; // &mlcp -> ⫛ + case 4914: state = 4915; break; // &mldr -> … + case 4920: state = 4921; break; // &mnplus -> ∓ + case 4926: state = 4927; break; // &models -> ⊧ + case 4930: state = 4931; break; // &Mopf -> 𝕄 + case 4933: state = 4934; break; // &mopf -> 𝕞 + case 4935: state = 4936; break; // &mp -> ∓ + case 4939: state = 4940; break; // &Mscr -> ℳ + case 4943: state = 4944; break; // &mscr -> 𝓂 + case 4948: state = 4949; break; // &mstpos -> ∾ + case 4950: state = 4951; break; // &Mu -> Μ + case 4952: state = 4953; break; // &mu -> μ + case 4959: state = 4960; break; // &multimap -> ⊸ + case 4963: state = 4964; break; // &mumap -> ⊸ + case 4969: state = 4970; break; // &nabla -> ∇ + case 4976: state = 4977; break; // &Nacute -> Ń + case 4981: state = 4982; break; // &nacute -> ń + case 4984: state = 4985; break; // &nang -> ∠⃒ + case 4986: state = 4987; break; // &nap -> ≉ + case 4988: state = 4989; break; // &napE -> ⩰̸ + case 4991: state = 4992; break; // &napid -> ≋̸ + case 4994: state = 4995; break; // &napos -> ʼn + case 4999: state = 5000; break; // &napprox -> ≉ + case 5003: state = 5004; break; // &natur -> ♮ + case 5006: state = 5007; break; // &natural -> ♮ + case 5008: state = 5009; break; // &naturals -> ℕ + case 5012: state = 5013; break; //   ->   + case 5016: state = 5017; break; // &nbump -> ≎̸ + case 5018: state = 5019; break; // &nbumpe -> ≏̸ + case 5022: state = 5023; break; // &ncap -> ⩃ + case 5028: state = 5029; break; // &Ncaron -> Ň + case 5032: state = 5033; break; // &ncaron -> ň + case 5037: state = 5038; break; // &Ncedil -> Ņ + case 5042: state = 5043; break; // &ncedil -> ņ + case 5046: state = 5047; break; // &ncong -> ≇ + case 5050: state = 5051; break; // &ncongdot -> ⩭̸ + case 5053: state = 5054; break; // &ncup -> ⩂ + case 5055: state = 5056; break; // &Ncy -> Н + case 5057: state = 5058; break; // &ncy -> н + case 5062: state = 5063; break; // &ndash -> – + case 5064: state = 5065; break; // &ne -> ≠ + case 5069: state = 5070; break; // &nearhk -> ⤤ + case 5073: state = 5074; break; // &neArr -> ⇗ + case 5075: state = 5076; break; // &nearr -> ↗ + case 5078: state = 5079; break; // &nearrow -> ↗ + case 5082: state = 5083; break; // &nedot -> ≐̸ + case 5101: state = 5102; break; // &NegativeMediumSpace -> ​ + case 5112: state = 5113; break; // &NegativeThickSpace -> ​ + case 5119: state = 5120; break; // &NegativeThinSpace -> ​ + case 5133: state = 5134; break; // &NegativeVeryThinSpace -> ​ + case 5138: state = 5139; break; // &nequiv -> ≢ + case 5143: state = 5144; break; // &nesear -> ⤨ + case 5146: state = 5147; break; // &nesim -> ≂̸ + case 5165: state = 5166; break; // &NestedGreaterGreater -> ≫ + case 5174: state = 5175; break; // &NestedLessLess -> ≪ + case 5180: state = 5181; break; // &NewLine -> + case 5185: state = 5186; break; // &nexist -> ∄ + case 5187: state = 5188; break; // &nexists -> ∄ + case 5190: state = 5191; break; // &Nfr -> 𝔑 + case 5193: state = 5194; break; // &nfr -> 𝔫 + case 5196: state = 5197; break; // &ngE -> ≧̸ + case 5198: state = 5199; break; // &nge -> ≱ + case 5200: state = 5201; break; // &ngeq -> ≱ + case 5202: state = 5203; break; // &ngeqq -> ≧̸ + case 5208: state = 5209; break; // &ngeqslant -> ⩾̸ + case 5210: state = 5211; break; // &nges -> ⩾̸ + case 5213: state = 5214; break; // &nGg -> ⋙̸ + case 5217: state = 5218; break; // &ngsim -> ≵ + case 5219: state = 5220; break; // &nGt -> ≫⃒ + case 5221: state = 5222; break; // &ngt -> ≯ + case 5223: state = 5224; break; // &ngtr -> ≯ + case 5225: state = 5226; break; // &nGtv -> ≫̸ + case 5230: state = 5231; break; // &nhArr -> ⇎ + case 5234: state = 5235; break; // &nharr -> ↮ + case 5238: state = 5239; break; // &nhpar -> ⫲ + case 5240: state = 5241; break; // &ni -> ∋ + case 5242: state = 5243; break; // &nis -> ⋼ + case 5244: state = 5245; break; // &nisd -> ⋺ + case 5246: state = 5247; break; // &niv -> ∋ + case 5250: state = 5251; break; // &NJcy -> Њ + case 5254: state = 5255; break; // &njcy -> њ + case 5259: state = 5260; break; // &nlArr -> ⇍ + case 5263: state = 5264; break; // &nlarr -> ↚ + case 5266: state = 5267; break; // &nldr -> ‥ + case 5268: state = 5269; break; // &nlE -> ≦̸ + case 5270: state = 5271; break; // &nle -> ≰ + case 5280: state = 5281; break; // &nLeftarrow -> ⇍ + case 5288: state = 5289; break; // &nleftarrow -> ↚ + case 5299: state = 5300; break; // &nLeftrightarrow -> ⇎ + case 5310: state = 5311; break; // &nleftrightarrow -> ↮ + case 5312: state = 5313; break; // &nleq -> ≰ + case 5314: state = 5315; break; // &nleqq -> ≦̸ + case 5320: state = 5321; break; // &nleqslant -> ⩽̸ + case 5322: state = 5323; break; // &nles -> ⩽̸ + case 5324: state = 5325; break; // &nless -> ≮ + case 5326: state = 5327; break; // &nLl -> ⋘̸ + case 5330: state = 5331; break; // &nlsim -> ≴ + case 5332: state = 5333; break; // &nLt -> ≪⃒ + case 5334: state = 5335; break; // &nlt -> ≮ + case 5337: state = 5338; break; // &nltri -> ⋪ + case 5339: state = 5340; break; // &nltrie -> ⋬ + case 5341: state = 5342; break; // &nLtv -> ≪̸ + case 5345: state = 5346; break; // &nmid -> ∤ + case 5352: state = 5353; break; // &NoBreak -> ⁠ + case 5367: state = 5368; break; // &NonBreakingSpace ->   + case 5370: state = 5371; break; // &Nopf -> ℕ + case 5374: state = 5375; break; // &nopf -> 𝕟 + case 5376: state = 5377; break; // &Not -> ⫬ + case 5378: state = 5379; break; // ¬ -> ¬ + case 5388: state = 5389; break; // &NotCongruent -> ≢ + case 5394: state = 5395; break; // &NotCupCap -> ≭ + case 5412: state = 5413; break; // &NotDoubleVerticalBar -> ∦ + case 5420: state = 5421; break; // &NotElement -> ∉ + case 5425: state = 5426; break; // &NotEqual -> ≠ + case 5431: state = 5432; break; // &NotEqualTilde -> ≂̸ + case 5437: state = 5438; break; // &NotExists -> ∄ + case 5445: state = 5446; break; // &NotGreater -> ≯ + case 5451: state = 5452; break; // &NotGreaterEqual -> ≱ + case 5461: state = 5462; break; // &NotGreaterFullEqual -> ≧̸ + case 5469: state = 5470; break; // &NotGreaterGreater -> ≫̸ + case 5474: state = 5475; break; // &NotGreaterLess -> ≹ + case 5485: state = 5486; break; // &NotGreaterSlantEqual -> ⩾̸ + case 5491: state = 5492; break; // &NotGreaterTilde -> ≵ + case 5504: state = 5505; break; // &NotHumpDownHump -> ≎̸ + case 5510: state = 5511; break; // &NotHumpEqual -> ≏̸ + case 5513: state = 5514; break; // ¬in -> ∉ + case 5517: state = 5518; break; // ¬indot -> ⋵̸ + case 5519: state = 5520; break; // ¬inE -> ⋹̸ + case 5522: state = 5523; break; // ¬inva -> ∉ + case 5524: state = 5525; break; // ¬invb -> ⋷ + case 5526: state = 5527; break; // ¬invc -> ⋶ + case 5539: state = 5540; break; // &NotLeftTriangle -> ⋪ + case 5543: state = 5544; break; // &NotLeftTriangleBar -> ⧏̸ + case 5549: state = 5550; break; // &NotLeftTriangleEqual -> ⋬ + case 5552: state = 5553; break; // &NotLess -> ≮ + case 5558: state = 5559; break; // &NotLessEqual -> ≰ + case 5566: state = 5567; break; // &NotLessGreater -> ≸ + case 5571: state = 5572; break; // &NotLessLess -> ≪̸ + case 5582: state = 5583; break; // &NotLessSlantEqual -> ⩽̸ + case 5588: state = 5589; break; // &NotLessTilde -> ≴ + case 5609: state = 5610; break; // &NotNestedGreaterGreater -> ⪢̸ + case 5618: state = 5619; break; // &NotNestedLessLess -> ⪡̸ + case 5621: state = 5622; break; // ¬ni -> ∌ + case 5624: state = 5625; break; // ¬niva -> ∌ + case 5626: state = 5627; break; // ¬nivb -> ⋾ + case 5628: state = 5629; break; // ¬nivc -> ⋽ + case 5637: state = 5638; break; // &NotPrecedes -> ⊀ + case 5643: state = 5644; break; // &NotPrecedesEqual -> ⪯̸ + case 5654: state = 5655; break; // &NotPrecedesSlantEqual -> ⋠ + case 5669: state = 5670; break; // &NotReverseElement -> ∌ + case 5682: state = 5683; break; // &NotRightTriangle -> ⋫ + case 5686: state = 5687; break; // &NotRightTriangleBar -> ⧐̸ + case 5692: state = 5693; break; // &NotRightTriangleEqual -> ⋭ + case 5705: state = 5706; break; // &NotSquareSubset -> ⊏̸ + case 5711: state = 5712; break; // &NotSquareSubsetEqual -> ⋢ + case 5718: state = 5719; break; // &NotSquareSuperset -> ⊐̸ + case 5724: state = 5725; break; // &NotSquareSupersetEqual -> ⋣ + case 5730: state = 5731; break; // &NotSubset -> ⊂⃒ + case 5736: state = 5737; break; // &NotSubsetEqual -> ⊈ + case 5743: state = 5744; break; // &NotSucceeds -> ⊁ + case 5749: state = 5750; break; // &NotSucceedsEqual -> ⪰̸ + case 5760: state = 5761; break; // &NotSucceedsSlantEqual -> ⋡ + case 5766: state = 5767; break; // &NotSucceedsTilde -> ≿̸ + case 5773: state = 5774; break; // &NotSuperset -> ⊃⃒ + case 5779: state = 5780; break; // &NotSupersetEqual -> ⊉ + case 5785: state = 5786; break; // &NotTilde -> ≁ + case 5791: state = 5792; break; // &NotTildeEqual -> ≄ + case 5801: state = 5802; break; // &NotTildeFullEqual -> ≇ + case 5807: state = 5808; break; // &NotTildeTilde -> ≉ + case 5819: state = 5820; break; // &NotVerticalBar -> ∤ + case 5823: state = 5824; break; // &npar -> ∦ + case 5829: state = 5830; break; // &nparallel -> ∦ + case 5832: state = 5833; break; // &nparsl -> ⫽⃥ + case 5834: state = 5835; break; // &npart -> ∂̸ + case 5840: state = 5841; break; // &npolint -> ⨔ + case 5842: state = 5843; break; // &npr -> ⊀ + case 5846: state = 5847; break; // &nprcue -> ⋠ + case 5848: state = 5849; break; // &npre -> ⪯̸ + case 5850: state = 5851; break; // &nprec -> ⊀ + case 5853: state = 5854; break; // &npreceq -> ⪯̸ + case 5858: state = 5859; break; // &nrArr -> ⇏ + case 5862: state = 5863; break; // &nrarr -> ↛ + case 5864: state = 5865; break; // &nrarrc -> ⤳̸ + case 5866: state = 5867; break; // &nrarrw -> ↝̸ + case 5877: state = 5878; break; // &nRightarrow -> ⇏ + case 5887: state = 5888; break; // &nrightarrow -> ↛ + case 5891: state = 5892; break; // &nrtri -> ⋫ + case 5893: state = 5894; break; // &nrtrie -> ⋭ + case 5896: state = 5897; break; // &nsc -> ⊁ + case 5900: state = 5901; break; // &nsccue -> ⋡ + case 5902: state = 5903; break; // &nsce -> ⪰̸ + case 5906: state = 5907; break; // &Nscr -> 𝒩 + case 5908: state = 5909; break; // &nscr -> 𝓃 + case 5916: state = 5917; break; // &nshortmid -> ∤ + case 5925: state = 5926; break; // &nshortparallel -> ∦ + case 5928: state = 5929; break; // &nsim -> ≁ + case 5930: state = 5931; break; // &nsime -> ≄ + case 5932: state = 5933; break; // &nsimeq -> ≄ + case 5936: state = 5937; break; // &nsmid -> ∤ + case 5940: state = 5941; break; // &nspar -> ∦ + case 5946: state = 5947; break; // &nsqsube -> ⋢ + case 5949: state = 5950; break; // &nsqsupe -> ⋣ + case 5952: state = 5953; break; // &nsub -> ⊄ + case 5954: state = 5955; break; // &nsubE -> ⫅̸ + case 5956: state = 5957; break; // &nsube -> ⊈ + case 5960: state = 5961; break; // &nsubset -> ⊂⃒ + case 5963: state = 5964; break; // &nsubseteq -> ⊈ + case 5965: state = 5966; break; // &nsubseteqq -> ⫅̸ + case 5968: state = 5969; break; // &nsucc -> ⊁ + case 5971: state = 5972; break; // &nsucceq -> ⪰̸ + case 5973: state = 5974; break; // &nsup -> ⊅ + case 5975: state = 5976; break; // &nsupE -> ⫆̸ + case 5977: state = 5978; break; // &nsupe -> ⊉ + case 5981: state = 5982; break; // &nsupset -> ⊃⃒ + case 5984: state = 5985; break; // &nsupseteq -> ⊉ + case 5986: state = 5987; break; // &nsupseteqq -> ⫆̸ + case 5990: state = 5991; break; // &ntgl -> ≹ + case 5996: state = 5997; break; // Ñ -> Ñ + case 6001: state = 6002; break; // ñ -> ñ + case 6004: state = 6005; break; // &ntlg -> ≸ + case 6016: state = 6017; break; // &ntriangleleft -> ⋪ + case 6019: state = 6020; break; // &ntrianglelefteq -> ⋬ + case 6025: state = 6026; break; // &ntriangleright -> ⋫ + case 6028: state = 6029; break; // &ntrianglerighteq -> ⋭ + case 6030: state = 6031; break; // &Nu -> Ν + case 6032: state = 6033; break; // &nu -> ν + case 6034: state = 6035; break; // &num -> # + case 6038: state = 6039; break; // &numero -> № + case 6041: state = 6042; break; // &numsp ->   + case 6045: state = 6046; break; // &nvap -> ≍⃒ + case 6051: state = 6052; break; // &nVDash -> ⊯ + case 6056: state = 6057; break; // &nVdash -> ⊮ + case 6061: state = 6062; break; // &nvDash -> ⊭ + case 6066: state = 6067; break; // &nvdash -> ⊬ + case 6069: state = 6070; break; // &nvge -> ≥⃒ + case 6071: state = 6072; break; // &nvgt -> >⃒ + case 6076: state = 6077; break; // &nvHarr -> ⤄ + case 6082: state = 6083; break; // &nvinfin -> ⧞ + case 6087: state = 6088; break; // &nvlArr -> ⤂ + case 6089: state = 6090; break; // &nvle -> ≤⃒ + case 6091: state = 6092; break; // &nvlt -> <⃒ + case 6095: state = 6096; break; // &nvltrie -> ⊴⃒ + case 6100: state = 6101; break; // &nvrArr -> ⤃ + case 6105: state = 6106; break; // &nvrtrie -> ⊵⃒ + case 6109: state = 6110; break; // &nvsim -> ∼⃒ + case 6115: state = 6116; break; // &nwarhk -> ⤣ + case 6119: state = 6120; break; // &nwArr -> ⇖ + case 6121: state = 6122; break; // &nwarr -> ↖ + case 6124: state = 6125; break; // &nwarrow -> ↖ + case 6129: state = 6130; break; // &nwnear -> ⤧ + case 6136: state = 6137; break; // Ó -> Ó + case 6143: state = 6144; break; // ó -> ó + case 6146: state = 6147; break; // &oast -> ⊛ + case 6150: state = 6151; break; // &ocir -> ⊚ + case 6155: state = 6156; break; // Ô -> Ô + case 6157: state = 6158; break; // ô -> ô + case 6159: state = 6160; break; // &Ocy -> О + case 6161: state = 6162; break; // &ocy -> о + case 6166: state = 6167; break; // &odash -> ⊝ + case 6172: state = 6173; break; // &Odblac -> Ő + case 6177: state = 6178; break; // &odblac -> ő + case 6180: state = 6181; break; // &odiv -> ⨸ + case 6183: state = 6184; break; // &odot -> ⊙ + case 6188: state = 6189; break; // &odsold -> ⦼ + case 6193: state = 6194; break; // &OElig -> Œ + case 6198: state = 6199; break; // &oelig -> œ + case 6203: state = 6204; break; // &ofcir -> ⦿ + case 6206: state = 6207; break; // &Ofr -> 𝔒 + case 6208: state = 6209; break; // &ofr -> 𝔬 + case 6212: state = 6213; break; // &ogon -> ˛ + case 6218: state = 6219; break; // Ò -> Ò + case 6223: state = 6224; break; // ò -> ò + case 6225: state = 6226; break; // &ogt -> ⧁ + case 6230: state = 6231; break; // &ohbar -> ⦵ + case 6232: state = 6233; break; // &ohm -> Ω + case 6236: state = 6237; break; // &oint -> ∮ + case 6241: state = 6242; break; // &olarr -> ↺ + case 6245: state = 6246; break; // &olcir -> ⦾ + case 6250: state = 6251; break; // &olcross -> ⦻ + case 6254: state = 6255; break; // &oline -> ‾ + case 6256: state = 6257; break; // &olt -> ⧀ + case 6261: state = 6262; break; // &Omacr -> Ō + case 6266: state = 6267; break; // &omacr -> ō + case 6270: state = 6271; break; // &Omega -> Ω + case 6274: state = 6275; break; // &omega -> ω + case 6280: state = 6281; break; // &Omicron -> Ο + case 6286: state = 6287; break; // &omicron -> ο + case 6288: state = 6289; break; // &omid -> ⦶ + case 6292: state = 6293; break; // &ominus -> ⊖ + case 6296: state = 6297; break; // &Oopf -> 𝕆 + case 6300: state = 6301; break; // &oopf -> 𝕠 + case 6304: state = 6305; break; // &opar -> ⦷ + case 6324: state = 6325; break; // &OpenCurlyDoubleQuote -> “ + case 6330: state = 6331; break; // &OpenCurlyQuote -> ‘ + case 6334: state = 6335; break; // &operp -> ⦹ + case 6338: state = 6339; break; // &oplus -> ⊕ + case 6340: state = 6341; break; // &Or -> ⩔ + case 6342: state = 6343; break; // &or -> ∨ + case 6346: state = 6347; break; // &orarr -> ↻ + case 6348: state = 6349; break; // &ord -> ⩝ + case 6351: state = 6352; break; // &order -> ℴ + case 6354: state = 6355; break; // &orderof -> ℴ + case 6356: state = 6357; break; // ª -> ª + case 6358: state = 6359; break; // º -> º + case 6363: state = 6364; break; // &origof -> ⊶ + case 6366: state = 6367; break; // &oror -> ⩖ + case 6372: state = 6373; break; // &orslope -> ⩗ + case 6374: state = 6375; break; // &orv -> ⩛ + case 6376: state = 6377; break; // &oS -> Ⓢ + case 6380: state = 6381; break; // &Oscr -> 𝒪 + case 6384: state = 6385; break; // &oscr -> ℴ + case 6389: state = 6390; break; // Ø -> Ø + case 6394: state = 6395; break; // ø -> ø + case 6397: state = 6398; break; // &osol -> ⊘ + case 6403: state = 6404; break; // Õ -> Õ + case 6409: state = 6410; break; // õ -> õ + case 6413: state = 6414; break; // &Otimes -> ⨷ + case 6417: state = 6418; break; // &otimes -> ⊗ + case 6420: state = 6421; break; // &otimesas -> ⨶ + case 6424: state = 6425; break; // Ö -> Ö + case 6428: state = 6429; break; // ö -> ö + case 6433: state = 6434; break; // &ovbar -> ⌽ + case 6440: state = 6441; break; // &OverBar -> ‾ + case 6445: state = 6446; break; // &OverBrace -> ⏞ + case 6449: state = 6450; break; // &OverBracket -> ⎴ + case 6461: state = 6462; break; // &OverParenthesis -> ⏜ + case 6465: state = 6466; break; // &par -> ∥ + case 6467: state = 6468; break; // ¶ -> ¶ + case 6472: state = 6473; break; // ¶llel -> ∥ + case 6476: state = 6477; break; // &parsim -> ⫳ + case 6478: state = 6479; break; // &parsl -> ⫽ + case 6480: state = 6481; break; // &part -> ∂ + case 6489: state = 6490; break; // &PartialD -> ∂ + case 6492: state = 6493; break; // &Pcy -> П + case 6495: state = 6496; break; // &pcy -> п + case 6501: state = 6502; break; // &percnt -> % + case 6505: state = 6506; break; // &period -> . + case 6509: state = 6510; break; // &permil -> ‰ + case 6511: state = 6512; break; // &perp -> ⊥ + case 6516: state = 6517; break; // &pertenk -> ‱ + case 6519: state = 6520; break; // &Pfr -> 𝔓 + case 6522: state = 6523; break; // &pfr -> 𝔭 + case 6525: state = 6526; break; // &Phi -> Φ + case 6528: state = 6529; break; // &phi -> φ + case 6530: state = 6531; break; // &phiv -> ϕ + case 6535: state = 6536; break; // &phmmat -> ℳ + case 6539: state = 6540; break; // &phone -> ☎ + case 6541: state = 6542; break; // &Pi -> Π + case 6543: state = 6544; break; // &pi -> π + case 6551: state = 6552; break; // &pitchfork -> ⋔ + case 6553: state = 6554; break; // &piv -> ϖ + case 6559: state = 6560; break; // &planck -> ℏ + case 6561: state = 6562; break; // &planckh -> ℎ + case 6564: state = 6565; break; // &plankv -> ℏ + case 6567: state = 6568; break; // &plus -> + + case 6572: state = 6573; break; // &plusacir -> ⨣ + case 6574: state = 6575; break; // &plusb -> ⊞ + case 6578: state = 6579; break; // &pluscir -> ⨢ + case 6581: state = 6582; break; // &plusdo -> ∔ + case 6583: state = 6584; break; // &plusdu -> ⨥ + case 6585: state = 6586; break; // &pluse -> ⩲ + case 6594: state = 6595; break; // &PlusMinus -> ± + case 6597: state = 6598; break; // ± -> ± + case 6601: state = 6602; break; // &plussim -> ⨦ + case 6605: state = 6606; break; // &plustwo -> ⨧ + case 6607: state = 6608; break; // &pm -> ± + case 6620: state = 6621; break; // &Poincareplane -> ℌ + case 6628: state = 6629; break; // &pointint -> ⨕ + case 6631: state = 6632; break; // &Popf -> ℙ + case 6634: state = 6635; break; // &popf -> 𝕡 + case 6638: state = 6639; break; // £ -> £ + case 6640: state = 6641; break; // &Pr -> ⪻ + case 6642: state = 6643; break; // &pr -> ≺ + case 6645: state = 6646; break; // &prap -> ⪷ + case 6649: state = 6650; break; // &prcue -> ≼ + case 6651: state = 6652; break; // &prE -> ⪳ + case 6653: state = 6654; break; // &pre -> ⪯ + case 6655: state = 6656; break; // &prec -> ≺ + case 6662: state = 6663; break; // &precapprox -> ⪷ + case 6670: state = 6671; break; // &preccurlyeq -> ≼ + case 6677: state = 6678; break; // &Precedes -> ≺ + case 6683: state = 6684; break; // &PrecedesEqual -> ⪯ + case 6694: state = 6695; break; // &PrecedesSlantEqual -> ≼ + case 6700: state = 6701; break; // &PrecedesTilde -> ≾ + case 6703: state = 6704; break; // &preceq -> ⪯ + case 6711: state = 6712; break; // &precnapprox -> ⪹ + case 6715: state = 6716; break; // &precneqq -> ⪵ + case 6719: state = 6720; break; // &precnsim -> ⋨ + case 6723: state = 6724; break; // &precsim -> ≾ + case 6727: state = 6728; break; // &Prime -> ″ + case 6731: state = 6732; break; // &prime -> ′ + case 6733: state = 6734; break; // &primes -> ℙ + case 6737: state = 6738; break; // &prnap -> ⪹ + case 6739: state = 6740; break; // &prnE -> ⪵ + case 6743: state = 6744; break; // &prnsim -> ⋨ + case 6746: state = 6747; break; // &prod -> ∏ + case 6752: state = 6753; break; // &Product -> ∏ + case 6758: state = 6759; break; // &profalar -> ⌮ + case 6763: state = 6764; break; // &profline -> ⌒ + case 6768: state = 6769; break; // &profsurf -> ⌓ + case 6770: state = 6771; break; // &prop -> ∝ + case 6778: state = 6779; break; // &Proportion -> ∷ + case 6781: state = 6782; break; // &Proportional -> ∝ + case 6784: state = 6785; break; // &propto -> ∝ + case 6788: state = 6789; break; // &prsim -> ≾ + case 6793: state = 6794; break; // &prurel -> ⊰ + case 6797: state = 6798; break; // &Pscr -> 𝒫 + case 6801: state = 6802; break; // &pscr -> 𝓅 + case 6803: state = 6804; break; // &Psi -> Ψ + case 6805: state = 6806; break; // &psi -> ψ + case 6811: state = 6812; break; // &puncsp ->   + case 6815: state = 6816; break; // &Qfr -> 𝔔 + case 6819: state = 6820; break; // &qfr -> 𝔮 + case 6823: state = 6824; break; // &qint -> ⨌ + case 6827: state = 6828; break; // &Qopf -> ℚ + case 6831: state = 6832; break; // &qopf -> 𝕢 + case 6837: state = 6838; break; // &qprime -> ⁗ + case 6841: state = 6842; break; // &Qscr -> 𝒬 + case 6845: state = 6846; break; // &qscr -> 𝓆 + case 6856: state = 6857; break; // &quaternions -> ℍ + case 6860: state = 6861; break; // &quatint -> ⨖ + case 6864: state = 6865; break; // &quest -> ? + case 6867: state = 6868; break; // &questeq -> ≟ + case 6871: state = 6872; break; // " -> " + case 6874: state = 6875; break; // " -> " + case 6880: state = 6881; break; // &rAarr -> ⇛ + case 6884: state = 6885; break; // &race -> ∽̱ + case 6891: state = 6892; break; // &Racute -> Ŕ + case 6895: state = 6896; break; // &racute -> ŕ + case 6899: state = 6900; break; // &radic -> √ + case 6906: state = 6907; break; // &raemptyv -> ⦳ + case 6909: state = 6910; break; // &Rang -> ⟫ + case 6912: state = 6913; break; // &rang -> ⟩ + case 6914: state = 6915; break; // &rangd -> ⦒ + case 6916: state = 6917; break; // &range -> ⦥ + case 6919: state = 6920; break; // &rangle -> ⟩ + case 6923: state = 6924; break; // » -> » + case 6926: state = 6927; break; // &Rarr -> ↠ + case 6929: state = 6930; break; // &rArr -> ⇒ + case 6932: state = 6933; break; // &rarr -> → + case 6935: state = 6936; break; // &rarrap -> ⥵ + case 6937: state = 6938; break; // &rarrb -> ⇥ + case 6940: state = 6941; break; // &rarrbfs -> ⤠ + case 6942: state = 6943; break; // &rarrc -> ⤳ + case 6945: state = 6946; break; // &rarrfs -> ⤞ + case 6948: state = 6949; break; // &rarrhk -> ↪ + case 6951: state = 6952; break; // &rarrlp -> ↬ + case 6954: state = 6955; break; // &rarrpl -> ⥅ + case 6958: state = 6959; break; // &rarrsim -> ⥴ + case 6961: state = 6962; break; // &Rarrtl -> ⤖ + case 6964: state = 6965; break; // &rarrtl -> ↣ + case 6966: state = 6967; break; // &rarrw -> ↝ + case 6971: state = 6972; break; // &rAtail -> ⤜ + case 6976: state = 6977; break; // &ratail -> ⤚ + case 6979: state = 6980; break; // &ratio -> ∶ + case 6984: state = 6985; break; // &rationals -> ℚ + case 6989: state = 6990; break; // &RBarr -> ⤐ + case 6994: state = 6995; break; // &rBarr -> ⤏ + case 6999: state = 7000; break; // &rbarr -> ⤍ + case 7003: state = 7004; break; // &rbbrk -> ❳ + case 7008: state = 7009; break; // &rbrace -> } + case 7010: state = 7011; break; // &rbrack -> ] + case 7013: state = 7014; break; // &rbrke -> ⦌ + case 7017: state = 7018; break; // &rbrksld -> ⦎ + case 7019: state = 7020; break; // &rbrkslu -> ⦐ + case 7025: state = 7026; break; // &Rcaron -> Ř + case 7031: state = 7032; break; // &rcaron -> ř + case 7036: state = 7037; break; // &Rcedil -> Ŗ + case 7041: state = 7042; break; // &rcedil -> ŗ + case 7044: state = 7045; break; // &rceil -> ⌉ + case 7047: state = 7048; break; // &rcub -> } + case 7049: state = 7050; break; // &Rcy -> Р + case 7051: state = 7052; break; // &rcy -> р + case 7055: state = 7056; break; // &rdca -> ⤷ + case 7061: state = 7062; break; // &rdldhar -> ⥩ + case 7065: state = 7066; break; // &rdquo -> ” + case 7067: state = 7068; break; // &rdquor -> ” + case 7070: state = 7071; break; // &rdsh -> ↳ + case 7072: state = 7073; break; // &Re -> ℜ + case 7076: state = 7077; break; // &real -> ℜ + case 7080: state = 7081; break; // &realine -> ℛ + case 7085: state = 7086; break; // &realpart -> ℜ + case 7087: state = 7088; break; // &reals -> ℝ + case 7090: state = 7091; break; // &rect -> ▭ + case 7093: state = 7094; break; // ® -> ® + case 7095: state = 7096; break; // ® -> ® + case 7108: state = 7109; break; // &ReverseElement -> ∋ + case 7119: state = 7120; break; // &ReverseEquilibrium -> ⇋ + case 7133: state = 7134; break; // &ReverseUpEquilibrium -> ⥯ + case 7139: state = 7140; break; // &rfisht -> ⥽ + case 7144: state = 7145; break; // &rfloor -> ⌋ + case 7147: state = 7148; break; // &Rfr -> ℜ + case 7149: state = 7150; break; // &rfr -> 𝔯 + case 7153: state = 7154; break; // &rHar -> ⥤ + case 7158: state = 7159; break; // &rhard -> ⇁ + case 7160: state = 7161; break; // &rharu -> ⇀ + case 7162: state = 7163; break; // &rharul -> ⥬ + case 7165: state = 7166; break; // &Rho -> Ρ + case 7167: state = 7168; break; // &rho -> ρ + case 7169: state = 7170; break; // &rhov -> ϱ + case 7186: state = 7187; break; // &RightAngleBracket -> ⟩ + case 7191: state = 7192; break; // &RightArrow -> → + case 7197: state = 7198; break; // &Rightarrow -> ⇒ + case 7207: state = 7208; break; // &rightarrow -> → + case 7211: state = 7212; break; // &RightArrowBar -> ⇥ + case 7221: state = 7222; break; // &RightArrowLeftArrow -> ⇄ + case 7226: state = 7227; break; // &rightarrowtail -> ↣ + case 7234: state = 7235; break; // &RightCeiling -> ⌉ + case 7248: state = 7249; break; // &RightDoubleBracket -> ⟧ + case 7260: state = 7261; break; // &RightDownTeeVector -> ⥝ + case 7267: state = 7268; break; // &RightDownVector -> ⇂ + case 7271: state = 7272; break; // &RightDownVectorBar -> ⥕ + case 7277: state = 7278; break; // &RightFloor -> ⌋ + case 7289: state = 7290; break; // &rightharpoondown -> ⇁ + case 7292: state = 7293; break; // &rightharpoonup -> ⇀ + case 7303: state = 7304; break; // &rightleftarrows -> ⇄ + case 7312: state = 7313; break; // &rightleftharpoons -> ⇌ + case 7324: state = 7325; break; // &rightrightarrows -> ⇉ + case 7335: state = 7336; break; // &rightsquigarrow -> ↝ + case 7339: state = 7340; break; // &RightTee -> ⊢ + case 7345: state = 7346; break; // &RightTeeArrow -> ↦ + case 7352: state = 7353; break; // &RightTeeVector -> ⥛ + case 7363: state = 7364; break; // &rightthreetimes -> ⋌ + case 7371: state = 7372; break; // &RightTriangle -> ⊳ + case 7375: state = 7376; break; // &RightTriangleBar -> ⧐ + case 7381: state = 7382; break; // &RightTriangleEqual -> ⊵ + case 7394: state = 7395; break; // &RightUpDownVector -> ⥏ + case 7404: state = 7405; break; // &RightUpTeeVector -> ⥜ + case 7411: state = 7412; break; // &RightUpVector -> ↾ + case 7415: state = 7416; break; // &RightUpVectorBar -> ⥔ + case 7422: state = 7423; break; // &RightVector -> ⇀ + case 7426: state = 7427; break; // &RightVectorBar -> ⥓ + case 7429: state = 7430; break; // &ring -> ˚ + case 7440: state = 7441; break; // &risingdotseq -> ≓ + case 7445: state = 7446; break; // &rlarr -> ⇄ + case 7449: state = 7450; break; // &rlhar -> ⇌ + case 7451: state = 7452; break; // &rlm -> ‏ + case 7457: state = 7458; break; // &rmoust -> ⎱ + case 7462: state = 7463; break; // &rmoustache -> ⎱ + case 7467: state = 7468; break; // &rnmid -> ⫮ + case 7472: state = 7473; break; // &roang -> ⟭ + case 7475: state = 7476; break; // &roarr -> ⇾ + case 7479: state = 7480; break; // &robrk -> ⟧ + case 7483: state = 7484; break; // &ropar -> ⦆ + case 7487: state = 7488; break; // &Ropf -> ℝ + case 7489: state = 7490; break; // &ropf -> 𝕣 + case 7493: state = 7494; break; // &roplus -> ⨮ + case 7499: state = 7500; break; // &rotimes -> ⨵ + case 7510: state = 7511; break; // &RoundImplies -> ⥰ + case 7514: state = 7515; break; // &rpar -> ) + case 7517: state = 7518; break; // &rpargt -> ⦔ + case 7524: state = 7525; break; // &rppolint -> ⨒ + case 7529: state = 7530; break; // &rrarr -> ⇉ + case 7540: state = 7541; break; // &Rrightarrow -> ⇛ + case 7546: state = 7547; break; // &rsaquo -> › + case 7550: state = 7551; break; // &Rscr -> ℛ + case 7553: state = 7554; break; // &rscr -> 𝓇 + case 7555: state = 7556; break; // &Rsh -> ↱ + case 7557: state = 7558; break; // &rsh -> ↱ + case 7560: state = 7561; break; // &rsqb -> ] + case 7563: state = 7564; break; // &rsquo -> ’ + case 7565: state = 7566; break; // &rsquor -> ’ + case 7571: state = 7572; break; // &rthree -> ⋌ + case 7576: state = 7577; break; // &rtimes -> ⋊ + case 7579: state = 7580; break; // &rtri -> ▹ + case 7581: state = 7582; break; // &rtrie -> ⊵ + case 7583: state = 7584; break; // &rtrif -> ▸ + case 7588: state = 7589; break; // &rtriltri -> ⧎ + case 7599: state = 7600; break; // &RuleDelayed -> ⧴ + case 7606: state = 7607; break; // &ruluhar -> ⥨ + case 7608: state = 7609; break; // &rx -> ℞ + case 7615: state = 7616; break; // &Sacute -> Ś + case 7622: state = 7623; break; // &sacute -> ś + case 7627: state = 7628; break; // &sbquo -> ‚ + case 7629: state = 7630; break; // &Sc -> ⪼ + case 7631: state = 7632; break; // &sc -> ≻ + case 7634: state = 7635; break; // &scap -> ⪸ + case 7639: state = 7640; break; // &Scaron -> Š + case 7643: state = 7644; break; // &scaron -> š + case 7647: state = 7648; break; // &sccue -> ≽ + case 7649: state = 7650; break; // &scE -> ⪴ + case 7651: state = 7652; break; // &sce -> ⪰ + case 7656: state = 7657; break; // &Scedil -> Ş + case 7660: state = 7661; break; // &scedil -> ş + case 7664: state = 7665; break; // &Scirc -> Ŝ + case 7668: state = 7669; break; // &scirc -> ŝ + case 7672: state = 7673; break; // &scnap -> ⪺ + case 7674: state = 7675; break; // &scnE -> ⪶ + case 7678: state = 7679; break; // &scnsim -> ⋩ + case 7685: state = 7686; break; // &scpolint -> ⨓ + case 7689: state = 7690; break; // &scsim -> ≿ + case 7691: state = 7692; break; // &Scy -> С + case 7693: state = 7694; break; // &scy -> с + case 7697: state = 7698; break; // &sdot -> ⋅ + case 7699: state = 7700; break; // &sdotb -> ⊡ + case 7701: state = 7702; break; // &sdote -> ⩦ + case 7707: state = 7708; break; // &searhk -> ⤥ + case 7711: state = 7712; break; // &seArr -> ⇘ + case 7713: state = 7714; break; // &searr -> ↘ + case 7716: state = 7717; break; // &searrow -> ↘ + case 7719: state = 7720; break; // § -> § + case 7722: state = 7723; break; // &semi -> ; + case 7727: state = 7728; break; // &seswar -> ⤩ + case 7734: state = 7735; break; // &setminus -> ∖ + case 7736: state = 7737; break; // &setmn -> ∖ + case 7739: state = 7740; break; // &sext -> ✶ + case 7742: state = 7743; break; // &Sfr -> 𝔖 + case 7745: state = 7746; break; // &sfr -> 𝔰 + case 7749: state = 7750; break; // &sfrown -> ⌢ + case 7754: state = 7755; break; // &sharp -> ♯ + case 7760: state = 7761; break; // &SHCHcy -> Щ + case 7765: state = 7766; break; // &shchcy -> щ + case 7768: state = 7769; break; // &SHcy -> Ш + case 7770: state = 7771; break; // &shcy -> ш + case 7784: state = 7785; break; // &ShortDownArrow -> ↓ + case 7794: state = 7795; break; // &ShortLeftArrow -> ← + case 7801: state = 7802; break; // &shortmid -> ∣ + case 7810: state = 7811; break; // &shortparallel -> ∥ + case 7821: state = 7822; break; // &ShortRightArrow -> → + case 7829: state = 7830; break; // &ShortUpArrow -> ↑ + case 7831: state = 7832; break; // ­ -> ­ + case 7836: state = 7837; break; // &Sigma -> Σ + case 7841: state = 7842; break; // &sigma -> σ + case 7843: state = 7844; break; // &sigmaf -> ς + case 7845: state = 7846; break; // &sigmav -> ς + case 7847: state = 7848; break; // &sim -> ∼ + case 7851: state = 7852; break; // &simdot -> ⩪ + case 7853: state = 7854; break; // &sime -> ≃ + case 7855: state = 7856; break; // &simeq -> ≃ + case 7857: state = 7858; break; // &simg -> ⪞ + case 7859: state = 7860; break; // &simgE -> ⪠ + case 7861: state = 7862; break; // &siml -> ⪝ + case 7863: state = 7864; break; // &simlE -> ⪟ + case 7866: state = 7867; break; // &simne -> ≆ + case 7871: state = 7872; break; // &simplus -> ⨤ + case 7876: state = 7877; break; // &simrarr -> ⥲ + case 7881: state = 7882; break; // &slarr -> ← + case 7892: state = 7893; break; // &SmallCircle -> ∘ + case 7905: state = 7906; break; // &smallsetminus -> ∖ + case 7909: state = 7910; break; // &smashp -> ⨳ + case 7916: state = 7917; break; // &smeparsl -> ⧤ + case 7919: state = 7920; break; // &smid -> ∣ + case 7922: state = 7923; break; // &smile -> ⌣ + case 7924: state = 7925; break; // &smt -> ⪪ + case 7926: state = 7927; break; // &smte -> ⪬ + case 7928: state = 7929; break; // &smtes -> ⪬︀ + case 7934: state = 7935; break; // &SOFTcy -> Ь + case 7940: state = 7941; break; // &softcy -> ь + case 7942: state = 7943; break; // &sol -> / + case 7944: state = 7945; break; // &solb -> ⧄ + case 7947: state = 7948; break; // &solbar -> ⌿ + case 7951: state = 7952; break; // &Sopf -> 𝕊 + case 7954: state = 7955; break; // &sopf -> 𝕤 + case 7960: state = 7961; break; // &spades -> ♠ + case 7964: state = 7965; break; // &spadesuit -> ♠ + case 7966: state = 7967; break; // &spar -> ∥ + case 7971: state = 7972; break; // &sqcap -> ⊓ + case 7973: state = 7974; break; // &sqcaps -> ⊓︀ + case 7976: state = 7977; break; // &sqcup -> ⊔ + case 7978: state = 7979; break; // &sqcups -> ⊔︀ + case 7982: state = 7983; break; // &Sqrt -> √ + case 7986: state = 7987; break; // &sqsub -> ⊏ + case 7988: state = 7989; break; // &sqsube -> ⊑ + case 7992: state = 7993; break; // &sqsubset -> ⊏ + case 7995: state = 7996; break; // &sqsubseteq -> ⊑ + case 7997: state = 7998; break; // &sqsup -> ⊐ + case 7999: state = 8000; break; // &sqsupe -> ⊒ + case 8003: state = 8004; break; // &sqsupset -> ⊐ + case 8006: state = 8007; break; // &sqsupseteq -> ⊒ + case 8008: state = 8009; break; // &squ -> □ + case 8013: state = 8014; break; // &Square -> □ + case 8017: state = 8018; break; // &square -> □ + case 8030: state = 8031; break; // &SquareIntersection -> ⊓ + case 8037: state = 8038; break; // &SquareSubset -> ⊏ + case 8043: state = 8044; break; // &SquareSubsetEqual -> ⊑ + case 8050: state = 8051; break; // &SquareSuperset -> ⊐ + case 8056: state = 8057; break; // &SquareSupersetEqual -> ⊒ + case 8062: state = 8063; break; // &SquareUnion -> ⊔ + case 8064: state = 8065; break; // &squarf -> ▪ + case 8066: state = 8067; break; // &squf -> ▪ + case 8071: state = 8072; break; // &srarr -> → + case 8075: state = 8076; break; // &Sscr -> 𝒮 + case 8079: state = 8080; break; // &sscr -> 𝓈 + case 8084: state = 8085; break; // &ssetmn -> ∖ + case 8089: state = 8090; break; // &ssmile -> ⌣ + case 8094: state = 8095; break; // &sstarf -> ⋆ + case 8098: state = 8099; break; // &Star -> ⋆ + case 8102: state = 8103; break; // &star -> ☆ + case 8104: state = 8105; break; // &starf -> ★ + case 8118: state = 8119; break; // &straightepsilon -> ϵ + case 8122: state = 8123; break; // &straightphi -> ϕ + case 8125: state = 8126; break; // &strns -> ¯ + case 8128: state = 8129; break; // &Sub -> ⋐ + case 8131: state = 8132; break; // &sub -> ⊂ + case 8135: state = 8136; break; // &subdot -> ⪽ + case 8137: state = 8138; break; // &subE -> ⫅ + case 8139: state = 8140; break; // &sube -> ⊆ + case 8143: state = 8144; break; // &subedot -> ⫃ + case 8148: state = 8149; break; // &submult -> ⫁ + case 8151: state = 8152; break; // &subnE -> ⫋ + case 8153: state = 8154; break; // &subne -> ⊊ + case 8158: state = 8159; break; // &subplus -> ⪿ + case 8163: state = 8164; break; // &subrarr -> ⥹ + case 8167: state = 8168; break; // &Subset -> ⋐ + case 8171: state = 8172; break; // &subset -> ⊂ + case 8174: state = 8175; break; // &subseteq -> ⊆ + case 8176: state = 8177; break; // &subseteqq -> ⫅ + case 8182: state = 8183; break; // &SubsetEqual -> ⊆ + case 8186: state = 8187; break; // &subsetneq -> ⊊ + case 8188: state = 8189; break; // &subsetneqq -> ⫋ + case 8191: state = 8192; break; // &subsim -> ⫇ + case 8194: state = 8195; break; // &subsub -> ⫕ + case 8196: state = 8197; break; // &subsup -> ⫓ + case 8199: state = 8200; break; // &succ -> ≻ + case 8206: state = 8207; break; // &succapprox -> ⪸ + case 8214: state = 8215; break; // &succcurlyeq -> ≽ + case 8221: state = 8222; break; // &Succeeds -> ≻ + case 8227: state = 8228; break; // &SucceedsEqual -> ⪰ + case 8238: state = 8239; break; // &SucceedsSlantEqual -> ≽ + case 8244: state = 8245; break; // &SucceedsTilde -> ≿ + case 8247: state = 8248; break; // &succeq -> ⪰ + case 8255: state = 8256; break; // &succnapprox -> ⪺ + case 8259: state = 8260; break; // &succneqq -> ⪶ + case 8263: state = 8264; break; // &succnsim -> ⋩ + case 8267: state = 8268; break; // &succsim -> ≿ + case 8273: state = 8274; break; // &SuchThat -> ∋ + case 8275: state = 8276; break; // &Sum -> ∑ + case 8277: state = 8278; break; // &sum -> ∑ + case 8280: state = 8281; break; // &sung -> ♪ + case 8282: state = 8283; break; // &Sup -> ⋑ + case 8284: state = 8285; break; // &sup -> ⊃ + case 8286: state = 8287; break; // ¹ -> ¹ + case 8288: state = 8289; break; // ² -> ² + case 8290: state = 8291; break; // ³ -> ³ + case 8294: state = 8295; break; // &supdot -> ⪾ + case 8298: state = 8299; break; // &supdsub -> ⫘ + case 8300: state = 8301; break; // &supE -> ⫆ + case 8302: state = 8303; break; // &supe -> ⊇ + case 8306: state = 8307; break; // &supedot -> ⫄ + case 8312: state = 8313; break; // &Superset -> ⊃ + case 8318: state = 8319; break; // &SupersetEqual -> ⊇ + case 8323: state = 8324; break; // &suphsol -> ⟉ + case 8326: state = 8327; break; // &suphsub -> ⫗ + case 8331: state = 8332; break; // &suplarr -> ⥻ + case 8336: state = 8337; break; // &supmult -> ⫂ + case 8339: state = 8340; break; // &supnE -> ⫌ + case 8341: state = 8342; break; // &supne -> ⊋ + case 8346: state = 8347; break; // &supplus -> ⫀ + case 8350: state = 8351; break; // &Supset -> ⋑ + case 8354: state = 8355; break; // &supset -> ⊃ + case 8357: state = 8358; break; // &supseteq -> ⊇ + case 8359: state = 8360; break; // &supseteqq -> ⫆ + case 8363: state = 8364; break; // &supsetneq -> ⊋ + case 8365: state = 8366; break; // &supsetneqq -> ⫌ + case 8368: state = 8369; break; // &supsim -> ⫈ + case 8371: state = 8372; break; // &supsub -> ⫔ + case 8373: state = 8374; break; // &supsup -> ⫖ + case 8379: state = 8380; break; // &swarhk -> ⤦ + case 8383: state = 8384; break; // &swArr -> ⇙ + case 8385: state = 8386; break; // &swarr -> ↙ + case 8388: state = 8389; break; // &swarrow -> ↙ + case 8393: state = 8394; break; // &swnwar -> ⤪ + case 8398: state = 8399; break; // ß -> ß + case 8402: state = 8403; break; // &Tab -> + case 8409: state = 8410; break; // &target -> ⌖ + case 8411: state = 8412; break; // &Tau -> Τ + case 8413: state = 8414; break; // &tau -> τ + case 8417: state = 8418; break; // &tbrk -> ⎴ + case 8423: state = 8424; break; // &Tcaron -> Ť + case 8429: state = 8430; break; // &tcaron -> ť + case 8434: state = 8435; break; // &Tcedil -> Ţ + case 8439: state = 8440; break; // &tcedil -> ţ + case 8441: state = 8442; break; // &Tcy -> Т + case 8443: state = 8444; break; // &tcy -> т + case 8447: state = 8448; break; // &tdot -> ⃛ + case 8453: state = 8454; break; // &telrec -> ⌕ + case 8456: state = 8457; break; // &Tfr -> 𝔗 + case 8459: state = 8460; break; // &tfr -> 𝔱 + case 8465: state = 8466; break; // &there4 -> ∴ + case 8474: state = 8475; break; // &Therefore -> ∴ + case 8479: state = 8480; break; // &therefore -> ∴ + case 8482: state = 8483; break; // &Theta -> Θ + case 8485: state = 8486; break; // &theta -> θ + case 8489: state = 8490; break; // &thetasym -> ϑ + case 8491: state = 8492; break; // &thetav -> ϑ + case 8501: state = 8502; break; // &thickapprox -> ≈ + case 8505: state = 8506; break; // &thicksim -> ∼ + case 8514: state = 8515; break; // &ThickSpace ->    + case 8518: state = 8519; break; // &thinsp ->   + case 8525: state = 8526; break; // &ThinSpace ->   + case 8529: state = 8530; break; // &thkap -> ≈ + case 8533: state = 8534; break; // &thksim -> ∼ + case 8538: state = 8539; break; // Þ -> Þ + case 8542: state = 8543; break; // þ -> þ + case 8547: state = 8548; break; // &Tilde -> ∼ + case 8552: state = 8553; break; // &tilde -> ˜ + case 8558: state = 8559; break; // &TildeEqual -> ≃ + case 8568: state = 8569; break; // &TildeFullEqual -> ≅ + case 8574: state = 8575; break; // &TildeTilde -> ≈ + case 8578: state = 8579; break; // × -> × + case 8580: state = 8581; break; // ×b -> ⊠ + case 8583: state = 8584; break; // ×bar -> ⨱ + case 8585: state = 8586; break; // ×d -> ⨰ + case 8588: state = 8589; break; // &tint -> ∭ + case 8592: state = 8593; break; // &toea -> ⤨ + case 8594: state = 8595; break; // &top -> ⊤ + case 8598: state = 8599; break; // &topbot -> ⌶ + case 8602: state = 8603; break; // &topcir -> ⫱ + case 8606: state = 8607; break; // &Topf -> 𝕋 + case 8608: state = 8609; break; // &topf -> 𝕥 + case 8612: state = 8613; break; // &topfork -> ⫚ + case 8615: state = 8616; break; // &tosa -> ⤩ + case 8621: state = 8622; break; // &tprime -> ‴ + case 8626: state = 8627; break; // &TRADE -> ™ + case 8631: state = 8632; break; // &trade -> ™ + case 8638: state = 8639; break; // &triangle -> ▵ + case 8643: state = 8644; break; // &triangledown -> ▿ + case 8648: state = 8649; break; // &triangleleft -> ◃ + case 8651: state = 8652; break; // &trianglelefteq -> ⊴ + case 8653: state = 8654; break; // &triangleq -> ≜ + case 8659: state = 8660; break; // &triangleright -> ▹ + case 8662: state = 8663; break; // &trianglerighteq -> ⊵ + case 8666: state = 8667; break; // &tridot -> ◬ + case 8668: state = 8669; break; // &trie -> ≜ + case 8674: state = 8675; break; // &triminus -> ⨺ + case 8683: state = 8684; break; // &TripleDot -> ⃛ + case 8688: state = 8689; break; // &triplus -> ⨹ + case 8691: state = 8692; break; // &trisb -> ⧍ + case 8696: state = 8697; break; // &tritime -> ⨻ + case 8703: state = 8704; break; // &trpezium -> ⏢ + case 8707: state = 8708; break; // &Tscr -> 𝒯 + case 8711: state = 8712; break; // &tscr -> 𝓉 + case 8715: state = 8716; break; // &TScy -> Ц + case 8717: state = 8718; break; // &tscy -> ц + case 8721: state = 8722; break; // &TSHcy -> Ћ + case 8725: state = 8726; break; // &tshcy -> ћ + case 8730: state = 8731; break; // &Tstrok -> Ŧ + case 8735: state = 8736; break; // &tstrok -> ŧ + case 8740: state = 8741; break; // &twixt -> ≬ + case 8755: state = 8756; break; // &twoheadleftarrow -> ↞ + case 8766: state = 8767; break; // &twoheadrightarrow -> ↠ + case 8773: state = 8774; break; // Ú -> Ú + case 8780: state = 8781; break; // ú -> ú + case 8783: state = 8784; break; // &Uarr -> ↟ + case 8787: state = 8788; break; // &uArr -> ⇑ + case 8790: state = 8791; break; // &uarr -> ↑ + case 8795: state = 8796; break; // &Uarrocir -> ⥉ + case 8800: state = 8801; break; // &Ubrcy -> Ў + case 8805: state = 8806; break; // &ubrcy -> ў + case 8809: state = 8810; break; // &Ubreve -> Ŭ + case 8813: state = 8814; break; // &ubreve -> ŭ + case 8818: state = 8819; break; // Û -> Û + case 8823: state = 8824; break; // û -> û + case 8825: state = 8826; break; // &Ucy -> У + case 8827: state = 8828; break; // &ucy -> у + case 8832: state = 8833; break; // &udarr -> ⇅ + case 8838: state = 8839; break; // &Udblac -> Ű + case 8843: state = 8844; break; // &udblac -> ű + case 8847: state = 8848; break; // &udhar -> ⥮ + case 8853: state = 8854; break; // &ufisht -> ⥾ + case 8856: state = 8857; break; // &Ufr -> 𝔘 + case 8858: state = 8859; break; // &ufr -> 𝔲 + case 8864: state = 8865; break; // Ù -> Ù + case 8870: state = 8871; break; // ù -> ù + case 8874: state = 8875; break; // &uHar -> ⥣ + case 8879: state = 8880; break; // &uharl -> ↿ + case 8881: state = 8882; break; // &uharr -> ↾ + case 8885: state = 8886; break; // &uhblk -> ▀ + case 8891: state = 8892; break; // &ulcorn -> ⌜ + case 8894: state = 8895; break; // &ulcorner -> ⌜ + case 8898: state = 8899; break; // &ulcrop -> ⌏ + case 8902: state = 8903; break; // &ultri -> ◸ + case 8907: state = 8908; break; // &Umacr -> Ū + case 8912: state = 8913; break; // &umacr -> ū + case 8914: state = 8915; break; // ¨ -> ¨ + case 8922: state = 8923; break; // &UnderBar -> _ + case 8927: state = 8928; break; // &UnderBrace -> ⏟ + case 8931: state = 8932; break; // &UnderBracket -> ⎵ + case 8943: state = 8944; break; // &UnderParenthesis -> ⏝ + case 8947: state = 8948; break; // &Union -> ⋃ + case 8952: state = 8953; break; // &UnionPlus -> ⊎ + case 8957: state = 8958; break; // &Uogon -> Ų + case 8962: state = 8963; break; // &uogon -> ų + case 8965: state = 8966; break; // &Uopf -> 𝕌 + case 8968: state = 8969; break; // &uopf -> 𝕦 + case 8975: state = 8976; break; // &UpArrow -> ↑ + case 8981: state = 8982; break; // &Uparrow -> ⇑ + case 8988: state = 8989; break; // &uparrow -> ↑ + case 8992: state = 8993; break; // &UpArrowBar -> ⤒ + case 9002: state = 9003; break; // &UpArrowDownArrow -> ⇅ + case 9012: state = 9013; break; // &UpDownArrow -> ↕ + case 9022: state = 9023; break; // &Updownarrow -> ⇕ + case 9032: state = 9033; break; // &updownarrow -> ↕ + case 9044: state = 9045; break; // &UpEquilibrium -> ⥮ + case 9056: state = 9057; break; // &upharpoonleft -> ↿ + case 9062: state = 9063; break; // &upharpoonright -> ↾ + case 9066: state = 9067; break; // &uplus -> ⊎ + case 9079: state = 9080; break; // &UpperLeftArrow -> ↖ + case 9090: state = 9091; break; // &UpperRightArrow -> ↗ + case 9093: state = 9094; break; // &Upsi -> ϒ + case 9096: state = 9097; break; // &upsi -> υ + case 9098: state = 9099; break; // &upsih -> ϒ + case 9102: state = 9103; break; // &Upsilon -> Υ + case 9106: state = 9107; break; // &upsilon -> υ + case 9110: state = 9111; break; // &UpTee -> ⊥ + case 9116: state = 9117; break; // &UpTeeArrow -> ↥ + case 9125: state = 9126; break; // &upuparrows -> ⇈ + case 9131: state = 9132; break; // &urcorn -> ⌝ + case 9134: state = 9135; break; // &urcorner -> ⌝ + case 9138: state = 9139; break; // &urcrop -> ⌎ + case 9143: state = 9144; break; // &Uring -> Ů + case 9147: state = 9148; break; // &uring -> ů + case 9151: state = 9152; break; // &urtri -> ◹ + case 9155: state = 9156; break; // &Uscr -> 𝒰 + case 9159: state = 9160; break; // &uscr -> 𝓊 + case 9164: state = 9165; break; // &utdot -> ⋰ + case 9170: state = 9171; break; // &Utilde -> Ũ + case 9175: state = 9176; break; // &utilde -> ũ + case 9178: state = 9179; break; // &utri -> ▵ + case 9180: state = 9181; break; // &utrif -> ▴ + case 9185: state = 9186; break; // &uuarr -> ⇈ + case 9189: state = 9190; break; // Ü -> Ü + case 9192: state = 9193; break; // ü -> ü + case 9199: state = 9200; break; // &uwangle -> ⦧ + case 9206: state = 9207; break; // &vangrt -> ⦜ + case 9215: state = 9216; break; // &varepsilon -> ϵ + case 9221: state = 9222; break; // &varkappa -> ϰ + case 9229: state = 9230; break; // &varnothing -> ∅ + case 9233: state = 9234; break; // &varphi -> ϕ + case 9235: state = 9236; break; // &varpi -> ϖ + case 9241: state = 9242; break; // &varpropto -> ∝ + case 9245: state = 9246; break; // &vArr -> ⇕ + case 9247: state = 9248; break; // &varr -> ↕ + case 9250: state = 9251; break; // &varrho -> ϱ + case 9256: state = 9257; break; // &varsigma -> ς + case 9265: state = 9266; break; // &varsubsetneq -> ⊊︀ + case 9267: state = 9268; break; // &varsubsetneqq -> ⫋︀ + case 9275: state = 9276; break; // &varsupsetneq -> ⊋︀ + case 9277: state = 9278; break; // &varsupsetneqq -> ⫌︀ + case 9283: state = 9284; break; // &vartheta -> ϑ + case 9295: state = 9296; break; // &vartriangleleft -> ⊲ + case 9301: state = 9302; break; // &vartriangleright -> ⊳ + case 9306: state = 9307; break; // &Vbar -> ⫫ + case 9310: state = 9311; break; // &vBar -> ⫨ + case 9312: state = 9313; break; // &vBarv -> ⫩ + case 9315: state = 9316; break; // &Vcy -> В + case 9318: state = 9319; break; // &vcy -> в + case 9323: state = 9324; break; // &VDash -> ⊫ + case 9328: state = 9329; break; // &Vdash -> ⊩ + case 9333: state = 9334; break; // &vDash -> ⊨ + case 9338: state = 9339; break; // &vdash -> ⊢ + case 9340: state = 9341; break; // &Vdashl -> ⫦ + case 9343: state = 9344; break; // &Vee -> ⋁ + case 9346: state = 9347; break; // &vee -> ∨ + case 9350: state = 9351; break; // &veebar -> ⊻ + case 9353: state = 9354; break; // &veeeq -> ≚ + case 9358: state = 9359; break; // &vellip -> ⋮ + case 9363: state = 9364; break; // &Verbar -> ‖ + case 9368: state = 9369; break; // &verbar -> | + case 9370: state = 9371; break; // &Vert -> ‖ + case 9372: state = 9373; break; // &vert -> | + case 9380: state = 9381; break; // &VerticalBar -> ∣ + case 9385: state = 9386; break; // &VerticalLine -> | + case 9395: state = 9396; break; // &VerticalSeparator -> ❘ + case 9401: state = 9402; break; // &VerticalTilde -> ≀ + case 9412: state = 9413; break; // &VeryThinSpace ->   + case 9415: state = 9416; break; // &Vfr -> 𝔙 + case 9418: state = 9419; break; // &vfr -> 𝔳 + case 9423: state = 9424; break; // &vltri -> ⊲ + case 9428: state = 9429; break; // &vnsub -> ⊂⃒ + case 9430: state = 9431; break; // &vnsup -> ⊃⃒ + case 9434: state = 9435; break; // &Vopf -> 𝕍 + case 9438: state = 9439; break; // &vopf -> 𝕧 + case 9443: state = 9444; break; // &vprop -> ∝ + case 9448: state = 9449; break; // &vrtri -> ⊳ + case 9452: state = 9453; break; // &Vscr -> 𝒱 + case 9456: state = 9457; break; // &vscr -> 𝓋 + case 9461: state = 9462; break; // &vsubnE -> ⫋︀ + case 9463: state = 9464; break; // &vsubne -> ⊊︀ + case 9467: state = 9468; break; // &vsupnE -> ⫌︀ + case 9469: state = 9470; break; // &vsupne -> ⊋︀ + case 9475: state = 9476; break; // &Vvdash -> ⊪ + case 9482: state = 9483; break; // &vzigzag -> ⦚ + case 9488: state = 9489; break; // &Wcirc -> Ŵ + case 9494: state = 9495; break; // &wcirc -> ŵ + case 9500: state = 9501; break; // &wedbar -> ⩟ + case 9505: state = 9506; break; // &Wedge -> ⋀ + case 9508: state = 9509; break; // &wedge -> ∧ + case 9510: state = 9511; break; // &wedgeq -> ≙ + case 9515: state = 9516; break; // &weierp -> ℘ + case 9518: state = 9519; break; // &Wfr -> 𝔚 + case 9521: state = 9522; break; // &wfr -> 𝔴 + case 9525: state = 9526; break; // &Wopf -> 𝕎 + case 9529: state = 9530; break; // &wopf -> 𝕨 + case 9531: state = 9532; break; // &wp -> ℘ + case 9533: state = 9534; break; // &wr -> ≀ + case 9538: state = 9539; break; // &wreath -> ≀ + case 9542: state = 9543; break; // &Wscr -> 𝒲 + case 9546: state = 9547; break; // &wscr -> 𝓌 + case 9551: state = 9552; break; // &xcap -> ⋂ + case 9555: state = 9556; break; // &xcirc -> ◯ + case 9558: state = 9559; break; // &xcup -> ⋃ + case 9563: state = 9564; break; // &xdtri -> ▽ + case 9567: state = 9568; break; // &Xfr -> 𝔛 + case 9570: state = 9571; break; // &xfr -> 𝔵 + case 9575: state = 9576; break; // &xhArr -> ⟺ + case 9579: state = 9580; break; // &xharr -> ⟷ + case 9581: state = 9582; break; // &Xi -> Ξ + case 9583: state = 9584; break; // &xi -> ξ + case 9588: state = 9589; break; // &xlArr -> ⟸ + case 9592: state = 9593; break; // &xlarr -> ⟵ + case 9596: state = 9597; break; // &xmap -> ⟼ + case 9600: state = 9601; break; // &xnis -> ⋻ + case 9605: state = 9606; break; // &xodot -> ⨀ + case 9609: state = 9610; break; // &Xopf -> 𝕏 + case 9612: state = 9613; break; // &xopf -> 𝕩 + case 9616: state = 9617; break; // &xoplus -> ⨁ + case 9621: state = 9622; break; // &xotime -> ⨂ + case 9626: state = 9627; break; // &xrArr -> ⟹ + case 9630: state = 9631; break; // &xrarr -> ⟶ + case 9634: state = 9635; break; // &Xscr -> 𝒳 + case 9638: state = 9639; break; // &xscr -> 𝓍 + case 9643: state = 9644; break; // &xsqcup -> ⨆ + case 9649: state = 9650; break; // &xuplus -> ⨄ + case 9653: state = 9654; break; // &xutri -> △ + case 9657: state = 9658; break; // &xvee -> ⋁ + case 9663: state = 9664; break; // &xwedge -> ⋀ + case 9670: state = 9671; break; // Ý -> Ý + case 9677: state = 9678; break; // ý -> ý + case 9681: state = 9682; break; // &YAcy -> Я + case 9683: state = 9684; break; // &yacy -> я + case 9688: state = 9689; break; // &Ycirc -> Ŷ + case 9693: state = 9694; break; // &ycirc -> ŷ + case 9695: state = 9696; break; // &Ycy -> Ы + case 9697: state = 9698; break; // &ycy -> ы + case 9700: state = 9701; break; // ¥ -> ¥ + case 9703: state = 9704; break; // &Yfr -> 𝔜 + case 9706: state = 9707; break; // &yfr -> 𝔶 + case 9710: state = 9711; break; // &YIcy -> Ї + case 9714: state = 9715; break; // &yicy -> ї + case 9718: state = 9719; break; // &Yopf -> 𝕐 + case 9722: state = 9723; break; // &yopf -> 𝕪 + case 9726: state = 9727; break; // &Yscr -> 𝒴 + case 9730: state = 9731; break; // &yscr -> 𝓎 + case 9734: state = 9735; break; // &YUcy -> Ю + case 9738: state = 9739; break; // &yucy -> ю + case 9742: state = 9743; break; // &Yuml -> Ÿ + case 9745: state = 9746; break; // ÿ -> ÿ + case 9752: state = 9753; break; // &Zacute -> Ź + case 9759: state = 9760; break; // &zacute -> ź + case 9765: state = 9766; break; // &Zcaron -> Ž + case 9771: state = 9772; break; // &zcaron -> ž + case 9773: state = 9774; break; // &Zcy -> З + case 9775: state = 9776; break; // &zcy -> з + case 9779: state = 9780; break; // &Zdot -> Ż + case 9783: state = 9784; break; // &zdot -> ż + case 9789: state = 9790; break; // &zeetrf -> ℨ + case 9803: state = 9804; break; // &ZeroWidthSpace -> ​ + case 9806: state = 9807; break; // &Zeta -> Ζ + case 9809: state = 9810; break; // &zeta -> ζ + case 9812: state = 9813; break; // &Zfr -> ℨ + case 9815: state = 9816; break; // &zfr -> 𝔷 + case 9819: state = 9820; break; // &ZHcy -> Ж + case 9823: state = 9824; break; // &zhcy -> ж + case 9830: state = 9831; break; // &zigrarr -> ⇝ + case 9834: state = 9835; break; // &Zopf -> ℤ + case 9838: state = 9839; break; // &zopf -> 𝕫 + case 9842: state = 9843; break; // &Zscr -> 𝒵 + case 9846: state = 9847; break; // &zscr -> 𝓏 + case 9849: state = 9850; break; // &zwj -> ‍ + case 9852: state = 9853; break; // &zwnj -> ‌ default: return false; } break; case 'A': switch (state) { case 0: state = 1; break; // & -> &A - case 1097: state = 1109; break; // &d -> &dA - case 1200: state = 1201; break; // &Diacritical -> &DiacriticalA - case 1212: state = 1213; break; // &DiacriticalDouble -> &DiacriticalDoubleA - case 1366: state = 1367; break; // &DoubleDown -> &DoubleDownA - case 1375: state = 1376; break; // &DoubleLeft -> &DoubleLeftA - case 1385: state = 1386; break; // &DoubleLeftRight -> &DoubleLeftRightA - case 1400: state = 1401; break; // &DoubleLongLeft -> &DoubleLongLeftA - case 1410: state = 1411; break; // &DoubleLongLeftRight -> &DoubleLongLeftRightA - case 1420: state = 1421; break; // &DoubleLongRight -> &DoubleLongRightA - case 1430: state = 1431; break; // &DoubleRight -> &DoubleRightA - case 1440: state = 1441; break; // &DoubleUp -> &DoubleUpA - case 1449: state = 1450; break; // &DoubleUpDown -> &DoubleUpDownA - case 1467: state = 1468; break; // &Down -> &DownA - case 1489: state = 1490; break; // &DownArrowUp -> &DownArrowUpA - case 1584: state = 1585; break; // &DownTee -> &DownTeeA - case 2058: state = 2059; break; // &For -> &ForA - case 2351: state = 2368; break; // &H -> &HA - case 2356: state = 2377; break; // &h -> &hA - case 2881: state = 2882; break; // &l -> &lA - case 3035: state = 3036; break; // &Left -> &LeftA - case 3071: state = 3072; break; // &LeftArrowRight -> &LeftArrowRightA - case 3153: state = 3154; break; // &LeftRight -> &LeftRightA - case 3206: state = 3207; break; // &LeftTee -> &LeftTeeA - case 3481: state = 3482; break; // &LongLeft -> &LongLeftA - case 3511: state = 3512; break; // &LongLeftRight -> &LongLeftRightA - case 3547: state = 3548; break; // &LongRight -> &LongRightA - case 3616: state = 3617; break; // &LowerLeft -> &LowerLeftA - case 3626: state = 3627; break; // &LowerRight -> &LowerRightA - case 3970: state = 3975; break; // &ne -> &neA - case 4101: state = 4102; break; // &nh -> &nhA - case 4121: state = 4122; break; // &nl -> &nlA - case 4621: state = 4622; break; // &nr -> &nrA - case 4792: state = 4793; break; // &nvl -> &nvlA - case 4801: state = 4802; break; // &nvr -> &nvrA - case 4812: state = 4817; break; // &nw -> &nwA - case 5397: state = 5398; break; // &r -> &rA - case 5620: state = 5621; break; // &Right -> &RightA - case 5657: state = 5658; break; // &RightArrowLeft -> &RightArrowLeftA - case 5766: state = 5767; break; // &RightTee -> &RightTeeA - case 6053: state = 6058; break; // &se -> &seA - case 6111: state = 6112; break; // &ShortDown -> &ShortDownA - case 6120: state = 6121; break; // &ShortLeft -> &ShortLeftA - case 6144: state = 6145; break; // &ShortRight -> &ShortRightA - case 6151: state = 6152; break; // &ShortUp -> &ShortUpA - case 6564: state = 6569; break; // &sw -> &swA - case 6756: state = 6757; break; // &TR -> &TRA - case 6879: state = 6887; break; // &u -> &uA - case 7031: state = 7032; break; // &Up -> &UpA - case 7054: state = 7055; break; // &UpArrowDown -> &UpArrowDownA - case 7063: state = 7064; break; // &UpDown -> &UpDownA - case 7123: state = 7124; break; // &UpperLeft -> &UpperLeftA - case 7133: state = 7134; break; // &UpperRight -> &UpperRightA - case 7152: state = 7153; break; // &UpTee -> &UpTeeA - case 7223: state = 7258; break; // &v -> &vA - case 7513: state = 7514; break; // &xh -> &xhA - case 7522: state = 7523; break; // &xl -> &xlA - case 7551: state = 7552; break; // &xr -> &xrA - case 7584: state = 7596; break; // &Y -> &YA + case 1432: state = 1447; break; // &d -> &dA + case 1566: state = 1567; break; // &Diacritical -> &DiacriticalA + case 1580: state = 1581; break; // &DiacriticalDouble -> &DiacriticalDoubleA + case 1769: state = 1770; break; // &DoubleDown -> &DoubleDownA + case 1779: state = 1780; break; // &DoubleLeft -> &DoubleLeftA + case 1790: state = 1791; break; // &DoubleLeftRight -> &DoubleLeftRightA + case 1807: state = 1808; break; // &DoubleLongLeft -> &DoubleLongLeftA + case 1818: state = 1819; break; // &DoubleLongLeftRight -> &DoubleLongLeftRightA + case 1829: state = 1830; break; // &DoubleLongRight -> &DoubleLongRightA + case 1840: state = 1841; break; // &DoubleRight -> &DoubleRightA + case 1852: state = 1853; break; // &DoubleUp -> &DoubleUpA + case 1862: state = 1863; break; // &DoubleUpDown -> &DoubleUpDownA + case 1882: state = 1883; break; // &Down -> &DownA + case 1908: state = 1909; break; // &DownArrowUp -> &DownArrowUpA + case 2015: state = 2017; break; // &DownTee -> &DownTeeA + case 2616: state = 2617; break; // &For -> &ForA + case 3014: state = 3035; break; // &H -> &HA + case 3020: state = 3046; break; // &h -> &hA + case 3692: state = 3693; break; // &l -> &lA + case 3900: state = 3901; break; // &Left -> &LeftA + case 3941: state = 3942; break; // &LeftArrowRight -> &LeftArrowRightA + case 4034: state = 4035; break; // &LeftRight -> &LeftRightA + case 4094: state = 4096; break; // &LeftTee -> &LeftTeeA + case 4440: state = 4441; break; // &LongLeft -> &LongLeftA + case 4473: state = 4474; break; // &LongLeftRight -> &LongLeftRightA + case 4513: state = 4514; break; // &LongRight -> &LongRightA + case 4594: state = 4595; break; // &LowerLeft -> &LowerLeftA + case 4605: state = 4606; break; // &LowerRight -> &LowerRightA + case 5064: state = 5071; break; // &ne -> &neA + case 5227: state = 5228; break; // &nh -> &nhA + case 5256: state = 5257; break; // &nl -> &nlA + case 5855: state = 5856; break; // &nr -> &nrA + case 6084: state = 6085; break; // &nvl -> &nvlA + case 6097: state = 6098; break; // &nvr -> &nvrA + case 6111: state = 6117; break; // &nw -> &nwA + case 6876: state = 6877; break; // &r -> &rA + case 7174: state = 7175; break; // &Right -> &RightA + case 7216: state = 7217; break; // &RightArrowLeft -> &RightArrowLeftA + case 7339: state = 7341; break; // &RightTee -> &RightTeeA + case 7703: state = 7709; break; // &se -> &seA + case 7779: state = 7780; break; // &ShortDown -> &ShortDownA + case 7789: state = 7790; break; // &ShortLeft -> &ShortLeftA + case 7816: state = 7817; break; // &ShortRight -> &ShortRightA + case 7824: state = 7825; break; // &ShortUp -> &ShortUpA + case 8375: state = 8381; break; // &sw -> &swA + case 8623: state = 8624; break; // &TR -> &TRA + case 8775: state = 8785; break; // &u -> &uA + case 8970: state = 8971; break; // &Up -> &UpA + case 8997: state = 8998; break; // &UpArrowDown -> &UpArrowDownA + case 9007: state = 9008; break; // &UpDown -> &UpDownA + case 9074: state = 9075; break; // &UpperLeft -> &UpperLeftA + case 9085: state = 9086; break; // &UpperRight -> &UpperRightA + case 9110: state = 9112; break; // &UpTee -> &UpTeeA + case 9201: state = 9243; break; // &v -> &vA + case 9572: state = 9573; break; // &xh -> &xhA + case 9585: state = 9586; break; // &xl -> &xlA + case 9623: state = 9624; break; // &xr -> &xrA + case 9665: state = 9679; break; // &Y -> &YA default: return false; } break; case 'B': switch (state) { - case 0: state = 247; break; // & -> &B - case 1462: state = 1463; break; // &DoubleVertical -> &DoubleVerticalB - case 1467: state = 1495; break; // &Down -> &DownB - case 1472: state = 1485; break; // &DownArrow -> &DownArrowB - case 1555: state = 1556; break; // &DownLeftVector -> &DownLeftVectorB - case 1578: state = 1579; break; // &DownRightVector -> &DownRightVectorB - case 2881: state = 2966; break; // &l -> &lB - case 3040: state = 3041; break; // &LeftAngle -> &LeftAngleB - case 3051: state = 3064; break; // &LeftArrow -> &LeftArrowB - case 3093: state = 3094; break; // &LeftDouble -> &LeftDoubleB - case 3117: state = 3118; break; // &LeftDownVector -> &LeftDownVectorB - case 3234: state = 3235; break; // &LeftTriangle -> &LeftTriangleB - case 3269: state = 3270; break; // &LeftUpVector -> &LeftUpVectorB - case 3278: state = 3279; break; // &LeftVector -> &LeftVectorB - case 4190: state = 4191; break; // &No -> &NoB - case 4196: state = 4197; break; // &Non -> &NonB - case 4244: state = 4245; break; // &NotDoubleVertical -> &NotDoubleVerticalB - case 4354: state = 4355; break; // &NotLeftTriangle -> &NotLeftTriangleB - case 4478: state = 4479; break; // &NotRightTriangle -> &NotRightTriangleB - case 4593: state = 4594; break; // &NotVertical -> &NotVerticalB - case 5061: state = 5062; break; // &Over -> &OverB - case 5397: state = 5480; break; // &r -> &rB - case 5405: state = 5476; break; // &R -> &RB - case 5625: state = 5626; break; // &RightAngle -> &RightAngleB - case 5636: state = 5651; break; // &RightArrow -> &RightArrowB - case 5679: state = 5680; break; // &RightDouble -> &RightDoubleB - case 5703: state = 5704; break; // &RightDownVector -> &RightDownVectorB - case 5794: state = 5795; break; // &RightTriangle -> &RightTriangleB - case 5829: state = 5830; break; // &RightUpVector -> &RightUpVectorB - case 5838: state = 5839; break; // &RightVector -> &RightVectorB - case 6990: state = 6991; break; // &Under -> &UnderB - case 7036: state = 7048; break; // &UpArrow -> &UpArrowB - case 7223: state = 7311; break; // &v -> &vB - case 7362: state = 7363; break; // &Vertical -> &VerticalB + case 0: state = 331; break; // & -> &B + case 1876: state = 1877; break; // &DoubleVertical -> &DoubleVerticalB + case 1882: state = 1915; break; // &Down -> &DownB + case 1887: state = 1903; break; // &DownArrow -> &DownArrowB + case 1981: state = 1983; break; // &DownLeftVector -> &DownLeftVectorB + case 2007: state = 2009; break; // &DownRightVector -> &DownRightVectorB + case 3692: state = 3807; break; // &l -> &lB + case 3905: state = 3906; break; // &LeftAngle -> &LeftAngleB + case 3917: state = 3933; break; // &LeftArrow -> &LeftArrowB + case 3966: state = 3967; break; // &LeftDouble -> &LeftDoubleB + case 3992: state = 3994; break; // &LeftDownVector -> &LeftDownVectorB + case 4126: state = 4128; break; // &LeftTriangle -> &LeftTriangleB + case 4166: state = 4168; break; // &LeftUpVector -> &LeftUpVectorB + case 4177: state = 4179; break; // &LeftVector -> &LeftVectorB + case 5347: state = 5348; break; // &No -> &NoB + case 5354: state = 5355; break; // &Non -> &NonB + case 5409: state = 5410; break; // &NotDoubleVertical -> &NotDoubleVerticalB + case 5539: state = 5541; break; // &NotLeftTriangle -> &NotLeftTriangleB + case 5682: state = 5684; break; // &NotRightTriangle -> &NotRightTriangleB + case 5816: state = 5817; break; // &NotVertical -> &NotVerticalB + case 6437: state = 6438; break; // &Over -> &OverB + case 6876: state = 6991; break; // &r -> &rB + case 6886: state = 6986; break; // &R -> &RB + case 7179: state = 7180; break; // &RightAngle -> &RightAngleB + case 7191: state = 7209; break; // &RightArrow -> &RightArrowB + case 7241: state = 7242; break; // &RightDouble -> &RightDoubleB + case 7267: state = 7269; break; // &RightDownVector -> &RightDownVectorB + case 7371: state = 7373; break; // &RightTriangle -> &RightTriangleB + case 7411: state = 7413; break; // &RightUpVector -> &RightUpVectorB + case 7422: state = 7424; break; // &RightVector -> &RightVectorB + case 8919: state = 8920; break; // &Under -> &UnderB + case 8975: state = 8990; break; // &UpArrow -> &UpArrowB + case 9201: state = 9308; break; // &v -> &vB + case 9377: state = 9378; break; // &Vertical -> &VerticalB default: return false; } break; case 'C': switch (state) { - case 0: state = 583; break; // & -> &C - case 810: state = 811; break; // &Clockwise -> &ClockwiseC - case 827: state = 828; break; // &Close -> &CloseC - case 936: state = 937; break; // &Counter -> &CounterC - case 945: state = 946; break; // &CounterClockwise -> &CounterClockwiseC - case 1005: state = 1012; break; // &Cup -> &CupC - case 1346: state = 1347; break; // &Double -> &DoubleC - case 2699: state = 2700; break; // &Invisible -> &InvisibleC - case 3035: state = 3081; break; // &Left -> &LeftC - case 4215: state = 4217; break; // &Not -> &NotC - case 4227: state = 4228; break; // &NotCup -> &NotCupC - case 4962: state = 4963; break; // &Open -> &OpenC - case 5620: state = 5667; break; // &Right -> &RightC - case 6092: state = 6093; break; // &SH -> &SHC - case 6195: state = 6196; break; // &Small -> &SmallC + case 0: state = 789; break; // & -> &C + case 1075: state = 1076; break; // &Clockwise -> &ClockwiseC + case 1093: state = 1094; break; // &Close -> &CloseC + case 1230: state = 1231; break; // &Counter -> &CounterC + case 1239: state = 1240; break; // &CounterClockwise -> &CounterClockwiseC + case 1316: state = 1326; break; // &Cup -> &CupC + case 1747: state = 1748; break; // &Double -> &DoubleC + case 3450: state = 3451; break; // &Invisible -> &InvisibleC + case 3900: state = 3953; break; // &Left -> &LeftC + case 5376: state = 5380; break; // &Not -> &NotC + case 5391: state = 5392; break; // &NotCup -> &NotCupC + case 6308: state = 6309; break; // &Open -> &OpenC + case 7174: state = 7228; break; // &Right -> &RightC + case 7756: state = 7757; break; // &SH -> &SHC + case 7886: state = 7887; break; // &Small -> &SmallC default: return false; } break; case 'D': switch (state) { - case 0: state = 1091; break; // & -> &D - case 470: state = 474; break; // &box -> &boxD - case 484: state = 486; break; // &boxH -> &boxHD - case 485: state = 488; break; // &boxh -> &boxhD - case 616: state = 617; break; // &Capital -> &CapitalD - case 628: state = 629; break; // &CapitalDifferential -> &CapitalDifferentialD - case 703: state = 704; break; // &Center -> &CenterD - case 769: state = 770; break; // &Circle -> &CircleD - case 832: state = 833; break; // &CloseCurly -> &CloseCurlyD - case 1091: state = 1141; break; // &D -> &DD - case 1200: state = 1206; break; // &Diacritical -> &DiacriticalD - case 1253: state = 1254; break; // &Differential -> &DifferentialD - case 1301: state = 1303; break; // &Dot -> &DotD - case 1346: state = 1362; break; // &Double -> &DoubleD - case 1440: state = 1446; break; // &DoubleUp -> &DoubleUpD - case 1662: state = 1694; break; // &e -> &eD - case 1694: state = 1695; break; // &eD -> &eDD - case 1707: state = 1708; break; // &ef -> &efD - case 1881: state = 1882; break; // &equiv -> &equivD - case 1882: state = 1883; break; // &equivD -> &equivDD - case 1890: state = 1894; break; // &er -> &erD - case 2369: state = 2370; break; // &HAR -> &HARD - case 2510: state = 2511; break; // &Hump -> &HumpD - case 3035: state = 3088; break; // &Left -> &LeftD - case 3244: state = 3245; break; // &LeftUp -> &LeftUpD - case 3745: state = 3788; break; // &m -> &mD - case 3788: state = 3789; break; // &mD -> &mDD - case 4215: state = 4231; break; // &Not -> &NotD - case 4319: state = 4320; break; // &NotHump -> &NotHumpD - case 4760: state = 4772; break; // &nv -> &nvD - case 4763: state = 4764; break; // &nV -> &nVD - case 4967: state = 4968; break; // &OpenCurly -> &OpenCurlyD - case 5102: state = 5103; break; // &Partial -> &PartialD - case 5620: state = 5674; break; // &Right -> &RightD - case 5804: state = 5805; break; // &RightUp -> &RightUpD - case 5970: state = 5971; break; // &Rule -> &RuleD - case 6107: state = 6108; break; // &Short -> &ShortD - case 6757: state = 6758; break; // &TRA -> &TRAD - case 6801: state = 6802; break; // &Triple -> &TripleD - case 7031: state = 7060; break; // &Up -> &UpD - case 7036: state = 7051; break; // &UpArrow -> &UpArrowD - case 7223: state = 7327; break; // &v -> &vD - case 7307: state = 7319; break; // &V -> &VD + case 0: state = 1425; break; // & -> &D + case 613: state = 618; break; // &box -> &boxD + case 636: state = 640; break; // &boxH -> &boxHD + case 638: state = 644; break; // &boxh -> &boxhD + case 831: state = 832; break; // &Capital -> &CapitalD + case 843: state = 844; break; // &CapitalDifferential -> &CapitalDifferentialD + case 939: state = 940; break; // &Center -> &CenterD + case 1023: state = 1024; break; // &Circle -> &CircleD + case 1098: state = 1099; break; // &CloseCurly -> &CloseCurlyD + case 1425: state = 1490; break; // &D -> &DD + case 1566: state = 1573; break; // &Diacritical -> &DiacriticalD + case 1630: state = 1631; break; // &Differential -> &DifferentialD + case 1692: state = 1696; break; // &Dot -> &DotD + case 1747: state = 1764; break; // &Double -> &DoubleD + case 1852: state = 1859; break; // &DoubleUp -> &DoubleUpD + case 2115: state = 2157; break; // &e -> &eD + case 2157: state = 2158; break; // &eD -> &eDD + case 2175: state = 2176; break; // &ef -> &efD + case 2397: state = 2399; break; // &equiv -> &equivD + case 2399: state = 2400; break; // &equivD -> &equivDD + case 2409: state = 2414; break; // &er -> &erD + case 3036: state = 3037; break; // &HAR -> &HARD + case 3209: state = 3210; break; // &Hump -> &HumpD + case 3900: state = 3961; break; // &Left -> &LeftD + case 4139: state = 4140; break; // &LeftUp -> &LeftUpD + case 4767: state = 4825; break; // &m -> &mD + case 4825: state = 4826; break; // &mD -> &mDD + case 5376: state = 5396; break; // &Not -> &NotD + case 5496: state = 5497; break; // &NotHump -> &NotHumpD + case 6043: state = 6058; break; // &nv -> &nvD + case 6047: state = 6048; break; // &nV -> &nVD + case 6313: state = 6314; break; // &OpenCurly -> &OpenCurlyD + case 6488: state = 6489; break; // &Partial -> &PartialD + case 7174: state = 7236; break; // &Right -> &RightD + case 7384: state = 7385; break; // &RightUp -> &RightUpD + case 7592: state = 7593; break; // &Rule -> &RuleD + case 7775: state = 7776; break; // &Short -> &ShortD + case 8624: state = 8625; break; // &TRA -> &TRAD + case 8680: state = 8681; break; // &Triple -> &TripleD + case 8970: state = 9004; break; // &Up -> &UpD + case 8975: state = 8994; break; // &UpArrow -> &UpArrowD + case 9201: state = 9330; break; // &v -> &vD + case 9303: state = 9320; break; // &V -> &VD default: return false; } break; case 'E': switch (state) { - case 0: state = 1656; break; // & -> &E - case 1: state = 38; break; // &A -> &AE - case 23: state = 25; break; // &ac -> &acE - case 143: state = 148; break; // &ap -> &apE - case 574: state = 575; break; // &bump -> &bumpE - case 733: state = 789; break; // &cir -> &cirE - case 1301: state = 1311; break; // &Dot -> &DotE - case 1953: state = 1954; break; // &Exponential -> &ExponentialE - case 2118: state = 2165; break; // &g -> &gE - case 2204: state = 2206; break; // &gl -> &glE - case 2208: state = 2215; break; // &gn -> &gnE - case 2237: state = 2238; break; // &Greater -> &GreaterE - case 2250: state = 2251; break; // &GreaterFull -> &GreaterFullE - case 2271: state = 2272; break; // &GreaterSlant -> &GreaterSlantE - case 2349: state = 2350; break; // &gvn -> &gvnE - case 2510: state = 2519; break; // &Hump -> &HumpE - case 2533: state = 2558; break; // &I -> &IE - case 2747: state = 2751; break; // &isin -> &isinE - case 2881: state = 3031; break; // &l -> &lE - case 3234: state = 3238; break; // &LeftTriangle -> &LeftTriangleE - case 3322: state = 3323; break; // &Less -> &LessE - case 3338: state = 3339; break; // &LessFull -> &LessFullE - case 3365: state = 3366; break; // &LessSlant -> &LessSlantE - case 3388: state = 3389; break; // &lg -> &lgE - case 3452: state = 3459; break; // &ln -> &lnE - case 3743: state = 3744; break; // &lvn -> &lvnE - case 3914: state = 3915; break; // &nap -> &napE - case 4081: state = 4082; break; // &ng -> &ngE - case 4121: state = 4130; break; // &nl -> &nlE - case 4215: state = 4248; break; // &Not -> &NotE - case 4275: state = 4276; break; // &NotGreater -> &NotGreaterE - case 4284: state = 4285; break; // &NotGreaterFull -> &NotGreaterFullE - case 4305: state = 4306; break; // &NotGreaterSlant -> &NotGreaterSlantE - case 4319: state = 4328; break; // &NotHump -> &NotHumpE - case 4334: state = 4338; break; // ¬in -> ¬inE - case 4354: state = 4358; break; // &NotLeftTriangle -> &NotLeftTriangleE - case 4364: state = 4365; break; // &NotLess -> &NotLessE - case 4385: state = 4386; break; // &NotLessSlant -> &NotLessSlantE - case 4437: state = 4438; break; // &NotPrecedes -> &NotPrecedesE - case 4447: state = 4448; break; // &NotPrecedesSlant -> &NotPrecedesSlantE - case 4459: state = 4460; break; // &NotReverse -> &NotReverseE - case 4478: state = 4482; break; // &NotRightTriangle -> &NotRightTriangleE - case 4498: state = 4499; break; // &NotSquareSubset -> &NotSquareSubsetE - case 4509: state = 4510; break; // &NotSquareSuperset -> &NotSquareSupersetE - case 4519: state = 4520; break; // &NotSubset -> &NotSubsetE - case 4530: state = 4531; break; // &NotSucceeds -> &NotSucceedsE - case 4540: state = 4541; break; // &NotSucceedsSlant -> &NotSucceedsSlantE - case 4556: state = 4557; break; // &NotSuperset -> &NotSupersetE - case 4566: state = 4567; break; // &NotTilde -> &NotTildeE - case 4575: state = 4576; break; // &NotTildeFull -> &NotTildeFullE - case 4696: state = 4697; break; // &nsub -> &nsubE - case 4709: state = 4710; break; // &nsup -> &nsupE - case 4827: state = 4872; break; // &O -> &OE - case 5216: state = 5222; break; // &pr -> &prE - case 5243: state = 5244; break; // &Precedes -> &PrecedesE - case 5253: state = 5254; break; // &PrecedesSlant -> &PrecedesSlantE - case 5289: state = 5292; break; // &prn -> &prnE - case 5405: state = 5554; break; // &R -> &RE - case 5561: state = 5562; break; // &Reverse -> &ReverseE - case 5580: state = 5581; break; // &ReverseUp -> &ReverseUpE - case 5794: state = 5798; break; // &RightTriangle -> &RightTriangleE - case 6002: state = 6015; break; // &sc -> &scE - case 6030: state = 6033; break; // &scn -> &scnE - case 6174: state = 6175; break; // &simg -> &simgE - case 6176: state = 6177; break; // &siml -> &simlE - case 6310: state = 6311; break; // &SquareSubset -> &SquareSubsetE - case 6321: state = 6322; break; // &SquareSuperset -> &SquareSupersetE - case 6384: state = 6388; break; // &sub -> &subE - case 6397: state = 6398; break; // &subn -> &subnE - case 6410: state = 6417; break; // &Subset -> &SubsetE - case 6451: state = 6452; break; // &Succeeds -> &SucceedsE - case 6461: state = 6462; break; // &SucceedsSlant -> &SucceedsSlantE - case 6500: state = 6510; break; // &sup -> &supE - case 6519: state = 6520; break; // &Superset -> &SupersetE - case 6539: state = 6540; break; // &supn -> &supnE - case 6699: state = 6704; break; // &Tilde -> &TildeE - case 6712: state = 6713; break; // &TildeFull -> &TildeFullE - case 6758: state = 6759; break; // &TRAD -> &TRADE - case 7031: state = 7087; break; // &Up -> &UpE - case 7429: state = 7430; break; // &vsubn -> &vsubnE - case 7433: state = 7434; break; // &vsupn -> &vsupnE + case 0: state = 2108; break; // & -> &E + case 1: state = 50; break; // &A -> &AE + case 27: state = 31; break; // &ac -> &acE + case 199: state = 206; break; // &ap -> &apE + case 775: state = 777; break; // &bump -> &bumpE + case 979: state = 1049; break; // &cir -> &cirE + case 1692: state = 1707; break; // &Dot -> &DotE + case 2490: state = 2491; break; // &Exponential -> &ExponentialE + case 2701: state = 2763; break; // &g -> &gE + case 2824: state = 2828; break; // &gl -> &glE + case 2832: state = 2841; break; // &gn -> &gnE + case 2871: state = 2872; break; // &Greater -> &GreaterE + case 2886: state = 2887; break; // &GreaterFull -> &GreaterFullE + case 2910: state = 2911; break; // &GreaterSlant -> &GreaterSlantE + case 3011: state = 3012; break; // &gvn -> &gvnE + case 3209: state = 3219; break; // &Hump -> &HumpE + case 3236: state = 3269; break; // &I -> &IE + case 3512: state = 3518; break; // &isin -> &isinE + case 3692: state = 3894; break; // &l -> &lE + case 4126: state = 4132; break; // &LeftTriangle -> &LeftTriangleE + case 4239: state = 4240; break; // &Less -> &LessE + case 4256: state = 4257; break; // &LessFull -> &LessFullE + case 4288: state = 4289; break; // &LessSlant -> &LessSlantE + case 4317: state = 4319; break; // &lg -> &lgE + case 4401: state = 4410; break; // &ln -> &lnE + case 4764: state = 4765; break; // &lvn -> &lvnE + case 4986: state = 4988; break; // &nap -> &napE + case 5195: state = 5196; break; // &ng -> &ngE + case 5256: state = 5268; break; // &nl -> &nlE + case 5376: state = 5414; break; // &Not -> &NotE + case 5445: state = 5447; break; // &NotGreater -> &NotGreaterE + case 5456: state = 5457; break; // &NotGreaterFull -> &NotGreaterFullE + case 5480: state = 5481; break; // &NotGreaterSlant -> &NotGreaterSlantE + case 5496: state = 5506; break; // &NotHump -> &NotHumpE + case 5513: state = 5519; break; // ¬in -> ¬inE + case 5539: state = 5545; break; // &NotLeftTriangle -> &NotLeftTriangleE + case 5552: state = 5554; break; // &NotLess -> &NotLessE + case 5577: state = 5578; break; // &NotLessSlant -> &NotLessSlantE + case 5637: state = 5639; break; // &NotPrecedes -> &NotPrecedesE + case 5649: state = 5650; break; // &NotPrecedesSlant -> &NotPrecedesSlantE + case 5662: state = 5663; break; // &NotReverse -> &NotReverseE + case 5682: state = 5688; break; // &NotRightTriangle -> &NotRightTriangleE + case 5705: state = 5707; break; // &NotSquareSubset -> &NotSquareSubsetE + case 5718: state = 5720; break; // &NotSquareSuperset -> &NotSquareSupersetE + case 5730: state = 5732; break; // &NotSubset -> &NotSubsetE + case 5743: state = 5745; break; // &NotSucceeds -> &NotSucceedsE + case 5755: state = 5756; break; // &NotSucceedsSlant -> &NotSucceedsSlantE + case 5773: state = 5775; break; // &NotSuperset -> &NotSupersetE + case 5785: state = 5787; break; // &NotTilde -> &NotTildeE + case 5796: state = 5797; break; // &NotTildeFull -> &NotTildeFullE + case 5952: state = 5954; break; // &nsub -> &nsubE + case 5973: state = 5975; break; // &nsup -> &nsupE + case 6131: state = 6190; break; // &O -> &OE + case 6642: state = 6651; break; // &pr -> &prE + case 6677: state = 6679; break; // &Precedes -> &PrecedesE + case 6689: state = 6690; break; // &PrecedesSlant -> &PrecedesSlantE + case 6735: state = 6739; break; // &prn -> &prnE + case 6886: state = 7092; break; // &R -> &RE + case 7101: state = 7102; break; // &Reverse -> &ReverseE + case 7122: state = 7123; break; // &ReverseUp -> &ReverseUpE + case 7371: state = 7377; break; // &RightTriangle -> &RightTriangleE + case 7631: state = 7649; break; // &sc -> &scE + case 7670: state = 7674; break; // &scn -> &scnE + case 7857: state = 7859; break; // &simg -> &simgE + case 7861: state = 7863; break; // &siml -> &simlE + case 8037: state = 8039; break; // &SquareSubset -> &SquareSubsetE + case 8050: state = 8052; break; // &SquareSuperset -> &SquareSupersetE + case 8131: state = 8137; break; // &sub -> &subE + case 8150: state = 8151; break; // &subn -> &subnE + case 8167: state = 8178; break; // &Subset -> &SubsetE + case 8221: state = 8223; break; // &Succeeds -> &SucceedsE + case 8233: state = 8234; break; // &SucceedsSlant -> &SucceedsSlantE + case 8284: state = 8300; break; // &sup -> &supE + case 8312: state = 8314; break; // &Superset -> &SupersetE + case 8338: state = 8339; break; // &supn -> &supnE + case 8547: state = 8554; break; // &Tilde -> &TildeE + case 8563: state = 8564; break; // &TildeFull -> &TildeFullE + case 8625: state = 8626; break; // &TRAD -> &TRADE + case 8970: state = 9034; break; // &Up -> &UpE + case 9460: state = 9461; break; // &vsubn -> &vsubnE + case 9466: state = 9467; break; // &vsupn -> &vsupnE default: return false; } break; case 'F': switch (state) { - case 0: state = 1977; break; // & -> &F - case 157: state = 158; break; // &Apply -> &ApplyF - case 2237: state = 2247; break; // &Greater -> &GreaterF - case 3035: state = 3121; break; // &Left -> &LeftF - case 3322: state = 3335; break; // &Less -> &LessF - case 4275: state = 4281; break; // &NotGreater -> &NotGreaterF - case 4566: state = 4572; break; // &NotTilde -> &NotTildeF - case 5620: state = 5707; break; // &Right -> &RightF - case 6230: state = 6231; break; // &SO -> &SOF - case 6699: state = 6709; break; // &Tilde -> &TildeF + case 0: state = 2517; break; // & -> &F + case 219: state = 220; break; // &Apply -> &ApplyF + case 2871: state = 2883; break; // &Greater -> &GreaterF + case 3900: state = 3998; break; // &Left -> &LeftF + case 4239: state = 4253; break; // &Less -> &LessF + case 5445: state = 5453; break; // &NotGreater -> &NotGreaterF + case 5785: state = 5793; break; // &NotTilde -> &NotTildeF + case 7174: state = 7273; break; // &Right -> &RightF + case 7930: state = 7931; break; // &SO -> &SOF + case 8547: state = 8560; break; // &Tilde -> &TildeF default: return false; } break; case 'G': switch (state) { - case 0: state = 2124; break; // & -> &G - case 1200: state = 1218; break; // &Diacritical -> &DiacriticalG - case 1795: state = 1796; break; // &EN -> &ENG - case 2237: state = 2256; break; // &Greater -> &GreaterG - case 3322: state = 3344; break; // &Less -> &LessG - case 3327: state = 3328; break; // &LessEqual -> &LessEqualG - case 3897: state = 4092; break; // &n -> &nG - case 4044: state = 4045; break; // &Nested -> &NestedG - case 4051: state = 4052; break; // &NestedGreater -> &NestedGreaterG - case 4215: state = 4269; break; // &Not -> &NotG - case 4275: state = 4290; break; // &NotGreater -> &NotGreaterG - case 4364: state = 4370; break; // &NotLess -> &NotLessG - case 4401: state = 4402; break; // &NotNested -> &NotNestedG - case 4408: state = 4409; break; // &NotNestedGreater -> &NotNestedGreaterG - case 5554: state = 5555; break; // &RE -> ® + case 0: state = 2708; break; // & -> &G + case 1566: state = 1587; break; // &Diacritical -> &DiacriticalG + case 2287: state = 2288; break; // &EN -> &ENG + case 2871: state = 2893; break; // &Greater -> &GreaterG + case 4239: state = 4263; break; // &Less -> &LessG + case 4244: state = 4245; break; // &LessEqual -> &LessEqualG + case 4965: state = 5212; break; // &n -> &nG + case 5151: state = 5152; break; // &Nested -> &NestedG + case 5158: state = 5159; break; // &NestedGreater -> &NestedGreaterG + case 5376: state = 5439; break; // &Not -> &NotG + case 5445: state = 5463; break; // &NotGreater -> &NotGreaterG + case 5552: state = 5560; break; // &NotLess -> &NotLessG + case 5595: state = 5596; break; // &NotNested -> &NotNestedG + case 5602: state = 5603; break; // &NotNestedGreater -> &NotNestedGreaterG + case 7092: state = 7093; break; // &RE -> ® default: return false; } break; case 'H': switch (state) { - case 0: state = 2351; break; // & -> &H - case 470: state = 484; break; // &box -> &boxH - case 518: state = 520; break; // &boxV -> &boxVH - case 519: state = 522; break; // &boxv -> &boxvH - case 583: state = 716; break; // &C -> &CH - case 1097: state = 1183; break; // &d -> &dH - case 1914: state = 1915; break; // &ET -> Ð - case 2514: state = 2515; break; // &HumpDown -> &HumpDownH - case 2825: state = 2857; break; // &K -> &KH - case 2881: state = 3390; break; // &l -> &lH - case 4215: state = 4316; break; // &Not -> &NotH - case 4323: state = 4324; break; // &NotHumpDown -> &NotHumpDownH - case 4760: state = 4783; break; // &nv -> &nvH - case 5397: state = 5604; break; // &r -> &rH - case 5985: state = 6092; break; // &S -> &SH - case 6093: state = 6094; break; // &SHC -> &SHCH - case 6583: state = 6689; break; // &T -> &TH - case 6827: state = 6831; break; // &TS -> &TSH - case 6879: state = 6954; break; // &u -> &uH - case 7645: state = 7701; break; // &Z -> &ZH + case 0: state = 3014; break; // & -> &H + case 613: state = 636; break; // &box -> &boxH + case 691: state = 695; break; // &boxV -> &boxVH + case 693: state = 699; break; // &boxv -> &boxvH + case 789: state = 956; break; // &C -> &CH + case 1432: state = 1546; break; // &d -> &dH + case 2442: state = 2443; break; // &ET -> Ð + case 3213: state = 3214; break; // &HumpDown -> &HumpDownH + case 3618: state = 3660; break; // &K -> &KH + case 3692: state = 4321; break; // &l -> &lH + case 5376: state = 5493; break; // &Not -> &NotH + case 5500: state = 5501; break; // &NotHumpDown -> &NotHumpDownH + case 6043: state = 6073; break; // &nv -> &nvH + case 6876: state = 7151; break; // &r -> &rH + case 7610: state = 7756; break; // &S -> &SH + case 7757: state = 7758; break; // &SHC -> &SHCH + case 8400: state = 8535; break; // &T -> &TH + case 8713: state = 8719; break; // &TS -> &TSH + case 8775: state = 8872; break; // &u -> &uH + case 9747: state = 9817; break; // &Z -> &ZH default: return false; } break; case 'I': switch (state) { - case 0: state = 2533; break; // & -> &I - case 817: state = 818; break; // &ClockwiseContour -> &ClockwiseContourI - case 904: state = 905; break; // &Contour -> &ContourI - case 952: state = 953; break; // &CounterClockwiseContour -> &CounterClockwiseContourI - case 1353: state = 1354; break; // &DoubleContour -> &DoubleContourI - case 2619: state = 2620; break; // &Imaginary -> &ImaginaryI - case 5901: state = 5902; break; // &Round -> &RoundI - case 6289: state = 6293; break; // &Square -> &SquareI - case 7584: state = 7616; break; // &Y -> &YI + case 0: state = 3236; break; // & -> &I + case 1082: state = 1083; break; // &ClockwiseContour -> &ClockwiseContourI + case 1190: state = 1191; break; // &Contour -> &ContourI + case 1246: state = 1247; break; // &CounterClockwiseContour -> &CounterClockwiseContourI + case 1754: state = 1755; break; // &DoubleContour -> &DoubleContourI + case 3349: state = 3350; break; // &Imaginary -> &ImaginaryI + case 7503: state = 7504; break; // &Round -> &RoundI + case 8013: state = 8019; break; // &Square -> &SquareI + case 9665: state = 9708; break; // &Y -> &YI default: return false; } break; case 'J': switch (state) { - case 0: state = 2777; break; // & -> &J - case 1091: state = 1277; break; // &D -> &DJ - case 2124: state = 2198; break; // &G -> &GJ - case 2533: state = 2596; break; // &I -> &IJ - case 2825: state = 2863; break; // &K -> &KJ - case 2886: state = 3402; break; // &L -> &LJ - case 3902: state = 4115; break; // &N -> &NJ + case 0: state = 3555; break; // & -> &J + case 1425: state = 1661; break; // &D -> &DJ + case 2708: state = 2816; break; // &G -> &GJ + case 3236: state = 3320; break; // &I -> &IJ + case 3618: state = 3668; break; // &K -> &KJ + case 3698: state = 4338; break; // &L -> &LJ + case 4971: state = 5248; break; // &N -> &NJ default: return false; } break; case 'K': switch (state) { - case 0: state = 2825; break; // & -> &K + case 0: state = 3618; break; // & -> &K default: return false; } break; case 'L': switch (state) { - case 0: state = 2886; break; // & -> &L - case 474: state = 475; break; // &boxD -> &boxDL - case 477: state = 478; break; // &boxd -> &boxdL - case 508: state = 509; break; // &boxU -> &boxUL - case 511: state = 512; break; // &boxu -> &boxuL - case 518: state = 524; break; // &boxV -> &boxVL - case 519: state = 526; break; // &boxv -> &boxvL - case 1346: state = 1372; break; // &Double -> &DoubleL - case 1396: state = 1397; break; // &DoubleLong -> &DoubleLongL - case 1467: state = 1526; break; // &Down -> &DownL - case 2237: state = 2263; break; // &Greater -> &GreaterL - case 2242: state = 2243; break; // &GreaterEqual -> &GreaterEqualL - case 2485: state = 2486; break; // &Horizontal -> &HorizontalL - case 3322: state = 3354; break; // &Less -> &LessL - case 3477: state = 3478; break; // &Long -> &LongL - case 3612: state = 3613; break; // &Lower -> &LowerL - case 3897: state = 4132; break; // &n -> &nL - case 4044: state = 4059; break; // &Nested -> &NestedL - case 4062: state = 4063; break; // &NestedLess -> &NestedLessL - case 4067: state = 4068; break; // &New -> &NewL - case 4215: state = 4343; break; // &Not -> &NotL - case 4275: state = 4297; break; // &NotGreater -> &NotGreaterL - case 4364: state = 4377; break; // &NotLess -> &NotLessL - case 4401: state = 4416; break; // &NotNested -> &NotNestedL - case 4419: state = 4420; break; // &NotNestedLess -> &NotNestedLessL - case 5636: state = 5654; break; // &RightArrow -> &RightArrowL - case 6107: state = 6117; break; // &Short -> &ShortL - case 7119: state = 7120; break; // &Upper -> &UpperL - case 7362: state = 7366; break; // &Vertical -> &VerticalL + case 0: state = 3698; break; // & -> &L + case 618: state = 619; break; // &boxD -> &boxDL + case 623: state = 624; break; // &boxd -> &boxdL + case 673: state = 674; break; // &boxU -> &boxUL + case 678: state = 679; break; // &boxu -> &boxuL + case 691: state = 703; break; // &boxV -> &boxVL + case 693: state = 707; break; // &boxv -> &boxvL + case 1747: state = 1776; break; // &Double -> &DoubleL + case 1803: state = 1804; break; // &DoubleLong -> &DoubleLongL + case 1882: state = 1950; break; // &Down -> &DownL + case 2871: state = 2901; break; // &Greater -> &GreaterL + case 2876: state = 2878; break; // &GreaterEqual -> &GreaterEqualL + case 3178: state = 3179; break; // &Horizontal -> &HorizontalL + case 4239: state = 4275; break; // &Less -> &LessL + case 4436: state = 4437; break; // &Long -> &LongL + case 4590: state = 4591; break; // &Lower -> &LowerL + case 4965: state = 5272; break; // &n -> &nL + case 5151: state = 5167; break; // &Nested -> &NestedL + case 5170: state = 5171; break; // &NestedLess -> &NestedLessL + case 5176: state = 5177; break; // &New -> &NewL + case 5376: state = 5528; break; // &Not -> &NotL + case 5445: state = 5471; break; // &NotGreater -> &NotGreaterL + case 5552: state = 5568; break; // &NotLess -> &NotLessL + case 5595: state = 5611; break; // &NotNested -> &NotNestedL + case 5614: state = 5615; break; // &NotNestedLess -> &NotNestedLessL + case 7191: state = 7213; break; // &RightArrow -> &RightArrowL + case 7775: state = 7786; break; // &Short -> &ShortL + case 9070: state = 9071; break; // &Upper -> &UpperL + case 9377: state = 9382; break; // &Vertical -> &VerticalL default: return false; } break; case 'M': switch (state) { - case 0: state = 3755; break; // & -> &M - case 1: state = 85; break; // &A -> &AM - case 769: state = 775; break; // &Circle -> &CircleM - case 3990: state = 3991; break; // &Negative -> &NegativeM - case 5174: state = 5175; break; // &Plus -> &PlusM + case 0: state = 4781; break; // & -> &M + case 1: state = 111; break; // &A -> &AM + case 1023: state = 1032; break; // &Circle -> &CircleM + case 5090: state = 5091; break; // &Negative -> &NegativeM + case 6589: state = 6590; break; // &Plus -> &PlusM default: return false; } break; case 'N': switch (state) { - case 0: state = 3902; break; // & -> &N - case 222: state = 451; break; // &b -> &bN - case 1656: state = 1795; break; // &E -> &EN - case 4215: state = 4396; break; // &Not -> &NotN - case 6691: state = 6692; break; // &THOR -> Þ + case 0: state = 4971; break; // & -> &N + case 301: state = 587; break; // &b -> &bN + case 2108: state = 2287; break; // &E -> &EN + case 5376: state = 5590; break; // &Not -> &NotN + case 8537: state = 8538; break; // &THOR -> Þ default: return false; } break; case 'O': switch (state) { - case 0: state = 4827; break; // & -> &O - case 583: state = 926; break; // &C -> &CO - case 2533: state = 2710; break; // &I -> &IO - case 5392: state = 5393; break; // &QU -> &QUO - case 5985: state = 6230; break; // &S -> &SO - case 6689: state = 6690; break; // &TH -> &THO + case 0: state = 6131; break; // & -> &O + case 789: state = 1217; break; // &C -> &CO + case 3236: state = 3463; break; // &I -> &IO + case 6869: state = 6870; break; // &QU -> &QUO + case 7610: state = 7930; break; // &S -> &SO + case 8535: state = 8536; break; // &TH -> &THO default: return false; } break; case 'P': switch (state) { - case 0: state = 5096; break; // & -> &P - case 85: state = 86; break; // &AM -> & - case 769: state = 780; break; // &Circle -> &CircleP - case 926: state = 927; break; // &CO -> &COP - case 2302: state = 2303; break; // >l -> >lP - case 3717: state = 3721; break; // <r -> <rP - case 3850: state = 3851; break; // &Minus -> &MinusP - case 4215: state = 4430; break; // &Not -> &NotP - case 5061: state = 5072; break; // &Over -> &OverP - case 6990: state = 7001; break; // &Under -> &UnderP - case 7014: state = 7015; break; // &Union -> &UnionP + case 0: state = 6482; break; // & -> &P + case 111: state = 112; break; // &AM -> & + case 1023: state = 1038; break; // &Circle -> &CircleP + case 1217: state = 1218; break; // &CO -> &COP + case 2954: state = 2955; break; // >l -> >lP + case 4731: state = 4738; break; // <r -> <rP + case 4903: state = 4904; break; // &Minus -> &MinusP + case 5376: state = 5630; break; // &Not -> &NotP + case 6437: state = 6451; break; // &Over -> &OverP + case 8919: state = 8933; break; // &Under -> &UnderP + case 8947: state = 8949; break; // &Union -> &UnionP default: return false; } break; case 'Q': switch (state) { - case 0: state = 5348; break; // & -> &Q - case 832: state = 844; break; // &CloseCurly -> &CloseCurlyQ - case 838: state = 839; break; // &CloseCurlyDouble -> &CloseCurlyDoubleQ - case 4967: state = 4979; break; // &OpenCurly -> &OpenCurlyQ - case 4973: state = 4974; break; // &OpenCurlyDouble -> &OpenCurlyDoubleQ + case 0: state = 6813; break; // & -> &Q + case 1098: state = 1111; break; // &CloseCurly -> &CloseCurlyQ + case 1104: state = 1105; break; // &CloseCurlyDouble -> &CloseCurlyDoubleQ + case 6313: state = 6326; break; // &OpenCurly -> &OpenCurlyQ + case 6319: state = 6320; break; // &OpenCurlyDouble -> &OpenCurlyDoubleQ default: return false; } break; case 'R': switch (state) { - case 0: state = 5405; break; // & -> &R - case 474: state = 480; break; // &boxD -> &boxDR - case 477: state = 482; break; // &boxd -> &boxdR - case 508: state = 514; break; // &boxU -> &boxUR - case 511: state = 516; break; // &boxu -> &boxuR - case 518: state = 528; break; // &boxV -> &boxVR - case 519: state = 530; break; // &boxv -> &boxvR - case 753: state = 773; break; // &circled -> &circledR - case 1346: state = 1426; break; // &Double -> &DoubleR - case 1375: state = 1381; break; // &DoubleLeft -> &DoubleLeftR - case 1396: state = 1416; break; // &DoubleLong -> &DoubleLongR - case 1400: state = 1406; break; // &DoubleLongLeft -> &DoubleLongLeftR - case 1467: state = 1559; break; // &Down -> &DownR - case 1529: state = 1530; break; // &DownLeft -> &DownLeftR - case 2368: state = 2369; break; // &HA -> &HAR - case 3035: state = 3149; break; // &Left -> &LeftR - case 3051: state = 3067; break; // &LeftArrow -> &LeftArrowR - case 3477: state = 3543; break; // &Long -> &LongR - case 3481: state = 3507; break; // &LongLeft -> &LongLeftR - case 3612: state = 3622; break; // &Lower -> &LowerR - case 3897: state = 4630; break; // &n -> &nR - case 4215: state = 4453; break; // &Not -> &NotR - case 6107: state = 6140; break; // &Short -> &ShortR - case 6583: state = 6756; break; // &T -> &TR - case 6690: state = 6691; break; // &THO -> &THOR - case 7119: state = 7129; break; // &Upper -> &UpperR + case 0: state = 6886; break; // & -> &R + case 618: state = 628; break; // &boxD -> &boxDR + case 623: state = 632; break; // &boxd -> &boxdR + case 673: state = 683; break; // &boxU -> &boxUR + case 678: state = 687; break; // &boxu -> &boxuR + case 691: state = 711; break; // &boxV -> &boxVR + case 693: state = 715; break; // &boxv -> &boxvR + case 1004: state = 1028; break; // &circled -> &circledR + case 1747: state = 1836; break; // &Double -> &DoubleR + case 1779: state = 1786; break; // &DoubleLeft -> &DoubleLeftR + case 1803: state = 1825; break; // &DoubleLong -> &DoubleLongR + case 1807: state = 1814; break; // &DoubleLongLeft -> &DoubleLongLeftR + case 1882: state = 1987; break; // &Down -> &DownR + case 1953: state = 1954; break; // &DownLeft -> &DownLeftR + case 3035: state = 3036; break; // &HA -> &HAR + case 3900: state = 4030; break; // &Left -> &LeftR + case 3917: state = 3937; break; // &LeftArrow -> &LeftArrowR + case 4436: state = 4509; break; // &Long -> &LongR + case 4440: state = 4469; break; // &LongLeft -> &LongLeftR + case 4590: state = 4601; break; // &Lower -> &LowerR + case 4965: state = 5868; break; // &n -> &nR + case 5376: state = 5656; break; // &Not -> &NotR + case 7775: state = 7812; break; // &Short -> &ShortR + case 8400: state = 8623; break; // &T -> &TR + case 8536: state = 8537; break; // &THO -> &THOR + case 9070: state = 9081; break; // &Upper -> &UpperR default: return false; } break; case 'S': switch (state) { - case 0: state = 5985; break; // & -> &S - case 753: state = 774; break; // &circled -> &circledS - case 1091: state = 1610; break; // &D -> &DS - case 1762: state = 1763; break; // &Empty -> &EmptyS - case 1767: state = 1768; break; // &EmptySmall -> &EmptySmallS - case 1778: state = 1779; break; // &EmptyVery -> &EmptyVeryS - case 1783: state = 1784; break; // &EmptyVerySmall -> &EmptyVerySmallS - case 2009: state = 2010; break; // &Filled -> &FilledS - case 2014: state = 2015; break; // &FilledSmall -> &FilledSmallS - case 2024: state = 2025; break; // &FilledVery -> &FilledVeryS - case 2029: state = 2030; break; // &FilledVerySmall -> &FilledVerySmallS - case 2237: state = 2267; break; // &Greater -> &GreaterS - case 2422: state = 2423; break; // &Hilbert -> &HilbertS - case 3322: state = 3361; break; // &Less -> &LessS - case 3808: state = 3809; break; // &Medium -> &MediumS - case 3996: state = 3997; break; // &NegativeMedium -> &NegativeMediumS - case 4006: state = 4007; break; // &NegativeThick -> &NegativeThickS - case 4012: state = 4013; break; // &NegativeThin -> &NegativeThinS - case 4025: state = 4026; break; // &NegativeVeryThin -> &NegativeVeryThinS - case 4204: state = 4205; break; // &NonBreaking -> &NonBreakingS - case 4215: state = 4487; break; // &Not -> &NotS - case 4275: state = 4301; break; // &NotGreater -> &NotGreaterS - case 4364: state = 4381; break; // &NotLess -> &NotLessS - case 4437: state = 4443; break; // &NotPrecedes -> &NotPrecedesS - case 4492: state = 4493; break; // &NotSquare -> &NotSquareS - case 4530: state = 4536; break; // &NotSucceeds -> &NotSucceedsS - case 4833: state = 5014; break; // &o -> &oS - case 5243: state = 5249; break; // &Precedes -> &PrecedesS - case 6289: state = 6305; break; // &Square -> &SquareS - case 6451: state = 6457; break; // &Succeeds -> &SucceedsS - case 6583: state = 6827; break; // &T -> &TS - case 6668: state = 6669; break; // &Thick -> &ThickS - case 6677: state = 6678; break; // &Thin -> &ThinS - case 7362: state = 7370; break; // &Vertical -> &VerticalS - case 7388: state = 7389; break; // &VeryThin -> &VeryThinS - case 7687: state = 7688; break; // &ZeroWidth -> &ZeroWidthS + case 0: state = 7610; break; // & -> &S + case 1004: state = 1030; break; // &circled -> &circledS + case 1425: state = 2048; break; // &D -> &DS + case 2248: state = 2249; break; // &Empty -> &EmptyS + case 2253: state = 2254; break; // &EmptySmall -> &EmptySmallS + case 2266: state = 2267; break; // &EmptyVery -> &EmptyVeryS + case 2271: state = 2272; break; // &EmptyVerySmall -> &EmptyVerySmallS + case 2558: state = 2559; break; // &Filled -> &FilledS + case 2563: state = 2564; break; // &FilledSmall -> &FilledSmallS + case 2574: state = 2575; break; // &FilledVery -> &FilledVeryS + case 2579: state = 2580; break; // &FilledVerySmall -> &FilledVerySmallS + case 2871: state = 2906; break; // &Greater -> &GreaterS + case 3105: state = 3106; break; // &Hilbert -> &HilbertS + case 4239: state = 4284; break; // &Less -> &LessS + case 4847: state = 4848; break; // &Medium -> &MediumS + case 5096: state = 5097; break; // &NegativeMedium -> &NegativeMediumS + case 5107: state = 5108; break; // &NegativeThick -> &NegativeThickS + case 5114: state = 5115; break; // &NegativeThin -> &NegativeThinS + case 5128: state = 5129; break; // &NegativeVeryThin -> &NegativeVeryThinS + case 5362: state = 5363; break; // &NonBreaking -> &NonBreakingS + case 5376: state = 5694; break; // &Not -> &NotS + case 5445: state = 5476; break; // &NotGreater -> &NotGreaterS + case 5552: state = 5573; break; // &NotLess -> &NotLessS + case 5637: state = 5645; break; // &NotPrecedes -> &NotPrecedesS + case 5699: state = 5700; break; // &NotSquare -> &NotSquareS + case 5743: state = 5751; break; // &NotSucceeds -> &NotSucceedsS + case 6138: state = 6376; break; // &o -> &oS + case 6677: state = 6685; break; // &Precedes -> &PrecedesS + case 8013: state = 8032; break; // &Square -> &SquareS + case 8221: state = 8229; break; // &Succeeds -> &SucceedsS + case 8400: state = 8713; break; // &T -> &TS + case 8509: state = 8510; break; // &Thick -> &ThickS + case 8520: state = 8521; break; // &Thin -> &ThinS + case 9377: state = 9387; break; // &Vertical -> &VerticalS + case 9407: state = 9408; break; // &VeryThin -> &VeryThinS + case 9798: state = 9799; break; // &ZeroWidth -> &ZeroWidthS default: return false; } break; case 'T': switch (state) { - case 0: state = 6583; break; // & -> &T - case 769: state = 784; break; // &Circle -> &CircleT - case 1200: state = 1223; break; // &Diacritical -> &DiacriticalT - case 1375: state = 1391; break; // &DoubleLeft -> &DoubleLeftT - case 1430: state = 1436; break; // &DoubleRight -> &DoubleRightT - case 1467: state = 1582; break; // &Down -> &DownT - case 1529: state = 1541; break; // &DownLeft -> &DownLeftT - case 1563: state = 1564; break; // &DownRight -> &DownRightT - case 1656: state = 1914; break; // &E -> &ET - case 1859: state = 1864; break; // &Equal -> &EqualT - case 2124: state = 2292; break; // &G -> > - case 2237: state = 2277; break; // &Greater -> &GreaterT - case 2699: state = 2705; break; // &Invisible -> &InvisibleT - case 2886: state = 3690; break; // &L -> < - case 3035: state = 3204; break; // &Left -> &LeftT - case 3102: state = 3103; break; // &LeftDown -> &LeftDownT - case 3244: state = 3255; break; // &LeftUp -> &LeftUpT - case 3322: state = 3371; break; // &Less -> &LessT - case 3990: state = 4002; break; // &Negative -> &NegativeT - case 4021: state = 4022; break; // &NegativeVery -> &NegativeVeryT - case 4215: state = 4562; break; // &Not -> &NotT - case 4258: state = 4259; break; // &NotEqual -> &NotEqualT - case 4275: state = 4311; break; // &NotGreater -> &NotGreaterT - case 4346: state = 4347; break; // &NotLeft -> &NotLeftT - case 4364: state = 4391; break; // &NotLess -> &NotLessT - case 4470: state = 4471; break; // &NotRight -> &NotRightT - case 4530: state = 4546; break; // &NotSucceeds -> &NotSucceedsT - case 4566: state = 4581; break; // &NotTilde -> &NotTildeT - case 5243: state = 5259; break; // &Precedes -> &PrecedesT - case 5393: state = 5394; break; // &QUO -> " - case 5620: state = 5764; break; // &Right -> &RightT - case 5688: state = 5689; break; // &RightDown -> &RightDownT - case 5804: state = 5815; break; // &RightUp -> &RightUpT - case 6231: state = 6232; break; // &SOF -> &SOFT - case 6451: state = 6467; break; // &Succeeds -> &SucceedsT - case 6490: state = 6491; break; // &Such -> &SuchT - case 6699: state = 6718; break; // &Tilde -> &TildeT - case 7031: state = 7150; break; // &Up -> &UpT - case 7362: state = 7379; break; // &Vertical -> &VerticalT - case 7384: state = 7385; break; // &Very -> &VeryT + case 0: state = 8400; break; // & -> &T + case 1023: state = 1043; break; // &Circle -> &CircleT + case 1566: state = 1593; break; // &Diacritical -> &DiacriticalT + case 1779: state = 1797; break; // &DoubleLeft -> &DoubleLeftT + case 1840: state = 1847; break; // &DoubleRight -> &DoubleRightT + case 1882: state = 2013; break; // &Down -> &DownT + case 1953: state = 1966; break; // &DownLeft -> &DownLeftT + case 1991: state = 1992; break; // &DownRight -> &DownRightT + case 2108: state = 2442; break; // &E -> &ET + case 2370: state = 2377; break; // &Equal -> &EqualT + case 2708: state = 2938; break; // &G -> > + case 2871: state = 2917; break; // &Greater -> &GreaterT + case 3450: state = 3457; break; // &Invisible -> &InvisibleT + case 3698: state = 4694; break; // &L -> < + case 3900: state = 4092; break; // &Left -> &LeftT + case 3976: state = 3977; break; // &LeftDown -> &LeftDownT + case 4139: state = 4151; break; // &LeftUp -> &LeftUpT + case 4239: state = 4295; break; // &Less -> &LessT + case 5090: state = 5103; break; // &Negative -> &NegativeT + case 5124: state = 5125; break; // &NegativeVery -> &NegativeVeryT + case 5376: state = 5781; break; // &Not -> &NotT + case 5425: state = 5427; break; // &NotEqual -> &NotEqualT + case 5445: state = 5487; break; // &NotGreater -> &NotGreaterT + case 5531: state = 5532; break; // &NotLeft -> &NotLeftT + case 5552: state = 5584; break; // &NotLess -> &NotLessT + case 5674: state = 5675; break; // &NotRight -> &NotRightT + case 5743: state = 5762; break; // &NotSucceeds -> &NotSucceedsT + case 5785: state = 5803; break; // &NotTilde -> &NotTildeT + case 6677: state = 6696; break; // &Precedes -> &PrecedesT + case 6870: state = 6871; break; // &QUO -> " + case 7174: state = 7337; break; // &Right -> &RightT + case 7251: state = 7252; break; // &RightDown -> &RightDownT + case 7384: state = 7396; break; // &RightUp -> &RightUpT + case 7931: state = 7932; break; // &SOF -> &SOFT + case 8221: state = 8240; break; // &Succeeds -> &SucceedsT + case 8269: state = 8270; break; // &Such -> &SuchT + case 8547: state = 8570; break; // &Tilde -> &TildeT + case 8970: state = 9108; break; // &Up -> &UpT + case 9377: state = 9397; break; // &Vertical -> &VerticalT + case 9403: state = 9404; break; // &Very -> &VeryT default: return false; } break; case 'U': switch (state) { - case 0: state = 6873; break; // & -> &U - case 470: state = 508; break; // &box -> &boxU - case 484: state = 490; break; // &boxH -> &boxHU - case 485: state = 492; break; // &boxh -> &boxhU - case 1346: state = 1439; break; // &Double -> &DoubleU - case 1472: state = 1488; break; // &DownArrow -> &DownArrowU - case 3035: state = 3243; break; // &Left -> &LeftU - case 5348: state = 5392; break; // &Q -> &QU - case 5561: state = 5579; break; // &Reverse -> &ReverseU - case 5620: state = 5803; break; // &Right -> &RightU - case 6107: state = 6150; break; // &Short -> &ShortU - case 6289: state = 6327; break; // &Square -> &SquareU - case 7584: state = 7634; break; // &Y -> &YU + case 0: state = 8768; break; // & -> &U + case 613: state = 673; break; // &box -> &boxU + case 636: state = 648; break; // &boxH -> &boxHU + case 638: state = 652; break; // &boxh -> &boxhU + case 1747: state = 1851; break; // &Double -> &DoubleU + case 1887: state = 1907; break; // &DownArrow -> &DownArrowU + case 3900: state = 4138; break; // &Left -> &LeftU + case 6813: state = 6869; break; // &Q -> &QU + case 7101: state = 7121; break; // &Reverse -> &ReverseU + case 7174: state = 7383; break; // &Right -> &RightU + case 7775: state = 7823; break; // &Short -> &ShortU + case 8013: state = 8058; break; // &Square -> &SquareU + case 9665: state = 9732; break; // &Y -> &YU default: return false; } break; case 'V': switch (state) { - case 0: state = 7307; break; // & -> &V - case 470: state = 518; break; // &box -> &boxV - case 1346: state = 1455; break; // &Double -> &DoubleV - case 1529: state = 1550; break; // &DownLeft -> &DownLeftV - case 1534: state = 1535; break; // &DownLeftRight -> &DownLeftRightV - case 1543: state = 1544; break; // &DownLeftTee -> &DownLeftTeeV - case 1563: state = 1573; break; // &DownRight -> &DownRightV - case 1566: state = 1567; break; // &DownRightTee -> &DownRightTeeV - case 1762: state = 1775; break; // &Empty -> &EmptyV - case 2009: state = 2021; break; // &Filled -> &FilledV - case 3035: state = 3273; break; // &Left -> &LeftV - case 3102: state = 3112; break; // &LeftDown -> &LeftDownV - case 3105: state = 3106; break; // &LeftDownTee -> &LeftDownTeeV - case 3153: state = 3198; break; // &LeftRight -> &LeftRightV - case 3206: state = 3212; break; // &LeftTee -> &LeftTeeV - case 3244: state = 3264; break; // &LeftUp -> &LeftUpV - case 3248: state = 3249; break; // &LeftUpDown -> &LeftUpDownV - case 3257: state = 3258; break; // &LeftUpTee -> &LeftUpTeeV - case 3897: state = 4763; break; // &n -> &nV - case 3990: state = 4018; break; // &Negative -> &NegativeV - case 4215: state = 4586; break; // &Not -> &NotV - case 4236: state = 4237; break; // &NotDouble -> &NotDoubleV - case 5620: state = 5833; break; // &Right -> &RightV - case 5688: state = 5698; break; // &RightDown -> &RightDownV - case 5691: state = 5692; break; // &RightDownTee -> &RightDownTeeV - case 5766: state = 5772; break; // &RightTee -> &RightTeeV - case 5804: state = 5824; break; // &RightUp -> &RightUpV - case 5808: state = 5809; break; // &RightUpDown -> &RightUpDownV - case 5817: state = 5818; break; // &RightUpTee -> &RightUpTeeV + case 0: state = 9303; break; // & -> &V + case 613: state = 691; break; // &box -> &boxV + case 1747: state = 1869; break; // &Double -> &DoubleV + case 1953: state = 1976; break; // &DownLeft -> &DownLeftV + case 1958: state = 1959; break; // &DownLeftRight -> &DownLeftRightV + case 1968: state = 1969; break; // &DownLeftTee -> &DownLeftTeeV + case 1991: state = 2002; break; // &DownRight -> &DownRightV + case 1994: state = 1995; break; // &DownRightTee -> &DownRightTeeV + case 2248: state = 2263; break; // &Empty -> &EmptyV + case 2558: state = 2571; break; // &Filled -> &FilledV + case 3900: state = 4172; break; // &Left -> &LeftV + case 3976: state = 3987; break; // &LeftDown -> &LeftDownV + case 3979: state = 3980; break; // &LeftDownTee -> &LeftDownTeeV + case 4034: state = 4085; break; // &LeftRight -> &LeftRightV + case 4094: state = 4102; break; // &LeftTee -> &LeftTeeV + case 4139: state = 4161; break; // &LeftUp -> &LeftUpV + case 4143: state = 4144; break; // &LeftUpDown -> &LeftUpDownV + case 4153: state = 4154; break; // &LeftUpTee -> &LeftUpTeeV + case 4965: state = 6047; break; // &n -> &nV + case 5090: state = 5121; break; // &Negative -> &NegativeV + case 5376: state = 5809; break; // &Not -> &NotV + case 5401: state = 5402; break; // &NotDouble -> &NotDoubleV + case 7174: state = 7417; break; // &Right -> &RightV + case 7251: state = 7262; break; // &RightDown -> &RightDownV + case 7254: state = 7255; break; // &RightDownTee -> &RightDownTeeV + case 7339: state = 7347; break; // &RightTee -> &RightTeeV + case 7384: state = 7406; break; // &RightUp -> &RightUpV + case 7388: state = 7389; break; // &RightUpDown -> &RightUpDownV + case 7398: state = 7399; break; // &RightUpTee -> &RightUpTeeV default: return false; } break; case 'W': switch (state) { - case 0: state = 7447; break; // & -> &W - case 7682: state = 7683; break; // &Zero -> &ZeroW + case 0: state = 9484; break; // & -> &W + case 9793: state = 9794; break; // &Zero -> &ZeroW default: return false; } break; case 'X': switch (state) { - case 0: state = 7508; break; // & -> &X + case 0: state = 9565; break; // & -> &X default: return false; } break; case 'Y': switch (state) { - case 0: state = 7584; break; // & -> &Y - case 927: state = 928; break; // &COP -> © + case 0: state = 9665; break; // & -> &Y + case 1218: state = 1219; break; // &COP -> © default: return false; } break; case 'Z': switch (state) { - case 0: state = 7645; break; // & -> &Z - case 1091: state = 1644; break; // &D -> &DZ + case 0: state = 9747; break; // & -> &Z + case 1425: state = 2093; break; // &D -> &DZ default: return false; } break; case 'a': switch (state) { - case 0: state = 7; break; // & -> &a + case 0: state = 8; break; // & -> &a case 1: state = 2; break; // &A -> &Aa - case 7: state = 8; break; // &a -> &aa - case 51: state = 52; break; // &Agr -> &Agra - case 56: state = 57; break; // &agr -> &agra - case 70: state = 71; break; // &Alph -> &Alpha - case 73: state = 74; break; // &alph -> &alpha - case 75: state = 76; break; // &Am -> &Ama - case 79: state = 80; break; // &am -> &ama - case 91: state = 92; break; // &and -> &anda - case 108: state = 109; break; // &angmsd -> &angmsda - case 109: state = 110; break; // &angmsda -> &angmsdaa - case 127: state = 128; break; // &angz -> &angza - case 143: state = 144; break; // &ap -> &apa - case 222: state = 223; break; // &b -> &ba - case 247: state = 248; break; // &B -> &Ba - case 252: state = 253; break; // &Backsl -> &Backsla - case 289: state = 290; break; // &bec -> &beca - case 294: state = 295; break; // &Bec -> &Beca - case 320: state = 321; break; // &Bet -> &Beta - case 322: state = 323; break; // &bet -> &beta - case 335: state = 336; break; // &bigc -> &bigca - case 361: state = 362; break; // &bigst -> &bigsta - case 366: state = 367; break; // &bigtri -> &bigtria - case 391: state = 392; break; // &bk -> &bka - case 396: state = 397; break; // &bl -> &bla - case 409: state = 410; break; // &blacksqu -> &blacksqua - case 415: state = 416; break; // &blacktri -> &blacktria - case 546: state = 547; break; // &brvb -> &brvba - case 583: state = 584; break; // &C -> &Ca - case 589: state = 590; break; // &c -> &ca - case 596: state = 597; break; // &cap -> &capa - case 605: state = 606; break; // &capc -> &capca - case 614: state = 615; break; // &Capit -> &Capita - case 626: state = 627; break; // &CapitalDifferenti -> &CapitalDifferentia - case 641: state = 642; break; // &cc -> &cca - case 645: state = 646; break; // &Cc -> &Cca - case 691: state = 692; break; // &Cedill -> &Cedilla - case 725: state = 726; break; // &checkm -> &checkma - case 738: state = 739; break; // &circle -> &circlea - case 753: state = 754; break; // &circled -> &circleda - case 761: state = 762; break; // &circledd -> &circledda - case 823: state = 824; break; // &ClockwiseContourIntegr -> &ClockwiseContourIntegra - case 868: state = 869; break; // &comm -> &comma - case 910: state = 911; break; // &ContourIntegr -> &ContourIntegra - case 958: state = 959; break; // &CounterClockwiseContourIntegr -> &CounterClockwiseContourIntegra - case 961: state = 962; break; // &cr -> &cra - case 988: state = 989; break; // &cud -> &cuda - case 999: state = 1000; break; // &cul -> &cula - case 1009: state = 1010; break; // &cupbrc -> &cupbrca - case 1012: state = 1013; break; // &CupC -> &CupCa - case 1015: state = 1016; break; // &cupc -> &cupca - case 1026: state = 1027; break; // &cur -> &cura - case 1055: state = 1056; break; // &curve -> &curvea - case 1091: state = 1092; break; // &D -> &Da - case 1097: state = 1098; break; // &d -> &da - case 1121: state = 1122; break; // &dbk -> &dbka - case 1126: state = 1127; break; // &dbl -> &dbla - case 1129: state = 1130; break; // &Dc -> &Dca - case 1134: state = 1135; break; // &dc -> &dca - case 1142: state = 1143; break; // &dd -> &dda - case 1152: state = 1153; break; // &DDotr -> &DDotra - case 1165: state = 1166; break; // &Delt -> &Delta - case 1168: state = 1169; break; // &delt -> &delta - case 1183: state = 1184; break; // &dH -> &dHa - case 1186: state = 1187; break; // &dh -> &dha - case 1191: state = 1192; break; // &Di -> &Dia - case 1198: state = 1199; break; // &Diacritic -> &Diacritica - case 1219: state = 1220; break; // &DiacriticalGr -> &DiacriticalGra - case 1228: state = 1229; break; // &di -> &dia - case 1251: state = 1252; break; // &Differenti -> &Differentia - case 1255: state = 1256; break; // &dig -> &diga - case 1258: state = 1259; break; // &digamm -> &digamma - case 1293: state = 1294; break; // &doll -> &dolla - case 1313: state = 1314; break; // &DotEqu -> &DotEqua - case 1327: state = 1328; break; // &dotsqu -> &dotsqua - case 1335: state = 1336; break; // &doubleb -> &doubleba - case 1359: state = 1360; break; // &DoubleContourIntegr -> &DoubleContourIntegra - case 1460: state = 1461; break; // &DoubleVertic -> &DoubleVertica - case 1463: state = 1464; break; // &DoubleVerticalB -> &DoubleVerticalBa - case 1467: state = 1473; break; // &Down -> &Downa - case 1479: state = 1480; break; // &down -> &downa - case 1485: state = 1486; break; // &DownArrowB -> &DownArrowBa - case 1503: state = 1504; break; // &downdown -> &downdowna - case 1510: state = 1511; break; // &downh -> &downha - case 1556: state = 1557; break; // &DownLeftVectorB -> &DownLeftVectorBa - case 1579: state = 1580; break; // &DownRightVectorB -> &DownRightVectorBa - case 1592: state = 1593; break; // &drbk -> &drbka - case 1631: state = 1632; break; // &du -> &dua - case 1635: state = 1636; break; // &duh -> &duha - case 1638: state = 1639; break; // &dw -> &dwa - case 1652: state = 1653; break; // &dzigr -> &dzigra - case 1656: state = 1657; break; // &E -> &Ea - case 1662: state = 1663; break; // &e -> &ea - case 1672: state = 1673; break; // &Ec -> &Eca - case 1677: state = 1678; break; // &ec -> &eca - case 1716: state = 1717; break; // &Egr -> &Egra - case 1720: state = 1721; break; // &egr -> &egra - case 1746: state = 1747; break; // &Em -> &Ema - case 1750: state = 1751; break; // &em -> &ema - case 1764: state = 1765; break; // &EmptySm -> &EmptySma - case 1770: state = 1771; break; // &EmptySmallSqu -> &EmptySmallSqua - case 1780: state = 1781; break; // &EmptyVerySm -> &EmptyVerySma - case 1786: state = 1787; break; // &EmptyVerySmallSqu -> &EmptyVerySmallSqua - case 1813: state = 1814; break; // &ep -> &epa - case 1845: state = 1846; break; // &eqsl -> &eqsla - case 1857: state = 1858; break; // &Equ -> &Equa - case 1860: state = 1861; break; // &equ -> &equa - case 1885: state = 1886; break; // &eqvp -> &eqvpa - case 1890: state = 1891; break; // &er -> &era - case 1910: state = 1911; break; // &Et -> &Eta - case 1912: state = 1913; break; // &et -> &eta - case 1939: state = 1940; break; // &expect -> &expecta - case 1951: state = 1952; break; // &Exponenti -> &Exponentia - case 1960: state = 1961; break; // &exponenti -> &exponentia - case 1964: state = 1965; break; // &f -> &fa - case 1983: state = 1984; break; // &fem -> &fema - case 2011: state = 2012; break; // &FilledSm -> &FilledSma - case 2017: state = 2018; break; // &FilledSmallSqu -> &FilledSmallSqua - case 2026: state = 2027; break; // &FilledVerySm -> &FilledVerySma - case 2032: state = 2033; break; // &FilledVerySmallSqu -> &FilledVerySmallSqua - case 2040: state = 2041; break; // &fl -> &fla - case 2062: state = 2063; break; // &for -> &fora - case 2076: state = 2077; break; // &fp -> &fpa - case 2083: state = 2084; break; // &fr -> &fra - case 2118: state = 2119; break; // &g -> &ga - case 2124: state = 2125; break; // &G -> &Ga - case 2127: state = 2128; break; // &Gamm -> &Gamma - case 2130: state = 2131; break; // &gamm -> &gamma - case 2172: state = 2173; break; // &geqsl -> &geqsla - case 2204: state = 2205; break; // &gl -> &gla - case 2208: state = 2209; break; // &gn -> &gna - case 2228: state = 2229; break; // &gr -> &gra - case 2233: state = 2234; break; // &Gre -> &Grea - case 2240: state = 2241; break; // &GreaterEqu -> &GreaterEqua - case 2253: state = 2254; break; // &GreaterFullEqu -> &GreaterFullEqua - case 2258: state = 2259; break; // &GreaterGre -> &GreaterGrea - case 2268: state = 2269; break; // &GreaterSl -> &GreaterSla - case 2274: state = 2275; break; // &GreaterSlantEqu -> &GreaterSlantEqua - case 2303: state = 2304; break; // >lP -> >lPa - case 2311: state = 2312; break; // >r -> >ra - case 2351: state = 2352; break; // &H -> &Ha - case 2356: state = 2357; break; // &h -> &ha - case 2386: state = 2387; break; // &hb -> &hba - case 2397: state = 2398; break; // &he -> &hea - case 2424: state = 2425; break; // &HilbertSp -> &HilbertSpa - case 2430: state = 2431; break; // &hkse -> &hksea - case 2435: state = 2436; break; // &hksw -> &hkswa - case 2440: state = 2441; break; // &ho -> &hoa - case 2453: state = 2454; break; // &hookleft -> &hooklefta - case 2463: state = 2464; break; // &hookright -> &hookrighta - case 2475: state = 2476; break; // &horb -> &horba - case 2483: state = 2484; break; // &Horizont -> &Horizonta - case 2496: state = 2497; break; // &hsl -> &hsla - case 2521: state = 2522; break; // &HumpEqu -> &HumpEqua - case 2533: state = 2534; break; // &I -> &Ia - case 2539: state = 2540; break; // &i -> &ia - case 2573: state = 2574; break; // &Igr -> &Igra - case 2578: state = 2579; break; // &igr -> &igra - case 2594: state = 2595; break; // &iiot -> &iiota - case 2604: state = 2605; break; // &Im -> &Ima - case 2608: state = 2609; break; // &im -> &ima - case 2616: state = 2617; break; // &Imagin -> &Imagina - case 2625: state = 2626; break; // &imagp -> &imagpa - case 2642: state = 2643; break; // &inc -> &inca - case 2659: state = 2660; break; // &intc -> &intca - case 2669: state = 2670; break; // &Integr -> &Integra - case 2673: state = 2674; break; // &interc -> &interca - case 2684: state = 2685; break; // &intl -> &intla - case 2703: state = 2704; break; // &InvisibleComm -> &InvisibleComma - case 2727: state = 2728; break; // &Iot -> &Iota - case 2729: state = 2730; break; // &iot -> &iota - case 2793: state = 2794; break; // &jm -> &jma - case 2825: state = 2826; break; // &K -> &Ka - case 2828: state = 2829; break; // &Kapp -> &Kappa - case 2830: state = 2831; break; // &k -> &ka - case 2833: state = 2834; break; // &kapp -> &kappa - case 2881: state = 2892; break; // &l -> &la - case 2882: state = 2883; break; // &lA -> &lAa - case 2886: state = 2887; break; // &L -> &La - case 2904: state = 2905; break; // &lagr -> &lagra - case 2909: state = 2910; break; // &Lambd -> &Lambda - case 2913: state = 2914; break; // &lambd -> &lambda - case 2924: state = 2925; break; // &Lapl -> &Lapla - case 2956: state = 2961; break; // &lat -> &lata - case 2957: state = 2958; break; // &lAt -> &lAta - case 2966: state = 2967; break; // &lB -> &lBa - case 2970: state = 2971; break; // &lb -> &lba - case 2977: state = 2978; break; // &lbr -> &lbra - case 2988: state = 2989; break; // &Lc -> &Lca - case 2993: state = 2994; break; // &lc -> &lca - case 3013: state = 3014; break; // &ldc -> &ldca - case 3021: state = 3022; break; // &ldrdh -> &ldrdha - case 3026: state = 3027; break; // &ldrush -> &ldrusha - case 3035: state = 3052; break; // &Left -> &Lefta - case 3042: state = 3043; break; // &LeftAngleBr -> &LeftAngleBra - case 3058: state = 3059; break; // &left -> &lefta - case 3064: state = 3065; break; // &LeftArrowB -> &LeftArrowBa - case 3077: state = 3078; break; // &leftarrowt -> &leftarrowta - case 3095: state = 3096; break; // &LeftDoubleBr -> &LeftDoubleBra - case 3118: state = 3119; break; // &LeftDownVectorB -> &LeftDownVectorBa - case 3126: state = 3127; break; // &lefth -> &leftha - case 3142: state = 3143; break; // &leftleft -> &leftlefta - case 3163: state = 3164; break; // &Leftright -> &Leftrighta - case 3173: state = 3174; break; // &leftright -> &leftrighta - case 3180: state = 3181; break; // &leftrighth -> &leftrightha - case 3192: state = 3193; break; // &leftrightsquig -> &leftrightsquiga - case 3229: state = 3230; break; // &LeftTri -> &LeftTria - case 3235: state = 3236; break; // &LeftTriangleB -> &LeftTriangleBa - case 3240: state = 3241; break; // &LeftTriangleEqu -> &LeftTriangleEqua - case 3270: state = 3271; break; // &LeftUpVectorB -> &LeftUpVectorBa - case 3279: state = 3280; break; // &LeftVectorB -> &LeftVectorBa - case 3287: state = 3288; break; // &leqsl -> &leqsla - case 3302: state = 3303; break; // &less -> &lessa - case 3325: state = 3326; break; // &LessEqu -> &LessEqua - case 3330: state = 3331; break; // &LessEqualGre -> &LessEqualGrea - case 3341: state = 3342; break; // &LessFullEqu -> &LessFullEqua - case 3346: state = 3347; break; // &LessGre -> &LessGrea - case 3362: state = 3363; break; // &LessSl -> &LessSla - case 3368: state = 3369; break; // &LessSlantEqu -> &LessSlantEqua - case 3390: state = 3391; break; // &lH -> &lHa - case 3393: state = 3394; break; // &lh -> &lha - case 3409: state = 3410; break; // &ll -> &lla - case 3421: state = 3422; break; // &Lleft -> &Llefta - case 3427: state = 3428; break; // &llh -> &llha - case 3447: state = 3448; break; // &lmoust -> &lmousta - case 3452: state = 3453; break; // &ln -> &lna - case 3466: state = 3467; break; // &lo -> &loa - case 3490: state = 3491; break; // &Longleft -> &Longlefta - case 3501: state = 3502; break; // &longleft -> &longlefta - case 3521: state = 3522; break; // &Longleftright -> &Longleftrighta - case 3531: state = 3532; break; // &longleftright -> &longleftrighta - case 3537: state = 3538; break; // &longm -> &longma - case 3557: state = 3558; break; // &Longright -> &Longrighta - case 3567: state = 3568; break; // &longright -> &longrighta - case 3574: state = 3575; break; // &loop -> &loopa - case 3589: state = 3590; break; // &lop -> &lopa - case 3603: state = 3604; break; // &low -> &lowa - case 3607: state = 3608; break; // &lowb -> &lowba - case 3638: state = 3639; break; // &lp -> &lpa - case 3643: state = 3644; break; // &lr -> &lra - case 3653: state = 3654; break; // &lrh -> &lrha - case 3661: state = 3662; break; // &ls -> &lsa - case 3708: state = 3709; break; // <l -> <la - case 3721: state = 3722; break; // <rP -> <rPa - case 3728: state = 3729; break; // &lurdsh -> &lurdsha - case 3732: state = 3733; break; // &luruh -> &luruha - case 3745: state = 3746; break; // &m -> &ma - case 3755: state = 3756; break; // &M -> &Ma - case 3779: state = 3780; break; // &mcomm -> &mcomma - case 3784: state = 3785; break; // &md -> &mda - case 3792: state = 3793; break; // &me -> &mea - case 3798: state = 3799; break; // &measured -> &measureda - case 3810: state = 3811; break; // &MediumSp -> &MediumSpa - case 3831: state = 3832; break; // &mid -> &mida - case 3891: state = 3892; break; // &multim -> &multima - case 3894: state = 3895; break; // &mum -> &muma - case 3897: state = 3898; break; // &n -> &na - case 3900: state = 3901; break; // &nabl -> &nabla - case 3902: state = 3903; break; // &N -> &Na - case 3926: state = 3927; break; // &natur -> &natura - case 3937: state = 3938; break; // &nc -> &nca - case 3940: state = 3941; break; // &Nc -> &Nca - case 3966: state = 3967; break; // &nd -> &nda - case 3970: state = 3971; break; // &ne -> &nea - case 3985: state = 3986; break; // &Neg -> &Nega - case 3998: state = 3999; break; // &NegativeMediumSp -> &NegativeMediumSpa - case 4008: state = 4009; break; // &NegativeThickSp -> &NegativeThickSpa - case 4014: state = 4015; break; // &NegativeThinSp -> &NegativeThinSpa - case 4027: state = 4028; break; // &NegativeVeryThinSp -> &NegativeVeryThinSpa - case 4036: state = 4037; break; // &nese -> &nesea - case 4047: state = 4048; break; // &NestedGre -> &NestedGrea - case 4054: state = 4055; break; // &NestedGreaterGre -> &NestedGreaterGrea - case 4087: state = 4088; break; // &ngeqsl -> &ngeqsla - case 4101: state = 4105; break; // &nh -> &nha - case 4108: state = 4109; break; // &nhp -> &nhpa - case 4121: state = 4125; break; // &nl -> &nla - case 4135: state = 4136; break; // &nLeft -> &nLefta - case 4142: state = 4143; break; // &nleft -> &nlefta - case 4152: state = 4153; break; // &nLeftright -> &nLeftrighta - case 4162: state = 4163; break; // &nleftright -> &nleftrighta - case 4171: state = 4172; break; // &nleqsl -> &nleqsla - case 4193: state = 4194; break; // &NoBre -> &NoBrea - case 4199: state = 4200; break; // &NonBre -> &NonBrea - case 4206: state = 4207; break; // &NonBreakingSp -> &NonBreakingSpa - case 4228: state = 4229; break; // &NotCupC -> &NotCupCa - case 4242: state = 4243; break; // &NotDoubleVertic -> &NotDoubleVertica - case 4245: state = 4246; break; // &NotDoubleVerticalB -> &NotDoubleVerticalBa - case 4256: state = 4257; break; // &NotEqu -> &NotEqua - case 4271: state = 4272; break; // &NotGre -> &NotGrea - case 4278: state = 4279; break; // &NotGreaterEqu -> &NotGreaterEqua - case 4287: state = 4288; break; // &NotGreaterFullEqu -> &NotGreaterFullEqua - case 4292: state = 4293; break; // &NotGreaterGre -> &NotGreaterGrea - case 4302: state = 4303; break; // &NotGreaterSl -> &NotGreaterSla - case 4308: state = 4309; break; // &NotGreaterSlantEqu -> &NotGreaterSlantEqua - case 4330: state = 4331; break; // &NotHumpEqu -> &NotHumpEqua - case 4339: state = 4340; break; // ¬inv -> ¬inva - case 4349: state = 4350; break; // &NotLeftTri -> &NotLeftTria - case 4355: state = 4356; break; // &NotLeftTriangleB -> &NotLeftTriangleBa - case 4360: state = 4361; break; // &NotLeftTriangleEqu -> &NotLeftTriangleEqua - case 4367: state = 4368; break; // &NotLessEqu -> &NotLessEqua - case 4372: state = 4373; break; // &NotLessGre -> &NotLessGrea - case 4382: state = 4383; break; // &NotLessSl -> &NotLessSla - case 4388: state = 4389; break; // &NotLessSlantEqu -> &NotLessSlantEqua - case 4404: state = 4405; break; // &NotNestedGre -> &NotNestedGrea - case 4411: state = 4412; break; // &NotNestedGreaterGre -> &NotNestedGreaterGrea - case 4426: state = 4427; break; // ¬niv -> ¬niva - case 4440: state = 4441; break; // &NotPrecedesEqu -> &NotPrecedesEqua - case 4444: state = 4445; break; // &NotPrecedesSl -> &NotPrecedesSla - case 4450: state = 4451; break; // &NotPrecedesSlantEqu -> &NotPrecedesSlantEqua - case 4473: state = 4474; break; // &NotRightTri -> &NotRightTria - case 4479: state = 4480; break; // &NotRightTriangleB -> &NotRightTriangleBa - case 4484: state = 4485; break; // &NotRightTriangleEqu -> &NotRightTriangleEqua - case 4489: state = 4490; break; // &NotSqu -> &NotSqua - case 4501: state = 4502; break; // &NotSquareSubsetEqu -> &NotSquareSubsetEqua - case 4512: state = 4513; break; // &NotSquareSupersetEqu -> &NotSquareSupersetEqua - case 4522: state = 4523; break; // &NotSubsetEqu -> &NotSubsetEqua - case 4533: state = 4534; break; // &NotSucceedsEqu -> &NotSucceedsEqua - case 4537: state = 4538; break; // &NotSucceedsSl -> &NotSucceedsSla - case 4543: state = 4544; break; // &NotSucceedsSlantEqu -> &NotSucceedsSlantEqua - case 4559: state = 4560; break; // &NotSupersetEqu -> &NotSupersetEqua - case 4569: state = 4570; break; // &NotTildeEqu -> &NotTildeEqua - case 4578: state = 4579; break; // &NotTildeFullEqu -> &NotTildeFullEqua - case 4591: state = 4592; break; // &NotVertic -> &NotVertica - case 4594: state = 4595; break; // &NotVerticalB -> &NotVerticalBa - case 4597: state = 4598; break; // &np -> &npa - case 4599: state = 4600; break; // &npar -> &npara - case 4621: state = 4625; break; // &nr -> &nra - case 4634: state = 4635; break; // &nRight -> &nRighta - case 4643: state = 4644; break; // &nright -> &nrighta - case 4670: state = 4671; break; // &nshortp -> &nshortpa - case 4672: state = 4673; break; // &nshortpar -> &nshortpara - case 4685: state = 4686; break; // &nsp -> &nspa - case 4733: state = 4734; break; // &ntri -> &ntria - case 4760: state = 4761; break; // &nv -> &nva - case 4764: state = 4765; break; // &nVD -> &nVDa - case 4768: state = 4769; break; // &nVd -> &nVda - case 4772: state = 4773; break; // &nvD -> &nvDa - case 4776: state = 4777; break; // &nvd -> &nvda - case 4783: state = 4784; break; // &nvH -> &nvHa - case 4812: state = 4813; break; // &nw -> &nwa - case 4824: state = 4825; break; // &nwne -> &nwnea - case 4827: state = 4828; break; // &O -> &Oa - case 4833: state = 4834; break; // &o -> &oa - case 4851: state = 4852; break; // &od -> &oda - case 4857: state = 4858; break; // &Odbl -> &Odbla - case 4861: state = 4862; break; // &odbl -> &odbla - case 4891: state = 4892; break; // &Ogr -> &Ogra - case 4895: state = 4896; break; // &ogr -> &ogra - case 4901: state = 4902; break; // &ohb -> &ohba - case 4908: state = 4909; break; // &ol -> &ola - case 4923: state = 4924; break; // &Om -> &Oma - case 4927: state = 4928; break; // &om -> &oma - case 4932: state = 4933; break; // &Omeg -> &Omega - case 4935: state = 4936; break; // &omeg -> &omega - case 4957: state = 4958; break; // &op -> &opa - case 4991: state = 4992; break; // &or -> &ora - case 5021: state = 5022; break; // &Osl -> &Osla - case 5025: state = 5026; break; // &osl -> &osla - case 5046: state = 5047; break; // &otimes -> &otimesa - case 5056: state = 5057; break; // &ovb -> &ovba - case 5062: state = 5063; break; // &OverB -> &OverBa - case 5065: state = 5066; break; // &OverBr -> &OverBra - case 5072: state = 5073; break; // &OverP -> &OverPa - case 5083: state = 5084; break; // &p -> &pa - case 5085: state = 5086; break; // &par -> ¶ - case 5096: state = 5097; break; // &P -> &Pa - case 5100: state = 5101; break; // &Parti -> &Partia - case 5134: state = 5135; break; // &phmm -> &phmma - case 5150: state = 5151; break; // &pl -> &pla - case 5159: state = 5160; break; // &plus -> &plusa - case 5192: state = 5193; break; // &Poinc -> &Poinca - case 5197: state = 5198; break; // &Poincarepl -> &Poincarepla - case 5216: state = 5217; break; // &pr -> &pra - case 5224: state = 5225; break; // &prec -> &preca - case 5246: state = 5247; break; // &PrecedesEqu -> &PrecedesEqua - case 5250: state = 5251; break; // &PrecedesSl -> &PrecedesSla - case 5256: state = 5257; break; // &PrecedesSlantEqu -> &PrecedesSlantEqua - case 5266: state = 5267; break; // &precn -> &precna - case 5289: state = 5290; break; // &prn -> &prna - case 5303: state = 5304; break; // &prof -> &profa - case 5305: state = 5306; break; // &profal -> &profala - case 5323: state = 5324; break; // &Proportion -> &Proportiona - case 5374: state = 5375; break; // &qu -> &qua - case 5397: state = 5402; break; // &r -> &ra - case 5398: state = 5399; break; // &rA -> &rAa - case 5405: state = 5406; break; // &R -> &Ra - case 5439: state = 5440; break; // &rarr -> &rarra - case 5462: state = 5463; break; // &rAt -> &rAta - case 5466: state = 5467; break; // &rat -> &rata - case 5472: state = 5473; break; // &ration -> &rationa - case 5476: state = 5477; break; // &RB -> &RBa - case 5480: state = 5481; break; // &rB -> &rBa - case 5484: state = 5485; break; // &rb -> &rba - case 5491: state = 5492; break; // &rbr -> &rbra - case 5502: state = 5503; break; // &Rc -> &Rca - case 5507: state = 5508; break; // &rc -> &rca - case 5527: state = 5528; break; // &rdc -> &rdca - case 5531: state = 5532; break; // &rdldh -> &rdldha - case 5541: state = 5542; break; // &re -> &rea - case 5547: state = 5548; break; // &realp -> &realpa - case 5604: state = 5605; break; // &rH -> &rHa - case 5607: state = 5608; break; // &rh -> &rha - case 5620: state = 5637; break; // &Right -> &Righta - case 5627: state = 5628; break; // &RightAngleBr -> &RightAngleBra - case 5645: state = 5646; break; // &right -> &righta - case 5651: state = 5652; break; // &RightArrowB -> &RightArrowBa - case 5663: state = 5664; break; // &rightarrowt -> &rightarrowta - case 5681: state = 5682; break; // &RightDoubleBr -> &RightDoubleBra - case 5704: state = 5705; break; // &RightDownVectorB -> &RightDownVectorBa - case 5712: state = 5713; break; // &righth -> &rightha - case 5728: state = 5729; break; // &rightleft -> &rightlefta - case 5735: state = 5736; break; // &rightlefth -> &rightleftha - case 5747: state = 5748; break; // &rightright -> &rightrighta - case 5758: state = 5759; break; // &rightsquig -> &rightsquiga - case 5789: state = 5790; break; // &RightTri -> &RightTria - case 5795: state = 5796; break; // &RightTriangleB -> &RightTriangleBa - case 5800: state = 5801; break; // &RightTriangleEqu -> &RightTriangleEqua - case 5830: state = 5831; break; // &RightUpVectorB -> &RightUpVectorBa - case 5839: state = 5840; break; // &RightVectorB -> &RightVectorBa - case 5854: state = 5855; break; // &rl -> &rla - case 5858: state = 5859; break; // &rlh -> &rlha - case 5866: state = 5867; break; // &rmoust -> &rmousta - case 5875: state = 5876; break; // &ro -> &roa - case 5884: state = 5885; break; // &rop -> &ropa - case 5909: state = 5910; break; // &rp -> &rpa - case 5920: state = 5921; break; // &rr -> &rra - case 5928: state = 5929; break; // &Rright -> &Rrighta - case 5934: state = 5935; break; // &rs -> &rsa - case 5973: state = 5974; break; // &RuleDel -> &RuleDela - case 5981: state = 5982; break; // &ruluh -> &ruluha - case 5985: state = 5986; break; // &S -> &Sa - case 5991: state = 5992; break; // &s -> &sa - case 6001: state = 6005; break; // &Sc -> &Sca - case 6002: state = 6003; break; // &sc -> &sca - case 6030: state = 6031; break; // &scn -> &scna - case 6053: state = 6054; break; // &se -> &sea - case 6069: state = 6070; break; // &sesw -> &seswa - case 6088: state = 6089; break; // &sh -> &sha - case 6132: state = 6133; break; // &shortp -> &shortpa - case 6134: state = 6135; break; // &shortpar -> &shortpara - case 6160: state = 6161; break; // &Sigm -> &Sigma - case 6164: state = 6165; break; // &sigm -> &sigma - case 6184: state = 6185; break; // &simr -> &simra - case 6188: state = 6189; break; // &sl -> &sla - case 6192: state = 6193; break; // &Sm -> &Sma - case 6202: state = 6203; break; // &sm -> &sma - case 6218: state = 6219; break; // &smep -> &smepa - case 6241: state = 6242; break; // &solb -> &solba - case 6249: state = 6250; break; // &sp -> &spa - case 6259: state = 6260; break; // &sqc -> &sqca - case 6285: state = 6290; break; // &squ -> &squa - case 6286: state = 6287; break; // &Squ -> &Squa - case 6313: state = 6314; break; // &SquareSubsetEqu -> &SquareSubsetEqua - case 6324: state = 6325; break; // &SquareSupersetEqu -> &SquareSupersetEqua - case 6334: state = 6335; break; // &sr -> &sra - case 6352: state = 6353; break; // &sst -> &ssta - case 6356: state = 6357; break; // &St -> &Sta - case 6359: state = 6360; break; // &st -> &sta - case 6363: state = 6364; break; // &str -> &stra - case 6404: state = 6405; break; // &subr -> &subra - case 6419: state = 6420; break; // &SubsetEqu -> &SubsetEqua - case 6432: state = 6433; break; // &succ -> &succa - case 6454: state = 6455; break; // &SucceedsEqu -> &SucceedsEqua - case 6458: state = 6459; break; // &SucceedsSl -> &SucceedsSla - case 6464: state = 6465; break; // &SucceedsSlantEqu -> &SucceedsSlantEqua - case 6474: state = 6475; break; // &succn -> &succna - case 6492: state = 6493; break; // &SuchTh -> &SuchTha - case 6522: state = 6523; break; // &SupersetEqu -> &SupersetEqua - case 6531: state = 6532; break; // &supl -> &supla - case 6564: state = 6565; break; // &sw -> &swa - case 6576: state = 6577; break; // &swnw -> &swnwa - case 6583: state = 6584; break; // &T -> &Ta - case 6586: state = 6587; break; // &t -> &ta - case 6597: state = 6598; break; // &Tc -> &Tca - case 6602: state = 6603; break; // &tc -> &tca - case 6646: state = 6647; break; // &Thet -> &Theta - case 6648: state = 6649; break; // &thet -> &theta - case 6656: state = 6657; break; // &thick -> &thicka - case 6670: state = 6671; break; // &ThickSp -> &ThickSpa - case 6679: state = 6680; break; // &ThinSp -> &ThinSpa - case 6683: state = 6684; break; // &thk -> &thka - case 6706: state = 6707; break; // &TildeEqu -> &TildeEqua - case 6715: state = 6716; break; // &TildeFullEqu -> &TildeFullEqua - case 6726: state = 6727; break; // ×b -> ×ba - case 6733: state = 6734; break; // &toe -> &toea - case 6749: state = 6750; break; // &tos -> &tosa - case 6760: state = 6761; break; // &tr -> &tra - case 6764: state = 6765; break; // &tri -> &tria - case 6851: state = 6852; break; // &twohe -> &twohea - case 6857: state = 6858; break; // &twoheadleft -> &twoheadlefta - case 6867: state = 6868; break; // &twoheadright -> &twoheadrighta - case 6873: state = 6874; break; // &U -> &Ua - case 6879: state = 6880; break; // &u -> &ua - case 6920: state = 6921; break; // &ud -> &uda - case 6926: state = 6927; break; // &Udbl -> &Udbla - case 6930: state = 6931; break; // &udbl -> &udbla - case 6933: state = 6934; break; // &udh -> &udha - case 6945: state = 6946; break; // &Ugr -> &Ugra - case 6950: state = 6951; break; // &ugr -> &ugra - case 6954: state = 6955; break; // &uH -> &uHa - case 6957: state = 6958; break; // &uh -> &uha - case 6978: state = 6979; break; // &Um -> &Uma - case 6982: state = 6983; break; // &um -> &uma - case 6991: state = 6992; break; // &UnderB -> &UnderBa - case 6994: state = 6995; break; // &UnderBr -> &UnderBra - case 7001: state = 7002; break; // &UnderP -> &UnderPa - case 7031: state = 7037; break; // &Up -> &Upa - case 7042: state = 7043; break; // &up -> &upa - case 7048: state = 7049; break; // &UpArrowB -> &UpArrowBa - case 7072: state = 7073; break; // &Updown -> &Updowna - case 7081: state = 7082; break; // &updown -> &updowna - case 7098: state = 7099; break; // &uph -> &upha - case 7159: state = 7160; break; // &upup -> &upupa - case 7208: state = 7209; break; // &uu -> &uua - case 7217: state = 7218; break; // &uw -> &uwa - case 7223: state = 7224; break; // &v -> &va - case 7237: state = 7238; break; // &vark -> &varka - case 7240: state = 7241; break; // &varkapp -> &varkappa - case 7267: state = 7268; break; // &varsigm -> &varsigma - case 7289: state = 7290; break; // &varthet -> &vartheta - case 7292: state = 7293; break; // &vartri -> &vartria - case 7308: state = 7309; break; // &Vb -> &Vba - case 7311: state = 7312; break; // &vB -> &vBa - case 7319: state = 7320; break; // &VD -> &VDa - case 7323: state = 7324; break; // &Vd -> &Vda - case 7327: state = 7328; break; // &vD -> &vDa - case 7331: state = 7332; break; // &vd -> &vda - case 7340: state = 7341; break; // &veeb -> &veeba - case 7350: state = 7351; break; // &Verb -> &Verba - case 7354: state = 7355; break; // &verb -> &verba - case 7360: state = 7361; break; // &Vertic -> &Vertica - case 7363: state = 7364; break; // &VerticalB -> &VerticalBa - case 7372: state = 7373; break; // &VerticalSep -> &VerticalSepa - case 7374: state = 7375; break; // &VerticalSepar -> &VerticalSepara - case 7390: state = 7391; break; // &VeryThinSp -> &VeryThinSpa - case 7437: state = 7438; break; // &Vvd -> &Vvda - case 7444: state = 7445; break; // &vzigz -> &vzigza - case 7459: state = 7460; break; // &wedb -> &wedba - case 7485: state = 7486; break; // &wre -> &wrea - case 7496: state = 7497; break; // &xc -> &xca - case 7513: state = 7517; break; // &xh -> &xha - case 7522: state = 7526; break; // &xl -> &xla - case 7529: state = 7530; break; // &xm -> &xma - case 7551: state = 7555; break; // &xr -> &xra - case 7584: state = 7585; break; // &Y -> &Ya - case 7590: state = 7591; break; // &y -> &ya - case 7645: state = 7646; break; // &Z -> &Za - case 7651: state = 7652; break; // &z -> &za - case 7657: state = 7658; break; // &Zc -> &Zca - case 7662: state = 7663; break; // &zc -> &zca - case 7689: state = 7690; break; // &ZeroWidthSp -> &ZeroWidthSpa - case 7693: state = 7694; break; // &Zet -> &Zeta - case 7695: state = 7696; break; // &zet -> &zeta - case 7709: state = 7710; break; // &zigr -> &zigra + case 8: state = 9; break; // &a -> &aa + case 68: state = 69; break; // &Agr -> &Agra + case 74: state = 75; break; // &agr -> &agra + case 91: state = 92; break; // &Alph -> &Alpha + case 95: state = 96; break; // &alph -> &alpha + case 98: state = 99; break; // &Am -> &Ama + case 103: state = 104; break; // &am -> &ama + case 120: state = 122; break; // &and -> &anda + case 145: state = 147; break; // &angmsd -> &angmsda + case 147: state = 148; break; // &angmsda -> &angmsdaa + case 178: state = 179; break; // &angz -> &angza + case 199: state = 201; break; // &ap -> &apa + case 301: state = 302; break; // &b -> &ba + case 331: state = 332; break; // &B -> &Ba + case 336: state = 337; break; // &Backsl -> &Backsla + case 385: state = 386; break; // &bec -> &beca + case 391: state = 392; break; // &Bec -> &Beca + case 423: state = 424; break; // &Bet -> &Beta + case 426: state = 427; break; // &bet -> &beta + case 444: state = 445; break; // &bigc -> &bigca + case 477: state = 478; break; // &bigst -> &bigsta + case 483: state = 484; break; // &bigtri -> &bigtria + case 513: state = 514; break; // &bk -> &bka + case 519: state = 520; break; // &bl -> &bla + case 533: state = 534; break; // &blacksqu -> &blacksqua + case 540: state = 541; break; // &blacktri -> &blacktria + case 736: state = 737; break; // &brvb -> &brvba + case 789: state = 790; break; // &C -> &Ca + case 796: state = 797; break; // &c -> &ca + case 805: state = 807; break; // &cap -> &capa + case 817: state = 818; break; // &capc -> &capca + case 829: state = 830; break; // &Capit -> &Capita + case 841: state = 842; break; // &CapitalDifferenti -> &CapitalDifferentia + case 861: state = 862; break; // &cc -> &cca + case 866: state = 867; break; // &Cc -> &Cca + case 924: state = 925; break; // &Cedill -> &Cedilla + case 968: state = 969; break; // &checkm -> &checkma + case 987: state = 988; break; // &circle -> &circlea + case 1004: state = 1005; break; // &circled -> &circleda + case 1014: state = 1015; break; // &circledd -> &circledda + case 1088: state = 1089; break; // &ClockwiseContourIntegr -> &ClockwiseContourIntegra + case 1143: state = 1144; break; // &comm -> &comma + case 1196: state = 1197; break; // &ContourIntegr -> &ContourIntegra + case 1252: state = 1253; break; // &CounterClockwiseContourIntegr -> &CounterClockwiseContourIntegra + case 1256: state = 1257; break; // &cr -> &cra + case 1293: state = 1294; break; // &cud -> &cuda + case 1308: state = 1309; break; // &cul -> &cula + case 1322: state = 1323; break; // &cupbrc -> &cupbrca + case 1326: state = 1327; break; // &CupC -> &CupCa + case 1330: state = 1331; break; // &cupc -> &cupca + case 1346: state = 1347; break; // &cur -> &cura + case 1382: state = 1383; break; // &curve -> &curvea + case 1425: state = 1426; break; // &D -> &Da + case 1432: state = 1433; break; // &d -> &da + case 1464: state = 1465; break; // &dbk -> &dbka + case 1470: state = 1471; break; // &dbl -> &dbla + case 1474: state = 1475; break; // &Dc -> &Dca + case 1480: state = 1481; break; // &dc -> &dca + case 1492: state = 1494; break; // &dd -> &dda + case 1505: state = 1506; break; // &DDotr -> &DDotra + case 1522: state = 1523; break; // &Delt -> &Delta + case 1526: state = 1527; break; // &delt -> &delta + case 1546: state = 1547; break; // &dH -> &dHa + case 1550: state = 1551; break; // &dh -> &dha + case 1557: state = 1558; break; // &Di -> &Dia + case 1564: state = 1565; break; // &Diacritic -> &Diacritica + case 1588: state = 1589; break; // &DiacriticalGr -> &DiacriticalGra + case 1599: state = 1600; break; // &di -> &dia + case 1628: state = 1629; break; // &Differenti -> &Differentia + case 1633: state = 1634; break; // &dig -> &diga + case 1636: state = 1637; break; // &digamm -> &digamma + case 1681: state = 1682; break; // &doll -> &dolla + case 1709: state = 1710; break; // &DotEqu -> &DotEqua + case 1726: state = 1727; break; // &dotsqu -> &dotsqua + case 1735: state = 1736; break; // &doubleb -> &doubleba + case 1760: state = 1761; break; // &DoubleContourIntegr -> &DoubleContourIntegra + case 1874: state = 1875; break; // &DoubleVertic -> &DoubleVertica + case 1877: state = 1878; break; // &DoubleVerticalB -> &DoubleVerticalBa + case 1882: state = 1889; break; // &Down -> &Downa + case 1896: state = 1897; break; // &down -> &downa + case 1903: state = 1904; break; // &DownArrowB -> &DownArrowBa + case 1924: state = 1925; break; // &downdown -> &downdowna + case 1932: state = 1933; break; // &downh -> &downha + case 1983: state = 1984; break; // &DownLeftVectorB -> &DownLeftVectorBa + case 2009: state = 2010; break; // &DownRightVectorB -> &DownRightVectorBa + case 2025: state = 2026; break; // &drbk -> &drbka + case 2077: state = 2078; break; // &du -> &dua + case 2082: state = 2083; break; // &duh -> &duha + case 2086: state = 2087; break; // &dw -> &dwa + case 2103: state = 2104; break; // &dzigr -> &dzigra + case 2108: state = 2109; break; // &E -> &Ea + case 2115: state = 2116; break; // &e -> &ea + case 2127: state = 2128; break; // &Ec -> &Eca + case 2133: state = 2134; break; // &ec -> &eca + case 2188: state = 2189; break; // &Egr -> &Egra + case 2193: state = 2194; break; // &egr -> &egra + case 2228: state = 2229; break; // &Em -> &Ema + case 2233: state = 2234; break; // &em -> &ema + case 2250: state = 2251; break; // &EmptySm -> &EmptySma + case 2256: state = 2257; break; // &EmptySmallSqu -> &EmptySmallSqua + case 2268: state = 2269; break; // &EmptyVerySm -> &EmptyVerySma + case 2274: state = 2275; break; // &EmptyVerySmallSqu -> &EmptyVerySmallSqua + case 2312: state = 2313; break; // &ep -> &epa + case 2354: state = 2355; break; // &eqsl -> &eqsla + case 2368: state = 2369; break; // &Equ -> &Equa + case 2372: state = 2373; break; // &equ -> &equa + case 2403: state = 2404; break; // &eqvp -> &eqvpa + case 2409: state = 2410; break; // &er -> &era + case 2436: state = 2437; break; // &Et -> &Eta + case 2439: state = 2440; break; // &et -> &eta + case 2475: state = 2476; break; // &expect -> &expecta + case 2488: state = 2489; break; // &Exponenti -> &Exponentia + case 2498: state = 2499; break; // &exponenti -> &exponentia + case 2503: state = 2504; break; // &f -> &fa + case 2525: state = 2526; break; // &fem -> &fema + case 2560: state = 2561; break; // &FilledSm -> &FilledSma + case 2566: state = 2567; break; // &FilledSmallSqu -> &FilledSmallSqua + case 2576: state = 2577; break; // &FilledVerySm -> &FilledVerySma + case 2582: state = 2583; break; // &FilledVerySmallSqu -> &FilledVerySmallSqua + case 2592: state = 2593; break; // &fl -> &fla + case 2621: state = 2622; break; // &for -> &fora + case 2639: state = 2640; break; // &fp -> &fpa + case 2647: state = 2648; break; // &fr -> &fra + case 2701: state = 2702; break; // &g -> &ga + case 2708: state = 2709; break; // &G -> &Ga + case 2711: state = 2712; break; // &Gamm -> &Gamma + case 2715: state = 2716; break; // &gamm -> &gamma + case 2776: state = 2777; break; // &geqsl -> &geqsla + case 2824: state = 2826; break; // &gl -> &gla + case 2832: state = 2833; break; // &gn -> &gna + case 2861: state = 2862; break; // &gr -> &gra + case 2867: state = 2868; break; // &Gre -> &Grea + case 2874: state = 2875; break; // &GreaterEqu -> &GreaterEqua + case 2889: state = 2890; break; // &GreaterFullEqu -> &GreaterFullEqua + case 2895: state = 2896; break; // &GreaterGre -> &GreaterGrea + case 2907: state = 2908; break; // &GreaterSl -> &GreaterSla + case 2913: state = 2914; break; // &GreaterSlantEqu -> &GreaterSlantEqua + case 2955: state = 2956; break; // >lP -> >lPa + case 2965: state = 2966; break; // >r -> >ra + case 3014: state = 3015; break; // &H -> &Ha + case 3020: state = 3021; break; // &h -> &ha + case 3060: state = 3061; break; // &hb -> &hba + case 3074: state = 3075; break; // &he -> &hea + case 3107: state = 3108; break; // &HilbertSp -> &HilbertSpa + case 3114: state = 3115; break; // &hkse -> &hksea + case 3120: state = 3121; break; // &hksw -> &hkswa + case 3126: state = 3127; break; // &ho -> &hoa + case 3141: state = 3142; break; // &hookleft -> &hooklefta + case 3152: state = 3153; break; // &hookright -> &hookrighta + case 3167: state = 3168; break; // &horb -> &horba + case 3176: state = 3177; break; // &Horizont -> &Horizonta + case 3192: state = 3193; break; // &hsl -> &hsla + case 3221: state = 3222; break; // &HumpEqu -> &HumpEqua + case 3236: state = 3237; break; // &I -> &Ia + case 3243: state = 3244; break; // &i -> &ia + case 3290: state = 3291; break; // &Igr -> &Igra + case 3296: state = 3297; break; // &igr -> &igra + case 3317: state = 3318; break; // &iiot -> &iiota + case 3330: state = 3332; break; // &Im -> &Ima + case 3336: state = 3337; break; // &im -> &ima + case 3346: state = 3347; break; // &Imagin -> &Imagina + case 3357: state = 3358; break; // &imagp -> &imagpa + case 3380: state = 3381; break; // &inc -> &inca + case 3403: state = 3404; break; // &intc -> &intca + case 3415: state = 3416; break; // &Integr -> &Integra + case 3420: state = 3421; break; // &interc -> &interca + case 3433: state = 3434; break; // &intl -> &intla + case 3454: state = 3455; break; // &InvisibleComm -> &InvisibleComma + case 3486: state = 3487; break; // &Iot -> &Iota + case 3489: state = 3490; break; // &iot -> &iota + case 3577: state = 3578; break; // &jm -> &jma + case 3618: state = 3619; break; // &K -> &Ka + case 3621: state = 3622; break; // &Kapp -> &Kappa + case 3624: state = 3625; break; // &k -> &ka + case 3627: state = 3628; break; // &kapp -> &kappa + case 3692: state = 3705; break; // &l -> &la + case 3693: state = 3694; break; // &lA -> &lAa + case 3698: state = 3699; break; // &L -> &La + case 3719: state = 3720; break; // &lagr -> &lagra + case 3725: state = 3726; break; // &Lambd -> &Lambda + case 3730: state = 3731; break; // &lambd -> &lambda + case 3747: state = 3748; break; // &Lapl -> &Lapla + case 3792: state = 3799; break; // &lat -> &lata + case 3794: state = 3795; break; // &lAt -> &lAta + case 3807: state = 3808; break; // &lB -> &lBa + case 3812: state = 3813; break; // &lb -> &lba + case 3821: state = 3822; break; // &lbr -> &lbra + case 3837: state = 3838; break; // &Lc -> &Lca + case 3843: state = 3844; break; // &lc -> &lca + case 3870: state = 3871; break; // &ldc -> &ldca + case 3881: state = 3882; break; // &ldrdh -> &ldrdha + case 3887: state = 3888; break; // &ldrush -> &ldrusha + case 3900: state = 3919; break; // &Left -> &Lefta + case 3907: state = 3908; break; // &LeftAngleBr -> &LeftAngleBra + case 3926: state = 3927; break; // &left -> &lefta + case 3933: state = 3934; break; // &LeftArrowB -> &LeftArrowBa + case 3948: state = 3949; break; // &leftarrowt -> &leftarrowta + case 3968: state = 3969; break; // &LeftDoubleBr -> &LeftDoubleBra + case 3994: state = 3995; break; // &LeftDownVectorB -> &LeftDownVectorBa + case 4004: state = 4005; break; // &lefth -> &leftha + case 4022: state = 4023; break; // &leftleft -> &leftlefta + case 4045: state = 4046; break; // &Leftright -> &Leftrighta + case 4056: state = 4057; break; // &leftright -> &leftrighta + case 4065: state = 4066; break; // &leftrighth -> &leftrightha + case 4078: state = 4079; break; // &leftrightsquig -> &leftrightsquiga + case 4121: state = 4122; break; // &LeftTri -> &LeftTria + case 4128: state = 4129; break; // &LeftTriangleB -> &LeftTriangleBa + case 4134: state = 4135; break; // &LeftTriangleEqu -> &LeftTriangleEqua + case 4168: state = 4169; break; // &LeftUpVectorB -> &LeftUpVectorBa + case 4179: state = 4180; break; // &LeftVectorB -> &LeftVectorBa + case 4192: state = 4193; break; // &leqsl -> &leqsla + case 4215: state = 4216; break; // &less -> &lessa + case 4242: state = 4243; break; // &LessEqu -> &LessEqua + case 4247: state = 4248; break; // &LessEqualGre -> &LessEqualGrea + case 4259: state = 4260; break; // &LessFullEqu -> &LessFullEqua + case 4265: state = 4266; break; // &LessGre -> &LessGrea + case 4285: state = 4286; break; // &LessSl -> &LessSla + case 4291: state = 4292; break; // &LessSlantEqu -> &LessSlantEqua + case 4321: state = 4322; break; // &lH -> &lHa + case 4325: state = 4326; break; // &lh -> &lha + case 4348: state = 4350; break; // &ll -> &lla + case 4363: state = 4364; break; // &Lleft -> &Llefta + case 4370: state = 4371; break; // &llh -> &llha + case 4394: state = 4396; break; // &lmoust -> &lmousta + case 4401: state = 4402; break; // &ln -> &lna + case 4422: state = 4423; break; // &lo -> &loa + case 4450: state = 4451; break; // &Longleft -> &Longlefta + case 4462: state = 4463; break; // &longleft -> &longlefta + case 4484: state = 4485; break; // &Longleftright -> &Longleftrighta + case 4495: state = 4496; break; // &longleftright -> &longleftrighta + case 4502: state = 4503; break; // &longm -> &longma + case 4524: state = 4525; break; // &Longright -> &Longrighta + case 4535: state = 4536; break; // &longright -> &longrighta + case 4543: state = 4544; break; // &loop -> &loopa + case 4560: state = 4561; break; // &lop -> &lopa + case 4579: state = 4580; break; // &low -> &lowa + case 4584: state = 4585; break; // &lowb -> &lowba + case 4621: state = 4622; break; // &lp -> &lpa + case 4628: state = 4629; break; // &lr -> &lra + case 4640: state = 4641; break; // &lrh -> &lrha + case 4652: state = 4653; break; // &ls -> &lsa + case 4720: state = 4721; break; // <l -> <la + case 4738: state = 4739; break; // <rP -> <rPa + case 4746: state = 4747; break; // &lurdsh -> &lurdsha + case 4751: state = 4752; break; // &luruh -> &luruha + case 4767: state = 4768; break; // &m -> &ma + case 4781: state = 4782; break; // &M -> &Ma + case 4812: state = 4813; break; // &mcomm -> &mcomma + case 4820: state = 4821; break; // &md -> &mda + case 4830: state = 4831; break; // &me -> &mea + case 4836: state = 4837; break; // &measured -> &measureda + case 4849: state = 4850; break; // &MediumSp -> &MediumSpa + case 4876: state = 4878; break; // &mid -> &mida + case 4957: state = 4958; break; // &multim -> &multima + case 4961: state = 4962; break; // &mum -> &muma + case 4965: state = 4966; break; // &n -> &na + case 4968: state = 4969; break; // &nabl -> &nabla + case 4971: state = 4972; break; // &N -> &Na + case 5003: state = 5005; break; // &natur -> &natura + case 5020: state = 5021; break; // &nc -> &nca + case 5024: state = 5025; break; // &Nc -> &Nca + case 5059: state = 5060; break; // &nd -> &nda + case 5064: state = 5066; break; // &ne -> &nea + case 5085: state = 5086; break; // &Neg -> &Nega + case 5098: state = 5099; break; // &NegativeMediumSp -> &NegativeMediumSpa + case 5109: state = 5110; break; // &NegativeThickSp -> &NegativeThickSpa + case 5116: state = 5117; break; // &NegativeThinSp -> &NegativeThinSpa + case 5130: state = 5131; break; // &NegativeVeryThinSp -> &NegativeVeryThinSpa + case 5141: state = 5142; break; // &nese -> &nesea + case 5154: state = 5155; break; // &NestedGre -> &NestedGrea + case 5161: state = 5162; break; // &NestedGreaterGre -> &NestedGreaterGrea + case 5205: state = 5206; break; // &ngeqsl -> &ngeqsla + case 5227: state = 5232; break; // &nh -> &nha + case 5236: state = 5237; break; // &nhp -> &nhpa + case 5256: state = 5261; break; // &nl -> &nla + case 5275: state = 5276; break; // &nLeft -> &nLefta + case 5283: state = 5284; break; // &nleft -> &nlefta + case 5294: state = 5295; break; // &nLeftright -> &nLeftrighta + case 5305: state = 5306; break; // &nleftright -> &nleftrighta + case 5317: state = 5318; break; // &nleqsl -> &nleqsla + case 5350: state = 5351; break; // &NoBre -> &NoBrea + case 5357: state = 5358; break; // &NonBre -> &NonBrea + case 5364: state = 5365; break; // &NonBreakingSp -> &NonBreakingSpa + case 5392: state = 5393; break; // &NotCupC -> &NotCupCa + case 5407: state = 5408; break; // &NotDoubleVertic -> &NotDoubleVertica + case 5410: state = 5411; break; // &NotDoubleVerticalB -> &NotDoubleVerticalBa + case 5423: state = 5424; break; // &NotEqu -> &NotEqua + case 5441: state = 5442; break; // &NotGre -> &NotGrea + case 5449: state = 5450; break; // &NotGreaterEqu -> &NotGreaterEqua + case 5459: state = 5460; break; // &NotGreaterFullEqu -> &NotGreaterFullEqua + case 5465: state = 5466; break; // &NotGreaterGre -> &NotGreaterGrea + case 5477: state = 5478; break; // &NotGreaterSl -> &NotGreaterSla + case 5483: state = 5484; break; // &NotGreaterSlantEqu -> &NotGreaterSlantEqua + case 5508: state = 5509; break; // &NotHumpEqu -> &NotHumpEqua + case 5521: state = 5522; break; // ¬inv -> ¬inva + case 5534: state = 5535; break; // &NotLeftTri -> &NotLeftTria + case 5541: state = 5542; break; // &NotLeftTriangleB -> &NotLeftTriangleBa + case 5547: state = 5548; break; // &NotLeftTriangleEqu -> &NotLeftTriangleEqua + case 5556: state = 5557; break; // &NotLessEqu -> &NotLessEqua + case 5562: state = 5563; break; // &NotLessGre -> &NotLessGrea + case 5574: state = 5575; break; // &NotLessSl -> &NotLessSla + case 5580: state = 5581; break; // &NotLessSlantEqu -> &NotLessSlantEqua + case 5598: state = 5599; break; // &NotNestedGre -> &NotNestedGrea + case 5605: state = 5606; break; // &NotNestedGreaterGre -> &NotNestedGreaterGrea + case 5623: state = 5624; break; // ¬niv -> ¬niva + case 5641: state = 5642; break; // &NotPrecedesEqu -> &NotPrecedesEqua + case 5646: state = 5647; break; // &NotPrecedesSl -> &NotPrecedesSla + case 5652: state = 5653; break; // &NotPrecedesSlantEqu -> &NotPrecedesSlantEqua + case 5677: state = 5678; break; // &NotRightTri -> &NotRightTria + case 5684: state = 5685; break; // &NotRightTriangleB -> &NotRightTriangleBa + case 5690: state = 5691; break; // &NotRightTriangleEqu -> &NotRightTriangleEqua + case 5696: state = 5697; break; // &NotSqu -> &NotSqua + case 5709: state = 5710; break; // &NotSquareSubsetEqu -> &NotSquareSubsetEqua + case 5722: state = 5723; break; // &NotSquareSupersetEqu -> &NotSquareSupersetEqua + case 5734: state = 5735; break; // &NotSubsetEqu -> &NotSubsetEqua + case 5747: state = 5748; break; // &NotSucceedsEqu -> &NotSucceedsEqua + case 5752: state = 5753; break; // &NotSucceedsSl -> &NotSucceedsSla + case 5758: state = 5759; break; // &NotSucceedsSlantEqu -> &NotSucceedsSlantEqua + case 5777: state = 5778; break; // &NotSupersetEqu -> &NotSupersetEqua + case 5789: state = 5790; break; // &NotTildeEqu -> &NotTildeEqua + case 5799: state = 5800; break; // &NotTildeFullEqu -> &NotTildeFullEqua + case 5814: state = 5815; break; // &NotVertic -> &NotVertica + case 5817: state = 5818; break; // &NotVerticalB -> &NotVerticalBa + case 5821: state = 5822; break; // &np -> &npa + case 5823: state = 5825; break; // &npar -> &npara + case 5855: state = 5860; break; // &nr -> &nra + case 5872: state = 5873; break; // &nRight -> &nRighta + case 5882: state = 5883; break; // &nright -> &nrighta + case 5918: state = 5919; break; // &nshortp -> &nshortpa + case 5920: state = 5921; break; // &nshortpar -> &nshortpara + case 5938: state = 5939; break; // &nsp -> &nspa + case 6007: state = 6008; break; // &ntri -> &ntria + case 6043: state = 6044; break; // &nv -> &nva + case 6048: state = 6049; break; // &nVD -> &nVDa + case 6053: state = 6054; break; // &nVd -> &nVda + case 6058: state = 6059; break; // &nvD -> &nvDa + case 6063: state = 6064; break; // &nvd -> &nvda + case 6073: state = 6074; break; // &nvH -> &nvHa + case 6111: state = 6112; break; // &nw -> &nwa + case 6127: state = 6128; break; // &nwne -> &nwnea + case 6131: state = 6132; break; // &O -> &Oa + case 6138: state = 6139; break; // &o -> &oa + case 6163: state = 6164; break; // &od -> &oda + case 6170: state = 6171; break; // &Odbl -> &Odbla + case 6175: state = 6176; break; // &odbl -> &odbla + case 6215: state = 6216; break; // &Ogr -> &Ogra + case 6220: state = 6221; break; // &ogr -> &ogra + case 6228: state = 6229; break; // &ohb -> &ohba + case 6238: state = 6239; break; // &ol -> &ola + case 6258: state = 6259; break; // &Om -> &Oma + case 6263: state = 6264; break; // &om -> &oma + case 6269: state = 6270; break; // &Omeg -> &Omega + case 6273: state = 6274; break; // &omeg -> &omega + case 6302: state = 6303; break; // &op -> &opa + case 6342: state = 6344; break; // &or -> &ora + case 6386: state = 6387; break; // &Osl -> &Osla + case 6391: state = 6392; break; // &osl -> &osla + case 6417: state = 6419; break; // &otimes -> &otimesa + case 6431: state = 6432; break; // &ovb -> &ovba + case 6438: state = 6439; break; // &OverB -> &OverBa + case 6442: state = 6443; break; // &OverBr -> &OverBra + case 6451: state = 6452; break; // &OverP -> &OverPa + case 6463: state = 6464; break; // &p -> &pa + case 6465: state = 6467; break; // &par -> ¶ + case 6482: state = 6483; break; // &P -> &Pa + case 6486: state = 6487; break; // &Parti -> &Partia + case 6533: state = 6534; break; // &phmm -> &phmma + case 6555: state = 6556; break; // &pl -> &pla + case 6567: state = 6569; break; // &plus -> &plusa + case 6612: state = 6613; break; // &Poinc -> &Poinca + case 6617: state = 6618; break; // &Poincarepl -> &Poincarepla + case 6642: state = 6644; break; // &pr -> &pra + case 6655: state = 6657; break; // &prec -> &preca + case 6681: state = 6682; break; // &PrecedesEqu -> &PrecedesEqua + case 6686: state = 6687; break; // &PrecedesSl -> &PrecedesSla + case 6692: state = 6693; break; // &PrecedesSlantEqu -> &PrecedesSlantEqua + case 6705: state = 6706; break; // &precn -> &precna + case 6735: state = 6736; break; // &prn -> &prna + case 6754: state = 6755; break; // &prof -> &profa + case 6756: state = 6757; break; // &profal -> &profala + case 6778: state = 6780; break; // &Proportion -> &Proportiona + case 6847: state = 6848; break; // &qu -> &qua + case 6876: state = 6882; break; // &r -> &ra + case 6877: state = 6878; break; // &rA -> &rAa + case 6886: state = 6887; break; // &R -> &Ra + case 6932: state = 6934; break; // &rarr -> &rarra + case 6968: state = 6969; break; // &rAt -> &rAta + case 6973: state = 6974; break; // &rat -> &rata + case 6981: state = 6982; break; // &ration -> &rationa + case 6986: state = 6987; break; // &RB -> &RBa + case 6991: state = 6992; break; // &rB -> &rBa + case 6996: state = 6997; break; // &rb -> &rba + case 7005: state = 7006; break; // &rbr -> &rbra + case 7021: state = 7022; break; // &Rc -> &Rca + case 7027: state = 7028; break; // &rc -> &rca + case 7054: state = 7055; break; // &rdc -> &rdca + case 7059: state = 7060; break; // &rdldh -> &rdldha + case 7074: state = 7075; break; // &re -> &rea + case 7082: state = 7083; break; // &realp -> &realpa + case 7151: state = 7152; break; // &rH -> &rHa + case 7155: state = 7156; break; // &rh -> &rha + case 7174: state = 7193; break; // &Right -> &Righta + case 7181: state = 7182; break; // &RightAngleBr -> &RightAngleBra + case 7202: state = 7203; break; // &right -> &righta + case 7209: state = 7210; break; // &RightArrowB -> &RightArrowBa + case 7223: state = 7224; break; // &rightarrowt -> &rightarrowta + case 7243: state = 7244; break; // &RightDoubleBr -> &RightDoubleBra + case 7269: state = 7270; break; // &RightDownVectorB -> &RightDownVectorBa + case 7279: state = 7280; break; // &righth -> &rightha + case 7297: state = 7298; break; // &rightleft -> &rightlefta + case 7305: state = 7306; break; // &rightlefth -> &rightleftha + case 7318: state = 7319; break; // &rightright -> &rightrighta + case 7330: state = 7331; break; // &rightsquig -> &rightsquiga + case 7366: state = 7367; break; // &RightTri -> &RightTria + case 7373: state = 7374; break; // &RightTriangleB -> &RightTriangleBa + case 7379: state = 7380; break; // &RightTriangleEqu -> &RightTriangleEqua + case 7413: state = 7414; break; // &RightUpVectorB -> &RightUpVectorBa + case 7424: state = 7425; break; // &RightVectorB -> &RightVectorBa + case 7442: state = 7443; break; // &rl -> &rla + case 7447: state = 7448; break; // &rlh -> &rlha + case 7457: state = 7459; break; // &rmoust -> &rmousta + case 7469: state = 7470; break; // &ro -> &roa + case 7481: state = 7482; break; // &rop -> &ropa + case 7512: state = 7513; break; // &rp -> &rpa + case 7526: state = 7527; break; // &rr -> &rra + case 7535: state = 7536; break; // &Rright -> &Rrighta + case 7542: state = 7543; break; // &rs -> &rsa + case 7595: state = 7596; break; // &RuleDel -> &RuleDela + case 7604: state = 7605; break; // &ruluh -> &ruluha + case 7610: state = 7611; break; // &S -> &Sa + case 7617: state = 7618; break; // &s -> &sa + case 7629: state = 7636; break; // &Sc -> &Sca + case 7631: state = 7633; break; // &sc -> &sca + case 7670: state = 7671; break; // &scn -> &scna + case 7703: state = 7704; break; // &se -> &sea + case 7725: state = 7726; break; // &sesw -> &seswa + case 7751: state = 7752; break; // &sh -> &sha + case 7803: state = 7804; break; // &shortp -> &shortpa + case 7805: state = 7806; break; // &shortpar -> &shortpara + case 7835: state = 7836; break; // &Sigm -> &Sigma + case 7840: state = 7841; break; // &sigm -> &sigma + case 7873: state = 7874; break; // &simr -> &simra + case 7878: state = 7879; break; // &sl -> &sla + case 7883: state = 7884; break; // &Sm -> &Sma + case 7894: state = 7895; break; // &sm -> &sma + case 7912: state = 7913; break; // &smep -> &smepa + case 7944: state = 7946; break; // &solb -> &solba + case 7956: state = 7957; break; // &sp -> &spa + case 7969: state = 7970; break; // &sqc -> &sqca + case 8008: state = 8015; break; // &squ -> &squa + case 8010: state = 8011; break; // &Squ -> &Squa + case 8041: state = 8042; break; // &SquareSubsetEqu -> &SquareSubsetEqua + case 8054: state = 8055; break; // &SquareSupersetEqu -> &SquareSupersetEqua + case 8068: state = 8069; break; // &sr -> &sra + case 8091: state = 8092; break; // &sst -> &ssta + case 8096: state = 8097; break; // &St -> &Sta + case 8100: state = 8101; break; // &st -> &sta + case 8106: state = 8107; break; // &str -> &stra + case 8160: state = 8161; break; // &subr -> &subra + case 8180: state = 8181; break; // &SubsetEqu -> &SubsetEqua + case 8199: state = 8201; break; // &succ -> &succa + case 8225: state = 8226; break; // &SucceedsEqu -> &SucceedsEqua + case 8230: state = 8231; break; // &SucceedsSl -> &SucceedsSla + case 8236: state = 8237; break; // &SucceedsSlantEqu -> &SucceedsSlantEqua + case 8249: state = 8250; break; // &succn -> &succna + case 8271: state = 8272; break; // &SuchTh -> &SuchTha + case 8316: state = 8317; break; // &SupersetEqu -> &SupersetEqua + case 8328: state = 8329; break; // &supl -> &supla + case 8375: state = 8376; break; // &sw -> &swa + case 8391: state = 8392; break; // &swnw -> &swnwa + case 8400: state = 8401; break; // &T -> &Ta + case 8404: state = 8405; break; // &t -> &ta + case 8419: state = 8420; break; // &Tc -> &Tca + case 8425: state = 8426; break; // &tc -> &tca + case 8481: state = 8482; break; // &Thet -> &Theta + case 8484: state = 8485; break; // &thet -> &theta + case 8495: state = 8496; break; // &thick -> &thicka + case 8511: state = 8512; break; // &ThickSp -> &ThickSpa + case 8522: state = 8523; break; // &ThinSp -> &ThinSpa + case 8527: state = 8528; break; // &thk -> &thka + case 8556: state = 8557; break; // &TildeEqu -> &TildeEqua + case 8566: state = 8567; break; // &TildeFullEqu -> &TildeFullEqua + case 8580: state = 8582; break; // ×b -> ×ba + case 8591: state = 8592; break; // &toe -> &toea + case 8614: state = 8615; break; // &tos -> &tosa + case 8628: state = 8629; break; // &tr -> &tra + case 8633: state = 8634; break; // &tri -> &tria + case 8744: state = 8745; break; // &twohe -> &twohea + case 8750: state = 8751; break; // &twoheadleft -> &twoheadlefta + case 8761: state = 8762; break; // &twoheadright -> &twoheadrighta + case 8768: state = 8769; break; // &U -> &Ua + case 8775: state = 8776; break; // &u -> &ua + case 8829: state = 8830; break; // &ud -> &uda + case 8836: state = 8837; break; // &Udbl -> &Udbla + case 8841: state = 8842; break; // &udbl -> &udbla + case 8845: state = 8846; break; // &udh -> &udha + case 8861: state = 8862; break; // &Ugr -> &Ugra + case 8867: state = 8868; break; // &ugr -> &ugra + case 8872: state = 8873; break; // &uH -> &uHa + case 8876: state = 8877; break; // &uh -> &uha + case 8904: state = 8905; break; // &Um -> &Uma + case 8909: state = 8910; break; // &um -> &uma + case 8920: state = 8921; break; // &UnderB -> &UnderBa + case 8924: state = 8925; break; // &UnderBr -> &UnderBra + case 8933: state = 8934; break; // &UnderP -> &UnderPa + case 8970: state = 8977; break; // &Up -> &Upa + case 8983: state = 8984; break; // &up -> &upa + case 8990: state = 8991; break; // &UpArrowB -> &UpArrowBa + case 9017: state = 9018; break; // &Updown -> &Updowna + case 9027: state = 9028; break; // &updown -> &updowna + case 9046: state = 9047; break; // &uph -> &upha + case 9119: state = 9120; break; // &upup -> &upupa + case 9182: state = 9183; break; // &uu -> &uua + case 9194: state = 9195; break; // &uw -> &uwa + case 9201: state = 9202; break; // &v -> &va + case 9217: state = 9218; break; // &vark -> &varka + case 9220: state = 9221; break; // &varkapp -> &varkappa + case 9255: state = 9256; break; // &varsigm -> &varsigma + case 9282: state = 9283; break; // &varthet -> &vartheta + case 9286: state = 9287; break; // &vartri -> &vartria + case 9304: state = 9305; break; // &Vb -> &Vba + case 9308: state = 9309; break; // &vB -> &vBa + case 9320: state = 9321; break; // &VD -> &VDa + case 9325: state = 9326; break; // &Vd -> &Vda + case 9330: state = 9331; break; // &vD -> &vDa + case 9335: state = 9336; break; // &vd -> &vda + case 9348: state = 9349; break; // &veeb -> &veeba + case 9361: state = 9362; break; // &Verb -> &Verba + case 9366: state = 9367; break; // &verb -> &verba + case 9375: state = 9376; break; // &Vertic -> &Vertica + case 9378: state = 9379; break; // &VerticalB -> &VerticalBa + case 9389: state = 9390; break; // &VerticalSep -> &VerticalSepa + case 9391: state = 9392; break; // &VerticalSepar -> &VerticalSepara + case 9409: state = 9410; break; // &VeryThinSp -> &VeryThinSpa + case 9472: state = 9473; break; // &Vvd -> &Vvda + case 9480: state = 9481; break; // &vzigz -> &vzigza + case 9498: state = 9499; break; // &wedb -> &wedba + case 9535: state = 9536; break; // &wre -> &wrea + case 9549: state = 9550; break; // &xc -> &xca + case 9572: state = 9577; break; // &xh -> &xha + case 9585: state = 9590; break; // &xl -> &xla + case 9594: state = 9595; break; // &xm -> &xma + case 9623: state = 9628; break; // &xr -> &xra + case 9665: state = 9666; break; // &Y -> &Ya + case 9672: state = 9673; break; // &y -> &ya + case 9747: state = 9748; break; // &Z -> &Za + case 9754: state = 9755; break; // &z -> &za + case 9761: state = 9762; break; // &Zc -> &Zca + case 9767: state = 9768; break; // &zc -> &zca + case 9800: state = 9801; break; // &ZeroWidthSp -> &ZeroWidthSpa + case 9805: state = 9806; break; // &Zet -> &Zeta + case 9808: state = 9809; break; // &zet -> &zeta + case 9827: state = 9828; break; // &zigr -> &zigra default: return false; } break; case 'b': switch (state) { - case 0: state = 222; break; // & -> &b - case 1: state = 13; break; // &A -> &Ab - case 7: state = 18; break; // &a -> &ab - case 109: state = 111; break; // &angmsda -> &angmsdab - case 120: state = 121; break; // &angrtv -> &angrtvb - case 222: state = 270; break; // &b -> &bb - case 273: state = 274; break; // &bbrkt -> &bbrktb - case 470: state = 471; break; // &box -> &boxb - case 545: state = 546; break; // &brv -> &brvb - case 562: state = 563; break; // &bsol -> &bsolb - case 566: state = 567; break; // &bsolhsu -> &bsolhsub - case 596: state = 600; break; // &cap -> &capb - case 835: state = 836; break; // &CloseCurlyDou -> &CloseCurlyDoub - case 850: state = 851; break; // &clu -> &club - case 978: state = 979; break; // &csu -> &csub - case 1006: state = 1007; break; // &cup -> &cupb - case 1097: state = 1120; break; // &d -> &db - case 1209: state = 1210; break; // &DiacriticalDou -> &DiacriticalDoub - case 1331: state = 1332; break; // &dou -> &doub - case 1334: state = 1335; break; // &double -> &doubleb - case 1343: state = 1344; break; // &Dou -> &Doub - case 1590: state = 1591; break; // &dr -> &drb - case 1874: state = 1875; break; // &Equili -> &Equilib - case 2118: state = 2140; break; // &g -> &gb - case 2124: state = 2135; break; // &G -> &Gb - case 2356: state = 2386; break; // &h -> &hb - case 2418: state = 2419; break; // &Hil -> &Hilb - case 2474: state = 2475; break; // &hor -> &horb - case 2524: state = 2525; break; // &hy -> &hyb - case 2696: state = 2697; break; // &Invisi -> &Invisib - case 2881: state = 2970; break; // &l -> &lb - case 2907: state = 2908; break; // &Lam -> &Lamb - case 2911: state = 2912; break; // &lam -> &lamb - case 2939: state = 2940; break; // &larr -> &larrb - case 2970: state = 2974; break; // &lb -> &lbb - case 3008: state = 3009; break; // &lcu -> &lcub - case 3090: state = 3091; break; // &LeftDou -> &LeftDoub - case 3393: state = 3399; break; // &lh -> &lhb - case 3466: state = 3472; break; // &lo -> &lob - case 3603: state = 3607; break; // &low -> &lowb - case 3677: state = 3678; break; // &lsq -> &lsqb - case 3843: state = 3844; break; // &minus -> &minusb - case 3897: state = 3930; break; // &n -> &nb - case 3898: state = 3899; break; // &na -> &nab - case 4233: state = 4234; break; // &NotDou -> &NotDoub - case 4339: state = 4341; break; // ¬inv -> ¬invb - case 4426: state = 4428; break; // ¬niv -> ¬nivb - case 4494: state = 4495; break; // &NotSquareSu -> &NotSquareSub - case 4515: state = 4516; break; // &NotSu -> &NotSub - case 4690: state = 4691; break; // &nsqsu -> &nsqsub - case 4695: state = 4696; break; // &nsu -> &nsub - case 4851: state = 4860; break; // &od -> &odb - case 4855: state = 4856; break; // &Od -> &Odb - case 4900: state = 4901; break; // &oh -> &ohb - case 4970: state = 4971; break; // &OpenCurlyDou -> &OpenCurlyDoub - case 5055: state = 5056; break; // &ov -> &ovb - case 5159: state = 5164; break; // &plus -> &plusb - case 5397: state = 5484; break; // &r -> &rb - case 5439: state = 5442; break; // &rarr -> &rarrb - case 5484: state = 5488; break; // &rb -> &rbb - case 5522: state = 5523; break; // &rcu -> &rcub - case 5573: state = 5574; break; // &ReverseEquili -> &ReverseEquilib - case 5586: state = 5587; break; // &ReverseUpEquili -> &ReverseUpEquilib - case 5676: state = 5677; break; // &RightDou -> &RightDoub - case 5875: state = 5881; break; // &ro -> &rob - case 5946: state = 5947; break; // &rsq -> &rsqb - case 5991: state = 5997; break; // &s -> &sb - case 6050: state = 6051; break; // &sdot -> &sdotb - case 6240: state = 6241; break; // &sol -> &solb - case 6270: state = 6271; break; // &sqsu -> &sqsub - case 6306: state = 6307; break; // &SquareSu -> &SquareSub - case 6381: state = 6382; break; // &Su -> &Sub - case 6383: state = 6384; break; // &su -> &sub - case 6428: state = 6429; break; // &subsu -> &subsub - case 6508: state = 6509; break; // &supdsu -> &supdsub - case 6529: state = 6530; break; // &suphsu -> &suphsub - case 6561: state = 6562; break; // &supsu -> &supsub - case 6584: state = 6585; break; // &Ta -> &Tab - case 6586: state = 6594; break; // &t -> &tb - case 6725: state = 6726; break; // × -> ×b - case 6735: state = 6736; break; // &top -> &topb - case 6809: state = 6810; break; // &tris -> &trisb - case 6873: state = 6896; break; // &U -> &Ub - case 6879: state = 6900; break; // &u -> &ub - case 6920: state = 6929; break; // &ud -> &udb - case 6924: state = 6925; break; // &Ud -> &Udb - case 6957: state = 6962; break; // &uh -> &uhb - case 7092: state = 7093; break; // &UpEquili -> &UpEquilib - case 7269: state = 7270; break; // &varsu -> &varsub - case 7307: state = 7308; break; // &V -> &Vb - case 7339: state = 7340; break; // &vee -> &veeb - case 7349: state = 7350; break; // &Ver -> &Verb - case 7353: state = 7354; break; // &ver -> &verb - case 7404: state = 7405; break; // &vnsu -> &vnsub - case 7427: state = 7428; break; // &vsu -> &vsub - case 7458: state = 7459; break; // &wed -> &wedb + case 0: state = 301; break; // & -> &b + case 1: state = 15; break; // &A -> &Ab + case 8: state = 21; break; // &a -> &ab + case 147: state = 150; break; // &angmsda -> &angmsdab + case 167: state = 168; break; // &angrtv -> &angrtvb + case 301: state = 360; break; // &b -> &bb + case 364: state = 365; break; // &bbrkt -> &bbrktb + case 613: state = 614; break; // &box -> &boxb + case 735: state = 736; break; // &brv -> &brvb + case 758: state = 760; break; // &bsol -> &bsolb + case 764: state = 765; break; // &bsolhsu -> &bsolhsub + case 805: state = 811; break; // &cap -> &capb + case 1101: state = 1102; break; // &CloseCurlyDou -> &CloseCurlyDoub + case 1118: state = 1119; break; // &clu -> &club + case 1278: state = 1279; break; // &csu -> &csub + case 1318: state = 1320; break; // &cup -> &cupb + case 1432: state = 1463; break; // &d -> &db + case 1577: state = 1578; break; // &DiacriticalDou -> &DiacriticalDoub + case 1731: state = 1732; break; // &dou -> &doub + case 1734: state = 1735; break; // &double -> &doubleb + case 1744: state = 1745; break; // &Dou -> &Doub + case 2023: state = 2024; break; // &dr -> &drb + case 2389: state = 2390; break; // &Equili -> &Equilib + case 2701: state = 2730; break; // &g -> &gb + case 2708: state = 2724; break; // &G -> &Gb + case 3020: state = 3060; break; // &h -> &hb + case 3101: state = 3102; break; // &Hil -> &Hilb + case 3166: state = 3167; break; // &hor -> &horb + case 3225: state = 3226; break; // &hy -> &hyb + case 3447: state = 3448; break; // &Invisi -> &Invisib + case 3692: state = 3812; break; // &l -> &lb + case 3723: state = 3724; break; // &Lam -> &Lamb + case 3728: state = 3729; break; // &lam -> &lamb + case 3766: state = 3768; break; // &larr -> &larrb + case 3812: state = 3817; break; // &lb -> &lbb + case 3862: state = 3863; break; // &lcu -> &lcub + case 3963: state = 3964; break; // &LeftDou -> &LeftDoub + case 4325: state = 4334; break; // &lh -> &lhb + case 4422: state = 4430; break; // &lo -> &lob + case 4579: state = 4584; break; // &low -> &lowb + case 4676: state = 4677; break; // &lsq -> &lsqb + case 4892: state = 4894; break; // &minus -> &minusb + case 4965: state = 5010; break; // &n -> &nb + case 4966: state = 4967; break; // &na -> &nab + case 5398: state = 5399; break; // &NotDou -> &NotDoub + case 5521: state = 5524; break; // ¬inv -> ¬invb + case 5623: state = 5626; break; // ¬niv -> ¬nivb + case 5701: state = 5702; break; // &NotSquareSu -> &NotSquareSub + case 5726: state = 5727; break; // &NotSu -> &NotSub + case 5944: state = 5945; break; // &nsqsu -> &nsqsub + case 5951: state = 5952; break; // &nsu -> &nsub + case 6163: state = 6174; break; // &od -> &odb + case 6168: state = 6169; break; // &Od -> &Odb + case 6227: state = 6228; break; // &oh -> &ohb + case 6316: state = 6317; break; // &OpenCurlyDou -> &OpenCurlyDoub + case 6430: state = 6431; break; // &ov -> &ovb + case 6567: state = 6574; break; // &plus -> &plusb + case 6876: state = 6996; break; // &r -> &rb + case 6932: state = 6937; break; // &rarr -> &rarrb + case 6996: state = 7001; break; // &rb -> &rbb + case 7046: state = 7047; break; // &rcu -> &rcub + case 7114: state = 7115; break; // &ReverseEquili -> &ReverseEquilib + case 7128: state = 7129; break; // &ReverseUpEquili -> &ReverseUpEquilib + case 7238: state = 7239; break; // &RightDou -> &RightDoub + case 7469: state = 7477; break; // &ro -> &rob + case 7559: state = 7560; break; // &rsq -> &rsqb + case 7617: state = 7624; break; // &s -> &sb + case 7697: state = 7699; break; // &sdot -> &sdotb + case 7942: state = 7944; break; // &sol -> &solb + case 7985: state = 7986; break; // &sqsu -> &sqsub + case 8033: state = 8034; break; // &SquareSu -> &SquareSub + case 8127: state = 8128; break; // &Su -> &Sub + case 8130: state = 8131; break; // &su -> &sub + case 8193: state = 8194; break; // &subsu -> &subsub + case 8297: state = 8298; break; // &supdsu -> &supdsub + case 8325: state = 8326; break; // &suphsu -> &suphsub + case 8370: state = 8371; break; // &supsu -> &supsub + case 8401: state = 8402; break; // &Ta -> &Tab + case 8404: state = 8415; break; // &t -> &tb + case 8578: state = 8580; break; // × -> ×b + case 8594: state = 8596; break; // &top -> &topb + case 8690: state = 8691; break; // &tris -> &trisb + case 8768: state = 8797; break; // &U -> &Ub + case 8775: state = 8802; break; // &u -> &ub + case 8829: state = 8840; break; // &ud -> &udb + case 8834: state = 8835; break; // &Ud -> &Udb + case 8876: state = 8883; break; // &uh -> &uhb + case 9039: state = 9040; break; // &UpEquili -> &UpEquilib + case 9258: state = 9259; break; // &varsu -> &varsub + case 9303: state = 9304; break; // &V -> &Vb + case 9346: state = 9348; break; // &vee -> &veeb + case 9360: state = 9361; break; // &Ver -> &Verb + case 9365: state = 9366; break; // &ver -> &verb + case 9427: state = 9428; break; // &vnsu -> &vnsub + case 9458: state = 9459; break; // &vsu -> &vsub + case 9497: state = 9498; break; // &wed -> &wedb default: return false; } break; case 'c': switch (state) { - case 0: state = 589; break; // & -> &c - case 1: state = 26; break; // &A -> &Ac + case 0: state = 796; break; // & -> &c + case 1: state = 33; break; // &A -> &Ac case 2: state = 3; break; // &Aa -> &Aac - case 7: state = 23; break; // &a -> &ac - case 8: state = 9; break; // &aa -> &aac - case 28: state = 29; break; // &Acir ->  - case 31: state = 32; break; // &acir -> â - case 76: state = 77; break; // &Ama -> &Amac - case 80: state = 81; break; // &ama -> &amac - case 109: state = 112; break; // &angmsda -> &angmsdac - case 144: state = 145; break; // &apa -> &apac - case 160: state = 161; break; // &ApplyFun -> &ApplyFunc - case 180: state = 181; break; // &As -> &Asc - case 183: state = 184; break; // &as -> &asc - case 212: state = 213; break; // &aw -> &awc - case 222: state = 277; break; // &b -> &bc - case 223: state = 224; break; // &ba -> &bac - case 225: state = 226; break; // &back -> &backc - case 247: state = 281; break; // &B -> &Bc - case 248: state = 249; break; // &Ba -> &Bac - case 288: state = 289; break; // &be -> &bec - case 293: state = 294; break; // &Be -> &Bec - case 334: state = 335; break; // &big -> &bigc - case 339: state = 340; break; // &bigcir -> &bigcirc - case 357: state = 358; break; // &bigsq -> &bigsqc - case 397: state = 398; break; // &bla -> &blac - case 442: state = 443; break; // &blo -> &bloc - case 549: state = 550; break; // &Bs -> &Bsc - case 552: state = 553; break; // &bs -> &bsc - case 583: state = 645; break; // &C -> &Cc - case 584: state = 585; break; // &Ca -> &Cac - case 589: state = 641; break; // &c -> &cc - case 590: state = 591; break; // &ca -> &cac - case 596: state = 605; break; // &cap -> &capc - case 601: state = 602; break; // &capbr -> &capbrc - case 662: state = 663; break; // &Ccir -> &Ccirc - case 665: state = 666; break; // &ccir -> &ccirc - case 716: state = 717; break; // &CH -> &CHc - case 719: state = 720; break; // &ch -> &chc - case 722: state = 723; break; // &che -> &chec - case 733: state = 734; break; // &cir -> &circ - case 753: state = 757; break; // &circled -> &circledc - case 759: state = 760; break; // &circledcir -> &circledcirc - case 766: state = 767; break; // &Cir -> &Circ - case 799: state = 800; break; // &cirs -> &cirsc - case 804: state = 805; break; // &Clo -> &Cloc - case 923: state = 924; break; // &Coprodu -> &Coproduc - case 939: state = 940; break; // &CounterClo -> &CounterCloc - case 972: state = 973; break; // &Cs -> &Csc - case 975: state = 976; break; // &cs -> &csc - case 997: state = 998; break; // &cues -> &cuesc - case 1006: state = 1015; break; // &cup -> &cupc - case 1008: state = 1009; break; // &cupbr -> &cupbrc - case 1037: state = 1038; break; // &curlyeqpre -> &curlyeqprec - case 1040: state = 1041; break; // &curlyeqsu -> &curlyeqsuc - case 1041: state = 1042; break; // &curlyeqsuc -> &curlyeqsucc - case 1076: state = 1077; break; // &cw -> &cwc - case 1087: state = 1088; break; // &cyl -> &cylc - case 1091: state = 1129; break; // &D -> &Dc - case 1097: state = 1134; break; // &d -> &dc - case 1127: state = 1128; break; // &dbla -> &dblac - case 1192: state = 1193; break; // &Dia -> &Diac - case 1197: state = 1198; break; // &Diacriti -> &Diacritic - case 1201: state = 1202; break; // &DiacriticalA -> &DiacriticalAc - case 1213: state = 1214; break; // &DiacriticalDoubleA -> &DiacriticalDoubleAc - case 1277: state = 1278; break; // &DJ -> &DJc - case 1280: state = 1281; break; // &dj -> &djc - case 1283: state = 1284; break; // &dl -> &dlc - case 1459: state = 1460; break; // &DoubleVerti -> &DoubleVertic - case 1536: state = 1537; break; // &DownLeftRightVe -> &DownLeftRightVec - case 1545: state = 1546; break; // &DownLeftTeeVe -> &DownLeftTeeVec - case 1551: state = 1552; break; // &DownLeftVe -> &DownLeftVec - case 1568: state = 1569; break; // &DownRightTeeVe -> &DownRightTeeVec - case 1574: state = 1575; break; // &DownRightVe -> &DownRightVec - case 1590: state = 1597; break; // &dr -> &drc - case 1604: state = 1605; break; // &Ds -> &Dsc - case 1607: state = 1608; break; // &ds -> &dsc - case 1610: state = 1611; break; // &DS -> &DSc - case 1644: state = 1645; break; // &DZ -> &DZc - case 1647: state = 1648; break; // &dz -> &dzc - case 1656: state = 1672; break; // &E -> &Ec - case 1657: state = 1658; break; // &Ea -> &Eac - case 1662: state = 1677; break; // &e -> &ec - case 1663: state = 1664; break; // &ea -> &eac - case 1683: state = 1687; break; // &ecir -> ê - case 1685: state = 1686; break; // &Ecir -> Ê - case 1747: state = 1748; break; // &Ema -> &Emac - case 1751: state = 1752; break; // &ema -> &emac - case 1833: state = 1834; break; // &eq -> &eqc - case 1836: state = 1837; break; // &eqcir -> &eqcirc - case 1897: state = 1898; break; // &Es -> &Esc - case 1900: state = 1901; break; // &es -> &esc - case 1925: state = 1926; break; // &ex -> &exc - case 1937: state = 1938; break; // &expe -> &expec - case 1964: state = 1980; break; // &f -> &fc - case 1977: state = 1978; break; // &F -> &Fc - case 2084: state = 2085; break; // &fra -> &frac - case 2112: state = 2113; break; // &Fs -> &Fsc - case 2115: state = 2116; break; // &fs -> &fsc - case 2118: state = 2153; break; // &g -> &gc - case 2119: state = 2120; break; // &ga -> &gac - case 2124: state = 2145; break; // &G -> &Gc - case 2151: state = 2152; break; // &Gcir -> &Gcirc - case 2155: state = 2156; break; // &gcir -> &gcirc - case 2176: state = 2177; break; // &ges -> &gesc - case 2177: state = 2178; break; // &gesc -> &gescc - case 2198: state = 2199; break; // &GJ -> &GJc - case 2201: state = 2202; break; // &gj -> &gjc - case 2282: state = 2283; break; // &Gs -> &Gsc - case 2285: state = 2286; break; // &gs -> &gsc - case 2294: state = 2295; break; // > -> >c - case 2295: state = 2296; break; // >c -> >cc - case 2351: state = 2389; break; // &H -> &Hc - case 2352: state = 2353; break; // &Ha -> &Hac - case 2356: state = 2393; break; // &h -> &hc - case 2370: state = 2371; break; // &HARD -> &HARDc - case 2374: state = 2375; break; // &hard -> &hardc - case 2380: state = 2381; break; // &harr -> &harrc - case 2391: state = 2392; break; // &Hcir -> &Hcirc - case 2395: state = 2396; break; // &hcir -> &hcirc - case 2409: state = 2410; break; // &her -> &herc - case 2425: state = 2426; break; // &HilbertSpa -> &HilbertSpac - case 2490: state = 2491; break; // &Hs -> &Hsc - case 2493: state = 2494; break; // &hs -> &hsc - case 2533: state = 2546; break; // &I -> &Ic - case 2534: state = 2535; break; // &Ia -> &Iac - case 2539: state = 2545; break; // &i -> &ic - case 2540: state = 2541; break; // &ia -> &iac - case 2548: state = 2549; break; // &Icir -> Î - case 2551: state = 2552; break; // &icir -> î - case 2558: state = 2559; break; // &IE -> &IEc - case 2561: state = 2562; break; // &ie -> &iec - case 2564: state = 2565; break; // &iex -> &iexc - case 2605: state = 2606; break; // &Ima -> &Imac - case 2609: state = 2610; break; // &ima -> &imac - case 2641: state = 2642; break; // &in -> &inc - case 2658: state = 2659; break; // &int -> &intc - case 2672: state = 2673; break; // &inter -> &interc - case 2678: state = 2679; break; // &Interse -> &Intersec - case 2710: state = 2711; break; // &IO -> &IOc - case 2713: state = 2714; break; // &io -> &ioc - case 2740: state = 2741; break; // &Is -> &Isc - case 2743: state = 2744; break; // &is -> &isc - case 2766: state = 2767; break; // &Iuk -> &Iukc - case 2770: state = 2771; break; // &iuk -> &iukc - case 2777: state = 2778; break; // &J -> &Jc - case 2780: state = 2781; break; // &Jcir -> &Jcirc - case 2782: state = 2783; break; // &j -> &jc - case 2785: state = 2786; break; // &jcir -> &jcirc - case 2803: state = 2804; break; // &Js -> &Jsc - case 2806: state = 2807; break; // &js -> &jsc - case 2810: state = 2811; break; // &Jser -> &Jserc - case 2814: state = 2815; break; // &jser -> &jserc - case 2818: state = 2819; break; // &Juk -> &Jukc - case 2822: state = 2823; break; // &juk -> &jukc - case 2825: state = 2836; break; // &K -> &Kc - case 2830: state = 2841; break; // &k -> &kc - case 2857: state = 2858; break; // &KH -> &KHc - case 2860: state = 2861; break; // &kh -> &khc - case 2863: state = 2864; break; // &KJ -> &KJc - case 2866: state = 2867; break; // &kj -> &kjc - case 2875: state = 2876; break; // &Ks -> &Ksc - case 2878: state = 2879; break; // &ks -> &ksc - case 2881: state = 2993; break; // &l -> &lc - case 2886: state = 2988; break; // &L -> &Lc - case 2887: state = 2888; break; // &La -> &Lac - case 2892: state = 2893; break; // &la -> &lac - case 2925: state = 2926; break; // &Lapla -> &Laplac - case 2978: state = 2979; break; // &lbra -> &lbrac - case 3012: state = 3013; break; // &ld -> &ldc - case 3043: state = 3044; break; // &LeftAngleBra -> &LeftAngleBrac - case 3096: state = 3097; break; // &LeftDoubleBra -> &LeftDoubleBrac - case 3107: state = 3108; break; // &LeftDownTeeVe -> &LeftDownTeeVec - case 3113: state = 3114; break; // &LeftDownVe -> &LeftDownVec - case 3199: state = 3200; break; // &LeftRightVe -> &LeftRightVec - case 3213: state = 3214; break; // &LeftTeeVe -> &LeftTeeVec - case 3250: state = 3251; break; // &LeftUpDownVe -> &LeftUpDownVec - case 3259: state = 3260; break; // &LeftUpTeeVe -> &LeftUpTeeVec - case 3265: state = 3266; break; // &LeftUpVe -> &LeftUpVec - case 3274: state = 3275; break; // &LeftVe -> &LeftVec - case 3291: state = 3292; break; // &les -> &lesc - case 3292: state = 3293; break; // &lesc -> &lescc - case 3402: state = 3403; break; // &LJ -> &LJc - case 3405: state = 3406; break; // &lj -> &ljc - case 3409: state = 3413; break; // &ll -> &llc - case 3448: state = 3449; break; // &lmousta -> &lmoustac - case 3643: state = 3647; break; // &lr -> &lrc - case 3661: state = 3669; break; // &ls -> &lsc - case 3666: state = 3667; break; // &Ls -> &Lsc - case 3692: state = 3693; break; // < -> <c - case 3693: state = 3694; break; // <c -> <cc - case 3745: state = 3776; break; // &m -> &mc - case 3746: state = 3747; break; // &ma -> &mac - case 3755: state = 3781; break; // &M -> &Mc - case 3811: state = 3812; break; // &MediumSpa -> &MediumSpac - case 3827: state = 3828; break; // &mi -> &mic - case 3831: state = 3835; break; // &mid -> &midc - case 3855: state = 3856; break; // &ml -> &mlc - case 3876: state = 3877; break; // &Ms -> &Msc - case 3879: state = 3880; break; // &ms -> &msc - case 3897: state = 3937; break; // &n -> &nc - case 3898: state = 3908; break; // &na -> &nac - case 3902: state = 3940; break; // &N -> &Nc - case 3903: state = 3904; break; // &Na -> &Nac - case 3999: state = 4000; break; // &NegativeMediumSpa -> &NegativeMediumSpac - case 4004: state = 4005; break; // &NegativeThi -> &NegativeThic - case 4009: state = 4010; break; // &NegativeThickSpa -> &NegativeThickSpac - case 4015: state = 4016; break; // &NegativeThinSpa -> &NegativeThinSpac - case 4028: state = 4029; break; // &NegativeVeryThinSpa -> &NegativeVeryThinSpac - case 4115: state = 4116; break; // &NJ -> &NJc - case 4118: state = 4119; break; // &nj -> &njc - case 4207: state = 4208; break; // &NonBreakingSpa -> &NonBreakingSpac - case 4241: state = 4242; break; // &NotDoubleVerti -> &NotDoubleVertic - case 4339: state = 4342; break; // ¬inv -> ¬invc - case 4426: state = 4429; break; // ¬niv -> ¬nivc - case 4432: state = 4433; break; // &NotPre -> &NotPrec - case 4515: state = 4525; break; // &NotSu -> &NotSuc - case 4525: state = 4526; break; // &NotSuc -> &NotSucc - case 4590: state = 4591; break; // &NotVerti -> &NotVertic - case 4613: state = 4614; break; // &npr -> &nprc - case 4617: state = 4618; break; // &npre -> &nprec - case 4627: state = 4628; break; // &nrarr -> &nrarrc - case 4653: state = 4654; break; // &ns -> &nsc - case 4654: state = 4655; break; // &nsc -> &nscc - case 4659: state = 4660; break; // &Ns -> &Nsc - case 4695: state = 4705; break; // &nsu -> &nsuc - case 4705: state = 4706; break; // &nsuc -> &nsucc - case 4827: state = 4844; break; // &O -> &Oc - case 4828: state = 4829; break; // &Oa -> &Oac - case 4833: state = 4841; break; // &o -> &oc - case 4834: state = 4835; break; // &oa -> &oac - case 4843: state = 4848; break; // &ocir -> ô - case 4846: state = 4847; break; // &Ocir -> Ô - case 4858: state = 4859; break; // &Odbla -> &Odblac - case 4862: state = 4863; break; // &odbla -> &odblac - case 4880: state = 4881; break; // &of -> &ofc - case 4908: state = 4912; break; // &ol -> &olc - case 4924: state = 4925; break; // &Oma -> &Omac - case 4928: state = 4929; break; // &oma -> &omac - case 4937: state = 4938; break; // &Omi -> &Omic - case 4942: state = 4943; break; // &omi -> &omic - case 5015: state = 5016; break; // &Os -> &Osc - case 5018: state = 5019; break; // &os -> &osc - case 5066: state = 5067; break; // &OverBra -> &OverBrac - case 5083: state = 5106; break; // &p -> &pc - case 5096: state = 5104; break; // &P -> &Pc - case 5109: state = 5110; break; // &per -> &perc - case 5142: state = 5143; break; // &pit -> &pitc - case 5152: state = 5153; break; // &plan -> &planc - case 5159: state = 5165; break; // &plus -> &plusc - case 5160: state = 5161; break; // &plusa -> &plusac - case 5191: state = 5192; break; // &Poin -> &Poinc - case 5216: state = 5219; break; // &pr -> &prc - case 5223: state = 5224; break; // &pre -> &prec - case 5224: state = 5231; break; // &prec -> &precc - case 5238: state = 5239; break; // &Pre -> &Prec - case 5300: state = 5301; break; // &Produ -> &Produc - case 5335: state = 5336; break; // &Ps -> &Psc - case 5338: state = 5339; break; // &ps -> &psc - case 5344: state = 5345; break; // &pun -> &punc - case 5368: state = 5369; break; // &Qs -> &Qsc - case 5371: state = 5372; break; // &qs -> &qsc - case 5397: state = 5507; break; // &r -> &rc - case 5402: state = 5403; break; // &ra -> &rac - case 5405: state = 5502; break; // &R -> &Rc - case 5406: state = 5407; break; // &Ra -> &Rac - case 5415: state = 5416; break; // &radi -> &radic - case 5439: state = 5445; break; // &rarr -> &rarrc - case 5492: state = 5493; break; // &rbra -> &rbrac - case 5526: state = 5527; break; // &rd -> &rdc - case 5541: state = 5552; break; // &re -> &rec - case 5628: state = 5629; break; // &RightAngleBra -> &RightAngleBrac - case 5682: state = 5683; break; // &RightDoubleBra -> &RightDoubleBrac - case 5693: state = 5694; break; // &RightDownTeeVe -> &RightDownTeeVec - case 5699: state = 5700; break; // &RightDownVe -> &RightDownVec - case 5773: state = 5774; break; // &RightTeeVe -> &RightTeeVec - case 5810: state = 5811; break; // &RightUpDownVe -> &RightUpDownVec - case 5819: state = 5820; break; // &RightUpTeeVe -> &RightUpTeeVec - case 5825: state = 5826; break; // &RightUpVe -> &RightUpVec - case 5834: state = 5835; break; // &RightVe -> &RightVec - case 5867: state = 5868; break; // &rmousta -> &rmoustac - case 5934: state = 5942; break; // &rs -> &rsc - case 5939: state = 5940; break; // &Rs -> &Rsc - case 5985: state = 6001; break; // &S -> &Sc - case 5986: state = 5987; break; // &Sa -> &Sac - case 5991: state = 6002; break; // &s -> &sc - case 5992: state = 5993; break; // &sa -> &sac - case 6002: state = 6012; break; // &sc -> &scc - case 6025: state = 6026; break; // &Scir -> &Scirc - case 6028: state = 6029; break; // &scir -> &scirc - case 6053: state = 6064; break; // &se -> &sec - case 6088: state = 6097; break; // &sh -> &shc - case 6092: state = 6101; break; // &SH -> &SHc - case 6094: state = 6095; break; // &SHCH -> &SHCHc - case 6098: state = 6099; break; // &shch -> &shchc - case 6198: state = 6199; break; // &SmallCir -> &SmallCirc - case 6232: state = 6233; break; // &SOFT -> &SOFTc - case 6237: state = 6238; break; // &soft -> &softc - case 6258: state = 6259; break; // &sq -> &sqc - case 6299: state = 6300; break; // &SquareInterse -> &SquareIntersec - case 6338: state = 6339; break; // &Ss -> &Ssc - case 6341: state = 6342; break; // &ss -> &ssc - case 6381: state = 6446; break; // &Su -> &Suc - case 6383: state = 6431; break; // &su -> &suc - case 6431: state = 6432; break; // &suc -> &succ - case 6432: state = 6439; break; // &succ -> &succc - case 6446: state = 6447; break; // &Suc -> &Succ - case 6583: state = 6597; break; // &T -> &Tc - case 6586: state = 6602; break; // &t -> &tc - case 6623: state = 6624; break; // &telre -> &telrec - case 6654: state = 6655; break; // &thi -> &thic - case 6666: state = 6667; break; // &Thi -> &Thic - case 6671: state = 6672; break; // &ThickSpa -> &ThickSpac - case 6680: state = 6681; break; // &ThinSpa -> &ThinSpac - case 6735: state = 6739; break; // &top -> &topc - case 6821: state = 6822; break; // &Ts -> &Tsc - case 6824: state = 6825; break; // &ts -> &tsc - case 6827: state = 6828; break; // &TS -> &TSc - case 6831: state = 6832; break; // &TSH -> &TSHc - case 6834: state = 6835; break; // &tsh -> &tshc - case 6873: state = 6910; break; // &U -> &Uc - case 6874: state = 6875; break; // &Ua -> &Uac - case 6879: state = 6914; break; // &u -> &uc - case 6880: state = 6881; break; // &ua -> &uac - case 6892: state = 6893; break; // &Uarro -> &Uarroc - case 6897: state = 6898; break; // &Ubr -> &Ubrc - case 6901: state = 6902; break; // &ubr -> &ubrc - case 6912: state = 6913; break; // &Ucir -> Û - case 6916: state = 6917; break; // &ucir -> û - case 6927: state = 6928; break; // &Udbla -> &Udblac - case 6931: state = 6932; break; // &udbla -> &udblac - case 6965: state = 6966; break; // &ul -> &ulc - case 6979: state = 6980; break; // &Uma -> &Umac - case 6983: state = 6984; break; // &uma -> &umac - case 6995: state = 6996; break; // &UnderBra -> &UnderBrac - case 7166: state = 7167; break; // &ur -> &urc - case 7186: state = 7187; break; // &Us -> &Usc - case 7189: state = 7190; break; // &us -> &usc - case 7223: state = 7317; break; // &v -> &vc - case 7307: state = 7315; break; // &V -> &Vc - case 7359: state = 7360; break; // &Verti -> &Vertic - case 7391: state = 7392; break; // &VeryThinSpa -> &VeryThinSpac - case 7421: state = 7422; break; // &Vs -> &Vsc - case 7424: state = 7425; break; // &vs -> &vsc - case 7447: state = 7448; break; // &W -> &Wc - case 7450: state = 7451; break; // &Wcir -> &Wcirc - case 7452: state = 7453; break; // &w -> &wc - case 7455: state = 7456; break; // &wcir -> &wcirc - case 7489: state = 7490; break; // &Ws -> &Wsc - case 7492: state = 7493; break; // &ws -> &wsc - case 7495: state = 7496; break; // &x -> &xc - case 7500: state = 7501; break; // &xcir -> &xcirc - case 7558: state = 7559; break; // &Xs -> &Xsc - case 7561: state = 7562; break; // &xs -> &xsc - case 7564: state = 7565; break; // &xsq -> &xsqc - case 7584: state = 7600; break; // &Y -> &Yc - case 7585: state = 7586; break; // &Ya -> &Yac - case 7590: state = 7604; break; // &y -> &yc - case 7591: state = 7592; break; // &ya -> &yac - case 7596: state = 7597; break; // &YA -> &YAc - case 7602: state = 7603; break; // &Ycir -> &Ycirc - case 7606: state = 7607; break; // &ycir -> &ycirc - case 7616: state = 7617; break; // &YI -> &YIc - case 7619: state = 7620; break; // &yi -> &yic - case 7628: state = 7629; break; // &Ys -> &Ysc - case 7631: state = 7632; break; // &ys -> &ysc - case 7634: state = 7635; break; // &YU -> &YUc - case 7637: state = 7638; break; // &yu -> &yuc - case 7645: state = 7657; break; // &Z -> &Zc - case 7646: state = 7647; break; // &Za -> &Zac - case 7651: state = 7662; break; // &z -> &zc - case 7652: state = 7653; break; // &za -> &zac - case 7690: state = 7691; break; // &ZeroWidthSpa -> &ZeroWidthSpac - case 7701: state = 7702; break; // &ZH -> &ZHc - case 7704: state = 7705; break; // &zh -> &zhc - case 7719: state = 7720; break; // &Zs -> &Zsc - case 7722: state = 7723; break; // &zs -> &zsc + case 8: state = 27; break; // &a -> &ac + case 9: state = 10; break; // &aa -> &aac + case 35: state = 36; break; // &Acir ->  + case 39: state = 40; break; // &acir -> â + case 99: state = 100; break; // &Ama -> &Amac + case 104: state = 105; break; // &ama -> &amac + case 147: state = 152; break; // &angmsda -> &angmsdac + case 201: state = 202; break; // &apa -> &apac + case 222: state = 223; break; // &ApplyFun -> &ApplyFunc + case 247: state = 248; break; // &As -> &Asc + case 251: state = 252; break; // &as -> &asc + case 289: state = 290; break; // &aw -> &awc + case 301: state = 369; break; // &b -> &bc + case 302: state = 303; break; // &ba -> &bac + case 304: state = 305; break; // &back -> &backc + case 331: state = 374; break; // &B -> &Bc + case 332: state = 333; break; // &Ba -> &Bac + case 384: state = 385; break; // &be -> &bec + case 390: state = 391; break; // &Be -> &Bec + case 443: state = 444; break; // &big -> &bigc + case 449: state = 450; break; // &bigcir -> &bigcirc + case 472: state = 473; break; // &bigsq -> &bigsqc + case 520: state = 521; break; // &bla -> &blac + case 575: state = 576; break; // &blo -> &bloc + case 740: state = 741; break; // &Bs -> &Bsc + case 744: state = 745; break; // &bs -> &bsc + case 789: state = 866; break; // &C -> &Cc + case 790: state = 791; break; // &Ca -> &Cac + case 796: state = 861; break; // &c -> &cc + case 797: state = 798; break; // &ca -> &cac + case 805: state = 817; break; // &cap -> &capc + case 812: state = 813; break; // &capbr -> &capbrc + case 887: state = 888; break; // &Ccir -> &Ccirc + case 891: state = 892; break; // &ccir -> &ccirc + case 956: state = 957; break; // &CH -> &CHc + case 960: state = 961; break; // &ch -> &chc + case 964: state = 965; break; // &che -> &chec + case 979: state = 981; break; // &cir -> &circ + case 1004: state = 1009; break; // &circled -> &circledc + case 1011: state = 1012; break; // &circledcir -> &circledcirc + case 1020: state = 1021; break; // &Cir -> &Circ + case 1063: state = 1064; break; // &cirs -> &cirsc + case 1069: state = 1070; break; // &Clo -> &Cloc + case 1213: state = 1214; break; // &Coprodu -> &Coproduc + case 1233: state = 1234; break; // &CounterClo -> &CounterCloc + case 1270: state = 1271; break; // &Cs -> &Csc + case 1274: state = 1275; break; // &cs -> &csc + case 1305: state = 1306; break; // &cues -> &cuesc + case 1318: state = 1330; break; // &cup -> &cupc + case 1321: state = 1322; break; // &cupbr -> &cupbrc + case 1359: state = 1360; break; // &curlyeqpre -> &curlyeqprec + case 1363: state = 1364; break; // &curlyeqsu -> &curlyeqsuc + case 1364: state = 1365; break; // &curlyeqsuc -> &curlyeqsucc + case 1407: state = 1408; break; // &cw -> &cwc + case 1420: state = 1421; break; // &cyl -> &cylc + case 1425: state = 1474; break; // &D -> &Dc + case 1432: state = 1480; break; // &d -> &dc + case 1471: state = 1472; break; // &dbla -> &dblac + case 1558: state = 1559; break; // &Dia -> &Diac + case 1563: state = 1564; break; // &Diacriti -> &Diacritic + case 1567: state = 1568; break; // &DiacriticalA -> &DiacriticalAc + case 1581: state = 1582; break; // &DiacriticalDoubleA -> &DiacriticalDoubleAc + case 1661: state = 1662; break; // &DJ -> &DJc + case 1665: state = 1666; break; // &dj -> &djc + case 1669: state = 1670; break; // &dl -> &dlc + case 1873: state = 1874; break; // &DoubleVerti -> &DoubleVertic + case 1960: state = 1961; break; // &DownLeftRightVe -> &DownLeftRightVec + case 1970: state = 1971; break; // &DownLeftTeeVe -> &DownLeftTeeVec + case 1977: state = 1978; break; // &DownLeftVe -> &DownLeftVec + case 1996: state = 1997; break; // &DownRightTeeVe -> &DownRightTeeVec + case 2003: state = 2004; break; // &DownRightVe -> &DownRightVec + case 2023: state = 2031; break; // &dr -> &drc + case 2040: state = 2041; break; // &Ds -> &Dsc + case 2044: state = 2045; break; // &ds -> &dsc + case 2048: state = 2049; break; // &DS -> &DSc + case 2093: state = 2094; break; // &DZ -> &DZc + case 2097: state = 2098; break; // &dz -> &dzc + case 2108: state = 2127; break; // &E -> &Ec + case 2109: state = 2110; break; // &Ea -> &Eac + case 2115: state = 2133; break; // &e -> &ec + case 2116: state = 2117; break; // &ea -> &eac + case 2140: state = 2146; break; // &ecir -> ê + case 2143: state = 2144; break; // &Ecir -> Ê + case 2229: state = 2230; break; // &Ema -> &Emac + case 2234: state = 2235; break; // &ema -> &emac + case 2339: state = 2340; break; // &eq -> &eqc + case 2342: state = 2343; break; // &eqcir -> &eqcirc + case 2418: state = 2419; break; // &Es -> &Esc + case 2422: state = 2423; break; // &es -> &esc + case 2458: state = 2459; break; // &ex -> &exc + case 2473: state = 2474; break; // &expe -> &expec + case 2503: state = 2521; break; // &f -> &fc + case 2517: state = 2518; break; // &F -> &Fc + case 2648: state = 2649; break; // &fra -> &frac + case 2693: state = 2694; break; // &Fs -> &Fsc + case 2697: state = 2698; break; // &fs -> &fsc + case 2701: state = 2746; break; // &g -> &gc + case 2702: state = 2703; break; // &ga -> &gac + case 2708: state = 2736; break; // &G -> &Gc + case 2743: state = 2744; break; // &Gcir -> &Gcirc + case 2748: state = 2749; break; // &gcir -> &gcirc + case 2781: state = 2783; break; // &ges -> &gesc + case 2783: state = 2784; break; // &gesc -> &gescc + case 2816: state = 2817; break; // &GJ -> &GJc + case 2820: state = 2821; break; // &gj -> &gjc + case 2923: state = 2924; break; // &Gs -> &Gsc + case 2927: state = 2928; break; // &gs -> &gsc + case 2942: state = 2944; break; // > -> >c + case 2944: state = 2945; break; // >c -> >cc + case 3014: state = 3064; break; // &H -> &Hc + case 3015: state = 3016; break; // &Ha -> &Hac + case 3020: state = 3069; break; // &h -> &hc + case 3037: state = 3038; break; // &HARD -> &HARDc + case 3042: state = 3043; break; // &hard -> &hardc + case 3050: state = 3052; break; // &harr -> &harrc + case 3066: state = 3067; break; // &Hcir -> &Hcirc + case 3071: state = 3072; break; // &hcir -> &hcirc + case 3089: state = 3090; break; // &her -> &herc + case 3108: state = 3109; break; // &HilbertSpa -> &HilbertSpac + case 3184: state = 3185; break; // &Hs -> &Hsc + case 3188: state = 3189; break; // &hs -> &hsc + case 3236: state = 3252; break; // &I -> &Ic + case 3237: state = 3238; break; // &Ia -> &Iac + case 3243: state = 3250; break; // &i -> &ic + case 3244: state = 3245; break; // &ia -> &iac + case 3254: state = 3255; break; // &Icir -> Î + case 3258: state = 3259; break; // &icir -> î + case 3269: state = 3270; break; // &IE -> &IEc + case 3273: state = 3274; break; // &ie -> &iec + case 3277: state = 3278; break; // &iex -> &iexc + case 3332: state = 3333; break; // &Ima -> &Imac + case 3337: state = 3338; break; // &ima -> &imac + case 3378: state = 3380; break; // &in -> &inc + case 3401: state = 3403; break; // &int -> &intc + case 3419: state = 3420; break; // &inter -> &interc + case 3426: state = 3427; break; // &Interse -> &Intersec + case 3463: state = 3464; break; // &IO -> &IOc + case 3467: state = 3468; break; // &io -> &ioc + case 3503: state = 3504; break; // &Is -> &Isc + case 3507: state = 3508; break; // &is -> &isc + case 3540: state = 3541; break; // &Iuk -> &Iukc + case 3545: state = 3546; break; // &iuk -> &iukc + case 3555: state = 3556; break; // &J -> &Jc + case 3558: state = 3559; break; // &Jcir -> &Jcirc + case 3561: state = 3562; break; // &j -> &jc + case 3564: state = 3565; break; // &jcir -> &jcirc + case 3590: state = 3591; break; // &Js -> &Jsc + case 3594: state = 3595; break; // &js -> &jsc + case 3599: state = 3600; break; // &Jser -> &Jserc + case 3604: state = 3605; break; // &jser -> &jserc + case 3609: state = 3610; break; // &Juk -> &Jukc + case 3614: state = 3615; break; // &juk -> &jukc + case 3618: state = 3632; break; // &K -> &Kc + case 3624: state = 3638; break; // &k -> &kc + case 3660: state = 3661; break; // &KH -> &KHc + case 3664: state = 3665; break; // &kh -> &khc + case 3668: state = 3669; break; // &KJ -> &KJc + case 3672: state = 3673; break; // &kj -> &kjc + case 3684: state = 3685; break; // &Ks -> &Ksc + case 3688: state = 3689; break; // &ks -> &ksc + case 3692: state = 3843; break; // &l -> &lc + case 3698: state = 3837; break; // &L -> &Lc + case 3699: state = 3700; break; // &La -> &Lac + case 3705: state = 3706; break; // &la -> &lac + case 3748: state = 3749; break; // &Lapla -> &Laplac + case 3822: state = 3823; break; // &lbra -> &lbrac + case 3869: state = 3870; break; // &ld -> &ldc + case 3908: state = 3909; break; // &LeftAngleBra -> &LeftAngleBrac + case 3969: state = 3970; break; // &LeftDoubleBra -> &LeftDoubleBrac + case 3981: state = 3982; break; // &LeftDownTeeVe -> &LeftDownTeeVec + case 3988: state = 3989; break; // &LeftDownVe -> &LeftDownVec + case 4086: state = 4087; break; // &LeftRightVe -> &LeftRightVec + case 4103: state = 4104; break; // &LeftTeeVe -> &LeftTeeVec + case 4145: state = 4146; break; // &LeftUpDownVe -> &LeftUpDownVec + case 4155: state = 4156; break; // &LeftUpTeeVe -> &LeftUpTeeVec + case 4162: state = 4163; break; // &LeftUpVe -> &LeftUpVec + case 4173: state = 4174; break; // &LeftVe -> &LeftVec + case 4197: state = 4199; break; // &les -> &lesc + case 4199: state = 4200; break; // &lesc -> &lescc + case 4338: state = 4339; break; // &LJ -> &LJc + case 4342: state = 4343; break; // &lj -> &ljc + case 4348: state = 4354; break; // &ll -> &llc + case 4396: state = 4397; break; // &lmousta -> &lmoustac + case 4628: state = 4633; break; // &lr -> &lrc + case 4652: state = 4662; break; // &ls -> &lsc + case 4658: state = 4659; break; // &Ls -> &Lsc + case 4698: state = 4700; break; // < -> <c + case 4700: state = 4701; break; // <c -> <cc + case 4767: state = 4809; break; // &m -> &mc + case 4768: state = 4769; break; // &ma -> &mac + case 4781: state = 4815; break; // &M -> &Mc + case 4850: state = 4851; break; // &MediumSpa -> &MediumSpac + case 4871: state = 4872; break; // &mi -> &mic + case 4876: state = 4882; break; // &mid -> &midc + case 4909: state = 4910; break; // &ml -> &mlc + case 4937: state = 4938; break; // &Ms -> &Msc + case 4941: state = 4942; break; // &ms -> &msc + case 4965: state = 5020; break; // &n -> &nc + case 4966: state = 4978; break; // &na -> &nac + case 4971: state = 5024; break; // &N -> &Nc + case 4972: state = 4973; break; // &Na -> &Nac + case 5099: state = 5100; break; // &NegativeMediumSpa -> &NegativeMediumSpac + case 5105: state = 5106; break; // &NegativeThi -> &NegativeThic + case 5110: state = 5111; break; // &NegativeThickSpa -> &NegativeThickSpac + case 5117: state = 5118; break; // &NegativeThinSpa -> &NegativeThinSpac + case 5131: state = 5132; break; // &NegativeVeryThinSpa -> &NegativeVeryThinSpac + case 5248: state = 5249; break; // &NJ -> &NJc + case 5252: state = 5253; break; // &nj -> &njc + case 5365: state = 5366; break; // &NonBreakingSpa -> &NonBreakingSpac + case 5406: state = 5407; break; // &NotDoubleVerti -> &NotDoubleVertic + case 5521: state = 5526; break; // ¬inv -> ¬invc + case 5623: state = 5628; break; // ¬niv -> ¬nivc + case 5632: state = 5633; break; // &NotPre -> &NotPrec + case 5726: state = 5738; break; // &NotSu -> &NotSuc + case 5738: state = 5739; break; // &NotSuc -> &NotSucc + case 5813: state = 5814; break; // &NotVerti -> &NotVertic + case 5842: state = 5844; break; // &npr -> &nprc + case 5848: state = 5850; break; // &npre -> &nprec + case 5862: state = 5864; break; // &nrarr -> &nrarrc + case 5895: state = 5896; break; // &ns -> &nsc + case 5896: state = 5898; break; // &nsc -> &nscc + case 5904: state = 5905; break; // &Ns -> &Nsc + case 5951: state = 5967; break; // &nsu -> &nsuc + case 5967: state = 5968; break; // &nsuc -> &nsucc + case 6131: state = 6152; break; // &O -> &Oc + case 6132: state = 6133; break; // &Oa -> &Oac + case 6138: state = 6148; break; // &o -> &oc + case 6139: state = 6140; break; // &oa -> &oac + case 6150: state = 6157; break; // &ocir -> ô + case 6154: state = 6155; break; // &Ocir -> Ô + case 6171: state = 6172; break; // &Odbla -> &Odblac + case 6176: state = 6177; break; // &odbla -> &odblac + case 6200: state = 6201; break; // &of -> &ofc + case 6238: state = 6243; break; // &ol -> &olc + case 6259: state = 6260; break; // &Oma -> &Omac + case 6264: state = 6265; break; // &oma -> &omac + case 6276: state = 6277; break; // &Omi -> &Omic + case 6282: state = 6283; break; // &omi -> &omic + case 6378: state = 6379; break; // &Os -> &Osc + case 6382: state = 6383; break; // &os -> &osc + case 6443: state = 6444; break; // &OverBra -> &OverBrac + case 6463: state = 6494; break; // &p -> &pc + case 6482: state = 6491; break; // &P -> &Pc + case 6498: state = 6499; break; // &per -> &perc + case 6545: state = 6546; break; // &pit -> &pitc + case 6557: state = 6558; break; // &plan -> &planc + case 6567: state = 6576; break; // &plus -> &plusc + case 6569: state = 6570; break; // &plusa -> &plusac + case 6611: state = 6612; break; // &Poin -> &Poinc + case 6642: state = 6647; break; // &pr -> &prc + case 6653: state = 6655; break; // &pre -> &prec + case 6655: state = 6664; break; // &prec -> &precc + case 6672: state = 6673; break; // &Pre -> &Prec + case 6750: state = 6751; break; // &Produ -> &Produc + case 6795: state = 6796; break; // &Ps -> &Psc + case 6799: state = 6800; break; // &ps -> &psc + case 6808: state = 6809; break; // &pun -> &punc + case 6839: state = 6840; break; // &Qs -> &Qsc + case 6843: state = 6844; break; // &qs -> &qsc + case 6876: state = 7027; break; // &r -> &rc + case 6882: state = 6883; break; // &ra -> &rac + case 6886: state = 7021; break; // &R -> &Rc + case 6887: state = 6888; break; // &Ra -> &Rac + case 6898: state = 6899; break; // &radi -> &radic + case 6932: state = 6942; break; // &rarr -> &rarrc + case 7006: state = 7007; break; // &rbra -> &rbrac + case 7053: state = 7054; break; // &rd -> &rdc + case 7074: state = 7089; break; // &re -> &rec + case 7182: state = 7183; break; // &RightAngleBra -> &RightAngleBrac + case 7244: state = 7245; break; // &RightDoubleBra -> &RightDoubleBrac + case 7256: state = 7257; break; // &RightDownTeeVe -> &RightDownTeeVec + case 7263: state = 7264; break; // &RightDownVe -> &RightDownVec + case 7348: state = 7349; break; // &RightTeeVe -> &RightTeeVec + case 7390: state = 7391; break; // &RightUpDownVe -> &RightUpDownVec + case 7400: state = 7401; break; // &RightUpTeeVe -> &RightUpTeeVec + case 7407: state = 7408; break; // &RightUpVe -> &RightUpVec + case 7418: state = 7419; break; // &RightVe -> &RightVec + case 7459: state = 7460; break; // &rmousta -> &rmoustac + case 7542: state = 7552; break; // &rs -> &rsc + case 7548: state = 7549; break; // &Rs -> &Rsc + case 7610: state = 7629; break; // &S -> &Sc + case 7611: state = 7612; break; // &Sa -> &Sac + case 7617: state = 7631; break; // &s -> &sc + case 7618: state = 7619; break; // &sa -> &sac + case 7631: state = 7645; break; // &sc -> &scc + case 7663: state = 7664; break; // &Scir -> &Scirc + case 7667: state = 7668; break; // &scir -> &scirc + case 7703: state = 7718; break; // &se -> &sec + case 7751: state = 7762; break; // &sh -> &shc + case 7756: state = 7767; break; // &SH -> &SHc + case 7758: state = 7759; break; // &SHCH -> &SHCHc + case 7763: state = 7764; break; // &shch -> &shchc + case 7889: state = 7890; break; // &SmallCir -> &SmallCirc + case 7932: state = 7933; break; // &SOFT -> &SOFTc + case 7938: state = 7939; break; // &soft -> &softc + case 7968: state = 7969; break; // &sq -> &sqc + case 8025: state = 8026; break; // &SquareInterse -> &SquareIntersec + case 8073: state = 8074; break; // &Ss -> &Ssc + case 8077: state = 8078; break; // &ss -> &ssc + case 8127: state = 8216; break; // &Su -> &Suc + case 8130: state = 8198; break; // &su -> &suc + case 8198: state = 8199; break; // &suc -> &succ + case 8199: state = 8208; break; // &succ -> &succc + case 8216: state = 8217; break; // &Suc -> &Succ + case 8400: state = 8419; break; // &T -> &Tc + case 8404: state = 8425; break; // &t -> &tc + case 8452: state = 8453; break; // &telre -> &telrec + case 8493: state = 8494; break; // &thi -> &thic + case 8507: state = 8508; break; // &Thi -> &Thic + case 8512: state = 8513; break; // &ThickSpa -> &ThickSpac + case 8523: state = 8524; break; // &ThinSpa -> &ThinSpac + case 8594: state = 8600; break; // &top -> &topc + case 8705: state = 8706; break; // &Ts -> &Tsc + case 8709: state = 8710; break; // &ts -> &tsc + case 8713: state = 8714; break; // &TS -> &TSc + case 8719: state = 8720; break; // &TSH -> &TSHc + case 8723: state = 8724; break; // &tsh -> &tshc + case 8768: state = 8815; break; // &U -> &Uc + case 8769: state = 8770; break; // &Ua -> &Uac + case 8775: state = 8820; break; // &u -> &uc + case 8776: state = 8777; break; // &ua -> &uac + case 8792: state = 8793; break; // &Uarro -> &Uarroc + case 8798: state = 8799; break; // &Ubr -> &Ubrc + case 8803: state = 8804; break; // &ubr -> &ubrc + case 8817: state = 8818; break; // &Ucir -> Û + case 8822: state = 8823; break; // &ucir -> û + case 8837: state = 8838; break; // &Udbla -> &Udblac + case 8842: state = 8843; break; // &udbla -> &udblac + case 8887: state = 8888; break; // &ul -> &ulc + case 8905: state = 8906; break; // &Uma -> &Umac + case 8910: state = 8911; break; // &uma -> &umac + case 8925: state = 8926; break; // &UnderBra -> &UnderBrac + case 9127: state = 9128; break; // &ur -> &urc + case 9153: state = 9154; break; // &Us -> &Usc + case 9157: state = 9158; break; // &us -> &usc + case 9201: state = 9317; break; // &v -> &vc + case 9303: state = 9314; break; // &V -> &Vc + case 9374: state = 9375; break; // &Verti -> &Vertic + case 9410: state = 9411; break; // &VeryThinSpa -> &VeryThinSpac + case 9450: state = 9451; break; // &Vs -> &Vsc + case 9454: state = 9455; break; // &vs -> &vsc + case 9484: state = 9485; break; // &W -> &Wc + case 9487: state = 9488; break; // &Wcir -> &Wcirc + case 9490: state = 9491; break; // &w -> &wc + case 9493: state = 9494; break; // &wcir -> &wcirc + case 9540: state = 9541; break; // &Ws -> &Wsc + case 9544: state = 9545; break; // &ws -> &wsc + case 9548: state = 9549; break; // &x -> &xc + case 9554: state = 9555; break; // &xcir -> &xcirc + case 9632: state = 9633; break; // &Xs -> &Xsc + case 9636: state = 9637; break; // &xs -> &xsc + case 9640: state = 9641; break; // &xsq -> &xsqc + case 9665: state = 9685; break; // &Y -> &Yc + case 9666: state = 9667; break; // &Ya -> &Yac + case 9672: state = 9690; break; // &y -> &yc + case 9673: state = 9674; break; // &ya -> &yac + case 9679: state = 9680; break; // &YA -> &YAc + case 9687: state = 9688; break; // &Ycir -> &Ycirc + case 9692: state = 9693; break; // &ycir -> &ycirc + case 9708: state = 9709; break; // &YI -> &YIc + case 9712: state = 9713; break; // &yi -> &yic + case 9724: state = 9725; break; // &Ys -> &Ysc + case 9728: state = 9729; break; // &ys -> &ysc + case 9732: state = 9733; break; // &YU -> &YUc + case 9736: state = 9737; break; // &yu -> &yuc + case 9747: state = 9761; break; // &Z -> &Zc + case 9748: state = 9749; break; // &Za -> &Zac + case 9754: state = 9767; break; // &z -> &zc + case 9755: state = 9756; break; // &za -> &zac + case 9801: state = 9802; break; // &ZeroWidthSpa -> &ZeroWidthSpac + case 9817: state = 9818; break; // &ZH -> &ZHc + case 9821: state = 9822; break; // &zh -> &zhc + case 9840: state = 9841; break; // &Zs -> &Zsc + case 9844: state = 9845; break; // &zs -> &zsc default: return false; } break; case 'd': switch (state) { - case 0: state = 1097; break; // & -> &d - case 23: state = 24; break; // &ac -> &acd - case 88: state = 89; break; // &An -> &And - case 90: state = 91; break; // &an -> &and - case 91: state = 95; break; // &and -> &andd - case 93: state = 94; break; // &andan -> &andand - case 107: state = 108; break; // &angms -> &angmsd - case 109: state = 113; break; // &angmsda -> &angmsdad - case 121: state = 122; break; // &angrtvb -> &angrtvbd - case 150: state = 151; break; // &api -> &apid - case 198: state = 199; break; // &Atil -> &Atild - case 203: state = 204; break; // &atil -> &atild - case 222: state = 284; break; // &b -> &bd - case 263: state = 264; break; // &Barwe -> &Barwed - case 266: state = 267; break; // &barwe -> &barwed - case 343: state = 344; break; // &bigo -> &bigod - case 371: state = 372; break; // &bigtriangle -> &bigtriangled - case 387: state = 388; break; // &bigwe -> &bigwed - case 420: state = 421; break; // &blacktriangle -> &blacktriangled - case 470: state = 477; break; // &box -> &boxd - case 484: state = 487; break; // &boxH -> &boxHd - case 485: state = 489; break; // &boxh -> &boxhd - case 583: state = 677; break; // &C -> &Cd - case 589: state = 680; break; // &c -> &cd - case 596: state = 610; break; // &cap -> &capd - case 598: state = 599; break; // &capan -> &capand - case 653: state = 654; break; // &Cce -> &Cced - case 657: state = 658; break; // &cce -> &cced - case 683: state = 684; break; // &ce -> &ced - case 687: state = 688; break; // &Ce -> &Ced - case 708: state = 709; break; // ¢er -> ¢erd - case 738: state = 753; break; // &circle -> &circled - case 753: state = 761; break; // &circled -> &circledd - case 797: state = 798; break; // &cirmi -> &cirmid - case 884: state = 885; break; // &cong -> &congd - case 918: state = 919; break; // &copro -> &coprod - case 921: state = 922; break; // &Copro -> &Coprod - case 983: state = 984; break; // &ct -> &ctd - case 987: state = 988; break; // &cu -> &cud - case 1006: state = 1020; break; // &cup -> &cupd - case 1047: state = 1048; break; // &curlywe -> &curlywed - case 1074: state = 1075; break; // &cuwe -> &cuwed - case 1097: state = 1142; break; // &d -> &dd - case 1154: state = 1155; break; // &DDotrah -> &DDotrahd - case 1225: state = 1226; break; // &DiacriticalTil -> &DiacriticalTild - case 1233: state = 1234; break; // &Diamon -> &Diamond - case 1236: state = 1237; break; // &diamon -> &diamond - case 1264: state = 1265; break; // &divi -> &divid - case 1307: state = 1308; break; // &doteq -> &doteqd - case 1339: state = 1340; break; // &doublebarwe -> &doublebarwed - case 1479: state = 1500; break; // &down -> &downd - case 1624: state = 1625; break; // &dt -> &dtd - case 1656: state = 1698; break; // &E -> &Ed - case 1662: state = 1703; break; // &e -> &ed - case 1724: state = 1725; break; // &egs -> &egsd - case 1742: state = 1743; break; // &els -> &elsd - case 1866: state = 1867; break; // &EqualTil -> &EqualTild - case 1900: state = 1903; break; // &es -> &esd - case 1970: state = 1971; break; // &falling -> &fallingd - case 2008: state = 2009; break; // &Fille -> &Filled - case 2118: state = 2162; break; // &g -> &gd - case 2124: state = 2159; break; // &G -> &Gd - case 2128: state = 2132; break; // &Gamma -> &Gammad - case 2131: state = 2133; break; // &gamma -> &gammad - case 2146: state = 2147; break; // &Gce -> &Gced - case 2176: state = 2179; break; // &ges -> &gesd - case 2279: state = 2280; break; // &GreaterTil -> &GreaterTild - case 2294: state = 2299; break; // > -> >d - case 2311: state = 2320; break; // >r -> >rd - case 2373: state = 2374; break; // &har -> &hard - case 2533: state = 2555; break; // &I -> &Id - case 2634: state = 2635; break; // &impe -> &imped - case 2652: state = 2653; break; // &ino -> &inod - case 2691: state = 2692; break; // &intpro -> &intprod - case 2733: state = 2734; break; // &ipro -> &iprod - case 2747: state = 2748; break; // &isin -> &isind - case 2758: state = 2759; break; // &Itil -> &Itild - case 2762: state = 2763; break; // &itil -> &itild - case 2837: state = 2838; break; // &Kce -> &Kced - case 2842: state = 2843; break; // &kce -> &kced - case 2881: state = 3012; break; // &l -> &ld - case 2908: state = 2909; break; // &Lamb -> &Lambd - case 2912: state = 2913; break; // &lamb -> &lambd - case 2918: state = 2919; break; // &lang -> &langd - case 2985: state = 2986; break; // &lbrksl -> &lbrksld - case 2998: state = 2999; break; // &Lce -> &Lced - case 3002: state = 3003; break; // &lce -> &lced - case 3019: state = 3020; break; // &ldr -> &ldrd - case 3132: state = 3133; break; // &leftharpoon -> &leftharpoond - case 3291: state = 3294; break; // &les -> &lesd - case 3302: state = 3309; break; // &less -> &lessd - case 3373: state = 3374; break; // &LessTil -> &LessTild - case 3395: state = 3396; break; // &lhar -> &lhard - case 3429: state = 3430; break; // &llhar -> &llhard - case 3435: state = 3436; break; // &Lmi -> &Lmid - case 3440: state = 3441; break; // &lmi -> &lmid - case 3655: state = 3656; break; // &lrhar -> &lrhard - case 3692: state = 3697; break; // < -> <d - case 3725: state = 3726; break; // &lur -> &lurd - case 3745: state = 3784; break; // &m -> &md - case 3761: state = 3762; break; // &mapsto -> &mapstod - case 3797: state = 3798; break; // &measure -> &measured - case 3804: state = 3805; break; // &Me -> &Med - case 3827: state = 3831; break; // &mi -> &mid - case 3831: state = 3838; break; // &mid -> &midd - case 3843: state = 3845; break; // &minus -> &minusd - case 3855: state = 3858; break; // &ml -> &mld - case 3865: state = 3866; break; // &mo -> &mod - case 3897: state = 3966; break; // &n -> &nd - case 3916: state = 3917; break; // &napi -> &napid - case 3948: state = 3949; break; // &Nce -> &Nced - case 3952: state = 3953; break; // &nce -> &nced - case 3958: state = 3959; break; // &ncong -> &ncongd - case 3970: state = 3981; break; // &ne -> &ned - case 3992: state = 3993; break; // &NegativeMe -> &NegativeMed - case 4043: state = 4044; break; // &Neste -> &Nested - case 4112: state = 4113; break; // &nis -> &nisd - case 4121: state = 4128; break; // &nl -> &nld - case 4188: state = 4189; break; // &nmi -> &nmid - case 4261: state = 4262; break; // &NotEqualTil -> &NotEqualTild - case 4313: state = 4314; break; // &NotGreaterTil -> &NotGreaterTild - case 4334: state = 4335; break; // ¬in -> ¬ind - case 4393: state = 4394; break; // &NotLessTil -> &NotLessTild - case 4400: state = 4401; break; // &NotNeste -> &NotNested - case 4434: state = 4435; break; // &NotPrece -> &NotPreced - case 4528: state = 4529; break; // &NotSuccee -> &NotSucceed - case 4548: state = 4549; break; // &NotSucceedsTil -> &NotSucceedsTild - case 4564: state = 4565; break; // &NotTil -> &NotTild - case 4583: state = 4584; break; // &NotTildeTil -> &NotTildeTild - case 4668: state = 4669; break; // &nshortmi -> &nshortmid - case 4683: state = 4684; break; // &nsmi -> &nsmid - case 4723: state = 4724; break; // &Ntil -> &Ntild - case 4727: state = 4728; break; // &ntil -> &ntild - case 4760: state = 4776; break; // &nv -> &nvd - case 4763: state = 4768; break; // &nV -> &nVd - case 4827: state = 4855; break; // &O -> &Od - case 4833: state = 4851; break; // &o -> &od - case 4870: state = 4871; break; // &odsol -> &odsold - case 4942: state = 4947; break; // &omi -> &omid - case 4991: state = 4995; break; // &or -> &ord - case 5033: state = 5034; break; // &Otil -> &Otild - case 5038: state = 5039; break; // &otil -> &otild - case 5114: state = 5115; break; // &perio -> &period - case 5159: state = 5168; break; // &plus -> &plusd - case 5213: state = 5214; break; // &poun -> £ - case 5240: state = 5241; break; // &Prece -> &Preced - case 5261: state = 5262; break; // &PrecedesTil -> &PrecedesTild - case 5296: state = 5297; break; // &pro -> &prod - case 5298: state = 5299; break; // &Pro -> &Prod - case 5397: state = 5526; break; // &r -> &rd - case 5402: state = 5414; break; // &ra -> &rad - case 5426: state = 5427; break; // &rang -> &rangd - case 5499: state = 5500; break; // &rbrksl -> &rbrksld - case 5512: state = 5513; break; // &Rce -> &Rced - case 5516: state = 5517; break; // &rce -> &rced - case 5529: state = 5530; break; // &rdl -> &rdld - case 5609: state = 5610; break; // &rhar -> &rhard - case 5718: state = 5719; break; // &rightharpoon -> &rightharpoond - case 5847: state = 5848; break; // &rising -> &risingd - case 5873: state = 5874; break; // &rnmi -> &rnmid - case 5900: state = 5901; break; // &Roun -> &Round - case 5976: state = 5977; break; // &RuleDelaye -> &RuleDelayed - case 5991: state = 6048; break; // &s -> &sd - case 6016: state = 6021; break; // &sce -> &sced - case 6017: state = 6018; break; // &Sce -> &Sced - case 6130: state = 6131; break; // &shortmi -> &shortmid - case 6168: state = 6169; break; // &sim -> &simd - case 6223: state = 6224; break; // &smi -> &smid - case 6250: state = 6251; break; // &spa -> &spad - case 6384: state = 6385; break; // &sub -> &subd - case 6389: state = 6390; break; // &sube -> &subed - case 6449: state = 6450; break; // &Succee -> &Succeed - case 6469: state = 6470; break; // &SucceedsTil -> &SucceedsTild - case 6500: state = 6504; break; // &sup -> &supd - case 6511: state = 6512; break; // &supe -> &suped - case 6586: state = 6617; break; // &t -> &td - case 6607: state = 6608; break; // &Tce -> &Tced - case 6611: state = 6612; break; // &tce -> &tced - case 6697: state = 6698; break; // &Til -> &Tild - case 6701: state = 6702; break; // &til -> &tild - case 6720: state = 6721; break; // &TildeTil -> &TildeTild - case 6725: state = 6729; break; // × -> ×d - case 6761: state = 6762; break; // &tra -> &trad - case 6764: state = 6788; break; // &tri -> &trid - case 6769: state = 6770; break; // &triangle -> &triangled - case 6852: state = 6853; break; // &twohea -> &twohead - case 6873: state = 6924; break; // &U -> &Ud - case 6879: state = 6920; break; // &u -> &ud - case 6987: state = 6988; break; // &Un -> &Und - case 7031: state = 7069; break; // &Up -> &Upd - case 7042: state = 7078; break; // &up -> &upd - case 7192: state = 7193; break; // &ut -> &utd - case 7198: state = 7199; break; // &Util -> &Utild - case 7202: state = 7203; break; // &util -> &utild - case 7223: state = 7331; break; // &v -> &vd - case 7307: state = 7323; break; // &V -> &Vd - case 7381: state = 7382; break; // &VerticalTil -> &VerticalTild - case 7436: state = 7437; break; // &Vv -> &Vvd - case 7457: state = 7458; break; // &we -> &wed - case 7462: state = 7463; break; // &We -> &Wed - case 7495: state = 7504; break; // &x -> &xd - case 7535: state = 7536; break; // &xo -> &xod - case 7580: state = 7581; break; // &xwe -> &xwed - case 7645: state = 7669; break; // &Z -> &Zd - case 7651: state = 7672; break; // &z -> &zd - case 7684: state = 7685; break; // &ZeroWi -> &ZeroWid + case 0: state = 1432; break; // & -> &d + case 27: state = 29; break; // &ac -> &acd + case 116: state = 117; break; // &An -> &And + case 119: state = 120; break; // &an -> &and + case 120: state = 126; break; // &and -> &andd + case 123: state = 124; break; // &andan -> &andand + case 144: state = 145; break; // &angms -> &angmsd + case 147: state = 154; break; // &angmsda -> &angmsdad + case 168: state = 170; break; // &angrtvb -> &angrtvbd + case 210: state = 211; break; // &api -> &apid + case 271: state = 272; break; // &Atil -> &Atild + case 277: state = 278; break; // &atil -> &atild + case 301: state = 379; break; // &b -> &bd + case 350: state = 351; break; // &Barwe -> &Barwed + case 354: state = 355; break; // &barwe -> &barwed + case 455: state = 456; break; // &bigo -> &bigod + case 488: state = 489; break; // &bigtriangle -> &bigtriangled + case 508: state = 509; break; // &bigwe -> &bigwed + case 545: state = 547; break; // &blacktriangle -> &blacktriangled + case 613: state = 623; break; // &box -> &boxd + case 636: state = 642; break; // &boxH -> &boxHd + case 638: state = 646; break; // &boxh -> &boxhd + case 789: state = 907; break; // &C -> &Cd + case 796: state = 911; break; // &c -> &cd + case 805: state = 824; break; // &cap -> &capd + case 808: state = 809; break; // &capan -> &capand + case 876: state = 877; break; // &Cce -> &Cced + case 881: state = 882; break; // &cce -> &cced + case 915: state = 916; break; // &ce -> &ced + case 920: state = 921; break; // &Ce -> &Ced + case 945: state = 946; break; // ¢er -> ¢erd + case 987: state = 1004; break; // &circle -> &circled + case 1004: state = 1014; break; // &circled -> &circledd + case 1060: state = 1061; break; // &cirmi -> &cirmid + case 1165: state = 1167; break; // &cong -> &congd + case 1207: state = 1208; break; // &copro -> &coprod + case 1211: state = 1212; break; // &Copro -> &Coprod + case 1287: state = 1288; break; // &ct -> &ctd + case 1292: state = 1293; break; // &cu -> &cud + case 1318: state = 1337; break; // &cup -> &cupd + case 1372: state = 1373; break; // &curlywe -> &curlywed + case 1404: state = 1405; break; // &cuwe -> &cuwed + case 1432: state = 1492; break; // &d -> &dd + case 1507: state = 1508; break; // &DDotrah -> &DDotrahd + case 1595: state = 1596; break; // &DiacriticalTil -> &DiacriticalTild + case 1605: state = 1606; break; // &Diamon -> &Diamond + case 1609: state = 1610; break; // &diamon -> &diamond + case 1645: state = 1646; break; // &divi -> &divid + case 1701: state = 1703; break; // &doteq -> &doteqd + case 1739: state = 1740; break; // &doublebarwe -> &doublebarwed + case 1896: state = 1921; break; // &down -> &downd + case 2067: state = 2068; break; // &dt -> &dtd + case 2108: state = 2162; break; // &E -> &Ed + case 2115: state = 2169; break; // &e -> &ed + case 2198: state = 2200; break; // &egs -> &egsd + case 2222: state = 2224; break; // &els -> &elsd + case 2379: state = 2380; break; // &EqualTil -> &EqualTild + case 2422: state = 2426; break; // &es -> &esd + case 2509: state = 2510; break; // &falling -> &fallingd + case 2557: state = 2558; break; // &Fille -> &Filled + case 2701: state = 2759; break; // &g -> &gd + case 2708: state = 2755; break; // &G -> &Gd + case 2712: state = 2718; break; // &Gamma -> &Gammad + case 2716: state = 2720; break; // &gamma -> &gammad + case 2737: state = 2738; break; // &Gce -> &Gced + case 2781: state = 2786; break; // &ges -> &gesd + case 2919: state = 2920; break; // &GreaterTil -> &GreaterTild + case 2942: state = 2950; break; // > -> >d + case 2965: state = 2976; break; // >r -> >rd + case 3041: state = 3042; break; // &har -> &hard + case 3236: state = 3265; break; // &I -> &Id + case 3369: state = 3370; break; // &impe -> &imped + case 3393: state = 3394; break; // &ino -> &inod + case 3441: state = 3442; break; // &intpro -> &intprod + case 3494: state = 3495; break; // &ipro -> &iprod + case 3512: state = 3514; break; // &isin -> &isind + case 3530: state = 3531; break; // &Itil -> &Itild + case 3535: state = 3536; break; // &itil -> &itild + case 3633: state = 3634; break; // &Kce -> &Kced + case 3639: state = 3640; break; // &kce -> &kced + case 3692: state = 3869; break; // &l -> &ld + case 3724: state = 3725; break; // &Lamb -> &Lambd + case 3729: state = 3730; break; // &lamb -> &lambd + case 3737: state = 3739; break; // &lang -> &langd + case 3832: state = 3833; break; // &lbrksl -> &lbrksld + case 3849: state = 3850; break; // &Lce -> &Lced + case 3854: state = 3855; break; // &lce -> &lced + case 3879: state = 3880; break; // &ldr -> &ldrd + case 4010: state = 4011; break; // &leftharpoon -> &leftharpoond + case 4197: state = 4202; break; // &les -> &lesd + case 4215: state = 4223; break; // &less -> &lessd + case 4297: state = 4298; break; // &LessTil -> &LessTild + case 4327: state = 4328; break; // &lhar -> &lhard + case 4372: state = 4373; break; // &llhar -> &llhard + case 4380: state = 4381; break; // &Lmi -> &Lmid + case 4386: state = 4387; break; // &lmi -> &lmid + case 4642: state = 4644; break; // &lrhar -> &lrhard + case 4698: state = 4706; break; // < -> <d + case 4743: state = 4744; break; // &lur -> &lurd + case 4767: state = 4820; break; // &m -> &md + case 4789: state = 4791; break; // &mapsto -> &mapstod + case 4835: state = 4836; break; // &measure -> &measured + case 4843: state = 4844; break; // &Me -> &Med + case 4871: state = 4876; break; // &mi -> &mid + case 4876: state = 4886; break; // &mid -> &midd + case 4892: state = 4896; break; // &minus -> &minusd + case 4909: state = 4913; break; // &ml -> &mld + case 4922: state = 4923; break; // &mo -> &mod + case 4965: state = 5059; break; // &n -> &nd + case 4990: state = 4991; break; // &napi -> &napid + case 5034: state = 5035; break; // &Nce -> &Nced + case 5039: state = 5040; break; // &nce -> &nced + case 5046: state = 5048; break; // &ncong -> &ncongd + case 5064: state = 5080; break; // &ne -> &ned + case 5092: state = 5093; break; // &NegativeMe -> &NegativeMed + case 5150: state = 5151; break; // &Neste -> &Nested + case 5242: state = 5244; break; // &nis -> &nisd + case 5256: state = 5265; break; // &nl -> &nld + case 5344: state = 5345; break; // &nmi -> &nmid + case 5429: state = 5430; break; // &NotEqualTil -> &NotEqualTild + case 5489: state = 5490; break; // &NotGreaterTil -> &NotGreaterTild + case 5513: state = 5515; break; // ¬in -> ¬ind + case 5586: state = 5587; break; // &NotLessTil -> &NotLessTild + case 5594: state = 5595; break; // &NotNeste -> &NotNested + case 5634: state = 5635; break; // &NotPrece -> &NotPreced + case 5741: state = 5742; break; // &NotSuccee -> &NotSucceed + case 5764: state = 5765; break; // &NotSucceedsTil -> &NotSucceedsTild + case 5783: state = 5784; break; // &NotTil -> &NotTild + case 5805: state = 5806; break; // &NotTildeTil -> &NotTildeTild + case 5915: state = 5916; break; // &nshortmi -> &nshortmid + case 5935: state = 5936; break; // &nsmi -> &nsmid + case 5994: state = 5995; break; // &Ntil -> &Ntild + case 5999: state = 6000; break; // &ntil -> &ntild + case 6043: state = 6063; break; // &nv -> &nvd + case 6047: state = 6053; break; // &nV -> &nVd + case 6131: state = 6168; break; // &O -> &Od + case 6138: state = 6163; break; // &o -> &od + case 6187: state = 6188; break; // &odsol -> &odsold + case 6282: state = 6288; break; // &omi -> &omid + case 6342: state = 6348; break; // &or -> &ord + case 6401: state = 6402; break; // &Otil -> &Otild + case 6407: state = 6408; break; // &otil -> &otild + case 6504: state = 6505; break; // &perio -> &period + case 6567: state = 6580; break; // &plus -> &plusd + case 6637: state = 6638; break; // &poun -> £ + case 6674: state = 6675; break; // &Prece -> &Preced + case 6698: state = 6699; break; // &PrecedesTil -> &PrecedesTild + case 6745: state = 6746; break; // &pro -> &prod + case 6748: state = 6749; break; // &Pro -> &Prod + case 6876: state = 7053; break; // &r -> &rd + case 6882: state = 6897; break; // &ra -> &rad + case 6912: state = 6914; break; // &rang -> &rangd + case 7016: state = 7017; break; // &rbrksl -> &rbrksld + case 7033: state = 7034; break; // &Rce -> &Rced + case 7038: state = 7039; break; // &rce -> &rced + case 7057: state = 7058; break; // &rdl -> &rdld + case 7157: state = 7158; break; // &rhar -> &rhard + case 7285: state = 7286; break; // &rightharpoon -> &rightharpoond + case 7434: state = 7435; break; // &rising -> &risingd + case 7466: state = 7467; break; // &rnmi -> &rnmid + case 7502: state = 7503; break; // &Roun -> &Round + case 7598: state = 7599; break; // &RuleDelaye -> &RuleDelayed + case 7617: state = 7695; break; // &s -> &sd + case 7651: state = 7658; break; // &sce -> &sced + case 7653: state = 7654; break; // &Sce -> &Sced + case 7800: state = 7801; break; // &shortmi -> &shortmid + case 7847: state = 7849; break; // &sim -> &simd + case 7918: state = 7919; break; // &smi -> &smid + case 7957: state = 7958; break; // &spa -> &spad + case 8131: state = 8133; break; // &sub -> &subd + case 8139: state = 8141; break; // &sube -> &subed + case 8219: state = 8220; break; // &Succee -> &Succeed + case 8242: state = 8243; break; // &SucceedsTil -> &SucceedsTild + case 8284: state = 8292; break; // &sup -> &supd + case 8302: state = 8304; break; // &supe -> &suped + case 8404: state = 8445; break; // &t -> &td + case 8431: state = 8432; break; // &Tce -> &Tced + case 8436: state = 8437; break; // &tce -> &tced + case 8545: state = 8546; break; // &Til -> &Tild + case 8550: state = 8551; break; // &til -> &tild + case 8572: state = 8573; break; // &TildeTil -> &TildeTild + case 8578: state = 8585; break; // × -> ×d + case 8629: state = 8630; break; // &tra -> &trad + case 8633: state = 8664; break; // &tri -> &trid + case 8638: state = 8640; break; // &triangle -> &triangled + case 8745: state = 8746; break; // &twohea -> &twohead + case 8768: state = 8834; break; // &U -> &Ud + case 8775: state = 8829; break; // &u -> &ud + case 8916: state = 8917; break; // &Un -> &Und + case 8970: state = 9014; break; // &Up -> &Upd + case 8983: state = 9024; break; // &up -> &upd + case 9161: state = 9162; break; // &ut -> &utd + case 9168: state = 9169; break; // &Util -> &Utild + case 9173: state = 9174; break; // &util -> &utild + case 9201: state = 9335; break; // &v -> &vd + case 9303: state = 9325; break; // &V -> &Vd + case 9399: state = 9400; break; // &VerticalTil -> &VerticalTild + case 9471: state = 9472; break; // &Vv -> &Vvd + case 9496: state = 9497; break; // &we -> &wed + case 9502: state = 9503; break; // &We -> &Wed + case 9548: state = 9560; break; // &x -> &xd + case 9602: state = 9603; break; // &xo -> &xod + case 9660: state = 9661; break; // &xwe -> &xwed + case 9747: state = 9777; break; // &Z -> &Zd + case 9754: state = 9781; break; // &z -> &zd + case 9795: state = 9796; break; // &ZeroWi -> &ZeroWid default: return false; } break; case 'e': switch (state) { - case 0: state = 1662; break; // & -> &e + case 0: state = 2115; break; // & -> &e case 5: state = 6; break; // &Aacut -> Á - case 7: state = 42; break; // &a -> &ae - case 11: state = 12; break; // &aacut -> á - case 14: state = 15; break; // &Abr -> &Abre - case 16: state = 17; break; // &Abrev -> &Abreve - case 19: state = 20; break; // &abr -> &abre - case 21: state = 22; break; // &abrev -> &abreve - case 34: state = 35; break; // &acut -> ´ - case 53: state = 54; break; // &Agrav -> À - case 58: state = 59; break; // &agrav -> à - case 60: state = 61; break; // &al -> &ale - case 99: state = 100; break; // &andslop -> &andslope - case 102: state = 103; break; // &ang -> &ange - case 104: state = 105; break; // &angl -> &angle - case 109: state = 114; break; // &angmsda -> &angmsdae - case 143: state = 149; break; // &ap -> &ape - case 169: state = 170; break; // &approx -> &approxe - case 193: state = 194; break; // &asymp -> &asympe - case 199: state = 200; break; // &Atild -> à - case 204: state = 205; break; // &atild -> ã - case 222: state = 288; break; // &b -> &be - case 225: state = 230; break; // &back -> &backe - case 240: state = 241; break; // &backprim -> &backprime - case 244: state = 245; break; // &backsim -> &backsime - case 247: state = 293; break; // &B -> &Be - case 259: state = 260; break; // &barv -> &barve - case 260: state = 261; break; // &barve -> &barvee - case 262: state = 263; break; // &Barw -> &Barwe - case 265: state = 266; break; // &barw -> &barwe - case 268: state = 269; break; // &barwedg -> &barwedge - case 292: state = 299; break; // &becaus -> &because - case 297: state = 298; break; // &Becaus -> &Because - case 325: state = 326; break; // &betw -> &betwe - case 326: state = 327; break; // &betwe -> &betwee - case 353: state = 354; break; // &bigotim -> &bigotime - case 370: state = 371; break; // &bigtriangl -> &bigtriangle - case 383: state = 384; break; // &bigv -> &bigve - case 384: state = 385; break; // &bigve -> &bigvee - case 386: state = 387; break; // &bigw -> &bigwe - case 389: state = 390; break; // &bigwedg -> &bigwedge - case 402: state = 403; break; // &blackloz -> &blackloze - case 405: state = 406; break; // &blacklozeng -> &blacklozenge - case 411: state = 412; break; // &blacksquar -> &blacksquare - case 419: state = 420; break; // &blacktriangl -> &blacktriangle - case 425: state = 426; break; // &blacktrianglel -> &blacktrianglele - case 445: state = 446; break; // &bn -> &bne - case 468: state = 469; break; // &bowti -> &bowtie - case 505: state = 506; break; // &boxtim -> &boxtime - case 535: state = 536; break; // &bprim -> &bprime - case 537: state = 538; break; // &Br -> &Bre - case 539: state = 540; break; // &Brev -> &Breve - case 541: state = 542; break; // &br -> &bre - case 543: state = 544; break; // &brev -> &breve - case 552: state = 555; break; // &bs -> &bse - case 559: state = 560; break; // &bsim -> &bsime - case 570: state = 571; break; // &bull -> &bulle - case 574: state = 576; break; // &bump -> &bumpe - case 579: state = 580; break; // &Bump -> &Bumpe - case 583: state = 687; break; // &C -> &Ce - case 587: state = 588; break; // &Cacut -> &Cacute - case 589: state = 683; break; // &c -> &ce - case 593: state = 594; break; // &cacut -> &cacute - case 620: state = 621; break; // &CapitalDiff -> &CapitalDiffe - case 622: state = 623; break; // &CapitalDiffer -> &CapitalDiffere - case 631: state = 632; break; // &car -> &care - case 637: state = 638; break; // &Cayl -> &Cayle - case 641: state = 657; break; // &cc -> &cce - case 645: state = 653; break; // &Cc -> &Cce - case 699: state = 707; break; // ¢ -> ¢e - case 701: state = 702; break; // &Cent -> &Cente - case 719: state = 722; break; // &ch -> &che - case 733: state = 790; break; // &cir -> &cire - case 734: state = 735; break; // &circ -> &circe - case 737: state = 738; break; // &circl -> &circle - case 744: state = 745; break; // &circlearrowl -> &circlearrowle - case 768: state = 769; break; // &Circl -> &Circle - case 786: state = 787; break; // &CircleTim -> &CircleTime - case 809: state = 810; break; // &Clockwis -> &Clockwise - case 820: state = 821; break; // &ClockwiseContourInt -> &ClockwiseContourInte - case 826: state = 827; break; // &Clos -> &Close - case 837: state = 838; break; // &CloseCurlyDoubl -> &CloseCurlyDouble - case 842: state = 843; break; // &CloseCurlyDoubleQuot -> &CloseCurlyDoubleQuote - case 847: state = 848; break; // &CloseCurlyQuot -> &CloseCurlyQuote - case 859: state = 864; break; // &Colon -> &Colone - case 863: state = 865; break; // &colon -> &colone - case 874: state = 875; break; // &compl -> &comple - case 876: state = 877; break; // &complem -> &compleme - case 880: state = 881; break; // &complex -> &complexe - case 891: state = 892; break; // &Congru -> &Congrue - case 907: state = 908; break; // &ContourInt -> &ContourInte - case 934: state = 935; break; // &Count -> &Counte - case 944: state = 945; break; // &CounterClockwis -> &CounterClockwise - case 955: state = 956; break; // &CounterClockwiseContourInt -> &CounterClockwiseContourInte - case 979: state = 980; break; // &csub -> &csube - case 981: state = 982; break; // &csup -> &csupe - case 987: state = 994; break; // &cu -> &cue - case 1032: state = 1033; break; // &curly -> &curlye - case 1036: state = 1037; break; // &curlyeqpr -> &curlyeqpre - case 1043: state = 1044; break; // &curlyv -> &curlyve - case 1044: state = 1045; break; // &curlyve -> &curlyvee - case 1046: state = 1047; break; // &curlyw -> &curlywe - case 1049: state = 1050; break; // &curlywedg -> &curlywedge - case 1051: state = 1052; break; // &curr -> &curre - case 1054: state = 1055; break; // &curv -> &curve - case 1061: state = 1062; break; // &curvearrowl -> &curvearrowle - case 1070: state = 1071; break; // &cuv -> &cuve - case 1071: state = 1072; break; // &cuve -> &cuvee - case 1073: state = 1074; break; // &cuw -> &cuwe - case 1091: state = 1163; break; // &D -> &De - case 1094: state = 1095; break; // &Dagg -> &Dagge - case 1097: state = 1161; break; // &d -> &de - case 1100: state = 1101; break; // &dagg -> &dagge - case 1103: state = 1104; break; // &dal -> &dale - case 1145: state = 1146; break; // &ddagg -> &ddagge - case 1158: state = 1159; break; // &ddots -> &ddotse - case 1204: state = 1205; break; // &DiacriticalAcut -> &DiacriticalAcute - case 1211: state = 1212; break; // &DiacriticalDoubl -> &DiacriticalDouble - case 1216: state = 1217; break; // &DiacriticalDoubleAcut -> &DiacriticalDoubleAcute - case 1221: state = 1222; break; // &DiacriticalGrav -> &DiacriticalGrave - case 1226: state = 1227; break; // &DiacriticalTild -> &DiacriticalTilde - case 1228: state = 1243; break; // &di -> &die - case 1245: state = 1246; break; // &Diff -> &Diffe - case 1247: state = 1248; break; // &Differ -> &Differe - case 1265: state = 1266; break; // &divid -> ÷ - case 1271: state = 1272; break; // ÷ontim -> ÷ontime - case 1302: state = 1306; break; // &dot -> &dote - case 1329: state = 1330; break; // &dotsquar -> &dotsquare - case 1333: state = 1334; break; // &doubl -> &double - case 1338: state = 1339; break; // &doublebarw -> &doublebarwe - case 1341: state = 1342; break; // &doublebarwedg -> &doublebarwedge - case 1345: state = 1346; break; // &Doubl -> &Double - case 1356: state = 1357; break; // &DoubleContourInt -> &DoubleContourInte - case 1372: state = 1373; break; // &DoubleL -> &DoubleLe - case 1391: state = 1392; break; // &DoubleLeftT -> &DoubleLeftTe - case 1392: state = 1393; break; // &DoubleLeftTe -> &DoubleLeftTee - case 1397: state = 1398; break; // &DoubleLongL -> &DoubleLongLe - case 1436: state = 1437; break; // &DoubleRightT -> &DoubleRightTe - case 1437: state = 1438; break; // &DoubleRightTe -> &DoubleRightTee - case 1455: state = 1456; break; // &DoubleV -> &DoubleVe - case 1496: state = 1497; break; // &DownBr -> &DownBre - case 1498: state = 1499; break; // &DownBrev -> &DownBreve - case 1517: state = 1518; break; // &downharpoonl -> &downharpoonle - case 1526: state = 1527; break; // &DownL -> &DownLe - case 1535: state = 1536; break; // &DownLeftRightV -> &DownLeftRightVe - case 1541: state = 1542; break; // &DownLeftT -> &DownLeftTe - case 1542: state = 1543; break; // &DownLeftTe -> &DownLeftTee - case 1544: state = 1545; break; // &DownLeftTeeV -> &DownLeftTeeVe - case 1550: state = 1551; break; // &DownLeftV -> &DownLeftVe - case 1564: state = 1565; break; // &DownRightT -> &DownRightTe - case 1565: state = 1566; break; // &DownRightTe -> &DownRightTee - case 1567: state = 1568; break; // &DownRightTeeV -> &DownRightTeeVe - case 1573: state = 1574; break; // &DownRightV -> &DownRightVe - case 1582: state = 1583; break; // &DownT -> &DownTe - case 1583: state = 1584; break; // &DownTe -> &DownTee - case 1642: state = 1643; break; // &dwangl -> &dwangle - case 1660: state = 1661; break; // &Eacut -> É - case 1662: state = 1706; break; // &e -> &ee - case 1666: state = 1667; break; // &eacut -> é - case 1669: state = 1670; break; // &east -> &easte - case 1718: state = 1719; break; // &Egrav -> È - case 1722: state = 1723; break; // &egrav -> è - case 1729: state = 1730; break; // &El -> &Ele - case 1731: state = 1732; break; // &Elem -> &Eleme - case 1737: state = 1738; break; // &elint -> &elinte - case 1757: state = 1758; break; // &emptys -> &emptyse - case 1772: state = 1773; break; // &EmptySmallSquar -> &EmptySmallSquare - case 1775: state = 1776; break; // &EmptyV -> &EmptyVe - case 1788: state = 1789; break; // &EmptyVerySmallSquar -> &EmptyVerySmallSquare - case 1852: state = 1853; break; // &eqslantl -> &eqslantle - case 1860: state = 1869; break; // &equ -> &eque - case 1867: state = 1868; break; // &EqualTild -> &EqualTilde - case 1936: state = 1937; break; // &exp -> &expe - case 1947: state = 1948; break; // &Expon -> &Expone - case 1956: state = 1957; break; // &expon -> &expone - case 1962: state = 1963; break; // &exponential -> &exponentiale - case 1964: state = 1982; break; // &f -> &fe - case 1974: state = 1975; break; // &fallingdots -> &fallingdotse - case 1985: state = 1986; break; // &femal -> &female - case 2007: state = 2008; break; // &Fill -> &Fille - case 2019: state = 2020; break; // &FilledSmallSquar -> &FilledSmallSquare - case 2021: state = 2022; break; // &FilledV -> &FilledVe - case 2034: state = 2035; break; // &FilledVerySmallSquar -> &FilledVerySmallSquare - case 2070: state = 2071; break; // &Fouri -> &Fourie - case 2118: state = 2166; break; // &g -> &ge - case 2122: state = 2123; break; // &gacut -> &gacute - case 2136: state = 2137; break; // &Gbr -> &Gbre - case 2138: state = 2139; break; // &Gbrev -> &Gbreve - case 2141: state = 2142; break; // &gbr -> &gbre - case 2143: state = 2144; break; // &gbrev -> &gbreve - case 2145: state = 2146; break; // &Gc -> &Gce - case 2184: state = 2185; break; // &gesl -> &gesle - case 2195: state = 2196; break; // &gim -> &gime - case 2208: state = 2216; break; // &gn -> &gne - case 2230: state = 2231; break; // &grav -> &grave - case 2232: state = 2233; break; // &Gr -> &Gre - case 2235: state = 2236; break; // &Great -> &Greate - case 2243: state = 2244; break; // &GreaterEqualL -> &GreaterEqualLe - case 2257: state = 2258; break; // &GreaterGr -> &GreaterGre - case 2260: state = 2261; break; // &GreaterGreat -> &GreaterGreate - case 2263: state = 2264; break; // &GreaterL -> &GreaterLe - case 2280: state = 2281; break; // &GreaterTild -> &GreaterTilde - case 2289: state = 2290; break; // &gsim -> &gsime - case 2307: state = 2308; break; // >qu -> >que - case 2311: state = 2323; break; // >r -> >re - case 2325: state = 2326; break; // >reql -> >reqle - case 2330: state = 2331; break; // >reqql -> >reqqle - case 2334: state = 2335; break; // >rl -> >rle - case 2341: state = 2342; break; // &gv -> &gve - case 2345: state = 2346; break; // &gvertn -> &gvertne - case 2353: state = 2354; break; // &Hac -> &Hace - case 2356: state = 2397; break; // &h -> &he - case 2419: state = 2420; break; // &Hilb -> &Hilbe - case 2426: state = 2427; break; // &HilbertSpac -> &HilbertSpace - case 2429: state = 2430; break; // &hks -> &hkse - case 2450: state = 2451; break; // &hookl -> &hookle - case 2488: state = 2489; break; // &HorizontalLin -> &HorizontalLine - case 2530: state = 2531; break; // &hyph -> &hyphe - case 2537: state = 2538; break; // &Iacut -> Í - case 2539: state = 2561; break; // &i -> &ie - case 2543: state = 2544; break; // &iacut -> í - case 2575: state = 2576; break; // &Igrav -> Ì - case 2580: state = 2581; break; // &igrav -> ì - case 2612: state = 2613; break; // &imag -> &image - case 2623: state = 2624; break; // &imaglin -> &imagline - case 2633: state = 2634; break; // &imp -> &impe - case 2638: state = 2639; break; // &Impli -> &Implie - case 2644: state = 2645; break; // &incar -> &incare - case 2650: state = 2651; break; // &infinti -> &infintie - case 2657: state = 2667; break; // &Int -> &Inte - case 2658: state = 2662; break; // &int -> &inte - case 2663: state = 2664; break; // &integ -> &intege - case 2677: state = 2678; break; // &Inters -> &Interse - case 2698: state = 2699; break; // &Invisibl -> &Invisible - case 2707: state = 2708; break; // &InvisibleTim -> &InvisibleTime - case 2736: state = 2737; break; // &iqu -> &ique - case 2759: state = 2760; break; // &Itild -> &Itilde - case 2763: state = 2764; break; // &itild -> &itilde - case 2803: state = 2809; break; // &Js -> &Jse - case 2806: state = 2813; break; // &js -> &jse - case 2836: state = 2837; break; // &Kc -> &Kce - case 2841: state = 2842; break; // &kc -> &kce - case 2853: state = 2854; break; // &kgr -> &kgre - case 2854: state = 2855; break; // &kgre -> &kgree - case 2881: state = 3032; break; // &l -> &le - case 2886: state = 3033; break; // &L -> &Le - case 2890: state = 2891; break; // &Lacut -> &Lacute - case 2892: state = 2897; break; // &la -> &lae - case 2895: state = 2896; break; // &lacut -> &lacute - case 2920: state = 2921; break; // &langl -> &langle - case 2926: state = 2927; break; // &Laplac -> &Laplace - case 2956: state = 2964; break; // &lat -> &late - case 2979: state = 2980; break; // &lbrac -> &lbrace - case 2982: state = 2983; break; // &lbrk -> &lbrke - case 2988: state = 2998; break; // &Lc -> &Lce - case 2993: state = 3002; break; // &lc -> &lce - case 3039: state = 3040; break; // &LeftAngl -> &LeftAngle - case 3045: state = 3046; break; // &LeftAngleBrack -> &LeftAngleBracke - case 3081: state = 3082; break; // &LeftC -> &LeftCe - case 3092: state = 3093; break; // &LeftDoubl -> &LeftDouble - case 3098: state = 3099; break; // &LeftDoubleBrack -> &LeftDoubleBracke - case 3103: state = 3104; break; // &LeftDownT -> &LeftDownTe - case 3104: state = 3105; break; // &LeftDownTe -> &LeftDownTee - case 3106: state = 3107; break; // &LeftDownTeeV -> &LeftDownTeeVe - case 3112: state = 3113; break; // &LeftDownV -> &LeftDownVe - case 3139: state = 3140; break; // &leftl -> &leftle - case 3198: state = 3199; break; // &LeftRightV -> &LeftRightVe - case 3204: state = 3205; break; // &LeftT -> &LeftTe - case 3205: state = 3206; break; // &LeftTe -> &LeftTee - case 3212: state = 3213; break; // &LeftTeeV -> &LeftTeeVe - case 3220: state = 3221; break; // &leftthr -> &leftthre - case 3221: state = 3222; break; // &leftthre -> &leftthree - case 3225: state = 3226; break; // &leftthreetim -> &leftthreetime - case 3233: state = 3234; break; // &LeftTriangl -> &LeftTriangle - case 3249: state = 3250; break; // &LeftUpDownV -> &LeftUpDownVe - case 3255: state = 3256; break; // &LeftUpT -> &LeftUpTe - case 3256: state = 3257; break; // &LeftUpTe -> &LeftUpTee - case 3258: state = 3259; break; // &LeftUpTeeV -> &LeftUpTeeVe - case 3264: state = 3265; break; // &LeftUpV -> &LeftUpVe - case 3273: state = 3274; break; // &LeftV -> &LeftVe - case 3299: state = 3300; break; // &lesg -> &lesge - case 3302: state = 3312; break; // &less -> &lesse - case 3329: state = 3330; break; // &LessEqualGr -> &LessEqualGre - case 3332: state = 3333; break; // &LessEqualGreat -> &LessEqualGreate - case 3345: state = 3346; break; // &LessGr -> &LessGre - case 3348: state = 3349; break; // &LessGreat -> &LessGreate - case 3354: state = 3355; break; // &LessL -> &LessLe - case 3374: state = 3375; break; // &LessTild -> &LessTilde - case 3408: state = 3419; break; // &Ll -> &Lle - case 3416: state = 3417; break; // &llcorn -> &llcorne - case 3450: state = 3451; break; // &lmoustach -> &lmoustache - case 3452: state = 3460; break; // &ln -> &lne - case 3478: state = 3479; break; // &LongL -> &LongLe - case 3487: state = 3488; break; // &Longl -> &Longle - case 3498: state = 3499; break; // &longl -> &longle - case 3580: state = 3581; break; // &looparrowl -> &looparrowle - case 3600: state = 3601; break; // &lotim -> &lotime - case 3610: state = 3611; break; // &Low -> &Lowe - case 3613: state = 3614; break; // &LowerL -> &LowerLe - case 3632: state = 3633; break; // &loz -> &loze - case 3635: state = 3636; break; // &lozeng -> &lozenge - case 3650: state = 3651; break; // &lrcorn -> &lrcorne - case 3674: state = 3675; break; // &lsim -> &lsime - case 3701: state = 3702; break; // <hr -> <hre - case 3702: state = 3703; break; // <hre -> <hree - case 3705: state = 3706; break; // <im -> <ime - case 3713: state = 3714; break; // <qu -> <que - case 3718: state = 3719; break; // <ri -> <rie - case 3735: state = 3736; break; // &lv -> &lve - case 3739: state = 3740; break; // &lvertn -> &lvertne - case 3745: state = 3792; break; // &m -> &me - case 3749: state = 3750; break; // &mal -> &male - case 3751: state = 3752; break; // &malt -> &malte - case 3753: state = 3754; break; // &maltes -> &maltese - case 3755: state = 3804; break; // &M -> &Me - case 3766: state = 3767; break; // &mapstol -> &mapstole - case 3773: state = 3774; break; // &mark -> &marke - case 3796: state = 3797; break; // &measur -> &measure - case 3802: state = 3803; break; // &measuredangl -> &measuredangle - case 3812: state = 3813; break; // &MediumSpac -> &MediumSpace - case 3866: state = 3867; break; // &mod -> &mode - case 3897: state = 3970; break; // &n -> &ne - case 3902: state = 3984; break; // &N -> &Ne - case 3906: state = 3907; break; // &Nacut -> &Nacute - case 3910: state = 3911; break; // &nacut -> &nacute - case 3935: state = 3936; break; // &nbump -> &nbumpe - case 3937: state = 3952; break; // &nc -> &nce - case 3940: state = 3948; break; // &Nc -> &Nce - case 3989: state = 3990; break; // &Negativ -> &Negative - case 3991: state = 3992; break; // &NegativeM -> &NegativeMe - case 4000: state = 4001; break; // &NegativeMediumSpac -> &NegativeMediumSpace - case 4010: state = 4011; break; // &NegativeThickSpac -> &NegativeThickSpace - case 4016: state = 4017; break; // &NegativeThinSpac -> &NegativeThinSpace - case 4018: state = 4019; break; // &NegativeV -> &NegativeVe - case 4029: state = 4030; break; // &NegativeVeryThinSpac -> &NegativeVeryThinSpace - case 4035: state = 4036; break; // &nes -> &nese - case 4042: state = 4043; break; // &Nest -> &Neste - case 4046: state = 4047; break; // &NestedGr -> &NestedGre - case 4049: state = 4050; break; // &NestedGreat -> &NestedGreate - case 4053: state = 4054; break; // &NestedGreaterGr -> &NestedGreaterGre - case 4056: state = 4057; break; // &NestedGreaterGreat -> &NestedGreaterGreate - case 4059: state = 4060; break; // &NestedL -> &NestedLe - case 4063: state = 4064; break; // &NestedLessL -> &NestedLessLe - case 4070: state = 4071; break; // &NewLin -> &NewLine - case 4081: state = 4083; break; // &ng -> &nge - case 4121: state = 4131; break; // &nl -> &nle - case 4132: state = 4133; break; // &nL -> &nLe - case 4184: state = 4185; break; // &nltri -> &nltrie - case 4192: state = 4193; break; // &NoBr -> &NoBre - case 4198: state = 4199; break; // &NonBr -> &NonBre - case 4208: state = 4209; break; // &NonBreakingSpac -> &NonBreakingSpace - case 4222: state = 4223; break; // &NotCongru -> &NotCongrue - case 4235: state = 4236; break; // &NotDoubl -> &NotDouble - case 4237: state = 4238; break; // &NotDoubleV -> &NotDoubleVe - case 4249: state = 4250; break; // &NotEl -> &NotEle - case 4251: state = 4252; break; // &NotElem -> &NotEleme - case 4262: state = 4263; break; // &NotEqualTild -> &NotEqualTilde - case 4270: state = 4271; break; // &NotGr -> &NotGre - case 4273: state = 4274; break; // &NotGreat -> &NotGreate - case 4291: state = 4292; break; // &NotGreaterGr -> &NotGreaterGre - case 4294: state = 4295; break; // &NotGreaterGreat -> &NotGreaterGreate - case 4297: state = 4298; break; // &NotGreaterL -> &NotGreaterLe - case 4314: state = 4315; break; // &NotGreaterTild -> &NotGreaterTilde - case 4343: state = 4344; break; // &NotL -> &NotLe - case 4353: state = 4354; break; // &NotLeftTriangl -> &NotLeftTriangle - case 4371: state = 4372; break; // &NotLessGr -> &NotLessGre - case 4374: state = 4375; break; // &NotLessGreat -> &NotLessGreate - case 4377: state = 4378; break; // &NotLessL -> &NotLessLe - case 4394: state = 4395; break; // &NotLessTild -> &NotLessTilde - case 4396: state = 4397; break; // &NotN -> &NotNe - case 4399: state = 4400; break; // &NotNest -> &NotNeste - case 4403: state = 4404; break; // &NotNestedGr -> &NotNestedGre - case 4406: state = 4407; break; // &NotNestedGreat -> &NotNestedGreate - case 4410: state = 4411; break; // &NotNestedGreaterGr -> &NotNestedGreaterGre - case 4413: state = 4414; break; // &NotNestedGreaterGreat -> &NotNestedGreaterGreate - case 4416: state = 4417; break; // &NotNestedL -> &NotNestedLe - case 4420: state = 4421; break; // &NotNestedLessL -> &NotNestedLessLe - case 4431: state = 4432; break; // &NotPr -> &NotPre - case 4433: state = 4434; break; // &NotPrec -> &NotPrece - case 4435: state = 4436; break; // &NotPreced -> &NotPrecede - case 4453: state = 4454; break; // &NotR -> &NotRe - case 4455: state = 4456; break; // &NotRev -> &NotReve - case 4458: state = 4459; break; // &NotRevers -> &NotReverse - case 4461: state = 4462; break; // &NotReverseEl -> &NotReverseEle - case 4463: state = 4464; break; // &NotReverseElem -> &NotReverseEleme - case 4477: state = 4478; break; // &NotRightTriangl -> &NotRightTriangle - case 4491: state = 4492; break; // &NotSquar -> &NotSquare - case 4496: state = 4497; break; // &NotSquareSubs -> &NotSquareSubse - case 4504: state = 4505; break; // &NotSquareSup -> &NotSquareSupe - case 4507: state = 4508; break; // &NotSquareSupers -> &NotSquareSuperse - case 4517: state = 4518; break; // &NotSubs -> &NotSubse - case 4526: state = 4527; break; // &NotSucc -> &NotSucce - case 4527: state = 4528; break; // &NotSucce -> &NotSuccee - case 4549: state = 4550; break; // &NotSucceedsTild -> &NotSucceedsTilde - case 4551: state = 4552; break; // &NotSup -> &NotSupe - case 4554: state = 4555; break; // &NotSupers -> &NotSuperse - case 4565: state = 4566; break; // &NotTild -> &NotTilde - case 4584: state = 4585; break; // &NotTildeTild -> &NotTildeTilde - case 4586: state = 4587; break; // &NotV -> &NotVe - case 4602: state = 4603; break; // &nparall -> &nparalle - case 4613: state = 4617; break; // &npr -> &npre - case 4615: state = 4616; break; // &nprcu -> &nprcue - case 4618: state = 4619; break; // &nprec -> &nprece - case 4651: state = 4652; break; // &nrtri -> &nrtrie - case 4654: state = 4658; break; // &nsc -> &nsce - case 4656: state = 4657; break; // &nsccu -> &nsccue - case 4675: state = 4676; break; // &nshortparall -> &nshortparalle - case 4679: state = 4680; break; // &nsim -> &nsime - case 4691: state = 4692; break; // &nsqsub -> &nsqsube - case 4693: state = 4694; break; // &nsqsup -> &nsqsupe - case 4696: state = 4698; break; // &nsub -> &nsube - case 4699: state = 4700; break; // &nsubs -> &nsubse - case 4701: state = 4702; break; // &nsubset -> &nsubsete - case 4706: state = 4707; break; // &nsucc -> &nsucce - case 4709: state = 4711; break; // &nsup -> &nsupe - case 4712: state = 4713; break; // &nsups -> &nsupse - case 4714: state = 4715; break; // &nsupset -> &nsupsete - case 4724: state = 4725; break; // &Ntild -> Ñ - case 4728: state = 4729; break; // &ntild -> ñ - case 4737: state = 4738; break; // &ntriangl -> &ntriangle - case 4739: state = 4740; break; // &ntrianglel -> &ntrianglele - case 4742: state = 4743; break; // &ntriangleleft -> &ntrianglelefte - case 4749: state = 4750; break; // &ntriangleright -> &ntrianglerighte - case 4754: state = 4755; break; // &num -> &nume - case 4780: state = 4781; break; // &nvg -> &nvge - case 4792: state = 4796; break; // &nvl -> &nvle - case 4799: state = 4800; break; // &nvltri -> &nvltrie - case 4807: state = 4808; break; // &nvrtri -> &nvrtrie - case 4823: state = 4824; break; // &nwn -> &nwne - case 4831: state = 4832; break; // &Oacut -> Ó - case 4833: state = 4876; break; // &o -> &oe - case 4837: state = 4838; break; // &oacut -> ó - case 4893: state = 4894; break; // &Ograv -> Ò - case 4897: state = 4898; break; // &ograv -> ò - case 4920: state = 4921; break; // &olin -> &oline - case 4923: state = 4931; break; // &Om -> &Ome - case 4927: state = 4934; break; // &om -> &ome - case 4957: state = 4984; break; // &op -> &ope - case 4960: state = 4961; break; // &Op -> &Ope - case 4972: state = 4973; break; // &OpenCurlyDoubl -> &OpenCurlyDouble - case 4977: state = 4978; break; // &OpenCurlyDoubleQuot -> &OpenCurlyDoubleQuote - case 4982: state = 4983; break; // &OpenCurlyQuot -> &OpenCurlyQuote - case 4995: state = 4996; break; // &ord -> &orde - case 5011: state = 5012; break; // &orslop -> &orslope - case 5034: state = 5035; break; // &Otild -> Õ - case 5039: state = 5040; break; // &otild -> õ - case 5041: state = 5042; break; // &Otim -> &Otime - case 5044: state = 5045; break; // &otim -> &otime - case 5059: state = 5060; break; // &Ov -> &Ove - case 5067: state = 5068; break; // &OverBrac -> &OverBrace - case 5069: state = 5070; break; // &OverBrack -> &OverBracke - case 5074: state = 5075; break; // &OverPar -> &OverPare - case 5078: state = 5079; break; // &OverParenth -> &OverParenthe - case 5083: state = 5108; break; // &p -> &pe - case 5088: state = 5089; break; // ¶ll -> ¶lle - case 5120: state = 5121; break; // &pert -> &perte - case 5138: state = 5139; break; // &phon -> &phone - case 5159: state = 5171; break; // &plus -> &pluse - case 5194: state = 5195; break; // &Poincar -> &Poincare - case 5199: state = 5200; break; // &Poincareplan -> &Poincareplane - case 5215: state = 5238; break; // &Pr -> &Pre - case 5216: state = 5223; break; // &pr -> &pre - case 5220: state = 5221; break; // &prcu -> &prcue - case 5224: state = 5264; break; // &prec -> &prece - case 5235: state = 5236; break; // &preccurly -> &preccurlye - case 5239: state = 5240; break; // &Prec -> &Prece - case 5241: state = 5242; break; // &Preced -> &Precede - case 5262: state = 5263; break; // &PrecedesTild -> &PrecedesTilde - case 5266: state = 5273; break; // &precn -> &precne - case 5283: state = 5284; break; // &Prim -> &Prime - case 5286: state = 5287; break; // &prim -> &prime - case 5310: state = 5311; break; // &proflin -> &profline - case 5332: state = 5333; break; // &prur -> &prure - case 5366: state = 5367; break; // &qprim -> &qprime - case 5374: state = 5387; break; // &qu -> &que - case 5376: state = 5377; break; // &quat -> &quate - case 5389: state = 5390; break; // &quest -> &queste - case 5397: state = 5541; break; // &r -> &re - case 5402: state = 5417; break; // &ra -> &rae - case 5403: state = 5404; break; // &rac -> &race - case 5405: state = 5540; break; // &R -> &Re - case 5409: state = 5410; break; // &Racut -> &Racute - case 5412: state = 5413; break; // &racut -> &racute - case 5426: state = 5428; break; // &rang -> &range - case 5429: state = 5430; break; // &rangl -> &rangle - case 5493: state = 5494; break; // &rbrac -> &rbrace - case 5496: state = 5497; break; // &rbrk -> &rbrke - case 5502: state = 5512; break; // &Rc -> &Rce - case 5507: state = 5516; break; // &rc -> &rce - case 5545: state = 5546; break; // &realin -> &realine - case 5557: state = 5558; break; // &Rev -> &Reve - case 5560: state = 5561; break; // &Revers -> &Reverse - case 5563: state = 5564; break; // &ReverseEl -> &ReverseEle - case 5565: state = 5566; break; // &ReverseElem -> &ReverseEleme - case 5624: state = 5625; break; // &RightAngl -> &RightAngle - case 5630: state = 5631; break; // &RightAngleBrack -> &RightAngleBracke - case 5654: state = 5655; break; // &RightArrowL -> &RightArrowLe - case 5667: state = 5668; break; // &RightC -> &RightCe - case 5678: state = 5679; break; // &RightDoubl -> &RightDouble - case 5684: state = 5685; break; // &RightDoubleBrack -> &RightDoubleBracke - case 5689: state = 5690; break; // &RightDownT -> &RightDownTe - case 5690: state = 5691; break; // &RightDownTe -> &RightDownTee - case 5692: state = 5693; break; // &RightDownTeeV -> &RightDownTeeVe - case 5698: state = 5699; break; // &RightDownV -> &RightDownVe - case 5725: state = 5726; break; // &rightl -> &rightle - case 5764: state = 5765; break; // &RightT -> &RightTe - case 5765: state = 5766; break; // &RightTe -> &RightTee - case 5772: state = 5773; break; // &RightTeeV -> &RightTeeVe - case 5780: state = 5781; break; // &rightthr -> &rightthre - case 5781: state = 5782; break; // &rightthre -> &rightthree - case 5785: state = 5786; break; // &rightthreetim -> &rightthreetime - case 5793: state = 5794; break; // &RightTriangl -> &RightTriangle - case 5809: state = 5810; break; // &RightUpDownV -> &RightUpDownVe - case 5815: state = 5816; break; // &RightUpT -> &RightUpTe - case 5816: state = 5817; break; // &RightUpTe -> &RightUpTee - case 5818: state = 5819; break; // &RightUpTeeV -> &RightUpTeeVe - case 5824: state = 5825; break; // &RightUpV -> &RightUpVe - case 5833: state = 5834; break; // &RightV -> &RightVe - case 5851: state = 5852; break; // &risingdots -> &risingdotse - case 5869: state = 5870; break; // &rmoustach -> &rmoustache - case 5896: state = 5897; break; // &rotim -> &rotime - case 5906: state = 5907; break; // &RoundImpli -> &RoundImplie - case 5953: state = 5954; break; // &rthr -> &rthre - case 5954: state = 5955; break; // &rthre -> &rthree - case 5957: state = 5958; break; // &rtim -> &rtime - case 5961: state = 5962; break; // &rtri -> &rtrie - case 5969: state = 5970; break; // &Rul -> &Rule - case 5971: state = 5972; break; // &RuleD -> &RuleDe - case 5975: state = 5976; break; // &RuleDelay -> &RuleDelaye - case 5989: state = 5990; break; // &Sacut -> &Sacute - case 5991: state = 6053; break; // &s -> &se - case 5995: state = 5996; break; // &sacut -> &sacute - case 6001: state = 6017; break; // &Sc -> &Sce - case 6002: state = 6016; break; // &sc -> &sce - case 6013: state = 6014; break; // &sccu -> &sccue - case 6050: state = 6052; break; // &sdot -> &sdote - case 6117: state = 6118; break; // &ShortL -> &ShortLe - case 6137: state = 6138; break; // &shortparall -> &shortparalle - case 6168: state = 6172; break; // &sim -> &sime - case 6178: state = 6179; break; // &simn -> &simne - case 6200: state = 6201; break; // &SmallCircl -> &SmallCircle - case 6202: state = 6217; break; // &sm -> &sme - case 6206: state = 6207; break; // &smalls -> &smallse - case 6225: state = 6226; break; // &smil -> &smile - case 6227: state = 6228; break; // &smt -> &smte - case 6251: state = 6252; break; // &spad -> &spade - case 6271: state = 6272; break; // &sqsub -> &sqsube - case 6273: state = 6274; break; // &sqsubs -> &sqsubse - case 6275: state = 6276; break; // &sqsubset -> &sqsubsete - case 6278: state = 6279; break; // &sqsup -> &sqsupe - case 6280: state = 6281; break; // &sqsups -> &sqsupse - case 6282: state = 6283; break; // &sqsupset -> &sqsupsete - case 6288: state = 6289; break; // &Squar -> &Square - case 6291: state = 6292; break; // &squar -> &square - case 6295: state = 6296; break; // &SquareInt -> &SquareInte - case 6298: state = 6299; break; // &SquareInters -> &SquareInterse - case 6308: state = 6309; break; // &SquareSubs -> &SquareSubse - case 6316: state = 6317; break; // &SquareSup -> &SquareSupe - case 6319: state = 6320; break; // &SquareSupers -> &SquareSuperse - case 6341: state = 6344; break; // &ss -> &sse - case 6350: state = 6351; break; // &ssmil -> &ssmile - case 6368: state = 6369; break; // &straight -> &straighte - case 6384: state = 6389; break; // &sub -> &sube - case 6397: state = 6399; break; // &subn -> &subne - case 6408: state = 6409; break; // &Subs -> &Subse - case 6411: state = 6412; break; // &subs -> &subse - case 6413: state = 6414; break; // &subset -> &subsete - case 6422: state = 6423; break; // &subsetn -> &subsetne - case 6432: state = 6472; break; // &succ -> &succe - case 6443: state = 6444; break; // &succcurly -> &succcurlye - case 6447: state = 6448; break; // &Succ -> &Succe - case 6448: state = 6449; break; // &Succe -> &Succee - case 6470: state = 6471; break; // &SucceedsTild -> &SucceedsTilde - case 6474: state = 6481; break; // &succn -> &succne - case 6499: state = 6515; break; // &Sup -> &Supe - case 6500: state = 6511; break; // &sup -> &supe - case 6517: state = 6518; break; // &Supers -> &Superse - case 6539: state = 6541; break; // &supn -> &supne - case 6546: state = 6547; break; // &Sups -> &Supse - case 6549: state = 6550; break; // &sups -> &supse - case 6551: state = 6552; break; // &supset -> &supsete - case 6555: state = 6556; break; // &supsetn -> &supsetne - case 6586: state = 6620; break; // &t -> &te - case 6589: state = 6590; break; // &targ -> &targe - case 6597: state = 6607; break; // &Tc -> &Tce - case 6602: state = 6611; break; // &tc -> &tce - case 6622: state = 6623; break; // &telr -> &telre - case 6629: state = 6630; break; // &th -> &the - case 6631: state = 6632; break; // &ther -> &there - case 6634: state = 6635; break; // &Th -> &The - case 6636: state = 6637; break; // &Ther -> &There - case 6640: state = 6641; break; // &Therefor -> &Therefore - case 6644: state = 6645; break; // &therefor -> &therefore - case 6672: state = 6673; break; // &ThickSpac -> &ThickSpace - case 6681: state = 6682; break; // &ThinSpac -> &ThinSpace - case 6698: state = 6699; break; // &Tild -> &Tilde - case 6702: state = 6703; break; // &tild -> &tilde - case 6721: state = 6722; break; // &TildeTild -> &TildeTilde - case 6723: state = 6724; break; // &tim -> &time - case 6732: state = 6733; break; // &to -> &toe - case 6754: state = 6755; break; // &tprim -> &tprime - case 6762: state = 6763; break; // &trad -> &trade - case 6764: state = 6791; break; // &tri -> &trie - case 6768: state = 6769; break; // &triangl -> &triangle - case 6774: state = 6775; break; // &trianglel -> &trianglele - case 6777: state = 6778; break; // &triangleleft -> &trianglelefte - case 6785: state = 6786; break; // &triangleright -> &trianglerighte - case 6800: state = 6801; break; // &Tripl -> &Triple - case 6813: state = 6814; break; // &tritim -> &tritime - case 6815: state = 6816; break; // &trp -> &trpe - case 6850: state = 6851; break; // &twoh -> &twohe - case 6854: state = 6855; break; // &twoheadl -> &twoheadle - case 6877: state = 6878; break; // &Uacut -> Ú - case 6883: state = 6884; break; // &uacut -> ú - case 6897: state = 6904; break; // &Ubr -> &Ubre - case 6901: state = 6907; break; // &ubr -> &ubre - case 6905: state = 6906; break; // &Ubrev -> &Ubreve - case 6908: state = 6909; break; // &ubrev -> &ubreve - case 6947: state = 6948; break; // &Ugrav -> Ù - case 6952: state = 6953; break; // &ugrav -> ù - case 6969: state = 6970; break; // &ulcorn -> &ulcorne - case 6988: state = 6989; break; // &Und -> &Unde - case 6996: state = 6997; break; // &UnderBrac -> &UnderBrace - case 6998: state = 6999; break; // &UnderBrack -> &UnderBracke - case 7003: state = 7004; break; // &UnderPar -> &UnderPare - case 7007: state = 7008; break; // &UnderParenth -> &UnderParenthe - case 7105: state = 7106; break; // &upharpoonl -> &upharpoonle - case 7117: state = 7118; break; // &Upp -> &Uppe - case 7120: state = 7121; break; // &UpperL -> &UpperLe - case 7150: state = 7151; break; // &UpT -> &UpTe - case 7151: state = 7152; break; // &UpTe -> &UpTee - case 7170: state = 7171; break; // &urcorn -> &urcorne - case 7199: state = 7200; break; // &Utild -> &Utilde - case 7203: state = 7204; break; // &utild -> &utilde - case 7221: state = 7222; break; // &uwangl -> &uwangle - case 7223: state = 7338; break; // &v -> &ve - case 7229: state = 7230; break; // &var -> &vare - case 7271: state = 7272; break; // &varsubs -> &varsubse - case 7274: state = 7275; break; // &varsubsetn -> &varsubsetne - case 7279: state = 7280; break; // &varsups -> &varsupse - case 7282: state = 7283; break; // &varsupsetn -> &varsupsetne - case 7287: state = 7288; break; // &varth -> &varthe - case 7296: state = 7297; break; // &vartriangl -> &vartriangle - case 7298: state = 7299; break; // &vartrianglel -> &vartrianglele - case 7307: state = 7336; break; // &V -> &Ve - case 7336: state = 7337; break; // &Ve -> &Vee - case 7338: state = 7339; break; // &ve -> &vee - case 7339: state = 7343; break; // &vee -> &veee - case 7368: state = 7369; break; // &VerticalLin -> &VerticalLine - case 7370: state = 7371; break; // &VerticalS -> &VerticalSe - case 7382: state = 7383; break; // &VerticalTild -> &VerticalTilde - case 7392: state = 7393; break; // &VeryThinSpac -> &VeryThinSpace - case 7429: state = 7431; break; // &vsubn -> &vsubne - case 7433: state = 7435; break; // &vsupn -> &vsupne - case 7447: state = 7462; break; // &W -> &We - case 7452: state = 7457; break; // &w -> &we - case 7464: state = 7465; break; // &Wedg -> &Wedge - case 7466: state = 7467; break; // &wedg -> &wedge - case 7469: state = 7470; break; // &wei -> &weie - case 7484: state = 7485; break; // &wr -> &wre - case 7549: state = 7550; break; // &xotim -> &xotime - case 7576: state = 7577; break; // &xv -> &xve - case 7577: state = 7578; break; // &xve -> &xvee - case 7579: state = 7580; break; // &xw -> &xwe - case 7582: state = 7583; break; // &xwedg -> &xwedge - case 7588: state = 7589; break; // &Yacut -> Ý - case 7590: state = 7610; break; // &y -> &ye - case 7594: state = 7595; break; // &yacut -> ý - case 7645: state = 7680; break; // &Z -> &Ze - case 7649: state = 7650; break; // &Zacut -> &Zacute - case 7651: state = 7675; break; // &z -> &ze - case 7655: state = 7656; break; // &zacut -> &zacute - case 7675: state = 7676; break; // &ze -> &zee - case 7691: state = 7692; break; // &ZeroWidthSpac -> &ZeroWidthSpace + case 8: state = 55; break; // &a -> &ae + case 12: state = 13; break; // &aacut -> á + case 16: state = 17; break; // &Abr -> &Abre + case 18: state = 19; break; // &Abrev -> &Abreve + case 22: state = 23; break; // &abr -> &abre + case 24: state = 25; break; // &abrev -> &abreve + case 43: state = 44; break; // &acut -> ´ + case 70: state = 71; break; // &Agrav -> À + case 76: state = 77; break; // &agrav -> à + case 79: state = 80; break; // &al -> &ale + case 131: state = 132; break; // &andslop -> &andslope + case 136: state = 138; break; // &ang -> &ange + case 140: state = 141; break; // &angl -> &angle + case 147: state = 156; break; // &angmsda -> &angmsdae + case 199: state = 208; break; // &ap -> &ape + case 232: state = 234; break; // &approx -> &approxe + case 264: state = 266; break; // &asymp -> &asympe + case 272: state = 273; break; // &Atild -> à + case 278: state = 279; break; // &atild -> ã + case 301: state = 384; break; // &b -> &be + case 304: state = 310; break; // &back -> &backe + case 321: state = 322; break; // &backprim -> &backprime + case 326: state = 328; break; // &backsim -> &backsime + case 331: state = 390; break; // &B -> &Be + case 345: state = 346; break; // &barv -> &barve + case 346: state = 347; break; // &barve -> &barvee + case 349: state = 350; break; // &Barw -> &Barwe + case 353: state = 354; break; // &barw -> &barwe + case 357: state = 358; break; // &barwedg -> &barwedge + case 388: state = 397; break; // &becaus -> &because + case 394: state = 395; break; // &Becaus -> &Because + case 431: state = 432; break; // &betw -> &betwe + case 432: state = 433; break; // &betwe -> &betwee + case 467: state = 468; break; // &bigotim -> &bigotime + case 487: state = 488; break; // &bigtriangl -> &bigtriangle + case 503: state = 504; break; // &bigv -> &bigve + case 504: state = 505; break; // &bigve -> &bigvee + case 507: state = 508; break; // &bigw -> &bigwe + case 510: state = 511; break; // &bigwedg -> &bigwedge + case 525: state = 526; break; // &blackloz -> &blackloze + case 528: state = 529; break; // &blacklozeng -> &blacklozenge + case 535: state = 536; break; // &blacksquar -> &blacksquare + case 544: state = 545; break; // &blacktriangl -> &blacktriangle + case 552: state = 553; break; // &blacktrianglel -> &blacktrianglele + case 579: state = 580; break; // &bn -> &bne + case 610: state = 611; break; // &bowti -> &bowtie + case 669: state = 670; break; // &boxtim -> &boxtime + case 722: state = 723; break; // &bprim -> &bprime + case 725: state = 726; break; // &Br -> &Bre + case 727: state = 728; break; // &Brev -> &Breve + case 730: state = 731; break; // &br -> &bre + case 732: state = 733; break; // &brev -> &breve + case 744: state = 748; break; // &bs -> &bse + case 753: state = 755; break; // &bsim -> &bsime + case 769: state = 771; break; // &bull -> &bulle + case 775: state = 779; break; // &bump -> &bumpe + case 783: state = 784; break; // &Bump -> &Bumpe + case 789: state = 920; break; // &C -> &Ce + case 793: state = 794; break; // &Cacut -> &Cacute + case 796: state = 915; break; // &c -> &ce + case 800: state = 801; break; // &cacut -> &cacute + case 835: state = 836; break; // &CapitalDiff -> &CapitalDiffe + case 837: state = 838; break; // &CapitalDiffer -> &CapitalDiffere + case 848: state = 849; break; // &car -> &care + case 856: state = 857; break; // &Cayl -> &Cayle + case 861: state = 881; break; // &cc -> &cce + case 866: state = 876; break; // &Cc -> &Cce + case 934: state = 944; break; // ¢ -> ¢e + case 937: state = 938; break; // &Cent -> &Cente + case 960: state = 964; break; // &ch -> &che + case 979: state = 1051; break; // &cir -> &cire + case 981: state = 983; break; // &circ -> &circe + case 986: state = 987; break; // &circl -> &circle + case 993: state = 994; break; // &circlearrowl -> &circlearrowle + case 1022: state = 1023; break; // &Circl -> &Circle + case 1045: state = 1046; break; // &CircleTim -> &CircleTime + case 1074: state = 1075; break; // &Clockwis -> &Clockwise + case 1085: state = 1086; break; // &ClockwiseContourInt -> &ClockwiseContourInte + case 1092: state = 1093; break; // &Clos -> &Close + case 1103: state = 1104; break; // &CloseCurlyDoubl -> &CloseCurlyDouble + case 1108: state = 1109; break; // &CloseCurlyDoubleQuot -> &CloseCurlyDoubleQuote + case 1114: state = 1115; break; // &CloseCurlyQuot -> &CloseCurlyQuote + case 1129: state = 1136; break; // &Colon -> &Colone + case 1134: state = 1138; break; // &colon -> &colone + case 1153: state = 1154; break; // &compl -> &comple + case 1155: state = 1156; break; // &complem -> &compleme + case 1160: state = 1161; break; // &complex -> &complexe + case 1174: state = 1175; break; // &Congru -> &Congrue + case 1193: state = 1194; break; // &ContourInt -> &ContourInte + case 1228: state = 1229; break; // &Count -> &Counte + case 1238: state = 1239; break; // &CounterClockwis -> &CounterClockwise + case 1249: state = 1250; break; // &CounterClockwiseContourInt -> &CounterClockwiseContourInte + case 1279: state = 1281; break; // &csub -> &csube + case 1283: state = 1285; break; // &csup -> &csupe + case 1292: state = 1301; break; // &cu -> &cue + case 1354: state = 1355; break; // &curly -> &curlye + case 1358: state = 1359; break; // &curlyeqpr -> &curlyeqpre + case 1367: state = 1368; break; // &curlyv -> &curlyve + case 1368: state = 1369; break; // &curlyve -> &curlyvee + case 1371: state = 1372; break; // &curlyw -> &curlywe + case 1374: state = 1375; break; // &curlywedg -> &curlywedge + case 1377: state = 1378; break; // &curr -> &curre + case 1381: state = 1382; break; // &curv -> &curve + case 1388: state = 1389; break; // &curvearrowl -> &curvearrowle + case 1399: state = 1400; break; // &cuv -> &cuve + case 1400: state = 1401; break; // &cuve -> &cuvee + case 1403: state = 1404; break; // &cuw -> &cuwe + case 1425: state = 1519; break; // &D -> &De + case 1428: state = 1429; break; // &Dagg -> &Dagge + case 1432: state = 1516; break; // &d -> &de + case 1435: state = 1436; break; // &dagg -> &dagge + case 1439: state = 1440; break; // &dal -> &dale + case 1496: state = 1497; break; // &ddagg -> &ddagge + case 1512: state = 1513; break; // &ddots -> &ddotse + case 1570: state = 1571; break; // &DiacriticalAcut -> &DiacriticalAcute + case 1579: state = 1580; break; // &DiacriticalDoubl -> &DiacriticalDouble + case 1584: state = 1585; break; // &DiacriticalDoubleAcut -> &DiacriticalDoubleAcute + case 1590: state = 1591; break; // &DiacriticalGrav -> &DiacriticalGrave + case 1596: state = 1597; break; // &DiacriticalTild -> &DiacriticalTilde + case 1599: state = 1619; break; // &di -> &die + case 1622: state = 1623; break; // &Diff -> &Diffe + case 1624: state = 1625; break; // &Differ -> &Differe + case 1646: state = 1647; break; // &divid -> ÷ + case 1653: state = 1654; break; // ÷ontim -> ÷ontime + case 1694: state = 1700; break; // &dot -> &dote + case 1728: state = 1729; break; // &dotsquar -> &dotsquare + case 1733: state = 1734; break; // &doubl -> &double + case 1738: state = 1739; break; // &doublebarw -> &doublebarwe + case 1741: state = 1742; break; // &doublebarwedg -> &doublebarwedge + case 1746: state = 1747; break; // &Doubl -> &Double + case 1757: state = 1758; break; // &DoubleContourInt -> &DoubleContourInte + case 1776: state = 1777; break; // &DoubleL -> &DoubleLe + case 1797: state = 1798; break; // &DoubleLeftT -> &DoubleLeftTe + case 1798: state = 1799; break; // &DoubleLeftTe -> &DoubleLeftTee + case 1804: state = 1805; break; // &DoubleLongL -> &DoubleLongLe + case 1847: state = 1848; break; // &DoubleRightT -> &DoubleRightTe + case 1848: state = 1849; break; // &DoubleRightTe -> &DoubleRightTee + case 1869: state = 1870; break; // &DoubleV -> &DoubleVe + case 1916: state = 1917; break; // &DownBr -> &DownBre + case 1918: state = 1919; break; // &DownBrev -> &DownBreve + case 1939: state = 1940; break; // &downharpoonl -> &downharpoonle + case 1950: state = 1951; break; // &DownL -> &DownLe + case 1959: state = 1960; break; // &DownLeftRightV -> &DownLeftRightVe + case 1966: state = 1967; break; // &DownLeftT -> &DownLeftTe + case 1967: state = 1968; break; // &DownLeftTe -> &DownLeftTee + case 1969: state = 1970; break; // &DownLeftTeeV -> &DownLeftTeeVe + case 1976: state = 1977; break; // &DownLeftV -> &DownLeftVe + case 1992: state = 1993; break; // &DownRightT -> &DownRightTe + case 1993: state = 1994; break; // &DownRightTe -> &DownRightTee + case 1995: state = 1996; break; // &DownRightTeeV -> &DownRightTeeVe + case 2002: state = 2003; break; // &DownRightV -> &DownRightVe + case 2013: state = 2014; break; // &DownT -> &DownTe + case 2014: state = 2015; break; // &DownTe -> &DownTee + case 2090: state = 2091; break; // &dwangl -> &dwangle + case 2112: state = 2113; break; // &Eacut -> É + case 2115: state = 2173; break; // &e -> &ee + case 2119: state = 2120; break; // &eacut -> é + case 2123: state = 2124; break; // &east -> &easte + case 2190: state = 2191; break; // &Egrav -> È + case 2195: state = 2196; break; // &egrav -> è + case 2206: state = 2207; break; // &El -> &Ele + case 2208: state = 2209; break; // &Elem -> &Eleme + case 2215: state = 2216; break; // &elint -> &elinte + case 2242: state = 2243; break; // &emptys -> &emptyse + case 2258: state = 2259; break; // &EmptySmallSquar -> &EmptySmallSquare + case 2263: state = 2264; break; // &EmptyV -> &EmptyVe + case 2276: state = 2277; break; // &EmptyVerySmallSquar -> &EmptyVerySmallSquare + case 2362: state = 2363; break; // &eqslantl -> &eqslantle + case 2372: state = 2383; break; // &equ -> &eque + case 2380: state = 2381; break; // &EqualTild -> &EqualTilde + case 2472: state = 2473; break; // &exp -> &expe + case 2484: state = 2485; break; // &Expon -> &Expone + case 2494: state = 2495; break; // &expon -> &expone + case 2500: state = 2501; break; // &exponential -> &exponentiale + case 2503: state = 2524; break; // &f -> &fe + case 2513: state = 2514; break; // &fallingdots -> &fallingdotse + case 2527: state = 2528; break; // &femal -> &female + case 2556: state = 2557; break; // &Fill -> &Fille + case 2568: state = 2569; break; // &FilledSmallSquar -> &FilledSmallSquare + case 2571: state = 2572; break; // &FilledV -> &FilledVe + case 2584: state = 2585; break; // &FilledVerySmallSquar -> &FilledVerySmallSquare + case 2632: state = 2633; break; // &Fouri -> &Fourie + case 2701: state = 2765; break; // &g -> &ge + case 2705: state = 2706; break; // &gacut -> &gacute + case 2725: state = 2726; break; // &Gbr -> &Gbre + case 2727: state = 2728; break; // &Gbrev -> &Gbreve + case 2731: state = 2732; break; // &gbr -> &gbre + case 2733: state = 2734; break; // &gbrev -> &gbreve + case 2736: state = 2737; break; // &Gc -> &Gce + case 2794: state = 2796; break; // &gesl -> &gesle + case 2812: state = 2813; break; // &gim -> &gime + case 2832: state = 2843; break; // &gn -> &gne + case 2863: state = 2864; break; // &grav -> &grave + case 2866: state = 2867; break; // &Gr -> &Gre + case 2869: state = 2870; break; // &Great -> &Greate + case 2878: state = 2879; break; // &GreaterEqualL -> &GreaterEqualLe + case 2894: state = 2895; break; // &GreaterGr -> &GreaterGre + case 2897: state = 2898; break; // &GreaterGreat -> &GreaterGreate + case 2901: state = 2902; break; // &GreaterL -> &GreaterLe + case 2920: state = 2921; break; // &GreaterTild -> &GreaterTilde + case 2932: state = 2934; break; // &gsim -> &gsime + case 2960: state = 2961; break; // >qu -> >que + case 2965: state = 2980; break; // >r -> >re + case 2982: state = 2983; break; // >reql -> >reqle + case 2988: state = 2989; break; // >reqql -> >reqqle + case 2993: state = 2994; break; // >rl -> >rle + case 3002: state = 3003; break; // &gv -> &gve + case 3006: state = 3007; break; // &gvertn -> &gvertne + case 3016: state = 3017; break; // &Hac -> &Hace + case 3020: state = 3074; break; // &h -> &he + case 3102: state = 3103; break; // &Hilb -> &Hilbe + case 3109: state = 3110; break; // &HilbertSpac -> &HilbertSpace + case 3113: state = 3114; break; // &hks -> &hkse + case 3138: state = 3139; break; // &hookl -> &hookle + case 3181: state = 3182; break; // &HorizontalLin -> &HorizontalLine + case 3232: state = 3233; break; // &hyph -> &hyphe + case 3240: state = 3241; break; // &Iacut -> Í + case 3243: state = 3273; break; // &i -> &ie + case 3247: state = 3248; break; // &iacut -> í + case 3292: state = 3293; break; // &Igrav -> Ì + case 3298: state = 3299; break; // &igrav -> ì + case 3341: state = 3342; break; // &imag -> &image + case 3354: state = 3355; break; // &imaglin -> &imagline + case 3368: state = 3369; break; // &imp -> &impe + case 3374: state = 3375; break; // &Impli -> &Implie + case 3382: state = 3383; break; // &incar -> &incare + case 3390: state = 3391; break; // &infinti -> &infintie + case 3399: state = 3413; break; // &Int -> &Inte + case 3401: state = 3407; break; // &int -> &inte + case 3408: state = 3409; break; // &integ -> &intege + case 3425: state = 3426; break; // &Inters -> &Interse + case 3449: state = 3450; break; // &Invisibl -> &Invisible + case 3459: state = 3460; break; // &InvisibleTim -> &InvisibleTime + case 3498: state = 3499; break; // &iqu -> &ique + case 3531: state = 3532; break; // &Itild -> &Itilde + case 3536: state = 3537; break; // &itild -> &itilde + case 3590: state = 3598; break; // &Js -> &Jse + case 3594: state = 3603; break; // &js -> &jse + case 3632: state = 3633; break; // &Kc -> &Kce + case 3638: state = 3639; break; // &kc -> &kce + case 3655: state = 3656; break; // &kgr -> &kgre + case 3656: state = 3657; break; // &kgre -> &kgree + case 3692: state = 3896; break; // &l -> &le + case 3698: state = 3898; break; // &L -> &Le + case 3702: state = 3703; break; // &Lacut -> &Lacute + case 3705: state = 3711; break; // &la -> &lae + case 3708: state = 3709; break; // &lacut -> &lacute + case 3741: state = 3742; break; // &langl -> &langle + case 3749: state = 3750; break; // &Laplac -> &Laplace + case 3792: state = 3803; break; // &lat -> &late + case 3823: state = 3824; break; // &lbrac -> &lbrace + case 3828: state = 3829; break; // &lbrk -> &lbrke + case 3837: state = 3849; break; // &Lc -> &Lce + case 3843: state = 3854; break; // &lc -> &lce + case 3904: state = 3905; break; // &LeftAngl -> &LeftAngle + case 3910: state = 3911; break; // &LeftAngleBrack -> &LeftAngleBracke + case 3953: state = 3954; break; // &LeftC -> &LeftCe + case 3965: state = 3966; break; // &LeftDoubl -> &LeftDouble + case 3971: state = 3972; break; // &LeftDoubleBrack -> &LeftDoubleBracke + case 3977: state = 3978; break; // &LeftDownT -> &LeftDownTe + case 3978: state = 3979; break; // &LeftDownTe -> &LeftDownTee + case 3980: state = 3981; break; // &LeftDownTeeV -> &LeftDownTeeVe + case 3987: state = 3988; break; // &LeftDownV -> &LeftDownVe + case 4019: state = 4020; break; // &leftl -> &leftle + case 4085: state = 4086; break; // &LeftRightV -> &LeftRightVe + case 4092: state = 4093; break; // &LeftT -> &LeftTe + case 4093: state = 4094; break; // &LeftTe -> &LeftTee + case 4102: state = 4103; break; // &LeftTeeV -> &LeftTeeVe + case 4111: state = 4112; break; // &leftthr -> &leftthre + case 4112: state = 4113; break; // &leftthre -> &leftthree + case 4116: state = 4117; break; // &leftthreetim -> &leftthreetime + case 4125: state = 4126; break; // &LeftTriangl -> &LeftTriangle + case 4144: state = 4145; break; // &LeftUpDownV -> &LeftUpDownVe + case 4151: state = 4152; break; // &LeftUpT -> &LeftUpTe + case 4152: state = 4153; break; // &LeftUpTe -> &LeftUpTee + case 4154: state = 4155; break; // &LeftUpTeeV -> &LeftUpTeeVe + case 4161: state = 4162; break; // &LeftUpV -> &LeftUpVe + case 4172: state = 4173; break; // &LeftV -> &LeftVe + case 4210: state = 4212; break; // &lesg -> &lesge + case 4215: state = 4227; break; // &less -> &lesse + case 4246: state = 4247; break; // &LessEqualGr -> &LessEqualGre + case 4249: state = 4250; break; // &LessEqualGreat -> &LessEqualGreate + case 4264: state = 4265; break; // &LessGr -> &LessGre + case 4267: state = 4268; break; // &LessGreat -> &LessGreate + case 4275: state = 4276; break; // &LessL -> &LessLe + case 4298: state = 4299; break; // &LessTild -> &LessTilde + case 4346: state = 4361; break; // &Ll -> &Lle + case 4357: state = 4358; break; // &llcorn -> &llcorne + case 4398: state = 4399; break; // &lmoustach -> &lmoustache + case 4401: state = 4412; break; // &ln -> &lne + case 4437: state = 4438; break; // &LongL -> &LongLe + case 4447: state = 4448; break; // &Longl -> &Longle + case 4459: state = 4460; break; // &longl -> &longle + case 4549: state = 4550; break; // &looparrowl -> &looparrowle + case 4575: state = 4576; break; // &lotim -> &lotime + case 4588: state = 4589; break; // &Low -> &Lowe + case 4591: state = 4592; break; // &LowerL -> &LowerLe + case 4612: state = 4614; break; // &loz -> &loze + case 4616: state = 4617; break; // &lozeng -> &lozenge + case 4636: state = 4637; break; // &lrcorn -> &lrcorne + case 4670: state = 4672; break; // &lsim -> &lsime + case 4711: state = 4712; break; // <hr -> <hre + case 4712: state = 4713; break; // <hre -> <hree + case 4716: state = 4717; break; // <im -> <ime + case 4726: state = 4727; break; // <qu -> <que + case 4732: state = 4734; break; // <ri -> <rie + case 4755: state = 4756; break; // &lv -> &lve + case 4759: state = 4760; break; // &lvertn -> &lvertne + case 4767: state = 4830; break; // &m -> &me + case 4772: state = 4773; break; // &mal -> &male + case 4775: state = 4777; break; // &malt -> &malte + case 4778: state = 4779; break; // &maltes -> &maltese + case 4781: state = 4843; break; // &M -> &Me + case 4796: state = 4797; break; // &mapstol -> &mapstole + case 4805: state = 4806; break; // &mark -> &marke + case 4834: state = 4835; break; // &measur -> &measure + case 4840: state = 4841; break; // &measuredangl -> &measuredangle + case 4851: state = 4852; break; // &MediumSpac -> &MediumSpace + case 4923: state = 4924; break; // &mod -> &mode + case 4965: state = 5064; break; // &n -> &ne + case 4971: state = 5084; break; // &N -> &Ne + case 4975: state = 4976; break; // &Nacut -> &Nacute + case 4980: state = 4981; break; // &nacut -> &nacute + case 5016: state = 5018; break; // &nbump -> &nbumpe + case 5020: state = 5039; break; // &nc -> &nce + case 5024: state = 5034; break; // &Nc -> &Nce + case 5089: state = 5090; break; // &Negativ -> &Negative + case 5091: state = 5092; break; // &NegativeM -> &NegativeMe + case 5100: state = 5101; break; // &NegativeMediumSpac -> &NegativeMediumSpace + case 5111: state = 5112; break; // &NegativeThickSpac -> &NegativeThickSpace + case 5118: state = 5119; break; // &NegativeThinSpac -> &NegativeThinSpace + case 5121: state = 5122; break; // &NegativeV -> &NegativeVe + case 5132: state = 5133; break; // &NegativeVeryThinSpac -> &NegativeVeryThinSpace + case 5140: state = 5141; break; // &nes -> &nese + case 5149: state = 5150; break; // &Nest -> &Neste + case 5153: state = 5154; break; // &NestedGr -> &NestedGre + case 5156: state = 5157; break; // &NestedGreat -> &NestedGreate + case 5160: state = 5161; break; // &NestedGreaterGr -> &NestedGreaterGre + case 5163: state = 5164; break; // &NestedGreaterGreat -> &NestedGreaterGreate + case 5167: state = 5168; break; // &NestedL -> &NestedLe + case 5171: state = 5172; break; // &NestedLessL -> &NestedLessLe + case 5179: state = 5180; break; // &NewLin -> &NewLine + case 5195: state = 5198; break; // &ng -> &nge + case 5256: state = 5270; break; // &nl -> &nle + case 5272: state = 5273; break; // &nL -> &nLe + case 5337: state = 5339; break; // &nltri -> &nltrie + case 5349: state = 5350; break; // &NoBr -> &NoBre + case 5356: state = 5357; break; // &NonBr -> &NonBre + case 5366: state = 5367; break; // &NonBreakingSpac -> &NonBreakingSpace + case 5385: state = 5386; break; // &NotCongru -> &NotCongrue + case 5400: state = 5401; break; // &NotDoubl -> &NotDouble + case 5402: state = 5403; break; // &NotDoubleV -> &NotDoubleVe + case 5415: state = 5416; break; // &NotEl -> &NotEle + case 5417: state = 5418; break; // &NotElem -> &NotEleme + case 5430: state = 5431; break; // &NotEqualTild -> &NotEqualTilde + case 5440: state = 5441; break; // &NotGr -> &NotGre + case 5443: state = 5444; break; // &NotGreat -> &NotGreate + case 5464: state = 5465; break; // &NotGreaterGr -> &NotGreaterGre + case 5467: state = 5468; break; // &NotGreaterGreat -> &NotGreaterGreate + case 5471: state = 5472; break; // &NotGreaterL -> &NotGreaterLe + case 5490: state = 5491; break; // &NotGreaterTild -> &NotGreaterTilde + case 5528: state = 5529; break; // &NotL -> &NotLe + case 5538: state = 5539; break; // &NotLeftTriangl -> &NotLeftTriangle + case 5561: state = 5562; break; // &NotLessGr -> &NotLessGre + case 5564: state = 5565; break; // &NotLessGreat -> &NotLessGreate + case 5568: state = 5569; break; // &NotLessL -> &NotLessLe + case 5587: state = 5588; break; // &NotLessTild -> &NotLessTilde + case 5590: state = 5591; break; // &NotN -> &NotNe + case 5593: state = 5594; break; // &NotNest -> &NotNeste + case 5597: state = 5598; break; // &NotNestedGr -> &NotNestedGre + case 5600: state = 5601; break; // &NotNestedGreat -> &NotNestedGreate + case 5604: state = 5605; break; // &NotNestedGreaterGr -> &NotNestedGreaterGre + case 5607: state = 5608; break; // &NotNestedGreaterGreat -> &NotNestedGreaterGreate + case 5611: state = 5612; break; // &NotNestedL -> &NotNestedLe + case 5615: state = 5616; break; // &NotNestedLessL -> &NotNestedLessLe + case 5631: state = 5632; break; // &NotPr -> &NotPre + case 5633: state = 5634; break; // &NotPrec -> &NotPrece + case 5635: state = 5636; break; // &NotPreced -> &NotPrecede + case 5656: state = 5657; break; // &NotR -> &NotRe + case 5658: state = 5659; break; // &NotRev -> &NotReve + case 5661: state = 5662; break; // &NotRevers -> &NotReverse + case 5664: state = 5665; break; // &NotReverseEl -> &NotReverseEle + case 5666: state = 5667; break; // &NotReverseElem -> &NotReverseEleme + case 5681: state = 5682; break; // &NotRightTriangl -> &NotRightTriangle + case 5698: state = 5699; break; // &NotSquar -> &NotSquare + case 5703: state = 5704; break; // &NotSquareSubs -> &NotSquareSubse + case 5713: state = 5714; break; // &NotSquareSup -> &NotSquareSupe + case 5716: state = 5717; break; // &NotSquareSupers -> &NotSquareSuperse + case 5728: state = 5729; break; // &NotSubs -> &NotSubse + case 5739: state = 5740; break; // &NotSucc -> &NotSucce + case 5740: state = 5741; break; // &NotSucce -> &NotSuccee + case 5765: state = 5766; break; // &NotSucceedsTild -> &NotSucceedsTilde + case 5768: state = 5769; break; // &NotSup -> &NotSupe + case 5771: state = 5772; break; // &NotSupers -> &NotSuperse + case 5784: state = 5785; break; // &NotTild -> &NotTilde + case 5806: state = 5807; break; // &NotTildeTild -> &NotTildeTilde + case 5809: state = 5810; break; // &NotV -> &NotVe + case 5827: state = 5828; break; // &nparall -> &nparalle + case 5842: state = 5848; break; // &npr -> &npre + case 5845: state = 5846; break; // &nprcu -> &nprcue + case 5850: state = 5852; break; // &nprec -> &nprece + case 5891: state = 5893; break; // &nrtri -> &nrtrie + case 5896: state = 5902; break; // &nsc -> &nsce + case 5899: state = 5900; break; // &nsccu -> &nsccue + case 5923: state = 5924; break; // &nshortparall -> &nshortparalle + case 5928: state = 5930; break; // &nsim -> &nsime + case 5945: state = 5946; break; // &nsqsub -> &nsqsube + case 5948: state = 5949; break; // &nsqsup -> &nsqsupe + case 5952: state = 5956; break; // &nsub -> &nsube + case 5958: state = 5959; break; // &nsubs -> &nsubse + case 5960: state = 5962; break; // &nsubset -> &nsubsete + case 5968: state = 5970; break; // &nsucc -> &nsucce + case 5973: state = 5977; break; // &nsup -> &nsupe + case 5979: state = 5980; break; // &nsups -> &nsupse + case 5981: state = 5983; break; // &nsupset -> &nsupsete + case 5995: state = 5996; break; // &Ntild -> Ñ + case 6000: state = 6001; break; // &ntild -> ñ + case 6011: state = 6012; break; // &ntriangl -> &ntriangle + case 6013: state = 6014; break; // &ntrianglel -> &ntrianglele + case 6016: state = 6018; break; // &ntriangleleft -> &ntrianglelefte + case 6025: state = 6027; break; // &ntriangleright -> &ntrianglerighte + case 6034: state = 6036; break; // &num -> &nume + case 6068: state = 6069; break; // &nvg -> &nvge + case 6084: state = 6089; break; // &nvl -> &nvle + case 6094: state = 6095; break; // &nvltri -> &nvltrie + case 6104: state = 6105; break; // &nvrtri -> &nvrtrie + case 6126: state = 6127; break; // &nwn -> &nwne + case 6135: state = 6136; break; // &Oacut -> Ó + case 6138: state = 6195; break; // &o -> &oe + case 6142: state = 6143; break; // &oacut -> ó + case 6217: state = 6218; break; // &Ograv -> Ò + case 6222: state = 6223; break; // &ograv -> ò + case 6253: state = 6254; break; // &olin -> &oline + case 6258: state = 6268; break; // &Om -> &Ome + case 6263: state = 6272; break; // &om -> &ome + case 6302: state = 6332; break; // &op -> &ope + case 6306: state = 6307; break; // &Op -> &Ope + case 6318: state = 6319; break; // &OpenCurlyDoubl -> &OpenCurlyDouble + case 6323: state = 6324; break; // &OpenCurlyDoubleQuot -> &OpenCurlyDoubleQuote + case 6329: state = 6330; break; // &OpenCurlyQuot -> &OpenCurlyQuote + case 6348: state = 6350; break; // &ord -> &orde + case 6371: state = 6372; break; // &orslop -> &orslope + case 6402: state = 6403; break; // &Otild -> Õ + case 6408: state = 6409; break; // &otild -> õ + case 6411: state = 6412; break; // &Otim -> &Otime + case 6415: state = 6416; break; // &otim -> &otime + case 6435: state = 6436; break; // &Ov -> &Ove + case 6444: state = 6445; break; // &OverBrac -> &OverBrace + case 6447: state = 6448; break; // &OverBrack -> &OverBracke + case 6453: state = 6454; break; // &OverPar -> &OverPare + case 6457: state = 6458; break; // &OverParenth -> &OverParenthe + case 6463: state = 6497; break; // &p -> &pe + case 6470: state = 6471; break; // ¶ll -> ¶lle + case 6513: state = 6514; break; // &pert -> &perte + case 6538: state = 6539; break; // &phon -> &phone + case 6567: state = 6585; break; // &plus -> &pluse + case 6614: state = 6615; break; // &Poincar -> &Poincare + case 6619: state = 6620; break; // &Poincareplan -> &Poincareplane + case 6640: state = 6672; break; // &Pr -> &Pre + case 6642: state = 6653; break; // &pr -> &pre + case 6648: state = 6649; break; // &prcu -> &prcue + case 6655: state = 6702; break; // &prec -> &prece + case 6668: state = 6669; break; // &preccurly -> &preccurlye + case 6673: state = 6674; break; // &Prec -> &Prece + case 6675: state = 6676; break; // &Preced -> &Precede + case 6699: state = 6700; break; // &PrecedesTild -> &PrecedesTilde + case 6705: state = 6713; break; // &precn -> &precne + case 6726: state = 6727; break; // &Prim -> &Prime + case 6730: state = 6731; break; // &prim -> &prime + case 6762: state = 6763; break; // &proflin -> &profline + case 6791: state = 6792; break; // &prur -> &prure + case 6836: state = 6837; break; // &qprim -> &qprime + case 6847: state = 6862; break; // &qu -> &que + case 6849: state = 6850; break; // &quat -> &quate + case 6864: state = 6866; break; // &quest -> &queste + case 6876: state = 7074; break; // &r -> &re + case 6882: state = 6901; break; // &ra -> &rae + case 6883: state = 6884; break; // &rac -> &race + case 6886: state = 7072; break; // &R -> &Re + case 6890: state = 6891; break; // &Racut -> &Racute + case 6894: state = 6895; break; // &racut -> &racute + case 6912: state = 6916; break; // &rang -> &range + case 6918: state = 6919; break; // &rangl -> &rangle + case 7007: state = 7008; break; // &rbrac -> &rbrace + case 7012: state = 7013; break; // &rbrk -> &rbrke + case 7021: state = 7033; break; // &Rc -> &Rce + case 7027: state = 7038; break; // &rc -> &rce + case 7079: state = 7080; break; // &realin -> &realine + case 7097: state = 7098; break; // &Rev -> &Reve + case 7100: state = 7101; break; // &Revers -> &Reverse + case 7103: state = 7104; break; // &ReverseEl -> &ReverseEle + case 7105: state = 7106; break; // &ReverseElem -> &ReverseEleme + case 7178: state = 7179; break; // &RightAngl -> &RightAngle + case 7184: state = 7185; break; // &RightAngleBrack -> &RightAngleBracke + case 7213: state = 7214; break; // &RightArrowL -> &RightArrowLe + case 7228: state = 7229; break; // &RightC -> &RightCe + case 7240: state = 7241; break; // &RightDoubl -> &RightDouble + case 7246: state = 7247; break; // &RightDoubleBrack -> &RightDoubleBracke + case 7252: state = 7253; break; // &RightDownT -> &RightDownTe + case 7253: state = 7254; break; // &RightDownTe -> &RightDownTee + case 7255: state = 7256; break; // &RightDownTeeV -> &RightDownTeeVe + case 7262: state = 7263; break; // &RightDownV -> &RightDownVe + case 7294: state = 7295; break; // &rightl -> &rightle + case 7337: state = 7338; break; // &RightT -> &RightTe + case 7338: state = 7339; break; // &RightTe -> &RightTee + case 7347: state = 7348; break; // &RightTeeV -> &RightTeeVe + case 7356: state = 7357; break; // &rightthr -> &rightthre + case 7357: state = 7358; break; // &rightthre -> &rightthree + case 7361: state = 7362; break; // &rightthreetim -> &rightthreetime + case 7370: state = 7371; break; // &RightTriangl -> &RightTriangle + case 7389: state = 7390; break; // &RightUpDownV -> &RightUpDownVe + case 7396: state = 7397; break; // &RightUpT -> &RightUpTe + case 7397: state = 7398; break; // &RightUpTe -> &RightUpTee + case 7399: state = 7400; break; // &RightUpTeeV -> &RightUpTeeVe + case 7406: state = 7407; break; // &RightUpV -> &RightUpVe + case 7417: state = 7418; break; // &RightV -> &RightVe + case 7438: state = 7439; break; // &risingdots -> &risingdotse + case 7461: state = 7462; break; // &rmoustach -> &rmoustache + case 7497: state = 7498; break; // &rotim -> &rotime + case 7508: state = 7509; break; // &RoundImpli -> &RoundImplie + case 7569: state = 7570; break; // &rthr -> &rthre + case 7570: state = 7571; break; // &rthre -> &rthree + case 7574: state = 7575; break; // &rtim -> &rtime + case 7579: state = 7581; break; // &rtri -> &rtrie + case 7591: state = 7592; break; // &Rul -> &Rule + case 7593: state = 7594; break; // &RuleD -> &RuleDe + case 7597: state = 7598; break; // &RuleDelay -> &RuleDelaye + case 7614: state = 7615; break; // &Sacut -> &Sacute + case 7617: state = 7703; break; // &s -> &se + case 7621: state = 7622; break; // &sacut -> &sacute + case 7629: state = 7653; break; // &Sc -> &Sce + case 7631: state = 7651; break; // &sc -> &sce + case 7646: state = 7647; break; // &sccu -> &sccue + case 7697: state = 7701; break; // &sdot -> &sdote + case 7786: state = 7787; break; // &ShortL -> &ShortLe + case 7808: state = 7809; break; // &shortparall -> &shortparalle + case 7847: state = 7853; break; // &sim -> &sime + case 7865: state = 7866; break; // &simn -> &simne + case 7891: state = 7892; break; // &SmallCircl -> &SmallCircle + case 7894: state = 7911; break; // &sm -> &sme + case 7898: state = 7899; break; // &smalls -> &smallse + case 7921: state = 7922; break; // &smil -> &smile + case 7924: state = 7926; break; // &smt -> &smte + case 7958: state = 7959; break; // &spad -> &spade + case 7986: state = 7988; break; // &sqsub -> &sqsube + case 7990: state = 7991; break; // &sqsubs -> &sqsubse + case 7992: state = 7994; break; // &sqsubset -> &sqsubsete + case 7997: state = 7999; break; // &sqsup -> &sqsupe + case 8001: state = 8002; break; // &sqsups -> &sqsupse + case 8003: state = 8005; break; // &sqsupset -> &sqsupsete + case 8012: state = 8013; break; // &Squar -> &Square + case 8016: state = 8017; break; // &squar -> &square + case 8021: state = 8022; break; // &SquareInt -> &SquareInte + case 8024: state = 8025; break; // &SquareInters -> &SquareInterse + case 8035: state = 8036; break; // &SquareSubs -> &SquareSubse + case 8045: state = 8046; break; // &SquareSup -> &SquareSupe + case 8048: state = 8049; break; // &SquareSupers -> &SquareSuperse + case 8077: state = 8081; break; // &ss -> &sse + case 8088: state = 8089; break; // &ssmil -> &ssmile + case 8111: state = 8112; break; // &straight -> &straighte + case 8131: state = 8139; break; // &sub -> &sube + case 8150: state = 8153; break; // &subn -> &subne + case 8165: state = 8166; break; // &Subs -> &Subse + case 8169: state = 8170; break; // &subs -> &subse + case 8171: state = 8173; break; // &subset -> &subsete + case 8184: state = 8185; break; // &subsetn -> &subsetne + case 8199: state = 8246; break; // &succ -> &succe + case 8212: state = 8213; break; // &succcurly -> &succcurlye + case 8217: state = 8218; break; // &Succ -> &Succe + case 8218: state = 8219; break; // &Succe -> &Succee + case 8243: state = 8244; break; // &SucceedsTild -> &SucceedsTilde + case 8249: state = 8257; break; // &succn -> &succne + case 8282: state = 8308; break; // &Sup -> &Supe + case 8284: state = 8302; break; // &sup -> &supe + case 8310: state = 8311; break; // &Supers -> &Superse + case 8338: state = 8341; break; // &supn -> &supne + case 8348: state = 8349; break; // &Sups -> &Supse + case 8352: state = 8353; break; // &sups -> &supse + case 8354: state = 8356; break; // &supset -> &supsete + case 8361: state = 8362; break; // &supsetn -> &supsetne + case 8404: state = 8449; break; // &t -> &te + case 8407: state = 8408; break; // &targ -> &targe + case 8419: state = 8431; break; // &Tc -> &Tce + case 8425: state = 8436; break; // &tc -> &tce + case 8451: state = 8452; break; // &telr -> &telre + case 8461: state = 8462; break; // &th -> &the + case 8463: state = 8464; break; // &ther -> &there + case 8467: state = 8468; break; // &Th -> &The + case 8469: state = 8470; break; // &Ther -> &There + case 8473: state = 8474; break; // &Therefor -> &Therefore + case 8478: state = 8479; break; // &therefor -> &therefore + case 8513: state = 8514; break; // &ThickSpac -> &ThickSpace + case 8524: state = 8525; break; // &ThinSpac -> &ThinSpace + case 8546: state = 8547; break; // &Tild -> &Tilde + case 8551: state = 8552; break; // &tild -> &tilde + case 8573: state = 8574; break; // &TildeTild -> &TildeTilde + case 8576: state = 8577; break; // &tim -> &time + case 8590: state = 8591; break; // &to -> &toe + case 8620: state = 8621; break; // &tprim -> &tprime + case 8630: state = 8631; break; // &trad -> &trade + case 8633: state = 8668; break; // &tri -> &trie + case 8637: state = 8638; break; // &triangl -> &triangle + case 8645: state = 8646; break; // &trianglel -> &trianglele + case 8648: state = 8650; break; // &triangleleft -> &trianglelefte + case 8659: state = 8661; break; // &triangleright -> &trianglerighte + case 8679: state = 8680; break; // &Tripl -> &Triple + case 8695: state = 8696; break; // &tritim -> &tritime + case 8698: state = 8699; break; // &trp -> &trpe + case 8743: state = 8744; break; // &twoh -> &twohe + case 8747: state = 8748; break; // &twoheadl -> &twoheadle + case 8772: state = 8773; break; // &Uacut -> Ú + case 8779: state = 8780; break; // &uacut -> ú + case 8798: state = 8807; break; // &Ubr -> &Ubre + case 8803: state = 8811; break; // &ubr -> &ubre + case 8808: state = 8809; break; // &Ubrev -> &Ubreve + case 8812: state = 8813; break; // &ubrev -> &ubreve + case 8863: state = 8864; break; // &Ugrav -> Ù + case 8869: state = 8870; break; // &ugrav -> ù + case 8891: state = 8893; break; // &ulcorn -> &ulcorne + case 8917: state = 8918; break; // &Und -> &Unde + case 8926: state = 8927; break; // &UnderBrac -> &UnderBrace + case 8929: state = 8930; break; // &UnderBrack -> &UnderBracke + case 8935: state = 8936; break; // &UnderPar -> &UnderPare + case 8939: state = 8940; break; // &UnderParenth -> &UnderParenthe + case 9053: state = 9054; break; // &upharpoonl -> &upharpoonle + case 9068: state = 9069; break; // &Upp -> &Uppe + case 9071: state = 9072; break; // &UpperL -> &UpperLe + case 9108: state = 9109; break; // &UpT -> &UpTe + case 9109: state = 9110; break; // &UpTe -> &UpTee + case 9131: state = 9133; break; // &urcorn -> &urcorne + case 9169: state = 9170; break; // &Utild -> &Utilde + case 9174: state = 9175; break; // &utild -> &utilde + case 9198: state = 9199; break; // &uwangl -> &uwangle + case 9201: state = 9345; break; // &v -> &ve + case 9208: state = 9209; break; // &var -> &vare + case 9260: state = 9261; break; // &varsubs -> &varsubse + case 9263: state = 9264; break; // &varsubsetn -> &varsubsetne + case 9270: state = 9271; break; // &varsups -> &varsupse + case 9273: state = 9274; break; // &varsupsetn -> &varsupsetne + case 9280: state = 9281; break; // &varth -> &varthe + case 9290: state = 9291; break; // &vartriangl -> &vartriangle + case 9292: state = 9293; break; // &vartrianglel -> &vartrianglele + case 9303: state = 9342; break; // &V -> &Ve + case 9342: state = 9343; break; // &Ve -> &Vee + case 9345: state = 9346; break; // &ve -> &vee + case 9346: state = 9352; break; // &vee -> &veee + case 9384: state = 9385; break; // &VerticalLin -> &VerticalLine + case 9387: state = 9388; break; // &VerticalS -> &VerticalSe + case 9400: state = 9401; break; // &VerticalTild -> &VerticalTilde + case 9411: state = 9412; break; // &VeryThinSpac -> &VeryThinSpace + case 9460: state = 9463; break; // &vsubn -> &vsubne + case 9466: state = 9469; break; // &vsupn -> &vsupne + case 9484: state = 9502; break; // &W -> &We + case 9490: state = 9496; break; // &w -> &we + case 9504: state = 9505; break; // &Wedg -> &Wedge + case 9507: state = 9508; break; // &wedg -> &wedge + case 9512: state = 9513; break; // &wei -> &weie + case 9533: state = 9535; break; // &wr -> &wre + case 9620: state = 9621; break; // &xotim -> &xotime + case 9655: state = 9656; break; // &xv -> &xve + case 9656: state = 9657; break; // &xve -> &xvee + case 9659: state = 9660; break; // &xw -> &xwe + case 9662: state = 9663; break; // &xwedg -> &xwedge + case 9669: state = 9670; break; // &Yacut -> Ý + case 9672: state = 9699; break; // &y -> &ye + case 9676: state = 9677; break; // &yacut -> ý + case 9747: state = 9791; break; // &Z -> &Ze + case 9751: state = 9752; break; // &Zacut -> &Zacute + case 9754: state = 9785; break; // &z -> &ze + case 9758: state = 9759; break; // &zacut -> &zacute + case 9785: state = 9786; break; // &ze -> &zee + case 9802: state = 9803; break; // &ZeroWidthSpac -> &ZeroWidthSpace default: return false; } break; case 'f': switch (state) { - case 0: state = 1964; break; // & -> &f - case 1: state = 47; break; // &A -> &Af - case 7: state = 46; break; // &a -> &af - case 61: state = 62; break; // &ale -> &alef - case 109: state = 115; break; // &angmsda -> &angmsdaf - case 139: state = 140; break; // &Aop -> &Aopf - case 141: state = 142; break; // &aop -> &aopf - case 222: state = 331; break; // &b -> &bf - case 247: state = 329; break; // &B -> &Bf - case 426: state = 427; break; // &blacktrianglele -> &blacktrianglelef - case 457: state = 458; break; // &Bop -> &Bopf - case 460: state = 461; break; // &bop -> &bopf - case 583: state = 712; break; // &C -> &Cf - case 589: state = 714; break; // &c -> &cf - case 618: state = 619; break; // &CapitalDi -> &CapitalDif - case 619: state = 620; break; // &CapitalDif -> &CapitalDiff - case 733: state = 791; break; // &cir -> &cirf - case 745: state = 746; break; // &circlearrowle -> &circlearrowlef - case 871: state = 872; break; // &comp -> &compf - case 913: state = 914; break; // &Cop -> &Copf - case 915: state = 916; break; // &cop -> &copf - case 1062: state = 1063; break; // &curvearrowle -> &curvearrowlef - case 1091: state = 1180; break; // &D -> &Df - case 1097: state = 1175; break; // &d -> &df - case 1191: state = 1244; break; // &Di -> &Dif - case 1244: state = 1245; break; // &Dif -> &Diff - case 1297: state = 1298; break; // &Dop -> &Dopf - case 1299: state = 1300; break; // &dop -> &dopf - case 1373: state = 1374; break; // &DoubleLe -> &DoubleLef - case 1398: state = 1399; break; // &DoubleLongLe -> &DoubleLongLef - case 1518: state = 1519; break; // &downharpoonle -> &downharpoonlef - case 1527: state = 1528; break; // &DownLe -> &DownLef - case 1629: state = 1630; break; // &dtri -> &dtrif - case 1656: state = 1711; break; // &E -> &Ef - case 1662: state = 1707; break; // &e -> &ef - case 1809: state = 1810; break; // &Eop -> &Eopf - case 1811: state = 1812; break; // &eop -> &eopf - case 1964: state = 1987; break; // &f -> &ff - case 1977: state = 1998; break; // &F -> &Ff - case 2050: state = 2051; break; // &fno -> &fnof - case 2053: state = 2054; break; // &Fop -> &Fopf - case 2056: state = 2057; break; // &fop -> &fopf - case 2074: state = 2075; break; // &Fouriertr -> &Fouriertrf - case 2118: state = 2189; break; // &g -> &gf - case 2124: state = 2187; break; // &G -> &Gf - case 2223: state = 2224; break; // &Gop -> &Gopf - case 2226: state = 2227; break; // &gop -> &gopf - case 2351: state = 2413; break; // &H -> &Hf - case 2356: state = 2415; break; // &h -> &hf - case 2362: state = 2363; break; // &hal -> &half - case 2451: state = 2452; break; // &hookle -> &hooklef - case 2470: state = 2471; break; // &Hop -> &Hopf - case 2472: state = 2473; break; // &hop -> &hopf - case 2533: state = 2569; break; // &I -> &If - case 2539: state = 2567; break; // &i -> &if - case 2567: state = 2568; break; // &if -> &iff - case 2589: state = 2590; break; // &iin -> &iinf - case 2631: state = 2632; break; // &imo -> &imof - case 2641: state = 2646; break; // &in -> &inf - case 2723: state = 2724; break; // &Iop -> &Iopf - case 2725: state = 2726; break; // &iop -> &iopf - case 2777: state = 2789; break; // &J -> &Jf - case 2782: state = 2791; break; // &j -> &jf - case 2798: state = 2799; break; // &Jop -> &Jopf - case 2801: state = 2802; break; // &jop -> &jopf - case 2825: state = 2848; break; // &K -> &Kf - case 2830: state = 2850; break; // &k -> &kf - case 2870: state = 2871; break; // &Kop -> &Kopf - case 2873: state = 2874; break; // &kop -> &kopf - case 2881: state = 3376; break; // &l -> &lf - case 2886: state = 3385; break; // &L -> &Lf - case 2929: state = 2930; break; // &Laplacetr -> &Laplacetrf - case 2939: state = 2943; break; // &larr -> &larrf - case 2940: state = 2941; break; // &larrb -> &larrbf - case 3032: state = 3057; break; // &le -> &lef - case 3033: state = 3034; break; // &Le -> &Lef - case 3140: state = 3141; break; // &leftle -> &leftlef - case 3419: state = 3420; break; // &Lle -> &Llef - case 3479: state = 3480; break; // &LongLe -> &LongLef - case 3488: state = 3489; break; // &Longle -> &Longlef - case 3499: state = 3500; break; // &longle -> &longlef - case 3581: state = 3582; break; // &looparrowle -> &looparrowlef - case 3589: state = 3594; break; // &lop -> &lopf - case 3592: state = 3593; break; // &Lop -> &Lopf - case 3614: state = 3615; break; // &LowerLe -> &LowerLef - case 3632: state = 3637; break; // &loz -> &lozf - case 3718: state = 3720; break; // <ri -> <rif - case 3745: state = 3823; break; // &m -> &mf - case 3755: state = 3821; break; // &M -> &Mf - case 3767: state = 3768; break; // &mapstole -> &mapstolef - case 3819: state = 3820; break; // &Mellintr -> &Mellintrf - case 3871: state = 3872; break; // &Mop -> &Mopf - case 3873: state = 3874; break; // &mop -> &mopf - case 3897: state = 4079; break; // &n -> &nf - case 3902: state = 4077; break; // &N -> &Nf - case 4131: state = 4141; break; // &nle -> &nlef - case 4133: state = 4134; break; // &nLe -> &nLef - case 4210: state = 4211; break; // &Nop -> &Nopf - case 4213: state = 4214; break; // &nop -> &nopf - case 4344: state = 4345; break; // &NotLe -> &NotLef - case 4740: state = 4741; break; // &ntrianglele -> &ntrianglelef - case 4788: state = 4789; break; // &nvin -> &nvinf - case 4827: state = 4884; break; // &O -> &Of - case 4833: state = 4880; break; // &o -> &of - case 4952: state = 4953; break; // &Oop -> &Oopf - case 4955: state = 4956; break; // &oop -> &oopf - case 4995: state = 5000; break; // &ord -> ª - case 4998: state = 4999; break; // &ordero -> &orderof - case 5004: state = 5005; break; // &origo -> &origof - case 5083: state = 5126; break; // &p -> &pf - case 5096: state = 5124; break; // &P -> &Pf - case 5144: state = 5145; break; // &pitch -> &pitchf - case 5208: state = 5209; break; // &Pop -> &Popf - case 5210: state = 5211; break; // &pop -> &popf - case 5296: state = 5303; break; // &pro -> &prof - case 5314: state = 5315; break; // &profsur -> &profsurf - case 5348: state = 5349; break; // &Q -> &Qf - case 5351: state = 5352; break; // &q -> &qf - case 5358: state = 5359; break; // &Qop -> &Qopf - case 5361: state = 5362; break; // &qop -> &qopf - case 5397: state = 5592; break; // &r -> &rf - case 5405: state = 5601; break; // &R -> &Rf - case 5439: state = 5446; break; // &rarr -> &rarrf - case 5442: state = 5443; break; // &rarrb -> &rarrbf - case 5655: state = 5656; break; // &RightArrowLe -> &RightArrowLef - case 5726: state = 5727; break; // &rightle -> &rightlef - case 5884: state = 5890; break; // &rop -> &ropf - case 5888: state = 5889; break; // &Rop -> &Ropf - case 5961: state = 5963; break; // &rtri -> &rtrif - case 5985: state = 6081; break; // &S -> &Sf - case 5991: state = 6083; break; // &s -> &sf - case 6118: state = 6119; break; // &ShortLe -> &ShortLef - case 6165: state = 6166; break; // &sigma -> &sigmaf - case 6235: state = 6236; break; // &so -> &sof - case 6245: state = 6246; break; // &Sop -> &Sopf - case 6247: state = 6248; break; // &sop -> &sopf - case 6285: state = 6333; break; // &squ -> &squf - case 6291: state = 6332; break; // &squar -> &squarf - case 6354: state = 6355; break; // &sstar -> &sstarf - case 6361: state = 6362; break; // &star -> &starf - case 6583: state = 6625; break; // &T -> &Tf - case 6586: state = 6627; break; // &t -> &tf - case 6632: state = 6642; break; // &there -> &theref - case 6637: state = 6638; break; // &There -> &Theref - case 6735: state = 6745; break; // &top -> &topf - case 6743: state = 6744; break; // &Top -> &Topf - case 6775: state = 6776; break; // &trianglele -> &trianglelef - case 6855: state = 6856; break; // &twoheadle -> &twoheadlef - case 6873: state = 6941; break; // &U -> &Uf - case 6879: state = 6936; break; // &u -> &uf - case 7027: state = 7028; break; // &Uop -> &Uopf - case 7029: state = 7030; break; // &uop -> &uopf - case 7106: state = 7107; break; // &upharpoonle -> &upharpoonlef - case 7121: state = 7122; break; // &UpperLe -> &UpperLef - case 7206: state = 7207; break; // &utri -> &utrif - case 7223: state = 7396; break; // &v -> &vf - case 7299: state = 7300; break; // &vartrianglele -> &vartrianglelef - case 7307: state = 7394; break; // &V -> &Vf - case 7408: state = 7409; break; // &Vop -> &Vopf - case 7411: state = 7412; break; // &vop -> &vopf - case 7447: state = 7473; break; // &W -> &Wf - case 7452: state = 7475; break; // &w -> &wf - case 7478: state = 7479; break; // &Wop -> &Wopf - case 7481: state = 7482; break; // &wop -> &wopf - case 7495: state = 7511; break; // &x -> &xf - case 7508: state = 7509; break; // &X -> &Xf - case 7540: state = 7541; break; // &Xop -> &Xopf - case 7542: state = 7543; break; // &xop -> &xopf - case 7584: state = 7612; break; // &Y -> &Yf - case 7590: state = 7614; break; // &y -> &yf - case 7623: state = 7624; break; // &Yop -> &Yopf - case 7626: state = 7627; break; // &yop -> &yopf - case 7645: state = 7697; break; // &Z -> &Zf - case 7651: state = 7699; break; // &z -> &zf - case 7678: state = 7679; break; // &zeetr -> &zeetrf - case 7714: state = 7715; break; // &Zop -> &Zopf - case 7717: state = 7718; break; // &zop -> &zopf + case 0: state = 2503; break; // & -> &f + case 1: state = 62; break; // &A -> &Af + case 8: state = 60; break; // &a -> &af + case 80: state = 81; break; // &ale -> &alef + case 147: state = 158; break; // &angmsda -> &angmsdaf + case 193: state = 194; break; // &Aop -> &Aopf + case 196: state = 197; break; // &aop -> &aopf + case 301: state = 439; break; // &b -> &bf + case 331: state = 436; break; // &B -> &Bf + case 553: state = 554; break; // &blacktrianglele -> &blacktrianglelef + case 595: state = 596; break; // &Bop -> &Bopf + case 599: state = 600; break; // &bop -> &bopf + case 789: state = 950; break; // &C -> &Cf + case 796: state = 953; break; // &c -> &cf + case 833: state = 834; break; // &CapitalDi -> &CapitalDif + case 834: state = 835; break; // &CapitalDif -> &CapitalDiff + case 979: state = 1053; break; // &cir -> &cirf + case 994: state = 995; break; // &circlearrowle -> &circlearrowlef + case 1148: state = 1150; break; // &comp -> &compf + case 1200: state = 1201; break; // &Cop -> &Copf + case 1203: state = 1204; break; // &cop -> &copf + case 1389: state = 1390; break; // &curvearrowle -> &curvearrowlef + case 1425: state = 1541; break; // &D -> &Df + case 1432: state = 1535; break; // &d -> &df + case 1557: state = 1621; break; // &Di -> &Dif + case 1621: state = 1622; break; // &Dif -> &Diff + case 1686: state = 1687; break; // &Dop -> &Dopf + case 1689: state = 1690; break; // &dop -> &dopf + case 1777: state = 1778; break; // &DoubleLe -> &DoubleLef + case 1805: state = 1806; break; // &DoubleLongLe -> &DoubleLongLef + case 1940: state = 1941; break; // &downharpoonle -> &downharpoonlef + case 1951: state = 1952; break; // &DownLe -> &DownLef + case 2073: state = 2075; break; // &dtri -> &dtrif + case 2108: state = 2180; break; // &E -> &Ef + case 2115: state = 2175; break; // &e -> &ef + case 2306: state = 2307; break; // &Eop -> &Eopf + case 2309: state = 2310; break; // &eop -> &eopf + case 2503: state = 2530; break; // &f -> &ff + case 2517: state = 2544; break; // &F -> &Ff + case 2605: state = 2606; break; // &fno -> &fnof + case 2609: state = 2610; break; // &Fop -> &Fopf + case 2613: state = 2614; break; // &fop -> &fopf + case 2636: state = 2637; break; // &Fouriertr -> &Fouriertrf + case 2701: state = 2802; break; // &g -> &gf + case 2708: state = 2799; break; // &G -> &Gf + case 2854: state = 2855; break; // &Gop -> &Gopf + case 2858: state = 2859; break; // &gop -> &gopf + case 3014: state = 3094; break; // &H -> &Hf + case 3020: state = 3097; break; // &h -> &hf + case 3027: state = 3028; break; // &hal -> &half + case 3139: state = 3140; break; // &hookle -> &hooklef + case 3160: state = 3161; break; // &Hop -> &Hopf + case 3163: state = 3164; break; // &hop -> &hopf + case 3236: state = 3284; break; // &I -> &If + case 3243: state = 3281; break; // &i -> &if + case 3281: state = 3282; break; // &if -> &iff + case 3311: state = 3312; break; // &iin -> &iinf + case 3365: state = 3366; break; // &imo -> &imof + case 3378: state = 3385; break; // &in -> &inf + case 3480: state = 3481; break; // &Iop -> &Iopf + case 3483: state = 3484; break; // &iop -> &iopf + case 3555: state = 3571; break; // &J -> &Jf + case 3561: state = 3574; break; // &j -> &jf + case 3583: state = 3584; break; // &Jop -> &Jopf + case 3587: state = 3588; break; // &jop -> &jopf + case 3618: state = 3648; break; // &K -> &Kf + case 3624: state = 3651; break; // &k -> &kf + case 3677: state = 3678; break; // &Kop -> &Kopf + case 3681: state = 3682; break; // &kop -> &kopf + case 3692: state = 4301; break; // &l -> &lf + case 3698: state = 4312; break; // &L -> &Lf + case 3752: state = 3753; break; // &Laplacetr -> &Laplacetrf + case 3766: state = 3773; break; // &larr -> &larrf + case 3768: state = 3770; break; // &larrb -> &larrbf + case 3896: state = 3925; break; // &le -> &lef + case 3898: state = 3899; break; // &Le -> &Lef + case 4020: state = 4021; break; // &leftle -> &leftlef + case 4361: state = 4362; break; // &Lle -> &Llef + case 4438: state = 4439; break; // &LongLe -> &LongLef + case 4448: state = 4449; break; // &Longle -> &Longlef + case 4460: state = 4461; break; // &longle -> &longlef + case 4550: state = 4551; break; // &looparrowle -> &looparrowlef + case 4560: state = 4567; break; // &lop -> &lopf + case 4564: state = 4565; break; // &Lop -> &Lopf + case 4592: state = 4593; break; // &LowerLe -> &LowerLef + case 4612: state = 4619; break; // &loz -> &lozf + case 4732: state = 4736; break; // <ri -> <rif + case 4767: state = 4865; break; // &m -> &mf + case 4781: state = 4862; break; // &M -> &Mf + case 4797: state = 4798; break; // &mapstole -> &mapstolef + case 4859: state = 4860; break; // &Mellintr -> &Mellintrf + case 4929: state = 4930; break; // &Mop -> &Mopf + case 4932: state = 4933; break; // &mop -> &mopf + case 4965: state = 5192; break; // &n -> &nf + case 4971: state = 5189; break; // &N -> &Nf + case 5270: state = 5282; break; // &nle -> &nlef + case 5273: state = 5274; break; // &nLe -> &nLef + case 5369: state = 5370; break; // &Nop -> &Nopf + case 5373: state = 5374; break; // &nop -> &nopf + case 5529: state = 5530; break; // &NotLe -> &NotLef + case 6014: state = 6015; break; // &ntrianglele -> &ntrianglelef + case 6079: state = 6080; break; // &nvin -> &nvinf + case 6131: state = 6205; break; // &O -> &Of + case 6138: state = 6200; break; // &o -> &of + case 6295: state = 6296; break; // &Oop -> &Oopf + case 6299: state = 6300; break; // &oop -> &oopf + case 6348: state = 6356; break; // &ord -> ª + case 6353: state = 6354; break; // &ordero -> &orderof + case 6362: state = 6363; break; // &origo -> &origof + case 6463: state = 6521; break; // &p -> &pf + case 6482: state = 6518; break; // &P -> &Pf + case 6547: state = 6548; break; // &pitch -> &pitchf + case 6630: state = 6631; break; // &Pop -> &Popf + case 6633: state = 6634; break; // &pop -> &popf + case 6745: state = 6754; break; // &pro -> &prof + case 6767: state = 6768; break; // &profsur -> &profsurf + case 6813: state = 6814; break; // &Q -> &Qf + case 6817: state = 6818; break; // &q -> &qf + case 6826: state = 6827; break; // &Qop -> &Qopf + case 6830: state = 6831; break; // &qop -> &qopf + case 6876: state = 7135; break; // &r -> &rf + case 6886: state = 7146; break; // &R -> &Rf + case 6932: state = 6944; break; // &rarr -> &rarrf + case 6937: state = 6939; break; // &rarrb -> &rarrbf + case 7214: state = 7215; break; // &RightArrowLe -> &RightArrowLef + case 7295: state = 7296; break; // &rightle -> &rightlef + case 7481: state = 7489; break; // &rop -> &ropf + case 7486: state = 7487; break; // &Rop -> &Ropf + case 7579: state = 7583; break; // &rtri -> &rtrif + case 7610: state = 7741; break; // &S -> &Sf + case 7617: state = 7744; break; // &s -> &sf + case 7787: state = 7788; break; // &ShortLe -> &ShortLef + case 7841: state = 7843; break; // &sigma -> &sigmaf + case 7936: state = 7937; break; // &so -> &sof + case 7950: state = 7951; break; // &Sop -> &Sopf + case 7953: state = 7954; break; // &sop -> &sopf + case 8008: state = 8066; break; // &squ -> &squf + case 8016: state = 8064; break; // &squar -> &squarf + case 8093: state = 8094; break; // &sstar -> &sstarf + case 8102: state = 8104; break; // &star -> &starf + case 8400: state = 8455; break; // &T -> &Tf + case 8404: state = 8458; break; // &t -> &tf + case 8464: state = 8476; break; // &there -> &theref + case 8470: state = 8471; break; // &There -> &Theref + case 8594: state = 8608; break; // &top -> &topf + case 8605: state = 8606; break; // &Top -> &Topf + case 8646: state = 8647; break; // &trianglele -> &trianglelef + case 8748: state = 8749; break; // &twoheadle -> &twoheadlef + case 8768: state = 8855; break; // &U -> &Uf + case 8775: state = 8849; break; // &u -> &uf + case 8964: state = 8965; break; // &Uop -> &Uopf + case 8967: state = 8968; break; // &uop -> &uopf + case 9054: state = 9055; break; // &upharpoonle -> &upharpoonlef + case 9072: state = 9073; break; // &UpperLe -> &UpperLef + case 9178: state = 9180; break; // &utri -> &utrif + case 9201: state = 9417; break; // &v -> &vf + case 9293: state = 9294; break; // &vartrianglele -> &vartrianglelef + case 9303: state = 9414; break; // &V -> &Vf + case 9433: state = 9434; break; // &Vop -> &Vopf + case 9437: state = 9438; break; // &vop -> &vopf + case 9484: state = 9517; break; // &W -> &Wf + case 9490: state = 9520; break; // &w -> &wf + case 9524: state = 9525; break; // &Wop -> &Wopf + case 9528: state = 9529; break; // &wop -> &wopf + case 9548: state = 9569; break; // &x -> &xf + case 9565: state = 9566; break; // &X -> &Xf + case 9608: state = 9609; break; // &Xop -> &Xopf + case 9611: state = 9612; break; // &xop -> &xopf + case 9665: state = 9702; break; // &Y -> &Yf + case 9672: state = 9705; break; // &y -> &yf + case 9717: state = 9718; break; // &Yop -> &Yopf + case 9721: state = 9722; break; // &yop -> &yopf + case 9747: state = 9811; break; // &Z -> &Zf + case 9754: state = 9814; break; // &z -> &zf + case 9788: state = 9789; break; // &zeetr -> &zeetrf + case 9833: state = 9834; break; // &Zop -> &Zopf + case 9837: state = 9838; break; // &zop -> &zopf default: return false; } break; case 'g': switch (state) { - case 0: state = 2118; break; // & -> &g - case 1: state = 50; break; // &A -> &Ag - case 7: state = 55; break; // &a -> &ag - case 40: state = 41; break; // &AEli -> Æ - case 44: state = 45; break; // &aeli -> æ - case 83: state = 84; break; // &amal -> &amalg - case 90: state = 102; break; // &an -> &ang - case 109: state = 116; break; // &angmsda -> &angmsdag - case 131: state = 132; break; // &Ao -> &Aog - case 135: state = 136; break; // &ao -> &aog - case 174: state = 175; break; // &Arin -> Å - case 178: state = 179; break; // &arin -> å - case 187: state = 188; break; // &Assi -> &Assig - case 228: state = 229; break; // &backcon -> &backcong - case 267: state = 268; break; // &barwed -> &barwedg - case 279: state = 280; break; // &bcon -> &bcong - case 333: state = 334; break; // &bi -> &big - case 368: state = 369; break; // &bigtrian -> &bigtriang - case 388: state = 389; break; // &bigwed -> &bigwedg - case 404: state = 405; break; // &blacklozen -> &blacklozeng - case 417: state = 418; break; // &blacktrian -> &blacktriang - case 430: state = 431; break; // &blacktriangleri -> &blacktrianglerig - case 749: state = 750; break; // &circlearrowri -> &circlearrowrig - case 821: state = 822; break; // &ClockwiseContourInte -> &ClockwiseContourInteg - case 883: state = 884; break; // &con -> &cong - case 888: state = 889; break; // &Con -> &Cong - case 908: state = 909; break; // &ContourInte -> &ContourInteg - case 956: state = 957; break; // &CounterClockwiseContourInte -> &CounterClockwiseContourInteg - case 1048: state = 1049; break; // &curlywed -> &curlywedg - case 1066: state = 1067; break; // &curvearrowri -> &curvearrowrig - case 1092: state = 1093; break; // &Da -> &Dag - case 1093: state = 1094; break; // &Dag -> &Dagg - case 1098: state = 1099; break; // &da -> &dag - case 1099: state = 1100; break; // &dag -> &dagg - case 1143: state = 1144; break; // &dda -> &ddag - case 1144: state = 1145; break; // &ddag -> &ddagg - case 1161: state = 1162; break; // &de -> ° - case 1228: state = 1255; break; // &di -> &dig - case 1340: state = 1341; break; // &doublebarwed -> &doublebarwedg - case 1357: state = 1358; break; // &DoubleContourInte -> &DoubleContourInteg - case 1382: state = 1383; break; // &DoubleLeftRi -> &DoubleLeftRig - case 1395: state = 1396; break; // &DoubleLon -> &DoubleLong - case 1407: state = 1408; break; // &DoubleLongLeftRi -> &DoubleLongLeftRig - case 1417: state = 1418; break; // &DoubleLongRi -> &DoubleLongRig - case 1427: state = 1428; break; // &DoubleRi -> &DoubleRig - case 1522: state = 1523; break; // &downharpoonri -> &downharpoonrig - case 1531: state = 1532; break; // &DownLeftRi -> &DownLeftRig - case 1560: state = 1561; break; // &DownRi -> &DownRig - case 1640: state = 1641; break; // &dwan -> &dwang - case 1650: state = 1651; break; // &dzi -> &dzig - case 1656: state = 1715; break; // &E -> &Eg - case 1662: state = 1714; break; // &e -> &eg - case 1797: state = 1798; break; // &en -> &eng - case 1801: state = 1802; break; // &Eo -> &Eog - case 1805: state = 1806; break; // &eo -> &eog - case 1848: state = 1849; break; // &eqslant -> &eqslantg - case 1969: state = 1970; break; // &fallin -> &falling - case 1990: state = 1991; break; // &ffili -> &ffilig - case 1993: state = 1994; break; // &ffli -> &fflig - case 1996: state = 1997; break; // &fflli -> &ffllig - case 2003: state = 2004; break; // &fili -> &filig - case 2038: state = 2039; break; // &fjli -> &fjlig - case 2044: state = 2045; break; // &flli -> &fllig - case 2118: state = 2192; break; // &g -> &gg - case 2124: state = 2191; break; // &G -> &Gg - case 2192: state = 2193; break; // &gg -> &ggg - case 2460: state = 2461; break; // &hookri -> &hookrig - case 2533: state = 2572; break; // &I -> &Ig - case 2539: state = 2577; break; // &i -> &ig - case 2598: state = 2599; break; // &IJli -> &IJlig - case 2602: state = 2603; break; // &ijli -> &ijlig - case 2605: state = 2614; break; // &Ima -> &Imag - case 2609: state = 2612; break; // &ima -> &imag - case 2662: state = 2663; break; // &inte -> &integ - case 2667: state = 2668; break; // &Inte -> &Integ - case 2713: state = 2720; break; // &io -> &iog - case 2716: state = 2717; break; // &Io -> &Iog - case 2830: state = 2852; break; // &k -> &kg - case 2881: state = 3388; break; // &l -> &lg - case 2892: state = 2903; break; // &la -> &lag - case 2915: state = 2916; break; // &Lan -> &Lang - case 2917: state = 2918; break; // &lan -> &lang - case 3031: state = 3282; break; // &lE -> &lEg - case 3032: state = 3283; break; // &le -> &leg - case 3037: state = 3038; break; // &LeftAn -> &LeftAng - case 3068: state = 3069; break; // &LeftArrowRi -> &LeftArrowRig - case 3086: state = 3087; break; // &LeftCeilin -> &LeftCeiling - case 3150: state = 3151; break; // &LeftRi -> &LeftRig - case 3160: state = 3161; break; // &Leftri -> &Leftrig - case 3170: state = 3171; break; // &leftri -> &leftrig - case 3191: state = 3192; break; // &leftrightsqui -> &leftrightsquig - case 3231: state = 3232; break; // &LeftTrian -> &LeftTriang - case 3291: state = 3299; break; // &les -> &lesg - case 3302: state = 3351; break; // &less -> &lessg - case 3313: state = 3314; break; // &lesseq -> &lesseqg - case 3317: state = 3318; break; // &lesseqq -> &lesseqqg - case 3468: state = 3469; break; // &loan -> &loang - case 3476: state = 3477; break; // &Lon -> &Long - case 3496: state = 3497; break; // &lon -> &long - case 3508: state = 3509; break; // &LongLeftRi -> &LongLeftRig - case 3518: state = 3519; break; // &Longleftri -> &Longleftrig - case 3528: state = 3529; break; // &longleftri -> &longleftrig - case 3544: state = 3545; break; // &LongRi -> &LongRig - case 3554: state = 3555; break; // &Longri -> &Longrig - case 3564: state = 3565; break; // &longri -> &longrig - case 3585: state = 3586; break; // &looparrowri -> &looparrowrig - case 3623: state = 3624; break; // &LowerRi -> &LowerRig - case 3634: state = 3635; break; // &lozen -> &lozeng - case 3674: state = 3676; break; // &lsim -> &lsimg - case 3800: state = 3801; break; // &measuredan -> &measuredang - case 3897: state = 4081; break; // &n -> &ng - case 3912: state = 3913; break; // &nan -> &nang - case 3957: state = 3958; break; // &ncon -> &ncong - case 3984: state = 3985; break; // &Ne -> &Neg - case 4092: state = 4093; break; // &nG -> &nGg - case 4149: state = 4150; break; // &nLeftri -> &nLeftrig - case 4159: state = 4160; break; // &nleftri -> &nleftrig - case 4203: state = 4204; break; // &NonBreakin -> &NonBreaking - case 4219: state = 4220; break; // &NotCon -> &NotCong - case 4351: state = 4352; break; // &NotLeftTrian -> &NotLeftTriang - case 4467: state = 4468; break; // &NotRi -> &NotRig - case 4475: state = 4476; break; // &NotRightTrian -> &NotRightTriang - case 4631: state = 4632; break; // &nRi -> &nRig - case 4640: state = 4641; break; // &nri -> &nrig - case 4718: state = 4719; break; // &nt -> &ntg - case 4730: state = 4731; break; // &ntl -> &ntlg - case 4735: state = 4736; break; // &ntrian -> &ntriang - case 4746: state = 4747; break; // &ntriangleri -> &ntrianglerig - case 4760: state = 4780; break; // &nv -> &nvg - case 4827: state = 4890; break; // &O -> &Og - case 4833: state = 4887; break; // &o -> &og - case 4874: state = 4875; break; // &OEli -> &OElig - case 4878: state = 4879; break; // &oeli -> &oelig - case 4931: state = 4932; break; // &Ome -> &Omeg - case 4934: state = 4935; break; // &ome -> &omeg - case 5002: state = 5003; break; // &ori -> &orig - case 5423: state = 5424; break; // &Ran -> &Rang - case 5425: state = 5426; break; // &ran -> &rang - case 5541: state = 5556; break; // &re -> ® - case 5617: state = 5618; break; // &Ri -> &Rig - case 5622: state = 5623; break; // &RightAn -> &RightAng - case 5642: state = 5643; break; // &ri -> &rig - case 5672: state = 5673; break; // &RightCeilin -> &RightCeiling - case 5744: state = 5745; break; // &rightri -> &rightrig - case 5757: state = 5758; break; // &rightsqui -> &rightsquig - case 5791: state = 5792; break; // &RightTrian -> &RightTriang - case 5842: state = 5843; break; // &rin -> &ring - case 5846: state = 5847; break; // &risin -> &rising - case 5877: state = 5878; break; // &roan -> &roang - case 5911: state = 5912; break; // &rpar -> &rparg - case 5925: state = 5926; break; // &Rri -> &Rrig - case 6141: state = 6142; break; // &ShortRi -> &ShortRig - case 6158: state = 6159; break; // &Si -> &Sig - case 6162: state = 6163; break; // &si -> &sig - case 6168: state = 6174; break; // &sim -> &simg - case 6365: state = 6366; break; // &strai -> &straig - case 6497: state = 6498; break; // &sun -> &sung - case 6581: state = 6582; break; // &szli -> ß - case 6588: state = 6589; break; // &tar -> &targ - case 6766: state = 6767; break; // &trian -> &triang - case 6782: state = 6783; break; // &triangleri -> &trianglerig - case 6864: state = 6865; break; // &twoheadri -> &twoheadrig - case 6873: state = 6944; break; // &U -> &Ug - case 6879: state = 6949; break; // &u -> &ug - case 7019: state = 7020; break; // &Uo -> &Uog - case 7023: state = 7024; break; // &uo -> &uog - case 7110: state = 7111; break; // &upharpoonri -> &upharpoonrig - case 7130: state = 7131; break; // &UpperRi -> &UpperRig - case 7178: state = 7179; break; // &Urin -> &Uring - case 7181: state = 7182; break; // &urin -> &uring - case 7219: state = 7220; break; // &uwan -> &uwang - case 7225: state = 7226; break; // &van -> &vang - case 7247: state = 7248; break; // &varnothin -> &varnothing - case 7265: state = 7266; break; // &varsi -> &varsig - case 7294: state = 7295; break; // &vartrian -> &vartriang - case 7303: state = 7304; break; // &vartriangleri -> &vartrianglerig - case 7442: state = 7443; break; // &vzi -> &vzig - case 7445: state = 7446; break; // &vzigza -> &vzigzag - case 7458: state = 7466; break; // &wed -> &wedg - case 7463: state = 7464; break; // &Wed -> &Wedg - case 7581: state = 7582; break; // &xwed -> &xwedg - case 7707: state = 7708; break; // &zi -> &zig + case 0: state = 2701; break; // & -> &g + case 1: state = 67; break; // &A -> &Ag + case 8: state = 73; break; // &a -> &ag + case 52: state = 53; break; // &AEli -> Æ + case 57: state = 58; break; // &aeli -> æ + case 108: state = 109; break; // &amal -> &amalg + case 119: state = 136; break; // &an -> &ang + case 147: state = 160; break; // &angmsda -> &angmsdag + case 183: state = 184; break; // &Ao -> &Aog + case 188: state = 189; break; // &ao -> &aog + case 239: state = 240; break; // &Arin -> Å + case 244: state = 245; break; // &arin -> å + case 256: state = 257; break; // &Assi -> &Assig + case 307: state = 308; break; // &backcon -> &backcong + case 355: state = 357; break; // &barwed -> &barwedg + case 371: state = 372; break; // &bcon -> &bcong + case 442: state = 443; break; // &bi -> &big + case 485: state = 486; break; // &bigtrian -> &bigtriang + case 509: state = 510; break; // &bigwed -> &bigwedg + case 527: state = 528; break; // &blacklozen -> &blacklozeng + case 542: state = 543; break; // &blacktrian -> &blacktriang + case 558: state = 559; break; // &blacktriangleri -> &blacktrianglerig + case 999: state = 1000; break; // &circlearrowri -> &circlearrowrig + case 1086: state = 1087; break; // &ClockwiseContourInte -> &ClockwiseContourInteg + case 1164: state = 1165; break; // &con -> &cong + case 1171: state = 1172; break; // &Con -> &Cong + case 1194: state = 1195; break; // &ContourInte -> &ContourInteg + case 1250: state = 1251; break; // &CounterClockwiseContourInte -> &CounterClockwiseContourInteg + case 1373: state = 1374; break; // &curlywed -> &curlywedg + case 1394: state = 1395; break; // &curvearrowri -> &curvearrowrig + case 1426: state = 1427; break; // &Da -> &Dag + case 1427: state = 1428; break; // &Dag -> &Dagg + case 1433: state = 1434; break; // &da -> &dag + case 1434: state = 1435; break; // &dag -> &dagg + case 1494: state = 1495; break; // &dda -> &ddag + case 1495: state = 1496; break; // &ddag -> &ddagg + case 1516: state = 1517; break; // &de -> ° + case 1599: state = 1633; break; // &di -> &dig + case 1740: state = 1741; break; // &doublebarwed -> &doublebarwedg + case 1758: state = 1759; break; // &DoubleContourInte -> &DoubleContourInteg + case 1787: state = 1788; break; // &DoubleLeftRi -> &DoubleLeftRig + case 1802: state = 1803; break; // &DoubleLon -> &DoubleLong + case 1815: state = 1816; break; // &DoubleLongLeftRi -> &DoubleLongLeftRig + case 1826: state = 1827; break; // &DoubleLongRi -> &DoubleLongRig + case 1837: state = 1838; break; // &DoubleRi -> &DoubleRig + case 1945: state = 1946; break; // &downharpoonri -> &downharpoonrig + case 1955: state = 1956; break; // &DownLeftRi -> &DownLeftRig + case 1988: state = 1989; break; // &DownRi -> &DownRig + case 2088: state = 2089; break; // &dwan -> &dwang + case 2101: state = 2102; break; // &dzi -> &dzig + case 2108: state = 2187; break; // &E -> &Eg + case 2115: state = 2185; break; // &e -> &eg + case 2290: state = 2291; break; // &en -> &eng + case 2296: state = 2297; break; // &Eo -> &Eog + case 2301: state = 2302; break; // &eo -> &eog + case 2357: state = 2358; break; // &eqslant -> &eqslantg + case 2508: state = 2509; break; // &fallin -> &falling + case 2533: state = 2534; break; // &ffili -> &ffilig + case 2537: state = 2538; break; // &ffli -> &fflig + case 2541: state = 2542; break; // &fflli -> &ffllig + case 2551: state = 2552; break; // &fili -> &filig + case 2589: state = 2590; break; // &fjli -> &fjlig + case 2597: state = 2598; break; // &flli -> &fllig + case 2701: state = 2807; break; // &g -> &gg + case 2708: state = 2805; break; // &G -> &Gg + case 2807: state = 2809; break; // &gg -> &ggg + case 3149: state = 3150; break; // &hookri -> &hookrig + case 3236: state = 3289; break; // &I -> &Ig + case 3243: state = 3295; break; // &i -> &ig + case 3322: state = 3323; break; // &IJli -> &IJlig + case 3327: state = 3328; break; // &ijli -> &ijlig + case 3332: state = 3344; break; // &Ima -> &Imag + case 3337: state = 3341; break; // &ima -> &imag + case 3407: state = 3408; break; // &inte -> &integ + case 3413: state = 3414; break; // &Inte -> &Integ + case 3467: state = 3476; break; // &io -> &iog + case 3471: state = 3472; break; // &Io -> &Iog + case 3624: state = 3654; break; // &k -> &kg + case 3692: state = 4317; break; // &l -> &lg + case 3705: state = 3718; break; // &la -> &lag + case 3733: state = 3734; break; // &Lan -> &Lang + case 3736: state = 3737; break; // &lan -> &lang + case 3894: state = 4183; break; // &lE -> &lEg + case 3896: state = 4185; break; // &le -> &leg + case 3902: state = 3903; break; // &LeftAn -> &LeftAng + case 3938: state = 3939; break; // &LeftArrowRi -> &LeftArrowRig + case 3958: state = 3959; break; // &LeftCeilin -> &LeftCeiling + case 4031: state = 4032; break; // &LeftRi -> &LeftRig + case 4042: state = 4043; break; // &Leftri -> &Leftrig + case 4053: state = 4054; break; // &leftri -> &leftrig + case 4077: state = 4078; break; // &leftrightsqui -> &leftrightsquig + case 4123: state = 4124; break; // &LeftTrian -> &LeftTriang + case 4197: state = 4210; break; // &les -> &lesg + case 4215: state = 4271; break; // &less -> &lessg + case 4228: state = 4229; break; // &lesseq -> &lesseqg + case 4233: state = 4234; break; // &lesseqq -> &lesseqqg + case 4424: state = 4425; break; // &loan -> &loang + case 4435: state = 4436; break; // &Lon -> &Long + case 4457: state = 4458; break; // &lon -> &long + case 4470: state = 4471; break; // &LongLeftRi -> &LongLeftRig + case 4481: state = 4482; break; // &Longleftri -> &Longleftrig + case 4492: state = 4493; break; // &longleftri -> &longleftrig + case 4510: state = 4511; break; // &LongRi -> &LongRig + case 4521: state = 4522; break; // &Longri -> &Longrig + case 4532: state = 4533; break; // &longri -> &longrig + case 4555: state = 4556; break; // &looparrowri -> &looparrowrig + case 4602: state = 4603; break; // &LowerRi -> &LowerRig + case 4615: state = 4616; break; // &lozen -> &lozeng + case 4670: state = 4674; break; // &lsim -> &lsimg + case 4838: state = 4839; break; // &measuredan -> &measuredang + case 4965: state = 5195; break; // &n -> &ng + case 4983: state = 4984; break; // &nan -> &nang + case 5045: state = 5046; break; // &ncon -> &ncong + case 5084: state = 5085; break; // &Ne -> &Neg + case 5212: state = 5213; break; // &nG -> &nGg + case 5291: state = 5292; break; // &nLeftri -> &nLeftrig + case 5302: state = 5303; break; // &nleftri -> &nleftrig + case 5361: state = 5362; break; // &NonBreakin -> &NonBreaking + case 5382: state = 5383; break; // &NotCon -> &NotCong + case 5536: state = 5537; break; // &NotLeftTrian -> &NotLeftTriang + case 5671: state = 5672; break; // &NotRi -> &NotRig + case 5679: state = 5680; break; // &NotRightTrian -> &NotRightTriang + case 5869: state = 5870; break; // &nRi -> &nRig + case 5879: state = 5880; break; // &nri -> &nrig + case 5988: state = 5989; break; // &nt -> &ntg + case 6003: state = 6004; break; // &ntl -> &ntlg + case 6009: state = 6010; break; // &ntrian -> &ntriang + case 6022: state = 6023; break; // &ntriangleri -> &ntrianglerig + case 6043: state = 6068; break; // &nv -> &nvg + case 6131: state = 6214; break; // &O -> &Og + case 6138: state = 6210; break; // &o -> &og + case 6192: state = 6193; break; // &OEli -> &OElig + case 6197: state = 6198; break; // &oeli -> &oelig + case 6268: state = 6269; break; // &Ome -> &Omeg + case 6272: state = 6273; break; // &ome -> &omeg + case 6360: state = 6361; break; // &ori -> &orig + case 6908: state = 6909; break; // &Ran -> &Rang + case 6911: state = 6912; break; // &ran -> &rang + case 7074: state = 7095; break; // &re -> ® + case 7171: state = 7172; break; // &Ri -> &Rig + case 7176: state = 7177; break; // &RightAn -> &RightAng + case 7199: state = 7200; break; // &ri -> &rig + case 7233: state = 7234; break; // &RightCeilin -> &RightCeiling + case 7315: state = 7316; break; // &rightri -> &rightrig + case 7329: state = 7330; break; // &rightsqui -> &rightsquig + case 7368: state = 7369; break; // &RightTrian -> &RightTriang + case 7428: state = 7429; break; // &rin -> &ring + case 7433: state = 7434; break; // &risin -> &rising + case 7471: state = 7472; break; // &roan -> &roang + case 7514: state = 7516; break; // &rpar -> &rparg + case 7532: state = 7533; break; // &Rri -> &Rrig + case 7813: state = 7814; break; // &ShortRi -> &ShortRig + case 7833: state = 7834; break; // &Si -> &Sig + case 7838: state = 7839; break; // &si -> &sig + case 7847: state = 7857; break; // &sim -> &simg + case 8108: state = 8109; break; // &strai -> &straig + case 8279: state = 8280; break; // &sun -> &sung + case 8397: state = 8398; break; // &szli -> ß + case 8406: state = 8407; break; // &tar -> &targ + case 8635: state = 8636; break; // &trian -> &triang + case 8656: state = 8657; break; // &triangleri -> &trianglerig + case 8758: state = 8759; break; // &twoheadri -> &twoheadrig + case 8768: state = 8860; break; // &U -> &Ug + case 8775: state = 8866; break; // &u -> &ug + case 8954: state = 8955; break; // &Uo -> &Uog + case 8959: state = 8960; break; // &uo -> &uog + case 9059: state = 9060; break; // &upharpoonri -> &upharpoonrig + case 9082: state = 9083; break; // &UpperRi -> &UpperRig + case 9142: state = 9143; break; // &Urin -> &Uring + case 9146: state = 9147; break; // &urin -> &uring + case 9196: state = 9197; break; // &uwan -> &uwang + case 9203: state = 9204; break; // &van -> &vang + case 9228: state = 9229; break; // &varnothin -> &varnothing + case 9253: state = 9254; break; // &varsi -> &varsig + case 9288: state = 9289; break; // &vartrian -> &vartriang + case 9298: state = 9299; break; // &vartriangleri -> &vartrianglerig + case 9478: state = 9479; break; // &vzi -> &vzig + case 9481: state = 9482; break; // &vzigza -> &vzigzag + case 9497: state = 9507; break; // &wed -> &wedg + case 9503: state = 9504; break; // &Wed -> &Wedg + case 9661: state = 9662; break; // &xwed -> &xwedg + case 9825: state = 9826; break; // &zi -> &zig default: return false; } break; case 'h': switch (state) { - case 0: state = 2356; break; // & -> &h - case 66: state = 67; break; // &alep -> &aleph - case 69: state = 70; break; // &Alp -> &Alph - case 72: state = 73; break; // &alp -> &alph - case 109: state = 117; break; // &angmsda -> &angmsdah - case 124: state = 125; break; // &angsp -> &angsph - case 254: state = 255; break; // &Backslas -> &Backslash - case 322: state = 324; break; // &bet -> &beth - case 431: state = 432; break; // &blacktrianglerig -> &blacktrianglerigh - case 470: state = 485; break; // &box -> &boxh - case 518: state = 521; break; // &boxV -> &boxVh - case 519: state = 523; break; // &boxv -> &boxvh - case 562: state = 564; break; // &bsol -> &bsolh - case 583: state = 729; break; // &C -> &Ch - case 589: state = 719; break; // &c -> &ch - case 750: state = 751; break; // &circlearrowrig -> &circlearrowrigh - case 763: state = 764; break; // &circleddas -> &circleddash - case 1067: state = 1068; break; // &curvearrowrig -> &curvearrowrigh - case 1097: state = 1186; break; // &d -> &dh - case 1105: state = 1106; break; // &dalet -> &daleth - case 1114: state = 1115; break; // &das -> &dash - case 1116: state = 1117; break; // &Das -> &Dash - case 1153: state = 1154; break; // &DDotra -> &DDotrah - case 1177: state = 1178; break; // &dfis -> &dfish - case 1383: state = 1384; break; // &DoubleLeftRig -> &DoubleLeftRigh - case 1408: state = 1409; break; // &DoubleLongLeftRig -> &DoubleLongLeftRigh - case 1418: state = 1419; break; // &DoubleLongRig -> &DoubleLongRigh - case 1428: state = 1429; break; // &DoubleRig -> &DoubleRigh - case 1479: state = 1510; break; // &down -> &downh - case 1523: state = 1524; break; // &downharpoonrig -> &downharpoonrigh - case 1532: state = 1533; break; // &DownLeftRig -> &DownLeftRigh - case 1561: state = 1562; break; // &DownRig -> &DownRigh - case 1631: state = 1635; break; // &du -> &duh - case 1912: state = 1916; break; // &et -> ð - case 2445: state = 2446; break; // &homt -> &homth - case 2461: state = 2462; break; // &hookrig -> &hookrigh - case 2498: state = 2499; break; // &hslas -> &hslash - case 2529: state = 2530; break; // &hyp -> &hyph - case 2629: state = 2630; break; // &imat -> &imath - case 2686: state = 2687; break; // &intlar -> &intlarh - case 2795: state = 2796; break; // &jmat -> &jmath - case 2830: state = 2860; break; // &k -> &kh - case 2881: state = 3393; break; // &l -> &lh - case 2939: state = 2945; break; // &larr -> &larrh - case 3020: state = 3021; break; // &ldrd -> &ldrdh - case 3025: state = 3026; break; // &ldrus -> &ldrush - case 3029: state = 3030; break; // &lds -> &ldsh - case 3058: state = 3126; break; // &left -> &lefth - case 3069: state = 3070; break; // &LeftArrowRig -> &LeftArrowRigh - case 3151: state = 3152; break; // &LeftRig -> &LeftRigh - case 3161: state = 3162; break; // &Leftrig -> &Leftrigh - case 3171: state = 3172; break; // &leftrig -> &leftrigh - case 3173: state = 3180; break; // &leftright -> &leftrighth - case 3218: state = 3219; break; // &leftt -> &leftth - case 3378: state = 3379; break; // &lfis -> &lfish - case 3409: state = 3427; break; // &ll -> &llh - case 3449: state = 3450; break; // &lmoustac -> &lmoustach - case 3509: state = 3510; break; // &LongLeftRig -> &LongLeftRigh - case 3519: state = 3520; break; // &Longleftrig -> &Longleftrigh - case 3529: state = 3530; break; // &longleftrig -> &longleftrigh - case 3545: state = 3546; break; // &LongRig -> &LongRigh - case 3555: state = 3556; break; // &Longrig -> &Longrigh - case 3565: state = 3566; break; // &longrig -> &longrigh - case 3586: state = 3587; break; // &looparrowrig -> &looparrowrigh - case 3624: state = 3625; break; // &LowerRig -> &LowerRigh - case 3643: state = 3653; break; // &lr -> &lrh - case 3661: state = 3672; break; // &ls -> &lsh - case 3666: state = 3671; break; // &Ls -> &Lsh - case 3692: state = 3700; break; // < -> <h - case 3727: state = 3728; break; // &lurds -> &lurdsh - case 3731: state = 3732; break; // &luru -> &luruh - case 3745: state = 3825; break; // &m -> &mh - case 3786: state = 3787; break; // &mdas -> &mdash - case 3897: state = 4101; break; // &n -> &nh - case 3968: state = 3969; break; // &ndas -> &ndash - case 3972: state = 3973; break; // &near -> &nearh - case 4002: state = 4003; break; // &NegativeT -> &NegativeTh - case 4022: state = 4023; break; // &NegativeVeryT -> &NegativeVeryTh - case 4150: state = 4151; break; // &nLeftrig -> &nLeftrigh - case 4160: state = 4161; break; // &nleftrig -> &nleftrigh - case 4468: state = 4469; break; // &NotRig -> &NotRigh - case 4632: state = 4633; break; // &nRig -> &nRigh - case 4641: state = 4642; break; // &nrig -> &nrigh - case 4653: state = 4663; break; // &ns -> &nsh - case 4747: state = 4748; break; // &ntrianglerig -> &ntrianglerigh - case 4766: state = 4767; break; // &nVDas -> &nVDash - case 4770: state = 4771; break; // &nVdas -> &nVdash - case 4774: state = 4775; break; // &nvDas -> &nvDash - case 4778: state = 4779; break; // &nvdas -> &nvdash - case 4814: state = 4815; break; // &nwar -> &nwarh - case 4833: state = 4900; break; // &o -> &oh - case 4853: state = 4854; break; // &odas -> &odash - case 5023: state = 5024; break; // &Oslas -> Ø - case 5027: state = 5028; break; // &oslas -> ø - case 5077: state = 5078; break; // &OverParent -> &OverParenth - case 5083: state = 5130; break; // &p -> &ph - case 5096: state = 5128; break; // &P -> &Ph - case 5143: state = 5144; break; // &pitc -> &pitch - case 5154: state = 5155; break; // &planck -> &planckh - case 5397: state = 5607; break; // &r -> &rh - case 5405: state = 5613; break; // &R -> &Rh - case 5439: state = 5448; break; // &rarr -> &rarrh - case 5530: state = 5531; break; // &rdld -> &rdldh - case 5538: state = 5539; break; // &rds -> &rdsh - case 5594: state = 5595; break; // &rfis -> &rfish - case 5618: state = 5619; break; // &Rig -> &Righ - case 5643: state = 5644; break; // &rig -> &righ - case 5645: state = 5712; break; // &right -> &righth - case 5728: state = 5735; break; // &rightleft -> &rightlefth - case 5745: state = 5746; break; // &rightrig -> &rightrigh - case 5778: state = 5779; break; // &rightt -> &rightth - case 5854: state = 5858; break; // &rl -> &rlh - case 5868: state = 5869; break; // &rmoustac -> &rmoustach - case 5926: state = 5927; break; // &Rrig -> &Rrigh - case 5934: state = 5945; break; // &rs -> &rsh - case 5939: state = 5944; break; // &Rs -> &Rsh - case 5951: state = 5952; break; // &rt -> &rth - case 5980: state = 5981; break; // &rulu -> &ruluh - case 5985: state = 6104; break; // &S -> &Sh - case 5991: state = 6088; break; // &s -> &sh - case 6055: state = 6056; break; // &sear -> &searh - case 6097: state = 6098; break; // &shc -> &shch - case 6142: state = 6143; break; // &ShortRig -> &ShortRigh - case 6214: state = 6215; break; // &smas -> &smash - case 6366: state = 6367; break; // &straig -> &straigh - case 6376: state = 6377; break; // &straightp -> &straightph - case 6446: state = 6490; break; // &Suc -> &Such - case 6491: state = 6492; break; // &SuchT -> &SuchTh - case 6500: state = 6525; break; // &sup -> &suph - case 6566: state = 6567; break; // &swar -> &swarh - case 6583: state = 6634; break; // &T -> &Th - case 6586: state = 6629; break; // &t -> &th - case 6783: state = 6784; break; // &trianglerig -> &trianglerigh - case 6824: state = 6834; break; // &ts -> &tsh - case 6849: state = 6850; break; // &two -> &twoh - case 6865: state = 6866; break; // &twoheadrig -> &twoheadrigh - case 6879: state = 6957; break; // &u -> &uh - case 6920: state = 6933; break; // &ud -> &udh - case 6938: state = 6939; break; // &ufis -> &ufish - case 7006: state = 7007; break; // &UnderParent -> &UnderParenth - case 7042: state = 7098; break; // &up -> &uph - case 7111: state = 7112; break; // &upharpoonrig -> &upharpoonrigh - case 7131: state = 7132; break; // &UpperRig -> &UpperRigh - case 7142: state = 7143; break; // &upsi -> &upsih - case 7244: state = 7245; break; // &varnot -> &varnoth - case 7249: state = 7250; break; // &varp -> &varph - case 7261: state = 7262; break; // &varr -> &varrh - case 7286: state = 7287; break; // &vart -> &varth - case 7304: state = 7305; break; // &vartrianglerig -> &vartrianglerigh - case 7321: state = 7322; break; // &VDas -> &VDash - case 7325: state = 7326; break; // &Vdas -> &Vdash - case 7329: state = 7330; break; // &vDas -> &vDash - case 7333: state = 7334; break; // &vdas -> &vdash - case 7385: state = 7386; break; // &VeryT -> &VeryTh - case 7439: state = 7440; break; // &Vvdas -> &Vvdash - case 7487: state = 7488; break; // &wreat -> &wreath - case 7495: state = 7513; break; // &x -> &xh - case 7651: state = 7704; break; // &z -> &zh - case 7686: state = 7687; break; // &ZeroWidt -> &ZeroWidth + case 0: state = 3020; break; // & -> &h + case 86: state = 87; break; // &alep -> &aleph + case 90: state = 91; break; // &Alp -> &Alph + case 94: state = 95; break; // &alp -> &alph + case 147: state = 162; break; // &angmsda -> &angmsdah + case 173: state = 174; break; // &angsp -> &angsph + case 338: state = 339; break; // &Backslas -> &Backslash + case 426: state = 429; break; // &bet -> &beth + case 559: state = 560; break; // &blacktrianglerig -> &blacktrianglerigh + case 613: state = 638; break; // &box -> &boxh + case 691: state = 697; break; // &boxV -> &boxVh + case 693: state = 701; break; // &boxv -> &boxvh + case 758: state = 762; break; // &bsol -> &bsolh + case 789: state = 973; break; // &C -> &Ch + case 796: state = 960; break; // &c -> &ch + case 1000: state = 1001; break; // &circlearrowrig -> &circlearrowrigh + case 1016: state = 1017; break; // &circleddas -> &circleddash + case 1395: state = 1396; break; // &curvearrowrig -> &curvearrowrigh + case 1432: state = 1550; break; // &d -> &dh + case 1441: state = 1442; break; // &dalet -> &daleth + case 1454: state = 1455; break; // &das -> &dash + case 1457: state = 1458; break; // &Das -> &Dash + case 1506: state = 1507; break; // &DDotra -> &DDotrah + case 1537: state = 1538; break; // &dfis -> &dfish + case 1788: state = 1789; break; // &DoubleLeftRig -> &DoubleLeftRigh + case 1816: state = 1817; break; // &DoubleLongLeftRig -> &DoubleLongLeftRigh + case 1827: state = 1828; break; // &DoubleLongRig -> &DoubleLongRigh + case 1838: state = 1839; break; // &DoubleRig -> &DoubleRigh + case 1896: state = 1932; break; // &down -> &downh + case 1946: state = 1947; break; // &downharpoonrig -> &downharpoonrigh + case 1956: state = 1957; break; // &DownLeftRig -> &DownLeftRigh + case 1989: state = 1990; break; // &DownRig -> &DownRigh + case 2077: state = 2082; break; // &du -> &duh + case 2439: state = 2445; break; // &et -> ð + case 3132: state = 3133; break; // &homt -> &homth + case 3150: state = 3151; break; // &hookrig -> &hookrigh + case 3194: state = 3195; break; // &hslas -> &hslash + case 3231: state = 3232; break; // &hyp -> &hyph + case 3362: state = 3363; break; // &imat -> &imath + case 3435: state = 3436; break; // &intlar -> &intlarh + case 3579: state = 3580; break; // &jmat -> &jmath + case 3624: state = 3664; break; // &k -> &kh + case 3692: state = 4325; break; // &l -> &lh + case 3766: state = 3776; break; // &larr -> &larrh + case 3880: state = 3881; break; // &ldrd -> &ldrdh + case 3886: state = 3887; break; // &ldrus -> &ldrush + case 3891: state = 3892; break; // &lds -> &ldsh + case 3926: state = 4004; break; // &left -> &lefth + case 3939: state = 3940; break; // &LeftArrowRig -> &LeftArrowRigh + case 4032: state = 4033; break; // &LeftRig -> &LeftRigh + case 4043: state = 4044; break; // &Leftrig -> &Leftrigh + case 4054: state = 4055; break; // &leftrig -> &leftrigh + case 4056: state = 4065; break; // &leftright -> &leftrighth + case 4109: state = 4110; break; // &leftt -> &leftth + case 4303: state = 4304; break; // &lfis -> &lfish + case 4348: state = 4370; break; // &ll -> &llh + case 4397: state = 4398; break; // &lmoustac -> &lmoustach + case 4471: state = 4472; break; // &LongLeftRig -> &LongLeftRigh + case 4482: state = 4483; break; // &Longleftrig -> &Longleftrigh + case 4493: state = 4494; break; // &longleftrig -> &longleftrigh + case 4511: state = 4512; break; // &LongRig -> &LongRigh + case 4522: state = 4523; break; // &Longrig -> &Longrigh + case 4533: state = 4534; break; // &longrig -> &longrigh + case 4556: state = 4557; break; // &looparrowrig -> &looparrowrigh + case 4603: state = 4604; break; // &LowerRig -> &LowerRigh + case 4628: state = 4640; break; // &lr -> &lrh + case 4652: state = 4667; break; // &ls -> &lsh + case 4658: state = 4665; break; // &Ls -> &Lsh + case 4698: state = 4710; break; // < -> <h + case 4745: state = 4746; break; // &lurds -> &lurdsh + case 4750: state = 4751; break; // &luru -> &luruh + case 4767: state = 4868; break; // &m -> &mh + case 4822: state = 4823; break; // &mdas -> &mdash + case 4965: state = 5227; break; // &n -> &nh + case 5061: state = 5062; break; // &ndas -> &ndash + case 5067: state = 5068; break; // &near -> &nearh + case 5103: state = 5104; break; // &NegativeT -> &NegativeTh + case 5125: state = 5126; break; // &NegativeVeryT -> &NegativeVeryTh + case 5292: state = 5293; break; // &nLeftrig -> &nLeftrigh + case 5303: state = 5304; break; // &nleftrig -> &nleftrigh + case 5672: state = 5673; break; // &NotRig -> &NotRigh + case 5870: state = 5871; break; // &nRig -> &nRigh + case 5880: state = 5881; break; // &nrig -> &nrigh + case 5895: state = 5910; break; // &ns -> &nsh + case 6023: state = 6024; break; // &ntrianglerig -> &ntrianglerigh + case 6050: state = 6051; break; // &nVDas -> &nVDash + case 6055: state = 6056; break; // &nVdas -> &nVdash + case 6060: state = 6061; break; // &nvDas -> &nvDash + case 6065: state = 6066; break; // &nvdas -> &nvdash + case 6113: state = 6114; break; // &nwar -> &nwarh + case 6138: state = 6227; break; // &o -> &oh + case 6165: state = 6166; break; // &odas -> &odash + case 6388: state = 6389; break; // &Oslas -> Ø + case 6393: state = 6394; break; // &oslas -> ø + case 6456: state = 6457; break; // &OverParent -> &OverParenth + case 6463: state = 6527; break; // &p -> &ph + case 6482: state = 6524; break; // &P -> &Ph + case 6546: state = 6547; break; // &pitc -> &pitch + case 6559: state = 6561; break; // &planck -> &planckh + case 6876: state = 7155; break; // &r -> &rh + case 6886: state = 7164; break; // &R -> &Rh + case 6932: state = 6947; break; // &rarr -> &rarrh + case 7058: state = 7059; break; // &rdld -> &rdldh + case 7069: state = 7070; break; // &rds -> &rdsh + case 7137: state = 7138; break; // &rfis -> &rfish + case 7172: state = 7173; break; // &Rig -> &Righ + case 7200: state = 7201; break; // &rig -> &righ + case 7202: state = 7279; break; // &right -> &righth + case 7297: state = 7305; break; // &rightleft -> &rightlefth + case 7316: state = 7317; break; // &rightrig -> &rightrigh + case 7354: state = 7355; break; // &rightt -> &rightth + case 7442: state = 7447; break; // &rl -> &rlh + case 7460: state = 7461; break; // &rmoustac -> &rmoustach + case 7533: state = 7534; break; // &Rrig -> &Rrigh + case 7542: state = 7557; break; // &rs -> &rsh + case 7548: state = 7555; break; // &Rs -> &Rsh + case 7567: state = 7568; break; // &rt -> &rth + case 7603: state = 7604; break; // &rulu -> &ruluh + case 7610: state = 7772; break; // &S -> &Sh + case 7617: state = 7751; break; // &s -> &sh + case 7705: state = 7706; break; // &sear -> &searh + case 7762: state = 7763; break; // &shc -> &shch + case 7814: state = 7815; break; // &ShortRig -> &ShortRigh + case 7907: state = 7908; break; // &smas -> &smash + case 8109: state = 8110; break; // &straig -> &straigh + case 8120: state = 8121; break; // &straightp -> &straightph + case 8216: state = 8269; break; // &Suc -> &Such + case 8270: state = 8271; break; // &SuchT -> &SuchTh + case 8284: state = 8320; break; // &sup -> &suph + case 8377: state = 8378; break; // &swar -> &swarh + case 8400: state = 8467; break; // &T -> &Th + case 8404: state = 8461; break; // &t -> &th + case 8657: state = 8658; break; // &trianglerig -> &trianglerigh + case 8709: state = 8723; break; // &ts -> &tsh + case 8742: state = 8743; break; // &two -> &twoh + case 8759: state = 8760; break; // &twoheadrig -> &twoheadrigh + case 8775: state = 8876; break; // &u -> &uh + case 8829: state = 8845; break; // &ud -> &udh + case 8851: state = 8852; break; // &ufis -> &ufish + case 8938: state = 8939; break; // &UnderParent -> &UnderParenth + case 8983: state = 9046; break; // &up -> &uph + case 9060: state = 9061; break; // &upharpoonrig -> &upharpoonrigh + case 9083: state = 9084; break; // &UpperRig -> &UpperRigh + case 9096: state = 9098; break; // &upsi -> &upsih + case 9225: state = 9226; break; // &varnot -> &varnoth + case 9231: state = 9232; break; // &varp -> &varph + case 9247: state = 9249; break; // &varr -> &varrh + case 9279: state = 9280; break; // &vart -> &varth + case 9299: state = 9300; break; // &vartrianglerig -> &vartrianglerigh + case 9322: state = 9323; break; // &VDas -> &VDash + case 9327: state = 9328; break; // &Vdas -> &Vdash + case 9332: state = 9333; break; // &vDas -> &vDash + case 9337: state = 9338; break; // &vdas -> &vdash + case 9404: state = 9405; break; // &VeryT -> &VeryTh + case 9474: state = 9475; break; // &Vvdas -> &Vvdash + case 9537: state = 9538; break; // &wreat -> &wreath + case 9548: state = 9572; break; // &x -> &xh + case 9754: state = 9821; break; // &z -> &zh + case 9797: state = 9798; break; // &ZeroWidt -> &ZeroWidth default: return false; } break; case 'i': switch (state) { - case 0: state = 2539; break; // & -> &i - case 23: state = 30; break; // &ac -> &aci - case 26: state = 27; break; // &Ac -> &Aci - case 39: state = 40; break; // &AEl -> &AEli - case 43: state = 44; break; // &ael -> &aeli - case 143: state = 150; break; // &ap -> &api - case 145: state = 146; break; // &apac -> &apaci - case 162: state = 163; break; // &ApplyFunct -> &ApplyFuncti - case 172: state = 173; break; // &Ar -> &Ari - case 176: state = 177; break; // &ar -> &ari - case 186: state = 187; break; // &Ass -> &Assi - case 196: state = 197; break; // &At -> &Ati - case 201: state = 202; break; // &at -> &ati - case 212: state = 219; break; // &aw -> &awi - case 215: state = 216; break; // &awcon -> &awconi - case 222: state = 333; break; // &b -> &bi - case 232: state = 233; break; // &backeps -> &backepsi - case 238: state = 239; break; // &backpr -> &backpri - case 242: state = 243; break; // &backs -> &backsi - case 306: state = 307; break; // &beps -> &bepsi - case 317: state = 318; break; // &Bernoull -> &Bernoulli - case 335: state = 338; break; // &bigc -> &bigci - case 351: state = 352; break; // &bigot -> &bigoti - case 365: state = 366; break; // &bigtr -> &bigtri - case 414: state = 415; break; // &blacktr -> &blacktri - case 429: state = 430; break; // &blacktriangler -> &blacktriangleri - case 448: state = 449; break; // &bnequ -> &bnequi - case 467: state = 468; break; // &bowt -> &bowti - case 494: state = 495; break; // &boxm -> &boxmi - case 503: state = 504; break; // &boxt -> &boxti - case 533: state = 534; break; // &bpr -> &bpri - case 552: state = 558; break; // &bs -> &bsi - case 556: state = 557; break; // &bsem -> &bsemi - case 583: state = 765; break; // &C -> &Ci - case 589: state = 732; break; // &c -> &ci - case 595: state = 613; break; // &Cap -> &Capi - case 617: state = 618; break; // &CapitalD -> &CapitalDi - case 625: state = 626; break; // &CapitalDifferent -> &CapitalDifferenti - case 641: state = 664; break; // &cc -> &cci - case 645: state = 661; break; // &Cc -> &Cci - case 654: state = 655; break; // &Cced -> &Ccedi - case 658: state = 659; break; // &cced -> &ccedi - case 668: state = 669; break; // &Ccon -> &Cconi - case 684: state = 685; break; // &ced -> &cedi - case 688: state = 689; break; // &Ced -> &Cedi - case 719: state = 731; break; // &ch -> &chi - case 729: state = 730; break; // &Ch -> &Chi - case 748: state = 749; break; // &circlearrowr -> &circlearrowri - case 757: state = 758; break; // &circledc -> &circledci - case 775: state = 776; break; // &CircleM -> &CircleMi - case 784: state = 785; break; // &CircleT -> &CircleTi - case 792: state = 793; break; // &cirfn -> &cirfni - case 796: state = 797; break; // &cirm -> &cirmi - case 800: state = 801; break; // &cirsc -> &cirsci - case 807: state = 808; break; // &Clockw -> &Clockwi - case 853: state = 854; break; // &clubsu -> &clubsui - case 883: state = 898; break; // &con -> &coni - case 888: state = 895; break; // &Con -> &Coni - case 942: state = 943; break; // &CounterClockw -> &CounterClockwi - case 1065: state = 1066; break; // &curvearrowr -> &curvearrowri - case 1076: state = 1083; break; // &cw -> &cwi - case 1079: state = 1080; break; // &cwcon -> &cwconi - case 1091: state = 1191; break; // &D -> &Di - case 1097: state = 1228; break; // &d -> &di - case 1175: state = 1176; break; // &df -> &dfi - case 1194: state = 1195; break; // &Diacr -> &Diacri - case 1196: state = 1197; break; // &Diacrit -> &Diacriti - case 1223: state = 1224; break; // &DiacriticalT -> &DiacriticalTi - case 1239: state = 1240; break; // &diamondsu -> &diamondsui - case 1250: state = 1251; break; // &Different -> &Differenti - case 1260: state = 1261; break; // &dis -> &disi - case 1263: state = 1264; break; // &div -> &divi - case 1269: state = 1270; break; // ÷ont -> ÷onti - case 1316: state = 1317; break; // &dotm -> &dotmi - case 1381: state = 1382; break; // &DoubleLeftR -> &DoubleLeftRi - case 1406: state = 1407; break; // &DoubleLongLeftR -> &DoubleLongLeftRi - case 1416: state = 1417; break; // &DoubleLongR -> &DoubleLongRi - case 1426: state = 1427; break; // &DoubleR -> &DoubleRi - case 1458: state = 1459; break; // &DoubleVert -> &DoubleVerti - case 1521: state = 1522; break; // &downharpoonr -> &downharpoonri - case 1530: state = 1531; break; // &DownLeftR -> &DownLeftRi - case 1559: state = 1560; break; // &DownR -> &DownRi - case 1628: state = 1629; break; // &dtr -> &dtri - case 1647: state = 1650; break; // &dz -> &dzi - case 1672: state = 1684; break; // &Ec -> &Eci - case 1677: state = 1682; break; // &ec -> &eci - case 1728: state = 1735; break; // &el -> &eli - case 1821: state = 1822; break; // &eps -> &epsi - case 1824: state = 1825; break; // &Eps -> &Epsi - case 1834: state = 1835; break; // &eqc -> &eqci - case 1842: state = 1843; break; // &eqs -> &eqsi - case 1857: state = 1872; break; // &Equ -> &Equi - case 1860: state = 1880; break; // &equ -> &equi - case 1864: state = 1865; break; // &EqualT -> &EqualTi - case 1873: state = 1874; break; // &Equil -> &Equili - case 1876: state = 1877; break; // &Equilibr -> &Equilibri - case 1897: state = 1906; break; // &Es -> &Esi - case 1900: state = 1908; break; // &es -> &esi - case 1925: state = 1928; break; // &ex -> &exi - case 1931: state = 1932; break; // &Ex -> &Exi - case 1941: state = 1942; break; // &expectat -> &expectati - case 1950: state = 1951; break; // &Exponent -> &Exponenti - case 1959: state = 1960; break; // &exponent -> &exponenti - case 1964: state = 2001; break; // &f -> &fi - case 1967: state = 1968; break; // &fall -> &falli - case 1977: state = 2005; break; // &F -> &Fi - case 1987: state = 1988; break; // &ff -> &ffi - case 1989: state = 1990; break; // &ffil -> &ffili - case 1992: state = 1993; break; // &ffl -> &ffli - case 1995: state = 1996; break; // &ffll -> &fflli - case 2002: state = 2003; break; // &fil -> &fili - case 2037: state = 2038; break; // &fjl -> &fjli - case 2043: state = 2044; break; // &fll -> &flli - case 2069: state = 2070; break; // &Four -> &Fouri - case 2079: state = 2080; break; // &fpart -> &fparti - case 2118: state = 2194; break; // &g -> &gi - case 2145: state = 2150; break; // &Gc -> &Gci - case 2147: state = 2148; break; // &Gced -> &Gcedi - case 2153: state = 2154; break; // &gc -> &gci - case 2219: state = 2220; break; // &gns -> &gnsi - case 2277: state = 2278; break; // &GreaterT -> &GreaterTi - case 2285: state = 2288; break; // &gs -> &gsi - case 2295: state = 2297; break; // >c -> >ci - case 2338: state = 2339; break; // >rs -> >rsi - case 2351: state = 2417; break; // &H -> &Hi - case 2357: state = 2358; break; // &ha -> &hai - case 2364: state = 2365; break; // &ham -> &hami - case 2381: state = 2382; break; // &harrc -> &harrci - case 2389: state = 2390; break; // &Hc -> &Hci - case 2393: state = 2394; break; // &hc -> &hci - case 2402: state = 2403; break; // &heartsu -> &heartsui - case 2406: state = 2407; break; // &hell -> &helli - case 2459: state = 2460; break; // &hookr -> &hookri - case 2478: state = 2479; break; // &Hor -> &Hori - case 2486: state = 2487; break; // &HorizontalL -> &HorizontalLi - case 2539: state = 2582; break; // &i -> &ii - case 2545: state = 2550; break; // &ic -> &ici - case 2546: state = 2547; break; // &Ic -> &Ici - case 2582: state = 2583; break; // &ii -> &iii - case 2583: state = 2584; break; // &iii -> &iiii - case 2590: state = 2591; break; // &iinf -> &iinfi - case 2597: state = 2598; break; // &IJl -> &IJli - case 2601: state = 2602; break; // &ijl -> &ijli - case 2614: state = 2615; break; // &Imag -> &Imagi - case 2621: state = 2622; break; // &imagl -> &imagli - case 2637: state = 2638; break; // &Impl -> &Impli - case 2646: state = 2647; break; // &inf -> &infi - case 2649: state = 2650; break; // &infint -> &infinti - case 2680: state = 2681; break; // &Intersect -> &Intersecti - case 2693: state = 2694; break; // &Inv -> &Invi - case 2695: state = 2696; break; // &Invis -> &Invisi - case 2705: state = 2706; break; // &InvisibleT -> &InvisibleTi - case 2743: state = 2746; break; // &is -> &isi - case 2755: state = 2761; break; // &it -> &iti - case 2756: state = 2757; break; // &It -> &Iti - case 2778: state = 2779; break; // &Jc -> &Jci - case 2783: state = 2784; break; // &jc -> &jci - case 2838: state = 2839; break; // &Kced -> &Kcedi - case 2843: state = 2844; break; // &kced -> &kcedi - case 2951: state = 2952; break; // &larrs -> &larrsi - case 2958: state = 2959; break; // &lAta -> &lAtai - case 2961: state = 2962; break; // &lata -> &latai - case 2999: state = 3000; break; // &Lced -> &Lcedi - case 3002: state = 3006; break; // &lce -> &lcei - case 3003: state = 3004; break; // &lced -> &lcedi - case 3067: state = 3068; break; // &LeftArrowR -> &LeftArrowRi - case 3078: state = 3079; break; // &leftarrowta -> &leftarrowtai - case 3082: state = 3083; break; // &LeftCe -> &LeftCei - case 3084: state = 3085; break; // &LeftCeil -> &LeftCeili - case 3149: state = 3150; break; // &LeftR -> &LeftRi - case 3159: state = 3160; break; // &Leftr -> &Leftri - case 3169: state = 3170; break; // &leftr -> &leftri - case 3190: state = 3191; break; // &leftrightsqu -> &leftrightsqui - case 3223: state = 3224; break; // &leftthreet -> &leftthreeti - case 3228: state = 3229; break; // &LeftTr -> &LeftTri - case 3358: state = 3359; break; // &lesss -> &lesssi - case 3371: state = 3372; break; // &LessT -> &LessTi - case 3376: state = 3377; break; // &lf -> &lfi - case 3432: state = 3433; break; // &lltr -> &lltri - case 3434: state = 3435; break; // &Lm -> &Lmi - case 3439: state = 3440; break; // &lm -> &lmi - case 3463: state = 3464; break; // &lns -> &lnsi - case 3507: state = 3508; break; // &LongLeftR -> &LongLeftRi - case 3517: state = 3518; break; // &Longleftr -> &Longleftri - case 3527: state = 3528; break; // &longleftr -> &longleftri - case 3543: state = 3544; break; // &LongR -> &LongRi - case 3553: state = 3554; break; // &Longr -> &Longri - case 3563: state = 3564; break; // &longr -> &longri - case 3584: state = 3585; break; // &looparrowr -> &looparrowri - case 3598: state = 3599; break; // &lot -> &loti - case 3622: state = 3623; break; // &LowerR -> &LowerRi - case 3659: state = 3660; break; // &lrtr -> &lrtri - case 3661: state = 3673; break; // &ls -> &lsi - case 3692: state = 3704; break; // < -> <i - case 3693: state = 3695; break; // <c -> <ci - case 3717: state = 3718; break; // <r -> <ri - case 3745: state = 3827; break; // &m -> &mi - case 3755: state = 3847; break; // &M -> &Mi - case 3805: state = 3806; break; // &Med -> &Medi - case 3815: state = 3816; break; // &Mell -> &Melli - case 3835: state = 3836; break; // &midc -> &midci - case 3889: state = 3890; break; // &mult -> &multi - case 3897: state = 4111; break; // &n -> &ni - case 3914: state = 3916; break; // &nap -> &napi - case 3949: state = 3950; break; // &Nced -> &Ncedi - case 3953: state = 3954; break; // &nced -> &ncedi - case 3987: state = 3988; break; // &Negat -> &Negati - case 3993: state = 3994; break; // &NegativeMed -> &NegativeMedi - case 4003: state = 4004; break; // &NegativeTh -> &NegativeThi - case 4023: state = 4024; break; // &NegativeVeryTh -> &NegativeVeryThi - case 4032: state = 4033; break; // &nequ -> &nequi - case 4035: state = 4039; break; // &nes -> &nesi - case 4068: state = 4069; break; // &NewL -> &NewLi - case 4072: state = 4073; break; // &nex -> &nexi - case 4094: state = 4095; break; // &ngs -> &ngsi - case 4148: state = 4149; break; // &nLeftr -> &nLeftri - case 4158: state = 4159; break; // &nleftr -> &nleftri - case 4178: state = 4179; break; // &nls -> &nlsi - case 4183: state = 4184; break; // &nltr -> &nltri - case 4187: state = 4188; break; // &nm -> &nmi - case 4201: state = 4202; break; // &NonBreak -> &NonBreaki - case 4216: state = 4333; break; // ¬ -> ¬i - case 4240: state = 4241; break; // &NotDoubleVert -> &NotDoubleVerti - case 4259: state = 4260; break; // &NotEqualT -> &NotEqualTi - case 4264: state = 4265; break; // &NotEx -> &NotExi - case 4311: state = 4312; break; // &NotGreaterT -> &NotGreaterTi - case 4348: state = 4349; break; // &NotLeftTr -> &NotLeftTri - case 4391: state = 4392; break; // &NotLessT -> &NotLessTi - case 4424: state = 4425; break; // ¬n -> ¬ni - case 4453: state = 4467; break; // &NotR -> &NotRi - case 4472: state = 4473; break; // &NotRightTr -> &NotRightTri - case 4546: state = 4547; break; // &NotSucceedsT -> &NotSucceedsTi - case 4562: state = 4563; break; // &NotT -> &NotTi - case 4581: state = 4582; break; // &NotTildeT -> &NotTildeTi - case 4589: state = 4590; break; // &NotVert -> &NotVerti - case 4609: state = 4610; break; // &npol -> &npoli - case 4621: state = 4640; break; // &nr -> &nri - case 4630: state = 4631; break; // &nR -> &nRi - case 4650: state = 4651; break; // &nrtr -> &nrtri - case 4653: state = 4678; break; // &ns -> &nsi - case 4667: state = 4668; break; // &nshortm -> &nshortmi - case 4682: state = 4683; break; // &nsm -> &nsmi - case 4718: state = 4726; break; // &nt -> &nti - case 4721: state = 4722; break; // &Nt -> &Nti - case 4732: state = 4733; break; // &ntr -> &ntri - case 4745: state = 4746; break; // &ntriangler -> &ntriangleri - case 4760: state = 4787; break; // &nv -> &nvi - case 4789: state = 4790; break; // &nvinf -> &nvinfi - case 4798: state = 4799; break; // &nvltr -> &nvltri - case 4806: state = 4807; break; // &nvrtr -> &nvrtri - case 4809: state = 4810; break; // &nvs -> &nvsi - case 4833: state = 4905; break; // &o -> &oi - case 4841: state = 4842; break; // &oc -> &oci - case 4844: state = 4845; break; // &Oc -> &Oci - case 4851: state = 4864; break; // &od -> &odi - case 4873: state = 4874; break; // &OEl -> &OEli - case 4877: state = 4878; break; // &oel -> &oeli - case 4881: state = 4882; break; // &ofc -> &ofci - case 4908: state = 4919; break; // &ol -> &oli - case 4912: state = 4913; break; // &olc -> &olci - case 4923: state = 4937; break; // &Om -> &Omi - case 4927: state = 4942; break; // &om -> &omi - case 4991: state = 5002; break; // &or -> &ori - case 5031: state = 5032; break; // &Ot -> &Oti - case 5036: state = 5037; break; // &ot -> &oti - case 5080: state = 5081; break; // &OverParenthes -> &OverParenthesi - case 5083: state = 5141; break; // &p -> &pi - case 5091: state = 5092; break; // &pars -> &parsi - case 5096: state = 5140; break; // &P -> &Pi - case 5099: state = 5100; break; // &Part -> &Parti - case 5109: state = 5113; break; // &per -> &peri - case 5116: state = 5117; break; // &perm -> &permi - case 5128: state = 5129; break; // &Ph -> &Phi - case 5130: state = 5131; break; // &ph -> &phi - case 5161: state = 5162; break; // &plusac -> &plusaci - case 5165: state = 5166; break; // &plusc -> &plusci - case 5175: state = 5176; break; // &PlusM -> &PlusMi - case 5182: state = 5183; break; // &pluss -> &plussi - case 5189: state = 5190; break; // &Po -> &Poi - case 5201: state = 5202; break; // &po -> &poi - case 5204: state = 5205; break; // &point -> &pointi - case 5215: state = 5282; break; // &Pr -> &Pri - case 5216: state = 5285; break; // &pr -> &pri - case 5259: state = 5260; break; // &PrecedesT -> &PrecedesTi - case 5276: state = 5277; break; // &precns -> &precnsi - case 5279: state = 5280; break; // &precs -> &precsi - case 5293: state = 5294; break; // &prns -> &prnsi - case 5308: state = 5309; break; // &profl -> &profli - case 5320: state = 5321; break; // &Proport -> &Proporti - case 5328: state = 5329; break; // &prs -> &prsi - case 5335: state = 5341; break; // &Ps -> &Psi - case 5338: state = 5342; break; // &ps -> &psi - case 5351: state = 5354; break; // &q -> &qi - case 5364: state = 5365; break; // &qpr -> &qpri - case 5376: state = 5384; break; // &quat -> &quati - case 5379: state = 5380; break; // &quatern -> &quaterni - case 5397: state = 5642; break; // &r -> &ri - case 5405: state = 5617; break; // &R -> &Ri - case 5414: state = 5415; break; // &rad -> &radi - case 5454: state = 5455; break; // &rarrs -> &rarrsi - case 5463: state = 5464; break; // &rAta -> &rAtai - case 5466: state = 5470; break; // &rat -> &rati - case 5467: state = 5468; break; // &rata -> &ratai - case 5513: state = 5514; break; // &Rced -> &Rcedi - case 5516: state = 5520; break; // &rce -> &rcei - case 5517: state = 5518; break; // &rced -> &rcedi - case 5543: state = 5544; break; // &real -> &reali - case 5570: state = 5571; break; // &ReverseEqu -> &ReverseEqui - case 5572: state = 5573; break; // &ReverseEquil -> &ReverseEquili - case 5575: state = 5576; break; // &ReverseEquilibr -> &ReverseEquilibri - case 5583: state = 5584; break; // &ReverseUpEqu -> &ReverseUpEqui - case 5585: state = 5586; break; // &ReverseUpEquil -> &ReverseUpEquili - case 5588: state = 5589; break; // &ReverseUpEquilibr -> &ReverseUpEquilibri - case 5592: state = 5593; break; // &rf -> &rfi - case 5664: state = 5665; break; // &rightarrowta -> &rightarrowtai - case 5668: state = 5669; break; // &RightCe -> &RightCei - case 5670: state = 5671; break; // &RightCeil -> &RightCeili - case 5743: state = 5744; break; // &rightr -> &rightri - case 5756: state = 5757; break; // &rightsqu -> &rightsqui - case 5783: state = 5784; break; // &rightthreet -> &rightthreeti - case 5788: state = 5789; break; // &RightTr -> &RightTri - case 5844: state = 5845; break; // &ris -> &risi - case 5872: state = 5873; break; // &rnm -> &rnmi - case 5894: state = 5895; break; // &rot -> &roti - case 5905: state = 5906; break; // &RoundImpl -> &RoundImpli - case 5916: state = 5917; break; // &rppol -> &rppoli - case 5924: state = 5925; break; // &Rr -> &Rri - case 5951: state = 5956; break; // &rt -> &rti - case 5960: state = 5961; break; // &rtr -> &rtri - case 5966: state = 5967; break; // &rtriltr -> &rtriltri - case 5985: state = 6158; break; // &S -> &Si - case 5991: state = 6162; break; // &s -> &si - case 6001: state = 6024; break; // &Sc -> &Sci - case 6002: state = 6027; break; // &sc -> &sci - case 6018: state = 6019; break; // &Sced -> &Scedi - case 6021: state = 6022; break; // &sced -> &scedi - case 6034: state = 6035; break; // &scns -> &scnsi - case 6039: state = 6040; break; // &scpol -> &scpoli - case 6043: state = 6044; break; // &scs -> &scsi - case 6066: state = 6067; break; // &sem -> &semi - case 6073: state = 6074; break; // &setm -> &setmi - case 6129: state = 6130; break; // &shortm -> &shortmi - case 6140: state = 6141; break; // &ShortR -> &ShortRi - case 6196: state = 6197; break; // &SmallC -> &SmallCi - case 6202: state = 6223; break; // &sm -> &smi - case 6209: state = 6210; break; // &smallsetm -> &smallsetmi - case 6254: state = 6255; break; // &spadesu -> &spadesui - case 6301: state = 6302; break; // &SquareIntersect -> &SquareIntersecti - case 6328: state = 6329; break; // &SquareUn -> &SquareUni - case 6348: state = 6349; break; // &ssm -> &ssmi - case 6364: state = 6365; break; // &stra -> &strai - case 6371: state = 6372; break; // &straighteps -> &straightepsi - case 6377: state = 6378; break; // &straightph -> &straightphi - case 6411: state = 6426; break; // &subs -> &subsi - case 6467: state = 6468; break; // &SucceedsT -> &SucceedsTi - case 6484: state = 6485; break; // &succns -> &succnsi - case 6487: state = 6488; break; // &succs -> &succsi - case 6549: state = 6559; break; // &sups -> &supsi - case 6580: state = 6581; break; // &szl -> &szli - case 6583: state = 6696; break; // &T -> &Ti - case 6586: state = 6700; break; // &t -> &ti - case 6608: state = 6609; break; // &Tced -> &Tcedi - case 6612: state = 6613; break; // &tced -> &tcedi - case 6629: state = 6654; break; // &th -> &thi - case 6634: state = 6666; break; // &Th -> &Thi - case 6663: state = 6664; break; // &thicks -> &thicksi - case 6686: state = 6687; break; // &thks -> &thksi - case 6718: state = 6719; break; // &TildeT -> &TildeTi - case 6739: state = 6740; break; // &topc -> &topci - case 6752: state = 6753; break; // &tpr -> &tpri - case 6760: state = 6764; break; // &tr -> &tri - case 6781: state = 6782; break; // &triangler -> &triangleri - case 6792: state = 6793; break; // &trim -> &trimi - case 6797: state = 6798; break; // &Tr -> &Tri - case 6811: state = 6812; break; // &trit -> &triti - case 6817: state = 6818; break; // &trpez -> &trpezi - case 6845: state = 6846; break; // &tw -> &twi - case 6863: state = 6864; break; // &twoheadr -> &twoheadri - case 6893: state = 6894; break; // &Uarroc -> &Uarroci - case 6910: state = 6911; break; // &Uc -> &Uci - case 6914: state = 6915; break; // &uc -> &uci - case 6936: state = 6937; break; // &uf -> &ufi - case 6976: state = 6977; break; // &ultr -> &ultri - case 6987: state = 7012; break; // &Un -> &Uni - case 7009: state = 7010; break; // &UnderParenthes -> &UnderParenthesi - case 7089: state = 7090; break; // &UpEqu -> &UpEqui - case 7091: state = 7092; break; // &UpEquil -> &UpEquili - case 7094: state = 7095; break; // &UpEquilibr -> &UpEquilibri - case 7109: state = 7110; break; // &upharpoonr -> &upharpoonri - case 7129: state = 7130; break; // &UpperR -> &UpperRi - case 7139: state = 7140; break; // &Ups -> &Upsi - case 7141: state = 7142; break; // &ups -> &upsi - case 7166: state = 7180; break; // &ur -> &uri - case 7176: state = 7177; break; // &Ur -> &Uri - case 7184: state = 7185; break; // &urtr -> &urtri - case 7192: state = 7201; break; // &ut -> &uti - case 7196: state = 7197; break; // &Ut -> &Uti - case 7205: state = 7206; break; // &utr -> &utri - case 7232: state = 7233; break; // &vareps -> &varepsi - case 7245: state = 7246; break; // &varnoth -> &varnothi - case 7249: state = 7252; break; // &varp -> &varpi - case 7250: state = 7251; break; // &varph -> &varphi - case 7264: state = 7265; break; // &vars -> &varsi - case 7291: state = 7292; break; // &vartr -> &vartri - case 7302: state = 7303; break; // &vartriangler -> &vartriangleri - case 7346: state = 7347; break; // &vell -> &velli - case 7357: state = 7359; break; // &Vert -> &Verti - case 7366: state = 7367; break; // &VerticalL -> &VerticalLi - case 7379: state = 7380; break; // &VerticalT -> &VerticalTi - case 7386: state = 7387; break; // &VeryTh -> &VeryThi - case 7400: state = 7401; break; // &vltr -> &vltri - case 7419: state = 7420; break; // &vrtr -> &vrtri - case 7441: state = 7442; break; // &vz -> &vzi - case 7448: state = 7449; break; // &Wc -> &Wci - case 7453: state = 7454; break; // &wc -> &wci - case 7457: state = 7469; break; // &we -> &wei - case 7495: state = 7521; break; // &x -> &xi - case 7496: state = 7499; break; // &xc -> &xci - case 7506: state = 7507; break; // &xdtr -> &xdtri - case 7508: state = 7520; break; // &X -> &Xi - case 7532: state = 7533; break; // &xn -> &xni - case 7547: state = 7548; break; // &xot -> &xoti - case 7574: state = 7575; break; // &xutr -> &xutri - case 7590: state = 7619; break; // &y -> &yi - case 7600: state = 7601; break; // &Yc -> &Yci - case 7604: state = 7605; break; // &yc -> &yci - case 7651: state = 7707; break; // &z -> &zi - case 7683: state = 7684; break; // &ZeroW -> &ZeroWi + case 0: state = 3243; break; // & -> &i + case 27: state = 38; break; // &ac -> &aci + case 33: state = 34; break; // &Ac -> &Aci + case 51: state = 52; break; // &AEl -> &AEli + case 56: state = 57; break; // &ael -> &aeli + case 199: state = 210; break; // &ap -> &api + case 202: state = 203; break; // &apac -> &apaci + case 224: state = 225; break; // &ApplyFunct -> &ApplyFuncti + case 237: state = 238; break; // &Ar -> &Ari + case 242: state = 243; break; // &ar -> &ari + case 255: state = 256; break; // &Ass -> &Assi + case 269: state = 270; break; // &At -> &Ati + case 275: state = 276; break; // &at -> &ati + case 289: state = 297; break; // &aw -> &awi + case 292: state = 293; break; // &awcon -> &awconi + case 301: state = 442; break; // &b -> &bi + case 312: state = 313; break; // &backeps -> &backepsi + case 319: state = 320; break; // &backpr -> &backpri + case 324: state = 325; break; // &backs -> &backsi + case 406: state = 407; break; // &beps -> &bepsi + case 419: state = 420; break; // &Bernoull -> &Bernoulli + case 444: state = 448; break; // &bigc -> &bigci + case 465: state = 466; break; // &bigot -> &bigoti + case 482: state = 483; break; // &bigtr -> &bigtri + case 539: state = 540; break; // &blacktr -> &blacktri + case 557: state = 558; break; // &blacktriangler -> &blacktriangleri + case 583: state = 584; break; // &bnequ -> &bnequi + case 609: state = 610; break; // &bowt -> &bowti + case 656: state = 657; break; // &boxm -> &boxmi + case 667: state = 668; break; // &boxt -> &boxti + case 720: state = 721; break; // &bpr -> &bpri + case 744: state = 752; break; // &bs -> &bsi + case 749: state = 750; break; // &bsem -> &bsemi + case 789: state = 1019; break; // &C -> &Ci + case 796: state = 978; break; // &c -> &ci + case 803: state = 828; break; // &Cap -> &Capi + case 832: state = 833; break; // &CapitalD -> &CapitalDi + case 840: state = 841; break; // &CapitalDifferent -> &CapitalDifferenti + case 861: state = 890; break; // &cc -> &cci + case 866: state = 886; break; // &Cc -> &Cci + case 877: state = 878; break; // &Cced -> &Ccedi + case 882: state = 883; break; // &cced -> &ccedi + case 895: state = 896; break; // &Ccon -> &Cconi + case 916: state = 917; break; // &ced -> &cedi + case 921: state = 922; break; // &Ced -> &Cedi + case 960: state = 976; break; // &ch -> &chi + case 973: state = 974; break; // &Ch -> &Chi + case 998: state = 999; break; // &circlearrowr -> &circlearrowri + case 1009: state = 1010; break; // &circledc -> &circledci + case 1032: state = 1033; break; // &CircleM -> &CircleMi + case 1043: state = 1044; break; // &CircleT -> &CircleTi + case 1054: state = 1055; break; // &cirfn -> &cirfni + case 1059: state = 1060; break; // &cirm -> &cirmi + case 1064: state = 1065; break; // &cirsc -> &cirsci + case 1072: state = 1073; break; // &Clockw -> &Clockwi + case 1122: state = 1123; break; // &clubsu -> &clubsui + case 1164: state = 1183; break; // &con -> &coni + case 1171: state = 1179; break; // &Con -> &Coni + case 1236: state = 1237; break; // &CounterClockw -> &CounterClockwi + case 1393: state = 1394; break; // &curvearrowr -> &curvearrowri + case 1407: state = 1415; break; // &cw -> &cwi + case 1410: state = 1411; break; // &cwcon -> &cwconi + case 1425: state = 1557; break; // &D -> &Di + case 1432: state = 1599; break; // &d -> &di + case 1535: state = 1536; break; // &df -> &dfi + case 1560: state = 1561; break; // &Diacr -> &Diacri + case 1562: state = 1563; break; // &Diacrit -> &Diacriti + case 1593: state = 1594; break; // &DiacriticalT -> &DiacriticalTi + case 1613: state = 1614; break; // &diamondsu -> &diamondsui + case 1627: state = 1628; break; // &Different -> &Differenti + case 1639: state = 1640; break; // &dis -> &disi + case 1643: state = 1645; break; // &div -> &divi + case 1651: state = 1652; break; // ÷ont -> ÷onti + case 1713: state = 1714; break; // &dotm -> &dotmi + case 1786: state = 1787; break; // &DoubleLeftR -> &DoubleLeftRi + case 1814: state = 1815; break; // &DoubleLongLeftR -> &DoubleLongLeftRi + case 1825: state = 1826; break; // &DoubleLongR -> &DoubleLongRi + case 1836: state = 1837; break; // &DoubleR -> &DoubleRi + case 1872: state = 1873; break; // &DoubleVert -> &DoubleVerti + case 1944: state = 1945; break; // &downharpoonr -> &downharpoonri + case 1954: state = 1955; break; // &DownLeftR -> &DownLeftRi + case 1987: state = 1988; break; // &DownR -> &DownRi + case 2072: state = 2073; break; // &dtr -> &dtri + case 2097: state = 2101; break; // &dz -> &dzi + case 2127: state = 2142; break; // &Ec -> &Eci + case 2133: state = 2139; break; // &ec -> &eci + case 2204: state = 2213; break; // &el -> &eli + case 2323: state = 2324; break; // &eps -> &epsi + case 2327: state = 2328; break; // &Eps -> &Epsi + case 2340: state = 2341; break; // &eqc -> &eqci + case 2350: state = 2351; break; // &eqs -> &eqsi + case 2368: state = 2387; break; // &Equ -> &Equi + case 2372: state = 2396; break; // &equ -> &equi + case 2377: state = 2378; break; // &EqualT -> &EqualTi + case 2388: state = 2389; break; // &Equil -> &Equili + case 2391: state = 2392; break; // &Equilibr -> &Equilibri + case 2418: state = 2430; break; // &Es -> &Esi + case 2422: state = 2433; break; // &es -> &esi + case 2458: state = 2462; break; // &ex -> &exi + case 2466: state = 2467; break; // &Ex -> &Exi + case 2477: state = 2478; break; // &expectat -> &expectati + case 2487: state = 2488; break; // &Exponent -> &Exponenti + case 2497: state = 2498; break; // &exponent -> &exponenti + case 2503: state = 2549; break; // &f -> &fi + case 2506: state = 2507; break; // &fall -> &falli + case 2517: state = 2554; break; // &F -> &Fi + case 2530: state = 2531; break; // &ff -> &ffi + case 2532: state = 2533; break; // &ffil -> &ffili + case 2536: state = 2537; break; // &ffl -> &ffli + case 2540: state = 2541; break; // &ffll -> &fflli + case 2550: state = 2551; break; // &fil -> &fili + case 2588: state = 2589; break; // &fjl -> &fjli + case 2596: state = 2597; break; // &fll -> &flli + case 2631: state = 2632; break; // &Four -> &Fouri + case 2642: state = 2643; break; // &fpart -> &fparti + case 2701: state = 2811; break; // &g -> &gi + case 2736: state = 2742; break; // &Gc -> &Gci + case 2738: state = 2739; break; // &Gced -> &Gcedi + case 2746: state = 2747; break; // &gc -> &gci + case 2849: state = 2850; break; // &gns -> &gnsi + case 2917: state = 2918; break; // &GreaterT -> &GreaterTi + case 2927: state = 2931; break; // &gs -> &gsi + case 2944: state = 2947; break; // >c -> >ci + case 2998: state = 2999; break; // >rs -> >rsi + case 3014: state = 3100; break; // &H -> &Hi + case 3021: state = 3022; break; // &ha -> &hai + case 3030: state = 3031; break; // &ham -> &hami + case 3052: state = 3053; break; // &harrc -> &harrci + case 3064: state = 3065; break; // &Hc -> &Hci + case 3069: state = 3070; break; // &hc -> &hci + case 3080: state = 3081; break; // &heartsu -> &heartsui + case 3085: state = 3086; break; // &hell -> &helli + case 3148: state = 3149; break; // &hookr -> &hookri + case 3171: state = 3172; break; // &Hor -> &Hori + case 3179: state = 3180; break; // &HorizontalL -> &HorizontalLi + case 3243: state = 3301; break; // &i -> &ii + case 3250: state = 3257; break; // &ic -> &ici + case 3252: state = 3253; break; // &Ic -> &Ici + case 3301: state = 3303; break; // &ii -> &iii + case 3303: state = 3304; break; // &iii -> &iiii + case 3312: state = 3313; break; // &iinf -> &iinfi + case 3321: state = 3322; break; // &IJl -> &IJli + case 3326: state = 3327; break; // &ijl -> &ijli + case 3344: state = 3345; break; // &Imag -> &Imagi + case 3352: state = 3353; break; // &imagl -> &imagli + case 3373: state = 3374; break; // &Impl -> &Impli + case 3385: state = 3386; break; // &inf -> &infi + case 3389: state = 3390; break; // &infint -> &infinti + case 3428: state = 3429; break; // &Intersect -> &Intersecti + case 3444: state = 3445; break; // &Inv -> &Invi + case 3446: state = 3447; break; // &Invis -> &Invisi + case 3457: state = 3458; break; // &InvisibleT -> &InvisibleTi + case 3507: state = 3511; break; // &is -> &isi + case 3526: state = 3534; break; // &it -> &iti + case 3528: state = 3529; break; // &It -> &Iti + case 3556: state = 3557; break; // &Jc -> &Jci + case 3562: state = 3563; break; // &jc -> &jci + case 3634: state = 3635; break; // &Kced -> &Kcedi + case 3640: state = 3641; break; // &kced -> &kcedi + case 3785: state = 3786; break; // &larrs -> &larrsi + case 3795: state = 3796; break; // &lAta -> &lAtai + case 3799: state = 3800; break; // &lata -> &latai + case 3850: state = 3851; break; // &Lced -> &Lcedi + case 3854: state = 3859; break; // &lce -> &lcei + case 3855: state = 3856; break; // &lced -> &lcedi + case 3937: state = 3938; break; // &LeftArrowR -> &LeftArrowRi + case 3949: state = 3950; break; // &leftarrowta -> &leftarrowtai + case 3954: state = 3955; break; // &LeftCe -> &LeftCei + case 3956: state = 3957; break; // &LeftCeil -> &LeftCeili + case 4030: state = 4031; break; // &LeftR -> &LeftRi + case 4041: state = 4042; break; // &Leftr -> &Leftri + case 4052: state = 4053; break; // &leftr -> &leftri + case 4076: state = 4077; break; // &leftrightsqu -> &leftrightsqui + case 4114: state = 4115; break; // &leftthreet -> &leftthreeti + case 4120: state = 4121; break; // &LeftTr -> &LeftTri + case 4280: state = 4281; break; // &lesss -> &lesssi + case 4295: state = 4296; break; // &LessT -> &LessTi + case 4301: state = 4302; break; // &lf -> &lfi + case 4376: state = 4377; break; // &lltr -> &lltri + case 4379: state = 4380; break; // &Lm -> &Lmi + case 4385: state = 4386; break; // &lm -> &lmi + case 4418: state = 4419; break; // &lns -> &lnsi + case 4469: state = 4470; break; // &LongLeftR -> &LongLeftRi + case 4480: state = 4481; break; // &Longleftr -> &Longleftri + case 4491: state = 4492; break; // &longleftr -> &longleftri + case 4509: state = 4510; break; // &LongR -> &LongRi + case 4520: state = 4521; break; // &Longr -> &Longri + case 4531: state = 4532; break; // &longr -> &longri + case 4554: state = 4555; break; // &looparrowr -> &looparrowri + case 4573: state = 4574; break; // &lot -> &loti + case 4601: state = 4602; break; // &LowerR -> &LowerRi + case 4649: state = 4650; break; // &lrtr -> &lrtri + case 4652: state = 4669; break; // &ls -> &lsi + case 4698: state = 4715; break; // < -> <i + case 4700: state = 4703; break; // <c -> <ci + case 4731: state = 4732; break; // <r -> <ri + case 4767: state = 4871; break; // &m -> &mi + case 4781: state = 4900; break; // &M -> &Mi + case 4844: state = 4845; break; // &Med -> &Medi + case 4855: state = 4856; break; // &Mell -> &Melli + case 4882: state = 4883; break; // &midc -> &midci + case 4955: state = 4956; break; // &mult -> &multi + case 4965: state = 5240; break; // &n -> &ni + case 4986: state = 4990; break; // &nap -> &napi + case 5035: state = 5036; break; // &Nced -> &Ncedi + case 5040: state = 5041; break; // &nced -> &ncedi + case 5087: state = 5088; break; // &Negat -> &Negati + case 5093: state = 5094; break; // &NegativeMed -> &NegativeMedi + case 5104: state = 5105; break; // &NegativeTh -> &NegativeThi + case 5126: state = 5127; break; // &NegativeVeryTh -> &NegativeVeryThi + case 5136: state = 5137; break; // &nequ -> &nequi + case 5140: state = 5145; break; // &nes -> &nesi + case 5177: state = 5178; break; // &NewL -> &NewLi + case 5182: state = 5183; break; // &nex -> &nexi + case 5215: state = 5216; break; // &ngs -> &ngsi + case 5290: state = 5291; break; // &nLeftr -> &nLeftri + case 5301: state = 5302; break; // &nleftr -> &nleftri + case 5328: state = 5329; break; // &nls -> &nlsi + case 5336: state = 5337; break; // &nltr -> &nltri + case 5343: state = 5344; break; // &nm -> &nmi + case 5359: state = 5360; break; // &NonBreak -> &NonBreaki + case 5378: state = 5512; break; // ¬ -> ¬i + case 5405: state = 5406; break; // &NotDoubleVert -> &NotDoubleVerti + case 5427: state = 5428; break; // &NotEqualT -> &NotEqualTi + case 5433: state = 5434; break; // &NotEx -> &NotExi + case 5487: state = 5488; break; // &NotGreaterT -> &NotGreaterTi + case 5533: state = 5534; break; // &NotLeftTr -> &NotLeftTri + case 5584: state = 5585; break; // &NotLessT -> &NotLessTi + case 5620: state = 5621; break; // ¬n -> ¬ni + case 5656: state = 5671; break; // &NotR -> &NotRi + case 5676: state = 5677; break; // &NotRightTr -> &NotRightTri + case 5762: state = 5763; break; // &NotSucceedsT -> &NotSucceedsTi + case 5781: state = 5782; break; // &NotT -> &NotTi + case 5803: state = 5804; break; // &NotTildeT -> &NotTildeTi + case 5812: state = 5813; break; // &NotVert -> &NotVerti + case 5837: state = 5838; break; // &npol -> &npoli + case 5855: state = 5879; break; // &nr -> &nri + case 5868: state = 5869; break; // &nR -> &nRi + case 5890: state = 5891; break; // &nrtr -> &nrtri + case 5895: state = 5927; break; // &ns -> &nsi + case 5914: state = 5915; break; // &nshortm -> &nshortmi + case 5934: state = 5935; break; // &nsm -> &nsmi + case 5988: state = 5998; break; // &nt -> &nti + case 5992: state = 5993; break; // &Nt -> &Nti + case 6006: state = 6007; break; // &ntr -> &ntri + case 6021: state = 6022; break; // &ntriangler -> &ntriangleri + case 6043: state = 6078; break; // &nv -> &nvi + case 6080: state = 6081; break; // &nvinf -> &nvinfi + case 6093: state = 6094; break; // &nvltr -> &nvltri + case 6103: state = 6104; break; // &nvrtr -> &nvrtri + case 6107: state = 6108; break; // &nvs -> &nvsi + case 6138: state = 6234; break; // &o -> &oi + case 6148: state = 6149; break; // &oc -> &oci + case 6152: state = 6153; break; // &Oc -> &Oci + case 6163: state = 6179; break; // &od -> &odi + case 6191: state = 6192; break; // &OEl -> &OEli + case 6196: state = 6197; break; // &oel -> &oeli + case 6201: state = 6202; break; // &ofc -> &ofci + case 6238: state = 6252; break; // &ol -> &oli + case 6243: state = 6244; break; // &olc -> &olci + case 6258: state = 6276; break; // &Om -> &Omi + case 6263: state = 6282; break; // &om -> &omi + case 6342: state = 6360; break; // &or -> &ori + case 6399: state = 6400; break; // &Ot -> &Oti + case 6405: state = 6406; break; // &ot -> &oti + case 6459: state = 6460; break; // &OverParenthes -> &OverParenthesi + case 6463: state = 6543; break; // &p -> &pi + case 6474: state = 6475; break; // &pars -> &parsi + case 6482: state = 6541; break; // &P -> &Pi + case 6485: state = 6486; break; // &Part -> &Parti + case 6498: state = 6503; break; // &per -> &peri + case 6507: state = 6508; break; // &perm -> &permi + case 6524: state = 6525; break; // &Ph -> &Phi + case 6527: state = 6528; break; // &ph -> &phi + case 6570: state = 6571; break; // &plusac -> &plusaci + case 6576: state = 6577; break; // &plusc -> &plusci + case 6590: state = 6591; break; // &PlusM -> &PlusMi + case 6599: state = 6600; break; // &pluss -> &plussi + case 6609: state = 6610; break; // &Po -> &Poi + case 6622: state = 6623; break; // &po -> &poi + case 6625: state = 6626; break; // &point -> &pointi + case 6640: state = 6725; break; // &Pr -> &Pri + case 6642: state = 6729; break; // &pr -> &pri + case 6696: state = 6697; break; // &PrecedesT -> &PrecedesTi + case 6717: state = 6718; break; // &precns -> &precnsi + case 6721: state = 6722; break; // &precs -> &precsi + case 6741: state = 6742; break; // &prns -> &prnsi + case 6760: state = 6761; break; // &profl -> &profli + case 6775: state = 6776; break; // &Proport -> &Proporti + case 6786: state = 6787; break; // &prs -> &prsi + case 6795: state = 6803; break; // &Ps -> &Psi + case 6799: state = 6805; break; // &ps -> &psi + case 6817: state = 6821; break; // &q -> &qi + case 6834: state = 6835; break; // &qpr -> &qpri + case 6849: state = 6858; break; // &quat -> &quati + case 6852: state = 6853; break; // &quatern -> &quaterni + case 6876: state = 7199; break; // &r -> &ri + case 6886: state = 7171; break; // &R -> &Ri + case 6897: state = 6898; break; // &rad -> &radi + case 6956: state = 6957; break; // &rarrs -> &rarrsi + case 6969: state = 6970; break; // &rAta -> &rAtai + case 6973: state = 6978; break; // &rat -> &rati + case 6974: state = 6975; break; // &rata -> &ratai + case 7034: state = 7035; break; // &Rced -> &Rcedi + case 7038: state = 7043; break; // &rce -> &rcei + case 7039: state = 7040; break; // &rced -> &rcedi + case 7076: state = 7078; break; // &real -> &reali + case 7111: state = 7112; break; // &ReverseEqu -> &ReverseEqui + case 7113: state = 7114; break; // &ReverseEquil -> &ReverseEquili + case 7116: state = 7117; break; // &ReverseEquilibr -> &ReverseEquilibri + case 7125: state = 7126; break; // &ReverseUpEqu -> &ReverseUpEqui + case 7127: state = 7128; break; // &ReverseUpEquil -> &ReverseUpEquili + case 7130: state = 7131; break; // &ReverseUpEquilibr -> &ReverseUpEquilibri + case 7135: state = 7136; break; // &rf -> &rfi + case 7224: state = 7225; break; // &rightarrowta -> &rightarrowtai + case 7229: state = 7230; break; // &RightCe -> &RightCei + case 7231: state = 7232; break; // &RightCeil -> &RightCeili + case 7314: state = 7315; break; // &rightr -> &rightri + case 7328: state = 7329; break; // &rightsqu -> &rightsqui + case 7359: state = 7360; break; // &rightthreet -> &rightthreeti + case 7365: state = 7366; break; // &RightTr -> &RightTri + case 7431: state = 7432; break; // &ris -> &risi + case 7465: state = 7466; break; // &rnm -> &rnmi + case 7495: state = 7496; break; // &rot -> &roti + case 7507: state = 7508; break; // &RoundImpl -> &RoundImpli + case 7521: state = 7522; break; // &rppol -> &rppoli + case 7531: state = 7532; break; // &Rr -> &Rri + case 7567: state = 7573; break; // &rt -> &rti + case 7578: state = 7579; break; // &rtr -> &rtri + case 7587: state = 7588; break; // &rtriltr -> &rtriltri + case 7610: state = 7833; break; // &S -> &Si + case 7617: state = 7838; break; // &s -> &si + case 7629: state = 7662; break; // &Sc -> &Sci + case 7631: state = 7666; break; // &sc -> &sci + case 7654: state = 7655; break; // &Sced -> &Scedi + case 7658: state = 7659; break; // &sced -> &scedi + case 7676: state = 7677; break; // &scns -> &scnsi + case 7682: state = 7683; break; // &scpol -> &scpoli + case 7687: state = 7688; break; // &scs -> &scsi + case 7721: state = 7722; break; // &sem -> &semi + case 7730: state = 7731; break; // &setm -> &setmi + case 7799: state = 7800; break; // &shortm -> &shortmi + case 7812: state = 7813; break; // &ShortR -> &ShortRi + case 7887: state = 7888; break; // &SmallC -> &SmallCi + case 7894: state = 7918; break; // &sm -> &smi + case 7901: state = 7902; break; // &smallsetm -> &smallsetmi + case 7962: state = 7963; break; // &spadesu -> &spadesui + case 8027: state = 8028; break; // &SquareIntersect -> &SquareIntersecti + case 8059: state = 8060; break; // &SquareUn -> &SquareUni + case 8086: state = 8087; break; // &ssm -> &ssmi + case 8107: state = 8108; break; // &stra -> &strai + case 8114: state = 8115; break; // &straighteps -> &straightepsi + case 8121: state = 8122; break; // &straightph -> &straightphi + case 8169: state = 8190; break; // &subs -> &subsi + case 8240: state = 8241; break; // &SucceedsT -> &SucceedsTi + case 8261: state = 8262; break; // &succns -> &succnsi + case 8265: state = 8266; break; // &succs -> &succsi + case 8352: state = 8367; break; // &sups -> &supsi + case 8396: state = 8397; break; // &szl -> &szli + case 8400: state = 8544; break; // &T -> &Ti + case 8404: state = 8549; break; // &t -> &ti + case 8432: state = 8433; break; // &Tced -> &Tcedi + case 8437: state = 8438; break; // &tced -> &tcedi + case 8461: state = 8493; break; // &th -> &thi + case 8467: state = 8507; break; // &Th -> &Thi + case 8503: state = 8504; break; // &thicks -> &thicksi + case 8531: state = 8532; break; // &thks -> &thksi + case 8570: state = 8571; break; // &TildeT -> &TildeTi + case 8600: state = 8601; break; // &topc -> &topci + case 8618: state = 8619; break; // &tpr -> &tpri + case 8628: state = 8633; break; // &tr -> &tri + case 8655: state = 8656; break; // &triangler -> &triangleri + case 8670: state = 8671; break; // &trim -> &trimi + case 8676: state = 8677; break; // &Tr -> &Tri + case 8693: state = 8694; break; // &trit -> &triti + case 8700: state = 8701; break; // &trpez -> &trpezi + case 8737: state = 8738; break; // &tw -> &twi + case 8757: state = 8758; break; // &twoheadr -> &twoheadri + case 8793: state = 8794; break; // &Uarroc -> &Uarroci + case 8815: state = 8816; break; // &Uc -> &Uci + case 8820: state = 8821; break; // &uc -> &uci + case 8849: state = 8850; break; // &uf -> &ufi + case 8901: state = 8902; break; // &ultr -> &ultri + case 8916: state = 8945; break; // &Un -> &Uni + case 8941: state = 8942; break; // &UnderParenthes -> &UnderParenthesi + case 9036: state = 9037; break; // &UpEqu -> &UpEqui + case 9038: state = 9039; break; // &UpEquil -> &UpEquili + case 9041: state = 9042; break; // &UpEquilibr -> &UpEquilibri + case 9058: state = 9059; break; // &upharpoonr -> &upharpoonri + case 9081: state = 9082; break; // &UpperR -> &UpperRi + case 9092: state = 9093; break; // &Ups -> &Upsi + case 9095: state = 9096; break; // &ups -> &upsi + case 9127: state = 9145; break; // &ur -> &uri + case 9140: state = 9141; break; // &Ur -> &Uri + case 9150: state = 9151; break; // &urtr -> &urtri + case 9161: state = 9172; break; // &ut -> &uti + case 9166: state = 9167; break; // &Ut -> &Uti + case 9177: state = 9178; break; // &utr -> &utri + case 9211: state = 9212; break; // &vareps -> &varepsi + case 9226: state = 9227; break; // &varnoth -> &varnothi + case 9231: state = 9235; break; // &varp -> &varpi + case 9232: state = 9233; break; // &varph -> &varphi + case 9252: state = 9253; break; // &vars -> &varsi + case 9285: state = 9286; break; // &vartr -> &vartri + case 9297: state = 9298; break; // &vartriangler -> &vartriangleri + case 9356: state = 9357; break; // &vell -> &velli + case 9370: state = 9374; break; // &Vert -> &Verti + case 9382: state = 9383; break; // &VerticalL -> &VerticalLi + case 9397: state = 9398; break; // &VerticalT -> &VerticalTi + case 9405: state = 9406; break; // &VeryTh -> &VeryThi + case 9422: state = 9423; break; // &vltr -> &vltri + case 9447: state = 9448; break; // &vrtr -> &vrtri + case 9477: state = 9478; break; // &vz -> &vzi + case 9485: state = 9486; break; // &Wc -> &Wci + case 9491: state = 9492; break; // &wc -> &wci + case 9496: state = 9512; break; // &we -> &wei + case 9548: state = 9583; break; // &x -> &xi + case 9549: state = 9553; break; // &xc -> &xci + case 9562: state = 9563; break; // &xdtr -> &xdtri + case 9565: state = 9581; break; // &X -> &Xi + case 9598: state = 9599; break; // &xn -> &xni + case 9618: state = 9619; break; // &xot -> &xoti + case 9652: state = 9653; break; // &xutr -> &xutri + case 9672: state = 9712; break; // &y -> &yi + case 9685: state = 9686; break; // &Yc -> &Yci + case 9690: state = 9691; break; // &yc -> &yci + case 9754: state = 9825; break; // &z -> &zi + case 9794: state = 9795; break; // &ZeroW -> &ZeroWi default: return false; } break; case 'j': switch (state) { - case 0: state = 2782; break; // & -> &j - case 1097: state = 1280; break; // &d -> &dj - case 1964: state = 2036; break; // &f -> &fj - case 2118: state = 2201; break; // &g -> &gj - case 2204: state = 2207; break; // &gl -> &glj - case 2539: state = 2600; break; // &i -> &ij - case 2830: state = 2866; break; // &k -> &kj - case 2881: state = 3405; break; // &l -> &lj - case 3897: state = 4118; break; // &n -> &nj - case 7725: state = 7726; break; // &zw -> &zwj - case 7727: state = 7728; break; // &zwn -> &zwnj + case 0: state = 3561; break; // & -> &j + case 1432: state = 1665; break; // &d -> &dj + case 2503: state = 2587; break; // &f -> &fj + case 2701: state = 2820; break; // &g -> &gj + case 2824: state = 2830; break; // &gl -> &glj + case 3243: state = 3325; break; // &i -> &ij + case 3624: state = 3672; break; // &k -> &kj + case 3692: state = 4342; break; // &l -> &lj + case 4965: state = 5252; break; // &n -> &nj + case 9848: state = 9849; break; // &zw -> &zwj + case 9851: state = 9852; break; // &zwn -> &zwnj default: return false; } break; case 'k': switch (state) { - case 0: state = 2830; break; // & -> &k - case 222: state = 391; break; // &b -> &bk - case 224: state = 225; break; // &bac -> &back - case 249: state = 250; break; // &Bac -> &Back - case 271: state = 272; break; // &bbr -> &bbrk - case 275: state = 276; break; // &bbrktbr -> &bbrktbrk - case 396: state = 436; break; // &bl -> &blk - case 398: state = 399; break; // &blac -> &black - case 434: state = 435; break; // &blan -> &blank - case 443: state = 444; break; // &bloc -> &block - case 723: state = 724; break; // &chec -> &check - case 727: state = 728; break; // &checkmar -> &checkmark - case 805: state = 806; break; // &Cloc -> &Clock - case 940: state = 941; break; // &CounterCloc -> &CounterClock - case 1120: state = 1121; break; // &db -> &dbk - case 1591: state = 1592; break; // &drb -> &drbk - case 1618: state = 1619; break; // &Dstro -> &Dstrok - case 1622: state = 1623; break; // &dstro -> &dstrok - case 2062: state = 2066; break; // &for -> &fork - case 2354: state = 2355; break; // &Hace -> &Hacek - case 2356: state = 2428; break; // &h -> &hk - case 2448: state = 2449; break; // &hoo -> &hook - case 2502: state = 2503; break; // &Hstro -> &Hstrok - case 2506: state = 2507; break; // &hstro -> &hstrok - case 2687: state = 2688; break; // &intlarh -> &intlarhk - case 2765: state = 2766; break; // &Iu -> &Iuk - case 2769: state = 2770; break; // &iu -> &iuk - case 2817: state = 2818; break; // &Ju -> &Juk - case 2821: state = 2822; break; // &ju -> &juk - case 2945: state = 2946; break; // &larrh -> &larrhk - case 2975: state = 2976; break; // &lbbr -> &lbbrk - case 2977: state = 2982; break; // &lbr -> &lbrk - case 2979: state = 2981; break; // &lbrac -> &lbrack - case 3044: state = 3045; break; // &LeftAngleBrac -> &LeftAngleBrack - case 3097: state = 3098; break; // &LeftDoubleBrac -> &LeftDoubleBrack - case 3400: state = 3401; break; // &lhbl -> &lhblk - case 3473: state = 3474; break; // &lobr -> &lobrk - case 3684: state = 3685; break; // &Lstro -> &Lstrok - case 3688: state = 3689; break; // &lstro -> &lstrok - case 3772: state = 3773; break; // &mar -> &mark - case 3973: state = 3974; break; // &nearh -> &nearhk - case 4005: state = 4006; break; // &NegativeThic -> &NegativeThick - case 4194: state = 4195; break; // &NoBrea -> &NoBreak - case 4200: state = 4201; break; // &NonBrea -> &NonBreak - case 4815: state = 4816; break; // &nwarh -> &nwarhk - case 5067: state = 5069; break; // &OverBrac -> &OverBrack - case 5122: state = 5123; break; // &perten -> &pertenk - case 5147: state = 5148; break; // &pitchfor -> &pitchfork - case 5152: state = 5156; break; // &plan -> &plank - case 5153: state = 5154; break; // &planc -> &planck - case 5448: state = 5449; break; // &rarrh -> &rarrhk - case 5489: state = 5490; break; // &rbbr -> &rbbrk - case 5491: state = 5496; break; // &rbr -> &rbrk - case 5493: state = 5495; break; // &rbrac -> &rbrack - case 5629: state = 5630; break; // &RightAngleBrac -> &RightAngleBrack - case 5683: state = 5684; break; // &RightDoubleBrac -> &RightDoubleBrack - case 5882: state = 5883; break; // &robr -> &robrk - case 6056: state = 6057; break; // &searh -> &searhk - case 6567: state = 6568; break; // &swarh -> &swarhk - case 6595: state = 6596; break; // &tbr -> &tbrk - case 6629: state = 6683; break; // &th -> &thk - case 6655: state = 6656; break; // &thic -> &thick - case 6667: state = 6668; break; // &Thic -> &Thick - case 6747: state = 6748; break; // &topfor -> &topfork - case 6839: state = 6840; break; // &Tstro -> &Tstrok - case 6843: state = 6844; break; // &tstro -> &tstrok - case 6963: state = 6964; break; // &uhbl -> &uhblk - case 6996: state = 6998; break; // &UnderBrac -> &UnderBrack - case 7229: state = 7237; break; // &var -> &vark + case 0: state = 3624; break; // & -> &k + case 301: state = 513; break; // &b -> &bk + case 303: state = 304; break; // &bac -> &back + case 333: state = 334; break; // &Bac -> &Back + case 361: state = 362; break; // &bbr -> &bbrk + case 366: state = 367; break; // &bbrktbr -> &bbrktbrk + case 519: state = 566; break; // &bl -> &blk + case 521: state = 522; break; // &blac -> &black + case 563: state = 564; break; // &blan -> &blank + case 576: state = 577; break; // &bloc -> &block + case 965: state = 966; break; // &chec -> &check + case 970: state = 971; break; // &checkmar -> &checkmark + case 1070: state = 1071; break; // &Cloc -> &Clock + case 1234: state = 1235; break; // &CounterCloc -> &CounterClock + case 1463: state = 1464; break; // &db -> &dbk + case 2024: state = 2025; break; // &drb -> &drbk + case 2059: state = 2060; break; // &Dstro -> &Dstrok + case 2064: state = 2065; break; // &dstro -> &dstrok + case 2621: state = 2626; break; // &for -> &fork + case 3017: state = 3018; break; // &Hace -> &Hacek + case 3020: state = 3112; break; // &h -> &hk + case 3136: state = 3137; break; // &hoo -> &hook + case 3199: state = 3200; break; // &Hstro -> &Hstrok + case 3204: state = 3205; break; // &hstro -> &hstrok + case 3436: state = 3437; break; // &intlarh -> &intlarhk + case 3539: state = 3540; break; // &Iu -> &Iuk + case 3544: state = 3545; break; // &iu -> &iuk + case 3608: state = 3609; break; // &Ju -> &Juk + case 3613: state = 3614; break; // &ju -> &juk + case 3776: state = 3777; break; // &larrh -> &larrhk + case 3818: state = 3819; break; // &lbbr -> &lbbrk + case 3821: state = 3828; break; // &lbr -> &lbrk + case 3823: state = 3826; break; // &lbrac -> &lbrack + case 3909: state = 3910; break; // &LeftAngleBrac -> &LeftAngleBrack + case 3970: state = 3971; break; // &LeftDoubleBrac -> &LeftDoubleBrack + case 4335: state = 4336; break; // &lhbl -> &lhblk + case 4431: state = 4432; break; // &lobr -> &lobrk + case 4686: state = 4687; break; // &Lstro -> &Lstrok + case 4691: state = 4692; break; // &lstro -> &lstrok + case 4804: state = 4805; break; // &mar -> &mark + case 5068: state = 5069; break; // &nearh -> &nearhk + case 5106: state = 5107; break; // &NegativeThic -> &NegativeThick + case 5351: state = 5352; break; // &NoBrea -> &NoBreak + case 5358: state = 5359; break; // &NonBrea -> &NonBreak + case 6114: state = 6115; break; // &nwarh -> &nwarhk + case 6444: state = 6447; break; // &OverBrac -> &OverBrack + case 6515: state = 6516; break; // &perten -> &pertenk + case 6550: state = 6551; break; // &pitchfor -> &pitchfork + case 6557: state = 6563; break; // &plan -> &plank + case 6558: state = 6559; break; // &planc -> &planck + case 6947: state = 6948; break; // &rarrh -> &rarrhk + case 7002: state = 7003; break; // &rbbr -> &rbbrk + case 7005: state = 7012; break; // &rbr -> &rbrk + case 7007: state = 7010; break; // &rbrac -> &rbrack + case 7183: state = 7184; break; // &RightAngleBrac -> &RightAngleBrack + case 7245: state = 7246; break; // &RightDoubleBrac -> &RightDoubleBrack + case 7478: state = 7479; break; // &robr -> &robrk + case 7706: state = 7707; break; // &searh -> &searhk + case 8378: state = 8379; break; // &swarh -> &swarhk + case 8416: state = 8417; break; // &tbr -> &tbrk + case 8461: state = 8527; break; // &th -> &thk + case 8494: state = 8495; break; // &thic -> &thick + case 8508: state = 8509; break; // &Thic -> &Thick + case 8611: state = 8612; break; // &topfor -> &topfork + case 8729: state = 8730; break; // &Tstro -> &Tstrok + case 8734: state = 8735; break; // &tstro -> &tstrok + case 8884: state = 8885; break; // &uhbl -> &uhblk + case 8926: state = 8929; break; // &UnderBrac -> &UnderBrack + case 9208: state = 9217; break; // &var -> &vark default: return false; } break; case 'l': switch (state) { - case 0: state = 2881; break; // & -> &l - case 1: state = 68; break; // &A -> &Al - case 7: state = 60; break; // &a -> &al - case 38: state = 39; break; // &AE -> &AEl - case 42: state = 43; break; // &ae -> &ael - case 80: state = 83; break; // &ama -> &amal - case 96: state = 97; break; // &ands -> &andsl - case 102: state = 104; break; // &ang -> &angl - case 155: state = 156; break; // &App -> &Appl - case 197: state = 198; break; // &Ati -> &Atil - case 202: state = 203; break; // &ati -> &atil - case 207: state = 208; break; // &Aum -> Ä - case 210: state = 211; break; // &aum -> ä - case 222: state = 396; break; // &b -> &bl - case 233: state = 234; break; // &backepsi -> &backepsil - case 251: state = 252; break; // &Backs -> &Backsl - case 315: state = 316; break; // &Bernou -> &Bernoul - case 316: state = 317; break; // &Bernoul -> &Bernoull - case 347: state = 348; break; // &bigop -> &bigopl - case 369: state = 370; break; // &bigtriang -> &bigtriangl - case 379: state = 380; break; // &bigup -> &bigupl - case 399: state = 400; break; // &black -> &blackl - case 418: state = 419; break; // &blacktriang -> &blacktriangl - case 420: state = 425; break; // &blacktriangle -> &blacktrianglel - case 474: state = 476; break; // &boxD -> &boxDl - case 477: state = 479; break; // &boxd -> &boxdl - case 499: state = 500; break; // &boxp -> &boxpl - case 508: state = 510; break; // &boxU -> &boxUl - case 511: state = 513; break; // &boxu -> &boxul - case 518: state = 525; break; // &boxV -> &boxVl - case 519: state = 527; break; // &boxv -> &boxvl - case 561: state = 562; break; // &bso -> &bsol - case 568: state = 569; break; // &bu -> &bul - case 569: state = 570; break; // &bul -> &bull - case 583: state = 803; break; // &C -> &Cl - case 589: state = 849; break; // &c -> &cl - case 615: state = 616; break; // &Capita -> &Capital - case 627: state = 628; break; // &CapitalDifferentia -> &CapitalDifferential - case 636: state = 637; break; // &Cay -> &Cayl - case 655: state = 656; break; // &Ccedi -> Ç - case 659: state = 660; break; // &ccedi -> ç - case 685: state = 686; break; // &cedi -> ¸ - case 689: state = 690; break; // &Cedi -> &Cedil - case 690: state = 691; break; // &Cedil -> &Cedill - case 734: state = 737; break; // &circ -> &circl - case 743: state = 744; break; // &circlearrow -> &circlearrowl - case 767: state = 768; break; // &Circ -> &Circl - case 780: state = 781; break; // &CircleP -> &CirclePl - case 824: state = 825; break; // &ClockwiseContourIntegra -> &ClockwiseContourIntegral - case 830: state = 831; break; // &CloseCur -> &CloseCurl - case 836: state = 837; break; // &CloseCurlyDoub -> &CloseCurlyDoubl - case 856: state = 857; break; // &Co -> &Col - case 860: state = 861; break; // &co -> &col - case 871: state = 874; break; // &comp -> &compl - case 911: state = 912; break; // &ContourIntegra -> &ContourIntegral - case 937: state = 938; break; // &CounterC -> &CounterCl - case 959: state = 960; break; // &CounterClockwiseContourIntegra -> &CounterClockwiseContourIntegral - case 987: state = 999; break; // &cu -> &cul - case 991: state = 992; break; // &cudarr -> &cudarrl - case 1026: state = 1031; break; // &cur -> &curl - case 1060: state = 1061; break; // &curvearrow -> &curvearrowl - case 1086: state = 1087; break; // &cy -> &cyl - case 1097: state = 1283; break; // &d -> &dl - case 1098: state = 1103; break; // &da -> &dal - case 1120: state = 1126; break; // &db -> &dbl - case 1161: state = 1167; break; // &de -> &del - case 1163: state = 1164; break; // &De -> &Del - case 1188: state = 1189; break; // &dhar -> &dharl - case 1199: state = 1200; break; // &Diacritica -> &Diacritical - case 1210: state = 1211; break; // &DiacriticalDoub -> &DiacriticalDoubl - case 1224: state = 1225; break; // &DiacriticalTi -> &DiacriticalTil - case 1252: state = 1253; break; // &Differentia -> &Differential - case 1291: state = 1292; break; // &do -> &dol - case 1292: state = 1293; break; // &dol -> &doll - case 1314: state = 1315; break; // &DotEqua -> &DotEqual - case 1321: state = 1322; break; // &dotp -> &dotpl - case 1332: state = 1333; break; // &doub -> &doubl - case 1344: state = 1345; break; // &Doub -> &Doubl - case 1360: state = 1361; break; // &DoubleContourIntegra -> &DoubleContourIntegral - case 1461: state = 1462; break; // &DoubleVertica -> &DoubleVertical - case 1516: state = 1517; break; // &downharpoon -> &downharpoonl - case 1614: state = 1615; break; // &dso -> &dsol - case 1641: state = 1642; break; // &dwang -> &dwangl - case 1656: state = 1729; break; // &E -> &El - case 1662: state = 1728; break; // &e -> &el - case 1688: state = 1689; break; // &eco -> &ecol - case 1728: state = 1741; break; // &el -> &ell - case 1765: state = 1766; break; // &EmptySma -> &EmptySmal - case 1766: state = 1767; break; // &EmptySmal -> &EmptySmall - case 1781: state = 1782; break; // &EmptyVerySma -> &EmptyVerySmal - case 1782: state = 1783; break; // &EmptyVerySmal -> &EmptyVerySmall - case 1813: state = 1818; break; // &ep -> &epl - case 1816: state = 1817; break; // &epars -> &eparsl - case 1822: state = 1829; break; // &epsi -> &epsil - case 1825: state = 1826; break; // &Epsi -> &Epsil - case 1838: state = 1839; break; // &eqco -> &eqcol - case 1842: state = 1845; break; // &eqs -> &eqsl - case 1848: state = 1852; break; // &eqslant -> &eqslantl - case 1858: state = 1859; break; // &Equa -> &Equal - case 1861: state = 1862; break; // &equa -> &equal - case 1865: state = 1866; break; // &EqualTi -> &EqualTil - case 1872: state = 1873; break; // &Equi -> &Equil - case 1888: state = 1889; break; // &eqvpars -> &eqvparsl - case 1918: state = 1919; break; // &Eum -> Ë - case 1921: state = 1922; break; // &eum -> ë - case 1926: state = 1927; break; // &exc -> &excl - case 1952: state = 1953; break; // &Exponentia -> &Exponential - case 1961: state = 1962; break; // &exponentia -> &exponential - case 1964: state = 2040; break; // &f -> &fl - case 1965: state = 1966; break; // &fa -> &fal - case 1966: state = 1967; break; // &fal -> &fall - case 1984: state = 1985; break; // &fema -> &femal - case 1987: state = 1992; break; // &ff -> &ffl - case 1988: state = 1989; break; // &ffi -> &ffil - case 1992: state = 1995; break; // &ffl -> &ffll - case 2001: state = 2002; break; // &fi -> &fil - case 2005: state = 2006; break; // &Fi -> &Fil - case 2006: state = 2007; break; // &Fil -> &Fill - case 2012: state = 2013; break; // &FilledSma -> &FilledSmal - case 2013: state = 2014; break; // &FilledSmal -> &FilledSmall - case 2027: state = 2028; break; // &FilledVerySma -> &FilledVerySmal - case 2028: state = 2029; break; // &FilledVerySmal -> &FilledVerySmall - case 2036: state = 2037; break; // &fj -> &fjl - case 2040: state = 2043; break; // &fl -> &fll - case 2059: state = 2060; break; // &ForA -> &ForAl - case 2060: state = 2061; break; // &ForAl -> &ForAll - case 2063: state = 2064; break; // &fora -> &foral - case 2064: state = 2065; break; // &foral -> &forall - case 2107: state = 2108; break; // &fras -> &frasl - case 2118: state = 2204; break; // &g -> &gl - case 2148: state = 2149; break; // &Gcedi -> &Gcedil - case 2165: state = 2167; break; // &gE -> &gEl - case 2166: state = 2168; break; // &ge -> &gel - case 2171: state = 2172; break; // &geqs -> &geqsl - case 2176: state = 2184; break; // &ges -> &gesl - case 2182: state = 2183; break; // &gesdoto -> &gesdotol - case 2196: state = 2197; break; // &gime -> &gimel - case 2241: state = 2242; break; // &GreaterEqua -> &GreaterEqual - case 2248: state = 2249; break; // &GreaterFu -> &GreaterFul - case 2249: state = 2250; break; // &GreaterFul -> &GreaterFull - case 2254: state = 2255; break; // &GreaterFullEqua -> &GreaterFullEqual - case 2267: state = 2268; break; // &GreaterS -> &GreaterSl - case 2275: state = 2276; break; // &GreaterSlantEqua -> &GreaterSlantEqual - case 2278: state = 2279; break; // &GreaterTi -> &GreaterTil - case 2289: state = 2291; break; // &gsim -> &gsiml - case 2294: state = 2302; break; // > -> >l - case 2311: state = 2334; break; // >r -> >rl - case 2324: state = 2325; break; // >req -> >reql - case 2329: state = 2330; break; // >reqq -> >reqql - case 2357: state = 2362; break; // &ha -> &hal - case 2365: state = 2366; break; // &hami -> &hamil - case 2397: state = 2405; break; // &he -> &hel - case 2405: state = 2406; break; // &hel -> &hell - case 2417: state = 2418; break; // &Hi -> &Hil - case 2449: state = 2450; break; // &hook -> &hookl - case 2484: state = 2485; break; // &Horizonta -> &Horizontal - case 2493: state = 2496; break; // &hs -> &hsl - case 2522: state = 2523; break; // &HumpEqua -> &HumpEqual - case 2526: state = 2527; break; // &hybu -> &hybul - case 2527: state = 2528; break; // &hybul -> &hybull - case 2565: state = 2566; break; // &iexc -> ¡ - case 2596: state = 2597; break; // &IJ -> &IJl - case 2600: state = 2601; break; // &ij -> &ijl - case 2612: state = 2621; break; // &imag -> &imagl - case 2636: state = 2637; break; // &Imp -> &Impl - case 2658: state = 2684; break; // &int -> &intl - case 2660: state = 2661; break; // &intca -> &intcal - case 2670: state = 2671; break; // &Integra -> &Integral - case 2674: state = 2675; break; // &interca -> &intercal - case 2697: state = 2698; break; // &Invisib -> &Invisibl - case 2757: state = 2758; break; // &Iti -> &Itil - case 2761: state = 2762; break; // &iti -> &itil - case 2773: state = 2774; break; // &Ium -> Ï - case 2775: state = 2776; break; // &ium -> ï - case 2839: state = 2840; break; // &Kcedi -> &Kcedil - case 2844: state = 2845; break; // &kcedi -> &kcedil - case 2881: state = 3409; break; // &l -> &ll - case 2886: state = 3408; break; // &L -> &Ll - case 2918: state = 2920; break; // &lang -> &langl - case 2923: state = 2924; break; // &Lap -> &Lapl - case 2939: state = 2947; break; // &larr -> &larrl - case 2949: state = 2950; break; // &larrp -> &larrpl - case 2954: state = 2955; break; // &larrt -> &larrtl - case 2959: state = 2960; break; // &lAtai -> &lAtail - case 2962: state = 2963; break; // &latai -> &latail - case 2984: state = 2985; break; // &lbrks -> &lbrksl - case 3000: state = 3001; break; // &Lcedi -> &Lcedil - case 3004: state = 3005; break; // &lcedi -> &lcedil - case 3006: state = 3007; break; // &lcei -> &lceil - case 3038: state = 3039; break; // &LeftAng -> &LeftAngl - case 3058: state = 3139; break; // &left -> &leftl - case 3079: state = 3080; break; // &leftarrowtai -> &leftarrowtail - case 3083: state = 3084; break; // &LeftCei -> &LeftCeil - case 3091: state = 3092; break; // &LeftDoub -> &LeftDoubl - case 3121: state = 3122; break; // &LeftF -> &LeftFl - case 3232: state = 3233; break; // &LeftTriang -> &LeftTriangl - case 3241: state = 3242; break; // &LeftTriangleEqua -> &LeftTriangleEqual - case 3286: state = 3287; break; // &leqs -> &leqsl - case 3326: state = 3327; break; // &LessEqua -> &LessEqual - case 3336: state = 3337; break; // &LessFu -> &LessFul - case 3337: state = 3338; break; // &LessFul -> &LessFull - case 3342: state = 3343; break; // &LessFullEqua -> &LessFullEqual - case 3361: state = 3362; break; // &LessS -> &LessSl - case 3369: state = 3370; break; // &LessSlantEqua -> &LessSlantEqual - case 3372: state = 3373; break; // &LessTi -> &LessTil - case 3376: state = 3381; break; // &lf -> &lfl - case 3397: state = 3398; break; // &lharu -> &lharul - case 3399: state = 3400; break; // &lhb -> &lhbl - case 3477: state = 3487; break; // &Long -> &Longl - case 3497: state = 3498; break; // &long -> &longl - case 3579: state = 3580; break; // &looparrow -> &looparrowl - case 3589: state = 3595; break; // &lop -> &lopl - case 3640: state = 3641; break; // &lpar -> &lparl - case 3692: state = 3708; break; // < -> <l - case 3745: state = 3855; break; // &m -> &ml - case 3746: state = 3749; break; // &ma -> &mal - case 3761: state = 3766; break; // &mapsto -> &mapstol - case 3801: state = 3802; break; // &measuredang -> &measuredangl - case 3804: state = 3814; break; // &Me -> &Mel - case 3814: state = 3815; break; // &Mel -> &Mell - case 3851: state = 3852; break; // &MinusP -> &MinusPl - case 3861: state = 3862; break; // &mnp -> &mnpl - case 3867: state = 3868; break; // &mode -> &model - case 3887: state = 3888; break; // &mu -> &mul - case 3897: state = 4121; break; // &n -> &nl - case 3899: state = 3900; break; // &nab -> &nabl - case 3927: state = 3928; break; // &natura -> &natural - case 3950: state = 3951; break; // &Ncedi -> &Ncedil - case 3954: state = 3955; break; // &ncedi -> &ncedil - case 4086: state = 4087; break; // &ngeqs -> &ngeqsl - case 4132: state = 4177; break; // &nL -> &nLl - case 4170: state = 4171; break; // &nleqs -> &nleqsl - case 4234: state = 4235; break; // &NotDoub -> &NotDoubl - case 4243: state = 4244; break; // &NotDoubleVertica -> &NotDoubleVertical - case 4248: state = 4249; break; // &NotE -> &NotEl - case 4257: state = 4258; break; // &NotEqua -> &NotEqual - case 4260: state = 4261; break; // &NotEqualTi -> &NotEqualTil - case 4279: state = 4280; break; // &NotGreaterEqua -> &NotGreaterEqual - case 4282: state = 4283; break; // &NotGreaterFu -> &NotGreaterFul - case 4283: state = 4284; break; // &NotGreaterFul -> &NotGreaterFull - case 4288: state = 4289; break; // &NotGreaterFullEqua -> &NotGreaterFullEqual - case 4301: state = 4302; break; // &NotGreaterS -> &NotGreaterSl - case 4309: state = 4310; break; // &NotGreaterSlantEqua -> &NotGreaterSlantEqual - case 4312: state = 4313; break; // &NotGreaterTi -> &NotGreaterTil - case 4331: state = 4332; break; // &NotHumpEqua -> &NotHumpEqual - case 4352: state = 4353; break; // &NotLeftTriang -> &NotLeftTriangl - case 4361: state = 4362; break; // &NotLeftTriangleEqua -> &NotLeftTriangleEqual - case 4368: state = 4369; break; // &NotLessEqua -> &NotLessEqual - case 4381: state = 4382; break; // &NotLessS -> &NotLessSl - case 4389: state = 4390; break; // &NotLessSlantEqua -> &NotLessSlantEqual - case 4392: state = 4393; break; // &NotLessTi -> &NotLessTil - case 4441: state = 4442; break; // &NotPrecedesEqua -> &NotPrecedesEqual - case 4443: state = 4444; break; // &NotPrecedesS -> &NotPrecedesSl - case 4451: state = 4452; break; // &NotPrecedesSlantEqua -> &NotPrecedesSlantEqual - case 4460: state = 4461; break; // &NotReverseE -> &NotReverseEl - case 4476: state = 4477; break; // &NotRightTriang -> &NotRightTriangl - case 4485: state = 4486; break; // &NotRightTriangleEqua -> &NotRightTriangleEqual - case 4502: state = 4503; break; // &NotSquareSubsetEqua -> &NotSquareSubsetEqual - case 4513: state = 4514; break; // &NotSquareSupersetEqua -> &NotSquareSupersetEqual - case 4523: state = 4524; break; // &NotSubsetEqua -> &NotSubsetEqual - case 4534: state = 4535; break; // &NotSucceedsEqua -> &NotSucceedsEqual - case 4536: state = 4537; break; // &NotSucceedsS -> &NotSucceedsSl - case 4544: state = 4545; break; // &NotSucceedsSlantEqua -> &NotSucceedsSlantEqual - case 4547: state = 4548; break; // &NotSucceedsTi -> &NotSucceedsTil - case 4560: state = 4561; break; // &NotSupersetEqua -> &NotSupersetEqual - case 4563: state = 4564; break; // &NotTi -> &NotTil - case 4570: state = 4571; break; // &NotTildeEqua -> &NotTildeEqual - case 4573: state = 4574; break; // &NotTildeFu -> &NotTildeFul - case 4574: state = 4575; break; // &NotTildeFul -> &NotTildeFull - case 4579: state = 4580; break; // &NotTildeFullEqua -> &NotTildeFullEqual - case 4582: state = 4583; break; // &NotTildeTi -> &NotTildeTil - case 4592: state = 4593; break; // &NotVertica -> &NotVertical - case 4600: state = 4601; break; // &npara -> &nparal - case 4601: state = 4602; break; // &nparal -> &nparall - case 4603: state = 4604; break; // &nparalle -> &nparallel - case 4605: state = 4606; break; // &npars -> &nparsl - case 4608: state = 4609; break; // &npo -> &npol - case 4673: state = 4674; break; // &nshortpara -> &nshortparal - case 4674: state = 4675; break; // &nshortparal -> &nshortparall - case 4676: state = 4677; break; // &nshortparalle -> &nshortparallel - case 4718: state = 4730; break; // &nt -> &ntl - case 4719: state = 4720; break; // &ntg -> &ntgl - case 4722: state = 4723; break; // &Nti -> &Ntil - case 4726: state = 4727; break; // &nti -> &ntil - case 4736: state = 4737; break; // &ntriang -> &ntriangl - case 4738: state = 4739; break; // &ntriangle -> &ntrianglel - case 4760: state = 4792; break; // &nv -> &nvl - case 4833: state = 4908; break; // &o -> &ol - case 4856: state = 4857; break; // &Odb -> &Odbl - case 4860: state = 4861; break; // &odb -> &odbl - case 4869: state = 4870; break; // &odso -> &odsol - case 4872: state = 4873; break; // &OE -> &OEl - case 4876: state = 4877; break; // &oe -> &oel - case 4957: state = 4987; break; // &op -> &opl - case 4965: state = 4966; break; // &OpenCur -> &OpenCurl - case 4971: state = 4972; break; // &OpenCurlyDoub -> &OpenCurlyDoubl - case 5008: state = 5009; break; // &ors -> &orsl - case 5015: state = 5021; break; // &Os -> &Osl - case 5018: state = 5025; break; // &os -> &osl - case 5029: state = 5030; break; // &oso -> &osol - case 5032: state = 5033; break; // &Oti -> &Otil - case 5037: state = 5038; break; // &oti -> &otil - case 5050: state = 5051; break; // &Oum -> Ö - case 5053: state = 5054; break; // &oum -> ö - case 5083: state = 5150; break; // &p -> &pl - case 5086: state = 5087; break; // ¶ -> ¶l - case 5087: state = 5088; break; // ¶l -> ¶ll - case 5089: state = 5090; break; // ¶lle -> ¶llel - case 5091: state = 5094; break; // &pars -> &parsl - case 5096: state = 5172; break; // &P -> &Pl - case 5101: state = 5102; break; // &Partia -> &Partial - case 5117: state = 5118; break; // &permi -> &permil - case 5196: state = 5197; break; // &Poincarep -> &Poincarepl - case 5233: state = 5234; break; // &preccur -> &preccurl - case 5247: state = 5248; break; // &PrecedesEqua -> &PrecedesEqual - case 5249: state = 5250; break; // &PrecedesS -> &PrecedesSl - case 5257: state = 5258; break; // &PrecedesSlantEqua -> &PrecedesSlantEqual - case 5260: state = 5261; break; // &PrecedesTi -> &PrecedesTil - case 5303: state = 5308; break; // &prof -> &profl - case 5304: state = 5305; break; // &profa -> &profal - case 5324: state = 5325; break; // &Proportiona -> &Proportional - case 5333: state = 5334; break; // &prure -> &prurel - case 5397: state = 5854; break; // &r -> &rl - case 5426: state = 5429; break; // &rang -> &rangl - case 5439: state = 5450; break; // &rarr -> &rarrl - case 5452: state = 5453; break; // &rarrp -> &rarrpl - case 5457: state = 5458; break; // &Rarrt -> &Rarrtl - case 5459: state = 5460; break; // &rarrt -> &rarrtl - case 5464: state = 5465; break; // &rAtai -> &rAtail - case 5468: state = 5469; break; // &ratai -> &ratail - case 5473: state = 5474; break; // &rationa -> &rational - case 5498: state = 5499; break; // &rbrks -> &rbrksl - case 5514: state = 5515; break; // &Rcedi -> &Rcedil - case 5518: state = 5519; break; // &rcedi -> &rcedil - case 5520: state = 5521; break; // &rcei -> &rceil - case 5526: state = 5529; break; // &rd -> &rdl - case 5542: state = 5543; break; // &rea -> &real - case 5562: state = 5563; break; // &ReverseE -> &ReverseEl - case 5571: state = 5572; break; // &ReverseEqui -> &ReverseEquil - case 5584: state = 5585; break; // &ReverseUpEqui -> &ReverseUpEquil - case 5592: state = 5597; break; // &rf -> &rfl - case 5611: state = 5612; break; // &rharu -> &rharul - case 5623: state = 5624; break; // &RightAng -> &RightAngl - case 5645: state = 5725; break; // &right -> &rightl - case 5665: state = 5666; break; // &rightarrowtai -> &rightarrowtail - case 5669: state = 5670; break; // &RightCei -> &RightCeil - case 5677: state = 5678; break; // &RightDoub -> &RightDoubl - case 5707: state = 5708; break; // &RightF -> &RightFl - case 5792: state = 5793; break; // &RightTriang -> &RightTriangl - case 5801: state = 5802; break; // &RightTriangleEqua -> &RightTriangleEqual - case 5884: state = 5891; break; // &rop -> &ropl - case 5904: state = 5905; break; // &RoundImp -> &RoundImpl - case 5915: state = 5916; break; // &rppo -> &rppol - case 5961: state = 5964; break; // &rtri -> &rtril - case 5968: state = 5969; break; // &Ru -> &Rul - case 5972: state = 5973; break; // &RuleDe -> &RuleDel - case 5978: state = 5979; break; // &ru -> &rul - case 5991: state = 6188; break; // &s -> &sl - case 6019: state = 6020; break; // &Scedi -> &Scedil - case 6022: state = 6023; break; // &scedi -> &scedil - case 6038: state = 6039; break; // &scpo -> &scpol - case 6135: state = 6136; break; // &shortpara -> &shortparal - case 6136: state = 6137; break; // &shortparal -> &shortparall - case 6138: state = 6139; break; // &shortparalle -> &shortparallel - case 6168: state = 6176; break; // &sim -> &siml - case 6180: state = 6181; break; // &simp -> &simpl - case 6193: state = 6194; break; // &Sma -> &Smal - case 6194: state = 6195; break; // &Smal -> &Small - case 6199: state = 6200; break; // &SmallCirc -> &SmallCircl - case 6203: state = 6204; break; // &sma -> &smal - case 6204: state = 6205; break; // &smal -> &small - case 6221: state = 6222; break; // &smepars -> &smeparsl - case 6223: state = 6225; break; // &smi -> &smil - case 6235: state = 6240; break; // &so -> &sol - case 6314: state = 6315; break; // &SquareSubsetEqua -> &SquareSubsetEqual - case 6325: state = 6326; break; // &SquareSupersetEqua -> &SquareSupersetEqual - case 6349: state = 6350; break; // &ssmi -> &ssmil - case 6372: state = 6373; break; // &straightepsi -> &straightepsil - case 6394: state = 6395; break; // &submu -> &submul - case 6400: state = 6401; break; // &subp -> &subpl - case 6420: state = 6421; break; // &SubsetEqua -> &SubsetEqual - case 6441: state = 6442; break; // &succcur -> &succcurl - case 6455: state = 6456; break; // &SucceedsEqua -> &SucceedsEqual - case 6457: state = 6458; break; // &SucceedsS -> &SucceedsSl - case 6465: state = 6466; break; // &SucceedsSlantEqua -> &SucceedsSlantEqual - case 6468: state = 6469; break; // &SucceedsTi -> &SucceedsTil - case 6500: state = 6531; break; // &sup -> &supl - case 6523: state = 6524; break; // &SupersetEqua -> &SupersetEqual - case 6527: state = 6528; break; // &suphso -> &suphsol - case 6536: state = 6537; break; // &supmu -> &supmul - case 6542: state = 6543; break; // &supp -> &suppl - case 6579: state = 6580; break; // &sz -> &szl - case 6609: state = 6610; break; // &Tcedi -> &Tcedil - case 6613: state = 6614; break; // &tcedi -> &tcedil - case 6620: state = 6621; break; // &te -> &tel - case 6696: state = 6697; break; // &Ti -> &Til - case 6700: state = 6701; break; // &ti -> &til - case 6707: state = 6708; break; // &TildeEqua -> &TildeEqual - case 6710: state = 6711; break; // &TildeFu -> &TildeFul - case 6711: state = 6712; break; // &TildeFul -> &TildeFull - case 6716: state = 6717; break; // &TildeFullEqua -> &TildeFullEqual - case 6719: state = 6720; break; // &TildeTi -> &TildeTil - case 6767: state = 6768; break; // &triang -> &triangl - case 6769: state = 6774; break; // &triangle -> &trianglel - case 6799: state = 6800; break; // &Trip -> &Tripl - case 6805: state = 6806; break; // &trip -> &tripl - case 6853: state = 6854; break; // &twohead -> &twoheadl - case 6879: state = 6965; break; // &u -> &ul - case 6925: state = 6926; break; // &Udb -> &Udbl - case 6929: state = 6930; break; // &udb -> &udbl - case 6959: state = 6960; break; // &uhar -> &uharl - case 6962: state = 6963; break; // &uhb -> &uhbl - case 6982: state = 6986; break; // &um -> ¨ - case 7015: state = 7016; break; // &UnionP -> &UnionPl - case 7042: state = 7114; break; // &up -> &upl - case 7090: state = 7091; break; // &UpEqui -> &UpEquil - case 7104: state = 7105; break; // &upharpoon -> &upharpoonl - case 7140: state = 7144; break; // &Upsi -> &Upsil - case 7142: state = 7147; break; // &upsi -> &upsil - case 7197: state = 7198; break; // &Uti -> &Util - case 7201: state = 7202; break; // &uti -> &util - case 7213: state = 7214; break; // &Uum -> Ü - case 7215: state = 7216; break; // &uum -> ü - case 7220: state = 7221; break; // &uwang -> &uwangl - case 7223: state = 7398; break; // &v -> &vl - case 7233: state = 7234; break; // &varepsi -> &varepsil - case 7295: state = 7296; break; // &vartriang -> &vartriangl - case 7297: state = 7298; break; // &vartriangle -> &vartrianglel - case 7326: state = 7335; break; // &Vdash -> &Vdashl - case 7338: state = 7345; break; // &ve -> &vel - case 7345: state = 7346; break; // &vel -> &vell - case 7361: state = 7362; break; // &Vertica -> &Vertical - case 7380: state = 7381; break; // &VerticalTi -> &VerticalTil - case 7495: state = 7522; break; // &x -> &xl - case 7542: state = 7544; break; // &xop -> &xopl - case 7569: state = 7570; break; // &xup -> &xupl - case 7641: state = 7642; break; // &Yum -> &Yuml - case 7643: state = 7644; break; // &yum -> ÿ + case 0: state = 3692; break; // & -> &l + case 1: state = 89; break; // &A -> &Al + case 8: state = 79; break; // &a -> &al + case 50: state = 51; break; // &AE -> &AEl + case 55: state = 56; break; // &ae -> &ael + case 104: state = 108; break; // &ama -> &amal + case 128: state = 129; break; // &ands -> &andsl + case 136: state = 140; break; // &ang -> &angl + case 217: state = 218; break; // &App -> &Appl + case 270: state = 271; break; // &Ati -> &Atil + case 276: state = 277; break; // &ati -> &atil + case 282: state = 283; break; // &Aum -> Ä + case 286: state = 287; break; // &aum -> ä + case 301: state = 519; break; // &b -> &bl + case 313: state = 314; break; // &backepsi -> &backepsil + case 335: state = 336; break; // &Backs -> &Backsl + case 417: state = 418; break; // &Bernou -> &Bernoul + case 418: state = 419; break; // &Bernoul -> &Bernoull + case 460: state = 461; break; // &bigop -> &bigopl + case 486: state = 487; break; // &bigtriang -> &bigtriangl + case 498: state = 499; break; // &bigup -> &bigupl + case 522: state = 523; break; // &black -> &blackl + case 543: state = 544; break; // &blacktriang -> &blacktriangl + case 545: state = 552; break; // &blacktriangle -> &blacktrianglel + case 618: state = 621; break; // &boxD -> &boxDl + case 623: state = 626; break; // &boxd -> &boxdl + case 662: state = 663; break; // &boxp -> &boxpl + case 673: state = 676; break; // &boxU -> &boxUl + case 678: state = 681; break; // &boxu -> &boxul + case 691: state = 705; break; // &boxV -> &boxVl + case 693: state = 709; break; // &boxv -> &boxvl + case 757: state = 758; break; // &bso -> &bsol + case 767: state = 768; break; // &bu -> &bul + case 768: state = 769; break; // &bul -> &bull + case 789: state = 1068; break; // &C -> &Cl + case 796: state = 1117; break; // &c -> &cl + case 830: state = 831; break; // &Capita -> &Capital + case 842: state = 843; break; // &CapitalDifferentia -> &CapitalDifferential + case 855: state = 856; break; // &Cay -> &Cayl + case 878: state = 879; break; // &Ccedi -> Ç + case 883: state = 884; break; // &ccedi -> ç + case 917: state = 918; break; // &cedi -> ¸ + case 922: state = 923; break; // &Cedi -> &Cedil + case 923: state = 924; break; // &Cedil -> &Cedill + case 981: state = 986; break; // &circ -> &circl + case 992: state = 993; break; // &circlearrow -> &circlearrowl + case 1021: state = 1022; break; // &Circ -> &Circl + case 1038: state = 1039; break; // &CircleP -> &CirclePl + case 1089: state = 1090; break; // &ClockwiseContourIntegra -> &ClockwiseContourIntegral + case 1096: state = 1097; break; // &CloseCur -> &CloseCurl + case 1102: state = 1103; break; // &CloseCurlyDoub -> &CloseCurlyDoubl + case 1126: state = 1127; break; // &Co -> &Col + case 1131: state = 1132; break; // &co -> &col + case 1148: state = 1153; break; // &comp -> &compl + case 1197: state = 1198; break; // &ContourIntegra -> &ContourIntegral + case 1231: state = 1232; break; // &CounterC -> &CounterCl + case 1253: state = 1254; break; // &CounterClockwiseContourIntegra -> &CounterClockwiseContourIntegral + case 1292: state = 1308; break; // &cu -> &cul + case 1296: state = 1297; break; // &cudarr -> &cudarrl + case 1346: state = 1353; break; // &cur -> &curl + case 1387: state = 1388; break; // &curvearrow -> &curvearrowl + case 1419: state = 1420; break; // &cy -> &cyl + case 1432: state = 1669; break; // &d -> &dl + case 1433: state = 1439; break; // &da -> &dal + case 1463: state = 1470; break; // &db -> &dbl + case 1516: state = 1525; break; // &de -> &del + case 1519: state = 1520; break; // &De -> &Del + case 1552: state = 1553; break; // &dhar -> &dharl + case 1565: state = 1566; break; // &Diacritica -> &Diacritical + case 1578: state = 1579; break; // &DiacriticalDoub -> &DiacriticalDoubl + case 1594: state = 1595; break; // &DiacriticalTi -> &DiacriticalTil + case 1629: state = 1630; break; // &Differentia -> &Differential + case 1679: state = 1680; break; // &do -> &dol + case 1680: state = 1681; break; // &dol -> &doll + case 1710: state = 1711; break; // &DotEqua -> &DotEqual + case 1719: state = 1720; break; // &dotp -> &dotpl + case 1732: state = 1733; break; // &doub -> &doubl + case 1745: state = 1746; break; // &Doub -> &Doubl + case 1761: state = 1762; break; // &DoubleContourIntegra -> &DoubleContourIntegral + case 1875: state = 1876; break; // &DoubleVertica -> &DoubleVertical + case 1938: state = 1939; break; // &downharpoon -> &downharpoonl + case 2054: state = 2055; break; // &dso -> &dsol + case 2089: state = 2090; break; // &dwang -> &dwangl + case 2108: state = 2206; break; // &E -> &El + case 2115: state = 2204; break; // &e -> &el + case 2148: state = 2149; break; // &eco -> &ecol + case 2204: state = 2220; break; // &el -> &ell + case 2251: state = 2252; break; // &EmptySma -> &EmptySmal + case 2252: state = 2253; break; // &EmptySmal -> &EmptySmall + case 2269: state = 2270; break; // &EmptyVerySma -> &EmptyVerySmal + case 2270: state = 2271; break; // &EmptyVerySmal -> &EmptyVerySmall + case 2312: state = 2319; break; // &ep -> &epl + case 2316: state = 2317; break; // &epars -> &eparsl + case 2324: state = 2333; break; // &epsi -> &epsil + case 2328: state = 2329; break; // &Epsi -> &Epsil + case 2345: state = 2346; break; // &eqco -> &eqcol + case 2350: state = 2354; break; // &eqs -> &eqsl + case 2357: state = 2362; break; // &eqslant -> &eqslantl + case 2369: state = 2370; break; // &Equa -> &Equal + case 2373: state = 2374; break; // &equa -> &equal + case 2378: state = 2379; break; // &EqualTi -> &EqualTil + case 2387: state = 2388; break; // &Equi -> &Equil + case 2406: state = 2407; break; // &eqvpars -> &eqvparsl + case 2448: state = 2449; break; // &Eum -> Ë + case 2452: state = 2453; break; // &eum -> ë + case 2459: state = 2460; break; // &exc -> &excl + case 2489: state = 2490; break; // &Exponentia -> &Exponential + case 2499: state = 2500; break; // &exponentia -> &exponential + case 2503: state = 2592; break; // &f -> &fl + case 2504: state = 2505; break; // &fa -> &fal + case 2505: state = 2506; break; // &fal -> &fall + case 2526: state = 2527; break; // &fema -> &femal + case 2530: state = 2536; break; // &ff -> &ffl + case 2531: state = 2532; break; // &ffi -> &ffil + case 2536: state = 2540; break; // &ffl -> &ffll + case 2549: state = 2550; break; // &fi -> &fil + case 2554: state = 2555; break; // &Fi -> &Fil + case 2555: state = 2556; break; // &Fil -> &Fill + case 2561: state = 2562; break; // &FilledSma -> &FilledSmal + case 2562: state = 2563; break; // &FilledSmal -> &FilledSmall + case 2577: state = 2578; break; // &FilledVerySma -> &FilledVerySmal + case 2578: state = 2579; break; // &FilledVerySmal -> &FilledVerySmall + case 2587: state = 2588; break; // &fj -> &fjl + case 2592: state = 2596; break; // &fl -> &fll + case 2617: state = 2618; break; // &ForA -> &ForAl + case 2618: state = 2619; break; // &ForAl -> &ForAll + case 2622: state = 2623; break; // &fora -> &foral + case 2623: state = 2624; break; // &foral -> &forall + case 2686: state = 2687; break; // &fras -> &frasl + case 2701: state = 2824; break; // &g -> &gl + case 2739: state = 2740; break; // &Gcedi -> &Gcedil + case 2763: state = 2767; break; // &gE -> &gEl + case 2765: state = 2769; break; // &ge -> &gel + case 2775: state = 2776; break; // &geqs -> &geqsl + case 2781: state = 2794; break; // &ges -> &gesl + case 2790: state = 2792; break; // &gesdoto -> &gesdotol + case 2813: state = 2814; break; // &gime -> &gimel + case 2875: state = 2876; break; // &GreaterEqua -> &GreaterEqual + case 2884: state = 2885; break; // &GreaterFu -> &GreaterFul + case 2885: state = 2886; break; // &GreaterFul -> &GreaterFull + case 2890: state = 2891; break; // &GreaterFullEqua -> &GreaterFullEqual + case 2906: state = 2907; break; // &GreaterS -> &GreaterSl + case 2914: state = 2915; break; // &GreaterSlantEqua -> &GreaterSlantEqual + case 2918: state = 2919; break; // &GreaterTi -> &GreaterTil + case 2932: state = 2936; break; // &gsim -> &gsiml + case 2942: state = 2954; break; // > -> >l + case 2965: state = 2993; break; // >r -> >rl + case 2981: state = 2982; break; // >req -> >reql + case 2987: state = 2988; break; // >reqq -> >reqql + case 3021: state = 3027; break; // &ha -> &hal + case 3031: state = 3032; break; // &hami -> &hamil + case 3074: state = 3084; break; // &he -> &hel + case 3084: state = 3085; break; // &hel -> &hell + case 3100: state = 3101; break; // &Hi -> &Hil + case 3137: state = 3138; break; // &hook -> &hookl + case 3177: state = 3178; break; // &Horizonta -> &Horizontal + case 3188: state = 3192; break; // &hs -> &hsl + case 3222: state = 3223; break; // &HumpEqua -> &HumpEqual + case 3227: state = 3228; break; // &hybu -> &hybul + case 3228: state = 3229; break; // &hybul -> &hybull + case 3278: state = 3279; break; // &iexc -> ¡ + case 3320: state = 3321; break; // &IJ -> &IJl + case 3325: state = 3326; break; // &ij -> &ijl + case 3341: state = 3352; break; // &imag -> &imagl + case 3372: state = 3373; break; // &Imp -> &Impl + case 3401: state = 3433; break; // &int -> &intl + case 3404: state = 3405; break; // &intca -> &intcal + case 3416: state = 3417; break; // &Integra -> &Integral + case 3421: state = 3422; break; // &interca -> &intercal + case 3448: state = 3449; break; // &Invisib -> &Invisibl + case 3529: state = 3530; break; // &Iti -> &Itil + case 3534: state = 3535; break; // &iti -> &itil + case 3549: state = 3550; break; // &Ium -> Ï + case 3552: state = 3553; break; // &ium -> ï + case 3635: state = 3636; break; // &Kcedi -> &Kcedil + case 3641: state = 3642; break; // &kcedi -> &kcedil + case 3692: state = 4348; break; // &l -> &ll + case 3698: state = 4346; break; // &L -> &Ll + case 3737: state = 3741; break; // &lang -> &langl + case 3746: state = 3747; break; // &Lap -> &Lapl + case 3766: state = 3779; break; // &larr -> &larrl + case 3782: state = 3783; break; // &larrp -> &larrpl + case 3789: state = 3790; break; // &larrt -> &larrtl + case 3796: state = 3797; break; // &lAtai -> &lAtail + case 3800: state = 3801; break; // &latai -> &latail + case 3831: state = 3832; break; // &lbrks -> &lbrksl + case 3851: state = 3852; break; // &Lcedi -> &Lcedil + case 3856: state = 3857; break; // &lcedi -> &lcedil + case 3859: state = 3860; break; // &lcei -> &lceil + case 3903: state = 3904; break; // &LeftAng -> &LeftAngl + case 3926: state = 4019; break; // &left -> &leftl + case 3950: state = 3951; break; // &leftarrowtai -> &leftarrowtail + case 3955: state = 3956; break; // &LeftCei -> &LeftCeil + case 3964: state = 3965; break; // &LeftDoub -> &LeftDoubl + case 3998: state = 3999; break; // &LeftF -> &LeftFl + case 4124: state = 4125; break; // &LeftTriang -> &LeftTriangl + case 4135: state = 4136; break; // &LeftTriangleEqua -> &LeftTriangleEqual + case 4191: state = 4192; break; // &leqs -> &leqsl + case 4243: state = 4244; break; // &LessEqua -> &LessEqual + case 4254: state = 4255; break; // &LessFu -> &LessFul + case 4255: state = 4256; break; // &LessFul -> &LessFull + case 4260: state = 4261; break; // &LessFullEqua -> &LessFullEqual + case 4284: state = 4285; break; // &LessS -> &LessSl + case 4292: state = 4293; break; // &LessSlantEqua -> &LessSlantEqual + case 4296: state = 4297; break; // &LessTi -> &LessTil + case 4301: state = 4307; break; // &lf -> &lfl + case 4330: state = 4332; break; // &lharu -> &lharul + case 4334: state = 4335; break; // &lhb -> &lhbl + case 4436: state = 4447; break; // &Long -> &Longl + case 4458: state = 4459; break; // &long -> &longl + case 4548: state = 4549; break; // &looparrow -> &looparrowl + case 4560: state = 4569; break; // &lop -> &lopl + case 4623: state = 4625; break; // &lpar -> &lparl + case 4698: state = 4720; break; // < -> <l + case 4767: state = 4909; break; // &m -> &ml + case 4768: state = 4772; break; // &ma -> &mal + case 4789: state = 4796; break; // &mapsto -> &mapstol + case 4839: state = 4840; break; // &measuredang -> &measuredangl + case 4843: state = 4854; break; // &Me -> &Mel + case 4854: state = 4855; break; // &Mel -> &Mell + case 4904: state = 4905; break; // &MinusP -> &MinusPl + case 4917: state = 4918; break; // &mnp -> &mnpl + case 4924: state = 4925; break; // &mode -> &model + case 4952: state = 4954; break; // &mu -> &mul + case 4965: state = 5256; break; // &n -> &nl + case 4967: state = 4968; break; // &nab -> &nabl + case 5005: state = 5006; break; // &natura -> &natural + case 5036: state = 5037; break; // &Ncedi -> &Ncedil + case 5041: state = 5042; break; // &ncedi -> &ncedil + case 5204: state = 5205; break; // &ngeqs -> &ngeqsl + case 5272: state = 5326; break; // &nL -> &nLl + case 5316: state = 5317; break; // &nleqs -> &nleqsl + case 5399: state = 5400; break; // &NotDoub -> &NotDoubl + case 5408: state = 5409; break; // &NotDoubleVertica -> &NotDoubleVertical + case 5414: state = 5415; break; // &NotE -> &NotEl + case 5424: state = 5425; break; // &NotEqua -> &NotEqual + case 5428: state = 5429; break; // &NotEqualTi -> &NotEqualTil + case 5450: state = 5451; break; // &NotGreaterEqua -> &NotGreaterEqual + case 5454: state = 5455; break; // &NotGreaterFu -> &NotGreaterFul + case 5455: state = 5456; break; // &NotGreaterFul -> &NotGreaterFull + case 5460: state = 5461; break; // &NotGreaterFullEqua -> &NotGreaterFullEqual + case 5476: state = 5477; break; // &NotGreaterS -> &NotGreaterSl + case 5484: state = 5485; break; // &NotGreaterSlantEqua -> &NotGreaterSlantEqual + case 5488: state = 5489; break; // &NotGreaterTi -> &NotGreaterTil + case 5509: state = 5510; break; // &NotHumpEqua -> &NotHumpEqual + case 5537: state = 5538; break; // &NotLeftTriang -> &NotLeftTriangl + case 5548: state = 5549; break; // &NotLeftTriangleEqua -> &NotLeftTriangleEqual + case 5557: state = 5558; break; // &NotLessEqua -> &NotLessEqual + case 5573: state = 5574; break; // &NotLessS -> &NotLessSl + case 5581: state = 5582; break; // &NotLessSlantEqua -> &NotLessSlantEqual + case 5585: state = 5586; break; // &NotLessTi -> &NotLessTil + case 5642: state = 5643; break; // &NotPrecedesEqua -> &NotPrecedesEqual + case 5645: state = 5646; break; // &NotPrecedesS -> &NotPrecedesSl + case 5653: state = 5654; break; // &NotPrecedesSlantEqua -> &NotPrecedesSlantEqual + case 5663: state = 5664; break; // &NotReverseE -> &NotReverseEl + case 5680: state = 5681; break; // &NotRightTriang -> &NotRightTriangl + case 5691: state = 5692; break; // &NotRightTriangleEqua -> &NotRightTriangleEqual + case 5710: state = 5711; break; // &NotSquareSubsetEqua -> &NotSquareSubsetEqual + case 5723: state = 5724; break; // &NotSquareSupersetEqua -> &NotSquareSupersetEqual + case 5735: state = 5736; break; // &NotSubsetEqua -> &NotSubsetEqual + case 5748: state = 5749; break; // &NotSucceedsEqua -> &NotSucceedsEqual + case 5751: state = 5752; break; // &NotSucceedsS -> &NotSucceedsSl + case 5759: state = 5760; break; // &NotSucceedsSlantEqua -> &NotSucceedsSlantEqual + case 5763: state = 5764; break; // &NotSucceedsTi -> &NotSucceedsTil + case 5778: state = 5779; break; // &NotSupersetEqua -> &NotSupersetEqual + case 5782: state = 5783; break; // &NotTi -> &NotTil + case 5790: state = 5791; break; // &NotTildeEqua -> &NotTildeEqual + case 5794: state = 5795; break; // &NotTildeFu -> &NotTildeFul + case 5795: state = 5796; break; // &NotTildeFul -> &NotTildeFull + case 5800: state = 5801; break; // &NotTildeFullEqua -> &NotTildeFullEqual + case 5804: state = 5805; break; // &NotTildeTi -> &NotTildeTil + case 5815: state = 5816; break; // &NotVertica -> &NotVertical + case 5825: state = 5826; break; // &npara -> &nparal + case 5826: state = 5827; break; // &nparal -> &nparall + case 5828: state = 5829; break; // &nparalle -> &nparallel + case 5831: state = 5832; break; // &npars -> &nparsl + case 5836: state = 5837; break; // &npo -> &npol + case 5921: state = 5922; break; // &nshortpara -> &nshortparal + case 5922: state = 5923; break; // &nshortparal -> &nshortparall + case 5924: state = 5925; break; // &nshortparalle -> &nshortparallel + case 5988: state = 6003; break; // &nt -> &ntl + case 5989: state = 5990; break; // &ntg -> &ntgl + case 5993: state = 5994; break; // &Nti -> &Ntil + case 5998: state = 5999; break; // &nti -> &ntil + case 6010: state = 6011; break; // &ntriang -> &ntriangl + case 6012: state = 6013; break; // &ntriangle -> &ntrianglel + case 6043: state = 6084; break; // &nv -> &nvl + case 6138: state = 6238; break; // &o -> &ol + case 6169: state = 6170; break; // &Odb -> &Odbl + case 6174: state = 6175; break; // &odb -> &odbl + case 6186: state = 6187; break; // &odso -> &odsol + case 6190: state = 6191; break; // &OE -> &OEl + case 6195: state = 6196; break; // &oe -> &oel + case 6302: state = 6336; break; // &op -> &opl + case 6311: state = 6312; break; // &OpenCur -> &OpenCurl + case 6317: state = 6318; break; // &OpenCurlyDoub -> &OpenCurlyDoubl + case 6368: state = 6369; break; // &ors -> &orsl + case 6378: state = 6386; break; // &Os -> &Osl + case 6382: state = 6391; break; // &os -> &osl + case 6396: state = 6397; break; // &oso -> &osol + case 6400: state = 6401; break; // &Oti -> &Otil + case 6406: state = 6407; break; // &oti -> &otil + case 6423: state = 6424; break; // &Oum -> Ö + case 6427: state = 6428; break; // &oum -> ö + case 6463: state = 6555; break; // &p -> &pl + case 6467: state = 6469; break; // ¶ -> ¶l + case 6469: state = 6470; break; // ¶l -> ¶ll + case 6471: state = 6472; break; // ¶lle -> ¶llel + case 6474: state = 6478; break; // &pars -> &parsl + case 6482: state = 6587; break; // &P -> &Pl + case 6487: state = 6488; break; // &Partia -> &Partial + case 6508: state = 6509; break; // &permi -> &permil + case 6616: state = 6617; break; // &Poincarep -> &Poincarepl + case 6666: state = 6667; break; // &preccur -> &preccurl + case 6682: state = 6683; break; // &PrecedesEqua -> &PrecedesEqual + case 6685: state = 6686; break; // &PrecedesS -> &PrecedesSl + case 6693: state = 6694; break; // &PrecedesSlantEqua -> &PrecedesSlantEqual + case 6697: state = 6698; break; // &PrecedesTi -> &PrecedesTil + case 6754: state = 6760; break; // &prof -> &profl + case 6755: state = 6756; break; // &profa -> &profal + case 6780: state = 6781; break; // &Proportiona -> &Proportional + case 6792: state = 6793; break; // &prure -> &prurel + case 6876: state = 7442; break; // &r -> &rl + case 6912: state = 6918; break; // &rang -> &rangl + case 6932: state = 6950; break; // &rarr -> &rarrl + case 6953: state = 6954; break; // &rarrp -> &rarrpl + case 6960: state = 6961; break; // &Rarrt -> &Rarrtl + case 6963: state = 6964; break; // &rarrt -> &rarrtl + case 6970: state = 6971; break; // &rAtai -> &rAtail + case 6975: state = 6976; break; // &ratai -> &ratail + case 6982: state = 6983; break; // &rationa -> &rational + case 7015: state = 7016; break; // &rbrks -> &rbrksl + case 7035: state = 7036; break; // &Rcedi -> &Rcedil + case 7040: state = 7041; break; // &rcedi -> &rcedil + case 7043: state = 7044; break; // &rcei -> &rceil + case 7053: state = 7057; break; // &rd -> &rdl + case 7075: state = 7076; break; // &rea -> &real + case 7102: state = 7103; break; // &ReverseE -> &ReverseEl + case 7112: state = 7113; break; // &ReverseEqui -> &ReverseEquil + case 7126: state = 7127; break; // &ReverseUpEqui -> &ReverseUpEquil + case 7135: state = 7141; break; // &rf -> &rfl + case 7160: state = 7162; break; // &rharu -> &rharul + case 7177: state = 7178; break; // &RightAng -> &RightAngl + case 7202: state = 7294; break; // &right -> &rightl + case 7225: state = 7226; break; // &rightarrowtai -> &rightarrowtail + case 7230: state = 7231; break; // &RightCei -> &RightCeil + case 7239: state = 7240; break; // &RightDoub -> &RightDoubl + case 7273: state = 7274; break; // &RightF -> &RightFl + case 7369: state = 7370; break; // &RightTriang -> &RightTriangl + case 7380: state = 7381; break; // &RightTriangleEqua -> &RightTriangleEqual + case 7481: state = 7491; break; // &rop -> &ropl + case 7506: state = 7507; break; // &RoundImp -> &RoundImpl + case 7520: state = 7521; break; // &rppo -> &rppol + case 7579: state = 7585; break; // &rtri -> &rtril + case 7590: state = 7591; break; // &Ru -> &Rul + case 7594: state = 7595; break; // &RuleDe -> &RuleDel + case 7601: state = 7602; break; // &ru -> &rul + case 7617: state = 7878; break; // &s -> &sl + case 7655: state = 7656; break; // &Scedi -> &Scedil + case 7659: state = 7660; break; // &scedi -> &scedil + case 7681: state = 7682; break; // &scpo -> &scpol + case 7806: state = 7807; break; // &shortpara -> &shortparal + case 7807: state = 7808; break; // &shortparal -> &shortparall + case 7809: state = 7810; break; // &shortparalle -> &shortparallel + case 7847: state = 7861; break; // &sim -> &siml + case 7868: state = 7869; break; // &simp -> &simpl + case 7884: state = 7885; break; // &Sma -> &Smal + case 7885: state = 7886; break; // &Smal -> &Small + case 7890: state = 7891; break; // &SmallCirc -> &SmallCircl + case 7895: state = 7896; break; // &sma -> &smal + case 7896: state = 7897; break; // &smal -> &small + case 7915: state = 7916; break; // &smepars -> &smeparsl + case 7918: state = 7921; break; // &smi -> &smil + case 7936: state = 7942; break; // &so -> &sol + case 8042: state = 8043; break; // &SquareSubsetEqua -> &SquareSubsetEqual + case 8055: state = 8056; break; // &SquareSupersetEqua -> &SquareSupersetEqual + case 8087: state = 8088; break; // &ssmi -> &ssmil + case 8115: state = 8116; break; // &straightepsi -> &straightepsil + case 8146: state = 8147; break; // &submu -> &submul + case 8155: state = 8156; break; // &subp -> &subpl + case 8181: state = 8182; break; // &SubsetEqua -> &SubsetEqual + case 8210: state = 8211; break; // &succcur -> &succcurl + case 8226: state = 8227; break; // &SucceedsEqua -> &SucceedsEqual + case 8229: state = 8230; break; // &SucceedsS -> &SucceedsSl + case 8237: state = 8238; break; // &SucceedsSlantEqua -> &SucceedsSlantEqual + case 8241: state = 8242; break; // &SucceedsTi -> &SucceedsTil + case 8284: state = 8328; break; // &sup -> &supl + case 8317: state = 8318; break; // &SupersetEqua -> &SupersetEqual + case 8322: state = 8323; break; // &suphso -> &suphsol + case 8334: state = 8335; break; // &supmu -> &supmul + case 8343: state = 8344; break; // &supp -> &suppl + case 8395: state = 8396; break; // &sz -> &szl + case 8433: state = 8434; break; // &Tcedi -> &Tcedil + case 8438: state = 8439; break; // &tcedi -> &tcedil + case 8449: state = 8450; break; // &te -> &tel + case 8544: state = 8545; break; // &Ti -> &Til + case 8549: state = 8550; break; // &ti -> &til + case 8557: state = 8558; break; // &TildeEqua -> &TildeEqual + case 8561: state = 8562; break; // &TildeFu -> &TildeFul + case 8562: state = 8563; break; // &TildeFul -> &TildeFull + case 8567: state = 8568; break; // &TildeFullEqua -> &TildeFullEqual + case 8571: state = 8572; break; // &TildeTi -> &TildeTil + case 8636: state = 8637; break; // &triang -> &triangl + case 8638: state = 8645; break; // &triangle -> &trianglel + case 8678: state = 8679; break; // &Trip -> &Tripl + case 8685: state = 8686; break; // &trip -> &tripl + case 8746: state = 8747; break; // &twohead -> &twoheadl + case 8775: state = 8887; break; // &u -> &ul + case 8835: state = 8836; break; // &Udb -> &Udbl + case 8840: state = 8841; break; // &udb -> &udbl + case 8878: state = 8879; break; // &uhar -> &uharl + case 8883: state = 8884; break; // &uhb -> &uhbl + case 8909: state = 8914; break; // &um -> ¨ + case 8949: state = 8950; break; // &UnionP -> &UnionPl + case 8983: state = 9064; break; // &up -> &upl + case 9037: state = 9038; break; // &UpEqui -> &UpEquil + case 9052: state = 9053; break; // &upharpoon -> &upharpoonl + case 9093: state = 9100; break; // &Upsi -> &Upsil + case 9096: state = 9104; break; // &upsi -> &upsil + case 9167: state = 9168; break; // &Uti -> &Util + case 9172: state = 9173; break; // &uti -> &util + case 9188: state = 9189; break; // &Uum -> Ü + case 9191: state = 9192; break; // &uum -> ü + case 9197: state = 9198; break; // &uwang -> &uwangl + case 9201: state = 9420; break; // &v -> &vl + case 9212: state = 9213; break; // &varepsi -> &varepsil + case 9289: state = 9290; break; // &vartriang -> &vartriangl + case 9291: state = 9292; break; // &vartriangle -> &vartrianglel + case 9328: state = 9340; break; // &Vdash -> &Vdashl + case 9345: state = 9355; break; // &ve -> &vel + case 9355: state = 9356; break; // &vel -> &vell + case 9376: state = 9377; break; // &Vertica -> &Vertical + case 9398: state = 9399; break; // &VerticalTi -> &VerticalTil + case 9548: state = 9585; break; // &x -> &xl + case 9611: state = 9614; break; // &xop -> &xopl + case 9646: state = 9647; break; // &xup -> &xupl + case 9741: state = 9742; break; // &Yum -> &Yuml + case 9744: state = 9745; break; // &yum -> ÿ default: return false; } break; case 'm': switch (state) { - case 0: state = 3745; break; // & -> &m - case 1: state = 75; break; // &A -> &Am - case 7: state = 79; break; // &a -> &am - case 64: state = 65; break; // &alefsy -> &alefsym - case 102: state = 106; break; // &ang -> &angm - case 191: state = 192; break; // &asy -> &asym - case 206: state = 207; break; // &Au -> &Aum - case 209: state = 210; break; // &au -> &aum - case 239: state = 240; break; // &backpri -> &backprim - case 243: state = 244; break; // &backsi -> &backsim - case 288: state = 300; break; // &be -> &bem - case 352: state = 353; break; // &bigoti -> &bigotim - case 464: state = 465; break; // &botto -> &bottom - case 470: state = 494; break; // &box -> &boxm - case 504: state = 505; break; // &boxti -> &boxtim - case 534: state = 535; break; // &bpri -> &bprim - case 555: state = 556; break; // &bse -> &bsem - case 558: state = 559; break; // &bsi -> &bsim - case 568: state = 573; break; // &bu -> &bum - case 577: state = 578; break; // &Bu -> &Bum - case 675: state = 676; break; // &ccupss -> &ccupssm - case 683: state = 693; break; // &ce -> &cem - case 724: state = 725; break; // &check -> &checkm - case 733: state = 796; break; // &cir -> &cirm - case 785: state = 786; break; // &CircleTi -> &CircleTim - case 860: state = 867; break; // &co -> &com - case 867: state = 868; break; // &com -> &comm - case 875: state = 876; break; // &comple -> &complem - case 1029: state = 1030; break; // &curarr -> &curarrm - case 1161: state = 1170; break; // &de -> &dem - case 1192: state = 1231; break; // &Dia -> &Diam - case 1229: state = 1230; break; // &dia -> &diam - case 1256: state = 1257; break; // &diga -> &digam - case 1257: state = 1258; break; // &digam -> &digamm - case 1270: state = 1271; break; // ÷onti -> ÷ontim - case 1302: state = 1316; break; // &dot -> &dotm - case 1656: state = 1746; break; // &E -> &Em - case 1662: state = 1750; break; // &e -> &em - case 1730: state = 1731; break; // &Ele -> &Elem - case 1763: state = 1764; break; // &EmptyS -> &EmptySm - case 1779: state = 1780; break; // &EmptyVeryS -> &EmptyVerySm - case 1843: state = 1844; break; // &eqsi -> &eqsim - case 1878: state = 1879; break; // &Equilibriu -> &Equilibrium - case 1906: state = 1907; break; // &Esi -> &Esim - case 1908: state = 1909; break; // &esi -> &esim - case 1917: state = 1918; break; // &Eu -> &Eum - case 1920: state = 1921; break; // &eu -> &eum - case 1982: state = 1983; break; // &fe -> &fem - case 2010: state = 2011; break; // &FilledS -> &FilledSm - case 2025: state = 2026; break; // &FilledVeryS -> &FilledVerySm - case 2119: state = 2129; break; // &ga -> &gam - case 2125: state = 2126; break; // &Ga -> &Gam - case 2126: state = 2127; break; // &Gam -> &Gamm - case 2129: state = 2130; break; // &gam -> &gamm - case 2194: state = 2195; break; // &gi -> &gim - case 2220: state = 2221; break; // &gnsi -> &gnsim - case 2288: state = 2289; break; // &gsi -> &gsim - case 2339: state = 2340; break; // >rsi -> >rsim - case 2357: state = 2364; break; // &ha -> &ham - case 2440: state = 2444; break; // &ho -> &hom - case 2508: state = 2509; break; // &Hu -> &Hum - case 2516: state = 2517; break; // &HumpDownHu -> &HumpDownHum - case 2533: state = 2604; break; // &I -> &Im - case 2539: state = 2608; break; // &i -> &im - case 2701: state = 2702; break; // &InvisibleCo -> &InvisibleCom - case 2702: state = 2703; break; // &InvisibleCom -> &InvisibleComm - case 2706: state = 2707; break; // &InvisibleTi -> &InvisibleTim - case 2765: state = 2773; break; // &Iu -> &Ium - case 2769: state = 2775; break; // &iu -> &ium - case 2782: state = 2793; break; // &j -> &jm - case 2881: state = 3439; break; // &l -> &lm - case 2886: state = 3434; break; // &L -> &Lm - case 2887: state = 2907; break; // &La -> &Lam - case 2892: state = 2911; break; // &la -> &lam - case 2897: state = 2898; break; // &lae -> &laem - case 2952: state = 2953; break; // &larrsi -> &larrsim - case 3224: state = 3225; break; // &leftthreeti -> &leftthreetim - case 3359: state = 3360; break; // &lesssi -> &lesssim - case 3464: state = 3465; break; // &lnsi -> &lnsim - case 3497: state = 3537; break; // &long -> &longm - case 3599: state = 3600; break; // &loti -> &lotim - case 3643: state = 3657; break; // &lr -> &lrm - case 3673: state = 3674; break; // &lsi -> &lsim - case 3704: state = 3705; break; // <i -> <im - case 3777: state = 3778; break; // &mco -> &mcom - case 3778: state = 3779; break; // &mcom -> &mcomm - case 3807: state = 3808; break; // &Mediu -> &Medium - case 3887: state = 3894; break; // &mu -> &mum - case 3890: state = 3891; break; // &multi -> &multim - case 3897: state = 4187; break; // &n -> &nm - case 3933: state = 3934; break; // &nbu -> &nbum - case 3995: state = 3996; break; // &NegativeMediu -> &NegativeMedium - case 4039: state = 4040; break; // &nesi -> &nesim - case 4095: state = 4096; break; // &ngsi -> &ngsim - case 4179: state = 4180; break; // &nlsi -> &nlsim - case 4250: state = 4251; break; // &NotEle -> &NotElem - case 4317: state = 4318; break; // &NotHu -> &NotHum - case 4325: state = 4326; break; // &NotHumpDownHu -> &NotHumpDownHum - case 4462: state = 4463; break; // &NotReverseEle -> &NotReverseElem - case 4653: state = 4682; break; // &ns -> &nsm - case 4666: state = 4667; break; // &nshort -> &nshortm - case 4678: state = 4679; break; // &nsi -> &nsim - case 4753: state = 4754; break; // &nu -> &num - case 4810: state = 4811; break; // &nvsi -> &nvsim - case 4827: state = 4923; break; // &O -> &Om - case 4833: state = 4927; break; // &o -> &om - case 4900: state = 4904; break; // &oh -> &ohm - case 4995: state = 5001; break; // &ord -> º - case 5032: state = 5041; break; // &Oti -> &Otim - case 5037: state = 5044; break; // &oti -> &otim - case 5049: state = 5050; break; // &Ou -> &Oum - case 5052: state = 5053; break; // &ou -> &oum - case 5083: state = 5188; break; // &p -> &pm - case 5092: state = 5093; break; // &parsi -> &parsim - case 5109: state = 5116; break; // &per -> &perm - case 5130: state = 5133; break; // &ph -> &phm - case 5133: state = 5134; break; // &phm -> &phmm - case 5159: state = 5180; break; // &plus -> &plusm - case 5183: state = 5184; break; // &plussi -> &plussim - case 5277: state = 5278; break; // &precnsi -> &precnsim - case 5280: state = 5281; break; // &precsi -> &precsim - case 5282: state = 5283; break; // &Pri -> &Prim - case 5285: state = 5286; break; // &pri -> &prim - case 5294: state = 5295; break; // &prnsi -> &prnsim - case 5329: state = 5330; break; // &prsi -> &prsim - case 5365: state = 5366; break; // &qpri -> &qprim - case 5397: state = 5862; break; // &r -> &rm - case 5417: state = 5418; break; // &rae -> &raem - case 5455: state = 5456; break; // &rarrsi -> &rarrsim - case 5564: state = 5565; break; // &ReverseEle -> &ReverseElem - case 5577: state = 5578; break; // &ReverseEquilibriu -> &ReverseEquilibrium - case 5590: state = 5591; break; // &ReverseUpEquilibriu -> &ReverseUpEquilibrium - case 5784: state = 5785; break; // &rightthreeti -> &rightthreetim - case 5854: state = 5861; break; // &rl -> &rlm - case 5871: state = 5872; break; // &rn -> &rnm - case 5895: state = 5896; break; // &roti -> &rotim - case 5902: state = 5903; break; // &RoundI -> &RoundIm - case 5956: state = 5957; break; // &rti -> &rtim - case 5985: state = 6192; break; // &S -> &Sm - case 5991: state = 6202; break; // &s -> &sm - case 6035: state = 6036; break; // &scnsi -> &scnsim - case 6044: state = 6045; break; // &scsi -> &scsim - case 6053: state = 6066; break; // &se -> &sem - case 6072: state = 6073; break; // &set -> &setm - case 6128: state = 6129; break; // &short -> &shortm - case 6159: state = 6160; break; // &Sig -> &Sigm - case 6162: state = 6168; break; // &si -> &sim - case 6163: state = 6164; break; // &sig -> &sigm - case 6208: state = 6209; break; // &smallset -> &smallsetm - case 6341: state = 6348; break; // &ss -> &ssm - case 6345: state = 6346; break; // &sset -> &ssetm - case 6381: state = 6495; break; // &Su -> &Sum - case 6383: state = 6496; break; // &su -> &sum - case 6384: state = 6393; break; // &sub -> &subm - case 6426: state = 6427; break; // &subsi -> &subsim - case 6485: state = 6486; break; // &succnsi -> &succnsim - case 6488: state = 6489; break; // &succsi -> &succsim - case 6500: state = 6535; break; // &sup -> &supm - case 6559: state = 6560; break; // &supsi -> &supsim - case 6651: state = 6652; break; // &thetasy -> &thetasym - case 6664: state = 6665; break; // &thicksi -> &thicksim - case 6687: state = 6688; break; // &thksi -> &thksim - case 6700: state = 6723; break; // &ti -> &tim - case 6753: state = 6754; break; // &tpri -> &tprim - case 6764: state = 6792; break; // &tri -> &trim - case 6812: state = 6813; break; // &triti -> &tritim - case 6819: state = 6820; break; // &trpeziu -> &trpezium - case 6873: state = 6978; break; // &U -> &Um - case 6879: state = 6982; break; // &u -> &um - case 7096: state = 7097; break; // &UpEquilibriu -> &UpEquilibrium - case 7208: state = 7215; break; // &uu -> &uum - case 7212: state = 7213; break; // &Uu -> &Uum - case 7266: state = 7267; break; // &varsig -> &varsigm - case 7495: state = 7529; break; // &x -> &xm - case 7548: state = 7549; break; // &xoti -> &xotim - case 7637: state = 7643; break; // &yu -> &yum - case 7640: state = 7641; break; // &Yu -> &Yum + case 0: state = 4767; break; // & -> &m + case 1: state = 98; break; // &A -> &Am + case 8: state = 103; break; // &a -> &am + case 83: state = 84; break; // &alefsy -> &alefsym + case 136: state = 143; break; // &ang -> &angm + case 262: state = 263; break; // &asy -> &asym + case 281: state = 282; break; // &Au -> &Aum + case 285: state = 286; break; // &au -> &aum + case 320: state = 321; break; // &backpri -> &backprim + case 325: state = 326; break; // &backsi -> &backsim + case 384: state = 399; break; // &be -> &bem + case 466: state = 467; break; // &bigoti -> &bigotim + case 605: state = 606; break; // &botto -> &bottom + case 613: state = 656; break; // &box -> &boxm + case 668: state = 669; break; // &boxti -> &boxtim + case 721: state = 722; break; // &bpri -> &bprim + case 748: state = 749; break; // &bse -> &bsem + case 752: state = 753; break; // &bsi -> &bsim + case 767: state = 774; break; // &bu -> &bum + case 781: state = 782; break; // &Bu -> &Bum + case 904: state = 905; break; // &ccupss -> &ccupssm + case 915: state = 927; break; // &ce -> &cem + case 966: state = 968; break; // &check -> &checkm + case 979: state = 1059; break; // &cir -> &cirm + case 1044: state = 1045; break; // &CircleTi -> &CircleTim + case 1131: state = 1142; break; // &co -> &com + case 1142: state = 1143; break; // &com -> &comm + case 1154: state = 1155; break; // &comple -> &complem + case 1349: state = 1351; break; // &curarr -> &curarrm + case 1516: state = 1529; break; // &de -> &dem + case 1558: state = 1603; break; // &Dia -> &Diam + case 1600: state = 1601; break; // &dia -> &diam + case 1634: state = 1635; break; // &diga -> &digam + case 1635: state = 1636; break; // &digam -> &digamm + case 1652: state = 1653; break; // ÷onti -> ÷ontim + case 1694: state = 1713; break; // &dot -> &dotm + case 2108: state = 2228; break; // &E -> &Em + case 2115: state = 2233; break; // &e -> &em + case 2207: state = 2208; break; // &Ele -> &Elem + case 2249: state = 2250; break; // &EmptyS -> &EmptySm + case 2267: state = 2268; break; // &EmptyVeryS -> &EmptyVerySm + case 2351: state = 2352; break; // &eqsi -> &eqsim + case 2393: state = 2394; break; // &Equilibriu -> &Equilibrium + case 2430: state = 2431; break; // &Esi -> &Esim + case 2433: state = 2434; break; // &esi -> &esim + case 2447: state = 2448; break; // &Eu -> &Eum + case 2451: state = 2452; break; // &eu -> &eum + case 2524: state = 2525; break; // &fe -> &fem + case 2559: state = 2560; break; // &FilledS -> &FilledSm + case 2575: state = 2576; break; // &FilledVeryS -> &FilledVerySm + case 2702: state = 2714; break; // &ga -> &gam + case 2709: state = 2710; break; // &Ga -> &Gam + case 2710: state = 2711; break; // &Gam -> &Gamm + case 2714: state = 2715; break; // &gam -> &gamm + case 2811: state = 2812; break; // &gi -> &gim + case 2850: state = 2851; break; // &gnsi -> &gnsim + case 2931: state = 2932; break; // &gsi -> &gsim + case 2999: state = 3000; break; // >rsi -> >rsim + case 3021: state = 3030; break; // &ha -> &ham + case 3126: state = 3131; break; // &ho -> &hom + case 3207: state = 3208; break; // &Hu -> &Hum + case 3215: state = 3216; break; // &HumpDownHu -> &HumpDownHum + case 3236: state = 3330; break; // &I -> &Im + case 3243: state = 3336; break; // &i -> &im + case 3452: state = 3453; break; // &InvisibleCo -> &InvisibleCom + case 3453: state = 3454; break; // &InvisibleCom -> &InvisibleComm + case 3458: state = 3459; break; // &InvisibleTi -> &InvisibleTim + case 3539: state = 3549; break; // &Iu -> &Ium + case 3544: state = 3552; break; // &iu -> &ium + case 3561: state = 3577; break; // &j -> &jm + case 3692: state = 4385; break; // &l -> &lm + case 3698: state = 4379; break; // &L -> &Lm + case 3699: state = 3723; break; // &La -> &Lam + case 3705: state = 3728; break; // &la -> &lam + case 3711: state = 3712; break; // &lae -> &laem + case 3786: state = 3787; break; // &larrsi -> &larrsim + case 4115: state = 4116; break; // &leftthreeti -> &leftthreetim + case 4281: state = 4282; break; // &lesssi -> &lesssim + case 4419: state = 4420; break; // &lnsi -> &lnsim + case 4458: state = 4502; break; // &long -> &longm + case 4574: state = 4575; break; // &loti -> &lotim + case 4628: state = 4646; break; // &lr -> &lrm + case 4669: state = 4670; break; // &lsi -> &lsim + case 4715: state = 4716; break; // <i -> <im + case 4810: state = 4811; break; // &mco -> &mcom + case 4811: state = 4812; break; // &mcom -> &mcomm + case 4846: state = 4847; break; // &Mediu -> &Medium + case 4952: state = 4961; break; // &mu -> &mum + case 4956: state = 4957; break; // &multi -> &multim + case 4965: state = 5343; break; // &n -> &nm + case 5014: state = 5015; break; // &nbu -> &nbum + case 5095: state = 5096; break; // &NegativeMediu -> &NegativeMedium + case 5145: state = 5146; break; // &nesi -> &nesim + case 5216: state = 5217; break; // &ngsi -> &ngsim + case 5329: state = 5330; break; // &nlsi -> &nlsim + case 5416: state = 5417; break; // &NotEle -> &NotElem + case 5494: state = 5495; break; // &NotHu -> &NotHum + case 5502: state = 5503; break; // &NotHumpDownHu -> &NotHumpDownHum + case 5665: state = 5666; break; // &NotReverseEle -> &NotReverseElem + case 5895: state = 5934; break; // &ns -> &nsm + case 5913: state = 5914; break; // &nshort -> &nshortm + case 5927: state = 5928; break; // &nsi -> &nsim + case 6032: state = 6034; break; // &nu -> &num + case 6108: state = 6109; break; // &nvsi -> &nvsim + case 6131: state = 6258; break; // &O -> &Om + case 6138: state = 6263; break; // &o -> &om + case 6227: state = 6232; break; // &oh -> &ohm + case 6348: state = 6358; break; // &ord -> º + case 6400: state = 6411; break; // &Oti -> &Otim + case 6406: state = 6415; break; // &oti -> &otim + case 6422: state = 6423; break; // &Ou -> &Oum + case 6426: state = 6427; break; // &ou -> &oum + case 6463: state = 6607; break; // &p -> &pm + case 6475: state = 6476; break; // &parsi -> &parsim + case 6498: state = 6507; break; // &per -> &perm + case 6527: state = 6532; break; // &ph -> &phm + case 6532: state = 6533; break; // &phm -> &phmm + case 6567: state = 6596; break; // &plus -> &plusm + case 6600: state = 6601; break; // &plussi -> &plussim + case 6718: state = 6719; break; // &precnsi -> &precnsim + case 6722: state = 6723; break; // &precsi -> &precsim + case 6725: state = 6726; break; // &Pri -> &Prim + case 6729: state = 6730; break; // &pri -> &prim + case 6742: state = 6743; break; // &prnsi -> &prnsim + case 6787: state = 6788; break; // &prsi -> &prsim + case 6835: state = 6836; break; // &qpri -> &qprim + case 6876: state = 7453; break; // &r -> &rm + case 6901: state = 6902; break; // &rae -> &raem + case 6957: state = 6958; break; // &rarrsi -> &rarrsim + case 7104: state = 7105; break; // &ReverseEle -> &ReverseElem + case 7118: state = 7119; break; // &ReverseEquilibriu -> &ReverseEquilibrium + case 7132: state = 7133; break; // &ReverseUpEquilibriu -> &ReverseUpEquilibrium + case 7360: state = 7361; break; // &rightthreeti -> &rightthreetim + case 7442: state = 7451; break; // &rl -> &rlm + case 7464: state = 7465; break; // &rn -> &rnm + case 7496: state = 7497; break; // &roti -> &rotim + case 7504: state = 7505; break; // &RoundI -> &RoundIm + case 7573: state = 7574; break; // &rti -> &rtim + case 7610: state = 7883; break; // &S -> &Sm + case 7617: state = 7894; break; // &s -> &sm + case 7677: state = 7678; break; // &scnsi -> &scnsim + case 7688: state = 7689; break; // &scsi -> &scsim + case 7703: state = 7721; break; // &se -> &sem + case 7729: state = 7730; break; // &set -> &setm + case 7798: state = 7799; break; // &short -> &shortm + case 7834: state = 7835; break; // &Sig -> &Sigm + case 7838: state = 7847; break; // &si -> &sim + case 7839: state = 7840; break; // &sig -> &sigm + case 7900: state = 7901; break; // &smallset -> &smallsetm + case 8077: state = 8086; break; // &ss -> &ssm + case 8082: state = 8083; break; // &sset -> &ssetm + case 8127: state = 8275; break; // &Su -> &Sum + case 8130: state = 8277; break; // &su -> &sum + case 8131: state = 8145; break; // &sub -> &subm + case 8190: state = 8191; break; // &subsi -> &subsim + case 8262: state = 8263; break; // &succnsi -> &succnsim + case 8266: state = 8267; break; // &succsi -> &succsim + case 8284: state = 8333; break; // &sup -> &supm + case 8367: state = 8368; break; // &supsi -> &supsim + case 8488: state = 8489; break; // &thetasy -> &thetasym + case 8504: state = 8505; break; // &thicksi -> &thicksim + case 8532: state = 8533; break; // &thksi -> &thksim + case 8549: state = 8576; break; // &ti -> &tim + case 8619: state = 8620; break; // &tpri -> &tprim + case 8633: state = 8670; break; // &tri -> &trim + case 8694: state = 8695; break; // &triti -> &tritim + case 8702: state = 8703; break; // &trpeziu -> &trpezium + case 8768: state = 8904; break; // &U -> &Um + case 8775: state = 8909; break; // &u -> &um + case 9043: state = 9044; break; // &UpEquilibriu -> &UpEquilibrium + case 9182: state = 9191; break; // &uu -> &uum + case 9187: state = 9188; break; // &Uu -> &Uum + case 9254: state = 9255; break; // &varsig -> &varsigm + case 9548: state = 9594; break; // &x -> &xm + case 9619: state = 9620; break; // &xoti -> &xotim + case 9736: state = 9744; break; // &yu -> &yum + case 9740: state = 9741; break; // &Yu -> &Yum default: return false; } break; case 'n': switch (state) { - case 0: state = 3897; break; // & -> &n - case 1: state = 88; break; // &A -> &An - case 7: state = 90; break; // &a -> &an - case 92: state = 93; break; // &anda -> &andan - case 133: state = 134; break; // &Aogo -> &Aogon - case 137: state = 138; break; // &aogo -> &aogon - case 159: state = 160; break; // &ApplyFu -> &ApplyFun - case 164: state = 165; break; // &ApplyFunctio -> &ApplyFunction - case 173: state = 174; break; // &Ari -> &Arin - case 177: state = 178; break; // &ari -> &arin - case 188: state = 189; break; // &Assig -> &Assign - case 214: state = 215; break; // &awco -> &awcon - case 216: state = 217; break; // &awconi -> &awconin - case 219: state = 220; break; // &awi -> &awin - case 222: state = 445; break; // &b -> &bn - case 227: state = 228; break; // &backco -> &backcon - case 235: state = 236; break; // &backepsilo -> &backepsilon - case 278: state = 279; break; // &bco -> &bcon - case 308: state = 309; break; // &ber -> &bern - case 312: state = 313; break; // &Ber -> &Bern - case 327: state = 328; break; // &betwee -> &between - case 367: state = 368; break; // &bigtria -> &bigtrian - case 374: state = 375; break; // &bigtriangledow -> &bigtriangledown - case 397: state = 434; break; // &bla -> &blan - case 403: state = 404; break; // &blackloze -> &blacklozen - case 416: state = 417; break; // &blacktria -> &blacktrian - case 423: state = 424; break; // &blacktriangledow -> &blacktriangledown - case 495: state = 496; break; // &boxmi -> &boxmin - case 597: state = 598; break; // &capa -> &capan - case 623: state = 624; break; // &CapitalDiffere -> &CapitalDifferen - case 634: state = 635; break; // &caro -> &caron - case 648: state = 649; break; // &Ccaro -> &Ccaron - case 651: state = 652; break; // &ccaro -> &ccaron - case 667: state = 668; break; // &Cco -> &Ccon - case 669: state = 670; break; // &Cconi -> &Cconin - case 683: state = 698; break; // &ce -> &cen - case 687: state = 700; break; // &Ce -> &Cen - case 776: state = 777; break; // &CircleMi -> &CircleMin - case 791: state = 792; break; // &cirf -> &cirfn - case 793: state = 794; break; // &cirfni -> &cirfnin - case 812: state = 813; break; // &ClockwiseCo -> &ClockwiseCon - case 818: state = 819; break; // &ClockwiseContourI -> &ClockwiseContourIn - case 856: state = 888; break; // &Co -> &Con - case 858: state = 859; break; // &Colo -> &Colon - case 860: state = 883; break; // &co -> &con - case 862: state = 863; break; // &colo -> &colon - case 872: state = 873; break; // &compf -> &compfn - case 877: state = 878; break; // &compleme -> &complemen - case 892: state = 893; break; // &Congrue -> &Congruen - case 895: state = 896; break; // &Coni -> &Conin - case 898: state = 899; break; // &coni -> &conin - case 905: state = 906; break; // &ContourI -> &ContourIn - case 932: state = 933; break; // &Cou -> &Coun - case 947: state = 948; break; // &CounterClockwiseCo -> &CounterClockwiseCon - case 953: state = 954; break; // &CounterClockwiseContourI -> &CounterClockwiseContourIn - case 1052: state = 1053; break; // &curre -> ¤ - case 1078: state = 1079; break; // &cwco -> &cwcon - case 1080: state = 1081; break; // &cwconi -> &cwconin - case 1083: state = 1084; break; // &cwi -> &cwin - case 1132: state = 1133; break; // &Dcaro -> &Dcaron - case 1137: state = 1138; break; // &dcaro -> &dcaron - case 1232: state = 1233; break; // &Diamo -> &Diamon - case 1235: state = 1236; break; // &diamo -> &diamon - case 1248: state = 1249; break; // &Differe -> &Differen - case 1261: state = 1262; break; // &disi -> &disin - case 1267: state = 1268; break; // ÷o -> ÷on - case 1274: state = 1275; break; // &divo -> &divon - case 1286: state = 1287; break; // &dlcor -> &dlcorn - case 1317: state = 1318; break; // &dotmi -> &dotmin - case 1348: state = 1349; break; // &DoubleCo -> &DoubleCon - case 1354: state = 1355; break; // &DoubleContourI -> &DoubleContourIn - case 1365: state = 1366; break; // &DoubleDow -> &DoubleDown - case 1394: state = 1395; break; // &DoubleLo -> &DoubleLon - case 1448: state = 1449; break; // &DoubleUpDow -> &DoubleUpDown - case 1466: state = 1467; break; // &Dow -> &Down - case 1478: state = 1479; break; // &dow -> &down - case 1502: state = 1503; break; // &downdow -> &downdown - case 1515: state = 1516; break; // &downharpoo -> &downharpoon - case 1599: state = 1600; break; // &drcor -> &drcorn - case 1639: state = 1640; break; // &dwa -> &dwan - case 1662: state = 1797; break; // &e -> &en - case 1675: state = 1676; break; // &Ecaro -> &Ecaron - case 1680: state = 1681; break; // &ecaro -> &ecaron - case 1690: state = 1691; break; // &ecolo -> &ecolon - case 1732: state = 1733; break; // &Eleme -> &Elemen - case 1735: state = 1736; break; // &eli -> &elin - case 1803: state = 1804; break; // &Eogo -> &Eogon - case 1807: state = 1808; break; // &eogo -> &eogon - case 1827: state = 1828; break; // &Epsilo -> &Epsilon - case 1830: state = 1831; break; // &epsilo -> &epsilon - case 1840: state = 1841; break; // &eqcolo -> &eqcolon - case 1846: state = 1847; break; // &eqsla -> &eqslan - case 1943: state = 1944; break; // &expectatio -> &expectation - case 1946: state = 1947; break; // &Expo -> &Expon - case 1948: state = 1949; break; // &Expone -> &Exponen - case 1955: state = 1956; break; // &expo -> &expon - case 1957: state = 1958; break; // &expone -> &exponen - case 1964: state = 2049; break; // &f -> &fn - case 1968: state = 1969; break; // &falli -> &fallin - case 2046: state = 2047; break; // &flt -> &fltn - case 2080: state = 2081; break; // &fparti -> &fpartin - case 2110: state = 2111; break; // &frow -> &frown - case 2118: state = 2208; break; // &g -> &gn - case 2173: state = 2174; break; // &geqsla -> &geqslan - case 2269: state = 2270; break; // &GreaterSla -> &GreaterSlan - case 2341: state = 2349; break; // &gv -> &gvn - case 2344: state = 2345; break; // &gvert -> &gvertn - case 2411: state = 2412; break; // &herco -> &hercon - case 2481: state = 2482; break; // &Horizo -> &Horizon - case 2487: state = 2488; break; // &HorizontalLi -> &HorizontalLin - case 2513: state = 2514; break; // &HumpDow -> &HumpDown - case 2531: state = 2532; break; // &hyphe -> &hyphen - case 2533: state = 2656; break; // &I -> &In - case 2539: state = 2641; break; // &i -> &in - case 2582: state = 2589; break; // &ii -> &iin - case 2583: state = 2587; break; // &iii -> &iiin - case 2584: state = 2585; break; // &iiii -> &iiiin - case 2591: state = 2592; break; // &iinfi -> &iinfin - case 2615: state = 2616; break; // &Imagi -> &Imagin - case 2622: state = 2623; break; // &imagli -> &imaglin - case 2647: state = 2648; break; // &infi -> &infin - case 2682: state = 2683; break; // &Intersectio -> &Intersection - case 2718: state = 2719; break; // &Iogo -> &Iogon - case 2721: state = 2722; break; // &iogo -> &iogon - case 2746: state = 2747; break; // &isi -> &isin - case 2855: state = 2856; break; // &kgree -> &kgreen - case 2881: state = 3452; break; // &l -> &ln - case 2887: state = 2915; break; // &La -> &Lan - case 2892: state = 2917; break; // &la -> &lan - case 2905: state = 2906; break; // &lagra -> &lagran - case 2991: state = 2992; break; // &Lcaro -> &Lcaron - case 2996: state = 2997; break; // &lcaro -> &lcaron - case 3036: state = 3037; break; // &LeftA -> &LeftAn - case 3085: state = 3086; break; // &LeftCeili -> &LeftCeilin - case 3101: state = 3102; break; // &LeftDow -> &LeftDown - case 3131: state = 3132; break; // &leftharpoo -> &leftharpoon - case 3135: state = 3136; break; // &leftharpoondow -> &leftharpoondown - case 3185: state = 3186; break; // &leftrightharpoo -> &leftrightharpoon - case 3230: state = 3231; break; // &LeftTria -> &LeftTrian - case 3247: state = 3248; break; // &LeftUpDow -> &LeftUpDown - case 3288: state = 3289; break; // &leqsla -> &leqslan - case 3363: state = 3364; break; // &LessSla -> &LessSlan - case 3415: state = 3416; break; // &llcor -> &llcorn - case 3466: state = 3496; break; // &lo -> &lon - case 3467: state = 3468; break; // &loa -> &loan - case 3475: state = 3476; break; // &Lo -> &Lon - case 3633: state = 3634; break; // &loze -> &lozen - case 3649: state = 3650; break; // &lrcor -> &lrcorn - case 3735: state = 3743; break; // &lv -> &lvn - case 3738: state = 3739; break; // &lvert -> &lvertn - case 3745: state = 3860; break; // &m -> &mn - case 3764: state = 3765; break; // &mapstodow -> &mapstodown - case 3799: state = 3800; break; // &measureda -> &measuredan - case 3816: state = 3817; break; // &Melli -> &Mellin - case 3827: state = 3841; break; // &mi -> &min - case 3847: state = 3848; break; // &Mi -> &Min - case 3898: state = 3912; break; // &na -> &nan - case 3943: state = 3944; break; // &Ncaro -> &Ncaron - case 3946: state = 3947; break; // &ncaro -> &ncaron - case 3956: state = 3957; break; // &nco -> &ncon - case 4004: state = 4012; break; // &NegativeThi -> &NegativeThin - case 4024: state = 4025; break; // &NegativeVeryThi -> &NegativeVeryThin - case 4069: state = 4070; break; // &NewLi -> &NewLin - case 4088: state = 4089; break; // &ngeqsla -> &ngeqslan - case 4172: state = 4173; break; // &nleqsla -> &nleqslan - case 4190: state = 4196; break; // &No -> &Non - case 4202: state = 4203; break; // &NonBreaki -> &NonBreakin - case 4216: state = 4424; break; // ¬ -> ¬n - case 4218: state = 4219; break; // &NotCo -> &NotCon - case 4223: state = 4224; break; // &NotCongrue -> &NotCongruen - case 4252: state = 4253; break; // &NotEleme -> &NotElemen - case 4303: state = 4304; break; // &NotGreaterSla -> &NotGreaterSlan - case 4322: state = 4323; break; // &NotHumpDow -> &NotHumpDown - case 4333: state = 4334; break; // ¬i -> ¬in - case 4350: state = 4351; break; // &NotLeftTria -> &NotLeftTrian - case 4383: state = 4384; break; // &NotLessSla -> &NotLessSlan - case 4445: state = 4446; break; // &NotPrecedesSla -> &NotPrecedesSlan - case 4464: state = 4465; break; // &NotReverseEleme -> &NotReverseElemen - case 4474: state = 4475; break; // &NotRightTria -> &NotRightTrian - case 4538: state = 4539; break; // &NotSucceedsSla -> &NotSucceedsSlan - case 4610: state = 4611; break; // &npoli -> &npolin - case 4734: state = 4735; break; // &ntria -> &ntrian - case 4787: state = 4788; break; // &nvi -> &nvin - case 4790: state = 4791; break; // &nvinfi -> &nvinfin - case 4812: state = 4823; break; // &nw -> &nwn - case 4888: state = 4889; break; // &ogo -> &ogon - case 4905: state = 4906; break; // &oi -> &oin - case 4919: state = 4920; break; // &oli -> &olin - case 4940: state = 4941; break; // &Omicro -> &Omicron - case 4942: state = 4948; break; // &omi -> &omin - case 4945: state = 4946; break; // &omicro -> &omicron - case 4961: state = 4962; break; // &Ope -> &Open - case 5075: state = 5076; break; // &OverPare -> &OverParen - case 5110: state = 5111; break; // &perc -> &percn - case 5121: state = 5122; break; // &perte -> &perten - case 5137: state = 5138; break; // &pho -> &phon - case 5151: state = 5152; break; // &pla -> &plan - case 5176: state = 5177; break; // &PlusMi -> &PlusMin - case 5180: state = 5181; break; // &plusm -> ± - case 5190: state = 5191; break; // &Poi -> &Poin - case 5198: state = 5199; break; // &Poincarepla -> &Poincareplan - case 5202: state = 5203; break; // &poi -> &poin - case 5205: state = 5206; break; // &pointi -> &pointin - case 5212: state = 5213; break; // &pou -> &poun - case 5216: state = 5289; break; // &pr -> &prn - case 5224: state = 5266; break; // &prec -> &precn - case 5251: state = 5252; break; // &PrecedesSla -> &PrecedesSlan - case 5309: state = 5310; break; // &profli -> &proflin - case 5322: state = 5323; break; // &Proportio -> &Proportion - case 5343: state = 5344; break; // &pu -> &pun - case 5354: state = 5355; break; // &qi -> &qin - case 5378: state = 5379; break; // &quater -> &quatern - case 5381: state = 5382; break; // &quaternio -> &quaternion - case 5384: state = 5385; break; // &quati -> &quatin - case 5397: state = 5871; break; // &r -> &rn - case 5402: state = 5425; break; // &ra -> &ran - case 5406: state = 5423; break; // &Ra -> &Ran - case 5471: state = 5472; break; // &ratio -> &ration - case 5505: state = 5506; break; // &Rcaro -> &Rcaron - case 5510: state = 5511; break; // &rcaro -> &rcaron - case 5544: state = 5545; break; // &reali -> &realin - case 5566: state = 5567; break; // &ReverseEleme -> &ReverseElemen - case 5621: state = 5622; break; // &RightA -> &RightAn - case 5642: state = 5842; break; // &ri -> &rin - case 5671: state = 5672; break; // &RightCeili -> &RightCeilin - case 5687: state = 5688; break; // &RightDow -> &RightDown - case 5717: state = 5718; break; // &rightharpoo -> &rightharpoon - case 5721: state = 5722; break; // &rightharpoondow -> &rightharpoondown - case 5740: state = 5741; break; // &rightleftharpoo -> &rightleftharpoon - case 5790: state = 5791; break; // &RightTria -> &RightTrian - case 5807: state = 5808; break; // &RightUpDow -> &RightUpDown - case 5845: state = 5846; break; // &risi -> &risin - case 5876: state = 5877; break; // &roa -> &roan - case 5899: state = 5900; break; // &Rou -> &Roun - case 5917: state = 5918; break; // &rppoli -> &rppolin - case 6002: state = 6030; break; // &sc -> &scn - case 6007: state = 6008; break; // &Scaro -> &Scaron - case 6010: state = 6011; break; // &scaro -> &scaron - case 6040: state = 6041; break; // &scpoli -> &scpolin - case 6073: state = 6078; break; // &setm -> &setmn - case 6074: state = 6075; break; // &setmi -> &setmin - case 6086: state = 6087; break; // &sfrow -> &sfrown - case 6110: state = 6111; break; // &ShortDow -> &ShortDown - case 6168: state = 6178; break; // &sim -> &simn - case 6210: state = 6211; break; // &smallsetmi -> &smallsetmin - case 6293: state = 6294; break; // &SquareI -> &SquareIn - case 6303: state = 6304; break; // &SquareIntersectio -> &SquareIntersection - case 6327: state = 6328; break; // &SquareU -> &SquareUn - case 6330: state = 6331; break; // &SquareUnio -> &SquareUnion - case 6346: state = 6347; break; // &ssetm -> &ssetmn - case 6363: state = 6379; break; // &str -> &strn - case 6374: state = 6375; break; // &straightepsilo -> &straightepsilon - case 6383: state = 6497; break; // &su -> &sun - case 6384: state = 6397; break; // &sub -> &subn - case 6413: state = 6422; break; // &subset -> &subsetn - case 6432: state = 6474; break; // &succ -> &succn - case 6459: state = 6460; break; // &SucceedsSla -> &SucceedsSlan - case 6500: state = 6539; break; // &sup -> &supn - case 6551: state = 6555; break; // &supset -> &supsetn - case 6564: state = 6575; break; // &sw -> &swn - case 6600: state = 6601; break; // &Tcaro -> &Tcaron - case 6605: state = 6606; break; // &tcaro -> &tcaron - case 6654: state = 6674; break; // &thi -> &thin - case 6666: state = 6677; break; // &Thi -> &Thin - case 6694: state = 6695; break; // &thor -> þ - case 6700: state = 6730; break; // &ti -> &tin - case 6765: state = 6766; break; // &tria -> &trian - case 6772: state = 6773; break; // &triangledow -> &triangledown - case 6793: state = 6794; break; // &trimi -> &trimin - case 6873: state = 6987; break; // &U -> &Un - case 6968: state = 6969; break; // &ulcor -> &ulcorn - case 7004: state = 7005; break; // &UnderPare -> &UnderParen - case 7013: state = 7014; break; // &Unio -> &Union - case 7021: state = 7022; break; // &Uogo -> &Uogon - case 7025: state = 7026; break; // &uogo -> &uogon - case 7053: state = 7054; break; // &UpArrowDow -> &UpArrowDown - case 7062: state = 7063; break; // &UpDow -> &UpDown - case 7071: state = 7072; break; // &Updow -> &Updown - case 7080: state = 7081; break; // &updow -> &updown - case 7103: state = 7104; break; // &upharpoo -> &upharpoon - case 7145: state = 7146; break; // &Upsilo -> &Upsilon - case 7148: state = 7149; break; // &upsilo -> &upsilon - case 7169: state = 7170; break; // &urcor -> &urcorn - case 7177: state = 7178; break; // &Uri -> &Urin - case 7180: state = 7181; break; // &uri -> &urin - case 7218: state = 7219; break; // &uwa -> &uwan - case 7223: state = 7402; break; // &v -> &vn - case 7224: state = 7225; break; // &va -> &van - case 7229: state = 7242; break; // &var -> &varn - case 7235: state = 7236; break; // &varepsilo -> &varepsilon - case 7246: state = 7247; break; // &varnothi -> &varnothin - case 7273: state = 7274; break; // &varsubset -> &varsubsetn - case 7281: state = 7282; break; // &varsupset -> &varsupsetn - case 7293: state = 7294; break; // &vartria -> &vartrian - case 7367: state = 7368; break; // &VerticalLi -> &VerticalLin - case 7387: state = 7388; break; // &VeryThi -> &VeryThin - case 7428: state = 7429; break; // &vsub -> &vsubn - case 7432: state = 7433; break; // &vsup -> &vsupn - case 7495: state = 7532; break; // &x -> &xn - case 7610: state = 7611; break; // &ye -> ¥ - case 7660: state = 7661; break; // &Zcaro -> &Zcaron - case 7665: state = 7666; break; // &zcaro -> &zcaron - case 7725: state = 7727; break; // &zw -> &zwn + case 0: state = 4965; break; // & -> &n + case 1: state = 116; break; // &A -> &An + case 8: state = 119; break; // &a -> &an + case 122: state = 123; break; // &anda -> &andan + case 185: state = 186; break; // &Aogo -> &Aogon + case 190: state = 191; break; // &aogo -> &aogon + case 221: state = 222; break; // &ApplyFu -> &ApplyFun + case 226: state = 227; break; // &ApplyFunctio -> &ApplyFunction + case 238: state = 239; break; // &Ari -> &Arin + case 243: state = 244; break; // &ari -> &arin + case 257: state = 258; break; // &Assig -> &Assign + case 291: state = 292; break; // &awco -> &awcon + case 293: state = 294; break; // &awconi -> &awconin + case 297: state = 298; break; // &awi -> &awin + case 301: state = 579; break; // &b -> &bn + case 306: state = 307; break; // &backco -> &backcon + case 315: state = 316; break; // &backepsilo -> &backepsilon + case 370: state = 371; break; // &bco -> &bcon + case 409: state = 410; break; // &ber -> &bern + case 414: state = 415; break; // &Ber -> &Bern + case 433: state = 434; break; // &betwee -> &between + case 484: state = 485; break; // &bigtria -> &bigtrian + case 491: state = 492; break; // &bigtriangledow -> &bigtriangledown + case 520: state = 563; break; // &bla -> &blan + case 526: state = 527; break; // &blackloze -> &blacklozen + case 541: state = 542; break; // &blacktria -> &blacktrian + case 549: state = 550; break; // &blacktriangledow -> &blacktriangledown + case 657: state = 658; break; // &boxmi -> &boxmin + case 807: state = 808; break; // &capa -> &capan + case 838: state = 839; break; // &CapitalDiffere -> &CapitalDifferen + case 852: state = 853; break; // &caro -> &caron + case 869: state = 870; break; // &Ccaro -> &Ccaron + case 873: state = 874; break; // &ccaro -> &ccaron + case 894: state = 895; break; // &Cco -> &Ccon + case 896: state = 897; break; // &Cconi -> &Cconin + case 915: state = 933; break; // &ce -> &cen + case 920: state = 936; break; // &Ce -> &Cen + case 1033: state = 1034; break; // &CircleMi -> &CircleMin + case 1053: state = 1054; break; // &cirf -> &cirfn + case 1055: state = 1056; break; // &cirfni -> &cirfnin + case 1077: state = 1078; break; // &ClockwiseCo -> &ClockwiseCon + case 1083: state = 1084; break; // &ClockwiseContourI -> &ClockwiseContourIn + case 1126: state = 1171; break; // &Co -> &Con + case 1128: state = 1129; break; // &Colo -> &Colon + case 1131: state = 1164; break; // &co -> &con + case 1133: state = 1134; break; // &colo -> &colon + case 1150: state = 1151; break; // &compf -> &compfn + case 1156: state = 1157; break; // &compleme -> &complemen + case 1175: state = 1176; break; // &Congrue -> &Congruen + case 1179: state = 1180; break; // &Coni -> &Conin + case 1183: state = 1184; break; // &coni -> &conin + case 1191: state = 1192; break; // &ContourI -> &ContourIn + case 1226: state = 1227; break; // &Cou -> &Coun + case 1241: state = 1242; break; // &CounterClockwiseCo -> &CounterClockwiseCon + case 1247: state = 1248; break; // &CounterClockwiseContourI -> &CounterClockwiseContourIn + case 1378: state = 1379; break; // &curre -> ¤ + case 1409: state = 1410; break; // &cwco -> &cwcon + case 1411: state = 1412; break; // &cwconi -> &cwconin + case 1415: state = 1416; break; // &cwi -> &cwin + case 1477: state = 1478; break; // &Dcaro -> &Dcaron + case 1483: state = 1484; break; // &dcaro -> &dcaron + case 1604: state = 1605; break; // &Diamo -> &Diamon + case 1608: state = 1609; break; // &diamo -> &diamon + case 1625: state = 1626; break; // &Differe -> &Differen + case 1640: state = 1641; break; // &disi -> &disin + case 1649: state = 1650; break; // ÷o -> ÷on + case 1657: state = 1658; break; // &divo -> &divon + case 1672: state = 1673; break; // &dlcor -> &dlcorn + case 1714: state = 1715; break; // &dotmi -> &dotmin + case 1749: state = 1750; break; // &DoubleCo -> &DoubleCon + case 1755: state = 1756; break; // &DoubleContourI -> &DoubleContourIn + case 1768: state = 1769; break; // &DoubleDow -> &DoubleDown + case 1801: state = 1802; break; // &DoubleLo -> &DoubleLon + case 1861: state = 1862; break; // &DoubleUpDow -> &DoubleUpDown + case 1881: state = 1882; break; // &Dow -> &Down + case 1895: state = 1896; break; // &dow -> &down + case 1923: state = 1924; break; // &downdow -> &downdown + case 1937: state = 1938; break; // &downharpoo -> &downharpoon + case 2033: state = 2034; break; // &drcor -> &drcorn + case 2087: state = 2088; break; // &dwa -> &dwan + case 2115: state = 2290; break; // &e -> &en + case 2130: state = 2131; break; // &Ecaro -> &Ecaron + case 2136: state = 2137; break; // &ecaro -> &ecaron + case 2150: state = 2151; break; // &ecolo -> &ecolon + case 2209: state = 2210; break; // &Eleme -> &Elemen + case 2213: state = 2214; break; // &eli -> &elin + case 2298: state = 2299; break; // &Eogo -> &Eogon + case 2303: state = 2304; break; // &eogo -> &eogon + case 2330: state = 2331; break; // &Epsilo -> &Epsilon + case 2334: state = 2335; break; // &epsilo -> &epsilon + case 2347: state = 2348; break; // &eqcolo -> &eqcolon + case 2355: state = 2356; break; // &eqsla -> &eqslan + case 2479: state = 2480; break; // &expectatio -> &expectation + case 2483: state = 2484; break; // &Expo -> &Expon + case 2485: state = 2486; break; // &Expone -> &Exponen + case 2493: state = 2494; break; // &expo -> &expon + case 2495: state = 2496; break; // &expone -> &exponen + case 2503: state = 2604; break; // &f -> &fn + case 2507: state = 2508; break; // &falli -> &fallin + case 2600: state = 2601; break; // &flt -> &fltn + case 2643: state = 2644; break; // &fparti -> &fpartin + case 2690: state = 2691; break; // &frow -> &frown + case 2701: state = 2832; break; // &g -> &gn + case 2777: state = 2778; break; // &geqsla -> &geqslan + case 2908: state = 2909; break; // &GreaterSla -> &GreaterSlan + case 3002: state = 3011; break; // &gv -> &gvn + case 3005: state = 3006; break; // &gvert -> &gvertn + case 3091: state = 3092; break; // &herco -> &hercon + case 3174: state = 3175; break; // &Horizo -> &Horizon + case 3180: state = 3181; break; // &HorizontalLi -> &HorizontalLin + case 3212: state = 3213; break; // &HumpDow -> &HumpDown + case 3233: state = 3234; break; // &hyphe -> &hyphen + case 3236: state = 3398; break; // &I -> &In + case 3243: state = 3378; break; // &i -> &in + case 3301: state = 3311; break; // &ii -> &iin + case 3303: state = 3308; break; // &iii -> &iiin + case 3304: state = 3305; break; // &iiii -> &iiiin + case 3313: state = 3314; break; // &iinfi -> &iinfin + case 3345: state = 3346; break; // &Imagi -> &Imagin + case 3353: state = 3354; break; // &imagli -> &imaglin + case 3386: state = 3387; break; // &infi -> &infin + case 3430: state = 3431; break; // &Intersectio -> &Intersection + case 3473: state = 3474; break; // &Iogo -> &Iogon + case 3477: state = 3478; break; // &iogo -> &iogon + case 3511: state = 3512; break; // &isi -> &isin + case 3657: state = 3658; break; // &kgree -> &kgreen + case 3692: state = 4401; break; // &l -> &ln + case 3699: state = 3733; break; // &La -> &Lan + case 3705: state = 3736; break; // &la -> &lan + case 3720: state = 3721; break; // &lagra -> &lagran + case 3840: state = 3841; break; // &Lcaro -> &Lcaron + case 3846: state = 3847; break; // &lcaro -> &lcaron + case 3901: state = 3902; break; // &LeftA -> &LeftAn + case 3957: state = 3958; break; // &LeftCeili -> &LeftCeilin + case 3975: state = 3976; break; // &LeftDow -> &LeftDown + case 4009: state = 4010; break; // &leftharpoo -> &leftharpoon + case 4013: state = 4014; break; // &leftharpoondow -> &leftharpoondown + case 4070: state = 4071; break; // &leftrightharpoo -> &leftrightharpoon + case 4122: state = 4123; break; // &LeftTria -> &LeftTrian + case 4142: state = 4143; break; // &LeftUpDow -> &LeftUpDown + case 4193: state = 4194; break; // &leqsla -> &leqslan + case 4286: state = 4287; break; // &LessSla -> &LessSlan + case 4356: state = 4357; break; // &llcor -> &llcorn + case 4422: state = 4457; break; // &lo -> &lon + case 4423: state = 4424; break; // &loa -> &loan + case 4434: state = 4435; break; // &Lo -> &Lon + case 4614: state = 4615; break; // &loze -> &lozen + case 4635: state = 4636; break; // &lrcor -> &lrcorn + case 4755: state = 4764; break; // &lv -> &lvn + case 4758: state = 4759; break; // &lvert -> &lvertn + case 4767: state = 4916; break; // &m -> &mn + case 4793: state = 4794; break; // &mapstodow -> &mapstodown + case 4837: state = 4838; break; // &measureda -> &measuredan + case 4856: state = 4857; break; // &Melli -> &Mellin + case 4871: state = 4890; break; // &mi -> &min + case 4900: state = 4901; break; // &Mi -> &Min + case 4966: state = 4983; break; // &na -> &nan + case 5027: state = 5028; break; // &Ncaro -> &Ncaron + case 5031: state = 5032; break; // &ncaro -> &ncaron + case 5044: state = 5045; break; // &nco -> &ncon + case 5105: state = 5114; break; // &NegativeThi -> &NegativeThin + case 5127: state = 5128; break; // &NegativeVeryThi -> &NegativeVeryThin + case 5178: state = 5179; break; // &NewLi -> &NewLin + case 5206: state = 5207; break; // &ngeqsla -> &ngeqslan + case 5318: state = 5319; break; // &nleqsla -> &nleqslan + case 5347: state = 5354; break; // &No -> &Non + case 5360: state = 5361; break; // &NonBreaki -> &NonBreakin + case 5378: state = 5620; break; // ¬ -> ¬n + case 5381: state = 5382; break; // &NotCo -> &NotCon + case 5386: state = 5387; break; // &NotCongrue -> &NotCongruen + case 5418: state = 5419; break; // &NotEleme -> &NotElemen + case 5478: state = 5479; break; // &NotGreaterSla -> &NotGreaterSlan + case 5499: state = 5500; break; // &NotHumpDow -> &NotHumpDown + case 5512: state = 5513; break; // ¬i -> ¬in + case 5535: state = 5536; break; // &NotLeftTria -> &NotLeftTrian + case 5575: state = 5576; break; // &NotLessSla -> &NotLessSlan + case 5647: state = 5648; break; // &NotPrecedesSla -> &NotPrecedesSlan + case 5667: state = 5668; break; // &NotReverseEleme -> &NotReverseElemen + case 5678: state = 5679; break; // &NotRightTria -> &NotRightTrian + case 5753: state = 5754; break; // &NotSucceedsSla -> &NotSucceedsSlan + case 5838: state = 5839; break; // &npoli -> &npolin + case 6008: state = 6009; break; // &ntria -> &ntrian + case 6078: state = 6079; break; // &nvi -> &nvin + case 6081: state = 6082; break; // &nvinfi -> &nvinfin + case 6111: state = 6126; break; // &nw -> &nwn + case 6211: state = 6212; break; // &ogo -> &ogon + case 6234: state = 6235; break; // &oi -> &oin + case 6252: state = 6253; break; // &oli -> &olin + case 6279: state = 6280; break; // &Omicro -> &Omicron + case 6282: state = 6290; break; // &omi -> &omin + case 6285: state = 6286; break; // &omicro -> &omicron + case 6307: state = 6308; break; // &Ope -> &Open + case 6454: state = 6455; break; // &OverPare -> &OverParen + case 6499: state = 6500; break; // &perc -> &percn + case 6514: state = 6515; break; // &perte -> &perten + case 6537: state = 6538; break; // &pho -> &phon + case 6556: state = 6557; break; // &pla -> &plan + case 6591: state = 6592; break; // &PlusMi -> &PlusMin + case 6596: state = 6597; break; // &plusm -> ± + case 6610: state = 6611; break; // &Poi -> &Poin + case 6618: state = 6619; break; // &Poincarepla -> &Poincareplan + case 6623: state = 6624; break; // &poi -> &poin + case 6626: state = 6627; break; // &pointi -> &pointin + case 6636: state = 6637; break; // &pou -> &poun + case 6642: state = 6735; break; // &pr -> &prn + case 6655: state = 6705; break; // &prec -> &precn + case 6687: state = 6688; break; // &PrecedesSla -> &PrecedesSlan + case 6761: state = 6762; break; // &profli -> &proflin + case 6777: state = 6778; break; // &Proportio -> &Proportion + case 6807: state = 6808; break; // &pu -> &pun + case 6821: state = 6822; break; // &qi -> &qin + case 6851: state = 6852; break; // &quater -> &quatern + case 6854: state = 6855; break; // &quaternio -> &quaternion + case 6858: state = 6859; break; // &quati -> &quatin + case 6876: state = 7464; break; // &r -> &rn + case 6882: state = 6911; break; // &ra -> &ran + case 6887: state = 6908; break; // &Ra -> &Ran + case 6979: state = 6981; break; // &ratio -> &ration + case 7024: state = 7025; break; // &Rcaro -> &Rcaron + case 7030: state = 7031; break; // &rcaro -> &rcaron + case 7078: state = 7079; break; // &reali -> &realin + case 7106: state = 7107; break; // &ReverseEleme -> &ReverseElemen + case 7175: state = 7176; break; // &RightA -> &RightAn + case 7199: state = 7428; break; // &ri -> &rin + case 7232: state = 7233; break; // &RightCeili -> &RightCeilin + case 7250: state = 7251; break; // &RightDow -> &RightDown + case 7284: state = 7285; break; // &rightharpoo -> &rightharpoon + case 7288: state = 7289; break; // &rightharpoondow -> &rightharpoondown + case 7310: state = 7311; break; // &rightleftharpoo -> &rightleftharpoon + case 7367: state = 7368; break; // &RightTria -> &RightTrian + case 7387: state = 7388; break; // &RightUpDow -> &RightUpDown + case 7432: state = 7433; break; // &risi -> &risin + case 7470: state = 7471; break; // &roa -> &roan + case 7501: state = 7502; break; // &Rou -> &Roun + case 7522: state = 7523; break; // &rppoli -> &rppolin + case 7631: state = 7670; break; // &sc -> &scn + case 7638: state = 7639; break; // &Scaro -> &Scaron + case 7642: state = 7643; break; // &scaro -> &scaron + case 7683: state = 7684; break; // &scpoli -> &scpolin + case 7730: state = 7736; break; // &setm -> &setmn + case 7731: state = 7732; break; // &setmi -> &setmin + case 7748: state = 7749; break; // &sfrow -> &sfrown + case 7778: state = 7779; break; // &ShortDow -> &ShortDown + case 7847: state = 7865; break; // &sim -> &simn + case 7902: state = 7903; break; // &smallsetmi -> &smallsetmin + case 8019: state = 8020; break; // &SquareI -> &SquareIn + case 8029: state = 8030; break; // &SquareIntersectio -> &SquareIntersection + case 8058: state = 8059; break; // &SquareU -> &SquareUn + case 8061: state = 8062; break; // &SquareUnio -> &SquareUnion + case 8083: state = 8084; break; // &ssetm -> &ssetmn + case 8106: state = 8124; break; // &str -> &strn + case 8117: state = 8118; break; // &straightepsilo -> &straightepsilon + case 8130: state = 8279; break; // &su -> &sun + case 8131: state = 8150; break; // &sub -> &subn + case 8171: state = 8184; break; // &subset -> &subsetn + case 8199: state = 8249; break; // &succ -> &succn + case 8231: state = 8232; break; // &SucceedsSla -> &SucceedsSlan + case 8284: state = 8338; break; // &sup -> &supn + case 8354: state = 8361; break; // &supset -> &supsetn + case 8375: state = 8390; break; // &sw -> &swn + case 8422: state = 8423; break; // &Tcaro -> &Tcaron + case 8428: state = 8429; break; // &tcaro -> &tcaron + case 8493: state = 8516; break; // &thi -> &thin + case 8507: state = 8520; break; // &Thi -> &Thin + case 8541: state = 8542; break; // &thor -> þ + case 8549: state = 8587; break; // &ti -> &tin + case 8634: state = 8635; break; // &tria -> &trian + case 8642: state = 8643; break; // &triangledow -> &triangledown + case 8671: state = 8672; break; // &trimi -> &trimin + case 8768: state = 8916; break; // &U -> &Un + case 8890: state = 8891; break; // &ulcor -> &ulcorn + case 8936: state = 8937; break; // &UnderPare -> &UnderParen + case 8946: state = 8947; break; // &Unio -> &Union + case 8956: state = 8957; break; // &Uogo -> &Uogon + case 8961: state = 8962; break; // &uogo -> &uogon + case 8996: state = 8997; break; // &UpArrowDow -> &UpArrowDown + case 9006: state = 9007; break; // &UpDow -> &UpDown + case 9016: state = 9017; break; // &Updow -> &Updown + case 9026: state = 9027; break; // &updow -> &updown + case 9051: state = 9052; break; // &upharpoo -> &upharpoon + case 9101: state = 9102; break; // &Upsilo -> &Upsilon + case 9105: state = 9106; break; // &upsilo -> &upsilon + case 9130: state = 9131; break; // &urcor -> &urcorn + case 9141: state = 9142; break; // &Uri -> &Urin + case 9145: state = 9146; break; // &uri -> &urin + case 9195: state = 9196; break; // &uwa -> &uwan + case 9201: state = 9425; break; // &v -> &vn + case 9202: state = 9203; break; // &va -> &van + case 9208: state = 9223; break; // &var -> &varn + case 9214: state = 9215; break; // &varepsilo -> &varepsilon + case 9227: state = 9228; break; // &varnothi -> &varnothin + case 9262: state = 9263; break; // &varsubset -> &varsubsetn + case 9272: state = 9273; break; // &varsupset -> &varsupsetn + case 9287: state = 9288; break; // &vartria -> &vartrian + case 9383: state = 9384; break; // &VerticalLi -> &VerticalLin + case 9406: state = 9407; break; // &VeryThi -> &VeryThin + case 9459: state = 9460; break; // &vsub -> &vsubn + case 9465: state = 9466; break; // &vsup -> &vsupn + case 9548: state = 9598; break; // &x -> &xn + case 9699: state = 9700; break; // &ye -> ¥ + case 9764: state = 9765; break; // &Zcaro -> &Zcaron + case 9770: state = 9771; break; // &zcaro -> &zcaron + case 9848: state = 9851; break; // &zw -> &zwn default: return false; } break; case 'o': switch (state) { - case 0: state = 4833; break; // & -> &o - case 1: state = 131; break; // &A -> &Ao - case 7: state = 135; break; // &a -> &ao - case 97: state = 98; break; // &andsl -> &andslo - case 132: state = 133; break; // &Aog -> &Aogo - case 136: state = 137; break; // &aog -> &aogo - case 143: state = 152; break; // &ap -> &apo - case 163: state = 164; break; // &ApplyFuncti -> &ApplyFunctio - case 167: state = 168; break; // &appr -> &appro - case 213: state = 214; break; // &awc -> &awco - case 222: state = 459; break; // &b -> &bo - case 226: state = 227; break; // &backc -> &backco - case 234: state = 235; break; // &backepsil -> &backepsilo - case 247: state = 456; break; // &B -> &Bo - case 277: state = 278; break; // &bc -> &bco - case 286: state = 287; break; // &bdqu -> &bdquo - case 309: state = 310; break; // &bern -> &berno - case 313: state = 314; break; // &Bern -> &Berno - case 334: state = 343; break; // &big -> &bigo - case 344: state = 345; break; // &bigod -> &bigodo - case 372: state = 373; break; // &bigtriangled -> &bigtriangledo - case 393: state = 394; break; // &bkar -> &bkaro - case 396: state = 442; break; // &bl -> &blo - case 400: state = 401; break; // &blackl -> &blacklo - case 421: state = 422; break; // &blacktriangled -> &blacktriangledo - case 445: state = 454; break; // &bn -> &bno - case 451: state = 452; break; // &bN -> &bNo - case 463: state = 464; break; // &bott -> &botto - case 471: state = 472; break; // &boxb -> &boxbo - case 552: state = 561; break; // &bs -> &bso - case 583: state = 856; break; // &C -> &Co - case 589: state = 860; break; // &c -> &co - case 610: state = 611; break; // &capd -> &capdo - case 631: state = 634; break; // &car -> &caro - case 645: state = 667; break; // &Cc -> &Cco - case 647: state = 648; break; // &Ccar -> &Ccaro - case 650: state = 651; break; // &ccar -> &ccaro - case 677: state = 678; break; // &Cd -> &Cdo - case 680: state = 681; break; // &cd -> &cdo - case 704: state = 705; break; // &CenterD -> &CenterDo - case 709: state = 710; break; // ¢erd -> ¢erdo - case 741: state = 742; break; // &circlearr -> &circlearro - case 770: state = 771; break; // &CircleD -> &CircleDo - case 803: state = 804; break; // &Cl -> &Clo - case 811: state = 812; break; // &ClockwiseC -> &ClockwiseCo - case 814: state = 815; break; // &ClockwiseCont -> &ClockwiseConto - case 833: state = 834; break; // &CloseCurlyD -> &CloseCurlyDo - case 840: state = 841; break; // &CloseCurlyDoubleQu -> &CloseCurlyDoubleQuo - case 845: state = 846; break; // &CloseCurlyQu -> &CloseCurlyQuo - case 857: state = 858; break; // &Col -> &Colo - case 861: state = 862; break; // &col -> &colo - case 885: state = 886; break; // &congd -> &congdo - case 901: state = 902; break; // &Cont -> &Conto - case 917: state = 918; break; // &copr -> &copro - case 920: state = 921; break; // &Copr -> &Copro - case 938: state = 939; break; // &CounterCl -> &CounterClo - case 946: state = 947; break; // &CounterClockwiseC -> &CounterClockwiseCo - case 949: state = 950; break; // &CounterClockwiseCont -> &CounterClockwiseConto - case 961: state = 969; break; // &cr -> &cro - case 965: state = 966; break; // &Cr -> &Cro - case 984: state = 985; break; // &ctd -> &ctdo - case 1006: state = 1023; break; // &cup -> &cupo - case 1020: state = 1021; break; // &cupd -> &cupdo - case 1058: state = 1059; break; // &curvearr -> &curvearro - case 1077: state = 1078; break; // &cwc -> &cwco - case 1091: state = 1296; break; // &D -> &Do - case 1097: state = 1291; break; // &d -> &do - case 1123: state = 1124; break; // &dbkar -> &dbkaro - case 1131: state = 1132; break; // &Dcar -> &Dcaro - case 1136: state = 1137; break; // &dcar -> &dcaro - case 1141: state = 1150; break; // &DD -> &DDo - case 1142: state = 1156; break; // &dd -> &ddo - case 1206: state = 1207; break; // &DiacriticalD -> &DiacriticalDo - case 1230: state = 1235; break; // &diam -> &diamo - case 1231: state = 1232; break; // &Diam -> &Diamo - case 1263: state = 1274; break; // &div -> &divo - case 1266: state = 1267; break; // ÷ -> ÷o - case 1284: state = 1285; break; // &dlc -> &dlco - case 1288: state = 1289; break; // &dlcr -> &dlcro - case 1303: state = 1304; break; // &DotD -> &DotDo - case 1308: state = 1309; break; // &doteqd -> &doteqdo - case 1347: state = 1348; break; // &DoubleC -> &DoubleCo - case 1350: state = 1351; break; // &DoubleCont -> &DoubleConto - case 1362: state = 1363; break; // &DoubleD -> &DoubleDo - case 1369: state = 1370; break; // &DoubleDownArr -> &DoubleDownArro - case 1372: state = 1394; break; // &DoubleL -> &DoubleLo - case 1378: state = 1379; break; // &DoubleLeftArr -> &DoubleLeftArro - case 1388: state = 1389; break; // &DoubleLeftRightArr -> &DoubleLeftRightArro - case 1403: state = 1404; break; // &DoubleLongLeftArr -> &DoubleLongLeftArro - case 1413: state = 1414; break; // &DoubleLongLeftRightArr -> &DoubleLongLeftRightArro - case 1423: state = 1424; break; // &DoubleLongRightArr -> &DoubleLongRightArro - case 1433: state = 1434; break; // &DoubleRightArr -> &DoubleRightArro - case 1443: state = 1444; break; // &DoubleUpArr -> &DoubleUpArro - case 1446: state = 1447; break; // &DoubleUpD -> &DoubleUpDo - case 1452: state = 1453; break; // &DoubleUpDownArr -> &DoubleUpDownArro - case 1470: state = 1471; break; // &DownArr -> &DownArro - case 1475: state = 1476; break; // &Downarr -> &Downarro - case 1482: state = 1483; break; // &downarr -> &downarro - case 1492: state = 1493; break; // &DownArrowUpArr -> &DownArrowUpArro - case 1500: state = 1501; break; // &downd -> &downdo - case 1506: state = 1507; break; // &downdownarr -> &downdownarro - case 1513: state = 1514; break; // &downharp -> &downharpo - case 1514: state = 1515; break; // &downharpo -> &downharpoo - case 1538: state = 1539; break; // &DownLeftRightVect -> &DownLeftRightVecto - case 1547: state = 1548; break; // &DownLeftTeeVect -> &DownLeftTeeVecto - case 1553: state = 1554; break; // &DownLeftVect -> &DownLeftVecto - case 1570: state = 1571; break; // &DownRightTeeVect -> &DownRightTeeVecto - case 1576: state = 1577; break; // &DownRightVect -> &DownRightVecto - case 1587: state = 1588; break; // &DownTeeArr -> &DownTeeArro - case 1594: state = 1595; break; // &drbkar -> &drbkaro - case 1597: state = 1598; break; // &drc -> &drco - case 1601: state = 1602; break; // &drcr -> &drcro - case 1607: state = 1614; break; // &ds -> &dso - case 1617: state = 1618; break; // &Dstr -> &Dstro - case 1621: state = 1622; break; // &dstr -> &dstro - case 1625: state = 1626; break; // &dtd -> &dtdo - case 1656: state = 1801; break; // &E -> &Eo - case 1662: state = 1805; break; // &e -> &eo - case 1674: state = 1675; break; // &Ecar -> &Ecaro - case 1677: state = 1688; break; // &ec -> &eco - case 1679: state = 1680; break; // &ecar -> &ecaro - case 1689: state = 1690; break; // &ecol -> &ecolo - case 1694: state = 1701; break; // &eD -> &eDo - case 1695: state = 1696; break; // &eDD -> &eDDo - case 1698: state = 1699; break; // &Ed -> &Edo - case 1703: state = 1704; break; // &ed -> &edo - case 1708: state = 1709; break; // &efD -> &efDo - case 1725: state = 1726; break; // &egsd -> &egsdo - case 1743: state = 1744; break; // &elsd -> &elsdo - case 1802: state = 1803; break; // &Eog -> &Eogo - case 1806: state = 1807; break; // &eog -> &eogo - case 1826: state = 1827; break; // &Epsil -> &Epsilo - case 1829: state = 1830; break; // &epsil -> &epsilo - case 1834: state = 1838; break; // &eqc -> &eqco - case 1839: state = 1840; break; // &eqcol -> &eqcolo - case 1894: state = 1895; break; // &erD -> &erDo - case 1903: state = 1904; break; // &esd -> &esdo - case 1923: state = 1924; break; // &eur -> &euro - case 1936: state = 1955; break; // &exp -> &expo - case 1942: state = 1943; break; // &expectati -> &expectatio - case 1945: state = 1946; break; // &Exp -> &Expo - case 1964: state = 2055; break; // &f -> &fo - case 1971: state = 1972; break; // &fallingd -> &fallingdo - case 1977: state = 2052; break; // &F -> &Fo - case 2049: state = 2050; break; // &fn -> &fno - case 2083: state = 2109; break; // &fr -> &fro - case 2118: state = 2225; break; // &g -> &go - case 2124: state = 2222; break; // &G -> &Go - case 2159: state = 2160; break; // &Gd -> &Gdo - case 2162: state = 2163; break; // &gd -> &gdo - case 2179: state = 2180; break; // &gesd -> &gesdo - case 2181: state = 2182; break; // &gesdot -> &gesdoto - case 2212: state = 2213; break; // &gnappr -> &gnappro - case 2299: state = 2300; break; // >d -> >do - case 2315: state = 2316; break; // >rappr -> >rappro - case 2320: state = 2321; break; // >rd -> >rdo - case 2351: state = 2469; break; // &H -> &Ho - case 2356: state = 2440; break; // &h -> &ho - case 2410: state = 2411; break; // &herc -> &herco - case 2432: state = 2433; break; // &hksear -> &hksearo - case 2437: state = 2438; break; // &hkswar -> &hkswaro - case 2440: state = 2448; break; // &ho -> &hoo - case 2456: state = 2457; break; // &hookleftarr -> &hookleftarro - case 2466: state = 2467; break; // &hookrightarr -> &hookrightarro - case 2480: state = 2481; break; // &Horiz -> &Horizo - case 2501: state = 2502; break; // &Hstr -> &Hstro - case 2505: state = 2506; break; // &hstr -> &hstro - case 2511: state = 2512; break; // &HumpD -> &HumpDo - case 2533: state = 2716; break; // &I -> &Io - case 2539: state = 2713; break; // &i -> &io - case 2555: state = 2556; break; // &Id -> &Ido - case 2582: state = 2593; break; // &ii -> &iio - case 2608: state = 2631; break; // &im -> &imo - case 2641: state = 2652; break; // &in -> &ino - case 2653: state = 2654; break; // &inod -> &inodo - case 2681: state = 2682; break; // &Intersecti -> &Intersectio - case 2690: state = 2691; break; // &intpr -> &intpro - case 2700: state = 2701; break; // &InvisibleC -> &InvisibleCo - case 2717: state = 2718; break; // &Iog -> &Iogo - case 2720: state = 2721; break; // &iog -> &iogo - case 2732: state = 2733; break; // &ipr -> &ipro - case 2748: state = 2749; break; // &isind -> &isindo - case 2777: state = 2797; break; // &J -> &Jo - case 2782: state = 2800; break; // &j -> &jo - case 2825: state = 2869; break; // &K -> &Ko - case 2830: state = 2872; break; // &k -> &ko - case 2881: state = 3466; break; // &l -> &lo - case 2886: state = 3475; break; // &L -> &Lo - case 2932: state = 2933; break; // &laqu -> « - case 2990: state = 2991; break; // &Lcar -> &Lcaro - case 2995: state = 2996; break; // &lcar -> &lcaro - case 3016: state = 3017; break; // &ldqu -> &ldquo - case 3049: state = 3050; break; // &LeftArr -> &LeftArro - case 3054: state = 3055; break; // &Leftarr -> &Leftarro - case 3061: state = 3062; break; // &leftarr -> &leftarro - case 3074: state = 3075; break; // &LeftArrowRightArr -> &LeftArrowRightArro - case 3088: state = 3089; break; // &LeftD -> &LeftDo - case 3109: state = 3110; break; // &LeftDownTeeVect -> &LeftDownTeeVecto - case 3115: state = 3116; break; // &LeftDownVect -> &LeftDownVecto - case 3122: state = 3123; break; // &LeftFl -> &LeftFlo - case 3123: state = 3124; break; // &LeftFlo -> &LeftFloo - case 3129: state = 3130; break; // &leftharp -> &leftharpo - case 3130: state = 3131; break; // &leftharpo -> &leftharpoo - case 3133: state = 3134; break; // &leftharpoond -> &leftharpoondo - case 3145: state = 3146; break; // &leftleftarr -> &leftleftarro - case 3156: state = 3157; break; // &LeftRightArr -> &LeftRightArro - case 3166: state = 3167; break; // &Leftrightarr -> &Leftrightarro - case 3176: state = 3177; break; // &leftrightarr -> &leftrightarro - case 3183: state = 3184; break; // &leftrightharp -> &leftrightharpo - case 3184: state = 3185; break; // &leftrightharpo -> &leftrightharpoo - case 3195: state = 3196; break; // &leftrightsquigarr -> &leftrightsquigarro - case 3201: state = 3202; break; // &LeftRightVect -> &LeftRightVecto - case 3209: state = 3210; break; // &LeftTeeArr -> &LeftTeeArro - case 3215: state = 3216; break; // &LeftTeeVect -> &LeftTeeVecto - case 3245: state = 3246; break; // &LeftUpD -> &LeftUpDo - case 3252: state = 3253; break; // &LeftUpDownVect -> &LeftUpDownVecto - case 3261: state = 3262; break; // &LeftUpTeeVect -> &LeftUpTeeVecto - case 3267: state = 3268; break; // &LeftUpVect -> &LeftUpVecto - case 3276: state = 3277; break; // &LeftVect -> &LeftVecto - case 3294: state = 3295; break; // &lesd -> &lesdo - case 3296: state = 3297; break; // &lesdot -> &lesdoto - case 3306: state = 3307; break; // &lessappr -> &lessappro - case 3309: state = 3310; break; // &lessd -> &lessdo - case 3381: state = 3382; break; // &lfl -> &lflo - case 3382: state = 3383; break; // &lflo -> &lfloo - case 3413: state = 3414; break; // &llc -> &llco - case 3424: state = 3425; break; // &Lleftarr -> &Lleftarro - case 3436: state = 3437; break; // &Lmid -> &Lmido - case 3439: state = 3444; break; // &lm -> &lmo - case 3441: state = 3442; break; // &lmid -> &lmido - case 3456: state = 3457; break; // &lnappr -> &lnappro - case 3466: state = 3573; break; // &lo -> &loo - case 3484: state = 3485; break; // &LongLeftArr -> &LongLeftArro - case 3493: state = 3494; break; // &Longleftarr -> &Longleftarro - case 3504: state = 3505; break; // &longleftarr -> &longleftarro - case 3514: state = 3515; break; // &LongLeftRightArr -> &LongLeftRightArro - case 3524: state = 3525; break; // &Longleftrightarr -> &Longleftrightarro - case 3534: state = 3535; break; // &longleftrightarr -> &longleftrightarro - case 3541: state = 3542; break; // &longmapst -> &longmapsto - case 3550: state = 3551; break; // &LongRightArr -> &LongRightArro - case 3560: state = 3561; break; // &Longrightarr -> &Longrightarro - case 3570: state = 3571; break; // &longrightarr -> &longrightarro - case 3577: state = 3578; break; // &looparr -> &looparro - case 3619: state = 3620; break; // &LowerLeftArr -> &LowerLeftArro - case 3629: state = 3630; break; // &LowerRightArr -> &LowerRightArro - case 3647: state = 3648; break; // &lrc -> &lrco - case 3664: state = 3665; break; // &lsaqu -> &lsaquo - case 3679: state = 3680; break; // &lsqu -> &lsquo - case 3683: state = 3684; break; // &Lstr -> &Lstro - case 3687: state = 3688; break; // &lstr -> &lstro - case 3697: state = 3698; break; // <d -> <do - case 3745: state = 3865; break; // &m -> &mo - case 3755: state = 3870; break; // &M -> &Mo - case 3760: state = 3761; break; // &mapst -> &mapsto - case 3762: state = 3763; break; // &mapstod -> &mapstodo - case 3776: state = 3777; break; // &mc -> &mco - case 3789: state = 3790; break; // &mDD -> &mDDo - case 3825: state = 3826; break; // &mh -> &mho - case 3829: state = 3830; break; // &micr -> µ - case 3838: state = 3839; break; // &midd -> &middo - case 3883: state = 3884; break; // &mstp -> &mstpo - case 3897: state = 4212; break; // &n -> &no - case 3902: state = 4190; break; // &N -> &No - case 3914: state = 3918; break; // &nap -> &napo - case 3921: state = 3922; break; // &nappr -> &nappro - case 3937: state = 3956; break; // &nc -> &nco - case 3942: state = 3943; break; // &Ncar -> &Ncaro - case 3945: state = 3946; break; // &ncar -> &ncaro - case 3959: state = 3960; break; // &ncongd -> &ncongdo - case 3978: state = 3979; break; // &nearr -> &nearro - case 3981: state = 3982; break; // &ned -> &nedo - case 4138: state = 4139; break; // &nLeftarr -> &nLeftarro - case 4145: state = 4146; break; // &nleftarr -> &nleftarro - case 4155: state = 4156; break; // &nLeftrightarr -> &nLeftrightarro - case 4165: state = 4166; break; // &nleftrightarr -> &nleftrightarro - case 4217: state = 4218; break; // &NotC -> &NotCo - case 4231: state = 4232; break; // &NotD -> &NotDo - case 4320: state = 4321; break; // &NotHumpD -> &NotHumpDo - case 4335: state = 4336; break; // ¬ind -> ¬indo - case 4597: state = 4608; break; // &np -> &npo - case 4637: state = 4638; break; // &nRightarr -> &nRightarro - case 4646: state = 4647; break; // &nrightarr -> &nrightarro - case 4663: state = 4664; break; // &nsh -> &nsho - case 4756: state = 4757; break; // &numer -> &numero - case 4820: state = 4821; break; // &nwarr -> &nwarro - case 4827: state = 4951; break; // &O -> &Oo - case 4833: state = 4954; break; // &o -> &oo - case 4851: state = 4866; break; // &od -> &odo - case 4868: state = 4869; break; // &ods -> &odso - case 4887: state = 4888; break; // &og -> &ogo - case 4915: state = 4916; break; // &olcr -> &olcro - case 4939: state = 4940; break; // &Omicr -> &Omicro - case 4944: state = 4945; break; // &omicr -> &omicro - case 4968: state = 4969; break; // &OpenCurlyD -> &OpenCurlyDo - case 4975: state = 4976; break; // &OpenCurlyDoubleQu -> &OpenCurlyDoubleQuo - case 4980: state = 4981; break; // &OpenCurlyQu -> &OpenCurlyQuo - case 4991: state = 5006; break; // &or -> &oro - case 4997: state = 4998; break; // &order -> &ordero - case 5003: state = 5004; break; // &orig -> &origo - case 5009: state = 5010; break; // &orsl -> &orslo - case 5018: state = 5029; break; // &os -> &oso - case 5083: state = 5201; break; // &p -> &po - case 5096: state = 5189; break; // &P -> &Po - case 5113: state = 5114; break; // &peri -> &perio - case 5130: state = 5137; break; // &ph -> &pho - case 5145: state = 5146; break; // &pitchf -> &pitchfo - case 5168: state = 5169; break; // &plusd -> &plusdo - case 5186: state = 5187; break; // &plustw -> &plustwo - case 5215: state = 5298; break; // &Pr -> &Pro - case 5216: state = 5296; break; // &pr -> &pro - case 5228: state = 5229; break; // &precappr -> &precappro - case 5270: state = 5271; break; // &precnappr -> &precnappro - case 5317: state = 5318; break; // &Prop -> &Propo - case 5321: state = 5322; break; // &Proporti -> &Proportio - case 5326: state = 5327; break; // &propt -> &propto - case 5348: state = 5357; break; // &Q -> &Qo - case 5351: state = 5360; break; // &q -> &qo - case 5374: state = 5395; break; // &qu -> &quo - case 5380: state = 5381; break; // &quaterni -> &quaternio - case 5397: state = 5875; break; // &r -> &ro - case 5405: state = 5887; break; // &R -> &Ro - case 5432: state = 5433; break; // &raqu -> » - case 5470: state = 5471; break; // &rati -> &ratio - case 5504: state = 5505; break; // &Rcar -> &Rcaro - case 5509: state = 5510; break; // &rcar -> &rcaro - case 5535: state = 5536; break; // &rdqu -> &rdquo - case 5597: state = 5598; break; // &rfl -> &rflo - case 5598: state = 5599; break; // &rflo -> &rfloo - case 5607: state = 5615; break; // &rh -> &rho - case 5613: state = 5614; break; // &Rh -> &Rho - case 5634: state = 5635; break; // &RightArr -> &RightArro - case 5639: state = 5640; break; // &Rightarr -> &Rightarro - case 5648: state = 5649; break; // &rightarr -> &rightarro - case 5660: state = 5661; break; // &RightArrowLeftArr -> &RightArrowLeftArro - case 5674: state = 5675; break; // &RightD -> &RightDo - case 5695: state = 5696; break; // &RightDownTeeVect -> &RightDownTeeVecto - case 5701: state = 5702; break; // &RightDownVect -> &RightDownVecto - case 5708: state = 5709; break; // &RightFl -> &RightFlo - case 5709: state = 5710; break; // &RightFlo -> &RightFloo - case 5715: state = 5716; break; // &rightharp -> &rightharpo - case 5716: state = 5717; break; // &rightharpo -> &rightharpoo - case 5719: state = 5720; break; // &rightharpoond -> &rightharpoondo - case 5731: state = 5732; break; // &rightleftarr -> &rightleftarro - case 5738: state = 5739; break; // &rightleftharp -> &rightleftharpo - case 5739: state = 5740; break; // &rightleftharpo -> &rightleftharpoo - case 5750: state = 5751; break; // &rightrightarr -> &rightrightarro - case 5761: state = 5762; break; // &rightsquigarr -> &rightsquigarro - case 5769: state = 5770; break; // &RightTeeArr -> &RightTeeArro - case 5775: state = 5776; break; // &RightTeeVect -> &RightTeeVecto - case 5805: state = 5806; break; // &RightUpD -> &RightUpDo - case 5812: state = 5813; break; // &RightUpDownVect -> &RightUpDownVecto - case 5821: state = 5822; break; // &RightUpTeeVect -> &RightUpTeeVecto - case 5827: state = 5828; break; // &RightUpVect -> &RightUpVecto - case 5836: state = 5837; break; // &RightVect -> &RightVecto - case 5848: state = 5849; break; // &risingd -> &risingdo - case 5862: state = 5863; break; // &rm -> &rmo - case 5914: state = 5915; break; // &rpp -> &rppo - case 5931: state = 5932; break; // &Rrightarr -> &Rrightarro - case 5937: state = 5938; break; // &rsaqu -> &rsaquo - case 5948: state = 5949; break; // &rsqu -> &rsquo - case 5985: state = 6244; break; // &S -> &So - case 5991: state = 6235; break; // &s -> &so - case 5999: state = 6000; break; // &sbqu -> &sbquo - case 6006: state = 6007; break; // &Scar -> &Scaro - case 6009: state = 6010; break; // &scar -> &scaro - case 6037: state = 6038; break; // &scp -> &scpo - case 6048: state = 6049; break; // &sd -> &sdo - case 6061: state = 6062; break; // &searr -> &searro - case 6084: state = 6085; break; // &sfr -> &sfro - case 6088: state = 6126; break; // &sh -> &sho - case 6104: state = 6105; break; // &Sh -> &Sho - case 6108: state = 6109; break; // &ShortD -> &ShortDo - case 6114: state = 6115; break; // &ShortDownArr -> &ShortDownArro - case 6123: state = 6124; break; // &ShortLeftArr -> &ShortLeftArro - case 6147: state = 6148; break; // &ShortRightArr -> &ShortRightArro - case 6154: state = 6155; break; // &ShortUpArr -> &ShortUpArro - case 6169: state = 6170; break; // &simd -> &simdo - case 6302: state = 6303; break; // &SquareIntersecti -> &SquareIntersectio - case 6329: state = 6330; break; // &SquareUni -> &SquareUnio - case 6373: state = 6374; break; // &straightepsil -> &straightepsilo - case 6385: state = 6386; break; // &subd -> &subdo - case 6390: state = 6391; break; // &subed -> &subedo - case 6436: state = 6437; break; // &succappr -> &succappro - case 6478: state = 6479; break; // &succnappr -> &succnappro - case 6504: state = 6505; break; // &supd -> &supdo - case 6512: state = 6513; break; // &suped -> &supedo - case 6526: state = 6527; break; // &suphs -> &suphso - case 6572: state = 6573; break; // &swarr -> &swarro - case 6583: state = 6742; break; // &T -> &To - case 6586: state = 6732; break; // &t -> &to - case 6599: state = 6600; break; // &Tcar -> &Tcaro - case 6604: state = 6605; break; // &tcar -> &tcaro - case 6617: state = 6618; break; // &td -> &tdo - case 6629: state = 6693; break; // &th -> &tho - case 6638: state = 6639; break; // &Theref -> &Therefo - case 6642: state = 6643; break; // &theref -> &therefo - case 6660: state = 6661; break; // &thickappr -> &thickappro - case 6736: state = 6737; break; // &topb -> &topbo - case 6745: state = 6746; break; // &topf -> &topfo - case 6770: state = 6771; break; // &triangled -> &triangledo - case 6788: state = 6789; break; // &trid -> &trido - case 6802: state = 6803; break; // &TripleD -> &TripleDo - case 6838: state = 6839; break; // &Tstr -> &Tstro - case 6842: state = 6843; break; // &tstr -> &tstro - case 6845: state = 6849; break; // &tw -> &two - case 6860: state = 6861; break; // &twoheadleftarr -> &twoheadleftarro - case 6870: state = 6871; break; // &twoheadrightarr -> &twoheadrightarro - case 6873: state = 7019; break; // &U -> &Uo - case 6879: state = 7023; break; // &u -> &uo - case 6886: state = 6892; break; // &Uarr -> &Uarro - case 6966: state = 6967; break; // &ulc -> &ulco - case 6972: state = 6973; break; // &ulcr -> &ulcro - case 7012: state = 7013; break; // &Uni -> &Unio - case 7020: state = 7021; break; // &Uog -> &Uogo - case 7024: state = 7025; break; // &uog -> &uogo - case 7034: state = 7035; break; // &UpArr -> &UpArro - case 7039: state = 7040; break; // &Uparr -> &Uparro - case 7045: state = 7046; break; // &uparr -> &uparro - case 7051: state = 7052; break; // &UpArrowD -> &UpArrowDo - case 7057: state = 7058; break; // &UpArrowDownArr -> &UpArrowDownArro - case 7060: state = 7061; break; // &UpD -> &UpDo - case 7066: state = 7067; break; // &UpDownArr -> &UpDownArro - case 7069: state = 7070; break; // &Upd -> &Updo - case 7075: state = 7076; break; // &Updownarr -> &Updownarro - case 7078: state = 7079; break; // &upd -> &updo - case 7084: state = 7085; break; // &updownarr -> &updownarro - case 7101: state = 7102; break; // &upharp -> &upharpo - case 7102: state = 7103; break; // &upharpo -> &upharpoo - case 7126: state = 7127; break; // &UpperLeftArr -> &UpperLeftArro - case 7136: state = 7137; break; // &UpperRightArr -> &UpperRightArro - case 7144: state = 7145; break; // &Upsil -> &Upsilo - case 7147: state = 7148; break; // &upsil -> &upsilo - case 7155: state = 7156; break; // &UpTeeArr -> &UpTeeArro - case 7162: state = 7163; break; // &upuparr -> &upuparro - case 7167: state = 7168; break; // &urc -> &urco - case 7173: state = 7174; break; // &urcr -> &urcro - case 7193: state = 7194; break; // &utd -> &utdo - case 7223: state = 7410; break; // &v -> &vo - case 7234: state = 7235; break; // &varepsil -> &varepsilo - case 7242: state = 7243; break; // &varn -> &varno - case 7253: state = 7254; break; // &varpr -> &varpro - case 7256: state = 7257; break; // &varpropt -> &varpropto - case 7262: state = 7263; break; // &varrh -> &varrho - case 7307: state = 7407; break; // &V -> &Vo - case 7376: state = 7377; break; // &VerticalSeparat -> &VerticalSeparato - case 7414: state = 7415; break; // &vpr -> &vpro - case 7447: state = 7477; break; // &W -> &Wo - case 7452: state = 7480; break; // &w -> &wo - case 7495: state = 7535; break; // &x -> &xo - case 7508: state = 7539; break; // &X -> &Xo - case 7536: state = 7537; break; // &xod -> &xodo - case 7584: state = 7622; break; // &Y -> &Yo - case 7590: state = 7625; break; // &y -> &yo - case 7645: state = 7713; break; // &Z -> &Zo - case 7651: state = 7716; break; // &z -> &zo - case 7659: state = 7660; break; // &Zcar -> &Zcaro - case 7664: state = 7665; break; // &zcar -> &zcaro - case 7669: state = 7670; break; // &Zd -> &Zdo - case 7672: state = 7673; break; // &zd -> &zdo - case 7681: state = 7682; break; // &Zer -> &Zero + case 0: state = 6138; break; // & -> &o + case 1: state = 183; break; // &A -> &Ao + case 8: state = 188; break; // &a -> &ao + case 129: state = 130; break; // &andsl -> &andslo + case 184: state = 185; break; // &Aog -> &Aogo + case 189: state = 190; break; // &aog -> &aogo + case 199: state = 213; break; // &ap -> &apo + case 225: state = 226; break; // &ApplyFuncti -> &ApplyFunctio + case 230: state = 231; break; // &appr -> &appro + case 290: state = 291; break; // &awc -> &awco + case 301: state = 598; break; // &b -> &bo + case 305: state = 306; break; // &backc -> &backco + case 314: state = 315; break; // &backepsil -> &backepsilo + case 331: state = 594; break; // &B -> &Bo + case 369: state = 370; break; // &bc -> &bco + case 381: state = 382; break; // &bdqu -> &bdquo + case 410: state = 411; break; // &bern -> &berno + case 415: state = 416; break; // &Bern -> &Berno + case 443: state = 455; break; // &big -> &bigo + case 456: state = 457; break; // &bigod -> &bigodo + case 489: state = 490; break; // &bigtriangled -> &bigtriangledo + case 515: state = 516; break; // &bkar -> &bkaro + case 519: state = 575; break; // &bl -> &blo + case 523: state = 524; break; // &blackl -> &blacklo + case 547: state = 548; break; // &blacktriangled -> &blacktriangledo + case 579: state = 591; break; // &bn -> &bno + case 587: state = 588; break; // &bN -> &bNo + case 604: state = 605; break; // &bott -> &botto + case 614: state = 615; break; // &boxb -> &boxbo + case 744: state = 757; break; // &bs -> &bso + case 789: state = 1126; break; // &C -> &Co + case 796: state = 1131; break; // &c -> &co + case 824: state = 825; break; // &capd -> &capdo + case 848: state = 852; break; // &car -> &caro + case 866: state = 894; break; // &Cc -> &Cco + case 868: state = 869; break; // &Ccar -> &Ccaro + case 872: state = 873; break; // &ccar -> &ccaro + case 907: state = 908; break; // &Cd -> &Cdo + case 911: state = 912; break; // &cd -> &cdo + case 940: state = 941; break; // &CenterD -> &CenterDo + case 946: state = 947; break; // ¢erd -> ¢erdo + case 990: state = 991; break; // &circlearr -> &circlearro + case 1024: state = 1025; break; // &CircleD -> &CircleDo + case 1068: state = 1069; break; // &Cl -> &Clo + case 1076: state = 1077; break; // &ClockwiseC -> &ClockwiseCo + case 1079: state = 1080; break; // &ClockwiseCont -> &ClockwiseConto + case 1099: state = 1100; break; // &CloseCurlyD -> &CloseCurlyDo + case 1106: state = 1107; break; // &CloseCurlyDoubleQu -> &CloseCurlyDoubleQuo + case 1112: state = 1113; break; // &CloseCurlyQu -> &CloseCurlyQuo + case 1127: state = 1128; break; // &Col -> &Colo + case 1132: state = 1133; break; // &col -> &colo + case 1167: state = 1168; break; // &congd -> &congdo + case 1187: state = 1188; break; // &Cont -> &Conto + case 1206: state = 1207; break; // &copr -> &copro + case 1210: state = 1211; break; // &Copr -> &Copro + case 1232: state = 1233; break; // &CounterCl -> &CounterClo + case 1240: state = 1241; break; // &CounterClockwiseC -> &CounterClockwiseCo + case 1243: state = 1244; break; // &CounterClockwiseCont -> &CounterClockwiseConto + case 1256: state = 1266; break; // &cr -> &cro + case 1261: state = 1262; break; // &Cr -> &Cro + case 1288: state = 1289; break; // &ctd -> &ctdo + case 1318: state = 1341; break; // &cup -> &cupo + case 1337: state = 1338; break; // &cupd -> &cupdo + case 1385: state = 1386; break; // &curvearr -> &curvearro + case 1408: state = 1409; break; // &cwc -> &cwco + case 1425: state = 1685; break; // &D -> &Do + case 1432: state = 1679; break; // &d -> &do + case 1466: state = 1467; break; // &dbkar -> &dbkaro + case 1476: state = 1477; break; // &Dcar -> &Dcaro + case 1482: state = 1483; break; // &dcar -> &dcaro + case 1490: state = 1503; break; // &DD -> &DDo + case 1492: state = 1510; break; // &dd -> &ddo + case 1573: state = 1574; break; // &DiacriticalD -> &DiacriticalDo + case 1601: state = 1608; break; // &diam -> &diamo + case 1603: state = 1604; break; // &Diam -> &Diamo + case 1643: state = 1657; break; // &div -> &divo + case 1647: state = 1649; break; // ÷ -> ÷o + case 1670: state = 1671; break; // &dlc -> &dlco + case 1675: state = 1676; break; // &dlcr -> &dlcro + case 1696: state = 1697; break; // &DotD -> &DotDo + case 1703: state = 1704; break; // &doteqd -> &doteqdo + case 1748: state = 1749; break; // &DoubleC -> &DoubleCo + case 1751: state = 1752; break; // &DoubleCont -> &DoubleConto + case 1764: state = 1765; break; // &DoubleD -> &DoubleDo + case 1772: state = 1773; break; // &DoubleDownArr -> &DoubleDownArro + case 1776: state = 1801; break; // &DoubleL -> &DoubleLo + case 1782: state = 1783; break; // &DoubleLeftArr -> &DoubleLeftArro + case 1793: state = 1794; break; // &DoubleLeftRightArr -> &DoubleLeftRightArro + case 1810: state = 1811; break; // &DoubleLongLeftArr -> &DoubleLongLeftArro + case 1821: state = 1822; break; // &DoubleLongLeftRightArr -> &DoubleLongLeftRightArro + case 1832: state = 1833; break; // &DoubleLongRightArr -> &DoubleLongRightArro + case 1843: state = 1844; break; // &DoubleRightArr -> &DoubleRightArro + case 1855: state = 1856; break; // &DoubleUpArr -> &DoubleUpArro + case 1859: state = 1860; break; // &DoubleUpD -> &DoubleUpDo + case 1865: state = 1866; break; // &DoubleUpDownArr -> &DoubleUpDownArro + case 1885: state = 1886; break; // &DownArr -> &DownArro + case 1891: state = 1892; break; // &Downarr -> &Downarro + case 1899: state = 1900; break; // &downarr -> &downarro + case 1911: state = 1912; break; // &DownArrowUpArr -> &DownArrowUpArro + case 1921: state = 1922; break; // &downd -> &downdo + case 1927: state = 1928; break; // &downdownarr -> &downdownarro + case 1935: state = 1936; break; // &downharp -> &downharpo + case 1936: state = 1937; break; // &downharpo -> &downharpoo + case 1962: state = 1963; break; // &DownLeftRightVect -> &DownLeftRightVecto + case 1972: state = 1973; break; // &DownLeftTeeVect -> &DownLeftTeeVecto + case 1979: state = 1980; break; // &DownLeftVect -> &DownLeftVecto + case 1998: state = 1999; break; // &DownRightTeeVect -> &DownRightTeeVecto + case 2005: state = 2006; break; // &DownRightVect -> &DownRightVecto + case 2019: state = 2020; break; // &DownTeeArr -> &DownTeeArro + case 2027: state = 2028; break; // &drbkar -> &drbkaro + case 2031: state = 2032; break; // &drc -> &drco + case 2036: state = 2037; break; // &drcr -> &drcro + case 2044: state = 2054; break; // &ds -> &dso + case 2058: state = 2059; break; // &Dstr -> &Dstro + case 2063: state = 2064; break; // &dstr -> &dstro + case 2068: state = 2069; break; // &dtd -> &dtdo + case 2108: state = 2296; break; // &E -> &Eo + case 2115: state = 2301; break; // &e -> &eo + case 2129: state = 2130; break; // &Ecar -> &Ecaro + case 2133: state = 2148; break; // &ec -> &eco + case 2135: state = 2136; break; // &ecar -> &ecaro + case 2149: state = 2150; break; // &ecol -> &ecolo + case 2157: state = 2166; break; // &eD -> &eDo + case 2158: state = 2159; break; // &eDD -> &eDDo + case 2162: state = 2163; break; // &Ed -> &Edo + case 2169: state = 2170; break; // &ed -> &edo + case 2176: state = 2177; break; // &efD -> &efDo + case 2200: state = 2201; break; // &egsd -> &egsdo + case 2224: state = 2225; break; // &elsd -> &elsdo + case 2297: state = 2298; break; // &Eog -> &Eogo + case 2302: state = 2303; break; // &eog -> &eogo + case 2329: state = 2330; break; // &Epsil -> &Epsilo + case 2333: state = 2334; break; // &epsil -> &epsilo + case 2340: state = 2345; break; // &eqc -> &eqco + case 2346: state = 2347; break; // &eqcol -> &eqcolo + case 2414: state = 2415; break; // &erD -> &erDo + case 2426: state = 2427; break; // &esd -> &esdo + case 2455: state = 2456; break; // &eur -> &euro + case 2472: state = 2493; break; // &exp -> &expo + case 2478: state = 2479; break; // &expectati -> &expectatio + case 2482: state = 2483; break; // &Exp -> &Expo + case 2503: state = 2612; break; // &f -> &fo + case 2510: state = 2511; break; // &fallingd -> &fallingdo + case 2517: state = 2608; break; // &F -> &Fo + case 2604: state = 2605; break; // &fn -> &fno + case 2647: state = 2689; break; // &fr -> &fro + case 2701: state = 2857; break; // &g -> &go + case 2708: state = 2853; break; // &G -> &Go + case 2755: state = 2756; break; // &Gd -> &Gdo + case 2759: state = 2760; break; // &gd -> &gdo + case 2786: state = 2787; break; // &gesd -> &gesdo + case 2788: state = 2790; break; // &gesdot -> &gesdoto + case 2837: state = 2838; break; // &gnappr -> &gnappro + case 2950: state = 2951; break; // >d -> >do + case 2969: state = 2970; break; // >rappr -> >rappro + case 2976: state = 2977; break; // >rd -> >rdo + case 3014: state = 3159; break; // &H -> &Ho + case 3020: state = 3126; break; // &h -> &ho + case 3090: state = 3091; break; // &herc -> &herco + case 3116: state = 3117; break; // &hksear -> &hksearo + case 3122: state = 3123; break; // &hkswar -> &hkswaro + case 3126: state = 3136; break; // &ho -> &hoo + case 3144: state = 3145; break; // &hookleftarr -> &hookleftarro + case 3155: state = 3156; break; // &hookrightarr -> &hookrightarro + case 3173: state = 3174; break; // &Horiz -> &Horizo + case 3198: state = 3199; break; // &Hstr -> &Hstro + case 3203: state = 3204; break; // &hstr -> &hstro + case 3210: state = 3211; break; // &HumpD -> &HumpDo + case 3236: state = 3471; break; // &I -> &Io + case 3243: state = 3467; break; // &i -> &io + case 3265: state = 3266; break; // &Id -> &Ido + case 3301: state = 3316; break; // &ii -> &iio + case 3336: state = 3365; break; // &im -> &imo + case 3378: state = 3393; break; // &in -> &ino + case 3394: state = 3395; break; // &inod -> &inodo + case 3429: state = 3430; break; // &Intersecti -> &Intersectio + case 3440: state = 3441; break; // &intpr -> &intpro + case 3451: state = 3452; break; // &InvisibleC -> &InvisibleCo + case 3472: state = 3473; break; // &Iog -> &Iogo + case 3476: state = 3477; break; // &iog -> &iogo + case 3493: state = 3494; break; // &ipr -> &ipro + case 3514: state = 3515; break; // &isind -> &isindo + case 3555: state = 3582; break; // &J -> &Jo + case 3561: state = 3586; break; // &j -> &jo + case 3618: state = 3676; break; // &K -> &Ko + case 3624: state = 3680; break; // &k -> &ko + case 3692: state = 4422; break; // &l -> &lo + case 3698: state = 4434; break; // &L -> &Lo + case 3756: state = 3757; break; // &laqu -> « + case 3839: state = 3840; break; // &Lcar -> &Lcaro + case 3845: state = 3846; break; // &lcar -> &lcaro + case 3874: state = 3875; break; // &ldqu -> &ldquo + case 3915: state = 3916; break; // &LeftArr -> &LeftArro + case 3921: state = 3922; break; // &Leftarr -> &Leftarro + case 3929: state = 3930; break; // &leftarr -> &leftarro + case 3944: state = 3945; break; // &LeftArrowRightArr -> &LeftArrowRightArro + case 3961: state = 3962; break; // &LeftD -> &LeftDo + case 3983: state = 3984; break; // &LeftDownTeeVect -> &LeftDownTeeVecto + case 3990: state = 3991; break; // &LeftDownVect -> &LeftDownVecto + case 3999: state = 4000; break; // &LeftFl -> &LeftFlo + case 4000: state = 4001; break; // &LeftFlo -> &LeftFloo + case 4007: state = 4008; break; // &leftharp -> &leftharpo + case 4008: state = 4009; break; // &leftharpo -> &leftharpoo + case 4011: state = 4012; break; // &leftharpoond -> &leftharpoondo + case 4025: state = 4026; break; // &leftleftarr -> &leftleftarro + case 4037: state = 4038; break; // &LeftRightArr -> &LeftRightArro + case 4048: state = 4049; break; // &Leftrightarr -> &Leftrightarro + case 4059: state = 4060; break; // &leftrightarr -> &leftrightarro + case 4068: state = 4069; break; // &leftrightharp -> &leftrightharpo + case 4069: state = 4070; break; // &leftrightharpo -> &leftrightharpoo + case 4081: state = 4082; break; // &leftrightsquigarr -> &leftrightsquigarro + case 4088: state = 4089; break; // &LeftRightVect -> &LeftRightVecto + case 4098: state = 4099; break; // &LeftTeeArr -> &LeftTeeArro + case 4105: state = 4106; break; // &LeftTeeVect -> &LeftTeeVecto + case 4140: state = 4141; break; // &LeftUpD -> &LeftUpDo + case 4147: state = 4148; break; // &LeftUpDownVect -> &LeftUpDownVecto + case 4157: state = 4158; break; // &LeftUpTeeVect -> &LeftUpTeeVecto + case 4164: state = 4165; break; // &LeftUpVect -> &LeftUpVecto + case 4175: state = 4176; break; // &LeftVect -> &LeftVecto + case 4202: state = 4203; break; // &lesd -> &lesdo + case 4204: state = 4206; break; // &lesdot -> &lesdoto + case 4219: state = 4220; break; // &lessappr -> &lessappro + case 4223: state = 4224; break; // &lessd -> &lessdo + case 4307: state = 4308; break; // &lfl -> &lflo + case 4308: state = 4309; break; // &lflo -> &lfloo + case 4354: state = 4355; break; // &llc -> &llco + case 4366: state = 4367; break; // &Lleftarr -> &Lleftarro + case 4381: state = 4382; break; // &Lmid -> &Lmido + case 4385: state = 4391; break; // &lm -> &lmo + case 4387: state = 4388; break; // &lmid -> &lmido + case 4406: state = 4407; break; // &lnappr -> &lnappro + case 4422: state = 4542; break; // &lo -> &loo + case 4443: state = 4444; break; // &LongLeftArr -> &LongLeftArro + case 4453: state = 4454; break; // &Longleftarr -> &Longleftarro + case 4465: state = 4466; break; // &longleftarr -> &longleftarro + case 4476: state = 4477; break; // &LongLeftRightArr -> &LongLeftRightArro + case 4487: state = 4488; break; // &Longleftrightarr -> &Longleftrightarro + case 4498: state = 4499; break; // &longleftrightarr -> &longleftrightarro + case 4506: state = 4507; break; // &longmapst -> &longmapsto + case 4516: state = 4517; break; // &LongRightArr -> &LongRightArro + case 4527: state = 4528; break; // &Longrightarr -> &Longrightarro + case 4538: state = 4539; break; // &longrightarr -> &longrightarro + case 4546: state = 4547; break; // &looparr -> &looparro + case 4597: state = 4598; break; // &LowerLeftArr -> &LowerLeftArro + case 4608: state = 4609; break; // &LowerRightArr -> &LowerRightArro + case 4633: state = 4634; break; // &lrc -> &lrco + case 4655: state = 4656; break; // &lsaqu -> &lsaquo + case 4679: state = 4680; break; // &lsqu -> &lsquo + case 4685: state = 4686; break; // &Lstr -> &Lstro + case 4690: state = 4691; break; // &lstr -> &lstro + case 4706: state = 4707; break; // <d -> <do + case 4767: state = 4922; break; // &m -> &mo + case 4781: state = 4928; break; // &M -> &Mo + case 4788: state = 4789; break; // &mapst -> &mapsto + case 4791: state = 4792; break; // &mapstod -> &mapstodo + case 4809: state = 4810; break; // &mc -> &mco + case 4826: state = 4827; break; // &mDD -> &mDDo + case 4868: state = 4869; break; // &mh -> &mho + case 4873: state = 4874; break; // &micr -> µ + case 4886: state = 4887; break; // &midd -> &middo + case 4946: state = 4947; break; // &mstp -> &mstpo + case 4965: state = 5372; break; // &n -> &no + case 4971: state = 5347; break; // &N -> &No + case 4986: state = 4993; break; // &nap -> &napo + case 4997: state = 4998; break; // &nappr -> &nappro + case 5020: state = 5044; break; // &nc -> &nco + case 5026: state = 5027; break; // &Ncar -> &Ncaro + case 5030: state = 5031; break; // &ncar -> &ncaro + case 5048: state = 5049; break; // &ncongd -> &ncongdo + case 5075: state = 5077; break; // &nearr -> &nearro + case 5080: state = 5081; break; // &ned -> &nedo + case 5278: state = 5279; break; // &nLeftarr -> &nLeftarro + case 5286: state = 5287; break; // &nleftarr -> &nleftarro + case 5297: state = 5298; break; // &nLeftrightarr -> &nLeftrightarro + case 5308: state = 5309; break; // &nleftrightarr -> &nleftrightarro + case 5380: state = 5381; break; // &NotC -> &NotCo + case 5396: state = 5397; break; // &NotD -> &NotDo + case 5497: state = 5498; break; // &NotHumpD -> &NotHumpDo + case 5515: state = 5516; break; // ¬ind -> ¬indo + case 5821: state = 5836; break; // &np -> &npo + case 5875: state = 5876; break; // &nRightarr -> &nRightarro + case 5885: state = 5886; break; // &nrightarr -> &nrightarro + case 5910: state = 5911; break; // &nsh -> &nsho + case 6037: state = 6038; break; // &numer -> &numero + case 6121: state = 6123; break; // &nwarr -> &nwarro + case 6131: state = 6294; break; // &O -> &Oo + case 6138: state = 6298; break; // &o -> &oo + case 6163: state = 6182; break; // &od -> &odo + case 6185: state = 6186; break; // &ods -> &odso + case 6210: state = 6211; break; // &og -> &ogo + case 6247: state = 6248; break; // &olcr -> &olcro + case 6278: state = 6279; break; // &Omicr -> &Omicro + case 6284: state = 6285; break; // &omicr -> &omicro + case 6314: state = 6315; break; // &OpenCurlyD -> &OpenCurlyDo + case 6321: state = 6322; break; // &OpenCurlyDoubleQu -> &OpenCurlyDoubleQuo + case 6327: state = 6328; break; // &OpenCurlyQu -> &OpenCurlyQuo + case 6342: state = 6365; break; // &or -> &oro + case 6351: state = 6353; break; // &order -> &ordero + case 6361: state = 6362; break; // &orig -> &origo + case 6369: state = 6370; break; // &orsl -> &orslo + case 6382: state = 6396; break; // &os -> &oso + case 6463: state = 6622; break; // &p -> &po + case 6482: state = 6609; break; // &P -> &Po + case 6503: state = 6504; break; // &peri -> &perio + case 6527: state = 6537; break; // &ph -> &pho + case 6548: state = 6549; break; // &pitchf -> &pitchfo + case 6580: state = 6581; break; // &plusd -> &plusdo + case 6604: state = 6605; break; // &plustw -> &plustwo + case 6640: state = 6748; break; // &Pr -> &Pro + case 6642: state = 6745; break; // &pr -> &pro + case 6660: state = 6661; break; // &precappr -> &precappro + case 6709: state = 6710; break; // &precnappr -> &precnappro + case 6772: state = 6773; break; // &Prop -> &Propo + case 6776: state = 6777; break; // &Proporti -> &Proportio + case 6783: state = 6784; break; // &propt -> &propto + case 6813: state = 6825; break; // &Q -> &Qo + case 6817: state = 6829; break; // &q -> &qo + case 6847: state = 6873; break; // &qu -> &quo + case 6853: state = 6854; break; // &quaterni -> &quaternio + case 6876: state = 7469; break; // &r -> &ro + case 6886: state = 7485; break; // &R -> &Ro + case 6922: state = 6923; break; // &raqu -> » + case 6978: state = 6979; break; // &rati -> &ratio + case 7023: state = 7024; break; // &Rcar -> &Rcaro + case 7029: state = 7030; break; // &rcar -> &rcaro + case 7064: state = 7065; break; // &rdqu -> &rdquo + case 7141: state = 7142; break; // &rfl -> &rflo + case 7142: state = 7143; break; // &rflo -> &rfloo + case 7155: state = 7167; break; // &rh -> &rho + case 7164: state = 7165; break; // &Rh -> &Rho + case 7189: state = 7190; break; // &RightArr -> &RightArro + case 7195: state = 7196; break; // &Rightarr -> &Rightarro + case 7205: state = 7206; break; // &rightarr -> &rightarro + case 7219: state = 7220; break; // &RightArrowLeftArr -> &RightArrowLeftArro + case 7236: state = 7237; break; // &RightD -> &RightDo + case 7258: state = 7259; break; // &RightDownTeeVect -> &RightDownTeeVecto + case 7265: state = 7266; break; // &RightDownVect -> &RightDownVecto + case 7274: state = 7275; break; // &RightFl -> &RightFlo + case 7275: state = 7276; break; // &RightFlo -> &RightFloo + case 7282: state = 7283; break; // &rightharp -> &rightharpo + case 7283: state = 7284; break; // &rightharpo -> &rightharpoo + case 7286: state = 7287; break; // &rightharpoond -> &rightharpoondo + case 7300: state = 7301; break; // &rightleftarr -> &rightleftarro + case 7308: state = 7309; break; // &rightleftharp -> &rightleftharpo + case 7309: state = 7310; break; // &rightleftharpo -> &rightleftharpoo + case 7321: state = 7322; break; // &rightrightarr -> &rightrightarro + case 7333: state = 7334; break; // &rightsquigarr -> &rightsquigarro + case 7343: state = 7344; break; // &RightTeeArr -> &RightTeeArro + case 7350: state = 7351; break; // &RightTeeVect -> &RightTeeVecto + case 7385: state = 7386; break; // &RightUpD -> &RightUpDo + case 7392: state = 7393; break; // &RightUpDownVect -> &RightUpDownVecto + case 7402: state = 7403; break; // &RightUpTeeVect -> &RightUpTeeVecto + case 7409: state = 7410; break; // &RightUpVect -> &RightUpVecto + case 7420: state = 7421; break; // &RightVect -> &RightVecto + case 7435: state = 7436; break; // &risingd -> &risingdo + case 7453: state = 7454; break; // &rm -> &rmo + case 7519: state = 7520; break; // &rpp -> &rppo + case 7538: state = 7539; break; // &Rrightarr -> &Rrightarro + case 7545: state = 7546; break; // &rsaqu -> &rsaquo + case 7562: state = 7563; break; // &rsqu -> &rsquo + case 7610: state = 7949; break; // &S -> &So + case 7617: state = 7936; break; // &s -> &so + case 7626: state = 7627; break; // &sbqu -> &sbquo + case 7637: state = 7638; break; // &Scar -> &Scaro + case 7641: state = 7642; break; // &scar -> &scaro + case 7680: state = 7681; break; // &scp -> &scpo + case 7695: state = 7696; break; // &sd -> &sdo + case 7713: state = 7715; break; // &searr -> &searro + case 7745: state = 7747; break; // &sfr -> &sfro + case 7751: state = 7796; break; // &sh -> &sho + case 7772: state = 7773; break; // &Sh -> &Sho + case 7776: state = 7777; break; // &ShortD -> &ShortDo + case 7782: state = 7783; break; // &ShortDownArr -> &ShortDownArro + case 7792: state = 7793; break; // &ShortLeftArr -> &ShortLeftArro + case 7819: state = 7820; break; // &ShortRightArr -> &ShortRightArro + case 7827: state = 7828; break; // &ShortUpArr -> &ShortUpArro + case 7849: state = 7850; break; // &simd -> &simdo + case 8028: state = 8029; break; // &SquareIntersecti -> &SquareIntersectio + case 8060: state = 8061; break; // &SquareUni -> &SquareUnio + case 8116: state = 8117; break; // &straightepsil -> &straightepsilo + case 8133: state = 8134; break; // &subd -> &subdo + case 8141: state = 8142; break; // &subed -> &subedo + case 8204: state = 8205; break; // &succappr -> &succappro + case 8253: state = 8254; break; // &succnappr -> &succnappro + case 8292: state = 8293; break; // &supd -> &supdo + case 8304: state = 8305; break; // &suped -> &supedo + case 8321: state = 8322; break; // &suphs -> &suphso + case 8385: state = 8387; break; // &swarr -> &swarro + case 8400: state = 8604; break; // &T -> &To + case 8404: state = 8590; break; // &t -> &to + case 8421: state = 8422; break; // &Tcar -> &Tcaro + case 8427: state = 8428; break; // &tcar -> &tcaro + case 8445: state = 8446; break; // &td -> &tdo + case 8461: state = 8540; break; // &th -> &tho + case 8471: state = 8472; break; // &Theref -> &Therefo + case 8476: state = 8477; break; // &theref -> &therefo + case 8499: state = 8500; break; // &thickappr -> &thickappro + case 8596: state = 8597; break; // &topb -> &topbo + case 8608: state = 8610; break; // &topf -> &topfo + case 8640: state = 8641; break; // &triangled -> &triangledo + case 8664: state = 8665; break; // &trid -> &trido + case 8681: state = 8682; break; // &TripleD -> &TripleDo + case 8728: state = 8729; break; // &Tstr -> &Tstro + case 8733: state = 8734; break; // &tstr -> &tstro + case 8737: state = 8742; break; // &tw -> &two + case 8753: state = 8754; break; // &twoheadleftarr -> &twoheadleftarro + case 8764: state = 8765; break; // &twoheadrightarr -> &twoheadrightarro + case 8768: state = 8954; break; // &U -> &Uo + case 8775: state = 8959; break; // &u -> &uo + case 8783: state = 8792; break; // &Uarr -> &Uarro + case 8888: state = 8889; break; // &ulc -> &ulco + case 8896: state = 8897; break; // &ulcr -> &ulcro + case 8945: state = 8946; break; // &Uni -> &Unio + case 8955: state = 8956; break; // &Uog -> &Uogo + case 8960: state = 8961; break; // &uog -> &uogo + case 8973: state = 8974; break; // &UpArr -> &UpArro + case 8979: state = 8980; break; // &Uparr -> &Uparro + case 8986: state = 8987; break; // &uparr -> &uparro + case 8994: state = 8995; break; // &UpArrowD -> &UpArrowDo + case 9000: state = 9001; break; // &UpArrowDownArr -> &UpArrowDownArro + case 9004: state = 9005; break; // &UpD -> &UpDo + case 9010: state = 9011; break; // &UpDownArr -> &UpDownArro + case 9014: state = 9015; break; // &Upd -> &Updo + case 9020: state = 9021; break; // &Updownarr -> &Updownarro + case 9024: state = 9025; break; // &upd -> &updo + case 9030: state = 9031; break; // &updownarr -> &updownarro + case 9049: state = 9050; break; // &upharp -> &upharpo + case 9050: state = 9051; break; // &upharpo -> &upharpoo + case 9077: state = 9078; break; // &UpperLeftArr -> &UpperLeftArro + case 9088: state = 9089; break; // &UpperRightArr -> &UpperRightArro + case 9100: state = 9101; break; // &Upsil -> &Upsilo + case 9104: state = 9105; break; // &upsil -> &upsilo + case 9114: state = 9115; break; // &UpTeeArr -> &UpTeeArro + case 9122: state = 9123; break; // &upuparr -> &upuparro + case 9128: state = 9129; break; // &urc -> &urco + case 9136: state = 9137; break; // &urcr -> &urcro + case 9162: state = 9163; break; // &utd -> &utdo + case 9201: state = 9436; break; // &v -> &vo + case 9213: state = 9214; break; // &varepsil -> &varepsilo + case 9223: state = 9224; break; // &varn -> &varno + case 9237: state = 9238; break; // &varpr -> &varpro + case 9240: state = 9241; break; // &varpropt -> &varpropto + case 9249: state = 9250; break; // &varrh -> &varrho + case 9303: state = 9432; break; // &V -> &Vo + case 9393: state = 9394; break; // &VerticalSeparat -> &VerticalSeparato + case 9441: state = 9442; break; // &vpr -> &vpro + case 9484: state = 9523; break; // &W -> &Wo + case 9490: state = 9527; break; // &w -> &wo + case 9548: state = 9602; break; // &x -> &xo + case 9565: state = 9607; break; // &X -> &Xo + case 9603: state = 9604; break; // &xod -> &xodo + case 9665: state = 9716; break; // &Y -> &Yo + case 9672: state = 9720; break; // &y -> &yo + case 9747: state = 9832; break; // &Z -> &Zo + case 9754: state = 9836; break; // &z -> &zo + case 9763: state = 9764; break; // &Zcar -> &Zcaro + case 9769: state = 9770; break; // &zcar -> &zcaro + case 9777: state = 9778; break; // &Zd -> &Zdo + case 9781: state = 9782; break; // &zd -> &zdo + case 9792: state = 9793; break; // &Zer -> &Zero default: return false; } break; case 'p': switch (state) { - case 0: state = 5083; break; // & -> &p - case 1: state = 154; break; // &A -> &Ap - case 7: state = 143; break; // &a -> &ap - case 60: state = 72; break; // &al -> &alp - case 61: state = 66; break; // &ale -> &alep - case 68: state = 69; break; // &Al -> &Alp - case 79: state = 87; break; // &am -> & - case 98: state = 99; break; // &andslo -> &andslop - case 123: state = 124; break; // &angs -> &angsp - case 131: state = 139; break; // &Ao -> &Aop - case 135: state = 141; break; // &ao -> &aop - case 143: state = 166; break; // &ap -> &app - case 154: state = 155; break; // &Ap -> &App - case 192: state = 193; break; // &asym -> &asymp - case 222: state = 532; break; // &b -> &bp - case 225: state = 237; break; // &back -> &backp - case 230: state = 231; break; // &backe -> &backep - case 288: state = 305; break; // &be -> &bep - case 300: state = 301; break; // &bem -> &bemp - case 336: state = 337; break; // &bigca -> &bigcap - case 341: state = 342; break; // &bigcu -> &bigcup - case 343: state = 347; break; // &bigo -> &bigop - case 359: state = 360; break; // &bigsqcu -> &bigsqcup - case 376: state = 377; break; // &bigtriangleu -> &bigtriangleup - case 378: state = 379; break; // &bigu -> &bigup - case 456: state = 457; break; // &Bo -> &Bop - case 459: state = 460; break; // &bo -> &bop - case 470: state = 499; break; // &box -> &boxp - case 573: state = 574; break; // &bum -> &bump - case 578: state = 579; break; // &Bum -> &Bump - case 584: state = 595; break; // &Ca -> &Cap - case 590: state = 596; break; // &ca -> &cap - case 603: state = 604; break; // &capbrcu -> &capbrcup - case 606: state = 607; break; // &capca -> &capcap - case 608: state = 609; break; // &capcu -> &capcup - case 642: state = 643; break; // &cca -> &ccap - case 672: state = 673; break; // &ccu -> &ccup - case 693: state = 694; break; // &cem -> &cemp - case 856: state = 913; break; // &Co -> &Cop - case 860: state = 915; break; // &co -> &cop - case 867: state = 871; break; // &com -> &comp - case 978: state = 981; break; // &csu -> &csup - case 987: state = 1006; break; // &cu -> &cup - case 994: state = 995; break; // &cue -> &cuep - case 1002: state = 1003; break; // &cularr -> &cularrp - case 1004: state = 1005; break; // &Cu -> &Cup - case 1010: state = 1011; break; // &cupbrca -> &cupbrcap - case 1013: state = 1014; break; // &CupCa -> &CupCap - case 1016: state = 1017; break; // &cupca -> &cupcap - case 1018: state = 1019; break; // &cupcu -> &cupcup - case 1034: state = 1035; break; // &curlyeq -> &curlyeqp - case 1170: state = 1171; break; // &dem -> &demp - case 1289: state = 1290; break; // &dlcro -> &dlcrop - case 1291: state = 1299; break; // &do -> &dop - case 1296: state = 1297; break; // &Do -> &Dop - case 1302: state = 1321; break; // &dot -> &dotp - case 1439: state = 1440; break; // &DoubleU -> &DoubleUp - case 1488: state = 1489; break; // &DownArrowU -> &DownArrowUp - case 1512: state = 1513; break; // &downhar -> &downharp - case 1602: state = 1603; break; // &drcro -> &drcrop - case 1656: state = 1823; break; // &E -> &Ep - case 1662: state = 1813; break; // &e -> &ep - case 1746: state = 1760; break; // &Em -> &Emp - case 1750: state = 1754; break; // &em -> &emp - case 1790: state = 1791; break; // &ems -> &emsp - case 1799: state = 1800; break; // &ens -> &ensp - case 1801: state = 1809; break; // &Eo -> &Eop - case 1805: state = 1811; break; // &eo -> &eop - case 1884: state = 1885; break; // &eqv -> &eqvp - case 1925: state = 1936; break; // &ex -> &exp - case 1931: state = 1945; break; // &Ex -> &Exp - case 1964: state = 2076; break; // &f -> &fp - case 2052: state = 2053; break; // &Fo -> &Fop - case 2055: state = 2056; break; // &fo -> &fop - case 2119: state = 2134; break; // &ga -> &gap - case 2209: state = 2210; break; // &gna -> &gnap - case 2210: state = 2211; break; // &gnap -> &gnapp - case 2222: state = 2223; break; // &Go -> &Gop - case 2225: state = 2226; break; // &go -> &gop - case 2312: state = 2313; break; // >ra -> >rap - case 2313: state = 2314; break; // >rap -> >rapp - case 2360: state = 2361; break; // &hairs -> &hairsp - case 2407: state = 2408; break; // &helli -> &hellip - case 2423: state = 2424; break; // &HilbertS -> &HilbertSp - case 2440: state = 2472; break; // &ho -> &hop - case 2469: state = 2470; break; // &Ho -> &Hop - case 2509: state = 2510; break; // &Hum -> &Hump - case 2517: state = 2518; break; // &HumpDownHum -> &HumpDownHump - case 2524: state = 2529; break; // &hy -> &hyp - case 2539: state = 2731; break; // &i -> &ip - case 2604: state = 2636; break; // &Im -> &Imp - case 2608: state = 2633; break; // &im -> &imp - case 2612: state = 2625; break; // &imag -> &imagp - case 2658: state = 2689; break; // &int -> &intp - case 2713: state = 2725; break; // &io -> &iop - case 2716: state = 2723; break; // &Io -> &Iop - case 2797: state = 2798; break; // &Jo -> &Jop - case 2800: state = 2801; break; // &jo -> &jop - case 2826: state = 2827; break; // &Ka -> &Kap - case 2827: state = 2828; break; // &Kap -> &Kapp - case 2831: state = 2832; break; // &ka -> &kap - case 2832: state = 2833; break; // &kap -> &kapp - case 2869: state = 2870; break; // &Ko -> &Kop - case 2872: state = 2873; break; // &ko -> &kop - case 2881: state = 3638; break; // &l -> &lp - case 2887: state = 2923; break; // &La -> &Lap - case 2892: state = 2922; break; // &la -> &lap - case 2898: state = 2899; break; // &laem -> &laemp - case 2939: state = 2949; break; // &larr -> &larrp - case 2947: state = 2948; break; // &larrl -> &larrlp - case 3128: state = 3129; break; // &lefthar -> &leftharp - case 3137: state = 3138; break; // &leftharpoonu -> &leftharpoonup - case 3182: state = 3183; break; // &leftrighthar -> &leftrightharp - case 3243: state = 3244; break; // &LeftU -> &LeftUp - case 3303: state = 3304; break; // &lessa -> &lessap - case 3304: state = 3305; break; // &lessap -> &lessapp - case 3453: state = 3454; break; // &lna -> &lnap - case 3454: state = 3455; break; // &lnap -> &lnapp - case 3466: state = 3589; break; // &lo -> &lop - case 3475: state = 3592; break; // &Lo -> &Lop - case 3538: state = 3539; break; // &longma -> &longmap - case 3573: state = 3574; break; // &loo -> &loop - case 3745: state = 3875; break; // &m -> &mp - case 3746: state = 3758; break; // &ma -> &map - case 3756: state = 3757; break; // &Ma -> &Map - case 3770: state = 3771; break; // &mapstou -> &mapstoup - case 3809: state = 3810; break; // &MediumS -> &MediumSp - case 3856: state = 3857; break; // &mlc -> &mlcp - case 3860: state = 3861; break; // &mn -> &mnp - case 3865: state = 3873; break; // &mo -> &mop - case 3870: state = 3871; break; // &Mo -> &Mop - case 3882: state = 3883; break; // &mst -> &mstp - case 3892: state = 3893; break; // &multima -> &multimap - case 3895: state = 3896; break; // &muma -> &mumap - case 3897: state = 4597; break; // &n -> &np - case 3898: state = 3914; break; // &na -> &nap - case 3914: state = 3920; break; // &nap -> &napp - case 3931: state = 3932; break; // &nbs ->   - case 3934: state = 3935; break; // &nbum -> &nbump - case 3938: state = 3939; break; // &nca -> &ncap - case 3962: state = 3963; break; // &ncu -> &ncup - case 3997: state = 3998; break; // &NegativeMediumS -> &NegativeMediumSp - case 4007: state = 4008; break; // &NegativeThickS -> &NegativeThickSp - case 4013: state = 4014; break; // &NegativeThinS -> &NegativeThinSp - case 4026: state = 4027; break; // &NegativeVeryThinS -> &NegativeVeryThinSp - case 4101: state = 4108; break; // &nh -> &nhp - case 4190: state = 4210; break; // &No -> &Nop - case 4205: state = 4206; break; // &NonBreakingS -> &NonBreakingSp - case 4212: state = 4213; break; // &no -> &nop - case 4226: state = 4227; break; // &NotCu -> &NotCup - case 4229: state = 4230; break; // &NotCupCa -> &NotCupCap - case 4318: state = 4319; break; // &NotHum -> &NotHump - case 4326: state = 4327; break; // &NotHumpDownHum -> &NotHumpDownHump - case 4494: state = 4504; break; // &NotSquareSu -> &NotSquareSup - case 4515: state = 4551; break; // &NotSu -> &NotSup - case 4653: state = 4685; break; // &ns -> &nsp - case 4666: state = 4670; break; // &nshort -> &nshortp - case 4690: state = 4693; break; // &nsqsu -> &nsqsup - case 4695: state = 4709; break; // &nsu -> &nsup - case 4758: state = 4759; break; // &nums -> &numsp - case 4761: state = 4762; break; // &nva -> &nvap - case 4827: state = 4960; break; // &O -> &Op - case 4833: state = 4957; break; // &o -> &op - case 4951: state = 4952; break; // &Oo -> &Oop - case 4954: state = 4955; break; // &oo -> &oop - case 4985: state = 4986; break; // &oper -> &operp - case 5010: state = 5011; break; // &orslo -> &orslop - case 5109: state = 5119; break; // &per -> &perp - case 5189: state = 5208; break; // &Po -> &Pop - case 5195: state = 5196; break; // &Poincare -> &Poincarep - case 5201: state = 5210; break; // &po -> &pop - case 5217: state = 5218; break; // &pra -> &prap - case 5225: state = 5226; break; // &preca -> &precap - case 5226: state = 5227; break; // &precap -> &precapp - case 5267: state = 5268; break; // &precna -> &precnap - case 5268: state = 5269; break; // &precnap -> &precnapp - case 5290: state = 5291; break; // &prna -> &prnap - case 5296: state = 5316; break; // &pro -> &prop - case 5298: state = 5317; break; // &Pro -> &Prop - case 5346: state = 5347; break; // &puncs -> &puncsp - case 5351: state = 5363; break; // &q -> &qp - case 5357: state = 5358; break; // &Qo -> &Qop - case 5360: state = 5361; break; // &qo -> &qop - case 5397: state = 5909; break; // &r -> &rp - case 5418: state = 5419; break; // &raem -> &raemp - case 5439: state = 5452; break; // &rarr -> &rarrp - case 5440: state = 5441; break; // &rarra -> &rarrap - case 5450: state = 5451; break; // &rarrl -> &rarrlp - case 5543: state = 5547; break; // &real -> &realp - case 5579: state = 5580; break; // &ReverseU -> &ReverseUp - case 5714: state = 5715; break; // &righthar -> &rightharp - case 5723: state = 5724; break; // &rightharpoonu -> &rightharpoonup - case 5737: state = 5738; break; // &rightlefthar -> &rightleftharp - case 5803: state = 5804; break; // &RightU -> &RightUp - case 5875: state = 5884; break; // &ro -> &rop - case 5887: state = 5888; break; // &Ro -> &Rop - case 5903: state = 5904; break; // &RoundIm -> &RoundImp - case 5909: state = 5914; break; // &rp -> &rpp - case 5991: state = 6249; break; // &s -> &sp - case 6002: state = 6037; break; // &sc -> &scp - case 6003: state = 6004; break; // &sca -> &scap - case 6031: state = 6032; break; // &scna -> &scnap - case 6090: state = 6091; break; // &shar -> &sharp - case 6128: state = 6132; break; // &short -> &shortp - case 6150: state = 6151; break; // &ShortU -> &ShortUp - case 6168: state = 6180; break; // &sim -> &simp - case 6215: state = 6216; break; // &smash -> &smashp - case 6217: state = 6218; break; // &sme -> &smep - case 6235: state = 6247; break; // &so -> &sop - case 6244: state = 6245; break; // &So -> &Sop - case 6260: state = 6261; break; // &sqca -> &sqcap - case 6263: state = 6264; break; // &sqcu -> &sqcup - case 6270: state = 6278; break; // &sqsu -> &sqsup - case 6306: state = 6316; break; // &SquareSu -> &SquareSup - case 6368: state = 6376; break; // &straight -> &straightp - case 6369: state = 6370; break; // &straighte -> &straightep - case 6381: state = 6499; break; // &Su -> &Sup - case 6383: state = 6500; break; // &su -> &sup - case 6384: state = 6400; break; // &sub -> &subp - case 6428: state = 6430; break; // &subsu -> &subsup - case 6433: state = 6434; break; // &succa -> &succap - case 6434: state = 6435; break; // &succap -> &succapp - case 6475: state = 6476; break; // &succna -> &succnap - case 6476: state = 6477; break; // &succnap -> &succnapp - case 6500: state = 6542; break; // &sup -> &supp - case 6561: state = 6563; break; // &supsu -> &supsup - case 6586: state = 6751; break; // &t -> &tp - case 6657: state = 6658; break; // &thicka -> &thickap - case 6658: state = 6659; break; // &thickap -> &thickapp - case 6669: state = 6670; break; // &ThickS -> &ThickSp - case 6675: state = 6676; break; // &thins -> &thinsp - case 6678: state = 6679; break; // &ThinS -> &ThinSp - case 6684: state = 6685; break; // &thka -> &thkap - case 6732: state = 6735; break; // &to -> &top - case 6742: state = 6743; break; // &To -> &Top - case 6760: state = 6815; break; // &tr -> &trp - case 6764: state = 6805; break; // &tri -> &trip - case 6798: state = 6799; break; // &Tri -> &Trip - case 6873: state = 7031; break; // &U -> &Up - case 6879: state = 7042; break; // &u -> &up - case 6973: state = 6974; break; // &ulcro -> &ulcrop - case 7019: state = 7027; break; // &Uo -> &Uop - case 7023: state = 7029; break; // &uo -> &uop - case 7031: state = 7117; break; // &Up -> &Upp - case 7100: state = 7101; break; // &uphar -> &upharp - case 7158: state = 7159; break; // &upu -> &upup - case 7174: state = 7175; break; // &urcro -> &urcrop - case 7223: state = 7413; break; // &v -> &vp - case 7229: state = 7249; break; // &var -> &varp - case 7230: state = 7231; break; // &vare -> &varep - case 7238: state = 7239; break; // &varka -> &varkap - case 7239: state = 7240; break; // &varkap -> &varkapp - case 7254: state = 7255; break; // &varpro -> &varprop - case 7269: state = 7278; break; // &varsu -> &varsup - case 7347: state = 7348; break; // &velli -> &vellip - case 7371: state = 7372; break; // &VerticalSe -> &VerticalSep - case 7389: state = 7390; break; // &VeryThinS -> &VeryThinSp - case 7404: state = 7406; break; // &vnsu -> &vnsup - case 7407: state = 7408; break; // &Vo -> &Vop - case 7410: state = 7411; break; // &vo -> &vop - case 7415: state = 7416; break; // &vpro -> &vprop - case 7427: state = 7432; break; // &vsu -> &vsup - case 7452: state = 7483; break; // &w -> &wp - case 7471: state = 7472; break; // &weier -> &weierp - case 7477: state = 7478; break; // &Wo -> &Wop - case 7480: state = 7481; break; // &wo -> &wop - case 7497: state = 7498; break; // &xca -> &xcap - case 7502: state = 7503; break; // &xcu -> &xcup - case 7530: state = 7531; break; // &xma -> &xmap - case 7535: state = 7542; break; // &xo -> &xop - case 7539: state = 7540; break; // &Xo -> &Xop - case 7566: state = 7567; break; // &xsqcu -> &xsqcup - case 7568: state = 7569; break; // &xu -> &xup - case 7622: state = 7623; break; // &Yo -> &Yop - case 7625: state = 7626; break; // &yo -> &yop - case 7688: state = 7689; break; // &ZeroWidthS -> &ZeroWidthSp - case 7713: state = 7714; break; // &Zo -> &Zop - case 7716: state = 7717; break; // &zo -> &zop + case 0: state = 6463; break; // & -> &p + case 1: state = 216; break; // &A -> &Ap + case 8: state = 199; break; // &a -> &ap + case 79: state = 94; break; // &al -> &alp + case 80: state = 86; break; // &ale -> &alep + case 89: state = 90; break; // &Al -> &Alp + case 103: state = 114; break; // &am -> & + case 130: state = 131; break; // &andslo -> &andslop + case 172: state = 173; break; // &angs -> &angsp + case 183: state = 193; break; // &Ao -> &Aop + case 188: state = 196; break; // &ao -> &aop + case 199: state = 229; break; // &ap -> &app + case 216: state = 217; break; // &Ap -> &App + case 263: state = 264; break; // &asym -> &asymp + case 301: state = 719; break; // &b -> &bp + case 304: state = 318; break; // &back -> &backp + case 310: state = 311; break; // &backe -> &backep + case 384: state = 405; break; // &be -> &bep + case 399: state = 400; break; // &bem -> &bemp + case 445: state = 446; break; // &bigca -> &bigcap + case 452: state = 453; break; // &bigcu -> &bigcup + case 455: state = 460; break; // &bigo -> &bigop + case 474: state = 475; break; // &bigsqcu -> &bigsqcup + case 494: state = 495; break; // &bigtriangleu -> &bigtriangleup + case 497: state = 498; break; // &bigu -> &bigup + case 594: state = 595; break; // &Bo -> &Bop + case 598: state = 599; break; // &bo -> &bop + case 613: state = 662; break; // &box -> &boxp + case 774: state = 775; break; // &bum -> &bump + case 782: state = 783; break; // &Bum -> &Bump + case 790: state = 803; break; // &Ca -> &Cap + case 797: state = 805; break; // &ca -> &cap + case 814: state = 815; break; // &capbrcu -> &capbrcup + case 818: state = 819; break; // &capca -> &capcap + case 821: state = 822; break; // &capcu -> &capcup + case 862: state = 863; break; // &cca -> &ccap + case 900: state = 901; break; // &ccu -> &ccup + case 927: state = 928; break; // &cem -> &cemp + case 1126: state = 1200; break; // &Co -> &Cop + case 1131: state = 1203; break; // &co -> &cop + case 1142: state = 1148; break; // &com -> &comp + case 1278: state = 1283; break; // &csu -> &csup + case 1292: state = 1318; break; // &cu -> &cup + case 1301: state = 1302; break; // &cue -> &cuep + case 1311: state = 1313; break; // &cularr -> &cularrp + case 1315: state = 1316; break; // &Cu -> &Cup + case 1323: state = 1324; break; // &cupbrca -> &cupbrcap + case 1327: state = 1328; break; // &CupCa -> &CupCap + case 1331: state = 1332; break; // &cupca -> &cupcap + case 1334: state = 1335; break; // &cupcu -> &cupcup + case 1356: state = 1357; break; // &curlyeq -> &curlyeqp + case 1529: state = 1530; break; // &dem -> &demp + case 1676: state = 1677; break; // &dlcro -> &dlcrop + case 1679: state = 1689; break; // &do -> &dop + case 1685: state = 1686; break; // &Do -> &Dop + case 1694: state = 1719; break; // &dot -> &dotp + case 1851: state = 1852; break; // &DoubleU -> &DoubleUp + case 1907: state = 1908; break; // &DownArrowU -> &DownArrowUp + case 1934: state = 1935; break; // &downhar -> &downharp + case 2037: state = 2038; break; // &drcro -> &drcrop + case 2108: state = 2326; break; // &E -> &Ep + case 2115: state = 2312; break; // &e -> &ep + case 2228: state = 2246; break; // &Em -> &Emp + case 2233: state = 2238; break; // &em -> &emp + case 2279: state = 2280; break; // &ems -> &emsp + case 2293: state = 2294; break; // &ens -> &ensp + case 2296: state = 2306; break; // &Eo -> &Eop + case 2301: state = 2309; break; // &eo -> &eop + case 2402: state = 2403; break; // &eqv -> &eqvp + case 2458: state = 2472; break; // &ex -> &exp + case 2466: state = 2482; break; // &Ex -> &Exp + case 2503: state = 2639; break; // &f -> &fp + case 2608: state = 2609; break; // &Fo -> &Fop + case 2612: state = 2613; break; // &fo -> &fop + case 2702: state = 2722; break; // &ga -> &gap + case 2833: state = 2834; break; // &gna -> &gnap + case 2834: state = 2836; break; // &gnap -> &gnapp + case 2853: state = 2854; break; // &Go -> &Gop + case 2857: state = 2858; break; // &go -> &gop + case 2966: state = 2967; break; // >ra -> >rap + case 2967: state = 2968; break; // >rap -> >rapp + case 3024: state = 3025; break; // &hairs -> &hairsp + case 3086: state = 3087; break; // &helli -> &hellip + case 3106: state = 3107; break; // &HilbertS -> &HilbertSp + case 3126: state = 3163; break; // &ho -> &hop + case 3159: state = 3160; break; // &Ho -> &Hop + case 3208: state = 3209; break; // &Hum -> &Hump + case 3216: state = 3217; break; // &HumpDownHum -> &HumpDownHump + case 3225: state = 3231; break; // &hy -> &hyp + case 3243: state = 3492; break; // &i -> &ip + case 3330: state = 3372; break; // &Im -> &Imp + case 3336: state = 3368; break; // &im -> &imp + case 3341: state = 3357; break; // &imag -> &imagp + case 3401: state = 3439; break; // &int -> &intp + case 3467: state = 3483; break; // &io -> &iop + case 3471: state = 3480; break; // &Io -> &Iop + case 3582: state = 3583; break; // &Jo -> &Jop + case 3586: state = 3587; break; // &jo -> &jop + case 3619: state = 3620; break; // &Ka -> &Kap + case 3620: state = 3621; break; // &Kap -> &Kapp + case 3625: state = 3626; break; // &ka -> &kap + case 3626: state = 3627; break; // &kap -> &kapp + case 3676: state = 3677; break; // &Ko -> &Kop + case 3680: state = 3681; break; // &ko -> &kop + case 3692: state = 4621; break; // &l -> &lp + case 3699: state = 3746; break; // &La -> &Lap + case 3705: state = 3744; break; // &la -> &lap + case 3712: state = 3713; break; // &laem -> &laemp + case 3766: state = 3782; break; // &larr -> &larrp + case 3779: state = 3780; break; // &larrl -> &larrlp + case 4006: state = 4007; break; // &lefthar -> &leftharp + case 4016: state = 4017; break; // &leftharpoonu -> &leftharpoonup + case 4067: state = 4068; break; // &leftrighthar -> &leftrightharp + case 4138: state = 4139; break; // &LeftU -> &LeftUp + case 4216: state = 4217; break; // &lessa -> &lessap + case 4217: state = 4218; break; // &lessap -> &lessapp + case 4402: state = 4403; break; // &lna -> &lnap + case 4403: state = 4405; break; // &lnap -> &lnapp + case 4422: state = 4560; break; // &lo -> &lop + case 4434: state = 4564; break; // &Lo -> &Lop + case 4503: state = 4504; break; // &longma -> &longmap + case 4542: state = 4543; break; // &loo -> &loop + case 4767: state = 4935; break; // &m -> &mp + case 4768: state = 4785; break; // &ma -> &map + case 4782: state = 4783; break; // &Ma -> &Map + case 4801: state = 4802; break; // &mapstou -> &mapstoup + case 4848: state = 4849; break; // &MediumS -> &MediumSp + case 4910: state = 4911; break; // &mlc -> &mlcp + case 4916: state = 4917; break; // &mn -> &mnp + case 4922: state = 4932; break; // &mo -> &mop + case 4928: state = 4929; break; // &Mo -> &Mop + case 4945: state = 4946; break; // &mst -> &mstp + case 4958: state = 4959; break; // &multima -> &multimap + case 4962: state = 4963; break; // &muma -> &mumap + case 4965: state = 5821; break; // &n -> &np + case 4966: state = 4986; break; // &na -> &nap + case 4986: state = 4996; break; // &nap -> &napp + case 5011: state = 5012; break; // &nbs ->   + case 5015: state = 5016; break; // &nbum -> &nbump + case 5021: state = 5022; break; // &nca -> &ncap + case 5052: state = 5053; break; // &ncu -> &ncup + case 5097: state = 5098; break; // &NegativeMediumS -> &NegativeMediumSp + case 5108: state = 5109; break; // &NegativeThickS -> &NegativeThickSp + case 5115: state = 5116; break; // &NegativeThinS -> &NegativeThinSp + case 5129: state = 5130; break; // &NegativeVeryThinS -> &NegativeVeryThinSp + case 5227: state = 5236; break; // &nh -> &nhp + case 5347: state = 5369; break; // &No -> &Nop + case 5363: state = 5364; break; // &NonBreakingS -> &NonBreakingSp + case 5372: state = 5373; break; // &no -> &nop + case 5390: state = 5391; break; // &NotCu -> &NotCup + case 5393: state = 5394; break; // &NotCupCa -> &NotCupCap + case 5495: state = 5496; break; // &NotHum -> &NotHump + case 5503: state = 5504; break; // &NotHumpDownHum -> &NotHumpDownHump + case 5701: state = 5713; break; // &NotSquareSu -> &NotSquareSup + case 5726: state = 5768; break; // &NotSu -> &NotSup + case 5895: state = 5938; break; // &ns -> &nsp + case 5913: state = 5918; break; // &nshort -> &nshortp + case 5944: state = 5948; break; // &nsqsu -> &nsqsup + case 5951: state = 5973; break; // &nsu -> &nsup + case 6040: state = 6041; break; // &nums -> &numsp + case 6044: state = 6045; break; // &nva -> &nvap + case 6131: state = 6306; break; // &O -> &Op + case 6138: state = 6302; break; // &o -> &op + case 6294: state = 6295; break; // &Oo -> &Oop + case 6298: state = 6299; break; // &oo -> &oop + case 6333: state = 6334; break; // &oper -> &operp + case 6370: state = 6371; break; // &orslo -> &orslop + case 6498: state = 6511; break; // &per -> &perp + case 6609: state = 6630; break; // &Po -> &Pop + case 6615: state = 6616; break; // &Poincare -> &Poincarep + case 6622: state = 6633; break; // &po -> &pop + case 6644: state = 6645; break; // &pra -> &prap + case 6657: state = 6658; break; // &preca -> &precap + case 6658: state = 6659; break; // &precap -> &precapp + case 6706: state = 6707; break; // &precna -> &precnap + case 6707: state = 6708; break; // &precnap -> &precnapp + case 6736: state = 6737; break; // &prna -> &prnap + case 6745: state = 6770; break; // &pro -> &prop + case 6748: state = 6772; break; // &Pro -> &Prop + case 6810: state = 6811; break; // &puncs -> &puncsp + case 6817: state = 6833; break; // &q -> &qp + case 6825: state = 6826; break; // &Qo -> &Qop + case 6829: state = 6830; break; // &qo -> &qop + case 6876: state = 7512; break; // &r -> &rp + case 6902: state = 6903; break; // &raem -> &raemp + case 6932: state = 6953; break; // &rarr -> &rarrp + case 6934: state = 6935; break; // &rarra -> &rarrap + case 6950: state = 6951; break; // &rarrl -> &rarrlp + case 7076: state = 7082; break; // &real -> &realp + case 7121: state = 7122; break; // &ReverseU -> &ReverseUp + case 7281: state = 7282; break; // &righthar -> &rightharp + case 7291: state = 7292; break; // &rightharpoonu -> &rightharpoonup + case 7307: state = 7308; break; // &rightlefthar -> &rightleftharp + case 7383: state = 7384; break; // &RightU -> &RightUp + case 7469: state = 7481; break; // &ro -> &rop + case 7485: state = 7486; break; // &Ro -> &Rop + case 7505: state = 7506; break; // &RoundIm -> &RoundImp + case 7512: state = 7519; break; // &rp -> &rpp + case 7617: state = 7956; break; // &s -> &sp + case 7631: state = 7680; break; // &sc -> &scp + case 7633: state = 7634; break; // &sca -> &scap + case 7671: state = 7672; break; // &scna -> &scnap + case 7753: state = 7754; break; // &shar -> &sharp + case 7798: state = 7803; break; // &short -> &shortp + case 7823: state = 7824; break; // &ShortU -> &ShortUp + case 7847: state = 7868; break; // &sim -> &simp + case 7908: state = 7909; break; // &smash -> &smashp + case 7911: state = 7912; break; // &sme -> &smep + case 7936: state = 7953; break; // &so -> &sop + case 7949: state = 7950; break; // &So -> &Sop + case 7970: state = 7971; break; // &sqca -> &sqcap + case 7975: state = 7976; break; // &sqcu -> &sqcup + case 7985: state = 7997; break; // &sqsu -> &sqsup + case 8033: state = 8045; break; // &SquareSu -> &SquareSup + case 8111: state = 8120; break; // &straight -> &straightp + case 8112: state = 8113; break; // &straighte -> &straightep + case 8127: state = 8282; break; // &Su -> &Sup + case 8130: state = 8284; break; // &su -> &sup + case 8131: state = 8155; break; // &sub -> &subp + case 8193: state = 8196; break; // &subsu -> &subsup + case 8201: state = 8202; break; // &succa -> &succap + case 8202: state = 8203; break; // &succap -> &succapp + case 8250: state = 8251; break; // &succna -> &succnap + case 8251: state = 8252; break; // &succnap -> &succnapp + case 8284: state = 8343; break; // &sup -> &supp + case 8370: state = 8373; break; // &supsu -> &supsup + case 8404: state = 8617; break; // &t -> &tp + case 8496: state = 8497; break; // &thicka -> &thickap + case 8497: state = 8498; break; // &thickap -> &thickapp + case 8510: state = 8511; break; // &ThickS -> &ThickSp + case 8517: state = 8518; break; // &thins -> &thinsp + case 8521: state = 8522; break; // &ThinS -> &ThinSp + case 8528: state = 8529; break; // &thka -> &thkap + case 8590: state = 8594; break; // &to -> &top + case 8604: state = 8605; break; // &To -> &Top + case 8628: state = 8698; break; // &tr -> &trp + case 8633: state = 8685; break; // &tri -> &trip + case 8677: state = 8678; break; // &Tri -> &Trip + case 8768: state = 8970; break; // &U -> &Up + case 8775: state = 8983; break; // &u -> &up + case 8897: state = 8898; break; // &ulcro -> &ulcrop + case 8954: state = 8964; break; // &Uo -> &Uop + case 8959: state = 8967; break; // &uo -> &uop + case 8970: state = 9068; break; // &Up -> &Upp + case 9048: state = 9049; break; // &uphar -> &upharp + case 9118: state = 9119; break; // &upu -> &upup + case 9137: state = 9138; break; // &urcro -> &urcrop + case 9201: state = 9440; break; // &v -> &vp + case 9208: state = 9231; break; // &var -> &varp + case 9209: state = 9210; break; // &vare -> &varep + case 9218: state = 9219; break; // &varka -> &varkap + case 9219: state = 9220; break; // &varkap -> &varkapp + case 9238: state = 9239; break; // &varpro -> &varprop + case 9258: state = 9269; break; // &varsu -> &varsup + case 9357: state = 9358; break; // &velli -> &vellip + case 9388: state = 9389; break; // &VerticalSe -> &VerticalSep + case 9408: state = 9409; break; // &VeryThinS -> &VeryThinSp + case 9427: state = 9430; break; // &vnsu -> &vnsup + case 9432: state = 9433; break; // &Vo -> &Vop + case 9436: state = 9437; break; // &vo -> &vop + case 9442: state = 9443; break; // &vpro -> &vprop + case 9458: state = 9465; break; // &vsu -> &vsup + case 9490: state = 9531; break; // &w -> &wp + case 9514: state = 9515; break; // &weier -> &weierp + case 9523: state = 9524; break; // &Wo -> &Wop + case 9527: state = 9528; break; // &wo -> &wop + case 9550: state = 9551; break; // &xca -> &xcap + case 9557: state = 9558; break; // &xcu -> &xcup + case 9595: state = 9596; break; // &xma -> &xmap + case 9602: state = 9611; break; // &xo -> &xop + case 9607: state = 9608; break; // &Xo -> &Xop + case 9642: state = 9643; break; // &xsqcu -> &xsqcup + case 9645: state = 9646; break; // &xu -> &xup + case 9716: state = 9717; break; // &Yo -> &Yop + case 9720: state = 9721; break; // &yo -> &yop + case 9799: state = 9800; break; // &ZeroWidthS -> &ZeroWidthSp + case 9832: state = 9833; break; // &Zo -> &Zop + case 9836: state = 9837; break; // &zo -> &zop default: return false; } break; case 'q': switch (state) { - case 0: state = 5351; break; // & -> &q - case 170: state = 171; break; // &approxe -> &approxeq - case 194: state = 195; break; // &asympe -> &asympeq - case 245: state = 246; break; // &backsime -> &backsimeq - case 284: state = 285; break; // &bd -> &bdq - case 356: state = 357; break; // &bigs -> &bigsq - case 407: state = 408; break; // &blacks -> &blacksq - case 446: state = 447; break; // &bne -> &bneq - case 576: state = 582; break; // &bumpe -> &bumpeq - case 580: state = 581; break; // &Bumpe -> &Bumpeq - case 735: state = 736; break; // &circe -> &circeq - case 865: state = 866; break; // &colone -> &coloneq - case 1033: state = 1034; break; // &curlye -> &curlyeq - case 1159: state = 1160; break; // &ddotse -> &ddotseq - case 1306: state = 1307; break; // &dote -> &doteq - case 1311: state = 1312; break; // &DotE -> &DotEq - case 1325: state = 1326; break; // &dots -> &dotsq - case 1656: state = 1856; break; // &E -> &Eq - case 1662: state = 1833; break; // &e -> &eq - case 1768: state = 1769; break; // &EmptySmallS -> &EmptySmallSq - case 1784: state = 1785; break; // &EmptyVerySmallS -> &EmptyVerySmallSq - case 1975: state = 1976; break; // &fallingdotse -> &fallingdotseq - case 2015: state = 2016; break; // &FilledSmallS -> &FilledSmallSq - case 2030: state = 2031; break; // &FilledVerySmallS -> &FilledVerySmallSq - case 2166: state = 2169; break; // &ge -> &geq - case 2169: state = 2170; break; // &geq -> &geqq - case 2216: state = 2217; break; // &gne -> &gneq - case 2217: state = 2218; break; // &gneq -> &gneqq - case 2238: state = 2239; break; // &GreaterE -> &GreaterEq - case 2251: state = 2252; break; // &GreaterFullE -> &GreaterFullEq - case 2272: state = 2273; break; // &GreaterSlantE -> &GreaterSlantEq - case 2294: state = 2306; break; // > -> >q - case 2323: state = 2324; break; // >re -> >req - case 2324: state = 2329; break; // >req -> >reqq - case 2346: state = 2347; break; // &gvertne -> &gvertneq - case 2347: state = 2348; break; // &gvertneq -> &gvertneqq - case 2519: state = 2520; break; // &HumpE -> &HumpEq - case 2539: state = 2735; break; // &i -> &iq - case 2892: state = 2931; break; // &la -> &laq - case 3012: state = 3015; break; // &ld -> &ldq - case 3032: state = 3284; break; // &le -> &leq - case 3188: state = 3189; break; // &leftrights -> &leftrightsq - case 3238: state = 3239; break; // &LeftTriangleE -> &LeftTriangleEq - case 3284: state = 3285; break; // &leq -> &leqq - case 3312: state = 3313; break; // &lesse -> &lesseq - case 3313: state = 3317; break; // &lesseq -> &lesseqq - case 3323: state = 3324; break; // &LessE -> &LessEq - case 3339: state = 3340; break; // &LessFullE -> &LessFullEq - case 3366: state = 3367; break; // &LessSlantE -> &LessSlantEq - case 3460: state = 3461; break; // &lne -> &lneq - case 3461: state = 3462; break; // &lneq -> &lneqq - case 3661: state = 3677; break; // &ls -> &lsq - case 3662: state = 3663; break; // &lsa -> &lsaq - case 3692: state = 3712; break; // < -> <q - case 3740: state = 3741; break; // &lvertne -> &lvertneq - case 3741: state = 3742; break; // &lvertneq -> &lvertneqq - case 3970: state = 4031; break; // &ne -> &neq - case 4083: state = 4084; break; // &nge -> &ngeq - case 4084: state = 4085; break; // &ngeq -> &ngeqq - case 4131: state = 4168; break; // &nle -> &nleq - case 4168: state = 4169; break; // &nleq -> &nleqq - case 4248: state = 4255; break; // &NotE -> &NotEq - case 4276: state = 4277; break; // &NotGreaterE -> &NotGreaterEq - case 4285: state = 4286; break; // &NotGreaterFullE -> &NotGreaterFullEq - case 4306: state = 4307; break; // &NotGreaterSlantE -> &NotGreaterSlantEq - case 4328: state = 4329; break; // &NotHumpE -> &NotHumpEq - case 4358: state = 4359; break; // &NotLeftTriangleE -> &NotLeftTriangleEq - case 4365: state = 4366; break; // &NotLessE -> &NotLessEq - case 4386: state = 4387; break; // &NotLessSlantE -> &NotLessSlantEq - case 4438: state = 4439; break; // &NotPrecedesE -> &NotPrecedesEq - case 4448: state = 4449; break; // &NotPrecedesSlantE -> &NotPrecedesSlantEq - case 4482: state = 4483; break; // &NotRightTriangleE -> &NotRightTriangleEq - case 4487: state = 4488; break; // &NotS -> &NotSq - case 4499: state = 4500; break; // &NotSquareSubsetE -> &NotSquareSubsetEq - case 4510: state = 4511; break; // &NotSquareSupersetE -> &NotSquareSupersetEq - case 4520: state = 4521; break; // &NotSubsetE -> &NotSubsetEq - case 4531: state = 4532; break; // &NotSucceedsE -> &NotSucceedsEq - case 4541: state = 4542; break; // &NotSucceedsSlantE -> &NotSucceedsSlantEq - case 4557: state = 4558; break; // &NotSupersetE -> &NotSupersetEq - case 4567: state = 4568; break; // &NotTildeE -> &NotTildeEq - case 4576: state = 4577; break; // &NotTildeFullE -> &NotTildeFullEq - case 4619: state = 4620; break; // &nprece -> &npreceq - case 4653: state = 4688; break; // &ns -> &nsq - case 4680: state = 4681; break; // &nsime -> &nsimeq - case 4702: state = 4703; break; // &nsubsete -> &nsubseteq - case 4703: state = 4704; break; // &nsubseteq -> &nsubseteqq - case 4707: state = 4708; break; // &nsucce -> &nsucceq - case 4715: state = 4716; break; // &nsupsete -> &nsupseteq - case 4716: state = 4717; break; // &nsupseteq -> &nsupseteqq - case 4743: state = 4744; break; // &ntrianglelefte -> &ntrianglelefteq - case 4750: state = 4751; break; // &ntrianglerighte -> &ntrianglerighteq - case 5236: state = 5237; break; // &preccurlye -> &preccurlyeq - case 5244: state = 5245; break; // &PrecedesE -> &PrecedesEq - case 5254: state = 5255; break; // &PrecedesSlantE -> &PrecedesSlantEq - case 5264: state = 5265; break; // &prece -> &preceq - case 5273: state = 5274; break; // &precne -> &precneq - case 5274: state = 5275; break; // &precneq -> &precneqq - case 5390: state = 5391; break; // &queste -> &questeq - case 5402: state = 5431; break; // &ra -> &raq - case 5526: state = 5534; break; // &rd -> &rdq - case 5562: state = 5569; break; // &ReverseE -> &ReverseEq - case 5581: state = 5582; break; // &ReverseUpE -> &ReverseUpEq - case 5754: state = 5755; break; // &rights -> &rightsq - case 5798: state = 5799; break; // &RightTriangleE -> &RightTriangleEq - case 5852: state = 5853; break; // &risingdotse -> &risingdotseq - case 5934: state = 5946; break; // &rs -> &rsq - case 5935: state = 5936; break; // &rsa -> &rsaq - case 5985: state = 6266; break; // &S -> &Sq - case 5991: state = 6258; break; // &s -> &sq - case 5997: state = 5998; break; // &sb -> &sbq - case 6172: state = 6173; break; // &sime -> &simeq - case 6276: state = 6277; break; // &sqsubsete -> &sqsubseteq - case 6283: state = 6284; break; // &sqsupsete -> &sqsupseteq - case 6311: state = 6312; break; // &SquareSubsetE -> &SquareSubsetEq - case 6322: state = 6323; break; // &SquareSupersetE -> &SquareSupersetEq - case 6414: state = 6415; break; // &subsete -> &subseteq - case 6415: state = 6416; break; // &subseteq -> &subseteqq - case 6417: state = 6418; break; // &SubsetE -> &SubsetEq - case 6423: state = 6424; break; // &subsetne -> &subsetneq - case 6424: state = 6425; break; // &subsetneq -> &subsetneqq - case 6444: state = 6445; break; // &succcurlye -> &succcurlyeq - case 6452: state = 6453; break; // &SucceedsE -> &SucceedsEq - case 6462: state = 6463; break; // &SucceedsSlantE -> &SucceedsSlantEq - case 6472: state = 6473; break; // &succe -> &succeq - case 6481: state = 6482; break; // &succne -> &succneq - case 6482: state = 6483; break; // &succneq -> &succneqq - case 6520: state = 6521; break; // &SupersetE -> &SupersetEq - case 6552: state = 6553; break; // &supsete -> &supseteq - case 6553: state = 6554; break; // &supseteq -> &supseteqq - case 6556: state = 6557; break; // &supsetne -> &supsetneq - case 6557: state = 6558; break; // &supsetneq -> &supsetneqq - case 6704: state = 6705; break; // &TildeE -> &TildeEq - case 6713: state = 6714; break; // &TildeFullE -> &TildeFullEq - case 6769: state = 6780; break; // &triangle -> &triangleq - case 6778: state = 6779; break; // &trianglelefte -> &trianglelefteq - case 6786: state = 6787; break; // &trianglerighte -> &trianglerighteq - case 7087: state = 7088; break; // &UpE -> &UpEq - case 7275: state = 7276; break; // &varsubsetne -> &varsubsetneq - case 7276: state = 7277; break; // &varsubsetneq -> &varsubsetneqq - case 7283: state = 7284; break; // &varsupsetne -> &varsupsetneq - case 7284: state = 7285; break; // &varsupsetneq -> &varsupsetneqq - case 7343: state = 7344; break; // &veee -> &veeeq - case 7467: state = 7468; break; // &wedge -> &wedgeq - case 7561: state = 7564; break; // &xs -> &xsq + case 0: state = 6817; break; // & -> &q + case 234: state = 235; break; // &approxe -> &approxeq + case 266: state = 267; break; // &asympe -> &asympeq + case 328: state = 329; break; // &backsime -> &backsimeq + case 379: state = 380; break; // &bd -> &bdq + case 471: state = 472; break; // &bigs -> &bigsq + case 531: state = 532; break; // &blacks -> &blacksq + case 580: state = 582; break; // &bne -> &bneq + case 779: state = 787; break; // &bumpe -> &bumpeq + case 784: state = 785; break; // &Bumpe -> &Bumpeq + case 983: state = 984; break; // &circe -> &circeq + case 1138: state = 1140; break; // &colone -> &coloneq + case 1355: state = 1356; break; // &curlye -> &curlyeq + case 1513: state = 1514; break; // &ddotse -> &ddotseq + case 1700: state = 1701; break; // &dote -> &doteq + case 1707: state = 1708; break; // &DotE -> &DotEq + case 1724: state = 1725; break; // &dots -> &dotsq + case 2108: state = 2367; break; // &E -> &Eq + case 2115: state = 2339; break; // &e -> &eq + case 2254: state = 2255; break; // &EmptySmallS -> &EmptySmallSq + case 2272: state = 2273; break; // &EmptyVerySmallS -> &EmptyVerySmallSq + case 2514: state = 2515; break; // &fallingdotse -> &fallingdotseq + case 2564: state = 2565; break; // &FilledSmallS -> &FilledSmallSq + case 2580: state = 2581; break; // &FilledVerySmallS -> &FilledVerySmallSq + case 2765: state = 2771; break; // &ge -> &geq + case 2771: state = 2773; break; // &geq -> &geqq + case 2843: state = 2845; break; // &gne -> &gneq + case 2845: state = 2847; break; // &gneq -> &gneqq + case 2872: state = 2873; break; // &GreaterE -> &GreaterEq + case 2887: state = 2888; break; // &GreaterFullE -> &GreaterFullEq + case 2911: state = 2912; break; // &GreaterSlantE -> &GreaterSlantEq + case 2942: state = 2959; break; // > -> >q + case 2980: state = 2981; break; // >re -> >req + case 2981: state = 2987; break; // >req -> >reqq + case 3007: state = 3008; break; // &gvertne -> &gvertneq + case 3008: state = 3009; break; // &gvertneq -> &gvertneqq + case 3219: state = 3220; break; // &HumpE -> &HumpEq + case 3243: state = 3497; break; // &i -> &iq + case 3705: state = 3755; break; // &la -> &laq + case 3869: state = 3873; break; // &ld -> &ldq + case 3896: state = 4187; break; // &le -> &leq + case 4074: state = 4075; break; // &leftrights -> &leftrightsq + case 4132: state = 4133; break; // &LeftTriangleE -> &LeftTriangleEq + case 4187: state = 4189; break; // &leq -> &leqq + case 4227: state = 4228; break; // &lesse -> &lesseq + case 4228: state = 4233; break; // &lesseq -> &lesseqq + case 4240: state = 4241; break; // &LessE -> &LessEq + case 4257: state = 4258; break; // &LessFullE -> &LessFullEq + case 4289: state = 4290; break; // &LessSlantE -> &LessSlantEq + case 4412: state = 4414; break; // &lne -> &lneq + case 4414: state = 4416; break; // &lneq -> &lneqq + case 4652: state = 4676; break; // &ls -> &lsq + case 4653: state = 4654; break; // &lsa -> &lsaq + case 4698: state = 4725; break; // < -> <q + case 4760: state = 4761; break; // &lvertne -> &lvertneq + case 4761: state = 4762; break; // &lvertneq -> &lvertneqq + case 5064: state = 5135; break; // &ne -> &neq + case 5198: state = 5200; break; // &nge -> &ngeq + case 5200: state = 5202; break; // &ngeq -> &ngeqq + case 5270: state = 5312; break; // &nle -> &nleq + case 5312: state = 5314; break; // &nleq -> &nleqq + case 5414: state = 5422; break; // &NotE -> &NotEq + case 5447: state = 5448; break; // &NotGreaterE -> &NotGreaterEq + case 5457: state = 5458; break; // &NotGreaterFullE -> &NotGreaterFullEq + case 5481: state = 5482; break; // &NotGreaterSlantE -> &NotGreaterSlantEq + case 5506: state = 5507; break; // &NotHumpE -> &NotHumpEq + case 5545: state = 5546; break; // &NotLeftTriangleE -> &NotLeftTriangleEq + case 5554: state = 5555; break; // &NotLessE -> &NotLessEq + case 5578: state = 5579; break; // &NotLessSlantE -> &NotLessSlantEq + case 5639: state = 5640; break; // &NotPrecedesE -> &NotPrecedesEq + case 5650: state = 5651; break; // &NotPrecedesSlantE -> &NotPrecedesSlantEq + case 5688: state = 5689; break; // &NotRightTriangleE -> &NotRightTriangleEq + case 5694: state = 5695; break; // &NotS -> &NotSq + case 5707: state = 5708; break; // &NotSquareSubsetE -> &NotSquareSubsetEq + case 5720: state = 5721; break; // &NotSquareSupersetE -> &NotSquareSupersetEq + case 5732: state = 5733; break; // &NotSubsetE -> &NotSubsetEq + case 5745: state = 5746; break; // &NotSucceedsE -> &NotSucceedsEq + case 5756: state = 5757; break; // &NotSucceedsSlantE -> &NotSucceedsSlantEq + case 5775: state = 5776; break; // &NotSupersetE -> &NotSupersetEq + case 5787: state = 5788; break; // &NotTildeE -> &NotTildeEq + case 5797: state = 5798; break; // &NotTildeFullE -> &NotTildeFullEq + case 5852: state = 5853; break; // &nprece -> &npreceq + case 5895: state = 5942; break; // &ns -> &nsq + case 5930: state = 5932; break; // &nsime -> &nsimeq + case 5962: state = 5963; break; // &nsubsete -> &nsubseteq + case 5963: state = 5965; break; // &nsubseteq -> &nsubseteqq + case 5970: state = 5971; break; // &nsucce -> &nsucceq + case 5983: state = 5984; break; // &nsupsete -> &nsupseteq + case 5984: state = 5986; break; // &nsupseteq -> &nsupseteqq + case 6018: state = 6019; break; // &ntrianglelefte -> &ntrianglelefteq + case 6027: state = 6028; break; // &ntrianglerighte -> &ntrianglerighteq + case 6669: state = 6670; break; // &preccurlye -> &preccurlyeq + case 6679: state = 6680; break; // &PrecedesE -> &PrecedesEq + case 6690: state = 6691; break; // &PrecedesSlantE -> &PrecedesSlantEq + case 6702: state = 6703; break; // &prece -> &preceq + case 6713: state = 6714; break; // &precne -> &precneq + case 6714: state = 6715; break; // &precneq -> &precneqq + case 6866: state = 6867; break; // &queste -> &questeq + case 6882: state = 6921; break; // &ra -> &raq + case 7053: state = 7063; break; // &rd -> &rdq + case 7102: state = 7110; break; // &ReverseE -> &ReverseEq + case 7123: state = 7124; break; // &ReverseUpE -> &ReverseUpEq + case 7326: state = 7327; break; // &rights -> &rightsq + case 7377: state = 7378; break; // &RightTriangleE -> &RightTriangleEq + case 7439: state = 7440; break; // &risingdotse -> &risingdotseq + case 7542: state = 7559; break; // &rs -> &rsq + case 7543: state = 7544; break; // &rsa -> &rsaq + case 7610: state = 7980; break; // &S -> &Sq + case 7617: state = 7968; break; // &s -> &sq + case 7624: state = 7625; break; // &sb -> &sbq + case 7853: state = 7855; break; // &sime -> &simeq + case 7994: state = 7995; break; // &sqsubsete -> &sqsubseteq + case 8005: state = 8006; break; // &sqsupsete -> &sqsupseteq + case 8039: state = 8040; break; // &SquareSubsetE -> &SquareSubsetEq + case 8052: state = 8053; break; // &SquareSupersetE -> &SquareSupersetEq + case 8173: state = 8174; break; // &subsete -> &subseteq + case 8174: state = 8176; break; // &subseteq -> &subseteqq + case 8178: state = 8179; break; // &SubsetE -> &SubsetEq + case 8185: state = 8186; break; // &subsetne -> &subsetneq + case 8186: state = 8188; break; // &subsetneq -> &subsetneqq + case 8213: state = 8214; break; // &succcurlye -> &succcurlyeq + case 8223: state = 8224; break; // &SucceedsE -> &SucceedsEq + case 8234: state = 8235; break; // &SucceedsSlantE -> &SucceedsSlantEq + case 8246: state = 8247; break; // &succe -> &succeq + case 8257: state = 8258; break; // &succne -> &succneq + case 8258: state = 8259; break; // &succneq -> &succneqq + case 8314: state = 8315; break; // &SupersetE -> &SupersetEq + case 8356: state = 8357; break; // &supsete -> &supseteq + case 8357: state = 8359; break; // &supseteq -> &supseteqq + case 8362: state = 8363; break; // &supsetne -> &supsetneq + case 8363: state = 8365; break; // &supsetneq -> &supsetneqq + case 8554: state = 8555; break; // &TildeE -> &TildeEq + case 8564: state = 8565; break; // &TildeFullE -> &TildeFullEq + case 8638: state = 8653; break; // &triangle -> &triangleq + case 8650: state = 8651; break; // &trianglelefte -> &trianglelefteq + case 8661: state = 8662; break; // &trianglerighte -> &trianglerighteq + case 9034: state = 9035; break; // &UpE -> &UpEq + case 9264: state = 9265; break; // &varsubsetne -> &varsubsetneq + case 9265: state = 9267; break; // &varsubsetneq -> &varsubsetneqq + case 9274: state = 9275; break; // &varsupsetne -> &varsupsetneq + case 9275: state = 9277; break; // &varsupsetneq -> &varsupsetneqq + case 9352: state = 9353; break; // &veee -> &veeeq + case 9508: state = 9510; break; // &wedge -> &wedgeq + case 9636: state = 9640; break; // &xs -> &xsq default: return false; } break; case 'r': switch (state) { - case 0: state = 5397; break; // & -> &r - case 1: state = 172; break; // &A -> &Ar - case 7: state = 176; break; // &a -> &ar - case 13: state = 14; break; // &Ab -> &Abr - case 18: state = 19; break; // &ab -> &abr - case 27: state = 28; break; // &Aci -> &Acir - case 30: state = 31; break; // &aci -> &acir - case 46: state = 49; break; // &af -> &afr - case 47: state = 48; break; // &Af -> &Afr - case 50: state = 51; break; // &Ag -> &Agr - case 55: state = 56; break; // &ag -> &agr - case 77: state = 78; break; // &Amac -> &Amacr - case 81: state = 82; break; // &amac -> &amacr - case 102: state = 118; break; // &ang -> &angr - case 128: state = 129; break; // &angza -> &angzar - case 129: state = 130; break; // &angzar -> &angzarr - case 146: state = 147; break; // &apaci -> &apacir - case 166: state = 167; break; // &app -> &appr - case 181: state = 182; break; // &Asc -> &Ascr - case 184: state = 185; break; // &asc -> &ascr - case 222: state = 541; break; // &b -> &br - case 223: state = 258; break; // &ba -> &bar - case 237: state = 238; break; // &backp -> &backpr - case 247: state = 537; break; // &B -> &Br - case 248: state = 256; break; // &Ba -> &Bar - case 270: state = 271; break; // &bb -> &bbr - case 274: state = 275; break; // &bbrktb -> &bbrktbr - case 288: state = 308; break; // &be -> &ber - case 293: state = 312; break; // &Be -> &Ber - case 329: state = 330; break; // &Bf -> &Bfr - case 331: state = 332; break; // &bf -> &bfr - case 338: state = 339; break; // &bigci -> &bigcir - case 362: state = 363; break; // &bigsta -> &bigstar - case 364: state = 365; break; // &bigt -> &bigtr - case 392: state = 393; break; // &bka -> &bkar - case 410: state = 411; break; // &blacksqua -> &blacksquar - case 413: state = 414; break; // &blackt -> &blacktr - case 420: state = 429; break; // &blacktriangle -> &blacktriangler - case 474: state = 481; break; // &boxD -> &boxDr - case 477: state = 483; break; // &boxd -> &boxdr - case 508: state = 515; break; // &boxU -> &boxUr - case 511: state = 517; break; // &boxu -> &boxur - case 518: state = 529; break; // &boxV -> &boxVr - case 519: state = 531; break; // &boxv -> &boxvr - case 532: state = 533; break; // &bp -> &bpr - case 547: state = 548; break; // &brvba -> ¦ - case 550: state = 551; break; // &Bsc -> &Bscr - case 553: state = 554; break; // &bsc -> &bscr - case 583: state = 965; break; // &C -> &Cr - case 589: state = 961; break; // &c -> &cr - case 590: state = 631; break; // &ca -> &car - case 600: state = 601; break; // &capb -> &capbr - case 621: state = 622; break; // &CapitalDiffe -> &CapitalDiffer - case 642: state = 650; break; // &cca -> &ccar - case 646: state = 647; break; // &Cca -> &Ccar - case 661: state = 662; break; // &Cci -> &Ccir - case 664: state = 665; break; // &cci -> &ccir - case 702: state = 703; break; // &Cente -> &Center - case 707: state = 708; break; // ¢e -> ¢er - case 712: state = 713; break; // &Cf -> &Cfr - case 714: state = 715; break; // &cf -> &cfr - case 726: state = 727; break; // &checkma -> &checkmar - case 732: state = 733; break; // &ci -> &cir - case 739: state = 740; break; // &circlea -> &circlear - case 740: state = 741; break; // &circlear -> &circlearr - case 743: state = 748; break; // &circlearrow -> &circlearrowr - case 758: state = 759; break; // &circledci -> &circledcir - case 765: state = 766; break; // &Ci -> &Cir - case 801: state = 802; break; // &cirsci -> &cirscir - case 816: state = 817; break; // &ClockwiseContou -> &ClockwiseContour - case 822: state = 823; break; // &ClockwiseContourInteg -> &ClockwiseContourIntegr - case 829: state = 830; break; // &CloseCu -> &CloseCur - case 889: state = 890; break; // &Cong -> &Congr - case 903: state = 904; break; // &Contou -> &Contour - case 909: state = 910; break; // &ContourInteg -> &ContourIntegr - case 913: state = 920; break; // &Cop -> &Copr - case 915: state = 917; break; // &cop -> &copr - case 930: state = 931; break; // ©s -> ©sr - case 935: state = 936; break; // &Counte -> &Counter - case 951: state = 952; break; // &CounterClockwiseContou -> &CounterClockwiseContour - case 957: state = 958; break; // &CounterClockwiseContourInteg -> &CounterClockwiseContourIntegr - case 962: state = 963; break; // &cra -> &crar - case 963: state = 964; break; // &crar -> &crarr - case 973: state = 974; break; // &Csc -> &Cscr - case 976: state = 977; break; // &csc -> &cscr - case 987: state = 1026; break; // &cu -> &cur - case 989: state = 990; break; // &cuda -> &cudar - case 990: state = 991; break; // &cudar -> &cudarr - case 991: state = 993; break; // &cudarr -> &cudarrr - case 995: state = 996; break; // &cuep -> &cuepr - case 1000: state = 1001; break; // &cula -> &cular - case 1001: state = 1002; break; // &cular -> &cularr - case 1007: state = 1008; break; // &cupb -> &cupbr - case 1023: state = 1024; break; // &cupo -> &cupor - case 1026: state = 1051; break; // &cur -> &curr - case 1027: state = 1028; break; // &cura -> &curar - case 1028: state = 1029; break; // &curar -> &curarr - case 1035: state = 1036; break; // &curlyeqp -> &curlyeqpr - case 1056: state = 1057; break; // &curvea -> &curvear - case 1057: state = 1058; break; // &curvear -> &curvearr - case 1060: state = 1065; break; // &curvearrow -> &curvearrowr - case 1092: state = 1107; break; // &Da -> &Dar - case 1095: state = 1096; break; // &Dagge -> &Dagger - case 1097: state = 1590; break; // &d -> &dr - case 1098: state = 1112; break; // &da -> &dar - case 1101: state = 1102; break; // &dagge -> &dagger - case 1107: state = 1108; break; // &Dar -> &Darr - case 1109: state = 1110; break; // &dA -> &dAr - case 1110: state = 1111; break; // &dAr -> &dArr - case 1112: state = 1113; break; // &dar -> &darr - case 1122: state = 1123; break; // &dbka -> &dbkar - case 1130: state = 1131; break; // &Dca -> &Dcar - case 1135: state = 1136; break; // &dca -> &dcar - case 1143: state = 1148; break; // &dda -> &ddar - case 1146: state = 1147; break; // &ddagge -> &ddagger - case 1148: state = 1149; break; // &ddar -> &ddarr - case 1151: state = 1152; break; // &DDot -> &DDotr - case 1175: state = 1182; break; // &df -> &dfr - case 1180: state = 1181; break; // &Df -> &Dfr - case 1184: state = 1185; break; // &dHa -> &dHar - case 1187: state = 1188; break; // &dha -> &dhar - case 1188: state = 1190; break; // &dhar -> &dharr - case 1193: state = 1194; break; // &Diac -> &Diacr - case 1218: state = 1219; break; // &DiacriticalG -> &DiacriticalGr - case 1246: state = 1247; break; // &Diffe -> &Differ - case 1284: state = 1288; break; // &dlc -> &dlcr - case 1285: state = 1286; break; // &dlco -> &dlcor - case 1294: state = 1295; break; // &dolla -> &dollar - case 1328: state = 1329; break; // &dotsqua -> &dotsquar - case 1336: state = 1337; break; // &doubleba -> &doublebar - case 1352: state = 1353; break; // &DoubleContou -> &DoubleContour - case 1358: state = 1359; break; // &DoubleContourInteg -> &DoubleContourIntegr - case 1367: state = 1368; break; // &DoubleDownA -> &DoubleDownAr - case 1368: state = 1369; break; // &DoubleDownAr -> &DoubleDownArr - case 1376: state = 1377; break; // &DoubleLeftA -> &DoubleLeftAr - case 1377: state = 1378; break; // &DoubleLeftAr -> &DoubleLeftArr - case 1386: state = 1387; break; // &DoubleLeftRightA -> &DoubleLeftRightAr - case 1387: state = 1388; break; // &DoubleLeftRightAr -> &DoubleLeftRightArr - case 1401: state = 1402; break; // &DoubleLongLeftA -> &DoubleLongLeftAr - case 1402: state = 1403; break; // &DoubleLongLeftAr -> &DoubleLongLeftArr - case 1411: state = 1412; break; // &DoubleLongLeftRightA -> &DoubleLongLeftRightAr - case 1412: state = 1413; break; // &DoubleLongLeftRightAr -> &DoubleLongLeftRightArr - case 1421: state = 1422; break; // &DoubleLongRightA -> &DoubleLongRightAr - case 1422: state = 1423; break; // &DoubleLongRightAr -> &DoubleLongRightArr - case 1431: state = 1432; break; // &DoubleRightA -> &DoubleRightAr - case 1432: state = 1433; break; // &DoubleRightAr -> &DoubleRightArr - case 1441: state = 1442; break; // &DoubleUpA -> &DoubleUpAr - case 1442: state = 1443; break; // &DoubleUpAr -> &DoubleUpArr - case 1450: state = 1451; break; // &DoubleUpDownA -> &DoubleUpDownAr - case 1451: state = 1452; break; // &DoubleUpDownAr -> &DoubleUpDownArr - case 1456: state = 1457; break; // &DoubleVe -> &DoubleVer - case 1464: state = 1465; break; // &DoubleVerticalBa -> &DoubleVerticalBar - case 1468: state = 1469; break; // &DownA -> &DownAr - case 1469: state = 1470; break; // &DownAr -> &DownArr - case 1473: state = 1474; break; // &Downa -> &Downar - case 1474: state = 1475; break; // &Downar -> &Downarr - case 1480: state = 1481; break; // &downa -> &downar - case 1481: state = 1482; break; // &downar -> &downarr - case 1486: state = 1487; break; // &DownArrowBa -> &DownArrowBar - case 1490: state = 1491; break; // &DownArrowUpA -> &DownArrowUpAr - case 1491: state = 1492; break; // &DownArrowUpAr -> &DownArrowUpArr - case 1495: state = 1496; break; // &DownB -> &DownBr - case 1504: state = 1505; break; // &downdowna -> &downdownar - case 1505: state = 1506; break; // &downdownar -> &downdownarr - case 1511: state = 1512; break; // &downha -> &downhar - case 1516: state = 1521; break; // &downharpoon -> &downharpoonr - case 1539: state = 1540; break; // &DownLeftRightVecto -> &DownLeftRightVector - case 1548: state = 1549; break; // &DownLeftTeeVecto -> &DownLeftTeeVector - case 1554: state = 1555; break; // &DownLeftVecto -> &DownLeftVector - case 1557: state = 1558; break; // &DownLeftVectorBa -> &DownLeftVectorBar - case 1571: state = 1572; break; // &DownRightTeeVecto -> &DownRightTeeVector - case 1577: state = 1578; break; // &DownRightVecto -> &DownRightVector - case 1580: state = 1581; break; // &DownRightVectorBa -> &DownRightVectorBar - case 1585: state = 1586; break; // &DownTeeA -> &DownTeeAr - case 1586: state = 1587; break; // &DownTeeAr -> &DownTeeArr - case 1593: state = 1594; break; // &drbka -> &drbkar - case 1597: state = 1601; break; // &drc -> &drcr - case 1598: state = 1599; break; // &drco -> &drcor - case 1605: state = 1606; break; // &Dsc -> &Dscr - case 1608: state = 1609; break; // &dsc -> &dscr - case 1616: state = 1617; break; // &Dst -> &Dstr - case 1620: state = 1621; break; // &dst -> &dstr - case 1624: state = 1628; break; // &dt -> &dtr - case 1632: state = 1633; break; // &dua -> &duar - case 1633: state = 1634; break; // &duar -> &duarr - case 1636: state = 1637; break; // &duha -> &duhar - case 1651: state = 1652; break; // &dzig -> &dzigr - case 1653: state = 1654; break; // &dzigra -> &dzigrar - case 1654: state = 1655; break; // &dzigrar -> &dzigrarr - case 1662: state = 1890; break; // &e -> &er - case 1670: state = 1671; break; // &easte -> &easter - case 1673: state = 1674; break; // &Eca -> &Ecar - case 1678: state = 1679; break; // &eca -> &ecar - case 1682: state = 1683; break; // &eci -> &ecir - case 1684: state = 1685; break; // &Eci -> &Ecir - case 1707: state = 1713; break; // &ef -> &efr - case 1711: state = 1712; break; // &Ef -> &Efr - case 1714: state = 1720; break; // &eg -> &egr - case 1715: state = 1716; break; // &Eg -> &Egr - case 1738: state = 1739; break; // &elinte -> &elinter - case 1748: state = 1749; break; // &Emac -> &Emacr - case 1752: state = 1753; break; // &emac -> &emacr - case 1771: state = 1772; break; // &EmptySmallSqua -> &EmptySmallSquar - case 1776: state = 1777; break; // &EmptyVe -> &EmptyVer - case 1787: state = 1788; break; // &EmptyVerySmallSqua -> &EmptyVerySmallSquar - case 1814: state = 1815; break; // &epa -> &epar - case 1835: state = 1836; break; // &eqci -> &eqcir - case 1850: state = 1851; break; // &eqslantgt -> &eqslantgtr - case 1875: state = 1876; break; // &Equilib -> &Equilibr - case 1886: state = 1887; break; // &eqvpa -> &eqvpar - case 1891: state = 1892; break; // &era -> &erar - case 1892: state = 1893; break; // &erar -> &erarr - case 1898: state = 1899; break; // &Esc -> &Escr - case 1901: state = 1902; break; // &esc -> &escr - case 1920: state = 1923; break; // &eu -> &eur - case 1964: state = 2083; break; // &f -> &fr - case 1987: state = 2000; break; // &ff -> &ffr - case 1998: state = 1999; break; // &Ff -> &Ffr - case 2018: state = 2019; break; // &FilledSmallSqua -> &FilledSmallSquar - case 2022: state = 2023; break; // &FilledVe -> &FilledVer - case 2033: state = 2034; break; // &FilledVerySmallSqua -> &FilledVerySmallSquar - case 2052: state = 2058; break; // &Fo -> &For - case 2055: state = 2062; break; // &fo -> &for - case 2068: state = 2069; break; // &Fou -> &Four - case 2071: state = 2072; break; // &Fourie -> &Fourier - case 2073: state = 2074; break; // &Fouriert -> &Fouriertr - case 2077: state = 2078; break; // &fpa -> &fpar - case 2113: state = 2114; break; // &Fsc -> &Fscr - case 2116: state = 2117; break; // &fsc -> &fscr - case 2118: state = 2228; break; // &g -> &gr - case 2124: state = 2232; break; // &G -> &Gr - case 2135: state = 2136; break; // &Gb -> &Gbr - case 2140: state = 2141; break; // &gb -> &gbr - case 2150: state = 2151; break; // &Gci -> &Gcir - case 2154: state = 2155; break; // &gci -> &gcir - case 2187: state = 2188; break; // &Gf -> &Gfr - case 2189: state = 2190; break; // &gf -> &gfr - case 2211: state = 2212; break; // &gnapp -> &gnappr - case 2236: state = 2237; break; // &Greate -> &Greater - case 2256: state = 2257; break; // &GreaterG -> &GreaterGr - case 2261: state = 2262; break; // &GreaterGreate -> &GreaterGreater - case 2283: state = 2284; break; // &Gsc -> &Gscr - case 2286: state = 2287; break; // &gsc -> &gscr - case 2294: state = 2311; break; // > -> >r - case 2297: state = 2298; break; // >ci -> >cir - case 2304: state = 2305; break; // >lPa -> >lPar - case 2312: state = 2318; break; // >ra -> >rar - case 2314: state = 2315; break; // >rapp -> >rappr - case 2318: state = 2319; break; // >rar -> >rarr - case 2342: state = 2343; break; // &gve -> &gver - case 2357: state = 2373; break; // &ha -> &har - case 2358: state = 2359; break; // &hai -> &hair - case 2373: state = 2380; break; // &har -> &harr - case 2377: state = 2378; break; // &hA -> &hAr - case 2378: state = 2379; break; // &hAr -> &hArr - case 2382: state = 2383; break; // &harrci -> &harrcir - case 2387: state = 2388; break; // &hba -> &hbar - case 2390: state = 2391; break; // &Hci -> &Hcir - case 2394: state = 2395; break; // &hci -> &hcir - case 2397: state = 2409; break; // &he -> &her - case 2398: state = 2399; break; // &hea -> &hear - case 2413: state = 2414; break; // &Hf -> &Hfr - case 2415: state = 2416; break; // &hf -> &hfr - case 2420: state = 2421; break; // &Hilbe -> &Hilber - case 2431: state = 2432; break; // &hksea -> &hksear - case 2436: state = 2437; break; // &hkswa -> &hkswar - case 2440: state = 2474; break; // &ho -> &hor - case 2441: state = 2442; break; // &hoa -> &hoar - case 2442: state = 2443; break; // &hoar -> &hoarr - case 2449: state = 2459; break; // &hook -> &hookr - case 2454: state = 2455; break; // &hooklefta -> &hookleftar - case 2455: state = 2456; break; // &hookleftar -> &hookleftarr - case 2464: state = 2465; break; // &hookrighta -> &hookrightar - case 2465: state = 2466; break; // &hookrightar -> &hookrightarr - case 2469: state = 2478; break; // &Ho -> &Hor - case 2476: state = 2477; break; // &horba -> &horbar - case 2491: state = 2492; break; // &Hsc -> &Hscr - case 2494: state = 2495; break; // &hsc -> &hscr - case 2500: state = 2501; break; // &Hst -> &Hstr - case 2504: state = 2505; break; // &hst -> &hstr - case 2547: state = 2548; break; // &Ici -> &Icir - case 2550: state = 2551; break; // &ici -> &icir - case 2567: state = 2571; break; // &if -> &ifr - case 2569: state = 2570; break; // &If -> &Ifr - case 2572: state = 2573; break; // &Ig -> &Igr - case 2577: state = 2578; break; // &ig -> &igr - case 2606: state = 2607; break; // &Imac -> &Imacr - case 2610: state = 2611; break; // &imac -> &imacr - case 2617: state = 2618; break; // &Imagina -> &Imaginar - case 2626: state = 2627; break; // &imagpa -> &imagpar - case 2643: state = 2644; break; // &inca -> &incar - case 2662: state = 2672; break; // &inte -> &inter - case 2664: state = 2665; break; // &intege -> &integer - case 2667: state = 2676; break; // &Inte -> &Inter - case 2668: state = 2669; break; // &Integ -> &Integr - case 2685: state = 2686; break; // &intla -> &intlar - case 2689: state = 2690; break; // &intp -> &intpr - case 2731: state = 2732; break; // &ip -> &ipr - case 2741: state = 2742; break; // &Isc -> &Iscr - case 2744: state = 2745; break; // &isc -> &iscr - case 2779: state = 2780; break; // &Jci -> &Jcir - case 2784: state = 2785; break; // &jci -> &jcir - case 2789: state = 2790; break; // &Jf -> &Jfr - case 2791: state = 2792; break; // &jf -> &jfr - case 2804: state = 2805; break; // &Jsc -> &Jscr - case 2807: state = 2808; break; // &jsc -> &jscr - case 2809: state = 2810; break; // &Jse -> &Jser - case 2813: state = 2814; break; // &jse -> &jser - case 2848: state = 2849; break; // &Kf -> &Kfr - case 2850: state = 2851; break; // &kf -> &kfr - case 2852: state = 2853; break; // &kg -> &kgr - case 2876: state = 2877; break; // &Ksc -> &Kscr - case 2879: state = 2880; break; // &ksc -> &kscr - case 2881: state = 3643; break; // &l -> &lr - case 2882: state = 2936; break; // &lA -> &lAr - case 2883: state = 2884; break; // &lAa -> &lAar - case 2884: state = 2885; break; // &lAar -> &lAarr - case 2887: state = 2934; break; // &La -> &Lar - case 2892: state = 2938; break; // &la -> &lar - case 2903: state = 2904; break; // &lag -> &lagr - case 2928: state = 2929; break; // &Laplacet -> &Laplacetr - case 2934: state = 2935; break; // &Lar -> &Larr - case 2936: state = 2937; break; // &lAr -> &lArr - case 2938: state = 2939; break; // &lar -> &larr - case 2967: state = 2968; break; // &lBa -> &lBar - case 2968: state = 2969; break; // &lBar -> &lBarr - case 2970: state = 2977; break; // &lb -> &lbr - case 2971: state = 2972; break; // &lba -> &lbar - case 2972: state = 2973; break; // &lbar -> &lbarr - case 2974: state = 2975; break; // &lbb -> &lbbr - case 2989: state = 2990; break; // &Lca -> &Lcar - case 2994: state = 2995; break; // &lca -> &lcar - case 3012: state = 3019; break; // &ld -> &ldr - case 3017: state = 3018; break; // &ldquo -> &ldquor - case 3022: state = 3023; break; // &ldrdha -> &ldrdhar - case 3027: state = 3028; break; // &ldrusha -> &ldrushar - case 3035: state = 3159; break; // &Left -> &Leftr - case 3036: state = 3048; break; // &LeftA -> &LeftAr - case 3041: state = 3042; break; // &LeftAngleB -> &LeftAngleBr - case 3048: state = 3049; break; // &LeftAr -> &LeftArr - case 3052: state = 3053; break; // &Lefta -> &Leftar - case 3053: state = 3054; break; // &Leftar -> &Leftarr - case 3058: state = 3169; break; // &left -> &leftr - case 3059: state = 3060; break; // &lefta -> &leftar - case 3060: state = 3061; break; // &leftar -> &leftarr - case 3065: state = 3066; break; // &LeftArrowBa -> &LeftArrowBar - case 3072: state = 3073; break; // &LeftArrowRightA -> &LeftArrowRightAr - case 3073: state = 3074; break; // &LeftArrowRightAr -> &LeftArrowRightArr - case 3094: state = 3095; break; // &LeftDoubleB -> &LeftDoubleBr - case 3110: state = 3111; break; // &LeftDownTeeVecto -> &LeftDownTeeVector - case 3116: state = 3117; break; // &LeftDownVecto -> &LeftDownVector - case 3119: state = 3120; break; // &LeftDownVectorBa -> &LeftDownVectorBar - case 3124: state = 3125; break; // &LeftFloo -> &LeftFloor - case 3127: state = 3128; break; // &leftha -> &lefthar - case 3143: state = 3144; break; // &leftlefta -> &leftleftar - case 3144: state = 3145; break; // &leftleftar -> &leftleftarr - case 3154: state = 3155; break; // &LeftRightA -> &LeftRightAr - case 3155: state = 3156; break; // &LeftRightAr -> &LeftRightArr - case 3164: state = 3165; break; // &Leftrighta -> &Leftrightar - case 3165: state = 3166; break; // &Leftrightar -> &Leftrightarr - case 3174: state = 3175; break; // &leftrighta -> &leftrightar - case 3175: state = 3176; break; // &leftrightar -> &leftrightarr - case 3181: state = 3182; break; // &leftrightha -> &leftrighthar - case 3193: state = 3194; break; // &leftrightsquiga -> &leftrightsquigar - case 3194: state = 3195; break; // &leftrightsquigar -> &leftrightsquigarr - case 3202: state = 3203; break; // &LeftRightVecto -> &LeftRightVector - case 3204: state = 3228; break; // &LeftT -> &LeftTr - case 3207: state = 3208; break; // &LeftTeeA -> &LeftTeeAr - case 3208: state = 3209; break; // &LeftTeeAr -> &LeftTeeArr - case 3216: state = 3217; break; // &LeftTeeVecto -> &LeftTeeVector - case 3219: state = 3220; break; // &leftth -> &leftthr - case 3236: state = 3237; break; // &LeftTriangleBa -> &LeftTriangleBar - case 3253: state = 3254; break; // &LeftUpDownVecto -> &LeftUpDownVector - case 3262: state = 3263; break; // &LeftUpTeeVecto -> &LeftUpTeeVector - case 3268: state = 3269; break; // &LeftUpVecto -> &LeftUpVector - case 3271: state = 3272; break; // &LeftUpVectorBa -> &LeftUpVectorBar - case 3277: state = 3278; break; // &LeftVecto -> &LeftVector - case 3280: state = 3281; break; // &LeftVectorBa -> &LeftVectorBar - case 3297: state = 3298; break; // &lesdoto -> &lesdotor - case 3305: state = 3306; break; // &lessapp -> &lessappr - case 3315: state = 3316; break; // &lesseqgt -> &lesseqgtr - case 3319: state = 3320; break; // &lesseqqgt -> &lesseqqgtr - case 3328: state = 3329; break; // &LessEqualG -> &LessEqualGr - case 3333: state = 3334; break; // &LessEqualGreate -> &LessEqualGreater - case 3344: state = 3345; break; // &LessG -> &LessGr - case 3349: state = 3350; break; // &LessGreate -> &LessGreater - case 3352: state = 3353; break; // &lessgt -> &lessgtr - case 3376: state = 3387; break; // &lf -> &lfr - case 3383: state = 3384; break; // &lfloo -> &lfloor - case 3385: state = 3386; break; // &Lf -> &Lfr - case 3391: state = 3392; break; // &lHa -> &lHar - case 3394: state = 3395; break; // &lha -> &lhar - case 3410: state = 3411; break; // &lla -> &llar - case 3411: state = 3412; break; // &llar -> &llarr - case 3414: state = 3415; break; // &llco -> &llcor - case 3417: state = 3418; break; // &llcorne -> &llcorner - case 3422: state = 3423; break; // &Llefta -> &Lleftar - case 3423: state = 3424; break; // &Lleftar -> &Lleftarr - case 3428: state = 3429; break; // &llha -> &llhar - case 3431: state = 3432; break; // &llt -> &lltr - case 3455: state = 3456; break; // &lnapp -> &lnappr - case 3467: state = 3470; break; // &loa -> &loar - case 3470: state = 3471; break; // &loar -> &loarr - case 3472: state = 3473; break; // &lob -> &lobr - case 3477: state = 3553; break; // &Long -> &Longr - case 3482: state = 3483; break; // &LongLeftA -> &LongLeftAr - case 3483: state = 3484; break; // &LongLeftAr -> &LongLeftArr - case 3490: state = 3517; break; // &Longleft -> &Longleftr - case 3491: state = 3492; break; // &Longlefta -> &Longleftar - case 3492: state = 3493; break; // &Longleftar -> &Longleftarr - case 3497: state = 3563; break; // &long -> &longr - case 3501: state = 3527; break; // &longleft -> &longleftr - case 3502: state = 3503; break; // &longlefta -> &longleftar - case 3503: state = 3504; break; // &longleftar -> &longleftarr - case 3512: state = 3513; break; // &LongLeftRightA -> &LongLeftRightAr - case 3513: state = 3514; break; // &LongLeftRightAr -> &LongLeftRightArr - case 3522: state = 3523; break; // &Longleftrighta -> &Longleftrightar - case 3523: state = 3524; break; // &Longleftrightar -> &Longleftrightarr - case 3532: state = 3533; break; // &longleftrighta -> &longleftrightar - case 3533: state = 3534; break; // &longleftrightar -> &longleftrightarr - case 3548: state = 3549; break; // &LongRightA -> &LongRightAr - case 3549: state = 3550; break; // &LongRightAr -> &LongRightArr - case 3558: state = 3559; break; // &Longrighta -> &Longrightar - case 3559: state = 3560; break; // &Longrightar -> &Longrightarr - case 3568: state = 3569; break; // &longrighta -> &longrightar - case 3569: state = 3570; break; // &longrightar -> &longrightarr - case 3575: state = 3576; break; // &loopa -> &loopar - case 3576: state = 3577; break; // &loopar -> &looparr - case 3579: state = 3584; break; // &looparrow -> &looparrowr - case 3590: state = 3591; break; // &lopa -> &lopar - case 3608: state = 3609; break; // &lowba -> &lowbar - case 3611: state = 3612; break; // &Lowe -> &Lower - case 3617: state = 3618; break; // &LowerLeftA -> &LowerLeftAr - case 3618: state = 3619; break; // &LowerLeftAr -> &LowerLeftArr - case 3627: state = 3628; break; // &LowerRightA -> &LowerRightAr - case 3628: state = 3629; break; // &LowerRightAr -> &LowerRightArr - case 3639: state = 3640; break; // &lpa -> &lpar - case 3644: state = 3645; break; // &lra -> &lrar - case 3645: state = 3646; break; // &lrar -> &lrarr - case 3648: state = 3649; break; // &lrco -> &lrcor - case 3651: state = 3652; break; // &lrcorne -> &lrcorner - case 3654: state = 3655; break; // &lrha -> &lrhar - case 3658: state = 3659; break; // &lrt -> &lrtr - case 3667: state = 3668; break; // &Lsc -> &Lscr - case 3669: state = 3670; break; // &lsc -> &lscr - case 3680: state = 3681; break; // &lsquo -> &lsquor - case 3682: state = 3683; break; // &Lst -> &Lstr - case 3686: state = 3687; break; // &lst -> &lstr - case 3692: state = 3717; break; // < -> <r - case 3695: state = 3696; break; // <ci -> <cir - case 3700: state = 3701; break; // <h -> <hr - case 3709: state = 3710; break; // <la -> <lar - case 3710: state = 3711; break; // <lar -> <larr - case 3722: state = 3723; break; // <rPa -> <rPar - case 3724: state = 3725; break; // &lu -> &lur - case 3729: state = 3730; break; // &lurdsha -> &lurdshar - case 3733: state = 3734; break; // &luruha -> &luruhar - case 3736: state = 3737; break; // &lve -> &lver - case 3746: state = 3772; break; // &ma -> &mar - case 3747: state = 3748; break; // &mac -> ¯ - case 3774: state = 3775; break; // &marke -> &marker - case 3795: state = 3796; break; // &measu -> &measur - case 3818: state = 3819; break; // &Mellint -> &Mellintr - case 3821: state = 3822; break; // &Mf -> &Mfr - case 3823: state = 3824; break; // &mf -> &mfr - case 3828: state = 3829; break; // &mic -> &micr - case 3836: state = 3837; break; // &midci -> &midcir - case 3858: state = 3859; break; // &mld -> &mldr - case 3877: state = 3878; break; // &Msc -> &Mscr - case 3880: state = 3881; break; // &msc -> &mscr - case 3897: state = 4621; break; // &n -> &nr - case 3920: state = 3921; break; // &napp -> &nappr - case 3925: state = 3926; break; // &natu -> &natur - case 3938: state = 3945; break; // &nca -> &ncar - case 3941: state = 3942; break; // &Nca -> &Ncar - case 3971: state = 3972; break; // &nea -> &near - case 3972: state = 3978; break; // &near -> &nearr - case 3975: state = 3976; break; // &neA -> &neAr - case 3976: state = 3977; break; // &neAr -> &neArr - case 4019: state = 4020; break; // &NegativeVe -> &NegativeVer - case 4037: state = 4038; break; // &nesea -> &nesear - case 4045: state = 4046; break; // &NestedG -> &NestedGr - case 4050: state = 4051; break; // &NestedGreate -> &NestedGreater - case 4052: state = 4053; break; // &NestedGreaterG -> &NestedGreaterGr - case 4057: state = 4058; break; // &NestedGreaterGreate -> &NestedGreaterGreater - case 4077: state = 4078; break; // &Nf -> &Nfr - case 4079: state = 4080; break; // &nf -> &nfr - case 4098: state = 4099; break; // &ngt -> &ngtr - case 4102: state = 4103; break; // &nhA -> &nhAr - case 4103: state = 4104; break; // &nhAr -> &nhArr - case 4105: state = 4106; break; // &nha -> &nhar - case 4106: state = 4107; break; // &nhar -> &nharr - case 4109: state = 4110; break; // &nhpa -> &nhpar - case 4122: state = 4123; break; // &nlA -> &nlAr - case 4123: state = 4124; break; // &nlAr -> &nlArr - case 4125: state = 4126; break; // &nla -> &nlar - case 4126: state = 4127; break; // &nlar -> &nlarr - case 4128: state = 4129; break; // &nld -> &nldr - case 4135: state = 4148; break; // &nLeft -> &nLeftr - case 4136: state = 4137; break; // &nLefta -> &nLeftar - case 4137: state = 4138; break; // &nLeftar -> &nLeftarr - case 4142: state = 4158; break; // &nleft -> &nleftr - case 4143: state = 4144; break; // &nlefta -> &nleftar - case 4144: state = 4145; break; // &nleftar -> &nleftarr - case 4153: state = 4154; break; // &nLeftrighta -> &nLeftrightar - case 4154: state = 4155; break; // &nLeftrightar -> &nLeftrightarr - case 4163: state = 4164; break; // &nleftrighta -> &nleftrightar - case 4164: state = 4165; break; // &nleftrightar -> &nleftrightarr - case 4182: state = 4183; break; // &nlt -> &nltr - case 4191: state = 4192; break; // &NoB -> &NoBr - case 4197: state = 4198; break; // &NonB -> &NonBr - case 4220: state = 4221; break; // &NotCong -> &NotCongr - case 4238: state = 4239; break; // &NotDoubleVe -> &NotDoubleVer - case 4246: state = 4247; break; // &NotDoubleVerticalBa -> &NotDoubleVerticalBar - case 4269: state = 4270; break; // &NotG -> &NotGr - case 4274: state = 4275; break; // &NotGreate -> &NotGreater - case 4290: state = 4291; break; // &NotGreaterG -> &NotGreaterGr - case 4295: state = 4296; break; // &NotGreaterGreate -> &NotGreaterGreater - case 4347: state = 4348; break; // &NotLeftT -> &NotLeftTr - case 4356: state = 4357; break; // &NotLeftTriangleBa -> &NotLeftTriangleBar - case 4370: state = 4371; break; // &NotLessG -> &NotLessGr - case 4375: state = 4376; break; // &NotLessGreate -> &NotLessGreater - case 4402: state = 4403; break; // &NotNestedG -> &NotNestedGr - case 4407: state = 4408; break; // &NotNestedGreate -> &NotNestedGreater - case 4409: state = 4410; break; // &NotNestedGreaterG -> &NotNestedGreaterGr - case 4414: state = 4415; break; // &NotNestedGreaterGreate -> &NotNestedGreaterGreater - case 4430: state = 4431; break; // &NotP -> &NotPr - case 4456: state = 4457; break; // &NotReve -> &NotRever - case 4471: state = 4472; break; // &NotRightT -> &NotRightTr - case 4480: state = 4481; break; // &NotRightTriangleBa -> &NotRightTriangleBar - case 4490: state = 4491; break; // &NotSqua -> &NotSquar - case 4505: state = 4506; break; // &NotSquareSupe -> &NotSquareSuper - case 4552: state = 4553; break; // &NotSupe -> &NotSuper - case 4587: state = 4588; break; // &NotVe -> &NotVer - case 4595: state = 4596; break; // &NotVerticalBa -> &NotVerticalBar - case 4597: state = 4613; break; // &np -> &npr - case 4598: state = 4599; break; // &npa -> &npar - case 4622: state = 4623; break; // &nrA -> &nrAr - case 4623: state = 4624; break; // &nrAr -> &nrArr - case 4625: state = 4626; break; // &nra -> &nrar - case 4626: state = 4627; break; // &nrar -> &nrarr - case 4635: state = 4636; break; // &nRighta -> &nRightar - case 4636: state = 4637; break; // &nRightar -> &nRightarr - case 4644: state = 4645; break; // &nrighta -> &nrightar - case 4645: state = 4646; break; // &nrightar -> &nrightarr - case 4649: state = 4650; break; // &nrt -> &nrtr - case 4654: state = 4662; break; // &nsc -> &nscr - case 4660: state = 4661; break; // &Nsc -> &Nscr - case 4664: state = 4665; break; // &nsho -> &nshor - case 4671: state = 4672; break; // &nshortpa -> &nshortpar - case 4686: state = 4687; break; // &nspa -> &nspar - case 4718: state = 4732; break; // &nt -> &ntr - case 4738: state = 4745; break; // &ntriangle -> &ntriangler - case 4755: state = 4756; break; // &nume -> &numer - case 4760: state = 4801; break; // &nv -> &nvr - case 4784: state = 4785; break; // &nvHa -> &nvHar - case 4785: state = 4786; break; // &nvHar -> &nvHarr - case 4793: state = 4794; break; // &nvlA -> &nvlAr - case 4794: state = 4795; break; // &nvlAr -> &nvlArr - case 4797: state = 4798; break; // &nvlt -> &nvltr - case 4802: state = 4803; break; // &nvrA -> &nvrAr - case 4803: state = 4804; break; // &nvrAr -> &nvrArr - case 4805: state = 4806; break; // &nvrt -> &nvrtr - case 4813: state = 4814; break; // &nwa -> &nwar - case 4814: state = 4820; break; // &nwar -> &nwarr - case 4817: state = 4818; break; // &nwA -> &nwAr - case 4818: state = 4819; break; // &nwAr -> &nwArr - case 4825: state = 4826; break; // &nwnea -> &nwnear - case 4827: state = 4990; break; // &O -> &Or - case 4833: state = 4991; break; // &o -> &or - case 4842: state = 4843; break; // &oci -> &ocir - case 4845: state = 4846; break; // &Oci -> &Ocir - case 4880: state = 4886; break; // &of -> &ofr - case 4882: state = 4883; break; // &ofci -> &ofcir - case 4884: state = 4885; break; // &Of -> &Ofr - case 4887: state = 4895; break; // &og -> &ogr - case 4890: state = 4891; break; // &Og -> &Ogr - case 4902: state = 4903; break; // &ohba -> &ohbar - case 4909: state = 4910; break; // &ola -> &olar - case 4910: state = 4911; break; // &olar -> &olarr - case 4912: state = 4915; break; // &olc -> &olcr - case 4913: state = 4914; break; // &olci -> &olcir - case 4925: state = 4926; break; // &Omac -> &Omacr - case 4929: state = 4930; break; // &omac -> &omacr - case 4938: state = 4939; break; // &Omic -> &Omicr - case 4943: state = 4944; break; // &omic -> &omicr - case 4958: state = 4959; break; // &opa -> &opar - case 4964: state = 4965; break; // &OpenCu -> &OpenCur - case 4984: state = 4985; break; // &ope -> &oper - case 4992: state = 4993; break; // &ora -> &orar - case 4993: state = 4994; break; // &orar -> &orarr - case 4996: state = 4997; break; // &orde -> &order - case 5006: state = 5007; break; // &oro -> &oror - case 5016: state = 5017; break; // &Osc -> &Oscr - case 5019: state = 5020; break; // &osc -> &oscr - case 5057: state = 5058; break; // &ovba -> &ovbar - case 5060: state = 5061; break; // &Ove -> &Over - case 5062: state = 5065; break; // &OverB -> &OverBr - case 5063: state = 5064; break; // &OverBa -> &OverBar - case 5073: state = 5074; break; // &OverPa -> &OverPar - case 5083: state = 5216; break; // &p -> &pr - case 5084: state = 5085; break; // &pa -> &par - case 5096: state = 5215; break; // &P -> &Pr - case 5097: state = 5098; break; // &Pa -> &Par - case 5108: state = 5109; break; // &pe -> &per - case 5124: state = 5125; break; // &Pf -> &Pfr - case 5126: state = 5127; break; // &pf -> &pfr - case 5146: state = 5147; break; // &pitchfo -> &pitchfor - case 5162: state = 5163; break; // &plusaci -> &plusacir - case 5166: state = 5167; break; // &plusci -> &pluscir - case 5193: state = 5194; break; // &Poinca -> &Poincar - case 5227: state = 5228; break; // &precapp -> &precappr - case 5232: state = 5233; break; // &preccu -> &preccur - case 5269: state = 5270; break; // &precnapp -> &precnappr - case 5306: state = 5307; break; // &profala -> &profalar - case 5313: state = 5314; break; // &profsu -> &profsur - case 5318: state = 5319; break; // &Propo -> &Propor - case 5331: state = 5332; break; // &pru -> &prur - case 5336: state = 5337; break; // &Psc -> &Pscr - case 5339: state = 5340; break; // &psc -> &pscr - case 5349: state = 5350; break; // &Qf -> &Qfr - case 5352: state = 5353; break; // &qf -> &qfr - case 5363: state = 5364; break; // &qp -> &qpr - case 5369: state = 5370; break; // &Qsc -> &Qscr - case 5372: state = 5373; break; // &qsc -> &qscr - case 5377: state = 5378; break; // &quate -> &quater - case 5397: state = 5920; break; // &r -> &rr - case 5398: state = 5436; break; // &rA -> &rAr - case 5399: state = 5400; break; // &rAa -> &rAar - case 5400: state = 5401; break; // &rAar -> &rAarr - case 5402: state = 5438; break; // &ra -> &rar - case 5405: state = 5924; break; // &R -> &Rr - case 5406: state = 5434; break; // &Ra -> &Rar - case 5434: state = 5435; break; // &Rar -> &Rarr - case 5436: state = 5437; break; // &rAr -> &rArr - case 5438: state = 5439; break; // &rar -> &rarr - case 5477: state = 5478; break; // &RBa -> &RBar - case 5478: state = 5479; break; // &RBar -> &RBarr - case 5481: state = 5482; break; // &rBa -> &rBar - case 5482: state = 5483; break; // &rBar -> &rBarr - case 5484: state = 5491; break; // &rb -> &rbr - case 5485: state = 5486; break; // &rba -> &rbar - case 5486: state = 5487; break; // &rbar -> &rbarr - case 5488: state = 5489; break; // &rbb -> &rbbr - case 5503: state = 5504; break; // &Rca -> &Rcar - case 5508: state = 5509; break; // &rca -> &rcar - case 5532: state = 5533; break; // &rdldha -> &rdldhar - case 5536: state = 5537; break; // &rdquo -> &rdquor - case 5548: state = 5549; break; // &realpa -> &realpar - case 5558: state = 5559; break; // &Reve -> &Rever - case 5574: state = 5575; break; // &ReverseEquilib -> &ReverseEquilibr - case 5587: state = 5588; break; // &ReverseUpEquilib -> &ReverseUpEquilibr - case 5592: state = 5603; break; // &rf -> &rfr - case 5599: state = 5600; break; // &rfloo -> &rfloor - case 5601: state = 5602; break; // &Rf -> &Rfr - case 5605: state = 5606; break; // &rHa -> &rHar - case 5608: state = 5609; break; // &rha -> &rhar - case 5621: state = 5633; break; // &RightA -> &RightAr - case 5626: state = 5627; break; // &RightAngleB -> &RightAngleBr - case 5633: state = 5634; break; // &RightAr -> &RightArr - case 5637: state = 5638; break; // &Righta -> &Rightar - case 5638: state = 5639; break; // &Rightar -> &Rightarr - case 5645: state = 5743; break; // &right -> &rightr - case 5646: state = 5647; break; // &righta -> &rightar - case 5647: state = 5648; break; // &rightar -> &rightarr - case 5652: state = 5653; break; // &RightArrowBa -> &RightArrowBar - case 5658: state = 5659; break; // &RightArrowLeftA -> &RightArrowLeftAr - case 5659: state = 5660; break; // &RightArrowLeftAr -> &RightArrowLeftArr - case 5680: state = 5681; break; // &RightDoubleB -> &RightDoubleBr - case 5696: state = 5697; break; // &RightDownTeeVecto -> &RightDownTeeVector - case 5702: state = 5703; break; // &RightDownVecto -> &RightDownVector - case 5705: state = 5706; break; // &RightDownVectorBa -> &RightDownVectorBar - case 5710: state = 5711; break; // &RightFloo -> &RightFloor - case 5713: state = 5714; break; // &rightha -> &righthar - case 5729: state = 5730; break; // &rightlefta -> &rightleftar - case 5730: state = 5731; break; // &rightleftar -> &rightleftarr - case 5736: state = 5737; break; // &rightleftha -> &rightlefthar - case 5748: state = 5749; break; // &rightrighta -> &rightrightar - case 5749: state = 5750; break; // &rightrightar -> &rightrightarr - case 5759: state = 5760; break; // &rightsquiga -> &rightsquigar - case 5760: state = 5761; break; // &rightsquigar -> &rightsquigarr - case 5764: state = 5788; break; // &RightT -> &RightTr - case 5767: state = 5768; break; // &RightTeeA -> &RightTeeAr - case 5768: state = 5769; break; // &RightTeeAr -> &RightTeeArr - case 5776: state = 5777; break; // &RightTeeVecto -> &RightTeeVector - case 5779: state = 5780; break; // &rightth -> &rightthr - case 5796: state = 5797; break; // &RightTriangleBa -> &RightTriangleBar - case 5813: state = 5814; break; // &RightUpDownVecto -> &RightUpDownVector - case 5822: state = 5823; break; // &RightUpTeeVecto -> &RightUpTeeVector - case 5828: state = 5829; break; // &RightUpVecto -> &RightUpVector - case 5831: state = 5832; break; // &RightUpVectorBa -> &RightUpVectorBar - case 5837: state = 5838; break; // &RightVecto -> &RightVector - case 5840: state = 5841; break; // &RightVectorBa -> &RightVectorBar - case 5855: state = 5856; break; // &rla -> &rlar - case 5856: state = 5857; break; // &rlar -> &rlarr - case 5859: state = 5860; break; // &rlha -> &rlhar - case 5876: state = 5879; break; // &roa -> &roar - case 5879: state = 5880; break; // &roar -> &roarr - case 5881: state = 5882; break; // &rob -> &robr - case 5885: state = 5886; break; // &ropa -> &ropar - case 5910: state = 5911; break; // &rpa -> &rpar - case 5921: state = 5922; break; // &rra -> &rrar - case 5922: state = 5923; break; // &rrar -> &rrarr - case 5929: state = 5930; break; // &Rrighta -> &Rrightar - case 5930: state = 5931; break; // &Rrightar -> &Rrightarr - case 5940: state = 5941; break; // &Rsc -> &Rscr - case 5942: state = 5943; break; // &rsc -> &rscr - case 5949: state = 5950; break; // &rsquo -> &rsquor - case 5951: state = 5960; break; // &rt -> &rtr - case 5952: state = 5953; break; // &rth -> &rthr - case 5965: state = 5966; break; // &rtrilt -> &rtriltr - case 5982: state = 5983; break; // &ruluha -> &ruluhar - case 5991: state = 6334; break; // &s -> &sr - case 6003: state = 6009; break; // &sca -> &scar - case 6005: state = 6006; break; // &Sca -> &Scar - case 6024: state = 6025; break; // &Sci -> &Scir - case 6027: state = 6028; break; // &sci -> &scir - case 6054: state = 6055; break; // &sea -> &sear - case 6055: state = 6061; break; // &sear -> &searr - case 6058: state = 6059; break; // &seA -> &seAr - case 6059: state = 6060; break; // &seAr -> &seArr - case 6070: state = 6071; break; // &seswa -> &seswar - case 6081: state = 6082; break; // &Sf -> &Sfr - case 6083: state = 6084; break; // &sf -> &sfr - case 6089: state = 6090; break; // &sha -> &shar - case 6105: state = 6106; break; // &Sho -> &Shor - case 6112: state = 6113; break; // &ShortDownA -> &ShortDownAr - case 6113: state = 6114; break; // &ShortDownAr -> &ShortDownArr - case 6121: state = 6122; break; // &ShortLeftA -> &ShortLeftAr - case 6122: state = 6123; break; // &ShortLeftAr -> &ShortLeftArr - case 6126: state = 6127; break; // &sho -> &shor - case 6133: state = 6134; break; // &shortpa -> &shortpar - case 6145: state = 6146; break; // &ShortRightA -> &ShortRightAr - case 6146: state = 6147; break; // &ShortRightAr -> &ShortRightArr - case 6152: state = 6153; break; // &ShortUpA -> &ShortUpAr - case 6153: state = 6154; break; // &ShortUpAr -> &ShortUpArr - case 6168: state = 6184; break; // &sim -> &simr - case 6185: state = 6186; break; // &simra -> &simrar - case 6186: state = 6187; break; // &simrar -> &simrarr - case 6189: state = 6190; break; // &sla -> &slar - case 6190: state = 6191; break; // &slar -> &slarr - case 6197: state = 6198; break; // &SmallCi -> &SmallCir - case 6219: state = 6220; break; // &smepa -> &smepar - case 6242: state = 6243; break; // &solba -> &solbar - case 6250: state = 6257; break; // &spa -> &spar - case 6266: state = 6267; break; // &Sq -> &Sqr - case 6287: state = 6288; break; // &Squa -> &Squar - case 6290: state = 6291; break; // &squa -> &squar - case 6296: state = 6297; break; // &SquareInte -> &SquareInter - case 6317: state = 6318; break; // &SquareSupe -> &SquareSuper - case 6335: state = 6336; break; // &sra -> &srar - case 6336: state = 6337; break; // &srar -> &srarr - case 6339: state = 6340; break; // &Ssc -> &Sscr - case 6342: state = 6343; break; // &ssc -> &sscr - case 6353: state = 6354; break; // &ssta -> &sstar - case 6357: state = 6358; break; // &Sta -> &Star - case 6359: state = 6363; break; // &st -> &str - case 6360: state = 6361; break; // &sta -> &star - case 6384: state = 6404; break; // &sub -> &subr - case 6405: state = 6406; break; // &subra -> &subrar - case 6406: state = 6407; break; // &subrar -> &subrarr - case 6435: state = 6436; break; // &succapp -> &succappr - case 6440: state = 6441; break; // &succcu -> &succcur - case 6477: state = 6478; break; // &succnapp -> &succnappr - case 6515: state = 6516; break; // &Supe -> &Super - case 6532: state = 6533; break; // &supla -> &suplar - case 6533: state = 6534; break; // &suplar -> &suplarr - case 6565: state = 6566; break; // &swa -> &swar - case 6566: state = 6572; break; // &swar -> &swarr - case 6569: state = 6570; break; // &swA -> &swAr - case 6570: state = 6571; break; // &swAr -> &swArr - case 6577: state = 6578; break; // &swnwa -> &swnwar - case 6583: state = 6797; break; // &T -> &Tr - case 6586: state = 6760; break; // &t -> &tr - case 6587: state = 6588; break; // &ta -> &tar - case 6594: state = 6595; break; // &tb -> &tbr - case 6598: state = 6599; break; // &Tca -> &Tcar - case 6603: state = 6604; break; // &tca -> &tcar - case 6621: state = 6622; break; // &tel -> &telr - case 6625: state = 6626; break; // &Tf -> &Tfr - case 6627: state = 6628; break; // &tf -> &tfr - case 6630: state = 6631; break; // &the -> &ther - case 6635: state = 6636; break; // &The -> &Ther - case 6639: state = 6640; break; // &Therefo -> &Therefor - case 6643: state = 6644; break; // &therefo -> &therefor - case 6659: state = 6660; break; // &thickapp -> &thickappr - case 6693: state = 6694; break; // &tho -> &thor - case 6727: state = 6728; break; // ×ba -> ×bar - case 6740: state = 6741; break; // &topci -> &topcir - case 6746: state = 6747; break; // &topfo -> &topfor - case 6751: state = 6752; break; // &tp -> &tpr - case 6769: state = 6781; break; // &triangle -> &triangler - case 6822: state = 6823; break; // &Tsc -> &Tscr - case 6825: state = 6826; break; // &tsc -> &tscr - case 6837: state = 6838; break; // &Tst -> &Tstr - case 6841: state = 6842; break; // &tst -> &tstr - case 6853: state = 6863; break; // &twohead -> &twoheadr - case 6858: state = 6859; break; // &twoheadlefta -> &twoheadleftar - case 6859: state = 6860; break; // &twoheadleftar -> &twoheadleftarr - case 6868: state = 6869; break; // &twoheadrighta -> &twoheadrightar - case 6869: state = 6870; break; // &twoheadrightar -> &twoheadrightarr - case 6873: state = 7176; break; // &U -> &Ur - case 6874: state = 6885; break; // &Ua -> &Uar - case 6879: state = 7166; break; // &u -> &ur - case 6880: state = 6890; break; // &ua -> &uar - case 6885: state = 6886; break; // &Uar -> &Uarr - case 6887: state = 6888; break; // &uA -> &uAr - case 6888: state = 6889; break; // &uAr -> &uArr - case 6890: state = 6891; break; // &uar -> &uarr - case 6894: state = 6895; break; // &Uarroci -> &Uarrocir - case 6896: state = 6897; break; // &Ub -> &Ubr - case 6900: state = 6901; break; // &ub -> &ubr - case 6911: state = 6912; break; // &Uci -> &Ucir - case 6915: state = 6916; break; // &uci -> &ucir - case 6921: state = 6922; break; // &uda -> &udar - case 6922: state = 6923; break; // &udar -> &udarr - case 6934: state = 6935; break; // &udha -> &udhar - case 6936: state = 6943; break; // &uf -> &ufr - case 6941: state = 6942; break; // &Uf -> &Ufr - case 6944: state = 6945; break; // &Ug -> &Ugr - case 6949: state = 6950; break; // &ug -> &ugr - case 6955: state = 6956; break; // &uHa -> &uHar - case 6958: state = 6959; break; // &uha -> &uhar - case 6959: state = 6961; break; // &uhar -> &uharr - case 6966: state = 6972; break; // &ulc -> &ulcr - case 6967: state = 6968; break; // &ulco -> &ulcor - case 6970: state = 6971; break; // &ulcorne -> &ulcorner - case 6975: state = 6976; break; // &ult -> &ultr - case 6980: state = 6981; break; // &Umac -> &Umacr - case 6984: state = 6985; break; // &umac -> &umacr - case 6989: state = 6990; break; // &Unde -> &Under - case 6991: state = 6994; break; // &UnderB -> &UnderBr - case 6992: state = 6993; break; // &UnderBa -> &UnderBar - case 7002: state = 7003; break; // &UnderPa -> &UnderPar - case 7032: state = 7033; break; // &UpA -> &UpAr - case 7033: state = 7034; break; // &UpAr -> &UpArr - case 7037: state = 7038; break; // &Upa -> &Upar - case 7038: state = 7039; break; // &Upar -> &Uparr - case 7043: state = 7044; break; // &upa -> &upar - case 7044: state = 7045; break; // &upar -> &uparr - case 7049: state = 7050; break; // &UpArrowBa -> &UpArrowBar - case 7055: state = 7056; break; // &UpArrowDownA -> &UpArrowDownAr - case 7056: state = 7057; break; // &UpArrowDownAr -> &UpArrowDownArr - case 7064: state = 7065; break; // &UpDownA -> &UpDownAr - case 7065: state = 7066; break; // &UpDownAr -> &UpDownArr - case 7073: state = 7074; break; // &Updowna -> &Updownar - case 7074: state = 7075; break; // &Updownar -> &Updownarr - case 7082: state = 7083; break; // &updowna -> &updownar - case 7083: state = 7084; break; // &updownar -> &updownarr - case 7093: state = 7094; break; // &UpEquilib -> &UpEquilibr - case 7099: state = 7100; break; // &upha -> &uphar - case 7104: state = 7109; break; // &upharpoon -> &upharpoonr - case 7118: state = 7119; break; // &Uppe -> &Upper - case 7124: state = 7125; break; // &UpperLeftA -> &UpperLeftAr - case 7125: state = 7126; break; // &UpperLeftAr -> &UpperLeftArr - case 7134: state = 7135; break; // &UpperRightA -> &UpperRightAr - case 7135: state = 7136; break; // &UpperRightAr -> &UpperRightArr - case 7153: state = 7154; break; // &UpTeeA -> &UpTeeAr - case 7154: state = 7155; break; // &UpTeeAr -> &UpTeeArr - case 7160: state = 7161; break; // &upupa -> &upupar - case 7161: state = 7162; break; // &upupar -> &upuparr - case 7167: state = 7173; break; // &urc -> &urcr - case 7168: state = 7169; break; // &urco -> &urcor - case 7171: state = 7172; break; // &urcorne -> &urcorner - case 7183: state = 7184; break; // &urt -> &urtr - case 7187: state = 7188; break; // &Usc -> &Uscr - case 7190: state = 7191; break; // &usc -> &uscr - case 7192: state = 7205; break; // &ut -> &utr - case 7209: state = 7210; break; // &uua -> &uuar - case 7210: state = 7211; break; // &uuar -> &uuarr - case 7223: state = 7417; break; // &v -> &vr - case 7224: state = 7229; break; // &va -> &var - case 7226: state = 7227; break; // &vang -> &vangr - case 7229: state = 7261; break; // &var -> &varr - case 7249: state = 7253; break; // &varp -> &varpr - case 7258: state = 7259; break; // &vA -> &vAr - case 7259: state = 7260; break; // &vAr -> &vArr - case 7286: state = 7291; break; // &vart -> &vartr - case 7297: state = 7302; break; // &vartriangle -> &vartriangler - case 7309: state = 7310; break; // &Vba -> &Vbar - case 7312: state = 7313; break; // &vBa -> &vBar - case 7336: state = 7349; break; // &Ve -> &Ver - case 7338: state = 7353; break; // &ve -> &ver - case 7341: state = 7342; break; // &veeba -> &veebar - case 7351: state = 7352; break; // &Verba -> &Verbar - case 7355: state = 7356; break; // &verba -> &verbar - case 7364: state = 7365; break; // &VerticalBa -> &VerticalBar - case 7373: state = 7374; break; // &VerticalSepa -> &VerticalSepar - case 7377: state = 7378; break; // &VerticalSeparato -> &VerticalSeparator - case 7394: state = 7395; break; // &Vf -> &Vfr - case 7396: state = 7397; break; // &vf -> &vfr - case 7399: state = 7400; break; // &vlt -> &vltr - case 7413: state = 7414; break; // &vp -> &vpr - case 7418: state = 7419; break; // &vrt -> &vrtr - case 7422: state = 7423; break; // &Vsc -> &Vscr - case 7425: state = 7426; break; // &vsc -> &vscr - case 7449: state = 7450; break; // &Wci -> &Wcir - case 7452: state = 7484; break; // &w -> &wr - case 7454: state = 7455; break; // &wci -> &wcir - case 7460: state = 7461; break; // &wedba -> &wedbar - case 7470: state = 7471; break; // &weie -> &weier - case 7473: state = 7474; break; // &Wf -> &Wfr - case 7475: state = 7476; break; // &wf -> &wfr - case 7490: state = 7491; break; // &Wsc -> &Wscr - case 7493: state = 7494; break; // &wsc -> &wscr - case 7495: state = 7551; break; // &x -> &xr - case 7499: state = 7500; break; // &xci -> &xcir - case 7505: state = 7506; break; // &xdt -> &xdtr - case 7509: state = 7510; break; // &Xf -> &Xfr - case 7511: state = 7512; break; // &xf -> &xfr - case 7514: state = 7515; break; // &xhA -> &xhAr - case 7515: state = 7516; break; // &xhAr -> &xhArr - case 7517: state = 7518; break; // &xha -> &xhar - case 7518: state = 7519; break; // &xhar -> &xharr - case 7523: state = 7524; break; // &xlA -> &xlAr - case 7524: state = 7525; break; // &xlAr -> &xlArr - case 7526: state = 7527; break; // &xla -> &xlar - case 7527: state = 7528; break; // &xlar -> &xlarr - case 7552: state = 7553; break; // &xrA -> &xrAr - case 7553: state = 7554; break; // &xrAr -> &xrArr - case 7555: state = 7556; break; // &xra -> &xrar - case 7556: state = 7557; break; // &xrar -> &xrarr - case 7559: state = 7560; break; // &Xsc -> &Xscr - case 7562: state = 7563; break; // &xsc -> &xscr - case 7573: state = 7574; break; // &xut -> &xutr - case 7601: state = 7602; break; // &Yci -> &Ycir - case 7605: state = 7606; break; // &yci -> &ycir - case 7612: state = 7613; break; // &Yf -> &Yfr - case 7614: state = 7615; break; // &yf -> &yfr - case 7629: state = 7630; break; // &Ysc -> &Yscr - case 7632: state = 7633; break; // &ysc -> &yscr - case 7658: state = 7659; break; // &Zca -> &Zcar - case 7663: state = 7664; break; // &zca -> &zcar - case 7677: state = 7678; break; // &zeet -> &zeetr - case 7680: state = 7681; break; // &Ze -> &Zer - case 7697: state = 7698; break; // &Zf -> &Zfr - case 7699: state = 7700; break; // &zf -> &zfr - case 7708: state = 7709; break; // &zig -> &zigr - case 7710: state = 7711; break; // &zigra -> &zigrar - case 7711: state = 7712; break; // &zigrar -> &zigrarr - case 7720: state = 7721; break; // &Zsc -> &Zscr - case 7723: state = 7724; break; // &zsc -> &zscr + case 0: state = 6876; break; // & -> &r + case 1: state = 237; break; // &A -> &Ar + case 8: state = 242; break; // &a -> &ar + case 15: state = 16; break; // &Ab -> &Abr + case 21: state = 22; break; // &ab -> &abr + case 34: state = 35; break; // &Aci -> &Acir + case 38: state = 39; break; // &aci -> &acir + case 60: state = 65; break; // &af -> &afr + case 62: state = 63; break; // &Af -> &Afr + case 67: state = 68; break; // &Ag -> &Agr + case 73: state = 74; break; // &ag -> &agr + case 100: state = 101; break; // &Amac -> &Amacr + case 105: state = 106; break; // &amac -> &amacr + case 136: state = 164; break; // &ang -> &angr + case 179: state = 180; break; // &angza -> &angzar + case 180: state = 181; break; // &angzar -> &angzarr + case 203: state = 204; break; // &apaci -> &apacir + case 229: state = 230; break; // &app -> &appr + case 248: state = 249; break; // &Asc -> &Ascr + case 252: state = 253; break; // &asc -> &ascr + case 301: state = 730; break; // &b -> &br + case 302: state = 344; break; // &ba -> &bar + case 318: state = 319; break; // &backp -> &backpr + case 331: state = 725; break; // &B -> &Br + case 332: state = 341; break; // &Ba -> &Bar + case 360: state = 361; break; // &bb -> &bbr + case 365: state = 366; break; // &bbrktb -> &bbrktbr + case 384: state = 409; break; // &be -> &ber + case 390: state = 414; break; // &Be -> &Ber + case 436: state = 437; break; // &Bf -> &Bfr + case 439: state = 440; break; // &bf -> &bfr + case 448: state = 449; break; // &bigci -> &bigcir + case 478: state = 479; break; // &bigsta -> &bigstar + case 481: state = 482; break; // &bigt -> &bigtr + case 514: state = 515; break; // &bka -> &bkar + case 534: state = 535; break; // &blacksqua -> &blacksquar + case 538: state = 539; break; // &blackt -> &blacktr + case 545: state = 557; break; // &blacktriangle -> &blacktriangler + case 618: state = 630; break; // &boxD -> &boxDr + case 623: state = 634; break; // &boxd -> &boxdr + case 673: state = 685; break; // &boxU -> &boxUr + case 678: state = 689; break; // &boxu -> &boxur + case 691: state = 713; break; // &boxV -> &boxVr + case 693: state = 717; break; // &boxv -> &boxvr + case 719: state = 720; break; // &bp -> &bpr + case 737: state = 738; break; // &brvba -> ¦ + case 741: state = 742; break; // &Bsc -> &Bscr + case 745: state = 746; break; // &bsc -> &bscr + case 789: state = 1261; break; // &C -> &Cr + case 796: state = 1256; break; // &c -> &cr + case 797: state = 848; break; // &ca -> &car + case 811: state = 812; break; // &capb -> &capbr + case 836: state = 837; break; // &CapitalDiffe -> &CapitalDiffer + case 862: state = 872; break; // &cca -> &ccar + case 867: state = 868; break; // &Cca -> &Ccar + case 886: state = 887; break; // &Cci -> &Ccir + case 890: state = 891; break; // &cci -> &ccir + case 938: state = 939; break; // &Cente -> &Center + case 944: state = 945; break; // ¢e -> ¢er + case 950: state = 951; break; // &Cf -> &Cfr + case 953: state = 954; break; // &cf -> &cfr + case 969: state = 970; break; // &checkma -> &checkmar + case 978: state = 979; break; // &ci -> &cir + case 988: state = 989; break; // &circlea -> &circlear + case 989: state = 990; break; // &circlear -> &circlearr + case 992: state = 998; break; // &circlearrow -> &circlearrowr + case 1010: state = 1011; break; // &circledci -> &circledcir + case 1019: state = 1020; break; // &Ci -> &Cir + case 1065: state = 1066; break; // &cirsci -> &cirscir + case 1081: state = 1082; break; // &ClockwiseContou -> &ClockwiseContour + case 1087: state = 1088; break; // &ClockwiseContourInteg -> &ClockwiseContourIntegr + case 1095: state = 1096; break; // &CloseCu -> &CloseCur + case 1172: state = 1173; break; // &Cong -> &Congr + case 1189: state = 1190; break; // &Contou -> &Contour + case 1195: state = 1196; break; // &ContourInteg -> &ContourIntegr + case 1200: state = 1210; break; // &Cop -> &Copr + case 1203: state = 1206; break; // &cop -> &copr + case 1223: state = 1224; break; // ©s -> ©sr + case 1229: state = 1230; break; // &Counte -> &Counter + case 1245: state = 1246; break; // &CounterClockwiseContou -> &CounterClockwiseContour + case 1251: state = 1252; break; // &CounterClockwiseContourInteg -> &CounterClockwiseContourIntegr + case 1257: state = 1258; break; // &cra -> &crar + case 1258: state = 1259; break; // &crar -> &crarr + case 1271: state = 1272; break; // &Csc -> &Cscr + case 1275: state = 1276; break; // &csc -> &cscr + case 1292: state = 1346; break; // &cu -> &cur + case 1294: state = 1295; break; // &cuda -> &cudar + case 1295: state = 1296; break; // &cudar -> &cudarr + case 1296: state = 1299; break; // &cudarr -> &cudarrr + case 1302: state = 1303; break; // &cuep -> &cuepr + case 1309: state = 1310; break; // &cula -> &cular + case 1310: state = 1311; break; // &cular -> &cularr + case 1320: state = 1321; break; // &cupb -> &cupbr + case 1341: state = 1342; break; // &cupo -> &cupor + case 1346: state = 1377; break; // &cur -> &curr + case 1347: state = 1348; break; // &cura -> &curar + case 1348: state = 1349; break; // &curar -> &curarr + case 1357: state = 1358; break; // &curlyeqp -> &curlyeqpr + case 1383: state = 1384; break; // &curvea -> &curvear + case 1384: state = 1385; break; // &curvear -> &curvearr + case 1387: state = 1393; break; // &curvearrow -> &curvearrowr + case 1426: state = 1444; break; // &Da -> &Dar + case 1429: state = 1430; break; // &Dagge -> &Dagger + case 1432: state = 2023; break; // &d -> &dr + case 1433: state = 1451; break; // &da -> &dar + case 1436: state = 1437; break; // &dagge -> &dagger + case 1444: state = 1445; break; // &Dar -> &Darr + case 1447: state = 1448; break; // &dA -> &dAr + case 1448: state = 1449; break; // &dAr -> &dArr + case 1451: state = 1452; break; // &dar -> &darr + case 1465: state = 1466; break; // &dbka -> &dbkar + case 1475: state = 1476; break; // &Dca -> &Dcar + case 1481: state = 1482; break; // &dca -> &dcar + case 1494: state = 1500; break; // &dda -> &ddar + case 1497: state = 1498; break; // &ddagge -> &ddagger + case 1500: state = 1501; break; // &ddar -> &ddarr + case 1504: state = 1505; break; // &DDot -> &DDotr + case 1535: state = 1544; break; // &df -> &dfr + case 1541: state = 1542; break; // &Df -> &Dfr + case 1547: state = 1548; break; // &dHa -> &dHar + case 1551: state = 1552; break; // &dha -> &dhar + case 1552: state = 1555; break; // &dhar -> &dharr + case 1559: state = 1560; break; // &Diac -> &Diacr + case 1587: state = 1588; break; // &DiacriticalG -> &DiacriticalGr + case 1623: state = 1624; break; // &Diffe -> &Differ + case 1670: state = 1675; break; // &dlc -> &dlcr + case 1671: state = 1672; break; // &dlco -> &dlcor + case 1682: state = 1683; break; // &dolla -> &dollar + case 1727: state = 1728; break; // &dotsqua -> &dotsquar + case 1736: state = 1737; break; // &doubleba -> &doublebar + case 1753: state = 1754; break; // &DoubleContou -> &DoubleContour + case 1759: state = 1760; break; // &DoubleContourInteg -> &DoubleContourIntegr + case 1770: state = 1771; break; // &DoubleDownA -> &DoubleDownAr + case 1771: state = 1772; break; // &DoubleDownAr -> &DoubleDownArr + case 1780: state = 1781; break; // &DoubleLeftA -> &DoubleLeftAr + case 1781: state = 1782; break; // &DoubleLeftAr -> &DoubleLeftArr + case 1791: state = 1792; break; // &DoubleLeftRightA -> &DoubleLeftRightAr + case 1792: state = 1793; break; // &DoubleLeftRightAr -> &DoubleLeftRightArr + case 1808: state = 1809; break; // &DoubleLongLeftA -> &DoubleLongLeftAr + case 1809: state = 1810; break; // &DoubleLongLeftAr -> &DoubleLongLeftArr + case 1819: state = 1820; break; // &DoubleLongLeftRightA -> &DoubleLongLeftRightAr + case 1820: state = 1821; break; // &DoubleLongLeftRightAr -> &DoubleLongLeftRightArr + case 1830: state = 1831; break; // &DoubleLongRightA -> &DoubleLongRightAr + case 1831: state = 1832; break; // &DoubleLongRightAr -> &DoubleLongRightArr + case 1841: state = 1842; break; // &DoubleRightA -> &DoubleRightAr + case 1842: state = 1843; break; // &DoubleRightAr -> &DoubleRightArr + case 1853: state = 1854; break; // &DoubleUpA -> &DoubleUpAr + case 1854: state = 1855; break; // &DoubleUpAr -> &DoubleUpArr + case 1863: state = 1864; break; // &DoubleUpDownA -> &DoubleUpDownAr + case 1864: state = 1865; break; // &DoubleUpDownAr -> &DoubleUpDownArr + case 1870: state = 1871; break; // &DoubleVe -> &DoubleVer + case 1878: state = 1879; break; // &DoubleVerticalBa -> &DoubleVerticalBar + case 1883: state = 1884; break; // &DownA -> &DownAr + case 1884: state = 1885; break; // &DownAr -> &DownArr + case 1889: state = 1890; break; // &Downa -> &Downar + case 1890: state = 1891; break; // &Downar -> &Downarr + case 1897: state = 1898; break; // &downa -> &downar + case 1898: state = 1899; break; // &downar -> &downarr + case 1904: state = 1905; break; // &DownArrowBa -> &DownArrowBar + case 1909: state = 1910; break; // &DownArrowUpA -> &DownArrowUpAr + case 1910: state = 1911; break; // &DownArrowUpAr -> &DownArrowUpArr + case 1915: state = 1916; break; // &DownB -> &DownBr + case 1925: state = 1926; break; // &downdowna -> &downdownar + case 1926: state = 1927; break; // &downdownar -> &downdownarr + case 1933: state = 1934; break; // &downha -> &downhar + case 1938: state = 1944; break; // &downharpoon -> &downharpoonr + case 1963: state = 1964; break; // &DownLeftRightVecto -> &DownLeftRightVector + case 1973: state = 1974; break; // &DownLeftTeeVecto -> &DownLeftTeeVector + case 1980: state = 1981; break; // &DownLeftVecto -> &DownLeftVector + case 1984: state = 1985; break; // &DownLeftVectorBa -> &DownLeftVectorBar + case 1999: state = 2000; break; // &DownRightTeeVecto -> &DownRightTeeVector + case 2006: state = 2007; break; // &DownRightVecto -> &DownRightVector + case 2010: state = 2011; break; // &DownRightVectorBa -> &DownRightVectorBar + case 2017: state = 2018; break; // &DownTeeA -> &DownTeeAr + case 2018: state = 2019; break; // &DownTeeAr -> &DownTeeArr + case 2026: state = 2027; break; // &drbka -> &drbkar + case 2031: state = 2036; break; // &drc -> &drcr + case 2032: state = 2033; break; // &drco -> &drcor + case 2041: state = 2042; break; // &Dsc -> &Dscr + case 2045: state = 2046; break; // &dsc -> &dscr + case 2057: state = 2058; break; // &Dst -> &Dstr + case 2062: state = 2063; break; // &dst -> &dstr + case 2067: state = 2072; break; // &dt -> &dtr + case 2078: state = 2079; break; // &dua -> &duar + case 2079: state = 2080; break; // &duar -> &duarr + case 2083: state = 2084; break; // &duha -> &duhar + case 2102: state = 2103; break; // &dzig -> &dzigr + case 2104: state = 2105; break; // &dzigra -> &dzigrar + case 2105: state = 2106; break; // &dzigrar -> &dzigrarr + case 2115: state = 2409; break; // &e -> &er + case 2124: state = 2125; break; // &easte -> &easter + case 2128: state = 2129; break; // &Eca -> &Ecar + case 2134: state = 2135; break; // &eca -> &ecar + case 2139: state = 2140; break; // &eci -> &ecir + case 2142: state = 2143; break; // &Eci -> &Ecir + case 2175: state = 2183; break; // &ef -> &efr + case 2180: state = 2181; break; // &Ef -> &Efr + case 2185: state = 2193; break; // &eg -> &egr + case 2187: state = 2188; break; // &Eg -> &Egr + case 2216: state = 2217; break; // &elinte -> &elinter + case 2230: state = 2231; break; // &Emac -> &Emacr + case 2235: state = 2236; break; // &emac -> &emacr + case 2257: state = 2258; break; // &EmptySmallSqua -> &EmptySmallSquar + case 2264: state = 2265; break; // &EmptyVe -> &EmptyVer + case 2275: state = 2276; break; // &EmptyVerySmallSqua -> &EmptyVerySmallSquar + case 2313: state = 2314; break; // &epa -> &epar + case 2341: state = 2342; break; // &eqci -> &eqcir + case 2359: state = 2360; break; // &eqslantgt -> &eqslantgtr + case 2390: state = 2391; break; // &Equilib -> &Equilibr + case 2404: state = 2405; break; // &eqvpa -> &eqvpar + case 2410: state = 2411; break; // &era -> &erar + case 2411: state = 2412; break; // &erar -> &erarr + case 2419: state = 2420; break; // &Esc -> &Escr + case 2423: state = 2424; break; // &esc -> &escr + case 2451: state = 2455; break; // &eu -> &eur + case 2503: state = 2647; break; // &f -> &fr + case 2530: state = 2547; break; // &ff -> &ffr + case 2544: state = 2545; break; // &Ff -> &Ffr + case 2567: state = 2568; break; // &FilledSmallSqua -> &FilledSmallSquar + case 2572: state = 2573; break; // &FilledVe -> &FilledVer + case 2583: state = 2584; break; // &FilledVerySmallSqua -> &FilledVerySmallSquar + case 2608: state = 2616; break; // &Fo -> &For + case 2612: state = 2621; break; // &fo -> &for + case 2630: state = 2631; break; // &Fou -> &Four + case 2633: state = 2634; break; // &Fourie -> &Fourier + case 2635: state = 2636; break; // &Fouriert -> &Fouriertr + case 2640: state = 2641; break; // &fpa -> &fpar + case 2694: state = 2695; break; // &Fsc -> &Fscr + case 2698: state = 2699; break; // &fsc -> &fscr + case 2701: state = 2861; break; // &g -> &gr + case 2708: state = 2866; break; // &G -> &Gr + case 2724: state = 2725; break; // &Gb -> &Gbr + case 2730: state = 2731; break; // &gb -> &gbr + case 2742: state = 2743; break; // &Gci -> &Gcir + case 2747: state = 2748; break; // &gci -> &gcir + case 2799: state = 2800; break; // &Gf -> &Gfr + case 2802: state = 2803; break; // &gf -> &gfr + case 2836: state = 2837; break; // &gnapp -> &gnappr + case 2870: state = 2871; break; // &Greate -> &Greater + case 2893: state = 2894; break; // &GreaterG -> &GreaterGr + case 2898: state = 2899; break; // &GreaterGreate -> &GreaterGreater + case 2924: state = 2925; break; // &Gsc -> &Gscr + case 2928: state = 2929; break; // &gsc -> &gscr + case 2942: state = 2965; break; // > -> >r + case 2947: state = 2948; break; // >ci -> >cir + case 2956: state = 2957; break; // >lPa -> >lPar + case 2966: state = 2973; break; // >ra -> >rar + case 2968: state = 2969; break; // >rapp -> >rappr + case 2973: state = 2974; break; // >rar -> >rarr + case 3003: state = 3004; break; // &gve -> &gver + case 3021: state = 3041; break; // &ha -> &har + case 3022: state = 3023; break; // &hai -> &hair + case 3041: state = 3050; break; // &har -> &harr + case 3046: state = 3047; break; // &hA -> &hAr + case 3047: state = 3048; break; // &hAr -> &hArr + case 3053: state = 3054; break; // &harrci -> &harrcir + case 3061: state = 3062; break; // &hba -> &hbar + case 3065: state = 3066; break; // &Hci -> &Hcir + case 3070: state = 3071; break; // &hci -> &hcir + case 3074: state = 3089; break; // &he -> &her + case 3075: state = 3076; break; // &hea -> &hear + case 3094: state = 3095; break; // &Hf -> &Hfr + case 3097: state = 3098; break; // &hf -> &hfr + case 3103: state = 3104; break; // &Hilbe -> &Hilber + case 3115: state = 3116; break; // &hksea -> &hksear + case 3121: state = 3122; break; // &hkswa -> &hkswar + case 3126: state = 3166; break; // &ho -> &hor + case 3127: state = 3128; break; // &hoa -> &hoar + case 3128: state = 3129; break; // &hoar -> &hoarr + case 3137: state = 3148; break; // &hook -> &hookr + case 3142: state = 3143; break; // &hooklefta -> &hookleftar + case 3143: state = 3144; break; // &hookleftar -> &hookleftarr + case 3153: state = 3154; break; // &hookrighta -> &hookrightar + case 3154: state = 3155; break; // &hookrightar -> &hookrightarr + case 3159: state = 3171; break; // &Ho -> &Hor + case 3168: state = 3169; break; // &horba -> &horbar + case 3185: state = 3186; break; // &Hsc -> &Hscr + case 3189: state = 3190; break; // &hsc -> &hscr + case 3197: state = 3198; break; // &Hst -> &Hstr + case 3202: state = 3203; break; // &hst -> &hstr + case 3253: state = 3254; break; // &Ici -> &Icir + case 3257: state = 3258; break; // &ici -> &icir + case 3281: state = 3287; break; // &if -> &ifr + case 3284: state = 3285; break; // &If -> &Ifr + case 3289: state = 3290; break; // &Ig -> &Igr + case 3295: state = 3296; break; // &ig -> &igr + case 3333: state = 3334; break; // &Imac -> &Imacr + case 3338: state = 3339; break; // &imac -> &imacr + case 3347: state = 3348; break; // &Imagina -> &Imaginar + case 3358: state = 3359; break; // &imagpa -> &imagpar + case 3381: state = 3382; break; // &inca -> &incar + case 3407: state = 3419; break; // &inte -> &inter + case 3409: state = 3410; break; // &intege -> &integer + case 3413: state = 3424; break; // &Inte -> &Inter + case 3414: state = 3415; break; // &Integ -> &Integr + case 3434: state = 3435; break; // &intla -> &intlar + case 3439: state = 3440; break; // &intp -> &intpr + case 3492: state = 3493; break; // &ip -> &ipr + case 3504: state = 3505; break; // &Isc -> &Iscr + case 3508: state = 3509; break; // &isc -> &iscr + case 3557: state = 3558; break; // &Jci -> &Jcir + case 3563: state = 3564; break; // &jci -> &jcir + case 3571: state = 3572; break; // &Jf -> &Jfr + case 3574: state = 3575; break; // &jf -> &jfr + case 3591: state = 3592; break; // &Jsc -> &Jscr + case 3595: state = 3596; break; // &jsc -> &jscr + case 3598: state = 3599; break; // &Jse -> &Jser + case 3603: state = 3604; break; // &jse -> &jser + case 3648: state = 3649; break; // &Kf -> &Kfr + case 3651: state = 3652; break; // &kf -> &kfr + case 3654: state = 3655; break; // &kg -> &kgr + case 3685: state = 3686; break; // &Ksc -> &Kscr + case 3689: state = 3690; break; // &ksc -> &kscr + case 3692: state = 4628; break; // &l -> &lr + case 3693: state = 3762; break; // &lA -> &lAr + case 3694: state = 3695; break; // &lAa -> &lAar + case 3695: state = 3696; break; // &lAar -> &lAarr + case 3699: state = 3759; break; // &La -> &Lar + case 3705: state = 3765; break; // &la -> &lar + case 3718: state = 3719; break; // &lag -> &lagr + case 3751: state = 3752; break; // &Laplacet -> &Laplacetr + case 3759: state = 3760; break; // &Lar -> &Larr + case 3762: state = 3763; break; // &lAr -> &lArr + case 3765: state = 3766; break; // &lar -> &larr + case 3808: state = 3809; break; // &lBa -> &lBar + case 3809: state = 3810; break; // &lBar -> &lBarr + case 3812: state = 3821; break; // &lb -> &lbr + case 3813: state = 3814; break; // &lba -> &lbar + case 3814: state = 3815; break; // &lbar -> &lbarr + case 3817: state = 3818; break; // &lbb -> &lbbr + case 3838: state = 3839; break; // &Lca -> &Lcar + case 3844: state = 3845; break; // &lca -> &lcar + case 3869: state = 3879; break; // &ld -> &ldr + case 3875: state = 3877; break; // &ldquo -> &ldquor + case 3882: state = 3883; break; // &ldrdha -> &ldrdhar + case 3888: state = 3889; break; // &ldrusha -> &ldrushar + case 3900: state = 4041; break; // &Left -> &Leftr + case 3901: state = 3914; break; // &LeftA -> &LeftAr + case 3906: state = 3907; break; // &LeftAngleB -> &LeftAngleBr + case 3914: state = 3915; break; // &LeftAr -> &LeftArr + case 3919: state = 3920; break; // &Lefta -> &Leftar + case 3920: state = 3921; break; // &Leftar -> &Leftarr + case 3926: state = 4052; break; // &left -> &leftr + case 3927: state = 3928; break; // &lefta -> &leftar + case 3928: state = 3929; break; // &leftar -> &leftarr + case 3934: state = 3935; break; // &LeftArrowBa -> &LeftArrowBar + case 3942: state = 3943; break; // &LeftArrowRightA -> &LeftArrowRightAr + case 3943: state = 3944; break; // &LeftArrowRightAr -> &LeftArrowRightArr + case 3967: state = 3968; break; // &LeftDoubleB -> &LeftDoubleBr + case 3984: state = 3985; break; // &LeftDownTeeVecto -> &LeftDownTeeVector + case 3991: state = 3992; break; // &LeftDownVecto -> &LeftDownVector + case 3995: state = 3996; break; // &LeftDownVectorBa -> &LeftDownVectorBar + case 4001: state = 4002; break; // &LeftFloo -> &LeftFloor + case 4005: state = 4006; break; // &leftha -> &lefthar + case 4023: state = 4024; break; // &leftlefta -> &leftleftar + case 4024: state = 4025; break; // &leftleftar -> &leftleftarr + case 4035: state = 4036; break; // &LeftRightA -> &LeftRightAr + case 4036: state = 4037; break; // &LeftRightAr -> &LeftRightArr + case 4046: state = 4047; break; // &Leftrighta -> &Leftrightar + case 4047: state = 4048; break; // &Leftrightar -> &Leftrightarr + case 4057: state = 4058; break; // &leftrighta -> &leftrightar + case 4058: state = 4059; break; // &leftrightar -> &leftrightarr + case 4066: state = 4067; break; // &leftrightha -> &leftrighthar + case 4079: state = 4080; break; // &leftrightsquiga -> &leftrightsquigar + case 4080: state = 4081; break; // &leftrightsquigar -> &leftrightsquigarr + case 4089: state = 4090; break; // &LeftRightVecto -> &LeftRightVector + case 4092: state = 4120; break; // &LeftT -> &LeftTr + case 4096: state = 4097; break; // &LeftTeeA -> &LeftTeeAr + case 4097: state = 4098; break; // &LeftTeeAr -> &LeftTeeArr + case 4106: state = 4107; break; // &LeftTeeVecto -> &LeftTeeVector + case 4110: state = 4111; break; // &leftth -> &leftthr + case 4129: state = 4130; break; // &LeftTriangleBa -> &LeftTriangleBar + case 4148: state = 4149; break; // &LeftUpDownVecto -> &LeftUpDownVector + case 4158: state = 4159; break; // &LeftUpTeeVecto -> &LeftUpTeeVector + case 4165: state = 4166; break; // &LeftUpVecto -> &LeftUpVector + case 4169: state = 4170; break; // &LeftUpVectorBa -> &LeftUpVectorBar + case 4176: state = 4177; break; // &LeftVecto -> &LeftVector + case 4180: state = 4181; break; // &LeftVectorBa -> &LeftVectorBar + case 4206: state = 4208; break; // &lesdoto -> &lesdotor + case 4218: state = 4219; break; // &lessapp -> &lessappr + case 4230: state = 4231; break; // &lesseqgt -> &lesseqgtr + case 4235: state = 4236; break; // &lesseqqgt -> &lesseqqgtr + case 4245: state = 4246; break; // &LessEqualG -> &LessEqualGr + case 4250: state = 4251; break; // &LessEqualGreate -> &LessEqualGreater + case 4263: state = 4264; break; // &LessG -> &LessGr + case 4268: state = 4269; break; // &LessGreate -> &LessGreater + case 4272: state = 4273; break; // &lessgt -> &lessgtr + case 4301: state = 4315; break; // &lf -> &lfr + case 4309: state = 4310; break; // &lfloo -> &lfloor + case 4312: state = 4313; break; // &Lf -> &Lfr + case 4322: state = 4323; break; // &lHa -> &lHar + case 4326: state = 4327; break; // &lha -> &lhar + case 4350: state = 4351; break; // &lla -> &llar + case 4351: state = 4352; break; // &llar -> &llarr + case 4355: state = 4356; break; // &llco -> &llcor + case 4358: state = 4359; break; // &llcorne -> &llcorner + case 4364: state = 4365; break; // &Llefta -> &Lleftar + case 4365: state = 4366; break; // &Lleftar -> &Lleftarr + case 4371: state = 4372; break; // &llha -> &llhar + case 4375: state = 4376; break; // &llt -> &lltr + case 4405: state = 4406; break; // &lnapp -> &lnappr + case 4423: state = 4427; break; // &loa -> &loar + case 4427: state = 4428; break; // &loar -> &loarr + case 4430: state = 4431; break; // &lob -> &lobr + case 4436: state = 4520; break; // &Long -> &Longr + case 4441: state = 4442; break; // &LongLeftA -> &LongLeftAr + case 4442: state = 4443; break; // &LongLeftAr -> &LongLeftArr + case 4450: state = 4480; break; // &Longleft -> &Longleftr + case 4451: state = 4452; break; // &Longlefta -> &Longleftar + case 4452: state = 4453; break; // &Longleftar -> &Longleftarr + case 4458: state = 4531; break; // &long -> &longr + case 4462: state = 4491; break; // &longleft -> &longleftr + case 4463: state = 4464; break; // &longlefta -> &longleftar + case 4464: state = 4465; break; // &longleftar -> &longleftarr + case 4474: state = 4475; break; // &LongLeftRightA -> &LongLeftRightAr + case 4475: state = 4476; break; // &LongLeftRightAr -> &LongLeftRightArr + case 4485: state = 4486; break; // &Longleftrighta -> &Longleftrightar + case 4486: state = 4487; break; // &Longleftrightar -> &Longleftrightarr + case 4496: state = 4497; break; // &longleftrighta -> &longleftrightar + case 4497: state = 4498; break; // &longleftrightar -> &longleftrightarr + case 4514: state = 4515; break; // &LongRightA -> &LongRightAr + case 4515: state = 4516; break; // &LongRightAr -> &LongRightArr + case 4525: state = 4526; break; // &Longrighta -> &Longrightar + case 4526: state = 4527; break; // &Longrightar -> &Longrightarr + case 4536: state = 4537; break; // &longrighta -> &longrightar + case 4537: state = 4538; break; // &longrightar -> &longrightarr + case 4544: state = 4545; break; // &loopa -> &loopar + case 4545: state = 4546; break; // &loopar -> &looparr + case 4548: state = 4554; break; // &looparrow -> &looparrowr + case 4561: state = 4562; break; // &lopa -> &lopar + case 4585: state = 4586; break; // &lowba -> &lowbar + case 4589: state = 4590; break; // &Lowe -> &Lower + case 4595: state = 4596; break; // &LowerLeftA -> &LowerLeftAr + case 4596: state = 4597; break; // &LowerLeftAr -> &LowerLeftArr + case 4606: state = 4607; break; // &LowerRightA -> &LowerRightAr + case 4607: state = 4608; break; // &LowerRightAr -> &LowerRightArr + case 4622: state = 4623; break; // &lpa -> &lpar + case 4629: state = 4630; break; // &lra -> &lrar + case 4630: state = 4631; break; // &lrar -> &lrarr + case 4634: state = 4635; break; // &lrco -> &lrcor + case 4637: state = 4638; break; // &lrcorne -> &lrcorner + case 4641: state = 4642; break; // &lrha -> &lrhar + case 4648: state = 4649; break; // &lrt -> &lrtr + case 4659: state = 4660; break; // &Lsc -> &Lscr + case 4662: state = 4663; break; // &lsc -> &lscr + case 4680: state = 4682; break; // &lsquo -> &lsquor + case 4684: state = 4685; break; // &Lst -> &Lstr + case 4689: state = 4690; break; // &lst -> &lstr + case 4698: state = 4731; break; // < -> <r + case 4703: state = 4704; break; // <ci -> <cir + case 4710: state = 4711; break; // <h -> <hr + case 4721: state = 4722; break; // <la -> <lar + case 4722: state = 4723; break; // <lar -> <larr + case 4739: state = 4740; break; // <rPa -> <rPar + case 4742: state = 4743; break; // &lu -> &lur + case 4747: state = 4748; break; // &lurdsha -> &lurdshar + case 4752: state = 4753; break; // &luruha -> &luruhar + case 4756: state = 4757; break; // &lve -> &lver + case 4768: state = 4804; break; // &ma -> &mar + case 4769: state = 4770; break; // &mac -> ¯ + case 4806: state = 4807; break; // &marke -> &marker + case 4833: state = 4834; break; // &measu -> &measur + case 4858: state = 4859; break; // &Mellint -> &Mellintr + case 4862: state = 4863; break; // &Mf -> &Mfr + case 4865: state = 4866; break; // &mf -> &mfr + case 4872: state = 4873; break; // &mic -> &micr + case 4883: state = 4884; break; // &midci -> &midcir + case 4913: state = 4914; break; // &mld -> &mldr + case 4938: state = 4939; break; // &Msc -> &Mscr + case 4942: state = 4943; break; // &msc -> &mscr + case 4965: state = 5855; break; // &n -> &nr + case 4996: state = 4997; break; // &napp -> &nappr + case 5002: state = 5003; break; // &natu -> &natur + case 5021: state = 5030; break; // &nca -> &ncar + case 5025: state = 5026; break; // &Nca -> &Ncar + case 5066: state = 5067; break; // &nea -> &near + case 5067: state = 5075; break; // &near -> &nearr + case 5071: state = 5072; break; // &neA -> &neAr + case 5072: state = 5073; break; // &neAr -> &neArr + case 5122: state = 5123; break; // &NegativeVe -> &NegativeVer + case 5142: state = 5143; break; // &nesea -> &nesear + case 5152: state = 5153; break; // &NestedG -> &NestedGr + case 5157: state = 5158; break; // &NestedGreate -> &NestedGreater + case 5159: state = 5160; break; // &NestedGreaterG -> &NestedGreaterGr + case 5164: state = 5165; break; // &NestedGreaterGreate -> &NestedGreaterGreater + case 5189: state = 5190; break; // &Nf -> &Nfr + case 5192: state = 5193; break; // &nf -> &nfr + case 5221: state = 5223; break; // &ngt -> &ngtr + case 5228: state = 5229; break; // &nhA -> &nhAr + case 5229: state = 5230; break; // &nhAr -> &nhArr + case 5232: state = 5233; break; // &nha -> &nhar + case 5233: state = 5234; break; // &nhar -> &nharr + case 5237: state = 5238; break; // &nhpa -> &nhpar + case 5257: state = 5258; break; // &nlA -> &nlAr + case 5258: state = 5259; break; // &nlAr -> &nlArr + case 5261: state = 5262; break; // &nla -> &nlar + case 5262: state = 5263; break; // &nlar -> &nlarr + case 5265: state = 5266; break; // &nld -> &nldr + case 5275: state = 5290; break; // &nLeft -> &nLeftr + case 5276: state = 5277; break; // &nLefta -> &nLeftar + case 5277: state = 5278; break; // &nLeftar -> &nLeftarr + case 5283: state = 5301; break; // &nleft -> &nleftr + case 5284: state = 5285; break; // &nlefta -> &nleftar + case 5285: state = 5286; break; // &nleftar -> &nleftarr + case 5295: state = 5296; break; // &nLeftrighta -> &nLeftrightar + case 5296: state = 5297; break; // &nLeftrightar -> &nLeftrightarr + case 5306: state = 5307; break; // &nleftrighta -> &nleftrightar + case 5307: state = 5308; break; // &nleftrightar -> &nleftrightarr + case 5334: state = 5336; break; // &nlt -> &nltr + case 5348: state = 5349; break; // &NoB -> &NoBr + case 5355: state = 5356; break; // &NonB -> &NonBr + case 5383: state = 5384; break; // &NotCong -> &NotCongr + case 5403: state = 5404; break; // &NotDoubleVe -> &NotDoubleVer + case 5411: state = 5412; break; // &NotDoubleVerticalBa -> &NotDoubleVerticalBar + case 5439: state = 5440; break; // &NotG -> &NotGr + case 5444: state = 5445; break; // &NotGreate -> &NotGreater + case 5463: state = 5464; break; // &NotGreaterG -> &NotGreaterGr + case 5468: state = 5469; break; // &NotGreaterGreate -> &NotGreaterGreater + case 5532: state = 5533; break; // &NotLeftT -> &NotLeftTr + case 5542: state = 5543; break; // &NotLeftTriangleBa -> &NotLeftTriangleBar + case 5560: state = 5561; break; // &NotLessG -> &NotLessGr + case 5565: state = 5566; break; // &NotLessGreate -> &NotLessGreater + case 5596: state = 5597; break; // &NotNestedG -> &NotNestedGr + case 5601: state = 5602; break; // &NotNestedGreate -> &NotNestedGreater + case 5603: state = 5604; break; // &NotNestedGreaterG -> &NotNestedGreaterGr + case 5608: state = 5609; break; // &NotNestedGreaterGreate -> &NotNestedGreaterGreater + case 5630: state = 5631; break; // &NotP -> &NotPr + case 5659: state = 5660; break; // &NotReve -> &NotRever + case 5675: state = 5676; break; // &NotRightT -> &NotRightTr + case 5685: state = 5686; break; // &NotRightTriangleBa -> &NotRightTriangleBar + case 5697: state = 5698; break; // &NotSqua -> &NotSquar + case 5714: state = 5715; break; // &NotSquareSupe -> &NotSquareSuper + case 5769: state = 5770; break; // &NotSupe -> &NotSuper + case 5810: state = 5811; break; // &NotVe -> &NotVer + case 5818: state = 5819; break; // &NotVerticalBa -> &NotVerticalBar + case 5821: state = 5842; break; // &np -> &npr + case 5822: state = 5823; break; // &npa -> &npar + case 5856: state = 5857; break; // &nrA -> &nrAr + case 5857: state = 5858; break; // &nrAr -> &nrArr + case 5860: state = 5861; break; // &nra -> &nrar + case 5861: state = 5862; break; // &nrar -> &nrarr + case 5873: state = 5874; break; // &nRighta -> &nRightar + case 5874: state = 5875; break; // &nRightar -> &nRightarr + case 5883: state = 5884; break; // &nrighta -> &nrightar + case 5884: state = 5885; break; // &nrightar -> &nrightarr + case 5889: state = 5890; break; // &nrt -> &nrtr + case 5896: state = 5908; break; // &nsc -> &nscr + case 5905: state = 5906; break; // &Nsc -> &Nscr + case 5911: state = 5912; break; // &nsho -> &nshor + case 5919: state = 5920; break; // &nshortpa -> &nshortpar + case 5939: state = 5940; break; // &nspa -> &nspar + case 5988: state = 6006; break; // &nt -> &ntr + case 6012: state = 6021; break; // &ntriangle -> &ntriangler + case 6036: state = 6037; break; // &nume -> &numer + case 6043: state = 6097; break; // &nv -> &nvr + case 6074: state = 6075; break; // &nvHa -> &nvHar + case 6075: state = 6076; break; // &nvHar -> &nvHarr + case 6085: state = 6086; break; // &nvlA -> &nvlAr + case 6086: state = 6087; break; // &nvlAr -> &nvlArr + case 6091: state = 6093; break; // &nvlt -> &nvltr + case 6098: state = 6099; break; // &nvrA -> &nvrAr + case 6099: state = 6100; break; // &nvrAr -> &nvrArr + case 6102: state = 6103; break; // &nvrt -> &nvrtr + case 6112: state = 6113; break; // &nwa -> &nwar + case 6113: state = 6121; break; // &nwar -> &nwarr + case 6117: state = 6118; break; // &nwA -> &nwAr + case 6118: state = 6119; break; // &nwAr -> &nwArr + case 6128: state = 6129; break; // &nwnea -> &nwnear + case 6131: state = 6340; break; // &O -> &Or + case 6138: state = 6342; break; // &o -> &or + case 6149: state = 6150; break; // &oci -> &ocir + case 6153: state = 6154; break; // &Oci -> &Ocir + case 6200: state = 6208; break; // &of -> &ofr + case 6202: state = 6203; break; // &ofci -> &ofcir + case 6205: state = 6206; break; // &Of -> &Ofr + case 6210: state = 6220; break; // &og -> &ogr + case 6214: state = 6215; break; // &Og -> &Ogr + case 6229: state = 6230; break; // &ohba -> &ohbar + case 6239: state = 6240; break; // &ola -> &olar + case 6240: state = 6241; break; // &olar -> &olarr + case 6243: state = 6247; break; // &olc -> &olcr + case 6244: state = 6245; break; // &olci -> &olcir + case 6260: state = 6261; break; // &Omac -> &Omacr + case 6265: state = 6266; break; // &omac -> &omacr + case 6277: state = 6278; break; // &Omic -> &Omicr + case 6283: state = 6284; break; // &omic -> &omicr + case 6303: state = 6304; break; // &opa -> &opar + case 6310: state = 6311; break; // &OpenCu -> &OpenCur + case 6332: state = 6333; break; // &ope -> &oper + case 6344: state = 6345; break; // &ora -> &orar + case 6345: state = 6346; break; // &orar -> &orarr + case 6350: state = 6351; break; // &orde -> &order + case 6365: state = 6366; break; // &oro -> &oror + case 6379: state = 6380; break; // &Osc -> &Oscr + case 6383: state = 6384; break; // &osc -> &oscr + case 6432: state = 6433; break; // &ovba -> &ovbar + case 6436: state = 6437; break; // &Ove -> &Over + case 6438: state = 6442; break; // &OverB -> &OverBr + case 6439: state = 6440; break; // &OverBa -> &OverBar + case 6452: state = 6453; break; // &OverPa -> &OverPar + case 6463: state = 6642; break; // &p -> &pr + case 6464: state = 6465; break; // &pa -> &par + case 6482: state = 6640; break; // &P -> &Pr + case 6483: state = 6484; break; // &Pa -> &Par + case 6497: state = 6498; break; // &pe -> &per + case 6518: state = 6519; break; // &Pf -> &Pfr + case 6521: state = 6522; break; // &pf -> &pfr + case 6549: state = 6550; break; // &pitchfo -> &pitchfor + case 6571: state = 6572; break; // &plusaci -> &plusacir + case 6577: state = 6578; break; // &plusci -> &pluscir + case 6613: state = 6614; break; // &Poinca -> &Poincar + case 6659: state = 6660; break; // &precapp -> &precappr + case 6665: state = 6666; break; // &preccu -> &preccur + case 6708: state = 6709; break; // &precnapp -> &precnappr + case 6757: state = 6758; break; // &profala -> &profalar + case 6766: state = 6767; break; // &profsu -> &profsur + case 6773: state = 6774; break; // &Propo -> &Propor + case 6790: state = 6791; break; // &pru -> &prur + case 6796: state = 6797; break; // &Psc -> &Pscr + case 6800: state = 6801; break; // &psc -> &pscr + case 6814: state = 6815; break; // &Qf -> &Qfr + case 6818: state = 6819; break; // &qf -> &qfr + case 6833: state = 6834; break; // &qp -> &qpr + case 6840: state = 6841; break; // &Qsc -> &Qscr + case 6844: state = 6845; break; // &qsc -> &qscr + case 6850: state = 6851; break; // &quate -> &quater + case 6876: state = 7526; break; // &r -> &rr + case 6877: state = 6928; break; // &rA -> &rAr + case 6878: state = 6879; break; // &rAa -> &rAar + case 6879: state = 6880; break; // &rAar -> &rAarr + case 6882: state = 6931; break; // &ra -> &rar + case 6886: state = 7531; break; // &R -> &Rr + case 6887: state = 6925; break; // &Ra -> &Rar + case 6925: state = 6926; break; // &Rar -> &Rarr + case 6928: state = 6929; break; // &rAr -> &rArr + case 6931: state = 6932; break; // &rar -> &rarr + case 6987: state = 6988; break; // &RBa -> &RBar + case 6988: state = 6989; break; // &RBar -> &RBarr + case 6992: state = 6993; break; // &rBa -> &rBar + case 6993: state = 6994; break; // &rBar -> &rBarr + case 6996: state = 7005; break; // &rb -> &rbr + case 6997: state = 6998; break; // &rba -> &rbar + case 6998: state = 6999; break; // &rbar -> &rbarr + case 7001: state = 7002; break; // &rbb -> &rbbr + case 7022: state = 7023; break; // &Rca -> &Rcar + case 7028: state = 7029; break; // &rca -> &rcar + case 7060: state = 7061; break; // &rdldha -> &rdldhar + case 7065: state = 7067; break; // &rdquo -> &rdquor + case 7083: state = 7084; break; // &realpa -> &realpar + case 7098: state = 7099; break; // &Reve -> &Rever + case 7115: state = 7116; break; // &ReverseEquilib -> &ReverseEquilibr + case 7129: state = 7130; break; // &ReverseUpEquilib -> &ReverseUpEquilibr + case 7135: state = 7149; break; // &rf -> &rfr + case 7143: state = 7144; break; // &rfloo -> &rfloor + case 7146: state = 7147; break; // &Rf -> &Rfr + case 7152: state = 7153; break; // &rHa -> &rHar + case 7156: state = 7157; break; // &rha -> &rhar + case 7175: state = 7188; break; // &RightA -> &RightAr + case 7180: state = 7181; break; // &RightAngleB -> &RightAngleBr + case 7188: state = 7189; break; // &RightAr -> &RightArr + case 7193: state = 7194; break; // &Righta -> &Rightar + case 7194: state = 7195; break; // &Rightar -> &Rightarr + case 7202: state = 7314; break; // &right -> &rightr + case 7203: state = 7204; break; // &righta -> &rightar + case 7204: state = 7205; break; // &rightar -> &rightarr + case 7210: state = 7211; break; // &RightArrowBa -> &RightArrowBar + case 7217: state = 7218; break; // &RightArrowLeftA -> &RightArrowLeftAr + case 7218: state = 7219; break; // &RightArrowLeftAr -> &RightArrowLeftArr + case 7242: state = 7243; break; // &RightDoubleB -> &RightDoubleBr + case 7259: state = 7260; break; // &RightDownTeeVecto -> &RightDownTeeVector + case 7266: state = 7267; break; // &RightDownVecto -> &RightDownVector + case 7270: state = 7271; break; // &RightDownVectorBa -> &RightDownVectorBar + case 7276: state = 7277; break; // &RightFloo -> &RightFloor + case 7280: state = 7281; break; // &rightha -> &righthar + case 7298: state = 7299; break; // &rightlefta -> &rightleftar + case 7299: state = 7300; break; // &rightleftar -> &rightleftarr + case 7306: state = 7307; break; // &rightleftha -> &rightlefthar + case 7319: state = 7320; break; // &rightrighta -> &rightrightar + case 7320: state = 7321; break; // &rightrightar -> &rightrightarr + case 7331: state = 7332; break; // &rightsquiga -> &rightsquigar + case 7332: state = 7333; break; // &rightsquigar -> &rightsquigarr + case 7337: state = 7365; break; // &RightT -> &RightTr + case 7341: state = 7342; break; // &RightTeeA -> &RightTeeAr + case 7342: state = 7343; break; // &RightTeeAr -> &RightTeeArr + case 7351: state = 7352; break; // &RightTeeVecto -> &RightTeeVector + case 7355: state = 7356; break; // &rightth -> &rightthr + case 7374: state = 7375; break; // &RightTriangleBa -> &RightTriangleBar + case 7393: state = 7394; break; // &RightUpDownVecto -> &RightUpDownVector + case 7403: state = 7404; break; // &RightUpTeeVecto -> &RightUpTeeVector + case 7410: state = 7411; break; // &RightUpVecto -> &RightUpVector + case 7414: state = 7415; break; // &RightUpVectorBa -> &RightUpVectorBar + case 7421: state = 7422; break; // &RightVecto -> &RightVector + case 7425: state = 7426; break; // &RightVectorBa -> &RightVectorBar + case 7443: state = 7444; break; // &rla -> &rlar + case 7444: state = 7445; break; // &rlar -> &rlarr + case 7448: state = 7449; break; // &rlha -> &rlhar + case 7470: state = 7474; break; // &roa -> &roar + case 7474: state = 7475; break; // &roar -> &roarr + case 7477: state = 7478; break; // &rob -> &robr + case 7482: state = 7483; break; // &ropa -> &ropar + case 7513: state = 7514; break; // &rpa -> &rpar + case 7527: state = 7528; break; // &rra -> &rrar + case 7528: state = 7529; break; // &rrar -> &rrarr + case 7536: state = 7537; break; // &Rrighta -> &Rrightar + case 7537: state = 7538; break; // &Rrightar -> &Rrightarr + case 7549: state = 7550; break; // &Rsc -> &Rscr + case 7552: state = 7553; break; // &rsc -> &rscr + case 7563: state = 7565; break; // &rsquo -> &rsquor + case 7567: state = 7578; break; // &rt -> &rtr + case 7568: state = 7569; break; // &rth -> &rthr + case 7586: state = 7587; break; // &rtrilt -> &rtriltr + case 7605: state = 7606; break; // &ruluha -> &ruluhar + case 7617: state = 8068; break; // &s -> &sr + case 7633: state = 7641; break; // &sca -> &scar + case 7636: state = 7637; break; // &Sca -> &Scar + case 7662: state = 7663; break; // &Sci -> &Scir + case 7666: state = 7667; break; // &sci -> &scir + case 7704: state = 7705; break; // &sea -> &sear + case 7705: state = 7713; break; // &sear -> &searr + case 7709: state = 7710; break; // &seA -> &seAr + case 7710: state = 7711; break; // &seAr -> &seArr + case 7726: state = 7727; break; // &seswa -> &seswar + case 7741: state = 7742; break; // &Sf -> &Sfr + case 7744: state = 7745; break; // &sf -> &sfr + case 7752: state = 7753; break; // &sha -> &shar + case 7773: state = 7774; break; // &Sho -> &Shor + case 7780: state = 7781; break; // &ShortDownA -> &ShortDownAr + case 7781: state = 7782; break; // &ShortDownAr -> &ShortDownArr + case 7790: state = 7791; break; // &ShortLeftA -> &ShortLeftAr + case 7791: state = 7792; break; // &ShortLeftAr -> &ShortLeftArr + case 7796: state = 7797; break; // &sho -> &shor + case 7804: state = 7805; break; // &shortpa -> &shortpar + case 7817: state = 7818; break; // &ShortRightA -> &ShortRightAr + case 7818: state = 7819; break; // &ShortRightAr -> &ShortRightArr + case 7825: state = 7826; break; // &ShortUpA -> &ShortUpAr + case 7826: state = 7827; break; // &ShortUpAr -> &ShortUpArr + case 7847: state = 7873; break; // &sim -> &simr + case 7874: state = 7875; break; // &simra -> &simrar + case 7875: state = 7876; break; // &simrar -> &simrarr + case 7879: state = 7880; break; // &sla -> &slar + case 7880: state = 7881; break; // &slar -> &slarr + case 7888: state = 7889; break; // &SmallCi -> &SmallCir + case 7913: state = 7914; break; // &smepa -> &smepar + case 7946: state = 7947; break; // &solba -> &solbar + case 7957: state = 7966; break; // &spa -> &spar + case 7980: state = 7981; break; // &Sq -> &Sqr + case 8011: state = 8012; break; // &Squa -> &Squar + case 8015: state = 8016; break; // &squa -> &squar + case 8022: state = 8023; break; // &SquareInte -> &SquareInter + case 8046: state = 8047; break; // &SquareSupe -> &SquareSuper + case 8069: state = 8070; break; // &sra -> &srar + case 8070: state = 8071; break; // &srar -> &srarr + case 8074: state = 8075; break; // &Ssc -> &Sscr + case 8078: state = 8079; break; // &ssc -> &sscr + case 8092: state = 8093; break; // &ssta -> &sstar + case 8097: state = 8098; break; // &Sta -> &Star + case 8100: state = 8106; break; // &st -> &str + case 8101: state = 8102; break; // &sta -> &star + case 8131: state = 8160; break; // &sub -> &subr + case 8161: state = 8162; break; // &subra -> &subrar + case 8162: state = 8163; break; // &subrar -> &subrarr + case 8203: state = 8204; break; // &succapp -> &succappr + case 8209: state = 8210; break; // &succcu -> &succcur + case 8252: state = 8253; break; // &succnapp -> &succnappr + case 8308: state = 8309; break; // &Supe -> &Super + case 8329: state = 8330; break; // &supla -> &suplar + case 8330: state = 8331; break; // &suplar -> &suplarr + case 8376: state = 8377; break; // &swa -> &swar + case 8377: state = 8385; break; // &swar -> &swarr + case 8381: state = 8382; break; // &swA -> &swAr + case 8382: state = 8383; break; // &swAr -> &swArr + case 8392: state = 8393; break; // &swnwa -> &swnwar + case 8400: state = 8676; break; // &T -> &Tr + case 8404: state = 8628; break; // &t -> &tr + case 8405: state = 8406; break; // &ta -> &tar + case 8415: state = 8416; break; // &tb -> &tbr + case 8420: state = 8421; break; // &Tca -> &Tcar + case 8426: state = 8427; break; // &tca -> &tcar + case 8450: state = 8451; break; // &tel -> &telr + case 8455: state = 8456; break; // &Tf -> &Tfr + case 8458: state = 8459; break; // &tf -> &tfr + case 8462: state = 8463; break; // &the -> &ther + case 8468: state = 8469; break; // &The -> &Ther + case 8472: state = 8473; break; // &Therefo -> &Therefor + case 8477: state = 8478; break; // &therefo -> &therefor + case 8498: state = 8499; break; // &thickapp -> &thickappr + case 8540: state = 8541; break; // &tho -> &thor + case 8582: state = 8583; break; // ×ba -> ×bar + case 8601: state = 8602; break; // &topci -> &topcir + case 8610: state = 8611; break; // &topfo -> &topfor + case 8617: state = 8618; break; // &tp -> &tpr + case 8638: state = 8655; break; // &triangle -> &triangler + case 8706: state = 8707; break; // &Tsc -> &Tscr + case 8710: state = 8711; break; // &tsc -> &tscr + case 8727: state = 8728; break; // &Tst -> &Tstr + case 8732: state = 8733; break; // &tst -> &tstr + case 8746: state = 8757; break; // &twohead -> &twoheadr + case 8751: state = 8752; break; // &twoheadlefta -> &twoheadleftar + case 8752: state = 8753; break; // &twoheadleftar -> &twoheadleftarr + case 8762: state = 8763; break; // &twoheadrighta -> &twoheadrightar + case 8763: state = 8764; break; // &twoheadrightar -> &twoheadrightarr + case 8768: state = 9140; break; // &U -> &Ur + case 8769: state = 8782; break; // &Ua -> &Uar + case 8775: state = 9127; break; // &u -> &ur + case 8776: state = 8789; break; // &ua -> &uar + case 8782: state = 8783; break; // &Uar -> &Uarr + case 8785: state = 8786; break; // &uA -> &uAr + case 8786: state = 8787; break; // &uAr -> &uArr + case 8789: state = 8790; break; // &uar -> &uarr + case 8794: state = 8795; break; // &Uarroci -> &Uarrocir + case 8797: state = 8798; break; // &Ub -> &Ubr + case 8802: state = 8803; break; // &ub -> &ubr + case 8816: state = 8817; break; // &Uci -> &Ucir + case 8821: state = 8822; break; // &uci -> &ucir + case 8830: state = 8831; break; // &uda -> &udar + case 8831: state = 8832; break; // &udar -> &udarr + case 8846: state = 8847; break; // &udha -> &udhar + case 8849: state = 8858; break; // &uf -> &ufr + case 8855: state = 8856; break; // &Uf -> &Ufr + case 8860: state = 8861; break; // &Ug -> &Ugr + case 8866: state = 8867; break; // &ug -> &ugr + case 8873: state = 8874; break; // &uHa -> &uHar + case 8877: state = 8878; break; // &uha -> &uhar + case 8878: state = 8881; break; // &uhar -> &uharr + case 8888: state = 8896; break; // &ulc -> &ulcr + case 8889: state = 8890; break; // &ulco -> &ulcor + case 8893: state = 8894; break; // &ulcorne -> &ulcorner + case 8900: state = 8901; break; // &ult -> &ultr + case 8906: state = 8907; break; // &Umac -> &Umacr + case 8911: state = 8912; break; // &umac -> &umacr + case 8918: state = 8919; break; // &Unde -> &Under + case 8920: state = 8924; break; // &UnderB -> &UnderBr + case 8921: state = 8922; break; // &UnderBa -> &UnderBar + case 8934: state = 8935; break; // &UnderPa -> &UnderPar + case 8971: state = 8972; break; // &UpA -> &UpAr + case 8972: state = 8973; break; // &UpAr -> &UpArr + case 8977: state = 8978; break; // &Upa -> &Upar + case 8978: state = 8979; break; // &Upar -> &Uparr + case 8984: state = 8985; break; // &upa -> &upar + case 8985: state = 8986; break; // &upar -> &uparr + case 8991: state = 8992; break; // &UpArrowBa -> &UpArrowBar + case 8998: state = 8999; break; // &UpArrowDownA -> &UpArrowDownAr + case 8999: state = 9000; break; // &UpArrowDownAr -> &UpArrowDownArr + case 9008: state = 9009; break; // &UpDownA -> &UpDownAr + case 9009: state = 9010; break; // &UpDownAr -> &UpDownArr + case 9018: state = 9019; break; // &Updowna -> &Updownar + case 9019: state = 9020; break; // &Updownar -> &Updownarr + case 9028: state = 9029; break; // &updowna -> &updownar + case 9029: state = 9030; break; // &updownar -> &updownarr + case 9040: state = 9041; break; // &UpEquilib -> &UpEquilibr + case 9047: state = 9048; break; // &upha -> &uphar + case 9052: state = 9058; break; // &upharpoon -> &upharpoonr + case 9069: state = 9070; break; // &Uppe -> &Upper + case 9075: state = 9076; break; // &UpperLeftA -> &UpperLeftAr + case 9076: state = 9077; break; // &UpperLeftAr -> &UpperLeftArr + case 9086: state = 9087; break; // &UpperRightA -> &UpperRightAr + case 9087: state = 9088; break; // &UpperRightAr -> &UpperRightArr + case 9112: state = 9113; break; // &UpTeeA -> &UpTeeAr + case 9113: state = 9114; break; // &UpTeeAr -> &UpTeeArr + case 9120: state = 9121; break; // &upupa -> &upupar + case 9121: state = 9122; break; // &upupar -> &upuparr + case 9128: state = 9136; break; // &urc -> &urcr + case 9129: state = 9130; break; // &urco -> &urcor + case 9133: state = 9134; break; // &urcorne -> &urcorner + case 9149: state = 9150; break; // &urt -> &urtr + case 9154: state = 9155; break; // &Usc -> &Uscr + case 9158: state = 9159; break; // &usc -> &uscr + case 9161: state = 9177; break; // &ut -> &utr + case 9183: state = 9184; break; // &uua -> &uuar + case 9184: state = 9185; break; // &uuar -> &uuarr + case 9201: state = 9445; break; // &v -> &vr + case 9202: state = 9208; break; // &va -> &var + case 9204: state = 9205; break; // &vang -> &vangr + case 9208: state = 9247; break; // &var -> &varr + case 9231: state = 9237; break; // &varp -> &varpr + case 9243: state = 9244; break; // &vA -> &vAr + case 9244: state = 9245; break; // &vAr -> &vArr + case 9279: state = 9285; break; // &vart -> &vartr + case 9291: state = 9297; break; // &vartriangle -> &vartriangler + case 9305: state = 9306; break; // &Vba -> &Vbar + case 9309: state = 9310; break; // &vBa -> &vBar + case 9342: state = 9360; break; // &Ve -> &Ver + case 9345: state = 9365; break; // &ve -> &ver + case 9349: state = 9350; break; // &veeba -> &veebar + case 9362: state = 9363; break; // &Verba -> &Verbar + case 9367: state = 9368; break; // &verba -> &verbar + case 9379: state = 9380; break; // &VerticalBa -> &VerticalBar + case 9390: state = 9391; break; // &VerticalSepa -> &VerticalSepar + case 9394: state = 9395; break; // &VerticalSeparato -> &VerticalSeparator + case 9414: state = 9415; break; // &Vf -> &Vfr + case 9417: state = 9418; break; // &vf -> &vfr + case 9421: state = 9422; break; // &vlt -> &vltr + case 9440: state = 9441; break; // &vp -> &vpr + case 9446: state = 9447; break; // &vrt -> &vrtr + case 9451: state = 9452; break; // &Vsc -> &Vscr + case 9455: state = 9456; break; // &vsc -> &vscr + case 9486: state = 9487; break; // &Wci -> &Wcir + case 9490: state = 9533; break; // &w -> &wr + case 9492: state = 9493; break; // &wci -> &wcir + case 9499: state = 9500; break; // &wedba -> &wedbar + case 9513: state = 9514; break; // &weie -> &weier + case 9517: state = 9518; break; // &Wf -> &Wfr + case 9520: state = 9521; break; // &wf -> &wfr + case 9541: state = 9542; break; // &Wsc -> &Wscr + case 9545: state = 9546; break; // &wsc -> &wscr + case 9548: state = 9623; break; // &x -> &xr + case 9553: state = 9554; break; // &xci -> &xcir + case 9561: state = 9562; break; // &xdt -> &xdtr + case 9566: state = 9567; break; // &Xf -> &Xfr + case 9569: state = 9570; break; // &xf -> &xfr + case 9573: state = 9574; break; // &xhA -> &xhAr + case 9574: state = 9575; break; // &xhAr -> &xhArr + case 9577: state = 9578; break; // &xha -> &xhar + case 9578: state = 9579; break; // &xhar -> &xharr + case 9586: state = 9587; break; // &xlA -> &xlAr + case 9587: state = 9588; break; // &xlAr -> &xlArr + case 9590: state = 9591; break; // &xla -> &xlar + case 9591: state = 9592; break; // &xlar -> &xlarr + case 9624: state = 9625; break; // &xrA -> &xrAr + case 9625: state = 9626; break; // &xrAr -> &xrArr + case 9628: state = 9629; break; // &xra -> &xrar + case 9629: state = 9630; break; // &xrar -> &xrarr + case 9633: state = 9634; break; // &Xsc -> &Xscr + case 9637: state = 9638; break; // &xsc -> &xscr + case 9651: state = 9652; break; // &xut -> &xutr + case 9686: state = 9687; break; // &Yci -> &Ycir + case 9691: state = 9692; break; // &yci -> &ycir + case 9702: state = 9703; break; // &Yf -> &Yfr + case 9705: state = 9706; break; // &yf -> &yfr + case 9725: state = 9726; break; // &Ysc -> &Yscr + case 9729: state = 9730; break; // &ysc -> &yscr + case 9762: state = 9763; break; // &Zca -> &Zcar + case 9768: state = 9769; break; // &zca -> &zcar + case 9787: state = 9788; break; // &zeet -> &zeetr + case 9791: state = 9792; break; // &Ze -> &Zer + case 9811: state = 9812; break; // &Zf -> &Zfr + case 9814: state = 9815; break; // &zf -> &zfr + case 9826: state = 9827; break; // &zig -> &zigr + case 9828: state = 9829; break; // &zigra -> &zigrar + case 9829: state = 9830; break; // &zigrar -> &zigrarr + case 9841: state = 9842; break; // &Zsc -> &Zscr + case 9845: state = 9846; break; // &zsc -> &zscr default: return false; } break; case 's': switch (state) { - case 0: state = 5991; break; // & -> &s - case 1: state = 180; break; // &A -> &As - case 7: state = 183; break; // &a -> &as - case 62: state = 63; break; // &alef -> &alefs - case 91: state = 96; break; // &and -> &ands - case 102: state = 123; break; // &ang -> &angs - case 106: state = 107; break; // &angm -> &angms - case 152: state = 153; break; // &apo -> &apos - case 180: state = 186; break; // &As -> &Ass - case 222: state = 552; break; // &b -> &bs - case 225: state = 242; break; // &back -> &backs - case 231: state = 232; break; // &backep -> &backeps - case 247: state = 549; break; // &B -> &Bs - case 250: state = 251; break; // &Back -> &Backs - case 253: state = 254; break; // &Backsla -> &Backslas - case 291: state = 292; break; // &becau -> &becaus - case 296: state = 297; break; // &Becau -> &Becaus - case 305: state = 306; break; // &bep -> &beps - case 318: state = 319; break; // &Bernoulli -> &Bernoullis - case 334: state = 356; break; // &big -> &bigs - case 349: state = 350; break; // &bigoplu -> &bigoplus - case 354: state = 355; break; // &bigotime -> &bigotimes - case 381: state = 382; break; // &biguplu -> &biguplus - case 399: state = 407; break; // &black -> &blacks - case 497: state = 498; break; // &boxminu -> &boxminus - case 501: state = 502; break; // &boxplu -> &boxplus - case 506: state = 507; break; // &boxtime -> &boxtimes - case 564: state = 565; break; // &bsolh -> &bsolhs - case 583: state = 972; break; // &C -> &Cs - case 589: state = 975; break; // &c -> &cs - case 596: state = 630; break; // &cap -> &caps - case 639: state = 640; break; // &Cayley -> &Cayleys - case 643: state = 644; break; // &ccap -> &ccaps - case 673: state = 674; break; // &ccup -> &ccups - case 674: state = 675; break; // &ccups -> &ccupss - case 733: state = 799; break; // &cir -> &cirs - case 754: state = 755; break; // &circleda -> &circledas - case 762: state = 763; break; // &circledda -> &circleddas - case 778: state = 779; break; // &CircleMinu -> &CircleMinus - case 782: state = 783; break; // &CirclePlu -> &CirclePlus - case 787: state = 788; break; // &CircleTime -> &CircleTimes - case 804: state = 826; break; // &Clo -> &Clos - case 808: state = 809; break; // &Clockwi -> &Clockwis - case 851: state = 852; break; // &club -> &clubs - case 881: state = 882; break; // &complexe -> &complexes - case 929: state = 930; break; // © -> ©s - case 943: state = 944; break; // &CounterClockwi -> &CounterClockwis - case 966: state = 967; break; // &Cro -> &Cros - case 967: state = 968; break; // &Cros -> &Cross - case 969: state = 970; break; // &cro -> &cros - case 970: state = 971; break; // &cros -> &cross - case 994: state = 997; break; // &cue -> &cues - case 1006: state = 1025; break; // &cup -> &cups - case 1034: state = 1039; break; // &curlyeq -> &curlyeqs - case 1091: state = 1604; break; // &D -> &Ds - case 1092: state = 1116; break; // &Da -> &Das - case 1097: state = 1607; break; // &d -> &ds - case 1098: state = 1114; break; // &da -> &das - case 1157: state = 1158; break; // &ddot -> &ddots - case 1176: state = 1177; break; // &dfi -> &dfis - case 1228: state = 1260; break; // &di -> &dis - case 1230: state = 1242; break; // &diam -> &diams - case 1237: state = 1238; break; // &diamond -> &diamonds - case 1272: state = 1273; break; // ÷ontime -> ÷ontimes - case 1302: state = 1325; break; // &dot -> &dots - case 1319: state = 1320; break; // &dotminu -> &dotminus - case 1323: state = 1324; break; // &dotplu -> &dotplus - case 1508: state = 1509; break; // &downdownarrow -> &downdownarrows - case 1656: state = 1897; break; // &E -> &Es - case 1662: state = 1900; break; // &e -> &es - case 1663: state = 1668; break; // &ea -> &eas - case 1714: state = 1724; break; // &eg -> &egs - case 1728: state = 1742; break; // &el -> &els - case 1739: state = 1740; break; // &elinter -> &elinters - case 1750: state = 1790; break; // &em -> &ems - case 1756: state = 1757; break; // &empty -> &emptys - case 1797: state = 1799; break; // &en -> &ens - case 1813: state = 1821; break; // &ep -> &eps - case 1815: state = 1816; break; // &epar -> &epars - case 1819: state = 1820; break; // &eplu -> &eplus - case 1823: state = 1824; break; // &Ep -> &Eps - case 1833: state = 1842; break; // &eq -> &eqs - case 1853: state = 1854; break; // &eqslantle -> &eqslantles - case 1854: state = 1855; break; // &eqslantles -> &eqslantless - case 1862: state = 1863; break; // &equal -> &equals - case 1869: state = 1870; break; // &eque -> &eques - case 1887: state = 1888; break; // &eqvpar -> &eqvpars - case 1928: state = 1929; break; // &exi -> &exis - case 1932: state = 1933; break; // &Exi -> &Exis - case 1934: state = 1935; break; // &Exist -> &Exists - case 1964: state = 2115; break; // &f -> &fs - case 1973: state = 1974; break; // &fallingdot -> &fallingdots - case 1977: state = 2112; break; // &F -> &Fs - case 2047: state = 2048; break; // &fltn -> &fltns - case 2084: state = 2107; break; // &fra -> &fras - case 2118: state = 2285; break; // &g -> &gs - case 2124: state = 2282; break; // &G -> &Gs - case 2166: state = 2176; break; // &ge -> &ges - case 2169: state = 2171; break; // &geq -> &geqs - case 2185: state = 2186; break; // &gesle -> &gesles - case 2208: state = 2219; break; // &gn -> &gns - case 2244: state = 2245; break; // &GreaterEqualLe -> &GreaterEqualLes - case 2245: state = 2246; break; // &GreaterEqualLes -> &GreaterEqualLess - case 2264: state = 2265; break; // &GreaterLe -> &GreaterLes - case 2265: state = 2266; break; // &GreaterLes -> &GreaterLess - case 2308: state = 2309; break; // >que -> >ques - case 2311: state = 2338; break; // >r -> >rs - case 2326: state = 2327; break; // >reqle -> >reqles - case 2327: state = 2328; break; // >reqles -> >reqless - case 2331: state = 2332; break; // >reqqle -> >reqqles - case 2332: state = 2333; break; // >reqqles -> >reqqless - case 2335: state = 2336; break; // >rle -> >rles - case 2336: state = 2337; break; // >rles -> >rless - case 2351: state = 2490; break; // &H -> &Hs - case 2356: state = 2493; break; // &h -> &hs - case 2359: state = 2360; break; // &hair -> &hairs - case 2400: state = 2401; break; // &heart -> &hearts - case 2428: state = 2429; break; // &hk -> &hks - case 2497: state = 2498; break; // &hsla -> &hslas - case 2533: state = 2740; break; // &I -> &Is - case 2539: state = 2743; break; // &i -> &is - case 2639: state = 2640; break; // &Implie -> &Implies - case 2665: state = 2666; break; // &integer -> &integers - case 2676: state = 2677; break; // &Inter -> &Inters - case 2694: state = 2695; break; // &Invi -> &Invis - case 2708: state = 2709; break; // &InvisibleTime -> &InvisibleTimes - case 2737: state = 2738; break; // &ique -> &iques - case 2747: state = 2752; break; // &isin -> &isins - case 2777: state = 2803; break; // &J -> &Js - case 2782: state = 2806; break; // &j -> &js - case 2825: state = 2875; break; // &K -> &Ks - case 2830: state = 2878; break; // &k -> &ks - case 2881: state = 3661; break; // &l -> &ls - case 2886: state = 3666; break; // &L -> &Ls - case 2939: state = 2951; break; // &larr -> &larrs - case 2941: state = 2942; break; // &larrbf -> &larrbfs - case 2943: state = 2944; break; // &larrf -> &larrfs - case 2964: state = 2965; break; // &late -> &lates - case 2982: state = 2984; break; // &lbrk -> &lbrks - case 3012: state = 3029; break; // &ld -> &lds - case 3024: state = 3025; break; // &ldru -> &ldrus - case 3032: state = 3291; break; // &le -> &les - case 3033: state = 3321; break; // &Le -> &Les - case 3147: state = 3148; break; // &leftleftarrow -> &leftleftarrows - case 3173: state = 3188; break; // &leftright -> &leftrights - case 3178: state = 3179; break; // &leftrightarrow -> &leftrightarrows - case 3186: state = 3187; break; // &leftrightharpoon -> &leftrightharpoons - case 3226: state = 3227; break; // &leftthreetime -> &leftthreetimes - case 3284: state = 3286; break; // &leq -> &leqs - case 3291: state = 3302; break; // &les -> &less - case 3300: state = 3301; break; // &lesge -> &lesges - case 3302: state = 3358; break; // &less -> &lesss - case 3321: state = 3322; break; // &Les -> &Less - case 3355: state = 3356; break; // &LessLe -> &LessLes - case 3356: state = 3357; break; // &LessLes -> &LessLess - case 3377: state = 3378; break; // &lfi -> &lfis - case 3445: state = 3446; break; // &lmou -> &lmous - case 3452: state = 3463; break; // &ln -> &lns - case 3539: state = 3540; break; // &longmap -> &longmaps - case 3596: state = 3597; break; // &loplu -> &loplus - case 3601: state = 3602; break; // &lotime -> &lotimes - case 3604: state = 3605; break; // &lowa -> &lowas - case 3706: state = 3707; break; // <ime -> <imes - case 3714: state = 3715; break; // <que -> <ques - case 3726: state = 3727; break; // &lurd -> &lurds - case 3745: state = 3879; break; // &m -> &ms - case 3752: state = 3753; break; // &malte -> &maltes - case 3755: state = 3876; break; // &M -> &Ms - case 3758: state = 3759; break; // &map -> &maps - case 3785: state = 3786; break; // &mda -> &mdas - case 3793: state = 3794; break; // &mea -> &meas - case 3832: state = 3833; break; // &mida -> &midas - case 3842: state = 3843; break; // &minu -> &minus - case 3849: state = 3850; break; // &Minu -> &Minus - case 3853: state = 3854; break; // &MinusPlu -> &MinusPlus - case 3863: state = 3864; break; // &mnplu -> &mnplus - case 3868: state = 3869; break; // &model -> &models - case 3884: state = 3885; break; // &mstpo -> &mstpos - case 3897: state = 4653; break; // &n -> &ns - case 3902: state = 4659; break; // &N -> &Ns - case 3918: state = 3919; break; // &napo -> &napos - case 3928: state = 3929; break; // &natural -> &naturals - case 3930: state = 3931; break; // &nb -> &nbs - case 3967: state = 3968; break; // &nda -> &ndas - case 3970: state = 4035; break; // &ne -> &nes - case 3984: state = 4041; break; // &Ne -> &Nes - case 4060: state = 4061; break; // &NestedLe -> &NestedLes - case 4061: state = 4062; break; // &NestedLes -> &NestedLess - case 4064: state = 4065; break; // &NestedLessLe -> &NestedLessLes - case 4065: state = 4066; break; // &NestedLessLes -> &NestedLessLess - case 4073: state = 4074; break; // &nexi -> &nexis - case 4075: state = 4076; break; // &nexist -> &nexists - case 4081: state = 4094; break; // &ng -> &ngs - case 4083: state = 4091; break; // &nge -> &nges - case 4084: state = 4086; break; // &ngeq -> &ngeqs - case 4111: state = 4112; break; // &ni -> &nis - case 4121: state = 4178; break; // &nl -> &nls - case 4131: state = 4175; break; // &nle -> &nles - case 4168: state = 4170; break; // &nleq -> &nleqs - case 4175: state = 4176; break; // &nles -> &nless - case 4265: state = 4266; break; // &NotExi -> &NotExis - case 4267: state = 4268; break; // &NotExist -> &NotExists - case 4298: state = 4299; break; // &NotGreaterLe -> &NotGreaterLes - case 4299: state = 4300; break; // &NotGreaterLes -> &NotGreaterLess - case 4344: state = 4363; break; // &NotLe -> &NotLes - case 4363: state = 4364; break; // &NotLes -> &NotLess - case 4378: state = 4379; break; // &NotLessLe -> &NotLessLes - case 4379: state = 4380; break; // &NotLessLes -> &NotLessLess - case 4397: state = 4398; break; // &NotNe -> &NotNes - case 4417: state = 4418; break; // &NotNestedLe -> &NotNestedLes - case 4418: state = 4419; break; // &NotNestedLes -> &NotNestedLess - case 4421: state = 4422; break; // &NotNestedLessLe -> &NotNestedLessLes - case 4422: state = 4423; break; // &NotNestedLessLes -> &NotNestedLessLess - case 4436: state = 4437; break; // &NotPrecede -> &NotPrecedes - case 4457: state = 4458; break; // &NotRever -> &NotRevers - case 4495: state = 4496; break; // &NotSquareSub -> &NotSquareSubs - case 4506: state = 4507; break; // &NotSquareSuper -> &NotSquareSupers - case 4516: state = 4517; break; // &NotSub -> &NotSubs - case 4529: state = 4530; break; // &NotSucceed -> &NotSucceeds - case 4553: state = 4554; break; // &NotSuper -> &NotSupers - case 4599: state = 4605; break; // &npar -> &npars - case 4688: state = 4689; break; // &nsq -> &nsqs - case 4696: state = 4699; break; // &nsub -> &nsubs - case 4709: state = 4712; break; // &nsup -> &nsups - case 4754: state = 4758; break; // &num -> &nums - case 4760: state = 4809; break; // &nv -> &nvs - case 4765: state = 4766; break; // &nVDa -> &nVDas - case 4769: state = 4770; break; // &nVda -> &nVdas - case 4773: state = 4774; break; // &nvDa -> &nvDas - case 4777: state = 4778; break; // &nvda -> &nvdas - case 4827: state = 5015; break; // &O -> &Os - case 4833: state = 5018; break; // &o -> &os - case 4834: state = 4839; break; // &oa -> &oas - case 4851: state = 4868; break; // &od -> &ods - case 4852: state = 4853; break; // &oda -> &odas - case 4916: state = 4917; break; // &olcro -> &olcros - case 4917: state = 4918; break; // &olcros -> &olcross - case 4949: state = 4950; break; // &ominu -> &ominus - case 4988: state = 4989; break; // &oplu -> &oplus - case 4991: state = 5008; break; // &or -> &ors - case 5022: state = 5023; break; // &Osla -> &Oslas - case 5026: state = 5027; break; // &osla -> &oslas - case 5042: state = 5043; break; // &Otime -> &Otimes - case 5045: state = 5046; break; // &otime -> &otimes - case 5047: state = 5048; break; // &otimesa -> &otimesas - case 5079: state = 5080; break; // &OverParenthe -> &OverParenthes - case 5081: state = 5082; break; // &OverParenthesi -> &OverParenthesis - case 5083: state = 5338; break; // &p -> &ps - case 5085: state = 5091; break; // &par -> &pars - case 5096: state = 5335; break; // &P -> &Ps - case 5158: state = 5159; break; // &plu -> &plus - case 5159: state = 5182; break; // &plus -> &pluss - case 5173: state = 5174; break; // &Plu -> &Plus - case 5178: state = 5179; break; // &PlusMinu -> &PlusMinus - case 5216: state = 5328; break; // &pr -> &prs - case 5224: state = 5279; break; // &prec -> &precs - case 5242: state = 5243; break; // &Precede -> &Precedes - case 5266: state = 5276; break; // &precn -> &precns - case 5287: state = 5288; break; // &prime -> &primes - case 5289: state = 5293; break; // &prn -> &prns - case 5303: state = 5312; break; // &prof -> &profs - case 5345: state = 5346; break; // &punc -> &puncs - case 5348: state = 5368; break; // &Q -> &Qs - case 5351: state = 5371; break; // &q -> &qs - case 5382: state = 5383; break; // &quaternion -> &quaternions - case 5387: state = 5388; break; // &que -> &ques - case 5397: state = 5934; break; // &r -> &rs - case 5405: state = 5939; break; // &R -> &Rs - case 5439: state = 5454; break; // &rarr -> &rarrs - case 5443: state = 5444; break; // &rarrbf -> &rarrbfs - case 5446: state = 5447; break; // &rarrf -> &rarrfs - case 5474: state = 5475; break; // &rational -> &rationals - case 5496: state = 5498; break; // &rbrk -> &rbrks - case 5526: state = 5538; break; // &rd -> &rds - case 5543: state = 5551; break; // &real -> &reals - case 5559: state = 5560; break; // &Rever -> &Revers - case 5593: state = 5594; break; // &rfi -> &rfis - case 5642: state = 5844; break; // &ri -> &ris - case 5645: state = 5754; break; // &right -> &rights - case 5733: state = 5734; break; // &rightleftarrow -> &rightleftarrows - case 5741: state = 5742; break; // &rightleftharpoon -> &rightleftharpoons - case 5752: state = 5753; break; // &rightrightarrow -> &rightrightarrows - case 5786: state = 5787; break; // &rightthreetime -> &rightthreetimes - case 5850: state = 5851; break; // &risingdot -> &risingdots - case 5864: state = 5865; break; // &rmou -> &rmous - case 5892: state = 5893; break; // &roplu -> &roplus - case 5897: state = 5898; break; // &rotime -> &rotimes - case 5907: state = 5908; break; // &RoundImplie -> &RoundImplies - case 5958: state = 5959; break; // &rtime -> &rtimes - case 5985: state = 6338; break; // &S -> &Ss - case 5991: state = 6341; break; // &s -> &ss - case 6002: state = 6043; break; // &sc -> &scs - case 6030: state = 6034; break; // &scn -> &scns - case 6053: state = 6068; break; // &se -> &ses - case 6076: state = 6077; break; // &setminu -> &setminus - case 6182: state = 6183; break; // &simplu -> &simplus - case 6203: state = 6214; break; // &sma -> &smas - case 6205: state = 6206; break; // &small -> &smalls - case 6212: state = 6213; break; // &smallsetminu -> &smallsetminus - case 6220: state = 6221; break; // &smepar -> &smepars - case 6228: state = 6229; break; // &smte -> &smtes - case 6252: state = 6253; break; // &spade -> &spades - case 6258: state = 6269; break; // &sq -> &sqs - case 6261: state = 6262; break; // &sqcap -> &sqcaps - case 6264: state = 6265; break; // &sqcup -> &sqcups - case 6271: state = 6273; break; // &sqsub -> &sqsubs - case 6278: state = 6280; break; // &sqsup -> &sqsups - case 6297: state = 6298; break; // &SquareInter -> &SquareInters - case 6307: state = 6308; break; // &SquareSub -> &SquareSubs - case 6318: state = 6319; break; // &SquareSuper -> &SquareSupers - case 6370: state = 6371; break; // &straightep -> &straighteps - case 6379: state = 6380; break; // &strn -> &strns - case 6382: state = 6408; break; // &Sub -> &Subs - case 6384: state = 6411; break; // &sub -> &subs - case 6402: state = 6403; break; // &subplu -> &subplus - case 6432: state = 6487; break; // &succ -> &succs - case 6450: state = 6451; break; // &Succeed -> &Succeeds - case 6474: state = 6484; break; // &succn -> &succns - case 6499: state = 6546; break; // &Sup -> &Sups - case 6500: state = 6549; break; // &sup -> &sups - case 6504: state = 6507; break; // &supd -> &supds - case 6516: state = 6517; break; // &Super -> &Supers - case 6525: state = 6526; break; // &suph -> &suphs - case 6544: state = 6545; break; // &supplu -> &supplus - case 6583: state = 6821; break; // &T -> &Ts - case 6586: state = 6824; break; // &t -> &ts - case 6649: state = 6650; break; // &theta -> &thetas - case 6656: state = 6663; break; // &thick -> &thicks - case 6674: state = 6675; break; // &thin -> &thins - case 6683: state = 6686; break; // &thk -> &thks - case 6724: state = 6725; break; // &time -> × - case 6732: state = 6749; break; // &to -> &tos - case 6764: state = 6809; break; // &tri -> &tris - case 6795: state = 6796; break; // &triminu -> &triminus - case 6807: state = 6808; break; // &triplu -> &triplus - case 6873: state = 7186; break; // &U -> &Us - case 6879: state = 7189; break; // &u -> &us - case 6937: state = 6938; break; // &ufi -> &ufis - case 7008: state = 7009; break; // &UnderParenthe -> &UnderParenthes - case 7010: state = 7011; break; // &UnderParenthesi -> &UnderParenthesis - case 7017: state = 7018; break; // &UnionPlu -> &UnionPlus - case 7031: state = 7139; break; // &Up -> &Ups - case 7042: state = 7141; break; // &up -> &ups - case 7115: state = 7116; break; // &uplu -> &uplus - case 7164: state = 7165; break; // &upuparrow -> &upuparrows - case 7223: state = 7424; break; // &v -> &vs - case 7229: state = 7264; break; // &var -> &vars - case 7231: state = 7232; break; // &varep -> &vareps - case 7270: state = 7271; break; // &varsub -> &varsubs - case 7278: state = 7279; break; // &varsup -> &varsups - case 7307: state = 7421; break; // &V -> &Vs - case 7320: state = 7321; break; // &VDa -> &VDas - case 7324: state = 7325; break; // &Vda -> &Vdas - case 7328: state = 7329; break; // &vDa -> &vDas - case 7332: state = 7333; break; // &vda -> &vdas - case 7402: state = 7403; break; // &vn -> &vns - case 7438: state = 7439; break; // &Vvda -> &Vvdas - case 7447: state = 7489; break; // &W -> &Ws - case 7452: state = 7492; break; // &w -> &ws - case 7495: state = 7561; break; // &x -> &xs - case 7508: state = 7558; break; // &X -> &Xs - case 7533: state = 7534; break; // &xni -> &xnis - case 7545: state = 7546; break; // &xoplu -> &xoplus - case 7571: state = 7572; break; // &xuplu -> &xuplus - case 7584: state = 7628; break; // &Y -> &Ys - case 7590: state = 7631; break; // &y -> &ys - case 7645: state = 7719; break; // &Z -> &Zs - case 7651: state = 7722; break; // &z -> &zs + case 0: state = 7617; break; // & -> &s + case 1: state = 247; break; // &A -> &As + case 8: state = 251; break; // &a -> &as + case 81: state = 82; break; // &alef -> &alefs + case 120: state = 128; break; // &and -> &ands + case 136: state = 172; break; // &ang -> &angs + case 143: state = 144; break; // &angm -> &angms + case 213: state = 214; break; // &apo -> &apos + case 247: state = 255; break; // &As -> &Ass + case 301: state = 744; break; // &b -> &bs + case 304: state = 324; break; // &back -> &backs + case 311: state = 312; break; // &backep -> &backeps + case 331: state = 740; break; // &B -> &Bs + case 334: state = 335; break; // &Back -> &Backs + case 337: state = 338; break; // &Backsla -> &Backslas + case 387: state = 388; break; // &becau -> &becaus + case 393: state = 394; break; // &Becau -> &Becaus + case 405: state = 406; break; // &bep -> &beps + case 420: state = 421; break; // &Bernoulli -> &Bernoullis + case 443: state = 471; break; // &big -> &bigs + case 462: state = 463; break; // &bigoplu -> &bigoplus + case 468: state = 469; break; // &bigotime -> &bigotimes + case 500: state = 501; break; // &biguplu -> &biguplus + case 522: state = 531; break; // &black -> &blacks + case 659: state = 660; break; // &boxminu -> &boxminus + case 664: state = 665; break; // &boxplu -> &boxplus + case 670: state = 671; break; // &boxtime -> &boxtimes + case 762: state = 763; break; // &bsolh -> &bsolhs + case 789: state = 1270; break; // &C -> &Cs + case 796: state = 1274; break; // &c -> &cs + case 805: state = 846; break; // &cap -> &caps + case 858: state = 859; break; // &Cayley -> &Cayleys + case 863: state = 864; break; // &ccap -> &ccaps + case 901: state = 902; break; // &ccup -> &ccups + case 902: state = 904; break; // &ccups -> &ccupss + case 979: state = 1063; break; // &cir -> &cirs + case 1005: state = 1006; break; // &circleda -> &circledas + case 1015: state = 1016; break; // &circledda -> &circleddas + case 1035: state = 1036; break; // &CircleMinu -> &CircleMinus + case 1040: state = 1041; break; // &CirclePlu -> &CirclePlus + case 1046: state = 1047; break; // &CircleTime -> &CircleTimes + case 1069: state = 1092; break; // &Clo -> &Clos + case 1073: state = 1074; break; // &Clockwi -> &Clockwis + case 1119: state = 1120; break; // &club -> &clubs + case 1161: state = 1162; break; // &complexe -> &complexes + case 1221: state = 1223; break; // © -> ©s + case 1237: state = 1238; break; // &CounterClockwi -> &CounterClockwis + case 1262: state = 1263; break; // &Cro -> &Cros + case 1263: state = 1264; break; // &Cros -> &Cross + case 1266: state = 1267; break; // &cro -> &cros + case 1267: state = 1268; break; // &cros -> &cross + case 1301: state = 1305; break; // &cue -> &cues + case 1318: state = 1344; break; // &cup -> &cups + case 1356: state = 1362; break; // &curlyeq -> &curlyeqs + case 1425: state = 2040; break; // &D -> &Ds + case 1426: state = 1457; break; // &Da -> &Das + case 1432: state = 2044; break; // &d -> &ds + case 1433: state = 1454; break; // &da -> &das + case 1511: state = 1512; break; // &ddot -> &ddots + case 1536: state = 1537; break; // &dfi -> &dfis + case 1599: state = 1639; break; // &di -> &dis + case 1601: state = 1617; break; // &diam -> &diams + case 1610: state = 1612; break; // &diamond -> &diamonds + case 1654: state = 1655; break; // ÷ontime -> ÷ontimes + case 1694: state = 1724; break; // &dot -> &dots + case 1716: state = 1717; break; // &dotminu -> &dotminus + case 1721: state = 1722; break; // &dotplu -> &dotplus + case 1929: state = 1930; break; // &downdownarrow -> &downdownarrows + case 2108: state = 2418; break; // &E -> &Es + case 2115: state = 2422; break; // &e -> &es + case 2116: state = 2122; break; // &ea -> &eas + case 2185: state = 2198; break; // &eg -> &egs + case 2204: state = 2222; break; // &el -> &els + case 2217: state = 2218; break; // &elinter -> &elinters + case 2233: state = 2279; break; // &em -> &ems + case 2240: state = 2242; break; // &empty -> &emptys + case 2290: state = 2293; break; // &en -> &ens + case 2312: state = 2323; break; // &ep -> &eps + case 2314: state = 2316; break; // &epar -> &epars + case 2320: state = 2321; break; // &eplu -> &eplus + case 2326: state = 2327; break; // &Ep -> &Eps + case 2339: state = 2350; break; // &eq -> &eqs + case 2363: state = 2364; break; // &eqslantle -> &eqslantles + case 2364: state = 2365; break; // &eqslantles -> &eqslantless + case 2374: state = 2375; break; // &equal -> &equals + case 2383: state = 2384; break; // &eque -> &eques + case 2405: state = 2406; break; // &eqvpar -> &eqvpars + case 2462: state = 2463; break; // &exi -> &exis + case 2467: state = 2468; break; // &Exi -> &Exis + case 2469: state = 2470; break; // &Exist -> &Exists + case 2503: state = 2697; break; // &f -> &fs + case 2512: state = 2513; break; // &fallingdot -> &fallingdots + case 2517: state = 2693; break; // &F -> &Fs + case 2601: state = 2602; break; // &fltn -> &fltns + case 2648: state = 2686; break; // &fra -> &fras + case 2701: state = 2927; break; // &g -> &gs + case 2708: state = 2923; break; // &G -> &Gs + case 2765: state = 2781; break; // &ge -> &ges + case 2771: state = 2775; break; // &geq -> &geqs + case 2796: state = 2797; break; // &gesle -> &gesles + case 2832: state = 2849; break; // &gn -> &gns + case 2879: state = 2880; break; // &GreaterEqualLe -> &GreaterEqualLes + case 2880: state = 2881; break; // &GreaterEqualLes -> &GreaterEqualLess + case 2902: state = 2903; break; // &GreaterLe -> &GreaterLes + case 2903: state = 2904; break; // &GreaterLes -> &GreaterLess + case 2961: state = 2962; break; // >que -> >ques + case 2965: state = 2998; break; // >r -> >rs + case 2983: state = 2984; break; // >reqle -> >reqles + case 2984: state = 2985; break; // >reqles -> >reqless + case 2989: state = 2990; break; // >reqqle -> >reqqles + case 2990: state = 2991; break; // >reqqles -> >reqqless + case 2994: state = 2995; break; // >rle -> >rles + case 2995: state = 2996; break; // >rles -> >rless + case 3014: state = 3184; break; // &H -> &Hs + case 3020: state = 3188; break; // &h -> &hs + case 3023: state = 3024; break; // &hair -> &hairs + case 3077: state = 3078; break; // &heart -> &hearts + case 3112: state = 3113; break; // &hk -> &hks + case 3193: state = 3194; break; // &hsla -> &hslas + case 3236: state = 3503; break; // &I -> &Is + case 3243: state = 3507; break; // &i -> &is + case 3375: state = 3376; break; // &Implie -> &Implies + case 3410: state = 3411; break; // &integer -> &integers + case 3424: state = 3425; break; // &Inter -> &Inters + case 3445: state = 3446; break; // &Invi -> &Invis + case 3460: state = 3461; break; // &InvisibleTime -> &InvisibleTimes + case 3499: state = 3500; break; // &ique -> &iques + case 3512: state = 3520; break; // &isin -> &isins + case 3555: state = 3590; break; // &J -> &Js + case 3561: state = 3594; break; // &j -> &js + case 3618: state = 3684; break; // &K -> &Ks + case 3624: state = 3688; break; // &k -> &ks + case 3692: state = 4652; break; // &l -> &ls + case 3698: state = 4658; break; // &L -> &Ls + case 3766: state = 3785; break; // &larr -> &larrs + case 3770: state = 3771; break; // &larrbf -> &larrbfs + case 3773: state = 3774; break; // &larrf -> &larrfs + case 3803: state = 3805; break; // &late -> &lates + case 3828: state = 3831; break; // &lbrk -> &lbrks + case 3869: state = 3891; break; // &ld -> &lds + case 3885: state = 3886; break; // &ldru -> &ldrus + case 3896: state = 4197; break; // &le -> &les + case 3898: state = 4238; break; // &Le -> &Les + case 4027: state = 4028; break; // &leftleftarrow -> &leftleftarrows + case 4056: state = 4074; break; // &leftright -> &leftrights + case 4061: state = 4063; break; // &leftrightarrow -> &leftrightarrows + case 4071: state = 4072; break; // &leftrightharpoon -> &leftrightharpoons + case 4117: state = 4118; break; // &leftthreetime -> &leftthreetimes + case 4187: state = 4191; break; // &leq -> &leqs + case 4197: state = 4215; break; // &les -> &less + case 4212: state = 4213; break; // &lesge -> &lesges + case 4215: state = 4280; break; // &less -> &lesss + case 4238: state = 4239; break; // &Les -> &Less + case 4276: state = 4277; break; // &LessLe -> &LessLes + case 4277: state = 4278; break; // &LessLes -> &LessLess + case 4302: state = 4303; break; // &lfi -> &lfis + case 4392: state = 4393; break; // &lmou -> &lmous + case 4401: state = 4418; break; // &ln -> &lns + case 4504: state = 4505; break; // &longmap -> &longmaps + case 4570: state = 4571; break; // &loplu -> &loplus + case 4576: state = 4577; break; // &lotime -> &lotimes + case 4580: state = 4581; break; // &lowa -> &lowas + case 4717: state = 4718; break; // <ime -> <imes + case 4727: state = 4728; break; // <que -> <ques + case 4744: state = 4745; break; // &lurd -> &lurds + case 4767: state = 4941; break; // &m -> &ms + case 4777: state = 4778; break; // &malte -> &maltes + case 4781: state = 4937; break; // &M -> &Ms + case 4785: state = 4787; break; // &map -> &maps + case 4821: state = 4822; break; // &mda -> &mdas + case 4831: state = 4832; break; // &mea -> &meas + case 4878: state = 4879; break; // &mida -> &midas + case 4891: state = 4892; break; // &minu -> &minus + case 4902: state = 4903; break; // &Minu -> &Minus + case 4906: state = 4907; break; // &MinusPlu -> &MinusPlus + case 4919: state = 4920; break; // &mnplu -> &mnplus + case 4925: state = 4926; break; // &model -> &models + case 4947: state = 4948; break; // &mstpo -> &mstpos + case 4965: state = 5895; break; // &n -> &ns + case 4971: state = 5904; break; // &N -> &Ns + case 4993: state = 4994; break; // &napo -> &napos + case 5006: state = 5008; break; // &natural -> &naturals + case 5010: state = 5011; break; // &nb -> &nbs + case 5060: state = 5061; break; // &nda -> &ndas + case 5064: state = 5140; break; // &ne -> &nes + case 5084: state = 5148; break; // &Ne -> &Nes + case 5168: state = 5169; break; // &NestedLe -> &NestedLes + case 5169: state = 5170; break; // &NestedLes -> &NestedLess + case 5172: state = 5173; break; // &NestedLessLe -> &NestedLessLes + case 5173: state = 5174; break; // &NestedLessLes -> &NestedLessLess + case 5183: state = 5184; break; // &nexi -> &nexis + case 5185: state = 5187; break; // &nexist -> &nexists + case 5195: state = 5215; break; // &ng -> &ngs + case 5198: state = 5210; break; // &nge -> &nges + case 5200: state = 5204; break; // &ngeq -> &ngeqs + case 5240: state = 5242; break; // &ni -> &nis + case 5256: state = 5328; break; // &nl -> &nls + case 5270: state = 5322; break; // &nle -> &nles + case 5312: state = 5316; break; // &nleq -> &nleqs + case 5322: state = 5324; break; // &nles -> &nless + case 5434: state = 5435; break; // &NotExi -> &NotExis + case 5436: state = 5437; break; // &NotExist -> &NotExists + case 5472: state = 5473; break; // &NotGreaterLe -> &NotGreaterLes + case 5473: state = 5474; break; // &NotGreaterLes -> &NotGreaterLess + case 5529: state = 5551; break; // &NotLe -> &NotLes + case 5551: state = 5552; break; // &NotLes -> &NotLess + case 5569: state = 5570; break; // &NotLessLe -> &NotLessLes + case 5570: state = 5571; break; // &NotLessLes -> &NotLessLess + case 5591: state = 5592; break; // &NotNe -> &NotNes + case 5612: state = 5613; break; // &NotNestedLe -> &NotNestedLes + case 5613: state = 5614; break; // &NotNestedLes -> &NotNestedLess + case 5616: state = 5617; break; // &NotNestedLessLe -> &NotNestedLessLes + case 5617: state = 5618; break; // &NotNestedLessLes -> &NotNestedLessLess + case 5636: state = 5637; break; // &NotPrecede -> &NotPrecedes + case 5660: state = 5661; break; // &NotRever -> &NotRevers + case 5702: state = 5703; break; // &NotSquareSub -> &NotSquareSubs + case 5715: state = 5716; break; // &NotSquareSuper -> &NotSquareSupers + case 5727: state = 5728; break; // &NotSub -> &NotSubs + case 5742: state = 5743; break; // &NotSucceed -> &NotSucceeds + case 5770: state = 5771; break; // &NotSuper -> &NotSupers + case 5823: state = 5831; break; // &npar -> &npars + case 5942: state = 5943; break; // &nsq -> &nsqs + case 5952: state = 5958; break; // &nsub -> &nsubs + case 5973: state = 5979; break; // &nsup -> &nsups + case 6034: state = 6040; break; // &num -> &nums + case 6043: state = 6107; break; // &nv -> &nvs + case 6049: state = 6050; break; // &nVDa -> &nVDas + case 6054: state = 6055; break; // &nVda -> &nVdas + case 6059: state = 6060; break; // &nvDa -> &nvDas + case 6064: state = 6065; break; // &nvda -> &nvdas + case 6131: state = 6378; break; // &O -> &Os + case 6138: state = 6382; break; // &o -> &os + case 6139: state = 6145; break; // &oa -> &oas + case 6163: state = 6185; break; // &od -> &ods + case 6164: state = 6165; break; // &oda -> &odas + case 6248: state = 6249; break; // &olcro -> &olcros + case 6249: state = 6250; break; // &olcros -> &olcross + case 6291: state = 6292; break; // &ominu -> &ominus + case 6337: state = 6338; break; // &oplu -> &oplus + case 6342: state = 6368; break; // &or -> &ors + case 6387: state = 6388; break; // &Osla -> &Oslas + case 6392: state = 6393; break; // &osla -> &oslas + case 6412: state = 6413; break; // &Otime -> &Otimes + case 6416: state = 6417; break; // &otime -> &otimes + case 6419: state = 6420; break; // &otimesa -> &otimesas + case 6458: state = 6459; break; // &OverParenthe -> &OverParenthes + case 6460: state = 6461; break; // &OverParenthesi -> &OverParenthesis + case 6463: state = 6799; break; // &p -> &ps + case 6465: state = 6474; break; // &par -> &pars + case 6482: state = 6795; break; // &P -> &Ps + case 6566: state = 6567; break; // &plu -> &plus + case 6567: state = 6599; break; // &plus -> &pluss + case 6588: state = 6589; break; // &Plu -> &Plus + case 6593: state = 6594; break; // &PlusMinu -> &PlusMinus + case 6642: state = 6786; break; // &pr -> &prs + case 6655: state = 6721; break; // &prec -> &precs + case 6676: state = 6677; break; // &Precede -> &Precedes + case 6705: state = 6717; break; // &precn -> &precns + case 6731: state = 6733; break; // &prime -> &primes + case 6735: state = 6741; break; // &prn -> &prns + case 6754: state = 6765; break; // &prof -> &profs + case 6809: state = 6810; break; // &punc -> &puncs + case 6813: state = 6839; break; // &Q -> &Qs + case 6817: state = 6843; break; // &q -> &qs + case 6855: state = 6856; break; // &quaternion -> &quaternions + case 6862: state = 6863; break; // &que -> &ques + case 6876: state = 7542; break; // &r -> &rs + case 6886: state = 7548; break; // &R -> &Rs + case 6932: state = 6956; break; // &rarr -> &rarrs + case 6939: state = 6940; break; // &rarrbf -> &rarrbfs + case 6944: state = 6945; break; // &rarrf -> &rarrfs + case 6983: state = 6984; break; // &rational -> &rationals + case 7012: state = 7015; break; // &rbrk -> &rbrks + case 7053: state = 7069; break; // &rd -> &rds + case 7076: state = 7087; break; // &real -> &reals + case 7099: state = 7100; break; // &Rever -> &Revers + case 7136: state = 7137; break; // &rfi -> &rfis + case 7199: state = 7431; break; // &ri -> &ris + case 7202: state = 7326; break; // &right -> &rights + case 7302: state = 7303; break; // &rightleftarrow -> &rightleftarrows + case 7311: state = 7312; break; // &rightleftharpoon -> &rightleftharpoons + case 7323: state = 7324; break; // &rightrightarrow -> &rightrightarrows + case 7362: state = 7363; break; // &rightthreetime -> &rightthreetimes + case 7437: state = 7438; break; // &risingdot -> &risingdots + case 7455: state = 7456; break; // &rmou -> &rmous + case 7492: state = 7493; break; // &roplu -> &roplus + case 7498: state = 7499; break; // &rotime -> &rotimes + case 7509: state = 7510; break; // &RoundImplie -> &RoundImplies + case 7575: state = 7576; break; // &rtime -> &rtimes + case 7610: state = 8073; break; // &S -> &Ss + case 7617: state = 8077; break; // &s -> &ss + case 7631: state = 7687; break; // &sc -> &scs + case 7670: state = 7676; break; // &scn -> &scns + case 7703: state = 7724; break; // &se -> &ses + case 7733: state = 7734; break; // &setminu -> &setminus + case 7870: state = 7871; break; // &simplu -> &simplus + case 7895: state = 7907; break; // &sma -> &smas + case 7897: state = 7898; break; // &small -> &smalls + case 7904: state = 7905; break; // &smallsetminu -> &smallsetminus + case 7914: state = 7915; break; // &smepar -> &smepars + case 7926: state = 7928; break; // &smte -> &smtes + case 7959: state = 7960; break; // &spade -> &spades + case 7968: state = 7984; break; // &sq -> &sqs + case 7971: state = 7973; break; // &sqcap -> &sqcaps + case 7976: state = 7978; break; // &sqcup -> &sqcups + case 7986: state = 7990; break; // &sqsub -> &sqsubs + case 7997: state = 8001; break; // &sqsup -> &sqsups + case 8023: state = 8024; break; // &SquareInter -> &SquareInters + case 8034: state = 8035; break; // &SquareSub -> &SquareSubs + case 8047: state = 8048; break; // &SquareSuper -> &SquareSupers + case 8113: state = 8114; break; // &straightep -> &straighteps + case 8124: state = 8125; break; // &strn -> &strns + case 8128: state = 8165; break; // &Sub -> &Subs + case 8131: state = 8169; break; // &sub -> &subs + case 8157: state = 8158; break; // &subplu -> &subplus + case 8199: state = 8265; break; // &succ -> &succs + case 8220: state = 8221; break; // &Succeed -> &Succeeds + case 8249: state = 8261; break; // &succn -> &succns + case 8282: state = 8348; break; // &Sup -> &Sups + case 8284: state = 8352; break; // &sup -> &sups + case 8292: state = 8296; break; // &supd -> &supds + case 8309: state = 8310; break; // &Super -> &Supers + case 8320: state = 8321; break; // &suph -> &suphs + case 8345: state = 8346; break; // &supplu -> &supplus + case 8400: state = 8705; break; // &T -> &Ts + case 8404: state = 8709; break; // &t -> &ts + case 8485: state = 8487; break; // &theta -> &thetas + case 8495: state = 8503; break; // &thick -> &thicks + case 8516: state = 8517; break; // &thin -> &thins + case 8527: state = 8531; break; // &thk -> &thks + case 8577: state = 8578; break; // &time -> × + case 8590: state = 8614; break; // &to -> &tos + case 8633: state = 8690; break; // &tri -> &tris + case 8673: state = 8674; break; // &triminu -> &triminus + case 8687: state = 8688; break; // &triplu -> &triplus + case 8768: state = 9153; break; // &U -> &Us + case 8775: state = 9157; break; // &u -> &us + case 8850: state = 8851; break; // &ufi -> &ufis + case 8940: state = 8941; break; // &UnderParenthe -> &UnderParenthes + case 8942: state = 8943; break; // &UnderParenthesi -> &UnderParenthesis + case 8951: state = 8952; break; // &UnionPlu -> &UnionPlus + case 8970: state = 9092; break; // &Up -> &Ups + case 8983: state = 9095; break; // &up -> &ups + case 9065: state = 9066; break; // &uplu -> &uplus + case 9124: state = 9125; break; // &upuparrow -> &upuparrows + case 9201: state = 9454; break; // &v -> &vs + case 9208: state = 9252; break; // &var -> &vars + case 9210: state = 9211; break; // &varep -> &vareps + case 9259: state = 9260; break; // &varsub -> &varsubs + case 9269: state = 9270; break; // &varsup -> &varsups + case 9303: state = 9450; break; // &V -> &Vs + case 9321: state = 9322; break; // &VDa -> &VDas + case 9326: state = 9327; break; // &Vda -> &Vdas + case 9331: state = 9332; break; // &vDa -> &vDas + case 9336: state = 9337; break; // &vda -> &vdas + case 9425: state = 9426; break; // &vn -> &vns + case 9473: state = 9474; break; // &Vvda -> &Vvdas + case 9484: state = 9540; break; // &W -> &Ws + case 9490: state = 9544; break; // &w -> &ws + case 9548: state = 9636; break; // &x -> &xs + case 9565: state = 9632; break; // &X -> &Xs + case 9599: state = 9600; break; // &xni -> &xnis + case 9615: state = 9616; break; // &xoplu -> &xoplus + case 9648: state = 9649; break; // &xuplu -> &xuplus + case 9665: state = 9724; break; // &Y -> &Ys + case 9672: state = 9728; break; // &y -> &ys + case 9747: state = 9840; break; // &Z -> &Zs + case 9754: state = 9844; break; // &z -> &zs default: return false; } break; case 't': switch (state) { - case 0: state = 6586; break; // & -> &t - case 1: state = 196; break; // &A -> &At + case 0: state = 8404; break; // & -> &t + case 1: state = 269; break; // &A -> &At case 4: state = 5; break; // &Aacu -> &Aacut - case 7: state = 201; break; // &a -> &at - case 10: state = 11; break; // &aacu -> &aacut - case 33: state = 34; break; // &acu -> &acut - case 118: state = 119; break; // &angr -> &angrt - case 123: state = 126; break; // &angs -> &angst - case 161: state = 162; break; // &ApplyFunc -> &ApplyFunct - case 183: state = 190; break; // &as -> &ast - case 217: state = 218; break; // &awconin -> &awconint - case 220: state = 221; break; // &awin -> &awint - case 272: state = 273; break; // &bbrk -> &bbrkt - case 288: state = 322; break; // &be -> &bet - case 293: state = 320; break; // &Be -> &Bet - case 301: state = 302; break; // &bemp -> &bempt - case 334: state = 364; break; // &big -> &bigt - case 343: state = 351; break; // &bigo -> &bigot - case 345: state = 346; break; // &bigodo -> &bigodot - case 356: state = 361; break; // &bigs -> &bigst - case 399: state = 413; break; // &black -> &blackt - case 427: state = 428; break; // &blacktrianglelef -> &blacktriangleleft - case 432: state = 433; break; // &blacktrianglerigh -> &blacktriangleright - case 452: state = 453; break; // &bNo -> &bNot - case 454: state = 455; break; // &bno -> &bnot - case 459: state = 462; break; // &bo -> &bot - case 462: state = 463; break; // &bot -> &bott - case 466: state = 467; break; // &bow -> &bowt - case 470: state = 503; break; // &box -> &boxt - case 571: state = 572; break; // &bulle -> &bullet - case 586: state = 587; break; // &Cacu -> &Cacut - case 589: state = 983; break; // &c -> &ct - case 592: state = 593; break; // &cacu -> &cacut - case 611: state = 612; break; // &capdo -> &capdot - case 613: state = 614; break; // &Capi -> &Capit - case 624: state = 625; break; // &CapitalDifferen -> &CapitalDifferent - case 632: state = 633; break; // &care -> &caret - case 670: state = 671; break; // &Cconin -> &Cconint - case 678: state = 679; break; // &Cdo -> &Cdot - case 681: state = 682; break; // &cdo -> &cdot - case 694: state = 695; break; // &cemp -> &cempt - case 698: state = 699; break; // &cen -> ¢ - case 700: state = 701; break; // &Cen -> &Cent - case 705: state = 706; break; // &CenterDo -> &CenterDot - case 710: state = 711; break; // ¢erdo -> ¢erdot - case 746: state = 747; break; // &circlearrowlef -> &circlearrowleft - case 751: state = 752; break; // &circlearrowrigh -> &circlearrowright - case 755: state = 756; break; // &circledas -> &circledast - case 771: state = 772; break; // &CircleDo -> &CircleDot - case 794: state = 795; break; // &cirfnin -> &cirfnint - case 813: state = 814; break; // &ClockwiseCon -> &ClockwiseCont - case 819: state = 820; break; // &ClockwiseContourIn -> &ClockwiseContourInt - case 841: state = 842; break; // &CloseCurlyDoubleQuo -> &CloseCurlyDoubleQuot - case 846: state = 847; break; // &CloseCurlyQuo -> &CloseCurlyQuot - case 854: state = 855; break; // &clubsui -> &clubsuit - case 869: state = 870; break; // &comma -> &commat - case 878: state = 879; break; // &complemen -> &complement - case 886: state = 887; break; // &congdo -> &congdot - case 888: state = 901; break; // &Con -> &Cont - case 893: state = 894; break; // &Congruen -> &Congruent - case 896: state = 897; break; // &Conin -> &Conint - case 899: state = 900; break; // &conin -> &conint - case 906: state = 907; break; // &ContourIn -> &ContourInt - case 924: state = 925; break; // &Coproduc -> &Coproduct - case 933: state = 934; break; // &Coun -> &Count - case 948: state = 949; break; // &CounterClockwiseCon -> &CounterClockwiseCont - case 954: state = 955; break; // &CounterClockwiseContourIn -> &CounterClockwiseContourInt - case 985: state = 986; break; // &ctdo -> &ctdot - case 1021: state = 1022; break; // &cupdo -> &cupdot - case 1063: state = 1064; break; // &curvearrowlef -> &curvearrowleft - case 1068: state = 1069; break; // &curvearrowrigh -> &curvearrowright - case 1081: state = 1082; break; // &cwconin -> &cwconint - case 1084: state = 1085; break; // &cwin -> &cwint - case 1088: state = 1089; break; // &cylc -> &cylct - case 1097: state = 1624; break; // &d -> &dt - case 1104: state = 1105; break; // &dale -> &dalet - case 1150: state = 1151; break; // &DDo -> &DDot - case 1156: state = 1157; break; // &ddo -> &ddot - case 1164: state = 1165; break; // &Del -> &Delt - case 1167: state = 1168; break; // &del -> &delt - case 1171: state = 1172; break; // &demp -> &dempt - case 1178: state = 1179; break; // &dfish -> &dfisht - case 1195: state = 1196; break; // &Diacri -> &Diacrit - case 1203: state = 1204; break; // &DiacriticalAcu -> &DiacriticalAcut - case 1207: state = 1208; break; // &DiacriticalDo -> &DiacriticalDot - case 1215: state = 1216; break; // &DiacriticalDoubleAcu -> &DiacriticalDoubleAcut - case 1240: state = 1241; break; // &diamondsui -> &diamondsuit - case 1249: state = 1250; break; // &Differen -> &Different - case 1268: state = 1269; break; // ÷on -> ÷ont - case 1291: state = 1302; break; // &do -> &dot - case 1296: state = 1301; break; // &Do -> &Dot - case 1304: state = 1305; break; // &DotDo -> &DotDot - case 1309: state = 1310; break; // &doteqdo -> &doteqdot - case 1349: state = 1350; break; // &DoubleCon -> &DoubleCont - case 1355: state = 1356; break; // &DoubleContourIn -> &DoubleContourInt - case 1363: state = 1364; break; // &DoubleDo -> &DoubleDot - case 1374: state = 1375; break; // &DoubleLef -> &DoubleLeft - case 1384: state = 1385; break; // &DoubleLeftRigh -> &DoubleLeftRight - case 1399: state = 1400; break; // &DoubleLongLef -> &DoubleLongLeft - case 1409: state = 1410; break; // &DoubleLongLeftRigh -> &DoubleLongLeftRight - case 1419: state = 1420; break; // &DoubleLongRigh -> &DoubleLongRight - case 1429: state = 1430; break; // &DoubleRigh -> &DoubleRight - case 1457: state = 1458; break; // &DoubleVer -> &DoubleVert - case 1519: state = 1520; break; // &downharpoonlef -> &downharpoonleft - case 1524: state = 1525; break; // &downharpoonrigh -> &downharpoonright - case 1528: state = 1529; break; // &DownLef -> &DownLeft - case 1533: state = 1534; break; // &DownLeftRigh -> &DownLeftRight - case 1537: state = 1538; break; // &DownLeftRightVec -> &DownLeftRightVect - case 1546: state = 1547; break; // &DownLeftTeeVec -> &DownLeftTeeVect - case 1552: state = 1553; break; // &DownLeftVec -> &DownLeftVect - case 1562: state = 1563; break; // &DownRigh -> &DownRight - case 1569: state = 1570; break; // &DownRightTeeVec -> &DownRightTeeVect - case 1575: state = 1576; break; // &DownRightVec -> &DownRightVect - case 1604: state = 1616; break; // &Ds -> &Dst - case 1607: state = 1620; break; // &ds -> &dst - case 1626: state = 1627; break; // &dtdo -> &dtdot - case 1656: state = 1910; break; // &E -> &Et - case 1659: state = 1660; break; // &Eacu -> &Eacut - case 1662: state = 1912; break; // &e -> &et - case 1665: state = 1666; break; // &eacu -> &eacut - case 1668: state = 1669; break; // &eas -> &east - case 1696: state = 1697; break; // &eDDo -> &eDDot - case 1699: state = 1700; break; // &Edo -> &Edot - case 1701: state = 1702; break; // &eDo -> &eDot - case 1704: state = 1705; break; // &edo -> &edot - case 1709: state = 1710; break; // &efDo -> &efDot - case 1726: state = 1727; break; // &egsdo -> &egsdot - case 1733: state = 1734; break; // &Elemen -> &Element - case 1736: state = 1737; break; // &elin -> &elint - case 1744: state = 1745; break; // &elsdo -> &elsdot - case 1754: state = 1755; break; // &emp -> &empt - case 1758: state = 1759; break; // &emptyse -> &emptyset - case 1760: state = 1761; break; // &Emp -> &Empt - case 1847: state = 1848; break; // &eqslan -> &eqslant - case 1849: state = 1850; break; // &eqslantg -> &eqslantgt - case 1870: state = 1871; break; // &eques -> &equest - case 1895: state = 1896; break; // &erDo -> &erDot - case 1904: state = 1905; break; // &esdo -> &esdot - case 1929: state = 1930; break; // &exis -> &exist - case 1933: state = 1934; break; // &Exis -> &Exist - case 1938: state = 1939; break; // &expec -> &expect - case 1940: state = 1941; break; // &expecta -> &expectat - case 1949: state = 1950; break; // &Exponen -> &Exponent - case 1958: state = 1959; break; // &exponen -> &exponent - case 1972: state = 1973; break; // &fallingdo -> &fallingdot - case 2040: state = 2046; break; // &fl -> &flt - case 2041: state = 2042; break; // &fla -> &flat - case 2072: state = 2073; break; // &Fourier -> &Fouriert - case 2078: state = 2079; break; // &fpar -> &fpart - case 2081: state = 2082; break; // &fpartin -> &fpartint - case 2118: state = 2294; break; // &g -> > - case 2121: state = 2122; break; // &gacu -> &gacut - case 2124: state = 2293; break; // &G -> &Gt - case 2160: state = 2161; break; // &Gdo -> &Gdot - case 2163: state = 2164; break; // &gdo -> &gdot - case 2174: state = 2175; break; // &geqslan -> &geqslant - case 2180: state = 2181; break; // &gesdo -> &gesdot - case 2234: state = 2235; break; // &Grea -> &Great - case 2259: state = 2260; break; // &GreaterGrea -> &GreaterGreat - case 2270: state = 2271; break; // &GreaterSlan -> &GreaterSlant - case 2300: state = 2301; break; // >do -> >dot - case 2309: state = 2310; break; // >ques -> >quest - case 2321: state = 2322; break; // >rdo -> >rdot - case 2343: state = 2344; break; // &gver -> &gvert - case 2352: state = 2385; break; // &Ha -> &Hat - case 2366: state = 2367; break; // &hamil -> &hamilt - case 2399: state = 2400; break; // &hear -> &heart - case 2403: state = 2404; break; // &heartsui -> &heartsuit - case 2421: state = 2422; break; // &Hilber -> &Hilbert - case 2444: state = 2445; break; // &hom -> &homt - case 2446: state = 2447; break; // &homth -> &homtht - case 2452: state = 2453; break; // &hooklef -> &hookleft - case 2462: state = 2463; break; // &hookrigh -> &hookright - case 2482: state = 2483; break; // &Horizon -> &Horizont - case 2490: state = 2500; break; // &Hs -> &Hst - case 2493: state = 2504; break; // &hs -> &hst - case 2533: state = 2756; break; // &I -> &It - case 2536: state = 2537; break; // &Iacu -> &Iacut - case 2539: state = 2755; break; // &i -> &it - case 2542: state = 2543; break; // &iacu -> &iacut - case 2556: state = 2557; break; // &Ido -> &Idot - case 2585: state = 2586; break; // &iiiin -> &iiiint - case 2587: state = 2588; break; // &iiin -> &iiint - case 2593: state = 2594; break; // &iio -> &iiot - case 2609: state = 2629; break; // &ima -> &imat - case 2627: state = 2628; break; // &imagpar -> &imagpart - case 2641: state = 2658; break; // &in -> &int - case 2648: state = 2649; break; // &infin -> &infint - case 2654: state = 2655; break; // &inodo -> &inodot - case 2656: state = 2657; break; // &In -> &Int - case 2679: state = 2680; break; // &Intersec -> &Intersect - case 2713: state = 2729; break; // &io -> &iot - case 2716: state = 2727; break; // &Io -> &Iot - case 2738: state = 2739; break; // &iques -> ¿ - case 2749: state = 2750; break; // &isindo -> &isindot - case 2794: state = 2795; break; // &jma -> &jmat - case 2881: state = 3692; break; // &l -> < - case 2882: state = 2957; break; // &lA -> &lAt - case 2886: state = 3691; break; // &L -> &Lt - case 2889: state = 2890; break; // &Lacu -> &Lacut - case 2892: state = 2956; break; // &la -> &lat - case 2894: state = 2895; break; // &lacu -> &lacut - case 2899: state = 2900; break; // &laemp -> &laempt - case 2927: state = 2928; break; // &Laplace -> &Laplacet - case 2939: state = 2954; break; // &larr -> &larrt - case 3034: state = 3035; break; // &Lef -> &Left - case 3046: state = 3047; break; // &LeftAngleBracke -> &LeftAngleBracket - case 3057: state = 3058; break; // &lef -> &left - case 3058: state = 3218; break; // &left -> &leftt - case 3063: state = 3077; break; // &leftarrow -> &leftarrowt - case 3070: state = 3071; break; // &LeftArrowRigh -> &LeftArrowRight - case 3099: state = 3100; break; // &LeftDoubleBracke -> &LeftDoubleBracket - case 3108: state = 3109; break; // &LeftDownTeeVec -> &LeftDownTeeVect - case 3114: state = 3115; break; // &LeftDownVec -> &LeftDownVect - case 3141: state = 3142; break; // &leftlef -> &leftleft - case 3152: state = 3153; break; // &LeftRigh -> &LeftRight - case 3162: state = 3163; break; // &Leftrigh -> &Leftright - case 3172: state = 3173; break; // &leftrigh -> &leftright - case 3200: state = 3201; break; // &LeftRightVec -> &LeftRightVect - case 3214: state = 3215; break; // &LeftTeeVec -> &LeftTeeVect - case 3222: state = 3223; break; // &leftthree -> &leftthreet - case 3251: state = 3252; break; // &LeftUpDownVec -> &LeftUpDownVect - case 3260: state = 3261; break; // &LeftUpTeeVec -> &LeftUpTeeVect - case 3266: state = 3267; break; // &LeftUpVec -> &LeftUpVect - case 3275: state = 3276; break; // &LeftVec -> &LeftVect - case 3289: state = 3290; break; // &leqslan -> &leqslant - case 3295: state = 3296; break; // &lesdo -> &lesdot - case 3310: state = 3311; break; // &lessdo -> &lessdot - case 3314: state = 3315; break; // &lesseqg -> &lesseqgt - case 3318: state = 3319; break; // &lesseqqg -> &lesseqqgt - case 3331: state = 3332; break; // &LessEqualGrea -> &LessEqualGreat - case 3347: state = 3348; break; // &LessGrea -> &LessGreat - case 3351: state = 3352; break; // &lessg -> &lessgt - case 3364: state = 3365; break; // &LessSlan -> &LessSlant - case 3379: state = 3380; break; // &lfish -> &lfisht - case 3409: state = 3431; break; // &ll -> &llt - case 3420: state = 3421; break; // &Llef -> &Lleft - case 3437: state = 3438; break; // &Lmido -> &Lmidot - case 3442: state = 3443; break; // &lmido -> &lmidot - case 3446: state = 3447; break; // &lmous -> &lmoust - case 3466: state = 3598; break; // &lo -> &lot - case 3480: state = 3481; break; // &LongLef -> &LongLeft - case 3489: state = 3490; break; // &Longlef -> &Longleft - case 3500: state = 3501; break; // &longlef -> &longleft - case 3510: state = 3511; break; // &LongLeftRigh -> &LongLeftRight - case 3520: state = 3521; break; // &Longleftrigh -> &Longleftright - case 3530: state = 3531; break; // &longleftrigh -> &longleftright - case 3540: state = 3541; break; // &longmaps -> &longmapst - case 3546: state = 3547; break; // &LongRigh -> &LongRight - case 3556: state = 3557; break; // &Longrigh -> &Longright - case 3566: state = 3567; break; // &longrigh -> &longright - case 3582: state = 3583; break; // &looparrowlef -> &looparrowleft - case 3587: state = 3588; break; // &looparrowrigh -> &looparrowright - case 3605: state = 3606; break; // &lowas -> &lowast - case 3615: state = 3616; break; // &LowerLef -> &LowerLeft - case 3625: state = 3626; break; // &LowerRigh -> &LowerRight - case 3641: state = 3642; break; // &lparl -> &lparlt - case 3643: state = 3658; break; // &lr -> &lrt - case 3661: state = 3686; break; // &ls -> &lst - case 3666: state = 3682; break; // &Ls -> &Lst - case 3698: state = 3699; break; // <do -> <dot - case 3715: state = 3716; break; // <ques -> <quest - case 3737: state = 3738; break; // &lver -> &lvert - case 3749: state = 3751; break; // &mal -> &malt - case 3759: state = 3760; break; // &maps -> &mapst - case 3768: state = 3769; break; // &mapstolef -> &mapstoleft - case 3790: state = 3791; break; // &mDDo -> &mDDot - case 3817: state = 3818; break; // &Mellin -> &Mellint - case 3833: state = 3834; break; // &midas -> &midast - case 3839: state = 3840; break; // &middo -> · - case 3879: state = 3882; break; // &ms -> &mst - case 3888: state = 3889; break; // &mul -> &mult - case 3897: state = 4718; break; // &n -> &nt - case 3898: state = 3924; break; // &na -> &nat - case 3902: state = 4721; break; // &N -> &Nt - case 3905: state = 3906; break; // &Nacu -> &Nacut - case 3909: state = 3910; break; // &nacu -> &nacut - case 3960: state = 3961; break; // &ncongdo -> &ncongdot - case 3982: state = 3983; break; // &nedo -> &nedot - case 3986: state = 3987; break; // &Nega -> &Negat - case 4041: state = 4042; break; // &Nes -> &Nest - case 4048: state = 4049; break; // &NestedGrea -> &NestedGreat - case 4055: state = 4056; break; // &NestedGreaterGrea -> &NestedGreaterGreat - case 4074: state = 4075; break; // &nexis -> &nexist - case 4081: state = 4098; break; // &ng -> &ngt - case 4089: state = 4090; break; // &ngeqslan -> &ngeqslant - case 4092: state = 4097; break; // &nG -> &nGt - case 4121: state = 4182; break; // &nl -> &nlt - case 4132: state = 4181; break; // &nL -> &nLt - case 4134: state = 4135; break; // &nLef -> &nLeft - case 4141: state = 4142; break; // &nlef -> &nleft - case 4151: state = 4152; break; // &nLeftrigh -> &nLeftright - case 4161: state = 4162; break; // &nleftrigh -> &nleftright - case 4173: state = 4174; break; // &nleqslan -> &nleqslant - case 4190: state = 4215; break; // &No -> &Not - case 4212: state = 4216; break; // &no -> ¬ - case 4224: state = 4225; break; // &NotCongruen -> &NotCongruent - case 4239: state = 4240; break; // &NotDoubleVer -> &NotDoubleVert - case 4253: state = 4254; break; // &NotElemen -> &NotElement - case 4266: state = 4267; break; // &NotExis -> &NotExist - case 4272: state = 4273; break; // &NotGrea -> &NotGreat - case 4293: state = 4294; break; // &NotGreaterGrea -> &NotGreaterGreat - case 4304: state = 4305; break; // &NotGreaterSlan -> &NotGreaterSlant - case 4336: state = 4337; break; // ¬indo -> ¬indot - case 4345: state = 4346; break; // &NotLef -> &NotLeft - case 4373: state = 4374; break; // &NotLessGrea -> &NotLessGreat - case 4384: state = 4385; break; // &NotLessSlan -> &NotLessSlant - case 4398: state = 4399; break; // &NotNes -> &NotNest - case 4405: state = 4406; break; // &NotNestedGrea -> &NotNestedGreat - case 4412: state = 4413; break; // &NotNestedGreaterGrea -> &NotNestedGreaterGreat - case 4446: state = 4447; break; // &NotPrecedesSlan -> &NotPrecedesSlant - case 4465: state = 4466; break; // &NotReverseElemen -> &NotReverseElement - case 4469: state = 4470; break; // &NotRigh -> &NotRight - case 4497: state = 4498; break; // &NotSquareSubse -> &NotSquareSubset - case 4508: state = 4509; break; // &NotSquareSuperse -> &NotSquareSuperset - case 4518: state = 4519; break; // &NotSubse -> &NotSubset - case 4539: state = 4540; break; // &NotSucceedsSlan -> &NotSucceedsSlant - case 4555: state = 4556; break; // &NotSuperse -> &NotSuperset - case 4588: state = 4589; break; // &NotVer -> &NotVert - case 4599: state = 4607; break; // &npar -> &npart - case 4611: state = 4612; break; // &npolin -> &npolint - case 4621: state = 4649; break; // &nr -> &nrt - case 4633: state = 4634; break; // &nRigh -> &nRight - case 4642: state = 4643; break; // &nrigh -> &nright - case 4665: state = 4666; break; // &nshor -> &nshort - case 4700: state = 4701; break; // &nsubse -> &nsubset - case 4713: state = 4714; break; // &nsupse -> &nsupset - case 4741: state = 4742; break; // &ntrianglelef -> &ntriangleleft - case 4748: state = 4749; break; // &ntrianglerigh -> &ntriangleright - case 4780: state = 4782; break; // &nvg -> &nvgt - case 4792: state = 4797; break; // &nvl -> &nvlt - case 4801: state = 4805; break; // &nvr -> &nvrt - case 4827: state = 5031; break; // &O -> &Ot - case 4830: state = 4831; break; // &Oacu -> &Oacut - case 4833: state = 5036; break; // &o -> &ot - case 4836: state = 4837; break; // &oacu -> &oacut - case 4839: state = 4840; break; // &oas -> &oast - case 4866: state = 4867; break; // &odo -> &odot - case 4887: state = 4899; break; // &og -> &ogt - case 4906: state = 4907; break; // &oin -> &oint - case 4908: state = 4922; break; // &ol -> &olt - case 4976: state = 4977; break; // &OpenCurlyDoubleQuo -> &OpenCurlyDoubleQuot - case 4981: state = 4982; break; // &OpenCurlyQuo -> &OpenCurlyQuot - case 5070: state = 5071; break; // &OverBracke -> &OverBracket - case 5076: state = 5077; break; // &OverParen -> &OverParent - case 5085: state = 5095; break; // &par -> &part - case 5098: state = 5099; break; // &Par -> &Part - case 5109: state = 5120; break; // &per -> &pert - case 5111: state = 5112; break; // &percn -> &percnt - case 5135: state = 5136; break; // &phmma -> &phmmat - case 5141: state = 5142; break; // &pi -> &pit - case 5159: state = 5185; break; // &plus -> &plust - case 5203: state = 5204; break; // &poin -> &point - case 5206: state = 5207; break; // &pointin -> &pointint - case 5252: state = 5253; break; // &PrecedesSlan -> &PrecedesSlant - case 5301: state = 5302; break; // &Produc -> &Product - case 5316: state = 5326; break; // &prop -> &propt - case 5319: state = 5320; break; // &Propor -> &Proport - case 5355: state = 5356; break; // &qin -> &qint - case 5375: state = 5376; break; // &qua -> &quat - case 5385: state = 5386; break; // &quatin -> &quatint - case 5388: state = 5389; break; // &ques -> &quest - case 5395: state = 5396; break; // &quo -> " - case 5397: state = 5951; break; // &r -> &rt - case 5398: state = 5462; break; // &rA -> &rAt - case 5402: state = 5466; break; // &ra -> &rat - case 5408: state = 5409; break; // &Racu -> &Racut - case 5411: state = 5412; break; // &racu -> &racut - case 5419: state = 5420; break; // &raemp -> &raempt - case 5435: state = 5457; break; // &Rarr -> &Rarrt - case 5439: state = 5459; break; // &rarr -> &rarrt - case 5549: state = 5550; break; // &realpar -> &realpart - case 5552: state = 5553; break; // &rec -> &rect - case 5567: state = 5568; break; // &ReverseElemen -> &ReverseElement - case 5595: state = 5596; break; // &rfish -> &rfisht - case 5619: state = 5620; break; // &Righ -> &Right - case 5631: state = 5632; break; // &RightAngleBracke -> &RightAngleBracket - case 5644: state = 5645; break; // &righ -> &right - case 5645: state = 5778; break; // &right -> &rightt - case 5650: state = 5663; break; // &rightarrow -> &rightarrowt - case 5656: state = 5657; break; // &RightArrowLef -> &RightArrowLeft - case 5685: state = 5686; break; // &RightDoubleBracke -> &RightDoubleBracket - case 5694: state = 5695; break; // &RightDownTeeVec -> &RightDownTeeVect - case 5700: state = 5701; break; // &RightDownVec -> &RightDownVect - case 5727: state = 5728; break; // &rightlef -> &rightleft - case 5746: state = 5747; break; // &rightrigh -> &rightright - case 5774: state = 5775; break; // &RightTeeVec -> &RightTeeVect - case 5782: state = 5783; break; // &rightthree -> &rightthreet - case 5811: state = 5812; break; // &RightUpDownVec -> &RightUpDownVect - case 5820: state = 5821; break; // &RightUpTeeVec -> &RightUpTeeVect - case 5826: state = 5827; break; // &RightUpVec -> &RightUpVect - case 5835: state = 5836; break; // &RightVec -> &RightVect - case 5849: state = 5850; break; // &risingdo -> &risingdot - case 5865: state = 5866; break; // &rmous -> &rmoust - case 5875: state = 5894; break; // &ro -> &rot - case 5912: state = 5913; break; // &rparg -> &rpargt - case 5918: state = 5919; break; // &rppolin -> &rppolint - case 5927: state = 5928; break; // &Rrigh -> &Rright - case 5964: state = 5965; break; // &rtril -> &rtrilt - case 5985: state = 6356; break; // &S -> &St - case 5988: state = 5989; break; // &Sacu -> &Sacut - case 5991: state = 6359; break; // &s -> &st - case 5994: state = 5995; break; // &sacu -> &sacut - case 6041: state = 6042; break; // &scpolin -> &scpolint - case 6049: state = 6050; break; // &sdo -> &sdot - case 6053: state = 6072; break; // &se -> &set - case 6064: state = 6065; break; // &sec -> § - case 6079: state = 6080; break; // &sex -> &sext - case 6106: state = 6107; break; // &Shor -> &Short - case 6119: state = 6120; break; // &ShortLef -> &ShortLeft - case 6127: state = 6128; break; // &shor -> &short - case 6143: state = 6144; break; // &ShortRigh -> &ShortRight - case 6170: state = 6171; break; // &simdo -> &simdot - case 6202: state = 6227; break; // &sm -> &smt - case 6207: state = 6208; break; // &smallse -> &smallset - case 6236: state = 6237; break; // &sof -> &soft - case 6255: state = 6256; break; // &spadesui -> &spadesuit - case 6267: state = 6268; break; // &Sqr -> &Sqrt - case 6274: state = 6275; break; // &sqsubse -> &sqsubset - case 6281: state = 6282; break; // &sqsupse -> &sqsupset - case 6294: state = 6295; break; // &SquareIn -> &SquareInt - case 6300: state = 6301; break; // &SquareIntersec -> &SquareIntersect - case 6309: state = 6310; break; // &SquareSubse -> &SquareSubset - case 6320: state = 6321; break; // &SquareSuperse -> &SquareSuperset - case 6341: state = 6352; break; // &ss -> &sst - case 6344: state = 6345; break; // &sse -> &sset - case 6367: state = 6368; break; // &straigh -> &straight - case 6386: state = 6387; break; // &subdo -> &subdot - case 6391: state = 6392; break; // &subedo -> &subedot - case 6395: state = 6396; break; // &submul -> &submult - case 6409: state = 6410; break; // &Subse -> &Subset - case 6412: state = 6413; break; // &subse -> &subset - case 6460: state = 6461; break; // &SucceedsSlan -> &SucceedsSlant - case 6493: state = 6494; break; // &SuchTha -> &SuchThat - case 6505: state = 6506; break; // &supdo -> &supdot - case 6513: state = 6514; break; // &supedo -> &supedot - case 6518: state = 6519; break; // &Superse -> &Superset - case 6537: state = 6538; break; // &supmul -> &supmult - case 6547: state = 6548; break; // &Supse -> &Supset - case 6550: state = 6551; break; // &supse -> &supset - case 6590: state = 6591; break; // &targe -> &target - case 6618: state = 6619; break; // &tdo -> &tdot - case 6630: state = 6648; break; // &the -> &thet - case 6635: state = 6646; break; // &The -> &Thet - case 6730: state = 6731; break; // &tin -> &tint - case 6737: state = 6738; break; // &topbo -> &topbot - case 6764: state = 6811; break; // &tri -> &trit - case 6776: state = 6777; break; // &trianglelef -> &triangleleft - case 6784: state = 6785; break; // &trianglerigh -> &triangleright - case 6789: state = 6790; break; // &trido -> &tridot - case 6803: state = 6804; break; // &TripleDo -> &TripleDot - case 6821: state = 6837; break; // &Ts -> &Tst - case 6824: state = 6841; break; // &ts -> &tst - case 6847: state = 6848; break; // &twix -> &twixt - case 6856: state = 6857; break; // &twoheadlef -> &twoheadleft - case 6866: state = 6867; break; // &twoheadrigh -> &twoheadright - case 6873: state = 7196; break; // &U -> &Ut - case 6876: state = 6877; break; // &Uacu -> &Uacut - case 6879: state = 7192; break; // &u -> &ut - case 6882: state = 6883; break; // &uacu -> &uacut - case 6939: state = 6940; break; // &ufish -> &ufisht - case 6965: state = 6975; break; // &ul -> &ult - case 6999: state = 7000; break; // &UnderBracke -> &UnderBracket - case 7005: state = 7006; break; // &UnderParen -> &UnderParent - case 7107: state = 7108; break; // &upharpoonlef -> &upharpoonleft - case 7112: state = 7113; break; // &upharpoonrigh -> &upharpoonright - case 7122: state = 7123; break; // &UpperLef -> &UpperLeft - case 7132: state = 7133; break; // &UpperRigh -> &UpperRight - case 7166: state = 7183; break; // &ur -> &urt - case 7194: state = 7195; break; // &utdo -> &utdot - case 7227: state = 7228; break; // &vangr -> &vangrt - case 7229: state = 7286; break; // &var -> &vart - case 7243: state = 7244; break; // &varno -> &varnot - case 7255: state = 7256; break; // &varprop -> &varpropt - case 7272: state = 7273; break; // &varsubse -> &varsubset - case 7280: state = 7281; break; // &varsupse -> &varsupset - case 7288: state = 7289; break; // &varthe -> &varthet - case 7300: state = 7301; break; // &vartrianglelef -> &vartriangleleft - case 7305: state = 7306; break; // &vartrianglerigh -> &vartriangleright - case 7349: state = 7357; break; // &Ver -> &Vert - case 7353: state = 7358; break; // &ver -> &vert - case 7375: state = 7376; break; // &VerticalSepara -> &VerticalSeparat - case 7398: state = 7399; break; // &vl -> &vlt - case 7417: state = 7418; break; // &vr -> &vrt - case 7486: state = 7487; break; // &wrea -> &wreat - case 7504: state = 7505; break; // &xd -> &xdt - case 7535: state = 7547; break; // &xo -> &xot - case 7537: state = 7538; break; // &xodo -> &xodot - case 7568: state = 7573; break; // &xu -> &xut - case 7587: state = 7588; break; // &Yacu -> &Yacut - case 7593: state = 7594; break; // &yacu -> &yacut - case 7648: state = 7649; break; // &Zacu -> &Zacut - case 7654: state = 7655; break; // &zacu -> &zacut - case 7670: state = 7671; break; // &Zdo -> &Zdot - case 7673: state = 7674; break; // &zdo -> &zdot - case 7675: state = 7695; break; // &ze -> &zet - case 7676: state = 7677; break; // &zee -> &zeet - case 7680: state = 7693; break; // &Ze -> &Zet - case 7685: state = 7686; break; // &ZeroWid -> &ZeroWidt + case 8: state = 275; break; // &a -> &at + case 11: state = 12; break; // &aacu -> &aacut + case 42: state = 43; break; // &acu -> &acut + case 164: state = 165; break; // &angr -> &angrt + case 172: state = 176; break; // &angs -> &angst + case 223: state = 224; break; // &ApplyFunc -> &ApplyFunct + case 251: state = 260; break; // &as -> &ast + case 294: state = 295; break; // &awconin -> &awconint + case 298: state = 299; break; // &awin -> &awint + case 362: state = 364; break; // &bbrk -> &bbrkt + case 384: state = 426; break; // &be -> &bet + case 390: state = 423; break; // &Be -> &Bet + case 400: state = 401; break; // &bemp -> &bempt + case 443: state = 481; break; // &big -> &bigt + case 455: state = 465; break; // &bigo -> &bigot + case 457: state = 458; break; // &bigodo -> &bigodot + case 471: state = 477; break; // &bigs -> &bigst + case 522: state = 538; break; // &black -> &blackt + case 554: state = 555; break; // &blacktrianglelef -> &blacktriangleleft + case 560: state = 561; break; // &blacktrianglerigh -> &blacktriangleright + case 588: state = 589; break; // &bNo -> &bNot + case 591: state = 592; break; // &bno -> &bnot + case 598: state = 602; break; // &bo -> &bot + case 602: state = 604; break; // &bot -> &bott + case 608: state = 609; break; // &bow -> &bowt + case 613: state = 667; break; // &box -> &boxt + case 771: state = 772; break; // &bulle -> &bullet + case 792: state = 793; break; // &Cacu -> &Cacut + case 796: state = 1287; break; // &c -> &ct + case 799: state = 800; break; // &cacu -> &cacut + case 825: state = 826; break; // &capdo -> &capdot + case 828: state = 829; break; // &Capi -> &Capit + case 839: state = 840; break; // &CapitalDifferen -> &CapitalDifferent + case 849: state = 850; break; // &care -> &caret + case 897: state = 898; break; // &Cconin -> &Cconint + case 908: state = 909; break; // &Cdo -> &Cdot + case 912: state = 913; break; // &cdo -> &cdot + case 928: state = 929; break; // &cemp -> &cempt + case 933: state = 934; break; // &cen -> ¢ + case 936: state = 937; break; // &Cen -> &Cent + case 941: state = 942; break; // &CenterDo -> &CenterDot + case 947: state = 948; break; // ¢erdo -> ¢erdot + case 995: state = 996; break; // &circlearrowlef -> &circlearrowleft + case 1001: state = 1002; break; // &circlearrowrigh -> &circlearrowright + case 1006: state = 1007; break; // &circledas -> &circledast + case 1025: state = 1026; break; // &CircleDo -> &CircleDot + case 1056: state = 1057; break; // &cirfnin -> &cirfnint + case 1078: state = 1079; break; // &ClockwiseCon -> &ClockwiseCont + case 1084: state = 1085; break; // &ClockwiseContourIn -> &ClockwiseContourInt + case 1107: state = 1108; break; // &CloseCurlyDoubleQuo -> &CloseCurlyDoubleQuot + case 1113: state = 1114; break; // &CloseCurlyQuo -> &CloseCurlyQuot + case 1123: state = 1124; break; // &clubsui -> &clubsuit + case 1144: state = 1146; break; // &comma -> &commat + case 1157: state = 1158; break; // &complemen -> &complement + case 1168: state = 1169; break; // &congdo -> &congdot + case 1171: state = 1187; break; // &Con -> &Cont + case 1176: state = 1177; break; // &Congruen -> &Congruent + case 1180: state = 1181; break; // &Conin -> &Conint + case 1184: state = 1185; break; // &conin -> &conint + case 1192: state = 1193; break; // &ContourIn -> &ContourInt + case 1214: state = 1215; break; // &Coproduc -> &Coproduct + case 1227: state = 1228; break; // &Coun -> &Count + case 1242: state = 1243; break; // &CounterClockwiseCon -> &CounterClockwiseCont + case 1248: state = 1249; break; // &CounterClockwiseContourIn -> &CounterClockwiseContourInt + case 1289: state = 1290; break; // &ctdo -> &ctdot + case 1338: state = 1339; break; // &cupdo -> &cupdot + case 1390: state = 1391; break; // &curvearrowlef -> &curvearrowleft + case 1396: state = 1397; break; // &curvearrowrigh -> &curvearrowright + case 1412: state = 1413; break; // &cwconin -> &cwconint + case 1416: state = 1417; break; // &cwin -> &cwint + case 1421: state = 1422; break; // &cylc -> &cylct + case 1432: state = 2067; break; // &d -> &dt + case 1440: state = 1441; break; // &dale -> &dalet + case 1503: state = 1504; break; // &DDo -> &DDot + case 1510: state = 1511; break; // &ddo -> &ddot + case 1520: state = 1522; break; // &Del -> &Delt + case 1525: state = 1526; break; // &del -> &delt + case 1530: state = 1531; break; // &demp -> &dempt + case 1538: state = 1539; break; // &dfish -> &dfisht + case 1561: state = 1562; break; // &Diacri -> &Diacrit + case 1569: state = 1570; break; // &DiacriticalAcu -> &DiacriticalAcut + case 1574: state = 1575; break; // &DiacriticalDo -> &DiacriticalDot + case 1583: state = 1584; break; // &DiacriticalDoubleAcu -> &DiacriticalDoubleAcut + case 1614: state = 1615; break; // &diamondsui -> &diamondsuit + case 1626: state = 1627; break; // &Differen -> &Different + case 1650: state = 1651; break; // ÷on -> ÷ont + case 1679: state = 1694; break; // &do -> &dot + case 1685: state = 1692; break; // &Do -> &Dot + case 1697: state = 1698; break; // &DotDo -> &DotDot + case 1704: state = 1705; break; // &doteqdo -> &doteqdot + case 1750: state = 1751; break; // &DoubleCon -> &DoubleCont + case 1756: state = 1757; break; // &DoubleContourIn -> &DoubleContourInt + case 1765: state = 1766; break; // &DoubleDo -> &DoubleDot + case 1778: state = 1779; break; // &DoubleLef -> &DoubleLeft + case 1789: state = 1790; break; // &DoubleLeftRigh -> &DoubleLeftRight + case 1806: state = 1807; break; // &DoubleLongLef -> &DoubleLongLeft + case 1817: state = 1818; break; // &DoubleLongLeftRigh -> &DoubleLongLeftRight + case 1828: state = 1829; break; // &DoubleLongRigh -> &DoubleLongRight + case 1839: state = 1840; break; // &DoubleRigh -> &DoubleRight + case 1871: state = 1872; break; // &DoubleVer -> &DoubleVert + case 1941: state = 1942; break; // &downharpoonlef -> &downharpoonleft + case 1947: state = 1948; break; // &downharpoonrigh -> &downharpoonright + case 1952: state = 1953; break; // &DownLef -> &DownLeft + case 1957: state = 1958; break; // &DownLeftRigh -> &DownLeftRight + case 1961: state = 1962; break; // &DownLeftRightVec -> &DownLeftRightVect + case 1971: state = 1972; break; // &DownLeftTeeVec -> &DownLeftTeeVect + case 1978: state = 1979; break; // &DownLeftVec -> &DownLeftVect + case 1990: state = 1991; break; // &DownRigh -> &DownRight + case 1997: state = 1998; break; // &DownRightTeeVec -> &DownRightTeeVect + case 2004: state = 2005; break; // &DownRightVec -> &DownRightVect + case 2040: state = 2057; break; // &Ds -> &Dst + case 2044: state = 2062; break; // &ds -> &dst + case 2069: state = 2070; break; // &dtdo -> &dtdot + case 2108: state = 2436; break; // &E -> &Et + case 2111: state = 2112; break; // &Eacu -> &Eacut + case 2115: state = 2439; break; // &e -> &et + case 2118: state = 2119; break; // &eacu -> &eacut + case 2122: state = 2123; break; // &eas -> &east + case 2159: state = 2160; break; // &eDDo -> &eDDot + case 2163: state = 2164; break; // &Edo -> &Edot + case 2166: state = 2167; break; // &eDo -> &eDot + case 2170: state = 2171; break; // &edo -> &edot + case 2177: state = 2178; break; // &efDo -> &efDot + case 2201: state = 2202; break; // &egsdo -> &egsdot + case 2210: state = 2211; break; // &Elemen -> &Element + case 2214: state = 2215; break; // &elin -> &elint + case 2225: state = 2226; break; // &elsdo -> &elsdot + case 2238: state = 2239; break; // &emp -> &empt + case 2243: state = 2244; break; // &emptyse -> &emptyset + case 2246: state = 2247; break; // &Emp -> &Empt + case 2356: state = 2357; break; // &eqslan -> &eqslant + case 2358: state = 2359; break; // &eqslantg -> &eqslantgt + case 2384: state = 2385; break; // &eques -> &equest + case 2415: state = 2416; break; // &erDo -> &erDot + case 2427: state = 2428; break; // &esdo -> &esdot + case 2463: state = 2464; break; // &exis -> &exist + case 2468: state = 2469; break; // &Exis -> &Exist + case 2474: state = 2475; break; // &expec -> &expect + case 2476: state = 2477; break; // &expecta -> &expectat + case 2486: state = 2487; break; // &Exponen -> &Exponent + case 2496: state = 2497; break; // &exponen -> &exponent + case 2511: state = 2512; break; // &fallingdo -> &fallingdot + case 2592: state = 2600; break; // &fl -> &flt + case 2593: state = 2594; break; // &fla -> &flat + case 2634: state = 2635; break; // &Fourier -> &Fouriert + case 2641: state = 2642; break; // &fpar -> &fpart + case 2644: state = 2645; break; // &fpartin -> &fpartint + case 2701: state = 2942; break; // &g -> > + case 2704: state = 2705; break; // &gacu -> &gacut + case 2708: state = 2940; break; // &G -> &Gt + case 2756: state = 2757; break; // &Gdo -> &Gdot + case 2760: state = 2761; break; // &gdo -> &gdot + case 2778: state = 2779; break; // &geqslan -> &geqslant + case 2787: state = 2788; break; // &gesdo -> &gesdot + case 2868: state = 2869; break; // &Grea -> &Great + case 2896: state = 2897; break; // &GreaterGrea -> &GreaterGreat + case 2909: state = 2910; break; // &GreaterSlan -> &GreaterSlant + case 2951: state = 2952; break; // >do -> >dot + case 2962: state = 2963; break; // >ques -> >quest + case 2977: state = 2978; break; // >rdo -> >rdot + case 3004: state = 3005; break; // &gver -> &gvert + case 3015: state = 3058; break; // &Ha -> &Hat + case 3032: state = 3033; break; // &hamil -> &hamilt + case 3076: state = 3077; break; // &hear -> &heart + case 3081: state = 3082; break; // &heartsui -> &heartsuit + case 3104: state = 3105; break; // &Hilber -> &Hilbert + case 3131: state = 3132; break; // &hom -> &homt + case 3133: state = 3134; break; // &homth -> &homtht + case 3140: state = 3141; break; // &hooklef -> &hookleft + case 3151: state = 3152; break; // &hookrigh -> &hookright + case 3175: state = 3176; break; // &Horizon -> &Horizont + case 3184: state = 3197; break; // &Hs -> &Hst + case 3188: state = 3202; break; // &hs -> &hst + case 3236: state = 3528; break; // &I -> &It + case 3239: state = 3240; break; // &Iacu -> &Iacut + case 3243: state = 3526; break; // &i -> &it + case 3246: state = 3247; break; // &iacu -> &iacut + case 3266: state = 3267; break; // &Ido -> &Idot + case 3305: state = 3306; break; // &iiiin -> &iiiint + case 3308: state = 3309; break; // &iiin -> &iiint + case 3316: state = 3317; break; // &iio -> &iiot + case 3337: state = 3362; break; // &ima -> &imat + case 3359: state = 3360; break; // &imagpar -> &imagpart + case 3378: state = 3401; break; // &in -> &int + case 3387: state = 3389; break; // &infin -> &infint + case 3395: state = 3396; break; // &inodo -> &inodot + case 3398: state = 3399; break; // &In -> &Int + case 3427: state = 3428; break; // &Intersec -> &Intersect + case 3467: state = 3489; break; // &io -> &iot + case 3471: state = 3486; break; // &Io -> &Iot + case 3500: state = 3501; break; // &iques -> ¿ + case 3515: state = 3516; break; // &isindo -> &isindot + case 3578: state = 3579; break; // &jma -> &jmat + case 3692: state = 4698; break; // &l -> < + case 3693: state = 3794; break; // &lA -> &lAt + case 3698: state = 4696; break; // &L -> &Lt + case 3701: state = 3702; break; // &Lacu -> &Lacut + case 3705: state = 3792; break; // &la -> &lat + case 3707: state = 3708; break; // &lacu -> &lacut + case 3713: state = 3714; break; // &laemp -> &laempt + case 3750: state = 3751; break; // &Laplace -> &Laplacet + case 3766: state = 3789; break; // &larr -> &larrt + case 3899: state = 3900; break; // &Lef -> &Left + case 3911: state = 3912; break; // &LeftAngleBracke -> &LeftAngleBracket + case 3925: state = 3926; break; // &lef -> &left + case 3926: state = 4109; break; // &left -> &leftt + case 3931: state = 3948; break; // &leftarrow -> &leftarrowt + case 3940: state = 3941; break; // &LeftArrowRigh -> &LeftArrowRight + case 3972: state = 3973; break; // &LeftDoubleBracke -> &LeftDoubleBracket + case 3982: state = 3983; break; // &LeftDownTeeVec -> &LeftDownTeeVect + case 3989: state = 3990; break; // &LeftDownVec -> &LeftDownVect + case 4021: state = 4022; break; // &leftlef -> &leftleft + case 4033: state = 4034; break; // &LeftRigh -> &LeftRight + case 4044: state = 4045; break; // &Leftrigh -> &Leftright + case 4055: state = 4056; break; // &leftrigh -> &leftright + case 4087: state = 4088; break; // &LeftRightVec -> &LeftRightVect + case 4104: state = 4105; break; // &LeftTeeVec -> &LeftTeeVect + case 4113: state = 4114; break; // &leftthree -> &leftthreet + case 4146: state = 4147; break; // &LeftUpDownVec -> &LeftUpDownVect + case 4156: state = 4157; break; // &LeftUpTeeVec -> &LeftUpTeeVect + case 4163: state = 4164; break; // &LeftUpVec -> &LeftUpVect + case 4174: state = 4175; break; // &LeftVec -> &LeftVect + case 4194: state = 4195; break; // &leqslan -> &leqslant + case 4203: state = 4204; break; // &lesdo -> &lesdot + case 4224: state = 4225; break; // &lessdo -> &lessdot + case 4229: state = 4230; break; // &lesseqg -> &lesseqgt + case 4234: state = 4235; break; // &lesseqqg -> &lesseqqgt + case 4248: state = 4249; break; // &LessEqualGrea -> &LessEqualGreat + case 4266: state = 4267; break; // &LessGrea -> &LessGreat + case 4271: state = 4272; break; // &lessg -> &lessgt + case 4287: state = 4288; break; // &LessSlan -> &LessSlant + case 4304: state = 4305; break; // &lfish -> &lfisht + case 4348: state = 4375; break; // &ll -> &llt + case 4362: state = 4363; break; // &Llef -> &Lleft + case 4382: state = 4383; break; // &Lmido -> &Lmidot + case 4388: state = 4389; break; // &lmido -> &lmidot + case 4393: state = 4394; break; // &lmous -> &lmoust + case 4422: state = 4573; break; // &lo -> &lot + case 4439: state = 4440; break; // &LongLef -> &LongLeft + case 4449: state = 4450; break; // &Longlef -> &Longleft + case 4461: state = 4462; break; // &longlef -> &longleft + case 4472: state = 4473; break; // &LongLeftRigh -> &LongLeftRight + case 4483: state = 4484; break; // &Longleftrigh -> &Longleftright + case 4494: state = 4495; break; // &longleftrigh -> &longleftright + case 4505: state = 4506; break; // &longmaps -> &longmapst + case 4512: state = 4513; break; // &LongRigh -> &LongRight + case 4523: state = 4524; break; // &Longrigh -> &Longright + case 4534: state = 4535; break; // &longrigh -> &longright + case 4551: state = 4552; break; // &looparrowlef -> &looparrowleft + case 4557: state = 4558; break; // &looparrowrigh -> &looparrowright + case 4581: state = 4582; break; // &lowas -> &lowast + case 4593: state = 4594; break; // &LowerLef -> &LowerLeft + case 4604: state = 4605; break; // &LowerRigh -> &LowerRight + case 4625: state = 4626; break; // &lparl -> &lparlt + case 4628: state = 4648; break; // &lr -> &lrt + case 4652: state = 4689; break; // &ls -> &lst + case 4658: state = 4684; break; // &Ls -> &Lst + case 4707: state = 4708; break; // <do -> <dot + case 4728: state = 4729; break; // <ques -> <quest + case 4757: state = 4758; break; // &lver -> &lvert + case 4772: state = 4775; break; // &mal -> &malt + case 4787: state = 4788; break; // &maps -> &mapst + case 4798: state = 4799; break; // &mapstolef -> &mapstoleft + case 4827: state = 4828; break; // &mDDo -> &mDDot + case 4857: state = 4858; break; // &Mellin -> &Mellint + case 4879: state = 4880; break; // &midas -> &midast + case 4887: state = 4888; break; // &middo -> · + case 4941: state = 4945; break; // &ms -> &mst + case 4954: state = 4955; break; // &mul -> &mult + case 4965: state = 5988; break; // &n -> &nt + case 4966: state = 5001; break; // &na -> &nat + case 4971: state = 5992; break; // &N -> &Nt + case 4974: state = 4975; break; // &Nacu -> &Nacut + case 4979: state = 4980; break; // &nacu -> &nacut + case 5049: state = 5050; break; // &ncongdo -> &ncongdot + case 5081: state = 5082; break; // &nedo -> &nedot + case 5086: state = 5087; break; // &Nega -> &Negat + case 5148: state = 5149; break; // &Nes -> &Nest + case 5155: state = 5156; break; // &NestedGrea -> &NestedGreat + case 5162: state = 5163; break; // &NestedGreaterGrea -> &NestedGreaterGreat + case 5184: state = 5185; break; // &nexis -> &nexist + case 5195: state = 5221; break; // &ng -> &ngt + case 5207: state = 5208; break; // &ngeqslan -> &ngeqslant + case 5212: state = 5219; break; // &nG -> &nGt + case 5256: state = 5334; break; // &nl -> &nlt + case 5272: state = 5332; break; // &nL -> &nLt + case 5274: state = 5275; break; // &nLef -> &nLeft + case 5282: state = 5283; break; // &nlef -> &nleft + case 5293: state = 5294; break; // &nLeftrigh -> &nLeftright + case 5304: state = 5305; break; // &nleftrigh -> &nleftright + case 5319: state = 5320; break; // &nleqslan -> &nleqslant + case 5347: state = 5376; break; // &No -> &Not + case 5372: state = 5378; break; // &no -> ¬ + case 5387: state = 5388; break; // &NotCongruen -> &NotCongruent + case 5404: state = 5405; break; // &NotDoubleVer -> &NotDoubleVert + case 5419: state = 5420; break; // &NotElemen -> &NotElement + case 5435: state = 5436; break; // &NotExis -> &NotExist + case 5442: state = 5443; break; // &NotGrea -> &NotGreat + case 5466: state = 5467; break; // &NotGreaterGrea -> &NotGreaterGreat + case 5479: state = 5480; break; // &NotGreaterSlan -> &NotGreaterSlant + case 5516: state = 5517; break; // ¬indo -> ¬indot + case 5530: state = 5531; break; // &NotLef -> &NotLeft + case 5563: state = 5564; break; // &NotLessGrea -> &NotLessGreat + case 5576: state = 5577; break; // &NotLessSlan -> &NotLessSlant + case 5592: state = 5593; break; // &NotNes -> &NotNest + case 5599: state = 5600; break; // &NotNestedGrea -> &NotNestedGreat + case 5606: state = 5607; break; // &NotNestedGreaterGrea -> &NotNestedGreaterGreat + case 5648: state = 5649; break; // &NotPrecedesSlan -> &NotPrecedesSlant + case 5668: state = 5669; break; // &NotReverseElemen -> &NotReverseElement + case 5673: state = 5674; break; // &NotRigh -> &NotRight + case 5704: state = 5705; break; // &NotSquareSubse -> &NotSquareSubset + case 5717: state = 5718; break; // &NotSquareSuperse -> &NotSquareSuperset + case 5729: state = 5730; break; // &NotSubse -> &NotSubset + case 5754: state = 5755; break; // &NotSucceedsSlan -> &NotSucceedsSlant + case 5772: state = 5773; break; // &NotSuperse -> &NotSuperset + case 5811: state = 5812; break; // &NotVer -> &NotVert + case 5823: state = 5834; break; // &npar -> &npart + case 5839: state = 5840; break; // &npolin -> &npolint + case 5855: state = 5889; break; // &nr -> &nrt + case 5871: state = 5872; break; // &nRigh -> &nRight + case 5881: state = 5882; break; // &nrigh -> &nright + case 5912: state = 5913; break; // &nshor -> &nshort + case 5959: state = 5960; break; // &nsubse -> &nsubset + case 5980: state = 5981; break; // &nsupse -> &nsupset + case 6015: state = 6016; break; // &ntrianglelef -> &ntriangleleft + case 6024: state = 6025; break; // &ntrianglerigh -> &ntriangleright + case 6068: state = 6071; break; // &nvg -> &nvgt + case 6084: state = 6091; break; // &nvl -> &nvlt + case 6097: state = 6102; break; // &nvr -> &nvrt + case 6131: state = 6399; break; // &O -> &Ot + case 6134: state = 6135; break; // &Oacu -> &Oacut + case 6138: state = 6405; break; // &o -> &ot + case 6141: state = 6142; break; // &oacu -> &oacut + case 6145: state = 6146; break; // &oas -> &oast + case 6182: state = 6183; break; // &odo -> &odot + case 6210: state = 6225; break; // &og -> &ogt + case 6235: state = 6236; break; // &oin -> &oint + case 6238: state = 6256; break; // &ol -> &olt + case 6322: state = 6323; break; // &OpenCurlyDoubleQuo -> &OpenCurlyDoubleQuot + case 6328: state = 6329; break; // &OpenCurlyQuo -> &OpenCurlyQuot + case 6448: state = 6449; break; // &OverBracke -> &OverBracket + case 6455: state = 6456; break; // &OverParen -> &OverParent + case 6465: state = 6480; break; // &par -> &part + case 6484: state = 6485; break; // &Par -> &Part + case 6498: state = 6513; break; // &per -> &pert + case 6500: state = 6501; break; // &percn -> &percnt + case 6534: state = 6535; break; // &phmma -> &phmmat + case 6543: state = 6545; break; // &pi -> &pit + case 6567: state = 6603; break; // &plus -> &plust + case 6624: state = 6625; break; // &poin -> &point + case 6627: state = 6628; break; // &pointin -> &pointint + case 6688: state = 6689; break; // &PrecedesSlan -> &PrecedesSlant + case 6751: state = 6752; break; // &Produc -> &Product + case 6770: state = 6783; break; // &prop -> &propt + case 6774: state = 6775; break; // &Propor -> &Proport + case 6822: state = 6823; break; // &qin -> &qint + case 6848: state = 6849; break; // &qua -> &quat + case 6859: state = 6860; break; // &quatin -> &quatint + case 6863: state = 6864; break; // &ques -> &quest + case 6873: state = 6874; break; // &quo -> " + case 6876: state = 7567; break; // &r -> &rt + case 6877: state = 6968; break; // &rA -> &rAt + case 6882: state = 6973; break; // &ra -> &rat + case 6889: state = 6890; break; // &Racu -> &Racut + case 6893: state = 6894; break; // &racu -> &racut + case 6903: state = 6904; break; // &raemp -> &raempt + case 6926: state = 6960; break; // &Rarr -> &Rarrt + case 6932: state = 6963; break; // &rarr -> &rarrt + case 7084: state = 7085; break; // &realpar -> &realpart + case 7089: state = 7090; break; // &rec -> &rect + case 7107: state = 7108; break; // &ReverseElemen -> &ReverseElement + case 7138: state = 7139; break; // &rfish -> &rfisht + case 7173: state = 7174; break; // &Righ -> &Right + case 7185: state = 7186; break; // &RightAngleBracke -> &RightAngleBracket + case 7201: state = 7202; break; // &righ -> &right + case 7202: state = 7354; break; // &right -> &rightt + case 7207: state = 7223; break; // &rightarrow -> &rightarrowt + case 7215: state = 7216; break; // &RightArrowLef -> &RightArrowLeft + case 7247: state = 7248; break; // &RightDoubleBracke -> &RightDoubleBracket + case 7257: state = 7258; break; // &RightDownTeeVec -> &RightDownTeeVect + case 7264: state = 7265; break; // &RightDownVec -> &RightDownVect + case 7296: state = 7297; break; // &rightlef -> &rightleft + case 7317: state = 7318; break; // &rightrigh -> &rightright + case 7349: state = 7350; break; // &RightTeeVec -> &RightTeeVect + case 7358: state = 7359; break; // &rightthree -> &rightthreet + case 7391: state = 7392; break; // &RightUpDownVec -> &RightUpDownVect + case 7401: state = 7402; break; // &RightUpTeeVec -> &RightUpTeeVect + case 7408: state = 7409; break; // &RightUpVec -> &RightUpVect + case 7419: state = 7420; break; // &RightVec -> &RightVect + case 7436: state = 7437; break; // &risingdo -> &risingdot + case 7456: state = 7457; break; // &rmous -> &rmoust + case 7469: state = 7495; break; // &ro -> &rot + case 7516: state = 7517; break; // &rparg -> &rpargt + case 7523: state = 7524; break; // &rppolin -> &rppolint + case 7534: state = 7535; break; // &Rrigh -> &Rright + case 7585: state = 7586; break; // &rtril -> &rtrilt + case 7610: state = 8096; break; // &S -> &St + case 7613: state = 7614; break; // &Sacu -> &Sacut + case 7617: state = 8100; break; // &s -> &st + case 7620: state = 7621; break; // &sacu -> &sacut + case 7684: state = 7685; break; // &scpolin -> &scpolint + case 7696: state = 7697; break; // &sdo -> &sdot + case 7703: state = 7729; break; // &se -> &set + case 7718: state = 7719; break; // &sec -> § + case 7738: state = 7739; break; // &sex -> &sext + case 7774: state = 7775; break; // &Shor -> &Short + case 7788: state = 7789; break; // &ShortLef -> &ShortLeft + case 7797: state = 7798; break; // &shor -> &short + case 7815: state = 7816; break; // &ShortRigh -> &ShortRight + case 7850: state = 7851; break; // &simdo -> &simdot + case 7894: state = 7924; break; // &sm -> &smt + case 7899: state = 7900; break; // &smallse -> &smallset + case 7937: state = 7938; break; // &sof -> &soft + case 7963: state = 7964; break; // &spadesui -> &spadesuit + case 7981: state = 7982; break; // &Sqr -> &Sqrt + case 7991: state = 7992; break; // &sqsubse -> &sqsubset + case 8002: state = 8003; break; // &sqsupse -> &sqsupset + case 8020: state = 8021; break; // &SquareIn -> &SquareInt + case 8026: state = 8027; break; // &SquareIntersec -> &SquareIntersect + case 8036: state = 8037; break; // &SquareSubse -> &SquareSubset + case 8049: state = 8050; break; // &SquareSuperse -> &SquareSuperset + case 8077: state = 8091; break; // &ss -> &sst + case 8081: state = 8082; break; // &sse -> &sset + case 8110: state = 8111; break; // &straigh -> &straight + case 8134: state = 8135; break; // &subdo -> &subdot + case 8142: state = 8143; break; // &subedo -> &subedot + case 8147: state = 8148; break; // &submul -> &submult + case 8166: state = 8167; break; // &Subse -> &Subset + case 8170: state = 8171; break; // &subse -> &subset + case 8232: state = 8233; break; // &SucceedsSlan -> &SucceedsSlant + case 8272: state = 8273; break; // &SuchTha -> &SuchThat + case 8293: state = 8294; break; // &supdo -> &supdot + case 8305: state = 8306; break; // &supedo -> &supedot + case 8311: state = 8312; break; // &Superse -> &Superset + case 8335: state = 8336; break; // &supmul -> &supmult + case 8349: state = 8350; break; // &Supse -> &Supset + case 8353: state = 8354; break; // &supse -> &supset + case 8408: state = 8409; break; // &targe -> &target + case 8446: state = 8447; break; // &tdo -> &tdot + case 8462: state = 8484; break; // &the -> &thet + case 8468: state = 8481; break; // &The -> &Thet + case 8587: state = 8588; break; // &tin -> &tint + case 8597: state = 8598; break; // &topbo -> &topbot + case 8633: state = 8693; break; // &tri -> &trit + case 8647: state = 8648; break; // &trianglelef -> &triangleleft + case 8658: state = 8659; break; // &trianglerigh -> &triangleright + case 8665: state = 8666; break; // &trido -> &tridot + case 8682: state = 8683; break; // &TripleDo -> &TripleDot + case 8705: state = 8727; break; // &Ts -> &Tst + case 8709: state = 8732; break; // &ts -> &tst + case 8739: state = 8740; break; // &twix -> &twixt + case 8749: state = 8750; break; // &twoheadlef -> &twoheadleft + case 8760: state = 8761; break; // &twoheadrigh -> &twoheadright + case 8768: state = 9166; break; // &U -> &Ut + case 8771: state = 8772; break; // &Uacu -> &Uacut + case 8775: state = 9161; break; // &u -> &ut + case 8778: state = 8779; break; // &uacu -> &uacut + case 8852: state = 8853; break; // &ufish -> &ufisht + case 8887: state = 8900; break; // &ul -> &ult + case 8930: state = 8931; break; // &UnderBracke -> &UnderBracket + case 8937: state = 8938; break; // &UnderParen -> &UnderParent + case 9055: state = 9056; break; // &upharpoonlef -> &upharpoonleft + case 9061: state = 9062; break; // &upharpoonrigh -> &upharpoonright + case 9073: state = 9074; break; // &UpperLef -> &UpperLeft + case 9084: state = 9085; break; // &UpperRigh -> &UpperRight + case 9127: state = 9149; break; // &ur -> &urt + case 9163: state = 9164; break; // &utdo -> &utdot + case 9205: state = 9206; break; // &vangr -> &vangrt + case 9208: state = 9279; break; // &var -> &vart + case 9224: state = 9225; break; // &varno -> &varnot + case 9239: state = 9240; break; // &varprop -> &varpropt + case 9261: state = 9262; break; // &varsubse -> &varsubset + case 9271: state = 9272; break; // &varsupse -> &varsupset + case 9281: state = 9282; break; // &varthe -> &varthet + case 9294: state = 9295; break; // &vartrianglelef -> &vartriangleleft + case 9300: state = 9301; break; // &vartrianglerigh -> &vartriangleright + case 9360: state = 9370; break; // &Ver -> &Vert + case 9365: state = 9372; break; // &ver -> &vert + case 9392: state = 9393; break; // &VerticalSepara -> &VerticalSeparat + case 9420: state = 9421; break; // &vl -> &vlt + case 9445: state = 9446; break; // &vr -> &vrt + case 9536: state = 9537; break; // &wrea -> &wreat + case 9560: state = 9561; break; // &xd -> &xdt + case 9602: state = 9618; break; // &xo -> &xot + case 9604: state = 9605; break; // &xodo -> &xodot + case 9645: state = 9651; break; // &xu -> &xut + case 9668: state = 9669; break; // &Yacu -> &Yacut + case 9675: state = 9676; break; // &yacu -> &yacut + case 9750: state = 9751; break; // &Zacu -> &Zacut + case 9757: state = 9758; break; // &zacu -> &zacut + case 9778: state = 9779; break; // &Zdo -> &Zdot + case 9782: state = 9783; break; // &zdo -> &zdot + case 9785: state = 9808; break; // &ze -> &zet + case 9786: state = 9787; break; // &zee -> &zeet + case 9791: state = 9805; break; // &Ze -> &Zet + case 9796: state = 9797; break; // &ZeroWid -> &ZeroWidt default: return false; } break; case 'u': switch (state) { - case 0: state = 6879; break; // & -> &u - case 1: state = 206; break; // &A -> &Au + case 0: state = 8775; break; // & -> &u + case 1: state = 281; break; // &A -> &Au case 3: state = 4; break; // &Aac -> &Aacu - case 7: state = 209; break; // &a -> &au - case 9: state = 10; break; // &aac -> &aacu - case 23: state = 33; break; // &ac -> &acu - case 158: state = 159; break; // &ApplyF -> &ApplyFu - case 222: state = 568; break; // &b -> &bu - case 247: state = 577; break; // &B -> &Bu - case 285: state = 286; break; // &bdq -> &bdqu - case 290: state = 291; break; // &beca -> &becau - case 295: state = 296; break; // &Beca -> &Becau - case 310: state = 311; break; // &berno -> &bernou - case 314: state = 315; break; // &Berno -> &Bernou - case 334: state = 378; break; // &big -> &bigu - case 335: state = 341; break; // &bigc -> &bigcu - case 348: state = 349; break; // &bigopl -> &bigoplu - case 358: state = 359; break; // &bigsqc -> &bigsqcu - case 371: state = 376; break; // &bigtriangle -> &bigtriangleu - case 380: state = 381; break; // &bigupl -> &biguplu - case 408: state = 409; break; // &blacksq -> &blacksqu - case 447: state = 448; break; // &bneq -> &bnequ - case 470: state = 511; break; // &box -> &boxu - case 484: state = 491; break; // &boxH -> &boxHu - case 485: state = 493; break; // &boxh -> &boxhu - case 496: state = 497; break; // &boxmin -> &boxminu - case 500: state = 501; break; // &boxpl -> &boxplu - case 565: state = 566; break; // &bsolhs -> &bsolhsu - case 583: state = 1004; break; // &C -> &Cu - case 585: state = 586; break; // &Cac -> &Cacu - case 589: state = 987; break; // &c -> &cu - case 591: state = 592; break; // &cac -> &cacu - case 602: state = 603; break; // &capbrc -> &capbrcu - case 605: state = 608; break; // &capc -> &capcu - case 641: state = 672; break; // &cc -> &ccu - case 777: state = 778; break; // &CircleMin -> &CircleMinu - case 781: state = 782; break; // &CirclePl -> &CirclePlu - case 815: state = 816; break; // &ClockwiseConto -> &ClockwiseContou - case 828: state = 829; break; // &CloseC -> &CloseCu - case 834: state = 835; break; // &CloseCurlyDo -> &CloseCurlyDou - case 839: state = 840; break; // &CloseCurlyDoubleQ -> &CloseCurlyDoubleQu - case 844: state = 845; break; // &CloseCurlyQ -> &CloseCurlyQu - case 849: state = 850; break; // &cl -> &clu - case 852: state = 853; break; // &clubs -> &clubsu - case 856: state = 932; break; // &Co -> &Cou - case 890: state = 891; break; // &Congr -> &Congru - case 902: state = 903; break; // &Conto -> &Contou - case 922: state = 923; break; // &Coprod -> &Coprodu - case 950: state = 951; break; // &CounterClockwiseConto -> &CounterClockwiseContou - case 975: state = 978; break; // &cs -> &csu - case 1015: state = 1018; break; // &cupc -> &cupcu - case 1039: state = 1040; break; // &curlyeqs -> &curlyeqsu - case 1097: state = 1631; break; // &d -> &du - case 1202: state = 1203; break; // &DiacriticalAc -> &DiacriticalAcu - case 1207: state = 1209; break; // &DiacriticalDo -> &DiacriticalDou - case 1214: state = 1215; break; // &DiacriticalDoubleAc -> &DiacriticalDoubleAcu - case 1238: state = 1239; break; // &diamonds -> &diamondsu - case 1291: state = 1331; break; // &do -> &dou - case 1296: state = 1343; break; // &Do -> &Dou - case 1312: state = 1313; break; // &DotEq -> &DotEqu - case 1318: state = 1319; break; // &dotmin -> &dotminu - case 1322: state = 1323; break; // &dotpl -> &dotplu - case 1326: state = 1327; break; // &dotsq -> &dotsqu - case 1351: state = 1352; break; // &DoubleConto -> &DoubleContou - case 1656: state = 1917; break; // &E -> &Eu - case 1658: state = 1659; break; // &Eac -> &Eacu - case 1662: state = 1920; break; // &e -> &eu - case 1664: state = 1665; break; // &eac -> &eacu - case 1769: state = 1770; break; // &EmptySmallSq -> &EmptySmallSqu - case 1785: state = 1786; break; // &EmptyVerySmallSq -> &EmptyVerySmallSqu - case 1818: state = 1819; break; // &epl -> &eplu - case 1833: state = 1860; break; // &eq -> &equ - case 1856: state = 1857; break; // &Eq -> &Equ - case 1877: state = 1878; break; // &Equilibri -> &Equilibriu - case 2016: state = 2017; break; // &FilledSmallSq -> &FilledSmallSqu - case 2031: state = 2032; break; // &FilledVerySmallSq -> &FilledVerySmallSqu - case 2052: state = 2068; break; // &Fo -> &Fou - case 2120: state = 2121; break; // &gac -> &gacu - case 2239: state = 2240; break; // &GreaterEq -> &GreaterEqu - case 2247: state = 2248; break; // &GreaterF -> &GreaterFu - case 2252: state = 2253; break; // &GreaterFullEq -> &GreaterFullEqu - case 2273: state = 2274; break; // &GreaterSlantEq -> &GreaterSlantEqu - case 2306: state = 2307; break; // >q -> >qu - case 2351: state = 2508; break; // &H -> &Hu - case 2401: state = 2402; break; // &hearts -> &heartsu - case 2515: state = 2516; break; // &HumpDownH -> &HumpDownHu - case 2520: state = 2521; break; // &HumpEq -> &HumpEqu - case 2525: state = 2526; break; // &hyb -> &hybu - case 2533: state = 2765; break; // &I -> &Iu - case 2535: state = 2536; break; // &Iac -> &Iacu - case 2539: state = 2769; break; // &i -> &iu - case 2541: state = 2542; break; // &iac -> &iacu - case 2735: state = 2736; break; // &iq -> &iqu - case 2777: state = 2817; break; // &J -> &Ju - case 2782: state = 2821; break; // &j -> &ju - case 2881: state = 3724; break; // &l -> &lu - case 2888: state = 2889; break; // &Lac -> &Lacu - case 2893: state = 2894; break; // &lac -> &lacu - case 2931: state = 2932; break; // &laq -> &laqu - case 2985: state = 2987; break; // &lbrksl -> &lbrkslu - case 2993: state = 3008; break; // &lc -> &lcu - case 3015: state = 3016; break; // &ldq -> &ldqu - case 3019: state = 3024; break; // &ldr -> &ldru - case 3089: state = 3090; break; // &LeftDo -> &LeftDou - case 3132: state = 3137; break; // &leftharpoon -> &leftharpoonu - case 3189: state = 3190; break; // &leftrightsq -> &leftrightsqu - case 3239: state = 3240; break; // &LeftTriangleEq -> &LeftTriangleEqu - case 3324: state = 3325; break; // &LessEq -> &LessEqu - case 3335: state = 3336; break; // &LessF -> &LessFu - case 3340: state = 3341; break; // &LessFullEq -> &LessFullEqu - case 3367: state = 3368; break; // &LessSlantEq -> &LessSlantEqu - case 3395: state = 3397; break; // &lhar -> &lharu - case 3444: state = 3445; break; // &lmo -> &lmou - case 3595: state = 3596; break; // &lopl -> &loplu - case 3663: state = 3664; break; // &lsaq -> &lsaqu - case 3677: state = 3679; break; // &lsq -> &lsqu - case 3712: state = 3713; break; // <q -> <qu - case 3725: state = 3731; break; // &lur -> &luru - case 3745: state = 3887; break; // &m -> &mu - case 3755: state = 3886; break; // &M -> &Mu - case 3761: state = 3770; break; // &mapsto -> &mapstou - case 3794: state = 3795; break; // &meas -> &measu - case 3806: state = 3807; break; // &Medi -> &Mediu - case 3841: state = 3842; break; // &min -> &minu - case 3845: state = 3846; break; // &minusd -> &minusdu - case 3848: state = 3849; break; // &Min -> &Minu - case 3852: state = 3853; break; // &MinusPl -> &MinusPlu - case 3862: state = 3863; break; // &mnpl -> &mnplu - case 3897: state = 4753; break; // &n -> &nu - case 3902: state = 4752; break; // &N -> &Nu - case 3904: state = 3905; break; // &Nac -> &Nacu - case 3908: state = 3909; break; // &nac -> &nacu - case 3924: state = 3925; break; // &nat -> &natu - case 3930: state = 3933; break; // &nb -> &nbu - case 3937: state = 3962; break; // &nc -> &ncu - case 3994: state = 3995; break; // &NegativeMedi -> &NegativeMediu - case 4031: state = 4032; break; // &neq -> &nequ - case 4217: state = 4226; break; // &NotC -> &NotCu - case 4221: state = 4222; break; // &NotCongr -> &NotCongru - case 4232: state = 4233; break; // &NotDo -> &NotDou - case 4255: state = 4256; break; // &NotEq -> &NotEqu - case 4277: state = 4278; break; // &NotGreaterEq -> &NotGreaterEqu - case 4281: state = 4282; break; // &NotGreaterF -> &NotGreaterFu - case 4286: state = 4287; break; // &NotGreaterFullEq -> &NotGreaterFullEqu - case 4307: state = 4308; break; // &NotGreaterSlantEq -> &NotGreaterSlantEqu - case 4316: state = 4317; break; // &NotH -> &NotHu - case 4324: state = 4325; break; // &NotHumpDownH -> &NotHumpDownHu - case 4329: state = 4330; break; // &NotHumpEq -> &NotHumpEqu - case 4359: state = 4360; break; // &NotLeftTriangleEq -> &NotLeftTriangleEqu - case 4366: state = 4367; break; // &NotLessEq -> &NotLessEqu - case 4387: state = 4388; break; // &NotLessSlantEq -> &NotLessSlantEqu - case 4439: state = 4440; break; // &NotPrecedesEq -> &NotPrecedesEqu - case 4449: state = 4450; break; // &NotPrecedesSlantEq -> &NotPrecedesSlantEqu - case 4483: state = 4484; break; // &NotRightTriangleEq -> &NotRightTriangleEqu - case 4487: state = 4515; break; // &NotS -> &NotSu - case 4488: state = 4489; break; // &NotSq -> &NotSqu - case 4493: state = 4494; break; // &NotSquareS -> &NotSquareSu - case 4500: state = 4501; break; // &NotSquareSubsetEq -> &NotSquareSubsetEqu - case 4511: state = 4512; break; // &NotSquareSupersetEq -> &NotSquareSupersetEqu - case 4521: state = 4522; break; // &NotSubsetEq -> &NotSubsetEqu - case 4532: state = 4533; break; // &NotSucceedsEq -> &NotSucceedsEqu - case 4542: state = 4543; break; // &NotSucceedsSlantEq -> &NotSucceedsSlantEqu - case 4558: state = 4559; break; // &NotSupersetEq -> &NotSupersetEqu - case 4568: state = 4569; break; // &NotTildeEq -> &NotTildeEqu - case 4572: state = 4573; break; // &NotTildeF -> &NotTildeFu - case 4577: state = 4578; break; // &NotTildeFullEq -> &NotTildeFullEqu - case 4614: state = 4615; break; // &nprc -> &nprcu - case 4653: state = 4695; break; // &ns -> &nsu - case 4655: state = 4656; break; // &nscc -> &nsccu - case 4689: state = 4690; break; // &nsqs -> &nsqsu - case 4827: state = 5049; break; // &O -> &Ou - case 4829: state = 4830; break; // &Oac -> &Oacu - case 4833: state = 5052; break; // &o -> &ou - case 4835: state = 4836; break; // &oac -> &oacu - case 4948: state = 4949; break; // &omin -> &ominu - case 4963: state = 4964; break; // &OpenC -> &OpenCu - case 4969: state = 4970; break; // &OpenCurlyDo -> &OpenCurlyDou - case 4974: state = 4975; break; // &OpenCurlyDoubleQ -> &OpenCurlyDoubleQu - case 4979: state = 4980; break; // &OpenCurlyQ -> &OpenCurlyQu - case 4987: state = 4988; break; // &opl -> &oplu - case 5083: state = 5343; break; // &p -> &pu - case 5150: state = 5158; break; // &pl -> &plu - case 5168: state = 5170; break; // &plusd -> &plusdu - case 5172: state = 5173; break; // &Pl -> &Plu - case 5177: state = 5178; break; // &PlusMin -> &PlusMinu - case 5201: state = 5212; break; // &po -> &pou - case 5216: state = 5331; break; // &pr -> &pru - case 5219: state = 5220; break; // &prc -> &prcu - case 5231: state = 5232; break; // &precc -> &preccu - case 5245: state = 5246; break; // &PrecedesEq -> &PrecedesEqu - case 5255: state = 5256; break; // &PrecedesSlantEq -> &PrecedesSlantEqu - case 5299: state = 5300; break; // &Prod -> &Produ - case 5312: state = 5313; break; // &profs -> &profsu - case 5351: state = 5374; break; // &q -> &qu - case 5397: state = 5978; break; // &r -> &ru - case 5403: state = 5411; break; // &rac -> &racu - case 5405: state = 5968; break; // &R -> &Ru - case 5407: state = 5408; break; // &Rac -> &Racu - case 5431: state = 5432; break; // &raq -> &raqu - case 5499: state = 5501; break; // &rbrksl -> &rbrkslu - case 5507: state = 5522; break; // &rc -> &rcu - case 5534: state = 5535; break; // &rdq -> &rdqu - case 5569: state = 5570; break; // &ReverseEq -> &ReverseEqu - case 5576: state = 5577; break; // &ReverseEquilibri -> &ReverseEquilibriu - case 5582: state = 5583; break; // &ReverseUpEq -> &ReverseUpEqu - case 5589: state = 5590; break; // &ReverseUpEquilibri -> &ReverseUpEquilibriu - case 5609: state = 5611; break; // &rhar -> &rharu - case 5675: state = 5676; break; // &RightDo -> &RightDou - case 5718: state = 5723; break; // &rightharpoon -> &rightharpoonu - case 5755: state = 5756; break; // &rightsq -> &rightsqu - case 5799: state = 5800; break; // &RightTriangleEq -> &RightTriangleEqu - case 5863: state = 5864; break; // &rmo -> &rmou - case 5887: state = 5899; break; // &Ro -> &Rou - case 5891: state = 5892; break; // &ropl -> &roplu - case 5936: state = 5937; break; // &rsaq -> &rsaqu - case 5946: state = 5948; break; // &rsq -> &rsqu - case 5979: state = 5980; break; // &rul -> &rulu - case 5985: state = 6381; break; // &S -> &Su - case 5987: state = 5988; break; // &Sac -> &Sacu - case 5991: state = 6383; break; // &s -> &su - case 5993: state = 5994; break; // &sac -> &sacu - case 5998: state = 5999; break; // &sbq -> &sbqu - case 6012: state = 6013; break; // &scc -> &sccu - case 6075: state = 6076; break; // &setmin -> &setminu - case 6181: state = 6182; break; // &simpl -> &simplu - case 6211: state = 6212; break; // &smallsetmin -> &smallsetminu - case 6253: state = 6254; break; // &spades -> &spadesu - case 6258: state = 6285; break; // &sq -> &squ - case 6259: state = 6263; break; // &sqc -> &sqcu - case 6266: state = 6286; break; // &Sq -> &Squ - case 6269: state = 6270; break; // &sqs -> &sqsu - case 6305: state = 6306; break; // &SquareS -> &SquareSu - case 6312: state = 6313; break; // &SquareSubsetEq -> &SquareSubsetEqu - case 6323: state = 6324; break; // &SquareSupersetEq -> &SquareSupersetEqu - case 6393: state = 6394; break; // &subm -> &submu - case 6401: state = 6402; break; // &subpl -> &subplu - case 6411: state = 6428; break; // &subs -> &subsu - case 6418: state = 6419; break; // &SubsetEq -> &SubsetEqu - case 6439: state = 6440; break; // &succc -> &succcu - case 6453: state = 6454; break; // &SucceedsEq -> &SucceedsEqu - case 6463: state = 6464; break; // &SucceedsSlantEq -> &SucceedsSlantEqu - case 6507: state = 6508; break; // &supds -> &supdsu - case 6521: state = 6522; break; // &SupersetEq -> &SupersetEqu - case 6526: state = 6529; break; // &suphs -> &suphsu - case 6535: state = 6536; break; // &supm -> &supmu - case 6543: state = 6544; break; // &suppl -> &supplu - case 6549: state = 6561; break; // &sups -> &supsu - case 6584: state = 6592; break; // &Ta -> &Tau - case 6587: state = 6593; break; // &ta -> &tau - case 6705: state = 6706; break; // &TildeEq -> &TildeEqu - case 6709: state = 6710; break; // &TildeF -> &TildeFu - case 6714: state = 6715; break; // &TildeFullEq -> &TildeFullEqu - case 6794: state = 6795; break; // &trimin -> &triminu - case 6806: state = 6807; break; // &tripl -> &triplu - case 6818: state = 6819; break; // &trpezi -> &trpeziu - case 6873: state = 7212; break; // &U -> &Uu - case 6875: state = 6876; break; // &Uac -> &Uacu - case 6879: state = 7208; break; // &u -> &uu - case 6881: state = 6882; break; // &uac -> &uacu - case 7016: state = 7017; break; // &UnionPl -> &UnionPlu - case 7042: state = 7158; break; // &up -> &upu - case 7088: state = 7089; break; // &UpEq -> &UpEqu - case 7095: state = 7096; break; // &UpEquilibri -> &UpEquilibriu - case 7114: state = 7115; break; // &upl -> &uplu - case 7264: state = 7269; break; // &vars -> &varsu - case 7403: state = 7404; break; // &vns -> &vnsu - case 7424: state = 7427; break; // &vs -> &vsu - case 7495: state = 7568; break; // &x -> &xu - case 7496: state = 7502; break; // &xc -> &xcu - case 7544: state = 7545; break; // &xopl -> &xoplu - case 7565: state = 7566; break; // &xsqc -> &xsqcu - case 7570: state = 7571; break; // &xupl -> &xuplu - case 7584: state = 7640; break; // &Y -> &Yu - case 7586: state = 7587; break; // &Yac -> &Yacu - case 7590: state = 7637; break; // &y -> &yu - case 7592: state = 7593; break; // &yac -> &yacu - case 7647: state = 7648; break; // &Zac -> &Zacu - case 7653: state = 7654; break; // &zac -> &zacu + case 8: state = 285; break; // &a -> &au + case 10: state = 11; break; // &aac -> &aacu + case 27: state = 42; break; // &ac -> &acu + case 220: state = 221; break; // &ApplyF -> &ApplyFu + case 301: state = 767; break; // &b -> &bu + case 331: state = 781; break; // &B -> &Bu + case 380: state = 381; break; // &bdq -> &bdqu + case 386: state = 387; break; // &beca -> &becau + case 392: state = 393; break; // &Beca -> &Becau + case 411: state = 412; break; // &berno -> &bernou + case 416: state = 417; break; // &Berno -> &Bernou + case 443: state = 497; break; // &big -> &bigu + case 444: state = 452; break; // &bigc -> &bigcu + case 461: state = 462; break; // &bigopl -> &bigoplu + case 473: state = 474; break; // &bigsqc -> &bigsqcu + case 488: state = 494; break; // &bigtriangle -> &bigtriangleu + case 499: state = 500; break; // &bigupl -> &biguplu + case 532: state = 533; break; // &blacksq -> &blacksqu + case 582: state = 583; break; // &bneq -> &bnequ + case 613: state = 678; break; // &box -> &boxu + case 636: state = 650; break; // &boxH -> &boxHu + case 638: state = 654; break; // &boxh -> &boxhu + case 658: state = 659; break; // &boxmin -> &boxminu + case 663: state = 664; break; // &boxpl -> &boxplu + case 763: state = 764; break; // &bsolhs -> &bsolhsu + case 789: state = 1315; break; // &C -> &Cu + case 791: state = 792; break; // &Cac -> &Cacu + case 796: state = 1292; break; // &c -> &cu + case 798: state = 799; break; // &cac -> &cacu + case 813: state = 814; break; // &capbrc -> &capbrcu + case 817: state = 821; break; // &capc -> &capcu + case 861: state = 900; break; // &cc -> &ccu + case 1034: state = 1035; break; // &CircleMin -> &CircleMinu + case 1039: state = 1040; break; // &CirclePl -> &CirclePlu + case 1080: state = 1081; break; // &ClockwiseConto -> &ClockwiseContou + case 1094: state = 1095; break; // &CloseC -> &CloseCu + case 1100: state = 1101; break; // &CloseCurlyDo -> &CloseCurlyDou + case 1105: state = 1106; break; // &CloseCurlyDoubleQ -> &CloseCurlyDoubleQu + case 1111: state = 1112; break; // &CloseCurlyQ -> &CloseCurlyQu + case 1117: state = 1118; break; // &cl -> &clu + case 1120: state = 1122; break; // &clubs -> &clubsu + case 1126: state = 1226; break; // &Co -> &Cou + case 1173: state = 1174; break; // &Congr -> &Congru + case 1188: state = 1189; break; // &Conto -> &Contou + case 1212: state = 1213; break; // &Coprod -> &Coprodu + case 1244: state = 1245; break; // &CounterClockwiseConto -> &CounterClockwiseContou + case 1274: state = 1278; break; // &cs -> &csu + case 1330: state = 1334; break; // &cupc -> &cupcu + case 1362: state = 1363; break; // &curlyeqs -> &curlyeqsu + case 1432: state = 2077; break; // &d -> &du + case 1568: state = 1569; break; // &DiacriticalAc -> &DiacriticalAcu + case 1574: state = 1577; break; // &DiacriticalDo -> &DiacriticalDou + case 1582: state = 1583; break; // &DiacriticalDoubleAc -> &DiacriticalDoubleAcu + case 1612: state = 1613; break; // &diamonds -> &diamondsu + case 1679: state = 1731; break; // &do -> &dou + case 1685: state = 1744; break; // &Do -> &Dou + case 1708: state = 1709; break; // &DotEq -> &DotEqu + case 1715: state = 1716; break; // &dotmin -> &dotminu + case 1720: state = 1721; break; // &dotpl -> &dotplu + case 1725: state = 1726; break; // &dotsq -> &dotsqu + case 1752: state = 1753; break; // &DoubleConto -> &DoubleContou + case 2108: state = 2447; break; // &E -> &Eu + case 2110: state = 2111; break; // &Eac -> &Eacu + case 2115: state = 2451; break; // &e -> &eu + case 2117: state = 2118; break; // &eac -> &eacu + case 2255: state = 2256; break; // &EmptySmallSq -> &EmptySmallSqu + case 2273: state = 2274; break; // &EmptyVerySmallSq -> &EmptyVerySmallSqu + case 2319: state = 2320; break; // &epl -> &eplu + case 2339: state = 2372; break; // &eq -> &equ + case 2367: state = 2368; break; // &Eq -> &Equ + case 2392: state = 2393; break; // &Equilibri -> &Equilibriu + case 2565: state = 2566; break; // &FilledSmallSq -> &FilledSmallSqu + case 2581: state = 2582; break; // &FilledVerySmallSq -> &FilledVerySmallSqu + case 2608: state = 2630; break; // &Fo -> &Fou + case 2703: state = 2704; break; // &gac -> &gacu + case 2873: state = 2874; break; // &GreaterEq -> &GreaterEqu + case 2883: state = 2884; break; // &GreaterF -> &GreaterFu + case 2888: state = 2889; break; // &GreaterFullEq -> &GreaterFullEqu + case 2912: state = 2913; break; // &GreaterSlantEq -> &GreaterSlantEqu + case 2959: state = 2960; break; // >q -> >qu + case 3014: state = 3207; break; // &H -> &Hu + case 3078: state = 3080; break; // &hearts -> &heartsu + case 3214: state = 3215; break; // &HumpDownH -> &HumpDownHu + case 3220: state = 3221; break; // &HumpEq -> &HumpEqu + case 3226: state = 3227; break; // &hyb -> &hybu + case 3236: state = 3539; break; // &I -> &Iu + case 3238: state = 3239; break; // &Iac -> &Iacu + case 3243: state = 3544; break; // &i -> &iu + case 3245: state = 3246; break; // &iac -> &iacu + case 3497: state = 3498; break; // &iq -> &iqu + case 3555: state = 3608; break; // &J -> &Ju + case 3561: state = 3613; break; // &j -> &ju + case 3692: state = 4742; break; // &l -> &lu + case 3700: state = 3701; break; // &Lac -> &Lacu + case 3706: state = 3707; break; // &lac -> &lacu + case 3755: state = 3756; break; // &laq -> &laqu + case 3832: state = 3835; break; // &lbrksl -> &lbrkslu + case 3843: state = 3862; break; // &lc -> &lcu + case 3873: state = 3874; break; // &ldq -> &ldqu + case 3879: state = 3885; break; // &ldr -> &ldru + case 3962: state = 3963; break; // &LeftDo -> &LeftDou + case 4010: state = 4016; break; // &leftharpoon -> &leftharpoonu + case 4075: state = 4076; break; // &leftrightsq -> &leftrightsqu + case 4133: state = 4134; break; // &LeftTriangleEq -> &LeftTriangleEqu + case 4241: state = 4242; break; // &LessEq -> &LessEqu + case 4253: state = 4254; break; // &LessF -> &LessFu + case 4258: state = 4259; break; // &LessFullEq -> &LessFullEqu + case 4290: state = 4291; break; // &LessSlantEq -> &LessSlantEqu + case 4327: state = 4330; break; // &lhar -> &lharu + case 4391: state = 4392; break; // &lmo -> &lmou + case 4569: state = 4570; break; // &lopl -> &loplu + case 4654: state = 4655; break; // &lsaq -> &lsaqu + case 4676: state = 4679; break; // &lsq -> &lsqu + case 4725: state = 4726; break; // <q -> <qu + case 4743: state = 4750; break; // &lur -> &luru + case 4767: state = 4952; break; // &m -> &mu + case 4781: state = 4950; break; // &M -> &Mu + case 4789: state = 4801; break; // &mapsto -> &mapstou + case 4832: state = 4833; break; // &meas -> &measu + case 4845: state = 4846; break; // &Medi -> &Mediu + case 4890: state = 4891; break; // &min -> &minu + case 4896: state = 4898; break; // &minusd -> &minusdu + case 4901: state = 4902; break; // &Min -> &Minu + case 4905: state = 4906; break; // &MinusPl -> &MinusPlu + case 4918: state = 4919; break; // &mnpl -> &mnplu + case 4965: state = 6032; break; // &n -> &nu + case 4971: state = 6030; break; // &N -> &Nu + case 4973: state = 4974; break; // &Nac -> &Nacu + case 4978: state = 4979; break; // &nac -> &nacu + case 5001: state = 5002; break; // &nat -> &natu + case 5010: state = 5014; break; // &nb -> &nbu + case 5020: state = 5052; break; // &nc -> &ncu + case 5094: state = 5095; break; // &NegativeMedi -> &NegativeMediu + case 5135: state = 5136; break; // &neq -> &nequ + case 5380: state = 5390; break; // &NotC -> &NotCu + case 5384: state = 5385; break; // &NotCongr -> &NotCongru + case 5397: state = 5398; break; // &NotDo -> &NotDou + case 5422: state = 5423; break; // &NotEq -> &NotEqu + case 5448: state = 5449; break; // &NotGreaterEq -> &NotGreaterEqu + case 5453: state = 5454; break; // &NotGreaterF -> &NotGreaterFu + case 5458: state = 5459; break; // &NotGreaterFullEq -> &NotGreaterFullEqu + case 5482: state = 5483; break; // &NotGreaterSlantEq -> &NotGreaterSlantEqu + case 5493: state = 5494; break; // &NotH -> &NotHu + case 5501: state = 5502; break; // &NotHumpDownH -> &NotHumpDownHu + case 5507: state = 5508; break; // &NotHumpEq -> &NotHumpEqu + case 5546: state = 5547; break; // &NotLeftTriangleEq -> &NotLeftTriangleEqu + case 5555: state = 5556; break; // &NotLessEq -> &NotLessEqu + case 5579: state = 5580; break; // &NotLessSlantEq -> &NotLessSlantEqu + case 5640: state = 5641; break; // &NotPrecedesEq -> &NotPrecedesEqu + case 5651: state = 5652; break; // &NotPrecedesSlantEq -> &NotPrecedesSlantEqu + case 5689: state = 5690; break; // &NotRightTriangleEq -> &NotRightTriangleEqu + case 5694: state = 5726; break; // &NotS -> &NotSu + case 5695: state = 5696; break; // &NotSq -> &NotSqu + case 5700: state = 5701; break; // &NotSquareS -> &NotSquareSu + case 5708: state = 5709; break; // &NotSquareSubsetEq -> &NotSquareSubsetEqu + case 5721: state = 5722; break; // &NotSquareSupersetEq -> &NotSquareSupersetEqu + case 5733: state = 5734; break; // &NotSubsetEq -> &NotSubsetEqu + case 5746: state = 5747; break; // &NotSucceedsEq -> &NotSucceedsEqu + case 5757: state = 5758; break; // &NotSucceedsSlantEq -> &NotSucceedsSlantEqu + case 5776: state = 5777; break; // &NotSupersetEq -> &NotSupersetEqu + case 5788: state = 5789; break; // &NotTildeEq -> &NotTildeEqu + case 5793: state = 5794; break; // &NotTildeF -> &NotTildeFu + case 5798: state = 5799; break; // &NotTildeFullEq -> &NotTildeFullEqu + case 5844: state = 5845; break; // &nprc -> &nprcu + case 5895: state = 5951; break; // &ns -> &nsu + case 5898: state = 5899; break; // &nscc -> &nsccu + case 5943: state = 5944; break; // &nsqs -> &nsqsu + case 6131: state = 6422; break; // &O -> &Ou + case 6133: state = 6134; break; // &Oac -> &Oacu + case 6138: state = 6426; break; // &o -> &ou + case 6140: state = 6141; break; // &oac -> &oacu + case 6290: state = 6291; break; // &omin -> &ominu + case 6309: state = 6310; break; // &OpenC -> &OpenCu + case 6315: state = 6316; break; // &OpenCurlyDo -> &OpenCurlyDou + case 6320: state = 6321; break; // &OpenCurlyDoubleQ -> &OpenCurlyDoubleQu + case 6326: state = 6327; break; // &OpenCurlyQ -> &OpenCurlyQu + case 6336: state = 6337; break; // &opl -> &oplu + case 6463: state = 6807; break; // &p -> &pu + case 6555: state = 6566; break; // &pl -> &plu + case 6580: state = 6583; break; // &plusd -> &plusdu + case 6587: state = 6588; break; // &Pl -> &Plu + case 6592: state = 6593; break; // &PlusMin -> &PlusMinu + case 6622: state = 6636; break; // &po -> &pou + case 6642: state = 6790; break; // &pr -> &pru + case 6647: state = 6648; break; // &prc -> &prcu + case 6664: state = 6665; break; // &precc -> &preccu + case 6680: state = 6681; break; // &PrecedesEq -> &PrecedesEqu + case 6691: state = 6692; break; // &PrecedesSlantEq -> &PrecedesSlantEqu + case 6749: state = 6750; break; // &Prod -> &Produ + case 6765: state = 6766; break; // &profs -> &profsu + case 6817: state = 6847; break; // &q -> &qu + case 6876: state = 7601; break; // &r -> &ru + case 6883: state = 6893; break; // &rac -> &racu + case 6886: state = 7590; break; // &R -> &Ru + case 6888: state = 6889; break; // &Rac -> &Racu + case 6921: state = 6922; break; // &raq -> &raqu + case 7016: state = 7019; break; // &rbrksl -> &rbrkslu + case 7027: state = 7046; break; // &rc -> &rcu + case 7063: state = 7064; break; // &rdq -> &rdqu + case 7110: state = 7111; break; // &ReverseEq -> &ReverseEqu + case 7117: state = 7118; break; // &ReverseEquilibri -> &ReverseEquilibriu + case 7124: state = 7125; break; // &ReverseUpEq -> &ReverseUpEqu + case 7131: state = 7132; break; // &ReverseUpEquilibri -> &ReverseUpEquilibriu + case 7157: state = 7160; break; // &rhar -> &rharu + case 7237: state = 7238; break; // &RightDo -> &RightDou + case 7285: state = 7291; break; // &rightharpoon -> &rightharpoonu + case 7327: state = 7328; break; // &rightsq -> &rightsqu + case 7378: state = 7379; break; // &RightTriangleEq -> &RightTriangleEqu + case 7454: state = 7455; break; // &rmo -> &rmou + case 7485: state = 7501; break; // &Ro -> &Rou + case 7491: state = 7492; break; // &ropl -> &roplu + case 7544: state = 7545; break; // &rsaq -> &rsaqu + case 7559: state = 7562; break; // &rsq -> &rsqu + case 7602: state = 7603; break; // &rul -> &rulu + case 7610: state = 8127; break; // &S -> &Su + case 7612: state = 7613; break; // &Sac -> &Sacu + case 7617: state = 8130; break; // &s -> &su + case 7619: state = 7620; break; // &sac -> &sacu + case 7625: state = 7626; break; // &sbq -> &sbqu + case 7645: state = 7646; break; // &scc -> &sccu + case 7732: state = 7733; break; // &setmin -> &setminu + case 7869: state = 7870; break; // &simpl -> &simplu + case 7903: state = 7904; break; // &smallsetmin -> &smallsetminu + case 7960: state = 7962; break; // &spades -> &spadesu + case 7968: state = 8008; break; // &sq -> &squ + case 7969: state = 7975; break; // &sqc -> &sqcu + case 7980: state = 8010; break; // &Sq -> &Squ + case 7984: state = 7985; break; // &sqs -> &sqsu + case 8032: state = 8033; break; // &SquareS -> &SquareSu + case 8040: state = 8041; break; // &SquareSubsetEq -> &SquareSubsetEqu + case 8053: state = 8054; break; // &SquareSupersetEq -> &SquareSupersetEqu + case 8145: state = 8146; break; // &subm -> &submu + case 8156: state = 8157; break; // &subpl -> &subplu + case 8169: state = 8193; break; // &subs -> &subsu + case 8179: state = 8180; break; // &SubsetEq -> &SubsetEqu + case 8208: state = 8209; break; // &succc -> &succcu + case 8224: state = 8225; break; // &SucceedsEq -> &SucceedsEqu + case 8235: state = 8236; break; // &SucceedsSlantEq -> &SucceedsSlantEqu + case 8296: state = 8297; break; // &supds -> &supdsu + case 8315: state = 8316; break; // &SupersetEq -> &SupersetEqu + case 8321: state = 8325; break; // &suphs -> &suphsu + case 8333: state = 8334; break; // &supm -> &supmu + case 8344: state = 8345; break; // &suppl -> &supplu + case 8352: state = 8370; break; // &sups -> &supsu + case 8401: state = 8411; break; // &Ta -> &Tau + case 8405: state = 8413; break; // &ta -> &tau + case 8555: state = 8556; break; // &TildeEq -> &TildeEqu + case 8560: state = 8561; break; // &TildeF -> &TildeFu + case 8565: state = 8566; break; // &TildeFullEq -> &TildeFullEqu + case 8672: state = 8673; break; // &trimin -> &triminu + case 8686: state = 8687; break; // &tripl -> &triplu + case 8701: state = 8702; break; // &trpezi -> &trpeziu + case 8768: state = 9187; break; // &U -> &Uu + case 8770: state = 8771; break; // &Uac -> &Uacu + case 8775: state = 9182; break; // &u -> &uu + case 8777: state = 8778; break; // &uac -> &uacu + case 8950: state = 8951; break; // &UnionPl -> &UnionPlu + case 8983: state = 9118; break; // &up -> &upu + case 9035: state = 9036; break; // &UpEq -> &UpEqu + case 9042: state = 9043; break; // &UpEquilibri -> &UpEquilibriu + case 9064: state = 9065; break; // &upl -> &uplu + case 9252: state = 9258; break; // &vars -> &varsu + case 9426: state = 9427; break; // &vns -> &vnsu + case 9454: state = 9458; break; // &vs -> &vsu + case 9548: state = 9645; break; // &x -> &xu + case 9549: state = 9557; break; // &xc -> &xcu + case 9614: state = 9615; break; // &xopl -> &xoplu + case 9641: state = 9642; break; // &xsqc -> &xsqcu + case 9647: state = 9648; break; // &xupl -> &xuplu + case 9665: state = 9740; break; // &Y -> &Yu + case 9667: state = 9668; break; // &Yac -> &Yacu + case 9672: state = 9736; break; // &y -> &yu + case 9674: state = 9675; break; // &yac -> &yacu + case 9749: state = 9750; break; // &Zac -> &Zacu + case 9756: state = 9757; break; // &zac -> &zacu default: return false; } break; case 'v': switch (state) { - case 0: state = 7223; break; // & -> &v - case 15: state = 16; break; // &Abre -> &Abrev - case 20: state = 21; break; // &abre -> &abrev - case 52: state = 53; break; // &Agra -> &Agrav - case 57: state = 58; break; // &agra -> &agrav - case 91: state = 101; break; // &and -> &andv - case 119: state = 120; break; // &angrt -> &angrtv - case 256: state = 257; break; // &Bar -> &Barv - case 258: state = 259; break; // &bar -> &barv - case 303: state = 304; break; // &bempty -> &bemptyv - case 334: state = 383; break; // &big -> &bigv - case 449: state = 450; break; // &bnequi -> &bnequiv - case 470: state = 519; break; // &box -> &boxv - case 538: state = 539; break; // &Bre -> &Brev - case 541: state = 545; break; // &br -> &brv - case 542: state = 543; break; // &bre -> &brev - case 696: state = 697; break; // &cempty -> &cemptyv - case 987: state = 1070; break; // &cu -> &cuv - case 1026: state = 1054; break; // &cur -> &curv - case 1032: state = 1043; break; // &curly -> &curlyv - case 1115: state = 1119; break; // &dash -> &dashv - case 1117: state = 1118; break; // &Dash -> &Dashv - case 1173: state = 1174; break; // &dempty -> &demptyv - case 1220: state = 1221; break; // &DiacriticalGra -> &DiacriticalGrav - case 1228: state = 1263; break; // &di -> &div - case 1497: state = 1498; break; // &DownBre -> &DownBrev - case 1717: state = 1718; break; // &Egra -> &Egrav - case 1721: state = 1722; break; // &egra -> &egrav - case 1756: state = 1774; break; // &empty -> &emptyv - case 1822: state = 1832; break; // &epsi -> &epsiv - case 1833: state = 1884; break; // &eq -> &eqv - case 1880: state = 1881; break; // &equi -> &equiv - case 2066: state = 2067; break; // &fork -> &forkv - case 2118: state = 2341; break; // &g -> &gv - case 2137: state = 2138; break; // &Gbre -> &Gbrev - case 2142: state = 2143; break; // &gbre -> &gbrev - case 2229: state = 2230; break; // &gra -> &grav - case 2574: state = 2575; break; // &Igra -> &Igrav - case 2579: state = 2580; break; // &igra -> &igrav - case 2656: state = 2693; break; // &In -> &Inv - case 2747: state = 2754; break; // &isin -> &isinv - case 2752: state = 2753; break; // &isins -> &isinsv - case 2834: state = 2835; break; // &kappa -> &kappav - case 2881: state = 3735; break; // &l -> &lv - case 2901: state = 2902; break; // &laempty -> &laemptyv - case 3897: state = 4760; break; // &n -> &nv - case 3988: state = 3989; break; // &Negati -> &Negativ - case 4033: state = 4034; break; // &nequi -> &nequiv - case 4097: state = 4100; break; // &nGt -> &nGtv - case 4111: state = 4114; break; // &ni -> &niv - case 4181: state = 4186; break; // &nLt -> &nLtv - case 4334: state = 4339; break; // ¬in -> ¬inv - case 4425: state = 4426; break; // ¬ni -> ¬niv - case 4454: state = 4455; break; // &NotRe -> &NotRev - case 4827: state = 5059; break; // &O -> &Ov - case 4833: state = 5055; break; // &o -> &ov - case 4864: state = 4865; break; // &odi -> &odiv - case 4892: state = 4893; break; // &Ogra -> &Ograv - case 4896: state = 4897; break; // &ogra -> &ograv - case 4991: state = 5013; break; // &or -> &orv - case 5131: state = 5132; break; // &phi -> &phiv - case 5141: state = 5149; break; // &pi -> &piv - case 5156: state = 5157; break; // &plank -> &plankv - case 5421: state = 5422; break; // &raempty -> &raemptyv - case 5540: state = 5557; break; // &Re -> &Rev - case 5615: state = 5616; break; // &rho -> &rhov - case 6165: state = 6167; break; // &sigma -> &sigmav - case 6649: state = 6653; break; // &theta -> &thetav - case 6904: state = 6905; break; // &Ubre -> &Ubrev - case 6907: state = 6908; break; // &ubre -> &ubrev - case 6946: state = 6947; break; // &Ugra -> &Ugrav - case 6951: state = 6952; break; // &ugra -> &ugrav - case 7307: state = 7436; break; // &V -> &Vv - case 7313: state = 7314; break; // &vBar -> &vBarv - case 7495: state = 7576; break; // &x -> &xv + case 0: state = 9201; break; // & -> &v + case 17: state = 18; break; // &Abre -> &Abrev + case 23: state = 24; break; // &abre -> &abrev + case 69: state = 70; break; // &Agra -> &Agrav + case 75: state = 76; break; // &agra -> &agrav + case 120: state = 134; break; // &and -> &andv + case 165: state = 167; break; // &angrt -> &angrtv + case 341: state = 342; break; // &Bar -> &Barv + case 344: state = 345; break; // &bar -> &barv + case 402: state = 403; break; // &bempty -> &bemptyv + case 443: state = 503; break; // &big -> &bigv + case 584: state = 585; break; // &bnequi -> &bnequiv + case 613: state = 693; break; // &box -> &boxv + case 726: state = 727; break; // &Bre -> &Brev + case 730: state = 735; break; // &br -> &brv + case 731: state = 732; break; // &bre -> &brev + case 930: state = 931; break; // &cempty -> &cemptyv + case 1292: state = 1399; break; // &cu -> &cuv + case 1346: state = 1381; break; // &cur -> &curv + case 1354: state = 1367; break; // &curly -> &curlyv + case 1455: state = 1461; break; // &dash -> &dashv + case 1458: state = 1459; break; // &Dash -> &Dashv + case 1532: state = 1533; break; // &dempty -> &demptyv + case 1589: state = 1590; break; // &DiacriticalGra -> &DiacriticalGrav + case 1599: state = 1643; break; // &di -> &div + case 1917: state = 1918; break; // &DownBre -> &DownBrev + case 2189: state = 2190; break; // &Egra -> &Egrav + case 2194: state = 2195; break; // &egra -> &egrav + case 2240: state = 2261; break; // &empty -> &emptyv + case 2324: state = 2337; break; // &epsi -> &epsiv + case 2339: state = 2402; break; // &eq -> &eqv + case 2396: state = 2397; break; // &equi -> &equiv + case 2626: state = 2628; break; // &fork -> &forkv + case 2701: state = 3002; break; // &g -> &gv + case 2726: state = 2727; break; // &Gbre -> &Gbrev + case 2732: state = 2733; break; // &gbre -> &gbrev + case 2862: state = 2863; break; // &gra -> &grav + case 3291: state = 3292; break; // &Igra -> &Igrav + case 3297: state = 3298; break; // &igra -> &igrav + case 3398: state = 3444; break; // &In -> &Inv + case 3512: state = 3524; break; // &isin -> &isinv + case 3520: state = 3522; break; // &isins -> &isinsv + case 3628: state = 3630; break; // &kappa -> &kappav + case 3692: state = 4755; break; // &l -> &lv + case 3715: state = 3716; break; // &laempty -> &laemptyv + case 4965: state = 6043; break; // &n -> &nv + case 5088: state = 5089; break; // &Negati -> &Negativ + case 5137: state = 5138; break; // &nequi -> &nequiv + case 5219: state = 5225; break; // &nGt -> &nGtv + case 5240: state = 5246; break; // &ni -> &niv + case 5332: state = 5341; break; // &nLt -> &nLtv + case 5513: state = 5521; break; // ¬in -> ¬inv + case 5621: state = 5623; break; // ¬ni -> ¬niv + case 5657: state = 5658; break; // &NotRe -> &NotRev + case 6131: state = 6435; break; // &O -> &Ov + case 6138: state = 6430; break; // &o -> &ov + case 6179: state = 6180; break; // &odi -> &odiv + case 6216: state = 6217; break; // &Ogra -> &Ograv + case 6221: state = 6222; break; // &ogra -> &ograv + case 6342: state = 6374; break; // &or -> &orv + case 6528: state = 6530; break; // &phi -> &phiv + case 6543: state = 6553; break; // &pi -> &piv + case 6563: state = 6564; break; // &plank -> &plankv + case 6905: state = 6906; break; // &raempty -> &raemptyv + case 7072: state = 7097; break; // &Re -> &Rev + case 7167: state = 7169; break; // &rho -> &rhov + case 7841: state = 7845; break; // &sigma -> &sigmav + case 8485: state = 8491; break; // &theta -> &thetav + case 8807: state = 8808; break; // &Ubre -> &Ubrev + case 8811: state = 8812; break; // &ubre -> &ubrev + case 8862: state = 8863; break; // &Ugra -> &Ugrav + case 8868: state = 8869; break; // &ugra -> &ugrav + case 9303: state = 9471; break; // &V -> &Vv + case 9310: state = 9312; break; // &vBar -> &vBarv + case 9548: state = 9655; break; // &x -> &xv default: return false; } break; case 'w': switch (state) { - case 0: state = 7452; break; // & -> &w - case 7: state = 212; break; // &a -> &aw - case 256: state = 262; break; // &Bar -> &Barw - case 258: state = 265; break; // &bar -> &barw - case 322: state = 325; break; // &bet -> &betw - case 334: state = 386; break; // &big -> &bigw - case 373: state = 374; break; // &bigtriangledo -> &bigtriangledow - case 394: state = 395; break; // &bkaro -> &bkarow - case 422: state = 423; break; // &blacktriangledo -> &blacktriangledow - case 459: state = 466; break; // &bo -> &bow - case 589: state = 1076; break; // &c -> &cw - case 742: state = 743; break; // &circlearro -> &circlearrow - case 806: state = 807; break; // &Clock -> &Clockw - case 941: state = 942; break; // &CounterClock -> &CounterClockw - case 987: state = 1073; break; // &cu -> &cuw - case 1032: state = 1046; break; // &curly -> &curlyw - case 1059: state = 1060; break; // &curvearro -> &curvearrow - case 1097: state = 1638; break; // &d -> &dw - case 1124: state = 1125; break; // &dbkaro -> &dbkarow - case 1291: state = 1478; break; // &do -> &dow - case 1296: state = 1466; break; // &Do -> &Dow - case 1337: state = 1338; break; // &doublebar -> &doublebarw - case 1363: state = 1365; break; // &DoubleDo -> &DoubleDow - case 1370: state = 1371; break; // &DoubleDownArro -> &DoubleDownArrow - case 1379: state = 1380; break; // &DoubleLeftArro -> &DoubleLeftArrow - case 1389: state = 1390; break; // &DoubleLeftRightArro -> &DoubleLeftRightArrow - case 1404: state = 1405; break; // &DoubleLongLeftArro -> &DoubleLongLeftArrow - case 1414: state = 1415; break; // &DoubleLongLeftRightArro -> &DoubleLongLeftRightArrow - case 1424: state = 1425; break; // &DoubleLongRightArro -> &DoubleLongRightArrow - case 1434: state = 1435; break; // &DoubleRightArro -> &DoubleRightArrow - case 1444: state = 1445; break; // &DoubleUpArro -> &DoubleUpArrow - case 1447: state = 1448; break; // &DoubleUpDo -> &DoubleUpDow - case 1453: state = 1454; break; // &DoubleUpDownArro -> &DoubleUpDownArrow - case 1471: state = 1472; break; // &DownArro -> &DownArrow - case 1476: state = 1477; break; // &Downarro -> &Downarrow - case 1483: state = 1484; break; // &downarro -> &downarrow - case 1493: state = 1494; break; // &DownArrowUpArro -> &DownArrowUpArrow - case 1501: state = 1502; break; // &downdo -> &downdow - case 1507: state = 1508; break; // &downdownarro -> &downdownarrow - case 1588: state = 1589; break; // &DownTeeArro -> &DownTeeArrow - case 1595: state = 1596; break; // &drbkaro -> &drbkarow - case 2109: state = 2110; break; // &fro -> &frow - case 2380: state = 2384; break; // &harr -> &harrw - case 2429: state = 2435; break; // &hks -> &hksw - case 2433: state = 2434; break; // &hksearo -> &hksearow - case 2438: state = 2439; break; // &hkswaro -> &hkswarow - case 2457: state = 2458; break; // &hookleftarro -> &hookleftarrow - case 2467: state = 2468; break; // &hookrightarro -> &hookrightarrow - case 2512: state = 2513; break; // &HumpDo -> &HumpDow - case 3050: state = 3051; break; // &LeftArro -> &LeftArrow - case 3055: state = 3056; break; // &Leftarro -> &Leftarrow - case 3062: state = 3063; break; // &leftarro -> &leftarrow - case 3075: state = 3076; break; // &LeftArrowRightArro -> &LeftArrowRightArrow - case 3089: state = 3101; break; // &LeftDo -> &LeftDow - case 3134: state = 3135; break; // &leftharpoondo -> &leftharpoondow - case 3146: state = 3147; break; // &leftleftarro -> &leftleftarrow - case 3157: state = 3158; break; // &LeftRightArro -> &LeftRightArrow - case 3167: state = 3168; break; // &Leftrightarro -> &Leftrightarrow - case 3177: state = 3178; break; // &leftrightarro -> &leftrightarrow - case 3196: state = 3197; break; // &leftrightsquigarro -> &leftrightsquigarrow - case 3210: state = 3211; break; // &LeftTeeArro -> &LeftTeeArrow - case 3246: state = 3247; break; // &LeftUpDo -> &LeftUpDow - case 3425: state = 3426; break; // &Lleftarro -> &Lleftarrow - case 3466: state = 3603; break; // &lo -> &low - case 3475: state = 3610; break; // &Lo -> &Low - case 3485: state = 3486; break; // &LongLeftArro -> &LongLeftArrow - case 3494: state = 3495; break; // &Longleftarro -> &Longleftarrow - case 3505: state = 3506; break; // &longleftarro -> &longleftarrow - case 3515: state = 3516; break; // &LongLeftRightArro -> &LongLeftRightArrow - case 3525: state = 3526; break; // &Longleftrightarro -> &Longleftrightarrow - case 3535: state = 3536; break; // &longleftrightarro -> &longleftrightarrow - case 3551: state = 3552; break; // &LongRightArro -> &LongRightArrow - case 3561: state = 3562; break; // &Longrightarro -> &Longrightarrow - case 3571: state = 3572; break; // &longrightarro -> &longrightarrow - case 3578: state = 3579; break; // &looparro -> &looparrow - case 3620: state = 3621; break; // &LowerLeftArro -> &LowerLeftArrow - case 3630: state = 3631; break; // &LowerRightArro -> &LowerRightArrow - case 3763: state = 3764; break; // &mapstodo -> &mapstodow - case 3897: state = 4812; break; // &n -> &nw - case 3979: state = 3980; break; // &nearro -> &nearrow - case 3984: state = 4067; break; // &Ne -> &New - case 4139: state = 4140; break; // &nLeftarro -> &nLeftarrow - case 4146: state = 4147; break; // &nleftarro -> &nleftarrow - case 4156: state = 4157; break; // &nLeftrightarro -> &nLeftrightarrow - case 4166: state = 4167; break; // &nleftrightarro -> &nleftrightarrow - case 4321: state = 4322; break; // &NotHumpDo -> &NotHumpDow - case 4627: state = 4629; break; // &nrarr -> &nrarrw - case 4638: state = 4639; break; // &nRightarro -> &nRightarrow - case 4647: state = 4648; break; // &nrightarro -> &nrightarrow - case 4821: state = 4822; break; // &nwarro -> &nwarrow - case 5185: state = 5186; break; // &plust -> &plustw - case 5439: state = 5461; break; // &rarr -> &rarrw - case 5635: state = 5636; break; // &RightArro -> &RightArrow - case 5640: state = 5641; break; // &Rightarro -> &Rightarrow - case 5649: state = 5650; break; // &rightarro -> &rightarrow - case 5661: state = 5662; break; // &RightArrowLeftArro -> &RightArrowLeftArrow - case 5675: state = 5687; break; // &RightDo -> &RightDow - case 5720: state = 5721; break; // &rightharpoondo -> &rightharpoondow - case 5732: state = 5733; break; // &rightleftarro -> &rightleftarrow - case 5751: state = 5752; break; // &rightrightarro -> &rightrightarrow - case 5762: state = 5763; break; // &rightsquigarro -> &rightsquigarrow - case 5770: state = 5771; break; // &RightTeeArro -> &RightTeeArrow - case 5806: state = 5807; break; // &RightUpDo -> &RightUpDow - case 5932: state = 5933; break; // &Rrightarro -> &Rrightarrow - case 5991: state = 6564; break; // &s -> &sw - case 6062: state = 6063; break; // &searro -> &searrow - case 6068: state = 6069; break; // &ses -> &sesw - case 6085: state = 6086; break; // &sfro -> &sfrow - case 6109: state = 6110; break; // &ShortDo -> &ShortDow - case 6115: state = 6116; break; // &ShortDownArro -> &ShortDownArrow - case 6124: state = 6125; break; // &ShortLeftArro -> &ShortLeftArrow - case 6148: state = 6149; break; // &ShortRightArro -> &ShortRightArrow - case 6155: state = 6156; break; // &ShortUpArro -> &ShortUpArrow - case 6573: state = 6574; break; // &swarro -> &swarrow - case 6575: state = 6576; break; // &swn -> &swnw - case 6586: state = 6845; break; // &t -> &tw - case 6771: state = 6772; break; // &triangledo -> &triangledow - case 6861: state = 6862; break; // &twoheadleftarro -> &twoheadleftarrow - case 6871: state = 6872; break; // &twoheadrightarro -> &twoheadrightarrow - case 6879: state = 7217; break; // &u -> &uw - case 7035: state = 7036; break; // &UpArro -> &UpArrow - case 7040: state = 7041; break; // &Uparro -> &Uparrow - case 7046: state = 7047; break; // &uparro -> &uparrow - case 7052: state = 7053; break; // &UpArrowDo -> &UpArrowDow - case 7058: state = 7059; break; // &UpArrowDownArro -> &UpArrowDownArrow - case 7061: state = 7062; break; // &UpDo -> &UpDow - case 7067: state = 7068; break; // &UpDownArro -> &UpDownArrow - case 7070: state = 7071; break; // &Updo -> &Updow - case 7076: state = 7077; break; // &Updownarro -> &Updownarrow - case 7079: state = 7080; break; // &updo -> &updow - case 7085: state = 7086; break; // &updownarro -> &updownarrow - case 7127: state = 7128; break; // &UpperLeftArro -> &UpperLeftArrow - case 7137: state = 7138; break; // &UpperRightArro -> &UpperRightArrow - case 7156: state = 7157; break; // &UpTeeArro -> &UpTeeArrow - case 7163: state = 7164; break; // &upuparro -> &upuparrow - case 7495: state = 7579; break; // &x -> &xw - case 7651: state = 7725; break; // &z -> &zw + case 0: state = 9490; break; // & -> &w + case 8: state = 289; break; // &a -> &aw + case 341: state = 349; break; // &Bar -> &Barw + case 344: state = 353; break; // &bar -> &barw + case 426: state = 431; break; // &bet -> &betw + case 443: state = 507; break; // &big -> &bigw + case 490: state = 491; break; // &bigtriangledo -> &bigtriangledow + case 516: state = 517; break; // &bkaro -> &bkarow + case 548: state = 549; break; // &blacktriangledo -> &blacktriangledow + case 598: state = 608; break; // &bo -> &bow + case 796: state = 1407; break; // &c -> &cw + case 991: state = 992; break; // &circlearro -> &circlearrow + case 1071: state = 1072; break; // &Clock -> &Clockw + case 1235: state = 1236; break; // &CounterClock -> &CounterClockw + case 1292: state = 1403; break; // &cu -> &cuw + case 1354: state = 1371; break; // &curly -> &curlyw + case 1386: state = 1387; break; // &curvearro -> &curvearrow + case 1432: state = 2086; break; // &d -> &dw + case 1467: state = 1468; break; // &dbkaro -> &dbkarow + case 1679: state = 1895; break; // &do -> &dow + case 1685: state = 1881; break; // &Do -> &Dow + case 1737: state = 1738; break; // &doublebar -> &doublebarw + case 1765: state = 1768; break; // &DoubleDo -> &DoubleDow + case 1773: state = 1774; break; // &DoubleDownArro -> &DoubleDownArrow + case 1783: state = 1784; break; // &DoubleLeftArro -> &DoubleLeftArrow + case 1794: state = 1795; break; // &DoubleLeftRightArro -> &DoubleLeftRightArrow + case 1811: state = 1812; break; // &DoubleLongLeftArro -> &DoubleLongLeftArrow + case 1822: state = 1823; break; // &DoubleLongLeftRightArro -> &DoubleLongLeftRightArrow + case 1833: state = 1834; break; // &DoubleLongRightArro -> &DoubleLongRightArrow + case 1844: state = 1845; break; // &DoubleRightArro -> &DoubleRightArrow + case 1856: state = 1857; break; // &DoubleUpArro -> &DoubleUpArrow + case 1860: state = 1861; break; // &DoubleUpDo -> &DoubleUpDow + case 1866: state = 1867; break; // &DoubleUpDownArro -> &DoubleUpDownArrow + case 1886: state = 1887; break; // &DownArro -> &DownArrow + case 1892: state = 1893; break; // &Downarro -> &Downarrow + case 1900: state = 1901; break; // &downarro -> &downarrow + case 1912: state = 1913; break; // &DownArrowUpArro -> &DownArrowUpArrow + case 1922: state = 1923; break; // &downdo -> &downdow + case 1928: state = 1929; break; // &downdownarro -> &downdownarrow + case 2020: state = 2021; break; // &DownTeeArro -> &DownTeeArrow + case 2028: state = 2029; break; // &drbkaro -> &drbkarow + case 2689: state = 2690; break; // &fro -> &frow + case 3050: state = 3056; break; // &harr -> &harrw + case 3113: state = 3120; break; // &hks -> &hksw + case 3117: state = 3118; break; // &hksearo -> &hksearow + case 3123: state = 3124; break; // &hkswaro -> &hkswarow + case 3145: state = 3146; break; // &hookleftarro -> &hookleftarrow + case 3156: state = 3157; break; // &hookrightarro -> &hookrightarrow + case 3211: state = 3212; break; // &HumpDo -> &HumpDow + case 3916: state = 3917; break; // &LeftArro -> &LeftArrow + case 3922: state = 3923; break; // &Leftarro -> &Leftarrow + case 3930: state = 3931; break; // &leftarro -> &leftarrow + case 3945: state = 3946; break; // &LeftArrowRightArro -> &LeftArrowRightArrow + case 3962: state = 3975; break; // &LeftDo -> &LeftDow + case 4012: state = 4013; break; // &leftharpoondo -> &leftharpoondow + case 4026: state = 4027; break; // &leftleftarro -> &leftleftarrow + case 4038: state = 4039; break; // &LeftRightArro -> &LeftRightArrow + case 4049: state = 4050; break; // &Leftrightarro -> &Leftrightarrow + case 4060: state = 4061; break; // &leftrightarro -> &leftrightarrow + case 4082: state = 4083; break; // &leftrightsquigarro -> &leftrightsquigarrow + case 4099: state = 4100; break; // &LeftTeeArro -> &LeftTeeArrow + case 4141: state = 4142; break; // &LeftUpDo -> &LeftUpDow + case 4367: state = 4368; break; // &Lleftarro -> &Lleftarrow + case 4422: state = 4579; break; // &lo -> &low + case 4434: state = 4588; break; // &Lo -> &Low + case 4444: state = 4445; break; // &LongLeftArro -> &LongLeftArrow + case 4454: state = 4455; break; // &Longleftarro -> &Longleftarrow + case 4466: state = 4467; break; // &longleftarro -> &longleftarrow + case 4477: state = 4478; break; // &LongLeftRightArro -> &LongLeftRightArrow + case 4488: state = 4489; break; // &Longleftrightarro -> &Longleftrightarrow + case 4499: state = 4500; break; // &longleftrightarro -> &longleftrightarrow + case 4517: state = 4518; break; // &LongRightArro -> &LongRightArrow + case 4528: state = 4529; break; // &Longrightarro -> &Longrightarrow + case 4539: state = 4540; break; // &longrightarro -> &longrightarrow + case 4547: state = 4548; break; // &looparro -> &looparrow + case 4598: state = 4599; break; // &LowerLeftArro -> &LowerLeftArrow + case 4609: state = 4610; break; // &LowerRightArro -> &LowerRightArrow + case 4792: state = 4793; break; // &mapstodo -> &mapstodow + case 4965: state = 6111; break; // &n -> &nw + case 5077: state = 5078; break; // &nearro -> &nearrow + case 5084: state = 5176; break; // &Ne -> &New + case 5279: state = 5280; break; // &nLeftarro -> &nLeftarrow + case 5287: state = 5288; break; // &nleftarro -> &nleftarrow + case 5298: state = 5299; break; // &nLeftrightarro -> &nLeftrightarrow + case 5309: state = 5310; break; // &nleftrightarro -> &nleftrightarrow + case 5498: state = 5499; break; // &NotHumpDo -> &NotHumpDow + case 5862: state = 5866; break; // &nrarr -> &nrarrw + case 5876: state = 5877; break; // &nRightarro -> &nRightarrow + case 5886: state = 5887; break; // &nrightarro -> &nrightarrow + case 6123: state = 6124; break; // &nwarro -> &nwarrow + case 6603: state = 6604; break; // &plust -> &plustw + case 6932: state = 6966; break; // &rarr -> &rarrw + case 7190: state = 7191; break; // &RightArro -> &RightArrow + case 7196: state = 7197; break; // &Rightarro -> &Rightarrow + case 7206: state = 7207; break; // &rightarro -> &rightarrow + case 7220: state = 7221; break; // &RightArrowLeftArro -> &RightArrowLeftArrow + case 7237: state = 7250; break; // &RightDo -> &RightDow + case 7287: state = 7288; break; // &rightharpoondo -> &rightharpoondow + case 7301: state = 7302; break; // &rightleftarro -> &rightleftarrow + case 7322: state = 7323; break; // &rightrightarro -> &rightrightarrow + case 7334: state = 7335; break; // &rightsquigarro -> &rightsquigarrow + case 7344: state = 7345; break; // &RightTeeArro -> &RightTeeArrow + case 7386: state = 7387; break; // &RightUpDo -> &RightUpDow + case 7539: state = 7540; break; // &Rrightarro -> &Rrightarrow + case 7617: state = 8375; break; // &s -> &sw + case 7715: state = 7716; break; // &searro -> &searrow + case 7724: state = 7725; break; // &ses -> &sesw + case 7747: state = 7748; break; // &sfro -> &sfrow + case 7777: state = 7778; break; // &ShortDo -> &ShortDow + case 7783: state = 7784; break; // &ShortDownArro -> &ShortDownArrow + case 7793: state = 7794; break; // &ShortLeftArro -> &ShortLeftArrow + case 7820: state = 7821; break; // &ShortRightArro -> &ShortRightArrow + case 7828: state = 7829; break; // &ShortUpArro -> &ShortUpArrow + case 8387: state = 8388; break; // &swarro -> &swarrow + case 8390: state = 8391; break; // &swn -> &swnw + case 8404: state = 8737; break; // &t -> &tw + case 8641: state = 8642; break; // &triangledo -> &triangledow + case 8754: state = 8755; break; // &twoheadleftarro -> &twoheadleftarrow + case 8765: state = 8766; break; // &twoheadrightarro -> &twoheadrightarrow + case 8775: state = 9194; break; // &u -> &uw + case 8974: state = 8975; break; // &UpArro -> &UpArrow + case 8980: state = 8981; break; // &Uparro -> &Uparrow + case 8987: state = 8988; break; // &uparro -> &uparrow + case 8995: state = 8996; break; // &UpArrowDo -> &UpArrowDow + case 9001: state = 9002; break; // &UpArrowDownArro -> &UpArrowDownArrow + case 9005: state = 9006; break; // &UpDo -> &UpDow + case 9011: state = 9012; break; // &UpDownArro -> &UpDownArrow + case 9015: state = 9016; break; // &Updo -> &Updow + case 9021: state = 9022; break; // &Updownarro -> &Updownarrow + case 9025: state = 9026; break; // &updo -> &updow + case 9031: state = 9032; break; // &updownarro -> &updownarrow + case 9078: state = 9079; break; // &UpperLeftArro -> &UpperLeftArrow + case 9089: state = 9090; break; // &UpperRightArro -> &UpperRightArrow + case 9115: state = 9116; break; // &UpTeeArro -> &UpTeeArrow + case 9123: state = 9124; break; // &upuparro -> &upuparrow + case 9548: state = 9659; break; // &x -> &xw + case 9754: state = 9848; break; // &z -> &zw default: return false; } break; case 'x': switch (state) { - case 0: state = 7495; break; // & -> &x - case 168: state = 169; break; // &appro -> &approx - case 459: state = 470; break; // &bo -> &box - case 472: state = 473; break; // &boxbo -> &boxbox - case 875: state = 880; break; // &comple -> &complex - case 1275: state = 1276; break; // &divon -> &divonx - case 1656: state = 1931; break; // &E -> &Ex - case 1662: state = 1925; break; // &e -> &ex - case 2213: state = 2214; break; // &gnappro -> &gnapprox - case 2316: state = 2317; break; // >rappro -> >rapprox - case 2561: state = 2564; break; // &ie -> &iex - case 3307: state = 3308; break; // &lessappro -> &lessapprox - case 3457: state = 3458; break; // &lnappro -> &lnapprox - case 3922: state = 3923; break; // &nappro -> &napprox - case 3970: state = 4072; break; // &ne -> &nex - case 4248: state = 4264; break; // &NotE -> &NotEx - case 5229: state = 5230; break; // &precappro -> &precapprox - case 5271: state = 5272; break; // &precnappro -> &precnapprox - case 5397: state = 5984; break; // &r -> &rx - case 6053: state = 6079; break; // &se -> &sex - case 6437: state = 6438; break; // &succappro -> &succapprox - case 6479: state = 6480; break; // &succnappro -> &succnapprox - case 6661: state = 6662; break; // &thickappro -> &thickapprox - case 6846: state = 6847; break; // &twi -> &twix + case 0: state = 9548; break; // & -> &x + case 231: state = 232; break; // &appro -> &approx + case 598: state = 613; break; // &bo -> &box + case 615: state = 616; break; // &boxbo -> &boxbox + case 1154: state = 1160; break; // &comple -> &complex + case 1658: state = 1659; break; // &divon -> &divonx + case 2108: state = 2466; break; // &E -> &Ex + case 2115: state = 2458; break; // &e -> &ex + case 2838: state = 2839; break; // &gnappro -> &gnapprox + case 2970: state = 2971; break; // >rappro -> >rapprox + case 3273: state = 3277; break; // &ie -> &iex + case 4220: state = 4221; break; // &lessappro -> &lessapprox + case 4407: state = 4408; break; // &lnappro -> &lnapprox + case 4998: state = 4999; break; // &nappro -> &napprox + case 5064: state = 5182; break; // &ne -> &nex + case 5414: state = 5433; break; // &NotE -> &NotEx + case 6661: state = 6662; break; // &precappro -> &precapprox + case 6710: state = 6711; break; // &precnappro -> &precnapprox + case 6876: state = 7608; break; // &r -> &rx + case 7703: state = 7738; break; // &se -> &sex + case 8205: state = 8206; break; // &succappro -> &succapprox + case 8254: state = 8255; break; // &succnappro -> &succnapprox + case 8500: state = 8501; break; // &thickappro -> &thickapprox + case 8738: state = 8739; break; // &twi -> &twix default: return false; } break; case 'y': switch (state) { - case 0: state = 7590; break; // & -> &y - case 23: state = 37; break; // &ac -> &acy - case 26: state = 36; break; // &Ac -> &Acy - case 63: state = 64; break; // &alefs -> &alefsy - case 156: state = 157; break; // &Appl -> &Apply - case 183: state = 191; break; // &as -> &asy - case 277: state = 283; break; // &bc -> &bcy - case 281: state = 282; break; // &Bc -> &Bcy - case 302: state = 303; break; // &bempt -> &bempty - case 584: state = 636; break; // &Ca -> &Cay - case 589: state = 1086; break; // &c -> &cy - case 638: state = 639; break; // &Cayle -> &Cayley - case 695: state = 696; break; // &cempt -> &cempty - case 717: state = 718; break; // &CHc -> &CHcy - case 720: state = 721; break; // &chc -> &chcy - case 831: state = 832; break; // &CloseCurl -> &CloseCurly - case 915: state = 929; break; // &cop -> © - case 1031: state = 1032; break; // &curl -> &curly - case 1089: state = 1090; break; // &cylct -> &cylcty - case 1129: state = 1139; break; // &Dc -> &Dcy - case 1134: state = 1140; break; // &dc -> &dcy - case 1172: state = 1173; break; // &dempt -> &dempty - case 1278: state = 1279; break; // &DJc -> &DJcy - case 1281: state = 1282; break; // &djc -> &djcy - case 1608: state = 1613; break; // &dsc -> &dscy - case 1611: state = 1612; break; // &DSc -> &DScy - case 1645: state = 1646; break; // &DZc -> &DZcy - case 1648: state = 1649; break; // &dzc -> &dzcy - case 1672: state = 1692; break; // &Ec -> &Ecy - case 1677: state = 1693; break; // &ec -> &ecy - case 1755: state = 1756; break; // &empt -> &empty - case 1761: state = 1762; break; // &Empt -> &Empty - case 1777: state = 1778; break; // &EmptyVer -> &EmptyVery - case 1978: state = 1979; break; // &Fc -> &Fcy - case 1980: state = 1981; break; // &fc -> &fcy - case 2023: state = 2024; break; // &FilledVer -> &FilledVery - case 2145: state = 2157; break; // &Gc -> &Gcy - case 2153: state = 2158; break; // &gc -> &gcy - case 2199: state = 2200; break; // &GJc -> &GJcy - case 2202: state = 2203; break; // &gjc -> &gjcy - case 2356: state = 2524; break; // &h -> &hy - case 2371: state = 2372; break; // &HARDc -> &HARDcy - case 2375: state = 2376; break; // &hardc -> &hardcy - case 2545: state = 2554; break; // &ic -> &icy - case 2546: state = 2553; break; // &Ic -> &Icy - case 2559: state = 2560; break; // &IEc -> &IEcy - case 2562: state = 2563; break; // &iec -> &iecy - case 2618: state = 2619; break; // &Imaginar -> &Imaginary - case 2711: state = 2712; break; // &IOc -> &IOcy - case 2714: state = 2715; break; // &ioc -> &iocy - case 2767: state = 2768; break; // &Iukc -> &Iukcy - case 2771: state = 2772; break; // &iukc -> &iukcy - case 2778: state = 2787; break; // &Jc -> &Jcy - case 2783: state = 2788; break; // &jc -> &jcy - case 2811: state = 2812; break; // &Jserc -> &Jsercy - case 2815: state = 2816; break; // &jserc -> &jsercy - case 2819: state = 2820; break; // &Jukc -> &Jukcy - case 2823: state = 2824; break; // &jukc -> &jukcy - case 2836: state = 2846; break; // &Kc -> &Kcy - case 2841: state = 2847; break; // &kc -> &kcy - case 2858: state = 2859; break; // &KHc -> &KHcy - case 2861: state = 2862; break; // &khc -> &khcy - case 2864: state = 2865; break; // &KJc -> &KJcy - case 2867: state = 2868; break; // &kjc -> &kjcy - case 2900: state = 2901; break; // &laempt -> &laempty - case 2988: state = 3010; break; // &Lc -> &Lcy - case 2993: state = 3011; break; // &lc -> &lcy - case 3403: state = 3404; break; // &LJc -> &LJcy - case 3406: state = 3407; break; // &ljc -> &ljcy - case 3776: state = 3783; break; // &mc -> &mcy - case 3781: state = 3782; break; // &Mc -> &Mcy - case 3937: state = 3965; break; // &nc -> &ncy - case 3940: state = 3964; break; // &Nc -> &Ncy - case 4020: state = 4021; break; // &NegativeVer -> &NegativeVery - case 4116: state = 4117; break; // &NJc -> &NJcy - case 4119: state = 4120; break; // &njc -> &njcy - case 4841: state = 4850; break; // &oc -> &ocy - case 4844: state = 4849; break; // &Oc -> &Ocy - case 4966: state = 4967; break; // &OpenCurl -> &OpenCurly - case 5104: state = 5105; break; // &Pc -> &Pcy - case 5106: state = 5107; break; // &pc -> &pcy - case 5234: state = 5235; break; // &preccurl -> &preccurly - case 5420: state = 5421; break; // &raempt -> &raempty - case 5502: state = 5524; break; // &Rc -> &Rcy - case 5507: state = 5525; break; // &rc -> &rcy - case 5974: state = 5975; break; // &RuleDela -> &RuleDelay - case 6001: state = 6046; break; // &Sc -> &Scy - case 6002: state = 6047; break; // &sc -> &scy - case 6088: state = 6157; break; // &sh -> ­ - case 6095: state = 6096; break; // &SHCHc -> &SHCHcy - case 6097: state = 6103; break; // &shc -> &shcy - case 6099: state = 6100; break; // &shchc -> &shchcy - case 6101: state = 6102; break; // &SHc -> &SHcy - case 6233: state = 6234; break; // &SOFTc -> &SOFTcy - case 6238: state = 6239; break; // &softc -> &softcy - case 6442: state = 6443; break; // &succcurl -> &succcurly - case 6597: state = 6615; break; // &Tc -> &Tcy - case 6602: state = 6616; break; // &tc -> &tcy - case 6650: state = 6651; break; // &thetas -> &thetasy - case 6825: state = 6830; break; // &tsc -> &tscy - case 6828: state = 6829; break; // &TSc -> &TScy - case 6832: state = 6833; break; // &TSHc -> &TSHcy - case 6835: state = 6836; break; // &tshc -> &tshcy - case 6898: state = 6899; break; // &Ubrc -> &Ubrcy - case 6902: state = 6903; break; // &ubrc -> &ubrcy - case 6910: state = 6918; break; // &Uc -> &Ucy - case 6914: state = 6919; break; // &uc -> &ucy - case 7315: state = 7316; break; // &Vc -> &Vcy - case 7317: state = 7318; break; // &vc -> &vcy - case 7349: state = 7384; break; // &Ver -> &Very - case 7592: state = 7599; break; // &yac -> &yacy - case 7597: state = 7598; break; // &YAc -> &YAcy - case 7600: state = 7608; break; // &Yc -> &Ycy - case 7604: state = 7609; break; // &yc -> &ycy - case 7617: state = 7618; break; // &YIc -> &YIcy - case 7620: state = 7621; break; // &yic -> &yicy - case 7635: state = 7636; break; // &YUc -> &YUcy - case 7638: state = 7639; break; // &yuc -> &yucy - case 7657: state = 7667; break; // &Zc -> &Zcy - case 7662: state = 7668; break; // &zc -> &zcy - case 7702: state = 7703; break; // &ZHc -> &ZHcy - case 7705: state = 7706; break; // &zhc -> &zhcy + case 0: state = 9672; break; // & -> &y + case 27: state = 48; break; // &ac -> &acy + case 33: state = 46; break; // &Ac -> &Acy + case 82: state = 83; break; // &alefs -> &alefsy + case 218: state = 219; break; // &Appl -> &Apply + case 251: state = 262; break; // &as -> &asy + case 369: state = 377; break; // &bc -> &bcy + case 374: state = 375; break; // &Bc -> &Bcy + case 401: state = 402; break; // &bempt -> &bempty + case 790: state = 855; break; // &Ca -> &Cay + case 796: state = 1419; break; // &c -> &cy + case 857: state = 858; break; // &Cayle -> &Cayley + case 929: state = 930; break; // &cempt -> &cempty + case 957: state = 958; break; // &CHc -> &CHcy + case 961: state = 962; break; // &chc -> &chcy + case 1097: state = 1098; break; // &CloseCurl -> &CloseCurly + case 1203: state = 1221; break; // &cop -> © + case 1353: state = 1354; break; // &curl -> &curly + case 1422: state = 1423; break; // &cylct -> &cylcty + case 1474: state = 1486; break; // &Dc -> &Dcy + case 1480: state = 1488; break; // &dc -> &dcy + case 1531: state = 1532; break; // &dempt -> &dempty + case 1662: state = 1663; break; // &DJc -> &DJcy + case 1666: state = 1667; break; // &djc -> &djcy + case 2045: state = 2052; break; // &dsc -> &dscy + case 2049: state = 2050; break; // &DSc -> &DScy + case 2094: state = 2095; break; // &DZc -> &DZcy + case 2098: state = 2099; break; // &dzc -> &dzcy + case 2127: state = 2153; break; // &Ec -> &Ecy + case 2133: state = 2155; break; // &ec -> &ecy + case 2239: state = 2240; break; // &empt -> &empty + case 2247: state = 2248; break; // &Empt -> &Empty + case 2265: state = 2266; break; // &EmptyVer -> &EmptyVery + case 2518: state = 2519; break; // &Fc -> &Fcy + case 2521: state = 2522; break; // &fc -> &fcy + case 2573: state = 2574; break; // &FilledVer -> &FilledVery + case 2736: state = 2751; break; // &Gc -> &Gcy + case 2746: state = 2753; break; // &gc -> &gcy + case 2817: state = 2818; break; // &GJc -> &GJcy + case 2821: state = 2822; break; // &gjc -> &gjcy + case 3020: state = 3225; break; // &h -> &hy + case 3038: state = 3039; break; // &HARDc -> &HARDcy + case 3043: state = 3044; break; // &hardc -> &hardcy + case 3250: state = 3263; break; // &ic -> &icy + case 3252: state = 3261; break; // &Ic -> &Icy + case 3270: state = 3271; break; // &IEc -> &IEcy + case 3274: state = 3275; break; // &iec -> &iecy + case 3348: state = 3349; break; // &Imaginar -> &Imaginary + case 3464: state = 3465; break; // &IOc -> &IOcy + case 3468: state = 3469; break; // &ioc -> &iocy + case 3541: state = 3542; break; // &Iukc -> &Iukcy + case 3546: state = 3547; break; // &iukc -> &iukcy + case 3556: state = 3567; break; // &Jc -> &Jcy + case 3562: state = 3569; break; // &jc -> &jcy + case 3600: state = 3601; break; // &Jserc -> &Jsercy + case 3605: state = 3606; break; // &jserc -> &jsercy + case 3610: state = 3611; break; // &Jukc -> &Jukcy + case 3615: state = 3616; break; // &jukc -> &jukcy + case 3632: state = 3644; break; // &Kc -> &Kcy + case 3638: state = 3646; break; // &kc -> &kcy + case 3661: state = 3662; break; // &KHc -> &KHcy + case 3665: state = 3666; break; // &khc -> &khcy + case 3669: state = 3670; break; // &KJc -> &KJcy + case 3673: state = 3674; break; // &kjc -> &kjcy + case 3714: state = 3715; break; // &laempt -> &laempty + case 3837: state = 3865; break; // &Lc -> &Lcy + case 3843: state = 3867; break; // &lc -> &lcy + case 4339: state = 4340; break; // &LJc -> &LJcy + case 4343: state = 4344; break; // &ljc -> &ljcy + case 4809: state = 4818; break; // &mc -> &mcy + case 4815: state = 4816; break; // &Mc -> &Mcy + case 5020: state = 5057; break; // &nc -> &ncy + case 5024: state = 5055; break; // &Nc -> &Ncy + case 5123: state = 5124; break; // &NegativeVer -> &NegativeVery + case 5249: state = 5250; break; // &NJc -> &NJcy + case 5253: state = 5254; break; // &njc -> &njcy + case 6148: state = 6161; break; // &oc -> &ocy + case 6152: state = 6159; break; // &Oc -> &Ocy + case 6312: state = 6313; break; // &OpenCurl -> &OpenCurly + case 6491: state = 6492; break; // &Pc -> &Pcy + case 6494: state = 6495; break; // &pc -> &pcy + case 6667: state = 6668; break; // &preccurl -> &preccurly + case 6904: state = 6905; break; // &raempt -> &raempty + case 7021: state = 7049; break; // &Rc -> &Rcy + case 7027: state = 7051; break; // &rc -> &rcy + case 7596: state = 7597; break; // &RuleDela -> &RuleDelay + case 7629: state = 7691; break; // &Sc -> &Scy + case 7631: state = 7693; break; // &sc -> &scy + case 7751: state = 7831; break; // &sh -> ­ + case 7759: state = 7760; break; // &SHCHc -> &SHCHcy + case 7762: state = 7770; break; // &shc -> &shcy + case 7764: state = 7765; break; // &shchc -> &shchcy + case 7767: state = 7768; break; // &SHc -> &SHcy + case 7933: state = 7934; break; // &SOFTc -> &SOFTcy + case 7939: state = 7940; break; // &softc -> &softcy + case 8211: state = 8212; break; // &succcurl -> &succcurly + case 8419: state = 8441; break; // &Tc -> &Tcy + case 8425: state = 8443; break; // &tc -> &tcy + case 8487: state = 8488; break; // &thetas -> &thetasy + case 8710: state = 8717; break; // &tsc -> &tscy + case 8714: state = 8715; break; // &TSc -> &TScy + case 8720: state = 8721; break; // &TSHc -> &TSHcy + case 8724: state = 8725; break; // &tshc -> &tshcy + case 8799: state = 8800; break; // &Ubrc -> &Ubrcy + case 8804: state = 8805; break; // &ubrc -> &ubrcy + case 8815: state = 8825; break; // &Uc -> &Ucy + case 8820: state = 8827; break; // &uc -> &ucy + case 9314: state = 9315; break; // &Vc -> &Vcy + case 9317: state = 9318; break; // &vc -> &vcy + case 9360: state = 9403; break; // &Ver -> &Very + case 9674: state = 9683; break; // &yac -> &yacy + case 9680: state = 9681; break; // &YAc -> &YAcy + case 9685: state = 9695; break; // &Yc -> &Ycy + case 9690: state = 9697; break; // &yc -> &ycy + case 9709: state = 9710; break; // &YIc -> &YIcy + case 9713: state = 9714; break; // &yic -> &yicy + case 9733: state = 9734; break; // &YUc -> &YUcy + case 9737: state = 9738; break; // &yuc -> &yucy + case 9761: state = 9773; break; // &Zc -> &Zcy + case 9767: state = 9775; break; // &zc -> &zcy + case 9818: state = 9819; break; // &ZHc -> &ZHcy + case 9822: state = 9823; break; // &zhc -> &zhcy default: return false; } break; case 'z': switch (state) { - case 0: state = 7651; break; // & -> &z - case 102: state = 127; break; // &ang -> &angz - case 401: state = 402; break; // &blacklo -> &blackloz - case 1097: state = 1647; break; // &d -> &dz - case 2479: state = 2480; break; // &Hori -> &Horiz - case 3466: state = 3632; break; // &lo -> &loz - case 5991: state = 6579; break; // &s -> &sz - case 6816: state = 6817; break; // &trpe -> &trpez - case 7223: state = 7441; break; // &v -> &vz - case 7443: state = 7444; break; // &vzig -> &vzigz + case 0: state = 9754; break; // & -> &z + case 136: state = 178; break; // &ang -> &angz + case 524: state = 525; break; // &blacklo -> &blackloz + case 1432: state = 2097; break; // &d -> &dz + case 3172: state = 3173; break; // &Hori -> &Horiz + case 4422: state = 4612; break; // &lo -> &loz + case 7617: state = 8395; break; // &s -> &sz + case 8699: state = 8700; break; // &trpe -> &trpez + case 9201: state = 9477; break; // &v -> &vz + case 9479: state = 9480; break; // &vzig -> &vzigz default: return false; } break; @@ -8077,2130 +10207,2236 @@ static string GetNamedEntityValue (int state) { switch (state) { case 6: return "\u00C1"; // Á - case 12: return "\u00E1"; // á - case 17: return "\u0102"; // &Abreve - case 22: return "\u0103"; // &abreve - case 23: return "\u223E"; // &ac - case 24: return "\u223F"; // &acd - case 25: return "\u223E\u0333"; // &acE - case 29: return "\u00C2"; //  - case 32: return "\u00E2"; // â - case 35: return "\u00B4"; // ´ - case 36: return "\u0410"; // &Acy - case 37: return "\u0430"; // &acy - case 41: return "\u00C6"; // Æ - case 45: return "\u00E6"; // æ - case 46: return "\u2061"; // &af - case 48: return "\uD835\uDD04"; // &Afr - case 49: return "\uD835\uDD1E"; // &afr - case 54: return "\u00C0"; // À - case 59: return "\u00E0"; // à - case 65: return "\u2135"; // &alefsym - case 67: return "\u2135"; // &aleph - case 71: return "\u0391"; // &Alpha - case 74: return "\u03B1"; // &alpha - case 78: return "\u0100"; // &Amacr - case 82: return "\u0101"; // &amacr - case 84: return "\u2A3F"; // &amalg - case 86: return "\u0026"; // & - case 87: return "\u0026"; // & - case 89: return "\u2A53"; // &And - case 91: return "\u2227"; // &and - case 94: return "\u2A55"; // &andand - case 95: return "\u2A5C"; // &andd - case 100: return "\u2A58"; // &andslope - case 101: return "\u2A5A"; // &andv - case 102: return "\u2220"; // &ang - case 103: return "\u29A4"; // &ange - case 105: return "\u2220"; // &angle - case 108: return "\u2221"; // &angmsd - case 110: return "\u29A8"; // &angmsdaa - case 111: return "\u29A9"; // &angmsdab - case 112: return "\u29AA"; // &angmsdac - case 113: return "\u29AB"; // &angmsdad - case 114: return "\u29AC"; // &angmsdae - case 115: return "\u29AD"; // &angmsdaf - case 116: return "\u29AE"; // &angmsdag - case 117: return "\u29AF"; // &angmsdah - case 119: return "\u221F"; // &angrt - case 121: return "\u22BE"; // &angrtvb - case 122: return "\u299D"; // &angrtvbd - case 125: return "\u2222"; // &angsph - case 126: return "\u00C5"; // &angst - case 130: return "\u237C"; // &angzarr - case 134: return "\u0104"; // &Aogon - case 138: return "\u0105"; // &aogon - case 140: return "\uD835\uDD38"; // &Aopf - case 142: return "\uD835\uDD52"; // &aopf - case 143: return "\u2248"; // &ap - case 147: return "\u2A6F"; // &apacir - case 148: return "\u2A70"; // &apE - case 149: return "\u224A"; // &ape - case 151: return "\u224B"; // &apid - case 153: return "\u0027"; // &apos - case 165: return "\u2061"; // &ApplyFunction - case 169: return "\u2248"; // &approx - case 171: return "\u224A"; // &approxeq - case 175: return "\u00C5"; // Å - case 179: return "\u00E5"; // å - case 182: return "\uD835\uDC9C"; // &Ascr - case 185: return "\uD835\uDCB6"; // &ascr - case 189: return "\u2254"; // &Assign - case 190: return "\u002A"; // &ast - case 193: return "\u2248"; // &asymp - case 195: return "\u224D"; // &asympeq - case 200: return "\u00C3"; // à - case 205: return "\u00E3"; // ã - case 208: return "\u00C4"; // Ä - case 211: return "\u00E4"; // ä - case 218: return "\u2233"; // &awconint - case 221: return "\u2A11"; // &awint - case 229: return "\u224C"; // &backcong - case 236: return "\u03F6"; // &backepsilon - case 241: return "\u2035"; // &backprime - case 244: return "\u223D"; // &backsim - case 246: return "\u22CD"; // &backsimeq - case 255: return "\u2216"; // &Backslash - case 257: return "\u2AE7"; // &Barv - case 261: return "\u22BD"; // &barvee - case 264: return "\u2306"; // &Barwed - case 267: return "\u2305"; // &barwed - case 269: return "\u2305"; // &barwedge - case 272: return "\u23B5"; // &bbrk - case 276: return "\u23B6"; // &bbrktbrk - case 280: return "\u224C"; // &bcong - case 282: return "\u0411"; // &Bcy - case 283: return "\u0431"; // &bcy - case 287: return "\u201E"; // &bdquo - case 292: return "\u2235"; // &becaus - case 298: return "\u2235"; // &Because - case 299: return "\u2235"; // &because - case 304: return "\u29B0"; // &bemptyv - case 307: return "\u03F6"; // &bepsi - case 311: return "\u212C"; // &bernou - case 319: return "\u212C"; // &Bernoullis - case 321: return "\u0392"; // &Beta - case 323: return "\u03B2"; // &beta - case 324: return "\u2136"; // &beth - case 328: return "\u226C"; // &between - case 330: return "\uD835\uDD05"; // &Bfr - case 332: return "\uD835\uDD1F"; // &bfr - case 337: return "\u22C2"; // &bigcap - case 340: return "\u25EF"; // &bigcirc - case 342: return "\u22C3"; // &bigcup - case 346: return "\u2A00"; // &bigodot - case 350: return "\u2A01"; // &bigoplus - case 355: return "\u2A02"; // &bigotimes - case 360: return "\u2A06"; // &bigsqcup - case 363: return "\u2605"; // &bigstar - case 375: return "\u25BD"; // &bigtriangledown - case 377: return "\u25B3"; // &bigtriangleup - case 382: return "\u2A04"; // &biguplus - case 385: return "\u22C1"; // &bigvee - case 390: return "\u22C0"; // &bigwedge - case 395: return "\u290D"; // &bkarow - case 406: return "\u29EB"; // &blacklozenge - case 412: return "\u25AA"; // &blacksquare - case 420: return "\u25B4"; // &blacktriangle - case 424: return "\u25BE"; // &blacktriangledown - case 428: return "\u25C2"; // &blacktriangleleft - case 433: return "\u25B8"; // &blacktriangleright - case 435: return "\u2423"; // &blank - case 438: return "\u2592"; // &blk12 - case 439: return "\u2591"; // &blk14 - case 441: return "\u2593"; // &blk34 - case 444: return "\u2588"; // &block - case 446: return "\u003D\u20E5"; // &bne - case 450: return "\u2261\u20E5"; // &bnequiv - case 453: return "\u2AED"; // &bNot - case 455: return "\u2310"; // &bnot - case 458: return "\uD835\uDD39"; // &Bopf - case 461: return "\uD835\uDD53"; // &bopf - case 462: return "\u22A5"; // &bot - case 465: return "\u22A5"; // &bottom - case 469: return "\u22C8"; // &bowtie - case 473: return "\u29C9"; // &boxbox - case 475: return "\u2557"; // &boxDL - case 476: return "\u2556"; // &boxDl - case 478: return "\u2555"; // &boxdL - case 479: return "\u2510"; // &boxdl - case 480: return "\u2554"; // &boxDR - case 481: return "\u2553"; // &boxDr - case 482: return "\u2552"; // &boxdR - case 483: return "\u250C"; // &boxdr - case 484: return "\u2550"; // &boxH - case 485: return "\u2500"; // &boxh - case 486: return "\u2566"; // &boxHD - case 487: return "\u2564"; // &boxHd - case 488: return "\u2565"; // &boxhD - case 489: return "\u252C"; // &boxhd - case 490: return "\u2569"; // &boxHU - case 491: return "\u2567"; // &boxHu - case 492: return "\u2568"; // &boxhU - case 493: return "\u2534"; // &boxhu - case 498: return "\u229F"; // &boxminus - case 502: return "\u229E"; // &boxplus - case 507: return "\u22A0"; // &boxtimes - case 509: return "\u255D"; // &boxUL - case 510: return "\u255C"; // &boxUl - case 512: return "\u255B"; // &boxuL - case 513: return "\u2518"; // &boxul - case 514: return "\u255A"; // &boxUR - case 515: return "\u2559"; // &boxUr - case 516: return "\u2558"; // &boxuR - case 517: return "\u2514"; // &boxur - case 518: return "\u2551"; // &boxV - case 519: return "\u2502"; // &boxv - case 520: return "\u256C"; // &boxVH - case 521: return "\u256B"; // &boxVh - case 522: return "\u256A"; // &boxvH - case 523: return "\u253C"; // &boxvh - case 524: return "\u2563"; // &boxVL - case 525: return "\u2562"; // &boxVl - case 526: return "\u2561"; // &boxvL - case 527: return "\u2524"; // &boxvl - case 528: return "\u2560"; // &boxVR - case 529: return "\u255F"; // &boxVr - case 530: return "\u255E"; // &boxvR - case 531: return "\u251C"; // &boxvr - case 536: return "\u2035"; // &bprime - case 540: return "\u02D8"; // &Breve - case 544: return "\u02D8"; // &breve - case 548: return "\u00A6"; // ¦ - case 551: return "\u212C"; // &Bscr - case 554: return "\uD835\uDCB7"; // &bscr - case 557: return "\u204F"; // &bsemi - case 559: return "\u223D"; // &bsim - case 560: return "\u22CD"; // &bsime - case 562: return "\u005C"; // &bsol - case 563: return "\u29C5"; // &bsolb - case 567: return "\u27C8"; // &bsolhsub - case 570: return "\u2022"; // &bull - case 572: return "\u2022"; // &bullet - case 574: return "\u224E"; // &bump - case 575: return "\u2AAE"; // &bumpE - case 576: return "\u224F"; // &bumpe - case 581: return "\u224E"; // &Bumpeq - case 582: return "\u224F"; // &bumpeq - case 588: return "\u0106"; // &Cacute - case 594: return "\u0107"; // &cacute - case 595: return "\u22D2"; // &Cap - case 596: return "\u2229"; // &cap - case 599: return "\u2A44"; // &capand - case 604: return "\u2A49"; // &capbrcup - case 607: return "\u2A4B"; // &capcap - case 609: return "\u2A47"; // &capcup - case 612: return "\u2A40"; // &capdot - case 629: return "\u2145"; // &CapitalDifferentialD - case 630: return "\u2229\uFE00"; // &caps - case 633: return "\u2041"; // &caret - case 635: return "\u02C7"; // &caron - case 640: return "\u212D"; // &Cayleys - case 644: return "\u2A4D"; // &ccaps - case 649: return "\u010C"; // &Ccaron - case 652: return "\u010D"; // &ccaron - case 656: return "\u00C7"; // Ç - case 660: return "\u00E7"; // ç - case 663: return "\u0108"; // &Ccirc - case 666: return "\u0109"; // &ccirc - case 671: return "\u2230"; // &Cconint - case 674: return "\u2A4C"; // &ccups - case 676: return "\u2A50"; // &ccupssm - case 679: return "\u010A"; // &Cdot - case 682: return "\u010B"; // &cdot - case 686: return "\u00B8"; // ¸ - case 692: return "\u00B8"; // &Cedilla - case 697: return "\u29B2"; // &cemptyv - case 699: return "\u00A2"; // ¢ - case 706: return "\u00B7"; // &CenterDot - case 711: return "\u00B7"; // ¢erdot - case 713: return "\u212D"; // &Cfr - case 715: return "\uD835\uDD20"; // &cfr - case 718: return "\u0427"; // &CHcy - case 721: return "\u0447"; // &chcy - case 724: return "\u2713"; // &check - case 728: return "\u2713"; // &checkmark - case 730: return "\u03A7"; // &Chi - case 731: return "\u03C7"; // &chi - case 733: return "\u25CB"; // &cir - case 734: return "\u02C6"; // &circ - case 736: return "\u2257"; // &circeq - case 747: return "\u21BA"; // &circlearrowleft - case 752: return "\u21BB"; // &circlearrowright - case 756: return "\u229B"; // &circledast - case 760: return "\u229A"; // &circledcirc - case 764: return "\u229D"; // &circleddash - case 772: return "\u2299"; // &CircleDot - case 773: return "\u00AE"; // &circledR - case 774: return "\u24C8"; // &circledS - case 779: return "\u2296"; // &CircleMinus - case 783: return "\u2295"; // &CirclePlus - case 788: return "\u2297"; // &CircleTimes - case 789: return "\u29C3"; // &cirE - case 790: return "\u2257"; // &cire - case 795: return "\u2A10"; // &cirfnint - case 798: return "\u2AEF"; // &cirmid - case 802: return "\u29C2"; // &cirscir - case 825: return "\u2232"; // &ClockwiseContourIntegral - case 843: return "\u201D"; // &CloseCurlyDoubleQuote - case 848: return "\u2019"; // &CloseCurlyQuote - case 852: return "\u2663"; // &clubs - case 855: return "\u2663"; // &clubsuit - case 859: return "\u2237"; // &Colon - case 863: return "\u003A"; // &colon - case 864: return "\u2A74"; // &Colone - case 865: return "\u2254"; // &colone - case 866: return "\u2254"; // &coloneq - case 869: return "\u002C"; // &comma - case 870: return "\u0040"; // &commat - case 871: return "\u2201"; // &comp - case 873: return "\u2218"; // &compfn - case 879: return "\u2201"; // &complement - case 882: return "\u2102"; // &complexes - case 884: return "\u2245"; // &cong - case 887: return "\u2A6D"; // &congdot - case 894: return "\u2261"; // &Congruent - case 897: return "\u222F"; // &Conint - case 900: return "\u222E"; // &conint - case 912: return "\u222E"; // &ContourIntegral - case 914: return "\u2102"; // &Copf - case 916: return "\uD835\uDD54"; // &copf - case 919: return "\u2210"; // &coprod - case 925: return "\u2210"; // &Coproduct - case 928: return "\u00A9"; // © - case 929: return "\u00A9"; // © - case 931: return "\u2117"; // ©sr - case 960: return "\u2233"; // &CounterClockwiseContourIntegral - case 964: return "\u21B5"; // &crarr - case 968: return "\u2A2F"; // &Cross - case 971: return "\u2717"; // &cross - case 974: return "\uD835\uDC9E"; // &Cscr - case 977: return "\uD835\uDCB8"; // &cscr - case 979: return "\u2ACF"; // &csub - case 980: return "\u2AD1"; // &csube - case 981: return "\u2AD0"; // &csup - case 982: return "\u2AD2"; // &csupe - case 986: return "\u22EF"; // &ctdot - case 992: return "\u2938"; // &cudarrl - case 993: return "\u2935"; // &cudarrr - case 996: return "\u22DE"; // &cuepr - case 998: return "\u22DF"; // &cuesc - case 1002: return "\u21B6"; // &cularr - case 1003: return "\u293D"; // &cularrp - case 1005: return "\u22D3"; // &Cup - case 1006: return "\u222A"; // &cup - case 1011: return "\u2A48"; // &cupbrcap - case 1014: return "\u224D"; // &CupCap - case 1017: return "\u2A46"; // &cupcap - case 1019: return "\u2A4A"; // &cupcup - case 1022: return "\u228D"; // &cupdot - case 1024: return "\u2A45"; // &cupor - case 1025: return "\u222A\uFE00"; // &cups - case 1029: return "\u21B7"; // &curarr - case 1030: return "\u293C"; // &curarrm - case 1038: return "\u22DE"; // &curlyeqprec - case 1042: return "\u22DF"; // &curlyeqsucc - case 1045: return "\u22CE"; // &curlyvee - case 1050: return "\u22CF"; // &curlywedge - case 1053: return "\u00A4"; // ¤ - case 1064: return "\u21B6"; // &curvearrowleft - case 1069: return "\u21B7"; // &curvearrowright - case 1072: return "\u22CE"; // &cuvee - case 1075: return "\u22CF"; // &cuwed - case 1082: return "\u2232"; // &cwconint - case 1085: return "\u2231"; // &cwint - case 1090: return "\u232D"; // &cylcty - case 1096: return "\u2021"; // &Dagger - case 1102: return "\u2020"; // &dagger - case 1106: return "\u2138"; // &daleth - case 1108: return "\u21A1"; // &Darr - case 1111: return "\u21D3"; // &dArr - case 1113: return "\u2193"; // &darr - case 1115: return "\u2010"; // &dash - case 1118: return "\u2AE4"; // &Dashv - case 1119: return "\u22A3"; // &dashv - case 1125: return "\u290F"; // &dbkarow - case 1128: return "\u02DD"; // &dblac - case 1133: return "\u010E"; // &Dcaron - case 1138: return "\u010F"; // &dcaron - case 1139: return "\u0414"; // &Dcy - case 1140: return "\u0434"; // &dcy - case 1141: return "\u2145"; // &DD - case 1142: return "\u2146"; // &dd - case 1147: return "\u2021"; // &ddagger - case 1149: return "\u21CA"; // &ddarr - case 1155: return "\u2911"; // &DDotrahd - case 1160: return "\u2A77"; // &ddotseq - case 1162: return "\u00B0"; // ° - case 1164: return "\u2207"; // &Del - case 1166: return "\u0394"; // &Delta - case 1169: return "\u03B4"; // &delta - case 1174: return "\u29B1"; // &demptyv - case 1179: return "\u297F"; // &dfisht - case 1181: return "\uD835\uDD07"; // &Dfr - case 1182: return "\uD835\uDD21"; // &dfr - case 1185: return "\u2965"; // &dHar - case 1189: return "\u21C3"; // &dharl - case 1190: return "\u21C2"; // &dharr - case 1205: return "\u00B4"; // &DiacriticalAcute - case 1208: return "\u02D9"; // &DiacriticalDot - case 1217: return "\u02DD"; // &DiacriticalDoubleAcute - case 1222: return "\u0060"; // &DiacriticalGrave - case 1227: return "\u02DC"; // &DiacriticalTilde - case 1230: return "\u22C4"; // &diam - case 1234: return "\u22C4"; // &Diamond - case 1237: return "\u22C4"; // &diamond - case 1241: return "\u2666"; // &diamondsuit - case 1242: return "\u2666"; // &diams - case 1243: return "\u00A8"; // &die - case 1254: return "\u2146"; // &DifferentialD - case 1259: return "\u03DD"; // &digamma - case 1262: return "\u22F2"; // &disin - case 1263: return "\u00F7"; // &div - case 1266: return "\u00F7"; // ÷ - case 1273: return "\u22C7"; // ÷ontimes - case 1276: return "\u22C7"; // &divonx - case 1279: return "\u0402"; // &DJcy - case 1282: return "\u0452"; // &djcy - case 1287: return "\u231E"; // &dlcorn - case 1290: return "\u230D"; // &dlcrop - case 1295: return "\u0024"; // &dollar - case 1298: return "\uD835\uDD3B"; // &Dopf - case 1300: return "\uD835\uDD55"; // &dopf - case 1301: return "\u00A8"; // &Dot - case 1302: return "\u02D9"; // &dot - case 1305: return "\u20DC"; // &DotDot - case 1307: return "\u2250"; // &doteq - case 1310: return "\u2251"; // &doteqdot - case 1315: return "\u2250"; // &DotEqual - case 1320: return "\u2238"; // &dotminus - case 1324: return "\u2214"; // &dotplus - case 1330: return "\u22A1"; // &dotsquare - case 1342: return "\u2306"; // &doublebarwedge - case 1361: return "\u222F"; // &DoubleContourIntegral - case 1364: return "\u00A8"; // &DoubleDot - case 1371: return "\u21D3"; // &DoubleDownArrow - case 1380: return "\u21D0"; // &DoubleLeftArrow - case 1390: return "\u21D4"; // &DoubleLeftRightArrow - case 1393: return "\u2AE4"; // &DoubleLeftTee - case 1405: return "\u27F8"; // &DoubleLongLeftArrow - case 1415: return "\u27FA"; // &DoubleLongLeftRightArrow - case 1425: return "\u27F9"; // &DoubleLongRightArrow - case 1435: return "\u21D2"; // &DoubleRightArrow - case 1438: return "\u22A8"; // &DoubleRightTee - case 1445: return "\u21D1"; // &DoubleUpArrow - case 1454: return "\u21D5"; // &DoubleUpDownArrow - case 1465: return "\u2225"; // &DoubleVerticalBar - case 1472: return "\u2193"; // &DownArrow - case 1477: return "\u21D3"; // &Downarrow - case 1484: return "\u2193"; // &downarrow - case 1487: return "\u2913"; // &DownArrowBar - case 1494: return "\u21F5"; // &DownArrowUpArrow - case 1499: return "\u0311"; // &DownBreve - case 1509: return "\u21CA"; // &downdownarrows - case 1520: return "\u21C3"; // &downharpoonleft - case 1525: return "\u21C2"; // &downharpoonright - case 1540: return "\u2950"; // &DownLeftRightVector - case 1549: return "\u295E"; // &DownLeftTeeVector - case 1555: return "\u21BD"; // &DownLeftVector - case 1558: return "\u2956"; // &DownLeftVectorBar - case 1572: return "\u295F"; // &DownRightTeeVector - case 1578: return "\u21C1"; // &DownRightVector - case 1581: return "\u2957"; // &DownRightVectorBar - case 1584: return "\u22A4"; // &DownTee - case 1589: return "\u21A7"; // &DownTeeArrow - case 1596: return "\u2910"; // &drbkarow - case 1600: return "\u231F"; // &drcorn - case 1603: return "\u230C"; // &drcrop - case 1606: return "\uD835\uDC9F"; // &Dscr - case 1609: return "\uD835\uDCB9"; // &dscr - case 1612: return "\u0405"; // &DScy - case 1613: return "\u0455"; // &dscy - case 1615: return "\u29F6"; // &dsol - case 1619: return "\u0110"; // &Dstrok - case 1623: return "\u0111"; // &dstrok - case 1627: return "\u22F1"; // &dtdot - case 1629: return "\u25BF"; // &dtri - case 1630: return "\u25BE"; // &dtrif - case 1634: return "\u21F5"; // &duarr - case 1637: return "\u296F"; // &duhar - case 1643: return "\u29A6"; // &dwangle - case 1646: return "\u040F"; // &DZcy - case 1649: return "\u045F"; // &dzcy - case 1655: return "\u27FF"; // &dzigrarr - case 1661: return "\u00C9"; // É - case 1667: return "\u00E9"; // é - case 1671: return "\u2A6E"; // &easter - case 1676: return "\u011A"; // &Ecaron - case 1681: return "\u011B"; // &ecaron - case 1683: return "\u2256"; // &ecir - case 1686: return "\u00CA"; // Ê - case 1687: return "\u00EA"; // ê - case 1691: return "\u2255"; // &ecolon - case 1692: return "\u042D"; // &Ecy - case 1693: return "\u044D"; // &ecy - case 1697: return "\u2A77"; // &eDDot - case 1700: return "\u0116"; // &Edot - case 1702: return "\u2251"; // &eDot - case 1705: return "\u0117"; // &edot - case 1706: return "\u2147"; // &ee - case 1710: return "\u2252"; // &efDot - case 1712: return "\uD835\uDD08"; // &Efr - case 1713: return "\uD835\uDD22"; // &efr - case 1714: return "\u2A9A"; // &eg - case 1719: return "\u00C8"; // È - case 1723: return "\u00E8"; // è - case 1724: return "\u2A96"; // &egs - case 1727: return "\u2A98"; // &egsdot - case 1728: return "\u2A99"; // &el - case 1734: return "\u2208"; // &Element - case 1740: return "\u23E7"; // &elinters - case 1741: return "\u2113"; // &ell - case 1742: return "\u2A95"; // &els - case 1745: return "\u2A97"; // &elsdot - case 1749: return "\u0112"; // &Emacr - case 1753: return "\u0113"; // &emacr - case 1756: return "\u2205"; // &empty - case 1759: return "\u2205"; // &emptyset - case 1773: return "\u25FB"; // &EmptySmallSquare - case 1774: return "\u2205"; // &emptyv - case 1789: return "\u25AB"; // &EmptyVerySmallSquare - case 1791: return "\u2003"; // &emsp - case 1793: return "\u2004"; // &emsp13 - case 1794: return "\u2005"; // &emsp14 - case 1796: return "\u014A"; // &ENG - case 1798: return "\u014B"; // &eng - case 1800: return "\u2002"; // &ensp - case 1804: return "\u0118"; // &Eogon - case 1808: return "\u0119"; // &eogon - case 1810: return "\uD835\uDD3C"; // &Eopf - case 1812: return "\uD835\uDD56"; // &eopf - case 1815: return "\u22D5"; // &epar - case 1817: return "\u29E3"; // &eparsl - case 1820: return "\u2A71"; // &eplus - case 1822: return "\u03B5"; // &epsi - case 1828: return "\u0395"; // &Epsilon - case 1831: return "\u03B5"; // &epsilon - case 1832: return "\u03F5"; // &epsiv - case 1837: return "\u2256"; // &eqcirc - case 1841: return "\u2255"; // &eqcolon - case 1844: return "\u2242"; // &eqsim - case 1851: return "\u2A96"; // &eqslantgtr - case 1855: return "\u2A95"; // &eqslantless - case 1859: return "\u2A75"; // &Equal - case 1863: return "\u003D"; // &equals - case 1868: return "\u2242"; // &EqualTilde - case 1871: return "\u225F"; // &equest - case 1879: return "\u21CC"; // &Equilibrium - case 1881: return "\u2261"; // &equiv - case 1883: return "\u2A78"; // &equivDD - case 1889: return "\u29E5"; // &eqvparsl - case 1893: return "\u2971"; // &erarr - case 1896: return "\u2253"; // &erDot - case 1899: return "\u2130"; // &Escr - case 1902: return "\u212F"; // &escr - case 1905: return "\u2250"; // &esdot - case 1907: return "\u2A73"; // &Esim - case 1909: return "\u2242"; // &esim - case 1911: return "\u0397"; // &Eta - case 1913: return "\u03B7"; // &eta - case 1915: return "\u00D0"; // Ð - case 1916: return "\u00F0"; // ð - case 1919: return "\u00CB"; // Ë - case 1922: return "\u00EB"; // ë - case 1924: return "\u20AC"; // &euro - case 1927: return "\u0021"; // &excl - case 1930: return "\u2203"; // &exist - case 1935: return "\u2203"; // &Exists - case 1944: return "\u2130"; // &expectation - case 1954: return "\u2147"; // &ExponentialE - case 1963: return "\u2147"; // &exponentiale - case 1976: return "\u2252"; // &fallingdotseq - case 1979: return "\u0424"; // &Fcy - case 1981: return "\u0444"; // &fcy - case 1986: return "\u2640"; // &female - case 1991: return "\uFB03"; // &ffilig - case 1994: return "\uFB00"; // &fflig - case 1997: return "\uFB04"; // &ffllig - case 1999: return "\uD835\uDD09"; // &Ffr - case 2000: return "\uD835\uDD23"; // &ffr - case 2004: return "\uFB01"; // &filig - case 2020: return "\u25FC"; // &FilledSmallSquare - case 2035: return "\u25AA"; // &FilledVerySmallSquare - case 2039: return "\u0066\u006A"; // &fjlig - case 2042: return "\u266D"; // &flat - case 2045: return "\uFB02"; // &fllig - case 2048: return "\u25B1"; // &fltns - case 2051: return "\u0192"; // &fnof - case 2054: return "\uD835\uDD3D"; // &Fopf - case 2057: return "\uD835\uDD57"; // &fopf - case 2061: return "\u2200"; // &ForAll - case 2065: return "\u2200"; // &forall - case 2066: return "\u22D4"; // &fork - case 2067: return "\u2AD9"; // &forkv - case 2075: return "\u2131"; // &Fouriertrf - case 2082: return "\u2A0D"; // &fpartint - case 2087: return "\u00BD"; // ½ - case 2088: return "\u2153"; // &frac13 - case 2089: return "\u00BC"; // ¼ - case 2090: return "\u2155"; // &frac15 - case 2091: return "\u2159"; // &frac16 - case 2092: return "\u215B"; // &frac18 - case 2094: return "\u2154"; // &frac23 - case 2095: return "\u2156"; // &frac25 - case 2097: return "\u00BE"; // ¾ - case 2098: return "\u2157"; // &frac35 - case 2099: return "\u215C"; // &frac38 - case 2101: return "\u2158"; // &frac45 - case 2103: return "\u215A"; // &frac56 - case 2104: return "\u215D"; // &frac58 - case 2106: return "\u215E"; // &frac78 - case 2108: return "\u2044"; // &frasl - case 2111: return "\u2322"; // &frown - case 2114: return "\u2131"; // &Fscr - case 2117: return "\uD835\uDCBB"; // &fscr - case 2123: return "\u01F5"; // &gacute - case 2128: return "\u0393"; // &Gamma - case 2131: return "\u03B3"; // &gamma - case 2132: return "\u03DC"; // &Gammad - case 2133: return "\u03DD"; // &gammad - case 2134: return "\u2A86"; // &gap - case 2139: return "\u011E"; // &Gbreve - case 2144: return "\u011F"; // &gbreve - case 2149: return "\u0122"; // &Gcedil - case 2152: return "\u011C"; // &Gcirc - case 2156: return "\u011D"; // &gcirc - case 2157: return "\u0413"; // &Gcy - case 2158: return "\u0433"; // &gcy - case 2161: return "\u0120"; // &Gdot - case 2164: return "\u0121"; // &gdot - case 2165: return "\u2267"; // &gE - case 2166: return "\u2265"; // &ge - case 2167: return "\u2A8C"; // &gEl - case 2168: return "\u22DB"; // &gel - case 2169: return "\u2265"; // &geq - case 2170: return "\u2267"; // &geqq - case 2175: return "\u2A7E"; // &geqslant - case 2176: return "\u2A7E"; // &ges - case 2178: return "\u2AA9"; // &gescc - case 2181: return "\u2A80"; // &gesdot - case 2182: return "\u2A82"; // &gesdoto - case 2183: return "\u2A84"; // &gesdotol - case 2184: return "\u22DB\uFE00"; // &gesl - case 2186: return "\u2A94"; // &gesles - case 2188: return "\uD835\uDD0A"; // &Gfr - case 2190: return "\uD835\uDD24"; // &gfr - case 2191: return "\u22D9"; // &Gg - case 2192: return "\u226B"; // &gg - case 2193: return "\u22D9"; // &ggg - case 2197: return "\u2137"; // &gimel - case 2200: return "\u0403"; // &GJcy - case 2203: return "\u0453"; // &gjcy - case 2204: return "\u2277"; // &gl - case 2205: return "\u2AA5"; // &gla - case 2206: return "\u2A92"; // &glE - case 2207: return "\u2AA4"; // &glj - case 2210: return "\u2A8A"; // &gnap - case 2214: return "\u2A8A"; // &gnapprox - case 2215: return "\u2269"; // &gnE - case 2216: return "\u2A88"; // &gne - case 2217: return "\u2A88"; // &gneq - case 2218: return "\u2269"; // &gneqq - case 2221: return "\u22E7"; // &gnsim - case 2224: return "\uD835\uDD3E"; // &Gopf - case 2227: return "\uD835\uDD58"; // &gopf - case 2231: return "\u0060"; // &grave - case 2242: return "\u2265"; // &GreaterEqual - case 2246: return "\u22DB"; // &GreaterEqualLess - case 2255: return "\u2267"; // &GreaterFullEqual - case 2262: return "\u2AA2"; // &GreaterGreater - case 2266: return "\u2277"; // &GreaterLess - case 2276: return "\u2A7E"; // &GreaterSlantEqual - case 2281: return "\u2273"; // &GreaterTilde - case 2284: return "\uD835\uDCA2"; // &Gscr - case 2287: return "\u210A"; // &gscr - case 2289: return "\u2273"; // &gsim - case 2290: return "\u2A8E"; // &gsime - case 2291: return "\u2A90"; // &gsiml - case 2292: return "\u003E"; // > - case 2293: return "\u226B"; // &Gt - case 2294: return "\u003E"; // > - case 2296: return "\u2AA7"; // >cc - case 2298: return "\u2A7A"; // >cir - case 2301: return "\u22D7"; // >dot - case 2305: return "\u2995"; // >lPar - case 2310: return "\u2A7C"; // >quest - case 2317: return "\u2A86"; // >rapprox - case 2319: return "\u2978"; // >rarr - case 2322: return "\u22D7"; // >rdot - case 2328: return "\u22DB"; // >reqless - case 2333: return "\u2A8C"; // >reqqless - case 2337: return "\u2277"; // >rless - case 2340: return "\u2273"; // >rsim - case 2348: return "\u2269\uFE00"; // &gvertneqq - case 2350: return "\u2269\uFE00"; // &gvnE - case 2355: return "\u02C7"; // &Hacek - case 2361: return "\u200A"; // &hairsp - case 2363: return "\u00BD"; // &half - case 2367: return "\u210B"; // &hamilt - case 2372: return "\u042A"; // &HARDcy - case 2376: return "\u044A"; // &hardcy - case 2379: return "\u21D4"; // &hArr - case 2380: return "\u2194"; // &harr - case 2383: return "\u2948"; // &harrcir - case 2384: return "\u21AD"; // &harrw - case 2385: return "\u005E"; // &Hat - case 2388: return "\u210F"; // &hbar - case 2392: return "\u0124"; // &Hcirc - case 2396: return "\u0125"; // &hcirc - case 2401: return "\u2665"; // &hearts - case 2404: return "\u2665"; // &heartsuit - case 2408: return "\u2026"; // &hellip - case 2412: return "\u22B9"; // &hercon - case 2414: return "\u210C"; // &Hfr - case 2416: return "\uD835\uDD25"; // &hfr - case 2427: return "\u210B"; // &HilbertSpace - case 2434: return "\u2925"; // &hksearow - case 2439: return "\u2926"; // &hkswarow - case 2443: return "\u21FF"; // &hoarr - case 2447: return "\u223B"; // &homtht - case 2458: return "\u21A9"; // &hookleftarrow - case 2468: return "\u21AA"; // &hookrightarrow - case 2471: return "\u210D"; // &Hopf - case 2473: return "\uD835\uDD59"; // &hopf - case 2477: return "\u2015"; // &horbar - case 2489: return "\u2500"; // &HorizontalLine - case 2492: return "\u210B"; // &Hscr - case 2495: return "\uD835\uDCBD"; // &hscr - case 2499: return "\u210F"; // &hslash - case 2503: return "\u0126"; // &Hstrok - case 2507: return "\u0127"; // &hstrok - case 2518: return "\u224E"; // &HumpDownHump - case 2523: return "\u224F"; // &HumpEqual - case 2528: return "\u2043"; // &hybull - case 2532: return "\u2010"; // &hyphen - case 2538: return "\u00CD"; // Í - case 2544: return "\u00ED"; // í - case 2545: return "\u2063"; // &ic - case 2549: return "\u00CE"; // Î - case 2552: return "\u00EE"; // î - case 2553: return "\u0418"; // &Icy - case 2554: return "\u0438"; // &icy - case 2557: return "\u0130"; // &Idot - case 2560: return "\u0415"; // &IEcy - case 2563: return "\u0435"; // &iecy - case 2566: return "\u00A1"; // ¡ - case 2568: return "\u21D4"; // &iff - case 2570: return "\u2111"; // &Ifr - case 2571: return "\uD835\uDD26"; // &ifr - case 2576: return "\u00CC"; // Ì - case 2581: return "\u00EC"; // ì - case 2582: return "\u2148"; // &ii - case 2586: return "\u2A0C"; // &iiiint - case 2588: return "\u222D"; // &iiint - case 2592: return "\u29DC"; // &iinfin - case 2595: return "\u2129"; // &iiota - case 2599: return "\u0132"; // &IJlig - case 2603: return "\u0133"; // &ijlig - case 2604: return "\u2111"; // &Im - case 2607: return "\u012A"; // &Imacr - case 2611: return "\u012B"; // &imacr - case 2613: return "\u2111"; // &image - case 2620: return "\u2148"; // &ImaginaryI - case 2624: return "\u2110"; // &imagline - case 2628: return "\u2111"; // &imagpart - case 2630: return "\u0131"; // &imath - case 2632: return "\u22B7"; // &imof - case 2635: return "\u01B5"; // &imped - case 2640: return "\u21D2"; // &Implies - case 2641: return "\u2208"; // &in - case 2645: return "\u2105"; // &incare - case 2648: return "\u221E"; // &infin - case 2651: return "\u29DD"; // &infintie - case 2655: return "\u0131"; // &inodot - case 2657: return "\u222C"; // &Int - case 2658: return "\u222B"; // &int - case 2661: return "\u22BA"; // &intcal - case 2666: return "\u2124"; // &integers - case 2671: return "\u222B"; // &Integral - case 2675: return "\u22BA"; // &intercal - case 2683: return "\u22C2"; // &Intersection - case 2688: return "\u2A17"; // &intlarhk - case 2692: return "\u2A3C"; // &intprod - case 2704: return "\u2063"; // &InvisibleComma - case 2709: return "\u2062"; // &InvisibleTimes - case 2712: return "\u0401"; // &IOcy - case 2715: return "\u0451"; // &iocy - case 2719: return "\u012E"; // &Iogon - case 2722: return "\u012F"; // &iogon - case 2724: return "\uD835\uDD40"; // &Iopf - case 2726: return "\uD835\uDD5A"; // &iopf - case 2728: return "\u0399"; // &Iota - case 2730: return "\u03B9"; // &iota - case 2734: return "\u2A3C"; // &iprod - case 2739: return "\u00BF"; // ¿ - case 2742: return "\u2110"; // &Iscr - case 2745: return "\uD835\uDCBE"; // &iscr - case 2747: return "\u2208"; // &isin - case 2750: return "\u22F5"; // &isindot - case 2751: return "\u22F9"; // &isinE - case 2752: return "\u22F4"; // &isins - case 2753: return "\u22F3"; // &isinsv - case 2754: return "\u2208"; // &isinv - case 2755: return "\u2062"; // &it - case 2760: return "\u0128"; // &Itilde - case 2764: return "\u0129"; // &itilde - case 2768: return "\u0406"; // &Iukcy - case 2772: return "\u0456"; // &iukcy - case 2774: return "\u00CF"; // Ï - case 2776: return "\u00EF"; // ï - case 2781: return "\u0134"; // &Jcirc - case 2786: return "\u0135"; // &jcirc - case 2787: return "\u0419"; // &Jcy - case 2788: return "\u0439"; // &jcy - case 2790: return "\uD835\uDD0D"; // &Jfr - case 2792: return "\uD835\uDD27"; // &jfr - case 2796: return "\u0237"; // &jmath - case 2799: return "\uD835\uDD41"; // &Jopf - case 2802: return "\uD835\uDD5B"; // &jopf - case 2805: return "\uD835\uDCA5"; // &Jscr - case 2808: return "\uD835\uDCBF"; // &jscr - case 2812: return "\u0408"; // &Jsercy - case 2816: return "\u0458"; // &jsercy - case 2820: return "\u0404"; // &Jukcy - case 2824: return "\u0454"; // &jukcy - case 2829: return "\u039A"; // &Kappa - case 2834: return "\u03BA"; // &kappa - case 2835: return "\u03F0"; // &kappav - case 2840: return "\u0136"; // &Kcedil - case 2845: return "\u0137"; // &kcedil - case 2846: return "\u041A"; // &Kcy - case 2847: return "\u043A"; // &kcy - case 2849: return "\uD835\uDD0E"; // &Kfr - case 2851: return "\uD835\uDD28"; // &kfr - case 2856: return "\u0138"; // &kgreen - case 2859: return "\u0425"; // &KHcy - case 2862: return "\u0445"; // &khcy - case 2865: return "\u040C"; // &KJcy - case 2868: return "\u045C"; // &kjcy - case 2871: return "\uD835\uDD42"; // &Kopf - case 2874: return "\uD835\uDD5C"; // &kopf - case 2877: return "\uD835\uDCA6"; // &Kscr - case 2880: return "\uD835\uDCC0"; // &kscr - case 2885: return "\u21DA"; // &lAarr - case 2891: return "\u0139"; // &Lacute - case 2896: return "\u013A"; // &lacute - case 2902: return "\u29B4"; // &laemptyv - case 2906: return "\u2112"; // &lagran - case 2910: return "\u039B"; // &Lambda - case 2914: return "\u03BB"; // &lambda - case 2916: return "\u27EA"; // &Lang - case 2918: return "\u27E8"; // &lang - case 2919: return "\u2991"; // &langd - case 2921: return "\u27E8"; // &langle - case 2922: return "\u2A85"; // &lap - case 2930: return "\u2112"; // &Laplacetrf - case 2933: return "\u00AB"; // « - case 2935: return "\u219E"; // &Larr - case 2937: return "\u21D0"; // &lArr - case 2939: return "\u2190"; // &larr - case 2940: return "\u21E4"; // &larrb - case 2942: return "\u291F"; // &larrbfs - case 2944: return "\u291D"; // &larrfs - case 2946: return "\u21A9"; // &larrhk - case 2948: return "\u21AB"; // &larrlp - case 2950: return "\u2939"; // &larrpl - case 2953: return "\u2973"; // &larrsim - case 2955: return "\u21A2"; // &larrtl - case 2956: return "\u2AAB"; // &lat - case 2960: return "\u291B"; // &lAtail - case 2963: return "\u2919"; // &latail - case 2964: return "\u2AAD"; // &late - case 2965: return "\u2AAD\uFE00"; // &lates - case 2969: return "\u290E"; // &lBarr - case 2973: return "\u290C"; // &lbarr - case 2976: return "\u2772"; // &lbbrk - case 2980: return "\u007B"; // &lbrace - case 2981: return "\u005B"; // &lbrack - case 2983: return "\u298B"; // &lbrke - case 2986: return "\u298F"; // &lbrksld - case 2987: return "\u298D"; // &lbrkslu - case 2992: return "\u013D"; // &Lcaron - case 2997: return "\u013E"; // &lcaron - case 3001: return "\u013B"; // &Lcedil - case 3005: return "\u013C"; // &lcedil - case 3007: return "\u2308"; // &lceil - case 3009: return "\u007B"; // &lcub - case 3010: return "\u041B"; // &Lcy - case 3011: return "\u043B"; // &lcy - case 3014: return "\u2936"; // &ldca - case 3017: return "\u201C"; // &ldquo - case 3018: return "\u201E"; // &ldquor - case 3023: return "\u2967"; // &ldrdhar - case 3028: return "\u294B"; // &ldrushar - case 3030: return "\u21B2"; // &ldsh - case 3031: return "\u2266"; // &lE - case 3032: return "\u2264"; // &le - case 3047: return "\u27E8"; // &LeftAngleBracket - case 3051: return "\u2190"; // &LeftArrow - case 3056: return "\u21D0"; // &Leftarrow - case 3063: return "\u2190"; // &leftarrow - case 3066: return "\u21E4"; // &LeftArrowBar - case 3076: return "\u21C6"; // &LeftArrowRightArrow - case 3080: return "\u21A2"; // &leftarrowtail - case 3087: return "\u2308"; // &LeftCeiling - case 3100: return "\u27E6"; // &LeftDoubleBracket - case 3111: return "\u2961"; // &LeftDownTeeVector - case 3117: return "\u21C3"; // &LeftDownVector - case 3120: return "\u2959"; // &LeftDownVectorBar - case 3125: return "\u230A"; // &LeftFloor - case 3136: return "\u21BD"; // &leftharpoondown - case 3138: return "\u21BC"; // &leftharpoonup - case 3148: return "\u21C7"; // &leftleftarrows - case 3158: return "\u2194"; // &LeftRightArrow - case 3168: return "\u21D4"; // &Leftrightarrow - case 3178: return "\u2194"; // &leftrightarrow - case 3179: return "\u21C6"; // &leftrightarrows - case 3187: return "\u21CB"; // &leftrightharpoons - case 3197: return "\u21AD"; // &leftrightsquigarrow - case 3203: return "\u294E"; // &LeftRightVector - case 3206: return "\u22A3"; // &LeftTee - case 3211: return "\u21A4"; // &LeftTeeArrow - case 3217: return "\u295A"; // &LeftTeeVector - case 3227: return "\u22CB"; // &leftthreetimes - case 3234: return "\u22B2"; // &LeftTriangle - case 3237: return "\u29CF"; // &LeftTriangleBar - case 3242: return "\u22B4"; // &LeftTriangleEqual - case 3254: return "\u2951"; // &LeftUpDownVector - case 3263: return "\u2960"; // &LeftUpTeeVector - case 3269: return "\u21BF"; // &LeftUpVector - case 3272: return "\u2958"; // &LeftUpVectorBar - case 3278: return "\u21BC"; // &LeftVector - case 3281: return "\u2952"; // &LeftVectorBar - case 3282: return "\u2A8B"; // &lEg - case 3283: return "\u22DA"; // &leg - case 3284: return "\u2264"; // &leq - case 3285: return "\u2266"; // &leqq - case 3290: return "\u2A7D"; // &leqslant - case 3291: return "\u2A7D"; // &les - case 3293: return "\u2AA8"; // &lescc - case 3296: return "\u2A7F"; // &lesdot - case 3297: return "\u2A81"; // &lesdoto - case 3298: return "\u2A83"; // &lesdotor - case 3299: return "\u22DA\uFE00"; // &lesg - case 3301: return "\u2A93"; // &lesges - case 3308: return "\u2A85"; // &lessapprox - case 3311: return "\u22D6"; // &lessdot - case 3316: return "\u22DA"; // &lesseqgtr - case 3320: return "\u2A8B"; // &lesseqqgtr - case 3334: return "\u22DA"; // &LessEqualGreater - case 3343: return "\u2266"; // &LessFullEqual - case 3350: return "\u2276"; // &LessGreater - case 3353: return "\u2276"; // &lessgtr - case 3357: return "\u2AA1"; // &LessLess - case 3360: return "\u2272"; // &lesssim - case 3370: return "\u2A7D"; // &LessSlantEqual - case 3375: return "\u2272"; // &LessTilde - case 3380: return "\u297C"; // &lfisht - case 3384: return "\u230A"; // &lfloor - case 3386: return "\uD835\uDD0F"; // &Lfr - case 3387: return "\uD835\uDD29"; // &lfr - case 3388: return "\u2276"; // &lg - case 3389: return "\u2A91"; // &lgE - case 3392: return "\u2962"; // &lHar - case 3396: return "\u21BD"; // &lhard - case 3397: return "\u21BC"; // &lharu - case 3398: return "\u296A"; // &lharul - case 3401: return "\u2584"; // &lhblk - case 3404: return "\u0409"; // &LJcy - case 3407: return "\u0459"; // &ljcy - case 3408: return "\u22D8"; // &Ll - case 3409: return "\u226A"; // &ll - case 3412: return "\u21C7"; // &llarr - case 3418: return "\u231E"; // &llcorner - case 3426: return "\u21DA"; // &Lleftarrow - case 3430: return "\u296B"; // &llhard - case 3433: return "\u25FA"; // &lltri - case 3438: return "\u013F"; // &Lmidot - case 3443: return "\u0140"; // &lmidot - case 3447: return "\u23B0"; // &lmoust - case 3451: return "\u23B0"; // &lmoustache - case 3454: return "\u2A89"; // &lnap - case 3458: return "\u2A89"; // &lnapprox - case 3459: return "\u2268"; // &lnE - case 3460: return "\u2A87"; // &lne - case 3461: return "\u2A87"; // &lneq - case 3462: return "\u2268"; // &lneqq - case 3465: return "\u22E6"; // &lnsim - case 3469: return "\u27EC"; // &loang - case 3471: return "\u21FD"; // &loarr - case 3474: return "\u27E6"; // &lobrk - case 3486: return "\u27F5"; // &LongLeftArrow - case 3495: return "\u27F8"; // &Longleftarrow - case 3506: return "\u27F5"; // &longleftarrow - case 3516: return "\u27F7"; // &LongLeftRightArrow - case 3526: return "\u27FA"; // &Longleftrightarrow - case 3536: return "\u27F7"; // &longleftrightarrow - case 3542: return "\u27FC"; // &longmapsto - case 3552: return "\u27F6"; // &LongRightArrow - case 3562: return "\u27F9"; // &Longrightarrow - case 3572: return "\u27F6"; // &longrightarrow - case 3583: return "\u21AB"; // &looparrowleft - case 3588: return "\u21AC"; // &looparrowright - case 3591: return "\u2985"; // &lopar - case 3593: return "\uD835\uDD43"; // &Lopf - case 3594: return "\uD835\uDD5D"; // &lopf - case 3597: return "\u2A2D"; // &loplus - case 3602: return "\u2A34"; // &lotimes - case 3606: return "\u2217"; // &lowast - case 3609: return "\u005F"; // &lowbar - case 3621: return "\u2199"; // &LowerLeftArrow - case 3631: return "\u2198"; // &LowerRightArrow - case 3632: return "\u25CA"; // &loz - case 3636: return "\u25CA"; // &lozenge - case 3637: return "\u29EB"; // &lozf - case 3640: return "\u0028"; // &lpar - case 3642: return "\u2993"; // &lparlt - case 3646: return "\u21C6"; // &lrarr - case 3652: return "\u231F"; // &lrcorner - case 3655: return "\u21CB"; // &lrhar - case 3656: return "\u296D"; // &lrhard - case 3657: return "\u200E"; // &lrm - case 3660: return "\u22BF"; // &lrtri - case 3665: return "\u2039"; // &lsaquo - case 3668: return "\u2112"; // &Lscr - case 3670: return "\uD835\uDCC1"; // &lscr - case 3671: return "\u21B0"; // &Lsh - case 3672: return "\u21B0"; // &lsh - case 3674: return "\u2272"; // &lsim - case 3675: return "\u2A8D"; // &lsime - case 3676: return "\u2A8F"; // &lsimg - case 3678: return "\u005B"; // &lsqb - case 3680: return "\u2018"; // &lsquo - case 3681: return "\u201A"; // &lsquor - case 3685: return "\u0141"; // &Lstrok - case 3689: return "\u0142"; // &lstrok - case 3690: return "\u003C"; // < - case 3691: return "\u226A"; // &Lt - case 3692: return "\u003C"; // < - case 3694: return "\u2AA6"; // <cc - case 3696: return "\u2A79"; // <cir - case 3699: return "\u22D6"; // <dot - case 3703: return "\u22CB"; // <hree - case 3707: return "\u22C9"; // <imes - case 3711: return "\u2976"; // <larr - case 3716: return "\u2A7B"; // <quest - case 3718: return "\u25C3"; // <ri - case 3719: return "\u22B4"; // <rie - case 3720: return "\u25C2"; // <rif - case 3723: return "\u2996"; // <rPar - case 3730: return "\u294A"; // &lurdshar - case 3734: return "\u2966"; // &luruhar - case 3742: return "\u2268\uFE00"; // &lvertneqq - case 3744: return "\u2268\uFE00"; // &lvnE - case 3748: return "\u00AF"; // ¯ - case 3750: return "\u2642"; // &male - case 3751: return "\u2720"; // &malt - case 3754: return "\u2720"; // &maltese - case 3757: return "\u2905"; // &Map - case 3758: return "\u21A6"; // &map - case 3761: return "\u21A6"; // &mapsto - case 3765: return "\u21A7"; // &mapstodown - case 3769: return "\u21A4"; // &mapstoleft - case 3771: return "\u21A5"; // &mapstoup - case 3775: return "\u25AE"; // &marker - case 3780: return "\u2A29"; // &mcomma - case 3782: return "\u041C"; // &Mcy - case 3783: return "\u043C"; // &mcy - case 3787: return "\u2014"; // &mdash - case 3791: return "\u223A"; // &mDDot - case 3803: return "\u2221"; // &measuredangle - case 3813: return "\u205F"; // &MediumSpace - case 3820: return "\u2133"; // &Mellintrf - case 3822: return "\uD835\uDD10"; // &Mfr - case 3824: return "\uD835\uDD2A"; // &mfr - case 3826: return "\u2127"; // &mho - case 3830: return "\u00B5"; // µ - case 3831: return "\u2223"; // &mid - case 3834: return "\u002A"; // &midast - case 3837: return "\u2AF0"; // &midcir - case 3840: return "\u00B7"; // · - case 3843: return "\u2212"; // &minus - case 3844: return "\u229F"; // &minusb - case 3845: return "\u2238"; // &minusd - case 3846: return "\u2A2A"; // &minusdu - case 3854: return "\u2213"; // &MinusPlus - case 3857: return "\u2ADB"; // &mlcp - case 3859: return "\u2026"; // &mldr - case 3864: return "\u2213"; // &mnplus - case 3869: return "\u22A7"; // &models - case 3872: return "\uD835\uDD44"; // &Mopf - case 3874: return "\uD835\uDD5E"; // &mopf - case 3875: return "\u2213"; // &mp - case 3878: return "\u2133"; // &Mscr - case 3881: return "\uD835\uDCC2"; // &mscr - case 3885: return "\u223E"; // &mstpos - case 3886: return "\u039C"; // &Mu - case 3887: return "\u03BC"; // &mu - case 3893: return "\u22B8"; // &multimap - case 3896: return "\u22B8"; // &mumap - case 3901: return "\u2207"; // &nabla - case 3907: return "\u0143"; // &Nacute - case 3911: return "\u0144"; // &nacute - case 3913: return "\u2220\u20D2"; // &nang - case 3914: return "\u2249"; // &nap - case 3915: return "\u2A70\u0338"; // &napE - case 3917: return "\u224B\u0338"; // &napid - case 3919: return "\u0149"; // &napos - case 3923: return "\u2249"; // &napprox - case 3926: return "\u266E"; // &natur - case 3928: return "\u266E"; // &natural - case 3929: return "\u2115"; // &naturals - case 3932: return "\u00A0"; //   - case 3935: return "\u224E\u0338"; // &nbump - case 3936: return "\u224F\u0338"; // &nbumpe - case 3939: return "\u2A43"; // &ncap - case 3944: return "\u0147"; // &Ncaron - case 3947: return "\u0148"; // &ncaron - case 3951: return "\u0145"; // &Ncedil - case 3955: return "\u0146"; // &ncedil - case 3958: return "\u2247"; // &ncong - case 3961: return "\u2A6D\u0338"; // &ncongdot - case 3963: return "\u2A42"; // &ncup - case 3964: return "\u041D"; // &Ncy - case 3965: return "\u043D"; // &ncy - case 3969: return "\u2013"; // &ndash - case 3970: return "\u2260"; // &ne - case 3974: return "\u2924"; // &nearhk - case 3977: return "\u21D7"; // &neArr - case 3978: return "\u2197"; // &nearr - case 3980: return "\u2197"; // &nearrow - case 3983: return "\u2250\u0338"; // &nedot - case 4001: return "\u200B"; // &NegativeMediumSpace - case 4011: return "\u200B"; // &NegativeThickSpace - case 4017: return "\u200B"; // &NegativeThinSpace - case 4030: return "\u200B"; // &NegativeVeryThinSpace - case 4034: return "\u2262"; // &nequiv - case 4038: return "\u2928"; // &nesear - case 4040: return "\u2242\u0338"; // &nesim - case 4058: return "\u226B"; // &NestedGreaterGreater - case 4066: return "\u226A"; // &NestedLessLess - case 4071: return "\u000A"; // &NewLine - case 4075: return "\u2204"; // &nexist - case 4076: return "\u2204"; // &nexists - case 4078: return "\uD835\uDD11"; // &Nfr - case 4080: return "\uD835\uDD2B"; // &nfr - case 4082: return "\u2267\u0338"; // &ngE - case 4083: return "\u2271"; // &nge - case 4084: return "\u2271"; // &ngeq - case 4085: return "\u2267\u0338"; // &ngeqq - case 4090: return "\u2A7E\u0338"; // &ngeqslant - case 4091: return "\u2A7E\u0338"; // &nges - case 4093: return "\u22D9\u0338"; // &nGg - case 4096: return "\u2275"; // &ngsim - case 4097: return "\u226B\u20D2"; // &nGt - case 4098: return "\u226F"; // &ngt - case 4099: return "\u226F"; // &ngtr - case 4100: return "\u226B\u0338"; // &nGtv - case 4104: return "\u21CE"; // &nhArr - case 4107: return "\u21AE"; // &nharr - case 4110: return "\u2AF2"; // &nhpar - case 4111: return "\u220B"; // &ni - case 4112: return "\u22FC"; // &nis - case 4113: return "\u22FA"; // &nisd - case 4114: return "\u220B"; // &niv - case 4117: return "\u040A"; // &NJcy - case 4120: return "\u045A"; // &njcy - case 4124: return "\u21CD"; // &nlArr - case 4127: return "\u219A"; // &nlarr - case 4129: return "\u2025"; // &nldr - case 4130: return "\u2266\u0338"; // &nlE - case 4131: return "\u2270"; // &nle - case 4140: return "\u21CD"; // &nLeftarrow - case 4147: return "\u219A"; // &nleftarrow - case 4157: return "\u21CE"; // &nLeftrightarrow - case 4167: return "\u21AE"; // &nleftrightarrow - case 4168: return "\u2270"; // &nleq - case 4169: return "\u2266\u0338"; // &nleqq - case 4174: return "\u2A7D\u0338"; // &nleqslant - case 4175: return "\u2A7D\u0338"; // &nles - case 4176: return "\u226E"; // &nless - case 4177: return "\u22D8\u0338"; // &nLl - case 4180: return "\u2274"; // &nlsim - case 4181: return "\u226A\u20D2"; // &nLt - case 4182: return "\u226E"; // &nlt - case 4184: return "\u22EA"; // &nltri - case 4185: return "\u22EC"; // &nltrie - case 4186: return "\u226A\u0338"; // &nLtv - case 4189: return "\u2224"; // &nmid - case 4195: return "\u2060"; // &NoBreak - case 4209: return "\u00A0"; // &NonBreakingSpace - case 4211: return "\u2115"; // &Nopf - case 4214: return "\uD835\uDD5F"; // &nopf - case 4215: return "\u2AEC"; // &Not - case 4216: return "\u00AC"; // ¬ - case 4225: return "\u2262"; // &NotCongruent - case 4230: return "\u226D"; // &NotCupCap - case 4247: return "\u2226"; // &NotDoubleVerticalBar - case 4254: return "\u2209"; // &NotElement - case 4258: return "\u2260"; // &NotEqual - case 4263: return "\u2242\u0338"; // &NotEqualTilde - case 4268: return "\u2204"; // &NotExists - case 4275: return "\u226F"; // &NotGreater - case 4280: return "\u2271"; // &NotGreaterEqual - case 4289: return "\u2267\u0338"; // &NotGreaterFullEqual - case 4296: return "\u226B\u0338"; // &NotGreaterGreater - case 4300: return "\u2279"; // &NotGreaterLess - case 4310: return "\u2A7E\u0338"; // &NotGreaterSlantEqual - case 4315: return "\u2275"; // &NotGreaterTilde - case 4327: return "\u224E\u0338"; // &NotHumpDownHump - case 4332: return "\u224F\u0338"; // &NotHumpEqual - case 4334: return "\u2209"; // ¬in - case 4337: return "\u22F5\u0338"; // ¬indot - case 4338: return "\u22F9\u0338"; // ¬inE - case 4340: return "\u2209"; // ¬inva - case 4341: return "\u22F7"; // ¬invb - case 4342: return "\u22F6"; // ¬invc - case 4354: return "\u22EA"; // &NotLeftTriangle - case 4357: return "\u29CF\u0338"; // &NotLeftTriangleBar - case 4362: return "\u22EC"; // &NotLeftTriangleEqual - case 4364: return "\u226E"; // &NotLess - case 4369: return "\u2270"; // &NotLessEqual - case 4376: return "\u2278"; // &NotLessGreater - case 4380: return "\u226A\u0338"; // &NotLessLess - case 4390: return "\u2A7D\u0338"; // &NotLessSlantEqual - case 4395: return "\u2274"; // &NotLessTilde - case 4415: return "\u2AA2\u0338"; // &NotNestedGreaterGreater - case 4423: return "\u2AA1\u0338"; // &NotNestedLessLess - case 4425: return "\u220C"; // ¬ni - case 4427: return "\u220C"; // ¬niva - case 4428: return "\u22FE"; // ¬nivb - case 4429: return "\u22FD"; // ¬nivc - case 4437: return "\u2280"; // &NotPrecedes - case 4442: return "\u2AAF\u0338"; // &NotPrecedesEqual - case 4452: return "\u22E0"; // &NotPrecedesSlantEqual - case 4466: return "\u220C"; // &NotReverseElement - case 4478: return "\u22EB"; // &NotRightTriangle - case 4481: return "\u29D0\u0338"; // &NotRightTriangleBar - case 4486: return "\u22ED"; // &NotRightTriangleEqual - case 4498: return "\u228F\u0338"; // &NotSquareSubset - case 4503: return "\u22E2"; // &NotSquareSubsetEqual - case 4509: return "\u2290\u0338"; // &NotSquareSuperset - case 4514: return "\u22E3"; // &NotSquareSupersetEqual - case 4519: return "\u2282\u20D2"; // &NotSubset - case 4524: return "\u2288"; // &NotSubsetEqual - case 4530: return "\u2281"; // &NotSucceeds - case 4535: return "\u2AB0\u0338"; // &NotSucceedsEqual - case 4545: return "\u22E1"; // &NotSucceedsSlantEqual - case 4550: return "\u227F\u0338"; // &NotSucceedsTilde - case 4556: return "\u2283\u20D2"; // &NotSuperset - case 4561: return "\u2289"; // &NotSupersetEqual - case 4566: return "\u2241"; // &NotTilde - case 4571: return "\u2244"; // &NotTildeEqual - case 4580: return "\u2247"; // &NotTildeFullEqual - case 4585: return "\u2249"; // &NotTildeTilde - case 4596: return "\u2224"; // &NotVerticalBar - case 4599: return "\u2226"; // &npar - case 4604: return "\u2226"; // &nparallel - case 4606: return "\u2AFD\u20E5"; // &nparsl - case 4607: return "\u2202\u0338"; // &npart - case 4612: return "\u2A14"; // &npolint - case 4613: return "\u2280"; // &npr - case 4616: return "\u22E0"; // &nprcue - case 4617: return "\u2AAF\u0338"; // &npre - case 4618: return "\u2280"; // &nprec - case 4620: return "\u2AAF\u0338"; // &npreceq - case 4624: return "\u21CF"; // &nrArr - case 4627: return "\u219B"; // &nrarr - case 4628: return "\u2933\u0338"; // &nrarrc - case 4629: return "\u219D\u0338"; // &nrarrw - case 4639: return "\u21CF"; // &nRightarrow - case 4648: return "\u219B"; // &nrightarrow - case 4651: return "\u22EB"; // &nrtri - case 4652: return "\u22ED"; // &nrtrie - case 4654: return "\u2281"; // &nsc - case 4657: return "\u22E1"; // &nsccue - case 4658: return "\u2AB0\u0338"; // &nsce - case 4661: return "\uD835\uDCA9"; // &Nscr - case 4662: return "\uD835\uDCC3"; // &nscr - case 4669: return "\u2224"; // &nshortmid - case 4677: return "\u2226"; // &nshortparallel - case 4679: return "\u2241"; // &nsim - case 4680: return "\u2244"; // &nsime - case 4681: return "\u2244"; // &nsimeq - case 4684: return "\u2224"; // &nsmid - case 4687: return "\u2226"; // &nspar - case 4692: return "\u22E2"; // &nsqsube - case 4694: return "\u22E3"; // &nsqsupe - case 4696: return "\u2284"; // &nsub - case 4697: return "\u2AC5\u0338"; // &nsubE - case 4698: return "\u2288"; // &nsube - case 4701: return "\u2282\u20D2"; // &nsubset - case 4703: return "\u2288"; // &nsubseteq - case 4704: return "\u2AC5\u0338"; // &nsubseteqq - case 4706: return "\u2281"; // &nsucc - case 4708: return "\u2AB0\u0338"; // &nsucceq - case 4709: return "\u2285"; // &nsup - case 4710: return "\u2AC6\u0338"; // &nsupE - case 4711: return "\u2289"; // &nsupe - case 4714: return "\u2283\u20D2"; // &nsupset - case 4716: return "\u2289"; // &nsupseteq - case 4717: return "\u2AC6\u0338"; // &nsupseteqq - case 4720: return "\u2279"; // &ntgl - case 4725: return "\u00D1"; // Ñ - case 4729: return "\u00F1"; // ñ - case 4731: return "\u2278"; // &ntlg - case 4742: return "\u22EA"; // &ntriangleleft - case 4744: return "\u22EC"; // &ntrianglelefteq - case 4749: return "\u22EB"; // &ntriangleright - case 4751: return "\u22ED"; // &ntrianglerighteq - case 4752: return "\u039D"; // &Nu - case 4753: return "\u03BD"; // &nu - case 4754: return "\u0023"; // &num - case 4757: return "\u2116"; // &numero - case 4759: return "\u2007"; // &numsp - case 4762: return "\u224D\u20D2"; // &nvap - case 4767: return "\u22AF"; // &nVDash - case 4771: return "\u22AE"; // &nVdash - case 4775: return "\u22AD"; // &nvDash - case 4779: return "\u22AC"; // &nvdash - case 4781: return "\u2265\u20D2"; // &nvge - case 4782: return "\u003E\u20D2"; // &nvgt - case 4786: return "\u2904"; // &nvHarr - case 4791: return "\u29DE"; // &nvinfin - case 4795: return "\u2902"; // &nvlArr - case 4796: return "\u2264\u20D2"; // &nvle - case 4797: return "\u003C\u20D2"; // &nvlt - case 4800: return "\u22B4\u20D2"; // &nvltrie - case 4804: return "\u2903"; // &nvrArr - case 4808: return "\u22B5\u20D2"; // &nvrtrie - case 4811: return "\u223C\u20D2"; // &nvsim - case 4816: return "\u2923"; // &nwarhk - case 4819: return "\u21D6"; // &nwArr - case 4820: return "\u2196"; // &nwarr - case 4822: return "\u2196"; // &nwarrow - case 4826: return "\u2927"; // &nwnear - case 4832: return "\u00D3"; // Ó - case 4838: return "\u00F3"; // ó - case 4840: return "\u229B"; // &oast - case 4843: return "\u229A"; // &ocir - case 4847: return "\u00D4"; // Ô - case 4848: return "\u00F4"; // ô - case 4849: return "\u041E"; // &Ocy - case 4850: return "\u043E"; // &ocy - case 4854: return "\u229D"; // &odash - case 4859: return "\u0150"; // &Odblac - case 4863: return "\u0151"; // &odblac - case 4865: return "\u2A38"; // &odiv - case 4867: return "\u2299"; // &odot - case 4871: return "\u29BC"; // &odsold - case 4875: return "\u0152"; // &OElig - case 4879: return "\u0153"; // &oelig - case 4883: return "\u29BF"; // &ofcir - case 4885: return "\uD835\uDD12"; // &Ofr - case 4886: return "\uD835\uDD2C"; // &ofr - case 4889: return "\u02DB"; // &ogon - case 4894: return "\u00D2"; // Ò - case 4898: return "\u00F2"; // ò - case 4899: return "\u29C1"; // &ogt - case 4903: return "\u29B5"; // &ohbar - case 4904: return "\u03A9"; // &ohm - case 4907: return "\u222E"; // &oint - case 4911: return "\u21BA"; // &olarr - case 4914: return "\u29BE"; // &olcir - case 4918: return "\u29BB"; // &olcross - case 4921: return "\u203E"; // &oline - case 4922: return "\u29C0"; // &olt - case 4926: return "\u014C"; // &Omacr - case 4930: return "\u014D"; // &omacr - case 4933: return "\u03A9"; // &Omega - case 4936: return "\u03C9"; // &omega - case 4941: return "\u039F"; // &Omicron - case 4946: return "\u03BF"; // &omicron - case 4947: return "\u29B6"; // &omid - case 4950: return "\u2296"; // &ominus - case 4953: return "\uD835\uDD46"; // &Oopf - case 4956: return "\uD835\uDD60"; // &oopf - case 4959: return "\u29B7"; // &opar - case 4978: return "\u201C"; // &OpenCurlyDoubleQuote - case 4983: return "\u2018"; // &OpenCurlyQuote - case 4986: return "\u29B9"; // &operp - case 4989: return "\u2295"; // &oplus - case 4990: return "\u2A54"; // &Or - case 4991: return "\u2228"; // &or - case 4994: return "\u21BB"; // &orarr - case 4995: return "\u2A5D"; // &ord - case 4997: return "\u2134"; // &order - case 4999: return "\u2134"; // &orderof - case 5000: return "\u00AA"; // ª - case 5001: return "\u00BA"; // º - case 5005: return "\u22B6"; // &origof - case 5007: return "\u2A56"; // &oror - case 5012: return "\u2A57"; // &orslope - case 5013: return "\u2A5B"; // &orv - case 5014: return "\u24C8"; // &oS - case 5017: return "\uD835\uDCAA"; // &Oscr - case 5020: return "\u2134"; // &oscr - case 5024: return "\u00D8"; // Ø - case 5028: return "\u00F8"; // ø - case 5030: return "\u2298"; // &osol - case 5035: return "\u00D5"; // Õ - case 5040: return "\u00F5"; // õ - case 5043: return "\u2A37"; // &Otimes - case 5046: return "\u2297"; // &otimes - case 5048: return "\u2A36"; // &otimesas - case 5051: return "\u00D6"; // Ö - case 5054: return "\u00F6"; // ö - case 5058: return "\u233D"; // &ovbar - case 5064: return "\u203E"; // &OverBar - case 5068: return "\u23DE"; // &OverBrace - case 5071: return "\u23B4"; // &OverBracket - case 5082: return "\u23DC"; // &OverParenthesis - case 5085: return "\u2225"; // &par - case 5086: return "\u00B6"; // ¶ - case 5090: return "\u2225"; // ¶llel - case 5093: return "\u2AF3"; // &parsim - case 5094: return "\u2AFD"; // &parsl - case 5095: return "\u2202"; // &part - case 5103: return "\u2202"; // &PartialD - case 5105: return "\u041F"; // &Pcy - case 5107: return "\u043F"; // &pcy - case 5112: return "\u0025"; // &percnt - case 5115: return "\u002E"; // &period - case 5118: return "\u2030"; // &permil - case 5119: return "\u22A5"; // &perp - case 5123: return "\u2031"; // &pertenk - case 5125: return "\uD835\uDD13"; // &Pfr - case 5127: return "\uD835\uDD2D"; // &pfr - case 5129: return "\u03A6"; // &Phi - case 5131: return "\u03C6"; // &phi - case 5132: return "\u03D5"; // &phiv - case 5136: return "\u2133"; // &phmmat - case 5139: return "\u260E"; // &phone - case 5140: return "\u03A0"; // &Pi - case 5141: return "\u03C0"; // &pi - case 5148: return "\u22D4"; // &pitchfork - case 5149: return "\u03D6"; // &piv - case 5154: return "\u210F"; // &planck - case 5155: return "\u210E"; // &planckh - case 5157: return "\u210F"; // &plankv - case 5159: return "\u002B"; // &plus - case 5163: return "\u2A23"; // &plusacir - case 5164: return "\u229E"; // &plusb - case 5167: return "\u2A22"; // &pluscir - case 5169: return "\u2214"; // &plusdo - case 5170: return "\u2A25"; // &plusdu - case 5171: return "\u2A72"; // &pluse - case 5179: return "\u00B1"; // &PlusMinus - case 5181: return "\u00B1"; // ± - case 5184: return "\u2A26"; // &plussim - case 5187: return "\u2A27"; // &plustwo - case 5188: return "\u00B1"; // &pm - case 5200: return "\u210C"; // &Poincareplane - case 5207: return "\u2A15"; // &pointint - case 5209: return "\u2119"; // &Popf - case 5211: return "\uD835\uDD61"; // &popf - case 5214: return "\u00A3"; // £ - case 5215: return "\u2ABB"; // &Pr - case 5216: return "\u227A"; // &pr - case 5218: return "\u2AB7"; // &prap - case 5221: return "\u227C"; // &prcue - case 5222: return "\u2AB3"; // &prE - case 5223: return "\u2AAF"; // &pre - case 5224: return "\u227A"; // &prec - case 5230: return "\u2AB7"; // &precapprox - case 5237: return "\u227C"; // &preccurlyeq - case 5243: return "\u227A"; // &Precedes - case 5248: return "\u2AAF"; // &PrecedesEqual - case 5258: return "\u227C"; // &PrecedesSlantEqual - case 5263: return "\u227E"; // &PrecedesTilde - case 5265: return "\u2AAF"; // &preceq - case 5272: return "\u2AB9"; // &precnapprox - case 5275: return "\u2AB5"; // &precneqq - case 5278: return "\u22E8"; // &precnsim - case 5281: return "\u227E"; // &precsim - case 5284: return "\u2033"; // &Prime - case 5287: return "\u2032"; // &prime - case 5288: return "\u2119"; // &primes - case 5291: return "\u2AB9"; // &prnap - case 5292: return "\u2AB5"; // &prnE - case 5295: return "\u22E8"; // &prnsim - case 5297: return "\u220F"; // &prod - case 5302: return "\u220F"; // &Product - case 5307: return "\u232E"; // &profalar - case 5311: return "\u2312"; // &profline - case 5315: return "\u2313"; // &profsurf - case 5316: return "\u221D"; // &prop - case 5323: return "\u2237"; // &Proportion - case 5325: return "\u221D"; // &Proportional - case 5327: return "\u221D"; // &propto - case 5330: return "\u227E"; // &prsim - case 5334: return "\u22B0"; // &prurel - case 5337: return "\uD835\uDCAB"; // &Pscr - case 5340: return "\uD835\uDCC5"; // &pscr - case 5341: return "\u03A8"; // &Psi - case 5342: return "\u03C8"; // &psi - case 5347: return "\u2008"; // &puncsp - case 5350: return "\uD835\uDD14"; // &Qfr - case 5353: return "\uD835\uDD2E"; // &qfr - case 5356: return "\u2A0C"; // &qint - case 5359: return "\u211A"; // &Qopf - case 5362: return "\uD835\uDD62"; // &qopf - case 5367: return "\u2057"; // &qprime - case 5370: return "\uD835\uDCAC"; // &Qscr - case 5373: return "\uD835\uDCC6"; // &qscr - case 5383: return "\u210D"; // &quaternions - case 5386: return "\u2A16"; // &quatint - case 5389: return "\u003F"; // &quest - case 5391: return "\u225F"; // &questeq - case 5394: return "\u0022"; // " - case 5396: return "\u0022"; // " - case 5401: return "\u21DB"; // &rAarr - case 5404: return "\u223D\u0331"; // &race - case 5410: return "\u0154"; // &Racute - case 5413: return "\u0155"; // &racute - case 5416: return "\u221A"; // &radic - case 5422: return "\u29B3"; // &raemptyv - case 5424: return "\u27EB"; // &Rang - case 5426: return "\u27E9"; // &rang - case 5427: return "\u2992"; // &rangd - case 5428: return "\u29A5"; // &range - case 5430: return "\u27E9"; // &rangle - case 5433: return "\u00BB"; // » - case 5435: return "\u21A0"; // &Rarr - case 5437: return "\u21D2"; // &rArr - case 5439: return "\u2192"; // &rarr - case 5441: return "\u2975"; // &rarrap - case 5442: return "\u21E5"; // &rarrb - case 5444: return "\u2920"; // &rarrbfs - case 5445: return "\u2933"; // &rarrc - case 5447: return "\u291E"; // &rarrfs - case 5449: return "\u21AA"; // &rarrhk - case 5451: return "\u21AC"; // &rarrlp - case 5453: return "\u2945"; // &rarrpl - case 5456: return "\u2974"; // &rarrsim - case 5458: return "\u2916"; // &Rarrtl - case 5460: return "\u21A3"; // &rarrtl - case 5461: return "\u219D"; // &rarrw - case 5465: return "\u291C"; // &rAtail - case 5469: return "\u291A"; // &ratail - case 5471: return "\u2236"; // &ratio - case 5475: return "\u211A"; // &rationals - case 5479: return "\u2910"; // &RBarr - case 5483: return "\u290F"; // &rBarr - case 5487: return "\u290D"; // &rbarr - case 5490: return "\u2773"; // &rbbrk - case 5494: return "\u007D"; // &rbrace - case 5495: return "\u005D"; // &rbrack - case 5497: return "\u298C"; // &rbrke - case 5500: return "\u298E"; // &rbrksld - case 5501: return "\u2990"; // &rbrkslu - case 5506: return "\u0158"; // &Rcaron - case 5511: return "\u0159"; // &rcaron - case 5515: return "\u0156"; // &Rcedil - case 5519: return "\u0157"; // &rcedil - case 5521: return "\u2309"; // &rceil - case 5523: return "\u007D"; // &rcub - case 5524: return "\u0420"; // &Rcy - case 5525: return "\u0440"; // &rcy - case 5528: return "\u2937"; // &rdca - case 5533: return "\u2969"; // &rdldhar - case 5536: return "\u201D"; // &rdquo - case 5537: return "\u201D"; // &rdquor - case 5539: return "\u21B3"; // &rdsh - case 5540: return "\u211C"; // &Re - case 5543: return "\u211C"; // &real - case 5546: return "\u211B"; // &realine - case 5550: return "\u211C"; // &realpart - case 5551: return "\u211D"; // &reals - case 5553: return "\u25AD"; // &rect - case 5555: return "\u00AE"; // ® - case 5556: return "\u00AE"; // ® - case 5568: return "\u220B"; // &ReverseElement - case 5578: return "\u21CB"; // &ReverseEquilibrium - case 5591: return "\u296F"; // &ReverseUpEquilibrium - case 5596: return "\u297D"; // &rfisht - case 5600: return "\u230B"; // &rfloor - case 5602: return "\u211C"; // &Rfr - case 5603: return "\uD835\uDD2F"; // &rfr - case 5606: return "\u2964"; // &rHar - case 5610: return "\u21C1"; // &rhard - case 5611: return "\u21C0"; // &rharu - case 5612: return "\u296C"; // &rharul - case 5614: return "\u03A1"; // &Rho - case 5615: return "\u03C1"; // &rho - case 5616: return "\u03F1"; // &rhov - case 5632: return "\u27E9"; // &RightAngleBracket - case 5636: return "\u2192"; // &RightArrow - case 5641: return "\u21D2"; // &Rightarrow - case 5650: return "\u2192"; // &rightarrow - case 5653: return "\u21E5"; // &RightArrowBar - case 5662: return "\u21C4"; // &RightArrowLeftArrow - case 5666: return "\u21A3"; // &rightarrowtail - case 5673: return "\u2309"; // &RightCeiling - case 5686: return "\u27E7"; // &RightDoubleBracket - case 5697: return "\u295D"; // &RightDownTeeVector - case 5703: return "\u21C2"; // &RightDownVector - case 5706: return "\u2955"; // &RightDownVectorBar - case 5711: return "\u230B"; // &RightFloor - case 5722: return "\u21C1"; // &rightharpoondown - case 5724: return "\u21C0"; // &rightharpoonup - case 5734: return "\u21C4"; // &rightleftarrows - case 5742: return "\u21CC"; // &rightleftharpoons - case 5753: return "\u21C9"; // &rightrightarrows - case 5763: return "\u219D"; // &rightsquigarrow - case 5766: return "\u22A2"; // &RightTee - case 5771: return "\u21A6"; // &RightTeeArrow - case 5777: return "\u295B"; // &RightTeeVector - case 5787: return "\u22CC"; // &rightthreetimes - case 5794: return "\u22B3"; // &RightTriangle - case 5797: return "\u29D0"; // &RightTriangleBar - case 5802: return "\u22B5"; // &RightTriangleEqual - case 5814: return "\u294F"; // &RightUpDownVector - case 5823: return "\u295C"; // &RightUpTeeVector - case 5829: return "\u21BE"; // &RightUpVector - case 5832: return "\u2954"; // &RightUpVectorBar - case 5838: return "\u21C0"; // &RightVector - case 5841: return "\u2953"; // &RightVectorBar - case 5843: return "\u02DA"; // &ring - case 5853: return "\u2253"; // &risingdotseq - case 5857: return "\u21C4"; // &rlarr - case 5860: return "\u21CC"; // &rlhar - case 5861: return "\u200F"; // &rlm - case 5866: return "\u23B1"; // &rmoust - case 5870: return "\u23B1"; // &rmoustache - case 5874: return "\u2AEE"; // &rnmid - case 5878: return "\u27ED"; // &roang - case 5880: return "\u21FE"; // &roarr - case 5883: return "\u27E7"; // &robrk - case 5886: return "\u2986"; // &ropar - case 5889: return "\u211D"; // &Ropf - case 5890: return "\uD835\uDD63"; // &ropf - case 5893: return "\u2A2E"; // &roplus - case 5898: return "\u2A35"; // &rotimes - case 5908: return "\u2970"; // &RoundImplies - case 5911: return "\u0029"; // &rpar - case 5913: return "\u2994"; // &rpargt - case 5919: return "\u2A12"; // &rppolint - case 5923: return "\u21C9"; // &rrarr - case 5933: return "\u21DB"; // &Rrightarrow - case 5938: return "\u203A"; // &rsaquo - case 5941: return "\u211B"; // &Rscr - case 5943: return "\uD835\uDCC7"; // &rscr - case 5944: return "\u21B1"; // &Rsh - case 5945: return "\u21B1"; // &rsh - case 5947: return "\u005D"; // &rsqb - case 5949: return "\u2019"; // &rsquo - case 5950: return "\u2019"; // &rsquor - case 5955: return "\u22CC"; // &rthree - case 5959: return "\u22CA"; // &rtimes - case 5961: return "\u25B9"; // &rtri - case 5962: return "\u22B5"; // &rtrie - case 5963: return "\u25B8"; // &rtrif - case 5967: return "\u29CE"; // &rtriltri - case 5977: return "\u29F4"; // &RuleDelayed - case 5983: return "\u2968"; // &ruluhar - case 5984: return "\u211E"; // &rx - case 5990: return "\u015A"; // &Sacute - case 5996: return "\u015B"; // &sacute - case 6000: return "\u201A"; // &sbquo - case 6001: return "\u2ABC"; // &Sc - case 6002: return "\u227B"; // &sc - case 6004: return "\u2AB8"; // &scap - case 6008: return "\u0160"; // &Scaron - case 6011: return "\u0161"; // &scaron - case 6014: return "\u227D"; // &sccue - case 6015: return "\u2AB4"; // &scE - case 6016: return "\u2AB0"; // &sce - case 6020: return "\u015E"; // &Scedil - case 6023: return "\u015F"; // &scedil - case 6026: return "\u015C"; // &Scirc - case 6029: return "\u015D"; // &scirc - case 6032: return "\u2ABA"; // &scnap - case 6033: return "\u2AB6"; // &scnE - case 6036: return "\u22E9"; // &scnsim - case 6042: return "\u2A13"; // &scpolint - case 6045: return "\u227F"; // &scsim - case 6046: return "\u0421"; // &Scy - case 6047: return "\u0441"; // &scy - case 6050: return "\u22C5"; // &sdot - case 6051: return "\u22A1"; // &sdotb - case 6052: return "\u2A66"; // &sdote - case 6057: return "\u2925"; // &searhk - case 6060: return "\u21D8"; // &seArr - case 6061: return "\u2198"; // &searr - case 6063: return "\u2198"; // &searrow - case 6065: return "\u00A7"; // § - case 6067: return "\u003B"; // &semi - case 6071: return "\u2929"; // &seswar - case 6077: return "\u2216"; // &setminus - case 6078: return "\u2216"; // &setmn - case 6080: return "\u2736"; // &sext - case 6082: return "\uD835\uDD16"; // &Sfr - case 6084: return "\uD835\uDD30"; // &sfr - case 6087: return "\u2322"; // &sfrown - case 6091: return "\u266F"; // &sharp - case 6096: return "\u0429"; // &SHCHcy - case 6100: return "\u0449"; // &shchcy - case 6102: return "\u0428"; // &SHcy - case 6103: return "\u0448"; // &shcy - case 6116: return "\u2193"; // &ShortDownArrow - case 6125: return "\u2190"; // &ShortLeftArrow - case 6131: return "\u2223"; // &shortmid - case 6139: return "\u2225"; // &shortparallel - case 6149: return "\u2192"; // &ShortRightArrow - case 6156: return "\u2191"; // &ShortUpArrow - case 6157: return "\u00AD"; // ­ - case 6161: return "\u03A3"; // &Sigma - case 6165: return "\u03C3"; // &sigma - case 6166: return "\u03C2"; // &sigmaf - case 6167: return "\u03C2"; // &sigmav - case 6168: return "\u223C"; // &sim - case 6171: return "\u2A6A"; // &simdot - case 6172: return "\u2243"; // &sime - case 6173: return "\u2243"; // &simeq - case 6174: return "\u2A9E"; // &simg - case 6175: return "\u2AA0"; // &simgE - case 6176: return "\u2A9D"; // &siml - case 6177: return "\u2A9F"; // &simlE - case 6179: return "\u2246"; // &simne - case 6183: return "\u2A24"; // &simplus - case 6187: return "\u2972"; // &simrarr - case 6191: return "\u2190"; // &slarr - case 6201: return "\u2218"; // &SmallCircle - case 6213: return "\u2216"; // &smallsetminus - case 6216: return "\u2A33"; // &smashp - case 6222: return "\u29E4"; // &smeparsl - case 6224: return "\u2223"; // &smid - case 6226: return "\u2323"; // &smile - case 6227: return "\u2AAA"; // &smt - case 6228: return "\u2AAC"; // &smte - case 6229: return "\u2AAC\uFE00"; // &smtes - case 6234: return "\u042C"; // &SOFTcy - case 6239: return "\u044C"; // &softcy - case 6240: return "\u002F"; // &sol - case 6241: return "\u29C4"; // &solb - case 6243: return "\u233F"; // &solbar - case 6246: return "\uD835\uDD4A"; // &Sopf - case 6248: return "\uD835\uDD64"; // &sopf - case 6253: return "\u2660"; // &spades - case 6256: return "\u2660"; // &spadesuit - case 6257: return "\u2225"; // &spar - case 6261: return "\u2293"; // &sqcap - case 6262: return "\u2293\uFE00"; // &sqcaps - case 6264: return "\u2294"; // &sqcup - case 6265: return "\u2294\uFE00"; // &sqcups - case 6268: return "\u221A"; // &Sqrt - case 6271: return "\u228F"; // &sqsub - case 6272: return "\u2291"; // &sqsube - case 6275: return "\u228F"; // &sqsubset - case 6277: return "\u2291"; // &sqsubseteq - case 6278: return "\u2290"; // &sqsup - case 6279: return "\u2292"; // &sqsupe - case 6282: return "\u2290"; // &sqsupset - case 6284: return "\u2292"; // &sqsupseteq - case 6285: return "\u25A1"; // &squ - case 6289: return "\u25A1"; // &Square - case 6292: return "\u25A1"; // &square - case 6304: return "\u2293"; // &SquareIntersection - case 6310: return "\u228F"; // &SquareSubset - case 6315: return "\u2291"; // &SquareSubsetEqual - case 6321: return "\u2290"; // &SquareSuperset - case 6326: return "\u2292"; // &SquareSupersetEqual - case 6331: return "\u2294"; // &SquareUnion - case 6332: return "\u25AA"; // &squarf - case 6333: return "\u25AA"; // &squf - case 6337: return "\u2192"; // &srarr - case 6340: return "\uD835\uDCAE"; // &Sscr - case 6343: return "\uD835\uDCC8"; // &sscr - case 6347: return "\u2216"; // &ssetmn - case 6351: return "\u2323"; // &ssmile - case 6355: return "\u22C6"; // &sstarf - case 6358: return "\u22C6"; // &Star - case 6361: return "\u2606"; // &star - case 6362: return "\u2605"; // &starf - case 6375: return "\u03F5"; // &straightepsilon - case 6378: return "\u03D5"; // &straightphi - case 6380: return "\u00AF"; // &strns - case 6382: return "\u22D0"; // &Sub - case 6384: return "\u2282"; // &sub - case 6387: return "\u2ABD"; // &subdot - case 6388: return "\u2AC5"; // &subE - case 6389: return "\u2286"; // &sube - case 6392: return "\u2AC3"; // &subedot - case 6396: return "\u2AC1"; // &submult - case 6398: return "\u2ACB"; // &subnE - case 6399: return "\u228A"; // &subne - case 6403: return "\u2ABF"; // &subplus - case 6407: return "\u2979"; // &subrarr - case 6410: return "\u22D0"; // &Subset - case 6413: return "\u2282"; // &subset - case 6415: return "\u2286"; // &subseteq - case 6416: return "\u2AC5"; // &subseteqq - case 6421: return "\u2286"; // &SubsetEqual - case 6424: return "\u228A"; // &subsetneq - case 6425: return "\u2ACB"; // &subsetneqq - case 6427: return "\u2AC7"; // &subsim - case 6429: return "\u2AD5"; // &subsub - case 6430: return "\u2AD3"; // &subsup - case 6432: return "\u227B"; // &succ - case 6438: return "\u2AB8"; // &succapprox - case 6445: return "\u227D"; // &succcurlyeq - case 6451: return "\u227B"; // &Succeeds - case 6456: return "\u2AB0"; // &SucceedsEqual - case 6466: return "\u227D"; // &SucceedsSlantEqual - case 6471: return "\u227F"; // &SucceedsTilde - case 6473: return "\u2AB0"; // &succeq - case 6480: return "\u2ABA"; // &succnapprox - case 6483: return "\u2AB6"; // &succneqq - case 6486: return "\u22E9"; // &succnsim - case 6489: return "\u227F"; // &succsim - case 6494: return "\u220B"; // &SuchThat - case 6495: return "\u2211"; // &Sum - case 6496: return "\u2211"; // &sum - case 6498: return "\u266A"; // &sung - case 6499: return "\u22D1"; // &Sup - case 6500: return "\u2283"; // &sup - case 6501: return "\u00B9"; // ¹ - case 6502: return "\u00B2"; // ² - case 6503: return "\u00B3"; // ³ - case 6506: return "\u2ABE"; // &supdot - case 6509: return "\u2AD8"; // &supdsub - case 6510: return "\u2AC6"; // &supE - case 6511: return "\u2287"; // &supe - case 6514: return "\u2AC4"; // &supedot - case 6519: return "\u2283"; // &Superset - case 6524: return "\u2287"; // &SupersetEqual - case 6528: return "\u27C9"; // &suphsol - case 6530: return "\u2AD7"; // &suphsub - case 6534: return "\u297B"; // &suplarr - case 6538: return "\u2AC2"; // &supmult - case 6540: return "\u2ACC"; // &supnE - case 6541: return "\u228B"; // &supne - case 6545: return "\u2AC0"; // &supplus - case 6548: return "\u22D1"; // &Supset - case 6551: return "\u2283"; // &supset - case 6553: return "\u2287"; // &supseteq - case 6554: return "\u2AC6"; // &supseteqq - case 6557: return "\u228B"; // &supsetneq - case 6558: return "\u2ACC"; // &supsetneqq - case 6560: return "\u2AC8"; // &supsim - case 6562: return "\u2AD4"; // &supsub - case 6563: return "\u2AD6"; // &supsup - case 6568: return "\u2926"; // &swarhk - case 6571: return "\u21D9"; // &swArr - case 6572: return "\u2199"; // &swarr - case 6574: return "\u2199"; // &swarrow - case 6578: return "\u292A"; // &swnwar - case 6582: return "\u00DF"; // ß - case 6585: return "\u0009"; // &Tab - case 6591: return "\u2316"; // &target - case 6592: return "\u03A4"; // &Tau - case 6593: return "\u03C4"; // &tau - case 6596: return "\u23B4"; // &tbrk - case 6601: return "\u0164"; // &Tcaron - case 6606: return "\u0165"; // &tcaron - case 6610: return "\u0162"; // &Tcedil - case 6614: return "\u0163"; // &tcedil - case 6615: return "\u0422"; // &Tcy - case 6616: return "\u0442"; // &tcy - case 6619: return "\u20DB"; // &tdot - case 6624: return "\u2315"; // &telrec - case 6626: return "\uD835\uDD17"; // &Tfr - case 6628: return "\uD835\uDD31"; // &tfr - case 6633: return "\u2234"; // &there4 - case 6641: return "\u2234"; // &Therefore - case 6645: return "\u2234"; // &therefore - case 6647: return "\u0398"; // &Theta - case 6649: return "\u03B8"; // &theta - case 6652: return "\u03D1"; // &thetasym - case 6653: return "\u03D1"; // &thetav - case 6662: return "\u2248"; // &thickapprox - case 6665: return "\u223C"; // &thicksim - case 6673: return "\u205F\u200A"; // &ThickSpace - case 6676: return "\u2009"; // &thinsp - case 6682: return "\u2009"; // &ThinSpace - case 6685: return "\u2248"; // &thkap - case 6688: return "\u223C"; // &thksim - case 6692: return "\u00DE"; // Þ - case 6695: return "\u00FE"; // þ - case 6699: return "\u223C"; // &Tilde - case 6703: return "\u02DC"; // &tilde - case 6708: return "\u2243"; // &TildeEqual - case 6717: return "\u2245"; // &TildeFullEqual - case 6722: return "\u2248"; // &TildeTilde - case 6725: return "\u00D7"; // × - case 6726: return "\u22A0"; // ×b - case 6728: return "\u2A31"; // ×bar - case 6729: return "\u2A30"; // ×d - case 6731: return "\u222D"; // &tint - case 6734: return "\u2928"; // &toea - case 6735: return "\u22A4"; // &top - case 6738: return "\u2336"; // &topbot - case 6741: return "\u2AF1"; // &topcir - case 6744: return "\uD835\uDD4B"; // &Topf - case 6745: return "\uD835\uDD65"; // &topf - case 6748: return "\u2ADA"; // &topfork - case 6750: return "\u2929"; // &tosa - case 6755: return "\u2034"; // &tprime - case 6759: return "\u2122"; // &TRADE - case 6763: return "\u2122"; // &trade - case 6769: return "\u25B5"; // &triangle - case 6773: return "\u25BF"; // &triangledown - case 6777: return "\u25C3"; // &triangleleft - case 6779: return "\u22B4"; // &trianglelefteq - case 6780: return "\u225C"; // &triangleq - case 6785: return "\u25B9"; // &triangleright - case 6787: return "\u22B5"; // &trianglerighteq - case 6790: return "\u25EC"; // &tridot - case 6791: return "\u225C"; // &trie - case 6796: return "\u2A3A"; // &triminus - case 6804: return "\u20DB"; // &TripleDot - case 6808: return "\u2A39"; // &triplus - case 6810: return "\u29CD"; // &trisb - case 6814: return "\u2A3B"; // &tritime - case 6820: return "\u23E2"; // &trpezium - case 6823: return "\uD835\uDCAF"; // &Tscr - case 6826: return "\uD835\uDCC9"; // &tscr - case 6829: return "\u0426"; // &TScy - case 6830: return "\u0446"; // &tscy - case 6833: return "\u040B"; // &TSHcy - case 6836: return "\u045B"; // &tshcy - case 6840: return "\u0166"; // &Tstrok - case 6844: return "\u0167"; // &tstrok - case 6848: return "\u226C"; // &twixt - case 6862: return "\u219E"; // &twoheadleftarrow - case 6872: return "\u21A0"; // &twoheadrightarrow - case 6878: return "\u00DA"; // Ú - case 6884: return "\u00FA"; // ú - case 6886: return "\u219F"; // &Uarr - case 6889: return "\u21D1"; // &uArr - case 6891: return "\u2191"; // &uarr - case 6895: return "\u2949"; // &Uarrocir - case 6899: return "\u040E"; // &Ubrcy - case 6903: return "\u045E"; // &ubrcy - case 6906: return "\u016C"; // &Ubreve - case 6909: return "\u016D"; // &ubreve - case 6913: return "\u00DB"; // Û - case 6917: return "\u00FB"; // û - case 6918: return "\u0423"; // &Ucy - case 6919: return "\u0443"; // &ucy - case 6923: return "\u21C5"; // &udarr - case 6928: return "\u0170"; // &Udblac - case 6932: return "\u0171"; // &udblac - case 6935: return "\u296E"; // &udhar - case 6940: return "\u297E"; // &ufisht - case 6942: return "\uD835\uDD18"; // &Ufr - case 6943: return "\uD835\uDD32"; // &ufr - case 6948: return "\u00D9"; // Ù - case 6953: return "\u00F9"; // ù - case 6956: return "\u2963"; // &uHar - case 6960: return "\u21BF"; // &uharl - case 6961: return "\u21BE"; // &uharr - case 6964: return "\u2580"; // &uhblk - case 6969: return "\u231C"; // &ulcorn - case 6971: return "\u231C"; // &ulcorner - case 6974: return "\u230F"; // &ulcrop - case 6977: return "\u25F8"; // &ultri - case 6981: return "\u016A"; // &Umacr - case 6985: return "\u016B"; // &umacr - case 6986: return "\u00A8"; // ¨ - case 6993: return "\u005F"; // &UnderBar - case 6997: return "\u23DF"; // &UnderBrace - case 7000: return "\u23B5"; // &UnderBracket - case 7011: return "\u23DD"; // &UnderParenthesis - case 7014: return "\u22C3"; // &Union - case 7018: return "\u228E"; // &UnionPlus - case 7022: return "\u0172"; // &Uogon - case 7026: return "\u0173"; // &uogon - case 7028: return "\uD835\uDD4C"; // &Uopf - case 7030: return "\uD835\uDD66"; // &uopf - case 7036: return "\u2191"; // &UpArrow - case 7041: return "\u21D1"; // &Uparrow - case 7047: return "\u2191"; // &uparrow - case 7050: return "\u2912"; // &UpArrowBar - case 7059: return "\u21C5"; // &UpArrowDownArrow - case 7068: return "\u2195"; // &UpDownArrow - case 7077: return "\u21D5"; // &Updownarrow - case 7086: return "\u2195"; // &updownarrow - case 7097: return "\u296E"; // &UpEquilibrium - case 7108: return "\u21BF"; // &upharpoonleft - case 7113: return "\u21BE"; // &upharpoonright - case 7116: return "\u228E"; // &uplus - case 7128: return "\u2196"; // &UpperLeftArrow - case 7138: return "\u2197"; // &UpperRightArrow - case 7140: return "\u03D2"; // &Upsi - case 7142: return "\u03C5"; // &upsi - case 7143: return "\u03D2"; // &upsih - case 7146: return "\u03A5"; // &Upsilon - case 7149: return "\u03C5"; // &upsilon - case 7152: return "\u22A5"; // &UpTee - case 7157: return "\u21A5"; // &UpTeeArrow - case 7165: return "\u21C8"; // &upuparrows - case 7170: return "\u231D"; // &urcorn - case 7172: return "\u231D"; // &urcorner - case 7175: return "\u230E"; // &urcrop - case 7179: return "\u016E"; // &Uring - case 7182: return "\u016F"; // &uring - case 7185: return "\u25F9"; // &urtri - case 7188: return "\uD835\uDCB0"; // &Uscr - case 7191: return "\uD835\uDCCA"; // &uscr - case 7195: return "\u22F0"; // &utdot - case 7200: return "\u0168"; // &Utilde - case 7204: return "\u0169"; // &utilde - case 7206: return "\u25B5"; // &utri - case 7207: return "\u25B4"; // &utrif - case 7211: return "\u21C8"; // &uuarr - case 7214: return "\u00DC"; // Ü - case 7216: return "\u00FC"; // ü - case 7222: return "\u29A7"; // &uwangle - case 7228: return "\u299C"; // &vangrt - case 7236: return "\u03F5"; // &varepsilon - case 7241: return "\u03F0"; // &varkappa - case 7248: return "\u2205"; // &varnothing - case 7251: return "\u03D5"; // &varphi - case 7252: return "\u03D6"; // &varpi - case 7257: return "\u221D"; // &varpropto - case 7260: return "\u21D5"; // &vArr - case 7261: return "\u2195"; // &varr - case 7263: return "\u03F1"; // &varrho - case 7268: return "\u03C2"; // &varsigma - case 7276: return "\u228A\uFE00"; // &varsubsetneq - case 7277: return "\u2ACB\uFE00"; // &varsubsetneqq - case 7284: return "\u228B\uFE00"; // &varsupsetneq - case 7285: return "\u2ACC\uFE00"; // &varsupsetneqq - case 7290: return "\u03D1"; // &vartheta - case 7301: return "\u22B2"; // &vartriangleleft - case 7306: return "\u22B3"; // &vartriangleright - case 7310: return "\u2AEB"; // &Vbar - case 7313: return "\u2AE8"; // &vBar - case 7314: return "\u2AE9"; // &vBarv - case 7316: return "\u0412"; // &Vcy - case 7318: return "\u0432"; // &vcy - case 7322: return "\u22AB"; // &VDash - case 7326: return "\u22A9"; // &Vdash - case 7330: return "\u22A8"; // &vDash - case 7334: return "\u22A2"; // &vdash - case 7335: return "\u2AE6"; // &Vdashl - case 7337: return "\u22C1"; // &Vee - case 7339: return "\u2228"; // &vee - case 7342: return "\u22BB"; // &veebar - case 7344: return "\u225A"; // &veeeq - case 7348: return "\u22EE"; // &vellip - case 7352: return "\u2016"; // &Verbar - case 7356: return "\u007C"; // &verbar - case 7357: return "\u2016"; // &Vert - case 7358: return "\u007C"; // &vert - case 7365: return "\u2223"; // &VerticalBar - case 7369: return "\u007C"; // &VerticalLine - case 7378: return "\u2758"; // &VerticalSeparator - case 7383: return "\u2240"; // &VerticalTilde - case 7393: return "\u200A"; // &VeryThinSpace - case 7395: return "\uD835\uDD19"; // &Vfr - case 7397: return "\uD835\uDD33"; // &vfr - case 7401: return "\u22B2"; // &vltri - case 7405: return "\u2282\u20D2"; // &vnsub - case 7406: return "\u2283\u20D2"; // &vnsup - case 7409: return "\uD835\uDD4D"; // &Vopf - case 7412: return "\uD835\uDD67"; // &vopf - case 7416: return "\u221D"; // &vprop - case 7420: return "\u22B3"; // &vrtri - case 7423: return "\uD835\uDCB1"; // &Vscr - case 7426: return "\uD835\uDCCB"; // &vscr - case 7430: return "\u2ACB\uFE00"; // &vsubnE - case 7431: return "\u228A\uFE00"; // &vsubne - case 7434: return "\u2ACC\uFE00"; // &vsupnE - case 7435: return "\u228B\uFE00"; // &vsupne - case 7440: return "\u22AA"; // &Vvdash - case 7446: return "\u299A"; // &vzigzag - case 7451: return "\u0174"; // &Wcirc - case 7456: return "\u0175"; // &wcirc - case 7461: return "\u2A5F"; // &wedbar - case 7465: return "\u22C0"; // &Wedge - case 7467: return "\u2227"; // &wedge - case 7468: return "\u2259"; // &wedgeq - case 7472: return "\u2118"; // &weierp - case 7474: return "\uD835\uDD1A"; // &Wfr - case 7476: return "\uD835\uDD34"; // &wfr - case 7479: return "\uD835\uDD4E"; // &Wopf - case 7482: return "\uD835\uDD68"; // &wopf - case 7483: return "\u2118"; // &wp - case 7484: return "\u2240"; // &wr - case 7488: return "\u2240"; // &wreath - case 7491: return "\uD835\uDCB2"; // &Wscr - case 7494: return "\uD835\uDCCC"; // &wscr - case 7498: return "\u22C2"; // &xcap - case 7501: return "\u25EF"; // &xcirc - case 7503: return "\u22C3"; // &xcup - case 7507: return "\u25BD"; // &xdtri - case 7510: return "\uD835\uDD1B"; // &Xfr - case 7512: return "\uD835\uDD35"; // &xfr - case 7516: return "\u27FA"; // &xhArr - case 7519: return "\u27F7"; // &xharr - case 7520: return "\u039E"; // &Xi - case 7521: return "\u03BE"; // &xi - case 7525: return "\u27F8"; // &xlArr - case 7528: return "\u27F5"; // &xlarr - case 7531: return "\u27FC"; // &xmap - case 7534: return "\u22FB"; // &xnis - case 7538: return "\u2A00"; // &xodot - case 7541: return "\uD835\uDD4F"; // &Xopf - case 7543: return "\uD835\uDD69"; // &xopf - case 7546: return "\u2A01"; // &xoplus - case 7550: return "\u2A02"; // &xotime - case 7554: return "\u27F9"; // &xrArr - case 7557: return "\u27F6"; // &xrarr - case 7560: return "\uD835\uDCB3"; // &Xscr - case 7563: return "\uD835\uDCCD"; // &xscr - case 7567: return "\u2A06"; // &xsqcup - case 7572: return "\u2A04"; // &xuplus - case 7575: return "\u25B3"; // &xutri - case 7578: return "\u22C1"; // &xvee - case 7583: return "\u22C0"; // &xwedge - case 7589: return "\u00DD"; // Ý - case 7595: return "\u00FD"; // ý - case 7598: return "\u042F"; // &YAcy - case 7599: return "\u044F"; // &yacy - case 7603: return "\u0176"; // &Ycirc - case 7607: return "\u0177"; // &ycirc - case 7608: return "\u042B"; // &Ycy - case 7609: return "\u044B"; // &ycy - case 7611: return "\u00A5"; // ¥ - case 7613: return "\uD835\uDD1C"; // &Yfr - case 7615: return "\uD835\uDD36"; // &yfr - case 7618: return "\u0407"; // &YIcy - case 7621: return "\u0457"; // &yicy - case 7624: return "\uD835\uDD50"; // &Yopf - case 7627: return "\uD835\uDD6A"; // &yopf - case 7630: return "\uD835\uDCB4"; // &Yscr - case 7633: return "\uD835\uDCCE"; // &yscr - case 7636: return "\u042E"; // &YUcy - case 7639: return "\u044E"; // &yucy - case 7642: return "\u0178"; // &Yuml - case 7644: return "\u00FF"; // ÿ - case 7650: return "\u0179"; // &Zacute - case 7656: return "\u017A"; // &zacute - case 7661: return "\u017D"; // &Zcaron - case 7666: return "\u017E"; // &zcaron - case 7667: return "\u0417"; // &Zcy - case 7668: return "\u0437"; // &zcy - case 7671: return "\u017B"; // &Zdot - case 7674: return "\u017C"; // &zdot - case 7679: return "\u2128"; // &zeetrf - case 7692: return "\u200B"; // &ZeroWidthSpace - case 7694: return "\u0396"; // &Zeta - case 7696: return "\u03B6"; // &zeta - case 7698: return "\u2128"; // &Zfr - case 7700: return "\uD835\uDD37"; // &zfr - case 7703: return "\u0416"; // &ZHcy - case 7706: return "\u0436"; // &zhcy - case 7712: return "\u21DD"; // &zigrarr - case 7715: return "\u2124"; // &Zopf - case 7718: return "\uD835\uDD6B"; // &zopf - case 7721: return "\uD835\uDCB5"; // &Zscr - case 7724: return "\uD835\uDCCF"; // &zscr - case 7726: return "\u200D"; // &zwj - case 7728: return "\u200C"; // &zwnj + case 7: return "\u00C1"; // Á + case 13: return "\u00E1"; // á + case 14: return "\u00E1"; // á + case 20: return "\u0102"; // Ă + case 26: return "\u0103"; // ă + case 28: return "\u223E"; // ∾ + case 30: return "\u223F"; // ∿ + case 32: return "\u223E\u0333"; // ∾̳ + case 36: return "\u00C2"; //  + case 37: return "\u00C2"; //  + case 40: return "\u00E2"; // â + case 41: return "\u00E2"; // â + case 44: return "\u00B4"; // ´ + case 45: return "\u00B4"; // ´ + case 47: return "\u0410"; // А + case 49: return "\u0430"; // а + case 53: return "\u00C6"; // Æ + case 54: return "\u00C6"; // Æ + case 58: return "\u00E6"; // æ + case 59: return "\u00E6"; // æ + case 61: return "\u2061"; // ⁡ + case 64: return "\uD835\uDD04"; // 𝔄 + case 66: return "\uD835\uDD1E"; // 𝔞 + case 71: return "\u00C0"; // À + case 72: return "\u00C0"; // À + case 77: return "\u00E0"; // à + case 78: return "\u00E0"; // à + case 85: return "\u2135"; // ℵ + case 88: return "\u2135"; // ℵ + case 93: return "\u0391"; // Α + case 97: return "\u03B1"; // α + case 102: return "\u0100"; // Ā + case 107: return "\u0101"; // ā + case 110: return "\u2A3F"; // ⨿ + case 112: return "\u0026"; // & + case 113: return "\u0026"; // & + case 114: return "\u0026"; // & + case 115: return "\u0026"; // & + case 118: return "\u2A53"; // ⩓ + case 121: return "\u2227"; // ∧ + case 125: return "\u2A55"; // ⩕ + case 127: return "\u2A5C"; // ⩜ + case 133: return "\u2A58"; // ⩘ + case 135: return "\u2A5A"; // ⩚ + case 137: return "\u2220"; // ∠ + case 139: return "\u29A4"; // ⦤ + case 142: return "\u2220"; // ∠ + case 146: return "\u2221"; // ∡ + case 149: return "\u29A8"; // ⦨ + case 151: return "\u29A9"; // ⦩ + case 153: return "\u29AA"; // ⦪ + case 155: return "\u29AB"; // ⦫ + case 157: return "\u29AC"; // ⦬ + case 159: return "\u29AD"; // ⦭ + case 161: return "\u29AE"; // ⦮ + case 163: return "\u29AF"; // ⦯ + case 166: return "\u221F"; // ∟ + case 169: return "\u22BE"; // ⊾ + case 171: return "\u299D"; // ⦝ + case 175: return "\u2222"; // ∢ + case 177: return "\u00C5"; // Å + case 182: return "\u237C"; // ⍼ + case 187: return "\u0104"; // Ą + case 192: return "\u0105"; // ą + case 195: return "\uD835\uDD38"; // 𝔸 + case 198: return "\uD835\uDD52"; // 𝕒 + case 200: return "\u2248"; // ≈ + case 205: return "\u2A6F"; // ⩯ + case 207: return "\u2A70"; // ⩰ + case 209: return "\u224A"; // ≊ + case 212: return "\u224B"; // ≋ + case 215: return "\u0027"; // ' + case 228: return "\u2061"; // ⁡ + case 233: return "\u2248"; // ≈ + case 236: return "\u224A"; // ≊ + case 240: return "\u00C5"; // Å + case 241: return "\u00C5"; // Å + case 245: return "\u00E5"; // å + case 246: return "\u00E5"; // å + case 250: return "\uD835\uDC9C"; // 𝒜 + case 254: return "\uD835\uDCB6"; // 𝒶 + case 259: return "\u2254"; // ≔ + case 261: return "\u002A"; // * + case 265: return "\u2248"; // ≈ + case 268: return "\u224D"; // ≍ + case 273: return "\u00C3"; // à + case 274: return "\u00C3"; // à + case 279: return "\u00E3"; // ã + case 280: return "\u00E3"; // ã + case 283: return "\u00C4"; // Ä + case 284: return "\u00C4"; // Ä + case 287: return "\u00E4"; // ä + case 288: return "\u00E4"; // ä + case 296: return "\u2233"; // ∳ + case 300: return "\u2A11"; // ⨑ + case 309: return "\u224C"; // ≌ + case 317: return "\u03F6"; // ϶ + case 323: return "\u2035"; // ‵ + case 327: return "\u223D"; // ∽ + case 330: return "\u22CD"; // ⋍ + case 340: return "\u2216"; // ∖ + case 343: return "\u2AE7"; // ⫧ + case 348: return "\u22BD"; // ⊽ + case 352: return "\u2306"; // ⌆ + case 356: return "\u2305"; // ⌅ + case 359: return "\u2305"; // ⌅ + case 363: return "\u23B5"; // ⎵ + case 368: return "\u23B6"; // ⎶ + case 373: return "\u224C"; // ≌ + case 376: return "\u0411"; // Б + case 378: return "\u0431"; // б + case 383: return "\u201E"; // „ + case 389: return "\u2235"; // ∵ + case 396: return "\u2235"; // ∵ + case 398: return "\u2235"; // ∵ + case 404: return "\u29B0"; // ⦰ + case 408: return "\u03F6"; // ϶ + case 413: return "\u212C"; // ℬ + case 422: return "\u212C"; // ℬ + case 425: return "\u0392"; // Β + case 428: return "\u03B2"; // β + case 430: return "\u2136"; // ℶ + case 435: return "\u226C"; // ≬ + case 438: return "\uD835\uDD05"; // 𝔅 + case 441: return "\uD835\uDD1F"; // 𝔟 + case 447: return "\u22C2"; // ⋂ + case 451: return "\u25EF"; // ◯ + case 454: return "\u22C3"; // ⋃ + case 459: return "\u2A00"; // ⨀ + case 464: return "\u2A01"; // ⨁ + case 470: return "\u2A02"; // ⨂ + case 476: return "\u2A06"; // ⨆ + case 480: return "\u2605"; // ★ + case 493: return "\u25BD"; // ▽ + case 496: return "\u25B3"; // △ + case 502: return "\u2A04"; // ⨄ + case 506: return "\u22C1"; // ⋁ + case 512: return "\u22C0"; // ⋀ + case 518: return "\u290D"; // ⤍ + case 530: return "\u29EB"; // ⧫ + case 537: return "\u25AA"; // ▪ + case 546: return "\u25B4"; // ▴ + case 551: return "\u25BE"; // ▾ + case 556: return "\u25C2"; // ◂ + case 562: return "\u25B8"; // ▸ + case 565: return "\u2423"; // ␣ + case 569: return "\u2592"; // ▒ + case 571: return "\u2591"; // ░ + case 574: return "\u2593"; // ▓ + case 578: return "\u2588"; // █ + case 581: return "\u003D\u20E5"; // =⃥ + case 586: return "\u2261\u20E5"; // ≡⃥ + case 590: return "\u2AED"; // ⫭ + case 593: return "\u2310"; // ⌐ + case 597: return "\uD835\uDD39"; // 𝔹 + case 601: return "\uD835\uDD53"; // 𝕓 + case 603: return "\u22A5"; // ⊥ + case 607: return "\u22A5"; // ⊥ + case 612: return "\u22C8"; // ⋈ + case 617: return "\u29C9"; // ⧉ + case 620: return "\u2557"; // ╗ + case 622: return "\u2556"; // ╖ + case 625: return "\u2555"; // ╕ + case 627: return "\u2510"; // ┐ + case 629: return "\u2554"; // ╔ + case 631: return "\u2553"; // ╓ + case 633: return "\u2552"; // ╒ + case 635: return "\u250C"; // ┌ + case 637: return "\u2550"; // ═ + case 639: return "\u2500"; // ─ + case 641: return "\u2566"; // ╦ + case 643: return "\u2564"; // ╤ + case 645: return "\u2565"; // ╥ + case 647: return "\u252C"; // ┬ + case 649: return "\u2569"; // ╩ + case 651: return "\u2567"; // ╧ + case 653: return "\u2568"; // ╨ + case 655: return "\u2534"; // ┴ + case 661: return "\u229F"; // ⊟ + case 666: return "\u229E"; // ⊞ + case 672: return "\u22A0"; // ⊠ + case 675: return "\u255D"; // ╝ + case 677: return "\u255C"; // ╜ + case 680: return "\u255B"; // ╛ + case 682: return "\u2518"; // ┘ + case 684: return "\u255A"; // ╚ + case 686: return "\u2559"; // ╙ + case 688: return "\u2558"; // ╘ + case 690: return "\u2514"; // └ + case 692: return "\u2551"; // ║ + case 694: return "\u2502"; // │ + case 696: return "\u256C"; // ╬ + case 698: return "\u256B"; // ╫ + case 700: return "\u256A"; // ╪ + case 702: return "\u253C"; // ┼ + case 704: return "\u2563"; // ╣ + case 706: return "\u2562"; // ╢ + case 708: return "\u2561"; // ╡ + case 710: return "\u2524"; // ┤ + case 712: return "\u2560"; // ╠ + case 714: return "\u255F"; // ╟ + case 716: return "\u255E"; // ╞ + case 718: return "\u251C"; // ├ + case 724: return "\u2035"; // ‵ + case 729: return "\u02D8"; // ˘ + case 734: return "\u02D8"; // ˘ + case 738: return "\u00A6"; // ¦ + case 739: return "\u00A6"; // ¦ + case 743: return "\u212C"; // ℬ + case 747: return "\uD835\uDCB7"; // 𝒷 + case 751: return "\u204F"; // ⁏ + case 754: return "\u223D"; // ∽ + case 756: return "\u22CD"; // ⋍ + case 759: return "\u005C"; // \ + case 761: return "\u29C5"; // ⧅ + case 766: return "\u27C8"; // ⟈ + case 770: return "\u2022"; // • + case 773: return "\u2022"; // • + case 776: return "\u224E"; // ≎ + case 778: return "\u2AAE"; // ⪮ + case 780: return "\u224F"; // ≏ + case 786: return "\u224E"; // ≎ + case 788: return "\u224F"; // ≏ + case 795: return "\u0106"; // Ć + case 802: return "\u0107"; // ć + case 804: return "\u22D2"; // ⋒ + case 806: return "\u2229"; // ∩ + case 810: return "\u2A44"; // ⩄ + case 816: return "\u2A49"; // ⩉ + case 820: return "\u2A4B"; // ⩋ + case 823: return "\u2A47"; // ⩇ + case 827: return "\u2A40"; // ⩀ + case 845: return "\u2145"; // ⅅ + case 847: return "\u2229\uFE00"; // ∩︀ + case 851: return "\u2041"; // ⁁ + case 854: return "\u02C7"; // ˇ + case 860: return "\u212D"; // ℭ + case 865: return "\u2A4D"; // ⩍ + case 871: return "\u010C"; // Č + case 875: return "\u010D"; // č + case 879: return "\u00C7"; // Ç + case 880: return "\u00C7"; // Ç + case 884: return "\u00E7"; // ç + case 885: return "\u00E7"; // ç + case 889: return "\u0108"; // Ĉ + case 893: return "\u0109"; // ĉ + case 899: return "\u2230"; // ∰ + case 903: return "\u2A4C"; // ⩌ + case 906: return "\u2A50"; // ⩐ + case 910: return "\u010A"; // Ċ + case 914: return "\u010B"; // ċ + case 918: return "\u00B8"; // ¸ + case 919: return "\u00B8"; // ¸ + case 926: return "\u00B8"; // ¸ + case 932: return "\u29B2"; // ⦲ + case 934: return "\u00A2"; // ¢ + case 935: return "\u00A2"; // ¢ + case 943: return "\u00B7"; // · + case 949: return "\u00B7"; // · + case 952: return "\u212D"; // ℭ + case 955: return "\uD835\uDD20"; // 𝔠 + case 959: return "\u0427"; // Ч + case 963: return "\u0447"; // ч + case 967: return "\u2713"; // ✓ + case 972: return "\u2713"; // ✓ + case 975: return "\u03A7"; // Χ + case 977: return "\u03C7"; // χ + case 980: return "\u25CB"; // ○ + case 982: return "\u02C6"; // ˆ + case 985: return "\u2257"; // ≗ + case 997: return "\u21BA"; // ↺ + case 1003: return "\u21BB"; // ↻ + case 1008: return "\u229B"; // ⊛ + case 1013: return "\u229A"; // ⊚ + case 1018: return "\u229D"; // ⊝ + case 1027: return "\u2299"; // ⊙ + case 1029: return "\u00AE"; // ® + case 1031: return "\u24C8"; // Ⓢ + case 1037: return "\u2296"; // ⊖ + case 1042: return "\u2295"; // ⊕ + case 1048: return "\u2297"; // ⊗ + case 1050: return "\u29C3"; // ⧃ + case 1052: return "\u2257"; // ≗ + case 1058: return "\u2A10"; // ⨐ + case 1062: return "\u2AEF"; // ⫯ + case 1067: return "\u29C2"; // ⧂ + case 1091: return "\u2232"; // ∲ + case 1110: return "\u201D"; // ” + case 1116: return "\u2019"; // ’ + case 1121: return "\u2663"; // ♣ + case 1125: return "\u2663"; // ♣ + case 1130: return "\u2237"; // ∷ + case 1135: return "\u003A"; // : + case 1137: return "\u2A74"; // ⩴ + case 1139: return "\u2254"; // ≔ + case 1141: return "\u2254"; // ≔ + case 1145: return "\u002C"; // , + case 1147: return "\u0040"; // @ + case 1149: return "\u2201"; // ∁ + case 1152: return "\u2218"; // ∘ + case 1159: return "\u2201"; // ∁ + case 1163: return "\u2102"; // ℂ + case 1166: return "\u2245"; // ≅ + case 1170: return "\u2A6D"; // ⩭ + case 1178: return "\u2261"; // ≡ + case 1182: return "\u222F"; // ∯ + case 1186: return "\u222E"; // ∮ + case 1199: return "\u222E"; // ∮ + case 1202: return "\u2102"; // ℂ + case 1205: return "\uD835\uDD54"; // 𝕔 + case 1209: return "\u2210"; // ∐ + case 1216: return "\u2210"; // ∐ + case 1219: return "\u00A9"; // © + case 1220: return "\u00A9"; // © + case 1221: return "\u00A9"; // © + case 1222: return "\u00A9"; // © + case 1225: return "\u2117"; // ℗ + case 1255: return "\u2233"; // ∳ + case 1260: return "\u21B5"; // ↵ + case 1265: return "\u2A2F"; // ⨯ + case 1269: return "\u2717"; // ✗ + case 1273: return "\uD835\uDC9E"; // 𝒞 + case 1277: return "\uD835\uDCB8"; // 𝒸 + case 1280: return "\u2ACF"; // ⫏ + case 1282: return "\u2AD1"; // ⫑ + case 1284: return "\u2AD0"; // ⫐ + case 1286: return "\u2AD2"; // ⫒ + case 1291: return "\u22EF"; // ⋯ + case 1298: return "\u2938"; // ⤸ + case 1300: return "\u2935"; // ⤵ + case 1304: return "\u22DE"; // ⋞ + case 1307: return "\u22DF"; // ⋟ + case 1312: return "\u21B6"; // ↶ + case 1314: return "\u293D"; // ⤽ + case 1317: return "\u22D3"; // ⋓ + case 1319: return "\u222A"; // ∪ + case 1325: return "\u2A48"; // ⩈ + case 1329: return "\u224D"; // ≍ + case 1333: return "\u2A46"; // ⩆ + case 1336: return "\u2A4A"; // ⩊ + case 1340: return "\u228D"; // ⊍ + case 1343: return "\u2A45"; // ⩅ + case 1345: return "\u222A\uFE00"; // ∪︀ + case 1350: return "\u21B7"; // ↷ + case 1352: return "\u293C"; // ⤼ + case 1361: return "\u22DE"; // ⋞ + case 1366: return "\u22DF"; // ⋟ + case 1370: return "\u22CE"; // ⋎ + case 1376: return "\u22CF"; // ⋏ + case 1379: return "\u00A4"; // ¤ + case 1380: return "\u00A4"; // ¤ + case 1392: return "\u21B6"; // ↶ + case 1398: return "\u21B7"; // ↷ + case 1402: return "\u22CE"; // ⋎ + case 1406: return "\u22CF"; // ⋏ + case 1414: return "\u2232"; // ∲ + case 1418: return "\u2231"; // ∱ + case 1424: return "\u232D"; // ⌭ + case 1431: return "\u2021"; // ‡ + case 1438: return "\u2020"; // † + case 1443: return "\u2138"; // ℸ + case 1446: return "\u21A1"; // ↡ + case 1450: return "\u21D3"; // ⇓ + case 1453: return "\u2193"; // ↓ + case 1456: return "\u2010"; // ‐ + case 1460: return "\u2AE4"; // ⫤ + case 1462: return "\u22A3"; // ⊣ + case 1469: return "\u290F"; // ⤏ + case 1473: return "\u02DD"; // ˝ + case 1479: return "\u010E"; // Ď + case 1485: return "\u010F"; // ď + case 1487: return "\u0414"; // Д + case 1489: return "\u0434"; // д + case 1491: return "\u2145"; // ⅅ + case 1493: return "\u2146"; // ⅆ + case 1499: return "\u2021"; // ‡ + case 1502: return "\u21CA"; // ⇊ + case 1509: return "\u2911"; // ⤑ + case 1515: return "\u2A77"; // ⩷ + case 1517: return "\u00B0"; // ° + case 1518: return "\u00B0"; // ° + case 1521: return "\u2207"; // ∇ + case 1524: return "\u0394"; // Δ + case 1528: return "\u03B4"; // δ + case 1534: return "\u29B1"; // ⦱ + case 1540: return "\u297F"; // ⥿ + case 1543: return "\uD835\uDD07"; // 𝔇 + case 1545: return "\uD835\uDD21"; // 𝔡 + case 1549: return "\u2965"; // ⥥ + case 1554: return "\u21C3"; // ⇃ + case 1556: return "\u21C2"; // ⇂ + case 1572: return "\u00B4"; // ´ + case 1576: return "\u02D9"; // ˙ + case 1586: return "\u02DD"; // ˝ + case 1592: return "\u0060"; // ` + case 1598: return "\u02DC"; // ˜ + case 1602: return "\u22C4"; // ⋄ + case 1607: return "\u22C4"; // ⋄ + case 1611: return "\u22C4"; // ⋄ + case 1616: return "\u2666"; // ♦ + case 1618: return "\u2666"; // ♦ + case 1620: return "\u00A8"; // ¨ + case 1632: return "\u2146"; // ⅆ + case 1638: return "\u03DD"; // ϝ + case 1642: return "\u22F2"; // ⋲ + case 1644: return "\u00F7"; // ÷ + case 1647: return "\u00F7"; // ÷ + case 1648: return "\u00F7"; // ÷ + case 1656: return "\u22C7"; // ⋇ + case 1660: return "\u22C7"; // ⋇ + case 1664: return "\u0402"; // Ђ + case 1668: return "\u0452"; // ђ + case 1674: return "\u231E"; // ⌞ + case 1678: return "\u230D"; // ⌍ + case 1684: return "\u0024"; // $ + case 1688: return "\uD835\uDD3B"; // 𝔻 + case 1691: return "\uD835\uDD55"; // 𝕕 + case 1693: return "\u00A8"; // ¨ + case 1695: return "\u02D9"; // ˙ + case 1699: return "\u20DC"; // ⃜ + case 1702: return "\u2250"; // ≐ + case 1706: return "\u2251"; // ≑ + case 1712: return "\u2250"; // ≐ + case 1718: return "\u2238"; // ∸ + case 1723: return "\u2214"; // ∔ + case 1730: return "\u22A1"; // ⊡ + case 1743: return "\u2306"; // ⌆ + case 1763: return "\u222F"; // ∯ + case 1767: return "\u00A8"; // ¨ + case 1775: return "\u21D3"; // ⇓ + case 1785: return "\u21D0"; // ⇐ + case 1796: return "\u21D4"; // ⇔ + case 1800: return "\u2AE4"; // ⫤ + case 1813: return "\u27F8"; // ⟸ + case 1824: return "\u27FA"; // ⟺ + case 1835: return "\u27F9"; // ⟹ + case 1846: return "\u21D2"; // ⇒ + case 1850: return "\u22A8"; // ⊨ + case 1858: return "\u21D1"; // ⇑ + case 1868: return "\u21D5"; // ⇕ + case 1880: return "\u2225"; // ∥ + case 1888: return "\u2193"; // ↓ + case 1894: return "\u21D3"; // ⇓ + case 1902: return "\u2193"; // ↓ + case 1906: return "\u2913"; // ⤓ + case 1914: return "\u21F5"; // ⇵ + case 1920: return "\u0311"; // ̑ + case 1931: return "\u21CA"; // ⇊ + case 1943: return "\u21C3"; // ⇃ + case 1949: return "\u21C2"; // ⇂ + case 1965: return "\u2950"; // ⥐ + case 1975: return "\u295E"; // ⥞ + case 1982: return "\u21BD"; // ↽ + case 1986: return "\u2956"; // ⥖ + case 2001: return "\u295F"; // ⥟ + case 2008: return "\u21C1"; // ⇁ + case 2012: return "\u2957"; // ⥗ + case 2016: return "\u22A4"; // ⊤ + case 2022: return "\u21A7"; // ↧ + case 2030: return "\u2910"; // ⤐ + case 2035: return "\u231F"; // ⌟ + case 2039: return "\u230C"; // ⌌ + case 2043: return "\uD835\uDC9F"; // 𝒟 + case 2047: return "\uD835\uDCB9"; // 𝒹 + case 2051: return "\u0405"; // Ѕ + case 2053: return "\u0455"; // ѕ + case 2056: return "\u29F6"; // ⧶ + case 2061: return "\u0110"; // Đ + case 2066: return "\u0111"; // đ + case 2071: return "\u22F1"; // ⋱ + case 2074: return "\u25BF"; // ▿ + case 2076: return "\u25BE"; // ▾ + case 2081: return "\u21F5"; // ⇵ + case 2085: return "\u296F"; // ⥯ + case 2092: return "\u29A6"; // ⦦ + case 2096: return "\u040F"; // Џ + case 2100: return "\u045F"; // џ + case 2107: return "\u27FF"; // ⟿ + case 2113: return "\u00C9"; // É + case 2114: return "\u00C9"; // É + case 2120: return "\u00E9"; // é + case 2121: return "\u00E9"; // é + case 2126: return "\u2A6E"; // ⩮ + case 2132: return "\u011A"; // Ě + case 2138: return "\u011B"; // ě + case 2141: return "\u2256"; // ≖ + case 2144: return "\u00CA"; // Ê + case 2145: return "\u00CA"; // Ê + case 2146: return "\u00EA"; // ê + case 2147: return "\u00EA"; // ê + case 2152: return "\u2255"; // ≕ + case 2154: return "\u042D"; // Э + case 2156: return "\u044D"; // э + case 2161: return "\u2A77"; // ⩷ + case 2165: return "\u0116"; // Ė + case 2168: return "\u2251"; // ≑ + case 2172: return "\u0117"; // ė + case 2174: return "\u2147"; // ⅇ + case 2179: return "\u2252"; // ≒ + case 2182: return "\uD835\uDD08"; // 𝔈 + case 2184: return "\uD835\uDD22"; // 𝔢 + case 2186: return "\u2A9A"; // ⪚ + case 2191: return "\u00C8"; // È + case 2192: return "\u00C8"; // È + case 2196: return "\u00E8"; // è + case 2197: return "\u00E8"; // è + case 2199: return "\u2A96"; // ⪖ + case 2203: return "\u2A98"; // ⪘ + case 2205: return "\u2A99"; // ⪙ + case 2212: return "\u2208"; // ∈ + case 2219: return "\u23E7"; // ⏧ + case 2221: return "\u2113"; // ℓ + case 2223: return "\u2A95"; // ⪕ + case 2227: return "\u2A97"; // ⪗ + case 2232: return "\u0112"; // Ē + case 2237: return "\u0113"; // ē + case 2241: return "\u2205"; // ∅ + case 2245: return "\u2205"; // ∅ + case 2260: return "\u25FB"; // ◻ + case 2262: return "\u2205"; // ∅ + case 2278: return "\u25AB"; // ▫ + case 2281: return "\u2003"; //   + case 2284: return "\u2004"; //   + case 2286: return "\u2005"; //   + case 2289: return "\u014A"; // Ŋ + case 2292: return "\u014B"; // ŋ + case 2295: return "\u2002"; //   + case 2300: return "\u0118"; // Ę + case 2305: return "\u0119"; // ę + case 2308: return "\uD835\uDD3C"; // 𝔼 + case 2311: return "\uD835\uDD56"; // 𝕖 + case 2315: return "\u22D5"; // ⋕ + case 2318: return "\u29E3"; // ⧣ + case 2322: return "\u2A71"; // ⩱ + case 2325: return "\u03B5"; // ε + case 2332: return "\u0395"; // Ε + case 2336: return "\u03B5"; // ε + case 2338: return "\u03F5"; // ϵ + case 2344: return "\u2256"; // ≖ + case 2349: return "\u2255"; // ≕ + case 2353: return "\u2242"; // ≂ + case 2361: return "\u2A96"; // ⪖ + case 2366: return "\u2A95"; // ⪕ + case 2371: return "\u2A75"; // ⩵ + case 2376: return "\u003D"; // = + case 2382: return "\u2242"; // ≂ + case 2386: return "\u225F"; // ≟ + case 2395: return "\u21CC"; // ⇌ + case 2398: return "\u2261"; // ≡ + case 2401: return "\u2A78"; // ⩸ + case 2408: return "\u29E5"; // ⧥ + case 2413: return "\u2971"; // ⥱ + case 2417: return "\u2253"; // ≓ + case 2421: return "\u2130"; // ℰ + case 2425: return "\u212F"; // ℯ + case 2429: return "\u2250"; // ≐ + case 2432: return "\u2A73"; // ⩳ + case 2435: return "\u2242"; // ≂ + case 2438: return "\u0397"; // Η + case 2441: return "\u03B7"; // η + case 2443: return "\u00D0"; // Ð + case 2444: return "\u00D0"; // Ð + case 2445: return "\u00F0"; // ð + case 2446: return "\u00F0"; // ð + case 2449: return "\u00CB"; // Ë + case 2450: return "\u00CB"; // Ë + case 2453: return "\u00EB"; // ë + case 2454: return "\u00EB"; // ë + case 2457: return "\u20AC"; // € + case 2461: return "\u0021"; // ! + case 2465: return "\u2203"; // ∃ + case 2471: return "\u2203"; // ∃ + case 2481: return "\u2130"; // ℰ + case 2492: return "\u2147"; // ⅇ + case 2502: return "\u2147"; // ⅇ + case 2516: return "\u2252"; // ≒ + case 2520: return "\u0424"; // Ф + case 2523: return "\u0444"; // ф + case 2529: return "\u2640"; // ♀ + case 2535: return "\uFB03"; // ffi + case 2539: return "\uFB00"; // ff + case 2543: return "\uFB04"; // ffl + case 2546: return "\uD835\uDD09"; // 𝔉 + case 2548: return "\uD835\uDD23"; // 𝔣 + case 2553: return "\uFB01"; // fi + case 2570: return "\u25FC"; // ◼ + case 2586: return "\u25AA"; // ▪ + case 2591: return "\u0066\u006A"; // fj + case 2595: return "\u266D"; // ♭ + case 2599: return "\uFB02"; // fl + case 2603: return "\u25B1"; // ▱ + case 2607: return "\u0192"; // ƒ + case 2611: return "\uD835\uDD3D"; // 𝔽 + case 2615: return "\uD835\uDD57"; // 𝕗 + case 2620: return "\u2200"; // ∀ + case 2625: return "\u2200"; // ∀ + case 2627: return "\u22D4"; // ⋔ + case 2629: return "\u2AD9"; // ⫙ + case 2638: return "\u2131"; // ℱ + case 2646: return "\u2A0D"; // ⨍ + case 2651: return "\u00BD"; // ½ + case 2652: return "\u00BD"; // ½ + case 2654: return "\u2153"; // ⅓ + case 2655: return "\u00BC"; // ¼ + case 2656: return "\u00BC"; // ¼ + case 2658: return "\u2155"; // ⅕ + case 2660: return "\u2159"; // ⅙ + case 2662: return "\u215B"; // ⅛ + case 2665: return "\u2154"; // ⅔ + case 2667: return "\u2156"; // ⅖ + case 2669: return "\u00BE"; // ¾ + case 2670: return "\u00BE"; // ¾ + case 2672: return "\u2157"; // ⅗ + case 2674: return "\u215C"; // ⅜ + case 2677: return "\u2158"; // ⅘ + case 2680: return "\u215A"; // ⅚ + case 2682: return "\u215D"; // ⅝ + case 2685: return "\u215E"; // ⅞ + case 2688: return "\u2044"; // ⁄ + case 2692: return "\u2322"; // ⌢ + case 2696: return "\u2131"; // ℱ + case 2700: return "\uD835\uDCBB"; // 𝒻 + case 2707: return "\u01F5"; // ǵ + case 2713: return "\u0393"; // Γ + case 2717: return "\u03B3"; // γ + case 2719: return "\u03DC"; // Ϝ + case 2721: return "\u03DD"; // ϝ + case 2723: return "\u2A86"; // ⪆ + case 2729: return "\u011E"; // Ğ + case 2735: return "\u011F"; // ğ + case 2741: return "\u0122"; // Ģ + case 2745: return "\u011C"; // Ĝ + case 2750: return "\u011D"; // ĝ + case 2752: return "\u0413"; // Г + case 2754: return "\u0433"; // г + case 2758: return "\u0120"; // Ġ + case 2762: return "\u0121"; // ġ + case 2764: return "\u2267"; // ≧ + case 2766: return "\u2265"; // ≥ + case 2768: return "\u2A8C"; // ⪌ + case 2770: return "\u22DB"; // ⋛ + case 2772: return "\u2265"; // ≥ + case 2774: return "\u2267"; // ≧ + case 2780: return "\u2A7E"; // ⩾ + case 2782: return "\u2A7E"; // ⩾ + case 2785: return "\u2AA9"; // ⪩ + case 2789: return "\u2A80"; // ⪀ + case 2791: return "\u2A82"; // ⪂ + case 2793: return "\u2A84"; // ⪄ + case 2795: return "\u22DB\uFE00"; // ⋛︀ + case 2798: return "\u2A94"; // ⪔ + case 2801: return "\uD835\uDD0A"; // 𝔊 + case 2804: return "\uD835\uDD24"; // 𝔤 + case 2806: return "\u22D9"; // ⋙ + case 2808: return "\u226B"; // ≫ + case 2810: return "\u22D9"; // ⋙ + case 2815: return "\u2137"; // ℷ + case 2819: return "\u0403"; // Ѓ + case 2823: return "\u0453"; // ѓ + case 2825: return "\u2277"; // ≷ + case 2827: return "\u2AA5"; // ⪥ + case 2829: return "\u2A92"; // ⪒ + case 2831: return "\u2AA4"; // ⪤ + case 2835: return "\u2A8A"; // ⪊ + case 2840: return "\u2A8A"; // ⪊ + case 2842: return "\u2269"; // ≩ + case 2844: return "\u2A88"; // ⪈ + case 2846: return "\u2A88"; // ⪈ + case 2848: return "\u2269"; // ≩ + case 2852: return "\u22E7"; // ⋧ + case 2856: return "\uD835\uDD3E"; // 𝔾 + case 2860: return "\uD835\uDD58"; // 𝕘 + case 2865: return "\u0060"; // ` + case 2877: return "\u2265"; // ≥ + case 2882: return "\u22DB"; // ⋛ + case 2892: return "\u2267"; // ≧ + case 2900: return "\u2AA2"; // ⪢ + case 2905: return "\u2277"; // ≷ + case 2916: return "\u2A7E"; // ⩾ + case 2922: return "\u2273"; // ≳ + case 2926: return "\uD835\uDCA2"; // 𝒢 + case 2930: return "\u210A"; // ℊ + case 2933: return "\u2273"; // ≳ + case 2935: return "\u2A8E"; // ⪎ + case 2937: return "\u2A90"; // ⪐ + case 2938: return "\u003E"; // > + case 2939: return "\u003E"; // > + case 2941: return "\u226B"; // ≫ + case 2942: return "\u003E"; // > + case 2943: return "\u003E"; // > + case 2946: return "\u2AA7"; // ⪧ + case 2949: return "\u2A7A"; // ⩺ + case 2953: return "\u22D7"; // ⋗ + case 2958: return "\u2995"; // ⦕ + case 2964: return "\u2A7C"; // ⩼ + case 2972: return "\u2A86"; // ⪆ + case 2975: return "\u2978"; // ⥸ + case 2979: return "\u22D7"; // ⋗ + case 2986: return "\u22DB"; // ⋛ + case 2992: return "\u2A8C"; // ⪌ + case 2997: return "\u2277"; // ≷ + case 3001: return "\u2273"; // ≳ + case 3010: return "\u2269\uFE00"; // ≩︀ + case 3013: return "\u2269\uFE00"; // ≩︀ + case 3019: return "\u02C7"; // ˇ + case 3026: return "\u200A"; //   + case 3029: return "\u00BD"; // ½ + case 3034: return "\u210B"; // ℋ + case 3040: return "\u042A"; // Ъ + case 3045: return "\u044A"; // ъ + case 3049: return "\u21D4"; // ⇔ + case 3051: return "\u2194"; // ↔ + case 3055: return "\u2948"; // ⥈ + case 3057: return "\u21AD"; // ↭ + case 3059: return "\u005E"; // ^ + case 3063: return "\u210F"; // ℏ + case 3068: return "\u0124"; // Ĥ + case 3073: return "\u0125"; // ĥ + case 3079: return "\u2665"; // ♥ + case 3083: return "\u2665"; // ♥ + case 3088: return "\u2026"; // … + case 3093: return "\u22B9"; // ⊹ + case 3096: return "\u210C"; // ℌ + case 3099: return "\uD835\uDD25"; // 𝔥 + case 3111: return "\u210B"; // ℋ + case 3119: return "\u2925"; // ⤥ + case 3125: return "\u2926"; // ⤦ + case 3130: return "\u21FF"; // ⇿ + case 3135: return "\u223B"; // ∻ + case 3147: return "\u21A9"; // ↩ + case 3158: return "\u21AA"; // ↪ + case 3162: return "\u210D"; // ℍ + case 3165: return "\uD835\uDD59"; // 𝕙 + case 3170: return "\u2015"; // ― + case 3183: return "\u2500"; // ─ + case 3187: return "\u210B"; // ℋ + case 3191: return "\uD835\uDCBD"; // 𝒽 + case 3196: return "\u210F"; // ℏ + case 3201: return "\u0126"; // Ħ + case 3206: return "\u0127"; // ħ + case 3218: return "\u224E"; // ≎ + case 3224: return "\u224F"; // ≏ + case 3230: return "\u2043"; // ⁃ + case 3235: return "\u2010"; // ‐ + case 3241: return "\u00CD"; // Í + case 3242: return "\u00CD"; // Í + case 3248: return "\u00ED"; // í + case 3249: return "\u00ED"; // í + case 3251: return "\u2063"; // ⁣ + case 3255: return "\u00CE"; // Î + case 3256: return "\u00CE"; // Î + case 3259: return "\u00EE"; // î + case 3260: return "\u00EE"; // î + case 3262: return "\u0418"; // И + case 3264: return "\u0438"; // и + case 3268: return "\u0130"; // İ + case 3272: return "\u0415"; // Е + case 3276: return "\u0435"; // е + case 3279: return "\u00A1"; // ¡ + case 3280: return "\u00A1"; // ¡ + case 3283: return "\u21D4"; // ⇔ + case 3286: return "\u2111"; // ℑ + case 3288: return "\uD835\uDD26"; // 𝔦 + case 3293: return "\u00CC"; // Ì + case 3294: return "\u00CC"; // Ì + case 3299: return "\u00EC"; // ì + case 3300: return "\u00EC"; // ì + case 3302: return "\u2148"; // ⅈ + case 3307: return "\u2A0C"; // ⨌ + case 3310: return "\u222D"; // ∭ + case 3315: return "\u29DC"; // ⧜ + case 3319: return "\u2129"; // ℩ + case 3324: return "\u0132"; // IJ + case 3329: return "\u0133"; // ij + case 3331: return "\u2111"; // ℑ + case 3335: return "\u012A"; // Ī + case 3340: return "\u012B"; // ī + case 3343: return "\u2111"; // ℑ + case 3351: return "\u2148"; // ⅈ + case 3356: return "\u2110"; // ℐ + case 3361: return "\u2111"; // ℑ + case 3364: return "\u0131"; // ı + case 3367: return "\u22B7"; // ⊷ + case 3371: return "\u01B5"; // Ƶ + case 3377: return "\u21D2"; // ⇒ + case 3379: return "\u2208"; // ∈ + case 3384: return "\u2105"; // ℅ + case 3388: return "\u221E"; // ∞ + case 3392: return "\u29DD"; // ⧝ + case 3397: return "\u0131"; // ı + case 3400: return "\u222C"; // ∬ + case 3402: return "\u222B"; // ∫ + case 3406: return "\u22BA"; // ⊺ + case 3412: return "\u2124"; // ℤ + case 3418: return "\u222B"; // ∫ + case 3423: return "\u22BA"; // ⊺ + case 3432: return "\u22C2"; // ⋂ + case 3438: return "\u2A17"; // ⨗ + case 3443: return "\u2A3C"; // ⨼ + case 3456: return "\u2063"; // ⁣ + case 3462: return "\u2062"; // ⁢ + case 3466: return "\u0401"; // Ё + case 3470: return "\u0451"; // ё + case 3475: return "\u012E"; // Į + case 3479: return "\u012F"; // į + case 3482: return "\uD835\uDD40"; // 𝕀 + case 3485: return "\uD835\uDD5A"; // 𝕚 + case 3488: return "\u0399"; // Ι + case 3491: return "\u03B9"; // ι + case 3496: return "\u2A3C"; // ⨼ + case 3501: return "\u00BF"; // ¿ + case 3502: return "\u00BF"; // ¿ + case 3506: return "\u2110"; // ℐ + case 3510: return "\uD835\uDCBE"; // 𝒾 + case 3513: return "\u2208"; // ∈ + case 3517: return "\u22F5"; // ⋵ + case 3519: return "\u22F9"; // ⋹ + case 3521: return "\u22F4"; // ⋴ + case 3523: return "\u22F3"; // ⋳ + case 3525: return "\u2208"; // ∈ + case 3527: return "\u2062"; // ⁢ + case 3533: return "\u0128"; // Ĩ + case 3538: return "\u0129"; // ĩ + case 3543: return "\u0406"; // І + case 3548: return "\u0456"; // і + case 3550: return "\u00CF"; // Ï + case 3551: return "\u00CF"; // Ï + case 3553: return "\u00EF"; // ï + case 3554: return "\u00EF"; // ï + case 3560: return "\u0134"; // Ĵ + case 3566: return "\u0135"; // ĵ + case 3568: return "\u0419"; // Й + case 3570: return "\u0439"; // й + case 3573: return "\uD835\uDD0D"; // 𝔍 + case 3576: return "\uD835\uDD27"; // 𝔧 + case 3581: return "\u0237"; // ȷ + case 3585: return "\uD835\uDD41"; // 𝕁 + case 3589: return "\uD835\uDD5B"; // 𝕛 + case 3593: return "\uD835\uDCA5"; // 𝒥 + case 3597: return "\uD835\uDCBF"; // 𝒿 + case 3602: return "\u0408"; // Ј + case 3607: return "\u0458"; // ј + case 3612: return "\u0404"; // Є + case 3617: return "\u0454"; // є + case 3623: return "\u039A"; // Κ + case 3629: return "\u03BA"; // κ + case 3631: return "\u03F0"; // ϰ + case 3637: return "\u0136"; // Ķ + case 3643: return "\u0137"; // ķ + case 3645: return "\u041A"; // К + case 3647: return "\u043A"; // к + case 3650: return "\uD835\uDD0E"; // 𝔎 + case 3653: return "\uD835\uDD28"; // 𝔨 + case 3659: return "\u0138"; // ĸ + case 3663: return "\u0425"; // Х + case 3667: return "\u0445"; // х + case 3671: return "\u040C"; // Ќ + case 3675: return "\u045C"; // ќ + case 3679: return "\uD835\uDD42"; // 𝕂 + case 3683: return "\uD835\uDD5C"; // 𝕜 + case 3687: return "\uD835\uDCA6"; // 𝒦 + case 3691: return "\uD835\uDCC0"; // 𝓀 + case 3697: return "\u21DA"; // ⇚ + case 3704: return "\u0139"; // Ĺ + case 3710: return "\u013A"; // ĺ + case 3717: return "\u29B4"; // ⦴ + case 3722: return "\u2112"; // ℒ + case 3727: return "\u039B"; // Λ + case 3732: return "\u03BB"; // λ + case 3735: return "\u27EA"; // ⟪ + case 3738: return "\u27E8"; // ⟨ + case 3740: return "\u2991"; // ⦑ + case 3743: return "\u27E8"; // ⟨ + case 3745: return "\u2A85"; // ⪅ + case 3754: return "\u2112"; // ℒ + case 3757: return "\u00AB"; // « + case 3758: return "\u00AB"; // « + case 3761: return "\u219E"; // ↞ + case 3764: return "\u21D0"; // ⇐ + case 3767: return "\u2190"; // ← + case 3769: return "\u21E4"; // ⇤ + case 3772: return "\u291F"; // ⤟ + case 3775: return "\u291D"; // ⤝ + case 3778: return "\u21A9"; // ↩ + case 3781: return "\u21AB"; // ↫ + case 3784: return "\u2939"; // ⤹ + case 3788: return "\u2973"; // ⥳ + case 3791: return "\u21A2"; // ↢ + case 3793: return "\u2AAB"; // ⪫ + case 3798: return "\u291B"; // ⤛ + case 3802: return "\u2919"; // ⤙ + case 3804: return "\u2AAD"; // ⪭ + case 3806: return "\u2AAD\uFE00"; // ⪭︀ + case 3811: return "\u290E"; // ⤎ + case 3816: return "\u290C"; // ⤌ + case 3820: return "\u2772"; // ❲ + case 3825: return "\u007B"; // { + case 3827: return "\u005B"; // [ + case 3830: return "\u298B"; // ⦋ + case 3834: return "\u298F"; // ⦏ + case 3836: return "\u298D"; // ⦍ + case 3842: return "\u013D"; // Ľ + case 3848: return "\u013E"; // ľ + case 3853: return "\u013B"; // Ļ + case 3858: return "\u013C"; // ļ + case 3861: return "\u2308"; // ⌈ + case 3864: return "\u007B"; // { + case 3866: return "\u041B"; // Л + case 3868: return "\u043B"; // л + case 3872: return "\u2936"; // ⤶ + case 3876: return "\u201C"; // “ + case 3878: return "\u201E"; // „ + case 3884: return "\u2967"; // ⥧ + case 3890: return "\u294B"; // ⥋ + case 3893: return "\u21B2"; // ↲ + case 3895: return "\u2266"; // ≦ + case 3897: return "\u2264"; // ≤ + case 3913: return "\u27E8"; // ⟨ + case 3918: return "\u2190"; // ← + case 3924: return "\u21D0"; // ⇐ + case 3932: return "\u2190"; // ← + case 3936: return "\u21E4"; // ⇤ + case 3947: return "\u21C6"; // ⇆ + case 3952: return "\u21A2"; // ↢ + case 3960: return "\u2308"; // ⌈ + case 3974: return "\u27E6"; // ⟦ + case 3986: return "\u2961"; // ⥡ + case 3993: return "\u21C3"; // ⇃ + case 3997: return "\u2959"; // ⥙ + case 4003: return "\u230A"; // ⌊ + case 4015: return "\u21BD"; // ↽ + case 4018: return "\u21BC"; // ↼ + case 4029: return "\u21C7"; // ⇇ + case 4040: return "\u2194"; // ↔ + case 4051: return "\u21D4"; // ⇔ + case 4062: return "\u2194"; // ↔ + case 4064: return "\u21C6"; // ⇆ + case 4073: return "\u21CB"; // ⇋ + case 4084: return "\u21AD"; // ↭ + case 4091: return "\u294E"; // ⥎ + case 4095: return "\u22A3"; // ⊣ + case 4101: return "\u21A4"; // ↤ + case 4108: return "\u295A"; // ⥚ + case 4119: return "\u22CB"; // ⋋ + case 4127: return "\u22B2"; // ⊲ + case 4131: return "\u29CF"; // ⧏ + case 4137: return "\u22B4"; // ⊴ + case 4150: return "\u2951"; // ⥑ + case 4160: return "\u2960"; // ⥠ + case 4167: return "\u21BF"; // ↿ + case 4171: return "\u2958"; // ⥘ + case 4178: return "\u21BC"; // ↼ + case 4182: return "\u2952"; // ⥒ + case 4184: return "\u2A8B"; // ⪋ + case 4186: return "\u22DA"; // ⋚ + case 4188: return "\u2264"; // ≤ + case 4190: return "\u2266"; // ≦ + case 4196: return "\u2A7D"; // ⩽ + case 4198: return "\u2A7D"; // ⩽ + case 4201: return "\u2AA8"; // ⪨ + case 4205: return "\u2A7F"; // ⩿ + case 4207: return "\u2A81"; // ⪁ + case 4209: return "\u2A83"; // ⪃ + case 4211: return "\u22DA\uFE00"; // ⋚︀ + case 4214: return "\u2A93"; // ⪓ + case 4222: return "\u2A85"; // ⪅ + case 4226: return "\u22D6"; // ⋖ + case 4232: return "\u22DA"; // ⋚ + case 4237: return "\u2A8B"; // ⪋ + case 4252: return "\u22DA"; // ⋚ + case 4262: return "\u2266"; // ≦ + case 4270: return "\u2276"; // ≶ + case 4274: return "\u2276"; // ≶ + case 4279: return "\u2AA1"; // ⪡ + case 4283: return "\u2272"; // ≲ + case 4294: return "\u2A7D"; // ⩽ + case 4300: return "\u2272"; // ≲ + case 4306: return "\u297C"; // ⥼ + case 4311: return "\u230A"; // ⌊ + case 4314: return "\uD835\uDD0F"; // 𝔏 + case 4316: return "\uD835\uDD29"; // 𝔩 + case 4318: return "\u2276"; // ≶ + case 4320: return "\u2A91"; // ⪑ + case 4324: return "\u2962"; // ⥢ + case 4329: return "\u21BD"; // ↽ + case 4331: return "\u21BC"; // ↼ + case 4333: return "\u296A"; // ⥪ + case 4337: return "\u2584"; // ▄ + case 4341: return "\u0409"; // Љ + case 4345: return "\u0459"; // љ + case 4347: return "\u22D8"; // ⋘ + case 4349: return "\u226A"; // ≪ + case 4353: return "\u21C7"; // ⇇ + case 4360: return "\u231E"; // ⌞ + case 4369: return "\u21DA"; // ⇚ + case 4374: return "\u296B"; // ⥫ + case 4378: return "\u25FA"; // ◺ + case 4384: return "\u013F"; // Ŀ + case 4390: return "\u0140"; // ŀ + case 4395: return "\u23B0"; // ⎰ + case 4400: return "\u23B0"; // ⎰ + case 4404: return "\u2A89"; // ⪉ + case 4409: return "\u2A89"; // ⪉ + case 4411: return "\u2268"; // ≨ + case 4413: return "\u2A87"; // ⪇ + case 4415: return "\u2A87"; // ⪇ + case 4417: return "\u2268"; // ≨ + case 4421: return "\u22E6"; // ⋦ + case 4426: return "\u27EC"; // ⟬ + case 4429: return "\u21FD"; // ⇽ + case 4433: return "\u27E6"; // ⟦ + case 4446: return "\u27F5"; // ⟵ + case 4456: return "\u27F8"; // ⟸ + case 4468: return "\u27F5"; // ⟵ + case 4479: return "\u27F7"; // ⟷ + case 4490: return "\u27FA"; // ⟺ + case 4501: return "\u27F7"; // ⟷ + case 4508: return "\u27FC"; // ⟼ + case 4519: return "\u27F6"; // ⟶ + case 4530: return "\u27F9"; // ⟹ + case 4541: return "\u27F6"; // ⟶ + case 4553: return "\u21AB"; // ↫ + case 4559: return "\u21AC"; // ↬ + case 4563: return "\u2985"; // ⦅ + case 4566: return "\uD835\uDD43"; // 𝕃 + case 4568: return "\uD835\uDD5D"; // 𝕝 + case 4572: return "\u2A2D"; // ⨭ + case 4578: return "\u2A34"; // ⨴ + case 4583: return "\u2217"; // ∗ + case 4587: return "\u005F"; // _ + case 4600: return "\u2199"; // ↙ + case 4611: return "\u2198"; // ↘ + case 4613: return "\u25CA"; // ◊ + case 4618: return "\u25CA"; // ◊ + case 4620: return "\u29EB"; // ⧫ + case 4624: return "\u0028"; // ( + case 4627: return "\u2993"; // ⦓ + case 4632: return "\u21C6"; // ⇆ + case 4639: return "\u231F"; // ⌟ + case 4643: return "\u21CB"; // ⇋ + case 4645: return "\u296D"; // ⥭ + case 4647: return "\u200E"; // ‎ + case 4651: return "\u22BF"; // ⊿ + case 4657: return "\u2039"; // ‹ + case 4661: return "\u2112"; // ℒ + case 4664: return "\uD835\uDCC1"; // 𝓁 + case 4666: return "\u21B0"; // ↰ + case 4668: return "\u21B0"; // ↰ + case 4671: return "\u2272"; // ≲ + case 4673: return "\u2A8D"; // ⪍ + case 4675: return "\u2A8F"; // ⪏ + case 4678: return "\u005B"; // [ + case 4681: return "\u2018"; // ‘ + case 4683: return "\u201A"; // ‚ + case 4688: return "\u0141"; // Ł + case 4693: return "\u0142"; // ł + case 4694: return "\u003C"; // < + case 4695: return "\u003C"; // < + case 4697: return "\u226A"; // ≪ + case 4698: return "\u003C"; // < + case 4699: return "\u003C"; // < + case 4702: return "\u2AA6"; // ⪦ + case 4705: return "\u2A79"; // ⩹ + case 4709: return "\u22D6"; // ⋖ + case 4714: return "\u22CB"; // ⋋ + case 4719: return "\u22C9"; // ⋉ + case 4724: return "\u2976"; // ⥶ + case 4730: return "\u2A7B"; // ⩻ + case 4733: return "\u25C3"; // ◃ + case 4735: return "\u22B4"; // ⊴ + case 4737: return "\u25C2"; // ◂ + case 4741: return "\u2996"; // ⦖ + case 4749: return "\u294A"; // ⥊ + case 4754: return "\u2966"; // ⥦ + case 4763: return "\u2268\uFE00"; // ≨︀ + case 4766: return "\u2268\uFE00"; // ≨︀ + case 4770: return "\u00AF"; // ¯ + case 4771: return "\u00AF"; // ¯ + case 4774: return "\u2642"; // ♂ + case 4776: return "\u2720"; // ✠ + case 4780: return "\u2720"; // ✠ + case 4784: return "\u2905"; // ⤅ + case 4786: return "\u21A6"; // ↦ + case 4790: return "\u21A6"; // ↦ + case 4795: return "\u21A7"; // ↧ + case 4800: return "\u21A4"; // ↤ + case 4803: return "\u21A5"; // ↥ + case 4808: return "\u25AE"; // ▮ + case 4814: return "\u2A29"; // ⨩ + case 4817: return "\u041C"; // М + case 4819: return "\u043C"; // м + case 4824: return "\u2014"; // — + case 4829: return "\u223A"; // ∺ + case 4842: return "\u2221"; // ∡ + case 4853: return "\u205F"; //   + case 4861: return "\u2133"; // ℳ + case 4864: return "\uD835\uDD10"; // 𝔐 + case 4867: return "\uD835\uDD2A"; // 𝔪 + case 4870: return "\u2127"; // ℧ + case 4874: return "\u00B5"; // µ + case 4875: return "\u00B5"; // µ + case 4877: return "\u2223"; // ∣ + case 4881: return "\u002A"; // * + case 4885: return "\u2AF0"; // ⫰ + case 4888: return "\u00B7"; // · + case 4889: return "\u00B7"; // · + case 4893: return "\u2212"; // − + case 4895: return "\u229F"; // ⊟ + case 4897: return "\u2238"; // ∸ + case 4899: return "\u2A2A"; // ⨪ + case 4908: return "\u2213"; // ∓ + case 4912: return "\u2ADB"; // ⫛ + case 4915: return "\u2026"; // … + case 4921: return "\u2213"; // ∓ + case 4927: return "\u22A7"; // ⊧ + case 4931: return "\uD835\uDD44"; // 𝕄 + case 4934: return "\uD835\uDD5E"; // 𝕞 + case 4936: return "\u2213"; // ∓ + case 4940: return "\u2133"; // ℳ + case 4944: return "\uD835\uDCC2"; // 𝓂 + case 4949: return "\u223E"; // ∾ + case 4951: return "\u039C"; // Μ + case 4953: return "\u03BC"; // μ + case 4960: return "\u22B8"; // ⊸ + case 4964: return "\u22B8"; // ⊸ + case 4970: return "\u2207"; // ∇ + case 4977: return "\u0143"; // Ń + case 4982: return "\u0144"; // ń + case 4985: return "\u2220\u20D2"; // ∠⃒ + case 4987: return "\u2249"; // ≉ + case 4989: return "\u2A70\u0338"; // ⩰̸ + case 4992: return "\u224B\u0338"; // ≋̸ + case 4995: return "\u0149"; // ʼn + case 5000: return "\u2249"; // ≉ + case 5004: return "\u266E"; // ♮ + case 5007: return "\u266E"; // ♮ + case 5009: return "\u2115"; // ℕ + case 5012: return "\u00A0"; //   + case 5013: return "\u00A0"; //   + case 5017: return "\u224E\u0338"; // ≎̸ + case 5019: return "\u224F\u0338"; // ≏̸ + case 5023: return "\u2A43"; // ⩃ + case 5029: return "\u0147"; // Ň + case 5033: return "\u0148"; // ň + case 5038: return "\u0145"; // Ņ + case 5043: return "\u0146"; // ņ + case 5047: return "\u2247"; // ≇ + case 5051: return "\u2A6D\u0338"; // ⩭̸ + case 5054: return "\u2A42"; // ⩂ + case 5056: return "\u041D"; // Н + case 5058: return "\u043D"; // н + case 5063: return "\u2013"; // – + case 5065: return "\u2260"; // ≠ + case 5070: return "\u2924"; // ⤤ + case 5074: return "\u21D7"; // ⇗ + case 5076: return "\u2197"; // ↗ + case 5079: return "\u2197"; // ↗ + case 5083: return "\u2250\u0338"; // ≐̸ + case 5102: return "\u200B"; // ​ + case 5113: return "\u200B"; // ​ + case 5120: return "\u200B"; // ​ + case 5134: return "\u200B"; // ​ + case 5139: return "\u2262"; // ≢ + case 5144: return "\u2928"; // ⤨ + case 5147: return "\u2242\u0338"; // ≂̸ + case 5166: return "\u226B"; // ≫ + case 5175: return "\u226A"; // ≪ + case 5181: return "\u000A"; // + case 5186: return "\u2204"; // ∄ + case 5188: return "\u2204"; // ∄ + case 5191: return "\uD835\uDD11"; // 𝔑 + case 5194: return "\uD835\uDD2B"; // 𝔫 + case 5197: return "\u2267\u0338"; // ≧̸ + case 5199: return "\u2271"; // ≱ + case 5201: return "\u2271"; // ≱ + case 5203: return "\u2267\u0338"; // ≧̸ + case 5209: return "\u2A7E\u0338"; // ⩾̸ + case 5211: return "\u2A7E\u0338"; // ⩾̸ + case 5214: return "\u22D9\u0338"; // ⋙̸ + case 5218: return "\u2275"; // ≵ + case 5220: return "\u226B\u20D2"; // ≫⃒ + case 5222: return "\u226F"; // ≯ + case 5224: return "\u226F"; // ≯ + case 5226: return "\u226B\u0338"; // ≫̸ + case 5231: return "\u21CE"; // ⇎ + case 5235: return "\u21AE"; // ↮ + case 5239: return "\u2AF2"; // ⫲ + case 5241: return "\u220B"; // ∋ + case 5243: return "\u22FC"; // ⋼ + case 5245: return "\u22FA"; // ⋺ + case 5247: return "\u220B"; // ∋ + case 5251: return "\u040A"; // Њ + case 5255: return "\u045A"; // њ + case 5260: return "\u21CD"; // ⇍ + case 5264: return "\u219A"; // ↚ + case 5267: return "\u2025"; // ‥ + case 5269: return "\u2266\u0338"; // ≦̸ + case 5271: return "\u2270"; // ≰ + case 5281: return "\u21CD"; // ⇍ + case 5289: return "\u219A"; // ↚ + case 5300: return "\u21CE"; // ⇎ + case 5311: return "\u21AE"; // ↮ + case 5313: return "\u2270"; // ≰ + case 5315: return "\u2266\u0338"; // ≦̸ + case 5321: return "\u2A7D\u0338"; // ⩽̸ + case 5323: return "\u2A7D\u0338"; // ⩽̸ + case 5325: return "\u226E"; // ≮ + case 5327: return "\u22D8\u0338"; // ⋘̸ + case 5331: return "\u2274"; // ≴ + case 5333: return "\u226A\u20D2"; // ≪⃒ + case 5335: return "\u226E"; // ≮ + case 5338: return "\u22EA"; // ⋪ + case 5340: return "\u22EC"; // ⋬ + case 5342: return "\u226A\u0338"; // ≪̸ + case 5346: return "\u2224"; // ∤ + case 5353: return "\u2060"; // ⁠ + case 5368: return "\u00A0"; //   + case 5371: return "\u2115"; // ℕ + case 5375: return "\uD835\uDD5F"; // 𝕟 + case 5377: return "\u2AEC"; // ⫬ + case 5378: return "\u00AC"; // ¬ + case 5379: return "\u00AC"; // ¬ + case 5389: return "\u2262"; // ≢ + case 5395: return "\u226D"; // ≭ + case 5413: return "\u2226"; // ∦ + case 5421: return "\u2209"; // ∉ + case 5426: return "\u2260"; // ≠ + case 5432: return "\u2242\u0338"; // ≂̸ + case 5438: return "\u2204"; // ∄ + case 5446: return "\u226F"; // ≯ + case 5452: return "\u2271"; // ≱ + case 5462: return "\u2267\u0338"; // ≧̸ + case 5470: return "\u226B\u0338"; // ≫̸ + case 5475: return "\u2279"; // ≹ + case 5486: return "\u2A7E\u0338"; // ⩾̸ + case 5492: return "\u2275"; // ≵ + case 5505: return "\u224E\u0338"; // ≎̸ + case 5511: return "\u224F\u0338"; // ≏̸ + case 5514: return "\u2209"; // ∉ + case 5518: return "\u22F5\u0338"; // ⋵̸ + case 5520: return "\u22F9\u0338"; // ⋹̸ + case 5523: return "\u2209"; // ∉ + case 5525: return "\u22F7"; // ⋷ + case 5527: return "\u22F6"; // ⋶ + case 5540: return "\u22EA"; // ⋪ + case 5544: return "\u29CF\u0338"; // ⧏̸ + case 5550: return "\u22EC"; // ⋬ + case 5553: return "\u226E"; // ≮ + case 5559: return "\u2270"; // ≰ + case 5567: return "\u2278"; // ≸ + case 5572: return "\u226A\u0338"; // ≪̸ + case 5583: return "\u2A7D\u0338"; // ⩽̸ + case 5589: return "\u2274"; // ≴ + case 5610: return "\u2AA2\u0338"; // ⪢̸ + case 5619: return "\u2AA1\u0338"; // ⪡̸ + case 5622: return "\u220C"; // ∌ + case 5625: return "\u220C"; // ∌ + case 5627: return "\u22FE"; // ⋾ + case 5629: return "\u22FD"; // ⋽ + case 5638: return "\u2280"; // ⊀ + case 5644: return "\u2AAF\u0338"; // ⪯̸ + case 5655: return "\u22E0"; // ⋠ + case 5670: return "\u220C"; // ∌ + case 5683: return "\u22EB"; // ⋫ + case 5687: return "\u29D0\u0338"; // ⧐̸ + case 5693: return "\u22ED"; // ⋭ + case 5706: return "\u228F\u0338"; // ⊏̸ + case 5712: return "\u22E2"; // ⋢ + case 5719: return "\u2290\u0338"; // ⊐̸ + case 5725: return "\u22E3"; // ⋣ + case 5731: return "\u2282\u20D2"; // ⊂⃒ + case 5737: return "\u2288"; // ⊈ + case 5744: return "\u2281"; // ⊁ + case 5750: return "\u2AB0\u0338"; // ⪰̸ + case 5761: return "\u22E1"; // ⋡ + case 5767: return "\u227F\u0338"; // ≿̸ + case 5774: return "\u2283\u20D2"; // ⊃⃒ + case 5780: return "\u2289"; // ⊉ + case 5786: return "\u2241"; // ≁ + case 5792: return "\u2244"; // ≄ + case 5802: return "\u2247"; // ≇ + case 5808: return "\u2249"; // ≉ + case 5820: return "\u2224"; // ∤ + case 5824: return "\u2226"; // ∦ + case 5830: return "\u2226"; // ∦ + case 5833: return "\u2AFD\u20E5"; // ⫽⃥ + case 5835: return "\u2202\u0338"; // ∂̸ + case 5841: return "\u2A14"; // ⨔ + case 5843: return "\u2280"; // ⊀ + case 5847: return "\u22E0"; // ⋠ + case 5849: return "\u2AAF\u0338"; // ⪯̸ + case 5851: return "\u2280"; // ⊀ + case 5854: return "\u2AAF\u0338"; // ⪯̸ + case 5859: return "\u21CF"; // ⇏ + case 5863: return "\u219B"; // ↛ + case 5865: return "\u2933\u0338"; // ⤳̸ + case 5867: return "\u219D\u0338"; // ↝̸ + case 5878: return "\u21CF"; // ⇏ + case 5888: return "\u219B"; // ↛ + case 5892: return "\u22EB"; // ⋫ + case 5894: return "\u22ED"; // ⋭ + case 5897: return "\u2281"; // ⊁ + case 5901: return "\u22E1"; // ⋡ + case 5903: return "\u2AB0\u0338"; // ⪰̸ + case 5907: return "\uD835\uDCA9"; // 𝒩 + case 5909: return "\uD835\uDCC3"; // 𝓃 + case 5917: return "\u2224"; // ∤ + case 5926: return "\u2226"; // ∦ + case 5929: return "\u2241"; // ≁ + case 5931: return "\u2244"; // ≄ + case 5933: return "\u2244"; // ≄ + case 5937: return "\u2224"; // ∤ + case 5941: return "\u2226"; // ∦ + case 5947: return "\u22E2"; // ⋢ + case 5950: return "\u22E3"; // ⋣ + case 5953: return "\u2284"; // ⊄ + case 5955: return "\u2AC5\u0338"; // ⫅̸ + case 5957: return "\u2288"; // ⊈ + case 5961: return "\u2282\u20D2"; // ⊂⃒ + case 5964: return "\u2288"; // ⊈ + case 5966: return "\u2AC5\u0338"; // ⫅̸ + case 5969: return "\u2281"; // ⊁ + case 5972: return "\u2AB0\u0338"; // ⪰̸ + case 5974: return "\u2285"; // ⊅ + case 5976: return "\u2AC6\u0338"; // ⫆̸ + case 5978: return "\u2289"; // ⊉ + case 5982: return "\u2283\u20D2"; // ⊃⃒ + case 5985: return "\u2289"; // ⊉ + case 5987: return "\u2AC6\u0338"; // ⫆̸ + case 5991: return "\u2279"; // ≹ + case 5996: return "\u00D1"; // Ñ + case 5997: return "\u00D1"; // Ñ + case 6001: return "\u00F1"; // ñ + case 6002: return "\u00F1"; // ñ + case 6005: return "\u2278"; // ≸ + case 6017: return "\u22EA"; // ⋪ + case 6020: return "\u22EC"; // ⋬ + case 6026: return "\u22EB"; // ⋫ + case 6029: return "\u22ED"; // ⋭ + case 6031: return "\u039D"; // Ν + case 6033: return "\u03BD"; // ν + case 6035: return "\u0023"; // # + case 6039: return "\u2116"; // № + case 6042: return "\u2007"; //   + case 6046: return "\u224D\u20D2"; // ≍⃒ + case 6052: return "\u22AF"; // ⊯ + case 6057: return "\u22AE"; // ⊮ + case 6062: return "\u22AD"; // ⊭ + case 6067: return "\u22AC"; // ⊬ + case 6070: return "\u2265\u20D2"; // ≥⃒ + case 6072: return "\u003E\u20D2"; // >⃒ + case 6077: return "\u2904"; // ⤄ + case 6083: return "\u29DE"; // ⧞ + case 6088: return "\u2902"; // ⤂ + case 6090: return "\u2264\u20D2"; // ≤⃒ + case 6092: return "\u003C\u20D2"; // <⃒ + case 6096: return "\u22B4\u20D2"; // ⊴⃒ + case 6101: return "\u2903"; // ⤃ + case 6106: return "\u22B5\u20D2"; // ⊵⃒ + case 6110: return "\u223C\u20D2"; // ∼⃒ + case 6116: return "\u2923"; // ⤣ + case 6120: return "\u21D6"; // ⇖ + case 6122: return "\u2196"; // ↖ + case 6125: return "\u2196"; // ↖ + case 6130: return "\u2927"; // ⤧ + case 6136: return "\u00D3"; // Ó + case 6137: return "\u00D3"; // Ó + case 6143: return "\u00F3"; // ó + case 6144: return "\u00F3"; // ó + case 6147: return "\u229B"; // ⊛ + case 6151: return "\u229A"; // ⊚ + case 6155: return "\u00D4"; // Ô + case 6156: return "\u00D4"; // Ô + case 6157: return "\u00F4"; // ô + case 6158: return "\u00F4"; // ô + case 6160: return "\u041E"; // О + case 6162: return "\u043E"; // о + case 6167: return "\u229D"; // ⊝ + case 6173: return "\u0150"; // Ő + case 6178: return "\u0151"; // ő + case 6181: return "\u2A38"; // ⨸ + case 6184: return "\u2299"; // ⊙ + case 6189: return "\u29BC"; // ⦼ + case 6194: return "\u0152"; // Œ + case 6199: return "\u0153"; // œ + case 6204: return "\u29BF"; // ⦿ + case 6207: return "\uD835\uDD12"; // 𝔒 + case 6209: return "\uD835\uDD2C"; // 𝔬 + case 6213: return "\u02DB"; // ˛ + case 6218: return "\u00D2"; // Ò + case 6219: return "\u00D2"; // Ò + case 6223: return "\u00F2"; // ò + case 6224: return "\u00F2"; // ò + case 6226: return "\u29C1"; // ⧁ + case 6231: return "\u29B5"; // ⦵ + case 6233: return "\u03A9"; // Ω + case 6237: return "\u222E"; // ∮ + case 6242: return "\u21BA"; // ↺ + case 6246: return "\u29BE"; // ⦾ + case 6251: return "\u29BB"; // ⦻ + case 6255: return "\u203E"; // ‾ + case 6257: return "\u29C0"; // ⧀ + case 6262: return "\u014C"; // Ō + case 6267: return "\u014D"; // ō + case 6271: return "\u03A9"; // Ω + case 6275: return "\u03C9"; // ω + case 6281: return "\u039F"; // Ο + case 6287: return "\u03BF"; // ο + case 6289: return "\u29B6"; // ⦶ + case 6293: return "\u2296"; // ⊖ + case 6297: return "\uD835\uDD46"; // 𝕆 + case 6301: return "\uD835\uDD60"; // 𝕠 + case 6305: return "\u29B7"; // ⦷ + case 6325: return "\u201C"; // “ + case 6331: return "\u2018"; // ‘ + case 6335: return "\u29B9"; // ⦹ + case 6339: return "\u2295"; // ⊕ + case 6341: return "\u2A54"; // ⩔ + case 6343: return "\u2228"; // ∨ + case 6347: return "\u21BB"; // ↻ + case 6349: return "\u2A5D"; // ⩝ + case 6352: return "\u2134"; // ℴ + case 6355: return "\u2134"; // ℴ + case 6356: return "\u00AA"; // ª + case 6357: return "\u00AA"; // ª + case 6358: return "\u00BA"; // º + case 6359: return "\u00BA"; // º + case 6364: return "\u22B6"; // ⊶ + case 6367: return "\u2A56"; // ⩖ + case 6373: return "\u2A57"; // ⩗ + case 6375: return "\u2A5B"; // ⩛ + case 6377: return "\u24C8"; // Ⓢ + case 6381: return "\uD835\uDCAA"; // 𝒪 + case 6385: return "\u2134"; // ℴ + case 6389: return "\u00D8"; // Ø + case 6390: return "\u00D8"; // Ø + case 6394: return "\u00F8"; // ø + case 6395: return "\u00F8"; // ø + case 6398: return "\u2298"; // ⊘ + case 6403: return "\u00D5"; // Õ + case 6404: return "\u00D5"; // Õ + case 6409: return "\u00F5"; // õ + case 6410: return "\u00F5"; // õ + case 6414: return "\u2A37"; // ⨷ + case 6418: return "\u2297"; // ⊗ + case 6421: return "\u2A36"; // ⨶ + case 6424: return "\u00D6"; // Ö + case 6425: return "\u00D6"; // Ö + case 6428: return "\u00F6"; // ö + case 6429: return "\u00F6"; // ö + case 6434: return "\u233D"; // ⌽ + case 6441: return "\u203E"; // ‾ + case 6446: return "\u23DE"; // ⏞ + case 6450: return "\u23B4"; // ⎴ + case 6462: return "\u23DC"; // ⏜ + case 6466: return "\u2225"; // ∥ + case 6467: return "\u00B6"; // ¶ + case 6468: return "\u00B6"; // ¶ + case 6473: return "\u2225"; // ∥ + case 6477: return "\u2AF3"; // ⫳ + case 6479: return "\u2AFD"; // ⫽ + case 6481: return "\u2202"; // ∂ + case 6490: return "\u2202"; // ∂ + case 6493: return "\u041F"; // П + case 6496: return "\u043F"; // п + case 6502: return "\u0025"; // % + case 6506: return "\u002E"; // . + case 6510: return "\u2030"; // ‰ + case 6512: return "\u22A5"; // ⊥ + case 6517: return "\u2031"; // ‱ + case 6520: return "\uD835\uDD13"; // 𝔓 + case 6523: return "\uD835\uDD2D"; // 𝔭 + case 6526: return "\u03A6"; // Φ + case 6529: return "\u03C6"; // φ + case 6531: return "\u03D5"; // ϕ + case 6536: return "\u2133"; // ℳ + case 6540: return "\u260E"; // ☎ + case 6542: return "\u03A0"; // Π + case 6544: return "\u03C0"; // π + case 6552: return "\u22D4"; // ⋔ + case 6554: return "\u03D6"; // ϖ + case 6560: return "\u210F"; // ℏ + case 6562: return "\u210E"; // ℎ + case 6565: return "\u210F"; // ℏ + case 6568: return "\u002B"; // + + case 6573: return "\u2A23"; // ⨣ + case 6575: return "\u229E"; // ⊞ + case 6579: return "\u2A22"; // ⨢ + case 6582: return "\u2214"; // ∔ + case 6584: return "\u2A25"; // ⨥ + case 6586: return "\u2A72"; // ⩲ + case 6595: return "\u00B1"; // ± + case 6597: return "\u00B1"; // ± + case 6598: return "\u00B1"; // ± + case 6602: return "\u2A26"; // ⨦ + case 6606: return "\u2A27"; // ⨧ + case 6608: return "\u00B1"; // ± + case 6621: return "\u210C"; // ℌ + case 6629: return "\u2A15"; // ⨕ + case 6632: return "\u2119"; // ℙ + case 6635: return "\uD835\uDD61"; // 𝕡 + case 6638: return "\u00A3"; // £ + case 6639: return "\u00A3"; // £ + case 6641: return "\u2ABB"; // ⪻ + case 6643: return "\u227A"; // ≺ + case 6646: return "\u2AB7"; // ⪷ + case 6650: return "\u227C"; // ≼ + case 6652: return "\u2AB3"; // ⪳ + case 6654: return "\u2AAF"; // ⪯ + case 6656: return "\u227A"; // ≺ + case 6663: return "\u2AB7"; // ⪷ + case 6671: return "\u227C"; // ≼ + case 6678: return "\u227A"; // ≺ + case 6684: return "\u2AAF"; // ⪯ + case 6695: return "\u227C"; // ≼ + case 6701: return "\u227E"; // ≾ + case 6704: return "\u2AAF"; // ⪯ + case 6712: return "\u2AB9"; // ⪹ + case 6716: return "\u2AB5"; // ⪵ + case 6720: return "\u22E8"; // ⋨ + case 6724: return "\u227E"; // ≾ + case 6728: return "\u2033"; // ″ + case 6732: return "\u2032"; // ′ + case 6734: return "\u2119"; // ℙ + case 6738: return "\u2AB9"; // ⪹ + case 6740: return "\u2AB5"; // ⪵ + case 6744: return "\u22E8"; // ⋨ + case 6747: return "\u220F"; // ∏ + case 6753: return "\u220F"; // ∏ + case 6759: return "\u232E"; // ⌮ + case 6764: return "\u2312"; // ⌒ + case 6769: return "\u2313"; // ⌓ + case 6771: return "\u221D"; // ∝ + case 6779: return "\u2237"; // ∷ + case 6782: return "\u221D"; // ∝ + case 6785: return "\u221D"; // ∝ + case 6789: return "\u227E"; // ≾ + case 6794: return "\u22B0"; // ⊰ + case 6798: return "\uD835\uDCAB"; // 𝒫 + case 6802: return "\uD835\uDCC5"; // 𝓅 + case 6804: return "\u03A8"; // Ψ + case 6806: return "\u03C8"; // ψ + case 6812: return "\u2008"; //   + case 6816: return "\uD835\uDD14"; // 𝔔 + case 6820: return "\uD835\uDD2E"; // 𝔮 + case 6824: return "\u2A0C"; // ⨌ + case 6828: return "\u211A"; // ℚ + case 6832: return "\uD835\uDD62"; // 𝕢 + case 6838: return "\u2057"; // ⁗ + case 6842: return "\uD835\uDCAC"; // 𝒬 + case 6846: return "\uD835\uDCC6"; // 𝓆 + case 6857: return "\u210D"; // ℍ + case 6861: return "\u2A16"; // ⨖ + case 6865: return "\u003F"; // ? + case 6868: return "\u225F"; // ≟ + case 6871: return "\u0022"; // " + case 6872: return "\u0022"; // " + case 6874: return "\u0022"; // " + case 6875: return "\u0022"; // " + case 6881: return "\u21DB"; // ⇛ + case 6885: return "\u223D\u0331"; // ∽̱ + case 6892: return "\u0154"; // Ŕ + case 6896: return "\u0155"; // ŕ + case 6900: return "\u221A"; // √ + case 6907: return "\u29B3"; // ⦳ + case 6910: return "\u27EB"; // ⟫ + case 6913: return "\u27E9"; // ⟩ + case 6915: return "\u2992"; // ⦒ + case 6917: return "\u29A5"; // ⦥ + case 6920: return "\u27E9"; // ⟩ + case 6923: return "\u00BB"; // » + case 6924: return "\u00BB"; // » + case 6927: return "\u21A0"; // ↠ + case 6930: return "\u21D2"; // ⇒ + case 6933: return "\u2192"; // → + case 6936: return "\u2975"; // ⥵ + case 6938: return "\u21E5"; // ⇥ + case 6941: return "\u2920"; // ⤠ + case 6943: return "\u2933"; // ⤳ + case 6946: return "\u291E"; // ⤞ + case 6949: return "\u21AA"; // ↪ + case 6952: return "\u21AC"; // ↬ + case 6955: return "\u2945"; // ⥅ + case 6959: return "\u2974"; // ⥴ + case 6962: return "\u2916"; // ⤖ + case 6965: return "\u21A3"; // ↣ + case 6967: return "\u219D"; // ↝ + case 6972: return "\u291C"; // ⤜ + case 6977: return "\u291A"; // ⤚ + case 6980: return "\u2236"; // ∶ + case 6985: return "\u211A"; // ℚ + case 6990: return "\u2910"; // ⤐ + case 6995: return "\u290F"; // ⤏ + case 7000: return "\u290D"; // ⤍ + case 7004: return "\u2773"; // ❳ + case 7009: return "\u007D"; // } + case 7011: return "\u005D"; // ] + case 7014: return "\u298C"; // ⦌ + case 7018: return "\u298E"; // ⦎ + case 7020: return "\u2990"; // ⦐ + case 7026: return "\u0158"; // Ř + case 7032: return "\u0159"; // ř + case 7037: return "\u0156"; // Ŗ + case 7042: return "\u0157"; // ŗ + case 7045: return "\u2309"; // ⌉ + case 7048: return "\u007D"; // } + case 7050: return "\u0420"; // Р + case 7052: return "\u0440"; // р + case 7056: return "\u2937"; // ⤷ + case 7062: return "\u2969"; // ⥩ + case 7066: return "\u201D"; // ” + case 7068: return "\u201D"; // ” + case 7071: return "\u21B3"; // ↳ + case 7073: return "\u211C"; // ℜ + case 7077: return "\u211C"; // ℜ + case 7081: return "\u211B"; // ℛ + case 7086: return "\u211C"; // ℜ + case 7088: return "\u211D"; // ℝ + case 7091: return "\u25AD"; // ▭ + case 7093: return "\u00AE"; // ® + case 7094: return "\u00AE"; // ® + case 7095: return "\u00AE"; // ® + case 7096: return "\u00AE"; // ® + case 7109: return "\u220B"; // ∋ + case 7120: return "\u21CB"; // ⇋ + case 7134: return "\u296F"; // ⥯ + case 7140: return "\u297D"; // ⥽ + case 7145: return "\u230B"; // ⌋ + case 7148: return "\u211C"; // ℜ + case 7150: return "\uD835\uDD2F"; // 𝔯 + case 7154: return "\u2964"; // ⥤ + case 7159: return "\u21C1"; // ⇁ + case 7161: return "\u21C0"; // ⇀ + case 7163: return "\u296C"; // ⥬ + case 7166: return "\u03A1"; // Ρ + case 7168: return "\u03C1"; // ρ + case 7170: return "\u03F1"; // ϱ + case 7187: return "\u27E9"; // ⟩ + case 7192: return "\u2192"; // → + case 7198: return "\u21D2"; // ⇒ + case 7208: return "\u2192"; // → + case 7212: return "\u21E5"; // ⇥ + case 7222: return "\u21C4"; // ⇄ + case 7227: return "\u21A3"; // ↣ + case 7235: return "\u2309"; // ⌉ + case 7249: return "\u27E7"; // ⟧ + case 7261: return "\u295D"; // ⥝ + case 7268: return "\u21C2"; // ⇂ + case 7272: return "\u2955"; // ⥕ + case 7278: return "\u230B"; // ⌋ + case 7290: return "\u21C1"; // ⇁ + case 7293: return "\u21C0"; // ⇀ + case 7304: return "\u21C4"; // ⇄ + case 7313: return "\u21CC"; // ⇌ + case 7325: return "\u21C9"; // ⇉ + case 7336: return "\u219D"; // ↝ + case 7340: return "\u22A2"; // ⊢ + case 7346: return "\u21A6"; // ↦ + case 7353: return "\u295B"; // ⥛ + case 7364: return "\u22CC"; // ⋌ + case 7372: return "\u22B3"; // ⊳ + case 7376: return "\u29D0"; // ⧐ + case 7382: return "\u22B5"; // ⊵ + case 7395: return "\u294F"; // ⥏ + case 7405: return "\u295C"; // ⥜ + case 7412: return "\u21BE"; // ↾ + case 7416: return "\u2954"; // ⥔ + case 7423: return "\u21C0"; // ⇀ + case 7427: return "\u2953"; // ⥓ + case 7430: return "\u02DA"; // ˚ + case 7441: return "\u2253"; // ≓ + case 7446: return "\u21C4"; // ⇄ + case 7450: return "\u21CC"; // ⇌ + case 7452: return "\u200F"; // ‏ + case 7458: return "\u23B1"; // ⎱ + case 7463: return "\u23B1"; // ⎱ + case 7468: return "\u2AEE"; // ⫮ + case 7473: return "\u27ED"; // ⟭ + case 7476: return "\u21FE"; // ⇾ + case 7480: return "\u27E7"; // ⟧ + case 7484: return "\u2986"; // ⦆ + case 7488: return "\u211D"; // ℝ + case 7490: return "\uD835\uDD63"; // 𝕣 + case 7494: return "\u2A2E"; // ⨮ + case 7500: return "\u2A35"; // ⨵ + case 7511: return "\u2970"; // ⥰ + case 7515: return "\u0029"; // ) + case 7518: return "\u2994"; // ⦔ + case 7525: return "\u2A12"; // ⨒ + case 7530: return "\u21C9"; // ⇉ + case 7541: return "\u21DB"; // ⇛ + case 7547: return "\u203A"; // › + case 7551: return "\u211B"; // ℛ + case 7554: return "\uD835\uDCC7"; // 𝓇 + case 7556: return "\u21B1"; // ↱ + case 7558: return "\u21B1"; // ↱ + case 7561: return "\u005D"; // ] + case 7564: return "\u2019"; // ’ + case 7566: return "\u2019"; // ’ + case 7572: return "\u22CC"; // ⋌ + case 7577: return "\u22CA"; // ⋊ + case 7580: return "\u25B9"; // ▹ + case 7582: return "\u22B5"; // ⊵ + case 7584: return "\u25B8"; // ▸ + case 7589: return "\u29CE"; // ⧎ + case 7600: return "\u29F4"; // ⧴ + case 7607: return "\u2968"; // ⥨ + case 7609: return "\u211E"; // ℞ + case 7616: return "\u015A"; // Ś + case 7623: return "\u015B"; // ś + case 7628: return "\u201A"; // ‚ + case 7630: return "\u2ABC"; // ⪼ + case 7632: return "\u227B"; // ≻ + case 7635: return "\u2AB8"; // ⪸ + case 7640: return "\u0160"; // Š + case 7644: return "\u0161"; // š + case 7648: return "\u227D"; // ≽ + case 7650: return "\u2AB4"; // ⪴ + case 7652: return "\u2AB0"; // ⪰ + case 7657: return "\u015E"; // Ş + case 7661: return "\u015F"; // ş + case 7665: return "\u015C"; // Ŝ + case 7669: return "\u015D"; // ŝ + case 7673: return "\u2ABA"; // ⪺ + case 7675: return "\u2AB6"; // ⪶ + case 7679: return "\u22E9"; // ⋩ + case 7686: return "\u2A13"; // ⨓ + case 7690: return "\u227F"; // ≿ + case 7692: return "\u0421"; // С + case 7694: return "\u0441"; // с + case 7698: return "\u22C5"; // ⋅ + case 7700: return "\u22A1"; // ⊡ + case 7702: return "\u2A66"; // ⩦ + case 7708: return "\u2925"; // ⤥ + case 7712: return "\u21D8"; // ⇘ + case 7714: return "\u2198"; // ↘ + case 7717: return "\u2198"; // ↘ + case 7719: return "\u00A7"; // § + case 7720: return "\u00A7"; // § + case 7723: return "\u003B"; // ; + case 7728: return "\u2929"; // ⤩ + case 7735: return "\u2216"; // ∖ + case 7737: return "\u2216"; // ∖ + case 7740: return "\u2736"; // ✶ + case 7743: return "\uD835\uDD16"; // 𝔖 + case 7746: return "\uD835\uDD30"; // 𝔰 + case 7750: return "\u2322"; // ⌢ + case 7755: return "\u266F"; // ♯ + case 7761: return "\u0429"; // Щ + case 7766: return "\u0449"; // щ + case 7769: return "\u0428"; // Ш + case 7771: return "\u0448"; // ш + case 7785: return "\u2193"; // ↓ + case 7795: return "\u2190"; // ← + case 7802: return "\u2223"; // ∣ + case 7811: return "\u2225"; // ∥ + case 7822: return "\u2192"; // → + case 7830: return "\u2191"; // ↑ + case 7831: return "\u00AD"; // ­ + case 7832: return "\u00AD"; // ­ + case 7837: return "\u03A3"; // Σ + case 7842: return "\u03C3"; // σ + case 7844: return "\u03C2"; // ς + case 7846: return "\u03C2"; // ς + case 7848: return "\u223C"; // ∼ + case 7852: return "\u2A6A"; // ⩪ + case 7854: return "\u2243"; // ≃ + case 7856: return "\u2243"; // ≃ + case 7858: return "\u2A9E"; // ⪞ + case 7860: return "\u2AA0"; // ⪠ + case 7862: return "\u2A9D"; // ⪝ + case 7864: return "\u2A9F"; // ⪟ + case 7867: return "\u2246"; // ≆ + case 7872: return "\u2A24"; // ⨤ + case 7877: return "\u2972"; // ⥲ + case 7882: return "\u2190"; // ← + case 7893: return "\u2218"; // ∘ + case 7906: return "\u2216"; // ∖ + case 7910: return "\u2A33"; // ⨳ + case 7917: return "\u29E4"; // ⧤ + case 7920: return "\u2223"; // ∣ + case 7923: return "\u2323"; // ⌣ + case 7925: return "\u2AAA"; // ⪪ + case 7927: return "\u2AAC"; // ⪬ + case 7929: return "\u2AAC\uFE00"; // ⪬︀ + case 7935: return "\u042C"; // Ь + case 7941: return "\u044C"; // ь + case 7943: return "\u002F"; // / + case 7945: return "\u29C4"; // ⧄ + case 7948: return "\u233F"; // ⌿ + case 7952: return "\uD835\uDD4A"; // 𝕊 + case 7955: return "\uD835\uDD64"; // 𝕤 + case 7961: return "\u2660"; // ♠ + case 7965: return "\u2660"; // ♠ + case 7967: return "\u2225"; // ∥ + case 7972: return "\u2293"; // ⊓ + case 7974: return "\u2293\uFE00"; // ⊓︀ + case 7977: return "\u2294"; // ⊔ + case 7979: return "\u2294\uFE00"; // ⊔︀ + case 7983: return "\u221A"; // √ + case 7987: return "\u228F"; // ⊏ + case 7989: return "\u2291"; // ⊑ + case 7993: return "\u228F"; // ⊏ + case 7996: return "\u2291"; // ⊑ + case 7998: return "\u2290"; // ⊐ + case 8000: return "\u2292"; // ⊒ + case 8004: return "\u2290"; // ⊐ + case 8007: return "\u2292"; // ⊒ + case 8009: return "\u25A1"; // □ + case 8014: return "\u25A1"; // □ + case 8018: return "\u25A1"; // □ + case 8031: return "\u2293"; // ⊓ + case 8038: return "\u228F"; // ⊏ + case 8044: return "\u2291"; // ⊑ + case 8051: return "\u2290"; // ⊐ + case 8057: return "\u2292"; // ⊒ + case 8063: return "\u2294"; // ⊔ + case 8065: return "\u25AA"; // ▪ + case 8067: return "\u25AA"; // ▪ + case 8072: return "\u2192"; // → + case 8076: return "\uD835\uDCAE"; // 𝒮 + case 8080: return "\uD835\uDCC8"; // 𝓈 + case 8085: return "\u2216"; // ∖ + case 8090: return "\u2323"; // ⌣ + case 8095: return "\u22C6"; // ⋆ + case 8099: return "\u22C6"; // ⋆ + case 8103: return "\u2606"; // ☆ + case 8105: return "\u2605"; // ★ + case 8119: return "\u03F5"; // ϵ + case 8123: return "\u03D5"; // ϕ + case 8126: return "\u00AF"; // ¯ + case 8129: return "\u22D0"; // ⋐ + case 8132: return "\u2282"; // ⊂ + case 8136: return "\u2ABD"; // ⪽ + case 8138: return "\u2AC5"; // ⫅ + case 8140: return "\u2286"; // ⊆ + case 8144: return "\u2AC3"; // ⫃ + case 8149: return "\u2AC1"; // ⫁ + case 8152: return "\u2ACB"; // ⫋ + case 8154: return "\u228A"; // ⊊ + case 8159: return "\u2ABF"; // ⪿ + case 8164: return "\u2979"; // ⥹ + case 8168: return "\u22D0"; // ⋐ + case 8172: return "\u2282"; // ⊂ + case 8175: return "\u2286"; // ⊆ + case 8177: return "\u2AC5"; // ⫅ + case 8183: return "\u2286"; // ⊆ + case 8187: return "\u228A"; // ⊊ + case 8189: return "\u2ACB"; // ⫋ + case 8192: return "\u2AC7"; // ⫇ + case 8195: return "\u2AD5"; // ⫕ + case 8197: return "\u2AD3"; // ⫓ + case 8200: return "\u227B"; // ≻ + case 8207: return "\u2AB8"; // ⪸ + case 8215: return "\u227D"; // ≽ + case 8222: return "\u227B"; // ≻ + case 8228: return "\u2AB0"; // ⪰ + case 8239: return "\u227D"; // ≽ + case 8245: return "\u227F"; // ≿ + case 8248: return "\u2AB0"; // ⪰ + case 8256: return "\u2ABA"; // ⪺ + case 8260: return "\u2AB6"; // ⪶ + case 8264: return "\u22E9"; // ⋩ + case 8268: return "\u227F"; // ≿ + case 8274: return "\u220B"; // ∋ + case 8276: return "\u2211"; // ∑ + case 8278: return "\u2211"; // ∑ + case 8281: return "\u266A"; // ♪ + case 8283: return "\u22D1"; // ⋑ + case 8285: return "\u2283"; // ⊃ + case 8286: return "\u00B9"; // ¹ + case 8287: return "\u00B9"; // ¹ + case 8288: return "\u00B2"; // ² + case 8289: return "\u00B2"; // ² + case 8290: return "\u00B3"; // ³ + case 8291: return "\u00B3"; // ³ + case 8295: return "\u2ABE"; // ⪾ + case 8299: return "\u2AD8"; // ⫘ + case 8301: return "\u2AC6"; // ⫆ + case 8303: return "\u2287"; // ⊇ + case 8307: return "\u2AC4"; // ⫄ + case 8313: return "\u2283"; // ⊃ + case 8319: return "\u2287"; // ⊇ + case 8324: return "\u27C9"; // ⟉ + case 8327: return "\u2AD7"; // ⫗ + case 8332: return "\u297B"; // ⥻ + case 8337: return "\u2AC2"; // ⫂ + case 8340: return "\u2ACC"; // ⫌ + case 8342: return "\u228B"; // ⊋ + case 8347: return "\u2AC0"; // ⫀ + case 8351: return "\u22D1"; // ⋑ + case 8355: return "\u2283"; // ⊃ + case 8358: return "\u2287"; // ⊇ + case 8360: return "\u2AC6"; // ⫆ + case 8364: return "\u228B"; // ⊋ + case 8366: return "\u2ACC"; // ⫌ + case 8369: return "\u2AC8"; // ⫈ + case 8372: return "\u2AD4"; // ⫔ + case 8374: return "\u2AD6"; // ⫖ + case 8380: return "\u2926"; // ⤦ + case 8384: return "\u21D9"; // ⇙ + case 8386: return "\u2199"; // ↙ + case 8389: return "\u2199"; // ↙ + case 8394: return "\u292A"; // ⤪ + case 8398: return "\u00DF"; // ß + case 8399: return "\u00DF"; // ß + case 8403: return "\u0009"; // + case 8410: return "\u2316"; // ⌖ + case 8412: return "\u03A4"; // Τ + case 8414: return "\u03C4"; // τ + case 8418: return "\u23B4"; // ⎴ + case 8424: return "\u0164"; // Ť + case 8430: return "\u0165"; // ť + case 8435: return "\u0162"; // Ţ + case 8440: return "\u0163"; // ţ + case 8442: return "\u0422"; // Т + case 8444: return "\u0442"; // т + case 8448: return "\u20DB"; // ⃛ + case 8454: return "\u2315"; // ⌕ + case 8457: return "\uD835\uDD17"; // 𝔗 + case 8460: return "\uD835\uDD31"; // 𝔱 + case 8466: return "\u2234"; // ∴ + case 8475: return "\u2234"; // ∴ + case 8480: return "\u2234"; // ∴ + case 8483: return "\u0398"; // Θ + case 8486: return "\u03B8"; // θ + case 8490: return "\u03D1"; // ϑ + case 8492: return "\u03D1"; // ϑ + case 8502: return "\u2248"; // ≈ + case 8506: return "\u223C"; // ∼ + case 8515: return "\u205F\u200A"; //    + case 8519: return "\u2009"; //   + case 8526: return "\u2009"; //   + case 8530: return "\u2248"; // ≈ + case 8534: return "\u223C"; // ∼ + case 8538: return "\u00DE"; // Þ + case 8539: return "\u00DE"; // Þ + case 8542: return "\u00FE"; // þ + case 8543: return "\u00FE"; // þ + case 8548: return "\u223C"; // ∼ + case 8553: return "\u02DC"; // ˜ + case 8559: return "\u2243"; // ≃ + case 8569: return "\u2245"; // ≅ + case 8575: return "\u2248"; // ≈ + case 8578: return "\u00D7"; // × + case 8579: return "\u00D7"; // × + case 8581: return "\u22A0"; // ⊠ + case 8584: return "\u2A31"; // ⨱ + case 8586: return "\u2A30"; // ⨰ + case 8589: return "\u222D"; // ∭ + case 8593: return "\u2928"; // ⤨ + case 8595: return "\u22A4"; // ⊤ + case 8599: return "\u2336"; // ⌶ + case 8603: return "\u2AF1"; // ⫱ + case 8607: return "\uD835\uDD4B"; // 𝕋 + case 8609: return "\uD835\uDD65"; // 𝕥 + case 8613: return "\u2ADA"; // ⫚ + case 8616: return "\u2929"; // ⤩ + case 8622: return "\u2034"; // ‴ + case 8627: return "\u2122"; // ™ + case 8632: return "\u2122"; // ™ + case 8639: return "\u25B5"; // ▵ + case 8644: return "\u25BF"; // ▿ + case 8649: return "\u25C3"; // ◃ + case 8652: return "\u22B4"; // ⊴ + case 8654: return "\u225C"; // ≜ + case 8660: return "\u25B9"; // ▹ + case 8663: return "\u22B5"; // ⊵ + case 8667: return "\u25EC"; // ◬ + case 8669: return "\u225C"; // ≜ + case 8675: return "\u2A3A"; // ⨺ + case 8684: return "\u20DB"; // ⃛ + case 8689: return "\u2A39"; // ⨹ + case 8692: return "\u29CD"; // ⧍ + case 8697: return "\u2A3B"; // ⨻ + case 8704: return "\u23E2"; // ⏢ + case 8708: return "\uD835\uDCAF"; // 𝒯 + case 8712: return "\uD835\uDCC9"; // 𝓉 + case 8716: return "\u0426"; // Ц + case 8718: return "\u0446"; // ц + case 8722: return "\u040B"; // Ћ + case 8726: return "\u045B"; // ћ + case 8731: return "\u0166"; // Ŧ + case 8736: return "\u0167"; // ŧ + case 8741: return "\u226C"; // ≬ + case 8756: return "\u219E"; // ↞ + case 8767: return "\u21A0"; // ↠ + case 8773: return "\u00DA"; // Ú + case 8774: return "\u00DA"; // Ú + case 8780: return "\u00FA"; // ú + case 8781: return "\u00FA"; // ú + case 8784: return "\u219F"; // ↟ + case 8788: return "\u21D1"; // ⇑ + case 8791: return "\u2191"; // ↑ + case 8796: return "\u2949"; // ⥉ + case 8801: return "\u040E"; // Ў + case 8806: return "\u045E"; // ў + case 8810: return "\u016C"; // Ŭ + case 8814: return "\u016D"; // ŭ + case 8818: return "\u00DB"; // Û + case 8819: return "\u00DB"; // Û + case 8823: return "\u00FB"; // û + case 8824: return "\u00FB"; // û + case 8826: return "\u0423"; // У + case 8828: return "\u0443"; // у + case 8833: return "\u21C5"; // ⇅ + case 8839: return "\u0170"; // Ű + case 8844: return "\u0171"; // ű + case 8848: return "\u296E"; // ⥮ + case 8854: return "\u297E"; // ⥾ + case 8857: return "\uD835\uDD18"; // 𝔘 + case 8859: return "\uD835\uDD32"; // 𝔲 + case 8864: return "\u00D9"; // Ù + case 8865: return "\u00D9"; // Ù + case 8870: return "\u00F9"; // ù + case 8871: return "\u00F9"; // ù + case 8875: return "\u2963"; // ⥣ + case 8880: return "\u21BF"; // ↿ + case 8882: return "\u21BE"; // ↾ + case 8886: return "\u2580"; // ▀ + case 8892: return "\u231C"; // ⌜ + case 8895: return "\u231C"; // ⌜ + case 8899: return "\u230F"; // ⌏ + case 8903: return "\u25F8"; // ◸ + case 8908: return "\u016A"; // Ū + case 8913: return "\u016B"; // ū + case 8914: return "\u00A8"; // ¨ + case 8915: return "\u00A8"; // ¨ + case 8923: return "\u005F"; // _ + case 8928: return "\u23DF"; // ⏟ + case 8932: return "\u23B5"; // ⎵ + case 8944: return "\u23DD"; // ⏝ + case 8948: return "\u22C3"; // ⋃ + case 8953: return "\u228E"; // ⊎ + case 8958: return "\u0172"; // Ų + case 8963: return "\u0173"; // ų + case 8966: return "\uD835\uDD4C"; // 𝕌 + case 8969: return "\uD835\uDD66"; // 𝕦 + case 8976: return "\u2191"; // ↑ + case 8982: return "\u21D1"; // ⇑ + case 8989: return "\u2191"; // ↑ + case 8993: return "\u2912"; // ⤒ + case 9003: return "\u21C5"; // ⇅ + case 9013: return "\u2195"; // ↕ + case 9023: return "\u21D5"; // ⇕ + case 9033: return "\u2195"; // ↕ + case 9045: return "\u296E"; // ⥮ + case 9057: return "\u21BF"; // ↿ + case 9063: return "\u21BE"; // ↾ + case 9067: return "\u228E"; // ⊎ + case 9080: return "\u2196"; // ↖ + case 9091: return "\u2197"; // ↗ + case 9094: return "\u03D2"; // ϒ + case 9097: return "\u03C5"; // υ + case 9099: return "\u03D2"; // ϒ + case 9103: return "\u03A5"; // Υ + case 9107: return "\u03C5"; // υ + case 9111: return "\u22A5"; // ⊥ + case 9117: return "\u21A5"; // ↥ + case 9126: return "\u21C8"; // ⇈ + case 9132: return "\u231D"; // ⌝ + case 9135: return "\u231D"; // ⌝ + case 9139: return "\u230E"; // ⌎ + case 9144: return "\u016E"; // Ů + case 9148: return "\u016F"; // ů + case 9152: return "\u25F9"; // ◹ + case 9156: return "\uD835\uDCB0"; // 𝒰 + case 9160: return "\uD835\uDCCA"; // 𝓊 + case 9165: return "\u22F0"; // ⋰ + case 9171: return "\u0168"; // Ũ + case 9176: return "\u0169"; // ũ + case 9179: return "\u25B5"; // ▵ + case 9181: return "\u25B4"; // ▴ + case 9186: return "\u21C8"; // ⇈ + case 9189: return "\u00DC"; // Ü + case 9190: return "\u00DC"; // Ü + case 9192: return "\u00FC"; // ü + case 9193: return "\u00FC"; // ü + case 9200: return "\u29A7"; // ⦧ + case 9207: return "\u299C"; // ⦜ + case 9216: return "\u03F5"; // ϵ + case 9222: return "\u03F0"; // ϰ + case 9230: return "\u2205"; // ∅ + case 9234: return "\u03D5"; // ϕ + case 9236: return "\u03D6"; // ϖ + case 9242: return "\u221D"; // ∝ + case 9246: return "\u21D5"; // ⇕ + case 9248: return "\u2195"; // ↕ + case 9251: return "\u03F1"; // ϱ + case 9257: return "\u03C2"; // ς + case 9266: return "\u228A\uFE00"; // ⊊︀ + case 9268: return "\u2ACB\uFE00"; // ⫋︀ + case 9276: return "\u228B\uFE00"; // ⊋︀ + case 9278: return "\u2ACC\uFE00"; // ⫌︀ + case 9284: return "\u03D1"; // ϑ + case 9296: return "\u22B2"; // ⊲ + case 9302: return "\u22B3"; // ⊳ + case 9307: return "\u2AEB"; // ⫫ + case 9311: return "\u2AE8"; // ⫨ + case 9313: return "\u2AE9"; // ⫩ + case 9316: return "\u0412"; // В + case 9319: return "\u0432"; // в + case 9324: return "\u22AB"; // ⊫ + case 9329: return "\u22A9"; // ⊩ + case 9334: return "\u22A8"; // ⊨ + case 9339: return "\u22A2"; // ⊢ + case 9341: return "\u2AE6"; // ⫦ + case 9344: return "\u22C1"; // ⋁ + case 9347: return "\u2228"; // ∨ + case 9351: return "\u22BB"; // ⊻ + case 9354: return "\u225A"; // ≚ + case 9359: return "\u22EE"; // ⋮ + case 9364: return "\u2016"; // ‖ + case 9369: return "\u007C"; // | + case 9371: return "\u2016"; // ‖ + case 9373: return "\u007C"; // | + case 9381: return "\u2223"; // ∣ + case 9386: return "\u007C"; // | + case 9396: return "\u2758"; // ❘ + case 9402: return "\u2240"; // ≀ + case 9413: return "\u200A"; //   + case 9416: return "\uD835\uDD19"; // 𝔙 + case 9419: return "\uD835\uDD33"; // 𝔳 + case 9424: return "\u22B2"; // ⊲ + case 9429: return "\u2282\u20D2"; // ⊂⃒ + case 9431: return "\u2283\u20D2"; // ⊃⃒ + case 9435: return "\uD835\uDD4D"; // 𝕍 + case 9439: return "\uD835\uDD67"; // 𝕧 + case 9444: return "\u221D"; // ∝ + case 9449: return "\u22B3"; // ⊳ + case 9453: return "\uD835\uDCB1"; // 𝒱 + case 9457: return "\uD835\uDCCB"; // 𝓋 + case 9462: return "\u2ACB\uFE00"; // ⫋︀ + case 9464: return "\u228A\uFE00"; // ⊊︀ + case 9468: return "\u2ACC\uFE00"; // ⫌︀ + case 9470: return "\u228B\uFE00"; // ⊋︀ + case 9476: return "\u22AA"; // ⊪ + case 9483: return "\u299A"; // ⦚ + case 9489: return "\u0174"; // Ŵ + case 9495: return "\u0175"; // ŵ + case 9501: return "\u2A5F"; // ⩟ + case 9506: return "\u22C0"; // ⋀ + case 9509: return "\u2227"; // ∧ + case 9511: return "\u2259"; // ≙ + case 9516: return "\u2118"; // ℘ + case 9519: return "\uD835\uDD1A"; // 𝔚 + case 9522: return "\uD835\uDD34"; // 𝔴 + case 9526: return "\uD835\uDD4E"; // 𝕎 + case 9530: return "\uD835\uDD68"; // 𝕨 + case 9532: return "\u2118"; // ℘ + case 9534: return "\u2240"; // ≀ + case 9539: return "\u2240"; // ≀ + case 9543: return "\uD835\uDCB2"; // 𝒲 + case 9547: return "\uD835\uDCCC"; // 𝓌 + case 9552: return "\u22C2"; // ⋂ + case 9556: return "\u25EF"; // ◯ + case 9559: return "\u22C3"; // ⋃ + case 9564: return "\u25BD"; // ▽ + case 9568: return "\uD835\uDD1B"; // 𝔛 + case 9571: return "\uD835\uDD35"; // 𝔵 + case 9576: return "\u27FA"; // ⟺ + case 9580: return "\u27F7"; // ⟷ + case 9582: return "\u039E"; // Ξ + case 9584: return "\u03BE"; // ξ + case 9589: return "\u27F8"; // ⟸ + case 9593: return "\u27F5"; // ⟵ + case 9597: return "\u27FC"; // ⟼ + case 9601: return "\u22FB"; // ⋻ + case 9606: return "\u2A00"; // ⨀ + case 9610: return "\uD835\uDD4F"; // 𝕏 + case 9613: return "\uD835\uDD69"; // 𝕩 + case 9617: return "\u2A01"; // ⨁ + case 9622: return "\u2A02"; // ⨂ + case 9627: return "\u27F9"; // ⟹ + case 9631: return "\u27F6"; // ⟶ + case 9635: return "\uD835\uDCB3"; // 𝒳 + case 9639: return "\uD835\uDCCD"; // 𝓍 + case 9644: return "\u2A06"; // ⨆ + case 9650: return "\u2A04"; // ⨄ + case 9654: return "\u25B3"; // △ + case 9658: return "\u22C1"; // ⋁ + case 9664: return "\u22C0"; // ⋀ + case 9670: return "\u00DD"; // Ý + case 9671: return "\u00DD"; // Ý + case 9677: return "\u00FD"; // ý + case 9678: return "\u00FD"; // ý + case 9682: return "\u042F"; // Я + case 9684: return "\u044F"; // я + case 9689: return "\u0176"; // Ŷ + case 9694: return "\u0177"; // ŷ + case 9696: return "\u042B"; // Ы + case 9698: return "\u044B"; // ы + case 9700: return "\u00A5"; // ¥ + case 9701: return "\u00A5"; // ¥ + case 9704: return "\uD835\uDD1C"; // 𝔜 + case 9707: return "\uD835\uDD36"; // 𝔶 + case 9711: return "\u0407"; // Ї + case 9715: return "\u0457"; // ї + case 9719: return "\uD835\uDD50"; // 𝕐 + case 9723: return "\uD835\uDD6A"; // 𝕪 + case 9727: return "\uD835\uDCB4"; // 𝒴 + case 9731: return "\uD835\uDCCE"; // 𝓎 + case 9735: return "\u042E"; // Ю + case 9739: return "\u044E"; // ю + case 9743: return "\u0178"; // Ÿ + case 9745: return "\u00FF"; // ÿ + case 9746: return "\u00FF"; // ÿ + case 9753: return "\u0179"; // Ź + case 9760: return "\u017A"; // ź + case 9766: return "\u017D"; // Ž + case 9772: return "\u017E"; // ž + case 9774: return "\u0417"; // З + case 9776: return "\u0437"; // з + case 9780: return "\u017B"; // Ż + case 9784: return "\u017C"; // ż + case 9790: return "\u2128"; // ℨ + case 9804: return "\u200B"; // ​ + case 9807: return "\u0396"; // Ζ + case 9810: return "\u03B6"; // ζ + case 9813: return "\u2128"; // ℨ + case 9816: return "\uD835\uDD37"; // 𝔷 + case 9820: return "\u0416"; // Ж + case 9824: return "\u0436"; // ж + case 9831: return "\u21DD"; // ⇝ + case 9835: return "\u2124"; // ℤ + case 9839: return "\uD835\uDD6B"; // 𝕫 + case 9843: return "\uD835\uDCB5"; // 𝒵 + case 9847: return "\uD835\uDCCF"; // 𝓏 + case 9850: return "\u200D"; // ‍ + case 9853: return "\u200C"; // ‌ default: return null; } } diff --git a/MimeKit/Text/HtmlToken.cs b/MimeKit/Text/HtmlToken.cs index 23e87048e2..947ea3e91c 100644 --- a/MimeKit/Text/HtmlToken.cs +++ b/MimeKit/Text/HtmlToken.cs @@ -38,7 +38,7 @@ namespace MimeKit.Text { public abstract class HtmlToken { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -73,12 +73,12 @@ public HtmlTokenKind Kind { public abstract void WriteTo (TextWriter output); /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// - /// A that represents the current . + /// A that represents the current . public override string ToString () { using (var output = new StringWriter ()) { @@ -98,7 +98,7 @@ public override string ToString () public class HtmlCommentToken : HtmlToken { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -181,7 +181,7 @@ public override void WriteTo (TextWriter output) public class HtmlDataToken : HtmlToken { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -211,7 +211,7 @@ protected HtmlDataToken (HtmlTokenKind kind, string data) : base (kind) } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -277,7 +277,7 @@ public override void WriteTo (TextWriter output) public class HtmlCDataToken : HtmlDataToken { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -321,7 +321,7 @@ public override void WriteTo (TextWriter output) public class HtmlScriptDataToken : HtmlDataToken { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -363,7 +363,7 @@ public override void WriteTo (TextWriter output) public class HtmlTagToken : HtmlToken { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -391,7 +391,7 @@ public HtmlTagToken (string name, IEnumerable attributes, bool is } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . @@ -512,7 +512,7 @@ public class HtmlDocTypeToken : HtmlToken string systemIdentifier; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 9fd012b63f..fcacd200fe 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -36,6 +36,7 @@ namespace MimeKit.Text { /// public class HtmlTokenizer { + // Specification: https://dev.w3.org/html5/spec-LC/tokenization.html const string DocType = "doctype"; const string CData = "[CDATA["; @@ -43,6 +44,7 @@ public class HtmlTokenizer readonly CharBuffer data = new CharBuffer (2048); readonly CharBuffer name = new CharBuffer (32); readonly char[] cdata = new char[3]; + readonly TextReader text; HtmlDocTypeToken doctype; HtmlAttribute attribute; string activeTagName; @@ -52,8 +54,6 @@ public class HtmlTokenizer bool bang; char quote; - TextReader text; - /// /// Initializes a new instance of the class. /// @@ -431,6 +431,9 @@ HtmlToken ReadCharacterReference (HtmlTokenizerState next) while (entity.Push (c)) { Read (); + if (c == ';') + break; + if ((nc = Peek ()) == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; data.Append (entity.GetPushedInput ()); @@ -447,11 +450,6 @@ HtmlToken ReadCharacterReference (HtmlTokenizerState next) data.Append (entity.GetValue ()); entity.Reset (); - if (c == ';') { - // consume the ';' - Read (); - } - return null; } @@ -1673,7 +1671,6 @@ HtmlToken ReadCharacterReferenceInAttributeValue () { char additionalAllowedCharacter = quote == '\0' ? '>' : quote; int nc = Peek (); - bool consume; char c; if (nc == -1) { @@ -1689,13 +1686,11 @@ HtmlToken ReadCharacterReferenceInAttributeValue () case '\t': case '\r': case '\n': case '\f': case ' ': case '<': case '&': // no character is consumed, emit '&' name.Append ('&'); - consume = false; break; default: if (c == additionalAllowedCharacter) { // this is not a character reference, nothing is consumed name.Append ('&'); - consume = false; break; } @@ -1704,6 +1699,9 @@ HtmlToken ReadCharacterReferenceInAttributeValue () while (entity.Push (c)) { Read (); + if (c == ';') + break; + if ((nc = Peek ()) == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; data.Length--; @@ -1727,7 +1725,6 @@ HtmlToken ReadCharacterReferenceInAttributeValue () data.Length--; data.Append (pushed); name.Append (value); - consume = c == ';'; entity.Reset (); break; } @@ -1737,9 +1734,6 @@ HtmlToken ReadCharacterReferenceInAttributeValue () else TokenizerState = HtmlTokenizerState.AttributeValueQuoted; - if (consume) - Read (); - return null; } diff --git a/MimeKit/Text/HtmlUtils.cs b/MimeKit/Text/HtmlUtils.cs index 03cfa5776d..61ed9abecc 100644 --- a/MimeKit/Text/HtmlUtils.cs +++ b/MimeKit/Text/HtmlUtils.cs @@ -110,7 +110,7 @@ static void HtmlAttributeEncode (TextWriter output, ICharArray value, int startI } if (c > 255 && char.IsSurrogate (c)) { - if (index + 1 < endIndex && char.IsSurrogatePair (c, value[index])) { + if (index < endIndex && char.IsSurrogatePair (c, value[index])) { unichar = char.ConvertToUtf32 (c, value[index]); index++; } else { @@ -171,7 +171,7 @@ public static void HtmlAttributeEncode (TextWriter output, char[] value, int sta throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException (nameof (quote)); + throw new ArgumentException ("The quote character must either be '\"' or '\''.", nameof (quote)); HtmlAttributeEncode (output, new CharArray (value), startIndex, count, quote); } @@ -209,7 +209,7 @@ public static string HtmlAttributeEncode (char[] value, int startIndex, int coun throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException (nameof (quote)); + throw new ArgumentException ("The quote character must either be '\"' or '\''.", nameof (quote)); var encoded = new StringBuilder (); @@ -257,7 +257,7 @@ public static void HtmlAttributeEncode (TextWriter output, string value, int sta throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException (nameof (quote)); + throw new ArgumentException ("The quote character must either be '\"' or '\''.", nameof (quote)); HtmlAttributeEncode (output, new CharString (value), startIndex, count, quote); } @@ -288,7 +288,7 @@ public static void HtmlAttributeEncode (TextWriter output, string value, char qu throw new ArgumentNullException (nameof (value)); if (quote != '"' && quote != '\'') - throw new ArgumentException (nameof (quote)); + throw new ArgumentException ("The quote character must either be '\"' or '\''.", nameof (quote)); HtmlAttributeEncode (output, new CharString (value), 0, value.Length, quote); } @@ -326,7 +326,7 @@ public static string HtmlAttributeEncode (string value, int startIndex, int coun throw new ArgumentOutOfRangeException (nameof (count)); if (quote != '"' && quote != '\'') - throw new ArgumentException (nameof (quote)); + throw new ArgumentException ("The quote character must either be '\"' or '\''.", nameof (quote)); var encoded = new StringBuilder (); @@ -357,7 +357,7 @@ public static string HtmlAttributeEncode (string value, char quote = '"') throw new ArgumentNullException (nameof (value)); if (quote != '"' && quote != '\'') - throw new ArgumentException (nameof (quote)); + throw new ArgumentException ("The quote character must either be '\"' or '\''.", nameof (quote)); var encoded = new StringBuilder (); @@ -414,7 +414,7 @@ static void HtmlEncode (TextWriter output, ICharArray data, int startIndex, int } if (c > 255 && char.IsSurrogate (c)) { - if (index + 1 <= endIndex && char.IsSurrogatePair (c, data[index])) { + if (index < endIndex && char.IsSurrogatePair (c, data[index])) { unichar = char.ConvertToUtf32 (c, data[index]); index++; } else { @@ -667,9 +667,6 @@ public static void HtmlDecode (TextWriter output, string data, int startIndex, i output.Write (entity.GetValue ()); entity.Reset (); - - if (index < endIndex && data[index] == ';') - index++; } else { output.Write (data[index++]); } diff --git a/UnitTests/Text/HtmlEntityDecoderTests.cs b/UnitTests/Text/HtmlEntityDecoderTests.cs index 1c3a3ee46c..8e076be14b 100644 --- a/UnitTests/Text/HtmlEntityDecoderTests.cs +++ b/UnitTests/Text/HtmlEntityDecoderTests.cs @@ -78,7 +78,7 @@ public void TestDecodeNamedEntities () if (!json.Read () || json.TokenType != JsonToken.EndObject) break; - for (int i = 0; i < name.Length && name[i] != ';'; i++) + for (int i = 0; i < name.Length; i++) Assert.IsTrue (decoder.Push (name[i]), "Failed to push char #{0} of \"{1}\".", i, name); Assert.AreEqual (value, decoder.GetValue (), "Decoded entity did not match for \"{0}\".", name); @@ -101,44 +101,44 @@ static void TestDecodeNumericEntity (string text, string expected) [Test] public void TestDecodeNumericEntities () { - TestDecodeNumericEntity ("�", "\uFFFD"); // REPLACEMENT CHARACTER - TestDecodeNumericEntity ("€", "\u20AC"); // EURO SIGN (€) - TestDecodeNumericEntity ("‚", "\u201A"); // SINGLE LOW-9 QUOTATION MARK (‚) - TestDecodeNumericEntity ("ƒ", "\u0192"); // LATIN SMALL LETTER F WITH HOOK (ƒ) - TestDecodeNumericEntity ("„", "\u201E"); // DOUBLE LOW-9 QUOTATION MARK („) - TestDecodeNumericEntity ("…", "\u2026"); // HORIZONTAL ELLIPSIS (…) - TestDecodeNumericEntity ("†", "\u2020"); // DAGGER (†) - TestDecodeNumericEntity ("‡", "\u2021"); // DOUBLE DAGGER (‡) - TestDecodeNumericEntity ("ˆ", "\u02C6"); // MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ) - TestDecodeNumericEntity ("‰", "\u2030"); // PER MILLE SIGN (‰) - TestDecodeNumericEntity ("Š", "\u0160"); // LATIN CAPITAL LETTER S WITH CARON (Š) - TestDecodeNumericEntity ("‹", "\u2039"); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹) - TestDecodeNumericEntity ("Œ", "\u0152"); // LATIN CAPITAL LIGATURE OE (Œ) - TestDecodeNumericEntity ("Ž", "\u017D"); // LATIN CAPITAL LETTER Z WITH CARON (Ž) - TestDecodeNumericEntity ("‘", "\u2018"); // LEFT SINGLE QUOTATION MARK (‘) - TestDecodeNumericEntity ("’", "\u2019"); // RIGHT SINGLE QUOTATION MARK (’) - TestDecodeNumericEntity ("“", "\u201C"); // LEFT DOUBLE QUOTATION MARK (“) - TestDecodeNumericEntity ("”", "\u201D"); // RIGHT DOUBLE QUOTATION MARK (”) - TestDecodeNumericEntity ("•", "\u2022"); // BULLET (•) - TestDecodeNumericEntity ("–", "\u2013"); // EN DASH (–) - TestDecodeNumericEntity ("—", "\u2014"); // EM DASH (—) - TestDecodeNumericEntity ("˜", "\u02DC"); // SMALL TILDE (˜) - TestDecodeNumericEntity ("™", "\u2122"); // TRADE MARK SIGN (™) - TestDecodeNumericEntity ("š", "\u0161"); // LATIN SMALL LETTER S WITH CARON (š) - TestDecodeNumericEntity ("›", "\u203A"); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›) - TestDecodeNumericEntity ("œ", "\u0153"); // LATIN SMALL LIGATURE OE (œ) - TestDecodeNumericEntity ("ž", "\u017E"); // LATIN SMALL LETTER Z WITH CARON (ž) - TestDecodeNumericEntity ("Ÿ", "\u0178"); // LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ) + TestDecodeNumericEntity ("�", "\uFFFD"); // REPLACEMENT CHARACTER + TestDecodeNumericEntity ("€", "\u20AC"); // EURO SIGN (€) + TestDecodeNumericEntity ("‚", "\u201A"); // SINGLE LOW-9 QUOTATION MARK (‚) + TestDecodeNumericEntity ("ƒ", "\u0192"); // LATIN SMALL LETTER F WITH HOOK (ƒ) + TestDecodeNumericEntity ("„", "\u201E"); // DOUBLE LOW-9 QUOTATION MARK („) + TestDecodeNumericEntity ("…", "\u2026"); // HORIZONTAL ELLIPSIS (…) + TestDecodeNumericEntity ("†", "\u2020"); // DAGGER (†) + TestDecodeNumericEntity ("‡", "\u2021"); // DOUBLE DAGGER (‡) + TestDecodeNumericEntity ("ˆ", "\u02C6"); // MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ) + TestDecodeNumericEntity ("‰", "\u2030"); // PER MILLE SIGN (‰) + TestDecodeNumericEntity ("Š", "\u0160"); // LATIN CAPITAL LETTER S WITH CARON (Š) + TestDecodeNumericEntity ("‹", "\u2039"); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹) + TestDecodeNumericEntity ("Œ", "\u0152"); // LATIN CAPITAL LIGATURE OE (Œ) + TestDecodeNumericEntity ("Ž", "\u017D"); // LATIN CAPITAL LETTER Z WITH CARON (Ž) + TestDecodeNumericEntity ("‘", "\u2018"); // LEFT SINGLE QUOTATION MARK (‘) + TestDecodeNumericEntity ("’", "\u2019"); // RIGHT SINGLE QUOTATION MARK (’) + TestDecodeNumericEntity ("“", "\u201C"); // LEFT DOUBLE QUOTATION MARK (“) + TestDecodeNumericEntity ("”", "\u201D"); // RIGHT DOUBLE QUOTATION MARK (”) + TestDecodeNumericEntity ("•", "\u2022"); // BULLET (•) + TestDecodeNumericEntity ("–", "\u2013"); // EN DASH (–) + TestDecodeNumericEntity ("—", "\u2014"); // EM DASH (—) + TestDecodeNumericEntity ("˜", "\u02DC"); // SMALL TILDE (˜) + TestDecodeNumericEntity ("™", "\u2122"); // TRADE MARK SIGN (™) + TestDecodeNumericEntity ("š", "\u0161"); // LATIN SMALL LETTER S WITH CARON (š) + TestDecodeNumericEntity ("›", "\u203A"); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›) + TestDecodeNumericEntity ("œ", "\u0153"); // LATIN SMALL LIGATURE OE (œ) + TestDecodeNumericEntity ("ž", "\u017E"); // LATIN SMALL LETTER Z WITH CARON (ž) + TestDecodeNumericEntity ("Ÿ", "\u0178"); // LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ) // parse error - TestDecodeNumericEntity ("􏿿", "􏿿"); + TestDecodeNumericEntity ("􏿿", "􏿿"); - TestDecodeNumericEntity ("�", "\uFFFD"); + TestDecodeNumericEntity ("�", "\uFFFD"); - TestDecodeNumericEntity ("", ""); + TestDecodeNumericEntity ("", ""); - TestDecodeNumericEntity (" ", " "); - TestDecodeNumericEntity ("z", "z"); + TestDecodeNumericEntity (" ", " "); + TestDecodeNumericEntity ("z", "z"); } } } diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index a8938e8d11..728419ebaf 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -54,7 +54,7 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll ..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net45\System.Data.SQLite.dll diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 44be7b9ecf..ce6d388c6c 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -1,7 +1,7 @@  - + \ No newline at end of file From 6f63c15d1b02352e6531119ddd7176cfd492ea28 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 1 Mar 2020 13:17:56 -0500 Subject: [PATCH 479/741] Fixed TnefPropertyReader to properly skip remaining values/properties When advancing to the next row or property, make sure to properly skip over the remaining properties or values. Partial fix for issue #538 --- MimeKit/Tnef/TnefPart.cs | 6 ------ MimeKit/Tnef/TnefPropertyReader.cs | 16 ++++++++-------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index c33074d4a3..2f9d7a3534 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -106,12 +106,6 @@ static void ExtractRecipientTable (TnefReader reader, MimeMessage message) // (since the SmtpAddress is meant to be used in the RCPT TO command). addr = prop.ReadValueAsString (); break; - case TnefPropertyId.Rowid: - prop.ReadValueAsInt32 (); - break; - default: - prop.ReadValue (); - break; } } diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index 859a572473..7d93912163 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -576,13 +576,13 @@ void LoadPropertyName () /// public bool ReadNextProperty () { - if (propertyIndex >= propertyCount) - return false; - while (ReadNextValue ()) { - // skip over the value... + // skip over the remaining value(s) for the current property... } + if (propertyIndex >= propertyCount) + return false; + try { var type = (TnefPropertyType) ReadInt16 (); var id = (TnefPropertyId) ReadInt16 (); @@ -624,13 +624,13 @@ public bool ReadNextProperty () /// public bool ReadNextRow () { - if (rowIndex >= rowCount) - return false; - while (ReadNextProperty ()) { - // skip over the property... + // skip over the remaining property/properties in the current row... } + if (rowIndex >= rowCount) + return false; + try { LoadPropertyCount (); rowIndex++; From a53770e609726237934c58bd8f6faf94e6decaf6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 1 Mar 2020 13:19:35 -0500 Subject: [PATCH 480/741] Added a mapping for the PR_RECIPIENT_DISPLAY_NAME TNEF property --- MimeKit/Tnef/TnefPart.cs | 4 ++++ MimeKit/Tnef/TnefPropertyId.cs | 5 +++++ MimeKit/Tnef/TnefPropertyTag.cs | 16 ++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 2f9d7a3534..039a5c87ec 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -94,6 +94,10 @@ static void ExtractRecipientTable (TnefReader reader, MimeMessage message) if (string.IsNullOrEmpty (name)) name = prop.ReadValueAsString (); break; + case TnefPropertyId.RecipientDisplayName: + if (string.IsNullOrEmpty (name)) + name = prop.ReadValueAsString (); + break; case TnefPropertyId.DisplayName: name = prop.ReadValueAsString (); break; diff --git a/MimeKit/Tnef/TnefPropertyId.cs b/MimeKit/Tnef/TnefPropertyId.cs index e94be3c9b7..200cd60dac 100644 --- a/MimeKit/Tnef/TnefPropertyId.cs +++ b/MimeKit/Tnef/TnefPropertyId.cs @@ -1952,6 +1952,11 @@ public enum TnefPropertyId : short { ///
RecipientCertificate = 0x0C13, + /// + /// The MAPI property PR_RECIPIENT_DISPLAY_NAME. + /// + RecipientDisplayName = 0x5FF6, + /// /// The MAPI property PR_RECIPIENT_NUMBER_FOR_ADVICE. /// diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index 35bc383caf..560bf36387 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -4308,6 +4308,22 @@ public struct TnefPropertyTag /// public static readonly TnefPropertyTag RecipientCertificate = new TnefPropertyTag (TnefPropertyId.RecipientCertificate, TnefPropertyType.Binary); + /// + /// The MAPI property PR_RECIPIENT_DISPLAY_NAME. + /// + /// + /// The MAPI property PR_RECIPIENT_DISPLAY_NAME. + /// + public static readonly TnefPropertyTag RecipientDisplayNameA = new TnefPropertyTag (TnefPropertyId.RecipientDisplayName, TnefPropertyType.String8); + + /// + /// The MAPI property PR_RECIPIENT_DISPLAY_NAME. + /// + /// + /// The MAPI property PR_RECIPIENT_DISPLAY_NAME. + /// + public static readonly TnefPropertyTag RecipientDisplayNameW = new TnefPropertyTag (TnefPropertyId.RecipientDisplayName, TnefPropertyType.Unicode); + /// /// The MAPI property PR_RECIPIENT_NUMBER_FOR_ADVICE. /// From 8c0d7439ded2974c2ae3b9af4cb14b8c8270cf1b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 3 Mar 2020 11:54:35 -0500 Subject: [PATCH 481/741] Added TnefPropertyId.LastModifierName Partial fix for issue #538 --- MimeKit/Tnef/TnefPropertyId.cs | 5 +++++ MimeKit/Tnef/TnefPropertyTag.cs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/MimeKit/Tnef/TnefPropertyId.cs b/MimeKit/Tnef/TnefPropertyId.cs index 200cd60dac..aa201283cf 100644 --- a/MimeKit/Tnef/TnefPropertyId.cs +++ b/MimeKit/Tnef/TnefPropertyId.cs @@ -1117,6 +1117,11 @@ public enum TnefPropertyId : short { ///
LastModificationTime = 0x3008, + /// + /// The MAPI property PR_LAST_MODIFIER_NAME. + /// + LastModifierName = 0x3FFA, + /// /// The MAPI property PR_LATEST_DELIVERY_TIME. /// diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index 560bf36387..6272ec0856 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -2483,6 +2483,22 @@ public struct TnefPropertyTag /// public static readonly TnefPropertyTag LastModificationTime = new TnefPropertyTag (TnefPropertyId.LastModificationTime, TnefPropertyType.SysTime); + /// + /// The MAPI property PR_LAST_MODIFIER_NAME. + /// + /// + /// The MAPI property PR_LAST_MODIFIER_NAME. + /// + public static readonly TnefPropertyTag LastModifierNameA = new TnefPropertyTag (TnefPropertyId.LastModifierName, TnefPropertyType.String8); + + /// + /// The MAPI property PR_LAST_MODIFIER_NAME. + /// + /// + /// The MAPI property PR_LAST_MODIFIER_NAME. + /// + public static readonly TnefPropertyTag LastModifierNameW = new TnefPropertyTag (TnefPropertyId.LastModifierName, TnefPropertyType.Unicode); + /// /// The MAPI property PR_LATEST_DELIVERY_TIME. /// From e8124742aeac6a6fecdcba44c263d2b055d18ae2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 3 Mar 2020 11:55:42 -0500 Subject: [PATCH 482/741] Prefer PidTagRecipientDisplayName > TransmitableDisplayName > DisplayName Another partial fix for issue #538 --- MimeKit/Tnef/TnefPart.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 039a5c87ec..33c2db73c4 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -77,8 +77,11 @@ static void ExtractRecipientTable (TnefReader reader, MimeMessage message) // Note: The RecipientTable uses rows of properties... while (prop.ReadNextRow ()) { + string transmitableDisplayName = null; + string recipientDisplayName = null; + string displayName = string.Empty; InternetAddressList list = null; - string name = null, addr = null; + string addr = null; while (prop.ReadNextProperty ()) { switch (prop.PropertyTag.Id) { @@ -91,15 +94,13 @@ static void ExtractRecipientTable (TnefReader reader, MimeMessage message) } break; case TnefPropertyId.TransmitableDisplayName: - if (string.IsNullOrEmpty (name)) - name = prop.ReadValueAsString (); + transmitableDisplayName = prop.ReadValueAsString (); break; case TnefPropertyId.RecipientDisplayName: - if (string.IsNullOrEmpty (name)) - name = prop.ReadValueAsString (); + recipientDisplayName = prop.ReadValueAsString (); break; case TnefPropertyId.DisplayName: - name = prop.ReadValueAsString (); + displayName = prop.ReadValueAsString (); break; case TnefPropertyId.EmailAddress: if (string.IsNullOrEmpty (addr)) @@ -113,8 +114,11 @@ static void ExtractRecipientTable (TnefReader reader, MimeMessage message) } } - if (list != null && !string.IsNullOrEmpty (addr)) + if (list != null && !string.IsNullOrEmpty (addr)) { + var name = recipientDisplayName ?? transmitableDisplayName ?? displayName; + list.Add (new MailboxAddress (name, addr)); + } } } From 087e1daad3642c6306bbc9c6ebe126f4713f4684 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 4 Mar 2020 21:34:55 -0500 Subject: [PATCH 483/741] Added more TNEF property tags Partial fix for issue #538 --- MimeKit/Tnef/TnefPropertyId.cs | 30 ++++++++++++++++++++++++++++++ MimeKit/Tnef/TnefPropertyTag.cs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/MimeKit/Tnef/TnefPropertyId.cs b/MimeKit/Tnef/TnefPropertyId.cs index aa201283cf..f5c93c6182 100644 --- a/MimeKit/Tnef/TnefPropertyId.cs +++ b/MimeKit/Tnef/TnefPropertyId.cs @@ -177,6 +177,26 @@ public enum TnefPropertyId : short { ///
AttachLongPathname = 0x370D, + /// + /// The MAPI property PR_ATTACHMENT_CONTACTPHOTO. + /// + AttachmentContactPhoto = 0x7FFF, + + /// + /// The MAPI property PR_ATTACHMENT_FLAGS. + /// + AttachmentFlags = 0x7FFD, + + /// + /// The MAPI property PR_ATTACHMENT_HIDDEN. + /// + AttachmentHidden = 0x7FFE, + + /// + /// The MAPI property PR_ATTACHMENT_LINKID. + /// + AttachmentLinkId = 0x7FFA, + /// /// The MAPI property PR_ATTACHMENT_X400_PARAMETERS. /// @@ -727,6 +747,16 @@ public enum TnefPropertyId : short { ///
EntryId = 0x0FFF, + /// + /// The MAPI property PR_EXCEPTION_STARTTIME. + /// + ExceptionStartTime = 0x7FFB, + + /// + /// The MAPI property PR_EXCEPTION_ENDTIME. + /// + ExceptionEndTime = 0x7FFC, + /// /// The MAPI property PR_EXPAND_BEGIN_TIME. /// diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index 6272ec0856..ad3e7c92af 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -379,6 +379,38 @@ public struct TnefPropertyTag /// public static readonly TnefPropertyTag AttachLongPathnameW = new TnefPropertyTag (TnefPropertyId.AttachLongPathname, TnefPropertyType.Unicode); + /// + /// The MAPI property PR_ATTACHMENT_CONTACTPHOTO. + /// + /// + /// The MAPI property PR_ATTACHMENT_CONTACTPHOTO. + /// + public static readonly TnefPropertyTag AttachmentContactPhoto = new TnefPropertyTag (TnefPropertyId.AttachmentContactPhoto, TnefPropertyType.Boolean); + + /// + /// The MAPI property PR_ATTACHMENT_FLAGS. + /// + /// + /// The MAPI property PR_ATTACHMENT_FLAGS. + /// + public static readonly TnefPropertyTag AttachmentFlags = new TnefPropertyTag (TnefPropertyId.AttachmentFlags, TnefPropertyType.Long); + + /// + /// The MAPI property PR_ATTACHMENT_HIDDEN. + /// + /// + /// The MAPI property PR_ATTACHMENT_HIDDEN. + /// + public static readonly TnefPropertyTag AttachmentHidden = new TnefPropertyTag (TnefPropertyId.AttachmentHidden, TnefPropertyType.Boolean); + + /// + /// The MAPI property PR_ATTACHMENT_LINKID. + /// + /// + /// The MAPI property PR_ATTACHMENT_LINKID. + /// + public static readonly TnefPropertyTag AttachmentLinkId = new TnefPropertyTag (TnefPropertyId.AttachmentLinkId, TnefPropertyType.Long); + /// /// The MAPI property PR_ATTACHMENT_X400_PARAMETERS. /// From 34a4d29e67e204c1bc6bf792c051b4162865f998 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 4 Mar 2020 21:43:55 -0500 Subject: [PATCH 484/741] Fixed TnefPart's ExtractAttachments() logic for embedded messages Sometimes AttachData can become before AttachMethod, so properly handle this case as well. Another partial fix for issue #538 --- MimeKit/Tnef/TnefPart.cs | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 33c2db73c4..35ac09807f 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -369,6 +369,22 @@ static void ExtractMapiProperties (TnefReader reader, MimeMessage message, BodyB message.To.Add (mailbox); } + static TnefPart PromoteToTnefPart (MimePart part) + { + var tnef = new TnefPart (); + + foreach (var param in part.ContentType.Parameters) + tnef.ContentType.Parameters[param.Name] = param.Value; + + if (part.ContentDisposition != null) + tnef.ContentDisposition = part.ContentDisposition; + + tnef.ContentTransferEncoding = part.ContentTransferEncoding; + tnef.Content = part.Content; + + return tnef; + } + static void ExtractAttachments (TnefReader reader, BodyBuilder builder) { var attachMethod = TnefAttachMethod.ByValue; @@ -424,17 +440,8 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment.ContentDisposition = disposition; break; case TnefPropertyId.AttachData: - if (attachMethod == TnefAttachMethod.EmbeddedMessage) { - var tnef = new TnefPart (); - - foreach (var param in attachment.ContentType.Parameters) - tnef.ContentType.Parameters[param.Name] = param.Value; - - if (attachment.ContentDisposition != null) - tnef.ContentDisposition = attachment.ContentDisposition; - - attachment = tnef; - } + if (attachMethod == TnefAttachMethod.EmbeddedMessage) + attachment = PromoteToTnefPart (attachment); attachData = prop.ReadValueAsBytes (); filter.Flush (attachData, 0, attachData.Length, out outIndex, out outLength); @@ -446,6 +453,12 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) break; case TnefPropertyId.AttachMethod: attachMethod = (TnefAttachMethod) prop.ReadValueAsInt32 (); + + if (attachMethod == TnefAttachMethod.EmbeddedMessage) { + builder.Attachments.Remove (attachment); + attachment = PromoteToTnefPart (attachment); + builder.Attachments.Add (attachment); + } break; case TnefPropertyId.AttachMimeTag: mimeType = prop.ReadValueAsString ().Split ('/'); From c739051d24aa3ead50b0a62616eb186b75dc78d8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 6 Mar 2020 09:37:20 -0500 Subject: [PATCH 485/741] Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID Final fix for issue #538 --- MimeKit/Tnef/TnefPart.cs | 37 ++++++++++-------- .../tnef/christmas/Untitled Attachment.1 | Bin 6524 -> 89 bytes .../tnef/christmas/Untitled Attachment.2 | Bin 6524 -> 6508 bytes .../tnef/christmas/Untitled Attachment.3 | Bin 385317 -> 89 bytes .../tnef/christmas/Untitled Attachment.4 | Bin 385317 -> 385301 bytes UnitTests/Tnef/TnefTests.cs | 4 +- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 35ac09807f..b78ea2f157 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -380,7 +380,6 @@ static TnefPart PromoteToTnefPart (MimePart part) tnef.ContentDisposition = part.ContentDisposition; tnef.ContentTransferEncoding = part.ContentTransferEncoding; - tnef.Content = part.Content; return tnef; } @@ -410,6 +409,8 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) if (attachment == null) break; + attachData = null; + while (prop.ReadNextProperty ()) { switch (prop.PropertyTag.Id) { case TnefPropertyId.AttachLongFilename: @@ -440,25 +441,10 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment.ContentDisposition = disposition; break; case TnefPropertyId.AttachData: - if (attachMethod == TnefAttachMethod.EmbeddedMessage) - attachment = PromoteToTnefPart (attachment); - attachData = prop.ReadValueAsBytes (); - filter.Flush (attachData, 0, attachData.Length, out outIndex, out outLength); - attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); - attachment.Content = new MimeContent (new MemoryStream (attachData, false)); - filter.Reset (); - - builder.Attachments.Add (attachment); break; case TnefPropertyId.AttachMethod: attachMethod = (TnefAttachMethod) prop.ReadValueAsInt32 (); - - if (attachMethod == TnefAttachMethod.EmbeddedMessage) { - builder.Attachments.Remove (attachment); - attachment = PromoteToTnefPart (attachment); - builder.Attachments.Add (attachment); - } break; case TnefPropertyId.AttachMimeTag: mimeType = prop.ReadValueAsString ().Split ('/'); @@ -487,6 +473,25 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) break; } } + + if (attachData != null) { + int count = attachData.Length; + int index = 0; + + if (attachMethod == TnefAttachMethod.EmbeddedMessage) { + attachment.ContentTransferEncoding = ContentEncoding.Base64; + attachment = PromoteToTnefPart (attachment); + count -= 16; + index = 16; + } else { + filter.Flush (attachData, index, count, out outIndex, out outLength); + attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); + filter.Reset (); + } + + attachment.Content = new MimeContent (new MemoryStream (attachData, index, count, false)); + builder.Attachments.Add (attachment); + } break; case TnefAttributeTag.AttachCreateDate: if (attachment != null) { diff --git a/UnitTests/TestData/tnef/christmas/Untitled Attachment.1 b/UnitTests/TestData/tnef/christmas/Untitled Attachment.1 index d11e50b345383fb354c423ede383d7abac1de7a6..b2775ecb6226880dae0410f720abe6a4c7405a02 100644 GIT binary patch literal 89 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 z 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

E-i-Y5`z_3E35 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

q~w&b5lWy283;Pcn>ZK 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 Date: Tue, 10 Mar 2020 08:47:34 -0400 Subject: [PATCH 486/741] Updated net46, net47, and net48 builds to reference Portable.BouncyCastle Fixes issue #540 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- nuget/MimeKit.nuspec | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index b74847e8ba..66df71371e 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -57,7 +57,7 @@ - + diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 33f7854785..fabf20ac98 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -68,13 +68,13 @@ - + - + - + From 6cf6b8730c6262f975a36da3275dd56ce1537ab7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Mar 2020 10:18:09 -0400 Subject: [PATCH 487/741] bumped version to 2.5.2 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 10 ++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 9 +++++---- nuget/MimeKitLite.nuspec | 9 +++++---- samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj | 4 ++-- samples/DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android/MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/packages.config | 2 +- .../MessageReader/MessageReader/MessageReader.csproj | 4 ++-- samples/MessageReader/MessageReader/packages.config | 2 +- 16 files changed, 40 insertions(+), 28 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 66df71371e..f6f4820138 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.5.1 + 2.5.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index f08b6d5391..f1e280e3ea 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.5.1 + 2.5.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 153bf2e7fb..91c09bf8ab 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.5.1.0")] -[assembly: AssemblyFileVersion ("2.5.1.0")] +[assembly: AssemblyInformationalVersion ("2.5.2.0")] +[assembly: AssemblyFileVersion ("2.5.2.0")] [assembly: AssemblyVersion ("2.5.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index d1ab318ade..cc54f0a3b7 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,15 @@ # Release Notes +### MimeKit 2.5.2 (2020-03-14) + +* Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of + the standard BouncyCastle package, just like the netstandard builds. + (issue [#540](https://github.com/jstedfast/MimeKit/issues/540)) +* Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID. + (issue [#538](https://github.com/jstedfast/MimeKit/issues/538)) +* Added a few more TNEF property tags. +* Fixed the HtmlEntityDecoder to require some named attributes to end with a `;`. + ### MimeKit 2.5.1 (2020-02-15) * Fixed parsing of email addresses containing unicode or other types of 8-bit text. diff --git a/appveyor.yml b/appveyor.yml index a1cda2758e..12d8345340 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.5.1.{build} +version: 2.5.2.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3eed681b3c..70527e59a2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.5.1$(Rev:.r) +name: 2.5.2$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index fabf20ac98..08f84516c2 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.5.1 + 2.5.2 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,9 +26,10 @@

An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed parsing of email addresses containing unicode or other types of 8-bit text. (issue #536) -* Added a MimeTypes.TryGetExtension() method to try and get a file name extension based on a mime-type. (issue #534) -* Updated mime-type mappings. +* Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of the standard BouncyCastle package, just like the netstandard builds. (issue #540) +* Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID. (issue #538) +* Added a few more TNEF property tags. +* Fixed the HtmlEntityDecoder to require some named attributes to end with a `;`. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 5ea6da6a25..489879e296 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.5.1 + 2.5.2 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,9 +26,10 @@ An Open Source library for creating and parsing MIME messages. -* Fixed parsing of email addresses containing unicode or other types of 8-bit text. (issue #536) -* Added a MimeTypes.TryGetExtension() method to try and get a file name extension based on a mime-type. (issue #534) -* Updated mime-type mappings. +* Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of the standard BouncyCastle package, just like the netstandard builds. (issue #540) +* Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID. (issue #538) +* Added a few more TNEF property tags. +* Fixed the HtmlEntityDecoder to require some named attributes to end with a `;`. Xamarin Inc. en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 006191fff6..5de57ce87e 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.1\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.5.2\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index 32d9a1e72d..e378f02a3c 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index c70f289e13..7bee35ea5e 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -56,10 +56,10 @@ - ..\packages\MimeKit.2.5.1\lib\monoandroid\BouncyCastle.dll + ..\packages\MimeKit.2.5.2\lib\monoandroid\BouncyCastle.dll - - ..\packages\MimeKit.2.5.1\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.5.2\lib\monoandroid\MimeKit.dll diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index bf2cc26ae1..9c6155da21 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 4939b2a0a0..f004e14311 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -68,10 +68,10 @@ - ..\packages\MimeKit.2.5.1\lib\xamarinios\BouncyCastle.dll + ..\packages\MimeKit.2.5.2\lib\xamarinios\BouncyCastle.dll - - ..\packages\MimeKit.2.5.1\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.5.2\lib\xamarinios\MimeKit.dll diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index 58e476313b..f08ee90662 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,4 @@  - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index baf789e9ae..b478e7483e 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.1\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.5.2\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index eeee69a309..8f8434f583 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + From eef1acf701573be998e0b87d657c85eae1af013e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Mar 2020 16:32:34 -0400 Subject: [PATCH 488/741] Fixed MimeEntity.set_ContentId to use ParseUtils.TryParseMsgId() instead of MailboxAddress.TryParse() Part of the fix for issue #542 --- MimeKit/MimeEntity.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index dc8a8efb12..5110ad9956 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -290,13 +290,12 @@ public string ContentId { } var buffer = Encoding.UTF8.GetBytes (value); - MailboxAddress mailbox; int index = 0; - if (!MailboxAddress.TryParse (Headers.Options, buffer, ref index, buffer.Length, false, out mailbox)) + if (!ParseUtils.TryParseMsgId (buffer, ref index, buffer.Length, false, false, out string id)) throw new ArgumentException ("Invalid Content-Id format.", nameof (value)); - contentId = mailbox.Address; + contentId = id; SetHeader ("Content-Id", "<" + contentId + ">"); } From d2a1e6338171538ffd4bc8643209fd2e641eccef Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 25 Mar 2020 09:37:56 -0400 Subject: [PATCH 489/741] Synced up with HtmlKit to get HtmlTokenizer.IgnoreTruncatedTags Also grabbed the HtmlEntityDecoder optimizations. --- MimeKit/Text/HtmlEntityDecoder.g.cs | 24785 +++++++++++++------------- MimeKit/Text/HtmlTagId.cs | 4 +- MimeKit/Text/HtmlTokenizer.cs | 74 +- 3 files changed, 12432 insertions(+), 12431 deletions(-) diff --git a/MimeKit/Text/HtmlEntityDecoder.g.cs b/MimeKit/Text/HtmlEntityDecoder.g.cs index 98ddcb9db2..2bd731a589 100644 --- a/MimeKit/Text/HtmlEntityDecoder.g.cs +++ b/MimeKit/Text/HtmlEntityDecoder.g.cs @@ -1,4 +1,4 @@ -// +// // HtmlEntityDecoder.g.cs // // Author: Jeffrey Stedfast @@ -26,12428 +26,12411 @@ // WARNING: This file is auto-generated. DO NOT EDIT! +using System.Collections.Generic; + namespace MimeKit.Text { - public partial class HtmlEntityDecoder { + public partial class HtmlEntityDecoder + { const int MaxEntityLength = 33; + static readonly Dictionary NamedEntities; + + struct Transition + { + public readonly int From; + public readonly int To; + + public Transition (int from, int to) + { + From = from; + To = to; + } + } + + static readonly Transition[] TransitionTable_1; + static readonly Transition[] TransitionTable_2; + static readonly Transition[] TransitionTable_3; + static readonly Transition[] TransitionTable_4; + static readonly Transition[] TransitionTable_5; + static readonly Transition[] TransitionTable_6; + static readonly Transition[] TransitionTable_7; + static readonly Transition[] TransitionTable_8; + static readonly Transition[] TransitionTable_semicolon; + static readonly Transition[] TransitionTable_A; + static readonly Transition[] TransitionTable_B; + static readonly Transition[] TransitionTable_C; + static readonly Transition[] TransitionTable_D; + static readonly Transition[] TransitionTable_E; + static readonly Transition[] TransitionTable_F; + static readonly Transition[] TransitionTable_G; + static readonly Transition[] TransitionTable_H; + static readonly Transition[] TransitionTable_I; + static readonly Transition[] TransitionTable_J; + static readonly Transition[] TransitionTable_K; + static readonly Transition[] TransitionTable_L; + static readonly Transition[] TransitionTable_M; + static readonly Transition[] TransitionTable_N; + static readonly Transition[] TransitionTable_O; + static readonly Transition[] TransitionTable_P; + static readonly Transition[] TransitionTable_Q; + static readonly Transition[] TransitionTable_R; + static readonly Transition[] TransitionTable_S; + static readonly Transition[] TransitionTable_T; + static readonly Transition[] TransitionTable_U; + static readonly Transition[] TransitionTable_V; + static readonly Transition[] TransitionTable_W; + static readonly Transition[] TransitionTable_X; + static readonly Transition[] TransitionTable_Y; + static readonly Transition[] TransitionTable_Z; + static readonly Transition[] TransitionTable_a; + static readonly Transition[] TransitionTable_b; + static readonly Transition[] TransitionTable_c; + static readonly Transition[] TransitionTable_d; + static readonly Transition[] TransitionTable_e; + static readonly Transition[] TransitionTable_f; + static readonly Transition[] TransitionTable_g; + static readonly Transition[] TransitionTable_h; + static readonly Transition[] TransitionTable_i; + static readonly Transition[] TransitionTable_j; + static readonly Transition[] TransitionTable_k; + static readonly Transition[] TransitionTable_l; + static readonly Transition[] TransitionTable_m; + static readonly Transition[] TransitionTable_n; + static readonly Transition[] TransitionTable_o; + static readonly Transition[] TransitionTable_p; + static readonly Transition[] TransitionTable_q; + static readonly Transition[] TransitionTable_r; + static readonly Transition[] TransitionTable_s; + static readonly Transition[] TransitionTable_t; + static readonly Transition[] TransitionTable_u; + static readonly Transition[] TransitionTable_v; + static readonly Transition[] TransitionTable_w; + static readonly Transition[] TransitionTable_x; + static readonly Transition[] TransitionTable_y; + static readonly Transition[] TransitionTable_z; + + static HtmlEntityDecoder () + { + TransitionTable_1 = new Transition[4] { + new Transition (566, 567), // &blk -> &blk1 + new Transition (2280, 2282), // &emsp -> &emsp1 + new Transition (2649, 2650), // &frac -> &frac1 + new Transition (8284, 8286) // &sup -> ¹ + }; + TransitionTable_2 = new Transition[4] { + new Transition (567, 568), // &blk1 -> &blk12 + new Transition (2649, 2663), // &frac -> &frac2 + new Transition (2650, 2651), // &frac1 -> ½ + new Transition (8284, 8288) // &sup -> ² + }; + TransitionTable_3 = new Transition[6] { + new Transition (566, 572), // &blk -> &blk3 + new Transition (2282, 2283), // &emsp1 -> &emsp13 + new Transition (2649, 2668), // &frac -> &frac3 + new Transition (2650, 2653), // &frac1 -> &frac13 + new Transition (2663, 2664), // &frac2 -> &frac23 + new Transition (8284, 8290) // &sup -> ³ + }; + TransitionTable_4 = new Transition[7] { + new Transition (567, 570), // &blk1 -> &blk14 + new Transition (572, 573), // &blk3 -> &blk34 + new Transition (2282, 2285), // &emsp1 -> &emsp14 + new Transition (2649, 2675), // &frac -> &frac4 + new Transition (2650, 2655), // &frac1 -> ¼ + new Transition (2668, 2669), // &frac3 -> ¾ + new Transition (8464, 8465) // &there -> &there4 + }; + TransitionTable_5 = new Transition[5] { + new Transition (2649, 2678), // &frac -> &frac5 + new Transition (2650, 2657), // &frac1 -> &frac15 + new Transition (2663, 2666), // &frac2 -> &frac25 + new Transition (2668, 2671), // &frac3 -> &frac35 + new Transition (2675, 2676) // &frac4 -> &frac45 + }; + TransitionTable_6 = new Transition[2] { + new Transition (2650, 2659), // &frac1 -> &frac16 + new Transition (2678, 2679) // &frac5 -> &frac56 + }; + TransitionTable_7 = new Transition[1] { + new Transition (2649, 2683) // &frac -> &frac7 + }; + TransitionTable_8 = new Transition[4] { + new Transition (2650, 2661), // &frac1 -> &frac18 + new Transition (2668, 2673), // &frac3 -> &frac38 + new Transition (2678, 2681), // &frac5 -> &frac58 + new Transition (2683, 2684) // &frac7 -> &frac78 + }; + TransitionTable_semicolon = new Transition[2125] { + new Transition (6, 7), // Á -> Á + new Transition (13, 14), // á -> á + new Transition (19, 20), // &Abreve -> Ă + new Transition (25, 26), // &abreve -> ă + new Transition (27, 28), // &ac -> ∾ + new Transition (29, 30), // &acd -> ∿ + new Transition (31, 32), // &acE -> ∾̳ + new Transition (36, 37), //  ->  + new Transition (40, 41), // â -> â + new Transition (44, 45), // ´ -> ´ + new Transition (46, 47), // &Acy -> А + new Transition (48, 49), // &acy -> а + new Transition (53, 54), // Æ -> Æ + new Transition (58, 59), // æ -> æ + new Transition (60, 61), // &af -> ⁡ + new Transition (63, 64), // &Afr -> 𝔄 + new Transition (65, 66), // &afr -> 𝔞 + new Transition (71, 72), // À -> À + new Transition (77, 78), // à -> à + new Transition (84, 85), // &alefsym -> ℵ + new Transition (87, 88), // &aleph -> ℵ + new Transition (92, 93), // &Alpha -> Α + new Transition (96, 97), // &alpha -> α + new Transition (101, 102), // &Amacr -> Ā + new Transition (106, 107), // &amacr -> ā + new Transition (109, 110), // &amalg -> ⨿ + new Transition (112, 113), // & -> & + new Transition (114, 115), // & -> & + new Transition (117, 118), // &And -> ⩓ + new Transition (120, 121), // &and -> ∧ + new Transition (124, 125), // &andand -> ⩕ + new Transition (126, 127), // &andd -> ⩜ + new Transition (132, 133), // &andslope -> ⩘ + new Transition (134, 135), // &andv -> ⩚ + new Transition (136, 137), // &ang -> ∠ + new Transition (138, 139), // &ange -> ⦤ + new Transition (141, 142), // &angle -> ∠ + new Transition (145, 146), // &angmsd -> ∡ + new Transition (148, 149), // &angmsdaa -> ⦨ + new Transition (150, 151), // &angmsdab -> ⦩ + new Transition (152, 153), // &angmsdac -> ⦪ + new Transition (154, 155), // &angmsdad -> ⦫ + new Transition (156, 157), // &angmsdae -> ⦬ + new Transition (158, 159), // &angmsdaf -> ⦭ + new Transition (160, 161), // &angmsdag -> ⦮ + new Transition (162, 163), // &angmsdah -> ⦯ + new Transition (165, 166), // &angrt -> ∟ + new Transition (168, 169), // &angrtvb -> ⊾ + new Transition (170, 171), // &angrtvbd -> ⦝ + new Transition (174, 175), // &angsph -> ∢ + new Transition (176, 177), // &angst -> Å + new Transition (181, 182), // &angzarr -> ⍼ + new Transition (186, 187), // &Aogon -> Ą + new Transition (191, 192), // &aogon -> ą + new Transition (194, 195), // &Aopf -> 𝔸 + new Transition (197, 198), // &aopf -> 𝕒 + new Transition (199, 200), // &ap -> ≈ + new Transition (204, 205), // &apacir -> ⩯ + new Transition (206, 207), // &apE -> ⩰ + new Transition (208, 209), // &ape -> ≊ + new Transition (211, 212), // &apid -> ≋ + new Transition (214, 215), // &apos -> ' + new Transition (227, 228), // &ApplyFunction -> ⁡ + new Transition (232, 233), // &approx -> ≈ + new Transition (235, 236), // &approxeq -> ≊ + new Transition (240, 241), // Å -> Å + new Transition (245, 246), // å -> å + new Transition (249, 250), // &Ascr -> 𝒜 + new Transition (253, 254), // &ascr -> 𝒶 + new Transition (258, 259), // &Assign -> ≔ + new Transition (260, 261), // &ast -> * + new Transition (264, 265), // &asymp -> ≈ + new Transition (267, 268), // &asympeq -> ≍ + new Transition (273, 274), // à -> à + new Transition (279, 280), // ã -> ã + new Transition (283, 284), // Ä -> Ä + new Transition (287, 288), // ä -> ä + new Transition (295, 296), // &awconint -> ∳ + new Transition (299, 300), // &awint -> ⨑ + new Transition (308, 309), // &backcong -> ≌ + new Transition (316, 317), // &backepsilon -> ϶ + new Transition (322, 323), // &backprime -> ‵ + new Transition (326, 327), // &backsim -> ∽ + new Transition (329, 330), // &backsimeq -> ⋍ + new Transition (339, 340), // &Backslash -> ∖ + new Transition (342, 343), // &Barv -> ⫧ + new Transition (347, 348), // &barvee -> ⊽ + new Transition (351, 352), // &Barwed -> ⌆ + new Transition (355, 356), // &barwed -> ⌅ + new Transition (358, 359), // &barwedge -> ⌅ + new Transition (362, 363), // &bbrk -> ⎵ + new Transition (367, 368), // &bbrktbrk -> ⎶ + new Transition (372, 373), // &bcong -> ≌ + new Transition (375, 376), // &Bcy -> Б + new Transition (377, 378), // &bcy -> б + new Transition (382, 383), // &bdquo -> „ + new Transition (388, 389), // &becaus -> ∵ + new Transition (395, 396), // &Because -> ∵ + new Transition (397, 398), // &because -> ∵ + new Transition (403, 404), // &bemptyv -> ⦰ + new Transition (407, 408), // &bepsi -> ϶ + new Transition (412, 413), // &bernou -> ℬ + new Transition (421, 422), // &Bernoullis -> ℬ + new Transition (424, 425), // &Beta -> Β + new Transition (427, 428), // &beta -> β + new Transition (429, 430), // &beth -> ℶ + new Transition (434, 435), // &between -> ≬ + new Transition (437, 438), // &Bfr -> 𝔅 + new Transition (440, 441), // &bfr -> 𝔟 + new Transition (446, 447), // &bigcap -> ⋂ + new Transition (450, 451), // &bigcirc -> ◯ + new Transition (453, 454), // &bigcup -> ⋃ + new Transition (458, 459), // &bigodot -> ⨀ + new Transition (463, 464), // &bigoplus -> ⨁ + new Transition (469, 470), // &bigotimes -> ⨂ + new Transition (475, 476), // &bigsqcup -> ⨆ + new Transition (479, 480), // &bigstar -> ★ + new Transition (492, 493), // &bigtriangledown -> ▽ + new Transition (495, 496), // &bigtriangleup -> △ + new Transition (501, 502), // &biguplus -> ⨄ + new Transition (505, 506), // &bigvee -> ⋁ + new Transition (511, 512), // &bigwedge -> ⋀ + new Transition (517, 518), // &bkarow -> ⤍ + new Transition (529, 530), // &blacklozenge -> ⧫ + new Transition (536, 537), // &blacksquare -> ▪ + new Transition (545, 546), // &blacktriangle -> ▴ + new Transition (550, 551), // &blacktriangledown -> ▾ + new Transition (555, 556), // &blacktriangleleft -> ◂ + new Transition (561, 562), // &blacktriangleright -> ▸ + new Transition (564, 565), // &blank -> ␣ + new Transition (568, 569), // &blk12 -> ▒ + new Transition (570, 571), // &blk14 -> ░ + new Transition (573, 574), // &blk34 -> ▓ + new Transition (577, 578), // &block -> █ + new Transition (580, 581), // &bne -> =⃥ + new Transition (585, 586), // &bnequiv -> ≡⃥ + new Transition (589, 590), // &bNot -> ⫭ + new Transition (592, 593), // &bnot -> ⌐ + new Transition (596, 597), // &Bopf -> 𝔹 + new Transition (600, 601), // &bopf -> 𝕓 + new Transition (602, 603), // &bot -> ⊥ + new Transition (606, 607), // &bottom -> ⊥ + new Transition (611, 612), // &bowtie -> ⋈ + new Transition (616, 617), // &boxbox -> ⧉ + new Transition (619, 620), // &boxDL -> ╗ + new Transition (621, 622), // &boxDl -> ╖ + new Transition (624, 625), // &boxdL -> ╕ + new Transition (626, 627), // &boxdl -> ┐ + new Transition (628, 629), // &boxDR -> ╔ + new Transition (630, 631), // &boxDr -> ╓ + new Transition (632, 633), // &boxdR -> ╒ + new Transition (634, 635), // &boxdr -> ┌ + new Transition (636, 637), // &boxH -> ═ + new Transition (638, 639), // &boxh -> ─ + new Transition (640, 641), // &boxHD -> ╦ + new Transition (642, 643), // &boxHd -> ╤ + new Transition (644, 645), // &boxhD -> ╥ + new Transition (646, 647), // &boxhd -> ┬ + new Transition (648, 649), // &boxHU -> ╩ + new Transition (650, 651), // &boxHu -> ╧ + new Transition (652, 653), // &boxhU -> ╨ + new Transition (654, 655), // &boxhu -> ┴ + new Transition (660, 661), // &boxminus -> ⊟ + new Transition (665, 666), // &boxplus -> ⊞ + new Transition (671, 672), // &boxtimes -> ⊠ + new Transition (674, 675), // &boxUL -> ╝ + new Transition (676, 677), // &boxUl -> ╜ + new Transition (679, 680), // &boxuL -> ╛ + new Transition (681, 682), // &boxul -> ┘ + new Transition (683, 684), // &boxUR -> ╚ + new Transition (685, 686), // &boxUr -> ╙ + new Transition (687, 688), // &boxuR -> ╘ + new Transition (689, 690), // &boxur -> └ + new Transition (691, 692), // &boxV -> ║ + new Transition (693, 694), // &boxv -> │ + new Transition (695, 696), // &boxVH -> ╬ + new Transition (697, 698), // &boxVh -> ╫ + new Transition (699, 700), // &boxvH -> ╪ + new Transition (701, 702), // &boxvh -> ┼ + new Transition (703, 704), // &boxVL -> ╣ + new Transition (705, 706), // &boxVl -> ╢ + new Transition (707, 708), // &boxvL -> ╡ + new Transition (709, 710), // &boxvl -> ┤ + new Transition (711, 712), // &boxVR -> ╠ + new Transition (713, 714), // &boxVr -> ╟ + new Transition (715, 716), // &boxvR -> ╞ + new Transition (717, 718), // &boxvr -> ├ + new Transition (723, 724), // &bprime -> ‵ + new Transition (728, 729), // &Breve -> ˘ + new Transition (733, 734), // &breve -> ˘ + new Transition (738, 739), // ¦ -> ¦ + new Transition (742, 743), // &Bscr -> ℬ + new Transition (746, 747), // &bscr -> 𝒷 + new Transition (750, 751), // &bsemi -> ⁏ + new Transition (753, 754), // &bsim -> ∽ + new Transition (755, 756), // &bsime -> ⋍ + new Transition (758, 759), // &bsol -> \ + new Transition (760, 761), // &bsolb -> ⧅ + new Transition (765, 766), // &bsolhsub -> ⟈ + new Transition (769, 770), // &bull -> • + new Transition (772, 773), // &bullet -> • + new Transition (775, 776), // &bump -> ≎ + new Transition (777, 778), // &bumpE -> ⪮ + new Transition (779, 780), // &bumpe -> ≏ + new Transition (785, 786), // &Bumpeq -> ≎ + new Transition (787, 788), // &bumpeq -> ≏ + new Transition (794, 795), // &Cacute -> Ć + new Transition (801, 802), // &cacute -> ć + new Transition (803, 804), // &Cap -> ⋒ + new Transition (805, 806), // &cap -> ∩ + new Transition (809, 810), // &capand -> ⩄ + new Transition (815, 816), // &capbrcup -> ⩉ + new Transition (819, 820), // &capcap -> ⩋ + new Transition (822, 823), // &capcup -> ⩇ + new Transition (826, 827), // &capdot -> ⩀ + new Transition (844, 845), // &CapitalDifferentialD -> ⅅ + new Transition (846, 847), // &caps -> ∩︀ + new Transition (850, 851), // &caret -> ⁁ + new Transition (853, 854), // &caron -> ˇ + new Transition (859, 860), // &Cayleys -> ℭ + new Transition (864, 865), // &ccaps -> ⩍ + new Transition (870, 871), // &Ccaron -> Č + new Transition (874, 875), // &ccaron -> č + new Transition (879, 880), // Ç -> Ç + new Transition (884, 885), // ç -> ç + new Transition (888, 889), // &Ccirc -> Ĉ + new Transition (892, 893), // &ccirc -> ĉ + new Transition (898, 899), // &Cconint -> ∰ + new Transition (902, 903), // &ccups -> ⩌ + new Transition (905, 906), // &ccupssm -> ⩐ + new Transition (909, 910), // &Cdot -> Ċ + new Transition (913, 914), // &cdot -> ċ + new Transition (918, 919), // ¸ -> ¸ + new Transition (925, 926), // &Cedilla -> ¸ + new Transition (931, 932), // &cemptyv -> ⦲ + new Transition (934, 935), // ¢ -> ¢ + new Transition (942, 943), // &CenterDot -> · + new Transition (948, 949), // ¢erdot -> · + new Transition (951, 952), // &Cfr -> ℭ + new Transition (954, 955), // &cfr -> 𝔠 + new Transition (958, 959), // &CHcy -> Ч + new Transition (962, 963), // &chcy -> ч + new Transition (966, 967), // &check -> ✓ + new Transition (971, 972), // &checkmark -> ✓ + new Transition (974, 975), // &Chi -> Χ + new Transition (976, 977), // &chi -> χ + new Transition (979, 980), // &cir -> ○ + new Transition (981, 982), // &circ -> ˆ + new Transition (984, 985), // &circeq -> ≗ + new Transition (996, 997), // &circlearrowleft -> ↺ + new Transition (1002, 1003), // &circlearrowright -> ↻ + new Transition (1007, 1008), // &circledast -> ⊛ + new Transition (1012, 1013), // &circledcirc -> ⊚ + new Transition (1017, 1018), // &circleddash -> ⊝ + new Transition (1026, 1027), // &CircleDot -> ⊙ + new Transition (1028, 1029), // &circledR -> ® + new Transition (1030, 1031), // &circledS -> Ⓢ + new Transition (1036, 1037), // &CircleMinus -> ⊖ + new Transition (1041, 1042), // &CirclePlus -> ⊕ + new Transition (1047, 1048), // &CircleTimes -> ⊗ + new Transition (1049, 1050), // &cirE -> ⧃ + new Transition (1051, 1052), // &cire -> ≗ + new Transition (1057, 1058), // &cirfnint -> ⨐ + new Transition (1061, 1062), // &cirmid -> ⫯ + new Transition (1066, 1067), // &cirscir -> ⧂ + new Transition (1090, 1091), // &ClockwiseContourIntegral -> ∲ + new Transition (1109, 1110), // &CloseCurlyDoubleQuote -> ” + new Transition (1115, 1116), // &CloseCurlyQuote -> ’ + new Transition (1120, 1121), // &clubs -> ♣ + new Transition (1124, 1125), // &clubsuit -> ♣ + new Transition (1129, 1130), // &Colon -> ∷ + new Transition (1134, 1135), // &colon -> : + new Transition (1136, 1137), // &Colone -> ⩴ + new Transition (1138, 1139), // &colone -> ≔ + new Transition (1140, 1141), // &coloneq -> ≔ + new Transition (1144, 1145), // &comma -> , + new Transition (1146, 1147), // &commat -> @ + new Transition (1148, 1149), // &comp -> ∁ + new Transition (1151, 1152), // &compfn -> ∘ + new Transition (1158, 1159), // &complement -> ∁ + new Transition (1162, 1163), // &complexes -> ℂ + new Transition (1165, 1166), // &cong -> ≅ + new Transition (1169, 1170), // &congdot -> ⩭ + new Transition (1177, 1178), // &Congruent -> ≡ + new Transition (1181, 1182), // &Conint -> ∯ + new Transition (1185, 1186), // &conint -> ∮ + new Transition (1198, 1199), // &ContourIntegral -> ∮ + new Transition (1201, 1202), // &Copf -> ℂ + new Transition (1204, 1205), // &copf -> 𝕔 + new Transition (1208, 1209), // &coprod -> ∐ + new Transition (1215, 1216), // &Coproduct -> ∐ + new Transition (1219, 1220), // © -> © + new Transition (1221, 1222), // © -> © + new Transition (1224, 1225), // ©sr -> ℗ + new Transition (1254, 1255), // &CounterClockwiseContourIntegral -> ∳ + new Transition (1259, 1260), // &crarr -> ↵ + new Transition (1264, 1265), // &Cross -> ⨯ + new Transition (1268, 1269), // &cross -> ✗ + new Transition (1272, 1273), // &Cscr -> 𝒞 + new Transition (1276, 1277), // &cscr -> 𝒸 + new Transition (1279, 1280), // &csub -> ⫏ + new Transition (1281, 1282), // &csube -> ⫑ + new Transition (1283, 1284), // &csup -> ⫐ + new Transition (1285, 1286), // &csupe -> ⫒ + new Transition (1290, 1291), // &ctdot -> ⋯ + new Transition (1297, 1298), // &cudarrl -> ⤸ + new Transition (1299, 1300), // &cudarrr -> ⤵ + new Transition (1303, 1304), // &cuepr -> ⋞ + new Transition (1306, 1307), // &cuesc -> ⋟ + new Transition (1311, 1312), // &cularr -> ↶ + new Transition (1313, 1314), // &cularrp -> ⤽ + new Transition (1316, 1317), // &Cup -> ⋓ + new Transition (1318, 1319), // &cup -> ∪ + new Transition (1324, 1325), // &cupbrcap -> ⩈ + new Transition (1328, 1329), // &CupCap -> ≍ + new Transition (1332, 1333), // &cupcap -> ⩆ + new Transition (1335, 1336), // &cupcup -> ⩊ + new Transition (1339, 1340), // &cupdot -> ⊍ + new Transition (1342, 1343), // &cupor -> ⩅ + new Transition (1344, 1345), // &cups -> ∪︀ + new Transition (1349, 1350), // &curarr -> ↷ + new Transition (1351, 1352), // &curarrm -> ⤼ + new Transition (1360, 1361), // &curlyeqprec -> ⋞ + new Transition (1365, 1366), // &curlyeqsucc -> ⋟ + new Transition (1369, 1370), // &curlyvee -> ⋎ + new Transition (1375, 1376), // &curlywedge -> ⋏ + new Transition (1379, 1380), // ¤ -> ¤ + new Transition (1391, 1392), // &curvearrowleft -> ↶ + new Transition (1397, 1398), // &curvearrowright -> ↷ + new Transition (1401, 1402), // &cuvee -> ⋎ + new Transition (1405, 1406), // &cuwed -> ⋏ + new Transition (1413, 1414), // &cwconint -> ∲ + new Transition (1417, 1418), // &cwint -> ∱ + new Transition (1423, 1424), // &cylcty -> ⌭ + new Transition (1430, 1431), // &Dagger -> ‡ + new Transition (1437, 1438), // &dagger -> † + new Transition (1442, 1443), // &daleth -> ℸ + new Transition (1445, 1446), // &Darr -> ↡ + new Transition (1449, 1450), // &dArr -> ⇓ + new Transition (1452, 1453), // &darr -> ↓ + new Transition (1455, 1456), // &dash -> ‐ + new Transition (1459, 1460), // &Dashv -> ⫤ + new Transition (1461, 1462), // &dashv -> ⊣ + new Transition (1468, 1469), // &dbkarow -> ⤏ + new Transition (1472, 1473), // &dblac -> ˝ + new Transition (1478, 1479), // &Dcaron -> Ď + new Transition (1484, 1485), // &dcaron -> ď + new Transition (1486, 1487), // &Dcy -> Д + new Transition (1488, 1489), // &dcy -> д + new Transition (1490, 1491), // &DD -> ⅅ + new Transition (1492, 1493), // &dd -> ⅆ + new Transition (1498, 1499), // &ddagger -> ‡ + new Transition (1501, 1502), // &ddarr -> ⇊ + new Transition (1508, 1509), // &DDotrahd -> ⤑ + new Transition (1514, 1515), // &ddotseq -> ⩷ + new Transition (1517, 1518), // ° -> ° + new Transition (1520, 1521), // &Del -> ∇ + new Transition (1523, 1524), // &Delta -> Δ + new Transition (1527, 1528), // &delta -> δ + new Transition (1533, 1534), // &demptyv -> ⦱ + new Transition (1539, 1540), // &dfisht -> ⥿ + new Transition (1542, 1543), // &Dfr -> 𝔇 + new Transition (1544, 1545), // &dfr -> 𝔡 + new Transition (1548, 1549), // &dHar -> ⥥ + new Transition (1553, 1554), // &dharl -> ⇃ + new Transition (1555, 1556), // &dharr -> ⇂ + new Transition (1571, 1572), // &DiacriticalAcute -> ´ + new Transition (1575, 1576), // &DiacriticalDot -> ˙ + new Transition (1585, 1586), // &DiacriticalDoubleAcute -> ˝ + new Transition (1591, 1592), // &DiacriticalGrave -> ` + new Transition (1597, 1598), // &DiacriticalTilde -> ˜ + new Transition (1601, 1602), // &diam -> ⋄ + new Transition (1606, 1607), // &Diamond -> ⋄ + new Transition (1610, 1611), // &diamond -> ⋄ + new Transition (1615, 1616), // &diamondsuit -> ♦ + new Transition (1617, 1618), // &diams -> ♦ + new Transition (1619, 1620), // &die -> ¨ + new Transition (1631, 1632), // &DifferentialD -> ⅆ + new Transition (1637, 1638), // &digamma -> ϝ + new Transition (1641, 1642), // &disin -> ⋲ + new Transition (1643, 1644), // &div -> ÷ + new Transition (1647, 1648), // ÷ -> ÷ + new Transition (1655, 1656), // ÷ontimes -> ⋇ + new Transition (1659, 1660), // &divonx -> ⋇ + new Transition (1663, 1664), // &DJcy -> Ђ + new Transition (1667, 1668), // &djcy -> ђ + new Transition (1673, 1674), // &dlcorn -> ⌞ + new Transition (1677, 1678), // &dlcrop -> ⌍ + new Transition (1683, 1684), // &dollar -> $ + new Transition (1687, 1688), // &Dopf -> 𝔻 + new Transition (1690, 1691), // &dopf -> 𝕕 + new Transition (1692, 1693), // &Dot -> ¨ + new Transition (1694, 1695), // &dot -> ˙ + new Transition (1698, 1699), // &DotDot -> ⃜ + new Transition (1701, 1702), // &doteq -> ≐ + new Transition (1705, 1706), // &doteqdot -> ≑ + new Transition (1711, 1712), // &DotEqual -> ≐ + new Transition (1717, 1718), // &dotminus -> ∸ + new Transition (1722, 1723), // &dotplus -> ∔ + new Transition (1729, 1730), // &dotsquare -> ⊡ + new Transition (1742, 1743), // &doublebarwedge -> ⌆ + new Transition (1762, 1763), // &DoubleContourIntegral -> ∯ + new Transition (1766, 1767), // &DoubleDot -> ¨ + new Transition (1774, 1775), // &DoubleDownArrow -> ⇓ + new Transition (1784, 1785), // &DoubleLeftArrow -> ⇐ + new Transition (1795, 1796), // &DoubleLeftRightArrow -> ⇔ + new Transition (1799, 1800), // &DoubleLeftTee -> ⫤ + new Transition (1812, 1813), // &DoubleLongLeftArrow -> ⟸ + new Transition (1823, 1824), // &DoubleLongLeftRightArrow -> ⟺ + new Transition (1834, 1835), // &DoubleLongRightArrow -> ⟹ + new Transition (1845, 1846), // &DoubleRightArrow -> ⇒ + new Transition (1849, 1850), // &DoubleRightTee -> ⊨ + new Transition (1857, 1858), // &DoubleUpArrow -> ⇑ + new Transition (1867, 1868), // &DoubleUpDownArrow -> ⇕ + new Transition (1879, 1880), // &DoubleVerticalBar -> ∥ + new Transition (1887, 1888), // &DownArrow -> ↓ + new Transition (1893, 1894), // &Downarrow -> ⇓ + new Transition (1901, 1902), // &downarrow -> ↓ + new Transition (1905, 1906), // &DownArrowBar -> ⤓ + new Transition (1913, 1914), // &DownArrowUpArrow -> ⇵ + new Transition (1919, 1920), // &DownBreve -> ̑ + new Transition (1930, 1931), // &downdownarrows -> ⇊ + new Transition (1942, 1943), // &downharpoonleft -> ⇃ + new Transition (1948, 1949), // &downharpoonright -> ⇂ + new Transition (1964, 1965), // &DownLeftRightVector -> ⥐ + new Transition (1974, 1975), // &DownLeftTeeVector -> ⥞ + new Transition (1981, 1982), // &DownLeftVector -> ↽ + new Transition (1985, 1986), // &DownLeftVectorBar -> ⥖ + new Transition (2000, 2001), // &DownRightTeeVector -> ⥟ + new Transition (2007, 2008), // &DownRightVector -> ⇁ + new Transition (2011, 2012), // &DownRightVectorBar -> ⥗ + new Transition (2015, 2016), // &DownTee -> ⊤ + new Transition (2021, 2022), // &DownTeeArrow -> ↧ + new Transition (2029, 2030), // &drbkarow -> ⤐ + new Transition (2034, 2035), // &drcorn -> ⌟ + new Transition (2038, 2039), // &drcrop -> ⌌ + new Transition (2042, 2043), // &Dscr -> 𝒟 + new Transition (2046, 2047), // &dscr -> 𝒹 + new Transition (2050, 2051), // &DScy -> Ѕ + new Transition (2052, 2053), // &dscy -> ѕ + new Transition (2055, 2056), // &dsol -> ⧶ + new Transition (2060, 2061), // &Dstrok -> Đ + new Transition (2065, 2066), // &dstrok -> đ + new Transition (2070, 2071), // &dtdot -> ⋱ + new Transition (2073, 2074), // &dtri -> ▿ + new Transition (2075, 2076), // &dtrif -> ▾ + new Transition (2080, 2081), // &duarr -> ⇵ + new Transition (2084, 2085), // &duhar -> ⥯ + new Transition (2091, 2092), // &dwangle -> ⦦ + new Transition (2095, 2096), // &DZcy -> Џ + new Transition (2099, 2100), // &dzcy -> џ + new Transition (2106, 2107), // &dzigrarr -> ⟿ + new Transition (2113, 2114), // É -> É + new Transition (2120, 2121), // é -> é + new Transition (2125, 2126), // &easter -> ⩮ + new Transition (2131, 2132), // &Ecaron -> Ě + new Transition (2137, 2138), // &ecaron -> ě + new Transition (2140, 2141), // &ecir -> ≖ + new Transition (2144, 2145), // Ê -> Ê + new Transition (2146, 2147), // ê -> ê + new Transition (2151, 2152), // &ecolon -> ≕ + new Transition (2153, 2154), // &Ecy -> Э + new Transition (2155, 2156), // &ecy -> э + new Transition (2160, 2161), // &eDDot -> ⩷ + new Transition (2164, 2165), // &Edot -> Ė + new Transition (2167, 2168), // &eDot -> ≑ + new Transition (2171, 2172), // &edot -> ė + new Transition (2173, 2174), // &ee -> ⅇ + new Transition (2178, 2179), // &efDot -> ≒ + new Transition (2181, 2182), // &Efr -> 𝔈 + new Transition (2183, 2184), // &efr -> 𝔢 + new Transition (2185, 2186), // &eg -> ⪚ + new Transition (2191, 2192), // È -> È + new Transition (2196, 2197), // è -> è + new Transition (2198, 2199), // &egs -> ⪖ + new Transition (2202, 2203), // &egsdot -> ⪘ + new Transition (2204, 2205), // &el -> ⪙ + new Transition (2211, 2212), // &Element -> ∈ + new Transition (2218, 2219), // &elinters -> ⏧ + new Transition (2220, 2221), // &ell -> ℓ + new Transition (2222, 2223), // &els -> ⪕ + new Transition (2226, 2227), // &elsdot -> ⪗ + new Transition (2231, 2232), // &Emacr -> Ē + new Transition (2236, 2237), // &emacr -> ē + new Transition (2240, 2241), // &empty -> ∅ + new Transition (2244, 2245), // &emptyset -> ∅ + new Transition (2259, 2260), // &EmptySmallSquare -> ◻ + new Transition (2261, 2262), // &emptyv -> ∅ + new Transition (2277, 2278), // &EmptyVerySmallSquare -> ▫ + new Transition (2280, 2281), // &emsp ->   + new Transition (2283, 2284), // &emsp13 ->   + new Transition (2285, 2286), // &emsp14 ->   + new Transition (2288, 2289), // &ENG -> Ŋ + new Transition (2291, 2292), // &eng -> ŋ + new Transition (2294, 2295), // &ensp ->   + new Transition (2299, 2300), // &Eogon -> Ę + new Transition (2304, 2305), // &eogon -> ę + new Transition (2307, 2308), // &Eopf -> 𝔼 + new Transition (2310, 2311), // &eopf -> 𝕖 + new Transition (2314, 2315), // &epar -> ⋕ + new Transition (2317, 2318), // &eparsl -> ⧣ + new Transition (2321, 2322), // &eplus -> ⩱ + new Transition (2324, 2325), // &epsi -> ε + new Transition (2331, 2332), // &Epsilon -> Ε + new Transition (2335, 2336), // &epsilon -> ε + new Transition (2337, 2338), // &epsiv -> ϵ + new Transition (2343, 2344), // &eqcirc -> ≖ + new Transition (2348, 2349), // &eqcolon -> ≕ + new Transition (2352, 2353), // &eqsim -> ≂ + new Transition (2360, 2361), // &eqslantgtr -> ⪖ + new Transition (2365, 2366), // &eqslantless -> ⪕ + new Transition (2370, 2371), // &Equal -> ⩵ + new Transition (2375, 2376), // &equals -> = + new Transition (2381, 2382), // &EqualTilde -> ≂ + new Transition (2385, 2386), // &equest -> ≟ + new Transition (2394, 2395), // &Equilibrium -> ⇌ + new Transition (2397, 2398), // &equiv -> ≡ + new Transition (2400, 2401), // &equivDD -> ⩸ + new Transition (2407, 2408), // &eqvparsl -> ⧥ + new Transition (2412, 2413), // &erarr -> ⥱ + new Transition (2416, 2417), // &erDot -> ≓ + new Transition (2420, 2421), // &Escr -> ℰ + new Transition (2424, 2425), // &escr -> ℯ + new Transition (2428, 2429), // &esdot -> ≐ + new Transition (2431, 2432), // &Esim -> ⩳ + new Transition (2434, 2435), // &esim -> ≂ + new Transition (2437, 2438), // &Eta -> Η + new Transition (2440, 2441), // &eta -> η + new Transition (2443, 2444), // Ð -> Ð + new Transition (2445, 2446), // ð -> ð + new Transition (2449, 2450), // Ë -> Ë + new Transition (2453, 2454), // ë -> ë + new Transition (2456, 2457), // &euro -> € + new Transition (2460, 2461), // &excl -> ! + new Transition (2464, 2465), // &exist -> ∃ + new Transition (2470, 2471), // &Exists -> ∃ + new Transition (2480, 2481), // &expectation -> ℰ + new Transition (2491, 2492), // &ExponentialE -> ⅇ + new Transition (2501, 2502), // &exponentiale -> ⅇ + new Transition (2515, 2516), // &fallingdotseq -> ≒ + new Transition (2519, 2520), // &Fcy -> Ф + new Transition (2522, 2523), // &fcy -> ф + new Transition (2528, 2529), // &female -> ♀ + new Transition (2534, 2535), // &ffilig -> ffi + new Transition (2538, 2539), // &fflig -> ff + new Transition (2542, 2543), // &ffllig -> ffl + new Transition (2545, 2546), // &Ffr -> 𝔉 + new Transition (2547, 2548), // &ffr -> 𝔣 + new Transition (2552, 2553), // &filig -> fi + new Transition (2569, 2570), // &FilledSmallSquare -> ◼ + new Transition (2585, 2586), // &FilledVerySmallSquare -> ▪ + new Transition (2590, 2591), // &fjlig -> fj + new Transition (2594, 2595), // &flat -> ♭ + new Transition (2598, 2599), // &fllig -> fl + new Transition (2602, 2603), // &fltns -> ▱ + new Transition (2606, 2607), // &fnof -> ƒ + new Transition (2610, 2611), // &Fopf -> 𝔽 + new Transition (2614, 2615), // &fopf -> 𝕗 + new Transition (2619, 2620), // &ForAll -> ∀ + new Transition (2624, 2625), // &forall -> ∀ + new Transition (2626, 2627), // &fork -> ⋔ + new Transition (2628, 2629), // &forkv -> ⫙ + new Transition (2637, 2638), // &Fouriertrf -> ℱ + new Transition (2645, 2646), // &fpartint -> ⨍ + new Transition (2651, 2652), // ½ -> ½ + new Transition (2653, 2654), // &frac13 -> ⅓ + new Transition (2655, 2656), // ¼ -> ¼ + new Transition (2657, 2658), // &frac15 -> ⅕ + new Transition (2659, 2660), // &frac16 -> ⅙ + new Transition (2661, 2662), // &frac18 -> ⅛ + new Transition (2664, 2665), // &frac23 -> ⅔ + new Transition (2666, 2667), // &frac25 -> ⅖ + new Transition (2669, 2670), // ¾ -> ¾ + new Transition (2671, 2672), // &frac35 -> ⅗ + new Transition (2673, 2674), // &frac38 -> ⅜ + new Transition (2676, 2677), // &frac45 -> ⅘ + new Transition (2679, 2680), // &frac56 -> ⅚ + new Transition (2681, 2682), // &frac58 -> ⅝ + new Transition (2684, 2685), // &frac78 -> ⅞ + new Transition (2687, 2688), // &frasl -> ⁄ + new Transition (2691, 2692), // &frown -> ⌢ + new Transition (2695, 2696), // &Fscr -> ℱ + new Transition (2699, 2700), // &fscr -> 𝒻 + new Transition (2706, 2707), // &gacute -> ǵ + new Transition (2712, 2713), // &Gamma -> Γ + new Transition (2716, 2717), // &gamma -> γ + new Transition (2718, 2719), // &Gammad -> Ϝ + new Transition (2720, 2721), // &gammad -> ϝ + new Transition (2722, 2723), // &gap -> ⪆ + new Transition (2728, 2729), // &Gbreve -> Ğ + new Transition (2734, 2735), // &gbreve -> ğ + new Transition (2740, 2741), // &Gcedil -> Ģ + new Transition (2744, 2745), // &Gcirc -> Ĝ + new Transition (2749, 2750), // &gcirc -> ĝ + new Transition (2751, 2752), // &Gcy -> Г + new Transition (2753, 2754), // &gcy -> г + new Transition (2757, 2758), // &Gdot -> Ġ + new Transition (2761, 2762), // &gdot -> ġ + new Transition (2763, 2764), // &gE -> ≧ + new Transition (2765, 2766), // &ge -> ≥ + new Transition (2767, 2768), // &gEl -> ⪌ + new Transition (2769, 2770), // &gel -> ⋛ + new Transition (2771, 2772), // &geq -> ≥ + new Transition (2773, 2774), // &geqq -> ≧ + new Transition (2779, 2780), // &geqslant -> ⩾ + new Transition (2781, 2782), // &ges -> ⩾ + new Transition (2784, 2785), // &gescc -> ⪩ + new Transition (2788, 2789), // &gesdot -> ⪀ + new Transition (2790, 2791), // &gesdoto -> ⪂ + new Transition (2792, 2793), // &gesdotol -> ⪄ + new Transition (2794, 2795), // &gesl -> ⋛︀ + new Transition (2797, 2798), // &gesles -> ⪔ + new Transition (2800, 2801), // &Gfr -> 𝔊 + new Transition (2803, 2804), // &gfr -> 𝔤 + new Transition (2805, 2806), // &Gg -> ⋙ + new Transition (2807, 2808), // &gg -> ≫ + new Transition (2809, 2810), // &ggg -> ⋙ + new Transition (2814, 2815), // &gimel -> ℷ + new Transition (2818, 2819), // &GJcy -> Ѓ + new Transition (2822, 2823), // &gjcy -> ѓ + new Transition (2824, 2825), // &gl -> ≷ + new Transition (2826, 2827), // &gla -> ⪥ + new Transition (2828, 2829), // &glE -> ⪒ + new Transition (2830, 2831), // &glj -> ⪤ + new Transition (2834, 2835), // &gnap -> ⪊ + new Transition (2839, 2840), // &gnapprox -> ⪊ + new Transition (2841, 2842), // &gnE -> ≩ + new Transition (2843, 2844), // &gne -> ⪈ + new Transition (2845, 2846), // &gneq -> ⪈ + new Transition (2847, 2848), // &gneqq -> ≩ + new Transition (2851, 2852), // &gnsim -> ⋧ + new Transition (2855, 2856), // &Gopf -> 𝔾 + new Transition (2859, 2860), // &gopf -> 𝕘 + new Transition (2864, 2865), // &grave -> ` + new Transition (2876, 2877), // &GreaterEqual -> ≥ + new Transition (2881, 2882), // &GreaterEqualLess -> ⋛ + new Transition (2891, 2892), // &GreaterFullEqual -> ≧ + new Transition (2899, 2900), // &GreaterGreater -> ⪢ + new Transition (2904, 2905), // &GreaterLess -> ≷ + new Transition (2915, 2916), // &GreaterSlantEqual -> ⩾ + new Transition (2921, 2922), // &GreaterTilde -> ≳ + new Transition (2925, 2926), // &Gscr -> 𝒢 + new Transition (2929, 2930), // &gscr -> ℊ + new Transition (2932, 2933), // &gsim -> ≳ + new Transition (2934, 2935), // &gsime -> ⪎ + new Transition (2936, 2937), // &gsiml -> ⪐ + new Transition (2938, 2939), // > -> > + new Transition (2940, 2941), // &Gt -> ≫ + new Transition (2942, 2943), // > -> > + new Transition (2945, 2946), // >cc -> ⪧ + new Transition (2948, 2949), // >cir -> ⩺ + new Transition (2952, 2953), // >dot -> ⋗ + new Transition (2957, 2958), // >lPar -> ⦕ + new Transition (2963, 2964), // >quest -> ⩼ + new Transition (2971, 2972), // >rapprox -> ⪆ + new Transition (2974, 2975), // >rarr -> ⥸ + new Transition (2978, 2979), // >rdot -> ⋗ + new Transition (2985, 2986), // >reqless -> ⋛ + new Transition (2991, 2992), // >reqqless -> ⪌ + new Transition (2996, 2997), // >rless -> ≷ + new Transition (3000, 3001), // >rsim -> ≳ + new Transition (3009, 3010), // &gvertneqq -> ≩︀ + new Transition (3012, 3013), // &gvnE -> ≩︀ + new Transition (3018, 3019), // &Hacek -> ˇ + new Transition (3025, 3026), // &hairsp ->   + new Transition (3028, 3029), // &half -> ½ + new Transition (3033, 3034), // &hamilt -> ℋ + new Transition (3039, 3040), // &HARDcy -> Ъ + new Transition (3044, 3045), // &hardcy -> ъ + new Transition (3048, 3049), // &hArr -> ⇔ + new Transition (3050, 3051), // &harr -> ↔ + new Transition (3054, 3055), // &harrcir -> ⥈ + new Transition (3056, 3057), // &harrw -> ↭ + new Transition (3058, 3059), // &Hat -> ^ + new Transition (3062, 3063), // &hbar -> ℏ + new Transition (3067, 3068), // &Hcirc -> Ĥ + new Transition (3072, 3073), // &hcirc -> ĥ + new Transition (3078, 3079), // &hearts -> ♥ + new Transition (3082, 3083), // &heartsuit -> ♥ + new Transition (3087, 3088), // &hellip -> … + new Transition (3092, 3093), // &hercon -> ⊹ + new Transition (3095, 3096), // &Hfr -> ℌ + new Transition (3098, 3099), // &hfr -> 𝔥 + new Transition (3110, 3111), // &HilbertSpace -> ℋ + new Transition (3118, 3119), // &hksearow -> ⤥ + new Transition (3124, 3125), // &hkswarow -> ⤦ + new Transition (3129, 3130), // &hoarr -> ⇿ + new Transition (3134, 3135), // &homtht -> ∻ + new Transition (3146, 3147), // &hookleftarrow -> ↩ + new Transition (3157, 3158), // &hookrightarrow -> ↪ + new Transition (3161, 3162), // &Hopf -> ℍ + new Transition (3164, 3165), // &hopf -> 𝕙 + new Transition (3169, 3170), // &horbar -> ― + new Transition (3182, 3183), // &HorizontalLine -> ─ + new Transition (3186, 3187), // &Hscr -> ℋ + new Transition (3190, 3191), // &hscr -> 𝒽 + new Transition (3195, 3196), // &hslash -> ℏ + new Transition (3200, 3201), // &Hstrok -> Ħ + new Transition (3205, 3206), // &hstrok -> ħ + new Transition (3217, 3218), // &HumpDownHump -> ≎ + new Transition (3223, 3224), // &HumpEqual -> ≏ + new Transition (3229, 3230), // &hybull -> ⁃ + new Transition (3234, 3235), // &hyphen -> ‐ + new Transition (3241, 3242), // Í -> Í + new Transition (3248, 3249), // í -> í + new Transition (3250, 3251), // &ic -> ⁣ + new Transition (3255, 3256), // Î -> Î + new Transition (3259, 3260), // î -> î + new Transition (3261, 3262), // &Icy -> И + new Transition (3263, 3264), // &icy -> и + new Transition (3267, 3268), // &Idot -> İ + new Transition (3271, 3272), // &IEcy -> Е + new Transition (3275, 3276), // &iecy -> е + new Transition (3279, 3280), // ¡ -> ¡ + new Transition (3282, 3283), // &iff -> ⇔ + new Transition (3285, 3286), // &Ifr -> ℑ + new Transition (3287, 3288), // &ifr -> 𝔦 + new Transition (3293, 3294), // Ì -> Ì + new Transition (3299, 3300), // ì -> ì + new Transition (3301, 3302), // &ii -> ⅈ + new Transition (3306, 3307), // &iiiint -> ⨌ + new Transition (3309, 3310), // &iiint -> ∭ + new Transition (3314, 3315), // &iinfin -> ⧜ + new Transition (3318, 3319), // &iiota -> ℩ + new Transition (3323, 3324), // &IJlig -> IJ + new Transition (3328, 3329), // &ijlig -> ij + new Transition (3330, 3331), // &Im -> ℑ + new Transition (3334, 3335), // &Imacr -> Ī + new Transition (3339, 3340), // &imacr -> ī + new Transition (3342, 3343), // &image -> ℑ + new Transition (3350, 3351), // &ImaginaryI -> ⅈ + new Transition (3355, 3356), // &imagline -> ℐ + new Transition (3360, 3361), // &imagpart -> ℑ + new Transition (3363, 3364), // &imath -> ı + new Transition (3366, 3367), // &imof -> ⊷ + new Transition (3370, 3371), // &imped -> Ƶ + new Transition (3376, 3377), // &Implies -> ⇒ + new Transition (3378, 3379), // &in -> ∈ + new Transition (3383, 3384), // &incare -> ℅ + new Transition (3387, 3388), // &infin -> ∞ + new Transition (3391, 3392), // &infintie -> ⧝ + new Transition (3396, 3397), // &inodot -> ı + new Transition (3399, 3400), // &Int -> ∬ + new Transition (3401, 3402), // &int -> ∫ + new Transition (3405, 3406), // &intcal -> ⊺ + new Transition (3411, 3412), // &integers -> ℤ + new Transition (3417, 3418), // &Integral -> ∫ + new Transition (3422, 3423), // &intercal -> ⊺ + new Transition (3431, 3432), // &Intersection -> ⋂ + new Transition (3437, 3438), // &intlarhk -> ⨗ + new Transition (3442, 3443), // &intprod -> ⨼ + new Transition (3455, 3456), // &InvisibleComma -> ⁣ + new Transition (3461, 3462), // &InvisibleTimes -> ⁢ + new Transition (3465, 3466), // &IOcy -> Ё + new Transition (3469, 3470), // &iocy -> ё + new Transition (3474, 3475), // &Iogon -> Į + new Transition (3478, 3479), // &iogon -> į + new Transition (3481, 3482), // &Iopf -> 𝕀 + new Transition (3484, 3485), // &iopf -> 𝕚 + new Transition (3487, 3488), // &Iota -> Ι + new Transition (3490, 3491), // &iota -> ι + new Transition (3495, 3496), // &iprod -> ⨼ + new Transition (3501, 3502), // ¿ -> ¿ + new Transition (3505, 3506), // &Iscr -> ℐ + new Transition (3509, 3510), // &iscr -> 𝒾 + new Transition (3512, 3513), // &isin -> ∈ + new Transition (3516, 3517), // &isindot -> ⋵ + new Transition (3518, 3519), // &isinE -> ⋹ + new Transition (3520, 3521), // &isins -> ⋴ + new Transition (3522, 3523), // &isinsv -> ⋳ + new Transition (3524, 3525), // &isinv -> ∈ + new Transition (3526, 3527), // &it -> ⁢ + new Transition (3532, 3533), // &Itilde -> Ĩ + new Transition (3537, 3538), // &itilde -> ĩ + new Transition (3542, 3543), // &Iukcy -> І + new Transition (3547, 3548), // &iukcy -> і + new Transition (3550, 3551), // Ï -> Ï + new Transition (3553, 3554), // ï -> ï + new Transition (3559, 3560), // &Jcirc -> Ĵ + new Transition (3565, 3566), // &jcirc -> ĵ + new Transition (3567, 3568), // &Jcy -> Й + new Transition (3569, 3570), // &jcy -> й + new Transition (3572, 3573), // &Jfr -> 𝔍 + new Transition (3575, 3576), // &jfr -> 𝔧 + new Transition (3580, 3581), // &jmath -> ȷ + new Transition (3584, 3585), // &Jopf -> 𝕁 + new Transition (3588, 3589), // &jopf -> 𝕛 + new Transition (3592, 3593), // &Jscr -> 𝒥 + new Transition (3596, 3597), // &jscr -> 𝒿 + new Transition (3601, 3602), // &Jsercy -> Ј + new Transition (3606, 3607), // &jsercy -> ј + new Transition (3611, 3612), // &Jukcy -> Є + new Transition (3616, 3617), // &jukcy -> є + new Transition (3622, 3623), // &Kappa -> Κ + new Transition (3628, 3629), // &kappa -> κ + new Transition (3630, 3631), // &kappav -> ϰ + new Transition (3636, 3637), // &Kcedil -> Ķ + new Transition (3642, 3643), // &kcedil -> ķ + new Transition (3644, 3645), // &Kcy -> К + new Transition (3646, 3647), // &kcy -> к + new Transition (3649, 3650), // &Kfr -> 𝔎 + new Transition (3652, 3653), // &kfr -> 𝔨 + new Transition (3658, 3659), // &kgreen -> ĸ + new Transition (3662, 3663), // &KHcy -> Х + new Transition (3666, 3667), // &khcy -> х + new Transition (3670, 3671), // &KJcy -> Ќ + new Transition (3674, 3675), // &kjcy -> ќ + new Transition (3678, 3679), // &Kopf -> 𝕂 + new Transition (3682, 3683), // &kopf -> 𝕜 + new Transition (3686, 3687), // &Kscr -> 𝒦 + new Transition (3690, 3691), // &kscr -> 𝓀 + new Transition (3696, 3697), // &lAarr -> ⇚ + new Transition (3703, 3704), // &Lacute -> Ĺ + new Transition (3709, 3710), // &lacute -> ĺ + new Transition (3716, 3717), // &laemptyv -> ⦴ + new Transition (3721, 3722), // &lagran -> ℒ + new Transition (3726, 3727), // &Lambda -> Λ + new Transition (3731, 3732), // &lambda -> λ + new Transition (3734, 3735), // &Lang -> ⟪ + new Transition (3737, 3738), // &lang -> ⟨ + new Transition (3739, 3740), // &langd -> ⦑ + new Transition (3742, 3743), // &langle -> ⟨ + new Transition (3744, 3745), // &lap -> ⪅ + new Transition (3753, 3754), // &Laplacetrf -> ℒ + new Transition (3757, 3758), // « -> « + new Transition (3760, 3761), // &Larr -> ↞ + new Transition (3763, 3764), // &lArr -> ⇐ + new Transition (3766, 3767), // &larr -> ← + new Transition (3768, 3769), // &larrb -> ⇤ + new Transition (3771, 3772), // &larrbfs -> ⤟ + new Transition (3774, 3775), // &larrfs -> ⤝ + new Transition (3777, 3778), // &larrhk -> ↩ + new Transition (3780, 3781), // &larrlp -> ↫ + new Transition (3783, 3784), // &larrpl -> ⤹ + new Transition (3787, 3788), // &larrsim -> ⥳ + new Transition (3790, 3791), // &larrtl -> ↢ + new Transition (3792, 3793), // &lat -> ⪫ + new Transition (3797, 3798), // &lAtail -> ⤛ + new Transition (3801, 3802), // &latail -> ⤙ + new Transition (3803, 3804), // &late -> ⪭ + new Transition (3805, 3806), // &lates -> ⪭︀ + new Transition (3810, 3811), // &lBarr -> ⤎ + new Transition (3815, 3816), // &lbarr -> ⤌ + new Transition (3819, 3820), // &lbbrk -> ❲ + new Transition (3824, 3825), // &lbrace -> { + new Transition (3826, 3827), // &lbrack -> [ + new Transition (3829, 3830), // &lbrke -> ⦋ + new Transition (3833, 3834), // &lbrksld -> ⦏ + new Transition (3835, 3836), // &lbrkslu -> ⦍ + new Transition (3841, 3842), // &Lcaron -> Ľ + new Transition (3847, 3848), // &lcaron -> ľ + new Transition (3852, 3853), // &Lcedil -> Ļ + new Transition (3857, 3858), // &lcedil -> ļ + new Transition (3860, 3861), // &lceil -> ⌈ + new Transition (3863, 3864), // &lcub -> { + new Transition (3865, 3866), // &Lcy -> Л + new Transition (3867, 3868), // &lcy -> л + new Transition (3871, 3872), // &ldca -> ⤶ + new Transition (3875, 3876), // &ldquo -> “ + new Transition (3877, 3878), // &ldquor -> „ + new Transition (3883, 3884), // &ldrdhar -> ⥧ + new Transition (3889, 3890), // &ldrushar -> ⥋ + new Transition (3892, 3893), // &ldsh -> ↲ + new Transition (3894, 3895), // &lE -> ≦ + new Transition (3896, 3897), // &le -> ≤ + new Transition (3912, 3913), // &LeftAngleBracket -> ⟨ + new Transition (3917, 3918), // &LeftArrow -> ← + new Transition (3923, 3924), // &Leftarrow -> ⇐ + new Transition (3931, 3932), // &leftarrow -> ← + new Transition (3935, 3936), // &LeftArrowBar -> ⇤ + new Transition (3946, 3947), // &LeftArrowRightArrow -> ⇆ + new Transition (3951, 3952), // &leftarrowtail -> ↢ + new Transition (3959, 3960), // &LeftCeiling -> ⌈ + new Transition (3973, 3974), // &LeftDoubleBracket -> ⟦ + new Transition (3985, 3986), // &LeftDownTeeVector -> ⥡ + new Transition (3992, 3993), // &LeftDownVector -> ⇃ + new Transition (3996, 3997), // &LeftDownVectorBar -> ⥙ + new Transition (4002, 4003), // &LeftFloor -> ⌊ + new Transition (4014, 4015), // &leftharpoondown -> ↽ + new Transition (4017, 4018), // &leftharpoonup -> ↼ + new Transition (4028, 4029), // &leftleftarrows -> ⇇ + new Transition (4039, 4040), // &LeftRightArrow -> ↔ + new Transition (4050, 4051), // &Leftrightarrow -> ⇔ + new Transition (4061, 4062), // &leftrightarrow -> ↔ + new Transition (4063, 4064), // &leftrightarrows -> ⇆ + new Transition (4072, 4073), // &leftrightharpoons -> ⇋ + new Transition (4083, 4084), // &leftrightsquigarrow -> ↭ + new Transition (4090, 4091), // &LeftRightVector -> ⥎ + new Transition (4094, 4095), // &LeftTee -> ⊣ + new Transition (4100, 4101), // &LeftTeeArrow -> ↤ + new Transition (4107, 4108), // &LeftTeeVector -> ⥚ + new Transition (4118, 4119), // &leftthreetimes -> ⋋ + new Transition (4126, 4127), // &LeftTriangle -> ⊲ + new Transition (4130, 4131), // &LeftTriangleBar -> ⧏ + new Transition (4136, 4137), // &LeftTriangleEqual -> ⊴ + new Transition (4149, 4150), // &LeftUpDownVector -> ⥑ + new Transition (4159, 4160), // &LeftUpTeeVector -> ⥠ + new Transition (4166, 4167), // &LeftUpVector -> ↿ + new Transition (4170, 4171), // &LeftUpVectorBar -> ⥘ + new Transition (4177, 4178), // &LeftVector -> ↼ + new Transition (4181, 4182), // &LeftVectorBar -> ⥒ + new Transition (4183, 4184), // &lEg -> ⪋ + new Transition (4185, 4186), // &leg -> ⋚ + new Transition (4187, 4188), // &leq -> ≤ + new Transition (4189, 4190), // &leqq -> ≦ + new Transition (4195, 4196), // &leqslant -> ⩽ + new Transition (4197, 4198), // &les -> ⩽ + new Transition (4200, 4201), // &lescc -> ⪨ + new Transition (4204, 4205), // &lesdot -> ⩿ + new Transition (4206, 4207), // &lesdoto -> ⪁ + new Transition (4208, 4209), // &lesdotor -> ⪃ + new Transition (4210, 4211), // &lesg -> ⋚︀ + new Transition (4213, 4214), // &lesges -> ⪓ + new Transition (4221, 4222), // &lessapprox -> ⪅ + new Transition (4225, 4226), // &lessdot -> ⋖ + new Transition (4231, 4232), // &lesseqgtr -> ⋚ + new Transition (4236, 4237), // &lesseqqgtr -> ⪋ + new Transition (4251, 4252), // &LessEqualGreater -> ⋚ + new Transition (4261, 4262), // &LessFullEqual -> ≦ + new Transition (4269, 4270), // &LessGreater -> ≶ + new Transition (4273, 4274), // &lessgtr -> ≶ + new Transition (4278, 4279), // &LessLess -> ⪡ + new Transition (4282, 4283), // &lesssim -> ≲ + new Transition (4293, 4294), // &LessSlantEqual -> ⩽ + new Transition (4299, 4300), // &LessTilde -> ≲ + new Transition (4305, 4306), // &lfisht -> ⥼ + new Transition (4310, 4311), // &lfloor -> ⌊ + new Transition (4313, 4314), // &Lfr -> 𝔏 + new Transition (4315, 4316), // &lfr -> 𝔩 + new Transition (4317, 4318), // &lg -> ≶ + new Transition (4319, 4320), // &lgE -> ⪑ + new Transition (4323, 4324), // &lHar -> ⥢ + new Transition (4328, 4329), // &lhard -> ↽ + new Transition (4330, 4331), // &lharu -> ↼ + new Transition (4332, 4333), // &lharul -> ⥪ + new Transition (4336, 4337), // &lhblk -> ▄ + new Transition (4340, 4341), // &LJcy -> Љ + new Transition (4344, 4345), // &ljcy -> љ + new Transition (4346, 4347), // &Ll -> ⋘ + new Transition (4348, 4349), // &ll -> ≪ + new Transition (4352, 4353), // &llarr -> ⇇ + new Transition (4359, 4360), // &llcorner -> ⌞ + new Transition (4368, 4369), // &Lleftarrow -> ⇚ + new Transition (4373, 4374), // &llhard -> ⥫ + new Transition (4377, 4378), // &lltri -> ◺ + new Transition (4383, 4384), // &Lmidot -> Ŀ + new Transition (4389, 4390), // &lmidot -> ŀ + new Transition (4394, 4395), // &lmoust -> ⎰ + new Transition (4399, 4400), // &lmoustache -> ⎰ + new Transition (4403, 4404), // &lnap -> ⪉ + new Transition (4408, 4409), // &lnapprox -> ⪉ + new Transition (4410, 4411), // &lnE -> ≨ + new Transition (4412, 4413), // &lne -> ⪇ + new Transition (4414, 4415), // &lneq -> ⪇ + new Transition (4416, 4417), // &lneqq -> ≨ + new Transition (4420, 4421), // &lnsim -> ⋦ + new Transition (4425, 4426), // &loang -> ⟬ + new Transition (4428, 4429), // &loarr -> ⇽ + new Transition (4432, 4433), // &lobrk -> ⟦ + new Transition (4445, 4446), // &LongLeftArrow -> ⟵ + new Transition (4455, 4456), // &Longleftarrow -> ⟸ + new Transition (4467, 4468), // &longleftarrow -> ⟵ + new Transition (4478, 4479), // &LongLeftRightArrow -> ⟷ + new Transition (4489, 4490), // &Longleftrightarrow -> ⟺ + new Transition (4500, 4501), // &longleftrightarrow -> ⟷ + new Transition (4507, 4508), // &longmapsto -> ⟼ + new Transition (4518, 4519), // &LongRightArrow -> ⟶ + new Transition (4529, 4530), // &Longrightarrow -> ⟹ + new Transition (4540, 4541), // &longrightarrow -> ⟶ + new Transition (4552, 4553), // &looparrowleft -> ↫ + new Transition (4558, 4559), // &looparrowright -> ↬ + new Transition (4562, 4563), // &lopar -> ⦅ + new Transition (4565, 4566), // &Lopf -> 𝕃 + new Transition (4567, 4568), // &lopf -> 𝕝 + new Transition (4571, 4572), // &loplus -> ⨭ + new Transition (4577, 4578), // &lotimes -> ⨴ + new Transition (4582, 4583), // &lowast -> ∗ + new Transition (4586, 4587), // &lowbar -> _ + new Transition (4599, 4600), // &LowerLeftArrow -> ↙ + new Transition (4610, 4611), // &LowerRightArrow -> ↘ + new Transition (4612, 4613), // &loz -> ◊ + new Transition (4617, 4618), // &lozenge -> ◊ + new Transition (4619, 4620), // &lozf -> ⧫ + new Transition (4623, 4624), // &lpar -> ( + new Transition (4626, 4627), // &lparlt -> ⦓ + new Transition (4631, 4632), // &lrarr -> ⇆ + new Transition (4638, 4639), // &lrcorner -> ⌟ + new Transition (4642, 4643), // &lrhar -> ⇋ + new Transition (4644, 4645), // &lrhard -> ⥭ + new Transition (4646, 4647), // &lrm -> ‎ + new Transition (4650, 4651), // &lrtri -> ⊿ + new Transition (4656, 4657), // &lsaquo -> ‹ + new Transition (4660, 4661), // &Lscr -> ℒ + new Transition (4663, 4664), // &lscr -> 𝓁 + new Transition (4665, 4666), // &Lsh -> ↰ + new Transition (4667, 4668), // &lsh -> ↰ + new Transition (4670, 4671), // &lsim -> ≲ + new Transition (4672, 4673), // &lsime -> ⪍ + new Transition (4674, 4675), // &lsimg -> ⪏ + new Transition (4677, 4678), // &lsqb -> [ + new Transition (4680, 4681), // &lsquo -> ‘ + new Transition (4682, 4683), // &lsquor -> ‚ + new Transition (4687, 4688), // &Lstrok -> Ł + new Transition (4692, 4693), // &lstrok -> ł + new Transition (4694, 4695), // < -> < + new Transition (4696, 4697), // &Lt -> ≪ + new Transition (4698, 4699), // < -> < + new Transition (4701, 4702), // <cc -> ⪦ + new Transition (4704, 4705), // <cir -> ⩹ + new Transition (4708, 4709), // <dot -> ⋖ + new Transition (4713, 4714), // <hree -> ⋋ + new Transition (4718, 4719), // <imes -> ⋉ + new Transition (4723, 4724), // <larr -> ⥶ + new Transition (4729, 4730), // <quest -> ⩻ + new Transition (4732, 4733), // <ri -> ◃ + new Transition (4734, 4735), // <rie -> ⊴ + new Transition (4736, 4737), // <rif -> ◂ + new Transition (4740, 4741), // <rPar -> ⦖ + new Transition (4748, 4749), // &lurdshar -> ⥊ + new Transition (4753, 4754), // &luruhar -> ⥦ + new Transition (4762, 4763), // &lvertneqq -> ≨︀ + new Transition (4765, 4766), // &lvnE -> ≨︀ + new Transition (4770, 4771), // ¯ -> ¯ + new Transition (4773, 4774), // &male -> ♂ + new Transition (4775, 4776), // &malt -> ✠ + new Transition (4779, 4780), // &maltese -> ✠ + new Transition (4783, 4784), // &Map -> ⤅ + new Transition (4785, 4786), // &map -> ↦ + new Transition (4789, 4790), // &mapsto -> ↦ + new Transition (4794, 4795), // &mapstodown -> ↧ + new Transition (4799, 4800), // &mapstoleft -> ↤ + new Transition (4802, 4803), // &mapstoup -> ↥ + new Transition (4807, 4808), // &marker -> ▮ + new Transition (4813, 4814), // &mcomma -> ⨩ + new Transition (4816, 4817), // &Mcy -> М + new Transition (4818, 4819), // &mcy -> м + new Transition (4823, 4824), // &mdash -> — + new Transition (4828, 4829), // &mDDot -> ∺ + new Transition (4841, 4842), // &measuredangle -> ∡ + new Transition (4852, 4853), // &MediumSpace ->   + new Transition (4860, 4861), // &Mellintrf -> ℳ + new Transition (4863, 4864), // &Mfr -> 𝔐 + new Transition (4866, 4867), // &mfr -> 𝔪 + new Transition (4869, 4870), // &mho -> ℧ + new Transition (4874, 4875), // µ -> µ + new Transition (4876, 4877), // &mid -> ∣ + new Transition (4880, 4881), // &midast -> * + new Transition (4884, 4885), // &midcir -> ⫰ + new Transition (4888, 4889), // · -> · + new Transition (4892, 4893), // &minus -> − + new Transition (4894, 4895), // &minusb -> ⊟ + new Transition (4896, 4897), // &minusd -> ∸ + new Transition (4898, 4899), // &minusdu -> ⨪ + new Transition (4907, 4908), // &MinusPlus -> ∓ + new Transition (4911, 4912), // &mlcp -> ⫛ + new Transition (4914, 4915), // &mldr -> … + new Transition (4920, 4921), // &mnplus -> ∓ + new Transition (4926, 4927), // &models -> ⊧ + new Transition (4930, 4931), // &Mopf -> 𝕄 + new Transition (4933, 4934), // &mopf -> 𝕞 + new Transition (4935, 4936), // &mp -> ∓ + new Transition (4939, 4940), // &Mscr -> ℳ + new Transition (4943, 4944), // &mscr -> 𝓂 + new Transition (4948, 4949), // &mstpos -> ∾ + new Transition (4950, 4951), // &Mu -> Μ + new Transition (4952, 4953), // &mu -> μ + new Transition (4959, 4960), // &multimap -> ⊸ + new Transition (4963, 4964), // &mumap -> ⊸ + new Transition (4969, 4970), // &nabla -> ∇ + new Transition (4976, 4977), // &Nacute -> Ń + new Transition (4981, 4982), // &nacute -> ń + new Transition (4984, 4985), // &nang -> ∠⃒ + new Transition (4986, 4987), // &nap -> ≉ + new Transition (4988, 4989), // &napE -> ⩰̸ + new Transition (4991, 4992), // &napid -> ≋̸ + new Transition (4994, 4995), // &napos -> ʼn + new Transition (4999, 5000), // &napprox -> ≉ + new Transition (5003, 5004), // &natur -> ♮ + new Transition (5006, 5007), // &natural -> ♮ + new Transition (5008, 5009), // &naturals -> ℕ + new Transition (5012, 5013), //   ->   + new Transition (5016, 5017), // &nbump -> ≎̸ + new Transition (5018, 5019), // &nbumpe -> ≏̸ + new Transition (5022, 5023), // &ncap -> ⩃ + new Transition (5028, 5029), // &Ncaron -> Ň + new Transition (5032, 5033), // &ncaron -> ň + new Transition (5037, 5038), // &Ncedil -> Ņ + new Transition (5042, 5043), // &ncedil -> ņ + new Transition (5046, 5047), // &ncong -> ≇ + new Transition (5050, 5051), // &ncongdot -> ⩭̸ + new Transition (5053, 5054), // &ncup -> ⩂ + new Transition (5055, 5056), // &Ncy -> Н + new Transition (5057, 5058), // &ncy -> н + new Transition (5062, 5063), // &ndash -> – + new Transition (5064, 5065), // &ne -> ≠ + new Transition (5069, 5070), // &nearhk -> ⤤ + new Transition (5073, 5074), // &neArr -> ⇗ + new Transition (5075, 5076), // &nearr -> ↗ + new Transition (5078, 5079), // &nearrow -> ↗ + new Transition (5082, 5083), // &nedot -> ≐̸ + new Transition (5101, 5102), // &NegativeMediumSpace -> ​ + new Transition (5112, 5113), // &NegativeThickSpace -> ​ + new Transition (5119, 5120), // &NegativeThinSpace -> ​ + new Transition (5133, 5134), // &NegativeVeryThinSpace -> ​ + new Transition (5138, 5139), // &nequiv -> ≢ + new Transition (5143, 5144), // &nesear -> ⤨ + new Transition (5146, 5147), // &nesim -> ≂̸ + new Transition (5165, 5166), // &NestedGreaterGreater -> ≫ + new Transition (5174, 5175), // &NestedLessLess -> ≪ + new Transition (5180, 5181), // &NewLine -> + new Transition (5185, 5186), // &nexist -> ∄ + new Transition (5187, 5188), // &nexists -> ∄ + new Transition (5190, 5191), // &Nfr -> 𝔑 + new Transition (5193, 5194), // &nfr -> 𝔫 + new Transition (5196, 5197), // &ngE -> ≧̸ + new Transition (5198, 5199), // &nge -> ≱ + new Transition (5200, 5201), // &ngeq -> ≱ + new Transition (5202, 5203), // &ngeqq -> ≧̸ + new Transition (5208, 5209), // &ngeqslant -> ⩾̸ + new Transition (5210, 5211), // &nges -> ⩾̸ + new Transition (5213, 5214), // &nGg -> ⋙̸ + new Transition (5217, 5218), // &ngsim -> ≵ + new Transition (5219, 5220), // &nGt -> ≫⃒ + new Transition (5221, 5222), // &ngt -> ≯ + new Transition (5223, 5224), // &ngtr -> ≯ + new Transition (5225, 5226), // &nGtv -> ≫̸ + new Transition (5230, 5231), // &nhArr -> ⇎ + new Transition (5234, 5235), // &nharr -> ↮ + new Transition (5238, 5239), // &nhpar -> ⫲ + new Transition (5240, 5241), // &ni -> ∋ + new Transition (5242, 5243), // &nis -> ⋼ + new Transition (5244, 5245), // &nisd -> ⋺ + new Transition (5246, 5247), // &niv -> ∋ + new Transition (5250, 5251), // &NJcy -> Њ + new Transition (5254, 5255), // &njcy -> њ + new Transition (5259, 5260), // &nlArr -> ⇍ + new Transition (5263, 5264), // &nlarr -> ↚ + new Transition (5266, 5267), // &nldr -> ‥ + new Transition (5268, 5269), // &nlE -> ≦̸ + new Transition (5270, 5271), // &nle -> ≰ + new Transition (5280, 5281), // &nLeftarrow -> ⇍ + new Transition (5288, 5289), // &nleftarrow -> ↚ + new Transition (5299, 5300), // &nLeftrightarrow -> ⇎ + new Transition (5310, 5311), // &nleftrightarrow -> ↮ + new Transition (5312, 5313), // &nleq -> ≰ + new Transition (5314, 5315), // &nleqq -> ≦̸ + new Transition (5320, 5321), // &nleqslant -> ⩽̸ + new Transition (5322, 5323), // &nles -> ⩽̸ + new Transition (5324, 5325), // &nless -> ≮ + new Transition (5326, 5327), // &nLl -> ⋘̸ + new Transition (5330, 5331), // &nlsim -> ≴ + new Transition (5332, 5333), // &nLt -> ≪⃒ + new Transition (5334, 5335), // &nlt -> ≮ + new Transition (5337, 5338), // &nltri -> ⋪ + new Transition (5339, 5340), // &nltrie -> ⋬ + new Transition (5341, 5342), // &nLtv -> ≪̸ + new Transition (5345, 5346), // &nmid -> ∤ + new Transition (5352, 5353), // &NoBreak -> ⁠ + new Transition (5367, 5368), // &NonBreakingSpace ->   + new Transition (5370, 5371), // &Nopf -> ℕ + new Transition (5374, 5375), // &nopf -> 𝕟 + new Transition (5376, 5377), // &Not -> ⫬ + new Transition (5378, 5379), // ¬ -> ¬ + new Transition (5388, 5389), // &NotCongruent -> ≢ + new Transition (5394, 5395), // &NotCupCap -> ≭ + new Transition (5412, 5413), // &NotDoubleVerticalBar -> ∦ + new Transition (5420, 5421), // &NotElement -> ∉ + new Transition (5425, 5426), // &NotEqual -> ≠ + new Transition (5431, 5432), // &NotEqualTilde -> ≂̸ + new Transition (5437, 5438), // &NotExists -> ∄ + new Transition (5445, 5446), // &NotGreater -> ≯ + new Transition (5451, 5452), // &NotGreaterEqual -> ≱ + new Transition (5461, 5462), // &NotGreaterFullEqual -> ≧̸ + new Transition (5469, 5470), // &NotGreaterGreater -> ≫̸ + new Transition (5474, 5475), // &NotGreaterLess -> ≹ + new Transition (5485, 5486), // &NotGreaterSlantEqual -> ⩾̸ + new Transition (5491, 5492), // &NotGreaterTilde -> ≵ + new Transition (5504, 5505), // &NotHumpDownHump -> ≎̸ + new Transition (5510, 5511), // &NotHumpEqual -> ≏̸ + new Transition (5513, 5514), // ¬in -> ∉ + new Transition (5517, 5518), // ¬indot -> ⋵̸ + new Transition (5519, 5520), // ¬inE -> ⋹̸ + new Transition (5522, 5523), // ¬inva -> ∉ + new Transition (5524, 5525), // ¬invb -> ⋷ + new Transition (5526, 5527), // ¬invc -> ⋶ + new Transition (5539, 5540), // &NotLeftTriangle -> ⋪ + new Transition (5543, 5544), // &NotLeftTriangleBar -> ⧏̸ + new Transition (5549, 5550), // &NotLeftTriangleEqual -> ⋬ + new Transition (5552, 5553), // &NotLess -> ≮ + new Transition (5558, 5559), // &NotLessEqual -> ≰ + new Transition (5566, 5567), // &NotLessGreater -> ≸ + new Transition (5571, 5572), // &NotLessLess -> ≪̸ + new Transition (5582, 5583), // &NotLessSlantEqual -> ⩽̸ + new Transition (5588, 5589), // &NotLessTilde -> ≴ + new Transition (5609, 5610), // &NotNestedGreaterGreater -> ⪢̸ + new Transition (5618, 5619), // &NotNestedLessLess -> ⪡̸ + new Transition (5621, 5622), // ¬ni -> ∌ + new Transition (5624, 5625), // ¬niva -> ∌ + new Transition (5626, 5627), // ¬nivb -> ⋾ + new Transition (5628, 5629), // ¬nivc -> ⋽ + new Transition (5637, 5638), // &NotPrecedes -> ⊀ + new Transition (5643, 5644), // &NotPrecedesEqual -> ⪯̸ + new Transition (5654, 5655), // &NotPrecedesSlantEqual -> ⋠ + new Transition (5669, 5670), // &NotReverseElement -> ∌ + new Transition (5682, 5683), // &NotRightTriangle -> ⋫ + new Transition (5686, 5687), // &NotRightTriangleBar -> ⧐̸ + new Transition (5692, 5693), // &NotRightTriangleEqual -> ⋭ + new Transition (5705, 5706), // &NotSquareSubset -> ⊏̸ + new Transition (5711, 5712), // &NotSquareSubsetEqual -> ⋢ + new Transition (5718, 5719), // &NotSquareSuperset -> ⊐̸ + new Transition (5724, 5725), // &NotSquareSupersetEqual -> ⋣ + new Transition (5730, 5731), // &NotSubset -> ⊂⃒ + new Transition (5736, 5737), // &NotSubsetEqual -> ⊈ + new Transition (5743, 5744), // &NotSucceeds -> ⊁ + new Transition (5749, 5750), // &NotSucceedsEqual -> ⪰̸ + new Transition (5760, 5761), // &NotSucceedsSlantEqual -> ⋡ + new Transition (5766, 5767), // &NotSucceedsTilde -> ≿̸ + new Transition (5773, 5774), // &NotSuperset -> ⊃⃒ + new Transition (5779, 5780), // &NotSupersetEqual -> ⊉ + new Transition (5785, 5786), // &NotTilde -> ≁ + new Transition (5791, 5792), // &NotTildeEqual -> ≄ + new Transition (5801, 5802), // &NotTildeFullEqual -> ≇ + new Transition (5807, 5808), // &NotTildeTilde -> ≉ + new Transition (5819, 5820), // &NotVerticalBar -> ∤ + new Transition (5823, 5824), // &npar -> ∦ + new Transition (5829, 5830), // &nparallel -> ∦ + new Transition (5832, 5833), // &nparsl -> ⫽⃥ + new Transition (5834, 5835), // &npart -> ∂̸ + new Transition (5840, 5841), // &npolint -> ⨔ + new Transition (5842, 5843), // &npr -> ⊀ + new Transition (5846, 5847), // &nprcue -> ⋠ + new Transition (5848, 5849), // &npre -> ⪯̸ + new Transition (5850, 5851), // &nprec -> ⊀ + new Transition (5853, 5854), // &npreceq -> ⪯̸ + new Transition (5858, 5859), // &nrArr -> ⇏ + new Transition (5862, 5863), // &nrarr -> ↛ + new Transition (5864, 5865), // &nrarrc -> ⤳̸ + new Transition (5866, 5867), // &nrarrw -> ↝̸ + new Transition (5877, 5878), // &nRightarrow -> ⇏ + new Transition (5887, 5888), // &nrightarrow -> ↛ + new Transition (5891, 5892), // &nrtri -> ⋫ + new Transition (5893, 5894), // &nrtrie -> ⋭ + new Transition (5896, 5897), // &nsc -> ⊁ + new Transition (5900, 5901), // &nsccue -> ⋡ + new Transition (5902, 5903), // &nsce -> ⪰̸ + new Transition (5906, 5907), // &Nscr -> 𝒩 + new Transition (5908, 5909), // &nscr -> 𝓃 + new Transition (5916, 5917), // &nshortmid -> ∤ + new Transition (5925, 5926), // &nshortparallel -> ∦ + new Transition (5928, 5929), // &nsim -> ≁ + new Transition (5930, 5931), // &nsime -> ≄ + new Transition (5932, 5933), // &nsimeq -> ≄ + new Transition (5936, 5937), // &nsmid -> ∤ + new Transition (5940, 5941), // &nspar -> ∦ + new Transition (5946, 5947), // &nsqsube -> ⋢ + new Transition (5949, 5950), // &nsqsupe -> ⋣ + new Transition (5952, 5953), // &nsub -> ⊄ + new Transition (5954, 5955), // &nsubE -> ⫅̸ + new Transition (5956, 5957), // &nsube -> ⊈ + new Transition (5960, 5961), // &nsubset -> ⊂⃒ + new Transition (5963, 5964), // &nsubseteq -> ⊈ + new Transition (5965, 5966), // &nsubseteqq -> ⫅̸ + new Transition (5968, 5969), // &nsucc -> ⊁ + new Transition (5971, 5972), // &nsucceq -> ⪰̸ + new Transition (5973, 5974), // &nsup -> ⊅ + new Transition (5975, 5976), // &nsupE -> ⫆̸ + new Transition (5977, 5978), // &nsupe -> ⊉ + new Transition (5981, 5982), // &nsupset -> ⊃⃒ + new Transition (5984, 5985), // &nsupseteq -> ⊉ + new Transition (5986, 5987), // &nsupseteqq -> ⫆̸ + new Transition (5990, 5991), // &ntgl -> ≹ + new Transition (5996, 5997), // Ñ -> Ñ + new Transition (6001, 6002), // ñ -> ñ + new Transition (6004, 6005), // &ntlg -> ≸ + new Transition (6016, 6017), // &ntriangleleft -> ⋪ + new Transition (6019, 6020), // &ntrianglelefteq -> ⋬ + new Transition (6025, 6026), // &ntriangleright -> ⋫ + new Transition (6028, 6029), // &ntrianglerighteq -> ⋭ + new Transition (6030, 6031), // &Nu -> Ν + new Transition (6032, 6033), // &nu -> ν + new Transition (6034, 6035), // &num -> # + new Transition (6038, 6039), // &numero -> № + new Transition (6041, 6042), // &numsp ->   + new Transition (6045, 6046), // &nvap -> ≍⃒ + new Transition (6051, 6052), // &nVDash -> ⊯ + new Transition (6056, 6057), // &nVdash -> ⊮ + new Transition (6061, 6062), // &nvDash -> ⊭ + new Transition (6066, 6067), // &nvdash -> ⊬ + new Transition (6069, 6070), // &nvge -> ≥⃒ + new Transition (6071, 6072), // &nvgt -> >⃒ + new Transition (6076, 6077), // &nvHarr -> ⤄ + new Transition (6082, 6083), // &nvinfin -> ⧞ + new Transition (6087, 6088), // &nvlArr -> ⤂ + new Transition (6089, 6090), // &nvle -> ≤⃒ + new Transition (6091, 6092), // &nvlt -> <⃒ + new Transition (6095, 6096), // &nvltrie -> ⊴⃒ + new Transition (6100, 6101), // &nvrArr -> ⤃ + new Transition (6105, 6106), // &nvrtrie -> ⊵⃒ + new Transition (6109, 6110), // &nvsim -> ∼⃒ + new Transition (6115, 6116), // &nwarhk -> ⤣ + new Transition (6119, 6120), // &nwArr -> ⇖ + new Transition (6121, 6122), // &nwarr -> ↖ + new Transition (6124, 6125), // &nwarrow -> ↖ + new Transition (6129, 6130), // &nwnear -> ⤧ + new Transition (6136, 6137), // Ó -> Ó + new Transition (6143, 6144), // ó -> ó + new Transition (6146, 6147), // &oast -> ⊛ + new Transition (6150, 6151), // &ocir -> ⊚ + new Transition (6155, 6156), // Ô -> Ô + new Transition (6157, 6158), // ô -> ô + new Transition (6159, 6160), // &Ocy -> О + new Transition (6161, 6162), // &ocy -> о + new Transition (6166, 6167), // &odash -> ⊝ + new Transition (6172, 6173), // &Odblac -> Ő + new Transition (6177, 6178), // &odblac -> ő + new Transition (6180, 6181), // &odiv -> ⨸ + new Transition (6183, 6184), // &odot -> ⊙ + new Transition (6188, 6189), // &odsold -> ⦼ + new Transition (6193, 6194), // &OElig -> Œ + new Transition (6198, 6199), // &oelig -> œ + new Transition (6203, 6204), // &ofcir -> ⦿ + new Transition (6206, 6207), // &Ofr -> 𝔒 + new Transition (6208, 6209), // &ofr -> 𝔬 + new Transition (6212, 6213), // &ogon -> ˛ + new Transition (6218, 6219), // Ò -> Ò + new Transition (6223, 6224), // ò -> ò + new Transition (6225, 6226), // &ogt -> ⧁ + new Transition (6230, 6231), // &ohbar -> ⦵ + new Transition (6232, 6233), // &ohm -> Ω + new Transition (6236, 6237), // &oint -> ∮ + new Transition (6241, 6242), // &olarr -> ↺ + new Transition (6245, 6246), // &olcir -> ⦾ + new Transition (6250, 6251), // &olcross -> ⦻ + new Transition (6254, 6255), // &oline -> ‾ + new Transition (6256, 6257), // &olt -> ⧀ + new Transition (6261, 6262), // &Omacr -> Ō + new Transition (6266, 6267), // &omacr -> ō + new Transition (6270, 6271), // &Omega -> Ω + new Transition (6274, 6275), // &omega -> ω + new Transition (6280, 6281), // &Omicron -> Ο + new Transition (6286, 6287), // &omicron -> ο + new Transition (6288, 6289), // &omid -> ⦶ + new Transition (6292, 6293), // &ominus -> ⊖ + new Transition (6296, 6297), // &Oopf -> 𝕆 + new Transition (6300, 6301), // &oopf -> 𝕠 + new Transition (6304, 6305), // &opar -> ⦷ + new Transition (6324, 6325), // &OpenCurlyDoubleQuote -> “ + new Transition (6330, 6331), // &OpenCurlyQuote -> ‘ + new Transition (6334, 6335), // &operp -> ⦹ + new Transition (6338, 6339), // &oplus -> ⊕ + new Transition (6340, 6341), // &Or -> ⩔ + new Transition (6342, 6343), // &or -> ∨ + new Transition (6346, 6347), // &orarr -> ↻ + new Transition (6348, 6349), // &ord -> ⩝ + new Transition (6351, 6352), // &order -> ℴ + new Transition (6354, 6355), // &orderof -> ℴ + new Transition (6356, 6357), // ª -> ª + new Transition (6358, 6359), // º -> º + new Transition (6363, 6364), // &origof -> ⊶ + new Transition (6366, 6367), // &oror -> ⩖ + new Transition (6372, 6373), // &orslope -> ⩗ + new Transition (6374, 6375), // &orv -> ⩛ + new Transition (6376, 6377), // &oS -> Ⓢ + new Transition (6380, 6381), // &Oscr -> 𝒪 + new Transition (6384, 6385), // &oscr -> ℴ + new Transition (6389, 6390), // Ø -> Ø + new Transition (6394, 6395), // ø -> ø + new Transition (6397, 6398), // &osol -> ⊘ + new Transition (6403, 6404), // Õ -> Õ + new Transition (6409, 6410), // õ -> õ + new Transition (6413, 6414), // &Otimes -> ⨷ + new Transition (6417, 6418), // &otimes -> ⊗ + new Transition (6420, 6421), // &otimesas -> ⨶ + new Transition (6424, 6425), // Ö -> Ö + new Transition (6428, 6429), // ö -> ö + new Transition (6433, 6434), // &ovbar -> ⌽ + new Transition (6440, 6441), // &OverBar -> ‾ + new Transition (6445, 6446), // &OverBrace -> ⏞ + new Transition (6449, 6450), // &OverBracket -> ⎴ + new Transition (6461, 6462), // &OverParenthesis -> ⏜ + new Transition (6465, 6466), // &par -> ∥ + new Transition (6467, 6468), // ¶ -> ¶ + new Transition (6472, 6473), // ¶llel -> ∥ + new Transition (6476, 6477), // &parsim -> ⫳ + new Transition (6478, 6479), // &parsl -> ⫽ + new Transition (6480, 6481), // &part -> ∂ + new Transition (6489, 6490), // &PartialD -> ∂ + new Transition (6492, 6493), // &Pcy -> П + new Transition (6495, 6496), // &pcy -> п + new Transition (6501, 6502), // &percnt -> % + new Transition (6505, 6506), // &period -> . + new Transition (6509, 6510), // &permil -> ‰ + new Transition (6511, 6512), // &perp -> ⊥ + new Transition (6516, 6517), // &pertenk -> ‱ + new Transition (6519, 6520), // &Pfr -> 𝔓 + new Transition (6522, 6523), // &pfr -> 𝔭 + new Transition (6525, 6526), // &Phi -> Φ + new Transition (6528, 6529), // &phi -> φ + new Transition (6530, 6531), // &phiv -> ϕ + new Transition (6535, 6536), // &phmmat -> ℳ + new Transition (6539, 6540), // &phone -> ☎ + new Transition (6541, 6542), // &Pi -> Π + new Transition (6543, 6544), // &pi -> π + new Transition (6551, 6552), // &pitchfork -> ⋔ + new Transition (6553, 6554), // &piv -> ϖ + new Transition (6559, 6560), // &planck -> ℏ + new Transition (6561, 6562), // &planckh -> ℎ + new Transition (6564, 6565), // &plankv -> ℏ + new Transition (6567, 6568), // &plus -> + + new Transition (6572, 6573), // &plusacir -> ⨣ + new Transition (6574, 6575), // &plusb -> ⊞ + new Transition (6578, 6579), // &pluscir -> ⨢ + new Transition (6581, 6582), // &plusdo -> ∔ + new Transition (6583, 6584), // &plusdu -> ⨥ + new Transition (6585, 6586), // &pluse -> ⩲ + new Transition (6594, 6595), // &PlusMinus -> ± + new Transition (6597, 6598), // ± -> ± + new Transition (6601, 6602), // &plussim -> ⨦ + new Transition (6605, 6606), // &plustwo -> ⨧ + new Transition (6607, 6608), // &pm -> ± + new Transition (6620, 6621), // &Poincareplane -> ℌ + new Transition (6628, 6629), // &pointint -> ⨕ + new Transition (6631, 6632), // &Popf -> ℙ + new Transition (6634, 6635), // &popf -> 𝕡 + new Transition (6638, 6639), // £ -> £ + new Transition (6640, 6641), // &Pr -> ⪻ + new Transition (6642, 6643), // &pr -> ≺ + new Transition (6645, 6646), // &prap -> ⪷ + new Transition (6649, 6650), // &prcue -> ≼ + new Transition (6651, 6652), // &prE -> ⪳ + new Transition (6653, 6654), // &pre -> ⪯ + new Transition (6655, 6656), // &prec -> ≺ + new Transition (6662, 6663), // &precapprox -> ⪷ + new Transition (6670, 6671), // &preccurlyeq -> ≼ + new Transition (6677, 6678), // &Precedes -> ≺ + new Transition (6683, 6684), // &PrecedesEqual -> ⪯ + new Transition (6694, 6695), // &PrecedesSlantEqual -> ≼ + new Transition (6700, 6701), // &PrecedesTilde -> ≾ + new Transition (6703, 6704), // &preceq -> ⪯ + new Transition (6711, 6712), // &precnapprox -> ⪹ + new Transition (6715, 6716), // &precneqq -> ⪵ + new Transition (6719, 6720), // &precnsim -> ⋨ + new Transition (6723, 6724), // &precsim -> ≾ + new Transition (6727, 6728), // &Prime -> ″ + new Transition (6731, 6732), // &prime -> ′ + new Transition (6733, 6734), // &primes -> ℙ + new Transition (6737, 6738), // &prnap -> ⪹ + new Transition (6739, 6740), // &prnE -> ⪵ + new Transition (6743, 6744), // &prnsim -> ⋨ + new Transition (6746, 6747), // &prod -> ∏ + new Transition (6752, 6753), // &Product -> ∏ + new Transition (6758, 6759), // &profalar -> ⌮ + new Transition (6763, 6764), // &profline -> ⌒ + new Transition (6768, 6769), // &profsurf -> ⌓ + new Transition (6770, 6771), // &prop -> ∝ + new Transition (6778, 6779), // &Proportion -> ∷ + new Transition (6781, 6782), // &Proportional -> ∝ + new Transition (6784, 6785), // &propto -> ∝ + new Transition (6788, 6789), // &prsim -> ≾ + new Transition (6793, 6794), // &prurel -> ⊰ + new Transition (6797, 6798), // &Pscr -> 𝒫 + new Transition (6801, 6802), // &pscr -> 𝓅 + new Transition (6803, 6804), // &Psi -> Ψ + new Transition (6805, 6806), // &psi -> ψ + new Transition (6811, 6812), // &puncsp ->   + new Transition (6815, 6816), // &Qfr -> 𝔔 + new Transition (6819, 6820), // &qfr -> 𝔮 + new Transition (6823, 6824), // &qint -> ⨌ + new Transition (6827, 6828), // &Qopf -> ℚ + new Transition (6831, 6832), // &qopf -> 𝕢 + new Transition (6837, 6838), // &qprime -> ⁗ + new Transition (6841, 6842), // &Qscr -> 𝒬 + new Transition (6845, 6846), // &qscr -> 𝓆 + new Transition (6856, 6857), // &quaternions -> ℍ + new Transition (6860, 6861), // &quatint -> ⨖ + new Transition (6864, 6865), // &quest -> ? + new Transition (6867, 6868), // &questeq -> ≟ + new Transition (6871, 6872), // " -> " + new Transition (6874, 6875), // " -> " + new Transition (6880, 6881), // &rAarr -> ⇛ + new Transition (6884, 6885), // &race -> ∽̱ + new Transition (6891, 6892), // &Racute -> Ŕ + new Transition (6895, 6896), // &racute -> ŕ + new Transition (6899, 6900), // &radic -> √ + new Transition (6906, 6907), // &raemptyv -> ⦳ + new Transition (6909, 6910), // &Rang -> ⟫ + new Transition (6912, 6913), // &rang -> ⟩ + new Transition (6914, 6915), // &rangd -> ⦒ + new Transition (6916, 6917), // &range -> ⦥ + new Transition (6919, 6920), // &rangle -> ⟩ + new Transition (6923, 6924), // » -> » + new Transition (6926, 6927), // &Rarr -> ↠ + new Transition (6929, 6930), // &rArr -> ⇒ + new Transition (6932, 6933), // &rarr -> → + new Transition (6935, 6936), // &rarrap -> ⥵ + new Transition (6937, 6938), // &rarrb -> ⇥ + new Transition (6940, 6941), // &rarrbfs -> ⤠ + new Transition (6942, 6943), // &rarrc -> ⤳ + new Transition (6945, 6946), // &rarrfs -> ⤞ + new Transition (6948, 6949), // &rarrhk -> ↪ + new Transition (6951, 6952), // &rarrlp -> ↬ + new Transition (6954, 6955), // &rarrpl -> ⥅ + new Transition (6958, 6959), // &rarrsim -> ⥴ + new Transition (6961, 6962), // &Rarrtl -> ⤖ + new Transition (6964, 6965), // &rarrtl -> ↣ + new Transition (6966, 6967), // &rarrw -> ↝ + new Transition (6971, 6972), // &rAtail -> ⤜ + new Transition (6976, 6977), // &ratail -> ⤚ + new Transition (6979, 6980), // &ratio -> ∶ + new Transition (6984, 6985), // &rationals -> ℚ + new Transition (6989, 6990), // &RBarr -> ⤐ + new Transition (6994, 6995), // &rBarr -> ⤏ + new Transition (6999, 7000), // &rbarr -> ⤍ + new Transition (7003, 7004), // &rbbrk -> ❳ + new Transition (7008, 7009), // &rbrace -> } + new Transition (7010, 7011), // &rbrack -> ] + new Transition (7013, 7014), // &rbrke -> ⦌ + new Transition (7017, 7018), // &rbrksld -> ⦎ + new Transition (7019, 7020), // &rbrkslu -> ⦐ + new Transition (7025, 7026), // &Rcaron -> Ř + new Transition (7031, 7032), // &rcaron -> ř + new Transition (7036, 7037), // &Rcedil -> Ŗ + new Transition (7041, 7042), // &rcedil -> ŗ + new Transition (7044, 7045), // &rceil -> ⌉ + new Transition (7047, 7048), // &rcub -> } + new Transition (7049, 7050), // &Rcy -> Р + new Transition (7051, 7052), // &rcy -> р + new Transition (7055, 7056), // &rdca -> ⤷ + new Transition (7061, 7062), // &rdldhar -> ⥩ + new Transition (7065, 7066), // &rdquo -> ” + new Transition (7067, 7068), // &rdquor -> ” + new Transition (7070, 7071), // &rdsh -> ↳ + new Transition (7072, 7073), // &Re -> ℜ + new Transition (7076, 7077), // &real -> ℜ + new Transition (7080, 7081), // &realine -> ℛ + new Transition (7085, 7086), // &realpart -> ℜ + new Transition (7087, 7088), // &reals -> ℝ + new Transition (7090, 7091), // &rect -> ▭ + new Transition (7093, 7094), // ® -> ® + new Transition (7095, 7096), // ® -> ® + new Transition (7108, 7109), // &ReverseElement -> ∋ + new Transition (7119, 7120), // &ReverseEquilibrium -> ⇋ + new Transition (7133, 7134), // &ReverseUpEquilibrium -> ⥯ + new Transition (7139, 7140), // &rfisht -> ⥽ + new Transition (7144, 7145), // &rfloor -> ⌋ + new Transition (7147, 7148), // &Rfr -> ℜ + new Transition (7149, 7150), // &rfr -> 𝔯 + new Transition (7153, 7154), // &rHar -> ⥤ + new Transition (7158, 7159), // &rhard -> ⇁ + new Transition (7160, 7161), // &rharu -> ⇀ + new Transition (7162, 7163), // &rharul -> ⥬ + new Transition (7165, 7166), // &Rho -> Ρ + new Transition (7167, 7168), // &rho -> ρ + new Transition (7169, 7170), // &rhov -> ϱ + new Transition (7186, 7187), // &RightAngleBracket -> ⟩ + new Transition (7191, 7192), // &RightArrow -> → + new Transition (7197, 7198), // &Rightarrow -> ⇒ + new Transition (7207, 7208), // &rightarrow -> → + new Transition (7211, 7212), // &RightArrowBar -> ⇥ + new Transition (7221, 7222), // &RightArrowLeftArrow -> ⇄ + new Transition (7226, 7227), // &rightarrowtail -> ↣ + new Transition (7234, 7235), // &RightCeiling -> ⌉ + new Transition (7248, 7249), // &RightDoubleBracket -> ⟧ + new Transition (7260, 7261), // &RightDownTeeVector -> ⥝ + new Transition (7267, 7268), // &RightDownVector -> ⇂ + new Transition (7271, 7272), // &RightDownVectorBar -> ⥕ + new Transition (7277, 7278), // &RightFloor -> ⌋ + new Transition (7289, 7290), // &rightharpoondown -> ⇁ + new Transition (7292, 7293), // &rightharpoonup -> ⇀ + new Transition (7303, 7304), // &rightleftarrows -> ⇄ + new Transition (7312, 7313), // &rightleftharpoons -> ⇌ + new Transition (7324, 7325), // &rightrightarrows -> ⇉ + new Transition (7335, 7336), // &rightsquigarrow -> ↝ + new Transition (7339, 7340), // &RightTee -> ⊢ + new Transition (7345, 7346), // &RightTeeArrow -> ↦ + new Transition (7352, 7353), // &RightTeeVector -> ⥛ + new Transition (7363, 7364), // &rightthreetimes -> ⋌ + new Transition (7371, 7372), // &RightTriangle -> ⊳ + new Transition (7375, 7376), // &RightTriangleBar -> ⧐ + new Transition (7381, 7382), // &RightTriangleEqual -> ⊵ + new Transition (7394, 7395), // &RightUpDownVector -> ⥏ + new Transition (7404, 7405), // &RightUpTeeVector -> ⥜ + new Transition (7411, 7412), // &RightUpVector -> ↾ + new Transition (7415, 7416), // &RightUpVectorBar -> ⥔ + new Transition (7422, 7423), // &RightVector -> ⇀ + new Transition (7426, 7427), // &RightVectorBar -> ⥓ + new Transition (7429, 7430), // &ring -> ˚ + new Transition (7440, 7441), // &risingdotseq -> ≓ + new Transition (7445, 7446), // &rlarr -> ⇄ + new Transition (7449, 7450), // &rlhar -> ⇌ + new Transition (7451, 7452), // &rlm -> ‏ + new Transition (7457, 7458), // &rmoust -> ⎱ + new Transition (7462, 7463), // &rmoustache -> ⎱ + new Transition (7467, 7468), // &rnmid -> ⫮ + new Transition (7472, 7473), // &roang -> ⟭ + new Transition (7475, 7476), // &roarr -> ⇾ + new Transition (7479, 7480), // &robrk -> ⟧ + new Transition (7483, 7484), // &ropar -> ⦆ + new Transition (7487, 7488), // &Ropf -> ℝ + new Transition (7489, 7490), // &ropf -> 𝕣 + new Transition (7493, 7494), // &roplus -> ⨮ + new Transition (7499, 7500), // &rotimes -> ⨵ + new Transition (7510, 7511), // &RoundImplies -> ⥰ + new Transition (7514, 7515), // &rpar -> ) + new Transition (7517, 7518), // &rpargt -> ⦔ + new Transition (7524, 7525), // &rppolint -> ⨒ + new Transition (7529, 7530), // &rrarr -> ⇉ + new Transition (7540, 7541), // &Rrightarrow -> ⇛ + new Transition (7546, 7547), // &rsaquo -> › + new Transition (7550, 7551), // &Rscr -> ℛ + new Transition (7553, 7554), // &rscr -> 𝓇 + new Transition (7555, 7556), // &Rsh -> ↱ + new Transition (7557, 7558), // &rsh -> ↱ + new Transition (7560, 7561), // &rsqb -> ] + new Transition (7563, 7564), // &rsquo -> ’ + new Transition (7565, 7566), // &rsquor -> ’ + new Transition (7571, 7572), // &rthree -> ⋌ + new Transition (7576, 7577), // &rtimes -> ⋊ + new Transition (7579, 7580), // &rtri -> ▹ + new Transition (7581, 7582), // &rtrie -> ⊵ + new Transition (7583, 7584), // &rtrif -> ▸ + new Transition (7588, 7589), // &rtriltri -> ⧎ + new Transition (7599, 7600), // &RuleDelayed -> ⧴ + new Transition (7606, 7607), // &ruluhar -> ⥨ + new Transition (7608, 7609), // &rx -> ℞ + new Transition (7615, 7616), // &Sacute -> Ś + new Transition (7622, 7623), // &sacute -> ś + new Transition (7627, 7628), // &sbquo -> ‚ + new Transition (7629, 7630), // &Sc -> ⪼ + new Transition (7631, 7632), // &sc -> ≻ + new Transition (7634, 7635), // &scap -> ⪸ + new Transition (7639, 7640), // &Scaron -> Š + new Transition (7643, 7644), // &scaron -> š + new Transition (7647, 7648), // &sccue -> ≽ + new Transition (7649, 7650), // &scE -> ⪴ + new Transition (7651, 7652), // &sce -> ⪰ + new Transition (7656, 7657), // &Scedil -> Ş + new Transition (7660, 7661), // &scedil -> ş + new Transition (7664, 7665), // &Scirc -> Ŝ + new Transition (7668, 7669), // &scirc -> ŝ + new Transition (7672, 7673), // &scnap -> ⪺ + new Transition (7674, 7675), // &scnE -> ⪶ + new Transition (7678, 7679), // &scnsim -> ⋩ + new Transition (7685, 7686), // &scpolint -> ⨓ + new Transition (7689, 7690), // &scsim -> ≿ + new Transition (7691, 7692), // &Scy -> С + new Transition (7693, 7694), // &scy -> с + new Transition (7697, 7698), // &sdot -> ⋅ + new Transition (7699, 7700), // &sdotb -> ⊡ + new Transition (7701, 7702), // &sdote -> ⩦ + new Transition (7707, 7708), // &searhk -> ⤥ + new Transition (7711, 7712), // &seArr -> ⇘ + new Transition (7713, 7714), // &searr -> ↘ + new Transition (7716, 7717), // &searrow -> ↘ + new Transition (7719, 7720), // § -> § + new Transition (7722, 7723), // &semi -> ; + new Transition (7727, 7728), // &seswar -> ⤩ + new Transition (7734, 7735), // &setminus -> ∖ + new Transition (7736, 7737), // &setmn -> ∖ + new Transition (7739, 7740), // &sext -> ✶ + new Transition (7742, 7743), // &Sfr -> 𝔖 + new Transition (7745, 7746), // &sfr -> 𝔰 + new Transition (7749, 7750), // &sfrown -> ⌢ + new Transition (7754, 7755), // &sharp -> ♯ + new Transition (7760, 7761), // &SHCHcy -> Щ + new Transition (7765, 7766), // &shchcy -> щ + new Transition (7768, 7769), // &SHcy -> Ш + new Transition (7770, 7771), // &shcy -> ш + new Transition (7784, 7785), // &ShortDownArrow -> ↓ + new Transition (7794, 7795), // &ShortLeftArrow -> ← + new Transition (7801, 7802), // &shortmid -> ∣ + new Transition (7810, 7811), // &shortparallel -> ∥ + new Transition (7821, 7822), // &ShortRightArrow -> → + new Transition (7829, 7830), // &ShortUpArrow -> ↑ + new Transition (7831, 7832), // ­ -> ­ + new Transition (7836, 7837), // &Sigma -> Σ + new Transition (7841, 7842), // &sigma -> σ + new Transition (7843, 7844), // &sigmaf -> ς + new Transition (7845, 7846), // &sigmav -> ς + new Transition (7847, 7848), // &sim -> ∼ + new Transition (7851, 7852), // &simdot -> ⩪ + new Transition (7853, 7854), // &sime -> ≃ + new Transition (7855, 7856), // &simeq -> ≃ + new Transition (7857, 7858), // &simg -> ⪞ + new Transition (7859, 7860), // &simgE -> ⪠ + new Transition (7861, 7862), // &siml -> ⪝ + new Transition (7863, 7864), // &simlE -> ⪟ + new Transition (7866, 7867), // &simne -> ≆ + new Transition (7871, 7872), // &simplus -> ⨤ + new Transition (7876, 7877), // &simrarr -> ⥲ + new Transition (7881, 7882), // &slarr -> ← + new Transition (7892, 7893), // &SmallCircle -> ∘ + new Transition (7905, 7906), // &smallsetminus -> ∖ + new Transition (7909, 7910), // &smashp -> ⨳ + new Transition (7916, 7917), // &smeparsl -> ⧤ + new Transition (7919, 7920), // &smid -> ∣ + new Transition (7922, 7923), // &smile -> ⌣ + new Transition (7924, 7925), // &smt -> ⪪ + new Transition (7926, 7927), // &smte -> ⪬ + new Transition (7928, 7929), // &smtes -> ⪬︀ + new Transition (7934, 7935), // &SOFTcy -> Ь + new Transition (7940, 7941), // &softcy -> ь + new Transition (7942, 7943), // &sol -> / + new Transition (7944, 7945), // &solb -> ⧄ + new Transition (7947, 7948), // &solbar -> ⌿ + new Transition (7951, 7952), // &Sopf -> 𝕊 + new Transition (7954, 7955), // &sopf -> 𝕤 + new Transition (7960, 7961), // &spades -> ♠ + new Transition (7964, 7965), // &spadesuit -> ♠ + new Transition (7966, 7967), // &spar -> ∥ + new Transition (7971, 7972), // &sqcap -> ⊓ + new Transition (7973, 7974), // &sqcaps -> ⊓︀ + new Transition (7976, 7977), // &sqcup -> ⊔ + new Transition (7978, 7979), // &sqcups -> ⊔︀ + new Transition (7982, 7983), // &Sqrt -> √ + new Transition (7986, 7987), // &sqsub -> ⊏ + new Transition (7988, 7989), // &sqsube -> ⊑ + new Transition (7992, 7993), // &sqsubset -> ⊏ + new Transition (7995, 7996), // &sqsubseteq -> ⊑ + new Transition (7997, 7998), // &sqsup -> ⊐ + new Transition (7999, 8000), // &sqsupe -> ⊒ + new Transition (8003, 8004), // &sqsupset -> ⊐ + new Transition (8006, 8007), // &sqsupseteq -> ⊒ + new Transition (8008, 8009), // &squ -> □ + new Transition (8013, 8014), // &Square -> □ + new Transition (8017, 8018), // &square -> □ + new Transition (8030, 8031), // &SquareIntersection -> ⊓ + new Transition (8037, 8038), // &SquareSubset -> ⊏ + new Transition (8043, 8044), // &SquareSubsetEqual -> ⊑ + new Transition (8050, 8051), // &SquareSuperset -> ⊐ + new Transition (8056, 8057), // &SquareSupersetEqual -> ⊒ + new Transition (8062, 8063), // &SquareUnion -> ⊔ + new Transition (8064, 8065), // &squarf -> ▪ + new Transition (8066, 8067), // &squf -> ▪ + new Transition (8071, 8072), // &srarr -> → + new Transition (8075, 8076), // &Sscr -> 𝒮 + new Transition (8079, 8080), // &sscr -> 𝓈 + new Transition (8084, 8085), // &ssetmn -> ∖ + new Transition (8089, 8090), // &ssmile -> ⌣ + new Transition (8094, 8095), // &sstarf -> ⋆ + new Transition (8098, 8099), // &Star -> ⋆ + new Transition (8102, 8103), // &star -> ☆ + new Transition (8104, 8105), // &starf -> ★ + new Transition (8118, 8119), // &straightepsilon -> ϵ + new Transition (8122, 8123), // &straightphi -> ϕ + new Transition (8125, 8126), // &strns -> ¯ + new Transition (8128, 8129), // &Sub -> ⋐ + new Transition (8131, 8132), // &sub -> ⊂ + new Transition (8135, 8136), // &subdot -> ⪽ + new Transition (8137, 8138), // &subE -> ⫅ + new Transition (8139, 8140), // &sube -> ⊆ + new Transition (8143, 8144), // &subedot -> ⫃ + new Transition (8148, 8149), // &submult -> ⫁ + new Transition (8151, 8152), // &subnE -> ⫋ + new Transition (8153, 8154), // &subne -> ⊊ + new Transition (8158, 8159), // &subplus -> ⪿ + new Transition (8163, 8164), // &subrarr -> ⥹ + new Transition (8167, 8168), // &Subset -> ⋐ + new Transition (8171, 8172), // &subset -> ⊂ + new Transition (8174, 8175), // &subseteq -> ⊆ + new Transition (8176, 8177), // &subseteqq -> ⫅ + new Transition (8182, 8183), // &SubsetEqual -> ⊆ + new Transition (8186, 8187), // &subsetneq -> ⊊ + new Transition (8188, 8189), // &subsetneqq -> ⫋ + new Transition (8191, 8192), // &subsim -> ⫇ + new Transition (8194, 8195), // &subsub -> ⫕ + new Transition (8196, 8197), // &subsup -> ⫓ + new Transition (8199, 8200), // &succ -> ≻ + new Transition (8206, 8207), // &succapprox -> ⪸ + new Transition (8214, 8215), // &succcurlyeq -> ≽ + new Transition (8221, 8222), // &Succeeds -> ≻ + new Transition (8227, 8228), // &SucceedsEqual -> ⪰ + new Transition (8238, 8239), // &SucceedsSlantEqual -> ≽ + new Transition (8244, 8245), // &SucceedsTilde -> ≿ + new Transition (8247, 8248), // &succeq -> ⪰ + new Transition (8255, 8256), // &succnapprox -> ⪺ + new Transition (8259, 8260), // &succneqq -> ⪶ + new Transition (8263, 8264), // &succnsim -> ⋩ + new Transition (8267, 8268), // &succsim -> ≿ + new Transition (8273, 8274), // &SuchThat -> ∋ + new Transition (8275, 8276), // &Sum -> ∑ + new Transition (8277, 8278), // &sum -> ∑ + new Transition (8280, 8281), // &sung -> ♪ + new Transition (8282, 8283), // &Sup -> ⋑ + new Transition (8284, 8285), // &sup -> ⊃ + new Transition (8286, 8287), // ¹ -> ¹ + new Transition (8288, 8289), // ² -> ² + new Transition (8290, 8291), // ³ -> ³ + new Transition (8294, 8295), // &supdot -> ⪾ + new Transition (8298, 8299), // &supdsub -> ⫘ + new Transition (8300, 8301), // &supE -> ⫆ + new Transition (8302, 8303), // &supe -> ⊇ + new Transition (8306, 8307), // &supedot -> ⫄ + new Transition (8312, 8313), // &Superset -> ⊃ + new Transition (8318, 8319), // &SupersetEqual -> ⊇ + new Transition (8323, 8324), // &suphsol -> ⟉ + new Transition (8326, 8327), // &suphsub -> ⫗ + new Transition (8331, 8332), // &suplarr -> ⥻ + new Transition (8336, 8337), // &supmult -> ⫂ + new Transition (8339, 8340), // &supnE -> ⫌ + new Transition (8341, 8342), // &supne -> ⊋ + new Transition (8346, 8347), // &supplus -> ⫀ + new Transition (8350, 8351), // &Supset -> ⋑ + new Transition (8354, 8355), // &supset -> ⊃ + new Transition (8357, 8358), // &supseteq -> ⊇ + new Transition (8359, 8360), // &supseteqq -> ⫆ + new Transition (8363, 8364), // &supsetneq -> ⊋ + new Transition (8365, 8366), // &supsetneqq -> ⫌ + new Transition (8368, 8369), // &supsim -> ⫈ + new Transition (8371, 8372), // &supsub -> ⫔ + new Transition (8373, 8374), // &supsup -> ⫖ + new Transition (8379, 8380), // &swarhk -> ⤦ + new Transition (8383, 8384), // &swArr -> ⇙ + new Transition (8385, 8386), // &swarr -> ↙ + new Transition (8388, 8389), // &swarrow -> ↙ + new Transition (8393, 8394), // &swnwar -> ⤪ + new Transition (8398, 8399), // ß -> ß + new Transition (8402, 8403), // &Tab -> + new Transition (8409, 8410), // &target -> ⌖ + new Transition (8411, 8412), // &Tau -> Τ + new Transition (8413, 8414), // &tau -> τ + new Transition (8417, 8418), // &tbrk -> ⎴ + new Transition (8423, 8424), // &Tcaron -> Ť + new Transition (8429, 8430), // &tcaron -> ť + new Transition (8434, 8435), // &Tcedil -> Ţ + new Transition (8439, 8440), // &tcedil -> ţ + new Transition (8441, 8442), // &Tcy -> Т + new Transition (8443, 8444), // &tcy -> т + new Transition (8447, 8448), // &tdot -> ⃛ + new Transition (8453, 8454), // &telrec -> ⌕ + new Transition (8456, 8457), // &Tfr -> 𝔗 + new Transition (8459, 8460), // &tfr -> 𝔱 + new Transition (8465, 8466), // &there4 -> ∴ + new Transition (8474, 8475), // &Therefore -> ∴ + new Transition (8479, 8480), // &therefore -> ∴ + new Transition (8482, 8483), // &Theta -> Θ + new Transition (8485, 8486), // &theta -> θ + new Transition (8489, 8490), // &thetasym -> ϑ + new Transition (8491, 8492), // &thetav -> ϑ + new Transition (8501, 8502), // &thickapprox -> ≈ + new Transition (8505, 8506), // &thicksim -> ∼ + new Transition (8514, 8515), // &ThickSpace ->    + new Transition (8518, 8519), // &thinsp ->   + new Transition (8525, 8526), // &ThinSpace ->   + new Transition (8529, 8530), // &thkap -> ≈ + new Transition (8533, 8534), // &thksim -> ∼ + new Transition (8538, 8539), // Þ -> Þ + new Transition (8542, 8543), // þ -> þ + new Transition (8547, 8548), // &Tilde -> ∼ + new Transition (8552, 8553), // &tilde -> ˜ + new Transition (8558, 8559), // &TildeEqual -> ≃ + new Transition (8568, 8569), // &TildeFullEqual -> ≅ + new Transition (8574, 8575), // &TildeTilde -> ≈ + new Transition (8578, 8579), // × -> × + new Transition (8580, 8581), // ×b -> ⊠ + new Transition (8583, 8584), // ×bar -> ⨱ + new Transition (8585, 8586), // ×d -> ⨰ + new Transition (8588, 8589), // &tint -> ∭ + new Transition (8592, 8593), // &toea -> ⤨ + new Transition (8594, 8595), // &top -> ⊤ + new Transition (8598, 8599), // &topbot -> ⌶ + new Transition (8602, 8603), // &topcir -> ⫱ + new Transition (8606, 8607), // &Topf -> 𝕋 + new Transition (8608, 8609), // &topf -> 𝕥 + new Transition (8612, 8613), // &topfork -> ⫚ + new Transition (8615, 8616), // &tosa -> ⤩ + new Transition (8621, 8622), // &tprime -> ‴ + new Transition (8626, 8627), // &TRADE -> ™ + new Transition (8631, 8632), // &trade -> ™ + new Transition (8638, 8639), // &triangle -> ▵ + new Transition (8643, 8644), // &triangledown -> ▿ + new Transition (8648, 8649), // &triangleleft -> ◃ + new Transition (8651, 8652), // &trianglelefteq -> ⊴ + new Transition (8653, 8654), // &triangleq -> ≜ + new Transition (8659, 8660), // &triangleright -> ▹ + new Transition (8662, 8663), // &trianglerighteq -> ⊵ + new Transition (8666, 8667), // &tridot -> ◬ + new Transition (8668, 8669), // &trie -> ≜ + new Transition (8674, 8675), // &triminus -> ⨺ + new Transition (8683, 8684), // &TripleDot -> ⃛ + new Transition (8688, 8689), // &triplus -> ⨹ + new Transition (8691, 8692), // &trisb -> ⧍ + new Transition (8696, 8697), // &tritime -> ⨻ + new Transition (8703, 8704), // &trpezium -> ⏢ + new Transition (8707, 8708), // &Tscr -> 𝒯 + new Transition (8711, 8712), // &tscr -> 𝓉 + new Transition (8715, 8716), // &TScy -> Ц + new Transition (8717, 8718), // &tscy -> ц + new Transition (8721, 8722), // &TSHcy -> Ћ + new Transition (8725, 8726), // &tshcy -> ћ + new Transition (8730, 8731), // &Tstrok -> Ŧ + new Transition (8735, 8736), // &tstrok -> ŧ + new Transition (8740, 8741), // &twixt -> ≬ + new Transition (8755, 8756), // &twoheadleftarrow -> ↞ + new Transition (8766, 8767), // &twoheadrightarrow -> ↠ + new Transition (8773, 8774), // Ú -> Ú + new Transition (8780, 8781), // ú -> ú + new Transition (8783, 8784), // &Uarr -> ↟ + new Transition (8787, 8788), // &uArr -> ⇑ + new Transition (8790, 8791), // &uarr -> ↑ + new Transition (8795, 8796), // &Uarrocir -> ⥉ + new Transition (8800, 8801), // &Ubrcy -> Ў + new Transition (8805, 8806), // &ubrcy -> ў + new Transition (8809, 8810), // &Ubreve -> Ŭ + new Transition (8813, 8814), // &ubreve -> ŭ + new Transition (8818, 8819), // Û -> Û + new Transition (8823, 8824), // û -> û + new Transition (8825, 8826), // &Ucy -> У + new Transition (8827, 8828), // &ucy -> у + new Transition (8832, 8833), // &udarr -> ⇅ + new Transition (8838, 8839), // &Udblac -> Ű + new Transition (8843, 8844), // &udblac -> ű + new Transition (8847, 8848), // &udhar -> ⥮ + new Transition (8853, 8854), // &ufisht -> ⥾ + new Transition (8856, 8857), // &Ufr -> 𝔘 + new Transition (8858, 8859), // &ufr -> 𝔲 + new Transition (8864, 8865), // Ù -> Ù + new Transition (8870, 8871), // ù -> ù + new Transition (8874, 8875), // &uHar -> ⥣ + new Transition (8879, 8880), // &uharl -> ↿ + new Transition (8881, 8882), // &uharr -> ↾ + new Transition (8885, 8886), // &uhblk -> ▀ + new Transition (8891, 8892), // &ulcorn -> ⌜ + new Transition (8894, 8895), // &ulcorner -> ⌜ + new Transition (8898, 8899), // &ulcrop -> ⌏ + new Transition (8902, 8903), // &ultri -> ◸ + new Transition (8907, 8908), // &Umacr -> Ū + new Transition (8912, 8913), // &umacr -> ū + new Transition (8914, 8915), // ¨ -> ¨ + new Transition (8922, 8923), // &UnderBar -> _ + new Transition (8927, 8928), // &UnderBrace -> ⏟ + new Transition (8931, 8932), // &UnderBracket -> ⎵ + new Transition (8943, 8944), // &UnderParenthesis -> ⏝ + new Transition (8947, 8948), // &Union -> ⋃ + new Transition (8952, 8953), // &UnionPlus -> ⊎ + new Transition (8957, 8958), // &Uogon -> Ų + new Transition (8962, 8963), // &uogon -> ų + new Transition (8965, 8966), // &Uopf -> 𝕌 + new Transition (8968, 8969), // &uopf -> 𝕦 + new Transition (8975, 8976), // &UpArrow -> ↑ + new Transition (8981, 8982), // &Uparrow -> ⇑ + new Transition (8988, 8989), // &uparrow -> ↑ + new Transition (8992, 8993), // &UpArrowBar -> ⤒ + new Transition (9002, 9003), // &UpArrowDownArrow -> ⇅ + new Transition (9012, 9013), // &UpDownArrow -> ↕ + new Transition (9022, 9023), // &Updownarrow -> ⇕ + new Transition (9032, 9033), // &updownarrow -> ↕ + new Transition (9044, 9045), // &UpEquilibrium -> ⥮ + new Transition (9056, 9057), // &upharpoonleft -> ↿ + new Transition (9062, 9063), // &upharpoonright -> ↾ + new Transition (9066, 9067), // &uplus -> ⊎ + new Transition (9079, 9080), // &UpperLeftArrow -> ↖ + new Transition (9090, 9091), // &UpperRightArrow -> ↗ + new Transition (9093, 9094), // &Upsi -> ϒ + new Transition (9096, 9097), // &upsi -> υ + new Transition (9098, 9099), // &upsih -> ϒ + new Transition (9102, 9103), // &Upsilon -> Υ + new Transition (9106, 9107), // &upsilon -> υ + new Transition (9110, 9111), // &UpTee -> ⊥ + new Transition (9116, 9117), // &UpTeeArrow -> ↥ + new Transition (9125, 9126), // &upuparrows -> ⇈ + new Transition (9131, 9132), // &urcorn -> ⌝ + new Transition (9134, 9135), // &urcorner -> ⌝ + new Transition (9138, 9139), // &urcrop -> ⌎ + new Transition (9143, 9144), // &Uring -> Ů + new Transition (9147, 9148), // &uring -> ů + new Transition (9151, 9152), // &urtri -> ◹ + new Transition (9155, 9156), // &Uscr -> 𝒰 + new Transition (9159, 9160), // &uscr -> 𝓊 + new Transition (9164, 9165), // &utdot -> ⋰ + new Transition (9170, 9171), // &Utilde -> Ũ + new Transition (9175, 9176), // &utilde -> ũ + new Transition (9178, 9179), // &utri -> ▵ + new Transition (9180, 9181), // &utrif -> ▴ + new Transition (9185, 9186), // &uuarr -> ⇈ + new Transition (9189, 9190), // Ü -> Ü + new Transition (9192, 9193), // ü -> ü + new Transition (9199, 9200), // &uwangle -> ⦧ + new Transition (9206, 9207), // &vangrt -> ⦜ + new Transition (9215, 9216), // &varepsilon -> ϵ + new Transition (9221, 9222), // &varkappa -> ϰ + new Transition (9229, 9230), // &varnothing -> ∅ + new Transition (9233, 9234), // &varphi -> ϕ + new Transition (9235, 9236), // &varpi -> ϖ + new Transition (9241, 9242), // &varpropto -> ∝ + new Transition (9245, 9246), // &vArr -> ⇕ + new Transition (9247, 9248), // &varr -> ↕ + new Transition (9250, 9251), // &varrho -> ϱ + new Transition (9256, 9257), // &varsigma -> ς + new Transition (9265, 9266), // &varsubsetneq -> ⊊︀ + new Transition (9267, 9268), // &varsubsetneqq -> ⫋︀ + new Transition (9275, 9276), // &varsupsetneq -> ⊋︀ + new Transition (9277, 9278), // &varsupsetneqq -> ⫌︀ + new Transition (9283, 9284), // &vartheta -> ϑ + new Transition (9295, 9296), // &vartriangleleft -> ⊲ + new Transition (9301, 9302), // &vartriangleright -> ⊳ + new Transition (9306, 9307), // &Vbar -> ⫫ + new Transition (9310, 9311), // &vBar -> ⫨ + new Transition (9312, 9313), // &vBarv -> ⫩ + new Transition (9315, 9316), // &Vcy -> В + new Transition (9318, 9319), // &vcy -> в + new Transition (9323, 9324), // &VDash -> ⊫ + new Transition (9328, 9329), // &Vdash -> ⊩ + new Transition (9333, 9334), // &vDash -> ⊨ + new Transition (9338, 9339), // &vdash -> ⊢ + new Transition (9340, 9341), // &Vdashl -> ⫦ + new Transition (9343, 9344), // &Vee -> ⋁ + new Transition (9346, 9347), // &vee -> ∨ + new Transition (9350, 9351), // &veebar -> ⊻ + new Transition (9353, 9354), // &veeeq -> ≚ + new Transition (9358, 9359), // &vellip -> ⋮ + new Transition (9363, 9364), // &Verbar -> ‖ + new Transition (9368, 9369), // &verbar -> | + new Transition (9370, 9371), // &Vert -> ‖ + new Transition (9372, 9373), // &vert -> | + new Transition (9380, 9381), // &VerticalBar -> ∣ + new Transition (9385, 9386), // &VerticalLine -> | + new Transition (9395, 9396), // &VerticalSeparator -> ❘ + new Transition (9401, 9402), // &VerticalTilde -> ≀ + new Transition (9412, 9413), // &VeryThinSpace ->   + new Transition (9415, 9416), // &Vfr -> 𝔙 + new Transition (9418, 9419), // &vfr -> 𝔳 + new Transition (9423, 9424), // &vltri -> ⊲ + new Transition (9428, 9429), // &vnsub -> ⊂⃒ + new Transition (9430, 9431), // &vnsup -> ⊃⃒ + new Transition (9434, 9435), // &Vopf -> 𝕍 + new Transition (9438, 9439), // &vopf -> 𝕧 + new Transition (9443, 9444), // &vprop -> ∝ + new Transition (9448, 9449), // &vrtri -> ⊳ + new Transition (9452, 9453), // &Vscr -> 𝒱 + new Transition (9456, 9457), // &vscr -> 𝓋 + new Transition (9461, 9462), // &vsubnE -> ⫋︀ + new Transition (9463, 9464), // &vsubne -> ⊊︀ + new Transition (9467, 9468), // &vsupnE -> ⫌︀ + new Transition (9469, 9470), // &vsupne -> ⊋︀ + new Transition (9475, 9476), // &Vvdash -> ⊪ + new Transition (9482, 9483), // &vzigzag -> ⦚ + new Transition (9488, 9489), // &Wcirc -> Ŵ + new Transition (9494, 9495), // &wcirc -> ŵ + new Transition (9500, 9501), // &wedbar -> ⩟ + new Transition (9505, 9506), // &Wedge -> ⋀ + new Transition (9508, 9509), // &wedge -> ∧ + new Transition (9510, 9511), // &wedgeq -> ≙ + new Transition (9515, 9516), // &weierp -> ℘ + new Transition (9518, 9519), // &Wfr -> 𝔚 + new Transition (9521, 9522), // &wfr -> 𝔴 + new Transition (9525, 9526), // &Wopf -> 𝕎 + new Transition (9529, 9530), // &wopf -> 𝕨 + new Transition (9531, 9532), // &wp -> ℘ + new Transition (9533, 9534), // &wr -> ≀ + new Transition (9538, 9539), // &wreath -> ≀ + new Transition (9542, 9543), // &Wscr -> 𝒲 + new Transition (9546, 9547), // &wscr -> 𝓌 + new Transition (9551, 9552), // &xcap -> ⋂ + new Transition (9555, 9556), // &xcirc -> ◯ + new Transition (9558, 9559), // &xcup -> ⋃ + new Transition (9563, 9564), // &xdtri -> ▽ + new Transition (9567, 9568), // &Xfr -> 𝔛 + new Transition (9570, 9571), // &xfr -> 𝔵 + new Transition (9575, 9576), // &xhArr -> ⟺ + new Transition (9579, 9580), // &xharr -> ⟷ + new Transition (9581, 9582), // &Xi -> Ξ + new Transition (9583, 9584), // &xi -> ξ + new Transition (9588, 9589), // &xlArr -> ⟸ + new Transition (9592, 9593), // &xlarr -> ⟵ + new Transition (9596, 9597), // &xmap -> ⟼ + new Transition (9600, 9601), // &xnis -> ⋻ + new Transition (9605, 9606), // &xodot -> ⨀ + new Transition (9609, 9610), // &Xopf -> 𝕏 + new Transition (9612, 9613), // &xopf -> 𝕩 + new Transition (9616, 9617), // &xoplus -> ⨁ + new Transition (9621, 9622), // &xotime -> ⨂ + new Transition (9626, 9627), // &xrArr -> ⟹ + new Transition (9630, 9631), // &xrarr -> ⟶ + new Transition (9634, 9635), // &Xscr -> 𝒳 + new Transition (9638, 9639), // &xscr -> 𝓍 + new Transition (9643, 9644), // &xsqcup -> ⨆ + new Transition (9649, 9650), // &xuplus -> ⨄ + new Transition (9653, 9654), // &xutri -> △ + new Transition (9657, 9658), // &xvee -> ⋁ + new Transition (9663, 9664), // &xwedge -> ⋀ + new Transition (9670, 9671), // Ý -> Ý + new Transition (9677, 9678), // ý -> ý + new Transition (9681, 9682), // &YAcy -> Я + new Transition (9683, 9684), // &yacy -> я + new Transition (9688, 9689), // &Ycirc -> Ŷ + new Transition (9693, 9694), // &ycirc -> ŷ + new Transition (9695, 9696), // &Ycy -> Ы + new Transition (9697, 9698), // &ycy -> ы + new Transition (9700, 9701), // ¥ -> ¥ + new Transition (9703, 9704), // &Yfr -> 𝔜 + new Transition (9706, 9707), // &yfr -> 𝔶 + new Transition (9710, 9711), // &YIcy -> Ї + new Transition (9714, 9715), // &yicy -> ї + new Transition (9718, 9719), // &Yopf -> 𝕐 + new Transition (9722, 9723), // &yopf -> 𝕪 + new Transition (9726, 9727), // &Yscr -> 𝒴 + new Transition (9730, 9731), // &yscr -> 𝓎 + new Transition (9734, 9735), // &YUcy -> Ю + new Transition (9738, 9739), // &yucy -> ю + new Transition (9742, 9743), // &Yuml -> Ÿ + new Transition (9745, 9746), // ÿ -> ÿ + new Transition (9752, 9753), // &Zacute -> Ź + new Transition (9759, 9760), // &zacute -> ź + new Transition (9765, 9766), // &Zcaron -> Ž + new Transition (9771, 9772), // &zcaron -> ž + new Transition (9773, 9774), // &Zcy -> З + new Transition (9775, 9776), // &zcy -> з + new Transition (9779, 9780), // &Zdot -> Ż + new Transition (9783, 9784), // &zdot -> ż + new Transition (9789, 9790), // &zeetrf -> ℨ + new Transition (9803, 9804), // &ZeroWidthSpace -> ​ + new Transition (9806, 9807), // &Zeta -> Ζ + new Transition (9809, 9810), // &zeta -> ζ + new Transition (9812, 9813), // &Zfr -> ℨ + new Transition (9815, 9816), // &zfr -> 𝔷 + new Transition (9819, 9820), // &ZHcy -> Ж + new Transition (9823, 9824), // &zhcy -> ж + new Transition (9830, 9831), // &zigrarr -> ⇝ + new Transition (9834, 9835), // &Zopf -> ℤ + new Transition (9838, 9839), // &zopf -> 𝕫 + new Transition (9842, 9843), // &Zscr -> 𝒵 + new Transition (9846, 9847), // &zscr -> 𝓏 + new Transition (9849, 9850), // &zwj -> ‍ + new Transition (9852, 9853) // &zwnj -> ‌ + }; + TransitionTable_A = new Transition[59] { + new Transition (0, 1), // & -> &A + new Transition (1432, 1447), // &d -> &dA + new Transition (1566, 1567), // &Diacritical -> &DiacriticalA + new Transition (1580, 1581), // &DiacriticalDouble -> &DiacriticalDoubleA + new Transition (1769, 1770), // &DoubleDown -> &DoubleDownA + new Transition (1779, 1780), // &DoubleLeft -> &DoubleLeftA + new Transition (1790, 1791), // &DoubleLeftRight -> &DoubleLeftRightA + new Transition (1807, 1808), // &DoubleLongLeft -> &DoubleLongLeftA + new Transition (1818, 1819), // &DoubleLongLeftRight -> &DoubleLongLeftRightA + new Transition (1829, 1830), // &DoubleLongRight -> &DoubleLongRightA + new Transition (1840, 1841), // &DoubleRight -> &DoubleRightA + new Transition (1852, 1853), // &DoubleUp -> &DoubleUpA + new Transition (1862, 1863), // &DoubleUpDown -> &DoubleUpDownA + new Transition (1882, 1883), // &Down -> &DownA + new Transition (1908, 1909), // &DownArrowUp -> &DownArrowUpA + new Transition (2015, 2017), // &DownTee -> &DownTeeA + new Transition (2616, 2617), // &For -> &ForA + new Transition (3014, 3035), // &H -> &HA + new Transition (3020, 3046), // &h -> &hA + new Transition (3692, 3693), // &l -> &lA + new Transition (3900, 3901), // &Left -> &LeftA + new Transition (3941, 3942), // &LeftArrowRight -> &LeftArrowRightA + new Transition (4034, 4035), // &LeftRight -> &LeftRightA + new Transition (4094, 4096), // &LeftTee -> &LeftTeeA + new Transition (4440, 4441), // &LongLeft -> &LongLeftA + new Transition (4473, 4474), // &LongLeftRight -> &LongLeftRightA + new Transition (4513, 4514), // &LongRight -> &LongRightA + new Transition (4594, 4595), // &LowerLeft -> &LowerLeftA + new Transition (4605, 4606), // &LowerRight -> &LowerRightA + new Transition (5064, 5071), // &ne -> &neA + new Transition (5227, 5228), // &nh -> &nhA + new Transition (5256, 5257), // &nl -> &nlA + new Transition (5855, 5856), // &nr -> &nrA + new Transition (6084, 6085), // &nvl -> &nvlA + new Transition (6097, 6098), // &nvr -> &nvrA + new Transition (6111, 6117), // &nw -> &nwA + new Transition (6876, 6877), // &r -> &rA + new Transition (7174, 7175), // &Right -> &RightA + new Transition (7216, 7217), // &RightArrowLeft -> &RightArrowLeftA + new Transition (7339, 7341), // &RightTee -> &RightTeeA + new Transition (7703, 7709), // &se -> &seA + new Transition (7779, 7780), // &ShortDown -> &ShortDownA + new Transition (7789, 7790), // &ShortLeft -> &ShortLeftA + new Transition (7816, 7817), // &ShortRight -> &ShortRightA + new Transition (7824, 7825), // &ShortUp -> &ShortUpA + new Transition (8375, 8381), // &sw -> &swA + new Transition (8623, 8624), // &TR -> &TRA + new Transition (8775, 8785), // &u -> &uA + new Transition (8970, 8971), // &Up -> &UpA + new Transition (8997, 8998), // &UpArrowDown -> &UpArrowDownA + new Transition (9007, 9008), // &UpDown -> &UpDownA + new Transition (9074, 9075), // &UpperLeft -> &UpperLeftA + new Transition (9085, 9086), // &UpperRight -> &UpperRightA + new Transition (9110, 9112), // &UpTee -> &UpTeeA + new Transition (9201, 9243), // &v -> &vA + new Transition (9572, 9573), // &xh -> &xhA + new Transition (9585, 9586), // &xl -> &xlA + new Transition (9623, 9624), // &xr -> &xrA + new Transition (9665, 9679) // &Y -> &YA + }; + TransitionTable_B = new Transition[34] { + new Transition (0, 331), // & -> &B + new Transition (1876, 1877), // &DoubleVertical -> &DoubleVerticalB + new Transition (1882, 1915), // &Down -> &DownB + new Transition (1887, 1903), // &DownArrow -> &DownArrowB + new Transition (1981, 1983), // &DownLeftVector -> &DownLeftVectorB + new Transition (2007, 2009), // &DownRightVector -> &DownRightVectorB + new Transition (3692, 3807), // &l -> &lB + new Transition (3905, 3906), // &LeftAngle -> &LeftAngleB + new Transition (3917, 3933), // &LeftArrow -> &LeftArrowB + new Transition (3966, 3967), // &LeftDouble -> &LeftDoubleB + new Transition (3992, 3994), // &LeftDownVector -> &LeftDownVectorB + new Transition (4126, 4128), // &LeftTriangle -> &LeftTriangleB + new Transition (4166, 4168), // &LeftUpVector -> &LeftUpVectorB + new Transition (4177, 4179), // &LeftVector -> &LeftVectorB + new Transition (5347, 5348), // &No -> &NoB + new Transition (5354, 5355), // &Non -> &NonB + new Transition (5409, 5410), // &NotDoubleVertical -> &NotDoubleVerticalB + new Transition (5539, 5541), // &NotLeftTriangle -> &NotLeftTriangleB + new Transition (5682, 5684), // &NotRightTriangle -> &NotRightTriangleB + new Transition (5816, 5817), // &NotVertical -> &NotVerticalB + new Transition (6437, 6438), // &Over -> &OverB + new Transition (6876, 6991), // &r -> &rB + new Transition (6886, 6986), // &R -> &RB + new Transition (7179, 7180), // &RightAngle -> &RightAngleB + new Transition (7191, 7209), // &RightArrow -> &RightArrowB + new Transition (7241, 7242), // &RightDouble -> &RightDoubleB + new Transition (7267, 7269), // &RightDownVector -> &RightDownVectorB + new Transition (7371, 7373), // &RightTriangle -> &RightTriangleB + new Transition (7411, 7413), // &RightUpVector -> &RightUpVectorB + new Transition (7422, 7424), // &RightVector -> &RightVectorB + new Transition (8919, 8920), // &Under -> &UnderB + new Transition (8975, 8990), // &UpArrow -> &UpArrowB + new Transition (9201, 9308), // &v -> &vB + new Transition (9377, 9378) // &Vertical -> &VerticalB + }; + TransitionTable_C = new Transition[15] { + new Transition (0, 789), // & -> &C + new Transition (1075, 1076), // &Clockwise -> &ClockwiseC + new Transition (1093, 1094), // &Close -> &CloseC + new Transition (1230, 1231), // &Counter -> &CounterC + new Transition (1239, 1240), // &CounterClockwise -> &CounterClockwiseC + new Transition (1316, 1326), // &Cup -> &CupC + new Transition (1747, 1748), // &Double -> &DoubleC + new Transition (3450, 3451), // &Invisible -> &InvisibleC + new Transition (3900, 3953), // &Left -> &LeftC + new Transition (5376, 5380), // &Not -> &NotC + new Transition (5391, 5392), // &NotCup -> &NotCupC + new Transition (6308, 6309), // &Open -> &OpenC + new Transition (7174, 7228), // &Right -> &RightC + new Transition (7756, 7757), // &SH -> &SHC + new Transition (7886, 7887) // &Small -> &SmallC + }; + TransitionTable_D = new Transition[43] { + new Transition (0, 1425), // & -> &D + new Transition (613, 618), // &box -> &boxD + new Transition (636, 640), // &boxH -> &boxHD + new Transition (638, 644), // &boxh -> &boxhD + new Transition (831, 832), // &Capital -> &CapitalD + new Transition (843, 844), // &CapitalDifferential -> &CapitalDifferentialD + new Transition (939, 940), // &Center -> &CenterD + new Transition (1023, 1024), // &Circle -> &CircleD + new Transition (1098, 1099), // &CloseCurly -> &CloseCurlyD + new Transition (1425, 1490), // &D -> &DD + new Transition (1566, 1573), // &Diacritical -> &DiacriticalD + new Transition (1630, 1631), // &Differential -> &DifferentialD + new Transition (1692, 1696), // &Dot -> &DotD + new Transition (1747, 1764), // &Double -> &DoubleD + new Transition (1852, 1859), // &DoubleUp -> &DoubleUpD + new Transition (2115, 2157), // &e -> &eD + new Transition (2157, 2158), // &eD -> &eDD + new Transition (2175, 2176), // &ef -> &efD + new Transition (2397, 2399), // &equiv -> &equivD + new Transition (2399, 2400), // &equivD -> &equivDD + new Transition (2409, 2414), // &er -> &erD + new Transition (3036, 3037), // &HAR -> &HARD + new Transition (3209, 3210), // &Hump -> &HumpD + new Transition (3900, 3961), // &Left -> &LeftD + new Transition (4139, 4140), // &LeftUp -> &LeftUpD + new Transition (4767, 4825), // &m -> &mD + new Transition (4825, 4826), // &mD -> &mDD + new Transition (5376, 5396), // &Not -> &NotD + new Transition (5496, 5497), // &NotHump -> &NotHumpD + new Transition (6043, 6058), // &nv -> &nvD + new Transition (6047, 6048), // &nV -> &nVD + new Transition (6313, 6314), // &OpenCurly -> &OpenCurlyD + new Transition (6488, 6489), // &Partial -> &PartialD + new Transition (7174, 7236), // &Right -> &RightD + new Transition (7384, 7385), // &RightUp -> &RightUpD + new Transition (7592, 7593), // &Rule -> &RuleD + new Transition (7775, 7776), // &Short -> &ShortD + new Transition (8624, 8625), // &TRA -> &TRAD + new Transition (8680, 8681), // &Triple -> &TripleD + new Transition (8970, 9004), // &Up -> &UpD + new Transition (8975, 8994), // &UpArrow -> &UpArrowD + new Transition (9201, 9330), // &v -> &vD + new Transition (9303, 9320) // &V -> &VD + }; + TransitionTable_E = new Transition[81] { + new Transition (0, 2108), // & -> &E + new Transition (1, 50), // &A -> &AE + new Transition (27, 31), // &ac -> &acE + new Transition (199, 206), // &ap -> &apE + new Transition (775, 777), // &bump -> &bumpE + new Transition (979, 1049), // &cir -> &cirE + new Transition (1692, 1707), // &Dot -> &DotE + new Transition (2490, 2491), // &Exponential -> &ExponentialE + new Transition (2701, 2763), // &g -> &gE + new Transition (2824, 2828), // &gl -> &glE + new Transition (2832, 2841), // &gn -> &gnE + new Transition (2871, 2872), // &Greater -> &GreaterE + new Transition (2886, 2887), // &GreaterFull -> &GreaterFullE + new Transition (2910, 2911), // &GreaterSlant -> &GreaterSlantE + new Transition (3011, 3012), // &gvn -> &gvnE + new Transition (3209, 3219), // &Hump -> &HumpE + new Transition (3236, 3269), // &I -> &IE + new Transition (3512, 3518), // &isin -> &isinE + new Transition (3692, 3894), // &l -> &lE + new Transition (4126, 4132), // &LeftTriangle -> &LeftTriangleE + new Transition (4239, 4240), // &Less -> &LessE + new Transition (4256, 4257), // &LessFull -> &LessFullE + new Transition (4288, 4289), // &LessSlant -> &LessSlantE + new Transition (4317, 4319), // &lg -> &lgE + new Transition (4401, 4410), // &ln -> &lnE + new Transition (4764, 4765), // &lvn -> &lvnE + new Transition (4986, 4988), // &nap -> &napE + new Transition (5195, 5196), // &ng -> &ngE + new Transition (5256, 5268), // &nl -> &nlE + new Transition (5376, 5414), // &Not -> &NotE + new Transition (5445, 5447), // &NotGreater -> &NotGreaterE + new Transition (5456, 5457), // &NotGreaterFull -> &NotGreaterFullE + new Transition (5480, 5481), // &NotGreaterSlant -> &NotGreaterSlantE + new Transition (5496, 5506), // &NotHump -> &NotHumpE + new Transition (5513, 5519), // ¬in -> ¬inE + new Transition (5539, 5545), // &NotLeftTriangle -> &NotLeftTriangleE + new Transition (5552, 5554), // &NotLess -> &NotLessE + new Transition (5577, 5578), // &NotLessSlant -> &NotLessSlantE + new Transition (5637, 5639), // &NotPrecedes -> &NotPrecedesE + new Transition (5649, 5650), // &NotPrecedesSlant -> &NotPrecedesSlantE + new Transition (5662, 5663), // &NotReverse -> &NotReverseE + new Transition (5682, 5688), // &NotRightTriangle -> &NotRightTriangleE + new Transition (5705, 5707), // &NotSquareSubset -> &NotSquareSubsetE + new Transition (5718, 5720), // &NotSquareSuperset -> &NotSquareSupersetE + new Transition (5730, 5732), // &NotSubset -> &NotSubsetE + new Transition (5743, 5745), // &NotSucceeds -> &NotSucceedsE + new Transition (5755, 5756), // &NotSucceedsSlant -> &NotSucceedsSlantE + new Transition (5773, 5775), // &NotSuperset -> &NotSupersetE + new Transition (5785, 5787), // &NotTilde -> &NotTildeE + new Transition (5796, 5797), // &NotTildeFull -> &NotTildeFullE + new Transition (5952, 5954), // &nsub -> &nsubE + new Transition (5973, 5975), // &nsup -> &nsupE + new Transition (6131, 6190), // &O -> &OE + new Transition (6642, 6651), // &pr -> &prE + new Transition (6677, 6679), // &Precedes -> &PrecedesE + new Transition (6689, 6690), // &PrecedesSlant -> &PrecedesSlantE + new Transition (6735, 6739), // &prn -> &prnE + new Transition (6886, 7092), // &R -> &RE + new Transition (7101, 7102), // &Reverse -> &ReverseE + new Transition (7122, 7123), // &ReverseUp -> &ReverseUpE + new Transition (7371, 7377), // &RightTriangle -> &RightTriangleE + new Transition (7631, 7649), // &sc -> &scE + new Transition (7670, 7674), // &scn -> &scnE + new Transition (7857, 7859), // &simg -> &simgE + new Transition (7861, 7863), // &siml -> &simlE + new Transition (8037, 8039), // &SquareSubset -> &SquareSubsetE + new Transition (8050, 8052), // &SquareSuperset -> &SquareSupersetE + new Transition (8131, 8137), // &sub -> &subE + new Transition (8150, 8151), // &subn -> &subnE + new Transition (8167, 8178), // &Subset -> &SubsetE + new Transition (8221, 8223), // &Succeeds -> &SucceedsE + new Transition (8233, 8234), // &SucceedsSlant -> &SucceedsSlantE + new Transition (8284, 8300), // &sup -> &supE + new Transition (8312, 8314), // &Superset -> &SupersetE + new Transition (8338, 8339), // &supn -> &supnE + new Transition (8547, 8554), // &Tilde -> &TildeE + new Transition (8563, 8564), // &TildeFull -> &TildeFullE + new Transition (8625, 8626), // &TRAD -> &TRADE + new Transition (8970, 9034), // &Up -> &UpE + new Transition (9460, 9461), // &vsubn -> &vsubnE + new Transition (9466, 9467) // &vsupn -> &vsupnE + }; + TransitionTable_F = new Transition[10] { + new Transition (0, 2517), // & -> &F + new Transition (219, 220), // &Apply -> &ApplyF + new Transition (2871, 2883), // &Greater -> &GreaterF + new Transition (3900, 3998), // &Left -> &LeftF + new Transition (4239, 4253), // &Less -> &LessF + new Transition (5445, 5453), // &NotGreater -> &NotGreaterF + new Transition (5785, 5793), // &NotTilde -> &NotTildeF + new Transition (7174, 7273), // &Right -> &RightF + new Transition (7930, 7931), // &SO -> &SOF + new Transition (8547, 8560) // &Tilde -> &TildeF + }; + TransitionTable_G = new Transition[15] { + new Transition (0, 2708), // & -> &G + new Transition (1566, 1587), // &Diacritical -> &DiacriticalG + new Transition (2287, 2288), // &EN -> &ENG + new Transition (2871, 2893), // &Greater -> &GreaterG + new Transition (4239, 4263), // &Less -> &LessG + new Transition (4244, 4245), // &LessEqual -> &LessEqualG + new Transition (4965, 5212), // &n -> &nG + new Transition (5151, 5152), // &Nested -> &NestedG + new Transition (5158, 5159), // &NestedGreater -> &NestedGreaterG + new Transition (5376, 5439), // &Not -> &NotG + new Transition (5445, 5463), // &NotGreater -> &NotGreaterG + new Transition (5552, 5560), // &NotLess -> &NotLessG + new Transition (5595, 5596), // &NotNested -> &NotNestedG + new Transition (5602, 5603), // &NotNestedGreater -> &NotNestedGreaterG + new Transition (7092, 7093) // &RE -> ® + }; + TransitionTable_H = new Transition[20] { + new Transition (0, 3014), // & -> &H + new Transition (613, 636), // &box -> &boxH + new Transition (691, 695), // &boxV -> &boxVH + new Transition (693, 699), // &boxv -> &boxvH + new Transition (789, 956), // &C -> &CH + new Transition (1432, 1546), // &d -> &dH + new Transition (2442, 2443), // &ET -> Ð + new Transition (3213, 3214), // &HumpDown -> &HumpDownH + new Transition (3618, 3660), // &K -> &KH + new Transition (3692, 4321), // &l -> &lH + new Transition (5376, 5493), // &Not -> &NotH + new Transition (5500, 5501), // &NotHumpDown -> &NotHumpDownH + new Transition (6043, 6073), // &nv -> &nvH + new Transition (6876, 7151), // &r -> &rH + new Transition (7610, 7756), // &S -> &SH + new Transition (7757, 7758), // &SHC -> &SHCH + new Transition (8400, 8535), // &T -> &TH + new Transition (8713, 8719), // &TS -> &TSH + new Transition (8775, 8872), // &u -> &uH + new Transition (9747, 9817) // &Z -> &ZH + }; + TransitionTable_I = new Transition[9] { + new Transition (0, 3236), // & -> &I + new Transition (1082, 1083), // &ClockwiseContour -> &ClockwiseContourI + new Transition (1190, 1191), // &Contour -> &ContourI + new Transition (1246, 1247), // &CounterClockwiseContour -> &CounterClockwiseContourI + new Transition (1754, 1755), // &DoubleContour -> &DoubleContourI + new Transition (3349, 3350), // &Imaginary -> &ImaginaryI + new Transition (7503, 7504), // &Round -> &RoundI + new Transition (8013, 8019), // &Square -> &SquareI + new Transition (9665, 9708) // &Y -> &YI + }; + TransitionTable_J = new Transition[7] { + new Transition (0, 3555), // & -> &J + new Transition (1425, 1661), // &D -> &DJ + new Transition (2708, 2816), // &G -> &GJ + new Transition (3236, 3320), // &I -> &IJ + new Transition (3618, 3668), // &K -> &KJ + new Transition (3698, 4338), // &L -> &LJ + new Transition (4971, 5248) // &N -> &NJ + }; + TransitionTable_K = new Transition[1] { + new Transition (0, 3618) // & -> &K + }; + TransitionTable_L = new Transition[29] { + new Transition (0, 3698), // & -> &L + new Transition (618, 619), // &boxD -> &boxDL + new Transition (623, 624), // &boxd -> &boxdL + new Transition (673, 674), // &boxU -> &boxUL + new Transition (678, 679), // &boxu -> &boxuL + new Transition (691, 703), // &boxV -> &boxVL + new Transition (693, 707), // &boxv -> &boxvL + new Transition (1747, 1776), // &Double -> &DoubleL + new Transition (1803, 1804), // &DoubleLong -> &DoubleLongL + new Transition (1882, 1950), // &Down -> &DownL + new Transition (2871, 2901), // &Greater -> &GreaterL + new Transition (2876, 2878), // &GreaterEqual -> &GreaterEqualL + new Transition (3178, 3179), // &Horizontal -> &HorizontalL + new Transition (4239, 4275), // &Less -> &LessL + new Transition (4436, 4437), // &Long -> &LongL + new Transition (4590, 4591), // &Lower -> &LowerL + new Transition (4965, 5272), // &n -> &nL + new Transition (5151, 5167), // &Nested -> &NestedL + new Transition (5170, 5171), // &NestedLess -> &NestedLessL + new Transition (5176, 5177), // &New -> &NewL + new Transition (5376, 5528), // &Not -> &NotL + new Transition (5445, 5471), // &NotGreater -> &NotGreaterL + new Transition (5552, 5568), // &NotLess -> &NotLessL + new Transition (5595, 5611), // &NotNested -> &NotNestedL + new Transition (5614, 5615), // &NotNestedLess -> &NotNestedLessL + new Transition (7191, 7213), // &RightArrow -> &RightArrowL + new Transition (7775, 7786), // &Short -> &ShortL + new Transition (9070, 9071), // &Upper -> &UpperL + new Transition (9377, 9382) // &Vertical -> &VerticalL + }; + TransitionTable_M = new Transition[5] { + new Transition (0, 4781), // & -> &M + new Transition (1, 111), // &A -> &AM + new Transition (1023, 1032), // &Circle -> &CircleM + new Transition (5090, 5091), // &Negative -> &NegativeM + new Transition (6589, 6590) // &Plus -> &PlusM + }; + TransitionTable_N = new Transition[5] { + new Transition (0, 4971), // & -> &N + new Transition (301, 587), // &b -> &bN + new Transition (2108, 2287), // &E -> &EN + new Transition (5376, 5590), // &Not -> &NotN + new Transition (8537, 8538) // &THOR -> Þ + }; + TransitionTable_O = new Transition[6] { + new Transition (0, 6131), // & -> &O + new Transition (789, 1217), // &C -> &CO + new Transition (3236, 3463), // &I -> &IO + new Transition (6869, 6870), // &QU -> &QUO + new Transition (7610, 7930), // &S -> &SO + new Transition (8535, 8536) // &TH -> &THO + }; + TransitionTable_P = new Transition[11] { + new Transition (0, 6482), // & -> &P + new Transition (111, 112), // &AM -> & + new Transition (1023, 1038), // &Circle -> &CircleP + new Transition (1217, 1218), // &CO -> &COP + new Transition (2954, 2955), // >l -> >lP + new Transition (4731, 4738), // <r -> <rP + new Transition (4903, 4904), // &Minus -> &MinusP + new Transition (5376, 5630), // &Not -> &NotP + new Transition (6437, 6451), // &Over -> &OverP + new Transition (8919, 8933), // &Under -> &UnderP + new Transition (8947, 8949) // &Union -> &UnionP + }; + TransitionTable_Q = new Transition[5] { + new Transition (0, 6813), // & -> &Q + new Transition (1098, 1111), // &CloseCurly -> &CloseCurlyQ + new Transition (1104, 1105), // &CloseCurlyDouble -> &CloseCurlyDoubleQ + new Transition (6313, 6326), // &OpenCurly -> &OpenCurlyQ + new Transition (6319, 6320) // &OpenCurlyDouble -> &OpenCurlyDoubleQ + }; + TransitionTable_R = new Transition[26] { + new Transition (0, 6886), // & -> &R + new Transition (618, 628), // &boxD -> &boxDR + new Transition (623, 632), // &boxd -> &boxdR + new Transition (673, 683), // &boxU -> &boxUR + new Transition (678, 687), // &boxu -> &boxuR + new Transition (691, 711), // &boxV -> &boxVR + new Transition (693, 715), // &boxv -> &boxvR + new Transition (1004, 1028), // &circled -> &circledR + new Transition (1747, 1836), // &Double -> &DoubleR + new Transition (1779, 1786), // &DoubleLeft -> &DoubleLeftR + new Transition (1803, 1825), // &DoubleLong -> &DoubleLongR + new Transition (1807, 1814), // &DoubleLongLeft -> &DoubleLongLeftR + new Transition (1882, 1987), // &Down -> &DownR + new Transition (1953, 1954), // &DownLeft -> &DownLeftR + new Transition (3035, 3036), // &HA -> &HAR + new Transition (3900, 4030), // &Left -> &LeftR + new Transition (3917, 3937), // &LeftArrow -> &LeftArrowR + new Transition (4436, 4509), // &Long -> &LongR + new Transition (4440, 4469), // &LongLeft -> &LongLeftR + new Transition (4590, 4601), // &Lower -> &LowerR + new Transition (4965, 5868), // &n -> &nR + new Transition (5376, 5656), // &Not -> &NotR + new Transition (7775, 7812), // &Short -> &ShortR + new Transition (8400, 8623), // &T -> &TR + new Transition (8536, 8537), // &THO -> &THOR + new Transition (9070, 9081) // &Upper -> &UpperR + }; + TransitionTable_S = new Transition[36] { + new Transition (0, 7610), // & -> &S + new Transition (1004, 1030), // &circled -> &circledS + new Transition (1425, 2048), // &D -> &DS + new Transition (2248, 2249), // &Empty -> &EmptyS + new Transition (2253, 2254), // &EmptySmall -> &EmptySmallS + new Transition (2266, 2267), // &EmptyVery -> &EmptyVeryS + new Transition (2271, 2272), // &EmptyVerySmall -> &EmptyVerySmallS + new Transition (2558, 2559), // &Filled -> &FilledS + new Transition (2563, 2564), // &FilledSmall -> &FilledSmallS + new Transition (2574, 2575), // &FilledVery -> &FilledVeryS + new Transition (2579, 2580), // &FilledVerySmall -> &FilledVerySmallS + new Transition (2871, 2906), // &Greater -> &GreaterS + new Transition (3105, 3106), // &Hilbert -> &HilbertS + new Transition (4239, 4284), // &Less -> &LessS + new Transition (4847, 4848), // &Medium -> &MediumS + new Transition (5096, 5097), // &NegativeMedium -> &NegativeMediumS + new Transition (5107, 5108), // &NegativeThick -> &NegativeThickS + new Transition (5114, 5115), // &NegativeThin -> &NegativeThinS + new Transition (5128, 5129), // &NegativeVeryThin -> &NegativeVeryThinS + new Transition (5362, 5363), // &NonBreaking -> &NonBreakingS + new Transition (5376, 5694), // &Not -> &NotS + new Transition (5445, 5476), // &NotGreater -> &NotGreaterS + new Transition (5552, 5573), // &NotLess -> &NotLessS + new Transition (5637, 5645), // &NotPrecedes -> &NotPrecedesS + new Transition (5699, 5700), // &NotSquare -> &NotSquareS + new Transition (5743, 5751), // &NotSucceeds -> &NotSucceedsS + new Transition (6138, 6376), // &o -> &oS + new Transition (6677, 6685), // &Precedes -> &PrecedesS + new Transition (8013, 8032), // &Square -> &SquareS + new Transition (8221, 8229), // &Succeeds -> &SucceedsS + new Transition (8400, 8713), // &T -> &TS + new Transition (8509, 8510), // &Thick -> &ThickS + new Transition (8520, 8521), // &Thin -> &ThinS + new Transition (9377, 9387), // &Vertical -> &VerticalS + new Transition (9407, 9408), // &VeryThin -> &VeryThinS + new Transition (9798, 9799) // &ZeroWidth -> &ZeroWidthS + }; + TransitionTable_T = new Transition[40] { + new Transition (0, 8400), // & -> &T + new Transition (1023, 1043), // &Circle -> &CircleT + new Transition (1566, 1593), // &Diacritical -> &DiacriticalT + new Transition (1779, 1797), // &DoubleLeft -> &DoubleLeftT + new Transition (1840, 1847), // &DoubleRight -> &DoubleRightT + new Transition (1882, 2013), // &Down -> &DownT + new Transition (1953, 1966), // &DownLeft -> &DownLeftT + new Transition (1991, 1992), // &DownRight -> &DownRightT + new Transition (2108, 2442), // &E -> &ET + new Transition (2370, 2377), // &Equal -> &EqualT + new Transition (2708, 2938), // &G -> > + new Transition (2871, 2917), // &Greater -> &GreaterT + new Transition (3450, 3457), // &Invisible -> &InvisibleT + new Transition (3698, 4694), // &L -> < + new Transition (3900, 4092), // &Left -> &LeftT + new Transition (3976, 3977), // &LeftDown -> &LeftDownT + new Transition (4139, 4151), // &LeftUp -> &LeftUpT + new Transition (4239, 4295), // &Less -> &LessT + new Transition (5090, 5103), // &Negative -> &NegativeT + new Transition (5124, 5125), // &NegativeVery -> &NegativeVeryT + new Transition (5376, 5781), // &Not -> &NotT + new Transition (5425, 5427), // &NotEqual -> &NotEqualT + new Transition (5445, 5487), // &NotGreater -> &NotGreaterT + new Transition (5531, 5532), // &NotLeft -> &NotLeftT + new Transition (5552, 5584), // &NotLess -> &NotLessT + new Transition (5674, 5675), // &NotRight -> &NotRightT + new Transition (5743, 5762), // &NotSucceeds -> &NotSucceedsT + new Transition (5785, 5803), // &NotTilde -> &NotTildeT + new Transition (6677, 6696), // &Precedes -> &PrecedesT + new Transition (6870, 6871), // &QUO -> " + new Transition (7174, 7337), // &Right -> &RightT + new Transition (7251, 7252), // &RightDown -> &RightDownT + new Transition (7384, 7396), // &RightUp -> &RightUpT + new Transition (7931, 7932), // &SOF -> &SOFT + new Transition (8221, 8240), // &Succeeds -> &SucceedsT + new Transition (8269, 8270), // &Such -> &SuchT + new Transition (8547, 8570), // &Tilde -> &TildeT + new Transition (8970, 9108), // &Up -> &UpT + new Transition (9377, 9397), // &Vertical -> &VerticalT + new Transition (9403, 9404) // &Very -> &VeryT + }; + TransitionTable_U = new Transition[13] { + new Transition (0, 8768), // & -> &U + new Transition (613, 673), // &box -> &boxU + new Transition (636, 648), // &boxH -> &boxHU + new Transition (638, 652), // &boxh -> &boxhU + new Transition (1747, 1851), // &Double -> &DoubleU + new Transition (1887, 1907), // &DownArrow -> &DownArrowU + new Transition (3900, 4138), // &Left -> &LeftU + new Transition (6813, 6869), // &Q -> &QU + new Transition (7101, 7121), // &Reverse -> &ReverseU + new Transition (7174, 7383), // &Right -> &RightU + new Transition (7775, 7823), // &Short -> &ShortU + new Transition (8013, 8058), // &Square -> &SquareU + new Transition (9665, 9732) // &Y -> &YU + }; + TransitionTable_V = new Transition[29] { + new Transition (0, 9303), // & -> &V + new Transition (613, 691), // &box -> &boxV + new Transition (1747, 1869), // &Double -> &DoubleV + new Transition (1953, 1976), // &DownLeft -> &DownLeftV + new Transition (1958, 1959), // &DownLeftRight -> &DownLeftRightV + new Transition (1968, 1969), // &DownLeftTee -> &DownLeftTeeV + new Transition (1991, 2002), // &DownRight -> &DownRightV + new Transition (1994, 1995), // &DownRightTee -> &DownRightTeeV + new Transition (2248, 2263), // &Empty -> &EmptyV + new Transition (2558, 2571), // &Filled -> &FilledV + new Transition (3900, 4172), // &Left -> &LeftV + new Transition (3976, 3987), // &LeftDown -> &LeftDownV + new Transition (3979, 3980), // &LeftDownTee -> &LeftDownTeeV + new Transition (4034, 4085), // &LeftRight -> &LeftRightV + new Transition (4094, 4102), // &LeftTee -> &LeftTeeV + new Transition (4139, 4161), // &LeftUp -> &LeftUpV + new Transition (4143, 4144), // &LeftUpDown -> &LeftUpDownV + new Transition (4153, 4154), // &LeftUpTee -> &LeftUpTeeV + new Transition (4965, 6047), // &n -> &nV + new Transition (5090, 5121), // &Negative -> &NegativeV + new Transition (5376, 5809), // &Not -> &NotV + new Transition (5401, 5402), // &NotDouble -> &NotDoubleV + new Transition (7174, 7417), // &Right -> &RightV + new Transition (7251, 7262), // &RightDown -> &RightDownV + new Transition (7254, 7255), // &RightDownTee -> &RightDownTeeV + new Transition (7339, 7347), // &RightTee -> &RightTeeV + new Transition (7384, 7406), // &RightUp -> &RightUpV + new Transition (7388, 7389), // &RightUpDown -> &RightUpDownV + new Transition (7398, 7399) // &RightUpTee -> &RightUpTeeV + }; + TransitionTable_W = new Transition[2] { + new Transition (0, 9484), // & -> &W + new Transition (9793, 9794) // &Zero -> &ZeroW + }; + TransitionTable_X = new Transition[1] { + new Transition (0, 9565) // & -> &X + }; + TransitionTable_Y = new Transition[2] { + new Transition (0, 9665), // & -> &Y + new Transition (1218, 1219) // &COP -> © + }; + TransitionTable_Z = new Transition[2] { + new Transition (0, 9747), // & -> &Z + new Transition (1425, 2093) // &D -> &DZ + }; + TransitionTable_a = new Transition[555] { + new Transition (0, 8), // & -> &a + new Transition (1, 2), // &A -> &Aa + new Transition (8, 9), // &a -> &aa + new Transition (68, 69), // &Agr -> &Agra + new Transition (74, 75), // &agr -> &agra + new Transition (91, 92), // &Alph -> &Alpha + new Transition (95, 96), // &alph -> &alpha + new Transition (98, 99), // &Am -> &Ama + new Transition (103, 104), // &am -> &ama + new Transition (120, 122), // &and -> &anda + new Transition (145, 147), // &angmsd -> &angmsda + new Transition (147, 148), // &angmsda -> &angmsdaa + new Transition (178, 179), // &angz -> &angza + new Transition (199, 201), // &ap -> &apa + new Transition (301, 302), // &b -> &ba + new Transition (331, 332), // &B -> &Ba + new Transition (336, 337), // &Backsl -> &Backsla + new Transition (385, 386), // &bec -> &beca + new Transition (391, 392), // &Bec -> &Beca + new Transition (423, 424), // &Bet -> &Beta + new Transition (426, 427), // &bet -> &beta + new Transition (444, 445), // &bigc -> &bigca + new Transition (477, 478), // &bigst -> &bigsta + new Transition (483, 484), // &bigtri -> &bigtria + new Transition (513, 514), // &bk -> &bka + new Transition (519, 520), // &bl -> &bla + new Transition (533, 534), // &blacksqu -> &blacksqua + new Transition (540, 541), // &blacktri -> &blacktria + new Transition (736, 737), // &brvb -> &brvba + new Transition (789, 790), // &C -> &Ca + new Transition (796, 797), // &c -> &ca + new Transition (805, 807), // &cap -> &capa + new Transition (817, 818), // &capc -> &capca + new Transition (829, 830), // &Capit -> &Capita + new Transition (841, 842), // &CapitalDifferenti -> &CapitalDifferentia + new Transition (861, 862), // &cc -> &cca + new Transition (866, 867), // &Cc -> &Cca + new Transition (924, 925), // &Cedill -> &Cedilla + new Transition (968, 969), // &checkm -> &checkma + new Transition (987, 988), // &circle -> &circlea + new Transition (1004, 1005), // &circled -> &circleda + new Transition (1014, 1015), // &circledd -> &circledda + new Transition (1088, 1089), // &ClockwiseContourIntegr -> &ClockwiseContourIntegra + new Transition (1143, 1144), // &comm -> &comma + new Transition (1196, 1197), // &ContourIntegr -> &ContourIntegra + new Transition (1252, 1253), // &CounterClockwiseContourIntegr -> &CounterClockwiseContourIntegra + new Transition (1256, 1257), // &cr -> &cra + new Transition (1293, 1294), // &cud -> &cuda + new Transition (1308, 1309), // &cul -> &cula + new Transition (1322, 1323), // &cupbrc -> &cupbrca + new Transition (1326, 1327), // &CupC -> &CupCa + new Transition (1330, 1331), // &cupc -> &cupca + new Transition (1346, 1347), // &cur -> &cura + new Transition (1382, 1383), // &curve -> &curvea + new Transition (1425, 1426), // &D -> &Da + new Transition (1432, 1433), // &d -> &da + new Transition (1464, 1465), // &dbk -> &dbka + new Transition (1470, 1471), // &dbl -> &dbla + new Transition (1474, 1475), // &Dc -> &Dca + new Transition (1480, 1481), // &dc -> &dca + new Transition (1492, 1494), // &dd -> &dda + new Transition (1505, 1506), // &DDotr -> &DDotra + new Transition (1522, 1523), // &Delt -> &Delta + new Transition (1526, 1527), // &delt -> &delta + new Transition (1546, 1547), // &dH -> &dHa + new Transition (1550, 1551), // &dh -> &dha + new Transition (1557, 1558), // &Di -> &Dia + new Transition (1564, 1565), // &Diacritic -> &Diacritica + new Transition (1588, 1589), // &DiacriticalGr -> &DiacriticalGra + new Transition (1599, 1600), // &di -> &dia + new Transition (1628, 1629), // &Differenti -> &Differentia + new Transition (1633, 1634), // &dig -> &diga + new Transition (1636, 1637), // &digamm -> &digamma + new Transition (1681, 1682), // &doll -> &dolla + new Transition (1709, 1710), // &DotEqu -> &DotEqua + new Transition (1726, 1727), // &dotsqu -> &dotsqua + new Transition (1735, 1736), // &doubleb -> &doubleba + new Transition (1760, 1761), // &DoubleContourIntegr -> &DoubleContourIntegra + new Transition (1874, 1875), // &DoubleVertic -> &DoubleVertica + new Transition (1877, 1878), // &DoubleVerticalB -> &DoubleVerticalBa + new Transition (1882, 1889), // &Down -> &Downa + new Transition (1896, 1897), // &down -> &downa + new Transition (1903, 1904), // &DownArrowB -> &DownArrowBa + new Transition (1924, 1925), // &downdown -> &downdowna + new Transition (1932, 1933), // &downh -> &downha + new Transition (1983, 1984), // &DownLeftVectorB -> &DownLeftVectorBa + new Transition (2009, 2010), // &DownRightVectorB -> &DownRightVectorBa + new Transition (2025, 2026), // &drbk -> &drbka + new Transition (2077, 2078), // &du -> &dua + new Transition (2082, 2083), // &duh -> &duha + new Transition (2086, 2087), // &dw -> &dwa + new Transition (2103, 2104), // &dzigr -> &dzigra + new Transition (2108, 2109), // &E -> &Ea + new Transition (2115, 2116), // &e -> &ea + new Transition (2127, 2128), // &Ec -> &Eca + new Transition (2133, 2134), // &ec -> &eca + new Transition (2188, 2189), // &Egr -> &Egra + new Transition (2193, 2194), // &egr -> &egra + new Transition (2228, 2229), // &Em -> &Ema + new Transition (2233, 2234), // &em -> &ema + new Transition (2250, 2251), // &EmptySm -> &EmptySma + new Transition (2256, 2257), // &EmptySmallSqu -> &EmptySmallSqua + new Transition (2268, 2269), // &EmptyVerySm -> &EmptyVerySma + new Transition (2274, 2275), // &EmptyVerySmallSqu -> &EmptyVerySmallSqua + new Transition (2312, 2313), // &ep -> &epa + new Transition (2354, 2355), // &eqsl -> &eqsla + new Transition (2368, 2369), // &Equ -> &Equa + new Transition (2372, 2373), // &equ -> &equa + new Transition (2403, 2404), // &eqvp -> &eqvpa + new Transition (2409, 2410), // &er -> &era + new Transition (2436, 2437), // &Et -> &Eta + new Transition (2439, 2440), // &et -> &eta + new Transition (2475, 2476), // &expect -> &expecta + new Transition (2488, 2489), // &Exponenti -> &Exponentia + new Transition (2498, 2499), // &exponenti -> &exponentia + new Transition (2503, 2504), // &f -> &fa + new Transition (2525, 2526), // &fem -> &fema + new Transition (2560, 2561), // &FilledSm -> &FilledSma + new Transition (2566, 2567), // &FilledSmallSqu -> &FilledSmallSqua + new Transition (2576, 2577), // &FilledVerySm -> &FilledVerySma + new Transition (2582, 2583), // &FilledVerySmallSqu -> &FilledVerySmallSqua + new Transition (2592, 2593), // &fl -> &fla + new Transition (2621, 2622), // &for -> &fora + new Transition (2639, 2640), // &fp -> &fpa + new Transition (2647, 2648), // &fr -> &fra + new Transition (2701, 2702), // &g -> &ga + new Transition (2708, 2709), // &G -> &Ga + new Transition (2711, 2712), // &Gamm -> &Gamma + new Transition (2715, 2716), // &gamm -> &gamma + new Transition (2776, 2777), // &geqsl -> &geqsla + new Transition (2824, 2826), // &gl -> &gla + new Transition (2832, 2833), // &gn -> &gna + new Transition (2861, 2862), // &gr -> &gra + new Transition (2867, 2868), // &Gre -> &Grea + new Transition (2874, 2875), // &GreaterEqu -> &GreaterEqua + new Transition (2889, 2890), // &GreaterFullEqu -> &GreaterFullEqua + new Transition (2895, 2896), // &GreaterGre -> &GreaterGrea + new Transition (2907, 2908), // &GreaterSl -> &GreaterSla + new Transition (2913, 2914), // &GreaterSlantEqu -> &GreaterSlantEqua + new Transition (2955, 2956), // >lP -> >lPa + new Transition (2965, 2966), // >r -> >ra + new Transition (3014, 3015), // &H -> &Ha + new Transition (3020, 3021), // &h -> &ha + new Transition (3060, 3061), // &hb -> &hba + new Transition (3074, 3075), // &he -> &hea + new Transition (3107, 3108), // &HilbertSp -> &HilbertSpa + new Transition (3114, 3115), // &hkse -> &hksea + new Transition (3120, 3121), // &hksw -> &hkswa + new Transition (3126, 3127), // &ho -> &hoa + new Transition (3141, 3142), // &hookleft -> &hooklefta + new Transition (3152, 3153), // &hookright -> &hookrighta + new Transition (3167, 3168), // &horb -> &horba + new Transition (3176, 3177), // &Horizont -> &Horizonta + new Transition (3192, 3193), // &hsl -> &hsla + new Transition (3221, 3222), // &HumpEqu -> &HumpEqua + new Transition (3236, 3237), // &I -> &Ia + new Transition (3243, 3244), // &i -> &ia + new Transition (3290, 3291), // &Igr -> &Igra + new Transition (3296, 3297), // &igr -> &igra + new Transition (3317, 3318), // &iiot -> &iiota + new Transition (3330, 3332), // &Im -> &Ima + new Transition (3336, 3337), // &im -> &ima + new Transition (3346, 3347), // &Imagin -> &Imagina + new Transition (3357, 3358), // &imagp -> &imagpa + new Transition (3380, 3381), // &inc -> &inca + new Transition (3403, 3404), // &intc -> &intca + new Transition (3415, 3416), // &Integr -> &Integra + new Transition (3420, 3421), // &interc -> &interca + new Transition (3433, 3434), // &intl -> &intla + new Transition (3454, 3455), // &InvisibleComm -> &InvisibleComma + new Transition (3486, 3487), // &Iot -> &Iota + new Transition (3489, 3490), // &iot -> &iota + new Transition (3577, 3578), // &jm -> &jma + new Transition (3618, 3619), // &K -> &Ka + new Transition (3621, 3622), // &Kapp -> &Kappa + new Transition (3624, 3625), // &k -> &ka + new Transition (3627, 3628), // &kapp -> &kappa + new Transition (3692, 3705), // &l -> &la + new Transition (3693, 3694), // &lA -> &lAa + new Transition (3698, 3699), // &L -> &La + new Transition (3719, 3720), // &lagr -> &lagra + new Transition (3725, 3726), // &Lambd -> &Lambda + new Transition (3730, 3731), // &lambd -> &lambda + new Transition (3747, 3748), // &Lapl -> &Lapla + new Transition (3792, 3799), // &lat -> &lata + new Transition (3794, 3795), // &lAt -> &lAta + new Transition (3807, 3808), // &lB -> &lBa + new Transition (3812, 3813), // &lb -> &lba + new Transition (3821, 3822), // &lbr -> &lbra + new Transition (3837, 3838), // &Lc -> &Lca + new Transition (3843, 3844), // &lc -> &lca + new Transition (3870, 3871), // &ldc -> &ldca + new Transition (3881, 3882), // &ldrdh -> &ldrdha + new Transition (3887, 3888), // &ldrush -> &ldrusha + new Transition (3900, 3919), // &Left -> &Lefta + new Transition (3907, 3908), // &LeftAngleBr -> &LeftAngleBra + new Transition (3926, 3927), // &left -> &lefta + new Transition (3933, 3934), // &LeftArrowB -> &LeftArrowBa + new Transition (3948, 3949), // &leftarrowt -> &leftarrowta + new Transition (3968, 3969), // &LeftDoubleBr -> &LeftDoubleBra + new Transition (3994, 3995), // &LeftDownVectorB -> &LeftDownVectorBa + new Transition (4004, 4005), // &lefth -> &leftha + new Transition (4022, 4023), // &leftleft -> &leftlefta + new Transition (4045, 4046), // &Leftright -> &Leftrighta + new Transition (4056, 4057), // &leftright -> &leftrighta + new Transition (4065, 4066), // &leftrighth -> &leftrightha + new Transition (4078, 4079), // &leftrightsquig -> &leftrightsquiga + new Transition (4121, 4122), // &LeftTri -> &LeftTria + new Transition (4128, 4129), // &LeftTriangleB -> &LeftTriangleBa + new Transition (4134, 4135), // &LeftTriangleEqu -> &LeftTriangleEqua + new Transition (4168, 4169), // &LeftUpVectorB -> &LeftUpVectorBa + new Transition (4179, 4180), // &LeftVectorB -> &LeftVectorBa + new Transition (4192, 4193), // &leqsl -> &leqsla + new Transition (4215, 4216), // &less -> &lessa + new Transition (4242, 4243), // &LessEqu -> &LessEqua + new Transition (4247, 4248), // &LessEqualGre -> &LessEqualGrea + new Transition (4259, 4260), // &LessFullEqu -> &LessFullEqua + new Transition (4265, 4266), // &LessGre -> &LessGrea + new Transition (4285, 4286), // &LessSl -> &LessSla + new Transition (4291, 4292), // &LessSlantEqu -> &LessSlantEqua + new Transition (4321, 4322), // &lH -> &lHa + new Transition (4325, 4326), // &lh -> &lha + new Transition (4348, 4350), // &ll -> &lla + new Transition (4363, 4364), // &Lleft -> &Llefta + new Transition (4370, 4371), // &llh -> &llha + new Transition (4394, 4396), // &lmoust -> &lmousta + new Transition (4401, 4402), // &ln -> &lna + new Transition (4422, 4423), // &lo -> &loa + new Transition (4450, 4451), // &Longleft -> &Longlefta + new Transition (4462, 4463), // &longleft -> &longlefta + new Transition (4484, 4485), // &Longleftright -> &Longleftrighta + new Transition (4495, 4496), // &longleftright -> &longleftrighta + new Transition (4502, 4503), // &longm -> &longma + new Transition (4524, 4525), // &Longright -> &Longrighta + new Transition (4535, 4536), // &longright -> &longrighta + new Transition (4543, 4544), // &loop -> &loopa + new Transition (4560, 4561), // &lop -> &lopa + new Transition (4579, 4580), // &low -> &lowa + new Transition (4584, 4585), // &lowb -> &lowba + new Transition (4621, 4622), // &lp -> &lpa + new Transition (4628, 4629), // &lr -> &lra + new Transition (4640, 4641), // &lrh -> &lrha + new Transition (4652, 4653), // &ls -> &lsa + new Transition (4720, 4721), // <l -> <la + new Transition (4738, 4739), // <rP -> <rPa + new Transition (4746, 4747), // &lurdsh -> &lurdsha + new Transition (4751, 4752), // &luruh -> &luruha + new Transition (4767, 4768), // &m -> &ma + new Transition (4781, 4782), // &M -> &Ma + new Transition (4812, 4813), // &mcomm -> &mcomma + new Transition (4820, 4821), // &md -> &mda + new Transition (4830, 4831), // &me -> &mea + new Transition (4836, 4837), // &measured -> &measureda + new Transition (4849, 4850), // &MediumSp -> &MediumSpa + new Transition (4876, 4878), // &mid -> &mida + new Transition (4957, 4958), // &multim -> &multima + new Transition (4961, 4962), // &mum -> &muma + new Transition (4965, 4966), // &n -> &na + new Transition (4968, 4969), // &nabl -> &nabla + new Transition (4971, 4972), // &N -> &Na + new Transition (5003, 5005), // &natur -> &natura + new Transition (5020, 5021), // &nc -> &nca + new Transition (5024, 5025), // &Nc -> &Nca + new Transition (5059, 5060), // &nd -> &nda + new Transition (5064, 5066), // &ne -> &nea + new Transition (5085, 5086), // &Neg -> &Nega + new Transition (5098, 5099), // &NegativeMediumSp -> &NegativeMediumSpa + new Transition (5109, 5110), // &NegativeThickSp -> &NegativeThickSpa + new Transition (5116, 5117), // &NegativeThinSp -> &NegativeThinSpa + new Transition (5130, 5131), // &NegativeVeryThinSp -> &NegativeVeryThinSpa + new Transition (5141, 5142), // &nese -> &nesea + new Transition (5154, 5155), // &NestedGre -> &NestedGrea + new Transition (5161, 5162), // &NestedGreaterGre -> &NestedGreaterGrea + new Transition (5205, 5206), // &ngeqsl -> &ngeqsla + new Transition (5227, 5232), // &nh -> &nha + new Transition (5236, 5237), // &nhp -> &nhpa + new Transition (5256, 5261), // &nl -> &nla + new Transition (5275, 5276), // &nLeft -> &nLefta + new Transition (5283, 5284), // &nleft -> &nlefta + new Transition (5294, 5295), // &nLeftright -> &nLeftrighta + new Transition (5305, 5306), // &nleftright -> &nleftrighta + new Transition (5317, 5318), // &nleqsl -> &nleqsla + new Transition (5350, 5351), // &NoBre -> &NoBrea + new Transition (5357, 5358), // &NonBre -> &NonBrea + new Transition (5364, 5365), // &NonBreakingSp -> &NonBreakingSpa + new Transition (5392, 5393), // &NotCupC -> &NotCupCa + new Transition (5407, 5408), // &NotDoubleVertic -> &NotDoubleVertica + new Transition (5410, 5411), // &NotDoubleVerticalB -> &NotDoubleVerticalBa + new Transition (5423, 5424), // &NotEqu -> &NotEqua + new Transition (5441, 5442), // &NotGre -> &NotGrea + new Transition (5449, 5450), // &NotGreaterEqu -> &NotGreaterEqua + new Transition (5459, 5460), // &NotGreaterFullEqu -> &NotGreaterFullEqua + new Transition (5465, 5466), // &NotGreaterGre -> &NotGreaterGrea + new Transition (5477, 5478), // &NotGreaterSl -> &NotGreaterSla + new Transition (5483, 5484), // &NotGreaterSlantEqu -> &NotGreaterSlantEqua + new Transition (5508, 5509), // &NotHumpEqu -> &NotHumpEqua + new Transition (5521, 5522), // ¬inv -> ¬inva + new Transition (5534, 5535), // &NotLeftTri -> &NotLeftTria + new Transition (5541, 5542), // &NotLeftTriangleB -> &NotLeftTriangleBa + new Transition (5547, 5548), // &NotLeftTriangleEqu -> &NotLeftTriangleEqua + new Transition (5556, 5557), // &NotLessEqu -> &NotLessEqua + new Transition (5562, 5563), // &NotLessGre -> &NotLessGrea + new Transition (5574, 5575), // &NotLessSl -> &NotLessSla + new Transition (5580, 5581), // &NotLessSlantEqu -> &NotLessSlantEqua + new Transition (5598, 5599), // &NotNestedGre -> &NotNestedGrea + new Transition (5605, 5606), // &NotNestedGreaterGre -> &NotNestedGreaterGrea + new Transition (5623, 5624), // ¬niv -> ¬niva + new Transition (5641, 5642), // &NotPrecedesEqu -> &NotPrecedesEqua + new Transition (5646, 5647), // &NotPrecedesSl -> &NotPrecedesSla + new Transition (5652, 5653), // &NotPrecedesSlantEqu -> &NotPrecedesSlantEqua + new Transition (5677, 5678), // &NotRightTri -> &NotRightTria + new Transition (5684, 5685), // &NotRightTriangleB -> &NotRightTriangleBa + new Transition (5690, 5691), // &NotRightTriangleEqu -> &NotRightTriangleEqua + new Transition (5696, 5697), // &NotSqu -> &NotSqua + new Transition (5709, 5710), // &NotSquareSubsetEqu -> &NotSquareSubsetEqua + new Transition (5722, 5723), // &NotSquareSupersetEqu -> &NotSquareSupersetEqua + new Transition (5734, 5735), // &NotSubsetEqu -> &NotSubsetEqua + new Transition (5747, 5748), // &NotSucceedsEqu -> &NotSucceedsEqua + new Transition (5752, 5753), // &NotSucceedsSl -> &NotSucceedsSla + new Transition (5758, 5759), // &NotSucceedsSlantEqu -> &NotSucceedsSlantEqua + new Transition (5777, 5778), // &NotSupersetEqu -> &NotSupersetEqua + new Transition (5789, 5790), // &NotTildeEqu -> &NotTildeEqua + new Transition (5799, 5800), // &NotTildeFullEqu -> &NotTildeFullEqua + new Transition (5814, 5815), // &NotVertic -> &NotVertica + new Transition (5817, 5818), // &NotVerticalB -> &NotVerticalBa + new Transition (5821, 5822), // &np -> &npa + new Transition (5823, 5825), // &npar -> &npara + new Transition (5855, 5860), // &nr -> &nra + new Transition (5872, 5873), // &nRight -> &nRighta + new Transition (5882, 5883), // &nright -> &nrighta + new Transition (5918, 5919), // &nshortp -> &nshortpa + new Transition (5920, 5921), // &nshortpar -> &nshortpara + new Transition (5938, 5939), // &nsp -> &nspa + new Transition (6007, 6008), // &ntri -> &ntria + new Transition (6043, 6044), // &nv -> &nva + new Transition (6048, 6049), // &nVD -> &nVDa + new Transition (6053, 6054), // &nVd -> &nVda + new Transition (6058, 6059), // &nvD -> &nvDa + new Transition (6063, 6064), // &nvd -> &nvda + new Transition (6073, 6074), // &nvH -> &nvHa + new Transition (6111, 6112), // &nw -> &nwa + new Transition (6127, 6128), // &nwne -> &nwnea + new Transition (6131, 6132), // &O -> &Oa + new Transition (6138, 6139), // &o -> &oa + new Transition (6163, 6164), // &od -> &oda + new Transition (6170, 6171), // &Odbl -> &Odbla + new Transition (6175, 6176), // &odbl -> &odbla + new Transition (6215, 6216), // &Ogr -> &Ogra + new Transition (6220, 6221), // &ogr -> &ogra + new Transition (6228, 6229), // &ohb -> &ohba + new Transition (6238, 6239), // &ol -> &ola + new Transition (6258, 6259), // &Om -> &Oma + new Transition (6263, 6264), // &om -> &oma + new Transition (6269, 6270), // &Omeg -> &Omega + new Transition (6273, 6274), // &omeg -> &omega + new Transition (6302, 6303), // &op -> &opa + new Transition (6342, 6344), // &or -> &ora + new Transition (6386, 6387), // &Osl -> &Osla + new Transition (6391, 6392), // &osl -> &osla + new Transition (6417, 6419), // &otimes -> &otimesa + new Transition (6431, 6432), // &ovb -> &ovba + new Transition (6438, 6439), // &OverB -> &OverBa + new Transition (6442, 6443), // &OverBr -> &OverBra + new Transition (6451, 6452), // &OverP -> &OverPa + new Transition (6463, 6464), // &p -> &pa + new Transition (6465, 6467), // &par -> ¶ + new Transition (6482, 6483), // &P -> &Pa + new Transition (6486, 6487), // &Parti -> &Partia + new Transition (6533, 6534), // &phmm -> &phmma + new Transition (6555, 6556), // &pl -> &pla + new Transition (6567, 6569), // &plus -> &plusa + new Transition (6612, 6613), // &Poinc -> &Poinca + new Transition (6617, 6618), // &Poincarepl -> &Poincarepla + new Transition (6642, 6644), // &pr -> &pra + new Transition (6655, 6657), // &prec -> &preca + new Transition (6681, 6682), // &PrecedesEqu -> &PrecedesEqua + new Transition (6686, 6687), // &PrecedesSl -> &PrecedesSla + new Transition (6692, 6693), // &PrecedesSlantEqu -> &PrecedesSlantEqua + new Transition (6705, 6706), // &precn -> &precna + new Transition (6735, 6736), // &prn -> &prna + new Transition (6754, 6755), // &prof -> &profa + new Transition (6756, 6757), // &profal -> &profala + new Transition (6778, 6780), // &Proportion -> &Proportiona + new Transition (6847, 6848), // &qu -> &qua + new Transition (6876, 6882), // &r -> &ra + new Transition (6877, 6878), // &rA -> &rAa + new Transition (6886, 6887), // &R -> &Ra + new Transition (6932, 6934), // &rarr -> &rarra + new Transition (6968, 6969), // &rAt -> &rAta + new Transition (6973, 6974), // &rat -> &rata + new Transition (6981, 6982), // &ration -> &rationa + new Transition (6986, 6987), // &RB -> &RBa + new Transition (6991, 6992), // &rB -> &rBa + new Transition (6996, 6997), // &rb -> &rba + new Transition (7005, 7006), // &rbr -> &rbra + new Transition (7021, 7022), // &Rc -> &Rca + new Transition (7027, 7028), // &rc -> &rca + new Transition (7054, 7055), // &rdc -> &rdca + new Transition (7059, 7060), // &rdldh -> &rdldha + new Transition (7074, 7075), // &re -> &rea + new Transition (7082, 7083), // &realp -> &realpa + new Transition (7151, 7152), // &rH -> &rHa + new Transition (7155, 7156), // &rh -> &rha + new Transition (7174, 7193), // &Right -> &Righta + new Transition (7181, 7182), // &RightAngleBr -> &RightAngleBra + new Transition (7202, 7203), // &right -> &righta + new Transition (7209, 7210), // &RightArrowB -> &RightArrowBa + new Transition (7223, 7224), // &rightarrowt -> &rightarrowta + new Transition (7243, 7244), // &RightDoubleBr -> &RightDoubleBra + new Transition (7269, 7270), // &RightDownVectorB -> &RightDownVectorBa + new Transition (7279, 7280), // &righth -> &rightha + new Transition (7297, 7298), // &rightleft -> &rightlefta + new Transition (7305, 7306), // &rightlefth -> &rightleftha + new Transition (7318, 7319), // &rightright -> &rightrighta + new Transition (7330, 7331), // &rightsquig -> &rightsquiga + new Transition (7366, 7367), // &RightTri -> &RightTria + new Transition (7373, 7374), // &RightTriangleB -> &RightTriangleBa + new Transition (7379, 7380), // &RightTriangleEqu -> &RightTriangleEqua + new Transition (7413, 7414), // &RightUpVectorB -> &RightUpVectorBa + new Transition (7424, 7425), // &RightVectorB -> &RightVectorBa + new Transition (7442, 7443), // &rl -> &rla + new Transition (7447, 7448), // &rlh -> &rlha + new Transition (7457, 7459), // &rmoust -> &rmousta + new Transition (7469, 7470), // &ro -> &roa + new Transition (7481, 7482), // &rop -> &ropa + new Transition (7512, 7513), // &rp -> &rpa + new Transition (7526, 7527), // &rr -> &rra + new Transition (7535, 7536), // &Rright -> &Rrighta + new Transition (7542, 7543), // &rs -> &rsa + new Transition (7595, 7596), // &RuleDel -> &RuleDela + new Transition (7604, 7605), // &ruluh -> &ruluha + new Transition (7610, 7611), // &S -> &Sa + new Transition (7617, 7618), // &s -> &sa + new Transition (7629, 7636), // &Sc -> &Sca + new Transition (7631, 7633), // &sc -> &sca + new Transition (7670, 7671), // &scn -> &scna + new Transition (7703, 7704), // &se -> &sea + new Transition (7725, 7726), // &sesw -> &seswa + new Transition (7751, 7752), // &sh -> &sha + new Transition (7803, 7804), // &shortp -> &shortpa + new Transition (7805, 7806), // &shortpar -> &shortpara + new Transition (7835, 7836), // &Sigm -> &Sigma + new Transition (7840, 7841), // &sigm -> &sigma + new Transition (7873, 7874), // &simr -> &simra + new Transition (7878, 7879), // &sl -> &sla + new Transition (7883, 7884), // &Sm -> &Sma + new Transition (7894, 7895), // &sm -> &sma + new Transition (7912, 7913), // &smep -> &smepa + new Transition (7944, 7946), // &solb -> &solba + new Transition (7956, 7957), // &sp -> &spa + new Transition (7969, 7970), // &sqc -> &sqca + new Transition (8008, 8015), // &squ -> &squa + new Transition (8010, 8011), // &Squ -> &Squa + new Transition (8041, 8042), // &SquareSubsetEqu -> &SquareSubsetEqua + new Transition (8054, 8055), // &SquareSupersetEqu -> &SquareSupersetEqua + new Transition (8068, 8069), // &sr -> &sra + new Transition (8091, 8092), // &sst -> &ssta + new Transition (8096, 8097), // &St -> &Sta + new Transition (8100, 8101), // &st -> &sta + new Transition (8106, 8107), // &str -> &stra + new Transition (8160, 8161), // &subr -> &subra + new Transition (8180, 8181), // &SubsetEqu -> &SubsetEqua + new Transition (8199, 8201), // &succ -> &succa + new Transition (8225, 8226), // &SucceedsEqu -> &SucceedsEqua + new Transition (8230, 8231), // &SucceedsSl -> &SucceedsSla + new Transition (8236, 8237), // &SucceedsSlantEqu -> &SucceedsSlantEqua + new Transition (8249, 8250), // &succn -> &succna + new Transition (8271, 8272), // &SuchTh -> &SuchTha + new Transition (8316, 8317), // &SupersetEqu -> &SupersetEqua + new Transition (8328, 8329), // &supl -> &supla + new Transition (8375, 8376), // &sw -> &swa + new Transition (8391, 8392), // &swnw -> &swnwa + new Transition (8400, 8401), // &T -> &Ta + new Transition (8404, 8405), // &t -> &ta + new Transition (8419, 8420), // &Tc -> &Tca + new Transition (8425, 8426), // &tc -> &tca + new Transition (8481, 8482), // &Thet -> &Theta + new Transition (8484, 8485), // &thet -> &theta + new Transition (8495, 8496), // &thick -> &thicka + new Transition (8511, 8512), // &ThickSp -> &ThickSpa + new Transition (8522, 8523), // &ThinSp -> &ThinSpa + new Transition (8527, 8528), // &thk -> &thka + new Transition (8556, 8557), // &TildeEqu -> &TildeEqua + new Transition (8566, 8567), // &TildeFullEqu -> &TildeFullEqua + new Transition (8580, 8582), // ×b -> ×ba + new Transition (8591, 8592), // &toe -> &toea + new Transition (8614, 8615), // &tos -> &tosa + new Transition (8628, 8629), // &tr -> &tra + new Transition (8633, 8634), // &tri -> &tria + new Transition (8744, 8745), // &twohe -> &twohea + new Transition (8750, 8751), // &twoheadleft -> &twoheadlefta + new Transition (8761, 8762), // &twoheadright -> &twoheadrighta + new Transition (8768, 8769), // &U -> &Ua + new Transition (8775, 8776), // &u -> &ua + new Transition (8829, 8830), // &ud -> &uda + new Transition (8836, 8837), // &Udbl -> &Udbla + new Transition (8841, 8842), // &udbl -> &udbla + new Transition (8845, 8846), // &udh -> &udha + new Transition (8861, 8862), // &Ugr -> &Ugra + new Transition (8867, 8868), // &ugr -> &ugra + new Transition (8872, 8873), // &uH -> &uHa + new Transition (8876, 8877), // &uh -> &uha + new Transition (8904, 8905), // &Um -> &Uma + new Transition (8909, 8910), // &um -> &uma + new Transition (8920, 8921), // &UnderB -> &UnderBa + new Transition (8924, 8925), // &UnderBr -> &UnderBra + new Transition (8933, 8934), // &UnderP -> &UnderPa + new Transition (8970, 8977), // &Up -> &Upa + new Transition (8983, 8984), // &up -> &upa + new Transition (8990, 8991), // &UpArrowB -> &UpArrowBa + new Transition (9017, 9018), // &Updown -> &Updowna + new Transition (9027, 9028), // &updown -> &updowna + new Transition (9046, 9047), // &uph -> &upha + new Transition (9119, 9120), // &upup -> &upupa + new Transition (9182, 9183), // &uu -> &uua + new Transition (9194, 9195), // &uw -> &uwa + new Transition (9201, 9202), // &v -> &va + new Transition (9217, 9218), // &vark -> &varka + new Transition (9220, 9221), // &varkapp -> &varkappa + new Transition (9255, 9256), // &varsigm -> &varsigma + new Transition (9282, 9283), // &varthet -> &vartheta + new Transition (9286, 9287), // &vartri -> &vartria + new Transition (9304, 9305), // &Vb -> &Vba + new Transition (9308, 9309), // &vB -> &vBa + new Transition (9320, 9321), // &VD -> &VDa + new Transition (9325, 9326), // &Vd -> &Vda + new Transition (9330, 9331), // &vD -> &vDa + new Transition (9335, 9336), // &vd -> &vda + new Transition (9348, 9349), // &veeb -> &veeba + new Transition (9361, 9362), // &Verb -> &Verba + new Transition (9366, 9367), // &verb -> &verba + new Transition (9375, 9376), // &Vertic -> &Vertica + new Transition (9378, 9379), // &VerticalB -> &VerticalBa + new Transition (9389, 9390), // &VerticalSep -> &VerticalSepa + new Transition (9391, 9392), // &VerticalSepar -> &VerticalSepara + new Transition (9409, 9410), // &VeryThinSp -> &VeryThinSpa + new Transition (9472, 9473), // &Vvd -> &Vvda + new Transition (9480, 9481), // &vzigz -> &vzigza + new Transition (9498, 9499), // &wedb -> &wedba + new Transition (9535, 9536), // &wre -> &wrea + new Transition (9549, 9550), // &xc -> &xca + new Transition (9572, 9577), // &xh -> &xha + new Transition (9585, 9590), // &xl -> &xla + new Transition (9594, 9595), // &xm -> &xma + new Transition (9623, 9628), // &xr -> &xra + new Transition (9665, 9666), // &Y -> &Ya + new Transition (9672, 9673), // &y -> &ya + new Transition (9747, 9748), // &Z -> &Za + new Transition (9754, 9755), // &z -> &za + new Transition (9761, 9762), // &Zc -> &Zca + new Transition (9767, 9768), // &zc -> &zca + new Transition (9800, 9801), // &ZeroWidthSp -> &ZeroWidthSpa + new Transition (9805, 9806), // &Zet -> &Zeta + new Transition (9808, 9809), // &zet -> &zeta + new Transition (9827, 9828) // &zigr -> &zigra + }; + TransitionTable_b = new Transition[96] { + new Transition (0, 301), // & -> &b + new Transition (1, 15), // &A -> &Ab + new Transition (8, 21), // &a -> &ab + new Transition (147, 150), // &angmsda -> &angmsdab + new Transition (167, 168), // &angrtv -> &angrtvb + new Transition (301, 360), // &b -> &bb + new Transition (364, 365), // &bbrkt -> &bbrktb + new Transition (613, 614), // &box -> &boxb + new Transition (735, 736), // &brv -> &brvb + new Transition (758, 760), // &bsol -> &bsolb + new Transition (764, 765), // &bsolhsu -> &bsolhsub + new Transition (805, 811), // &cap -> &capb + new Transition (1101, 1102), // &CloseCurlyDou -> &CloseCurlyDoub + new Transition (1118, 1119), // &clu -> &club + new Transition (1278, 1279), // &csu -> &csub + new Transition (1318, 1320), // &cup -> &cupb + new Transition (1432, 1463), // &d -> &db + new Transition (1577, 1578), // &DiacriticalDou -> &DiacriticalDoub + new Transition (1731, 1732), // &dou -> &doub + new Transition (1734, 1735), // &double -> &doubleb + new Transition (1744, 1745), // &Dou -> &Doub + new Transition (2023, 2024), // &dr -> &drb + new Transition (2389, 2390), // &Equili -> &Equilib + new Transition (2701, 2730), // &g -> &gb + new Transition (2708, 2724), // &G -> &Gb + new Transition (3020, 3060), // &h -> &hb + new Transition (3101, 3102), // &Hil -> &Hilb + new Transition (3166, 3167), // &hor -> &horb + new Transition (3225, 3226), // &hy -> &hyb + new Transition (3447, 3448), // &Invisi -> &Invisib + new Transition (3692, 3812), // &l -> &lb + new Transition (3723, 3724), // &Lam -> &Lamb + new Transition (3728, 3729), // &lam -> &lamb + new Transition (3766, 3768), // &larr -> &larrb + new Transition (3812, 3817), // &lb -> &lbb + new Transition (3862, 3863), // &lcu -> &lcub + new Transition (3963, 3964), // &LeftDou -> &LeftDoub + new Transition (4325, 4334), // &lh -> &lhb + new Transition (4422, 4430), // &lo -> &lob + new Transition (4579, 4584), // &low -> &lowb + new Transition (4676, 4677), // &lsq -> &lsqb + new Transition (4892, 4894), // &minus -> &minusb + new Transition (4965, 5010), // &n -> &nb + new Transition (4966, 4967), // &na -> &nab + new Transition (5398, 5399), // &NotDou -> &NotDoub + new Transition (5521, 5524), // ¬inv -> ¬invb + new Transition (5623, 5626), // ¬niv -> ¬nivb + new Transition (5701, 5702), // &NotSquareSu -> &NotSquareSub + new Transition (5726, 5727), // &NotSu -> &NotSub + new Transition (5944, 5945), // &nsqsu -> &nsqsub + new Transition (5951, 5952), // &nsu -> &nsub + new Transition (6163, 6174), // &od -> &odb + new Transition (6168, 6169), // &Od -> &Odb + new Transition (6227, 6228), // &oh -> &ohb + new Transition (6316, 6317), // &OpenCurlyDou -> &OpenCurlyDoub + new Transition (6430, 6431), // &ov -> &ovb + new Transition (6567, 6574), // &plus -> &plusb + new Transition (6876, 6996), // &r -> &rb + new Transition (6932, 6937), // &rarr -> &rarrb + new Transition (6996, 7001), // &rb -> &rbb + new Transition (7046, 7047), // &rcu -> &rcub + new Transition (7114, 7115), // &ReverseEquili -> &ReverseEquilib + new Transition (7128, 7129), // &ReverseUpEquili -> &ReverseUpEquilib + new Transition (7238, 7239), // &RightDou -> &RightDoub + new Transition (7469, 7477), // &ro -> &rob + new Transition (7559, 7560), // &rsq -> &rsqb + new Transition (7617, 7624), // &s -> &sb + new Transition (7697, 7699), // &sdot -> &sdotb + new Transition (7942, 7944), // &sol -> &solb + new Transition (7985, 7986), // &sqsu -> &sqsub + new Transition (8033, 8034), // &SquareSu -> &SquareSub + new Transition (8127, 8128), // &Su -> &Sub + new Transition (8130, 8131), // &su -> &sub + new Transition (8193, 8194), // &subsu -> &subsub + new Transition (8297, 8298), // &supdsu -> &supdsub + new Transition (8325, 8326), // &suphsu -> &suphsub + new Transition (8370, 8371), // &supsu -> &supsub + new Transition (8401, 8402), // &Ta -> &Tab + new Transition (8404, 8415), // &t -> &tb + new Transition (8578, 8580), // × -> ×b + new Transition (8594, 8596), // &top -> &topb + new Transition (8690, 8691), // &tris -> &trisb + new Transition (8768, 8797), // &U -> &Ub + new Transition (8775, 8802), // &u -> &ub + new Transition (8829, 8840), // &ud -> &udb + new Transition (8834, 8835), // &Ud -> &Udb + new Transition (8876, 8883), // &uh -> &uhb + new Transition (9039, 9040), // &UpEquili -> &UpEquilib + new Transition (9258, 9259), // &varsu -> &varsub + new Transition (9303, 9304), // &V -> &Vb + new Transition (9346, 9348), // &vee -> &veeb + new Transition (9360, 9361), // &Ver -> &Verb + new Transition (9365, 9366), // &ver -> &verb + new Transition (9427, 9428), // &vnsu -> &vnsub + new Transition (9458, 9459), // &vsu -> &vsub + new Transition (9497, 9498) // &wed -> &wedb + }; + TransitionTable_c = new Transition[377] { + new Transition (0, 796), // & -> &c + new Transition (1, 33), // &A -> &Ac + new Transition (2, 3), // &Aa -> &Aac + new Transition (8, 27), // &a -> &ac + new Transition (9, 10), // &aa -> &aac + new Transition (35, 36), // &Acir ->  + new Transition (39, 40), // &acir -> â + new Transition (99, 100), // &Ama -> &Amac + new Transition (104, 105), // &ama -> &amac + new Transition (147, 152), // &angmsda -> &angmsdac + new Transition (201, 202), // &apa -> &apac + new Transition (222, 223), // &ApplyFun -> &ApplyFunc + new Transition (247, 248), // &As -> &Asc + new Transition (251, 252), // &as -> &asc + new Transition (289, 290), // &aw -> &awc + new Transition (301, 369), // &b -> &bc + new Transition (302, 303), // &ba -> &bac + new Transition (304, 305), // &back -> &backc + new Transition (331, 374), // &B -> &Bc + new Transition (332, 333), // &Ba -> &Bac + new Transition (384, 385), // &be -> &bec + new Transition (390, 391), // &Be -> &Bec + new Transition (443, 444), // &big -> &bigc + new Transition (449, 450), // &bigcir -> &bigcirc + new Transition (472, 473), // &bigsq -> &bigsqc + new Transition (520, 521), // &bla -> &blac + new Transition (575, 576), // &blo -> &bloc + new Transition (740, 741), // &Bs -> &Bsc + new Transition (744, 745), // &bs -> &bsc + new Transition (789, 866), // &C -> &Cc + new Transition (790, 791), // &Ca -> &Cac + new Transition (796, 861), // &c -> &cc + new Transition (797, 798), // &ca -> &cac + new Transition (805, 817), // &cap -> &capc + new Transition (812, 813), // &capbr -> &capbrc + new Transition (887, 888), // &Ccir -> &Ccirc + new Transition (891, 892), // &ccir -> &ccirc + new Transition (956, 957), // &CH -> &CHc + new Transition (960, 961), // &ch -> &chc + new Transition (964, 965), // &che -> &chec + new Transition (979, 981), // &cir -> &circ + new Transition (1004, 1009), // &circled -> &circledc + new Transition (1011, 1012), // &circledcir -> &circledcirc + new Transition (1020, 1021), // &Cir -> &Circ + new Transition (1063, 1064), // &cirs -> &cirsc + new Transition (1069, 1070), // &Clo -> &Cloc + new Transition (1213, 1214), // &Coprodu -> &Coproduc + new Transition (1233, 1234), // &CounterClo -> &CounterCloc + new Transition (1270, 1271), // &Cs -> &Csc + new Transition (1274, 1275), // &cs -> &csc + new Transition (1305, 1306), // &cues -> &cuesc + new Transition (1318, 1330), // &cup -> &cupc + new Transition (1321, 1322), // &cupbr -> &cupbrc + new Transition (1359, 1360), // &curlyeqpre -> &curlyeqprec + new Transition (1363, 1364), // &curlyeqsu -> &curlyeqsuc + new Transition (1364, 1365), // &curlyeqsuc -> &curlyeqsucc + new Transition (1407, 1408), // &cw -> &cwc + new Transition (1420, 1421), // &cyl -> &cylc + new Transition (1425, 1474), // &D -> &Dc + new Transition (1432, 1480), // &d -> &dc + new Transition (1471, 1472), // &dbla -> &dblac + new Transition (1558, 1559), // &Dia -> &Diac + new Transition (1563, 1564), // &Diacriti -> &Diacritic + new Transition (1567, 1568), // &DiacriticalA -> &DiacriticalAc + new Transition (1581, 1582), // &DiacriticalDoubleA -> &DiacriticalDoubleAc + new Transition (1661, 1662), // &DJ -> &DJc + new Transition (1665, 1666), // &dj -> &djc + new Transition (1669, 1670), // &dl -> &dlc + new Transition (1873, 1874), // &DoubleVerti -> &DoubleVertic + new Transition (1960, 1961), // &DownLeftRightVe -> &DownLeftRightVec + new Transition (1970, 1971), // &DownLeftTeeVe -> &DownLeftTeeVec + new Transition (1977, 1978), // &DownLeftVe -> &DownLeftVec + new Transition (1996, 1997), // &DownRightTeeVe -> &DownRightTeeVec + new Transition (2003, 2004), // &DownRightVe -> &DownRightVec + new Transition (2023, 2031), // &dr -> &drc + new Transition (2040, 2041), // &Ds -> &Dsc + new Transition (2044, 2045), // &ds -> &dsc + new Transition (2048, 2049), // &DS -> &DSc + new Transition (2093, 2094), // &DZ -> &DZc + new Transition (2097, 2098), // &dz -> &dzc + new Transition (2108, 2127), // &E -> &Ec + new Transition (2109, 2110), // &Ea -> &Eac + new Transition (2115, 2133), // &e -> &ec + new Transition (2116, 2117), // &ea -> &eac + new Transition (2140, 2146), // &ecir -> ê + new Transition (2143, 2144), // &Ecir -> Ê + new Transition (2229, 2230), // &Ema -> &Emac + new Transition (2234, 2235), // &ema -> &emac + new Transition (2339, 2340), // &eq -> &eqc + new Transition (2342, 2343), // &eqcir -> &eqcirc + new Transition (2418, 2419), // &Es -> &Esc + new Transition (2422, 2423), // &es -> &esc + new Transition (2458, 2459), // &ex -> &exc + new Transition (2473, 2474), // &expe -> &expec + new Transition (2503, 2521), // &f -> &fc + new Transition (2517, 2518), // &F -> &Fc + new Transition (2648, 2649), // &fra -> &frac + new Transition (2693, 2694), // &Fs -> &Fsc + new Transition (2697, 2698), // &fs -> &fsc + new Transition (2701, 2746), // &g -> &gc + new Transition (2702, 2703), // &ga -> &gac + new Transition (2708, 2736), // &G -> &Gc + new Transition (2743, 2744), // &Gcir -> &Gcirc + new Transition (2748, 2749), // &gcir -> &gcirc + new Transition (2781, 2783), // &ges -> &gesc + new Transition (2783, 2784), // &gesc -> &gescc + new Transition (2816, 2817), // &GJ -> &GJc + new Transition (2820, 2821), // &gj -> &gjc + new Transition (2923, 2924), // &Gs -> &Gsc + new Transition (2927, 2928), // &gs -> &gsc + new Transition (2942, 2944), // > -> >c + new Transition (2944, 2945), // >c -> >cc + new Transition (3014, 3064), // &H -> &Hc + new Transition (3015, 3016), // &Ha -> &Hac + new Transition (3020, 3069), // &h -> &hc + new Transition (3037, 3038), // &HARD -> &HARDc + new Transition (3042, 3043), // &hard -> &hardc + new Transition (3050, 3052), // &harr -> &harrc + new Transition (3066, 3067), // &Hcir -> &Hcirc + new Transition (3071, 3072), // &hcir -> &hcirc + new Transition (3089, 3090), // &her -> &herc + new Transition (3108, 3109), // &HilbertSpa -> &HilbertSpac + new Transition (3184, 3185), // &Hs -> &Hsc + new Transition (3188, 3189), // &hs -> &hsc + new Transition (3236, 3252), // &I -> &Ic + new Transition (3237, 3238), // &Ia -> &Iac + new Transition (3243, 3250), // &i -> &ic + new Transition (3244, 3245), // &ia -> &iac + new Transition (3254, 3255), // &Icir -> Î + new Transition (3258, 3259), // &icir -> î + new Transition (3269, 3270), // &IE -> &IEc + new Transition (3273, 3274), // &ie -> &iec + new Transition (3277, 3278), // &iex -> &iexc + new Transition (3332, 3333), // &Ima -> &Imac + new Transition (3337, 3338), // &ima -> &imac + new Transition (3378, 3380), // &in -> &inc + new Transition (3401, 3403), // &int -> &intc + new Transition (3419, 3420), // &inter -> &interc + new Transition (3426, 3427), // &Interse -> &Intersec + new Transition (3463, 3464), // &IO -> &IOc + new Transition (3467, 3468), // &io -> &ioc + new Transition (3503, 3504), // &Is -> &Isc + new Transition (3507, 3508), // &is -> &isc + new Transition (3540, 3541), // &Iuk -> &Iukc + new Transition (3545, 3546), // &iuk -> &iukc + new Transition (3555, 3556), // &J -> &Jc + new Transition (3558, 3559), // &Jcir -> &Jcirc + new Transition (3561, 3562), // &j -> &jc + new Transition (3564, 3565), // &jcir -> &jcirc + new Transition (3590, 3591), // &Js -> &Jsc + new Transition (3594, 3595), // &js -> &jsc + new Transition (3599, 3600), // &Jser -> &Jserc + new Transition (3604, 3605), // &jser -> &jserc + new Transition (3609, 3610), // &Juk -> &Jukc + new Transition (3614, 3615), // &juk -> &jukc + new Transition (3618, 3632), // &K -> &Kc + new Transition (3624, 3638), // &k -> &kc + new Transition (3660, 3661), // &KH -> &KHc + new Transition (3664, 3665), // &kh -> &khc + new Transition (3668, 3669), // &KJ -> &KJc + new Transition (3672, 3673), // &kj -> &kjc + new Transition (3684, 3685), // &Ks -> &Ksc + new Transition (3688, 3689), // &ks -> &ksc + new Transition (3692, 3843), // &l -> &lc + new Transition (3698, 3837), // &L -> &Lc + new Transition (3699, 3700), // &La -> &Lac + new Transition (3705, 3706), // &la -> &lac + new Transition (3748, 3749), // &Lapla -> &Laplac + new Transition (3822, 3823), // &lbra -> &lbrac + new Transition (3869, 3870), // &ld -> &ldc + new Transition (3908, 3909), // &LeftAngleBra -> &LeftAngleBrac + new Transition (3969, 3970), // &LeftDoubleBra -> &LeftDoubleBrac + new Transition (3981, 3982), // &LeftDownTeeVe -> &LeftDownTeeVec + new Transition (3988, 3989), // &LeftDownVe -> &LeftDownVec + new Transition (4086, 4087), // &LeftRightVe -> &LeftRightVec + new Transition (4103, 4104), // &LeftTeeVe -> &LeftTeeVec + new Transition (4145, 4146), // &LeftUpDownVe -> &LeftUpDownVec + new Transition (4155, 4156), // &LeftUpTeeVe -> &LeftUpTeeVec + new Transition (4162, 4163), // &LeftUpVe -> &LeftUpVec + new Transition (4173, 4174), // &LeftVe -> &LeftVec + new Transition (4197, 4199), // &les -> &lesc + new Transition (4199, 4200), // &lesc -> &lescc + new Transition (4338, 4339), // &LJ -> &LJc + new Transition (4342, 4343), // &lj -> &ljc + new Transition (4348, 4354), // &ll -> &llc + new Transition (4396, 4397), // &lmousta -> &lmoustac + new Transition (4628, 4633), // &lr -> &lrc + new Transition (4652, 4662), // &ls -> &lsc + new Transition (4658, 4659), // &Ls -> &Lsc + new Transition (4698, 4700), // < -> <c + new Transition (4700, 4701), // <c -> <cc + new Transition (4767, 4809), // &m -> &mc + new Transition (4768, 4769), // &ma -> &mac + new Transition (4781, 4815), // &M -> &Mc + new Transition (4850, 4851), // &MediumSpa -> &MediumSpac + new Transition (4871, 4872), // &mi -> &mic + new Transition (4876, 4882), // &mid -> &midc + new Transition (4909, 4910), // &ml -> &mlc + new Transition (4937, 4938), // &Ms -> &Msc + new Transition (4941, 4942), // &ms -> &msc + new Transition (4965, 5020), // &n -> &nc + new Transition (4966, 4978), // &na -> &nac + new Transition (4971, 5024), // &N -> &Nc + new Transition (4972, 4973), // &Na -> &Nac + new Transition (5099, 5100), // &NegativeMediumSpa -> &NegativeMediumSpac + new Transition (5105, 5106), // &NegativeThi -> &NegativeThic + new Transition (5110, 5111), // &NegativeThickSpa -> &NegativeThickSpac + new Transition (5117, 5118), // &NegativeThinSpa -> &NegativeThinSpac + new Transition (5131, 5132), // &NegativeVeryThinSpa -> &NegativeVeryThinSpac + new Transition (5248, 5249), // &NJ -> &NJc + new Transition (5252, 5253), // &nj -> &njc + new Transition (5365, 5366), // &NonBreakingSpa -> &NonBreakingSpac + new Transition (5406, 5407), // &NotDoubleVerti -> &NotDoubleVertic + new Transition (5521, 5526), // ¬inv -> ¬invc + new Transition (5623, 5628), // ¬niv -> ¬nivc + new Transition (5632, 5633), // &NotPre -> &NotPrec + new Transition (5726, 5738), // &NotSu -> &NotSuc + new Transition (5738, 5739), // &NotSuc -> &NotSucc + new Transition (5813, 5814), // &NotVerti -> &NotVertic + new Transition (5842, 5844), // &npr -> &nprc + new Transition (5848, 5850), // &npre -> &nprec + new Transition (5862, 5864), // &nrarr -> &nrarrc + new Transition (5895, 5896), // &ns -> &nsc + new Transition (5896, 5898), // &nsc -> &nscc + new Transition (5904, 5905), // &Ns -> &Nsc + new Transition (5951, 5967), // &nsu -> &nsuc + new Transition (5967, 5968), // &nsuc -> &nsucc + new Transition (6131, 6152), // &O -> &Oc + new Transition (6132, 6133), // &Oa -> &Oac + new Transition (6138, 6148), // &o -> &oc + new Transition (6139, 6140), // &oa -> &oac + new Transition (6150, 6157), // &ocir -> ô + new Transition (6154, 6155), // &Ocir -> Ô + new Transition (6171, 6172), // &Odbla -> &Odblac + new Transition (6176, 6177), // &odbla -> &odblac + new Transition (6200, 6201), // &of -> &ofc + new Transition (6238, 6243), // &ol -> &olc + new Transition (6259, 6260), // &Oma -> &Omac + new Transition (6264, 6265), // &oma -> &omac + new Transition (6276, 6277), // &Omi -> &Omic + new Transition (6282, 6283), // &omi -> &omic + new Transition (6378, 6379), // &Os -> &Osc + new Transition (6382, 6383), // &os -> &osc + new Transition (6443, 6444), // &OverBra -> &OverBrac + new Transition (6463, 6494), // &p -> &pc + new Transition (6482, 6491), // &P -> &Pc + new Transition (6498, 6499), // &per -> &perc + new Transition (6545, 6546), // &pit -> &pitc + new Transition (6557, 6558), // &plan -> &planc + new Transition (6567, 6576), // &plus -> &plusc + new Transition (6569, 6570), // &plusa -> &plusac + new Transition (6611, 6612), // &Poin -> &Poinc + new Transition (6642, 6647), // &pr -> &prc + new Transition (6653, 6655), // &pre -> &prec + new Transition (6655, 6664), // &prec -> &precc + new Transition (6672, 6673), // &Pre -> &Prec + new Transition (6750, 6751), // &Produ -> &Produc + new Transition (6795, 6796), // &Ps -> &Psc + new Transition (6799, 6800), // &ps -> &psc + new Transition (6808, 6809), // &pun -> &punc + new Transition (6839, 6840), // &Qs -> &Qsc + new Transition (6843, 6844), // &qs -> &qsc + new Transition (6876, 7027), // &r -> &rc + new Transition (6882, 6883), // &ra -> &rac + new Transition (6886, 7021), // &R -> &Rc + new Transition (6887, 6888), // &Ra -> &Rac + new Transition (6898, 6899), // &radi -> &radic + new Transition (6932, 6942), // &rarr -> &rarrc + new Transition (7006, 7007), // &rbra -> &rbrac + new Transition (7053, 7054), // &rd -> &rdc + new Transition (7074, 7089), // &re -> &rec + new Transition (7182, 7183), // &RightAngleBra -> &RightAngleBrac + new Transition (7244, 7245), // &RightDoubleBra -> &RightDoubleBrac + new Transition (7256, 7257), // &RightDownTeeVe -> &RightDownTeeVec + new Transition (7263, 7264), // &RightDownVe -> &RightDownVec + new Transition (7348, 7349), // &RightTeeVe -> &RightTeeVec + new Transition (7390, 7391), // &RightUpDownVe -> &RightUpDownVec + new Transition (7400, 7401), // &RightUpTeeVe -> &RightUpTeeVec + new Transition (7407, 7408), // &RightUpVe -> &RightUpVec + new Transition (7418, 7419), // &RightVe -> &RightVec + new Transition (7459, 7460), // &rmousta -> &rmoustac + new Transition (7542, 7552), // &rs -> &rsc + new Transition (7548, 7549), // &Rs -> &Rsc + new Transition (7610, 7629), // &S -> &Sc + new Transition (7611, 7612), // &Sa -> &Sac + new Transition (7617, 7631), // &s -> &sc + new Transition (7618, 7619), // &sa -> &sac + new Transition (7631, 7645), // &sc -> &scc + new Transition (7663, 7664), // &Scir -> &Scirc + new Transition (7667, 7668), // &scir -> &scirc + new Transition (7703, 7718), // &se -> &sec + new Transition (7751, 7762), // &sh -> &shc + new Transition (7756, 7767), // &SH -> &SHc + new Transition (7758, 7759), // &SHCH -> &SHCHc + new Transition (7763, 7764), // &shch -> &shchc + new Transition (7889, 7890), // &SmallCir -> &SmallCirc + new Transition (7932, 7933), // &SOFT -> &SOFTc + new Transition (7938, 7939), // &soft -> &softc + new Transition (7968, 7969), // &sq -> &sqc + new Transition (8025, 8026), // &SquareInterse -> &SquareIntersec + new Transition (8073, 8074), // &Ss -> &Ssc + new Transition (8077, 8078), // &ss -> &ssc + new Transition (8127, 8216), // &Su -> &Suc + new Transition (8130, 8198), // &su -> &suc + new Transition (8198, 8199), // &suc -> &succ + new Transition (8199, 8208), // &succ -> &succc + new Transition (8216, 8217), // &Suc -> &Succ + new Transition (8400, 8419), // &T -> &Tc + new Transition (8404, 8425), // &t -> &tc + new Transition (8452, 8453), // &telre -> &telrec + new Transition (8493, 8494), // &thi -> &thic + new Transition (8507, 8508), // &Thi -> &Thic + new Transition (8512, 8513), // &ThickSpa -> &ThickSpac + new Transition (8523, 8524), // &ThinSpa -> &ThinSpac + new Transition (8594, 8600), // &top -> &topc + new Transition (8705, 8706), // &Ts -> &Tsc + new Transition (8709, 8710), // &ts -> &tsc + new Transition (8713, 8714), // &TS -> &TSc + new Transition (8719, 8720), // &TSH -> &TSHc + new Transition (8723, 8724), // &tsh -> &tshc + new Transition (8768, 8815), // &U -> &Uc + new Transition (8769, 8770), // &Ua -> &Uac + new Transition (8775, 8820), // &u -> &uc + new Transition (8776, 8777), // &ua -> &uac + new Transition (8792, 8793), // &Uarro -> &Uarroc + new Transition (8798, 8799), // &Ubr -> &Ubrc + new Transition (8803, 8804), // &ubr -> &ubrc + new Transition (8817, 8818), // &Ucir -> Û + new Transition (8822, 8823), // &ucir -> û + new Transition (8837, 8838), // &Udbla -> &Udblac + new Transition (8842, 8843), // &udbla -> &udblac + new Transition (8887, 8888), // &ul -> &ulc + new Transition (8905, 8906), // &Uma -> &Umac + new Transition (8910, 8911), // &uma -> &umac + new Transition (8925, 8926), // &UnderBra -> &UnderBrac + new Transition (9127, 9128), // &ur -> &urc + new Transition (9153, 9154), // &Us -> &Usc + new Transition (9157, 9158), // &us -> &usc + new Transition (9201, 9317), // &v -> &vc + new Transition (9303, 9314), // &V -> &Vc + new Transition (9374, 9375), // &Verti -> &Vertic + new Transition (9410, 9411), // &VeryThinSpa -> &VeryThinSpac + new Transition (9450, 9451), // &Vs -> &Vsc + new Transition (9454, 9455), // &vs -> &vsc + new Transition (9484, 9485), // &W -> &Wc + new Transition (9487, 9488), // &Wcir -> &Wcirc + new Transition (9490, 9491), // &w -> &wc + new Transition (9493, 9494), // &wcir -> &wcirc + new Transition (9540, 9541), // &Ws -> &Wsc + new Transition (9544, 9545), // &ws -> &wsc + new Transition (9548, 9549), // &x -> &xc + new Transition (9554, 9555), // &xcir -> &xcirc + new Transition (9632, 9633), // &Xs -> &Xsc + new Transition (9636, 9637), // &xs -> &xsc + new Transition (9640, 9641), // &xsq -> &xsqc + new Transition (9665, 9685), // &Y -> &Yc + new Transition (9666, 9667), // &Ya -> &Yac + new Transition (9672, 9690), // &y -> &yc + new Transition (9673, 9674), // &ya -> &yac + new Transition (9679, 9680), // &YA -> &YAc + new Transition (9687, 9688), // &Ycir -> &Ycirc + new Transition (9692, 9693), // &ycir -> &ycirc + new Transition (9708, 9709), // &YI -> &YIc + new Transition (9712, 9713), // &yi -> &yic + new Transition (9724, 9725), // &Ys -> &Ysc + new Transition (9728, 9729), // &ys -> &ysc + new Transition (9732, 9733), // &YU -> &YUc + new Transition (9736, 9737), // &yu -> &yuc + new Transition (9747, 9761), // &Z -> &Zc + new Transition (9748, 9749), // &Za -> &Zac + new Transition (9754, 9767), // &z -> &zc + new Transition (9755, 9756), // &za -> &zac + new Transition (9801, 9802), // &ZeroWidthSpa -> &ZeroWidthSpac + new Transition (9817, 9818), // &ZH -> &ZHc + new Transition (9821, 9822), // &zh -> &zhc + new Transition (9840, 9841), // &Zs -> &Zsc + new Transition (9844, 9845) // &zs -> &zsc + }; + TransitionTable_d = new Transition[206] { + new Transition (0, 1432), // & -> &d + new Transition (27, 29), // &ac -> &acd + new Transition (116, 117), // &An -> &And + new Transition (119, 120), // &an -> &and + new Transition (120, 126), // &and -> &andd + new Transition (123, 124), // &andan -> &andand + new Transition (144, 145), // &angms -> &angmsd + new Transition (147, 154), // &angmsda -> &angmsdad + new Transition (168, 170), // &angrtvb -> &angrtvbd + new Transition (210, 211), // &api -> &apid + new Transition (271, 272), // &Atil -> &Atild + new Transition (277, 278), // &atil -> &atild + new Transition (301, 379), // &b -> &bd + new Transition (350, 351), // &Barwe -> &Barwed + new Transition (354, 355), // &barwe -> &barwed + new Transition (455, 456), // &bigo -> &bigod + new Transition (488, 489), // &bigtriangle -> &bigtriangled + new Transition (508, 509), // &bigwe -> &bigwed + new Transition (545, 547), // &blacktriangle -> &blacktriangled + new Transition (613, 623), // &box -> &boxd + new Transition (636, 642), // &boxH -> &boxHd + new Transition (638, 646), // &boxh -> &boxhd + new Transition (789, 907), // &C -> &Cd + new Transition (796, 911), // &c -> &cd + new Transition (805, 824), // &cap -> &capd + new Transition (808, 809), // &capan -> &capand + new Transition (876, 877), // &Cce -> &Cced + new Transition (881, 882), // &cce -> &cced + new Transition (915, 916), // &ce -> &ced + new Transition (920, 921), // &Ce -> &Ced + new Transition (945, 946), // ¢er -> ¢erd + new Transition (987, 1004), // &circle -> &circled + new Transition (1004, 1014), // &circled -> &circledd + new Transition (1060, 1061), // &cirmi -> &cirmid + new Transition (1165, 1167), // &cong -> &congd + new Transition (1207, 1208), // &copro -> &coprod + new Transition (1211, 1212), // &Copro -> &Coprod + new Transition (1287, 1288), // &ct -> &ctd + new Transition (1292, 1293), // &cu -> &cud + new Transition (1318, 1337), // &cup -> &cupd + new Transition (1372, 1373), // &curlywe -> &curlywed + new Transition (1404, 1405), // &cuwe -> &cuwed + new Transition (1432, 1492), // &d -> &dd + new Transition (1507, 1508), // &DDotrah -> &DDotrahd + new Transition (1595, 1596), // &DiacriticalTil -> &DiacriticalTild + new Transition (1605, 1606), // &Diamon -> &Diamond + new Transition (1609, 1610), // &diamon -> &diamond + new Transition (1645, 1646), // &divi -> &divid + new Transition (1701, 1703), // &doteq -> &doteqd + new Transition (1739, 1740), // &doublebarwe -> &doublebarwed + new Transition (1896, 1921), // &down -> &downd + new Transition (2067, 2068), // &dt -> &dtd + new Transition (2108, 2162), // &E -> &Ed + new Transition (2115, 2169), // &e -> &ed + new Transition (2198, 2200), // &egs -> &egsd + new Transition (2222, 2224), // &els -> &elsd + new Transition (2379, 2380), // &EqualTil -> &EqualTild + new Transition (2422, 2426), // &es -> &esd + new Transition (2509, 2510), // &falling -> &fallingd + new Transition (2557, 2558), // &Fille -> &Filled + new Transition (2701, 2759), // &g -> &gd + new Transition (2708, 2755), // &G -> &Gd + new Transition (2712, 2718), // &Gamma -> &Gammad + new Transition (2716, 2720), // &gamma -> &gammad + new Transition (2737, 2738), // &Gce -> &Gced + new Transition (2781, 2786), // &ges -> &gesd + new Transition (2919, 2920), // &GreaterTil -> &GreaterTild + new Transition (2942, 2950), // > -> >d + new Transition (2965, 2976), // >r -> >rd + new Transition (3041, 3042), // &har -> &hard + new Transition (3236, 3265), // &I -> &Id + new Transition (3369, 3370), // &impe -> &imped + new Transition (3393, 3394), // &ino -> &inod + new Transition (3441, 3442), // &intpro -> &intprod + new Transition (3494, 3495), // &ipro -> &iprod + new Transition (3512, 3514), // &isin -> &isind + new Transition (3530, 3531), // &Itil -> &Itild + new Transition (3535, 3536), // &itil -> &itild + new Transition (3633, 3634), // &Kce -> &Kced + new Transition (3639, 3640), // &kce -> &kced + new Transition (3692, 3869), // &l -> &ld + new Transition (3724, 3725), // &Lamb -> &Lambd + new Transition (3729, 3730), // &lamb -> &lambd + new Transition (3737, 3739), // &lang -> &langd + new Transition (3832, 3833), // &lbrksl -> &lbrksld + new Transition (3849, 3850), // &Lce -> &Lced + new Transition (3854, 3855), // &lce -> &lced + new Transition (3879, 3880), // &ldr -> &ldrd + new Transition (4010, 4011), // &leftharpoon -> &leftharpoond + new Transition (4197, 4202), // &les -> &lesd + new Transition (4215, 4223), // &less -> &lessd + new Transition (4297, 4298), // &LessTil -> &LessTild + new Transition (4327, 4328), // &lhar -> &lhard + new Transition (4372, 4373), // &llhar -> &llhard + new Transition (4380, 4381), // &Lmi -> &Lmid + new Transition (4386, 4387), // &lmi -> &lmid + new Transition (4642, 4644), // &lrhar -> &lrhard + new Transition (4698, 4706), // < -> <d + new Transition (4743, 4744), // &lur -> &lurd + new Transition (4767, 4820), // &m -> &md + new Transition (4789, 4791), // &mapsto -> &mapstod + new Transition (4835, 4836), // &measure -> &measured + new Transition (4843, 4844), // &Me -> &Med + new Transition (4871, 4876), // &mi -> &mid + new Transition (4876, 4886), // &mid -> &midd + new Transition (4892, 4896), // &minus -> &minusd + new Transition (4909, 4913), // &ml -> &mld + new Transition (4922, 4923), // &mo -> &mod + new Transition (4965, 5059), // &n -> &nd + new Transition (4990, 4991), // &napi -> &napid + new Transition (5034, 5035), // &Nce -> &Nced + new Transition (5039, 5040), // &nce -> &nced + new Transition (5046, 5048), // &ncong -> &ncongd + new Transition (5064, 5080), // &ne -> &ned + new Transition (5092, 5093), // &NegativeMe -> &NegativeMed + new Transition (5150, 5151), // &Neste -> &Nested + new Transition (5242, 5244), // &nis -> &nisd + new Transition (5256, 5265), // &nl -> &nld + new Transition (5344, 5345), // &nmi -> &nmid + new Transition (5429, 5430), // &NotEqualTil -> &NotEqualTild + new Transition (5489, 5490), // &NotGreaterTil -> &NotGreaterTild + new Transition (5513, 5515), // ¬in -> ¬ind + new Transition (5586, 5587), // &NotLessTil -> &NotLessTild + new Transition (5594, 5595), // &NotNeste -> &NotNested + new Transition (5634, 5635), // &NotPrece -> &NotPreced + new Transition (5741, 5742), // &NotSuccee -> &NotSucceed + new Transition (5764, 5765), // &NotSucceedsTil -> &NotSucceedsTild + new Transition (5783, 5784), // &NotTil -> &NotTild + new Transition (5805, 5806), // &NotTildeTil -> &NotTildeTild + new Transition (5915, 5916), // &nshortmi -> &nshortmid + new Transition (5935, 5936), // &nsmi -> &nsmid + new Transition (5994, 5995), // &Ntil -> &Ntild + new Transition (5999, 6000), // &ntil -> &ntild + new Transition (6043, 6063), // &nv -> &nvd + new Transition (6047, 6053), // &nV -> &nVd + new Transition (6131, 6168), // &O -> &Od + new Transition (6138, 6163), // &o -> &od + new Transition (6187, 6188), // &odsol -> &odsold + new Transition (6282, 6288), // &omi -> &omid + new Transition (6342, 6348), // &or -> &ord + new Transition (6401, 6402), // &Otil -> &Otild + new Transition (6407, 6408), // &otil -> &otild + new Transition (6504, 6505), // &perio -> &period + new Transition (6567, 6580), // &plus -> &plusd + new Transition (6637, 6638), // &poun -> £ + new Transition (6674, 6675), // &Prece -> &Preced + new Transition (6698, 6699), // &PrecedesTil -> &PrecedesTild + new Transition (6745, 6746), // &pro -> &prod + new Transition (6748, 6749), // &Pro -> &Prod + new Transition (6876, 7053), // &r -> &rd + new Transition (6882, 6897), // &ra -> &rad + new Transition (6912, 6914), // &rang -> &rangd + new Transition (7016, 7017), // &rbrksl -> &rbrksld + new Transition (7033, 7034), // &Rce -> &Rced + new Transition (7038, 7039), // &rce -> &rced + new Transition (7057, 7058), // &rdl -> &rdld + new Transition (7157, 7158), // &rhar -> &rhard + new Transition (7285, 7286), // &rightharpoon -> &rightharpoond + new Transition (7434, 7435), // &rising -> &risingd + new Transition (7466, 7467), // &rnmi -> &rnmid + new Transition (7502, 7503), // &Roun -> &Round + new Transition (7598, 7599), // &RuleDelaye -> &RuleDelayed + new Transition (7617, 7695), // &s -> &sd + new Transition (7651, 7658), // &sce -> &sced + new Transition (7653, 7654), // &Sce -> &Sced + new Transition (7800, 7801), // &shortmi -> &shortmid + new Transition (7847, 7849), // &sim -> &simd + new Transition (7918, 7919), // &smi -> &smid + new Transition (7957, 7958), // &spa -> &spad + new Transition (8131, 8133), // &sub -> &subd + new Transition (8139, 8141), // &sube -> &subed + new Transition (8219, 8220), // &Succee -> &Succeed + new Transition (8242, 8243), // &SucceedsTil -> &SucceedsTild + new Transition (8284, 8292), // &sup -> &supd + new Transition (8302, 8304), // &supe -> &suped + new Transition (8404, 8445), // &t -> &td + new Transition (8431, 8432), // &Tce -> &Tced + new Transition (8436, 8437), // &tce -> &tced + new Transition (8545, 8546), // &Til -> &Tild + new Transition (8550, 8551), // &til -> &tild + new Transition (8572, 8573), // &TildeTil -> &TildeTild + new Transition (8578, 8585), // × -> ×d + new Transition (8629, 8630), // &tra -> &trad + new Transition (8633, 8664), // &tri -> &trid + new Transition (8638, 8640), // &triangle -> &triangled + new Transition (8745, 8746), // &twohea -> &twohead + new Transition (8768, 8834), // &U -> &Ud + new Transition (8775, 8829), // &u -> &ud + new Transition (8916, 8917), // &Un -> &Und + new Transition (8970, 9014), // &Up -> &Upd + new Transition (8983, 9024), // &up -> &upd + new Transition (9161, 9162), // &ut -> &utd + new Transition (9168, 9169), // &Util -> &Utild + new Transition (9173, 9174), // &util -> &utild + new Transition (9201, 9335), // &v -> &vd + new Transition (9303, 9325), // &V -> &Vd + new Transition (9399, 9400), // &VerticalTil -> &VerticalTild + new Transition (9471, 9472), // &Vv -> &Vvd + new Transition (9496, 9497), // &we -> &wed + new Transition (9502, 9503), // &We -> &Wed + new Transition (9548, 9560), // &x -> &xd + new Transition (9602, 9603), // &xo -> &xod + new Transition (9660, 9661), // &xwe -> &xwed + new Transition (9747, 9777), // &Z -> &Zd + new Transition (9754, 9781), // &z -> &zd + new Transition (9795, 9796) // &ZeroWi -> &ZeroWid + }; + TransitionTable_e = new Transition[674] { + new Transition (0, 2115), // & -> &e + new Transition (5, 6), // &Aacut -> Á + new Transition (8, 55), // &a -> &ae + new Transition (12, 13), // &aacut -> á + new Transition (16, 17), // &Abr -> &Abre + new Transition (18, 19), // &Abrev -> &Abreve + new Transition (22, 23), // &abr -> &abre + new Transition (24, 25), // &abrev -> &abreve + new Transition (43, 44), // &acut -> ´ + new Transition (70, 71), // &Agrav -> À + new Transition (76, 77), // &agrav -> à + new Transition (79, 80), // &al -> &ale + new Transition (131, 132), // &andslop -> &andslope + new Transition (136, 138), // &ang -> &ange + new Transition (140, 141), // &angl -> &angle + new Transition (147, 156), // &angmsda -> &angmsdae + new Transition (199, 208), // &ap -> &ape + new Transition (232, 234), // &approx -> &approxe + new Transition (264, 266), // &asymp -> &asympe + new Transition (272, 273), // &Atild -> à + new Transition (278, 279), // &atild -> ã + new Transition (301, 384), // &b -> &be + new Transition (304, 310), // &back -> &backe + new Transition (321, 322), // &backprim -> &backprime + new Transition (326, 328), // &backsim -> &backsime + new Transition (331, 390), // &B -> &Be + new Transition (345, 346), // &barv -> &barve + new Transition (346, 347), // &barve -> &barvee + new Transition (349, 350), // &Barw -> &Barwe + new Transition (353, 354), // &barw -> &barwe + new Transition (357, 358), // &barwedg -> &barwedge + new Transition (388, 397), // &becaus -> &because + new Transition (394, 395), // &Becaus -> &Because + new Transition (431, 432), // &betw -> &betwe + new Transition (432, 433), // &betwe -> &betwee + new Transition (467, 468), // &bigotim -> &bigotime + new Transition (487, 488), // &bigtriangl -> &bigtriangle + new Transition (503, 504), // &bigv -> &bigve + new Transition (504, 505), // &bigve -> &bigvee + new Transition (507, 508), // &bigw -> &bigwe + new Transition (510, 511), // &bigwedg -> &bigwedge + new Transition (525, 526), // &blackloz -> &blackloze + new Transition (528, 529), // &blacklozeng -> &blacklozenge + new Transition (535, 536), // &blacksquar -> &blacksquare + new Transition (544, 545), // &blacktriangl -> &blacktriangle + new Transition (552, 553), // &blacktrianglel -> &blacktrianglele + new Transition (579, 580), // &bn -> &bne + new Transition (610, 611), // &bowti -> &bowtie + new Transition (669, 670), // &boxtim -> &boxtime + new Transition (722, 723), // &bprim -> &bprime + new Transition (725, 726), // &Br -> &Bre + new Transition (727, 728), // &Brev -> &Breve + new Transition (730, 731), // &br -> &bre + new Transition (732, 733), // &brev -> &breve + new Transition (744, 748), // &bs -> &bse + new Transition (753, 755), // &bsim -> &bsime + new Transition (769, 771), // &bull -> &bulle + new Transition (775, 779), // &bump -> &bumpe + new Transition (783, 784), // &Bump -> &Bumpe + new Transition (789, 920), // &C -> &Ce + new Transition (793, 794), // &Cacut -> &Cacute + new Transition (796, 915), // &c -> &ce + new Transition (800, 801), // &cacut -> &cacute + new Transition (835, 836), // &CapitalDiff -> &CapitalDiffe + new Transition (837, 838), // &CapitalDiffer -> &CapitalDiffere + new Transition (848, 849), // &car -> &care + new Transition (856, 857), // &Cayl -> &Cayle + new Transition (861, 881), // &cc -> &cce + new Transition (866, 876), // &Cc -> &Cce + new Transition (934, 944), // ¢ -> ¢e + new Transition (937, 938), // &Cent -> &Cente + new Transition (960, 964), // &ch -> &che + new Transition (979, 1051), // &cir -> &cire + new Transition (981, 983), // &circ -> &circe + new Transition (986, 987), // &circl -> &circle + new Transition (993, 994), // &circlearrowl -> &circlearrowle + new Transition (1022, 1023), // &Circl -> &Circle + new Transition (1045, 1046), // &CircleTim -> &CircleTime + new Transition (1074, 1075), // &Clockwis -> &Clockwise + new Transition (1085, 1086), // &ClockwiseContourInt -> &ClockwiseContourInte + new Transition (1092, 1093), // &Clos -> &Close + new Transition (1103, 1104), // &CloseCurlyDoubl -> &CloseCurlyDouble + new Transition (1108, 1109), // &CloseCurlyDoubleQuot -> &CloseCurlyDoubleQuote + new Transition (1114, 1115), // &CloseCurlyQuot -> &CloseCurlyQuote + new Transition (1129, 1136), // &Colon -> &Colone + new Transition (1134, 1138), // &colon -> &colone + new Transition (1153, 1154), // &compl -> &comple + new Transition (1155, 1156), // &complem -> &compleme + new Transition (1160, 1161), // &complex -> &complexe + new Transition (1174, 1175), // &Congru -> &Congrue + new Transition (1193, 1194), // &ContourInt -> &ContourInte + new Transition (1228, 1229), // &Count -> &Counte + new Transition (1238, 1239), // &CounterClockwis -> &CounterClockwise + new Transition (1249, 1250), // &CounterClockwiseContourInt -> &CounterClockwiseContourInte + new Transition (1279, 1281), // &csub -> &csube + new Transition (1283, 1285), // &csup -> &csupe + new Transition (1292, 1301), // &cu -> &cue + new Transition (1354, 1355), // &curly -> &curlye + new Transition (1358, 1359), // &curlyeqpr -> &curlyeqpre + new Transition (1367, 1368), // &curlyv -> &curlyve + new Transition (1368, 1369), // &curlyve -> &curlyvee + new Transition (1371, 1372), // &curlyw -> &curlywe + new Transition (1374, 1375), // &curlywedg -> &curlywedge + new Transition (1377, 1378), // &curr -> &curre + new Transition (1381, 1382), // &curv -> &curve + new Transition (1388, 1389), // &curvearrowl -> &curvearrowle + new Transition (1399, 1400), // &cuv -> &cuve + new Transition (1400, 1401), // &cuve -> &cuvee + new Transition (1403, 1404), // &cuw -> &cuwe + new Transition (1425, 1519), // &D -> &De + new Transition (1428, 1429), // &Dagg -> &Dagge + new Transition (1432, 1516), // &d -> &de + new Transition (1435, 1436), // &dagg -> &dagge + new Transition (1439, 1440), // &dal -> &dale + new Transition (1496, 1497), // &ddagg -> &ddagge + new Transition (1512, 1513), // &ddots -> &ddotse + new Transition (1570, 1571), // &DiacriticalAcut -> &DiacriticalAcute + new Transition (1579, 1580), // &DiacriticalDoubl -> &DiacriticalDouble + new Transition (1584, 1585), // &DiacriticalDoubleAcut -> &DiacriticalDoubleAcute + new Transition (1590, 1591), // &DiacriticalGrav -> &DiacriticalGrave + new Transition (1596, 1597), // &DiacriticalTild -> &DiacriticalTilde + new Transition (1599, 1619), // &di -> &die + new Transition (1622, 1623), // &Diff -> &Diffe + new Transition (1624, 1625), // &Differ -> &Differe + new Transition (1646, 1647), // &divid -> ÷ + new Transition (1653, 1654), // ÷ontim -> ÷ontime + new Transition (1694, 1700), // &dot -> &dote + new Transition (1728, 1729), // &dotsquar -> &dotsquare + new Transition (1733, 1734), // &doubl -> &double + new Transition (1738, 1739), // &doublebarw -> &doublebarwe + new Transition (1741, 1742), // &doublebarwedg -> &doublebarwedge + new Transition (1746, 1747), // &Doubl -> &Double + new Transition (1757, 1758), // &DoubleContourInt -> &DoubleContourInte + new Transition (1776, 1777), // &DoubleL -> &DoubleLe + new Transition (1797, 1798), // &DoubleLeftT -> &DoubleLeftTe + new Transition (1798, 1799), // &DoubleLeftTe -> &DoubleLeftTee + new Transition (1804, 1805), // &DoubleLongL -> &DoubleLongLe + new Transition (1847, 1848), // &DoubleRightT -> &DoubleRightTe + new Transition (1848, 1849), // &DoubleRightTe -> &DoubleRightTee + new Transition (1869, 1870), // &DoubleV -> &DoubleVe + new Transition (1916, 1917), // &DownBr -> &DownBre + new Transition (1918, 1919), // &DownBrev -> &DownBreve + new Transition (1939, 1940), // &downharpoonl -> &downharpoonle + new Transition (1950, 1951), // &DownL -> &DownLe + new Transition (1959, 1960), // &DownLeftRightV -> &DownLeftRightVe + new Transition (1966, 1967), // &DownLeftT -> &DownLeftTe + new Transition (1967, 1968), // &DownLeftTe -> &DownLeftTee + new Transition (1969, 1970), // &DownLeftTeeV -> &DownLeftTeeVe + new Transition (1976, 1977), // &DownLeftV -> &DownLeftVe + new Transition (1992, 1993), // &DownRightT -> &DownRightTe + new Transition (1993, 1994), // &DownRightTe -> &DownRightTee + new Transition (1995, 1996), // &DownRightTeeV -> &DownRightTeeVe + new Transition (2002, 2003), // &DownRightV -> &DownRightVe + new Transition (2013, 2014), // &DownT -> &DownTe + new Transition (2014, 2015), // &DownTe -> &DownTee + new Transition (2090, 2091), // &dwangl -> &dwangle + new Transition (2112, 2113), // &Eacut -> É + new Transition (2115, 2173), // &e -> &ee + new Transition (2119, 2120), // &eacut -> é + new Transition (2123, 2124), // &east -> &easte + new Transition (2190, 2191), // &Egrav -> È + new Transition (2195, 2196), // &egrav -> è + new Transition (2206, 2207), // &El -> &Ele + new Transition (2208, 2209), // &Elem -> &Eleme + new Transition (2215, 2216), // &elint -> &elinte + new Transition (2242, 2243), // &emptys -> &emptyse + new Transition (2258, 2259), // &EmptySmallSquar -> &EmptySmallSquare + new Transition (2263, 2264), // &EmptyV -> &EmptyVe + new Transition (2276, 2277), // &EmptyVerySmallSquar -> &EmptyVerySmallSquare + new Transition (2362, 2363), // &eqslantl -> &eqslantle + new Transition (2372, 2383), // &equ -> &eque + new Transition (2380, 2381), // &EqualTild -> &EqualTilde + new Transition (2472, 2473), // &exp -> &expe + new Transition (2484, 2485), // &Expon -> &Expone + new Transition (2494, 2495), // &expon -> &expone + new Transition (2500, 2501), // &exponential -> &exponentiale + new Transition (2503, 2524), // &f -> &fe + new Transition (2513, 2514), // &fallingdots -> &fallingdotse + new Transition (2527, 2528), // &femal -> &female + new Transition (2556, 2557), // &Fill -> &Fille + new Transition (2568, 2569), // &FilledSmallSquar -> &FilledSmallSquare + new Transition (2571, 2572), // &FilledV -> &FilledVe + new Transition (2584, 2585), // &FilledVerySmallSquar -> &FilledVerySmallSquare + new Transition (2632, 2633), // &Fouri -> &Fourie + new Transition (2701, 2765), // &g -> &ge + new Transition (2705, 2706), // &gacut -> &gacute + new Transition (2725, 2726), // &Gbr -> &Gbre + new Transition (2727, 2728), // &Gbrev -> &Gbreve + new Transition (2731, 2732), // &gbr -> &gbre + new Transition (2733, 2734), // &gbrev -> &gbreve + new Transition (2736, 2737), // &Gc -> &Gce + new Transition (2794, 2796), // &gesl -> &gesle + new Transition (2812, 2813), // &gim -> &gime + new Transition (2832, 2843), // &gn -> &gne + new Transition (2863, 2864), // &grav -> &grave + new Transition (2866, 2867), // &Gr -> &Gre + new Transition (2869, 2870), // &Great -> &Greate + new Transition (2878, 2879), // &GreaterEqualL -> &GreaterEqualLe + new Transition (2894, 2895), // &GreaterGr -> &GreaterGre + new Transition (2897, 2898), // &GreaterGreat -> &GreaterGreate + new Transition (2901, 2902), // &GreaterL -> &GreaterLe + new Transition (2920, 2921), // &GreaterTild -> &GreaterTilde + new Transition (2932, 2934), // &gsim -> &gsime + new Transition (2960, 2961), // >qu -> >que + new Transition (2965, 2980), // >r -> >re + new Transition (2982, 2983), // >reql -> >reqle + new Transition (2988, 2989), // >reqql -> >reqqle + new Transition (2993, 2994), // >rl -> >rle + new Transition (3002, 3003), // &gv -> &gve + new Transition (3006, 3007), // &gvertn -> &gvertne + new Transition (3016, 3017), // &Hac -> &Hace + new Transition (3020, 3074), // &h -> &he + new Transition (3102, 3103), // &Hilb -> &Hilbe + new Transition (3109, 3110), // &HilbertSpac -> &HilbertSpace + new Transition (3113, 3114), // &hks -> &hkse + new Transition (3138, 3139), // &hookl -> &hookle + new Transition (3181, 3182), // &HorizontalLin -> &HorizontalLine + new Transition (3232, 3233), // &hyph -> &hyphe + new Transition (3240, 3241), // &Iacut -> Í + new Transition (3243, 3273), // &i -> &ie + new Transition (3247, 3248), // &iacut -> í + new Transition (3292, 3293), // &Igrav -> Ì + new Transition (3298, 3299), // &igrav -> ì + new Transition (3341, 3342), // &imag -> &image + new Transition (3354, 3355), // &imaglin -> &imagline + new Transition (3368, 3369), // &imp -> &impe + new Transition (3374, 3375), // &Impli -> &Implie + new Transition (3382, 3383), // &incar -> &incare + new Transition (3390, 3391), // &infinti -> &infintie + new Transition (3399, 3413), // &Int -> &Inte + new Transition (3401, 3407), // &int -> &inte + new Transition (3408, 3409), // &integ -> &intege + new Transition (3425, 3426), // &Inters -> &Interse + new Transition (3449, 3450), // &Invisibl -> &Invisible + new Transition (3459, 3460), // &InvisibleTim -> &InvisibleTime + new Transition (3498, 3499), // &iqu -> &ique + new Transition (3531, 3532), // &Itild -> &Itilde + new Transition (3536, 3537), // &itild -> &itilde + new Transition (3590, 3598), // &Js -> &Jse + new Transition (3594, 3603), // &js -> &jse + new Transition (3632, 3633), // &Kc -> &Kce + new Transition (3638, 3639), // &kc -> &kce + new Transition (3655, 3656), // &kgr -> &kgre + new Transition (3656, 3657), // &kgre -> &kgree + new Transition (3692, 3896), // &l -> &le + new Transition (3698, 3898), // &L -> &Le + new Transition (3702, 3703), // &Lacut -> &Lacute + new Transition (3705, 3711), // &la -> &lae + new Transition (3708, 3709), // &lacut -> &lacute + new Transition (3741, 3742), // &langl -> &langle + new Transition (3749, 3750), // &Laplac -> &Laplace + new Transition (3792, 3803), // &lat -> &late + new Transition (3823, 3824), // &lbrac -> &lbrace + new Transition (3828, 3829), // &lbrk -> &lbrke + new Transition (3837, 3849), // &Lc -> &Lce + new Transition (3843, 3854), // &lc -> &lce + new Transition (3904, 3905), // &LeftAngl -> &LeftAngle + new Transition (3910, 3911), // &LeftAngleBrack -> &LeftAngleBracke + new Transition (3953, 3954), // &LeftC -> &LeftCe + new Transition (3965, 3966), // &LeftDoubl -> &LeftDouble + new Transition (3971, 3972), // &LeftDoubleBrack -> &LeftDoubleBracke + new Transition (3977, 3978), // &LeftDownT -> &LeftDownTe + new Transition (3978, 3979), // &LeftDownTe -> &LeftDownTee + new Transition (3980, 3981), // &LeftDownTeeV -> &LeftDownTeeVe + new Transition (3987, 3988), // &LeftDownV -> &LeftDownVe + new Transition (4019, 4020), // &leftl -> &leftle + new Transition (4085, 4086), // &LeftRightV -> &LeftRightVe + new Transition (4092, 4093), // &LeftT -> &LeftTe + new Transition (4093, 4094), // &LeftTe -> &LeftTee + new Transition (4102, 4103), // &LeftTeeV -> &LeftTeeVe + new Transition (4111, 4112), // &leftthr -> &leftthre + new Transition (4112, 4113), // &leftthre -> &leftthree + new Transition (4116, 4117), // &leftthreetim -> &leftthreetime + new Transition (4125, 4126), // &LeftTriangl -> &LeftTriangle + new Transition (4144, 4145), // &LeftUpDownV -> &LeftUpDownVe + new Transition (4151, 4152), // &LeftUpT -> &LeftUpTe + new Transition (4152, 4153), // &LeftUpTe -> &LeftUpTee + new Transition (4154, 4155), // &LeftUpTeeV -> &LeftUpTeeVe + new Transition (4161, 4162), // &LeftUpV -> &LeftUpVe + new Transition (4172, 4173), // &LeftV -> &LeftVe + new Transition (4210, 4212), // &lesg -> &lesge + new Transition (4215, 4227), // &less -> &lesse + new Transition (4246, 4247), // &LessEqualGr -> &LessEqualGre + new Transition (4249, 4250), // &LessEqualGreat -> &LessEqualGreate + new Transition (4264, 4265), // &LessGr -> &LessGre + new Transition (4267, 4268), // &LessGreat -> &LessGreate + new Transition (4275, 4276), // &LessL -> &LessLe + new Transition (4298, 4299), // &LessTild -> &LessTilde + new Transition (4346, 4361), // &Ll -> &Lle + new Transition (4357, 4358), // &llcorn -> &llcorne + new Transition (4398, 4399), // &lmoustach -> &lmoustache + new Transition (4401, 4412), // &ln -> &lne + new Transition (4437, 4438), // &LongL -> &LongLe + new Transition (4447, 4448), // &Longl -> &Longle + new Transition (4459, 4460), // &longl -> &longle + new Transition (4549, 4550), // &looparrowl -> &looparrowle + new Transition (4575, 4576), // &lotim -> &lotime + new Transition (4588, 4589), // &Low -> &Lowe + new Transition (4591, 4592), // &LowerL -> &LowerLe + new Transition (4612, 4614), // &loz -> &loze + new Transition (4616, 4617), // &lozeng -> &lozenge + new Transition (4636, 4637), // &lrcorn -> &lrcorne + new Transition (4670, 4672), // &lsim -> &lsime + new Transition (4711, 4712), // <hr -> <hre + new Transition (4712, 4713), // <hre -> <hree + new Transition (4716, 4717), // <im -> <ime + new Transition (4726, 4727), // <qu -> <que + new Transition (4732, 4734), // <ri -> <rie + new Transition (4755, 4756), // &lv -> &lve + new Transition (4759, 4760), // &lvertn -> &lvertne + new Transition (4767, 4830), // &m -> &me + new Transition (4772, 4773), // &mal -> &male + new Transition (4775, 4777), // &malt -> &malte + new Transition (4778, 4779), // &maltes -> &maltese + new Transition (4781, 4843), // &M -> &Me + new Transition (4796, 4797), // &mapstol -> &mapstole + new Transition (4805, 4806), // &mark -> &marke + new Transition (4834, 4835), // &measur -> &measure + new Transition (4840, 4841), // &measuredangl -> &measuredangle + new Transition (4851, 4852), // &MediumSpac -> &MediumSpace + new Transition (4923, 4924), // &mod -> &mode + new Transition (4965, 5064), // &n -> &ne + new Transition (4971, 5084), // &N -> &Ne + new Transition (4975, 4976), // &Nacut -> &Nacute + new Transition (4980, 4981), // &nacut -> &nacute + new Transition (5016, 5018), // &nbump -> &nbumpe + new Transition (5020, 5039), // &nc -> &nce + new Transition (5024, 5034), // &Nc -> &Nce + new Transition (5089, 5090), // &Negativ -> &Negative + new Transition (5091, 5092), // &NegativeM -> &NegativeMe + new Transition (5100, 5101), // &NegativeMediumSpac -> &NegativeMediumSpace + new Transition (5111, 5112), // &NegativeThickSpac -> &NegativeThickSpace + new Transition (5118, 5119), // &NegativeThinSpac -> &NegativeThinSpace + new Transition (5121, 5122), // &NegativeV -> &NegativeVe + new Transition (5132, 5133), // &NegativeVeryThinSpac -> &NegativeVeryThinSpace + new Transition (5140, 5141), // &nes -> &nese + new Transition (5149, 5150), // &Nest -> &Neste + new Transition (5153, 5154), // &NestedGr -> &NestedGre + new Transition (5156, 5157), // &NestedGreat -> &NestedGreate + new Transition (5160, 5161), // &NestedGreaterGr -> &NestedGreaterGre + new Transition (5163, 5164), // &NestedGreaterGreat -> &NestedGreaterGreate + new Transition (5167, 5168), // &NestedL -> &NestedLe + new Transition (5171, 5172), // &NestedLessL -> &NestedLessLe + new Transition (5179, 5180), // &NewLin -> &NewLine + new Transition (5195, 5198), // &ng -> &nge + new Transition (5256, 5270), // &nl -> &nle + new Transition (5272, 5273), // &nL -> &nLe + new Transition (5337, 5339), // &nltri -> &nltrie + new Transition (5349, 5350), // &NoBr -> &NoBre + new Transition (5356, 5357), // &NonBr -> &NonBre + new Transition (5366, 5367), // &NonBreakingSpac -> &NonBreakingSpace + new Transition (5385, 5386), // &NotCongru -> &NotCongrue + new Transition (5400, 5401), // &NotDoubl -> &NotDouble + new Transition (5402, 5403), // &NotDoubleV -> &NotDoubleVe + new Transition (5415, 5416), // &NotEl -> &NotEle + new Transition (5417, 5418), // &NotElem -> &NotEleme + new Transition (5430, 5431), // &NotEqualTild -> &NotEqualTilde + new Transition (5440, 5441), // &NotGr -> &NotGre + new Transition (5443, 5444), // &NotGreat -> &NotGreate + new Transition (5464, 5465), // &NotGreaterGr -> &NotGreaterGre + new Transition (5467, 5468), // &NotGreaterGreat -> &NotGreaterGreate + new Transition (5471, 5472), // &NotGreaterL -> &NotGreaterLe + new Transition (5490, 5491), // &NotGreaterTild -> &NotGreaterTilde + new Transition (5528, 5529), // &NotL -> &NotLe + new Transition (5538, 5539), // &NotLeftTriangl -> &NotLeftTriangle + new Transition (5561, 5562), // &NotLessGr -> &NotLessGre + new Transition (5564, 5565), // &NotLessGreat -> &NotLessGreate + new Transition (5568, 5569), // &NotLessL -> &NotLessLe + new Transition (5587, 5588), // &NotLessTild -> &NotLessTilde + new Transition (5590, 5591), // &NotN -> &NotNe + new Transition (5593, 5594), // &NotNest -> &NotNeste + new Transition (5597, 5598), // &NotNestedGr -> &NotNestedGre + new Transition (5600, 5601), // &NotNestedGreat -> &NotNestedGreate + new Transition (5604, 5605), // &NotNestedGreaterGr -> &NotNestedGreaterGre + new Transition (5607, 5608), // &NotNestedGreaterGreat -> &NotNestedGreaterGreate + new Transition (5611, 5612), // &NotNestedL -> &NotNestedLe + new Transition (5615, 5616), // &NotNestedLessL -> &NotNestedLessLe + new Transition (5631, 5632), // &NotPr -> &NotPre + new Transition (5633, 5634), // &NotPrec -> &NotPrece + new Transition (5635, 5636), // &NotPreced -> &NotPrecede + new Transition (5656, 5657), // &NotR -> &NotRe + new Transition (5658, 5659), // &NotRev -> &NotReve + new Transition (5661, 5662), // &NotRevers -> &NotReverse + new Transition (5664, 5665), // &NotReverseEl -> &NotReverseEle + new Transition (5666, 5667), // &NotReverseElem -> &NotReverseEleme + new Transition (5681, 5682), // &NotRightTriangl -> &NotRightTriangle + new Transition (5698, 5699), // &NotSquar -> &NotSquare + new Transition (5703, 5704), // &NotSquareSubs -> &NotSquareSubse + new Transition (5713, 5714), // &NotSquareSup -> &NotSquareSupe + new Transition (5716, 5717), // &NotSquareSupers -> &NotSquareSuperse + new Transition (5728, 5729), // &NotSubs -> &NotSubse + new Transition (5739, 5740), // &NotSucc -> &NotSucce + new Transition (5740, 5741), // &NotSucce -> &NotSuccee + new Transition (5765, 5766), // &NotSucceedsTild -> &NotSucceedsTilde + new Transition (5768, 5769), // &NotSup -> &NotSupe + new Transition (5771, 5772), // &NotSupers -> &NotSuperse + new Transition (5784, 5785), // &NotTild -> &NotTilde + new Transition (5806, 5807), // &NotTildeTild -> &NotTildeTilde + new Transition (5809, 5810), // &NotV -> &NotVe + new Transition (5827, 5828), // &nparall -> &nparalle + new Transition (5842, 5848), // &npr -> &npre + new Transition (5845, 5846), // &nprcu -> &nprcue + new Transition (5850, 5852), // &nprec -> &nprece + new Transition (5891, 5893), // &nrtri -> &nrtrie + new Transition (5896, 5902), // &nsc -> &nsce + new Transition (5899, 5900), // &nsccu -> &nsccue + new Transition (5923, 5924), // &nshortparall -> &nshortparalle + new Transition (5928, 5930), // &nsim -> &nsime + new Transition (5945, 5946), // &nsqsub -> &nsqsube + new Transition (5948, 5949), // &nsqsup -> &nsqsupe + new Transition (5952, 5956), // &nsub -> &nsube + new Transition (5958, 5959), // &nsubs -> &nsubse + new Transition (5960, 5962), // &nsubset -> &nsubsete + new Transition (5968, 5970), // &nsucc -> &nsucce + new Transition (5973, 5977), // &nsup -> &nsupe + new Transition (5979, 5980), // &nsups -> &nsupse + new Transition (5981, 5983), // &nsupset -> &nsupsete + new Transition (5995, 5996), // &Ntild -> Ñ + new Transition (6000, 6001), // &ntild -> ñ + new Transition (6011, 6012), // &ntriangl -> &ntriangle + new Transition (6013, 6014), // &ntrianglel -> &ntrianglele + new Transition (6016, 6018), // &ntriangleleft -> &ntrianglelefte + new Transition (6025, 6027), // &ntriangleright -> &ntrianglerighte + new Transition (6034, 6036), // &num -> &nume + new Transition (6068, 6069), // &nvg -> &nvge + new Transition (6084, 6089), // &nvl -> &nvle + new Transition (6094, 6095), // &nvltri -> &nvltrie + new Transition (6104, 6105), // &nvrtri -> &nvrtrie + new Transition (6126, 6127), // &nwn -> &nwne + new Transition (6135, 6136), // &Oacut -> Ó + new Transition (6138, 6195), // &o -> &oe + new Transition (6142, 6143), // &oacut -> ó + new Transition (6217, 6218), // &Ograv -> Ò + new Transition (6222, 6223), // &ograv -> ò + new Transition (6253, 6254), // &olin -> &oline + new Transition (6258, 6268), // &Om -> &Ome + new Transition (6263, 6272), // &om -> &ome + new Transition (6302, 6332), // &op -> &ope + new Transition (6306, 6307), // &Op -> &Ope + new Transition (6318, 6319), // &OpenCurlyDoubl -> &OpenCurlyDouble + new Transition (6323, 6324), // &OpenCurlyDoubleQuot -> &OpenCurlyDoubleQuote + new Transition (6329, 6330), // &OpenCurlyQuot -> &OpenCurlyQuote + new Transition (6348, 6350), // &ord -> &orde + new Transition (6371, 6372), // &orslop -> &orslope + new Transition (6402, 6403), // &Otild -> Õ + new Transition (6408, 6409), // &otild -> õ + new Transition (6411, 6412), // &Otim -> &Otime + new Transition (6415, 6416), // &otim -> &otime + new Transition (6435, 6436), // &Ov -> &Ove + new Transition (6444, 6445), // &OverBrac -> &OverBrace + new Transition (6447, 6448), // &OverBrack -> &OverBracke + new Transition (6453, 6454), // &OverPar -> &OverPare + new Transition (6457, 6458), // &OverParenth -> &OverParenthe + new Transition (6463, 6497), // &p -> &pe + new Transition (6470, 6471), // ¶ll -> ¶lle + new Transition (6513, 6514), // &pert -> &perte + new Transition (6538, 6539), // &phon -> &phone + new Transition (6567, 6585), // &plus -> &pluse + new Transition (6614, 6615), // &Poincar -> &Poincare + new Transition (6619, 6620), // &Poincareplan -> &Poincareplane + new Transition (6640, 6672), // &Pr -> &Pre + new Transition (6642, 6653), // &pr -> &pre + new Transition (6648, 6649), // &prcu -> &prcue + new Transition (6655, 6702), // &prec -> &prece + new Transition (6668, 6669), // &preccurly -> &preccurlye + new Transition (6673, 6674), // &Prec -> &Prece + new Transition (6675, 6676), // &Preced -> &Precede + new Transition (6699, 6700), // &PrecedesTild -> &PrecedesTilde + new Transition (6705, 6713), // &precn -> &precne + new Transition (6726, 6727), // &Prim -> &Prime + new Transition (6730, 6731), // &prim -> &prime + new Transition (6762, 6763), // &proflin -> &profline + new Transition (6791, 6792), // &prur -> &prure + new Transition (6836, 6837), // &qprim -> &qprime + new Transition (6847, 6862), // &qu -> &que + new Transition (6849, 6850), // &quat -> &quate + new Transition (6864, 6866), // &quest -> &queste + new Transition (6876, 7074), // &r -> &re + new Transition (6882, 6901), // &ra -> &rae + new Transition (6883, 6884), // &rac -> &race + new Transition (6886, 7072), // &R -> &Re + new Transition (6890, 6891), // &Racut -> &Racute + new Transition (6894, 6895), // &racut -> &racute + new Transition (6912, 6916), // &rang -> &range + new Transition (6918, 6919), // &rangl -> &rangle + new Transition (7007, 7008), // &rbrac -> &rbrace + new Transition (7012, 7013), // &rbrk -> &rbrke + new Transition (7021, 7033), // &Rc -> &Rce + new Transition (7027, 7038), // &rc -> &rce + new Transition (7079, 7080), // &realin -> &realine + new Transition (7097, 7098), // &Rev -> &Reve + new Transition (7100, 7101), // &Revers -> &Reverse + new Transition (7103, 7104), // &ReverseEl -> &ReverseEle + new Transition (7105, 7106), // &ReverseElem -> &ReverseEleme + new Transition (7178, 7179), // &RightAngl -> &RightAngle + new Transition (7184, 7185), // &RightAngleBrack -> &RightAngleBracke + new Transition (7213, 7214), // &RightArrowL -> &RightArrowLe + new Transition (7228, 7229), // &RightC -> &RightCe + new Transition (7240, 7241), // &RightDoubl -> &RightDouble + new Transition (7246, 7247), // &RightDoubleBrack -> &RightDoubleBracke + new Transition (7252, 7253), // &RightDownT -> &RightDownTe + new Transition (7253, 7254), // &RightDownTe -> &RightDownTee + new Transition (7255, 7256), // &RightDownTeeV -> &RightDownTeeVe + new Transition (7262, 7263), // &RightDownV -> &RightDownVe + new Transition (7294, 7295), // &rightl -> &rightle + new Transition (7337, 7338), // &RightT -> &RightTe + new Transition (7338, 7339), // &RightTe -> &RightTee + new Transition (7347, 7348), // &RightTeeV -> &RightTeeVe + new Transition (7356, 7357), // &rightthr -> &rightthre + new Transition (7357, 7358), // &rightthre -> &rightthree + new Transition (7361, 7362), // &rightthreetim -> &rightthreetime + new Transition (7370, 7371), // &RightTriangl -> &RightTriangle + new Transition (7389, 7390), // &RightUpDownV -> &RightUpDownVe + new Transition (7396, 7397), // &RightUpT -> &RightUpTe + new Transition (7397, 7398), // &RightUpTe -> &RightUpTee + new Transition (7399, 7400), // &RightUpTeeV -> &RightUpTeeVe + new Transition (7406, 7407), // &RightUpV -> &RightUpVe + new Transition (7417, 7418), // &RightV -> &RightVe + new Transition (7438, 7439), // &risingdots -> &risingdotse + new Transition (7461, 7462), // &rmoustach -> &rmoustache + new Transition (7497, 7498), // &rotim -> &rotime + new Transition (7508, 7509), // &RoundImpli -> &RoundImplie + new Transition (7569, 7570), // &rthr -> &rthre + new Transition (7570, 7571), // &rthre -> &rthree + new Transition (7574, 7575), // &rtim -> &rtime + new Transition (7579, 7581), // &rtri -> &rtrie + new Transition (7591, 7592), // &Rul -> &Rule + new Transition (7593, 7594), // &RuleD -> &RuleDe + new Transition (7597, 7598), // &RuleDelay -> &RuleDelaye + new Transition (7614, 7615), // &Sacut -> &Sacute + new Transition (7617, 7703), // &s -> &se + new Transition (7621, 7622), // &sacut -> &sacute + new Transition (7629, 7653), // &Sc -> &Sce + new Transition (7631, 7651), // &sc -> &sce + new Transition (7646, 7647), // &sccu -> &sccue + new Transition (7697, 7701), // &sdot -> &sdote + new Transition (7786, 7787), // &ShortL -> &ShortLe + new Transition (7808, 7809), // &shortparall -> &shortparalle + new Transition (7847, 7853), // &sim -> &sime + new Transition (7865, 7866), // &simn -> &simne + new Transition (7891, 7892), // &SmallCircl -> &SmallCircle + new Transition (7894, 7911), // &sm -> &sme + new Transition (7898, 7899), // &smalls -> &smallse + new Transition (7921, 7922), // &smil -> &smile + new Transition (7924, 7926), // &smt -> &smte + new Transition (7958, 7959), // &spad -> &spade + new Transition (7986, 7988), // &sqsub -> &sqsube + new Transition (7990, 7991), // &sqsubs -> &sqsubse + new Transition (7992, 7994), // &sqsubset -> &sqsubsete + new Transition (7997, 7999), // &sqsup -> &sqsupe + new Transition (8001, 8002), // &sqsups -> &sqsupse + new Transition (8003, 8005), // &sqsupset -> &sqsupsete + new Transition (8012, 8013), // &Squar -> &Square + new Transition (8016, 8017), // &squar -> &square + new Transition (8021, 8022), // &SquareInt -> &SquareInte + new Transition (8024, 8025), // &SquareInters -> &SquareInterse + new Transition (8035, 8036), // &SquareSubs -> &SquareSubse + new Transition (8045, 8046), // &SquareSup -> &SquareSupe + new Transition (8048, 8049), // &SquareSupers -> &SquareSuperse + new Transition (8077, 8081), // &ss -> &sse + new Transition (8088, 8089), // &ssmil -> &ssmile + new Transition (8111, 8112), // &straight -> &straighte + new Transition (8131, 8139), // &sub -> &sube + new Transition (8150, 8153), // &subn -> &subne + new Transition (8165, 8166), // &Subs -> &Subse + new Transition (8169, 8170), // &subs -> &subse + new Transition (8171, 8173), // &subset -> &subsete + new Transition (8184, 8185), // &subsetn -> &subsetne + new Transition (8199, 8246), // &succ -> &succe + new Transition (8212, 8213), // &succcurly -> &succcurlye + new Transition (8217, 8218), // &Succ -> &Succe + new Transition (8218, 8219), // &Succe -> &Succee + new Transition (8243, 8244), // &SucceedsTild -> &SucceedsTilde + new Transition (8249, 8257), // &succn -> &succne + new Transition (8282, 8308), // &Sup -> &Supe + new Transition (8284, 8302), // &sup -> &supe + new Transition (8310, 8311), // &Supers -> &Superse + new Transition (8338, 8341), // &supn -> &supne + new Transition (8348, 8349), // &Sups -> &Supse + new Transition (8352, 8353), // &sups -> &supse + new Transition (8354, 8356), // &supset -> &supsete + new Transition (8361, 8362), // &supsetn -> &supsetne + new Transition (8404, 8449), // &t -> &te + new Transition (8407, 8408), // &targ -> &targe + new Transition (8419, 8431), // &Tc -> &Tce + new Transition (8425, 8436), // &tc -> &tce + new Transition (8451, 8452), // &telr -> &telre + new Transition (8461, 8462), // &th -> &the + new Transition (8463, 8464), // &ther -> &there + new Transition (8467, 8468), // &Th -> &The + new Transition (8469, 8470), // &Ther -> &There + new Transition (8473, 8474), // &Therefor -> &Therefore + new Transition (8478, 8479), // &therefor -> &therefore + new Transition (8513, 8514), // &ThickSpac -> &ThickSpace + new Transition (8524, 8525), // &ThinSpac -> &ThinSpace + new Transition (8546, 8547), // &Tild -> &Tilde + new Transition (8551, 8552), // &tild -> &tilde + new Transition (8573, 8574), // &TildeTild -> &TildeTilde + new Transition (8576, 8577), // &tim -> &time + new Transition (8590, 8591), // &to -> &toe + new Transition (8620, 8621), // &tprim -> &tprime + new Transition (8630, 8631), // &trad -> &trade + new Transition (8633, 8668), // &tri -> &trie + new Transition (8637, 8638), // &triangl -> &triangle + new Transition (8645, 8646), // &trianglel -> &trianglele + new Transition (8648, 8650), // &triangleleft -> &trianglelefte + new Transition (8659, 8661), // &triangleright -> &trianglerighte + new Transition (8679, 8680), // &Tripl -> &Triple + new Transition (8695, 8696), // &tritim -> &tritime + new Transition (8698, 8699), // &trp -> &trpe + new Transition (8743, 8744), // &twoh -> &twohe + new Transition (8747, 8748), // &twoheadl -> &twoheadle + new Transition (8772, 8773), // &Uacut -> Ú + new Transition (8779, 8780), // &uacut -> ú + new Transition (8798, 8807), // &Ubr -> &Ubre + new Transition (8803, 8811), // &ubr -> &ubre + new Transition (8808, 8809), // &Ubrev -> &Ubreve + new Transition (8812, 8813), // &ubrev -> &ubreve + new Transition (8863, 8864), // &Ugrav -> Ù + new Transition (8869, 8870), // &ugrav -> ù + new Transition (8891, 8893), // &ulcorn -> &ulcorne + new Transition (8917, 8918), // &Und -> &Unde + new Transition (8926, 8927), // &UnderBrac -> &UnderBrace + new Transition (8929, 8930), // &UnderBrack -> &UnderBracke + new Transition (8935, 8936), // &UnderPar -> &UnderPare + new Transition (8939, 8940), // &UnderParenth -> &UnderParenthe + new Transition (9053, 9054), // &upharpoonl -> &upharpoonle + new Transition (9068, 9069), // &Upp -> &Uppe + new Transition (9071, 9072), // &UpperL -> &UpperLe + new Transition (9108, 9109), // &UpT -> &UpTe + new Transition (9109, 9110), // &UpTe -> &UpTee + new Transition (9131, 9133), // &urcorn -> &urcorne + new Transition (9169, 9170), // &Utild -> &Utilde + new Transition (9174, 9175), // &utild -> &utilde + new Transition (9198, 9199), // &uwangl -> &uwangle + new Transition (9201, 9345), // &v -> &ve + new Transition (9208, 9209), // &var -> &vare + new Transition (9260, 9261), // &varsubs -> &varsubse + new Transition (9263, 9264), // &varsubsetn -> &varsubsetne + new Transition (9270, 9271), // &varsups -> &varsupse + new Transition (9273, 9274), // &varsupsetn -> &varsupsetne + new Transition (9280, 9281), // &varth -> &varthe + new Transition (9290, 9291), // &vartriangl -> &vartriangle + new Transition (9292, 9293), // &vartrianglel -> &vartrianglele + new Transition (9303, 9342), // &V -> &Ve + new Transition (9342, 9343), // &Ve -> &Vee + new Transition (9345, 9346), // &ve -> &vee + new Transition (9346, 9352), // &vee -> &veee + new Transition (9384, 9385), // &VerticalLin -> &VerticalLine + new Transition (9387, 9388), // &VerticalS -> &VerticalSe + new Transition (9400, 9401), // &VerticalTild -> &VerticalTilde + new Transition (9411, 9412), // &VeryThinSpac -> &VeryThinSpace + new Transition (9460, 9463), // &vsubn -> &vsubne + new Transition (9466, 9469), // &vsupn -> &vsupne + new Transition (9484, 9502), // &W -> &We + new Transition (9490, 9496), // &w -> &we + new Transition (9504, 9505), // &Wedg -> &Wedge + new Transition (9507, 9508), // &wedg -> &wedge + new Transition (9512, 9513), // &wei -> &weie + new Transition (9533, 9535), // &wr -> &wre + new Transition (9620, 9621), // &xotim -> &xotime + new Transition (9655, 9656), // &xv -> &xve + new Transition (9656, 9657), // &xve -> &xvee + new Transition (9659, 9660), // &xw -> &xwe + new Transition (9662, 9663), // &xwedg -> &xwedge + new Transition (9669, 9670), // &Yacut -> Ý + new Transition (9672, 9699), // &y -> &ye + new Transition (9676, 9677), // &yacut -> ý + new Transition (9747, 9791), // &Z -> &Ze + new Transition (9751, 9752), // &Zacut -> &Zacute + new Transition (9754, 9785), // &z -> &ze + new Transition (9758, 9759), // &zacut -> &zacute + new Transition (9785, 9786), // &ze -> &zee + new Transition (9802, 9803) // &ZeroWidthSpac -> &ZeroWidthSpace + }; + TransitionTable_f = new Transition[177] { + new Transition (0, 2503), // & -> &f + new Transition (1, 62), // &A -> &Af + new Transition (8, 60), // &a -> &af + new Transition (80, 81), // &ale -> &alef + new Transition (147, 158), // &angmsda -> &angmsdaf + new Transition (193, 194), // &Aop -> &Aopf + new Transition (196, 197), // &aop -> &aopf + new Transition (301, 439), // &b -> &bf + new Transition (331, 436), // &B -> &Bf + new Transition (553, 554), // &blacktrianglele -> &blacktrianglelef + new Transition (595, 596), // &Bop -> &Bopf + new Transition (599, 600), // &bop -> &bopf + new Transition (789, 950), // &C -> &Cf + new Transition (796, 953), // &c -> &cf + new Transition (833, 834), // &CapitalDi -> &CapitalDif + new Transition (834, 835), // &CapitalDif -> &CapitalDiff + new Transition (979, 1053), // &cir -> &cirf + new Transition (994, 995), // &circlearrowle -> &circlearrowlef + new Transition (1148, 1150), // &comp -> &compf + new Transition (1200, 1201), // &Cop -> &Copf + new Transition (1203, 1204), // &cop -> &copf + new Transition (1389, 1390), // &curvearrowle -> &curvearrowlef + new Transition (1425, 1541), // &D -> &Df + new Transition (1432, 1535), // &d -> &df + new Transition (1557, 1621), // &Di -> &Dif + new Transition (1621, 1622), // &Dif -> &Diff + new Transition (1686, 1687), // &Dop -> &Dopf + new Transition (1689, 1690), // &dop -> &dopf + new Transition (1777, 1778), // &DoubleLe -> &DoubleLef + new Transition (1805, 1806), // &DoubleLongLe -> &DoubleLongLef + new Transition (1940, 1941), // &downharpoonle -> &downharpoonlef + new Transition (1951, 1952), // &DownLe -> &DownLef + new Transition (2073, 2075), // &dtri -> &dtrif + new Transition (2108, 2180), // &E -> &Ef + new Transition (2115, 2175), // &e -> &ef + new Transition (2306, 2307), // &Eop -> &Eopf + new Transition (2309, 2310), // &eop -> &eopf + new Transition (2503, 2530), // &f -> &ff + new Transition (2517, 2544), // &F -> &Ff + new Transition (2605, 2606), // &fno -> &fnof + new Transition (2609, 2610), // &Fop -> &Fopf + new Transition (2613, 2614), // &fop -> &fopf + new Transition (2636, 2637), // &Fouriertr -> &Fouriertrf + new Transition (2701, 2802), // &g -> &gf + new Transition (2708, 2799), // &G -> &Gf + new Transition (2854, 2855), // &Gop -> &Gopf + new Transition (2858, 2859), // &gop -> &gopf + new Transition (3014, 3094), // &H -> &Hf + new Transition (3020, 3097), // &h -> &hf + new Transition (3027, 3028), // &hal -> &half + new Transition (3139, 3140), // &hookle -> &hooklef + new Transition (3160, 3161), // &Hop -> &Hopf + new Transition (3163, 3164), // &hop -> &hopf + new Transition (3236, 3284), // &I -> &If + new Transition (3243, 3281), // &i -> &if + new Transition (3281, 3282), // &if -> &iff + new Transition (3311, 3312), // &iin -> &iinf + new Transition (3365, 3366), // &imo -> &imof + new Transition (3378, 3385), // &in -> &inf + new Transition (3480, 3481), // &Iop -> &Iopf + new Transition (3483, 3484), // &iop -> &iopf + new Transition (3555, 3571), // &J -> &Jf + new Transition (3561, 3574), // &j -> &jf + new Transition (3583, 3584), // &Jop -> &Jopf + new Transition (3587, 3588), // &jop -> &jopf + new Transition (3618, 3648), // &K -> &Kf + new Transition (3624, 3651), // &k -> &kf + new Transition (3677, 3678), // &Kop -> &Kopf + new Transition (3681, 3682), // &kop -> &kopf + new Transition (3692, 4301), // &l -> &lf + new Transition (3698, 4312), // &L -> &Lf + new Transition (3752, 3753), // &Laplacetr -> &Laplacetrf + new Transition (3766, 3773), // &larr -> &larrf + new Transition (3768, 3770), // &larrb -> &larrbf + new Transition (3896, 3925), // &le -> &lef + new Transition (3898, 3899), // &Le -> &Lef + new Transition (4020, 4021), // &leftle -> &leftlef + new Transition (4361, 4362), // &Lle -> &Llef + new Transition (4438, 4439), // &LongLe -> &LongLef + new Transition (4448, 4449), // &Longle -> &Longlef + new Transition (4460, 4461), // &longle -> &longlef + new Transition (4550, 4551), // &looparrowle -> &looparrowlef + new Transition (4560, 4567), // &lop -> &lopf + new Transition (4564, 4565), // &Lop -> &Lopf + new Transition (4592, 4593), // &LowerLe -> &LowerLef + new Transition (4612, 4619), // &loz -> &lozf + new Transition (4732, 4736), // <ri -> <rif + new Transition (4767, 4865), // &m -> &mf + new Transition (4781, 4862), // &M -> &Mf + new Transition (4797, 4798), // &mapstole -> &mapstolef + new Transition (4859, 4860), // &Mellintr -> &Mellintrf + new Transition (4929, 4930), // &Mop -> &Mopf + new Transition (4932, 4933), // &mop -> &mopf + new Transition (4965, 5192), // &n -> &nf + new Transition (4971, 5189), // &N -> &Nf + new Transition (5270, 5282), // &nle -> &nlef + new Transition (5273, 5274), // &nLe -> &nLef + new Transition (5369, 5370), // &Nop -> &Nopf + new Transition (5373, 5374), // &nop -> &nopf + new Transition (5529, 5530), // &NotLe -> &NotLef + new Transition (6014, 6015), // &ntrianglele -> &ntrianglelef + new Transition (6079, 6080), // &nvin -> &nvinf + new Transition (6131, 6205), // &O -> &Of + new Transition (6138, 6200), // &o -> &of + new Transition (6295, 6296), // &Oop -> &Oopf + new Transition (6299, 6300), // &oop -> &oopf + new Transition (6348, 6356), // &ord -> ª + new Transition (6353, 6354), // &ordero -> &orderof + new Transition (6362, 6363), // &origo -> &origof + new Transition (6463, 6521), // &p -> &pf + new Transition (6482, 6518), // &P -> &Pf + new Transition (6547, 6548), // &pitch -> &pitchf + new Transition (6630, 6631), // &Pop -> &Popf + new Transition (6633, 6634), // &pop -> &popf + new Transition (6745, 6754), // &pro -> &prof + new Transition (6767, 6768), // &profsur -> &profsurf + new Transition (6813, 6814), // &Q -> &Qf + new Transition (6817, 6818), // &q -> &qf + new Transition (6826, 6827), // &Qop -> &Qopf + new Transition (6830, 6831), // &qop -> &qopf + new Transition (6876, 7135), // &r -> &rf + new Transition (6886, 7146), // &R -> &Rf + new Transition (6932, 6944), // &rarr -> &rarrf + new Transition (6937, 6939), // &rarrb -> &rarrbf + new Transition (7214, 7215), // &RightArrowLe -> &RightArrowLef + new Transition (7295, 7296), // &rightle -> &rightlef + new Transition (7481, 7489), // &rop -> &ropf + new Transition (7486, 7487), // &Rop -> &Ropf + new Transition (7579, 7583), // &rtri -> &rtrif + new Transition (7610, 7741), // &S -> &Sf + new Transition (7617, 7744), // &s -> &sf + new Transition (7787, 7788), // &ShortLe -> &ShortLef + new Transition (7841, 7843), // &sigma -> &sigmaf + new Transition (7936, 7937), // &so -> &sof + new Transition (7950, 7951), // &Sop -> &Sopf + new Transition (7953, 7954), // &sop -> &sopf + new Transition (8008, 8066), // &squ -> &squf + new Transition (8016, 8064), // &squar -> &squarf + new Transition (8093, 8094), // &sstar -> &sstarf + new Transition (8102, 8104), // &star -> &starf + new Transition (8400, 8455), // &T -> &Tf + new Transition (8404, 8458), // &t -> &tf + new Transition (8464, 8476), // &there -> &theref + new Transition (8470, 8471), // &There -> &Theref + new Transition (8594, 8608), // &top -> &topf + new Transition (8605, 8606), // &Top -> &Topf + new Transition (8646, 8647), // &trianglele -> &trianglelef + new Transition (8748, 8749), // &twoheadle -> &twoheadlef + new Transition (8768, 8855), // &U -> &Uf + new Transition (8775, 8849), // &u -> &uf + new Transition (8964, 8965), // &Uop -> &Uopf + new Transition (8967, 8968), // &uop -> &uopf + new Transition (9054, 9055), // &upharpoonle -> &upharpoonlef + new Transition (9072, 9073), // &UpperLe -> &UpperLef + new Transition (9178, 9180), // &utri -> &utrif + new Transition (9201, 9417), // &v -> &vf + new Transition (9293, 9294), // &vartrianglele -> &vartrianglelef + new Transition (9303, 9414), // &V -> &Vf + new Transition (9433, 9434), // &Vop -> &Vopf + new Transition (9437, 9438), // &vop -> &vopf + new Transition (9484, 9517), // &W -> &Wf + new Transition (9490, 9520), // &w -> &wf + new Transition (9524, 9525), // &Wop -> &Wopf + new Transition (9528, 9529), // &wop -> &wopf + new Transition (9548, 9569), // &x -> &xf + new Transition (9565, 9566), // &X -> &Xf + new Transition (9608, 9609), // &Xop -> &Xopf + new Transition (9611, 9612), // &xop -> &xopf + new Transition (9665, 9702), // &Y -> &Yf + new Transition (9672, 9705), // &y -> &yf + new Transition (9717, 9718), // &Yop -> &Yopf + new Transition (9721, 9722), // &yop -> &yopf + new Transition (9747, 9811), // &Z -> &Zf + new Transition (9754, 9814), // &z -> &zf + new Transition (9788, 9789), // &zeetr -> &zeetrf + new Transition (9833, 9834), // &Zop -> &Zopf + new Transition (9837, 9838) // &zop -> &zopf + }; + TransitionTable_g = new Transition[182] { + new Transition (0, 2701), // & -> &g + new Transition (1, 67), // &A -> &Ag + new Transition (8, 73), // &a -> &ag + new Transition (52, 53), // &AEli -> Æ + new Transition (57, 58), // &aeli -> æ + new Transition (108, 109), // &amal -> &amalg + new Transition (119, 136), // &an -> &ang + new Transition (147, 160), // &angmsda -> &angmsdag + new Transition (183, 184), // &Ao -> &Aog + new Transition (188, 189), // &ao -> &aog + new Transition (239, 240), // &Arin -> Å + new Transition (244, 245), // &arin -> å + new Transition (256, 257), // &Assi -> &Assig + new Transition (307, 308), // &backcon -> &backcong + new Transition (355, 357), // &barwed -> &barwedg + new Transition (371, 372), // &bcon -> &bcong + new Transition (442, 443), // &bi -> &big + new Transition (485, 486), // &bigtrian -> &bigtriang + new Transition (509, 510), // &bigwed -> &bigwedg + new Transition (527, 528), // &blacklozen -> &blacklozeng + new Transition (542, 543), // &blacktrian -> &blacktriang + new Transition (558, 559), // &blacktriangleri -> &blacktrianglerig + new Transition (999, 1000), // &circlearrowri -> &circlearrowrig + new Transition (1086, 1087), // &ClockwiseContourInte -> &ClockwiseContourInteg + new Transition (1164, 1165), // &con -> &cong + new Transition (1171, 1172), // &Con -> &Cong + new Transition (1194, 1195), // &ContourInte -> &ContourInteg + new Transition (1250, 1251), // &CounterClockwiseContourInte -> &CounterClockwiseContourInteg + new Transition (1373, 1374), // &curlywed -> &curlywedg + new Transition (1394, 1395), // &curvearrowri -> &curvearrowrig + new Transition (1426, 1427), // &Da -> &Dag + new Transition (1427, 1428), // &Dag -> &Dagg + new Transition (1433, 1434), // &da -> &dag + new Transition (1434, 1435), // &dag -> &dagg + new Transition (1494, 1495), // &dda -> &ddag + new Transition (1495, 1496), // &ddag -> &ddagg + new Transition (1516, 1517), // &de -> ° + new Transition (1599, 1633), // &di -> &dig + new Transition (1740, 1741), // &doublebarwed -> &doublebarwedg + new Transition (1758, 1759), // &DoubleContourInte -> &DoubleContourInteg + new Transition (1787, 1788), // &DoubleLeftRi -> &DoubleLeftRig + new Transition (1802, 1803), // &DoubleLon -> &DoubleLong + new Transition (1815, 1816), // &DoubleLongLeftRi -> &DoubleLongLeftRig + new Transition (1826, 1827), // &DoubleLongRi -> &DoubleLongRig + new Transition (1837, 1838), // &DoubleRi -> &DoubleRig + new Transition (1945, 1946), // &downharpoonri -> &downharpoonrig + new Transition (1955, 1956), // &DownLeftRi -> &DownLeftRig + new Transition (1988, 1989), // &DownRi -> &DownRig + new Transition (2088, 2089), // &dwan -> &dwang + new Transition (2101, 2102), // &dzi -> &dzig + new Transition (2108, 2187), // &E -> &Eg + new Transition (2115, 2185), // &e -> &eg + new Transition (2290, 2291), // &en -> &eng + new Transition (2296, 2297), // &Eo -> &Eog + new Transition (2301, 2302), // &eo -> &eog + new Transition (2357, 2358), // &eqslant -> &eqslantg + new Transition (2508, 2509), // &fallin -> &falling + new Transition (2533, 2534), // &ffili -> &ffilig + new Transition (2537, 2538), // &ffli -> &fflig + new Transition (2541, 2542), // &fflli -> &ffllig + new Transition (2551, 2552), // &fili -> &filig + new Transition (2589, 2590), // &fjli -> &fjlig + new Transition (2597, 2598), // &flli -> &fllig + new Transition (2701, 2807), // &g -> &gg + new Transition (2708, 2805), // &G -> &Gg + new Transition (2807, 2809), // &gg -> &ggg + new Transition (3149, 3150), // &hookri -> &hookrig + new Transition (3236, 3289), // &I -> &Ig + new Transition (3243, 3295), // &i -> &ig + new Transition (3322, 3323), // &IJli -> &IJlig + new Transition (3327, 3328), // &ijli -> &ijlig + new Transition (3332, 3344), // &Ima -> &Imag + new Transition (3337, 3341), // &ima -> &imag + new Transition (3407, 3408), // &inte -> &integ + new Transition (3413, 3414), // &Inte -> &Integ + new Transition (3467, 3476), // &io -> &iog + new Transition (3471, 3472), // &Io -> &Iog + new Transition (3624, 3654), // &k -> &kg + new Transition (3692, 4317), // &l -> &lg + new Transition (3705, 3718), // &la -> &lag + new Transition (3733, 3734), // &Lan -> &Lang + new Transition (3736, 3737), // &lan -> &lang + new Transition (3894, 4183), // &lE -> &lEg + new Transition (3896, 4185), // &le -> &leg + new Transition (3902, 3903), // &LeftAn -> &LeftAng + new Transition (3938, 3939), // &LeftArrowRi -> &LeftArrowRig + new Transition (3958, 3959), // &LeftCeilin -> &LeftCeiling + new Transition (4031, 4032), // &LeftRi -> &LeftRig + new Transition (4042, 4043), // &Leftri -> &Leftrig + new Transition (4053, 4054), // &leftri -> &leftrig + new Transition (4077, 4078), // &leftrightsqui -> &leftrightsquig + new Transition (4123, 4124), // &LeftTrian -> &LeftTriang + new Transition (4197, 4210), // &les -> &lesg + new Transition (4215, 4271), // &less -> &lessg + new Transition (4228, 4229), // &lesseq -> &lesseqg + new Transition (4233, 4234), // &lesseqq -> &lesseqqg + new Transition (4424, 4425), // &loan -> &loang + new Transition (4435, 4436), // &Lon -> &Long + new Transition (4457, 4458), // &lon -> &long + new Transition (4470, 4471), // &LongLeftRi -> &LongLeftRig + new Transition (4481, 4482), // &Longleftri -> &Longleftrig + new Transition (4492, 4493), // &longleftri -> &longleftrig + new Transition (4510, 4511), // &LongRi -> &LongRig + new Transition (4521, 4522), // &Longri -> &Longrig + new Transition (4532, 4533), // &longri -> &longrig + new Transition (4555, 4556), // &looparrowri -> &looparrowrig + new Transition (4602, 4603), // &LowerRi -> &LowerRig + new Transition (4615, 4616), // &lozen -> &lozeng + new Transition (4670, 4674), // &lsim -> &lsimg + new Transition (4838, 4839), // &measuredan -> &measuredang + new Transition (4965, 5195), // &n -> &ng + new Transition (4983, 4984), // &nan -> &nang + new Transition (5045, 5046), // &ncon -> &ncong + new Transition (5084, 5085), // &Ne -> &Neg + new Transition (5212, 5213), // &nG -> &nGg + new Transition (5291, 5292), // &nLeftri -> &nLeftrig + new Transition (5302, 5303), // &nleftri -> &nleftrig + new Transition (5361, 5362), // &NonBreakin -> &NonBreaking + new Transition (5382, 5383), // &NotCon -> &NotCong + new Transition (5536, 5537), // &NotLeftTrian -> &NotLeftTriang + new Transition (5671, 5672), // &NotRi -> &NotRig + new Transition (5679, 5680), // &NotRightTrian -> &NotRightTriang + new Transition (5869, 5870), // &nRi -> &nRig + new Transition (5879, 5880), // &nri -> &nrig + new Transition (5988, 5989), // &nt -> &ntg + new Transition (6003, 6004), // &ntl -> &ntlg + new Transition (6009, 6010), // &ntrian -> &ntriang + new Transition (6022, 6023), // &ntriangleri -> &ntrianglerig + new Transition (6043, 6068), // &nv -> &nvg + new Transition (6131, 6214), // &O -> &Og + new Transition (6138, 6210), // &o -> &og + new Transition (6192, 6193), // &OEli -> &OElig + new Transition (6197, 6198), // &oeli -> &oelig + new Transition (6268, 6269), // &Ome -> &Omeg + new Transition (6272, 6273), // &ome -> &omeg + new Transition (6360, 6361), // &ori -> &orig + new Transition (6908, 6909), // &Ran -> &Rang + new Transition (6911, 6912), // &ran -> &rang + new Transition (7074, 7095), // &re -> ® + new Transition (7171, 7172), // &Ri -> &Rig + new Transition (7176, 7177), // &RightAn -> &RightAng + new Transition (7199, 7200), // &ri -> &rig + new Transition (7233, 7234), // &RightCeilin -> &RightCeiling + new Transition (7315, 7316), // &rightri -> &rightrig + new Transition (7329, 7330), // &rightsqui -> &rightsquig + new Transition (7368, 7369), // &RightTrian -> &RightTriang + new Transition (7428, 7429), // &rin -> &ring + new Transition (7433, 7434), // &risin -> &rising + new Transition (7471, 7472), // &roan -> &roang + new Transition (7514, 7516), // &rpar -> &rparg + new Transition (7532, 7533), // &Rri -> &Rrig + new Transition (7813, 7814), // &ShortRi -> &ShortRig + new Transition (7833, 7834), // &Si -> &Sig + new Transition (7838, 7839), // &si -> &sig + new Transition (7847, 7857), // &sim -> &simg + new Transition (8108, 8109), // &strai -> &straig + new Transition (8279, 8280), // &sun -> &sung + new Transition (8397, 8398), // &szli -> ß + new Transition (8406, 8407), // &tar -> &targ + new Transition (8635, 8636), // &trian -> &triang + new Transition (8656, 8657), // &triangleri -> &trianglerig + new Transition (8758, 8759), // &twoheadri -> &twoheadrig + new Transition (8768, 8860), // &U -> &Ug + new Transition (8775, 8866), // &u -> &ug + new Transition (8954, 8955), // &Uo -> &Uog + new Transition (8959, 8960), // &uo -> &uog + new Transition (9059, 9060), // &upharpoonri -> &upharpoonrig + new Transition (9082, 9083), // &UpperRi -> &UpperRig + new Transition (9142, 9143), // &Urin -> &Uring + new Transition (9146, 9147), // &urin -> &uring + new Transition (9196, 9197), // &uwan -> &uwang + new Transition (9203, 9204), // &van -> &vang + new Transition (9228, 9229), // &varnothin -> &varnothing + new Transition (9253, 9254), // &varsi -> &varsig + new Transition (9288, 9289), // &vartrian -> &vartriang + new Transition (9298, 9299), // &vartriangleri -> &vartrianglerig + new Transition (9478, 9479), // &vzi -> &vzig + new Transition (9481, 9482), // &vzigza -> &vzigzag + new Transition (9497, 9507), // &wed -> &wedg + new Transition (9503, 9504), // &Wed -> &Wedg + new Transition (9661, 9662), // &xwed -> &xwedg + new Transition (9825, 9826) // &zi -> &zig + }; + TransitionTable_h = new Transition[159] { + new Transition (0, 3020), // & -> &h + new Transition (86, 87), // &alep -> &aleph + new Transition (90, 91), // &Alp -> &Alph + new Transition (94, 95), // &alp -> &alph + new Transition (147, 162), // &angmsda -> &angmsdah + new Transition (173, 174), // &angsp -> &angsph + new Transition (338, 339), // &Backslas -> &Backslash + new Transition (426, 429), // &bet -> &beth + new Transition (559, 560), // &blacktrianglerig -> &blacktrianglerigh + new Transition (613, 638), // &box -> &boxh + new Transition (691, 697), // &boxV -> &boxVh + new Transition (693, 701), // &boxv -> &boxvh + new Transition (758, 762), // &bsol -> &bsolh + new Transition (789, 973), // &C -> &Ch + new Transition (796, 960), // &c -> &ch + new Transition (1000, 1001), // &circlearrowrig -> &circlearrowrigh + new Transition (1016, 1017), // &circleddas -> &circleddash + new Transition (1395, 1396), // &curvearrowrig -> &curvearrowrigh + new Transition (1432, 1550), // &d -> &dh + new Transition (1441, 1442), // &dalet -> &daleth + new Transition (1454, 1455), // &das -> &dash + new Transition (1457, 1458), // &Das -> &Dash + new Transition (1506, 1507), // &DDotra -> &DDotrah + new Transition (1537, 1538), // &dfis -> &dfish + new Transition (1788, 1789), // &DoubleLeftRig -> &DoubleLeftRigh + new Transition (1816, 1817), // &DoubleLongLeftRig -> &DoubleLongLeftRigh + new Transition (1827, 1828), // &DoubleLongRig -> &DoubleLongRigh + new Transition (1838, 1839), // &DoubleRig -> &DoubleRigh + new Transition (1896, 1932), // &down -> &downh + new Transition (1946, 1947), // &downharpoonrig -> &downharpoonrigh + new Transition (1956, 1957), // &DownLeftRig -> &DownLeftRigh + new Transition (1989, 1990), // &DownRig -> &DownRigh + new Transition (2077, 2082), // &du -> &duh + new Transition (2439, 2445), // &et -> ð + new Transition (3132, 3133), // &homt -> &homth + new Transition (3150, 3151), // &hookrig -> &hookrigh + new Transition (3194, 3195), // &hslas -> &hslash + new Transition (3231, 3232), // &hyp -> &hyph + new Transition (3362, 3363), // &imat -> &imath + new Transition (3435, 3436), // &intlar -> &intlarh + new Transition (3579, 3580), // &jmat -> &jmath + new Transition (3624, 3664), // &k -> &kh + new Transition (3692, 4325), // &l -> &lh + new Transition (3766, 3776), // &larr -> &larrh + new Transition (3880, 3881), // &ldrd -> &ldrdh + new Transition (3886, 3887), // &ldrus -> &ldrush + new Transition (3891, 3892), // &lds -> &ldsh + new Transition (3926, 4004), // &left -> &lefth + new Transition (3939, 3940), // &LeftArrowRig -> &LeftArrowRigh + new Transition (4032, 4033), // &LeftRig -> &LeftRigh + new Transition (4043, 4044), // &Leftrig -> &Leftrigh + new Transition (4054, 4055), // &leftrig -> &leftrigh + new Transition (4056, 4065), // &leftright -> &leftrighth + new Transition (4109, 4110), // &leftt -> &leftth + new Transition (4303, 4304), // &lfis -> &lfish + new Transition (4348, 4370), // &ll -> &llh + new Transition (4397, 4398), // &lmoustac -> &lmoustach + new Transition (4471, 4472), // &LongLeftRig -> &LongLeftRigh + new Transition (4482, 4483), // &Longleftrig -> &Longleftrigh + new Transition (4493, 4494), // &longleftrig -> &longleftrigh + new Transition (4511, 4512), // &LongRig -> &LongRigh + new Transition (4522, 4523), // &Longrig -> &Longrigh + new Transition (4533, 4534), // &longrig -> &longrigh + new Transition (4556, 4557), // &looparrowrig -> &looparrowrigh + new Transition (4603, 4604), // &LowerRig -> &LowerRigh + new Transition (4628, 4640), // &lr -> &lrh + new Transition (4652, 4667), // &ls -> &lsh + new Transition (4658, 4665), // &Ls -> &Lsh + new Transition (4698, 4710), // < -> <h + new Transition (4745, 4746), // &lurds -> &lurdsh + new Transition (4750, 4751), // &luru -> &luruh + new Transition (4767, 4868), // &m -> &mh + new Transition (4822, 4823), // &mdas -> &mdash + new Transition (4965, 5227), // &n -> &nh + new Transition (5061, 5062), // &ndas -> &ndash + new Transition (5067, 5068), // &near -> &nearh + new Transition (5103, 5104), // &NegativeT -> &NegativeTh + new Transition (5125, 5126), // &NegativeVeryT -> &NegativeVeryTh + new Transition (5292, 5293), // &nLeftrig -> &nLeftrigh + new Transition (5303, 5304), // &nleftrig -> &nleftrigh + new Transition (5672, 5673), // &NotRig -> &NotRigh + new Transition (5870, 5871), // &nRig -> &nRigh + new Transition (5880, 5881), // &nrig -> &nrigh + new Transition (5895, 5910), // &ns -> &nsh + new Transition (6023, 6024), // &ntrianglerig -> &ntrianglerigh + new Transition (6050, 6051), // &nVDas -> &nVDash + new Transition (6055, 6056), // &nVdas -> &nVdash + new Transition (6060, 6061), // &nvDas -> &nvDash + new Transition (6065, 6066), // &nvdas -> &nvdash + new Transition (6113, 6114), // &nwar -> &nwarh + new Transition (6138, 6227), // &o -> &oh + new Transition (6165, 6166), // &odas -> &odash + new Transition (6388, 6389), // &Oslas -> Ø + new Transition (6393, 6394), // &oslas -> ø + new Transition (6456, 6457), // &OverParent -> &OverParenth + new Transition (6463, 6527), // &p -> &ph + new Transition (6482, 6524), // &P -> &Ph + new Transition (6546, 6547), // &pitc -> &pitch + new Transition (6559, 6561), // &planck -> &planckh + new Transition (6876, 7155), // &r -> &rh + new Transition (6886, 7164), // &R -> &Rh + new Transition (6932, 6947), // &rarr -> &rarrh + new Transition (7058, 7059), // &rdld -> &rdldh + new Transition (7069, 7070), // &rds -> &rdsh + new Transition (7137, 7138), // &rfis -> &rfish + new Transition (7172, 7173), // &Rig -> &Righ + new Transition (7200, 7201), // &rig -> &righ + new Transition (7202, 7279), // &right -> &righth + new Transition (7297, 7305), // &rightleft -> &rightlefth + new Transition (7316, 7317), // &rightrig -> &rightrigh + new Transition (7354, 7355), // &rightt -> &rightth + new Transition (7442, 7447), // &rl -> &rlh + new Transition (7460, 7461), // &rmoustac -> &rmoustach + new Transition (7533, 7534), // &Rrig -> &Rrigh + new Transition (7542, 7557), // &rs -> &rsh + new Transition (7548, 7555), // &Rs -> &Rsh + new Transition (7567, 7568), // &rt -> &rth + new Transition (7603, 7604), // &rulu -> &ruluh + new Transition (7610, 7772), // &S -> &Sh + new Transition (7617, 7751), // &s -> &sh + new Transition (7705, 7706), // &sear -> &searh + new Transition (7762, 7763), // &shc -> &shch + new Transition (7814, 7815), // &ShortRig -> &ShortRigh + new Transition (7907, 7908), // &smas -> &smash + new Transition (8109, 8110), // &straig -> &straigh + new Transition (8120, 8121), // &straightp -> &straightph + new Transition (8216, 8269), // &Suc -> &Such + new Transition (8270, 8271), // &SuchT -> &SuchTh + new Transition (8284, 8320), // &sup -> &suph + new Transition (8377, 8378), // &swar -> &swarh + new Transition (8400, 8467), // &T -> &Th + new Transition (8404, 8461), // &t -> &th + new Transition (8657, 8658), // &trianglerig -> &trianglerigh + new Transition (8709, 8723), // &ts -> &tsh + new Transition (8742, 8743), // &two -> &twoh + new Transition (8759, 8760), // &twoheadrig -> &twoheadrigh + new Transition (8775, 8876), // &u -> &uh + new Transition (8829, 8845), // &ud -> &udh + new Transition (8851, 8852), // &ufis -> &ufish + new Transition (8938, 8939), // &UnderParent -> &UnderParenth + new Transition (8983, 9046), // &up -> &uph + new Transition (9060, 9061), // &upharpoonrig -> &upharpoonrigh + new Transition (9083, 9084), // &UpperRig -> &UpperRigh + new Transition (9096, 9098), // &upsi -> &upsih + new Transition (9225, 9226), // &varnot -> &varnoth + new Transition (9231, 9232), // &varp -> &varph + new Transition (9247, 9249), // &varr -> &varrh + new Transition (9279, 9280), // &vart -> &varth + new Transition (9299, 9300), // &vartrianglerig -> &vartrianglerigh + new Transition (9322, 9323), // &VDas -> &VDash + new Transition (9327, 9328), // &Vdas -> &Vdash + new Transition (9332, 9333), // &vDas -> &vDash + new Transition (9337, 9338), // &vdas -> &vdash + new Transition (9404, 9405), // &VeryT -> &VeryTh + new Transition (9474, 9475), // &Vvdas -> &Vvdash + new Transition (9537, 9538), // &wreat -> &wreath + new Transition (9548, 9572), // &x -> &xh + new Transition (9754, 9821), // &z -> &zh + new Transition (9797, 9798) // &ZeroWidt -> &ZeroWidth + }; + TransitionTable_i = new Transition[428] { + new Transition (0, 3243), // & -> &i + new Transition (27, 38), // &ac -> &aci + new Transition (33, 34), // &Ac -> &Aci + new Transition (51, 52), // &AEl -> &AEli + new Transition (56, 57), // &ael -> &aeli + new Transition (199, 210), // &ap -> &api + new Transition (202, 203), // &apac -> &apaci + new Transition (224, 225), // &ApplyFunct -> &ApplyFuncti + new Transition (237, 238), // &Ar -> &Ari + new Transition (242, 243), // &ar -> &ari + new Transition (255, 256), // &Ass -> &Assi + new Transition (269, 270), // &At -> &Ati + new Transition (275, 276), // &at -> &ati + new Transition (289, 297), // &aw -> &awi + new Transition (292, 293), // &awcon -> &awconi + new Transition (301, 442), // &b -> &bi + new Transition (312, 313), // &backeps -> &backepsi + new Transition (319, 320), // &backpr -> &backpri + new Transition (324, 325), // &backs -> &backsi + new Transition (406, 407), // &beps -> &bepsi + new Transition (419, 420), // &Bernoull -> &Bernoulli + new Transition (444, 448), // &bigc -> &bigci + new Transition (465, 466), // &bigot -> &bigoti + new Transition (482, 483), // &bigtr -> &bigtri + new Transition (539, 540), // &blacktr -> &blacktri + new Transition (557, 558), // &blacktriangler -> &blacktriangleri + new Transition (583, 584), // &bnequ -> &bnequi + new Transition (609, 610), // &bowt -> &bowti + new Transition (656, 657), // &boxm -> &boxmi + new Transition (667, 668), // &boxt -> &boxti + new Transition (720, 721), // &bpr -> &bpri + new Transition (744, 752), // &bs -> &bsi + new Transition (749, 750), // &bsem -> &bsemi + new Transition (789, 1019), // &C -> &Ci + new Transition (796, 978), // &c -> &ci + new Transition (803, 828), // &Cap -> &Capi + new Transition (832, 833), // &CapitalD -> &CapitalDi + new Transition (840, 841), // &CapitalDifferent -> &CapitalDifferenti + new Transition (861, 890), // &cc -> &cci + new Transition (866, 886), // &Cc -> &Cci + new Transition (877, 878), // &Cced -> &Ccedi + new Transition (882, 883), // &cced -> &ccedi + new Transition (895, 896), // &Ccon -> &Cconi + new Transition (916, 917), // &ced -> &cedi + new Transition (921, 922), // &Ced -> &Cedi + new Transition (960, 976), // &ch -> &chi + new Transition (973, 974), // &Ch -> &Chi + new Transition (998, 999), // &circlearrowr -> &circlearrowri + new Transition (1009, 1010), // &circledc -> &circledci + new Transition (1032, 1033), // &CircleM -> &CircleMi + new Transition (1043, 1044), // &CircleT -> &CircleTi + new Transition (1054, 1055), // &cirfn -> &cirfni + new Transition (1059, 1060), // &cirm -> &cirmi + new Transition (1064, 1065), // &cirsc -> &cirsci + new Transition (1072, 1073), // &Clockw -> &Clockwi + new Transition (1122, 1123), // &clubsu -> &clubsui + new Transition (1164, 1183), // &con -> &coni + new Transition (1171, 1179), // &Con -> &Coni + new Transition (1236, 1237), // &CounterClockw -> &CounterClockwi + new Transition (1393, 1394), // &curvearrowr -> &curvearrowri + new Transition (1407, 1415), // &cw -> &cwi + new Transition (1410, 1411), // &cwcon -> &cwconi + new Transition (1425, 1557), // &D -> &Di + new Transition (1432, 1599), // &d -> &di + new Transition (1535, 1536), // &df -> &dfi + new Transition (1560, 1561), // &Diacr -> &Diacri + new Transition (1562, 1563), // &Diacrit -> &Diacriti + new Transition (1593, 1594), // &DiacriticalT -> &DiacriticalTi + new Transition (1613, 1614), // &diamondsu -> &diamondsui + new Transition (1627, 1628), // &Different -> &Differenti + new Transition (1639, 1640), // &dis -> &disi + new Transition (1643, 1645), // &div -> &divi + new Transition (1651, 1652), // ÷ont -> ÷onti + new Transition (1713, 1714), // &dotm -> &dotmi + new Transition (1786, 1787), // &DoubleLeftR -> &DoubleLeftRi + new Transition (1814, 1815), // &DoubleLongLeftR -> &DoubleLongLeftRi + new Transition (1825, 1826), // &DoubleLongR -> &DoubleLongRi + new Transition (1836, 1837), // &DoubleR -> &DoubleRi + new Transition (1872, 1873), // &DoubleVert -> &DoubleVerti + new Transition (1944, 1945), // &downharpoonr -> &downharpoonri + new Transition (1954, 1955), // &DownLeftR -> &DownLeftRi + new Transition (1987, 1988), // &DownR -> &DownRi + new Transition (2072, 2073), // &dtr -> &dtri + new Transition (2097, 2101), // &dz -> &dzi + new Transition (2127, 2142), // &Ec -> &Eci + new Transition (2133, 2139), // &ec -> &eci + new Transition (2204, 2213), // &el -> &eli + new Transition (2323, 2324), // &eps -> &epsi + new Transition (2327, 2328), // &Eps -> &Epsi + new Transition (2340, 2341), // &eqc -> &eqci + new Transition (2350, 2351), // &eqs -> &eqsi + new Transition (2368, 2387), // &Equ -> &Equi + new Transition (2372, 2396), // &equ -> &equi + new Transition (2377, 2378), // &EqualT -> &EqualTi + new Transition (2388, 2389), // &Equil -> &Equili + new Transition (2391, 2392), // &Equilibr -> &Equilibri + new Transition (2418, 2430), // &Es -> &Esi + new Transition (2422, 2433), // &es -> &esi + new Transition (2458, 2462), // &ex -> &exi + new Transition (2466, 2467), // &Ex -> &Exi + new Transition (2477, 2478), // &expectat -> &expectati + new Transition (2487, 2488), // &Exponent -> &Exponenti + new Transition (2497, 2498), // &exponent -> &exponenti + new Transition (2503, 2549), // &f -> &fi + new Transition (2506, 2507), // &fall -> &falli + new Transition (2517, 2554), // &F -> &Fi + new Transition (2530, 2531), // &ff -> &ffi + new Transition (2532, 2533), // &ffil -> &ffili + new Transition (2536, 2537), // &ffl -> &ffli + new Transition (2540, 2541), // &ffll -> &fflli + new Transition (2550, 2551), // &fil -> &fili + new Transition (2588, 2589), // &fjl -> &fjli + new Transition (2596, 2597), // &fll -> &flli + new Transition (2631, 2632), // &Four -> &Fouri + new Transition (2642, 2643), // &fpart -> &fparti + new Transition (2701, 2811), // &g -> &gi + new Transition (2736, 2742), // &Gc -> &Gci + new Transition (2738, 2739), // &Gced -> &Gcedi + new Transition (2746, 2747), // &gc -> &gci + new Transition (2849, 2850), // &gns -> &gnsi + new Transition (2917, 2918), // &GreaterT -> &GreaterTi + new Transition (2927, 2931), // &gs -> &gsi + new Transition (2944, 2947), // >c -> >ci + new Transition (2998, 2999), // >rs -> >rsi + new Transition (3014, 3100), // &H -> &Hi + new Transition (3021, 3022), // &ha -> &hai + new Transition (3030, 3031), // &ham -> &hami + new Transition (3052, 3053), // &harrc -> &harrci + new Transition (3064, 3065), // &Hc -> &Hci + new Transition (3069, 3070), // &hc -> &hci + new Transition (3080, 3081), // &heartsu -> &heartsui + new Transition (3085, 3086), // &hell -> &helli + new Transition (3148, 3149), // &hookr -> &hookri + new Transition (3171, 3172), // &Hor -> &Hori + new Transition (3179, 3180), // &HorizontalL -> &HorizontalLi + new Transition (3243, 3301), // &i -> &ii + new Transition (3250, 3257), // &ic -> &ici + new Transition (3252, 3253), // &Ic -> &Ici + new Transition (3301, 3303), // &ii -> &iii + new Transition (3303, 3304), // &iii -> &iiii + new Transition (3312, 3313), // &iinf -> &iinfi + new Transition (3321, 3322), // &IJl -> &IJli + new Transition (3326, 3327), // &ijl -> &ijli + new Transition (3344, 3345), // &Imag -> &Imagi + new Transition (3352, 3353), // &imagl -> &imagli + new Transition (3373, 3374), // &Impl -> &Impli + new Transition (3385, 3386), // &inf -> &infi + new Transition (3389, 3390), // &infint -> &infinti + new Transition (3428, 3429), // &Intersect -> &Intersecti + new Transition (3444, 3445), // &Inv -> &Invi + new Transition (3446, 3447), // &Invis -> &Invisi + new Transition (3457, 3458), // &InvisibleT -> &InvisibleTi + new Transition (3507, 3511), // &is -> &isi + new Transition (3526, 3534), // &it -> &iti + new Transition (3528, 3529), // &It -> &Iti + new Transition (3556, 3557), // &Jc -> &Jci + new Transition (3562, 3563), // &jc -> &jci + new Transition (3634, 3635), // &Kced -> &Kcedi + new Transition (3640, 3641), // &kced -> &kcedi + new Transition (3785, 3786), // &larrs -> &larrsi + new Transition (3795, 3796), // &lAta -> &lAtai + new Transition (3799, 3800), // &lata -> &latai + new Transition (3850, 3851), // &Lced -> &Lcedi + new Transition (3854, 3859), // &lce -> &lcei + new Transition (3855, 3856), // &lced -> &lcedi + new Transition (3937, 3938), // &LeftArrowR -> &LeftArrowRi + new Transition (3949, 3950), // &leftarrowta -> &leftarrowtai + new Transition (3954, 3955), // &LeftCe -> &LeftCei + new Transition (3956, 3957), // &LeftCeil -> &LeftCeili + new Transition (4030, 4031), // &LeftR -> &LeftRi + new Transition (4041, 4042), // &Leftr -> &Leftri + new Transition (4052, 4053), // &leftr -> &leftri + new Transition (4076, 4077), // &leftrightsqu -> &leftrightsqui + new Transition (4114, 4115), // &leftthreet -> &leftthreeti + new Transition (4120, 4121), // &LeftTr -> &LeftTri + new Transition (4280, 4281), // &lesss -> &lesssi + new Transition (4295, 4296), // &LessT -> &LessTi + new Transition (4301, 4302), // &lf -> &lfi + new Transition (4376, 4377), // &lltr -> &lltri + new Transition (4379, 4380), // &Lm -> &Lmi + new Transition (4385, 4386), // &lm -> &lmi + new Transition (4418, 4419), // &lns -> &lnsi + new Transition (4469, 4470), // &LongLeftR -> &LongLeftRi + new Transition (4480, 4481), // &Longleftr -> &Longleftri + new Transition (4491, 4492), // &longleftr -> &longleftri + new Transition (4509, 4510), // &LongR -> &LongRi + new Transition (4520, 4521), // &Longr -> &Longri + new Transition (4531, 4532), // &longr -> &longri + new Transition (4554, 4555), // &looparrowr -> &looparrowri + new Transition (4573, 4574), // &lot -> &loti + new Transition (4601, 4602), // &LowerR -> &LowerRi + new Transition (4649, 4650), // &lrtr -> &lrtri + new Transition (4652, 4669), // &ls -> &lsi + new Transition (4698, 4715), // < -> <i + new Transition (4700, 4703), // <c -> <ci + new Transition (4731, 4732), // <r -> <ri + new Transition (4767, 4871), // &m -> &mi + new Transition (4781, 4900), // &M -> &Mi + new Transition (4844, 4845), // &Med -> &Medi + new Transition (4855, 4856), // &Mell -> &Melli + new Transition (4882, 4883), // &midc -> &midci + new Transition (4955, 4956), // &mult -> &multi + new Transition (4965, 5240), // &n -> &ni + new Transition (4986, 4990), // &nap -> &napi + new Transition (5035, 5036), // &Nced -> &Ncedi + new Transition (5040, 5041), // &nced -> &ncedi + new Transition (5087, 5088), // &Negat -> &Negati + new Transition (5093, 5094), // &NegativeMed -> &NegativeMedi + new Transition (5104, 5105), // &NegativeTh -> &NegativeThi + new Transition (5126, 5127), // &NegativeVeryTh -> &NegativeVeryThi + new Transition (5136, 5137), // &nequ -> &nequi + new Transition (5140, 5145), // &nes -> &nesi + new Transition (5177, 5178), // &NewL -> &NewLi + new Transition (5182, 5183), // &nex -> &nexi + new Transition (5215, 5216), // &ngs -> &ngsi + new Transition (5290, 5291), // &nLeftr -> &nLeftri + new Transition (5301, 5302), // &nleftr -> &nleftri + new Transition (5328, 5329), // &nls -> &nlsi + new Transition (5336, 5337), // &nltr -> &nltri + new Transition (5343, 5344), // &nm -> &nmi + new Transition (5359, 5360), // &NonBreak -> &NonBreaki + new Transition (5378, 5512), // ¬ -> ¬i + new Transition (5405, 5406), // &NotDoubleVert -> &NotDoubleVerti + new Transition (5427, 5428), // &NotEqualT -> &NotEqualTi + new Transition (5433, 5434), // &NotEx -> &NotExi + new Transition (5487, 5488), // &NotGreaterT -> &NotGreaterTi + new Transition (5533, 5534), // &NotLeftTr -> &NotLeftTri + new Transition (5584, 5585), // &NotLessT -> &NotLessTi + new Transition (5620, 5621), // ¬n -> ¬ni + new Transition (5656, 5671), // &NotR -> &NotRi + new Transition (5676, 5677), // &NotRightTr -> &NotRightTri + new Transition (5762, 5763), // &NotSucceedsT -> &NotSucceedsTi + new Transition (5781, 5782), // &NotT -> &NotTi + new Transition (5803, 5804), // &NotTildeT -> &NotTildeTi + new Transition (5812, 5813), // &NotVert -> &NotVerti + new Transition (5837, 5838), // &npol -> &npoli + new Transition (5855, 5879), // &nr -> &nri + new Transition (5868, 5869), // &nR -> &nRi + new Transition (5890, 5891), // &nrtr -> &nrtri + new Transition (5895, 5927), // &ns -> &nsi + new Transition (5914, 5915), // &nshortm -> &nshortmi + new Transition (5934, 5935), // &nsm -> &nsmi + new Transition (5988, 5998), // &nt -> &nti + new Transition (5992, 5993), // &Nt -> &Nti + new Transition (6006, 6007), // &ntr -> &ntri + new Transition (6021, 6022), // &ntriangler -> &ntriangleri + new Transition (6043, 6078), // &nv -> &nvi + new Transition (6080, 6081), // &nvinf -> &nvinfi + new Transition (6093, 6094), // &nvltr -> &nvltri + new Transition (6103, 6104), // &nvrtr -> &nvrtri + new Transition (6107, 6108), // &nvs -> &nvsi + new Transition (6138, 6234), // &o -> &oi + new Transition (6148, 6149), // &oc -> &oci + new Transition (6152, 6153), // &Oc -> &Oci + new Transition (6163, 6179), // &od -> &odi + new Transition (6191, 6192), // &OEl -> &OEli + new Transition (6196, 6197), // &oel -> &oeli + new Transition (6201, 6202), // &ofc -> &ofci + new Transition (6238, 6252), // &ol -> &oli + new Transition (6243, 6244), // &olc -> &olci + new Transition (6258, 6276), // &Om -> &Omi + new Transition (6263, 6282), // &om -> &omi + new Transition (6342, 6360), // &or -> &ori + new Transition (6399, 6400), // &Ot -> &Oti + new Transition (6405, 6406), // &ot -> &oti + new Transition (6459, 6460), // &OverParenthes -> &OverParenthesi + new Transition (6463, 6543), // &p -> &pi + new Transition (6474, 6475), // &pars -> &parsi + new Transition (6482, 6541), // &P -> &Pi + new Transition (6485, 6486), // &Part -> &Parti + new Transition (6498, 6503), // &per -> &peri + new Transition (6507, 6508), // &perm -> &permi + new Transition (6524, 6525), // &Ph -> &Phi + new Transition (6527, 6528), // &ph -> &phi + new Transition (6570, 6571), // &plusac -> &plusaci + new Transition (6576, 6577), // &plusc -> &plusci + new Transition (6590, 6591), // &PlusM -> &PlusMi + new Transition (6599, 6600), // &pluss -> &plussi + new Transition (6609, 6610), // &Po -> &Poi + new Transition (6622, 6623), // &po -> &poi + new Transition (6625, 6626), // &point -> &pointi + new Transition (6640, 6725), // &Pr -> &Pri + new Transition (6642, 6729), // &pr -> &pri + new Transition (6696, 6697), // &PrecedesT -> &PrecedesTi + new Transition (6717, 6718), // &precns -> &precnsi + new Transition (6721, 6722), // &precs -> &precsi + new Transition (6741, 6742), // &prns -> &prnsi + new Transition (6760, 6761), // &profl -> &profli + new Transition (6775, 6776), // &Proport -> &Proporti + new Transition (6786, 6787), // &prs -> &prsi + new Transition (6795, 6803), // &Ps -> &Psi + new Transition (6799, 6805), // &ps -> &psi + new Transition (6817, 6821), // &q -> &qi + new Transition (6834, 6835), // &qpr -> &qpri + new Transition (6849, 6858), // &quat -> &quati + new Transition (6852, 6853), // &quatern -> &quaterni + new Transition (6876, 7199), // &r -> &ri + new Transition (6886, 7171), // &R -> &Ri + new Transition (6897, 6898), // &rad -> &radi + new Transition (6956, 6957), // &rarrs -> &rarrsi + new Transition (6969, 6970), // &rAta -> &rAtai + new Transition (6973, 6978), // &rat -> &rati + new Transition (6974, 6975), // &rata -> &ratai + new Transition (7034, 7035), // &Rced -> &Rcedi + new Transition (7038, 7043), // &rce -> &rcei + new Transition (7039, 7040), // &rced -> &rcedi + new Transition (7076, 7078), // &real -> &reali + new Transition (7111, 7112), // &ReverseEqu -> &ReverseEqui + new Transition (7113, 7114), // &ReverseEquil -> &ReverseEquili + new Transition (7116, 7117), // &ReverseEquilibr -> &ReverseEquilibri + new Transition (7125, 7126), // &ReverseUpEqu -> &ReverseUpEqui + new Transition (7127, 7128), // &ReverseUpEquil -> &ReverseUpEquili + new Transition (7130, 7131), // &ReverseUpEquilibr -> &ReverseUpEquilibri + new Transition (7135, 7136), // &rf -> &rfi + new Transition (7224, 7225), // &rightarrowta -> &rightarrowtai + new Transition (7229, 7230), // &RightCe -> &RightCei + new Transition (7231, 7232), // &RightCeil -> &RightCeili + new Transition (7314, 7315), // &rightr -> &rightri + new Transition (7328, 7329), // &rightsqu -> &rightsqui + new Transition (7359, 7360), // &rightthreet -> &rightthreeti + new Transition (7365, 7366), // &RightTr -> &RightTri + new Transition (7431, 7432), // &ris -> &risi + new Transition (7465, 7466), // &rnm -> &rnmi + new Transition (7495, 7496), // &rot -> &roti + new Transition (7507, 7508), // &RoundImpl -> &RoundImpli + new Transition (7521, 7522), // &rppol -> &rppoli + new Transition (7531, 7532), // &Rr -> &Rri + new Transition (7567, 7573), // &rt -> &rti + new Transition (7578, 7579), // &rtr -> &rtri + new Transition (7587, 7588), // &rtriltr -> &rtriltri + new Transition (7610, 7833), // &S -> &Si + new Transition (7617, 7838), // &s -> &si + new Transition (7629, 7662), // &Sc -> &Sci + new Transition (7631, 7666), // &sc -> &sci + new Transition (7654, 7655), // &Sced -> &Scedi + new Transition (7658, 7659), // &sced -> &scedi + new Transition (7676, 7677), // &scns -> &scnsi + new Transition (7682, 7683), // &scpol -> &scpoli + new Transition (7687, 7688), // &scs -> &scsi + new Transition (7721, 7722), // &sem -> &semi + new Transition (7730, 7731), // &setm -> &setmi + new Transition (7799, 7800), // &shortm -> &shortmi + new Transition (7812, 7813), // &ShortR -> &ShortRi + new Transition (7887, 7888), // &SmallC -> &SmallCi + new Transition (7894, 7918), // &sm -> &smi + new Transition (7901, 7902), // &smallsetm -> &smallsetmi + new Transition (7962, 7963), // &spadesu -> &spadesui + new Transition (8027, 8028), // &SquareIntersect -> &SquareIntersecti + new Transition (8059, 8060), // &SquareUn -> &SquareUni + new Transition (8086, 8087), // &ssm -> &ssmi + new Transition (8107, 8108), // &stra -> &strai + new Transition (8114, 8115), // &straighteps -> &straightepsi + new Transition (8121, 8122), // &straightph -> &straightphi + new Transition (8169, 8190), // &subs -> &subsi + new Transition (8240, 8241), // &SucceedsT -> &SucceedsTi + new Transition (8261, 8262), // &succns -> &succnsi + new Transition (8265, 8266), // &succs -> &succsi + new Transition (8352, 8367), // &sups -> &supsi + new Transition (8396, 8397), // &szl -> &szli + new Transition (8400, 8544), // &T -> &Ti + new Transition (8404, 8549), // &t -> &ti + new Transition (8432, 8433), // &Tced -> &Tcedi + new Transition (8437, 8438), // &tced -> &tcedi + new Transition (8461, 8493), // &th -> &thi + new Transition (8467, 8507), // &Th -> &Thi + new Transition (8503, 8504), // &thicks -> &thicksi + new Transition (8531, 8532), // &thks -> &thksi + new Transition (8570, 8571), // &TildeT -> &TildeTi + new Transition (8600, 8601), // &topc -> &topci + new Transition (8618, 8619), // &tpr -> &tpri + new Transition (8628, 8633), // &tr -> &tri + new Transition (8655, 8656), // &triangler -> &triangleri + new Transition (8670, 8671), // &trim -> &trimi + new Transition (8676, 8677), // &Tr -> &Tri + new Transition (8693, 8694), // &trit -> &triti + new Transition (8700, 8701), // &trpez -> &trpezi + new Transition (8737, 8738), // &tw -> &twi + new Transition (8757, 8758), // &twoheadr -> &twoheadri + new Transition (8793, 8794), // &Uarroc -> &Uarroci + new Transition (8815, 8816), // &Uc -> &Uci + new Transition (8820, 8821), // &uc -> &uci + new Transition (8849, 8850), // &uf -> &ufi + new Transition (8901, 8902), // &ultr -> &ultri + new Transition (8916, 8945), // &Un -> &Uni + new Transition (8941, 8942), // &UnderParenthes -> &UnderParenthesi + new Transition (9036, 9037), // &UpEqu -> &UpEqui + new Transition (9038, 9039), // &UpEquil -> &UpEquili + new Transition (9041, 9042), // &UpEquilibr -> &UpEquilibri + new Transition (9058, 9059), // &upharpoonr -> &upharpoonri + new Transition (9081, 9082), // &UpperR -> &UpperRi + new Transition (9092, 9093), // &Ups -> &Upsi + new Transition (9095, 9096), // &ups -> &upsi + new Transition (9127, 9145), // &ur -> &uri + new Transition (9140, 9141), // &Ur -> &Uri + new Transition (9150, 9151), // &urtr -> &urtri + new Transition (9161, 9172), // &ut -> &uti + new Transition (9166, 9167), // &Ut -> &Uti + new Transition (9177, 9178), // &utr -> &utri + new Transition (9211, 9212), // &vareps -> &varepsi + new Transition (9226, 9227), // &varnoth -> &varnothi + new Transition (9231, 9235), // &varp -> &varpi + new Transition (9232, 9233), // &varph -> &varphi + new Transition (9252, 9253), // &vars -> &varsi + new Transition (9285, 9286), // &vartr -> &vartri + new Transition (9297, 9298), // &vartriangler -> &vartriangleri + new Transition (9356, 9357), // &vell -> &velli + new Transition (9370, 9374), // &Vert -> &Verti + new Transition (9382, 9383), // &VerticalL -> &VerticalLi + new Transition (9397, 9398), // &VerticalT -> &VerticalTi + new Transition (9405, 9406), // &VeryTh -> &VeryThi + new Transition (9422, 9423), // &vltr -> &vltri + new Transition (9447, 9448), // &vrtr -> &vrtri + new Transition (9477, 9478), // &vz -> &vzi + new Transition (9485, 9486), // &Wc -> &Wci + new Transition (9491, 9492), // &wc -> &wci + new Transition (9496, 9512), // &we -> &wei + new Transition (9548, 9583), // &x -> &xi + new Transition (9549, 9553), // &xc -> &xci + new Transition (9562, 9563), // &xdtr -> &xdtri + new Transition (9565, 9581), // &X -> &Xi + new Transition (9598, 9599), // &xn -> &xni + new Transition (9618, 9619), // &xot -> &xoti + new Transition (9652, 9653), // &xutr -> &xutri + new Transition (9672, 9712), // &y -> &yi + new Transition (9685, 9686), // &Yc -> &Yci + new Transition (9690, 9691), // &yc -> &yci + new Transition (9754, 9825), // &z -> &zi + new Transition (9794, 9795) // &ZeroW -> &ZeroWi + }; + TransitionTable_j = new Transition[11] { + new Transition (0, 3561), // & -> &j + new Transition (1432, 1665), // &d -> &dj + new Transition (2503, 2587), // &f -> &fj + new Transition (2701, 2820), // &g -> &gj + new Transition (2824, 2830), // &gl -> &glj + new Transition (3243, 3325), // &i -> &ij + new Transition (3624, 3672), // &k -> &kj + new Transition (3692, 4342), // &l -> &lj + new Transition (4965, 5252), // &n -> &nj + new Transition (9848, 9849), // &zw -> &zwj + new Transition (9851, 9852) // &zwn -> &zwnj + }; + TransitionTable_k = new Transition[69] { + new Transition (0, 3624), // & -> &k + new Transition (301, 513), // &b -> &bk + new Transition (303, 304), // &bac -> &back + new Transition (333, 334), // &Bac -> &Back + new Transition (361, 362), // &bbr -> &bbrk + new Transition (366, 367), // &bbrktbr -> &bbrktbrk + new Transition (519, 566), // &bl -> &blk + new Transition (521, 522), // &blac -> &black + new Transition (563, 564), // &blan -> &blank + new Transition (576, 577), // &bloc -> &block + new Transition (965, 966), // &chec -> &check + new Transition (970, 971), // &checkmar -> &checkmark + new Transition (1070, 1071), // &Cloc -> &Clock + new Transition (1234, 1235), // &CounterCloc -> &CounterClock + new Transition (1463, 1464), // &db -> &dbk + new Transition (2024, 2025), // &drb -> &drbk + new Transition (2059, 2060), // &Dstro -> &Dstrok + new Transition (2064, 2065), // &dstro -> &dstrok + new Transition (2621, 2626), // &for -> &fork + new Transition (3017, 3018), // &Hace -> &Hacek + new Transition (3020, 3112), // &h -> &hk + new Transition (3136, 3137), // &hoo -> &hook + new Transition (3199, 3200), // &Hstro -> &Hstrok + new Transition (3204, 3205), // &hstro -> &hstrok + new Transition (3436, 3437), // &intlarh -> &intlarhk + new Transition (3539, 3540), // &Iu -> &Iuk + new Transition (3544, 3545), // &iu -> &iuk + new Transition (3608, 3609), // &Ju -> &Juk + new Transition (3613, 3614), // &ju -> &juk + new Transition (3776, 3777), // &larrh -> &larrhk + new Transition (3818, 3819), // &lbbr -> &lbbrk + new Transition (3821, 3828), // &lbr -> &lbrk + new Transition (3823, 3826), // &lbrac -> &lbrack + new Transition (3909, 3910), // &LeftAngleBrac -> &LeftAngleBrack + new Transition (3970, 3971), // &LeftDoubleBrac -> &LeftDoubleBrack + new Transition (4335, 4336), // &lhbl -> &lhblk + new Transition (4431, 4432), // &lobr -> &lobrk + new Transition (4686, 4687), // &Lstro -> &Lstrok + new Transition (4691, 4692), // &lstro -> &lstrok + new Transition (4804, 4805), // &mar -> &mark + new Transition (5068, 5069), // &nearh -> &nearhk + new Transition (5106, 5107), // &NegativeThic -> &NegativeThick + new Transition (5351, 5352), // &NoBrea -> &NoBreak + new Transition (5358, 5359), // &NonBrea -> &NonBreak + new Transition (6114, 6115), // &nwarh -> &nwarhk + new Transition (6444, 6447), // &OverBrac -> &OverBrack + new Transition (6515, 6516), // &perten -> &pertenk + new Transition (6550, 6551), // &pitchfor -> &pitchfork + new Transition (6557, 6563), // &plan -> &plank + new Transition (6558, 6559), // &planc -> &planck + new Transition (6947, 6948), // &rarrh -> &rarrhk + new Transition (7002, 7003), // &rbbr -> &rbbrk + new Transition (7005, 7012), // &rbr -> &rbrk + new Transition (7007, 7010), // &rbrac -> &rbrack + new Transition (7183, 7184), // &RightAngleBrac -> &RightAngleBrack + new Transition (7245, 7246), // &RightDoubleBrac -> &RightDoubleBrack + new Transition (7478, 7479), // &robr -> &robrk + new Transition (7706, 7707), // &searh -> &searhk + new Transition (8378, 8379), // &swarh -> &swarhk + new Transition (8416, 8417), // &tbr -> &tbrk + new Transition (8461, 8527), // &th -> &thk + new Transition (8494, 8495), // &thic -> &thick + new Transition (8508, 8509), // &Thic -> &Thick + new Transition (8611, 8612), // &topfor -> &topfork + new Transition (8729, 8730), // &Tstro -> &Tstrok + new Transition (8734, 8735), // &tstro -> &tstrok + new Transition (8884, 8885), // &uhbl -> &uhblk + new Transition (8926, 8929), // &UnderBrac -> &UnderBrack + new Transition (9208, 9217) // &var -> &vark + }; + TransitionTable_l = new Transition[438] { + new Transition (0, 3692), // & -> &l + new Transition (1, 89), // &A -> &Al + new Transition (8, 79), // &a -> &al + new Transition (50, 51), // &AE -> &AEl + new Transition (55, 56), // &ae -> &ael + new Transition (104, 108), // &ama -> &amal + new Transition (128, 129), // &ands -> &andsl + new Transition (136, 140), // &ang -> &angl + new Transition (217, 218), // &App -> &Appl + new Transition (270, 271), // &Ati -> &Atil + new Transition (276, 277), // &ati -> &atil + new Transition (282, 283), // &Aum -> Ä + new Transition (286, 287), // &aum -> ä + new Transition (301, 519), // &b -> &bl + new Transition (313, 314), // &backepsi -> &backepsil + new Transition (335, 336), // &Backs -> &Backsl + new Transition (417, 418), // &Bernou -> &Bernoul + new Transition (418, 419), // &Bernoul -> &Bernoull + new Transition (460, 461), // &bigop -> &bigopl + new Transition (486, 487), // &bigtriang -> &bigtriangl + new Transition (498, 499), // &bigup -> &bigupl + new Transition (522, 523), // &black -> &blackl + new Transition (543, 544), // &blacktriang -> &blacktriangl + new Transition (545, 552), // &blacktriangle -> &blacktrianglel + new Transition (618, 621), // &boxD -> &boxDl + new Transition (623, 626), // &boxd -> &boxdl + new Transition (662, 663), // &boxp -> &boxpl + new Transition (673, 676), // &boxU -> &boxUl + new Transition (678, 681), // &boxu -> &boxul + new Transition (691, 705), // &boxV -> &boxVl + new Transition (693, 709), // &boxv -> &boxvl + new Transition (757, 758), // &bso -> &bsol + new Transition (767, 768), // &bu -> &bul + new Transition (768, 769), // &bul -> &bull + new Transition (789, 1068), // &C -> &Cl + new Transition (796, 1117), // &c -> &cl + new Transition (830, 831), // &Capita -> &Capital + new Transition (842, 843), // &CapitalDifferentia -> &CapitalDifferential + new Transition (855, 856), // &Cay -> &Cayl + new Transition (878, 879), // &Ccedi -> Ç + new Transition (883, 884), // &ccedi -> ç + new Transition (917, 918), // &cedi -> ¸ + new Transition (922, 923), // &Cedi -> &Cedil + new Transition (923, 924), // &Cedil -> &Cedill + new Transition (981, 986), // &circ -> &circl + new Transition (992, 993), // &circlearrow -> &circlearrowl + new Transition (1021, 1022), // &Circ -> &Circl + new Transition (1038, 1039), // &CircleP -> &CirclePl + new Transition (1089, 1090), // &ClockwiseContourIntegra -> &ClockwiseContourIntegral + new Transition (1096, 1097), // &CloseCur -> &CloseCurl + new Transition (1102, 1103), // &CloseCurlyDoub -> &CloseCurlyDoubl + new Transition (1126, 1127), // &Co -> &Col + new Transition (1131, 1132), // &co -> &col + new Transition (1148, 1153), // &comp -> &compl + new Transition (1197, 1198), // &ContourIntegra -> &ContourIntegral + new Transition (1231, 1232), // &CounterC -> &CounterCl + new Transition (1253, 1254), // &CounterClockwiseContourIntegra -> &CounterClockwiseContourIntegral + new Transition (1292, 1308), // &cu -> &cul + new Transition (1296, 1297), // &cudarr -> &cudarrl + new Transition (1346, 1353), // &cur -> &curl + new Transition (1387, 1388), // &curvearrow -> &curvearrowl + new Transition (1419, 1420), // &cy -> &cyl + new Transition (1432, 1669), // &d -> &dl + new Transition (1433, 1439), // &da -> &dal + new Transition (1463, 1470), // &db -> &dbl + new Transition (1516, 1525), // &de -> &del + new Transition (1519, 1520), // &De -> &Del + new Transition (1552, 1553), // &dhar -> &dharl + new Transition (1565, 1566), // &Diacritica -> &Diacritical + new Transition (1578, 1579), // &DiacriticalDoub -> &DiacriticalDoubl + new Transition (1594, 1595), // &DiacriticalTi -> &DiacriticalTil + new Transition (1629, 1630), // &Differentia -> &Differential + new Transition (1679, 1680), // &do -> &dol + new Transition (1680, 1681), // &dol -> &doll + new Transition (1710, 1711), // &DotEqua -> &DotEqual + new Transition (1719, 1720), // &dotp -> &dotpl + new Transition (1732, 1733), // &doub -> &doubl + new Transition (1745, 1746), // &Doub -> &Doubl + new Transition (1761, 1762), // &DoubleContourIntegra -> &DoubleContourIntegral + new Transition (1875, 1876), // &DoubleVertica -> &DoubleVertical + new Transition (1938, 1939), // &downharpoon -> &downharpoonl + new Transition (2054, 2055), // &dso -> &dsol + new Transition (2089, 2090), // &dwang -> &dwangl + new Transition (2108, 2206), // &E -> &El + new Transition (2115, 2204), // &e -> &el + new Transition (2148, 2149), // &eco -> &ecol + new Transition (2204, 2220), // &el -> &ell + new Transition (2251, 2252), // &EmptySma -> &EmptySmal + new Transition (2252, 2253), // &EmptySmal -> &EmptySmall + new Transition (2269, 2270), // &EmptyVerySma -> &EmptyVerySmal + new Transition (2270, 2271), // &EmptyVerySmal -> &EmptyVerySmall + new Transition (2312, 2319), // &ep -> &epl + new Transition (2316, 2317), // &epars -> &eparsl + new Transition (2324, 2333), // &epsi -> &epsil + new Transition (2328, 2329), // &Epsi -> &Epsil + new Transition (2345, 2346), // &eqco -> &eqcol + new Transition (2350, 2354), // &eqs -> &eqsl + new Transition (2357, 2362), // &eqslant -> &eqslantl + new Transition (2369, 2370), // &Equa -> &Equal + new Transition (2373, 2374), // &equa -> &equal + new Transition (2378, 2379), // &EqualTi -> &EqualTil + new Transition (2387, 2388), // &Equi -> &Equil + new Transition (2406, 2407), // &eqvpars -> &eqvparsl + new Transition (2448, 2449), // &Eum -> Ë + new Transition (2452, 2453), // &eum -> ë + new Transition (2459, 2460), // &exc -> &excl + new Transition (2489, 2490), // &Exponentia -> &Exponential + new Transition (2499, 2500), // &exponentia -> &exponential + new Transition (2503, 2592), // &f -> &fl + new Transition (2504, 2505), // &fa -> &fal + new Transition (2505, 2506), // &fal -> &fall + new Transition (2526, 2527), // &fema -> &femal + new Transition (2530, 2536), // &ff -> &ffl + new Transition (2531, 2532), // &ffi -> &ffil + new Transition (2536, 2540), // &ffl -> &ffll + new Transition (2549, 2550), // &fi -> &fil + new Transition (2554, 2555), // &Fi -> &Fil + new Transition (2555, 2556), // &Fil -> &Fill + new Transition (2561, 2562), // &FilledSma -> &FilledSmal + new Transition (2562, 2563), // &FilledSmal -> &FilledSmall + new Transition (2577, 2578), // &FilledVerySma -> &FilledVerySmal + new Transition (2578, 2579), // &FilledVerySmal -> &FilledVerySmall + new Transition (2587, 2588), // &fj -> &fjl + new Transition (2592, 2596), // &fl -> &fll + new Transition (2617, 2618), // &ForA -> &ForAl + new Transition (2618, 2619), // &ForAl -> &ForAll + new Transition (2622, 2623), // &fora -> &foral + new Transition (2623, 2624), // &foral -> &forall + new Transition (2686, 2687), // &fras -> &frasl + new Transition (2701, 2824), // &g -> &gl + new Transition (2739, 2740), // &Gcedi -> &Gcedil + new Transition (2763, 2767), // &gE -> &gEl + new Transition (2765, 2769), // &ge -> &gel + new Transition (2775, 2776), // &geqs -> &geqsl + new Transition (2781, 2794), // &ges -> &gesl + new Transition (2790, 2792), // &gesdoto -> &gesdotol + new Transition (2813, 2814), // &gime -> &gimel + new Transition (2875, 2876), // &GreaterEqua -> &GreaterEqual + new Transition (2884, 2885), // &GreaterFu -> &GreaterFul + new Transition (2885, 2886), // &GreaterFul -> &GreaterFull + new Transition (2890, 2891), // &GreaterFullEqua -> &GreaterFullEqual + new Transition (2906, 2907), // &GreaterS -> &GreaterSl + new Transition (2914, 2915), // &GreaterSlantEqua -> &GreaterSlantEqual + new Transition (2918, 2919), // &GreaterTi -> &GreaterTil + new Transition (2932, 2936), // &gsim -> &gsiml + new Transition (2942, 2954), // > -> >l + new Transition (2965, 2993), // >r -> >rl + new Transition (2981, 2982), // >req -> >reql + new Transition (2987, 2988), // >reqq -> >reqql + new Transition (3021, 3027), // &ha -> &hal + new Transition (3031, 3032), // &hami -> &hamil + new Transition (3074, 3084), // &he -> &hel + new Transition (3084, 3085), // &hel -> &hell + new Transition (3100, 3101), // &Hi -> &Hil + new Transition (3137, 3138), // &hook -> &hookl + new Transition (3177, 3178), // &Horizonta -> &Horizontal + new Transition (3188, 3192), // &hs -> &hsl + new Transition (3222, 3223), // &HumpEqua -> &HumpEqual + new Transition (3227, 3228), // &hybu -> &hybul + new Transition (3228, 3229), // &hybul -> &hybull + new Transition (3278, 3279), // &iexc -> ¡ + new Transition (3320, 3321), // &IJ -> &IJl + new Transition (3325, 3326), // &ij -> &ijl + new Transition (3341, 3352), // &imag -> &imagl + new Transition (3372, 3373), // &Imp -> &Impl + new Transition (3401, 3433), // &int -> &intl + new Transition (3404, 3405), // &intca -> &intcal + new Transition (3416, 3417), // &Integra -> &Integral + new Transition (3421, 3422), // &interca -> &intercal + new Transition (3448, 3449), // &Invisib -> &Invisibl + new Transition (3529, 3530), // &Iti -> &Itil + new Transition (3534, 3535), // &iti -> &itil + new Transition (3549, 3550), // &Ium -> Ï + new Transition (3552, 3553), // &ium -> ï + new Transition (3635, 3636), // &Kcedi -> &Kcedil + new Transition (3641, 3642), // &kcedi -> &kcedil + new Transition (3692, 4348), // &l -> &ll + new Transition (3698, 4346), // &L -> &Ll + new Transition (3737, 3741), // &lang -> &langl + new Transition (3746, 3747), // &Lap -> &Lapl + new Transition (3766, 3779), // &larr -> &larrl + new Transition (3782, 3783), // &larrp -> &larrpl + new Transition (3789, 3790), // &larrt -> &larrtl + new Transition (3796, 3797), // &lAtai -> &lAtail + new Transition (3800, 3801), // &latai -> &latail + new Transition (3831, 3832), // &lbrks -> &lbrksl + new Transition (3851, 3852), // &Lcedi -> &Lcedil + new Transition (3856, 3857), // &lcedi -> &lcedil + new Transition (3859, 3860), // &lcei -> &lceil + new Transition (3903, 3904), // &LeftAng -> &LeftAngl + new Transition (3926, 4019), // &left -> &leftl + new Transition (3950, 3951), // &leftarrowtai -> &leftarrowtail + new Transition (3955, 3956), // &LeftCei -> &LeftCeil + new Transition (3964, 3965), // &LeftDoub -> &LeftDoubl + new Transition (3998, 3999), // &LeftF -> &LeftFl + new Transition (4124, 4125), // &LeftTriang -> &LeftTriangl + new Transition (4135, 4136), // &LeftTriangleEqua -> &LeftTriangleEqual + new Transition (4191, 4192), // &leqs -> &leqsl + new Transition (4243, 4244), // &LessEqua -> &LessEqual + new Transition (4254, 4255), // &LessFu -> &LessFul + new Transition (4255, 4256), // &LessFul -> &LessFull + new Transition (4260, 4261), // &LessFullEqua -> &LessFullEqual + new Transition (4284, 4285), // &LessS -> &LessSl + new Transition (4292, 4293), // &LessSlantEqua -> &LessSlantEqual + new Transition (4296, 4297), // &LessTi -> &LessTil + new Transition (4301, 4307), // &lf -> &lfl + new Transition (4330, 4332), // &lharu -> &lharul + new Transition (4334, 4335), // &lhb -> &lhbl + new Transition (4436, 4447), // &Long -> &Longl + new Transition (4458, 4459), // &long -> &longl + new Transition (4548, 4549), // &looparrow -> &looparrowl + new Transition (4560, 4569), // &lop -> &lopl + new Transition (4623, 4625), // &lpar -> &lparl + new Transition (4698, 4720), // < -> <l + new Transition (4767, 4909), // &m -> &ml + new Transition (4768, 4772), // &ma -> &mal + new Transition (4789, 4796), // &mapsto -> &mapstol + new Transition (4839, 4840), // &measuredang -> &measuredangl + new Transition (4843, 4854), // &Me -> &Mel + new Transition (4854, 4855), // &Mel -> &Mell + new Transition (4904, 4905), // &MinusP -> &MinusPl + new Transition (4917, 4918), // &mnp -> &mnpl + new Transition (4924, 4925), // &mode -> &model + new Transition (4952, 4954), // &mu -> &mul + new Transition (4965, 5256), // &n -> &nl + new Transition (4967, 4968), // &nab -> &nabl + new Transition (5005, 5006), // &natura -> &natural + new Transition (5036, 5037), // &Ncedi -> &Ncedil + new Transition (5041, 5042), // &ncedi -> &ncedil + new Transition (5204, 5205), // &ngeqs -> &ngeqsl + new Transition (5272, 5326), // &nL -> &nLl + new Transition (5316, 5317), // &nleqs -> &nleqsl + new Transition (5399, 5400), // &NotDoub -> &NotDoubl + new Transition (5408, 5409), // &NotDoubleVertica -> &NotDoubleVertical + new Transition (5414, 5415), // &NotE -> &NotEl + new Transition (5424, 5425), // &NotEqua -> &NotEqual + new Transition (5428, 5429), // &NotEqualTi -> &NotEqualTil + new Transition (5450, 5451), // &NotGreaterEqua -> &NotGreaterEqual + new Transition (5454, 5455), // &NotGreaterFu -> &NotGreaterFul + new Transition (5455, 5456), // &NotGreaterFul -> &NotGreaterFull + new Transition (5460, 5461), // &NotGreaterFullEqua -> &NotGreaterFullEqual + new Transition (5476, 5477), // &NotGreaterS -> &NotGreaterSl + new Transition (5484, 5485), // &NotGreaterSlantEqua -> &NotGreaterSlantEqual + new Transition (5488, 5489), // &NotGreaterTi -> &NotGreaterTil + new Transition (5509, 5510), // &NotHumpEqua -> &NotHumpEqual + new Transition (5537, 5538), // &NotLeftTriang -> &NotLeftTriangl + new Transition (5548, 5549), // &NotLeftTriangleEqua -> &NotLeftTriangleEqual + new Transition (5557, 5558), // &NotLessEqua -> &NotLessEqual + new Transition (5573, 5574), // &NotLessS -> &NotLessSl + new Transition (5581, 5582), // &NotLessSlantEqua -> &NotLessSlantEqual + new Transition (5585, 5586), // &NotLessTi -> &NotLessTil + new Transition (5642, 5643), // &NotPrecedesEqua -> &NotPrecedesEqual + new Transition (5645, 5646), // &NotPrecedesS -> &NotPrecedesSl + new Transition (5653, 5654), // &NotPrecedesSlantEqua -> &NotPrecedesSlantEqual + new Transition (5663, 5664), // &NotReverseE -> &NotReverseEl + new Transition (5680, 5681), // &NotRightTriang -> &NotRightTriangl + new Transition (5691, 5692), // &NotRightTriangleEqua -> &NotRightTriangleEqual + new Transition (5710, 5711), // &NotSquareSubsetEqua -> &NotSquareSubsetEqual + new Transition (5723, 5724), // &NotSquareSupersetEqua -> &NotSquareSupersetEqual + new Transition (5735, 5736), // &NotSubsetEqua -> &NotSubsetEqual + new Transition (5748, 5749), // &NotSucceedsEqua -> &NotSucceedsEqual + new Transition (5751, 5752), // &NotSucceedsS -> &NotSucceedsSl + new Transition (5759, 5760), // &NotSucceedsSlantEqua -> &NotSucceedsSlantEqual + new Transition (5763, 5764), // &NotSucceedsTi -> &NotSucceedsTil + new Transition (5778, 5779), // &NotSupersetEqua -> &NotSupersetEqual + new Transition (5782, 5783), // &NotTi -> &NotTil + new Transition (5790, 5791), // &NotTildeEqua -> &NotTildeEqual + new Transition (5794, 5795), // &NotTildeFu -> &NotTildeFul + new Transition (5795, 5796), // &NotTildeFul -> &NotTildeFull + new Transition (5800, 5801), // &NotTildeFullEqua -> &NotTildeFullEqual + new Transition (5804, 5805), // &NotTildeTi -> &NotTildeTil + new Transition (5815, 5816), // &NotVertica -> &NotVertical + new Transition (5825, 5826), // &npara -> &nparal + new Transition (5826, 5827), // &nparal -> &nparall + new Transition (5828, 5829), // &nparalle -> &nparallel + new Transition (5831, 5832), // &npars -> &nparsl + new Transition (5836, 5837), // &npo -> &npol + new Transition (5921, 5922), // &nshortpara -> &nshortparal + new Transition (5922, 5923), // &nshortparal -> &nshortparall + new Transition (5924, 5925), // &nshortparalle -> &nshortparallel + new Transition (5988, 6003), // &nt -> &ntl + new Transition (5989, 5990), // &ntg -> &ntgl + new Transition (5993, 5994), // &Nti -> &Ntil + new Transition (5998, 5999), // &nti -> &ntil + new Transition (6010, 6011), // &ntriang -> &ntriangl + new Transition (6012, 6013), // &ntriangle -> &ntrianglel + new Transition (6043, 6084), // &nv -> &nvl + new Transition (6138, 6238), // &o -> &ol + new Transition (6169, 6170), // &Odb -> &Odbl + new Transition (6174, 6175), // &odb -> &odbl + new Transition (6186, 6187), // &odso -> &odsol + new Transition (6190, 6191), // &OE -> &OEl + new Transition (6195, 6196), // &oe -> &oel + new Transition (6302, 6336), // &op -> &opl + new Transition (6311, 6312), // &OpenCur -> &OpenCurl + new Transition (6317, 6318), // &OpenCurlyDoub -> &OpenCurlyDoubl + new Transition (6368, 6369), // &ors -> &orsl + new Transition (6378, 6386), // &Os -> &Osl + new Transition (6382, 6391), // &os -> &osl + new Transition (6396, 6397), // &oso -> &osol + new Transition (6400, 6401), // &Oti -> &Otil + new Transition (6406, 6407), // &oti -> &otil + new Transition (6423, 6424), // &Oum -> Ö + new Transition (6427, 6428), // &oum -> ö + new Transition (6463, 6555), // &p -> &pl + new Transition (6467, 6469), // ¶ -> ¶l + new Transition (6469, 6470), // ¶l -> ¶ll + new Transition (6471, 6472), // ¶lle -> ¶llel + new Transition (6474, 6478), // &pars -> &parsl + new Transition (6482, 6587), // &P -> &Pl + new Transition (6487, 6488), // &Partia -> &Partial + new Transition (6508, 6509), // &permi -> &permil + new Transition (6616, 6617), // &Poincarep -> &Poincarepl + new Transition (6666, 6667), // &preccur -> &preccurl + new Transition (6682, 6683), // &PrecedesEqua -> &PrecedesEqual + new Transition (6685, 6686), // &PrecedesS -> &PrecedesSl + new Transition (6693, 6694), // &PrecedesSlantEqua -> &PrecedesSlantEqual + new Transition (6697, 6698), // &PrecedesTi -> &PrecedesTil + new Transition (6754, 6760), // &prof -> &profl + new Transition (6755, 6756), // &profa -> &profal + new Transition (6780, 6781), // &Proportiona -> &Proportional + new Transition (6792, 6793), // &prure -> &prurel + new Transition (6876, 7442), // &r -> &rl + new Transition (6912, 6918), // &rang -> &rangl + new Transition (6932, 6950), // &rarr -> &rarrl + new Transition (6953, 6954), // &rarrp -> &rarrpl + new Transition (6960, 6961), // &Rarrt -> &Rarrtl + new Transition (6963, 6964), // &rarrt -> &rarrtl + new Transition (6970, 6971), // &rAtai -> &rAtail + new Transition (6975, 6976), // &ratai -> &ratail + new Transition (6982, 6983), // &rationa -> &rational + new Transition (7015, 7016), // &rbrks -> &rbrksl + new Transition (7035, 7036), // &Rcedi -> &Rcedil + new Transition (7040, 7041), // &rcedi -> &rcedil + new Transition (7043, 7044), // &rcei -> &rceil + new Transition (7053, 7057), // &rd -> &rdl + new Transition (7075, 7076), // &rea -> &real + new Transition (7102, 7103), // &ReverseE -> &ReverseEl + new Transition (7112, 7113), // &ReverseEqui -> &ReverseEquil + new Transition (7126, 7127), // &ReverseUpEqui -> &ReverseUpEquil + new Transition (7135, 7141), // &rf -> &rfl + new Transition (7160, 7162), // &rharu -> &rharul + new Transition (7177, 7178), // &RightAng -> &RightAngl + new Transition (7202, 7294), // &right -> &rightl + new Transition (7225, 7226), // &rightarrowtai -> &rightarrowtail + new Transition (7230, 7231), // &RightCei -> &RightCeil + new Transition (7239, 7240), // &RightDoub -> &RightDoubl + new Transition (7273, 7274), // &RightF -> &RightFl + new Transition (7369, 7370), // &RightTriang -> &RightTriangl + new Transition (7380, 7381), // &RightTriangleEqua -> &RightTriangleEqual + new Transition (7481, 7491), // &rop -> &ropl + new Transition (7506, 7507), // &RoundImp -> &RoundImpl + new Transition (7520, 7521), // &rppo -> &rppol + new Transition (7579, 7585), // &rtri -> &rtril + new Transition (7590, 7591), // &Ru -> &Rul + new Transition (7594, 7595), // &RuleDe -> &RuleDel + new Transition (7601, 7602), // &ru -> &rul + new Transition (7617, 7878), // &s -> &sl + new Transition (7655, 7656), // &Scedi -> &Scedil + new Transition (7659, 7660), // &scedi -> &scedil + new Transition (7681, 7682), // &scpo -> &scpol + new Transition (7806, 7807), // &shortpara -> &shortparal + new Transition (7807, 7808), // &shortparal -> &shortparall + new Transition (7809, 7810), // &shortparalle -> &shortparallel + new Transition (7847, 7861), // &sim -> &siml + new Transition (7868, 7869), // &simp -> &simpl + new Transition (7884, 7885), // &Sma -> &Smal + new Transition (7885, 7886), // &Smal -> &Small + new Transition (7890, 7891), // &SmallCirc -> &SmallCircl + new Transition (7895, 7896), // &sma -> &smal + new Transition (7896, 7897), // &smal -> &small + new Transition (7915, 7916), // &smepars -> &smeparsl + new Transition (7918, 7921), // &smi -> &smil + new Transition (7936, 7942), // &so -> &sol + new Transition (8042, 8043), // &SquareSubsetEqua -> &SquareSubsetEqual + new Transition (8055, 8056), // &SquareSupersetEqua -> &SquareSupersetEqual + new Transition (8087, 8088), // &ssmi -> &ssmil + new Transition (8115, 8116), // &straightepsi -> &straightepsil + new Transition (8146, 8147), // &submu -> &submul + new Transition (8155, 8156), // &subp -> &subpl + new Transition (8181, 8182), // &SubsetEqua -> &SubsetEqual + new Transition (8210, 8211), // &succcur -> &succcurl + new Transition (8226, 8227), // &SucceedsEqua -> &SucceedsEqual + new Transition (8229, 8230), // &SucceedsS -> &SucceedsSl + new Transition (8237, 8238), // &SucceedsSlantEqua -> &SucceedsSlantEqual + new Transition (8241, 8242), // &SucceedsTi -> &SucceedsTil + new Transition (8284, 8328), // &sup -> &supl + new Transition (8317, 8318), // &SupersetEqua -> &SupersetEqual + new Transition (8322, 8323), // &suphso -> &suphsol + new Transition (8334, 8335), // &supmu -> &supmul + new Transition (8343, 8344), // &supp -> &suppl + new Transition (8395, 8396), // &sz -> &szl + new Transition (8433, 8434), // &Tcedi -> &Tcedil + new Transition (8438, 8439), // &tcedi -> &tcedil + new Transition (8449, 8450), // &te -> &tel + new Transition (8544, 8545), // &Ti -> &Til + new Transition (8549, 8550), // &ti -> &til + new Transition (8557, 8558), // &TildeEqua -> &TildeEqual + new Transition (8561, 8562), // &TildeFu -> &TildeFul + new Transition (8562, 8563), // &TildeFul -> &TildeFull + new Transition (8567, 8568), // &TildeFullEqua -> &TildeFullEqual + new Transition (8571, 8572), // &TildeTi -> &TildeTil + new Transition (8636, 8637), // &triang -> &triangl + new Transition (8638, 8645), // &triangle -> &trianglel + new Transition (8678, 8679), // &Trip -> &Tripl + new Transition (8685, 8686), // &trip -> &tripl + new Transition (8746, 8747), // &twohead -> &twoheadl + new Transition (8775, 8887), // &u -> &ul + new Transition (8835, 8836), // &Udb -> &Udbl + new Transition (8840, 8841), // &udb -> &udbl + new Transition (8878, 8879), // &uhar -> &uharl + new Transition (8883, 8884), // &uhb -> &uhbl + new Transition (8909, 8914), // &um -> ¨ + new Transition (8949, 8950), // &UnionP -> &UnionPl + new Transition (8983, 9064), // &up -> &upl + new Transition (9037, 9038), // &UpEqui -> &UpEquil + new Transition (9052, 9053), // &upharpoon -> &upharpoonl + new Transition (9093, 9100), // &Upsi -> &Upsil + new Transition (9096, 9104), // &upsi -> &upsil + new Transition (9167, 9168), // &Uti -> &Util + new Transition (9172, 9173), // &uti -> &util + new Transition (9188, 9189), // &Uum -> Ü + new Transition (9191, 9192), // &uum -> ü + new Transition (9197, 9198), // &uwang -> &uwangl + new Transition (9201, 9420), // &v -> &vl + new Transition (9212, 9213), // &varepsi -> &varepsil + new Transition (9289, 9290), // &vartriang -> &vartriangl + new Transition (9291, 9292), // &vartriangle -> &vartrianglel + new Transition (9328, 9340), // &Vdash -> &Vdashl + new Transition (9345, 9355), // &ve -> &vel + new Transition (9355, 9356), // &vel -> &vell + new Transition (9376, 9377), // &Vertica -> &Vertical + new Transition (9398, 9399), // &VerticalTi -> &VerticalTil + new Transition (9548, 9585), // &x -> &xl + new Transition (9611, 9614), // &xop -> &xopl + new Transition (9646, 9647), // &xup -> &xupl + new Transition (9741, 9742), // &Yum -> &Yuml + new Transition (9744, 9745) // &yum -> ÿ + }; + TransitionTable_m = new Transition[177] { + new Transition (0, 4767), // & -> &m + new Transition (1, 98), // &A -> &Am + new Transition (8, 103), // &a -> &am + new Transition (83, 84), // &alefsy -> &alefsym + new Transition (136, 143), // &ang -> &angm + new Transition (262, 263), // &asy -> &asym + new Transition (281, 282), // &Au -> &Aum + new Transition (285, 286), // &au -> &aum + new Transition (320, 321), // &backpri -> &backprim + new Transition (325, 326), // &backsi -> &backsim + new Transition (384, 399), // &be -> &bem + new Transition (466, 467), // &bigoti -> &bigotim + new Transition (605, 606), // &botto -> &bottom + new Transition (613, 656), // &box -> &boxm + new Transition (668, 669), // &boxti -> &boxtim + new Transition (721, 722), // &bpri -> &bprim + new Transition (748, 749), // &bse -> &bsem + new Transition (752, 753), // &bsi -> &bsim + new Transition (767, 774), // &bu -> &bum + new Transition (781, 782), // &Bu -> &Bum + new Transition (904, 905), // &ccupss -> &ccupssm + new Transition (915, 927), // &ce -> &cem + new Transition (966, 968), // &check -> &checkm + new Transition (979, 1059), // &cir -> &cirm + new Transition (1044, 1045), // &CircleTi -> &CircleTim + new Transition (1131, 1142), // &co -> &com + new Transition (1142, 1143), // &com -> &comm + new Transition (1154, 1155), // &comple -> &complem + new Transition (1349, 1351), // &curarr -> &curarrm + new Transition (1516, 1529), // &de -> &dem + new Transition (1558, 1603), // &Dia -> &Diam + new Transition (1600, 1601), // &dia -> &diam + new Transition (1634, 1635), // &diga -> &digam + new Transition (1635, 1636), // &digam -> &digamm + new Transition (1652, 1653), // ÷onti -> ÷ontim + new Transition (1694, 1713), // &dot -> &dotm + new Transition (2108, 2228), // &E -> &Em + new Transition (2115, 2233), // &e -> &em + new Transition (2207, 2208), // &Ele -> &Elem + new Transition (2249, 2250), // &EmptyS -> &EmptySm + new Transition (2267, 2268), // &EmptyVeryS -> &EmptyVerySm + new Transition (2351, 2352), // &eqsi -> &eqsim + new Transition (2393, 2394), // &Equilibriu -> &Equilibrium + new Transition (2430, 2431), // &Esi -> &Esim + new Transition (2433, 2434), // &esi -> &esim + new Transition (2447, 2448), // &Eu -> &Eum + new Transition (2451, 2452), // &eu -> &eum + new Transition (2524, 2525), // &fe -> &fem + new Transition (2559, 2560), // &FilledS -> &FilledSm + new Transition (2575, 2576), // &FilledVeryS -> &FilledVerySm + new Transition (2702, 2714), // &ga -> &gam + new Transition (2709, 2710), // &Ga -> &Gam + new Transition (2710, 2711), // &Gam -> &Gamm + new Transition (2714, 2715), // &gam -> &gamm + new Transition (2811, 2812), // &gi -> &gim + new Transition (2850, 2851), // &gnsi -> &gnsim + new Transition (2931, 2932), // &gsi -> &gsim + new Transition (2999, 3000), // >rsi -> >rsim + new Transition (3021, 3030), // &ha -> &ham + new Transition (3126, 3131), // &ho -> &hom + new Transition (3207, 3208), // &Hu -> &Hum + new Transition (3215, 3216), // &HumpDownHu -> &HumpDownHum + new Transition (3236, 3330), // &I -> &Im + new Transition (3243, 3336), // &i -> &im + new Transition (3452, 3453), // &InvisibleCo -> &InvisibleCom + new Transition (3453, 3454), // &InvisibleCom -> &InvisibleComm + new Transition (3458, 3459), // &InvisibleTi -> &InvisibleTim + new Transition (3539, 3549), // &Iu -> &Ium + new Transition (3544, 3552), // &iu -> &ium + new Transition (3561, 3577), // &j -> &jm + new Transition (3692, 4385), // &l -> &lm + new Transition (3698, 4379), // &L -> &Lm + new Transition (3699, 3723), // &La -> &Lam + new Transition (3705, 3728), // &la -> &lam + new Transition (3711, 3712), // &lae -> &laem + new Transition (3786, 3787), // &larrsi -> &larrsim + new Transition (4115, 4116), // &leftthreeti -> &leftthreetim + new Transition (4281, 4282), // &lesssi -> &lesssim + new Transition (4419, 4420), // &lnsi -> &lnsim + new Transition (4458, 4502), // &long -> &longm + new Transition (4574, 4575), // &loti -> &lotim + new Transition (4628, 4646), // &lr -> &lrm + new Transition (4669, 4670), // &lsi -> &lsim + new Transition (4715, 4716), // <i -> <im + new Transition (4810, 4811), // &mco -> &mcom + new Transition (4811, 4812), // &mcom -> &mcomm + new Transition (4846, 4847), // &Mediu -> &Medium + new Transition (4952, 4961), // &mu -> &mum + new Transition (4956, 4957), // &multi -> &multim + new Transition (4965, 5343), // &n -> &nm + new Transition (5014, 5015), // &nbu -> &nbum + new Transition (5095, 5096), // &NegativeMediu -> &NegativeMedium + new Transition (5145, 5146), // &nesi -> &nesim + new Transition (5216, 5217), // &ngsi -> &ngsim + new Transition (5329, 5330), // &nlsi -> &nlsim + new Transition (5416, 5417), // &NotEle -> &NotElem + new Transition (5494, 5495), // &NotHu -> &NotHum + new Transition (5502, 5503), // &NotHumpDownHu -> &NotHumpDownHum + new Transition (5665, 5666), // &NotReverseEle -> &NotReverseElem + new Transition (5895, 5934), // &ns -> &nsm + new Transition (5913, 5914), // &nshort -> &nshortm + new Transition (5927, 5928), // &nsi -> &nsim + new Transition (6032, 6034), // &nu -> &num + new Transition (6108, 6109), // &nvsi -> &nvsim + new Transition (6131, 6258), // &O -> &Om + new Transition (6138, 6263), // &o -> &om + new Transition (6227, 6232), // &oh -> &ohm + new Transition (6348, 6358), // &ord -> º + new Transition (6400, 6411), // &Oti -> &Otim + new Transition (6406, 6415), // &oti -> &otim + new Transition (6422, 6423), // &Ou -> &Oum + new Transition (6426, 6427), // &ou -> &oum + new Transition (6463, 6607), // &p -> &pm + new Transition (6475, 6476), // &parsi -> &parsim + new Transition (6498, 6507), // &per -> &perm + new Transition (6527, 6532), // &ph -> &phm + new Transition (6532, 6533), // &phm -> &phmm + new Transition (6567, 6596), // &plus -> &plusm + new Transition (6600, 6601), // &plussi -> &plussim + new Transition (6718, 6719), // &precnsi -> &precnsim + new Transition (6722, 6723), // &precsi -> &precsim + new Transition (6725, 6726), // &Pri -> &Prim + new Transition (6729, 6730), // &pri -> &prim + new Transition (6742, 6743), // &prnsi -> &prnsim + new Transition (6787, 6788), // &prsi -> &prsim + new Transition (6835, 6836), // &qpri -> &qprim + new Transition (6876, 7453), // &r -> &rm + new Transition (6901, 6902), // &rae -> &raem + new Transition (6957, 6958), // &rarrsi -> &rarrsim + new Transition (7104, 7105), // &ReverseEle -> &ReverseElem + new Transition (7118, 7119), // &ReverseEquilibriu -> &ReverseEquilibrium + new Transition (7132, 7133), // &ReverseUpEquilibriu -> &ReverseUpEquilibrium + new Transition (7360, 7361), // &rightthreeti -> &rightthreetim + new Transition (7442, 7451), // &rl -> &rlm + new Transition (7464, 7465), // &rn -> &rnm + new Transition (7496, 7497), // &roti -> &rotim + new Transition (7504, 7505), // &RoundI -> &RoundIm + new Transition (7573, 7574), // &rti -> &rtim + new Transition (7610, 7883), // &S -> &Sm + new Transition (7617, 7894), // &s -> &sm + new Transition (7677, 7678), // &scnsi -> &scnsim + new Transition (7688, 7689), // &scsi -> &scsim + new Transition (7703, 7721), // &se -> &sem + new Transition (7729, 7730), // &set -> &setm + new Transition (7798, 7799), // &short -> &shortm + new Transition (7834, 7835), // &Sig -> &Sigm + new Transition (7838, 7847), // &si -> &sim + new Transition (7839, 7840), // &sig -> &sigm + new Transition (7900, 7901), // &smallset -> &smallsetm + new Transition (8077, 8086), // &ss -> &ssm + new Transition (8082, 8083), // &sset -> &ssetm + new Transition (8127, 8275), // &Su -> &Sum + new Transition (8130, 8277), // &su -> &sum + new Transition (8131, 8145), // &sub -> &subm + new Transition (8190, 8191), // &subsi -> &subsim + new Transition (8262, 8263), // &succnsi -> &succnsim + new Transition (8266, 8267), // &succsi -> &succsim + new Transition (8284, 8333), // &sup -> &supm + new Transition (8367, 8368), // &supsi -> &supsim + new Transition (8488, 8489), // &thetasy -> &thetasym + new Transition (8504, 8505), // &thicksi -> &thicksim + new Transition (8532, 8533), // &thksi -> &thksim + new Transition (8549, 8576), // &ti -> &tim + new Transition (8619, 8620), // &tpri -> &tprim + new Transition (8633, 8670), // &tri -> &trim + new Transition (8694, 8695), // &triti -> &tritim + new Transition (8702, 8703), // &trpeziu -> &trpezium + new Transition (8768, 8904), // &U -> &Um + new Transition (8775, 8909), // &u -> &um + new Transition (9043, 9044), // &UpEquilibriu -> &UpEquilibrium + new Transition (9182, 9191), // &uu -> &uum + new Transition (9187, 9188), // &Uu -> &Uum + new Transition (9254, 9255), // &varsig -> &varsigm + new Transition (9548, 9594), // &x -> &xm + new Transition (9619, 9620), // &xoti -> &xotim + new Transition (9736, 9744), // &yu -> &yum + new Transition (9740, 9741) // &Yu -> &Yum + }; + TransitionTable_n = new Transition[303] { + new Transition (0, 4965), // & -> &n + new Transition (1, 116), // &A -> &An + new Transition (8, 119), // &a -> &an + new Transition (122, 123), // &anda -> &andan + new Transition (185, 186), // &Aogo -> &Aogon + new Transition (190, 191), // &aogo -> &aogon + new Transition (221, 222), // &ApplyFu -> &ApplyFun + new Transition (226, 227), // &ApplyFunctio -> &ApplyFunction + new Transition (238, 239), // &Ari -> &Arin + new Transition (243, 244), // &ari -> &arin + new Transition (257, 258), // &Assig -> &Assign + new Transition (291, 292), // &awco -> &awcon + new Transition (293, 294), // &awconi -> &awconin + new Transition (297, 298), // &awi -> &awin + new Transition (301, 579), // &b -> &bn + new Transition (306, 307), // &backco -> &backcon + new Transition (315, 316), // &backepsilo -> &backepsilon + new Transition (370, 371), // &bco -> &bcon + new Transition (409, 410), // &ber -> &bern + new Transition (414, 415), // &Ber -> &Bern + new Transition (433, 434), // &betwee -> &between + new Transition (484, 485), // &bigtria -> &bigtrian + new Transition (491, 492), // &bigtriangledow -> &bigtriangledown + new Transition (520, 563), // &bla -> &blan + new Transition (526, 527), // &blackloze -> &blacklozen + new Transition (541, 542), // &blacktria -> &blacktrian + new Transition (549, 550), // &blacktriangledow -> &blacktriangledown + new Transition (657, 658), // &boxmi -> &boxmin + new Transition (807, 808), // &capa -> &capan + new Transition (838, 839), // &CapitalDiffere -> &CapitalDifferen + new Transition (852, 853), // &caro -> &caron + new Transition (869, 870), // &Ccaro -> &Ccaron + new Transition (873, 874), // &ccaro -> &ccaron + new Transition (894, 895), // &Cco -> &Ccon + new Transition (896, 897), // &Cconi -> &Cconin + new Transition (915, 933), // &ce -> &cen + new Transition (920, 936), // &Ce -> &Cen + new Transition (1033, 1034), // &CircleMi -> &CircleMin + new Transition (1053, 1054), // &cirf -> &cirfn + new Transition (1055, 1056), // &cirfni -> &cirfnin + new Transition (1077, 1078), // &ClockwiseCo -> &ClockwiseCon + new Transition (1083, 1084), // &ClockwiseContourI -> &ClockwiseContourIn + new Transition (1126, 1171), // &Co -> &Con + new Transition (1128, 1129), // &Colo -> &Colon + new Transition (1131, 1164), // &co -> &con + new Transition (1133, 1134), // &colo -> &colon + new Transition (1150, 1151), // &compf -> &compfn + new Transition (1156, 1157), // &compleme -> &complemen + new Transition (1175, 1176), // &Congrue -> &Congruen + new Transition (1179, 1180), // &Coni -> &Conin + new Transition (1183, 1184), // &coni -> &conin + new Transition (1191, 1192), // &ContourI -> &ContourIn + new Transition (1226, 1227), // &Cou -> &Coun + new Transition (1241, 1242), // &CounterClockwiseCo -> &CounterClockwiseCon + new Transition (1247, 1248), // &CounterClockwiseContourI -> &CounterClockwiseContourIn + new Transition (1378, 1379), // &curre -> ¤ + new Transition (1409, 1410), // &cwco -> &cwcon + new Transition (1411, 1412), // &cwconi -> &cwconin + new Transition (1415, 1416), // &cwi -> &cwin + new Transition (1477, 1478), // &Dcaro -> &Dcaron + new Transition (1483, 1484), // &dcaro -> &dcaron + new Transition (1604, 1605), // &Diamo -> &Diamon + new Transition (1608, 1609), // &diamo -> &diamon + new Transition (1625, 1626), // &Differe -> &Differen + new Transition (1640, 1641), // &disi -> &disin + new Transition (1649, 1650), // ÷o -> ÷on + new Transition (1657, 1658), // &divo -> &divon + new Transition (1672, 1673), // &dlcor -> &dlcorn + new Transition (1714, 1715), // &dotmi -> &dotmin + new Transition (1749, 1750), // &DoubleCo -> &DoubleCon + new Transition (1755, 1756), // &DoubleContourI -> &DoubleContourIn + new Transition (1768, 1769), // &DoubleDow -> &DoubleDown + new Transition (1801, 1802), // &DoubleLo -> &DoubleLon + new Transition (1861, 1862), // &DoubleUpDow -> &DoubleUpDown + new Transition (1881, 1882), // &Dow -> &Down + new Transition (1895, 1896), // &dow -> &down + new Transition (1923, 1924), // &downdow -> &downdown + new Transition (1937, 1938), // &downharpoo -> &downharpoon + new Transition (2033, 2034), // &drcor -> &drcorn + new Transition (2087, 2088), // &dwa -> &dwan + new Transition (2115, 2290), // &e -> &en + new Transition (2130, 2131), // &Ecaro -> &Ecaron + new Transition (2136, 2137), // &ecaro -> &ecaron + new Transition (2150, 2151), // &ecolo -> &ecolon + new Transition (2209, 2210), // &Eleme -> &Elemen + new Transition (2213, 2214), // &eli -> &elin + new Transition (2298, 2299), // &Eogo -> &Eogon + new Transition (2303, 2304), // &eogo -> &eogon + new Transition (2330, 2331), // &Epsilo -> &Epsilon + new Transition (2334, 2335), // &epsilo -> &epsilon + new Transition (2347, 2348), // &eqcolo -> &eqcolon + new Transition (2355, 2356), // &eqsla -> &eqslan + new Transition (2479, 2480), // &expectatio -> &expectation + new Transition (2483, 2484), // &Expo -> &Expon + new Transition (2485, 2486), // &Expone -> &Exponen + new Transition (2493, 2494), // &expo -> &expon + new Transition (2495, 2496), // &expone -> &exponen + new Transition (2503, 2604), // &f -> &fn + new Transition (2507, 2508), // &falli -> &fallin + new Transition (2600, 2601), // &flt -> &fltn + new Transition (2643, 2644), // &fparti -> &fpartin + new Transition (2690, 2691), // &frow -> &frown + new Transition (2701, 2832), // &g -> &gn + new Transition (2777, 2778), // &geqsla -> &geqslan + new Transition (2908, 2909), // &GreaterSla -> &GreaterSlan + new Transition (3002, 3011), // &gv -> &gvn + new Transition (3005, 3006), // &gvert -> &gvertn + new Transition (3091, 3092), // &herco -> &hercon + new Transition (3174, 3175), // &Horizo -> &Horizon + new Transition (3180, 3181), // &HorizontalLi -> &HorizontalLin + new Transition (3212, 3213), // &HumpDow -> &HumpDown + new Transition (3233, 3234), // &hyphe -> &hyphen + new Transition (3236, 3398), // &I -> &In + new Transition (3243, 3378), // &i -> &in + new Transition (3301, 3311), // &ii -> &iin + new Transition (3303, 3308), // &iii -> &iiin + new Transition (3304, 3305), // &iiii -> &iiiin + new Transition (3313, 3314), // &iinfi -> &iinfin + new Transition (3345, 3346), // &Imagi -> &Imagin + new Transition (3353, 3354), // &imagli -> &imaglin + new Transition (3386, 3387), // &infi -> &infin + new Transition (3430, 3431), // &Intersectio -> &Intersection + new Transition (3473, 3474), // &Iogo -> &Iogon + new Transition (3477, 3478), // &iogo -> &iogon + new Transition (3511, 3512), // &isi -> &isin + new Transition (3657, 3658), // &kgree -> &kgreen + new Transition (3692, 4401), // &l -> &ln + new Transition (3699, 3733), // &La -> &Lan + new Transition (3705, 3736), // &la -> &lan + new Transition (3720, 3721), // &lagra -> &lagran + new Transition (3840, 3841), // &Lcaro -> &Lcaron + new Transition (3846, 3847), // &lcaro -> &lcaron + new Transition (3901, 3902), // &LeftA -> &LeftAn + new Transition (3957, 3958), // &LeftCeili -> &LeftCeilin + new Transition (3975, 3976), // &LeftDow -> &LeftDown + new Transition (4009, 4010), // &leftharpoo -> &leftharpoon + new Transition (4013, 4014), // &leftharpoondow -> &leftharpoondown + new Transition (4070, 4071), // &leftrightharpoo -> &leftrightharpoon + new Transition (4122, 4123), // &LeftTria -> &LeftTrian + new Transition (4142, 4143), // &LeftUpDow -> &LeftUpDown + new Transition (4193, 4194), // &leqsla -> &leqslan + new Transition (4286, 4287), // &LessSla -> &LessSlan + new Transition (4356, 4357), // &llcor -> &llcorn + new Transition (4422, 4457), // &lo -> &lon + new Transition (4423, 4424), // &loa -> &loan + new Transition (4434, 4435), // &Lo -> &Lon + new Transition (4614, 4615), // &loze -> &lozen + new Transition (4635, 4636), // &lrcor -> &lrcorn + new Transition (4755, 4764), // &lv -> &lvn + new Transition (4758, 4759), // &lvert -> &lvertn + new Transition (4767, 4916), // &m -> &mn + new Transition (4793, 4794), // &mapstodow -> &mapstodown + new Transition (4837, 4838), // &measureda -> &measuredan + new Transition (4856, 4857), // &Melli -> &Mellin + new Transition (4871, 4890), // &mi -> &min + new Transition (4900, 4901), // &Mi -> &Min + new Transition (4966, 4983), // &na -> &nan + new Transition (5027, 5028), // &Ncaro -> &Ncaron + new Transition (5031, 5032), // &ncaro -> &ncaron + new Transition (5044, 5045), // &nco -> &ncon + new Transition (5105, 5114), // &NegativeThi -> &NegativeThin + new Transition (5127, 5128), // &NegativeVeryThi -> &NegativeVeryThin + new Transition (5178, 5179), // &NewLi -> &NewLin + new Transition (5206, 5207), // &ngeqsla -> &ngeqslan + new Transition (5318, 5319), // &nleqsla -> &nleqslan + new Transition (5347, 5354), // &No -> &Non + new Transition (5360, 5361), // &NonBreaki -> &NonBreakin + new Transition (5378, 5620), // ¬ -> ¬n + new Transition (5381, 5382), // &NotCo -> &NotCon + new Transition (5386, 5387), // &NotCongrue -> &NotCongruen + new Transition (5418, 5419), // &NotEleme -> &NotElemen + new Transition (5478, 5479), // &NotGreaterSla -> &NotGreaterSlan + new Transition (5499, 5500), // &NotHumpDow -> &NotHumpDown + new Transition (5512, 5513), // ¬i -> ¬in + new Transition (5535, 5536), // &NotLeftTria -> &NotLeftTrian + new Transition (5575, 5576), // &NotLessSla -> &NotLessSlan + new Transition (5647, 5648), // &NotPrecedesSla -> &NotPrecedesSlan + new Transition (5667, 5668), // &NotReverseEleme -> &NotReverseElemen + new Transition (5678, 5679), // &NotRightTria -> &NotRightTrian + new Transition (5753, 5754), // &NotSucceedsSla -> &NotSucceedsSlan + new Transition (5838, 5839), // &npoli -> &npolin + new Transition (6008, 6009), // &ntria -> &ntrian + new Transition (6078, 6079), // &nvi -> &nvin + new Transition (6081, 6082), // &nvinfi -> &nvinfin + new Transition (6111, 6126), // &nw -> &nwn + new Transition (6211, 6212), // &ogo -> &ogon + new Transition (6234, 6235), // &oi -> &oin + new Transition (6252, 6253), // &oli -> &olin + new Transition (6279, 6280), // &Omicro -> &Omicron + new Transition (6282, 6290), // &omi -> &omin + new Transition (6285, 6286), // &omicro -> &omicron + new Transition (6307, 6308), // &Ope -> &Open + new Transition (6454, 6455), // &OverPare -> &OverParen + new Transition (6499, 6500), // &perc -> &percn + new Transition (6514, 6515), // &perte -> &perten + new Transition (6537, 6538), // &pho -> &phon + new Transition (6556, 6557), // &pla -> &plan + new Transition (6591, 6592), // &PlusMi -> &PlusMin + new Transition (6596, 6597), // &plusm -> ± + new Transition (6610, 6611), // &Poi -> &Poin + new Transition (6618, 6619), // &Poincarepla -> &Poincareplan + new Transition (6623, 6624), // &poi -> &poin + new Transition (6626, 6627), // &pointi -> &pointin + new Transition (6636, 6637), // &pou -> &poun + new Transition (6642, 6735), // &pr -> &prn + new Transition (6655, 6705), // &prec -> &precn + new Transition (6687, 6688), // &PrecedesSla -> &PrecedesSlan + new Transition (6761, 6762), // &profli -> &proflin + new Transition (6777, 6778), // &Proportio -> &Proportion + new Transition (6807, 6808), // &pu -> &pun + new Transition (6821, 6822), // &qi -> &qin + new Transition (6851, 6852), // &quater -> &quatern + new Transition (6854, 6855), // &quaternio -> &quaternion + new Transition (6858, 6859), // &quati -> &quatin + new Transition (6876, 7464), // &r -> &rn + new Transition (6882, 6911), // &ra -> &ran + new Transition (6887, 6908), // &Ra -> &Ran + new Transition (6979, 6981), // &ratio -> &ration + new Transition (7024, 7025), // &Rcaro -> &Rcaron + new Transition (7030, 7031), // &rcaro -> &rcaron + new Transition (7078, 7079), // &reali -> &realin + new Transition (7106, 7107), // &ReverseEleme -> &ReverseElemen + new Transition (7175, 7176), // &RightA -> &RightAn + new Transition (7199, 7428), // &ri -> &rin + new Transition (7232, 7233), // &RightCeili -> &RightCeilin + new Transition (7250, 7251), // &RightDow -> &RightDown + new Transition (7284, 7285), // &rightharpoo -> &rightharpoon + new Transition (7288, 7289), // &rightharpoondow -> &rightharpoondown + new Transition (7310, 7311), // &rightleftharpoo -> &rightleftharpoon + new Transition (7367, 7368), // &RightTria -> &RightTrian + new Transition (7387, 7388), // &RightUpDow -> &RightUpDown + new Transition (7432, 7433), // &risi -> &risin + new Transition (7470, 7471), // &roa -> &roan + new Transition (7501, 7502), // &Rou -> &Roun + new Transition (7522, 7523), // &rppoli -> &rppolin + new Transition (7631, 7670), // &sc -> &scn + new Transition (7638, 7639), // &Scaro -> &Scaron + new Transition (7642, 7643), // &scaro -> &scaron + new Transition (7683, 7684), // &scpoli -> &scpolin + new Transition (7730, 7736), // &setm -> &setmn + new Transition (7731, 7732), // &setmi -> &setmin + new Transition (7748, 7749), // &sfrow -> &sfrown + new Transition (7778, 7779), // &ShortDow -> &ShortDown + new Transition (7847, 7865), // &sim -> &simn + new Transition (7902, 7903), // &smallsetmi -> &smallsetmin + new Transition (8019, 8020), // &SquareI -> &SquareIn + new Transition (8029, 8030), // &SquareIntersectio -> &SquareIntersection + new Transition (8058, 8059), // &SquareU -> &SquareUn + new Transition (8061, 8062), // &SquareUnio -> &SquareUnion + new Transition (8083, 8084), // &ssetm -> &ssetmn + new Transition (8106, 8124), // &str -> &strn + new Transition (8117, 8118), // &straightepsilo -> &straightepsilon + new Transition (8130, 8279), // &su -> &sun + new Transition (8131, 8150), // &sub -> &subn + new Transition (8171, 8184), // &subset -> &subsetn + new Transition (8199, 8249), // &succ -> &succn + new Transition (8231, 8232), // &SucceedsSla -> &SucceedsSlan + new Transition (8284, 8338), // &sup -> &supn + new Transition (8354, 8361), // &supset -> &supsetn + new Transition (8375, 8390), // &sw -> &swn + new Transition (8422, 8423), // &Tcaro -> &Tcaron + new Transition (8428, 8429), // &tcaro -> &tcaron + new Transition (8493, 8516), // &thi -> &thin + new Transition (8507, 8520), // &Thi -> &Thin + new Transition (8541, 8542), // &thor -> þ + new Transition (8549, 8587), // &ti -> &tin + new Transition (8634, 8635), // &tria -> &trian + new Transition (8642, 8643), // &triangledow -> &triangledown + new Transition (8671, 8672), // &trimi -> &trimin + new Transition (8768, 8916), // &U -> &Un + new Transition (8890, 8891), // &ulcor -> &ulcorn + new Transition (8936, 8937), // &UnderPare -> &UnderParen + new Transition (8946, 8947), // &Unio -> &Union + new Transition (8956, 8957), // &Uogo -> &Uogon + new Transition (8961, 8962), // &uogo -> &uogon + new Transition (8996, 8997), // &UpArrowDow -> &UpArrowDown + new Transition (9006, 9007), // &UpDow -> &UpDown + new Transition (9016, 9017), // &Updow -> &Updown + new Transition (9026, 9027), // &updow -> &updown + new Transition (9051, 9052), // &upharpoo -> &upharpoon + new Transition (9101, 9102), // &Upsilo -> &Upsilon + new Transition (9105, 9106), // &upsilo -> &upsilon + new Transition (9130, 9131), // &urcor -> &urcorn + new Transition (9141, 9142), // &Uri -> &Urin + new Transition (9145, 9146), // &uri -> &urin + new Transition (9195, 9196), // &uwa -> &uwan + new Transition (9201, 9425), // &v -> &vn + new Transition (9202, 9203), // &va -> &van + new Transition (9208, 9223), // &var -> &varn + new Transition (9214, 9215), // &varepsilo -> &varepsilon + new Transition (9227, 9228), // &varnothi -> &varnothin + new Transition (9262, 9263), // &varsubset -> &varsubsetn + new Transition (9272, 9273), // &varsupset -> &varsupsetn + new Transition (9287, 9288), // &vartria -> &vartrian + new Transition (9383, 9384), // &VerticalLi -> &VerticalLin + new Transition (9406, 9407), // &VeryThi -> &VeryThin + new Transition (9459, 9460), // &vsub -> &vsubn + new Transition (9465, 9466), // &vsup -> &vsupn + new Transition (9548, 9598), // &x -> &xn + new Transition (9699, 9700), // &ye -> ¥ + new Transition (9764, 9765), // &Zcaro -> &Zcaron + new Transition (9770, 9771), // &zcaro -> &zcaron + new Transition (9848, 9851) // &zw -> &zwn + }; + TransitionTable_o = new Transition[460] { + new Transition (0, 6138), // & -> &o + new Transition (1, 183), // &A -> &Ao + new Transition (8, 188), // &a -> &ao + new Transition (129, 130), // &andsl -> &andslo + new Transition (184, 185), // &Aog -> &Aogo + new Transition (189, 190), // &aog -> &aogo + new Transition (199, 213), // &ap -> &apo + new Transition (225, 226), // &ApplyFuncti -> &ApplyFunctio + new Transition (230, 231), // &appr -> &appro + new Transition (290, 291), // &awc -> &awco + new Transition (301, 598), // &b -> &bo + new Transition (305, 306), // &backc -> &backco + new Transition (314, 315), // &backepsil -> &backepsilo + new Transition (331, 594), // &B -> &Bo + new Transition (369, 370), // &bc -> &bco + new Transition (381, 382), // &bdqu -> &bdquo + new Transition (410, 411), // &bern -> &berno + new Transition (415, 416), // &Bern -> &Berno + new Transition (443, 455), // &big -> &bigo + new Transition (456, 457), // &bigod -> &bigodo + new Transition (489, 490), // &bigtriangled -> &bigtriangledo + new Transition (515, 516), // &bkar -> &bkaro + new Transition (519, 575), // &bl -> &blo + new Transition (523, 524), // &blackl -> &blacklo + new Transition (547, 548), // &blacktriangled -> &blacktriangledo + new Transition (579, 591), // &bn -> &bno + new Transition (587, 588), // &bN -> &bNo + new Transition (604, 605), // &bott -> &botto + new Transition (614, 615), // &boxb -> &boxbo + new Transition (744, 757), // &bs -> &bso + new Transition (789, 1126), // &C -> &Co + new Transition (796, 1131), // &c -> &co + new Transition (824, 825), // &capd -> &capdo + new Transition (848, 852), // &car -> &caro + new Transition (866, 894), // &Cc -> &Cco + new Transition (868, 869), // &Ccar -> &Ccaro + new Transition (872, 873), // &ccar -> &ccaro + new Transition (907, 908), // &Cd -> &Cdo + new Transition (911, 912), // &cd -> &cdo + new Transition (940, 941), // &CenterD -> &CenterDo + new Transition (946, 947), // ¢erd -> ¢erdo + new Transition (990, 991), // &circlearr -> &circlearro + new Transition (1024, 1025), // &CircleD -> &CircleDo + new Transition (1068, 1069), // &Cl -> &Clo + new Transition (1076, 1077), // &ClockwiseC -> &ClockwiseCo + new Transition (1079, 1080), // &ClockwiseCont -> &ClockwiseConto + new Transition (1099, 1100), // &CloseCurlyD -> &CloseCurlyDo + new Transition (1106, 1107), // &CloseCurlyDoubleQu -> &CloseCurlyDoubleQuo + new Transition (1112, 1113), // &CloseCurlyQu -> &CloseCurlyQuo + new Transition (1127, 1128), // &Col -> &Colo + new Transition (1132, 1133), // &col -> &colo + new Transition (1167, 1168), // &congd -> &congdo + new Transition (1187, 1188), // &Cont -> &Conto + new Transition (1206, 1207), // &copr -> &copro + new Transition (1210, 1211), // &Copr -> &Copro + new Transition (1232, 1233), // &CounterCl -> &CounterClo + new Transition (1240, 1241), // &CounterClockwiseC -> &CounterClockwiseCo + new Transition (1243, 1244), // &CounterClockwiseCont -> &CounterClockwiseConto + new Transition (1256, 1266), // &cr -> &cro + new Transition (1261, 1262), // &Cr -> &Cro + new Transition (1288, 1289), // &ctd -> &ctdo + new Transition (1318, 1341), // &cup -> &cupo + new Transition (1337, 1338), // &cupd -> &cupdo + new Transition (1385, 1386), // &curvearr -> &curvearro + new Transition (1408, 1409), // &cwc -> &cwco + new Transition (1425, 1685), // &D -> &Do + new Transition (1432, 1679), // &d -> &do + new Transition (1466, 1467), // &dbkar -> &dbkaro + new Transition (1476, 1477), // &Dcar -> &Dcaro + new Transition (1482, 1483), // &dcar -> &dcaro + new Transition (1490, 1503), // &DD -> &DDo + new Transition (1492, 1510), // &dd -> &ddo + new Transition (1573, 1574), // &DiacriticalD -> &DiacriticalDo + new Transition (1601, 1608), // &diam -> &diamo + new Transition (1603, 1604), // &Diam -> &Diamo + new Transition (1643, 1657), // &div -> &divo + new Transition (1647, 1649), // ÷ -> ÷o + new Transition (1670, 1671), // &dlc -> &dlco + new Transition (1675, 1676), // &dlcr -> &dlcro + new Transition (1696, 1697), // &DotD -> &DotDo + new Transition (1703, 1704), // &doteqd -> &doteqdo + new Transition (1748, 1749), // &DoubleC -> &DoubleCo + new Transition (1751, 1752), // &DoubleCont -> &DoubleConto + new Transition (1764, 1765), // &DoubleD -> &DoubleDo + new Transition (1772, 1773), // &DoubleDownArr -> &DoubleDownArro + new Transition (1776, 1801), // &DoubleL -> &DoubleLo + new Transition (1782, 1783), // &DoubleLeftArr -> &DoubleLeftArro + new Transition (1793, 1794), // &DoubleLeftRightArr -> &DoubleLeftRightArro + new Transition (1810, 1811), // &DoubleLongLeftArr -> &DoubleLongLeftArro + new Transition (1821, 1822), // &DoubleLongLeftRightArr -> &DoubleLongLeftRightArro + new Transition (1832, 1833), // &DoubleLongRightArr -> &DoubleLongRightArro + new Transition (1843, 1844), // &DoubleRightArr -> &DoubleRightArro + new Transition (1855, 1856), // &DoubleUpArr -> &DoubleUpArro + new Transition (1859, 1860), // &DoubleUpD -> &DoubleUpDo + new Transition (1865, 1866), // &DoubleUpDownArr -> &DoubleUpDownArro + new Transition (1885, 1886), // &DownArr -> &DownArro + new Transition (1891, 1892), // &Downarr -> &Downarro + new Transition (1899, 1900), // &downarr -> &downarro + new Transition (1911, 1912), // &DownArrowUpArr -> &DownArrowUpArro + new Transition (1921, 1922), // &downd -> &downdo + new Transition (1927, 1928), // &downdownarr -> &downdownarro + new Transition (1935, 1936), // &downharp -> &downharpo + new Transition (1936, 1937), // &downharpo -> &downharpoo + new Transition (1962, 1963), // &DownLeftRightVect -> &DownLeftRightVecto + new Transition (1972, 1973), // &DownLeftTeeVect -> &DownLeftTeeVecto + new Transition (1979, 1980), // &DownLeftVect -> &DownLeftVecto + new Transition (1998, 1999), // &DownRightTeeVect -> &DownRightTeeVecto + new Transition (2005, 2006), // &DownRightVect -> &DownRightVecto + new Transition (2019, 2020), // &DownTeeArr -> &DownTeeArro + new Transition (2027, 2028), // &drbkar -> &drbkaro + new Transition (2031, 2032), // &drc -> &drco + new Transition (2036, 2037), // &drcr -> &drcro + new Transition (2044, 2054), // &ds -> &dso + new Transition (2058, 2059), // &Dstr -> &Dstro + new Transition (2063, 2064), // &dstr -> &dstro + new Transition (2068, 2069), // &dtd -> &dtdo + new Transition (2108, 2296), // &E -> &Eo + new Transition (2115, 2301), // &e -> &eo + new Transition (2129, 2130), // &Ecar -> &Ecaro + new Transition (2133, 2148), // &ec -> &eco + new Transition (2135, 2136), // &ecar -> &ecaro + new Transition (2149, 2150), // &ecol -> &ecolo + new Transition (2157, 2166), // &eD -> &eDo + new Transition (2158, 2159), // &eDD -> &eDDo + new Transition (2162, 2163), // &Ed -> &Edo + new Transition (2169, 2170), // &ed -> &edo + new Transition (2176, 2177), // &efD -> &efDo + new Transition (2200, 2201), // &egsd -> &egsdo + new Transition (2224, 2225), // &elsd -> &elsdo + new Transition (2297, 2298), // &Eog -> &Eogo + new Transition (2302, 2303), // &eog -> &eogo + new Transition (2329, 2330), // &Epsil -> &Epsilo + new Transition (2333, 2334), // &epsil -> &epsilo + new Transition (2340, 2345), // &eqc -> &eqco + new Transition (2346, 2347), // &eqcol -> &eqcolo + new Transition (2414, 2415), // &erD -> &erDo + new Transition (2426, 2427), // &esd -> &esdo + new Transition (2455, 2456), // &eur -> &euro + new Transition (2472, 2493), // &exp -> &expo + new Transition (2478, 2479), // &expectati -> &expectatio + new Transition (2482, 2483), // &Exp -> &Expo + new Transition (2503, 2612), // &f -> &fo + new Transition (2510, 2511), // &fallingd -> &fallingdo + new Transition (2517, 2608), // &F -> &Fo + new Transition (2604, 2605), // &fn -> &fno + new Transition (2647, 2689), // &fr -> &fro + new Transition (2701, 2857), // &g -> &go + new Transition (2708, 2853), // &G -> &Go + new Transition (2755, 2756), // &Gd -> &Gdo + new Transition (2759, 2760), // &gd -> &gdo + new Transition (2786, 2787), // &gesd -> &gesdo + new Transition (2788, 2790), // &gesdot -> &gesdoto + new Transition (2837, 2838), // &gnappr -> &gnappro + new Transition (2950, 2951), // >d -> >do + new Transition (2969, 2970), // >rappr -> >rappro + new Transition (2976, 2977), // >rd -> >rdo + new Transition (3014, 3159), // &H -> &Ho + new Transition (3020, 3126), // &h -> &ho + new Transition (3090, 3091), // &herc -> &herco + new Transition (3116, 3117), // &hksear -> &hksearo + new Transition (3122, 3123), // &hkswar -> &hkswaro + new Transition (3126, 3136), // &ho -> &hoo + new Transition (3144, 3145), // &hookleftarr -> &hookleftarro + new Transition (3155, 3156), // &hookrightarr -> &hookrightarro + new Transition (3173, 3174), // &Horiz -> &Horizo + new Transition (3198, 3199), // &Hstr -> &Hstro + new Transition (3203, 3204), // &hstr -> &hstro + new Transition (3210, 3211), // &HumpD -> &HumpDo + new Transition (3236, 3471), // &I -> &Io + new Transition (3243, 3467), // &i -> &io + new Transition (3265, 3266), // &Id -> &Ido + new Transition (3301, 3316), // &ii -> &iio + new Transition (3336, 3365), // &im -> &imo + new Transition (3378, 3393), // &in -> &ino + new Transition (3394, 3395), // &inod -> &inodo + new Transition (3429, 3430), // &Intersecti -> &Intersectio + new Transition (3440, 3441), // &intpr -> &intpro + new Transition (3451, 3452), // &InvisibleC -> &InvisibleCo + new Transition (3472, 3473), // &Iog -> &Iogo + new Transition (3476, 3477), // &iog -> &iogo + new Transition (3493, 3494), // &ipr -> &ipro + new Transition (3514, 3515), // &isind -> &isindo + new Transition (3555, 3582), // &J -> &Jo + new Transition (3561, 3586), // &j -> &jo + new Transition (3618, 3676), // &K -> &Ko + new Transition (3624, 3680), // &k -> &ko + new Transition (3692, 4422), // &l -> &lo + new Transition (3698, 4434), // &L -> &Lo + new Transition (3756, 3757), // &laqu -> « + new Transition (3839, 3840), // &Lcar -> &Lcaro + new Transition (3845, 3846), // &lcar -> &lcaro + new Transition (3874, 3875), // &ldqu -> &ldquo + new Transition (3915, 3916), // &LeftArr -> &LeftArro + new Transition (3921, 3922), // &Leftarr -> &Leftarro + new Transition (3929, 3930), // &leftarr -> &leftarro + new Transition (3944, 3945), // &LeftArrowRightArr -> &LeftArrowRightArro + new Transition (3961, 3962), // &LeftD -> &LeftDo + new Transition (3983, 3984), // &LeftDownTeeVect -> &LeftDownTeeVecto + new Transition (3990, 3991), // &LeftDownVect -> &LeftDownVecto + new Transition (3999, 4000), // &LeftFl -> &LeftFlo + new Transition (4000, 4001), // &LeftFlo -> &LeftFloo + new Transition (4007, 4008), // &leftharp -> &leftharpo + new Transition (4008, 4009), // &leftharpo -> &leftharpoo + new Transition (4011, 4012), // &leftharpoond -> &leftharpoondo + new Transition (4025, 4026), // &leftleftarr -> &leftleftarro + new Transition (4037, 4038), // &LeftRightArr -> &LeftRightArro + new Transition (4048, 4049), // &Leftrightarr -> &Leftrightarro + new Transition (4059, 4060), // &leftrightarr -> &leftrightarro + new Transition (4068, 4069), // &leftrightharp -> &leftrightharpo + new Transition (4069, 4070), // &leftrightharpo -> &leftrightharpoo + new Transition (4081, 4082), // &leftrightsquigarr -> &leftrightsquigarro + new Transition (4088, 4089), // &LeftRightVect -> &LeftRightVecto + new Transition (4098, 4099), // &LeftTeeArr -> &LeftTeeArro + new Transition (4105, 4106), // &LeftTeeVect -> &LeftTeeVecto + new Transition (4140, 4141), // &LeftUpD -> &LeftUpDo + new Transition (4147, 4148), // &LeftUpDownVect -> &LeftUpDownVecto + new Transition (4157, 4158), // &LeftUpTeeVect -> &LeftUpTeeVecto + new Transition (4164, 4165), // &LeftUpVect -> &LeftUpVecto + new Transition (4175, 4176), // &LeftVect -> &LeftVecto + new Transition (4202, 4203), // &lesd -> &lesdo + new Transition (4204, 4206), // &lesdot -> &lesdoto + new Transition (4219, 4220), // &lessappr -> &lessappro + new Transition (4223, 4224), // &lessd -> &lessdo + new Transition (4307, 4308), // &lfl -> &lflo + new Transition (4308, 4309), // &lflo -> &lfloo + new Transition (4354, 4355), // &llc -> &llco + new Transition (4366, 4367), // &Lleftarr -> &Lleftarro + new Transition (4381, 4382), // &Lmid -> &Lmido + new Transition (4385, 4391), // &lm -> &lmo + new Transition (4387, 4388), // &lmid -> &lmido + new Transition (4406, 4407), // &lnappr -> &lnappro + new Transition (4422, 4542), // &lo -> &loo + new Transition (4443, 4444), // &LongLeftArr -> &LongLeftArro + new Transition (4453, 4454), // &Longleftarr -> &Longleftarro + new Transition (4465, 4466), // &longleftarr -> &longleftarro + new Transition (4476, 4477), // &LongLeftRightArr -> &LongLeftRightArro + new Transition (4487, 4488), // &Longleftrightarr -> &Longleftrightarro + new Transition (4498, 4499), // &longleftrightarr -> &longleftrightarro + new Transition (4506, 4507), // &longmapst -> &longmapsto + new Transition (4516, 4517), // &LongRightArr -> &LongRightArro + new Transition (4527, 4528), // &Longrightarr -> &Longrightarro + new Transition (4538, 4539), // &longrightarr -> &longrightarro + new Transition (4546, 4547), // &looparr -> &looparro + new Transition (4597, 4598), // &LowerLeftArr -> &LowerLeftArro + new Transition (4608, 4609), // &LowerRightArr -> &LowerRightArro + new Transition (4633, 4634), // &lrc -> &lrco + new Transition (4655, 4656), // &lsaqu -> &lsaquo + new Transition (4679, 4680), // &lsqu -> &lsquo + new Transition (4685, 4686), // &Lstr -> &Lstro + new Transition (4690, 4691), // &lstr -> &lstro + new Transition (4706, 4707), // <d -> <do + new Transition (4767, 4922), // &m -> &mo + new Transition (4781, 4928), // &M -> &Mo + new Transition (4788, 4789), // &mapst -> &mapsto + new Transition (4791, 4792), // &mapstod -> &mapstodo + new Transition (4809, 4810), // &mc -> &mco + new Transition (4826, 4827), // &mDD -> &mDDo + new Transition (4868, 4869), // &mh -> &mho + new Transition (4873, 4874), // &micr -> µ + new Transition (4886, 4887), // &midd -> &middo + new Transition (4946, 4947), // &mstp -> &mstpo + new Transition (4965, 5372), // &n -> &no + new Transition (4971, 5347), // &N -> &No + new Transition (4986, 4993), // &nap -> &napo + new Transition (4997, 4998), // &nappr -> &nappro + new Transition (5020, 5044), // &nc -> &nco + new Transition (5026, 5027), // &Ncar -> &Ncaro + new Transition (5030, 5031), // &ncar -> &ncaro + new Transition (5048, 5049), // &ncongd -> &ncongdo + new Transition (5075, 5077), // &nearr -> &nearro + new Transition (5080, 5081), // &ned -> &nedo + new Transition (5278, 5279), // &nLeftarr -> &nLeftarro + new Transition (5286, 5287), // &nleftarr -> &nleftarro + new Transition (5297, 5298), // &nLeftrightarr -> &nLeftrightarro + new Transition (5308, 5309), // &nleftrightarr -> &nleftrightarro + new Transition (5380, 5381), // &NotC -> &NotCo + new Transition (5396, 5397), // &NotD -> &NotDo + new Transition (5497, 5498), // &NotHumpD -> &NotHumpDo + new Transition (5515, 5516), // ¬ind -> ¬indo + new Transition (5821, 5836), // &np -> &npo + new Transition (5875, 5876), // &nRightarr -> &nRightarro + new Transition (5885, 5886), // &nrightarr -> &nrightarro + new Transition (5910, 5911), // &nsh -> &nsho + new Transition (6037, 6038), // &numer -> &numero + new Transition (6121, 6123), // &nwarr -> &nwarro + new Transition (6131, 6294), // &O -> &Oo + new Transition (6138, 6298), // &o -> &oo + new Transition (6163, 6182), // &od -> &odo + new Transition (6185, 6186), // &ods -> &odso + new Transition (6210, 6211), // &og -> &ogo + new Transition (6247, 6248), // &olcr -> &olcro + new Transition (6278, 6279), // &Omicr -> &Omicro + new Transition (6284, 6285), // &omicr -> &omicro + new Transition (6314, 6315), // &OpenCurlyD -> &OpenCurlyDo + new Transition (6321, 6322), // &OpenCurlyDoubleQu -> &OpenCurlyDoubleQuo + new Transition (6327, 6328), // &OpenCurlyQu -> &OpenCurlyQuo + new Transition (6342, 6365), // &or -> &oro + new Transition (6351, 6353), // &order -> &ordero + new Transition (6361, 6362), // &orig -> &origo + new Transition (6369, 6370), // &orsl -> &orslo + new Transition (6382, 6396), // &os -> &oso + new Transition (6463, 6622), // &p -> &po + new Transition (6482, 6609), // &P -> &Po + new Transition (6503, 6504), // &peri -> &perio + new Transition (6527, 6537), // &ph -> &pho + new Transition (6548, 6549), // &pitchf -> &pitchfo + new Transition (6580, 6581), // &plusd -> &plusdo + new Transition (6604, 6605), // &plustw -> &plustwo + new Transition (6640, 6748), // &Pr -> &Pro + new Transition (6642, 6745), // &pr -> &pro + new Transition (6660, 6661), // &precappr -> &precappro + new Transition (6709, 6710), // &precnappr -> &precnappro + new Transition (6772, 6773), // &Prop -> &Propo + new Transition (6776, 6777), // &Proporti -> &Proportio + new Transition (6783, 6784), // &propt -> &propto + new Transition (6813, 6825), // &Q -> &Qo + new Transition (6817, 6829), // &q -> &qo + new Transition (6847, 6873), // &qu -> &quo + new Transition (6853, 6854), // &quaterni -> &quaternio + new Transition (6876, 7469), // &r -> &ro + new Transition (6886, 7485), // &R -> &Ro + new Transition (6922, 6923), // &raqu -> » + new Transition (6978, 6979), // &rati -> &ratio + new Transition (7023, 7024), // &Rcar -> &Rcaro + new Transition (7029, 7030), // &rcar -> &rcaro + new Transition (7064, 7065), // &rdqu -> &rdquo + new Transition (7141, 7142), // &rfl -> &rflo + new Transition (7142, 7143), // &rflo -> &rfloo + new Transition (7155, 7167), // &rh -> &rho + new Transition (7164, 7165), // &Rh -> &Rho + new Transition (7189, 7190), // &RightArr -> &RightArro + new Transition (7195, 7196), // &Rightarr -> &Rightarro + new Transition (7205, 7206), // &rightarr -> &rightarro + new Transition (7219, 7220), // &RightArrowLeftArr -> &RightArrowLeftArro + new Transition (7236, 7237), // &RightD -> &RightDo + new Transition (7258, 7259), // &RightDownTeeVect -> &RightDownTeeVecto + new Transition (7265, 7266), // &RightDownVect -> &RightDownVecto + new Transition (7274, 7275), // &RightFl -> &RightFlo + new Transition (7275, 7276), // &RightFlo -> &RightFloo + new Transition (7282, 7283), // &rightharp -> &rightharpo + new Transition (7283, 7284), // &rightharpo -> &rightharpoo + new Transition (7286, 7287), // &rightharpoond -> &rightharpoondo + new Transition (7300, 7301), // &rightleftarr -> &rightleftarro + new Transition (7308, 7309), // &rightleftharp -> &rightleftharpo + new Transition (7309, 7310), // &rightleftharpo -> &rightleftharpoo + new Transition (7321, 7322), // &rightrightarr -> &rightrightarro + new Transition (7333, 7334), // &rightsquigarr -> &rightsquigarro + new Transition (7343, 7344), // &RightTeeArr -> &RightTeeArro + new Transition (7350, 7351), // &RightTeeVect -> &RightTeeVecto + new Transition (7385, 7386), // &RightUpD -> &RightUpDo + new Transition (7392, 7393), // &RightUpDownVect -> &RightUpDownVecto + new Transition (7402, 7403), // &RightUpTeeVect -> &RightUpTeeVecto + new Transition (7409, 7410), // &RightUpVect -> &RightUpVecto + new Transition (7420, 7421), // &RightVect -> &RightVecto + new Transition (7435, 7436), // &risingd -> &risingdo + new Transition (7453, 7454), // &rm -> &rmo + new Transition (7519, 7520), // &rpp -> &rppo + new Transition (7538, 7539), // &Rrightarr -> &Rrightarro + new Transition (7545, 7546), // &rsaqu -> &rsaquo + new Transition (7562, 7563), // &rsqu -> &rsquo + new Transition (7610, 7949), // &S -> &So + new Transition (7617, 7936), // &s -> &so + new Transition (7626, 7627), // &sbqu -> &sbquo + new Transition (7637, 7638), // &Scar -> &Scaro + new Transition (7641, 7642), // &scar -> &scaro + new Transition (7680, 7681), // &scp -> &scpo + new Transition (7695, 7696), // &sd -> &sdo + new Transition (7713, 7715), // &searr -> &searro + new Transition (7745, 7747), // &sfr -> &sfro + new Transition (7751, 7796), // &sh -> &sho + new Transition (7772, 7773), // &Sh -> &Sho + new Transition (7776, 7777), // &ShortD -> &ShortDo + new Transition (7782, 7783), // &ShortDownArr -> &ShortDownArro + new Transition (7792, 7793), // &ShortLeftArr -> &ShortLeftArro + new Transition (7819, 7820), // &ShortRightArr -> &ShortRightArro + new Transition (7827, 7828), // &ShortUpArr -> &ShortUpArro + new Transition (7849, 7850), // &simd -> &simdo + new Transition (8028, 8029), // &SquareIntersecti -> &SquareIntersectio + new Transition (8060, 8061), // &SquareUni -> &SquareUnio + new Transition (8116, 8117), // &straightepsil -> &straightepsilo + new Transition (8133, 8134), // &subd -> &subdo + new Transition (8141, 8142), // &subed -> &subedo + new Transition (8204, 8205), // &succappr -> &succappro + new Transition (8253, 8254), // &succnappr -> &succnappro + new Transition (8292, 8293), // &supd -> &supdo + new Transition (8304, 8305), // &suped -> &supedo + new Transition (8321, 8322), // &suphs -> &suphso + new Transition (8385, 8387), // &swarr -> &swarro + new Transition (8400, 8604), // &T -> &To + new Transition (8404, 8590), // &t -> &to + new Transition (8421, 8422), // &Tcar -> &Tcaro + new Transition (8427, 8428), // &tcar -> &tcaro + new Transition (8445, 8446), // &td -> &tdo + new Transition (8461, 8540), // &th -> &tho + new Transition (8471, 8472), // &Theref -> &Therefo + new Transition (8476, 8477), // &theref -> &therefo + new Transition (8499, 8500), // &thickappr -> &thickappro + new Transition (8596, 8597), // &topb -> &topbo + new Transition (8608, 8610), // &topf -> &topfo + new Transition (8640, 8641), // &triangled -> &triangledo + new Transition (8664, 8665), // &trid -> &trido + new Transition (8681, 8682), // &TripleD -> &TripleDo + new Transition (8728, 8729), // &Tstr -> &Tstro + new Transition (8733, 8734), // &tstr -> &tstro + new Transition (8737, 8742), // &tw -> &two + new Transition (8753, 8754), // &twoheadleftarr -> &twoheadleftarro + new Transition (8764, 8765), // &twoheadrightarr -> &twoheadrightarro + new Transition (8768, 8954), // &U -> &Uo + new Transition (8775, 8959), // &u -> &uo + new Transition (8783, 8792), // &Uarr -> &Uarro + new Transition (8888, 8889), // &ulc -> &ulco + new Transition (8896, 8897), // &ulcr -> &ulcro + new Transition (8945, 8946), // &Uni -> &Unio + new Transition (8955, 8956), // &Uog -> &Uogo + new Transition (8960, 8961), // &uog -> &uogo + new Transition (8973, 8974), // &UpArr -> &UpArro + new Transition (8979, 8980), // &Uparr -> &Uparro + new Transition (8986, 8987), // &uparr -> &uparro + new Transition (8994, 8995), // &UpArrowD -> &UpArrowDo + new Transition (9000, 9001), // &UpArrowDownArr -> &UpArrowDownArro + new Transition (9004, 9005), // &UpD -> &UpDo + new Transition (9010, 9011), // &UpDownArr -> &UpDownArro + new Transition (9014, 9015), // &Upd -> &Updo + new Transition (9020, 9021), // &Updownarr -> &Updownarro + new Transition (9024, 9025), // &upd -> &updo + new Transition (9030, 9031), // &updownarr -> &updownarro + new Transition (9049, 9050), // &upharp -> &upharpo + new Transition (9050, 9051), // &upharpo -> &upharpoo + new Transition (9077, 9078), // &UpperLeftArr -> &UpperLeftArro + new Transition (9088, 9089), // &UpperRightArr -> &UpperRightArro + new Transition (9100, 9101), // &Upsil -> &Upsilo + new Transition (9104, 9105), // &upsil -> &upsilo + new Transition (9114, 9115), // &UpTeeArr -> &UpTeeArro + new Transition (9122, 9123), // &upuparr -> &upuparro + new Transition (9128, 9129), // &urc -> &urco + new Transition (9136, 9137), // &urcr -> &urcro + new Transition (9162, 9163), // &utd -> &utdo + new Transition (9201, 9436), // &v -> &vo + new Transition (9213, 9214), // &varepsil -> &varepsilo + new Transition (9223, 9224), // &varn -> &varno + new Transition (9237, 9238), // &varpr -> &varpro + new Transition (9240, 9241), // &varpropt -> &varpropto + new Transition (9249, 9250), // &varrh -> &varrho + new Transition (9303, 9432), // &V -> &Vo + new Transition (9393, 9394), // &VerticalSeparat -> &VerticalSeparato + new Transition (9441, 9442), // &vpr -> &vpro + new Transition (9484, 9523), // &W -> &Wo + new Transition (9490, 9527), // &w -> &wo + new Transition (9548, 9602), // &x -> &xo + new Transition (9565, 9607), // &X -> &Xo + new Transition (9603, 9604), // &xod -> &xodo + new Transition (9665, 9716), // &Y -> &Yo + new Transition (9672, 9720), // &y -> &yo + new Transition (9747, 9832), // &Z -> &Zo + new Transition (9754, 9836), // &z -> &zo + new Transition (9763, 9764), // &Zcar -> &Zcaro + new Transition (9769, 9770), // &zcar -> &zcaro + new Transition (9777, 9778), // &Zd -> &Zdo + new Transition (9781, 9782), // &zd -> &zdo + new Transition (9792, 9793) // &Zer -> &Zero + }; + TransitionTable_p = new Transition[278] { + new Transition (0, 6463), // & -> &p + new Transition (1, 216), // &A -> &Ap + new Transition (8, 199), // &a -> &ap + new Transition (79, 94), // &al -> &alp + new Transition (80, 86), // &ale -> &alep + new Transition (89, 90), // &Al -> &Alp + new Transition (103, 114), // &am -> & + new Transition (130, 131), // &andslo -> &andslop + new Transition (172, 173), // &angs -> &angsp + new Transition (183, 193), // &Ao -> &Aop + new Transition (188, 196), // &ao -> &aop + new Transition (199, 229), // &ap -> &app + new Transition (216, 217), // &Ap -> &App + new Transition (263, 264), // &asym -> &asymp + new Transition (301, 719), // &b -> &bp + new Transition (304, 318), // &back -> &backp + new Transition (310, 311), // &backe -> &backep + new Transition (384, 405), // &be -> &bep + new Transition (399, 400), // &bem -> &bemp + new Transition (445, 446), // &bigca -> &bigcap + new Transition (452, 453), // &bigcu -> &bigcup + new Transition (455, 460), // &bigo -> &bigop + new Transition (474, 475), // &bigsqcu -> &bigsqcup + new Transition (494, 495), // &bigtriangleu -> &bigtriangleup + new Transition (497, 498), // &bigu -> &bigup + new Transition (594, 595), // &Bo -> &Bop + new Transition (598, 599), // &bo -> &bop + new Transition (613, 662), // &box -> &boxp + new Transition (774, 775), // &bum -> &bump + new Transition (782, 783), // &Bum -> &Bump + new Transition (790, 803), // &Ca -> &Cap + new Transition (797, 805), // &ca -> &cap + new Transition (814, 815), // &capbrcu -> &capbrcup + new Transition (818, 819), // &capca -> &capcap + new Transition (821, 822), // &capcu -> &capcup + new Transition (862, 863), // &cca -> &ccap + new Transition (900, 901), // &ccu -> &ccup + new Transition (927, 928), // &cem -> &cemp + new Transition (1126, 1200), // &Co -> &Cop + new Transition (1131, 1203), // &co -> &cop + new Transition (1142, 1148), // &com -> &comp + new Transition (1278, 1283), // &csu -> &csup + new Transition (1292, 1318), // &cu -> &cup + new Transition (1301, 1302), // &cue -> &cuep + new Transition (1311, 1313), // &cularr -> &cularrp + new Transition (1315, 1316), // &Cu -> &Cup + new Transition (1323, 1324), // &cupbrca -> &cupbrcap + new Transition (1327, 1328), // &CupCa -> &CupCap + new Transition (1331, 1332), // &cupca -> &cupcap + new Transition (1334, 1335), // &cupcu -> &cupcup + new Transition (1356, 1357), // &curlyeq -> &curlyeqp + new Transition (1529, 1530), // &dem -> &demp + new Transition (1676, 1677), // &dlcro -> &dlcrop + new Transition (1679, 1689), // &do -> &dop + new Transition (1685, 1686), // &Do -> &Dop + new Transition (1694, 1719), // &dot -> &dotp + new Transition (1851, 1852), // &DoubleU -> &DoubleUp + new Transition (1907, 1908), // &DownArrowU -> &DownArrowUp + new Transition (1934, 1935), // &downhar -> &downharp + new Transition (2037, 2038), // &drcro -> &drcrop + new Transition (2108, 2326), // &E -> &Ep + new Transition (2115, 2312), // &e -> &ep + new Transition (2228, 2246), // &Em -> &Emp + new Transition (2233, 2238), // &em -> &emp + new Transition (2279, 2280), // &ems -> &emsp + new Transition (2293, 2294), // &ens -> &ensp + new Transition (2296, 2306), // &Eo -> &Eop + new Transition (2301, 2309), // &eo -> &eop + new Transition (2402, 2403), // &eqv -> &eqvp + new Transition (2458, 2472), // &ex -> &exp + new Transition (2466, 2482), // &Ex -> &Exp + new Transition (2503, 2639), // &f -> &fp + new Transition (2608, 2609), // &Fo -> &Fop + new Transition (2612, 2613), // &fo -> &fop + new Transition (2702, 2722), // &ga -> &gap + new Transition (2833, 2834), // &gna -> &gnap + new Transition (2834, 2836), // &gnap -> &gnapp + new Transition (2853, 2854), // &Go -> &Gop + new Transition (2857, 2858), // &go -> &gop + new Transition (2966, 2967), // >ra -> >rap + new Transition (2967, 2968), // >rap -> >rapp + new Transition (3024, 3025), // &hairs -> &hairsp + new Transition (3086, 3087), // &helli -> &hellip + new Transition (3106, 3107), // &HilbertS -> &HilbertSp + new Transition (3126, 3163), // &ho -> &hop + new Transition (3159, 3160), // &Ho -> &Hop + new Transition (3208, 3209), // &Hum -> &Hump + new Transition (3216, 3217), // &HumpDownHum -> &HumpDownHump + new Transition (3225, 3231), // &hy -> &hyp + new Transition (3243, 3492), // &i -> &ip + new Transition (3330, 3372), // &Im -> &Imp + new Transition (3336, 3368), // &im -> &imp + new Transition (3341, 3357), // &imag -> &imagp + new Transition (3401, 3439), // &int -> &intp + new Transition (3467, 3483), // &io -> &iop + new Transition (3471, 3480), // &Io -> &Iop + new Transition (3582, 3583), // &Jo -> &Jop + new Transition (3586, 3587), // &jo -> &jop + new Transition (3619, 3620), // &Ka -> &Kap + new Transition (3620, 3621), // &Kap -> &Kapp + new Transition (3625, 3626), // &ka -> &kap + new Transition (3626, 3627), // &kap -> &kapp + new Transition (3676, 3677), // &Ko -> &Kop + new Transition (3680, 3681), // &ko -> &kop + new Transition (3692, 4621), // &l -> &lp + new Transition (3699, 3746), // &La -> &Lap + new Transition (3705, 3744), // &la -> &lap + new Transition (3712, 3713), // &laem -> &laemp + new Transition (3766, 3782), // &larr -> &larrp + new Transition (3779, 3780), // &larrl -> &larrlp + new Transition (4006, 4007), // &lefthar -> &leftharp + new Transition (4016, 4017), // &leftharpoonu -> &leftharpoonup + new Transition (4067, 4068), // &leftrighthar -> &leftrightharp + new Transition (4138, 4139), // &LeftU -> &LeftUp + new Transition (4216, 4217), // &lessa -> &lessap + new Transition (4217, 4218), // &lessap -> &lessapp + new Transition (4402, 4403), // &lna -> &lnap + new Transition (4403, 4405), // &lnap -> &lnapp + new Transition (4422, 4560), // &lo -> &lop + new Transition (4434, 4564), // &Lo -> &Lop + new Transition (4503, 4504), // &longma -> &longmap + new Transition (4542, 4543), // &loo -> &loop + new Transition (4767, 4935), // &m -> &mp + new Transition (4768, 4785), // &ma -> &map + new Transition (4782, 4783), // &Ma -> &Map + new Transition (4801, 4802), // &mapstou -> &mapstoup + new Transition (4848, 4849), // &MediumS -> &MediumSp + new Transition (4910, 4911), // &mlc -> &mlcp + new Transition (4916, 4917), // &mn -> &mnp + new Transition (4922, 4932), // &mo -> &mop + new Transition (4928, 4929), // &Mo -> &Mop + new Transition (4945, 4946), // &mst -> &mstp + new Transition (4958, 4959), // &multima -> &multimap + new Transition (4962, 4963), // &muma -> &mumap + new Transition (4965, 5821), // &n -> &np + new Transition (4966, 4986), // &na -> &nap + new Transition (4986, 4996), // &nap -> &napp + new Transition (5011, 5012), // &nbs ->   + new Transition (5015, 5016), // &nbum -> &nbump + new Transition (5021, 5022), // &nca -> &ncap + new Transition (5052, 5053), // &ncu -> &ncup + new Transition (5097, 5098), // &NegativeMediumS -> &NegativeMediumSp + new Transition (5108, 5109), // &NegativeThickS -> &NegativeThickSp + new Transition (5115, 5116), // &NegativeThinS -> &NegativeThinSp + new Transition (5129, 5130), // &NegativeVeryThinS -> &NegativeVeryThinSp + new Transition (5227, 5236), // &nh -> &nhp + new Transition (5347, 5369), // &No -> &Nop + new Transition (5363, 5364), // &NonBreakingS -> &NonBreakingSp + new Transition (5372, 5373), // &no -> &nop + new Transition (5390, 5391), // &NotCu -> &NotCup + new Transition (5393, 5394), // &NotCupCa -> &NotCupCap + new Transition (5495, 5496), // &NotHum -> &NotHump + new Transition (5503, 5504), // &NotHumpDownHum -> &NotHumpDownHump + new Transition (5701, 5713), // &NotSquareSu -> &NotSquareSup + new Transition (5726, 5768), // &NotSu -> &NotSup + new Transition (5895, 5938), // &ns -> &nsp + new Transition (5913, 5918), // &nshort -> &nshortp + new Transition (5944, 5948), // &nsqsu -> &nsqsup + new Transition (5951, 5973), // &nsu -> &nsup + new Transition (6040, 6041), // &nums -> &numsp + new Transition (6044, 6045), // &nva -> &nvap + new Transition (6131, 6306), // &O -> &Op + new Transition (6138, 6302), // &o -> &op + new Transition (6294, 6295), // &Oo -> &Oop + new Transition (6298, 6299), // &oo -> &oop + new Transition (6333, 6334), // &oper -> &operp + new Transition (6370, 6371), // &orslo -> &orslop + new Transition (6498, 6511), // &per -> &perp + new Transition (6609, 6630), // &Po -> &Pop + new Transition (6615, 6616), // &Poincare -> &Poincarep + new Transition (6622, 6633), // &po -> &pop + new Transition (6644, 6645), // &pra -> &prap + new Transition (6657, 6658), // &preca -> &precap + new Transition (6658, 6659), // &precap -> &precapp + new Transition (6706, 6707), // &precna -> &precnap + new Transition (6707, 6708), // &precnap -> &precnapp + new Transition (6736, 6737), // &prna -> &prnap + new Transition (6745, 6770), // &pro -> &prop + new Transition (6748, 6772), // &Pro -> &Prop + new Transition (6810, 6811), // &puncs -> &puncsp + new Transition (6817, 6833), // &q -> &qp + new Transition (6825, 6826), // &Qo -> &Qop + new Transition (6829, 6830), // &qo -> &qop + new Transition (6876, 7512), // &r -> &rp + new Transition (6902, 6903), // &raem -> &raemp + new Transition (6932, 6953), // &rarr -> &rarrp + new Transition (6934, 6935), // &rarra -> &rarrap + new Transition (6950, 6951), // &rarrl -> &rarrlp + new Transition (7076, 7082), // &real -> &realp + new Transition (7121, 7122), // &ReverseU -> &ReverseUp + new Transition (7281, 7282), // &righthar -> &rightharp + new Transition (7291, 7292), // &rightharpoonu -> &rightharpoonup + new Transition (7307, 7308), // &rightlefthar -> &rightleftharp + new Transition (7383, 7384), // &RightU -> &RightUp + new Transition (7469, 7481), // &ro -> &rop + new Transition (7485, 7486), // &Ro -> &Rop + new Transition (7505, 7506), // &RoundIm -> &RoundImp + new Transition (7512, 7519), // &rp -> &rpp + new Transition (7617, 7956), // &s -> &sp + new Transition (7631, 7680), // &sc -> &scp + new Transition (7633, 7634), // &sca -> &scap + new Transition (7671, 7672), // &scna -> &scnap + new Transition (7753, 7754), // &shar -> &sharp + new Transition (7798, 7803), // &short -> &shortp + new Transition (7823, 7824), // &ShortU -> &ShortUp + new Transition (7847, 7868), // &sim -> &simp + new Transition (7908, 7909), // &smash -> &smashp + new Transition (7911, 7912), // &sme -> &smep + new Transition (7936, 7953), // &so -> &sop + new Transition (7949, 7950), // &So -> &Sop + new Transition (7970, 7971), // &sqca -> &sqcap + new Transition (7975, 7976), // &sqcu -> &sqcup + new Transition (7985, 7997), // &sqsu -> &sqsup + new Transition (8033, 8045), // &SquareSu -> &SquareSup + new Transition (8111, 8120), // &straight -> &straightp + new Transition (8112, 8113), // &straighte -> &straightep + new Transition (8127, 8282), // &Su -> &Sup + new Transition (8130, 8284), // &su -> &sup + new Transition (8131, 8155), // &sub -> &subp + new Transition (8193, 8196), // &subsu -> &subsup + new Transition (8201, 8202), // &succa -> &succap + new Transition (8202, 8203), // &succap -> &succapp + new Transition (8250, 8251), // &succna -> &succnap + new Transition (8251, 8252), // &succnap -> &succnapp + new Transition (8284, 8343), // &sup -> &supp + new Transition (8370, 8373), // &supsu -> &supsup + new Transition (8404, 8617), // &t -> &tp + new Transition (8496, 8497), // &thicka -> &thickap + new Transition (8497, 8498), // &thickap -> &thickapp + new Transition (8510, 8511), // &ThickS -> &ThickSp + new Transition (8517, 8518), // &thins -> &thinsp + new Transition (8521, 8522), // &ThinS -> &ThinSp + new Transition (8528, 8529), // &thka -> &thkap + new Transition (8590, 8594), // &to -> &top + new Transition (8604, 8605), // &To -> &Top + new Transition (8628, 8698), // &tr -> &trp + new Transition (8633, 8685), // &tri -> &trip + new Transition (8677, 8678), // &Tri -> &Trip + new Transition (8768, 8970), // &U -> &Up + new Transition (8775, 8983), // &u -> &up + new Transition (8897, 8898), // &ulcro -> &ulcrop + new Transition (8954, 8964), // &Uo -> &Uop + new Transition (8959, 8967), // &uo -> &uop + new Transition (8970, 9068), // &Up -> &Upp + new Transition (9048, 9049), // &uphar -> &upharp + new Transition (9118, 9119), // &upu -> &upup + new Transition (9137, 9138), // &urcro -> &urcrop + new Transition (9201, 9440), // &v -> &vp + new Transition (9208, 9231), // &var -> &varp + new Transition (9209, 9210), // &vare -> &varep + new Transition (9218, 9219), // &varka -> &varkap + new Transition (9219, 9220), // &varkap -> &varkapp + new Transition (9238, 9239), // &varpro -> &varprop + new Transition (9258, 9269), // &varsu -> &varsup + new Transition (9357, 9358), // &velli -> &vellip + new Transition (9388, 9389), // &VerticalSe -> &VerticalSep + new Transition (9408, 9409), // &VeryThinS -> &VeryThinSp + new Transition (9427, 9430), // &vnsu -> &vnsup + new Transition (9432, 9433), // &Vo -> &Vop + new Transition (9436, 9437), // &vo -> &vop + new Transition (9442, 9443), // &vpro -> &vprop + new Transition (9458, 9465), // &vsu -> &vsup + new Transition (9490, 9531), // &w -> &wp + new Transition (9514, 9515), // &weier -> &weierp + new Transition (9523, 9524), // &Wo -> &Wop + new Transition (9527, 9528), // &wo -> &wop + new Transition (9550, 9551), // &xca -> &xcap + new Transition (9557, 9558), // &xcu -> &xcup + new Transition (9595, 9596), // &xma -> &xmap + new Transition (9602, 9611), // &xo -> &xop + new Transition (9607, 9608), // &Xo -> &Xop + new Transition (9642, 9643), // &xsqcu -> &xsqcup + new Transition (9645, 9646), // &xu -> &xup + new Transition (9716, 9717), // &Yo -> &Yop + new Transition (9720, 9721), // &yo -> &yop + new Transition (9799, 9800), // &ZeroWidthS -> &ZeroWidthSp + new Transition (9832, 9833), // &Zo -> &Zop + new Transition (9836, 9837) // &zo -> &zop + }; + TransitionTable_q = new Transition[144] { + new Transition (0, 6817), // & -> &q + new Transition (234, 235), // &approxe -> &approxeq + new Transition (266, 267), // &asympe -> &asympeq + new Transition (328, 329), // &backsime -> &backsimeq + new Transition (379, 380), // &bd -> &bdq + new Transition (471, 472), // &bigs -> &bigsq + new Transition (531, 532), // &blacks -> &blacksq + new Transition (580, 582), // &bne -> &bneq + new Transition (779, 787), // &bumpe -> &bumpeq + new Transition (784, 785), // &Bumpe -> &Bumpeq + new Transition (983, 984), // &circe -> &circeq + new Transition (1138, 1140), // &colone -> &coloneq + new Transition (1355, 1356), // &curlye -> &curlyeq + new Transition (1513, 1514), // &ddotse -> &ddotseq + new Transition (1700, 1701), // &dote -> &doteq + new Transition (1707, 1708), // &DotE -> &DotEq + new Transition (1724, 1725), // &dots -> &dotsq + new Transition (2108, 2367), // &E -> &Eq + new Transition (2115, 2339), // &e -> &eq + new Transition (2254, 2255), // &EmptySmallS -> &EmptySmallSq + new Transition (2272, 2273), // &EmptyVerySmallS -> &EmptyVerySmallSq + new Transition (2514, 2515), // &fallingdotse -> &fallingdotseq + new Transition (2564, 2565), // &FilledSmallS -> &FilledSmallSq + new Transition (2580, 2581), // &FilledVerySmallS -> &FilledVerySmallSq + new Transition (2765, 2771), // &ge -> &geq + new Transition (2771, 2773), // &geq -> &geqq + new Transition (2843, 2845), // &gne -> &gneq + new Transition (2845, 2847), // &gneq -> &gneqq + new Transition (2872, 2873), // &GreaterE -> &GreaterEq + new Transition (2887, 2888), // &GreaterFullE -> &GreaterFullEq + new Transition (2911, 2912), // &GreaterSlantE -> &GreaterSlantEq + new Transition (2942, 2959), // > -> >q + new Transition (2980, 2981), // >re -> >req + new Transition (2981, 2987), // >req -> >reqq + new Transition (3007, 3008), // &gvertne -> &gvertneq + new Transition (3008, 3009), // &gvertneq -> &gvertneqq + new Transition (3219, 3220), // &HumpE -> &HumpEq + new Transition (3243, 3497), // &i -> &iq + new Transition (3705, 3755), // &la -> &laq + new Transition (3869, 3873), // &ld -> &ldq + new Transition (3896, 4187), // &le -> &leq + new Transition (4074, 4075), // &leftrights -> &leftrightsq + new Transition (4132, 4133), // &LeftTriangleE -> &LeftTriangleEq + new Transition (4187, 4189), // &leq -> &leqq + new Transition (4227, 4228), // &lesse -> &lesseq + new Transition (4228, 4233), // &lesseq -> &lesseqq + new Transition (4240, 4241), // &LessE -> &LessEq + new Transition (4257, 4258), // &LessFullE -> &LessFullEq + new Transition (4289, 4290), // &LessSlantE -> &LessSlantEq + new Transition (4412, 4414), // &lne -> &lneq + new Transition (4414, 4416), // &lneq -> &lneqq + new Transition (4652, 4676), // &ls -> &lsq + new Transition (4653, 4654), // &lsa -> &lsaq + new Transition (4698, 4725), // < -> <q + new Transition (4760, 4761), // &lvertne -> &lvertneq + new Transition (4761, 4762), // &lvertneq -> &lvertneqq + new Transition (5064, 5135), // &ne -> &neq + new Transition (5198, 5200), // &nge -> &ngeq + new Transition (5200, 5202), // &ngeq -> &ngeqq + new Transition (5270, 5312), // &nle -> &nleq + new Transition (5312, 5314), // &nleq -> &nleqq + new Transition (5414, 5422), // &NotE -> &NotEq + new Transition (5447, 5448), // &NotGreaterE -> &NotGreaterEq + new Transition (5457, 5458), // &NotGreaterFullE -> &NotGreaterFullEq + new Transition (5481, 5482), // &NotGreaterSlantE -> &NotGreaterSlantEq + new Transition (5506, 5507), // &NotHumpE -> &NotHumpEq + new Transition (5545, 5546), // &NotLeftTriangleE -> &NotLeftTriangleEq + new Transition (5554, 5555), // &NotLessE -> &NotLessEq + new Transition (5578, 5579), // &NotLessSlantE -> &NotLessSlantEq + new Transition (5639, 5640), // &NotPrecedesE -> &NotPrecedesEq + new Transition (5650, 5651), // &NotPrecedesSlantE -> &NotPrecedesSlantEq + new Transition (5688, 5689), // &NotRightTriangleE -> &NotRightTriangleEq + new Transition (5694, 5695), // &NotS -> &NotSq + new Transition (5707, 5708), // &NotSquareSubsetE -> &NotSquareSubsetEq + new Transition (5720, 5721), // &NotSquareSupersetE -> &NotSquareSupersetEq + new Transition (5732, 5733), // &NotSubsetE -> &NotSubsetEq + new Transition (5745, 5746), // &NotSucceedsE -> &NotSucceedsEq + new Transition (5756, 5757), // &NotSucceedsSlantE -> &NotSucceedsSlantEq + new Transition (5775, 5776), // &NotSupersetE -> &NotSupersetEq + new Transition (5787, 5788), // &NotTildeE -> &NotTildeEq + new Transition (5797, 5798), // &NotTildeFullE -> &NotTildeFullEq + new Transition (5852, 5853), // &nprece -> &npreceq + new Transition (5895, 5942), // &ns -> &nsq + new Transition (5930, 5932), // &nsime -> &nsimeq + new Transition (5962, 5963), // &nsubsete -> &nsubseteq + new Transition (5963, 5965), // &nsubseteq -> &nsubseteqq + new Transition (5970, 5971), // &nsucce -> &nsucceq + new Transition (5983, 5984), // &nsupsete -> &nsupseteq + new Transition (5984, 5986), // &nsupseteq -> &nsupseteqq + new Transition (6018, 6019), // &ntrianglelefte -> &ntrianglelefteq + new Transition (6027, 6028), // &ntrianglerighte -> &ntrianglerighteq + new Transition (6669, 6670), // &preccurlye -> &preccurlyeq + new Transition (6679, 6680), // &PrecedesE -> &PrecedesEq + new Transition (6690, 6691), // &PrecedesSlantE -> &PrecedesSlantEq + new Transition (6702, 6703), // &prece -> &preceq + new Transition (6713, 6714), // &precne -> &precneq + new Transition (6714, 6715), // &precneq -> &precneqq + new Transition (6866, 6867), // &queste -> &questeq + new Transition (6882, 6921), // &ra -> &raq + new Transition (7053, 7063), // &rd -> &rdq + new Transition (7102, 7110), // &ReverseE -> &ReverseEq + new Transition (7123, 7124), // &ReverseUpE -> &ReverseUpEq + new Transition (7326, 7327), // &rights -> &rightsq + new Transition (7377, 7378), // &RightTriangleE -> &RightTriangleEq + new Transition (7439, 7440), // &risingdotse -> &risingdotseq + new Transition (7542, 7559), // &rs -> &rsq + new Transition (7543, 7544), // &rsa -> &rsaq + new Transition (7610, 7980), // &S -> &Sq + new Transition (7617, 7968), // &s -> &sq + new Transition (7624, 7625), // &sb -> &sbq + new Transition (7853, 7855), // &sime -> &simeq + new Transition (7994, 7995), // &sqsubsete -> &sqsubseteq + new Transition (8005, 8006), // &sqsupsete -> &sqsupseteq + new Transition (8039, 8040), // &SquareSubsetE -> &SquareSubsetEq + new Transition (8052, 8053), // &SquareSupersetE -> &SquareSupersetEq + new Transition (8173, 8174), // &subsete -> &subseteq + new Transition (8174, 8176), // &subseteq -> &subseteqq + new Transition (8178, 8179), // &SubsetE -> &SubsetEq + new Transition (8185, 8186), // &subsetne -> &subsetneq + new Transition (8186, 8188), // &subsetneq -> &subsetneqq + new Transition (8213, 8214), // &succcurlye -> &succcurlyeq + new Transition (8223, 8224), // &SucceedsE -> &SucceedsEq + new Transition (8234, 8235), // &SucceedsSlantE -> &SucceedsSlantEq + new Transition (8246, 8247), // &succe -> &succeq + new Transition (8257, 8258), // &succne -> &succneq + new Transition (8258, 8259), // &succneq -> &succneqq + new Transition (8314, 8315), // &SupersetE -> &SupersetEq + new Transition (8356, 8357), // &supsete -> &supseteq + new Transition (8357, 8359), // &supseteq -> &supseteqq + new Transition (8362, 8363), // &supsetne -> &supsetneq + new Transition (8363, 8365), // &supsetneq -> &supsetneqq + new Transition (8554, 8555), // &TildeE -> &TildeEq + new Transition (8564, 8565), // &TildeFullE -> &TildeFullEq + new Transition (8638, 8653), // &triangle -> &triangleq + new Transition (8650, 8651), // &trianglelefte -> &trianglelefteq + new Transition (8661, 8662), // &trianglerighte -> &trianglerighteq + new Transition (9034, 9035), // &UpE -> &UpEq + new Transition (9264, 9265), // &varsubsetne -> &varsubsetneq + new Transition (9265, 9267), // &varsubsetneq -> &varsubsetneqq + new Transition (9274, 9275), // &varsupsetne -> &varsupsetneq + new Transition (9275, 9277), // &varsupsetneq -> &varsupsetneqq + new Transition (9352, 9353), // &veee -> &veeeq + new Transition (9508, 9510), // &wedge -> &wedgeq + new Transition (9636, 9640) // &xs -> &xsq + }; + TransitionTable_r = new Transition[942] { + new Transition (0, 6876), // & -> &r + new Transition (1, 237), // &A -> &Ar + new Transition (8, 242), // &a -> &ar + new Transition (15, 16), // &Ab -> &Abr + new Transition (21, 22), // &ab -> &abr + new Transition (34, 35), // &Aci -> &Acir + new Transition (38, 39), // &aci -> &acir + new Transition (60, 65), // &af -> &afr + new Transition (62, 63), // &Af -> &Afr + new Transition (67, 68), // &Ag -> &Agr + new Transition (73, 74), // &ag -> &agr + new Transition (100, 101), // &Amac -> &Amacr + new Transition (105, 106), // &amac -> &amacr + new Transition (136, 164), // &ang -> &angr + new Transition (179, 180), // &angza -> &angzar + new Transition (180, 181), // &angzar -> &angzarr + new Transition (203, 204), // &apaci -> &apacir + new Transition (229, 230), // &app -> &appr + new Transition (248, 249), // &Asc -> &Ascr + new Transition (252, 253), // &asc -> &ascr + new Transition (301, 730), // &b -> &br + new Transition (302, 344), // &ba -> &bar + new Transition (318, 319), // &backp -> &backpr + new Transition (331, 725), // &B -> &Br + new Transition (332, 341), // &Ba -> &Bar + new Transition (360, 361), // &bb -> &bbr + new Transition (365, 366), // &bbrktb -> &bbrktbr + new Transition (384, 409), // &be -> &ber + new Transition (390, 414), // &Be -> &Ber + new Transition (436, 437), // &Bf -> &Bfr + new Transition (439, 440), // &bf -> &bfr + new Transition (448, 449), // &bigci -> &bigcir + new Transition (478, 479), // &bigsta -> &bigstar + new Transition (481, 482), // &bigt -> &bigtr + new Transition (514, 515), // &bka -> &bkar + new Transition (534, 535), // &blacksqua -> &blacksquar + new Transition (538, 539), // &blackt -> &blacktr + new Transition (545, 557), // &blacktriangle -> &blacktriangler + new Transition (618, 630), // &boxD -> &boxDr + new Transition (623, 634), // &boxd -> &boxdr + new Transition (673, 685), // &boxU -> &boxUr + new Transition (678, 689), // &boxu -> &boxur + new Transition (691, 713), // &boxV -> &boxVr + new Transition (693, 717), // &boxv -> &boxvr + new Transition (719, 720), // &bp -> &bpr + new Transition (737, 738), // &brvba -> ¦ + new Transition (741, 742), // &Bsc -> &Bscr + new Transition (745, 746), // &bsc -> &bscr + new Transition (789, 1261), // &C -> &Cr + new Transition (796, 1256), // &c -> &cr + new Transition (797, 848), // &ca -> &car + new Transition (811, 812), // &capb -> &capbr + new Transition (836, 837), // &CapitalDiffe -> &CapitalDiffer + new Transition (862, 872), // &cca -> &ccar + new Transition (867, 868), // &Cca -> &Ccar + new Transition (886, 887), // &Cci -> &Ccir + new Transition (890, 891), // &cci -> &ccir + new Transition (938, 939), // &Cente -> &Center + new Transition (944, 945), // ¢e -> ¢er + new Transition (950, 951), // &Cf -> &Cfr + new Transition (953, 954), // &cf -> &cfr + new Transition (969, 970), // &checkma -> &checkmar + new Transition (978, 979), // &ci -> &cir + new Transition (988, 989), // &circlea -> &circlear + new Transition (989, 990), // &circlear -> &circlearr + new Transition (992, 998), // &circlearrow -> &circlearrowr + new Transition (1010, 1011), // &circledci -> &circledcir + new Transition (1019, 1020), // &Ci -> &Cir + new Transition (1065, 1066), // &cirsci -> &cirscir + new Transition (1081, 1082), // &ClockwiseContou -> &ClockwiseContour + new Transition (1087, 1088), // &ClockwiseContourInteg -> &ClockwiseContourIntegr + new Transition (1095, 1096), // &CloseCu -> &CloseCur + new Transition (1172, 1173), // &Cong -> &Congr + new Transition (1189, 1190), // &Contou -> &Contour + new Transition (1195, 1196), // &ContourInteg -> &ContourIntegr + new Transition (1200, 1210), // &Cop -> &Copr + new Transition (1203, 1206), // &cop -> &copr + new Transition (1223, 1224), // ©s -> ©sr + new Transition (1229, 1230), // &Counte -> &Counter + new Transition (1245, 1246), // &CounterClockwiseContou -> &CounterClockwiseContour + new Transition (1251, 1252), // &CounterClockwiseContourInteg -> &CounterClockwiseContourIntegr + new Transition (1257, 1258), // &cra -> &crar + new Transition (1258, 1259), // &crar -> &crarr + new Transition (1271, 1272), // &Csc -> &Cscr + new Transition (1275, 1276), // &csc -> &cscr + new Transition (1292, 1346), // &cu -> &cur + new Transition (1294, 1295), // &cuda -> &cudar + new Transition (1295, 1296), // &cudar -> &cudarr + new Transition (1296, 1299), // &cudarr -> &cudarrr + new Transition (1302, 1303), // &cuep -> &cuepr + new Transition (1309, 1310), // &cula -> &cular + new Transition (1310, 1311), // &cular -> &cularr + new Transition (1320, 1321), // &cupb -> &cupbr + new Transition (1341, 1342), // &cupo -> &cupor + new Transition (1346, 1377), // &cur -> &curr + new Transition (1347, 1348), // &cura -> &curar + new Transition (1348, 1349), // &curar -> &curarr + new Transition (1357, 1358), // &curlyeqp -> &curlyeqpr + new Transition (1383, 1384), // &curvea -> &curvear + new Transition (1384, 1385), // &curvear -> &curvearr + new Transition (1387, 1393), // &curvearrow -> &curvearrowr + new Transition (1426, 1444), // &Da -> &Dar + new Transition (1429, 1430), // &Dagge -> &Dagger + new Transition (1432, 2023), // &d -> &dr + new Transition (1433, 1451), // &da -> &dar + new Transition (1436, 1437), // &dagge -> &dagger + new Transition (1444, 1445), // &Dar -> &Darr + new Transition (1447, 1448), // &dA -> &dAr + new Transition (1448, 1449), // &dAr -> &dArr + new Transition (1451, 1452), // &dar -> &darr + new Transition (1465, 1466), // &dbka -> &dbkar + new Transition (1475, 1476), // &Dca -> &Dcar + new Transition (1481, 1482), // &dca -> &dcar + new Transition (1494, 1500), // &dda -> &ddar + new Transition (1497, 1498), // &ddagge -> &ddagger + new Transition (1500, 1501), // &ddar -> &ddarr + new Transition (1504, 1505), // &DDot -> &DDotr + new Transition (1535, 1544), // &df -> &dfr + new Transition (1541, 1542), // &Df -> &Dfr + new Transition (1547, 1548), // &dHa -> &dHar + new Transition (1551, 1552), // &dha -> &dhar + new Transition (1552, 1555), // &dhar -> &dharr + new Transition (1559, 1560), // &Diac -> &Diacr + new Transition (1587, 1588), // &DiacriticalG -> &DiacriticalGr + new Transition (1623, 1624), // &Diffe -> &Differ + new Transition (1670, 1675), // &dlc -> &dlcr + new Transition (1671, 1672), // &dlco -> &dlcor + new Transition (1682, 1683), // &dolla -> &dollar + new Transition (1727, 1728), // &dotsqua -> &dotsquar + new Transition (1736, 1737), // &doubleba -> &doublebar + new Transition (1753, 1754), // &DoubleContou -> &DoubleContour + new Transition (1759, 1760), // &DoubleContourInteg -> &DoubleContourIntegr + new Transition (1770, 1771), // &DoubleDownA -> &DoubleDownAr + new Transition (1771, 1772), // &DoubleDownAr -> &DoubleDownArr + new Transition (1780, 1781), // &DoubleLeftA -> &DoubleLeftAr + new Transition (1781, 1782), // &DoubleLeftAr -> &DoubleLeftArr + new Transition (1791, 1792), // &DoubleLeftRightA -> &DoubleLeftRightAr + new Transition (1792, 1793), // &DoubleLeftRightAr -> &DoubleLeftRightArr + new Transition (1808, 1809), // &DoubleLongLeftA -> &DoubleLongLeftAr + new Transition (1809, 1810), // &DoubleLongLeftAr -> &DoubleLongLeftArr + new Transition (1819, 1820), // &DoubleLongLeftRightA -> &DoubleLongLeftRightAr + new Transition (1820, 1821), // &DoubleLongLeftRightAr -> &DoubleLongLeftRightArr + new Transition (1830, 1831), // &DoubleLongRightA -> &DoubleLongRightAr + new Transition (1831, 1832), // &DoubleLongRightAr -> &DoubleLongRightArr + new Transition (1841, 1842), // &DoubleRightA -> &DoubleRightAr + new Transition (1842, 1843), // &DoubleRightAr -> &DoubleRightArr + new Transition (1853, 1854), // &DoubleUpA -> &DoubleUpAr + new Transition (1854, 1855), // &DoubleUpAr -> &DoubleUpArr + new Transition (1863, 1864), // &DoubleUpDownA -> &DoubleUpDownAr + new Transition (1864, 1865), // &DoubleUpDownAr -> &DoubleUpDownArr + new Transition (1870, 1871), // &DoubleVe -> &DoubleVer + new Transition (1878, 1879), // &DoubleVerticalBa -> &DoubleVerticalBar + new Transition (1883, 1884), // &DownA -> &DownAr + new Transition (1884, 1885), // &DownAr -> &DownArr + new Transition (1889, 1890), // &Downa -> &Downar + new Transition (1890, 1891), // &Downar -> &Downarr + new Transition (1897, 1898), // &downa -> &downar + new Transition (1898, 1899), // &downar -> &downarr + new Transition (1904, 1905), // &DownArrowBa -> &DownArrowBar + new Transition (1909, 1910), // &DownArrowUpA -> &DownArrowUpAr + new Transition (1910, 1911), // &DownArrowUpAr -> &DownArrowUpArr + new Transition (1915, 1916), // &DownB -> &DownBr + new Transition (1925, 1926), // &downdowna -> &downdownar + new Transition (1926, 1927), // &downdownar -> &downdownarr + new Transition (1933, 1934), // &downha -> &downhar + new Transition (1938, 1944), // &downharpoon -> &downharpoonr + new Transition (1963, 1964), // &DownLeftRightVecto -> &DownLeftRightVector + new Transition (1973, 1974), // &DownLeftTeeVecto -> &DownLeftTeeVector + new Transition (1980, 1981), // &DownLeftVecto -> &DownLeftVector + new Transition (1984, 1985), // &DownLeftVectorBa -> &DownLeftVectorBar + new Transition (1999, 2000), // &DownRightTeeVecto -> &DownRightTeeVector + new Transition (2006, 2007), // &DownRightVecto -> &DownRightVector + new Transition (2010, 2011), // &DownRightVectorBa -> &DownRightVectorBar + new Transition (2017, 2018), // &DownTeeA -> &DownTeeAr + new Transition (2018, 2019), // &DownTeeAr -> &DownTeeArr + new Transition (2026, 2027), // &drbka -> &drbkar + new Transition (2031, 2036), // &drc -> &drcr + new Transition (2032, 2033), // &drco -> &drcor + new Transition (2041, 2042), // &Dsc -> &Dscr + new Transition (2045, 2046), // &dsc -> &dscr + new Transition (2057, 2058), // &Dst -> &Dstr + new Transition (2062, 2063), // &dst -> &dstr + new Transition (2067, 2072), // &dt -> &dtr + new Transition (2078, 2079), // &dua -> &duar + new Transition (2079, 2080), // &duar -> &duarr + new Transition (2083, 2084), // &duha -> &duhar + new Transition (2102, 2103), // &dzig -> &dzigr + new Transition (2104, 2105), // &dzigra -> &dzigrar + new Transition (2105, 2106), // &dzigrar -> &dzigrarr + new Transition (2115, 2409), // &e -> &er + new Transition (2124, 2125), // &easte -> &easter + new Transition (2128, 2129), // &Eca -> &Ecar + new Transition (2134, 2135), // &eca -> &ecar + new Transition (2139, 2140), // &eci -> &ecir + new Transition (2142, 2143), // &Eci -> &Ecir + new Transition (2175, 2183), // &ef -> &efr + new Transition (2180, 2181), // &Ef -> &Efr + new Transition (2185, 2193), // &eg -> &egr + new Transition (2187, 2188), // &Eg -> &Egr + new Transition (2216, 2217), // &elinte -> &elinter + new Transition (2230, 2231), // &Emac -> &Emacr + new Transition (2235, 2236), // &emac -> &emacr + new Transition (2257, 2258), // &EmptySmallSqua -> &EmptySmallSquar + new Transition (2264, 2265), // &EmptyVe -> &EmptyVer + new Transition (2275, 2276), // &EmptyVerySmallSqua -> &EmptyVerySmallSquar + new Transition (2313, 2314), // &epa -> &epar + new Transition (2341, 2342), // &eqci -> &eqcir + new Transition (2359, 2360), // &eqslantgt -> &eqslantgtr + new Transition (2390, 2391), // &Equilib -> &Equilibr + new Transition (2404, 2405), // &eqvpa -> &eqvpar + new Transition (2410, 2411), // &era -> &erar + new Transition (2411, 2412), // &erar -> &erarr + new Transition (2419, 2420), // &Esc -> &Escr + new Transition (2423, 2424), // &esc -> &escr + new Transition (2451, 2455), // &eu -> &eur + new Transition (2503, 2647), // &f -> &fr + new Transition (2530, 2547), // &ff -> &ffr + new Transition (2544, 2545), // &Ff -> &Ffr + new Transition (2567, 2568), // &FilledSmallSqua -> &FilledSmallSquar + new Transition (2572, 2573), // &FilledVe -> &FilledVer + new Transition (2583, 2584), // &FilledVerySmallSqua -> &FilledVerySmallSquar + new Transition (2608, 2616), // &Fo -> &For + new Transition (2612, 2621), // &fo -> &for + new Transition (2630, 2631), // &Fou -> &Four + new Transition (2633, 2634), // &Fourie -> &Fourier + new Transition (2635, 2636), // &Fouriert -> &Fouriertr + new Transition (2640, 2641), // &fpa -> &fpar + new Transition (2694, 2695), // &Fsc -> &Fscr + new Transition (2698, 2699), // &fsc -> &fscr + new Transition (2701, 2861), // &g -> &gr + new Transition (2708, 2866), // &G -> &Gr + new Transition (2724, 2725), // &Gb -> &Gbr + new Transition (2730, 2731), // &gb -> &gbr + new Transition (2742, 2743), // &Gci -> &Gcir + new Transition (2747, 2748), // &gci -> &gcir + new Transition (2799, 2800), // &Gf -> &Gfr + new Transition (2802, 2803), // &gf -> &gfr + new Transition (2836, 2837), // &gnapp -> &gnappr + new Transition (2870, 2871), // &Greate -> &Greater + new Transition (2893, 2894), // &GreaterG -> &GreaterGr + new Transition (2898, 2899), // &GreaterGreate -> &GreaterGreater + new Transition (2924, 2925), // &Gsc -> &Gscr + new Transition (2928, 2929), // &gsc -> &gscr + new Transition (2942, 2965), // > -> >r + new Transition (2947, 2948), // >ci -> >cir + new Transition (2956, 2957), // >lPa -> >lPar + new Transition (2966, 2973), // >ra -> >rar + new Transition (2968, 2969), // >rapp -> >rappr + new Transition (2973, 2974), // >rar -> >rarr + new Transition (3003, 3004), // &gve -> &gver + new Transition (3021, 3041), // &ha -> &har + new Transition (3022, 3023), // &hai -> &hair + new Transition (3041, 3050), // &har -> &harr + new Transition (3046, 3047), // &hA -> &hAr + new Transition (3047, 3048), // &hAr -> &hArr + new Transition (3053, 3054), // &harrci -> &harrcir + new Transition (3061, 3062), // &hba -> &hbar + new Transition (3065, 3066), // &Hci -> &Hcir + new Transition (3070, 3071), // &hci -> &hcir + new Transition (3074, 3089), // &he -> &her + new Transition (3075, 3076), // &hea -> &hear + new Transition (3094, 3095), // &Hf -> &Hfr + new Transition (3097, 3098), // &hf -> &hfr + new Transition (3103, 3104), // &Hilbe -> &Hilber + new Transition (3115, 3116), // &hksea -> &hksear + new Transition (3121, 3122), // &hkswa -> &hkswar + new Transition (3126, 3166), // &ho -> &hor + new Transition (3127, 3128), // &hoa -> &hoar + new Transition (3128, 3129), // &hoar -> &hoarr + new Transition (3137, 3148), // &hook -> &hookr + new Transition (3142, 3143), // &hooklefta -> &hookleftar + new Transition (3143, 3144), // &hookleftar -> &hookleftarr + new Transition (3153, 3154), // &hookrighta -> &hookrightar + new Transition (3154, 3155), // &hookrightar -> &hookrightarr + new Transition (3159, 3171), // &Ho -> &Hor + new Transition (3168, 3169), // &horba -> &horbar + new Transition (3185, 3186), // &Hsc -> &Hscr + new Transition (3189, 3190), // &hsc -> &hscr + new Transition (3197, 3198), // &Hst -> &Hstr + new Transition (3202, 3203), // &hst -> &hstr + new Transition (3253, 3254), // &Ici -> &Icir + new Transition (3257, 3258), // &ici -> &icir + new Transition (3281, 3287), // &if -> &ifr + new Transition (3284, 3285), // &If -> &Ifr + new Transition (3289, 3290), // &Ig -> &Igr + new Transition (3295, 3296), // &ig -> &igr + new Transition (3333, 3334), // &Imac -> &Imacr + new Transition (3338, 3339), // &imac -> &imacr + new Transition (3347, 3348), // &Imagina -> &Imaginar + new Transition (3358, 3359), // &imagpa -> &imagpar + new Transition (3381, 3382), // &inca -> &incar + new Transition (3407, 3419), // &inte -> &inter + new Transition (3409, 3410), // &intege -> &integer + new Transition (3413, 3424), // &Inte -> &Inter + new Transition (3414, 3415), // &Integ -> &Integr + new Transition (3434, 3435), // &intla -> &intlar + new Transition (3439, 3440), // &intp -> &intpr + new Transition (3492, 3493), // &ip -> &ipr + new Transition (3504, 3505), // &Isc -> &Iscr + new Transition (3508, 3509), // &isc -> &iscr + new Transition (3557, 3558), // &Jci -> &Jcir + new Transition (3563, 3564), // &jci -> &jcir + new Transition (3571, 3572), // &Jf -> &Jfr + new Transition (3574, 3575), // &jf -> &jfr + new Transition (3591, 3592), // &Jsc -> &Jscr + new Transition (3595, 3596), // &jsc -> &jscr + new Transition (3598, 3599), // &Jse -> &Jser + new Transition (3603, 3604), // &jse -> &jser + new Transition (3648, 3649), // &Kf -> &Kfr + new Transition (3651, 3652), // &kf -> &kfr + new Transition (3654, 3655), // &kg -> &kgr + new Transition (3685, 3686), // &Ksc -> &Kscr + new Transition (3689, 3690), // &ksc -> &kscr + new Transition (3692, 4628), // &l -> &lr + new Transition (3693, 3762), // &lA -> &lAr + new Transition (3694, 3695), // &lAa -> &lAar + new Transition (3695, 3696), // &lAar -> &lAarr + new Transition (3699, 3759), // &La -> &Lar + new Transition (3705, 3765), // &la -> &lar + new Transition (3718, 3719), // &lag -> &lagr + new Transition (3751, 3752), // &Laplacet -> &Laplacetr + new Transition (3759, 3760), // &Lar -> &Larr + new Transition (3762, 3763), // &lAr -> &lArr + new Transition (3765, 3766), // &lar -> &larr + new Transition (3808, 3809), // &lBa -> &lBar + new Transition (3809, 3810), // &lBar -> &lBarr + new Transition (3812, 3821), // &lb -> &lbr + new Transition (3813, 3814), // &lba -> &lbar + new Transition (3814, 3815), // &lbar -> &lbarr + new Transition (3817, 3818), // &lbb -> &lbbr + new Transition (3838, 3839), // &Lca -> &Lcar + new Transition (3844, 3845), // &lca -> &lcar + new Transition (3869, 3879), // &ld -> &ldr + new Transition (3875, 3877), // &ldquo -> &ldquor + new Transition (3882, 3883), // &ldrdha -> &ldrdhar + new Transition (3888, 3889), // &ldrusha -> &ldrushar + new Transition (3900, 4041), // &Left -> &Leftr + new Transition (3901, 3914), // &LeftA -> &LeftAr + new Transition (3906, 3907), // &LeftAngleB -> &LeftAngleBr + new Transition (3914, 3915), // &LeftAr -> &LeftArr + new Transition (3919, 3920), // &Lefta -> &Leftar + new Transition (3920, 3921), // &Leftar -> &Leftarr + new Transition (3926, 4052), // &left -> &leftr + new Transition (3927, 3928), // &lefta -> &leftar + new Transition (3928, 3929), // &leftar -> &leftarr + new Transition (3934, 3935), // &LeftArrowBa -> &LeftArrowBar + new Transition (3942, 3943), // &LeftArrowRightA -> &LeftArrowRightAr + new Transition (3943, 3944), // &LeftArrowRightAr -> &LeftArrowRightArr + new Transition (3967, 3968), // &LeftDoubleB -> &LeftDoubleBr + new Transition (3984, 3985), // &LeftDownTeeVecto -> &LeftDownTeeVector + new Transition (3991, 3992), // &LeftDownVecto -> &LeftDownVector + new Transition (3995, 3996), // &LeftDownVectorBa -> &LeftDownVectorBar + new Transition (4001, 4002), // &LeftFloo -> &LeftFloor + new Transition (4005, 4006), // &leftha -> &lefthar + new Transition (4023, 4024), // &leftlefta -> &leftleftar + new Transition (4024, 4025), // &leftleftar -> &leftleftarr + new Transition (4035, 4036), // &LeftRightA -> &LeftRightAr + new Transition (4036, 4037), // &LeftRightAr -> &LeftRightArr + new Transition (4046, 4047), // &Leftrighta -> &Leftrightar + new Transition (4047, 4048), // &Leftrightar -> &Leftrightarr + new Transition (4057, 4058), // &leftrighta -> &leftrightar + new Transition (4058, 4059), // &leftrightar -> &leftrightarr + new Transition (4066, 4067), // &leftrightha -> &leftrighthar + new Transition (4079, 4080), // &leftrightsquiga -> &leftrightsquigar + new Transition (4080, 4081), // &leftrightsquigar -> &leftrightsquigarr + new Transition (4089, 4090), // &LeftRightVecto -> &LeftRightVector + new Transition (4092, 4120), // &LeftT -> &LeftTr + new Transition (4096, 4097), // &LeftTeeA -> &LeftTeeAr + new Transition (4097, 4098), // &LeftTeeAr -> &LeftTeeArr + new Transition (4106, 4107), // &LeftTeeVecto -> &LeftTeeVector + new Transition (4110, 4111), // &leftth -> &leftthr + new Transition (4129, 4130), // &LeftTriangleBa -> &LeftTriangleBar + new Transition (4148, 4149), // &LeftUpDownVecto -> &LeftUpDownVector + new Transition (4158, 4159), // &LeftUpTeeVecto -> &LeftUpTeeVector + new Transition (4165, 4166), // &LeftUpVecto -> &LeftUpVector + new Transition (4169, 4170), // &LeftUpVectorBa -> &LeftUpVectorBar + new Transition (4176, 4177), // &LeftVecto -> &LeftVector + new Transition (4180, 4181), // &LeftVectorBa -> &LeftVectorBar + new Transition (4206, 4208), // &lesdoto -> &lesdotor + new Transition (4218, 4219), // &lessapp -> &lessappr + new Transition (4230, 4231), // &lesseqgt -> &lesseqgtr + new Transition (4235, 4236), // &lesseqqgt -> &lesseqqgtr + new Transition (4245, 4246), // &LessEqualG -> &LessEqualGr + new Transition (4250, 4251), // &LessEqualGreate -> &LessEqualGreater + new Transition (4263, 4264), // &LessG -> &LessGr + new Transition (4268, 4269), // &LessGreate -> &LessGreater + new Transition (4272, 4273), // &lessgt -> &lessgtr + new Transition (4301, 4315), // &lf -> &lfr + new Transition (4309, 4310), // &lfloo -> &lfloor + new Transition (4312, 4313), // &Lf -> &Lfr + new Transition (4322, 4323), // &lHa -> &lHar + new Transition (4326, 4327), // &lha -> &lhar + new Transition (4350, 4351), // &lla -> &llar + new Transition (4351, 4352), // &llar -> &llarr + new Transition (4355, 4356), // &llco -> &llcor + new Transition (4358, 4359), // &llcorne -> &llcorner + new Transition (4364, 4365), // &Llefta -> &Lleftar + new Transition (4365, 4366), // &Lleftar -> &Lleftarr + new Transition (4371, 4372), // &llha -> &llhar + new Transition (4375, 4376), // &llt -> &lltr + new Transition (4405, 4406), // &lnapp -> &lnappr + new Transition (4423, 4427), // &loa -> &loar + new Transition (4427, 4428), // &loar -> &loarr + new Transition (4430, 4431), // &lob -> &lobr + new Transition (4436, 4520), // &Long -> &Longr + new Transition (4441, 4442), // &LongLeftA -> &LongLeftAr + new Transition (4442, 4443), // &LongLeftAr -> &LongLeftArr + new Transition (4450, 4480), // &Longleft -> &Longleftr + new Transition (4451, 4452), // &Longlefta -> &Longleftar + new Transition (4452, 4453), // &Longleftar -> &Longleftarr + new Transition (4458, 4531), // &long -> &longr + new Transition (4462, 4491), // &longleft -> &longleftr + new Transition (4463, 4464), // &longlefta -> &longleftar + new Transition (4464, 4465), // &longleftar -> &longleftarr + new Transition (4474, 4475), // &LongLeftRightA -> &LongLeftRightAr + new Transition (4475, 4476), // &LongLeftRightAr -> &LongLeftRightArr + new Transition (4485, 4486), // &Longleftrighta -> &Longleftrightar + new Transition (4486, 4487), // &Longleftrightar -> &Longleftrightarr + new Transition (4496, 4497), // &longleftrighta -> &longleftrightar + new Transition (4497, 4498), // &longleftrightar -> &longleftrightarr + new Transition (4514, 4515), // &LongRightA -> &LongRightAr + new Transition (4515, 4516), // &LongRightAr -> &LongRightArr + new Transition (4525, 4526), // &Longrighta -> &Longrightar + new Transition (4526, 4527), // &Longrightar -> &Longrightarr + new Transition (4536, 4537), // &longrighta -> &longrightar + new Transition (4537, 4538), // &longrightar -> &longrightarr + new Transition (4544, 4545), // &loopa -> &loopar + new Transition (4545, 4546), // &loopar -> &looparr + new Transition (4548, 4554), // &looparrow -> &looparrowr + new Transition (4561, 4562), // &lopa -> &lopar + new Transition (4585, 4586), // &lowba -> &lowbar + new Transition (4589, 4590), // &Lowe -> &Lower + new Transition (4595, 4596), // &LowerLeftA -> &LowerLeftAr + new Transition (4596, 4597), // &LowerLeftAr -> &LowerLeftArr + new Transition (4606, 4607), // &LowerRightA -> &LowerRightAr + new Transition (4607, 4608), // &LowerRightAr -> &LowerRightArr + new Transition (4622, 4623), // &lpa -> &lpar + new Transition (4629, 4630), // &lra -> &lrar + new Transition (4630, 4631), // &lrar -> &lrarr + new Transition (4634, 4635), // &lrco -> &lrcor + new Transition (4637, 4638), // &lrcorne -> &lrcorner + new Transition (4641, 4642), // &lrha -> &lrhar + new Transition (4648, 4649), // &lrt -> &lrtr + new Transition (4659, 4660), // &Lsc -> &Lscr + new Transition (4662, 4663), // &lsc -> &lscr + new Transition (4680, 4682), // &lsquo -> &lsquor + new Transition (4684, 4685), // &Lst -> &Lstr + new Transition (4689, 4690), // &lst -> &lstr + new Transition (4698, 4731), // < -> <r + new Transition (4703, 4704), // <ci -> <cir + new Transition (4710, 4711), // <h -> <hr + new Transition (4721, 4722), // <la -> <lar + new Transition (4722, 4723), // <lar -> <larr + new Transition (4739, 4740), // <rPa -> <rPar + new Transition (4742, 4743), // &lu -> &lur + new Transition (4747, 4748), // &lurdsha -> &lurdshar + new Transition (4752, 4753), // &luruha -> &luruhar + new Transition (4756, 4757), // &lve -> &lver + new Transition (4768, 4804), // &ma -> &mar + new Transition (4769, 4770), // &mac -> ¯ + new Transition (4806, 4807), // &marke -> &marker + new Transition (4833, 4834), // &measu -> &measur + new Transition (4858, 4859), // &Mellint -> &Mellintr + new Transition (4862, 4863), // &Mf -> &Mfr + new Transition (4865, 4866), // &mf -> &mfr + new Transition (4872, 4873), // &mic -> &micr + new Transition (4883, 4884), // &midci -> &midcir + new Transition (4913, 4914), // &mld -> &mldr + new Transition (4938, 4939), // &Msc -> &Mscr + new Transition (4942, 4943), // &msc -> &mscr + new Transition (4965, 5855), // &n -> &nr + new Transition (4996, 4997), // &napp -> &nappr + new Transition (5002, 5003), // &natu -> &natur + new Transition (5021, 5030), // &nca -> &ncar + new Transition (5025, 5026), // &Nca -> &Ncar + new Transition (5066, 5067), // &nea -> &near + new Transition (5067, 5075), // &near -> &nearr + new Transition (5071, 5072), // &neA -> &neAr + new Transition (5072, 5073), // &neAr -> &neArr + new Transition (5122, 5123), // &NegativeVe -> &NegativeVer + new Transition (5142, 5143), // &nesea -> &nesear + new Transition (5152, 5153), // &NestedG -> &NestedGr + new Transition (5157, 5158), // &NestedGreate -> &NestedGreater + new Transition (5159, 5160), // &NestedGreaterG -> &NestedGreaterGr + new Transition (5164, 5165), // &NestedGreaterGreate -> &NestedGreaterGreater + new Transition (5189, 5190), // &Nf -> &Nfr + new Transition (5192, 5193), // &nf -> &nfr + new Transition (5221, 5223), // &ngt -> &ngtr + new Transition (5228, 5229), // &nhA -> &nhAr + new Transition (5229, 5230), // &nhAr -> &nhArr + new Transition (5232, 5233), // &nha -> &nhar + new Transition (5233, 5234), // &nhar -> &nharr + new Transition (5237, 5238), // &nhpa -> &nhpar + new Transition (5257, 5258), // &nlA -> &nlAr + new Transition (5258, 5259), // &nlAr -> &nlArr + new Transition (5261, 5262), // &nla -> &nlar + new Transition (5262, 5263), // &nlar -> &nlarr + new Transition (5265, 5266), // &nld -> &nldr + new Transition (5275, 5290), // &nLeft -> &nLeftr + new Transition (5276, 5277), // &nLefta -> &nLeftar + new Transition (5277, 5278), // &nLeftar -> &nLeftarr + new Transition (5283, 5301), // &nleft -> &nleftr + new Transition (5284, 5285), // &nlefta -> &nleftar + new Transition (5285, 5286), // &nleftar -> &nleftarr + new Transition (5295, 5296), // &nLeftrighta -> &nLeftrightar + new Transition (5296, 5297), // &nLeftrightar -> &nLeftrightarr + new Transition (5306, 5307), // &nleftrighta -> &nleftrightar + new Transition (5307, 5308), // &nleftrightar -> &nleftrightarr + new Transition (5334, 5336), // &nlt -> &nltr + new Transition (5348, 5349), // &NoB -> &NoBr + new Transition (5355, 5356), // &NonB -> &NonBr + new Transition (5383, 5384), // &NotCong -> &NotCongr + new Transition (5403, 5404), // &NotDoubleVe -> &NotDoubleVer + new Transition (5411, 5412), // &NotDoubleVerticalBa -> &NotDoubleVerticalBar + new Transition (5439, 5440), // &NotG -> &NotGr + new Transition (5444, 5445), // &NotGreate -> &NotGreater + new Transition (5463, 5464), // &NotGreaterG -> &NotGreaterGr + new Transition (5468, 5469), // &NotGreaterGreate -> &NotGreaterGreater + new Transition (5532, 5533), // &NotLeftT -> &NotLeftTr + new Transition (5542, 5543), // &NotLeftTriangleBa -> &NotLeftTriangleBar + new Transition (5560, 5561), // &NotLessG -> &NotLessGr + new Transition (5565, 5566), // &NotLessGreate -> &NotLessGreater + new Transition (5596, 5597), // &NotNestedG -> &NotNestedGr + new Transition (5601, 5602), // &NotNestedGreate -> &NotNestedGreater + new Transition (5603, 5604), // &NotNestedGreaterG -> &NotNestedGreaterGr + new Transition (5608, 5609), // &NotNestedGreaterGreate -> &NotNestedGreaterGreater + new Transition (5630, 5631), // &NotP -> &NotPr + new Transition (5659, 5660), // &NotReve -> &NotRever + new Transition (5675, 5676), // &NotRightT -> &NotRightTr + new Transition (5685, 5686), // &NotRightTriangleBa -> &NotRightTriangleBar + new Transition (5697, 5698), // &NotSqua -> &NotSquar + new Transition (5714, 5715), // &NotSquareSupe -> &NotSquareSuper + new Transition (5769, 5770), // &NotSupe -> &NotSuper + new Transition (5810, 5811), // &NotVe -> &NotVer + new Transition (5818, 5819), // &NotVerticalBa -> &NotVerticalBar + new Transition (5821, 5842), // &np -> &npr + new Transition (5822, 5823), // &npa -> &npar + new Transition (5856, 5857), // &nrA -> &nrAr + new Transition (5857, 5858), // &nrAr -> &nrArr + new Transition (5860, 5861), // &nra -> &nrar + new Transition (5861, 5862), // &nrar -> &nrarr + new Transition (5873, 5874), // &nRighta -> &nRightar + new Transition (5874, 5875), // &nRightar -> &nRightarr + new Transition (5883, 5884), // &nrighta -> &nrightar + new Transition (5884, 5885), // &nrightar -> &nrightarr + new Transition (5889, 5890), // &nrt -> &nrtr + new Transition (5896, 5908), // &nsc -> &nscr + new Transition (5905, 5906), // &Nsc -> &Nscr + new Transition (5911, 5912), // &nsho -> &nshor + new Transition (5919, 5920), // &nshortpa -> &nshortpar + new Transition (5939, 5940), // &nspa -> &nspar + new Transition (5988, 6006), // &nt -> &ntr + new Transition (6012, 6021), // &ntriangle -> &ntriangler + new Transition (6036, 6037), // &nume -> &numer + new Transition (6043, 6097), // &nv -> &nvr + new Transition (6074, 6075), // &nvHa -> &nvHar + new Transition (6075, 6076), // &nvHar -> &nvHarr + new Transition (6085, 6086), // &nvlA -> &nvlAr + new Transition (6086, 6087), // &nvlAr -> &nvlArr + new Transition (6091, 6093), // &nvlt -> &nvltr + new Transition (6098, 6099), // &nvrA -> &nvrAr + new Transition (6099, 6100), // &nvrAr -> &nvrArr + new Transition (6102, 6103), // &nvrt -> &nvrtr + new Transition (6112, 6113), // &nwa -> &nwar + new Transition (6113, 6121), // &nwar -> &nwarr + new Transition (6117, 6118), // &nwA -> &nwAr + new Transition (6118, 6119), // &nwAr -> &nwArr + new Transition (6128, 6129), // &nwnea -> &nwnear + new Transition (6131, 6340), // &O -> &Or + new Transition (6138, 6342), // &o -> &or + new Transition (6149, 6150), // &oci -> &ocir + new Transition (6153, 6154), // &Oci -> &Ocir + new Transition (6200, 6208), // &of -> &ofr + new Transition (6202, 6203), // &ofci -> &ofcir + new Transition (6205, 6206), // &Of -> &Ofr + new Transition (6210, 6220), // &og -> &ogr + new Transition (6214, 6215), // &Og -> &Ogr + new Transition (6229, 6230), // &ohba -> &ohbar + new Transition (6239, 6240), // &ola -> &olar + new Transition (6240, 6241), // &olar -> &olarr + new Transition (6243, 6247), // &olc -> &olcr + new Transition (6244, 6245), // &olci -> &olcir + new Transition (6260, 6261), // &Omac -> &Omacr + new Transition (6265, 6266), // &omac -> &omacr + new Transition (6277, 6278), // &Omic -> &Omicr + new Transition (6283, 6284), // &omic -> &omicr + new Transition (6303, 6304), // &opa -> &opar + new Transition (6310, 6311), // &OpenCu -> &OpenCur + new Transition (6332, 6333), // &ope -> &oper + new Transition (6344, 6345), // &ora -> &orar + new Transition (6345, 6346), // &orar -> &orarr + new Transition (6350, 6351), // &orde -> &order + new Transition (6365, 6366), // &oro -> &oror + new Transition (6379, 6380), // &Osc -> &Oscr + new Transition (6383, 6384), // &osc -> &oscr + new Transition (6432, 6433), // &ovba -> &ovbar + new Transition (6436, 6437), // &Ove -> &Over + new Transition (6438, 6442), // &OverB -> &OverBr + new Transition (6439, 6440), // &OverBa -> &OverBar + new Transition (6452, 6453), // &OverPa -> &OverPar + new Transition (6463, 6642), // &p -> &pr + new Transition (6464, 6465), // &pa -> &par + new Transition (6482, 6640), // &P -> &Pr + new Transition (6483, 6484), // &Pa -> &Par + new Transition (6497, 6498), // &pe -> &per + new Transition (6518, 6519), // &Pf -> &Pfr + new Transition (6521, 6522), // &pf -> &pfr + new Transition (6549, 6550), // &pitchfo -> &pitchfor + new Transition (6571, 6572), // &plusaci -> &plusacir + new Transition (6577, 6578), // &plusci -> &pluscir + new Transition (6613, 6614), // &Poinca -> &Poincar + new Transition (6659, 6660), // &precapp -> &precappr + new Transition (6665, 6666), // &preccu -> &preccur + new Transition (6708, 6709), // &precnapp -> &precnappr + new Transition (6757, 6758), // &profala -> &profalar + new Transition (6766, 6767), // &profsu -> &profsur + new Transition (6773, 6774), // &Propo -> &Propor + new Transition (6790, 6791), // &pru -> &prur + new Transition (6796, 6797), // &Psc -> &Pscr + new Transition (6800, 6801), // &psc -> &pscr + new Transition (6814, 6815), // &Qf -> &Qfr + new Transition (6818, 6819), // &qf -> &qfr + new Transition (6833, 6834), // &qp -> &qpr + new Transition (6840, 6841), // &Qsc -> &Qscr + new Transition (6844, 6845), // &qsc -> &qscr + new Transition (6850, 6851), // &quate -> &quater + new Transition (6876, 7526), // &r -> &rr + new Transition (6877, 6928), // &rA -> &rAr + new Transition (6878, 6879), // &rAa -> &rAar + new Transition (6879, 6880), // &rAar -> &rAarr + new Transition (6882, 6931), // &ra -> &rar + new Transition (6886, 7531), // &R -> &Rr + new Transition (6887, 6925), // &Ra -> &Rar + new Transition (6925, 6926), // &Rar -> &Rarr + new Transition (6928, 6929), // &rAr -> &rArr + new Transition (6931, 6932), // &rar -> &rarr + new Transition (6987, 6988), // &RBa -> &RBar + new Transition (6988, 6989), // &RBar -> &RBarr + new Transition (6992, 6993), // &rBa -> &rBar + new Transition (6993, 6994), // &rBar -> &rBarr + new Transition (6996, 7005), // &rb -> &rbr + new Transition (6997, 6998), // &rba -> &rbar + new Transition (6998, 6999), // &rbar -> &rbarr + new Transition (7001, 7002), // &rbb -> &rbbr + new Transition (7022, 7023), // &Rca -> &Rcar + new Transition (7028, 7029), // &rca -> &rcar + new Transition (7060, 7061), // &rdldha -> &rdldhar + new Transition (7065, 7067), // &rdquo -> &rdquor + new Transition (7083, 7084), // &realpa -> &realpar + new Transition (7098, 7099), // &Reve -> &Rever + new Transition (7115, 7116), // &ReverseEquilib -> &ReverseEquilibr + new Transition (7129, 7130), // &ReverseUpEquilib -> &ReverseUpEquilibr + new Transition (7135, 7149), // &rf -> &rfr + new Transition (7143, 7144), // &rfloo -> &rfloor + new Transition (7146, 7147), // &Rf -> &Rfr + new Transition (7152, 7153), // &rHa -> &rHar + new Transition (7156, 7157), // &rha -> &rhar + new Transition (7175, 7188), // &RightA -> &RightAr + new Transition (7180, 7181), // &RightAngleB -> &RightAngleBr + new Transition (7188, 7189), // &RightAr -> &RightArr + new Transition (7193, 7194), // &Righta -> &Rightar + new Transition (7194, 7195), // &Rightar -> &Rightarr + new Transition (7202, 7314), // &right -> &rightr + new Transition (7203, 7204), // &righta -> &rightar + new Transition (7204, 7205), // &rightar -> &rightarr + new Transition (7210, 7211), // &RightArrowBa -> &RightArrowBar + new Transition (7217, 7218), // &RightArrowLeftA -> &RightArrowLeftAr + new Transition (7218, 7219), // &RightArrowLeftAr -> &RightArrowLeftArr + new Transition (7242, 7243), // &RightDoubleB -> &RightDoubleBr + new Transition (7259, 7260), // &RightDownTeeVecto -> &RightDownTeeVector + new Transition (7266, 7267), // &RightDownVecto -> &RightDownVector + new Transition (7270, 7271), // &RightDownVectorBa -> &RightDownVectorBar + new Transition (7276, 7277), // &RightFloo -> &RightFloor + new Transition (7280, 7281), // &rightha -> &righthar + new Transition (7298, 7299), // &rightlefta -> &rightleftar + new Transition (7299, 7300), // &rightleftar -> &rightleftarr + new Transition (7306, 7307), // &rightleftha -> &rightlefthar + new Transition (7319, 7320), // &rightrighta -> &rightrightar + new Transition (7320, 7321), // &rightrightar -> &rightrightarr + new Transition (7331, 7332), // &rightsquiga -> &rightsquigar + new Transition (7332, 7333), // &rightsquigar -> &rightsquigarr + new Transition (7337, 7365), // &RightT -> &RightTr + new Transition (7341, 7342), // &RightTeeA -> &RightTeeAr + new Transition (7342, 7343), // &RightTeeAr -> &RightTeeArr + new Transition (7351, 7352), // &RightTeeVecto -> &RightTeeVector + new Transition (7355, 7356), // &rightth -> &rightthr + new Transition (7374, 7375), // &RightTriangleBa -> &RightTriangleBar + new Transition (7393, 7394), // &RightUpDownVecto -> &RightUpDownVector + new Transition (7403, 7404), // &RightUpTeeVecto -> &RightUpTeeVector + new Transition (7410, 7411), // &RightUpVecto -> &RightUpVector + new Transition (7414, 7415), // &RightUpVectorBa -> &RightUpVectorBar + new Transition (7421, 7422), // &RightVecto -> &RightVector + new Transition (7425, 7426), // &RightVectorBa -> &RightVectorBar + new Transition (7443, 7444), // &rla -> &rlar + new Transition (7444, 7445), // &rlar -> &rlarr + new Transition (7448, 7449), // &rlha -> &rlhar + new Transition (7470, 7474), // &roa -> &roar + new Transition (7474, 7475), // &roar -> &roarr + new Transition (7477, 7478), // &rob -> &robr + new Transition (7482, 7483), // &ropa -> &ropar + new Transition (7513, 7514), // &rpa -> &rpar + new Transition (7527, 7528), // &rra -> &rrar + new Transition (7528, 7529), // &rrar -> &rrarr + new Transition (7536, 7537), // &Rrighta -> &Rrightar + new Transition (7537, 7538), // &Rrightar -> &Rrightarr + new Transition (7549, 7550), // &Rsc -> &Rscr + new Transition (7552, 7553), // &rsc -> &rscr + new Transition (7563, 7565), // &rsquo -> &rsquor + new Transition (7567, 7578), // &rt -> &rtr + new Transition (7568, 7569), // &rth -> &rthr + new Transition (7586, 7587), // &rtrilt -> &rtriltr + new Transition (7605, 7606), // &ruluha -> &ruluhar + new Transition (7617, 8068), // &s -> &sr + new Transition (7633, 7641), // &sca -> &scar + new Transition (7636, 7637), // &Sca -> &Scar + new Transition (7662, 7663), // &Sci -> &Scir + new Transition (7666, 7667), // &sci -> &scir + new Transition (7704, 7705), // &sea -> &sear + new Transition (7705, 7713), // &sear -> &searr + new Transition (7709, 7710), // &seA -> &seAr + new Transition (7710, 7711), // &seAr -> &seArr + new Transition (7726, 7727), // &seswa -> &seswar + new Transition (7741, 7742), // &Sf -> &Sfr + new Transition (7744, 7745), // &sf -> &sfr + new Transition (7752, 7753), // &sha -> &shar + new Transition (7773, 7774), // &Sho -> &Shor + new Transition (7780, 7781), // &ShortDownA -> &ShortDownAr + new Transition (7781, 7782), // &ShortDownAr -> &ShortDownArr + new Transition (7790, 7791), // &ShortLeftA -> &ShortLeftAr + new Transition (7791, 7792), // &ShortLeftAr -> &ShortLeftArr + new Transition (7796, 7797), // &sho -> &shor + new Transition (7804, 7805), // &shortpa -> &shortpar + new Transition (7817, 7818), // &ShortRightA -> &ShortRightAr + new Transition (7818, 7819), // &ShortRightAr -> &ShortRightArr + new Transition (7825, 7826), // &ShortUpA -> &ShortUpAr + new Transition (7826, 7827), // &ShortUpAr -> &ShortUpArr + new Transition (7847, 7873), // &sim -> &simr + new Transition (7874, 7875), // &simra -> &simrar + new Transition (7875, 7876), // &simrar -> &simrarr + new Transition (7879, 7880), // &sla -> &slar + new Transition (7880, 7881), // &slar -> &slarr + new Transition (7888, 7889), // &SmallCi -> &SmallCir + new Transition (7913, 7914), // &smepa -> &smepar + new Transition (7946, 7947), // &solba -> &solbar + new Transition (7957, 7966), // &spa -> &spar + new Transition (7980, 7981), // &Sq -> &Sqr + new Transition (8011, 8012), // &Squa -> &Squar + new Transition (8015, 8016), // &squa -> &squar + new Transition (8022, 8023), // &SquareInte -> &SquareInter + new Transition (8046, 8047), // &SquareSupe -> &SquareSuper + new Transition (8069, 8070), // &sra -> &srar + new Transition (8070, 8071), // &srar -> &srarr + new Transition (8074, 8075), // &Ssc -> &Sscr + new Transition (8078, 8079), // &ssc -> &sscr + new Transition (8092, 8093), // &ssta -> &sstar + new Transition (8097, 8098), // &Sta -> &Star + new Transition (8100, 8106), // &st -> &str + new Transition (8101, 8102), // &sta -> &star + new Transition (8131, 8160), // &sub -> &subr + new Transition (8161, 8162), // &subra -> &subrar + new Transition (8162, 8163), // &subrar -> &subrarr + new Transition (8203, 8204), // &succapp -> &succappr + new Transition (8209, 8210), // &succcu -> &succcur + new Transition (8252, 8253), // &succnapp -> &succnappr + new Transition (8308, 8309), // &Supe -> &Super + new Transition (8329, 8330), // &supla -> &suplar + new Transition (8330, 8331), // &suplar -> &suplarr + new Transition (8376, 8377), // &swa -> &swar + new Transition (8377, 8385), // &swar -> &swarr + new Transition (8381, 8382), // &swA -> &swAr + new Transition (8382, 8383), // &swAr -> &swArr + new Transition (8392, 8393), // &swnwa -> &swnwar + new Transition (8400, 8676), // &T -> &Tr + new Transition (8404, 8628), // &t -> &tr + new Transition (8405, 8406), // &ta -> &tar + new Transition (8415, 8416), // &tb -> &tbr + new Transition (8420, 8421), // &Tca -> &Tcar + new Transition (8426, 8427), // &tca -> &tcar + new Transition (8450, 8451), // &tel -> &telr + new Transition (8455, 8456), // &Tf -> &Tfr + new Transition (8458, 8459), // &tf -> &tfr + new Transition (8462, 8463), // &the -> &ther + new Transition (8468, 8469), // &The -> &Ther + new Transition (8472, 8473), // &Therefo -> &Therefor + new Transition (8477, 8478), // &therefo -> &therefor + new Transition (8498, 8499), // &thickapp -> &thickappr + new Transition (8540, 8541), // &tho -> &thor + new Transition (8582, 8583), // ×ba -> ×bar + new Transition (8601, 8602), // &topci -> &topcir + new Transition (8610, 8611), // &topfo -> &topfor + new Transition (8617, 8618), // &tp -> &tpr + new Transition (8638, 8655), // &triangle -> &triangler + new Transition (8706, 8707), // &Tsc -> &Tscr + new Transition (8710, 8711), // &tsc -> &tscr + new Transition (8727, 8728), // &Tst -> &Tstr + new Transition (8732, 8733), // &tst -> &tstr + new Transition (8746, 8757), // &twohead -> &twoheadr + new Transition (8751, 8752), // &twoheadlefta -> &twoheadleftar + new Transition (8752, 8753), // &twoheadleftar -> &twoheadleftarr + new Transition (8762, 8763), // &twoheadrighta -> &twoheadrightar + new Transition (8763, 8764), // &twoheadrightar -> &twoheadrightarr + new Transition (8768, 9140), // &U -> &Ur + new Transition (8769, 8782), // &Ua -> &Uar + new Transition (8775, 9127), // &u -> &ur + new Transition (8776, 8789), // &ua -> &uar + new Transition (8782, 8783), // &Uar -> &Uarr + new Transition (8785, 8786), // &uA -> &uAr + new Transition (8786, 8787), // &uAr -> &uArr + new Transition (8789, 8790), // &uar -> &uarr + new Transition (8794, 8795), // &Uarroci -> &Uarrocir + new Transition (8797, 8798), // &Ub -> &Ubr + new Transition (8802, 8803), // &ub -> &ubr + new Transition (8816, 8817), // &Uci -> &Ucir + new Transition (8821, 8822), // &uci -> &ucir + new Transition (8830, 8831), // &uda -> &udar + new Transition (8831, 8832), // &udar -> &udarr + new Transition (8846, 8847), // &udha -> &udhar + new Transition (8849, 8858), // &uf -> &ufr + new Transition (8855, 8856), // &Uf -> &Ufr + new Transition (8860, 8861), // &Ug -> &Ugr + new Transition (8866, 8867), // &ug -> &ugr + new Transition (8873, 8874), // &uHa -> &uHar + new Transition (8877, 8878), // &uha -> &uhar + new Transition (8878, 8881), // &uhar -> &uharr + new Transition (8888, 8896), // &ulc -> &ulcr + new Transition (8889, 8890), // &ulco -> &ulcor + new Transition (8893, 8894), // &ulcorne -> &ulcorner + new Transition (8900, 8901), // &ult -> &ultr + new Transition (8906, 8907), // &Umac -> &Umacr + new Transition (8911, 8912), // &umac -> &umacr + new Transition (8918, 8919), // &Unde -> &Under + new Transition (8920, 8924), // &UnderB -> &UnderBr + new Transition (8921, 8922), // &UnderBa -> &UnderBar + new Transition (8934, 8935), // &UnderPa -> &UnderPar + new Transition (8971, 8972), // &UpA -> &UpAr + new Transition (8972, 8973), // &UpAr -> &UpArr + new Transition (8977, 8978), // &Upa -> &Upar + new Transition (8978, 8979), // &Upar -> &Uparr + new Transition (8984, 8985), // &upa -> &upar + new Transition (8985, 8986), // &upar -> &uparr + new Transition (8991, 8992), // &UpArrowBa -> &UpArrowBar + new Transition (8998, 8999), // &UpArrowDownA -> &UpArrowDownAr + new Transition (8999, 9000), // &UpArrowDownAr -> &UpArrowDownArr + new Transition (9008, 9009), // &UpDownA -> &UpDownAr + new Transition (9009, 9010), // &UpDownAr -> &UpDownArr + new Transition (9018, 9019), // &Updowna -> &Updownar + new Transition (9019, 9020), // &Updownar -> &Updownarr + new Transition (9028, 9029), // &updowna -> &updownar + new Transition (9029, 9030), // &updownar -> &updownarr + new Transition (9040, 9041), // &UpEquilib -> &UpEquilibr + new Transition (9047, 9048), // &upha -> &uphar + new Transition (9052, 9058), // &upharpoon -> &upharpoonr + new Transition (9069, 9070), // &Uppe -> &Upper + new Transition (9075, 9076), // &UpperLeftA -> &UpperLeftAr + new Transition (9076, 9077), // &UpperLeftAr -> &UpperLeftArr + new Transition (9086, 9087), // &UpperRightA -> &UpperRightAr + new Transition (9087, 9088), // &UpperRightAr -> &UpperRightArr + new Transition (9112, 9113), // &UpTeeA -> &UpTeeAr + new Transition (9113, 9114), // &UpTeeAr -> &UpTeeArr + new Transition (9120, 9121), // &upupa -> &upupar + new Transition (9121, 9122), // &upupar -> &upuparr + new Transition (9128, 9136), // &urc -> &urcr + new Transition (9129, 9130), // &urco -> &urcor + new Transition (9133, 9134), // &urcorne -> &urcorner + new Transition (9149, 9150), // &urt -> &urtr + new Transition (9154, 9155), // &Usc -> &Uscr + new Transition (9158, 9159), // &usc -> &uscr + new Transition (9161, 9177), // &ut -> &utr + new Transition (9183, 9184), // &uua -> &uuar + new Transition (9184, 9185), // &uuar -> &uuarr + new Transition (9201, 9445), // &v -> &vr + new Transition (9202, 9208), // &va -> &var + new Transition (9204, 9205), // &vang -> &vangr + new Transition (9208, 9247), // &var -> &varr + new Transition (9231, 9237), // &varp -> &varpr + new Transition (9243, 9244), // &vA -> &vAr + new Transition (9244, 9245), // &vAr -> &vArr + new Transition (9279, 9285), // &vart -> &vartr + new Transition (9291, 9297), // &vartriangle -> &vartriangler + new Transition (9305, 9306), // &Vba -> &Vbar + new Transition (9309, 9310), // &vBa -> &vBar + new Transition (9342, 9360), // &Ve -> &Ver + new Transition (9345, 9365), // &ve -> &ver + new Transition (9349, 9350), // &veeba -> &veebar + new Transition (9362, 9363), // &Verba -> &Verbar + new Transition (9367, 9368), // &verba -> &verbar + new Transition (9379, 9380), // &VerticalBa -> &VerticalBar + new Transition (9390, 9391), // &VerticalSepa -> &VerticalSepar + new Transition (9394, 9395), // &VerticalSeparato -> &VerticalSeparator + new Transition (9414, 9415), // &Vf -> &Vfr + new Transition (9417, 9418), // &vf -> &vfr + new Transition (9421, 9422), // &vlt -> &vltr + new Transition (9440, 9441), // &vp -> &vpr + new Transition (9446, 9447), // &vrt -> &vrtr + new Transition (9451, 9452), // &Vsc -> &Vscr + new Transition (9455, 9456), // &vsc -> &vscr + new Transition (9486, 9487), // &Wci -> &Wcir + new Transition (9490, 9533), // &w -> &wr + new Transition (9492, 9493), // &wci -> &wcir + new Transition (9499, 9500), // &wedba -> &wedbar + new Transition (9513, 9514), // &weie -> &weier + new Transition (9517, 9518), // &Wf -> &Wfr + new Transition (9520, 9521), // &wf -> &wfr + new Transition (9541, 9542), // &Wsc -> &Wscr + new Transition (9545, 9546), // &wsc -> &wscr + new Transition (9548, 9623), // &x -> &xr + new Transition (9553, 9554), // &xci -> &xcir + new Transition (9561, 9562), // &xdt -> &xdtr + new Transition (9566, 9567), // &Xf -> &Xfr + new Transition (9569, 9570), // &xf -> &xfr + new Transition (9573, 9574), // &xhA -> &xhAr + new Transition (9574, 9575), // &xhAr -> &xhArr + new Transition (9577, 9578), // &xha -> &xhar + new Transition (9578, 9579), // &xhar -> &xharr + new Transition (9586, 9587), // &xlA -> &xlAr + new Transition (9587, 9588), // &xlAr -> &xlArr + new Transition (9590, 9591), // &xla -> &xlar + new Transition (9591, 9592), // &xlar -> &xlarr + new Transition (9624, 9625), // &xrA -> &xrAr + new Transition (9625, 9626), // &xrAr -> &xrArr + new Transition (9628, 9629), // &xra -> &xrar + new Transition (9629, 9630), // &xrar -> &xrarr + new Transition (9633, 9634), // &Xsc -> &Xscr + new Transition (9637, 9638), // &xsc -> &xscr + new Transition (9651, 9652), // &xut -> &xutr + new Transition (9686, 9687), // &Yci -> &Ycir + new Transition (9691, 9692), // &yci -> &ycir + new Transition (9702, 9703), // &Yf -> &Yfr + new Transition (9705, 9706), // &yf -> &yfr + new Transition (9725, 9726), // &Ysc -> &Yscr + new Transition (9729, 9730), // &ysc -> &yscr + new Transition (9762, 9763), // &Zca -> &Zcar + new Transition (9768, 9769), // &zca -> &zcar + new Transition (9787, 9788), // &zeet -> &zeetr + new Transition (9791, 9792), // &Ze -> &Zer + new Transition (9811, 9812), // &Zf -> &Zfr + new Transition (9814, 9815), // &zf -> &zfr + new Transition (9826, 9827), // &zig -> &zigr + new Transition (9828, 9829), // &zigra -> &zigrar + new Transition (9829, 9830), // &zigrar -> &zigrarr + new Transition (9841, 9842), // &Zsc -> &Zscr + new Transition (9845, 9846) // &zsc -> &zscr + }; + TransitionTable_s = new Transition[368] { + new Transition (0, 7617), // & -> &s + new Transition (1, 247), // &A -> &As + new Transition (8, 251), // &a -> &as + new Transition (81, 82), // &alef -> &alefs + new Transition (120, 128), // &and -> &ands + new Transition (136, 172), // &ang -> &angs + new Transition (143, 144), // &angm -> &angms + new Transition (213, 214), // &apo -> &apos + new Transition (247, 255), // &As -> &Ass + new Transition (301, 744), // &b -> &bs + new Transition (304, 324), // &back -> &backs + new Transition (311, 312), // &backep -> &backeps + new Transition (331, 740), // &B -> &Bs + new Transition (334, 335), // &Back -> &Backs + new Transition (337, 338), // &Backsla -> &Backslas + new Transition (387, 388), // &becau -> &becaus + new Transition (393, 394), // &Becau -> &Becaus + new Transition (405, 406), // &bep -> &beps + new Transition (420, 421), // &Bernoulli -> &Bernoullis + new Transition (443, 471), // &big -> &bigs + new Transition (462, 463), // &bigoplu -> &bigoplus + new Transition (468, 469), // &bigotime -> &bigotimes + new Transition (500, 501), // &biguplu -> &biguplus + new Transition (522, 531), // &black -> &blacks + new Transition (659, 660), // &boxminu -> &boxminus + new Transition (664, 665), // &boxplu -> &boxplus + new Transition (670, 671), // &boxtime -> &boxtimes + new Transition (762, 763), // &bsolh -> &bsolhs + new Transition (789, 1270), // &C -> &Cs + new Transition (796, 1274), // &c -> &cs + new Transition (805, 846), // &cap -> &caps + new Transition (858, 859), // &Cayley -> &Cayleys + new Transition (863, 864), // &ccap -> &ccaps + new Transition (901, 902), // &ccup -> &ccups + new Transition (902, 904), // &ccups -> &ccupss + new Transition (979, 1063), // &cir -> &cirs + new Transition (1005, 1006), // &circleda -> &circledas + new Transition (1015, 1016), // &circledda -> &circleddas + new Transition (1035, 1036), // &CircleMinu -> &CircleMinus + new Transition (1040, 1041), // &CirclePlu -> &CirclePlus + new Transition (1046, 1047), // &CircleTime -> &CircleTimes + new Transition (1069, 1092), // &Clo -> &Clos + new Transition (1073, 1074), // &Clockwi -> &Clockwis + new Transition (1119, 1120), // &club -> &clubs + new Transition (1161, 1162), // &complexe -> &complexes + new Transition (1221, 1223), // © -> ©s + new Transition (1237, 1238), // &CounterClockwi -> &CounterClockwis + new Transition (1262, 1263), // &Cro -> &Cros + new Transition (1263, 1264), // &Cros -> &Cross + new Transition (1266, 1267), // &cro -> &cros + new Transition (1267, 1268), // &cros -> &cross + new Transition (1301, 1305), // &cue -> &cues + new Transition (1318, 1344), // &cup -> &cups + new Transition (1356, 1362), // &curlyeq -> &curlyeqs + new Transition (1425, 2040), // &D -> &Ds + new Transition (1426, 1457), // &Da -> &Das + new Transition (1432, 2044), // &d -> &ds + new Transition (1433, 1454), // &da -> &das + new Transition (1511, 1512), // &ddot -> &ddots + new Transition (1536, 1537), // &dfi -> &dfis + new Transition (1599, 1639), // &di -> &dis + new Transition (1601, 1617), // &diam -> &diams + new Transition (1610, 1612), // &diamond -> &diamonds + new Transition (1654, 1655), // ÷ontime -> ÷ontimes + new Transition (1694, 1724), // &dot -> &dots + new Transition (1716, 1717), // &dotminu -> &dotminus + new Transition (1721, 1722), // &dotplu -> &dotplus + new Transition (1929, 1930), // &downdownarrow -> &downdownarrows + new Transition (2108, 2418), // &E -> &Es + new Transition (2115, 2422), // &e -> &es + new Transition (2116, 2122), // &ea -> &eas + new Transition (2185, 2198), // &eg -> &egs + new Transition (2204, 2222), // &el -> &els + new Transition (2217, 2218), // &elinter -> &elinters + new Transition (2233, 2279), // &em -> &ems + new Transition (2240, 2242), // &empty -> &emptys + new Transition (2290, 2293), // &en -> &ens + new Transition (2312, 2323), // &ep -> &eps + new Transition (2314, 2316), // &epar -> &epars + new Transition (2320, 2321), // &eplu -> &eplus + new Transition (2326, 2327), // &Ep -> &Eps + new Transition (2339, 2350), // &eq -> &eqs + new Transition (2363, 2364), // &eqslantle -> &eqslantles + new Transition (2364, 2365), // &eqslantles -> &eqslantless + new Transition (2374, 2375), // &equal -> &equals + new Transition (2383, 2384), // &eque -> &eques + new Transition (2405, 2406), // &eqvpar -> &eqvpars + new Transition (2462, 2463), // &exi -> &exis + new Transition (2467, 2468), // &Exi -> &Exis + new Transition (2469, 2470), // &Exist -> &Exists + new Transition (2503, 2697), // &f -> &fs + new Transition (2512, 2513), // &fallingdot -> &fallingdots + new Transition (2517, 2693), // &F -> &Fs + new Transition (2601, 2602), // &fltn -> &fltns + new Transition (2648, 2686), // &fra -> &fras + new Transition (2701, 2927), // &g -> &gs + new Transition (2708, 2923), // &G -> &Gs + new Transition (2765, 2781), // &ge -> &ges + new Transition (2771, 2775), // &geq -> &geqs + new Transition (2796, 2797), // &gesle -> &gesles + new Transition (2832, 2849), // &gn -> &gns + new Transition (2879, 2880), // &GreaterEqualLe -> &GreaterEqualLes + new Transition (2880, 2881), // &GreaterEqualLes -> &GreaterEqualLess + new Transition (2902, 2903), // &GreaterLe -> &GreaterLes + new Transition (2903, 2904), // &GreaterLes -> &GreaterLess + new Transition (2961, 2962), // >que -> >ques + new Transition (2965, 2998), // >r -> >rs + new Transition (2983, 2984), // >reqle -> >reqles + new Transition (2984, 2985), // >reqles -> >reqless + new Transition (2989, 2990), // >reqqle -> >reqqles + new Transition (2990, 2991), // >reqqles -> >reqqless + new Transition (2994, 2995), // >rle -> >rles + new Transition (2995, 2996), // >rles -> >rless + new Transition (3014, 3184), // &H -> &Hs + new Transition (3020, 3188), // &h -> &hs + new Transition (3023, 3024), // &hair -> &hairs + new Transition (3077, 3078), // &heart -> &hearts + new Transition (3112, 3113), // &hk -> &hks + new Transition (3193, 3194), // &hsla -> &hslas + new Transition (3236, 3503), // &I -> &Is + new Transition (3243, 3507), // &i -> &is + new Transition (3375, 3376), // &Implie -> &Implies + new Transition (3410, 3411), // &integer -> &integers + new Transition (3424, 3425), // &Inter -> &Inters + new Transition (3445, 3446), // &Invi -> &Invis + new Transition (3460, 3461), // &InvisibleTime -> &InvisibleTimes + new Transition (3499, 3500), // &ique -> &iques + new Transition (3512, 3520), // &isin -> &isins + new Transition (3555, 3590), // &J -> &Js + new Transition (3561, 3594), // &j -> &js + new Transition (3618, 3684), // &K -> &Ks + new Transition (3624, 3688), // &k -> &ks + new Transition (3692, 4652), // &l -> &ls + new Transition (3698, 4658), // &L -> &Ls + new Transition (3766, 3785), // &larr -> &larrs + new Transition (3770, 3771), // &larrbf -> &larrbfs + new Transition (3773, 3774), // &larrf -> &larrfs + new Transition (3803, 3805), // &late -> &lates + new Transition (3828, 3831), // &lbrk -> &lbrks + new Transition (3869, 3891), // &ld -> &lds + new Transition (3885, 3886), // &ldru -> &ldrus + new Transition (3896, 4197), // &le -> &les + new Transition (3898, 4238), // &Le -> &Les + new Transition (4027, 4028), // &leftleftarrow -> &leftleftarrows + new Transition (4056, 4074), // &leftright -> &leftrights + new Transition (4061, 4063), // &leftrightarrow -> &leftrightarrows + new Transition (4071, 4072), // &leftrightharpoon -> &leftrightharpoons + new Transition (4117, 4118), // &leftthreetime -> &leftthreetimes + new Transition (4187, 4191), // &leq -> &leqs + new Transition (4197, 4215), // &les -> &less + new Transition (4212, 4213), // &lesge -> &lesges + new Transition (4215, 4280), // &less -> &lesss + new Transition (4238, 4239), // &Les -> &Less + new Transition (4276, 4277), // &LessLe -> &LessLes + new Transition (4277, 4278), // &LessLes -> &LessLess + new Transition (4302, 4303), // &lfi -> &lfis + new Transition (4392, 4393), // &lmou -> &lmous + new Transition (4401, 4418), // &ln -> &lns + new Transition (4504, 4505), // &longmap -> &longmaps + new Transition (4570, 4571), // &loplu -> &loplus + new Transition (4576, 4577), // &lotime -> &lotimes + new Transition (4580, 4581), // &lowa -> &lowas + new Transition (4717, 4718), // <ime -> <imes + new Transition (4727, 4728), // <que -> <ques + new Transition (4744, 4745), // &lurd -> &lurds + new Transition (4767, 4941), // &m -> &ms + new Transition (4777, 4778), // &malte -> &maltes + new Transition (4781, 4937), // &M -> &Ms + new Transition (4785, 4787), // &map -> &maps + new Transition (4821, 4822), // &mda -> &mdas + new Transition (4831, 4832), // &mea -> &meas + new Transition (4878, 4879), // &mida -> &midas + new Transition (4891, 4892), // &minu -> &minus + new Transition (4902, 4903), // &Minu -> &Minus + new Transition (4906, 4907), // &MinusPlu -> &MinusPlus + new Transition (4919, 4920), // &mnplu -> &mnplus + new Transition (4925, 4926), // &model -> &models + new Transition (4947, 4948), // &mstpo -> &mstpos + new Transition (4965, 5895), // &n -> &ns + new Transition (4971, 5904), // &N -> &Ns + new Transition (4993, 4994), // &napo -> &napos + new Transition (5006, 5008), // &natural -> &naturals + new Transition (5010, 5011), // &nb -> &nbs + new Transition (5060, 5061), // &nda -> &ndas + new Transition (5064, 5140), // &ne -> &nes + new Transition (5084, 5148), // &Ne -> &Nes + new Transition (5168, 5169), // &NestedLe -> &NestedLes + new Transition (5169, 5170), // &NestedLes -> &NestedLess + new Transition (5172, 5173), // &NestedLessLe -> &NestedLessLes + new Transition (5173, 5174), // &NestedLessLes -> &NestedLessLess + new Transition (5183, 5184), // &nexi -> &nexis + new Transition (5185, 5187), // &nexist -> &nexists + new Transition (5195, 5215), // &ng -> &ngs + new Transition (5198, 5210), // &nge -> &nges + new Transition (5200, 5204), // &ngeq -> &ngeqs + new Transition (5240, 5242), // &ni -> &nis + new Transition (5256, 5328), // &nl -> &nls + new Transition (5270, 5322), // &nle -> &nles + new Transition (5312, 5316), // &nleq -> &nleqs + new Transition (5322, 5324), // &nles -> &nless + new Transition (5434, 5435), // &NotExi -> &NotExis + new Transition (5436, 5437), // &NotExist -> &NotExists + new Transition (5472, 5473), // &NotGreaterLe -> &NotGreaterLes + new Transition (5473, 5474), // &NotGreaterLes -> &NotGreaterLess + new Transition (5529, 5551), // &NotLe -> &NotLes + new Transition (5551, 5552), // &NotLes -> &NotLess + new Transition (5569, 5570), // &NotLessLe -> &NotLessLes + new Transition (5570, 5571), // &NotLessLes -> &NotLessLess + new Transition (5591, 5592), // &NotNe -> &NotNes + new Transition (5612, 5613), // &NotNestedLe -> &NotNestedLes + new Transition (5613, 5614), // &NotNestedLes -> &NotNestedLess + new Transition (5616, 5617), // &NotNestedLessLe -> &NotNestedLessLes + new Transition (5617, 5618), // &NotNestedLessLes -> &NotNestedLessLess + new Transition (5636, 5637), // &NotPrecede -> &NotPrecedes + new Transition (5660, 5661), // &NotRever -> &NotRevers + new Transition (5702, 5703), // &NotSquareSub -> &NotSquareSubs + new Transition (5715, 5716), // &NotSquareSuper -> &NotSquareSupers + new Transition (5727, 5728), // &NotSub -> &NotSubs + new Transition (5742, 5743), // &NotSucceed -> &NotSucceeds + new Transition (5770, 5771), // &NotSuper -> &NotSupers + new Transition (5823, 5831), // &npar -> &npars + new Transition (5942, 5943), // &nsq -> &nsqs + new Transition (5952, 5958), // &nsub -> &nsubs + new Transition (5973, 5979), // &nsup -> &nsups + new Transition (6034, 6040), // &num -> &nums + new Transition (6043, 6107), // &nv -> &nvs + new Transition (6049, 6050), // &nVDa -> &nVDas + new Transition (6054, 6055), // &nVda -> &nVdas + new Transition (6059, 6060), // &nvDa -> &nvDas + new Transition (6064, 6065), // &nvda -> &nvdas + new Transition (6131, 6378), // &O -> &Os + new Transition (6138, 6382), // &o -> &os + new Transition (6139, 6145), // &oa -> &oas + new Transition (6163, 6185), // &od -> &ods + new Transition (6164, 6165), // &oda -> &odas + new Transition (6248, 6249), // &olcro -> &olcros + new Transition (6249, 6250), // &olcros -> &olcross + new Transition (6291, 6292), // &ominu -> &ominus + new Transition (6337, 6338), // &oplu -> &oplus + new Transition (6342, 6368), // &or -> &ors + new Transition (6387, 6388), // &Osla -> &Oslas + new Transition (6392, 6393), // &osla -> &oslas + new Transition (6412, 6413), // &Otime -> &Otimes + new Transition (6416, 6417), // &otime -> &otimes + new Transition (6419, 6420), // &otimesa -> &otimesas + new Transition (6458, 6459), // &OverParenthe -> &OverParenthes + new Transition (6460, 6461), // &OverParenthesi -> &OverParenthesis + new Transition (6463, 6799), // &p -> &ps + new Transition (6465, 6474), // &par -> &pars + new Transition (6482, 6795), // &P -> &Ps + new Transition (6566, 6567), // &plu -> &plus + new Transition (6567, 6599), // &plus -> &pluss + new Transition (6588, 6589), // &Plu -> &Plus + new Transition (6593, 6594), // &PlusMinu -> &PlusMinus + new Transition (6642, 6786), // &pr -> &prs + new Transition (6655, 6721), // &prec -> &precs + new Transition (6676, 6677), // &Precede -> &Precedes + new Transition (6705, 6717), // &precn -> &precns + new Transition (6731, 6733), // &prime -> &primes + new Transition (6735, 6741), // &prn -> &prns + new Transition (6754, 6765), // &prof -> &profs + new Transition (6809, 6810), // &punc -> &puncs + new Transition (6813, 6839), // &Q -> &Qs + new Transition (6817, 6843), // &q -> &qs + new Transition (6855, 6856), // &quaternion -> &quaternions + new Transition (6862, 6863), // &que -> &ques + new Transition (6876, 7542), // &r -> &rs + new Transition (6886, 7548), // &R -> &Rs + new Transition (6932, 6956), // &rarr -> &rarrs + new Transition (6939, 6940), // &rarrbf -> &rarrbfs + new Transition (6944, 6945), // &rarrf -> &rarrfs + new Transition (6983, 6984), // &rational -> &rationals + new Transition (7012, 7015), // &rbrk -> &rbrks + new Transition (7053, 7069), // &rd -> &rds + new Transition (7076, 7087), // &real -> &reals + new Transition (7099, 7100), // &Rever -> &Revers + new Transition (7136, 7137), // &rfi -> &rfis + new Transition (7199, 7431), // &ri -> &ris + new Transition (7202, 7326), // &right -> &rights + new Transition (7302, 7303), // &rightleftarrow -> &rightleftarrows + new Transition (7311, 7312), // &rightleftharpoon -> &rightleftharpoons + new Transition (7323, 7324), // &rightrightarrow -> &rightrightarrows + new Transition (7362, 7363), // &rightthreetime -> &rightthreetimes + new Transition (7437, 7438), // &risingdot -> &risingdots + new Transition (7455, 7456), // &rmou -> &rmous + new Transition (7492, 7493), // &roplu -> &roplus + new Transition (7498, 7499), // &rotime -> &rotimes + new Transition (7509, 7510), // &RoundImplie -> &RoundImplies + new Transition (7575, 7576), // &rtime -> &rtimes + new Transition (7610, 8073), // &S -> &Ss + new Transition (7617, 8077), // &s -> &ss + new Transition (7631, 7687), // &sc -> &scs + new Transition (7670, 7676), // &scn -> &scns + new Transition (7703, 7724), // &se -> &ses + new Transition (7733, 7734), // &setminu -> &setminus + new Transition (7870, 7871), // &simplu -> &simplus + new Transition (7895, 7907), // &sma -> &smas + new Transition (7897, 7898), // &small -> &smalls + new Transition (7904, 7905), // &smallsetminu -> &smallsetminus + new Transition (7914, 7915), // &smepar -> &smepars + new Transition (7926, 7928), // &smte -> &smtes + new Transition (7959, 7960), // &spade -> &spades + new Transition (7968, 7984), // &sq -> &sqs + new Transition (7971, 7973), // &sqcap -> &sqcaps + new Transition (7976, 7978), // &sqcup -> &sqcups + new Transition (7986, 7990), // &sqsub -> &sqsubs + new Transition (7997, 8001), // &sqsup -> &sqsups + new Transition (8023, 8024), // &SquareInter -> &SquareInters + new Transition (8034, 8035), // &SquareSub -> &SquareSubs + new Transition (8047, 8048), // &SquareSuper -> &SquareSupers + new Transition (8113, 8114), // &straightep -> &straighteps + new Transition (8124, 8125), // &strn -> &strns + new Transition (8128, 8165), // &Sub -> &Subs + new Transition (8131, 8169), // &sub -> &subs + new Transition (8157, 8158), // &subplu -> &subplus + new Transition (8199, 8265), // &succ -> &succs + new Transition (8220, 8221), // &Succeed -> &Succeeds + new Transition (8249, 8261), // &succn -> &succns + new Transition (8282, 8348), // &Sup -> &Sups + new Transition (8284, 8352), // &sup -> &sups + new Transition (8292, 8296), // &supd -> &supds + new Transition (8309, 8310), // &Super -> &Supers + new Transition (8320, 8321), // &suph -> &suphs + new Transition (8345, 8346), // &supplu -> &supplus + new Transition (8400, 8705), // &T -> &Ts + new Transition (8404, 8709), // &t -> &ts + new Transition (8485, 8487), // &theta -> &thetas + new Transition (8495, 8503), // &thick -> &thicks + new Transition (8516, 8517), // &thin -> &thins + new Transition (8527, 8531), // &thk -> &thks + new Transition (8577, 8578), // &time -> × + new Transition (8590, 8614), // &to -> &tos + new Transition (8633, 8690), // &tri -> &tris + new Transition (8673, 8674), // &triminu -> &triminus + new Transition (8687, 8688), // &triplu -> &triplus + new Transition (8768, 9153), // &U -> &Us + new Transition (8775, 9157), // &u -> &us + new Transition (8850, 8851), // &ufi -> &ufis + new Transition (8940, 8941), // &UnderParenthe -> &UnderParenthes + new Transition (8942, 8943), // &UnderParenthesi -> &UnderParenthesis + new Transition (8951, 8952), // &UnionPlu -> &UnionPlus + new Transition (8970, 9092), // &Up -> &Ups + new Transition (8983, 9095), // &up -> &ups + new Transition (9065, 9066), // &uplu -> &uplus + new Transition (9124, 9125), // &upuparrow -> &upuparrows + new Transition (9201, 9454), // &v -> &vs + new Transition (9208, 9252), // &var -> &vars + new Transition (9210, 9211), // &varep -> &vareps + new Transition (9259, 9260), // &varsub -> &varsubs + new Transition (9269, 9270), // &varsup -> &varsups + new Transition (9303, 9450), // &V -> &Vs + new Transition (9321, 9322), // &VDa -> &VDas + new Transition (9326, 9327), // &Vda -> &Vdas + new Transition (9331, 9332), // &vDa -> &vDas + new Transition (9336, 9337), // &vda -> &vdas + new Transition (9425, 9426), // &vn -> &vns + new Transition (9473, 9474), // &Vvda -> &Vvdas + new Transition (9484, 9540), // &W -> &Ws + new Transition (9490, 9544), // &w -> &ws + new Transition (9548, 9636), // &x -> &xs + new Transition (9565, 9632), // &X -> &Xs + new Transition (9599, 9600), // &xni -> &xnis + new Transition (9615, 9616), // &xoplu -> &xoplus + new Transition (9648, 9649), // &xuplu -> &xuplus + new Transition (9665, 9724), // &Y -> &Ys + new Transition (9672, 9728), // &y -> &ys + new Transition (9747, 9840), // &Z -> &Zs + new Transition (9754, 9844) // &z -> &zs + }; + TransitionTable_t = new Transition[499] { + new Transition (0, 8404), // & -> &t + new Transition (1, 269), // &A -> &At + new Transition (4, 5), // &Aacu -> &Aacut + new Transition (8, 275), // &a -> &at + new Transition (11, 12), // &aacu -> &aacut + new Transition (42, 43), // &acu -> &acut + new Transition (164, 165), // &angr -> &angrt + new Transition (172, 176), // &angs -> &angst + new Transition (223, 224), // &ApplyFunc -> &ApplyFunct + new Transition (251, 260), // &as -> &ast + new Transition (294, 295), // &awconin -> &awconint + new Transition (298, 299), // &awin -> &awint + new Transition (362, 364), // &bbrk -> &bbrkt + new Transition (384, 426), // &be -> &bet + new Transition (390, 423), // &Be -> &Bet + new Transition (400, 401), // &bemp -> &bempt + new Transition (443, 481), // &big -> &bigt + new Transition (455, 465), // &bigo -> &bigot + new Transition (457, 458), // &bigodo -> &bigodot + new Transition (471, 477), // &bigs -> &bigst + new Transition (522, 538), // &black -> &blackt + new Transition (554, 555), // &blacktrianglelef -> &blacktriangleleft + new Transition (560, 561), // &blacktrianglerigh -> &blacktriangleright + new Transition (588, 589), // &bNo -> &bNot + new Transition (591, 592), // &bno -> &bnot + new Transition (598, 602), // &bo -> &bot + new Transition (602, 604), // &bot -> &bott + new Transition (608, 609), // &bow -> &bowt + new Transition (613, 667), // &box -> &boxt + new Transition (771, 772), // &bulle -> &bullet + new Transition (792, 793), // &Cacu -> &Cacut + new Transition (796, 1287), // &c -> &ct + new Transition (799, 800), // &cacu -> &cacut + new Transition (825, 826), // &capdo -> &capdot + new Transition (828, 829), // &Capi -> &Capit + new Transition (839, 840), // &CapitalDifferen -> &CapitalDifferent + new Transition (849, 850), // &care -> &caret + new Transition (897, 898), // &Cconin -> &Cconint + new Transition (908, 909), // &Cdo -> &Cdot + new Transition (912, 913), // &cdo -> &cdot + new Transition (928, 929), // &cemp -> &cempt + new Transition (933, 934), // &cen -> ¢ + new Transition (936, 937), // &Cen -> &Cent + new Transition (941, 942), // &CenterDo -> &CenterDot + new Transition (947, 948), // ¢erdo -> ¢erdot + new Transition (995, 996), // &circlearrowlef -> &circlearrowleft + new Transition (1001, 1002), // &circlearrowrigh -> &circlearrowright + new Transition (1006, 1007), // &circledas -> &circledast + new Transition (1025, 1026), // &CircleDo -> &CircleDot + new Transition (1056, 1057), // &cirfnin -> &cirfnint + new Transition (1078, 1079), // &ClockwiseCon -> &ClockwiseCont + new Transition (1084, 1085), // &ClockwiseContourIn -> &ClockwiseContourInt + new Transition (1107, 1108), // &CloseCurlyDoubleQuo -> &CloseCurlyDoubleQuot + new Transition (1113, 1114), // &CloseCurlyQuo -> &CloseCurlyQuot + new Transition (1123, 1124), // &clubsui -> &clubsuit + new Transition (1144, 1146), // &comma -> &commat + new Transition (1157, 1158), // &complemen -> &complement + new Transition (1168, 1169), // &congdo -> &congdot + new Transition (1171, 1187), // &Con -> &Cont + new Transition (1176, 1177), // &Congruen -> &Congruent + new Transition (1180, 1181), // &Conin -> &Conint + new Transition (1184, 1185), // &conin -> &conint + new Transition (1192, 1193), // &ContourIn -> &ContourInt + new Transition (1214, 1215), // &Coproduc -> &Coproduct + new Transition (1227, 1228), // &Coun -> &Count + new Transition (1242, 1243), // &CounterClockwiseCon -> &CounterClockwiseCont + new Transition (1248, 1249), // &CounterClockwiseContourIn -> &CounterClockwiseContourInt + new Transition (1289, 1290), // &ctdo -> &ctdot + new Transition (1338, 1339), // &cupdo -> &cupdot + new Transition (1390, 1391), // &curvearrowlef -> &curvearrowleft + new Transition (1396, 1397), // &curvearrowrigh -> &curvearrowright + new Transition (1412, 1413), // &cwconin -> &cwconint + new Transition (1416, 1417), // &cwin -> &cwint + new Transition (1421, 1422), // &cylc -> &cylct + new Transition (1432, 2067), // &d -> &dt + new Transition (1440, 1441), // &dale -> &dalet + new Transition (1503, 1504), // &DDo -> &DDot + new Transition (1510, 1511), // &ddo -> &ddot + new Transition (1520, 1522), // &Del -> &Delt + new Transition (1525, 1526), // &del -> &delt + new Transition (1530, 1531), // &demp -> &dempt + new Transition (1538, 1539), // &dfish -> &dfisht + new Transition (1561, 1562), // &Diacri -> &Diacrit + new Transition (1569, 1570), // &DiacriticalAcu -> &DiacriticalAcut + new Transition (1574, 1575), // &DiacriticalDo -> &DiacriticalDot + new Transition (1583, 1584), // &DiacriticalDoubleAcu -> &DiacriticalDoubleAcut + new Transition (1614, 1615), // &diamondsui -> &diamondsuit + new Transition (1626, 1627), // &Differen -> &Different + new Transition (1650, 1651), // ÷on -> ÷ont + new Transition (1679, 1694), // &do -> &dot + new Transition (1685, 1692), // &Do -> &Dot + new Transition (1697, 1698), // &DotDo -> &DotDot + new Transition (1704, 1705), // &doteqdo -> &doteqdot + new Transition (1750, 1751), // &DoubleCon -> &DoubleCont + new Transition (1756, 1757), // &DoubleContourIn -> &DoubleContourInt + new Transition (1765, 1766), // &DoubleDo -> &DoubleDot + new Transition (1778, 1779), // &DoubleLef -> &DoubleLeft + new Transition (1789, 1790), // &DoubleLeftRigh -> &DoubleLeftRight + new Transition (1806, 1807), // &DoubleLongLef -> &DoubleLongLeft + new Transition (1817, 1818), // &DoubleLongLeftRigh -> &DoubleLongLeftRight + new Transition (1828, 1829), // &DoubleLongRigh -> &DoubleLongRight + new Transition (1839, 1840), // &DoubleRigh -> &DoubleRight + new Transition (1871, 1872), // &DoubleVer -> &DoubleVert + new Transition (1941, 1942), // &downharpoonlef -> &downharpoonleft + new Transition (1947, 1948), // &downharpoonrigh -> &downharpoonright + new Transition (1952, 1953), // &DownLef -> &DownLeft + new Transition (1957, 1958), // &DownLeftRigh -> &DownLeftRight + new Transition (1961, 1962), // &DownLeftRightVec -> &DownLeftRightVect + new Transition (1971, 1972), // &DownLeftTeeVec -> &DownLeftTeeVect + new Transition (1978, 1979), // &DownLeftVec -> &DownLeftVect + new Transition (1990, 1991), // &DownRigh -> &DownRight + new Transition (1997, 1998), // &DownRightTeeVec -> &DownRightTeeVect + new Transition (2004, 2005), // &DownRightVec -> &DownRightVect + new Transition (2040, 2057), // &Ds -> &Dst + new Transition (2044, 2062), // &ds -> &dst + new Transition (2069, 2070), // &dtdo -> &dtdot + new Transition (2108, 2436), // &E -> &Et + new Transition (2111, 2112), // &Eacu -> &Eacut + new Transition (2115, 2439), // &e -> &et + new Transition (2118, 2119), // &eacu -> &eacut + new Transition (2122, 2123), // &eas -> &east + new Transition (2159, 2160), // &eDDo -> &eDDot + new Transition (2163, 2164), // &Edo -> &Edot + new Transition (2166, 2167), // &eDo -> &eDot + new Transition (2170, 2171), // &edo -> &edot + new Transition (2177, 2178), // &efDo -> &efDot + new Transition (2201, 2202), // &egsdo -> &egsdot + new Transition (2210, 2211), // &Elemen -> &Element + new Transition (2214, 2215), // &elin -> &elint + new Transition (2225, 2226), // &elsdo -> &elsdot + new Transition (2238, 2239), // &emp -> &empt + new Transition (2243, 2244), // &emptyse -> &emptyset + new Transition (2246, 2247), // &Emp -> &Empt + new Transition (2356, 2357), // &eqslan -> &eqslant + new Transition (2358, 2359), // &eqslantg -> &eqslantgt + new Transition (2384, 2385), // &eques -> &equest + new Transition (2415, 2416), // &erDo -> &erDot + new Transition (2427, 2428), // &esdo -> &esdot + new Transition (2463, 2464), // &exis -> &exist + new Transition (2468, 2469), // &Exis -> &Exist + new Transition (2474, 2475), // &expec -> &expect + new Transition (2476, 2477), // &expecta -> &expectat + new Transition (2486, 2487), // &Exponen -> &Exponent + new Transition (2496, 2497), // &exponen -> &exponent + new Transition (2511, 2512), // &fallingdo -> &fallingdot + new Transition (2592, 2600), // &fl -> &flt + new Transition (2593, 2594), // &fla -> &flat + new Transition (2634, 2635), // &Fourier -> &Fouriert + new Transition (2641, 2642), // &fpar -> &fpart + new Transition (2644, 2645), // &fpartin -> &fpartint + new Transition (2701, 2942), // &g -> > + new Transition (2704, 2705), // &gacu -> &gacut + new Transition (2708, 2940), // &G -> &Gt + new Transition (2756, 2757), // &Gdo -> &Gdot + new Transition (2760, 2761), // &gdo -> &gdot + new Transition (2778, 2779), // &geqslan -> &geqslant + new Transition (2787, 2788), // &gesdo -> &gesdot + new Transition (2868, 2869), // &Grea -> &Great + new Transition (2896, 2897), // &GreaterGrea -> &GreaterGreat + new Transition (2909, 2910), // &GreaterSlan -> &GreaterSlant + new Transition (2951, 2952), // >do -> >dot + new Transition (2962, 2963), // >ques -> >quest + new Transition (2977, 2978), // >rdo -> >rdot + new Transition (3004, 3005), // &gver -> &gvert + new Transition (3015, 3058), // &Ha -> &Hat + new Transition (3032, 3033), // &hamil -> &hamilt + new Transition (3076, 3077), // &hear -> &heart + new Transition (3081, 3082), // &heartsui -> &heartsuit + new Transition (3104, 3105), // &Hilber -> &Hilbert + new Transition (3131, 3132), // &hom -> &homt + new Transition (3133, 3134), // &homth -> &homtht + new Transition (3140, 3141), // &hooklef -> &hookleft + new Transition (3151, 3152), // &hookrigh -> &hookright + new Transition (3175, 3176), // &Horizon -> &Horizont + new Transition (3184, 3197), // &Hs -> &Hst + new Transition (3188, 3202), // &hs -> &hst + new Transition (3236, 3528), // &I -> &It + new Transition (3239, 3240), // &Iacu -> &Iacut + new Transition (3243, 3526), // &i -> &it + new Transition (3246, 3247), // &iacu -> &iacut + new Transition (3266, 3267), // &Ido -> &Idot + new Transition (3305, 3306), // &iiiin -> &iiiint + new Transition (3308, 3309), // &iiin -> &iiint + new Transition (3316, 3317), // &iio -> &iiot + new Transition (3337, 3362), // &ima -> &imat + new Transition (3359, 3360), // &imagpar -> &imagpart + new Transition (3378, 3401), // &in -> &int + new Transition (3387, 3389), // &infin -> &infint + new Transition (3395, 3396), // &inodo -> &inodot + new Transition (3398, 3399), // &In -> &Int + new Transition (3427, 3428), // &Intersec -> &Intersect + new Transition (3467, 3489), // &io -> &iot + new Transition (3471, 3486), // &Io -> &Iot + new Transition (3500, 3501), // &iques -> ¿ + new Transition (3515, 3516), // &isindo -> &isindot + new Transition (3578, 3579), // &jma -> &jmat + new Transition (3692, 4698), // &l -> < + new Transition (3693, 3794), // &lA -> &lAt + new Transition (3698, 4696), // &L -> &Lt + new Transition (3701, 3702), // &Lacu -> &Lacut + new Transition (3705, 3792), // &la -> &lat + new Transition (3707, 3708), // &lacu -> &lacut + new Transition (3713, 3714), // &laemp -> &laempt + new Transition (3750, 3751), // &Laplace -> &Laplacet + new Transition (3766, 3789), // &larr -> &larrt + new Transition (3899, 3900), // &Lef -> &Left + new Transition (3911, 3912), // &LeftAngleBracke -> &LeftAngleBracket + new Transition (3925, 3926), // &lef -> &left + new Transition (3926, 4109), // &left -> &leftt + new Transition (3931, 3948), // &leftarrow -> &leftarrowt + new Transition (3940, 3941), // &LeftArrowRigh -> &LeftArrowRight + new Transition (3972, 3973), // &LeftDoubleBracke -> &LeftDoubleBracket + new Transition (3982, 3983), // &LeftDownTeeVec -> &LeftDownTeeVect + new Transition (3989, 3990), // &LeftDownVec -> &LeftDownVect + new Transition (4021, 4022), // &leftlef -> &leftleft + new Transition (4033, 4034), // &LeftRigh -> &LeftRight + new Transition (4044, 4045), // &Leftrigh -> &Leftright + new Transition (4055, 4056), // &leftrigh -> &leftright + new Transition (4087, 4088), // &LeftRightVec -> &LeftRightVect + new Transition (4104, 4105), // &LeftTeeVec -> &LeftTeeVect + new Transition (4113, 4114), // &leftthree -> &leftthreet + new Transition (4146, 4147), // &LeftUpDownVec -> &LeftUpDownVect + new Transition (4156, 4157), // &LeftUpTeeVec -> &LeftUpTeeVect + new Transition (4163, 4164), // &LeftUpVec -> &LeftUpVect + new Transition (4174, 4175), // &LeftVec -> &LeftVect + new Transition (4194, 4195), // &leqslan -> &leqslant + new Transition (4203, 4204), // &lesdo -> &lesdot + new Transition (4224, 4225), // &lessdo -> &lessdot + new Transition (4229, 4230), // &lesseqg -> &lesseqgt + new Transition (4234, 4235), // &lesseqqg -> &lesseqqgt + new Transition (4248, 4249), // &LessEqualGrea -> &LessEqualGreat + new Transition (4266, 4267), // &LessGrea -> &LessGreat + new Transition (4271, 4272), // &lessg -> &lessgt + new Transition (4287, 4288), // &LessSlan -> &LessSlant + new Transition (4304, 4305), // &lfish -> &lfisht + new Transition (4348, 4375), // &ll -> &llt + new Transition (4362, 4363), // &Llef -> &Lleft + new Transition (4382, 4383), // &Lmido -> &Lmidot + new Transition (4388, 4389), // &lmido -> &lmidot + new Transition (4393, 4394), // &lmous -> &lmoust + new Transition (4422, 4573), // &lo -> &lot + new Transition (4439, 4440), // &LongLef -> &LongLeft + new Transition (4449, 4450), // &Longlef -> &Longleft + new Transition (4461, 4462), // &longlef -> &longleft + new Transition (4472, 4473), // &LongLeftRigh -> &LongLeftRight + new Transition (4483, 4484), // &Longleftrigh -> &Longleftright + new Transition (4494, 4495), // &longleftrigh -> &longleftright + new Transition (4505, 4506), // &longmaps -> &longmapst + new Transition (4512, 4513), // &LongRigh -> &LongRight + new Transition (4523, 4524), // &Longrigh -> &Longright + new Transition (4534, 4535), // &longrigh -> &longright + new Transition (4551, 4552), // &looparrowlef -> &looparrowleft + new Transition (4557, 4558), // &looparrowrigh -> &looparrowright + new Transition (4581, 4582), // &lowas -> &lowast + new Transition (4593, 4594), // &LowerLef -> &LowerLeft + new Transition (4604, 4605), // &LowerRigh -> &LowerRight + new Transition (4625, 4626), // &lparl -> &lparlt + new Transition (4628, 4648), // &lr -> &lrt + new Transition (4652, 4689), // &ls -> &lst + new Transition (4658, 4684), // &Ls -> &Lst + new Transition (4707, 4708), // <do -> <dot + new Transition (4728, 4729), // <ques -> <quest + new Transition (4757, 4758), // &lver -> &lvert + new Transition (4772, 4775), // &mal -> &malt + new Transition (4787, 4788), // &maps -> &mapst + new Transition (4798, 4799), // &mapstolef -> &mapstoleft + new Transition (4827, 4828), // &mDDo -> &mDDot + new Transition (4857, 4858), // &Mellin -> &Mellint + new Transition (4879, 4880), // &midas -> &midast + new Transition (4887, 4888), // &middo -> · + new Transition (4941, 4945), // &ms -> &mst + new Transition (4954, 4955), // &mul -> &mult + new Transition (4965, 5988), // &n -> &nt + new Transition (4966, 5001), // &na -> &nat + new Transition (4971, 5992), // &N -> &Nt + new Transition (4974, 4975), // &Nacu -> &Nacut + new Transition (4979, 4980), // &nacu -> &nacut + new Transition (5049, 5050), // &ncongdo -> &ncongdot + new Transition (5081, 5082), // &nedo -> &nedot + new Transition (5086, 5087), // &Nega -> &Negat + new Transition (5148, 5149), // &Nes -> &Nest + new Transition (5155, 5156), // &NestedGrea -> &NestedGreat + new Transition (5162, 5163), // &NestedGreaterGrea -> &NestedGreaterGreat + new Transition (5184, 5185), // &nexis -> &nexist + new Transition (5195, 5221), // &ng -> &ngt + new Transition (5207, 5208), // &ngeqslan -> &ngeqslant + new Transition (5212, 5219), // &nG -> &nGt + new Transition (5256, 5334), // &nl -> &nlt + new Transition (5272, 5332), // &nL -> &nLt + new Transition (5274, 5275), // &nLef -> &nLeft + new Transition (5282, 5283), // &nlef -> &nleft + new Transition (5293, 5294), // &nLeftrigh -> &nLeftright + new Transition (5304, 5305), // &nleftrigh -> &nleftright + new Transition (5319, 5320), // &nleqslan -> &nleqslant + new Transition (5347, 5376), // &No -> &Not + new Transition (5372, 5378), // &no -> ¬ + new Transition (5387, 5388), // &NotCongruen -> &NotCongruent + new Transition (5404, 5405), // &NotDoubleVer -> &NotDoubleVert + new Transition (5419, 5420), // &NotElemen -> &NotElement + new Transition (5435, 5436), // &NotExis -> &NotExist + new Transition (5442, 5443), // &NotGrea -> &NotGreat + new Transition (5466, 5467), // &NotGreaterGrea -> &NotGreaterGreat + new Transition (5479, 5480), // &NotGreaterSlan -> &NotGreaterSlant + new Transition (5516, 5517), // ¬indo -> ¬indot + new Transition (5530, 5531), // &NotLef -> &NotLeft + new Transition (5563, 5564), // &NotLessGrea -> &NotLessGreat + new Transition (5576, 5577), // &NotLessSlan -> &NotLessSlant + new Transition (5592, 5593), // &NotNes -> &NotNest + new Transition (5599, 5600), // &NotNestedGrea -> &NotNestedGreat + new Transition (5606, 5607), // &NotNestedGreaterGrea -> &NotNestedGreaterGreat + new Transition (5648, 5649), // &NotPrecedesSlan -> &NotPrecedesSlant + new Transition (5668, 5669), // &NotReverseElemen -> &NotReverseElement + new Transition (5673, 5674), // &NotRigh -> &NotRight + new Transition (5704, 5705), // &NotSquareSubse -> &NotSquareSubset + new Transition (5717, 5718), // &NotSquareSuperse -> &NotSquareSuperset + new Transition (5729, 5730), // &NotSubse -> &NotSubset + new Transition (5754, 5755), // &NotSucceedsSlan -> &NotSucceedsSlant + new Transition (5772, 5773), // &NotSuperse -> &NotSuperset + new Transition (5811, 5812), // &NotVer -> &NotVert + new Transition (5823, 5834), // &npar -> &npart + new Transition (5839, 5840), // &npolin -> &npolint + new Transition (5855, 5889), // &nr -> &nrt + new Transition (5871, 5872), // &nRigh -> &nRight + new Transition (5881, 5882), // &nrigh -> &nright + new Transition (5912, 5913), // &nshor -> &nshort + new Transition (5959, 5960), // &nsubse -> &nsubset + new Transition (5980, 5981), // &nsupse -> &nsupset + new Transition (6015, 6016), // &ntrianglelef -> &ntriangleleft + new Transition (6024, 6025), // &ntrianglerigh -> &ntriangleright + new Transition (6068, 6071), // &nvg -> &nvgt + new Transition (6084, 6091), // &nvl -> &nvlt + new Transition (6097, 6102), // &nvr -> &nvrt + new Transition (6131, 6399), // &O -> &Ot + new Transition (6134, 6135), // &Oacu -> &Oacut + new Transition (6138, 6405), // &o -> &ot + new Transition (6141, 6142), // &oacu -> &oacut + new Transition (6145, 6146), // &oas -> &oast + new Transition (6182, 6183), // &odo -> &odot + new Transition (6210, 6225), // &og -> &ogt + new Transition (6235, 6236), // &oin -> &oint + new Transition (6238, 6256), // &ol -> &olt + new Transition (6322, 6323), // &OpenCurlyDoubleQuo -> &OpenCurlyDoubleQuot + new Transition (6328, 6329), // &OpenCurlyQuo -> &OpenCurlyQuot + new Transition (6448, 6449), // &OverBracke -> &OverBracket + new Transition (6455, 6456), // &OverParen -> &OverParent + new Transition (6465, 6480), // &par -> &part + new Transition (6484, 6485), // &Par -> &Part + new Transition (6498, 6513), // &per -> &pert + new Transition (6500, 6501), // &percn -> &percnt + new Transition (6534, 6535), // &phmma -> &phmmat + new Transition (6543, 6545), // &pi -> &pit + new Transition (6567, 6603), // &plus -> &plust + new Transition (6624, 6625), // &poin -> &point + new Transition (6627, 6628), // &pointin -> &pointint + new Transition (6688, 6689), // &PrecedesSlan -> &PrecedesSlant + new Transition (6751, 6752), // &Produc -> &Product + new Transition (6770, 6783), // &prop -> &propt + new Transition (6774, 6775), // &Propor -> &Proport + new Transition (6822, 6823), // &qin -> &qint + new Transition (6848, 6849), // &qua -> &quat + new Transition (6859, 6860), // &quatin -> &quatint + new Transition (6863, 6864), // &ques -> &quest + new Transition (6873, 6874), // &quo -> " + new Transition (6876, 7567), // &r -> &rt + new Transition (6877, 6968), // &rA -> &rAt + new Transition (6882, 6973), // &ra -> &rat + new Transition (6889, 6890), // &Racu -> &Racut + new Transition (6893, 6894), // &racu -> &racut + new Transition (6903, 6904), // &raemp -> &raempt + new Transition (6926, 6960), // &Rarr -> &Rarrt + new Transition (6932, 6963), // &rarr -> &rarrt + new Transition (7084, 7085), // &realpar -> &realpart + new Transition (7089, 7090), // &rec -> &rect + new Transition (7107, 7108), // &ReverseElemen -> &ReverseElement + new Transition (7138, 7139), // &rfish -> &rfisht + new Transition (7173, 7174), // &Righ -> &Right + new Transition (7185, 7186), // &RightAngleBracke -> &RightAngleBracket + new Transition (7201, 7202), // &righ -> &right + new Transition (7202, 7354), // &right -> &rightt + new Transition (7207, 7223), // &rightarrow -> &rightarrowt + new Transition (7215, 7216), // &RightArrowLef -> &RightArrowLeft + new Transition (7247, 7248), // &RightDoubleBracke -> &RightDoubleBracket + new Transition (7257, 7258), // &RightDownTeeVec -> &RightDownTeeVect + new Transition (7264, 7265), // &RightDownVec -> &RightDownVect + new Transition (7296, 7297), // &rightlef -> &rightleft + new Transition (7317, 7318), // &rightrigh -> &rightright + new Transition (7349, 7350), // &RightTeeVec -> &RightTeeVect + new Transition (7358, 7359), // &rightthree -> &rightthreet + new Transition (7391, 7392), // &RightUpDownVec -> &RightUpDownVect + new Transition (7401, 7402), // &RightUpTeeVec -> &RightUpTeeVect + new Transition (7408, 7409), // &RightUpVec -> &RightUpVect + new Transition (7419, 7420), // &RightVec -> &RightVect + new Transition (7436, 7437), // &risingdo -> &risingdot + new Transition (7456, 7457), // &rmous -> &rmoust + new Transition (7469, 7495), // &ro -> &rot + new Transition (7516, 7517), // &rparg -> &rpargt + new Transition (7523, 7524), // &rppolin -> &rppolint + new Transition (7534, 7535), // &Rrigh -> &Rright + new Transition (7585, 7586), // &rtril -> &rtrilt + new Transition (7610, 8096), // &S -> &St + new Transition (7613, 7614), // &Sacu -> &Sacut + new Transition (7617, 8100), // &s -> &st + new Transition (7620, 7621), // &sacu -> &sacut + new Transition (7684, 7685), // &scpolin -> &scpolint + new Transition (7696, 7697), // &sdo -> &sdot + new Transition (7703, 7729), // &se -> &set + new Transition (7718, 7719), // &sec -> § + new Transition (7738, 7739), // &sex -> &sext + new Transition (7774, 7775), // &Shor -> &Short + new Transition (7788, 7789), // &ShortLef -> &ShortLeft + new Transition (7797, 7798), // &shor -> &short + new Transition (7815, 7816), // &ShortRigh -> &ShortRight + new Transition (7850, 7851), // &simdo -> &simdot + new Transition (7894, 7924), // &sm -> &smt + new Transition (7899, 7900), // &smallse -> &smallset + new Transition (7937, 7938), // &sof -> &soft + new Transition (7963, 7964), // &spadesui -> &spadesuit + new Transition (7981, 7982), // &Sqr -> &Sqrt + new Transition (7991, 7992), // &sqsubse -> &sqsubset + new Transition (8002, 8003), // &sqsupse -> &sqsupset + new Transition (8020, 8021), // &SquareIn -> &SquareInt + new Transition (8026, 8027), // &SquareIntersec -> &SquareIntersect + new Transition (8036, 8037), // &SquareSubse -> &SquareSubset + new Transition (8049, 8050), // &SquareSuperse -> &SquareSuperset + new Transition (8077, 8091), // &ss -> &sst + new Transition (8081, 8082), // &sse -> &sset + new Transition (8110, 8111), // &straigh -> &straight + new Transition (8134, 8135), // &subdo -> &subdot + new Transition (8142, 8143), // &subedo -> &subedot + new Transition (8147, 8148), // &submul -> &submult + new Transition (8166, 8167), // &Subse -> &Subset + new Transition (8170, 8171), // &subse -> &subset + new Transition (8232, 8233), // &SucceedsSlan -> &SucceedsSlant + new Transition (8272, 8273), // &SuchTha -> &SuchThat + new Transition (8293, 8294), // &supdo -> &supdot + new Transition (8305, 8306), // &supedo -> &supedot + new Transition (8311, 8312), // &Superse -> &Superset + new Transition (8335, 8336), // &supmul -> &supmult + new Transition (8349, 8350), // &Supse -> &Supset + new Transition (8353, 8354), // &supse -> &supset + new Transition (8408, 8409), // &targe -> &target + new Transition (8446, 8447), // &tdo -> &tdot + new Transition (8462, 8484), // &the -> &thet + new Transition (8468, 8481), // &The -> &Thet + new Transition (8587, 8588), // &tin -> &tint + new Transition (8597, 8598), // &topbo -> &topbot + new Transition (8633, 8693), // &tri -> &trit + new Transition (8647, 8648), // &trianglelef -> &triangleleft + new Transition (8658, 8659), // &trianglerigh -> &triangleright + new Transition (8665, 8666), // &trido -> &tridot + new Transition (8682, 8683), // &TripleDo -> &TripleDot + new Transition (8705, 8727), // &Ts -> &Tst + new Transition (8709, 8732), // &ts -> &tst + new Transition (8739, 8740), // &twix -> &twixt + new Transition (8749, 8750), // &twoheadlef -> &twoheadleft + new Transition (8760, 8761), // &twoheadrigh -> &twoheadright + new Transition (8768, 9166), // &U -> &Ut + new Transition (8771, 8772), // &Uacu -> &Uacut + new Transition (8775, 9161), // &u -> &ut + new Transition (8778, 8779), // &uacu -> &uacut + new Transition (8852, 8853), // &ufish -> &ufisht + new Transition (8887, 8900), // &ul -> &ult + new Transition (8930, 8931), // &UnderBracke -> &UnderBracket + new Transition (8937, 8938), // &UnderParen -> &UnderParent + new Transition (9055, 9056), // &upharpoonlef -> &upharpoonleft + new Transition (9061, 9062), // &upharpoonrigh -> &upharpoonright + new Transition (9073, 9074), // &UpperLef -> &UpperLeft + new Transition (9084, 9085), // &UpperRigh -> &UpperRight + new Transition (9127, 9149), // &ur -> &urt + new Transition (9163, 9164), // &utdo -> &utdot + new Transition (9205, 9206), // &vangr -> &vangrt + new Transition (9208, 9279), // &var -> &vart + new Transition (9224, 9225), // &varno -> &varnot + new Transition (9239, 9240), // &varprop -> &varpropt + new Transition (9261, 9262), // &varsubse -> &varsubset + new Transition (9271, 9272), // &varsupse -> &varsupset + new Transition (9281, 9282), // &varthe -> &varthet + new Transition (9294, 9295), // &vartrianglelef -> &vartriangleleft + new Transition (9300, 9301), // &vartrianglerigh -> &vartriangleright + new Transition (9360, 9370), // &Ver -> &Vert + new Transition (9365, 9372), // &ver -> &vert + new Transition (9392, 9393), // &VerticalSepara -> &VerticalSeparat + new Transition (9420, 9421), // &vl -> &vlt + new Transition (9445, 9446), // &vr -> &vrt + new Transition (9536, 9537), // &wrea -> &wreat + new Transition (9560, 9561), // &xd -> &xdt + new Transition (9602, 9618), // &xo -> &xot + new Transition (9604, 9605), // &xodo -> &xodot + new Transition (9645, 9651), // &xu -> &xut + new Transition (9668, 9669), // &Yacu -> &Yacut + new Transition (9675, 9676), // &yacu -> &yacut + new Transition (9750, 9751), // &Zacu -> &Zacut + new Transition (9757, 9758), // &zacu -> &zacut + new Transition (9778, 9779), // &Zdo -> &Zdot + new Transition (9782, 9783), // &zdo -> &zdot + new Transition (9785, 9808), // &ze -> &zet + new Transition (9786, 9787), // &zee -> &zeet + new Transition (9791, 9805), // &Ze -> &Zet + new Transition (9796, 9797) // &ZeroWid -> &ZeroWidt + }; + TransitionTable_u = new Transition[278] { + new Transition (0, 8775), // & -> &u + new Transition (1, 281), // &A -> &Au + new Transition (3, 4), // &Aac -> &Aacu + new Transition (8, 285), // &a -> &au + new Transition (10, 11), // &aac -> &aacu + new Transition (27, 42), // &ac -> &acu + new Transition (220, 221), // &ApplyF -> &ApplyFu + new Transition (301, 767), // &b -> &bu + new Transition (331, 781), // &B -> &Bu + new Transition (380, 381), // &bdq -> &bdqu + new Transition (386, 387), // &beca -> &becau + new Transition (392, 393), // &Beca -> &Becau + new Transition (411, 412), // &berno -> &bernou + new Transition (416, 417), // &Berno -> &Bernou + new Transition (443, 497), // &big -> &bigu + new Transition (444, 452), // &bigc -> &bigcu + new Transition (461, 462), // &bigopl -> &bigoplu + new Transition (473, 474), // &bigsqc -> &bigsqcu + new Transition (488, 494), // &bigtriangle -> &bigtriangleu + new Transition (499, 500), // &bigupl -> &biguplu + new Transition (532, 533), // &blacksq -> &blacksqu + new Transition (582, 583), // &bneq -> &bnequ + new Transition (613, 678), // &box -> &boxu + new Transition (636, 650), // &boxH -> &boxHu + new Transition (638, 654), // &boxh -> &boxhu + new Transition (658, 659), // &boxmin -> &boxminu + new Transition (663, 664), // &boxpl -> &boxplu + new Transition (763, 764), // &bsolhs -> &bsolhsu + new Transition (789, 1315), // &C -> &Cu + new Transition (791, 792), // &Cac -> &Cacu + new Transition (796, 1292), // &c -> &cu + new Transition (798, 799), // &cac -> &cacu + new Transition (813, 814), // &capbrc -> &capbrcu + new Transition (817, 821), // &capc -> &capcu + new Transition (861, 900), // &cc -> &ccu + new Transition (1034, 1035), // &CircleMin -> &CircleMinu + new Transition (1039, 1040), // &CirclePl -> &CirclePlu + new Transition (1080, 1081), // &ClockwiseConto -> &ClockwiseContou + new Transition (1094, 1095), // &CloseC -> &CloseCu + new Transition (1100, 1101), // &CloseCurlyDo -> &CloseCurlyDou + new Transition (1105, 1106), // &CloseCurlyDoubleQ -> &CloseCurlyDoubleQu + new Transition (1111, 1112), // &CloseCurlyQ -> &CloseCurlyQu + new Transition (1117, 1118), // &cl -> &clu + new Transition (1120, 1122), // &clubs -> &clubsu + new Transition (1126, 1226), // &Co -> &Cou + new Transition (1173, 1174), // &Congr -> &Congru + new Transition (1188, 1189), // &Conto -> &Contou + new Transition (1212, 1213), // &Coprod -> &Coprodu + new Transition (1244, 1245), // &CounterClockwiseConto -> &CounterClockwiseContou + new Transition (1274, 1278), // &cs -> &csu + new Transition (1330, 1334), // &cupc -> &cupcu + new Transition (1362, 1363), // &curlyeqs -> &curlyeqsu + new Transition (1432, 2077), // &d -> &du + new Transition (1568, 1569), // &DiacriticalAc -> &DiacriticalAcu + new Transition (1574, 1577), // &DiacriticalDo -> &DiacriticalDou + new Transition (1582, 1583), // &DiacriticalDoubleAc -> &DiacriticalDoubleAcu + new Transition (1612, 1613), // &diamonds -> &diamondsu + new Transition (1679, 1731), // &do -> &dou + new Transition (1685, 1744), // &Do -> &Dou + new Transition (1708, 1709), // &DotEq -> &DotEqu + new Transition (1715, 1716), // &dotmin -> &dotminu + new Transition (1720, 1721), // &dotpl -> &dotplu + new Transition (1725, 1726), // &dotsq -> &dotsqu + new Transition (1752, 1753), // &DoubleConto -> &DoubleContou + new Transition (2108, 2447), // &E -> &Eu + new Transition (2110, 2111), // &Eac -> &Eacu + new Transition (2115, 2451), // &e -> &eu + new Transition (2117, 2118), // &eac -> &eacu + new Transition (2255, 2256), // &EmptySmallSq -> &EmptySmallSqu + new Transition (2273, 2274), // &EmptyVerySmallSq -> &EmptyVerySmallSqu + new Transition (2319, 2320), // &epl -> &eplu + new Transition (2339, 2372), // &eq -> &equ + new Transition (2367, 2368), // &Eq -> &Equ + new Transition (2392, 2393), // &Equilibri -> &Equilibriu + new Transition (2565, 2566), // &FilledSmallSq -> &FilledSmallSqu + new Transition (2581, 2582), // &FilledVerySmallSq -> &FilledVerySmallSqu + new Transition (2608, 2630), // &Fo -> &Fou + new Transition (2703, 2704), // &gac -> &gacu + new Transition (2873, 2874), // &GreaterEq -> &GreaterEqu + new Transition (2883, 2884), // &GreaterF -> &GreaterFu + new Transition (2888, 2889), // &GreaterFullEq -> &GreaterFullEqu + new Transition (2912, 2913), // &GreaterSlantEq -> &GreaterSlantEqu + new Transition (2959, 2960), // >q -> >qu + new Transition (3014, 3207), // &H -> &Hu + new Transition (3078, 3080), // &hearts -> &heartsu + new Transition (3214, 3215), // &HumpDownH -> &HumpDownHu + new Transition (3220, 3221), // &HumpEq -> &HumpEqu + new Transition (3226, 3227), // &hyb -> &hybu + new Transition (3236, 3539), // &I -> &Iu + new Transition (3238, 3239), // &Iac -> &Iacu + new Transition (3243, 3544), // &i -> &iu + new Transition (3245, 3246), // &iac -> &iacu + new Transition (3497, 3498), // &iq -> &iqu + new Transition (3555, 3608), // &J -> &Ju + new Transition (3561, 3613), // &j -> &ju + new Transition (3692, 4742), // &l -> &lu + new Transition (3700, 3701), // &Lac -> &Lacu + new Transition (3706, 3707), // &lac -> &lacu + new Transition (3755, 3756), // &laq -> &laqu + new Transition (3832, 3835), // &lbrksl -> &lbrkslu + new Transition (3843, 3862), // &lc -> &lcu + new Transition (3873, 3874), // &ldq -> &ldqu + new Transition (3879, 3885), // &ldr -> &ldru + new Transition (3962, 3963), // &LeftDo -> &LeftDou + new Transition (4010, 4016), // &leftharpoon -> &leftharpoonu + new Transition (4075, 4076), // &leftrightsq -> &leftrightsqu + new Transition (4133, 4134), // &LeftTriangleEq -> &LeftTriangleEqu + new Transition (4241, 4242), // &LessEq -> &LessEqu + new Transition (4253, 4254), // &LessF -> &LessFu + new Transition (4258, 4259), // &LessFullEq -> &LessFullEqu + new Transition (4290, 4291), // &LessSlantEq -> &LessSlantEqu + new Transition (4327, 4330), // &lhar -> &lharu + new Transition (4391, 4392), // &lmo -> &lmou + new Transition (4569, 4570), // &lopl -> &loplu + new Transition (4654, 4655), // &lsaq -> &lsaqu + new Transition (4676, 4679), // &lsq -> &lsqu + new Transition (4725, 4726), // <q -> <qu + new Transition (4743, 4750), // &lur -> &luru + new Transition (4767, 4952), // &m -> &mu + new Transition (4781, 4950), // &M -> &Mu + new Transition (4789, 4801), // &mapsto -> &mapstou + new Transition (4832, 4833), // &meas -> &measu + new Transition (4845, 4846), // &Medi -> &Mediu + new Transition (4890, 4891), // &min -> &minu + new Transition (4896, 4898), // &minusd -> &minusdu + new Transition (4901, 4902), // &Min -> &Minu + new Transition (4905, 4906), // &MinusPl -> &MinusPlu + new Transition (4918, 4919), // &mnpl -> &mnplu + new Transition (4965, 6032), // &n -> &nu + new Transition (4971, 6030), // &N -> &Nu + new Transition (4973, 4974), // &Nac -> &Nacu + new Transition (4978, 4979), // &nac -> &nacu + new Transition (5001, 5002), // &nat -> &natu + new Transition (5010, 5014), // &nb -> &nbu + new Transition (5020, 5052), // &nc -> &ncu + new Transition (5094, 5095), // &NegativeMedi -> &NegativeMediu + new Transition (5135, 5136), // &neq -> &nequ + new Transition (5380, 5390), // &NotC -> &NotCu + new Transition (5384, 5385), // &NotCongr -> &NotCongru + new Transition (5397, 5398), // &NotDo -> &NotDou + new Transition (5422, 5423), // &NotEq -> &NotEqu + new Transition (5448, 5449), // &NotGreaterEq -> &NotGreaterEqu + new Transition (5453, 5454), // &NotGreaterF -> &NotGreaterFu + new Transition (5458, 5459), // &NotGreaterFullEq -> &NotGreaterFullEqu + new Transition (5482, 5483), // &NotGreaterSlantEq -> &NotGreaterSlantEqu + new Transition (5493, 5494), // &NotH -> &NotHu + new Transition (5501, 5502), // &NotHumpDownH -> &NotHumpDownHu + new Transition (5507, 5508), // &NotHumpEq -> &NotHumpEqu + new Transition (5546, 5547), // &NotLeftTriangleEq -> &NotLeftTriangleEqu + new Transition (5555, 5556), // &NotLessEq -> &NotLessEqu + new Transition (5579, 5580), // &NotLessSlantEq -> &NotLessSlantEqu + new Transition (5640, 5641), // &NotPrecedesEq -> &NotPrecedesEqu + new Transition (5651, 5652), // &NotPrecedesSlantEq -> &NotPrecedesSlantEqu + new Transition (5689, 5690), // &NotRightTriangleEq -> &NotRightTriangleEqu + new Transition (5694, 5726), // &NotS -> &NotSu + new Transition (5695, 5696), // &NotSq -> &NotSqu + new Transition (5700, 5701), // &NotSquareS -> &NotSquareSu + new Transition (5708, 5709), // &NotSquareSubsetEq -> &NotSquareSubsetEqu + new Transition (5721, 5722), // &NotSquareSupersetEq -> &NotSquareSupersetEqu + new Transition (5733, 5734), // &NotSubsetEq -> &NotSubsetEqu + new Transition (5746, 5747), // &NotSucceedsEq -> &NotSucceedsEqu + new Transition (5757, 5758), // &NotSucceedsSlantEq -> &NotSucceedsSlantEqu + new Transition (5776, 5777), // &NotSupersetEq -> &NotSupersetEqu + new Transition (5788, 5789), // &NotTildeEq -> &NotTildeEqu + new Transition (5793, 5794), // &NotTildeF -> &NotTildeFu + new Transition (5798, 5799), // &NotTildeFullEq -> &NotTildeFullEqu + new Transition (5844, 5845), // &nprc -> &nprcu + new Transition (5895, 5951), // &ns -> &nsu + new Transition (5898, 5899), // &nscc -> &nsccu + new Transition (5943, 5944), // &nsqs -> &nsqsu + new Transition (6131, 6422), // &O -> &Ou + new Transition (6133, 6134), // &Oac -> &Oacu + new Transition (6138, 6426), // &o -> &ou + new Transition (6140, 6141), // &oac -> &oacu + new Transition (6290, 6291), // &omin -> &ominu + new Transition (6309, 6310), // &OpenC -> &OpenCu + new Transition (6315, 6316), // &OpenCurlyDo -> &OpenCurlyDou + new Transition (6320, 6321), // &OpenCurlyDoubleQ -> &OpenCurlyDoubleQu + new Transition (6326, 6327), // &OpenCurlyQ -> &OpenCurlyQu + new Transition (6336, 6337), // &opl -> &oplu + new Transition (6463, 6807), // &p -> &pu + new Transition (6555, 6566), // &pl -> &plu + new Transition (6580, 6583), // &plusd -> &plusdu + new Transition (6587, 6588), // &Pl -> &Plu + new Transition (6592, 6593), // &PlusMin -> &PlusMinu + new Transition (6622, 6636), // &po -> &pou + new Transition (6642, 6790), // &pr -> &pru + new Transition (6647, 6648), // &prc -> &prcu + new Transition (6664, 6665), // &precc -> &preccu + new Transition (6680, 6681), // &PrecedesEq -> &PrecedesEqu + new Transition (6691, 6692), // &PrecedesSlantEq -> &PrecedesSlantEqu + new Transition (6749, 6750), // &Prod -> &Produ + new Transition (6765, 6766), // &profs -> &profsu + new Transition (6817, 6847), // &q -> &qu + new Transition (6876, 7601), // &r -> &ru + new Transition (6883, 6893), // &rac -> &racu + new Transition (6886, 7590), // &R -> &Ru + new Transition (6888, 6889), // &Rac -> &Racu + new Transition (6921, 6922), // &raq -> &raqu + new Transition (7016, 7019), // &rbrksl -> &rbrkslu + new Transition (7027, 7046), // &rc -> &rcu + new Transition (7063, 7064), // &rdq -> &rdqu + new Transition (7110, 7111), // &ReverseEq -> &ReverseEqu + new Transition (7117, 7118), // &ReverseEquilibri -> &ReverseEquilibriu + new Transition (7124, 7125), // &ReverseUpEq -> &ReverseUpEqu + new Transition (7131, 7132), // &ReverseUpEquilibri -> &ReverseUpEquilibriu + new Transition (7157, 7160), // &rhar -> &rharu + new Transition (7237, 7238), // &RightDo -> &RightDou + new Transition (7285, 7291), // &rightharpoon -> &rightharpoonu + new Transition (7327, 7328), // &rightsq -> &rightsqu + new Transition (7378, 7379), // &RightTriangleEq -> &RightTriangleEqu + new Transition (7454, 7455), // &rmo -> &rmou + new Transition (7485, 7501), // &Ro -> &Rou + new Transition (7491, 7492), // &ropl -> &roplu + new Transition (7544, 7545), // &rsaq -> &rsaqu + new Transition (7559, 7562), // &rsq -> &rsqu + new Transition (7602, 7603), // &rul -> &rulu + new Transition (7610, 8127), // &S -> &Su + new Transition (7612, 7613), // &Sac -> &Sacu + new Transition (7617, 8130), // &s -> &su + new Transition (7619, 7620), // &sac -> &sacu + new Transition (7625, 7626), // &sbq -> &sbqu + new Transition (7645, 7646), // &scc -> &sccu + new Transition (7732, 7733), // &setmin -> &setminu + new Transition (7869, 7870), // &simpl -> &simplu + new Transition (7903, 7904), // &smallsetmin -> &smallsetminu + new Transition (7960, 7962), // &spades -> &spadesu + new Transition (7968, 8008), // &sq -> &squ + new Transition (7969, 7975), // &sqc -> &sqcu + new Transition (7980, 8010), // &Sq -> &Squ + new Transition (7984, 7985), // &sqs -> &sqsu + new Transition (8032, 8033), // &SquareS -> &SquareSu + new Transition (8040, 8041), // &SquareSubsetEq -> &SquareSubsetEqu + new Transition (8053, 8054), // &SquareSupersetEq -> &SquareSupersetEqu + new Transition (8145, 8146), // &subm -> &submu + new Transition (8156, 8157), // &subpl -> &subplu + new Transition (8169, 8193), // &subs -> &subsu + new Transition (8179, 8180), // &SubsetEq -> &SubsetEqu + new Transition (8208, 8209), // &succc -> &succcu + new Transition (8224, 8225), // &SucceedsEq -> &SucceedsEqu + new Transition (8235, 8236), // &SucceedsSlantEq -> &SucceedsSlantEqu + new Transition (8296, 8297), // &supds -> &supdsu + new Transition (8315, 8316), // &SupersetEq -> &SupersetEqu + new Transition (8321, 8325), // &suphs -> &suphsu + new Transition (8333, 8334), // &supm -> &supmu + new Transition (8344, 8345), // &suppl -> &supplu + new Transition (8352, 8370), // &sups -> &supsu + new Transition (8401, 8411), // &Ta -> &Tau + new Transition (8405, 8413), // &ta -> &tau + new Transition (8555, 8556), // &TildeEq -> &TildeEqu + new Transition (8560, 8561), // &TildeF -> &TildeFu + new Transition (8565, 8566), // &TildeFullEq -> &TildeFullEqu + new Transition (8672, 8673), // &trimin -> &triminu + new Transition (8686, 8687), // &tripl -> &triplu + new Transition (8701, 8702), // &trpezi -> &trpeziu + new Transition (8768, 9187), // &U -> &Uu + new Transition (8770, 8771), // &Uac -> &Uacu + new Transition (8775, 9182), // &u -> &uu + new Transition (8777, 8778), // &uac -> &uacu + new Transition (8950, 8951), // &UnionPl -> &UnionPlu + new Transition (8983, 9118), // &up -> &upu + new Transition (9035, 9036), // &UpEq -> &UpEqu + new Transition (9042, 9043), // &UpEquilibri -> &UpEquilibriu + new Transition (9064, 9065), // &upl -> &uplu + new Transition (9252, 9258), // &vars -> &varsu + new Transition (9426, 9427), // &vns -> &vnsu + new Transition (9454, 9458), // &vs -> &vsu + new Transition (9548, 9645), // &x -> &xu + new Transition (9549, 9557), // &xc -> &xcu + new Transition (9614, 9615), // &xopl -> &xoplu + new Transition (9641, 9642), // &xsqc -> &xsqcu + new Transition (9647, 9648), // &xupl -> &xuplu + new Transition (9665, 9740), // &Y -> &Yu + new Transition (9667, 9668), // &Yac -> &Yacu + new Transition (9672, 9736), // &y -> &yu + new Transition (9674, 9675), // &yac -> &yacu + new Transition (9749, 9750), // &Zac -> &Zacu + new Transition (9756, 9757) // &zac -> &zacu + }; + TransitionTable_v = new Transition[75] { + new Transition (0, 9201), // & -> &v + new Transition (17, 18), // &Abre -> &Abrev + new Transition (23, 24), // &abre -> &abrev + new Transition (69, 70), // &Agra -> &Agrav + new Transition (75, 76), // &agra -> &agrav + new Transition (120, 134), // &and -> &andv + new Transition (165, 167), // &angrt -> &angrtv + new Transition (341, 342), // &Bar -> &Barv + new Transition (344, 345), // &bar -> &barv + new Transition (402, 403), // &bempty -> &bemptyv + new Transition (443, 503), // &big -> &bigv + new Transition (584, 585), // &bnequi -> &bnequiv + new Transition (613, 693), // &box -> &boxv + new Transition (726, 727), // &Bre -> &Brev + new Transition (730, 735), // &br -> &brv + new Transition (731, 732), // &bre -> &brev + new Transition (930, 931), // &cempty -> &cemptyv + new Transition (1292, 1399), // &cu -> &cuv + new Transition (1346, 1381), // &cur -> &curv + new Transition (1354, 1367), // &curly -> &curlyv + new Transition (1455, 1461), // &dash -> &dashv + new Transition (1458, 1459), // &Dash -> &Dashv + new Transition (1532, 1533), // &dempty -> &demptyv + new Transition (1589, 1590), // &DiacriticalGra -> &DiacriticalGrav + new Transition (1599, 1643), // &di -> &div + new Transition (1917, 1918), // &DownBre -> &DownBrev + new Transition (2189, 2190), // &Egra -> &Egrav + new Transition (2194, 2195), // &egra -> &egrav + new Transition (2240, 2261), // &empty -> &emptyv + new Transition (2324, 2337), // &epsi -> &epsiv + new Transition (2339, 2402), // &eq -> &eqv + new Transition (2396, 2397), // &equi -> &equiv + new Transition (2626, 2628), // &fork -> &forkv + new Transition (2701, 3002), // &g -> &gv + new Transition (2726, 2727), // &Gbre -> &Gbrev + new Transition (2732, 2733), // &gbre -> &gbrev + new Transition (2862, 2863), // &gra -> &grav + new Transition (3291, 3292), // &Igra -> &Igrav + new Transition (3297, 3298), // &igra -> &igrav + new Transition (3398, 3444), // &In -> &Inv + new Transition (3512, 3524), // &isin -> &isinv + new Transition (3520, 3522), // &isins -> &isinsv + new Transition (3628, 3630), // &kappa -> &kappav + new Transition (3692, 4755), // &l -> &lv + new Transition (3715, 3716), // &laempty -> &laemptyv + new Transition (4965, 6043), // &n -> &nv + new Transition (5088, 5089), // &Negati -> &Negativ + new Transition (5137, 5138), // &nequi -> &nequiv + new Transition (5219, 5225), // &nGt -> &nGtv + new Transition (5240, 5246), // &ni -> &niv + new Transition (5332, 5341), // &nLt -> &nLtv + new Transition (5513, 5521), // ¬in -> ¬inv + new Transition (5621, 5623), // ¬ni -> ¬niv + new Transition (5657, 5658), // &NotRe -> &NotRev + new Transition (6131, 6435), // &O -> &Ov + new Transition (6138, 6430), // &o -> &ov + new Transition (6179, 6180), // &odi -> &odiv + new Transition (6216, 6217), // &Ogra -> &Ograv + new Transition (6221, 6222), // &ogra -> &ograv + new Transition (6342, 6374), // &or -> &orv + new Transition (6528, 6530), // &phi -> &phiv + new Transition (6543, 6553), // &pi -> &piv + new Transition (6563, 6564), // &plank -> &plankv + new Transition (6905, 6906), // &raempty -> &raemptyv + new Transition (7072, 7097), // &Re -> &Rev + new Transition (7167, 7169), // &rho -> &rhov + new Transition (7841, 7845), // &sigma -> &sigmav + new Transition (8485, 8491), // &theta -> &thetav + new Transition (8807, 8808), // &Ubre -> &Ubrev + new Transition (8811, 8812), // &ubre -> &ubrev + new Transition (8862, 8863), // &Ugra -> &Ugrav + new Transition (8868, 8869), // &ugra -> &ugrav + new Transition (9303, 9471), // &V -> &Vv + new Transition (9310, 9312), // &vBar -> &vBarv + new Transition (9548, 9655) // &x -> &xv + }; + TransitionTable_w = new Transition[137] { + new Transition (0, 9490), // & -> &w + new Transition (8, 289), // &a -> &aw + new Transition (341, 349), // &Bar -> &Barw + new Transition (344, 353), // &bar -> &barw + new Transition (426, 431), // &bet -> &betw + new Transition (443, 507), // &big -> &bigw + new Transition (490, 491), // &bigtriangledo -> &bigtriangledow + new Transition (516, 517), // &bkaro -> &bkarow + new Transition (548, 549), // &blacktriangledo -> &blacktriangledow + new Transition (598, 608), // &bo -> &bow + new Transition (796, 1407), // &c -> &cw + new Transition (991, 992), // &circlearro -> &circlearrow + new Transition (1071, 1072), // &Clock -> &Clockw + new Transition (1235, 1236), // &CounterClock -> &CounterClockw + new Transition (1292, 1403), // &cu -> &cuw + new Transition (1354, 1371), // &curly -> &curlyw + new Transition (1386, 1387), // &curvearro -> &curvearrow + new Transition (1432, 2086), // &d -> &dw + new Transition (1467, 1468), // &dbkaro -> &dbkarow + new Transition (1679, 1895), // &do -> &dow + new Transition (1685, 1881), // &Do -> &Dow + new Transition (1737, 1738), // &doublebar -> &doublebarw + new Transition (1765, 1768), // &DoubleDo -> &DoubleDow + new Transition (1773, 1774), // &DoubleDownArro -> &DoubleDownArrow + new Transition (1783, 1784), // &DoubleLeftArro -> &DoubleLeftArrow + new Transition (1794, 1795), // &DoubleLeftRightArro -> &DoubleLeftRightArrow + new Transition (1811, 1812), // &DoubleLongLeftArro -> &DoubleLongLeftArrow + new Transition (1822, 1823), // &DoubleLongLeftRightArro -> &DoubleLongLeftRightArrow + new Transition (1833, 1834), // &DoubleLongRightArro -> &DoubleLongRightArrow + new Transition (1844, 1845), // &DoubleRightArro -> &DoubleRightArrow + new Transition (1856, 1857), // &DoubleUpArro -> &DoubleUpArrow + new Transition (1860, 1861), // &DoubleUpDo -> &DoubleUpDow + new Transition (1866, 1867), // &DoubleUpDownArro -> &DoubleUpDownArrow + new Transition (1886, 1887), // &DownArro -> &DownArrow + new Transition (1892, 1893), // &Downarro -> &Downarrow + new Transition (1900, 1901), // &downarro -> &downarrow + new Transition (1912, 1913), // &DownArrowUpArro -> &DownArrowUpArrow + new Transition (1922, 1923), // &downdo -> &downdow + new Transition (1928, 1929), // &downdownarro -> &downdownarrow + new Transition (2020, 2021), // &DownTeeArro -> &DownTeeArrow + new Transition (2028, 2029), // &drbkaro -> &drbkarow + new Transition (2689, 2690), // &fro -> &frow + new Transition (3050, 3056), // &harr -> &harrw + new Transition (3113, 3120), // &hks -> &hksw + new Transition (3117, 3118), // &hksearo -> &hksearow + new Transition (3123, 3124), // &hkswaro -> &hkswarow + new Transition (3145, 3146), // &hookleftarro -> &hookleftarrow + new Transition (3156, 3157), // &hookrightarro -> &hookrightarrow + new Transition (3211, 3212), // &HumpDo -> &HumpDow + new Transition (3916, 3917), // &LeftArro -> &LeftArrow + new Transition (3922, 3923), // &Leftarro -> &Leftarrow + new Transition (3930, 3931), // &leftarro -> &leftarrow + new Transition (3945, 3946), // &LeftArrowRightArro -> &LeftArrowRightArrow + new Transition (3962, 3975), // &LeftDo -> &LeftDow + new Transition (4012, 4013), // &leftharpoondo -> &leftharpoondow + new Transition (4026, 4027), // &leftleftarro -> &leftleftarrow + new Transition (4038, 4039), // &LeftRightArro -> &LeftRightArrow + new Transition (4049, 4050), // &Leftrightarro -> &Leftrightarrow + new Transition (4060, 4061), // &leftrightarro -> &leftrightarrow + new Transition (4082, 4083), // &leftrightsquigarro -> &leftrightsquigarrow + new Transition (4099, 4100), // &LeftTeeArro -> &LeftTeeArrow + new Transition (4141, 4142), // &LeftUpDo -> &LeftUpDow + new Transition (4367, 4368), // &Lleftarro -> &Lleftarrow + new Transition (4422, 4579), // &lo -> &low + new Transition (4434, 4588), // &Lo -> &Low + new Transition (4444, 4445), // &LongLeftArro -> &LongLeftArrow + new Transition (4454, 4455), // &Longleftarro -> &Longleftarrow + new Transition (4466, 4467), // &longleftarro -> &longleftarrow + new Transition (4477, 4478), // &LongLeftRightArro -> &LongLeftRightArrow + new Transition (4488, 4489), // &Longleftrightarro -> &Longleftrightarrow + new Transition (4499, 4500), // &longleftrightarro -> &longleftrightarrow + new Transition (4517, 4518), // &LongRightArro -> &LongRightArrow + new Transition (4528, 4529), // &Longrightarro -> &Longrightarrow + new Transition (4539, 4540), // &longrightarro -> &longrightarrow + new Transition (4547, 4548), // &looparro -> &looparrow + new Transition (4598, 4599), // &LowerLeftArro -> &LowerLeftArrow + new Transition (4609, 4610), // &LowerRightArro -> &LowerRightArrow + new Transition (4792, 4793), // &mapstodo -> &mapstodow + new Transition (4965, 6111), // &n -> &nw + new Transition (5077, 5078), // &nearro -> &nearrow + new Transition (5084, 5176), // &Ne -> &New + new Transition (5279, 5280), // &nLeftarro -> &nLeftarrow + new Transition (5287, 5288), // &nleftarro -> &nleftarrow + new Transition (5298, 5299), // &nLeftrightarro -> &nLeftrightarrow + new Transition (5309, 5310), // &nleftrightarro -> &nleftrightarrow + new Transition (5498, 5499), // &NotHumpDo -> &NotHumpDow + new Transition (5862, 5866), // &nrarr -> &nrarrw + new Transition (5876, 5877), // &nRightarro -> &nRightarrow + new Transition (5886, 5887), // &nrightarro -> &nrightarrow + new Transition (6123, 6124), // &nwarro -> &nwarrow + new Transition (6603, 6604), // &plust -> &plustw + new Transition (6932, 6966), // &rarr -> &rarrw + new Transition (7190, 7191), // &RightArro -> &RightArrow + new Transition (7196, 7197), // &Rightarro -> &Rightarrow + new Transition (7206, 7207), // &rightarro -> &rightarrow + new Transition (7220, 7221), // &RightArrowLeftArro -> &RightArrowLeftArrow + new Transition (7237, 7250), // &RightDo -> &RightDow + new Transition (7287, 7288), // &rightharpoondo -> &rightharpoondow + new Transition (7301, 7302), // &rightleftarro -> &rightleftarrow + new Transition (7322, 7323), // &rightrightarro -> &rightrightarrow + new Transition (7334, 7335), // &rightsquigarro -> &rightsquigarrow + new Transition (7344, 7345), // &RightTeeArro -> &RightTeeArrow + new Transition (7386, 7387), // &RightUpDo -> &RightUpDow + new Transition (7539, 7540), // &Rrightarro -> &Rrightarrow + new Transition (7617, 8375), // &s -> &sw + new Transition (7715, 7716), // &searro -> &searrow + new Transition (7724, 7725), // &ses -> &sesw + new Transition (7747, 7748), // &sfro -> &sfrow + new Transition (7777, 7778), // &ShortDo -> &ShortDow + new Transition (7783, 7784), // &ShortDownArro -> &ShortDownArrow + new Transition (7793, 7794), // &ShortLeftArro -> &ShortLeftArrow + new Transition (7820, 7821), // &ShortRightArro -> &ShortRightArrow + new Transition (7828, 7829), // &ShortUpArro -> &ShortUpArrow + new Transition (8387, 8388), // &swarro -> &swarrow + new Transition (8390, 8391), // &swn -> &swnw + new Transition (8404, 8737), // &t -> &tw + new Transition (8641, 8642), // &triangledo -> &triangledow + new Transition (8754, 8755), // &twoheadleftarro -> &twoheadleftarrow + new Transition (8765, 8766), // &twoheadrightarro -> &twoheadrightarrow + new Transition (8775, 9194), // &u -> &uw + new Transition (8974, 8975), // &UpArro -> &UpArrow + new Transition (8980, 8981), // &Uparro -> &Uparrow + new Transition (8987, 8988), // &uparro -> &uparrow + new Transition (8995, 8996), // &UpArrowDo -> &UpArrowDow + new Transition (9001, 9002), // &UpArrowDownArro -> &UpArrowDownArrow + new Transition (9005, 9006), // &UpDo -> &UpDow + new Transition (9011, 9012), // &UpDownArro -> &UpDownArrow + new Transition (9015, 9016), // &Updo -> &Updow + new Transition (9021, 9022), // &Updownarro -> &Updownarrow + new Transition (9025, 9026), // &updo -> &updow + new Transition (9031, 9032), // &updownarro -> &updownarrow + new Transition (9078, 9079), // &UpperLeftArro -> &UpperLeftArrow + new Transition (9089, 9090), // &UpperRightArro -> &UpperRightArrow + new Transition (9115, 9116), // &UpTeeArro -> &UpTeeArrow + new Transition (9123, 9124), // &upuparro -> &upuparrow + new Transition (9548, 9659), // &x -> &xw + new Transition (9754, 9848) // &z -> &zw + }; + TransitionTable_x = new Transition[24] { + new Transition (0, 9548), // & -> &x + new Transition (231, 232), // &appro -> &approx + new Transition (598, 613), // &bo -> &box + new Transition (615, 616), // &boxbo -> &boxbox + new Transition (1154, 1160), // &comple -> &complex + new Transition (1658, 1659), // &divon -> &divonx + new Transition (2108, 2466), // &E -> &Ex + new Transition (2115, 2458), // &e -> &ex + new Transition (2838, 2839), // &gnappro -> &gnapprox + new Transition (2970, 2971), // >rappro -> >rapprox + new Transition (3273, 3277), // &ie -> &iex + new Transition (4220, 4221), // &lessappro -> &lessapprox + new Transition (4407, 4408), // &lnappro -> &lnapprox + new Transition (4998, 4999), // &nappro -> &napprox + new Transition (5064, 5182), // &ne -> &nex + new Transition (5414, 5433), // &NotE -> &NotEx + new Transition (6661, 6662), // &precappro -> &precapprox + new Transition (6710, 6711), // &precnappro -> &precnapprox + new Transition (6876, 7608), // &r -> &rx + new Transition (7703, 7738), // &se -> &sex + new Transition (8205, 8206), // &succappro -> &succapprox + new Transition (8254, 8255), // &succnappro -> &succnapprox + new Transition (8500, 8501), // &thickappro -> &thickapprox + new Transition (8738, 8739) // &twi -> &twix + }; + TransitionTable_y = new Transition[122] { + new Transition (0, 9672), // & -> &y + new Transition (27, 48), // &ac -> &acy + new Transition (33, 46), // &Ac -> &Acy + new Transition (82, 83), // &alefs -> &alefsy + new Transition (218, 219), // &Appl -> &Apply + new Transition (251, 262), // &as -> &asy + new Transition (369, 377), // &bc -> &bcy + new Transition (374, 375), // &Bc -> &Bcy + new Transition (401, 402), // &bempt -> &bempty + new Transition (790, 855), // &Ca -> &Cay + new Transition (796, 1419), // &c -> &cy + new Transition (857, 858), // &Cayle -> &Cayley + new Transition (929, 930), // &cempt -> &cempty + new Transition (957, 958), // &CHc -> &CHcy + new Transition (961, 962), // &chc -> &chcy + new Transition (1097, 1098), // &CloseCurl -> &CloseCurly + new Transition (1203, 1221), // &cop -> © + new Transition (1353, 1354), // &curl -> &curly + new Transition (1422, 1423), // &cylct -> &cylcty + new Transition (1474, 1486), // &Dc -> &Dcy + new Transition (1480, 1488), // &dc -> &dcy + new Transition (1531, 1532), // &dempt -> &dempty + new Transition (1662, 1663), // &DJc -> &DJcy + new Transition (1666, 1667), // &djc -> &djcy + new Transition (2045, 2052), // &dsc -> &dscy + new Transition (2049, 2050), // &DSc -> &DScy + new Transition (2094, 2095), // &DZc -> &DZcy + new Transition (2098, 2099), // &dzc -> &dzcy + new Transition (2127, 2153), // &Ec -> &Ecy + new Transition (2133, 2155), // &ec -> &ecy + new Transition (2239, 2240), // &empt -> &empty + new Transition (2247, 2248), // &Empt -> &Empty + new Transition (2265, 2266), // &EmptyVer -> &EmptyVery + new Transition (2518, 2519), // &Fc -> &Fcy + new Transition (2521, 2522), // &fc -> &fcy + new Transition (2573, 2574), // &FilledVer -> &FilledVery + new Transition (2736, 2751), // &Gc -> &Gcy + new Transition (2746, 2753), // &gc -> &gcy + new Transition (2817, 2818), // &GJc -> &GJcy + new Transition (2821, 2822), // &gjc -> &gjcy + new Transition (3020, 3225), // &h -> &hy + new Transition (3038, 3039), // &HARDc -> &HARDcy + new Transition (3043, 3044), // &hardc -> &hardcy + new Transition (3250, 3263), // &ic -> &icy + new Transition (3252, 3261), // &Ic -> &Icy + new Transition (3270, 3271), // &IEc -> &IEcy + new Transition (3274, 3275), // &iec -> &iecy + new Transition (3348, 3349), // &Imaginar -> &Imaginary + new Transition (3464, 3465), // &IOc -> &IOcy + new Transition (3468, 3469), // &ioc -> &iocy + new Transition (3541, 3542), // &Iukc -> &Iukcy + new Transition (3546, 3547), // &iukc -> &iukcy + new Transition (3556, 3567), // &Jc -> &Jcy + new Transition (3562, 3569), // &jc -> &jcy + new Transition (3600, 3601), // &Jserc -> &Jsercy + new Transition (3605, 3606), // &jserc -> &jsercy + new Transition (3610, 3611), // &Jukc -> &Jukcy + new Transition (3615, 3616), // &jukc -> &jukcy + new Transition (3632, 3644), // &Kc -> &Kcy + new Transition (3638, 3646), // &kc -> &kcy + new Transition (3661, 3662), // &KHc -> &KHcy + new Transition (3665, 3666), // &khc -> &khcy + new Transition (3669, 3670), // &KJc -> &KJcy + new Transition (3673, 3674), // &kjc -> &kjcy + new Transition (3714, 3715), // &laempt -> &laempty + new Transition (3837, 3865), // &Lc -> &Lcy + new Transition (3843, 3867), // &lc -> &lcy + new Transition (4339, 4340), // &LJc -> &LJcy + new Transition (4343, 4344), // &ljc -> &ljcy + new Transition (4809, 4818), // &mc -> &mcy + new Transition (4815, 4816), // &Mc -> &Mcy + new Transition (5020, 5057), // &nc -> &ncy + new Transition (5024, 5055), // &Nc -> &Ncy + new Transition (5123, 5124), // &NegativeVer -> &NegativeVery + new Transition (5249, 5250), // &NJc -> &NJcy + new Transition (5253, 5254), // &njc -> &njcy + new Transition (6148, 6161), // &oc -> &ocy + new Transition (6152, 6159), // &Oc -> &Ocy + new Transition (6312, 6313), // &OpenCurl -> &OpenCurly + new Transition (6491, 6492), // &Pc -> &Pcy + new Transition (6494, 6495), // &pc -> &pcy + new Transition (6667, 6668), // &preccurl -> &preccurly + new Transition (6904, 6905), // &raempt -> &raempty + new Transition (7021, 7049), // &Rc -> &Rcy + new Transition (7027, 7051), // &rc -> &rcy + new Transition (7596, 7597), // &RuleDela -> &RuleDelay + new Transition (7629, 7691), // &Sc -> &Scy + new Transition (7631, 7693), // &sc -> &scy + new Transition (7751, 7831), // &sh -> ­ + new Transition (7759, 7760), // &SHCHc -> &SHCHcy + new Transition (7762, 7770), // &shc -> &shcy + new Transition (7764, 7765), // &shchc -> &shchcy + new Transition (7767, 7768), // &SHc -> &SHcy + new Transition (7933, 7934), // &SOFTc -> &SOFTcy + new Transition (7939, 7940), // &softc -> &softcy + new Transition (8211, 8212), // &succcurl -> &succcurly + new Transition (8419, 8441), // &Tc -> &Tcy + new Transition (8425, 8443), // &tc -> &tcy + new Transition (8487, 8488), // &thetas -> &thetasy + new Transition (8710, 8717), // &tsc -> &tscy + new Transition (8714, 8715), // &TSc -> &TScy + new Transition (8720, 8721), // &TSHc -> &TSHcy + new Transition (8724, 8725), // &tshc -> &tshcy + new Transition (8799, 8800), // &Ubrc -> &Ubrcy + new Transition (8804, 8805), // &ubrc -> &ubrcy + new Transition (8815, 8825), // &Uc -> &Ucy + new Transition (8820, 8827), // &uc -> &ucy + new Transition (9314, 9315), // &Vc -> &Vcy + new Transition (9317, 9318), // &vc -> &vcy + new Transition (9360, 9403), // &Ver -> &Very + new Transition (9674, 9683), // &yac -> &yacy + new Transition (9680, 9681), // &YAc -> &YAcy + new Transition (9685, 9695), // &Yc -> &Ycy + new Transition (9690, 9697), // &yc -> &ycy + new Transition (9709, 9710), // &YIc -> &YIcy + new Transition (9713, 9714), // &yic -> &yicy + new Transition (9733, 9734), // &YUc -> &YUcy + new Transition (9737, 9738), // &yuc -> &yucy + new Transition (9761, 9773), // &Zc -> &Zcy + new Transition (9767, 9775), // &zc -> &zcy + new Transition (9818, 9819), // &ZHc -> &ZHcy + new Transition (9822, 9823) // &zhc -> &zhcy + }; + TransitionTable_z = new Transition[10] { + new Transition (0, 9754), // & -> &z + new Transition (136, 178), // &ang -> &angz + new Transition (524, 525), // &blacklo -> &blackloz + new Transition (1432, 2097), // &d -> &dz + new Transition (3172, 3173), // &Hori -> &Horiz + new Transition (4422, 4612), // &lo -> &loz + new Transition (7617, 8395), // &s -> &sz + new Transition (8699, 8700), // &trpe -> &trpez + new Transition (9201, 9477), // &v -> &vz + new Transition (9479, 9480) // &vzig -> &vzigz + }; + + NamedEntities = new Dictionary { + [6] = "\u00C1", // Á + [7] = "\u00C1", // Á + [13] = "\u00E1", // á + [14] = "\u00E1", // á + [20] = "\u0102", // Ă + [26] = "\u0103", // ă + [28] = "\u223E", // ∾ + [30] = "\u223F", // ∿ + [32] = "\u223E\u0333", // ∾̳ + [36] = "\u00C2", //  + [37] = "\u00C2", //  + [40] = "\u00E2", // â + [41] = "\u00E2", // â + [44] = "\u00B4", // ´ + [45] = "\u00B4", // ´ + [47] = "\u0410", // А + [49] = "\u0430", // а + [53] = "\u00C6", // Æ + [54] = "\u00C6", // Æ + [58] = "\u00E6", // æ + [59] = "\u00E6", // æ + [61] = "\u2061", // ⁡ + [64] = "\uD835\uDD04", // 𝔄 + [66] = "\uD835\uDD1E", // 𝔞 + [71] = "\u00C0", // À + [72] = "\u00C0", // À + [77] = "\u00E0", // à + [78] = "\u00E0", // à + [85] = "\u2135", // ℵ + [88] = "\u2135", // ℵ + [93] = "\u0391", // Α + [97] = "\u03B1", // α + [102] = "\u0100", // Ā + [107] = "\u0101", // ā + [110] = "\u2A3F", // ⨿ + [112] = "\u0026", // & + [113] = "\u0026", // & + [114] = "\u0026", // & + [115] = "\u0026", // & + [118] = "\u2A53", // ⩓ + [121] = "\u2227", // ∧ + [125] = "\u2A55", // ⩕ + [127] = "\u2A5C", // ⩜ + [133] = "\u2A58", // ⩘ + [135] = "\u2A5A", // ⩚ + [137] = "\u2220", // ∠ + [139] = "\u29A4", // ⦤ + [142] = "\u2220", // ∠ + [146] = "\u2221", // ∡ + [149] = "\u29A8", // ⦨ + [151] = "\u29A9", // ⦩ + [153] = "\u29AA", // ⦪ + [155] = "\u29AB", // ⦫ + [157] = "\u29AC", // ⦬ + [159] = "\u29AD", // ⦭ + [161] = "\u29AE", // ⦮ + [163] = "\u29AF", // ⦯ + [166] = "\u221F", // ∟ + [169] = "\u22BE", // ⊾ + [171] = "\u299D", // ⦝ + [175] = "\u2222", // ∢ + [177] = "\u00C5", // Å + [182] = "\u237C", // ⍼ + [187] = "\u0104", // Ą + [192] = "\u0105", // ą + [195] = "\uD835\uDD38", // 𝔸 + [198] = "\uD835\uDD52", // 𝕒 + [200] = "\u2248", // ≈ + [205] = "\u2A6F", // ⩯ + [207] = "\u2A70", // ⩰ + [209] = "\u224A", // ≊ + [212] = "\u224B", // ≋ + [215] = "\u0027", // ' + [228] = "\u2061", // ⁡ + [233] = "\u2248", // ≈ + [236] = "\u224A", // ≊ + [240] = "\u00C5", // Å + [241] = "\u00C5", // Å + [245] = "\u00E5", // å + [246] = "\u00E5", // å + [250] = "\uD835\uDC9C", // 𝒜 + [254] = "\uD835\uDCB6", // 𝒶 + [259] = "\u2254", // ≔ + [261] = "\u002A", // * + [265] = "\u2248", // ≈ + [268] = "\u224D", // ≍ + [273] = "\u00C3", // à + [274] = "\u00C3", // à + [279] = "\u00E3", // ã + [280] = "\u00E3", // ã + [283] = "\u00C4", // Ä + [284] = "\u00C4", // Ä + [287] = "\u00E4", // ä + [288] = "\u00E4", // ä + [296] = "\u2233", // ∳ + [300] = "\u2A11", // ⨑ + [309] = "\u224C", // ≌ + [317] = "\u03F6", // ϶ + [323] = "\u2035", // ‵ + [327] = "\u223D", // ∽ + [330] = "\u22CD", // ⋍ + [340] = "\u2216", // ∖ + [343] = "\u2AE7", // ⫧ + [348] = "\u22BD", // ⊽ + [352] = "\u2306", // ⌆ + [356] = "\u2305", // ⌅ + [359] = "\u2305", // ⌅ + [363] = "\u23B5", // ⎵ + [368] = "\u23B6", // ⎶ + [373] = "\u224C", // ≌ + [376] = "\u0411", // Б + [378] = "\u0431", // б + [383] = "\u201E", // „ + [389] = "\u2235", // ∵ + [396] = "\u2235", // ∵ + [398] = "\u2235", // ∵ + [404] = "\u29B0", // ⦰ + [408] = "\u03F6", // ϶ + [413] = "\u212C", // ℬ + [422] = "\u212C", // ℬ + [425] = "\u0392", // Β + [428] = "\u03B2", // β + [430] = "\u2136", // ℶ + [435] = "\u226C", // ≬ + [438] = "\uD835\uDD05", // 𝔅 + [441] = "\uD835\uDD1F", // 𝔟 + [447] = "\u22C2", // ⋂ + [451] = "\u25EF", // ◯ + [454] = "\u22C3", // ⋃ + [459] = "\u2A00", // ⨀ + [464] = "\u2A01", // ⨁ + [470] = "\u2A02", // ⨂ + [476] = "\u2A06", // ⨆ + [480] = "\u2605", // ★ + [493] = "\u25BD", // ▽ + [496] = "\u25B3", // △ + [502] = "\u2A04", // ⨄ + [506] = "\u22C1", // ⋁ + [512] = "\u22C0", // ⋀ + [518] = "\u290D", // ⤍ + [530] = "\u29EB", // ⧫ + [537] = "\u25AA", // ▪ + [546] = "\u25B4", // ▴ + [551] = "\u25BE", // ▾ + [556] = "\u25C2", // ◂ + [562] = "\u25B8", // ▸ + [565] = "\u2423", // ␣ + [569] = "\u2592", // ▒ + [571] = "\u2591", // ░ + [574] = "\u2593", // ▓ + [578] = "\u2588", // █ + [581] = "\u003D\u20E5", // =⃥ + [586] = "\u2261\u20E5", // ≡⃥ + [590] = "\u2AED", // ⫭ + [593] = "\u2310", // ⌐ + [597] = "\uD835\uDD39", // 𝔹 + [601] = "\uD835\uDD53", // 𝕓 + [603] = "\u22A5", // ⊥ + [607] = "\u22A5", // ⊥ + [612] = "\u22C8", // ⋈ + [617] = "\u29C9", // ⧉ + [620] = "\u2557", // ╗ + [622] = "\u2556", // ╖ + [625] = "\u2555", // ╕ + [627] = "\u2510", // ┐ + [629] = "\u2554", // ╔ + [631] = "\u2553", // ╓ + [633] = "\u2552", // ╒ + [635] = "\u250C", // ┌ + [637] = "\u2550", // ═ + [639] = "\u2500", // ─ + [641] = "\u2566", // ╦ + [643] = "\u2564", // ╤ + [645] = "\u2565", // ╥ + [647] = "\u252C", // ┬ + [649] = "\u2569", // ╩ + [651] = "\u2567", // ╧ + [653] = "\u2568", // ╨ + [655] = "\u2534", // ┴ + [661] = "\u229F", // ⊟ + [666] = "\u229E", // ⊞ + [672] = "\u22A0", // ⊠ + [675] = "\u255D", // ╝ + [677] = "\u255C", // ╜ + [680] = "\u255B", // ╛ + [682] = "\u2518", // ┘ + [684] = "\u255A", // ╚ + [686] = "\u2559", // ╙ + [688] = "\u2558", // ╘ + [690] = "\u2514", // └ + [692] = "\u2551", // ║ + [694] = "\u2502", // │ + [696] = "\u256C", // ╬ + [698] = "\u256B", // ╫ + [700] = "\u256A", // ╪ + [702] = "\u253C", // ┼ + [704] = "\u2563", // ╣ + [706] = "\u2562", // ╢ + [708] = "\u2561", // ╡ + [710] = "\u2524", // ┤ + [712] = "\u2560", // ╠ + [714] = "\u255F", // ╟ + [716] = "\u255E", // ╞ + [718] = "\u251C", // ├ + [724] = "\u2035", // ‵ + [729] = "\u02D8", // ˘ + [734] = "\u02D8", // ˘ + [738] = "\u00A6", // ¦ + [739] = "\u00A6", // ¦ + [743] = "\u212C", // ℬ + [747] = "\uD835\uDCB7", // 𝒷 + [751] = "\u204F", // ⁏ + [754] = "\u223D", // ∽ + [756] = "\u22CD", // ⋍ + [759] = "\u005C", // \ + [761] = "\u29C5", // ⧅ + [766] = "\u27C8", // ⟈ + [770] = "\u2022", // • + [773] = "\u2022", // • + [776] = "\u224E", // ≎ + [778] = "\u2AAE", // ⪮ + [780] = "\u224F", // ≏ + [786] = "\u224E", // ≎ + [788] = "\u224F", // ≏ + [795] = "\u0106", // Ć + [802] = "\u0107", // ć + [804] = "\u22D2", // ⋒ + [806] = "\u2229", // ∩ + [810] = "\u2A44", // ⩄ + [816] = "\u2A49", // ⩉ + [820] = "\u2A4B", // ⩋ + [823] = "\u2A47", // ⩇ + [827] = "\u2A40", // ⩀ + [845] = "\u2145", // ⅅ + [847] = "\u2229\uFE00", // ∩︀ + [851] = "\u2041", // ⁁ + [854] = "\u02C7", // ˇ + [860] = "\u212D", // ℭ + [865] = "\u2A4D", // ⩍ + [871] = "\u010C", // Č + [875] = "\u010D", // č + [879] = "\u00C7", // Ç + [880] = "\u00C7", // Ç + [884] = "\u00E7", // ç + [885] = "\u00E7", // ç + [889] = "\u0108", // Ĉ + [893] = "\u0109", // ĉ + [899] = "\u2230", // ∰ + [903] = "\u2A4C", // ⩌ + [906] = "\u2A50", // ⩐ + [910] = "\u010A", // Ċ + [914] = "\u010B", // ċ + [918] = "\u00B8", // ¸ + [919] = "\u00B8", // ¸ + [926] = "\u00B8", // ¸ + [932] = "\u29B2", // ⦲ + [934] = "\u00A2", // ¢ + [935] = "\u00A2", // ¢ + [943] = "\u00B7", // · + [949] = "\u00B7", // · + [952] = "\u212D", // ℭ + [955] = "\uD835\uDD20", // 𝔠 + [959] = "\u0427", // Ч + [963] = "\u0447", // ч + [967] = "\u2713", // ✓ + [972] = "\u2713", // ✓ + [975] = "\u03A7", // Χ + [977] = "\u03C7", // χ + [980] = "\u25CB", // ○ + [982] = "\u02C6", // ˆ + [985] = "\u2257", // ≗ + [997] = "\u21BA", // ↺ + [1003] = "\u21BB", // ↻ + [1008] = "\u229B", // ⊛ + [1013] = "\u229A", // ⊚ + [1018] = "\u229D", // ⊝ + [1027] = "\u2299", // ⊙ + [1029] = "\u00AE", // ® + [1031] = "\u24C8", // Ⓢ + [1037] = "\u2296", // ⊖ + [1042] = "\u2295", // ⊕ + [1048] = "\u2297", // ⊗ + [1050] = "\u29C3", // ⧃ + [1052] = "\u2257", // ≗ + [1058] = "\u2A10", // ⨐ + [1062] = "\u2AEF", // ⫯ + [1067] = "\u29C2", // ⧂ + [1091] = "\u2232", // ∲ + [1110] = "\u201D", // ” + [1116] = "\u2019", // ’ + [1121] = "\u2663", // ♣ + [1125] = "\u2663", // ♣ + [1130] = "\u2237", // ∷ + [1135] = "\u003A", // : + [1137] = "\u2A74", // ⩴ + [1139] = "\u2254", // ≔ + [1141] = "\u2254", // ≔ + [1145] = "\u002C", // , + [1147] = "\u0040", // @ + [1149] = "\u2201", // ∁ + [1152] = "\u2218", // ∘ + [1159] = "\u2201", // ∁ + [1163] = "\u2102", // ℂ + [1166] = "\u2245", // ≅ + [1170] = "\u2A6D", // ⩭ + [1178] = "\u2261", // ≡ + [1182] = "\u222F", // ∯ + [1186] = "\u222E", // ∮ + [1199] = "\u222E", // ∮ + [1202] = "\u2102", // ℂ + [1205] = "\uD835\uDD54", // 𝕔 + [1209] = "\u2210", // ∐ + [1216] = "\u2210", // ∐ + [1219] = "\u00A9", // © + [1220] = "\u00A9", // © + [1221] = "\u00A9", // © + [1222] = "\u00A9", // © + [1225] = "\u2117", // ℗ + [1255] = "\u2233", // ∳ + [1260] = "\u21B5", // ↵ + [1265] = "\u2A2F", // ⨯ + [1269] = "\u2717", // ✗ + [1273] = "\uD835\uDC9E", // 𝒞 + [1277] = "\uD835\uDCB8", // 𝒸 + [1280] = "\u2ACF", // ⫏ + [1282] = "\u2AD1", // ⫑ + [1284] = "\u2AD0", // ⫐ + [1286] = "\u2AD2", // ⫒ + [1291] = "\u22EF", // ⋯ + [1298] = "\u2938", // ⤸ + [1300] = "\u2935", // ⤵ + [1304] = "\u22DE", // ⋞ + [1307] = "\u22DF", // ⋟ + [1312] = "\u21B6", // ↶ + [1314] = "\u293D", // ⤽ + [1317] = "\u22D3", // ⋓ + [1319] = "\u222A", // ∪ + [1325] = "\u2A48", // ⩈ + [1329] = "\u224D", // ≍ + [1333] = "\u2A46", // ⩆ + [1336] = "\u2A4A", // ⩊ + [1340] = "\u228D", // ⊍ + [1343] = "\u2A45", // ⩅ + [1345] = "\u222A\uFE00", // ∪︀ + [1350] = "\u21B7", // ↷ + [1352] = "\u293C", // ⤼ + [1361] = "\u22DE", // ⋞ + [1366] = "\u22DF", // ⋟ + [1370] = "\u22CE", // ⋎ + [1376] = "\u22CF", // ⋏ + [1379] = "\u00A4", // ¤ + [1380] = "\u00A4", // ¤ + [1392] = "\u21B6", // ↶ + [1398] = "\u21B7", // ↷ + [1402] = "\u22CE", // ⋎ + [1406] = "\u22CF", // ⋏ + [1414] = "\u2232", // ∲ + [1418] = "\u2231", // ∱ + [1424] = "\u232D", // ⌭ + [1431] = "\u2021", // ‡ + [1438] = "\u2020", // † + [1443] = "\u2138", // ℸ + [1446] = "\u21A1", // ↡ + [1450] = "\u21D3", // ⇓ + [1453] = "\u2193", // ↓ + [1456] = "\u2010", // ‐ + [1460] = "\u2AE4", // ⫤ + [1462] = "\u22A3", // ⊣ + [1469] = "\u290F", // ⤏ + [1473] = "\u02DD", // ˝ + [1479] = "\u010E", // Ď + [1485] = "\u010F", // ď + [1487] = "\u0414", // Д + [1489] = "\u0434", // д + [1491] = "\u2145", // ⅅ + [1493] = "\u2146", // ⅆ + [1499] = "\u2021", // ‡ + [1502] = "\u21CA", // ⇊ + [1509] = "\u2911", // ⤑ + [1515] = "\u2A77", // ⩷ + [1517] = "\u00B0", // ° + [1518] = "\u00B0", // ° + [1521] = "\u2207", // ∇ + [1524] = "\u0394", // Δ + [1528] = "\u03B4", // δ + [1534] = "\u29B1", // ⦱ + [1540] = "\u297F", // ⥿ + [1543] = "\uD835\uDD07", // 𝔇 + [1545] = "\uD835\uDD21", // 𝔡 + [1549] = "\u2965", // ⥥ + [1554] = "\u21C3", // ⇃ + [1556] = "\u21C2", // ⇂ + [1572] = "\u00B4", // ´ + [1576] = "\u02D9", // ˙ + [1586] = "\u02DD", // ˝ + [1592] = "\u0060", // ` + [1598] = "\u02DC", // ˜ + [1602] = "\u22C4", // ⋄ + [1607] = "\u22C4", // ⋄ + [1611] = "\u22C4", // ⋄ + [1616] = "\u2666", // ♦ + [1618] = "\u2666", // ♦ + [1620] = "\u00A8", // ¨ + [1632] = "\u2146", // ⅆ + [1638] = "\u03DD", // ϝ + [1642] = "\u22F2", // ⋲ + [1644] = "\u00F7", // ÷ + [1647] = "\u00F7", // ÷ + [1648] = "\u00F7", // ÷ + [1656] = "\u22C7", // ⋇ + [1660] = "\u22C7", // ⋇ + [1664] = "\u0402", // Ђ + [1668] = "\u0452", // ђ + [1674] = "\u231E", // ⌞ + [1678] = "\u230D", // ⌍ + [1684] = "\u0024", // $ + [1688] = "\uD835\uDD3B", // 𝔻 + [1691] = "\uD835\uDD55", // 𝕕 + [1693] = "\u00A8", // ¨ + [1695] = "\u02D9", // ˙ + [1699] = "\u20DC", // ⃜ + [1702] = "\u2250", // ≐ + [1706] = "\u2251", // ≑ + [1712] = "\u2250", // ≐ + [1718] = "\u2238", // ∸ + [1723] = "\u2214", // ∔ + [1730] = "\u22A1", // ⊡ + [1743] = "\u2306", // ⌆ + [1763] = "\u222F", // ∯ + [1767] = "\u00A8", // ¨ + [1775] = "\u21D3", // ⇓ + [1785] = "\u21D0", // ⇐ + [1796] = "\u21D4", // ⇔ + [1800] = "\u2AE4", // ⫤ + [1813] = "\u27F8", // ⟸ + [1824] = "\u27FA", // ⟺ + [1835] = "\u27F9", // ⟹ + [1846] = "\u21D2", // ⇒ + [1850] = "\u22A8", // ⊨ + [1858] = "\u21D1", // ⇑ + [1868] = "\u21D5", // ⇕ + [1880] = "\u2225", // ∥ + [1888] = "\u2193", // ↓ + [1894] = "\u21D3", // ⇓ + [1902] = "\u2193", // ↓ + [1906] = "\u2913", // ⤓ + [1914] = "\u21F5", // ⇵ + [1920] = "\u0311", // ̑ + [1931] = "\u21CA", // ⇊ + [1943] = "\u21C3", // ⇃ + [1949] = "\u21C2", // ⇂ + [1965] = "\u2950", // ⥐ + [1975] = "\u295E", // ⥞ + [1982] = "\u21BD", // ↽ + [1986] = "\u2956", // ⥖ + [2001] = "\u295F", // ⥟ + [2008] = "\u21C1", // ⇁ + [2012] = "\u2957", // ⥗ + [2016] = "\u22A4", // ⊤ + [2022] = "\u21A7", // ↧ + [2030] = "\u2910", // ⤐ + [2035] = "\u231F", // ⌟ + [2039] = "\u230C", // ⌌ + [2043] = "\uD835\uDC9F", // 𝒟 + [2047] = "\uD835\uDCB9", // 𝒹 + [2051] = "\u0405", // Ѕ + [2053] = "\u0455", // ѕ + [2056] = "\u29F6", // ⧶ + [2061] = "\u0110", // Đ + [2066] = "\u0111", // đ + [2071] = "\u22F1", // ⋱ + [2074] = "\u25BF", // ▿ + [2076] = "\u25BE", // ▾ + [2081] = "\u21F5", // ⇵ + [2085] = "\u296F", // ⥯ + [2092] = "\u29A6", // ⦦ + [2096] = "\u040F", // Џ + [2100] = "\u045F", // џ + [2107] = "\u27FF", // ⟿ + [2113] = "\u00C9", // É + [2114] = "\u00C9", // É + [2120] = "\u00E9", // é + [2121] = "\u00E9", // é + [2126] = "\u2A6E", // ⩮ + [2132] = "\u011A", // Ě + [2138] = "\u011B", // ě + [2141] = "\u2256", // ≖ + [2144] = "\u00CA", // Ê + [2145] = "\u00CA", // Ê + [2146] = "\u00EA", // ê + [2147] = "\u00EA", // ê + [2152] = "\u2255", // ≕ + [2154] = "\u042D", // Э + [2156] = "\u044D", // э + [2161] = "\u2A77", // ⩷ + [2165] = "\u0116", // Ė + [2168] = "\u2251", // ≑ + [2172] = "\u0117", // ė + [2174] = "\u2147", // ⅇ + [2179] = "\u2252", // ≒ + [2182] = "\uD835\uDD08", // 𝔈 + [2184] = "\uD835\uDD22", // 𝔢 + [2186] = "\u2A9A", // ⪚ + [2191] = "\u00C8", // È + [2192] = "\u00C8", // È + [2196] = "\u00E8", // è + [2197] = "\u00E8", // è + [2199] = "\u2A96", // ⪖ + [2203] = "\u2A98", // ⪘ + [2205] = "\u2A99", // ⪙ + [2212] = "\u2208", // ∈ + [2219] = "\u23E7", // ⏧ + [2221] = "\u2113", // ℓ + [2223] = "\u2A95", // ⪕ + [2227] = "\u2A97", // ⪗ + [2232] = "\u0112", // Ē + [2237] = "\u0113", // ē + [2241] = "\u2205", // ∅ + [2245] = "\u2205", // ∅ + [2260] = "\u25FB", // ◻ + [2262] = "\u2205", // ∅ + [2278] = "\u25AB", // ▫ + [2281] = "\u2003", //   + [2284] = "\u2004", //   + [2286] = "\u2005", //   + [2289] = "\u014A", // Ŋ + [2292] = "\u014B", // ŋ + [2295] = "\u2002", //   + [2300] = "\u0118", // Ę + [2305] = "\u0119", // ę + [2308] = "\uD835\uDD3C", // 𝔼 + [2311] = "\uD835\uDD56", // 𝕖 + [2315] = "\u22D5", // ⋕ + [2318] = "\u29E3", // ⧣ + [2322] = "\u2A71", // ⩱ + [2325] = "\u03B5", // ε + [2332] = "\u0395", // Ε + [2336] = "\u03B5", // ε + [2338] = "\u03F5", // ϵ + [2344] = "\u2256", // ≖ + [2349] = "\u2255", // ≕ + [2353] = "\u2242", // ≂ + [2361] = "\u2A96", // ⪖ + [2366] = "\u2A95", // ⪕ + [2371] = "\u2A75", // ⩵ + [2376] = "\u003D", // = + [2382] = "\u2242", // ≂ + [2386] = "\u225F", // ≟ + [2395] = "\u21CC", // ⇌ + [2398] = "\u2261", // ≡ + [2401] = "\u2A78", // ⩸ + [2408] = "\u29E5", // ⧥ + [2413] = "\u2971", // ⥱ + [2417] = "\u2253", // ≓ + [2421] = "\u2130", // ℰ + [2425] = "\u212F", // ℯ + [2429] = "\u2250", // ≐ + [2432] = "\u2A73", // ⩳ + [2435] = "\u2242", // ≂ + [2438] = "\u0397", // Η + [2441] = "\u03B7", // η + [2443] = "\u00D0", // Ð + [2444] = "\u00D0", // Ð + [2445] = "\u00F0", // ð + [2446] = "\u00F0", // ð + [2449] = "\u00CB", // Ë + [2450] = "\u00CB", // Ë + [2453] = "\u00EB", // ë + [2454] = "\u00EB", // ë + [2457] = "\u20AC", // € + [2461] = "\u0021", // ! + [2465] = "\u2203", // ∃ + [2471] = "\u2203", // ∃ + [2481] = "\u2130", // ℰ + [2492] = "\u2147", // ⅇ + [2502] = "\u2147", // ⅇ + [2516] = "\u2252", // ≒ + [2520] = "\u0424", // Ф + [2523] = "\u0444", // ф + [2529] = "\u2640", // ♀ + [2535] = "\uFB03", // ffi + [2539] = "\uFB00", // ff + [2543] = "\uFB04", // ffl + [2546] = "\uD835\uDD09", // 𝔉 + [2548] = "\uD835\uDD23", // 𝔣 + [2553] = "\uFB01", // fi + [2570] = "\u25FC", // ◼ + [2586] = "\u25AA", // ▪ + [2591] = "\u0066\u006A", // fj + [2595] = "\u266D", // ♭ + [2599] = "\uFB02", // fl + [2603] = "\u25B1", // ▱ + [2607] = "\u0192", // ƒ + [2611] = "\uD835\uDD3D", // 𝔽 + [2615] = "\uD835\uDD57", // 𝕗 + [2620] = "\u2200", // ∀ + [2625] = "\u2200", // ∀ + [2627] = "\u22D4", // ⋔ + [2629] = "\u2AD9", // ⫙ + [2638] = "\u2131", // ℱ + [2646] = "\u2A0D", // ⨍ + [2651] = "\u00BD", // ½ + [2652] = "\u00BD", // ½ + [2654] = "\u2153", // ⅓ + [2655] = "\u00BC", // ¼ + [2656] = "\u00BC", // ¼ + [2658] = "\u2155", // ⅕ + [2660] = "\u2159", // ⅙ + [2662] = "\u215B", // ⅛ + [2665] = "\u2154", // ⅔ + [2667] = "\u2156", // ⅖ + [2669] = "\u00BE", // ¾ + [2670] = "\u00BE", // ¾ + [2672] = "\u2157", // ⅗ + [2674] = "\u215C", // ⅜ + [2677] = "\u2158", // ⅘ + [2680] = "\u215A", // ⅚ + [2682] = "\u215D", // ⅝ + [2685] = "\u215E", // ⅞ + [2688] = "\u2044", // ⁄ + [2692] = "\u2322", // ⌢ + [2696] = "\u2131", // ℱ + [2700] = "\uD835\uDCBB", // 𝒻 + [2707] = "\u01F5", // ǵ + [2713] = "\u0393", // Γ + [2717] = "\u03B3", // γ + [2719] = "\u03DC", // Ϝ + [2721] = "\u03DD", // ϝ + [2723] = "\u2A86", // ⪆ + [2729] = "\u011E", // Ğ + [2735] = "\u011F", // ğ + [2741] = "\u0122", // Ģ + [2745] = "\u011C", // Ĝ + [2750] = "\u011D", // ĝ + [2752] = "\u0413", // Г + [2754] = "\u0433", // г + [2758] = "\u0120", // Ġ + [2762] = "\u0121", // ġ + [2764] = "\u2267", // ≧ + [2766] = "\u2265", // ≥ + [2768] = "\u2A8C", // ⪌ + [2770] = "\u22DB", // ⋛ + [2772] = "\u2265", // ≥ + [2774] = "\u2267", // ≧ + [2780] = "\u2A7E", // ⩾ + [2782] = "\u2A7E", // ⩾ + [2785] = "\u2AA9", // ⪩ + [2789] = "\u2A80", // ⪀ + [2791] = "\u2A82", // ⪂ + [2793] = "\u2A84", // ⪄ + [2795] = "\u22DB\uFE00", // ⋛︀ + [2798] = "\u2A94", // ⪔ + [2801] = "\uD835\uDD0A", // 𝔊 + [2804] = "\uD835\uDD24", // 𝔤 + [2806] = "\u22D9", // ⋙ + [2808] = "\u226B", // ≫ + [2810] = "\u22D9", // ⋙ + [2815] = "\u2137", // ℷ + [2819] = "\u0403", // Ѓ + [2823] = "\u0453", // ѓ + [2825] = "\u2277", // ≷ + [2827] = "\u2AA5", // ⪥ + [2829] = "\u2A92", // ⪒ + [2831] = "\u2AA4", // ⪤ + [2835] = "\u2A8A", // ⪊ + [2840] = "\u2A8A", // ⪊ + [2842] = "\u2269", // ≩ + [2844] = "\u2A88", // ⪈ + [2846] = "\u2A88", // ⪈ + [2848] = "\u2269", // ≩ + [2852] = "\u22E7", // ⋧ + [2856] = "\uD835\uDD3E", // 𝔾 + [2860] = "\uD835\uDD58", // 𝕘 + [2865] = "\u0060", // ` + [2877] = "\u2265", // ≥ + [2882] = "\u22DB", // ⋛ + [2892] = "\u2267", // ≧ + [2900] = "\u2AA2", // ⪢ + [2905] = "\u2277", // ≷ + [2916] = "\u2A7E", // ⩾ + [2922] = "\u2273", // ≳ + [2926] = "\uD835\uDCA2", // 𝒢 + [2930] = "\u210A", // ℊ + [2933] = "\u2273", // ≳ + [2935] = "\u2A8E", // ⪎ + [2937] = "\u2A90", // ⪐ + [2938] = "\u003E", // > + [2939] = "\u003E", // > + [2941] = "\u226B", // ≫ + [2942] = "\u003E", // > + [2943] = "\u003E", // > + [2946] = "\u2AA7", // ⪧ + [2949] = "\u2A7A", // ⩺ + [2953] = "\u22D7", // ⋗ + [2958] = "\u2995", // ⦕ + [2964] = "\u2A7C", // ⩼ + [2972] = "\u2A86", // ⪆ + [2975] = "\u2978", // ⥸ + [2979] = "\u22D7", // ⋗ + [2986] = "\u22DB", // ⋛ + [2992] = "\u2A8C", // ⪌ + [2997] = "\u2277", // ≷ + [3001] = "\u2273", // ≳ + [3010] = "\u2269\uFE00", // ≩︀ + [3013] = "\u2269\uFE00", // ≩︀ + [3019] = "\u02C7", // ˇ + [3026] = "\u200A", //   + [3029] = "\u00BD", // ½ + [3034] = "\u210B", // ℋ + [3040] = "\u042A", // Ъ + [3045] = "\u044A", // ъ + [3049] = "\u21D4", // ⇔ + [3051] = "\u2194", // ↔ + [3055] = "\u2948", // ⥈ + [3057] = "\u21AD", // ↭ + [3059] = "\u005E", // ^ + [3063] = "\u210F", // ℏ + [3068] = "\u0124", // Ĥ + [3073] = "\u0125", // ĥ + [3079] = "\u2665", // ♥ + [3083] = "\u2665", // ♥ + [3088] = "\u2026", // … + [3093] = "\u22B9", // ⊹ + [3096] = "\u210C", // ℌ + [3099] = "\uD835\uDD25", // 𝔥 + [3111] = "\u210B", // ℋ + [3119] = "\u2925", // ⤥ + [3125] = "\u2926", // ⤦ + [3130] = "\u21FF", // ⇿ + [3135] = "\u223B", // ∻ + [3147] = "\u21A9", // ↩ + [3158] = "\u21AA", // ↪ + [3162] = "\u210D", // ℍ + [3165] = "\uD835\uDD59", // 𝕙 + [3170] = "\u2015", // ― + [3183] = "\u2500", // ─ + [3187] = "\u210B", // ℋ + [3191] = "\uD835\uDCBD", // 𝒽 + [3196] = "\u210F", // ℏ + [3201] = "\u0126", // Ħ + [3206] = "\u0127", // ħ + [3218] = "\u224E", // ≎ + [3224] = "\u224F", // ≏ + [3230] = "\u2043", // ⁃ + [3235] = "\u2010", // ‐ + [3241] = "\u00CD", // Í + [3242] = "\u00CD", // Í + [3248] = "\u00ED", // í + [3249] = "\u00ED", // í + [3251] = "\u2063", // ⁣ + [3255] = "\u00CE", // Î + [3256] = "\u00CE", // Î + [3259] = "\u00EE", // î + [3260] = "\u00EE", // î + [3262] = "\u0418", // И + [3264] = "\u0438", // и + [3268] = "\u0130", // İ + [3272] = "\u0415", // Е + [3276] = "\u0435", // е + [3279] = "\u00A1", // ¡ + [3280] = "\u00A1", // ¡ + [3283] = "\u21D4", // ⇔ + [3286] = "\u2111", // ℑ + [3288] = "\uD835\uDD26", // 𝔦 + [3293] = "\u00CC", // Ì + [3294] = "\u00CC", // Ì + [3299] = "\u00EC", // ì + [3300] = "\u00EC", // ì + [3302] = "\u2148", // ⅈ + [3307] = "\u2A0C", // ⨌ + [3310] = "\u222D", // ∭ + [3315] = "\u29DC", // ⧜ + [3319] = "\u2129", // ℩ + [3324] = "\u0132", // IJ + [3329] = "\u0133", // ij + [3331] = "\u2111", // ℑ + [3335] = "\u012A", // Ī + [3340] = "\u012B", // ī + [3343] = "\u2111", // ℑ + [3351] = "\u2148", // ⅈ + [3356] = "\u2110", // ℐ + [3361] = "\u2111", // ℑ + [3364] = "\u0131", // ı + [3367] = "\u22B7", // ⊷ + [3371] = "\u01B5", // Ƶ + [3377] = "\u21D2", // ⇒ + [3379] = "\u2208", // ∈ + [3384] = "\u2105", // ℅ + [3388] = "\u221E", // ∞ + [3392] = "\u29DD", // ⧝ + [3397] = "\u0131", // ı + [3400] = "\u222C", // ∬ + [3402] = "\u222B", // ∫ + [3406] = "\u22BA", // ⊺ + [3412] = "\u2124", // ℤ + [3418] = "\u222B", // ∫ + [3423] = "\u22BA", // ⊺ + [3432] = "\u22C2", // ⋂ + [3438] = "\u2A17", // ⨗ + [3443] = "\u2A3C", // ⨼ + [3456] = "\u2063", // ⁣ + [3462] = "\u2062", // ⁢ + [3466] = "\u0401", // Ё + [3470] = "\u0451", // ё + [3475] = "\u012E", // Į + [3479] = "\u012F", // į + [3482] = "\uD835\uDD40", // 𝕀 + [3485] = "\uD835\uDD5A", // 𝕚 + [3488] = "\u0399", // Ι + [3491] = "\u03B9", // ι + [3496] = "\u2A3C", // ⨼ + [3501] = "\u00BF", // ¿ + [3502] = "\u00BF", // ¿ + [3506] = "\u2110", // ℐ + [3510] = "\uD835\uDCBE", // 𝒾 + [3513] = "\u2208", // ∈ + [3517] = "\u22F5", // ⋵ + [3519] = "\u22F9", // ⋹ + [3521] = "\u22F4", // ⋴ + [3523] = "\u22F3", // ⋳ + [3525] = "\u2208", // ∈ + [3527] = "\u2062", // ⁢ + [3533] = "\u0128", // Ĩ + [3538] = "\u0129", // ĩ + [3543] = "\u0406", // І + [3548] = "\u0456", // і + [3550] = "\u00CF", // Ï + [3551] = "\u00CF", // Ï + [3553] = "\u00EF", // ï + [3554] = "\u00EF", // ï + [3560] = "\u0134", // Ĵ + [3566] = "\u0135", // ĵ + [3568] = "\u0419", // Й + [3570] = "\u0439", // й + [3573] = "\uD835\uDD0D", // 𝔍 + [3576] = "\uD835\uDD27", // 𝔧 + [3581] = "\u0237", // ȷ + [3585] = "\uD835\uDD41", // 𝕁 + [3589] = "\uD835\uDD5B", // 𝕛 + [3593] = "\uD835\uDCA5", // 𝒥 + [3597] = "\uD835\uDCBF", // 𝒿 + [3602] = "\u0408", // Ј + [3607] = "\u0458", // ј + [3612] = "\u0404", // Є + [3617] = "\u0454", // є + [3623] = "\u039A", // Κ + [3629] = "\u03BA", // κ + [3631] = "\u03F0", // ϰ + [3637] = "\u0136", // Ķ + [3643] = "\u0137", // ķ + [3645] = "\u041A", // К + [3647] = "\u043A", // к + [3650] = "\uD835\uDD0E", // 𝔎 + [3653] = "\uD835\uDD28", // 𝔨 + [3659] = "\u0138", // ĸ + [3663] = "\u0425", // Х + [3667] = "\u0445", // х + [3671] = "\u040C", // Ќ + [3675] = "\u045C", // ќ + [3679] = "\uD835\uDD42", // 𝕂 + [3683] = "\uD835\uDD5C", // 𝕜 + [3687] = "\uD835\uDCA6", // 𝒦 + [3691] = "\uD835\uDCC0", // 𝓀 + [3697] = "\u21DA", // ⇚ + [3704] = "\u0139", // Ĺ + [3710] = "\u013A", // ĺ + [3717] = "\u29B4", // ⦴ + [3722] = "\u2112", // ℒ + [3727] = "\u039B", // Λ + [3732] = "\u03BB", // λ + [3735] = "\u27EA", // ⟪ + [3738] = "\u27E8", // ⟨ + [3740] = "\u2991", // ⦑ + [3743] = "\u27E8", // ⟨ + [3745] = "\u2A85", // ⪅ + [3754] = "\u2112", // ℒ + [3757] = "\u00AB", // « + [3758] = "\u00AB", // « + [3761] = "\u219E", // ↞ + [3764] = "\u21D0", // ⇐ + [3767] = "\u2190", // ← + [3769] = "\u21E4", // ⇤ + [3772] = "\u291F", // ⤟ + [3775] = "\u291D", // ⤝ + [3778] = "\u21A9", // ↩ + [3781] = "\u21AB", // ↫ + [3784] = "\u2939", // ⤹ + [3788] = "\u2973", // ⥳ + [3791] = "\u21A2", // ↢ + [3793] = "\u2AAB", // ⪫ + [3798] = "\u291B", // ⤛ + [3802] = "\u2919", // ⤙ + [3804] = "\u2AAD", // ⪭ + [3806] = "\u2AAD\uFE00", // ⪭︀ + [3811] = "\u290E", // ⤎ + [3816] = "\u290C", // ⤌ + [3820] = "\u2772", // ❲ + [3825] = "\u007B", // { + [3827] = "\u005B", // [ + [3830] = "\u298B", // ⦋ + [3834] = "\u298F", // ⦏ + [3836] = "\u298D", // ⦍ + [3842] = "\u013D", // Ľ + [3848] = "\u013E", // ľ + [3853] = "\u013B", // Ļ + [3858] = "\u013C", // ļ + [3861] = "\u2308", // ⌈ + [3864] = "\u007B", // { + [3866] = "\u041B", // Л + [3868] = "\u043B", // л + [3872] = "\u2936", // ⤶ + [3876] = "\u201C", // “ + [3878] = "\u201E", // „ + [3884] = "\u2967", // ⥧ + [3890] = "\u294B", // ⥋ + [3893] = "\u21B2", // ↲ + [3895] = "\u2266", // ≦ + [3897] = "\u2264", // ≤ + [3913] = "\u27E8", // ⟨ + [3918] = "\u2190", // ← + [3924] = "\u21D0", // ⇐ + [3932] = "\u2190", // ← + [3936] = "\u21E4", // ⇤ + [3947] = "\u21C6", // ⇆ + [3952] = "\u21A2", // ↢ + [3960] = "\u2308", // ⌈ + [3974] = "\u27E6", // ⟦ + [3986] = "\u2961", // ⥡ + [3993] = "\u21C3", // ⇃ + [3997] = "\u2959", // ⥙ + [4003] = "\u230A", // ⌊ + [4015] = "\u21BD", // ↽ + [4018] = "\u21BC", // ↼ + [4029] = "\u21C7", // ⇇ + [4040] = "\u2194", // ↔ + [4051] = "\u21D4", // ⇔ + [4062] = "\u2194", // ↔ + [4064] = "\u21C6", // ⇆ + [4073] = "\u21CB", // ⇋ + [4084] = "\u21AD", // ↭ + [4091] = "\u294E", // ⥎ + [4095] = "\u22A3", // ⊣ + [4101] = "\u21A4", // ↤ + [4108] = "\u295A", // ⥚ + [4119] = "\u22CB", // ⋋ + [4127] = "\u22B2", // ⊲ + [4131] = "\u29CF", // ⧏ + [4137] = "\u22B4", // ⊴ + [4150] = "\u2951", // ⥑ + [4160] = "\u2960", // ⥠ + [4167] = "\u21BF", // ↿ + [4171] = "\u2958", // ⥘ + [4178] = "\u21BC", // ↼ + [4182] = "\u2952", // ⥒ + [4184] = "\u2A8B", // ⪋ + [4186] = "\u22DA", // ⋚ + [4188] = "\u2264", // ≤ + [4190] = "\u2266", // ≦ + [4196] = "\u2A7D", // ⩽ + [4198] = "\u2A7D", // ⩽ + [4201] = "\u2AA8", // ⪨ + [4205] = "\u2A7F", // ⩿ + [4207] = "\u2A81", // ⪁ + [4209] = "\u2A83", // ⪃ + [4211] = "\u22DA\uFE00", // ⋚︀ + [4214] = "\u2A93", // ⪓ + [4222] = "\u2A85", // ⪅ + [4226] = "\u22D6", // ⋖ + [4232] = "\u22DA", // ⋚ + [4237] = "\u2A8B", // ⪋ + [4252] = "\u22DA", // ⋚ + [4262] = "\u2266", // ≦ + [4270] = "\u2276", // ≶ + [4274] = "\u2276", // ≶ + [4279] = "\u2AA1", // ⪡ + [4283] = "\u2272", // ≲ + [4294] = "\u2A7D", // ⩽ + [4300] = "\u2272", // ≲ + [4306] = "\u297C", // ⥼ + [4311] = "\u230A", // ⌊ + [4314] = "\uD835\uDD0F", // 𝔏 + [4316] = "\uD835\uDD29", // 𝔩 + [4318] = "\u2276", // ≶ + [4320] = "\u2A91", // ⪑ + [4324] = "\u2962", // ⥢ + [4329] = "\u21BD", // ↽ + [4331] = "\u21BC", // ↼ + [4333] = "\u296A", // ⥪ + [4337] = "\u2584", // ▄ + [4341] = "\u0409", // Љ + [4345] = "\u0459", // љ + [4347] = "\u22D8", // ⋘ + [4349] = "\u226A", // ≪ + [4353] = "\u21C7", // ⇇ + [4360] = "\u231E", // ⌞ + [4369] = "\u21DA", // ⇚ + [4374] = "\u296B", // ⥫ + [4378] = "\u25FA", // ◺ + [4384] = "\u013F", // Ŀ + [4390] = "\u0140", // ŀ + [4395] = "\u23B0", // ⎰ + [4400] = "\u23B0", // ⎰ + [4404] = "\u2A89", // ⪉ + [4409] = "\u2A89", // ⪉ + [4411] = "\u2268", // ≨ + [4413] = "\u2A87", // ⪇ + [4415] = "\u2A87", // ⪇ + [4417] = "\u2268", // ≨ + [4421] = "\u22E6", // ⋦ + [4426] = "\u27EC", // ⟬ + [4429] = "\u21FD", // ⇽ + [4433] = "\u27E6", // ⟦ + [4446] = "\u27F5", // ⟵ + [4456] = "\u27F8", // ⟸ + [4468] = "\u27F5", // ⟵ + [4479] = "\u27F7", // ⟷ + [4490] = "\u27FA", // ⟺ + [4501] = "\u27F7", // ⟷ + [4508] = "\u27FC", // ⟼ + [4519] = "\u27F6", // ⟶ + [4530] = "\u27F9", // ⟹ + [4541] = "\u27F6", // ⟶ + [4553] = "\u21AB", // ↫ + [4559] = "\u21AC", // ↬ + [4563] = "\u2985", // ⦅ + [4566] = "\uD835\uDD43", // 𝕃 + [4568] = "\uD835\uDD5D", // 𝕝 + [4572] = "\u2A2D", // ⨭ + [4578] = "\u2A34", // ⨴ + [4583] = "\u2217", // ∗ + [4587] = "\u005F", // _ + [4600] = "\u2199", // ↙ + [4611] = "\u2198", // ↘ + [4613] = "\u25CA", // ◊ + [4618] = "\u25CA", // ◊ + [4620] = "\u29EB", // ⧫ + [4624] = "\u0028", // ( + [4627] = "\u2993", // ⦓ + [4632] = "\u21C6", // ⇆ + [4639] = "\u231F", // ⌟ + [4643] = "\u21CB", // ⇋ + [4645] = "\u296D", // ⥭ + [4647] = "\u200E", // ‎ + [4651] = "\u22BF", // ⊿ + [4657] = "\u2039", // ‹ + [4661] = "\u2112", // ℒ + [4664] = "\uD835\uDCC1", // 𝓁 + [4666] = "\u21B0", // ↰ + [4668] = "\u21B0", // ↰ + [4671] = "\u2272", // ≲ + [4673] = "\u2A8D", // ⪍ + [4675] = "\u2A8F", // ⪏ + [4678] = "\u005B", // [ + [4681] = "\u2018", // ‘ + [4683] = "\u201A", // ‚ + [4688] = "\u0141", // Ł + [4693] = "\u0142", // ł + [4694] = "\u003C", // < + [4695] = "\u003C", // < + [4697] = "\u226A", // ≪ + [4698] = "\u003C", // < + [4699] = "\u003C", // < + [4702] = "\u2AA6", // ⪦ + [4705] = "\u2A79", // ⩹ + [4709] = "\u22D6", // ⋖ + [4714] = "\u22CB", // ⋋ + [4719] = "\u22C9", // ⋉ + [4724] = "\u2976", // ⥶ + [4730] = "\u2A7B", // ⩻ + [4733] = "\u25C3", // ◃ + [4735] = "\u22B4", // ⊴ + [4737] = "\u25C2", // ◂ + [4741] = "\u2996", // ⦖ + [4749] = "\u294A", // ⥊ + [4754] = "\u2966", // ⥦ + [4763] = "\u2268\uFE00", // ≨︀ + [4766] = "\u2268\uFE00", // ≨︀ + [4770] = "\u00AF", // ¯ + [4771] = "\u00AF", // ¯ + [4774] = "\u2642", // ♂ + [4776] = "\u2720", // ✠ + [4780] = "\u2720", // ✠ + [4784] = "\u2905", // ⤅ + [4786] = "\u21A6", // ↦ + [4790] = "\u21A6", // ↦ + [4795] = "\u21A7", // ↧ + [4800] = "\u21A4", // ↤ + [4803] = "\u21A5", // ↥ + [4808] = "\u25AE", // ▮ + [4814] = "\u2A29", // ⨩ + [4817] = "\u041C", // М + [4819] = "\u043C", // м + [4824] = "\u2014", // — + [4829] = "\u223A", // ∺ + [4842] = "\u2221", // ∡ + [4853] = "\u205F", //   + [4861] = "\u2133", // ℳ + [4864] = "\uD835\uDD10", // 𝔐 + [4867] = "\uD835\uDD2A", // 𝔪 + [4870] = "\u2127", // ℧ + [4874] = "\u00B5", // µ + [4875] = "\u00B5", // µ + [4877] = "\u2223", // ∣ + [4881] = "\u002A", // * + [4885] = "\u2AF0", // ⫰ + [4888] = "\u00B7", // · + [4889] = "\u00B7", // · + [4893] = "\u2212", // − + [4895] = "\u229F", // ⊟ + [4897] = "\u2238", // ∸ + [4899] = "\u2A2A", // ⨪ + [4908] = "\u2213", // ∓ + [4912] = "\u2ADB", // ⫛ + [4915] = "\u2026", // … + [4921] = "\u2213", // ∓ + [4927] = "\u22A7", // ⊧ + [4931] = "\uD835\uDD44", // 𝕄 + [4934] = "\uD835\uDD5E", // 𝕞 + [4936] = "\u2213", // ∓ + [4940] = "\u2133", // ℳ + [4944] = "\uD835\uDCC2", // 𝓂 + [4949] = "\u223E", // ∾ + [4951] = "\u039C", // Μ + [4953] = "\u03BC", // μ + [4960] = "\u22B8", // ⊸ + [4964] = "\u22B8", // ⊸ + [4970] = "\u2207", // ∇ + [4977] = "\u0143", // Ń + [4982] = "\u0144", // ń + [4985] = "\u2220\u20D2", // ∠⃒ + [4987] = "\u2249", // ≉ + [4989] = "\u2A70\u0338", // ⩰̸ + [4992] = "\u224B\u0338", // ≋̸ + [4995] = "\u0149", // ʼn + [5000] = "\u2249", // ≉ + [5004] = "\u266E", // ♮ + [5007] = "\u266E", // ♮ + [5009] = "\u2115", // ℕ + [5012] = "\u00A0", //   + [5013] = "\u00A0", //   + [5017] = "\u224E\u0338", // ≎̸ + [5019] = "\u224F\u0338", // ≏̸ + [5023] = "\u2A43", // ⩃ + [5029] = "\u0147", // Ň + [5033] = "\u0148", // ň + [5038] = "\u0145", // Ņ + [5043] = "\u0146", // ņ + [5047] = "\u2247", // ≇ + [5051] = "\u2A6D\u0338", // ⩭̸ + [5054] = "\u2A42", // ⩂ + [5056] = "\u041D", // Н + [5058] = "\u043D", // н + [5063] = "\u2013", // – + [5065] = "\u2260", // ≠ + [5070] = "\u2924", // ⤤ + [5074] = "\u21D7", // ⇗ + [5076] = "\u2197", // ↗ + [5079] = "\u2197", // ↗ + [5083] = "\u2250\u0338", // ≐̸ + [5102] = "\u200B", // ​ + [5113] = "\u200B", // ​ + [5120] = "\u200B", // ​ + [5134] = "\u200B", // ​ + [5139] = "\u2262", // ≢ + [5144] = "\u2928", // ⤨ + [5147] = "\u2242\u0338", // ≂̸ + [5166] = "\u226B", // ≫ + [5175] = "\u226A", // ≪ + [5181] = "\u000A", // + [5186] = "\u2204", // ∄ + [5188] = "\u2204", // ∄ + [5191] = "\uD835\uDD11", // 𝔑 + [5194] = "\uD835\uDD2B", // 𝔫 + [5197] = "\u2267\u0338", // ≧̸ + [5199] = "\u2271", // ≱ + [5201] = "\u2271", // ≱ + [5203] = "\u2267\u0338", // ≧̸ + [5209] = "\u2A7E\u0338", // ⩾̸ + [5211] = "\u2A7E\u0338", // ⩾̸ + [5214] = "\u22D9\u0338", // ⋙̸ + [5218] = "\u2275", // ≵ + [5220] = "\u226B\u20D2", // ≫⃒ + [5222] = "\u226F", // ≯ + [5224] = "\u226F", // ≯ + [5226] = "\u226B\u0338", // ≫̸ + [5231] = "\u21CE", // ⇎ + [5235] = "\u21AE", // ↮ + [5239] = "\u2AF2", // ⫲ + [5241] = "\u220B", // ∋ + [5243] = "\u22FC", // ⋼ + [5245] = "\u22FA", // ⋺ + [5247] = "\u220B", // ∋ + [5251] = "\u040A", // Њ + [5255] = "\u045A", // њ + [5260] = "\u21CD", // ⇍ + [5264] = "\u219A", // ↚ + [5267] = "\u2025", // ‥ + [5269] = "\u2266\u0338", // ≦̸ + [5271] = "\u2270", // ≰ + [5281] = "\u21CD", // ⇍ + [5289] = "\u219A", // ↚ + [5300] = "\u21CE", // ⇎ + [5311] = "\u21AE", // ↮ + [5313] = "\u2270", // ≰ + [5315] = "\u2266\u0338", // ≦̸ + [5321] = "\u2A7D\u0338", // ⩽̸ + [5323] = "\u2A7D\u0338", // ⩽̸ + [5325] = "\u226E", // ≮ + [5327] = "\u22D8\u0338", // ⋘̸ + [5331] = "\u2274", // ≴ + [5333] = "\u226A\u20D2", // ≪⃒ + [5335] = "\u226E", // ≮ + [5338] = "\u22EA", // ⋪ + [5340] = "\u22EC", // ⋬ + [5342] = "\u226A\u0338", // ≪̸ + [5346] = "\u2224", // ∤ + [5353] = "\u2060", // ⁠ + [5368] = "\u00A0", //   + [5371] = "\u2115", // ℕ + [5375] = "\uD835\uDD5F", // 𝕟 + [5377] = "\u2AEC", // ⫬ + [5378] = "\u00AC", // ¬ + [5379] = "\u00AC", // ¬ + [5389] = "\u2262", // ≢ + [5395] = "\u226D", // ≭ + [5413] = "\u2226", // ∦ + [5421] = "\u2209", // ∉ + [5426] = "\u2260", // ≠ + [5432] = "\u2242\u0338", // ≂̸ + [5438] = "\u2204", // ∄ + [5446] = "\u226F", // ≯ + [5452] = "\u2271", // ≱ + [5462] = "\u2267\u0338", // ≧̸ + [5470] = "\u226B\u0338", // ≫̸ + [5475] = "\u2279", // ≹ + [5486] = "\u2A7E\u0338", // ⩾̸ + [5492] = "\u2275", // ≵ + [5505] = "\u224E\u0338", // ≎̸ + [5511] = "\u224F\u0338", // ≏̸ + [5514] = "\u2209", // ∉ + [5518] = "\u22F5\u0338", // ⋵̸ + [5520] = "\u22F9\u0338", // ⋹̸ + [5523] = "\u2209", // ∉ + [5525] = "\u22F7", // ⋷ + [5527] = "\u22F6", // ⋶ + [5540] = "\u22EA", // ⋪ + [5544] = "\u29CF\u0338", // ⧏̸ + [5550] = "\u22EC", // ⋬ + [5553] = "\u226E", // ≮ + [5559] = "\u2270", // ≰ + [5567] = "\u2278", // ≸ + [5572] = "\u226A\u0338", // ≪̸ + [5583] = "\u2A7D\u0338", // ⩽̸ + [5589] = "\u2274", // ≴ + [5610] = "\u2AA2\u0338", // ⪢̸ + [5619] = "\u2AA1\u0338", // ⪡̸ + [5622] = "\u220C", // ∌ + [5625] = "\u220C", // ∌ + [5627] = "\u22FE", // ⋾ + [5629] = "\u22FD", // ⋽ + [5638] = "\u2280", // ⊀ + [5644] = "\u2AAF\u0338", // ⪯̸ + [5655] = "\u22E0", // ⋠ + [5670] = "\u220C", // ∌ + [5683] = "\u22EB", // ⋫ + [5687] = "\u29D0\u0338", // ⧐̸ + [5693] = "\u22ED", // ⋭ + [5706] = "\u228F\u0338", // ⊏̸ + [5712] = "\u22E2", // ⋢ + [5719] = "\u2290\u0338", // ⊐̸ + [5725] = "\u22E3", // ⋣ + [5731] = "\u2282\u20D2", // ⊂⃒ + [5737] = "\u2288", // ⊈ + [5744] = "\u2281", // ⊁ + [5750] = "\u2AB0\u0338", // ⪰̸ + [5761] = "\u22E1", // ⋡ + [5767] = "\u227F\u0338", // ≿̸ + [5774] = "\u2283\u20D2", // ⊃⃒ + [5780] = "\u2289", // ⊉ + [5786] = "\u2241", // ≁ + [5792] = "\u2244", // ≄ + [5802] = "\u2247", // ≇ + [5808] = "\u2249", // ≉ + [5820] = "\u2224", // ∤ + [5824] = "\u2226", // ∦ + [5830] = "\u2226", // ∦ + [5833] = "\u2AFD\u20E5", // ⫽⃥ + [5835] = "\u2202\u0338", // ∂̸ + [5841] = "\u2A14", // ⨔ + [5843] = "\u2280", // ⊀ + [5847] = "\u22E0", // ⋠ + [5849] = "\u2AAF\u0338", // ⪯̸ + [5851] = "\u2280", // ⊀ + [5854] = "\u2AAF\u0338", // ⪯̸ + [5859] = "\u21CF", // ⇏ + [5863] = "\u219B", // ↛ + [5865] = "\u2933\u0338", // ⤳̸ + [5867] = "\u219D\u0338", // ↝̸ + [5878] = "\u21CF", // ⇏ + [5888] = "\u219B", // ↛ + [5892] = "\u22EB", // ⋫ + [5894] = "\u22ED", // ⋭ + [5897] = "\u2281", // ⊁ + [5901] = "\u22E1", // ⋡ + [5903] = "\u2AB0\u0338", // ⪰̸ + [5907] = "\uD835\uDCA9", // 𝒩 + [5909] = "\uD835\uDCC3", // 𝓃 + [5917] = "\u2224", // ∤ + [5926] = "\u2226", // ∦ + [5929] = "\u2241", // ≁ + [5931] = "\u2244", // ≄ + [5933] = "\u2244", // ≄ + [5937] = "\u2224", // ∤ + [5941] = "\u2226", // ∦ + [5947] = "\u22E2", // ⋢ + [5950] = "\u22E3", // ⋣ + [5953] = "\u2284", // ⊄ + [5955] = "\u2AC5\u0338", // ⫅̸ + [5957] = "\u2288", // ⊈ + [5961] = "\u2282\u20D2", // ⊂⃒ + [5964] = "\u2288", // ⊈ + [5966] = "\u2AC5\u0338", // ⫅̸ + [5969] = "\u2281", // ⊁ + [5972] = "\u2AB0\u0338", // ⪰̸ + [5974] = "\u2285", // ⊅ + [5976] = "\u2AC6\u0338", // ⫆̸ + [5978] = "\u2289", // ⊉ + [5982] = "\u2283\u20D2", // ⊃⃒ + [5985] = "\u2289", // ⊉ + [5987] = "\u2AC6\u0338", // ⫆̸ + [5991] = "\u2279", // ≹ + [5996] = "\u00D1", // Ñ + [5997] = "\u00D1", // Ñ + [6001] = "\u00F1", // ñ + [6002] = "\u00F1", // ñ + [6005] = "\u2278", // ≸ + [6017] = "\u22EA", // ⋪ + [6020] = "\u22EC", // ⋬ + [6026] = "\u22EB", // ⋫ + [6029] = "\u22ED", // ⋭ + [6031] = "\u039D", // Ν + [6033] = "\u03BD", // ν + [6035] = "\u0023", // # + [6039] = "\u2116", // № + [6042] = "\u2007", //   + [6046] = "\u224D\u20D2", // ≍⃒ + [6052] = "\u22AF", // ⊯ + [6057] = "\u22AE", // ⊮ + [6062] = "\u22AD", // ⊭ + [6067] = "\u22AC", // ⊬ + [6070] = "\u2265\u20D2", // ≥⃒ + [6072] = "\u003E\u20D2", // >⃒ + [6077] = "\u2904", // ⤄ + [6083] = "\u29DE", // ⧞ + [6088] = "\u2902", // ⤂ + [6090] = "\u2264\u20D2", // ≤⃒ + [6092] = "\u003C\u20D2", // <⃒ + [6096] = "\u22B4\u20D2", // ⊴⃒ + [6101] = "\u2903", // ⤃ + [6106] = "\u22B5\u20D2", // ⊵⃒ + [6110] = "\u223C\u20D2", // ∼⃒ + [6116] = "\u2923", // ⤣ + [6120] = "\u21D6", // ⇖ + [6122] = "\u2196", // ↖ + [6125] = "\u2196", // ↖ + [6130] = "\u2927", // ⤧ + [6136] = "\u00D3", // Ó + [6137] = "\u00D3", // Ó + [6143] = "\u00F3", // ó + [6144] = "\u00F3", // ó + [6147] = "\u229B", // ⊛ + [6151] = "\u229A", // ⊚ + [6155] = "\u00D4", // Ô + [6156] = "\u00D4", // Ô + [6157] = "\u00F4", // ô + [6158] = "\u00F4", // ô + [6160] = "\u041E", // О + [6162] = "\u043E", // о + [6167] = "\u229D", // ⊝ + [6173] = "\u0150", // Ő + [6178] = "\u0151", // ő + [6181] = "\u2A38", // ⨸ + [6184] = "\u2299", // ⊙ + [6189] = "\u29BC", // ⦼ + [6194] = "\u0152", // Œ + [6199] = "\u0153", // œ + [6204] = "\u29BF", // ⦿ + [6207] = "\uD835\uDD12", // 𝔒 + [6209] = "\uD835\uDD2C", // 𝔬 + [6213] = "\u02DB", // ˛ + [6218] = "\u00D2", // Ò + [6219] = "\u00D2", // Ò + [6223] = "\u00F2", // ò + [6224] = "\u00F2", // ò + [6226] = "\u29C1", // ⧁ + [6231] = "\u29B5", // ⦵ + [6233] = "\u03A9", // Ω + [6237] = "\u222E", // ∮ + [6242] = "\u21BA", // ↺ + [6246] = "\u29BE", // ⦾ + [6251] = "\u29BB", // ⦻ + [6255] = "\u203E", // ‾ + [6257] = "\u29C0", // ⧀ + [6262] = "\u014C", // Ō + [6267] = "\u014D", // ō + [6271] = "\u03A9", // Ω + [6275] = "\u03C9", // ω + [6281] = "\u039F", // Ο + [6287] = "\u03BF", // ο + [6289] = "\u29B6", // ⦶ + [6293] = "\u2296", // ⊖ + [6297] = "\uD835\uDD46", // 𝕆 + [6301] = "\uD835\uDD60", // 𝕠 + [6305] = "\u29B7", // ⦷ + [6325] = "\u201C", // “ + [6331] = "\u2018", // ‘ + [6335] = "\u29B9", // ⦹ + [6339] = "\u2295", // ⊕ + [6341] = "\u2A54", // ⩔ + [6343] = "\u2228", // ∨ + [6347] = "\u21BB", // ↻ + [6349] = "\u2A5D", // ⩝ + [6352] = "\u2134", // ℴ + [6355] = "\u2134", // ℴ + [6356] = "\u00AA", // ª + [6357] = "\u00AA", // ª + [6358] = "\u00BA", // º + [6359] = "\u00BA", // º + [6364] = "\u22B6", // ⊶ + [6367] = "\u2A56", // ⩖ + [6373] = "\u2A57", // ⩗ + [6375] = "\u2A5B", // ⩛ + [6377] = "\u24C8", // Ⓢ + [6381] = "\uD835\uDCAA", // 𝒪 + [6385] = "\u2134", // ℴ + [6389] = "\u00D8", // Ø + [6390] = "\u00D8", // Ø + [6394] = "\u00F8", // ø + [6395] = "\u00F8", // ø + [6398] = "\u2298", // ⊘ + [6403] = "\u00D5", // Õ + [6404] = "\u00D5", // Õ + [6409] = "\u00F5", // õ + [6410] = "\u00F5", // õ + [6414] = "\u2A37", // ⨷ + [6418] = "\u2297", // ⊗ + [6421] = "\u2A36", // ⨶ + [6424] = "\u00D6", // Ö + [6425] = "\u00D6", // Ö + [6428] = "\u00F6", // ö + [6429] = "\u00F6", // ö + [6434] = "\u233D", // ⌽ + [6441] = "\u203E", // ‾ + [6446] = "\u23DE", // ⏞ + [6450] = "\u23B4", // ⎴ + [6462] = "\u23DC", // ⏜ + [6466] = "\u2225", // ∥ + [6467] = "\u00B6", // ¶ + [6468] = "\u00B6", // ¶ + [6473] = "\u2225", // ∥ + [6477] = "\u2AF3", // ⫳ + [6479] = "\u2AFD", // ⫽ + [6481] = "\u2202", // ∂ + [6490] = "\u2202", // ∂ + [6493] = "\u041F", // П + [6496] = "\u043F", // п + [6502] = "\u0025", // % + [6506] = "\u002E", // . + [6510] = "\u2030", // ‰ + [6512] = "\u22A5", // ⊥ + [6517] = "\u2031", // ‱ + [6520] = "\uD835\uDD13", // 𝔓 + [6523] = "\uD835\uDD2D", // 𝔭 + [6526] = "\u03A6", // Φ + [6529] = "\u03C6", // φ + [6531] = "\u03D5", // ϕ + [6536] = "\u2133", // ℳ + [6540] = "\u260E", // ☎ + [6542] = "\u03A0", // Π + [6544] = "\u03C0", // π + [6552] = "\u22D4", // ⋔ + [6554] = "\u03D6", // ϖ + [6560] = "\u210F", // ℏ + [6562] = "\u210E", // ℎ + [6565] = "\u210F", // ℏ + [6568] = "\u002B", // + + [6573] = "\u2A23", // ⨣ + [6575] = "\u229E", // ⊞ + [6579] = "\u2A22", // ⨢ + [6582] = "\u2214", // ∔ + [6584] = "\u2A25", // ⨥ + [6586] = "\u2A72", // ⩲ + [6595] = "\u00B1", // ± + [6597] = "\u00B1", // ± + [6598] = "\u00B1", // ± + [6602] = "\u2A26", // ⨦ + [6606] = "\u2A27", // ⨧ + [6608] = "\u00B1", // ± + [6621] = "\u210C", // ℌ + [6629] = "\u2A15", // ⨕ + [6632] = "\u2119", // ℙ + [6635] = "\uD835\uDD61", // 𝕡 + [6638] = "\u00A3", // £ + [6639] = "\u00A3", // £ + [6641] = "\u2ABB", // ⪻ + [6643] = "\u227A", // ≺ + [6646] = "\u2AB7", // ⪷ + [6650] = "\u227C", // ≼ + [6652] = "\u2AB3", // ⪳ + [6654] = "\u2AAF", // ⪯ + [6656] = "\u227A", // ≺ + [6663] = "\u2AB7", // ⪷ + [6671] = "\u227C", // ≼ + [6678] = "\u227A", // ≺ + [6684] = "\u2AAF", // ⪯ + [6695] = "\u227C", // ≼ + [6701] = "\u227E", // ≾ + [6704] = "\u2AAF", // ⪯ + [6712] = "\u2AB9", // ⪹ + [6716] = "\u2AB5", // ⪵ + [6720] = "\u22E8", // ⋨ + [6724] = "\u227E", // ≾ + [6728] = "\u2033", // ″ + [6732] = "\u2032", // ′ + [6734] = "\u2119", // ℙ + [6738] = "\u2AB9", // ⪹ + [6740] = "\u2AB5", // ⪵ + [6744] = "\u22E8", // ⋨ + [6747] = "\u220F", // ∏ + [6753] = "\u220F", // ∏ + [6759] = "\u232E", // ⌮ + [6764] = "\u2312", // ⌒ + [6769] = "\u2313", // ⌓ + [6771] = "\u221D", // ∝ + [6779] = "\u2237", // ∷ + [6782] = "\u221D", // ∝ + [6785] = "\u221D", // ∝ + [6789] = "\u227E", // ≾ + [6794] = "\u22B0", // ⊰ + [6798] = "\uD835\uDCAB", // 𝒫 + [6802] = "\uD835\uDCC5", // 𝓅 + [6804] = "\u03A8", // Ψ + [6806] = "\u03C8", // ψ + [6812] = "\u2008", //   + [6816] = "\uD835\uDD14", // 𝔔 + [6820] = "\uD835\uDD2E", // 𝔮 + [6824] = "\u2A0C", // ⨌ + [6828] = "\u211A", // ℚ + [6832] = "\uD835\uDD62", // 𝕢 + [6838] = "\u2057", // ⁗ + [6842] = "\uD835\uDCAC", // 𝒬 + [6846] = "\uD835\uDCC6", // 𝓆 + [6857] = "\u210D", // ℍ + [6861] = "\u2A16", // ⨖ + [6865] = "\u003F", // ? + [6868] = "\u225F", // ≟ + [6871] = "\u0022", // " + [6872] = "\u0022", // " + [6874] = "\u0022", // " + [6875] = "\u0022", // " + [6881] = "\u21DB", // ⇛ + [6885] = "\u223D\u0331", // ∽̱ + [6892] = "\u0154", // Ŕ + [6896] = "\u0155", // ŕ + [6900] = "\u221A", // √ + [6907] = "\u29B3", // ⦳ + [6910] = "\u27EB", // ⟫ + [6913] = "\u27E9", // ⟩ + [6915] = "\u2992", // ⦒ + [6917] = "\u29A5", // ⦥ + [6920] = "\u27E9", // ⟩ + [6923] = "\u00BB", // » + [6924] = "\u00BB", // » + [6927] = "\u21A0", // ↠ + [6930] = "\u21D2", // ⇒ + [6933] = "\u2192", // → + [6936] = "\u2975", // ⥵ + [6938] = "\u21E5", // ⇥ + [6941] = "\u2920", // ⤠ + [6943] = "\u2933", // ⤳ + [6946] = "\u291E", // ⤞ + [6949] = "\u21AA", // ↪ + [6952] = "\u21AC", // ↬ + [6955] = "\u2945", // ⥅ + [6959] = "\u2974", // ⥴ + [6962] = "\u2916", // ⤖ + [6965] = "\u21A3", // ↣ + [6967] = "\u219D", // ↝ + [6972] = "\u291C", // ⤜ + [6977] = "\u291A", // ⤚ + [6980] = "\u2236", // ∶ + [6985] = "\u211A", // ℚ + [6990] = "\u2910", // ⤐ + [6995] = "\u290F", // ⤏ + [7000] = "\u290D", // ⤍ + [7004] = "\u2773", // ❳ + [7009] = "\u007D", // } + [7011] = "\u005D", // ] + [7014] = "\u298C", // ⦌ + [7018] = "\u298E", // ⦎ + [7020] = "\u2990", // ⦐ + [7026] = "\u0158", // Ř + [7032] = "\u0159", // ř + [7037] = "\u0156", // Ŗ + [7042] = "\u0157", // ŗ + [7045] = "\u2309", // ⌉ + [7048] = "\u007D", // } + [7050] = "\u0420", // Р + [7052] = "\u0440", // р + [7056] = "\u2937", // ⤷ + [7062] = "\u2969", // ⥩ + [7066] = "\u201D", // ” + [7068] = "\u201D", // ” + [7071] = "\u21B3", // ↳ + [7073] = "\u211C", // ℜ + [7077] = "\u211C", // ℜ + [7081] = "\u211B", // ℛ + [7086] = "\u211C", // ℜ + [7088] = "\u211D", // ℝ + [7091] = "\u25AD", // ▭ + [7093] = "\u00AE", // ® + [7094] = "\u00AE", // ® + [7095] = "\u00AE", // ® + [7096] = "\u00AE", // ® + [7109] = "\u220B", // ∋ + [7120] = "\u21CB", // ⇋ + [7134] = "\u296F", // ⥯ + [7140] = "\u297D", // ⥽ + [7145] = "\u230B", // ⌋ + [7148] = "\u211C", // ℜ + [7150] = "\uD835\uDD2F", // 𝔯 + [7154] = "\u2964", // ⥤ + [7159] = "\u21C1", // ⇁ + [7161] = "\u21C0", // ⇀ + [7163] = "\u296C", // ⥬ + [7166] = "\u03A1", // Ρ + [7168] = "\u03C1", // ρ + [7170] = "\u03F1", // ϱ + [7187] = "\u27E9", // ⟩ + [7192] = "\u2192", // → + [7198] = "\u21D2", // ⇒ + [7208] = "\u2192", // → + [7212] = "\u21E5", // ⇥ + [7222] = "\u21C4", // ⇄ + [7227] = "\u21A3", // ↣ + [7235] = "\u2309", // ⌉ + [7249] = "\u27E7", // ⟧ + [7261] = "\u295D", // ⥝ + [7268] = "\u21C2", // ⇂ + [7272] = "\u2955", // ⥕ + [7278] = "\u230B", // ⌋ + [7290] = "\u21C1", // ⇁ + [7293] = "\u21C0", // ⇀ + [7304] = "\u21C4", // ⇄ + [7313] = "\u21CC", // ⇌ + [7325] = "\u21C9", // ⇉ + [7336] = "\u219D", // ↝ + [7340] = "\u22A2", // ⊢ + [7346] = "\u21A6", // ↦ + [7353] = "\u295B", // ⥛ + [7364] = "\u22CC", // ⋌ + [7372] = "\u22B3", // ⊳ + [7376] = "\u29D0", // ⧐ + [7382] = "\u22B5", // ⊵ + [7395] = "\u294F", // ⥏ + [7405] = "\u295C", // ⥜ + [7412] = "\u21BE", // ↾ + [7416] = "\u2954", // ⥔ + [7423] = "\u21C0", // ⇀ + [7427] = "\u2953", // ⥓ + [7430] = "\u02DA", // ˚ + [7441] = "\u2253", // ≓ + [7446] = "\u21C4", // ⇄ + [7450] = "\u21CC", // ⇌ + [7452] = "\u200F", // ‏ + [7458] = "\u23B1", // ⎱ + [7463] = "\u23B1", // ⎱ + [7468] = "\u2AEE", // ⫮ + [7473] = "\u27ED", // ⟭ + [7476] = "\u21FE", // ⇾ + [7480] = "\u27E7", // ⟧ + [7484] = "\u2986", // ⦆ + [7488] = "\u211D", // ℝ + [7490] = "\uD835\uDD63", // 𝕣 + [7494] = "\u2A2E", // ⨮ + [7500] = "\u2A35", // ⨵ + [7511] = "\u2970", // ⥰ + [7515] = "\u0029", // ) + [7518] = "\u2994", // ⦔ + [7525] = "\u2A12", // ⨒ + [7530] = "\u21C9", // ⇉ + [7541] = "\u21DB", // ⇛ + [7547] = "\u203A", // › + [7551] = "\u211B", // ℛ + [7554] = "\uD835\uDCC7", // 𝓇 + [7556] = "\u21B1", // ↱ + [7558] = "\u21B1", // ↱ + [7561] = "\u005D", // ] + [7564] = "\u2019", // ’ + [7566] = "\u2019", // ’ + [7572] = "\u22CC", // ⋌ + [7577] = "\u22CA", // ⋊ + [7580] = "\u25B9", // ▹ + [7582] = "\u22B5", // ⊵ + [7584] = "\u25B8", // ▸ + [7589] = "\u29CE", // ⧎ + [7600] = "\u29F4", // ⧴ + [7607] = "\u2968", // ⥨ + [7609] = "\u211E", // ℞ + [7616] = "\u015A", // Ś + [7623] = "\u015B", // ś + [7628] = "\u201A", // ‚ + [7630] = "\u2ABC", // ⪼ + [7632] = "\u227B", // ≻ + [7635] = "\u2AB8", // ⪸ + [7640] = "\u0160", // Š + [7644] = "\u0161", // š + [7648] = "\u227D", // ≽ + [7650] = "\u2AB4", // ⪴ + [7652] = "\u2AB0", // ⪰ + [7657] = "\u015E", // Ş + [7661] = "\u015F", // ş + [7665] = "\u015C", // Ŝ + [7669] = "\u015D", // ŝ + [7673] = "\u2ABA", // ⪺ + [7675] = "\u2AB6", // ⪶ + [7679] = "\u22E9", // ⋩ + [7686] = "\u2A13", // ⨓ + [7690] = "\u227F", // ≿ + [7692] = "\u0421", // С + [7694] = "\u0441", // с + [7698] = "\u22C5", // ⋅ + [7700] = "\u22A1", // ⊡ + [7702] = "\u2A66", // ⩦ + [7708] = "\u2925", // ⤥ + [7712] = "\u21D8", // ⇘ + [7714] = "\u2198", // ↘ + [7717] = "\u2198", // ↘ + [7719] = "\u00A7", // § + [7720] = "\u00A7", // § + [7723] = "\u003B", // ; + [7728] = "\u2929", // ⤩ + [7735] = "\u2216", // ∖ + [7737] = "\u2216", // ∖ + [7740] = "\u2736", // ✶ + [7743] = "\uD835\uDD16", // 𝔖 + [7746] = "\uD835\uDD30", // 𝔰 + [7750] = "\u2322", // ⌢ + [7755] = "\u266F", // ♯ + [7761] = "\u0429", // Щ + [7766] = "\u0449", // щ + [7769] = "\u0428", // Ш + [7771] = "\u0448", // ш + [7785] = "\u2193", // ↓ + [7795] = "\u2190", // ← + [7802] = "\u2223", // ∣ + [7811] = "\u2225", // ∥ + [7822] = "\u2192", // → + [7830] = "\u2191", // ↑ + [7831] = "\u00AD", // ­ + [7832] = "\u00AD", // ­ + [7837] = "\u03A3", // Σ + [7842] = "\u03C3", // σ + [7844] = "\u03C2", // ς + [7846] = "\u03C2", // ς + [7848] = "\u223C", // ∼ + [7852] = "\u2A6A", // ⩪ + [7854] = "\u2243", // ≃ + [7856] = "\u2243", // ≃ + [7858] = "\u2A9E", // ⪞ + [7860] = "\u2AA0", // ⪠ + [7862] = "\u2A9D", // ⪝ + [7864] = "\u2A9F", // ⪟ + [7867] = "\u2246", // ≆ + [7872] = "\u2A24", // ⨤ + [7877] = "\u2972", // ⥲ + [7882] = "\u2190", // ← + [7893] = "\u2218", // ∘ + [7906] = "\u2216", // ∖ + [7910] = "\u2A33", // ⨳ + [7917] = "\u29E4", // ⧤ + [7920] = "\u2223", // ∣ + [7923] = "\u2323", // ⌣ + [7925] = "\u2AAA", // ⪪ + [7927] = "\u2AAC", // ⪬ + [7929] = "\u2AAC\uFE00", // ⪬︀ + [7935] = "\u042C", // Ь + [7941] = "\u044C", // ь + [7943] = "\u002F", // / + [7945] = "\u29C4", // ⧄ + [7948] = "\u233F", // ⌿ + [7952] = "\uD835\uDD4A", // 𝕊 + [7955] = "\uD835\uDD64", // 𝕤 + [7961] = "\u2660", // ♠ + [7965] = "\u2660", // ♠ + [7967] = "\u2225", // ∥ + [7972] = "\u2293", // ⊓ + [7974] = "\u2293\uFE00", // ⊓︀ + [7977] = "\u2294", // ⊔ + [7979] = "\u2294\uFE00", // ⊔︀ + [7983] = "\u221A", // √ + [7987] = "\u228F", // ⊏ + [7989] = "\u2291", // ⊑ + [7993] = "\u228F", // ⊏ + [7996] = "\u2291", // ⊑ + [7998] = "\u2290", // ⊐ + [8000] = "\u2292", // ⊒ + [8004] = "\u2290", // ⊐ + [8007] = "\u2292", // ⊒ + [8009] = "\u25A1", // □ + [8014] = "\u25A1", // □ + [8018] = "\u25A1", // □ + [8031] = "\u2293", // ⊓ + [8038] = "\u228F", // ⊏ + [8044] = "\u2291", // ⊑ + [8051] = "\u2290", // ⊐ + [8057] = "\u2292", // ⊒ + [8063] = "\u2294", // ⊔ + [8065] = "\u25AA", // ▪ + [8067] = "\u25AA", // ▪ + [8072] = "\u2192", // → + [8076] = "\uD835\uDCAE", // 𝒮 + [8080] = "\uD835\uDCC8", // 𝓈 + [8085] = "\u2216", // ∖ + [8090] = "\u2323", // ⌣ + [8095] = "\u22C6", // ⋆ + [8099] = "\u22C6", // ⋆ + [8103] = "\u2606", // ☆ + [8105] = "\u2605", // ★ + [8119] = "\u03F5", // ϵ + [8123] = "\u03D5", // ϕ + [8126] = "\u00AF", // ¯ + [8129] = "\u22D0", // ⋐ + [8132] = "\u2282", // ⊂ + [8136] = "\u2ABD", // ⪽ + [8138] = "\u2AC5", // ⫅ + [8140] = "\u2286", // ⊆ + [8144] = "\u2AC3", // ⫃ + [8149] = "\u2AC1", // ⫁ + [8152] = "\u2ACB", // ⫋ + [8154] = "\u228A", // ⊊ + [8159] = "\u2ABF", // ⪿ + [8164] = "\u2979", // ⥹ + [8168] = "\u22D0", // ⋐ + [8172] = "\u2282", // ⊂ + [8175] = "\u2286", // ⊆ + [8177] = "\u2AC5", // ⫅ + [8183] = "\u2286", // ⊆ + [8187] = "\u228A", // ⊊ + [8189] = "\u2ACB", // ⫋ + [8192] = "\u2AC7", // ⫇ + [8195] = "\u2AD5", // ⫕ + [8197] = "\u2AD3", // ⫓ + [8200] = "\u227B", // ≻ + [8207] = "\u2AB8", // ⪸ + [8215] = "\u227D", // ≽ + [8222] = "\u227B", // ≻ + [8228] = "\u2AB0", // ⪰ + [8239] = "\u227D", // ≽ + [8245] = "\u227F", // ≿ + [8248] = "\u2AB0", // ⪰ + [8256] = "\u2ABA", // ⪺ + [8260] = "\u2AB6", // ⪶ + [8264] = "\u22E9", // ⋩ + [8268] = "\u227F", // ≿ + [8274] = "\u220B", // ∋ + [8276] = "\u2211", // ∑ + [8278] = "\u2211", // ∑ + [8281] = "\u266A", // ♪ + [8283] = "\u22D1", // ⋑ + [8285] = "\u2283", // ⊃ + [8286] = "\u00B9", // ¹ + [8287] = "\u00B9", // ¹ + [8288] = "\u00B2", // ² + [8289] = "\u00B2", // ² + [8290] = "\u00B3", // ³ + [8291] = "\u00B3", // ³ + [8295] = "\u2ABE", // ⪾ + [8299] = "\u2AD8", // ⫘ + [8301] = "\u2AC6", // ⫆ + [8303] = "\u2287", // ⊇ + [8307] = "\u2AC4", // ⫄ + [8313] = "\u2283", // ⊃ + [8319] = "\u2287", // ⊇ + [8324] = "\u27C9", // ⟉ + [8327] = "\u2AD7", // ⫗ + [8332] = "\u297B", // ⥻ + [8337] = "\u2AC2", // ⫂ + [8340] = "\u2ACC", // ⫌ + [8342] = "\u228B", // ⊋ + [8347] = "\u2AC0", // ⫀ + [8351] = "\u22D1", // ⋑ + [8355] = "\u2283", // ⊃ + [8358] = "\u2287", // ⊇ + [8360] = "\u2AC6", // ⫆ + [8364] = "\u228B", // ⊋ + [8366] = "\u2ACC", // ⫌ + [8369] = "\u2AC8", // ⫈ + [8372] = "\u2AD4", // ⫔ + [8374] = "\u2AD6", // ⫖ + [8380] = "\u2926", // ⤦ + [8384] = "\u21D9", // ⇙ + [8386] = "\u2199", // ↙ + [8389] = "\u2199", // ↙ + [8394] = "\u292A", // ⤪ + [8398] = "\u00DF", // ß + [8399] = "\u00DF", // ß + [8403] = "\u0009", // + [8410] = "\u2316", // ⌖ + [8412] = "\u03A4", // Τ + [8414] = "\u03C4", // τ + [8418] = "\u23B4", // ⎴ + [8424] = "\u0164", // Ť + [8430] = "\u0165", // ť + [8435] = "\u0162", // Ţ + [8440] = "\u0163", // ţ + [8442] = "\u0422", // Т + [8444] = "\u0442", // т + [8448] = "\u20DB", // ⃛ + [8454] = "\u2315", // ⌕ + [8457] = "\uD835\uDD17", // 𝔗 + [8460] = "\uD835\uDD31", // 𝔱 + [8466] = "\u2234", // ∴ + [8475] = "\u2234", // ∴ + [8480] = "\u2234", // ∴ + [8483] = "\u0398", // Θ + [8486] = "\u03B8", // θ + [8490] = "\u03D1", // ϑ + [8492] = "\u03D1", // ϑ + [8502] = "\u2248", // ≈ + [8506] = "\u223C", // ∼ + [8515] = "\u205F\u200A", //    + [8519] = "\u2009", //   + [8526] = "\u2009", //   + [8530] = "\u2248", // ≈ + [8534] = "\u223C", // ∼ + [8538] = "\u00DE", // Þ + [8539] = "\u00DE", // Þ + [8542] = "\u00FE", // þ + [8543] = "\u00FE", // þ + [8548] = "\u223C", // ∼ + [8553] = "\u02DC", // ˜ + [8559] = "\u2243", // ≃ + [8569] = "\u2245", // ≅ + [8575] = "\u2248", // ≈ + [8578] = "\u00D7", // × + [8579] = "\u00D7", // × + [8581] = "\u22A0", // ⊠ + [8584] = "\u2A31", // ⨱ + [8586] = "\u2A30", // ⨰ + [8589] = "\u222D", // ∭ + [8593] = "\u2928", // ⤨ + [8595] = "\u22A4", // ⊤ + [8599] = "\u2336", // ⌶ + [8603] = "\u2AF1", // ⫱ + [8607] = "\uD835\uDD4B", // 𝕋 + [8609] = "\uD835\uDD65", // 𝕥 + [8613] = "\u2ADA", // ⫚ + [8616] = "\u2929", // ⤩ + [8622] = "\u2034", // ‴ + [8627] = "\u2122", // ™ + [8632] = "\u2122", // ™ + [8639] = "\u25B5", // ▵ + [8644] = "\u25BF", // ▿ + [8649] = "\u25C3", // ◃ + [8652] = "\u22B4", // ⊴ + [8654] = "\u225C", // ≜ + [8660] = "\u25B9", // ▹ + [8663] = "\u22B5", // ⊵ + [8667] = "\u25EC", // ◬ + [8669] = "\u225C", // ≜ + [8675] = "\u2A3A", // ⨺ + [8684] = "\u20DB", // ⃛ + [8689] = "\u2A39", // ⨹ + [8692] = "\u29CD", // ⧍ + [8697] = "\u2A3B", // ⨻ + [8704] = "\u23E2", // ⏢ + [8708] = "\uD835\uDCAF", // 𝒯 + [8712] = "\uD835\uDCC9", // 𝓉 + [8716] = "\u0426", // Ц + [8718] = "\u0446", // ц + [8722] = "\u040B", // Ћ + [8726] = "\u045B", // ћ + [8731] = "\u0166", // Ŧ + [8736] = "\u0167", // ŧ + [8741] = "\u226C", // ≬ + [8756] = "\u219E", // ↞ + [8767] = "\u21A0", // ↠ + [8773] = "\u00DA", // Ú + [8774] = "\u00DA", // Ú + [8780] = "\u00FA", // ú + [8781] = "\u00FA", // ú + [8784] = "\u219F", // ↟ + [8788] = "\u21D1", // ⇑ + [8791] = "\u2191", // ↑ + [8796] = "\u2949", // ⥉ + [8801] = "\u040E", // Ў + [8806] = "\u045E", // ў + [8810] = "\u016C", // Ŭ + [8814] = "\u016D", // ŭ + [8818] = "\u00DB", // Û + [8819] = "\u00DB", // Û + [8823] = "\u00FB", // û + [8824] = "\u00FB", // û + [8826] = "\u0423", // У + [8828] = "\u0443", // у + [8833] = "\u21C5", // ⇅ + [8839] = "\u0170", // Ű + [8844] = "\u0171", // ű + [8848] = "\u296E", // ⥮ + [8854] = "\u297E", // ⥾ + [8857] = "\uD835\uDD18", // 𝔘 + [8859] = "\uD835\uDD32", // 𝔲 + [8864] = "\u00D9", // Ù + [8865] = "\u00D9", // Ù + [8870] = "\u00F9", // ù + [8871] = "\u00F9", // ù + [8875] = "\u2963", // ⥣ + [8880] = "\u21BF", // ↿ + [8882] = "\u21BE", // ↾ + [8886] = "\u2580", // ▀ + [8892] = "\u231C", // ⌜ + [8895] = "\u231C", // ⌜ + [8899] = "\u230F", // ⌏ + [8903] = "\u25F8", // ◸ + [8908] = "\u016A", // Ū + [8913] = "\u016B", // ū + [8914] = "\u00A8", // ¨ + [8915] = "\u00A8", // ¨ + [8923] = "\u005F", // _ + [8928] = "\u23DF", // ⏟ + [8932] = "\u23B5", // ⎵ + [8944] = "\u23DD", // ⏝ + [8948] = "\u22C3", // ⋃ + [8953] = "\u228E", // ⊎ + [8958] = "\u0172", // Ų + [8963] = "\u0173", // ų + [8966] = "\uD835\uDD4C", // 𝕌 + [8969] = "\uD835\uDD66", // 𝕦 + [8976] = "\u2191", // ↑ + [8982] = "\u21D1", // ⇑ + [8989] = "\u2191", // ↑ + [8993] = "\u2912", // ⤒ + [9003] = "\u21C5", // ⇅ + [9013] = "\u2195", // ↕ + [9023] = "\u21D5", // ⇕ + [9033] = "\u2195", // ↕ + [9045] = "\u296E", // ⥮ + [9057] = "\u21BF", // ↿ + [9063] = "\u21BE", // ↾ + [9067] = "\u228E", // ⊎ + [9080] = "\u2196", // ↖ + [9091] = "\u2197", // ↗ + [9094] = "\u03D2", // ϒ + [9097] = "\u03C5", // υ + [9099] = "\u03D2", // ϒ + [9103] = "\u03A5", // Υ + [9107] = "\u03C5", // υ + [9111] = "\u22A5", // ⊥ + [9117] = "\u21A5", // ↥ + [9126] = "\u21C8", // ⇈ + [9132] = "\u231D", // ⌝ + [9135] = "\u231D", // ⌝ + [9139] = "\u230E", // ⌎ + [9144] = "\u016E", // Ů + [9148] = "\u016F", // ů + [9152] = "\u25F9", // ◹ + [9156] = "\uD835\uDCB0", // 𝒰 + [9160] = "\uD835\uDCCA", // 𝓊 + [9165] = "\u22F0", // ⋰ + [9171] = "\u0168", // Ũ + [9176] = "\u0169", // ũ + [9179] = "\u25B5", // ▵ + [9181] = "\u25B4", // ▴ + [9186] = "\u21C8", // ⇈ + [9189] = "\u00DC", // Ü + [9190] = "\u00DC", // Ü + [9192] = "\u00FC", // ü + [9193] = "\u00FC", // ü + [9200] = "\u29A7", // ⦧ + [9207] = "\u299C", // ⦜ + [9216] = "\u03F5", // ϵ + [9222] = "\u03F0", // ϰ + [9230] = "\u2205", // ∅ + [9234] = "\u03D5", // ϕ + [9236] = "\u03D6", // ϖ + [9242] = "\u221D", // ∝ + [9246] = "\u21D5", // ⇕ + [9248] = "\u2195", // ↕ + [9251] = "\u03F1", // ϱ + [9257] = "\u03C2", // ς + [9266] = "\u228A\uFE00", // ⊊︀ + [9268] = "\u2ACB\uFE00", // ⫋︀ + [9276] = "\u228B\uFE00", // ⊋︀ + [9278] = "\u2ACC\uFE00", // ⫌︀ + [9284] = "\u03D1", // ϑ + [9296] = "\u22B2", // ⊲ + [9302] = "\u22B3", // ⊳ + [9307] = "\u2AEB", // ⫫ + [9311] = "\u2AE8", // ⫨ + [9313] = "\u2AE9", // ⫩ + [9316] = "\u0412", // В + [9319] = "\u0432", // в + [9324] = "\u22AB", // ⊫ + [9329] = "\u22A9", // ⊩ + [9334] = "\u22A8", // ⊨ + [9339] = "\u22A2", // ⊢ + [9341] = "\u2AE6", // ⫦ + [9344] = "\u22C1", // ⋁ + [9347] = "\u2228", // ∨ + [9351] = "\u22BB", // ⊻ + [9354] = "\u225A", // ≚ + [9359] = "\u22EE", // ⋮ + [9364] = "\u2016", // ‖ + [9369] = "\u007C", // | + [9371] = "\u2016", // ‖ + [9373] = "\u007C", // | + [9381] = "\u2223", // ∣ + [9386] = "\u007C", // | + [9396] = "\u2758", // ❘ + [9402] = "\u2240", // ≀ + [9413] = "\u200A", //   + [9416] = "\uD835\uDD19", // 𝔙 + [9419] = "\uD835\uDD33", // 𝔳 + [9424] = "\u22B2", // ⊲ + [9429] = "\u2282\u20D2", // ⊂⃒ + [9431] = "\u2283\u20D2", // ⊃⃒ + [9435] = "\uD835\uDD4D", // 𝕍 + [9439] = "\uD835\uDD67", // 𝕧 + [9444] = "\u221D", // ∝ + [9449] = "\u22B3", // ⊳ + [9453] = "\uD835\uDCB1", // 𝒱 + [9457] = "\uD835\uDCCB", // 𝓋 + [9462] = "\u2ACB\uFE00", // ⫋︀ + [9464] = "\u228A\uFE00", // ⊊︀ + [9468] = "\u2ACC\uFE00", // ⫌︀ + [9470] = "\u228B\uFE00", // ⊋︀ + [9476] = "\u22AA", // ⊪ + [9483] = "\u299A", // ⦚ + [9489] = "\u0174", // Ŵ + [9495] = "\u0175", // ŵ + [9501] = "\u2A5F", // ⩟ + [9506] = "\u22C0", // ⋀ + [9509] = "\u2227", // ∧ + [9511] = "\u2259", // ≙ + [9516] = "\u2118", // ℘ + [9519] = "\uD835\uDD1A", // 𝔚 + [9522] = "\uD835\uDD34", // 𝔴 + [9526] = "\uD835\uDD4E", // 𝕎 + [9530] = "\uD835\uDD68", // 𝕨 + [9532] = "\u2118", // ℘ + [9534] = "\u2240", // ≀ + [9539] = "\u2240", // ≀ + [9543] = "\uD835\uDCB2", // 𝒲 + [9547] = "\uD835\uDCCC", // 𝓌 + [9552] = "\u22C2", // ⋂ + [9556] = "\u25EF", // ◯ + [9559] = "\u22C3", // ⋃ + [9564] = "\u25BD", // ▽ + [9568] = "\uD835\uDD1B", // 𝔛 + [9571] = "\uD835\uDD35", // 𝔵 + [9576] = "\u27FA", // ⟺ + [9580] = "\u27F7", // ⟷ + [9582] = "\u039E", // Ξ + [9584] = "\u03BE", // ξ + [9589] = "\u27F8", // ⟸ + [9593] = "\u27F5", // ⟵ + [9597] = "\u27FC", // ⟼ + [9601] = "\u22FB", // ⋻ + [9606] = "\u2A00", // ⨀ + [9610] = "\uD835\uDD4F", // 𝕏 + [9613] = "\uD835\uDD69", // 𝕩 + [9617] = "\u2A01", // ⨁ + [9622] = "\u2A02", // ⨂ + [9627] = "\u27F9", // ⟹ + [9631] = "\u27F6", // ⟶ + [9635] = "\uD835\uDCB3", // 𝒳 + [9639] = "\uD835\uDCCD", // 𝓍 + [9644] = "\u2A06", // ⨆ + [9650] = "\u2A04", // ⨄ + [9654] = "\u25B3", // △ + [9658] = "\u22C1", // ⋁ + [9664] = "\u22C0", // ⋀ + [9670] = "\u00DD", // Ý + [9671] = "\u00DD", // Ý + [9677] = "\u00FD", // ý + [9678] = "\u00FD", // ý + [9682] = "\u042F", // Я + [9684] = "\u044F", // я + [9689] = "\u0176", // Ŷ + [9694] = "\u0177", // ŷ + [9696] = "\u042B", // Ы + [9698] = "\u044B", // ы + [9700] = "\u00A5", // ¥ + [9701] = "\u00A5", // ¥ + [9704] = "\uD835\uDD1C", // 𝔜 + [9707] = "\uD835\uDD36", // 𝔶 + [9711] = "\u0407", // Ї + [9715] = "\u0457", // ї + [9719] = "\uD835\uDD50", // 𝕐 + [9723] = "\uD835\uDD6A", // 𝕪 + [9727] = "\uD835\uDCB4", // 𝒴 + [9731] = "\uD835\uDCCE", // 𝓎 + [9735] = "\u042E", // Ю + [9739] = "\u044E", // ю + [9743] = "\u0178", // Ÿ + [9745] = "\u00FF", // ÿ + [9746] = "\u00FF", // ÿ + [9753] = "\u0179", // Ź + [9760] = "\u017A", // ź + [9766] = "\u017D", // Ž + [9772] = "\u017E", // ž + [9774] = "\u0417", // З + [9776] = "\u0437", // з + [9780] = "\u017B", // Ż + [9784] = "\u017C", // ż + [9790] = "\u2128", // ℨ + [9804] = "\u200B", // ​ + [9807] = "\u0396", // Ζ + [9810] = "\u03B6", // ζ + [9813] = "\u2128", // ℨ + [9816] = "\uD835\uDD37", // 𝔷 + [9820] = "\u0416", // Ж + [9824] = "\u0436", // ж + [9831] = "\u21DD", // ⇝ + [9835] = "\u2124", // ℤ + [9839] = "\uD835\uDD6B", // 𝕫 + [9843] = "\uD835\uDCB5", // 𝒵 + [9847] = "\uD835\uDCCF", // 𝓏 + [9850] = "\u200D", // ‍ + [9853] = "\u200C", // ‌ + }; + } + + static int BinarySearchNextState (Transition[] transitions, int state) + { + int min = 0, max = transitions.Length; + + if (max == 0) + return -1; + + do { + int i = min + ((max - min) / 2); + + if (state > transitions[i].From) { + min = i + 1; + } else if (state < transitions[i].From) { + max = i; + } else { + return transitions[i].To; + } + } while (min < max); + + return -1; + } + bool PushNamedEntity (char c) { - int state = states[index - 1]; + int next, state = states[index - 1]; + Transition[] table = null; switch (c) { - case '1': - switch (state) { - case 566: state = 567; break; // &blk -> &blk1 - case 2280: state = 2282; break; // &emsp -> &emsp1 - case 2649: state = 2650; break; // &frac -> &frac1 - case 8284: state = 8286; break; // &sup -> ¹ - default: return false; - } - break; - case '2': - switch (state) { - case 567: state = 568; break; // &blk1 -> &blk12 - case 2649: state = 2663; break; // &frac -> &frac2 - case 2650: state = 2651; break; // &frac1 -> ½ - case 8284: state = 8288; break; // &sup -> ² - default: return false; - } - break; - case '3': - switch (state) { - case 566: state = 572; break; // &blk -> &blk3 - case 2282: state = 2283; break; // &emsp1 -> &emsp13 - case 2649: state = 2668; break; // &frac -> &frac3 - case 2650: state = 2653; break; // &frac1 -> &frac13 - case 2663: state = 2664; break; // &frac2 -> &frac23 - case 8284: state = 8290; break; // &sup -> ³ - default: return false; - } - break; - case '4': - switch (state) { - case 567: state = 570; break; // &blk1 -> &blk14 - case 572: state = 573; break; // &blk3 -> &blk34 - case 2282: state = 2285; break; // &emsp1 -> &emsp14 - case 2649: state = 2675; break; // &frac -> &frac4 - case 2650: state = 2655; break; // &frac1 -> ¼ - case 2668: state = 2669; break; // &frac3 -> ¾ - case 8464: state = 8465; break; // &there -> &there4 - default: return false; - } - break; - case '5': - switch (state) { - case 2649: state = 2678; break; // &frac -> &frac5 - case 2650: state = 2657; break; // &frac1 -> &frac15 - case 2663: state = 2666; break; // &frac2 -> &frac25 - case 2668: state = 2671; break; // &frac3 -> &frac35 - case 2675: state = 2676; break; // &frac4 -> &frac45 - default: return false; - } - break; - case '6': - switch (state) { - case 2650: state = 2659; break; // &frac1 -> &frac16 - case 2678: state = 2679; break; // &frac5 -> &frac56 - default: return false; - } - break; - case '7': - switch (state) { - case 2649: state = 2683; break; // &frac -> &frac7 - default: return false; - } - break; - case '8': - switch (state) { - case 2650: state = 2661; break; // &frac1 -> &frac18 - case 2668: state = 2673; break; // &frac3 -> &frac38 - case 2678: state = 2681; break; // &frac5 -> &frac58 - case 2683: state = 2684; break; // &frac7 -> &frac78 - default: return false; - } - break; - case ';': - switch (state) { - case 6: state = 7; break; // Á -> Á - case 13: state = 14; break; // á -> á - case 19: state = 20; break; // &Abreve -> Ă - case 25: state = 26; break; // &abreve -> ă - case 27: state = 28; break; // &ac -> ∾ - case 29: state = 30; break; // &acd -> ∿ - case 31: state = 32; break; // &acE -> ∾̳ - case 36: state = 37; break; //  ->  - case 40: state = 41; break; // â -> â - case 44: state = 45; break; // ´ -> ´ - case 46: state = 47; break; // &Acy -> А - case 48: state = 49; break; // &acy -> а - case 53: state = 54; break; // Æ -> Æ - case 58: state = 59; break; // æ -> æ - case 60: state = 61; break; // &af -> ⁡ - case 63: state = 64; break; // &Afr -> 𝔄 - case 65: state = 66; break; // &afr -> 𝔞 - case 71: state = 72; break; // À -> À - case 77: state = 78; break; // à -> à - case 84: state = 85; break; // &alefsym -> ℵ - case 87: state = 88; break; // &aleph -> ℵ - case 92: state = 93; break; // &Alpha -> Α - case 96: state = 97; break; // &alpha -> α - case 101: state = 102; break; // &Amacr -> Ā - case 106: state = 107; break; // &amacr -> ā - case 109: state = 110; break; // &amalg -> ⨿ - case 112: state = 113; break; // & -> & - case 114: state = 115; break; // & -> & - case 117: state = 118; break; // &And -> ⩓ - case 120: state = 121; break; // &and -> ∧ - case 124: state = 125; break; // &andand -> ⩕ - case 126: state = 127; break; // &andd -> ⩜ - case 132: state = 133; break; // &andslope -> ⩘ - case 134: state = 135; break; // &andv -> ⩚ - case 136: state = 137; break; // &ang -> ∠ - case 138: state = 139; break; // &ange -> ⦤ - case 141: state = 142; break; // &angle -> ∠ - case 145: state = 146; break; // &angmsd -> ∡ - case 148: state = 149; break; // &angmsdaa -> ⦨ - case 150: state = 151; break; // &angmsdab -> ⦩ - case 152: state = 153; break; // &angmsdac -> ⦪ - case 154: state = 155; break; // &angmsdad -> ⦫ - case 156: state = 157; break; // &angmsdae -> ⦬ - case 158: state = 159; break; // &angmsdaf -> ⦭ - case 160: state = 161; break; // &angmsdag -> ⦮ - case 162: state = 163; break; // &angmsdah -> ⦯ - case 165: state = 166; break; // &angrt -> ∟ - case 168: state = 169; break; // &angrtvb -> ⊾ - case 170: state = 171; break; // &angrtvbd -> ⦝ - case 174: state = 175; break; // &angsph -> ∢ - case 176: state = 177; break; // &angst -> Å - case 181: state = 182; break; // &angzarr -> ⍼ - case 186: state = 187; break; // &Aogon -> Ą - case 191: state = 192; break; // &aogon -> ą - case 194: state = 195; break; // &Aopf -> 𝔸 - case 197: state = 198; break; // &aopf -> 𝕒 - case 199: state = 200; break; // &ap -> ≈ - case 204: state = 205; break; // &apacir -> ⩯ - case 206: state = 207; break; // &apE -> ⩰ - case 208: state = 209; break; // &ape -> ≊ - case 211: state = 212; break; // &apid -> ≋ - case 214: state = 215; break; // &apos -> ' - case 227: state = 228; break; // &ApplyFunction -> ⁡ - case 232: state = 233; break; // &approx -> ≈ - case 235: state = 236; break; // &approxeq -> ≊ - case 240: state = 241; break; // Å -> Å - case 245: state = 246; break; // å -> å - case 249: state = 250; break; // &Ascr -> 𝒜 - case 253: state = 254; break; // &ascr -> 𝒶 - case 258: state = 259; break; // &Assign -> ≔ - case 260: state = 261; break; // &ast -> * - case 264: state = 265; break; // &asymp -> ≈ - case 267: state = 268; break; // &asympeq -> ≍ - case 273: state = 274; break; // à -> à - case 279: state = 280; break; // ã -> ã - case 283: state = 284; break; // Ä -> Ä - case 287: state = 288; break; // ä -> ä - case 295: state = 296; break; // &awconint -> ∳ - case 299: state = 300; break; // &awint -> ⨑ - case 308: state = 309; break; // &backcong -> ≌ - case 316: state = 317; break; // &backepsilon -> ϶ - case 322: state = 323; break; // &backprime -> ‵ - case 326: state = 327; break; // &backsim -> ∽ - case 329: state = 330; break; // &backsimeq -> ⋍ - case 339: state = 340; break; // &Backslash -> ∖ - case 342: state = 343; break; // &Barv -> ⫧ - case 347: state = 348; break; // &barvee -> ⊽ - case 351: state = 352; break; // &Barwed -> ⌆ - case 355: state = 356; break; // &barwed -> ⌅ - case 358: state = 359; break; // &barwedge -> ⌅ - case 362: state = 363; break; // &bbrk -> ⎵ - case 367: state = 368; break; // &bbrktbrk -> ⎶ - case 372: state = 373; break; // &bcong -> ≌ - case 375: state = 376; break; // &Bcy -> Б - case 377: state = 378; break; // &bcy -> б - case 382: state = 383; break; // &bdquo -> „ - case 388: state = 389; break; // &becaus -> ∵ - case 395: state = 396; break; // &Because -> ∵ - case 397: state = 398; break; // &because -> ∵ - case 403: state = 404; break; // &bemptyv -> ⦰ - case 407: state = 408; break; // &bepsi -> ϶ - case 412: state = 413; break; // &bernou -> ℬ - case 421: state = 422; break; // &Bernoullis -> ℬ - case 424: state = 425; break; // &Beta -> Β - case 427: state = 428; break; // &beta -> β - case 429: state = 430; break; // &beth -> ℶ - case 434: state = 435; break; // &between -> ≬ - case 437: state = 438; break; // &Bfr -> 𝔅 - case 440: state = 441; break; // &bfr -> 𝔟 - case 446: state = 447; break; // &bigcap -> ⋂ - case 450: state = 451; break; // &bigcirc -> ◯ - case 453: state = 454; break; // &bigcup -> ⋃ - case 458: state = 459; break; // &bigodot -> ⨀ - case 463: state = 464; break; // &bigoplus -> ⨁ - case 469: state = 470; break; // &bigotimes -> ⨂ - case 475: state = 476; break; // &bigsqcup -> ⨆ - case 479: state = 480; break; // &bigstar -> ★ - case 492: state = 493; break; // &bigtriangledown -> ▽ - case 495: state = 496; break; // &bigtriangleup -> △ - case 501: state = 502; break; // &biguplus -> ⨄ - case 505: state = 506; break; // &bigvee -> ⋁ - case 511: state = 512; break; // &bigwedge -> ⋀ - case 517: state = 518; break; // &bkarow -> ⤍ - case 529: state = 530; break; // &blacklozenge -> ⧫ - case 536: state = 537; break; // &blacksquare -> ▪ - case 545: state = 546; break; // &blacktriangle -> ▴ - case 550: state = 551; break; // &blacktriangledown -> ▾ - case 555: state = 556; break; // &blacktriangleleft -> ◂ - case 561: state = 562; break; // &blacktriangleright -> ▸ - case 564: state = 565; break; // &blank -> ␣ - case 568: state = 569; break; // &blk12 -> ▒ - case 570: state = 571; break; // &blk14 -> ░ - case 573: state = 574; break; // &blk34 -> ▓ - case 577: state = 578; break; // &block -> █ - case 580: state = 581; break; // &bne -> =⃥ - case 585: state = 586; break; // &bnequiv -> ≡⃥ - case 589: state = 590; break; // &bNot -> ⫭ - case 592: state = 593; break; // &bnot -> ⌐ - case 596: state = 597; break; // &Bopf -> 𝔹 - case 600: state = 601; break; // &bopf -> 𝕓 - case 602: state = 603; break; // &bot -> ⊥ - case 606: state = 607; break; // &bottom -> ⊥ - case 611: state = 612; break; // &bowtie -> ⋈ - case 616: state = 617; break; // &boxbox -> ⧉ - case 619: state = 620; break; // &boxDL -> ╗ - case 621: state = 622; break; // &boxDl -> ╖ - case 624: state = 625; break; // &boxdL -> ╕ - case 626: state = 627; break; // &boxdl -> ┐ - case 628: state = 629; break; // &boxDR -> ╔ - case 630: state = 631; break; // &boxDr -> ╓ - case 632: state = 633; break; // &boxdR -> ╒ - case 634: state = 635; break; // &boxdr -> ┌ - case 636: state = 637; break; // &boxH -> ═ - case 638: state = 639; break; // &boxh -> ─ - case 640: state = 641; break; // &boxHD -> ╦ - case 642: state = 643; break; // &boxHd -> ╤ - case 644: state = 645; break; // &boxhD -> ╥ - case 646: state = 647; break; // &boxhd -> ┬ - case 648: state = 649; break; // &boxHU -> ╩ - case 650: state = 651; break; // &boxHu -> ╧ - case 652: state = 653; break; // &boxhU -> ╨ - case 654: state = 655; break; // &boxhu -> ┴ - case 660: state = 661; break; // &boxminus -> ⊟ - case 665: state = 666; break; // &boxplus -> ⊞ - case 671: state = 672; break; // &boxtimes -> ⊠ - case 674: state = 675; break; // &boxUL -> ╝ - case 676: state = 677; break; // &boxUl -> ╜ - case 679: state = 680; break; // &boxuL -> ╛ - case 681: state = 682; break; // &boxul -> ┘ - case 683: state = 684; break; // &boxUR -> ╚ - case 685: state = 686; break; // &boxUr -> ╙ - case 687: state = 688; break; // &boxuR -> ╘ - case 689: state = 690; break; // &boxur -> └ - case 691: state = 692; break; // &boxV -> ║ - case 693: state = 694; break; // &boxv -> │ - case 695: state = 696; break; // &boxVH -> ╬ - case 697: state = 698; break; // &boxVh -> ╫ - case 699: state = 700; break; // &boxvH -> ╪ - case 701: state = 702; break; // &boxvh -> ┼ - case 703: state = 704; break; // &boxVL -> ╣ - case 705: state = 706; break; // &boxVl -> ╢ - case 707: state = 708; break; // &boxvL -> ╡ - case 709: state = 710; break; // &boxvl -> ┤ - case 711: state = 712; break; // &boxVR -> ╠ - case 713: state = 714; break; // &boxVr -> ╟ - case 715: state = 716; break; // &boxvR -> ╞ - case 717: state = 718; break; // &boxvr -> ├ - case 723: state = 724; break; // &bprime -> ‵ - case 728: state = 729; break; // &Breve -> ˘ - case 733: state = 734; break; // &breve -> ˘ - case 738: state = 739; break; // ¦ -> ¦ - case 742: state = 743; break; // &Bscr -> ℬ - case 746: state = 747; break; // &bscr -> 𝒷 - case 750: state = 751; break; // &bsemi -> ⁏ - case 753: state = 754; break; // &bsim -> ∽ - case 755: state = 756; break; // &bsime -> ⋍ - case 758: state = 759; break; // &bsol -> \ - case 760: state = 761; break; // &bsolb -> ⧅ - case 765: state = 766; break; // &bsolhsub -> ⟈ - case 769: state = 770; break; // &bull -> • - case 772: state = 773; break; // &bullet -> • - case 775: state = 776; break; // &bump -> ≎ - case 777: state = 778; break; // &bumpE -> ⪮ - case 779: state = 780; break; // &bumpe -> ≏ - case 785: state = 786; break; // &Bumpeq -> ≎ - case 787: state = 788; break; // &bumpeq -> ≏ - case 794: state = 795; break; // &Cacute -> Ć - case 801: state = 802; break; // &cacute -> ć - case 803: state = 804; break; // &Cap -> ⋒ - case 805: state = 806; break; // &cap -> ∩ - case 809: state = 810; break; // &capand -> ⩄ - case 815: state = 816; break; // &capbrcup -> ⩉ - case 819: state = 820; break; // &capcap -> ⩋ - case 822: state = 823; break; // &capcup -> ⩇ - case 826: state = 827; break; // &capdot -> ⩀ - case 844: state = 845; break; // &CapitalDifferentialD -> ⅅ - case 846: state = 847; break; // &caps -> ∩︀ - case 850: state = 851; break; // &caret -> ⁁ - case 853: state = 854; break; // &caron -> ˇ - case 859: state = 860; break; // &Cayleys -> ℭ - case 864: state = 865; break; // &ccaps -> ⩍ - case 870: state = 871; break; // &Ccaron -> Č - case 874: state = 875; break; // &ccaron -> č - case 879: state = 880; break; // Ç -> Ç - case 884: state = 885; break; // ç -> ç - case 888: state = 889; break; // &Ccirc -> Ĉ - case 892: state = 893; break; // &ccirc -> ĉ - case 898: state = 899; break; // &Cconint -> ∰ - case 902: state = 903; break; // &ccups -> ⩌ - case 905: state = 906; break; // &ccupssm -> ⩐ - case 909: state = 910; break; // &Cdot -> Ċ - case 913: state = 914; break; // &cdot -> ċ - case 918: state = 919; break; // ¸ -> ¸ - case 925: state = 926; break; // &Cedilla -> ¸ - case 931: state = 932; break; // &cemptyv -> ⦲ - case 934: state = 935; break; // ¢ -> ¢ - case 942: state = 943; break; // &CenterDot -> · - case 948: state = 949; break; // ¢erdot -> · - case 951: state = 952; break; // &Cfr -> ℭ - case 954: state = 955; break; // &cfr -> 𝔠 - case 958: state = 959; break; // &CHcy -> Ч - case 962: state = 963; break; // &chcy -> ч - case 966: state = 967; break; // &check -> ✓ - case 971: state = 972; break; // &checkmark -> ✓ - case 974: state = 975; break; // &Chi -> Χ - case 976: state = 977; break; // &chi -> χ - case 979: state = 980; break; // &cir -> ○ - case 981: state = 982; break; // &circ -> ˆ - case 984: state = 985; break; // &circeq -> ≗ - case 996: state = 997; break; // &circlearrowleft -> ↺ - case 1002: state = 1003; break; // &circlearrowright -> ↻ - case 1007: state = 1008; break; // &circledast -> ⊛ - case 1012: state = 1013; break; // &circledcirc -> ⊚ - case 1017: state = 1018; break; // &circleddash -> ⊝ - case 1026: state = 1027; break; // &CircleDot -> ⊙ - case 1028: state = 1029; break; // &circledR -> ® - case 1030: state = 1031; break; // &circledS -> Ⓢ - case 1036: state = 1037; break; // &CircleMinus -> ⊖ - case 1041: state = 1042; break; // &CirclePlus -> ⊕ - case 1047: state = 1048; break; // &CircleTimes -> ⊗ - case 1049: state = 1050; break; // &cirE -> ⧃ - case 1051: state = 1052; break; // &cire -> ≗ - case 1057: state = 1058; break; // &cirfnint -> ⨐ - case 1061: state = 1062; break; // &cirmid -> ⫯ - case 1066: state = 1067; break; // &cirscir -> ⧂ - case 1090: state = 1091; break; // &ClockwiseContourIntegral -> ∲ - case 1109: state = 1110; break; // &CloseCurlyDoubleQuote -> ” - case 1115: state = 1116; break; // &CloseCurlyQuote -> ’ - case 1120: state = 1121; break; // &clubs -> ♣ - case 1124: state = 1125; break; // &clubsuit -> ♣ - case 1129: state = 1130; break; // &Colon -> ∷ - case 1134: state = 1135; break; // &colon -> : - case 1136: state = 1137; break; // &Colone -> ⩴ - case 1138: state = 1139; break; // &colone -> ≔ - case 1140: state = 1141; break; // &coloneq -> ≔ - case 1144: state = 1145; break; // &comma -> , - case 1146: state = 1147; break; // &commat -> @ - case 1148: state = 1149; break; // &comp -> ∁ - case 1151: state = 1152; break; // &compfn -> ∘ - case 1158: state = 1159; break; // &complement -> ∁ - case 1162: state = 1163; break; // &complexes -> ℂ - case 1165: state = 1166; break; // &cong -> ≅ - case 1169: state = 1170; break; // &congdot -> ⩭ - case 1177: state = 1178; break; // &Congruent -> ≡ - case 1181: state = 1182; break; // &Conint -> ∯ - case 1185: state = 1186; break; // &conint -> ∮ - case 1198: state = 1199; break; // &ContourIntegral -> ∮ - case 1201: state = 1202; break; // &Copf -> ℂ - case 1204: state = 1205; break; // &copf -> 𝕔 - case 1208: state = 1209; break; // &coprod -> ∐ - case 1215: state = 1216; break; // &Coproduct -> ∐ - case 1219: state = 1220; break; // © -> © - case 1221: state = 1222; break; // © -> © - case 1224: state = 1225; break; // ©sr -> ℗ - case 1254: state = 1255; break; // &CounterClockwiseContourIntegral -> ∳ - case 1259: state = 1260; break; // &crarr -> ↵ - case 1264: state = 1265; break; // &Cross -> ⨯ - case 1268: state = 1269; break; // &cross -> ✗ - case 1272: state = 1273; break; // &Cscr -> 𝒞 - case 1276: state = 1277; break; // &cscr -> 𝒸 - case 1279: state = 1280; break; // &csub -> ⫏ - case 1281: state = 1282; break; // &csube -> ⫑ - case 1283: state = 1284; break; // &csup -> ⫐ - case 1285: state = 1286; break; // &csupe -> ⫒ - case 1290: state = 1291; break; // &ctdot -> ⋯ - case 1297: state = 1298; break; // &cudarrl -> ⤸ - case 1299: state = 1300; break; // &cudarrr -> ⤵ - case 1303: state = 1304; break; // &cuepr -> ⋞ - case 1306: state = 1307; break; // &cuesc -> ⋟ - case 1311: state = 1312; break; // &cularr -> ↶ - case 1313: state = 1314; break; // &cularrp -> ⤽ - case 1316: state = 1317; break; // &Cup -> ⋓ - case 1318: state = 1319; break; // &cup -> ∪ - case 1324: state = 1325; break; // &cupbrcap -> ⩈ - case 1328: state = 1329; break; // &CupCap -> ≍ - case 1332: state = 1333; break; // &cupcap -> ⩆ - case 1335: state = 1336; break; // &cupcup -> ⩊ - case 1339: state = 1340; break; // &cupdot -> ⊍ - case 1342: state = 1343; break; // &cupor -> ⩅ - case 1344: state = 1345; break; // &cups -> ∪︀ - case 1349: state = 1350; break; // &curarr -> ↷ - case 1351: state = 1352; break; // &curarrm -> ⤼ - case 1360: state = 1361; break; // &curlyeqprec -> ⋞ - case 1365: state = 1366; break; // &curlyeqsucc -> ⋟ - case 1369: state = 1370; break; // &curlyvee -> ⋎ - case 1375: state = 1376; break; // &curlywedge -> ⋏ - case 1379: state = 1380; break; // ¤ -> ¤ - case 1391: state = 1392; break; // &curvearrowleft -> ↶ - case 1397: state = 1398; break; // &curvearrowright -> ↷ - case 1401: state = 1402; break; // &cuvee -> ⋎ - case 1405: state = 1406; break; // &cuwed -> ⋏ - case 1413: state = 1414; break; // &cwconint -> ∲ - case 1417: state = 1418; break; // &cwint -> ∱ - case 1423: state = 1424; break; // &cylcty -> ⌭ - case 1430: state = 1431; break; // &Dagger -> ‡ - case 1437: state = 1438; break; // &dagger -> † - case 1442: state = 1443; break; // &daleth -> ℸ - case 1445: state = 1446; break; // &Darr -> ↡ - case 1449: state = 1450; break; // &dArr -> ⇓ - case 1452: state = 1453; break; // &darr -> ↓ - case 1455: state = 1456; break; // &dash -> ‐ - case 1459: state = 1460; break; // &Dashv -> ⫤ - case 1461: state = 1462; break; // &dashv -> ⊣ - case 1468: state = 1469; break; // &dbkarow -> ⤏ - case 1472: state = 1473; break; // &dblac -> ˝ - case 1478: state = 1479; break; // &Dcaron -> Ď - case 1484: state = 1485; break; // &dcaron -> ď - case 1486: state = 1487; break; // &Dcy -> Д - case 1488: state = 1489; break; // &dcy -> д - case 1490: state = 1491; break; // &DD -> ⅅ - case 1492: state = 1493; break; // &dd -> ⅆ - case 1498: state = 1499; break; // &ddagger -> ‡ - case 1501: state = 1502; break; // &ddarr -> ⇊ - case 1508: state = 1509; break; // &DDotrahd -> ⤑ - case 1514: state = 1515; break; // &ddotseq -> ⩷ - case 1517: state = 1518; break; // ° -> ° - case 1520: state = 1521; break; // &Del -> ∇ - case 1523: state = 1524; break; // &Delta -> Δ - case 1527: state = 1528; break; // &delta -> δ - case 1533: state = 1534; break; // &demptyv -> ⦱ - case 1539: state = 1540; break; // &dfisht -> ⥿ - case 1542: state = 1543; break; // &Dfr -> 𝔇 - case 1544: state = 1545; break; // &dfr -> 𝔡 - case 1548: state = 1549; break; // &dHar -> ⥥ - case 1553: state = 1554; break; // &dharl -> ⇃ - case 1555: state = 1556; break; // &dharr -> ⇂ - case 1571: state = 1572; break; // &DiacriticalAcute -> ´ - case 1575: state = 1576; break; // &DiacriticalDot -> ˙ - case 1585: state = 1586; break; // &DiacriticalDoubleAcute -> ˝ - case 1591: state = 1592; break; // &DiacriticalGrave -> ` - case 1597: state = 1598; break; // &DiacriticalTilde -> ˜ - case 1601: state = 1602; break; // &diam -> ⋄ - case 1606: state = 1607; break; // &Diamond -> ⋄ - case 1610: state = 1611; break; // &diamond -> ⋄ - case 1615: state = 1616; break; // &diamondsuit -> ♦ - case 1617: state = 1618; break; // &diams -> ♦ - case 1619: state = 1620; break; // &die -> ¨ - case 1631: state = 1632; break; // &DifferentialD -> ⅆ - case 1637: state = 1638; break; // &digamma -> ϝ - case 1641: state = 1642; break; // &disin -> ⋲ - case 1643: state = 1644; break; // &div -> ÷ - case 1647: state = 1648; break; // ÷ -> ÷ - case 1655: state = 1656; break; // ÷ontimes -> ⋇ - case 1659: state = 1660; break; // &divonx -> ⋇ - case 1663: state = 1664; break; // &DJcy -> Ђ - case 1667: state = 1668; break; // &djcy -> ђ - case 1673: state = 1674; break; // &dlcorn -> ⌞ - case 1677: state = 1678; break; // &dlcrop -> ⌍ - case 1683: state = 1684; break; // &dollar -> $ - case 1687: state = 1688; break; // &Dopf -> 𝔻 - case 1690: state = 1691; break; // &dopf -> 𝕕 - case 1692: state = 1693; break; // &Dot -> ¨ - case 1694: state = 1695; break; // &dot -> ˙ - case 1698: state = 1699; break; // &DotDot -> ⃜ - case 1701: state = 1702; break; // &doteq -> ≐ - case 1705: state = 1706; break; // &doteqdot -> ≑ - case 1711: state = 1712; break; // &DotEqual -> ≐ - case 1717: state = 1718; break; // &dotminus -> ∸ - case 1722: state = 1723; break; // &dotplus -> ∔ - case 1729: state = 1730; break; // &dotsquare -> ⊡ - case 1742: state = 1743; break; // &doublebarwedge -> ⌆ - case 1762: state = 1763; break; // &DoubleContourIntegral -> ∯ - case 1766: state = 1767; break; // &DoubleDot -> ¨ - case 1774: state = 1775; break; // &DoubleDownArrow -> ⇓ - case 1784: state = 1785; break; // &DoubleLeftArrow -> ⇐ - case 1795: state = 1796; break; // &DoubleLeftRightArrow -> ⇔ - case 1799: state = 1800; break; // &DoubleLeftTee -> ⫤ - case 1812: state = 1813; break; // &DoubleLongLeftArrow -> ⟸ - case 1823: state = 1824; break; // &DoubleLongLeftRightArrow -> ⟺ - case 1834: state = 1835; break; // &DoubleLongRightArrow -> ⟹ - case 1845: state = 1846; break; // &DoubleRightArrow -> ⇒ - case 1849: state = 1850; break; // &DoubleRightTee -> ⊨ - case 1857: state = 1858; break; // &DoubleUpArrow -> ⇑ - case 1867: state = 1868; break; // &DoubleUpDownArrow -> ⇕ - case 1879: state = 1880; break; // &DoubleVerticalBar -> ∥ - case 1887: state = 1888; break; // &DownArrow -> ↓ - case 1893: state = 1894; break; // &Downarrow -> ⇓ - case 1901: state = 1902; break; // &downarrow -> ↓ - case 1905: state = 1906; break; // &DownArrowBar -> ⤓ - case 1913: state = 1914; break; // &DownArrowUpArrow -> ⇵ - case 1919: state = 1920; break; // &DownBreve -> ̑ - case 1930: state = 1931; break; // &downdownarrows -> ⇊ - case 1942: state = 1943; break; // &downharpoonleft -> ⇃ - case 1948: state = 1949; break; // &downharpoonright -> ⇂ - case 1964: state = 1965; break; // &DownLeftRightVector -> ⥐ - case 1974: state = 1975; break; // &DownLeftTeeVector -> ⥞ - case 1981: state = 1982; break; // &DownLeftVector -> ↽ - case 1985: state = 1986; break; // &DownLeftVectorBar -> ⥖ - case 2000: state = 2001; break; // &DownRightTeeVector -> ⥟ - case 2007: state = 2008; break; // &DownRightVector -> ⇁ - case 2011: state = 2012; break; // &DownRightVectorBar -> ⥗ - case 2015: state = 2016; break; // &DownTee -> ⊤ - case 2021: state = 2022; break; // &DownTeeArrow -> ↧ - case 2029: state = 2030; break; // &drbkarow -> ⤐ - case 2034: state = 2035; break; // &drcorn -> ⌟ - case 2038: state = 2039; break; // &drcrop -> ⌌ - case 2042: state = 2043; break; // &Dscr -> 𝒟 - case 2046: state = 2047; break; // &dscr -> 𝒹 - case 2050: state = 2051; break; // &DScy -> Ѕ - case 2052: state = 2053; break; // &dscy -> ѕ - case 2055: state = 2056; break; // &dsol -> ⧶ - case 2060: state = 2061; break; // &Dstrok -> Đ - case 2065: state = 2066; break; // &dstrok -> đ - case 2070: state = 2071; break; // &dtdot -> ⋱ - case 2073: state = 2074; break; // &dtri -> ▿ - case 2075: state = 2076; break; // &dtrif -> ▾ - case 2080: state = 2081; break; // &duarr -> ⇵ - case 2084: state = 2085; break; // &duhar -> ⥯ - case 2091: state = 2092; break; // &dwangle -> ⦦ - case 2095: state = 2096; break; // &DZcy -> Џ - case 2099: state = 2100; break; // &dzcy -> џ - case 2106: state = 2107; break; // &dzigrarr -> ⟿ - case 2113: state = 2114; break; // É -> É - case 2120: state = 2121; break; // é -> é - case 2125: state = 2126; break; // &easter -> ⩮ - case 2131: state = 2132; break; // &Ecaron -> Ě - case 2137: state = 2138; break; // &ecaron -> ě - case 2140: state = 2141; break; // &ecir -> ≖ - case 2144: state = 2145; break; // Ê -> Ê - case 2146: state = 2147; break; // ê -> ê - case 2151: state = 2152; break; // &ecolon -> ≕ - case 2153: state = 2154; break; // &Ecy -> Э - case 2155: state = 2156; break; // &ecy -> э - case 2160: state = 2161; break; // &eDDot -> ⩷ - case 2164: state = 2165; break; // &Edot -> Ė - case 2167: state = 2168; break; // &eDot -> ≑ - case 2171: state = 2172; break; // &edot -> ė - case 2173: state = 2174; break; // &ee -> ⅇ - case 2178: state = 2179; break; // &efDot -> ≒ - case 2181: state = 2182; break; // &Efr -> 𝔈 - case 2183: state = 2184; break; // &efr -> 𝔢 - case 2185: state = 2186; break; // &eg -> ⪚ - case 2191: state = 2192; break; // È -> È - case 2196: state = 2197; break; // è -> è - case 2198: state = 2199; break; // &egs -> ⪖ - case 2202: state = 2203; break; // &egsdot -> ⪘ - case 2204: state = 2205; break; // &el -> ⪙ - case 2211: state = 2212; break; // &Element -> ∈ - case 2218: state = 2219; break; // &elinters -> ⏧ - case 2220: state = 2221; break; // &ell -> ℓ - case 2222: state = 2223; break; // &els -> ⪕ - case 2226: state = 2227; break; // &elsdot -> ⪗ - case 2231: state = 2232; break; // &Emacr -> Ē - case 2236: state = 2237; break; // &emacr -> ē - case 2240: state = 2241; break; // &empty -> ∅ - case 2244: state = 2245; break; // &emptyset -> ∅ - case 2259: state = 2260; break; // &EmptySmallSquare -> ◻ - case 2261: state = 2262; break; // &emptyv -> ∅ - case 2277: state = 2278; break; // &EmptyVerySmallSquare -> ▫ - case 2280: state = 2281; break; // &emsp ->   - case 2283: state = 2284; break; // &emsp13 ->   - case 2285: state = 2286; break; // &emsp14 ->   - case 2288: state = 2289; break; // &ENG -> Ŋ - case 2291: state = 2292; break; // &eng -> ŋ - case 2294: state = 2295; break; // &ensp ->   - case 2299: state = 2300; break; // &Eogon -> Ę - case 2304: state = 2305; break; // &eogon -> ę - case 2307: state = 2308; break; // &Eopf -> 𝔼 - case 2310: state = 2311; break; // &eopf -> 𝕖 - case 2314: state = 2315; break; // &epar -> ⋕ - case 2317: state = 2318; break; // &eparsl -> ⧣ - case 2321: state = 2322; break; // &eplus -> ⩱ - case 2324: state = 2325; break; // &epsi -> ε - case 2331: state = 2332; break; // &Epsilon -> Ε - case 2335: state = 2336; break; // &epsilon -> ε - case 2337: state = 2338; break; // &epsiv -> ϵ - case 2343: state = 2344; break; // &eqcirc -> ≖ - case 2348: state = 2349; break; // &eqcolon -> ≕ - case 2352: state = 2353; break; // &eqsim -> ≂ - case 2360: state = 2361; break; // &eqslantgtr -> ⪖ - case 2365: state = 2366; break; // &eqslantless -> ⪕ - case 2370: state = 2371; break; // &Equal -> ⩵ - case 2375: state = 2376; break; // &equals -> = - case 2381: state = 2382; break; // &EqualTilde -> ≂ - case 2385: state = 2386; break; // &equest -> ≟ - case 2394: state = 2395; break; // &Equilibrium -> ⇌ - case 2397: state = 2398; break; // &equiv -> ≡ - case 2400: state = 2401; break; // &equivDD -> ⩸ - case 2407: state = 2408; break; // &eqvparsl -> ⧥ - case 2412: state = 2413; break; // &erarr -> ⥱ - case 2416: state = 2417; break; // &erDot -> ≓ - case 2420: state = 2421; break; // &Escr -> ℰ - case 2424: state = 2425; break; // &escr -> ℯ - case 2428: state = 2429; break; // &esdot -> ≐ - case 2431: state = 2432; break; // &Esim -> ⩳ - case 2434: state = 2435; break; // &esim -> ≂ - case 2437: state = 2438; break; // &Eta -> Η - case 2440: state = 2441; break; // &eta -> η - case 2443: state = 2444; break; // Ð -> Ð - case 2445: state = 2446; break; // ð -> ð - case 2449: state = 2450; break; // Ë -> Ë - case 2453: state = 2454; break; // ë -> ë - case 2456: state = 2457; break; // &euro -> € - case 2460: state = 2461; break; // &excl -> ! - case 2464: state = 2465; break; // &exist -> ∃ - case 2470: state = 2471; break; // &Exists -> ∃ - case 2480: state = 2481; break; // &expectation -> ℰ - case 2491: state = 2492; break; // &ExponentialE -> ⅇ - case 2501: state = 2502; break; // &exponentiale -> ⅇ - case 2515: state = 2516; break; // &fallingdotseq -> ≒ - case 2519: state = 2520; break; // &Fcy -> Ф - case 2522: state = 2523; break; // &fcy -> ф - case 2528: state = 2529; break; // &female -> ♀ - case 2534: state = 2535; break; // &ffilig -> ffi - case 2538: state = 2539; break; // &fflig -> ff - case 2542: state = 2543; break; // &ffllig -> ffl - case 2545: state = 2546; break; // &Ffr -> 𝔉 - case 2547: state = 2548; break; // &ffr -> 𝔣 - case 2552: state = 2553; break; // &filig -> fi - case 2569: state = 2570; break; // &FilledSmallSquare -> ◼ - case 2585: state = 2586; break; // &FilledVerySmallSquare -> ▪ - case 2590: state = 2591; break; // &fjlig -> fj - case 2594: state = 2595; break; // &flat -> ♭ - case 2598: state = 2599; break; // &fllig -> fl - case 2602: state = 2603; break; // &fltns -> ▱ - case 2606: state = 2607; break; // &fnof -> ƒ - case 2610: state = 2611; break; // &Fopf -> 𝔽 - case 2614: state = 2615; break; // &fopf -> 𝕗 - case 2619: state = 2620; break; // &ForAll -> ∀ - case 2624: state = 2625; break; // &forall -> ∀ - case 2626: state = 2627; break; // &fork -> ⋔ - case 2628: state = 2629; break; // &forkv -> ⫙ - case 2637: state = 2638; break; // &Fouriertrf -> ℱ - case 2645: state = 2646; break; // &fpartint -> ⨍ - case 2651: state = 2652; break; // ½ -> ½ - case 2653: state = 2654; break; // &frac13 -> ⅓ - case 2655: state = 2656; break; // ¼ -> ¼ - case 2657: state = 2658; break; // &frac15 -> ⅕ - case 2659: state = 2660; break; // &frac16 -> ⅙ - case 2661: state = 2662; break; // &frac18 -> ⅛ - case 2664: state = 2665; break; // &frac23 -> ⅔ - case 2666: state = 2667; break; // &frac25 -> ⅖ - case 2669: state = 2670; break; // ¾ -> ¾ - case 2671: state = 2672; break; // &frac35 -> ⅗ - case 2673: state = 2674; break; // &frac38 -> ⅜ - case 2676: state = 2677; break; // &frac45 -> ⅘ - case 2679: state = 2680; break; // &frac56 -> ⅚ - case 2681: state = 2682; break; // &frac58 -> ⅝ - case 2684: state = 2685; break; // &frac78 -> ⅞ - case 2687: state = 2688; break; // &frasl -> ⁄ - case 2691: state = 2692; break; // &frown -> ⌢ - case 2695: state = 2696; break; // &Fscr -> ℱ - case 2699: state = 2700; break; // &fscr -> 𝒻 - case 2706: state = 2707; break; // &gacute -> ǵ - case 2712: state = 2713; break; // &Gamma -> Γ - case 2716: state = 2717; break; // &gamma -> γ - case 2718: state = 2719; break; // &Gammad -> Ϝ - case 2720: state = 2721; break; // &gammad -> ϝ - case 2722: state = 2723; break; // &gap -> ⪆ - case 2728: state = 2729; break; // &Gbreve -> Ğ - case 2734: state = 2735; break; // &gbreve -> ğ - case 2740: state = 2741; break; // &Gcedil -> Ģ - case 2744: state = 2745; break; // &Gcirc -> Ĝ - case 2749: state = 2750; break; // &gcirc -> ĝ - case 2751: state = 2752; break; // &Gcy -> Г - case 2753: state = 2754; break; // &gcy -> г - case 2757: state = 2758; break; // &Gdot -> Ġ - case 2761: state = 2762; break; // &gdot -> ġ - case 2763: state = 2764; break; // &gE -> ≧ - case 2765: state = 2766; break; // &ge -> ≥ - case 2767: state = 2768; break; // &gEl -> ⪌ - case 2769: state = 2770; break; // &gel -> ⋛ - case 2771: state = 2772; break; // &geq -> ≥ - case 2773: state = 2774; break; // &geqq -> ≧ - case 2779: state = 2780; break; // &geqslant -> ⩾ - case 2781: state = 2782; break; // &ges -> ⩾ - case 2784: state = 2785; break; // &gescc -> ⪩ - case 2788: state = 2789; break; // &gesdot -> ⪀ - case 2790: state = 2791; break; // &gesdoto -> ⪂ - case 2792: state = 2793; break; // &gesdotol -> ⪄ - case 2794: state = 2795; break; // &gesl -> ⋛︀ - case 2797: state = 2798; break; // &gesles -> ⪔ - case 2800: state = 2801; break; // &Gfr -> 𝔊 - case 2803: state = 2804; break; // &gfr -> 𝔤 - case 2805: state = 2806; break; // &Gg -> ⋙ - case 2807: state = 2808; break; // &gg -> ≫ - case 2809: state = 2810; break; // &ggg -> ⋙ - case 2814: state = 2815; break; // &gimel -> ℷ - case 2818: state = 2819; break; // &GJcy -> Ѓ - case 2822: state = 2823; break; // &gjcy -> ѓ - case 2824: state = 2825; break; // &gl -> ≷ - case 2826: state = 2827; break; // &gla -> ⪥ - case 2828: state = 2829; break; // &glE -> ⪒ - case 2830: state = 2831; break; // &glj -> ⪤ - case 2834: state = 2835; break; // &gnap -> ⪊ - case 2839: state = 2840; break; // &gnapprox -> ⪊ - case 2841: state = 2842; break; // &gnE -> ≩ - case 2843: state = 2844; break; // &gne -> ⪈ - case 2845: state = 2846; break; // &gneq -> ⪈ - case 2847: state = 2848; break; // &gneqq -> ≩ - case 2851: state = 2852; break; // &gnsim -> ⋧ - case 2855: state = 2856; break; // &Gopf -> 𝔾 - case 2859: state = 2860; break; // &gopf -> 𝕘 - case 2864: state = 2865; break; // &grave -> ` - case 2876: state = 2877; break; // &GreaterEqual -> ≥ - case 2881: state = 2882; break; // &GreaterEqualLess -> ⋛ - case 2891: state = 2892; break; // &GreaterFullEqual -> ≧ - case 2899: state = 2900; break; // &GreaterGreater -> ⪢ - case 2904: state = 2905; break; // &GreaterLess -> ≷ - case 2915: state = 2916; break; // &GreaterSlantEqual -> ⩾ - case 2921: state = 2922; break; // &GreaterTilde -> ≳ - case 2925: state = 2926; break; // &Gscr -> 𝒢 - case 2929: state = 2930; break; // &gscr -> ℊ - case 2932: state = 2933; break; // &gsim -> ≳ - case 2934: state = 2935; break; // &gsime -> ⪎ - case 2936: state = 2937; break; // &gsiml -> ⪐ - case 2938: state = 2939; break; // > -> > - case 2940: state = 2941; break; // &Gt -> ≫ - case 2942: state = 2943; break; // > -> > - case 2945: state = 2946; break; // >cc -> ⪧ - case 2948: state = 2949; break; // >cir -> ⩺ - case 2952: state = 2953; break; // >dot -> ⋗ - case 2957: state = 2958; break; // >lPar -> ⦕ - case 2963: state = 2964; break; // >quest -> ⩼ - case 2971: state = 2972; break; // >rapprox -> ⪆ - case 2974: state = 2975; break; // >rarr -> ⥸ - case 2978: state = 2979; break; // >rdot -> ⋗ - case 2985: state = 2986; break; // >reqless -> ⋛ - case 2991: state = 2992; break; // >reqqless -> ⪌ - case 2996: state = 2997; break; // >rless -> ≷ - case 3000: state = 3001; break; // >rsim -> ≳ - case 3009: state = 3010; break; // &gvertneqq -> ≩︀ - case 3012: state = 3013; break; // &gvnE -> ≩︀ - case 3018: state = 3019; break; // &Hacek -> ˇ - case 3025: state = 3026; break; // &hairsp ->   - case 3028: state = 3029; break; // &half -> ½ - case 3033: state = 3034; break; // &hamilt -> ℋ - case 3039: state = 3040; break; // &HARDcy -> Ъ - case 3044: state = 3045; break; // &hardcy -> ъ - case 3048: state = 3049; break; // &hArr -> ⇔ - case 3050: state = 3051; break; // &harr -> ↔ - case 3054: state = 3055; break; // &harrcir -> ⥈ - case 3056: state = 3057; break; // &harrw -> ↭ - case 3058: state = 3059; break; // &Hat -> ^ - case 3062: state = 3063; break; // &hbar -> ℏ - case 3067: state = 3068; break; // &Hcirc -> Ĥ - case 3072: state = 3073; break; // &hcirc -> ĥ - case 3078: state = 3079; break; // &hearts -> ♥ - case 3082: state = 3083; break; // &heartsuit -> ♥ - case 3087: state = 3088; break; // &hellip -> … - case 3092: state = 3093; break; // &hercon -> ⊹ - case 3095: state = 3096; break; // &Hfr -> ℌ - case 3098: state = 3099; break; // &hfr -> 𝔥 - case 3110: state = 3111; break; // &HilbertSpace -> ℋ - case 3118: state = 3119; break; // &hksearow -> ⤥ - case 3124: state = 3125; break; // &hkswarow -> ⤦ - case 3129: state = 3130; break; // &hoarr -> ⇿ - case 3134: state = 3135; break; // &homtht -> ∻ - case 3146: state = 3147; break; // &hookleftarrow -> ↩ - case 3157: state = 3158; break; // &hookrightarrow -> ↪ - case 3161: state = 3162; break; // &Hopf -> ℍ - case 3164: state = 3165; break; // &hopf -> 𝕙 - case 3169: state = 3170; break; // &horbar -> ― - case 3182: state = 3183; break; // &HorizontalLine -> ─ - case 3186: state = 3187; break; // &Hscr -> ℋ - case 3190: state = 3191; break; // &hscr -> 𝒽 - case 3195: state = 3196; break; // &hslash -> ℏ - case 3200: state = 3201; break; // &Hstrok -> Ħ - case 3205: state = 3206; break; // &hstrok -> ħ - case 3217: state = 3218; break; // &HumpDownHump -> ≎ - case 3223: state = 3224; break; // &HumpEqual -> ≏ - case 3229: state = 3230; break; // &hybull -> ⁃ - case 3234: state = 3235; break; // &hyphen -> ‐ - case 3241: state = 3242; break; // Í -> Í - case 3248: state = 3249; break; // í -> í - case 3250: state = 3251; break; // &ic -> ⁣ - case 3255: state = 3256; break; // Î -> Î - case 3259: state = 3260; break; // î -> î - case 3261: state = 3262; break; // &Icy -> И - case 3263: state = 3264; break; // &icy -> и - case 3267: state = 3268; break; // &Idot -> İ - case 3271: state = 3272; break; // &IEcy -> Е - case 3275: state = 3276; break; // &iecy -> е - case 3279: state = 3280; break; // ¡ -> ¡ - case 3282: state = 3283; break; // &iff -> ⇔ - case 3285: state = 3286; break; // &Ifr -> ℑ - case 3287: state = 3288; break; // &ifr -> 𝔦 - case 3293: state = 3294; break; // Ì -> Ì - case 3299: state = 3300; break; // ì -> ì - case 3301: state = 3302; break; // &ii -> ⅈ - case 3306: state = 3307; break; // &iiiint -> ⨌ - case 3309: state = 3310; break; // &iiint -> ∭ - case 3314: state = 3315; break; // &iinfin -> ⧜ - case 3318: state = 3319; break; // &iiota -> ℩ - case 3323: state = 3324; break; // &IJlig -> IJ - case 3328: state = 3329; break; // &ijlig -> ij - case 3330: state = 3331; break; // &Im -> ℑ - case 3334: state = 3335; break; // &Imacr -> Ī - case 3339: state = 3340; break; // &imacr -> ī - case 3342: state = 3343; break; // &image -> ℑ - case 3350: state = 3351; break; // &ImaginaryI -> ⅈ - case 3355: state = 3356; break; // &imagline -> ℐ - case 3360: state = 3361; break; // &imagpart -> ℑ - case 3363: state = 3364; break; // &imath -> ı - case 3366: state = 3367; break; // &imof -> ⊷ - case 3370: state = 3371; break; // &imped -> Ƶ - case 3376: state = 3377; break; // &Implies -> ⇒ - case 3378: state = 3379; break; // &in -> ∈ - case 3383: state = 3384; break; // &incare -> ℅ - case 3387: state = 3388; break; // &infin -> ∞ - case 3391: state = 3392; break; // &infintie -> ⧝ - case 3396: state = 3397; break; // &inodot -> ı - case 3399: state = 3400; break; // &Int -> ∬ - case 3401: state = 3402; break; // &int -> ∫ - case 3405: state = 3406; break; // &intcal -> ⊺ - case 3411: state = 3412; break; // &integers -> ℤ - case 3417: state = 3418; break; // &Integral -> ∫ - case 3422: state = 3423; break; // &intercal -> ⊺ - case 3431: state = 3432; break; // &Intersection -> ⋂ - case 3437: state = 3438; break; // &intlarhk -> ⨗ - case 3442: state = 3443; break; // &intprod -> ⨼ - case 3455: state = 3456; break; // &InvisibleComma -> ⁣ - case 3461: state = 3462; break; // &InvisibleTimes -> ⁢ - case 3465: state = 3466; break; // &IOcy -> Ё - case 3469: state = 3470; break; // &iocy -> ё - case 3474: state = 3475; break; // &Iogon -> Į - case 3478: state = 3479; break; // &iogon -> į - case 3481: state = 3482; break; // &Iopf -> 𝕀 - case 3484: state = 3485; break; // &iopf -> 𝕚 - case 3487: state = 3488; break; // &Iota -> Ι - case 3490: state = 3491; break; // &iota -> ι - case 3495: state = 3496; break; // &iprod -> ⨼ - case 3501: state = 3502; break; // ¿ -> ¿ - case 3505: state = 3506; break; // &Iscr -> ℐ - case 3509: state = 3510; break; // &iscr -> 𝒾 - case 3512: state = 3513; break; // &isin -> ∈ - case 3516: state = 3517; break; // &isindot -> ⋵ - case 3518: state = 3519; break; // &isinE -> ⋹ - case 3520: state = 3521; break; // &isins -> ⋴ - case 3522: state = 3523; break; // &isinsv -> ⋳ - case 3524: state = 3525; break; // &isinv -> ∈ - case 3526: state = 3527; break; // &it -> ⁢ - case 3532: state = 3533; break; // &Itilde -> Ĩ - case 3537: state = 3538; break; // &itilde -> ĩ - case 3542: state = 3543; break; // &Iukcy -> І - case 3547: state = 3548; break; // &iukcy -> і - case 3550: state = 3551; break; // Ï -> Ï - case 3553: state = 3554; break; // ï -> ï - case 3559: state = 3560; break; // &Jcirc -> Ĵ - case 3565: state = 3566; break; // &jcirc -> ĵ - case 3567: state = 3568; break; // &Jcy -> Й - case 3569: state = 3570; break; // &jcy -> й - case 3572: state = 3573; break; // &Jfr -> 𝔍 - case 3575: state = 3576; break; // &jfr -> 𝔧 - case 3580: state = 3581; break; // &jmath -> ȷ - case 3584: state = 3585; break; // &Jopf -> 𝕁 - case 3588: state = 3589; break; // &jopf -> 𝕛 - case 3592: state = 3593; break; // &Jscr -> 𝒥 - case 3596: state = 3597; break; // &jscr -> 𝒿 - case 3601: state = 3602; break; // &Jsercy -> Ј - case 3606: state = 3607; break; // &jsercy -> ј - case 3611: state = 3612; break; // &Jukcy -> Є - case 3616: state = 3617; break; // &jukcy -> є - case 3622: state = 3623; break; // &Kappa -> Κ - case 3628: state = 3629; break; // &kappa -> κ - case 3630: state = 3631; break; // &kappav -> ϰ - case 3636: state = 3637; break; // &Kcedil -> Ķ - case 3642: state = 3643; break; // &kcedil -> ķ - case 3644: state = 3645; break; // &Kcy -> К - case 3646: state = 3647; break; // &kcy -> к - case 3649: state = 3650; break; // &Kfr -> 𝔎 - case 3652: state = 3653; break; // &kfr -> 𝔨 - case 3658: state = 3659; break; // &kgreen -> ĸ - case 3662: state = 3663; break; // &KHcy -> Х - case 3666: state = 3667; break; // &khcy -> х - case 3670: state = 3671; break; // &KJcy -> Ќ - case 3674: state = 3675; break; // &kjcy -> ќ - case 3678: state = 3679; break; // &Kopf -> 𝕂 - case 3682: state = 3683; break; // &kopf -> 𝕜 - case 3686: state = 3687; break; // &Kscr -> 𝒦 - case 3690: state = 3691; break; // &kscr -> 𝓀 - case 3696: state = 3697; break; // &lAarr -> ⇚ - case 3703: state = 3704; break; // &Lacute -> Ĺ - case 3709: state = 3710; break; // &lacute -> ĺ - case 3716: state = 3717; break; // &laemptyv -> ⦴ - case 3721: state = 3722; break; // &lagran -> ℒ - case 3726: state = 3727; break; // &Lambda -> Λ - case 3731: state = 3732; break; // &lambda -> λ - case 3734: state = 3735; break; // &Lang -> ⟪ - case 3737: state = 3738; break; // &lang -> ⟨ - case 3739: state = 3740; break; // &langd -> ⦑ - case 3742: state = 3743; break; // &langle -> ⟨ - case 3744: state = 3745; break; // &lap -> ⪅ - case 3753: state = 3754; break; // &Laplacetrf -> ℒ - case 3757: state = 3758; break; // « -> « - case 3760: state = 3761; break; // &Larr -> ↞ - case 3763: state = 3764; break; // &lArr -> ⇐ - case 3766: state = 3767; break; // &larr -> ← - case 3768: state = 3769; break; // &larrb -> ⇤ - case 3771: state = 3772; break; // &larrbfs -> ⤟ - case 3774: state = 3775; break; // &larrfs -> ⤝ - case 3777: state = 3778; break; // &larrhk -> ↩ - case 3780: state = 3781; break; // &larrlp -> ↫ - case 3783: state = 3784; break; // &larrpl -> ⤹ - case 3787: state = 3788; break; // &larrsim -> ⥳ - case 3790: state = 3791; break; // &larrtl -> ↢ - case 3792: state = 3793; break; // &lat -> ⪫ - case 3797: state = 3798; break; // &lAtail -> ⤛ - case 3801: state = 3802; break; // &latail -> ⤙ - case 3803: state = 3804; break; // &late -> ⪭ - case 3805: state = 3806; break; // &lates -> ⪭︀ - case 3810: state = 3811; break; // &lBarr -> ⤎ - case 3815: state = 3816; break; // &lbarr -> ⤌ - case 3819: state = 3820; break; // &lbbrk -> ❲ - case 3824: state = 3825; break; // &lbrace -> { - case 3826: state = 3827; break; // &lbrack -> [ - case 3829: state = 3830; break; // &lbrke -> ⦋ - case 3833: state = 3834; break; // &lbrksld -> ⦏ - case 3835: state = 3836; break; // &lbrkslu -> ⦍ - case 3841: state = 3842; break; // &Lcaron -> Ľ - case 3847: state = 3848; break; // &lcaron -> ľ - case 3852: state = 3853; break; // &Lcedil -> Ļ - case 3857: state = 3858; break; // &lcedil -> ļ - case 3860: state = 3861; break; // &lceil -> ⌈ - case 3863: state = 3864; break; // &lcub -> { - case 3865: state = 3866; break; // &Lcy -> Л - case 3867: state = 3868; break; // &lcy -> л - case 3871: state = 3872; break; // &ldca -> ⤶ - case 3875: state = 3876; break; // &ldquo -> “ - case 3877: state = 3878; break; // &ldquor -> „ - case 3883: state = 3884; break; // &ldrdhar -> ⥧ - case 3889: state = 3890; break; // &ldrushar -> ⥋ - case 3892: state = 3893; break; // &ldsh -> ↲ - case 3894: state = 3895; break; // &lE -> ≦ - case 3896: state = 3897; break; // &le -> ≤ - case 3912: state = 3913; break; // &LeftAngleBracket -> ⟨ - case 3917: state = 3918; break; // &LeftArrow -> ← - case 3923: state = 3924; break; // &Leftarrow -> ⇐ - case 3931: state = 3932; break; // &leftarrow -> ← - case 3935: state = 3936; break; // &LeftArrowBar -> ⇤ - case 3946: state = 3947; break; // &LeftArrowRightArrow -> ⇆ - case 3951: state = 3952; break; // &leftarrowtail -> ↢ - case 3959: state = 3960; break; // &LeftCeiling -> ⌈ - case 3973: state = 3974; break; // &LeftDoubleBracket -> ⟦ - case 3985: state = 3986; break; // &LeftDownTeeVector -> ⥡ - case 3992: state = 3993; break; // &LeftDownVector -> ⇃ - case 3996: state = 3997; break; // &LeftDownVectorBar -> ⥙ - case 4002: state = 4003; break; // &LeftFloor -> ⌊ - case 4014: state = 4015; break; // &leftharpoondown -> ↽ - case 4017: state = 4018; break; // &leftharpoonup -> ↼ - case 4028: state = 4029; break; // &leftleftarrows -> ⇇ - case 4039: state = 4040; break; // &LeftRightArrow -> ↔ - case 4050: state = 4051; break; // &Leftrightarrow -> ⇔ - case 4061: state = 4062; break; // &leftrightarrow -> ↔ - case 4063: state = 4064; break; // &leftrightarrows -> ⇆ - case 4072: state = 4073; break; // &leftrightharpoons -> ⇋ - case 4083: state = 4084; break; // &leftrightsquigarrow -> ↭ - case 4090: state = 4091; break; // &LeftRightVector -> ⥎ - case 4094: state = 4095; break; // &LeftTee -> ⊣ - case 4100: state = 4101; break; // &LeftTeeArrow -> ↤ - case 4107: state = 4108; break; // &LeftTeeVector -> ⥚ - case 4118: state = 4119; break; // &leftthreetimes -> ⋋ - case 4126: state = 4127; break; // &LeftTriangle -> ⊲ - case 4130: state = 4131; break; // &LeftTriangleBar -> ⧏ - case 4136: state = 4137; break; // &LeftTriangleEqual -> ⊴ - case 4149: state = 4150; break; // &LeftUpDownVector -> ⥑ - case 4159: state = 4160; break; // &LeftUpTeeVector -> ⥠ - case 4166: state = 4167; break; // &LeftUpVector -> ↿ - case 4170: state = 4171; break; // &LeftUpVectorBar -> ⥘ - case 4177: state = 4178; break; // &LeftVector -> ↼ - case 4181: state = 4182; break; // &LeftVectorBar -> ⥒ - case 4183: state = 4184; break; // &lEg -> ⪋ - case 4185: state = 4186; break; // &leg -> ⋚ - case 4187: state = 4188; break; // &leq -> ≤ - case 4189: state = 4190; break; // &leqq -> ≦ - case 4195: state = 4196; break; // &leqslant -> ⩽ - case 4197: state = 4198; break; // &les -> ⩽ - case 4200: state = 4201; break; // &lescc -> ⪨ - case 4204: state = 4205; break; // &lesdot -> ⩿ - case 4206: state = 4207; break; // &lesdoto -> ⪁ - case 4208: state = 4209; break; // &lesdotor -> ⪃ - case 4210: state = 4211; break; // &lesg -> ⋚︀ - case 4213: state = 4214; break; // &lesges -> ⪓ - case 4221: state = 4222; break; // &lessapprox -> ⪅ - case 4225: state = 4226; break; // &lessdot -> ⋖ - case 4231: state = 4232; break; // &lesseqgtr -> ⋚ - case 4236: state = 4237; break; // &lesseqqgtr -> ⪋ - case 4251: state = 4252; break; // &LessEqualGreater -> ⋚ - case 4261: state = 4262; break; // &LessFullEqual -> ≦ - case 4269: state = 4270; break; // &LessGreater -> ≶ - case 4273: state = 4274; break; // &lessgtr -> ≶ - case 4278: state = 4279; break; // &LessLess -> ⪡ - case 4282: state = 4283; break; // &lesssim -> ≲ - case 4293: state = 4294; break; // &LessSlantEqual -> ⩽ - case 4299: state = 4300; break; // &LessTilde -> ≲ - case 4305: state = 4306; break; // &lfisht -> ⥼ - case 4310: state = 4311; break; // &lfloor -> ⌊ - case 4313: state = 4314; break; // &Lfr -> 𝔏 - case 4315: state = 4316; break; // &lfr -> 𝔩 - case 4317: state = 4318; break; // &lg -> ≶ - case 4319: state = 4320; break; // &lgE -> ⪑ - case 4323: state = 4324; break; // &lHar -> ⥢ - case 4328: state = 4329; break; // &lhard -> ↽ - case 4330: state = 4331; break; // &lharu -> ↼ - case 4332: state = 4333; break; // &lharul -> ⥪ - case 4336: state = 4337; break; // &lhblk -> ▄ - case 4340: state = 4341; break; // &LJcy -> Љ - case 4344: state = 4345; break; // &ljcy -> љ - case 4346: state = 4347; break; // &Ll -> ⋘ - case 4348: state = 4349; break; // &ll -> ≪ - case 4352: state = 4353; break; // &llarr -> ⇇ - case 4359: state = 4360; break; // &llcorner -> ⌞ - case 4368: state = 4369; break; // &Lleftarrow -> ⇚ - case 4373: state = 4374; break; // &llhard -> ⥫ - case 4377: state = 4378; break; // &lltri -> ◺ - case 4383: state = 4384; break; // &Lmidot -> Ŀ - case 4389: state = 4390; break; // &lmidot -> ŀ - case 4394: state = 4395; break; // &lmoust -> ⎰ - case 4399: state = 4400; break; // &lmoustache -> ⎰ - case 4403: state = 4404; break; // &lnap -> ⪉ - case 4408: state = 4409; break; // &lnapprox -> ⪉ - case 4410: state = 4411; break; // &lnE -> ≨ - case 4412: state = 4413; break; // &lne -> ⪇ - case 4414: state = 4415; break; // &lneq -> ⪇ - case 4416: state = 4417; break; // &lneqq -> ≨ - case 4420: state = 4421; break; // &lnsim -> ⋦ - case 4425: state = 4426; break; // &loang -> ⟬ - case 4428: state = 4429; break; // &loarr -> ⇽ - case 4432: state = 4433; break; // &lobrk -> ⟦ - case 4445: state = 4446; break; // &LongLeftArrow -> ⟵ - case 4455: state = 4456; break; // &Longleftarrow -> ⟸ - case 4467: state = 4468; break; // &longleftarrow -> ⟵ - case 4478: state = 4479; break; // &LongLeftRightArrow -> ⟷ - case 4489: state = 4490; break; // &Longleftrightarrow -> ⟺ - case 4500: state = 4501; break; // &longleftrightarrow -> ⟷ - case 4507: state = 4508; break; // &longmapsto -> ⟼ - case 4518: state = 4519; break; // &LongRightArrow -> ⟶ - case 4529: state = 4530; break; // &Longrightarrow -> ⟹ - case 4540: state = 4541; break; // &longrightarrow -> ⟶ - case 4552: state = 4553; break; // &looparrowleft -> ↫ - case 4558: state = 4559; break; // &looparrowright -> ↬ - case 4562: state = 4563; break; // &lopar -> ⦅ - case 4565: state = 4566; break; // &Lopf -> 𝕃 - case 4567: state = 4568; break; // &lopf -> 𝕝 - case 4571: state = 4572; break; // &loplus -> ⨭ - case 4577: state = 4578; break; // &lotimes -> ⨴ - case 4582: state = 4583; break; // &lowast -> ∗ - case 4586: state = 4587; break; // &lowbar -> _ - case 4599: state = 4600; break; // &LowerLeftArrow -> ↙ - case 4610: state = 4611; break; // &LowerRightArrow -> ↘ - case 4612: state = 4613; break; // &loz -> ◊ - case 4617: state = 4618; break; // &lozenge -> ◊ - case 4619: state = 4620; break; // &lozf -> ⧫ - case 4623: state = 4624; break; // &lpar -> ( - case 4626: state = 4627; break; // &lparlt -> ⦓ - case 4631: state = 4632; break; // &lrarr -> ⇆ - case 4638: state = 4639; break; // &lrcorner -> ⌟ - case 4642: state = 4643; break; // &lrhar -> ⇋ - case 4644: state = 4645; break; // &lrhard -> ⥭ - case 4646: state = 4647; break; // &lrm -> ‎ - case 4650: state = 4651; break; // &lrtri -> ⊿ - case 4656: state = 4657; break; // &lsaquo -> ‹ - case 4660: state = 4661; break; // &Lscr -> ℒ - case 4663: state = 4664; break; // &lscr -> 𝓁 - case 4665: state = 4666; break; // &Lsh -> ↰ - case 4667: state = 4668; break; // &lsh -> ↰ - case 4670: state = 4671; break; // &lsim -> ≲ - case 4672: state = 4673; break; // &lsime -> ⪍ - case 4674: state = 4675; break; // &lsimg -> ⪏ - case 4677: state = 4678; break; // &lsqb -> [ - case 4680: state = 4681; break; // &lsquo -> ‘ - case 4682: state = 4683; break; // &lsquor -> ‚ - case 4687: state = 4688; break; // &Lstrok -> Ł - case 4692: state = 4693; break; // &lstrok -> ł - case 4694: state = 4695; break; // < -> < - case 4696: state = 4697; break; // &Lt -> ≪ - case 4698: state = 4699; break; // < -> < - case 4701: state = 4702; break; // <cc -> ⪦ - case 4704: state = 4705; break; // <cir -> ⩹ - case 4708: state = 4709; break; // <dot -> ⋖ - case 4713: state = 4714; break; // <hree -> ⋋ - case 4718: state = 4719; break; // <imes -> ⋉ - case 4723: state = 4724; break; // <larr -> ⥶ - case 4729: state = 4730; break; // <quest -> ⩻ - case 4732: state = 4733; break; // <ri -> ◃ - case 4734: state = 4735; break; // <rie -> ⊴ - case 4736: state = 4737; break; // <rif -> ◂ - case 4740: state = 4741; break; // <rPar -> ⦖ - case 4748: state = 4749; break; // &lurdshar -> ⥊ - case 4753: state = 4754; break; // &luruhar -> ⥦ - case 4762: state = 4763; break; // &lvertneqq -> ≨︀ - case 4765: state = 4766; break; // &lvnE -> ≨︀ - case 4770: state = 4771; break; // ¯ -> ¯ - case 4773: state = 4774; break; // &male -> ♂ - case 4775: state = 4776; break; // &malt -> ✠ - case 4779: state = 4780; break; // &maltese -> ✠ - case 4783: state = 4784; break; // &Map -> ⤅ - case 4785: state = 4786; break; // &map -> ↦ - case 4789: state = 4790; break; // &mapsto -> ↦ - case 4794: state = 4795; break; // &mapstodown -> ↧ - case 4799: state = 4800; break; // &mapstoleft -> ↤ - case 4802: state = 4803; break; // &mapstoup -> ↥ - case 4807: state = 4808; break; // &marker -> ▮ - case 4813: state = 4814; break; // &mcomma -> ⨩ - case 4816: state = 4817; break; // &Mcy -> М - case 4818: state = 4819; break; // &mcy -> м - case 4823: state = 4824; break; // &mdash -> — - case 4828: state = 4829; break; // &mDDot -> ∺ - case 4841: state = 4842; break; // &measuredangle -> ∡ - case 4852: state = 4853; break; // &MediumSpace ->   - case 4860: state = 4861; break; // &Mellintrf -> ℳ - case 4863: state = 4864; break; // &Mfr -> 𝔐 - case 4866: state = 4867; break; // &mfr -> 𝔪 - case 4869: state = 4870; break; // &mho -> ℧ - case 4874: state = 4875; break; // µ -> µ - case 4876: state = 4877; break; // &mid -> ∣ - case 4880: state = 4881; break; // &midast -> * - case 4884: state = 4885; break; // &midcir -> ⫰ - case 4888: state = 4889; break; // · -> · - case 4892: state = 4893; break; // &minus -> − - case 4894: state = 4895; break; // &minusb -> ⊟ - case 4896: state = 4897; break; // &minusd -> ∸ - case 4898: state = 4899; break; // &minusdu -> ⨪ - case 4907: state = 4908; break; // &MinusPlus -> ∓ - case 4911: state = 4912; break; // &mlcp -> ⫛ - case 4914: state = 4915; break; // &mldr -> … - case 4920: state = 4921; break; // &mnplus -> ∓ - case 4926: state = 4927; break; // &models -> ⊧ - case 4930: state = 4931; break; // &Mopf -> 𝕄 - case 4933: state = 4934; break; // &mopf -> 𝕞 - case 4935: state = 4936; break; // &mp -> ∓ - case 4939: state = 4940; break; // &Mscr -> ℳ - case 4943: state = 4944; break; // &mscr -> 𝓂 - case 4948: state = 4949; break; // &mstpos -> ∾ - case 4950: state = 4951; break; // &Mu -> Μ - case 4952: state = 4953; break; // &mu -> μ - case 4959: state = 4960; break; // &multimap -> ⊸ - case 4963: state = 4964; break; // &mumap -> ⊸ - case 4969: state = 4970; break; // &nabla -> ∇ - case 4976: state = 4977; break; // &Nacute -> Ń - case 4981: state = 4982; break; // &nacute -> ń - case 4984: state = 4985; break; // &nang -> ∠⃒ - case 4986: state = 4987; break; // &nap -> ≉ - case 4988: state = 4989; break; // &napE -> ⩰̸ - case 4991: state = 4992; break; // &napid -> ≋̸ - case 4994: state = 4995; break; // &napos -> ʼn - case 4999: state = 5000; break; // &napprox -> ≉ - case 5003: state = 5004; break; // &natur -> ♮ - case 5006: state = 5007; break; // &natural -> ♮ - case 5008: state = 5009; break; // &naturals -> ℕ - case 5012: state = 5013; break; //   ->   - case 5016: state = 5017; break; // &nbump -> ≎̸ - case 5018: state = 5019; break; // &nbumpe -> ≏̸ - case 5022: state = 5023; break; // &ncap -> ⩃ - case 5028: state = 5029; break; // &Ncaron -> Ň - case 5032: state = 5033; break; // &ncaron -> ň - case 5037: state = 5038; break; // &Ncedil -> Ņ - case 5042: state = 5043; break; // &ncedil -> ņ - case 5046: state = 5047; break; // &ncong -> ≇ - case 5050: state = 5051; break; // &ncongdot -> ⩭̸ - case 5053: state = 5054; break; // &ncup -> ⩂ - case 5055: state = 5056; break; // &Ncy -> Н - case 5057: state = 5058; break; // &ncy -> н - case 5062: state = 5063; break; // &ndash -> – - case 5064: state = 5065; break; // &ne -> ≠ - case 5069: state = 5070; break; // &nearhk -> ⤤ - case 5073: state = 5074; break; // &neArr -> ⇗ - case 5075: state = 5076; break; // &nearr -> ↗ - case 5078: state = 5079; break; // &nearrow -> ↗ - case 5082: state = 5083; break; // &nedot -> ≐̸ - case 5101: state = 5102; break; // &NegativeMediumSpace -> ​ - case 5112: state = 5113; break; // &NegativeThickSpace -> ​ - case 5119: state = 5120; break; // &NegativeThinSpace -> ​ - case 5133: state = 5134; break; // &NegativeVeryThinSpace -> ​ - case 5138: state = 5139; break; // &nequiv -> ≢ - case 5143: state = 5144; break; // &nesear -> ⤨ - case 5146: state = 5147; break; // &nesim -> ≂̸ - case 5165: state = 5166; break; // &NestedGreaterGreater -> ≫ - case 5174: state = 5175; break; // &NestedLessLess -> ≪ - case 5180: state = 5181; break; // &NewLine -> - case 5185: state = 5186; break; // &nexist -> ∄ - case 5187: state = 5188; break; // &nexists -> ∄ - case 5190: state = 5191; break; // &Nfr -> 𝔑 - case 5193: state = 5194; break; // &nfr -> 𝔫 - case 5196: state = 5197; break; // &ngE -> ≧̸ - case 5198: state = 5199; break; // &nge -> ≱ - case 5200: state = 5201; break; // &ngeq -> ≱ - case 5202: state = 5203; break; // &ngeqq -> ≧̸ - case 5208: state = 5209; break; // &ngeqslant -> ⩾̸ - case 5210: state = 5211; break; // &nges -> ⩾̸ - case 5213: state = 5214; break; // &nGg -> ⋙̸ - case 5217: state = 5218; break; // &ngsim -> ≵ - case 5219: state = 5220; break; // &nGt -> ≫⃒ - case 5221: state = 5222; break; // &ngt -> ≯ - case 5223: state = 5224; break; // &ngtr -> ≯ - case 5225: state = 5226; break; // &nGtv -> ≫̸ - case 5230: state = 5231; break; // &nhArr -> ⇎ - case 5234: state = 5235; break; // &nharr -> ↮ - case 5238: state = 5239; break; // &nhpar -> ⫲ - case 5240: state = 5241; break; // &ni -> ∋ - case 5242: state = 5243; break; // &nis -> ⋼ - case 5244: state = 5245; break; // &nisd -> ⋺ - case 5246: state = 5247; break; // &niv -> ∋ - case 5250: state = 5251; break; // &NJcy -> Њ - case 5254: state = 5255; break; // &njcy -> њ - case 5259: state = 5260; break; // &nlArr -> ⇍ - case 5263: state = 5264; break; // &nlarr -> ↚ - case 5266: state = 5267; break; // &nldr -> ‥ - case 5268: state = 5269; break; // &nlE -> ≦̸ - case 5270: state = 5271; break; // &nle -> ≰ - case 5280: state = 5281; break; // &nLeftarrow -> ⇍ - case 5288: state = 5289; break; // &nleftarrow -> ↚ - case 5299: state = 5300; break; // &nLeftrightarrow -> ⇎ - case 5310: state = 5311; break; // &nleftrightarrow -> ↮ - case 5312: state = 5313; break; // &nleq -> ≰ - case 5314: state = 5315; break; // &nleqq -> ≦̸ - case 5320: state = 5321; break; // &nleqslant -> ⩽̸ - case 5322: state = 5323; break; // &nles -> ⩽̸ - case 5324: state = 5325; break; // &nless -> ≮ - case 5326: state = 5327; break; // &nLl -> ⋘̸ - case 5330: state = 5331; break; // &nlsim -> ≴ - case 5332: state = 5333; break; // &nLt -> ≪⃒ - case 5334: state = 5335; break; // &nlt -> ≮ - case 5337: state = 5338; break; // &nltri -> ⋪ - case 5339: state = 5340; break; // &nltrie -> ⋬ - case 5341: state = 5342; break; // &nLtv -> ≪̸ - case 5345: state = 5346; break; // &nmid -> ∤ - case 5352: state = 5353; break; // &NoBreak -> ⁠ - case 5367: state = 5368; break; // &NonBreakingSpace ->   - case 5370: state = 5371; break; // &Nopf -> ℕ - case 5374: state = 5375; break; // &nopf -> 𝕟 - case 5376: state = 5377; break; // &Not -> ⫬ - case 5378: state = 5379; break; // ¬ -> ¬ - case 5388: state = 5389; break; // &NotCongruent -> ≢ - case 5394: state = 5395; break; // &NotCupCap -> ≭ - case 5412: state = 5413; break; // &NotDoubleVerticalBar -> ∦ - case 5420: state = 5421; break; // &NotElement -> ∉ - case 5425: state = 5426; break; // &NotEqual -> ≠ - case 5431: state = 5432; break; // &NotEqualTilde -> ≂̸ - case 5437: state = 5438; break; // &NotExists -> ∄ - case 5445: state = 5446; break; // &NotGreater -> ≯ - case 5451: state = 5452; break; // &NotGreaterEqual -> ≱ - case 5461: state = 5462; break; // &NotGreaterFullEqual -> ≧̸ - case 5469: state = 5470; break; // &NotGreaterGreater -> ≫̸ - case 5474: state = 5475; break; // &NotGreaterLess -> ≹ - case 5485: state = 5486; break; // &NotGreaterSlantEqual -> ⩾̸ - case 5491: state = 5492; break; // &NotGreaterTilde -> ≵ - case 5504: state = 5505; break; // &NotHumpDownHump -> ≎̸ - case 5510: state = 5511; break; // &NotHumpEqual -> ≏̸ - case 5513: state = 5514; break; // ¬in -> ∉ - case 5517: state = 5518; break; // ¬indot -> ⋵̸ - case 5519: state = 5520; break; // ¬inE -> ⋹̸ - case 5522: state = 5523; break; // ¬inva -> ∉ - case 5524: state = 5525; break; // ¬invb -> ⋷ - case 5526: state = 5527; break; // ¬invc -> ⋶ - case 5539: state = 5540; break; // &NotLeftTriangle -> ⋪ - case 5543: state = 5544; break; // &NotLeftTriangleBar -> ⧏̸ - case 5549: state = 5550; break; // &NotLeftTriangleEqual -> ⋬ - case 5552: state = 5553; break; // &NotLess -> ≮ - case 5558: state = 5559; break; // &NotLessEqual -> ≰ - case 5566: state = 5567; break; // &NotLessGreater -> ≸ - case 5571: state = 5572; break; // &NotLessLess -> ≪̸ - case 5582: state = 5583; break; // &NotLessSlantEqual -> ⩽̸ - case 5588: state = 5589; break; // &NotLessTilde -> ≴ - case 5609: state = 5610; break; // &NotNestedGreaterGreater -> ⪢̸ - case 5618: state = 5619; break; // &NotNestedLessLess -> ⪡̸ - case 5621: state = 5622; break; // ¬ni -> ∌ - case 5624: state = 5625; break; // ¬niva -> ∌ - case 5626: state = 5627; break; // ¬nivb -> ⋾ - case 5628: state = 5629; break; // ¬nivc -> ⋽ - case 5637: state = 5638; break; // &NotPrecedes -> ⊀ - case 5643: state = 5644; break; // &NotPrecedesEqual -> ⪯̸ - case 5654: state = 5655; break; // &NotPrecedesSlantEqual -> ⋠ - case 5669: state = 5670; break; // &NotReverseElement -> ∌ - case 5682: state = 5683; break; // &NotRightTriangle -> ⋫ - case 5686: state = 5687; break; // &NotRightTriangleBar -> ⧐̸ - case 5692: state = 5693; break; // &NotRightTriangleEqual -> ⋭ - case 5705: state = 5706; break; // &NotSquareSubset -> ⊏̸ - case 5711: state = 5712; break; // &NotSquareSubsetEqual -> ⋢ - case 5718: state = 5719; break; // &NotSquareSuperset -> ⊐̸ - case 5724: state = 5725; break; // &NotSquareSupersetEqual -> ⋣ - case 5730: state = 5731; break; // &NotSubset -> ⊂⃒ - case 5736: state = 5737; break; // &NotSubsetEqual -> ⊈ - case 5743: state = 5744; break; // &NotSucceeds -> ⊁ - case 5749: state = 5750; break; // &NotSucceedsEqual -> ⪰̸ - case 5760: state = 5761; break; // &NotSucceedsSlantEqual -> ⋡ - case 5766: state = 5767; break; // &NotSucceedsTilde -> ≿̸ - case 5773: state = 5774; break; // &NotSuperset -> ⊃⃒ - case 5779: state = 5780; break; // &NotSupersetEqual -> ⊉ - case 5785: state = 5786; break; // &NotTilde -> ≁ - case 5791: state = 5792; break; // &NotTildeEqual -> ≄ - case 5801: state = 5802; break; // &NotTildeFullEqual -> ≇ - case 5807: state = 5808; break; // &NotTildeTilde -> ≉ - case 5819: state = 5820; break; // &NotVerticalBar -> ∤ - case 5823: state = 5824; break; // &npar -> ∦ - case 5829: state = 5830; break; // &nparallel -> ∦ - case 5832: state = 5833; break; // &nparsl -> ⫽⃥ - case 5834: state = 5835; break; // &npart -> ∂̸ - case 5840: state = 5841; break; // &npolint -> ⨔ - case 5842: state = 5843; break; // &npr -> ⊀ - case 5846: state = 5847; break; // &nprcue -> ⋠ - case 5848: state = 5849; break; // &npre -> ⪯̸ - case 5850: state = 5851; break; // &nprec -> ⊀ - case 5853: state = 5854; break; // &npreceq -> ⪯̸ - case 5858: state = 5859; break; // &nrArr -> ⇏ - case 5862: state = 5863; break; // &nrarr -> ↛ - case 5864: state = 5865; break; // &nrarrc -> ⤳̸ - case 5866: state = 5867; break; // &nrarrw -> ↝̸ - case 5877: state = 5878; break; // &nRightarrow -> ⇏ - case 5887: state = 5888; break; // &nrightarrow -> ↛ - case 5891: state = 5892; break; // &nrtri -> ⋫ - case 5893: state = 5894; break; // &nrtrie -> ⋭ - case 5896: state = 5897; break; // &nsc -> ⊁ - case 5900: state = 5901; break; // &nsccue -> ⋡ - case 5902: state = 5903; break; // &nsce -> ⪰̸ - case 5906: state = 5907; break; // &Nscr -> 𝒩 - case 5908: state = 5909; break; // &nscr -> 𝓃 - case 5916: state = 5917; break; // &nshortmid -> ∤ - case 5925: state = 5926; break; // &nshortparallel -> ∦ - case 5928: state = 5929; break; // &nsim -> ≁ - case 5930: state = 5931; break; // &nsime -> ≄ - case 5932: state = 5933; break; // &nsimeq -> ≄ - case 5936: state = 5937; break; // &nsmid -> ∤ - case 5940: state = 5941; break; // &nspar -> ∦ - case 5946: state = 5947; break; // &nsqsube -> ⋢ - case 5949: state = 5950; break; // &nsqsupe -> ⋣ - case 5952: state = 5953; break; // &nsub -> ⊄ - case 5954: state = 5955; break; // &nsubE -> ⫅̸ - case 5956: state = 5957; break; // &nsube -> ⊈ - case 5960: state = 5961; break; // &nsubset -> ⊂⃒ - case 5963: state = 5964; break; // &nsubseteq -> ⊈ - case 5965: state = 5966; break; // &nsubseteqq -> ⫅̸ - case 5968: state = 5969; break; // &nsucc -> ⊁ - case 5971: state = 5972; break; // &nsucceq -> ⪰̸ - case 5973: state = 5974; break; // &nsup -> ⊅ - case 5975: state = 5976; break; // &nsupE -> ⫆̸ - case 5977: state = 5978; break; // &nsupe -> ⊉ - case 5981: state = 5982; break; // &nsupset -> ⊃⃒ - case 5984: state = 5985; break; // &nsupseteq -> ⊉ - case 5986: state = 5987; break; // &nsupseteqq -> ⫆̸ - case 5990: state = 5991; break; // &ntgl -> ≹ - case 5996: state = 5997; break; // Ñ -> Ñ - case 6001: state = 6002; break; // ñ -> ñ - case 6004: state = 6005; break; // &ntlg -> ≸ - case 6016: state = 6017; break; // &ntriangleleft -> ⋪ - case 6019: state = 6020; break; // &ntrianglelefteq -> ⋬ - case 6025: state = 6026; break; // &ntriangleright -> ⋫ - case 6028: state = 6029; break; // &ntrianglerighteq -> ⋭ - case 6030: state = 6031; break; // &Nu -> Ν - case 6032: state = 6033; break; // &nu -> ν - case 6034: state = 6035; break; // &num -> # - case 6038: state = 6039; break; // &numero -> № - case 6041: state = 6042; break; // &numsp ->   - case 6045: state = 6046; break; // &nvap -> ≍⃒ - case 6051: state = 6052; break; // &nVDash -> ⊯ - case 6056: state = 6057; break; // &nVdash -> ⊮ - case 6061: state = 6062; break; // &nvDash -> ⊭ - case 6066: state = 6067; break; // &nvdash -> ⊬ - case 6069: state = 6070; break; // &nvge -> ≥⃒ - case 6071: state = 6072; break; // &nvgt -> >⃒ - case 6076: state = 6077; break; // &nvHarr -> ⤄ - case 6082: state = 6083; break; // &nvinfin -> ⧞ - case 6087: state = 6088; break; // &nvlArr -> ⤂ - case 6089: state = 6090; break; // &nvle -> ≤⃒ - case 6091: state = 6092; break; // &nvlt -> <⃒ - case 6095: state = 6096; break; // &nvltrie -> ⊴⃒ - case 6100: state = 6101; break; // &nvrArr -> ⤃ - case 6105: state = 6106; break; // &nvrtrie -> ⊵⃒ - case 6109: state = 6110; break; // &nvsim -> ∼⃒ - case 6115: state = 6116; break; // &nwarhk -> ⤣ - case 6119: state = 6120; break; // &nwArr -> ⇖ - case 6121: state = 6122; break; // &nwarr -> ↖ - case 6124: state = 6125; break; // &nwarrow -> ↖ - case 6129: state = 6130; break; // &nwnear -> ⤧ - case 6136: state = 6137; break; // Ó -> Ó - case 6143: state = 6144; break; // ó -> ó - case 6146: state = 6147; break; // &oast -> ⊛ - case 6150: state = 6151; break; // &ocir -> ⊚ - case 6155: state = 6156; break; // Ô -> Ô - case 6157: state = 6158; break; // ô -> ô - case 6159: state = 6160; break; // &Ocy -> О - case 6161: state = 6162; break; // &ocy -> о - case 6166: state = 6167; break; // &odash -> ⊝ - case 6172: state = 6173; break; // &Odblac -> Ő - case 6177: state = 6178; break; // &odblac -> ő - case 6180: state = 6181; break; // &odiv -> ⨸ - case 6183: state = 6184; break; // &odot -> ⊙ - case 6188: state = 6189; break; // &odsold -> ⦼ - case 6193: state = 6194; break; // &OElig -> Œ - case 6198: state = 6199; break; // &oelig -> œ - case 6203: state = 6204; break; // &ofcir -> ⦿ - case 6206: state = 6207; break; // &Ofr -> 𝔒 - case 6208: state = 6209; break; // &ofr -> 𝔬 - case 6212: state = 6213; break; // &ogon -> ˛ - case 6218: state = 6219; break; // Ò -> Ò - case 6223: state = 6224; break; // ò -> ò - case 6225: state = 6226; break; // &ogt -> ⧁ - case 6230: state = 6231; break; // &ohbar -> ⦵ - case 6232: state = 6233; break; // &ohm -> Ω - case 6236: state = 6237; break; // &oint -> ∮ - case 6241: state = 6242; break; // &olarr -> ↺ - case 6245: state = 6246; break; // &olcir -> ⦾ - case 6250: state = 6251; break; // &olcross -> ⦻ - case 6254: state = 6255; break; // &oline -> ‾ - case 6256: state = 6257; break; // &olt -> ⧀ - case 6261: state = 6262; break; // &Omacr -> Ō - case 6266: state = 6267; break; // &omacr -> ō - case 6270: state = 6271; break; // &Omega -> Ω - case 6274: state = 6275; break; // &omega -> ω - case 6280: state = 6281; break; // &Omicron -> Ο - case 6286: state = 6287; break; // &omicron -> ο - case 6288: state = 6289; break; // &omid -> ⦶ - case 6292: state = 6293; break; // &ominus -> ⊖ - case 6296: state = 6297; break; // &Oopf -> 𝕆 - case 6300: state = 6301; break; // &oopf -> 𝕠 - case 6304: state = 6305; break; // &opar -> ⦷ - case 6324: state = 6325; break; // &OpenCurlyDoubleQuote -> “ - case 6330: state = 6331; break; // &OpenCurlyQuote -> ‘ - case 6334: state = 6335; break; // &operp -> ⦹ - case 6338: state = 6339; break; // &oplus -> ⊕ - case 6340: state = 6341; break; // &Or -> ⩔ - case 6342: state = 6343; break; // &or -> ∨ - case 6346: state = 6347; break; // &orarr -> ↻ - case 6348: state = 6349; break; // &ord -> ⩝ - case 6351: state = 6352; break; // &order -> ℴ - case 6354: state = 6355; break; // &orderof -> ℴ - case 6356: state = 6357; break; // ª -> ª - case 6358: state = 6359; break; // º -> º - case 6363: state = 6364; break; // &origof -> ⊶ - case 6366: state = 6367; break; // &oror -> ⩖ - case 6372: state = 6373; break; // &orslope -> ⩗ - case 6374: state = 6375; break; // &orv -> ⩛ - case 6376: state = 6377; break; // &oS -> Ⓢ - case 6380: state = 6381; break; // &Oscr -> 𝒪 - case 6384: state = 6385; break; // &oscr -> ℴ - case 6389: state = 6390; break; // Ø -> Ø - case 6394: state = 6395; break; // ø -> ø - case 6397: state = 6398; break; // &osol -> ⊘ - case 6403: state = 6404; break; // Õ -> Õ - case 6409: state = 6410; break; // õ -> õ - case 6413: state = 6414; break; // &Otimes -> ⨷ - case 6417: state = 6418; break; // &otimes -> ⊗ - case 6420: state = 6421; break; // &otimesas -> ⨶ - case 6424: state = 6425; break; // Ö -> Ö - case 6428: state = 6429; break; // ö -> ö - case 6433: state = 6434; break; // &ovbar -> ⌽ - case 6440: state = 6441; break; // &OverBar -> ‾ - case 6445: state = 6446; break; // &OverBrace -> ⏞ - case 6449: state = 6450; break; // &OverBracket -> ⎴ - case 6461: state = 6462; break; // &OverParenthesis -> ⏜ - case 6465: state = 6466; break; // &par -> ∥ - case 6467: state = 6468; break; // ¶ -> ¶ - case 6472: state = 6473; break; // ¶llel -> ∥ - case 6476: state = 6477; break; // &parsim -> ⫳ - case 6478: state = 6479; break; // &parsl -> ⫽ - case 6480: state = 6481; break; // &part -> ∂ - case 6489: state = 6490; break; // &PartialD -> ∂ - case 6492: state = 6493; break; // &Pcy -> П - case 6495: state = 6496; break; // &pcy -> п - case 6501: state = 6502; break; // &percnt -> % - case 6505: state = 6506; break; // &period -> . - case 6509: state = 6510; break; // &permil -> ‰ - case 6511: state = 6512; break; // &perp -> ⊥ - case 6516: state = 6517; break; // &pertenk -> ‱ - case 6519: state = 6520; break; // &Pfr -> 𝔓 - case 6522: state = 6523; break; // &pfr -> 𝔭 - case 6525: state = 6526; break; // &Phi -> Φ - case 6528: state = 6529; break; // &phi -> φ - case 6530: state = 6531; break; // &phiv -> ϕ - case 6535: state = 6536; break; // &phmmat -> ℳ - case 6539: state = 6540; break; // &phone -> ☎ - case 6541: state = 6542; break; // &Pi -> Π - case 6543: state = 6544; break; // &pi -> π - case 6551: state = 6552; break; // &pitchfork -> ⋔ - case 6553: state = 6554; break; // &piv -> ϖ - case 6559: state = 6560; break; // &planck -> ℏ - case 6561: state = 6562; break; // &planckh -> ℎ - case 6564: state = 6565; break; // &plankv -> ℏ - case 6567: state = 6568; break; // &plus -> + - case 6572: state = 6573; break; // &plusacir -> ⨣ - case 6574: state = 6575; break; // &plusb -> ⊞ - case 6578: state = 6579; break; // &pluscir -> ⨢ - case 6581: state = 6582; break; // &plusdo -> ∔ - case 6583: state = 6584; break; // &plusdu -> ⨥ - case 6585: state = 6586; break; // &pluse -> ⩲ - case 6594: state = 6595; break; // &PlusMinus -> ± - case 6597: state = 6598; break; // ± -> ± - case 6601: state = 6602; break; // &plussim -> ⨦ - case 6605: state = 6606; break; // &plustwo -> ⨧ - case 6607: state = 6608; break; // &pm -> ± - case 6620: state = 6621; break; // &Poincareplane -> ℌ - case 6628: state = 6629; break; // &pointint -> ⨕ - case 6631: state = 6632; break; // &Popf -> ℙ - case 6634: state = 6635; break; // &popf -> 𝕡 - case 6638: state = 6639; break; // £ -> £ - case 6640: state = 6641; break; // &Pr -> ⪻ - case 6642: state = 6643; break; // &pr -> ≺ - case 6645: state = 6646; break; // &prap -> ⪷ - case 6649: state = 6650; break; // &prcue -> ≼ - case 6651: state = 6652; break; // &prE -> ⪳ - case 6653: state = 6654; break; // &pre -> ⪯ - case 6655: state = 6656; break; // &prec -> ≺ - case 6662: state = 6663; break; // &precapprox -> ⪷ - case 6670: state = 6671; break; // &preccurlyeq -> ≼ - case 6677: state = 6678; break; // &Precedes -> ≺ - case 6683: state = 6684; break; // &PrecedesEqual -> ⪯ - case 6694: state = 6695; break; // &PrecedesSlantEqual -> ≼ - case 6700: state = 6701; break; // &PrecedesTilde -> ≾ - case 6703: state = 6704; break; // &preceq -> ⪯ - case 6711: state = 6712; break; // &precnapprox -> ⪹ - case 6715: state = 6716; break; // &precneqq -> ⪵ - case 6719: state = 6720; break; // &precnsim -> ⋨ - case 6723: state = 6724; break; // &precsim -> ≾ - case 6727: state = 6728; break; // &Prime -> ″ - case 6731: state = 6732; break; // &prime -> ′ - case 6733: state = 6734; break; // &primes -> ℙ - case 6737: state = 6738; break; // &prnap -> ⪹ - case 6739: state = 6740; break; // &prnE -> ⪵ - case 6743: state = 6744; break; // &prnsim -> ⋨ - case 6746: state = 6747; break; // &prod -> ∏ - case 6752: state = 6753; break; // &Product -> ∏ - case 6758: state = 6759; break; // &profalar -> ⌮ - case 6763: state = 6764; break; // &profline -> ⌒ - case 6768: state = 6769; break; // &profsurf -> ⌓ - case 6770: state = 6771; break; // &prop -> ∝ - case 6778: state = 6779; break; // &Proportion -> ∷ - case 6781: state = 6782; break; // &Proportional -> ∝ - case 6784: state = 6785; break; // &propto -> ∝ - case 6788: state = 6789; break; // &prsim -> ≾ - case 6793: state = 6794; break; // &prurel -> ⊰ - case 6797: state = 6798; break; // &Pscr -> 𝒫 - case 6801: state = 6802; break; // &pscr -> 𝓅 - case 6803: state = 6804; break; // &Psi -> Ψ - case 6805: state = 6806; break; // &psi -> ψ - case 6811: state = 6812; break; // &puncsp ->   - case 6815: state = 6816; break; // &Qfr -> 𝔔 - case 6819: state = 6820; break; // &qfr -> 𝔮 - case 6823: state = 6824; break; // &qint -> ⨌ - case 6827: state = 6828; break; // &Qopf -> ℚ - case 6831: state = 6832; break; // &qopf -> 𝕢 - case 6837: state = 6838; break; // &qprime -> ⁗ - case 6841: state = 6842; break; // &Qscr -> 𝒬 - case 6845: state = 6846; break; // &qscr -> 𝓆 - case 6856: state = 6857; break; // &quaternions -> ℍ - case 6860: state = 6861; break; // &quatint -> ⨖ - case 6864: state = 6865; break; // &quest -> ? - case 6867: state = 6868; break; // &questeq -> ≟ - case 6871: state = 6872; break; // " -> " - case 6874: state = 6875; break; // " -> " - case 6880: state = 6881; break; // &rAarr -> ⇛ - case 6884: state = 6885; break; // &race -> ∽̱ - case 6891: state = 6892; break; // &Racute -> Ŕ - case 6895: state = 6896; break; // &racute -> ŕ - case 6899: state = 6900; break; // &radic -> √ - case 6906: state = 6907; break; // &raemptyv -> ⦳ - case 6909: state = 6910; break; // &Rang -> ⟫ - case 6912: state = 6913; break; // &rang -> ⟩ - case 6914: state = 6915; break; // &rangd -> ⦒ - case 6916: state = 6917; break; // &range -> ⦥ - case 6919: state = 6920; break; // &rangle -> ⟩ - case 6923: state = 6924; break; // » -> » - case 6926: state = 6927; break; // &Rarr -> ↠ - case 6929: state = 6930; break; // &rArr -> ⇒ - case 6932: state = 6933; break; // &rarr -> → - case 6935: state = 6936; break; // &rarrap -> ⥵ - case 6937: state = 6938; break; // &rarrb -> ⇥ - case 6940: state = 6941; break; // &rarrbfs -> ⤠ - case 6942: state = 6943; break; // &rarrc -> ⤳ - case 6945: state = 6946; break; // &rarrfs -> ⤞ - case 6948: state = 6949; break; // &rarrhk -> ↪ - case 6951: state = 6952; break; // &rarrlp -> ↬ - case 6954: state = 6955; break; // &rarrpl -> ⥅ - case 6958: state = 6959; break; // &rarrsim -> ⥴ - case 6961: state = 6962; break; // &Rarrtl -> ⤖ - case 6964: state = 6965; break; // &rarrtl -> ↣ - case 6966: state = 6967; break; // &rarrw -> ↝ - case 6971: state = 6972; break; // &rAtail -> ⤜ - case 6976: state = 6977; break; // &ratail -> ⤚ - case 6979: state = 6980; break; // &ratio -> ∶ - case 6984: state = 6985; break; // &rationals -> ℚ - case 6989: state = 6990; break; // &RBarr -> ⤐ - case 6994: state = 6995; break; // &rBarr -> ⤏ - case 6999: state = 7000; break; // &rbarr -> ⤍ - case 7003: state = 7004; break; // &rbbrk -> ❳ - case 7008: state = 7009; break; // &rbrace -> } - case 7010: state = 7011; break; // &rbrack -> ] - case 7013: state = 7014; break; // &rbrke -> ⦌ - case 7017: state = 7018; break; // &rbrksld -> ⦎ - case 7019: state = 7020; break; // &rbrkslu -> ⦐ - case 7025: state = 7026; break; // &Rcaron -> Ř - case 7031: state = 7032; break; // &rcaron -> ř - case 7036: state = 7037; break; // &Rcedil -> Ŗ - case 7041: state = 7042; break; // &rcedil -> ŗ - case 7044: state = 7045; break; // &rceil -> ⌉ - case 7047: state = 7048; break; // &rcub -> } - case 7049: state = 7050; break; // &Rcy -> Р - case 7051: state = 7052; break; // &rcy -> р - case 7055: state = 7056; break; // &rdca -> ⤷ - case 7061: state = 7062; break; // &rdldhar -> ⥩ - case 7065: state = 7066; break; // &rdquo -> ” - case 7067: state = 7068; break; // &rdquor -> ” - case 7070: state = 7071; break; // &rdsh -> ↳ - case 7072: state = 7073; break; // &Re -> ℜ - case 7076: state = 7077; break; // &real -> ℜ - case 7080: state = 7081; break; // &realine -> ℛ - case 7085: state = 7086; break; // &realpart -> ℜ - case 7087: state = 7088; break; // &reals -> ℝ - case 7090: state = 7091; break; // &rect -> ▭ - case 7093: state = 7094; break; // ® -> ® - case 7095: state = 7096; break; // ® -> ® - case 7108: state = 7109; break; // &ReverseElement -> ∋ - case 7119: state = 7120; break; // &ReverseEquilibrium -> ⇋ - case 7133: state = 7134; break; // &ReverseUpEquilibrium -> ⥯ - case 7139: state = 7140; break; // &rfisht -> ⥽ - case 7144: state = 7145; break; // &rfloor -> ⌋ - case 7147: state = 7148; break; // &Rfr -> ℜ - case 7149: state = 7150; break; // &rfr -> 𝔯 - case 7153: state = 7154; break; // &rHar -> ⥤ - case 7158: state = 7159; break; // &rhard -> ⇁ - case 7160: state = 7161; break; // &rharu -> ⇀ - case 7162: state = 7163; break; // &rharul -> ⥬ - case 7165: state = 7166; break; // &Rho -> Ρ - case 7167: state = 7168; break; // &rho -> ρ - case 7169: state = 7170; break; // &rhov -> ϱ - case 7186: state = 7187; break; // &RightAngleBracket -> ⟩ - case 7191: state = 7192; break; // &RightArrow -> → - case 7197: state = 7198; break; // &Rightarrow -> ⇒ - case 7207: state = 7208; break; // &rightarrow -> → - case 7211: state = 7212; break; // &RightArrowBar -> ⇥ - case 7221: state = 7222; break; // &RightArrowLeftArrow -> ⇄ - case 7226: state = 7227; break; // &rightarrowtail -> ↣ - case 7234: state = 7235; break; // &RightCeiling -> ⌉ - case 7248: state = 7249; break; // &RightDoubleBracket -> ⟧ - case 7260: state = 7261; break; // &RightDownTeeVector -> ⥝ - case 7267: state = 7268; break; // &RightDownVector -> ⇂ - case 7271: state = 7272; break; // &RightDownVectorBar -> ⥕ - case 7277: state = 7278; break; // &RightFloor -> ⌋ - case 7289: state = 7290; break; // &rightharpoondown -> ⇁ - case 7292: state = 7293; break; // &rightharpoonup -> ⇀ - case 7303: state = 7304; break; // &rightleftarrows -> ⇄ - case 7312: state = 7313; break; // &rightleftharpoons -> ⇌ - case 7324: state = 7325; break; // &rightrightarrows -> ⇉ - case 7335: state = 7336; break; // &rightsquigarrow -> ↝ - case 7339: state = 7340; break; // &RightTee -> ⊢ - case 7345: state = 7346; break; // &RightTeeArrow -> ↦ - case 7352: state = 7353; break; // &RightTeeVector -> ⥛ - case 7363: state = 7364; break; // &rightthreetimes -> ⋌ - case 7371: state = 7372; break; // &RightTriangle -> ⊳ - case 7375: state = 7376; break; // &RightTriangleBar -> ⧐ - case 7381: state = 7382; break; // &RightTriangleEqual -> ⊵ - case 7394: state = 7395; break; // &RightUpDownVector -> ⥏ - case 7404: state = 7405; break; // &RightUpTeeVector -> ⥜ - case 7411: state = 7412; break; // &RightUpVector -> ↾ - case 7415: state = 7416; break; // &RightUpVectorBar -> ⥔ - case 7422: state = 7423; break; // &RightVector -> ⇀ - case 7426: state = 7427; break; // &RightVectorBar -> ⥓ - case 7429: state = 7430; break; // &ring -> ˚ - case 7440: state = 7441; break; // &risingdotseq -> ≓ - case 7445: state = 7446; break; // &rlarr -> ⇄ - case 7449: state = 7450; break; // &rlhar -> ⇌ - case 7451: state = 7452; break; // &rlm -> ‏ - case 7457: state = 7458; break; // &rmoust -> ⎱ - case 7462: state = 7463; break; // &rmoustache -> ⎱ - case 7467: state = 7468; break; // &rnmid -> ⫮ - case 7472: state = 7473; break; // &roang -> ⟭ - case 7475: state = 7476; break; // &roarr -> ⇾ - case 7479: state = 7480; break; // &robrk -> ⟧ - case 7483: state = 7484; break; // &ropar -> ⦆ - case 7487: state = 7488; break; // &Ropf -> ℝ - case 7489: state = 7490; break; // &ropf -> 𝕣 - case 7493: state = 7494; break; // &roplus -> ⨮ - case 7499: state = 7500; break; // &rotimes -> ⨵ - case 7510: state = 7511; break; // &RoundImplies -> ⥰ - case 7514: state = 7515; break; // &rpar -> ) - case 7517: state = 7518; break; // &rpargt -> ⦔ - case 7524: state = 7525; break; // &rppolint -> ⨒ - case 7529: state = 7530; break; // &rrarr -> ⇉ - case 7540: state = 7541; break; // &Rrightarrow -> ⇛ - case 7546: state = 7547; break; // &rsaquo -> › - case 7550: state = 7551; break; // &Rscr -> ℛ - case 7553: state = 7554; break; // &rscr -> 𝓇 - case 7555: state = 7556; break; // &Rsh -> ↱ - case 7557: state = 7558; break; // &rsh -> ↱ - case 7560: state = 7561; break; // &rsqb -> ] - case 7563: state = 7564; break; // &rsquo -> ’ - case 7565: state = 7566; break; // &rsquor -> ’ - case 7571: state = 7572; break; // &rthree -> ⋌ - case 7576: state = 7577; break; // &rtimes -> ⋊ - case 7579: state = 7580; break; // &rtri -> ▹ - case 7581: state = 7582; break; // &rtrie -> ⊵ - case 7583: state = 7584; break; // &rtrif -> ▸ - case 7588: state = 7589; break; // &rtriltri -> ⧎ - case 7599: state = 7600; break; // &RuleDelayed -> ⧴ - case 7606: state = 7607; break; // &ruluhar -> ⥨ - case 7608: state = 7609; break; // &rx -> ℞ - case 7615: state = 7616; break; // &Sacute -> Ś - case 7622: state = 7623; break; // &sacute -> ś - case 7627: state = 7628; break; // &sbquo -> ‚ - case 7629: state = 7630; break; // &Sc -> ⪼ - case 7631: state = 7632; break; // &sc -> ≻ - case 7634: state = 7635; break; // &scap -> ⪸ - case 7639: state = 7640; break; // &Scaron -> Š - case 7643: state = 7644; break; // &scaron -> š - case 7647: state = 7648; break; // &sccue -> ≽ - case 7649: state = 7650; break; // &scE -> ⪴ - case 7651: state = 7652; break; // &sce -> ⪰ - case 7656: state = 7657; break; // &Scedil -> Ş - case 7660: state = 7661; break; // &scedil -> ş - case 7664: state = 7665; break; // &Scirc -> Ŝ - case 7668: state = 7669; break; // &scirc -> ŝ - case 7672: state = 7673; break; // &scnap -> ⪺ - case 7674: state = 7675; break; // &scnE -> ⪶ - case 7678: state = 7679; break; // &scnsim -> ⋩ - case 7685: state = 7686; break; // &scpolint -> ⨓ - case 7689: state = 7690; break; // &scsim -> ≿ - case 7691: state = 7692; break; // &Scy -> С - case 7693: state = 7694; break; // &scy -> с - case 7697: state = 7698; break; // &sdot -> ⋅ - case 7699: state = 7700; break; // &sdotb -> ⊡ - case 7701: state = 7702; break; // &sdote -> ⩦ - case 7707: state = 7708; break; // &searhk -> ⤥ - case 7711: state = 7712; break; // &seArr -> ⇘ - case 7713: state = 7714; break; // &searr -> ↘ - case 7716: state = 7717; break; // &searrow -> ↘ - case 7719: state = 7720; break; // § -> § - case 7722: state = 7723; break; // &semi -> ; - case 7727: state = 7728; break; // &seswar -> ⤩ - case 7734: state = 7735; break; // &setminus -> ∖ - case 7736: state = 7737; break; // &setmn -> ∖ - case 7739: state = 7740; break; // &sext -> ✶ - case 7742: state = 7743; break; // &Sfr -> 𝔖 - case 7745: state = 7746; break; // &sfr -> 𝔰 - case 7749: state = 7750; break; // &sfrown -> ⌢ - case 7754: state = 7755; break; // &sharp -> ♯ - case 7760: state = 7761; break; // &SHCHcy -> Щ - case 7765: state = 7766; break; // &shchcy -> щ - case 7768: state = 7769; break; // &SHcy -> Ш - case 7770: state = 7771; break; // &shcy -> ш - case 7784: state = 7785; break; // &ShortDownArrow -> ↓ - case 7794: state = 7795; break; // &ShortLeftArrow -> ← - case 7801: state = 7802; break; // &shortmid -> ∣ - case 7810: state = 7811; break; // &shortparallel -> ∥ - case 7821: state = 7822; break; // &ShortRightArrow -> → - case 7829: state = 7830; break; // &ShortUpArrow -> ↑ - case 7831: state = 7832; break; // ­ -> ­ - case 7836: state = 7837; break; // &Sigma -> Σ - case 7841: state = 7842; break; // &sigma -> σ - case 7843: state = 7844; break; // &sigmaf -> ς - case 7845: state = 7846; break; // &sigmav -> ς - case 7847: state = 7848; break; // &sim -> ∼ - case 7851: state = 7852; break; // &simdot -> ⩪ - case 7853: state = 7854; break; // &sime -> ≃ - case 7855: state = 7856; break; // &simeq -> ≃ - case 7857: state = 7858; break; // &simg -> ⪞ - case 7859: state = 7860; break; // &simgE -> ⪠ - case 7861: state = 7862; break; // &siml -> ⪝ - case 7863: state = 7864; break; // &simlE -> ⪟ - case 7866: state = 7867; break; // &simne -> ≆ - case 7871: state = 7872; break; // &simplus -> ⨤ - case 7876: state = 7877; break; // &simrarr -> ⥲ - case 7881: state = 7882; break; // &slarr -> ← - case 7892: state = 7893; break; // &SmallCircle -> ∘ - case 7905: state = 7906; break; // &smallsetminus -> ∖ - case 7909: state = 7910; break; // &smashp -> ⨳ - case 7916: state = 7917; break; // &smeparsl -> ⧤ - case 7919: state = 7920; break; // &smid -> ∣ - case 7922: state = 7923; break; // &smile -> ⌣ - case 7924: state = 7925; break; // &smt -> ⪪ - case 7926: state = 7927; break; // &smte -> ⪬ - case 7928: state = 7929; break; // &smtes -> ⪬︀ - case 7934: state = 7935; break; // &SOFTcy -> Ь - case 7940: state = 7941; break; // &softcy -> ь - case 7942: state = 7943; break; // &sol -> / - case 7944: state = 7945; break; // &solb -> ⧄ - case 7947: state = 7948; break; // &solbar -> ⌿ - case 7951: state = 7952; break; // &Sopf -> 𝕊 - case 7954: state = 7955; break; // &sopf -> 𝕤 - case 7960: state = 7961; break; // &spades -> ♠ - case 7964: state = 7965; break; // &spadesuit -> ♠ - case 7966: state = 7967; break; // &spar -> ∥ - case 7971: state = 7972; break; // &sqcap -> ⊓ - case 7973: state = 7974; break; // &sqcaps -> ⊓︀ - case 7976: state = 7977; break; // &sqcup -> ⊔ - case 7978: state = 7979; break; // &sqcups -> ⊔︀ - case 7982: state = 7983; break; // &Sqrt -> √ - case 7986: state = 7987; break; // &sqsub -> ⊏ - case 7988: state = 7989; break; // &sqsube -> ⊑ - case 7992: state = 7993; break; // &sqsubset -> ⊏ - case 7995: state = 7996; break; // &sqsubseteq -> ⊑ - case 7997: state = 7998; break; // &sqsup -> ⊐ - case 7999: state = 8000; break; // &sqsupe -> ⊒ - case 8003: state = 8004; break; // &sqsupset -> ⊐ - case 8006: state = 8007; break; // &sqsupseteq -> ⊒ - case 8008: state = 8009; break; // &squ -> □ - case 8013: state = 8014; break; // &Square -> □ - case 8017: state = 8018; break; // &square -> □ - case 8030: state = 8031; break; // &SquareIntersection -> ⊓ - case 8037: state = 8038; break; // &SquareSubset -> ⊏ - case 8043: state = 8044; break; // &SquareSubsetEqual -> ⊑ - case 8050: state = 8051; break; // &SquareSuperset -> ⊐ - case 8056: state = 8057; break; // &SquareSupersetEqual -> ⊒ - case 8062: state = 8063; break; // &SquareUnion -> ⊔ - case 8064: state = 8065; break; // &squarf -> ▪ - case 8066: state = 8067; break; // &squf -> ▪ - case 8071: state = 8072; break; // &srarr -> → - case 8075: state = 8076; break; // &Sscr -> 𝒮 - case 8079: state = 8080; break; // &sscr -> 𝓈 - case 8084: state = 8085; break; // &ssetmn -> ∖ - case 8089: state = 8090; break; // &ssmile -> ⌣ - case 8094: state = 8095; break; // &sstarf -> ⋆ - case 8098: state = 8099; break; // &Star -> ⋆ - case 8102: state = 8103; break; // &star -> ☆ - case 8104: state = 8105; break; // &starf -> ★ - case 8118: state = 8119; break; // &straightepsilon -> ϵ - case 8122: state = 8123; break; // &straightphi -> ϕ - case 8125: state = 8126; break; // &strns -> ¯ - case 8128: state = 8129; break; // &Sub -> ⋐ - case 8131: state = 8132; break; // &sub -> ⊂ - case 8135: state = 8136; break; // &subdot -> ⪽ - case 8137: state = 8138; break; // &subE -> ⫅ - case 8139: state = 8140; break; // &sube -> ⊆ - case 8143: state = 8144; break; // &subedot -> ⫃ - case 8148: state = 8149; break; // &submult -> ⫁ - case 8151: state = 8152; break; // &subnE -> ⫋ - case 8153: state = 8154; break; // &subne -> ⊊ - case 8158: state = 8159; break; // &subplus -> ⪿ - case 8163: state = 8164; break; // &subrarr -> ⥹ - case 8167: state = 8168; break; // &Subset -> ⋐ - case 8171: state = 8172; break; // &subset -> ⊂ - case 8174: state = 8175; break; // &subseteq -> ⊆ - case 8176: state = 8177; break; // &subseteqq -> ⫅ - case 8182: state = 8183; break; // &SubsetEqual -> ⊆ - case 8186: state = 8187; break; // &subsetneq -> ⊊ - case 8188: state = 8189; break; // &subsetneqq -> ⫋ - case 8191: state = 8192; break; // &subsim -> ⫇ - case 8194: state = 8195; break; // &subsub -> ⫕ - case 8196: state = 8197; break; // &subsup -> ⫓ - case 8199: state = 8200; break; // &succ -> ≻ - case 8206: state = 8207; break; // &succapprox -> ⪸ - case 8214: state = 8215; break; // &succcurlyeq -> ≽ - case 8221: state = 8222; break; // &Succeeds -> ≻ - case 8227: state = 8228; break; // &SucceedsEqual -> ⪰ - case 8238: state = 8239; break; // &SucceedsSlantEqual -> ≽ - case 8244: state = 8245; break; // &SucceedsTilde -> ≿ - case 8247: state = 8248; break; // &succeq -> ⪰ - case 8255: state = 8256; break; // &succnapprox -> ⪺ - case 8259: state = 8260; break; // &succneqq -> ⪶ - case 8263: state = 8264; break; // &succnsim -> ⋩ - case 8267: state = 8268; break; // &succsim -> ≿ - case 8273: state = 8274; break; // &SuchThat -> ∋ - case 8275: state = 8276; break; // &Sum -> ∑ - case 8277: state = 8278; break; // &sum -> ∑ - case 8280: state = 8281; break; // &sung -> ♪ - case 8282: state = 8283; break; // &Sup -> ⋑ - case 8284: state = 8285; break; // &sup -> ⊃ - case 8286: state = 8287; break; // ¹ -> ¹ - case 8288: state = 8289; break; // ² -> ² - case 8290: state = 8291; break; // ³ -> ³ - case 8294: state = 8295; break; // &supdot -> ⪾ - case 8298: state = 8299; break; // &supdsub -> ⫘ - case 8300: state = 8301; break; // &supE -> ⫆ - case 8302: state = 8303; break; // &supe -> ⊇ - case 8306: state = 8307; break; // &supedot -> ⫄ - case 8312: state = 8313; break; // &Superset -> ⊃ - case 8318: state = 8319; break; // &SupersetEqual -> ⊇ - case 8323: state = 8324; break; // &suphsol -> ⟉ - case 8326: state = 8327; break; // &suphsub -> ⫗ - case 8331: state = 8332; break; // &suplarr -> ⥻ - case 8336: state = 8337; break; // &supmult -> ⫂ - case 8339: state = 8340; break; // &supnE -> ⫌ - case 8341: state = 8342; break; // &supne -> ⊋ - case 8346: state = 8347; break; // &supplus -> ⫀ - case 8350: state = 8351; break; // &Supset -> ⋑ - case 8354: state = 8355; break; // &supset -> ⊃ - case 8357: state = 8358; break; // &supseteq -> ⊇ - case 8359: state = 8360; break; // &supseteqq -> ⫆ - case 8363: state = 8364; break; // &supsetneq -> ⊋ - case 8365: state = 8366; break; // &supsetneqq -> ⫌ - case 8368: state = 8369; break; // &supsim -> ⫈ - case 8371: state = 8372; break; // &supsub -> ⫔ - case 8373: state = 8374; break; // &supsup -> ⫖ - case 8379: state = 8380; break; // &swarhk -> ⤦ - case 8383: state = 8384; break; // &swArr -> ⇙ - case 8385: state = 8386; break; // &swarr -> ↙ - case 8388: state = 8389; break; // &swarrow -> ↙ - case 8393: state = 8394; break; // &swnwar -> ⤪ - case 8398: state = 8399; break; // ß -> ß - case 8402: state = 8403; break; // &Tab -> - case 8409: state = 8410; break; // &target -> ⌖ - case 8411: state = 8412; break; // &Tau -> Τ - case 8413: state = 8414; break; // &tau -> τ - case 8417: state = 8418; break; // &tbrk -> ⎴ - case 8423: state = 8424; break; // &Tcaron -> Ť - case 8429: state = 8430; break; // &tcaron -> ť - case 8434: state = 8435; break; // &Tcedil -> Ţ - case 8439: state = 8440; break; // &tcedil -> ţ - case 8441: state = 8442; break; // &Tcy -> Т - case 8443: state = 8444; break; // &tcy -> т - case 8447: state = 8448; break; // &tdot -> ⃛ - case 8453: state = 8454; break; // &telrec -> ⌕ - case 8456: state = 8457; break; // &Tfr -> 𝔗 - case 8459: state = 8460; break; // &tfr -> 𝔱 - case 8465: state = 8466; break; // &there4 -> ∴ - case 8474: state = 8475; break; // &Therefore -> ∴ - case 8479: state = 8480; break; // &therefore -> ∴ - case 8482: state = 8483; break; // &Theta -> Θ - case 8485: state = 8486; break; // &theta -> θ - case 8489: state = 8490; break; // &thetasym -> ϑ - case 8491: state = 8492; break; // &thetav -> ϑ - case 8501: state = 8502; break; // &thickapprox -> ≈ - case 8505: state = 8506; break; // &thicksim -> ∼ - case 8514: state = 8515; break; // &ThickSpace ->    - case 8518: state = 8519; break; // &thinsp ->   - case 8525: state = 8526; break; // &ThinSpace ->   - case 8529: state = 8530; break; // &thkap -> ≈ - case 8533: state = 8534; break; // &thksim -> ∼ - case 8538: state = 8539; break; // Þ -> Þ - case 8542: state = 8543; break; // þ -> þ - case 8547: state = 8548; break; // &Tilde -> ∼ - case 8552: state = 8553; break; // &tilde -> ˜ - case 8558: state = 8559; break; // &TildeEqual -> ≃ - case 8568: state = 8569; break; // &TildeFullEqual -> ≅ - case 8574: state = 8575; break; // &TildeTilde -> ≈ - case 8578: state = 8579; break; // × -> × - case 8580: state = 8581; break; // ×b -> ⊠ - case 8583: state = 8584; break; // ×bar -> ⨱ - case 8585: state = 8586; break; // ×d -> ⨰ - case 8588: state = 8589; break; // &tint -> ∭ - case 8592: state = 8593; break; // &toea -> ⤨ - case 8594: state = 8595; break; // &top -> ⊤ - case 8598: state = 8599; break; // &topbot -> ⌶ - case 8602: state = 8603; break; // &topcir -> ⫱ - case 8606: state = 8607; break; // &Topf -> 𝕋 - case 8608: state = 8609; break; // &topf -> 𝕥 - case 8612: state = 8613; break; // &topfork -> ⫚ - case 8615: state = 8616; break; // &tosa -> ⤩ - case 8621: state = 8622; break; // &tprime -> ‴ - case 8626: state = 8627; break; // &TRADE -> ™ - case 8631: state = 8632; break; // &trade -> ™ - case 8638: state = 8639; break; // &triangle -> ▵ - case 8643: state = 8644; break; // &triangledown -> ▿ - case 8648: state = 8649; break; // &triangleleft -> ◃ - case 8651: state = 8652; break; // &trianglelefteq -> ⊴ - case 8653: state = 8654; break; // &triangleq -> ≜ - case 8659: state = 8660; break; // &triangleright -> ▹ - case 8662: state = 8663; break; // &trianglerighteq -> ⊵ - case 8666: state = 8667; break; // &tridot -> ◬ - case 8668: state = 8669; break; // &trie -> ≜ - case 8674: state = 8675; break; // &triminus -> ⨺ - case 8683: state = 8684; break; // &TripleDot -> ⃛ - case 8688: state = 8689; break; // &triplus -> ⨹ - case 8691: state = 8692; break; // &trisb -> ⧍ - case 8696: state = 8697; break; // &tritime -> ⨻ - case 8703: state = 8704; break; // &trpezium -> ⏢ - case 8707: state = 8708; break; // &Tscr -> 𝒯 - case 8711: state = 8712; break; // &tscr -> 𝓉 - case 8715: state = 8716; break; // &TScy -> Ц - case 8717: state = 8718; break; // &tscy -> ц - case 8721: state = 8722; break; // &TSHcy -> Ћ - case 8725: state = 8726; break; // &tshcy -> ћ - case 8730: state = 8731; break; // &Tstrok -> Ŧ - case 8735: state = 8736; break; // &tstrok -> ŧ - case 8740: state = 8741; break; // &twixt -> ≬ - case 8755: state = 8756; break; // &twoheadleftarrow -> ↞ - case 8766: state = 8767; break; // &twoheadrightarrow -> ↠ - case 8773: state = 8774; break; // Ú -> Ú - case 8780: state = 8781; break; // ú -> ú - case 8783: state = 8784; break; // &Uarr -> ↟ - case 8787: state = 8788; break; // &uArr -> ⇑ - case 8790: state = 8791; break; // &uarr -> ↑ - case 8795: state = 8796; break; // &Uarrocir -> ⥉ - case 8800: state = 8801; break; // &Ubrcy -> Ў - case 8805: state = 8806; break; // &ubrcy -> ў - case 8809: state = 8810; break; // &Ubreve -> Ŭ - case 8813: state = 8814; break; // &ubreve -> ŭ - case 8818: state = 8819; break; // Û -> Û - case 8823: state = 8824; break; // û -> û - case 8825: state = 8826; break; // &Ucy -> У - case 8827: state = 8828; break; // &ucy -> у - case 8832: state = 8833; break; // &udarr -> ⇅ - case 8838: state = 8839; break; // &Udblac -> Ű - case 8843: state = 8844; break; // &udblac -> ű - case 8847: state = 8848; break; // &udhar -> ⥮ - case 8853: state = 8854; break; // &ufisht -> ⥾ - case 8856: state = 8857; break; // &Ufr -> 𝔘 - case 8858: state = 8859; break; // &ufr -> 𝔲 - case 8864: state = 8865; break; // Ù -> Ù - case 8870: state = 8871; break; // ù -> ù - case 8874: state = 8875; break; // &uHar -> ⥣ - case 8879: state = 8880; break; // &uharl -> ↿ - case 8881: state = 8882; break; // &uharr -> ↾ - case 8885: state = 8886; break; // &uhblk -> ▀ - case 8891: state = 8892; break; // &ulcorn -> ⌜ - case 8894: state = 8895; break; // &ulcorner -> ⌜ - case 8898: state = 8899; break; // &ulcrop -> ⌏ - case 8902: state = 8903; break; // &ultri -> ◸ - case 8907: state = 8908; break; // &Umacr -> Ū - case 8912: state = 8913; break; // &umacr -> ū - case 8914: state = 8915; break; // ¨ -> ¨ - case 8922: state = 8923; break; // &UnderBar -> _ - case 8927: state = 8928; break; // &UnderBrace -> ⏟ - case 8931: state = 8932; break; // &UnderBracket -> ⎵ - case 8943: state = 8944; break; // &UnderParenthesis -> ⏝ - case 8947: state = 8948; break; // &Union -> ⋃ - case 8952: state = 8953; break; // &UnionPlus -> ⊎ - case 8957: state = 8958; break; // &Uogon -> Ų - case 8962: state = 8963; break; // &uogon -> ų - case 8965: state = 8966; break; // &Uopf -> 𝕌 - case 8968: state = 8969; break; // &uopf -> 𝕦 - case 8975: state = 8976; break; // &UpArrow -> ↑ - case 8981: state = 8982; break; // &Uparrow -> ⇑ - case 8988: state = 8989; break; // &uparrow -> ↑ - case 8992: state = 8993; break; // &UpArrowBar -> ⤒ - case 9002: state = 9003; break; // &UpArrowDownArrow -> ⇅ - case 9012: state = 9013; break; // &UpDownArrow -> ↕ - case 9022: state = 9023; break; // &Updownarrow -> ⇕ - case 9032: state = 9033; break; // &updownarrow -> ↕ - case 9044: state = 9045; break; // &UpEquilibrium -> ⥮ - case 9056: state = 9057; break; // &upharpoonleft -> ↿ - case 9062: state = 9063; break; // &upharpoonright -> ↾ - case 9066: state = 9067; break; // &uplus -> ⊎ - case 9079: state = 9080; break; // &UpperLeftArrow -> ↖ - case 9090: state = 9091; break; // &UpperRightArrow -> ↗ - case 9093: state = 9094; break; // &Upsi -> ϒ - case 9096: state = 9097; break; // &upsi -> υ - case 9098: state = 9099; break; // &upsih -> ϒ - case 9102: state = 9103; break; // &Upsilon -> Υ - case 9106: state = 9107; break; // &upsilon -> υ - case 9110: state = 9111; break; // &UpTee -> ⊥ - case 9116: state = 9117; break; // &UpTeeArrow -> ↥ - case 9125: state = 9126; break; // &upuparrows -> ⇈ - case 9131: state = 9132; break; // &urcorn -> ⌝ - case 9134: state = 9135; break; // &urcorner -> ⌝ - case 9138: state = 9139; break; // &urcrop -> ⌎ - case 9143: state = 9144; break; // &Uring -> Ů - case 9147: state = 9148; break; // &uring -> ů - case 9151: state = 9152; break; // &urtri -> ◹ - case 9155: state = 9156; break; // &Uscr -> 𝒰 - case 9159: state = 9160; break; // &uscr -> 𝓊 - case 9164: state = 9165; break; // &utdot -> ⋰ - case 9170: state = 9171; break; // &Utilde -> Ũ - case 9175: state = 9176; break; // &utilde -> ũ - case 9178: state = 9179; break; // &utri -> ▵ - case 9180: state = 9181; break; // &utrif -> ▴ - case 9185: state = 9186; break; // &uuarr -> ⇈ - case 9189: state = 9190; break; // Ü -> Ü - case 9192: state = 9193; break; // ü -> ü - case 9199: state = 9200; break; // &uwangle -> ⦧ - case 9206: state = 9207; break; // &vangrt -> ⦜ - case 9215: state = 9216; break; // &varepsilon -> ϵ - case 9221: state = 9222; break; // &varkappa -> ϰ - case 9229: state = 9230; break; // &varnothing -> ∅ - case 9233: state = 9234; break; // &varphi -> ϕ - case 9235: state = 9236; break; // &varpi -> ϖ - case 9241: state = 9242; break; // &varpropto -> ∝ - case 9245: state = 9246; break; // &vArr -> ⇕ - case 9247: state = 9248; break; // &varr -> ↕ - case 9250: state = 9251; break; // &varrho -> ϱ - case 9256: state = 9257; break; // &varsigma -> ς - case 9265: state = 9266; break; // &varsubsetneq -> ⊊︀ - case 9267: state = 9268; break; // &varsubsetneqq -> ⫋︀ - case 9275: state = 9276; break; // &varsupsetneq -> ⊋︀ - case 9277: state = 9278; break; // &varsupsetneqq -> ⫌︀ - case 9283: state = 9284; break; // &vartheta -> ϑ - case 9295: state = 9296; break; // &vartriangleleft -> ⊲ - case 9301: state = 9302; break; // &vartriangleright -> ⊳ - case 9306: state = 9307; break; // &Vbar -> ⫫ - case 9310: state = 9311; break; // &vBar -> ⫨ - case 9312: state = 9313; break; // &vBarv -> ⫩ - case 9315: state = 9316; break; // &Vcy -> В - case 9318: state = 9319; break; // &vcy -> в - case 9323: state = 9324; break; // &VDash -> ⊫ - case 9328: state = 9329; break; // &Vdash -> ⊩ - case 9333: state = 9334; break; // &vDash -> ⊨ - case 9338: state = 9339; break; // &vdash -> ⊢ - case 9340: state = 9341; break; // &Vdashl -> ⫦ - case 9343: state = 9344; break; // &Vee -> ⋁ - case 9346: state = 9347; break; // &vee -> ∨ - case 9350: state = 9351; break; // &veebar -> ⊻ - case 9353: state = 9354; break; // &veeeq -> ≚ - case 9358: state = 9359; break; // &vellip -> ⋮ - case 9363: state = 9364; break; // &Verbar -> ‖ - case 9368: state = 9369; break; // &verbar -> | - case 9370: state = 9371; break; // &Vert -> ‖ - case 9372: state = 9373; break; // &vert -> | - case 9380: state = 9381; break; // &VerticalBar -> ∣ - case 9385: state = 9386; break; // &VerticalLine -> | - case 9395: state = 9396; break; // &VerticalSeparator -> ❘ - case 9401: state = 9402; break; // &VerticalTilde -> ≀ - case 9412: state = 9413; break; // &VeryThinSpace ->   - case 9415: state = 9416; break; // &Vfr -> 𝔙 - case 9418: state = 9419; break; // &vfr -> 𝔳 - case 9423: state = 9424; break; // &vltri -> ⊲ - case 9428: state = 9429; break; // &vnsub -> ⊂⃒ - case 9430: state = 9431; break; // &vnsup -> ⊃⃒ - case 9434: state = 9435; break; // &Vopf -> 𝕍 - case 9438: state = 9439; break; // &vopf -> 𝕧 - case 9443: state = 9444; break; // &vprop -> ∝ - case 9448: state = 9449; break; // &vrtri -> ⊳ - case 9452: state = 9453; break; // &Vscr -> 𝒱 - case 9456: state = 9457; break; // &vscr -> 𝓋 - case 9461: state = 9462; break; // &vsubnE -> ⫋︀ - case 9463: state = 9464; break; // &vsubne -> ⊊︀ - case 9467: state = 9468; break; // &vsupnE -> ⫌︀ - case 9469: state = 9470; break; // &vsupne -> ⊋︀ - case 9475: state = 9476; break; // &Vvdash -> ⊪ - case 9482: state = 9483; break; // &vzigzag -> ⦚ - case 9488: state = 9489; break; // &Wcirc -> Ŵ - case 9494: state = 9495; break; // &wcirc -> ŵ - case 9500: state = 9501; break; // &wedbar -> ⩟ - case 9505: state = 9506; break; // &Wedge -> ⋀ - case 9508: state = 9509; break; // &wedge -> ∧ - case 9510: state = 9511; break; // &wedgeq -> ≙ - case 9515: state = 9516; break; // &weierp -> ℘ - case 9518: state = 9519; break; // &Wfr -> 𝔚 - case 9521: state = 9522; break; // &wfr -> 𝔴 - case 9525: state = 9526; break; // &Wopf -> 𝕎 - case 9529: state = 9530; break; // &wopf -> 𝕨 - case 9531: state = 9532; break; // &wp -> ℘ - case 9533: state = 9534; break; // &wr -> ≀ - case 9538: state = 9539; break; // &wreath -> ≀ - case 9542: state = 9543; break; // &Wscr -> 𝒲 - case 9546: state = 9547; break; // &wscr -> 𝓌 - case 9551: state = 9552; break; // &xcap -> ⋂ - case 9555: state = 9556; break; // &xcirc -> ◯ - case 9558: state = 9559; break; // &xcup -> ⋃ - case 9563: state = 9564; break; // &xdtri -> ▽ - case 9567: state = 9568; break; // &Xfr -> 𝔛 - case 9570: state = 9571; break; // &xfr -> 𝔵 - case 9575: state = 9576; break; // &xhArr -> ⟺ - case 9579: state = 9580; break; // &xharr -> ⟷ - case 9581: state = 9582; break; // &Xi -> Ξ - case 9583: state = 9584; break; // &xi -> ξ - case 9588: state = 9589; break; // &xlArr -> ⟸ - case 9592: state = 9593; break; // &xlarr -> ⟵ - case 9596: state = 9597; break; // &xmap -> ⟼ - case 9600: state = 9601; break; // &xnis -> ⋻ - case 9605: state = 9606; break; // &xodot -> ⨀ - case 9609: state = 9610; break; // &Xopf -> 𝕏 - case 9612: state = 9613; break; // &xopf -> 𝕩 - case 9616: state = 9617; break; // &xoplus -> ⨁ - case 9621: state = 9622; break; // &xotime -> ⨂ - case 9626: state = 9627; break; // &xrArr -> ⟹ - case 9630: state = 9631; break; // &xrarr -> ⟶ - case 9634: state = 9635; break; // &Xscr -> 𝒳 - case 9638: state = 9639; break; // &xscr -> 𝓍 - case 9643: state = 9644; break; // &xsqcup -> ⨆ - case 9649: state = 9650; break; // &xuplus -> ⨄ - case 9653: state = 9654; break; // &xutri -> △ - case 9657: state = 9658; break; // &xvee -> ⋁ - case 9663: state = 9664; break; // &xwedge -> ⋀ - case 9670: state = 9671; break; // Ý -> Ý - case 9677: state = 9678; break; // ý -> ý - case 9681: state = 9682; break; // &YAcy -> Я - case 9683: state = 9684; break; // &yacy -> я - case 9688: state = 9689; break; // &Ycirc -> Ŷ - case 9693: state = 9694; break; // &ycirc -> ŷ - case 9695: state = 9696; break; // &Ycy -> Ы - case 9697: state = 9698; break; // &ycy -> ы - case 9700: state = 9701; break; // ¥ -> ¥ - case 9703: state = 9704; break; // &Yfr -> 𝔜 - case 9706: state = 9707; break; // &yfr -> 𝔶 - case 9710: state = 9711; break; // &YIcy -> Ї - case 9714: state = 9715; break; // &yicy -> ї - case 9718: state = 9719; break; // &Yopf -> 𝕐 - case 9722: state = 9723; break; // &yopf -> 𝕪 - case 9726: state = 9727; break; // &Yscr -> 𝒴 - case 9730: state = 9731; break; // &yscr -> 𝓎 - case 9734: state = 9735; break; // &YUcy -> Ю - case 9738: state = 9739; break; // &yucy -> ю - case 9742: state = 9743; break; // &Yuml -> Ÿ - case 9745: state = 9746; break; // ÿ -> ÿ - case 9752: state = 9753; break; // &Zacute -> Ź - case 9759: state = 9760; break; // &zacute -> ź - case 9765: state = 9766; break; // &Zcaron -> Ž - case 9771: state = 9772; break; // &zcaron -> ž - case 9773: state = 9774; break; // &Zcy -> З - case 9775: state = 9776; break; // &zcy -> з - case 9779: state = 9780; break; // &Zdot -> Ż - case 9783: state = 9784; break; // &zdot -> ż - case 9789: state = 9790; break; // &zeetrf -> ℨ - case 9803: state = 9804; break; // &ZeroWidthSpace -> ​ - case 9806: state = 9807; break; // &Zeta -> Ζ - case 9809: state = 9810; break; // &zeta -> ζ - case 9812: state = 9813; break; // &Zfr -> ℨ - case 9815: state = 9816; break; // &zfr -> 𝔷 - case 9819: state = 9820; break; // &ZHcy -> Ж - case 9823: state = 9824; break; // &zhcy -> ж - case 9830: state = 9831; break; // &zigrarr -> ⇝ - case 9834: state = 9835; break; // &Zopf -> ℤ - case 9838: state = 9839; break; // &zopf -> 𝕫 - case 9842: state = 9843; break; // &Zscr -> 𝒵 - case 9846: state = 9847; break; // &zscr -> 𝓏 - case 9849: state = 9850; break; // &zwj -> ‍ - case 9852: state = 9853; break; // &zwnj -> ‌ - default: return false; - } - break; - case 'A': - switch (state) { - case 0: state = 1; break; // & -> &A - case 1432: state = 1447; break; // &d -> &dA - case 1566: state = 1567; break; // &Diacritical -> &DiacriticalA - case 1580: state = 1581; break; // &DiacriticalDouble -> &DiacriticalDoubleA - case 1769: state = 1770; break; // &DoubleDown -> &DoubleDownA - case 1779: state = 1780; break; // &DoubleLeft -> &DoubleLeftA - case 1790: state = 1791; break; // &DoubleLeftRight -> &DoubleLeftRightA - case 1807: state = 1808; break; // &DoubleLongLeft -> &DoubleLongLeftA - case 1818: state = 1819; break; // &DoubleLongLeftRight -> &DoubleLongLeftRightA - case 1829: state = 1830; break; // &DoubleLongRight -> &DoubleLongRightA - case 1840: state = 1841; break; // &DoubleRight -> &DoubleRightA - case 1852: state = 1853; break; // &DoubleUp -> &DoubleUpA - case 1862: state = 1863; break; // &DoubleUpDown -> &DoubleUpDownA - case 1882: state = 1883; break; // &Down -> &DownA - case 1908: state = 1909; break; // &DownArrowUp -> &DownArrowUpA - case 2015: state = 2017; break; // &DownTee -> &DownTeeA - case 2616: state = 2617; break; // &For -> &ForA - case 3014: state = 3035; break; // &H -> &HA - case 3020: state = 3046; break; // &h -> &hA - case 3692: state = 3693; break; // &l -> &lA - case 3900: state = 3901; break; // &Left -> &LeftA - case 3941: state = 3942; break; // &LeftArrowRight -> &LeftArrowRightA - case 4034: state = 4035; break; // &LeftRight -> &LeftRightA - case 4094: state = 4096; break; // &LeftTee -> &LeftTeeA - case 4440: state = 4441; break; // &LongLeft -> &LongLeftA - case 4473: state = 4474; break; // &LongLeftRight -> &LongLeftRightA - case 4513: state = 4514; break; // &LongRight -> &LongRightA - case 4594: state = 4595; break; // &LowerLeft -> &LowerLeftA - case 4605: state = 4606; break; // &LowerRight -> &LowerRightA - case 5064: state = 5071; break; // &ne -> &neA - case 5227: state = 5228; break; // &nh -> &nhA - case 5256: state = 5257; break; // &nl -> &nlA - case 5855: state = 5856; break; // &nr -> &nrA - case 6084: state = 6085; break; // &nvl -> &nvlA - case 6097: state = 6098; break; // &nvr -> &nvrA - case 6111: state = 6117; break; // &nw -> &nwA - case 6876: state = 6877; break; // &r -> &rA - case 7174: state = 7175; break; // &Right -> &RightA - case 7216: state = 7217; break; // &RightArrowLeft -> &RightArrowLeftA - case 7339: state = 7341; break; // &RightTee -> &RightTeeA - case 7703: state = 7709; break; // &se -> &seA - case 7779: state = 7780; break; // &ShortDown -> &ShortDownA - case 7789: state = 7790; break; // &ShortLeft -> &ShortLeftA - case 7816: state = 7817; break; // &ShortRight -> &ShortRightA - case 7824: state = 7825; break; // &ShortUp -> &ShortUpA - case 8375: state = 8381; break; // &sw -> &swA - case 8623: state = 8624; break; // &TR -> &TRA - case 8775: state = 8785; break; // &u -> &uA - case 8970: state = 8971; break; // &Up -> &UpA - case 8997: state = 8998; break; // &UpArrowDown -> &UpArrowDownA - case 9007: state = 9008; break; // &UpDown -> &UpDownA - case 9074: state = 9075; break; // &UpperLeft -> &UpperLeftA - case 9085: state = 9086; break; // &UpperRight -> &UpperRightA - case 9110: state = 9112; break; // &UpTee -> &UpTeeA - case 9201: state = 9243; break; // &v -> &vA - case 9572: state = 9573; break; // &xh -> &xhA - case 9585: state = 9586; break; // &xl -> &xlA - case 9623: state = 9624; break; // &xr -> &xrA - case 9665: state = 9679; break; // &Y -> &YA - default: return false; - } - break; - case 'B': - switch (state) { - case 0: state = 331; break; // & -> &B - case 1876: state = 1877; break; // &DoubleVertical -> &DoubleVerticalB - case 1882: state = 1915; break; // &Down -> &DownB - case 1887: state = 1903; break; // &DownArrow -> &DownArrowB - case 1981: state = 1983; break; // &DownLeftVector -> &DownLeftVectorB - case 2007: state = 2009; break; // &DownRightVector -> &DownRightVectorB - case 3692: state = 3807; break; // &l -> &lB - case 3905: state = 3906; break; // &LeftAngle -> &LeftAngleB - case 3917: state = 3933; break; // &LeftArrow -> &LeftArrowB - case 3966: state = 3967; break; // &LeftDouble -> &LeftDoubleB - case 3992: state = 3994; break; // &LeftDownVector -> &LeftDownVectorB - case 4126: state = 4128; break; // &LeftTriangle -> &LeftTriangleB - case 4166: state = 4168; break; // &LeftUpVector -> &LeftUpVectorB - case 4177: state = 4179; break; // &LeftVector -> &LeftVectorB - case 5347: state = 5348; break; // &No -> &NoB - case 5354: state = 5355; break; // &Non -> &NonB - case 5409: state = 5410; break; // &NotDoubleVertical -> &NotDoubleVerticalB - case 5539: state = 5541; break; // &NotLeftTriangle -> &NotLeftTriangleB - case 5682: state = 5684; break; // &NotRightTriangle -> &NotRightTriangleB - case 5816: state = 5817; break; // &NotVertical -> &NotVerticalB - case 6437: state = 6438; break; // &Over -> &OverB - case 6876: state = 6991; break; // &r -> &rB - case 6886: state = 6986; break; // &R -> &RB - case 7179: state = 7180; break; // &RightAngle -> &RightAngleB - case 7191: state = 7209; break; // &RightArrow -> &RightArrowB - case 7241: state = 7242; break; // &RightDouble -> &RightDoubleB - case 7267: state = 7269; break; // &RightDownVector -> &RightDownVectorB - case 7371: state = 7373; break; // &RightTriangle -> &RightTriangleB - case 7411: state = 7413; break; // &RightUpVector -> &RightUpVectorB - case 7422: state = 7424; break; // &RightVector -> &RightVectorB - case 8919: state = 8920; break; // &Under -> &UnderB - case 8975: state = 8990; break; // &UpArrow -> &UpArrowB - case 9201: state = 9308; break; // &v -> &vB - case 9377: state = 9378; break; // &Vertical -> &VerticalB - default: return false; - } - break; - case 'C': - switch (state) { - case 0: state = 789; break; // & -> &C - case 1075: state = 1076; break; // &Clockwise -> &ClockwiseC - case 1093: state = 1094; break; // &Close -> &CloseC - case 1230: state = 1231; break; // &Counter -> &CounterC - case 1239: state = 1240; break; // &CounterClockwise -> &CounterClockwiseC - case 1316: state = 1326; break; // &Cup -> &CupC - case 1747: state = 1748; break; // &Double -> &DoubleC - case 3450: state = 3451; break; // &Invisible -> &InvisibleC - case 3900: state = 3953; break; // &Left -> &LeftC - case 5376: state = 5380; break; // &Not -> &NotC - case 5391: state = 5392; break; // &NotCup -> &NotCupC - case 6308: state = 6309; break; // &Open -> &OpenC - case 7174: state = 7228; break; // &Right -> &RightC - case 7756: state = 7757; break; // &SH -> &SHC - case 7886: state = 7887; break; // &Small -> &SmallC - default: return false; - } - break; - case 'D': - switch (state) { - case 0: state = 1425; break; // & -> &D - case 613: state = 618; break; // &box -> &boxD - case 636: state = 640; break; // &boxH -> &boxHD - case 638: state = 644; break; // &boxh -> &boxhD - case 831: state = 832; break; // &Capital -> &CapitalD - case 843: state = 844; break; // &CapitalDifferential -> &CapitalDifferentialD - case 939: state = 940; break; // &Center -> &CenterD - case 1023: state = 1024; break; // &Circle -> &CircleD - case 1098: state = 1099; break; // &CloseCurly -> &CloseCurlyD - case 1425: state = 1490; break; // &D -> &DD - case 1566: state = 1573; break; // &Diacritical -> &DiacriticalD - case 1630: state = 1631; break; // &Differential -> &DifferentialD - case 1692: state = 1696; break; // &Dot -> &DotD - case 1747: state = 1764; break; // &Double -> &DoubleD - case 1852: state = 1859; break; // &DoubleUp -> &DoubleUpD - case 2115: state = 2157; break; // &e -> &eD - case 2157: state = 2158; break; // &eD -> &eDD - case 2175: state = 2176; break; // &ef -> &efD - case 2397: state = 2399; break; // &equiv -> &equivD - case 2399: state = 2400; break; // &equivD -> &equivDD - case 2409: state = 2414; break; // &er -> &erD - case 3036: state = 3037; break; // &HAR -> &HARD - case 3209: state = 3210; break; // &Hump -> &HumpD - case 3900: state = 3961; break; // &Left -> &LeftD - case 4139: state = 4140; break; // &LeftUp -> &LeftUpD - case 4767: state = 4825; break; // &m -> &mD - case 4825: state = 4826; break; // &mD -> &mDD - case 5376: state = 5396; break; // &Not -> &NotD - case 5496: state = 5497; break; // &NotHump -> &NotHumpD - case 6043: state = 6058; break; // &nv -> &nvD - case 6047: state = 6048; break; // &nV -> &nVD - case 6313: state = 6314; break; // &OpenCurly -> &OpenCurlyD - case 6488: state = 6489; break; // &Partial -> &PartialD - case 7174: state = 7236; break; // &Right -> &RightD - case 7384: state = 7385; break; // &RightUp -> &RightUpD - case 7592: state = 7593; break; // &Rule -> &RuleD - case 7775: state = 7776; break; // &Short -> &ShortD - case 8624: state = 8625; break; // &TRA -> &TRAD - case 8680: state = 8681; break; // &Triple -> &TripleD - case 8970: state = 9004; break; // &Up -> &UpD - case 8975: state = 8994; break; // &UpArrow -> &UpArrowD - case 9201: state = 9330; break; // &v -> &vD - case 9303: state = 9320; break; // &V -> &VD - default: return false; - } - break; - case 'E': - switch (state) { - case 0: state = 2108; break; // & -> &E - case 1: state = 50; break; // &A -> &AE - case 27: state = 31; break; // &ac -> &acE - case 199: state = 206; break; // &ap -> &apE - case 775: state = 777; break; // &bump -> &bumpE - case 979: state = 1049; break; // &cir -> &cirE - case 1692: state = 1707; break; // &Dot -> &DotE - case 2490: state = 2491; break; // &Exponential -> &ExponentialE - case 2701: state = 2763; break; // &g -> &gE - case 2824: state = 2828; break; // &gl -> &glE - case 2832: state = 2841; break; // &gn -> &gnE - case 2871: state = 2872; break; // &Greater -> &GreaterE - case 2886: state = 2887; break; // &GreaterFull -> &GreaterFullE - case 2910: state = 2911; break; // &GreaterSlant -> &GreaterSlantE - case 3011: state = 3012; break; // &gvn -> &gvnE - case 3209: state = 3219; break; // &Hump -> &HumpE - case 3236: state = 3269; break; // &I -> &IE - case 3512: state = 3518; break; // &isin -> &isinE - case 3692: state = 3894; break; // &l -> &lE - case 4126: state = 4132; break; // &LeftTriangle -> &LeftTriangleE - case 4239: state = 4240; break; // &Less -> &LessE - case 4256: state = 4257; break; // &LessFull -> &LessFullE - case 4288: state = 4289; break; // &LessSlant -> &LessSlantE - case 4317: state = 4319; break; // &lg -> &lgE - case 4401: state = 4410; break; // &ln -> &lnE - case 4764: state = 4765; break; // &lvn -> &lvnE - case 4986: state = 4988; break; // &nap -> &napE - case 5195: state = 5196; break; // &ng -> &ngE - case 5256: state = 5268; break; // &nl -> &nlE - case 5376: state = 5414; break; // &Not -> &NotE - case 5445: state = 5447; break; // &NotGreater -> &NotGreaterE - case 5456: state = 5457; break; // &NotGreaterFull -> &NotGreaterFullE - case 5480: state = 5481; break; // &NotGreaterSlant -> &NotGreaterSlantE - case 5496: state = 5506; break; // &NotHump -> &NotHumpE - case 5513: state = 5519; break; // ¬in -> ¬inE - case 5539: state = 5545; break; // &NotLeftTriangle -> &NotLeftTriangleE - case 5552: state = 5554; break; // &NotLess -> &NotLessE - case 5577: state = 5578; break; // &NotLessSlant -> &NotLessSlantE - case 5637: state = 5639; break; // &NotPrecedes -> &NotPrecedesE - case 5649: state = 5650; break; // &NotPrecedesSlant -> &NotPrecedesSlantE - case 5662: state = 5663; break; // &NotReverse -> &NotReverseE - case 5682: state = 5688; break; // &NotRightTriangle -> &NotRightTriangleE - case 5705: state = 5707; break; // &NotSquareSubset -> &NotSquareSubsetE - case 5718: state = 5720; break; // &NotSquareSuperset -> &NotSquareSupersetE - case 5730: state = 5732; break; // &NotSubset -> &NotSubsetE - case 5743: state = 5745; break; // &NotSucceeds -> &NotSucceedsE - case 5755: state = 5756; break; // &NotSucceedsSlant -> &NotSucceedsSlantE - case 5773: state = 5775; break; // &NotSuperset -> &NotSupersetE - case 5785: state = 5787; break; // &NotTilde -> &NotTildeE - case 5796: state = 5797; break; // &NotTildeFull -> &NotTildeFullE - case 5952: state = 5954; break; // &nsub -> &nsubE - case 5973: state = 5975; break; // &nsup -> &nsupE - case 6131: state = 6190; break; // &O -> &OE - case 6642: state = 6651; break; // &pr -> &prE - case 6677: state = 6679; break; // &Precedes -> &PrecedesE - case 6689: state = 6690; break; // &PrecedesSlant -> &PrecedesSlantE - case 6735: state = 6739; break; // &prn -> &prnE - case 6886: state = 7092; break; // &R -> &RE - case 7101: state = 7102; break; // &Reverse -> &ReverseE - case 7122: state = 7123; break; // &ReverseUp -> &ReverseUpE - case 7371: state = 7377; break; // &RightTriangle -> &RightTriangleE - case 7631: state = 7649; break; // &sc -> &scE - case 7670: state = 7674; break; // &scn -> &scnE - case 7857: state = 7859; break; // &simg -> &simgE - case 7861: state = 7863; break; // &siml -> &simlE - case 8037: state = 8039; break; // &SquareSubset -> &SquareSubsetE - case 8050: state = 8052; break; // &SquareSuperset -> &SquareSupersetE - case 8131: state = 8137; break; // &sub -> &subE - case 8150: state = 8151; break; // &subn -> &subnE - case 8167: state = 8178; break; // &Subset -> &SubsetE - case 8221: state = 8223; break; // &Succeeds -> &SucceedsE - case 8233: state = 8234; break; // &SucceedsSlant -> &SucceedsSlantE - case 8284: state = 8300; break; // &sup -> &supE - case 8312: state = 8314; break; // &Superset -> &SupersetE - case 8338: state = 8339; break; // &supn -> &supnE - case 8547: state = 8554; break; // &Tilde -> &TildeE - case 8563: state = 8564; break; // &TildeFull -> &TildeFullE - case 8625: state = 8626; break; // &TRAD -> &TRADE - case 8970: state = 9034; break; // &Up -> &UpE - case 9460: state = 9461; break; // &vsubn -> &vsubnE - case 9466: state = 9467; break; // &vsupn -> &vsupnE - default: return false; - } - break; - case 'F': - switch (state) { - case 0: state = 2517; break; // & -> &F - case 219: state = 220; break; // &Apply -> &ApplyF - case 2871: state = 2883; break; // &Greater -> &GreaterF - case 3900: state = 3998; break; // &Left -> &LeftF - case 4239: state = 4253; break; // &Less -> &LessF - case 5445: state = 5453; break; // &NotGreater -> &NotGreaterF - case 5785: state = 5793; break; // &NotTilde -> &NotTildeF - case 7174: state = 7273; break; // &Right -> &RightF - case 7930: state = 7931; break; // &SO -> &SOF - case 8547: state = 8560; break; // &Tilde -> &TildeF - default: return false; - } - break; - case 'G': - switch (state) { - case 0: state = 2708; break; // & -> &G - case 1566: state = 1587; break; // &Diacritical -> &DiacriticalG - case 2287: state = 2288; break; // &EN -> &ENG - case 2871: state = 2893; break; // &Greater -> &GreaterG - case 4239: state = 4263; break; // &Less -> &LessG - case 4244: state = 4245; break; // &LessEqual -> &LessEqualG - case 4965: state = 5212; break; // &n -> &nG - case 5151: state = 5152; break; // &Nested -> &NestedG - case 5158: state = 5159; break; // &NestedGreater -> &NestedGreaterG - case 5376: state = 5439; break; // &Not -> &NotG - case 5445: state = 5463; break; // &NotGreater -> &NotGreaterG - case 5552: state = 5560; break; // &NotLess -> &NotLessG - case 5595: state = 5596; break; // &NotNested -> &NotNestedG - case 5602: state = 5603; break; // &NotNestedGreater -> &NotNestedGreaterG - case 7092: state = 7093; break; // &RE -> ® - default: return false; - } - break; - case 'H': - switch (state) { - case 0: state = 3014; break; // & -> &H - case 613: state = 636; break; // &box -> &boxH - case 691: state = 695; break; // &boxV -> &boxVH - case 693: state = 699; break; // &boxv -> &boxvH - case 789: state = 956; break; // &C -> &CH - case 1432: state = 1546; break; // &d -> &dH - case 2442: state = 2443; break; // &ET -> Ð - case 3213: state = 3214; break; // &HumpDown -> &HumpDownH - case 3618: state = 3660; break; // &K -> &KH - case 3692: state = 4321; break; // &l -> &lH - case 5376: state = 5493; break; // &Not -> &NotH - case 5500: state = 5501; break; // &NotHumpDown -> &NotHumpDownH - case 6043: state = 6073; break; // &nv -> &nvH - case 6876: state = 7151; break; // &r -> &rH - case 7610: state = 7756; break; // &S -> &SH - case 7757: state = 7758; break; // &SHC -> &SHCH - case 8400: state = 8535; break; // &T -> &TH - case 8713: state = 8719; break; // &TS -> &TSH - case 8775: state = 8872; break; // &u -> &uH - case 9747: state = 9817; break; // &Z -> &ZH - default: return false; - } - break; - case 'I': - switch (state) { - case 0: state = 3236; break; // & -> &I - case 1082: state = 1083; break; // &ClockwiseContour -> &ClockwiseContourI - case 1190: state = 1191; break; // &Contour -> &ContourI - case 1246: state = 1247; break; // &CounterClockwiseContour -> &CounterClockwiseContourI - case 1754: state = 1755; break; // &DoubleContour -> &DoubleContourI - case 3349: state = 3350; break; // &Imaginary -> &ImaginaryI - case 7503: state = 7504; break; // &Round -> &RoundI - case 8013: state = 8019; break; // &Square -> &SquareI - case 9665: state = 9708; break; // &Y -> &YI - default: return false; - } - break; - case 'J': - switch (state) { - case 0: state = 3555; break; // & -> &J - case 1425: state = 1661; break; // &D -> &DJ - case 2708: state = 2816; break; // &G -> &GJ - case 3236: state = 3320; break; // &I -> &IJ - case 3618: state = 3668; break; // &K -> &KJ - case 3698: state = 4338; break; // &L -> &LJ - case 4971: state = 5248; break; // &N -> &NJ - default: return false; - } - break; - case 'K': - switch (state) { - case 0: state = 3618; break; // & -> &K - default: return false; - } - break; - case 'L': - switch (state) { - case 0: state = 3698; break; // & -> &L - case 618: state = 619; break; // &boxD -> &boxDL - case 623: state = 624; break; // &boxd -> &boxdL - case 673: state = 674; break; // &boxU -> &boxUL - case 678: state = 679; break; // &boxu -> &boxuL - case 691: state = 703; break; // &boxV -> &boxVL - case 693: state = 707; break; // &boxv -> &boxvL - case 1747: state = 1776; break; // &Double -> &DoubleL - case 1803: state = 1804; break; // &DoubleLong -> &DoubleLongL - case 1882: state = 1950; break; // &Down -> &DownL - case 2871: state = 2901; break; // &Greater -> &GreaterL - case 2876: state = 2878; break; // &GreaterEqual -> &GreaterEqualL - case 3178: state = 3179; break; // &Horizontal -> &HorizontalL - case 4239: state = 4275; break; // &Less -> &LessL - case 4436: state = 4437; break; // &Long -> &LongL - case 4590: state = 4591; break; // &Lower -> &LowerL - case 4965: state = 5272; break; // &n -> &nL - case 5151: state = 5167; break; // &Nested -> &NestedL - case 5170: state = 5171; break; // &NestedLess -> &NestedLessL - case 5176: state = 5177; break; // &New -> &NewL - case 5376: state = 5528; break; // &Not -> &NotL - case 5445: state = 5471; break; // &NotGreater -> &NotGreaterL - case 5552: state = 5568; break; // &NotLess -> &NotLessL - case 5595: state = 5611; break; // &NotNested -> &NotNestedL - case 5614: state = 5615; break; // &NotNestedLess -> &NotNestedLessL - case 7191: state = 7213; break; // &RightArrow -> &RightArrowL - case 7775: state = 7786; break; // &Short -> &ShortL - case 9070: state = 9071; break; // &Upper -> &UpperL - case 9377: state = 9382; break; // &Vertical -> &VerticalL - default: return false; - } - break; - case 'M': - switch (state) { - case 0: state = 4781; break; // & -> &M - case 1: state = 111; break; // &A -> &AM - case 1023: state = 1032; break; // &Circle -> &CircleM - case 5090: state = 5091; break; // &Negative -> &NegativeM - case 6589: state = 6590; break; // &Plus -> &PlusM - default: return false; - } - break; - case 'N': - switch (state) { - case 0: state = 4971; break; // & -> &N - case 301: state = 587; break; // &b -> &bN - case 2108: state = 2287; break; // &E -> &EN - case 5376: state = 5590; break; // &Not -> &NotN - case 8537: state = 8538; break; // &THOR -> Þ - default: return false; - } - break; - case 'O': - switch (state) { - case 0: state = 6131; break; // & -> &O - case 789: state = 1217; break; // &C -> &CO - case 3236: state = 3463; break; // &I -> &IO - case 6869: state = 6870; break; // &QU -> &QUO - case 7610: state = 7930; break; // &S -> &SO - case 8535: state = 8536; break; // &TH -> &THO - default: return false; - } - break; - case 'P': - switch (state) { - case 0: state = 6482; break; // & -> &P - case 111: state = 112; break; // &AM -> & - case 1023: state = 1038; break; // &Circle -> &CircleP - case 1217: state = 1218; break; // &CO -> &COP - case 2954: state = 2955; break; // >l -> >lP - case 4731: state = 4738; break; // <r -> <rP - case 4903: state = 4904; break; // &Minus -> &MinusP - case 5376: state = 5630; break; // &Not -> &NotP - case 6437: state = 6451; break; // &Over -> &OverP - case 8919: state = 8933; break; // &Under -> &UnderP - case 8947: state = 8949; break; // &Union -> &UnionP - default: return false; - } - break; - case 'Q': - switch (state) { - case 0: state = 6813; break; // & -> &Q - case 1098: state = 1111; break; // &CloseCurly -> &CloseCurlyQ - case 1104: state = 1105; break; // &CloseCurlyDouble -> &CloseCurlyDoubleQ - case 6313: state = 6326; break; // &OpenCurly -> &OpenCurlyQ - case 6319: state = 6320; break; // &OpenCurlyDouble -> &OpenCurlyDoubleQ - default: return false; - } - break; - case 'R': - switch (state) { - case 0: state = 6886; break; // & -> &R - case 618: state = 628; break; // &boxD -> &boxDR - case 623: state = 632; break; // &boxd -> &boxdR - case 673: state = 683; break; // &boxU -> &boxUR - case 678: state = 687; break; // &boxu -> &boxuR - case 691: state = 711; break; // &boxV -> &boxVR - case 693: state = 715; break; // &boxv -> &boxvR - case 1004: state = 1028; break; // &circled -> &circledR - case 1747: state = 1836; break; // &Double -> &DoubleR - case 1779: state = 1786; break; // &DoubleLeft -> &DoubleLeftR - case 1803: state = 1825; break; // &DoubleLong -> &DoubleLongR - case 1807: state = 1814; break; // &DoubleLongLeft -> &DoubleLongLeftR - case 1882: state = 1987; break; // &Down -> &DownR - case 1953: state = 1954; break; // &DownLeft -> &DownLeftR - case 3035: state = 3036; break; // &HA -> &HAR - case 3900: state = 4030; break; // &Left -> &LeftR - case 3917: state = 3937; break; // &LeftArrow -> &LeftArrowR - case 4436: state = 4509; break; // &Long -> &LongR - case 4440: state = 4469; break; // &LongLeft -> &LongLeftR - case 4590: state = 4601; break; // &Lower -> &LowerR - case 4965: state = 5868; break; // &n -> &nR - case 5376: state = 5656; break; // &Not -> &NotR - case 7775: state = 7812; break; // &Short -> &ShortR - case 8400: state = 8623; break; // &T -> &TR - case 8536: state = 8537; break; // &THO -> &THOR - case 9070: state = 9081; break; // &Upper -> &UpperR - default: return false; - } - break; - case 'S': - switch (state) { - case 0: state = 7610; break; // & -> &S - case 1004: state = 1030; break; // &circled -> &circledS - case 1425: state = 2048; break; // &D -> &DS - case 2248: state = 2249; break; // &Empty -> &EmptyS - case 2253: state = 2254; break; // &EmptySmall -> &EmptySmallS - case 2266: state = 2267; break; // &EmptyVery -> &EmptyVeryS - case 2271: state = 2272; break; // &EmptyVerySmall -> &EmptyVerySmallS - case 2558: state = 2559; break; // &Filled -> &FilledS - case 2563: state = 2564; break; // &FilledSmall -> &FilledSmallS - case 2574: state = 2575; break; // &FilledVery -> &FilledVeryS - case 2579: state = 2580; break; // &FilledVerySmall -> &FilledVerySmallS - case 2871: state = 2906; break; // &Greater -> &GreaterS - case 3105: state = 3106; break; // &Hilbert -> &HilbertS - case 4239: state = 4284; break; // &Less -> &LessS - case 4847: state = 4848; break; // &Medium -> &MediumS - case 5096: state = 5097; break; // &NegativeMedium -> &NegativeMediumS - case 5107: state = 5108; break; // &NegativeThick -> &NegativeThickS - case 5114: state = 5115; break; // &NegativeThin -> &NegativeThinS - case 5128: state = 5129; break; // &NegativeVeryThin -> &NegativeVeryThinS - case 5362: state = 5363; break; // &NonBreaking -> &NonBreakingS - case 5376: state = 5694; break; // &Not -> &NotS - case 5445: state = 5476; break; // &NotGreater -> &NotGreaterS - case 5552: state = 5573; break; // &NotLess -> &NotLessS - case 5637: state = 5645; break; // &NotPrecedes -> &NotPrecedesS - case 5699: state = 5700; break; // &NotSquare -> &NotSquareS - case 5743: state = 5751; break; // &NotSucceeds -> &NotSucceedsS - case 6138: state = 6376; break; // &o -> &oS - case 6677: state = 6685; break; // &Precedes -> &PrecedesS - case 8013: state = 8032; break; // &Square -> &SquareS - case 8221: state = 8229; break; // &Succeeds -> &SucceedsS - case 8400: state = 8713; break; // &T -> &TS - case 8509: state = 8510; break; // &Thick -> &ThickS - case 8520: state = 8521; break; // &Thin -> &ThinS - case 9377: state = 9387; break; // &Vertical -> &VerticalS - case 9407: state = 9408; break; // &VeryThin -> &VeryThinS - case 9798: state = 9799; break; // &ZeroWidth -> &ZeroWidthS - default: return false; - } - break; - case 'T': - switch (state) { - case 0: state = 8400; break; // & -> &T - case 1023: state = 1043; break; // &Circle -> &CircleT - case 1566: state = 1593; break; // &Diacritical -> &DiacriticalT - case 1779: state = 1797; break; // &DoubleLeft -> &DoubleLeftT - case 1840: state = 1847; break; // &DoubleRight -> &DoubleRightT - case 1882: state = 2013; break; // &Down -> &DownT - case 1953: state = 1966; break; // &DownLeft -> &DownLeftT - case 1991: state = 1992; break; // &DownRight -> &DownRightT - case 2108: state = 2442; break; // &E -> &ET - case 2370: state = 2377; break; // &Equal -> &EqualT - case 2708: state = 2938; break; // &G -> > - case 2871: state = 2917; break; // &Greater -> &GreaterT - case 3450: state = 3457; break; // &Invisible -> &InvisibleT - case 3698: state = 4694; break; // &L -> < - case 3900: state = 4092; break; // &Left -> &LeftT - case 3976: state = 3977; break; // &LeftDown -> &LeftDownT - case 4139: state = 4151; break; // &LeftUp -> &LeftUpT - case 4239: state = 4295; break; // &Less -> &LessT - case 5090: state = 5103; break; // &Negative -> &NegativeT - case 5124: state = 5125; break; // &NegativeVery -> &NegativeVeryT - case 5376: state = 5781; break; // &Not -> &NotT - case 5425: state = 5427; break; // &NotEqual -> &NotEqualT - case 5445: state = 5487; break; // &NotGreater -> &NotGreaterT - case 5531: state = 5532; break; // &NotLeft -> &NotLeftT - case 5552: state = 5584; break; // &NotLess -> &NotLessT - case 5674: state = 5675; break; // &NotRight -> &NotRightT - case 5743: state = 5762; break; // &NotSucceeds -> &NotSucceedsT - case 5785: state = 5803; break; // &NotTilde -> &NotTildeT - case 6677: state = 6696; break; // &Precedes -> &PrecedesT - case 6870: state = 6871; break; // &QUO -> " - case 7174: state = 7337; break; // &Right -> &RightT - case 7251: state = 7252; break; // &RightDown -> &RightDownT - case 7384: state = 7396; break; // &RightUp -> &RightUpT - case 7931: state = 7932; break; // &SOF -> &SOFT - case 8221: state = 8240; break; // &Succeeds -> &SucceedsT - case 8269: state = 8270; break; // &Such -> &SuchT - case 8547: state = 8570; break; // &Tilde -> &TildeT - case 8970: state = 9108; break; // &Up -> &UpT - case 9377: state = 9397; break; // &Vertical -> &VerticalT - case 9403: state = 9404; break; // &Very -> &VeryT - default: return false; - } - break; - case 'U': - switch (state) { - case 0: state = 8768; break; // & -> &U - case 613: state = 673; break; // &box -> &boxU - case 636: state = 648; break; // &boxH -> &boxHU - case 638: state = 652; break; // &boxh -> &boxhU - case 1747: state = 1851; break; // &Double -> &DoubleU - case 1887: state = 1907; break; // &DownArrow -> &DownArrowU - case 3900: state = 4138; break; // &Left -> &LeftU - case 6813: state = 6869; break; // &Q -> &QU - case 7101: state = 7121; break; // &Reverse -> &ReverseU - case 7174: state = 7383; break; // &Right -> &RightU - case 7775: state = 7823; break; // &Short -> &ShortU - case 8013: state = 8058; break; // &Square -> &SquareU - case 9665: state = 9732; break; // &Y -> &YU - default: return false; - } - break; - case 'V': - switch (state) { - case 0: state = 9303; break; // & -> &V - case 613: state = 691; break; // &box -> &boxV - case 1747: state = 1869; break; // &Double -> &DoubleV - case 1953: state = 1976; break; // &DownLeft -> &DownLeftV - case 1958: state = 1959; break; // &DownLeftRight -> &DownLeftRightV - case 1968: state = 1969; break; // &DownLeftTee -> &DownLeftTeeV - case 1991: state = 2002; break; // &DownRight -> &DownRightV - case 1994: state = 1995; break; // &DownRightTee -> &DownRightTeeV - case 2248: state = 2263; break; // &Empty -> &EmptyV - case 2558: state = 2571; break; // &Filled -> &FilledV - case 3900: state = 4172; break; // &Left -> &LeftV - case 3976: state = 3987; break; // &LeftDown -> &LeftDownV - case 3979: state = 3980; break; // &LeftDownTee -> &LeftDownTeeV - case 4034: state = 4085; break; // &LeftRight -> &LeftRightV - case 4094: state = 4102; break; // &LeftTee -> &LeftTeeV - case 4139: state = 4161; break; // &LeftUp -> &LeftUpV - case 4143: state = 4144; break; // &LeftUpDown -> &LeftUpDownV - case 4153: state = 4154; break; // &LeftUpTee -> &LeftUpTeeV - case 4965: state = 6047; break; // &n -> &nV - case 5090: state = 5121; break; // &Negative -> &NegativeV - case 5376: state = 5809; break; // &Not -> &NotV - case 5401: state = 5402; break; // &NotDouble -> &NotDoubleV - case 7174: state = 7417; break; // &Right -> &RightV - case 7251: state = 7262; break; // &RightDown -> &RightDownV - case 7254: state = 7255; break; // &RightDownTee -> &RightDownTeeV - case 7339: state = 7347; break; // &RightTee -> &RightTeeV - case 7384: state = 7406; break; // &RightUp -> &RightUpV - case 7388: state = 7389; break; // &RightUpDown -> &RightUpDownV - case 7398: state = 7399; break; // &RightUpTee -> &RightUpTeeV - default: return false; - } - break; - case 'W': - switch (state) { - case 0: state = 9484; break; // & -> &W - case 9793: state = 9794; break; // &Zero -> &ZeroW - default: return false; - } - break; - case 'X': - switch (state) { - case 0: state = 9565; break; // & -> &X - default: return false; - } - break; - case 'Y': - switch (state) { - case 0: state = 9665; break; // & -> &Y - case 1218: state = 1219; break; // &COP -> © - default: return false; - } - break; - case 'Z': - switch (state) { - case 0: state = 9747; break; // & -> &Z - case 1425: state = 2093; break; // &D -> &DZ - default: return false; - } - break; - case 'a': - switch (state) { - case 0: state = 8; break; // & -> &a - case 1: state = 2; break; // &A -> &Aa - case 8: state = 9; break; // &a -> &aa - case 68: state = 69; break; // &Agr -> &Agra - case 74: state = 75; break; // &agr -> &agra - case 91: state = 92; break; // &Alph -> &Alpha - case 95: state = 96; break; // &alph -> &alpha - case 98: state = 99; break; // &Am -> &Ama - case 103: state = 104; break; // &am -> &ama - case 120: state = 122; break; // &and -> &anda - case 145: state = 147; break; // &angmsd -> &angmsda - case 147: state = 148; break; // &angmsda -> &angmsdaa - case 178: state = 179; break; // &angz -> &angza - case 199: state = 201; break; // &ap -> &apa - case 301: state = 302; break; // &b -> &ba - case 331: state = 332; break; // &B -> &Ba - case 336: state = 337; break; // &Backsl -> &Backsla - case 385: state = 386; break; // &bec -> &beca - case 391: state = 392; break; // &Bec -> &Beca - case 423: state = 424; break; // &Bet -> &Beta - case 426: state = 427; break; // &bet -> &beta - case 444: state = 445; break; // &bigc -> &bigca - case 477: state = 478; break; // &bigst -> &bigsta - case 483: state = 484; break; // &bigtri -> &bigtria - case 513: state = 514; break; // &bk -> &bka - case 519: state = 520; break; // &bl -> &bla - case 533: state = 534; break; // &blacksqu -> &blacksqua - case 540: state = 541; break; // &blacktri -> &blacktria - case 736: state = 737; break; // &brvb -> &brvba - case 789: state = 790; break; // &C -> &Ca - case 796: state = 797; break; // &c -> &ca - case 805: state = 807; break; // &cap -> &capa - case 817: state = 818; break; // &capc -> &capca - case 829: state = 830; break; // &Capit -> &Capita - case 841: state = 842; break; // &CapitalDifferenti -> &CapitalDifferentia - case 861: state = 862; break; // &cc -> &cca - case 866: state = 867; break; // &Cc -> &Cca - case 924: state = 925; break; // &Cedill -> &Cedilla - case 968: state = 969; break; // &checkm -> &checkma - case 987: state = 988; break; // &circle -> &circlea - case 1004: state = 1005; break; // &circled -> &circleda - case 1014: state = 1015; break; // &circledd -> &circledda - case 1088: state = 1089; break; // &ClockwiseContourIntegr -> &ClockwiseContourIntegra - case 1143: state = 1144; break; // &comm -> &comma - case 1196: state = 1197; break; // &ContourIntegr -> &ContourIntegra - case 1252: state = 1253; break; // &CounterClockwiseContourIntegr -> &CounterClockwiseContourIntegra - case 1256: state = 1257; break; // &cr -> &cra - case 1293: state = 1294; break; // &cud -> &cuda - case 1308: state = 1309; break; // &cul -> &cula - case 1322: state = 1323; break; // &cupbrc -> &cupbrca - case 1326: state = 1327; break; // &CupC -> &CupCa - case 1330: state = 1331; break; // &cupc -> &cupca - case 1346: state = 1347; break; // &cur -> &cura - case 1382: state = 1383; break; // &curve -> &curvea - case 1425: state = 1426; break; // &D -> &Da - case 1432: state = 1433; break; // &d -> &da - case 1464: state = 1465; break; // &dbk -> &dbka - case 1470: state = 1471; break; // &dbl -> &dbla - case 1474: state = 1475; break; // &Dc -> &Dca - case 1480: state = 1481; break; // &dc -> &dca - case 1492: state = 1494; break; // &dd -> &dda - case 1505: state = 1506; break; // &DDotr -> &DDotra - case 1522: state = 1523; break; // &Delt -> &Delta - case 1526: state = 1527; break; // &delt -> &delta - case 1546: state = 1547; break; // &dH -> &dHa - case 1550: state = 1551; break; // &dh -> &dha - case 1557: state = 1558; break; // &Di -> &Dia - case 1564: state = 1565; break; // &Diacritic -> &Diacritica - case 1588: state = 1589; break; // &DiacriticalGr -> &DiacriticalGra - case 1599: state = 1600; break; // &di -> &dia - case 1628: state = 1629; break; // &Differenti -> &Differentia - case 1633: state = 1634; break; // &dig -> &diga - case 1636: state = 1637; break; // &digamm -> &digamma - case 1681: state = 1682; break; // &doll -> &dolla - case 1709: state = 1710; break; // &DotEqu -> &DotEqua - case 1726: state = 1727; break; // &dotsqu -> &dotsqua - case 1735: state = 1736; break; // &doubleb -> &doubleba - case 1760: state = 1761; break; // &DoubleContourIntegr -> &DoubleContourIntegra - case 1874: state = 1875; break; // &DoubleVertic -> &DoubleVertica - case 1877: state = 1878; break; // &DoubleVerticalB -> &DoubleVerticalBa - case 1882: state = 1889; break; // &Down -> &Downa - case 1896: state = 1897; break; // &down -> &downa - case 1903: state = 1904; break; // &DownArrowB -> &DownArrowBa - case 1924: state = 1925; break; // &downdown -> &downdowna - case 1932: state = 1933; break; // &downh -> &downha - case 1983: state = 1984; break; // &DownLeftVectorB -> &DownLeftVectorBa - case 2009: state = 2010; break; // &DownRightVectorB -> &DownRightVectorBa - case 2025: state = 2026; break; // &drbk -> &drbka - case 2077: state = 2078; break; // &du -> &dua - case 2082: state = 2083; break; // &duh -> &duha - case 2086: state = 2087; break; // &dw -> &dwa - case 2103: state = 2104; break; // &dzigr -> &dzigra - case 2108: state = 2109; break; // &E -> &Ea - case 2115: state = 2116; break; // &e -> &ea - case 2127: state = 2128; break; // &Ec -> &Eca - case 2133: state = 2134; break; // &ec -> &eca - case 2188: state = 2189; break; // &Egr -> &Egra - case 2193: state = 2194; break; // &egr -> &egra - case 2228: state = 2229; break; // &Em -> &Ema - case 2233: state = 2234; break; // &em -> &ema - case 2250: state = 2251; break; // &EmptySm -> &EmptySma - case 2256: state = 2257; break; // &EmptySmallSqu -> &EmptySmallSqua - case 2268: state = 2269; break; // &EmptyVerySm -> &EmptyVerySma - case 2274: state = 2275; break; // &EmptyVerySmallSqu -> &EmptyVerySmallSqua - case 2312: state = 2313; break; // &ep -> &epa - case 2354: state = 2355; break; // &eqsl -> &eqsla - case 2368: state = 2369; break; // &Equ -> &Equa - case 2372: state = 2373; break; // &equ -> &equa - case 2403: state = 2404; break; // &eqvp -> &eqvpa - case 2409: state = 2410; break; // &er -> &era - case 2436: state = 2437; break; // &Et -> &Eta - case 2439: state = 2440; break; // &et -> &eta - case 2475: state = 2476; break; // &expect -> &expecta - case 2488: state = 2489; break; // &Exponenti -> &Exponentia - case 2498: state = 2499; break; // &exponenti -> &exponentia - case 2503: state = 2504; break; // &f -> &fa - case 2525: state = 2526; break; // &fem -> &fema - case 2560: state = 2561; break; // &FilledSm -> &FilledSma - case 2566: state = 2567; break; // &FilledSmallSqu -> &FilledSmallSqua - case 2576: state = 2577; break; // &FilledVerySm -> &FilledVerySma - case 2582: state = 2583; break; // &FilledVerySmallSqu -> &FilledVerySmallSqua - case 2592: state = 2593; break; // &fl -> &fla - case 2621: state = 2622; break; // &for -> &fora - case 2639: state = 2640; break; // &fp -> &fpa - case 2647: state = 2648; break; // &fr -> &fra - case 2701: state = 2702; break; // &g -> &ga - case 2708: state = 2709; break; // &G -> &Ga - case 2711: state = 2712; break; // &Gamm -> &Gamma - case 2715: state = 2716; break; // &gamm -> &gamma - case 2776: state = 2777; break; // &geqsl -> &geqsla - case 2824: state = 2826; break; // &gl -> &gla - case 2832: state = 2833; break; // &gn -> &gna - case 2861: state = 2862; break; // &gr -> &gra - case 2867: state = 2868; break; // &Gre -> &Grea - case 2874: state = 2875; break; // &GreaterEqu -> &GreaterEqua - case 2889: state = 2890; break; // &GreaterFullEqu -> &GreaterFullEqua - case 2895: state = 2896; break; // &GreaterGre -> &GreaterGrea - case 2907: state = 2908; break; // &GreaterSl -> &GreaterSla - case 2913: state = 2914; break; // &GreaterSlantEqu -> &GreaterSlantEqua - case 2955: state = 2956; break; // >lP -> >lPa - case 2965: state = 2966; break; // >r -> >ra - case 3014: state = 3015; break; // &H -> &Ha - case 3020: state = 3021; break; // &h -> &ha - case 3060: state = 3061; break; // &hb -> &hba - case 3074: state = 3075; break; // &he -> &hea - case 3107: state = 3108; break; // &HilbertSp -> &HilbertSpa - case 3114: state = 3115; break; // &hkse -> &hksea - case 3120: state = 3121; break; // &hksw -> &hkswa - case 3126: state = 3127; break; // &ho -> &hoa - case 3141: state = 3142; break; // &hookleft -> &hooklefta - case 3152: state = 3153; break; // &hookright -> &hookrighta - case 3167: state = 3168; break; // &horb -> &horba - case 3176: state = 3177; break; // &Horizont -> &Horizonta - case 3192: state = 3193; break; // &hsl -> &hsla - case 3221: state = 3222; break; // &HumpEqu -> &HumpEqua - case 3236: state = 3237; break; // &I -> &Ia - case 3243: state = 3244; break; // &i -> &ia - case 3290: state = 3291; break; // &Igr -> &Igra - case 3296: state = 3297; break; // &igr -> &igra - case 3317: state = 3318; break; // &iiot -> &iiota - case 3330: state = 3332; break; // &Im -> &Ima - case 3336: state = 3337; break; // &im -> &ima - case 3346: state = 3347; break; // &Imagin -> &Imagina - case 3357: state = 3358; break; // &imagp -> &imagpa - case 3380: state = 3381; break; // &inc -> &inca - case 3403: state = 3404; break; // &intc -> &intca - case 3415: state = 3416; break; // &Integr -> &Integra - case 3420: state = 3421; break; // &interc -> &interca - case 3433: state = 3434; break; // &intl -> &intla - case 3454: state = 3455; break; // &InvisibleComm -> &InvisibleComma - case 3486: state = 3487; break; // &Iot -> &Iota - case 3489: state = 3490; break; // &iot -> &iota - case 3577: state = 3578; break; // &jm -> &jma - case 3618: state = 3619; break; // &K -> &Ka - case 3621: state = 3622; break; // &Kapp -> &Kappa - case 3624: state = 3625; break; // &k -> &ka - case 3627: state = 3628; break; // &kapp -> &kappa - case 3692: state = 3705; break; // &l -> &la - case 3693: state = 3694; break; // &lA -> &lAa - case 3698: state = 3699; break; // &L -> &La - case 3719: state = 3720; break; // &lagr -> &lagra - case 3725: state = 3726; break; // &Lambd -> &Lambda - case 3730: state = 3731; break; // &lambd -> &lambda - case 3747: state = 3748; break; // &Lapl -> &Lapla - case 3792: state = 3799; break; // &lat -> &lata - case 3794: state = 3795; break; // &lAt -> &lAta - case 3807: state = 3808; break; // &lB -> &lBa - case 3812: state = 3813; break; // &lb -> &lba - case 3821: state = 3822; break; // &lbr -> &lbra - case 3837: state = 3838; break; // &Lc -> &Lca - case 3843: state = 3844; break; // &lc -> &lca - case 3870: state = 3871; break; // &ldc -> &ldca - case 3881: state = 3882; break; // &ldrdh -> &ldrdha - case 3887: state = 3888; break; // &ldrush -> &ldrusha - case 3900: state = 3919; break; // &Left -> &Lefta - case 3907: state = 3908; break; // &LeftAngleBr -> &LeftAngleBra - case 3926: state = 3927; break; // &left -> &lefta - case 3933: state = 3934; break; // &LeftArrowB -> &LeftArrowBa - case 3948: state = 3949; break; // &leftarrowt -> &leftarrowta - case 3968: state = 3969; break; // &LeftDoubleBr -> &LeftDoubleBra - case 3994: state = 3995; break; // &LeftDownVectorB -> &LeftDownVectorBa - case 4004: state = 4005; break; // &lefth -> &leftha - case 4022: state = 4023; break; // &leftleft -> &leftlefta - case 4045: state = 4046; break; // &Leftright -> &Leftrighta - case 4056: state = 4057; break; // &leftright -> &leftrighta - case 4065: state = 4066; break; // &leftrighth -> &leftrightha - case 4078: state = 4079; break; // &leftrightsquig -> &leftrightsquiga - case 4121: state = 4122; break; // &LeftTri -> &LeftTria - case 4128: state = 4129; break; // &LeftTriangleB -> &LeftTriangleBa - case 4134: state = 4135; break; // &LeftTriangleEqu -> &LeftTriangleEqua - case 4168: state = 4169; break; // &LeftUpVectorB -> &LeftUpVectorBa - case 4179: state = 4180; break; // &LeftVectorB -> &LeftVectorBa - case 4192: state = 4193; break; // &leqsl -> &leqsla - case 4215: state = 4216; break; // &less -> &lessa - case 4242: state = 4243; break; // &LessEqu -> &LessEqua - case 4247: state = 4248; break; // &LessEqualGre -> &LessEqualGrea - case 4259: state = 4260; break; // &LessFullEqu -> &LessFullEqua - case 4265: state = 4266; break; // &LessGre -> &LessGrea - case 4285: state = 4286; break; // &LessSl -> &LessSla - case 4291: state = 4292; break; // &LessSlantEqu -> &LessSlantEqua - case 4321: state = 4322; break; // &lH -> &lHa - case 4325: state = 4326; break; // &lh -> &lha - case 4348: state = 4350; break; // &ll -> &lla - case 4363: state = 4364; break; // &Lleft -> &Llefta - case 4370: state = 4371; break; // &llh -> &llha - case 4394: state = 4396; break; // &lmoust -> &lmousta - case 4401: state = 4402; break; // &ln -> &lna - case 4422: state = 4423; break; // &lo -> &loa - case 4450: state = 4451; break; // &Longleft -> &Longlefta - case 4462: state = 4463; break; // &longleft -> &longlefta - case 4484: state = 4485; break; // &Longleftright -> &Longleftrighta - case 4495: state = 4496; break; // &longleftright -> &longleftrighta - case 4502: state = 4503; break; // &longm -> &longma - case 4524: state = 4525; break; // &Longright -> &Longrighta - case 4535: state = 4536; break; // &longright -> &longrighta - case 4543: state = 4544; break; // &loop -> &loopa - case 4560: state = 4561; break; // &lop -> &lopa - case 4579: state = 4580; break; // &low -> &lowa - case 4584: state = 4585; break; // &lowb -> &lowba - case 4621: state = 4622; break; // &lp -> &lpa - case 4628: state = 4629; break; // &lr -> &lra - case 4640: state = 4641; break; // &lrh -> &lrha - case 4652: state = 4653; break; // &ls -> &lsa - case 4720: state = 4721; break; // <l -> <la - case 4738: state = 4739; break; // <rP -> <rPa - case 4746: state = 4747; break; // &lurdsh -> &lurdsha - case 4751: state = 4752; break; // &luruh -> &luruha - case 4767: state = 4768; break; // &m -> &ma - case 4781: state = 4782; break; // &M -> &Ma - case 4812: state = 4813; break; // &mcomm -> &mcomma - case 4820: state = 4821; break; // &md -> &mda - case 4830: state = 4831; break; // &me -> &mea - case 4836: state = 4837; break; // &measured -> &measureda - case 4849: state = 4850; break; // &MediumSp -> &MediumSpa - case 4876: state = 4878; break; // &mid -> &mida - case 4957: state = 4958; break; // &multim -> &multima - case 4961: state = 4962; break; // &mum -> &muma - case 4965: state = 4966; break; // &n -> &na - case 4968: state = 4969; break; // &nabl -> &nabla - case 4971: state = 4972; break; // &N -> &Na - case 5003: state = 5005; break; // &natur -> &natura - case 5020: state = 5021; break; // &nc -> &nca - case 5024: state = 5025; break; // &Nc -> &Nca - case 5059: state = 5060; break; // &nd -> &nda - case 5064: state = 5066; break; // &ne -> &nea - case 5085: state = 5086; break; // &Neg -> &Nega - case 5098: state = 5099; break; // &NegativeMediumSp -> &NegativeMediumSpa - case 5109: state = 5110; break; // &NegativeThickSp -> &NegativeThickSpa - case 5116: state = 5117; break; // &NegativeThinSp -> &NegativeThinSpa - case 5130: state = 5131; break; // &NegativeVeryThinSp -> &NegativeVeryThinSpa - case 5141: state = 5142; break; // &nese -> &nesea - case 5154: state = 5155; break; // &NestedGre -> &NestedGrea - case 5161: state = 5162; break; // &NestedGreaterGre -> &NestedGreaterGrea - case 5205: state = 5206; break; // &ngeqsl -> &ngeqsla - case 5227: state = 5232; break; // &nh -> &nha - case 5236: state = 5237; break; // &nhp -> &nhpa - case 5256: state = 5261; break; // &nl -> &nla - case 5275: state = 5276; break; // &nLeft -> &nLefta - case 5283: state = 5284; break; // &nleft -> &nlefta - case 5294: state = 5295; break; // &nLeftright -> &nLeftrighta - case 5305: state = 5306; break; // &nleftright -> &nleftrighta - case 5317: state = 5318; break; // &nleqsl -> &nleqsla - case 5350: state = 5351; break; // &NoBre -> &NoBrea - case 5357: state = 5358; break; // &NonBre -> &NonBrea - case 5364: state = 5365; break; // &NonBreakingSp -> &NonBreakingSpa - case 5392: state = 5393; break; // &NotCupC -> &NotCupCa - case 5407: state = 5408; break; // &NotDoubleVertic -> &NotDoubleVertica - case 5410: state = 5411; break; // &NotDoubleVerticalB -> &NotDoubleVerticalBa - case 5423: state = 5424; break; // &NotEqu -> &NotEqua - case 5441: state = 5442; break; // &NotGre -> &NotGrea - case 5449: state = 5450; break; // &NotGreaterEqu -> &NotGreaterEqua - case 5459: state = 5460; break; // &NotGreaterFullEqu -> &NotGreaterFullEqua - case 5465: state = 5466; break; // &NotGreaterGre -> &NotGreaterGrea - case 5477: state = 5478; break; // &NotGreaterSl -> &NotGreaterSla - case 5483: state = 5484; break; // &NotGreaterSlantEqu -> &NotGreaterSlantEqua - case 5508: state = 5509; break; // &NotHumpEqu -> &NotHumpEqua - case 5521: state = 5522; break; // ¬inv -> ¬inva - case 5534: state = 5535; break; // &NotLeftTri -> &NotLeftTria - case 5541: state = 5542; break; // &NotLeftTriangleB -> &NotLeftTriangleBa - case 5547: state = 5548; break; // &NotLeftTriangleEqu -> &NotLeftTriangleEqua - case 5556: state = 5557; break; // &NotLessEqu -> &NotLessEqua - case 5562: state = 5563; break; // &NotLessGre -> &NotLessGrea - case 5574: state = 5575; break; // &NotLessSl -> &NotLessSla - case 5580: state = 5581; break; // &NotLessSlantEqu -> &NotLessSlantEqua - case 5598: state = 5599; break; // &NotNestedGre -> &NotNestedGrea - case 5605: state = 5606; break; // &NotNestedGreaterGre -> &NotNestedGreaterGrea - case 5623: state = 5624; break; // ¬niv -> ¬niva - case 5641: state = 5642; break; // &NotPrecedesEqu -> &NotPrecedesEqua - case 5646: state = 5647; break; // &NotPrecedesSl -> &NotPrecedesSla - case 5652: state = 5653; break; // &NotPrecedesSlantEqu -> &NotPrecedesSlantEqua - case 5677: state = 5678; break; // &NotRightTri -> &NotRightTria - case 5684: state = 5685; break; // &NotRightTriangleB -> &NotRightTriangleBa - case 5690: state = 5691; break; // &NotRightTriangleEqu -> &NotRightTriangleEqua - case 5696: state = 5697; break; // &NotSqu -> &NotSqua - case 5709: state = 5710; break; // &NotSquareSubsetEqu -> &NotSquareSubsetEqua - case 5722: state = 5723; break; // &NotSquareSupersetEqu -> &NotSquareSupersetEqua - case 5734: state = 5735; break; // &NotSubsetEqu -> &NotSubsetEqua - case 5747: state = 5748; break; // &NotSucceedsEqu -> &NotSucceedsEqua - case 5752: state = 5753; break; // &NotSucceedsSl -> &NotSucceedsSla - case 5758: state = 5759; break; // &NotSucceedsSlantEqu -> &NotSucceedsSlantEqua - case 5777: state = 5778; break; // &NotSupersetEqu -> &NotSupersetEqua - case 5789: state = 5790; break; // &NotTildeEqu -> &NotTildeEqua - case 5799: state = 5800; break; // &NotTildeFullEqu -> &NotTildeFullEqua - case 5814: state = 5815; break; // &NotVertic -> &NotVertica - case 5817: state = 5818; break; // &NotVerticalB -> &NotVerticalBa - case 5821: state = 5822; break; // &np -> &npa - case 5823: state = 5825; break; // &npar -> &npara - case 5855: state = 5860; break; // &nr -> &nra - case 5872: state = 5873; break; // &nRight -> &nRighta - case 5882: state = 5883; break; // &nright -> &nrighta - case 5918: state = 5919; break; // &nshortp -> &nshortpa - case 5920: state = 5921; break; // &nshortpar -> &nshortpara - case 5938: state = 5939; break; // &nsp -> &nspa - case 6007: state = 6008; break; // &ntri -> &ntria - case 6043: state = 6044; break; // &nv -> &nva - case 6048: state = 6049; break; // &nVD -> &nVDa - case 6053: state = 6054; break; // &nVd -> &nVda - case 6058: state = 6059; break; // &nvD -> &nvDa - case 6063: state = 6064; break; // &nvd -> &nvda - case 6073: state = 6074; break; // &nvH -> &nvHa - case 6111: state = 6112; break; // &nw -> &nwa - case 6127: state = 6128; break; // &nwne -> &nwnea - case 6131: state = 6132; break; // &O -> &Oa - case 6138: state = 6139; break; // &o -> &oa - case 6163: state = 6164; break; // &od -> &oda - case 6170: state = 6171; break; // &Odbl -> &Odbla - case 6175: state = 6176; break; // &odbl -> &odbla - case 6215: state = 6216; break; // &Ogr -> &Ogra - case 6220: state = 6221; break; // &ogr -> &ogra - case 6228: state = 6229; break; // &ohb -> &ohba - case 6238: state = 6239; break; // &ol -> &ola - case 6258: state = 6259; break; // &Om -> &Oma - case 6263: state = 6264; break; // &om -> &oma - case 6269: state = 6270; break; // &Omeg -> &Omega - case 6273: state = 6274; break; // &omeg -> &omega - case 6302: state = 6303; break; // &op -> &opa - case 6342: state = 6344; break; // &or -> &ora - case 6386: state = 6387; break; // &Osl -> &Osla - case 6391: state = 6392; break; // &osl -> &osla - case 6417: state = 6419; break; // &otimes -> &otimesa - case 6431: state = 6432; break; // &ovb -> &ovba - case 6438: state = 6439; break; // &OverB -> &OverBa - case 6442: state = 6443; break; // &OverBr -> &OverBra - case 6451: state = 6452; break; // &OverP -> &OverPa - case 6463: state = 6464; break; // &p -> &pa - case 6465: state = 6467; break; // &par -> ¶ - case 6482: state = 6483; break; // &P -> &Pa - case 6486: state = 6487; break; // &Parti -> &Partia - case 6533: state = 6534; break; // &phmm -> &phmma - case 6555: state = 6556; break; // &pl -> &pla - case 6567: state = 6569; break; // &plus -> &plusa - case 6612: state = 6613; break; // &Poinc -> &Poinca - case 6617: state = 6618; break; // &Poincarepl -> &Poincarepla - case 6642: state = 6644; break; // &pr -> &pra - case 6655: state = 6657; break; // &prec -> &preca - case 6681: state = 6682; break; // &PrecedesEqu -> &PrecedesEqua - case 6686: state = 6687; break; // &PrecedesSl -> &PrecedesSla - case 6692: state = 6693; break; // &PrecedesSlantEqu -> &PrecedesSlantEqua - case 6705: state = 6706; break; // &precn -> &precna - case 6735: state = 6736; break; // &prn -> &prna - case 6754: state = 6755; break; // &prof -> &profa - case 6756: state = 6757; break; // &profal -> &profala - case 6778: state = 6780; break; // &Proportion -> &Proportiona - case 6847: state = 6848; break; // &qu -> &qua - case 6876: state = 6882; break; // &r -> &ra - case 6877: state = 6878; break; // &rA -> &rAa - case 6886: state = 6887; break; // &R -> &Ra - case 6932: state = 6934; break; // &rarr -> &rarra - case 6968: state = 6969; break; // &rAt -> &rAta - case 6973: state = 6974; break; // &rat -> &rata - case 6981: state = 6982; break; // &ration -> &rationa - case 6986: state = 6987; break; // &RB -> &RBa - case 6991: state = 6992; break; // &rB -> &rBa - case 6996: state = 6997; break; // &rb -> &rba - case 7005: state = 7006; break; // &rbr -> &rbra - case 7021: state = 7022; break; // &Rc -> &Rca - case 7027: state = 7028; break; // &rc -> &rca - case 7054: state = 7055; break; // &rdc -> &rdca - case 7059: state = 7060; break; // &rdldh -> &rdldha - case 7074: state = 7075; break; // &re -> &rea - case 7082: state = 7083; break; // &realp -> &realpa - case 7151: state = 7152; break; // &rH -> &rHa - case 7155: state = 7156; break; // &rh -> &rha - case 7174: state = 7193; break; // &Right -> &Righta - case 7181: state = 7182; break; // &RightAngleBr -> &RightAngleBra - case 7202: state = 7203; break; // &right -> &righta - case 7209: state = 7210; break; // &RightArrowB -> &RightArrowBa - case 7223: state = 7224; break; // &rightarrowt -> &rightarrowta - case 7243: state = 7244; break; // &RightDoubleBr -> &RightDoubleBra - case 7269: state = 7270; break; // &RightDownVectorB -> &RightDownVectorBa - case 7279: state = 7280; break; // &righth -> &rightha - case 7297: state = 7298; break; // &rightleft -> &rightlefta - case 7305: state = 7306; break; // &rightlefth -> &rightleftha - case 7318: state = 7319; break; // &rightright -> &rightrighta - case 7330: state = 7331; break; // &rightsquig -> &rightsquiga - case 7366: state = 7367; break; // &RightTri -> &RightTria - case 7373: state = 7374; break; // &RightTriangleB -> &RightTriangleBa - case 7379: state = 7380; break; // &RightTriangleEqu -> &RightTriangleEqua - case 7413: state = 7414; break; // &RightUpVectorB -> &RightUpVectorBa - case 7424: state = 7425; break; // &RightVectorB -> &RightVectorBa - case 7442: state = 7443; break; // &rl -> &rla - case 7447: state = 7448; break; // &rlh -> &rlha - case 7457: state = 7459; break; // &rmoust -> &rmousta - case 7469: state = 7470; break; // &ro -> &roa - case 7481: state = 7482; break; // &rop -> &ropa - case 7512: state = 7513; break; // &rp -> &rpa - case 7526: state = 7527; break; // &rr -> &rra - case 7535: state = 7536; break; // &Rright -> &Rrighta - case 7542: state = 7543; break; // &rs -> &rsa - case 7595: state = 7596; break; // &RuleDel -> &RuleDela - case 7604: state = 7605; break; // &ruluh -> &ruluha - case 7610: state = 7611; break; // &S -> &Sa - case 7617: state = 7618; break; // &s -> &sa - case 7629: state = 7636; break; // &Sc -> &Sca - case 7631: state = 7633; break; // &sc -> &sca - case 7670: state = 7671; break; // &scn -> &scna - case 7703: state = 7704; break; // &se -> &sea - case 7725: state = 7726; break; // &sesw -> &seswa - case 7751: state = 7752; break; // &sh -> &sha - case 7803: state = 7804; break; // &shortp -> &shortpa - case 7805: state = 7806; break; // &shortpar -> &shortpara - case 7835: state = 7836; break; // &Sigm -> &Sigma - case 7840: state = 7841; break; // &sigm -> &sigma - case 7873: state = 7874; break; // &simr -> &simra - case 7878: state = 7879; break; // &sl -> &sla - case 7883: state = 7884; break; // &Sm -> &Sma - case 7894: state = 7895; break; // &sm -> &sma - case 7912: state = 7913; break; // &smep -> &smepa - case 7944: state = 7946; break; // &solb -> &solba - case 7956: state = 7957; break; // &sp -> &spa - case 7969: state = 7970; break; // &sqc -> &sqca - case 8008: state = 8015; break; // &squ -> &squa - case 8010: state = 8011; break; // &Squ -> &Squa - case 8041: state = 8042; break; // &SquareSubsetEqu -> &SquareSubsetEqua - case 8054: state = 8055; break; // &SquareSupersetEqu -> &SquareSupersetEqua - case 8068: state = 8069; break; // &sr -> &sra - case 8091: state = 8092; break; // &sst -> &ssta - case 8096: state = 8097; break; // &St -> &Sta - case 8100: state = 8101; break; // &st -> &sta - case 8106: state = 8107; break; // &str -> &stra - case 8160: state = 8161; break; // &subr -> &subra - case 8180: state = 8181; break; // &SubsetEqu -> &SubsetEqua - case 8199: state = 8201; break; // &succ -> &succa - case 8225: state = 8226; break; // &SucceedsEqu -> &SucceedsEqua - case 8230: state = 8231; break; // &SucceedsSl -> &SucceedsSla - case 8236: state = 8237; break; // &SucceedsSlantEqu -> &SucceedsSlantEqua - case 8249: state = 8250; break; // &succn -> &succna - case 8271: state = 8272; break; // &SuchTh -> &SuchTha - case 8316: state = 8317; break; // &SupersetEqu -> &SupersetEqua - case 8328: state = 8329; break; // &supl -> &supla - case 8375: state = 8376; break; // &sw -> &swa - case 8391: state = 8392; break; // &swnw -> &swnwa - case 8400: state = 8401; break; // &T -> &Ta - case 8404: state = 8405; break; // &t -> &ta - case 8419: state = 8420; break; // &Tc -> &Tca - case 8425: state = 8426; break; // &tc -> &tca - case 8481: state = 8482; break; // &Thet -> &Theta - case 8484: state = 8485; break; // &thet -> &theta - case 8495: state = 8496; break; // &thick -> &thicka - case 8511: state = 8512; break; // &ThickSp -> &ThickSpa - case 8522: state = 8523; break; // &ThinSp -> &ThinSpa - case 8527: state = 8528; break; // &thk -> &thka - case 8556: state = 8557; break; // &TildeEqu -> &TildeEqua - case 8566: state = 8567; break; // &TildeFullEqu -> &TildeFullEqua - case 8580: state = 8582; break; // ×b -> ×ba - case 8591: state = 8592; break; // &toe -> &toea - case 8614: state = 8615; break; // &tos -> &tosa - case 8628: state = 8629; break; // &tr -> &tra - case 8633: state = 8634; break; // &tri -> &tria - case 8744: state = 8745; break; // &twohe -> &twohea - case 8750: state = 8751; break; // &twoheadleft -> &twoheadlefta - case 8761: state = 8762; break; // &twoheadright -> &twoheadrighta - case 8768: state = 8769; break; // &U -> &Ua - case 8775: state = 8776; break; // &u -> &ua - case 8829: state = 8830; break; // &ud -> &uda - case 8836: state = 8837; break; // &Udbl -> &Udbla - case 8841: state = 8842; break; // &udbl -> &udbla - case 8845: state = 8846; break; // &udh -> &udha - case 8861: state = 8862; break; // &Ugr -> &Ugra - case 8867: state = 8868; break; // &ugr -> &ugra - case 8872: state = 8873; break; // &uH -> &uHa - case 8876: state = 8877; break; // &uh -> &uha - case 8904: state = 8905; break; // &Um -> &Uma - case 8909: state = 8910; break; // &um -> &uma - case 8920: state = 8921; break; // &UnderB -> &UnderBa - case 8924: state = 8925; break; // &UnderBr -> &UnderBra - case 8933: state = 8934; break; // &UnderP -> &UnderPa - case 8970: state = 8977; break; // &Up -> &Upa - case 8983: state = 8984; break; // &up -> &upa - case 8990: state = 8991; break; // &UpArrowB -> &UpArrowBa - case 9017: state = 9018; break; // &Updown -> &Updowna - case 9027: state = 9028; break; // &updown -> &updowna - case 9046: state = 9047; break; // &uph -> &upha - case 9119: state = 9120; break; // &upup -> &upupa - case 9182: state = 9183; break; // &uu -> &uua - case 9194: state = 9195; break; // &uw -> &uwa - case 9201: state = 9202; break; // &v -> &va - case 9217: state = 9218; break; // &vark -> &varka - case 9220: state = 9221; break; // &varkapp -> &varkappa - case 9255: state = 9256; break; // &varsigm -> &varsigma - case 9282: state = 9283; break; // &varthet -> &vartheta - case 9286: state = 9287; break; // &vartri -> &vartria - case 9304: state = 9305; break; // &Vb -> &Vba - case 9308: state = 9309; break; // &vB -> &vBa - case 9320: state = 9321; break; // &VD -> &VDa - case 9325: state = 9326; break; // &Vd -> &Vda - case 9330: state = 9331; break; // &vD -> &vDa - case 9335: state = 9336; break; // &vd -> &vda - case 9348: state = 9349; break; // &veeb -> &veeba - case 9361: state = 9362; break; // &Verb -> &Verba - case 9366: state = 9367; break; // &verb -> &verba - case 9375: state = 9376; break; // &Vertic -> &Vertica - case 9378: state = 9379; break; // &VerticalB -> &VerticalBa - case 9389: state = 9390; break; // &VerticalSep -> &VerticalSepa - case 9391: state = 9392; break; // &VerticalSepar -> &VerticalSepara - case 9409: state = 9410; break; // &VeryThinSp -> &VeryThinSpa - case 9472: state = 9473; break; // &Vvd -> &Vvda - case 9480: state = 9481; break; // &vzigz -> &vzigza - case 9498: state = 9499; break; // &wedb -> &wedba - case 9535: state = 9536; break; // &wre -> &wrea - case 9549: state = 9550; break; // &xc -> &xca - case 9572: state = 9577; break; // &xh -> &xha - case 9585: state = 9590; break; // &xl -> &xla - case 9594: state = 9595; break; // &xm -> &xma - case 9623: state = 9628; break; // &xr -> &xra - case 9665: state = 9666; break; // &Y -> &Ya - case 9672: state = 9673; break; // &y -> &ya - case 9747: state = 9748; break; // &Z -> &Za - case 9754: state = 9755; break; // &z -> &za - case 9761: state = 9762; break; // &Zc -> &Zca - case 9767: state = 9768; break; // &zc -> &zca - case 9800: state = 9801; break; // &ZeroWidthSp -> &ZeroWidthSpa - case 9805: state = 9806; break; // &Zet -> &Zeta - case 9808: state = 9809; break; // &zet -> &zeta - case 9827: state = 9828; break; // &zigr -> &zigra - default: return false; - } - break; - case 'b': - switch (state) { - case 0: state = 301; break; // & -> &b - case 1: state = 15; break; // &A -> &Ab - case 8: state = 21; break; // &a -> &ab - case 147: state = 150; break; // &angmsda -> &angmsdab - case 167: state = 168; break; // &angrtv -> &angrtvb - case 301: state = 360; break; // &b -> &bb - case 364: state = 365; break; // &bbrkt -> &bbrktb - case 613: state = 614; break; // &box -> &boxb - case 735: state = 736; break; // &brv -> &brvb - case 758: state = 760; break; // &bsol -> &bsolb - case 764: state = 765; break; // &bsolhsu -> &bsolhsub - case 805: state = 811; break; // &cap -> &capb - case 1101: state = 1102; break; // &CloseCurlyDou -> &CloseCurlyDoub - case 1118: state = 1119; break; // &clu -> &club - case 1278: state = 1279; break; // &csu -> &csub - case 1318: state = 1320; break; // &cup -> &cupb - case 1432: state = 1463; break; // &d -> &db - case 1577: state = 1578; break; // &DiacriticalDou -> &DiacriticalDoub - case 1731: state = 1732; break; // &dou -> &doub - case 1734: state = 1735; break; // &double -> &doubleb - case 1744: state = 1745; break; // &Dou -> &Doub - case 2023: state = 2024; break; // &dr -> &drb - case 2389: state = 2390; break; // &Equili -> &Equilib - case 2701: state = 2730; break; // &g -> &gb - case 2708: state = 2724; break; // &G -> &Gb - case 3020: state = 3060; break; // &h -> &hb - case 3101: state = 3102; break; // &Hil -> &Hilb - case 3166: state = 3167; break; // &hor -> &horb - case 3225: state = 3226; break; // &hy -> &hyb - case 3447: state = 3448; break; // &Invisi -> &Invisib - case 3692: state = 3812; break; // &l -> &lb - case 3723: state = 3724; break; // &Lam -> &Lamb - case 3728: state = 3729; break; // &lam -> &lamb - case 3766: state = 3768; break; // &larr -> &larrb - case 3812: state = 3817; break; // &lb -> &lbb - case 3862: state = 3863; break; // &lcu -> &lcub - case 3963: state = 3964; break; // &LeftDou -> &LeftDoub - case 4325: state = 4334; break; // &lh -> &lhb - case 4422: state = 4430; break; // &lo -> &lob - case 4579: state = 4584; break; // &low -> &lowb - case 4676: state = 4677; break; // &lsq -> &lsqb - case 4892: state = 4894; break; // &minus -> &minusb - case 4965: state = 5010; break; // &n -> &nb - case 4966: state = 4967; break; // &na -> &nab - case 5398: state = 5399; break; // &NotDou -> &NotDoub - case 5521: state = 5524; break; // ¬inv -> ¬invb - case 5623: state = 5626; break; // ¬niv -> ¬nivb - case 5701: state = 5702; break; // &NotSquareSu -> &NotSquareSub - case 5726: state = 5727; break; // &NotSu -> &NotSub - case 5944: state = 5945; break; // &nsqsu -> &nsqsub - case 5951: state = 5952; break; // &nsu -> &nsub - case 6163: state = 6174; break; // &od -> &odb - case 6168: state = 6169; break; // &Od -> &Odb - case 6227: state = 6228; break; // &oh -> &ohb - case 6316: state = 6317; break; // &OpenCurlyDou -> &OpenCurlyDoub - case 6430: state = 6431; break; // &ov -> &ovb - case 6567: state = 6574; break; // &plus -> &plusb - case 6876: state = 6996; break; // &r -> &rb - case 6932: state = 6937; break; // &rarr -> &rarrb - case 6996: state = 7001; break; // &rb -> &rbb - case 7046: state = 7047; break; // &rcu -> &rcub - case 7114: state = 7115; break; // &ReverseEquili -> &ReverseEquilib - case 7128: state = 7129; break; // &ReverseUpEquili -> &ReverseUpEquilib - case 7238: state = 7239; break; // &RightDou -> &RightDoub - case 7469: state = 7477; break; // &ro -> &rob - case 7559: state = 7560; break; // &rsq -> &rsqb - case 7617: state = 7624; break; // &s -> &sb - case 7697: state = 7699; break; // &sdot -> &sdotb - case 7942: state = 7944; break; // &sol -> &solb - case 7985: state = 7986; break; // &sqsu -> &sqsub - case 8033: state = 8034; break; // &SquareSu -> &SquareSub - case 8127: state = 8128; break; // &Su -> &Sub - case 8130: state = 8131; break; // &su -> &sub - case 8193: state = 8194; break; // &subsu -> &subsub - case 8297: state = 8298; break; // &supdsu -> &supdsub - case 8325: state = 8326; break; // &suphsu -> &suphsub - case 8370: state = 8371; break; // &supsu -> &supsub - case 8401: state = 8402; break; // &Ta -> &Tab - case 8404: state = 8415; break; // &t -> &tb - case 8578: state = 8580; break; // × -> ×b - case 8594: state = 8596; break; // &top -> &topb - case 8690: state = 8691; break; // &tris -> &trisb - case 8768: state = 8797; break; // &U -> &Ub - case 8775: state = 8802; break; // &u -> &ub - case 8829: state = 8840; break; // &ud -> &udb - case 8834: state = 8835; break; // &Ud -> &Udb - case 8876: state = 8883; break; // &uh -> &uhb - case 9039: state = 9040; break; // &UpEquili -> &UpEquilib - case 9258: state = 9259; break; // &varsu -> &varsub - case 9303: state = 9304; break; // &V -> &Vb - case 9346: state = 9348; break; // &vee -> &veeb - case 9360: state = 9361; break; // &Ver -> &Verb - case 9365: state = 9366; break; // &ver -> &verb - case 9427: state = 9428; break; // &vnsu -> &vnsub - case 9458: state = 9459; break; // &vsu -> &vsub - case 9497: state = 9498; break; // &wed -> &wedb - default: return false; - } - break; - case 'c': - switch (state) { - case 0: state = 796; break; // & -> &c - case 1: state = 33; break; // &A -> &Ac - case 2: state = 3; break; // &Aa -> &Aac - case 8: state = 27; break; // &a -> &ac - case 9: state = 10; break; // &aa -> &aac - case 35: state = 36; break; // &Acir ->  - case 39: state = 40; break; // &acir -> â - case 99: state = 100; break; // &Ama -> &Amac - case 104: state = 105; break; // &ama -> &amac - case 147: state = 152; break; // &angmsda -> &angmsdac - case 201: state = 202; break; // &apa -> &apac - case 222: state = 223; break; // &ApplyFun -> &ApplyFunc - case 247: state = 248; break; // &As -> &Asc - case 251: state = 252; break; // &as -> &asc - case 289: state = 290; break; // &aw -> &awc - case 301: state = 369; break; // &b -> &bc - case 302: state = 303; break; // &ba -> &bac - case 304: state = 305; break; // &back -> &backc - case 331: state = 374; break; // &B -> &Bc - case 332: state = 333; break; // &Ba -> &Bac - case 384: state = 385; break; // &be -> &bec - case 390: state = 391; break; // &Be -> &Bec - case 443: state = 444; break; // &big -> &bigc - case 449: state = 450; break; // &bigcir -> &bigcirc - case 472: state = 473; break; // &bigsq -> &bigsqc - case 520: state = 521; break; // &bla -> &blac - case 575: state = 576; break; // &blo -> &bloc - case 740: state = 741; break; // &Bs -> &Bsc - case 744: state = 745; break; // &bs -> &bsc - case 789: state = 866; break; // &C -> &Cc - case 790: state = 791; break; // &Ca -> &Cac - case 796: state = 861; break; // &c -> &cc - case 797: state = 798; break; // &ca -> &cac - case 805: state = 817; break; // &cap -> &capc - case 812: state = 813; break; // &capbr -> &capbrc - case 887: state = 888; break; // &Ccir -> &Ccirc - case 891: state = 892; break; // &ccir -> &ccirc - case 956: state = 957; break; // &CH -> &CHc - case 960: state = 961; break; // &ch -> &chc - case 964: state = 965; break; // &che -> &chec - case 979: state = 981; break; // &cir -> &circ - case 1004: state = 1009; break; // &circled -> &circledc - case 1011: state = 1012; break; // &circledcir -> &circledcirc - case 1020: state = 1021; break; // &Cir -> &Circ - case 1063: state = 1064; break; // &cirs -> &cirsc - case 1069: state = 1070; break; // &Clo -> &Cloc - case 1213: state = 1214; break; // &Coprodu -> &Coproduc - case 1233: state = 1234; break; // &CounterClo -> &CounterCloc - case 1270: state = 1271; break; // &Cs -> &Csc - case 1274: state = 1275; break; // &cs -> &csc - case 1305: state = 1306; break; // &cues -> &cuesc - case 1318: state = 1330; break; // &cup -> &cupc - case 1321: state = 1322; break; // &cupbr -> &cupbrc - case 1359: state = 1360; break; // &curlyeqpre -> &curlyeqprec - case 1363: state = 1364; break; // &curlyeqsu -> &curlyeqsuc - case 1364: state = 1365; break; // &curlyeqsuc -> &curlyeqsucc - case 1407: state = 1408; break; // &cw -> &cwc - case 1420: state = 1421; break; // &cyl -> &cylc - case 1425: state = 1474; break; // &D -> &Dc - case 1432: state = 1480; break; // &d -> &dc - case 1471: state = 1472; break; // &dbla -> &dblac - case 1558: state = 1559; break; // &Dia -> &Diac - case 1563: state = 1564; break; // &Diacriti -> &Diacritic - case 1567: state = 1568; break; // &DiacriticalA -> &DiacriticalAc - case 1581: state = 1582; break; // &DiacriticalDoubleA -> &DiacriticalDoubleAc - case 1661: state = 1662; break; // &DJ -> &DJc - case 1665: state = 1666; break; // &dj -> &djc - case 1669: state = 1670; break; // &dl -> &dlc - case 1873: state = 1874; break; // &DoubleVerti -> &DoubleVertic - case 1960: state = 1961; break; // &DownLeftRightVe -> &DownLeftRightVec - case 1970: state = 1971; break; // &DownLeftTeeVe -> &DownLeftTeeVec - case 1977: state = 1978; break; // &DownLeftVe -> &DownLeftVec - case 1996: state = 1997; break; // &DownRightTeeVe -> &DownRightTeeVec - case 2003: state = 2004; break; // &DownRightVe -> &DownRightVec - case 2023: state = 2031; break; // &dr -> &drc - case 2040: state = 2041; break; // &Ds -> &Dsc - case 2044: state = 2045; break; // &ds -> &dsc - case 2048: state = 2049; break; // &DS -> &DSc - case 2093: state = 2094; break; // &DZ -> &DZc - case 2097: state = 2098; break; // &dz -> &dzc - case 2108: state = 2127; break; // &E -> &Ec - case 2109: state = 2110; break; // &Ea -> &Eac - case 2115: state = 2133; break; // &e -> &ec - case 2116: state = 2117; break; // &ea -> &eac - case 2140: state = 2146; break; // &ecir -> ê - case 2143: state = 2144; break; // &Ecir -> Ê - case 2229: state = 2230; break; // &Ema -> &Emac - case 2234: state = 2235; break; // &ema -> &emac - case 2339: state = 2340; break; // &eq -> &eqc - case 2342: state = 2343; break; // &eqcir -> &eqcirc - case 2418: state = 2419; break; // &Es -> &Esc - case 2422: state = 2423; break; // &es -> &esc - case 2458: state = 2459; break; // &ex -> &exc - case 2473: state = 2474; break; // &expe -> &expec - case 2503: state = 2521; break; // &f -> &fc - case 2517: state = 2518; break; // &F -> &Fc - case 2648: state = 2649; break; // &fra -> &frac - case 2693: state = 2694; break; // &Fs -> &Fsc - case 2697: state = 2698; break; // &fs -> &fsc - case 2701: state = 2746; break; // &g -> &gc - case 2702: state = 2703; break; // &ga -> &gac - case 2708: state = 2736; break; // &G -> &Gc - case 2743: state = 2744; break; // &Gcir -> &Gcirc - case 2748: state = 2749; break; // &gcir -> &gcirc - case 2781: state = 2783; break; // &ges -> &gesc - case 2783: state = 2784; break; // &gesc -> &gescc - case 2816: state = 2817; break; // &GJ -> &GJc - case 2820: state = 2821; break; // &gj -> &gjc - case 2923: state = 2924; break; // &Gs -> &Gsc - case 2927: state = 2928; break; // &gs -> &gsc - case 2942: state = 2944; break; // > -> >c - case 2944: state = 2945; break; // >c -> >cc - case 3014: state = 3064; break; // &H -> &Hc - case 3015: state = 3016; break; // &Ha -> &Hac - case 3020: state = 3069; break; // &h -> &hc - case 3037: state = 3038; break; // &HARD -> &HARDc - case 3042: state = 3043; break; // &hard -> &hardc - case 3050: state = 3052; break; // &harr -> &harrc - case 3066: state = 3067; break; // &Hcir -> &Hcirc - case 3071: state = 3072; break; // &hcir -> &hcirc - case 3089: state = 3090; break; // &her -> &herc - case 3108: state = 3109; break; // &HilbertSpa -> &HilbertSpac - case 3184: state = 3185; break; // &Hs -> &Hsc - case 3188: state = 3189; break; // &hs -> &hsc - case 3236: state = 3252; break; // &I -> &Ic - case 3237: state = 3238; break; // &Ia -> &Iac - case 3243: state = 3250; break; // &i -> &ic - case 3244: state = 3245; break; // &ia -> &iac - case 3254: state = 3255; break; // &Icir -> Î - case 3258: state = 3259; break; // &icir -> î - case 3269: state = 3270; break; // &IE -> &IEc - case 3273: state = 3274; break; // &ie -> &iec - case 3277: state = 3278; break; // &iex -> &iexc - case 3332: state = 3333; break; // &Ima -> &Imac - case 3337: state = 3338; break; // &ima -> &imac - case 3378: state = 3380; break; // &in -> &inc - case 3401: state = 3403; break; // &int -> &intc - case 3419: state = 3420; break; // &inter -> &interc - case 3426: state = 3427; break; // &Interse -> &Intersec - case 3463: state = 3464; break; // &IO -> &IOc - case 3467: state = 3468; break; // &io -> &ioc - case 3503: state = 3504; break; // &Is -> &Isc - case 3507: state = 3508; break; // &is -> &isc - case 3540: state = 3541; break; // &Iuk -> &Iukc - case 3545: state = 3546; break; // &iuk -> &iukc - case 3555: state = 3556; break; // &J -> &Jc - case 3558: state = 3559; break; // &Jcir -> &Jcirc - case 3561: state = 3562; break; // &j -> &jc - case 3564: state = 3565; break; // &jcir -> &jcirc - case 3590: state = 3591; break; // &Js -> &Jsc - case 3594: state = 3595; break; // &js -> &jsc - case 3599: state = 3600; break; // &Jser -> &Jserc - case 3604: state = 3605; break; // &jser -> &jserc - case 3609: state = 3610; break; // &Juk -> &Jukc - case 3614: state = 3615; break; // &juk -> &jukc - case 3618: state = 3632; break; // &K -> &Kc - case 3624: state = 3638; break; // &k -> &kc - case 3660: state = 3661; break; // &KH -> &KHc - case 3664: state = 3665; break; // &kh -> &khc - case 3668: state = 3669; break; // &KJ -> &KJc - case 3672: state = 3673; break; // &kj -> &kjc - case 3684: state = 3685; break; // &Ks -> &Ksc - case 3688: state = 3689; break; // &ks -> &ksc - case 3692: state = 3843; break; // &l -> &lc - case 3698: state = 3837; break; // &L -> &Lc - case 3699: state = 3700; break; // &La -> &Lac - case 3705: state = 3706; break; // &la -> &lac - case 3748: state = 3749; break; // &Lapla -> &Laplac - case 3822: state = 3823; break; // &lbra -> &lbrac - case 3869: state = 3870; break; // &ld -> &ldc - case 3908: state = 3909; break; // &LeftAngleBra -> &LeftAngleBrac - case 3969: state = 3970; break; // &LeftDoubleBra -> &LeftDoubleBrac - case 3981: state = 3982; break; // &LeftDownTeeVe -> &LeftDownTeeVec - case 3988: state = 3989; break; // &LeftDownVe -> &LeftDownVec - case 4086: state = 4087; break; // &LeftRightVe -> &LeftRightVec - case 4103: state = 4104; break; // &LeftTeeVe -> &LeftTeeVec - case 4145: state = 4146; break; // &LeftUpDownVe -> &LeftUpDownVec - case 4155: state = 4156; break; // &LeftUpTeeVe -> &LeftUpTeeVec - case 4162: state = 4163; break; // &LeftUpVe -> &LeftUpVec - case 4173: state = 4174; break; // &LeftVe -> &LeftVec - case 4197: state = 4199; break; // &les -> &lesc - case 4199: state = 4200; break; // &lesc -> &lescc - case 4338: state = 4339; break; // &LJ -> &LJc - case 4342: state = 4343; break; // &lj -> &ljc - case 4348: state = 4354; break; // &ll -> &llc - case 4396: state = 4397; break; // &lmousta -> &lmoustac - case 4628: state = 4633; break; // &lr -> &lrc - case 4652: state = 4662; break; // &ls -> &lsc - case 4658: state = 4659; break; // &Ls -> &Lsc - case 4698: state = 4700; break; // < -> <c - case 4700: state = 4701; break; // <c -> <cc - case 4767: state = 4809; break; // &m -> &mc - case 4768: state = 4769; break; // &ma -> &mac - case 4781: state = 4815; break; // &M -> &Mc - case 4850: state = 4851; break; // &MediumSpa -> &MediumSpac - case 4871: state = 4872; break; // &mi -> &mic - case 4876: state = 4882; break; // &mid -> &midc - case 4909: state = 4910; break; // &ml -> &mlc - case 4937: state = 4938; break; // &Ms -> &Msc - case 4941: state = 4942; break; // &ms -> &msc - case 4965: state = 5020; break; // &n -> &nc - case 4966: state = 4978; break; // &na -> &nac - case 4971: state = 5024; break; // &N -> &Nc - case 4972: state = 4973; break; // &Na -> &Nac - case 5099: state = 5100; break; // &NegativeMediumSpa -> &NegativeMediumSpac - case 5105: state = 5106; break; // &NegativeThi -> &NegativeThic - case 5110: state = 5111; break; // &NegativeThickSpa -> &NegativeThickSpac - case 5117: state = 5118; break; // &NegativeThinSpa -> &NegativeThinSpac - case 5131: state = 5132; break; // &NegativeVeryThinSpa -> &NegativeVeryThinSpac - case 5248: state = 5249; break; // &NJ -> &NJc - case 5252: state = 5253; break; // &nj -> &njc - case 5365: state = 5366; break; // &NonBreakingSpa -> &NonBreakingSpac - case 5406: state = 5407; break; // &NotDoubleVerti -> &NotDoubleVertic - case 5521: state = 5526; break; // ¬inv -> ¬invc - case 5623: state = 5628; break; // ¬niv -> ¬nivc - case 5632: state = 5633; break; // &NotPre -> &NotPrec - case 5726: state = 5738; break; // &NotSu -> &NotSuc - case 5738: state = 5739; break; // &NotSuc -> &NotSucc - case 5813: state = 5814; break; // &NotVerti -> &NotVertic - case 5842: state = 5844; break; // &npr -> &nprc - case 5848: state = 5850; break; // &npre -> &nprec - case 5862: state = 5864; break; // &nrarr -> &nrarrc - case 5895: state = 5896; break; // &ns -> &nsc - case 5896: state = 5898; break; // &nsc -> &nscc - case 5904: state = 5905; break; // &Ns -> &Nsc - case 5951: state = 5967; break; // &nsu -> &nsuc - case 5967: state = 5968; break; // &nsuc -> &nsucc - case 6131: state = 6152; break; // &O -> &Oc - case 6132: state = 6133; break; // &Oa -> &Oac - case 6138: state = 6148; break; // &o -> &oc - case 6139: state = 6140; break; // &oa -> &oac - case 6150: state = 6157; break; // &ocir -> ô - case 6154: state = 6155; break; // &Ocir -> Ô - case 6171: state = 6172; break; // &Odbla -> &Odblac - case 6176: state = 6177; break; // &odbla -> &odblac - case 6200: state = 6201; break; // &of -> &ofc - case 6238: state = 6243; break; // &ol -> &olc - case 6259: state = 6260; break; // &Oma -> &Omac - case 6264: state = 6265; break; // &oma -> &omac - case 6276: state = 6277; break; // &Omi -> &Omic - case 6282: state = 6283; break; // &omi -> &omic - case 6378: state = 6379; break; // &Os -> &Osc - case 6382: state = 6383; break; // &os -> &osc - case 6443: state = 6444; break; // &OverBra -> &OverBrac - case 6463: state = 6494; break; // &p -> &pc - case 6482: state = 6491; break; // &P -> &Pc - case 6498: state = 6499; break; // &per -> &perc - case 6545: state = 6546; break; // &pit -> &pitc - case 6557: state = 6558; break; // &plan -> &planc - case 6567: state = 6576; break; // &plus -> &plusc - case 6569: state = 6570; break; // &plusa -> &plusac - case 6611: state = 6612; break; // &Poin -> &Poinc - case 6642: state = 6647; break; // &pr -> &prc - case 6653: state = 6655; break; // &pre -> &prec - case 6655: state = 6664; break; // &prec -> &precc - case 6672: state = 6673; break; // &Pre -> &Prec - case 6750: state = 6751; break; // &Produ -> &Produc - case 6795: state = 6796; break; // &Ps -> &Psc - case 6799: state = 6800; break; // &ps -> &psc - case 6808: state = 6809; break; // &pun -> &punc - case 6839: state = 6840; break; // &Qs -> &Qsc - case 6843: state = 6844; break; // &qs -> &qsc - case 6876: state = 7027; break; // &r -> &rc - case 6882: state = 6883; break; // &ra -> &rac - case 6886: state = 7021; break; // &R -> &Rc - case 6887: state = 6888; break; // &Ra -> &Rac - case 6898: state = 6899; break; // &radi -> &radic - case 6932: state = 6942; break; // &rarr -> &rarrc - case 7006: state = 7007; break; // &rbra -> &rbrac - case 7053: state = 7054; break; // &rd -> &rdc - case 7074: state = 7089; break; // &re -> &rec - case 7182: state = 7183; break; // &RightAngleBra -> &RightAngleBrac - case 7244: state = 7245; break; // &RightDoubleBra -> &RightDoubleBrac - case 7256: state = 7257; break; // &RightDownTeeVe -> &RightDownTeeVec - case 7263: state = 7264; break; // &RightDownVe -> &RightDownVec - case 7348: state = 7349; break; // &RightTeeVe -> &RightTeeVec - case 7390: state = 7391; break; // &RightUpDownVe -> &RightUpDownVec - case 7400: state = 7401; break; // &RightUpTeeVe -> &RightUpTeeVec - case 7407: state = 7408; break; // &RightUpVe -> &RightUpVec - case 7418: state = 7419; break; // &RightVe -> &RightVec - case 7459: state = 7460; break; // &rmousta -> &rmoustac - case 7542: state = 7552; break; // &rs -> &rsc - case 7548: state = 7549; break; // &Rs -> &Rsc - case 7610: state = 7629; break; // &S -> &Sc - case 7611: state = 7612; break; // &Sa -> &Sac - case 7617: state = 7631; break; // &s -> &sc - case 7618: state = 7619; break; // &sa -> &sac - case 7631: state = 7645; break; // &sc -> &scc - case 7663: state = 7664; break; // &Scir -> &Scirc - case 7667: state = 7668; break; // &scir -> &scirc - case 7703: state = 7718; break; // &se -> &sec - case 7751: state = 7762; break; // &sh -> &shc - case 7756: state = 7767; break; // &SH -> &SHc - case 7758: state = 7759; break; // &SHCH -> &SHCHc - case 7763: state = 7764; break; // &shch -> &shchc - case 7889: state = 7890; break; // &SmallCir -> &SmallCirc - case 7932: state = 7933; break; // &SOFT -> &SOFTc - case 7938: state = 7939; break; // &soft -> &softc - case 7968: state = 7969; break; // &sq -> &sqc - case 8025: state = 8026; break; // &SquareInterse -> &SquareIntersec - case 8073: state = 8074; break; // &Ss -> &Ssc - case 8077: state = 8078; break; // &ss -> &ssc - case 8127: state = 8216; break; // &Su -> &Suc - case 8130: state = 8198; break; // &su -> &suc - case 8198: state = 8199; break; // &suc -> &succ - case 8199: state = 8208; break; // &succ -> &succc - case 8216: state = 8217; break; // &Suc -> &Succ - case 8400: state = 8419; break; // &T -> &Tc - case 8404: state = 8425; break; // &t -> &tc - case 8452: state = 8453; break; // &telre -> &telrec - case 8493: state = 8494; break; // &thi -> &thic - case 8507: state = 8508; break; // &Thi -> &Thic - case 8512: state = 8513; break; // &ThickSpa -> &ThickSpac - case 8523: state = 8524; break; // &ThinSpa -> &ThinSpac - case 8594: state = 8600; break; // &top -> &topc - case 8705: state = 8706; break; // &Ts -> &Tsc - case 8709: state = 8710; break; // &ts -> &tsc - case 8713: state = 8714; break; // &TS -> &TSc - case 8719: state = 8720; break; // &TSH -> &TSHc - case 8723: state = 8724; break; // &tsh -> &tshc - case 8768: state = 8815; break; // &U -> &Uc - case 8769: state = 8770; break; // &Ua -> &Uac - case 8775: state = 8820; break; // &u -> &uc - case 8776: state = 8777; break; // &ua -> &uac - case 8792: state = 8793; break; // &Uarro -> &Uarroc - case 8798: state = 8799; break; // &Ubr -> &Ubrc - case 8803: state = 8804; break; // &ubr -> &ubrc - case 8817: state = 8818; break; // &Ucir -> Û - case 8822: state = 8823; break; // &ucir -> û - case 8837: state = 8838; break; // &Udbla -> &Udblac - case 8842: state = 8843; break; // &udbla -> &udblac - case 8887: state = 8888; break; // &ul -> &ulc - case 8905: state = 8906; break; // &Uma -> &Umac - case 8910: state = 8911; break; // &uma -> &umac - case 8925: state = 8926; break; // &UnderBra -> &UnderBrac - case 9127: state = 9128; break; // &ur -> &urc - case 9153: state = 9154; break; // &Us -> &Usc - case 9157: state = 9158; break; // &us -> &usc - case 9201: state = 9317; break; // &v -> &vc - case 9303: state = 9314; break; // &V -> &Vc - case 9374: state = 9375; break; // &Verti -> &Vertic - case 9410: state = 9411; break; // &VeryThinSpa -> &VeryThinSpac - case 9450: state = 9451; break; // &Vs -> &Vsc - case 9454: state = 9455; break; // &vs -> &vsc - case 9484: state = 9485; break; // &W -> &Wc - case 9487: state = 9488; break; // &Wcir -> &Wcirc - case 9490: state = 9491; break; // &w -> &wc - case 9493: state = 9494; break; // &wcir -> &wcirc - case 9540: state = 9541; break; // &Ws -> &Wsc - case 9544: state = 9545; break; // &ws -> &wsc - case 9548: state = 9549; break; // &x -> &xc - case 9554: state = 9555; break; // &xcir -> &xcirc - case 9632: state = 9633; break; // &Xs -> &Xsc - case 9636: state = 9637; break; // &xs -> &xsc - case 9640: state = 9641; break; // &xsq -> &xsqc - case 9665: state = 9685; break; // &Y -> &Yc - case 9666: state = 9667; break; // &Ya -> &Yac - case 9672: state = 9690; break; // &y -> &yc - case 9673: state = 9674; break; // &ya -> &yac - case 9679: state = 9680; break; // &YA -> &YAc - case 9687: state = 9688; break; // &Ycir -> &Ycirc - case 9692: state = 9693; break; // &ycir -> &ycirc - case 9708: state = 9709; break; // &YI -> &YIc - case 9712: state = 9713; break; // &yi -> &yic - case 9724: state = 9725; break; // &Ys -> &Ysc - case 9728: state = 9729; break; // &ys -> &ysc - case 9732: state = 9733; break; // &YU -> &YUc - case 9736: state = 9737; break; // &yu -> &yuc - case 9747: state = 9761; break; // &Z -> &Zc - case 9748: state = 9749; break; // &Za -> &Zac - case 9754: state = 9767; break; // &z -> &zc - case 9755: state = 9756; break; // &za -> &zac - case 9801: state = 9802; break; // &ZeroWidthSpa -> &ZeroWidthSpac - case 9817: state = 9818; break; // &ZH -> &ZHc - case 9821: state = 9822; break; // &zh -> &zhc - case 9840: state = 9841; break; // &Zs -> &Zsc - case 9844: state = 9845; break; // &zs -> &zsc - default: return false; - } - break; - case 'd': - switch (state) { - case 0: state = 1432; break; // & -> &d - case 27: state = 29; break; // &ac -> &acd - case 116: state = 117; break; // &An -> &And - case 119: state = 120; break; // &an -> &and - case 120: state = 126; break; // &and -> &andd - case 123: state = 124; break; // &andan -> &andand - case 144: state = 145; break; // &angms -> &angmsd - case 147: state = 154; break; // &angmsda -> &angmsdad - case 168: state = 170; break; // &angrtvb -> &angrtvbd - case 210: state = 211; break; // &api -> &apid - case 271: state = 272; break; // &Atil -> &Atild - case 277: state = 278; break; // &atil -> &atild - case 301: state = 379; break; // &b -> &bd - case 350: state = 351; break; // &Barwe -> &Barwed - case 354: state = 355; break; // &barwe -> &barwed - case 455: state = 456; break; // &bigo -> &bigod - case 488: state = 489; break; // &bigtriangle -> &bigtriangled - case 508: state = 509; break; // &bigwe -> &bigwed - case 545: state = 547; break; // &blacktriangle -> &blacktriangled - case 613: state = 623; break; // &box -> &boxd - case 636: state = 642; break; // &boxH -> &boxHd - case 638: state = 646; break; // &boxh -> &boxhd - case 789: state = 907; break; // &C -> &Cd - case 796: state = 911; break; // &c -> &cd - case 805: state = 824; break; // &cap -> &capd - case 808: state = 809; break; // &capan -> &capand - case 876: state = 877; break; // &Cce -> &Cced - case 881: state = 882; break; // &cce -> &cced - case 915: state = 916; break; // &ce -> &ced - case 920: state = 921; break; // &Ce -> &Ced - case 945: state = 946; break; // ¢er -> ¢erd - case 987: state = 1004; break; // &circle -> &circled - case 1004: state = 1014; break; // &circled -> &circledd - case 1060: state = 1061; break; // &cirmi -> &cirmid - case 1165: state = 1167; break; // &cong -> &congd - case 1207: state = 1208; break; // &copro -> &coprod - case 1211: state = 1212; break; // &Copro -> &Coprod - case 1287: state = 1288; break; // &ct -> &ctd - case 1292: state = 1293; break; // &cu -> &cud - case 1318: state = 1337; break; // &cup -> &cupd - case 1372: state = 1373; break; // &curlywe -> &curlywed - case 1404: state = 1405; break; // &cuwe -> &cuwed - case 1432: state = 1492; break; // &d -> &dd - case 1507: state = 1508; break; // &DDotrah -> &DDotrahd - case 1595: state = 1596; break; // &DiacriticalTil -> &DiacriticalTild - case 1605: state = 1606; break; // &Diamon -> &Diamond - case 1609: state = 1610; break; // &diamon -> &diamond - case 1645: state = 1646; break; // &divi -> &divid - case 1701: state = 1703; break; // &doteq -> &doteqd - case 1739: state = 1740; break; // &doublebarwe -> &doublebarwed - case 1896: state = 1921; break; // &down -> &downd - case 2067: state = 2068; break; // &dt -> &dtd - case 2108: state = 2162; break; // &E -> &Ed - case 2115: state = 2169; break; // &e -> &ed - case 2198: state = 2200; break; // &egs -> &egsd - case 2222: state = 2224; break; // &els -> &elsd - case 2379: state = 2380; break; // &EqualTil -> &EqualTild - case 2422: state = 2426; break; // &es -> &esd - case 2509: state = 2510; break; // &falling -> &fallingd - case 2557: state = 2558; break; // &Fille -> &Filled - case 2701: state = 2759; break; // &g -> &gd - case 2708: state = 2755; break; // &G -> &Gd - case 2712: state = 2718; break; // &Gamma -> &Gammad - case 2716: state = 2720; break; // &gamma -> &gammad - case 2737: state = 2738; break; // &Gce -> &Gced - case 2781: state = 2786; break; // &ges -> &gesd - case 2919: state = 2920; break; // &GreaterTil -> &GreaterTild - case 2942: state = 2950; break; // > -> >d - case 2965: state = 2976; break; // >r -> >rd - case 3041: state = 3042; break; // &har -> &hard - case 3236: state = 3265; break; // &I -> &Id - case 3369: state = 3370; break; // &impe -> &imped - case 3393: state = 3394; break; // &ino -> &inod - case 3441: state = 3442; break; // &intpro -> &intprod - case 3494: state = 3495; break; // &ipro -> &iprod - case 3512: state = 3514; break; // &isin -> &isind - case 3530: state = 3531; break; // &Itil -> &Itild - case 3535: state = 3536; break; // &itil -> &itild - case 3633: state = 3634; break; // &Kce -> &Kced - case 3639: state = 3640; break; // &kce -> &kced - case 3692: state = 3869; break; // &l -> &ld - case 3724: state = 3725; break; // &Lamb -> &Lambd - case 3729: state = 3730; break; // &lamb -> &lambd - case 3737: state = 3739; break; // &lang -> &langd - case 3832: state = 3833; break; // &lbrksl -> &lbrksld - case 3849: state = 3850; break; // &Lce -> &Lced - case 3854: state = 3855; break; // &lce -> &lced - case 3879: state = 3880; break; // &ldr -> &ldrd - case 4010: state = 4011; break; // &leftharpoon -> &leftharpoond - case 4197: state = 4202; break; // &les -> &lesd - case 4215: state = 4223; break; // &less -> &lessd - case 4297: state = 4298; break; // &LessTil -> &LessTild - case 4327: state = 4328; break; // &lhar -> &lhard - case 4372: state = 4373; break; // &llhar -> &llhard - case 4380: state = 4381; break; // &Lmi -> &Lmid - case 4386: state = 4387; break; // &lmi -> &lmid - case 4642: state = 4644; break; // &lrhar -> &lrhard - case 4698: state = 4706; break; // < -> <d - case 4743: state = 4744; break; // &lur -> &lurd - case 4767: state = 4820; break; // &m -> &md - case 4789: state = 4791; break; // &mapsto -> &mapstod - case 4835: state = 4836; break; // &measure -> &measured - case 4843: state = 4844; break; // &Me -> &Med - case 4871: state = 4876; break; // &mi -> &mid - case 4876: state = 4886; break; // &mid -> &midd - case 4892: state = 4896; break; // &minus -> &minusd - case 4909: state = 4913; break; // &ml -> &mld - case 4922: state = 4923; break; // &mo -> &mod - case 4965: state = 5059; break; // &n -> &nd - case 4990: state = 4991; break; // &napi -> &napid - case 5034: state = 5035; break; // &Nce -> &Nced - case 5039: state = 5040; break; // &nce -> &nced - case 5046: state = 5048; break; // &ncong -> &ncongd - case 5064: state = 5080; break; // &ne -> &ned - case 5092: state = 5093; break; // &NegativeMe -> &NegativeMed - case 5150: state = 5151; break; // &Neste -> &Nested - case 5242: state = 5244; break; // &nis -> &nisd - case 5256: state = 5265; break; // &nl -> &nld - case 5344: state = 5345; break; // &nmi -> &nmid - case 5429: state = 5430; break; // &NotEqualTil -> &NotEqualTild - case 5489: state = 5490; break; // &NotGreaterTil -> &NotGreaterTild - case 5513: state = 5515; break; // ¬in -> ¬ind - case 5586: state = 5587; break; // &NotLessTil -> &NotLessTild - case 5594: state = 5595; break; // &NotNeste -> &NotNested - case 5634: state = 5635; break; // &NotPrece -> &NotPreced - case 5741: state = 5742; break; // &NotSuccee -> &NotSucceed - case 5764: state = 5765; break; // &NotSucceedsTil -> &NotSucceedsTild - case 5783: state = 5784; break; // &NotTil -> &NotTild - case 5805: state = 5806; break; // &NotTildeTil -> &NotTildeTild - case 5915: state = 5916; break; // &nshortmi -> &nshortmid - case 5935: state = 5936; break; // &nsmi -> &nsmid - case 5994: state = 5995; break; // &Ntil -> &Ntild - case 5999: state = 6000; break; // &ntil -> &ntild - case 6043: state = 6063; break; // &nv -> &nvd - case 6047: state = 6053; break; // &nV -> &nVd - case 6131: state = 6168; break; // &O -> &Od - case 6138: state = 6163; break; // &o -> &od - case 6187: state = 6188; break; // &odsol -> &odsold - case 6282: state = 6288; break; // &omi -> &omid - case 6342: state = 6348; break; // &or -> &ord - case 6401: state = 6402; break; // &Otil -> &Otild - case 6407: state = 6408; break; // &otil -> &otild - case 6504: state = 6505; break; // &perio -> &period - case 6567: state = 6580; break; // &plus -> &plusd - case 6637: state = 6638; break; // &poun -> £ - case 6674: state = 6675; break; // &Prece -> &Preced - case 6698: state = 6699; break; // &PrecedesTil -> &PrecedesTild - case 6745: state = 6746; break; // &pro -> &prod - case 6748: state = 6749; break; // &Pro -> &Prod - case 6876: state = 7053; break; // &r -> &rd - case 6882: state = 6897; break; // &ra -> &rad - case 6912: state = 6914; break; // &rang -> &rangd - case 7016: state = 7017; break; // &rbrksl -> &rbrksld - case 7033: state = 7034; break; // &Rce -> &Rced - case 7038: state = 7039; break; // &rce -> &rced - case 7057: state = 7058; break; // &rdl -> &rdld - case 7157: state = 7158; break; // &rhar -> &rhard - case 7285: state = 7286; break; // &rightharpoon -> &rightharpoond - case 7434: state = 7435; break; // &rising -> &risingd - case 7466: state = 7467; break; // &rnmi -> &rnmid - case 7502: state = 7503; break; // &Roun -> &Round - case 7598: state = 7599; break; // &RuleDelaye -> &RuleDelayed - case 7617: state = 7695; break; // &s -> &sd - case 7651: state = 7658; break; // &sce -> &sced - case 7653: state = 7654; break; // &Sce -> &Sced - case 7800: state = 7801; break; // &shortmi -> &shortmid - case 7847: state = 7849; break; // &sim -> &simd - case 7918: state = 7919; break; // &smi -> &smid - case 7957: state = 7958; break; // &spa -> &spad - case 8131: state = 8133; break; // &sub -> &subd - case 8139: state = 8141; break; // &sube -> &subed - case 8219: state = 8220; break; // &Succee -> &Succeed - case 8242: state = 8243; break; // &SucceedsTil -> &SucceedsTild - case 8284: state = 8292; break; // &sup -> &supd - case 8302: state = 8304; break; // &supe -> &suped - case 8404: state = 8445; break; // &t -> &td - case 8431: state = 8432; break; // &Tce -> &Tced - case 8436: state = 8437; break; // &tce -> &tced - case 8545: state = 8546; break; // &Til -> &Tild - case 8550: state = 8551; break; // &til -> &tild - case 8572: state = 8573; break; // &TildeTil -> &TildeTild - case 8578: state = 8585; break; // × -> ×d - case 8629: state = 8630; break; // &tra -> &trad - case 8633: state = 8664; break; // &tri -> &trid - case 8638: state = 8640; break; // &triangle -> &triangled - case 8745: state = 8746; break; // &twohea -> &twohead - case 8768: state = 8834; break; // &U -> &Ud - case 8775: state = 8829; break; // &u -> &ud - case 8916: state = 8917; break; // &Un -> &Und - case 8970: state = 9014; break; // &Up -> &Upd - case 8983: state = 9024; break; // &up -> &upd - case 9161: state = 9162; break; // &ut -> &utd - case 9168: state = 9169; break; // &Util -> &Utild - case 9173: state = 9174; break; // &util -> &utild - case 9201: state = 9335; break; // &v -> &vd - case 9303: state = 9325; break; // &V -> &Vd - case 9399: state = 9400; break; // &VerticalTil -> &VerticalTild - case 9471: state = 9472; break; // &Vv -> &Vvd - case 9496: state = 9497; break; // &we -> &wed - case 9502: state = 9503; break; // &We -> &Wed - case 9548: state = 9560; break; // &x -> &xd - case 9602: state = 9603; break; // &xo -> &xod - case 9660: state = 9661; break; // &xwe -> &xwed - case 9747: state = 9777; break; // &Z -> &Zd - case 9754: state = 9781; break; // &z -> &zd - case 9795: state = 9796; break; // &ZeroWi -> &ZeroWid - default: return false; - } - break; - case 'e': - switch (state) { - case 0: state = 2115; break; // & -> &e - case 5: state = 6; break; // &Aacut -> Á - case 8: state = 55; break; // &a -> &ae - case 12: state = 13; break; // &aacut -> á - case 16: state = 17; break; // &Abr -> &Abre - case 18: state = 19; break; // &Abrev -> &Abreve - case 22: state = 23; break; // &abr -> &abre - case 24: state = 25; break; // &abrev -> &abreve - case 43: state = 44; break; // &acut -> ´ - case 70: state = 71; break; // &Agrav -> À - case 76: state = 77; break; // &agrav -> à - case 79: state = 80; break; // &al -> &ale - case 131: state = 132; break; // &andslop -> &andslope - case 136: state = 138; break; // &ang -> &ange - case 140: state = 141; break; // &angl -> &angle - case 147: state = 156; break; // &angmsda -> &angmsdae - case 199: state = 208; break; // &ap -> &ape - case 232: state = 234; break; // &approx -> &approxe - case 264: state = 266; break; // &asymp -> &asympe - case 272: state = 273; break; // &Atild -> à - case 278: state = 279; break; // &atild -> ã - case 301: state = 384; break; // &b -> &be - case 304: state = 310; break; // &back -> &backe - case 321: state = 322; break; // &backprim -> &backprime - case 326: state = 328; break; // &backsim -> &backsime - case 331: state = 390; break; // &B -> &Be - case 345: state = 346; break; // &barv -> &barve - case 346: state = 347; break; // &barve -> &barvee - case 349: state = 350; break; // &Barw -> &Barwe - case 353: state = 354; break; // &barw -> &barwe - case 357: state = 358; break; // &barwedg -> &barwedge - case 388: state = 397; break; // &becaus -> &because - case 394: state = 395; break; // &Becaus -> &Because - case 431: state = 432; break; // &betw -> &betwe - case 432: state = 433; break; // &betwe -> &betwee - case 467: state = 468; break; // &bigotim -> &bigotime - case 487: state = 488; break; // &bigtriangl -> &bigtriangle - case 503: state = 504; break; // &bigv -> &bigve - case 504: state = 505; break; // &bigve -> &bigvee - case 507: state = 508; break; // &bigw -> &bigwe - case 510: state = 511; break; // &bigwedg -> &bigwedge - case 525: state = 526; break; // &blackloz -> &blackloze - case 528: state = 529; break; // &blacklozeng -> &blacklozenge - case 535: state = 536; break; // &blacksquar -> &blacksquare - case 544: state = 545; break; // &blacktriangl -> &blacktriangle - case 552: state = 553; break; // &blacktrianglel -> &blacktrianglele - case 579: state = 580; break; // &bn -> &bne - case 610: state = 611; break; // &bowti -> &bowtie - case 669: state = 670; break; // &boxtim -> &boxtime - case 722: state = 723; break; // &bprim -> &bprime - case 725: state = 726; break; // &Br -> &Bre - case 727: state = 728; break; // &Brev -> &Breve - case 730: state = 731; break; // &br -> &bre - case 732: state = 733; break; // &brev -> &breve - case 744: state = 748; break; // &bs -> &bse - case 753: state = 755; break; // &bsim -> &bsime - case 769: state = 771; break; // &bull -> &bulle - case 775: state = 779; break; // &bump -> &bumpe - case 783: state = 784; break; // &Bump -> &Bumpe - case 789: state = 920; break; // &C -> &Ce - case 793: state = 794; break; // &Cacut -> &Cacute - case 796: state = 915; break; // &c -> &ce - case 800: state = 801; break; // &cacut -> &cacute - case 835: state = 836; break; // &CapitalDiff -> &CapitalDiffe - case 837: state = 838; break; // &CapitalDiffer -> &CapitalDiffere - case 848: state = 849; break; // &car -> &care - case 856: state = 857; break; // &Cayl -> &Cayle - case 861: state = 881; break; // &cc -> &cce - case 866: state = 876; break; // &Cc -> &Cce - case 934: state = 944; break; // ¢ -> ¢e - case 937: state = 938; break; // &Cent -> &Cente - case 960: state = 964; break; // &ch -> &che - case 979: state = 1051; break; // &cir -> &cire - case 981: state = 983; break; // &circ -> &circe - case 986: state = 987; break; // &circl -> &circle - case 993: state = 994; break; // &circlearrowl -> &circlearrowle - case 1022: state = 1023; break; // &Circl -> &Circle - case 1045: state = 1046; break; // &CircleTim -> &CircleTime - case 1074: state = 1075; break; // &Clockwis -> &Clockwise - case 1085: state = 1086; break; // &ClockwiseContourInt -> &ClockwiseContourInte - case 1092: state = 1093; break; // &Clos -> &Close - case 1103: state = 1104; break; // &CloseCurlyDoubl -> &CloseCurlyDouble - case 1108: state = 1109; break; // &CloseCurlyDoubleQuot -> &CloseCurlyDoubleQuote - case 1114: state = 1115; break; // &CloseCurlyQuot -> &CloseCurlyQuote - case 1129: state = 1136; break; // &Colon -> &Colone - case 1134: state = 1138; break; // &colon -> &colone - case 1153: state = 1154; break; // &compl -> &comple - case 1155: state = 1156; break; // &complem -> &compleme - case 1160: state = 1161; break; // &complex -> &complexe - case 1174: state = 1175; break; // &Congru -> &Congrue - case 1193: state = 1194; break; // &ContourInt -> &ContourInte - case 1228: state = 1229; break; // &Count -> &Counte - case 1238: state = 1239; break; // &CounterClockwis -> &CounterClockwise - case 1249: state = 1250; break; // &CounterClockwiseContourInt -> &CounterClockwiseContourInte - case 1279: state = 1281; break; // &csub -> &csube - case 1283: state = 1285; break; // &csup -> &csupe - case 1292: state = 1301; break; // &cu -> &cue - case 1354: state = 1355; break; // &curly -> &curlye - case 1358: state = 1359; break; // &curlyeqpr -> &curlyeqpre - case 1367: state = 1368; break; // &curlyv -> &curlyve - case 1368: state = 1369; break; // &curlyve -> &curlyvee - case 1371: state = 1372; break; // &curlyw -> &curlywe - case 1374: state = 1375; break; // &curlywedg -> &curlywedge - case 1377: state = 1378; break; // &curr -> &curre - case 1381: state = 1382; break; // &curv -> &curve - case 1388: state = 1389; break; // &curvearrowl -> &curvearrowle - case 1399: state = 1400; break; // &cuv -> &cuve - case 1400: state = 1401; break; // &cuve -> &cuvee - case 1403: state = 1404; break; // &cuw -> &cuwe - case 1425: state = 1519; break; // &D -> &De - case 1428: state = 1429; break; // &Dagg -> &Dagge - case 1432: state = 1516; break; // &d -> &de - case 1435: state = 1436; break; // &dagg -> &dagge - case 1439: state = 1440; break; // &dal -> &dale - case 1496: state = 1497; break; // &ddagg -> &ddagge - case 1512: state = 1513; break; // &ddots -> &ddotse - case 1570: state = 1571; break; // &DiacriticalAcut -> &DiacriticalAcute - case 1579: state = 1580; break; // &DiacriticalDoubl -> &DiacriticalDouble - case 1584: state = 1585; break; // &DiacriticalDoubleAcut -> &DiacriticalDoubleAcute - case 1590: state = 1591; break; // &DiacriticalGrav -> &DiacriticalGrave - case 1596: state = 1597; break; // &DiacriticalTild -> &DiacriticalTilde - case 1599: state = 1619; break; // &di -> &die - case 1622: state = 1623; break; // &Diff -> &Diffe - case 1624: state = 1625; break; // &Differ -> &Differe - case 1646: state = 1647; break; // &divid -> ÷ - case 1653: state = 1654; break; // ÷ontim -> ÷ontime - case 1694: state = 1700; break; // &dot -> &dote - case 1728: state = 1729; break; // &dotsquar -> &dotsquare - case 1733: state = 1734; break; // &doubl -> &double - case 1738: state = 1739; break; // &doublebarw -> &doublebarwe - case 1741: state = 1742; break; // &doublebarwedg -> &doublebarwedge - case 1746: state = 1747; break; // &Doubl -> &Double - case 1757: state = 1758; break; // &DoubleContourInt -> &DoubleContourInte - case 1776: state = 1777; break; // &DoubleL -> &DoubleLe - case 1797: state = 1798; break; // &DoubleLeftT -> &DoubleLeftTe - case 1798: state = 1799; break; // &DoubleLeftTe -> &DoubleLeftTee - case 1804: state = 1805; break; // &DoubleLongL -> &DoubleLongLe - case 1847: state = 1848; break; // &DoubleRightT -> &DoubleRightTe - case 1848: state = 1849; break; // &DoubleRightTe -> &DoubleRightTee - case 1869: state = 1870; break; // &DoubleV -> &DoubleVe - case 1916: state = 1917; break; // &DownBr -> &DownBre - case 1918: state = 1919; break; // &DownBrev -> &DownBreve - case 1939: state = 1940; break; // &downharpoonl -> &downharpoonle - case 1950: state = 1951; break; // &DownL -> &DownLe - case 1959: state = 1960; break; // &DownLeftRightV -> &DownLeftRightVe - case 1966: state = 1967; break; // &DownLeftT -> &DownLeftTe - case 1967: state = 1968; break; // &DownLeftTe -> &DownLeftTee - case 1969: state = 1970; break; // &DownLeftTeeV -> &DownLeftTeeVe - case 1976: state = 1977; break; // &DownLeftV -> &DownLeftVe - case 1992: state = 1993; break; // &DownRightT -> &DownRightTe - case 1993: state = 1994; break; // &DownRightTe -> &DownRightTee - case 1995: state = 1996; break; // &DownRightTeeV -> &DownRightTeeVe - case 2002: state = 2003; break; // &DownRightV -> &DownRightVe - case 2013: state = 2014; break; // &DownT -> &DownTe - case 2014: state = 2015; break; // &DownTe -> &DownTee - case 2090: state = 2091; break; // &dwangl -> &dwangle - case 2112: state = 2113; break; // &Eacut -> É - case 2115: state = 2173; break; // &e -> &ee - case 2119: state = 2120; break; // &eacut -> é - case 2123: state = 2124; break; // &east -> &easte - case 2190: state = 2191; break; // &Egrav -> È - case 2195: state = 2196; break; // &egrav -> è - case 2206: state = 2207; break; // &El -> &Ele - case 2208: state = 2209; break; // &Elem -> &Eleme - case 2215: state = 2216; break; // &elint -> &elinte - case 2242: state = 2243; break; // &emptys -> &emptyse - case 2258: state = 2259; break; // &EmptySmallSquar -> &EmptySmallSquare - case 2263: state = 2264; break; // &EmptyV -> &EmptyVe - case 2276: state = 2277; break; // &EmptyVerySmallSquar -> &EmptyVerySmallSquare - case 2362: state = 2363; break; // &eqslantl -> &eqslantle - case 2372: state = 2383; break; // &equ -> &eque - case 2380: state = 2381; break; // &EqualTild -> &EqualTilde - case 2472: state = 2473; break; // &exp -> &expe - case 2484: state = 2485; break; // &Expon -> &Expone - case 2494: state = 2495; break; // &expon -> &expone - case 2500: state = 2501; break; // &exponential -> &exponentiale - case 2503: state = 2524; break; // &f -> &fe - case 2513: state = 2514; break; // &fallingdots -> &fallingdotse - case 2527: state = 2528; break; // &femal -> &female - case 2556: state = 2557; break; // &Fill -> &Fille - case 2568: state = 2569; break; // &FilledSmallSquar -> &FilledSmallSquare - case 2571: state = 2572; break; // &FilledV -> &FilledVe - case 2584: state = 2585; break; // &FilledVerySmallSquar -> &FilledVerySmallSquare - case 2632: state = 2633; break; // &Fouri -> &Fourie - case 2701: state = 2765; break; // &g -> &ge - case 2705: state = 2706; break; // &gacut -> &gacute - case 2725: state = 2726; break; // &Gbr -> &Gbre - case 2727: state = 2728; break; // &Gbrev -> &Gbreve - case 2731: state = 2732; break; // &gbr -> &gbre - case 2733: state = 2734; break; // &gbrev -> &gbreve - case 2736: state = 2737; break; // &Gc -> &Gce - case 2794: state = 2796; break; // &gesl -> &gesle - case 2812: state = 2813; break; // &gim -> &gime - case 2832: state = 2843; break; // &gn -> &gne - case 2863: state = 2864; break; // &grav -> &grave - case 2866: state = 2867; break; // &Gr -> &Gre - case 2869: state = 2870; break; // &Great -> &Greate - case 2878: state = 2879; break; // &GreaterEqualL -> &GreaterEqualLe - case 2894: state = 2895; break; // &GreaterGr -> &GreaterGre - case 2897: state = 2898; break; // &GreaterGreat -> &GreaterGreate - case 2901: state = 2902; break; // &GreaterL -> &GreaterLe - case 2920: state = 2921; break; // &GreaterTild -> &GreaterTilde - case 2932: state = 2934; break; // &gsim -> &gsime - case 2960: state = 2961; break; // >qu -> >que - case 2965: state = 2980; break; // >r -> >re - case 2982: state = 2983; break; // >reql -> >reqle - case 2988: state = 2989; break; // >reqql -> >reqqle - case 2993: state = 2994; break; // >rl -> >rle - case 3002: state = 3003; break; // &gv -> &gve - case 3006: state = 3007; break; // &gvertn -> &gvertne - case 3016: state = 3017; break; // &Hac -> &Hace - case 3020: state = 3074; break; // &h -> &he - case 3102: state = 3103; break; // &Hilb -> &Hilbe - case 3109: state = 3110; break; // &HilbertSpac -> &HilbertSpace - case 3113: state = 3114; break; // &hks -> &hkse - case 3138: state = 3139; break; // &hookl -> &hookle - case 3181: state = 3182; break; // &HorizontalLin -> &HorizontalLine - case 3232: state = 3233; break; // &hyph -> &hyphe - case 3240: state = 3241; break; // &Iacut -> Í - case 3243: state = 3273; break; // &i -> &ie - case 3247: state = 3248; break; // &iacut -> í - case 3292: state = 3293; break; // &Igrav -> Ì - case 3298: state = 3299; break; // &igrav -> ì - case 3341: state = 3342; break; // &imag -> &image - case 3354: state = 3355; break; // &imaglin -> &imagline - case 3368: state = 3369; break; // &imp -> &impe - case 3374: state = 3375; break; // &Impli -> &Implie - case 3382: state = 3383; break; // &incar -> &incare - case 3390: state = 3391; break; // &infinti -> &infintie - case 3399: state = 3413; break; // &Int -> &Inte - case 3401: state = 3407; break; // &int -> &inte - case 3408: state = 3409; break; // &integ -> &intege - case 3425: state = 3426; break; // &Inters -> &Interse - case 3449: state = 3450; break; // &Invisibl -> &Invisible - case 3459: state = 3460; break; // &InvisibleTim -> &InvisibleTime - case 3498: state = 3499; break; // &iqu -> &ique - case 3531: state = 3532; break; // &Itild -> &Itilde - case 3536: state = 3537; break; // &itild -> &itilde - case 3590: state = 3598; break; // &Js -> &Jse - case 3594: state = 3603; break; // &js -> &jse - case 3632: state = 3633; break; // &Kc -> &Kce - case 3638: state = 3639; break; // &kc -> &kce - case 3655: state = 3656; break; // &kgr -> &kgre - case 3656: state = 3657; break; // &kgre -> &kgree - case 3692: state = 3896; break; // &l -> &le - case 3698: state = 3898; break; // &L -> &Le - case 3702: state = 3703; break; // &Lacut -> &Lacute - case 3705: state = 3711; break; // &la -> &lae - case 3708: state = 3709; break; // &lacut -> &lacute - case 3741: state = 3742; break; // &langl -> &langle - case 3749: state = 3750; break; // &Laplac -> &Laplace - case 3792: state = 3803; break; // &lat -> &late - case 3823: state = 3824; break; // &lbrac -> &lbrace - case 3828: state = 3829; break; // &lbrk -> &lbrke - case 3837: state = 3849; break; // &Lc -> &Lce - case 3843: state = 3854; break; // &lc -> &lce - case 3904: state = 3905; break; // &LeftAngl -> &LeftAngle - case 3910: state = 3911; break; // &LeftAngleBrack -> &LeftAngleBracke - case 3953: state = 3954; break; // &LeftC -> &LeftCe - case 3965: state = 3966; break; // &LeftDoubl -> &LeftDouble - case 3971: state = 3972; break; // &LeftDoubleBrack -> &LeftDoubleBracke - case 3977: state = 3978; break; // &LeftDownT -> &LeftDownTe - case 3978: state = 3979; break; // &LeftDownTe -> &LeftDownTee - case 3980: state = 3981; break; // &LeftDownTeeV -> &LeftDownTeeVe - case 3987: state = 3988; break; // &LeftDownV -> &LeftDownVe - case 4019: state = 4020; break; // &leftl -> &leftle - case 4085: state = 4086; break; // &LeftRightV -> &LeftRightVe - case 4092: state = 4093; break; // &LeftT -> &LeftTe - case 4093: state = 4094; break; // &LeftTe -> &LeftTee - case 4102: state = 4103; break; // &LeftTeeV -> &LeftTeeVe - case 4111: state = 4112; break; // &leftthr -> &leftthre - case 4112: state = 4113; break; // &leftthre -> &leftthree - case 4116: state = 4117; break; // &leftthreetim -> &leftthreetime - case 4125: state = 4126; break; // &LeftTriangl -> &LeftTriangle - case 4144: state = 4145; break; // &LeftUpDownV -> &LeftUpDownVe - case 4151: state = 4152; break; // &LeftUpT -> &LeftUpTe - case 4152: state = 4153; break; // &LeftUpTe -> &LeftUpTee - case 4154: state = 4155; break; // &LeftUpTeeV -> &LeftUpTeeVe - case 4161: state = 4162; break; // &LeftUpV -> &LeftUpVe - case 4172: state = 4173; break; // &LeftV -> &LeftVe - case 4210: state = 4212; break; // &lesg -> &lesge - case 4215: state = 4227; break; // &less -> &lesse - case 4246: state = 4247; break; // &LessEqualGr -> &LessEqualGre - case 4249: state = 4250; break; // &LessEqualGreat -> &LessEqualGreate - case 4264: state = 4265; break; // &LessGr -> &LessGre - case 4267: state = 4268; break; // &LessGreat -> &LessGreate - case 4275: state = 4276; break; // &LessL -> &LessLe - case 4298: state = 4299; break; // &LessTild -> &LessTilde - case 4346: state = 4361; break; // &Ll -> &Lle - case 4357: state = 4358; break; // &llcorn -> &llcorne - case 4398: state = 4399; break; // &lmoustach -> &lmoustache - case 4401: state = 4412; break; // &ln -> &lne - case 4437: state = 4438; break; // &LongL -> &LongLe - case 4447: state = 4448; break; // &Longl -> &Longle - case 4459: state = 4460; break; // &longl -> &longle - case 4549: state = 4550; break; // &looparrowl -> &looparrowle - case 4575: state = 4576; break; // &lotim -> &lotime - case 4588: state = 4589; break; // &Low -> &Lowe - case 4591: state = 4592; break; // &LowerL -> &LowerLe - case 4612: state = 4614; break; // &loz -> &loze - case 4616: state = 4617; break; // &lozeng -> &lozenge - case 4636: state = 4637; break; // &lrcorn -> &lrcorne - case 4670: state = 4672; break; // &lsim -> &lsime - case 4711: state = 4712; break; // <hr -> <hre - case 4712: state = 4713; break; // <hre -> <hree - case 4716: state = 4717; break; // <im -> <ime - case 4726: state = 4727; break; // <qu -> <que - case 4732: state = 4734; break; // <ri -> <rie - case 4755: state = 4756; break; // &lv -> &lve - case 4759: state = 4760; break; // &lvertn -> &lvertne - case 4767: state = 4830; break; // &m -> &me - case 4772: state = 4773; break; // &mal -> &male - case 4775: state = 4777; break; // &malt -> &malte - case 4778: state = 4779; break; // &maltes -> &maltese - case 4781: state = 4843; break; // &M -> &Me - case 4796: state = 4797; break; // &mapstol -> &mapstole - case 4805: state = 4806; break; // &mark -> &marke - case 4834: state = 4835; break; // &measur -> &measure - case 4840: state = 4841; break; // &measuredangl -> &measuredangle - case 4851: state = 4852; break; // &MediumSpac -> &MediumSpace - case 4923: state = 4924; break; // &mod -> &mode - case 4965: state = 5064; break; // &n -> &ne - case 4971: state = 5084; break; // &N -> &Ne - case 4975: state = 4976; break; // &Nacut -> &Nacute - case 4980: state = 4981; break; // &nacut -> &nacute - case 5016: state = 5018; break; // &nbump -> &nbumpe - case 5020: state = 5039; break; // &nc -> &nce - case 5024: state = 5034; break; // &Nc -> &Nce - case 5089: state = 5090; break; // &Negativ -> &Negative - case 5091: state = 5092; break; // &NegativeM -> &NegativeMe - case 5100: state = 5101; break; // &NegativeMediumSpac -> &NegativeMediumSpace - case 5111: state = 5112; break; // &NegativeThickSpac -> &NegativeThickSpace - case 5118: state = 5119; break; // &NegativeThinSpac -> &NegativeThinSpace - case 5121: state = 5122; break; // &NegativeV -> &NegativeVe - case 5132: state = 5133; break; // &NegativeVeryThinSpac -> &NegativeVeryThinSpace - case 5140: state = 5141; break; // &nes -> &nese - case 5149: state = 5150; break; // &Nest -> &Neste - case 5153: state = 5154; break; // &NestedGr -> &NestedGre - case 5156: state = 5157; break; // &NestedGreat -> &NestedGreate - case 5160: state = 5161; break; // &NestedGreaterGr -> &NestedGreaterGre - case 5163: state = 5164; break; // &NestedGreaterGreat -> &NestedGreaterGreate - case 5167: state = 5168; break; // &NestedL -> &NestedLe - case 5171: state = 5172; break; // &NestedLessL -> &NestedLessLe - case 5179: state = 5180; break; // &NewLin -> &NewLine - case 5195: state = 5198; break; // &ng -> &nge - case 5256: state = 5270; break; // &nl -> &nle - case 5272: state = 5273; break; // &nL -> &nLe - case 5337: state = 5339; break; // &nltri -> &nltrie - case 5349: state = 5350; break; // &NoBr -> &NoBre - case 5356: state = 5357; break; // &NonBr -> &NonBre - case 5366: state = 5367; break; // &NonBreakingSpac -> &NonBreakingSpace - case 5385: state = 5386; break; // &NotCongru -> &NotCongrue - case 5400: state = 5401; break; // &NotDoubl -> &NotDouble - case 5402: state = 5403; break; // &NotDoubleV -> &NotDoubleVe - case 5415: state = 5416; break; // &NotEl -> &NotEle - case 5417: state = 5418; break; // &NotElem -> &NotEleme - case 5430: state = 5431; break; // &NotEqualTild -> &NotEqualTilde - case 5440: state = 5441; break; // &NotGr -> &NotGre - case 5443: state = 5444; break; // &NotGreat -> &NotGreate - case 5464: state = 5465; break; // &NotGreaterGr -> &NotGreaterGre - case 5467: state = 5468; break; // &NotGreaterGreat -> &NotGreaterGreate - case 5471: state = 5472; break; // &NotGreaterL -> &NotGreaterLe - case 5490: state = 5491; break; // &NotGreaterTild -> &NotGreaterTilde - case 5528: state = 5529; break; // &NotL -> &NotLe - case 5538: state = 5539; break; // &NotLeftTriangl -> &NotLeftTriangle - case 5561: state = 5562; break; // &NotLessGr -> &NotLessGre - case 5564: state = 5565; break; // &NotLessGreat -> &NotLessGreate - case 5568: state = 5569; break; // &NotLessL -> &NotLessLe - case 5587: state = 5588; break; // &NotLessTild -> &NotLessTilde - case 5590: state = 5591; break; // &NotN -> &NotNe - case 5593: state = 5594; break; // &NotNest -> &NotNeste - case 5597: state = 5598; break; // &NotNestedGr -> &NotNestedGre - case 5600: state = 5601; break; // &NotNestedGreat -> &NotNestedGreate - case 5604: state = 5605; break; // &NotNestedGreaterGr -> &NotNestedGreaterGre - case 5607: state = 5608; break; // &NotNestedGreaterGreat -> &NotNestedGreaterGreate - case 5611: state = 5612; break; // &NotNestedL -> &NotNestedLe - case 5615: state = 5616; break; // &NotNestedLessL -> &NotNestedLessLe - case 5631: state = 5632; break; // &NotPr -> &NotPre - case 5633: state = 5634; break; // &NotPrec -> &NotPrece - case 5635: state = 5636; break; // &NotPreced -> &NotPrecede - case 5656: state = 5657; break; // &NotR -> &NotRe - case 5658: state = 5659; break; // &NotRev -> &NotReve - case 5661: state = 5662; break; // &NotRevers -> &NotReverse - case 5664: state = 5665; break; // &NotReverseEl -> &NotReverseEle - case 5666: state = 5667; break; // &NotReverseElem -> &NotReverseEleme - case 5681: state = 5682; break; // &NotRightTriangl -> &NotRightTriangle - case 5698: state = 5699; break; // &NotSquar -> &NotSquare - case 5703: state = 5704; break; // &NotSquareSubs -> &NotSquareSubse - case 5713: state = 5714; break; // &NotSquareSup -> &NotSquareSupe - case 5716: state = 5717; break; // &NotSquareSupers -> &NotSquareSuperse - case 5728: state = 5729; break; // &NotSubs -> &NotSubse - case 5739: state = 5740; break; // &NotSucc -> &NotSucce - case 5740: state = 5741; break; // &NotSucce -> &NotSuccee - case 5765: state = 5766; break; // &NotSucceedsTild -> &NotSucceedsTilde - case 5768: state = 5769; break; // &NotSup -> &NotSupe - case 5771: state = 5772; break; // &NotSupers -> &NotSuperse - case 5784: state = 5785; break; // &NotTild -> &NotTilde - case 5806: state = 5807; break; // &NotTildeTild -> &NotTildeTilde - case 5809: state = 5810; break; // &NotV -> &NotVe - case 5827: state = 5828; break; // &nparall -> &nparalle - case 5842: state = 5848; break; // &npr -> &npre - case 5845: state = 5846; break; // &nprcu -> &nprcue - case 5850: state = 5852; break; // &nprec -> &nprece - case 5891: state = 5893; break; // &nrtri -> &nrtrie - case 5896: state = 5902; break; // &nsc -> &nsce - case 5899: state = 5900; break; // &nsccu -> &nsccue - case 5923: state = 5924; break; // &nshortparall -> &nshortparalle - case 5928: state = 5930; break; // &nsim -> &nsime - case 5945: state = 5946; break; // &nsqsub -> &nsqsube - case 5948: state = 5949; break; // &nsqsup -> &nsqsupe - case 5952: state = 5956; break; // &nsub -> &nsube - case 5958: state = 5959; break; // &nsubs -> &nsubse - case 5960: state = 5962; break; // &nsubset -> &nsubsete - case 5968: state = 5970; break; // &nsucc -> &nsucce - case 5973: state = 5977; break; // &nsup -> &nsupe - case 5979: state = 5980; break; // &nsups -> &nsupse - case 5981: state = 5983; break; // &nsupset -> &nsupsete - case 5995: state = 5996; break; // &Ntild -> Ñ - case 6000: state = 6001; break; // &ntild -> ñ - case 6011: state = 6012; break; // &ntriangl -> &ntriangle - case 6013: state = 6014; break; // &ntrianglel -> &ntrianglele - case 6016: state = 6018; break; // &ntriangleleft -> &ntrianglelefte - case 6025: state = 6027; break; // &ntriangleright -> &ntrianglerighte - case 6034: state = 6036; break; // &num -> &nume - case 6068: state = 6069; break; // &nvg -> &nvge - case 6084: state = 6089; break; // &nvl -> &nvle - case 6094: state = 6095; break; // &nvltri -> &nvltrie - case 6104: state = 6105; break; // &nvrtri -> &nvrtrie - case 6126: state = 6127; break; // &nwn -> &nwne - case 6135: state = 6136; break; // &Oacut -> Ó - case 6138: state = 6195; break; // &o -> &oe - case 6142: state = 6143; break; // &oacut -> ó - case 6217: state = 6218; break; // &Ograv -> Ò - case 6222: state = 6223; break; // &ograv -> ò - case 6253: state = 6254; break; // &olin -> &oline - case 6258: state = 6268; break; // &Om -> &Ome - case 6263: state = 6272; break; // &om -> &ome - case 6302: state = 6332; break; // &op -> &ope - case 6306: state = 6307; break; // &Op -> &Ope - case 6318: state = 6319; break; // &OpenCurlyDoubl -> &OpenCurlyDouble - case 6323: state = 6324; break; // &OpenCurlyDoubleQuot -> &OpenCurlyDoubleQuote - case 6329: state = 6330; break; // &OpenCurlyQuot -> &OpenCurlyQuote - case 6348: state = 6350; break; // &ord -> &orde - case 6371: state = 6372; break; // &orslop -> &orslope - case 6402: state = 6403; break; // &Otild -> Õ - case 6408: state = 6409; break; // &otild -> õ - case 6411: state = 6412; break; // &Otim -> &Otime - case 6415: state = 6416; break; // &otim -> &otime - case 6435: state = 6436; break; // &Ov -> &Ove - case 6444: state = 6445; break; // &OverBrac -> &OverBrace - case 6447: state = 6448; break; // &OverBrack -> &OverBracke - case 6453: state = 6454; break; // &OverPar -> &OverPare - case 6457: state = 6458; break; // &OverParenth -> &OverParenthe - case 6463: state = 6497; break; // &p -> &pe - case 6470: state = 6471; break; // ¶ll -> ¶lle - case 6513: state = 6514; break; // &pert -> &perte - case 6538: state = 6539; break; // &phon -> &phone - case 6567: state = 6585; break; // &plus -> &pluse - case 6614: state = 6615; break; // &Poincar -> &Poincare - case 6619: state = 6620; break; // &Poincareplan -> &Poincareplane - case 6640: state = 6672; break; // &Pr -> &Pre - case 6642: state = 6653; break; // &pr -> &pre - case 6648: state = 6649; break; // &prcu -> &prcue - case 6655: state = 6702; break; // &prec -> &prece - case 6668: state = 6669; break; // &preccurly -> &preccurlye - case 6673: state = 6674; break; // &Prec -> &Prece - case 6675: state = 6676; break; // &Preced -> &Precede - case 6699: state = 6700; break; // &PrecedesTild -> &PrecedesTilde - case 6705: state = 6713; break; // &precn -> &precne - case 6726: state = 6727; break; // &Prim -> &Prime - case 6730: state = 6731; break; // &prim -> &prime - case 6762: state = 6763; break; // &proflin -> &profline - case 6791: state = 6792; break; // &prur -> &prure - case 6836: state = 6837; break; // &qprim -> &qprime - case 6847: state = 6862; break; // &qu -> &que - case 6849: state = 6850; break; // &quat -> &quate - case 6864: state = 6866; break; // &quest -> &queste - case 6876: state = 7074; break; // &r -> &re - case 6882: state = 6901; break; // &ra -> &rae - case 6883: state = 6884; break; // &rac -> &race - case 6886: state = 7072; break; // &R -> &Re - case 6890: state = 6891; break; // &Racut -> &Racute - case 6894: state = 6895; break; // &racut -> &racute - case 6912: state = 6916; break; // &rang -> &range - case 6918: state = 6919; break; // &rangl -> &rangle - case 7007: state = 7008; break; // &rbrac -> &rbrace - case 7012: state = 7013; break; // &rbrk -> &rbrke - case 7021: state = 7033; break; // &Rc -> &Rce - case 7027: state = 7038; break; // &rc -> &rce - case 7079: state = 7080; break; // &realin -> &realine - case 7097: state = 7098; break; // &Rev -> &Reve - case 7100: state = 7101; break; // &Revers -> &Reverse - case 7103: state = 7104; break; // &ReverseEl -> &ReverseEle - case 7105: state = 7106; break; // &ReverseElem -> &ReverseEleme - case 7178: state = 7179; break; // &RightAngl -> &RightAngle - case 7184: state = 7185; break; // &RightAngleBrack -> &RightAngleBracke - case 7213: state = 7214; break; // &RightArrowL -> &RightArrowLe - case 7228: state = 7229; break; // &RightC -> &RightCe - case 7240: state = 7241; break; // &RightDoubl -> &RightDouble - case 7246: state = 7247; break; // &RightDoubleBrack -> &RightDoubleBracke - case 7252: state = 7253; break; // &RightDownT -> &RightDownTe - case 7253: state = 7254; break; // &RightDownTe -> &RightDownTee - case 7255: state = 7256; break; // &RightDownTeeV -> &RightDownTeeVe - case 7262: state = 7263; break; // &RightDownV -> &RightDownVe - case 7294: state = 7295; break; // &rightl -> &rightle - case 7337: state = 7338; break; // &RightT -> &RightTe - case 7338: state = 7339; break; // &RightTe -> &RightTee - case 7347: state = 7348; break; // &RightTeeV -> &RightTeeVe - case 7356: state = 7357; break; // &rightthr -> &rightthre - case 7357: state = 7358; break; // &rightthre -> &rightthree - case 7361: state = 7362; break; // &rightthreetim -> &rightthreetime - case 7370: state = 7371; break; // &RightTriangl -> &RightTriangle - case 7389: state = 7390; break; // &RightUpDownV -> &RightUpDownVe - case 7396: state = 7397; break; // &RightUpT -> &RightUpTe - case 7397: state = 7398; break; // &RightUpTe -> &RightUpTee - case 7399: state = 7400; break; // &RightUpTeeV -> &RightUpTeeVe - case 7406: state = 7407; break; // &RightUpV -> &RightUpVe - case 7417: state = 7418; break; // &RightV -> &RightVe - case 7438: state = 7439; break; // &risingdots -> &risingdotse - case 7461: state = 7462; break; // &rmoustach -> &rmoustache - case 7497: state = 7498; break; // &rotim -> &rotime - case 7508: state = 7509; break; // &RoundImpli -> &RoundImplie - case 7569: state = 7570; break; // &rthr -> &rthre - case 7570: state = 7571; break; // &rthre -> &rthree - case 7574: state = 7575; break; // &rtim -> &rtime - case 7579: state = 7581; break; // &rtri -> &rtrie - case 7591: state = 7592; break; // &Rul -> &Rule - case 7593: state = 7594; break; // &RuleD -> &RuleDe - case 7597: state = 7598; break; // &RuleDelay -> &RuleDelaye - case 7614: state = 7615; break; // &Sacut -> &Sacute - case 7617: state = 7703; break; // &s -> &se - case 7621: state = 7622; break; // &sacut -> &sacute - case 7629: state = 7653; break; // &Sc -> &Sce - case 7631: state = 7651; break; // &sc -> &sce - case 7646: state = 7647; break; // &sccu -> &sccue - case 7697: state = 7701; break; // &sdot -> &sdote - case 7786: state = 7787; break; // &ShortL -> &ShortLe - case 7808: state = 7809; break; // &shortparall -> &shortparalle - case 7847: state = 7853; break; // &sim -> &sime - case 7865: state = 7866; break; // &simn -> &simne - case 7891: state = 7892; break; // &SmallCircl -> &SmallCircle - case 7894: state = 7911; break; // &sm -> &sme - case 7898: state = 7899; break; // &smalls -> &smallse - case 7921: state = 7922; break; // &smil -> &smile - case 7924: state = 7926; break; // &smt -> &smte - case 7958: state = 7959; break; // &spad -> &spade - case 7986: state = 7988; break; // &sqsub -> &sqsube - case 7990: state = 7991; break; // &sqsubs -> &sqsubse - case 7992: state = 7994; break; // &sqsubset -> &sqsubsete - case 7997: state = 7999; break; // &sqsup -> &sqsupe - case 8001: state = 8002; break; // &sqsups -> &sqsupse - case 8003: state = 8005; break; // &sqsupset -> &sqsupsete - case 8012: state = 8013; break; // &Squar -> &Square - case 8016: state = 8017; break; // &squar -> &square - case 8021: state = 8022; break; // &SquareInt -> &SquareInte - case 8024: state = 8025; break; // &SquareInters -> &SquareInterse - case 8035: state = 8036; break; // &SquareSubs -> &SquareSubse - case 8045: state = 8046; break; // &SquareSup -> &SquareSupe - case 8048: state = 8049; break; // &SquareSupers -> &SquareSuperse - case 8077: state = 8081; break; // &ss -> &sse - case 8088: state = 8089; break; // &ssmil -> &ssmile - case 8111: state = 8112; break; // &straight -> &straighte - case 8131: state = 8139; break; // &sub -> &sube - case 8150: state = 8153; break; // &subn -> &subne - case 8165: state = 8166; break; // &Subs -> &Subse - case 8169: state = 8170; break; // &subs -> &subse - case 8171: state = 8173; break; // &subset -> &subsete - case 8184: state = 8185; break; // &subsetn -> &subsetne - case 8199: state = 8246; break; // &succ -> &succe - case 8212: state = 8213; break; // &succcurly -> &succcurlye - case 8217: state = 8218; break; // &Succ -> &Succe - case 8218: state = 8219; break; // &Succe -> &Succee - case 8243: state = 8244; break; // &SucceedsTild -> &SucceedsTilde - case 8249: state = 8257; break; // &succn -> &succne - case 8282: state = 8308; break; // &Sup -> &Supe - case 8284: state = 8302; break; // &sup -> &supe - case 8310: state = 8311; break; // &Supers -> &Superse - case 8338: state = 8341; break; // &supn -> &supne - case 8348: state = 8349; break; // &Sups -> &Supse - case 8352: state = 8353; break; // &sups -> &supse - case 8354: state = 8356; break; // &supset -> &supsete - case 8361: state = 8362; break; // &supsetn -> &supsetne - case 8404: state = 8449; break; // &t -> &te - case 8407: state = 8408; break; // &targ -> &targe - case 8419: state = 8431; break; // &Tc -> &Tce - case 8425: state = 8436; break; // &tc -> &tce - case 8451: state = 8452; break; // &telr -> &telre - case 8461: state = 8462; break; // &th -> &the - case 8463: state = 8464; break; // &ther -> &there - case 8467: state = 8468; break; // &Th -> &The - case 8469: state = 8470; break; // &Ther -> &There - case 8473: state = 8474; break; // &Therefor -> &Therefore - case 8478: state = 8479; break; // &therefor -> &therefore - case 8513: state = 8514; break; // &ThickSpac -> &ThickSpace - case 8524: state = 8525; break; // &ThinSpac -> &ThinSpace - case 8546: state = 8547; break; // &Tild -> &Tilde - case 8551: state = 8552; break; // &tild -> &tilde - case 8573: state = 8574; break; // &TildeTild -> &TildeTilde - case 8576: state = 8577; break; // &tim -> &time - case 8590: state = 8591; break; // &to -> &toe - case 8620: state = 8621; break; // &tprim -> &tprime - case 8630: state = 8631; break; // &trad -> &trade - case 8633: state = 8668; break; // &tri -> &trie - case 8637: state = 8638; break; // &triangl -> &triangle - case 8645: state = 8646; break; // &trianglel -> &trianglele - case 8648: state = 8650; break; // &triangleleft -> &trianglelefte - case 8659: state = 8661; break; // &triangleright -> &trianglerighte - case 8679: state = 8680; break; // &Tripl -> &Triple - case 8695: state = 8696; break; // &tritim -> &tritime - case 8698: state = 8699; break; // &trp -> &trpe - case 8743: state = 8744; break; // &twoh -> &twohe - case 8747: state = 8748; break; // &twoheadl -> &twoheadle - case 8772: state = 8773; break; // &Uacut -> Ú - case 8779: state = 8780; break; // &uacut -> ú - case 8798: state = 8807; break; // &Ubr -> &Ubre - case 8803: state = 8811; break; // &ubr -> &ubre - case 8808: state = 8809; break; // &Ubrev -> &Ubreve - case 8812: state = 8813; break; // &ubrev -> &ubreve - case 8863: state = 8864; break; // &Ugrav -> Ù - case 8869: state = 8870; break; // &ugrav -> ù - case 8891: state = 8893; break; // &ulcorn -> &ulcorne - case 8917: state = 8918; break; // &Und -> &Unde - case 8926: state = 8927; break; // &UnderBrac -> &UnderBrace - case 8929: state = 8930; break; // &UnderBrack -> &UnderBracke - case 8935: state = 8936; break; // &UnderPar -> &UnderPare - case 8939: state = 8940; break; // &UnderParenth -> &UnderParenthe - case 9053: state = 9054; break; // &upharpoonl -> &upharpoonle - case 9068: state = 9069; break; // &Upp -> &Uppe - case 9071: state = 9072; break; // &UpperL -> &UpperLe - case 9108: state = 9109; break; // &UpT -> &UpTe - case 9109: state = 9110; break; // &UpTe -> &UpTee - case 9131: state = 9133; break; // &urcorn -> &urcorne - case 9169: state = 9170; break; // &Utild -> &Utilde - case 9174: state = 9175; break; // &utild -> &utilde - case 9198: state = 9199; break; // &uwangl -> &uwangle - case 9201: state = 9345; break; // &v -> &ve - case 9208: state = 9209; break; // &var -> &vare - case 9260: state = 9261; break; // &varsubs -> &varsubse - case 9263: state = 9264; break; // &varsubsetn -> &varsubsetne - case 9270: state = 9271; break; // &varsups -> &varsupse - case 9273: state = 9274; break; // &varsupsetn -> &varsupsetne - case 9280: state = 9281; break; // &varth -> &varthe - case 9290: state = 9291; break; // &vartriangl -> &vartriangle - case 9292: state = 9293; break; // &vartrianglel -> &vartrianglele - case 9303: state = 9342; break; // &V -> &Ve - case 9342: state = 9343; break; // &Ve -> &Vee - case 9345: state = 9346; break; // &ve -> &vee - case 9346: state = 9352; break; // &vee -> &veee - case 9384: state = 9385; break; // &VerticalLin -> &VerticalLine - case 9387: state = 9388; break; // &VerticalS -> &VerticalSe - case 9400: state = 9401; break; // &VerticalTild -> &VerticalTilde - case 9411: state = 9412; break; // &VeryThinSpac -> &VeryThinSpace - case 9460: state = 9463; break; // &vsubn -> &vsubne - case 9466: state = 9469; break; // &vsupn -> &vsupne - case 9484: state = 9502; break; // &W -> &We - case 9490: state = 9496; break; // &w -> &we - case 9504: state = 9505; break; // &Wedg -> &Wedge - case 9507: state = 9508; break; // &wedg -> &wedge - case 9512: state = 9513; break; // &wei -> &weie - case 9533: state = 9535; break; // &wr -> &wre - case 9620: state = 9621; break; // &xotim -> &xotime - case 9655: state = 9656; break; // &xv -> &xve - case 9656: state = 9657; break; // &xve -> &xvee - case 9659: state = 9660; break; // &xw -> &xwe - case 9662: state = 9663; break; // &xwedg -> &xwedge - case 9669: state = 9670; break; // &Yacut -> Ý - case 9672: state = 9699; break; // &y -> &ye - case 9676: state = 9677; break; // &yacut -> ý - case 9747: state = 9791; break; // &Z -> &Ze - case 9751: state = 9752; break; // &Zacut -> &Zacute - case 9754: state = 9785; break; // &z -> &ze - case 9758: state = 9759; break; // &zacut -> &zacute - case 9785: state = 9786; break; // &ze -> &zee - case 9802: state = 9803; break; // &ZeroWidthSpac -> &ZeroWidthSpace - default: return false; - } - break; - case 'f': - switch (state) { - case 0: state = 2503; break; // & -> &f - case 1: state = 62; break; // &A -> &Af - case 8: state = 60; break; // &a -> &af - case 80: state = 81; break; // &ale -> &alef - case 147: state = 158; break; // &angmsda -> &angmsdaf - case 193: state = 194; break; // &Aop -> &Aopf - case 196: state = 197; break; // &aop -> &aopf - case 301: state = 439; break; // &b -> &bf - case 331: state = 436; break; // &B -> &Bf - case 553: state = 554; break; // &blacktrianglele -> &blacktrianglelef - case 595: state = 596; break; // &Bop -> &Bopf - case 599: state = 600; break; // &bop -> &bopf - case 789: state = 950; break; // &C -> &Cf - case 796: state = 953; break; // &c -> &cf - case 833: state = 834; break; // &CapitalDi -> &CapitalDif - case 834: state = 835; break; // &CapitalDif -> &CapitalDiff - case 979: state = 1053; break; // &cir -> &cirf - case 994: state = 995; break; // &circlearrowle -> &circlearrowlef - case 1148: state = 1150; break; // &comp -> &compf - case 1200: state = 1201; break; // &Cop -> &Copf - case 1203: state = 1204; break; // &cop -> &copf - case 1389: state = 1390; break; // &curvearrowle -> &curvearrowlef - case 1425: state = 1541; break; // &D -> &Df - case 1432: state = 1535; break; // &d -> &df - case 1557: state = 1621; break; // &Di -> &Dif - case 1621: state = 1622; break; // &Dif -> &Diff - case 1686: state = 1687; break; // &Dop -> &Dopf - case 1689: state = 1690; break; // &dop -> &dopf - case 1777: state = 1778; break; // &DoubleLe -> &DoubleLef - case 1805: state = 1806; break; // &DoubleLongLe -> &DoubleLongLef - case 1940: state = 1941; break; // &downharpoonle -> &downharpoonlef - case 1951: state = 1952; break; // &DownLe -> &DownLef - case 2073: state = 2075; break; // &dtri -> &dtrif - case 2108: state = 2180; break; // &E -> &Ef - case 2115: state = 2175; break; // &e -> &ef - case 2306: state = 2307; break; // &Eop -> &Eopf - case 2309: state = 2310; break; // &eop -> &eopf - case 2503: state = 2530; break; // &f -> &ff - case 2517: state = 2544; break; // &F -> &Ff - case 2605: state = 2606; break; // &fno -> &fnof - case 2609: state = 2610; break; // &Fop -> &Fopf - case 2613: state = 2614; break; // &fop -> &fopf - case 2636: state = 2637; break; // &Fouriertr -> &Fouriertrf - case 2701: state = 2802; break; // &g -> &gf - case 2708: state = 2799; break; // &G -> &Gf - case 2854: state = 2855; break; // &Gop -> &Gopf - case 2858: state = 2859; break; // &gop -> &gopf - case 3014: state = 3094; break; // &H -> &Hf - case 3020: state = 3097; break; // &h -> &hf - case 3027: state = 3028; break; // &hal -> &half - case 3139: state = 3140; break; // &hookle -> &hooklef - case 3160: state = 3161; break; // &Hop -> &Hopf - case 3163: state = 3164; break; // &hop -> &hopf - case 3236: state = 3284; break; // &I -> &If - case 3243: state = 3281; break; // &i -> &if - case 3281: state = 3282; break; // &if -> &iff - case 3311: state = 3312; break; // &iin -> &iinf - case 3365: state = 3366; break; // &imo -> &imof - case 3378: state = 3385; break; // &in -> &inf - case 3480: state = 3481; break; // &Iop -> &Iopf - case 3483: state = 3484; break; // &iop -> &iopf - case 3555: state = 3571; break; // &J -> &Jf - case 3561: state = 3574; break; // &j -> &jf - case 3583: state = 3584; break; // &Jop -> &Jopf - case 3587: state = 3588; break; // &jop -> &jopf - case 3618: state = 3648; break; // &K -> &Kf - case 3624: state = 3651; break; // &k -> &kf - case 3677: state = 3678; break; // &Kop -> &Kopf - case 3681: state = 3682; break; // &kop -> &kopf - case 3692: state = 4301; break; // &l -> &lf - case 3698: state = 4312; break; // &L -> &Lf - case 3752: state = 3753; break; // &Laplacetr -> &Laplacetrf - case 3766: state = 3773; break; // &larr -> &larrf - case 3768: state = 3770; break; // &larrb -> &larrbf - case 3896: state = 3925; break; // &le -> &lef - case 3898: state = 3899; break; // &Le -> &Lef - case 4020: state = 4021; break; // &leftle -> &leftlef - case 4361: state = 4362; break; // &Lle -> &Llef - case 4438: state = 4439; break; // &LongLe -> &LongLef - case 4448: state = 4449; break; // &Longle -> &Longlef - case 4460: state = 4461; break; // &longle -> &longlef - case 4550: state = 4551; break; // &looparrowle -> &looparrowlef - case 4560: state = 4567; break; // &lop -> &lopf - case 4564: state = 4565; break; // &Lop -> &Lopf - case 4592: state = 4593; break; // &LowerLe -> &LowerLef - case 4612: state = 4619; break; // &loz -> &lozf - case 4732: state = 4736; break; // <ri -> <rif - case 4767: state = 4865; break; // &m -> &mf - case 4781: state = 4862; break; // &M -> &Mf - case 4797: state = 4798; break; // &mapstole -> &mapstolef - case 4859: state = 4860; break; // &Mellintr -> &Mellintrf - case 4929: state = 4930; break; // &Mop -> &Mopf - case 4932: state = 4933; break; // &mop -> &mopf - case 4965: state = 5192; break; // &n -> &nf - case 4971: state = 5189; break; // &N -> &Nf - case 5270: state = 5282; break; // &nle -> &nlef - case 5273: state = 5274; break; // &nLe -> &nLef - case 5369: state = 5370; break; // &Nop -> &Nopf - case 5373: state = 5374; break; // &nop -> &nopf - case 5529: state = 5530; break; // &NotLe -> &NotLef - case 6014: state = 6015; break; // &ntrianglele -> &ntrianglelef - case 6079: state = 6080; break; // &nvin -> &nvinf - case 6131: state = 6205; break; // &O -> &Of - case 6138: state = 6200; break; // &o -> &of - case 6295: state = 6296; break; // &Oop -> &Oopf - case 6299: state = 6300; break; // &oop -> &oopf - case 6348: state = 6356; break; // &ord -> ª - case 6353: state = 6354; break; // &ordero -> &orderof - case 6362: state = 6363; break; // &origo -> &origof - case 6463: state = 6521; break; // &p -> &pf - case 6482: state = 6518; break; // &P -> &Pf - case 6547: state = 6548; break; // &pitch -> &pitchf - case 6630: state = 6631; break; // &Pop -> &Popf - case 6633: state = 6634; break; // &pop -> &popf - case 6745: state = 6754; break; // &pro -> &prof - case 6767: state = 6768; break; // &profsur -> &profsurf - case 6813: state = 6814; break; // &Q -> &Qf - case 6817: state = 6818; break; // &q -> &qf - case 6826: state = 6827; break; // &Qop -> &Qopf - case 6830: state = 6831; break; // &qop -> &qopf - case 6876: state = 7135; break; // &r -> &rf - case 6886: state = 7146; break; // &R -> &Rf - case 6932: state = 6944; break; // &rarr -> &rarrf - case 6937: state = 6939; break; // &rarrb -> &rarrbf - case 7214: state = 7215; break; // &RightArrowLe -> &RightArrowLef - case 7295: state = 7296; break; // &rightle -> &rightlef - case 7481: state = 7489; break; // &rop -> &ropf - case 7486: state = 7487; break; // &Rop -> &Ropf - case 7579: state = 7583; break; // &rtri -> &rtrif - case 7610: state = 7741; break; // &S -> &Sf - case 7617: state = 7744; break; // &s -> &sf - case 7787: state = 7788; break; // &ShortLe -> &ShortLef - case 7841: state = 7843; break; // &sigma -> &sigmaf - case 7936: state = 7937; break; // &so -> &sof - case 7950: state = 7951; break; // &Sop -> &Sopf - case 7953: state = 7954; break; // &sop -> &sopf - case 8008: state = 8066; break; // &squ -> &squf - case 8016: state = 8064; break; // &squar -> &squarf - case 8093: state = 8094; break; // &sstar -> &sstarf - case 8102: state = 8104; break; // &star -> &starf - case 8400: state = 8455; break; // &T -> &Tf - case 8404: state = 8458; break; // &t -> &tf - case 8464: state = 8476; break; // &there -> &theref - case 8470: state = 8471; break; // &There -> &Theref - case 8594: state = 8608; break; // &top -> &topf - case 8605: state = 8606; break; // &Top -> &Topf - case 8646: state = 8647; break; // &trianglele -> &trianglelef - case 8748: state = 8749; break; // &twoheadle -> &twoheadlef - case 8768: state = 8855; break; // &U -> &Uf - case 8775: state = 8849; break; // &u -> &uf - case 8964: state = 8965; break; // &Uop -> &Uopf - case 8967: state = 8968; break; // &uop -> &uopf - case 9054: state = 9055; break; // &upharpoonle -> &upharpoonlef - case 9072: state = 9073; break; // &UpperLe -> &UpperLef - case 9178: state = 9180; break; // &utri -> &utrif - case 9201: state = 9417; break; // &v -> &vf - case 9293: state = 9294; break; // &vartrianglele -> &vartrianglelef - case 9303: state = 9414; break; // &V -> &Vf - case 9433: state = 9434; break; // &Vop -> &Vopf - case 9437: state = 9438; break; // &vop -> &vopf - case 9484: state = 9517; break; // &W -> &Wf - case 9490: state = 9520; break; // &w -> &wf - case 9524: state = 9525; break; // &Wop -> &Wopf - case 9528: state = 9529; break; // &wop -> &wopf - case 9548: state = 9569; break; // &x -> &xf - case 9565: state = 9566; break; // &X -> &Xf - case 9608: state = 9609; break; // &Xop -> &Xopf - case 9611: state = 9612; break; // &xop -> &xopf - case 9665: state = 9702; break; // &Y -> &Yf - case 9672: state = 9705; break; // &y -> &yf - case 9717: state = 9718; break; // &Yop -> &Yopf - case 9721: state = 9722; break; // &yop -> &yopf - case 9747: state = 9811; break; // &Z -> &Zf - case 9754: state = 9814; break; // &z -> &zf - case 9788: state = 9789; break; // &zeetr -> &zeetrf - case 9833: state = 9834; break; // &Zop -> &Zopf - case 9837: state = 9838; break; // &zop -> &zopf - default: return false; - } - break; - case 'g': - switch (state) { - case 0: state = 2701; break; // & -> &g - case 1: state = 67; break; // &A -> &Ag - case 8: state = 73; break; // &a -> &ag - case 52: state = 53; break; // &AEli -> Æ - case 57: state = 58; break; // &aeli -> æ - case 108: state = 109; break; // &amal -> &amalg - case 119: state = 136; break; // &an -> &ang - case 147: state = 160; break; // &angmsda -> &angmsdag - case 183: state = 184; break; // &Ao -> &Aog - case 188: state = 189; break; // &ao -> &aog - case 239: state = 240; break; // &Arin -> Å - case 244: state = 245; break; // &arin -> å - case 256: state = 257; break; // &Assi -> &Assig - case 307: state = 308; break; // &backcon -> &backcong - case 355: state = 357; break; // &barwed -> &barwedg - case 371: state = 372; break; // &bcon -> &bcong - case 442: state = 443; break; // &bi -> &big - case 485: state = 486; break; // &bigtrian -> &bigtriang - case 509: state = 510; break; // &bigwed -> &bigwedg - case 527: state = 528; break; // &blacklozen -> &blacklozeng - case 542: state = 543; break; // &blacktrian -> &blacktriang - case 558: state = 559; break; // &blacktriangleri -> &blacktrianglerig - case 999: state = 1000; break; // &circlearrowri -> &circlearrowrig - case 1086: state = 1087; break; // &ClockwiseContourInte -> &ClockwiseContourInteg - case 1164: state = 1165; break; // &con -> &cong - case 1171: state = 1172; break; // &Con -> &Cong - case 1194: state = 1195; break; // &ContourInte -> &ContourInteg - case 1250: state = 1251; break; // &CounterClockwiseContourInte -> &CounterClockwiseContourInteg - case 1373: state = 1374; break; // &curlywed -> &curlywedg - case 1394: state = 1395; break; // &curvearrowri -> &curvearrowrig - case 1426: state = 1427; break; // &Da -> &Dag - case 1427: state = 1428; break; // &Dag -> &Dagg - case 1433: state = 1434; break; // &da -> &dag - case 1434: state = 1435; break; // &dag -> &dagg - case 1494: state = 1495; break; // &dda -> &ddag - case 1495: state = 1496; break; // &ddag -> &ddagg - case 1516: state = 1517; break; // &de -> ° - case 1599: state = 1633; break; // &di -> &dig - case 1740: state = 1741; break; // &doublebarwed -> &doublebarwedg - case 1758: state = 1759; break; // &DoubleContourInte -> &DoubleContourInteg - case 1787: state = 1788; break; // &DoubleLeftRi -> &DoubleLeftRig - case 1802: state = 1803; break; // &DoubleLon -> &DoubleLong - case 1815: state = 1816; break; // &DoubleLongLeftRi -> &DoubleLongLeftRig - case 1826: state = 1827; break; // &DoubleLongRi -> &DoubleLongRig - case 1837: state = 1838; break; // &DoubleRi -> &DoubleRig - case 1945: state = 1946; break; // &downharpoonri -> &downharpoonrig - case 1955: state = 1956; break; // &DownLeftRi -> &DownLeftRig - case 1988: state = 1989; break; // &DownRi -> &DownRig - case 2088: state = 2089; break; // &dwan -> &dwang - case 2101: state = 2102; break; // &dzi -> &dzig - case 2108: state = 2187; break; // &E -> &Eg - case 2115: state = 2185; break; // &e -> &eg - case 2290: state = 2291; break; // &en -> &eng - case 2296: state = 2297; break; // &Eo -> &Eog - case 2301: state = 2302; break; // &eo -> &eog - case 2357: state = 2358; break; // &eqslant -> &eqslantg - case 2508: state = 2509; break; // &fallin -> &falling - case 2533: state = 2534; break; // &ffili -> &ffilig - case 2537: state = 2538; break; // &ffli -> &fflig - case 2541: state = 2542; break; // &fflli -> &ffllig - case 2551: state = 2552; break; // &fili -> &filig - case 2589: state = 2590; break; // &fjli -> &fjlig - case 2597: state = 2598; break; // &flli -> &fllig - case 2701: state = 2807; break; // &g -> &gg - case 2708: state = 2805; break; // &G -> &Gg - case 2807: state = 2809; break; // &gg -> &ggg - case 3149: state = 3150; break; // &hookri -> &hookrig - case 3236: state = 3289; break; // &I -> &Ig - case 3243: state = 3295; break; // &i -> &ig - case 3322: state = 3323; break; // &IJli -> &IJlig - case 3327: state = 3328; break; // &ijli -> &ijlig - case 3332: state = 3344; break; // &Ima -> &Imag - case 3337: state = 3341; break; // &ima -> &imag - case 3407: state = 3408; break; // &inte -> &integ - case 3413: state = 3414; break; // &Inte -> &Integ - case 3467: state = 3476; break; // &io -> &iog - case 3471: state = 3472; break; // &Io -> &Iog - case 3624: state = 3654; break; // &k -> &kg - case 3692: state = 4317; break; // &l -> &lg - case 3705: state = 3718; break; // &la -> &lag - case 3733: state = 3734; break; // &Lan -> &Lang - case 3736: state = 3737; break; // &lan -> &lang - case 3894: state = 4183; break; // &lE -> &lEg - case 3896: state = 4185; break; // &le -> &leg - case 3902: state = 3903; break; // &LeftAn -> &LeftAng - case 3938: state = 3939; break; // &LeftArrowRi -> &LeftArrowRig - case 3958: state = 3959; break; // &LeftCeilin -> &LeftCeiling - case 4031: state = 4032; break; // &LeftRi -> &LeftRig - case 4042: state = 4043; break; // &Leftri -> &Leftrig - case 4053: state = 4054; break; // &leftri -> &leftrig - case 4077: state = 4078; break; // &leftrightsqui -> &leftrightsquig - case 4123: state = 4124; break; // &LeftTrian -> &LeftTriang - case 4197: state = 4210; break; // &les -> &lesg - case 4215: state = 4271; break; // &less -> &lessg - case 4228: state = 4229; break; // &lesseq -> &lesseqg - case 4233: state = 4234; break; // &lesseqq -> &lesseqqg - case 4424: state = 4425; break; // &loan -> &loang - case 4435: state = 4436; break; // &Lon -> &Long - case 4457: state = 4458; break; // &lon -> &long - case 4470: state = 4471; break; // &LongLeftRi -> &LongLeftRig - case 4481: state = 4482; break; // &Longleftri -> &Longleftrig - case 4492: state = 4493; break; // &longleftri -> &longleftrig - case 4510: state = 4511; break; // &LongRi -> &LongRig - case 4521: state = 4522; break; // &Longri -> &Longrig - case 4532: state = 4533; break; // &longri -> &longrig - case 4555: state = 4556; break; // &looparrowri -> &looparrowrig - case 4602: state = 4603; break; // &LowerRi -> &LowerRig - case 4615: state = 4616; break; // &lozen -> &lozeng - case 4670: state = 4674; break; // &lsim -> &lsimg - case 4838: state = 4839; break; // &measuredan -> &measuredang - case 4965: state = 5195; break; // &n -> &ng - case 4983: state = 4984; break; // &nan -> &nang - case 5045: state = 5046; break; // &ncon -> &ncong - case 5084: state = 5085; break; // &Ne -> &Neg - case 5212: state = 5213; break; // &nG -> &nGg - case 5291: state = 5292; break; // &nLeftri -> &nLeftrig - case 5302: state = 5303; break; // &nleftri -> &nleftrig - case 5361: state = 5362; break; // &NonBreakin -> &NonBreaking - case 5382: state = 5383; break; // &NotCon -> &NotCong - case 5536: state = 5537; break; // &NotLeftTrian -> &NotLeftTriang - case 5671: state = 5672; break; // &NotRi -> &NotRig - case 5679: state = 5680; break; // &NotRightTrian -> &NotRightTriang - case 5869: state = 5870; break; // &nRi -> &nRig - case 5879: state = 5880; break; // &nri -> &nrig - case 5988: state = 5989; break; // &nt -> &ntg - case 6003: state = 6004; break; // &ntl -> &ntlg - case 6009: state = 6010; break; // &ntrian -> &ntriang - case 6022: state = 6023; break; // &ntriangleri -> &ntrianglerig - case 6043: state = 6068; break; // &nv -> &nvg - case 6131: state = 6214; break; // &O -> &Og - case 6138: state = 6210; break; // &o -> &og - case 6192: state = 6193; break; // &OEli -> &OElig - case 6197: state = 6198; break; // &oeli -> &oelig - case 6268: state = 6269; break; // &Ome -> &Omeg - case 6272: state = 6273; break; // &ome -> &omeg - case 6360: state = 6361; break; // &ori -> &orig - case 6908: state = 6909; break; // &Ran -> &Rang - case 6911: state = 6912; break; // &ran -> &rang - case 7074: state = 7095; break; // &re -> ® - case 7171: state = 7172; break; // &Ri -> &Rig - case 7176: state = 7177; break; // &RightAn -> &RightAng - case 7199: state = 7200; break; // &ri -> &rig - case 7233: state = 7234; break; // &RightCeilin -> &RightCeiling - case 7315: state = 7316; break; // &rightri -> &rightrig - case 7329: state = 7330; break; // &rightsqui -> &rightsquig - case 7368: state = 7369; break; // &RightTrian -> &RightTriang - case 7428: state = 7429; break; // &rin -> &ring - case 7433: state = 7434; break; // &risin -> &rising - case 7471: state = 7472; break; // &roan -> &roang - case 7514: state = 7516; break; // &rpar -> &rparg - case 7532: state = 7533; break; // &Rri -> &Rrig - case 7813: state = 7814; break; // &ShortRi -> &ShortRig - case 7833: state = 7834; break; // &Si -> &Sig - case 7838: state = 7839; break; // &si -> &sig - case 7847: state = 7857; break; // &sim -> &simg - case 8108: state = 8109; break; // &strai -> &straig - case 8279: state = 8280; break; // &sun -> &sung - case 8397: state = 8398; break; // &szli -> ß - case 8406: state = 8407; break; // &tar -> &targ - case 8635: state = 8636; break; // &trian -> &triang - case 8656: state = 8657; break; // &triangleri -> &trianglerig - case 8758: state = 8759; break; // &twoheadri -> &twoheadrig - case 8768: state = 8860; break; // &U -> &Ug - case 8775: state = 8866; break; // &u -> &ug - case 8954: state = 8955; break; // &Uo -> &Uog - case 8959: state = 8960; break; // &uo -> &uog - case 9059: state = 9060; break; // &upharpoonri -> &upharpoonrig - case 9082: state = 9083; break; // &UpperRi -> &UpperRig - case 9142: state = 9143; break; // &Urin -> &Uring - case 9146: state = 9147; break; // &urin -> &uring - case 9196: state = 9197; break; // &uwan -> &uwang - case 9203: state = 9204; break; // &van -> &vang - case 9228: state = 9229; break; // &varnothin -> &varnothing - case 9253: state = 9254; break; // &varsi -> &varsig - case 9288: state = 9289; break; // &vartrian -> &vartriang - case 9298: state = 9299; break; // &vartriangleri -> &vartrianglerig - case 9478: state = 9479; break; // &vzi -> &vzig - case 9481: state = 9482; break; // &vzigza -> &vzigzag - case 9497: state = 9507; break; // &wed -> &wedg - case 9503: state = 9504; break; // &Wed -> &Wedg - case 9661: state = 9662; break; // &xwed -> &xwedg - case 9825: state = 9826; break; // &zi -> &zig - default: return false; - } - break; - case 'h': - switch (state) { - case 0: state = 3020; break; // & -> &h - case 86: state = 87; break; // &alep -> &aleph - case 90: state = 91; break; // &Alp -> &Alph - case 94: state = 95; break; // &alp -> &alph - case 147: state = 162; break; // &angmsda -> &angmsdah - case 173: state = 174; break; // &angsp -> &angsph - case 338: state = 339; break; // &Backslas -> &Backslash - case 426: state = 429; break; // &bet -> &beth - case 559: state = 560; break; // &blacktrianglerig -> &blacktrianglerigh - case 613: state = 638; break; // &box -> &boxh - case 691: state = 697; break; // &boxV -> &boxVh - case 693: state = 701; break; // &boxv -> &boxvh - case 758: state = 762; break; // &bsol -> &bsolh - case 789: state = 973; break; // &C -> &Ch - case 796: state = 960; break; // &c -> &ch - case 1000: state = 1001; break; // &circlearrowrig -> &circlearrowrigh - case 1016: state = 1017; break; // &circleddas -> &circleddash - case 1395: state = 1396; break; // &curvearrowrig -> &curvearrowrigh - case 1432: state = 1550; break; // &d -> &dh - case 1441: state = 1442; break; // &dalet -> &daleth - case 1454: state = 1455; break; // &das -> &dash - case 1457: state = 1458; break; // &Das -> &Dash - case 1506: state = 1507; break; // &DDotra -> &DDotrah - case 1537: state = 1538; break; // &dfis -> &dfish - case 1788: state = 1789; break; // &DoubleLeftRig -> &DoubleLeftRigh - case 1816: state = 1817; break; // &DoubleLongLeftRig -> &DoubleLongLeftRigh - case 1827: state = 1828; break; // &DoubleLongRig -> &DoubleLongRigh - case 1838: state = 1839; break; // &DoubleRig -> &DoubleRigh - case 1896: state = 1932; break; // &down -> &downh - case 1946: state = 1947; break; // &downharpoonrig -> &downharpoonrigh - case 1956: state = 1957; break; // &DownLeftRig -> &DownLeftRigh - case 1989: state = 1990; break; // &DownRig -> &DownRigh - case 2077: state = 2082; break; // &du -> &duh - case 2439: state = 2445; break; // &et -> ð - case 3132: state = 3133; break; // &homt -> &homth - case 3150: state = 3151; break; // &hookrig -> &hookrigh - case 3194: state = 3195; break; // &hslas -> &hslash - case 3231: state = 3232; break; // &hyp -> &hyph - case 3362: state = 3363; break; // &imat -> &imath - case 3435: state = 3436; break; // &intlar -> &intlarh - case 3579: state = 3580; break; // &jmat -> &jmath - case 3624: state = 3664; break; // &k -> &kh - case 3692: state = 4325; break; // &l -> &lh - case 3766: state = 3776; break; // &larr -> &larrh - case 3880: state = 3881; break; // &ldrd -> &ldrdh - case 3886: state = 3887; break; // &ldrus -> &ldrush - case 3891: state = 3892; break; // &lds -> &ldsh - case 3926: state = 4004; break; // &left -> &lefth - case 3939: state = 3940; break; // &LeftArrowRig -> &LeftArrowRigh - case 4032: state = 4033; break; // &LeftRig -> &LeftRigh - case 4043: state = 4044; break; // &Leftrig -> &Leftrigh - case 4054: state = 4055; break; // &leftrig -> &leftrigh - case 4056: state = 4065; break; // &leftright -> &leftrighth - case 4109: state = 4110; break; // &leftt -> &leftth - case 4303: state = 4304; break; // &lfis -> &lfish - case 4348: state = 4370; break; // &ll -> &llh - case 4397: state = 4398; break; // &lmoustac -> &lmoustach - case 4471: state = 4472; break; // &LongLeftRig -> &LongLeftRigh - case 4482: state = 4483; break; // &Longleftrig -> &Longleftrigh - case 4493: state = 4494; break; // &longleftrig -> &longleftrigh - case 4511: state = 4512; break; // &LongRig -> &LongRigh - case 4522: state = 4523; break; // &Longrig -> &Longrigh - case 4533: state = 4534; break; // &longrig -> &longrigh - case 4556: state = 4557; break; // &looparrowrig -> &looparrowrigh - case 4603: state = 4604; break; // &LowerRig -> &LowerRigh - case 4628: state = 4640; break; // &lr -> &lrh - case 4652: state = 4667; break; // &ls -> &lsh - case 4658: state = 4665; break; // &Ls -> &Lsh - case 4698: state = 4710; break; // < -> <h - case 4745: state = 4746; break; // &lurds -> &lurdsh - case 4750: state = 4751; break; // &luru -> &luruh - case 4767: state = 4868; break; // &m -> &mh - case 4822: state = 4823; break; // &mdas -> &mdash - case 4965: state = 5227; break; // &n -> &nh - case 5061: state = 5062; break; // &ndas -> &ndash - case 5067: state = 5068; break; // &near -> &nearh - case 5103: state = 5104; break; // &NegativeT -> &NegativeTh - case 5125: state = 5126; break; // &NegativeVeryT -> &NegativeVeryTh - case 5292: state = 5293; break; // &nLeftrig -> &nLeftrigh - case 5303: state = 5304; break; // &nleftrig -> &nleftrigh - case 5672: state = 5673; break; // &NotRig -> &NotRigh - case 5870: state = 5871; break; // &nRig -> &nRigh - case 5880: state = 5881; break; // &nrig -> &nrigh - case 5895: state = 5910; break; // &ns -> &nsh - case 6023: state = 6024; break; // &ntrianglerig -> &ntrianglerigh - case 6050: state = 6051; break; // &nVDas -> &nVDash - case 6055: state = 6056; break; // &nVdas -> &nVdash - case 6060: state = 6061; break; // &nvDas -> &nvDash - case 6065: state = 6066; break; // &nvdas -> &nvdash - case 6113: state = 6114; break; // &nwar -> &nwarh - case 6138: state = 6227; break; // &o -> &oh - case 6165: state = 6166; break; // &odas -> &odash - case 6388: state = 6389; break; // &Oslas -> Ø - case 6393: state = 6394; break; // &oslas -> ø - case 6456: state = 6457; break; // &OverParent -> &OverParenth - case 6463: state = 6527; break; // &p -> &ph - case 6482: state = 6524; break; // &P -> &Ph - case 6546: state = 6547; break; // &pitc -> &pitch - case 6559: state = 6561; break; // &planck -> &planckh - case 6876: state = 7155; break; // &r -> &rh - case 6886: state = 7164; break; // &R -> &Rh - case 6932: state = 6947; break; // &rarr -> &rarrh - case 7058: state = 7059; break; // &rdld -> &rdldh - case 7069: state = 7070; break; // &rds -> &rdsh - case 7137: state = 7138; break; // &rfis -> &rfish - case 7172: state = 7173; break; // &Rig -> &Righ - case 7200: state = 7201; break; // &rig -> &righ - case 7202: state = 7279; break; // &right -> &righth - case 7297: state = 7305; break; // &rightleft -> &rightlefth - case 7316: state = 7317; break; // &rightrig -> &rightrigh - case 7354: state = 7355; break; // &rightt -> &rightth - case 7442: state = 7447; break; // &rl -> &rlh - case 7460: state = 7461; break; // &rmoustac -> &rmoustach - case 7533: state = 7534; break; // &Rrig -> &Rrigh - case 7542: state = 7557; break; // &rs -> &rsh - case 7548: state = 7555; break; // &Rs -> &Rsh - case 7567: state = 7568; break; // &rt -> &rth - case 7603: state = 7604; break; // &rulu -> &ruluh - case 7610: state = 7772; break; // &S -> &Sh - case 7617: state = 7751; break; // &s -> &sh - case 7705: state = 7706; break; // &sear -> &searh - case 7762: state = 7763; break; // &shc -> &shch - case 7814: state = 7815; break; // &ShortRig -> &ShortRigh - case 7907: state = 7908; break; // &smas -> &smash - case 8109: state = 8110; break; // &straig -> &straigh - case 8120: state = 8121; break; // &straightp -> &straightph - case 8216: state = 8269; break; // &Suc -> &Such - case 8270: state = 8271; break; // &SuchT -> &SuchTh - case 8284: state = 8320; break; // &sup -> &suph - case 8377: state = 8378; break; // &swar -> &swarh - case 8400: state = 8467; break; // &T -> &Th - case 8404: state = 8461; break; // &t -> &th - case 8657: state = 8658; break; // &trianglerig -> &trianglerigh - case 8709: state = 8723; break; // &ts -> &tsh - case 8742: state = 8743; break; // &two -> &twoh - case 8759: state = 8760; break; // &twoheadrig -> &twoheadrigh - case 8775: state = 8876; break; // &u -> &uh - case 8829: state = 8845; break; // &ud -> &udh - case 8851: state = 8852; break; // &ufis -> &ufish - case 8938: state = 8939; break; // &UnderParent -> &UnderParenth - case 8983: state = 9046; break; // &up -> &uph - case 9060: state = 9061; break; // &upharpoonrig -> &upharpoonrigh - case 9083: state = 9084; break; // &UpperRig -> &UpperRigh - case 9096: state = 9098; break; // &upsi -> &upsih - case 9225: state = 9226; break; // &varnot -> &varnoth - case 9231: state = 9232; break; // &varp -> &varph - case 9247: state = 9249; break; // &varr -> &varrh - case 9279: state = 9280; break; // &vart -> &varth - case 9299: state = 9300; break; // &vartrianglerig -> &vartrianglerigh - case 9322: state = 9323; break; // &VDas -> &VDash - case 9327: state = 9328; break; // &Vdas -> &Vdash - case 9332: state = 9333; break; // &vDas -> &vDash - case 9337: state = 9338; break; // &vdas -> &vdash - case 9404: state = 9405; break; // &VeryT -> &VeryTh - case 9474: state = 9475; break; // &Vvdas -> &Vvdash - case 9537: state = 9538; break; // &wreat -> &wreath - case 9548: state = 9572; break; // &x -> &xh - case 9754: state = 9821; break; // &z -> &zh - case 9797: state = 9798; break; // &ZeroWidt -> &ZeroWidth - default: return false; - } - break; - case 'i': - switch (state) { - case 0: state = 3243; break; // & -> &i - case 27: state = 38; break; // &ac -> &aci - case 33: state = 34; break; // &Ac -> &Aci - case 51: state = 52; break; // &AEl -> &AEli - case 56: state = 57; break; // &ael -> &aeli - case 199: state = 210; break; // &ap -> &api - case 202: state = 203; break; // &apac -> &apaci - case 224: state = 225; break; // &ApplyFunct -> &ApplyFuncti - case 237: state = 238; break; // &Ar -> &Ari - case 242: state = 243; break; // &ar -> &ari - case 255: state = 256; break; // &Ass -> &Assi - case 269: state = 270; break; // &At -> &Ati - case 275: state = 276; break; // &at -> &ati - case 289: state = 297; break; // &aw -> &awi - case 292: state = 293; break; // &awcon -> &awconi - case 301: state = 442; break; // &b -> &bi - case 312: state = 313; break; // &backeps -> &backepsi - case 319: state = 320; break; // &backpr -> &backpri - case 324: state = 325; break; // &backs -> &backsi - case 406: state = 407; break; // &beps -> &bepsi - case 419: state = 420; break; // &Bernoull -> &Bernoulli - case 444: state = 448; break; // &bigc -> &bigci - case 465: state = 466; break; // &bigot -> &bigoti - case 482: state = 483; break; // &bigtr -> &bigtri - case 539: state = 540; break; // &blacktr -> &blacktri - case 557: state = 558; break; // &blacktriangler -> &blacktriangleri - case 583: state = 584; break; // &bnequ -> &bnequi - case 609: state = 610; break; // &bowt -> &bowti - case 656: state = 657; break; // &boxm -> &boxmi - case 667: state = 668; break; // &boxt -> &boxti - case 720: state = 721; break; // &bpr -> &bpri - case 744: state = 752; break; // &bs -> &bsi - case 749: state = 750; break; // &bsem -> &bsemi - case 789: state = 1019; break; // &C -> &Ci - case 796: state = 978; break; // &c -> &ci - case 803: state = 828; break; // &Cap -> &Capi - case 832: state = 833; break; // &CapitalD -> &CapitalDi - case 840: state = 841; break; // &CapitalDifferent -> &CapitalDifferenti - case 861: state = 890; break; // &cc -> &cci - case 866: state = 886; break; // &Cc -> &Cci - case 877: state = 878; break; // &Cced -> &Ccedi - case 882: state = 883; break; // &cced -> &ccedi - case 895: state = 896; break; // &Ccon -> &Cconi - case 916: state = 917; break; // &ced -> &cedi - case 921: state = 922; break; // &Ced -> &Cedi - case 960: state = 976; break; // &ch -> &chi - case 973: state = 974; break; // &Ch -> &Chi - case 998: state = 999; break; // &circlearrowr -> &circlearrowri - case 1009: state = 1010; break; // &circledc -> &circledci - case 1032: state = 1033; break; // &CircleM -> &CircleMi - case 1043: state = 1044; break; // &CircleT -> &CircleTi - case 1054: state = 1055; break; // &cirfn -> &cirfni - case 1059: state = 1060; break; // &cirm -> &cirmi - case 1064: state = 1065; break; // &cirsc -> &cirsci - case 1072: state = 1073; break; // &Clockw -> &Clockwi - case 1122: state = 1123; break; // &clubsu -> &clubsui - case 1164: state = 1183; break; // &con -> &coni - case 1171: state = 1179; break; // &Con -> &Coni - case 1236: state = 1237; break; // &CounterClockw -> &CounterClockwi - case 1393: state = 1394; break; // &curvearrowr -> &curvearrowri - case 1407: state = 1415; break; // &cw -> &cwi - case 1410: state = 1411; break; // &cwcon -> &cwconi - case 1425: state = 1557; break; // &D -> &Di - case 1432: state = 1599; break; // &d -> &di - case 1535: state = 1536; break; // &df -> &dfi - case 1560: state = 1561; break; // &Diacr -> &Diacri - case 1562: state = 1563; break; // &Diacrit -> &Diacriti - case 1593: state = 1594; break; // &DiacriticalT -> &DiacriticalTi - case 1613: state = 1614; break; // &diamondsu -> &diamondsui - case 1627: state = 1628; break; // &Different -> &Differenti - case 1639: state = 1640; break; // &dis -> &disi - case 1643: state = 1645; break; // &div -> &divi - case 1651: state = 1652; break; // ÷ont -> ÷onti - case 1713: state = 1714; break; // &dotm -> &dotmi - case 1786: state = 1787; break; // &DoubleLeftR -> &DoubleLeftRi - case 1814: state = 1815; break; // &DoubleLongLeftR -> &DoubleLongLeftRi - case 1825: state = 1826; break; // &DoubleLongR -> &DoubleLongRi - case 1836: state = 1837; break; // &DoubleR -> &DoubleRi - case 1872: state = 1873; break; // &DoubleVert -> &DoubleVerti - case 1944: state = 1945; break; // &downharpoonr -> &downharpoonri - case 1954: state = 1955; break; // &DownLeftR -> &DownLeftRi - case 1987: state = 1988; break; // &DownR -> &DownRi - case 2072: state = 2073; break; // &dtr -> &dtri - case 2097: state = 2101; break; // &dz -> &dzi - case 2127: state = 2142; break; // &Ec -> &Eci - case 2133: state = 2139; break; // &ec -> &eci - case 2204: state = 2213; break; // &el -> &eli - case 2323: state = 2324; break; // &eps -> &epsi - case 2327: state = 2328; break; // &Eps -> &Epsi - case 2340: state = 2341; break; // &eqc -> &eqci - case 2350: state = 2351; break; // &eqs -> &eqsi - case 2368: state = 2387; break; // &Equ -> &Equi - case 2372: state = 2396; break; // &equ -> &equi - case 2377: state = 2378; break; // &EqualT -> &EqualTi - case 2388: state = 2389; break; // &Equil -> &Equili - case 2391: state = 2392; break; // &Equilibr -> &Equilibri - case 2418: state = 2430; break; // &Es -> &Esi - case 2422: state = 2433; break; // &es -> &esi - case 2458: state = 2462; break; // &ex -> &exi - case 2466: state = 2467; break; // &Ex -> &Exi - case 2477: state = 2478; break; // &expectat -> &expectati - case 2487: state = 2488; break; // &Exponent -> &Exponenti - case 2497: state = 2498; break; // &exponent -> &exponenti - case 2503: state = 2549; break; // &f -> &fi - case 2506: state = 2507; break; // &fall -> &falli - case 2517: state = 2554; break; // &F -> &Fi - case 2530: state = 2531; break; // &ff -> &ffi - case 2532: state = 2533; break; // &ffil -> &ffili - case 2536: state = 2537; break; // &ffl -> &ffli - case 2540: state = 2541; break; // &ffll -> &fflli - case 2550: state = 2551; break; // &fil -> &fili - case 2588: state = 2589; break; // &fjl -> &fjli - case 2596: state = 2597; break; // &fll -> &flli - case 2631: state = 2632; break; // &Four -> &Fouri - case 2642: state = 2643; break; // &fpart -> &fparti - case 2701: state = 2811; break; // &g -> &gi - case 2736: state = 2742; break; // &Gc -> &Gci - case 2738: state = 2739; break; // &Gced -> &Gcedi - case 2746: state = 2747; break; // &gc -> &gci - case 2849: state = 2850; break; // &gns -> &gnsi - case 2917: state = 2918; break; // &GreaterT -> &GreaterTi - case 2927: state = 2931; break; // &gs -> &gsi - case 2944: state = 2947; break; // >c -> >ci - case 2998: state = 2999; break; // >rs -> >rsi - case 3014: state = 3100; break; // &H -> &Hi - case 3021: state = 3022; break; // &ha -> &hai - case 3030: state = 3031; break; // &ham -> &hami - case 3052: state = 3053; break; // &harrc -> &harrci - case 3064: state = 3065; break; // &Hc -> &Hci - case 3069: state = 3070; break; // &hc -> &hci - case 3080: state = 3081; break; // &heartsu -> &heartsui - case 3085: state = 3086; break; // &hell -> &helli - case 3148: state = 3149; break; // &hookr -> &hookri - case 3171: state = 3172; break; // &Hor -> &Hori - case 3179: state = 3180; break; // &HorizontalL -> &HorizontalLi - case 3243: state = 3301; break; // &i -> &ii - case 3250: state = 3257; break; // &ic -> &ici - case 3252: state = 3253; break; // &Ic -> &Ici - case 3301: state = 3303; break; // &ii -> &iii - case 3303: state = 3304; break; // &iii -> &iiii - case 3312: state = 3313; break; // &iinf -> &iinfi - case 3321: state = 3322; break; // &IJl -> &IJli - case 3326: state = 3327; break; // &ijl -> &ijli - case 3344: state = 3345; break; // &Imag -> &Imagi - case 3352: state = 3353; break; // &imagl -> &imagli - case 3373: state = 3374; break; // &Impl -> &Impli - case 3385: state = 3386; break; // &inf -> &infi - case 3389: state = 3390; break; // &infint -> &infinti - case 3428: state = 3429; break; // &Intersect -> &Intersecti - case 3444: state = 3445; break; // &Inv -> &Invi - case 3446: state = 3447; break; // &Invis -> &Invisi - case 3457: state = 3458; break; // &InvisibleT -> &InvisibleTi - case 3507: state = 3511; break; // &is -> &isi - case 3526: state = 3534; break; // &it -> &iti - case 3528: state = 3529; break; // &It -> &Iti - case 3556: state = 3557; break; // &Jc -> &Jci - case 3562: state = 3563; break; // &jc -> &jci - case 3634: state = 3635; break; // &Kced -> &Kcedi - case 3640: state = 3641; break; // &kced -> &kcedi - case 3785: state = 3786; break; // &larrs -> &larrsi - case 3795: state = 3796; break; // &lAta -> &lAtai - case 3799: state = 3800; break; // &lata -> &latai - case 3850: state = 3851; break; // &Lced -> &Lcedi - case 3854: state = 3859; break; // &lce -> &lcei - case 3855: state = 3856; break; // &lced -> &lcedi - case 3937: state = 3938; break; // &LeftArrowR -> &LeftArrowRi - case 3949: state = 3950; break; // &leftarrowta -> &leftarrowtai - case 3954: state = 3955; break; // &LeftCe -> &LeftCei - case 3956: state = 3957; break; // &LeftCeil -> &LeftCeili - case 4030: state = 4031; break; // &LeftR -> &LeftRi - case 4041: state = 4042; break; // &Leftr -> &Leftri - case 4052: state = 4053; break; // &leftr -> &leftri - case 4076: state = 4077; break; // &leftrightsqu -> &leftrightsqui - case 4114: state = 4115; break; // &leftthreet -> &leftthreeti - case 4120: state = 4121; break; // &LeftTr -> &LeftTri - case 4280: state = 4281; break; // &lesss -> &lesssi - case 4295: state = 4296; break; // &LessT -> &LessTi - case 4301: state = 4302; break; // &lf -> &lfi - case 4376: state = 4377; break; // &lltr -> &lltri - case 4379: state = 4380; break; // &Lm -> &Lmi - case 4385: state = 4386; break; // &lm -> &lmi - case 4418: state = 4419; break; // &lns -> &lnsi - case 4469: state = 4470; break; // &LongLeftR -> &LongLeftRi - case 4480: state = 4481; break; // &Longleftr -> &Longleftri - case 4491: state = 4492; break; // &longleftr -> &longleftri - case 4509: state = 4510; break; // &LongR -> &LongRi - case 4520: state = 4521; break; // &Longr -> &Longri - case 4531: state = 4532; break; // &longr -> &longri - case 4554: state = 4555; break; // &looparrowr -> &looparrowri - case 4573: state = 4574; break; // &lot -> &loti - case 4601: state = 4602; break; // &LowerR -> &LowerRi - case 4649: state = 4650; break; // &lrtr -> &lrtri - case 4652: state = 4669; break; // &ls -> &lsi - case 4698: state = 4715; break; // < -> <i - case 4700: state = 4703; break; // <c -> <ci - case 4731: state = 4732; break; // <r -> <ri - case 4767: state = 4871; break; // &m -> &mi - case 4781: state = 4900; break; // &M -> &Mi - case 4844: state = 4845; break; // &Med -> &Medi - case 4855: state = 4856; break; // &Mell -> &Melli - case 4882: state = 4883; break; // &midc -> &midci - case 4955: state = 4956; break; // &mult -> &multi - case 4965: state = 5240; break; // &n -> &ni - case 4986: state = 4990; break; // &nap -> &napi - case 5035: state = 5036; break; // &Nced -> &Ncedi - case 5040: state = 5041; break; // &nced -> &ncedi - case 5087: state = 5088; break; // &Negat -> &Negati - case 5093: state = 5094; break; // &NegativeMed -> &NegativeMedi - case 5104: state = 5105; break; // &NegativeTh -> &NegativeThi - case 5126: state = 5127; break; // &NegativeVeryTh -> &NegativeVeryThi - case 5136: state = 5137; break; // &nequ -> &nequi - case 5140: state = 5145; break; // &nes -> &nesi - case 5177: state = 5178; break; // &NewL -> &NewLi - case 5182: state = 5183; break; // &nex -> &nexi - case 5215: state = 5216; break; // &ngs -> &ngsi - case 5290: state = 5291; break; // &nLeftr -> &nLeftri - case 5301: state = 5302; break; // &nleftr -> &nleftri - case 5328: state = 5329; break; // &nls -> &nlsi - case 5336: state = 5337; break; // &nltr -> &nltri - case 5343: state = 5344; break; // &nm -> &nmi - case 5359: state = 5360; break; // &NonBreak -> &NonBreaki - case 5378: state = 5512; break; // ¬ -> ¬i - case 5405: state = 5406; break; // &NotDoubleVert -> &NotDoubleVerti - case 5427: state = 5428; break; // &NotEqualT -> &NotEqualTi - case 5433: state = 5434; break; // &NotEx -> &NotExi - case 5487: state = 5488; break; // &NotGreaterT -> &NotGreaterTi - case 5533: state = 5534; break; // &NotLeftTr -> &NotLeftTri - case 5584: state = 5585; break; // &NotLessT -> &NotLessTi - case 5620: state = 5621; break; // ¬n -> ¬ni - case 5656: state = 5671; break; // &NotR -> &NotRi - case 5676: state = 5677; break; // &NotRightTr -> &NotRightTri - case 5762: state = 5763; break; // &NotSucceedsT -> &NotSucceedsTi - case 5781: state = 5782; break; // &NotT -> &NotTi - case 5803: state = 5804; break; // &NotTildeT -> &NotTildeTi - case 5812: state = 5813; break; // &NotVert -> &NotVerti - case 5837: state = 5838; break; // &npol -> &npoli - case 5855: state = 5879; break; // &nr -> &nri - case 5868: state = 5869; break; // &nR -> &nRi - case 5890: state = 5891; break; // &nrtr -> &nrtri - case 5895: state = 5927; break; // &ns -> &nsi - case 5914: state = 5915; break; // &nshortm -> &nshortmi - case 5934: state = 5935; break; // &nsm -> &nsmi - case 5988: state = 5998; break; // &nt -> &nti - case 5992: state = 5993; break; // &Nt -> &Nti - case 6006: state = 6007; break; // &ntr -> &ntri - case 6021: state = 6022; break; // &ntriangler -> &ntriangleri - case 6043: state = 6078; break; // &nv -> &nvi - case 6080: state = 6081; break; // &nvinf -> &nvinfi - case 6093: state = 6094; break; // &nvltr -> &nvltri - case 6103: state = 6104; break; // &nvrtr -> &nvrtri - case 6107: state = 6108; break; // &nvs -> &nvsi - case 6138: state = 6234; break; // &o -> &oi - case 6148: state = 6149; break; // &oc -> &oci - case 6152: state = 6153; break; // &Oc -> &Oci - case 6163: state = 6179; break; // &od -> &odi - case 6191: state = 6192; break; // &OEl -> &OEli - case 6196: state = 6197; break; // &oel -> &oeli - case 6201: state = 6202; break; // &ofc -> &ofci - case 6238: state = 6252; break; // &ol -> &oli - case 6243: state = 6244; break; // &olc -> &olci - case 6258: state = 6276; break; // &Om -> &Omi - case 6263: state = 6282; break; // &om -> &omi - case 6342: state = 6360; break; // &or -> &ori - case 6399: state = 6400; break; // &Ot -> &Oti - case 6405: state = 6406; break; // &ot -> &oti - case 6459: state = 6460; break; // &OverParenthes -> &OverParenthesi - case 6463: state = 6543; break; // &p -> &pi - case 6474: state = 6475; break; // &pars -> &parsi - case 6482: state = 6541; break; // &P -> &Pi - case 6485: state = 6486; break; // &Part -> &Parti - case 6498: state = 6503; break; // &per -> &peri - case 6507: state = 6508; break; // &perm -> &permi - case 6524: state = 6525; break; // &Ph -> &Phi - case 6527: state = 6528; break; // &ph -> &phi - case 6570: state = 6571; break; // &plusac -> &plusaci - case 6576: state = 6577; break; // &plusc -> &plusci - case 6590: state = 6591; break; // &PlusM -> &PlusMi - case 6599: state = 6600; break; // &pluss -> &plussi - case 6609: state = 6610; break; // &Po -> &Poi - case 6622: state = 6623; break; // &po -> &poi - case 6625: state = 6626; break; // &point -> &pointi - case 6640: state = 6725; break; // &Pr -> &Pri - case 6642: state = 6729; break; // &pr -> &pri - case 6696: state = 6697; break; // &PrecedesT -> &PrecedesTi - case 6717: state = 6718; break; // &precns -> &precnsi - case 6721: state = 6722; break; // &precs -> &precsi - case 6741: state = 6742; break; // &prns -> &prnsi - case 6760: state = 6761; break; // &profl -> &profli - case 6775: state = 6776; break; // &Proport -> &Proporti - case 6786: state = 6787; break; // &prs -> &prsi - case 6795: state = 6803; break; // &Ps -> &Psi - case 6799: state = 6805; break; // &ps -> &psi - case 6817: state = 6821; break; // &q -> &qi - case 6834: state = 6835; break; // &qpr -> &qpri - case 6849: state = 6858; break; // &quat -> &quati - case 6852: state = 6853; break; // &quatern -> &quaterni - case 6876: state = 7199; break; // &r -> &ri - case 6886: state = 7171; break; // &R -> &Ri - case 6897: state = 6898; break; // &rad -> &radi - case 6956: state = 6957; break; // &rarrs -> &rarrsi - case 6969: state = 6970; break; // &rAta -> &rAtai - case 6973: state = 6978; break; // &rat -> &rati - case 6974: state = 6975; break; // &rata -> &ratai - case 7034: state = 7035; break; // &Rced -> &Rcedi - case 7038: state = 7043; break; // &rce -> &rcei - case 7039: state = 7040; break; // &rced -> &rcedi - case 7076: state = 7078; break; // &real -> &reali - case 7111: state = 7112; break; // &ReverseEqu -> &ReverseEqui - case 7113: state = 7114; break; // &ReverseEquil -> &ReverseEquili - case 7116: state = 7117; break; // &ReverseEquilibr -> &ReverseEquilibri - case 7125: state = 7126; break; // &ReverseUpEqu -> &ReverseUpEqui - case 7127: state = 7128; break; // &ReverseUpEquil -> &ReverseUpEquili - case 7130: state = 7131; break; // &ReverseUpEquilibr -> &ReverseUpEquilibri - case 7135: state = 7136; break; // &rf -> &rfi - case 7224: state = 7225; break; // &rightarrowta -> &rightarrowtai - case 7229: state = 7230; break; // &RightCe -> &RightCei - case 7231: state = 7232; break; // &RightCeil -> &RightCeili - case 7314: state = 7315; break; // &rightr -> &rightri - case 7328: state = 7329; break; // &rightsqu -> &rightsqui - case 7359: state = 7360; break; // &rightthreet -> &rightthreeti - case 7365: state = 7366; break; // &RightTr -> &RightTri - case 7431: state = 7432; break; // &ris -> &risi - case 7465: state = 7466; break; // &rnm -> &rnmi - case 7495: state = 7496; break; // &rot -> &roti - case 7507: state = 7508; break; // &RoundImpl -> &RoundImpli - case 7521: state = 7522; break; // &rppol -> &rppoli - case 7531: state = 7532; break; // &Rr -> &Rri - case 7567: state = 7573; break; // &rt -> &rti - case 7578: state = 7579; break; // &rtr -> &rtri - case 7587: state = 7588; break; // &rtriltr -> &rtriltri - case 7610: state = 7833; break; // &S -> &Si - case 7617: state = 7838; break; // &s -> &si - case 7629: state = 7662; break; // &Sc -> &Sci - case 7631: state = 7666; break; // &sc -> &sci - case 7654: state = 7655; break; // &Sced -> &Scedi - case 7658: state = 7659; break; // &sced -> &scedi - case 7676: state = 7677; break; // &scns -> &scnsi - case 7682: state = 7683; break; // &scpol -> &scpoli - case 7687: state = 7688; break; // &scs -> &scsi - case 7721: state = 7722; break; // &sem -> &semi - case 7730: state = 7731; break; // &setm -> &setmi - case 7799: state = 7800; break; // &shortm -> &shortmi - case 7812: state = 7813; break; // &ShortR -> &ShortRi - case 7887: state = 7888; break; // &SmallC -> &SmallCi - case 7894: state = 7918; break; // &sm -> &smi - case 7901: state = 7902; break; // &smallsetm -> &smallsetmi - case 7962: state = 7963; break; // &spadesu -> &spadesui - case 8027: state = 8028; break; // &SquareIntersect -> &SquareIntersecti - case 8059: state = 8060; break; // &SquareUn -> &SquareUni - case 8086: state = 8087; break; // &ssm -> &ssmi - case 8107: state = 8108; break; // &stra -> &strai - case 8114: state = 8115; break; // &straighteps -> &straightepsi - case 8121: state = 8122; break; // &straightph -> &straightphi - case 8169: state = 8190; break; // &subs -> &subsi - case 8240: state = 8241; break; // &SucceedsT -> &SucceedsTi - case 8261: state = 8262; break; // &succns -> &succnsi - case 8265: state = 8266; break; // &succs -> &succsi - case 8352: state = 8367; break; // &sups -> &supsi - case 8396: state = 8397; break; // &szl -> &szli - case 8400: state = 8544; break; // &T -> &Ti - case 8404: state = 8549; break; // &t -> &ti - case 8432: state = 8433; break; // &Tced -> &Tcedi - case 8437: state = 8438; break; // &tced -> &tcedi - case 8461: state = 8493; break; // &th -> &thi - case 8467: state = 8507; break; // &Th -> &Thi - case 8503: state = 8504; break; // &thicks -> &thicksi - case 8531: state = 8532; break; // &thks -> &thksi - case 8570: state = 8571; break; // &TildeT -> &TildeTi - case 8600: state = 8601; break; // &topc -> &topci - case 8618: state = 8619; break; // &tpr -> &tpri - case 8628: state = 8633; break; // &tr -> &tri - case 8655: state = 8656; break; // &triangler -> &triangleri - case 8670: state = 8671; break; // &trim -> &trimi - case 8676: state = 8677; break; // &Tr -> &Tri - case 8693: state = 8694; break; // &trit -> &triti - case 8700: state = 8701; break; // &trpez -> &trpezi - case 8737: state = 8738; break; // &tw -> &twi - case 8757: state = 8758; break; // &twoheadr -> &twoheadri - case 8793: state = 8794; break; // &Uarroc -> &Uarroci - case 8815: state = 8816; break; // &Uc -> &Uci - case 8820: state = 8821; break; // &uc -> &uci - case 8849: state = 8850; break; // &uf -> &ufi - case 8901: state = 8902; break; // &ultr -> &ultri - case 8916: state = 8945; break; // &Un -> &Uni - case 8941: state = 8942; break; // &UnderParenthes -> &UnderParenthesi - case 9036: state = 9037; break; // &UpEqu -> &UpEqui - case 9038: state = 9039; break; // &UpEquil -> &UpEquili - case 9041: state = 9042; break; // &UpEquilibr -> &UpEquilibri - case 9058: state = 9059; break; // &upharpoonr -> &upharpoonri - case 9081: state = 9082; break; // &UpperR -> &UpperRi - case 9092: state = 9093; break; // &Ups -> &Upsi - case 9095: state = 9096; break; // &ups -> &upsi - case 9127: state = 9145; break; // &ur -> &uri - case 9140: state = 9141; break; // &Ur -> &Uri - case 9150: state = 9151; break; // &urtr -> &urtri - case 9161: state = 9172; break; // &ut -> &uti - case 9166: state = 9167; break; // &Ut -> &Uti - case 9177: state = 9178; break; // &utr -> &utri - case 9211: state = 9212; break; // &vareps -> &varepsi - case 9226: state = 9227; break; // &varnoth -> &varnothi - case 9231: state = 9235; break; // &varp -> &varpi - case 9232: state = 9233; break; // &varph -> &varphi - case 9252: state = 9253; break; // &vars -> &varsi - case 9285: state = 9286; break; // &vartr -> &vartri - case 9297: state = 9298; break; // &vartriangler -> &vartriangleri - case 9356: state = 9357; break; // &vell -> &velli - case 9370: state = 9374; break; // &Vert -> &Verti - case 9382: state = 9383; break; // &VerticalL -> &VerticalLi - case 9397: state = 9398; break; // &VerticalT -> &VerticalTi - case 9405: state = 9406; break; // &VeryTh -> &VeryThi - case 9422: state = 9423; break; // &vltr -> &vltri - case 9447: state = 9448; break; // &vrtr -> &vrtri - case 9477: state = 9478; break; // &vz -> &vzi - case 9485: state = 9486; break; // &Wc -> &Wci - case 9491: state = 9492; break; // &wc -> &wci - case 9496: state = 9512; break; // &we -> &wei - case 9548: state = 9583; break; // &x -> &xi - case 9549: state = 9553; break; // &xc -> &xci - case 9562: state = 9563; break; // &xdtr -> &xdtri - case 9565: state = 9581; break; // &X -> &Xi - case 9598: state = 9599; break; // &xn -> &xni - case 9618: state = 9619; break; // &xot -> &xoti - case 9652: state = 9653; break; // &xutr -> &xutri - case 9672: state = 9712; break; // &y -> &yi - case 9685: state = 9686; break; // &Yc -> &Yci - case 9690: state = 9691; break; // &yc -> &yci - case 9754: state = 9825; break; // &z -> &zi - case 9794: state = 9795; break; // &ZeroW -> &ZeroWi - default: return false; - } - break; - case 'j': - switch (state) { - case 0: state = 3561; break; // & -> &j - case 1432: state = 1665; break; // &d -> &dj - case 2503: state = 2587; break; // &f -> &fj - case 2701: state = 2820; break; // &g -> &gj - case 2824: state = 2830; break; // &gl -> &glj - case 3243: state = 3325; break; // &i -> &ij - case 3624: state = 3672; break; // &k -> &kj - case 3692: state = 4342; break; // &l -> &lj - case 4965: state = 5252; break; // &n -> &nj - case 9848: state = 9849; break; // &zw -> &zwj - case 9851: state = 9852; break; // &zwn -> &zwnj - default: return false; - } - break; - case 'k': - switch (state) { - case 0: state = 3624; break; // & -> &k - case 301: state = 513; break; // &b -> &bk - case 303: state = 304; break; // &bac -> &back - case 333: state = 334; break; // &Bac -> &Back - case 361: state = 362; break; // &bbr -> &bbrk - case 366: state = 367; break; // &bbrktbr -> &bbrktbrk - case 519: state = 566; break; // &bl -> &blk - case 521: state = 522; break; // &blac -> &black - case 563: state = 564; break; // &blan -> &blank - case 576: state = 577; break; // &bloc -> &block - case 965: state = 966; break; // &chec -> &check - case 970: state = 971; break; // &checkmar -> &checkmark - case 1070: state = 1071; break; // &Cloc -> &Clock - case 1234: state = 1235; break; // &CounterCloc -> &CounterClock - case 1463: state = 1464; break; // &db -> &dbk - case 2024: state = 2025; break; // &drb -> &drbk - case 2059: state = 2060; break; // &Dstro -> &Dstrok - case 2064: state = 2065; break; // &dstro -> &dstrok - case 2621: state = 2626; break; // &for -> &fork - case 3017: state = 3018; break; // &Hace -> &Hacek - case 3020: state = 3112; break; // &h -> &hk - case 3136: state = 3137; break; // &hoo -> &hook - case 3199: state = 3200; break; // &Hstro -> &Hstrok - case 3204: state = 3205; break; // &hstro -> &hstrok - case 3436: state = 3437; break; // &intlarh -> &intlarhk - case 3539: state = 3540; break; // &Iu -> &Iuk - case 3544: state = 3545; break; // &iu -> &iuk - case 3608: state = 3609; break; // &Ju -> &Juk - case 3613: state = 3614; break; // &ju -> &juk - case 3776: state = 3777; break; // &larrh -> &larrhk - case 3818: state = 3819; break; // &lbbr -> &lbbrk - case 3821: state = 3828; break; // &lbr -> &lbrk - case 3823: state = 3826; break; // &lbrac -> &lbrack - case 3909: state = 3910; break; // &LeftAngleBrac -> &LeftAngleBrack - case 3970: state = 3971; break; // &LeftDoubleBrac -> &LeftDoubleBrack - case 4335: state = 4336; break; // &lhbl -> &lhblk - case 4431: state = 4432; break; // &lobr -> &lobrk - case 4686: state = 4687; break; // &Lstro -> &Lstrok - case 4691: state = 4692; break; // &lstro -> &lstrok - case 4804: state = 4805; break; // &mar -> &mark - case 5068: state = 5069; break; // &nearh -> &nearhk - case 5106: state = 5107; break; // &NegativeThic -> &NegativeThick - case 5351: state = 5352; break; // &NoBrea -> &NoBreak - case 5358: state = 5359; break; // &NonBrea -> &NonBreak - case 6114: state = 6115; break; // &nwarh -> &nwarhk - case 6444: state = 6447; break; // &OverBrac -> &OverBrack - case 6515: state = 6516; break; // &perten -> &pertenk - case 6550: state = 6551; break; // &pitchfor -> &pitchfork - case 6557: state = 6563; break; // &plan -> &plank - case 6558: state = 6559; break; // &planc -> &planck - case 6947: state = 6948; break; // &rarrh -> &rarrhk - case 7002: state = 7003; break; // &rbbr -> &rbbrk - case 7005: state = 7012; break; // &rbr -> &rbrk - case 7007: state = 7010; break; // &rbrac -> &rbrack - case 7183: state = 7184; break; // &RightAngleBrac -> &RightAngleBrack - case 7245: state = 7246; break; // &RightDoubleBrac -> &RightDoubleBrack - case 7478: state = 7479; break; // &robr -> &robrk - case 7706: state = 7707; break; // &searh -> &searhk - case 8378: state = 8379; break; // &swarh -> &swarhk - case 8416: state = 8417; break; // &tbr -> &tbrk - case 8461: state = 8527; break; // &th -> &thk - case 8494: state = 8495; break; // &thic -> &thick - case 8508: state = 8509; break; // &Thic -> &Thick - case 8611: state = 8612; break; // &topfor -> &topfork - case 8729: state = 8730; break; // &Tstro -> &Tstrok - case 8734: state = 8735; break; // &tstro -> &tstrok - case 8884: state = 8885; break; // &uhbl -> &uhblk - case 8926: state = 8929; break; // &UnderBrac -> &UnderBrack - case 9208: state = 9217; break; // &var -> &vark - default: return false; - } - break; - case 'l': - switch (state) { - case 0: state = 3692; break; // & -> &l - case 1: state = 89; break; // &A -> &Al - case 8: state = 79; break; // &a -> &al - case 50: state = 51; break; // &AE -> &AEl - case 55: state = 56; break; // &ae -> &ael - case 104: state = 108; break; // &ama -> &amal - case 128: state = 129; break; // &ands -> &andsl - case 136: state = 140; break; // &ang -> &angl - case 217: state = 218; break; // &App -> &Appl - case 270: state = 271; break; // &Ati -> &Atil - case 276: state = 277; break; // &ati -> &atil - case 282: state = 283; break; // &Aum -> Ä - case 286: state = 287; break; // &aum -> ä - case 301: state = 519; break; // &b -> &bl - case 313: state = 314; break; // &backepsi -> &backepsil - case 335: state = 336; break; // &Backs -> &Backsl - case 417: state = 418; break; // &Bernou -> &Bernoul - case 418: state = 419; break; // &Bernoul -> &Bernoull - case 460: state = 461; break; // &bigop -> &bigopl - case 486: state = 487; break; // &bigtriang -> &bigtriangl - case 498: state = 499; break; // &bigup -> &bigupl - case 522: state = 523; break; // &black -> &blackl - case 543: state = 544; break; // &blacktriang -> &blacktriangl - case 545: state = 552; break; // &blacktriangle -> &blacktrianglel - case 618: state = 621; break; // &boxD -> &boxDl - case 623: state = 626; break; // &boxd -> &boxdl - case 662: state = 663; break; // &boxp -> &boxpl - case 673: state = 676; break; // &boxU -> &boxUl - case 678: state = 681; break; // &boxu -> &boxul - case 691: state = 705; break; // &boxV -> &boxVl - case 693: state = 709; break; // &boxv -> &boxvl - case 757: state = 758; break; // &bso -> &bsol - case 767: state = 768; break; // &bu -> &bul - case 768: state = 769; break; // &bul -> &bull - case 789: state = 1068; break; // &C -> &Cl - case 796: state = 1117; break; // &c -> &cl - case 830: state = 831; break; // &Capita -> &Capital - case 842: state = 843; break; // &CapitalDifferentia -> &CapitalDifferential - case 855: state = 856; break; // &Cay -> &Cayl - case 878: state = 879; break; // &Ccedi -> Ç - case 883: state = 884; break; // &ccedi -> ç - case 917: state = 918; break; // &cedi -> ¸ - case 922: state = 923; break; // &Cedi -> &Cedil - case 923: state = 924; break; // &Cedil -> &Cedill - case 981: state = 986; break; // &circ -> &circl - case 992: state = 993; break; // &circlearrow -> &circlearrowl - case 1021: state = 1022; break; // &Circ -> &Circl - case 1038: state = 1039; break; // &CircleP -> &CirclePl - case 1089: state = 1090; break; // &ClockwiseContourIntegra -> &ClockwiseContourIntegral - case 1096: state = 1097; break; // &CloseCur -> &CloseCurl - case 1102: state = 1103; break; // &CloseCurlyDoub -> &CloseCurlyDoubl - case 1126: state = 1127; break; // &Co -> &Col - case 1131: state = 1132; break; // &co -> &col - case 1148: state = 1153; break; // &comp -> &compl - case 1197: state = 1198; break; // &ContourIntegra -> &ContourIntegral - case 1231: state = 1232; break; // &CounterC -> &CounterCl - case 1253: state = 1254; break; // &CounterClockwiseContourIntegra -> &CounterClockwiseContourIntegral - case 1292: state = 1308; break; // &cu -> &cul - case 1296: state = 1297; break; // &cudarr -> &cudarrl - case 1346: state = 1353; break; // &cur -> &curl - case 1387: state = 1388; break; // &curvearrow -> &curvearrowl - case 1419: state = 1420; break; // &cy -> &cyl - case 1432: state = 1669; break; // &d -> &dl - case 1433: state = 1439; break; // &da -> &dal - case 1463: state = 1470; break; // &db -> &dbl - case 1516: state = 1525; break; // &de -> &del - case 1519: state = 1520; break; // &De -> &Del - case 1552: state = 1553; break; // &dhar -> &dharl - case 1565: state = 1566; break; // &Diacritica -> &Diacritical - case 1578: state = 1579; break; // &DiacriticalDoub -> &DiacriticalDoubl - case 1594: state = 1595; break; // &DiacriticalTi -> &DiacriticalTil - case 1629: state = 1630; break; // &Differentia -> &Differential - case 1679: state = 1680; break; // &do -> &dol - case 1680: state = 1681; break; // &dol -> &doll - case 1710: state = 1711; break; // &DotEqua -> &DotEqual - case 1719: state = 1720; break; // &dotp -> &dotpl - case 1732: state = 1733; break; // &doub -> &doubl - case 1745: state = 1746; break; // &Doub -> &Doubl - case 1761: state = 1762; break; // &DoubleContourIntegra -> &DoubleContourIntegral - case 1875: state = 1876; break; // &DoubleVertica -> &DoubleVertical - case 1938: state = 1939; break; // &downharpoon -> &downharpoonl - case 2054: state = 2055; break; // &dso -> &dsol - case 2089: state = 2090; break; // &dwang -> &dwangl - case 2108: state = 2206; break; // &E -> &El - case 2115: state = 2204; break; // &e -> &el - case 2148: state = 2149; break; // &eco -> &ecol - case 2204: state = 2220; break; // &el -> &ell - case 2251: state = 2252; break; // &EmptySma -> &EmptySmal - case 2252: state = 2253; break; // &EmptySmal -> &EmptySmall - case 2269: state = 2270; break; // &EmptyVerySma -> &EmptyVerySmal - case 2270: state = 2271; break; // &EmptyVerySmal -> &EmptyVerySmall - case 2312: state = 2319; break; // &ep -> &epl - case 2316: state = 2317; break; // &epars -> &eparsl - case 2324: state = 2333; break; // &epsi -> &epsil - case 2328: state = 2329; break; // &Epsi -> &Epsil - case 2345: state = 2346; break; // &eqco -> &eqcol - case 2350: state = 2354; break; // &eqs -> &eqsl - case 2357: state = 2362; break; // &eqslant -> &eqslantl - case 2369: state = 2370; break; // &Equa -> &Equal - case 2373: state = 2374; break; // &equa -> &equal - case 2378: state = 2379; break; // &EqualTi -> &EqualTil - case 2387: state = 2388; break; // &Equi -> &Equil - case 2406: state = 2407; break; // &eqvpars -> &eqvparsl - case 2448: state = 2449; break; // &Eum -> Ë - case 2452: state = 2453; break; // &eum -> ë - case 2459: state = 2460; break; // &exc -> &excl - case 2489: state = 2490; break; // &Exponentia -> &Exponential - case 2499: state = 2500; break; // &exponentia -> &exponential - case 2503: state = 2592; break; // &f -> &fl - case 2504: state = 2505; break; // &fa -> &fal - case 2505: state = 2506; break; // &fal -> &fall - case 2526: state = 2527; break; // &fema -> &femal - case 2530: state = 2536; break; // &ff -> &ffl - case 2531: state = 2532; break; // &ffi -> &ffil - case 2536: state = 2540; break; // &ffl -> &ffll - case 2549: state = 2550; break; // &fi -> &fil - case 2554: state = 2555; break; // &Fi -> &Fil - case 2555: state = 2556; break; // &Fil -> &Fill - case 2561: state = 2562; break; // &FilledSma -> &FilledSmal - case 2562: state = 2563; break; // &FilledSmal -> &FilledSmall - case 2577: state = 2578; break; // &FilledVerySma -> &FilledVerySmal - case 2578: state = 2579; break; // &FilledVerySmal -> &FilledVerySmall - case 2587: state = 2588; break; // &fj -> &fjl - case 2592: state = 2596; break; // &fl -> &fll - case 2617: state = 2618; break; // &ForA -> &ForAl - case 2618: state = 2619; break; // &ForAl -> &ForAll - case 2622: state = 2623; break; // &fora -> &foral - case 2623: state = 2624; break; // &foral -> &forall - case 2686: state = 2687; break; // &fras -> &frasl - case 2701: state = 2824; break; // &g -> &gl - case 2739: state = 2740; break; // &Gcedi -> &Gcedil - case 2763: state = 2767; break; // &gE -> &gEl - case 2765: state = 2769; break; // &ge -> &gel - case 2775: state = 2776; break; // &geqs -> &geqsl - case 2781: state = 2794; break; // &ges -> &gesl - case 2790: state = 2792; break; // &gesdoto -> &gesdotol - case 2813: state = 2814; break; // &gime -> &gimel - case 2875: state = 2876; break; // &GreaterEqua -> &GreaterEqual - case 2884: state = 2885; break; // &GreaterFu -> &GreaterFul - case 2885: state = 2886; break; // &GreaterFul -> &GreaterFull - case 2890: state = 2891; break; // &GreaterFullEqua -> &GreaterFullEqual - case 2906: state = 2907; break; // &GreaterS -> &GreaterSl - case 2914: state = 2915; break; // &GreaterSlantEqua -> &GreaterSlantEqual - case 2918: state = 2919; break; // &GreaterTi -> &GreaterTil - case 2932: state = 2936; break; // &gsim -> &gsiml - case 2942: state = 2954; break; // > -> >l - case 2965: state = 2993; break; // >r -> >rl - case 2981: state = 2982; break; // >req -> >reql - case 2987: state = 2988; break; // >reqq -> >reqql - case 3021: state = 3027; break; // &ha -> &hal - case 3031: state = 3032; break; // &hami -> &hamil - case 3074: state = 3084; break; // &he -> &hel - case 3084: state = 3085; break; // &hel -> &hell - case 3100: state = 3101; break; // &Hi -> &Hil - case 3137: state = 3138; break; // &hook -> &hookl - case 3177: state = 3178; break; // &Horizonta -> &Horizontal - case 3188: state = 3192; break; // &hs -> &hsl - case 3222: state = 3223; break; // &HumpEqua -> &HumpEqual - case 3227: state = 3228; break; // &hybu -> &hybul - case 3228: state = 3229; break; // &hybul -> &hybull - case 3278: state = 3279; break; // &iexc -> ¡ - case 3320: state = 3321; break; // &IJ -> &IJl - case 3325: state = 3326; break; // &ij -> &ijl - case 3341: state = 3352; break; // &imag -> &imagl - case 3372: state = 3373; break; // &Imp -> &Impl - case 3401: state = 3433; break; // &int -> &intl - case 3404: state = 3405; break; // &intca -> &intcal - case 3416: state = 3417; break; // &Integra -> &Integral - case 3421: state = 3422; break; // &interca -> &intercal - case 3448: state = 3449; break; // &Invisib -> &Invisibl - case 3529: state = 3530; break; // &Iti -> &Itil - case 3534: state = 3535; break; // &iti -> &itil - case 3549: state = 3550; break; // &Ium -> Ï - case 3552: state = 3553; break; // &ium -> ï - case 3635: state = 3636; break; // &Kcedi -> &Kcedil - case 3641: state = 3642; break; // &kcedi -> &kcedil - case 3692: state = 4348; break; // &l -> &ll - case 3698: state = 4346; break; // &L -> &Ll - case 3737: state = 3741; break; // &lang -> &langl - case 3746: state = 3747; break; // &Lap -> &Lapl - case 3766: state = 3779; break; // &larr -> &larrl - case 3782: state = 3783; break; // &larrp -> &larrpl - case 3789: state = 3790; break; // &larrt -> &larrtl - case 3796: state = 3797; break; // &lAtai -> &lAtail - case 3800: state = 3801; break; // &latai -> &latail - case 3831: state = 3832; break; // &lbrks -> &lbrksl - case 3851: state = 3852; break; // &Lcedi -> &Lcedil - case 3856: state = 3857; break; // &lcedi -> &lcedil - case 3859: state = 3860; break; // &lcei -> &lceil - case 3903: state = 3904; break; // &LeftAng -> &LeftAngl - case 3926: state = 4019; break; // &left -> &leftl - case 3950: state = 3951; break; // &leftarrowtai -> &leftarrowtail - case 3955: state = 3956; break; // &LeftCei -> &LeftCeil - case 3964: state = 3965; break; // &LeftDoub -> &LeftDoubl - case 3998: state = 3999; break; // &LeftF -> &LeftFl - case 4124: state = 4125; break; // &LeftTriang -> &LeftTriangl - case 4135: state = 4136; break; // &LeftTriangleEqua -> &LeftTriangleEqual - case 4191: state = 4192; break; // &leqs -> &leqsl - case 4243: state = 4244; break; // &LessEqua -> &LessEqual - case 4254: state = 4255; break; // &LessFu -> &LessFul - case 4255: state = 4256; break; // &LessFul -> &LessFull - case 4260: state = 4261; break; // &LessFullEqua -> &LessFullEqual - case 4284: state = 4285; break; // &LessS -> &LessSl - case 4292: state = 4293; break; // &LessSlantEqua -> &LessSlantEqual - case 4296: state = 4297; break; // &LessTi -> &LessTil - case 4301: state = 4307; break; // &lf -> &lfl - case 4330: state = 4332; break; // &lharu -> &lharul - case 4334: state = 4335; break; // &lhb -> &lhbl - case 4436: state = 4447; break; // &Long -> &Longl - case 4458: state = 4459; break; // &long -> &longl - case 4548: state = 4549; break; // &looparrow -> &looparrowl - case 4560: state = 4569; break; // &lop -> &lopl - case 4623: state = 4625; break; // &lpar -> &lparl - case 4698: state = 4720; break; // < -> <l - case 4767: state = 4909; break; // &m -> &ml - case 4768: state = 4772; break; // &ma -> &mal - case 4789: state = 4796; break; // &mapsto -> &mapstol - case 4839: state = 4840; break; // &measuredang -> &measuredangl - case 4843: state = 4854; break; // &Me -> &Mel - case 4854: state = 4855; break; // &Mel -> &Mell - case 4904: state = 4905; break; // &MinusP -> &MinusPl - case 4917: state = 4918; break; // &mnp -> &mnpl - case 4924: state = 4925; break; // &mode -> &model - case 4952: state = 4954; break; // &mu -> &mul - case 4965: state = 5256; break; // &n -> &nl - case 4967: state = 4968; break; // &nab -> &nabl - case 5005: state = 5006; break; // &natura -> &natural - case 5036: state = 5037; break; // &Ncedi -> &Ncedil - case 5041: state = 5042; break; // &ncedi -> &ncedil - case 5204: state = 5205; break; // &ngeqs -> &ngeqsl - case 5272: state = 5326; break; // &nL -> &nLl - case 5316: state = 5317; break; // &nleqs -> &nleqsl - case 5399: state = 5400; break; // &NotDoub -> &NotDoubl - case 5408: state = 5409; break; // &NotDoubleVertica -> &NotDoubleVertical - case 5414: state = 5415; break; // &NotE -> &NotEl - case 5424: state = 5425; break; // &NotEqua -> &NotEqual - case 5428: state = 5429; break; // &NotEqualTi -> &NotEqualTil - case 5450: state = 5451; break; // &NotGreaterEqua -> &NotGreaterEqual - case 5454: state = 5455; break; // &NotGreaterFu -> &NotGreaterFul - case 5455: state = 5456; break; // &NotGreaterFul -> &NotGreaterFull - case 5460: state = 5461; break; // &NotGreaterFullEqua -> &NotGreaterFullEqual - case 5476: state = 5477; break; // &NotGreaterS -> &NotGreaterSl - case 5484: state = 5485; break; // &NotGreaterSlantEqua -> &NotGreaterSlantEqual - case 5488: state = 5489; break; // &NotGreaterTi -> &NotGreaterTil - case 5509: state = 5510; break; // &NotHumpEqua -> &NotHumpEqual - case 5537: state = 5538; break; // &NotLeftTriang -> &NotLeftTriangl - case 5548: state = 5549; break; // &NotLeftTriangleEqua -> &NotLeftTriangleEqual - case 5557: state = 5558; break; // &NotLessEqua -> &NotLessEqual - case 5573: state = 5574; break; // &NotLessS -> &NotLessSl - case 5581: state = 5582; break; // &NotLessSlantEqua -> &NotLessSlantEqual - case 5585: state = 5586; break; // &NotLessTi -> &NotLessTil - case 5642: state = 5643; break; // &NotPrecedesEqua -> &NotPrecedesEqual - case 5645: state = 5646; break; // &NotPrecedesS -> &NotPrecedesSl - case 5653: state = 5654; break; // &NotPrecedesSlantEqua -> &NotPrecedesSlantEqual - case 5663: state = 5664; break; // &NotReverseE -> &NotReverseEl - case 5680: state = 5681; break; // &NotRightTriang -> &NotRightTriangl - case 5691: state = 5692; break; // &NotRightTriangleEqua -> &NotRightTriangleEqual - case 5710: state = 5711; break; // &NotSquareSubsetEqua -> &NotSquareSubsetEqual - case 5723: state = 5724; break; // &NotSquareSupersetEqua -> &NotSquareSupersetEqual - case 5735: state = 5736; break; // &NotSubsetEqua -> &NotSubsetEqual - case 5748: state = 5749; break; // &NotSucceedsEqua -> &NotSucceedsEqual - case 5751: state = 5752; break; // &NotSucceedsS -> &NotSucceedsSl - case 5759: state = 5760; break; // &NotSucceedsSlantEqua -> &NotSucceedsSlantEqual - case 5763: state = 5764; break; // &NotSucceedsTi -> &NotSucceedsTil - case 5778: state = 5779; break; // &NotSupersetEqua -> &NotSupersetEqual - case 5782: state = 5783; break; // &NotTi -> &NotTil - case 5790: state = 5791; break; // &NotTildeEqua -> &NotTildeEqual - case 5794: state = 5795; break; // &NotTildeFu -> &NotTildeFul - case 5795: state = 5796; break; // &NotTildeFul -> &NotTildeFull - case 5800: state = 5801; break; // &NotTildeFullEqua -> &NotTildeFullEqual - case 5804: state = 5805; break; // &NotTildeTi -> &NotTildeTil - case 5815: state = 5816; break; // &NotVertica -> &NotVertical - case 5825: state = 5826; break; // &npara -> &nparal - case 5826: state = 5827; break; // &nparal -> &nparall - case 5828: state = 5829; break; // &nparalle -> &nparallel - case 5831: state = 5832; break; // &npars -> &nparsl - case 5836: state = 5837; break; // &npo -> &npol - case 5921: state = 5922; break; // &nshortpara -> &nshortparal - case 5922: state = 5923; break; // &nshortparal -> &nshortparall - case 5924: state = 5925; break; // &nshortparalle -> &nshortparallel - case 5988: state = 6003; break; // &nt -> &ntl - case 5989: state = 5990; break; // &ntg -> &ntgl - case 5993: state = 5994; break; // &Nti -> &Ntil - case 5998: state = 5999; break; // &nti -> &ntil - case 6010: state = 6011; break; // &ntriang -> &ntriangl - case 6012: state = 6013; break; // &ntriangle -> &ntrianglel - case 6043: state = 6084; break; // &nv -> &nvl - case 6138: state = 6238; break; // &o -> &ol - case 6169: state = 6170; break; // &Odb -> &Odbl - case 6174: state = 6175; break; // &odb -> &odbl - case 6186: state = 6187; break; // &odso -> &odsol - case 6190: state = 6191; break; // &OE -> &OEl - case 6195: state = 6196; break; // &oe -> &oel - case 6302: state = 6336; break; // &op -> &opl - case 6311: state = 6312; break; // &OpenCur -> &OpenCurl - case 6317: state = 6318; break; // &OpenCurlyDoub -> &OpenCurlyDoubl - case 6368: state = 6369; break; // &ors -> &orsl - case 6378: state = 6386; break; // &Os -> &Osl - case 6382: state = 6391; break; // &os -> &osl - case 6396: state = 6397; break; // &oso -> &osol - case 6400: state = 6401; break; // &Oti -> &Otil - case 6406: state = 6407; break; // &oti -> &otil - case 6423: state = 6424; break; // &Oum -> Ö - case 6427: state = 6428; break; // &oum -> ö - case 6463: state = 6555; break; // &p -> &pl - case 6467: state = 6469; break; // ¶ -> ¶l - case 6469: state = 6470; break; // ¶l -> ¶ll - case 6471: state = 6472; break; // ¶lle -> ¶llel - case 6474: state = 6478; break; // &pars -> &parsl - case 6482: state = 6587; break; // &P -> &Pl - case 6487: state = 6488; break; // &Partia -> &Partial - case 6508: state = 6509; break; // &permi -> &permil - case 6616: state = 6617; break; // &Poincarep -> &Poincarepl - case 6666: state = 6667; break; // &preccur -> &preccurl - case 6682: state = 6683; break; // &PrecedesEqua -> &PrecedesEqual - case 6685: state = 6686; break; // &PrecedesS -> &PrecedesSl - case 6693: state = 6694; break; // &PrecedesSlantEqua -> &PrecedesSlantEqual - case 6697: state = 6698; break; // &PrecedesTi -> &PrecedesTil - case 6754: state = 6760; break; // &prof -> &profl - case 6755: state = 6756; break; // &profa -> &profal - case 6780: state = 6781; break; // &Proportiona -> &Proportional - case 6792: state = 6793; break; // &prure -> &prurel - case 6876: state = 7442; break; // &r -> &rl - case 6912: state = 6918; break; // &rang -> &rangl - case 6932: state = 6950; break; // &rarr -> &rarrl - case 6953: state = 6954; break; // &rarrp -> &rarrpl - case 6960: state = 6961; break; // &Rarrt -> &Rarrtl - case 6963: state = 6964; break; // &rarrt -> &rarrtl - case 6970: state = 6971; break; // &rAtai -> &rAtail - case 6975: state = 6976; break; // &ratai -> &ratail - case 6982: state = 6983; break; // &rationa -> &rational - case 7015: state = 7016; break; // &rbrks -> &rbrksl - case 7035: state = 7036; break; // &Rcedi -> &Rcedil - case 7040: state = 7041; break; // &rcedi -> &rcedil - case 7043: state = 7044; break; // &rcei -> &rceil - case 7053: state = 7057; break; // &rd -> &rdl - case 7075: state = 7076; break; // &rea -> &real - case 7102: state = 7103; break; // &ReverseE -> &ReverseEl - case 7112: state = 7113; break; // &ReverseEqui -> &ReverseEquil - case 7126: state = 7127; break; // &ReverseUpEqui -> &ReverseUpEquil - case 7135: state = 7141; break; // &rf -> &rfl - case 7160: state = 7162; break; // &rharu -> &rharul - case 7177: state = 7178; break; // &RightAng -> &RightAngl - case 7202: state = 7294; break; // &right -> &rightl - case 7225: state = 7226; break; // &rightarrowtai -> &rightarrowtail - case 7230: state = 7231; break; // &RightCei -> &RightCeil - case 7239: state = 7240; break; // &RightDoub -> &RightDoubl - case 7273: state = 7274; break; // &RightF -> &RightFl - case 7369: state = 7370; break; // &RightTriang -> &RightTriangl - case 7380: state = 7381; break; // &RightTriangleEqua -> &RightTriangleEqual - case 7481: state = 7491; break; // &rop -> &ropl - case 7506: state = 7507; break; // &RoundImp -> &RoundImpl - case 7520: state = 7521; break; // &rppo -> &rppol - case 7579: state = 7585; break; // &rtri -> &rtril - case 7590: state = 7591; break; // &Ru -> &Rul - case 7594: state = 7595; break; // &RuleDe -> &RuleDel - case 7601: state = 7602; break; // &ru -> &rul - case 7617: state = 7878; break; // &s -> &sl - case 7655: state = 7656; break; // &Scedi -> &Scedil - case 7659: state = 7660; break; // &scedi -> &scedil - case 7681: state = 7682; break; // &scpo -> &scpol - case 7806: state = 7807; break; // &shortpara -> &shortparal - case 7807: state = 7808; break; // &shortparal -> &shortparall - case 7809: state = 7810; break; // &shortparalle -> &shortparallel - case 7847: state = 7861; break; // &sim -> &siml - case 7868: state = 7869; break; // &simp -> &simpl - case 7884: state = 7885; break; // &Sma -> &Smal - case 7885: state = 7886; break; // &Smal -> &Small - case 7890: state = 7891; break; // &SmallCirc -> &SmallCircl - case 7895: state = 7896; break; // &sma -> &smal - case 7896: state = 7897; break; // &smal -> &small - case 7915: state = 7916; break; // &smepars -> &smeparsl - case 7918: state = 7921; break; // &smi -> &smil - case 7936: state = 7942; break; // &so -> &sol - case 8042: state = 8043; break; // &SquareSubsetEqua -> &SquareSubsetEqual - case 8055: state = 8056; break; // &SquareSupersetEqua -> &SquareSupersetEqual - case 8087: state = 8088; break; // &ssmi -> &ssmil - case 8115: state = 8116; break; // &straightepsi -> &straightepsil - case 8146: state = 8147; break; // &submu -> &submul - case 8155: state = 8156; break; // &subp -> &subpl - case 8181: state = 8182; break; // &SubsetEqua -> &SubsetEqual - case 8210: state = 8211; break; // &succcur -> &succcurl - case 8226: state = 8227; break; // &SucceedsEqua -> &SucceedsEqual - case 8229: state = 8230; break; // &SucceedsS -> &SucceedsSl - case 8237: state = 8238; break; // &SucceedsSlantEqua -> &SucceedsSlantEqual - case 8241: state = 8242; break; // &SucceedsTi -> &SucceedsTil - case 8284: state = 8328; break; // &sup -> &supl - case 8317: state = 8318; break; // &SupersetEqua -> &SupersetEqual - case 8322: state = 8323; break; // &suphso -> &suphsol - case 8334: state = 8335; break; // &supmu -> &supmul - case 8343: state = 8344; break; // &supp -> &suppl - case 8395: state = 8396; break; // &sz -> &szl - case 8433: state = 8434; break; // &Tcedi -> &Tcedil - case 8438: state = 8439; break; // &tcedi -> &tcedil - case 8449: state = 8450; break; // &te -> &tel - case 8544: state = 8545; break; // &Ti -> &Til - case 8549: state = 8550; break; // &ti -> &til - case 8557: state = 8558; break; // &TildeEqua -> &TildeEqual - case 8561: state = 8562; break; // &TildeFu -> &TildeFul - case 8562: state = 8563; break; // &TildeFul -> &TildeFull - case 8567: state = 8568; break; // &TildeFullEqua -> &TildeFullEqual - case 8571: state = 8572; break; // &TildeTi -> &TildeTil - case 8636: state = 8637; break; // &triang -> &triangl - case 8638: state = 8645; break; // &triangle -> &trianglel - case 8678: state = 8679; break; // &Trip -> &Tripl - case 8685: state = 8686; break; // &trip -> &tripl - case 8746: state = 8747; break; // &twohead -> &twoheadl - case 8775: state = 8887; break; // &u -> &ul - case 8835: state = 8836; break; // &Udb -> &Udbl - case 8840: state = 8841; break; // &udb -> &udbl - case 8878: state = 8879; break; // &uhar -> &uharl - case 8883: state = 8884; break; // &uhb -> &uhbl - case 8909: state = 8914; break; // &um -> ¨ - case 8949: state = 8950; break; // &UnionP -> &UnionPl - case 8983: state = 9064; break; // &up -> &upl - case 9037: state = 9038; break; // &UpEqui -> &UpEquil - case 9052: state = 9053; break; // &upharpoon -> &upharpoonl - case 9093: state = 9100; break; // &Upsi -> &Upsil - case 9096: state = 9104; break; // &upsi -> &upsil - case 9167: state = 9168; break; // &Uti -> &Util - case 9172: state = 9173; break; // &uti -> &util - case 9188: state = 9189; break; // &Uum -> Ü - case 9191: state = 9192; break; // &uum -> ü - case 9197: state = 9198; break; // &uwang -> &uwangl - case 9201: state = 9420; break; // &v -> &vl - case 9212: state = 9213; break; // &varepsi -> &varepsil - case 9289: state = 9290; break; // &vartriang -> &vartriangl - case 9291: state = 9292; break; // &vartriangle -> &vartrianglel - case 9328: state = 9340; break; // &Vdash -> &Vdashl - case 9345: state = 9355; break; // &ve -> &vel - case 9355: state = 9356; break; // &vel -> &vell - case 9376: state = 9377; break; // &Vertica -> &Vertical - case 9398: state = 9399; break; // &VerticalTi -> &VerticalTil - case 9548: state = 9585; break; // &x -> &xl - case 9611: state = 9614; break; // &xop -> &xopl - case 9646: state = 9647; break; // &xup -> &xupl - case 9741: state = 9742; break; // &Yum -> &Yuml - case 9744: state = 9745; break; // &yum -> ÿ - default: return false; - } - break; - case 'm': - switch (state) { - case 0: state = 4767; break; // & -> &m - case 1: state = 98; break; // &A -> &Am - case 8: state = 103; break; // &a -> &am - case 83: state = 84; break; // &alefsy -> &alefsym - case 136: state = 143; break; // &ang -> &angm - case 262: state = 263; break; // &asy -> &asym - case 281: state = 282; break; // &Au -> &Aum - case 285: state = 286; break; // &au -> &aum - case 320: state = 321; break; // &backpri -> &backprim - case 325: state = 326; break; // &backsi -> &backsim - case 384: state = 399; break; // &be -> &bem - case 466: state = 467; break; // &bigoti -> &bigotim - case 605: state = 606; break; // &botto -> &bottom - case 613: state = 656; break; // &box -> &boxm - case 668: state = 669; break; // &boxti -> &boxtim - case 721: state = 722; break; // &bpri -> &bprim - case 748: state = 749; break; // &bse -> &bsem - case 752: state = 753; break; // &bsi -> &bsim - case 767: state = 774; break; // &bu -> &bum - case 781: state = 782; break; // &Bu -> &Bum - case 904: state = 905; break; // &ccupss -> &ccupssm - case 915: state = 927; break; // &ce -> &cem - case 966: state = 968; break; // &check -> &checkm - case 979: state = 1059; break; // &cir -> &cirm - case 1044: state = 1045; break; // &CircleTi -> &CircleTim - case 1131: state = 1142; break; // &co -> &com - case 1142: state = 1143; break; // &com -> &comm - case 1154: state = 1155; break; // &comple -> &complem - case 1349: state = 1351; break; // &curarr -> &curarrm - case 1516: state = 1529; break; // &de -> &dem - case 1558: state = 1603; break; // &Dia -> &Diam - case 1600: state = 1601; break; // &dia -> &diam - case 1634: state = 1635; break; // &diga -> &digam - case 1635: state = 1636; break; // &digam -> &digamm - case 1652: state = 1653; break; // ÷onti -> ÷ontim - case 1694: state = 1713; break; // &dot -> &dotm - case 2108: state = 2228; break; // &E -> &Em - case 2115: state = 2233; break; // &e -> &em - case 2207: state = 2208; break; // &Ele -> &Elem - case 2249: state = 2250; break; // &EmptyS -> &EmptySm - case 2267: state = 2268; break; // &EmptyVeryS -> &EmptyVerySm - case 2351: state = 2352; break; // &eqsi -> &eqsim - case 2393: state = 2394; break; // &Equilibriu -> &Equilibrium - case 2430: state = 2431; break; // &Esi -> &Esim - case 2433: state = 2434; break; // &esi -> &esim - case 2447: state = 2448; break; // &Eu -> &Eum - case 2451: state = 2452; break; // &eu -> &eum - case 2524: state = 2525; break; // &fe -> &fem - case 2559: state = 2560; break; // &FilledS -> &FilledSm - case 2575: state = 2576; break; // &FilledVeryS -> &FilledVerySm - case 2702: state = 2714; break; // &ga -> &gam - case 2709: state = 2710; break; // &Ga -> &Gam - case 2710: state = 2711; break; // &Gam -> &Gamm - case 2714: state = 2715; break; // &gam -> &gamm - case 2811: state = 2812; break; // &gi -> &gim - case 2850: state = 2851; break; // &gnsi -> &gnsim - case 2931: state = 2932; break; // &gsi -> &gsim - case 2999: state = 3000; break; // >rsi -> >rsim - case 3021: state = 3030; break; // &ha -> &ham - case 3126: state = 3131; break; // &ho -> &hom - case 3207: state = 3208; break; // &Hu -> &Hum - case 3215: state = 3216; break; // &HumpDownHu -> &HumpDownHum - case 3236: state = 3330; break; // &I -> &Im - case 3243: state = 3336; break; // &i -> &im - case 3452: state = 3453; break; // &InvisibleCo -> &InvisibleCom - case 3453: state = 3454; break; // &InvisibleCom -> &InvisibleComm - case 3458: state = 3459; break; // &InvisibleTi -> &InvisibleTim - case 3539: state = 3549; break; // &Iu -> &Ium - case 3544: state = 3552; break; // &iu -> &ium - case 3561: state = 3577; break; // &j -> &jm - case 3692: state = 4385; break; // &l -> &lm - case 3698: state = 4379; break; // &L -> &Lm - case 3699: state = 3723; break; // &La -> &Lam - case 3705: state = 3728; break; // &la -> &lam - case 3711: state = 3712; break; // &lae -> &laem - case 3786: state = 3787; break; // &larrsi -> &larrsim - case 4115: state = 4116; break; // &leftthreeti -> &leftthreetim - case 4281: state = 4282; break; // &lesssi -> &lesssim - case 4419: state = 4420; break; // &lnsi -> &lnsim - case 4458: state = 4502; break; // &long -> &longm - case 4574: state = 4575; break; // &loti -> &lotim - case 4628: state = 4646; break; // &lr -> &lrm - case 4669: state = 4670; break; // &lsi -> &lsim - case 4715: state = 4716; break; // <i -> <im - case 4810: state = 4811; break; // &mco -> &mcom - case 4811: state = 4812; break; // &mcom -> &mcomm - case 4846: state = 4847; break; // &Mediu -> &Medium - case 4952: state = 4961; break; // &mu -> &mum - case 4956: state = 4957; break; // &multi -> &multim - case 4965: state = 5343; break; // &n -> &nm - case 5014: state = 5015; break; // &nbu -> &nbum - case 5095: state = 5096; break; // &NegativeMediu -> &NegativeMedium - case 5145: state = 5146; break; // &nesi -> &nesim - case 5216: state = 5217; break; // &ngsi -> &ngsim - case 5329: state = 5330; break; // &nlsi -> &nlsim - case 5416: state = 5417; break; // &NotEle -> &NotElem - case 5494: state = 5495; break; // &NotHu -> &NotHum - case 5502: state = 5503; break; // &NotHumpDownHu -> &NotHumpDownHum - case 5665: state = 5666; break; // &NotReverseEle -> &NotReverseElem - case 5895: state = 5934; break; // &ns -> &nsm - case 5913: state = 5914; break; // &nshort -> &nshortm - case 5927: state = 5928; break; // &nsi -> &nsim - case 6032: state = 6034; break; // &nu -> &num - case 6108: state = 6109; break; // &nvsi -> &nvsim - case 6131: state = 6258; break; // &O -> &Om - case 6138: state = 6263; break; // &o -> &om - case 6227: state = 6232; break; // &oh -> &ohm - case 6348: state = 6358; break; // &ord -> º - case 6400: state = 6411; break; // &Oti -> &Otim - case 6406: state = 6415; break; // &oti -> &otim - case 6422: state = 6423; break; // &Ou -> &Oum - case 6426: state = 6427; break; // &ou -> &oum - case 6463: state = 6607; break; // &p -> &pm - case 6475: state = 6476; break; // &parsi -> &parsim - case 6498: state = 6507; break; // &per -> &perm - case 6527: state = 6532; break; // &ph -> &phm - case 6532: state = 6533; break; // &phm -> &phmm - case 6567: state = 6596; break; // &plus -> &plusm - case 6600: state = 6601; break; // &plussi -> &plussim - case 6718: state = 6719; break; // &precnsi -> &precnsim - case 6722: state = 6723; break; // &precsi -> &precsim - case 6725: state = 6726; break; // &Pri -> &Prim - case 6729: state = 6730; break; // &pri -> &prim - case 6742: state = 6743; break; // &prnsi -> &prnsim - case 6787: state = 6788; break; // &prsi -> &prsim - case 6835: state = 6836; break; // &qpri -> &qprim - case 6876: state = 7453; break; // &r -> &rm - case 6901: state = 6902; break; // &rae -> &raem - case 6957: state = 6958; break; // &rarrsi -> &rarrsim - case 7104: state = 7105; break; // &ReverseEle -> &ReverseElem - case 7118: state = 7119; break; // &ReverseEquilibriu -> &ReverseEquilibrium - case 7132: state = 7133; break; // &ReverseUpEquilibriu -> &ReverseUpEquilibrium - case 7360: state = 7361; break; // &rightthreeti -> &rightthreetim - case 7442: state = 7451; break; // &rl -> &rlm - case 7464: state = 7465; break; // &rn -> &rnm - case 7496: state = 7497; break; // &roti -> &rotim - case 7504: state = 7505; break; // &RoundI -> &RoundIm - case 7573: state = 7574; break; // &rti -> &rtim - case 7610: state = 7883; break; // &S -> &Sm - case 7617: state = 7894; break; // &s -> &sm - case 7677: state = 7678; break; // &scnsi -> &scnsim - case 7688: state = 7689; break; // &scsi -> &scsim - case 7703: state = 7721; break; // &se -> &sem - case 7729: state = 7730; break; // &set -> &setm - case 7798: state = 7799; break; // &short -> &shortm - case 7834: state = 7835; break; // &Sig -> &Sigm - case 7838: state = 7847; break; // &si -> &sim - case 7839: state = 7840; break; // &sig -> &sigm - case 7900: state = 7901; break; // &smallset -> &smallsetm - case 8077: state = 8086; break; // &ss -> &ssm - case 8082: state = 8083; break; // &sset -> &ssetm - case 8127: state = 8275; break; // &Su -> &Sum - case 8130: state = 8277; break; // &su -> &sum - case 8131: state = 8145; break; // &sub -> &subm - case 8190: state = 8191; break; // &subsi -> &subsim - case 8262: state = 8263; break; // &succnsi -> &succnsim - case 8266: state = 8267; break; // &succsi -> &succsim - case 8284: state = 8333; break; // &sup -> &supm - case 8367: state = 8368; break; // &supsi -> &supsim - case 8488: state = 8489; break; // &thetasy -> &thetasym - case 8504: state = 8505; break; // &thicksi -> &thicksim - case 8532: state = 8533; break; // &thksi -> &thksim - case 8549: state = 8576; break; // &ti -> &tim - case 8619: state = 8620; break; // &tpri -> &tprim - case 8633: state = 8670; break; // &tri -> &trim - case 8694: state = 8695; break; // &triti -> &tritim - case 8702: state = 8703; break; // &trpeziu -> &trpezium - case 8768: state = 8904; break; // &U -> &Um - case 8775: state = 8909; break; // &u -> &um - case 9043: state = 9044; break; // &UpEquilibriu -> &UpEquilibrium - case 9182: state = 9191; break; // &uu -> &uum - case 9187: state = 9188; break; // &Uu -> &Uum - case 9254: state = 9255; break; // &varsig -> &varsigm - case 9548: state = 9594; break; // &x -> &xm - case 9619: state = 9620; break; // &xoti -> &xotim - case 9736: state = 9744; break; // &yu -> &yum - case 9740: state = 9741; break; // &Yu -> &Yum - default: return false; - } - break; - case 'n': - switch (state) { - case 0: state = 4965; break; // & -> &n - case 1: state = 116; break; // &A -> &An - case 8: state = 119; break; // &a -> &an - case 122: state = 123; break; // &anda -> &andan - case 185: state = 186; break; // &Aogo -> &Aogon - case 190: state = 191; break; // &aogo -> &aogon - case 221: state = 222; break; // &ApplyFu -> &ApplyFun - case 226: state = 227; break; // &ApplyFunctio -> &ApplyFunction - case 238: state = 239; break; // &Ari -> &Arin - case 243: state = 244; break; // &ari -> &arin - case 257: state = 258; break; // &Assig -> &Assign - case 291: state = 292; break; // &awco -> &awcon - case 293: state = 294; break; // &awconi -> &awconin - case 297: state = 298; break; // &awi -> &awin - case 301: state = 579; break; // &b -> &bn - case 306: state = 307; break; // &backco -> &backcon - case 315: state = 316; break; // &backepsilo -> &backepsilon - case 370: state = 371; break; // &bco -> &bcon - case 409: state = 410; break; // &ber -> &bern - case 414: state = 415; break; // &Ber -> &Bern - case 433: state = 434; break; // &betwee -> &between - case 484: state = 485; break; // &bigtria -> &bigtrian - case 491: state = 492; break; // &bigtriangledow -> &bigtriangledown - case 520: state = 563; break; // &bla -> &blan - case 526: state = 527; break; // &blackloze -> &blacklozen - case 541: state = 542; break; // &blacktria -> &blacktrian - case 549: state = 550; break; // &blacktriangledow -> &blacktriangledown - case 657: state = 658; break; // &boxmi -> &boxmin - case 807: state = 808; break; // &capa -> &capan - case 838: state = 839; break; // &CapitalDiffere -> &CapitalDifferen - case 852: state = 853; break; // &caro -> &caron - case 869: state = 870; break; // &Ccaro -> &Ccaron - case 873: state = 874; break; // &ccaro -> &ccaron - case 894: state = 895; break; // &Cco -> &Ccon - case 896: state = 897; break; // &Cconi -> &Cconin - case 915: state = 933; break; // &ce -> &cen - case 920: state = 936; break; // &Ce -> &Cen - case 1033: state = 1034; break; // &CircleMi -> &CircleMin - case 1053: state = 1054; break; // &cirf -> &cirfn - case 1055: state = 1056; break; // &cirfni -> &cirfnin - case 1077: state = 1078; break; // &ClockwiseCo -> &ClockwiseCon - case 1083: state = 1084; break; // &ClockwiseContourI -> &ClockwiseContourIn - case 1126: state = 1171; break; // &Co -> &Con - case 1128: state = 1129; break; // &Colo -> &Colon - case 1131: state = 1164; break; // &co -> &con - case 1133: state = 1134; break; // &colo -> &colon - case 1150: state = 1151; break; // &compf -> &compfn - case 1156: state = 1157; break; // &compleme -> &complemen - case 1175: state = 1176; break; // &Congrue -> &Congruen - case 1179: state = 1180; break; // &Coni -> &Conin - case 1183: state = 1184; break; // &coni -> &conin - case 1191: state = 1192; break; // &ContourI -> &ContourIn - case 1226: state = 1227; break; // &Cou -> &Coun - case 1241: state = 1242; break; // &CounterClockwiseCo -> &CounterClockwiseCon - case 1247: state = 1248; break; // &CounterClockwiseContourI -> &CounterClockwiseContourIn - case 1378: state = 1379; break; // &curre -> ¤ - case 1409: state = 1410; break; // &cwco -> &cwcon - case 1411: state = 1412; break; // &cwconi -> &cwconin - case 1415: state = 1416; break; // &cwi -> &cwin - case 1477: state = 1478; break; // &Dcaro -> &Dcaron - case 1483: state = 1484; break; // &dcaro -> &dcaron - case 1604: state = 1605; break; // &Diamo -> &Diamon - case 1608: state = 1609; break; // &diamo -> &diamon - case 1625: state = 1626; break; // &Differe -> &Differen - case 1640: state = 1641; break; // &disi -> &disin - case 1649: state = 1650; break; // ÷o -> ÷on - case 1657: state = 1658; break; // &divo -> &divon - case 1672: state = 1673; break; // &dlcor -> &dlcorn - case 1714: state = 1715; break; // &dotmi -> &dotmin - case 1749: state = 1750; break; // &DoubleCo -> &DoubleCon - case 1755: state = 1756; break; // &DoubleContourI -> &DoubleContourIn - case 1768: state = 1769; break; // &DoubleDow -> &DoubleDown - case 1801: state = 1802; break; // &DoubleLo -> &DoubleLon - case 1861: state = 1862; break; // &DoubleUpDow -> &DoubleUpDown - case 1881: state = 1882; break; // &Dow -> &Down - case 1895: state = 1896; break; // &dow -> &down - case 1923: state = 1924; break; // &downdow -> &downdown - case 1937: state = 1938; break; // &downharpoo -> &downharpoon - case 2033: state = 2034; break; // &drcor -> &drcorn - case 2087: state = 2088; break; // &dwa -> &dwan - case 2115: state = 2290; break; // &e -> &en - case 2130: state = 2131; break; // &Ecaro -> &Ecaron - case 2136: state = 2137; break; // &ecaro -> &ecaron - case 2150: state = 2151; break; // &ecolo -> &ecolon - case 2209: state = 2210; break; // &Eleme -> &Elemen - case 2213: state = 2214; break; // &eli -> &elin - case 2298: state = 2299; break; // &Eogo -> &Eogon - case 2303: state = 2304; break; // &eogo -> &eogon - case 2330: state = 2331; break; // &Epsilo -> &Epsilon - case 2334: state = 2335; break; // &epsilo -> &epsilon - case 2347: state = 2348; break; // &eqcolo -> &eqcolon - case 2355: state = 2356; break; // &eqsla -> &eqslan - case 2479: state = 2480; break; // &expectatio -> &expectation - case 2483: state = 2484; break; // &Expo -> &Expon - case 2485: state = 2486; break; // &Expone -> &Exponen - case 2493: state = 2494; break; // &expo -> &expon - case 2495: state = 2496; break; // &expone -> &exponen - case 2503: state = 2604; break; // &f -> &fn - case 2507: state = 2508; break; // &falli -> &fallin - case 2600: state = 2601; break; // &flt -> &fltn - case 2643: state = 2644; break; // &fparti -> &fpartin - case 2690: state = 2691; break; // &frow -> &frown - case 2701: state = 2832; break; // &g -> &gn - case 2777: state = 2778; break; // &geqsla -> &geqslan - case 2908: state = 2909; break; // &GreaterSla -> &GreaterSlan - case 3002: state = 3011; break; // &gv -> &gvn - case 3005: state = 3006; break; // &gvert -> &gvertn - case 3091: state = 3092; break; // &herco -> &hercon - case 3174: state = 3175; break; // &Horizo -> &Horizon - case 3180: state = 3181; break; // &HorizontalLi -> &HorizontalLin - case 3212: state = 3213; break; // &HumpDow -> &HumpDown - case 3233: state = 3234; break; // &hyphe -> &hyphen - case 3236: state = 3398; break; // &I -> &In - case 3243: state = 3378; break; // &i -> &in - case 3301: state = 3311; break; // &ii -> &iin - case 3303: state = 3308; break; // &iii -> &iiin - case 3304: state = 3305; break; // &iiii -> &iiiin - case 3313: state = 3314; break; // &iinfi -> &iinfin - case 3345: state = 3346; break; // &Imagi -> &Imagin - case 3353: state = 3354; break; // &imagli -> &imaglin - case 3386: state = 3387; break; // &infi -> &infin - case 3430: state = 3431; break; // &Intersectio -> &Intersection - case 3473: state = 3474; break; // &Iogo -> &Iogon - case 3477: state = 3478; break; // &iogo -> &iogon - case 3511: state = 3512; break; // &isi -> &isin - case 3657: state = 3658; break; // &kgree -> &kgreen - case 3692: state = 4401; break; // &l -> &ln - case 3699: state = 3733; break; // &La -> &Lan - case 3705: state = 3736; break; // &la -> &lan - case 3720: state = 3721; break; // &lagra -> &lagran - case 3840: state = 3841; break; // &Lcaro -> &Lcaron - case 3846: state = 3847; break; // &lcaro -> &lcaron - case 3901: state = 3902; break; // &LeftA -> &LeftAn - case 3957: state = 3958; break; // &LeftCeili -> &LeftCeilin - case 3975: state = 3976; break; // &LeftDow -> &LeftDown - case 4009: state = 4010; break; // &leftharpoo -> &leftharpoon - case 4013: state = 4014; break; // &leftharpoondow -> &leftharpoondown - case 4070: state = 4071; break; // &leftrightharpoo -> &leftrightharpoon - case 4122: state = 4123; break; // &LeftTria -> &LeftTrian - case 4142: state = 4143; break; // &LeftUpDow -> &LeftUpDown - case 4193: state = 4194; break; // &leqsla -> &leqslan - case 4286: state = 4287; break; // &LessSla -> &LessSlan - case 4356: state = 4357; break; // &llcor -> &llcorn - case 4422: state = 4457; break; // &lo -> &lon - case 4423: state = 4424; break; // &loa -> &loan - case 4434: state = 4435; break; // &Lo -> &Lon - case 4614: state = 4615; break; // &loze -> &lozen - case 4635: state = 4636; break; // &lrcor -> &lrcorn - case 4755: state = 4764; break; // &lv -> &lvn - case 4758: state = 4759; break; // &lvert -> &lvertn - case 4767: state = 4916; break; // &m -> &mn - case 4793: state = 4794; break; // &mapstodow -> &mapstodown - case 4837: state = 4838; break; // &measureda -> &measuredan - case 4856: state = 4857; break; // &Melli -> &Mellin - case 4871: state = 4890; break; // &mi -> &min - case 4900: state = 4901; break; // &Mi -> &Min - case 4966: state = 4983; break; // &na -> &nan - case 5027: state = 5028; break; // &Ncaro -> &Ncaron - case 5031: state = 5032; break; // &ncaro -> &ncaron - case 5044: state = 5045; break; // &nco -> &ncon - case 5105: state = 5114; break; // &NegativeThi -> &NegativeThin - case 5127: state = 5128; break; // &NegativeVeryThi -> &NegativeVeryThin - case 5178: state = 5179; break; // &NewLi -> &NewLin - case 5206: state = 5207; break; // &ngeqsla -> &ngeqslan - case 5318: state = 5319; break; // &nleqsla -> &nleqslan - case 5347: state = 5354; break; // &No -> &Non - case 5360: state = 5361; break; // &NonBreaki -> &NonBreakin - case 5378: state = 5620; break; // ¬ -> ¬n - case 5381: state = 5382; break; // &NotCo -> &NotCon - case 5386: state = 5387; break; // &NotCongrue -> &NotCongruen - case 5418: state = 5419; break; // &NotEleme -> &NotElemen - case 5478: state = 5479; break; // &NotGreaterSla -> &NotGreaterSlan - case 5499: state = 5500; break; // &NotHumpDow -> &NotHumpDown - case 5512: state = 5513; break; // ¬i -> ¬in - case 5535: state = 5536; break; // &NotLeftTria -> &NotLeftTrian - case 5575: state = 5576; break; // &NotLessSla -> &NotLessSlan - case 5647: state = 5648; break; // &NotPrecedesSla -> &NotPrecedesSlan - case 5667: state = 5668; break; // &NotReverseEleme -> &NotReverseElemen - case 5678: state = 5679; break; // &NotRightTria -> &NotRightTrian - case 5753: state = 5754; break; // &NotSucceedsSla -> &NotSucceedsSlan - case 5838: state = 5839; break; // &npoli -> &npolin - case 6008: state = 6009; break; // &ntria -> &ntrian - case 6078: state = 6079; break; // &nvi -> &nvin - case 6081: state = 6082; break; // &nvinfi -> &nvinfin - case 6111: state = 6126; break; // &nw -> &nwn - case 6211: state = 6212; break; // &ogo -> &ogon - case 6234: state = 6235; break; // &oi -> &oin - case 6252: state = 6253; break; // &oli -> &olin - case 6279: state = 6280; break; // &Omicro -> &Omicron - case 6282: state = 6290; break; // &omi -> &omin - case 6285: state = 6286; break; // &omicro -> &omicron - case 6307: state = 6308; break; // &Ope -> &Open - case 6454: state = 6455; break; // &OverPare -> &OverParen - case 6499: state = 6500; break; // &perc -> &percn - case 6514: state = 6515; break; // &perte -> &perten - case 6537: state = 6538; break; // &pho -> &phon - case 6556: state = 6557; break; // &pla -> &plan - case 6591: state = 6592; break; // &PlusMi -> &PlusMin - case 6596: state = 6597; break; // &plusm -> ± - case 6610: state = 6611; break; // &Poi -> &Poin - case 6618: state = 6619; break; // &Poincarepla -> &Poincareplan - case 6623: state = 6624; break; // &poi -> &poin - case 6626: state = 6627; break; // &pointi -> &pointin - case 6636: state = 6637; break; // &pou -> &poun - case 6642: state = 6735; break; // &pr -> &prn - case 6655: state = 6705; break; // &prec -> &precn - case 6687: state = 6688; break; // &PrecedesSla -> &PrecedesSlan - case 6761: state = 6762; break; // &profli -> &proflin - case 6777: state = 6778; break; // &Proportio -> &Proportion - case 6807: state = 6808; break; // &pu -> &pun - case 6821: state = 6822; break; // &qi -> &qin - case 6851: state = 6852; break; // &quater -> &quatern - case 6854: state = 6855; break; // &quaternio -> &quaternion - case 6858: state = 6859; break; // &quati -> &quatin - case 6876: state = 7464; break; // &r -> &rn - case 6882: state = 6911; break; // &ra -> &ran - case 6887: state = 6908; break; // &Ra -> &Ran - case 6979: state = 6981; break; // &ratio -> &ration - case 7024: state = 7025; break; // &Rcaro -> &Rcaron - case 7030: state = 7031; break; // &rcaro -> &rcaron - case 7078: state = 7079; break; // &reali -> &realin - case 7106: state = 7107; break; // &ReverseEleme -> &ReverseElemen - case 7175: state = 7176; break; // &RightA -> &RightAn - case 7199: state = 7428; break; // &ri -> &rin - case 7232: state = 7233; break; // &RightCeili -> &RightCeilin - case 7250: state = 7251; break; // &RightDow -> &RightDown - case 7284: state = 7285; break; // &rightharpoo -> &rightharpoon - case 7288: state = 7289; break; // &rightharpoondow -> &rightharpoondown - case 7310: state = 7311; break; // &rightleftharpoo -> &rightleftharpoon - case 7367: state = 7368; break; // &RightTria -> &RightTrian - case 7387: state = 7388; break; // &RightUpDow -> &RightUpDown - case 7432: state = 7433; break; // &risi -> &risin - case 7470: state = 7471; break; // &roa -> &roan - case 7501: state = 7502; break; // &Rou -> &Roun - case 7522: state = 7523; break; // &rppoli -> &rppolin - case 7631: state = 7670; break; // &sc -> &scn - case 7638: state = 7639; break; // &Scaro -> &Scaron - case 7642: state = 7643; break; // &scaro -> &scaron - case 7683: state = 7684; break; // &scpoli -> &scpolin - case 7730: state = 7736; break; // &setm -> &setmn - case 7731: state = 7732; break; // &setmi -> &setmin - case 7748: state = 7749; break; // &sfrow -> &sfrown - case 7778: state = 7779; break; // &ShortDow -> &ShortDown - case 7847: state = 7865; break; // &sim -> &simn - case 7902: state = 7903; break; // &smallsetmi -> &smallsetmin - case 8019: state = 8020; break; // &SquareI -> &SquareIn - case 8029: state = 8030; break; // &SquareIntersectio -> &SquareIntersection - case 8058: state = 8059; break; // &SquareU -> &SquareUn - case 8061: state = 8062; break; // &SquareUnio -> &SquareUnion - case 8083: state = 8084; break; // &ssetm -> &ssetmn - case 8106: state = 8124; break; // &str -> &strn - case 8117: state = 8118; break; // &straightepsilo -> &straightepsilon - case 8130: state = 8279; break; // &su -> &sun - case 8131: state = 8150; break; // &sub -> &subn - case 8171: state = 8184; break; // &subset -> &subsetn - case 8199: state = 8249; break; // &succ -> &succn - case 8231: state = 8232; break; // &SucceedsSla -> &SucceedsSlan - case 8284: state = 8338; break; // &sup -> &supn - case 8354: state = 8361; break; // &supset -> &supsetn - case 8375: state = 8390; break; // &sw -> &swn - case 8422: state = 8423; break; // &Tcaro -> &Tcaron - case 8428: state = 8429; break; // &tcaro -> &tcaron - case 8493: state = 8516; break; // &thi -> &thin - case 8507: state = 8520; break; // &Thi -> &Thin - case 8541: state = 8542; break; // &thor -> þ - case 8549: state = 8587; break; // &ti -> &tin - case 8634: state = 8635; break; // &tria -> &trian - case 8642: state = 8643; break; // &triangledow -> &triangledown - case 8671: state = 8672; break; // &trimi -> &trimin - case 8768: state = 8916; break; // &U -> &Un - case 8890: state = 8891; break; // &ulcor -> &ulcorn - case 8936: state = 8937; break; // &UnderPare -> &UnderParen - case 8946: state = 8947; break; // &Unio -> &Union - case 8956: state = 8957; break; // &Uogo -> &Uogon - case 8961: state = 8962; break; // &uogo -> &uogon - case 8996: state = 8997; break; // &UpArrowDow -> &UpArrowDown - case 9006: state = 9007; break; // &UpDow -> &UpDown - case 9016: state = 9017; break; // &Updow -> &Updown - case 9026: state = 9027; break; // &updow -> &updown - case 9051: state = 9052; break; // &upharpoo -> &upharpoon - case 9101: state = 9102; break; // &Upsilo -> &Upsilon - case 9105: state = 9106; break; // &upsilo -> &upsilon - case 9130: state = 9131; break; // &urcor -> &urcorn - case 9141: state = 9142; break; // &Uri -> &Urin - case 9145: state = 9146; break; // &uri -> &urin - case 9195: state = 9196; break; // &uwa -> &uwan - case 9201: state = 9425; break; // &v -> &vn - case 9202: state = 9203; break; // &va -> &van - case 9208: state = 9223; break; // &var -> &varn - case 9214: state = 9215; break; // &varepsilo -> &varepsilon - case 9227: state = 9228; break; // &varnothi -> &varnothin - case 9262: state = 9263; break; // &varsubset -> &varsubsetn - case 9272: state = 9273; break; // &varsupset -> &varsupsetn - case 9287: state = 9288; break; // &vartria -> &vartrian - case 9383: state = 9384; break; // &VerticalLi -> &VerticalLin - case 9406: state = 9407; break; // &VeryThi -> &VeryThin - case 9459: state = 9460; break; // &vsub -> &vsubn - case 9465: state = 9466; break; // &vsup -> &vsupn - case 9548: state = 9598; break; // &x -> &xn - case 9699: state = 9700; break; // &ye -> ¥ - case 9764: state = 9765; break; // &Zcaro -> &Zcaron - case 9770: state = 9771; break; // &zcaro -> &zcaron - case 9848: state = 9851; break; // &zw -> &zwn - default: return false; - } - break; - case 'o': - switch (state) { - case 0: state = 6138; break; // & -> &o - case 1: state = 183; break; // &A -> &Ao - case 8: state = 188; break; // &a -> &ao - case 129: state = 130; break; // &andsl -> &andslo - case 184: state = 185; break; // &Aog -> &Aogo - case 189: state = 190; break; // &aog -> &aogo - case 199: state = 213; break; // &ap -> &apo - case 225: state = 226; break; // &ApplyFuncti -> &ApplyFunctio - case 230: state = 231; break; // &appr -> &appro - case 290: state = 291; break; // &awc -> &awco - case 301: state = 598; break; // &b -> &bo - case 305: state = 306; break; // &backc -> &backco - case 314: state = 315; break; // &backepsil -> &backepsilo - case 331: state = 594; break; // &B -> &Bo - case 369: state = 370; break; // &bc -> &bco - case 381: state = 382; break; // &bdqu -> &bdquo - case 410: state = 411; break; // &bern -> &berno - case 415: state = 416; break; // &Bern -> &Berno - case 443: state = 455; break; // &big -> &bigo - case 456: state = 457; break; // &bigod -> &bigodo - case 489: state = 490; break; // &bigtriangled -> &bigtriangledo - case 515: state = 516; break; // &bkar -> &bkaro - case 519: state = 575; break; // &bl -> &blo - case 523: state = 524; break; // &blackl -> &blacklo - case 547: state = 548; break; // &blacktriangled -> &blacktriangledo - case 579: state = 591; break; // &bn -> &bno - case 587: state = 588; break; // &bN -> &bNo - case 604: state = 605; break; // &bott -> &botto - case 614: state = 615; break; // &boxb -> &boxbo - case 744: state = 757; break; // &bs -> &bso - case 789: state = 1126; break; // &C -> &Co - case 796: state = 1131; break; // &c -> &co - case 824: state = 825; break; // &capd -> &capdo - case 848: state = 852; break; // &car -> &caro - case 866: state = 894; break; // &Cc -> &Cco - case 868: state = 869; break; // &Ccar -> &Ccaro - case 872: state = 873; break; // &ccar -> &ccaro - case 907: state = 908; break; // &Cd -> &Cdo - case 911: state = 912; break; // &cd -> &cdo - case 940: state = 941; break; // &CenterD -> &CenterDo - case 946: state = 947; break; // ¢erd -> ¢erdo - case 990: state = 991; break; // &circlearr -> &circlearro - case 1024: state = 1025; break; // &CircleD -> &CircleDo - case 1068: state = 1069; break; // &Cl -> &Clo - case 1076: state = 1077; break; // &ClockwiseC -> &ClockwiseCo - case 1079: state = 1080; break; // &ClockwiseCont -> &ClockwiseConto - case 1099: state = 1100; break; // &CloseCurlyD -> &CloseCurlyDo - case 1106: state = 1107; break; // &CloseCurlyDoubleQu -> &CloseCurlyDoubleQuo - case 1112: state = 1113; break; // &CloseCurlyQu -> &CloseCurlyQuo - case 1127: state = 1128; break; // &Col -> &Colo - case 1132: state = 1133; break; // &col -> &colo - case 1167: state = 1168; break; // &congd -> &congdo - case 1187: state = 1188; break; // &Cont -> &Conto - case 1206: state = 1207; break; // &copr -> &copro - case 1210: state = 1211; break; // &Copr -> &Copro - case 1232: state = 1233; break; // &CounterCl -> &CounterClo - case 1240: state = 1241; break; // &CounterClockwiseC -> &CounterClockwiseCo - case 1243: state = 1244; break; // &CounterClockwiseCont -> &CounterClockwiseConto - case 1256: state = 1266; break; // &cr -> &cro - case 1261: state = 1262; break; // &Cr -> &Cro - case 1288: state = 1289; break; // &ctd -> &ctdo - case 1318: state = 1341; break; // &cup -> &cupo - case 1337: state = 1338; break; // &cupd -> &cupdo - case 1385: state = 1386; break; // &curvearr -> &curvearro - case 1408: state = 1409; break; // &cwc -> &cwco - case 1425: state = 1685; break; // &D -> &Do - case 1432: state = 1679; break; // &d -> &do - case 1466: state = 1467; break; // &dbkar -> &dbkaro - case 1476: state = 1477; break; // &Dcar -> &Dcaro - case 1482: state = 1483; break; // &dcar -> &dcaro - case 1490: state = 1503; break; // &DD -> &DDo - case 1492: state = 1510; break; // &dd -> &ddo - case 1573: state = 1574; break; // &DiacriticalD -> &DiacriticalDo - case 1601: state = 1608; break; // &diam -> &diamo - case 1603: state = 1604; break; // &Diam -> &Diamo - case 1643: state = 1657; break; // &div -> &divo - case 1647: state = 1649; break; // ÷ -> ÷o - case 1670: state = 1671; break; // &dlc -> &dlco - case 1675: state = 1676; break; // &dlcr -> &dlcro - case 1696: state = 1697; break; // &DotD -> &DotDo - case 1703: state = 1704; break; // &doteqd -> &doteqdo - case 1748: state = 1749; break; // &DoubleC -> &DoubleCo - case 1751: state = 1752; break; // &DoubleCont -> &DoubleConto - case 1764: state = 1765; break; // &DoubleD -> &DoubleDo - case 1772: state = 1773; break; // &DoubleDownArr -> &DoubleDownArro - case 1776: state = 1801; break; // &DoubleL -> &DoubleLo - case 1782: state = 1783; break; // &DoubleLeftArr -> &DoubleLeftArro - case 1793: state = 1794; break; // &DoubleLeftRightArr -> &DoubleLeftRightArro - case 1810: state = 1811; break; // &DoubleLongLeftArr -> &DoubleLongLeftArro - case 1821: state = 1822; break; // &DoubleLongLeftRightArr -> &DoubleLongLeftRightArro - case 1832: state = 1833; break; // &DoubleLongRightArr -> &DoubleLongRightArro - case 1843: state = 1844; break; // &DoubleRightArr -> &DoubleRightArro - case 1855: state = 1856; break; // &DoubleUpArr -> &DoubleUpArro - case 1859: state = 1860; break; // &DoubleUpD -> &DoubleUpDo - case 1865: state = 1866; break; // &DoubleUpDownArr -> &DoubleUpDownArro - case 1885: state = 1886; break; // &DownArr -> &DownArro - case 1891: state = 1892; break; // &Downarr -> &Downarro - case 1899: state = 1900; break; // &downarr -> &downarro - case 1911: state = 1912; break; // &DownArrowUpArr -> &DownArrowUpArro - case 1921: state = 1922; break; // &downd -> &downdo - case 1927: state = 1928; break; // &downdownarr -> &downdownarro - case 1935: state = 1936; break; // &downharp -> &downharpo - case 1936: state = 1937; break; // &downharpo -> &downharpoo - case 1962: state = 1963; break; // &DownLeftRightVect -> &DownLeftRightVecto - case 1972: state = 1973; break; // &DownLeftTeeVect -> &DownLeftTeeVecto - case 1979: state = 1980; break; // &DownLeftVect -> &DownLeftVecto - case 1998: state = 1999; break; // &DownRightTeeVect -> &DownRightTeeVecto - case 2005: state = 2006; break; // &DownRightVect -> &DownRightVecto - case 2019: state = 2020; break; // &DownTeeArr -> &DownTeeArro - case 2027: state = 2028; break; // &drbkar -> &drbkaro - case 2031: state = 2032; break; // &drc -> &drco - case 2036: state = 2037; break; // &drcr -> &drcro - case 2044: state = 2054; break; // &ds -> &dso - case 2058: state = 2059; break; // &Dstr -> &Dstro - case 2063: state = 2064; break; // &dstr -> &dstro - case 2068: state = 2069; break; // &dtd -> &dtdo - case 2108: state = 2296; break; // &E -> &Eo - case 2115: state = 2301; break; // &e -> &eo - case 2129: state = 2130; break; // &Ecar -> &Ecaro - case 2133: state = 2148; break; // &ec -> &eco - case 2135: state = 2136; break; // &ecar -> &ecaro - case 2149: state = 2150; break; // &ecol -> &ecolo - case 2157: state = 2166; break; // &eD -> &eDo - case 2158: state = 2159; break; // &eDD -> &eDDo - case 2162: state = 2163; break; // &Ed -> &Edo - case 2169: state = 2170; break; // &ed -> &edo - case 2176: state = 2177; break; // &efD -> &efDo - case 2200: state = 2201; break; // &egsd -> &egsdo - case 2224: state = 2225; break; // &elsd -> &elsdo - case 2297: state = 2298; break; // &Eog -> &Eogo - case 2302: state = 2303; break; // &eog -> &eogo - case 2329: state = 2330; break; // &Epsil -> &Epsilo - case 2333: state = 2334; break; // &epsil -> &epsilo - case 2340: state = 2345; break; // &eqc -> &eqco - case 2346: state = 2347; break; // &eqcol -> &eqcolo - case 2414: state = 2415; break; // &erD -> &erDo - case 2426: state = 2427; break; // &esd -> &esdo - case 2455: state = 2456; break; // &eur -> &euro - case 2472: state = 2493; break; // &exp -> &expo - case 2478: state = 2479; break; // &expectati -> &expectatio - case 2482: state = 2483; break; // &Exp -> &Expo - case 2503: state = 2612; break; // &f -> &fo - case 2510: state = 2511; break; // &fallingd -> &fallingdo - case 2517: state = 2608; break; // &F -> &Fo - case 2604: state = 2605; break; // &fn -> &fno - case 2647: state = 2689; break; // &fr -> &fro - case 2701: state = 2857; break; // &g -> &go - case 2708: state = 2853; break; // &G -> &Go - case 2755: state = 2756; break; // &Gd -> &Gdo - case 2759: state = 2760; break; // &gd -> &gdo - case 2786: state = 2787; break; // &gesd -> &gesdo - case 2788: state = 2790; break; // &gesdot -> &gesdoto - case 2837: state = 2838; break; // &gnappr -> &gnappro - case 2950: state = 2951; break; // >d -> >do - case 2969: state = 2970; break; // >rappr -> >rappro - case 2976: state = 2977; break; // >rd -> >rdo - case 3014: state = 3159; break; // &H -> &Ho - case 3020: state = 3126; break; // &h -> &ho - case 3090: state = 3091; break; // &herc -> &herco - case 3116: state = 3117; break; // &hksear -> &hksearo - case 3122: state = 3123; break; // &hkswar -> &hkswaro - case 3126: state = 3136; break; // &ho -> &hoo - case 3144: state = 3145; break; // &hookleftarr -> &hookleftarro - case 3155: state = 3156; break; // &hookrightarr -> &hookrightarro - case 3173: state = 3174; break; // &Horiz -> &Horizo - case 3198: state = 3199; break; // &Hstr -> &Hstro - case 3203: state = 3204; break; // &hstr -> &hstro - case 3210: state = 3211; break; // &HumpD -> &HumpDo - case 3236: state = 3471; break; // &I -> &Io - case 3243: state = 3467; break; // &i -> &io - case 3265: state = 3266; break; // &Id -> &Ido - case 3301: state = 3316; break; // &ii -> &iio - case 3336: state = 3365; break; // &im -> &imo - case 3378: state = 3393; break; // &in -> &ino - case 3394: state = 3395; break; // &inod -> &inodo - case 3429: state = 3430; break; // &Intersecti -> &Intersectio - case 3440: state = 3441; break; // &intpr -> &intpro - case 3451: state = 3452; break; // &InvisibleC -> &InvisibleCo - case 3472: state = 3473; break; // &Iog -> &Iogo - case 3476: state = 3477; break; // &iog -> &iogo - case 3493: state = 3494; break; // &ipr -> &ipro - case 3514: state = 3515; break; // &isind -> &isindo - case 3555: state = 3582; break; // &J -> &Jo - case 3561: state = 3586; break; // &j -> &jo - case 3618: state = 3676; break; // &K -> &Ko - case 3624: state = 3680; break; // &k -> &ko - case 3692: state = 4422; break; // &l -> &lo - case 3698: state = 4434; break; // &L -> &Lo - case 3756: state = 3757; break; // &laqu -> « - case 3839: state = 3840; break; // &Lcar -> &Lcaro - case 3845: state = 3846; break; // &lcar -> &lcaro - case 3874: state = 3875; break; // &ldqu -> &ldquo - case 3915: state = 3916; break; // &LeftArr -> &LeftArro - case 3921: state = 3922; break; // &Leftarr -> &Leftarro - case 3929: state = 3930; break; // &leftarr -> &leftarro - case 3944: state = 3945; break; // &LeftArrowRightArr -> &LeftArrowRightArro - case 3961: state = 3962; break; // &LeftD -> &LeftDo - case 3983: state = 3984; break; // &LeftDownTeeVect -> &LeftDownTeeVecto - case 3990: state = 3991; break; // &LeftDownVect -> &LeftDownVecto - case 3999: state = 4000; break; // &LeftFl -> &LeftFlo - case 4000: state = 4001; break; // &LeftFlo -> &LeftFloo - case 4007: state = 4008; break; // &leftharp -> &leftharpo - case 4008: state = 4009; break; // &leftharpo -> &leftharpoo - case 4011: state = 4012; break; // &leftharpoond -> &leftharpoondo - case 4025: state = 4026; break; // &leftleftarr -> &leftleftarro - case 4037: state = 4038; break; // &LeftRightArr -> &LeftRightArro - case 4048: state = 4049; break; // &Leftrightarr -> &Leftrightarro - case 4059: state = 4060; break; // &leftrightarr -> &leftrightarro - case 4068: state = 4069; break; // &leftrightharp -> &leftrightharpo - case 4069: state = 4070; break; // &leftrightharpo -> &leftrightharpoo - case 4081: state = 4082; break; // &leftrightsquigarr -> &leftrightsquigarro - case 4088: state = 4089; break; // &LeftRightVect -> &LeftRightVecto - case 4098: state = 4099; break; // &LeftTeeArr -> &LeftTeeArro - case 4105: state = 4106; break; // &LeftTeeVect -> &LeftTeeVecto - case 4140: state = 4141; break; // &LeftUpD -> &LeftUpDo - case 4147: state = 4148; break; // &LeftUpDownVect -> &LeftUpDownVecto - case 4157: state = 4158; break; // &LeftUpTeeVect -> &LeftUpTeeVecto - case 4164: state = 4165; break; // &LeftUpVect -> &LeftUpVecto - case 4175: state = 4176; break; // &LeftVect -> &LeftVecto - case 4202: state = 4203; break; // &lesd -> &lesdo - case 4204: state = 4206; break; // &lesdot -> &lesdoto - case 4219: state = 4220; break; // &lessappr -> &lessappro - case 4223: state = 4224; break; // &lessd -> &lessdo - case 4307: state = 4308; break; // &lfl -> &lflo - case 4308: state = 4309; break; // &lflo -> &lfloo - case 4354: state = 4355; break; // &llc -> &llco - case 4366: state = 4367; break; // &Lleftarr -> &Lleftarro - case 4381: state = 4382; break; // &Lmid -> &Lmido - case 4385: state = 4391; break; // &lm -> &lmo - case 4387: state = 4388; break; // &lmid -> &lmido - case 4406: state = 4407; break; // &lnappr -> &lnappro - case 4422: state = 4542; break; // &lo -> &loo - case 4443: state = 4444; break; // &LongLeftArr -> &LongLeftArro - case 4453: state = 4454; break; // &Longleftarr -> &Longleftarro - case 4465: state = 4466; break; // &longleftarr -> &longleftarro - case 4476: state = 4477; break; // &LongLeftRightArr -> &LongLeftRightArro - case 4487: state = 4488; break; // &Longleftrightarr -> &Longleftrightarro - case 4498: state = 4499; break; // &longleftrightarr -> &longleftrightarro - case 4506: state = 4507; break; // &longmapst -> &longmapsto - case 4516: state = 4517; break; // &LongRightArr -> &LongRightArro - case 4527: state = 4528; break; // &Longrightarr -> &Longrightarro - case 4538: state = 4539; break; // &longrightarr -> &longrightarro - case 4546: state = 4547; break; // &looparr -> &looparro - case 4597: state = 4598; break; // &LowerLeftArr -> &LowerLeftArro - case 4608: state = 4609; break; // &LowerRightArr -> &LowerRightArro - case 4633: state = 4634; break; // &lrc -> &lrco - case 4655: state = 4656; break; // &lsaqu -> &lsaquo - case 4679: state = 4680; break; // &lsqu -> &lsquo - case 4685: state = 4686; break; // &Lstr -> &Lstro - case 4690: state = 4691; break; // &lstr -> &lstro - case 4706: state = 4707; break; // <d -> <do - case 4767: state = 4922; break; // &m -> &mo - case 4781: state = 4928; break; // &M -> &Mo - case 4788: state = 4789; break; // &mapst -> &mapsto - case 4791: state = 4792; break; // &mapstod -> &mapstodo - case 4809: state = 4810; break; // &mc -> &mco - case 4826: state = 4827; break; // &mDD -> &mDDo - case 4868: state = 4869; break; // &mh -> &mho - case 4873: state = 4874; break; // &micr -> µ - case 4886: state = 4887; break; // &midd -> &middo - case 4946: state = 4947; break; // &mstp -> &mstpo - case 4965: state = 5372; break; // &n -> &no - case 4971: state = 5347; break; // &N -> &No - case 4986: state = 4993; break; // &nap -> &napo - case 4997: state = 4998; break; // &nappr -> &nappro - case 5020: state = 5044; break; // &nc -> &nco - case 5026: state = 5027; break; // &Ncar -> &Ncaro - case 5030: state = 5031; break; // &ncar -> &ncaro - case 5048: state = 5049; break; // &ncongd -> &ncongdo - case 5075: state = 5077; break; // &nearr -> &nearro - case 5080: state = 5081; break; // &ned -> &nedo - case 5278: state = 5279; break; // &nLeftarr -> &nLeftarro - case 5286: state = 5287; break; // &nleftarr -> &nleftarro - case 5297: state = 5298; break; // &nLeftrightarr -> &nLeftrightarro - case 5308: state = 5309; break; // &nleftrightarr -> &nleftrightarro - case 5380: state = 5381; break; // &NotC -> &NotCo - case 5396: state = 5397; break; // &NotD -> &NotDo - case 5497: state = 5498; break; // &NotHumpD -> &NotHumpDo - case 5515: state = 5516; break; // ¬ind -> ¬indo - case 5821: state = 5836; break; // &np -> &npo - case 5875: state = 5876; break; // &nRightarr -> &nRightarro - case 5885: state = 5886; break; // &nrightarr -> &nrightarro - case 5910: state = 5911; break; // &nsh -> &nsho - case 6037: state = 6038; break; // &numer -> &numero - case 6121: state = 6123; break; // &nwarr -> &nwarro - case 6131: state = 6294; break; // &O -> &Oo - case 6138: state = 6298; break; // &o -> &oo - case 6163: state = 6182; break; // &od -> &odo - case 6185: state = 6186; break; // &ods -> &odso - case 6210: state = 6211; break; // &og -> &ogo - case 6247: state = 6248; break; // &olcr -> &olcro - case 6278: state = 6279; break; // &Omicr -> &Omicro - case 6284: state = 6285; break; // &omicr -> &omicro - case 6314: state = 6315; break; // &OpenCurlyD -> &OpenCurlyDo - case 6321: state = 6322; break; // &OpenCurlyDoubleQu -> &OpenCurlyDoubleQuo - case 6327: state = 6328; break; // &OpenCurlyQu -> &OpenCurlyQuo - case 6342: state = 6365; break; // &or -> &oro - case 6351: state = 6353; break; // &order -> &ordero - case 6361: state = 6362; break; // &orig -> &origo - case 6369: state = 6370; break; // &orsl -> &orslo - case 6382: state = 6396; break; // &os -> &oso - case 6463: state = 6622; break; // &p -> &po - case 6482: state = 6609; break; // &P -> &Po - case 6503: state = 6504; break; // &peri -> &perio - case 6527: state = 6537; break; // &ph -> &pho - case 6548: state = 6549; break; // &pitchf -> &pitchfo - case 6580: state = 6581; break; // &plusd -> &plusdo - case 6604: state = 6605; break; // &plustw -> &plustwo - case 6640: state = 6748; break; // &Pr -> &Pro - case 6642: state = 6745; break; // &pr -> &pro - case 6660: state = 6661; break; // &precappr -> &precappro - case 6709: state = 6710; break; // &precnappr -> &precnappro - case 6772: state = 6773; break; // &Prop -> &Propo - case 6776: state = 6777; break; // &Proporti -> &Proportio - case 6783: state = 6784; break; // &propt -> &propto - case 6813: state = 6825; break; // &Q -> &Qo - case 6817: state = 6829; break; // &q -> &qo - case 6847: state = 6873; break; // &qu -> &quo - case 6853: state = 6854; break; // &quaterni -> &quaternio - case 6876: state = 7469; break; // &r -> &ro - case 6886: state = 7485; break; // &R -> &Ro - case 6922: state = 6923; break; // &raqu -> » - case 6978: state = 6979; break; // &rati -> &ratio - case 7023: state = 7024; break; // &Rcar -> &Rcaro - case 7029: state = 7030; break; // &rcar -> &rcaro - case 7064: state = 7065; break; // &rdqu -> &rdquo - case 7141: state = 7142; break; // &rfl -> &rflo - case 7142: state = 7143; break; // &rflo -> &rfloo - case 7155: state = 7167; break; // &rh -> &rho - case 7164: state = 7165; break; // &Rh -> &Rho - case 7189: state = 7190; break; // &RightArr -> &RightArro - case 7195: state = 7196; break; // &Rightarr -> &Rightarro - case 7205: state = 7206; break; // &rightarr -> &rightarro - case 7219: state = 7220; break; // &RightArrowLeftArr -> &RightArrowLeftArro - case 7236: state = 7237; break; // &RightD -> &RightDo - case 7258: state = 7259; break; // &RightDownTeeVect -> &RightDownTeeVecto - case 7265: state = 7266; break; // &RightDownVect -> &RightDownVecto - case 7274: state = 7275; break; // &RightFl -> &RightFlo - case 7275: state = 7276; break; // &RightFlo -> &RightFloo - case 7282: state = 7283; break; // &rightharp -> &rightharpo - case 7283: state = 7284; break; // &rightharpo -> &rightharpoo - case 7286: state = 7287; break; // &rightharpoond -> &rightharpoondo - case 7300: state = 7301; break; // &rightleftarr -> &rightleftarro - case 7308: state = 7309; break; // &rightleftharp -> &rightleftharpo - case 7309: state = 7310; break; // &rightleftharpo -> &rightleftharpoo - case 7321: state = 7322; break; // &rightrightarr -> &rightrightarro - case 7333: state = 7334; break; // &rightsquigarr -> &rightsquigarro - case 7343: state = 7344; break; // &RightTeeArr -> &RightTeeArro - case 7350: state = 7351; break; // &RightTeeVect -> &RightTeeVecto - case 7385: state = 7386; break; // &RightUpD -> &RightUpDo - case 7392: state = 7393; break; // &RightUpDownVect -> &RightUpDownVecto - case 7402: state = 7403; break; // &RightUpTeeVect -> &RightUpTeeVecto - case 7409: state = 7410; break; // &RightUpVect -> &RightUpVecto - case 7420: state = 7421; break; // &RightVect -> &RightVecto - case 7435: state = 7436; break; // &risingd -> &risingdo - case 7453: state = 7454; break; // &rm -> &rmo - case 7519: state = 7520; break; // &rpp -> &rppo - case 7538: state = 7539; break; // &Rrightarr -> &Rrightarro - case 7545: state = 7546; break; // &rsaqu -> &rsaquo - case 7562: state = 7563; break; // &rsqu -> &rsquo - case 7610: state = 7949; break; // &S -> &So - case 7617: state = 7936; break; // &s -> &so - case 7626: state = 7627; break; // &sbqu -> &sbquo - case 7637: state = 7638; break; // &Scar -> &Scaro - case 7641: state = 7642; break; // &scar -> &scaro - case 7680: state = 7681; break; // &scp -> &scpo - case 7695: state = 7696; break; // &sd -> &sdo - case 7713: state = 7715; break; // &searr -> &searro - case 7745: state = 7747; break; // &sfr -> &sfro - case 7751: state = 7796; break; // &sh -> &sho - case 7772: state = 7773; break; // &Sh -> &Sho - case 7776: state = 7777; break; // &ShortD -> &ShortDo - case 7782: state = 7783; break; // &ShortDownArr -> &ShortDownArro - case 7792: state = 7793; break; // &ShortLeftArr -> &ShortLeftArro - case 7819: state = 7820; break; // &ShortRightArr -> &ShortRightArro - case 7827: state = 7828; break; // &ShortUpArr -> &ShortUpArro - case 7849: state = 7850; break; // &simd -> &simdo - case 8028: state = 8029; break; // &SquareIntersecti -> &SquareIntersectio - case 8060: state = 8061; break; // &SquareUni -> &SquareUnio - case 8116: state = 8117; break; // &straightepsil -> &straightepsilo - case 8133: state = 8134; break; // &subd -> &subdo - case 8141: state = 8142; break; // &subed -> &subedo - case 8204: state = 8205; break; // &succappr -> &succappro - case 8253: state = 8254; break; // &succnappr -> &succnappro - case 8292: state = 8293; break; // &supd -> &supdo - case 8304: state = 8305; break; // &suped -> &supedo - case 8321: state = 8322; break; // &suphs -> &suphso - case 8385: state = 8387; break; // &swarr -> &swarro - case 8400: state = 8604; break; // &T -> &To - case 8404: state = 8590; break; // &t -> &to - case 8421: state = 8422; break; // &Tcar -> &Tcaro - case 8427: state = 8428; break; // &tcar -> &tcaro - case 8445: state = 8446; break; // &td -> &tdo - case 8461: state = 8540; break; // &th -> &tho - case 8471: state = 8472; break; // &Theref -> &Therefo - case 8476: state = 8477; break; // &theref -> &therefo - case 8499: state = 8500; break; // &thickappr -> &thickappro - case 8596: state = 8597; break; // &topb -> &topbo - case 8608: state = 8610; break; // &topf -> &topfo - case 8640: state = 8641; break; // &triangled -> &triangledo - case 8664: state = 8665; break; // &trid -> &trido - case 8681: state = 8682; break; // &TripleD -> &TripleDo - case 8728: state = 8729; break; // &Tstr -> &Tstro - case 8733: state = 8734; break; // &tstr -> &tstro - case 8737: state = 8742; break; // &tw -> &two - case 8753: state = 8754; break; // &twoheadleftarr -> &twoheadleftarro - case 8764: state = 8765; break; // &twoheadrightarr -> &twoheadrightarro - case 8768: state = 8954; break; // &U -> &Uo - case 8775: state = 8959; break; // &u -> &uo - case 8783: state = 8792; break; // &Uarr -> &Uarro - case 8888: state = 8889; break; // &ulc -> &ulco - case 8896: state = 8897; break; // &ulcr -> &ulcro - case 8945: state = 8946; break; // &Uni -> &Unio - case 8955: state = 8956; break; // &Uog -> &Uogo - case 8960: state = 8961; break; // &uog -> &uogo - case 8973: state = 8974; break; // &UpArr -> &UpArro - case 8979: state = 8980; break; // &Uparr -> &Uparro - case 8986: state = 8987; break; // &uparr -> &uparro - case 8994: state = 8995; break; // &UpArrowD -> &UpArrowDo - case 9000: state = 9001; break; // &UpArrowDownArr -> &UpArrowDownArro - case 9004: state = 9005; break; // &UpD -> &UpDo - case 9010: state = 9011; break; // &UpDownArr -> &UpDownArro - case 9014: state = 9015; break; // &Upd -> &Updo - case 9020: state = 9021; break; // &Updownarr -> &Updownarro - case 9024: state = 9025; break; // &upd -> &updo - case 9030: state = 9031; break; // &updownarr -> &updownarro - case 9049: state = 9050; break; // &upharp -> &upharpo - case 9050: state = 9051; break; // &upharpo -> &upharpoo - case 9077: state = 9078; break; // &UpperLeftArr -> &UpperLeftArro - case 9088: state = 9089; break; // &UpperRightArr -> &UpperRightArro - case 9100: state = 9101; break; // &Upsil -> &Upsilo - case 9104: state = 9105; break; // &upsil -> &upsilo - case 9114: state = 9115; break; // &UpTeeArr -> &UpTeeArro - case 9122: state = 9123; break; // &upuparr -> &upuparro - case 9128: state = 9129; break; // &urc -> &urco - case 9136: state = 9137; break; // &urcr -> &urcro - case 9162: state = 9163; break; // &utd -> &utdo - case 9201: state = 9436; break; // &v -> &vo - case 9213: state = 9214; break; // &varepsil -> &varepsilo - case 9223: state = 9224; break; // &varn -> &varno - case 9237: state = 9238; break; // &varpr -> &varpro - case 9240: state = 9241; break; // &varpropt -> &varpropto - case 9249: state = 9250; break; // &varrh -> &varrho - case 9303: state = 9432; break; // &V -> &Vo - case 9393: state = 9394; break; // &VerticalSeparat -> &VerticalSeparato - case 9441: state = 9442; break; // &vpr -> &vpro - case 9484: state = 9523; break; // &W -> &Wo - case 9490: state = 9527; break; // &w -> &wo - case 9548: state = 9602; break; // &x -> &xo - case 9565: state = 9607; break; // &X -> &Xo - case 9603: state = 9604; break; // &xod -> &xodo - case 9665: state = 9716; break; // &Y -> &Yo - case 9672: state = 9720; break; // &y -> &yo - case 9747: state = 9832; break; // &Z -> &Zo - case 9754: state = 9836; break; // &z -> &zo - case 9763: state = 9764; break; // &Zcar -> &Zcaro - case 9769: state = 9770; break; // &zcar -> &zcaro - case 9777: state = 9778; break; // &Zd -> &Zdo - case 9781: state = 9782; break; // &zd -> &zdo - case 9792: state = 9793; break; // &Zer -> &Zero - default: return false; - } - break; - case 'p': - switch (state) { - case 0: state = 6463; break; // & -> &p - case 1: state = 216; break; // &A -> &Ap - case 8: state = 199; break; // &a -> &ap - case 79: state = 94; break; // &al -> &alp - case 80: state = 86; break; // &ale -> &alep - case 89: state = 90; break; // &Al -> &Alp - case 103: state = 114; break; // &am -> & - case 130: state = 131; break; // &andslo -> &andslop - case 172: state = 173; break; // &angs -> &angsp - case 183: state = 193; break; // &Ao -> &Aop - case 188: state = 196; break; // &ao -> &aop - case 199: state = 229; break; // &ap -> &app - case 216: state = 217; break; // &Ap -> &App - case 263: state = 264; break; // &asym -> &asymp - case 301: state = 719; break; // &b -> &bp - case 304: state = 318; break; // &back -> &backp - case 310: state = 311; break; // &backe -> &backep - case 384: state = 405; break; // &be -> &bep - case 399: state = 400; break; // &bem -> &bemp - case 445: state = 446; break; // &bigca -> &bigcap - case 452: state = 453; break; // &bigcu -> &bigcup - case 455: state = 460; break; // &bigo -> &bigop - case 474: state = 475; break; // &bigsqcu -> &bigsqcup - case 494: state = 495; break; // &bigtriangleu -> &bigtriangleup - case 497: state = 498; break; // &bigu -> &bigup - case 594: state = 595; break; // &Bo -> &Bop - case 598: state = 599; break; // &bo -> &bop - case 613: state = 662; break; // &box -> &boxp - case 774: state = 775; break; // &bum -> &bump - case 782: state = 783; break; // &Bum -> &Bump - case 790: state = 803; break; // &Ca -> &Cap - case 797: state = 805; break; // &ca -> &cap - case 814: state = 815; break; // &capbrcu -> &capbrcup - case 818: state = 819; break; // &capca -> &capcap - case 821: state = 822; break; // &capcu -> &capcup - case 862: state = 863; break; // &cca -> &ccap - case 900: state = 901; break; // &ccu -> &ccup - case 927: state = 928; break; // &cem -> &cemp - case 1126: state = 1200; break; // &Co -> &Cop - case 1131: state = 1203; break; // &co -> &cop - case 1142: state = 1148; break; // &com -> &comp - case 1278: state = 1283; break; // &csu -> &csup - case 1292: state = 1318; break; // &cu -> &cup - case 1301: state = 1302; break; // &cue -> &cuep - case 1311: state = 1313; break; // &cularr -> &cularrp - case 1315: state = 1316; break; // &Cu -> &Cup - case 1323: state = 1324; break; // &cupbrca -> &cupbrcap - case 1327: state = 1328; break; // &CupCa -> &CupCap - case 1331: state = 1332; break; // &cupca -> &cupcap - case 1334: state = 1335; break; // &cupcu -> &cupcup - case 1356: state = 1357; break; // &curlyeq -> &curlyeqp - case 1529: state = 1530; break; // &dem -> &demp - case 1676: state = 1677; break; // &dlcro -> &dlcrop - case 1679: state = 1689; break; // &do -> &dop - case 1685: state = 1686; break; // &Do -> &Dop - case 1694: state = 1719; break; // &dot -> &dotp - case 1851: state = 1852; break; // &DoubleU -> &DoubleUp - case 1907: state = 1908; break; // &DownArrowU -> &DownArrowUp - case 1934: state = 1935; break; // &downhar -> &downharp - case 2037: state = 2038; break; // &drcro -> &drcrop - case 2108: state = 2326; break; // &E -> &Ep - case 2115: state = 2312; break; // &e -> &ep - case 2228: state = 2246; break; // &Em -> &Emp - case 2233: state = 2238; break; // &em -> &emp - case 2279: state = 2280; break; // &ems -> &emsp - case 2293: state = 2294; break; // &ens -> &ensp - case 2296: state = 2306; break; // &Eo -> &Eop - case 2301: state = 2309; break; // &eo -> &eop - case 2402: state = 2403; break; // &eqv -> &eqvp - case 2458: state = 2472; break; // &ex -> &exp - case 2466: state = 2482; break; // &Ex -> &Exp - case 2503: state = 2639; break; // &f -> &fp - case 2608: state = 2609; break; // &Fo -> &Fop - case 2612: state = 2613; break; // &fo -> &fop - case 2702: state = 2722; break; // &ga -> &gap - case 2833: state = 2834; break; // &gna -> &gnap - case 2834: state = 2836; break; // &gnap -> &gnapp - case 2853: state = 2854; break; // &Go -> &Gop - case 2857: state = 2858; break; // &go -> &gop - case 2966: state = 2967; break; // >ra -> >rap - case 2967: state = 2968; break; // >rap -> >rapp - case 3024: state = 3025; break; // &hairs -> &hairsp - case 3086: state = 3087; break; // &helli -> &hellip - case 3106: state = 3107; break; // &HilbertS -> &HilbertSp - case 3126: state = 3163; break; // &ho -> &hop - case 3159: state = 3160; break; // &Ho -> &Hop - case 3208: state = 3209; break; // &Hum -> &Hump - case 3216: state = 3217; break; // &HumpDownHum -> &HumpDownHump - case 3225: state = 3231; break; // &hy -> &hyp - case 3243: state = 3492; break; // &i -> &ip - case 3330: state = 3372; break; // &Im -> &Imp - case 3336: state = 3368; break; // &im -> &imp - case 3341: state = 3357; break; // &imag -> &imagp - case 3401: state = 3439; break; // &int -> &intp - case 3467: state = 3483; break; // &io -> &iop - case 3471: state = 3480; break; // &Io -> &Iop - case 3582: state = 3583; break; // &Jo -> &Jop - case 3586: state = 3587; break; // &jo -> &jop - case 3619: state = 3620; break; // &Ka -> &Kap - case 3620: state = 3621; break; // &Kap -> &Kapp - case 3625: state = 3626; break; // &ka -> &kap - case 3626: state = 3627; break; // &kap -> &kapp - case 3676: state = 3677; break; // &Ko -> &Kop - case 3680: state = 3681; break; // &ko -> &kop - case 3692: state = 4621; break; // &l -> &lp - case 3699: state = 3746; break; // &La -> &Lap - case 3705: state = 3744; break; // &la -> &lap - case 3712: state = 3713; break; // &laem -> &laemp - case 3766: state = 3782; break; // &larr -> &larrp - case 3779: state = 3780; break; // &larrl -> &larrlp - case 4006: state = 4007; break; // &lefthar -> &leftharp - case 4016: state = 4017; break; // &leftharpoonu -> &leftharpoonup - case 4067: state = 4068; break; // &leftrighthar -> &leftrightharp - case 4138: state = 4139; break; // &LeftU -> &LeftUp - case 4216: state = 4217; break; // &lessa -> &lessap - case 4217: state = 4218; break; // &lessap -> &lessapp - case 4402: state = 4403; break; // &lna -> &lnap - case 4403: state = 4405; break; // &lnap -> &lnapp - case 4422: state = 4560; break; // &lo -> &lop - case 4434: state = 4564; break; // &Lo -> &Lop - case 4503: state = 4504; break; // &longma -> &longmap - case 4542: state = 4543; break; // &loo -> &loop - case 4767: state = 4935; break; // &m -> &mp - case 4768: state = 4785; break; // &ma -> &map - case 4782: state = 4783; break; // &Ma -> &Map - case 4801: state = 4802; break; // &mapstou -> &mapstoup - case 4848: state = 4849; break; // &MediumS -> &MediumSp - case 4910: state = 4911; break; // &mlc -> &mlcp - case 4916: state = 4917; break; // &mn -> &mnp - case 4922: state = 4932; break; // &mo -> &mop - case 4928: state = 4929; break; // &Mo -> &Mop - case 4945: state = 4946; break; // &mst -> &mstp - case 4958: state = 4959; break; // &multima -> &multimap - case 4962: state = 4963; break; // &muma -> &mumap - case 4965: state = 5821; break; // &n -> &np - case 4966: state = 4986; break; // &na -> &nap - case 4986: state = 4996; break; // &nap -> &napp - case 5011: state = 5012; break; // &nbs ->   - case 5015: state = 5016; break; // &nbum -> &nbump - case 5021: state = 5022; break; // &nca -> &ncap - case 5052: state = 5053; break; // &ncu -> &ncup - case 5097: state = 5098; break; // &NegativeMediumS -> &NegativeMediumSp - case 5108: state = 5109; break; // &NegativeThickS -> &NegativeThickSp - case 5115: state = 5116; break; // &NegativeThinS -> &NegativeThinSp - case 5129: state = 5130; break; // &NegativeVeryThinS -> &NegativeVeryThinSp - case 5227: state = 5236; break; // &nh -> &nhp - case 5347: state = 5369; break; // &No -> &Nop - case 5363: state = 5364; break; // &NonBreakingS -> &NonBreakingSp - case 5372: state = 5373; break; // &no -> &nop - case 5390: state = 5391; break; // &NotCu -> &NotCup - case 5393: state = 5394; break; // &NotCupCa -> &NotCupCap - case 5495: state = 5496; break; // &NotHum -> &NotHump - case 5503: state = 5504; break; // &NotHumpDownHum -> &NotHumpDownHump - case 5701: state = 5713; break; // &NotSquareSu -> &NotSquareSup - case 5726: state = 5768; break; // &NotSu -> &NotSup - case 5895: state = 5938; break; // &ns -> &nsp - case 5913: state = 5918; break; // &nshort -> &nshortp - case 5944: state = 5948; break; // &nsqsu -> &nsqsup - case 5951: state = 5973; break; // &nsu -> &nsup - case 6040: state = 6041; break; // &nums -> &numsp - case 6044: state = 6045; break; // &nva -> &nvap - case 6131: state = 6306; break; // &O -> &Op - case 6138: state = 6302; break; // &o -> &op - case 6294: state = 6295; break; // &Oo -> &Oop - case 6298: state = 6299; break; // &oo -> &oop - case 6333: state = 6334; break; // &oper -> &operp - case 6370: state = 6371; break; // &orslo -> &orslop - case 6498: state = 6511; break; // &per -> &perp - case 6609: state = 6630; break; // &Po -> &Pop - case 6615: state = 6616; break; // &Poincare -> &Poincarep - case 6622: state = 6633; break; // &po -> &pop - case 6644: state = 6645; break; // &pra -> &prap - case 6657: state = 6658; break; // &preca -> &precap - case 6658: state = 6659; break; // &precap -> &precapp - case 6706: state = 6707; break; // &precna -> &precnap - case 6707: state = 6708; break; // &precnap -> &precnapp - case 6736: state = 6737; break; // &prna -> &prnap - case 6745: state = 6770; break; // &pro -> &prop - case 6748: state = 6772; break; // &Pro -> &Prop - case 6810: state = 6811; break; // &puncs -> &puncsp - case 6817: state = 6833; break; // &q -> &qp - case 6825: state = 6826; break; // &Qo -> &Qop - case 6829: state = 6830; break; // &qo -> &qop - case 6876: state = 7512; break; // &r -> &rp - case 6902: state = 6903; break; // &raem -> &raemp - case 6932: state = 6953; break; // &rarr -> &rarrp - case 6934: state = 6935; break; // &rarra -> &rarrap - case 6950: state = 6951; break; // &rarrl -> &rarrlp - case 7076: state = 7082; break; // &real -> &realp - case 7121: state = 7122; break; // &ReverseU -> &ReverseUp - case 7281: state = 7282; break; // &righthar -> &rightharp - case 7291: state = 7292; break; // &rightharpoonu -> &rightharpoonup - case 7307: state = 7308; break; // &rightlefthar -> &rightleftharp - case 7383: state = 7384; break; // &RightU -> &RightUp - case 7469: state = 7481; break; // &ro -> &rop - case 7485: state = 7486; break; // &Ro -> &Rop - case 7505: state = 7506; break; // &RoundIm -> &RoundImp - case 7512: state = 7519; break; // &rp -> &rpp - case 7617: state = 7956; break; // &s -> &sp - case 7631: state = 7680; break; // &sc -> &scp - case 7633: state = 7634; break; // &sca -> &scap - case 7671: state = 7672; break; // &scna -> &scnap - case 7753: state = 7754; break; // &shar -> &sharp - case 7798: state = 7803; break; // &short -> &shortp - case 7823: state = 7824; break; // &ShortU -> &ShortUp - case 7847: state = 7868; break; // &sim -> &simp - case 7908: state = 7909; break; // &smash -> &smashp - case 7911: state = 7912; break; // &sme -> &smep - case 7936: state = 7953; break; // &so -> &sop - case 7949: state = 7950; break; // &So -> &Sop - case 7970: state = 7971; break; // &sqca -> &sqcap - case 7975: state = 7976; break; // &sqcu -> &sqcup - case 7985: state = 7997; break; // &sqsu -> &sqsup - case 8033: state = 8045; break; // &SquareSu -> &SquareSup - case 8111: state = 8120; break; // &straight -> &straightp - case 8112: state = 8113; break; // &straighte -> &straightep - case 8127: state = 8282; break; // &Su -> &Sup - case 8130: state = 8284; break; // &su -> &sup - case 8131: state = 8155; break; // &sub -> &subp - case 8193: state = 8196; break; // &subsu -> &subsup - case 8201: state = 8202; break; // &succa -> &succap - case 8202: state = 8203; break; // &succap -> &succapp - case 8250: state = 8251; break; // &succna -> &succnap - case 8251: state = 8252; break; // &succnap -> &succnapp - case 8284: state = 8343; break; // &sup -> &supp - case 8370: state = 8373; break; // &supsu -> &supsup - case 8404: state = 8617; break; // &t -> &tp - case 8496: state = 8497; break; // &thicka -> &thickap - case 8497: state = 8498; break; // &thickap -> &thickapp - case 8510: state = 8511; break; // &ThickS -> &ThickSp - case 8517: state = 8518; break; // &thins -> &thinsp - case 8521: state = 8522; break; // &ThinS -> &ThinSp - case 8528: state = 8529; break; // &thka -> &thkap - case 8590: state = 8594; break; // &to -> &top - case 8604: state = 8605; break; // &To -> &Top - case 8628: state = 8698; break; // &tr -> &trp - case 8633: state = 8685; break; // &tri -> &trip - case 8677: state = 8678; break; // &Tri -> &Trip - case 8768: state = 8970; break; // &U -> &Up - case 8775: state = 8983; break; // &u -> &up - case 8897: state = 8898; break; // &ulcro -> &ulcrop - case 8954: state = 8964; break; // &Uo -> &Uop - case 8959: state = 8967; break; // &uo -> &uop - case 8970: state = 9068; break; // &Up -> &Upp - case 9048: state = 9049; break; // &uphar -> &upharp - case 9118: state = 9119; break; // &upu -> &upup - case 9137: state = 9138; break; // &urcro -> &urcrop - case 9201: state = 9440; break; // &v -> &vp - case 9208: state = 9231; break; // &var -> &varp - case 9209: state = 9210; break; // &vare -> &varep - case 9218: state = 9219; break; // &varka -> &varkap - case 9219: state = 9220; break; // &varkap -> &varkapp - case 9238: state = 9239; break; // &varpro -> &varprop - case 9258: state = 9269; break; // &varsu -> &varsup - case 9357: state = 9358; break; // &velli -> &vellip - case 9388: state = 9389; break; // &VerticalSe -> &VerticalSep - case 9408: state = 9409; break; // &VeryThinS -> &VeryThinSp - case 9427: state = 9430; break; // &vnsu -> &vnsup - case 9432: state = 9433; break; // &Vo -> &Vop - case 9436: state = 9437; break; // &vo -> &vop - case 9442: state = 9443; break; // &vpro -> &vprop - case 9458: state = 9465; break; // &vsu -> &vsup - case 9490: state = 9531; break; // &w -> &wp - case 9514: state = 9515; break; // &weier -> &weierp - case 9523: state = 9524; break; // &Wo -> &Wop - case 9527: state = 9528; break; // &wo -> &wop - case 9550: state = 9551; break; // &xca -> &xcap - case 9557: state = 9558; break; // &xcu -> &xcup - case 9595: state = 9596; break; // &xma -> &xmap - case 9602: state = 9611; break; // &xo -> &xop - case 9607: state = 9608; break; // &Xo -> &Xop - case 9642: state = 9643; break; // &xsqcu -> &xsqcup - case 9645: state = 9646; break; // &xu -> &xup - case 9716: state = 9717; break; // &Yo -> &Yop - case 9720: state = 9721; break; // &yo -> &yop - case 9799: state = 9800; break; // &ZeroWidthS -> &ZeroWidthSp - case 9832: state = 9833; break; // &Zo -> &Zop - case 9836: state = 9837; break; // &zo -> &zop - default: return false; - } - break; - case 'q': - switch (state) { - case 0: state = 6817; break; // & -> &q - case 234: state = 235; break; // &approxe -> &approxeq - case 266: state = 267; break; // &asympe -> &asympeq - case 328: state = 329; break; // &backsime -> &backsimeq - case 379: state = 380; break; // &bd -> &bdq - case 471: state = 472; break; // &bigs -> &bigsq - case 531: state = 532; break; // &blacks -> &blacksq - case 580: state = 582; break; // &bne -> &bneq - case 779: state = 787; break; // &bumpe -> &bumpeq - case 784: state = 785; break; // &Bumpe -> &Bumpeq - case 983: state = 984; break; // &circe -> &circeq - case 1138: state = 1140; break; // &colone -> &coloneq - case 1355: state = 1356; break; // &curlye -> &curlyeq - case 1513: state = 1514; break; // &ddotse -> &ddotseq - case 1700: state = 1701; break; // &dote -> &doteq - case 1707: state = 1708; break; // &DotE -> &DotEq - case 1724: state = 1725; break; // &dots -> &dotsq - case 2108: state = 2367; break; // &E -> &Eq - case 2115: state = 2339; break; // &e -> &eq - case 2254: state = 2255; break; // &EmptySmallS -> &EmptySmallSq - case 2272: state = 2273; break; // &EmptyVerySmallS -> &EmptyVerySmallSq - case 2514: state = 2515; break; // &fallingdotse -> &fallingdotseq - case 2564: state = 2565; break; // &FilledSmallS -> &FilledSmallSq - case 2580: state = 2581; break; // &FilledVerySmallS -> &FilledVerySmallSq - case 2765: state = 2771; break; // &ge -> &geq - case 2771: state = 2773; break; // &geq -> &geqq - case 2843: state = 2845; break; // &gne -> &gneq - case 2845: state = 2847; break; // &gneq -> &gneqq - case 2872: state = 2873; break; // &GreaterE -> &GreaterEq - case 2887: state = 2888; break; // &GreaterFullE -> &GreaterFullEq - case 2911: state = 2912; break; // &GreaterSlantE -> &GreaterSlantEq - case 2942: state = 2959; break; // > -> >q - case 2980: state = 2981; break; // >re -> >req - case 2981: state = 2987; break; // >req -> >reqq - case 3007: state = 3008; break; // &gvertne -> &gvertneq - case 3008: state = 3009; break; // &gvertneq -> &gvertneqq - case 3219: state = 3220; break; // &HumpE -> &HumpEq - case 3243: state = 3497; break; // &i -> &iq - case 3705: state = 3755; break; // &la -> &laq - case 3869: state = 3873; break; // &ld -> &ldq - case 3896: state = 4187; break; // &le -> &leq - case 4074: state = 4075; break; // &leftrights -> &leftrightsq - case 4132: state = 4133; break; // &LeftTriangleE -> &LeftTriangleEq - case 4187: state = 4189; break; // &leq -> &leqq - case 4227: state = 4228; break; // &lesse -> &lesseq - case 4228: state = 4233; break; // &lesseq -> &lesseqq - case 4240: state = 4241; break; // &LessE -> &LessEq - case 4257: state = 4258; break; // &LessFullE -> &LessFullEq - case 4289: state = 4290; break; // &LessSlantE -> &LessSlantEq - case 4412: state = 4414; break; // &lne -> &lneq - case 4414: state = 4416; break; // &lneq -> &lneqq - case 4652: state = 4676; break; // &ls -> &lsq - case 4653: state = 4654; break; // &lsa -> &lsaq - case 4698: state = 4725; break; // < -> <q - case 4760: state = 4761; break; // &lvertne -> &lvertneq - case 4761: state = 4762; break; // &lvertneq -> &lvertneqq - case 5064: state = 5135; break; // &ne -> &neq - case 5198: state = 5200; break; // &nge -> &ngeq - case 5200: state = 5202; break; // &ngeq -> &ngeqq - case 5270: state = 5312; break; // &nle -> &nleq - case 5312: state = 5314; break; // &nleq -> &nleqq - case 5414: state = 5422; break; // &NotE -> &NotEq - case 5447: state = 5448; break; // &NotGreaterE -> &NotGreaterEq - case 5457: state = 5458; break; // &NotGreaterFullE -> &NotGreaterFullEq - case 5481: state = 5482; break; // &NotGreaterSlantE -> &NotGreaterSlantEq - case 5506: state = 5507; break; // &NotHumpE -> &NotHumpEq - case 5545: state = 5546; break; // &NotLeftTriangleE -> &NotLeftTriangleEq - case 5554: state = 5555; break; // &NotLessE -> &NotLessEq - case 5578: state = 5579; break; // &NotLessSlantE -> &NotLessSlantEq - case 5639: state = 5640; break; // &NotPrecedesE -> &NotPrecedesEq - case 5650: state = 5651; break; // &NotPrecedesSlantE -> &NotPrecedesSlantEq - case 5688: state = 5689; break; // &NotRightTriangleE -> &NotRightTriangleEq - case 5694: state = 5695; break; // &NotS -> &NotSq - case 5707: state = 5708; break; // &NotSquareSubsetE -> &NotSquareSubsetEq - case 5720: state = 5721; break; // &NotSquareSupersetE -> &NotSquareSupersetEq - case 5732: state = 5733; break; // &NotSubsetE -> &NotSubsetEq - case 5745: state = 5746; break; // &NotSucceedsE -> &NotSucceedsEq - case 5756: state = 5757; break; // &NotSucceedsSlantE -> &NotSucceedsSlantEq - case 5775: state = 5776; break; // &NotSupersetE -> &NotSupersetEq - case 5787: state = 5788; break; // &NotTildeE -> &NotTildeEq - case 5797: state = 5798; break; // &NotTildeFullE -> &NotTildeFullEq - case 5852: state = 5853; break; // &nprece -> &npreceq - case 5895: state = 5942; break; // &ns -> &nsq - case 5930: state = 5932; break; // &nsime -> &nsimeq - case 5962: state = 5963; break; // &nsubsete -> &nsubseteq - case 5963: state = 5965; break; // &nsubseteq -> &nsubseteqq - case 5970: state = 5971; break; // &nsucce -> &nsucceq - case 5983: state = 5984; break; // &nsupsete -> &nsupseteq - case 5984: state = 5986; break; // &nsupseteq -> &nsupseteqq - case 6018: state = 6019; break; // &ntrianglelefte -> &ntrianglelefteq - case 6027: state = 6028; break; // &ntrianglerighte -> &ntrianglerighteq - case 6669: state = 6670; break; // &preccurlye -> &preccurlyeq - case 6679: state = 6680; break; // &PrecedesE -> &PrecedesEq - case 6690: state = 6691; break; // &PrecedesSlantE -> &PrecedesSlantEq - case 6702: state = 6703; break; // &prece -> &preceq - case 6713: state = 6714; break; // &precne -> &precneq - case 6714: state = 6715; break; // &precneq -> &precneqq - case 6866: state = 6867; break; // &queste -> &questeq - case 6882: state = 6921; break; // &ra -> &raq - case 7053: state = 7063; break; // &rd -> &rdq - case 7102: state = 7110; break; // &ReverseE -> &ReverseEq - case 7123: state = 7124; break; // &ReverseUpE -> &ReverseUpEq - case 7326: state = 7327; break; // &rights -> &rightsq - case 7377: state = 7378; break; // &RightTriangleE -> &RightTriangleEq - case 7439: state = 7440; break; // &risingdotse -> &risingdotseq - case 7542: state = 7559; break; // &rs -> &rsq - case 7543: state = 7544; break; // &rsa -> &rsaq - case 7610: state = 7980; break; // &S -> &Sq - case 7617: state = 7968; break; // &s -> &sq - case 7624: state = 7625; break; // &sb -> &sbq - case 7853: state = 7855; break; // &sime -> &simeq - case 7994: state = 7995; break; // &sqsubsete -> &sqsubseteq - case 8005: state = 8006; break; // &sqsupsete -> &sqsupseteq - case 8039: state = 8040; break; // &SquareSubsetE -> &SquareSubsetEq - case 8052: state = 8053; break; // &SquareSupersetE -> &SquareSupersetEq - case 8173: state = 8174; break; // &subsete -> &subseteq - case 8174: state = 8176; break; // &subseteq -> &subseteqq - case 8178: state = 8179; break; // &SubsetE -> &SubsetEq - case 8185: state = 8186; break; // &subsetne -> &subsetneq - case 8186: state = 8188; break; // &subsetneq -> &subsetneqq - case 8213: state = 8214; break; // &succcurlye -> &succcurlyeq - case 8223: state = 8224; break; // &SucceedsE -> &SucceedsEq - case 8234: state = 8235; break; // &SucceedsSlantE -> &SucceedsSlantEq - case 8246: state = 8247; break; // &succe -> &succeq - case 8257: state = 8258; break; // &succne -> &succneq - case 8258: state = 8259; break; // &succneq -> &succneqq - case 8314: state = 8315; break; // &SupersetE -> &SupersetEq - case 8356: state = 8357; break; // &supsete -> &supseteq - case 8357: state = 8359; break; // &supseteq -> &supseteqq - case 8362: state = 8363; break; // &supsetne -> &supsetneq - case 8363: state = 8365; break; // &supsetneq -> &supsetneqq - case 8554: state = 8555; break; // &TildeE -> &TildeEq - case 8564: state = 8565; break; // &TildeFullE -> &TildeFullEq - case 8638: state = 8653; break; // &triangle -> &triangleq - case 8650: state = 8651; break; // &trianglelefte -> &trianglelefteq - case 8661: state = 8662; break; // &trianglerighte -> &trianglerighteq - case 9034: state = 9035; break; // &UpE -> &UpEq - case 9264: state = 9265; break; // &varsubsetne -> &varsubsetneq - case 9265: state = 9267; break; // &varsubsetneq -> &varsubsetneqq - case 9274: state = 9275; break; // &varsupsetne -> &varsupsetneq - case 9275: state = 9277; break; // &varsupsetneq -> &varsupsetneqq - case 9352: state = 9353; break; // &veee -> &veeeq - case 9508: state = 9510; break; // &wedge -> &wedgeq - case 9636: state = 9640; break; // &xs -> &xsq - default: return false; - } - break; - case 'r': - switch (state) { - case 0: state = 6876; break; // & -> &r - case 1: state = 237; break; // &A -> &Ar - case 8: state = 242; break; // &a -> &ar - case 15: state = 16; break; // &Ab -> &Abr - case 21: state = 22; break; // &ab -> &abr - case 34: state = 35; break; // &Aci -> &Acir - case 38: state = 39; break; // &aci -> &acir - case 60: state = 65; break; // &af -> &afr - case 62: state = 63; break; // &Af -> &Afr - case 67: state = 68; break; // &Ag -> &Agr - case 73: state = 74; break; // &ag -> &agr - case 100: state = 101; break; // &Amac -> &Amacr - case 105: state = 106; break; // &amac -> &amacr - case 136: state = 164; break; // &ang -> &angr - case 179: state = 180; break; // &angza -> &angzar - case 180: state = 181; break; // &angzar -> &angzarr - case 203: state = 204; break; // &apaci -> &apacir - case 229: state = 230; break; // &app -> &appr - case 248: state = 249; break; // &Asc -> &Ascr - case 252: state = 253; break; // &asc -> &ascr - case 301: state = 730; break; // &b -> &br - case 302: state = 344; break; // &ba -> &bar - case 318: state = 319; break; // &backp -> &backpr - case 331: state = 725; break; // &B -> &Br - case 332: state = 341; break; // &Ba -> &Bar - case 360: state = 361; break; // &bb -> &bbr - case 365: state = 366; break; // &bbrktb -> &bbrktbr - case 384: state = 409; break; // &be -> &ber - case 390: state = 414; break; // &Be -> &Ber - case 436: state = 437; break; // &Bf -> &Bfr - case 439: state = 440; break; // &bf -> &bfr - case 448: state = 449; break; // &bigci -> &bigcir - case 478: state = 479; break; // &bigsta -> &bigstar - case 481: state = 482; break; // &bigt -> &bigtr - case 514: state = 515; break; // &bka -> &bkar - case 534: state = 535; break; // &blacksqua -> &blacksquar - case 538: state = 539; break; // &blackt -> &blacktr - case 545: state = 557; break; // &blacktriangle -> &blacktriangler - case 618: state = 630; break; // &boxD -> &boxDr - case 623: state = 634; break; // &boxd -> &boxdr - case 673: state = 685; break; // &boxU -> &boxUr - case 678: state = 689; break; // &boxu -> &boxur - case 691: state = 713; break; // &boxV -> &boxVr - case 693: state = 717; break; // &boxv -> &boxvr - case 719: state = 720; break; // &bp -> &bpr - case 737: state = 738; break; // &brvba -> ¦ - case 741: state = 742; break; // &Bsc -> &Bscr - case 745: state = 746; break; // &bsc -> &bscr - case 789: state = 1261; break; // &C -> &Cr - case 796: state = 1256; break; // &c -> &cr - case 797: state = 848; break; // &ca -> &car - case 811: state = 812; break; // &capb -> &capbr - case 836: state = 837; break; // &CapitalDiffe -> &CapitalDiffer - case 862: state = 872; break; // &cca -> &ccar - case 867: state = 868; break; // &Cca -> &Ccar - case 886: state = 887; break; // &Cci -> &Ccir - case 890: state = 891; break; // &cci -> &ccir - case 938: state = 939; break; // &Cente -> &Center - case 944: state = 945; break; // ¢e -> ¢er - case 950: state = 951; break; // &Cf -> &Cfr - case 953: state = 954; break; // &cf -> &cfr - case 969: state = 970; break; // &checkma -> &checkmar - case 978: state = 979; break; // &ci -> &cir - case 988: state = 989; break; // &circlea -> &circlear - case 989: state = 990; break; // &circlear -> &circlearr - case 992: state = 998; break; // &circlearrow -> &circlearrowr - case 1010: state = 1011; break; // &circledci -> &circledcir - case 1019: state = 1020; break; // &Ci -> &Cir - case 1065: state = 1066; break; // &cirsci -> &cirscir - case 1081: state = 1082; break; // &ClockwiseContou -> &ClockwiseContour - case 1087: state = 1088; break; // &ClockwiseContourInteg -> &ClockwiseContourIntegr - case 1095: state = 1096; break; // &CloseCu -> &CloseCur - case 1172: state = 1173; break; // &Cong -> &Congr - case 1189: state = 1190; break; // &Contou -> &Contour - case 1195: state = 1196; break; // &ContourInteg -> &ContourIntegr - case 1200: state = 1210; break; // &Cop -> &Copr - case 1203: state = 1206; break; // &cop -> &copr - case 1223: state = 1224; break; // ©s -> ©sr - case 1229: state = 1230; break; // &Counte -> &Counter - case 1245: state = 1246; break; // &CounterClockwiseContou -> &CounterClockwiseContour - case 1251: state = 1252; break; // &CounterClockwiseContourInteg -> &CounterClockwiseContourIntegr - case 1257: state = 1258; break; // &cra -> &crar - case 1258: state = 1259; break; // &crar -> &crarr - case 1271: state = 1272; break; // &Csc -> &Cscr - case 1275: state = 1276; break; // &csc -> &cscr - case 1292: state = 1346; break; // &cu -> &cur - case 1294: state = 1295; break; // &cuda -> &cudar - case 1295: state = 1296; break; // &cudar -> &cudarr - case 1296: state = 1299; break; // &cudarr -> &cudarrr - case 1302: state = 1303; break; // &cuep -> &cuepr - case 1309: state = 1310; break; // &cula -> &cular - case 1310: state = 1311; break; // &cular -> &cularr - case 1320: state = 1321; break; // &cupb -> &cupbr - case 1341: state = 1342; break; // &cupo -> &cupor - case 1346: state = 1377; break; // &cur -> &curr - case 1347: state = 1348; break; // &cura -> &curar - case 1348: state = 1349; break; // &curar -> &curarr - case 1357: state = 1358; break; // &curlyeqp -> &curlyeqpr - case 1383: state = 1384; break; // &curvea -> &curvear - case 1384: state = 1385; break; // &curvear -> &curvearr - case 1387: state = 1393; break; // &curvearrow -> &curvearrowr - case 1426: state = 1444; break; // &Da -> &Dar - case 1429: state = 1430; break; // &Dagge -> &Dagger - case 1432: state = 2023; break; // &d -> &dr - case 1433: state = 1451; break; // &da -> &dar - case 1436: state = 1437; break; // &dagge -> &dagger - case 1444: state = 1445; break; // &Dar -> &Darr - case 1447: state = 1448; break; // &dA -> &dAr - case 1448: state = 1449; break; // &dAr -> &dArr - case 1451: state = 1452; break; // &dar -> &darr - case 1465: state = 1466; break; // &dbka -> &dbkar - case 1475: state = 1476; break; // &Dca -> &Dcar - case 1481: state = 1482; break; // &dca -> &dcar - case 1494: state = 1500; break; // &dda -> &ddar - case 1497: state = 1498; break; // &ddagge -> &ddagger - case 1500: state = 1501; break; // &ddar -> &ddarr - case 1504: state = 1505; break; // &DDot -> &DDotr - case 1535: state = 1544; break; // &df -> &dfr - case 1541: state = 1542; break; // &Df -> &Dfr - case 1547: state = 1548; break; // &dHa -> &dHar - case 1551: state = 1552; break; // &dha -> &dhar - case 1552: state = 1555; break; // &dhar -> &dharr - case 1559: state = 1560; break; // &Diac -> &Diacr - case 1587: state = 1588; break; // &DiacriticalG -> &DiacriticalGr - case 1623: state = 1624; break; // &Diffe -> &Differ - case 1670: state = 1675; break; // &dlc -> &dlcr - case 1671: state = 1672; break; // &dlco -> &dlcor - case 1682: state = 1683; break; // &dolla -> &dollar - case 1727: state = 1728; break; // &dotsqua -> &dotsquar - case 1736: state = 1737; break; // &doubleba -> &doublebar - case 1753: state = 1754; break; // &DoubleContou -> &DoubleContour - case 1759: state = 1760; break; // &DoubleContourInteg -> &DoubleContourIntegr - case 1770: state = 1771; break; // &DoubleDownA -> &DoubleDownAr - case 1771: state = 1772; break; // &DoubleDownAr -> &DoubleDownArr - case 1780: state = 1781; break; // &DoubleLeftA -> &DoubleLeftAr - case 1781: state = 1782; break; // &DoubleLeftAr -> &DoubleLeftArr - case 1791: state = 1792; break; // &DoubleLeftRightA -> &DoubleLeftRightAr - case 1792: state = 1793; break; // &DoubleLeftRightAr -> &DoubleLeftRightArr - case 1808: state = 1809; break; // &DoubleLongLeftA -> &DoubleLongLeftAr - case 1809: state = 1810; break; // &DoubleLongLeftAr -> &DoubleLongLeftArr - case 1819: state = 1820; break; // &DoubleLongLeftRightA -> &DoubleLongLeftRightAr - case 1820: state = 1821; break; // &DoubleLongLeftRightAr -> &DoubleLongLeftRightArr - case 1830: state = 1831; break; // &DoubleLongRightA -> &DoubleLongRightAr - case 1831: state = 1832; break; // &DoubleLongRightAr -> &DoubleLongRightArr - case 1841: state = 1842; break; // &DoubleRightA -> &DoubleRightAr - case 1842: state = 1843; break; // &DoubleRightAr -> &DoubleRightArr - case 1853: state = 1854; break; // &DoubleUpA -> &DoubleUpAr - case 1854: state = 1855; break; // &DoubleUpAr -> &DoubleUpArr - case 1863: state = 1864; break; // &DoubleUpDownA -> &DoubleUpDownAr - case 1864: state = 1865; break; // &DoubleUpDownAr -> &DoubleUpDownArr - case 1870: state = 1871; break; // &DoubleVe -> &DoubleVer - case 1878: state = 1879; break; // &DoubleVerticalBa -> &DoubleVerticalBar - case 1883: state = 1884; break; // &DownA -> &DownAr - case 1884: state = 1885; break; // &DownAr -> &DownArr - case 1889: state = 1890; break; // &Downa -> &Downar - case 1890: state = 1891; break; // &Downar -> &Downarr - case 1897: state = 1898; break; // &downa -> &downar - case 1898: state = 1899; break; // &downar -> &downarr - case 1904: state = 1905; break; // &DownArrowBa -> &DownArrowBar - case 1909: state = 1910; break; // &DownArrowUpA -> &DownArrowUpAr - case 1910: state = 1911; break; // &DownArrowUpAr -> &DownArrowUpArr - case 1915: state = 1916; break; // &DownB -> &DownBr - case 1925: state = 1926; break; // &downdowna -> &downdownar - case 1926: state = 1927; break; // &downdownar -> &downdownarr - case 1933: state = 1934; break; // &downha -> &downhar - case 1938: state = 1944; break; // &downharpoon -> &downharpoonr - case 1963: state = 1964; break; // &DownLeftRightVecto -> &DownLeftRightVector - case 1973: state = 1974; break; // &DownLeftTeeVecto -> &DownLeftTeeVector - case 1980: state = 1981; break; // &DownLeftVecto -> &DownLeftVector - case 1984: state = 1985; break; // &DownLeftVectorBa -> &DownLeftVectorBar - case 1999: state = 2000; break; // &DownRightTeeVecto -> &DownRightTeeVector - case 2006: state = 2007; break; // &DownRightVecto -> &DownRightVector - case 2010: state = 2011; break; // &DownRightVectorBa -> &DownRightVectorBar - case 2017: state = 2018; break; // &DownTeeA -> &DownTeeAr - case 2018: state = 2019; break; // &DownTeeAr -> &DownTeeArr - case 2026: state = 2027; break; // &drbka -> &drbkar - case 2031: state = 2036; break; // &drc -> &drcr - case 2032: state = 2033; break; // &drco -> &drcor - case 2041: state = 2042; break; // &Dsc -> &Dscr - case 2045: state = 2046; break; // &dsc -> &dscr - case 2057: state = 2058; break; // &Dst -> &Dstr - case 2062: state = 2063; break; // &dst -> &dstr - case 2067: state = 2072; break; // &dt -> &dtr - case 2078: state = 2079; break; // &dua -> &duar - case 2079: state = 2080; break; // &duar -> &duarr - case 2083: state = 2084; break; // &duha -> &duhar - case 2102: state = 2103; break; // &dzig -> &dzigr - case 2104: state = 2105; break; // &dzigra -> &dzigrar - case 2105: state = 2106; break; // &dzigrar -> &dzigrarr - case 2115: state = 2409; break; // &e -> &er - case 2124: state = 2125; break; // &easte -> &easter - case 2128: state = 2129; break; // &Eca -> &Ecar - case 2134: state = 2135; break; // &eca -> &ecar - case 2139: state = 2140; break; // &eci -> &ecir - case 2142: state = 2143; break; // &Eci -> &Ecir - case 2175: state = 2183; break; // &ef -> &efr - case 2180: state = 2181; break; // &Ef -> &Efr - case 2185: state = 2193; break; // &eg -> &egr - case 2187: state = 2188; break; // &Eg -> &Egr - case 2216: state = 2217; break; // &elinte -> &elinter - case 2230: state = 2231; break; // &Emac -> &Emacr - case 2235: state = 2236; break; // &emac -> &emacr - case 2257: state = 2258; break; // &EmptySmallSqua -> &EmptySmallSquar - case 2264: state = 2265; break; // &EmptyVe -> &EmptyVer - case 2275: state = 2276; break; // &EmptyVerySmallSqua -> &EmptyVerySmallSquar - case 2313: state = 2314; break; // &epa -> &epar - case 2341: state = 2342; break; // &eqci -> &eqcir - case 2359: state = 2360; break; // &eqslantgt -> &eqslantgtr - case 2390: state = 2391; break; // &Equilib -> &Equilibr - case 2404: state = 2405; break; // &eqvpa -> &eqvpar - case 2410: state = 2411; break; // &era -> &erar - case 2411: state = 2412; break; // &erar -> &erarr - case 2419: state = 2420; break; // &Esc -> &Escr - case 2423: state = 2424; break; // &esc -> &escr - case 2451: state = 2455; break; // &eu -> &eur - case 2503: state = 2647; break; // &f -> &fr - case 2530: state = 2547; break; // &ff -> &ffr - case 2544: state = 2545; break; // &Ff -> &Ffr - case 2567: state = 2568; break; // &FilledSmallSqua -> &FilledSmallSquar - case 2572: state = 2573; break; // &FilledVe -> &FilledVer - case 2583: state = 2584; break; // &FilledVerySmallSqua -> &FilledVerySmallSquar - case 2608: state = 2616; break; // &Fo -> &For - case 2612: state = 2621; break; // &fo -> &for - case 2630: state = 2631; break; // &Fou -> &Four - case 2633: state = 2634; break; // &Fourie -> &Fourier - case 2635: state = 2636; break; // &Fouriert -> &Fouriertr - case 2640: state = 2641; break; // &fpa -> &fpar - case 2694: state = 2695; break; // &Fsc -> &Fscr - case 2698: state = 2699; break; // &fsc -> &fscr - case 2701: state = 2861; break; // &g -> &gr - case 2708: state = 2866; break; // &G -> &Gr - case 2724: state = 2725; break; // &Gb -> &Gbr - case 2730: state = 2731; break; // &gb -> &gbr - case 2742: state = 2743; break; // &Gci -> &Gcir - case 2747: state = 2748; break; // &gci -> &gcir - case 2799: state = 2800; break; // &Gf -> &Gfr - case 2802: state = 2803; break; // &gf -> &gfr - case 2836: state = 2837; break; // &gnapp -> &gnappr - case 2870: state = 2871; break; // &Greate -> &Greater - case 2893: state = 2894; break; // &GreaterG -> &GreaterGr - case 2898: state = 2899; break; // &GreaterGreate -> &GreaterGreater - case 2924: state = 2925; break; // &Gsc -> &Gscr - case 2928: state = 2929; break; // &gsc -> &gscr - case 2942: state = 2965; break; // > -> >r - case 2947: state = 2948; break; // >ci -> >cir - case 2956: state = 2957; break; // >lPa -> >lPar - case 2966: state = 2973; break; // >ra -> >rar - case 2968: state = 2969; break; // >rapp -> >rappr - case 2973: state = 2974; break; // >rar -> >rarr - case 3003: state = 3004; break; // &gve -> &gver - case 3021: state = 3041; break; // &ha -> &har - case 3022: state = 3023; break; // &hai -> &hair - case 3041: state = 3050; break; // &har -> &harr - case 3046: state = 3047; break; // &hA -> &hAr - case 3047: state = 3048; break; // &hAr -> &hArr - case 3053: state = 3054; break; // &harrci -> &harrcir - case 3061: state = 3062; break; // &hba -> &hbar - case 3065: state = 3066; break; // &Hci -> &Hcir - case 3070: state = 3071; break; // &hci -> &hcir - case 3074: state = 3089; break; // &he -> &her - case 3075: state = 3076; break; // &hea -> &hear - case 3094: state = 3095; break; // &Hf -> &Hfr - case 3097: state = 3098; break; // &hf -> &hfr - case 3103: state = 3104; break; // &Hilbe -> &Hilber - case 3115: state = 3116; break; // &hksea -> &hksear - case 3121: state = 3122; break; // &hkswa -> &hkswar - case 3126: state = 3166; break; // &ho -> &hor - case 3127: state = 3128; break; // &hoa -> &hoar - case 3128: state = 3129; break; // &hoar -> &hoarr - case 3137: state = 3148; break; // &hook -> &hookr - case 3142: state = 3143; break; // &hooklefta -> &hookleftar - case 3143: state = 3144; break; // &hookleftar -> &hookleftarr - case 3153: state = 3154; break; // &hookrighta -> &hookrightar - case 3154: state = 3155; break; // &hookrightar -> &hookrightarr - case 3159: state = 3171; break; // &Ho -> &Hor - case 3168: state = 3169; break; // &horba -> &horbar - case 3185: state = 3186; break; // &Hsc -> &Hscr - case 3189: state = 3190; break; // &hsc -> &hscr - case 3197: state = 3198; break; // &Hst -> &Hstr - case 3202: state = 3203; break; // &hst -> &hstr - case 3253: state = 3254; break; // &Ici -> &Icir - case 3257: state = 3258; break; // &ici -> &icir - case 3281: state = 3287; break; // &if -> &ifr - case 3284: state = 3285; break; // &If -> &Ifr - case 3289: state = 3290; break; // &Ig -> &Igr - case 3295: state = 3296; break; // &ig -> &igr - case 3333: state = 3334; break; // &Imac -> &Imacr - case 3338: state = 3339; break; // &imac -> &imacr - case 3347: state = 3348; break; // &Imagina -> &Imaginar - case 3358: state = 3359; break; // &imagpa -> &imagpar - case 3381: state = 3382; break; // &inca -> &incar - case 3407: state = 3419; break; // &inte -> &inter - case 3409: state = 3410; break; // &intege -> &integer - case 3413: state = 3424; break; // &Inte -> &Inter - case 3414: state = 3415; break; // &Integ -> &Integr - case 3434: state = 3435; break; // &intla -> &intlar - case 3439: state = 3440; break; // &intp -> &intpr - case 3492: state = 3493; break; // &ip -> &ipr - case 3504: state = 3505; break; // &Isc -> &Iscr - case 3508: state = 3509; break; // &isc -> &iscr - case 3557: state = 3558; break; // &Jci -> &Jcir - case 3563: state = 3564; break; // &jci -> &jcir - case 3571: state = 3572; break; // &Jf -> &Jfr - case 3574: state = 3575; break; // &jf -> &jfr - case 3591: state = 3592; break; // &Jsc -> &Jscr - case 3595: state = 3596; break; // &jsc -> &jscr - case 3598: state = 3599; break; // &Jse -> &Jser - case 3603: state = 3604; break; // &jse -> &jser - case 3648: state = 3649; break; // &Kf -> &Kfr - case 3651: state = 3652; break; // &kf -> &kfr - case 3654: state = 3655; break; // &kg -> &kgr - case 3685: state = 3686; break; // &Ksc -> &Kscr - case 3689: state = 3690; break; // &ksc -> &kscr - case 3692: state = 4628; break; // &l -> &lr - case 3693: state = 3762; break; // &lA -> &lAr - case 3694: state = 3695; break; // &lAa -> &lAar - case 3695: state = 3696; break; // &lAar -> &lAarr - case 3699: state = 3759; break; // &La -> &Lar - case 3705: state = 3765; break; // &la -> &lar - case 3718: state = 3719; break; // &lag -> &lagr - case 3751: state = 3752; break; // &Laplacet -> &Laplacetr - case 3759: state = 3760; break; // &Lar -> &Larr - case 3762: state = 3763; break; // &lAr -> &lArr - case 3765: state = 3766; break; // &lar -> &larr - case 3808: state = 3809; break; // &lBa -> &lBar - case 3809: state = 3810; break; // &lBar -> &lBarr - case 3812: state = 3821; break; // &lb -> &lbr - case 3813: state = 3814; break; // &lba -> &lbar - case 3814: state = 3815; break; // &lbar -> &lbarr - case 3817: state = 3818; break; // &lbb -> &lbbr - case 3838: state = 3839; break; // &Lca -> &Lcar - case 3844: state = 3845; break; // &lca -> &lcar - case 3869: state = 3879; break; // &ld -> &ldr - case 3875: state = 3877; break; // &ldquo -> &ldquor - case 3882: state = 3883; break; // &ldrdha -> &ldrdhar - case 3888: state = 3889; break; // &ldrusha -> &ldrushar - case 3900: state = 4041; break; // &Left -> &Leftr - case 3901: state = 3914; break; // &LeftA -> &LeftAr - case 3906: state = 3907; break; // &LeftAngleB -> &LeftAngleBr - case 3914: state = 3915; break; // &LeftAr -> &LeftArr - case 3919: state = 3920; break; // &Lefta -> &Leftar - case 3920: state = 3921; break; // &Leftar -> &Leftarr - case 3926: state = 4052; break; // &left -> &leftr - case 3927: state = 3928; break; // &lefta -> &leftar - case 3928: state = 3929; break; // &leftar -> &leftarr - case 3934: state = 3935; break; // &LeftArrowBa -> &LeftArrowBar - case 3942: state = 3943; break; // &LeftArrowRightA -> &LeftArrowRightAr - case 3943: state = 3944; break; // &LeftArrowRightAr -> &LeftArrowRightArr - case 3967: state = 3968; break; // &LeftDoubleB -> &LeftDoubleBr - case 3984: state = 3985; break; // &LeftDownTeeVecto -> &LeftDownTeeVector - case 3991: state = 3992; break; // &LeftDownVecto -> &LeftDownVector - case 3995: state = 3996; break; // &LeftDownVectorBa -> &LeftDownVectorBar - case 4001: state = 4002; break; // &LeftFloo -> &LeftFloor - case 4005: state = 4006; break; // &leftha -> &lefthar - case 4023: state = 4024; break; // &leftlefta -> &leftleftar - case 4024: state = 4025; break; // &leftleftar -> &leftleftarr - case 4035: state = 4036; break; // &LeftRightA -> &LeftRightAr - case 4036: state = 4037; break; // &LeftRightAr -> &LeftRightArr - case 4046: state = 4047; break; // &Leftrighta -> &Leftrightar - case 4047: state = 4048; break; // &Leftrightar -> &Leftrightarr - case 4057: state = 4058; break; // &leftrighta -> &leftrightar - case 4058: state = 4059; break; // &leftrightar -> &leftrightarr - case 4066: state = 4067; break; // &leftrightha -> &leftrighthar - case 4079: state = 4080; break; // &leftrightsquiga -> &leftrightsquigar - case 4080: state = 4081; break; // &leftrightsquigar -> &leftrightsquigarr - case 4089: state = 4090; break; // &LeftRightVecto -> &LeftRightVector - case 4092: state = 4120; break; // &LeftT -> &LeftTr - case 4096: state = 4097; break; // &LeftTeeA -> &LeftTeeAr - case 4097: state = 4098; break; // &LeftTeeAr -> &LeftTeeArr - case 4106: state = 4107; break; // &LeftTeeVecto -> &LeftTeeVector - case 4110: state = 4111; break; // &leftth -> &leftthr - case 4129: state = 4130; break; // &LeftTriangleBa -> &LeftTriangleBar - case 4148: state = 4149; break; // &LeftUpDownVecto -> &LeftUpDownVector - case 4158: state = 4159; break; // &LeftUpTeeVecto -> &LeftUpTeeVector - case 4165: state = 4166; break; // &LeftUpVecto -> &LeftUpVector - case 4169: state = 4170; break; // &LeftUpVectorBa -> &LeftUpVectorBar - case 4176: state = 4177; break; // &LeftVecto -> &LeftVector - case 4180: state = 4181; break; // &LeftVectorBa -> &LeftVectorBar - case 4206: state = 4208; break; // &lesdoto -> &lesdotor - case 4218: state = 4219; break; // &lessapp -> &lessappr - case 4230: state = 4231; break; // &lesseqgt -> &lesseqgtr - case 4235: state = 4236; break; // &lesseqqgt -> &lesseqqgtr - case 4245: state = 4246; break; // &LessEqualG -> &LessEqualGr - case 4250: state = 4251; break; // &LessEqualGreate -> &LessEqualGreater - case 4263: state = 4264; break; // &LessG -> &LessGr - case 4268: state = 4269; break; // &LessGreate -> &LessGreater - case 4272: state = 4273; break; // &lessgt -> &lessgtr - case 4301: state = 4315; break; // &lf -> &lfr - case 4309: state = 4310; break; // &lfloo -> &lfloor - case 4312: state = 4313; break; // &Lf -> &Lfr - case 4322: state = 4323; break; // &lHa -> &lHar - case 4326: state = 4327; break; // &lha -> &lhar - case 4350: state = 4351; break; // &lla -> &llar - case 4351: state = 4352; break; // &llar -> &llarr - case 4355: state = 4356; break; // &llco -> &llcor - case 4358: state = 4359; break; // &llcorne -> &llcorner - case 4364: state = 4365; break; // &Llefta -> &Lleftar - case 4365: state = 4366; break; // &Lleftar -> &Lleftarr - case 4371: state = 4372; break; // &llha -> &llhar - case 4375: state = 4376; break; // &llt -> &lltr - case 4405: state = 4406; break; // &lnapp -> &lnappr - case 4423: state = 4427; break; // &loa -> &loar - case 4427: state = 4428; break; // &loar -> &loarr - case 4430: state = 4431; break; // &lob -> &lobr - case 4436: state = 4520; break; // &Long -> &Longr - case 4441: state = 4442; break; // &LongLeftA -> &LongLeftAr - case 4442: state = 4443; break; // &LongLeftAr -> &LongLeftArr - case 4450: state = 4480; break; // &Longleft -> &Longleftr - case 4451: state = 4452; break; // &Longlefta -> &Longleftar - case 4452: state = 4453; break; // &Longleftar -> &Longleftarr - case 4458: state = 4531; break; // &long -> &longr - case 4462: state = 4491; break; // &longleft -> &longleftr - case 4463: state = 4464; break; // &longlefta -> &longleftar - case 4464: state = 4465; break; // &longleftar -> &longleftarr - case 4474: state = 4475; break; // &LongLeftRightA -> &LongLeftRightAr - case 4475: state = 4476; break; // &LongLeftRightAr -> &LongLeftRightArr - case 4485: state = 4486; break; // &Longleftrighta -> &Longleftrightar - case 4486: state = 4487; break; // &Longleftrightar -> &Longleftrightarr - case 4496: state = 4497; break; // &longleftrighta -> &longleftrightar - case 4497: state = 4498; break; // &longleftrightar -> &longleftrightarr - case 4514: state = 4515; break; // &LongRightA -> &LongRightAr - case 4515: state = 4516; break; // &LongRightAr -> &LongRightArr - case 4525: state = 4526; break; // &Longrighta -> &Longrightar - case 4526: state = 4527; break; // &Longrightar -> &Longrightarr - case 4536: state = 4537; break; // &longrighta -> &longrightar - case 4537: state = 4538; break; // &longrightar -> &longrightarr - case 4544: state = 4545; break; // &loopa -> &loopar - case 4545: state = 4546; break; // &loopar -> &looparr - case 4548: state = 4554; break; // &looparrow -> &looparrowr - case 4561: state = 4562; break; // &lopa -> &lopar - case 4585: state = 4586; break; // &lowba -> &lowbar - case 4589: state = 4590; break; // &Lowe -> &Lower - case 4595: state = 4596; break; // &LowerLeftA -> &LowerLeftAr - case 4596: state = 4597; break; // &LowerLeftAr -> &LowerLeftArr - case 4606: state = 4607; break; // &LowerRightA -> &LowerRightAr - case 4607: state = 4608; break; // &LowerRightAr -> &LowerRightArr - case 4622: state = 4623; break; // &lpa -> &lpar - case 4629: state = 4630; break; // &lra -> &lrar - case 4630: state = 4631; break; // &lrar -> &lrarr - case 4634: state = 4635; break; // &lrco -> &lrcor - case 4637: state = 4638; break; // &lrcorne -> &lrcorner - case 4641: state = 4642; break; // &lrha -> &lrhar - case 4648: state = 4649; break; // &lrt -> &lrtr - case 4659: state = 4660; break; // &Lsc -> &Lscr - case 4662: state = 4663; break; // &lsc -> &lscr - case 4680: state = 4682; break; // &lsquo -> &lsquor - case 4684: state = 4685; break; // &Lst -> &Lstr - case 4689: state = 4690; break; // &lst -> &lstr - case 4698: state = 4731; break; // < -> <r - case 4703: state = 4704; break; // <ci -> <cir - case 4710: state = 4711; break; // <h -> <hr - case 4721: state = 4722; break; // <la -> <lar - case 4722: state = 4723; break; // <lar -> <larr - case 4739: state = 4740; break; // <rPa -> <rPar - case 4742: state = 4743; break; // &lu -> &lur - case 4747: state = 4748; break; // &lurdsha -> &lurdshar - case 4752: state = 4753; break; // &luruha -> &luruhar - case 4756: state = 4757; break; // &lve -> &lver - case 4768: state = 4804; break; // &ma -> &mar - case 4769: state = 4770; break; // &mac -> ¯ - case 4806: state = 4807; break; // &marke -> &marker - case 4833: state = 4834; break; // &measu -> &measur - case 4858: state = 4859; break; // &Mellint -> &Mellintr - case 4862: state = 4863; break; // &Mf -> &Mfr - case 4865: state = 4866; break; // &mf -> &mfr - case 4872: state = 4873; break; // &mic -> &micr - case 4883: state = 4884; break; // &midci -> &midcir - case 4913: state = 4914; break; // &mld -> &mldr - case 4938: state = 4939; break; // &Msc -> &Mscr - case 4942: state = 4943; break; // &msc -> &mscr - case 4965: state = 5855; break; // &n -> &nr - case 4996: state = 4997; break; // &napp -> &nappr - case 5002: state = 5003; break; // &natu -> &natur - case 5021: state = 5030; break; // &nca -> &ncar - case 5025: state = 5026; break; // &Nca -> &Ncar - case 5066: state = 5067; break; // &nea -> &near - case 5067: state = 5075; break; // &near -> &nearr - case 5071: state = 5072; break; // &neA -> &neAr - case 5072: state = 5073; break; // &neAr -> &neArr - case 5122: state = 5123; break; // &NegativeVe -> &NegativeVer - case 5142: state = 5143; break; // &nesea -> &nesear - case 5152: state = 5153; break; // &NestedG -> &NestedGr - case 5157: state = 5158; break; // &NestedGreate -> &NestedGreater - case 5159: state = 5160; break; // &NestedGreaterG -> &NestedGreaterGr - case 5164: state = 5165; break; // &NestedGreaterGreate -> &NestedGreaterGreater - case 5189: state = 5190; break; // &Nf -> &Nfr - case 5192: state = 5193; break; // &nf -> &nfr - case 5221: state = 5223; break; // &ngt -> &ngtr - case 5228: state = 5229; break; // &nhA -> &nhAr - case 5229: state = 5230; break; // &nhAr -> &nhArr - case 5232: state = 5233; break; // &nha -> &nhar - case 5233: state = 5234; break; // &nhar -> &nharr - case 5237: state = 5238; break; // &nhpa -> &nhpar - case 5257: state = 5258; break; // &nlA -> &nlAr - case 5258: state = 5259; break; // &nlAr -> &nlArr - case 5261: state = 5262; break; // &nla -> &nlar - case 5262: state = 5263; break; // &nlar -> &nlarr - case 5265: state = 5266; break; // &nld -> &nldr - case 5275: state = 5290; break; // &nLeft -> &nLeftr - case 5276: state = 5277; break; // &nLefta -> &nLeftar - case 5277: state = 5278; break; // &nLeftar -> &nLeftarr - case 5283: state = 5301; break; // &nleft -> &nleftr - case 5284: state = 5285; break; // &nlefta -> &nleftar - case 5285: state = 5286; break; // &nleftar -> &nleftarr - case 5295: state = 5296; break; // &nLeftrighta -> &nLeftrightar - case 5296: state = 5297; break; // &nLeftrightar -> &nLeftrightarr - case 5306: state = 5307; break; // &nleftrighta -> &nleftrightar - case 5307: state = 5308; break; // &nleftrightar -> &nleftrightarr - case 5334: state = 5336; break; // &nlt -> &nltr - case 5348: state = 5349; break; // &NoB -> &NoBr - case 5355: state = 5356; break; // &NonB -> &NonBr - case 5383: state = 5384; break; // &NotCong -> &NotCongr - case 5403: state = 5404; break; // &NotDoubleVe -> &NotDoubleVer - case 5411: state = 5412; break; // &NotDoubleVerticalBa -> &NotDoubleVerticalBar - case 5439: state = 5440; break; // &NotG -> &NotGr - case 5444: state = 5445; break; // &NotGreate -> &NotGreater - case 5463: state = 5464; break; // &NotGreaterG -> &NotGreaterGr - case 5468: state = 5469; break; // &NotGreaterGreate -> &NotGreaterGreater - case 5532: state = 5533; break; // &NotLeftT -> &NotLeftTr - case 5542: state = 5543; break; // &NotLeftTriangleBa -> &NotLeftTriangleBar - case 5560: state = 5561; break; // &NotLessG -> &NotLessGr - case 5565: state = 5566; break; // &NotLessGreate -> &NotLessGreater - case 5596: state = 5597; break; // &NotNestedG -> &NotNestedGr - case 5601: state = 5602; break; // &NotNestedGreate -> &NotNestedGreater - case 5603: state = 5604; break; // &NotNestedGreaterG -> &NotNestedGreaterGr - case 5608: state = 5609; break; // &NotNestedGreaterGreate -> &NotNestedGreaterGreater - case 5630: state = 5631; break; // &NotP -> &NotPr - case 5659: state = 5660; break; // &NotReve -> &NotRever - case 5675: state = 5676; break; // &NotRightT -> &NotRightTr - case 5685: state = 5686; break; // &NotRightTriangleBa -> &NotRightTriangleBar - case 5697: state = 5698; break; // &NotSqua -> &NotSquar - case 5714: state = 5715; break; // &NotSquareSupe -> &NotSquareSuper - case 5769: state = 5770; break; // &NotSupe -> &NotSuper - case 5810: state = 5811; break; // &NotVe -> &NotVer - case 5818: state = 5819; break; // &NotVerticalBa -> &NotVerticalBar - case 5821: state = 5842; break; // &np -> &npr - case 5822: state = 5823; break; // &npa -> &npar - case 5856: state = 5857; break; // &nrA -> &nrAr - case 5857: state = 5858; break; // &nrAr -> &nrArr - case 5860: state = 5861; break; // &nra -> &nrar - case 5861: state = 5862; break; // &nrar -> &nrarr - case 5873: state = 5874; break; // &nRighta -> &nRightar - case 5874: state = 5875; break; // &nRightar -> &nRightarr - case 5883: state = 5884; break; // &nrighta -> &nrightar - case 5884: state = 5885; break; // &nrightar -> &nrightarr - case 5889: state = 5890; break; // &nrt -> &nrtr - case 5896: state = 5908; break; // &nsc -> &nscr - case 5905: state = 5906; break; // &Nsc -> &Nscr - case 5911: state = 5912; break; // &nsho -> &nshor - case 5919: state = 5920; break; // &nshortpa -> &nshortpar - case 5939: state = 5940; break; // &nspa -> &nspar - case 5988: state = 6006; break; // &nt -> &ntr - case 6012: state = 6021; break; // &ntriangle -> &ntriangler - case 6036: state = 6037; break; // &nume -> &numer - case 6043: state = 6097; break; // &nv -> &nvr - case 6074: state = 6075; break; // &nvHa -> &nvHar - case 6075: state = 6076; break; // &nvHar -> &nvHarr - case 6085: state = 6086; break; // &nvlA -> &nvlAr - case 6086: state = 6087; break; // &nvlAr -> &nvlArr - case 6091: state = 6093; break; // &nvlt -> &nvltr - case 6098: state = 6099; break; // &nvrA -> &nvrAr - case 6099: state = 6100; break; // &nvrAr -> &nvrArr - case 6102: state = 6103; break; // &nvrt -> &nvrtr - case 6112: state = 6113; break; // &nwa -> &nwar - case 6113: state = 6121; break; // &nwar -> &nwarr - case 6117: state = 6118; break; // &nwA -> &nwAr - case 6118: state = 6119; break; // &nwAr -> &nwArr - case 6128: state = 6129; break; // &nwnea -> &nwnear - case 6131: state = 6340; break; // &O -> &Or - case 6138: state = 6342; break; // &o -> &or - case 6149: state = 6150; break; // &oci -> &ocir - case 6153: state = 6154; break; // &Oci -> &Ocir - case 6200: state = 6208; break; // &of -> &ofr - case 6202: state = 6203; break; // &ofci -> &ofcir - case 6205: state = 6206; break; // &Of -> &Ofr - case 6210: state = 6220; break; // &og -> &ogr - case 6214: state = 6215; break; // &Og -> &Ogr - case 6229: state = 6230; break; // &ohba -> &ohbar - case 6239: state = 6240; break; // &ola -> &olar - case 6240: state = 6241; break; // &olar -> &olarr - case 6243: state = 6247; break; // &olc -> &olcr - case 6244: state = 6245; break; // &olci -> &olcir - case 6260: state = 6261; break; // &Omac -> &Omacr - case 6265: state = 6266; break; // &omac -> &omacr - case 6277: state = 6278; break; // &Omic -> &Omicr - case 6283: state = 6284; break; // &omic -> &omicr - case 6303: state = 6304; break; // &opa -> &opar - case 6310: state = 6311; break; // &OpenCu -> &OpenCur - case 6332: state = 6333; break; // &ope -> &oper - case 6344: state = 6345; break; // &ora -> &orar - case 6345: state = 6346; break; // &orar -> &orarr - case 6350: state = 6351; break; // &orde -> &order - case 6365: state = 6366; break; // &oro -> &oror - case 6379: state = 6380; break; // &Osc -> &Oscr - case 6383: state = 6384; break; // &osc -> &oscr - case 6432: state = 6433; break; // &ovba -> &ovbar - case 6436: state = 6437; break; // &Ove -> &Over - case 6438: state = 6442; break; // &OverB -> &OverBr - case 6439: state = 6440; break; // &OverBa -> &OverBar - case 6452: state = 6453; break; // &OverPa -> &OverPar - case 6463: state = 6642; break; // &p -> &pr - case 6464: state = 6465; break; // &pa -> &par - case 6482: state = 6640; break; // &P -> &Pr - case 6483: state = 6484; break; // &Pa -> &Par - case 6497: state = 6498; break; // &pe -> &per - case 6518: state = 6519; break; // &Pf -> &Pfr - case 6521: state = 6522; break; // &pf -> &pfr - case 6549: state = 6550; break; // &pitchfo -> &pitchfor - case 6571: state = 6572; break; // &plusaci -> &plusacir - case 6577: state = 6578; break; // &plusci -> &pluscir - case 6613: state = 6614; break; // &Poinca -> &Poincar - case 6659: state = 6660; break; // &precapp -> &precappr - case 6665: state = 6666; break; // &preccu -> &preccur - case 6708: state = 6709; break; // &precnapp -> &precnappr - case 6757: state = 6758; break; // &profala -> &profalar - case 6766: state = 6767; break; // &profsu -> &profsur - case 6773: state = 6774; break; // &Propo -> &Propor - case 6790: state = 6791; break; // &pru -> &prur - case 6796: state = 6797; break; // &Psc -> &Pscr - case 6800: state = 6801; break; // &psc -> &pscr - case 6814: state = 6815; break; // &Qf -> &Qfr - case 6818: state = 6819; break; // &qf -> &qfr - case 6833: state = 6834; break; // &qp -> &qpr - case 6840: state = 6841; break; // &Qsc -> &Qscr - case 6844: state = 6845; break; // &qsc -> &qscr - case 6850: state = 6851; break; // &quate -> &quater - case 6876: state = 7526; break; // &r -> &rr - case 6877: state = 6928; break; // &rA -> &rAr - case 6878: state = 6879; break; // &rAa -> &rAar - case 6879: state = 6880; break; // &rAar -> &rAarr - case 6882: state = 6931; break; // &ra -> &rar - case 6886: state = 7531; break; // &R -> &Rr - case 6887: state = 6925; break; // &Ra -> &Rar - case 6925: state = 6926; break; // &Rar -> &Rarr - case 6928: state = 6929; break; // &rAr -> &rArr - case 6931: state = 6932; break; // &rar -> &rarr - case 6987: state = 6988; break; // &RBa -> &RBar - case 6988: state = 6989; break; // &RBar -> &RBarr - case 6992: state = 6993; break; // &rBa -> &rBar - case 6993: state = 6994; break; // &rBar -> &rBarr - case 6996: state = 7005; break; // &rb -> &rbr - case 6997: state = 6998; break; // &rba -> &rbar - case 6998: state = 6999; break; // &rbar -> &rbarr - case 7001: state = 7002; break; // &rbb -> &rbbr - case 7022: state = 7023; break; // &Rca -> &Rcar - case 7028: state = 7029; break; // &rca -> &rcar - case 7060: state = 7061; break; // &rdldha -> &rdldhar - case 7065: state = 7067; break; // &rdquo -> &rdquor - case 7083: state = 7084; break; // &realpa -> &realpar - case 7098: state = 7099; break; // &Reve -> &Rever - case 7115: state = 7116; break; // &ReverseEquilib -> &ReverseEquilibr - case 7129: state = 7130; break; // &ReverseUpEquilib -> &ReverseUpEquilibr - case 7135: state = 7149; break; // &rf -> &rfr - case 7143: state = 7144; break; // &rfloo -> &rfloor - case 7146: state = 7147; break; // &Rf -> &Rfr - case 7152: state = 7153; break; // &rHa -> &rHar - case 7156: state = 7157; break; // &rha -> &rhar - case 7175: state = 7188; break; // &RightA -> &RightAr - case 7180: state = 7181; break; // &RightAngleB -> &RightAngleBr - case 7188: state = 7189; break; // &RightAr -> &RightArr - case 7193: state = 7194; break; // &Righta -> &Rightar - case 7194: state = 7195; break; // &Rightar -> &Rightarr - case 7202: state = 7314; break; // &right -> &rightr - case 7203: state = 7204; break; // &righta -> &rightar - case 7204: state = 7205; break; // &rightar -> &rightarr - case 7210: state = 7211; break; // &RightArrowBa -> &RightArrowBar - case 7217: state = 7218; break; // &RightArrowLeftA -> &RightArrowLeftAr - case 7218: state = 7219; break; // &RightArrowLeftAr -> &RightArrowLeftArr - case 7242: state = 7243; break; // &RightDoubleB -> &RightDoubleBr - case 7259: state = 7260; break; // &RightDownTeeVecto -> &RightDownTeeVector - case 7266: state = 7267; break; // &RightDownVecto -> &RightDownVector - case 7270: state = 7271; break; // &RightDownVectorBa -> &RightDownVectorBar - case 7276: state = 7277; break; // &RightFloo -> &RightFloor - case 7280: state = 7281; break; // &rightha -> &righthar - case 7298: state = 7299; break; // &rightlefta -> &rightleftar - case 7299: state = 7300; break; // &rightleftar -> &rightleftarr - case 7306: state = 7307; break; // &rightleftha -> &rightlefthar - case 7319: state = 7320; break; // &rightrighta -> &rightrightar - case 7320: state = 7321; break; // &rightrightar -> &rightrightarr - case 7331: state = 7332; break; // &rightsquiga -> &rightsquigar - case 7332: state = 7333; break; // &rightsquigar -> &rightsquigarr - case 7337: state = 7365; break; // &RightT -> &RightTr - case 7341: state = 7342; break; // &RightTeeA -> &RightTeeAr - case 7342: state = 7343; break; // &RightTeeAr -> &RightTeeArr - case 7351: state = 7352; break; // &RightTeeVecto -> &RightTeeVector - case 7355: state = 7356; break; // &rightth -> &rightthr - case 7374: state = 7375; break; // &RightTriangleBa -> &RightTriangleBar - case 7393: state = 7394; break; // &RightUpDownVecto -> &RightUpDownVector - case 7403: state = 7404; break; // &RightUpTeeVecto -> &RightUpTeeVector - case 7410: state = 7411; break; // &RightUpVecto -> &RightUpVector - case 7414: state = 7415; break; // &RightUpVectorBa -> &RightUpVectorBar - case 7421: state = 7422; break; // &RightVecto -> &RightVector - case 7425: state = 7426; break; // &RightVectorBa -> &RightVectorBar - case 7443: state = 7444; break; // &rla -> &rlar - case 7444: state = 7445; break; // &rlar -> &rlarr - case 7448: state = 7449; break; // &rlha -> &rlhar - case 7470: state = 7474; break; // &roa -> &roar - case 7474: state = 7475; break; // &roar -> &roarr - case 7477: state = 7478; break; // &rob -> &robr - case 7482: state = 7483; break; // &ropa -> &ropar - case 7513: state = 7514; break; // &rpa -> &rpar - case 7527: state = 7528; break; // &rra -> &rrar - case 7528: state = 7529; break; // &rrar -> &rrarr - case 7536: state = 7537; break; // &Rrighta -> &Rrightar - case 7537: state = 7538; break; // &Rrightar -> &Rrightarr - case 7549: state = 7550; break; // &Rsc -> &Rscr - case 7552: state = 7553; break; // &rsc -> &rscr - case 7563: state = 7565; break; // &rsquo -> &rsquor - case 7567: state = 7578; break; // &rt -> &rtr - case 7568: state = 7569; break; // &rth -> &rthr - case 7586: state = 7587; break; // &rtrilt -> &rtriltr - case 7605: state = 7606; break; // &ruluha -> &ruluhar - case 7617: state = 8068; break; // &s -> &sr - case 7633: state = 7641; break; // &sca -> &scar - case 7636: state = 7637; break; // &Sca -> &Scar - case 7662: state = 7663; break; // &Sci -> &Scir - case 7666: state = 7667; break; // &sci -> &scir - case 7704: state = 7705; break; // &sea -> &sear - case 7705: state = 7713; break; // &sear -> &searr - case 7709: state = 7710; break; // &seA -> &seAr - case 7710: state = 7711; break; // &seAr -> &seArr - case 7726: state = 7727; break; // &seswa -> &seswar - case 7741: state = 7742; break; // &Sf -> &Sfr - case 7744: state = 7745; break; // &sf -> &sfr - case 7752: state = 7753; break; // &sha -> &shar - case 7773: state = 7774; break; // &Sho -> &Shor - case 7780: state = 7781; break; // &ShortDownA -> &ShortDownAr - case 7781: state = 7782; break; // &ShortDownAr -> &ShortDownArr - case 7790: state = 7791; break; // &ShortLeftA -> &ShortLeftAr - case 7791: state = 7792; break; // &ShortLeftAr -> &ShortLeftArr - case 7796: state = 7797; break; // &sho -> &shor - case 7804: state = 7805; break; // &shortpa -> &shortpar - case 7817: state = 7818; break; // &ShortRightA -> &ShortRightAr - case 7818: state = 7819; break; // &ShortRightAr -> &ShortRightArr - case 7825: state = 7826; break; // &ShortUpA -> &ShortUpAr - case 7826: state = 7827; break; // &ShortUpAr -> &ShortUpArr - case 7847: state = 7873; break; // &sim -> &simr - case 7874: state = 7875; break; // &simra -> &simrar - case 7875: state = 7876; break; // &simrar -> &simrarr - case 7879: state = 7880; break; // &sla -> &slar - case 7880: state = 7881; break; // &slar -> &slarr - case 7888: state = 7889; break; // &SmallCi -> &SmallCir - case 7913: state = 7914; break; // &smepa -> &smepar - case 7946: state = 7947; break; // &solba -> &solbar - case 7957: state = 7966; break; // &spa -> &spar - case 7980: state = 7981; break; // &Sq -> &Sqr - case 8011: state = 8012; break; // &Squa -> &Squar - case 8015: state = 8016; break; // &squa -> &squar - case 8022: state = 8023; break; // &SquareInte -> &SquareInter - case 8046: state = 8047; break; // &SquareSupe -> &SquareSuper - case 8069: state = 8070; break; // &sra -> &srar - case 8070: state = 8071; break; // &srar -> &srarr - case 8074: state = 8075; break; // &Ssc -> &Sscr - case 8078: state = 8079; break; // &ssc -> &sscr - case 8092: state = 8093; break; // &ssta -> &sstar - case 8097: state = 8098; break; // &Sta -> &Star - case 8100: state = 8106; break; // &st -> &str - case 8101: state = 8102; break; // &sta -> &star - case 8131: state = 8160; break; // &sub -> &subr - case 8161: state = 8162; break; // &subra -> &subrar - case 8162: state = 8163; break; // &subrar -> &subrarr - case 8203: state = 8204; break; // &succapp -> &succappr - case 8209: state = 8210; break; // &succcu -> &succcur - case 8252: state = 8253; break; // &succnapp -> &succnappr - case 8308: state = 8309; break; // &Supe -> &Super - case 8329: state = 8330; break; // &supla -> &suplar - case 8330: state = 8331; break; // &suplar -> &suplarr - case 8376: state = 8377; break; // &swa -> &swar - case 8377: state = 8385; break; // &swar -> &swarr - case 8381: state = 8382; break; // &swA -> &swAr - case 8382: state = 8383; break; // &swAr -> &swArr - case 8392: state = 8393; break; // &swnwa -> &swnwar - case 8400: state = 8676; break; // &T -> &Tr - case 8404: state = 8628; break; // &t -> &tr - case 8405: state = 8406; break; // &ta -> &tar - case 8415: state = 8416; break; // &tb -> &tbr - case 8420: state = 8421; break; // &Tca -> &Tcar - case 8426: state = 8427; break; // &tca -> &tcar - case 8450: state = 8451; break; // &tel -> &telr - case 8455: state = 8456; break; // &Tf -> &Tfr - case 8458: state = 8459; break; // &tf -> &tfr - case 8462: state = 8463; break; // &the -> &ther - case 8468: state = 8469; break; // &The -> &Ther - case 8472: state = 8473; break; // &Therefo -> &Therefor - case 8477: state = 8478; break; // &therefo -> &therefor - case 8498: state = 8499; break; // &thickapp -> &thickappr - case 8540: state = 8541; break; // &tho -> &thor - case 8582: state = 8583; break; // ×ba -> ×bar - case 8601: state = 8602; break; // &topci -> &topcir - case 8610: state = 8611; break; // &topfo -> &topfor - case 8617: state = 8618; break; // &tp -> &tpr - case 8638: state = 8655; break; // &triangle -> &triangler - case 8706: state = 8707; break; // &Tsc -> &Tscr - case 8710: state = 8711; break; // &tsc -> &tscr - case 8727: state = 8728; break; // &Tst -> &Tstr - case 8732: state = 8733; break; // &tst -> &tstr - case 8746: state = 8757; break; // &twohead -> &twoheadr - case 8751: state = 8752; break; // &twoheadlefta -> &twoheadleftar - case 8752: state = 8753; break; // &twoheadleftar -> &twoheadleftarr - case 8762: state = 8763; break; // &twoheadrighta -> &twoheadrightar - case 8763: state = 8764; break; // &twoheadrightar -> &twoheadrightarr - case 8768: state = 9140; break; // &U -> &Ur - case 8769: state = 8782; break; // &Ua -> &Uar - case 8775: state = 9127; break; // &u -> &ur - case 8776: state = 8789; break; // &ua -> &uar - case 8782: state = 8783; break; // &Uar -> &Uarr - case 8785: state = 8786; break; // &uA -> &uAr - case 8786: state = 8787; break; // &uAr -> &uArr - case 8789: state = 8790; break; // &uar -> &uarr - case 8794: state = 8795; break; // &Uarroci -> &Uarrocir - case 8797: state = 8798; break; // &Ub -> &Ubr - case 8802: state = 8803; break; // &ub -> &ubr - case 8816: state = 8817; break; // &Uci -> &Ucir - case 8821: state = 8822; break; // &uci -> &ucir - case 8830: state = 8831; break; // &uda -> &udar - case 8831: state = 8832; break; // &udar -> &udarr - case 8846: state = 8847; break; // &udha -> &udhar - case 8849: state = 8858; break; // &uf -> &ufr - case 8855: state = 8856; break; // &Uf -> &Ufr - case 8860: state = 8861; break; // &Ug -> &Ugr - case 8866: state = 8867; break; // &ug -> &ugr - case 8873: state = 8874; break; // &uHa -> &uHar - case 8877: state = 8878; break; // &uha -> &uhar - case 8878: state = 8881; break; // &uhar -> &uharr - case 8888: state = 8896; break; // &ulc -> &ulcr - case 8889: state = 8890; break; // &ulco -> &ulcor - case 8893: state = 8894; break; // &ulcorne -> &ulcorner - case 8900: state = 8901; break; // &ult -> &ultr - case 8906: state = 8907; break; // &Umac -> &Umacr - case 8911: state = 8912; break; // &umac -> &umacr - case 8918: state = 8919; break; // &Unde -> &Under - case 8920: state = 8924; break; // &UnderB -> &UnderBr - case 8921: state = 8922; break; // &UnderBa -> &UnderBar - case 8934: state = 8935; break; // &UnderPa -> &UnderPar - case 8971: state = 8972; break; // &UpA -> &UpAr - case 8972: state = 8973; break; // &UpAr -> &UpArr - case 8977: state = 8978; break; // &Upa -> &Upar - case 8978: state = 8979; break; // &Upar -> &Uparr - case 8984: state = 8985; break; // &upa -> &upar - case 8985: state = 8986; break; // &upar -> &uparr - case 8991: state = 8992; break; // &UpArrowBa -> &UpArrowBar - case 8998: state = 8999; break; // &UpArrowDownA -> &UpArrowDownAr - case 8999: state = 9000; break; // &UpArrowDownAr -> &UpArrowDownArr - case 9008: state = 9009; break; // &UpDownA -> &UpDownAr - case 9009: state = 9010; break; // &UpDownAr -> &UpDownArr - case 9018: state = 9019; break; // &Updowna -> &Updownar - case 9019: state = 9020; break; // &Updownar -> &Updownarr - case 9028: state = 9029; break; // &updowna -> &updownar - case 9029: state = 9030; break; // &updownar -> &updownarr - case 9040: state = 9041; break; // &UpEquilib -> &UpEquilibr - case 9047: state = 9048; break; // &upha -> &uphar - case 9052: state = 9058; break; // &upharpoon -> &upharpoonr - case 9069: state = 9070; break; // &Uppe -> &Upper - case 9075: state = 9076; break; // &UpperLeftA -> &UpperLeftAr - case 9076: state = 9077; break; // &UpperLeftAr -> &UpperLeftArr - case 9086: state = 9087; break; // &UpperRightA -> &UpperRightAr - case 9087: state = 9088; break; // &UpperRightAr -> &UpperRightArr - case 9112: state = 9113; break; // &UpTeeA -> &UpTeeAr - case 9113: state = 9114; break; // &UpTeeAr -> &UpTeeArr - case 9120: state = 9121; break; // &upupa -> &upupar - case 9121: state = 9122; break; // &upupar -> &upuparr - case 9128: state = 9136; break; // &urc -> &urcr - case 9129: state = 9130; break; // &urco -> &urcor - case 9133: state = 9134; break; // &urcorne -> &urcorner - case 9149: state = 9150; break; // &urt -> &urtr - case 9154: state = 9155; break; // &Usc -> &Uscr - case 9158: state = 9159; break; // &usc -> &uscr - case 9161: state = 9177; break; // &ut -> &utr - case 9183: state = 9184; break; // &uua -> &uuar - case 9184: state = 9185; break; // &uuar -> &uuarr - case 9201: state = 9445; break; // &v -> &vr - case 9202: state = 9208; break; // &va -> &var - case 9204: state = 9205; break; // &vang -> &vangr - case 9208: state = 9247; break; // &var -> &varr - case 9231: state = 9237; break; // &varp -> &varpr - case 9243: state = 9244; break; // &vA -> &vAr - case 9244: state = 9245; break; // &vAr -> &vArr - case 9279: state = 9285; break; // &vart -> &vartr - case 9291: state = 9297; break; // &vartriangle -> &vartriangler - case 9305: state = 9306; break; // &Vba -> &Vbar - case 9309: state = 9310; break; // &vBa -> &vBar - case 9342: state = 9360; break; // &Ve -> &Ver - case 9345: state = 9365; break; // &ve -> &ver - case 9349: state = 9350; break; // &veeba -> &veebar - case 9362: state = 9363; break; // &Verba -> &Verbar - case 9367: state = 9368; break; // &verba -> &verbar - case 9379: state = 9380; break; // &VerticalBa -> &VerticalBar - case 9390: state = 9391; break; // &VerticalSepa -> &VerticalSepar - case 9394: state = 9395; break; // &VerticalSeparato -> &VerticalSeparator - case 9414: state = 9415; break; // &Vf -> &Vfr - case 9417: state = 9418; break; // &vf -> &vfr - case 9421: state = 9422; break; // &vlt -> &vltr - case 9440: state = 9441; break; // &vp -> &vpr - case 9446: state = 9447; break; // &vrt -> &vrtr - case 9451: state = 9452; break; // &Vsc -> &Vscr - case 9455: state = 9456; break; // &vsc -> &vscr - case 9486: state = 9487; break; // &Wci -> &Wcir - case 9490: state = 9533; break; // &w -> &wr - case 9492: state = 9493; break; // &wci -> &wcir - case 9499: state = 9500; break; // &wedba -> &wedbar - case 9513: state = 9514; break; // &weie -> &weier - case 9517: state = 9518; break; // &Wf -> &Wfr - case 9520: state = 9521; break; // &wf -> &wfr - case 9541: state = 9542; break; // &Wsc -> &Wscr - case 9545: state = 9546; break; // &wsc -> &wscr - case 9548: state = 9623; break; // &x -> &xr - case 9553: state = 9554; break; // &xci -> &xcir - case 9561: state = 9562; break; // &xdt -> &xdtr - case 9566: state = 9567; break; // &Xf -> &Xfr - case 9569: state = 9570; break; // &xf -> &xfr - case 9573: state = 9574; break; // &xhA -> &xhAr - case 9574: state = 9575; break; // &xhAr -> &xhArr - case 9577: state = 9578; break; // &xha -> &xhar - case 9578: state = 9579; break; // &xhar -> &xharr - case 9586: state = 9587; break; // &xlA -> &xlAr - case 9587: state = 9588; break; // &xlAr -> &xlArr - case 9590: state = 9591; break; // &xla -> &xlar - case 9591: state = 9592; break; // &xlar -> &xlarr - case 9624: state = 9625; break; // &xrA -> &xrAr - case 9625: state = 9626; break; // &xrAr -> &xrArr - case 9628: state = 9629; break; // &xra -> &xrar - case 9629: state = 9630; break; // &xrar -> &xrarr - case 9633: state = 9634; break; // &Xsc -> &Xscr - case 9637: state = 9638; break; // &xsc -> &xscr - case 9651: state = 9652; break; // &xut -> &xutr - case 9686: state = 9687; break; // &Yci -> &Ycir - case 9691: state = 9692; break; // &yci -> &ycir - case 9702: state = 9703; break; // &Yf -> &Yfr - case 9705: state = 9706; break; // &yf -> &yfr - case 9725: state = 9726; break; // &Ysc -> &Yscr - case 9729: state = 9730; break; // &ysc -> &yscr - case 9762: state = 9763; break; // &Zca -> &Zcar - case 9768: state = 9769; break; // &zca -> &zcar - case 9787: state = 9788; break; // &zeet -> &zeetr - case 9791: state = 9792; break; // &Ze -> &Zer - case 9811: state = 9812; break; // &Zf -> &Zfr - case 9814: state = 9815; break; // &zf -> &zfr - case 9826: state = 9827; break; // &zig -> &zigr - case 9828: state = 9829; break; // &zigra -> &zigrar - case 9829: state = 9830; break; // &zigrar -> &zigrarr - case 9841: state = 9842; break; // &Zsc -> &Zscr - case 9845: state = 9846; break; // &zsc -> &zscr - default: return false; - } - break; - case 's': - switch (state) { - case 0: state = 7617; break; // & -> &s - case 1: state = 247; break; // &A -> &As - case 8: state = 251; break; // &a -> &as - case 81: state = 82; break; // &alef -> &alefs - case 120: state = 128; break; // &and -> &ands - case 136: state = 172; break; // &ang -> &angs - case 143: state = 144; break; // &angm -> &angms - case 213: state = 214; break; // &apo -> &apos - case 247: state = 255; break; // &As -> &Ass - case 301: state = 744; break; // &b -> &bs - case 304: state = 324; break; // &back -> &backs - case 311: state = 312; break; // &backep -> &backeps - case 331: state = 740; break; // &B -> &Bs - case 334: state = 335; break; // &Back -> &Backs - case 337: state = 338; break; // &Backsla -> &Backslas - case 387: state = 388; break; // &becau -> &becaus - case 393: state = 394; break; // &Becau -> &Becaus - case 405: state = 406; break; // &bep -> &beps - case 420: state = 421; break; // &Bernoulli -> &Bernoullis - case 443: state = 471; break; // &big -> &bigs - case 462: state = 463; break; // &bigoplu -> &bigoplus - case 468: state = 469; break; // &bigotime -> &bigotimes - case 500: state = 501; break; // &biguplu -> &biguplus - case 522: state = 531; break; // &black -> &blacks - case 659: state = 660; break; // &boxminu -> &boxminus - case 664: state = 665; break; // &boxplu -> &boxplus - case 670: state = 671; break; // &boxtime -> &boxtimes - case 762: state = 763; break; // &bsolh -> &bsolhs - case 789: state = 1270; break; // &C -> &Cs - case 796: state = 1274; break; // &c -> &cs - case 805: state = 846; break; // &cap -> &caps - case 858: state = 859; break; // &Cayley -> &Cayleys - case 863: state = 864; break; // &ccap -> &ccaps - case 901: state = 902; break; // &ccup -> &ccups - case 902: state = 904; break; // &ccups -> &ccupss - case 979: state = 1063; break; // &cir -> &cirs - case 1005: state = 1006; break; // &circleda -> &circledas - case 1015: state = 1016; break; // &circledda -> &circleddas - case 1035: state = 1036; break; // &CircleMinu -> &CircleMinus - case 1040: state = 1041; break; // &CirclePlu -> &CirclePlus - case 1046: state = 1047; break; // &CircleTime -> &CircleTimes - case 1069: state = 1092; break; // &Clo -> &Clos - case 1073: state = 1074; break; // &Clockwi -> &Clockwis - case 1119: state = 1120; break; // &club -> &clubs - case 1161: state = 1162; break; // &complexe -> &complexes - case 1221: state = 1223; break; // © -> ©s - case 1237: state = 1238; break; // &CounterClockwi -> &CounterClockwis - case 1262: state = 1263; break; // &Cro -> &Cros - case 1263: state = 1264; break; // &Cros -> &Cross - case 1266: state = 1267; break; // &cro -> &cros - case 1267: state = 1268; break; // &cros -> &cross - case 1301: state = 1305; break; // &cue -> &cues - case 1318: state = 1344; break; // &cup -> &cups - case 1356: state = 1362; break; // &curlyeq -> &curlyeqs - case 1425: state = 2040; break; // &D -> &Ds - case 1426: state = 1457; break; // &Da -> &Das - case 1432: state = 2044; break; // &d -> &ds - case 1433: state = 1454; break; // &da -> &das - case 1511: state = 1512; break; // &ddot -> &ddots - case 1536: state = 1537; break; // &dfi -> &dfis - case 1599: state = 1639; break; // &di -> &dis - case 1601: state = 1617; break; // &diam -> &diams - case 1610: state = 1612; break; // &diamond -> &diamonds - case 1654: state = 1655; break; // ÷ontime -> ÷ontimes - case 1694: state = 1724; break; // &dot -> &dots - case 1716: state = 1717; break; // &dotminu -> &dotminus - case 1721: state = 1722; break; // &dotplu -> &dotplus - case 1929: state = 1930; break; // &downdownarrow -> &downdownarrows - case 2108: state = 2418; break; // &E -> &Es - case 2115: state = 2422; break; // &e -> &es - case 2116: state = 2122; break; // &ea -> &eas - case 2185: state = 2198; break; // &eg -> &egs - case 2204: state = 2222; break; // &el -> &els - case 2217: state = 2218; break; // &elinter -> &elinters - case 2233: state = 2279; break; // &em -> &ems - case 2240: state = 2242; break; // &empty -> &emptys - case 2290: state = 2293; break; // &en -> &ens - case 2312: state = 2323; break; // &ep -> &eps - case 2314: state = 2316; break; // &epar -> &epars - case 2320: state = 2321; break; // &eplu -> &eplus - case 2326: state = 2327; break; // &Ep -> &Eps - case 2339: state = 2350; break; // &eq -> &eqs - case 2363: state = 2364; break; // &eqslantle -> &eqslantles - case 2364: state = 2365; break; // &eqslantles -> &eqslantless - case 2374: state = 2375; break; // &equal -> &equals - case 2383: state = 2384; break; // &eque -> &eques - case 2405: state = 2406; break; // &eqvpar -> &eqvpars - case 2462: state = 2463; break; // &exi -> &exis - case 2467: state = 2468; break; // &Exi -> &Exis - case 2469: state = 2470; break; // &Exist -> &Exists - case 2503: state = 2697; break; // &f -> &fs - case 2512: state = 2513; break; // &fallingdot -> &fallingdots - case 2517: state = 2693; break; // &F -> &Fs - case 2601: state = 2602; break; // &fltn -> &fltns - case 2648: state = 2686; break; // &fra -> &fras - case 2701: state = 2927; break; // &g -> &gs - case 2708: state = 2923; break; // &G -> &Gs - case 2765: state = 2781; break; // &ge -> &ges - case 2771: state = 2775; break; // &geq -> &geqs - case 2796: state = 2797; break; // &gesle -> &gesles - case 2832: state = 2849; break; // &gn -> &gns - case 2879: state = 2880; break; // &GreaterEqualLe -> &GreaterEqualLes - case 2880: state = 2881; break; // &GreaterEqualLes -> &GreaterEqualLess - case 2902: state = 2903; break; // &GreaterLe -> &GreaterLes - case 2903: state = 2904; break; // &GreaterLes -> &GreaterLess - case 2961: state = 2962; break; // >que -> >ques - case 2965: state = 2998; break; // >r -> >rs - case 2983: state = 2984; break; // >reqle -> >reqles - case 2984: state = 2985; break; // >reqles -> >reqless - case 2989: state = 2990; break; // >reqqle -> >reqqles - case 2990: state = 2991; break; // >reqqles -> >reqqless - case 2994: state = 2995; break; // >rle -> >rles - case 2995: state = 2996; break; // >rles -> >rless - case 3014: state = 3184; break; // &H -> &Hs - case 3020: state = 3188; break; // &h -> &hs - case 3023: state = 3024; break; // &hair -> &hairs - case 3077: state = 3078; break; // &heart -> &hearts - case 3112: state = 3113; break; // &hk -> &hks - case 3193: state = 3194; break; // &hsla -> &hslas - case 3236: state = 3503; break; // &I -> &Is - case 3243: state = 3507; break; // &i -> &is - case 3375: state = 3376; break; // &Implie -> &Implies - case 3410: state = 3411; break; // &integer -> &integers - case 3424: state = 3425; break; // &Inter -> &Inters - case 3445: state = 3446; break; // &Invi -> &Invis - case 3460: state = 3461; break; // &InvisibleTime -> &InvisibleTimes - case 3499: state = 3500; break; // &ique -> &iques - case 3512: state = 3520; break; // &isin -> &isins - case 3555: state = 3590; break; // &J -> &Js - case 3561: state = 3594; break; // &j -> &js - case 3618: state = 3684; break; // &K -> &Ks - case 3624: state = 3688; break; // &k -> &ks - case 3692: state = 4652; break; // &l -> &ls - case 3698: state = 4658; break; // &L -> &Ls - case 3766: state = 3785; break; // &larr -> &larrs - case 3770: state = 3771; break; // &larrbf -> &larrbfs - case 3773: state = 3774; break; // &larrf -> &larrfs - case 3803: state = 3805; break; // &late -> &lates - case 3828: state = 3831; break; // &lbrk -> &lbrks - case 3869: state = 3891; break; // &ld -> &lds - case 3885: state = 3886; break; // &ldru -> &ldrus - case 3896: state = 4197; break; // &le -> &les - case 3898: state = 4238; break; // &Le -> &Les - case 4027: state = 4028; break; // &leftleftarrow -> &leftleftarrows - case 4056: state = 4074; break; // &leftright -> &leftrights - case 4061: state = 4063; break; // &leftrightarrow -> &leftrightarrows - case 4071: state = 4072; break; // &leftrightharpoon -> &leftrightharpoons - case 4117: state = 4118; break; // &leftthreetime -> &leftthreetimes - case 4187: state = 4191; break; // &leq -> &leqs - case 4197: state = 4215; break; // &les -> &less - case 4212: state = 4213; break; // &lesge -> &lesges - case 4215: state = 4280; break; // &less -> &lesss - case 4238: state = 4239; break; // &Les -> &Less - case 4276: state = 4277; break; // &LessLe -> &LessLes - case 4277: state = 4278; break; // &LessLes -> &LessLess - case 4302: state = 4303; break; // &lfi -> &lfis - case 4392: state = 4393; break; // &lmou -> &lmous - case 4401: state = 4418; break; // &ln -> &lns - case 4504: state = 4505; break; // &longmap -> &longmaps - case 4570: state = 4571; break; // &loplu -> &loplus - case 4576: state = 4577; break; // &lotime -> &lotimes - case 4580: state = 4581; break; // &lowa -> &lowas - case 4717: state = 4718; break; // <ime -> <imes - case 4727: state = 4728; break; // <que -> <ques - case 4744: state = 4745; break; // &lurd -> &lurds - case 4767: state = 4941; break; // &m -> &ms - case 4777: state = 4778; break; // &malte -> &maltes - case 4781: state = 4937; break; // &M -> &Ms - case 4785: state = 4787; break; // &map -> &maps - case 4821: state = 4822; break; // &mda -> &mdas - case 4831: state = 4832; break; // &mea -> &meas - case 4878: state = 4879; break; // &mida -> &midas - case 4891: state = 4892; break; // &minu -> &minus - case 4902: state = 4903; break; // &Minu -> &Minus - case 4906: state = 4907; break; // &MinusPlu -> &MinusPlus - case 4919: state = 4920; break; // &mnplu -> &mnplus - case 4925: state = 4926; break; // &model -> &models - case 4947: state = 4948; break; // &mstpo -> &mstpos - case 4965: state = 5895; break; // &n -> &ns - case 4971: state = 5904; break; // &N -> &Ns - case 4993: state = 4994; break; // &napo -> &napos - case 5006: state = 5008; break; // &natural -> &naturals - case 5010: state = 5011; break; // &nb -> &nbs - case 5060: state = 5061; break; // &nda -> &ndas - case 5064: state = 5140; break; // &ne -> &nes - case 5084: state = 5148; break; // &Ne -> &Nes - case 5168: state = 5169; break; // &NestedLe -> &NestedLes - case 5169: state = 5170; break; // &NestedLes -> &NestedLess - case 5172: state = 5173; break; // &NestedLessLe -> &NestedLessLes - case 5173: state = 5174; break; // &NestedLessLes -> &NestedLessLess - case 5183: state = 5184; break; // &nexi -> &nexis - case 5185: state = 5187; break; // &nexist -> &nexists - case 5195: state = 5215; break; // &ng -> &ngs - case 5198: state = 5210; break; // &nge -> &nges - case 5200: state = 5204; break; // &ngeq -> &ngeqs - case 5240: state = 5242; break; // &ni -> &nis - case 5256: state = 5328; break; // &nl -> &nls - case 5270: state = 5322; break; // &nle -> &nles - case 5312: state = 5316; break; // &nleq -> &nleqs - case 5322: state = 5324; break; // &nles -> &nless - case 5434: state = 5435; break; // &NotExi -> &NotExis - case 5436: state = 5437; break; // &NotExist -> &NotExists - case 5472: state = 5473; break; // &NotGreaterLe -> &NotGreaterLes - case 5473: state = 5474; break; // &NotGreaterLes -> &NotGreaterLess - case 5529: state = 5551; break; // &NotLe -> &NotLes - case 5551: state = 5552; break; // &NotLes -> &NotLess - case 5569: state = 5570; break; // &NotLessLe -> &NotLessLes - case 5570: state = 5571; break; // &NotLessLes -> &NotLessLess - case 5591: state = 5592; break; // &NotNe -> &NotNes - case 5612: state = 5613; break; // &NotNestedLe -> &NotNestedLes - case 5613: state = 5614; break; // &NotNestedLes -> &NotNestedLess - case 5616: state = 5617; break; // &NotNestedLessLe -> &NotNestedLessLes - case 5617: state = 5618; break; // &NotNestedLessLes -> &NotNestedLessLess - case 5636: state = 5637; break; // &NotPrecede -> &NotPrecedes - case 5660: state = 5661; break; // &NotRever -> &NotRevers - case 5702: state = 5703; break; // &NotSquareSub -> &NotSquareSubs - case 5715: state = 5716; break; // &NotSquareSuper -> &NotSquareSupers - case 5727: state = 5728; break; // &NotSub -> &NotSubs - case 5742: state = 5743; break; // &NotSucceed -> &NotSucceeds - case 5770: state = 5771; break; // &NotSuper -> &NotSupers - case 5823: state = 5831; break; // &npar -> &npars - case 5942: state = 5943; break; // &nsq -> &nsqs - case 5952: state = 5958; break; // &nsub -> &nsubs - case 5973: state = 5979; break; // &nsup -> &nsups - case 6034: state = 6040; break; // &num -> &nums - case 6043: state = 6107; break; // &nv -> &nvs - case 6049: state = 6050; break; // &nVDa -> &nVDas - case 6054: state = 6055; break; // &nVda -> &nVdas - case 6059: state = 6060; break; // &nvDa -> &nvDas - case 6064: state = 6065; break; // &nvda -> &nvdas - case 6131: state = 6378; break; // &O -> &Os - case 6138: state = 6382; break; // &o -> &os - case 6139: state = 6145; break; // &oa -> &oas - case 6163: state = 6185; break; // &od -> &ods - case 6164: state = 6165; break; // &oda -> &odas - case 6248: state = 6249; break; // &olcro -> &olcros - case 6249: state = 6250; break; // &olcros -> &olcross - case 6291: state = 6292; break; // &ominu -> &ominus - case 6337: state = 6338; break; // &oplu -> &oplus - case 6342: state = 6368; break; // &or -> &ors - case 6387: state = 6388; break; // &Osla -> &Oslas - case 6392: state = 6393; break; // &osla -> &oslas - case 6412: state = 6413; break; // &Otime -> &Otimes - case 6416: state = 6417; break; // &otime -> &otimes - case 6419: state = 6420; break; // &otimesa -> &otimesas - case 6458: state = 6459; break; // &OverParenthe -> &OverParenthes - case 6460: state = 6461; break; // &OverParenthesi -> &OverParenthesis - case 6463: state = 6799; break; // &p -> &ps - case 6465: state = 6474; break; // &par -> &pars - case 6482: state = 6795; break; // &P -> &Ps - case 6566: state = 6567; break; // &plu -> &plus - case 6567: state = 6599; break; // &plus -> &pluss - case 6588: state = 6589; break; // &Plu -> &Plus - case 6593: state = 6594; break; // &PlusMinu -> &PlusMinus - case 6642: state = 6786; break; // &pr -> &prs - case 6655: state = 6721; break; // &prec -> &precs - case 6676: state = 6677; break; // &Precede -> &Precedes - case 6705: state = 6717; break; // &precn -> &precns - case 6731: state = 6733; break; // &prime -> &primes - case 6735: state = 6741; break; // &prn -> &prns - case 6754: state = 6765; break; // &prof -> &profs - case 6809: state = 6810; break; // &punc -> &puncs - case 6813: state = 6839; break; // &Q -> &Qs - case 6817: state = 6843; break; // &q -> &qs - case 6855: state = 6856; break; // &quaternion -> &quaternions - case 6862: state = 6863; break; // &que -> &ques - case 6876: state = 7542; break; // &r -> &rs - case 6886: state = 7548; break; // &R -> &Rs - case 6932: state = 6956; break; // &rarr -> &rarrs - case 6939: state = 6940; break; // &rarrbf -> &rarrbfs - case 6944: state = 6945; break; // &rarrf -> &rarrfs - case 6983: state = 6984; break; // &rational -> &rationals - case 7012: state = 7015; break; // &rbrk -> &rbrks - case 7053: state = 7069; break; // &rd -> &rds - case 7076: state = 7087; break; // &real -> &reals - case 7099: state = 7100; break; // &Rever -> &Revers - case 7136: state = 7137; break; // &rfi -> &rfis - case 7199: state = 7431; break; // &ri -> &ris - case 7202: state = 7326; break; // &right -> &rights - case 7302: state = 7303; break; // &rightleftarrow -> &rightleftarrows - case 7311: state = 7312; break; // &rightleftharpoon -> &rightleftharpoons - case 7323: state = 7324; break; // &rightrightarrow -> &rightrightarrows - case 7362: state = 7363; break; // &rightthreetime -> &rightthreetimes - case 7437: state = 7438; break; // &risingdot -> &risingdots - case 7455: state = 7456; break; // &rmou -> &rmous - case 7492: state = 7493; break; // &roplu -> &roplus - case 7498: state = 7499; break; // &rotime -> &rotimes - case 7509: state = 7510; break; // &RoundImplie -> &RoundImplies - case 7575: state = 7576; break; // &rtime -> &rtimes - case 7610: state = 8073; break; // &S -> &Ss - case 7617: state = 8077; break; // &s -> &ss - case 7631: state = 7687; break; // &sc -> &scs - case 7670: state = 7676; break; // &scn -> &scns - case 7703: state = 7724; break; // &se -> &ses - case 7733: state = 7734; break; // &setminu -> &setminus - case 7870: state = 7871; break; // &simplu -> &simplus - case 7895: state = 7907; break; // &sma -> &smas - case 7897: state = 7898; break; // &small -> &smalls - case 7904: state = 7905; break; // &smallsetminu -> &smallsetminus - case 7914: state = 7915; break; // &smepar -> &smepars - case 7926: state = 7928; break; // &smte -> &smtes - case 7959: state = 7960; break; // &spade -> &spades - case 7968: state = 7984; break; // &sq -> &sqs - case 7971: state = 7973; break; // &sqcap -> &sqcaps - case 7976: state = 7978; break; // &sqcup -> &sqcups - case 7986: state = 7990; break; // &sqsub -> &sqsubs - case 7997: state = 8001; break; // &sqsup -> &sqsups - case 8023: state = 8024; break; // &SquareInter -> &SquareInters - case 8034: state = 8035; break; // &SquareSub -> &SquareSubs - case 8047: state = 8048; break; // &SquareSuper -> &SquareSupers - case 8113: state = 8114; break; // &straightep -> &straighteps - case 8124: state = 8125; break; // &strn -> &strns - case 8128: state = 8165; break; // &Sub -> &Subs - case 8131: state = 8169; break; // &sub -> &subs - case 8157: state = 8158; break; // &subplu -> &subplus - case 8199: state = 8265; break; // &succ -> &succs - case 8220: state = 8221; break; // &Succeed -> &Succeeds - case 8249: state = 8261; break; // &succn -> &succns - case 8282: state = 8348; break; // &Sup -> &Sups - case 8284: state = 8352; break; // &sup -> &sups - case 8292: state = 8296; break; // &supd -> &supds - case 8309: state = 8310; break; // &Super -> &Supers - case 8320: state = 8321; break; // &suph -> &suphs - case 8345: state = 8346; break; // &supplu -> &supplus - case 8400: state = 8705; break; // &T -> &Ts - case 8404: state = 8709; break; // &t -> &ts - case 8485: state = 8487; break; // &theta -> &thetas - case 8495: state = 8503; break; // &thick -> &thicks - case 8516: state = 8517; break; // &thin -> &thins - case 8527: state = 8531; break; // &thk -> &thks - case 8577: state = 8578; break; // &time -> × - case 8590: state = 8614; break; // &to -> &tos - case 8633: state = 8690; break; // &tri -> &tris - case 8673: state = 8674; break; // &triminu -> &triminus - case 8687: state = 8688; break; // &triplu -> &triplus - case 8768: state = 9153; break; // &U -> &Us - case 8775: state = 9157; break; // &u -> &us - case 8850: state = 8851; break; // &ufi -> &ufis - case 8940: state = 8941; break; // &UnderParenthe -> &UnderParenthes - case 8942: state = 8943; break; // &UnderParenthesi -> &UnderParenthesis - case 8951: state = 8952; break; // &UnionPlu -> &UnionPlus - case 8970: state = 9092; break; // &Up -> &Ups - case 8983: state = 9095; break; // &up -> &ups - case 9065: state = 9066; break; // &uplu -> &uplus - case 9124: state = 9125; break; // &upuparrow -> &upuparrows - case 9201: state = 9454; break; // &v -> &vs - case 9208: state = 9252; break; // &var -> &vars - case 9210: state = 9211; break; // &varep -> &vareps - case 9259: state = 9260; break; // &varsub -> &varsubs - case 9269: state = 9270; break; // &varsup -> &varsups - case 9303: state = 9450; break; // &V -> &Vs - case 9321: state = 9322; break; // &VDa -> &VDas - case 9326: state = 9327; break; // &Vda -> &Vdas - case 9331: state = 9332; break; // &vDa -> &vDas - case 9336: state = 9337; break; // &vda -> &vdas - case 9425: state = 9426; break; // &vn -> &vns - case 9473: state = 9474; break; // &Vvda -> &Vvdas - case 9484: state = 9540; break; // &W -> &Ws - case 9490: state = 9544; break; // &w -> &ws - case 9548: state = 9636; break; // &x -> &xs - case 9565: state = 9632; break; // &X -> &Xs - case 9599: state = 9600; break; // &xni -> &xnis - case 9615: state = 9616; break; // &xoplu -> &xoplus - case 9648: state = 9649; break; // &xuplu -> &xuplus - case 9665: state = 9724; break; // &Y -> &Ys - case 9672: state = 9728; break; // &y -> &ys - case 9747: state = 9840; break; // &Z -> &Zs - case 9754: state = 9844; break; // &z -> &zs - default: return false; - } - break; - case 't': - switch (state) { - case 0: state = 8404; break; // & -> &t - case 1: state = 269; break; // &A -> &At - case 4: state = 5; break; // &Aacu -> &Aacut - case 8: state = 275; break; // &a -> &at - case 11: state = 12; break; // &aacu -> &aacut - case 42: state = 43; break; // &acu -> &acut - case 164: state = 165; break; // &angr -> &angrt - case 172: state = 176; break; // &angs -> &angst - case 223: state = 224; break; // &ApplyFunc -> &ApplyFunct - case 251: state = 260; break; // &as -> &ast - case 294: state = 295; break; // &awconin -> &awconint - case 298: state = 299; break; // &awin -> &awint - case 362: state = 364; break; // &bbrk -> &bbrkt - case 384: state = 426; break; // &be -> &bet - case 390: state = 423; break; // &Be -> &Bet - case 400: state = 401; break; // &bemp -> &bempt - case 443: state = 481; break; // &big -> &bigt - case 455: state = 465; break; // &bigo -> &bigot - case 457: state = 458; break; // &bigodo -> &bigodot - case 471: state = 477; break; // &bigs -> &bigst - case 522: state = 538; break; // &black -> &blackt - case 554: state = 555; break; // &blacktrianglelef -> &blacktriangleleft - case 560: state = 561; break; // &blacktrianglerigh -> &blacktriangleright - case 588: state = 589; break; // &bNo -> &bNot - case 591: state = 592; break; // &bno -> &bnot - case 598: state = 602; break; // &bo -> &bot - case 602: state = 604; break; // &bot -> &bott - case 608: state = 609; break; // &bow -> &bowt - case 613: state = 667; break; // &box -> &boxt - case 771: state = 772; break; // &bulle -> &bullet - case 792: state = 793; break; // &Cacu -> &Cacut - case 796: state = 1287; break; // &c -> &ct - case 799: state = 800; break; // &cacu -> &cacut - case 825: state = 826; break; // &capdo -> &capdot - case 828: state = 829; break; // &Capi -> &Capit - case 839: state = 840; break; // &CapitalDifferen -> &CapitalDifferent - case 849: state = 850; break; // &care -> &caret - case 897: state = 898; break; // &Cconin -> &Cconint - case 908: state = 909; break; // &Cdo -> &Cdot - case 912: state = 913; break; // &cdo -> &cdot - case 928: state = 929; break; // &cemp -> &cempt - case 933: state = 934; break; // &cen -> ¢ - case 936: state = 937; break; // &Cen -> &Cent - case 941: state = 942; break; // &CenterDo -> &CenterDot - case 947: state = 948; break; // ¢erdo -> ¢erdot - case 995: state = 996; break; // &circlearrowlef -> &circlearrowleft - case 1001: state = 1002; break; // &circlearrowrigh -> &circlearrowright - case 1006: state = 1007; break; // &circledas -> &circledast - case 1025: state = 1026; break; // &CircleDo -> &CircleDot - case 1056: state = 1057; break; // &cirfnin -> &cirfnint - case 1078: state = 1079; break; // &ClockwiseCon -> &ClockwiseCont - case 1084: state = 1085; break; // &ClockwiseContourIn -> &ClockwiseContourInt - case 1107: state = 1108; break; // &CloseCurlyDoubleQuo -> &CloseCurlyDoubleQuot - case 1113: state = 1114; break; // &CloseCurlyQuo -> &CloseCurlyQuot - case 1123: state = 1124; break; // &clubsui -> &clubsuit - case 1144: state = 1146; break; // &comma -> &commat - case 1157: state = 1158; break; // &complemen -> &complement - case 1168: state = 1169; break; // &congdo -> &congdot - case 1171: state = 1187; break; // &Con -> &Cont - case 1176: state = 1177; break; // &Congruen -> &Congruent - case 1180: state = 1181; break; // &Conin -> &Conint - case 1184: state = 1185; break; // &conin -> &conint - case 1192: state = 1193; break; // &ContourIn -> &ContourInt - case 1214: state = 1215; break; // &Coproduc -> &Coproduct - case 1227: state = 1228; break; // &Coun -> &Count - case 1242: state = 1243; break; // &CounterClockwiseCon -> &CounterClockwiseCont - case 1248: state = 1249; break; // &CounterClockwiseContourIn -> &CounterClockwiseContourInt - case 1289: state = 1290; break; // &ctdo -> &ctdot - case 1338: state = 1339; break; // &cupdo -> &cupdot - case 1390: state = 1391; break; // &curvearrowlef -> &curvearrowleft - case 1396: state = 1397; break; // &curvearrowrigh -> &curvearrowright - case 1412: state = 1413; break; // &cwconin -> &cwconint - case 1416: state = 1417; break; // &cwin -> &cwint - case 1421: state = 1422; break; // &cylc -> &cylct - case 1432: state = 2067; break; // &d -> &dt - case 1440: state = 1441; break; // &dale -> &dalet - case 1503: state = 1504; break; // &DDo -> &DDot - case 1510: state = 1511; break; // &ddo -> &ddot - case 1520: state = 1522; break; // &Del -> &Delt - case 1525: state = 1526; break; // &del -> &delt - case 1530: state = 1531; break; // &demp -> &dempt - case 1538: state = 1539; break; // &dfish -> &dfisht - case 1561: state = 1562; break; // &Diacri -> &Diacrit - case 1569: state = 1570; break; // &DiacriticalAcu -> &DiacriticalAcut - case 1574: state = 1575; break; // &DiacriticalDo -> &DiacriticalDot - case 1583: state = 1584; break; // &DiacriticalDoubleAcu -> &DiacriticalDoubleAcut - case 1614: state = 1615; break; // &diamondsui -> &diamondsuit - case 1626: state = 1627; break; // &Differen -> &Different - case 1650: state = 1651; break; // ÷on -> ÷ont - case 1679: state = 1694; break; // &do -> &dot - case 1685: state = 1692; break; // &Do -> &Dot - case 1697: state = 1698; break; // &DotDo -> &DotDot - case 1704: state = 1705; break; // &doteqdo -> &doteqdot - case 1750: state = 1751; break; // &DoubleCon -> &DoubleCont - case 1756: state = 1757; break; // &DoubleContourIn -> &DoubleContourInt - case 1765: state = 1766; break; // &DoubleDo -> &DoubleDot - case 1778: state = 1779; break; // &DoubleLef -> &DoubleLeft - case 1789: state = 1790; break; // &DoubleLeftRigh -> &DoubleLeftRight - case 1806: state = 1807; break; // &DoubleLongLef -> &DoubleLongLeft - case 1817: state = 1818; break; // &DoubleLongLeftRigh -> &DoubleLongLeftRight - case 1828: state = 1829; break; // &DoubleLongRigh -> &DoubleLongRight - case 1839: state = 1840; break; // &DoubleRigh -> &DoubleRight - case 1871: state = 1872; break; // &DoubleVer -> &DoubleVert - case 1941: state = 1942; break; // &downharpoonlef -> &downharpoonleft - case 1947: state = 1948; break; // &downharpoonrigh -> &downharpoonright - case 1952: state = 1953; break; // &DownLef -> &DownLeft - case 1957: state = 1958; break; // &DownLeftRigh -> &DownLeftRight - case 1961: state = 1962; break; // &DownLeftRightVec -> &DownLeftRightVect - case 1971: state = 1972; break; // &DownLeftTeeVec -> &DownLeftTeeVect - case 1978: state = 1979; break; // &DownLeftVec -> &DownLeftVect - case 1990: state = 1991; break; // &DownRigh -> &DownRight - case 1997: state = 1998; break; // &DownRightTeeVec -> &DownRightTeeVect - case 2004: state = 2005; break; // &DownRightVec -> &DownRightVect - case 2040: state = 2057; break; // &Ds -> &Dst - case 2044: state = 2062; break; // &ds -> &dst - case 2069: state = 2070; break; // &dtdo -> &dtdot - case 2108: state = 2436; break; // &E -> &Et - case 2111: state = 2112; break; // &Eacu -> &Eacut - case 2115: state = 2439; break; // &e -> &et - case 2118: state = 2119; break; // &eacu -> &eacut - case 2122: state = 2123; break; // &eas -> &east - case 2159: state = 2160; break; // &eDDo -> &eDDot - case 2163: state = 2164; break; // &Edo -> &Edot - case 2166: state = 2167; break; // &eDo -> &eDot - case 2170: state = 2171; break; // &edo -> &edot - case 2177: state = 2178; break; // &efDo -> &efDot - case 2201: state = 2202; break; // &egsdo -> &egsdot - case 2210: state = 2211; break; // &Elemen -> &Element - case 2214: state = 2215; break; // &elin -> &elint - case 2225: state = 2226; break; // &elsdo -> &elsdot - case 2238: state = 2239; break; // &emp -> &empt - case 2243: state = 2244; break; // &emptyse -> &emptyset - case 2246: state = 2247; break; // &Emp -> &Empt - case 2356: state = 2357; break; // &eqslan -> &eqslant - case 2358: state = 2359; break; // &eqslantg -> &eqslantgt - case 2384: state = 2385; break; // &eques -> &equest - case 2415: state = 2416; break; // &erDo -> &erDot - case 2427: state = 2428; break; // &esdo -> &esdot - case 2463: state = 2464; break; // &exis -> &exist - case 2468: state = 2469; break; // &Exis -> &Exist - case 2474: state = 2475; break; // &expec -> &expect - case 2476: state = 2477; break; // &expecta -> &expectat - case 2486: state = 2487; break; // &Exponen -> &Exponent - case 2496: state = 2497; break; // &exponen -> &exponent - case 2511: state = 2512; break; // &fallingdo -> &fallingdot - case 2592: state = 2600; break; // &fl -> &flt - case 2593: state = 2594; break; // &fla -> &flat - case 2634: state = 2635; break; // &Fourier -> &Fouriert - case 2641: state = 2642; break; // &fpar -> &fpart - case 2644: state = 2645; break; // &fpartin -> &fpartint - case 2701: state = 2942; break; // &g -> > - case 2704: state = 2705; break; // &gacu -> &gacut - case 2708: state = 2940; break; // &G -> &Gt - case 2756: state = 2757; break; // &Gdo -> &Gdot - case 2760: state = 2761; break; // &gdo -> &gdot - case 2778: state = 2779; break; // &geqslan -> &geqslant - case 2787: state = 2788; break; // &gesdo -> &gesdot - case 2868: state = 2869; break; // &Grea -> &Great - case 2896: state = 2897; break; // &GreaterGrea -> &GreaterGreat - case 2909: state = 2910; break; // &GreaterSlan -> &GreaterSlant - case 2951: state = 2952; break; // >do -> >dot - case 2962: state = 2963; break; // >ques -> >quest - case 2977: state = 2978; break; // >rdo -> >rdot - case 3004: state = 3005; break; // &gver -> &gvert - case 3015: state = 3058; break; // &Ha -> &Hat - case 3032: state = 3033; break; // &hamil -> &hamilt - case 3076: state = 3077; break; // &hear -> &heart - case 3081: state = 3082; break; // &heartsui -> &heartsuit - case 3104: state = 3105; break; // &Hilber -> &Hilbert - case 3131: state = 3132; break; // &hom -> &homt - case 3133: state = 3134; break; // &homth -> &homtht - case 3140: state = 3141; break; // &hooklef -> &hookleft - case 3151: state = 3152; break; // &hookrigh -> &hookright - case 3175: state = 3176; break; // &Horizon -> &Horizont - case 3184: state = 3197; break; // &Hs -> &Hst - case 3188: state = 3202; break; // &hs -> &hst - case 3236: state = 3528; break; // &I -> &It - case 3239: state = 3240; break; // &Iacu -> &Iacut - case 3243: state = 3526; break; // &i -> &it - case 3246: state = 3247; break; // &iacu -> &iacut - case 3266: state = 3267; break; // &Ido -> &Idot - case 3305: state = 3306; break; // &iiiin -> &iiiint - case 3308: state = 3309; break; // &iiin -> &iiint - case 3316: state = 3317; break; // &iio -> &iiot - case 3337: state = 3362; break; // &ima -> &imat - case 3359: state = 3360; break; // &imagpar -> &imagpart - case 3378: state = 3401; break; // &in -> &int - case 3387: state = 3389; break; // &infin -> &infint - case 3395: state = 3396; break; // &inodo -> &inodot - case 3398: state = 3399; break; // &In -> &Int - case 3427: state = 3428; break; // &Intersec -> &Intersect - case 3467: state = 3489; break; // &io -> &iot - case 3471: state = 3486; break; // &Io -> &Iot - case 3500: state = 3501; break; // &iques -> ¿ - case 3515: state = 3516; break; // &isindo -> &isindot - case 3578: state = 3579; break; // &jma -> &jmat - case 3692: state = 4698; break; // &l -> < - case 3693: state = 3794; break; // &lA -> &lAt - case 3698: state = 4696; break; // &L -> &Lt - case 3701: state = 3702; break; // &Lacu -> &Lacut - case 3705: state = 3792; break; // &la -> &lat - case 3707: state = 3708; break; // &lacu -> &lacut - case 3713: state = 3714; break; // &laemp -> &laempt - case 3750: state = 3751; break; // &Laplace -> &Laplacet - case 3766: state = 3789; break; // &larr -> &larrt - case 3899: state = 3900; break; // &Lef -> &Left - case 3911: state = 3912; break; // &LeftAngleBracke -> &LeftAngleBracket - case 3925: state = 3926; break; // &lef -> &left - case 3926: state = 4109; break; // &left -> &leftt - case 3931: state = 3948; break; // &leftarrow -> &leftarrowt - case 3940: state = 3941; break; // &LeftArrowRigh -> &LeftArrowRight - case 3972: state = 3973; break; // &LeftDoubleBracke -> &LeftDoubleBracket - case 3982: state = 3983; break; // &LeftDownTeeVec -> &LeftDownTeeVect - case 3989: state = 3990; break; // &LeftDownVec -> &LeftDownVect - case 4021: state = 4022; break; // &leftlef -> &leftleft - case 4033: state = 4034; break; // &LeftRigh -> &LeftRight - case 4044: state = 4045; break; // &Leftrigh -> &Leftright - case 4055: state = 4056; break; // &leftrigh -> &leftright - case 4087: state = 4088; break; // &LeftRightVec -> &LeftRightVect - case 4104: state = 4105; break; // &LeftTeeVec -> &LeftTeeVect - case 4113: state = 4114; break; // &leftthree -> &leftthreet - case 4146: state = 4147; break; // &LeftUpDownVec -> &LeftUpDownVect - case 4156: state = 4157; break; // &LeftUpTeeVec -> &LeftUpTeeVect - case 4163: state = 4164; break; // &LeftUpVec -> &LeftUpVect - case 4174: state = 4175; break; // &LeftVec -> &LeftVect - case 4194: state = 4195; break; // &leqslan -> &leqslant - case 4203: state = 4204; break; // &lesdo -> &lesdot - case 4224: state = 4225; break; // &lessdo -> &lessdot - case 4229: state = 4230; break; // &lesseqg -> &lesseqgt - case 4234: state = 4235; break; // &lesseqqg -> &lesseqqgt - case 4248: state = 4249; break; // &LessEqualGrea -> &LessEqualGreat - case 4266: state = 4267; break; // &LessGrea -> &LessGreat - case 4271: state = 4272; break; // &lessg -> &lessgt - case 4287: state = 4288; break; // &LessSlan -> &LessSlant - case 4304: state = 4305; break; // &lfish -> &lfisht - case 4348: state = 4375; break; // &ll -> &llt - case 4362: state = 4363; break; // &Llef -> &Lleft - case 4382: state = 4383; break; // &Lmido -> &Lmidot - case 4388: state = 4389; break; // &lmido -> &lmidot - case 4393: state = 4394; break; // &lmous -> &lmoust - case 4422: state = 4573; break; // &lo -> &lot - case 4439: state = 4440; break; // &LongLef -> &LongLeft - case 4449: state = 4450; break; // &Longlef -> &Longleft - case 4461: state = 4462; break; // &longlef -> &longleft - case 4472: state = 4473; break; // &LongLeftRigh -> &LongLeftRight - case 4483: state = 4484; break; // &Longleftrigh -> &Longleftright - case 4494: state = 4495; break; // &longleftrigh -> &longleftright - case 4505: state = 4506; break; // &longmaps -> &longmapst - case 4512: state = 4513; break; // &LongRigh -> &LongRight - case 4523: state = 4524; break; // &Longrigh -> &Longright - case 4534: state = 4535; break; // &longrigh -> &longright - case 4551: state = 4552; break; // &looparrowlef -> &looparrowleft - case 4557: state = 4558; break; // &looparrowrigh -> &looparrowright - case 4581: state = 4582; break; // &lowas -> &lowast - case 4593: state = 4594; break; // &LowerLef -> &LowerLeft - case 4604: state = 4605; break; // &LowerRigh -> &LowerRight - case 4625: state = 4626; break; // &lparl -> &lparlt - case 4628: state = 4648; break; // &lr -> &lrt - case 4652: state = 4689; break; // &ls -> &lst - case 4658: state = 4684; break; // &Ls -> &Lst - case 4707: state = 4708; break; // <do -> <dot - case 4728: state = 4729; break; // <ques -> <quest - case 4757: state = 4758; break; // &lver -> &lvert - case 4772: state = 4775; break; // &mal -> &malt - case 4787: state = 4788; break; // &maps -> &mapst - case 4798: state = 4799; break; // &mapstolef -> &mapstoleft - case 4827: state = 4828; break; // &mDDo -> &mDDot - case 4857: state = 4858; break; // &Mellin -> &Mellint - case 4879: state = 4880; break; // &midas -> &midast - case 4887: state = 4888; break; // &middo -> · - case 4941: state = 4945; break; // &ms -> &mst - case 4954: state = 4955; break; // &mul -> &mult - case 4965: state = 5988; break; // &n -> &nt - case 4966: state = 5001; break; // &na -> &nat - case 4971: state = 5992; break; // &N -> &Nt - case 4974: state = 4975; break; // &Nacu -> &Nacut - case 4979: state = 4980; break; // &nacu -> &nacut - case 5049: state = 5050; break; // &ncongdo -> &ncongdot - case 5081: state = 5082; break; // &nedo -> &nedot - case 5086: state = 5087; break; // &Nega -> &Negat - case 5148: state = 5149; break; // &Nes -> &Nest - case 5155: state = 5156; break; // &NestedGrea -> &NestedGreat - case 5162: state = 5163; break; // &NestedGreaterGrea -> &NestedGreaterGreat - case 5184: state = 5185; break; // &nexis -> &nexist - case 5195: state = 5221; break; // &ng -> &ngt - case 5207: state = 5208; break; // &ngeqslan -> &ngeqslant - case 5212: state = 5219; break; // &nG -> &nGt - case 5256: state = 5334; break; // &nl -> &nlt - case 5272: state = 5332; break; // &nL -> &nLt - case 5274: state = 5275; break; // &nLef -> &nLeft - case 5282: state = 5283; break; // &nlef -> &nleft - case 5293: state = 5294; break; // &nLeftrigh -> &nLeftright - case 5304: state = 5305; break; // &nleftrigh -> &nleftright - case 5319: state = 5320; break; // &nleqslan -> &nleqslant - case 5347: state = 5376; break; // &No -> &Not - case 5372: state = 5378; break; // &no -> ¬ - case 5387: state = 5388; break; // &NotCongruen -> &NotCongruent - case 5404: state = 5405; break; // &NotDoubleVer -> &NotDoubleVert - case 5419: state = 5420; break; // &NotElemen -> &NotElement - case 5435: state = 5436; break; // &NotExis -> &NotExist - case 5442: state = 5443; break; // &NotGrea -> &NotGreat - case 5466: state = 5467; break; // &NotGreaterGrea -> &NotGreaterGreat - case 5479: state = 5480; break; // &NotGreaterSlan -> &NotGreaterSlant - case 5516: state = 5517; break; // ¬indo -> ¬indot - case 5530: state = 5531; break; // &NotLef -> &NotLeft - case 5563: state = 5564; break; // &NotLessGrea -> &NotLessGreat - case 5576: state = 5577; break; // &NotLessSlan -> &NotLessSlant - case 5592: state = 5593; break; // &NotNes -> &NotNest - case 5599: state = 5600; break; // &NotNestedGrea -> &NotNestedGreat - case 5606: state = 5607; break; // &NotNestedGreaterGrea -> &NotNestedGreaterGreat - case 5648: state = 5649; break; // &NotPrecedesSlan -> &NotPrecedesSlant - case 5668: state = 5669; break; // &NotReverseElemen -> &NotReverseElement - case 5673: state = 5674; break; // &NotRigh -> &NotRight - case 5704: state = 5705; break; // &NotSquareSubse -> &NotSquareSubset - case 5717: state = 5718; break; // &NotSquareSuperse -> &NotSquareSuperset - case 5729: state = 5730; break; // &NotSubse -> &NotSubset - case 5754: state = 5755; break; // &NotSucceedsSlan -> &NotSucceedsSlant - case 5772: state = 5773; break; // &NotSuperse -> &NotSuperset - case 5811: state = 5812; break; // &NotVer -> &NotVert - case 5823: state = 5834; break; // &npar -> &npart - case 5839: state = 5840; break; // &npolin -> &npolint - case 5855: state = 5889; break; // &nr -> &nrt - case 5871: state = 5872; break; // &nRigh -> &nRight - case 5881: state = 5882; break; // &nrigh -> &nright - case 5912: state = 5913; break; // &nshor -> &nshort - case 5959: state = 5960; break; // &nsubse -> &nsubset - case 5980: state = 5981; break; // &nsupse -> &nsupset - case 6015: state = 6016; break; // &ntrianglelef -> &ntriangleleft - case 6024: state = 6025; break; // &ntrianglerigh -> &ntriangleright - case 6068: state = 6071; break; // &nvg -> &nvgt - case 6084: state = 6091; break; // &nvl -> &nvlt - case 6097: state = 6102; break; // &nvr -> &nvrt - case 6131: state = 6399; break; // &O -> &Ot - case 6134: state = 6135; break; // &Oacu -> &Oacut - case 6138: state = 6405; break; // &o -> &ot - case 6141: state = 6142; break; // &oacu -> &oacut - case 6145: state = 6146; break; // &oas -> &oast - case 6182: state = 6183; break; // &odo -> &odot - case 6210: state = 6225; break; // &og -> &ogt - case 6235: state = 6236; break; // &oin -> &oint - case 6238: state = 6256; break; // &ol -> &olt - case 6322: state = 6323; break; // &OpenCurlyDoubleQuo -> &OpenCurlyDoubleQuot - case 6328: state = 6329; break; // &OpenCurlyQuo -> &OpenCurlyQuot - case 6448: state = 6449; break; // &OverBracke -> &OverBracket - case 6455: state = 6456; break; // &OverParen -> &OverParent - case 6465: state = 6480; break; // &par -> &part - case 6484: state = 6485; break; // &Par -> &Part - case 6498: state = 6513; break; // &per -> &pert - case 6500: state = 6501; break; // &percn -> &percnt - case 6534: state = 6535; break; // &phmma -> &phmmat - case 6543: state = 6545; break; // &pi -> &pit - case 6567: state = 6603; break; // &plus -> &plust - case 6624: state = 6625; break; // &poin -> &point - case 6627: state = 6628; break; // &pointin -> &pointint - case 6688: state = 6689; break; // &PrecedesSlan -> &PrecedesSlant - case 6751: state = 6752; break; // &Produc -> &Product - case 6770: state = 6783; break; // &prop -> &propt - case 6774: state = 6775; break; // &Propor -> &Proport - case 6822: state = 6823; break; // &qin -> &qint - case 6848: state = 6849; break; // &qua -> &quat - case 6859: state = 6860; break; // &quatin -> &quatint - case 6863: state = 6864; break; // &ques -> &quest - case 6873: state = 6874; break; // &quo -> " - case 6876: state = 7567; break; // &r -> &rt - case 6877: state = 6968; break; // &rA -> &rAt - case 6882: state = 6973; break; // &ra -> &rat - case 6889: state = 6890; break; // &Racu -> &Racut - case 6893: state = 6894; break; // &racu -> &racut - case 6903: state = 6904; break; // &raemp -> &raempt - case 6926: state = 6960; break; // &Rarr -> &Rarrt - case 6932: state = 6963; break; // &rarr -> &rarrt - case 7084: state = 7085; break; // &realpar -> &realpart - case 7089: state = 7090; break; // &rec -> &rect - case 7107: state = 7108; break; // &ReverseElemen -> &ReverseElement - case 7138: state = 7139; break; // &rfish -> &rfisht - case 7173: state = 7174; break; // &Righ -> &Right - case 7185: state = 7186; break; // &RightAngleBracke -> &RightAngleBracket - case 7201: state = 7202; break; // &righ -> &right - case 7202: state = 7354; break; // &right -> &rightt - case 7207: state = 7223; break; // &rightarrow -> &rightarrowt - case 7215: state = 7216; break; // &RightArrowLef -> &RightArrowLeft - case 7247: state = 7248; break; // &RightDoubleBracke -> &RightDoubleBracket - case 7257: state = 7258; break; // &RightDownTeeVec -> &RightDownTeeVect - case 7264: state = 7265; break; // &RightDownVec -> &RightDownVect - case 7296: state = 7297; break; // &rightlef -> &rightleft - case 7317: state = 7318; break; // &rightrigh -> &rightright - case 7349: state = 7350; break; // &RightTeeVec -> &RightTeeVect - case 7358: state = 7359; break; // &rightthree -> &rightthreet - case 7391: state = 7392; break; // &RightUpDownVec -> &RightUpDownVect - case 7401: state = 7402; break; // &RightUpTeeVec -> &RightUpTeeVect - case 7408: state = 7409; break; // &RightUpVec -> &RightUpVect - case 7419: state = 7420; break; // &RightVec -> &RightVect - case 7436: state = 7437; break; // &risingdo -> &risingdot - case 7456: state = 7457; break; // &rmous -> &rmoust - case 7469: state = 7495; break; // &ro -> &rot - case 7516: state = 7517; break; // &rparg -> &rpargt - case 7523: state = 7524; break; // &rppolin -> &rppolint - case 7534: state = 7535; break; // &Rrigh -> &Rright - case 7585: state = 7586; break; // &rtril -> &rtrilt - case 7610: state = 8096; break; // &S -> &St - case 7613: state = 7614; break; // &Sacu -> &Sacut - case 7617: state = 8100; break; // &s -> &st - case 7620: state = 7621; break; // &sacu -> &sacut - case 7684: state = 7685; break; // &scpolin -> &scpolint - case 7696: state = 7697; break; // &sdo -> &sdot - case 7703: state = 7729; break; // &se -> &set - case 7718: state = 7719; break; // &sec -> § - case 7738: state = 7739; break; // &sex -> &sext - case 7774: state = 7775; break; // &Shor -> &Short - case 7788: state = 7789; break; // &ShortLef -> &ShortLeft - case 7797: state = 7798; break; // &shor -> &short - case 7815: state = 7816; break; // &ShortRigh -> &ShortRight - case 7850: state = 7851; break; // &simdo -> &simdot - case 7894: state = 7924; break; // &sm -> &smt - case 7899: state = 7900; break; // &smallse -> &smallset - case 7937: state = 7938; break; // &sof -> &soft - case 7963: state = 7964; break; // &spadesui -> &spadesuit - case 7981: state = 7982; break; // &Sqr -> &Sqrt - case 7991: state = 7992; break; // &sqsubse -> &sqsubset - case 8002: state = 8003; break; // &sqsupse -> &sqsupset - case 8020: state = 8021; break; // &SquareIn -> &SquareInt - case 8026: state = 8027; break; // &SquareIntersec -> &SquareIntersect - case 8036: state = 8037; break; // &SquareSubse -> &SquareSubset - case 8049: state = 8050; break; // &SquareSuperse -> &SquareSuperset - case 8077: state = 8091; break; // &ss -> &sst - case 8081: state = 8082; break; // &sse -> &sset - case 8110: state = 8111; break; // &straigh -> &straight - case 8134: state = 8135; break; // &subdo -> &subdot - case 8142: state = 8143; break; // &subedo -> &subedot - case 8147: state = 8148; break; // &submul -> &submult - case 8166: state = 8167; break; // &Subse -> &Subset - case 8170: state = 8171; break; // &subse -> &subset - case 8232: state = 8233; break; // &SucceedsSlan -> &SucceedsSlant - case 8272: state = 8273; break; // &SuchTha -> &SuchThat - case 8293: state = 8294; break; // &supdo -> &supdot - case 8305: state = 8306; break; // &supedo -> &supedot - case 8311: state = 8312; break; // &Superse -> &Superset - case 8335: state = 8336; break; // &supmul -> &supmult - case 8349: state = 8350; break; // &Supse -> &Supset - case 8353: state = 8354; break; // &supse -> &supset - case 8408: state = 8409; break; // &targe -> &target - case 8446: state = 8447; break; // &tdo -> &tdot - case 8462: state = 8484; break; // &the -> &thet - case 8468: state = 8481; break; // &The -> &Thet - case 8587: state = 8588; break; // &tin -> &tint - case 8597: state = 8598; break; // &topbo -> &topbot - case 8633: state = 8693; break; // &tri -> &trit - case 8647: state = 8648; break; // &trianglelef -> &triangleleft - case 8658: state = 8659; break; // &trianglerigh -> &triangleright - case 8665: state = 8666; break; // &trido -> &tridot - case 8682: state = 8683; break; // &TripleDo -> &TripleDot - case 8705: state = 8727; break; // &Ts -> &Tst - case 8709: state = 8732; break; // &ts -> &tst - case 8739: state = 8740; break; // &twix -> &twixt - case 8749: state = 8750; break; // &twoheadlef -> &twoheadleft - case 8760: state = 8761; break; // &twoheadrigh -> &twoheadright - case 8768: state = 9166; break; // &U -> &Ut - case 8771: state = 8772; break; // &Uacu -> &Uacut - case 8775: state = 9161; break; // &u -> &ut - case 8778: state = 8779; break; // &uacu -> &uacut - case 8852: state = 8853; break; // &ufish -> &ufisht - case 8887: state = 8900; break; // &ul -> &ult - case 8930: state = 8931; break; // &UnderBracke -> &UnderBracket - case 8937: state = 8938; break; // &UnderParen -> &UnderParent - case 9055: state = 9056; break; // &upharpoonlef -> &upharpoonleft - case 9061: state = 9062; break; // &upharpoonrigh -> &upharpoonright - case 9073: state = 9074; break; // &UpperLef -> &UpperLeft - case 9084: state = 9085; break; // &UpperRigh -> &UpperRight - case 9127: state = 9149; break; // &ur -> &urt - case 9163: state = 9164; break; // &utdo -> &utdot - case 9205: state = 9206; break; // &vangr -> &vangrt - case 9208: state = 9279; break; // &var -> &vart - case 9224: state = 9225; break; // &varno -> &varnot - case 9239: state = 9240; break; // &varprop -> &varpropt - case 9261: state = 9262; break; // &varsubse -> &varsubset - case 9271: state = 9272; break; // &varsupse -> &varsupset - case 9281: state = 9282; break; // &varthe -> &varthet - case 9294: state = 9295; break; // &vartrianglelef -> &vartriangleleft - case 9300: state = 9301; break; // &vartrianglerigh -> &vartriangleright - case 9360: state = 9370; break; // &Ver -> &Vert - case 9365: state = 9372; break; // &ver -> &vert - case 9392: state = 9393; break; // &VerticalSepara -> &VerticalSeparat - case 9420: state = 9421; break; // &vl -> &vlt - case 9445: state = 9446; break; // &vr -> &vrt - case 9536: state = 9537; break; // &wrea -> &wreat - case 9560: state = 9561; break; // &xd -> &xdt - case 9602: state = 9618; break; // &xo -> &xot - case 9604: state = 9605; break; // &xodo -> &xodot - case 9645: state = 9651; break; // &xu -> &xut - case 9668: state = 9669; break; // &Yacu -> &Yacut - case 9675: state = 9676; break; // &yacu -> &yacut - case 9750: state = 9751; break; // &Zacu -> &Zacut - case 9757: state = 9758; break; // &zacu -> &zacut - case 9778: state = 9779; break; // &Zdo -> &Zdot - case 9782: state = 9783; break; // &zdo -> &zdot - case 9785: state = 9808; break; // &ze -> &zet - case 9786: state = 9787; break; // &zee -> &zeet - case 9791: state = 9805; break; // &Ze -> &Zet - case 9796: state = 9797; break; // &ZeroWid -> &ZeroWidt - default: return false; - } - break; - case 'u': - switch (state) { - case 0: state = 8775; break; // & -> &u - case 1: state = 281; break; // &A -> &Au - case 3: state = 4; break; // &Aac -> &Aacu - case 8: state = 285; break; // &a -> &au - case 10: state = 11; break; // &aac -> &aacu - case 27: state = 42; break; // &ac -> &acu - case 220: state = 221; break; // &ApplyF -> &ApplyFu - case 301: state = 767; break; // &b -> &bu - case 331: state = 781; break; // &B -> &Bu - case 380: state = 381; break; // &bdq -> &bdqu - case 386: state = 387; break; // &beca -> &becau - case 392: state = 393; break; // &Beca -> &Becau - case 411: state = 412; break; // &berno -> &bernou - case 416: state = 417; break; // &Berno -> &Bernou - case 443: state = 497; break; // &big -> &bigu - case 444: state = 452; break; // &bigc -> &bigcu - case 461: state = 462; break; // &bigopl -> &bigoplu - case 473: state = 474; break; // &bigsqc -> &bigsqcu - case 488: state = 494; break; // &bigtriangle -> &bigtriangleu - case 499: state = 500; break; // &bigupl -> &biguplu - case 532: state = 533; break; // &blacksq -> &blacksqu - case 582: state = 583; break; // &bneq -> &bnequ - case 613: state = 678; break; // &box -> &boxu - case 636: state = 650; break; // &boxH -> &boxHu - case 638: state = 654; break; // &boxh -> &boxhu - case 658: state = 659; break; // &boxmin -> &boxminu - case 663: state = 664; break; // &boxpl -> &boxplu - case 763: state = 764; break; // &bsolhs -> &bsolhsu - case 789: state = 1315; break; // &C -> &Cu - case 791: state = 792; break; // &Cac -> &Cacu - case 796: state = 1292; break; // &c -> &cu - case 798: state = 799; break; // &cac -> &cacu - case 813: state = 814; break; // &capbrc -> &capbrcu - case 817: state = 821; break; // &capc -> &capcu - case 861: state = 900; break; // &cc -> &ccu - case 1034: state = 1035; break; // &CircleMin -> &CircleMinu - case 1039: state = 1040; break; // &CirclePl -> &CirclePlu - case 1080: state = 1081; break; // &ClockwiseConto -> &ClockwiseContou - case 1094: state = 1095; break; // &CloseC -> &CloseCu - case 1100: state = 1101; break; // &CloseCurlyDo -> &CloseCurlyDou - case 1105: state = 1106; break; // &CloseCurlyDoubleQ -> &CloseCurlyDoubleQu - case 1111: state = 1112; break; // &CloseCurlyQ -> &CloseCurlyQu - case 1117: state = 1118; break; // &cl -> &clu - case 1120: state = 1122; break; // &clubs -> &clubsu - case 1126: state = 1226; break; // &Co -> &Cou - case 1173: state = 1174; break; // &Congr -> &Congru - case 1188: state = 1189; break; // &Conto -> &Contou - case 1212: state = 1213; break; // &Coprod -> &Coprodu - case 1244: state = 1245; break; // &CounterClockwiseConto -> &CounterClockwiseContou - case 1274: state = 1278; break; // &cs -> &csu - case 1330: state = 1334; break; // &cupc -> &cupcu - case 1362: state = 1363; break; // &curlyeqs -> &curlyeqsu - case 1432: state = 2077; break; // &d -> &du - case 1568: state = 1569; break; // &DiacriticalAc -> &DiacriticalAcu - case 1574: state = 1577; break; // &DiacriticalDo -> &DiacriticalDou - case 1582: state = 1583; break; // &DiacriticalDoubleAc -> &DiacriticalDoubleAcu - case 1612: state = 1613; break; // &diamonds -> &diamondsu - case 1679: state = 1731; break; // &do -> &dou - case 1685: state = 1744; break; // &Do -> &Dou - case 1708: state = 1709; break; // &DotEq -> &DotEqu - case 1715: state = 1716; break; // &dotmin -> &dotminu - case 1720: state = 1721; break; // &dotpl -> &dotplu - case 1725: state = 1726; break; // &dotsq -> &dotsqu - case 1752: state = 1753; break; // &DoubleConto -> &DoubleContou - case 2108: state = 2447; break; // &E -> &Eu - case 2110: state = 2111; break; // &Eac -> &Eacu - case 2115: state = 2451; break; // &e -> &eu - case 2117: state = 2118; break; // &eac -> &eacu - case 2255: state = 2256; break; // &EmptySmallSq -> &EmptySmallSqu - case 2273: state = 2274; break; // &EmptyVerySmallSq -> &EmptyVerySmallSqu - case 2319: state = 2320; break; // &epl -> &eplu - case 2339: state = 2372; break; // &eq -> &equ - case 2367: state = 2368; break; // &Eq -> &Equ - case 2392: state = 2393; break; // &Equilibri -> &Equilibriu - case 2565: state = 2566; break; // &FilledSmallSq -> &FilledSmallSqu - case 2581: state = 2582; break; // &FilledVerySmallSq -> &FilledVerySmallSqu - case 2608: state = 2630; break; // &Fo -> &Fou - case 2703: state = 2704; break; // &gac -> &gacu - case 2873: state = 2874; break; // &GreaterEq -> &GreaterEqu - case 2883: state = 2884; break; // &GreaterF -> &GreaterFu - case 2888: state = 2889; break; // &GreaterFullEq -> &GreaterFullEqu - case 2912: state = 2913; break; // &GreaterSlantEq -> &GreaterSlantEqu - case 2959: state = 2960; break; // >q -> >qu - case 3014: state = 3207; break; // &H -> &Hu - case 3078: state = 3080; break; // &hearts -> &heartsu - case 3214: state = 3215; break; // &HumpDownH -> &HumpDownHu - case 3220: state = 3221; break; // &HumpEq -> &HumpEqu - case 3226: state = 3227; break; // &hyb -> &hybu - case 3236: state = 3539; break; // &I -> &Iu - case 3238: state = 3239; break; // &Iac -> &Iacu - case 3243: state = 3544; break; // &i -> &iu - case 3245: state = 3246; break; // &iac -> &iacu - case 3497: state = 3498; break; // &iq -> &iqu - case 3555: state = 3608; break; // &J -> &Ju - case 3561: state = 3613; break; // &j -> &ju - case 3692: state = 4742; break; // &l -> &lu - case 3700: state = 3701; break; // &Lac -> &Lacu - case 3706: state = 3707; break; // &lac -> &lacu - case 3755: state = 3756; break; // &laq -> &laqu - case 3832: state = 3835; break; // &lbrksl -> &lbrkslu - case 3843: state = 3862; break; // &lc -> &lcu - case 3873: state = 3874; break; // &ldq -> &ldqu - case 3879: state = 3885; break; // &ldr -> &ldru - case 3962: state = 3963; break; // &LeftDo -> &LeftDou - case 4010: state = 4016; break; // &leftharpoon -> &leftharpoonu - case 4075: state = 4076; break; // &leftrightsq -> &leftrightsqu - case 4133: state = 4134; break; // &LeftTriangleEq -> &LeftTriangleEqu - case 4241: state = 4242; break; // &LessEq -> &LessEqu - case 4253: state = 4254; break; // &LessF -> &LessFu - case 4258: state = 4259; break; // &LessFullEq -> &LessFullEqu - case 4290: state = 4291; break; // &LessSlantEq -> &LessSlantEqu - case 4327: state = 4330; break; // &lhar -> &lharu - case 4391: state = 4392; break; // &lmo -> &lmou - case 4569: state = 4570; break; // &lopl -> &loplu - case 4654: state = 4655; break; // &lsaq -> &lsaqu - case 4676: state = 4679; break; // &lsq -> &lsqu - case 4725: state = 4726; break; // <q -> <qu - case 4743: state = 4750; break; // &lur -> &luru - case 4767: state = 4952; break; // &m -> &mu - case 4781: state = 4950; break; // &M -> &Mu - case 4789: state = 4801; break; // &mapsto -> &mapstou - case 4832: state = 4833; break; // &meas -> &measu - case 4845: state = 4846; break; // &Medi -> &Mediu - case 4890: state = 4891; break; // &min -> &minu - case 4896: state = 4898; break; // &minusd -> &minusdu - case 4901: state = 4902; break; // &Min -> &Minu - case 4905: state = 4906; break; // &MinusPl -> &MinusPlu - case 4918: state = 4919; break; // &mnpl -> &mnplu - case 4965: state = 6032; break; // &n -> &nu - case 4971: state = 6030; break; // &N -> &Nu - case 4973: state = 4974; break; // &Nac -> &Nacu - case 4978: state = 4979; break; // &nac -> &nacu - case 5001: state = 5002; break; // &nat -> &natu - case 5010: state = 5014; break; // &nb -> &nbu - case 5020: state = 5052; break; // &nc -> &ncu - case 5094: state = 5095; break; // &NegativeMedi -> &NegativeMediu - case 5135: state = 5136; break; // &neq -> &nequ - case 5380: state = 5390; break; // &NotC -> &NotCu - case 5384: state = 5385; break; // &NotCongr -> &NotCongru - case 5397: state = 5398; break; // &NotDo -> &NotDou - case 5422: state = 5423; break; // &NotEq -> &NotEqu - case 5448: state = 5449; break; // &NotGreaterEq -> &NotGreaterEqu - case 5453: state = 5454; break; // &NotGreaterF -> &NotGreaterFu - case 5458: state = 5459; break; // &NotGreaterFullEq -> &NotGreaterFullEqu - case 5482: state = 5483; break; // &NotGreaterSlantEq -> &NotGreaterSlantEqu - case 5493: state = 5494; break; // &NotH -> &NotHu - case 5501: state = 5502; break; // &NotHumpDownH -> &NotHumpDownHu - case 5507: state = 5508; break; // &NotHumpEq -> &NotHumpEqu - case 5546: state = 5547; break; // &NotLeftTriangleEq -> &NotLeftTriangleEqu - case 5555: state = 5556; break; // &NotLessEq -> &NotLessEqu - case 5579: state = 5580; break; // &NotLessSlantEq -> &NotLessSlantEqu - case 5640: state = 5641; break; // &NotPrecedesEq -> &NotPrecedesEqu - case 5651: state = 5652; break; // &NotPrecedesSlantEq -> &NotPrecedesSlantEqu - case 5689: state = 5690; break; // &NotRightTriangleEq -> &NotRightTriangleEqu - case 5694: state = 5726; break; // &NotS -> &NotSu - case 5695: state = 5696; break; // &NotSq -> &NotSqu - case 5700: state = 5701; break; // &NotSquareS -> &NotSquareSu - case 5708: state = 5709; break; // &NotSquareSubsetEq -> &NotSquareSubsetEqu - case 5721: state = 5722; break; // &NotSquareSupersetEq -> &NotSquareSupersetEqu - case 5733: state = 5734; break; // &NotSubsetEq -> &NotSubsetEqu - case 5746: state = 5747; break; // &NotSucceedsEq -> &NotSucceedsEqu - case 5757: state = 5758; break; // &NotSucceedsSlantEq -> &NotSucceedsSlantEqu - case 5776: state = 5777; break; // &NotSupersetEq -> &NotSupersetEqu - case 5788: state = 5789; break; // &NotTildeEq -> &NotTildeEqu - case 5793: state = 5794; break; // &NotTildeF -> &NotTildeFu - case 5798: state = 5799; break; // &NotTildeFullEq -> &NotTildeFullEqu - case 5844: state = 5845; break; // &nprc -> &nprcu - case 5895: state = 5951; break; // &ns -> &nsu - case 5898: state = 5899; break; // &nscc -> &nsccu - case 5943: state = 5944; break; // &nsqs -> &nsqsu - case 6131: state = 6422; break; // &O -> &Ou - case 6133: state = 6134; break; // &Oac -> &Oacu - case 6138: state = 6426; break; // &o -> &ou - case 6140: state = 6141; break; // &oac -> &oacu - case 6290: state = 6291; break; // &omin -> &ominu - case 6309: state = 6310; break; // &OpenC -> &OpenCu - case 6315: state = 6316; break; // &OpenCurlyDo -> &OpenCurlyDou - case 6320: state = 6321; break; // &OpenCurlyDoubleQ -> &OpenCurlyDoubleQu - case 6326: state = 6327; break; // &OpenCurlyQ -> &OpenCurlyQu - case 6336: state = 6337; break; // &opl -> &oplu - case 6463: state = 6807; break; // &p -> &pu - case 6555: state = 6566; break; // &pl -> &plu - case 6580: state = 6583; break; // &plusd -> &plusdu - case 6587: state = 6588; break; // &Pl -> &Plu - case 6592: state = 6593; break; // &PlusMin -> &PlusMinu - case 6622: state = 6636; break; // &po -> &pou - case 6642: state = 6790; break; // &pr -> &pru - case 6647: state = 6648; break; // &prc -> &prcu - case 6664: state = 6665; break; // &precc -> &preccu - case 6680: state = 6681; break; // &PrecedesEq -> &PrecedesEqu - case 6691: state = 6692; break; // &PrecedesSlantEq -> &PrecedesSlantEqu - case 6749: state = 6750; break; // &Prod -> &Produ - case 6765: state = 6766; break; // &profs -> &profsu - case 6817: state = 6847; break; // &q -> &qu - case 6876: state = 7601; break; // &r -> &ru - case 6883: state = 6893; break; // &rac -> &racu - case 6886: state = 7590; break; // &R -> &Ru - case 6888: state = 6889; break; // &Rac -> &Racu - case 6921: state = 6922; break; // &raq -> &raqu - case 7016: state = 7019; break; // &rbrksl -> &rbrkslu - case 7027: state = 7046; break; // &rc -> &rcu - case 7063: state = 7064; break; // &rdq -> &rdqu - case 7110: state = 7111; break; // &ReverseEq -> &ReverseEqu - case 7117: state = 7118; break; // &ReverseEquilibri -> &ReverseEquilibriu - case 7124: state = 7125; break; // &ReverseUpEq -> &ReverseUpEqu - case 7131: state = 7132; break; // &ReverseUpEquilibri -> &ReverseUpEquilibriu - case 7157: state = 7160; break; // &rhar -> &rharu - case 7237: state = 7238; break; // &RightDo -> &RightDou - case 7285: state = 7291; break; // &rightharpoon -> &rightharpoonu - case 7327: state = 7328; break; // &rightsq -> &rightsqu - case 7378: state = 7379; break; // &RightTriangleEq -> &RightTriangleEqu - case 7454: state = 7455; break; // &rmo -> &rmou - case 7485: state = 7501; break; // &Ro -> &Rou - case 7491: state = 7492; break; // &ropl -> &roplu - case 7544: state = 7545; break; // &rsaq -> &rsaqu - case 7559: state = 7562; break; // &rsq -> &rsqu - case 7602: state = 7603; break; // &rul -> &rulu - case 7610: state = 8127; break; // &S -> &Su - case 7612: state = 7613; break; // &Sac -> &Sacu - case 7617: state = 8130; break; // &s -> &su - case 7619: state = 7620; break; // &sac -> &sacu - case 7625: state = 7626; break; // &sbq -> &sbqu - case 7645: state = 7646; break; // &scc -> &sccu - case 7732: state = 7733; break; // &setmin -> &setminu - case 7869: state = 7870; break; // &simpl -> &simplu - case 7903: state = 7904; break; // &smallsetmin -> &smallsetminu - case 7960: state = 7962; break; // &spades -> &spadesu - case 7968: state = 8008; break; // &sq -> &squ - case 7969: state = 7975; break; // &sqc -> &sqcu - case 7980: state = 8010; break; // &Sq -> &Squ - case 7984: state = 7985; break; // &sqs -> &sqsu - case 8032: state = 8033; break; // &SquareS -> &SquareSu - case 8040: state = 8041; break; // &SquareSubsetEq -> &SquareSubsetEqu - case 8053: state = 8054; break; // &SquareSupersetEq -> &SquareSupersetEqu - case 8145: state = 8146; break; // &subm -> &submu - case 8156: state = 8157; break; // &subpl -> &subplu - case 8169: state = 8193; break; // &subs -> &subsu - case 8179: state = 8180; break; // &SubsetEq -> &SubsetEqu - case 8208: state = 8209; break; // &succc -> &succcu - case 8224: state = 8225; break; // &SucceedsEq -> &SucceedsEqu - case 8235: state = 8236; break; // &SucceedsSlantEq -> &SucceedsSlantEqu - case 8296: state = 8297; break; // &supds -> &supdsu - case 8315: state = 8316; break; // &SupersetEq -> &SupersetEqu - case 8321: state = 8325; break; // &suphs -> &suphsu - case 8333: state = 8334; break; // &supm -> &supmu - case 8344: state = 8345; break; // &suppl -> &supplu - case 8352: state = 8370; break; // &sups -> &supsu - case 8401: state = 8411; break; // &Ta -> &Tau - case 8405: state = 8413; break; // &ta -> &tau - case 8555: state = 8556; break; // &TildeEq -> &TildeEqu - case 8560: state = 8561; break; // &TildeF -> &TildeFu - case 8565: state = 8566; break; // &TildeFullEq -> &TildeFullEqu - case 8672: state = 8673; break; // &trimin -> &triminu - case 8686: state = 8687; break; // &tripl -> &triplu - case 8701: state = 8702; break; // &trpezi -> &trpeziu - case 8768: state = 9187; break; // &U -> &Uu - case 8770: state = 8771; break; // &Uac -> &Uacu - case 8775: state = 9182; break; // &u -> &uu - case 8777: state = 8778; break; // &uac -> &uacu - case 8950: state = 8951; break; // &UnionPl -> &UnionPlu - case 8983: state = 9118; break; // &up -> &upu - case 9035: state = 9036; break; // &UpEq -> &UpEqu - case 9042: state = 9043; break; // &UpEquilibri -> &UpEquilibriu - case 9064: state = 9065; break; // &upl -> &uplu - case 9252: state = 9258; break; // &vars -> &varsu - case 9426: state = 9427; break; // &vns -> &vnsu - case 9454: state = 9458; break; // &vs -> &vsu - case 9548: state = 9645; break; // &x -> &xu - case 9549: state = 9557; break; // &xc -> &xcu - case 9614: state = 9615; break; // &xopl -> &xoplu - case 9641: state = 9642; break; // &xsqc -> &xsqcu - case 9647: state = 9648; break; // &xupl -> &xuplu - case 9665: state = 9740; break; // &Y -> &Yu - case 9667: state = 9668; break; // &Yac -> &Yacu - case 9672: state = 9736; break; // &y -> &yu - case 9674: state = 9675; break; // &yac -> &yacu - case 9749: state = 9750; break; // &Zac -> &Zacu - case 9756: state = 9757; break; // &zac -> &zacu - default: return false; - } - break; - case 'v': - switch (state) { - case 0: state = 9201; break; // & -> &v - case 17: state = 18; break; // &Abre -> &Abrev - case 23: state = 24; break; // &abre -> &abrev - case 69: state = 70; break; // &Agra -> &Agrav - case 75: state = 76; break; // &agra -> &agrav - case 120: state = 134; break; // &and -> &andv - case 165: state = 167; break; // &angrt -> &angrtv - case 341: state = 342; break; // &Bar -> &Barv - case 344: state = 345; break; // &bar -> &barv - case 402: state = 403; break; // &bempty -> &bemptyv - case 443: state = 503; break; // &big -> &bigv - case 584: state = 585; break; // &bnequi -> &bnequiv - case 613: state = 693; break; // &box -> &boxv - case 726: state = 727; break; // &Bre -> &Brev - case 730: state = 735; break; // &br -> &brv - case 731: state = 732; break; // &bre -> &brev - case 930: state = 931; break; // &cempty -> &cemptyv - case 1292: state = 1399; break; // &cu -> &cuv - case 1346: state = 1381; break; // &cur -> &curv - case 1354: state = 1367; break; // &curly -> &curlyv - case 1455: state = 1461; break; // &dash -> &dashv - case 1458: state = 1459; break; // &Dash -> &Dashv - case 1532: state = 1533; break; // &dempty -> &demptyv - case 1589: state = 1590; break; // &DiacriticalGra -> &DiacriticalGrav - case 1599: state = 1643; break; // &di -> &div - case 1917: state = 1918; break; // &DownBre -> &DownBrev - case 2189: state = 2190; break; // &Egra -> &Egrav - case 2194: state = 2195; break; // &egra -> &egrav - case 2240: state = 2261; break; // &empty -> &emptyv - case 2324: state = 2337; break; // &epsi -> &epsiv - case 2339: state = 2402; break; // &eq -> &eqv - case 2396: state = 2397; break; // &equi -> &equiv - case 2626: state = 2628; break; // &fork -> &forkv - case 2701: state = 3002; break; // &g -> &gv - case 2726: state = 2727; break; // &Gbre -> &Gbrev - case 2732: state = 2733; break; // &gbre -> &gbrev - case 2862: state = 2863; break; // &gra -> &grav - case 3291: state = 3292; break; // &Igra -> &Igrav - case 3297: state = 3298; break; // &igra -> &igrav - case 3398: state = 3444; break; // &In -> &Inv - case 3512: state = 3524; break; // &isin -> &isinv - case 3520: state = 3522; break; // &isins -> &isinsv - case 3628: state = 3630; break; // &kappa -> &kappav - case 3692: state = 4755; break; // &l -> &lv - case 3715: state = 3716; break; // &laempty -> &laemptyv - case 4965: state = 6043; break; // &n -> &nv - case 5088: state = 5089; break; // &Negati -> &Negativ - case 5137: state = 5138; break; // &nequi -> &nequiv - case 5219: state = 5225; break; // &nGt -> &nGtv - case 5240: state = 5246; break; // &ni -> &niv - case 5332: state = 5341; break; // &nLt -> &nLtv - case 5513: state = 5521; break; // ¬in -> ¬inv - case 5621: state = 5623; break; // ¬ni -> ¬niv - case 5657: state = 5658; break; // &NotRe -> &NotRev - case 6131: state = 6435; break; // &O -> &Ov - case 6138: state = 6430; break; // &o -> &ov - case 6179: state = 6180; break; // &odi -> &odiv - case 6216: state = 6217; break; // &Ogra -> &Ograv - case 6221: state = 6222; break; // &ogra -> &ograv - case 6342: state = 6374; break; // &or -> &orv - case 6528: state = 6530; break; // &phi -> &phiv - case 6543: state = 6553; break; // &pi -> &piv - case 6563: state = 6564; break; // &plank -> &plankv - case 6905: state = 6906; break; // &raempty -> &raemptyv - case 7072: state = 7097; break; // &Re -> &Rev - case 7167: state = 7169; break; // &rho -> &rhov - case 7841: state = 7845; break; // &sigma -> &sigmav - case 8485: state = 8491; break; // &theta -> &thetav - case 8807: state = 8808; break; // &Ubre -> &Ubrev - case 8811: state = 8812; break; // &ubre -> &ubrev - case 8862: state = 8863; break; // &Ugra -> &Ugrav - case 8868: state = 8869; break; // &ugra -> &ugrav - case 9303: state = 9471; break; // &V -> &Vv - case 9310: state = 9312; break; // &vBar -> &vBarv - case 9548: state = 9655; break; // &x -> &xv - default: return false; - } - break; - case 'w': - switch (state) { - case 0: state = 9490; break; // & -> &w - case 8: state = 289; break; // &a -> &aw - case 341: state = 349; break; // &Bar -> &Barw - case 344: state = 353; break; // &bar -> &barw - case 426: state = 431; break; // &bet -> &betw - case 443: state = 507; break; // &big -> &bigw - case 490: state = 491; break; // &bigtriangledo -> &bigtriangledow - case 516: state = 517; break; // &bkaro -> &bkarow - case 548: state = 549; break; // &blacktriangledo -> &blacktriangledow - case 598: state = 608; break; // &bo -> &bow - case 796: state = 1407; break; // &c -> &cw - case 991: state = 992; break; // &circlearro -> &circlearrow - case 1071: state = 1072; break; // &Clock -> &Clockw - case 1235: state = 1236; break; // &CounterClock -> &CounterClockw - case 1292: state = 1403; break; // &cu -> &cuw - case 1354: state = 1371; break; // &curly -> &curlyw - case 1386: state = 1387; break; // &curvearro -> &curvearrow - case 1432: state = 2086; break; // &d -> &dw - case 1467: state = 1468; break; // &dbkaro -> &dbkarow - case 1679: state = 1895; break; // &do -> &dow - case 1685: state = 1881; break; // &Do -> &Dow - case 1737: state = 1738; break; // &doublebar -> &doublebarw - case 1765: state = 1768; break; // &DoubleDo -> &DoubleDow - case 1773: state = 1774; break; // &DoubleDownArro -> &DoubleDownArrow - case 1783: state = 1784; break; // &DoubleLeftArro -> &DoubleLeftArrow - case 1794: state = 1795; break; // &DoubleLeftRightArro -> &DoubleLeftRightArrow - case 1811: state = 1812; break; // &DoubleLongLeftArro -> &DoubleLongLeftArrow - case 1822: state = 1823; break; // &DoubleLongLeftRightArro -> &DoubleLongLeftRightArrow - case 1833: state = 1834; break; // &DoubleLongRightArro -> &DoubleLongRightArrow - case 1844: state = 1845; break; // &DoubleRightArro -> &DoubleRightArrow - case 1856: state = 1857; break; // &DoubleUpArro -> &DoubleUpArrow - case 1860: state = 1861; break; // &DoubleUpDo -> &DoubleUpDow - case 1866: state = 1867; break; // &DoubleUpDownArro -> &DoubleUpDownArrow - case 1886: state = 1887; break; // &DownArro -> &DownArrow - case 1892: state = 1893; break; // &Downarro -> &Downarrow - case 1900: state = 1901; break; // &downarro -> &downarrow - case 1912: state = 1913; break; // &DownArrowUpArro -> &DownArrowUpArrow - case 1922: state = 1923; break; // &downdo -> &downdow - case 1928: state = 1929; break; // &downdownarro -> &downdownarrow - case 2020: state = 2021; break; // &DownTeeArro -> &DownTeeArrow - case 2028: state = 2029; break; // &drbkaro -> &drbkarow - case 2689: state = 2690; break; // &fro -> &frow - case 3050: state = 3056; break; // &harr -> &harrw - case 3113: state = 3120; break; // &hks -> &hksw - case 3117: state = 3118; break; // &hksearo -> &hksearow - case 3123: state = 3124; break; // &hkswaro -> &hkswarow - case 3145: state = 3146; break; // &hookleftarro -> &hookleftarrow - case 3156: state = 3157; break; // &hookrightarro -> &hookrightarrow - case 3211: state = 3212; break; // &HumpDo -> &HumpDow - case 3916: state = 3917; break; // &LeftArro -> &LeftArrow - case 3922: state = 3923; break; // &Leftarro -> &Leftarrow - case 3930: state = 3931; break; // &leftarro -> &leftarrow - case 3945: state = 3946; break; // &LeftArrowRightArro -> &LeftArrowRightArrow - case 3962: state = 3975; break; // &LeftDo -> &LeftDow - case 4012: state = 4013; break; // &leftharpoondo -> &leftharpoondow - case 4026: state = 4027; break; // &leftleftarro -> &leftleftarrow - case 4038: state = 4039; break; // &LeftRightArro -> &LeftRightArrow - case 4049: state = 4050; break; // &Leftrightarro -> &Leftrightarrow - case 4060: state = 4061; break; // &leftrightarro -> &leftrightarrow - case 4082: state = 4083; break; // &leftrightsquigarro -> &leftrightsquigarrow - case 4099: state = 4100; break; // &LeftTeeArro -> &LeftTeeArrow - case 4141: state = 4142; break; // &LeftUpDo -> &LeftUpDow - case 4367: state = 4368; break; // &Lleftarro -> &Lleftarrow - case 4422: state = 4579; break; // &lo -> &low - case 4434: state = 4588; break; // &Lo -> &Low - case 4444: state = 4445; break; // &LongLeftArro -> &LongLeftArrow - case 4454: state = 4455; break; // &Longleftarro -> &Longleftarrow - case 4466: state = 4467; break; // &longleftarro -> &longleftarrow - case 4477: state = 4478; break; // &LongLeftRightArro -> &LongLeftRightArrow - case 4488: state = 4489; break; // &Longleftrightarro -> &Longleftrightarrow - case 4499: state = 4500; break; // &longleftrightarro -> &longleftrightarrow - case 4517: state = 4518; break; // &LongRightArro -> &LongRightArrow - case 4528: state = 4529; break; // &Longrightarro -> &Longrightarrow - case 4539: state = 4540; break; // &longrightarro -> &longrightarrow - case 4547: state = 4548; break; // &looparro -> &looparrow - case 4598: state = 4599; break; // &LowerLeftArro -> &LowerLeftArrow - case 4609: state = 4610; break; // &LowerRightArro -> &LowerRightArrow - case 4792: state = 4793; break; // &mapstodo -> &mapstodow - case 4965: state = 6111; break; // &n -> &nw - case 5077: state = 5078; break; // &nearro -> &nearrow - case 5084: state = 5176; break; // &Ne -> &New - case 5279: state = 5280; break; // &nLeftarro -> &nLeftarrow - case 5287: state = 5288; break; // &nleftarro -> &nleftarrow - case 5298: state = 5299; break; // &nLeftrightarro -> &nLeftrightarrow - case 5309: state = 5310; break; // &nleftrightarro -> &nleftrightarrow - case 5498: state = 5499; break; // &NotHumpDo -> &NotHumpDow - case 5862: state = 5866; break; // &nrarr -> &nrarrw - case 5876: state = 5877; break; // &nRightarro -> &nRightarrow - case 5886: state = 5887; break; // &nrightarro -> &nrightarrow - case 6123: state = 6124; break; // &nwarro -> &nwarrow - case 6603: state = 6604; break; // &plust -> &plustw - case 6932: state = 6966; break; // &rarr -> &rarrw - case 7190: state = 7191; break; // &RightArro -> &RightArrow - case 7196: state = 7197; break; // &Rightarro -> &Rightarrow - case 7206: state = 7207; break; // &rightarro -> &rightarrow - case 7220: state = 7221; break; // &RightArrowLeftArro -> &RightArrowLeftArrow - case 7237: state = 7250; break; // &RightDo -> &RightDow - case 7287: state = 7288; break; // &rightharpoondo -> &rightharpoondow - case 7301: state = 7302; break; // &rightleftarro -> &rightleftarrow - case 7322: state = 7323; break; // &rightrightarro -> &rightrightarrow - case 7334: state = 7335; break; // &rightsquigarro -> &rightsquigarrow - case 7344: state = 7345; break; // &RightTeeArro -> &RightTeeArrow - case 7386: state = 7387; break; // &RightUpDo -> &RightUpDow - case 7539: state = 7540; break; // &Rrightarro -> &Rrightarrow - case 7617: state = 8375; break; // &s -> &sw - case 7715: state = 7716; break; // &searro -> &searrow - case 7724: state = 7725; break; // &ses -> &sesw - case 7747: state = 7748; break; // &sfro -> &sfrow - case 7777: state = 7778; break; // &ShortDo -> &ShortDow - case 7783: state = 7784; break; // &ShortDownArro -> &ShortDownArrow - case 7793: state = 7794; break; // &ShortLeftArro -> &ShortLeftArrow - case 7820: state = 7821; break; // &ShortRightArro -> &ShortRightArrow - case 7828: state = 7829; break; // &ShortUpArro -> &ShortUpArrow - case 8387: state = 8388; break; // &swarro -> &swarrow - case 8390: state = 8391; break; // &swn -> &swnw - case 8404: state = 8737; break; // &t -> &tw - case 8641: state = 8642; break; // &triangledo -> &triangledow - case 8754: state = 8755; break; // &twoheadleftarro -> &twoheadleftarrow - case 8765: state = 8766; break; // &twoheadrightarro -> &twoheadrightarrow - case 8775: state = 9194; break; // &u -> &uw - case 8974: state = 8975; break; // &UpArro -> &UpArrow - case 8980: state = 8981; break; // &Uparro -> &Uparrow - case 8987: state = 8988; break; // &uparro -> &uparrow - case 8995: state = 8996; break; // &UpArrowDo -> &UpArrowDow - case 9001: state = 9002; break; // &UpArrowDownArro -> &UpArrowDownArrow - case 9005: state = 9006; break; // &UpDo -> &UpDow - case 9011: state = 9012; break; // &UpDownArro -> &UpDownArrow - case 9015: state = 9016; break; // &Updo -> &Updow - case 9021: state = 9022; break; // &Updownarro -> &Updownarrow - case 9025: state = 9026; break; // &updo -> &updow - case 9031: state = 9032; break; // &updownarro -> &updownarrow - case 9078: state = 9079; break; // &UpperLeftArro -> &UpperLeftArrow - case 9089: state = 9090; break; // &UpperRightArro -> &UpperRightArrow - case 9115: state = 9116; break; // &UpTeeArro -> &UpTeeArrow - case 9123: state = 9124; break; // &upuparro -> &upuparrow - case 9548: state = 9659; break; // &x -> &xw - case 9754: state = 9848; break; // &z -> &zw - default: return false; - } - break; - case 'x': - switch (state) { - case 0: state = 9548; break; // & -> &x - case 231: state = 232; break; // &appro -> &approx - case 598: state = 613; break; // &bo -> &box - case 615: state = 616; break; // &boxbo -> &boxbox - case 1154: state = 1160; break; // &comple -> &complex - case 1658: state = 1659; break; // &divon -> &divonx - case 2108: state = 2466; break; // &E -> &Ex - case 2115: state = 2458; break; // &e -> &ex - case 2838: state = 2839; break; // &gnappro -> &gnapprox - case 2970: state = 2971; break; // >rappro -> >rapprox - case 3273: state = 3277; break; // &ie -> &iex - case 4220: state = 4221; break; // &lessappro -> &lessapprox - case 4407: state = 4408; break; // &lnappro -> &lnapprox - case 4998: state = 4999; break; // &nappro -> &napprox - case 5064: state = 5182; break; // &ne -> &nex - case 5414: state = 5433; break; // &NotE -> &NotEx - case 6661: state = 6662; break; // &precappro -> &precapprox - case 6710: state = 6711; break; // &precnappro -> &precnapprox - case 6876: state = 7608; break; // &r -> &rx - case 7703: state = 7738; break; // &se -> &sex - case 8205: state = 8206; break; // &succappro -> &succapprox - case 8254: state = 8255; break; // &succnappro -> &succnapprox - case 8500: state = 8501; break; // &thickappro -> &thickapprox - case 8738: state = 8739; break; // &twi -> &twix - default: return false; - } - break; - case 'y': - switch (state) { - case 0: state = 9672; break; // & -> &y - case 27: state = 48; break; // &ac -> &acy - case 33: state = 46; break; // &Ac -> &Acy - case 82: state = 83; break; // &alefs -> &alefsy - case 218: state = 219; break; // &Appl -> &Apply - case 251: state = 262; break; // &as -> &asy - case 369: state = 377; break; // &bc -> &bcy - case 374: state = 375; break; // &Bc -> &Bcy - case 401: state = 402; break; // &bempt -> &bempty - case 790: state = 855; break; // &Ca -> &Cay - case 796: state = 1419; break; // &c -> &cy - case 857: state = 858; break; // &Cayle -> &Cayley - case 929: state = 930; break; // &cempt -> &cempty - case 957: state = 958; break; // &CHc -> &CHcy - case 961: state = 962; break; // &chc -> &chcy - case 1097: state = 1098; break; // &CloseCurl -> &CloseCurly - case 1203: state = 1221; break; // &cop -> © - case 1353: state = 1354; break; // &curl -> &curly - case 1422: state = 1423; break; // &cylct -> &cylcty - case 1474: state = 1486; break; // &Dc -> &Dcy - case 1480: state = 1488; break; // &dc -> &dcy - case 1531: state = 1532; break; // &dempt -> &dempty - case 1662: state = 1663; break; // &DJc -> &DJcy - case 1666: state = 1667; break; // &djc -> &djcy - case 2045: state = 2052; break; // &dsc -> &dscy - case 2049: state = 2050; break; // &DSc -> &DScy - case 2094: state = 2095; break; // &DZc -> &DZcy - case 2098: state = 2099; break; // &dzc -> &dzcy - case 2127: state = 2153; break; // &Ec -> &Ecy - case 2133: state = 2155; break; // &ec -> &ecy - case 2239: state = 2240; break; // &empt -> &empty - case 2247: state = 2248; break; // &Empt -> &Empty - case 2265: state = 2266; break; // &EmptyVer -> &EmptyVery - case 2518: state = 2519; break; // &Fc -> &Fcy - case 2521: state = 2522; break; // &fc -> &fcy - case 2573: state = 2574; break; // &FilledVer -> &FilledVery - case 2736: state = 2751; break; // &Gc -> &Gcy - case 2746: state = 2753; break; // &gc -> &gcy - case 2817: state = 2818; break; // &GJc -> &GJcy - case 2821: state = 2822; break; // &gjc -> &gjcy - case 3020: state = 3225; break; // &h -> &hy - case 3038: state = 3039; break; // &HARDc -> &HARDcy - case 3043: state = 3044; break; // &hardc -> &hardcy - case 3250: state = 3263; break; // &ic -> &icy - case 3252: state = 3261; break; // &Ic -> &Icy - case 3270: state = 3271; break; // &IEc -> &IEcy - case 3274: state = 3275; break; // &iec -> &iecy - case 3348: state = 3349; break; // &Imaginar -> &Imaginary - case 3464: state = 3465; break; // &IOc -> &IOcy - case 3468: state = 3469; break; // &ioc -> &iocy - case 3541: state = 3542; break; // &Iukc -> &Iukcy - case 3546: state = 3547; break; // &iukc -> &iukcy - case 3556: state = 3567; break; // &Jc -> &Jcy - case 3562: state = 3569; break; // &jc -> &jcy - case 3600: state = 3601; break; // &Jserc -> &Jsercy - case 3605: state = 3606; break; // &jserc -> &jsercy - case 3610: state = 3611; break; // &Jukc -> &Jukcy - case 3615: state = 3616; break; // &jukc -> &jukcy - case 3632: state = 3644; break; // &Kc -> &Kcy - case 3638: state = 3646; break; // &kc -> &kcy - case 3661: state = 3662; break; // &KHc -> &KHcy - case 3665: state = 3666; break; // &khc -> &khcy - case 3669: state = 3670; break; // &KJc -> &KJcy - case 3673: state = 3674; break; // &kjc -> &kjcy - case 3714: state = 3715; break; // &laempt -> &laempty - case 3837: state = 3865; break; // &Lc -> &Lcy - case 3843: state = 3867; break; // &lc -> &lcy - case 4339: state = 4340; break; // &LJc -> &LJcy - case 4343: state = 4344; break; // &ljc -> &ljcy - case 4809: state = 4818; break; // &mc -> &mcy - case 4815: state = 4816; break; // &Mc -> &Mcy - case 5020: state = 5057; break; // &nc -> &ncy - case 5024: state = 5055; break; // &Nc -> &Ncy - case 5123: state = 5124; break; // &NegativeVer -> &NegativeVery - case 5249: state = 5250; break; // &NJc -> &NJcy - case 5253: state = 5254; break; // &njc -> &njcy - case 6148: state = 6161; break; // &oc -> &ocy - case 6152: state = 6159; break; // &Oc -> &Ocy - case 6312: state = 6313; break; // &OpenCurl -> &OpenCurly - case 6491: state = 6492; break; // &Pc -> &Pcy - case 6494: state = 6495; break; // &pc -> &pcy - case 6667: state = 6668; break; // &preccurl -> &preccurly - case 6904: state = 6905; break; // &raempt -> &raempty - case 7021: state = 7049; break; // &Rc -> &Rcy - case 7027: state = 7051; break; // &rc -> &rcy - case 7596: state = 7597; break; // &RuleDela -> &RuleDelay - case 7629: state = 7691; break; // &Sc -> &Scy - case 7631: state = 7693; break; // &sc -> &scy - case 7751: state = 7831; break; // &sh -> ­ - case 7759: state = 7760; break; // &SHCHc -> &SHCHcy - case 7762: state = 7770; break; // &shc -> &shcy - case 7764: state = 7765; break; // &shchc -> &shchcy - case 7767: state = 7768; break; // &SHc -> &SHcy - case 7933: state = 7934; break; // &SOFTc -> &SOFTcy - case 7939: state = 7940; break; // &softc -> &softcy - case 8211: state = 8212; break; // &succcurl -> &succcurly - case 8419: state = 8441; break; // &Tc -> &Tcy - case 8425: state = 8443; break; // &tc -> &tcy - case 8487: state = 8488; break; // &thetas -> &thetasy - case 8710: state = 8717; break; // &tsc -> &tscy - case 8714: state = 8715; break; // &TSc -> &TScy - case 8720: state = 8721; break; // &TSHc -> &TSHcy - case 8724: state = 8725; break; // &tshc -> &tshcy - case 8799: state = 8800; break; // &Ubrc -> &Ubrcy - case 8804: state = 8805; break; // &ubrc -> &ubrcy - case 8815: state = 8825; break; // &Uc -> &Ucy - case 8820: state = 8827; break; // &uc -> &ucy - case 9314: state = 9315; break; // &Vc -> &Vcy - case 9317: state = 9318; break; // &vc -> &vcy - case 9360: state = 9403; break; // &Ver -> &Very - case 9674: state = 9683; break; // &yac -> &yacy - case 9680: state = 9681; break; // &YAc -> &YAcy - case 9685: state = 9695; break; // &Yc -> &Ycy - case 9690: state = 9697; break; // &yc -> &ycy - case 9709: state = 9710; break; // &YIc -> &YIcy - case 9713: state = 9714; break; // &yic -> &yicy - case 9733: state = 9734; break; // &YUc -> &YUcy - case 9737: state = 9738; break; // &yuc -> &yucy - case 9761: state = 9773; break; // &Zc -> &Zcy - case 9767: state = 9775; break; // &zc -> &zcy - case 9818: state = 9819; break; // &ZHc -> &ZHcy - case 9822: state = 9823; break; // &zhc -> &zhcy - default: return false; - } - break; - case 'z': - switch (state) { - case 0: state = 9754; break; // & -> &z - case 136: state = 178; break; // &ang -> &angz - case 524: state = 525; break; // &blacklo -> &blackloz - case 1432: state = 2097; break; // &d -> &dz - case 3172: state = 3173; break; // &Hori -> &Horiz - case 4422: state = 4612; break; // &lo -> &loz - case 7617: state = 8395; break; // &s -> &sz - case 8699: state = 8700; break; // &trpe -> &trpez - case 9201: state = 9477; break; // &v -> &vz - case 9479: state = 9480; break; // &vzig -> &vzigz - default: return false; - } - break; + case '1': table = TransitionTable_1; break; + case '2': table = TransitionTable_2; break; + case '3': table = TransitionTable_3; break; + case '4': table = TransitionTable_4; break; + case '5': table = TransitionTable_5; break; + case '6': table = TransitionTable_6; break; + case '7': table = TransitionTable_7; break; + case '8': table = TransitionTable_8; break; + case ';': table = TransitionTable_semicolon; break; + case 'A': table = TransitionTable_A; break; + case 'B': table = TransitionTable_B; break; + case 'C': table = TransitionTable_C; break; + case 'D': table = TransitionTable_D; break; + case 'E': table = TransitionTable_E; break; + case 'F': table = TransitionTable_F; break; + case 'G': table = TransitionTable_G; break; + case 'H': table = TransitionTable_H; break; + case 'I': table = TransitionTable_I; break; + case 'J': table = TransitionTable_J; break; + case 'K': table = TransitionTable_K; break; + case 'L': table = TransitionTable_L; break; + case 'M': table = TransitionTable_M; break; + case 'N': table = TransitionTable_N; break; + case 'O': table = TransitionTable_O; break; + case 'P': table = TransitionTable_P; break; + case 'Q': table = TransitionTable_Q; break; + case 'R': table = TransitionTable_R; break; + case 'S': table = TransitionTable_S; break; + case 'T': table = TransitionTable_T; break; + case 'U': table = TransitionTable_U; break; + case 'V': table = TransitionTable_V; break; + case 'W': table = TransitionTable_W; break; + case 'X': table = TransitionTable_X; break; + case 'Y': table = TransitionTable_Y; break; + case 'Z': table = TransitionTable_Z; break; + case 'a': table = TransitionTable_a; break; + case 'b': table = TransitionTable_b; break; + case 'c': table = TransitionTable_c; break; + case 'd': table = TransitionTable_d; break; + case 'e': table = TransitionTable_e; break; + case 'f': table = TransitionTable_f; break; + case 'g': table = TransitionTable_g; break; + case 'h': table = TransitionTable_h; break; + case 'i': table = TransitionTable_i; break; + case 'j': table = TransitionTable_j; break; + case 'k': table = TransitionTable_k; break; + case 'l': table = TransitionTable_l; break; + case 'm': table = TransitionTable_m; break; + case 'n': table = TransitionTable_n; break; + case 'o': table = TransitionTable_o; break; + case 'p': table = TransitionTable_p; break; + case 'q': table = TransitionTable_q; break; + case 'r': table = TransitionTable_r; break; + case 's': table = TransitionTable_s; break; + case 't': table = TransitionTable_t; break; + case 'u': table = TransitionTable_u; break; + case 'v': table = TransitionTable_v; break; + case 'w': table = TransitionTable_w; break; + case 'x': table = TransitionTable_x; break; + case 'y': table = TransitionTable_y; break; + case 'z': table = TransitionTable_z; break; default: return false; } - states[index] = state; + if ((next = BinarySearchNextState (table, state)) == -1) + return false; + + states[index] = next; pushed[index] = c; index++; return true; } - static string GetNamedEntityValue (int state) - { - switch (state) { - case 6: return "\u00C1"; // Á - case 7: return "\u00C1"; // Á - case 13: return "\u00E1"; // á - case 14: return "\u00E1"; // á - case 20: return "\u0102"; // Ă - case 26: return "\u0103"; // ă - case 28: return "\u223E"; // ∾ - case 30: return "\u223F"; // ∿ - case 32: return "\u223E\u0333"; // ∾̳ - case 36: return "\u00C2"; //  - case 37: return "\u00C2"; //  - case 40: return "\u00E2"; // â - case 41: return "\u00E2"; // â - case 44: return "\u00B4"; // ´ - case 45: return "\u00B4"; // ´ - case 47: return "\u0410"; // А - case 49: return "\u0430"; // а - case 53: return "\u00C6"; // Æ - case 54: return "\u00C6"; // Æ - case 58: return "\u00E6"; // æ - case 59: return "\u00E6"; // æ - case 61: return "\u2061"; // ⁡ - case 64: return "\uD835\uDD04"; // 𝔄 - case 66: return "\uD835\uDD1E"; // 𝔞 - case 71: return "\u00C0"; // À - case 72: return "\u00C0"; // À - case 77: return "\u00E0"; // à - case 78: return "\u00E0"; // à - case 85: return "\u2135"; // ℵ - case 88: return "\u2135"; // ℵ - case 93: return "\u0391"; // Α - case 97: return "\u03B1"; // α - case 102: return "\u0100"; // Ā - case 107: return "\u0101"; // ā - case 110: return "\u2A3F"; // ⨿ - case 112: return "\u0026"; // & - case 113: return "\u0026"; // & - case 114: return "\u0026"; // & - case 115: return "\u0026"; // & - case 118: return "\u2A53"; // ⩓ - case 121: return "\u2227"; // ∧ - case 125: return "\u2A55"; // ⩕ - case 127: return "\u2A5C"; // ⩜ - case 133: return "\u2A58"; // ⩘ - case 135: return "\u2A5A"; // ⩚ - case 137: return "\u2220"; // ∠ - case 139: return "\u29A4"; // ⦤ - case 142: return "\u2220"; // ∠ - case 146: return "\u2221"; // ∡ - case 149: return "\u29A8"; // ⦨ - case 151: return "\u29A9"; // ⦩ - case 153: return "\u29AA"; // ⦪ - case 155: return "\u29AB"; // ⦫ - case 157: return "\u29AC"; // ⦬ - case 159: return "\u29AD"; // ⦭ - case 161: return "\u29AE"; // ⦮ - case 163: return "\u29AF"; // ⦯ - case 166: return "\u221F"; // ∟ - case 169: return "\u22BE"; // ⊾ - case 171: return "\u299D"; // ⦝ - case 175: return "\u2222"; // ∢ - case 177: return "\u00C5"; // Å - case 182: return "\u237C"; // ⍼ - case 187: return "\u0104"; // Ą - case 192: return "\u0105"; // ą - case 195: return "\uD835\uDD38"; // 𝔸 - case 198: return "\uD835\uDD52"; // 𝕒 - case 200: return "\u2248"; // ≈ - case 205: return "\u2A6F"; // ⩯ - case 207: return "\u2A70"; // ⩰ - case 209: return "\u224A"; // ≊ - case 212: return "\u224B"; // ≋ - case 215: return "\u0027"; // ' - case 228: return "\u2061"; // ⁡ - case 233: return "\u2248"; // ≈ - case 236: return "\u224A"; // ≊ - case 240: return "\u00C5"; // Å - case 241: return "\u00C5"; // Å - case 245: return "\u00E5"; // å - case 246: return "\u00E5"; // å - case 250: return "\uD835\uDC9C"; // 𝒜 - case 254: return "\uD835\uDCB6"; // 𝒶 - case 259: return "\u2254"; // ≔ - case 261: return "\u002A"; // * - case 265: return "\u2248"; // ≈ - case 268: return "\u224D"; // ≍ - case 273: return "\u00C3"; // à - case 274: return "\u00C3"; // à - case 279: return "\u00E3"; // ã - case 280: return "\u00E3"; // ã - case 283: return "\u00C4"; // Ä - case 284: return "\u00C4"; // Ä - case 287: return "\u00E4"; // ä - case 288: return "\u00E4"; // ä - case 296: return "\u2233"; // ∳ - case 300: return "\u2A11"; // ⨑ - case 309: return "\u224C"; // ≌ - case 317: return "\u03F6"; // ϶ - case 323: return "\u2035"; // ‵ - case 327: return "\u223D"; // ∽ - case 330: return "\u22CD"; // ⋍ - case 340: return "\u2216"; // ∖ - case 343: return "\u2AE7"; // ⫧ - case 348: return "\u22BD"; // ⊽ - case 352: return "\u2306"; // ⌆ - case 356: return "\u2305"; // ⌅ - case 359: return "\u2305"; // ⌅ - case 363: return "\u23B5"; // ⎵ - case 368: return "\u23B6"; // ⎶ - case 373: return "\u224C"; // ≌ - case 376: return "\u0411"; // Б - case 378: return "\u0431"; // б - case 383: return "\u201E"; // „ - case 389: return "\u2235"; // ∵ - case 396: return "\u2235"; // ∵ - case 398: return "\u2235"; // ∵ - case 404: return "\u29B0"; // ⦰ - case 408: return "\u03F6"; // ϶ - case 413: return "\u212C"; // ℬ - case 422: return "\u212C"; // ℬ - case 425: return "\u0392"; // Β - case 428: return "\u03B2"; // β - case 430: return "\u2136"; // ℶ - case 435: return "\u226C"; // ≬ - case 438: return "\uD835\uDD05"; // 𝔅 - case 441: return "\uD835\uDD1F"; // 𝔟 - case 447: return "\u22C2"; // ⋂ - case 451: return "\u25EF"; // ◯ - case 454: return "\u22C3"; // ⋃ - case 459: return "\u2A00"; // ⨀ - case 464: return "\u2A01"; // ⨁ - case 470: return "\u2A02"; // ⨂ - case 476: return "\u2A06"; // ⨆ - case 480: return "\u2605"; // ★ - case 493: return "\u25BD"; // ▽ - case 496: return "\u25B3"; // △ - case 502: return "\u2A04"; // ⨄ - case 506: return "\u22C1"; // ⋁ - case 512: return "\u22C0"; // ⋀ - case 518: return "\u290D"; // ⤍ - case 530: return "\u29EB"; // ⧫ - case 537: return "\u25AA"; // ▪ - case 546: return "\u25B4"; // ▴ - case 551: return "\u25BE"; // ▾ - case 556: return "\u25C2"; // ◂ - case 562: return "\u25B8"; // ▸ - case 565: return "\u2423"; // ␣ - case 569: return "\u2592"; // ▒ - case 571: return "\u2591"; // ░ - case 574: return "\u2593"; // ▓ - case 578: return "\u2588"; // █ - case 581: return "\u003D\u20E5"; // =⃥ - case 586: return "\u2261\u20E5"; // ≡⃥ - case 590: return "\u2AED"; // ⫭ - case 593: return "\u2310"; // ⌐ - case 597: return "\uD835\uDD39"; // 𝔹 - case 601: return "\uD835\uDD53"; // 𝕓 - case 603: return "\u22A5"; // ⊥ - case 607: return "\u22A5"; // ⊥ - case 612: return "\u22C8"; // ⋈ - case 617: return "\u29C9"; // ⧉ - case 620: return "\u2557"; // ╗ - case 622: return "\u2556"; // ╖ - case 625: return "\u2555"; // ╕ - case 627: return "\u2510"; // ┐ - case 629: return "\u2554"; // ╔ - case 631: return "\u2553"; // ╓ - case 633: return "\u2552"; // ╒ - case 635: return "\u250C"; // ┌ - case 637: return "\u2550"; // ═ - case 639: return "\u2500"; // ─ - case 641: return "\u2566"; // ╦ - case 643: return "\u2564"; // ╤ - case 645: return "\u2565"; // ╥ - case 647: return "\u252C"; // ┬ - case 649: return "\u2569"; // ╩ - case 651: return "\u2567"; // ╧ - case 653: return "\u2568"; // ╨ - case 655: return "\u2534"; // ┴ - case 661: return "\u229F"; // ⊟ - case 666: return "\u229E"; // ⊞ - case 672: return "\u22A0"; // ⊠ - case 675: return "\u255D"; // ╝ - case 677: return "\u255C"; // ╜ - case 680: return "\u255B"; // ╛ - case 682: return "\u2518"; // ┘ - case 684: return "\u255A"; // ╚ - case 686: return "\u2559"; // ╙ - case 688: return "\u2558"; // ╘ - case 690: return "\u2514"; // └ - case 692: return "\u2551"; // ║ - case 694: return "\u2502"; // │ - case 696: return "\u256C"; // ╬ - case 698: return "\u256B"; // ╫ - case 700: return "\u256A"; // ╪ - case 702: return "\u253C"; // ┼ - case 704: return "\u2563"; // ╣ - case 706: return "\u2562"; // ╢ - case 708: return "\u2561"; // ╡ - case 710: return "\u2524"; // ┤ - case 712: return "\u2560"; // ╠ - case 714: return "\u255F"; // ╟ - case 716: return "\u255E"; // ╞ - case 718: return "\u251C"; // ├ - case 724: return "\u2035"; // ‵ - case 729: return "\u02D8"; // ˘ - case 734: return "\u02D8"; // ˘ - case 738: return "\u00A6"; // ¦ - case 739: return "\u00A6"; // ¦ - case 743: return "\u212C"; // ℬ - case 747: return "\uD835\uDCB7"; // 𝒷 - case 751: return "\u204F"; // ⁏ - case 754: return "\u223D"; // ∽ - case 756: return "\u22CD"; // ⋍ - case 759: return "\u005C"; // \ - case 761: return "\u29C5"; // ⧅ - case 766: return "\u27C8"; // ⟈ - case 770: return "\u2022"; // • - case 773: return "\u2022"; // • - case 776: return "\u224E"; // ≎ - case 778: return "\u2AAE"; // ⪮ - case 780: return "\u224F"; // ≏ - case 786: return "\u224E"; // ≎ - case 788: return "\u224F"; // ≏ - case 795: return "\u0106"; // Ć - case 802: return "\u0107"; // ć - case 804: return "\u22D2"; // ⋒ - case 806: return "\u2229"; // ∩ - case 810: return "\u2A44"; // ⩄ - case 816: return "\u2A49"; // ⩉ - case 820: return "\u2A4B"; // ⩋ - case 823: return "\u2A47"; // ⩇ - case 827: return "\u2A40"; // ⩀ - case 845: return "\u2145"; // ⅅ - case 847: return "\u2229\uFE00"; // ∩︀ - case 851: return "\u2041"; // ⁁ - case 854: return "\u02C7"; // ˇ - case 860: return "\u212D"; // ℭ - case 865: return "\u2A4D"; // ⩍ - case 871: return "\u010C"; // Č - case 875: return "\u010D"; // č - case 879: return "\u00C7"; // Ç - case 880: return "\u00C7"; // Ç - case 884: return "\u00E7"; // ç - case 885: return "\u00E7"; // ç - case 889: return "\u0108"; // Ĉ - case 893: return "\u0109"; // ĉ - case 899: return "\u2230"; // ∰ - case 903: return "\u2A4C"; // ⩌ - case 906: return "\u2A50"; // ⩐ - case 910: return "\u010A"; // Ċ - case 914: return "\u010B"; // ċ - case 918: return "\u00B8"; // ¸ - case 919: return "\u00B8"; // ¸ - case 926: return "\u00B8"; // ¸ - case 932: return "\u29B2"; // ⦲ - case 934: return "\u00A2"; // ¢ - case 935: return "\u00A2"; // ¢ - case 943: return "\u00B7"; // · - case 949: return "\u00B7"; // · - case 952: return "\u212D"; // ℭ - case 955: return "\uD835\uDD20"; // 𝔠 - case 959: return "\u0427"; // Ч - case 963: return "\u0447"; // ч - case 967: return "\u2713"; // ✓ - case 972: return "\u2713"; // ✓ - case 975: return "\u03A7"; // Χ - case 977: return "\u03C7"; // χ - case 980: return "\u25CB"; // ○ - case 982: return "\u02C6"; // ˆ - case 985: return "\u2257"; // ≗ - case 997: return "\u21BA"; // ↺ - case 1003: return "\u21BB"; // ↻ - case 1008: return "\u229B"; // ⊛ - case 1013: return "\u229A"; // ⊚ - case 1018: return "\u229D"; // ⊝ - case 1027: return "\u2299"; // ⊙ - case 1029: return "\u00AE"; // ® - case 1031: return "\u24C8"; // Ⓢ - case 1037: return "\u2296"; // ⊖ - case 1042: return "\u2295"; // ⊕ - case 1048: return "\u2297"; // ⊗ - case 1050: return "\u29C3"; // ⧃ - case 1052: return "\u2257"; // ≗ - case 1058: return "\u2A10"; // ⨐ - case 1062: return "\u2AEF"; // ⫯ - case 1067: return "\u29C2"; // ⧂ - case 1091: return "\u2232"; // ∲ - case 1110: return "\u201D"; // ” - case 1116: return "\u2019"; // ’ - case 1121: return "\u2663"; // ♣ - case 1125: return "\u2663"; // ♣ - case 1130: return "\u2237"; // ∷ - case 1135: return "\u003A"; // : - case 1137: return "\u2A74"; // ⩴ - case 1139: return "\u2254"; // ≔ - case 1141: return "\u2254"; // ≔ - case 1145: return "\u002C"; // , - case 1147: return "\u0040"; // @ - case 1149: return "\u2201"; // ∁ - case 1152: return "\u2218"; // ∘ - case 1159: return "\u2201"; // ∁ - case 1163: return "\u2102"; // ℂ - case 1166: return "\u2245"; // ≅ - case 1170: return "\u2A6D"; // ⩭ - case 1178: return "\u2261"; // ≡ - case 1182: return "\u222F"; // ∯ - case 1186: return "\u222E"; // ∮ - case 1199: return "\u222E"; // ∮ - case 1202: return "\u2102"; // ℂ - case 1205: return "\uD835\uDD54"; // 𝕔 - case 1209: return "\u2210"; // ∐ - case 1216: return "\u2210"; // ∐ - case 1219: return "\u00A9"; // © - case 1220: return "\u00A9"; // © - case 1221: return "\u00A9"; // © - case 1222: return "\u00A9"; // © - case 1225: return "\u2117"; // ℗ - case 1255: return "\u2233"; // ∳ - case 1260: return "\u21B5"; // ↵ - case 1265: return "\u2A2F"; // ⨯ - case 1269: return "\u2717"; // ✗ - case 1273: return "\uD835\uDC9E"; // 𝒞 - case 1277: return "\uD835\uDCB8"; // 𝒸 - case 1280: return "\u2ACF"; // ⫏ - case 1282: return "\u2AD1"; // ⫑ - case 1284: return "\u2AD0"; // ⫐ - case 1286: return "\u2AD2"; // ⫒ - case 1291: return "\u22EF"; // ⋯ - case 1298: return "\u2938"; // ⤸ - case 1300: return "\u2935"; // ⤵ - case 1304: return "\u22DE"; // ⋞ - case 1307: return "\u22DF"; // ⋟ - case 1312: return "\u21B6"; // ↶ - case 1314: return "\u293D"; // ⤽ - case 1317: return "\u22D3"; // ⋓ - case 1319: return "\u222A"; // ∪ - case 1325: return "\u2A48"; // ⩈ - case 1329: return "\u224D"; // ≍ - case 1333: return "\u2A46"; // ⩆ - case 1336: return "\u2A4A"; // ⩊ - case 1340: return "\u228D"; // ⊍ - case 1343: return "\u2A45"; // ⩅ - case 1345: return "\u222A\uFE00"; // ∪︀ - case 1350: return "\u21B7"; // ↷ - case 1352: return "\u293C"; // ⤼ - case 1361: return "\u22DE"; // ⋞ - case 1366: return "\u22DF"; // ⋟ - case 1370: return "\u22CE"; // ⋎ - case 1376: return "\u22CF"; // ⋏ - case 1379: return "\u00A4"; // ¤ - case 1380: return "\u00A4"; // ¤ - case 1392: return "\u21B6"; // ↶ - case 1398: return "\u21B7"; // ↷ - case 1402: return "\u22CE"; // ⋎ - case 1406: return "\u22CF"; // ⋏ - case 1414: return "\u2232"; // ∲ - case 1418: return "\u2231"; // ∱ - case 1424: return "\u232D"; // ⌭ - case 1431: return "\u2021"; // ‡ - case 1438: return "\u2020"; // † - case 1443: return "\u2138"; // ℸ - case 1446: return "\u21A1"; // ↡ - case 1450: return "\u21D3"; // ⇓ - case 1453: return "\u2193"; // ↓ - case 1456: return "\u2010"; // ‐ - case 1460: return "\u2AE4"; // ⫤ - case 1462: return "\u22A3"; // ⊣ - case 1469: return "\u290F"; // ⤏ - case 1473: return "\u02DD"; // ˝ - case 1479: return "\u010E"; // Ď - case 1485: return "\u010F"; // ď - case 1487: return "\u0414"; // Д - case 1489: return "\u0434"; // д - case 1491: return "\u2145"; // ⅅ - case 1493: return "\u2146"; // ⅆ - case 1499: return "\u2021"; // ‡ - case 1502: return "\u21CA"; // ⇊ - case 1509: return "\u2911"; // ⤑ - case 1515: return "\u2A77"; // ⩷ - case 1517: return "\u00B0"; // ° - case 1518: return "\u00B0"; // ° - case 1521: return "\u2207"; // ∇ - case 1524: return "\u0394"; // Δ - case 1528: return "\u03B4"; // δ - case 1534: return "\u29B1"; // ⦱ - case 1540: return "\u297F"; // ⥿ - case 1543: return "\uD835\uDD07"; // 𝔇 - case 1545: return "\uD835\uDD21"; // 𝔡 - case 1549: return "\u2965"; // ⥥ - case 1554: return "\u21C3"; // ⇃ - case 1556: return "\u21C2"; // ⇂ - case 1572: return "\u00B4"; // ´ - case 1576: return "\u02D9"; // ˙ - case 1586: return "\u02DD"; // ˝ - case 1592: return "\u0060"; // ` - case 1598: return "\u02DC"; // ˜ - case 1602: return "\u22C4"; // ⋄ - case 1607: return "\u22C4"; // ⋄ - case 1611: return "\u22C4"; // ⋄ - case 1616: return "\u2666"; // ♦ - case 1618: return "\u2666"; // ♦ - case 1620: return "\u00A8"; // ¨ - case 1632: return "\u2146"; // ⅆ - case 1638: return "\u03DD"; // ϝ - case 1642: return "\u22F2"; // ⋲ - case 1644: return "\u00F7"; // ÷ - case 1647: return "\u00F7"; // ÷ - case 1648: return "\u00F7"; // ÷ - case 1656: return "\u22C7"; // ⋇ - case 1660: return "\u22C7"; // ⋇ - case 1664: return "\u0402"; // Ђ - case 1668: return "\u0452"; // ђ - case 1674: return "\u231E"; // ⌞ - case 1678: return "\u230D"; // ⌍ - case 1684: return "\u0024"; // $ - case 1688: return "\uD835\uDD3B"; // 𝔻 - case 1691: return "\uD835\uDD55"; // 𝕕 - case 1693: return "\u00A8"; // ¨ - case 1695: return "\u02D9"; // ˙ - case 1699: return "\u20DC"; // ⃜ - case 1702: return "\u2250"; // ≐ - case 1706: return "\u2251"; // ≑ - case 1712: return "\u2250"; // ≐ - case 1718: return "\u2238"; // ∸ - case 1723: return "\u2214"; // ∔ - case 1730: return "\u22A1"; // ⊡ - case 1743: return "\u2306"; // ⌆ - case 1763: return "\u222F"; // ∯ - case 1767: return "\u00A8"; // ¨ - case 1775: return "\u21D3"; // ⇓ - case 1785: return "\u21D0"; // ⇐ - case 1796: return "\u21D4"; // ⇔ - case 1800: return "\u2AE4"; // ⫤ - case 1813: return "\u27F8"; // ⟸ - case 1824: return "\u27FA"; // ⟺ - case 1835: return "\u27F9"; // ⟹ - case 1846: return "\u21D2"; // ⇒ - case 1850: return "\u22A8"; // ⊨ - case 1858: return "\u21D1"; // ⇑ - case 1868: return "\u21D5"; // ⇕ - case 1880: return "\u2225"; // ∥ - case 1888: return "\u2193"; // ↓ - case 1894: return "\u21D3"; // ⇓ - case 1902: return "\u2193"; // ↓ - case 1906: return "\u2913"; // ⤓ - case 1914: return "\u21F5"; // ⇵ - case 1920: return "\u0311"; // ̑ - case 1931: return "\u21CA"; // ⇊ - case 1943: return "\u21C3"; // ⇃ - case 1949: return "\u21C2"; // ⇂ - case 1965: return "\u2950"; // ⥐ - case 1975: return "\u295E"; // ⥞ - case 1982: return "\u21BD"; // ↽ - case 1986: return "\u2956"; // ⥖ - case 2001: return "\u295F"; // ⥟ - case 2008: return "\u21C1"; // ⇁ - case 2012: return "\u2957"; // ⥗ - case 2016: return "\u22A4"; // ⊤ - case 2022: return "\u21A7"; // ↧ - case 2030: return "\u2910"; // ⤐ - case 2035: return "\u231F"; // ⌟ - case 2039: return "\u230C"; // ⌌ - case 2043: return "\uD835\uDC9F"; // 𝒟 - case 2047: return "\uD835\uDCB9"; // 𝒹 - case 2051: return "\u0405"; // Ѕ - case 2053: return "\u0455"; // ѕ - case 2056: return "\u29F6"; // ⧶ - case 2061: return "\u0110"; // Đ - case 2066: return "\u0111"; // đ - case 2071: return "\u22F1"; // ⋱ - case 2074: return "\u25BF"; // ▿ - case 2076: return "\u25BE"; // ▾ - case 2081: return "\u21F5"; // ⇵ - case 2085: return "\u296F"; // ⥯ - case 2092: return "\u29A6"; // ⦦ - case 2096: return "\u040F"; // Џ - case 2100: return "\u045F"; // џ - case 2107: return "\u27FF"; // ⟿ - case 2113: return "\u00C9"; // É - case 2114: return "\u00C9"; // É - case 2120: return "\u00E9"; // é - case 2121: return "\u00E9"; // é - case 2126: return "\u2A6E"; // ⩮ - case 2132: return "\u011A"; // Ě - case 2138: return "\u011B"; // ě - case 2141: return "\u2256"; // ≖ - case 2144: return "\u00CA"; // Ê - case 2145: return "\u00CA"; // Ê - case 2146: return "\u00EA"; // ê - case 2147: return "\u00EA"; // ê - case 2152: return "\u2255"; // ≕ - case 2154: return "\u042D"; // Э - case 2156: return "\u044D"; // э - case 2161: return "\u2A77"; // ⩷ - case 2165: return "\u0116"; // Ė - case 2168: return "\u2251"; // ≑ - case 2172: return "\u0117"; // ė - case 2174: return "\u2147"; // ⅇ - case 2179: return "\u2252"; // ≒ - case 2182: return "\uD835\uDD08"; // 𝔈 - case 2184: return "\uD835\uDD22"; // 𝔢 - case 2186: return "\u2A9A"; // ⪚ - case 2191: return "\u00C8"; // È - case 2192: return "\u00C8"; // È - case 2196: return "\u00E8"; // è - case 2197: return "\u00E8"; // è - case 2199: return "\u2A96"; // ⪖ - case 2203: return "\u2A98"; // ⪘ - case 2205: return "\u2A99"; // ⪙ - case 2212: return "\u2208"; // ∈ - case 2219: return "\u23E7"; // ⏧ - case 2221: return "\u2113"; // ℓ - case 2223: return "\u2A95"; // ⪕ - case 2227: return "\u2A97"; // ⪗ - case 2232: return "\u0112"; // Ē - case 2237: return "\u0113"; // ē - case 2241: return "\u2205"; // ∅ - case 2245: return "\u2205"; // ∅ - case 2260: return "\u25FB"; // ◻ - case 2262: return "\u2205"; // ∅ - case 2278: return "\u25AB"; // ▫ - case 2281: return "\u2003"; //   - case 2284: return "\u2004"; //   - case 2286: return "\u2005"; //   - case 2289: return "\u014A"; // Ŋ - case 2292: return "\u014B"; // ŋ - case 2295: return "\u2002"; //   - case 2300: return "\u0118"; // Ę - case 2305: return "\u0119"; // ę - case 2308: return "\uD835\uDD3C"; // 𝔼 - case 2311: return "\uD835\uDD56"; // 𝕖 - case 2315: return "\u22D5"; // ⋕ - case 2318: return "\u29E3"; // ⧣ - case 2322: return "\u2A71"; // ⩱ - case 2325: return "\u03B5"; // ε - case 2332: return "\u0395"; // Ε - case 2336: return "\u03B5"; // ε - case 2338: return "\u03F5"; // ϵ - case 2344: return "\u2256"; // ≖ - case 2349: return "\u2255"; // ≕ - case 2353: return "\u2242"; // ≂ - case 2361: return "\u2A96"; // ⪖ - case 2366: return "\u2A95"; // ⪕ - case 2371: return "\u2A75"; // ⩵ - case 2376: return "\u003D"; // = - case 2382: return "\u2242"; // ≂ - case 2386: return "\u225F"; // ≟ - case 2395: return "\u21CC"; // ⇌ - case 2398: return "\u2261"; // ≡ - case 2401: return "\u2A78"; // ⩸ - case 2408: return "\u29E5"; // ⧥ - case 2413: return "\u2971"; // ⥱ - case 2417: return "\u2253"; // ≓ - case 2421: return "\u2130"; // ℰ - case 2425: return "\u212F"; // ℯ - case 2429: return "\u2250"; // ≐ - case 2432: return "\u2A73"; // ⩳ - case 2435: return "\u2242"; // ≂ - case 2438: return "\u0397"; // Η - case 2441: return "\u03B7"; // η - case 2443: return "\u00D0"; // Ð - case 2444: return "\u00D0"; // Ð - case 2445: return "\u00F0"; // ð - case 2446: return "\u00F0"; // ð - case 2449: return "\u00CB"; // Ë - case 2450: return "\u00CB"; // Ë - case 2453: return "\u00EB"; // ë - case 2454: return "\u00EB"; // ë - case 2457: return "\u20AC"; // € - case 2461: return "\u0021"; // ! - case 2465: return "\u2203"; // ∃ - case 2471: return "\u2203"; // ∃ - case 2481: return "\u2130"; // ℰ - case 2492: return "\u2147"; // ⅇ - case 2502: return "\u2147"; // ⅇ - case 2516: return "\u2252"; // ≒ - case 2520: return "\u0424"; // Ф - case 2523: return "\u0444"; // ф - case 2529: return "\u2640"; // ♀ - case 2535: return "\uFB03"; // ffi - case 2539: return "\uFB00"; // ff - case 2543: return "\uFB04"; // ffl - case 2546: return "\uD835\uDD09"; // 𝔉 - case 2548: return "\uD835\uDD23"; // 𝔣 - case 2553: return "\uFB01"; // fi - case 2570: return "\u25FC"; // ◼ - case 2586: return "\u25AA"; // ▪ - case 2591: return "\u0066\u006A"; // fj - case 2595: return "\u266D"; // ♭ - case 2599: return "\uFB02"; // fl - case 2603: return "\u25B1"; // ▱ - case 2607: return "\u0192"; // ƒ - case 2611: return "\uD835\uDD3D"; // 𝔽 - case 2615: return "\uD835\uDD57"; // 𝕗 - case 2620: return "\u2200"; // ∀ - case 2625: return "\u2200"; // ∀ - case 2627: return "\u22D4"; // ⋔ - case 2629: return "\u2AD9"; // ⫙ - case 2638: return "\u2131"; // ℱ - case 2646: return "\u2A0D"; // ⨍ - case 2651: return "\u00BD"; // ½ - case 2652: return "\u00BD"; // ½ - case 2654: return "\u2153"; // ⅓ - case 2655: return "\u00BC"; // ¼ - case 2656: return "\u00BC"; // ¼ - case 2658: return "\u2155"; // ⅕ - case 2660: return "\u2159"; // ⅙ - case 2662: return "\u215B"; // ⅛ - case 2665: return "\u2154"; // ⅔ - case 2667: return "\u2156"; // ⅖ - case 2669: return "\u00BE"; // ¾ - case 2670: return "\u00BE"; // ¾ - case 2672: return "\u2157"; // ⅗ - case 2674: return "\u215C"; // ⅜ - case 2677: return "\u2158"; // ⅘ - case 2680: return "\u215A"; // ⅚ - case 2682: return "\u215D"; // ⅝ - case 2685: return "\u215E"; // ⅞ - case 2688: return "\u2044"; // ⁄ - case 2692: return "\u2322"; // ⌢ - case 2696: return "\u2131"; // ℱ - case 2700: return "\uD835\uDCBB"; // 𝒻 - case 2707: return "\u01F5"; // ǵ - case 2713: return "\u0393"; // Γ - case 2717: return "\u03B3"; // γ - case 2719: return "\u03DC"; // Ϝ - case 2721: return "\u03DD"; // ϝ - case 2723: return "\u2A86"; // ⪆ - case 2729: return "\u011E"; // Ğ - case 2735: return "\u011F"; // ğ - case 2741: return "\u0122"; // Ģ - case 2745: return "\u011C"; // Ĝ - case 2750: return "\u011D"; // ĝ - case 2752: return "\u0413"; // Г - case 2754: return "\u0433"; // г - case 2758: return "\u0120"; // Ġ - case 2762: return "\u0121"; // ġ - case 2764: return "\u2267"; // ≧ - case 2766: return "\u2265"; // ≥ - case 2768: return "\u2A8C"; // ⪌ - case 2770: return "\u22DB"; // ⋛ - case 2772: return "\u2265"; // ≥ - case 2774: return "\u2267"; // ≧ - case 2780: return "\u2A7E"; // ⩾ - case 2782: return "\u2A7E"; // ⩾ - case 2785: return "\u2AA9"; // ⪩ - case 2789: return "\u2A80"; // ⪀ - case 2791: return "\u2A82"; // ⪂ - case 2793: return "\u2A84"; // ⪄ - case 2795: return "\u22DB\uFE00"; // ⋛︀ - case 2798: return "\u2A94"; // ⪔ - case 2801: return "\uD835\uDD0A"; // 𝔊 - case 2804: return "\uD835\uDD24"; // 𝔤 - case 2806: return "\u22D9"; // ⋙ - case 2808: return "\u226B"; // ≫ - case 2810: return "\u22D9"; // ⋙ - case 2815: return "\u2137"; // ℷ - case 2819: return "\u0403"; // Ѓ - case 2823: return "\u0453"; // ѓ - case 2825: return "\u2277"; // ≷ - case 2827: return "\u2AA5"; // ⪥ - case 2829: return "\u2A92"; // ⪒ - case 2831: return "\u2AA4"; // ⪤ - case 2835: return "\u2A8A"; // ⪊ - case 2840: return "\u2A8A"; // ⪊ - case 2842: return "\u2269"; // ≩ - case 2844: return "\u2A88"; // ⪈ - case 2846: return "\u2A88"; // ⪈ - case 2848: return "\u2269"; // ≩ - case 2852: return "\u22E7"; // ⋧ - case 2856: return "\uD835\uDD3E"; // 𝔾 - case 2860: return "\uD835\uDD58"; // 𝕘 - case 2865: return "\u0060"; // ` - case 2877: return "\u2265"; // ≥ - case 2882: return "\u22DB"; // ⋛ - case 2892: return "\u2267"; // ≧ - case 2900: return "\u2AA2"; // ⪢ - case 2905: return "\u2277"; // ≷ - case 2916: return "\u2A7E"; // ⩾ - case 2922: return "\u2273"; // ≳ - case 2926: return "\uD835\uDCA2"; // 𝒢 - case 2930: return "\u210A"; // ℊ - case 2933: return "\u2273"; // ≳ - case 2935: return "\u2A8E"; // ⪎ - case 2937: return "\u2A90"; // ⪐ - case 2938: return "\u003E"; // > - case 2939: return "\u003E"; // > - case 2941: return "\u226B"; // ≫ - case 2942: return "\u003E"; // > - case 2943: return "\u003E"; // > - case 2946: return "\u2AA7"; // ⪧ - case 2949: return "\u2A7A"; // ⩺ - case 2953: return "\u22D7"; // ⋗ - case 2958: return "\u2995"; // ⦕ - case 2964: return "\u2A7C"; // ⩼ - case 2972: return "\u2A86"; // ⪆ - case 2975: return "\u2978"; // ⥸ - case 2979: return "\u22D7"; // ⋗ - case 2986: return "\u22DB"; // ⋛ - case 2992: return "\u2A8C"; // ⪌ - case 2997: return "\u2277"; // ≷ - case 3001: return "\u2273"; // ≳ - case 3010: return "\u2269\uFE00"; // ≩︀ - case 3013: return "\u2269\uFE00"; // ≩︀ - case 3019: return "\u02C7"; // ˇ - case 3026: return "\u200A"; //   - case 3029: return "\u00BD"; // ½ - case 3034: return "\u210B"; // ℋ - case 3040: return "\u042A"; // Ъ - case 3045: return "\u044A"; // ъ - case 3049: return "\u21D4"; // ⇔ - case 3051: return "\u2194"; // ↔ - case 3055: return "\u2948"; // ⥈ - case 3057: return "\u21AD"; // ↭ - case 3059: return "\u005E"; // ^ - case 3063: return "\u210F"; // ℏ - case 3068: return "\u0124"; // Ĥ - case 3073: return "\u0125"; // ĥ - case 3079: return "\u2665"; // ♥ - case 3083: return "\u2665"; // ♥ - case 3088: return "\u2026"; // … - case 3093: return "\u22B9"; // ⊹ - case 3096: return "\u210C"; // ℌ - case 3099: return "\uD835\uDD25"; // 𝔥 - case 3111: return "\u210B"; // ℋ - case 3119: return "\u2925"; // ⤥ - case 3125: return "\u2926"; // ⤦ - case 3130: return "\u21FF"; // ⇿ - case 3135: return "\u223B"; // ∻ - case 3147: return "\u21A9"; // ↩ - case 3158: return "\u21AA"; // ↪ - case 3162: return "\u210D"; // ℍ - case 3165: return "\uD835\uDD59"; // 𝕙 - case 3170: return "\u2015"; // ― - case 3183: return "\u2500"; // ─ - case 3187: return "\u210B"; // ℋ - case 3191: return "\uD835\uDCBD"; // 𝒽 - case 3196: return "\u210F"; // ℏ - case 3201: return "\u0126"; // Ħ - case 3206: return "\u0127"; // ħ - case 3218: return "\u224E"; // ≎ - case 3224: return "\u224F"; // ≏ - case 3230: return "\u2043"; // ⁃ - case 3235: return "\u2010"; // ‐ - case 3241: return "\u00CD"; // Í - case 3242: return "\u00CD"; // Í - case 3248: return "\u00ED"; // í - case 3249: return "\u00ED"; // í - case 3251: return "\u2063"; // ⁣ - case 3255: return "\u00CE"; // Î - case 3256: return "\u00CE"; // Î - case 3259: return "\u00EE"; // î - case 3260: return "\u00EE"; // î - case 3262: return "\u0418"; // И - case 3264: return "\u0438"; // и - case 3268: return "\u0130"; // İ - case 3272: return "\u0415"; // Е - case 3276: return "\u0435"; // е - case 3279: return "\u00A1"; // ¡ - case 3280: return "\u00A1"; // ¡ - case 3283: return "\u21D4"; // ⇔ - case 3286: return "\u2111"; // ℑ - case 3288: return "\uD835\uDD26"; // 𝔦 - case 3293: return "\u00CC"; // Ì - case 3294: return "\u00CC"; // Ì - case 3299: return "\u00EC"; // ì - case 3300: return "\u00EC"; // ì - case 3302: return "\u2148"; // ⅈ - case 3307: return "\u2A0C"; // ⨌ - case 3310: return "\u222D"; // ∭ - case 3315: return "\u29DC"; // ⧜ - case 3319: return "\u2129"; // ℩ - case 3324: return "\u0132"; // IJ - case 3329: return "\u0133"; // ij - case 3331: return "\u2111"; // ℑ - case 3335: return "\u012A"; // Ī - case 3340: return "\u012B"; // ī - case 3343: return "\u2111"; // ℑ - case 3351: return "\u2148"; // ⅈ - case 3356: return "\u2110"; // ℐ - case 3361: return "\u2111"; // ℑ - case 3364: return "\u0131"; // ı - case 3367: return "\u22B7"; // ⊷ - case 3371: return "\u01B5"; // Ƶ - case 3377: return "\u21D2"; // ⇒ - case 3379: return "\u2208"; // ∈ - case 3384: return "\u2105"; // ℅ - case 3388: return "\u221E"; // ∞ - case 3392: return "\u29DD"; // ⧝ - case 3397: return "\u0131"; // ı - case 3400: return "\u222C"; // ∬ - case 3402: return "\u222B"; // ∫ - case 3406: return "\u22BA"; // ⊺ - case 3412: return "\u2124"; // ℤ - case 3418: return "\u222B"; // ∫ - case 3423: return "\u22BA"; // ⊺ - case 3432: return "\u22C2"; // ⋂ - case 3438: return "\u2A17"; // ⨗ - case 3443: return "\u2A3C"; // ⨼ - case 3456: return "\u2063"; // ⁣ - case 3462: return "\u2062"; // ⁢ - case 3466: return "\u0401"; // Ё - case 3470: return "\u0451"; // ё - case 3475: return "\u012E"; // Į - case 3479: return "\u012F"; // į - case 3482: return "\uD835\uDD40"; // 𝕀 - case 3485: return "\uD835\uDD5A"; // 𝕚 - case 3488: return "\u0399"; // Ι - case 3491: return "\u03B9"; // ι - case 3496: return "\u2A3C"; // ⨼ - case 3501: return "\u00BF"; // ¿ - case 3502: return "\u00BF"; // ¿ - case 3506: return "\u2110"; // ℐ - case 3510: return "\uD835\uDCBE"; // 𝒾 - case 3513: return "\u2208"; // ∈ - case 3517: return "\u22F5"; // ⋵ - case 3519: return "\u22F9"; // ⋹ - case 3521: return "\u22F4"; // ⋴ - case 3523: return "\u22F3"; // ⋳ - case 3525: return "\u2208"; // ∈ - case 3527: return "\u2062"; // ⁢ - case 3533: return "\u0128"; // Ĩ - case 3538: return "\u0129"; // ĩ - case 3543: return "\u0406"; // І - case 3548: return "\u0456"; // і - case 3550: return "\u00CF"; // Ï - case 3551: return "\u00CF"; // Ï - case 3553: return "\u00EF"; // ï - case 3554: return "\u00EF"; // ï - case 3560: return "\u0134"; // Ĵ - case 3566: return "\u0135"; // ĵ - case 3568: return "\u0419"; // Й - case 3570: return "\u0439"; // й - case 3573: return "\uD835\uDD0D"; // 𝔍 - case 3576: return "\uD835\uDD27"; // 𝔧 - case 3581: return "\u0237"; // ȷ - case 3585: return "\uD835\uDD41"; // 𝕁 - case 3589: return "\uD835\uDD5B"; // 𝕛 - case 3593: return "\uD835\uDCA5"; // 𝒥 - case 3597: return "\uD835\uDCBF"; // 𝒿 - case 3602: return "\u0408"; // Ј - case 3607: return "\u0458"; // ј - case 3612: return "\u0404"; // Є - case 3617: return "\u0454"; // є - case 3623: return "\u039A"; // Κ - case 3629: return "\u03BA"; // κ - case 3631: return "\u03F0"; // ϰ - case 3637: return "\u0136"; // Ķ - case 3643: return "\u0137"; // ķ - case 3645: return "\u041A"; // К - case 3647: return "\u043A"; // к - case 3650: return "\uD835\uDD0E"; // 𝔎 - case 3653: return "\uD835\uDD28"; // 𝔨 - case 3659: return "\u0138"; // ĸ - case 3663: return "\u0425"; // Х - case 3667: return "\u0445"; // х - case 3671: return "\u040C"; // Ќ - case 3675: return "\u045C"; // ќ - case 3679: return "\uD835\uDD42"; // 𝕂 - case 3683: return "\uD835\uDD5C"; // 𝕜 - case 3687: return "\uD835\uDCA6"; // 𝒦 - case 3691: return "\uD835\uDCC0"; // 𝓀 - case 3697: return "\u21DA"; // ⇚ - case 3704: return "\u0139"; // Ĺ - case 3710: return "\u013A"; // ĺ - case 3717: return "\u29B4"; // ⦴ - case 3722: return "\u2112"; // ℒ - case 3727: return "\u039B"; // Λ - case 3732: return "\u03BB"; // λ - case 3735: return "\u27EA"; // ⟪ - case 3738: return "\u27E8"; // ⟨ - case 3740: return "\u2991"; // ⦑ - case 3743: return "\u27E8"; // ⟨ - case 3745: return "\u2A85"; // ⪅ - case 3754: return "\u2112"; // ℒ - case 3757: return "\u00AB"; // « - case 3758: return "\u00AB"; // « - case 3761: return "\u219E"; // ↞ - case 3764: return "\u21D0"; // ⇐ - case 3767: return "\u2190"; // ← - case 3769: return "\u21E4"; // ⇤ - case 3772: return "\u291F"; // ⤟ - case 3775: return "\u291D"; // ⤝ - case 3778: return "\u21A9"; // ↩ - case 3781: return "\u21AB"; // ↫ - case 3784: return "\u2939"; // ⤹ - case 3788: return "\u2973"; // ⥳ - case 3791: return "\u21A2"; // ↢ - case 3793: return "\u2AAB"; // ⪫ - case 3798: return "\u291B"; // ⤛ - case 3802: return "\u2919"; // ⤙ - case 3804: return "\u2AAD"; // ⪭ - case 3806: return "\u2AAD\uFE00"; // ⪭︀ - case 3811: return "\u290E"; // ⤎ - case 3816: return "\u290C"; // ⤌ - case 3820: return "\u2772"; // ❲ - case 3825: return "\u007B"; // { - case 3827: return "\u005B"; // [ - case 3830: return "\u298B"; // ⦋ - case 3834: return "\u298F"; // ⦏ - case 3836: return "\u298D"; // ⦍ - case 3842: return "\u013D"; // Ľ - case 3848: return "\u013E"; // ľ - case 3853: return "\u013B"; // Ļ - case 3858: return "\u013C"; // ļ - case 3861: return "\u2308"; // ⌈ - case 3864: return "\u007B"; // { - case 3866: return "\u041B"; // Л - case 3868: return "\u043B"; // л - case 3872: return "\u2936"; // ⤶ - case 3876: return "\u201C"; // “ - case 3878: return "\u201E"; // „ - case 3884: return "\u2967"; // ⥧ - case 3890: return "\u294B"; // ⥋ - case 3893: return "\u21B2"; // ↲ - case 3895: return "\u2266"; // ≦ - case 3897: return "\u2264"; // ≤ - case 3913: return "\u27E8"; // ⟨ - case 3918: return "\u2190"; // ← - case 3924: return "\u21D0"; // ⇐ - case 3932: return "\u2190"; // ← - case 3936: return "\u21E4"; // ⇤ - case 3947: return "\u21C6"; // ⇆ - case 3952: return "\u21A2"; // ↢ - case 3960: return "\u2308"; // ⌈ - case 3974: return "\u27E6"; // ⟦ - case 3986: return "\u2961"; // ⥡ - case 3993: return "\u21C3"; // ⇃ - case 3997: return "\u2959"; // ⥙ - case 4003: return "\u230A"; // ⌊ - case 4015: return "\u21BD"; // ↽ - case 4018: return "\u21BC"; // ↼ - case 4029: return "\u21C7"; // ⇇ - case 4040: return "\u2194"; // ↔ - case 4051: return "\u21D4"; // ⇔ - case 4062: return "\u2194"; // ↔ - case 4064: return "\u21C6"; // ⇆ - case 4073: return "\u21CB"; // ⇋ - case 4084: return "\u21AD"; // ↭ - case 4091: return "\u294E"; // ⥎ - case 4095: return "\u22A3"; // ⊣ - case 4101: return "\u21A4"; // ↤ - case 4108: return "\u295A"; // ⥚ - case 4119: return "\u22CB"; // ⋋ - case 4127: return "\u22B2"; // ⊲ - case 4131: return "\u29CF"; // ⧏ - case 4137: return "\u22B4"; // ⊴ - case 4150: return "\u2951"; // ⥑ - case 4160: return "\u2960"; // ⥠ - case 4167: return "\u21BF"; // ↿ - case 4171: return "\u2958"; // ⥘ - case 4178: return "\u21BC"; // ↼ - case 4182: return "\u2952"; // ⥒ - case 4184: return "\u2A8B"; // ⪋ - case 4186: return "\u22DA"; // ⋚ - case 4188: return "\u2264"; // ≤ - case 4190: return "\u2266"; // ≦ - case 4196: return "\u2A7D"; // ⩽ - case 4198: return "\u2A7D"; // ⩽ - case 4201: return "\u2AA8"; // ⪨ - case 4205: return "\u2A7F"; // ⩿ - case 4207: return "\u2A81"; // ⪁ - case 4209: return "\u2A83"; // ⪃ - case 4211: return "\u22DA\uFE00"; // ⋚︀ - case 4214: return "\u2A93"; // ⪓ - case 4222: return "\u2A85"; // ⪅ - case 4226: return "\u22D6"; // ⋖ - case 4232: return "\u22DA"; // ⋚ - case 4237: return "\u2A8B"; // ⪋ - case 4252: return "\u22DA"; // ⋚ - case 4262: return "\u2266"; // ≦ - case 4270: return "\u2276"; // ≶ - case 4274: return "\u2276"; // ≶ - case 4279: return "\u2AA1"; // ⪡ - case 4283: return "\u2272"; // ≲ - case 4294: return "\u2A7D"; // ⩽ - case 4300: return "\u2272"; // ≲ - case 4306: return "\u297C"; // ⥼ - case 4311: return "\u230A"; // ⌊ - case 4314: return "\uD835\uDD0F"; // 𝔏 - case 4316: return "\uD835\uDD29"; // 𝔩 - case 4318: return "\u2276"; // ≶ - case 4320: return "\u2A91"; // ⪑ - case 4324: return "\u2962"; // ⥢ - case 4329: return "\u21BD"; // ↽ - case 4331: return "\u21BC"; // ↼ - case 4333: return "\u296A"; // ⥪ - case 4337: return "\u2584"; // ▄ - case 4341: return "\u0409"; // Љ - case 4345: return "\u0459"; // љ - case 4347: return "\u22D8"; // ⋘ - case 4349: return "\u226A"; // ≪ - case 4353: return "\u21C7"; // ⇇ - case 4360: return "\u231E"; // ⌞ - case 4369: return "\u21DA"; // ⇚ - case 4374: return "\u296B"; // ⥫ - case 4378: return "\u25FA"; // ◺ - case 4384: return "\u013F"; // Ŀ - case 4390: return "\u0140"; // ŀ - case 4395: return "\u23B0"; // ⎰ - case 4400: return "\u23B0"; // ⎰ - case 4404: return "\u2A89"; // ⪉ - case 4409: return "\u2A89"; // ⪉ - case 4411: return "\u2268"; // ≨ - case 4413: return "\u2A87"; // ⪇ - case 4415: return "\u2A87"; // ⪇ - case 4417: return "\u2268"; // ≨ - case 4421: return "\u22E6"; // ⋦ - case 4426: return "\u27EC"; // ⟬ - case 4429: return "\u21FD"; // ⇽ - case 4433: return "\u27E6"; // ⟦ - case 4446: return "\u27F5"; // ⟵ - case 4456: return "\u27F8"; // ⟸ - case 4468: return "\u27F5"; // ⟵ - case 4479: return "\u27F7"; // ⟷ - case 4490: return "\u27FA"; // ⟺ - case 4501: return "\u27F7"; // ⟷ - case 4508: return "\u27FC"; // ⟼ - case 4519: return "\u27F6"; // ⟶ - case 4530: return "\u27F9"; // ⟹ - case 4541: return "\u27F6"; // ⟶ - case 4553: return "\u21AB"; // ↫ - case 4559: return "\u21AC"; // ↬ - case 4563: return "\u2985"; // ⦅ - case 4566: return "\uD835\uDD43"; // 𝕃 - case 4568: return "\uD835\uDD5D"; // 𝕝 - case 4572: return "\u2A2D"; // ⨭ - case 4578: return "\u2A34"; // ⨴ - case 4583: return "\u2217"; // ∗ - case 4587: return "\u005F"; // _ - case 4600: return "\u2199"; // ↙ - case 4611: return "\u2198"; // ↘ - case 4613: return "\u25CA"; // ◊ - case 4618: return "\u25CA"; // ◊ - case 4620: return "\u29EB"; // ⧫ - case 4624: return "\u0028"; // ( - case 4627: return "\u2993"; // ⦓ - case 4632: return "\u21C6"; // ⇆ - case 4639: return "\u231F"; // ⌟ - case 4643: return "\u21CB"; // ⇋ - case 4645: return "\u296D"; // ⥭ - case 4647: return "\u200E"; // ‎ - case 4651: return "\u22BF"; // ⊿ - case 4657: return "\u2039"; // ‹ - case 4661: return "\u2112"; // ℒ - case 4664: return "\uD835\uDCC1"; // 𝓁 - case 4666: return "\u21B0"; // ↰ - case 4668: return "\u21B0"; // ↰ - case 4671: return "\u2272"; // ≲ - case 4673: return "\u2A8D"; // ⪍ - case 4675: return "\u2A8F"; // ⪏ - case 4678: return "\u005B"; // [ - case 4681: return "\u2018"; // ‘ - case 4683: return "\u201A"; // ‚ - case 4688: return "\u0141"; // Ł - case 4693: return "\u0142"; // ł - case 4694: return "\u003C"; // < - case 4695: return "\u003C"; // < - case 4697: return "\u226A"; // ≪ - case 4698: return "\u003C"; // < - case 4699: return "\u003C"; // < - case 4702: return "\u2AA6"; // ⪦ - case 4705: return "\u2A79"; // ⩹ - case 4709: return "\u22D6"; // ⋖ - case 4714: return "\u22CB"; // ⋋ - case 4719: return "\u22C9"; // ⋉ - case 4724: return "\u2976"; // ⥶ - case 4730: return "\u2A7B"; // ⩻ - case 4733: return "\u25C3"; // ◃ - case 4735: return "\u22B4"; // ⊴ - case 4737: return "\u25C2"; // ◂ - case 4741: return "\u2996"; // ⦖ - case 4749: return "\u294A"; // ⥊ - case 4754: return "\u2966"; // ⥦ - case 4763: return "\u2268\uFE00"; // ≨︀ - case 4766: return "\u2268\uFE00"; // ≨︀ - case 4770: return "\u00AF"; // ¯ - case 4771: return "\u00AF"; // ¯ - case 4774: return "\u2642"; // ♂ - case 4776: return "\u2720"; // ✠ - case 4780: return "\u2720"; // ✠ - case 4784: return "\u2905"; // ⤅ - case 4786: return "\u21A6"; // ↦ - case 4790: return "\u21A6"; // ↦ - case 4795: return "\u21A7"; // ↧ - case 4800: return "\u21A4"; // ↤ - case 4803: return "\u21A5"; // ↥ - case 4808: return "\u25AE"; // ▮ - case 4814: return "\u2A29"; // ⨩ - case 4817: return "\u041C"; // М - case 4819: return "\u043C"; // м - case 4824: return "\u2014"; // — - case 4829: return "\u223A"; // ∺ - case 4842: return "\u2221"; // ∡ - case 4853: return "\u205F"; //   - case 4861: return "\u2133"; // ℳ - case 4864: return "\uD835\uDD10"; // 𝔐 - case 4867: return "\uD835\uDD2A"; // 𝔪 - case 4870: return "\u2127"; // ℧ - case 4874: return "\u00B5"; // µ - case 4875: return "\u00B5"; // µ - case 4877: return "\u2223"; // ∣ - case 4881: return "\u002A"; // * - case 4885: return "\u2AF0"; // ⫰ - case 4888: return "\u00B7"; // · - case 4889: return "\u00B7"; // · - case 4893: return "\u2212"; // − - case 4895: return "\u229F"; // ⊟ - case 4897: return "\u2238"; // ∸ - case 4899: return "\u2A2A"; // ⨪ - case 4908: return "\u2213"; // ∓ - case 4912: return "\u2ADB"; // ⫛ - case 4915: return "\u2026"; // … - case 4921: return "\u2213"; // ∓ - case 4927: return "\u22A7"; // ⊧ - case 4931: return "\uD835\uDD44"; // 𝕄 - case 4934: return "\uD835\uDD5E"; // 𝕞 - case 4936: return "\u2213"; // ∓ - case 4940: return "\u2133"; // ℳ - case 4944: return "\uD835\uDCC2"; // 𝓂 - case 4949: return "\u223E"; // ∾ - case 4951: return "\u039C"; // Μ - case 4953: return "\u03BC"; // μ - case 4960: return "\u22B8"; // ⊸ - case 4964: return "\u22B8"; // ⊸ - case 4970: return "\u2207"; // ∇ - case 4977: return "\u0143"; // Ń - case 4982: return "\u0144"; // ń - case 4985: return "\u2220\u20D2"; // ∠⃒ - case 4987: return "\u2249"; // ≉ - case 4989: return "\u2A70\u0338"; // ⩰̸ - case 4992: return "\u224B\u0338"; // ≋̸ - case 4995: return "\u0149"; // ʼn - case 5000: return "\u2249"; // ≉ - case 5004: return "\u266E"; // ♮ - case 5007: return "\u266E"; // ♮ - case 5009: return "\u2115"; // ℕ - case 5012: return "\u00A0"; //   - case 5013: return "\u00A0"; //   - case 5017: return "\u224E\u0338"; // ≎̸ - case 5019: return "\u224F\u0338"; // ≏̸ - case 5023: return "\u2A43"; // ⩃ - case 5029: return "\u0147"; // Ň - case 5033: return "\u0148"; // ň - case 5038: return "\u0145"; // Ņ - case 5043: return "\u0146"; // ņ - case 5047: return "\u2247"; // ≇ - case 5051: return "\u2A6D\u0338"; // ⩭̸ - case 5054: return "\u2A42"; // ⩂ - case 5056: return "\u041D"; // Н - case 5058: return "\u043D"; // н - case 5063: return "\u2013"; // – - case 5065: return "\u2260"; // ≠ - case 5070: return "\u2924"; // ⤤ - case 5074: return "\u21D7"; // ⇗ - case 5076: return "\u2197"; // ↗ - case 5079: return "\u2197"; // ↗ - case 5083: return "\u2250\u0338"; // ≐̸ - case 5102: return "\u200B"; // ​ - case 5113: return "\u200B"; // ​ - case 5120: return "\u200B"; // ​ - case 5134: return "\u200B"; // ​ - case 5139: return "\u2262"; // ≢ - case 5144: return "\u2928"; // ⤨ - case 5147: return "\u2242\u0338"; // ≂̸ - case 5166: return "\u226B"; // ≫ - case 5175: return "\u226A"; // ≪ - case 5181: return "\u000A"; // - case 5186: return "\u2204"; // ∄ - case 5188: return "\u2204"; // ∄ - case 5191: return "\uD835\uDD11"; // 𝔑 - case 5194: return "\uD835\uDD2B"; // 𝔫 - case 5197: return "\u2267\u0338"; // ≧̸ - case 5199: return "\u2271"; // ≱ - case 5201: return "\u2271"; // ≱ - case 5203: return "\u2267\u0338"; // ≧̸ - case 5209: return "\u2A7E\u0338"; // ⩾̸ - case 5211: return "\u2A7E\u0338"; // ⩾̸ - case 5214: return "\u22D9\u0338"; // ⋙̸ - case 5218: return "\u2275"; // ≵ - case 5220: return "\u226B\u20D2"; // ≫⃒ - case 5222: return "\u226F"; // ≯ - case 5224: return "\u226F"; // ≯ - case 5226: return "\u226B\u0338"; // ≫̸ - case 5231: return "\u21CE"; // ⇎ - case 5235: return "\u21AE"; // ↮ - case 5239: return "\u2AF2"; // ⫲ - case 5241: return "\u220B"; // ∋ - case 5243: return "\u22FC"; // ⋼ - case 5245: return "\u22FA"; // ⋺ - case 5247: return "\u220B"; // ∋ - case 5251: return "\u040A"; // Њ - case 5255: return "\u045A"; // њ - case 5260: return "\u21CD"; // ⇍ - case 5264: return "\u219A"; // ↚ - case 5267: return "\u2025"; // ‥ - case 5269: return "\u2266\u0338"; // ≦̸ - case 5271: return "\u2270"; // ≰ - case 5281: return "\u21CD"; // ⇍ - case 5289: return "\u219A"; // ↚ - case 5300: return "\u21CE"; // ⇎ - case 5311: return "\u21AE"; // ↮ - case 5313: return "\u2270"; // ≰ - case 5315: return "\u2266\u0338"; // ≦̸ - case 5321: return "\u2A7D\u0338"; // ⩽̸ - case 5323: return "\u2A7D\u0338"; // ⩽̸ - case 5325: return "\u226E"; // ≮ - case 5327: return "\u22D8\u0338"; // ⋘̸ - case 5331: return "\u2274"; // ≴ - case 5333: return "\u226A\u20D2"; // ≪⃒ - case 5335: return "\u226E"; // ≮ - case 5338: return "\u22EA"; // ⋪ - case 5340: return "\u22EC"; // ⋬ - case 5342: return "\u226A\u0338"; // ≪̸ - case 5346: return "\u2224"; // ∤ - case 5353: return "\u2060"; // ⁠ - case 5368: return "\u00A0"; //   - case 5371: return "\u2115"; // ℕ - case 5375: return "\uD835\uDD5F"; // 𝕟 - case 5377: return "\u2AEC"; // ⫬ - case 5378: return "\u00AC"; // ¬ - case 5379: return "\u00AC"; // ¬ - case 5389: return "\u2262"; // ≢ - case 5395: return "\u226D"; // ≭ - case 5413: return "\u2226"; // ∦ - case 5421: return "\u2209"; // ∉ - case 5426: return "\u2260"; // ≠ - case 5432: return "\u2242\u0338"; // ≂̸ - case 5438: return "\u2204"; // ∄ - case 5446: return "\u226F"; // ≯ - case 5452: return "\u2271"; // ≱ - case 5462: return "\u2267\u0338"; // ≧̸ - case 5470: return "\u226B\u0338"; // ≫̸ - case 5475: return "\u2279"; // ≹ - case 5486: return "\u2A7E\u0338"; // ⩾̸ - case 5492: return "\u2275"; // ≵ - case 5505: return "\u224E\u0338"; // ≎̸ - case 5511: return "\u224F\u0338"; // ≏̸ - case 5514: return "\u2209"; // ∉ - case 5518: return "\u22F5\u0338"; // ⋵̸ - case 5520: return "\u22F9\u0338"; // ⋹̸ - case 5523: return "\u2209"; // ∉ - case 5525: return "\u22F7"; // ⋷ - case 5527: return "\u22F6"; // ⋶ - case 5540: return "\u22EA"; // ⋪ - case 5544: return "\u29CF\u0338"; // ⧏̸ - case 5550: return "\u22EC"; // ⋬ - case 5553: return "\u226E"; // ≮ - case 5559: return "\u2270"; // ≰ - case 5567: return "\u2278"; // ≸ - case 5572: return "\u226A\u0338"; // ≪̸ - case 5583: return "\u2A7D\u0338"; // ⩽̸ - case 5589: return "\u2274"; // ≴ - case 5610: return "\u2AA2\u0338"; // ⪢̸ - case 5619: return "\u2AA1\u0338"; // ⪡̸ - case 5622: return "\u220C"; // ∌ - case 5625: return "\u220C"; // ∌ - case 5627: return "\u22FE"; // ⋾ - case 5629: return "\u22FD"; // ⋽ - case 5638: return "\u2280"; // ⊀ - case 5644: return "\u2AAF\u0338"; // ⪯̸ - case 5655: return "\u22E0"; // ⋠ - case 5670: return "\u220C"; // ∌ - case 5683: return "\u22EB"; // ⋫ - case 5687: return "\u29D0\u0338"; // ⧐̸ - case 5693: return "\u22ED"; // ⋭ - case 5706: return "\u228F\u0338"; // ⊏̸ - case 5712: return "\u22E2"; // ⋢ - case 5719: return "\u2290\u0338"; // ⊐̸ - case 5725: return "\u22E3"; // ⋣ - case 5731: return "\u2282\u20D2"; // ⊂⃒ - case 5737: return "\u2288"; // ⊈ - case 5744: return "\u2281"; // ⊁ - case 5750: return "\u2AB0\u0338"; // ⪰̸ - case 5761: return "\u22E1"; // ⋡ - case 5767: return "\u227F\u0338"; // ≿̸ - case 5774: return "\u2283\u20D2"; // ⊃⃒ - case 5780: return "\u2289"; // ⊉ - case 5786: return "\u2241"; // ≁ - case 5792: return "\u2244"; // ≄ - case 5802: return "\u2247"; // ≇ - case 5808: return "\u2249"; // ≉ - case 5820: return "\u2224"; // ∤ - case 5824: return "\u2226"; // ∦ - case 5830: return "\u2226"; // ∦ - case 5833: return "\u2AFD\u20E5"; // ⫽⃥ - case 5835: return "\u2202\u0338"; // ∂̸ - case 5841: return "\u2A14"; // ⨔ - case 5843: return "\u2280"; // ⊀ - case 5847: return "\u22E0"; // ⋠ - case 5849: return "\u2AAF\u0338"; // ⪯̸ - case 5851: return "\u2280"; // ⊀ - case 5854: return "\u2AAF\u0338"; // ⪯̸ - case 5859: return "\u21CF"; // ⇏ - case 5863: return "\u219B"; // ↛ - case 5865: return "\u2933\u0338"; // ⤳̸ - case 5867: return "\u219D\u0338"; // ↝̸ - case 5878: return "\u21CF"; // ⇏ - case 5888: return "\u219B"; // ↛ - case 5892: return "\u22EB"; // ⋫ - case 5894: return "\u22ED"; // ⋭ - case 5897: return "\u2281"; // ⊁ - case 5901: return "\u22E1"; // ⋡ - case 5903: return "\u2AB0\u0338"; // ⪰̸ - case 5907: return "\uD835\uDCA9"; // 𝒩 - case 5909: return "\uD835\uDCC3"; // 𝓃 - case 5917: return "\u2224"; // ∤ - case 5926: return "\u2226"; // ∦ - case 5929: return "\u2241"; // ≁ - case 5931: return "\u2244"; // ≄ - case 5933: return "\u2244"; // ≄ - case 5937: return "\u2224"; // ∤ - case 5941: return "\u2226"; // ∦ - case 5947: return "\u22E2"; // ⋢ - case 5950: return "\u22E3"; // ⋣ - case 5953: return "\u2284"; // ⊄ - case 5955: return "\u2AC5\u0338"; // ⫅̸ - case 5957: return "\u2288"; // ⊈ - case 5961: return "\u2282\u20D2"; // ⊂⃒ - case 5964: return "\u2288"; // ⊈ - case 5966: return "\u2AC5\u0338"; // ⫅̸ - case 5969: return "\u2281"; // ⊁ - case 5972: return "\u2AB0\u0338"; // ⪰̸ - case 5974: return "\u2285"; // ⊅ - case 5976: return "\u2AC6\u0338"; // ⫆̸ - case 5978: return "\u2289"; // ⊉ - case 5982: return "\u2283\u20D2"; // ⊃⃒ - case 5985: return "\u2289"; // ⊉ - case 5987: return "\u2AC6\u0338"; // ⫆̸ - case 5991: return "\u2279"; // ≹ - case 5996: return "\u00D1"; // Ñ - case 5997: return "\u00D1"; // Ñ - case 6001: return "\u00F1"; // ñ - case 6002: return "\u00F1"; // ñ - case 6005: return "\u2278"; // ≸ - case 6017: return "\u22EA"; // ⋪ - case 6020: return "\u22EC"; // ⋬ - case 6026: return "\u22EB"; // ⋫ - case 6029: return "\u22ED"; // ⋭ - case 6031: return "\u039D"; // Ν - case 6033: return "\u03BD"; // ν - case 6035: return "\u0023"; // # - case 6039: return "\u2116"; // № - case 6042: return "\u2007"; //   - case 6046: return "\u224D\u20D2"; // ≍⃒ - case 6052: return "\u22AF"; // ⊯ - case 6057: return "\u22AE"; // ⊮ - case 6062: return "\u22AD"; // ⊭ - case 6067: return "\u22AC"; // ⊬ - case 6070: return "\u2265\u20D2"; // ≥⃒ - case 6072: return "\u003E\u20D2"; // >⃒ - case 6077: return "\u2904"; // ⤄ - case 6083: return "\u29DE"; // ⧞ - case 6088: return "\u2902"; // ⤂ - case 6090: return "\u2264\u20D2"; // ≤⃒ - case 6092: return "\u003C\u20D2"; // <⃒ - case 6096: return "\u22B4\u20D2"; // ⊴⃒ - case 6101: return "\u2903"; // ⤃ - case 6106: return "\u22B5\u20D2"; // ⊵⃒ - case 6110: return "\u223C\u20D2"; // ∼⃒ - case 6116: return "\u2923"; // ⤣ - case 6120: return "\u21D6"; // ⇖ - case 6122: return "\u2196"; // ↖ - case 6125: return "\u2196"; // ↖ - case 6130: return "\u2927"; // ⤧ - case 6136: return "\u00D3"; // Ó - case 6137: return "\u00D3"; // Ó - case 6143: return "\u00F3"; // ó - case 6144: return "\u00F3"; // ó - case 6147: return "\u229B"; // ⊛ - case 6151: return "\u229A"; // ⊚ - case 6155: return "\u00D4"; // Ô - case 6156: return "\u00D4"; // Ô - case 6157: return "\u00F4"; // ô - case 6158: return "\u00F4"; // ô - case 6160: return "\u041E"; // О - case 6162: return "\u043E"; // о - case 6167: return "\u229D"; // ⊝ - case 6173: return "\u0150"; // Ő - case 6178: return "\u0151"; // ő - case 6181: return "\u2A38"; // ⨸ - case 6184: return "\u2299"; // ⊙ - case 6189: return "\u29BC"; // ⦼ - case 6194: return "\u0152"; // Œ - case 6199: return "\u0153"; // œ - case 6204: return "\u29BF"; // ⦿ - case 6207: return "\uD835\uDD12"; // 𝔒 - case 6209: return "\uD835\uDD2C"; // 𝔬 - case 6213: return "\u02DB"; // ˛ - case 6218: return "\u00D2"; // Ò - case 6219: return "\u00D2"; // Ò - case 6223: return "\u00F2"; // ò - case 6224: return "\u00F2"; // ò - case 6226: return "\u29C1"; // ⧁ - case 6231: return "\u29B5"; // ⦵ - case 6233: return "\u03A9"; // Ω - case 6237: return "\u222E"; // ∮ - case 6242: return "\u21BA"; // ↺ - case 6246: return "\u29BE"; // ⦾ - case 6251: return "\u29BB"; // ⦻ - case 6255: return "\u203E"; // ‾ - case 6257: return "\u29C0"; // ⧀ - case 6262: return "\u014C"; // Ō - case 6267: return "\u014D"; // ō - case 6271: return "\u03A9"; // Ω - case 6275: return "\u03C9"; // ω - case 6281: return "\u039F"; // Ο - case 6287: return "\u03BF"; // ο - case 6289: return "\u29B6"; // ⦶ - case 6293: return "\u2296"; // ⊖ - case 6297: return "\uD835\uDD46"; // 𝕆 - case 6301: return "\uD835\uDD60"; // 𝕠 - case 6305: return "\u29B7"; // ⦷ - case 6325: return "\u201C"; // “ - case 6331: return "\u2018"; // ‘ - case 6335: return "\u29B9"; // ⦹ - case 6339: return "\u2295"; // ⊕ - case 6341: return "\u2A54"; // ⩔ - case 6343: return "\u2228"; // ∨ - case 6347: return "\u21BB"; // ↻ - case 6349: return "\u2A5D"; // ⩝ - case 6352: return "\u2134"; // ℴ - case 6355: return "\u2134"; // ℴ - case 6356: return "\u00AA"; // ª - case 6357: return "\u00AA"; // ª - case 6358: return "\u00BA"; // º - case 6359: return "\u00BA"; // º - case 6364: return "\u22B6"; // ⊶ - case 6367: return "\u2A56"; // ⩖ - case 6373: return "\u2A57"; // ⩗ - case 6375: return "\u2A5B"; // ⩛ - case 6377: return "\u24C8"; // Ⓢ - case 6381: return "\uD835\uDCAA"; // 𝒪 - case 6385: return "\u2134"; // ℴ - case 6389: return "\u00D8"; // Ø - case 6390: return "\u00D8"; // Ø - case 6394: return "\u00F8"; // ø - case 6395: return "\u00F8"; // ø - case 6398: return "\u2298"; // ⊘ - case 6403: return "\u00D5"; // Õ - case 6404: return "\u00D5"; // Õ - case 6409: return "\u00F5"; // õ - case 6410: return "\u00F5"; // õ - case 6414: return "\u2A37"; // ⨷ - case 6418: return "\u2297"; // ⊗ - case 6421: return "\u2A36"; // ⨶ - case 6424: return "\u00D6"; // Ö - case 6425: return "\u00D6"; // Ö - case 6428: return "\u00F6"; // ö - case 6429: return "\u00F6"; // ö - case 6434: return "\u233D"; // ⌽ - case 6441: return "\u203E"; // ‾ - case 6446: return "\u23DE"; // ⏞ - case 6450: return "\u23B4"; // ⎴ - case 6462: return "\u23DC"; // ⏜ - case 6466: return "\u2225"; // ∥ - case 6467: return "\u00B6"; // ¶ - case 6468: return "\u00B6"; // ¶ - case 6473: return "\u2225"; // ∥ - case 6477: return "\u2AF3"; // ⫳ - case 6479: return "\u2AFD"; // ⫽ - case 6481: return "\u2202"; // ∂ - case 6490: return "\u2202"; // ∂ - case 6493: return "\u041F"; // П - case 6496: return "\u043F"; // п - case 6502: return "\u0025"; // % - case 6506: return "\u002E"; // . - case 6510: return "\u2030"; // ‰ - case 6512: return "\u22A5"; // ⊥ - case 6517: return "\u2031"; // ‱ - case 6520: return "\uD835\uDD13"; // 𝔓 - case 6523: return "\uD835\uDD2D"; // 𝔭 - case 6526: return "\u03A6"; // Φ - case 6529: return "\u03C6"; // φ - case 6531: return "\u03D5"; // ϕ - case 6536: return "\u2133"; // ℳ - case 6540: return "\u260E"; // ☎ - case 6542: return "\u03A0"; // Π - case 6544: return "\u03C0"; // π - case 6552: return "\u22D4"; // ⋔ - case 6554: return "\u03D6"; // ϖ - case 6560: return "\u210F"; // ℏ - case 6562: return "\u210E"; // ℎ - case 6565: return "\u210F"; // ℏ - case 6568: return "\u002B"; // + - case 6573: return "\u2A23"; // ⨣ - case 6575: return "\u229E"; // ⊞ - case 6579: return "\u2A22"; // ⨢ - case 6582: return "\u2214"; // ∔ - case 6584: return "\u2A25"; // ⨥ - case 6586: return "\u2A72"; // ⩲ - case 6595: return "\u00B1"; // ± - case 6597: return "\u00B1"; // ± - case 6598: return "\u00B1"; // ± - case 6602: return "\u2A26"; // ⨦ - case 6606: return "\u2A27"; // ⨧ - case 6608: return "\u00B1"; // ± - case 6621: return "\u210C"; // ℌ - case 6629: return "\u2A15"; // ⨕ - case 6632: return "\u2119"; // ℙ - case 6635: return "\uD835\uDD61"; // 𝕡 - case 6638: return "\u00A3"; // £ - case 6639: return "\u00A3"; // £ - case 6641: return "\u2ABB"; // ⪻ - case 6643: return "\u227A"; // ≺ - case 6646: return "\u2AB7"; // ⪷ - case 6650: return "\u227C"; // ≼ - case 6652: return "\u2AB3"; // ⪳ - case 6654: return "\u2AAF"; // ⪯ - case 6656: return "\u227A"; // ≺ - case 6663: return "\u2AB7"; // ⪷ - case 6671: return "\u227C"; // ≼ - case 6678: return "\u227A"; // ≺ - case 6684: return "\u2AAF"; // ⪯ - case 6695: return "\u227C"; // ≼ - case 6701: return "\u227E"; // ≾ - case 6704: return "\u2AAF"; // ⪯ - case 6712: return "\u2AB9"; // ⪹ - case 6716: return "\u2AB5"; // ⪵ - case 6720: return "\u22E8"; // ⋨ - case 6724: return "\u227E"; // ≾ - case 6728: return "\u2033"; // ″ - case 6732: return "\u2032"; // ′ - case 6734: return "\u2119"; // ℙ - case 6738: return "\u2AB9"; // ⪹ - case 6740: return "\u2AB5"; // ⪵ - case 6744: return "\u22E8"; // ⋨ - case 6747: return "\u220F"; // ∏ - case 6753: return "\u220F"; // ∏ - case 6759: return "\u232E"; // ⌮ - case 6764: return "\u2312"; // ⌒ - case 6769: return "\u2313"; // ⌓ - case 6771: return "\u221D"; // ∝ - case 6779: return "\u2237"; // ∷ - case 6782: return "\u221D"; // ∝ - case 6785: return "\u221D"; // ∝ - case 6789: return "\u227E"; // ≾ - case 6794: return "\u22B0"; // ⊰ - case 6798: return "\uD835\uDCAB"; // 𝒫 - case 6802: return "\uD835\uDCC5"; // 𝓅 - case 6804: return "\u03A8"; // Ψ - case 6806: return "\u03C8"; // ψ - case 6812: return "\u2008"; //   - case 6816: return "\uD835\uDD14"; // 𝔔 - case 6820: return "\uD835\uDD2E"; // 𝔮 - case 6824: return "\u2A0C"; // ⨌ - case 6828: return "\u211A"; // ℚ - case 6832: return "\uD835\uDD62"; // 𝕢 - case 6838: return "\u2057"; // ⁗ - case 6842: return "\uD835\uDCAC"; // 𝒬 - case 6846: return "\uD835\uDCC6"; // 𝓆 - case 6857: return "\u210D"; // ℍ - case 6861: return "\u2A16"; // ⨖ - case 6865: return "\u003F"; // ? - case 6868: return "\u225F"; // ≟ - case 6871: return "\u0022"; // " - case 6872: return "\u0022"; // " - case 6874: return "\u0022"; // " - case 6875: return "\u0022"; // " - case 6881: return "\u21DB"; // ⇛ - case 6885: return "\u223D\u0331"; // ∽̱ - case 6892: return "\u0154"; // Ŕ - case 6896: return "\u0155"; // ŕ - case 6900: return "\u221A"; // √ - case 6907: return "\u29B3"; // ⦳ - case 6910: return "\u27EB"; // ⟫ - case 6913: return "\u27E9"; // ⟩ - case 6915: return "\u2992"; // ⦒ - case 6917: return "\u29A5"; // ⦥ - case 6920: return "\u27E9"; // ⟩ - case 6923: return "\u00BB"; // » - case 6924: return "\u00BB"; // » - case 6927: return "\u21A0"; // ↠ - case 6930: return "\u21D2"; // ⇒ - case 6933: return "\u2192"; // → - case 6936: return "\u2975"; // ⥵ - case 6938: return "\u21E5"; // ⇥ - case 6941: return "\u2920"; // ⤠ - case 6943: return "\u2933"; // ⤳ - case 6946: return "\u291E"; // ⤞ - case 6949: return "\u21AA"; // ↪ - case 6952: return "\u21AC"; // ↬ - case 6955: return "\u2945"; // ⥅ - case 6959: return "\u2974"; // ⥴ - case 6962: return "\u2916"; // ⤖ - case 6965: return "\u21A3"; // ↣ - case 6967: return "\u219D"; // ↝ - case 6972: return "\u291C"; // ⤜ - case 6977: return "\u291A"; // ⤚ - case 6980: return "\u2236"; // ∶ - case 6985: return "\u211A"; // ℚ - case 6990: return "\u2910"; // ⤐ - case 6995: return "\u290F"; // ⤏ - case 7000: return "\u290D"; // ⤍ - case 7004: return "\u2773"; // ❳ - case 7009: return "\u007D"; // } - case 7011: return "\u005D"; // ] - case 7014: return "\u298C"; // ⦌ - case 7018: return "\u298E"; // ⦎ - case 7020: return "\u2990"; // ⦐ - case 7026: return "\u0158"; // Ř - case 7032: return "\u0159"; // ř - case 7037: return "\u0156"; // Ŗ - case 7042: return "\u0157"; // ŗ - case 7045: return "\u2309"; // ⌉ - case 7048: return "\u007D"; // } - case 7050: return "\u0420"; // Р - case 7052: return "\u0440"; // р - case 7056: return "\u2937"; // ⤷ - case 7062: return "\u2969"; // ⥩ - case 7066: return "\u201D"; // ” - case 7068: return "\u201D"; // ” - case 7071: return "\u21B3"; // ↳ - case 7073: return "\u211C"; // ℜ - case 7077: return "\u211C"; // ℜ - case 7081: return "\u211B"; // ℛ - case 7086: return "\u211C"; // ℜ - case 7088: return "\u211D"; // ℝ - case 7091: return "\u25AD"; // ▭ - case 7093: return "\u00AE"; // ® - case 7094: return "\u00AE"; // ® - case 7095: return "\u00AE"; // ® - case 7096: return "\u00AE"; // ® - case 7109: return "\u220B"; // ∋ - case 7120: return "\u21CB"; // ⇋ - case 7134: return "\u296F"; // ⥯ - case 7140: return "\u297D"; // ⥽ - case 7145: return "\u230B"; // ⌋ - case 7148: return "\u211C"; // ℜ - case 7150: return "\uD835\uDD2F"; // 𝔯 - case 7154: return "\u2964"; // ⥤ - case 7159: return "\u21C1"; // ⇁ - case 7161: return "\u21C0"; // ⇀ - case 7163: return "\u296C"; // ⥬ - case 7166: return "\u03A1"; // Ρ - case 7168: return "\u03C1"; // ρ - case 7170: return "\u03F1"; // ϱ - case 7187: return "\u27E9"; // ⟩ - case 7192: return "\u2192"; // → - case 7198: return "\u21D2"; // ⇒ - case 7208: return "\u2192"; // → - case 7212: return "\u21E5"; // ⇥ - case 7222: return "\u21C4"; // ⇄ - case 7227: return "\u21A3"; // ↣ - case 7235: return "\u2309"; // ⌉ - case 7249: return "\u27E7"; // ⟧ - case 7261: return "\u295D"; // ⥝ - case 7268: return "\u21C2"; // ⇂ - case 7272: return "\u2955"; // ⥕ - case 7278: return "\u230B"; // ⌋ - case 7290: return "\u21C1"; // ⇁ - case 7293: return "\u21C0"; // ⇀ - case 7304: return "\u21C4"; // ⇄ - case 7313: return "\u21CC"; // ⇌ - case 7325: return "\u21C9"; // ⇉ - case 7336: return "\u219D"; // ↝ - case 7340: return "\u22A2"; // ⊢ - case 7346: return "\u21A6"; // ↦ - case 7353: return "\u295B"; // ⥛ - case 7364: return "\u22CC"; // ⋌ - case 7372: return "\u22B3"; // ⊳ - case 7376: return "\u29D0"; // ⧐ - case 7382: return "\u22B5"; // ⊵ - case 7395: return "\u294F"; // ⥏ - case 7405: return "\u295C"; // ⥜ - case 7412: return "\u21BE"; // ↾ - case 7416: return "\u2954"; // ⥔ - case 7423: return "\u21C0"; // ⇀ - case 7427: return "\u2953"; // ⥓ - case 7430: return "\u02DA"; // ˚ - case 7441: return "\u2253"; // ≓ - case 7446: return "\u21C4"; // ⇄ - case 7450: return "\u21CC"; // ⇌ - case 7452: return "\u200F"; // ‏ - case 7458: return "\u23B1"; // ⎱ - case 7463: return "\u23B1"; // ⎱ - case 7468: return "\u2AEE"; // ⫮ - case 7473: return "\u27ED"; // ⟭ - case 7476: return "\u21FE"; // ⇾ - case 7480: return "\u27E7"; // ⟧ - case 7484: return "\u2986"; // ⦆ - case 7488: return "\u211D"; // ℝ - case 7490: return "\uD835\uDD63"; // 𝕣 - case 7494: return "\u2A2E"; // ⨮ - case 7500: return "\u2A35"; // ⨵ - case 7511: return "\u2970"; // ⥰ - case 7515: return "\u0029"; // ) - case 7518: return "\u2994"; // ⦔ - case 7525: return "\u2A12"; // ⨒ - case 7530: return "\u21C9"; // ⇉ - case 7541: return "\u21DB"; // ⇛ - case 7547: return "\u203A"; // › - case 7551: return "\u211B"; // ℛ - case 7554: return "\uD835\uDCC7"; // 𝓇 - case 7556: return "\u21B1"; // ↱ - case 7558: return "\u21B1"; // ↱ - case 7561: return "\u005D"; // ] - case 7564: return "\u2019"; // ’ - case 7566: return "\u2019"; // ’ - case 7572: return "\u22CC"; // ⋌ - case 7577: return "\u22CA"; // ⋊ - case 7580: return "\u25B9"; // ▹ - case 7582: return "\u22B5"; // ⊵ - case 7584: return "\u25B8"; // ▸ - case 7589: return "\u29CE"; // ⧎ - case 7600: return "\u29F4"; // ⧴ - case 7607: return "\u2968"; // ⥨ - case 7609: return "\u211E"; // ℞ - case 7616: return "\u015A"; // Ś - case 7623: return "\u015B"; // ś - case 7628: return "\u201A"; // ‚ - case 7630: return "\u2ABC"; // ⪼ - case 7632: return "\u227B"; // ≻ - case 7635: return "\u2AB8"; // ⪸ - case 7640: return "\u0160"; // Š - case 7644: return "\u0161"; // š - case 7648: return "\u227D"; // ≽ - case 7650: return "\u2AB4"; // ⪴ - case 7652: return "\u2AB0"; // ⪰ - case 7657: return "\u015E"; // Ş - case 7661: return "\u015F"; // ş - case 7665: return "\u015C"; // Ŝ - case 7669: return "\u015D"; // ŝ - case 7673: return "\u2ABA"; // ⪺ - case 7675: return "\u2AB6"; // ⪶ - case 7679: return "\u22E9"; // ⋩ - case 7686: return "\u2A13"; // ⨓ - case 7690: return "\u227F"; // ≿ - case 7692: return "\u0421"; // С - case 7694: return "\u0441"; // с - case 7698: return "\u22C5"; // ⋅ - case 7700: return "\u22A1"; // ⊡ - case 7702: return "\u2A66"; // ⩦ - case 7708: return "\u2925"; // ⤥ - case 7712: return "\u21D8"; // ⇘ - case 7714: return "\u2198"; // ↘ - case 7717: return "\u2198"; // ↘ - case 7719: return "\u00A7"; // § - case 7720: return "\u00A7"; // § - case 7723: return "\u003B"; // ; - case 7728: return "\u2929"; // ⤩ - case 7735: return "\u2216"; // ∖ - case 7737: return "\u2216"; // ∖ - case 7740: return "\u2736"; // ✶ - case 7743: return "\uD835\uDD16"; // 𝔖 - case 7746: return "\uD835\uDD30"; // 𝔰 - case 7750: return "\u2322"; // ⌢ - case 7755: return "\u266F"; // ♯ - case 7761: return "\u0429"; // Щ - case 7766: return "\u0449"; // щ - case 7769: return "\u0428"; // Ш - case 7771: return "\u0448"; // ш - case 7785: return "\u2193"; // ↓ - case 7795: return "\u2190"; // ← - case 7802: return "\u2223"; // ∣ - case 7811: return "\u2225"; // ∥ - case 7822: return "\u2192"; // → - case 7830: return "\u2191"; // ↑ - case 7831: return "\u00AD"; // ­ - case 7832: return "\u00AD"; // ­ - case 7837: return "\u03A3"; // Σ - case 7842: return "\u03C3"; // σ - case 7844: return "\u03C2"; // ς - case 7846: return "\u03C2"; // ς - case 7848: return "\u223C"; // ∼ - case 7852: return "\u2A6A"; // ⩪ - case 7854: return "\u2243"; // ≃ - case 7856: return "\u2243"; // ≃ - case 7858: return "\u2A9E"; // ⪞ - case 7860: return "\u2AA0"; // ⪠ - case 7862: return "\u2A9D"; // ⪝ - case 7864: return "\u2A9F"; // ⪟ - case 7867: return "\u2246"; // ≆ - case 7872: return "\u2A24"; // ⨤ - case 7877: return "\u2972"; // ⥲ - case 7882: return "\u2190"; // ← - case 7893: return "\u2218"; // ∘ - case 7906: return "\u2216"; // ∖ - case 7910: return "\u2A33"; // ⨳ - case 7917: return "\u29E4"; // ⧤ - case 7920: return "\u2223"; // ∣ - case 7923: return "\u2323"; // ⌣ - case 7925: return "\u2AAA"; // ⪪ - case 7927: return "\u2AAC"; // ⪬ - case 7929: return "\u2AAC\uFE00"; // ⪬︀ - case 7935: return "\u042C"; // Ь - case 7941: return "\u044C"; // ь - case 7943: return "\u002F"; // / - case 7945: return "\u29C4"; // ⧄ - case 7948: return "\u233F"; // ⌿ - case 7952: return "\uD835\uDD4A"; // 𝕊 - case 7955: return "\uD835\uDD64"; // 𝕤 - case 7961: return "\u2660"; // ♠ - case 7965: return "\u2660"; // ♠ - case 7967: return "\u2225"; // ∥ - case 7972: return "\u2293"; // ⊓ - case 7974: return "\u2293\uFE00"; // ⊓︀ - case 7977: return "\u2294"; // ⊔ - case 7979: return "\u2294\uFE00"; // ⊔︀ - case 7983: return "\u221A"; // √ - case 7987: return "\u228F"; // ⊏ - case 7989: return "\u2291"; // ⊑ - case 7993: return "\u228F"; // ⊏ - case 7996: return "\u2291"; // ⊑ - case 7998: return "\u2290"; // ⊐ - case 8000: return "\u2292"; // ⊒ - case 8004: return "\u2290"; // ⊐ - case 8007: return "\u2292"; // ⊒ - case 8009: return "\u25A1"; // □ - case 8014: return "\u25A1"; // □ - case 8018: return "\u25A1"; // □ - case 8031: return "\u2293"; // ⊓ - case 8038: return "\u228F"; // ⊏ - case 8044: return "\u2291"; // ⊑ - case 8051: return "\u2290"; // ⊐ - case 8057: return "\u2292"; // ⊒ - case 8063: return "\u2294"; // ⊔ - case 8065: return "\u25AA"; // ▪ - case 8067: return "\u25AA"; // ▪ - case 8072: return "\u2192"; // → - case 8076: return "\uD835\uDCAE"; // 𝒮 - case 8080: return "\uD835\uDCC8"; // 𝓈 - case 8085: return "\u2216"; // ∖ - case 8090: return "\u2323"; // ⌣ - case 8095: return "\u22C6"; // ⋆ - case 8099: return "\u22C6"; // ⋆ - case 8103: return "\u2606"; // ☆ - case 8105: return "\u2605"; // ★ - case 8119: return "\u03F5"; // ϵ - case 8123: return "\u03D5"; // ϕ - case 8126: return "\u00AF"; // ¯ - case 8129: return "\u22D0"; // ⋐ - case 8132: return "\u2282"; // ⊂ - case 8136: return "\u2ABD"; // ⪽ - case 8138: return "\u2AC5"; // ⫅ - case 8140: return "\u2286"; // ⊆ - case 8144: return "\u2AC3"; // ⫃ - case 8149: return "\u2AC1"; // ⫁ - case 8152: return "\u2ACB"; // ⫋ - case 8154: return "\u228A"; // ⊊ - case 8159: return "\u2ABF"; // ⪿ - case 8164: return "\u2979"; // ⥹ - case 8168: return "\u22D0"; // ⋐ - case 8172: return "\u2282"; // ⊂ - case 8175: return "\u2286"; // ⊆ - case 8177: return "\u2AC5"; // ⫅ - case 8183: return "\u2286"; // ⊆ - case 8187: return "\u228A"; // ⊊ - case 8189: return "\u2ACB"; // ⫋ - case 8192: return "\u2AC7"; // ⫇ - case 8195: return "\u2AD5"; // ⫕ - case 8197: return "\u2AD3"; // ⫓ - case 8200: return "\u227B"; // ≻ - case 8207: return "\u2AB8"; // ⪸ - case 8215: return "\u227D"; // ≽ - case 8222: return "\u227B"; // ≻ - case 8228: return "\u2AB0"; // ⪰ - case 8239: return "\u227D"; // ≽ - case 8245: return "\u227F"; // ≿ - case 8248: return "\u2AB0"; // ⪰ - case 8256: return "\u2ABA"; // ⪺ - case 8260: return "\u2AB6"; // ⪶ - case 8264: return "\u22E9"; // ⋩ - case 8268: return "\u227F"; // ≿ - case 8274: return "\u220B"; // ∋ - case 8276: return "\u2211"; // ∑ - case 8278: return "\u2211"; // ∑ - case 8281: return "\u266A"; // ♪ - case 8283: return "\u22D1"; // ⋑ - case 8285: return "\u2283"; // ⊃ - case 8286: return "\u00B9"; // ¹ - case 8287: return "\u00B9"; // ¹ - case 8288: return "\u00B2"; // ² - case 8289: return "\u00B2"; // ² - case 8290: return "\u00B3"; // ³ - case 8291: return "\u00B3"; // ³ - case 8295: return "\u2ABE"; // ⪾ - case 8299: return "\u2AD8"; // ⫘ - case 8301: return "\u2AC6"; // ⫆ - case 8303: return "\u2287"; // ⊇ - case 8307: return "\u2AC4"; // ⫄ - case 8313: return "\u2283"; // ⊃ - case 8319: return "\u2287"; // ⊇ - case 8324: return "\u27C9"; // ⟉ - case 8327: return "\u2AD7"; // ⫗ - case 8332: return "\u297B"; // ⥻ - case 8337: return "\u2AC2"; // ⫂ - case 8340: return "\u2ACC"; // ⫌ - case 8342: return "\u228B"; // ⊋ - case 8347: return "\u2AC0"; // ⫀ - case 8351: return "\u22D1"; // ⋑ - case 8355: return "\u2283"; // ⊃ - case 8358: return "\u2287"; // ⊇ - case 8360: return "\u2AC6"; // ⫆ - case 8364: return "\u228B"; // ⊋ - case 8366: return "\u2ACC"; // ⫌ - case 8369: return "\u2AC8"; // ⫈ - case 8372: return "\u2AD4"; // ⫔ - case 8374: return "\u2AD6"; // ⫖ - case 8380: return "\u2926"; // ⤦ - case 8384: return "\u21D9"; // ⇙ - case 8386: return "\u2199"; // ↙ - case 8389: return "\u2199"; // ↙ - case 8394: return "\u292A"; // ⤪ - case 8398: return "\u00DF"; // ß - case 8399: return "\u00DF"; // ß - case 8403: return "\u0009"; // - case 8410: return "\u2316"; // ⌖ - case 8412: return "\u03A4"; // Τ - case 8414: return "\u03C4"; // τ - case 8418: return "\u23B4"; // ⎴ - case 8424: return "\u0164"; // Ť - case 8430: return "\u0165"; // ť - case 8435: return "\u0162"; // Ţ - case 8440: return "\u0163"; // ţ - case 8442: return "\u0422"; // Т - case 8444: return "\u0442"; // т - case 8448: return "\u20DB"; // ⃛ - case 8454: return "\u2315"; // ⌕ - case 8457: return "\uD835\uDD17"; // 𝔗 - case 8460: return "\uD835\uDD31"; // 𝔱 - case 8466: return "\u2234"; // ∴ - case 8475: return "\u2234"; // ∴ - case 8480: return "\u2234"; // ∴ - case 8483: return "\u0398"; // Θ - case 8486: return "\u03B8"; // θ - case 8490: return "\u03D1"; // ϑ - case 8492: return "\u03D1"; // ϑ - case 8502: return "\u2248"; // ≈ - case 8506: return "\u223C"; // ∼ - case 8515: return "\u205F\u200A"; //    - case 8519: return "\u2009"; //   - case 8526: return "\u2009"; //   - case 8530: return "\u2248"; // ≈ - case 8534: return "\u223C"; // ∼ - case 8538: return "\u00DE"; // Þ - case 8539: return "\u00DE"; // Þ - case 8542: return "\u00FE"; // þ - case 8543: return "\u00FE"; // þ - case 8548: return "\u223C"; // ∼ - case 8553: return "\u02DC"; // ˜ - case 8559: return "\u2243"; // ≃ - case 8569: return "\u2245"; // ≅ - case 8575: return "\u2248"; // ≈ - case 8578: return "\u00D7"; // × - case 8579: return "\u00D7"; // × - case 8581: return "\u22A0"; // ⊠ - case 8584: return "\u2A31"; // ⨱ - case 8586: return "\u2A30"; // ⨰ - case 8589: return "\u222D"; // ∭ - case 8593: return "\u2928"; // ⤨ - case 8595: return "\u22A4"; // ⊤ - case 8599: return "\u2336"; // ⌶ - case 8603: return "\u2AF1"; // ⫱ - case 8607: return "\uD835\uDD4B"; // 𝕋 - case 8609: return "\uD835\uDD65"; // 𝕥 - case 8613: return "\u2ADA"; // ⫚ - case 8616: return "\u2929"; // ⤩ - case 8622: return "\u2034"; // ‴ - case 8627: return "\u2122"; // ™ - case 8632: return "\u2122"; // ™ - case 8639: return "\u25B5"; // ▵ - case 8644: return "\u25BF"; // ▿ - case 8649: return "\u25C3"; // ◃ - case 8652: return "\u22B4"; // ⊴ - case 8654: return "\u225C"; // ≜ - case 8660: return "\u25B9"; // ▹ - case 8663: return "\u22B5"; // ⊵ - case 8667: return "\u25EC"; // ◬ - case 8669: return "\u225C"; // ≜ - case 8675: return "\u2A3A"; // ⨺ - case 8684: return "\u20DB"; // ⃛ - case 8689: return "\u2A39"; // ⨹ - case 8692: return "\u29CD"; // ⧍ - case 8697: return "\u2A3B"; // ⨻ - case 8704: return "\u23E2"; // ⏢ - case 8708: return "\uD835\uDCAF"; // 𝒯 - case 8712: return "\uD835\uDCC9"; // 𝓉 - case 8716: return "\u0426"; // Ц - case 8718: return "\u0446"; // ц - case 8722: return "\u040B"; // Ћ - case 8726: return "\u045B"; // ћ - case 8731: return "\u0166"; // Ŧ - case 8736: return "\u0167"; // ŧ - case 8741: return "\u226C"; // ≬ - case 8756: return "\u219E"; // ↞ - case 8767: return "\u21A0"; // ↠ - case 8773: return "\u00DA"; // Ú - case 8774: return "\u00DA"; // Ú - case 8780: return "\u00FA"; // ú - case 8781: return "\u00FA"; // ú - case 8784: return "\u219F"; // ↟ - case 8788: return "\u21D1"; // ⇑ - case 8791: return "\u2191"; // ↑ - case 8796: return "\u2949"; // ⥉ - case 8801: return "\u040E"; // Ў - case 8806: return "\u045E"; // ў - case 8810: return "\u016C"; // Ŭ - case 8814: return "\u016D"; // ŭ - case 8818: return "\u00DB"; // Û - case 8819: return "\u00DB"; // Û - case 8823: return "\u00FB"; // û - case 8824: return "\u00FB"; // û - case 8826: return "\u0423"; // У - case 8828: return "\u0443"; // у - case 8833: return "\u21C5"; // ⇅ - case 8839: return "\u0170"; // Ű - case 8844: return "\u0171"; // ű - case 8848: return "\u296E"; // ⥮ - case 8854: return "\u297E"; // ⥾ - case 8857: return "\uD835\uDD18"; // 𝔘 - case 8859: return "\uD835\uDD32"; // 𝔲 - case 8864: return "\u00D9"; // Ù - case 8865: return "\u00D9"; // Ù - case 8870: return "\u00F9"; // ù - case 8871: return "\u00F9"; // ù - case 8875: return "\u2963"; // ⥣ - case 8880: return "\u21BF"; // ↿ - case 8882: return "\u21BE"; // ↾ - case 8886: return "\u2580"; // ▀ - case 8892: return "\u231C"; // ⌜ - case 8895: return "\u231C"; // ⌜ - case 8899: return "\u230F"; // ⌏ - case 8903: return "\u25F8"; // ◸ - case 8908: return "\u016A"; // Ū - case 8913: return "\u016B"; // ū - case 8914: return "\u00A8"; // ¨ - case 8915: return "\u00A8"; // ¨ - case 8923: return "\u005F"; // _ - case 8928: return "\u23DF"; // ⏟ - case 8932: return "\u23B5"; // ⎵ - case 8944: return "\u23DD"; // ⏝ - case 8948: return "\u22C3"; // ⋃ - case 8953: return "\u228E"; // ⊎ - case 8958: return "\u0172"; // Ų - case 8963: return "\u0173"; // ų - case 8966: return "\uD835\uDD4C"; // 𝕌 - case 8969: return "\uD835\uDD66"; // 𝕦 - case 8976: return "\u2191"; // ↑ - case 8982: return "\u21D1"; // ⇑ - case 8989: return "\u2191"; // ↑ - case 8993: return "\u2912"; // ⤒ - case 9003: return "\u21C5"; // ⇅ - case 9013: return "\u2195"; // ↕ - case 9023: return "\u21D5"; // ⇕ - case 9033: return "\u2195"; // ↕ - case 9045: return "\u296E"; // ⥮ - case 9057: return "\u21BF"; // ↿ - case 9063: return "\u21BE"; // ↾ - case 9067: return "\u228E"; // ⊎ - case 9080: return "\u2196"; // ↖ - case 9091: return "\u2197"; // ↗ - case 9094: return "\u03D2"; // ϒ - case 9097: return "\u03C5"; // υ - case 9099: return "\u03D2"; // ϒ - case 9103: return "\u03A5"; // Υ - case 9107: return "\u03C5"; // υ - case 9111: return "\u22A5"; // ⊥ - case 9117: return "\u21A5"; // ↥ - case 9126: return "\u21C8"; // ⇈ - case 9132: return "\u231D"; // ⌝ - case 9135: return "\u231D"; // ⌝ - case 9139: return "\u230E"; // ⌎ - case 9144: return "\u016E"; // Ů - case 9148: return "\u016F"; // ů - case 9152: return "\u25F9"; // ◹ - case 9156: return "\uD835\uDCB0"; // 𝒰 - case 9160: return "\uD835\uDCCA"; // 𝓊 - case 9165: return "\u22F0"; // ⋰ - case 9171: return "\u0168"; // Ũ - case 9176: return "\u0169"; // ũ - case 9179: return "\u25B5"; // ▵ - case 9181: return "\u25B4"; // ▴ - case 9186: return "\u21C8"; // ⇈ - case 9189: return "\u00DC"; // Ü - case 9190: return "\u00DC"; // Ü - case 9192: return "\u00FC"; // ü - case 9193: return "\u00FC"; // ü - case 9200: return "\u29A7"; // ⦧ - case 9207: return "\u299C"; // ⦜ - case 9216: return "\u03F5"; // ϵ - case 9222: return "\u03F0"; // ϰ - case 9230: return "\u2205"; // ∅ - case 9234: return "\u03D5"; // ϕ - case 9236: return "\u03D6"; // ϖ - case 9242: return "\u221D"; // ∝ - case 9246: return "\u21D5"; // ⇕ - case 9248: return "\u2195"; // ↕ - case 9251: return "\u03F1"; // ϱ - case 9257: return "\u03C2"; // ς - case 9266: return "\u228A\uFE00"; // ⊊︀ - case 9268: return "\u2ACB\uFE00"; // ⫋︀ - case 9276: return "\u228B\uFE00"; // ⊋︀ - case 9278: return "\u2ACC\uFE00"; // ⫌︀ - case 9284: return "\u03D1"; // ϑ - case 9296: return "\u22B2"; // ⊲ - case 9302: return "\u22B3"; // ⊳ - case 9307: return "\u2AEB"; // ⫫ - case 9311: return "\u2AE8"; // ⫨ - case 9313: return "\u2AE9"; // ⫩ - case 9316: return "\u0412"; // В - case 9319: return "\u0432"; // в - case 9324: return "\u22AB"; // ⊫ - case 9329: return "\u22A9"; // ⊩ - case 9334: return "\u22A8"; // ⊨ - case 9339: return "\u22A2"; // ⊢ - case 9341: return "\u2AE6"; // ⫦ - case 9344: return "\u22C1"; // ⋁ - case 9347: return "\u2228"; // ∨ - case 9351: return "\u22BB"; // ⊻ - case 9354: return "\u225A"; // ≚ - case 9359: return "\u22EE"; // ⋮ - case 9364: return "\u2016"; // ‖ - case 9369: return "\u007C"; // | - case 9371: return "\u2016"; // ‖ - case 9373: return "\u007C"; // | - case 9381: return "\u2223"; // ∣ - case 9386: return "\u007C"; // | - case 9396: return "\u2758"; // ❘ - case 9402: return "\u2240"; // ≀ - case 9413: return "\u200A"; //   - case 9416: return "\uD835\uDD19"; // 𝔙 - case 9419: return "\uD835\uDD33"; // 𝔳 - case 9424: return "\u22B2"; // ⊲ - case 9429: return "\u2282\u20D2"; // ⊂⃒ - case 9431: return "\u2283\u20D2"; // ⊃⃒ - case 9435: return "\uD835\uDD4D"; // 𝕍 - case 9439: return "\uD835\uDD67"; // 𝕧 - case 9444: return "\u221D"; // ∝ - case 9449: return "\u22B3"; // ⊳ - case 9453: return "\uD835\uDCB1"; // 𝒱 - case 9457: return "\uD835\uDCCB"; // 𝓋 - case 9462: return "\u2ACB\uFE00"; // ⫋︀ - case 9464: return "\u228A\uFE00"; // ⊊︀ - case 9468: return "\u2ACC\uFE00"; // ⫌︀ - case 9470: return "\u228B\uFE00"; // ⊋︀ - case 9476: return "\u22AA"; // ⊪ - case 9483: return "\u299A"; // ⦚ - case 9489: return "\u0174"; // Ŵ - case 9495: return "\u0175"; // ŵ - case 9501: return "\u2A5F"; // ⩟ - case 9506: return "\u22C0"; // ⋀ - case 9509: return "\u2227"; // ∧ - case 9511: return "\u2259"; // ≙ - case 9516: return "\u2118"; // ℘ - case 9519: return "\uD835\uDD1A"; // 𝔚 - case 9522: return "\uD835\uDD34"; // 𝔴 - case 9526: return "\uD835\uDD4E"; // 𝕎 - case 9530: return "\uD835\uDD68"; // 𝕨 - case 9532: return "\u2118"; // ℘ - case 9534: return "\u2240"; // ≀ - case 9539: return "\u2240"; // ≀ - case 9543: return "\uD835\uDCB2"; // 𝒲 - case 9547: return "\uD835\uDCCC"; // 𝓌 - case 9552: return "\u22C2"; // ⋂ - case 9556: return "\u25EF"; // ◯ - case 9559: return "\u22C3"; // ⋃ - case 9564: return "\u25BD"; // ▽ - case 9568: return "\uD835\uDD1B"; // 𝔛 - case 9571: return "\uD835\uDD35"; // 𝔵 - case 9576: return "\u27FA"; // ⟺ - case 9580: return "\u27F7"; // ⟷ - case 9582: return "\u039E"; // Ξ - case 9584: return "\u03BE"; // ξ - case 9589: return "\u27F8"; // ⟸ - case 9593: return "\u27F5"; // ⟵ - case 9597: return "\u27FC"; // ⟼ - case 9601: return "\u22FB"; // ⋻ - case 9606: return "\u2A00"; // ⨀ - case 9610: return "\uD835\uDD4F"; // 𝕏 - case 9613: return "\uD835\uDD69"; // 𝕩 - case 9617: return "\u2A01"; // ⨁ - case 9622: return "\u2A02"; // ⨂ - case 9627: return "\u27F9"; // ⟹ - case 9631: return "\u27F6"; // ⟶ - case 9635: return "\uD835\uDCB3"; // 𝒳 - case 9639: return "\uD835\uDCCD"; // 𝓍 - case 9644: return "\u2A06"; // ⨆ - case 9650: return "\u2A04"; // ⨄ - case 9654: return "\u25B3"; // △ - case 9658: return "\u22C1"; // ⋁ - case 9664: return "\u22C0"; // ⋀ - case 9670: return "\u00DD"; // Ý - case 9671: return "\u00DD"; // Ý - case 9677: return "\u00FD"; // ý - case 9678: return "\u00FD"; // ý - case 9682: return "\u042F"; // Я - case 9684: return "\u044F"; // я - case 9689: return "\u0176"; // Ŷ - case 9694: return "\u0177"; // ŷ - case 9696: return "\u042B"; // Ы - case 9698: return "\u044B"; // ы - case 9700: return "\u00A5"; // ¥ - case 9701: return "\u00A5"; // ¥ - case 9704: return "\uD835\uDD1C"; // 𝔜 - case 9707: return "\uD835\uDD36"; // 𝔶 - case 9711: return "\u0407"; // Ї - case 9715: return "\u0457"; // ї - case 9719: return "\uD835\uDD50"; // 𝕐 - case 9723: return "\uD835\uDD6A"; // 𝕪 - case 9727: return "\uD835\uDCB4"; // 𝒴 - case 9731: return "\uD835\uDCCE"; // 𝓎 - case 9735: return "\u042E"; // Ю - case 9739: return "\u044E"; // ю - case 9743: return "\u0178"; // Ÿ - case 9745: return "\u00FF"; // ÿ - case 9746: return "\u00FF"; // ÿ - case 9753: return "\u0179"; // Ź - case 9760: return "\u017A"; // ź - case 9766: return "\u017D"; // Ž - case 9772: return "\u017E"; // ž - case 9774: return "\u0417"; // З - case 9776: return "\u0437"; // з - case 9780: return "\u017B"; // Ż - case 9784: return "\u017C"; // ż - case 9790: return "\u2128"; // ℨ - case 9804: return "\u200B"; // ​ - case 9807: return "\u0396"; // Ζ - case 9810: return "\u03B6"; // ζ - case 9813: return "\u2128"; // ℨ - case 9816: return "\uD835\uDD37"; // 𝔷 - case 9820: return "\u0416"; // Ж - case 9824: return "\u0436"; // ж - case 9831: return "\u21DD"; // ⇝ - case 9835: return "\u2124"; // ℤ - case 9839: return "\uD835\uDD6B"; // 𝕫 - case 9843: return "\uD835\uDCB5"; // 𝒵 - case 9847: return "\uD835\uDCCF"; // 𝓏 - case 9850: return "\u200D"; // ‍ - case 9853: return "\u200C"; // ‌ - default: return null; - } - } - string GetNamedEntityValue () { int startIndex = index; string decoded = null; while (startIndex > 0) { - if ((decoded = GetNamedEntityValue (states[startIndex - 1])) != null) + if (NamedEntities.TryGetValue (states[startIndex - 1], out decoded)) break; startIndex--; diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index 8ad41bd1ee..f5d0f87041 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -654,9 +654,9 @@ public enum HtmlTagId { TH, /// - /// The HTML <thread> tag. + /// The HTML <thead> tag. /// - Thread, + THead, /// /// The HTML <time> tag. diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index fcacd200fe..3481fbdb86 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -93,6 +93,19 @@ public HtmlNamespace HtmlNamespace { get; private set; } + /// + /// Get or set whether or not the tokenizer should ignore truncated tags. + /// + /// + /// Gets or sets whether or not the tokenizer should ignore truncated tags. + /// If false and the stream abrubtly ends in the middle of an HTML tag, it will be + /// treated as an instead. + /// + /// true if truncated tags should be ignored; otherwise, false. + public bool IgnoreTruncatedTags { + get; set; + } + /// /// Gets the current line number. /// @@ -116,7 +129,7 @@ public int LineNumber { /// Combined with , a value of 1,1 indicates /// the start of the document. /// - /// The current line number. + /// The column position of the current line. public int LinePosition { get; private set; } @@ -319,11 +332,16 @@ HtmlToken EmitDocType () return token; } - HtmlToken EmitDataToken (bool encodeEntities) + HtmlToken EmitDataToken (bool encodeEntities, bool truncated) { if (data.Length == 0) return null; + if (truncated && IgnoreTruncatedTags) { + data.Length = 0; + return null; + } + var token = CreateDataToken (data.ToString ()); token.EncodeEntities = encodeEntities; data.Length = 0; @@ -413,7 +431,7 @@ HtmlToken ReadCharacterReference (HtmlTokenizerState next) TokenizerState = HtmlTokenizerState.EndOfFile; data.Append ('&'); - return EmitDataToken (true); + return EmitDataToken (true, false); } c = (char) nc; @@ -439,7 +457,7 @@ HtmlToken ReadCharacterReference (HtmlTokenizerState next) data.Append (entity.GetPushedInput ()); entity.Reset (); - return EmitDataToken (true); + return EmitDataToken (true, false); } c = (char) nc; @@ -481,7 +499,7 @@ HtmlToken ReadGenericRawTextEndTagOpen (bool decoded, HtmlTokenizerState rawText if (nc == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (decoded); + return EmitDataToken (decoded, true); } c = (char) nc; @@ -510,7 +528,7 @@ HtmlToken ReadGenericRawTextEndTagName (bool decoded, HtmlTokenizerState rawText TokenizerState = HtmlTokenizerState.EndOfFile; name.Length = 0; - return EmitDataToken (decoded); + return EmitDataToken (decoded, true); } c = (char) nc; @@ -590,7 +608,7 @@ HtmlToken ReadData () } } while (TokenizerState == HtmlTokenizerState.Data); - return EmitDataToken (DecodeCharacterReferences); + return EmitDataToken (DecodeCharacterReferences, false); } // 8.2.4.2 Character reference in data state @@ -623,14 +641,14 @@ HtmlToken ReadRcData () goto default; case '<': TokenizerState = HtmlTokenizerState.RcDataLessThan; - return EmitDataToken (DecodeCharacterReferences); + return EmitDataToken (DecodeCharacterReferences, false); default: data.Append (c == '\0' ? '\uFFFD' : c); break; } } while (TokenizerState == HtmlTokenizerState.RcData); - return EmitDataToken (DecodeCharacterReferences); + return EmitDataToken (DecodeCharacterReferences, false); } // 8.2.4.4 Character reference in RCDATA state @@ -656,14 +674,14 @@ HtmlToken ReadRawText () switch (c) { case '<': TokenizerState = HtmlTokenizerState.RawTextLessThan; - return EmitDataToken (false); + return EmitDataToken (false, false); default: data.Append (c == '\0' ? '\uFFFD' : c); break; } } while (TokenizerState == HtmlTokenizerState.RawText); - return EmitDataToken (false); + return EmitDataToken (false, false); } // 8.2.4.6 Script data state @@ -707,7 +725,7 @@ HtmlToken ReadPlainText () TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, false); } // 8.2.4.8 Tag open state @@ -717,8 +735,8 @@ HtmlToken ReadTagOpen () char c; if (nc == -1) { + var token = IgnoreTruncatedTags ? null : CreateDataToken ("<"); TokenizerState = HtmlTokenizerState.EndOfFile; - var token = CreateDataToken ("<"); return token; } @@ -762,7 +780,7 @@ HtmlToken ReadEndTagOpen () if (nc == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -802,7 +820,7 @@ HtmlToken ReadTagName () TokenizerState = HtmlTokenizerState.EndOfFile; name.Length = 0; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1421,7 +1439,7 @@ HtmlToken ReadBeforeAttributeName () TokenizerState = HtmlTokenizerState.EndOfFile; tag = null; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1460,7 +1478,7 @@ HtmlToken ReadAttributeName () name.Length = 0; tag = null; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1504,7 +1522,7 @@ HtmlToken ReadAfterAttributeName () TokenizerState = HtmlTokenizerState.EndOfFile; tag = null; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1545,7 +1563,7 @@ HtmlToken ReadBeforeAttributeValue () TokenizerState = HtmlTokenizerState.EndOfFile; tag = null; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1590,7 +1608,7 @@ HtmlToken ReadAttributeValueQuoted () TokenizerState = HtmlTokenizerState.EndOfFile; name.Length = 0; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1631,7 +1649,7 @@ HtmlToken ReadAttributeValueUnquoted () TokenizerState = HtmlTokenizerState.EndOfFile; name.Length = 0; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1677,7 +1695,7 @@ HtmlToken ReadCharacterReferenceInAttributeValue () TokenizerState = HtmlTokenizerState.EndOfFile; name.Length = 0; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1708,7 +1726,7 @@ HtmlToken ReadCharacterReferenceInAttributeValue () data.Append (entity.GetPushedInput ()); entity.Reset (); - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1747,7 +1765,7 @@ HtmlToken ReadAfterAttributeValueQuoted () if (nc == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1787,7 +1805,7 @@ HtmlToken ReadSelfClosingStartTag () if (nc == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1839,7 +1857,7 @@ HtmlToken ReadMarkupDeclarationOpen () while (count < 2) { if ((nc = Peek ()) == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, true); } if ((c = (char) nc) != '-') @@ -1870,7 +1888,7 @@ HtmlToken ReadMarkupDeclarationOpen () while (count < 7) { if ((nc = Read ()) == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; @@ -1902,7 +1920,7 @@ HtmlToken ReadMarkupDeclarationOpen () while (count < 7) { if ((nc = Read ()) == -1) { TokenizerState = HtmlTokenizerState.EndOfFile; - return EmitDataToken (false); + return EmitDataToken (false, true); } c = (char) nc; From 195ad3d188eb004c4aafe364ab2934377f17879a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 25 Mar 2020 10:08:09 -0400 Subject: [PATCH 490/741] Updated HtmlTokenizer unit tests --- UnitTests/Text/HtmlTokenizerTests.cs | 110 +++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/UnitTests/Text/HtmlTokenizerTests.cs b/UnitTests/Text/HtmlTokenizerTests.cs index 39e65f5051..31fd6dffbe 100644 --- a/UnitTests/Text/HtmlTokenizerTests.cs +++ b/UnitTests/Text/HtmlTokenizerTests.cs @@ -1028,6 +1028,11 @@ public void TestTruncatedCDATA () Assert.IsTrue (tokenizer.ReadNextToken (out HtmlToken token)); Assert.AreEqual (HtmlTokenKind.Data, token.Kind); Assert.AreEqual (" Date: Wed, 25 Mar 2020 10:33:19 -0400 Subject: [PATCH 491/741] Refactored TextPart's BOM sniffing logic and moved it into CharsetUtils --- MimeKit/TextPart.cs | 16 ++++------------ MimeKit/Utils/CharsetUtils.cs | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index bdd28ca8ab..f86ab2fb86 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -364,18 +364,10 @@ public string GetText (out Encoding encoding) if (encoding == null) { try { - var bom = new byte[2]; - int n; - - using (var content = Content.Open ()) - n = content.Read (bom, 0, bom.Length); - - if (bom.Length >= 2 && bom[0] == 0xFF && bom[1] == 0xFE) - encoding = Encoding.Unicode; // UTF-16LE - else if (bom.Length >= 2 && bom[0] == 0xFE && bom[1] == 0xFF) - encoding = Encoding.BigEndianUnicode; // UTF-16BE - else - encoding = CharsetUtils.UTF8; + using (var content = Content.Open ()) { + if (!CharsetUtils.TryGetBomEncoding (content, out encoding)) + encoding = CharsetUtils.UTF8; + } return GetText (encoding); } catch (DecoderFallbackException) { diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index 91bb5ed059..13aa8404e0 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -25,6 +25,7 @@ // using System; +using System.IO; using System.Text; using System.Collections.Generic; @@ -561,5 +562,29 @@ public static string ConvertToUnicode (Encoding encoding, byte[] buffer, int sta return new string (ConvertToUnicode (encoding, buffer, startIndex, length, out count), 0, count); } + + public static bool TryGetBomEncoding (byte[] buffer, int length, out Encoding encoding) + { + if (length >= 2 && buffer[0] == 0xFF && buffer[1] == 0xFE) + encoding = Encoding.Unicode; // UTF-16LE + else if (length >= 2 && buffer[0] == 0xFE && buffer[1] == 0xFF) + encoding = Encoding.BigEndianUnicode; // UTF-16BE + else if (length >= 3 && buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF) + encoding = UTF8; // UTF-8 + else + encoding = null; + + return encoding != null; + } + + public static bool TryGetBomEncoding (Stream stream, out Encoding encoding) + { + var bom = new byte[3]; + int n; + + n = stream.Read (bom, 0, bom.Length); + + return TryGetBomEncoding (bom, n, out encoding); + } } } From a90383577953541f317d641001af3055f29da3b9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 25 Mar 2020 10:58:52 -0400 Subject: [PATCH 492/741] removed unnecessary validity check --- MimeKit/Text/HtmlEntityDecoder.g.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/MimeKit/Text/HtmlEntityDecoder.g.cs b/MimeKit/Text/HtmlEntityDecoder.g.cs index 2bd731a589..c642be92be 100644 --- a/MimeKit/Text/HtmlEntityDecoder.g.cs +++ b/MimeKit/Text/HtmlEntityDecoder.g.cs @@ -12326,9 +12326,6 @@ static int BinarySearchNextState (Transition[] transitions, int state) { int min = 0, max = transitions.Length; - if (max == 0) - return -1; - do { int i = min + ((max - min) / 2); From 8b813a76adc5d789a582dc2bcff1857ee2ca07fe Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 25 Mar 2020 21:01:33 -0400 Subject: [PATCH 493/741] Added TextPart.Format property for a quick way to determine the type of text it contains --- MimeKit/TextPart.cs | 38 +++++++++++++++++++++++++++++++++++++- UnitTests/TextPartTests.cs | 13 ++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index f86ab2fb86..3665eab740 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -200,6 +200,42 @@ public TextPart () : base ("text", "plain") { } + /// + /// Get the text format of the content. + /// + /// + /// Gets the text format of the content. + /// + /// The text format of the content. + public TextFormat Format { + get { + if (ContentType.MediaType.Equals ("text", StringComparison.OrdinalIgnoreCase)) { + if (ContentType.MediaSubtype.Equals ("plain")) { + string format; + + if (ContentType.Parameters.TryGetValue ("format", out format)) { + format = format.Trim (); + + if (format.Equals ("flowed", StringComparison.OrdinalIgnoreCase)) + return TextFormat.Flowed; + } + } else if (ContentType.MediaSubtype.Equals ("html", StringComparison.OrdinalIgnoreCase)) { + return TextFormat.Html; + } else if (ContentType.MediaSubtype.Equals ("rtf", StringComparison.OrdinalIgnoreCase)) { + return TextFormat.RichText; + } else if (ContentType.MediaSubtype.Equals ("enriched", StringComparison.OrdinalIgnoreCase)) { + return TextFormat.Enriched; + } else if (ContentType.MediaSubtype.Equals ("richtext", StringComparison.OrdinalIgnoreCase)) { + return TextFormat.Enriched; + } + } else if (ContentType.IsMimeType ("application", "rtf")) { + return TextFormat.RichText; + } + + return TextFormat.Plain; + } + } + /// /// Gets whether or not this text part contains enriched text. /// @@ -232,7 +268,7 @@ public bool IsFlowed { format = format.Trim (); - return format.ToLowerInvariant () == "flowed"; + return format.Equals ("flowed", StringComparison.OrdinalIgnoreCase); } } diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index 8157218bb7..ae6753ab82 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -69,6 +69,8 @@ public void TestFormat () Assert.IsFalse (text.IsFlowed, "IsFlowed"); Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.Html, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.Html), "IsFormat"); text = new TextPart (TextFormat.Plain); Assert.IsFalse (text.IsHtml, "IsHtml"); @@ -76,13 +78,18 @@ public void TestFormat () Assert.IsFalse (text.IsFlowed, "IsFlowed"); Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.Plain, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.Plain), "IsFormat"); text = new TextPart (TextFormat.Flowed); Assert.IsFalse (text.IsHtml, "IsHtml"); - Assert.IsTrue (text.IsPlain, "IsPlain"); + Assert.IsTrue (text.IsPlain, "IsPlain"); // special: Flowed is both Plain *and* Flowed Assert.IsTrue (text.IsFlowed, "IsFlowed"); Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.Flowed, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.Plain), "IsFormat"); // special: Flowed is both Plain *and* Flowed + Assert.IsTrue (text.IsFormat (TextFormat.Flowed), "IsFormat"); text = new TextPart (TextFormat.RichText); Assert.IsFalse (text.IsHtml, "IsHtml"); @@ -90,6 +97,8 @@ public void TestFormat () Assert.IsFalse (text.IsFlowed, "IsFlowed"); Assert.IsFalse (text.IsEnriched, "IsEnriched"); Assert.IsTrue (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.RichText, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.RichText), "IsFormat"); text = new TextPart (TextFormat.Enriched); Assert.IsFalse (text.IsHtml, "IsHtml"); @@ -97,6 +106,8 @@ public void TestFormat () Assert.IsFalse (text.IsFlowed, "IsFlowed"); Assert.IsTrue (text.IsEnriched, "IsEnriched"); Assert.IsFalse (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.Enriched, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.Enriched), "IsFormat"); } [Test] From 1b0edd4f969c78149ef372942bc0d763178cd8cf Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Mar 2020 08:38:52 -0400 Subject: [PATCH 494/741] Added more TextPart unit tests --- UnitTests/TextPartTests.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index ae6753ab82..a155cc44e4 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -100,6 +100,16 @@ public void TestFormat () Assert.AreEqual (TextFormat.RichText, text.Format, "Format"); Assert.IsTrue (text.IsFormat (TextFormat.RichText), "IsFormat"); + text = new TextPart (new ContentType ("application", "rtf")); + Assert.IsFalse (text.IsHtml, "IsHtml"); + Assert.IsFalse (text.IsPlain, "IsPlain"); + Assert.IsFalse (text.IsFlowed, "IsFlowed"); + Assert.IsFalse (text.IsEnriched, "IsEnriched"); + Assert.IsTrue (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.RichText, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.RichText), "IsFormat"); + Assert.IsFalse (text.IsFormat (TextFormat.CompressedRichText), "CompressedRichText"); + text = new TextPart (TextFormat.Enriched); Assert.IsFalse (text.IsHtml, "IsHtml"); Assert.IsFalse (text.IsPlain, "IsPlain"); @@ -108,6 +118,15 @@ public void TestFormat () Assert.IsFalse (text.IsRichText, "IsRichText"); Assert.AreEqual (TextFormat.Enriched, text.Format, "Format"); Assert.IsTrue (text.IsFormat (TextFormat.Enriched), "IsFormat"); + + text = new TextPart ("richtext"); + Assert.IsFalse (text.IsHtml, "IsHtml"); + Assert.IsFalse (text.IsPlain, "IsPlain"); + Assert.IsFalse (text.IsFlowed, "IsFlowed"); + Assert.IsTrue (text.IsEnriched, "IsEnriched"); + Assert.IsFalse (text.IsRichText, "IsRichText"); + Assert.AreEqual (TextFormat.Enriched, text.Format, "Format"); + Assert.IsTrue (text.IsFormat (TextFormat.Enriched), "IsFormat"); } [Test] From ed941931fad56d42c7b2af3d22096acea0854378 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Mar 2020 19:18:51 -0400 Subject: [PATCH 495/741] Added text/plain and text/html preview/snippet generators Part of the fix for https://github.com/jstedfast/MailKit/issues/1001 --- MimeKit/MimeKit.Android.csproj | 3 + MimeKit/MimeKit.Mac.csproj | 3 + MimeKit/MimeKit.Net45.csproj | 3 + MimeKit/MimeKit.NetStandard.csproj | 3 + MimeKit/MimeKit.TvOS.csproj | 3 + MimeKit/MimeKit.WatchOS.csproj | 3 + MimeKit/MimeKit.iOS.csproj | 3 + MimeKit/MimeKitLite.Android.csproj | 3 + MimeKit/MimeKitLite.Net45.csproj | 3 + MimeKit/MimeKitLite.NetStandard.csproj | 3 + MimeKit/MimeKitLite.iOS.csproj | 3 + MimeKit/Text/HtmlTextPreviewer.cs | 253 +++ MimeKit/Text/PlainTextPreviewer.cs | 158 ++ MimeKit/Text/TextPreviewer.cs | 246 +++ .../text/homedepot-check-inside-now.html | 1506 +++++++++++++++++ UnitTests/TestData/text/mimekit.net.html | 382 +++++ UnitTests/TestData/text/planet-fitness.html | 872 ++++++++++ UnitTests/TestData/text/planet-fitness.txt | 111 ++ UnitTests/Text/HtmlTextPreviewerTests.cs | 115 ++ UnitTests/Text/PlainTextPreviewerTests.cs | 97 ++ UnitTests/Text/TextPreviewerTests.cs | 99 ++ UnitTests/UnitTests.csproj | 11 +- UnitTests/packages.config | 2 +- 23 files changed, 3882 insertions(+), 3 deletions(-) create mode 100644 MimeKit/Text/HtmlTextPreviewer.cs create mode 100644 MimeKit/Text/PlainTextPreviewer.cs create mode 100644 MimeKit/Text/TextPreviewer.cs create mode 100644 UnitTests/TestData/text/homedepot-check-inside-now.html create mode 100644 UnitTests/TestData/text/mimekit.net.html create mode 100644 UnitTests/TestData/text/planet-fitness.html create mode 100644 UnitTests/TestData/text/planet-fitness.txt create mode 100644 UnitTests/Text/HtmlTextPreviewerTests.cs create mode 100644 UnitTests/Text/PlainTextPreviewerTests.cs create mode 100644 UnitTests/Text/TextPreviewerTests.cs diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 6252be1d90..baaf2a276f 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -180,6 +180,7 @@ + @@ -189,8 +190,10 @@ + + diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 24239c43b3..2dd3d1a650 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -169,6 +169,7 @@ + @@ -178,8 +179,10 @@ + + diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 4fcc684286..50360c546e 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -180,6 +180,7 @@ + @@ -189,8 +190,10 @@ + + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index f6f4820138..bb7053a9ec 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -184,6 +184,7 @@ + @@ -193,8 +194,10 @@ + + diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 99e0d579fb..6d6e248d7e 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -162,6 +162,7 @@ + @@ -171,8 +172,10 @@ + + diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 958c6d4389..9a27da1462 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -168,6 +168,7 @@ + @@ -177,8 +178,10 @@ + + diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 22624c758b..7557f1675e 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -179,6 +179,7 @@ + @@ -188,8 +189,10 @@ + + diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index 7676fda300..a12126b3d1 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -105,6 +105,7 @@ + @@ -114,8 +115,10 @@ + + diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index 3d1567440d..72e881d18e 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -100,6 +100,7 @@ + @@ -109,8 +110,10 @@ + + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index f1e280e3ea..03a2ae1262 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -91,6 +91,7 @@ + @@ -100,8 +101,10 @@ + + diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj index 9a784bfab3..c717aa1542 100644 --- a/MimeKit/MimeKitLite.iOS.csproj +++ b/MimeKit/MimeKitLite.iOS.csproj @@ -100,6 +100,7 @@ + @@ -109,8 +110,10 @@ + + diff --git a/MimeKit/Text/HtmlTextPreviewer.cs b/MimeKit/Text/HtmlTextPreviewer.cs new file mode 100644 index 0000000000..e2a6b98733 --- /dev/null +++ b/MimeKit/Text/HtmlTextPreviewer.cs @@ -0,0 +1,253 @@ +// +// HtmlTextPreviewer.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Linq; +using System.Collections.Generic; + +namespace MimeKit.Text { + /// + /// A text previewer for HTML content. + /// + /// + /// A text previewer for HTML content. + /// + public class HtmlTextPreviewer : TextPreviewer + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new previewer for HTML. + /// + public HtmlTextPreviewer () + { + } + + /// + /// Get the input format. + /// + /// + /// Gets the input format. + /// + /// The input format. + public override TextFormat InputFormat { + get { return TextFormat.Html; } + } + + static bool IsWhiteSpace (char c) + { + return char.IsWhiteSpace (c) || (c >= 0x200B && c <= 0x200D); + } + + static bool Append (char[] preview, ref int previewLength, string value, ref bool lwsp) + { + int i; + + for (i = 0; i < value.Length && previewLength < preview.Length; i++) { + if (IsWhiteSpace (value[i])) { + if (!lwsp) { + preview[previewLength++] = ' '; + lwsp = true; + } + } else { + preview[previewLength++] = value[i]; + lwsp = false; + } + } + + if (i < value.Length) { + if (lwsp) + previewLength--; + + preview[previewLength - 1] = '\u2026'; + lwsp = false; + return true; + } + + return false; + } + + sealed class HtmlTagContext + { + public HtmlTagContext (HtmlTagId id) + { + TagId = id; + } + + public HtmlTagId TagId { + get; + } + + public int ListIndex { + get; set; + } + + public bool SuppressInnerContent { + get; set; + } + } + + static void Pop (IList stack, HtmlTagId id) + { + for (int i = stack.Count; i > 0; i--) { + if (stack[i - 1].TagId == id) { + stack.RemoveAt (i - 1); + break; + } + } + } + + static bool ShouldSuppressInnerContent (HtmlTagId id) + { + switch (id) { + case HtmlTagId.OL: + case HtmlTagId.Script: + case HtmlTagId.Style: + case HtmlTagId.Table: + case HtmlTagId.TBody: + case HtmlTagId.THead: + case HtmlTagId.TR: + case HtmlTagId.UL: + return true; + default: + return false; + } + } + + static bool SuppressContent (IList stack) + { + int lastIndex = stack.Count - 1; + + return lastIndex >= 0 && stack[lastIndex].SuppressInnerContent; + } + + HtmlTagContext GetListItemContext (IList stack) + { + for (int i = stack.Count; i > 0; i--) { + var ctx = stack[i - 1]; + + if (ctx.TagId == HtmlTagId.OL || ctx.TagId == HtmlTagId.UL) + return ctx; + } + + return null; + } + + /// + /// Get a text preview of a stream of text. + /// + /// + /// Gets a text preview of a stream of text. + /// + /// The original text stream. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// + public override string GetPreviewText (TextReader reader) + { + if (reader == null) + throw new ArgumentNullException (nameof (reader)); + + var tokenizer = new HtmlTokenizer (reader) { IgnoreTruncatedTags = true }; + var preview = new char[MaximumPreviewLength]; + var stack = new List (); + var prefix = string.Empty; + int previewLength = 0; + HtmlTagContext ctx; + HtmlAttribute attr; + bool body = false; + bool full = false; + bool lwsp = true; + HtmlToken token; + + while (!full && tokenizer.ReadNextToken (out token)) { + switch (token.Kind) { + case HtmlTokenKind.Tag: + var tag = (HtmlTagToken) token; + + if (!tag.IsEndTag) { + if (body) { + switch (tag.Id) { + case HtmlTagId.Image: + if ((attr = tag.Attributes.FirstOrDefault (x => x.Id == HtmlAttributeId.Alt)) != null) { + full = Append (preview, ref previewLength, prefix + attr.Value, ref lwsp); + prefix = string.Empty; + } + break; + case HtmlTagId.LI: + if ((ctx = GetListItemContext (stack)) != null) { + if (ctx.TagId == HtmlTagId.OL) { + full = Append (preview, ref previewLength, $" {++ctx.ListIndex}. ", ref lwsp); + prefix = string.Empty; + } else { + //full = Append (preview, ref previewLength, " \u2022 ", ref lwsp); + prefix = " "; + } + } + break; + case HtmlTagId.Br: + case HtmlTagId.P: + prefix = " "; + break; + } + + if (!tag.IsEmptyElement) { + ctx = new HtmlTagContext (tag.Id) { + SuppressInnerContent = ShouldSuppressInnerContent (tag.Id) + }; + stack.Add (ctx); + } + } else if (tag.Id == HtmlTagId.Body && !tag.IsEmptyElement) { + body = true; + } + } else if (tag.Id == HtmlTagId.Body) { + stack.Clear (); + body = false; + } else { + Pop (stack, tag.Id); + } + break; + case HtmlTokenKind.Data: + if (body && !SuppressContent (stack)) { + var data = (HtmlDataToken) token; + + full = Append (preview, ref previewLength, prefix + data.Data, ref lwsp); + prefix = string.Empty; + } + break; + } + } + + if (lwsp && previewLength > 0) + previewLength--; + + return new string (preview, 0, previewLength); + } + } +} diff --git a/MimeKit/Text/PlainTextPreviewer.cs b/MimeKit/Text/PlainTextPreviewer.cs new file mode 100644 index 0000000000..bc76b1f1e0 --- /dev/null +++ b/MimeKit/Text/PlainTextPreviewer.cs @@ -0,0 +1,158 @@ +// +// PlainTextPreviewer.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; + +namespace MimeKit.Text { + /// + /// A text previewer for plain text. + /// + /// + /// A text previewer for plain text. + /// + public class PlainTextPreviewer : TextPreviewer + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new previewer for plain text. + /// + public PlainTextPreviewer () + { + } + + /// + /// Get the input format. + /// + /// + /// Gets the input format. + /// + /// The input format. + public override TextFormat InputFormat { + get { return TextFormat.Plain; } + } + + static bool IsWhiteSpace (char c) + { + return char.IsWhiteSpace (c) || (c >= 0x200B && c <= 0x200D); + } + + /// + /// Get a text preview of a string of text. + /// + /// + /// Gets a text preview of a string of text. + /// + /// The original text. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// + public override string GetPreviewText (string text) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + + if (text.Length == 0) + return string.Empty; + + var preview = new char[Math.Min (MaximumPreviewLength, text.Length)]; + int previewLength = 0; + var lwsp = true; + int i; + + for (i = 0; i < text.Length && previewLength < preview.Length; i++) { + if (IsWhiteSpace (text[i])) { + if (!lwsp) { + preview[previewLength++] = ' '; + lwsp = true; + } + } else { + preview[previewLength++] = text[i]; + lwsp = false; + } + } + + if (lwsp && previewLength > 0) + previewLength--; + + if (i < text.Length) + preview[previewLength - 1] = '\u2026'; + + return new string (preview, 0, previewLength); + } + + /// + /// Get a text preview of a stream of text. + /// + /// + /// Gets a text preview of a stream of text. + /// + /// The original text stream. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// + public override string GetPreviewText (TextReader reader) + { + if (reader == null) + throw new ArgumentNullException (nameof (reader)); + + var preview = new char[MaximumPreviewLength]; + var buffer = new char[4096]; + int previewLength = 0; + var lwsp = true; + int nread, i; + + while ((nread = reader.ReadBlock (buffer, 0, buffer.Length)) > 0) { + for (i = 0; i < nread && previewLength < preview.Length; i++) { + if (char.IsWhiteSpace (buffer[i])) { + if (!lwsp) { + preview[previewLength++] = ' '; + lwsp = true; + } + } else { + preview[previewLength++] = buffer[i]; + lwsp = false; + } + } + + if (i < nread) { + preview[previewLength - 1] = '\u2026'; + lwsp = false; + break; + } + } + + if (lwsp && previewLength > 0) + previewLength--; + + return new string (preview, 0, previewLength); + } + } +} diff --git a/MimeKit/Text/TextPreviewer.cs b/MimeKit/Text/TextPreviewer.cs new file mode 100644 index 0000000000..1839001e71 --- /dev/null +++ b/MimeKit/Text/TextPreviewer.cs @@ -0,0 +1,246 @@ +// +// PreviewGenerator.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit.Utils; + +namespace MimeKit.Text { + /// + /// An abstract class for generating a text preview of a message. + /// + /// + /// An abstract class for generating a text preview of a message. + /// + public abstract class TextPreviewer + { + int maximumPreviewLength; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Initializes a new instance of the class. + /// + protected TextPreviewer () + { + maximumPreviewLength = 110; + } + + /// + /// Get the input format. + /// + /// + /// Gets the input format. + /// + /// The input format. + public abstract TextFormat InputFormat { + get; + } + + /// + /// Get or set the maximum text preview length. + /// + /// + /// Gets or sets the maximum text preview length. + /// + /// The maximum text preview length. + /// + /// is less than 1 or greater than 1024. + /// + public int MaximumPreviewLength { + get { return maximumPreviewLength; } + set { + if (value < 1 || value > 1024) + throw new ArgumentOutOfRangeException (nameof (value)); + + maximumPreviewLength = value; + } + } + + static TextPreviewer Create (TextFormat format) + { + switch (format) { + case TextFormat.Html: return new HtmlTextPreviewer (); + default: return new PlainTextPreviewer (); + } + } + + /// + /// Get a text preview of the text part. + /// + /// + /// Gets a text preview of the text part. + /// + /// The text part. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// + public static string GetPreviewText (TextPart body) + { + if (body == null) + throw new ArgumentNullException (nameof (body)); + + if (body.Content == null) + return string.Empty; + + var encoding = body.ContentType.CharsetEncoding; + + if (encoding == null) { + using (var content = body.Content.Open ()) { + if (!CharsetUtils.TryGetBomEncoding (content, out encoding)) + encoding = CharsetUtils.UTF8; + } + } + + var buffer = new byte[16 * 1024]; + int nread = 0; + + using (var content = body.Content.Open ()) { + int n; + + do { + if ((n = content.Read (buffer, nread, buffer.Length - nread)) <= 0) + break; + + nread += n; + } while (nread < buffer.Length); + } + + if (encoding == null) { + if (!CharsetUtils.TryGetBomEncoding (buffer, nread, out encoding)) + encoding = CharsetUtils.UTF8; + } + + using (var stream = new MemoryStream (buffer, 0, nread, false)) { + var previewer = Create (body.Format); + + try { + return previewer.GetPreviewText (stream, encoding); + } catch (DecoderFallbackException) { + stream.Position = 0; + + return previewer.GetPreviewText (stream, CharsetUtils.Latin1); + } + } + } + + /// + /// Get a text preview of a string of text. + /// + /// + /// Gets a text preview of a string of text. + /// + /// The original text. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// + public virtual string GetPreviewText (string text) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + + using (var reader = new StringReader (text)) + return GetPreviewText (reader); + } + + /// + /// Get a text preview of a stream of text in the specified charset. + /// + /// + /// Get a text preview of a stream of text in the specified charset. + /// + /// The original text stream. + /// The charset encoding of the stream. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// -or- + /// is null. + /// + public virtual string GetPreviewText (Stream stream, string charset) + { + if (stream == null) + throw new ArgumentNullException (nameof (stream)); + + if (charset == null) + throw new ArgumentNullException (nameof (charset)); + + Encoding encoding; + + try { + encoding = CharsetUtils.GetEncoding (charset); + } catch (NotSupportedException) { + encoding = CharsetUtils.UTF8; + } + + return GetPreviewText (stream, encoding); + } + + /// + /// Get a text preview of a stream of text in the specified encoding. + /// + /// + /// Get a text preview of a stream of text in the specified encoding. + /// + /// The original text stream. + /// The encoding of the stream. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// -or- + /// is null. + /// + public virtual string GetPreviewText (Stream stream, Encoding encoding) + { + if (stream == null) + throw new ArgumentNullException (nameof (stream)); + + if (encoding == null) + throw new ArgumentNullException (nameof (encoding)); + + using (var reader = new StreamReader (stream, encoding, false, 4096, true)) + return GetPreviewText (reader); + } + + /// + /// Get a text preview of a stream of text. + /// + /// + /// Gets a text preview of a stream of text. + /// + /// The original text stream. + /// A string representing a shortened preview of the original text. + /// + /// is null. + /// + public abstract string GetPreviewText (TextReader reader); + } +} diff --git a/UnitTests/TestData/text/homedepot-check-inside-now.html b/UnitTests/TestData/text/homedepot-check-inside-now.html new file mode 100644 index 0000000000..c43634ed73 --- /dev/null +++ b/UnitTests/TestData/text/homedepot-check-inside-now.html @@ -0,0 +1,1506 @@ + + + + + + + + + The Home Depot + + + + + + + + + + + +
+ FREE DELIVERY Appliance Purchases $396 or + More‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌  + ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌  +
+ + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + +
+ + + + + +
+ FREE DELIVERY Appliance Purchases $396 or More  + View as a web page
+
+ + + + + + + + + + + +
+ + + + + +
+ + + + + + +
The Home Depot
+ + + + + + + + +
+ + + + Specials & Offers + + +
+ + +
+
+ + + + + + + + + + + + +
+ + + + + + + + + +
AppliancesBathFlooringLighting & FansToolsHoliday Decor
+
+ + + + + + + + + + +
+ + + + + + +
+ + + + + +
Display images to show real-time content
+ +
+ + + +
+ + + + + + + + + + + +
+ + +
Display images to show real-time content
+ + + + + + + + + + + + + +
+ + + + + + + +
Display images to show real-time content
Display images to show real-time content
+
+ + + + + + + + + + + + + +
+ + + + +
+ + + + + + +
Display images to show real-time content Display images to show real-time contentDisplay images to show real-time content
+ + + + + + + +
+
+ + + + + + + + + + + + + +
+ + + + + +
Display images to show real-time content
+ +
+ + + + + +
Display images to show real-time content
+ + +
+ + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
Display images to show real-time contentDisplay images to show real-time content
+ + + + + +
Display images to show real-time content
+ + + + + +
+ + + + + +
Display images to show real-time content
+ +
+ + + + + + + +
Display images to show real-time contentDisplay images to show real-time content
+ + +
+ +
+ + + + + + + + + + + + + +
+ + Black Friday Savings 20 +
+ + + + + + + + + + + + + +
+ + + + + + + +
Black Friday Savings 22
+ +
+ + + +
+ + + + + + + + + + + + + +
+ + + + + +
Black Friday Savings 24
+ +
+ + + +
+ + + + + + + + + + + + + +
+ + + + + +
Black Friday Savings 26
+ +
+ + + +
+ + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + +
+ Black Friday Savings 12 + +
+ + + + + + + + +
Black Friday Savings 13
+ + + +
+ + +
+ + + + + + + + + + + + + +
+ + + + + + + +
Black Friday Savings 14Black Friday Savings 15Black Friday Savings 16
+
+ + + + + + + + + + + + + +
+ + + + + +
Black Friday Savings 28
+ +
+ + + +
+ + + + + + + + + + + +
+ + + + + + +
+ + + + + +
Display images to show real-time content
+ +
+ + + + + + + + +
+ + + + +
Display images to show real-time content
+ + + + +
Display images to show real-time content
+ + + + + + + +
Display images to show real-time content
+ + + + +
Display images to show real-time content
+ + + + +
+
+
+ + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + +
 
TODAY'S SELECTIONS FOR YOU
+
+ + + + + +
+ + + + + + + +
+ + + + + +
Pressure WashersSnow Blowers
+
+ + + + + + + + + + + +
+ + + + + +
Paint PreparationExtension Cords
+ +
+ + + +
+
+ + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + +
Display images to show real-time content
+ + + + + + + + + + + + +
+ + + + + + + + +
+ + Display images to show real-time content +
+ + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + +
+ + + + + +
Mobile App
+
+ + + + + +
Local Ad
+
+
+
+ + + + +
+
+ + + + + + + + + + +
+ + + + + + +
+ + + + + +
Specials & Offers
+
+ + + + + +
Credit Center
+
+
+
+
+ + + + +
+
+ + + + +
+ + + + + + + + + +
Let's Connect:FBTWPYTInstagram
+
+
+ + + + + +
+ + + + +
+ + + + +
+ + + + + + +
Privacy & Security    Contact Us    Store Finder
+
+
+ + + + + + + + + + + +
+ Except as noted, prices valid through 12/18/2019. Prices may vary by store.

To unsubscribe from future emails, click here. + +

Licenses available here. + + +

†Subject to credit approval. Terms and conditions apply. + + +

NOTE: All offers may not be available in all areas. Prices are in U.S. dollars and are subject to change without notice. +

+ + 2455 Paces Ferry Road, N.W., Atlanta, GA 30339-4024, USA.
©2019 Home Depot Product Authority, LLC. All rights reserved. +
+ + + + +
+ + +
+
+ + +
+
+ + + +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/UnitTests/TestData/text/mimekit.net.html b/UnitTests/TestData/text/mimekit.net.html new file mode 100644 index 0000000000..89b19726f8 --- /dev/null +++ b/UnitTests/TestData/text/mimekit.net.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + MimeKit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+

World-Class

+

Parse any message with MimeKit's powerful MIME parser. Properly handles any character encoding.

+

View details »

+
+
+

High Performance

+

MimeKit's parser is orders of magnitude faster than any other MIME parser for .NET. Parse gigabytes of mail in mere seconds rather than the 15 minutes or more that it takes with other .NET MIME parser libraries.

+

View details »

+
+
+

Security

+

MimeKit has full support for S/MIME v3.2, OpenPGP, and DKIM-Signatures.

+

View details »

+
+
+ +

+ +
+
+

Open Source

+

MimeKit and MailKit are open source and completely free for commercial use.

+

View details »

+
+
+

Run Anywhere

+

MimeKit and MailKit support Windows, Linux, Mac, iOS, Android, Windows Phone and more!

+
+
+

Easy To Use

+

MimeKit and MailKit make even the most complex tasks doable.

+
+
+ + + + +

+ +

Help

+ +
+
+

Documentation

+

The documentation portal is the first place to go for help. It has full API coverage and a growing number of source code examples.

+
+
+

Stack Overflow

+

Stack Overflow is a great place to ask questions about MimeKit and MailKit.

+
+
+

Issue Tracker

+

The GitHub Issue Trackers for MimeKit and MailKit are great places to go to file bug reports and make feature requests.

+
+
+ +

+ +

License

+ +

MimeKit is open source under the MIT license and is free for commercial use.

+ +

+ +

Donate

+ +

+ MimeKit and MailKit are personal open source projects that I have put thousands of hours into perfecting + by continuously improving the API based on feedback from developers like yourself, writing documentation, + and optimizing with the goal of making them not only the very best email framework for .NET, but the best + email framework for any programming language. I need your help to achieve this. +

+

If MimeKit and/or MailKit have been helpful to you, please consider donating. Your contributions will be appreciated.

+

+ + Click here to lend your support to MimeKit by making a donation! + +

+ +

+ + + + +
+ + + + + + + + + + + diff --git a/UnitTests/TestData/text/planet-fitness.html b/UnitTests/TestData/text/planet-fitness.html new file mode 100644 index 0000000000..a26309a6b9 --- /dev/null +++ b/UnitTests/TestData/text/planet-fitness.html @@ -0,0 +1,872 @@ + + + + + Planet Fitness + + + + + + + + + + + + + + + + +
Don’t miss our celebrity guest Monday evening
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+                                           +
+ + diff --git a/UnitTests/TestData/text/planet-fitness.txt b/UnitTests/TestData/text/planet-fitness.txt new file mode 100644 index 0000000000..383f0eab62 --- /dev/null +++ b/UnitTests/TestData/text/planet-fitness.txt @@ -0,0 +1,111 @@ +Planet Fitness + + +https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 +View web version. + + + + + + + +https://click.email.planetfitness.com/?qs=fd2766e949040b4ab48e22f7d9e9447a24bee0d865e2726344dbb9445bfe9550309f3710c1455f171c23158086b024cfc6354b301deb2985 + +https://click.email.planetfitness.com/?qs=fd2766e949040b4addbddbe9bb6f8638f98f7bb4a15c3f34a8667b9ea5202381ae63f383208ef093a2e198078d558a251d757d550b613652 + +https://click.email.planetfitness.com/?qs=fd2766e949040b4ab48e22f7d9e9447a24bee0d865e2726344dbb9445bfe9550309f3710c1455f171c23158086b024cfc6354b301deb2985 + + + + + +https://click.email.planetfitness.com/?qs=fd2766e949040b4a8ba0ca93b2738893f382a915e100552dea93b7268c997e97f2bda6a942a8e550771190a598fb34b2df0728b183b797cf + + + +Work - In with Jerry O’Connell! + +Tune to to Facebook Live to follow along with celebrity guest Jerry O’Connell as he works out with his family, and you! + +Live-Streamed Monday, 4pm PT, 5pm MT, 6pm CT, 7pm ET + + +Did it! Week 1 of Home Work-Ins was a huge success thanks to all of you! It feels great to keep moving together and it’s getting even better. + + +We have an exciting week 2 of Home Work-Ins lined up with appearances by many celebrity guests including Actor, Director and Talk Show Host Jerry O’Connell, this Monday. + + +Jerry will be joined by a couple of work-in partners of his own - his family! So if you have a friend, roommate or family member nearby, encourage them to join you. + + +Daily Work-Ins are available for anyone and everyone so tune into Facebook Live Monday, March 23rd at 4pm PT, 5pm MT, 6pm CT and 7pm ET for a fun, family-friendly Work-In! +No Equipment Needed - classes 20 Minutes or less + +https://click.email.planetfitness.com/?qs=fd2766e949040b4a8ba0ca93b2738893f382a915e100552dea93b7268c997e97f2bda6a942a8e550771190a598fb34b2df0728b183b797cf +FACEBOOK LIVE > + + +DOWNLOAD OUR FREE APP + +You can also find hundreds of workouts that you can do anywhere, anytime on the Planet Fitness App — which, as always, is completely FREE to everyone. + +https://click.email.planetfitness.com/?qs=fd2766e949040b4ab68f547c9b18e75fbc7581a77f855a97d3cc035bcb44f2f932897021d489b956329d2e63ef426b81463acaac4ec0bf4d + + +If you have questions about the status of your club, visit https://click.email.planetfitness.com/?qs=fd2766e949040b4af2bd2a5e3f2a21ab10cba203117c5a96a5310ee3a0d25d22ffd396de347843f51ef096ebf1e73d07936394f1cf786f54 + + +https://click.email.planetfitness.com/?qs=fd2766e949040b4ab48e22f7d9e9447a24bee0d865e2726344dbb9445bfe9550309f3710c1455f171c23158086b024cfc6354b301deb2985 + + + + + + + + +https://click.email.planetfitness.com/?qs=fd2766e949040b4a8585b54b48d281f53598c4c29fae23fe7a009d3216f71cf84448c557baa18b3cb4c8a953e97f9a4bafeeeb720681efb1 + +https://click.email.planetfitness.com/?qs=fd2766e949040b4a6310a6acf8c804014580d5e1662b5a8206046685c970ff2770ff55f7078c4602046e8a96fae53d100e3373ecd7db5799 + +https://click.email.planetfitness.com/?qs=fd2766e949040b4a37b21d7bb4301e9e807cf7dc14ab2108c9247373f2a046763a0042f2bb102f55d5658f398dc77175ab6b42a5fb67a0f0 + +https://click.email.planetfitness.com/?qs=fd2766e949040b4a9bc8d7a00cf29e8f017bf396e3f59178472177be72dfb62593e0d8acc24fe8ac609a9b48f3ec05aea93f6e074d05be53 + +https://click.email.planetfitness.com/?qs=fd2766e949040b4af2bd2a5e3f2a21ab10cba203117c5a96a5310ee3a0d25d22ffd396de347843f51ef096ebf1e73d07936394f1cf786f54 +Find a Club + +https://click.email.planetfitness.com/?qs=fd2766e949040b4acc4f4342183d37f6ae0e5e5c1b6a06d331affe132e477c75889922c4cf5cb6cd330a12e1e8988232c95a32d2ac133c58 +Community@PF + +https://click.email.planetfitness.com/?qs=fd2766e949040b4ad196bb82b9436e98956338c61cf13ec8ce9b952d57cad393dcd84667a45d254980c712241061e5c435f09757a0a68302 +About Planet Fitness + +https://click.email.planetfitness.com/?qs=fd2766e949040b4aa5f82506f59dff039c2ae94395e3d9087e4670c1fa355caec85a7b295e3bbc2d85d5212e26cad91534e5b0c06e5f0c80 +Contact Us + + +My Club: Boston, MA + +https://click.email.planetfitness.com/?qs=fd2766e949040b4ab48e22f7d9e9447a24bee0d865e2726344dbb9445bfe9550309f3710c1455f171c23158086b024cfc6354b301deb2985 +planetfitness.com + + +Planet Fitness facilities are independently owned and operated. Offers are valid at participating locations and home club only. State and local taxes, annual membership fee and/or 12-month commitment may apply. There may be incentives offered for enrolling in other memberships. See home club for details. + + + + +https://click.email.planetfitness.com/profile_center.aspx?qs=268c8e2e8c9235dc6f85fdf897f0cab733bfea4c9c36a7f901b3c6827608a64762a095adceb0ea7e9ab59c794fdfdc8095243684b21125583bdaa852c8df792144bca9a725498f92 +Manage Subscription +https://click.email.planetfitness.com/unsub_center.aspx?qs=268c8e2e8c9235dcf6ad43b30405c3205973f0468ea88c55035a9ec86bca16b77bc7f95a7f72c685088d2762b8c4560b97c615d55ae29710f127416eff6a4b48d77d312b06e13365 +Unsubscribe + + +Planet Fitness + +4 Liberty Lane West, Hampton New Hampshire 03842 United States + +(c)2020 Planet Fitness, All rights reserved. diff --git a/UnitTests/Text/HtmlTextPreviewerTests.cs b/UnitTests/Text/HtmlTextPreviewerTests.cs new file mode 100644 index 0000000000..a99ea72cc4 --- /dev/null +++ b/UnitTests/Text/HtmlTextPreviewerTests.cs @@ -0,0 +1,115 @@ +// +// HtmlTextPreviewerTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit; +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class HtmlTextPreviewerTests + { + [Test] + public void TestArgumentExceptions () + { + var previewer = new HtmlTextPreviewer (); + + Assert.Throws (() => previewer.MaximumPreviewLength = 0); + Assert.Throws (() => previewer.MaximumPreviewLength = 1025); + + Assert.Throws (() => TextPreviewer.GetPreviewText (null)); + + Assert.Throws (() => previewer.GetPreviewText ((string) null)); + Assert.Throws (() => previewer.GetPreviewText ((TextReader) null)); + Assert.Throws (() => previewer.GetPreviewText ((Stream) null, "charset")); + Assert.Throws (() => previewer.GetPreviewText (Stream.Null, (string) null)); + Assert.Throws (() => previewer.GetPreviewText ((Stream) null, Encoding.ASCII)); + Assert.Throws (() => previewer.GetPreviewText (Stream.Null, (Encoding) null)); + } + + void AssertPreviewText (string path, string expected) + { + var previewer = new HtmlTextPreviewer (); + var buffer = new byte[16 * 1024]; + string actual; + int nread; + + using (var stream = File.OpenRead (path)) + nread = stream.Read (buffer, 0, buffer.Length); + + var text = Encoding.UTF8.GetString (buffer, 0, nread); + actual = previewer.GetPreviewText (text); + Assert.AreEqual (expected, actual, "GetPreviewText(string)"); + + using (var stream = new MemoryStream (buffer, 0, nread, false)) { + actual = previewer.GetPreviewText (stream, "utf-8"); + Assert.AreEqual (expected, actual, "GetPreviewText(Stream, string)"); + + stream.Position = 0; + actual = previewer.GetPreviewText (stream, Encoding.UTF8); + Assert.AreEqual (expected, actual, "GetPreviewText(Stream, Encoding)"); + + stream.Position = 0; + using (var reader = new StreamReader (stream, Encoding.UTF8, false, 4096, true)) { + actual = previewer.GetPreviewText (stream, Encoding.UTF8); + Assert.AreEqual (expected, actual, "GetPreviewText(TextReader)"); + } + } + } + + [Test] + public void TestHomeDepotCheckInsideNOW () + { + var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); + const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; + + AssertPreviewText (path, expected); + } + + [Test] + public void TestMimeKitHomepage () + { + string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> I\u2026"; + var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); + + AssertPreviewText (path, expected); + } + + [Test] + public void TestPlanetFitness () + { + string expected = "Don’t miss our celebrity guest Monday evening"; + var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); + + AssertPreviewText (path, expected); + } + } +} diff --git a/UnitTests/Text/PlainTextPreviewerTests.cs b/UnitTests/Text/PlainTextPreviewerTests.cs new file mode 100644 index 0000000000..cbc482f750 --- /dev/null +++ b/UnitTests/Text/PlainTextPreviewerTests.cs @@ -0,0 +1,97 @@ +// +// PlainTextPreviewerTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit; +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class PlainTextPreviewerTests + { + [Test] + public void TestArgumentExceptions () + { + var previewer = new PlainTextPreviewer (); + + Assert.Throws (() => previewer.MaximumPreviewLength = 0); + Assert.Throws (() => previewer.MaximumPreviewLength = 1025); + + Assert.Throws (() => TextPreviewer.GetPreviewText (null)); + + Assert.Throws (() => previewer.GetPreviewText ((string) null)); + Assert.Throws (() => previewer.GetPreviewText ((TextReader) null)); + Assert.Throws (() => previewer.GetPreviewText ((Stream) null, "charset")); + Assert.Throws (() => previewer.GetPreviewText (Stream.Null, (string) null)); + Assert.Throws (() => previewer.GetPreviewText ((Stream) null, Encoding.ASCII)); + Assert.Throws (() => previewer.GetPreviewText (Stream.Null, (Encoding) null)); + } + + void AssertPreviewText (string path, string expected) + { + var previewer = new PlainTextPreviewer (); + var buffer = new byte[16 * 1024]; + string actual; + int nread; + + using (var stream = File.OpenRead (path)) + nread = stream.Read (buffer, 0, buffer.Length); + + var text = Encoding.UTF8.GetString (buffer, 0, nread); + actual = previewer.GetPreviewText (text); + Assert.AreEqual (expected, actual, "GetPreviewText(string)"); + + using (var stream = new MemoryStream (buffer, 0, nread, false)) { + actual = previewer.GetPreviewText (stream, "utf-8"); + Assert.AreEqual (expected, actual, "GetPreviewText(Stream, string)"); + + stream.Position = 0; + actual = previewer.GetPreviewText (stream, Encoding.UTF8); + Assert.AreEqual (expected, actual, "GetPreviewText(Stream, Encoding)"); + + stream.Position = 0; + using (var reader = new StreamReader (stream, Encoding.UTF8, false, 4096, true)) { + actual = previewer.GetPreviewText (stream, Encoding.UTF8); + Assert.AreEqual (expected, actual, "GetPreviewText(TextReader)"); + } + } + } + + [Test] + public void TestPlanetFitness () + { + const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b…"; + var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); + + AssertPreviewText (path, expected); + } + } +} diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs new file mode 100644 index 0000000000..65ab46e8c6 --- /dev/null +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -0,0 +1,99 @@ +// +// TextPreviewerTests.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Text; + +using MimeKit; +using MimeKit.Text; + +using NUnit.Framework; + +namespace UnitTests.Text { + [TestFixture] + public class TextPreviewerTests + { + [Test] + public void TestArgumentExceptions () + { + Assert.Throws (() => TextPreviewer.GetPreviewText (null)); + } + + static TextPart CreateTextPart (string path) + { + var subtype = Path.GetExtension (path) == ".html" ? "html" : "plain"; + var text = File.ReadAllText (path); + + return new TextPart (subtype) { Text = text }; + } + + void AssertPreviewText (string path, string expected) + { + var body = CreateTextPart (path); + string actual; + + actual = TextPreviewer.GetPreviewText (body); + Assert.AreEqual (expected, actual); + } + + [Test] + public void TestHomeDepotCheckInsideNOW () + { + var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); + const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; + + AssertPreviewText (path, expected); + } + + [Test] + public void TestMimeKitHomepage () + { + string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> I\u2026"; + var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); + + AssertPreviewText (path, expected); + } + + [Test] + public void TestPlanetFitness () + { + string expected = "Don’t miss our celebrity guest Monday evening"; + var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); + + AssertPreviewText (path, expected); + } + + [Test] + public void TestPlanetFitnessPlain () + { + const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b…"; + var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); + + AssertPreviewText (path, expected); + } + } +} diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 728419ebaf..6810f7c006 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -57,7 +57,7 @@ ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - ..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net45\System.Data.SQLite.dll + ..\packages\System.Data.SQLite.Core.1.0.112.0\lib\net45\System.Data.SQLite.dll @@ -112,13 +112,16 @@ + + + @@ -265,6 +268,10 @@ PreserveNewest + + + + @@ -359,5 +366,5 @@ - + diff --git a/UnitTests/packages.config b/UnitTests/packages.config index ce6d388c6c..9d1d6686b1 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file From fdc839f3a01079c2f314067b39b54cdbd8d19963 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Mar 2020 19:20:50 -0400 Subject: [PATCH 496/741] Removed Npgsql.dll from the unit tests --- UnitTests/Npgsql.dll | Bin 342016 -> 0 bytes UnitTests/UnitTests.csproj | 3 --- 2 files changed, 3 deletions(-) delete mode 100644 UnitTests/Npgsql.dll diff --git a/UnitTests/Npgsql.dll b/UnitTests/Npgsql.dll deleted file mode 100644 index 1aeb4cfd0a463b2becda269e90dafce16f99ea57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342016 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 diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 6810f7c006..f8e34c9e78 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -265,9 +265,6 @@ - - PreserveNewest - From af14a9737d088fb18d235119e821f0d0eb16e092 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 26 Mar 2020 21:29:50 -0400 Subject: [PATCH 497/741] Fixed unit test build (odd ambiguity) --- UnitTests/Text/HtmlTextPreviewerTests.cs | 2 -- UnitTests/Text/PlainTextPreviewerTests.cs | 2 -- UnitTests/Text/TextPreviewerTests.cs | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/UnitTests/Text/HtmlTextPreviewerTests.cs b/UnitTests/Text/HtmlTextPreviewerTests.cs index a99ea72cc4..3e984ba0e8 100644 --- a/UnitTests/Text/HtmlTextPreviewerTests.cs +++ b/UnitTests/Text/HtmlTextPreviewerTests.cs @@ -45,8 +45,6 @@ public void TestArgumentExceptions () Assert.Throws (() => previewer.MaximumPreviewLength = 0); Assert.Throws (() => previewer.MaximumPreviewLength = 1025); - Assert.Throws (() => TextPreviewer.GetPreviewText (null)); - Assert.Throws (() => previewer.GetPreviewText ((string) null)); Assert.Throws (() => previewer.GetPreviewText ((TextReader) null)); Assert.Throws (() => previewer.GetPreviewText ((Stream) null, "charset")); diff --git a/UnitTests/Text/PlainTextPreviewerTests.cs b/UnitTests/Text/PlainTextPreviewerTests.cs index cbc482f750..8fe9e460ee 100644 --- a/UnitTests/Text/PlainTextPreviewerTests.cs +++ b/UnitTests/Text/PlainTextPreviewerTests.cs @@ -45,8 +45,6 @@ public void TestArgumentExceptions () Assert.Throws (() => previewer.MaximumPreviewLength = 0); Assert.Throws (() => previewer.MaximumPreviewLength = 1025); - Assert.Throws (() => TextPreviewer.GetPreviewText (null)); - Assert.Throws (() => previewer.GetPreviewText ((string) null)); Assert.Throws (() => previewer.GetPreviewText ((TextReader) null)); Assert.Throws (() => previewer.GetPreviewText ((Stream) null, "charset")); diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs index 65ab46e8c6..f1eb264a6c 100644 --- a/UnitTests/Text/TextPreviewerTests.cs +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -40,7 +40,7 @@ public class TextPreviewerTests [Test] public void TestArgumentExceptions () { - Assert.Throws (() => TextPreviewer.GetPreviewText (null)); + Assert.Throws (() => TextPreviewer.GetPreviewText ((TextPart) null)); } static TextPart CreateTextPart (string path) From 1d17009145d107307e2f525c954c6a0bc13d665a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 27 Mar 2020 08:25:03 -0400 Subject: [PATCH 498/741] Added more TextPreviewer unit tests --- UnitTests/Text/HtmlTextPreviewerTests.cs | 59 ++++++++++++++++++++--- UnitTests/Text/PlainTextPreviewerTests.cs | 18 +++++++ UnitTests/Text/TextPreviewerTests.cs | 17 +++---- 3 files changed, 78 insertions(+), 16 deletions(-) diff --git a/UnitTests/Text/HtmlTextPreviewerTests.cs b/UnitTests/Text/HtmlTextPreviewerTests.cs index 3e984ba0e8..3376223e2c 100644 --- a/UnitTests/Text/HtmlTextPreviewerTests.cs +++ b/UnitTests/Text/HtmlTextPreviewerTests.cs @@ -53,13 +53,31 @@ public void TestArgumentExceptions () Assert.Throws (() => previewer.GetPreviewText (Stream.Null, (Encoding) null)); } - void AssertPreviewText (string path, string expected) + [Test] + public void TestEmptyText () { var previewer = new HtmlTextPreviewer (); + + Assert.AreEqual (string.Empty, previewer.GetPreviewText (string.Empty), "string"); + + using (var reader = new StringReader (string.Empty)) + Assert.AreEqual (string.Empty, previewer.GetPreviewText (reader), "TextReader"); + + using (var stream = new MemoryStream (new byte[0], false)) { + Assert.AreEqual (string.Empty, previewer.GetPreviewText (stream, "x-unknown"), "Stream, string"); + Assert.AreEqual (string.Empty, previewer.GetPreviewText (stream, Encoding.UTF8), "Stream, Encoding"); + } + } + + void AssertPreviewText (string path, string expected, int maxPreviewLen) + { + var previewer = new HtmlTextPreviewer { MaximumPreviewLength = maxPreviewLen }; var buffer = new byte[16 * 1024]; string actual; int nread; + Assert.AreEqual (TextFormat.Html, previewer.InputFormat); + using (var stream = File.OpenRead (path)) nread = stream.Read (buffer, 0, buffer.Length); @@ -84,30 +102,57 @@ void AssertPreviewText (string path, string expected) } [Test] - public void TestHomeDepotCheckInsideNOW () + public void TestHomeDepot110 () { var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; - AssertPreviewText (path, expected); + AssertPreviewText (path, expected, 110); } [Test] - public void TestMimeKitHomepage () + public void TestHomeDepot230 () + { + var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); + const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; + + AssertPreviewText (path, expected, 230); + } + + [Test] + public void TestMimeKitHomepage110 () { string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> I\u2026"; var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); - AssertPreviewText (path, expected); + AssertPreviewText (path, expected, 110); + } + + [Test] + public void TestMimeKitHomepage230 () + { + string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> Install-Package MimeKit PM> Install-Package MailKit or Install via VS Package Management window. Direct Download ZIP fil\u2026"; + var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); + + AssertPreviewText (path, expected, 230); + } + + [Test] + public void TestPlanetFitness110 () + { + string expected = "Don’t miss our celebrity guest Monday evening"; + var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); + + AssertPreviewText (path, expected, 110); } [Test] - public void TestPlanetFitness () + public void TestPlanetFitness230 () { string expected = "Don’t miss our celebrity guest Monday evening"; var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); - AssertPreviewText (path, expected); + AssertPreviewText (path, expected, 230); } } } diff --git a/UnitTests/Text/PlainTextPreviewerTests.cs b/UnitTests/Text/PlainTextPreviewerTests.cs index 8fe9e460ee..42a3a8dbf7 100644 --- a/UnitTests/Text/PlainTextPreviewerTests.cs +++ b/UnitTests/Text/PlainTextPreviewerTests.cs @@ -53,6 +53,22 @@ public void TestArgumentExceptions () Assert.Throws (() => previewer.GetPreviewText (Stream.Null, (Encoding) null)); } + [Test] + public void TestEmptyText () + { + var previewer = new PlainTextPreviewer (); + + Assert.AreEqual (string.Empty, previewer.GetPreviewText (string.Empty), "string"); + + using (var reader = new StringReader (string.Empty)) + Assert.AreEqual (string.Empty, previewer.GetPreviewText (reader), "TextReader"); + + using (var stream = new MemoryStream (new byte[0], false)) { + Assert.AreEqual (string.Empty, previewer.GetPreviewText (stream, "x-unknown"), "Stream, string"); + Assert.AreEqual (string.Empty, previewer.GetPreviewText (stream, Encoding.UTF8), "Stream, Encoding"); + } + } + void AssertPreviewText (string path, string expected) { var previewer = new PlainTextPreviewer (); @@ -60,6 +76,8 @@ void AssertPreviewText (string path, string expected) string actual; int nread; + Assert.AreEqual (TextFormat.Plain, previewer.InputFormat); + using (var stream = File.OpenRead (path)) nread = stream.Read (buffer, 0, buffer.Length); diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs index f1eb264a6c..49a3570377 100644 --- a/UnitTests/Text/TextPreviewerTests.cs +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -43,17 +43,16 @@ public void TestArgumentExceptions () Assert.Throws (() => TextPreviewer.GetPreviewText ((TextPart) null)); } - static TextPart CreateTextPart (string path) + static TextPart CreateTextPart (string path, TextFormat format) { - var subtype = Path.GetExtension (path) == ".html" ? "html" : "plain"; var text = File.ReadAllText (path); - return new TextPart (subtype) { Text = text }; + return new TextPart (format) { Text = text }; } - void AssertPreviewText (string path, string expected) + void AssertPreviewText (string path, TextFormat format, string expected) { - var body = CreateTextPart (path); + var body = CreateTextPart (path, format); string actual; actual = TextPreviewer.GetPreviewText (body); @@ -66,7 +65,7 @@ public void TestHomeDepotCheckInsideNOW () var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; - AssertPreviewText (path, expected); + AssertPreviewText (path, TextFormat.Html, expected); } [Test] @@ -75,7 +74,7 @@ public void TestMimeKitHomepage () string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> I\u2026"; var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); - AssertPreviewText (path, expected); + AssertPreviewText (path, TextFormat.Html, expected); } [Test] @@ -84,7 +83,7 @@ public void TestPlanetFitness () string expected = "Don’t miss our celebrity guest Monday evening"; var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); - AssertPreviewText (path, expected); + AssertPreviewText (path, TextFormat.Html, expected); } [Test] @@ -93,7 +92,7 @@ public void TestPlanetFitnessPlain () const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b…"; var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); - AssertPreviewText (path, expected); + AssertPreviewText (path, TextFormat.Plain, expected); } } } From 6fa5134226f99966893a9704af6516b4209c4d27 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 27 Mar 2020 12:17:47 -0400 Subject: [PATCH 499/741] Removed duplicated logic in TextPreviewer and added more tests --- MimeKit/Text/TextPreviewer.cs | 8 ---- UnitTests/Text/TextPreviewerTests.cs | 55 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/MimeKit/Text/TextPreviewer.cs b/MimeKit/Text/TextPreviewer.cs index 1839001e71..2aa2158219 100644 --- a/MimeKit/Text/TextPreviewer.cs +++ b/MimeKit/Text/TextPreviewer.cs @@ -111,14 +111,6 @@ public static string GetPreviewText (TextPart body) return string.Empty; var encoding = body.ContentType.CharsetEncoding; - - if (encoding == null) { - using (var content = body.Content.Open ()) { - if (!CharsetUtils.TryGetBomEncoding (content, out encoding)) - encoding = CharsetUtils.UTF8; - } - } - var buffer = new byte[16 * 1024]; int nread = 0; diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs index 49a3570377..8d853062a3 100644 --- a/UnitTests/Text/TextPreviewerTests.cs +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -94,5 +94,60 @@ public void TestPlanetFitnessPlain () AssertPreviewText (path, TextFormat.Plain, expected); } + + [Test] + public void TestGetPreviewTextUnknownCharset () + { + var encoding = Encoding.GetEncoding ("big5"); + var builder = new StringBuilder (); + + using (var memory = new MemoryStream ()) { + var bytes = encoding.GetBytes ("日月星辰"); + string preview; + + memory.Write (bytes, 0, bytes.Length); + memory.Position = 0; + + var body = new TextPart ("plain") { + Content = new MimeContent (memory, ContentEncoding.Default) + }; + body.ContentType.Charset = "x-unknown"; + + preview = TextPreviewer.GetPreviewText (body); + Assert.AreEqual ("¤é¤ë¬P¨°", preview, "chinese text x-unknown -> UTF-8 -> iso-8859-1"); + } + + using (var memory = new MemoryStream ()) { + var bytes = Encoding.UTF8.GetBytes ("日月星辰"); + string preview; + + memory.Write (bytes, 0, bytes.Length); + memory.Position = 0; + + var body = new TextPart ("plain") { + Content = new MimeContent (memory, ContentEncoding.Default) + }; + body.ContentType.Charset = "x-unknown"; + + preview = TextPreviewer.GetPreviewText (body); + Assert.AreEqual ("日月星辰", preview, "x-unknown -> UTF-8"); + } + + using (var memory = new MemoryStream ()) { + var bytes = Encoding.GetEncoding (28591).GetBytes ("L'encyclopédie libre"); + string preview; + + memory.Write (bytes, 0, bytes.Length); + memory.Position = 0; + + var body = new TextPart ("plain") { + Content = new MimeContent (memory, ContentEncoding.Default) + }; + body.ContentType.Charset = "x-unknown"; + + preview = TextPreviewer.GetPreviewText (body); + Assert.AreEqual ("L'encyclopédie libre", preview, "french text x-unknown -> UTF-8 -> iso-8859-1"); + } + } } } From 0042b7490c8f5218675aae9b19f53a2ce36011b7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 27 Mar 2020 12:18:43 -0400 Subject: [PATCH 500/741] Fixed up a doc comment --- MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 207029c611..02468596fa 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -447,7 +447,7 @@ X509Certificate GetCertificate (IX509Store store, SignerID signer) /// Build a certificate chain. ///

/// - /// Builds a certificate chain for the provided certificate. + /// Builds a certificate chain for the provided certificate to include when signing. /// This method is ideal for use with custom /// implementations when it is desirable to include the certificate chain /// in the signature. From 156a18240713adc77708e50056458f1cbabde2ac Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 27 Mar 2020 18:27:51 -0400 Subject: [PATCH 501/741] Increased the default MaximumPreviewLength value to 230 Apparently this is (closer to?) what the GMail web API uses. --- MimeKit/Text/TextPreviewer.cs | 5 +++-- UnitTests/Text/PlainTextPreviewerTests.cs | 2 +- UnitTests/Text/TextPreviewerTests.cs | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/MimeKit/Text/TextPreviewer.cs b/MimeKit/Text/TextPreviewer.cs index 2aa2158219..5a78151a98 100644 --- a/MimeKit/Text/TextPreviewer.cs +++ b/MimeKit/Text/TextPreviewer.cs @@ -49,7 +49,7 @@ public abstract class TextPreviewer /// protected TextPreviewer () { - maximumPreviewLength = 110; + maximumPreviewLength = 230; } /// @@ -67,7 +67,8 @@ public abstract TextFormat InputFormat { /// Get or set the maximum text preview length. /// /// - /// Gets or sets the maximum text preview length. + /// Gets or sets the maximum text preview length. + /// The default value is 230 which is what the GMail web API seems to use. /// /// The maximum text preview length. /// diff --git a/UnitTests/Text/PlainTextPreviewerTests.cs b/UnitTests/Text/PlainTextPreviewerTests.cs index 42a3a8dbf7..91aba06f57 100644 --- a/UnitTests/Text/PlainTextPreviewerTests.cs +++ b/UnitTests/Text/PlainTextPreviewerTests.cs @@ -104,7 +104,7 @@ void AssertPreviewText (string path, string expected) [Test] public void TestPlanetFitness () { - const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b…"; + const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…"; var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); AssertPreviewText (path, expected); diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs index 8d853062a3..cffe3876e2 100644 --- a/UnitTests/Text/TextPreviewerTests.cs +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -71,7 +71,7 @@ public void TestHomeDepotCheckInsideNOW () [Test] public void TestMimeKitHomepage () { - string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> I\u2026"; + string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> Install-Package MimeKit PM> Install-Package MailKit or Install via VS Package Management window. Direct Download ZIP fil\u2026"; var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); AssertPreviewText (path, TextFormat.Html, expected); @@ -89,7 +89,7 @@ public void TestPlanetFitness () [Test] public void TestPlanetFitnessPlain () { - const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b…"; + const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…"; var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); AssertPreviewText (path, TextFormat.Plain, expected); From 56c51438ac5058abc9af0b2f92a2e015172accfb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 28 Mar 2020 19:08:49 -0400 Subject: [PATCH 502/741] Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers --- MimeKit/Cryptography/SqlCertificateDatabase.cs | 2 +- MimeKit/Cryptography/X509CertificateDatabase.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index d8ec592b78..d85ef683fa 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -291,7 +291,7 @@ void CreateCertificatesTable (DataTable table) command.AddParameterWithValue ("@ID", record.Id); command.AddParameterWithValue ("@ANCHOR", record.IsAnchor); command.AddParameterWithValue ("@SUBJECTNAME", record.SubjectName); - command.AddParameterWithValue ("@SUBJECTKEYIDENTIFIER", record.SubjectKeyIdentifier.AsHex ()); + command.AddParameterWithValue ("@SUBJECTKEYIDENTIFIER", record.SubjectKeyIdentifier?.AsHex ()); command.CommandType = CommandType.Text; command.CommandText = statement; diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 9fe570423f..3ea55ceea2 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -494,7 +494,7 @@ protected object GetValue (X509CertificateRecord record, string columnName) case "ISSUERNAME": return record.IssuerName; case "SERIALNUMBER": return record.SerialNumber; case "SUBJECTNAME": return record.SubjectName; - case "SUBJECTKEYIDENTIFIER": return record.SubjectKeyIdentifier.AsHex (); + case "SUBJECTKEYIDENTIFIER": return record.SubjectKeyIdentifier?.AsHex (); case "SUBJECTEMAIL": return record.SubjectEmail != null ? record.SubjectEmail.ToLowerInvariant () : string.Empty; case "FINGERPRINT": return record.Fingerprint.ToLowerInvariant (); case "ALGORITHMS": return EncodeEncryptionAlgorithms (record.Algorithms); From b74116ed7a5eec20057458e2754c1562847b0ef8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 28 Mar 2020 22:03:24 -0400 Subject: [PATCH 503/741] Added more MimeVIsitor unit tests and implemented TnefPart.Accept() --- MimeKit/Tnef/TnefPart.cs | 23 ++++ UnitTests/MimeVisitorTests.cs | 243 ++++++++++++++++++++++++++++++++++ UnitTests/Tnef/TnefTests.cs | 8 ++ 3 files changed, 274 insertions(+) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index b78ea2f157..f2edf1c6af 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -71,6 +71,29 @@ public TnefPart () : base ("application", "vnd.ms-tnef") FileName = "winmail.dat"; } + /// + /// Dispatches to the specific visit method for this MIME entity. + /// + /// + /// This default implementation for nodes + /// calls . Override this + /// method to call into a more specific method on a derived visitor class + /// of the class. However, it should still + /// support unknown visitors by calling + /// . + /// + /// The visitor. + /// + /// is null. + /// + public override void Accept (MimeVisitor visitor) + { + if (visitor == null) + throw new ArgumentNullException (nameof (visitor)); + + visitor.VisitTnefPart (this); + } + static void ExtractRecipientTable (TnefReader reader, MimeMessage message) { var prop = reader.TnefPropertyReader; diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index cb1d4e6fe7..12d7c35b1b 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -31,6 +31,8 @@ using NUnit.Framework; using MimeKit; +using MimeKit.Tnef; +using MimeKit.Cryptography; namespace UnitTests { [TestFixture] @@ -77,5 +79,246 @@ public void TestMimeVisitor () } } } + + class MimeVisitorTester : MimeVisitor + { + public int ApplicationPgpEncrypted; + public int ApplicationPgpSignature; + public int ApplicationPkcs7Mime; + public int ApplicationPkcs7Signature; + public int Message; + public int MessageDeliveryStatus; + public int MessageDispositionNotification; + public int MessagePart; + public int MessagePartial; + public int MimeEntity; + public int MimeMessage; + public int MimePart; + public int Multipart; + public int MultipartAlternative; + public int MultipartEncrypted; + public int MultipartRelated; + public int MultipartReport; + public int MultipartSigned; + public int TextPart; + public int TextRfc822Headers; + public int TnefPart; + + protected internal override void VisitApplicationPgpEncrypted (ApplicationPgpEncrypted entity) + { + ApplicationPgpEncrypted++; + base.VisitApplicationPgpEncrypted (entity); + } + + protected internal override void VisitApplicationPgpSignature (ApplicationPgpSignature entity) + { + ApplicationPgpSignature++; + base.VisitApplicationPgpSignature (entity); + } + + protected internal override void VisitApplicationPkcs7Mime (ApplicationPkcs7Mime entity) + { + ApplicationPkcs7Mime++; + base.VisitApplicationPkcs7Mime (entity); + } + + protected internal override void VisitApplicationPkcs7Signature (ApplicationPkcs7Signature entity) + { + ApplicationPkcs7Signature++; + base.VisitApplicationPkcs7Signature (entity); + } + + protected override void VisitMessage (MessagePart entity) + { + Message++; + base.VisitMessage (entity); + } + + protected internal override void VisitMessageDeliveryStatus (MessageDeliveryStatus entity) + { + MessageDeliveryStatus++; + base.VisitMessageDeliveryStatus (entity); + } + + protected internal override void VisitMessageDispositionNotification (MessageDispositionNotification entity) + { + MessageDispositionNotification++; + base.VisitMessageDispositionNotification (entity); + } + + protected internal override void VisitMessagePart (MessagePart entity) + { + MessagePart++; + base.VisitMessagePart (entity); + } + + protected internal override void VisitMessagePartial (MessagePartial entity) + { + MessagePartial++; + base.VisitMessagePartial (entity); + } + + protected internal override void VisitMimeEntity (MimeEntity entity) + { + MimeEntity++; + base.VisitMimeEntity (entity); + } + + protected internal override void VisitMimeMessage (MimeMessage message) + { + MimeMessage++; + base.VisitMimeMessage (message); + } + + protected internal override void VisitMimePart (MimePart entity) + { + MimePart++; + base.VisitMimePart (entity); + } + + protected internal override void VisitMultipart (Multipart multipart) + { + Multipart++; + base.VisitMultipart (multipart); + } + + protected internal override void VisitMultipartAlternative (MultipartAlternative alternative) + { + MultipartAlternative++; + base.VisitMultipartAlternative (alternative); + } + + protected internal override void VisitMultipartEncrypted (MultipartEncrypted encrypted) + { + MultipartEncrypted++; + base.VisitMultipartEncrypted (encrypted); + } + + protected internal override void VisitMultipartRelated (MultipartRelated related) + { + MultipartRelated++; + base.VisitMultipartRelated (related); + } + + protected internal override void VisitMultipartReport (MultipartReport report) + { + MultipartReport++; + base.VisitMultipartReport (report); + } + + protected internal override void VisitMultipartSigned (MultipartSigned signed) + { + MultipartSigned++; + base.VisitMultipartSigned (signed); + } + + protected internal override void VisitTextPart (TextPart entity) + { + TextPart++; + base.VisitTextPart (entity); + } + + protected internal override void VisitTextRfc822Headers (TextRfc822Headers entity) + { + TextRfc822Headers++; + base.VisitTextRfc822Headers (entity); + } + + protected internal override void VisitTnefPart (TnefPart entity) + { + TnefPart++; + base.VisitTnefPart (entity); + } + } + + [Test] + public void TestVisitorMethods () + { + var message = new MimeMessage (); + message.Body = new MultipartSigned () { + new Multipart ("mixed") { + new MultipartAlternative () { + new TextPart ("plain"), + new MultipartRelated () { + new TextPart ("html"), + new MimePart ("image", "jpeg") + } + }, + new TnefPart (), + new MessagePart () { + Message = new MimeMessage () { + Body = new MultipartReport ("delivery-status") { + new MessageDeliveryStatus (), + new TextRfc822Headers () + } + } + }, + new MessagePart () { + Message = new MimeMessage () { + Body = new MultipartReport ("disposition-notification") { + new MessageDispositionNotification () + } + } + }, + new MessagePartial ("id", 1, 1), + new ApplicationPkcs7Mime (SecureMimeType.SignedData, Stream.Null), + new ApplicationPkcs7Signature (Stream.Null), + new MultipartEncrypted () { + new MimePart ("application", "octet-stream"), + new ApplicationPgpEncrypted () + } + }, + new ApplicationPgpSignature (Stream.Null) + }; + var visitor = new MimeVisitorTester (); + + visitor.Visit (message); + Assert.AreEqual (1, visitor.ApplicationPgpEncrypted); + Assert.AreEqual (1, visitor.ApplicationPgpSignature); + Assert.AreEqual (1, visitor.ApplicationPkcs7Mime); + Assert.AreEqual (1, visitor.ApplicationPkcs7Signature); + Assert.AreEqual (3, visitor.Message); + Assert.AreEqual (1, visitor.MessageDeliveryStatus); + Assert.AreEqual (1, visitor.MessageDispositionNotification); + Assert.AreEqual (3, visitor.MessagePart); + Assert.AreEqual (1, visitor.MessagePartial); + Assert.AreEqual (22, visitor.MimeEntity); + Assert.AreEqual (3, visitor.MimeMessage); + Assert.AreEqual (12, visitor.MimePart); + Assert.AreEqual (7, visitor.Multipart); + Assert.AreEqual (1, visitor.MultipartAlternative); + Assert.AreEqual (1, visitor.MultipartEncrypted); + Assert.AreEqual (1, visitor.MultipartRelated); + Assert.AreEqual (2, visitor.MultipartReport); + Assert.AreEqual (1, visitor.MultipartSigned); + Assert.AreEqual (2, visitor.TextPart); + Assert.AreEqual (1, visitor.TextRfc822Headers); + Assert.AreEqual (1, visitor.TnefPart); + + visitor = new MimeVisitorTester (); + + visitor.Visit (message.Body); + Assert.AreEqual (1, visitor.ApplicationPgpEncrypted); + Assert.AreEqual (1, visitor.ApplicationPgpSignature); + Assert.AreEqual (1, visitor.ApplicationPkcs7Mime); + Assert.AreEqual (1, visitor.ApplicationPkcs7Signature); + Assert.AreEqual (3, visitor.Message); + Assert.AreEqual (1, visitor.MessageDeliveryStatus); + Assert.AreEqual (1, visitor.MessageDispositionNotification); + Assert.AreEqual (3, visitor.MessagePart); + Assert.AreEqual (1, visitor.MessagePartial); + Assert.AreEqual (22, visitor.MimeEntity); + Assert.AreEqual (2, visitor.MimeMessage); + Assert.AreEqual (12, visitor.MimePart); + Assert.AreEqual (7, visitor.Multipart); + Assert.AreEqual (1, visitor.MultipartAlternative); + Assert.AreEqual (1, visitor.MultipartEncrypted); + Assert.AreEqual (1, visitor.MultipartRelated); + Assert.AreEqual (2, visitor.MultipartReport); + Assert.AreEqual (1, visitor.MultipartSigned); + Assert.AreEqual (2, visitor.TextPart); + Assert.AreEqual (1, visitor.TextRfc822Headers); + Assert.AreEqual (1, visitor.TnefPart); + } } } diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index d1586d5d70..c6f169091e 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -41,6 +41,14 @@ namespace UnitTests.Tnef { [TestFixture] public class TnefTests { + [Test] + public void TestArgumentExceptions () + { + var tnef = new TnefPart (); + + Assert.Throws (() => tnef.Accept (null)); + } + static void ExtractRecipientTable (TnefReader reader, MimeMessage message) { var prop = reader.TnefPropertyReader; From 70d7a2ded2384a0ff8009ef832656243e573e51c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 29 Mar 2020 13:29:21 -0400 Subject: [PATCH 504/741] Made Header.FormatRawValue() protected virtual so that developers can override it Also made some internal .ctors protected since developers will need to override these methods (and no-op, but still). --- MimeKit/Header.cs | 120 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 37 deletions(-) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 7be74401fd..0ae798b2af 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -277,8 +277,19 @@ public Header (string field, string value) : this (Encoding.UTF8, field, value) { } - // Note: this .ctor is only used by Clone() - internal Header (ParserOptions options, HeaderId id, string name, byte[] field, byte[] value) + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new message or entity header with the specified values. + /// This constructor is used by . + /// + /// The parser options used. + /// The id of the header. + /// The name of the header field. + /// The raw header field. + /// The raw value of the header. + protected Header (ParserOptions options, HeaderId id, string name, byte[] field, byte[] value) { Options = options; rawField = field; @@ -287,7 +298,19 @@ internal Header (ParserOptions options, HeaderId id, string name, byte[] field, Id = id; } - internal Header (ParserOptions options, byte[] field, byte[] value, bool invalid) + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new message or entity header with the specified raw values. + /// This constructor is used by the + /// TryParse methods. + /// + /// The parser options used. + /// The raw header field. + /// The raw value of the header. + /// true if the header field is invalid; othereise, false. + internal protected Header (ParserOptions options, byte[] field, byte[] value, bool invalid) { var chars = new char[field.Length]; int count = 0; @@ -306,7 +329,18 @@ internal Header (ParserOptions options, byte[] field, byte[] value, bool invalid IsInvalid = invalid; } - internal Header (ParserOptions options, HeaderId id, string field, byte[] value) + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new message or entity header with the specified raw values. + /// This constructor is used by and + /// when serializing new values for headers. + /// + /// The parser options used. + /// The raw header field. + /// The raw value of the header. + internal protected Header (ParserOptions options, HeaderId id, string field, byte[] value) { Options = options; rawField = Encoding.ASCII.GetBytes (field); @@ -463,7 +497,7 @@ public string GetValue (string charset) return GetValue (encoding); } - static byte[] EncodeAddressHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeAddressHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var encoded = new StringBuilder (" "); int lineLength = field.Length + 2; @@ -481,9 +515,9 @@ static byte[] EncodeAddressHeader (ParserOptions options, FormatOptions format, return Encoding.ASCII.GetBytes (encoded.ToString ()); } - static byte[] EncodeMessageIdHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeMessageIdHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { - return charset.GetBytes (" " + value + format.NewLine); + return encoding.GetBytes (" " + value + format.NewLine); } delegate void ReceivedTokenSkipValueFunc (byte[] text, ref int index); @@ -587,10 +621,10 @@ public ReceivedTokenValue (int startIndex, int length) } } - static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var tokens = new List (); - var rawValue = charset.GetBytes (value); + var rawValue = encoding.GetBytes (value); var encoded = new StringBuilder (); int lineLength = field.Length + 1; bool date = false; @@ -609,7 +643,7 @@ static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, while (index < rawValue.Length && !rawValue[index].IsWhitespace ()) index++; - var atom = charset.GetString (rawValue, startIndex, index - startIndex); + var atom = encoding.GetString (rawValue, startIndex, index - startIndex); for (int i = 0; i < ReceivedTokens.Length; i++) { if (atom == ReceivedTokens[i].Atom) { @@ -648,7 +682,7 @@ static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, } foreach (var token in tokens) { - var text = charset.GetString (rawValue, token.StartIndex, token.Length).TrimEnd (); + var text = encoding.GetString (rawValue, token.StartIndex, token.Length).TrimEnd (); if (count > 0 && lineLength + text.Length + 1 > format.MaxLineLength) { encoded.Append (format.NewLine); @@ -667,22 +701,22 @@ static byte[] EncodeReceivedHeader (ParserOptions options, FormatOptions format, encoded.Append (format.NewLine); - return charset.GetBytes (encoded.ToString ()); + return encoding.GetBytes (encoded.ToString ()); } - static byte[] EncodeAuthenticationResultsHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeAuthenticationResultsHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var buffer = Encoding.UTF8.GetBytes (value); if (!AuthenticationResults.TryParse (buffer, out AuthenticationResults authres)) - return EncodeUnstructuredHeader (options, format, charset, field, value); + return EncodeUnstructuredHeader (options, format, encoding, field, value); var encoded = new StringBuilder (); int lineLength = field.Length + 1; authres.Encode (format, encoded, lineLength); - return charset.GetBytes (encoded.ToString ()); + return encoding.GetBytes (encoded.ToString ()); } static void EncodeDkimLongValue (FormatOptions format, StringBuilder encoded, ref int lineLength, string value) @@ -735,7 +769,7 @@ static void EncodeDkimHeaderList (FormatOptions format, StringBuilder encoded, r } } - static byte[] EncodeDkimOrArcSignatureHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeDkimOrArcSignatureHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var encoded = new StringBuilder (); int lineLength = field.Length + 1; @@ -799,10 +833,10 @@ static byte[] EncodeDkimOrArcSignatureHeader (ParserOptions options, FormatOptio encoded.Append (format.NewLine); - return charset.GetBytes (encoded.ToString ()); + return encoding.GetBytes (encoded.ToString ()); } - static byte[] EncodeReferencesHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeReferencesHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var encoded = new StringBuilder (); int lineLength = field.Length + 1; @@ -826,7 +860,7 @@ static byte[] EncodeReferencesHeader (ParserOptions options, FormatOptions forma encoded.Append (format.NewLine); - return charset.GetBytes (encoded.ToString ()); + return encoding.GetBytes (encoded.ToString ()); } static bool IsWhiteSpace (char c) @@ -955,23 +989,23 @@ internal static string Fold (FormatOptions format, string field, string value) return folded.ToString (); } - static byte[] EncodeContentDisposition (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeContentDisposition (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var disposition = ContentDisposition.Parse (options, value); - var encoded = disposition.Encode (format, charset); + var encoded = disposition.Encode (format, encoding); return Encoding.UTF8.GetBytes (encoded); } - static byte[] EncodeContentType (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeContentType (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { var contentType = ContentType.Parse (options, value); - var encoded = contentType.Encode (format, charset); + var encoded = contentType.Encode (format, encoding); return Encoding.UTF8.GetBytes (encoded); } - static byte[] EncodeUnstructuredHeader (ParserOptions options, FormatOptions format, Encoding charset, string field, string value) + static byte[] EncodeUnstructuredHeader (ParserOptions options, FormatOptions format, Encoding encoding, string field, string value) { if (format.International) { var folded = Fold (format, field, value); @@ -979,12 +1013,24 @@ static byte[] EncodeUnstructuredHeader (ParserOptions options, FormatOptions for return Encoding.UTF8.GetBytes (folded); } - var encoded = Rfc2047.EncodeText (format, charset, value); + var encoded = Rfc2047.EncodeText (format, encoding, value); return Rfc2047.FoldUnstructuredHeader (format, field, encoded); } - byte[] FormatRawValue (FormatOptions format, Encoding encoding) + /// + /// Format the raw value of the header to conform with the specified formatting options. + /// + /// + /// This method will called by the SetValue + /// methods and may also be conditionally called when the header is being written to a + /// . + /// + /// The formatting options. + /// The character encoding to be used. + /// The decoded (and unfolded) header value. + /// A byte array containing the raw header value that should be written. + protected virtual byte[] FormatRawValue (FormatOptions format, Encoding encoding, string value) { switch (Id) { case HeaderId.DispositionNotificationTo: @@ -1000,29 +1046,29 @@ byte[] FormatRawValue (FormatOptions format, Encoding encoding) case HeaderId.Bcc: case HeaderId.Cc: case HeaderId.To: - return EncodeAddressHeader (Options, format, encoding, Field, textValue); + return EncodeAddressHeader (Options, format, encoding, Field, value); case HeaderId.Received: - return EncodeReceivedHeader (Options, format, encoding, Field, textValue); + return EncodeReceivedHeader (Options, format, encoding, Field, value); case HeaderId.ResentMessageId: case HeaderId.InReplyTo: case HeaderId.MessageId: case HeaderId.ContentId: - return EncodeMessageIdHeader (Options, format, encoding, Field, textValue); + return EncodeMessageIdHeader (Options, format, encoding, Field, value); case HeaderId.References: - return EncodeReferencesHeader (Options, format, encoding, Field, textValue); + return EncodeReferencesHeader (Options, format, encoding, Field, value); case HeaderId.ContentDisposition: - return EncodeContentDisposition (Options, format, encoding, Field, textValue); + return EncodeContentDisposition (Options, format, encoding, Field, value); case HeaderId.ContentType: - return EncodeContentType (Options, format, encoding, Field, textValue); + return EncodeContentType (Options, format, encoding, Field, value); case HeaderId.ArcAuthenticationResults: case HeaderId.AuthenticationResults: - return EncodeAuthenticationResultsHeader (Options, format, encoding, Field, textValue); + return EncodeAuthenticationResultsHeader (Options, format, encoding, Field, value); case HeaderId.ArcMessageSignature: case HeaderId.ArcSeal: case HeaderId.DkimSignature: - return EncodeDkimOrArcSignatureHeader (Options, format, encoding, Field, textValue); + return EncodeDkimOrArcSignatureHeader (Options, format, encoding, Field, value); default: - return EncodeUnstructuredHeader (Options, format, encoding, Field, textValue); + return EncodeUnstructuredHeader (Options, format, encoding, Field, value); } } @@ -1033,7 +1079,7 @@ internal byte[] GetRawValue (FormatOptions format) textValue = Unfold (Rfc2047.DecodeText (Options, rawValue)); // Note: if we're reformatting to be International, then charset doesn't matter. - return FormatRawValue (format, CharsetUtils.UTF8); + return FormatRawValue (format, CharsetUtils.UTF8, textValue); } return rawValue; @@ -1070,7 +1116,7 @@ public void SetValue (FormatOptions format, Encoding encoding, string value) textValue = Unfold (value.Trim ()); - rawValue = FormatRawValue (format, encoding); + rawValue = FormatRawValue (format, encoding, textValue); // cache the formatting options that change the way the header is formatted //allowMixedHeaderCharsets = format.AllowMixedHeaderCharsets; From a715fa92eed43982f1ed76fa160f0364f96f3c3f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 29 Mar 2020 13:58:55 -0400 Subject: [PATCH 505/741] Added Header.SetRawValue() Fixes issue #546 --- MimeKit/Header.cs | 34 +++++++++++++++++++++++++++++++++- UnitTests/HeaderTests.cs | 21 +++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 0ae798b2af..625d011253 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -50,6 +50,7 @@ public class Header //Encoding charset = CharsetUtils.UTF8; readonly byte[] rawField; + bool explicitRawValue; string textValue; byte[] rawValue; @@ -359,6 +360,7 @@ internal protected Header (ParserOptions options, HeaderId id, string field, byt public Header Clone () { var header = new Header (Options, Id, Field, rawField, rawValue) { + explicitRawValue = explicitRawValue, IsInvalid = IsInvalid }; @@ -1074,7 +1076,7 @@ protected virtual byte[] FormatRawValue (FormatOptions format, Encoding encoding internal byte[] GetRawValue (FormatOptions format) { - if (format.International) { + if (format.International && !explicitRawValue) { if (textValue == null) textValue = Unfold (Rfc2047.DecodeText (Options, rawValue)); @@ -1209,6 +1211,36 @@ public void SetValue (string charset, string value) SetValue (FormatOptions.Default, encoding, value); } + /// + /// Set the raw header value. + /// + /// + /// Sets the raw header value. + /// This method can be used to override default encoding and folding behavior + /// for a particular header. + /// + /// The raw header value. + /// + /// is null. + /// + /// + /// does not end with a new-line character. + /// + public void SetRawValue (byte[] value) + { + if (value == null) + throw new ArgumentNullException (nameof (value)); + + if (value.Length == 0 || value[value.Length - 1] != (byte) '\n') + throw new ArgumentException ("The raw value MUST end with a new-line character.", nameof (value)); + + explicitRawValue = true; + rawValue = value; + textValue = null; + + OnChanged (); + } + internal event EventHandler Changed; void OnChanged () diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index 6d544ec233..cc98d2a447 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -105,6 +105,11 @@ public void TestArgumentExceptions () Assert.Throws (() => header.SetValue (Encoding.UTF8, null)); Assert.Throws (() => header.SetValue ((string) null, "value")); Assert.Throws (() => header.SetValue ("utf-8", null)); + + // SetRawValue + Assert.Throws (() => header.SetRawValue (null)); + Assert.Throws (() => header.SetRawValue (new byte[0])); + Assert.Throws (() => header.SetRawValue (Encoding.ASCII.GetBytes ("abc"))); } [Test] @@ -375,5 +380,21 @@ public void TestToHeaderId () Assert.AreEqual (HeaderId.Unknown, parsed, "Failed to parse the made-up header value"); } + + [Test] + public void TestSetRawValue () + { + var header = new Header (HeaderId.Subject, "This is the subject"); + var rawValue = Encoding.ASCII.GetBytes ("This is the\n raw subject\n"); + var format = FormatOptions.Default.Clone (); + format.International = true; + + header.SetRawValue (rawValue); + + var value = header.GetRawValue (format); + Assert.AreEqual (rawValue.Length, value.Length, "Length"); + for (int i = 0; i < rawValue.Length; i++) + Assert.AreEqual (rawValue[i], value[i], "rawValue[{0}]", i); + } } } From 339938363745c6a1e7ab8f8afef9da272a698a78 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 29 Mar 2020 14:23:09 -0400 Subject: [PATCH 506/741] Switched MimeKit for Android and iOS over to using Portable.BouncyCastle This replaces the need for me to maintain custom BouncyCastle ports for Android and iOS and packaging those assemblies with MimeKit. This also means that developers will be able to update their Portable.BouncyCastle packages if they need newer features or bug fixes. --- MimeKit.sln | 12 ------------ MimeKit/MimeKit.Android.csproj | 6 ------ MimeKit/MimeKit.Android.project.json | 5 ++++- MimeKit/MimeKit.iOS.csproj | 8 -------- MimeKit/MimeKit.iOS.project.json | 5 ++++- nuget/MimeKit.nuspec | 10 ++++++---- 6 files changed, 14 insertions(+), 32 deletions(-) diff --git a/MimeKit.sln b/MimeKit.sln index 900915b33a..92a80e9a87 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -11,10 +11,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Android", "MimeKit\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.iOS", "MimeKit\MimeKit.iOS.csproj", "{4C1288AD-12C8-4BF7-AED7-6C4DC539C856}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle.Android", "submodules\bc-csharp\crypto\BouncyCastle.Android.csproj", "{A0D302CB-8866-4AB1-98B9-F0772EABF5DF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle.iOS", "submodules\bc-csharp\crypto\BouncyCastle.iOS.csproj", "{0249241C-205E-4AC0-828B-90F822359B9E}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit.NetStandard", "MimeKit\MimeKit.NetStandard.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" @@ -41,14 +37,6 @@ Global {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Debug|Any CPU.Build.0 = Debug|Any CPU {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.Build.0 = Release|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Release|Any CPU.Build.0 = Release|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Release|Any CPU.Build.0 = Release|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index baaf2a276f..1e8f50c0a7 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -54,12 +54,6 @@
- - - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF} - BouncyCastle.Android - - diff --git a/MimeKit/MimeKit.Android.project.json b/MimeKit/MimeKit.Android.project.json index e48a8bf5fe..b30c00839b 100644 --- a/MimeKit/MimeKit.Android.project.json +++ b/MimeKit/MimeKit.Android.project.json @@ -4,5 +4,8 @@ }, "runtimes": { "win-anycpu": {} + }, + "dependencies": { + "Portable.BouncyCastle": "1.8.5" } -} +} \ No newline at end of file diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 7557f1675e..290deab45d 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -51,14 +51,6 @@ - - - {0249241C-205E-4AC0-828B-90F822359B9E} - BouncyCastle.iOS - false - false - - diff --git a/MimeKit/MimeKit.iOS.project.json b/MimeKit/MimeKit.iOS.project.json index cf98a9e75e..67e6d8dec2 100644 --- a/MimeKit/MimeKit.iOS.project.json +++ b/MimeKit/MimeKit.iOS.project.json @@ -4,5 +4,8 @@ }, "runtimes": { "win-anycpu": {} + }, + "dependencies": { + "Portable.BouncyCastle": "1.8.5" } -} +} \ No newline at end of file diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 08f84516c2..e541364adf 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -77,8 +77,12 @@ - - + + + + + + @@ -109,10 +113,8 @@ - - From f454901769aa37ef774d2a890f89cd5912465378 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 29 Mar 2020 14:40:42 -0400 Subject: [PATCH 507/741] Removed the bc-csharp submodule --- .gitmodules | 4 ---- submodules/bc-csharp | 1 - 2 files changed, 5 deletions(-) delete mode 100644 .gitmodules delete mode 160000 submodules/bc-csharp diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d2c6c23def..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "submodules/bc-csharp"] - path = submodules/bc-csharp - url = https://github.com/jstedfast/bc-csharp.git - branch = build-fix diff --git a/submodules/bc-csharp b/submodules/bc-csharp deleted file mode 160000 index 8238b66f1e..0000000000 --- a/submodules/bc-csharp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8238b66f1e4767e5d56a2e440f5fdfd2028a2d65 From 58de5050958613c52ecd7d1844f72eb868fc5e94 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 30 Mar 2020 09:05:37 -0400 Subject: [PATCH 508/741] Updated README.md --- README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 99a919f266..a3ed18a061 100644 --- a/README.md +++ b/README.md @@ -1210,13 +1210,21 @@ tracker and look for something that might pique your interest! ## Reporting Bugs -Have a bug or a feature request? [Please open a new issue](https://github.com/jstedfast/MimeKit/issues). +Have a bug or a feature request? Please open a new +[bug report](https://github.com/jstedfast/MimeKit/issues/new?template=bug_report.md) +or +[feature request](https://github.com/jstedfast/MimeKit/issues/new?template=feature_request.md). -Before opening a new issue, please search for existing issues to avoid submitting duplicates. +Before opening a new issue, please search through any [existing issues](https://github.com/jstedfast/MimeKit/issues) +to avoid submitting duplicates. It may also be worth checking the +[FAQ](https://github.com/jstedfast/MimeKit/blob/master/FAQ.md) for common questions that other developers +have had. + +If you are getting an exception from somewhere within MimeKit, don't just provide the `Exception.Message` +string. Please include the `Exception.StackTrace` as well. The `Message`, by itself, is often useless. ## Documentation API documentation can be found at [http://www.mimekit.net/docs](http://www.mimekit.net/docs). -A copy of the xml formatted API documentation is also included in the NuGet and/or -Xamarin Component package. +A copy of the XML-formatted API reference documentation is also included in the NuGet package. From 371bf5748ebefaa52fd983cbc6411929c14fbd0d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 31 Mar 2020 10:07:38 -0400 Subject: [PATCH 509/741] minor code cleanup --- MimeKit/MimeParser.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index e06e9d5148..4e3f22f506 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -675,12 +675,11 @@ unsafe void ParseAndAppendHeader () return; fixed (byte* buf = headerBuffer) { - Header header; - - Header.TryParse (options, buf, headerIndex, false, out header); - header.Offset = headerOffset; - headers.Add (header); - headerIndex = 0; + if (Header.TryParse (options, buf, headerIndex, false, out var header)) { + header.Offset = headerOffset; + headers.Add (header); + headerIndex = 0; + } } } From a08a85a2bdce015310d88a921cf1da02388f9700 Mon Sep 17 00:00:00 2001 From: Sandro Magi Date: Thu, 2 Apr 2020 12:16:20 -0400 Subject: [PATCH 510/741] added an explicit registration method and a test to validate it --- MimeKit/MimeTypes.cs | 25 +++++++++++++++++++++++++ UnitTests/MimeTypeTests.cs | 12 ++++++++++++ 2 files changed, 37 insertions(+) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index dd180cd468..c4a1ce18b0 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -1030,5 +1030,30 @@ public static bool TryGetExtension (string mimeType, out string extension) return extensions.TryGetValue (mimeType, out extension); } + + /// + /// Register a MIME-type to file extension mapping. + /// + /// + /// Registers a MIME-type to file extension mapping. + /// + /// The MIME-type to register. + /// The file extension to register. + /// + /// is null. + /// -or- + /// is null. + /// + public static void Register (string mimeType, string extension) + { + if (mimeType == null) + throw new ArgumentNullException (nameof (mimeType)); + + if (extension == null) + throw new ArgumentNullException (nameof (extension)); + + mimeTypes.Add (extension, mimeType); + extensions.Add (mimeType, extension); + } } } diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 81b98a908c..abe37486f6 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -80,5 +80,17 @@ public void TestTryGetExtensionUnknownMimeType () Assert.IsFalse (MimeTypes.TryGetExtension ("application/x-vnd.fake-mime-type", out extension)); } + + [Test] + public void TestMimeTypeRegister () + { + string extension; + + Assert.AreEqual ("application/octet-stream", MimeTypes.GetMimeType ("message.msg")); + Assert.False (MimeTypes.TryGetExtension ("application/vnd.ms-outlook", out extension)); + MimeTypes.Register ("application/vnd.ms-outlook", ".msg"); + Assert.True (MimeTypes.TryGetExtension ("application/vnd.ms-outlook", out extension)); + Assert.AreEqual (".msg", extension); + } } } From 20e8e1c96be9adbe5d6525093b6f7b678a3132c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 14:22:12 -0400 Subject: [PATCH 511/741] Made tweaks to the MimeType internals to make it more consistent. --- MimeKit/MimeTypes.cs | 1113 ++++++++++++++++++------------------ UnitTests/MimeTypeTests.cs | 3 + 2 files changed, 567 insertions(+), 549 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index c4a1ce18b0..509360c97f 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -25,6 +25,7 @@ // using System; +using System.IO; using System.Collections.Generic; using MimeKit.Utils; @@ -50,548 +51,548 @@ static MimeTypes () static Dictionary LoadMimeTypes () { return new Dictionary (MimeUtils.OrdinalIgnoreCase) { - { "323", "text/h323" }, - { "3g2", "video/3gpp2" }, - { "3gp", "video/3gpp" }, - { "7z", "application/x-7z-compressed" }, - { "aab", "application/x-authorware-bin" }, - { "aac", "audio/aac" }, - { "aam", "application/x-authorware-map" }, - { "aas", "application/x-authorware-seg" }, - { "abc", "text/vnd.abc" }, - { "acgi", "text/html" }, - { "acx", "application/internet-property-stream" }, - { "afl", "video/animaflex" }, - { "ai", "application/postscript" }, - { "aif", "audio/aiff" }, - { "aifc", "audio/aiff" }, - { "aiff", "audio/aiff" }, - { "aim", "application/x-aim" }, - { "aip", "text/x-audiosoft-intra" }, - { "ani", "application/x-navi-animation" }, - { "aos", "application/x-nokia-9000-communicator-add-on-software" }, - { "appcache", "text/cache-manifest" }, - { "application", "application/x-ms-application" }, - { "aps", "application/mime" }, - { "art", "image/x-jg" }, - { "asf", "video/x-ms-asf" }, - { "asm", "text/x-asm" }, - { "asp", "text/asp" }, - { "asr", "video/x-ms-asf" }, - { "asx", "application/x-mplayer2" }, - { "atom", "application/atom+xml" }, - { "au", "audio/x-au" }, - { "avi", "video/avi" }, - { "avs", "video/avs-video" }, - { "axs", "application/olescript" }, - { "bas", "text/plain" }, - { "bcpio", "application/x-bcpio" }, - { "bin", "application/octet-stream" }, - { "bm", "image/bmp" }, - { "bmp", "image/bmp" }, - { "boo", "application/book" }, - { "book", "application/book" }, - { "boz", "application/x-bzip2" }, - { "bsh", "application/x-bsh" }, - { "bz2", "application/x-bzip2" }, - { "bz", "application/x-bzip" }, - { "cat", "application/vnd.ms-pki.seccat" }, - { "ccad", "application/clariscad" }, - { "cco", "application/x-cocoa" }, - { "cc", "text/plain" }, - { "cdf", "application/cdf" }, - { "cer", "application/pkix-cert" }, - { "cha", "application/x-chat" }, - { "chat", "application/x-chat" }, - { "chm", "application/vnd.ms-htmlhelp" }, - { "class", "application/x-java-applet" }, - { "clp", "application/x-msclip" }, - { "cmx", "image/x-cmx" }, - { "cod", "image/cis-cod" }, - { "coffee", "text/x-coffeescript" }, - { "conf", "text/plain" }, - { "cpio", "application/x-cpio" }, - { "cpp", "text/plain" }, - { "cpt", "application/x-cpt" }, - { "crd", "application/x-mscardfile" }, - { "crl", "application/pkix-crl" }, - { "crt", "application/pkix-cert" }, - { "csh", "application/x-csh" }, - { "css", "text/css" }, - { "csv", "text/csv" }, - { "cs", "text/plain" }, - { "c", "text/plain" }, - { "c++", "text/plain" }, - { "cxx", "text/plain" }, - { "dart", "application/dart" }, - { "dcr", "application/x-director" }, - { "deb", "application/x-deb" }, - { "deepv", "application/x-deepv" }, - { "def", "text/plain" }, - { "deploy", "application/octet-stream" }, - { "der", "application/x-x509-ca-cert" }, - { "dib", "image/bmp" }, - { "dif", "video/x-dv" }, - { "dir", "application/x-director" }, - { "disco", "text/xml" }, - { "dll", "application/x-msdownload" }, - { "dl", "video/dl" }, - { "doc", "application/msword" }, - { "docm", "application/vnd.ms-word.document.macroEnabled.12" }, - { "docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, - { "dot", "application/msword" }, - { "dotm", "application/vnd.ms-word.template.macroEnabled.12" }, - { "dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, - { "dp", "application/commonground" }, - { "drw", "application/drafting" }, - { "dtd", "application/xml-dtd" }, - { "dvi", "application/x-dvi" }, - { "dv", "video/x-dv" }, - { "dwg", "application/acad" }, - { "dxf", "application/dxf" }, - { "dxr", "application/x-director" }, - { "el", "text/x-script.elisp" }, - { "elc", "application/x-elc" }, - { "eml", "message/rfc822" }, - { "eot", "application/vnd.bw-fontobject" }, - { "eps", "application/postscript" }, - { "epub", "application/epub+zip" }, - { "es", "application/x-esrehber" }, - { "etx", "text/x-setext" }, - { "evy", "application/envoy" }, - { "exe", "application/octet-stream" }, - { "f77", "text/plain" }, - { "f90", "text/plain" }, - { "fdf", "application/vnd.fdf" }, - { "fif", "image/fif" }, - { "flac", "audio/x-flac" }, - { "fli", "video/fli" }, - { "flx", "text/vnd.fmi.flexstor" }, - { "fmf", "video/x-atomic3d-feature" }, - { "for", "text/plain" }, - { "fpx", "image/vnd.fpx" }, - { "frl", "application/freeloader" }, - { "fsx", "application/fsharp-script" }, - { "g3", "image/g3fax" }, - { "gif", "image/gif" }, - { "gl", "video/gl" }, - { "gsd", "audio/x-gsm" }, - { "gsm", "audio/x-gsm" }, - { "gsp", "application/x-gsp" }, - { "gss", "application/x-gss" }, - { "gtar", "application/x-gtar" }, - { "g", "text/plain" }, - { "gz", "application/x-gzip" }, - { "gzip", "application/x-gzip" }, - { "hdf", "application/x-hdf" }, - { "help", "application/x-helpfile" }, - { "hgl", "application/vnd.hp-HPGL" }, - { "hh", "text/plain" }, - { "hlb", "text/x-script" }, - { "hlp", "application/x-helpfile" }, - { "hpg", "application/vnd.hp-HPGL" }, - { "hpgl", "application/vnd.hp-HPGL" }, - { "hqx", "application/binhex" }, - { "hta", "application/hta" }, - { "htc", "text/x-component" }, - { "h", "text/plain" }, - { "htmls", "text/html" }, - { "html", "text/html" }, - { "htm", "text/html" }, - { "htt", "text/webviewhtml" }, - { "htx", "text/html" }, - { "ico", "image/x-icon" }, - { "ics", "text/calendar" }, - { "idc", "text/plain" }, - { "ief", "image/ief" }, - { "iefs", "image/ief" }, - { "iges", "model/iges" }, - { "igs", "model/iges" }, - { "iii", "application/x-iphone" }, - { "ima", "application/x-ima" }, - { "imap", "application/x-httpd-imap" }, - { "inf", "application/inf" }, - { "ins", "application/x-internett-signup" }, - { "ip", "application/x-ip2" }, - { "isp", "application/x-internet-signup" }, - { "isu", "video/x-isvideo" }, - { "it", "audio/it" }, - { "iv", "application/x-inventor" }, - { "ivf", "video/x-ivf" }, - { "ivy", "application/x-livescreen" }, - { "jam", "audio/x-jam" }, - { "jar", "application/java-archive" }, - { "java", "text/plain" }, - { "jav", "text/plain" }, - { "jcm", "application/x-java-commerce" }, - { "jfif", "image/jpeg" }, - { "jfif-tbnl", "image/jpeg" }, - { "jpeg", "image/jpeg" }, - { "jpe", "image/jpeg" }, - { "jpg", "image/jpeg" }, - { "jps", "image/x-jps" }, - { "js", "application/javascript" }, - { "json", "application/json" }, - { "jut", "image/jutvision" }, - { "kar", "audio/midi" }, - { "ksh", "text/x-script.ksh" }, - { "la", "audio/nspaudio" }, - { "lam", "audio/x-liveaudio" }, - { "latex", "application/x-latex" }, - { "list", "text/plain" }, - { "lma", "audio/nspaudio" }, - { "log", "text/plain" }, - { "lsp", "application/x-lisp" }, - { "lst", "text/plain" }, - { "lsx", "text/x-la-asf" }, - { "ltx", "application/x-latex" }, - { "m13", "application/x-msmediaview" }, - { "m14", "application/x-msmediaview" }, - { "m1v", "video/mpeg" }, - { "m2a", "audio/mpeg" }, - { "m2v", "video/mpeg" }, - { "m3u", "audio/x-mpequrl" }, - { "m4a", "audio/mp4" }, - { "m4v", "video/mp4" }, - { "man", "application/x-troff-man" }, - { "manifest", "application/x-ms-manifest" }, - { "map", "application/x-navimap" }, - { "mar", "text/plain" }, - { "markdown", "text/markdown" }, - { "mbd", "application/mbedlet" }, - { "mc$", "application/x-magic-cap-package-1.0" }, - { "mcd", "application/mcad" }, - { "mcf", "image/vasa" }, - { "mcp", "application/netmc" }, - { "md", "text/markdown" }, - { "mdb", "application/x-msaccess" }, - { "mesh", "model/mesh" }, - { "me", "application/x-troff-me" }, - { "mid", "audio/midi" }, - { "midi", "audio/midi" }, - { "mif", "application/x-mif" }, - { "mjf", "audio/x-vnd.AudioExplosion.MjuiceMediaFile" }, - { "mjpg", "video/x-motion-jpeg" }, - { "mm", "application/base64" }, - { "mme", "application/base64" }, - { "mny", "application/x-msmoney" }, - { "mod", "audio/mod" }, - { "mov", "video/quicktime" }, - { "movie", "video/x-sgi-movie" }, - { "mp2", "video/mpeg" }, - { "mp3", "audio/mpeg" }, - { "mp4", "video/mp4" }, - { "mp4a", "audio/mp4" }, - { "mp4v", "video/mp4" }, - { "mpa", "audio/mpeg" }, - { "mpc", "application/x-project" }, - { "mpeg", "video/mpeg" }, - { "mpe", "video/mpeg" }, - { "mpga", "audio/mpeg" }, - { "mpg", "video/mpeg" }, - { "mpp", "application/vnd.ms-project" }, - { "mpt", "application/x-project" }, - { "mpv2", "video/mpeg" }, - { "mpv", "application/x-project" }, - { "mpx", "application/x-project" }, - { "mrc", "application/marc" }, - { "ms", "application/x-troff-ms" }, - { "msh", "model/mesh" }, - { "m", "text/plain" }, - { "mvb", "application/x-msmediaview" }, - { "mv", "video/x-sgi-movie" }, - { "mzz", "application/x-vnd.AudioExplosion.mzz" }, - { "nap", "image/naplps" }, - { "naplps", "image/naplps" }, - { "nc", "application/x-netcdf" }, - { "ncm", "application/vnd.nokia.configuration-message" }, - { "niff", "image/x-niff" }, - { "nif", "image/x-niff" }, - { "nix", "application/x-mix-transfer" }, - { "nsc", "application/x-conference" }, - { "nvd", "application/x-navidoc" }, - { "nws", "message/rfc822" }, - { "oda", "application/oda" }, - { "ods", "application/oleobject" }, - { "oga", "audio/ogg" }, - { "ogg", "audio/ogg" }, - { "ogv", "video/ogg" }, - { "ogx", "application/ogg" }, - { "omc", "application/x-omc" }, - { "omcd", "application/x-omcdatamaker" }, - { "omcr", "application/x-omcregerator" }, - { "opus", "audio/ogg" }, - { "otf", "font/otf" }, - { "oxps", "application/oxps" }, - { "p10", "application/pkcs10" }, - { "p12", "application/pkcs-12" }, - { "p7a", "application/x-pkcs7-signature" }, - { "p7b", "application/x-pkcs7-certificates" }, - { "p7c", "application/pkcs7-mime" }, - { "p7m", "application/pkcs7-mime" }, - { "p7r", "application/x-pkcs7-certreqresp" }, - { "p7s", "application/pkcs7-signature" }, - { "part", "application/pro_eng" }, - { "pas", "text/pascal" }, - { "pbm", "image/x-portable-bitmap" }, - { "pcl", "application/x-pcl" }, - { "pct", "image/x-pict" }, - { "pcx", "image/x-pcx" }, - { "pdf", "application/pdf" }, - { "pfx", "application/x-pkcs12" }, - { "pgm", "image/x-portable-graymap" }, - { "pic", "image/pict" }, - { "pict", "image/pict" }, - { "pkg", "application/x-newton-compatible-pkg" }, - { "pko", "application/vnd.ms-pki.pko" }, - { "pl", "text/plain" }, - { "plx", "application/x-PiXCLscript" }, - { "pm4", "application/x-pagemaker" }, - { "pm5", "application/x-pagemaker" }, - { "pma", "application/x-perfmon" }, - { "pmc", "application/x-perfmon" }, - { "pm", "image/x-xpixmap" }, - { "pml", "application/x-perfmon" }, - { "pmr", "application/x-perfmon" }, - { "pmw", "application/x-perfmon" }, - { "png", "image/png" }, - { "pnm", "application/x-portable-anymap" }, - { "pot", "application/vnd.ms-powerpoint" }, - { "potm", "application/vnd.ms-powerpoint.template.macroEnabled.12" }, - { "potx", "application/vnd.openxmlformats-officedocument.presentationml.template" }, - { "pov", "model/x-pov" }, - { "ppa", "application/vnd.ms-powerpoint" }, - { "ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12" }, - { "ppm", "image/x-portable-pixmap" }, - { "pps", "application/vnd.ms-powerpoint" }, - { "ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12" }, - { "ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow" }, - { "ppt", "application/vnd.ms-powerpoint" }, - { "pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12" }, - { "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, - { "ppz", "application/mspowerpoint" }, - { "pre", "application/x-freelance" }, - { "prf", "application/pics-rules" }, - { "prt", "application/pro_eng" }, - { "ps", "application/postscript" }, - { "p", "text/x-pascal" }, - { "pub", "application/x-mspublisher" }, - { "pwz", "application/vnd.ms-powerpoint" }, - { "pyc", "application/x-bytecode.python" }, - { "py", "text/x-script.phyton" }, - { "qcp", "audio/vnd.qcelp" }, - { "qif", "image/x-quicktime" }, - { "qtc", "video/x-qtc" }, - { "qtif", "image/x-quicktime" }, - { "qti", "image/x-quicktime" }, - { "qt", "video/quicktime" }, - { "ra", "audio/x-pn-realaudio" }, - { "ram", "audio/x-pn-realaudio" }, - { "ras", "application/x-cmu-raster" }, - { "rast", "image/cmu-raster" }, - { "rexx", "text/x-script.rexx" }, - { "rf", "image/vnd.rn-realflash" }, - { "rgb", "image/x-rgb" }, - { "rm", "application/vnd.rn-realmedia" }, - { "rmi", "audio/mid" }, - { "rmm", "audio/x-pn-realaudio" }, - { "rmp", "audio/x-pn-realaudio" }, - { "rng", "application/ringing-tones" }, - { "rnx", "application/vnd.rn-realplayer" }, - { "roff", "application/x-troff" }, - { "rp", "image/vnd.rn-realpix" }, - { "rpm", "audio/x-pn-realaudio-plugin" }, - { "rss", "application/rss+xml" }, - { "rtf", "text/rtf" }, - { "rt", "text/richtext" }, - { "rtx", "text/richtext" }, - { "rv", "video/vnd.rn-realvideo" }, - { "s3m", "audio/s3m" }, - { "sbk", "application/x-tbook" }, - { "scd", "application/x-msschedule" }, - { "scm", "application/x-lotusscreencam" }, - { "sct", "text/scriptlet" }, - { "sdml", "text/plain" }, - { "sdp", "application/sdp" }, - { "sdr", "application/sounder" }, - { "sea", "application/sea" }, - { "set", "application/set" }, - { "setpay", "application/set-payment-initiation" }, - { "setreg", "application/set-registration-initiation" }, - { "sgml", "text/sgml" }, - { "sgm", "text/sgml" }, - { "shar", "application/x-bsh" }, - { "sh", "text/x-script.sh" }, - { "shtml", "text/html" }, - { "sid", "audio/x-psid" }, - { "silo", "model/mesh" }, - { "sit", "application/x-sit" }, - { "skd", "application/x-koan" }, - { "skm", "application/x-koan" }, - { "skp", "application/x-koan" }, - { "skt", "application/x-koan" }, - { "sl", "application/x-seelogo" }, - { "smi", "application/smil" }, - { "smil", "application/smil" }, - { "snd", "audio/basic" }, - { "sol", "application/solids" }, - { "spc", "application/x-pkcs7-certificates" }, - { "spl", "application/futuresplash" }, - { "spr", "application/x-sprite" }, - { "sprite", "application/x-sprite" }, - { "spx", "audio/ogg" }, - { "src", "application/x-wais-source" }, - { "ssi", "text/x-server-parsed-html" }, - { "ssm", "application/streamingmedia" }, - { "sst", "application/vnd.ms-pki.certstore" }, - { "step", "application/step" }, - { "s", "text/x-asm" }, - { "stl", "application/sla" }, - { "stm", "text/html" }, - { "stp", "application/step" }, - { "sv4cpio", "application/x-sv4cpio" }, - { "sv4crc", "application/x-sv4crc" }, - { "svf", "image/x-dwg" }, - { "svg", "image/svg+xml" }, - { "svr", "application/x-world" }, - { "swf", "application/x-shockwave-flash" }, - { "talk", "text/x-speech" }, - { "t", "application/x-troff" }, - { "tar", "application/x-tar" }, - { "tbk", "application/toolbook" }, - { "tcl", "text/x-script.tcl" }, - { "tcsh", "text/x-script.tcsh" }, - { "tex", "application/x-tex" }, - { "texi", "application/x-texinfo" }, - { "texinfo", "application/x-texinfo" }, - { "text", "text/plain" }, - { "tgz", "application/x-compressed" }, - { "tiff", "image/tiff" }, - { "tif", "image/tiff" }, - { "tr", "application/x-troff" }, - { "trm", "application/x-msterminal" }, - { "ts", "application/typescript" }, - { "tsi", "audio/tsp-audio" }, - { "tsp", "audio/tsplayer" }, - { "tsv", "text/tab-separated-values" }, - { "ttc", "font/collection" }, - { "ttf", "font/ttf" }, - { "txt", "text/plain" }, - { "uil", "text/x-uil" }, - { "uls", "text/iuls" }, - { "unis", "text/uri-list" }, - { "uni", "text/uri-list" }, - { "unv", "application/i-deas" }, - { "uris", "text/uri-list" }, - { "uri", "text/uri-list" }, - { "ustar", "multipart/x-ustar" }, - { "uue", "text/x-uuencode" }, - { "uu", "text/x-uuencode" }, - { "vcd", "application/x-cdlink" }, - { "vcf", "text/vcard" }, - { "vcard", "text/vcard" }, - { "vcs", "text/x-vcalendar" }, - { "vda", "application/vda" }, - { "vdo", "video/vdo" }, - { "vew", "application/groupwise" }, - { "vivo", "video/vnd.vivo" }, - { "viv", "video/vnd.vivo" }, - { "vmd", "application/vocaltec-media-desc" }, - { "vmf", "application/vocaltec-media-file" }, - { "voc", "audio/voc" }, - { "vos", "video/vosaic" }, - { "vox", "audio/voxware" }, - { "vqe", "audio/x-twinvq-plugin" }, - { "vqf", "audio/x-twinvq" }, - { "vql", "audio/x-twinvq-plugin" }, - { "vrml", "application/x-vrml" }, - { "vsd", "application/x-visio" }, - { "vst", "application/x-visio" }, - { "vsw", "application/x-visio" }, - { "w60", "application/wordperfect6.0" }, - { "w61", "application/wordperfect6.1" }, - { "w6w", "application/msword" }, - { "wav", "audio/wav" }, - { "wb1", "application/x-qpro" }, - { "wbmp", "image/vnd.wap.wbmp" }, - { "wcm", "application/vnd.ms-works" }, - { "wdb", "application/vnd.ms-works" }, - { "web", "application/vnd.xara" }, - { "weba", "audio/webm" }, - { "webm", "video/webm" }, - { "webp", "image/webp" }, - { "wiz", "application/msword" }, - { "wk1", "application/x-123" }, - { "wks", "application/vnd.ms-works" }, - { "wmf", "image/wmf" }, - { "wmlc", "application/vnd.wap.wmlc" }, - { "wmlsc", "application/vnd.wap.wmlscriptc" }, - { "wmls", "text/vnd.wap.wmlscript" }, - { "wml", "text/vnd.wap.wml" }, - { "wmp", "video/x-ms-wmp" }, - { "wmv", "video/x-ms-wmv" }, - { "wmx", "video/x-ms-wmx" }, - { "woff", "font/woff" }, - { "woff2", "font/woff2" }, - { "word", "application/msword" }, - { "wp5", "application/wordperfect" }, - { "wp6", "application/wordperfect" }, - { "wp", "application/wordperfect" }, - { "wpd", "application/wordperfect" }, - { "wps", "application/vnd.ms-works" }, - { "wq1", "application/x-lotus" }, - { "wri", "application/mswrite" }, - { "wrl", "application/x-world" }, - { "wrz", "model/vrml" }, - { "wsc", "text/scriplet" }, - { "wsdl", "text/xml" }, - { "wsrc", "application/x-wais-source" }, - { "wtk", "application/x-wintalk" }, - { "wvx", "video/x-ms-wvx" }, - { "x3d", "model/x3d+xml" }, - { "x3db", "model/x3d+fastinfoset" }, - { "x3dv", "model/x3d-vrml" }, - { "xaml", "application/xaml+xml" }, - { "xap", "application/x-silverlight-app" }, - { "xbap", "application/x-ms-xbap" }, - { "xbm", "image/x-xbitmap" }, - { "xdr", "video/x-amt-demorun" }, - { "xht", "application/xhtml+xml" }, - { "xhtml", "application/xhtml+xml" }, - { "xif", "image/vnd.xiff" }, - { "xla", "application/vnd.ms-excel" }, - { "xlam", "application/vnd.ms-excel.addin.macroEnabled.12" }, - { "xl", "application/excel" }, - { "xlb", "application/excel" }, - { "xlc", "application/excel" }, - { "xld", "application/excel" }, - { "xlk", "application/excel" }, - { "xll", "application/excel" }, - { "xlm", "application/excel" }, - { "xls", "application/vnd.ms-excel" }, - { "xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12" }, - { "xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12" }, - { "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, - { "xlt", "application/vnd.ms-excel" }, - { "xltm", "application/vnd.ms-excel.template.macroEnabled.12" }, - { "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" }, - { "xlv", "application/excel" }, - { "xlw", "application/excel" }, - { "xm", "audio/xm" }, - { "xml", "text/xml" }, - { "xpi", "application/x-xpinstall" }, - { "xpix", "application/x-vnd.ls-xpix" }, - { "xpm", "image/xpm" }, - { "xps", "application/vnd.ms-xpsdocument" }, - { "x-png", "image/png" }, - { "xsd", "text/xml" }, - { "xsl", "text/xml" }, - { "xslt", "text/xml" }, - { "xsr", "video/x-amt-showrun" }, - { "xwd", "image/x-xwd" }, - { "z", "application/x-compressed" }, - { "zip", "application/zip" }, - { "zsh", "text/x-script.zsh" } + { ".323", "text/h323" }, + { ".3g2", "video/3gpp2" }, + { ".3gp", "video/3gpp" }, + { ".7z", "application/x-7z-compressed" }, + { ".aab", "application/x-authorware-bin" }, + { ".aac", "audio/aac" }, + { ".aam", "application/x-authorware-map" }, + { ".aas", "application/x-authorware-seg" }, + { ".abc", "text/vnd.abc" }, + { ".acgi", "text/html" }, + { ".acx", "application/internet-property-stream" }, + { ".afl", "video/animaflex" }, + { ".ai", "application/postscript" }, + { ".aif", "audio/aiff" }, + { ".aifc", "audio/aiff" }, + { ".aiff", "audio/aiff" }, + { ".aim", "application/x-aim" }, + { ".aip", "text/x-audiosoft-intra" }, + { ".ani", "application/x-navi-animation" }, + { ".aos", "application/x-nokia-9000-communicator-add-on-software" }, + { ".appcache", "text/cache-manifest" }, + { ".application", "application/x-ms-application" }, + { ".aps", "application/mime" }, + { ".art", "image/x-jg" }, + { ".asf", "video/x-ms-asf" }, + { ".asm", "text/x-asm" }, + { ".asp", "text/asp" }, + { ".asr", "video/x-ms-asf" }, + { ".asx", "application/x-mplayer2" }, + { ".atom", "application/atom+xml" }, + { ".au", "audio/x-au" }, + { ".avi", "video/avi" }, + { ".avs", "video/avs-video" }, + { ".axs", "application/olescript" }, + { ".bas", "text/plain" }, + { ".bcpio", "application/x-bcpio" }, + { ".bin", "application/octet-stream" }, + { ".bm", "image/bmp" }, + { ".bmp", "image/bmp" }, + { ".boo", "application/book" }, + { ".book", "application/book" }, + { ".boz", "application/x-bzip2" }, + { ".bsh", "application/x-bsh" }, + { ".bz2", "application/x-bzip2" }, + { ".bz", "application/x-bzip" }, + { ".cat", "application/vnd.ms-pki.seccat" }, + { ".ccad", "application/clariscad" }, + { ".cco", "application/x-cocoa" }, + { ".cc", "text/plain" }, + { ".cdf", "application/cdf" }, + { ".cer", "application/pkix-cert" }, + { ".cha", "application/x-chat" }, + { ".chat", "application/x-chat" }, + { ".chm", "application/vnd.ms-htmlhelp" }, + { ".class", "application/x-java-applet" }, + { ".clp", "application/x-msclip" }, + { ".cmx", "image/x-cmx" }, + { ".cod", "image/cis-cod" }, + { ".coffee", "text/x-coffeescript" }, + { ".conf", "text/plain" }, + { ".cpio", "application/x-cpio" }, + { ".cpp", "text/plain" }, + { ".cpt", "application/x-cpt" }, + { ".crd", "application/x-mscardfile" }, + { ".crl", "application/pkix-crl" }, + { ".crt", "application/pkix-cert" }, + { ".csh", "application/x-csh" }, + { ".css", "text/css" }, + { ".csv", "text/csv" }, + { ".cs", "text/plain" }, + { ".c", "text/plain" }, + { ".c++", "text/plain" }, + { ".cxx", "text/plain" }, + { ".dart", "application/dart" }, + { ".dcr", "application/x-director" }, + { ".deb", "application/x-deb" }, + { ".deepv", "application/x-deepv" }, + { ".def", "text/plain" }, + { ".deploy", "application/octet-stream" }, + { ".der", "application/x-x509-ca-cert" }, + { ".dib", "image/bmp" }, + { ".dif", "video/x-dv" }, + { ".dir", "application/x-director" }, + { ".disco", "text/xml" }, + { ".dll", "application/x-msdownload" }, + { ".dl", "video/dl" }, + { ".doc", "application/msword" }, + { ".docm", "application/vnd.ms-word.document.macroEnabled.12" }, + { ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, + { ".dot", "application/msword" }, + { ".dotm", "application/vnd.ms-word.template.macroEnabled.12" }, + { ".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, + { ".dp", "application/commonground" }, + { ".drw", "application/drafting" }, + { ".dtd", "application/xml-dtd" }, + { ".dvi", "application/x-dvi" }, + { ".dv", "video/x-dv" }, + { ".dwg", "application/acad" }, + { ".dxf", "application/dxf" }, + { ".dxr", "application/x-director" }, + { ".el", "text/x-script.elisp" }, + { ".elc", "application/x-elc" }, + { ".eml", "message/rfc822" }, + { ".eot", "application/vnd.bw-fontobject" }, + { ".eps", "application/postscript" }, + { ".epub", "application/epub+zip" }, + { ".es", "application/x-esrehber" }, + { ".etx", "text/x-setext" }, + { ".evy", "application/envoy" }, + { ".exe", "application/octet-stream" }, + { ".f77", "text/plain" }, + { ".f90", "text/plain" }, + { ".fdf", "application/vnd.fdf" }, + { ".fif", "image/fif" }, + { ".flac", "audio/x-flac" }, + { ".fli", "video/fli" }, + { ".flx", "text/vnd.fmi.flexstor" }, + { ".fmf", "video/x-atomic3d-feature" }, + { ".for", "text/plain" }, + { ".fpx", "image/vnd.fpx" }, + { ".frl", "application/freeloader" }, + { ".fsx", "application/fsharp-script" }, + { ".g3", "image/g3fax" }, + { ".gif", "image/gif" }, + { ".gl", "video/gl" }, + { ".gsd", "audio/x-gsm" }, + { ".gsm", "audio/x-gsm" }, + { ".gsp", "application/x-gsp" }, + { ".gss", "application/x-gss" }, + { ".gtar", "application/x-gtar" }, + { ".g", "text/plain" }, + { ".gz", "application/x-gzip" }, + { ".gzip", "application/x-gzip" }, + { ".hdf", "application/x-hdf" }, + { ".help", "application/x-helpfile" }, + { ".hgl", "application/vnd.hp-HPGL" }, + { ".hh", "text/plain" }, + { ".hlb", "text/x-script" }, + { ".hlp", "application/x-helpfile" }, + { ".hpg", "application/vnd.hp-HPGL" }, + { ".hpgl", "application/vnd.hp-HPGL" }, + { ".hqx", "application/binhex" }, + { ".hta", "application/hta" }, + { ".htc", "text/x-component" }, + { ".h", "text/plain" }, + { ".htmls", "text/html" }, + { ".html", "text/html" }, + { ".htm", "text/html" }, + { ".htt", "text/webviewhtml" }, + { ".htx", "text/html" }, + { ".ico", "image/x-icon" }, + { ".ics", "text/calendar" }, + { ".idc", "text/plain" }, + { ".ief", "image/ief" }, + { ".iefs", "image/ief" }, + { ".iges", "model/iges" }, + { ".igs", "model/iges" }, + { ".iii", "application/x-iphone" }, + { ".ima", "application/x-ima" }, + { ".imap", "application/x-httpd-imap" }, + { ".inf", "application/inf" }, + { ".ins", "application/x-internett-signup" }, + { ".ip", "application/x-ip2" }, + { ".isp", "application/x-internet-signup" }, + { ".isu", "video/x-isvideo" }, + { ".it", "audio/it" }, + { ".iv", "application/x-inventor" }, + { ".ivf", "video/x-ivf" }, + { ".ivy", "application/x-livescreen" }, + { ".jam", "audio/x-jam" }, + { ".jar", "application/java-archive" }, + { ".java", "text/plain" }, + { ".jav", "text/plain" }, + { ".jcm", "application/x-java-commerce" }, + { ".jfif", "image/jpeg" }, + { ".jfif-tbnl", "image/jpeg" }, + { ".jpeg", "image/jpeg" }, + { ".jpe", "image/jpeg" }, + { ".jpg", "image/jpeg" }, + { ".jps", "image/x-jps" }, + { ".js", "application/javascript" }, + { ".json", "application/json" }, + { ".jut", "image/jutvision" }, + { ".kar", "audio/midi" }, + { ".ksh", "text/x-script.ksh" }, + { ".la", "audio/nspaudio" }, + { ".lam", "audio/x-liveaudio" }, + { ".latex", "application/x-latex" }, + { ".list", "text/plain" }, + { ".lma", "audio/nspaudio" }, + { ".log", "text/plain" }, + { ".lsp", "application/x-lisp" }, + { ".lst", "text/plain" }, + { ".lsx", "text/x-la-asf" }, + { ".ltx", "application/x-latex" }, + { ".m13", "application/x-msmediaview" }, + { ".m14", "application/x-msmediaview" }, + { ".m1v", "video/mpeg" }, + { ".m2a", "audio/mpeg" }, + { ".m2v", "video/mpeg" }, + { ".m3u", "audio/x-mpequrl" }, + { ".m4a", "audio/mp4" }, + { ".m4v", "video/mp4" }, + { ".man", "application/x-troff-man" }, + { ".manifest", "application/x-ms-manifest" }, + { ".map", "application/x-navimap" }, + { ".mar", "text/plain" }, + { ".markdown", "text/markdown" }, + { ".mbd", "application/mbedlet" }, + { ".mc$", "application/x-magic-cap-package-1.0" }, + { ".mcd", "application/mcad" }, + { ".mcf", "image/vasa" }, + { ".mcp", "application/netmc" }, + { ".md", "text/markdown" }, + { ".mdb", "application/x-msaccess" }, + { ".mesh", "model/mesh" }, + { ".me", "application/x-troff-me" }, + { ".mid", "audio/midi" }, + { ".midi", "audio/midi" }, + { ".mif", "application/x-mif" }, + { ".mjf", "audio/x-vnd.AudioExplosion.MjuiceMediaFile" }, + { ".mjpg", "video/x-motion-jpeg" }, + { ".mm", "application/base64" }, + { ".mme", "application/base64" }, + { ".mny", "application/x-msmoney" }, + { ".mod", "audio/mod" }, + { ".mov", "video/quicktime" }, + { ".movie", "video/x-sgi-movie" }, + { ".mp2", "video/mpeg" }, + { ".mp3", "audio/mpeg" }, + { ".mp4", "video/mp4" }, + { ".mp4a", "audio/mp4" }, + { ".mp4v", "video/mp4" }, + { ".mpa", "audio/mpeg" }, + { ".mpc", "application/x-project" }, + { ".mpeg", "video/mpeg" }, + { ".mpe", "video/mpeg" }, + { ".mpga", "audio/mpeg" }, + { ".mpg", "video/mpeg" }, + { ".mpp", "application/vnd.ms-project" }, + { ".mpt", "application/x-project" }, + { ".mpv2", "video/mpeg" }, + { ".mpv", "application/x-project" }, + { ".mpx", "application/x-project" }, + { ".mrc", "application/marc" }, + { ".ms", "application/x-troff-ms" }, + { ".msh", "model/mesh" }, + { ".m", "text/plain" }, + { ".mvb", "application/x-msmediaview" }, + { ".mv", "video/x-sgi-movie" }, + { ".mzz", "application/x-vnd.AudioExplosion.mzz" }, + { ".nap", "image/naplps" }, + { ".naplps", "image/naplps" }, + { ".nc", "application/x-netcdf" }, + { ".ncm", "application/vnd.nokia.configuration-message" }, + { ".niff", "image/x-niff" }, + { ".nif", "image/x-niff" }, + { ".nix", "application/x-mix-transfer" }, + { ".nsc", "application/x-conference" }, + { ".nvd", "application/x-navidoc" }, + { ".nws", "message/rfc822" }, + { ".oda", "application/oda" }, + { ".ods", "application/oleobject" }, + { ".oga", "audio/ogg" }, + { ".ogg", "audio/ogg" }, + { ".ogv", "video/ogg" }, + { ".ogx", "application/ogg" }, + { ".omc", "application/x-omc" }, + { ".omcd", "application/x-omcdatamaker" }, + { ".omcr", "application/x-omcregerator" }, + { ".opus", "audio/ogg" }, + { ".otf", "font/otf" }, + { ".oxps", "application/oxps" }, + { ".p10", "application/pkcs10" }, + { ".p12", "application/pkcs-12" }, + { ".p7a", "application/x-pkcs7-signature" }, + { ".p7b", "application/x-pkcs7-certificates" }, + { ".p7c", "application/pkcs7-mime" }, + { ".p7m", "application/pkcs7-mime" }, + { ".p7r", "application/x-pkcs7-certreqresp" }, + { ".p7s", "application/pkcs7-signature" }, + { ".part", "application/pro_eng" }, + { ".pas", "text/pascal" }, + { ".pbm", "image/x-portable-bitmap" }, + { ".pcl", "application/x-pcl" }, + { ".pct", "image/x-pict" }, + { ".pcx", "image/x-pcx" }, + { ".pdf", "application/pdf" }, + { ".pfx", "application/x-pkcs12" }, + { ".pgm", "image/x-portable-graymap" }, + { ".pic", "image/pict" }, + { ".pict", "image/pict" }, + { ".pkg", "application/x-newton-compatible-pkg" }, + { ".pko", "application/vnd.ms-pki.pko" }, + { ".pl", "text/plain" }, + { ".plx", "application/x-PiXCLscript" }, + { ".pm4", "application/x-pagemaker" }, + { ".pm5", "application/x-pagemaker" }, + { ".pma", "application/x-perfmon" }, + { ".pmc", "application/x-perfmon" }, + { ".pm", "image/x-xpixmap" }, + { ".pml", "application/x-perfmon" }, + { ".pmr", "application/x-perfmon" }, + { ".pmw", "application/x-perfmon" }, + { ".png", "image/png" }, + { ".pnm", "application/x-portable-anymap" }, + { ".pot", "application/vnd.ms-powerpoint" }, + { ".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12" }, + { ".potx", "application/vnd.openxmlformats-officedocument.presentationml.template" }, + { ".pov", "model/x-pov" }, + { ".ppa", "application/vnd.ms-powerpoint" }, + { ".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12" }, + { ".ppm", "image/x-portable-pixmap" }, + { ".pps", "application/vnd.ms-powerpoint" }, + { ".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12" }, + { ".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow" }, + { ".ppt", "application/vnd.ms-powerpoint" }, + { ".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12" }, + { ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, + { ".ppz", "application/mspowerpoint" }, + { ".pre", "application/x-freelance" }, + { ".prf", "application/pics-rules" }, + { ".prt", "application/pro_eng" }, + { ".ps", "application/postscript" }, + { ".p", "text/x-pascal" }, + { ".pub", "application/x-mspublisher" }, + { ".pwz", "application/vnd.ms-powerpoint" }, + { ".pyc", "application/x-bytecode.python" }, + { ".py", "text/x-script.phyton" }, + { ".qcp", "audio/vnd.qcelp" }, + { ".qif", "image/x-quicktime" }, + { ".qtc", "video/x-qtc" }, + { ".qtif", "image/x-quicktime" }, + { ".qti", "image/x-quicktime" }, + { ".qt", "video/quicktime" }, + { ".ra", "audio/x-pn-realaudio" }, + { ".ram", "audio/x-pn-realaudio" }, + { ".ras", "application/x-cmu-raster" }, + { ".rast", "image/cmu-raster" }, + { ".rexx", "text/x-script.rexx" }, + { ".rf", "image/vnd.rn-realflash" }, + { ".rgb", "image/x-rgb" }, + { ".rm", "application/vnd.rn-realmedia" }, + { ".rmi", "audio/mid" }, + { ".rmm", "audio/x-pn-realaudio" }, + { ".rmp", "audio/x-pn-realaudio" }, + { ".rng", "application/ringing-tones" }, + { ".rnx", "application/vnd.rn-realplayer" }, + { ".roff", "application/x-troff" }, + { ".rp", "image/vnd.rn-realpix" }, + { ".rpm", "audio/x-pn-realaudio-plugin" }, + { ".rss", "application/rss+xml" }, + { ".rtf", "text/rtf" }, + { ".rt", "text/richtext" }, + { ".rtx", "text/richtext" }, + { ".rv", "video/vnd.rn-realvideo" }, + { ".s3m", "audio/s3m" }, + { ".sbk", "application/x-tbook" }, + { ".scd", "application/x-msschedule" }, + { ".scm", "application/x-lotusscreencam" }, + { ".sct", "text/scriptlet" }, + { ".sdml", "text/plain" }, + { ".sdp", "application/sdp" }, + { ".sdr", "application/sounder" }, + { ".sea", "application/sea" }, + { ".set", "application/set" }, + { ".setpay", "application/set-payment-initiation" }, + { ".setreg", "application/set-registration-initiation" }, + { ".sgml", "text/sgml" }, + { ".sgm", "text/sgml" }, + { ".shar", "application/x-bsh" }, + { ".sh", "text/x-script.sh" }, + { ".shtml", "text/html" }, + { ".sid", "audio/x-psid" }, + { ".silo", "model/mesh" }, + { ".sit", "application/x-sit" }, + { ".skd", "application/x-koan" }, + { ".skm", "application/x-koan" }, + { ".skp", "application/x-koan" }, + { ".skt", "application/x-koan" }, + { ".sl", "application/x-seelogo" }, + { ".smi", "application/smil" }, + { ".smil", "application/smil" }, + { ".snd", "audio/basic" }, + { ".sol", "application/solids" }, + { ".spc", "application/x-pkcs7-certificates" }, + { ".spl", "application/futuresplash" }, + { ".spr", "application/x-sprite" }, + { ".sprite", "application/x-sprite" }, + { ".spx", "audio/ogg" }, + { ".src", "application/x-wais-source" }, + { ".ssi", "text/x-server-parsed-html" }, + { ".ssm", "application/streamingmedia" }, + { ".sst", "application/vnd.ms-pki.certstore" }, + { ".step", "application/step" }, + { ".s", "text/x-asm" }, + { ".stl", "application/sla" }, + { ".stm", "text/html" }, + { ".stp", "application/step" }, + { ".sv4cpio", "application/x-sv4cpio" }, + { ".sv4crc", "application/x-sv4crc" }, + { ".svf", "image/x-dwg" }, + { ".svg", "image/svg+xml" }, + { ".svr", "application/x-world" }, + { ".swf", "application/x-shockwave-flash" }, + { ".talk", "text/x-speech" }, + { ".t", "application/x-troff" }, + { ".tar", "application/x-tar" }, + { ".tbk", "application/toolbook" }, + { ".tcl", "text/x-script.tcl" }, + { ".tcsh", "text/x-script.tcsh" }, + { ".tex", "application/x-tex" }, + { ".texi", "application/x-texinfo" }, + { ".texinfo", "application/x-texinfo" }, + { ".text", "text/plain" }, + { ".tgz", "application/x-compressed" }, + { ".tiff", "image/tiff" }, + { ".tif", "image/tiff" }, + { ".tr", "application/x-troff" }, + { ".trm", "application/x-msterminal" }, + { ".ts", "application/typescript" }, + { ".tsi", "audio/tsp-audio" }, + { ".tsp", "audio/tsplayer" }, + { ".tsv", "text/tab-separated-values" }, + { ".ttc", "font/collection" }, + { ".ttf", "font/ttf" }, + { ".txt", "text/plain" }, + { ".uil", "text/x-uil" }, + { ".uls", "text/iuls" }, + { ".unis", "text/uri-list" }, + { ".uni", "text/uri-list" }, + { ".unv", "application/i-deas" }, + { ".uris", "text/uri-list" }, + { ".uri", "text/uri-list" }, + { ".ustar", "multipart/x-ustar" }, + { ".uue", "text/x-uuencode" }, + { ".uu", "text/x-uuencode" }, + { ".vcd", "application/x-cdlink" }, + { ".vcf", "text/vcard" }, + { ".vcard", "text/vcard" }, + { ".vcs", "text/x-vcalendar" }, + { ".vda", "application/vda" }, + { ".vdo", "video/vdo" }, + { ".vew", "application/groupwise" }, + { ".vivo", "video/vnd.vivo" }, + { ".viv", "video/vnd.vivo" }, + { ".vmd", "application/vocaltec-media-desc" }, + { ".vmf", "application/vocaltec-media-file" }, + { ".voc", "audio/voc" }, + { ".vos", "video/vosaic" }, + { ".vox", "audio/voxware" }, + { ".vqe", "audio/x-twinvq-plugin" }, + { ".vqf", "audio/x-twinvq" }, + { ".vql", "audio/x-twinvq-plugin" }, + { ".vrml", "application/x-vrml" }, + { ".vsd", "application/x-visio" }, + { ".vst", "application/x-visio" }, + { ".vsw", "application/x-visio" }, + { ".w60", "application/wordperfect6.0" }, + { ".w61", "application/wordperfect6.1" }, + { ".w6w", "application/msword" }, + { ".wav", "audio/wav" }, + { ".wb1", "application/x-qpro" }, + { ".wbmp", "image/vnd.wap.wbmp" }, + { ".wcm", "application/vnd.ms-works" }, + { ".wdb", "application/vnd.ms-works" }, + { ".web", "application/vnd.xara" }, + { ".weba", "audio/webm" }, + { ".webm", "video/webm" }, + { ".webp", "image/webp" }, + { ".wiz", "application/msword" }, + { ".wk1", "application/x-123" }, + { ".wks", "application/vnd.ms-works" }, + { ".wmf", "image/wmf" }, + { ".wmlc", "application/vnd.wap.wmlc" }, + { ".wmlsc", "application/vnd.wap.wmlscriptc" }, + { ".wmls", "text/vnd.wap.wmlscript" }, + { ".wml", "text/vnd.wap.wml" }, + { ".wmp", "video/x-ms-wmp" }, + { ".wmv", "video/x-ms-wmv" }, + { ".wmx", "video/x-ms-wmx" }, + { ".woff", "font/woff" }, + { ".woff2", "font/woff2" }, + { ".word", "application/msword" }, + { ".wp5", "application/wordperfect" }, + { ".wp6", "application/wordperfect" }, + { ".wp", "application/wordperfect" }, + { ".wpd", "application/wordperfect" }, + { ".wps", "application/vnd.ms-works" }, + { ".wq1", "application/x-lotus" }, + { ".wri", "application/mswrite" }, + { ".wrl", "application/x-world" }, + { ".wrz", "model/vrml" }, + { ".wsc", "text/scriplet" }, + { ".wsdl", "text/xml" }, + { ".wsrc", "application/x-wais-source" }, + { ".wtk", "application/x-wintalk" }, + { ".wvx", "video/x-ms-wvx" }, + { ".x3d", "model/x3d+xml" }, + { ".x3db", "model/x3d+fastinfoset" }, + { ".x3dv", "model/x3d-vrml" }, + { ".xaml", "application/xaml+xml" }, + { ".xap", "application/x-silverlight-app" }, + { ".xbap", "application/x-ms-xbap" }, + { ".xbm", "image/x-xbitmap" }, + { ".xdr", "video/x-amt-demorun" }, + { ".xht", "application/xhtml+xml" }, + { ".xhtml", "application/xhtml+xml" }, + { ".xif", "image/vnd.xiff" }, + { ".xla", "application/vnd.ms-excel" }, + { ".xlam", "application/vnd.ms-excel.addin.macroEnabled.12" }, + { ".xl", "application/excel" }, + { ".xlb", "application/excel" }, + { ".xlc", "application/excel" }, + { ".xld", "application/excel" }, + { ".xlk", "application/excel" }, + { ".xll", "application/excel" }, + { ".xlm", "application/excel" }, + { ".xls", "application/vnd.ms-excel" }, + { ".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12" }, + { ".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12" }, + { ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, + { ".xlt", "application/vnd.ms-excel" }, + { ".xltm", "application/vnd.ms-excel.template.macroEnabled.12" }, + { ".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" }, + { ".xlv", "application/excel" }, + { ".xlw", "application/excel" }, + { ".xm", "audio/xm" }, + { ".xml", "text/xml" }, + { ".xpi", "application/x-xpinstall" }, + { ".xpix", "application/x-vnd.ls-xpix" }, + { ".xpm", "image/xpm" }, + { ".xps", "application/vnd.ms-xpsdocument" }, + { ".x-png", "image/png" }, + { ".xsd", "text/xml" }, + { ".xsl", "text/xml" }, + { ".xslt", "text/xml" }, + { ".xsr", "video/x-amt-showrun" }, + { ".xwd", "image/x-xwd" }, + { ".z", "application/x-compressed" }, + { ".zip", "application/zip" }, + { ".zsh", "text/x-script.zsh" } }; } @@ -1002,11 +1003,9 @@ public static string GetMimeType (string fileName) if (fileName == null) throw new ArgumentNullException (nameof (fileName)); - int dot = fileName.LastIndexOf ('.'); - string mimeType = null; + var extension = Path.GetExtension (fileName); - if (dot != -1 && fileName.Length > dot + 1) - mimeTypes.TryGetValue (fileName.Substring (dot + 1), out mimeType); + mimeTypes.TryGetValue (extension, out var mimeType); return mimeType ?? "application/octet-stream"; } @@ -1035,7 +1034,9 @@ public static bool TryGetExtension (string mimeType, out string extension) /// Register a MIME-type to file extension mapping. ///
/// - /// Registers a MIME-type to file extension mapping. + /// Registers a MIME-type to file extension mapping. + /// If the mapping for the MIME-type and/or file extension already exists, + /// then it is overridden by the new mapping. /// /// The MIME-type to register. /// The file extension to register. @@ -1044,16 +1045,30 @@ public static bool TryGetExtension (string mimeType, out string extension) /// -or- /// is null. /// + /// + /// is empty. + /// -or- + /// is empty or does not begin with a '.'. + /// public static void Register (string mimeType, string extension) { if (mimeType == null) throw new ArgumentNullException (nameof (mimeType)); + if (mimeType.Length == 0) + throw new ArgumentException ("Cannot register an empty MIME-type.", nameof (mimeType)); + if (extension == null) throw new ArgumentNullException (nameof (extension)); - mimeTypes.Add (extension, mimeType); - extensions.Add (mimeType, extension); + if (extension.Length == 0) + throw new ArgumentException ("Cannot register an empty file extension.", nameof (extension)); + + if (extension[0] != '.') + throw new ArgumentException ("File extensions must start with a '.' character.", nameof (extension)); + + mimeTypes[extension] = mimeType; + extensions[mimeType] = extension; } } } diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index abe37486f6..f46c36b5b7 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -88,7 +88,10 @@ public void TestMimeTypeRegister () Assert.AreEqual ("application/octet-stream", MimeTypes.GetMimeType ("message.msg")); Assert.False (MimeTypes.TryGetExtension ("application/vnd.ms-outlook", out extension)); + MimeTypes.Register ("application/vnd.ms-outlook", ".msg"); + + Assert.AreEqual ("application/vnd.ms-outlook", MimeTypes.GetMimeType ("message.msg")); Assert.True (MimeTypes.TryGetExtension ("application/vnd.ms-outlook", out extension)); Assert.AreEqual (".msg", extension); } From c0fe642287c20b1952a5ddd8a9768ef39480989d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 17:20:23 -0400 Subject: [PATCH 512/741] Added more MimeTypes unit tests --- MimeKit/MimeTypes.cs | 4 ++-- UnitTests/MimeTypeTests.cs | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index 509360c97f..062a9bb4f5 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -1048,7 +1048,7 @@ public static bool TryGetExtension (string mimeType, out string extension) /// /// is empty. /// -or- - /// is empty or does not begin with a '.'. + /// is empty. /// public static void Register (string mimeType, string extension) { @@ -1065,7 +1065,7 @@ public static void Register (string mimeType, string extension) throw new ArgumentException ("Cannot register an empty file extension.", nameof (extension)); if (extension[0] != '.') - throw new ArgumentException ("File extensions must start with a '.' character.", nameof (extension)); + extension = "." + extension; mimeTypes[extension] = mimeType; extensions[mimeType] = extension; diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index f46c36b5b7..3c1faa3587 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -34,6 +34,17 @@ namespace UnitTests { [TestFixture] public class MimeTypeTests { + [Test] + public void TestArgumentExceptions () + { + Assert.Throws (() => MimeTypes.GetMimeType (null)); + Assert.Throws (() => MimeTypes.Register (null, ".ext")); + Assert.Throws (() => MimeTypes.Register (string.Empty, ".ext")); + Assert.Throws (() => MimeTypes.Register ("text/plain", null)); + Assert.Throws (() => MimeTypes.Register ("text/plain", string.Empty)); + Assert.Throws (() => MimeTypes.TryGetExtension (null, out _)); + } + [Test] public void TestGetMimeTypeNullFileName () { @@ -94,6 +105,12 @@ public void TestMimeTypeRegister () Assert.AreEqual ("application/vnd.ms-outlook", MimeTypes.GetMimeType ("message.msg")); Assert.True (MimeTypes.TryGetExtension ("application/vnd.ms-outlook", out extension)); Assert.AreEqual (".msg", extension); + + MimeTypes.Register ("application/bogus", "bogus"); + + Assert.AreEqual ("application/bogus", MimeTypes.GetMimeType ("fileName.bogus")); + Assert.True (MimeTypes.TryGetExtension ("application/bogus", out extension)); + Assert.AreEqual (".bogus", extension); } } } From ffcbb0ea8d618b873de9b7273bbc14e47eb6aa68 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 21:05:59 -0400 Subject: [PATCH 513/741] Fixed TnefTests to treat the AUTHORS files as text Fixes issue #553 --- UnitTests/Tnef/TnefTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index c6f169091e..f36f68cc02 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -793,6 +793,9 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom case ".ini": isText = true; break; + case "": + isText = part.FileName == "AUTHORS"; + break; } fileName = part.FileName; From a3ffbcb14520543016961644766094a3afbe687a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 21:38:23 -0400 Subject: [PATCH 514/741] Improved(?) dynamic loading of the native SQLite assembly Hopefully fixes issue #552 --- .../Cryptography/SqliteCertificateDatabase.cs | 51 ++++++++++++++----- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index c7df41d770..7c94625ed0 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -63,8 +63,7 @@ static SqliteCertificateDatabase () { #if __MOBILE__ IsAvailable = true; -#endif - +#else // !__MOBILE__ #if NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP3_0 var platform = Environment.OSVersion.Platform; #endif @@ -76,14 +75,15 @@ static SqliteCertificateDatabase () sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnectionStringBuilder"); // Make sure that the runtime can load the native sqlite library - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); + VerifySQLiteAssemblyUsability (); IsAvailable = true; return; } - } catch (FileNotFoundException) { - } catch (FileLoadException) { + } catch (IOException) { + } catch (TypeLoadException) { } catch (BadImageFormatException) { + } catch (TypeInitializationException) { } #endif @@ -96,16 +96,16 @@ static SqliteCertificateDatabase () sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("Mono.Data.Sqlite.SqliteConnectionStringBuilder"); // Make sure that the runtime can load the native sqlite3 library - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); - sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat").SetValue (builder, 0, null); + VerifySQLiteAssemblyUsability (); IsAvailable = true; return; } } - } catch (FileNotFoundException) { - } catch (FileLoadException) { + } catch (IOException) { + } catch (TypeLoadException) { } catch (BadImageFormatException) { + } catch (TypeInitializationException) { } #endif @@ -116,18 +116,43 @@ static SqliteCertificateDatabase () sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnectionStringBuilder"); // Make sure that the runtime can load the native sqlite3 library - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); - sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat").SetValue (builder, 0, null); + VerifySQLiteAssemblyUsability (); IsAvailable = true; return; } - } catch (FileNotFoundException) { - } catch (FileLoadException) { + } catch (IOException) { + } catch (TypeLoadException) { } catch (BadImageFormatException) { + } catch (TypeInitializationException) { } #endif +#endif // __MOBILE__ + } + +#if !__MOBILE__ + static void VerifySQLiteAssemblyUsability () + { + // Make sure that the runtime can load the native sqlite3 library + var dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); + var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); + var fileName = Path.GetTempFileName (); + + try { + sqliteConnectionStringBuilderClass.GetProperty ("DataSource").SetValue (builder, fileName, null); + + if (dateTimeFormat != null) + dateTimeFormat.SetValue (builder, 0, null); + + var connectionString = (string) sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString").GetValue (builder, null); + var connection = (DbConnection) Activator.CreateInstance (sqliteConnectionClass, new[] { connectionString }); + connection.Dispose (); + } catch { + File.Delete (fileName); + throw; + } } +#endif internal static bool IsAvailable { get; private set; From 46f7b14e1f339465268326785350744a50d0c9db Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 21:58:24 -0400 Subject: [PATCH 515/741] Simplify previous commit and fixed deletion of temp files --- .../Cryptography/SqliteCertificateDatabase.cs | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 7c94625ed0..bd78b8f531 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -133,23 +133,14 @@ static SqliteCertificateDatabase () #if !__MOBILE__ static void VerifySQLiteAssemblyUsability () { - // Make sure that the runtime can load the native sqlite3 library - var dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); + // Make sure that the runtime can load the native sqlite3 library. var fileName = Path.GetTempFileName (); try { - sqliteConnectionStringBuilderClass.GetProperty ("DataSource").SetValue (builder, fileName, null); - - if (dateTimeFormat != null) - dateTimeFormat.SetValue (builder, 0, null); - - var connectionString = (string) sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString").GetValue (builder, null); - var connection = (DbConnection) Activator.CreateInstance (sqliteConnectionClass, new[] { connectionString }); + var connection = CreateConnection (fileName); connection.Dispose (); - } catch { + } finally { File.Delete (fileName); - throw; } } #endif @@ -180,15 +171,17 @@ static DbConnection CreateConnection (string fileName) } #if !__MOBILE__ - var dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); + var connectionStringProperty = sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString"); + var dateTimeFormatProperty = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); + var dataSourceProperty = sqliteConnectionStringBuilderClass.GetProperty ("DataSource"); var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); - sqliteConnectionStringBuilderClass.GetProperty ("DataSource").SetValue (builder, fileName, null); + dataSourceProperty.SetValue (builder, fileName, null); - if (dateTimeFormat != null) - dateTimeFormat.SetValue (builder, 0, null); + if (dateTimeFormatProperty != null) + dateTimeFormatProperty.SetValue (builder, 0, null); - var connectionString = (string) sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString").GetValue (builder, null); + var connectionString = (string) connectionStringProperty.GetValue (builder, null); return (DbConnection) Activator.CreateInstance (sqliteConnectionClass, new [] { connectionString }); #else From a6729186f4733b6ea9a5c58d898e44dd77ec8292 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 22:27:36 -0400 Subject: [PATCH 516/741] Get and cache the SQLiteConnectionStringBuilder properties that we need --- .../Cryptography/SqliteCertificateDatabase.cs | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index bd78b8f531..f4ef21d4ac 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -53,6 +53,10 @@ public class SqliteCertificateDatabase : SqlCertificateDatabase static readonly Type sqliteConnectionStringBuilderClass; static readonly Type sqliteConnectionClass; static readonly Assembly sqliteAssembly; + + static readonly PropertyInfo connectionStringProperty; + static readonly PropertyInfo dateTimeFormatProperty; + static readonly PropertyInfo dataSourceProperty; #endif // At class initialization we try to use reflection to load the @@ -74,6 +78,8 @@ static SqliteCertificateDatabase () sqliteConnectionClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnection"); sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnectionStringBuilder"); + GetSQLiteConnectionStringBuilderProperties (out connectionStringProperty, out dateTimeFormatProperty, out dataSourceProperty); + // Make sure that the runtime can load the native sqlite library VerifySQLiteAssemblyUsability (); @@ -95,6 +101,8 @@ static SqliteCertificateDatabase () sqliteConnectionClass = sqliteAssembly.GetType ("Mono.Data.Sqlite.SqliteConnection"); sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("Mono.Data.Sqlite.SqliteConnectionStringBuilder"); + GetSQLiteConnectionStringBuilderProperties (out connectionStringProperty, out dateTimeFormatProperty, out dataSourceProperty); + // Make sure that the runtime can load the native sqlite3 library VerifySQLiteAssemblyUsability (); @@ -115,6 +123,8 @@ static SqliteCertificateDatabase () sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnectionStringBuilder"); + GetSQLiteConnectionStringBuilderProperties (out connectionStringProperty, out dateTimeFormatProperty, out dataSourceProperty); + // Make sure that the runtime can load the native sqlite3 library VerifySQLiteAssemblyUsability (); @@ -131,6 +141,14 @@ static SqliteCertificateDatabase () } #if !__MOBILE__ + static void GetSQLiteConnectionStringBuilderProperties (out PropertyInfo connectionString, out PropertyInfo dateTimeFormat, out PropertyInfo dataSource) + { + // Get and cache various PropertyInfo's that we'll be using. + connectionString = sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString"); + dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); + dataSource = sqliteConnectionStringBuilderClass.GetProperty ("DataSource"); + } + static void VerifySQLiteAssemblyUsability () { // Make sure that the runtime can load the native sqlite3 library. @@ -171,15 +189,10 @@ static DbConnection CreateConnection (string fileName) } #if !__MOBILE__ - var connectionStringProperty = sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString"); - var dateTimeFormatProperty = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); - var dataSourceProperty = sqliteConnectionStringBuilderClass.GetProperty ("DataSource"); var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); dataSourceProperty.SetValue (builder, fileName, null); - - if (dateTimeFormatProperty != null) - dateTimeFormatProperty.SetValue (builder, 0, null); + dateTimeFormatProperty?.SetValue (builder, 0, null); var connectionString = (string) connectionStringProperty.GetValue (builder, null); From f98bb93360fb6265625dbdf1ee9e927a9c594308 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 2 Apr 2020 22:58:16 -0400 Subject: [PATCH 517/741] Reduce code duplication in auto-detection of which SQLite library to use --- .../Cryptography/SqliteCertificateDatabase.cs | 124 +++++++++--------- 1 file changed, 60 insertions(+), 64 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index f4ef21d4ac..bc4cde1783 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -50,13 +50,47 @@ namespace MimeKit.Cryptography { public class SqliteCertificateDatabase : SqlCertificateDatabase { #if !__MOBILE__ - static readonly Type sqliteConnectionStringBuilderClass; - static readonly Type sqliteConnectionClass; - static readonly Assembly sqliteAssembly; + class SQLiteAssembly + { + public Type ConnectionStringBuilderType { get; private set; } + public Type ConnectionType { get; private set; } + public Assembly Assembly { get; private set; } + + public PropertyInfo ConnectionStringProperty { get; private set; } + public PropertyInfo DateTimeFormatProperty { get; private set; } + public PropertyInfo DataSourceProperty { get; private set; } + + public static SQLiteAssembly Load (string assemblyName) + { + try { + int dot = assemblyName.LastIndexOf ('.'); + var prefix = assemblyName.Substring (dot + 1); + Assembly assembly; + + if ((assembly = Assembly.Load (new AssemblyName (assemblyName))) == null) + return null; + + var builderType = assembly.GetType (assemblyName + "." + prefix + "ConnectionStringBuilder"); + var connectionType = assembly.GetType (assemblyName + "." + prefix + "Connection"); + var connectionString = builderType.GetProperty ("ConnectionString"); + var dateTimeFormat = builderType.GetProperty ("DateTimeFormat"); + var dataSource = builderType.GetProperty ("DataSource"); + + return new SQLiteAssembly { + Assembly = assembly, + ConnectionType = connectionType, + ConnectionStringBuilderType = builderType, + ConnectionStringProperty = connectionString, + DateTimeFormatProperty = dateTimeFormat, + DataSourceProperty = dataSource + }; + } catch { + return null; + } + } + } - static readonly PropertyInfo connectionStringProperty; - static readonly PropertyInfo dateTimeFormatProperty; - static readonly PropertyInfo dataSourceProperty; + static readonly SQLiteAssembly sqliteAssembly; #endif // At class initialization we try to use reflection to load the @@ -73,83 +107,42 @@ static SqliteCertificateDatabase () #endif #if NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0 || NETCOREAPP3_0 - try { - if ((sqliteAssembly = Assembly.Load (new AssemblyName ("Microsoft.Data.Sqlite"))) != null) { - sqliteConnectionClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnection"); - sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("Microsoft.Data.Sqlite.SqliteConnectionStringBuilder"); - - GetSQLiteConnectionStringBuilderProperties (out connectionStringProperty, out dateTimeFormatProperty, out dataSourceProperty); - - // Make sure that the runtime can load the native sqlite library - VerifySQLiteAssemblyUsability (); - + if ((sqliteAssembly = SQLiteAssembly.Load ("Microsoft.Data.Sqlite")) != null) { + // Make sure that the runtime can load the native sqlite library + if (VerifySQLiteAssemblyIsUsable ()) { IsAvailable = true; return; } - } catch (IOException) { - } catch (TypeLoadException) { - } catch (BadImageFormatException) { - } catch (TypeInitializationException) { } #endif #if NETFRAMEWORK || NETCOREAPP3_0 - try { - // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. - if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { - if ((sqliteAssembly = Assembly.Load ("Mono.Data.Sqlite")) != null) { - sqliteConnectionClass = sqliteAssembly.GetType ("Mono.Data.Sqlite.SqliteConnection"); - sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("Mono.Data.Sqlite.SqliteConnectionStringBuilder"); - - GetSQLiteConnectionStringBuilderProperties (out connectionStringProperty, out dateTimeFormatProperty, out dataSourceProperty); - - // Make sure that the runtime can load the native sqlite3 library - VerifySQLiteAssemblyUsability (); - + // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. + if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { + if ((sqliteAssembly = SQLiteAssembly.Load ("Mono.Data.Sqlite")) != null) { + // Make sure that the runtime can load the native sqlite3 library + if (VerifySQLiteAssemblyIsUsable ()) { IsAvailable = true; return; } } - } catch (IOException) { - } catch (TypeLoadException) { - } catch (BadImageFormatException) { - } catch (TypeInitializationException) { } #endif #if NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP3_0 - try { - if ((sqliteAssembly = Assembly.Load ("System.Data.SQLite")) != null) { - sqliteConnectionClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnection"); - sqliteConnectionStringBuilderClass = sqliteAssembly.GetType ("System.Data.SQLite.SQLiteConnectionStringBuilder"); - - GetSQLiteConnectionStringBuilderProperties (out connectionStringProperty, out dateTimeFormatProperty, out dataSourceProperty); - - // Make sure that the runtime can load the native sqlite3 library - VerifySQLiteAssemblyUsability (); - + if ((sqliteAssembly = SQLiteAssembly.Load ("System.Data.SQLite")) != null) { + // Make sure that the runtime can load the native sqlite3 library + if (VerifySQLiteAssemblyIsUsable ()) { IsAvailable = true; return; } - } catch (IOException) { - } catch (TypeLoadException) { - } catch (BadImageFormatException) { - } catch (TypeInitializationException) { } #endif #endif // __MOBILE__ } #if !__MOBILE__ - static void GetSQLiteConnectionStringBuilderProperties (out PropertyInfo connectionString, out PropertyInfo dateTimeFormat, out PropertyInfo dataSource) - { - // Get and cache various PropertyInfo's that we'll be using. - connectionString = sqliteConnectionStringBuilderClass.GetProperty ("ConnectionString"); - dateTimeFormat = sqliteConnectionStringBuilderClass.GetProperty ("DateTimeFormat"); - dataSource = sqliteConnectionStringBuilderClass.GetProperty ("DataSource"); - } - - static void VerifySQLiteAssemblyUsability () + static bool VerifySQLiteAssemblyIsUsable () { // Make sure that the runtime can load the native sqlite3 library. var fileName = Path.GetTempFileName (); @@ -157,6 +150,9 @@ static void VerifySQLiteAssemblyUsability () try { var connection = CreateConnection (fileName); connection.Dispose (); + return true; + } catch { + return false; } finally { File.Delete (fileName); } @@ -189,14 +185,14 @@ static DbConnection CreateConnection (string fileName) } #if !__MOBILE__ - var builder = Activator.CreateInstance (sqliteConnectionStringBuilderClass); + var builder = Activator.CreateInstance (sqliteAssembly.ConnectionStringBuilderType); - dataSourceProperty.SetValue (builder, fileName, null); - dateTimeFormatProperty?.SetValue (builder, 0, null); + sqliteAssembly.DataSourceProperty.SetValue (builder, fileName, null); + sqliteAssembly.DateTimeFormatProperty?.SetValue (builder, 0, null); - var connectionString = (string) connectionStringProperty.GetValue (builder, null); + var connectionString = (string) sqliteAssembly.ConnectionStringProperty.GetValue (builder, null); - return (DbConnection) Activator.CreateInstance (sqliteConnectionClass, new [] { connectionString }); + return (DbConnection) Activator.CreateInstance (sqliteAssembly.ConnectionType, new [] { connectionString }); #else var builder = new SqliteConnectionStringBuilder (); builder.DateTimeFormat = SQLiteDateFormats.Ticks; From aacd97da4f49caafd7e05212dc72f3f50a04795a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 07:59:22 -0400 Subject: [PATCH 518/741] Assembly.Load() doesn't appear to ever return null, so no need for the check --- MimeKit/Cryptography/SqliteCertificateDatabase.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index bc4cde1783..864cf5ef3a 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -65,11 +65,8 @@ public static SQLiteAssembly Load (string assemblyName) try { int dot = assemblyName.LastIndexOf ('.'); var prefix = assemblyName.Substring (dot + 1); - Assembly assembly; - - if ((assembly = Assembly.Load (new AssemblyName (assemblyName))) == null) - return null; + var assembly = Assembly.Load (new AssemblyName (assemblyName)); var builderType = assembly.GetType (assemblyName + "." + prefix + "ConnectionStringBuilder"); var connectionType = assembly.GetType (assemblyName + "." + prefix + "Connection"); var connectionString = builderType.GetProperty ("ConnectionString"); From 4071be0b89ec01ad7bbdfd71acffa42fd12f0630 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 08:46:32 -0400 Subject: [PATCH 519/741] Limit Mono.Data.Sqlite usage to Unix/macOS --- MimeKit/Cryptography/SqliteCertificateDatabase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 864cf5ef3a..42d6dcad53 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -114,8 +114,8 @@ static SqliteCertificateDatabase () #endif #if NETFRAMEWORK || NETCOREAPP3_0 - // Mono.Data.Sqlite will only work on Unix-based platforms and 32-bit Windows platforms. - if (platform == PlatformID.Unix || platform == PlatformID.MacOSX || IntPtr.Size == 4) { + // Mono.Data.Sqlite will only work on Unix-based platforms. + if (platform == PlatformID.Unix || platform == PlatformID.MacOSX) { if ((sqliteAssembly = SQLiteAssembly.Load ("Mono.Data.Sqlite")) != null) { // Make sure that the runtime can load the native sqlite3 library if (VerifySQLiteAssemblyIsUsable ()) { From 58ad3f1719fc9c7dea083ffafa4ec508f447d169 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 09:44:08 -0400 Subject: [PATCH 520/741] Added some System.Data.SQLite properties to get the SQLite tests to pass on Windows Part of the fix for issue #552 --- UnitTests/UnitTests.csproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index f8e34c9e78..63fddb5cbf 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -12,6 +12,12 @@ 2.0 + true + ..\MimeKit\mimekit.snk + true + false + false + false true @@ -34,12 +40,6 @@ false true - - true - - - ..\MimeKit\mimekit.snk - From 074398799cedd0f739ce583471cd4e743b61b26d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 13:19:02 -0400 Subject: [PATCH 521/741] Clean up the X.Data.SQLite "not available" exception logic --- MimeKit/Cryptography/CryptographyContext.cs | 9 --------- MimeKit/Cryptography/DefaultSecureMimeContext.cs | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 8b0df4d3f7..42ab564cca 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -542,15 +542,6 @@ public static CryptographyContext Create (string protocol) if (SecureMimeContextFactory != null) return SecureMimeContextFactory (); - if (!SqliteCertificateDatabase.IsAvailable) { - const string format = "SQLite is not available. Either install the {0} nuget or subclass MimeKit.Cryptography.SecureMimeContext and register it with MimeKit.Cryptography.CryptographyContext.Register()."; -#if NETSTANDARD1_3 || NETSTANDARD1_6 - throw new NotSupportedException (string.Format (format, "Microsoft.Data.Sqlite")); -#else - throw new NotSupportedException (string.Format (format, "System.Data.SQLite")); -#endif - } - return new DefaultSecureMimeContext (); case "application/x-pgp-signature": case "application/pgp-signature": diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index d4acfd5e3d..51e1d66ea2 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -83,6 +83,18 @@ static DefaultSecureMimeContext () DefaultDatabasePath = Path.Combine (path, "smime.db"); } + static void CheckIsAvailable () + { + if (!SqliteCertificateDatabase.IsAvailable) { + const string format = "SQLite is not available. Install the {0} nuget."; +#if NETSTANDARD1_3 || NETSTANDARD1_6 + throw new NotSupportedException (string.Format (format, "Microsoft.Data.Sqlite")); +#else + throw new NotSupportedException (string.Format (format, "System.Data.SQLite")); +#endif + } + } + /// /// Initializes a new instance of the class. /// @@ -118,8 +130,7 @@ public DefaultSecureMimeContext (string fileName, string password) if (password == null) throw new ArgumentNullException (nameof (password)); - if (!SqliteCertificateDatabase.IsAvailable) - throw new NotSupportedException ("Mono.Data.Sqlite is not available."); + CheckIsAvailable (); var dir = Path.GetDirectoryName (fileName); var exists = File.Exists (fileName); From 1fdc1cbba9aba6d75ba0de241497f5165d0f9ecd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 20:19:53 -0400 Subject: [PATCH 522/741] bumped version to 2.6.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 ++--- ReleaseNotes.md | 23 +++++++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 14 +++++++---- nuget/MimeKitLite.nuspec | 13 +++++++---- .../DkimVerifier/DkimVerifier.csproj | 4 ++-- .../DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader/MessageReader.csproj | 4 ++-- .../MessageReader/packages.config | 2 +- 12 files changed, 53 insertions(+), 23 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index bb7053a9ec..7eeca6d8f6 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.5.2 + 2.6.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 03a2ae1262..03f68a35a6 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.5.2 + 2.6.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 91c09bf8ab..811e0bcff2 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.5.2.0")] -[assembly: AssemblyFileVersion ("2.5.2.0")] -[assembly: AssemblyVersion ("2.5.0.0")] +[assembly: AssemblyInformationalVersion ("2.6.0.0")] +[assembly: AssemblyFileVersion ("2.6.0.0")] +[assembly: AssemblyVersion ("2.6.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index cc54f0a3b7..696fd68cc0 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,28 @@ # Release Notes +### MimeKit 2.6.0 (2020-04-03) + +* Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of + MailboxAddress.TryParse() so that it is more lenient in what it accepts. + (issue [#542](https://github.com/jstedfast/MimeKit/issues/542)) +* Added an HtmlTokenizer.IgnoreTruncatedTags property which is useful when working with + truncated HTML. +* Optimized the heck out of HtmlEntityDecoder. +* Added a TextPart.Format property for a quick way to determine the type of text it + contains. +* Added text/plain and text/html preview/snippet generators (PlainTextPreviewer and + HtmlTextPreviewer, respectively). This is part of a larger improvement to MailKit's + text preview feature for IMAP. + (MailKit issue [#1001](https://github.com/jstedfast/MailKit/issues/1001)) +* Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers. +* Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() + to allow developers to override the default formatting behavior by either subclassing + Header or by calling header.SetRawValue(). + (issue [#546](https://github.com/jstedfast/MimeKit/issues/546)) +* Switched MimeKit for Android and iOS over to using Portable.BouncyCastle. +* Added MimeTypes.Register() to allow developers to register their own mime-type mappings + to file extensions. + ### MimeKit 2.5.2 (2020-03-14) * Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of diff --git a/appveyor.yml b/appveyor.yml index 12d8345340..64e1d1ca27 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.5.2.{build} +version: 2.6.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 70527e59a2..0974e3a662 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.5.2$(Rev:.r) +name: 2.6.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index e541364adf..98854e437d 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.5.2 + 2.6.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,10 +26,14 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of the standard BouncyCastle package, just like the netstandard builds. (issue #540) -* Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID. (issue #538) -* Added a few more TNEF property tags. -* Fixed the HtmlEntityDecoder to require some named attributes to end with a `;`. +* Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of MailboxAddress.TryParse() so that it is more lenient in what it accepts. (issue #542) +* Added an HtmlTokenizer.IgnoreTruncatedTags property which is useful when working with truncated HTML. +* Optimized the heck out of HtmlEntityDecoder. +* Added a TextPart.Format property for a quick way to determine the type of text it contains. +* Added text/plain and text/html preview/snippet generators (PlainTextPreviewer and HtmlTextPreviewer, respectively). This is part of a larger improvement to MailKit's text preview feature for IMAP. (MailKit issue #1001) +* Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers. +* Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() to allow developers to override the default formatting behavior by either subclassing Header or by calling header.SetRawValue(). (issue #546) +* Switched MimeKit for Android and iOS over to using Portable.BouncyCastle. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 489879e296..8a346e4c89 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.5.2 + 2.6.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,10 +26,13 @@ An Open Source library for creating and parsing MIME messages. -* Updated net46, net47, and net48 builds to reference Portable.BouncyCastle instead of the standard BouncyCastle package, just like the netstandard builds. (issue #540) -* Fixed extraction of TNEF EmbeddedMessage attachment data to skip the leading GUID. (issue #538) -* Added a few more TNEF property tags. -* Fixed the HtmlEntityDecoder to require some named attributes to end with a `;`. +* Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of MailboxAddress.TryParse() so that it is more lenient in what it accepts. (issue #542) +* Added an HtmlTokenizer.IgnoreTruncatedTags property which is useful when working with truncated HTML. +* Optimized the heck out of HtmlEntityDecoder. +* Added a TextPart.Format property for a quick way to determine the type of text it contains. +* Added text/plain and text/html preview/snippet generators (PlainTextPreviewer and HtmlTextPreviewer, respectively). This is part of a larger improvement to MailKit's text preview feature for IMAP. (MailKit issue #1001) +* Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers. +* Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() to allow developers to override the default formatting behavior by either subclassing Header or by calling header.SetRawValue(). (issue #546) Xamarin Inc. en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 5de57ce87e..6d0cea09a7 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.2\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.6.0\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index e378f02a3c..e4aeac0710 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index b478e7483e..9c7e5307bf 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.2\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.6.0\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index 8f8434f583..f197399d5c 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + From 2350490f1d23f4b0cf2ce4d378c627512a0f4939 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 21:20:02 -0400 Subject: [PATCH 523/741] updated Android and iOS samples --- nuget/MimeKit.nuspec | 1 + .../HtmlPreviewVisitor.cs | 5 ++--- .../MessageReader.Android/MainActivity.cs | 2 +- .../MessageReader.Android.csproj | 16 +++++++-------- .../MultipartRelatedWebViewClient.cs | 6 ++---- .../Resources/Resource.designer.cs | 20 +++++++++---------- .../MessageReader.Android/packages.config | 5 +++-- .../MessageReader.iOS/AppDelegate.cs | 2 +- .../MessageReader.iOS/HtmlPreviewVisitor.cs | 5 ++--- .../MessageReader.iOS/Main.cs | 2 +- .../MessageReader.iOS.csproj | 10 +++++----- .../MessageReaderViewController.cs | 2 +- .../MultipartRelatedUrlCache.cs | 6 ++---- .../MessageReader.iOS/packages.config | 5 +++-- 14 files changed, 42 insertions(+), 45 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 98854e437d..e546fca986 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -34,6 +34,7 @@ * Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers. * Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() to allow developers to override the default formatting behavior by either subclassing Header or by calling header.SetRawValue(). (issue #546) * Switched MimeKit for Android and iOS over to using Portable.BouncyCastle. +* Added MimeTypes.Register() to allow developers to register their own mime-type mappings to file extensions. Xamarin Inc. en-US diff --git a/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs b/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs index e0811ade67..e10aa04e1a 100644 --- a/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs +++ b/samples/MessageReader.Android/MessageReader.Android/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -117,9 +117,8 @@ protected override void VisitTextPart (TextPart entity) }; } else if (entity.IsFlowed) { var flowed = new FlowedToHtml (); - string delsp; - if (entity.ContentType.Parameters.TryGetValue ("delsp", out delsp)) + if (entity.ContentType.Parameters.TryGetValue ("delsp", out string delsp)) flowed.DeleteSpace = delsp.ToLowerInvariant () == "yes"; converter = flowed; diff --git a/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs b/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs index 2760aae906..e65c35de64 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs +++ b/samples/MessageReader.Android/MessageReader.Android/MainActivity.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 7bee35ea5e..931d96b565 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -16,7 +16,7 @@ MessageReader.Android Properties\AndroidManifest.xml v9.0 - armeabi,armeabi-v7a,x86 + armeabi-v7a,x86 @@ -30,9 +30,9 @@ 4 None false - True + true - True + true CJK,Mideast,Rare,West,Other Xamarin @@ -55,11 +55,11 @@ False - - ..\packages\MimeKit.2.5.2\lib\monoandroid\BouncyCastle.dll + + ..\packages\Portable.BouncyCastle.1.8.5\lib\netstandard2.0\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.2\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.6.0\lib\monoandroid\MimeKit.dll @@ -93,4 +93,4 @@ xamarin3.msg - + \ No newline at end of file diff --git a/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs b/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs index 692fce1040..b142d77174 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs +++ b/samples/MessageReader.Android/MessageReader.Android/MultipartRelatedWebViewClient.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -59,9 +59,7 @@ public override WebResourceResponse ShouldInterceptRequest (WebView view, IWebRe if ((index = related.IndexOf (uri)) == -1) continue; - var part = related[index] as MimePart; - - if (part != null) { + if (related[index] is MimePart part) { var mimeType = part.ContentType.MimeType; var charset = part.ContentType.Charset; var stream = part.Content.Open (); diff --git a/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs b/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs index 0b3d5c5caf..f75f1a3f99 100644 --- a/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs +++ b/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs @@ -15,7 +15,7 @@ namespace MessageReader.Android { - [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] public partial class Resource { @@ -44,8 +44,8 @@ private Attribute() public partial class Drawable { - // aapt resource value: 0x7f020000 - public const int Icon = 2130837504; + // aapt resource value: 0x7F010000 + public const int Icon = 2130771968; static Drawable() { @@ -60,8 +60,8 @@ private Drawable() public partial class Id { - // aapt resource value: 0x7f050000 - public const int webView = 2131034112; + // aapt resource value: 0x7F020000 + public const int webView = 2130837504; static Id() { @@ -76,7 +76,7 @@ private Id() public partial class Layout { - // aapt resource value: 0x7f030000 + // aapt resource value: 0x7F030000 public const int Main = 2130903040; static Layout() @@ -92,11 +92,11 @@ private Layout() public partial class String { - // aapt resource value: 0x7f040001 - public const int app_name = 2130968577; + // aapt resource value: 0x7F040000 + public const int app_name = 2130968576; - // aapt resource value: 0x7f040000 - public const int hello = 2130968576; + // aapt resource value: 0x7F040001 + public const int hello = 2130968577; static String() { diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index 9c6155da21..beef5187c7 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,4 +1,5 @@  - - + + + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs b/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs index a1aa3ac29d..9315fc52f9 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/AppDelegate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs b/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs index d107031a74..6eaf9482cb 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -117,9 +117,8 @@ protected override void VisitTextPart (TextPart entity) }; } else if (entity.IsFlowed) { var flowed = new FlowedToHtml (); - string delsp; - if (entity.ContentType.Parameters.TryGetValue ("delsp", out delsp)) + if (entity.ContentType.Parameters.TryGetValue ("delsp", out string delsp)) flowed.DeleteSpace = delsp.ToLowerInvariant () == "yes"; converter = flowed; diff --git a/samples/MessageReader.iOS/MessageReader.iOS/Main.cs b/samples/MessageReader.iOS/MessageReader.iOS/Main.cs index 4a59b5b5db..c14469d6a7 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/Main.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/Main.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index f004e14311..6a5fae4ea0 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -67,11 +67,11 @@ Default - - ..\packages\MimeKit.2.5.2\lib\xamarinios\BouncyCastle.dll + + ..\packages\Portable.BouncyCastle.1.8.5\lib\netstandard2.0\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.5.2\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.6.0\lib\xamarinios\MimeKit.dll @@ -107,4 +107,4 @@ xamarin3.msg - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs b/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs index 4530daa8dd..bcd1edba2f 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReaderViewController.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs b/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs index e327879173..c373e82c0f 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs +++ b/samples/MessageReader.iOS/MessageReader.iOS/MultipartRelatedUrlCache.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2014-2019 Jeffrey Stedfast +// Copyright (c) 2014-2020 Jeffrey Stedfast // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -59,9 +59,7 @@ public override NSCachedUrlResponse CachedResponseForRequest (NSUrlRequest reque if ((index = related.IndexOf (uri)) == -1) continue; - var part = related[index] as MimePart; - - if (part != null) { + if (related[index] is MimePart part) { var mimeType = part.ContentType.MimeType; var charset = part.ContentType.Charset; NSUrlResponse response; diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index f08ee90662..a575eb8f60 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,4 +1,5 @@  - - + + + \ No newline at end of file From 0e959efcb9514f18f263c7222f2eb56c15b7fdb2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Apr 2020 23:18:24 -0400 Subject: [PATCH 524/741] Fixed up some doc comments --- MimeKit/Header.cs | 1 + MimeKit/Text/TextPreviewer.cs | 2 +- MimeKit/Tnef/TnefPart.cs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 625d011253..a271b8fba4 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -339,6 +339,7 @@ internal protected Header (ParserOptions options, byte[] field, byte[] value, bo /// when serializing new values for headers. /// /// The parser options used. + /// The id of the header. /// The raw header field. /// The raw value of the header. internal protected Header (ParserOptions options, HeaderId id, string field, byte[] value) diff --git a/MimeKit/Text/TextPreviewer.cs b/MimeKit/Text/TextPreviewer.cs index 5a78151a98..a0a320381b 100644 --- a/MimeKit/Text/TextPreviewer.cs +++ b/MimeKit/Text/TextPreviewer.cs @@ -204,7 +204,7 @@ public virtual string GetPreviewText (Stream stream, string charset) /// Get a text preview of a stream of text in the specified encoding. /// /// The original text stream. - /// The encoding of the stream. + /// The encoding of the stream. /// A string representing a shortened preview of the original text. /// /// is null. diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index f2edf1c6af..14317d335e 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -75,7 +75,7 @@ public TnefPart () : base ("application", "vnd.ms-tnef") /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes + /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class /// of the class. However, it should still From 136cd434e086b82d34f2a5c85aaa5a46cd0c3c2a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 16 Apr 2020 20:51:47 -0400 Subject: [PATCH 525/741] Update FAQ.md --- FAQ.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/FAQ.md b/FAQ.md index 5aff3a1d48..8585343797 100644 --- a/FAQ.md +++ b/FAQ.md @@ -680,13 +680,12 @@ if (attachment.ContentDisposition.Parameters.TryGetValue ("filename", out param) param.EncodingMethod = ParameterEncodingMethod.Rfc2047; ``` -The other way is to use a [FormatOptions](http://www.mimekit.net/docs/html/T_MimeKit_FormatOptions.htm): +Or ```csharp -var options = FormatOptions.Default.Clone (); -options.ParameterEncodingMethod = ParameterEncodingMethod.Rfc2047; - -message.WriteTo (options, stream); +foreach (var param in attachment.ContentDisposition.Parameters) { + param.EncodingMethod = ParameterEncodingMethod.Rfc2047; +} ``` ### Q: How do I decrypt PGP messages that are embedded in the main message text? From ae0d1e47dd0df683a9ab29fb0751bea06d44ee49 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 16 Apr 2020 22:00:09 -0400 Subject: [PATCH 526/741] Added documentation samples for ParameterEncodingMethod --- MimeKit/ContentDisposition.cs | 3 +++ MimeKit/Parameter.cs | 3 +++ MimeKit/ParameterEncodingMethod.cs | 3 +++ MimeKit/ParameterList.cs | 3 +++ 4 files changed, 12 insertions(+) diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index 2ba6096ca7..09843a642c 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -159,6 +159,9 @@ public bool IsAttachment { /// contain parameters to provide further information to the receiving client /// such as the file attributes. /// + /// + /// + /// /// The parameters. public ParameterList Parameters { get { return parameters; } diff --git a/MimeKit/Parameter.cs b/MimeKit/Parameter.cs index 554801b7c9..5f06455e87 100644 --- a/MimeKit/Parameter.cs +++ b/MimeKit/Parameter.cs @@ -211,6 +211,9 @@ public Encoding Encoding { /// If set to , the encoding /// method used will default to the value set on the . /// + /// + /// + /// /// The encoding method. /// /// is not a valid value. diff --git a/MimeKit/ParameterEncodingMethod.cs b/MimeKit/ParameterEncodingMethod.cs index 4a1aa14cf7..7c7543ffb7 100644 --- a/MimeKit/ParameterEncodingMethod.cs +++ b/MimeKit/ParameterEncodingMethod.cs @@ -35,6 +35,9 @@ namespace MimeKit { /// some older email clients to improperly encode using the method described in /// rfc2047 instead. /// + /// + /// + /// public enum ParameterEncodingMethod { /// /// Use the default encoding method set on the . diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index d45c0b8cb7..3ed145328b 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -276,6 +276,9 @@ public string this [string name] { /// /// Gets the parameter with the specified name. /// + /// + /// + /// /// true if the parameter exists; otherwise, false. /// The parameter name. /// The parameter. From cf8ab32e8803feb514bc060550c2e82896aac44e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 22 Apr 2020 11:08:50 -0400 Subject: [PATCH 527/741] Fixed InernetAddressList.Insert() to allow inserting at the end of the list Fixes issue #559 --- MimeKit/InternetAddressList.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index 9c935f66c2..8a9cced54c 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -147,7 +147,7 @@ public int IndexOf (InternetAddress address) /// public void Insert (int index, InternetAddress address) { - if (index < 0 || index >= list.Count) + if (index < 0 || index > list.Count) throw new ArgumentOutOfRangeException (nameof (index)); if (address == null) From c445e8bcd3a079e7be75b89ada7df6517737e49f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 26 Apr 2020 08:57:09 -0400 Subject: [PATCH 528/741] Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth allowed by the parser --- MimeKit/AsyncMimeParser.cs | 32 ++++++++++++++++---------------- MimeKit/MimeParser.cs | 32 ++++++++++++++++---------------- MimeKit/ParserOptions.cs | 22 ++++++++++++++++++++-- 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 3259e7fc0a..65c1aa034e 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -287,7 +287,7 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToke return results.Boundary; } - async Task ConstructMessagePartAsync (MessagePart part, CancellationToken cancellationToken) + async Task ConstructMessagePartAsync (MessagePart part, int depth, CancellationToken cancellationToken) { BoundaryType found; @@ -342,13 +342,13 @@ async Task ConstructMessagePartAsync (MessagePart part, Cancellati Buffer.BlockCopy (preHeaderBuffer, 0, message.MboxMarker, 0, preHeaderLength); } - var entity = options.CreateEntity (type, headers, true); + var entity = options.CreateEntity (type, headers, true, depth); message.Body = entity; if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); @@ -375,7 +375,7 @@ async Task MultipartScanEpilogueAsync (Multipart multipart, Cancel } } - async Task MultipartScanSubpartsAsync (Multipart multipart, CancellationToken cancellationToken) + async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { BoundaryType found; @@ -393,12 +393,12 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, Cancel // return BoundaryType.EndBoundary; var type = GetContentType (multipart.ContentType); - var entity = options.CreateEntity (type, headers, false); + var entity = options.CreateEntity (type, headers, false, depth); if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); @@ -408,7 +408,7 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, Cancel return found; } - async Task ConstructMultipartAsync (Multipart multipart, CancellationToken cancellationToken) + async Task ConstructMultipartAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { var boundary = multipart.Boundary; @@ -425,7 +425,7 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat var found = await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); if (found == BoundaryType.ImmediateBoundary) - found = await MultipartScanSubpartsAsync (multipart, cancellationToken).ConfigureAwait (false); + found = await MultipartScanSubpartsAsync (multipart, depth, cancellationToken).ConfigureAwait (false); if (found == BoundaryType.ImmediateEndBoundary) { // consume the end boundary and read the epilogue (if there is one) @@ -522,11 +522,11 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. - var entity = options.CreateEntity (type, headers, false); + var entity = options.CreateEntity (type, headers, false, 0); if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); else found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); @@ -607,13 +607,13 @@ async Task ConstructMultipartAsync (Multipart multipart, Cancellat } var type = GetContentType (null); - var entity = options.CreateEntity (type, headers, true); + var entity = options.CreateEntity (type, headers, true, 0); message.Body = entity; if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, cancellationToken).ConfigureAwait (false); + found = await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); else found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 4e3f22f506..1631c4db9b 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1250,7 +1250,7 @@ unsafe BoundaryType ConstructMimePart (MimePart part, byte* inbuf, CancellationT return found; } - unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, CancellationToken cancellationToken) + unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, int depth, CancellationToken cancellationToken) { BoundaryType found; @@ -1301,13 +1301,13 @@ unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, Cancell Buffer.BlockCopy (preHeaderBuffer, 0, message.MboxMarker, 0, preHeaderLength); } - var entity = options.CreateEntity (type, headers, true); + var entity = options.CreateEntity (type, headers, true, depth); message.Body = entity; if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, cancellationToken); + found = ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, cancellationToken); + found = ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); else found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); @@ -1338,7 +1338,7 @@ unsafe BoundaryType MultipartScanEpilogue (Multipart multipart, byte* inbuf, Can } } - unsafe BoundaryType MultipartScanSubparts (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) + unsafe BoundaryType MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { BoundaryType found; @@ -1356,12 +1356,12 @@ unsafe BoundaryType MultipartScanSubparts (Multipart multipart, byte* inbuf, Can // return BoundaryType.EndBoundary; var type = GetContentType (multipart.ContentType); - var entity = options.CreateEntity (type, headers, false); + var entity = options.CreateEntity (type, headers, false, depth); if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, cancellationToken); + found = ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, cancellationToken); + found = ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); else found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); @@ -1384,7 +1384,7 @@ void PopBoundary () bounds.RemoveAt (0); } - unsafe BoundaryType ConstructMultipart (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) + unsafe BoundaryType ConstructMultipart (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { var boundary = multipart.Boundary; @@ -1401,7 +1401,7 @@ unsafe BoundaryType ConstructMultipart (Multipart multipart, byte* inbuf, Cancel var found = MultipartScanPreamble (multipart, inbuf, cancellationToken); if (found == BoundaryType.ImmediateBoundary) - found = MultipartScanSubparts (multipart, inbuf, cancellationToken); + found = MultipartScanSubparts (multipart, inbuf, depth, cancellationToken); if (found == BoundaryType.ImmediateEndBoundary) { // consume the end boundary and read the epilogue (if there is one) @@ -1486,11 +1486,11 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. - var entity = options.CreateEntity (type, headers, false); + var entity = options.CreateEntity (type, headers, false, 0); if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, cancellationToken); + found = ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, cancellationToken); + found = ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); else found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); @@ -1579,13 +1579,13 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke } var type = GetContentType (null); - var entity = options.CreateEntity (type, headers, true); + var entity = options.CreateEntity (type, headers, true, 0); message.Body = entity; if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, cancellationToken); + found = ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, cancellationToken); + found = ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); else found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 20249cad23..62e75c1bd4 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -106,9 +106,21 @@ public class ParserOptions /// formed. If the value is set too large, then it is possible that a maliciously formed set of /// recursive group addresses could cause a stack overflow. /// - /// The max address group depth. + /// The maximum address group depth. public int MaxAddressGroupDepth { get; set; } + /// + /// Gets or sets the maximum MIME nesting depth the parser should accept. + /// + /// + /// This option exists in order to define the maximum recursive depth of MIME parts that the parser + /// should accept before treating further nesting as a leaf-node MIME part and not recursing any further. + /// If the value is set too large, then it is possible that a maliciously formed set of rdeeply nested + /// multipart MIME parts could cause a stack overflow. + /// + /// The maximum MIME nesting depth. + public int MaxMimeDepth { get; set; } + /// /// Gets or sets the compliance mode that should be used when parsing Content-Type and Content-Disposition parameters. /// @@ -178,6 +190,7 @@ public ParserOptions () AllowAddressesWithoutDomain = true; RespectContentLength = false; MaxAddressGroupDepth = 3; + MaxMimeDepth = 1024; } /// @@ -199,6 +212,7 @@ public ParserOptions Clone () options.MaxAddressGroupDepth = MaxAddressGroupDepth; options.RespectContentLength = RespectContentLength; options.CharsetEncoding = CharsetEncoding; + options.MaxMimeDepth = MaxMimeDepth; foreach (var mimeType in mimeTypes) options.mimeTypes.Add (mimeType.Key, mimeType.Value); @@ -281,9 +295,13 @@ static bool IsEncoded (IList
headers) return false; } - internal MimeEntity CreateEntity (ContentType contentType, IList
headers, bool toplevel) + internal MimeEntity CreateEntity (ContentType contentType, IList
headers, bool toplevel, int depth) { var args = new MimeEntityConstructorArgs (this, contentType, headers, toplevel); + + if (depth >= MaxMimeDepth) + return new MimePart (args); + var subtype = contentType.MediaSubtype.ToLowerInvariant (); var type = contentType.MediaType.ToLowerInvariant (); From 5b2cab02c0d10a87cdb9d6dc89e423cb4217a3c7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 26 Apr 2020 10:30:05 -0400 Subject: [PATCH 529/741] Added logic to handle multipart children without any headers or content i.e. --boundary-marker --boundary-marker --- MimeKit/AsyncMimeParser.cs | 170 ++++++++++++++++------------------ MimeKit/MimeParser.cs | 185 +++++++++++++++++++------------------ 2 files changed, 175 insertions(+), 180 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 65c1aa034e..83ea4246cb 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -117,6 +117,7 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) bool valid = true; int left = 0; + boundary = BoundaryType.None; ResetRawHeaderData (); headers.Clear (); @@ -202,22 +203,9 @@ async Task StepAsync (CancellationToken cancellationToken) return state; } - struct ScanContentResults - { - public readonly BoundaryType Boundary; - public readonly bool IsEmpty; - - public ScanContentResults (BoundaryType boundary, bool empty) - { - Boundary = boundary; - IsEmpty = empty; - } - } - - async Task ScanContentAsync (Stream content, bool trimNewLine, CancellationToken cancellationToken) + async Task ScanContentAsync (Stream content, bool trimNewLine, CancellationToken cancellationToken) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); - BoundaryType found = BoundaryType.None; int contentIndex = inputIndex; bool midline = false; int nleft; @@ -228,24 +216,24 @@ async Task ScanContentAsync (Stream content, bool trimNewLin nleft = inputEnd - inputIndex; if (await ReadAheadAsync (atleast, 2, cancellationToken).ConfigureAwait (false) <= 0) { + boundary = BoundaryType.Eos; contentIndex = inputIndex; - found = BoundaryType.Eos; break; } unsafe { fixed (byte* inbuf = input) { - ScanContent (inbuf, ref contentIndex, ref nleft, ref midline, ref found); + ScanContent (inbuf, ref contentIndex, ref nleft, ref midline); } } - } while (found == BoundaryType.None); + } while (boundary == BoundaryType.None); if (contentIndex < inputIndex) content.Write (input, contentIndex, inputIndex - contentIndex); - var empty = content.Length == 0; + var isEmpty = content.Length == 0; - if (found != BoundaryType.Eos && trimNewLine) { + if (boundary != BoundaryType.Eos && trimNewLine) { // the last \r\n belongs to the boundary if (content.Length > 0) { if (input[inputIndex - 2] == (byte) '\r') @@ -255,47 +243,45 @@ async Task ScanContentAsync (Stream content, bool trimNewLin } } - return new ScanContentResults (found, empty); + return isEmpty; } - async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellationToken) + async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellationToken) { - ScanContentResults results; Stream content; + bool isEmpty; if (persistent) { long begin = GetOffset (inputIndex); long end; using (var measured = new MeasuringStream ()) { - results = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); + isEmpty = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); end = begin + measured.Length; } content = new BoundStream (stream, begin, end, true); } else { content = new MemoryBlockStream (); - results = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); + isEmpty = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); content.Seek (0, SeekOrigin.Begin); } - if (!results.IsEmpty) + if (!isEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding); else content.Dispose (); - - return results.Boundary; } - async Task ConstructMessagePartAsync (MessagePart part, int depth, CancellationToken cancellationToken) + async Task ConstructMessagePartAsync (MessagePart part, int depth, CancellationToken cancellationToken) { - BoundaryType found; - if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); - if (await ReadAheadAsync (atleast, 0, cancellationToken).ConfigureAwait (false) <= 0) - return BoundaryType.Eos; + if (await ReadAheadAsync (atleast, 0, cancellationToken).ConfigureAwait (false) <= 0) { + boundary = BoundaryType.Eos; + return; + } unsafe { fixed (byte* inbuf = input) { @@ -308,17 +294,17 @@ async Task ConstructMessagePartAsync (MessagePart part, int depth, while (*inptr != (byte) '\n') inptr++; - found = CheckBoundary (inputIndex, start, (int) (inptr - start)); + boundary = CheckBoundary (inputIndex, start, (int) (inptr - start)); - switch (found) { + switch (boundary) { case BoundaryType.ImmediateEndBoundary: case BoundaryType.ImmediateBoundary: case BoundaryType.ParentBoundary: - return found; + return; case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) - return found; + return; break; } } @@ -331,7 +317,8 @@ async Task ConstructMessagePartAsync (MessagePart part, int depth, // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, // which likely means that this is not a valid MIME stream? - return BoundaryType.Eos; + boundary = BoundaryType.Eos; + return; } var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); @@ -346,48 +333,57 @@ async Task ConstructMessagePartAsync (MessagePart part, int depth, message.Body = entity; if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else - found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); part.Message = message; - - return found; } - async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) + async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { - var found = await ScanContentAsync (memory, false, cancellationToken).ConfigureAwait (false); + await ScanContentAsync (memory, false, cancellationToken).ConfigureAwait (false); multipart.RawPreamble = memory.ToArray (); - return found.Boundary; } } - async Task MultipartScanEpilogueAsync (Multipart multipart, CancellationToken cancellationToken) + async Task MultipartScanEpilogueAsync (Multipart multipart, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { - var found = await ScanContentAsync (memory, true, cancellationToken).ConfigureAwait (false); - multipart.RawEpilogue = found.IsEmpty ? null : memory.ToArray (); - return found.Boundary; + var isEmpty = await ScanContentAsync (memory, true, cancellationToken).ConfigureAwait (false); + multipart.RawEpilogue = isEmpty ? null : memory.ToArray (); } } - async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, CancellationToken cancellationToken) + async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { - BoundaryType found; - do { // skip over the boundary marker - if (!await SkipLineAsync (true, cancellationToken).ConfigureAwait (false)) - return BoundaryType.Eos; + if (!await SkipLineAsync (true, cancellationToken).ConfigureAwait (false)) { + boundary = BoundaryType.Eos; + return; + } // parse the headers state = MimeParserState.Headers; - if (await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) - return BoundaryType.Eos; + if (await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) { + boundary = BoundaryType.Eos; + return; + } + + if (state == MimeParserState.Boundary) { + if (headers.Count == 0) { + if (boundary == BoundaryType.ImmediateBoundary) + continue; + break; + } + + // This part has no content, but that will be handled in ConstructMultipartAsync() + // or ConstructMimePartAsync(). + } //if (state == ParserState.Complete && headers.Count == 0) // return BoundaryType.EndBoundary; @@ -396,44 +392,44 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int de var entity = options.CreateEntity (type, headers, false, depth); if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else - found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); multipart.Add (entity); - } while (found == BoundaryType.ImmediateBoundary); - - return found; + } while (boundary == BoundaryType.ImmediateBoundary); } - async Task ConstructMultipartAsync (Multipart multipart, int depth, CancellationToken cancellationToken) + async Task ConstructMultipartAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { - var boundary = multipart.Boundary; + var marker = multipart.Boundary; - if (boundary == null) { + if (marker == null) { #if DEBUG Debug.WriteLine ("Multipart without a boundary encountered!"); #endif // Note: this will scan all content into the preamble... - return await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); + await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); + return; } - PushBoundary (boundary); + PushBoundary (marker); - var found = await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); - if (found == BoundaryType.ImmediateBoundary) - found = await MultipartScanSubpartsAsync (multipart, depth, cancellationToken).ConfigureAwait (false); + await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); + if (boundary == BoundaryType.ImmediateBoundary) + await MultipartScanSubpartsAsync (multipart, depth, cancellationToken).ConfigureAwait (false); - if (found == BoundaryType.ImmediateEndBoundary) { + if (boundary == BoundaryType.ImmediateEndBoundary) { // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; await SkipLineAsync (false, cancellationToken).ConfigureAwait (false); PopBoundary (); - return await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); + await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); + return; } multipart.WriteEndBoundary = false; @@ -443,15 +439,12 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth unsafe { fixed (byte* inbuf = input) { - if (found == BoundaryType.ParentEndBoundary && FoundImmediateBoundary (inbuf, true)) - return BoundaryType.ImmediateEndBoundary; - - if (found == BoundaryType.ParentBoundary && FoundImmediateBoundary (inbuf, false)) - return BoundaryType.ImmediateBoundary; + if (boundary == BoundaryType.ParentEndBoundary && FoundImmediateBoundary (inbuf, true)) + boundary = BoundaryType.ImmediateEndBoundary; + else if (boundary == BoundaryType.ParentBoundary && FoundImmediateBoundary (inbuf, false)) + boundary = BoundaryType.ImmediateBoundary; } } - - return found; } /// @@ -518,19 +511,18 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth throw new FormatException ("Failed to parse entity headers."); var type = GetContentType (null); - BoundaryType found; // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. var entity = options.CreateEntity (type, headers, false, 0); if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); else - found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - if (found != BoundaryType.Eos) + if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else state = MimeParserState.Eos; @@ -557,8 +549,6 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth /// public async Task ParseMessageAsync (CancellationToken cancellationToken = default (CancellationToken)) { - BoundaryType found; - // Note: if a previously parsed MimePart's content has been read, // then the stream position will have moved and will need to be // reset. @@ -611,13 +601,13 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth message.Body = entity; if (entity is Multipart) - found = await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - found = await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); else - found = await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - if (found != BoundaryType.Eos) { + if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) state = MimeParserState.MboxMarker; else diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 1631c4db9b..f26839b209 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -90,6 +90,7 @@ enum MimeParserState : sbyte MessageHeaders, Headers, Content, + Boundary, Complete, Eos } @@ -132,6 +133,7 @@ public partial class MimeParser : IEnumerable readonly List
headers = new List
(); MimeParserState state; + BoundaryType boundary; MimeFormat format; bool persistent; bool toplevel; @@ -343,6 +345,7 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, } state = MimeParserState.Initialized; + boundary = BoundaryType.None; } /// @@ -830,6 +833,13 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check length = (inptr + 1) - start; + if ((boundary = CheckBoundary ((int) (start - inbuf), start, (int) length)) != BoundaryType.None) { + inputIndex = (int) (start - inbuf); + state = MimeParserState.Boundary; + headerIndex = 0; + return false; + } + if (!valid && headers.Count == 0) { if (length > 0 && preHeaderLength == 0) { if (inptr[-1] == (byte) '\r') @@ -873,6 +883,7 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) bool valid = true; int left = 0; + boundary = BoundaryType.None; ResetRawHeaderData (); headers.Clear (); @@ -1110,7 +1121,7 @@ int GetMaxBoundaryLength () return bounds.Count > 0 ? bounds[0].MaxLength + 2 : 0; } - unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref bool midline, ref BoundaryType found) + unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref bool midline) { int length = inputEnd - inputIndex; byte* inptr = inbuf + inputIndex; @@ -1120,7 +1131,7 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b contentIndex = inputIndex; if (midline && length == nleft) - found = BoundaryType.Eos; + boundary = BoundaryType.Eos; *inend = (byte) '\n'; @@ -1154,8 +1165,7 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b length = (int) (inptr - start); if (inptr < inend) { - found = CheckBoundary (startIndex, start, length); - if (found != BoundaryType.None) + if ((boundary = CheckBoundary (startIndex, start, length)) != BoundaryType.None) break; length++; @@ -1164,13 +1174,12 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b // didn't find the end of the line... midline = true; - if (found == BoundaryType.None) { + if (boundary == BoundaryType.None) { // not enough to tell if we found a boundary break; } - found = CheckBoundary (startIndex, start, length); - if (found != BoundaryType.None) + if ((boundary = CheckBoundary (startIndex, start, length)) != BoundaryType.None) break; } @@ -1180,10 +1189,9 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b inputIndex = startIndex; } - unsafe BoundaryType ScanContent (byte* inbuf, Stream content, bool trimNewLine, out bool empty, CancellationToken cancellationToken) + unsafe bool ScanContent (byte* inbuf, Stream content, bool trimNewLine, CancellationToken cancellationToken) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); - BoundaryType found = BoundaryType.None; int contentIndex = inputIndex; bool midline = false; int nleft; @@ -1194,20 +1202,20 @@ unsafe BoundaryType ScanContent (byte* inbuf, Stream content, bool trimNewLine, nleft = inputEnd - inputIndex; if (ReadAhead (atleast, 2, cancellationToken) <= 0) { + boundary = BoundaryType.Eos; contentIndex = inputIndex; - found = BoundaryType.Eos; break; } - ScanContent (inbuf, ref contentIndex, ref nleft, ref midline, ref found); - } while (found == BoundaryType.None); + ScanContent (inbuf, ref contentIndex, ref nleft, ref midline); + } while (boundary == BoundaryType.None); if (contentIndex < inputIndex) content.Write (input, contentIndex, inputIndex - contentIndex); - empty = content.Length == 0; + var isEmpty = content.Length == 0; - if (found != BoundaryType.Eos && trimNewLine) { + if (boundary != BoundaryType.Eos && trimNewLine) { // the last \r\n belongs to the boundary if (content.Length > 0) { if (input[inputIndex - 2] == (byte) '\r') @@ -1217,48 +1225,45 @@ unsafe BoundaryType ScanContent (byte* inbuf, Stream content, bool trimNewLine, } } - return found; + return isEmpty; } - unsafe BoundaryType ConstructMimePart (MimePart part, byte* inbuf, CancellationToken cancellationToken) + unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken cancellationToken) { - BoundaryType found; Stream content; - bool empty; + bool isEmpty; if (persistent) { long begin = GetOffset (inputIndex); long end; using (var measured = new MeasuringStream ()) { - found = ScanContent (inbuf, measured, true, out empty, cancellationToken); + isEmpty = ScanContent (inbuf, measured, true, cancellationToken); end = begin + measured.Length; } content = new BoundStream (stream, begin, end, true); } else { content = new MemoryBlockStream (); - found = ScanContent (inbuf, content, true, out empty, cancellationToken); + isEmpty = ScanContent (inbuf, content, true, cancellationToken); content.Seek (0, SeekOrigin.Begin); } - if (!empty) + if (!isEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding); else content.Dispose (); - - return found; } - unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, int depth, CancellationToken cancellationToken) + unsafe void ConstructMessagePart (MessagePart part, byte* inbuf, int depth, CancellationToken cancellationToken) { - BoundaryType found; - if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); - if (ReadAhead (atleast, 0, cancellationToken) <= 0) - return BoundaryType.Eos; + if (ReadAhead (atleast, 0, cancellationToken) <= 0) { + boundary = BoundaryType.Eos; + return; + } byte* start = inbuf + inputIndex; byte* inend = inbuf + inputEnd; @@ -1269,17 +1274,17 @@ unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, int dep while (*inptr != (byte) '\n') inptr++; - found = CheckBoundary (inputIndex, start, (int) (inptr - start)); + boundary = CheckBoundary (inputIndex, start, (int) (inptr - start)); - switch (found) { + switch (boundary) { case BoundaryType.ImmediateEndBoundary: case BoundaryType.ImmediateBoundary: case BoundaryType.ParentBoundary: - return found; + return; case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) - return found; + return; break; } } @@ -1290,7 +1295,8 @@ unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, int dep // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, // which likely means that this is not a valid MIME stream? - return BoundaryType.Eos; + boundary = BoundaryType.Eos; + return; } var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); @@ -1305,52 +1311,57 @@ unsafe BoundaryType ConstructMessagePart (MessagePart part, byte* inbuf, int dep message.Body = entity; if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); + ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); + ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); else - found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); part.Message = message; - - return found; } - unsafe BoundaryType MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) + unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { - bool empty; - - var found = ScanContent (inbuf, memory, false, out empty, cancellationToken); + ScanContent (inbuf, memory, false, cancellationToken); multipart.RawPreamble = memory.ToArray (); - return found; } } - unsafe BoundaryType MultipartScanEpilogue (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) + unsafe void MultipartScanEpilogue (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { - bool empty; - - var found = ScanContent (inbuf, memory, true, out empty, cancellationToken); - multipart.RawEpilogue = empty ? null : memory.ToArray (); - return found; + var isEmpty = ScanContent (inbuf, memory, true, cancellationToken); + multipart.RawEpilogue = isEmpty ? null : memory.ToArray (); } } - unsafe BoundaryType MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) + unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { - BoundaryType found; - do { // skip over the boundary marker - if (!SkipLine (inbuf, true, cancellationToken)) - return BoundaryType.Eos; + if (!SkipLine (inbuf, true, cancellationToken)) { + boundary = BoundaryType.Eos; + break; + } // parse the headers state = MimeParserState.Headers; - if (Step (inbuf, cancellationToken) == MimeParserState.Error) - return BoundaryType.Eos; + if (Step (inbuf, cancellationToken) == MimeParserState.Error) { + boundary = BoundaryType.Eos; + break; + } + + if (state == MimeParserState.Boundary) { + if (headers.Count == 0) { + if (boundary == BoundaryType.ImmediateBoundary) + continue; + break; + } + + // This part has no content, but that will be handled in ConstructMultipart() + // or ConstructMimePart(). + } //if (state == ParserState.Complete && headers.Count == 0) // return BoundaryType.EndBoundary; @@ -1359,16 +1370,14 @@ unsafe BoundaryType MultipartScanSubparts (Multipart multipart, byte* inbuf, int var entity = options.CreateEntity (type, headers, false, depth); if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); + ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); + ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); else - found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); multipart.Add (entity); - } while (found == BoundaryType.ImmediateBoundary); - - return found; + } while (boundary == BoundaryType.ImmediateBoundary); } void PushBoundary (string boundary) @@ -1384,32 +1393,34 @@ void PopBoundary () bounds.RemoveAt (0); } - unsafe BoundaryType ConstructMultipart (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) + unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { - var boundary = multipart.Boundary; + var marker = multipart.Boundary; - if (boundary == null) { + if (marker == null) { #if DEBUG Debug.WriteLine ("Multipart without a boundary encountered!"); #endif // Note: this will scan all content into the preamble... - return MultipartScanPreamble (multipart, inbuf, cancellationToken); + MultipartScanPreamble (multipart, inbuf, cancellationToken); + return; } - PushBoundary (boundary); + PushBoundary (marker); - var found = MultipartScanPreamble (multipart, inbuf, cancellationToken); - if (found == BoundaryType.ImmediateBoundary) - found = MultipartScanSubparts (multipart, inbuf, depth, cancellationToken); + MultipartScanPreamble (multipart, inbuf, cancellationToken); + if (boundary == BoundaryType.ImmediateBoundary) + MultipartScanSubparts (multipart, inbuf, depth, cancellationToken); - if (found == BoundaryType.ImmediateEndBoundary) { + if (boundary == BoundaryType.ImmediateEndBoundary) { // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; SkipLine (inbuf, false, cancellationToken); PopBoundary (); - return MultipartScanEpilogue (multipart, inbuf, cancellationToken); + MultipartScanEpilogue (multipart, inbuf, cancellationToken); + return; } multipart.WriteEndBoundary = false; @@ -1417,13 +1428,10 @@ unsafe BoundaryType ConstructMultipart (Multipart multipart, byte* inbuf, int de // We either found the end of the stream or we found a parent's boundary PopBoundary (); - if (found == BoundaryType.ParentEndBoundary && FoundImmediateBoundary (inbuf, true)) - return BoundaryType.ImmediateEndBoundary; - - if (found == BoundaryType.ParentBoundary && FoundImmediateBoundary (inbuf, false)) - return BoundaryType.ImmediateBoundary; - - return found; + if (boundary == BoundaryType.ParentEndBoundary && FoundImmediateBoundary (inbuf, true)) + boundary = BoundaryType.ImmediateEndBoundary; + else if (boundary == BoundaryType.ParentBoundary && FoundImmediateBoundary (inbuf, false)) + boundary = BoundaryType.ImmediateBoundary; } unsafe HeaderList ParseHeaders (byte* inbuf, CancellationToken cancellationToken) @@ -1482,19 +1490,18 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) throw new FormatException ("Failed to parse entity headers."); var type = GetContentType (null); - BoundaryType found; // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. var entity = options.CreateEntity (type, headers, false, 0); if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); + ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); + ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); else - found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - if (found != BoundaryType.Eos) + if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else state = MimeParserState.Eos; @@ -1530,8 +1537,6 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToken) { - BoundaryType found; - // Note: if a previously parsed MimePart's content has been read, // then the stream position will have moved and will need to be // reset. @@ -1583,13 +1588,13 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke message.Body = entity; if (entity is Multipart) - found = ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); + ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); else if (entity is MessagePart) - found = ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); + ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); else - found = ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - if (found != BoundaryType.Eos) { + if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) state = MimeParserState.MboxMarker; else From 9c6a6cdb804e70be1e90b1139e54593069ea41c5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 May 2020 09:21:12 -0400 Subject: [PATCH 530/741] Generate portable pdbs for Release builds and include in nuget packages --- MimeKit/MimeKit.Android.csproj | 2 ++ MimeKit/MimeKit.Mac.csproj | 3 ++- MimeKit/MimeKit.Net45.csproj | 3 ++- MimeKit/MimeKit.NetStandard.csproj | 9 +++++++++ MimeKit/MimeKit.TvOS.csproj | 3 ++- MimeKit/MimeKit.WatchOS.csproj | 3 ++- MimeKit/MimeKit.iOS.csproj | 3 ++- MimeKit/MimeKitLite.Android.csproj | 2 ++ MimeKit/MimeKitLite.Net45.csproj | 2 ++ MimeKit/MimeKitLite.NetStandard.csproj | 9 +++++++++ MimeKit/MimeKitLite.iOS.csproj | 2 ++ nuget/MimeKit.nuspec | 11 ++++++++++- nuget/MimeKitLite.nuspec | 11 ++++++++++- 13 files changed, 56 insertions(+), 7 deletions(-) diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj index 1e8f50c0a7..3b19009cd8 100644 --- a/MimeKit/MimeKit.Android.csproj +++ b/MimeKit/MimeKit.Android.csproj @@ -30,6 +30,8 @@ 4 + true + portable true bin\Release\MonoAndroid obj\Release\MonoAndroid diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj index 2dd3d1a650..9213ef01de 100644 --- a/MimeKit/MimeKit.Mac.csproj +++ b/MimeKit/MimeKit.Mac.csproj @@ -24,7 +24,8 @@ 4 - pdbonly + true + portable true bin\Release\Xamarin.Mac obj\Release\Xamarin.Mac diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 50360c546e..683a7f73f9 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -27,7 +27,8 @@ True - pdbonly + true + portable True bin\Release\net45 obj\Release\net45 diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 7eeca6d8f6..d995440369 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -27,6 +27,15 @@ true mimekit.snk true + true + + + + full + + + + portable diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj index 6d6e248d7e..2d711b93d1 100644 --- a/MimeKit/MimeKit.TvOS.csproj +++ b/MimeKit/MimeKit.TvOS.csproj @@ -22,7 +22,8 @@ 4 - pdbonly + true + portable true bin\Release\Xamarin.TvOS obj\Release\Xamarin.TvOS diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj index 9a27da1462..09ec252dda 100644 --- a/MimeKit/MimeKit.WatchOS.csproj +++ b/MimeKit/MimeKit.WatchOS.csproj @@ -21,7 +21,8 @@ NSUrlSessionHandler - pdbonly + true + portable true bin\Release\Xamarin.WatchOS obj\Release\Xamarin.WatchOS diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj index 290deab45d..d2b91af251 100644 --- a/MimeKit/MimeKit.iOS.csproj +++ b/MimeKit/MimeKit.iOS.csproj @@ -25,7 +25,8 @@ 4 - pdbonly + true + portable true bin\Release\Xamarin.iOS obj\Release\Xamarin.iOS diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj index a12126b3d1..6480bb03a3 100644 --- a/MimeKit/MimeKitLite.Android.csproj +++ b/MimeKit/MimeKitLite.Android.csproj @@ -31,6 +31,8 @@ true + true + portable true bin\Release\MonoAndroid obj\Release\MonoAndroid diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj index 72e881d18e..08d244bfff 100644 --- a/MimeKit/MimeKitLite.Net45.csproj +++ b/MimeKit/MimeKitLite.Net45.csproj @@ -25,6 +25,8 @@ True + true + portable True bin\Release\net45 obj\Release\net45 diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 03f68a35a6..acd9cc6a66 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -26,6 +26,15 @@ true mimekit.snk true + true + + + + full + + + + portable diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj index c717aa1542..e0be536442 100644 --- a/MimeKit/MimeKitLite.iOS.csproj +++ b/MimeKit/MimeKitLite.iOS.csproj @@ -26,6 +26,8 @@ true + true + portable true bin\Release\Xamarin.iOS obj\Release\Xamarin.iOS diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index e546fca986..18fdec7d2a 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -14,7 +14,7 @@ MimeKit is an Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. It also supports parsing of Unix mbox files. - Unlike any other .NET MIME parser, MimeKit's parser does not need to parse string input nor does it use a TextReader. Instead, it parses raw byte streams, thus allowing it to better support undeclared 8bit text in headers as well as message bodies. It also means that MimeKit's parser is significantly faster than other .NET MIME parsers (more than 25x faster than OpenPOP.NET and over 100x faster than AE.Net.Mail and MailSystem.NET). + Unlike any other .NET MIME parser, MimeKit's parser does not need to parse string input nor does it use a TextReader. Instead, it parses raw byte streams, thus allowing it to better support undeclared 8bit text in headers as well as message bodies. It also means that MimeKit's parser is significantly faster than other .NET MIME parsers. MimeKit's parser also uses a real tokenizer when parsing the headers rather than regex or string.Split() like most other .NET MIME parsers. This means that MimeKit is much more RFC-compliant than any other .NET MIME parser out there, including the commercial implementations. @@ -113,22 +113,31 @@ + + + + + + + + + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 8a346e4c89..b423dc2799 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -14,7 +14,7 @@ MimeKit is an Open Source library for creating and parsing MIME messages. It also supports parsing of Unix mbox files. - Unlike any other .NET MIME parser, MimeKit's parser does not need to parse string input nor does it use a TextReader. Instead, it parses raw byte streams, thus allowing it to better support undeclared 8bit text in headers as well as message bodies. It also means that MimeKit's parser is significantly faster than other .NET MIME parsers (more than 25x faster than OpenPOP.NET and over 100x faster than AE.Net.Mail and MailSystem.NET). + Unlike any other .NET MIME parser, MimeKit's parser does not need to parse string input nor does it use a TextReader. Instead, it parses raw byte streams, thus allowing it to better support undeclared 8bit text in headers as well as message bodies. It also means that MimeKit's parser is significantly faster than other .NET MIME parsers. MimeKit's parser also uses a real tokenizer when parsing the headers rather than regex or string.Split() like most other .NET MIME parsers. This means that MimeKit is much more RFC-compliant than any other .NET MIME parser out there, including the commercial implementations. @@ -81,22 +81,31 @@ + + + + + + + + + From 4c6724f0c495c211d10a893d91d6fcddda381286 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 May 2020 10:28:27 -0400 Subject: [PATCH 531/741] Ported unit tests to NUnit 3.12 --- .nuget/packages.config | 9 ++- UnitTests/ArgumentExceptionTests.cs | 24 ++++---- UnitTests/ContentObjectTests.cs | 7 +-- UnitTests/Cryptography/ArcSignerTests.cs | 42 +++++++------- UnitTests/Cryptography/ArcVerifierTests.cs | 16 +++--- .../DkimPublicKeyLocatorBaseTests.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 24 ++++---- UnitTests/Cryptography/PgpMimeTests.cs | 12 ++-- UnitTests/Cryptography/SecureMimeTests.cs | 4 +- UnitTests/HeaderListTests.cs | 24 ++++---- UnitTests/IO/MemoryBlockStreamTests.cs | 5 +- UnitTests/MimeMessageTests.cs | 32 +++++------ UnitTests/MimeParserTests.cs | 8 +-- UnitTests/MimePartTests.cs | 56 +++++++++---------- UnitTests/MultipartRelatedTests.cs | 3 +- UnitTests/MultipartTests.cs | 27 ++++----- UnitTests/Tnef/TnefTests.cs | 2 +- UnitTests/UnitTests.csproj | 3 +- UnitTests/packages.config | 2 +- appveyor.yml | 2 +- azure-pipelines.yml | 2 +- 21 files changed, 158 insertions(+), 148 deletions(-) diff --git a/.nuget/packages.config b/.nuget/packages.config index eb80f3b1ce..0a5d0a0a18 100644 --- a/.nuget/packages.config +++ b/.nuget/packages.config @@ -1,6 +1,13 @@ - + + + + + + + + diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index 56e6d58c67..b7f0bd0d6f 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -270,30 +270,30 @@ static void AssertStreamArguments (Stream stream) "{0}.Read() does not throw an ArgumentOutOfRangeException when count > buffer length.", stream.GetType ().Name); Assert.AreEqual ("count", ex.ParamName); - ex = Assert.Throws (async () => await stream.ReadAsync (null, 0, 0), + ex = Assert.ThrowsAsync (async () => await stream.ReadAsync (null, 0, 0), "{0}.ReadAsync() does not throw an ArgumentNullException when buffer is null.", stream.GetType ().Name); Assert.AreEqual ("buffer", ex.ParamName); - ex = Assert.Throws (async () => await stream.ReadAsync (buffer, -1, 0), + ex = Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, -1, 0), "{0}.ReadAsync() does not throw an ArgumentOutOfRangeException when offset is -1.", stream.GetType ().Name); Assert.AreEqual ("offset", ex.ParamName); - ex = Assert.Throws (async () => await stream.ReadAsync (buffer, buffer.Length + 1, 0), + ex = Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, buffer.Length + 1, 0), "{0}.ReadAsync() does not throw an ArgumentOutOfRangeException when offset > buffer length.", stream.GetType ().Name); Assert.AreEqual ("offset", ex.ParamName); - ex = Assert.Throws (async () => await stream.ReadAsync (buffer, 0, -1), + ex = Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, 0, -1), "{0}.ReadAsync() does not throw an ArgumentOutOfRangeException when count is -1.", stream.GetType ().Name); Assert.AreEqual ("count", ex.ParamName); - ex = Assert.Throws (async () => await stream.ReadAsync (buffer, 0, buffer.Length + 1), + ex = Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, 0, buffer.Length + 1), "{0}.ReadAsync() does not throw an ArgumentOutOfRangeException when count > buffer length.", stream.GetType ().Name); Assert.AreEqual ("count", ex.ParamName); } else { Assert.Throws (() => stream.Read (buffer, 0, buffer.Length), "{0}.Read() does not throw a NotSupportedException when CanRead is false.", stream.GetType ().Name); - Assert.Throws (async () => await stream.ReadAsync (buffer, 0, buffer.Length), + Assert.ThrowsAsync (async () => await stream.ReadAsync (buffer, 0, buffer.Length), "{0}.ReadAsync() does not throw a NotSupportedException when CanRead is false.", stream.GetType ().Name); } @@ -318,30 +318,30 @@ static void AssertStreamArguments (Stream stream) "{0}.Write() does not throw an ArgumentOutOfRangeException when count > buffer length.", stream.GetType ().Name); Assert.AreEqual ("count", ex.ParamName); - ex = Assert.Throws (async () => await stream.WriteAsync (null, 0, 0), + ex = Assert.ThrowsAsync (async () => await stream.WriteAsync (null, 0, 0), "{0}.WriteAsync() does not throw an ArgumentNullException when buffer is null.", stream.GetType ().Name); Assert.AreEqual ("buffer", ex.ParamName); - ex = Assert.Throws (async () => await stream.WriteAsync (buffer, -1, 0), + ex = Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, -1, 0), "{0}.WriteAsync() does not throw an ArgumentOutOfRangeException when offset is -1.", stream.GetType ().Name); Assert.AreEqual ("offset", ex.ParamName); - ex = Assert.Throws (async () => await stream.WriteAsync (buffer, buffer.Length + 1, 0), + ex = Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, buffer.Length + 1, 0), "{0}.WriteAsync() does not throw an ArgumentOutOfRangeException when offset > buffer length.", stream.GetType ().Name); Assert.AreEqual ("offset", ex.ParamName); - ex = Assert.Throws (async () => await stream.WriteAsync (buffer, 0, -1), + ex = Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, 0, -1), "{0}.WriteAsync() does not throw an ArgumentOutOfRangeException when count is -1.", stream.GetType ().Name); Assert.AreEqual ("count", ex.ParamName); - ex = Assert.Throws (async () => await stream.WriteAsync (buffer, 0, buffer.Length + 1), + ex = Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, 0, buffer.Length + 1), "{0}.WriteAsync() does not throw an ArgumentOutOfRangeException when count > buffer length.", stream.GetType ().Name); Assert.AreEqual ("count", ex.ParamName); } else { Assert.Throws (() => stream.Write (buffer, 0, buffer.Length), "{0}.Write() does not throw a NotSupportedException when CanWrite is false.", stream.GetType ().Name); - Assert.Throws (async () => await stream.WriteAsync (buffer, 0, buffer.Length), + Assert.ThrowsAsync (async () => await stream.WriteAsync (buffer, 0, buffer.Length), "{0}.WriteAsync() does not throw a NotSupportedException when CanWrite is false.", stream.GetType ().Name); } diff --git a/UnitTests/ContentObjectTests.cs b/UnitTests/ContentObjectTests.cs index e38d01b0d4..5fc2cd807a 100644 --- a/UnitTests/ContentObjectTests.cs +++ b/UnitTests/ContentObjectTests.cs @@ -32,7 +32,6 @@ using NUnit.Framework; using MimeKit; -using MimeKit.IO; namespace UnitTests { [TestFixture] @@ -45,9 +44,9 @@ public void TestArgumentExceptions () Assert.Throws (() => new MimeContent (null)); Assert.Throws (() => content.WriteTo (null)); - Assert.Throws (async () => await content.WriteToAsync (null)); + Assert.ThrowsAsync (async () => await content.WriteToAsync (null)); Assert.Throws (() => content.DecodeTo (null)); - Assert.Throws (async () => await content.DecodeToAsync (null)); + Assert.ThrowsAsync (async () => await content.DecodeToAsync (null)); } [Test] @@ -62,7 +61,7 @@ public void TestCancellation () Assert.Throws (() => content.WriteTo (dest, source.Token)); Assert.AreEqual (0, dest.Length); - Assert.Throws (async () => await content.WriteToAsync (dest, source.Token)); + Assert.ThrowsAsync (async () => await content.WriteToAsync (dest, source.Token)); Assert.AreEqual (0, dest.Length); } } diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index acda0f8019..ab2b792bcb 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -154,27 +154,27 @@ public void TestArgumentExceptions () // SignAsync - Assert.Throws (async () => await signer.SignAsync (null, new HeaderId[] { HeaderId.From })); - Assert.Throws (async () => await signer.SignAsync (message, (IList) null)); - Assert.Throws (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); - Assert.Throws (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.Received, HeaderId.From })); - Assert.Throws (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.ContentType })); - Assert.Throws (async () => await signer.SignAsync (null, new string[] { "From" })); - Assert.Throws (async () => await signer.SignAsync (message, (IList) null)); - Assert.Throws (async () => await signer.SignAsync (message, new string[] { "", "From" })); - Assert.Throws (async () => await signer.SignAsync (message, new string[] { null, "From" })); - Assert.Throws (async () => await signer.SignAsync (message, new string[] { "Received", "From" })); - Assert.Throws (async () => await signer.SignAsync (message, new string[] { "Content-Type" })); - - Assert.Throws (async () => await signer.SignAsync (null, message, new HeaderId[] { HeaderId.From })); - Assert.Throws (async () => await signer.SignAsync (options, null, new HeaderId[] { HeaderId.From })); - Assert.Throws (async () => await signer.SignAsync (options, message, new HeaderId[] { HeaderId.From, HeaderId.Unknown })); - Assert.Throws (async () => await signer.SignAsync (options, message, (IList) null)); - - Assert.Throws (async () => await signer.SignAsync (null, message, new string[] { "From" })); - Assert.Throws (async () => await signer.SignAsync (options, null, new string[] { "From" })); - Assert.Throws (async () => await signer.SignAsync (options, message, new string[] { "From", null })); - Assert.Throws (async () => await signer.SignAsync (options, message, (IList) null)); + Assert.ThrowsAsync (async () => await signer.SignAsync (null, new HeaderId[] { HeaderId.From })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, (IList) null)); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.Unknown, HeaderId.From })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.Received, HeaderId.From })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new HeaderId[] { HeaderId.ContentType })); + Assert.ThrowsAsync (async () => await signer.SignAsync (null, new string[] { "From" })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, (IList) null)); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new string[] { "", "From" })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new string[] { null, "From" })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new string[] { "Received", "From" })); + Assert.ThrowsAsync (async () => await signer.SignAsync (message, new string[] { "Content-Type" })); + + Assert.ThrowsAsync (async () => await signer.SignAsync (null, message, new HeaderId[] { HeaderId.From })); + Assert.ThrowsAsync (async () => await signer.SignAsync (options, null, new HeaderId[] { HeaderId.From })); + Assert.ThrowsAsync (async () => await signer.SignAsync (options, message, new HeaderId[] { HeaderId.From, HeaderId.Unknown })); + Assert.ThrowsAsync (async () => await signer.SignAsync (options, message, (IList) null)); + + Assert.ThrowsAsync (async () => await signer.SignAsync (null, message, new string[] { "From" })); + Assert.ThrowsAsync (async () => await signer.SignAsync (options, null, new string[] { "From" })); + Assert.ThrowsAsync (async () => await signer.SignAsync (options, message, new string[] { "From", null })); + Assert.ThrowsAsync (async () => await signer.SignAsync (options, message, (IList) null)); } static void AssertHeadersEqual (string description, HeaderId id, string expected, string actual) diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index 9bdb329c75..5e0166b0e6 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -50,12 +50,12 @@ public void TestArgumentExceptions () Assert.Throws (() => new ArcHeaderValidationResult (null, ArcSignatureValidationResult.Fail)); Assert.Throws (() => verifier.Verify (null)); - Assert.Throws (async () => await verifier.VerifyAsync (null)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (null)); Assert.Throws (() => verifier.Verify (null, message)); Assert.Throws (() => verifier.Verify (FormatOptions.Default, null)); - Assert.Throws (async () => await verifier.VerifyAsync (null, message)); - Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, null)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (null, message)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (FormatOptions.Default, null)); } [Test] @@ -4353,8 +4353,9 @@ This is a modified test message. } [Test] - [Ignore] // Note: apparently if c is missing, assume c=relaxed/relaxed? MimeKit defaults to simple/simple like https://www.ietf.org/rfc/rfc6376.txt says - public void ams_fields_c_na () + [Ignore ("This test assumes that if the c property is missing, it should assume c=relaxed/relaxed. MimeKit defaults to simple/simple like https://www.ietf.org/rfc/rfc6376.txt says.")] + + public void ams_fields_c_na () { const string input = @"MIME-Version: 1.0 Return-Path: @@ -5433,8 +5434,9 @@ This is a test message. } [Test] - [Ignore] // Note: I think this is expected to fail because AMS2's h= includes arc-seal, but MimeKit passes because the signature is valid - public void ams_fields_h_includes_as () + [Ignore ("I think this is expected to fail because AMS2's h= includes arc-seal, but MimeKit passes because the signature is valid")] + + public void ams_fields_h_includes_as () { const string input = @"MIME-Version: 1.0 Return-Path: diff --git a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs index 2f5e87ff99..9b67149c8a 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs @@ -42,7 +42,7 @@ public void TestArgumentExceptions () locator.Add ("dummy._domainkey.example.org", null); Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "dummy")); - Assert.Throws (async () => await locator.LocatePublicKeyAsync ("dns/txt", "example.org", "dummy")); + Assert.ThrowsAsync (async () => await locator.LocatePublicKeyAsync ("dns/txt", "example.org", "dummy")); } [Test] diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 59b8f8cf5f..175d08159c 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -334,12 +334,12 @@ public void TestArgumentExceptions () Assert.Throws (() => verifier.Verify (FormatOptions.Default, message, null)); Assert.Throws (() => verifier.Verify (FormatOptions.Default, message, arcHeader)); - Assert.Throws (async () => await verifier.VerifyAsync (null, dkimHeader)); - Assert.Throws (async () => await verifier.VerifyAsync (message, null)); - Assert.Throws (async () => await verifier.VerifyAsync (null, message, dkimHeader)); - Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, null, dkimHeader)); - Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, message, null)); - Assert.Throws (async () => await verifier.VerifyAsync (FormatOptions.Default, message, arcHeader)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (null, dkimHeader)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (message, null)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (null, message, dkimHeader)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (FormatOptions.Default, null, dkimHeader)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (FormatOptions.Default, message, null)); + Assert.ThrowsAsync (async () => await verifier.VerifyAsync (FormatOptions.Default, message, arcHeader)); Assert.Throws (() => message.Sign (null, new HeaderId[] { HeaderId.From })); Assert.Throws (() => message.Sign (signer, (IList) null)); @@ -370,12 +370,12 @@ public void TestArgumentExceptions () Assert.Throws (() => message.Verify (FormatOptions.Default, dkimHeader, null)); Assert.Throws (() => message.Verify (FormatOptions.Default, arcHeader, locator)); - Assert.Throws (async () => await message.VerifyAsync (null, locator)); - Assert.Throws (async () => await message.VerifyAsync (dkimHeader, null)); - Assert.Throws (async () => await message.VerifyAsync (null, dkimHeader, locator)); - Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, null, locator)); - Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, dkimHeader, null)); - Assert.Throws (async () => await message.VerifyAsync (FormatOptions.Default, arcHeader, locator)); + Assert.ThrowsAsync (async () => await message.VerifyAsync (null, locator)); + Assert.ThrowsAsync (async () => await message.VerifyAsync (dkimHeader, null)); + Assert.ThrowsAsync (async () => await message.VerifyAsync (null, dkimHeader, locator)); + Assert.ThrowsAsync (async () => await message.VerifyAsync (FormatOptions.Default, null, locator)); + Assert.ThrowsAsync (async () => await message.VerifyAsync (FormatOptions.Default, dkimHeader, null)); + Assert.ThrowsAsync (async () => await message.VerifyAsync (FormatOptions.Default, arcHeader, locator)); } [Test] diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 82a385a70c..91f92d1e99 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -1014,8 +1014,8 @@ public void TestArgumentExceptions () Assert.Throws (() => ctx.DecryptTo (stream, null), "DecryptTo"); // DecryptToAsync - Assert.Throws (async () => await ctx.DecryptToAsync (null, stream), "DecryptToAsync"); - Assert.Throws (async () => await ctx.DecryptToAsync (stream, null), "DecryptToAsync"); + Assert.ThrowsAsync (async () => await ctx.DecryptToAsync (null, stream), "DecryptToAsync"); + Assert.ThrowsAsync (async () => await ctx.DecryptToAsync (stream, null), "DecryptToAsync"); // GetDigestAlgorithmName Assert.Throws (() => ctx.GetDigestAlgorithmName (DigestAlgorithm.None), "GetDigestAlgorithmName"); @@ -1063,9 +1063,9 @@ public void TestArgumentExceptions () Assert.Throws (() => ctx.Verify (null, stream), "Verify"); Assert.Throws (() => ctx.Verify (stream, null), "Verify"); - // Verify - Assert.Throws (async () => await ctx.VerifyAsync (null, stream), "VerifyAsync"); - Assert.Throws (async () => await ctx.VerifyAsync (stream, null), "VerifyAsync"); + // VerifyAsync + Assert.ThrowsAsync (async () => await ctx.VerifyAsync (null, stream), "VerifyAsync"); + Assert.ThrowsAsync (async () => await ctx.VerifyAsync (stream, null), "VerifyAsync"); // MultipartEncrypted @@ -1175,7 +1175,7 @@ public void TestArgumentExceptions () Assert.Throws (() => signed.Accept (null)); Assert.Throws (() => signed.Verify (null)); - Assert.Throws (async () => await signed.VerifyAsync (null)); + Assert.ThrowsAsync (async () => await signed.VerifyAsync (null)); } } diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 49bb24436c..13e19c01c2 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -239,8 +239,8 @@ public void TestArgumentExceptions () Assert.Throws (() => ctx.Verify (stream, null)); Assert.Throws (() => ctx.Verify (null, out signatures)); Assert.Throws (() => ctx.Verify (null, out entity)); - Assert.Throws (async () => await ctx.VerifyAsync (null, stream)); - Assert.Throws (async () => await ctx.VerifyAsync (stream, null)); + Assert.ThrowsAsync (async () => await ctx.VerifyAsync (null, stream)); + Assert.ThrowsAsync (async () => await ctx.VerifyAsync (stream, null)); entity = new MimePart { Content = new MimeContent (stream) }; diff --git a/UnitTests/HeaderListTests.cs b/UnitTests/HeaderListTests.cs index ceba98fa88..99142b774e 100644 --- a/UnitTests/HeaderListTests.cs +++ b/UnitTests/HeaderListTests.cs @@ -50,11 +50,11 @@ public void TestArgumentExceptions () Assert.Throws (() => HeaderList.Load (null, stream)); Assert.Throws (() => HeaderList.Load (ParserOptions.Default, (Stream) null)); - Assert.Throws (async () => await HeaderList.LoadAsync (null, "filename.txt")); - Assert.Throws (async () => await HeaderList.LoadAsync (ParserOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (null, "filename.txt")); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (ParserOptions.Default, (string) null)); - Assert.Throws (async () => await HeaderList.LoadAsync (null, stream)); - Assert.Throws (async () => await HeaderList.LoadAsync (ParserOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (null, stream)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (ParserOptions.Default, (Stream) null)); } // Add @@ -138,11 +138,11 @@ public void TestArgumentExceptions () Assert.Throws (() => HeaderList.Load ((string) null)); // LoadAsync - Assert.Throws (async () => await HeaderList.LoadAsync (ParserOptions.Default, (Stream) null)); - Assert.Throws (async () => await HeaderList.LoadAsync (ParserOptions.Default, (string) null)); - Assert.Throws (async () => await HeaderList.LoadAsync (null, stream)); - Assert.Throws (async () => await HeaderList.LoadAsync ((Stream) null)); - Assert.Throws (async () => await HeaderList.LoadAsync ((string) null)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (ParserOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (ParserOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync (null, stream)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync ((Stream) null)); + Assert.ThrowsAsync (async () => await HeaderList.LoadAsync ((string) null)); // WriteTo Assert.Throws (() => list.WriteTo (FormatOptions.Default, null)); @@ -150,9 +150,9 @@ public void TestArgumentExceptions () Assert.Throws (() => list.WriteTo (null)); // WriteToAsync - Assert.Throws (async () => await list.WriteToAsync (FormatOptions.Default, null)); - Assert.Throws (async () => await list.WriteToAsync (null, stream)); - Assert.Throws (async () => await list.WriteToAsync (null)); + Assert.ThrowsAsync (async () => await list.WriteToAsync (FormatOptions.Default, null)); + Assert.ThrowsAsync (async () => await list.WriteToAsync (null, stream)); + Assert.ThrowsAsync (async () => await list.WriteToAsync (null)); } // Indexers diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index cceb48a832..6df4592a7a 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -34,7 +34,7 @@ namespace UnitTests.IO { [TestFixture] - public class MemoryBlockStreamTests + public class MemoryBlockStreamTests : IDisposable { MemoryBlockStream blocks; MemoryStream master; @@ -67,8 +67,7 @@ public MemoryBlockStreamTests () blocks.Seek (0, SeekOrigin.Begin); } - [TestFixtureTearDown] - public void TearDown () + public void Dispose () { blocks.Dispose (); master.Dispose (); diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 9699968a3d..303fb06e85 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -69,16 +69,16 @@ public void TestArgumentExceptions () Assert.Throws (() => MimeMessage.Load (null, "fileName")); Assert.Throws (() => MimeMessage.Load (ParserOptions.Default, (string) null)); - Assert.Throws (async () => await MimeMessage.LoadAsync ((Stream) null)); - Assert.Throws (async () => await MimeMessage.LoadAsync ((Stream) null, true)); - Assert.Throws (async () => await MimeMessage.LoadAsync (null, Stream.Null)); - Assert.Throws (async () => await MimeMessage.LoadAsync (ParserOptions.Default, (Stream) null)); - Assert.Throws (async () => await MimeMessage.LoadAsync (null, Stream.Null, true)); - Assert.Throws (async () => await MimeMessage.LoadAsync (ParserOptions.Default, (Stream) null, true)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync ((Stream) null)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync ((Stream) null, true)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync (null, Stream.Null)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync (ParserOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync (null, Stream.Null, true)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync (ParserOptions.Default, (Stream) null, true)); - Assert.Throws (async () => await MimeMessage.LoadAsync ((string) null)); - Assert.Throws (async () => await MimeMessage.LoadAsync (null, "fileName")); - Assert.Throws (async () => await MimeMessage.LoadAsync (ParserOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync ((string) null)); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync (null, "fileName")); + Assert.ThrowsAsync (async () => await MimeMessage.LoadAsync (ParserOptions.Default, (string) null)); Assert.Throws (() => message.Accept (null)); Assert.Throws (() => message.Prepare (EncodingConstraint.None, 10)); @@ -89,13 +89,13 @@ public void TestArgumentExceptions () Assert.Throws (() => message.WriteTo (FormatOptions.Default, (Stream) null)); Assert.Throws (() => message.WriteTo (null, "fileName")); Assert.Throws (() => message.WriteTo (FormatOptions.Default, (string) null)); - Assert.Throws (async () => await message.WriteToAsync ((string) null)); - Assert.Throws (async () => await message.WriteToAsync ((Stream) null)); - Assert.Throws (async () => await message.WriteToAsync (null, Stream.Null)); - Assert.Throws (async () => await message.WriteToAsync ((Stream) null, true)); - Assert.Throws (async () => await message.WriteToAsync (FormatOptions.Default, (Stream) null)); - Assert.Throws (async () => await message.WriteToAsync (null, "fileName")); - Assert.Throws (async () => await message.WriteToAsync (FormatOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await message.WriteToAsync ((string) null)); + Assert.ThrowsAsync (async () => await message.WriteToAsync ((Stream) null)); + Assert.ThrowsAsync (async () => await message.WriteToAsync (null, Stream.Null)); + Assert.ThrowsAsync (async () => await message.WriteToAsync ((Stream) null, true)); + Assert.ThrowsAsync (async () => await message.WriteToAsync (FormatOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await message.WriteToAsync (null, "fileName")); + Assert.ThrowsAsync (async () => await message.WriteToAsync (FormatOptions.Default, (string) null)); Assert.Throws (() => message.Sign (null)); Assert.Throws (() => message.Sign (null, DigestAlgorithm.Sha1)); Assert.Throws (() => message.Encrypt (null)); diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index ef613a8edb..8e66a5f523 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -273,7 +273,7 @@ public void TestPartialByteOrderMarkEOF () parser.SetStream (stream, MimeFormat.Entity); - Assert.Throws (async () => await parser.ParseMessageAsync (), "ParseMessageAsync"); + Assert.ThrowsAsync (async () => await parser.ParseMessageAsync (), "ParseMessageAsync"); } } @@ -298,7 +298,7 @@ public void TestPartialByteOrderMark () parser.SetStream (stream, MimeFormat.Entity); - Assert.Throws (async () => await parser.ParseMessageAsync (), "ParseMessageAsync"); + Assert.ThrowsAsync (async () => await parser.ParseMessageAsync (), "ParseMessageAsync"); } } @@ -319,7 +319,7 @@ public void TestParsingGarbage () stream.Position = 0; - Assert.Throws (async () => await parser.ParseMessageAsync (), "MboxAsync"); + Assert.ThrowsAsync (async () => await parser.ParseMessageAsync (), "MboxAsync"); stream.Position = 0; @@ -331,7 +331,7 @@ public void TestParsingGarbage () parser.SetStream (stream, MimeFormat.Entity); - Assert.Throws (async () => await parser.ParseMessageAsync (), "EntityAsync"); + Assert.ThrowsAsync (async () => await parser.ParseMessageAsync (), "EntityAsync"); } } diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 605672ac5d..5a4064c576 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -69,22 +69,22 @@ public void TestArgumentExceptions () Assert.Throws (() => MimeEntity.Load (null, "fileName")); Assert.Throws (() => MimeEntity.Load (ParserOptions.Default, (string) null)); - Assert.Throws (async () => await MimeEntity.LoadAsync ((Stream) null)); - Assert.Throws (async () => await MimeEntity.LoadAsync ((Stream) null, true)); - Assert.Throws (async () => await MimeEntity.LoadAsync ((ParserOptions) null, Stream.Null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (ParserOptions.Default, (Stream) null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (null, Stream.Null, true)); - Assert.Throws (async () => await MimeEntity.LoadAsync (ParserOptions.Default, (Stream) null, true)); - - Assert.Throws (async () => await MimeEntity.LoadAsync ((ContentType) null, Stream.Null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (new ContentType ("application", "octet-stream"), null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (null, new ContentType ("application", "octet-stream"), Stream.Null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (ParserOptions.Default, null, Stream.Null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (ParserOptions.Default, new ContentType ("application", "octet-stream"), null)); - - Assert.Throws (async () => await MimeEntity.LoadAsync ((string) null)); - Assert.Throws (async () => await MimeEntity.LoadAsync (null, "fileName")); - Assert.Throws (async () => await MimeEntity.LoadAsync (ParserOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync ((Stream) null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync ((Stream) null, true)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync ((ParserOptions) null, Stream.Null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (ParserOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (null, Stream.Null, true)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (ParserOptions.Default, (Stream) null, true)); + + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync ((ContentType) null, Stream.Null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (new ContentType ("application", "octet-stream"), null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (null, new ContentType ("application", "octet-stream"), Stream.Null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (ParserOptions.Default, null, Stream.Null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (ParserOptions.Default, new ContentType ("application", "octet-stream"), null)); + + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync ((string) null)); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (null, "fileName")); + Assert.ThrowsAsync (async () => await MimeEntity.LoadAsync (ParserOptions.Default, (string) null)); Assert.Throws (() => part.Accept (null)); Assert.Throws (() => part.WriteTo ((string) null)); @@ -101,18 +101,18 @@ public void TestArgumentExceptions () Assert.Throws (() => part.WriteTo (FormatOptions.Default, (string) null, false)); Assert.Throws (() => part.ContentId = "this is some text and stuff"); - Assert.Throws (async () => await part.WriteToAsync ((string) null)); - Assert.Throws (async () => await part.WriteToAsync ((Stream) null)); - Assert.Throws (async () => await part.WriteToAsync ((string) null, false)); - Assert.Throws (async () => await part.WriteToAsync ((Stream) null, false)); - Assert.Throws (async () => await part.WriteToAsync (null, Stream.Null)); - Assert.Throws (async () => await part.WriteToAsync (FormatOptions.Default, (Stream) null)); - Assert.Throws (async () => await part.WriteToAsync (null, "fileName")); - Assert.Throws (async () => await part.WriteToAsync (FormatOptions.Default, (string) null)); - Assert.Throws (async () => await part.WriteToAsync (null, Stream.Null, false)); - Assert.Throws (async () => await part.WriteToAsync (FormatOptions.Default, (Stream) null, false)); - Assert.Throws (async () => await part.WriteToAsync (null, "fileName", false)); - Assert.Throws (async () => await part.WriteToAsync (FormatOptions.Default, (string) null, false)); + Assert.ThrowsAsync (async () => await part.WriteToAsync ((string) null)); + Assert.ThrowsAsync (async () => await part.WriteToAsync ((Stream) null)); + Assert.ThrowsAsync (async () => await part.WriteToAsync ((string) null, false)); + Assert.ThrowsAsync (async () => await part.WriteToAsync ((Stream) null, false)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (null, Stream.Null)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (FormatOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (null, "fileName")); + Assert.ThrowsAsync (async () => await part.WriteToAsync (FormatOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (null, Stream.Null, false)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (FormatOptions.Default, (Stream) null, false)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (null, "fileName", false)); + Assert.ThrowsAsync (async () => await part.WriteToAsync (FormatOptions.Default, (string) null, false)); } [Test] diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index 6d56b19a9c..c67b46e27c 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -77,7 +77,8 @@ public void TestDocumentRoot () Assert.AreEqual (3, related.Count, "Count"); Assert.AreEqual (root, related.Root, "Root"); Assert.AreEqual (root, related[2], "Root should be the 3rd item."); - Assert.IsNotNullOrEmpty (root.ContentId, "Root's Content-Id should not be null."); + Assert.IsNotNull (root.ContentId, "Root's Content-Id should not be null."); + Assert.IsNotEmpty (root.ContentId, "Root's Content-Id should not be empty."); start = "<" + root.ContentId + ">"; diff --git a/UnitTests/MultipartTests.cs b/UnitTests/MultipartTests.cs index 1a1dbcb6fa..d253488eb9 100644 --- a/UnitTests/MultipartTests.cs +++ b/UnitTests/MultipartTests.cs @@ -79,18 +79,18 @@ public void TestArgumentExceptions () Assert.Throws (() => multipart.WriteTo (null, "fileName", false)); Assert.Throws (() => multipart.WriteTo (FormatOptions.Default, (string) null, false)); - Assert.Throws (async () => await multipart.WriteToAsync ((string) null)); - Assert.Throws (async () => await multipart.WriteToAsync ((Stream) null)); - Assert.Throws (async () => await multipart.WriteToAsync ((string) null, false)); - Assert.Throws (async () => await multipart.WriteToAsync ((Stream) null, false)); - Assert.Throws (async () => await multipart.WriteToAsync (null, Stream.Null)); - Assert.Throws (async () => await multipart.WriteToAsync (FormatOptions.Default, (Stream) null)); - Assert.Throws (async () => await multipart.WriteToAsync (null, "fileName")); - Assert.Throws (async () => await multipart.WriteToAsync (FormatOptions.Default, (string) null)); - Assert.Throws (async () => await multipart.WriteToAsync (null, Stream.Null, false)); - Assert.Throws (async () => await multipart.WriteToAsync (FormatOptions.Default, (Stream) null, false)); - Assert.Throws (async () => await multipart.WriteToAsync (null, "fileName", false)); - Assert.Throws (async () => await multipart.WriteToAsync (FormatOptions.Default, (string) null, false)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync ((string) null)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync ((Stream) null)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync ((string) null, false)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync ((Stream) null, false)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (null, Stream.Null)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (FormatOptions.Default, (Stream) null)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (null, "fileName")); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (FormatOptions.Default, (string) null)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (null, Stream.Null, false)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (FormatOptions.Default, (Stream) null, false)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (null, "fileName", false)); + Assert.ThrowsAsync (async () => await multipart.WriteToAsync (FormatOptions.Default, (string) null, false)); } [Test] @@ -98,7 +98,8 @@ public void TestBasicFunctionality () { var multipart = new Multipart (); - Assert.IsNotNullOrEmpty (multipart.Boundary, "Boundary"); + Assert.IsNotNull (multipart.Boundary, "Boundary != null"); + Assert.IsNotEmpty (multipart.Boundary, "Boundary"); Assert.IsFalse (multipart.IsReadOnly, "IsReadOnly"); multipart.Boundary = "__Next_Part_123"; diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index f36f68cc02..3c0f720905 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -970,7 +970,7 @@ public void TestRichTextEml () message = tnef.ConvertToMessage (); - Assert.IsNullOrEmpty (message.Subject, "Subject"); + Assert.IsEmpty (message.Subject, "Subject"); Assert.AreEqual (DateTimeOffset.MinValue, message.Date, "Date"); Assert.AreEqual ("DM5PR21MB0828DA2B8C88048BC03EFFA6CFA20@DM5PR21MB0828.namprd21.prod.outlook.com", message.MessageId, "Message-Id"); diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 63fddb5cbf..72de51614f 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,5 +1,6 @@ + Debug AnyCPU @@ -46,7 +47,7 @@ - ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + ..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 9d1d6686b1..4849472be3 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -2,6 +2,6 @@ - + \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 64e1d1ca27..7989d9bf82 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,6 +28,6 @@ test_script: regsvr32 .\packages\OpenCover.4.6.519\tools\x64\OpenCover.Profiler.dll - .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml + .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0974e3a662..defb794a02 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -36,7 +36,7 @@ steps: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' -- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' +- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' displayName: 'Run Unit Tests' - task: PublishTestResults@2 From 07a45bf9f5a47f2be11fbe9ff9f8647a6bc9d38e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 May 2020 11:25:19 -0400 Subject: [PATCH 532/741] Updated appveyor test scripts --- appveyor.yml | 6 ++++-- azure-pipelines.yml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 7989d9bf82..0656b938c8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,6 +28,8 @@ test_script: regsvr32 .\packages\OpenCover.4.6.519\tools\x64\OpenCover.Profiler.dll - .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml + cd UnitTests\bin\Debug - .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor + ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/noshadow /domain:single UnitTests.dll" -output:opencover.xml + + ..\..\..\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath . --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor diff --git a/azure-pipelines.yml b/azure-pipelines.yml index defb794a02..3800255a4b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -36,7 +36,7 @@ steps: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' -- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/framework:net-4.5 /noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' +- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' displayName: 'Run Unit Tests' - task: PublishTestResults@2 From 825ee265cdfb4d85ff25b50e05384f757602f2d0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 May 2020 11:27:48 -0400 Subject: [PATCH 533/741] Updated appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 0656b938c8..5b6daf4361 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -30,6 +30,6 @@ test_script: cd UnitTests\bin\Debug - ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/noshadow /domain:single UnitTests.dll" -output:opencover.xml + ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"..\..\..\packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/noshadow /domain:single UnitTests.dll" -output:opencover.xml ..\..\..\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath . --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From 6b555d6b38258caf61d15cdb42910e5461879839 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 May 2020 11:30:45 -0400 Subject: [PATCH 534/741] Don't pass /shadow to nunit3-console.exe --- appveyor.yml | 2 +- azure-pipelines.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 5b6daf4361..012e5cac3f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -30,6 +30,6 @@ test_script: cd UnitTests\bin\Debug - ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"..\..\..\packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/noshadow /domain:single UnitTests.dll" -output:opencover.xml + ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"..\..\..\packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests.dll" -output:opencover.xml ..\..\..\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath . --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3800255a4b..71ad54005e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -36,7 +36,7 @@ steps: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' -- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/noshadow /domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' +- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' displayName: 'Run Unit Tests' - task: PublishTestResults@2 From 66c649165e47300667225c8f62990c012977d4c6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 17 May 2020 21:21:42 -0400 Subject: [PATCH 535/741] Try using a different base path for coveralls --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 012e5cac3f..4f4e1f824b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -32,4 +32,4 @@ test_script: ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"..\..\..\packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests.dll" -output:opencover.xml - ..\..\..\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath . --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor + ..\..\..\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath ..\..\.. --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From de959098e69513cd834ad29053caf63adad523d5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 18 May 2020 09:47:01 -0400 Subject: [PATCH 536/741] Add the ability to verify only the digital signature Feature enhancement for issue #569 --- MimeKit/Cryptography/IDigitalSignature.cs | 15 +++++- .../Cryptography/OpenPgpDigitalSignature.cs | 18 +++++++- .../SecureMimeDigitalSignature.cs | 46 +++++++++++++------ .../WindowsSecureMimeDigitalSignature.cs | 18 +++++++- 4 files changed, 79 insertions(+), 18 deletions(-) diff --git a/MimeKit/Cryptography/IDigitalSignature.cs b/MimeKit/Cryptography/IDigitalSignature.cs index 43a5c7cff1..21a489b1bf 100644 --- a/MimeKit/Cryptography/IDigitalSignature.cs +++ b/MimeKit/Cryptography/IDigitalSignature.cs @@ -77,10 +77,23 @@ public interface IDigitalSignature /// /// Verifies the digital signature. /// - /// true if the signature is valid; otherwise false. + /// true if the signature is valid; otherwise, false. /// /// An error verifying the signature has occurred. /// bool Verify (); + + /// + /// Verifies the digital signature. + /// + /// + /// Verifies the digital signature. + /// + /// true if only the signature itself should be verified; otherwise, both the signature and the certificate chain are validated. + /// true if the signature is valid; otherwise, false. + /// + /// An error verifying the signature has occurred. + /// + bool Verify (bool verifySignatureOnly); } } diff --git a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs index 6a58def4c6..52d9dfa170 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs @@ -112,7 +112,7 @@ public DateTime CreationDate { /// /// Verifies the digital signature. /// - /// true if the signature is valid; otherwise false. + /// true if the signature is valid; otherwise, false. /// /// An error verifying the signature has occurred. /// @@ -143,6 +143,22 @@ public bool Verify () } } + /// + /// Verifies the digital signature. + /// + /// + /// Verifies the digital signature. + /// + /// This option is ignored for OpenPGP digital signatures. + /// true if the signature is valid; otherwise, false. + /// + /// An error verifying the signature has occurred. + /// + public bool Verify (bool verifySignatureOnly) + { + return Verify (); + } + #endregion } } diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 90ba6e9ac1..53cc5d021c 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -209,15 +209,28 @@ public DateTime CreationDate { /// /// Verifies the digital signature. /// - /// true if the signature is valid; otherwise false. + /// true if the signature is valid; otherwise, false. /// /// An error verifying the signature has occurred. /// public bool Verify () { - if (valid.HasValue) - return valid.Value; + return Verify (false); + } + /// + /// Verifies the digital signature. + /// + /// + /// Verifies the digital signature. + /// + /// true if only the signature itself should be verified; otherwise, both the signature and the certificate chain are validated. + /// true if the signature is valid; otherwise, false. + /// + /// An error verifying the signature has occurred. + /// + public bool Verify (bool verifySignatureOnly) + { if (vex != null) throw vex; @@ -227,21 +240,24 @@ public bool Verify () throw vex; } - if (ChainException != null) { - var message = string.Format ("Failed to verify digital signature: {0}", ChainException.Message); - vex = new DigitalSignatureVerifyException (message, ChainException); - throw vex; + if (!valid.HasValue) { + try { + var certificate = ((SecureMimeDigitalCertificate) SignerCertificate).Certificate; + valid = SignerInfo.Verify (certificate); + } catch (Exception ex) { + var message = string.Format ("Failed to verify digital signature: {0}", ex.Message); + vex = new DigitalSignatureVerifyException (message, ex); + throw vex; + } } - try { - var certificate = ((SecureMimeDigitalCertificate) SignerCertificate).Certificate; - valid = SignerInfo.Verify (certificate); - return valid.Value; - } catch (Exception ex) { - var message = string.Format ("Failed to verify digital signature: {0}", ex.Message); - vex = new DigitalSignatureVerifyException (message, ex); - throw vex; + if (!verifySignatureOnly && ChainException != null) { + var message = string.Format ("Failed to verify digital signature chain: {0}", ChainException.Message); + + throw new DigitalSignatureVerifyException (message, ChainException); } + + return valid.Value; } #endregion diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs index 5a8b5b92df..b2dd2fa73d 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs @@ -177,12 +177,28 @@ public DateTime CreationDate { /// An error verifying the signature has occurred. /// public bool Verify () + { + return Verify (false); + } + + /// + /// Verifies the digital signature. + /// + /// + /// Verifies the digital signature. + /// + /// true if only the signature itself should be verified; otherwise, both the signature and the certificate chain are validated. + /// true if the signature is valid; otherwise, false. + /// + /// An error verifying the signature has occurred. + /// + public bool Verify (bool verifySignatureOnly) { if (vex != null) throw vex; try { - SignerInfo.CheckSignature (false); + SignerInfo.CheckSignature (verifySignatureOnly); return true; } catch (Exception ex) { var message = string.Format ("Failed to verify digital signature: {0}", ex.Message); From 44ce1ec23887c9c899f10e4676ee277f0622eaf8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 18 May 2020 18:33:12 -0400 Subject: [PATCH 537/741] Treat the Default encoding the same as Binary in MimePart.WriteTo() May be enough to fix issue #569 --- MimeKit/MimePart.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 9d46b20304..bf20608008 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -607,7 +607,10 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); } } - } else if (encoding != ContentEncoding.Binary) { + } else if (encoding == ContentEncoding.Binary || encoding == ContentEncoding.Default) { + // Do not alter binary content. + Content.WriteTo (stream, cancellationToken); + } else { using (var filtered = new FilteredStream (stream)) { // Note: if we are writing the top-level MimePart, make sure it ends with a new-line so that // MimeMessage.WriteTo() *always* ends with a new-line. @@ -615,8 +618,6 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = Content.WriteTo (filtered, cancellationToken); filtered.Flush (cancellationToken); } - } else { - Content.WriteTo (stream, cancellationToken); } } From 2623cc6f8750c3a9039a12b7368790df12f90275 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 19 May 2020 07:32:27 -0400 Subject: [PATCH 538/741] Added unit test for previous commit --- UnitTests/Cryptography/SecureMimeTests.cs | 27 ++++++++++++++++++ .../octet-stream-with-mixed-line-endings.dat | Bin 0 -> 2331 bytes UnitTests/UnitTests.csproj | 1 + 3 files changed, 28 insertions(+) create mode 100644 UnitTests/TestData/smime/octet-stream-with-mixed-line-endings.dat diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 13e19c01c2..28212e5cae 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -1381,6 +1381,33 @@ public virtual void TestSecureMimeImportExport () } } } + + [Test] + public void TestSecureMimeVerifyMixedLineEndings () + { + MimeMessage message; + + using (var file = File.OpenRead (Path.Combine ("..", "..", "TestData", "smime", "octet-stream-with-mixed-line-endings.dat"))) { + var parser = new MimeParser (file, MimeFormat.Default); + message = parser.ParseMessage (); + } + + Assert.IsInstanceOf (message.Body, "THe message body is not multipart/signed as expected."); + + var signed = (MultipartSigned) message.Body; + + using (var ctx = CreateContext ()) { + foreach (var signature in signed.Verify (ctx)) { + try { + bool valid = signature.Verify (true); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + } } [TestFixture] diff --git a/UnitTests/TestData/smime/octet-stream-with-mixed-line-endings.dat b/UnitTests/TestData/smime/octet-stream-with-mixed-line-endings.dat new file mode 100644 index 0000000000000000000000000000000000000000..78df5f4c33aa292a535d21be8116333f33cc95c2 GIT binary patch literal 2331 zcmd5;ZB!Ix6yBMg-Gzl^1r^jphLsNm7v9-r1)=q0QNWN47X>Mf&Mw2U?#FC9vnZy< zt_q~2q8vmm#E;NSO-UgO;Ut=*vpsiia2vLu3{ za2+8L2}MGw^dAr+VeE6+4b6bm(gZD~Xe)u6*gz@SdJ1J;9Hj}0MzgG>37wmQGFyhB zuNVoOB2Xq<(n^H=mtFsK?!g4-5M~{n9gSjB6mm8lkjHlo$xq0?FMMDCqOh1336ln?0HY)aOWfZ z;qZJl<_W}nMsRU=Nn$E)#Lb!5NHCmL3EbV|aXp<)SSgLos>8g%Fjg&ecb#h?%xDU+ zjK=(cFROEN_l_m3v_6adzyz9vo0$(}V*26_C+-j@FwRGWDKHE~U@{p1Sh|l$28M|L zhZG%^0Lv3{()wk|!&p*^&x4odV z)C;*6khQgMZE)$x8GEk=ewR_1+?zD6Xi0Q(N9$O@ci(IwYQ!6TJ8LEfsarjGDyqTS zG)Yl#DF2Il;>Nq=gYL7}<;BA{aBZ{Y(HV2xk`KT;_9vZqq%%~={GZ&uQyVGT&@p$* zwiRvnH$HSeQqJV~rLF|mB(E%vdGo;fR`No!MgULbcd3ZNKFnhQ_1O?;xE}?vg#}jbjffY2cLO>`B z^h5%H#6C0?VwpA@H|vP$B*Pk-Ax)T;Gyy*rJRTVZyz~CPPS4Yp={|^4vGi_Z`?3V* zm8QnWAH`jcYAUY`UUbksZCYn##>9P(riPzA|6_)i$fPT8SvvFEuM)nQ0N1KQ_N*C$ z2i1A`2y;G)8^Qbd;OLKHZC)SQ=N&aIkASs-t@Jr(3ryb4`y2-@h_V`EZ35L zE!|a4Nm;e;`M%@9Ylrn;Dl0v{ffpZnN)@rIt3FHEKI3%GOl{h`EvIj(XLVG5Uve9( zSkNOaOaDqW$!q78Iq9mBx_WMNtrE{)&~yFj#ip1maVIG6lk+qD4}?_4<#Sa%^2hDX zB?VVf4mvEEJEc<(AFJv!ExN03;Pi#=j+e|U2-$koUvAtqx4!lLo}V-~L`yLT>;MjU z6*CKgz36{1CI*M>;9#z>UjU;9My@Lta~lu@5EwfkxbiSDJNQ6^OoquLq9Ww!VEmvJ z!59LKNm-pBt<4P(HN+u3*tuy{>)V{bI0zDBi$Dg$zNdsDxCj(7RDgky@AB*t;R=Aq zz#4{OP98Je{;_Sl%squv>guMeaIN;tXlPU#L2QDbU#dPk&koI)a>& z3WJu5 + From 17d6eebbf52448a53385733ebe785c0691feee1f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 19 May 2020 07:33:21 -0400 Subject: [PATCH 539/741] Canonicalize text/* parts even if Content-Transfer-Encoding is unspecified Leave all other types untouched. --- MimeKit/MimePart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index bf20608008..7ed51d22ae 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -607,7 +607,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); } } - } else if (encoding == ContentEncoding.Binary || encoding == ContentEncoding.Default) { + } else if (encoding == ContentEncoding.Binary || (encoding == ContentEncoding.Default && !ContentType.IsMimeType("text", "*"))) { // Do not alter binary content. Content.WriteTo (stream, cancellationToken); } else { From 3815b24448ab0a281d3f4aac41be54f84bc84753 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 19 May 2020 09:06:27 -0400 Subject: [PATCH 540/741] bumped version to 2.7.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +++--- ReleaseNotes.md | 15 +++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 17 +++++++---------- nuget/MimeKitLite.nuspec | 14 ++++++-------- .../DkimVerifier/DkimVerifier.csproj | 4 ++-- .../DkimVerifier/DkimVerifier/packages.config | 2 +- .../MessageReader.Android.csproj | 6 +++--- .../MessageReader.Android/packages.config | 4 ++-- .../MessageReader.iOS/MessageReader.iOS.csproj | 6 +++--- .../MessageReader.iOS/packages.config | 4 ++-- .../MessageReader/MessageReader.csproj | 4 ++-- .../MessageReader/MessageReader/packages.config | 2 +- 16 files changed, 51 insertions(+), 41 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index d995440369..350567a1f4 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.6.0 + 2.7.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index acd9cc6a66..2dedf212fb 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.6.0 + 2.7.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 811e0bcff2..c7f3798c6f 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.6.0.0")] -[assembly: AssemblyFileVersion ("2.6.0.0")] -[assembly: AssemblyVersion ("2.6.0.0")] +[assembly: AssemblyInformationalVersion ("2.7.0.0")] +[assembly: AssemblyFileVersion ("2.7.0.0")] +[assembly: AssemblyVersion ("2.7.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 696fd68cc0..490d2fe065 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,20 @@ # Release Notes +### MimeKit 2.7.0 (2020-05-19) + +* Fixed InternetAddressList.Insert() to allow inserting at the end of the list. + (issue [#559](https://github.com/jstedfast/MimeKit/issues/559)) +* Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth + allowed by the parser. +* Added logic to handle multipart children without any headers or content. +* Added a new Verify(bool verifySignatureOnly) method to IDigitalSignature for + developers who just want to be able to verify the signature without worrying + about the certificate chain. +* Fixed MimePart.WriteTo() to avoid canonicalizing line endings for MimeParts that + do not define a Content-Transfer-Encoding. + (issue [#569](https://github.com/jstedfast/MimeKit/issues/569)) +* NuGet packages now include the portable pdb's. + ### MimeKit 2.6.0 (2020-04-03) * Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of diff --git a/appveyor.yml b/appveyor.yml index 4f4e1f824b..7fd7d08b95 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.6.0.{build} +version: 2.7.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 71ad54005e..75ff2e7d7d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.6.0$(Rev:.r) +name: 2.7.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 18fdec7d2a..7299789693 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.6.0 + 2.7.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,15 +26,12 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of MailboxAddress.TryParse() so that it is more lenient in what it accepts. (issue #542) -* Added an HtmlTokenizer.IgnoreTruncatedTags property which is useful when working with truncated HTML. -* Optimized the heck out of HtmlEntityDecoder. -* Added a TextPart.Format property for a quick way to determine the type of text it contains. -* Added text/plain and text/html preview/snippet generators (PlainTextPreviewer and HtmlTextPreviewer, respectively). This is part of a larger improvement to MailKit's text preview feature for IMAP. (MailKit issue #1001) -* Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers. -* Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() to allow developers to override the default formatting behavior by either subclassing Header or by calling header.SetRawValue(). (issue #546) -* Switched MimeKit for Android and iOS over to using Portable.BouncyCastle. -* Added MimeTypes.Register() to allow developers to register their own mime-type mappings to file extensions. +* Fixed InternetAddressList.Insert() to allow inserting at the end of the list. (issue #559) +* Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth allowed by the parser. +* Added logic to handle multipart children without any headers or content. +* Added a new Verify(bool verifySignatureOnly) method to IDigitalSignature for developers who just want to be able to verify the signature without worrying about the certificate chain. +* Fixed MimePart.WriteTo() to avoid canonicalizing line endings for MimeParts that do not define a Content-Transfer-Encoding. (issue #569) +* NuGet packages now include the portable pdb's. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index b423dc2799..019d85c9fb 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.6.0 + 2.7.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,13 +26,11 @@ An Open Source library for creating and parsing MIME messages. -* Fixed the MimeEntity.ContentId setter to use ParseUtils.TryParseMsgId() instead of MailboxAddress.TryParse() so that it is more lenient in what it accepts. (issue #542) -* Added an HtmlTokenizer.IgnoreTruncatedTags property which is useful when working with truncated HTML. -* Optimized the heck out of HtmlEntityDecoder. -* Added a TextPart.Format property for a quick way to determine the type of text it contains. -* Added text/plain and text/html preview/snippet generators (PlainTextPreviewer and HtmlTextPreviewer, respectively). This is part of a larger improvement to MailKit's text preview feature for IMAP. (MailKit issue #1001) -* Fixed SqlCertificateDatabase to accept null SubjectKeyIdentifiers. -* Changed Header.FormatRawValue() to be protected virtual and added Header.SetRawValue() to allow developers to override the default formatting behavior by either subclassing Header or by calling header.SetRawValue(). (issue #546) +* Fixed InternetAddressList.Insert() to allow inserting at the end of the list. (issue #559) +* Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth allowed by the parser. +* Added logic to handle multipart children without any headers or content. +* Fixed MimePart.WriteTo() to avoid canonicalizing line endings for MimeParts that do not define a Content-Transfer-Encoding. (issue #569) +* NuGet packages now include the portable pdb's. Xamarin Inc. en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 6d0cea09a7..0140d8b355 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -32,8 +32,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.6.0\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.7.0\lib\net45\MimeKit.dll diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config index e4aeac0710..03dd42a812 100644 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ b/samples/DkimVerifier/DkimVerifier/packages.config @@ -2,5 +2,5 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 931d96b565..aee3dc6352 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -58,8 +58,8 @@ ..\packages\Portable.BouncyCastle.1.8.5\lib\netstandard2.0\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.6.0\lib\monoandroid\MimeKit.dll + + ..\packages\MimeKit.2.7.0\lib\monoandroid\MimeKit.dll @@ -93,4 +93,4 @@ xamarin3.msg - \ No newline at end of file + diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config index beef5187c7..3e048669b3 100644 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ b/samples/MessageReader.Android/MessageReader.Android/packages.config @@ -1,5 +1,5 @@  - + - \ No newline at end of file + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 6a5fae4ea0..95842ab7fd 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -70,8 +70,8 @@ ..\packages\Portable.BouncyCastle.1.8.5\lib\netstandard2.0\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.6.0\lib\xamarinios\MimeKit.dll + + ..\packages\MimeKit.2.7.0\lib\xamarinios\MimeKit.dll @@ -107,4 +107,4 @@ xamarin3.msg - \ No newline at end of file + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config index a575eb8f60..d22a73d2b5 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ b/samples/MessageReader.iOS/MessageReader.iOS/packages.config @@ -1,5 +1,5 @@  - + - \ No newline at end of file + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 9c7e5307bf..392aa0eca3 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -35,8 +35,8 @@ ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - ..\packages\MimeKit.2.6.0\lib\net45\MimeKit.dll + + ..\packages\MimeKit.2.7.0\lib\net45\MimeKit.dll diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config index f197399d5c..3dd425bf8c 100644 --- a/samples/MessageReader/MessageReader/packages.config +++ b/samples/MessageReader/MessageReader/packages.config @@ -1,5 +1,5 @@  - + From 69009824b31a0a2f51f8e4a4babb4f46311acde9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 19 May 2020 09:16:13 -0400 Subject: [PATCH 541/741] xml documentation fixes --- MimeKit/Cryptography/DigitalSignatureVerifyException.cs | 2 +- MimeKit/Header.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs index 50648f8e54..37dcd173c2 100644 --- a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs +++ b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs @@ -32,7 +32,7 @@ namespace MimeKit.Cryptography { /// - /// An exception that is thrown when an error occurrs in . + /// An exception that is thrown when an error occurrs in . /// /// /// For more information about the error condition, check the property. diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index a271b8fba4..8667d1f8fa 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -1027,7 +1027,7 @@ static byte[] EncodeUnstructuredHeader (ParserOptions options, FormatOptions for /// /// This method will called by the SetValue /// methods and may also be conditionally called when the header is being written to a - /// . + /// . /// /// The formatting options. /// The character encoding to be used. From a569f992e503fbf09fbf5954e612c5cd1953c452 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 May 2020 12:04:59 -0400 Subject: [PATCH 542/741] Fixed unit tests to load data files from the right place in Visual Studio --- MimeKit/MimePart.cs | 6 +- UnitTests/AttachmentCollectionTests.cs | 14 ++--- .../Cryptography/ApplicationPkcs7MimeTests.cs | 2 +- UnitTests/Cryptography/ArcSignerTests.cs | 8 +-- .../Cryptography/CertificateExtensionTests.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 6 +- UnitTests/Cryptography/CmsSignerTests.cs | 12 ++-- .../DefaultSecureMimeContextTests.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 34 +++++------ UnitTests/Cryptography/PgpMimeTests.cs | 8 +-- .../SecureMimeDigitalCertificateTests.cs | 4 +- UnitTests/Cryptography/SecureMimeTests.cs | 26 ++++----- .../SqliteCertificateDatabaseTests.cs | 2 +- .../Cryptography/X509CertificateChainTests.cs | 2 +- .../X509CertificateRecordTests.cs | 4 +- .../Cryptography/X509CertificateStoreTests.cs | 2 +- UnitTests/Encodings/EncoderTests.cs | 39 ++++++------- UnitTests/Encodings/YEncodingTests.cs | 12 ++-- UnitTests/IO/FilteredStreamTests.cs | 18 +++--- UnitTests/MessageDeliveryStatusTests.cs | 2 +- .../MessageDispositionNotificiationTests.cs | 2 +- UnitTests/MessagePartialTests.cs | 16 +++--- UnitTests/MimeMessageTests.cs | 18 +++--- UnitTests/MimeParserTests.cs | 4 +- UnitTests/MimePartTests.cs | 4 +- UnitTests/MimeVisitorTests.cs | 2 +- UnitTests/MultipartRelatedTests.cs | 2 +- UnitTests/TestHelper.cs | 57 +++++++++++++++++++ UnitTests/Text/HtmlEntityDecoderTests.cs | 2 +- UnitTests/Text/HtmlTextPreviewerTests.cs | 12 ++-- UnitTests/Text/HtmlToHtmlTests.cs | 4 +- UnitTests/Text/HtmlTokenizerTests.cs | 18 +++--- UnitTests/Text/PlainTextPreviewerTests.cs | 2 +- UnitTests/Text/TextPreviewerTests.cs | 8 +-- UnitTests/Tnef/TnefReaderStreamTests.cs | 4 +- UnitTests/Tnef/TnefReaderTests.cs | 6 +- UnitTests/Tnef/TnefTests.cs | 48 ++++++++-------- UnitTests/UnitTests.csproj | 19 +++++-- UnitTests/packages.config | 3 +- 39 files changed, 257 insertions(+), 179 deletions(-) create mode 100644 UnitTests/TestHelper.cs diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 7ed51d22ae..968675e75c 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -676,7 +676,9 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = await stream.WriteAsync (buffer, 0, buffer.Length, cancellationToken).ConfigureAwait (false); await stream.WriteAsync (options.NewLineBytes, 0, options.NewLineBytes.Length, cancellationToken).ConfigureAwait (false); } - } else if (encoding != ContentEncoding.Binary) { + } else if (encoding == ContentEncoding.Binary || (encoding == ContentEncoding.Default && !ContentType.IsMimeType("text", "*"))) { + await Content.WriteToAsync (stream, cancellationToken).ConfigureAwait (false); + } else { using (var filtered = new FilteredStream (stream)) { // Note: if we are writing the top-level MimePart, make sure it ends with a new-line so that // MimeMessage.WriteTo() *always* ends with a new-line. @@ -684,8 +686,6 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = await Content.WriteToAsync (filtered, cancellationToken).ConfigureAwait (false); await filtered.FlushAsync (cancellationToken).ConfigureAwait (false); } - } else { - await Content.WriteToAsync (stream, cancellationToken).ConfigureAwait (false); } } diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index bbc98e1b03..f7869de89f 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -91,7 +91,7 @@ public void TestArgumentExceptions () [Test] public void TestAddFileName () { - var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var attachments = new AttachmentCollection (); MimePart attachment; @@ -111,7 +111,7 @@ public void TestAddFileName () [Test] public void TestAddFileNameContentType () { - var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var contentType = new ContentType ("image", "gif"); var attachments = new AttachmentCollection (); MimePart attachment; @@ -132,7 +132,7 @@ public void TestAddFileNameContentType () [Test] public void TestAddData () { - var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var attachments = new AttachmentCollection (); MimePart attachment; @@ -152,7 +152,7 @@ public void TestAddData () [Test] public void TestAddDataContentType () { - var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var contentType = new ContentType ("image", "gif"); var attachments = new AttachmentCollection (); MimePart attachment; @@ -173,7 +173,7 @@ public void TestAddDataContentType () [Test] public void TestAddStream () { - var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var attachments = new AttachmentCollection (); MimePart attachment; @@ -195,7 +195,7 @@ public void TestAddStream () [Test] public void TestAddStreamContentType () { - var fileName = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var contentType = new ContentType ("image", "gif"); var attachments = new AttachmentCollection (); MimePart attachment; @@ -218,7 +218,7 @@ public void TestAddStreamContentType () [Test] public void TestAddEmailMessage () { - var fileName = Path.Combine ("..", "..", "TestData", "messages", "body.1.txt"); + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.1.txt"); var attachments = new AttachmentCollection (); MimeEntity attachment; diff --git a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs index b807d4441f..509a605383 100644 --- a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs +++ b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs @@ -42,7 +42,7 @@ public class ApplicationPkcs7MimeTests [Test] public void TestArgumentExceptions () { - var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"); var entity = new TextPart ("plain") { Text = "This is some text..." }; var mailbox = new MailboxAddress ("MimeKit UnitTests", "mimekit@example.com"); var recipients = new CmsRecipientCollection (); diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index ab2b792bcb..4cbcaa35ed 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -46,14 +46,14 @@ public class ArcSignerTests public void TestArcSignerCtors () { Assert.DoesNotThrow (() => { - var signer = new DummyArcSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { + var signer = new DummyArcSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha256 }; }); AsymmetricCipherKeyPair keys; - using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + using (var stream = new StreamReader (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"))) { var reader = new PemReader (stream); keys = reader.ReadObject () as AsymmetricCipherKeyPair; @@ -69,7 +69,7 @@ public void TestArcSignerCtors () [Test] public void TestArcSignerDefaults () { - var path = Path.Combine ("..", "..", "TestData", "dkim", "example.pem"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"); AsymmetricCipherKeyPair keys; ArcSigner signer; @@ -94,7 +94,7 @@ public void TestArcSignerDefaults () [Test] public void TestArgumentExceptions () { - var path = Path.Combine ("..", "..", "TestData", "dkim", "example.pem"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"); var locator = new DkimPublicKeyLocator (); var verifier = new DkimVerifier (locator); var dkimHeader = new Header (HeaderId.DkimSignature, "value"); diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs index c0b286d936..35909f07c0 100644 --- a/UnitTests/Cryptography/CertificateExtensionTests.cs +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -76,7 +76,7 @@ X509KeyUsageFlags GetX509Certificate2KeyUsageFlags (X509Certificate2 certificate public void TestCertificateConversion () { var fileNames = new string[] { "StartComCertificationAuthority.crt", "StartComClass1PrimaryIntermediateClientCA.crt" }; - var dataDir = Path.Combine ("..", "..", "TestData", "smime"); + var dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "smime"); var parser = new X509CertificateParser (); foreach (var fileName in fileNames) { diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 0c61fdd96d..2146e37c80 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -72,7 +72,7 @@ static void AssertDefaultValues (CmsRecipient recipient, X509Certificate certifi [Test] public void TestDefaultValues () { - var path = Path.Combine ("..", "..", "TestData", "smime", "StartComCertificationAuthority.crt"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "StartComCertificationAuthority.crt"); var recipient = new CmsRecipient (path); var certificate = recipient.Certificate; @@ -95,7 +95,7 @@ public void TestDefaultValues () [Test] public void TestRecipientIdentifierType () { - var path = Path.Combine ("..", "..", "TestData", "smime", "StartComCertificationAuthority.crt"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "StartComCertificationAuthority.crt"); var recipient = new CmsRecipient (path, SubjectIdentifierType.SubjectKeyIdentifier); var certificate = recipient.Certificate; @@ -115,7 +115,7 @@ public void TestRecipientIdentifierType () [Test] public void TestCollectionAddRemove () { - var path = Path.Combine ("..", "..", "TestData", "smime", "StartComCertificationAuthority.crt"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "StartComCertificationAuthority.crt"); var recipients = new CmsRecipientCollection (); var recipient = new CmsRecipient (path); var array = new CmsRecipient[1]; diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index 4efd93231d..84e6eaa170 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -48,12 +48,12 @@ public class CmsSignerTests [Test] public void TestArgumentExceptions () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"), "no.secret"); var certificate = new X509Certificate2 (signer.Certificate.GetEncoded ()); var chain = new[] { DotNetUtilities.FromX509Certificate (certificate) }; AsymmetricCipherKeyPair keyPair; - using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + using (var stream = new StreamReader (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"))) { var reader = new PemReader (stream); keyPair = reader.ReadObject () as AsymmetricCipherKeyPair; @@ -118,7 +118,7 @@ static void LoadPkcs12 (string path, string password, out List [Test] public void TestConstructors () { - var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"); List certificates; AsymmetricKeyParameter key; var password = "no.secret"; @@ -161,7 +161,7 @@ public void TestConstructors () [Test] public void TestDefaultValues () { - var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"); List certificates; AsymmetricKeyParameter key; var password = "no.secret"; @@ -199,7 +199,7 @@ public void TestDefaultValues () [Test] public void TestSignerIdentifierType () { - var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"); List certificates; AsymmetricKeyParameter key; var password = "no.secret"; @@ -237,7 +237,7 @@ public void TestSignerIdentifierType () [Test] public void TestRsaSignaturePadding () { - var path = Path.Combine ("..", "..", "TestData", "smime", "smime.p12"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"); var signer = new CmsSigner (path, "no.secret"); Assert.AreEqual (RsaSignaturePaddingScheme.Pkcs1, signer.RsaSignaturePaddingScheme, "Default RsaSignaturePaddingScheme"); diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index d2c0061d36..f3581fa536 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -90,7 +90,7 @@ public void TestArgumentExceptions () public void TestImportCertificates () { var database = new SqliteCertificateDatabase ("smime.db", "no.secret"); - var dataDir = Path.Combine ("..", "..", "TestData", "smime"); + var dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "smime"); var certificates = new List (); using (var ctx = new DefaultSecureMimeContext (database)) { diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 175d08159c..4156ae6324 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -69,14 +69,14 @@ public DummyPublicKeyLocator (AsymmetricKeyParameter publicKey) static DkimTests () { - using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + using (var stream = new StreamReader (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"))) { var reader = new PemReader (stream); DkimKeys = reader.ReadObject () as AsymmetricCipherKeyPair; } // Note: you can use http://dkimcore.org/tools/dkimrecordcheck.html to get public keys manually - using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "gmail.pub"))) { + using (var stream = new StreamReader (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "gmail.pub"))) { var reader = new PemReader (stream); GMailDkimPublicKey = reader.ReadObject () as AsymmetricKeyParameter; @@ -88,7 +88,7 @@ static DkimTests () static DkimSigner CreateSigner (DkimSignatureAlgorithm algorithm, DkimCanonicalizationAlgorithm headerAlgorithm, DkimCanonicalizationAlgorithm bodyAlgorithm) { - return new DkimSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { + return new DkimSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { BodyCanonicalizationAlgorithm = bodyAlgorithm, HeaderCanonicalizationAlgorithm = headerAlgorithm, SignatureAlgorithm = algorithm, @@ -101,7 +101,7 @@ static DkimSigner CreateSigner (DkimSignatureAlgorithm algorithm, DkimCanonicali public void TestDkimSignerCtors () { Assert.DoesNotThrow (() => { - var signer = new DkimSigner (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { + var signer = new DkimSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"), "example.com", "1433868189.example") { SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha256, AgentOrUserIdentifier = "@eng.example.com", QueryMethod = "dns/txt" @@ -120,7 +120,7 @@ public void TestDkimSignerCtors () [Test] public void TestDkimSignerDefaults () { - var path = Path.Combine ("..", "..", "TestData", "dkim", "example.pem"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"); DkimSigner signer; signer = new DkimSigner (DkimKeys.Private, "example.com", "1433868189.example"); @@ -292,7 +292,7 @@ public void TestArgumentExceptions () Assert.Throws (() => new DkimSigner ("fileName", "domain", null)); Assert.Throws (() => new DkimSigner (string.Empty, "domain", "selector")); Assert.Throws (() => new DkimSigner ((Stream) null, "domain", "selector")); - using (var stream = File.OpenRead (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + using (var stream = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"))) { Assert.Throws (() => new DkimSigner (stream, null, "selector")); Assert.Throws (() => new DkimSigner (stream, "domain", null)); @@ -381,7 +381,7 @@ public void TestArgumentExceptions () [Test] public void TestFormatExceptions () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "gmail.msg")); var verifier = new DkimVerifier (new DummyPublicKeyLocator (DkimKeys.Public)); var index = message.Headers.IndexOf (HeaderId.DkimSignature); var dkim = message.Headers[index]; @@ -522,7 +522,7 @@ public void TestUnicodeRelaxedBodyRsaSha256 () [Test] public void TestVerifyGoogleMailDkimSignature () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "gmail.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); var verifier = new DkimVerifier (locator); @@ -533,7 +533,7 @@ public void TestVerifyGoogleMailDkimSignature () [Test] public async Task TestVerifyGoogleMailDkimSignatureAsync () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "gmail.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "gmail.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); var verifier = new DkimVerifier (locator); @@ -544,7 +544,7 @@ public async Task TestVerifyGoogleMailDkimSignatureAsync () [Test] public void TestVerifyGoogleMultipartRelatedDkimSignature () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "related.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "related.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); var verifier = new DkimVerifier (locator); @@ -555,7 +555,7 @@ public void TestVerifyGoogleMultipartRelatedDkimSignature () [Test] public async Task TestVerifyGoogleMultipartRelatedDkimSignatureAsync () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "related.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "related.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); var verifier = new DkimVerifier (locator); @@ -566,7 +566,7 @@ public async Task TestVerifyGoogleMultipartRelatedDkimSignatureAsync () [Test] public void TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignature () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "multipart-no-end-boundary.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "multipart-no-end-boundary.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); var verifier = new DkimVerifier (locator); @@ -577,7 +577,7 @@ public void TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignature () [Test] public async Task TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "multipart-no-end-boundary.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "multipart-no-end-boundary.msg")); int index = message.Headers.IndexOf (HeaderId.DkimSignature); var locator = new DummyPublicKeyLocator (GMailDkimPublicKey); var verifier = new DkimVerifier (locator); @@ -588,7 +588,7 @@ public async Task TestVerifyGoogleMultipartWithoutEndBoundaryDkimSignatureAsync [Test] public void TestSignRfc8463Example () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "rfc8463-example.msg")); var signer = new DkimSigner (Ed25519PrivateKey, "football.example.com", "brisbane", DkimSignatureAlgorithm.Ed25519Sha256) { HeaderCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, BodyCanonicalizationAlgorithm = DkimCanonicalizationAlgorithm.Relaxed, @@ -612,7 +612,7 @@ public void TestSignRfc8463Example () [Test] public void TestVerifyRfc8463Example () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "rfc8463-example.msg")); var locator = new DkimPublicKeyLocator (); var verifier = new DkimVerifier (locator); int index; @@ -632,7 +632,7 @@ public void TestVerifyRfc8463Example () [Test] public async Task TestVerifyRfc8463ExampleAsync () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "dkim", "rfc8463-example.msg")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "rfc8463-example.msg")); var locator = new DkimPublicKeyLocator (); var verifier = new DkimVerifier (locator); int index; @@ -675,7 +675,7 @@ static void TestDkimSignVerify (MimeMessage message, DkimSignatureAlgorithm sign //[Ignore] public void TestDkimSignVerifyJwzMbox () { - using (var stream = File.OpenRead ("../../TestData/mbox/jwz.mbox.txt")) { + using (var stream = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "mbox", "jwz.mbox.txt"))) { var parser = new MimeParser (stream, MimeFormat.Mbox); int i = 0; diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 91f92d1e99..dc82a5827a 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -48,7 +48,7 @@ public class PgpMimeTests static PgpMimeTests () { Environment.SetEnvironmentVariable ("GNUPGHOME", Path.GetFullPath (".")); - var dataDir = Path.Combine ("..", "..", "TestData", "openpgp"); + var dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "openpgp"); CryptographyContext.Register (typeof (DummyOpenPgpContext)); @@ -780,7 +780,7 @@ public void TestMultipartEncryptedSignAndEncryptALgorithmUsingKeys () [Test] public void TestAutoKeyRetrieve () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "openpgp", "[Announce] GnuPG 2.1.20 released.eml")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "openpgp", "[Announce] GnuPG 2.1.20 released.eml")); var multipart = (MultipartSigned) ((Multipart) message.Body)[0]; Assert.AreEqual (2, multipart.Count, "The multipart/signed has an unexpected number of children."); @@ -1204,14 +1204,14 @@ public void TestOpenPgpDetectionFilter () { var filter = new OpenPgpDetectionFilter (); - PumpDataThroughFilter (filter, Path.Combine ("..", "..", "TestData", "openpgp", "mimekit.gpg.pub"), true); + PumpDataThroughFilter (filter, Path.Combine (TestHelper.ProjectDir, "TestData", "openpgp", "mimekit.gpg.pub"), true); Assert.AreEqual (OpenPgpDataType.PublicKey, filter.DataType); Assert.AreEqual (0, filter.BeginOffset); Assert.AreEqual (1754, filter.EndOffset); filter.Reset (); - PumpDataThroughFilter (filter, Path.Combine ("..", "..", "TestData", "openpgp", "mimekit.gpg.sec"), true); + PumpDataThroughFilter (filter, Path.Combine (TestHelper.ProjectDir, "TestData", "openpgp", "mimekit.gpg.sec"), true); Assert.AreEqual (OpenPgpDataType.PrivateKey, filter.DataType); Assert.AreEqual (0, filter.BeginOffset); Assert.AreEqual (3650, filter.EndOffset); diff --git a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs index 24dc305715..94e7958121 100644 --- a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs +++ b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs @@ -43,7 +43,7 @@ public class SecureMimeDigitalCertificateTests [Test] public void TestArgumentExceptions () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"), "no.secret"); Assert.Throws (() => new SecureMimeDigitalCertificate (null)); Assert.Throws (() => new SecureMimeDigitalSignature (null, signer.Certificate)); @@ -54,7 +54,7 @@ public void TestArgumentExceptions () static X509Certificate GetCertificate (string fileName) { - using (var stream = File.OpenText (Path.Combine ("..", "..", "TestData", "smime", fileName))) { + using (var stream = File.OpenText (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", fileName))) { var reader = new PemReader (stream); object item; diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index 28212e5cae..dc8451b127 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -70,7 +70,7 @@ protected SecureMimeTestsBase () return; using (var ctx = CreateContext ()) { - var dataDir = Path.Combine ("..", "..", "TestData", "smime"); + var dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "smime"); string path; if (ctx is TemporarySecureMimeContext) @@ -186,7 +186,7 @@ public void TestArgumentExceptions () Assert.Throws (() => SecureMimeContext.GetDigestOid (DigestAlgorithm.Tiger192)); using (var ctx = CreateContext ()) { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.pfx"), "no.secret"); var mailbox = new MailboxAddress ("Unit Tests", "example@mimekit.net"); var recipients = new CmsRecipientCollection (); DigitalSignatureCollection signatures; @@ -486,7 +486,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContext () [Test] public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret", SubjectIdentifierType.SubjectKeyIdentifier); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.pfx"), "no.secret", SubjectIdentifierType.SubjectKeyIdentifier); var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; var signed = ApplicationPkcs7Mime.Sign (signer, cleartext); @@ -528,7 +528,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithCmsSigner () [Test] public virtual void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret", SubjectIdentifierType.SubjectKeyIdentifier); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.pfx"), "no.secret", SubjectIdentifierType.SubjectKeyIdentifier); var cleartext = new TextPart ("plain") { Text = "This is some text that we'll end up signing..." }; using (var ctx = CreateContext ()) { @@ -561,7 +561,7 @@ public virtual void TestSecureMimeEncapsulatedSigningWithContextAndCmsSigner () [Test] public virtual void TestSecureMimeSigningWithCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.pfx"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; var multipart = MultipartSigned.Create (signer, body); @@ -610,7 +610,7 @@ public virtual void TestSecureMimeSigningWithCmsSigner () [Test] public virtual void TestSecureMimeSigningWithContextAndCmsSigner () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret"); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.pfx"), "no.secret"); var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; using (var ctx = CreateContext ()) { @@ -676,7 +676,7 @@ public virtual void TestSecureMimeSigningWithContextAndCmsSigner () [Test] public virtual void TestSecureMimeSigningWithRsaSsaPss () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.pfx"), "no.secret") { + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.pfx"), "no.secret") { RsaSignaturePadding = RsaSignaturePadding.Pss }; var body = new TextPart ("plain") { Text = "This is some cleartext that we'll end up signing..." }; @@ -889,7 +889,7 @@ public virtual void TestSecureMimeVerifyThunderbird () { MimeMessage message; - using (var file = File.OpenRead (Path.Combine ("..", "..", "TestData", "smime", "thunderbird-signed.txt"))) { + using (var file = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "thunderbird-signed.txt"))) { var parser = new MimeParser (file, MimeFormat.Default); message = parser.ParseMessage (); } @@ -1145,13 +1145,13 @@ public virtual void TestSecureMimeEncryptionWithRsaesOaep (DigestAlgorithm hashA [Test] public void TestSecureMimeDecryptThunderbird () { - var p12 = Path.Combine ("..", "..", "TestData", "smime", "gnome.p12"); + var p12 = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "gnome.p12"); MimeMessage message; if (!File.Exists (p12)) return; - using (var file = File.OpenRead (Path.Combine ("..", "..", "TestData", "smime", "thunderbird-encrypted.txt"))) { + using (var file = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "thunderbird-encrypted.txt"))) { var parser = new MimeParser (file, MimeFormat.Default); message = parser.ParseMessage (); } @@ -1272,13 +1272,13 @@ public virtual void TestSecureMimeSignAndEncrypt () [Test] public void TestSecureMimeDecryptVerifyThunderbird () { - var p12 = Path.Combine ("..", "..", "TestData", "smime", "gnome.p12"); + var p12 = Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "gnome.p12"); MimeMessage message; if (!File.Exists (p12)) return; - using (var file = File.OpenRead (Path.Combine ("..", "..", "TestData", "smime", "thunderbird-signed-encrypted.txt"))) { + using (var file = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "thunderbird-signed-encrypted.txt"))) { var parser = new MimeParser (file, MimeFormat.Default); message = parser.ParseMessage (); } @@ -1387,7 +1387,7 @@ public void TestSecureMimeVerifyMixedLineEndings () { MimeMessage message; - using (var file = File.OpenRead (Path.Combine ("..", "..", "TestData", "smime", "octet-stream-with-mixed-line-endings.dat"))) { + using (var file = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "octet-stream-with-mixed-line-endings.dat"))) { var parser = new MimeParser (file, MimeFormat.Default); message = parser.ParseMessage (); } diff --git a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs index 1b5bc976c0..6ec4a59528 100644 --- a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs +++ b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs @@ -49,7 +49,7 @@ public class SqliteCertificateDatabaseTests public SqliteCertificateDatabaseTests () { - dataDir = Path.Combine ("..", "..", "TestData", "smime"); + dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "smime"); var path = Path.Combine (dataDir, "smime.pfx"); if (File.Exists ("sqlite.db")) diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index 1231620661..f44e6a8a0b 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -46,7 +46,7 @@ public class X509CertificateChainTests static string GetTestDataPath (string relative) { - return Path.Combine ("..", "..", "TestData", "smime", relative); + return Path.Combine (TestHelper.ProjectDir, "TestData", "smime", relative); } [Test] diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs index 633f654ec9..a386cba232 100644 --- a/UnitTests/Cryptography/X509CertificateRecordTests.cs +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -41,10 +41,10 @@ public class X509CertificateRecordTests [Test] public void TestArgumentExceptions () { - var signer = new CmsSigner (Path.Combine ("..", "..", "TestData", "smime", "smime.p12"), "no.secret"); + var signer = new CmsSigner (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "smime.p12"), "no.secret"); AsymmetricCipherKeyPair keyPair; - using (var stream = new StreamReader (Path.Combine ("..", "..", "TestData", "dkim", "example.pem"))) { + using (var stream = new StreamReader (Path.Combine (TestHelper.ProjectDir, "TestData", "dkim", "example.pem"))) { var reader = new PemReader (stream); keyPair = reader.ReadObject () as AsymmetricCipherKeyPair; diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index 13f04f16de..5b54b50833 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -45,7 +45,7 @@ public class X509CertificateStoreTests static string GetTestDataPath (string relative) { - return Path.Combine ("..", "..", "TestData", "smime", relative); + return Path.Combine (TestHelper.ProjectDir, "TestData", "smime", relative); } [Test] diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index a33213b8a4..070c54aea8 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -83,7 +83,7 @@ public class EncoderTests "fo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQ==" }; - static readonly string dataDir = Path.Combine ("..", "..", "TestData", "encoders"); + static readonly string dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "encoders"); static readonly byte[] wikipedia_unix; static readonly byte[] wikipedia_dos; static readonly byte[] photo; @@ -168,33 +168,34 @@ void TestEncoder (ContentEncoding encoding, byte[] rawData, string encodedFile, } } - void TestDecoder (ContentEncoding encoding, byte[] rawData, string encodedFile, int bufferSize) + void TestDecoder (ContentEncoding encoding, byte[] rawData, string encodedFile, int bufferSize, bool unix = false) { int n; - using (var original = new MemoryStream (rawData, false)) { - using (var decoded = new MemoryStream ()) { - using (var filtered = new FilteredStream (decoded)) { - filtered.Add (DecoderFilter.Create (encoding)); + using (var decoded = new MemoryStream ()) { + using (var filtered = new FilteredStream (decoded)) { + filtered.Add (DecoderFilter.Create (encoding)); - using (var file = File.OpenRead (Path.Combine (dataDir, encodedFile))) { - var buffer = new byte[bufferSize]; + if (unix) + filtered.Add (new Dos2UnixFilter ()); - while ((n = file.Read (buffer, 0, bufferSize)) > 0) - filtered.Write (buffer, 0, n); - } + using (var file = File.OpenRead (Path.Combine (dataDir, encodedFile))) { + var buffer = new byte[bufferSize]; - filtered.Flush (); + while ((n = file.Read (buffer, 0, bufferSize)) > 0) + filtered.Write (buffer, 0, n); } - var buf = decoded.GetBuffer (); - n = rawData.Length; + filtered.Flush (); + } - Assert.AreEqual (rawData.Length, decoded.Length, "Decoded length is incorrect."); + var buf = decoded.GetBuffer (); + n = rawData.Length; - for (int i = 0; i < n; i++) - Assert.AreEqual (rawData[i], buf[i], "The byte at offset {0} does not match.", i); - } + Assert.AreEqual (rawData.Length, decoded.Length, "Decoded length is incorrect."); + + for (int i = 0; i < n; i++) + Assert.AreEqual (rawData[i], buf[i], "The byte at offset {0} does not match.", i); } } @@ -330,7 +331,7 @@ public void TestQuotedPrintableEncodeUnix (int bufferSize) [TestCase (1)] public void TestQuotedPrintableDecode (int bufferSize) { - TestDecoder (ContentEncoding.QuotedPrintable, wikipedia_unix, "wikipedia.qp", bufferSize); + TestDecoder (ContentEncoding.QuotedPrintable, wikipedia_unix, "wikipedia.qp", bufferSize, true); } [Test] diff --git a/UnitTests/Encodings/YEncodingTests.cs b/UnitTests/Encodings/YEncodingTests.cs index 7778bc97a2..3c250f48df 100644 --- a/UnitTests/Encodings/YEncodingTests.cs +++ b/UnitTests/Encodings/YEncodingTests.cs @@ -39,6 +39,8 @@ namespace UnitTests.Encodings { [TestFixture] public class YEncodingTests { + static readonly string DataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "yenc"); + [Test] public void TestArgumentExceptions () { @@ -48,7 +50,7 @@ public void TestArgumentExceptions () [Test] public void TestYDecodeSimpleMessage () { - using (var file = File.OpenRead ("../../TestData/yenc/simple.msg")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "simple.msg"))) { var message = MimeMessage.Load (file); using (var decoded = new MemoryStream ()) { @@ -112,10 +114,10 @@ public void TestYDecodeSimpleMessage () [Test] public void TestYDecodeMultiPart () { - var expected = File.ReadAllBytes ("../../TestData/yenc/joystick.jpg"); + var expected = File.ReadAllBytes (Path.Combine (DataDir, "joystick.jpg")); using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/yenc/00000020.ntx")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "00000020.ntx"))) { var ydec = new YDecoder (); using (var filtered = new FilteredStream (decoded)) { @@ -128,7 +130,7 @@ public void TestYDecodeMultiPart () Assert.AreEqual (0xbfae5c0b, ydec.Checksum ^ 0xffffffff, "The decoded checksum does not match (part 1)."); } - using (var file = File.OpenRead ("../../TestData/yenc/00000021.ntx")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "00000021.ntx"))) { var ydec = new YDecoder (); using (var filtered = new FilteredStream (decoded)) { @@ -151,7 +153,7 @@ public void TestYDecodeMultiPart () [Test] public void TestYDecodeStateTransitions () { - using (var file = File.OpenRead ("../../TestData/yenc/state-changes.ntx")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "state-changes.ntx"))) { using (var decoded = new MemoryStream ()) { var ydec = new YDecoder (); diff --git a/UnitTests/IO/FilteredStreamTests.cs b/UnitTests/IO/FilteredStreamTests.cs index c4a3088303..36c4b911b4 100644 --- a/UnitTests/IO/FilteredStreamTests.cs +++ b/UnitTests/IO/FilteredStreamTests.cs @@ -38,6 +38,8 @@ namespace UnitTests.IO { [TestFixture] public class FilteredStreamTests { + static readonly string DataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "encoders"); + [Test] public void TestCanReadWriteSeekTimeout () { @@ -96,11 +98,11 @@ public void TestGetSetTimeouts () public void TestRead () { using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.jpg"))) file.CopyTo (original, 4096); using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.b64")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.b64"))) { using (var filtered = new FilteredStream (file)) { filtered.Add (DecoderFilter.Create (ContentEncoding.Base64)); filtered.CopyTo (decoded, 4096); @@ -123,11 +125,11 @@ public void TestRead () public async Task TestReadAsync () { using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.jpg"))) file.CopyTo (original, 4096); using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.b64")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.b64"))) { using (var filtered = new FilteredStream (file)) { filtered.Add (DecoderFilter.Create (ContentEncoding.Base64)); await filtered.CopyToAsync (decoded, 4096); @@ -150,11 +152,11 @@ public async Task TestReadAsync () public void TestWrite () { using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.jpg"))) file.CopyTo (original, 4096); using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.b64")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.b64"))) { using (var filtered = new FilteredStream (decoded)) { filtered.Add (DecoderFilter.Create (ContentEncoding.Base64)); file.CopyTo (filtered, 4096); @@ -178,11 +180,11 @@ public void TestWrite () public async Task TestWriteAsync () { using (var original = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.jpg")) + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.jpg"))) file.CopyTo (original, 4096); using (var decoded = new MemoryStream ()) { - using (var file = File.OpenRead ("../../TestData/encoders/photo.b64")) { + using (var file = File.OpenRead (Path.Combine (DataDir, "photo.b64"))) { using (var filtered = new FilteredStream (decoded)) { filtered.Add (DecoderFilter.Create (ContentEncoding.Base64)); await file.CopyToAsync (filtered, 4096); diff --git a/UnitTests/MessageDeliveryStatusTests.cs b/UnitTests/MessageDeliveryStatusTests.cs index b66192da88..80efc23853 100644 --- a/UnitTests/MessageDeliveryStatusTests.cs +++ b/UnitTests/MessageDeliveryStatusTests.cs @@ -48,7 +48,7 @@ public void TestArgumentExceptions () [Test] public void TestMimeParser () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "delivery-status.txt")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "delivery-status.txt")); Assert.IsInstanceOf (message.Body, "Expected top-level body part to be a multipart/report."); diff --git a/UnitTests/MessageDispositionNotificiationTests.cs b/UnitTests/MessageDispositionNotificiationTests.cs index 2ec001f760..077ec5179d 100644 --- a/UnitTests/MessageDispositionNotificiationTests.cs +++ b/UnitTests/MessageDispositionNotificiationTests.cs @@ -47,7 +47,7 @@ public void TestArgumentExceptions () [Test] public void TestMimeParser () { - var message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "disposition-notification.txt")); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "disposition-notification.txt")); Assert.IsInstanceOf (message.Body, "Expected top-level body part to be a multipart/report."); diff --git a/UnitTests/MessagePartialTests.cs b/UnitTests/MessagePartialTests.cs index 10d9e37ccd..8b5352881e 100644 --- a/UnitTests/MessagePartialTests.cs +++ b/UnitTests/MessagePartialTests.cs @@ -87,10 +87,10 @@ static void AssertRawMessageStreams (MimeMessage expected, MimeMessage actual) [Test] public void TestReassembleGirlOnTrainPhotoExample () { - var message0 = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.0.eml")); - var message1 = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.1.eml")); - var message2 = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.2.eml")); - var original = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.eml")); + var message0 = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "message-partial.0.eml")); + var message1 = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "message-partial.1.eml")); + var message2 = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "message-partial.2.eml")); + var original = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "message-partial.eml")); Assert.IsNotNull (message0, "Failed to parse message-partial.0.eml"); Assert.IsNotNull (message1, "Failed to parse message-partial.1.eml"); @@ -125,9 +125,9 @@ public void TestReassembleGirlOnTrainPhotoExample () [Test] public void TestReassembleRfc2046Example () { - var message0 = Load (Path.Combine ("..", "..", "TestData", "partial", "rfc2046.0.eml")); - var message1 = Load (Path.Combine ("..", "..", "TestData", "partial", "rfc2046.1.eml")); - var original = Load (Path.Combine ("..", "..", "TestData", "partial", "rfc2046.eml")); + var message0 = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "rfc2046.0.eml")); + var message1 = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "rfc2046.1.eml")); + var original = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "rfc2046.eml")); Assert.IsNotNull (message0, "Failed to parse rfc2046.0.eml"); Assert.IsNotNull (message1, "Failed to parse rfc2046.1.eml"); @@ -152,7 +152,7 @@ public void TestReassembleRfc2046Example () [Test] public void TestSplit () { - var message = Load (Path.Combine ("..", "..", "TestData", "partial", "message-partial.eml")); + var message = Load (Path.Combine (TestHelper.ProjectDir, "TestData", "partial", "message-partial.eml")); var split = MessagePartial.Split (message, 1024 * 16).ToList (); var parts = new List (); diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 303fb06e85..2a7f7fc44e 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -1279,39 +1279,39 @@ public void TestHtmlAndTextBodies () const string TextBody = "This is the text body."; MimeMessage message; - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.1.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.1.txt")); Assert.AreEqual (TextBody, message.TextBody, "The text bodies do not match for body.1.txt."); Assert.AreEqual (null, message.HtmlBody, "The HTML bodies do not match for body.1.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.2.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.2.txt")); Assert.AreEqual (null, message.TextBody, "The text bodies do not match for body.2.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.2.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.3.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.3.txt")); Assert.AreEqual (TextBody, message.TextBody, "The text bodies do not match for body.3.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.3.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.4.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.4.txt")); Assert.AreEqual (null, message.TextBody, "The text bodies do not match for body.4.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.4.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.5.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.5.txt")); Assert.AreEqual (TextBody, message.TextBody, "The text bodies do not match for body.5.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.5.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.6.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.6.txt")); Assert.AreEqual (TextBody, message.TextBody, "The text bodies do not match for body.6.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.6.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.7.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.7.txt")); Assert.AreEqual (TextBody, message.TextBody, "The text bodies do not match for body.7.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.7.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.8.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.8.txt")); Assert.AreEqual (TextBody, message.TextBody, "The text bodies do not match for body.8.txt."); Assert.AreEqual (null, message.HtmlBody, "The HTML bodies do not match for body.8.txt."); - message = MimeMessage.Load (Path.Combine ("..", "..", "TestData", "messages", "body.9.txt")); + message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.9.txt")); Assert.AreEqual (null, message.TextBody, "The text bodies do not match for body.9.txt."); Assert.AreEqual (HtmlBody, message.HtmlBody, "The HTML bodies do not match for body.9.txt."); } diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 8e66a5f523..02b80484a6 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -41,8 +41,8 @@ namespace UnitTests { [TestFixture] public class MimeParserTests { - static string MessagesDataDir = Path.Combine ("..", "..", "TestData", "messages"); - static string MboxDataDir = Path.Combine ("..", "..", "TestData", "mbox"); + static string MessagesDataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "messages"); + static string MboxDataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "mbox"); static FormatOptions UnixFormatOptions; public MimeParserTests () diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 5a4064c576..9cb0d72f20 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -378,7 +378,7 @@ public void TestPrepare () [Test] public void TestTranscoding () { - var path = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var expected = File.ReadAllBytes (path); var part = new MimePart ("image", "jpeg") { @@ -420,7 +420,7 @@ public void TestTranscoding () [Test] public async Task TestTranscodingAsync () { - var path = Path.Combine ("..", "..", "TestData", "images", "girl.jpg"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); var expected = File.ReadAllBytes (path); var part = new MimePart ("image", "jpeg") { diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index 12d7c35b1b..b90f214a44 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -41,7 +41,7 @@ public class MimeVisitorTests [Test] public void TestMimeVisitor () { - var dataDir = Path.Combine ("..", "..", "TestData", "mbox"); + var dataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "mbox"); var visitor = new HtmlPreviewVisitor (); int index = 0; diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index c67b46e27c..0b38d0447e 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -100,7 +100,7 @@ public void TestDocumentRoot () [Test] public void TestDocumentRootByType () { - var related = (MultipartRelated) MimeEntity.Load (Path.Combine ("..", "..", "TestData", "messages", "multipart-related-mhtml.txt")); + var related = (MultipartRelated) MimeEntity.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "multipart-related-mhtml.txt")); Assert.AreEqual (2, related.Count, "Count"); diff --git a/UnitTests/TestHelper.cs b/UnitTests/TestHelper.cs new file mode 100644 index 0000000000..ddbb339ecf --- /dev/null +++ b/UnitTests/TestHelper.cs @@ -0,0 +1,57 @@ +// +// TestHelper.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + + +using System; +using System.IO; + +namespace UnitTests +{ + static class TestHelper + { + public static readonly string ProjectDir; + + static TestHelper () + { + var codeBase = typeof (TestHelper).Assembly.CodeBase; + if (codeBase.StartsWith ("file://", StringComparison.OrdinalIgnoreCase)) + codeBase = codeBase.Substring ("file://".Length); + + if (Path.DirectorySeparatorChar == '\\') { + if (codeBase[0] == '/') + codeBase = codeBase.Substring (1); + + codeBase = codeBase.Replace ('/', '\\'); + } + + var codeBaseDir = Path.GetDirectoryName (codeBase); + var binDir = Path.Combine (codeBaseDir, ".."); + var projectDir = Path.Combine (binDir, ".."); + + ProjectDir = Path.GetFullPath (projectDir); + } + } +} diff --git a/UnitTests/Text/HtmlEntityDecoderTests.cs b/UnitTests/Text/HtmlEntityDecoderTests.cs index 8e076be14b..1328a401ba 100644 --- a/UnitTests/Text/HtmlEntityDecoderTests.cs +++ b/UnitTests/Text/HtmlEntityDecoderTests.cs @@ -38,7 +38,7 @@ public class HtmlEntityDecoderTests [Test] public void TestDecodeNamedEntities () { - var path = Path.Combine ("..", "..", "TestData", "html", "HtmlEntities.json"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "html", "HtmlEntities.json"); var decoder = new HtmlEntityDecoder (); using (var json = new JsonTextReader (new StreamReader (path))) { diff --git a/UnitTests/Text/HtmlTextPreviewerTests.cs b/UnitTests/Text/HtmlTextPreviewerTests.cs index 3376223e2c..d6ca897070 100644 --- a/UnitTests/Text/HtmlTextPreviewerTests.cs +++ b/UnitTests/Text/HtmlTextPreviewerTests.cs @@ -104,7 +104,7 @@ void AssertPreviewText (string path, string expected, int maxPreviewLen) [Test] public void TestHomeDepot110 () { - var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "homedepot-check-inside-now.html"); const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; AssertPreviewText (path, expected, 110); @@ -113,7 +113,7 @@ public void TestHomeDepot110 () [Test] public void TestHomeDepot230 () { - var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "homedepot-check-inside-now.html"); const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; AssertPreviewText (path, expected, 230); @@ -123,7 +123,7 @@ public void TestHomeDepot230 () public void TestMimeKitHomepage110 () { string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> I\u2026"; - var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "mimekit.net.html"); AssertPreviewText (path, expected, 110); } @@ -132,7 +132,7 @@ public void TestMimeKitHomepage110 () public void TestMimeKitHomepage230 () { string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> Install-Package MimeKit PM> Install-Package MailKit or Install via VS Package Management window. Direct Download ZIP fil\u2026"; - var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "mimekit.net.html"); AssertPreviewText (path, expected, 230); } @@ -141,7 +141,7 @@ public void TestMimeKitHomepage230 () public void TestPlanetFitness110 () { string expected = "Don’t miss our celebrity guest Monday evening"; - var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "planet-fitness.html"); AssertPreviewText (path, expected, 110); } @@ -150,7 +150,7 @@ public void TestPlanetFitness110 () public void TestPlanetFitness230 () { string expected = "Don’t miss our celebrity guest Monday evening"; - var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "planet-fitness.html"); AssertPreviewText (path, expected, 230); } diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index fbbd780845..983abca302 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -107,8 +107,8 @@ void ReplaceUrlsWithFileNames (HtmlTagContext ctx, HtmlWriter htmlWriter) [Test] public void TestSimpleHtmlToHtml () { - string expected = File.ReadAllText ("../../TestData/html/xamarin3.xhtml"); - string text = File.ReadAllText ("../../TestData/html/xamarin3.html"); + string expected = File.ReadAllText (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "xamarin3.xhtml")); + string text = File.ReadAllText (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "xamarin3.html")); var converter = new HtmlToHtml { Header = null, Footer = null, HtmlTagCallback = ReplaceUrlsWithFileNames }; var result = converter.Convert (text); diff --git a/UnitTests/Text/HtmlTokenizerTests.cs b/UnitTests/Text/HtmlTokenizerTests.cs index 31fd6dffbe..0c7338e6a4 100644 --- a/UnitTests/Text/HtmlTokenizerTests.cs +++ b/UnitTests/Text/HtmlTokenizerTests.cs @@ -158,55 +158,55 @@ static void VerifyHtmlTokenizerOutput (string path) [Test] public void TestGoogleSignInAttemptBlocked () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "blocked.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "blocked.html")); } [Test] public void TestXamarin3SampleHtml () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "xamarin3.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "xamarin3.html")); } [Test] public void TestPapercut () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "papercut.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "papercut.html")); } [Test] public void TestPapercut44 () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "papercut-4.4.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "papercut-4.4.html")); } [Test] public void TestScriptData () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "script-data.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "script-data.html")); } [Test] public void TestCData () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "cdata.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "cdata.html")); } [Test] public void TestTokenizer () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "test.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "test.html")); } [Test] public void TestPlainText () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "plaintext.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "plaintext.html")); } [Test] public void TestBadlyQuotedAttribute () { - VerifyHtmlTokenizerOutput (Path.Combine ("..", "..", "TestData", "html", "badly-quoted-attr.html")); + VerifyHtmlTokenizerOutput (Path.Combine (TestHelper.ProjectDir, "TestData", "html", "badly-quoted-attr.html")); } // Note: The following tests are borrowed from AngleSharp diff --git a/UnitTests/Text/PlainTextPreviewerTests.cs b/UnitTests/Text/PlainTextPreviewerTests.cs index 91aba06f57..5a96e7e477 100644 --- a/UnitTests/Text/PlainTextPreviewerTests.cs +++ b/UnitTests/Text/PlainTextPreviewerTests.cs @@ -105,7 +105,7 @@ void AssertPreviewText (string path, string expected) public void TestPlanetFitness () { const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…"; - var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "planet-fitness.txt"); AssertPreviewText (path, expected); } diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs index cffe3876e2..f5e3b52b6b 100644 --- a/UnitTests/Text/TextPreviewerTests.cs +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -62,7 +62,7 @@ void AssertPreviewText (string path, TextFormat format, string expected) [Test] public void TestHomeDepotCheckInsideNOW () { - var path = Path.Combine ("..", "..", "TestData", "text", "homedepot-check-inside-now.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "homedepot-check-inside-now.html"); const string expected = "FREE DELIVERY Appliance Purchases $396 or More"; AssertPreviewText (path, TextFormat.Html, expected); @@ -72,7 +72,7 @@ public void TestHomeDepotCheckInsideNOW () public void TestMimeKitHomepage () { string expected = "Toggle navigation MimeKit Home About Help Documentation Donate \u00D7 Install with NuGet (recommended) NuGet PM> Install-Package MimeKit PM> Install-Package MailKit or Install via VS Package Management window. Direct Download ZIP fil\u2026"; - var path = Path.Combine ("..", "..", "TestData", "text", "mimekit.net.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "mimekit.net.html"); AssertPreviewText (path, TextFormat.Html, expected); } @@ -81,7 +81,7 @@ public void TestMimeKitHomepage () public void TestPlanetFitness () { string expected = "Don’t miss our celebrity guest Monday evening"; - var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.html"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "planet-fitness.html"); AssertPreviewText (path, TextFormat.Html, expected); } @@ -90,7 +90,7 @@ public void TestPlanetFitness () public void TestPlanetFitnessPlain () { const string expected = "Planet Fitness https://view.email.planetfitness.com/?qs=9a098a031cabde68c0a4260051cd6fe473a2e997a53678ff26b4b199a711a9d2ad0536530d6f837c246b09f644d42016ecfb298f930b7af058e9e454b34f3d818ceb3052ae317b1ac4594aab28a2d788 View web ver…"; - var path = Path.Combine ("..", "..", "TestData", "text", "planet-fitness.txt"); + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "planet-fitness.txt"); AssertPreviewText (path, TextFormat.Plain, expected); } diff --git a/UnitTests/Tnef/TnefReaderStreamTests.cs b/UnitTests/Tnef/TnefReaderStreamTests.cs index fbe84cf189..e26fc5c8f5 100644 --- a/UnitTests/Tnef/TnefReaderStreamTests.cs +++ b/UnitTests/Tnef/TnefReaderStreamTests.cs @@ -35,10 +35,12 @@ namespace UnitTests.Tnef { [TestFixture] public class TnefReaderStreamTests { + static readonly string DataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "tnef"); + [Test] public void TestTnefReaderStream () { - using (var stream = File.OpenRead ("../../TestData/tnef/winmail.tnef")) { + using (var stream = File.OpenRead (Path.Combine (DataDir, "winmail.tnef"))) { using (var reader = new TnefReader (stream)) { var buffer = new byte[1024]; diff --git a/UnitTests/Tnef/TnefReaderTests.cs b/UnitTests/Tnef/TnefReaderTests.cs index d1bf4cae75..6647a4bd39 100644 --- a/UnitTests/Tnef/TnefReaderTests.cs +++ b/UnitTests/Tnef/TnefReaderTests.cs @@ -35,10 +35,12 @@ namespace UnitTests.Tnef { [TestFixture] public class TnefReaderTests { + static readonly string DataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "tnef"); + [Test] public void TestArgumentExceptions () { - using (var stream = File.OpenRead ("../../TestData/tnef/winmail.tnef")) { + using (var stream = File.OpenRead (Path.Combine (DataDir, "winmail.tnef"))) { Assert.Throws (() => new TnefReader (null, 0, TnefComplianceMode.Strict)); Assert.Throws (() => new TnefReader (stream, -1, TnefComplianceMode.Strict)); @@ -55,7 +57,7 @@ public void TestArgumentExceptions () [Test] public void TestSetComplianceError () { - using (var stream = File.OpenRead ("../../TestData/tnef/winmail.tnef")) { + using (var stream = File.OpenRead (Path.Combine (DataDir, "winmail.tnef"))) { using (var reader = new TnefReader (stream, 0, TnefComplianceMode.Strict)) { foreach (TnefComplianceStatus error in Enum.GetValues (typeof (TnefComplianceStatus))) { if (error == TnefComplianceStatus.Compliant) { diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 3c0f720905..a579227dfe 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -708,8 +708,9 @@ static byte[] ReadAllBytes (Stream stream, bool text) } } - static void TestTnefParser (string path, TnefComplianceStatus expected = TnefComplianceStatus.Compliant) + static void TestTnefParser (string baseFileName, TnefComplianceStatus expected = TnefComplianceStatus.Compliant) { + var path = Path.Combine (TestHelper.ProjectDir, "TestData", "tnef", baseFileName); var message = ParseTnefMessage (path + ".tnef", expected); var tnefName = Path.GetFileName (path + ".tnef"); var names = File.ReadAllLines (path + ".list"); @@ -791,10 +792,11 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom case ".dat": case ".htm": case ".ini": + case ".src": isText = true; break; case "": - isText = part.FileName == "AUTHORS"; + isText = part.FileName == "AUTHORS" || part.FileName == "README"; break; } @@ -827,25 +829,25 @@ static void TestTnefParser (string path, TnefComplianceStatus expected = TnefCom [Test] public void TestAttachments () { - TestTnefParser ("../../TestData/tnef/attachments"); + TestTnefParser ("attachments"); } [Test] public void TestBody () { - TestTnefParser ("../../TestData/tnef/body"); + TestTnefParser ("body"); } [Test] public void TestChristmas () { - TestTnefParser ("../../TestData/tnef/christmas", TnefComplianceStatus.UnsupportedPropertyType); + TestTnefParser ("christmas", TnefComplianceStatus.UnsupportedPropertyType); } [Test] public void TestDataBeforeName () { - TestTnefParser ("../../TestData/tnef/data-before-name"); + TestTnefParser ("data-before-name"); } [Test] @@ -853,98 +855,98 @@ public void TestGarbageAtEnd () { const TnefComplianceStatus errors = TnefComplianceStatus.InvalidAttributeLevel | TnefComplianceStatus.StreamTruncated; - TestTnefParser ("../../TestData/tnef/garbage-at-end", errors); + TestTnefParser ("garbage-at-end", errors); } [Test] public void TestLongFileName () { - TestTnefParser ("../../TestData/tnef/long-filename"); + TestTnefParser ("long-filename"); } [Test] public void TestMapiAttachDataObj () { - TestTnefParser ("../../TestData/tnef/MAPI_ATTACH_DATA_OBJ"); + TestTnefParser ("MAPI_ATTACH_DATA_OBJ"); } [Test] public void TestMapiObject () { - TestTnefParser ("../../TestData/tnef/MAPI_OBJECT"); + TestTnefParser ("MAPI_OBJECT"); } [Test] public void TestMissingFileNames () { - TestTnefParser ("../../TestData/tnef/missing-filenames"); + TestTnefParser ("missing-filenames"); } [Test] public void TestMultiNameProperty () { - TestTnefParser ("../../TestData/tnef/multi-name-property"); + TestTnefParser ("multi-name-property"); } [Test] public void TestMultiValueAttribute () { - TestTnefParser ("../../TestData/tnef/multi-value-attribute"); + TestTnefParser ("multi-value-attribute"); } [Test] public void TestOneFile () { - TestTnefParser ("../../TestData/tnef/one-file"); + TestTnefParser ("one-file"); } [Test] public void TestPanic () { - TestTnefParser ("../../TestData/tnef/panic", TnefComplianceStatus.InvalidAttribute | TnefComplianceStatus.InvalidAttributeLevel); + TestTnefParser ("panic", TnefComplianceStatus.InvalidAttribute | TnefComplianceStatus.InvalidAttributeLevel); } [Test] public void TestRtf () { - TestTnefParser ("../../TestData/tnef/rtf"); + TestTnefParser ("rtf"); } [Test] public void TestTriples () { - TestTnefParser ("../../TestData/tnef/triples"); + TestTnefParser ("triples"); } [Test] public void TestTwoFiles () { - TestTnefParser ("../../TestData/tnef/two-files"); + TestTnefParser ("two-files"); } [Test] public void TestUnicodeMapiAttrName () { - TestTnefParser ("../../TestData/tnef/unicode-mapi-attr-name"); + TestTnefParser ("unicode-mapi-attr-name"); } [Test] public void TestUnicodeMapiAttr () { - TestTnefParser ("../../TestData/tnef/unicode-mapi-attr"); + TestTnefParser ("unicode-mapi-attr"); } [Test] public void TestWinMail () { - TestTnefParser ("../../TestData/tnef/winmail"); + TestTnefParser ("winmail"); } [Test] public void TestExtractedCharset () { const string expected = "\r\n\r\n\r\n\r\n\r\n\r\n
\r\n

ЫПУФЙК

\r\n


\r\n

\r\n

{EMAILSIGNATURE}

\r\n


\r\n

\r\n

\r\n
\r\nRR Test 1\r\n
\r\n

 

\r\n
\r\n
\r\n\r\n\r\n"; - var message = MimeMessage.Load ("../../TestData/tnef/ukr.eml"); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "tnef", "ukr.eml")); var tnef = message.BodyParts.OfType ().FirstOrDefault (); message = tnef.ConvertToMessage (); @@ -964,7 +966,7 @@ public void TestExtractedCharset () [Test] public void TestRichTextEml () { - var message = MimeMessage.Load ("../../TestData/tnef/rich-text.eml"); + var message = MimeMessage.Load (Path.Combine (TestHelper.ProjectDir, "TestData", "tnef", "rich-text.eml")); var tnef = message.BodyParts.OfType ().FirstOrDefault (); var mtime = new DateTimeOffset (new DateTime (2018, 12, 15, 10, 17, 38)); diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index ec155b1bfe..353915c20e 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,5 +1,6 @@ + Debug @@ -43,6 +44,9 @@ + + ..\packages\System.Data.SQLite.Core.1.0.112.2\lib\net40\System.Data.SQLite.dll + @@ -57,9 +61,6 @@ ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - - ..\packages\System.Data.SQLite.Core.1.0.112.0\lib\net45\System.Data.SQLite.dll - @@ -173,6 +174,7 @@ + @@ -365,5 +367,12 @@ - - + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 4849472be3..751a9ea6d5 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -3,5 +3,6 @@ - + + \ No newline at end of file From d9a31bf79101f8a59774d1ab85d504da407c25b7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 May 2020 13:21:23 -0400 Subject: [PATCH 543/741] Fixed MimeParser tests on Windows/VS --- MimeKit/MimePart.cs | 16 ++++++++-- MimeKit/Utils/MimeUtils.cs | 1 + UnitTests/MimeParserTests.cs | 58 ++++++++++++++---------------------- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 968675e75c..d243fa8107 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -539,6 +539,15 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = ContentTransferEncoding = best; } + bool IsTextBasedContent { + get { + if (encoding != ContentEncoding.Binary && encoding != ContentEncoding.Default) + return true; + + return ContentType.IsMimeType ("text", "*") || ContentType.IsMimeType ("message", "*"); + } + } + /// /// Writes the to the specified output stream. /// @@ -607,7 +616,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); } } - } else if (encoding == ContentEncoding.Binary || (encoding == ContentEncoding.Default && !ContentType.IsMimeType("text", "*"))) { + } else if (encoding == ContentEncoding.Binary || !IsTextBasedContent) { // Do not alter binary content. Content.WriteTo (stream, cancellationToken); } else { @@ -650,6 +659,8 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = if (Content == null) return; + var isText = ContentType.IsMimeType ("text", "*") || ContentType.IsMimeType ("message", "*"); + if (Content.Encoding != encoding) { if (encoding == ContentEncoding.UUEncode) { var begin = string.Format ("begin 0644 {0}", FileName ?? "unknown"); @@ -676,7 +687,8 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = await stream.WriteAsync (buffer, 0, buffer.Length, cancellationToken).ConfigureAwait (false); await stream.WriteAsync (options.NewLineBytes, 0, options.NewLineBytes.Length, cancellationToken).ConfigureAwait (false); } - } else if (encoding == ContentEncoding.Binary || (encoding == ContentEncoding.Default && !ContentType.IsMimeType("text", "*"))) { + } else if (encoding == ContentEncoding.Binary || !IsTextBasedContent) { + // Do not alter binary content. await Content.WriteToAsync (stream, cancellationToken).ConfigureAwait (false); } else { using (var filtered = new FilteredStream (stream)) { diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index bf489475da..63f1fe2d3f 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -363,6 +363,7 @@ public static bool TryParse (string text, out ContentEncoding encoding) case "quoted-printable": encoding = ContentEncoding.QuotedPrintable; break; case "x-uuencode": encoding = ContentEncoding.UUEncode; break; case "uuencode": encoding = ContentEncoding.UUEncode; break; + case "x-uue": encoding = ContentEncoding.UUEncode; break; default: encoding = ContentEncoding.Default; break; } diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 02b80484a6..37a08b1e56 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -580,55 +580,44 @@ static void AssertMboxResults (string baseName, string actual, Stream output) File.WriteAllText (path, actual); var summary = File.ReadAllText (path).Replace ("\r\n", "\n"); - var original = new MemoryBlockStream (); var expected = new byte[4096]; var buffer = new byte[4096]; int nx, n; Assert.AreEqual (summary, actual, "Summaries do not match for {0}.mbox", baseName); - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { - using (var filtered = new FilteredStream (original)) { - filtered.Add (new Dos2UnixFilter ()); - stream.CopyTo (filtered); - filtered.Flush (); - } - } + using (var original = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { + output.Position = 0; - original.Position = 0; - output.Position = 0; + Assert.AreEqual (original.Length, output.Length, "The length of the mbox did not match."); - Assert.AreEqual (original.Length, output.Length, "The length of the mbox did not match."); + do { + var position = original.Position; - do { - var position = original.Position; + nx = original.Read (expected, 0, expected.Length); + n = output.Read (buffer, 0, nx); - nx = original.Read (expected, 0, expected.Length); - n = output.Read (buffer, 0, buffer.Length); + if (nx == 0) + break; - if (nx == 0) - break; + for (int i = 0; i < nx; i++) { + if (buffer[i] == expected[i]) + continue; - for (int i = 0; i < nx; i++) { - if (buffer[i] == expected[i]) - continue; + var strExpected = CharsetUtils.Latin1.GetString (expected, 0, nx); + var strActual = CharsetUtils.Latin1.GetString (buffer, 0, n); - var strExpected = CharsetUtils.Latin1.GetString (expected, 0, nx); - var strActual = CharsetUtils.Latin1.GetString (buffer, 0, n); - - Assert.AreEqual (strExpected, strActual, "The mbox differs at position {0}", position + i); - } - } while (true); + Assert.AreEqual (strExpected, strActual, "The mbox differs at position {0}", position + i); + } + } while (true); + } } void TestMbox (ParserOptions options, string baseName) { - var format = FormatOptions.Default.Clone (); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - format.NewLineFormat = NewLineFormat.Unix; - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); int count = 0; @@ -646,9 +635,9 @@ void TestMbox (ParserOptions options, string baseName) DumpMimeTree (builder, message); builder.Append ('\n'); - var marker = Encoding.UTF8.GetBytes ((count > 0 ? "\n" : string.Empty) + parser.MboxMarker + "\n"); + var marker = Encoding.UTF8.GetBytes ((count > 0 ? Environment.NewLine : string.Empty) + parser.MboxMarker + Environment.NewLine); output.Write (marker, 0, marker.Length); - message.WriteTo (format, output); + message.WriteTo (output); count++; } } @@ -658,12 +647,9 @@ void TestMbox (ParserOptions options, string baseName) async Task TestMboxAsync (ParserOptions options, string baseName) { - var format = FormatOptions.Default.Clone (); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - format.NewLineFormat = NewLineFormat.Unix; - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); int count = 0; @@ -681,9 +667,9 @@ async Task TestMboxAsync (ParserOptions options, string baseName) DumpMimeTree (builder, message); builder.Append ('\n'); - var marker = Encoding.UTF8.GetBytes ((count > 0 ? "\n" : string.Empty) + parser.MboxMarker + "\n"); + var marker = Encoding.UTF8.GetBytes ((count > 0 ? Environment.NewLine : string.Empty) + parser.MboxMarker + Environment.NewLine); await output.WriteAsync (marker, 0, marker.Length); - await message.WriteToAsync (format, output); + await message.WriteToAsync (output); count++; } } From 09fc521436616db34fa72163f8d1bdb7be49e1e6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 May 2020 15:06:31 -0400 Subject: [PATCH 544/741] Run the unit tests on Travis-CI as well --- .nuget/packages.config | 7 ------- .travis.yml | 1 + UnitTests/packages.config | 3 ++- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.nuget/packages.config b/.nuget/packages.config index 0a5d0a0a18..d1563340fb 100644 --- a/.nuget/packages.config +++ b/.nuget/packages.config @@ -1,13 +1,6 @@ - - - - - - - diff --git a/.travis.yml b/.travis.yml index 7db0153271..6a3f368ebf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,3 +4,4 @@ install: - nuget restore MimeKit.Net45.sln script: - msbuild /p:Configuration=Debug MimeKit.Net45.sln + - mono ./packages/NUnit.ConsoleRunner.3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/UnitTests.dll diff --git a/UnitTests/packages.config b/UnitTests/packages.config index 751a9ea6d5..97e1356de6 100644 --- a/UnitTests/packages.config +++ b/UnitTests/packages.config @@ -3,6 +3,7 @@ + - \ No newline at end of file + From 45fee2664bf537a18bc0bacc0655d817e6c9957f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 May 2020 15:13:43 -0400 Subject: [PATCH 545/741] Updated .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 63094d403f..89cd9f284c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ MimeKit/Resources/Resource.designer.cs Mono.Data.Sqlite/Documentation +project.nuget.cache *project.lock.json *.csproj.nuget.cache *.csproj.nuget.dgspec.json From 07be56e056bddeadc4be8121f2e48dbe13500c5e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 23 May 2020 09:57:52 -0400 Subject: [PATCH 546/741] Modernized the code in the fluent .ctors --- MimeKit/MessagePart.cs | 3 +-- MimeKit/MimeEntity.cs | 6 ++---- MimeKit/MimePart.cs | 6 ++---- MimeKit/Multipart.cs | 3 +-- MimeKit/TextPart.cs | 6 ++---- MimeKit/TextRfc822Headers.cs | 3 +-- 6 files changed, 9 insertions(+), 18 deletions(-) diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index 8396e7e525..a02482edab 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -83,8 +83,7 @@ public MessagePart (string subtype, params object[] args) : this (subtype) if (obj == null || TryInit (obj)) continue; - var mesg = obj as MimeMessage; - if (mesg != null) { + if (obj is MimeMessage mesg) { if (message != null) throw new ArgumentException ("MimeMessage should not be specified more than once."); diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 5110ad9956..eb1a3aad4d 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -137,14 +137,12 @@ protected MimeEntity (ContentType contentType) protected bool TryInit (object obj) { // The base MimeEntity class only knows about Headers. - var header = obj as Header; - if (header != null) { + if (obj is Header header) { Headers.Add (header); return true; } - var headers = obj as IEnumerable
; - if (headers != null) { + if (obj is IEnumerable
headers) { foreach (Header h in headers) Headers.Add (h); return true; diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index d243fa8107..e7c2f281d3 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -105,8 +105,7 @@ public MimePart (string mediaType, string mediaSubtype, params object[] args) : if (obj == null || TryInit (obj)) continue; - var co = obj as IMimeContent; - if (co != null) { + if (obj is IMimeContent co) { if (content != null) throw new ArgumentException ("IMimeContent should not be specified more than once."); @@ -114,8 +113,7 @@ public MimePart (string mediaType, string mediaSubtype, params object[] args) : continue; } - var stream = obj as Stream; - if (stream != null) { + if (obj is Stream stream) { if (content != null) throw new ArgumentException ("Stream (used as content) should not be specified more than once."); diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 350755f75f..e653369da7 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -106,8 +106,7 @@ public Multipart (string subtype, params object[] args) : this (subtype) if (obj == null || TryInit (obj)) continue; - var entity = obj as MimeEntity; - if (entity != null) { + if (obj is MimeEntity entity) { Add (entity); continue; } diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 3665eab740..27b8c676ef 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -102,8 +102,7 @@ public TextPart (string subtype, params object[] args) : this (subtype) if (obj == null || TryInit (obj)) continue; - var enc = obj as Encoding; - if (enc != null) { + if (obj is Encoding enc) { if (encoding != null) throw new ArgumentException ("An encoding should not be specified more than once."); @@ -111,8 +110,7 @@ public TextPart (string subtype, params object[] args) : this (subtype) continue; } - var str = obj as string; - if (str != null) { + if (obj is string str) { if (text != null) throw new ArgumentException ("The text should not be specified more than once."); diff --git a/MimeKit/TextRfc822Headers.cs b/MimeKit/TextRfc822Headers.cs index 5aab4a2108..4ec761f516 100644 --- a/MimeKit/TextRfc822Headers.cs +++ b/MimeKit/TextRfc822Headers.cs @@ -72,8 +72,7 @@ public TextRfc822Headers (params object[] args) : this () if (obj == null || TryInit (obj)) continue; - var mesg = obj as MimeMessage; - if (mesg != null) { + if (obj is MimeMessage mesg) { if (message != null) throw new ArgumentException ("MimeMessage should not be specified more than once."); From 664cec3cfd57dcb479a59761e3acc06da5d95d1e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 23 May 2020 12:27:23 -0400 Subject: [PATCH 547/741] Fixed MessagePartial to use FormatOptions.CloneDefault() --- MimeKit/MessagePartial.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 2c4d92bb35..1fe238593d 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -203,7 +203,7 @@ public static IEnumerable Split (MimeMessage message, int maxSize) if (maxSize < 1) throw new ArgumentOutOfRangeException (nameof (maxSize)); - var options = FormatOptions.Default.Clone (); + var options = FormatOptions.CloneDefault (); foreach (HeaderId id in Enum.GetValues (typeof (HeaderId))) { switch (id) { case HeaderId.Subject: From 366b77472caeb9ef2223a4f70a3f8fd44186cd64 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 23 May 2020 13:14:21 -0400 Subject: [PATCH 548/741] Improved logic for verifying signatures for MimeParts containing mixed line endings This is a better fix for issue #569 --- UnitTests/Cryptography/SecureMimeTests.cs | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index dc8451b127..c0ac035cf9 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -1408,6 +1408,33 @@ public void TestSecureMimeVerifyMixedLineEndings () } } } + + [Test] + public async Task TestSecureMimeVerifyMixedLineEndingsAsync () + { + MimeMessage message; + + using (var file = File.OpenRead (Path.Combine (TestHelper.ProjectDir, "TestData", "smime", "octet-stream-with-mixed-line-endings.dat"))) { + var parser = new MimeParser (file, MimeFormat.Default); + message = await parser.ParseMessageAsync (); + } + + Assert.IsInstanceOf (message.Body, "THe message body is not multipart/signed as expected."); + + var signed = (MultipartSigned) message.Body; + + using (var ctx = CreateContext ()) { + foreach (var signature in await signed.VerifyAsync (ctx)) { + try { + bool valid = signature.Verify (true); + + Assert.IsTrue (valid, "Bad signature from {0}", signature.SignerCertificate.Email); + } catch (DigitalSignatureVerifyException ex) { + Assert.Fail ("Failed to verify signature: {0}", ex); + } + } + } + } } [TestFixture] From 53463b7da589e09e55ea329dbd6726ee01e3b579 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 23 May 2020 13:18:51 -0400 Subject: [PATCH 549/741] Improved logic for verifying signatores for MimeParts with mixed line-endings Modified parser to track NewLineFormat of content and set it on the MimeContent object so that MimePart.WriteTo() can use that information (along with a new FormatOptions.VerifyingSignature property) to determine if it should avoid canonicalizing the content line endings. Fixes issue #569 in a better way. --- MimeKit/AsyncMimeParser.cs | 21 +++++------ MimeKit/Cryptography/MultipartSigned.cs | 2 ++ MimeKit/FormatOptions.cs | 37 ++++++++++++++++---- MimeKit/IMimeContent.cs | 25 ++++++++++---- MimeKit/MimeContent.cs | 25 ++++++++++---- MimeKit/MimeParser.cs | 46 +++++++++++++++++++------ MimeKit/MimePart.cs | 25 ++++++++------ 7 files changed, 129 insertions(+), 52 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 83ea4246cb..54ac53ab31 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -203,10 +203,11 @@ async Task StepAsync (CancellationToken cancellationToken) return state; } - async Task ScanContentAsync (Stream content, bool trimNewLine, CancellationToken cancellationToken) + async Task ScanContentAsync (Stream content, bool trimNewLine, CancellationToken cancellationToken) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); int contentIndex = inputIndex; + var formats = new bool[2]; bool midline = false; int nleft; @@ -223,7 +224,7 @@ async Task ScanContentAsync (Stream content, bool trimNewLine, Cancellatio unsafe { fixed (byte* inbuf = input) { - ScanContent (inbuf, ref contentIndex, ref nleft, ref midline); + ScanContent (inbuf, ref contentIndex, ref nleft, ref midline, ref formats); } } } while (boundary == BoundaryType.None); @@ -243,32 +244,32 @@ async Task ScanContentAsync (Stream content, bool trimNewLine, Cancellatio } } - return isEmpty; + return new ScanContentResult (formats, isEmpty); } async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellationToken) { + ScanContentResult result; Stream content; - bool isEmpty; if (persistent) { long begin = GetOffset (inputIndex); long end; using (var measured = new MeasuringStream ()) { - isEmpty = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); + result = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); end = begin + measured.Length; } content = new BoundStream (stream, begin, end, true); } else { content = new MemoryBlockStream (); - isEmpty = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); + result = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); content.Seek (0, SeekOrigin.Begin); } - if (!isEmpty) - part.Content = new MimeContent (content, part.ContentTransferEncoding); + if (!result.IsEmpty) + part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; else content.Dispose (); } @@ -353,8 +354,8 @@ async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken ca async Task MultipartScanEpilogueAsync (Multipart multipart, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { - var isEmpty = await ScanContentAsync (memory, true, cancellationToken).ConfigureAwait (false); - multipart.RawEpilogue = isEmpty ? null : memory.ToArray (); + var result = await ScanContentAsync (memory, true, cancellationToken).ConfigureAwait (false); + multipart.RawEpilogue = result.IsEmpty ? null : memory.ToArray (); } } diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index 2059831261..42681213ea 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -436,6 +436,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = // Note: see rfc2015 or rfc3156, section 5.1 var options = FormatOptions.CloneDefault (); options.NewLineFormat = NewLineFormat.Dos; + options.VerifyingSignature = true; this[0].WriteTo (options, cleartext); cleartext.Position = 0; @@ -501,6 +502,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = // Note: see rfc2015 or rfc3156, section 5.1 var options = FormatOptions.CloneDefault (); options.NewLineFormat = NewLineFormat.Dos; + options.VerifyingSignature = true; await this[0].WriteToAsync (options, cleartext, cancellationToken); cleartext.Position = 0; diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index dc517f1fe0..f57c840294 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -50,6 +50,12 @@ public enum NewLineFormat : byte { /// The DOS New-Line format ("\r\n"). ///
Dos, + + /// + /// A mixed New-Line format where some lines use Unix-based line endings and + /// other lines use DOS-based line endings. + /// + Mixed, } /// @@ -73,6 +79,7 @@ public class FormatOptions ParameterEncodingMethod parameterEncodingMethod; bool allowMixedHeaderCharsets; NewLineFormat newLineFormat; + bool verifyingSignature; bool ensureNewLine; bool international; int maxLineLength; @@ -115,13 +122,16 @@ public int MaxLineLength { } /// - /// Gets or sets the new-line format. + /// Get or set the new-line format. /// /// /// Specifies the new-line encoding to use when writing the message /// or entity to a stream. /// /// The new-line format. + /// + /// is not a valid . + /// /// /// cannot be changed. /// @@ -131,12 +141,19 @@ public NewLineFormat NewLineFormat { if (this == Default) throw new InvalidOperationException ("The default formatting options cannot be changed."); - newLineFormat = value; + switch (newLineFormat) { + case NewLineFormat.Unix: + case NewLineFormat.Dos: + newLineFormat = value; + break; + default: + throw new ArgumentOutOfRangeException (nameof (value)); + } } } /// - /// Gets or sets whether the formatter should ensure that messages end with a new-line sequence. + /// Get or set whether the formatter should ensure that messages end with a new-line sequence. /// /// /// By default, when writing a to a stream, the serializer attempts to @@ -178,8 +195,13 @@ internal byte[] NewLineBytes { get { return NewLineFormats[(int) NewLineFormat]; } } + internal bool VerifyingSignature { + get { return verifyingSignature; } + set { verifyingSignature = value; } + } + /// - /// Gets the message headers that should be hidden. + /// Get the message headers that should be hidden. /// /// /// Specifies the set of headers that should be removed when @@ -194,7 +216,7 @@ public HashSet HiddenHeaders { } /// - /// Gets or sets whether the new "Internationalized Email" formatting standards should be used. + /// Get or set whether the new "Internationalized Email" formatting standards should be used. /// /// /// The new "Internationalized Email" format is defined by @@ -220,7 +242,7 @@ public bool International { } /// - /// Gets or sets whether the formatter should allow mixed charsets in the headers. + /// Get or set whether the formatter should allow mixed charsets in the headers. /// /// /// When this option is enabled, the MIME formatter will try to use us-ascii and/or @@ -246,7 +268,7 @@ public bool AllowMixedHeaderCharsets { } /// - /// The method to use for encoding Content-Type and Content-Disposition parameter values. + /// Get or set the method to use for encoding Content-Type and Content-Disposition parameter values. /// /// /// The method to use for encoding Content-Type and Content-Disposition parameter @@ -322,6 +344,7 @@ public FormatOptions Clone () options.HiddenHeaders = new HashSet (HiddenHeaders); options.allowMixedHeaderCharsets = allowMixedHeaderCharsets; options.parameterEncodingMethod = parameterEncodingMethod; + options.verifyingSignature = verifyingSignature; options.international = international; return options; } diff --git a/MimeKit/IMimeContent.cs b/MimeKit/IMimeContent.cs index 450c1748ca..6ff05443c5 100644 --- a/MimeKit/IMimeContent.cs +++ b/MimeKit/IMimeContent.cs @@ -41,7 +41,7 @@ namespace MimeKit { public interface IMimeContent { /// - /// Gets the content encoding. + /// Get the content encoding. /// /// /// If the is not encoded, this value will be @@ -52,7 +52,18 @@ public interface IMimeContent ContentEncoding Encoding { get; } /// - /// Gets the content stream. + /// Get the new-line format, if known. + /// + /// + /// This property is typically only set by the as it parses + /// the content of a and is only used as a hint when verifying + /// digital signatures. + /// + /// The new-line format, if known. + NewLineFormat? NewLineFormat { get; } + + /// + /// Get the content stream. /// /// /// Gets the content stream. @@ -61,7 +72,7 @@ public interface IMimeContent Stream Stream { get; } /// - /// Opens the decoded content stream. + /// Open the decoded content stream. /// /// /// Provides a means of reading the decoded content without having to first write it to another @@ -71,7 +82,7 @@ public interface IMimeContent Stream Open (); /// - /// Decodes the content stream into another stream. + /// Decode the content stream into another stream. /// /// /// If the content stream is encoded, this method will decode it into the output stream @@ -95,7 +106,7 @@ public interface IMimeContent void DecodeTo (Stream stream, CancellationToken cancellationToken = default (CancellationToken)); /// - /// Asynchronously decodes the content stream into another stream. + /// Asynchronously decode the content stream into another stream. /// /// /// If the content stream is encoded, this method will decode it into the output stream @@ -120,7 +131,7 @@ public interface IMimeContent Task DecodeToAsync (Stream stream, CancellationToken cancellationToken = default (CancellationToken)); /// - /// Copies the content stream to the specified output stream. + /// Copy the content stream to the specified output stream. /// /// /// This is equivalent to simply using @@ -142,7 +153,7 @@ public interface IMimeContent void WriteTo (Stream stream, CancellationToken cancellationToken = default (CancellationToken)); /// - /// Asynchronously copies the content stream to the specified output stream. + /// Asynchronously copy the content stream to the specified output stream. /// /// /// This is equivalent to simply using diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index 306cd7df56..33d4f12409 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -113,7 +113,7 @@ public MimeContent (Stream stream, ContentEncoding encoding = ContentEncoding.De #region IContentObject implementation /// - /// Gets or sets the content encoding. + /// Get or set the content encoding. /// /// /// If the was parsed from an existing stream, the @@ -126,7 +126,18 @@ public ContentEncoding Encoding { } /// - /// Gets the content stream. + /// Get the new-line format, if known. + /// + /// + /// This property is typically only set by the as it parses + /// the content of a and is only used as a hint when verifying + /// digital signatures. + /// + /// The new-line format, if known. + public NewLineFormat? NewLineFormat { get; set; } + + /// + /// Get the content stream. /// /// /// Gets the content stream. @@ -137,7 +148,7 @@ public Stream Stream { } /// - /// Opens the decoded content stream. + /// Open the decoded content stream. /// /// /// Provides a means of reading the decoded content without having to first write it to another @@ -155,7 +166,7 @@ public Stream Open () } /// - /// Copies the content stream to the specified output stream. + /// Copy the content stream to the specified output stream. /// /// /// This is equivalent to simply using @@ -218,7 +229,7 @@ public Stream Open () } /// - /// Asynchronously copies the content stream to the specified output stream. + /// Asynchronously copy the content stream to the specified output stream. /// /// /// This is equivalent to simply using @@ -269,7 +280,7 @@ public Stream Open () } /// - /// Decodes the content stream into another stream. + /// Decode the content stream into another stream. /// /// /// If the content stream is encoded, this method will decode it into the output stream @@ -303,7 +314,7 @@ public Stream Open () } /// - /// Asynchronously decodes the content stream into another stream. + /// Asynchronously decode the content stream into another stream. /// /// /// If the content stream is encoded, this method will decode it into the output stream diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index f26839b209..58230639c6 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1121,7 +1121,7 @@ int GetMaxBoundaryLength () return bounds.Count > 0 ? bounds[0].MaxLength + 2 : 0; } - unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref bool midline) + unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref bool midline, ref bool[] formats) { int length = inputEnd - inputIndex; byte* inptr = inbuf + inputIndex; @@ -1168,6 +1168,11 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b if ((boundary = CheckBoundary (startIndex, start, length)) != BoundaryType.None) break; + if (length > 0 && *(inptr - 1) == (byte) '\r') + formats[(int) NewLineFormat.Dos] = true; + else + formats[(int) NewLineFormat.Unix] = true; + length++; inptr++; } else { @@ -1189,10 +1194,30 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b inputIndex = startIndex; } - unsafe bool ScanContent (byte* inbuf, Stream content, bool trimNewLine, CancellationToken cancellationToken) + class ScanContentResult + { + public readonly NewLineFormat? Format; + public readonly bool IsEmpty; + + public ScanContentResult (bool[] formats, bool isEmpty) + { + if (formats[(int) NewLineFormat.Unix] && formats[(int) NewLineFormat.Dos]) + Format = NewLineFormat.Mixed; + else if (formats[(int) NewLineFormat.Unix]) + Format = NewLineFormat.Unix; + else if (formats[(int) NewLineFormat.Dos]) + Format = NewLineFormat.Dos; + else + Format = null; + IsEmpty = isEmpty; + } + } + + unsafe ScanContentResult ScanContent (byte* inbuf, Stream content, bool trimNewLine, CancellationToken cancellationToken) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); int contentIndex = inputIndex; + var formats = new bool[2]; bool midline = false; int nleft; @@ -1207,7 +1232,7 @@ unsafe bool ScanContent (byte* inbuf, Stream content, bool trimNewLine, Cancella break; } - ScanContent (inbuf, ref contentIndex, ref nleft, ref midline); + ScanContent (inbuf, ref contentIndex, ref nleft, ref midline, ref formats); } while (boundary == BoundaryType.None); if (contentIndex < inputIndex) @@ -1225,11 +1250,12 @@ unsafe bool ScanContent (byte* inbuf, Stream content, bool trimNewLine, Cancella } } - return isEmpty; + return new ScanContentResult (formats, isEmpty); } unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken cancellationToken) { + ScanContentResult result; Stream content; bool isEmpty; @@ -1238,19 +1264,19 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can long end; using (var measured = new MeasuringStream ()) { - isEmpty = ScanContent (inbuf, measured, true, cancellationToken); + result = ScanContent (inbuf, measured, true, cancellationToken); end = begin + measured.Length; } content = new BoundStream (stream, begin, end, true); } else { content = new MemoryBlockStream (); - isEmpty = ScanContent (inbuf, content, true, cancellationToken); + result = ScanContent (inbuf, content, true, cancellationToken); content.Seek (0, SeekOrigin.Begin); } - if (!isEmpty) - part.Content = new MimeContent (content, part.ContentTransferEncoding); + if (!result.IsEmpty) + part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; else content.Dispose (); } @@ -1331,8 +1357,8 @@ unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, Cancellatio unsafe void MultipartScanEpilogue (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { - var isEmpty = ScanContent (inbuf, memory, true, cancellationToken); - multipart.RawEpilogue = isEmpty ? null : memory.ToArray (); + var result = ScanContent (inbuf, memory, true, cancellationToken); + multipart.RawEpilogue = result.IsEmpty ? null : memory.ToArray (); } } diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index e7c2f281d3..aeb0a5c24f 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -537,15 +537,6 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = ContentTransferEncoding = best; } - bool IsTextBasedContent { - get { - if (encoding != ContentEncoding.Binary && encoding != ContentEncoding.Default) - return true; - - return ContentType.IsMimeType ("text", "*") || ContentType.IsMimeType ("message", "*"); - } - } - /// /// Writes the to the specified output stream. /// @@ -614,9 +605,15 @@ bool IsTextBasedContent { stream.Write (options.NewLineBytes, 0, options.NewLineBytes.Length); } } - } else if (encoding == ContentEncoding.Binary || !IsTextBasedContent) { + } else if (encoding == ContentEncoding.Binary) { // Do not alter binary content. Content.WriteTo (stream, cancellationToken); + } else if (options.VerifyingSignature && Content.NewLineFormat.HasValue && Content.NewLineFormat.Value == NewLineFormat.Mixed) { + // Allow pass-through of the original parsed content without canonicalization when verifying signatures + // if the content contains a mix of line-endings. + // + // See https://github.com/jstedfast/MimeKit/issues/569 for details. + Content.WriteTo (stream, cancellationToken); } else { using (var filtered = new FilteredStream (stream)) { // Note: if we are writing the top-level MimePart, make sure it ends with a new-line so that @@ -685,9 +682,15 @@ bool IsTextBasedContent { await stream.WriteAsync (buffer, 0, buffer.Length, cancellationToken).ConfigureAwait (false); await stream.WriteAsync (options.NewLineBytes, 0, options.NewLineBytes.Length, cancellationToken).ConfigureAwait (false); } - } else if (encoding == ContentEncoding.Binary || !IsTextBasedContent) { + } else if (encoding == ContentEncoding.Binary) { // Do not alter binary content. await Content.WriteToAsync (stream, cancellationToken).ConfigureAwait (false); + } else if (options.VerifyingSignature && Content.NewLineFormat.HasValue && Content.NewLineFormat.Value == NewLineFormat.Mixed) { + // Allow pass-through of the original parsed content without canonicalization when verifying signatures + // if the content contains a mix of line-endings. + // + // See https://github.com/jstedfast/MimeKit/issues/569 for details. + await Content.WriteToAsync (stream, cancellationToken).ConfigureAwait (false); } else { using (var filtered = new FilteredStream (stream)) { // Note: if we are writing the top-level MimePart, make sure it ends with a new-line so that From ec5ac754fccc1145e4546a3d0feaafea91185211 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 23 May 2020 23:14:03 -0400 Subject: [PATCH 550/741] Decode IDN-encoded local-parts in addrspecs when parsing We already decoded IDN domains, but did not do it for local-parts. Now we do it for both. Also added new MailboxAddress.GetAddress(bool idnEncode) for use with the SmtpClient in MailKit. Should fix https://github.com/jstedfast/MailKit/issues/1026 --- MimeKit/InternetAddress.cs | 3 ++ MimeKit/MailboxAddress.cs | 36 ++++++++------ UnitTests/MailboxAddressTests.cs | 84 +++++++++++++++++++++++++------- 3 files changed, 92 insertions(+), 31 deletions(-) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index c1f1c98c01..00ead20f2d 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -356,6 +356,9 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex localpart = token.ToString (); + if (ParseUtils.IsIdnEncoded (localpart)) + localpart = ParseUtils.IdnDecode (localpart); + return true; } diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index c78a68cf0f..8497dd474b 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -254,11 +254,9 @@ public string Address { if (value.Length > 0) { var buffer = CharsetUtils.UTF8.GetBytes (value); - string addrspec; int index = 0; - int atIndex; - TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], true, out addrspec, out atIndex); + TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], true, out string addrspec, out int atIndex); if (index != buffer.Length) throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); @@ -339,10 +337,9 @@ public static string EncodeAddrspec (string addrspec) return addrspec; var buffer = CharsetUtils.UTF8.GetBytes (addrspec); - int at, index = 0; - string address; + int index = 0; - if (!TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], false, out address, out at)) + if (!TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], false, out string address, out int at)) return addrspec; return EncodeAddrspec (address, at); @@ -386,26 +383,37 @@ public static string DecodeAddrspec (string addrspec) return addrspec; var buffer = CharsetUtils.UTF8.GetBytes (addrspec); - int at, index = 0; - string address; + int index = 0; - if (!TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], false, out address, out at)) + if (!TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], false, out string address, out int at)) return addrspec; return DecodeAddrspec (address, at); } + /// + /// Get the mailbox address, optionally encoded according to IDN encoding rules. + /// + /// + /// If is true, then the returned mailbox address will be encoded according to the IDN encoding rules. + /// + /// true if the address should be encoded according to IDN encoding rules; otherwise, false. + /// The mailbox address. + public string GetAddress (bool idnEncode) + { + if (idnEncode) + return EncodeAddrspec (address, at); + + return DecodeAddrspec (address, at); + } + internal override void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength) { var route = Route.Encode (options); if (!string.IsNullOrEmpty (route)) route += ":"; - string addrspec; - if (options.International) - addrspec = DecodeAddrspec (address, at); - else - addrspec = EncodeAddrspec (address, at); + var addrspec = GetAddress (!options.International); if (!string.IsNullOrEmpty (Name)) { string name; diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 5b3141da25..07b1af976d 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Globalization; using System.Collections.Generic; using NUnit.Framework; @@ -563,36 +564,85 @@ public void TestParseGroupNameColon () AssertParseFailure (text, false, tokenIndex, errorIndex); } + [Test] + public void TestGetAddress () + { + var idn = new IdnMapping (); + MailboxAddress mailbox; + + mailbox = new MailboxAddress ("Unit Test", "點看@domain.com"); + Assert.AreEqual ("點看@domain.com", mailbox.GetAddress (false), "IDN-decode #1"); + Assert.AreEqual (idn.GetAscii ("點看") + "@domain.com", mailbox.GetAddress (true), "IDN-encode #1"); + + mailbox = new MailboxAddress ("Unit Test", idn.GetAscii ("點看") + "@domain.com"); + Assert.AreEqual ("點看@domain.com", mailbox.GetAddress (false), "IDN-decode #2"); + Assert.AreEqual (idn.GetAscii ("點看") + "@domain.com", mailbox.GetAddress (true), "IDN-encode #2"); + + mailbox = new MailboxAddress ("Unit Test", "user@名がドメイン.com"); + Assert.AreEqual ("user@名がドメイン.com", mailbox.GetAddress (false), "IDN-decode #3"); + Assert.AreEqual ("user@" + idn.GetAscii ("名がドメイン.com"), mailbox.GetAddress (true), "IDN-encode #3"); + + mailbox = new MailboxAddress ("Unit Test", "user@" + idn.GetAscii ("名がドメイン.com")); + Assert.AreEqual ("user@名がドメイン.com", mailbox.GetAddress (false), "IDN-decode #4"); + Assert.AreEqual ("user@" + idn.GetAscii ("名がドメイン.com"), mailbox.GetAddress (true), "IDN-encode #4"); + + mailbox = new MailboxAddress ("Unit Test", "點看@名がドメイン.com"); + Assert.AreEqual ("點看@名がドメイン.com", mailbox.GetAddress (false), "IDN-decode #5"); + Assert.AreEqual (idn.GetAscii ("點看") + "@" + idn.GetAscii ("名がドメイン.com"), mailbox.GetAddress (true), "IDN-encode #5"); + + mailbox = new MailboxAddress ("Unit Test", idn.GetAscii ("點看") + "@" + idn.GetAscii ("名がドメイン.com")); + Assert.AreEqual ("點看@名がドメイン.com", mailbox.GetAddress (false), "IDN-decode #6"); + Assert.AreEqual (idn.GetAscii ("點看") + "@" + idn.GetAscii ("名がドメイン.com"), mailbox.GetAddress (true), "IDN-encode #6"); + } + [Test] public void TestIsInternational () { - var mailbox = new MailboxAddress ("Kristoffer Brånemyr", "brånemyr@swipenet.se"); - const string expected = "Kristoffer Brånemyr "; var options = FormatOptions.Default.Clone (); + options.International = true; + var idn = new IdnMapping (); + MailboxAddress mailbox; string encoded; - options.International = true; + // Test IsInternational local-parts + mailbox = new MailboxAddress ("Unit Test", "點看@domain.com"); + Assert.IsTrue (mailbox.IsInternational, "IsInternational local-part"); + encoded = mailbox.ToString (options, true); + Assert.AreEqual ("Unit Test <點看@domain.com>", encoded, "ToString local-part"); + // Test IsInternational IDN-encoded local-parts + mailbox = new MailboxAddress ("Unit Test", idn.GetAscii ("點看") + "@domain.com"); + Assert.IsTrue (mailbox.IsInternational, "IsInternational IDN-encoded local-part"); encoded = mailbox.ToString (options, true); - Assert.AreEqual (expected, encoded, "ToString"); + Assert.AreEqual ("Unit Test <點看@domain.com>", encoded, "ToString IDN-encoded local-part"); - Assert.IsTrue (mailbox.IsInternational, "IsInternational"); + // Test IsInternational domain + mailbox = new MailboxAddress ("Unit Test", "user@名がドメイン.com"); + Assert.IsTrue (mailbox.IsInternational, "IsInternational domain"); + encoded = mailbox.ToString (options, true); + Assert.AreEqual ("Unit Test ", encoded, "ToString domain"); - mailbox = new MailboxAddress ("Kristoffer Brånemyr", "ztion@swipenet.se"); + // Test IsInternational IDN-encoded domain + mailbox = new MailboxAddress ("Unit Test", "user@" + idn.GetAscii ("名がドメイン.com")); + Assert.IsTrue (mailbox.IsInternational, "IsInternational IDN-encoded domain"); + encoded = mailbox.ToString (options, true); + Assert.AreEqual ("Unit Test ", encoded, "ToString IDN-encoded domain"); + // Test IsInternational routes + mailbox = new MailboxAddress ("Unit Test", "user@domain.com"); Assert.IsFalse (mailbox.IsInternational, "IsInternational"); - - mailbox.Route.Add ("kristoffer"); // non-international route - mailbox.Route.Add ("brånemyr"); // international route - - Assert.IsTrue (mailbox.IsInternational, "IsInternational"); + mailbox.Route.Add ("route1"); // non-international route + mailbox.Route.Add ("名がドメイン.com"); // international route + Assert.IsTrue (mailbox.IsInternational, "IsInternational route"); + encoded = mailbox.ToString (options, true); + Assert.AreEqual ("Unit Test <@route1,@名がドメイン.com:user@domain.com>", encoded, "ToString route"); } [Test] public void TestIdnEncoding () { - //const string userAscii = "xn--c1yn36f@domain"; - //const string userUnicode = "點看@domain"; + const string userAscii = "xn--c1yn36f@domain.com"; + const string userUnicode = "點看@domain.com"; const string domainAscii = "user@xn--v8jxj3d1dzdz08w.com"; const string domainUnicode = "user@名がドメイン.com"; string encoded; @@ -603,11 +653,11 @@ public void TestIdnEncoding () encoded = MailboxAddress.DecodeAddrspec (domainAscii); Assert.AreEqual (domainUnicode, encoded, "Domain (Decode)"); - //encoded = MailboxAddress.EncodeAddrspec (userUnicode); - //Assert.AreEqual (userAscii, encoded, "Local-part (Encode)"); + encoded = MailboxAddress.EncodeAddrspec (userUnicode); + Assert.AreEqual (userAscii, encoded, "Local-part (Encode)"); - //encoded = MailboxAddress.DecodeAddrspec (userAscii); - //Assert.AreEqual (userUnicode, encoded, "Local-part (Decode)"); + encoded = MailboxAddress.DecodeAddrspec (userAscii); + Assert.AreEqual (userUnicode, encoded, "Local-part (Decode)"); } [Test] From df9f540dd8b6dfc091d2ec706be5a7adba5eb05c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 08:57:30 -0400 Subject: [PATCH 551/741] Improved subclassability of OpenPgpContext Made a number of OpenPgpContext methods virtual as well as reduced code duplication by making more code use the EnumeratePublic/SecretKey/KeyRings() methods so that fewer code would need to be overridden in a subclass to make things work. Should improve the situation for issue #571 --- MimeKit/Cryptography/OpenPgpContext.cs | 71 ++++++++++---------------- 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 3bc79a1a58..1a46a9c91b 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -549,7 +549,7 @@ async Task GetPublicKeyRingAsync (long keyId, bool doAsync, /// Enumerates all public keyrings. /// /// The list of available public keyrings. - public IEnumerable EnumeratePublicKeyRings () + public virtual IEnumerable EnumeratePublicKeyRings () { foreach (PgpPublicKeyRing keyring in PublicKeyRingBundle.GetKeyRings ()) yield return keyring; @@ -564,7 +564,7 @@ public IEnumerable EnumeratePublicKeyRings () /// Enumerates all public keys. /// /// The list of available public keys. - public IEnumerable EnumeratePublicKeys () + public virtual IEnumerable EnumeratePublicKeys () { foreach (var keyring in EnumeratePublicKeyRings ()) { foreach (PgpPublicKey key in keyring.GetPublicKeys ()) @@ -585,7 +585,7 @@ public IEnumerable EnumeratePublicKeys () /// /// is null. /// - public IEnumerable EnumeratePublicKeyRings (MailboxAddress mailbox) + public virtual IEnumerable EnumeratePublicKeyRings (MailboxAddress mailbox) { if (mailbox == null) throw new ArgumentNullException (nameof (mailbox)); @@ -609,7 +609,7 @@ public IEnumerable EnumeratePublicKeyRings (MailboxAddress mai /// /// is null. /// - public IEnumerable EnumeratePublicKeys (MailboxAddress mailbox) + public virtual IEnumerable EnumeratePublicKeys (MailboxAddress mailbox) { foreach (var keyring in EnumeratePublicKeyRings (mailbox)) { foreach (PgpPublicKey key in keyring.GetPublicKeys ()) @@ -626,7 +626,7 @@ public IEnumerable EnumeratePublicKeys (MailboxAddress mailbox) /// Enumerates all secret keyrings. /// /// The list of available secret keyrings. - public IEnumerable EnumerateSecretKeyRings () + public virtual IEnumerable EnumerateSecretKeyRings () { foreach (PgpSecretKeyRing keyring in SecretKeyRingBundle.GetKeyRings ()) yield return keyring; @@ -641,7 +641,7 @@ public IEnumerable EnumerateSecretKeyRings () /// Enumerates all secret keys. /// /// The list of available secret keys. - public IEnumerable EnumerateSecretKeys () + public virtual IEnumerable EnumerateSecretKeys () { foreach (var keyring in EnumerateSecretKeyRings ()) { foreach (PgpSecretKey key in keyring.GetSecretKeys ()) @@ -662,7 +662,7 @@ public IEnumerable EnumerateSecretKeys () /// /// is null. /// - public IEnumerable EnumerateSecretKeyRings (MailboxAddress mailbox) + public virtual IEnumerable EnumerateSecretKeyRings (MailboxAddress mailbox) { if (mailbox == null) throw new ArgumentNullException (nameof (mailbox)); @@ -686,7 +686,7 @@ public IEnumerable EnumerateSecretKeyRings (MailboxAddress mai /// /// is null. /// - public IEnumerable EnumerateSecretKeys (MailboxAddress mailbox) + public virtual IEnumerable EnumerateSecretKeys (MailboxAddress mailbox) { foreach (var keyring in EnumerateSecretKeyRings (mailbox)) { foreach (PgpSecretKey key in keyring.GetSecretKeys ()) @@ -764,9 +764,7 @@ internal protected virtual IList GetPublicKeys (IEnumerable 16) { var fingerprint = HexEncode (key.PublicKey.GetFingerprint ()); @@ -779,9 +777,7 @@ static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) } foreach (string userId in key.UserIds) { - MailboxAddress email; - - if (!MailboxAddress.TryParse (userId, out email)) + if (!MailboxAddress.TryParse (userId, out var email)) continue; if (mailbox.Address.Equals (email.Address, StringComparison.OrdinalIgnoreCase)) @@ -810,11 +806,8 @@ internal protected virtual PgpSecretKey GetSigningKey (MailboxAddress mailbox) if (mailbox == null) throw new ArgumentNullException (nameof (mailbox)); - foreach (PgpSecretKeyRing keyring in SecretKeyRingBundle.GetKeyRings ()) { + foreach (var keyring in EnumerateSecretKeyRings (mailbox)) { foreach (PgpSecretKey key in keyring.GetSecretKeys ()) { - if (!PgpSecretKeyMatches (keyring.GetSecretKey (), mailbox)) - continue; - if (!key.IsSigningKey) continue; @@ -893,11 +886,9 @@ protected PgpPrivateKey GetPrivateKey (PgpSecretKey key) PgpSecretKey GetSecretKey (long keyId) { - foreach (PgpSecretKeyRing keyring in SecretKeyRingBundle.GetKeyRings ()) { - foreach (PgpSecretKey key in keyring.GetSecretKeys ()) { - if (key.KeyId == keyId) - return key; - } + foreach (var key in EnumerateSecretKeys ()) { + if (key.KeyId == keyId) + return key; } throw new PrivateKeyNotFoundException (keyId, "The private key could not be found."); @@ -1124,8 +1115,7 @@ public void SignKey (PgpSecretKey secretKey, PgpPublicKey publicKey, DigestAlgor if (keyring == null) keyring = new PgpPublicKeyRing (signedKey.GetEncoded ()); - PublicKeyRingBundle = PgpPublicKeyRingBundle.AddPublicKeyRing (PublicKeyRingBundle, keyring); - SavePublicKeyRingBundle (); + Import (keyring); } /// @@ -1178,20 +1168,15 @@ public override bool CanSign (MailboxAddress signer) if (signer == null) throw new ArgumentNullException (nameof (signer)); - foreach (PgpSecretKeyRing keyring in SecretKeyRingBundle.GetKeyRings ()) { - foreach (PgpSecretKey key in keyring.GetSecretKeys ()) { - if (!PgpSecretKeyMatches (keyring.GetSecretKey (), signer)) - continue; - - if (!key.IsSigningKey) - continue; + foreach (var key in EnumerateSecretKeys (signer)) { + if (!key.IsSigningKey) + continue; - var pubkey = key.PublicKey; - if (pubkey.IsRevoked () || IsExpired (pubkey)) - continue; + var pubkey = key.PublicKey; + if (pubkey.IsRevoked () || IsExpired (pubkey)) + continue; - return true; - } + return true; } return false; @@ -2410,7 +2395,7 @@ protected void SaveSecretKeyRingBundle () /// /// is null. /// - public void Import (PgpPublicKeyRing keyring) + public virtual void Import (PgpPublicKeyRing keyring) { if (keyring == null) throw new ArgumentNullException (nameof (keyring)); @@ -2429,7 +2414,7 @@ public void Import (PgpPublicKeyRing keyring) /// /// is null. /// - public void Import (PgpPublicKeyRingBundle bundle) + public virtual void Import (PgpPublicKeyRingBundle bundle) { if (bundle == null) throw new ArgumentNullException (nameof (bundle)); @@ -2479,7 +2464,7 @@ public override void Import (Stream stream) /// /// is null. /// - public void Import (PgpSecretKeyRing keyring) + public virtual void Import (PgpSecretKeyRing keyring) { if (keyring == null) throw new ArgumentNullException (nameof (keyring)); @@ -2498,7 +2483,7 @@ public void Import (PgpSecretKeyRing keyring) /// /// is null. /// - public void Import (PgpSecretKeyRingBundle bundle) + public virtual void Import (PgpSecretKeyRingBundle bundle) { if (bundle == null) throw new ArgumentNullException (nameof (bundle)); @@ -2705,7 +2690,7 @@ public void Export (PgpPublicKeyRingBundle keys, Stream stream, bool armor) /// /// is null. /// - public void Delete (PgpPublicKeyRing keyring) + public virtual void Delete (PgpPublicKeyRing keyring) { if (keyring == null) throw new ArgumentNullException (nameof (keyring)); @@ -2724,7 +2709,7 @@ public void Delete (PgpPublicKeyRing keyring) /// /// is null. /// - public void Delete (PgpSecretKeyRing keyring) + public virtual void Delete (PgpSecretKeyRing keyring) { if (keyring == null) throw new ArgumentNullException (nameof (keyring)); From 1f5fd36c7fa1aa2a3073c6d879d63d9600bd24d0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 11:17:25 -0400 Subject: [PATCH 552/741] Added support for RSACng Fixes issue #567 --- .../AsymmetricAlgorithmExtensions.cs | 104 ++++++++++-------- MimeKit/MimeKit.NetStandard.csproj | 31 +++--- MimeKit/MimeKitLite.NetStandard.csproj | 13 ++- nuget/MimeKit.nuspec | 19 ++-- nuget/MimeKitLite.nuspec | 15 ++- 5 files changed, 101 insertions(+), 81 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 249acc0652..474b6f2334 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -41,6 +41,7 @@ namespace MimeKit.Cryptography /// public static class AsymmetricAlgorithmExtensions { +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 static void GetAsymmetricKeyParameters (DSA dsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var dp = dsa.ExportParameters (!publicOnly); @@ -57,24 +58,21 @@ static void GetAsymmetricKeyParameters (DSA dsa, bool publicOnly, out Asymmetric static AsymmetricKeyParameter GetAsymmetricKeyParameter (DSACryptoServiceProvider dsa) { - AsymmetricKeyParameter pub, key; - - GetAsymmetricKeyParameters (dsa, dsa.PublicOnly, out pub, out key); + GetAsymmetricKeyParameters (dsa, dsa.PublicOnly, out var pub, out var key); return dsa.PublicOnly ? pub : key; } static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACryptoServiceProvider dsa) { - AsymmetricKeyParameter pub, key; - if (dsa.PublicOnly) throw new ArgumentException ("DSA key is not a private key.", "key"); - GetAsymmetricKeyParameters (dsa, dsa.PublicOnly, out pub, out key); + GetAsymmetricKeyParameters (dsa, dsa.PublicOnly, out var pub, out var key); return new AsymmetricCipherKeyPair (pub, key); } +#endif static void GetAsymmetricKeyParameters (RSA rsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { @@ -95,42 +93,36 @@ static void GetAsymmetricKeyParameters (RSA rsa, bool publicOnly, out Asymmetric ); } +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACryptoServiceProvider rsa) { - AsymmetricKeyParameter pub, key; - - GetAsymmetricKeyParameters (rsa, rsa.PublicOnly, out pub, out key); + GetAsymmetricKeyParameters (rsa, rsa.PublicOnly, out var pub, out var key); return rsa.PublicOnly ? pub : key; } static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvider rsa) { - AsymmetricKeyParameter pub, key; - if (rsa.PublicOnly) throw new ArgumentException ("RSA key is not a private key.", "key"); - GetAsymmetricKeyParameters (rsa, rsa.PublicOnly, out pub, out key); + GetAsymmetricKeyParameters (rsa, rsa.PublicOnly, out var pub, out var key); return new AsymmetricCipherKeyPair (pub, key); } +#endif -#if NET46 || NET47 || NET48 || NETCOREAPP3_0 || __MOBILE__ +#if !NET45 static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACng rsa) { - AsymmetricKeyParameter pub, key; - - GetAsymmetricKeyParameters (rsa, false, out pub, out key); + GetAsymmetricKeyParameters (rsa, false, out _, out var key); return key; } static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACng rsa) { - AsymmetricKeyParameter pub, key; - - GetAsymmetricKeyParameters (rsa, false, out pub, out key); + GetAsymmetricKeyParameters (rsa, false, out var pub, out var key); return new AsymmetricCipherKeyPair (pub, key); } @@ -156,15 +148,17 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl if (key == null) throw new ArgumentNullException (nameof (key)); - if (key is DSACryptoServiceProvider) - return GetAsymmetricKeyParameter ((DSACryptoServiceProvider) key); +#if !NET45 + if (key is RSACng rsaCng) + return GetAsymmetricKeyParameter (rsaCng); +#endif - if (key is RSACryptoServiceProvider) - return GetAsymmetricKeyParameter ((RSACryptoServiceProvider) key); +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + if (key is RSACryptoServiceProvider rsaKey) + return GetAsymmetricKeyParameter (rsaKey); -#if NET46 || NET47 || NET48 || NETCOREAPP3_0 || __MOBILE__ - if (key is RSACng) - return GetAsymmetricKeyParameter ((RSACng) key); + if (key is DSACryptoServiceProvider dsaKey) + return GetAsymmetricKeyParameter (dsaKey); #endif // TODO: support ECDiffieHellman and ECDsa? @@ -195,15 +189,17 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric if (key == null) throw new ArgumentNullException (nameof (key)); - if (key is DSACryptoServiceProvider) - return GetAsymmetricCipherKeyPair ((DSACryptoServiceProvider) key); +#if !NET45 + if (key is RSACng rsaCng) + return GetAsymmetricCipherKeyPair (rsaCng); +#endif - if (key is RSACryptoServiceProvider) - return GetAsymmetricCipherKeyPair ((RSACryptoServiceProvider) key); +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + if (key is RSACryptoServiceProvider rsaKey) + return GetAsymmetricCipherKeyPair (rsaKey); -#if NET46 || NET47 || NET48 || NETCOREAPP3_0 || __MOBILE__ - if (key is RSACng) - return GetAsymmetricCipherKeyPair ((RSACng) key); + if (key is DSACryptoServiceProvider dsaKey) + return GetAsymmetricCipherKeyPair (dsaKey); #endif // TODO: support ECDiffieHellman and ECDsa? @@ -225,6 +221,7 @@ static byte[] GetPaddedByteArray (BigInteger big, int length) return padded; } +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 static DSAParameters GetDSAParameters (DsaKeyParameters key) { var parameters = new DSAParameters (); @@ -265,6 +262,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPublicKeyParameters key) return dsa; } +#endif static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters key) { @@ -280,7 +278,12 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters ke parameters.DP = GetPaddedByteArray (key.DP, parameters.P.Length); parameters.DQ = GetPaddedByteArray (key.DQ, parameters.Q.Length); +#if NET45 var rsa = new RSACryptoServiceProvider (); +#else + var rsa = new RSACng (); +#endif + rsa.ImportParameters (parameters); return rsa; @@ -292,7 +295,12 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaKeyParameters key) parameters.Exponent = key.Exponent.ToByteArrayUnsigned (); parameters.Modulus = key.Modulus.ToByteArrayUnsigned (); +#if NET45 var rsa = new RSACryptoServiceProvider (); +#else + var rsa = new RSACng (); +#endif + rsa.ImportParameters (parameters); return rsa; @@ -319,17 +327,21 @@ public static AsymmetricAlgorithm AsAsymmetricAlgorithm (this AsymmetricKeyParam throw new ArgumentNullException (nameof (key)); if (key.IsPrivate) { - if (key is DsaPrivateKeyParameters) - return GetAsymmetricAlgorithm ((DsaPrivateKeyParameters) key, null); + if (key is RsaPrivateCrtKeyParameters rsaPrivateKey) + return GetAsymmetricAlgorithm (rsaPrivateKey); - if (key is RsaPrivateCrtKeyParameters) - return GetAsymmetricAlgorithm ((RsaPrivateCrtKeyParameters) key); +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + if (key is DsaPrivateKeyParameters dsaPrivateKey) + return GetAsymmetricAlgorithm (dsaPrivateKey, null); +#endif } else { - if (key is DsaPublicKeyParameters) - return GetAsymmetricAlgorithm ((DsaPublicKeyParameters) key); + if (key is RsaKeyParameters rsaPublicKey) + return GetAsymmetricAlgorithm (rsaPublicKey); - if (key is RsaKeyParameters) - return GetAsymmetricAlgorithm ((RsaKeyParameters) key); +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + if (key is DsaPublicKeyParameters dsaPublicKey) + return GetAsymmetricAlgorithm (dsaPublicKey); +#endif } throw new NotSupportedException (string.Format ("{0} is currently not supported.", key.GetType ().Name)); @@ -355,11 +367,13 @@ public static AsymmetricAlgorithm AsAsymmetricAlgorithm (this AsymmetricCipherKe if (key == null) throw new ArgumentNullException (nameof (key)); - if (key.Private is DsaPrivateKeyParameters) - return GetAsymmetricAlgorithm ((DsaPrivateKeyParameters) key.Private, (DsaPublicKeyParameters) key.Public); + if (key.Private is RsaPrivateCrtKeyParameters rsaPrivateKey) + return GetAsymmetricAlgorithm (rsaPrivateKey); - if (key.Private is RsaPrivateCrtKeyParameters) - return GetAsymmetricAlgorithm ((RsaPrivateCrtKeyParameters) key.Private); +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + if (key.Private is DsaPrivateKeyParameters dsaPrivateKey) + return GetAsymmetricAlgorithm (dsaPrivateKey, (DsaPublicKeyParameters) key.Public); +#endif throw new NotSupportedException (string.Format ("{0} is currently not supported.", key.GetType ().Name)); } diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 350567a1f4..9c6bf167c3 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -10,7 +10,7 @@ false MimeKit MimeKit - mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid + mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;net46;net47;net48;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false @@ -38,27 +38,26 @@ portable - + $(DefineConstants);ENABLE_SNM $(DefineConstants);ENABLE_SNM;SERIALIZABLE - - + + + - + - - - - - - + + + + @@ -76,7 +75,7 @@ - + @@ -135,10 +134,10 @@ - - - - + + + + diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 2dedf212fb..927596f0dd 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -44,10 +44,17 @@ $(DefineConstants);ENABLE_SNM;SERIALIZABLE - - + + - + + + + + + + + diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 7299789693..9fc5aa703b 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -35,7 +35,7 @@ Xamarin Inc. en-US - mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid + mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid @@ -86,24 +86,25 @@ - + + - + - + + - + - - - - + + + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 019d85c9fb..6c1b506e18 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -34,7 +34,7 @@ Xamarin Inc. en-US - mime mbox mail email parser tnef net45 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid + mime mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid @@ -61,19 +61,18 @@ - + - + - + - + - - - + + From ca7cb5afd8acd9ddfb9726e0d17359b937e4626a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 12:29:54 -0400 Subject: [PATCH 553/741] Updated appveyor.yml --- appveyor.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 7fd7d08b95..2ad97089a7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,8 +28,6 @@ test_script: regsvr32 .\packages\OpenCover.4.6.519\tools\x64\OpenCover.Profiler.dll - cd UnitTests\bin\Debug + .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml - ..\..\..\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"..\..\..\packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests.dll" -output:opencover.xml - - ..\..\..\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath ..\..\.. --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor + .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From 5c558ff56fc6f8efca6b01cb5acca08ffe4fd860 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 13:05:21 -0400 Subject: [PATCH 554/741] Added support for DSACng --- .../AsymmetricAlgorithmExtensions.cs | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 474b6f2334..d03de2089f 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -112,6 +112,22 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvi } #endif +#if NET47 || NET48 || NETSTANDARD2_0 + static AsymmetricKeyParameter GetAsymmetricKeyParameter (DSACng dsa) + { + GetAsymmetricKeyParameters (dsa, false, out _, out var key); + + return key; + } + + static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACng dsa) + { + GetAsymmetricKeyParameters (dsa, false, out var pub, out var key); + + return new AsymmetricCipherKeyPair (pub, key); + } +#endif + #if !NET45 static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACng rsa) { @@ -153,6 +169,11 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl return GetAsymmetricKeyParameter (rsaCng); #endif +#if NET47 || NET48 || NETSTANDARD2_0 + if (key is DSACng dsaCng) + return GetAsymmetricKeyParameter (dsaCng); +#endif + #if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key is RSACryptoServiceProvider rsaKey) return GetAsymmetricKeyParameter (rsaKey); @@ -194,6 +215,11 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric return GetAsymmetricCipherKeyPair (rsaCng); #endif +#if NET47 || NET48 || NETSTANDARD2_0 + if (key is DSACng dsaCng) + return GetAsymmetricCipherKeyPair (dsaCng); +#endif + #if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key is RSACryptoServiceProvider rsaKey) return GetAsymmetricCipherKeyPair (rsaKey); @@ -246,7 +272,12 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPrivateKeyParameters key, if (pub != null) parameters.Y = pub.Y.ToByteArrayUnsigned (); +#if NET45 || NET46 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); +#else + var dsa = new DSACng (); +#endif + dsa.ImportParameters (parameters); return dsa; @@ -257,14 +288,19 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPublicKeyParameters key) var parameters = GetDSAParameters (key); parameters.Y = key.Y.ToByteArrayUnsigned (); +#if NET45 || NET46 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); +#else + var dsa = new DSACng (); +#endif + dsa.ImportParameters (parameters); return dsa; } #endif - static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters key) + static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters key) { var parameters = new RSAParameters (); From 1d9a71e2fd6cfc63012b66cdac292816a49e619a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 13:32:08 -0400 Subject: [PATCH 555/741] Dropped Xamarin platforms since they are compatible with netstandard2.0 --- MimeKit.Mobile.sln | 68 ------ MimeKit.sln | 16 +- MimeKit/MimeKit.Android.csproj | 288 ----------------------- MimeKit/MimeKit.Android.project.json | 11 - MimeKit/MimeKit.Mac.csproj | 272 --------------------- MimeKit/MimeKit.Mac.project.json | 8 - MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKit.TvOS.csproj | 268 --------------------- MimeKit/MimeKit.TvOS.project.json | 8 - MimeKit/MimeKit.WatchOS.csproj | 271 --------------------- MimeKit/MimeKit.WatchOS.project.json | 8 - MimeKit/MimeKit.iOS.csproj | 284 ---------------------- MimeKit/MimeKit.iOS.project.json | 11 - MimeKit/MimeKitLite.Android.csproj | 219 ----------------- MimeKit/MimeKitLite.Android.project.json | 8 - MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.iOS.csproj | 220 ----------------- MimeKit/MimeKitLite.iOS.project.json | 8 - MimeKit/packages.MimeKit.Mac.config | 4 - MimeKit/packages.MimeKit.TvOS.config | 4 - MimeKit/packages.MimeKit.WatchOS.config | 4 - MimeKitLite.sln | 21 +- nuget/MimeKit.nuspec | 14 +- nuget/MimeKitLite.nuspec | 10 +- 24 files changed, 12 insertions(+), 2017 deletions(-) delete mode 100644 MimeKit.Mobile.sln delete mode 100644 MimeKit/MimeKit.Android.csproj delete mode 100644 MimeKit/MimeKit.Android.project.json delete mode 100644 MimeKit/MimeKit.Mac.csproj delete mode 100644 MimeKit/MimeKit.Mac.project.json delete mode 100644 MimeKit/MimeKit.TvOS.csproj delete mode 100644 MimeKit/MimeKit.TvOS.project.json delete mode 100644 MimeKit/MimeKit.WatchOS.csproj delete mode 100644 MimeKit/MimeKit.WatchOS.project.json delete mode 100644 MimeKit/MimeKit.iOS.csproj delete mode 100644 MimeKit/MimeKit.iOS.project.json delete mode 100644 MimeKit/MimeKitLite.Android.csproj delete mode 100644 MimeKit/MimeKitLite.Android.project.json delete mode 100644 MimeKit/MimeKitLite.iOS.csproj delete mode 100644 MimeKit/MimeKitLite.iOS.project.json delete mode 100644 MimeKit/packages.MimeKit.Mac.config delete mode 100644 MimeKit/packages.MimeKit.TvOS.config delete mode 100644 MimeKit/packages.MimeKit.WatchOS.config diff --git a/MimeKit.Mobile.sln b/MimeKit.Mobile.sln deleted file mode 100644 index 77d7620476..0000000000 --- a/MimeKit.Mobile.sln +++ /dev/null @@ -1,68 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Android", "MimeKit\MimeKit.Android.csproj", "{004B4019-62B7-4A15-AF2C-C20968845C46}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.iOS", "MimeKit\MimeKit.iOS.csproj", "{4C1288AD-12C8-4BF7-AED7-6C4DC539C856}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle.Android", "submodules\bc-csharp\crypto\BouncyCastle.Android.csproj", "{A0D302CB-8866-4AB1-98B9-F0772EABF5DF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle.iOS", "submodules\bc-csharp\crypto\BouncyCastle.iOS.csproj", "{0249241C-205E-4AC0-828B-90F822359B9E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {004B4019-62B7-4A15-AF2C-C20968845C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Release|Any CPU.Build.0 = Release|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0249241C-205E-4AC0-828B-90F822359B9E}.Release|Any CPU.Build.0 = Release|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.Build.0 = Release|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0D302CB-8866-4AB1-98B9-F0772EABF5DF}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = MimeKit\MimeKit.iOS.csproj - Policies = $0 - $0.StandardHeader = $1 - $1.Text = @\n${FileName}\n \nAuthor: ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n - $1.IncludeInNewFiles = True - $0.TextStylePolicy = $2 - $2.inheritsSet = null - $2.scope = text/x-csharp - $0.CSharpFormattingPolicy = $3 - $3.NamespaceBraceStyle = EndOfLine - $3.StructBraceStyle = EndOfLine - $3.EnumBraceStyle = EndOfLine - $3.AfterDelegateDeclarationParameterComma = True - $3.BeforeSizeOfParentheses = True - $3.BeforeTypeOfParentheses = True - $3.SpacesBeforeBrackets = False - $3.SpacesAfterTypecast = True - $3.AlignToFirstIndexerArgument = True - $3.inheritsSet = Mono - $3.inheritsScope = text/x-csharp - $3.scope = text/x-csharp - $0.TextStylePolicy = $4 - $4.FileWidth = 120 - $4.TabsToSpaces = False - $4.EolMarker = Unix - $4.inheritsSet = VisualStudio - $4.inheritsScope = text/plain - $4.scope = text/plain - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MimeKit.sln b/MimeKit.sln index 92a80e9a87..944ad7ee3d 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -1,16 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "UnitTests\UnitTests.csproj", "{0225FDB7-CF63-4402-BB30-9B149AC06C2E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Android", "MimeKit\MimeKit.Android.csproj", "{004B4019-62B7-4A15-AF2C-C20968845C46}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.iOS", "MimeKit\MimeKit.iOS.csproj", "{4C1288AD-12C8-4BF7-AED7-6C4DC539C856}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit.NetStandard", "MimeKit\MimeKit.NetStandard.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" @@ -29,14 +25,6 @@ Global {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.Build.0 = Debug|Any CPU {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.ActiveCfg = Release|Any CPU {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.Build.0 = Release|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {004B4019-62B7-4A15-AF2C-C20968845C46}.Release|Any CPU.Build.0 = Release|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856}.Release|Any CPU.Build.0 = Release|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/MimeKit/MimeKit.Android.csproj b/MimeKit/MimeKit.Android.csproj deleted file mode 100644 index 3b19009cd8..0000000000 --- a/MimeKit/MimeKit.Android.csproj +++ /dev/null @@ -1,288 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {004B4019-62B7-4A15-AF2C-C20968845C46} - {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - Resources\Resource.designer.cs - Resource - Resources - Assets - MimeKit - v8.0 - - - - - true - full - false - bin\Debug\MonoAndroid - obj\Debug\MonoAndroid - DEBUG;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__MOBILE__;__ANDROID__ - true - prompt - 4 - - - true - portable - true - bin\Release\MonoAndroid - obj\Release\MonoAndroid - bin\Release\MonoAndroid\MimeKit.xml - SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__MOBILE__;__ANDROID__ - true - prompt - 4 - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.Android.project.json b/MimeKit/MimeKit.Android.project.json deleted file mode 100644 index b30c00839b..0000000000 --- a/MimeKit/MimeKit.Android.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "frameworks": { - "MonoAndroid,Version=v8.0": {} - }, - "runtimes": { - "win-anycpu": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} \ No newline at end of file diff --git a/MimeKit/MimeKit.Mac.csproj b/MimeKit/MimeKit.Mac.csproj deleted file mode 100644 index 9213ef01de..0000000000 --- a/MimeKit/MimeKit.Mac.csproj +++ /dev/null @@ -1,272 +0,0 @@ - - - - Debug - AnyCPU - {2CE98315-A444-44D3-8BCE-32389EDDA149} - {A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - MimeKit - v2.0 - Xamarin.Mac - Resources - - - true - full - false - bin\Debug\Xamarin.Mac - obj\Debug\Xamarin.Mac - DEBUG;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__MAC__ - true - prompt - 4 - - - true - portable - true - bin\Release\Xamarin.Mac - obj\Release\Xamarin.Mac - bin\Release\Xamarin.Mac\MimeKit.xml - SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__MAC__ - true - true - prompt - 4 - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.Mac.project.json b/MimeKit/MimeKit.Mac.project.json deleted file mode 100644 index 3cbe55fee9..0000000000 --- a/MimeKit/MimeKit.Mac.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - "Xamarin.Mac,Version=v2.0": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 9c6bf167c3..a7f22aaaea 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -10,7 +10,7 @@ false MimeKit MimeKit - mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;net46;net47;net48;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid + mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;net46;net47;net48;netstandard;netstandard1.3;netstandard1.6;netstandard2.0 https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false diff --git a/MimeKit/MimeKit.TvOS.csproj b/MimeKit/MimeKit.TvOS.csproj deleted file mode 100644 index 2d711b93d1..0000000000 --- a/MimeKit/MimeKit.TvOS.csproj +++ /dev/null @@ -1,268 +0,0 @@ - - - - Debug - AnyCPU - {ABEEAB21-341F-43E0-8851-0EDB3CE10AD4} - {06FA79CB-D6CD-4721-BB4B-1BD202089C55};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - MimeKit - Resources - - - true - full - false - bin\Debug\Xamarin.TvOS - obj\Debug\Xamarin.TvOS - DEBUG;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__TVOS__ - true - prompt - 4 - - - true - portable - true - bin\Release\Xamarin.TvOS - obj\Release\Xamarin.TvOS - bin\Release\Xamarin.TvOS\MimeKit.xml - SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__TVOS__ - true - true - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.TvOS.project.json b/MimeKit/MimeKit.TvOS.project.json deleted file mode 100644 index 3399c7bd27..0000000000 --- a/MimeKit/MimeKit.TvOS.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - "Xamarin.TVOS,Version=v1.0": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} diff --git a/MimeKit/MimeKit.WatchOS.csproj b/MimeKit/MimeKit.WatchOS.csproj deleted file mode 100644 index 09ec252dda..0000000000 --- a/MimeKit/MimeKit.WatchOS.csproj +++ /dev/null @@ -1,271 +0,0 @@ - - - - Debug - AnyCPU - {9AD6AE8B-D83D-4511-AA08-2BA8904D2E7C} - {FC940695-DFE0-4552-9F25-99AF4A5619A1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - MimeKit - Resources - - - true - full - false - bin\Debug\Xamarin.WatchOS - DEBUG;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__WATCHOS__ - prompt - 4 - NSUrlSessionHandler - - - true - portable - true - bin\Release\Xamarin.WatchOS - obj\Release\Xamarin.WatchOS - bin\Release\Xamarin.WatchOS\MimeKit.xml - SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__WATCHOS_ - true - true - prompt - 4 - NSUrlSessionHandler - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.WatchOS.project.json b/MimeKit/MimeKit.WatchOS.project.json deleted file mode 100644 index e623e513cf..0000000000 --- a/MimeKit/MimeKit.WatchOS.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - "Xamarin.WatchOS,Version=v1.0": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} diff --git a/MimeKit/MimeKit.iOS.csproj b/MimeKit/MimeKit.iOS.csproj deleted file mode 100644 index d2b91af251..0000000000 --- a/MimeKit/MimeKit.iOS.csproj +++ /dev/null @@ -1,284 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {4C1288AD-12C8-4BF7-AED7-6C4DC539C856} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - MimeKit - Resources - Xamarin.iOS - - - true - full - false - bin\Debug\Xamarin.iOS - obj\Debug\Xamarin.iOS - DEBUG;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__IOS__ - true - prompt - 4 - - - true - portable - true - bin\Release\Xamarin.iOS - obj\Release\Xamarin.iOS - bin\Release\Xamarin.iOS\MimeKit.xml - SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;__UNIFIED__;__MOBILE__;__IOS__ - true - true - prompt - 4 - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKit.iOS.project.json b/MimeKit/MimeKit.iOS.project.json deleted file mode 100644 index 67e6d8dec2..0000000000 --- a/MimeKit/MimeKit.iOS.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "frameworks": { - "Xamarin.iOS,Version=v1.0": {} - }, - "runtimes": { - "win-anycpu": {} - }, - "dependencies": { - "Portable.BouncyCastle": "1.8.5" - } -} \ No newline at end of file diff --git a/MimeKit/MimeKitLite.Android.csproj b/MimeKit/MimeKitLite.Android.csproj deleted file mode 100644 index 6480bb03a3..0000000000 --- a/MimeKit/MimeKitLite.Android.csproj +++ /dev/null @@ -1,219 +0,0 @@ - - - - Debug - AnyCPU - 10.0.0 - 2.0 - {D95A2734-2A81-4C75-985E-A33B15CC62BC} - {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - Resources\Resource.designer.cs - Resource - Resources - Assets - False - MimeKitLite - v8.0 - - - true - full - false - bin\Debug\MonoAndroid - obj\Debug\MonoAndroid - DEBUG;SERIALIZABLE;ENABLE_SNM;__MOBILE__;__ANDROID__ - prompt - 4 - None - false - true - - - true - portable - true - bin\Release\MonoAndroid - obj\Release\MonoAndroid - prompt - 4 - false - false - true - SERIALIZABLE;ENABLE_SNM;__MOBILE__;__ANDROID__ - bin\Release\MonoAndroid\MimeKitLite.xml - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKitLite.Android.project.json b/MimeKit/MimeKitLite.Android.project.json deleted file mode 100644 index 6ca0130cb4..0000000000 --- a/MimeKit/MimeKitLite.Android.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - "MonoAndroid,Version=v8.0": {} - }, - "runtimes": { - "win-anycpu": {} - } -} diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 927596f0dd..729b697831 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -10,7 +10,7 @@ false MimeKitLite MimeKitLite - mime;mbox;mail;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;xamarin;android;ios;monodroid;monoandroid + mime;mbox;mail;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0 https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false diff --git a/MimeKit/MimeKitLite.iOS.csproj b/MimeKit/MimeKitLite.iOS.csproj deleted file mode 100644 index e0be536442..0000000000 --- a/MimeKit/MimeKitLite.iOS.csproj +++ /dev/null @@ -1,220 +0,0 @@ - - - - Debug - AnyCPU - 10.0.0 - 2.0 - {5F211544-940D-46C9-98EB-4FD8F62506AD} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - MimeKit - Resources - MimeKitLite - Xamarin.iOS - - - true - full - false - bin\Debug\Xamarin.iOS - obj\Debug\Xamarin.iOS - DEBUG;SERIALIZABLE;ENABLE_SNM;__MOBILE__;__IOS__ - prompt - 4 - false - true - - - true - portable - true - bin\Release\Xamarin.iOS - obj\Release\Xamarin.iOS - prompt - 4 - false - true - SERIALIZABLE;ENABLE_SNM;__MOBILE__;__IOS__ - True - bin\Release\Xamarin.iOS\MimeKitLite.xml - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKitLite.iOS.project.json b/MimeKit/MimeKitLite.iOS.project.json deleted file mode 100644 index 4a7c8a5100..0000000000 --- a/MimeKit/MimeKitLite.iOS.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "frameworks": { - "Xamarin.iOS,Version=v1.0": {} - }, - "runtimes": { - "win-anycpu": {} - } -} \ No newline at end of file diff --git a/MimeKit/packages.MimeKit.Mac.config b/MimeKit/packages.MimeKit.Mac.config deleted file mode 100644 index 46c433a2c2..0000000000 --- a/MimeKit/packages.MimeKit.Mac.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MimeKit/packages.MimeKit.TvOS.config b/MimeKit/packages.MimeKit.TvOS.config deleted file mode 100644 index 46c433a2c2..0000000000 --- a/MimeKit/packages.MimeKit.TvOS.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MimeKit/packages.MimeKit.WatchOS.config b/MimeKit/packages.MimeKit.WatchOS.config deleted file mode 100644 index 46c433a2c2..0000000000 --- a/MimeKit/packages.MimeKit.WatchOS.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MimeKitLite.sln b/MimeKitLite.sln index b29cbbe3a5..6226a4627d 100644 --- a/MimeKitLite.sln +++ b/MimeKitLite.sln @@ -1,15 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.12 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.Net45", "MimeKit\MimeKitLite.Net45.csproj", "{B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.Android", "MimeKit\MimeKitLite.Android.csproj", "{D95A2734-2A81-4C75-985E-A33B15CC62BC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.iOS", "MimeKit\MimeKitLite.iOS.csproj", "{5F211544-940D-46C9-98EB-4FD8F62506AD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.NetStandard", "MimeKit\MimeKitLite.NetStandard.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKitLite.NetStandard", "MimeKit\MimeKitLite.NetStandard.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,14 +17,6 @@ Global {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Debug|Any CPU.Build.0 = Debug|Any CPU {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Release|Any CPU.Build.0 = Release|Any CPU - {D95A2734-2A81-4C75-985E-A33B15CC62BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95A2734-2A81-4C75-985E-A33B15CC62BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95A2734-2A81-4C75-985E-A33B15CC62BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95A2734-2A81-4C75-985E-A33B15CC62BC}.Release|Any CPU.Build.0 = Release|Any CPU - {5F211544-940D-46C9-98EB-4FD8F62506AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F211544-940D-46C9-98EB-4FD8F62506AD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F211544-940D-46C9-98EB-4FD8F62506AD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F211544-940D-46C9-98EB-4FD8F62506AD}.Release|Any CPU.Build.0 = Release|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.Build.0 = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -37,6 +25,9 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3E07F961-6E08-4E6A-AF55-EC1428E15EAD} + EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = MimeKit\MimeKitLite.Net45.csproj Policies = $0 diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 9fc5aa703b..603973cee6 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -35,7 +35,7 @@ Xamarin Inc. en-US - mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid + mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 @@ -79,12 +79,6 @@ - - - - - - @@ -119,12 +113,6 @@ - - - - - - diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 6c1b506e18..98d0bec81c 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -34,7 +34,7 @@ Xamarin Inc. en-US - mime mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 xamarin android ios monodroid monoandroid + mime mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 @@ -58,8 +58,6 @@ - - @@ -86,12 +84,6 @@ - - - - - - From 63c92319338cf37e235072b51b1e2fba802235a2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 13:43:48 -0400 Subject: [PATCH 556/741] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index a3ed18a061..c22efa9182 100644 --- a/README.md +++ b/README.md @@ -149,9 +149,7 @@ directory and select **Git Sync...** in the menu. Once you do that, you'll need In the top-level MimeKit directory, there are a number of solution files; they are: -* **MimeKit.sln** - includes projects for .NET 4.5, .NETStandard, Xamarin.Android, and Xamarin.iOS - as well as the unit tests. -* **MimeKit.Mobile.sln** - includes only the Xamarin.Android and Xamarin.iOS projects. +* **MimeKit.sln** - includes projects for .NET 4.x and .NETStandard as well as the unit tests. * **MimeKit.Net45.sln** - includes only the .NET 4.5 project and the unit tests. If you don't have the Xamarin products, you'll probably want to open the MimeKit.Net45.sln instead of MimeKit.sln. From f7e0225a593702291d68c782cdeb6be5527983ee Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 13:45:10 -0400 Subject: [PATCH 557/741] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c22efa9182..5d5eb6039c 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ directory and select **Git Sync...** in the menu. Once you do that, you'll need In the top-level MimeKit directory, there are a number of solution files; they are: -* **MimeKit.sln** - includes projects for .NET 4.x and .NETStandard as well as the unit tests. +* **MimeKit.sln** - includes projects for .NET 4.5, .NETStandard as well as the unit tests. * **MimeKit.Net45.sln** - includes only the .NET 4.5 project and the unit tests. If you don't have the Xamarin products, you'll probably want to open the MimeKit.Net45.sln instead of MimeKit.sln. From f50ece7ecde031aefffa8d5189a2997175ffce50 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 13:45:29 -0400 Subject: [PATCH 558/741] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 5d5eb6039c..5ea0cf92f5 100644 --- a/README.md +++ b/README.md @@ -152,8 +152,6 @@ In the top-level MimeKit directory, there are a number of solution files; they a * **MimeKit.sln** - includes projects for .NET 4.5, .NETStandard as well as the unit tests. * **MimeKit.Net45.sln** - includes only the .NET 4.5 project and the unit tests. -If you don't have the Xamarin products, you'll probably want to open the MimeKit.Net45.sln instead of MimeKit.sln. - Once you've opened the appropriate MimeKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** build configuration and then build. From 92b19c80e3681086d0ebf247181ba2b96a48024a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 13:47:28 -0400 Subject: [PATCH 559/741] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ea0cf92f5..af1d5497be 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ directory and select **Git Sync...** in the menu. Once you do that, you'll need In the top-level MimeKit directory, there are a number of solution files; they are: -* **MimeKit.sln** - includes projects for .NET 4.5, .NETStandard as well as the unit tests. +* **MimeKit.sln** - includes projects for .NET 4.5/4.6/4.7/4.8, .NETStandard 1.3/1.6/2.0 as well as the unit tests. * **MimeKit.Net45.sln** - includes only the .NET 4.5 project and the unit tests. Once you've opened the appropriate MimeKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), From 1e5eacc3510ca99c7edf6db8d6e0c99857b1d771 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 24 May 2020 22:28:48 -0400 Subject: [PATCH 560/741] Switched sample projects to use PackageReference --- samples/DkimVerifier/DkimVerifier.sln | 12 +++--- .../DkimVerifier/DkimVerifier.csproj | 39 ++++++++----------- .../DkimVerifier/DkimVerifier/packages.config | 6 --- .../MessageReader.Android.csproj | 11 ++---- .../Resources/Resource.designer.cs | 1 - .../MessageReader.Android/packages.config | 5 --- .../MessageReader.iOS.csproj | 13 +++---- .../MessageReader.iOS/packages.config | 5 --- .../MessageReader/MessageReader.csproj | 13 +++---- .../MessageReader/packages.config | 5 --- 10 files changed, 36 insertions(+), 74 deletions(-) delete mode 100644 samples/DkimVerifier/DkimVerifier/packages.config delete mode 100644 samples/MessageReader.Android/MessageReader.Android/packages.config delete mode 100644 samples/MessageReader.iOS/MessageReader.iOS/packages.config delete mode 100644 samples/MessageReader/MessageReader/packages.config diff --git a/samples/DkimVerifier/DkimVerifier.sln b/samples/DkimVerifier/DkimVerifier.sln index d056d5b255..0a7ddc76c2 100644 --- a/samples/DkimVerifier/DkimVerifier.sln +++ b/samples/DkimVerifier/DkimVerifier.sln @@ -6,14 +6,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DkimVerifier", "DkimVerifie EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Debug|x86.ActiveCfg = Debug|x86 - {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Debug|x86.Build.0 = Debug|x86 - {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Release|x86.ActiveCfg = Release|x86 - {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Release|x86.Build.0 = Release|x86 + {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 0140d8b355..fd88e9107b 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -2,55 +2,48 @@ Debug - x86 + AnyCPU {0871D5C3-BDF0-4FFF-9E2A-F94D49F4A382} Exe DkimVerifier DkimVerifier v4.5 + 7.3 - + + AnyCPU true full - false - bin\Debug + bin\Debug\ DEBUG; prompt - 4 - true - x86 + MinimumRecommendedRules.ruleset - + + AnyCPU + bin\Release\ true - bin\Release prompt - 4 - true - x86 + MinimumRecommendedRules.ruleset - - ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - - ..\packages\MimeKit.2.7.0\lib\net45\MimeKit.dll - - - ..\packages\Heijden.Dns.2.0.0\lib\net35\Heijden.Dns.dll - + + + + + - - + \ No newline at end of file diff --git a/samples/DkimVerifier/DkimVerifier/packages.config b/samples/DkimVerifier/DkimVerifier/packages.config deleted file mode 100644 index 03dd42a812..0000000000 --- a/samples/DkimVerifier/DkimVerifier/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index aee3dc6352..0aa07b2c7a 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -55,12 +55,6 @@ False - - ..\packages\Portable.BouncyCastle.1.8.5\lib\netstandard2.0\BouncyCastle.Crypto.dll - - - ..\packages\MimeKit.2.7.0\lib\monoandroid\MimeKit.dll - @@ -68,6 +62,10 @@ + + + + @@ -77,7 +75,6 @@ - diff --git a/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs b/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs index f75f1a3f99..a2353c9a24 100644 --- a/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs +++ b/samples/MessageReader.Android/MessageReader.Android/Resources/Resource.designer.cs @@ -2,7 +2,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/samples/MessageReader.Android/MessageReader.Android/packages.config b/samples/MessageReader.Android/MessageReader.Android/packages.config deleted file mode 100644 index 3e048669b3..0000000000 --- a/samples/MessageReader.Android/MessageReader.Android/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 95842ab7fd..b9ec794862 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -67,12 +67,6 @@ Default - - ..\packages\Portable.BouncyCastle.1.8.5\lib\netstandard2.0\BouncyCastle.Crypto.dll - - - ..\packages\MimeKit.2.7.0\lib\xamarinios\MimeKit.dll - @@ -80,13 +74,16 @@ + + + + - @@ -107,4 +104,4 @@ xamarin3.msg - + \ No newline at end of file diff --git a/samples/MessageReader.iOS/MessageReader.iOS/packages.config b/samples/MessageReader.iOS/MessageReader.iOS/packages.config deleted file mode 100644 index d22a73d2b5..0000000000 --- a/samples/MessageReader.iOS/MessageReader.iOS/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 392aa0eca3..3faeded213 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -32,12 +32,6 @@ 4 - - ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - - ..\packages\MimeKit.2.7.0\lib\net45\MimeKit.dll - @@ -51,6 +45,10 @@ + + + + Form @@ -72,7 +70,6 @@ True Resources.resx - SettingsSingleFileGenerator Settings.Designer.cs @@ -98,4 +95,4 @@ --> - + \ No newline at end of file diff --git a/samples/MessageReader/MessageReader/packages.config b/samples/MessageReader/MessageReader/packages.config deleted file mode 100644 index 3dd425bf8c..0000000000 --- a/samples/MessageReader/MessageReader/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - From 2c857f4f110464e0631d22ce7bdfe682a68a6044 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 26 May 2020 09:27:32 -0400 Subject: [PATCH 561/741] Update cov-build.bat --- cov-build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cov-build.bat b/cov-build.bat index a9e19388f1..203444d9ee 100755 --- a/cov-build.bat +++ b/cov-build.bat @@ -1 +1 @@ -..\cov-analysis\bin\cov-build.exe --dir cov-int "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" /t:Rebuild MimeKit.Coverity.sln +..\cov-analysis\bin\cov-build.exe --dir cov-int "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" /t:Rebuild MimeKit.Coverity.sln From cfc6eac5028b84e61d9ebc567e71bac5c0421b8d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 27 May 2020 08:57:50 -0400 Subject: [PATCH 562/741] Added .editorconfig --- .editorconfig | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++ MimeKit.sln | 5 ++ 2 files changed, 206 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..7481ade57b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,201 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = tab +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = true + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = true +dotnet_sort_system_directives_first = true +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion + +# Field preferences +dotnet_style_readonly_field = true:suggestion + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:suggestion + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false:silent +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = false:silent + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent + +# Code-block preferences +csharp_prefer_braces = true:silent +csharp_prefer_simple_using_statement = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:silent + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = false +csharp_new_line_before_else = false +csharp_new_line_before_finally = false +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = methods,types +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = false + +# Space preferences +csharp_space_after_cast = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = true +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case diff --git a/MimeKit.sln b/MimeKit.sln index 944ad7ee3d..25eda090b2 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -11,6 +11,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Da EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit.NetStandard", "MimeKit\MimeKit.NetStandard.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4B4EB921-F77E-4A51-897F-BBA7FA3E3468}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From effb2c12e4232893233d8e20a4e455deea0e376d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 27 May 2020 09:32:55 -0400 Subject: [PATCH 563/741] Added .editorconfig to MimeKit.Net45.sln and MimeKitLite.sln --- MimeKit.Net45.sln | 9 +++++++-- MimeKitLite.sln | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/MimeKit.Net45.sln b/MimeKit.Net45.sln index 02c144ce5e..ff64820867 100644 --- a/MimeKit.Net45.sln +++ b/MimeKit.Net45.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28010.2019 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" EndProject @@ -14,6 +14,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{C2CA4C .nuget\packages.config = .nuget\packages.config EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C21FE6EC-A72D-4501-89BE-1F2B5C70282A}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/MimeKitLite.sln b/MimeKitLite.sln index 6226a4627d..17adcdd468 100644 --- a/MimeKitLite.sln +++ b/MimeKitLite.sln @@ -7,6 +7,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.Net45", "MimeKi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKitLite.NetStandard", "MimeKit\MimeKitLite.NetStandard.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A56B6ECE-F1EE-41A2-A92B-18D2BDAFB6A2}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From 7911d22c8205f43d2ca8e134ada8c8db64605a51 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 May 2020 16:35:56 -0400 Subject: [PATCH 564/741] Made XML docs more consistent --- MimeKit/AttachmentCollection.cs | 8 +- MimeKit/BodyBuilder.cs | 12 +- MimeKit/ContentDisposition.cs | 77 ++++++------ MimeKit/ContentType.cs | 63 +++++----- .../Cryptography/ApplicationPgpEncrypted.cs | 16 +-- .../Cryptography/ApplicationPgpSignature.cs | 16 +-- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 30 ++--- .../Cryptography/ApplicationPkcs7Signature.cs | 14 +-- MimeKit/Cryptography/ArcSigner.cs | 8 +- MimeKit/Cryptography/ArcVerifier.cs | 8 +- MimeKit/Cryptography/AuthenticationResults.cs | 14 +-- .../BouncyCastleSecureMimeContext.cs | 18 +-- .../CertificateNotFoundException.cs | 4 +- MimeKit/Cryptography/CmsRecipient.cs | 8 +- .../Cryptography/CmsRecipientCollection.cs | 4 +- MimeKit/Cryptography/CmsSigner.cs | 32 ++--- MimeKit/Cryptography/CryptographyContext.cs | 22 ++-- .../Cryptography/DefaultSecureMimeContext.cs | 8 +- .../DigitalSignatureCollection.cs | 2 +- .../DigitalSignatureVerifyException.cs | 10 +- MimeKit/Cryptography/DkimBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimHashStream.cs | 2 +- MimeKit/Cryptography/DkimRelaxedBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimSignatureStream.cs | 2 +- MimeKit/Cryptography/DkimSigner.cs | 8 +- MimeKit/Cryptography/DkimSignerBase.cs | 2 +- MimeKit/Cryptography/DkimSimpleBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimVerifier.cs | 2 +- MimeKit/Cryptography/DkimVerifierBase.cs | 2 +- MimeKit/Cryptography/GnuPGContext.cs | 2 +- MimeKit/Cryptography/MD5.cs | 18 +-- MimeKit/Cryptography/MultipartEncrypted.cs | 26 ++--- MimeKit/Cryptography/MultipartSigned.cs | 14 +-- MimeKit/Cryptography/OpenPgpBlockFilter.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 36 +++--- .../Cryptography/OpenPgpDetectionFilter.cs | 2 +- .../PrivateKeyNotFoundException.cs | 8 +- .../PublicKeyNotFoundException.cs | 4 +- MimeKit/Cryptography/SecureMailboxAddress.cs | 12 +- MimeKit/Cryptography/SecureMimeContext.cs | 12 +- .../SecureMimeDigitalCertificate.cs | 2 +- .../SecureMimeDigitalSignature.cs | 2 +- .../Cryptography/SqlCertificateDatabase.cs | 2 +- .../Cryptography/SqliteCertificateDatabase.cs | 4 +- .../TemporarySecureMimeContext.cs | 2 +- .../Cryptography/WindowsSecureMimeContext.cs | 20 ++-- .../WindowsSecureMimeDigitalCertificate.cs | 2 +- .../WindowsSecureMimeDigitalSignature.cs | 4 +- MimeKit/Cryptography/X509CertificateChain.cs | 6 +- .../Cryptography/X509CertificateDatabase.cs | 16 +-- MimeKit/Cryptography/X509CertificateRecord.cs | 6 +- MimeKit/Cryptography/X509CertificateStore.cs | 2 +- MimeKit/Cryptography/X509CrlRecord.cs | 4 +- MimeKit/DomainList.cs | 14 +-- MimeKit/Encodings/Base64Decoder.cs | 2 +- MimeKit/Encodings/Base64Encoder.cs | 4 +- MimeKit/Encodings/HexDecoder.cs | 2 +- MimeKit/Encodings/HexEncoder.cs | 2 +- MimeKit/Encodings/PassThroughDecoder.cs | 2 +- MimeKit/Encodings/PassThroughEncoder.cs | 2 +- MimeKit/Encodings/QEncoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableDecoder.cs | 4 +- MimeKit/Encodings/QuotedPrintableEncoder.cs | 2 +- MimeKit/Encodings/UUDecoder.cs | 4 +- MimeKit/Encodings/UUEncoder.cs | 2 +- MimeKit/Encodings/YDecoder.cs | 4 +- MimeKit/Encodings/YEncoder.cs | 2 +- MimeKit/FormatOptions.cs | 6 +- MimeKit/GroupAddress.cs | 64 +++++----- MimeKit/Header.cs | 34 +++--- MimeKit/HeaderList.cs | 90 +++++++------- MimeKit/HeaderListCollection.cs | 8 +- MimeKit/IMimeContent.cs | 2 +- MimeKit/IO/BoundStream.cs | 6 +- MimeKit/IO/ChainedStream.cs | 2 +- MimeKit/IO/FilteredStream.cs | 2 +- MimeKit/IO/Filters/ArmoredFromFilter.cs | 2 +- MimeKit/IO/Filters/BestEncodingFilter.cs | 2 +- MimeKit/IO/Filters/CharsetFilter.cs | 6 +- MimeKit/IO/Filters/DecoderFilter.cs | 2 +- MimeKit/IO/Filters/Dos2UnixFilter.cs | 2 +- MimeKit/IO/Filters/EncoderFilter.cs | 2 +- MimeKit/IO/Filters/MimeFilterBase.cs | 2 +- MimeKit/IO/Filters/PassThroughFilter.cs | 2 +- .../IO/Filters/TrailingWhitespaceFilter.cs | 2 +- MimeKit/IO/Filters/Unix2DosFilter.cs | 2 +- MimeKit/IO/ICancellableStream.cs | 8 +- MimeKit/IO/MeasuringStream.cs | 2 +- MimeKit/IO/MemoryBlockStream.cs | 2 +- MimeKit/InternetAddress.cs | 78 ++++++------- MimeKit/InternetAddressList.cs | 110 +++++++++--------- MimeKit/MailboxAddress.cs | 76 ++++++------ MimeKit/MessageDeliveryStatus.cs | 16 +-- MimeKit/MessageDispositionNotification.cs | 14 +-- MimeKit/MessageIdList.cs | 26 ++--- MimeKit/MessagePart.cs | 28 ++--- MimeKit/MessagePartial.cs | 14 +-- MimeKit/MimeContent.cs | 16 +-- MimeKit/MimeEntity.cs | 82 ++++++------- MimeKit/MimeIterator.cs | 20 ++-- MimeKit/MimeMessage.cs | 90 +++++++------- MimeKit/MimeParser.cs | 28 ++--- MimeKit/MimePart.cs | 28 ++--- MimeKit/MimeVisitor.cs | 4 +- MimeKit/Multipart.cs | 58 ++++----- MimeKit/MultipartAlternative.cs | 16 +-- MimeKit/MultipartRelated.cs | 16 +-- MimeKit/MultipartReport.cs | 16 +-- MimeKit/Parameter.cs | 6 +- MimeKit/ParameterList.cs | 52 ++++----- MimeKit/ParseException.cs | 6 +- MimeKit/ParserOptions.cs | 8 +- MimeKit/Text/FlowedToHtml.cs | 2 +- MimeKit/Text/FlowedToText.cs | 2 +- MimeKit/Text/HtmlAttribute.cs | 4 +- MimeKit/Text/HtmlAttributeCollection.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.cs | 2 +- MimeKit/Text/HtmlTagContext.cs | 2 +- MimeKit/Text/HtmlTextPreviewer.cs | 2 +- MimeKit/Text/HtmlToHtml.cs | 2 +- MimeKit/Text/HtmlToken.cs | 18 +-- MimeKit/Text/HtmlTokenizer.cs | 2 +- MimeKit/Text/HtmlWriter.cs | 18 +-- MimeKit/Text/PlainTextPreviewer.cs | 2 +- MimeKit/Text/TextConverter.cs | 4 +- MimeKit/Text/TextPreviewer.cs | 4 +- MimeKit/Text/TextToFlowed.cs | 2 +- MimeKit/Text/TextToHtml.cs | 2 +- MimeKit/Text/TextToText.cs | 2 +- MimeKit/Text/Trie.cs | 4 +- MimeKit/TextPart.cs | 20 ++-- MimeKit/TextRfc822Headers.cs | 18 +-- MimeKit/Tnef/RtfCompressedToRtf.cs | 4 +- MimeKit/Tnef/TnefException.cs | 6 +- MimeKit/Tnef/TnefNameId.cs | 16 +-- MimeKit/Tnef/TnefPart.cs | 22 ++-- MimeKit/Tnef/TnefPropertyReader.cs | 12 +- MimeKit/Tnef/TnefPropertyTag.cs | 22 ++-- MimeKit/Tnef/TnefReader.cs | 18 +-- MimeKit/Tnef/TnefReaderStream.cs | 2 +- MimeKit/Utils/BufferPool.cs | 2 +- MimeKit/Utils/Crc32.cs | 2 +- MimeKit/Utils/DateUtils.cs | 8 +- MimeKit/Utils/MimeUtils.cs | 6 +- MimeKit/Utils/OptimizedOrdinalComparer.cs | 2 +- 145 files changed, 970 insertions(+), 978 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index e9b3ab29e1..8ab6cdf2c3 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -48,7 +48,7 @@ public class AttachmentCollection : IList readonly bool linked; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -63,7 +63,7 @@ public AttachmentCollection (bool linkedResources) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -97,10 +97,10 @@ public bool IsReadOnly { } /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// The attachment at the specified index. /// The index. diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index c29950b076..b807814104 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -39,7 +39,7 @@ namespace MimeKit { public class BodyBuilder { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -54,7 +54,7 @@ public BodyBuilder () } /// - /// Gets the attachments. + /// Get the attachments. /// /// /// Represents a collection of file attachments that will be included in the message. @@ -68,7 +68,7 @@ public AttachmentCollection Attachments { } /// - /// Gets the linked resources. + /// Get the linked resources. /// /// /// Linked resources are a special type of attachment which are linked to from the . @@ -82,7 +82,7 @@ public AttachmentCollection LinkedResources { } /// - /// Gets or sets the text body. + /// Get or set the text body. /// /// /// Represents the plain-text formatted version of the message body. @@ -96,7 +96,7 @@ public string TextBody { } /// - /// Gets or sets the html body. + /// Get or set the html body. /// /// /// Represents the html formatted version of the message body and may link to any of the . @@ -110,7 +110,7 @@ public string HtmlBody { } /// - /// Constructs the message body based on the text-based bodies, the linked resources, and the attachments. + /// Construct the message body based on the text-based bodies, the linked resources, and the attachments. /// /// /// Combines the , , , diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index 09843a642c..1d06643c40 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -68,7 +68,7 @@ public class ContentDisposition string disposition; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// The disposition should either be @@ -88,7 +88,7 @@ public ContentDisposition (string disposition) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// This is identical to with a disposition @@ -104,7 +104,7 @@ static bool IsAsciiAtom (byte c) } /// - /// Gets or sets the disposition. + /// Get or set the disposition. /// /// /// The disposition is typically either "attachment" or "inline". @@ -139,7 +139,7 @@ public string Disposition { } /// - /// Gets or sets a value indicating whether the is an attachment. + /// Get or set a value indicating whether the is an attachment. /// /// /// A convenience property to determine if the entity should be considered an attachment or not. @@ -151,7 +151,7 @@ public bool IsAttachment { } /// - /// Gets the parameters. + /// Get the list of parameters on the . /// /// /// In addition to specifying whether the entity should be treated as an @@ -175,7 +175,7 @@ private set { } /// - /// Gets or sets the name of the file. + /// Get or set the name of the file. /// /// /// When set, this can provide a useful hint for a default file name for the @@ -209,7 +209,7 @@ static bool IsNullOrWhiteSpace (string value) } /// - /// Gets or sets the creation-date parameter. + /// Get or set the creation-date parameter. /// /// /// Refers to the date and time that the content file was created on the @@ -240,7 +240,7 @@ public DateTimeOffset? CreationDate { } /// - /// Gets or sets the modification-date parameter. + /// Get or set the modification-date parameter. /// /// /// Refers to the date and time that the content file was last modified on @@ -271,7 +271,7 @@ public DateTimeOffset? ModificationDate { } /// - /// Gets or sets the read-date parameter. + /// Get or set the read-date parameter. /// /// /// Refers to the date and time that the content file was last read on the @@ -302,7 +302,7 @@ public DateTimeOffset? ReadDate { } /// - /// Gets or sets the size parameter. + /// Get or set the size parameter. /// /// /// When set, the size parameter typically refers to the original size of the @@ -345,7 +345,7 @@ internal string Encode (FormatOptions options, Encoding charset) } /// - /// Serializes the to a string, + /// Serialize the to a string, /// optionally encoding the parameters. /// /// @@ -384,7 +384,7 @@ public string ToString (FormatOptions options, Encoding charset, bool encode) } /// - /// Serializes the to a string, + /// Serialize the to a string, /// optionally encoding the parameters. /// /// @@ -403,14 +403,13 @@ public string ToString (Encoding charset, bool encode) } /// - /// Returns a that represents the current - /// . + /// Serialize the to a string. /// /// /// Creates a string-representation of the . /// /// A that represents the current - /// . + /// . public override string ToString () { return ToString (FormatOptions.Default, Encoding.UTF8, false); @@ -513,7 +512,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the given index @@ -544,7 +543,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the given index @@ -568,7 +567,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Cont } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the specified index. @@ -596,7 +595,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the specified index. @@ -617,7 +616,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out ContentDispositi } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Disposition value from the specified buffer. @@ -641,7 +640,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out ContentDi } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Disposition value from the specified buffer. @@ -658,7 +657,7 @@ public static bool TryParse (byte[] buffer, out ContentDisposition disposition) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a Content-Disposition value from the supplied text. @@ -683,7 +682,7 @@ public static bool TryParse (ParserOptions options, string text, out ContentDisp } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a Content-Disposition value from the supplied text. @@ -700,13 +699,13 @@ public static bool TryParse (string text, out ContentDisposition disposition) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input buffer. /// The start index of the buffer. @@ -736,13 +735,13 @@ public static ContentDisposition Parse (ParserOptions options, byte[] buffer, in } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The start index of the buffer. /// The length of the buffer. @@ -762,12 +761,12 @@ public static ContentDisposition Parse (byte[] buffer, int startIndex, int lengt } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the specified index. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input buffer. /// The start index of the buffer. @@ -795,12 +794,12 @@ public static ContentDisposition Parse (ParserOptions options, byte[] buffer, in } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Disposition value from the supplied buffer starting at the specified index. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The start index of the buffer. /// @@ -818,12 +817,12 @@ public static ContentDisposition Parse (byte[] buffer, int startIndex) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Disposition value from the supplied buffer. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input buffer. /// @@ -847,12 +846,12 @@ public static ContentDisposition Parse (ParserOptions options, byte[] buffer) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Disposition value from the supplied buffer. /// - /// The parsed . + /// The parsed . /// The input buffer. /// /// is null. @@ -866,12 +865,12 @@ public static ContentDisposition Parse (byte[] buffer) } /// - /// Parse the specified text into a new instance of the class. + /// Parse the specified text into a new instance of the class. /// /// /// Parses a Content-Disposition value from the specified text. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input text. /// @@ -896,12 +895,12 @@ public static ContentDisposition Parse (ParserOptions options, string text) } /// - /// Parse the specified text into a new instance of the class. + /// Parse the specified text into a new instance of the class. /// /// /// Parses a Content-Disposition value from the specified text. /// - /// The parsed . + /// The parsed . /// The input text. /// /// is null. diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index b199c20318..34c99d91b9 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -44,7 +44,7 @@ public class ContentType string type, subtype; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new based on the media type and subtype provided. @@ -124,7 +124,7 @@ public string MediaSubtype { } /// - /// Get the parameters. + /// Get the list of parameters on the . /// /// /// In addition to the media type and subtype, the Content-Type header may also @@ -255,7 +255,7 @@ public string Name { } /// - /// Checks if the this instance of matches + /// Check if the this instance of matches /// the specified MIME media type and subtype. /// /// @@ -303,7 +303,7 @@ internal string Encode (FormatOptions options, Encoding charset) } /// - /// Serializes the to a string, + /// Serialize the to a string, /// optionally encoding the parameters. /// /// @@ -344,7 +344,7 @@ public string ToString (FormatOptions options, Encoding charset, bool encode) } /// - /// Serializes the to a string, + /// Serialize the to a string, /// optionally encoding the parameters. /// /// @@ -363,14 +363,13 @@ public string ToString (Encoding charset, bool encode) } /// - /// Returns a that represents the current - /// . + /// Serialize the to a string. /// /// /// Creates a string-representation of the . /// /// A that represents the current - /// . + /// . public override string ToString () { return ToString (FormatOptions.Default, Encoding.UTF8, false); @@ -478,7 +477,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Type value from the supplied buffer starting at the given index @@ -509,7 +508,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Type value from the supplied buffer starting at the given index @@ -533,7 +532,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Cont } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Type value from the supplied buffer starting at the specified index. @@ -561,7 +560,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Type value from the supplied buffer starting at the specified index. @@ -582,7 +581,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out ContentType type } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Type value from the specified buffer. @@ -606,7 +605,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out ContentTy } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a Content-Type value from the specified buffer. @@ -623,7 +622,7 @@ public static bool TryParse (byte[] buffer, out ContentType type) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a Content-Type value from the specified text. @@ -648,7 +647,7 @@ public static bool TryParse (ParserOptions options, string text, out ContentType } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a Content-Type value from the specified text. @@ -665,13 +664,13 @@ public static bool TryParse (string text, out ContentType type) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Type value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input buffer. /// The start index of the buffer. @@ -701,13 +700,13 @@ public static ContentType Parse (ParserOptions options, byte[] buffer, int start } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Type value from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The start index of the buffer. /// The length of the buffer. @@ -727,12 +726,12 @@ public static ContentType Parse (byte[] buffer, int startIndex, int length) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Type value from the supplied buffer starting at the specified index. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input buffer. /// The start index of the buffer. @@ -760,12 +759,12 @@ public static ContentType Parse (ParserOptions options, byte[] buffer, int start } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Type value from the supplied buffer starting at the specified index. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The start index of the buffer. /// @@ -783,12 +782,12 @@ public static ContentType Parse (byte[] buffer, int startIndex) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Type value from the specified buffer. /// - /// The parsed . + /// The parsed . /// The parser options. /// The input buffer. /// @@ -812,12 +811,12 @@ public static ContentType Parse (ParserOptions options, byte[] buffer) } /// - /// Parse the specified input buffer into a new instance of the class. + /// Parse the specified input buffer into a new instance of the class. /// /// /// Parses a Content-Type value from the specified buffer. /// - /// The parsed . + /// The parsed . /// The input buffer. /// /// is null. @@ -831,12 +830,12 @@ public static ContentType Parse (byte[] buffer) } /// - /// Parse the specified text into a new instance of the class. + /// Parse the specified text into a new instance of the class. /// /// /// Parses a Content-Type value from the specified text. /// - /// The parsed . + /// The parsed . /// The parser options. /// The text. /// @@ -861,12 +860,12 @@ public static ContentType Parse (ParserOptions options, string text) } /// - /// Parse the specified text into a new instance of the class. + /// Parse the specified text into a new instance of the class. /// /// /// Parses a Content-Type value from the specified text. /// - /// The parsed . + /// The parsed . /// The text. /// /// is null. diff --git a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs index 7e9dcfacb6..44d5dfbd47 100644 --- a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs +++ b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs @@ -40,11 +40,11 @@ namespace MimeKit.Cryptography { public class ApplicationPgpEncrypted : MimePart { /// - /// Initializes a new instance of the - /// class based on the . + /// Initialize a new instance of the + /// class based on the . /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -55,7 +55,7 @@ public ApplicationPgpEncrypted (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new MIME part with a Content-Type of application/pgp-encrypted @@ -75,12 +75,12 @@ public ApplicationPgpEncrypted () : base ("application", "pgp-encrypted") /// Dispatches to the specific visit method for this MIME entity. /// /// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/Cryptography/ApplicationPgpSignature.cs b/MimeKit/Cryptography/ApplicationPgpSignature.cs index 0d27475e60..ecf50786f5 100644 --- a/MimeKit/Cryptography/ApplicationPgpSignature.cs +++ b/MimeKit/Cryptography/ApplicationPgpSignature.cs @@ -41,11 +41,11 @@ namespace MimeKit.Cryptography { public class ApplicationPgpSignature : MimePart { /// - /// Initializes a new instance of the - /// class based on the . + /// Initialize a new instance of the + /// class based on the . /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -56,7 +56,7 @@ public ApplicationPgpSignature (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the + /// Initialize a new instance of the /// class with a Content-Type of application/pgp-signature. /// /// @@ -84,12 +84,12 @@ public ApplicationPgpSignature (Stream stream) : base ("application", "pgp-signa /// Dispatches to the specific visit method for this MIME entity. /// /// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index d1ef191c27..3788492d26 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -42,10 +42,10 @@ namespace MimeKit.Cryptography { public class ApplicationPkcs7Mime : MimePart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -56,7 +56,7 @@ public ApplicationPkcs7Mime (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new MIME part with a Content-Type of application/pkcs7-mime @@ -141,12 +141,12 @@ public SecureMimeType SecureMimeType { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -166,7 +166,7 @@ public override void Accept (MimeVisitor visitor) /// /// Decompresses the compressed-data using the specified . /// - /// The decompressed . + /// The decompressed . /// The S/MIME context to use for decompressing. /// /// is null. @@ -199,7 +199,7 @@ public MimeEntity Decompress (SecureMimeContext ctx) /// /// Decompresses the compressed-data using the default . /// - /// The decompressed . + /// The decompressed . /// /// The "smime-type" parameter on the Content-Type header is not "compressed-data". /// @@ -221,7 +221,7 @@ public MimeEntity Decompress () /// /// Decrypts the enveloped-data using the specified . /// - /// The decrypted . + /// The decrypted . /// The S/MIME context to use for decrypting. /// The cancellation token. /// @@ -258,7 +258,7 @@ public MimeEntity Decompress () /// /// Decrypts the enveloped-data using the default . /// - /// The decrypted . + /// The decrypted . /// The cancellation token. /// /// The "smime-type" parameter on the Content-Type header is not "certs-only". @@ -308,10 +308,10 @@ public void Import (SecureMimeContext ctx) } /// - /// Verify the signed-data and return the unencapsulated . + /// Verify the signed-data and return the unencapsulated . /// /// - /// Verifies the signed-data and returns the unencapsulated . + /// Verifies the signed-data and returns the unencapsulated . /// /// The list of digital signatures. /// The S/MIME context to use for verifying the signature. @@ -349,11 +349,11 @@ public void Import (SecureMimeContext ctx) } /// - /// Verifies the signed-data and returns the unencapsulated . + /// Verifies the signed-data and returns the unencapsulated . /// /// /// Verifies the signed-data using the default and returns the - /// unencapsulated . + /// unencapsulated . /// /// The list of digital signatures. /// The unencapsulated entity. diff --git a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs index 104ce09ba1..24aae0b7f8 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs @@ -41,10 +41,10 @@ namespace MimeKit.Cryptography { public class ApplicationPkcs7Signature : MimePart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -55,7 +55,7 @@ public ApplicationPkcs7Signature (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the + /// Initialize a new instance of the /// class with a Content-Type of application/pkcs7-signature. /// /// @@ -83,12 +83,12 @@ public ApplicationPkcs7Signature (Stream stream) : base ("application", "pkcs7-s /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index e0e07e175e..ace2af8f93 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -53,7 +53,7 @@ public abstract class ArcSigner : DkimSignerBase static readonly string[] ArcShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "arc-seal" }; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -71,7 +71,7 @@ protected ArcSigner (string domain, string selector, DkimSignatureAlgorithm algo } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -102,7 +102,7 @@ protected ArcSigner (AsymmetricKeyParameter key, string domain, string selector, } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -154,7 +154,7 @@ protected ArcSigner (string fileName, string domain, string selector, DkimSignat } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index c4c4b10dcb..087b162651 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -75,7 +75,7 @@ public enum ArcSignatureValidationResult public class ArcHeaderValidationResult { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// The ARC header. /// @@ -90,7 +90,7 @@ internal ArcHeaderValidationResult (Header header) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -152,7 +152,7 @@ internal ArcValidationResult () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -260,7 +260,7 @@ public bool Add (Header header, Dictionary parameters) public class ArcVerifier : DkimVerifierBase { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 5e4fd36c1d..8e6244c6b1 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -50,7 +50,7 @@ public class AuthenticationResults } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -835,7 +835,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses an Authentication-Results header value from the supplied buffer starting at the given index @@ -863,7 +863,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Auth } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses an Authentication-Results header value from the supplied buffer. @@ -954,7 +954,7 @@ public static AuthenticationResults Parse (byte[] buffer) public class AuthenticationMethodResult { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -973,7 +973,7 @@ internal AuthenticationMethodResult (string method) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -1241,7 +1241,7 @@ public class AuthenticationMethodProperty bool? quoted; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -1275,7 +1275,7 @@ internal AuthenticationMethodProperty (string ptype, string property, string val } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 02468596fa..50352b41ce 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -72,7 +72,7 @@ public abstract class BouncyCastleSecureMimeContext : SecureMimeContext HttpClient client; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new @@ -299,7 +299,7 @@ Stream Sign (CmsSigner signer, Stream content, bool encapsulate) /// /// Cryptographically signs and encapsulates the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The content. @@ -328,7 +328,7 @@ public override ApplicationPkcs7Mime EncapsulatedSign (CmsSigner signer, Stream /// /// Cryptographically signs and encapsulates the content using the specified signer and digest algorithm. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -369,7 +369,7 @@ public override ApplicationPkcs7Mime EncapsulatedSign (MailboxAddress signer, Di /// /// Cryptographically signs the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The content. @@ -398,7 +398,7 @@ public override ApplicationPkcs7Signature Sign (CmsSigner signer, Stream content /// /// Cryptographically signs the content using the specified signer and digest algorithm. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -1131,7 +1131,7 @@ Stream Envelope (CmsRecipientCollection recipients, Stream content) /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted content. /// The recipients. /// The content. @@ -1160,7 +1160,7 @@ public override ApplicationPkcs7Mime Encrypt (CmsRecipientCollection recipients, /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The recipients. /// The content. @@ -1195,7 +1195,7 @@ public override MimePart Encrypt (IEnumerable recipients, Stream /// /// Decrypts the specified encryptedData. /// - /// The decrypted . + /// The decrypted . /// The encrypted data. /// The cancellation token. /// @@ -1277,7 +1277,7 @@ public override void DecryptTo (Stream encryptedData, Stream decryptedData) /// /// Exports the certificates for the specified mailboxes. /// - /// A new instance containing + /// A new instance containing /// the exported keys. /// The mailboxes. /// diff --git a/MimeKit/Cryptography/CertificateNotFoundException.cs b/MimeKit/Cryptography/CertificateNotFoundException.cs index c262844e31..22f6fd256e 100644 --- a/MimeKit/Cryptography/CertificateNotFoundException.cs +++ b/MimeKit/Cryptography/CertificateNotFoundException.cs @@ -45,7 +45,7 @@ public class CertificateNotFoundException : Exception { #if SERIALIZABLE /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -66,7 +66,7 @@ protected CertificateNotFoundException (SerializationInfo info, StreamingContext #endif /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 6662c60c1e..d7e06203c9 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -44,7 +44,7 @@ namespace MimeKit.Cryptography { public class CmsRecipient { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new based on the provided certificate. @@ -74,7 +74,7 @@ public CmsRecipient (X509Certificate certificate, SubjectIdentifierType recipien } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new , loading the certificate from the specified stream. @@ -116,7 +116,7 @@ public CmsRecipient (Stream stream, SubjectIdentifierType recipientIdentifierTyp } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new , loading the certificate from the specified file. @@ -175,7 +175,7 @@ public CmsRecipient (string fileName, SubjectIdentifierType recipientIdentifierT #if !NETSTANDARD1_3 && !NETSTANDARD1_6 /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new based on the provided certificate. diff --git a/MimeKit/Cryptography/CmsRecipientCollection.cs b/MimeKit/Cryptography/CmsRecipientCollection.cs index 8e576e363d..5fbb206db4 100644 --- a/MimeKit/Cryptography/CmsRecipientCollection.cs +++ b/MimeKit/Cryptography/CmsRecipientCollection.cs @@ -43,7 +43,7 @@ public class CmsRecipientCollection : ICollection readonly IList recipients; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -67,7 +67,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether the is read only. /// /// /// A is never read-only. diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index a1e28f461a..493e03f383 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -48,11 +48,11 @@ namespace MimeKit.Cryptography { public class CmsSigner { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// The initial value of the will be set to - /// and both the + /// and both the /// and properties /// will be initialized to empty tables. /// @@ -80,11 +80,11 @@ static void CheckCertificateCanBeUsedForSigning (X509Certificate certificate) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// The initial value of the will be set to - /// and both the + /// and both the /// and properties /// will be initialized to empty tables. /// @@ -131,11 +131,11 @@ public CmsSigner (IEnumerable chain, AsymmetricKeyParameter key } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// The initial value of the will - /// be set to and both the + /// The initial value of the will + /// be set to and both the /// and properties will be /// initialized to empty tables. /// @@ -218,13 +218,13 @@ void LoadPkcs12 (Stream stream, string password, SubjectIdentifierType signerIde } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new , loading the X.509 certificate and private key /// from the specified stream. - /// The initial value of the will - /// be set to and both the + /// The initial value of the will + /// be set to and both the /// and properties will be /// initialized to empty tables. /// @@ -256,13 +256,13 @@ public CmsSigner (Stream stream, string password, SubjectIdentifierType signerId } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new , loading the X.509 certificate and private key /// from the specified file. - /// The initial value of the will - /// be set to and both the + /// The initial value of the will + /// be set to and both the /// and properties will be /// initialized to empty tables. /// @@ -309,11 +309,11 @@ public CmsSigner (string fileName, string password, SubjectIdentifierType signer #if !NETSTANDARD1_3 && !NETSTANDARD1_6 /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// The initial value of the will - /// be set to and both the + /// The initial value of the will + /// be set to and both the /// and properties will be /// initialized to empty tables. /// diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 42ab564cca..dfeea4d473 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -54,7 +54,7 @@ public abstract class CryptographyContext : IDisposable int enabledDigestAlgorithms; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -108,7 +108,7 @@ protected CryptographyContext () #if NOT_YET /// - /// Gets or sets a value indicating whether this allows online + /// Gets or sets a value indicating whether this allows online /// certificate retrieval. /// /// true if online certificate retrieval should be allowed; otherwise, false. @@ -349,7 +349,7 @@ public bool IsEnabled (DigestAlgorithm algorithm) /// /// Cryptographically signs the content using the specified signer and digest algorithm. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -416,7 +416,7 @@ public bool IsEnabled (DigestAlgorithm algorithm) /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance containing the encrypted data. + /// A new instance containing the encrypted data. /// The recipients. /// The content. /// @@ -435,7 +435,7 @@ public bool IsEnabled (DigestAlgorithm algorithm) /// /// Decrypts the specified encryptedData. /// - /// The decrypted . + /// The decrypted . /// The encrypted data. /// The cancellation token. /// @@ -467,7 +467,7 @@ public bool IsEnabled (DigestAlgorithm algorithm) /// /// Exports the keys for the specified mailboxes. /// - /// A new instance containing the exported keys. + /// A new instance containing the exported keys. /// The mailboxes. /// /// is null. @@ -495,12 +495,12 @@ protected virtual void Dispose (bool disposing) } /// - /// Releases all resources used by the object. + /// Releases all resources used by the object. /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After - /// calling , you must release all references to the so - /// the garbage collector can reclaim the memory that the was occupying. + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After + /// calling , you must release all references to the so + /// the garbage collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index 51e1d66ea2..947b189c5e 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -96,7 +96,7 @@ static void CheckIsAvailable () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Allows the program to specify its own location for the SQLite database. If the file does not exist, @@ -146,7 +146,7 @@ public DefaultSecureMimeContext (string fileName, string password) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Allows the program to specify its own password for the default database. @@ -167,7 +167,7 @@ public DefaultSecureMimeContext (string password) : this (DefaultDatabasePath, p } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Not recommended for production use as the password to unlock the private keys is hard-coded. @@ -187,7 +187,7 @@ public DefaultSecureMimeContext () : this (DefaultDatabasePath, "no.secret") } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// This constructor is useful for supplying a custom . diff --git a/MimeKit/Cryptography/DigitalSignatureCollection.cs b/MimeKit/Cryptography/DigitalSignatureCollection.cs index cc9e6a8df5..b0a144406d 100644 --- a/MimeKit/Cryptography/DigitalSignatureCollection.cs +++ b/MimeKit/Cryptography/DigitalSignatureCollection.cs @@ -41,7 +41,7 @@ namespace MimeKit.Cryptography { public class DigitalSignatureCollection : ReadOnlyCollection { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs index 37dcd173c2..1bc9a5bf09 100644 --- a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs +++ b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs @@ -44,7 +44,7 @@ public class DigitalSignatureVerifyException : Exception { #if SERIALIZABLE /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -61,7 +61,7 @@ protected DigitalSignatureVerifyException (SerializationInfo info, StreamingCont #endif /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -75,7 +75,7 @@ public DigitalSignatureVerifyException (long keyId, string message, Exception in } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -88,7 +88,7 @@ public DigitalSignatureVerifyException (long keyId, string message) : base (mess } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -100,7 +100,7 @@ public DigitalSignatureVerifyException (string message, Exception innerException } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimBodyFilter.cs b/MimeKit/Cryptography/DkimBodyFilter.cs index 6ef779a7cd..836d38ce54 100644 --- a/MimeKit/Cryptography/DkimBodyFilter.cs +++ b/MimeKit/Cryptography/DkimBodyFilter.cs @@ -60,7 +60,7 @@ abstract class DkimBodyFilter : MimeFilterBase protected int EmptyLines; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimHashStream.cs b/MimeKit/Cryptography/DkimHashStream.cs index d7cda74cce..ef2d241b27 100644 --- a/MimeKit/Cryptography/DkimHashStream.cs +++ b/MimeKit/Cryptography/DkimHashStream.cs @@ -53,7 +53,7 @@ class DkimHashStream : Stream int max; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs index 97536f5a77..a4f79cc76a 100644 --- a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs +++ b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs @@ -38,7 +38,7 @@ class DkimRelaxedBodyFilter : DkimBodyFilter bool lwsp, cr; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimSignatureStream.cs b/MimeKit/Cryptography/DkimSignatureStream.cs index e68704f18a..3dd39e9ac4 100644 --- a/MimeKit/Cryptography/DkimSignatureStream.cs +++ b/MimeKit/Cryptography/DkimSignatureStream.cs @@ -42,7 +42,7 @@ class DkimSignatureStream : Stream long length; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index 61518232eb..f142afc187 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -50,7 +50,7 @@ public class DkimSigner : DkimSignerBase static readonly string[] DkimShouldNotInclude = { "return-path", "received", "comments", "keywords", "bcc", "resent-bcc", "dkim-signature" }; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -72,7 +72,7 @@ protected DkimSigner (string domain, string selector, DkimSignatureAlgorithm alg } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -107,7 +107,7 @@ public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, D } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -163,7 +163,7 @@ public DkimSigner (string fileName, string domain, string selector, DkimSignatur } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimSignerBase.cs b/MimeKit/Cryptography/DkimSignerBase.cs index 11ee0c826c..53a389885d 100644 --- a/MimeKit/Cryptography/DkimSignerBase.cs +++ b/MimeKit/Cryptography/DkimSignerBase.cs @@ -45,7 +45,7 @@ namespace MimeKit.Cryptography { public abstract class DkimSignerBase { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs index 2478f13220..dd9a30fe5e 100644 --- a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs +++ b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs @@ -34,7 +34,7 @@ namespace MimeKit.Cryptography { class DkimSimpleBodyFilter : DkimBodyFilter { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index 0b391e7e85..deeec18b74 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -47,7 +47,7 @@ namespace MimeKit.Cryptography { public class DkimVerifier : DkimVerifierBase { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 842361260a..f599908e5b 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -48,7 +48,7 @@ public abstract class DkimVerifierBase int enabledSignatureAlgorithms; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Initializes the . diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index a30c0f4c56..6e13d23a7f 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -102,7 +102,7 @@ static GnuPGContext () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/MD5.cs b/MimeKit/Cryptography/MD5.cs index dcb45deddd..10719be8dc 100644 --- a/MimeKit/Cryptography/MD5.cs +++ b/MimeKit/Cryptography/MD5.cs @@ -70,7 +70,7 @@ public sealed class MD5 : IDisposable ulong count; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new instance of an MD5 hash algorithm context. @@ -85,7 +85,7 @@ public sealed class MD5 : IDisposable } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new instance of an MD5 hash algorithm context. @@ -97,11 +97,11 @@ public static MD5 Create () /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// ~MD5 () { @@ -733,12 +733,12 @@ void Dispose (bool disposing) } /// - /// Releases all resource used by the object. + /// Releases all resource used by the object. /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After calling - /// , you must release all references to the so the - /// garbage collector can reclaim the memory that the was occupying. + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After calling + /// , you must release all references to the so the + /// garbage collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); diff --git a/MimeKit/Cryptography/MultipartEncrypted.cs b/MimeKit/Cryptography/MultipartEncrypted.cs index b007c044eb..e3141bcda3 100644 --- a/MimeKit/Cryptography/MultipartEncrypted.cs +++ b/MimeKit/Cryptography/MultipartEncrypted.cs @@ -44,10 +44,10 @@ namespace MimeKit.Cryptography { public class MultipartEncrypted : Multipart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -58,7 +58,7 @@ public MultipartEncrypted (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -71,12 +71,12 @@ public MultipartEncrypted () : base ("encrypted") /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -1096,9 +1096,7 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, /// public MimeEntity Decrypt (OpenPgpContext ctx, CancellationToken cancellationToken = default (CancellationToken)) { - DigitalSignatureCollection signatures; - - return Decrypt (ctx, out signatures, cancellationToken); + return Decrypt (ctx, out _, cancellationToken); } /// @@ -1117,7 +1115,7 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, /// The multipart is malformed in some way. /// /// - /// A suitable for + /// A suitable for /// decrypting could not be found. /// /// @@ -1187,7 +1185,7 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, /// The multipart is malformed in some way. /// /// - /// A suitable for + /// A suitable for /// decrypting could not be found. /// /// @@ -1203,9 +1201,7 @@ public static MultipartEncrypted Encrypt (IEnumerable recipients, /// public MimeEntity Decrypt (CancellationToken cancellationToken = default (CancellationToken)) { - DigitalSignatureCollection signatures; - - return Decrypt (out signatures, cancellationToken); + return Decrypt (out _, cancellationToken); } } } diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index 42681213ea..7142e7918b 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -46,9 +46,9 @@ namespace MimeKit.Cryptography { public class MultipartSigned : Multipart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// - /// This constructor is used by . + /// This constructor is used by . /// Information used by the constructor. /// /// is null. @@ -58,7 +58,7 @@ public MultipartSigned (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -71,12 +71,12 @@ public MultipartSigned () : base ("signed") /// Dispatches to the specific visit method for this MIME entity. /// /// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/Cryptography/OpenPgpBlockFilter.cs b/MimeKit/Cryptography/OpenPgpBlockFilter.cs index f08993df82..97ca32f1bb 100644 --- a/MimeKit/Cryptography/OpenPgpBlockFilter.cs +++ b/MimeKit/Cryptography/OpenPgpBlockFilter.cs @@ -43,7 +43,7 @@ class OpenPgpBlockFilter : MimeFilterBase bool midline; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 1a46a9c91b..f58115209a 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -89,7 +89,7 @@ public abstract class OpenPgpContext : CryptographyContext Uri keyServer; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Subclasses choosing to use this constructor MUST set the , @@ -113,7 +113,7 @@ protected OpenPgpContext () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new using the specified public and private keyring paths. @@ -1214,7 +1214,7 @@ public override bool CanEncrypt (MailboxAddress mailbox) /// /// Cryptographically signs the content using the specified signer and digest algorithm. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -1258,7 +1258,7 @@ public override MimePart Sign (MailboxAddress signer, DigestAlgorithm digestAlgo /// /// Cryptographically signs the content using the specified signer and digest algorithm. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -1588,7 +1588,7 @@ static SymmetricKeyAlgorithmTag GetSymmetricKeyAlgorithm (EncryptionAlgorithm al /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The recipients. /// The content. @@ -1623,7 +1623,7 @@ public override MimePart Encrypt (IEnumerable recipients, Stream /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The encryption algorithm. /// The recipients. @@ -1662,7 +1662,7 @@ public MimePart Encrypt (EncryptionAlgorithm algorithm, IEnumerable /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The encryption algorithm. /// The recipients. @@ -1719,7 +1719,7 @@ public MimePart Encrypt (EncryptionAlgorithm algorithm, IEnumerable /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The recipients. /// The content. @@ -1744,7 +1744,7 @@ public MimePart Encrypt (IEnumerable recipients, Stream content) /// /// Cryptographically signs and encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The signer. /// The digest algorithm to use for signing. @@ -1802,7 +1802,7 @@ public MimePart SignAndEncrypt (MailboxAddress signer, DigestAlgorithm digestAlg /// /// Cryptographically signs and encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The signer. /// The digest algorithm to use for signing. @@ -1854,7 +1854,7 @@ public MimePart SignAndEncrypt (MailboxAddress signer, DigestAlgorithm digestAlg /// /// Cryptographically signs and encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The signer. /// The digest algorithm to use for signing. @@ -1983,7 +1983,7 @@ public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, /// /// Cryptographically signs and encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The signer. /// The digest algorithm to use for signing. @@ -2242,7 +2242,7 @@ async Task DecryptToAsync (Stream encryptedData, Str /// /// Decrypts the specified encryptedData and extracts the digital signers if the content was also signed. /// - /// The decrypted . + /// The decrypted . /// The encrypted data. /// A list of digital signatures if the data was both signed and encrypted. /// The cancellation token. @@ -2279,7 +2279,7 @@ async Task DecryptToAsync (Stream encryptedData, Str /// /// Decrypts the specified encryptedData. /// - /// The decrypted . + /// The decrypted . /// The encrypted data. /// The cancellation token. /// @@ -2505,7 +2505,7 @@ public virtual void Import (PgpSecretKeyRingBundle bundle) /// /// Exports the public keys for the specified mailboxes. /// - /// A new instance containing the exported public keys. + /// A new instance containing the exported public keys. /// The mailboxes associated with the public keys to export. /// /// is null. @@ -2533,7 +2533,7 @@ public override MimePart Export (IEnumerable mailboxes) /// /// Exports the specified public keys. /// - /// A new instance containing the exported public keys. + /// A new instance containing the exported public keys. /// The public keys to export. /// /// is null. @@ -2555,7 +2555,7 @@ public MimePart Export (IEnumerable keys) /// /// Exports the specified public keys. /// - /// A new instance containing the exported public keys. + /// A new instance containing the exported public keys. /// The public keys to export. /// /// is null. @@ -2617,7 +2617,7 @@ public void Export (IEnumerable mailboxes, Stream stream, bool a /// /// Exports the specified public keys. /// - /// A new instance containing the exported public keys. + /// A new instance containing the exported public keys. /// The public keys to export. /// The output stream. /// true if the output should be armored; otherwise, false. diff --git a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs index d8b24f6853..64b5810b02 100644 --- a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs +++ b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs @@ -84,7 +84,7 @@ public OpenPgpMarker (string marker, OpenPgpState initial, OpenPgpState detected bool midline; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs index 918d296e2d..4695e025de 100644 --- a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs @@ -45,7 +45,7 @@ public class PrivateKeyNotFoundException : Exception { #if SERIALIZABLE /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -62,7 +62,7 @@ protected PrivateKeyNotFoundException (SerializationInfo info, StreamingContext #endif /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -81,7 +81,7 @@ public PrivateKeyNotFoundException (MailboxAddress mailbox, string message) : ba } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -100,7 +100,7 @@ public PrivateKeyNotFoundException (string keyid, string message) : base (messag } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/PublicKeyNotFoundException.cs b/MimeKit/Cryptography/PublicKeyNotFoundException.cs index b0cd01df90..cc258cba6e 100644 --- a/MimeKit/Cryptography/PublicKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PublicKeyNotFoundException.cs @@ -45,7 +45,7 @@ public class PublicKeyNotFoundException : Exception { #if SERIALIZABLE /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -66,7 +66,7 @@ protected PublicKeyNotFoundException (SerializationInfo info, StreamingContext c #endif /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index e03ec92bc7..dab0f2a387 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -44,7 +44,7 @@ namespace MimeKit.Cryptography { public class SecureMailboxAddress : MailboxAddress { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified fingerprint. @@ -71,7 +71,7 @@ public SecureMailboxAddress (Encoding encoding, string name, IEnumerable } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified fingerprint. @@ -95,7 +95,7 @@ public SecureMailboxAddress (string name, IEnumerable route, string addr } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified fingerprint. @@ -118,7 +118,7 @@ public SecureMailboxAddress (IEnumerable route, string address, string f } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified fingerprint. @@ -142,7 +142,7 @@ public SecureMailboxAddress (Encoding encoding, string name, string address, str } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified fingerprint. @@ -163,7 +163,7 @@ public SecureMailboxAddress (string name, string address, string fingerprint) : } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified address. diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 2ce5aea787..5a71a0a39d 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -55,7 +55,7 @@ public abstract class SecureMimeContext : CryptographyContext internal static readonly DerObjectIdentifier Twofish = new DerObjectIdentifier ("1.3.6.1.4.1.25258.3.3"); /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Enables the following encryption algorithms by default: @@ -432,7 +432,7 @@ protected virtual EncryptionAlgorithm GetPreferredEncryptionAlgorithm (CmsRecipi /// /// Compresses the specified stream. /// - /// A new instance + /// A new instance /// containing the compressed content. /// The stream to compress. /// @@ -585,7 +585,7 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool inc /// /// Cryptographically signs and encapsulates the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The content. @@ -602,7 +602,7 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool inc /// /// Cryptographically signs and encapsulates the content using the specified signer and digest algorithm. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -632,7 +632,7 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool inc /// /// Cryptographically signs the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The content. @@ -691,7 +691,7 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool inc /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted content. /// The recipients. /// The content. diff --git a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs index 4ccb3bcd92..f57158e959 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs @@ -38,7 +38,7 @@ namespace MimeKit.Cryptography { public class SecureMimeDigitalCertificate : IDigitalCertificate { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 53cc5d021c..9b4bf9ed1e 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -59,7 +59,7 @@ static DateTime ToAdjustedDateTime (DerUtcTime time) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index d85ef683fa..c536fbd1b1 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -58,7 +58,7 @@ public abstract class SqlCertificateDatabase : X509CertificateDatabase bool disposed; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new using the provided database connection. diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 42d6dcad53..7e3b1b8b3a 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -200,7 +200,7 @@ static DbConnection CreateConnection (string fileName) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new and opens a connection to the @@ -231,7 +231,7 @@ public SqliteCertificateDatabase (string fileName, string password) : this (Crea } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new using the provided SQLite database connection. diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index c5baf3fb2f..c0e4b1e2c4 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -53,7 +53,7 @@ public class TemporarySecureMimeContext : BouncyCastleSecureMimeContext readonly List crls; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 3d2612c0d5..df5a78a76e 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -60,7 +60,7 @@ public class WindowsSecureMimeContext : SecureMimeContext const X509KeyStorageFlags DefaultKeyStorageFlags = X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -90,7 +90,7 @@ public WindowsSecureMimeContext (StoreLocation location) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Constructs an S/MIME context using the current user's X.509 store location. @@ -466,7 +466,7 @@ Stream Sign (RealCmsSigner signer, Stream content, bool detach) /// /// Cryptographically signs and encapsulates the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The content. @@ -497,7 +497,7 @@ public override ApplicationPkcs7Mime EncapsulatedSign (CmsSigner signer, Stream /// /// Sign and encapsulate the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -538,7 +538,7 @@ public override ApplicationPkcs7Mime EncapsulatedSign (MailboxAddress signer, Di /// /// Cryptographically signs the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The content. @@ -569,7 +569,7 @@ public override ApplicationPkcs7Signature Sign (CmsSigner signer, Stream content /// /// Sign the content using the specified signer. /// - /// A new instance + /// A new instance /// containing the detached signature data. /// The signer. /// The digest algorithm to use for signing. @@ -910,7 +910,7 @@ Stream Envelope (CmsRecipientCollection recipients, Stream content) /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted content. /// The recipients. /// The content. @@ -939,7 +939,7 @@ public override ApplicationPkcs7Mime Encrypt (CmsRecipientCollection recipients, /// /// Encrypts the specified content for the specified recipients. /// - /// A new instance + /// A new instance /// containing the encrypted data. /// The recipients. /// The content. @@ -976,7 +976,7 @@ public override MimePart Encrypt (IEnumerable recipients, Stream /// /// Decrypt the encrypted data. /// - /// The decrypted . + /// The decrypted . /// The encrypted data. /// The cancellation token. /// @@ -1199,7 +1199,7 @@ public override void Import (Stream stream, string password) /// /// Exports the certificates for the specified mailboxes. /// - /// A new instance containing + /// A new instance containing /// the exported keys. /// The mailboxes. /// diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs index 9b50af8c9c..c95b8233e1 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalCertificate.cs @@ -38,7 +38,7 @@ namespace MimeKit.Cryptography { public class WindowsSecureMimeDigitalCertificate : IDigitalCertificate { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs index b2dd2fa73d..7754ab3489 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeDigitalSignature.cs @@ -46,7 +46,7 @@ public class WindowsSecureMimeDigitalSignature : IDigitalSignature DigitalSignatureVerifyException vex; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -209,4 +209,4 @@ public bool Verify (bool verifySignatureOnly) #endregion } -} \ No newline at end of file +} diff --git a/MimeKit/Cryptography/X509CertificateChain.cs b/MimeKit/Cryptography/X509CertificateChain.cs index ead95801e4..7a99a7ca80 100644 --- a/MimeKit/Cryptography/X509CertificateChain.cs +++ b/MimeKit/Cryptography/X509CertificateChain.cs @@ -43,7 +43,7 @@ public class X509CertificateChain : IList, IX509Store readonly List certificates; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new X.509 certificate chain. @@ -54,7 +54,7 @@ public X509CertificateChain () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new X.509 certificate chain based on the specified collection of certificates. @@ -168,7 +168,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether the is read only. /// /// /// A is never read-only. diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index 3ea55ceea2..f1c7e8669c 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -60,7 +60,7 @@ public abstract class X509CertificateDatabase : IX509CertificateDatabase readonly char[] passwd; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// The password is used to encrypt and decrypt private keys in the database and cannot be null. @@ -83,11 +83,11 @@ protected X509CertificateDatabase (string password) /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// ~X509CertificateDatabase () { @@ -966,14 +966,14 @@ protected virtual void Dispose (bool disposing) } /// - /// Releases all resource used by the object. + /// Releases all resource used by the object. /// /// Call when you are finished using the - /// . The method leaves the - /// in an unusable state. After calling + /// . The method leaves the + /// in an unusable state. After calling /// , you must release all references to the - /// so the garbage collector can reclaim the memory that - /// the was occupying. + /// so the garbage collector can reclaim the memory that + /// the was occupying. public void Dispose () { Dispose (true); diff --git a/MimeKit/Cryptography/X509CertificateRecord.cs b/MimeKit/Cryptography/X509CertificateRecord.cs index a23a83705d..089c61e217 100644 --- a/MimeKit/Cryptography/X509CertificateRecord.cs +++ b/MimeKit/Cryptography/X509CertificateRecord.cs @@ -250,7 +250,7 @@ public byte[] SubjectKeyIdentifier { public AsymmetricKeyParameter PrivateKey { get; set; } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new certificate record with a private key for storing in a @@ -283,7 +283,7 @@ public X509CertificateRecord (X509Certificate certificate, AsymmetricKeyParamete } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new certificate record for storing in a . @@ -302,7 +302,7 @@ public X509CertificateRecord (X509Certificate certificate) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// This constructor is only meant to be used by implementors of diff --git a/MimeKit/Cryptography/X509CertificateStore.cs b/MimeKit/Cryptography/X509CertificateStore.cs index 2f952718ae..e4742f87b5 100644 --- a/MimeKit/Cryptography/X509CertificateStore.cs +++ b/MimeKit/Cryptography/X509CertificateStore.cs @@ -49,7 +49,7 @@ public class X509CertificateStore : IX509Store readonly List certs; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Cryptography/X509CrlRecord.cs b/MimeKit/Cryptography/X509CrlRecord.cs index 9184cd5bee..e62ca2aabc 100644 --- a/MimeKit/Cryptography/X509CrlRecord.cs +++ b/MimeKit/Cryptography/X509CrlRecord.cs @@ -135,7 +135,7 @@ public class X509CrlRecord public X509Crl Crl { get; set; } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new CRL record for storing in a . @@ -159,7 +159,7 @@ public X509CrlRecord (X509Crl crl) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// This constructor is only meant to be used by implementors of diff --git a/MimeKit/DomainList.cs b/MimeKit/DomainList.cs index 5fc05a3b34..c9f3cfe8df 100644 --- a/MimeKit/DomainList.cs +++ b/MimeKit/DomainList.cs @@ -44,7 +44,7 @@ public class DomainList : IList readonly List domains; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new based on the domains provided. @@ -62,7 +62,7 @@ public DomainList (IEnumerable domains) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -216,7 +216,7 @@ public bool Contains (string domain) } /// - /// Copies all of the domains in the to the specified array. + /// Copies all of the domains in the to the specified array. /// /// /// Copies all of the domains within the into the array, @@ -260,7 +260,7 @@ public bool Remove (string domain) } /// - /// Gets the number of domains in the . + /// Gets the number of domains in the . /// /// /// Indicates the number of domains in the list. @@ -271,7 +271,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether the is read only. /// /// /// A is never read-only. @@ -389,7 +389,7 @@ void OnChanged () } /// - /// Tries to parse a list of domains. + /// Try to parse a list of domains. /// /// /// Attempts to parse a from the text buffer starting at the @@ -449,7 +449,7 @@ internal static bool TryParse (byte[] buffer, ref int index, int endIndex, bool } /// - /// Tries to parse a list of domains. + /// Try to parse a list of domains. /// /// /// Attempts to parse a from the supplied text. The index diff --git a/MimeKit/Encodings/Base64Decoder.cs b/MimeKit/Encodings/Base64Decoder.cs index 4216bbf0a3..b2807d179a 100644 --- a/MimeKit/Encodings/Base64Decoder.cs +++ b/MimeKit/Encodings/Base64Decoder.cs @@ -61,7 +61,7 @@ public class Base64Decoder : IMimeDecoder byte npad; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new base64 decoder. diff --git a/MimeKit/Encodings/Base64Encoder.cs b/MimeKit/Encodings/Base64Encoder.cs index 7792e4f61e..dac04562a9 100644 --- a/MimeKit/Encodings/Base64Encoder.cs +++ b/MimeKit/Encodings/Base64Encoder.cs @@ -52,7 +52,7 @@ public class Base64Encoder : IMimeEncoder byte saved; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new base64 encoder. @@ -72,7 +72,7 @@ internal Base64Encoder (bool rfc2047, int maxLineLength = 72) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new base64 encoder. diff --git a/MimeKit/Encodings/HexDecoder.cs b/MimeKit/Encodings/HexDecoder.cs index 102ffc5e79..4d793e40b0 100644 --- a/MimeKit/Encodings/HexDecoder.cs +++ b/MimeKit/Encodings/HexDecoder.cs @@ -48,7 +48,7 @@ enum HexDecoderState : byte { byte saved; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new hex decoder. diff --git a/MimeKit/Encodings/HexEncoder.cs b/MimeKit/Encodings/HexEncoder.cs index 94d953f23a..175fc84c64 100644 --- a/MimeKit/Encodings/HexEncoder.cs +++ b/MimeKit/Encodings/HexEncoder.cs @@ -44,7 +44,7 @@ public class HexEncoder : IMimeEncoder }; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new hex encoder. diff --git a/MimeKit/Encodings/PassThroughDecoder.cs b/MimeKit/Encodings/PassThroughDecoder.cs index 22584c54d7..98ad1513a2 100644 --- a/MimeKit/Encodings/PassThroughDecoder.cs +++ b/MimeKit/Encodings/PassThroughDecoder.cs @@ -36,7 +36,7 @@ namespace MimeKit.Encodings { public class PassThroughDecoder : IMimeDecoder { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// The encoding to return in the property. /// diff --git a/MimeKit/Encodings/PassThroughEncoder.cs b/MimeKit/Encodings/PassThroughEncoder.cs index b724875519..9082be84af 100644 --- a/MimeKit/Encodings/PassThroughEncoder.cs +++ b/MimeKit/Encodings/PassThroughEncoder.cs @@ -36,7 +36,7 @@ namespace MimeKit.Encodings { public class PassThroughEncoder : IMimeEncoder { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// The encoding to return in the property. /// diff --git a/MimeKit/Encodings/QEncoder.cs b/MimeKit/Encodings/QEncoder.cs index 805c2ed6e7..5b07ed4299 100644 --- a/MimeKit/Encodings/QEncoder.cs +++ b/MimeKit/Encodings/QEncoder.cs @@ -66,7 +66,7 @@ public class QEncoder : IMimeEncoder readonly CharType mask; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new rfc2047 quoted-printable encoder. diff --git a/MimeKit/Encodings/QuotedPrintableDecoder.cs b/MimeKit/Encodings/QuotedPrintableDecoder.cs index d74ca6b0fe..ddf6fe9f9c 100644 --- a/MimeKit/Encodings/QuotedPrintableDecoder.cs +++ b/MimeKit/Encodings/QuotedPrintableDecoder.cs @@ -51,7 +51,7 @@ enum QpDecoderState : byte { byte saved; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new quoted-printable decoder. @@ -65,7 +65,7 @@ public QuotedPrintableDecoder (bool rfc2047) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new quoted-printable decoder. diff --git a/MimeKit/Encodings/QuotedPrintableEncoder.cs b/MimeKit/Encodings/QuotedPrintableEncoder.cs index fc14ffa273..ce5913cdd0 100644 --- a/MimeKit/Encodings/QuotedPrintableEncoder.cs +++ b/MimeKit/Encodings/QuotedPrintableEncoder.cs @@ -52,7 +52,7 @@ public class QuotedPrintableEncoder : IMimeEncoder short saved; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new quoted-printable encoder. diff --git a/MimeKit/Encodings/UUDecoder.cs b/MimeKit/Encodings/UUDecoder.cs index 7e457ed80e..8f83e46779 100644 --- a/MimeKit/Encodings/UUDecoder.cs +++ b/MimeKit/Encodings/UUDecoder.cs @@ -77,7 +77,7 @@ enum UUDecoderState : byte { uint saved; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new Unix-to-Unix decoder. @@ -92,7 +92,7 @@ public UUDecoder (bool payloadOnly) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new Unix-to-Unix decoder. diff --git a/MimeKit/Encodings/UUEncoder.cs b/MimeKit/Encodings/UUEncoder.cs index 9263c2b1a2..84e6591654 100644 --- a/MimeKit/Encodings/UUEncoder.cs +++ b/MimeKit/Encodings/UUEncoder.cs @@ -48,7 +48,7 @@ public class UUEncoder : IMimeEncoder byte uulen; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new Unix-to-Unix encoder. diff --git a/MimeKit/Encodings/YDecoder.cs b/MimeKit/Encodings/YDecoder.cs index 802594c74d..d60f945559 100644 --- a/MimeKit/Encodings/YDecoder.cs +++ b/MimeKit/Encodings/YDecoder.cs @@ -72,7 +72,7 @@ enum YDecoderState : byte { Crc32 crc; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new yEnc decoder. @@ -88,7 +88,7 @@ public YDecoder (bool payloadOnly) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new yEnc decoder. diff --git a/MimeKit/Encodings/YEncoder.cs b/MimeKit/Encodings/YEncoder.cs index a6aabc01a8..31c8f677e9 100644 --- a/MimeKit/Encodings/YEncoder.cs +++ b/MimeKit/Encodings/YEncoder.cs @@ -44,7 +44,7 @@ public class YEncoder : IMimeEncoder Crc32 crc; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new yEnc encoder. diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index f57c840294..c382baa237 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -273,7 +273,7 @@ public bool AllowMixedHeaderCharsets { /// /// The method to use for encoding Content-Type and Content-Disposition parameter /// values when the is set to - /// . + /// . /// The MIME specifications specify that the proper method for encoding Content-Type /// and Content-Disposition parameter values is the method described in /// rfc2231. However, it is common for @@ -307,7 +307,7 @@ static FormatOptions () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new set of formatting options for use with methods such as @@ -329,7 +329,7 @@ public FormatOptions () } /// - /// Clones an instance of . + /// Clones an instance of . /// /// /// Clones the formatting options. diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index f2302fd94b..3f82e66128 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -42,7 +42,7 @@ namespace MimeKit { public class GroupAddress : InternetAddress { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name and list of addresses. The @@ -61,7 +61,7 @@ public GroupAddress (Encoding encoding, string name, IEnumerable - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. ///
/// /// Creates a new with the specified name and list of addresses. @@ -73,7 +73,7 @@ public GroupAddress (string name, IEnumerable addresses) : this } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name. The specified @@ -91,7 +91,7 @@ public GroupAddress (Encoding encoding, string name) : base (encoding, name) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name. @@ -217,14 +217,14 @@ public override string ToString (FormatOptions options, bool encode) #region IEquatable implementation /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// /// /// Compares two group addresses to determine if they are identical or not. /// - /// The to compare with the current . - /// true if the specified is equal to the current - /// ; otherwise, false. + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. public override bool Equals (InternetAddress other) { var group = other as GroupAddress; @@ -261,7 +261,7 @@ static bool TryParse (ParserOptions options, byte[] text, ref int index, int end } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -301,7 +301,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -325,7 +325,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Grou } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -363,7 +363,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -385,7 +385,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out GroupAddress gro } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -419,7 +419,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out GroupAddr } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -437,7 +437,7 @@ public static bool TryParse (byte[] buffer, out GroupAddress group) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -474,7 +474,7 @@ public static bool TryParse (ParserOptions options, string text, out GroupAddres } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a single . If the address is not a group address or @@ -492,13 +492,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -535,13 +535,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// The number of bytes in the input buffer to parse. @@ -561,13 +561,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -602,13 +602,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// @@ -626,13 +626,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// @@ -663,13 +663,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// /// is null. @@ -683,13 +683,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The text. /// @@ -725,13 +725,13 @@ public static bool TryParse (string text, out GroupAddress group) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a single . If the address is not a group address or /// there is more than a single group address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The text. /// /// is null. diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index 8667d1f8fa..d13f6728db 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -55,7 +55,7 @@ public class Header byte[] rawValue; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header for the specified field and @@ -94,7 +94,7 @@ public Header (Encoding encoding, HeaderId id, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header for the specified field and @@ -137,7 +137,7 @@ public Header (string charset, HeaderId id, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header for the specified field and @@ -156,7 +156,7 @@ public Header (HeaderId id, string value) : this (Encoding.UTF8, id, value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header for the specified field and @@ -205,7 +205,7 @@ public Header (Encoding encoding, string field, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header for the specified field and @@ -258,7 +258,7 @@ public Header (string charset, string field, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header for the specified field and @@ -279,7 +279,7 @@ public Header (string field, string value) : this (Encoding.UTF8, field, value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header with the specified values. @@ -300,7 +300,7 @@ protected Header (ParserOptions options, HeaderId id, string name, byte[] field, } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header with the specified raw values. @@ -331,7 +331,7 @@ internal protected Header (ParserOptions options, byte[] field, byte[] value, bo } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message or entity header with the specified raw values. @@ -1388,7 +1388,7 @@ internal static unsafe bool TryParse (ParserOptions options, byte* input, int le } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a header from the supplied buffer starting at the given index @@ -1421,7 +1421,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a header from the supplied buffer starting at the given index @@ -1445,7 +1445,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Head } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a header from the supplied buffer starting at the specified index. @@ -1477,7 +1477,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a header from the supplied buffer starting at the specified index. @@ -1498,7 +1498,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out Header header) } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a header from the specified buffer. @@ -1518,7 +1518,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out Header he } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a header from the specified buffer. @@ -1535,7 +1535,7 @@ public static bool TryParse (byte[] buffer, out Header header) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a header from the specified text. @@ -1563,7 +1563,7 @@ public static bool TryParse (ParserOptions options, string text, out Header head } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a header from the specified text. diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index 918fd3ba5d..426bd54b43 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -37,7 +37,7 @@ namespace MimeKit { /// - /// A list of s. + /// A list of s. /// /// /// Represents a list of headers as found in a @@ -59,7 +59,7 @@ internal HeaderList (ParserOptions options) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new empty header list. @@ -69,7 +69,7 @@ public HeaderList () : this (ParserOptions.Default.Clone ()) } /// - /// Adds a header with the specified field and value. + /// Add a header with the specified field and value. /// /// /// Adds a new header for the specified field and value pair. @@ -88,7 +88,7 @@ public void Add (HeaderId id, string value) } /// - /// Adds a header with the specified field and value. + /// Add a header with the specified field and value. /// /// /// Adds a new header for the specified field and value pair. @@ -109,7 +109,7 @@ public void Add (string field, string value) } /// - /// Adds a header with the specified field and value. + /// Add a header with the specified field and value. /// /// /// Adds a new header for the specified field and value pair. @@ -131,7 +131,7 @@ public void Add (HeaderId id, Encoding encoding, string value) } /// - /// Adds a header with the specified field and value. + /// Add a header with the specified field and value. /// /// /// Adds a new header for the specified field and value pair. @@ -155,7 +155,7 @@ public void Add (string field, Encoding encoding, string value) } /// - /// Checks if the contains a header with the specified field name. + /// Check if the contains a header with the specified field name. /// /// /// Determines whether or not the header list contains the specified header. @@ -175,7 +175,7 @@ public bool Contains (HeaderId id) } /// - /// Checks if the contains a header with the specified field name. + /// Check if the contains a header with the specified field name. /// /// /// Determines whether or not the header list contains the specified header. @@ -195,7 +195,7 @@ public bool Contains (string field) } /// - /// Gets the index of the requested header, if it exists. + /// Get the index of the requested header, if it exists. /// /// /// Finds the first index of the specified header, if it exists. @@ -219,7 +219,7 @@ public int IndexOf (HeaderId id) } /// - /// Gets the index of the requested header, if it exists. + /// Get the index of the requested header, if it exists. /// /// /// Finds the first index of the specified header, if it exists. @@ -243,7 +243,7 @@ public int IndexOf (string field) } /// - /// Inserts a header with the specified field and value at the given index. + /// Insert a header with the specified field and value at the given index. /// /// /// Inserts the header at the specified index in the list. @@ -265,7 +265,7 @@ public void Insert (int index, HeaderId id, string value) } /// - /// Inserts a header with the specified field and value at the given index. + /// Insert a header with the specified field and value at the given index. /// /// /// Inserts the header at the specified index in the list. @@ -290,7 +290,7 @@ public void Insert (int index, string field, string value) } /// - /// Inserts a header with the specified field and value at the given index. + /// Insert a header with the specified field and value at the given index. /// /// /// Inserts the header at the specified index in the list. @@ -315,7 +315,7 @@ public void Insert (int index, HeaderId id, Encoding encoding, string value) } /// - /// Inserts a header with the specified field and value at the given index. + /// Insert a header with the specified field and value at the given index. /// /// /// Inserts the header at the specified index in the list. @@ -343,7 +343,7 @@ public void Insert (int index, string field, Encoding encoding, string value) } /// - /// Gets the last index of the requested header, if it exists. + /// Get the last index of the requested header, if it exists. /// /// /// Finds the last index of the specified header, if it exists. @@ -367,7 +367,7 @@ public int LastIndexOf (HeaderId id) } /// - /// Gets the last index of the requested header, if it exists. + /// Get the last index of the requested header, if it exists. /// /// /// Finds the last index of the specified header, if it exists. @@ -391,7 +391,7 @@ public int LastIndexOf (string field) } /// - /// Removes the first occurance of the specified header field. + /// Remove the first occurance of the specified header field. /// /// /// Removes the first occurance of the specified header field, if any exist. @@ -415,7 +415,7 @@ public bool Remove (HeaderId id) } /// - /// Removes the first occurance of the specified header field. + /// Remove the first occurance of the specified header field. /// /// /// Removes the first occurance of the specified header field, if any exist. @@ -439,7 +439,7 @@ public bool Remove (string field) } /// - /// Removes all of the headers matching the specified field name. + /// Remove all of the headers matching the specified field name. /// /// /// Removes all of the headers matching the specified field name. @@ -467,7 +467,7 @@ public void RemoveAll (HeaderId id) } /// - /// Removes all of the headers matching the specified field name. + /// Remove all of the headers matching the specified field name. /// /// /// Removes all of the headers matching the specified field name. @@ -495,7 +495,7 @@ public void RemoveAll (string field) } /// - /// Replaces all headers with identical field names with the single specified header. + /// Replace all headers with identical field names with the single specified header. /// /// /// Replaces all headers with identical field names with the single specified header. @@ -518,7 +518,7 @@ public void Replace (HeaderId id, Encoding encoding, string value) } /// - /// Replaces all headers with identical field names with the single specified header. + /// Replace all headers with identical field names with the single specified header. /// /// /// Replaces all headers with identical field names with the single specified header. @@ -538,7 +538,7 @@ public void Replace (HeaderId id, string value) } /// - /// Replaces all headers with identical field names with the single specified header. + /// Replace all headers with identical field names with the single specified header. /// /// /// Replaces all headers with identical field names with the single specified header. @@ -560,7 +560,7 @@ public void Replace (string field, Encoding encoding, string value) } /// - /// Replaces all headers with identical field names with the single specified header. + /// Replace all headers with identical field names with the single specified header. /// /// /// Replaces all headers with identical field names with the single specified header. @@ -582,7 +582,7 @@ public void Replace (string field, string value) } /// - /// Gets or sets the value of the first occurance of a header + /// Get or set the value of the first occurance of a header /// with the specified field name. /// /// @@ -622,7 +622,7 @@ public string this [HeaderId id] { } /// - /// Gets or sets the value of the first occurance of a header + /// Get or set the value of the first occurance of a header /// with the specified field name. /// /// @@ -664,7 +664,7 @@ public string this [string field] { } /// - /// Write the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes all of the headers to the output stream. @@ -719,7 +719,7 @@ public string this [string field] { } /// - /// Asynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Writes all of the headers to the output stream. @@ -768,7 +768,7 @@ public string this [string field] { } /// - /// Write the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes all of the headers to the output stream. @@ -790,7 +790,7 @@ public string this [string field] { } /// - /// Asynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Writes all of the headers to the output stream. @@ -815,7 +815,7 @@ public string this [string field] { #region ICollection implementation /// - /// Gets the number of headers in the list. + /// Get the number of headers in the list. /// /// /// Gets the number of headers in the list. @@ -826,7 +826,7 @@ public int Count { } /// - /// Gets whether or not the header list is read only. + /// Get whether or not the header list is read only. /// /// /// A is never read-only. @@ -837,7 +837,7 @@ public bool IsReadOnly { } /// - /// Adds the specified header. + /// Add the specified header. /// /// /// Adds the specified header to the end of the header list. @@ -861,7 +861,7 @@ public void Add (Header header) } /// - /// Clears the header list. + /// Clear the header list. /// /// /// Removes all of the headers from the list. @@ -878,7 +878,7 @@ public void Clear () } /// - /// Checks if the contains the specified header. + /// Check if the contains the specified header. /// /// /// Determines whether or not the header list contains the specified header. @@ -898,7 +898,7 @@ public bool Contains (Header header) } /// - /// Copies all of the headers in the to the specified array. + /// Copy all of the headers in the to the specified array. /// /// /// Copies all of the headers within the into the array, @@ -918,7 +918,7 @@ public void CopyTo (Header[] array, int arrayIndex) } /// - /// Removes the specified header. + /// Remove the specified header. /// /// /// Removes the specified header from the list if it exists. @@ -961,7 +961,7 @@ public bool Remove (Header header) } /// - /// Replaces all headers with identical field names with the single specified header. + /// Replace all headers with identical field names with the single specified header. /// /// /// Replaces all headers with identical field names with the single specified header. @@ -1010,7 +1010,7 @@ public void Replace (Header header) #region IList implementation /// - /// Gets the index of the requested header, if it exists. + /// Get the index of the requested header, if it exists. /// /// /// Finds the index of the specified header, if it exists. @@ -1029,7 +1029,7 @@ public int IndexOf (Header header) } /// - /// Inserts the specified header at the given index. + /// Insert the specified header at the given index. /// /// /// Inserts the header at the specified index in the list. @@ -1068,7 +1068,7 @@ public void Insert (int index, Header header) } /// - /// Removes the header at the specified index. + /// Remove the header at the specified index. /// /// /// Removes the header at the specified index. @@ -1104,10 +1104,10 @@ public void RemoveAt (int index) } /// - /// Gets or sets the at the specified index. + /// Get or set the at the specified index. /// /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// The header at the specified index. /// The index. @@ -1184,7 +1184,7 @@ public Header this [int index] { #region IEnumerable implementation /// - /// Gets an enumerator for the list of headers. + /// Get an enumerator for the list of headers. /// /// /// Gets an enumerator for the list of headers. @@ -1200,7 +1200,7 @@ public IEnumerator
GetEnumerator () #region IEnumerable implementation /// - /// Gets an enumerator for the list of headers. + /// Get an enumerator for the list of headers. /// /// /// Gets an enumerator for the list of headers. diff --git a/MimeKit/HeaderListCollection.cs b/MimeKit/HeaderListCollection.cs index 6f2cae2144..4a704e7c70 100644 --- a/MimeKit/HeaderListCollection.cs +++ b/MimeKit/HeaderListCollection.cs @@ -42,7 +42,7 @@ public class HeaderListCollection : ICollection readonly List groups; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -75,10 +75,10 @@ public bool IsReadOnly { } /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// The group of headers at the specified index. /// The index. @@ -167,7 +167,7 @@ public bool Contains (HeaderList group) } /// - /// Copies all of the header groups in the to the specified array. + /// Copies all of the header groups in the to the specified array. /// /// /// Copies all of the header groups within the into the array, diff --git a/MimeKit/IMimeContent.cs b/MimeKit/IMimeContent.cs index 6ff05443c5..6271a3fff3 100644 --- a/MimeKit/IMimeContent.cs +++ b/MimeKit/IMimeContent.cs @@ -30,7 +30,7 @@ namespace MimeKit { /// - /// An interface for content stream encapsulation as used by . + /// An interface for content stream encapsulation as used by . /// /// /// Implemented by . diff --git a/MimeKit/IO/BoundStream.cs b/MimeKit/IO/BoundStream.cs index 744aad9b39..8235b9fee5 100644 --- a/MimeKit/IO/BoundStream.cs +++ b/MimeKit/IO/BoundStream.cs @@ -46,7 +46,7 @@ public class BoundStream : Stream bool eos; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// If the is less than 0, then the end of the stream @@ -123,11 +123,11 @@ public long EndBoundary { /// /// Checks whether or not the underlying stream will remain open after - /// the is disposed. + /// the is disposed. /// /// /// Checks whether or not the underlying stream will remain open after - /// the is disposed. + /// the is disposed. /// /// true if the underlying stream should remain open after the /// is disposed; otherwise, false. diff --git a/MimeKit/IO/ChainedStream.cs b/MimeKit/IO/ChainedStream.cs index daabc5c4fd..7a80dc08b1 100644 --- a/MimeKit/IO/ChainedStream.cs +++ b/MimeKit/IO/ChainedStream.cs @@ -49,7 +49,7 @@ public class ChainedStream : Stream bool eos; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/FilteredStream.cs b/MimeKit/IO/FilteredStream.cs index efe49b56e1..833a361481 100644 --- a/MimeKit/IO/FilteredStream.cs +++ b/MimeKit/IO/FilteredStream.cs @@ -58,7 +58,7 @@ enum IOOperation : byte { bool flushed; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a filtered stream using the specified source stream. diff --git a/MimeKit/IO/Filters/ArmoredFromFilter.cs b/MimeKit/IO/Filters/ArmoredFromFilter.cs index 152f293f96..0c96f3bb7d 100644 --- a/MimeKit/IO/Filters/ArmoredFromFilter.cs +++ b/MimeKit/IO/Filters/ArmoredFromFilter.cs @@ -45,7 +45,7 @@ public class ArmoredFromFilter : MimeFilterBase bool midline; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/Filters/BestEncodingFilter.cs b/MimeKit/IO/Filters/BestEncodingFilter.cs index da0d294d8d..acca9210d5 100644 --- a/MimeKit/IO/Filters/BestEncodingFilter.cs +++ b/MimeKit/IO/Filters/BestEncodingFilter.cs @@ -45,7 +45,7 @@ public class BestEncodingFilter : IMimeFilter byte pc; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/Filters/CharsetFilter.cs b/MimeKit/IO/Filters/CharsetFilter.cs index 4031ed8b18..3f4c0f9e9a 100644 --- a/MimeKit/IO/Filters/CharsetFilter.cs +++ b/MimeKit/IO/Filters/CharsetFilter.cs @@ -52,7 +52,7 @@ static Encoding GetEncoding (string paramName, string encodingName) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new to convert text from the specified @@ -77,7 +77,7 @@ public CharsetFilter (string sourceEncodingName, string targetEncodingName) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new to convert text from the specified @@ -101,7 +101,7 @@ public CharsetFilter (int sourceCodePage, int targetCodePage) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new to convert text from the specified diff --git a/MimeKit/IO/Filters/DecoderFilter.cs b/MimeKit/IO/Filters/DecoderFilter.cs index c88efaf5c0..12a2ea3c59 100644 --- a/MimeKit/IO/Filters/DecoderFilter.cs +++ b/MimeKit/IO/Filters/DecoderFilter.cs @@ -61,7 +61,7 @@ public ContentEncoding Encoding { } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new using the specified decoder. diff --git a/MimeKit/IO/Filters/Dos2UnixFilter.cs b/MimeKit/IO/Filters/Dos2UnixFilter.cs index d49a398ca7..c478dab645 100644 --- a/MimeKit/IO/Filters/Dos2UnixFilter.cs +++ b/MimeKit/IO/Filters/Dos2UnixFilter.cs @@ -37,7 +37,7 @@ public class Dos2UnixFilter : MimeFilterBase byte pc; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/Filters/EncoderFilter.cs b/MimeKit/IO/Filters/EncoderFilter.cs index fd2fa8bc28..2156e683fc 100644 --- a/MimeKit/IO/Filters/EncoderFilter.cs +++ b/MimeKit/IO/Filters/EncoderFilter.cs @@ -61,7 +61,7 @@ public ContentEncoding Encoding { } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new using the specified encoder. diff --git a/MimeKit/IO/Filters/MimeFilterBase.cs b/MimeKit/IO/Filters/MimeFilterBase.cs index e51816ba37..295d1194e7 100644 --- a/MimeKit/IO/Filters/MimeFilterBase.cs +++ b/MimeKit/IO/Filters/MimeFilterBase.cs @@ -41,7 +41,7 @@ public abstract class MimeFilterBase : IMimeFilter byte[] inbuf; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/Filters/PassThroughFilter.cs b/MimeKit/IO/Filters/PassThroughFilter.cs index c31e791c40..7ae01a60f5 100644 --- a/MimeKit/IO/Filters/PassThroughFilter.cs +++ b/MimeKit/IO/Filters/PassThroughFilter.cs @@ -34,7 +34,7 @@ namespace MimeKit.IO.Filters { public class PassThroughFilter : IMimeFilter { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs index 283a425164..286e7f2495 100644 --- a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs +++ b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs @@ -38,7 +38,7 @@ public class TrailingWhitespaceFilter : MimeFilterBase readonly PackedByteArray lwsp = new PackedByteArray (); /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/Filters/Unix2DosFilter.cs b/MimeKit/IO/Filters/Unix2DosFilter.cs index b6c9d8f149..d9582dda51 100644 --- a/MimeKit/IO/Filters/Unix2DosFilter.cs +++ b/MimeKit/IO/Filters/Unix2DosFilter.cs @@ -37,7 +37,7 @@ public class Unix2DosFilter : MimeFilterBase byte pc; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/ICancellableStream.cs b/MimeKit/IO/ICancellableStream.cs index 03290b3ee5..2e08f0b01e 100644 --- a/MimeKit/IO/ICancellableStream.cs +++ b/MimeKit/IO/ICancellableStream.cs @@ -32,9 +32,9 @@ namespace MimeKit.IO { ///
/// /// This interface is meant to extend the functionality of a , - /// allowing the to have much finer-grained canellability. + /// allowing the to have much finer-grained canellability. /// When a custom stream implementation also implements this interface, - /// the will opt to use this interface + /// the will opt to use this interface /// instead of the normal /// API to read data from the stream. /// This is really useful when parsing a message or other MIME entity @@ -48,7 +48,7 @@ public interface ICancellableStream ///
/// /// When a custom stream implementation also implements this interface, - /// the will opt to use this interface + /// the will opt to use this interface /// instead of the normal /// API to read data from the stream. /// This is really useful when parsing a message or other MIME entity @@ -68,7 +68,7 @@ public interface ICancellableStream ///
/// /// When a custom stream implementation also implements this interface, - /// writing a or + /// writing a or /// to the custom stream will opt to use this interface /// instead of the normal /// API to write data to the stream. diff --git a/MimeKit/IO/MeasuringStream.cs b/MimeKit/IO/MeasuringStream.cs index 064c356bbf..fe188d9cc4 100644 --- a/MimeKit/IO/MeasuringStream.cs +++ b/MimeKit/IO/MeasuringStream.cs @@ -46,7 +46,7 @@ public class MeasuringStream : Stream long length; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index 74a1c2bdc2..c9caad3419 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -58,7 +58,7 @@ public class MemoryBlockStream : Stream bool disposed; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with an initial memory block diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 00ead20f2d..14a822c4b3 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -32,7 +32,7 @@ namespace MimeKit { /// - /// An internet address, as specified by rfc0822. + /// An abstract internet address, as specified by rfc0822. /// /// /// A can be any type of address defined by the @@ -52,7 +52,7 @@ public abstract class InternetAddress : IComparable, IEquatable string name; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Initializes the and properties of the internet address. @@ -72,7 +72,7 @@ protected InternetAddress (Encoding encoding, string name) } /// - /// Gets or sets the character encoding to use when encoding the name of the address. + /// Get or set the character encoding to use when encoding the name of the address. /// /// /// The character encoding is used to convert the property, if it is set, @@ -97,7 +97,7 @@ public Encoding Encoding { } /// - /// Gets or sets the display name of the address. + /// Get or set the display name of the address. /// /// /// A name is optional and is typically set to the name of the person @@ -187,20 +187,20 @@ public int CompareTo (InternetAddress other) #region IEquatable implementation /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// /// /// Compares two internet addresses to determine if they are identical or not. /// - /// The to compare with the current . - /// true if the specified is equal to the current - /// ; otherwise, false. + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. public abstract bool Equals (InternetAddress other); #endregion /// - /// Determines whether the specified object is equal to the current object. + /// Determine whether the specified object is equal to the current object. /// /// /// The type of comparison between the current instance and the parameter depends on whether @@ -214,7 +214,7 @@ public override bool Equals (object obj) } /// - /// Returns the hash code for this instance. + /// Return the hash code for this instance. /// /// /// Returns the hash code for this instance. @@ -238,8 +238,7 @@ internal static string EncodeInternationalizedPhrase (string phrase) internal abstract void Encode (FormatOptions options, StringBuilder builder, bool firstToken, ref int lineLength); /// - /// Returns a string representation of the , - /// optionally encoding it for transport. + /// Serialize an to a string, optionally encoding it for transport. /// /// /// If the parameter is true, then this method will return @@ -256,8 +255,7 @@ internal static string EncodeInternationalizedPhrase (string phrase) public abstract string ToString (FormatOptions options, bool encode); /// - /// Returns a string representation of the , - /// optionally encoding it for transport. + /// Serialize an to a string, optionally encoding it for transport. /// /// /// If the parameter is true, then this method will return @@ -273,7 +271,7 @@ public string ToString (bool encode) } /// - /// Returns a string representation of a suitable for display. + /// Serialize an to a string suitable for display. /// /// /// The string returned by this method is suitable only for display purposes. @@ -287,7 +285,7 @@ public override string ToString () internal event EventHandler Changed; /// - /// Raises the internal changed event used by to keep headers in sync. + /// Raise the internal changed event used by to keep headers in sync. /// /// /// This method is called whenever a property of the internet address is changed. @@ -880,7 +878,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains @@ -925,7 +923,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains @@ -949,7 +947,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Inte } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains @@ -987,7 +985,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains @@ -1009,7 +1007,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out InternetAddress } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains @@ -1043,7 +1041,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out InternetA } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains @@ -1061,7 +1059,7 @@ public static bool TryParse (byte[] buffer, out InternetAddress address) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a single or . If the text contains @@ -1094,7 +1092,7 @@ public static bool TryParse (ParserOptions options, string text, out InternetAdd } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a single or . If the text contains @@ -1112,13 +1110,13 @@ public static bool TryParse (string text, out InternetAddress address) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -1155,13 +1153,13 @@ public static InternetAddress Parse (ParserOptions options, byte[] buffer, int s } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// The number of bytes in the input buffer to parse. @@ -1181,13 +1179,13 @@ public static InternetAddress Parse (byte[] buffer, int startIndex, int length) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -1222,13 +1220,13 @@ public static InternetAddress Parse (ParserOptions options, byte[] buffer, int s } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// @@ -1246,13 +1244,13 @@ public static InternetAddress Parse (byte[] buffer, int startIndex) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// @@ -1283,13 +1281,13 @@ public static InternetAddress Parse (ParserOptions options, byte[] buffer) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single or . If the buffer contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// /// is null. @@ -1303,13 +1301,13 @@ public static InternetAddress Parse (byte[] buffer) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a single or . If the text contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The text. /// @@ -1341,13 +1339,13 @@ public static InternetAddress Parse (ParserOptions options, string text) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a single or . If the text contains /// more data, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The text. /// /// is null. diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index 8a9cced54c..12b4d3b99e 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -55,7 +55,7 @@ public class InternetAddressList : IList, IEquatable list = new List (); /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new containing the supplied addresses. @@ -76,7 +76,7 @@ public InternetAddressList (IEnumerable addresses) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new, empty, . @@ -86,10 +86,10 @@ public InternetAddressList () } /// - /// Recursively gets all of the mailboxes contained within the . + /// Recursively get all of the mailboxes contained within the . /// /// - /// This API is useful for collecting a flattened list of + /// This API is useful for collecting a flattened list of /// recipients for use with sending via SMTP or for encrypting via S/MIME or PGP/MIME. /// /// The mailboxes. @@ -113,7 +113,7 @@ public IEnumerable Mailboxes { #region IList implementation /// - /// Gets the index of the specified address. + /// Get the index of the specified address. /// /// /// Finds the index of the specified address, if it exists. @@ -132,7 +132,7 @@ public int IndexOf (InternetAddress address) } /// - /// Inserts the address at the specified index. + /// Insert an address at the specified index. /// /// /// Inserts the address at the specified index in the list. @@ -159,7 +159,7 @@ public void Insert (int index, InternetAddress address) } /// - /// Removes the address at the specified index. + /// Remove the address at the specified index. /// /// /// Removes the address at the specified index. @@ -179,10 +179,10 @@ public void RemoveAt (int index) } /// - /// Gets or sets the at the specified index. + /// Get or set the at the specified index. /// /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// The internet address at the specified index. /// The index of the address to get or set. @@ -216,7 +216,7 @@ public InternetAddress this [int index] { #region ICollection implementation /// - /// Gets the number of addresses in the . + /// Get the number of addresses in the . /// /// /// Indicates the number of addresses in the list. @@ -227,7 +227,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether the is read only. /// /// /// A is never read-only. @@ -238,7 +238,7 @@ public bool IsReadOnly { } /// - /// Adds the specified address. + /// Add an address to the . /// /// /// Adds the specified address to the end of the address list. @@ -258,7 +258,7 @@ public void Add (InternetAddress address) } /// - /// Adds a collection of addresses. + /// Add a collection of addresses to the . /// /// /// Adds a range of addresses to the end of the address list. @@ -285,7 +285,7 @@ public void AddRange (IEnumerable addresses) } /// - /// Clears the address list. + /// Clear the address list. /// /// /// Removes all of the addresses from the list. @@ -303,7 +303,7 @@ public void Clear () } /// - /// Checks if the contains the specified address. + /// Check if the contains the specified address. /// /// /// Determines whether or not the address list contains the specified address. @@ -323,7 +323,7 @@ public bool Contains (InternetAddress address) } /// - /// Copies all of the addresses in the to the specified array. + /// Copy all of the addresses in the to the specified array. /// /// /// Copies all of the addresses within the into the array, @@ -343,7 +343,7 @@ public void CopyTo (InternetAddress[] array, int arrayIndex) } /// - /// Removes the specified address. + /// Remove the specified address from the . /// /// /// Removes the specified address. @@ -372,7 +372,7 @@ public bool Remove (InternetAddress address) #region IEnumerable implementation /// - /// Gets an enumerator for the list of addresses. + /// Get an enumerator for the list of addresses. /// /// /// Gets an enumerator for the list of addresses. @@ -388,7 +388,7 @@ public IEnumerator GetEnumerator () #region IEnumerable implementation /// - /// Gets an enumerator for the list of addresses. + /// Get an enumerator for the list of addresses. /// /// /// Gets an enumerator for the list of addresses. @@ -404,14 +404,14 @@ IEnumerator IEnumerable.GetEnumerator () #region IEquatable implementation /// - /// Determines whether the specified is equal to the current . + /// Determine whether the specified is equal to the current . /// /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// - /// The to compare with the current . - /// true if the specified is equal to the current - /// ; otherwise, false. + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. public bool Equals (InternetAddressList other) { if (other == null) @@ -433,7 +433,7 @@ public bool Equals (InternetAddressList other) #region IComparable implementation /// - /// Compares two internet address lists. + /// Compare two internet address lists. /// /// /// Compares two internet address lists for the purpose of sorting. @@ -461,7 +461,7 @@ public int CompareTo (InternetAddressList other) #endregion /// - /// Determines whether the specified object is equal to the current object. + /// Determine whether the specified object is equal to the current object. /// /// /// The type of comparison between the current instance and the parameter depends on whether @@ -475,7 +475,7 @@ public override bool Equals (object obj) } /// - /// Returns the hash code for this instance. + /// Return the hash code for this instance. /// /// /// Returns the hash code for this instance. @@ -499,8 +499,7 @@ internal void Encode (FormatOptions options, StringBuilder builder, bool firstTo } /// - /// Returns a string representation of the email addresses in the , - /// optionally encoding them for transport. + /// Serialize an to a string, optionally encoding the list of addresses for transport. /// /// /// If is true, each address in the list will be encoded @@ -533,8 +532,7 @@ public string ToString (FormatOptions options, bool encode) } /// - /// Returns a string representation of the email addresses in the , - /// optionally encoding them for transport. + /// Serialize an to a string, optionally encoding the list of addresses for transport. /// /// /// If is true, each address in the list will be encoded @@ -549,7 +547,7 @@ public string ToString (bool encode) } /// - /// Returns a string representation of the email addresses in the . + /// Serialize an to a string suitable for display. /// /// /// If there are multiple addresses in the list, they will be separated by a comma. @@ -621,7 +619,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the given index @@ -660,7 +658,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the given index @@ -684,7 +682,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Inte } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the specified index. @@ -720,7 +718,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the specified index. @@ -741,7 +739,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out InternetAddressL } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the specified buffer. @@ -773,7 +771,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out InternetA } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the specified buffer. @@ -790,7 +788,7 @@ public static bool TryParse (byte[] buffer, out InternetAddressList addresses) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a list of addresses from the specified text. @@ -823,7 +821,7 @@ public static bool TryParse (ParserOptions options, string text, out InternetAdd } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a list of addresses from the specified text. @@ -840,13 +838,13 @@ public static bool TryParse (string text, out InternetAddressList addresses) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -876,13 +874,13 @@ public static InternetAddressList Parse (ParserOptions options, byte[] buffer, i } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the given index /// and spanning across the specified number of bytes. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// The number of bytes in the input buffer to parse. @@ -902,12 +900,12 @@ public static InternetAddressList Parse (byte[] buffer, int startIndex, int leng } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the specified index. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -935,12 +933,12 @@ public static InternetAddressList Parse (ParserOptions options, byte[] buffer, i } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the supplied buffer starting at the specified index. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// @@ -958,12 +956,12 @@ public static InternetAddressList Parse (byte[] buffer, int startIndex) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the specified buffer. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// @@ -987,12 +985,12 @@ public static InternetAddressList Parse (ParserOptions options, byte[] buffer) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a list of addresses from the specified buffer. /// - /// The parsed . + /// The parsed . /// The input buffer. /// /// is null. @@ -1006,12 +1004,12 @@ public static InternetAddressList Parse (byte[] buffer) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a list of addresses from the specified text. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The text. /// @@ -1036,12 +1034,12 @@ public static InternetAddressList Parse (ParserOptions options, string text) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a list of addresses from the specified text. /// - /// The parsed . + /// The parsed . /// The text. /// /// is null. diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index 8497dd474b..bec777b711 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -66,7 +66,7 @@ internal MailboxAddress (Encoding encoding, string name, string address, int at) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name, address and route. The @@ -97,7 +97,7 @@ public MailboxAddress (Encoding encoding, string name, IEnumerable route } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name, address and route. @@ -118,7 +118,7 @@ public MailboxAddress (string name, IEnumerable route, string address) : } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified address and route. @@ -133,12 +133,13 @@ public MailboxAddress (string name, IEnumerable route, string address) : /// /// is malformed. /// + [Obsolete ("This constructor will be going away. Use new MailboxAddress(string name, IEnumerable route, string address) instead.")] public MailboxAddress (IEnumerable route, string address) : this (Encoding.UTF8, null, route, address) { } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name and address. The @@ -166,7 +167,7 @@ public MailboxAddress (Encoding encoding, string name, string address) : base (e } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified name and address. @@ -184,7 +185,7 @@ public MailboxAddress (string name, string address) : this (Encoding.UTF8, name, } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified address. @@ -202,6 +203,7 @@ public MailboxAddress (string name, string address) : this (Encoding.UTF8, name, /// /// is malformed. /// + [Obsolete("This constructor will be going away due to it causing too much confusion. Use new MailboxAddress(string name, string address) or MailboxAddress.Parse(string) instead.")] public MailboxAddress (string address) : this (Encoding.UTF8, null, address) { } @@ -234,7 +236,7 @@ public DomainList Route { /// Gets or sets the mailbox address. ///
/// - /// Represents the actual email address and is in the form of user@example.com. + /// Represents the actual email address and is in the form of user@domain.com. /// /// The mailbox address. /// @@ -534,14 +536,14 @@ public override string ToString (FormatOptions options, bool encode) #region IEquatable implementation /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// /// /// Compares two mailbox addresses to determine if they are identical or not. /// - /// The to compare with the current . - /// true if the specified is equal to the current - /// ; otherwise, false. + /// The to compare with the current . + /// true if the specified is equal to the current + /// ; otherwise, false. public override bool Equals (InternetAddress other) { var mailbox = other as MailboxAddress; @@ -578,7 +580,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -618,7 +620,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -642,7 +644,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Mail } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -680,7 +682,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, int startInde } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -702,7 +704,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out MailboxAddress m } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -736,7 +738,7 @@ public static bool TryParse (ParserOptions options, byte[] buffer, out MailboxAd } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -754,7 +756,7 @@ public static bool TryParse (byte[] buffer, out MailboxAddress mailbox) } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -791,7 +793,7 @@ public static bool TryParse (ParserOptions options, string text, out MailboxAddr } /// - /// Tries to parse the given text into a new instance. + /// Try to parse the given text into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or @@ -809,13 +811,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -852,13 +854,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// The number of bytes in the input buffer to parse. @@ -869,7 +871,7 @@ public static bool TryParse (string text, out MailboxAddress mailbox) /// and do not specify /// a valid range in the byte array. /// - /// + /// /// could not be parsed. /// public static new MailboxAddress Parse (byte[] buffer, int startIndex, int length) @@ -878,13 +880,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// The starting index of the input buffer. @@ -896,7 +898,7 @@ public static bool TryParse (string text, out MailboxAddress mailbox) /// /// is out of range. /// - /// + /// /// could not be parsed. /// public static new MailboxAddress Parse (ParserOptions options, byte[] buffer, int startIndex) @@ -919,13 +921,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// The starting index of the input buffer. /// @@ -943,13 +945,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The input buffer. /// @@ -980,13 +982,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given input buffer into a new instance. + /// Parse the given input buffer into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The input buffer. /// /// is null. @@ -1000,13 +1002,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The parser options to use. /// The text. /// @@ -1042,13 +1044,13 @@ public static bool TryParse (string text, out MailboxAddress mailbox) } /// - /// Parses the given text into a new instance. + /// Parse the given text into a new instance. /// /// /// Parses a single . If the address is not a mailbox address or /// there is more than a single mailbox address, then parsing will fail. /// - /// The parsed . + /// The parsed . /// The text. /// /// is null. diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index 69624e4db2..bccef8a8fc 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -36,7 +36,7 @@ namespace MimeKit { /// A message delivery status MIME part is a machine readable notification denoting the /// delivery status of a message and has a MIME-type of message/delivery-status. /// For more information, see rfc3464. - /// + /// ///
/// /// @@ -46,10 +46,10 @@ public class MessageDeliveryStatus : MimePart HeaderListCollection groups; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -60,7 +60,7 @@ public MessageDeliveryStatus (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -130,12 +130,12 @@ void OnGroupsChanged (object sender, EventArgs e) /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/MessageDispositionNotification.cs b/MimeKit/MessageDispositionNotification.cs index a4bf863562..0bcba10419 100644 --- a/MimeKit/MessageDispositionNotification.cs +++ b/MimeKit/MessageDispositionNotification.cs @@ -43,10 +43,10 @@ public class MessageDispositionNotification : MimePart HeaderList fields; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -57,7 +57,7 @@ public MessageDispositionNotification (MimeEntityConstructorArgs args) : base (a } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -107,12 +107,12 @@ void OnFieldsChanged (object sender, HeaderListChangedEventArgs e) /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/MessageIdList.cs b/MimeKit/MessageIdList.cs index dca28c6ba0..c7db71d502 100644 --- a/MimeKit/MessageIdList.cs +++ b/MimeKit/MessageIdList.cs @@ -43,7 +43,7 @@ public class MessageIdList : IList readonly List references; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new, empty, . @@ -73,7 +73,7 @@ public MessageIdList Clone () #region IList implementation /// - /// Gets the index of the requested Message-Id, if it exists. + /// Get the index of the requested Message-Id, if it exists. /// /// /// Finds the index of the specified Message-Id, if it exists. @@ -123,7 +123,7 @@ public void Insert (int index, string messageId) } /// - /// Removes the Message-Id at the specified index. + /// Remove the Message-Id at the specified index. /// /// /// Removes the Message-Id at the specified index. @@ -139,7 +139,7 @@ public void RemoveAt (int index) } /// - /// Gets or sets the at the specified index. + /// Get or set the Message-Id at the specified index. /// /// /// Gets or sets the Message-Id at the specified index. @@ -211,7 +211,7 @@ public void AddRange (IEnumerable items) } /// - /// Clears the Message-Id list. + /// Clear the Message-Id list. /// /// /// Removes all of the Message-Ids in the list. @@ -223,7 +223,7 @@ public void Clear () } /// - /// Checks if the contains the specified Message-Id. + /// Check if the contains the specified Message-Id. /// /// /// Determines whether or not the list contains the specified Message-Id. @@ -243,7 +243,7 @@ public bool Contains (string messageId) } /// - /// Copies all of the Message-Ids in the to the specified array. + /// Copy all of the Message-Ids in the to the specified array. /// /// /// Copies all of the Message-Ids within the into the array, @@ -263,7 +263,7 @@ public void CopyTo (string[] array, int arrayIndex) } /// - /// Removes the specified Message-Id. + /// Remove a Message-Id from the . /// /// /// Removes the first instance of the specified Message-Id from the list if it exists. @@ -288,7 +288,7 @@ public bool Remove (string messageId) } /// - /// Gets the number of Message-Ids in the . + /// Get the number of Message-Ids in the . /// /// /// Indicates the number of Message-Ids in the list. @@ -299,7 +299,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether the is read only. /// /// /// A is never read-only. @@ -314,7 +314,7 @@ public bool IsReadOnly { #region IEnumerable implementation /// - /// Gets an enumerator for the list of Message-Ids. + /// Get an enumerator for the list of Message-Ids. /// /// /// Gets an enumerator for the list of Message-Ids. @@ -330,7 +330,7 @@ public IEnumerator GetEnumerator () #region IEnumerable implementation /// - /// Gets an enumerator for the list of Message-Ids. + /// Get an enumerator for the list of Message-Ids. /// /// /// Gets an enumerator for the list of Message-Ids. @@ -344,7 +344,7 @@ IEnumerator IEnumerable.GetEnumerator () #endregion /// - /// Returns a string representation of the list of Message-Ids. + /// Serialize a to a string. /// /// /// Each Message-Id will be surrounded by angle brackets. diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index a02482edab..9eb97e8241 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -33,7 +33,7 @@ namespace MimeKit { /// - /// A MIME part containing a as its content. + /// A MIME part containing a as its content. /// /// /// Represents MIME entities such as those with a Content-Type of message/rfc822 or message/news. @@ -41,10 +41,10 @@ namespace MimeKit { public class MessagePart : MimeEntity { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -55,7 +55,7 @@ public MessagePart (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -68,7 +68,7 @@ public MessagePart (MimeEntityConstructorArgs args) : base (args) /// is null. /// /// - /// contains more than one . + /// contains more than one . /// -or- /// contains one or more arguments of an unknown type. /// @@ -99,7 +99,7 @@ public MessagePart (string subtype, params object[] args) : this (subtype) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Initializes the based on the provided media type and subtype. @@ -116,7 +116,7 @@ protected MessagePart (string mediaType, string mediaSubtype) : base (mediaType, } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new MIME message entity with the specified subtype. @@ -130,7 +130,7 @@ public MessagePart (string subtype) : this ("message", subtype) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message/rfc822 MIME entity. @@ -154,12 +154,12 @@ public MimeMessage Message { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -196,7 +196,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } /// - /// Writes the to the output stream. + /// Write the to the output stream. /// /// /// Writes the MIME entity and its message to the output stream. @@ -244,7 +244,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } /// - /// Asynchronously writes the to the output stream. + /// Asynchronously write the to the output stream. /// /// /// Asynchronously writes the MIME entity and its message to the output stream. diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 1fe238593d..077476b1a2 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -45,10 +45,10 @@ namespace MimeKit { public class MessagePartial : MimePart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -59,7 +59,7 @@ public MessagePartial (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new message/partial entity. @@ -149,12 +149,12 @@ public int? Total { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index 33d4f12409..4ac25bc861 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -34,7 +34,7 @@ namespace MimeKit { /// - /// Encapsulates a content stream used by . + /// Encapsulates a content stream used by . /// /// /// A represents the content of a . @@ -44,11 +44,11 @@ namespace MimeKit { public class ContentObject : MimeContent { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// When creating new s, the - /// should typically be unless the + /// When creating new s, the + /// should typically be unless the /// has already been encoded. /// /// The content stream. @@ -66,7 +66,7 @@ public ContentObject (Stream stream, ContentEncoding encoding = ContentEncoding. } /// - /// Encapsulates a content stream used by . + /// Encapsulates a content stream used by . /// /// /// A represents the content of a . @@ -78,11 +78,11 @@ public ContentObject (Stream stream, ContentEncoding encoding = ContentEncoding. public class MimeContent : IMimeContent { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// When creating new s, the - /// should typically be unless the + /// When creating new s, the + /// should typically be unless the /// has already been encoded. /// /// The content stream. diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index eb1a3aad4d..848738aef5 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -55,7 +55,7 @@ public abstract class MimeEntity Uri baseUri; /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// based on the . /// /// @@ -86,7 +86,7 @@ protected MimeEntity (MimeEntityConstructorArgs args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Initializes the based on the provided media type and subtype. @@ -103,7 +103,7 @@ protected MimeEntity (string mediaType, string mediaSubtype) : this (new Content } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Initializes the to the one provided. @@ -323,14 +323,14 @@ public bool IsAttachment { } /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// In general, the string returned from this method SHOULD NOT be used for serializing /// the message to disk. It is recommended that you use instead. /// - /// A that represents the current . + /// A that represents the current . public override string ToString () { using (var memory = new MemoryStream ()) { @@ -351,12 +351,12 @@ public override string ToString () /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -386,7 +386,7 @@ public virtual void Accept (MimeVisitor visitor) public abstract void Prepare (EncodingConstraint constraint, int maxLineLength = 78); /// - /// Write the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes the headers to the output stream, followed by a blank line. @@ -420,7 +420,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Asynchronously writes the headers to the output stream, followed by a blank line. @@ -457,7 +457,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Write the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes the headers to the output stream, followed by a blank line. @@ -483,7 +483,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Asynchronously writes the headers to the output stream, followed by a blank line. @@ -510,7 +510,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Write the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes the entity to the output stream. @@ -533,7 +533,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Asynchronously writes the entity to the output stream. @@ -557,7 +557,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Write the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes the entity to the output stream. @@ -579,7 +579,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Asynchronously writes the entity to the output stream. @@ -602,10 +602,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Write the to the specified file. + /// Write the to the specified file. /// /// - /// Writes the to the specified file using the provided formatting options. + /// Writes the entity to the specified file using the provided formatting options. /// /// The formatting options. /// The file. @@ -649,10 +649,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified file. + /// Asynchronously write the to the specified file. /// /// - /// Asynchronously writes the to the specified file using the provided formatting options. + /// Asynchronously writes the entity to the specified file using the provided formatting options. /// /// An awaitable task. /// The formatting options. @@ -697,10 +697,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Write the to the specified file. + /// Write the to the specified file. /// /// - /// Writes the to the specified file using the provided formatting options. + /// Writes the entity to the specified file using the provided formatting options. /// /// The formatting options. /// The file. @@ -745,10 +745,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified file. + /// Asynchronously write the to the specified file. /// /// - /// Asynchronously writes the to the specified file using the provided formatting options. + /// Asynchronously writes the entity to the specified file using the provided formatting options. /// /// An awaitable task. /// The formatting options. @@ -794,10 +794,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Write the to the specified file. + /// Write the to the specified file. /// /// - /// Writes the to the specified file using the default formatting options. + /// Writes the entity to the specified file using the default formatting options. /// /// The file. /// true if only the content should be written; otherwise, false. @@ -831,10 +831,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously write the to the specified file. + /// Asynchronously write the to the specified file. /// /// - /// Asynchronously writes the to the specified file using the default formatting options. + /// Asynchronously writes the entity to the specified file using the default formatting options. /// /// An awaitable task. /// The file. @@ -869,10 +869,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Writes the to the specified file. + /// Write the to the specified file. /// /// - /// Writes the to the specified file using the default formatting options. + /// Writes the entity to the specified file using the default formatting options. /// /// The file. /// The cancellation token. @@ -905,10 +905,10 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Asynchronously writes the to the specified file. + /// Asynchronously write the to the specified file. /// /// - /// Asynchronously writes the to the specified file using the default formatting options. + /// Asynchronously writes the entity to the specified file using the default formatting options. /// /// An awaitable task. /// The file. @@ -942,7 +942,7 @@ public virtual void Accept (MimeVisitor visitor) } /// - /// Removes the header. + /// Remove a header by name. /// /// /// Removes all headers matching the specified name without @@ -961,7 +961,7 @@ protected void RemoveHeader (string name) } /// - /// Sets the header. + /// Set the value of a header. /// /// /// Sets the header to the specified value without @@ -981,7 +981,7 @@ protected void SetHeader (string name, string value) } /// - /// Sets the header using the raw value. + /// Set the value of a header using the raw value. /// /// /// Sets the header to the specified value without @@ -1128,7 +1128,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// specified . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// @@ -1172,7 +1172,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// specified . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// @@ -1276,7 +1276,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// default . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// @@ -1309,7 +1309,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// default . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// diff --git a/MimeKit/MimeIterator.cs b/MimeKit/MimeIterator.cs index fb741e8df8..0ac9b43002 100644 --- a/MimeKit/MimeIterator.cs +++ b/MimeKit/MimeIterator.cs @@ -60,7 +60,7 @@ public MimeNode (MimeEntity entity, bool indexed) int index = -1; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new for the specified message. @@ -82,11 +82,11 @@ public MimeIterator (MimeMessage message) /// /// Releases unmanaged resources and performs other cleanup operations before - /// the is reclaimed by garbage collection. + /// the is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before - /// the is reclaimed by garbage collection. + /// the is reclaimed by garbage collection. /// ~MimeIterator () { @@ -426,11 +426,11 @@ public void Reset () } /// - /// Releases the unmanaged resources used by the and + /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// - /// Releases the unmanaged resources used by the and + /// Releases the unmanaged resources used by the and /// optionally releases the managed resources. /// /// true to release both managed and unmanaged resources; @@ -440,12 +440,12 @@ protected virtual void Dispose (bool disposing) } /// - /// Releases all resources used by the object. + /// Releases all resources used by the object. /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After - /// calling , you must release all references to the so - /// the garbage collector can reclaim the memory that the was occupying. + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After + /// calling , you must release all references to the so + /// the garbage collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 4b1f17c2d0..9760aabe41 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -135,7 +135,7 @@ internal MimeMessage (ParserOptions options) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -145,7 +145,7 @@ internal MimeMessage (ParserOptions options) /// is null. /// /// - /// contains more than one . + /// contains more than one . /// -or- /// contains one or more arguments of an unknown type. /// @@ -210,7 +210,7 @@ public MimeMessage (params object[] args) : this (ParserOptions.Default.Clone () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new MIME message, specifying details at creation time. @@ -228,7 +228,7 @@ public MimeMessage (IEnumerable from, IEnumerable - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. ///
/// /// Creates a new MIME message. @@ -242,7 +242,7 @@ public MimeMessage () : this (ParserOptions.Default.Clone ()) } /// - /// Gets or sets the mbox marker. + /// Get or set the mbox marker. /// /// /// Set by the when parsing attached message/rfc822 parts @@ -254,7 +254,7 @@ internal byte[] MboxMarker { } /// - /// Gets the list of headers. + /// Get the list of headers. /// /// /// Represents the list of headers for a message. Typically, the headers of @@ -383,7 +383,7 @@ public XMessagePriority XPriority { } /// - /// Gets or sets the address in the Sender header. + /// Get or set the address in the Sender header. /// /// /// The sender may differ from the addresses in if @@ -418,7 +418,7 @@ public MailboxAddress Sender { } /// - /// Gets or sets the address in the Resent-Sender header. + /// Get or set the address in the Resent-Sender header. /// /// /// The resent sender may differ from the addresses in if @@ -453,7 +453,7 @@ public MailboxAddress ResentSender { } /// - /// Gets the list of addresses in the From header. + /// Get the list of addresses in the From header. /// /// /// The "From" header specifies the author(s) of the message. @@ -468,7 +468,7 @@ public InternetAddressList From { } /// - /// Gets the list of addresses in the Resent-From header. + /// Get the list of addresses in the Resent-From header. /// /// /// The "Resent-From" header specifies the author(s) of the messagebeing @@ -484,7 +484,7 @@ public InternetAddressList ResentFrom { } /// - /// Gets the list of addresses in the Reply-To header. + /// Get the list of addresses in the Reply-To header. /// /// /// When the list of addresses in the Reply-To header is not empty, @@ -500,7 +500,7 @@ public InternetAddressList ReplyTo { } /// - /// Gets the list of addresses in the Resent-Reply-To header. + /// Get the list of addresses in the Resent-Reply-To header. /// /// /// When the list of addresses in the Resent-Reply-To header is not empty, @@ -516,7 +516,7 @@ public InternetAddressList ResentReplyTo { } /// - /// Gets the list of addresses in the To header. + /// Get the list of addresses in the To header. /// /// /// The addresses in the To header are the primary recipients of @@ -528,7 +528,7 @@ public InternetAddressList To { } /// - /// Gets the list of addresses in the Resent-To header. + /// Get the list of addresses in the Resent-To header. /// /// /// The addresses in the Resent-To header are the primary recipients of @@ -540,7 +540,7 @@ public InternetAddressList ResentTo { } /// - /// Gets the list of addresses in the Cc header. + /// Get the list of addresses in the Cc header. /// /// /// The addresses in the Cc header are secondary recipients of the message @@ -553,7 +553,7 @@ public InternetAddressList Cc { } /// - /// Gets the list of addresses in the Resent-Cc header. + /// Get the list of addresses in the Resent-Cc header. /// /// /// The addresses in the Resent-Cc header are secondary recipients of the message @@ -566,7 +566,7 @@ public InternetAddressList ResentCc { } /// - /// Gets the list of addresses in the Bcc header. + /// Get the list of addresses in the Bcc header. /// /// /// Recipients in the Blind-Carpbon-Copy list will not be visible to @@ -578,7 +578,7 @@ public InternetAddressList Bcc { } /// - /// Gets the list of addresses in the Resent-Bcc header. + /// Get the list of addresses in the Resent-Bcc header. /// /// /// Recipients in the Resent-Bcc list will not be visible to @@ -590,7 +590,7 @@ public InternetAddressList ResentBcc { } /// - /// Gets or sets the subject of the message. + /// Get or set the subject of the message. /// /// /// The Subject is typically a short string denoting the topic of the message. @@ -611,7 +611,7 @@ public string Subject { } /// - /// Gets or sets the date of the message. + /// Get or set the date of the message. /// /// /// If the date is not explicitly set before the message is written to a stream, @@ -630,7 +630,7 @@ public DateTimeOffset Date { } /// - /// Gets or sets the Resent-Date of the message. + /// Get or set the Resent-Date of the message. /// /// /// Gets or sets the Resent-Date of the message. @@ -648,7 +648,7 @@ public DateTimeOffset ResentDate { } /// - /// Gets or sets the list of references to other messages. + /// Get the list of references to other messages. /// /// /// The References header contains a chain of Message-Ids back to the @@ -660,7 +660,7 @@ public MessageIdList References { } /// - /// Gets or sets the Message-Id that this message is in reply to. + /// Get or set the Message-Id that this message is replying to. /// /// /// If the message is a reply to another message, it will typically @@ -697,12 +697,12 @@ public string InReplyTo { } /// - /// Gets or sets the message identifier. + /// Get or set the message identifier. /// /// /// The Message-Id is meant to be a globally unique identifier for /// a message. - /// can be used + /// can be used /// to generate this value. /// /// The message identifier. @@ -735,12 +735,12 @@ public string MessageId { } /// - /// Gets or sets the Resent-Message-Id header. + /// Get or set the Resent-Message-Id header. /// /// /// The Resent-Message-Id is meant to be a globally unique identifier for /// a message. - /// can be used + /// can be used /// to generate this value. /// /// The Resent-Message-Id. @@ -773,7 +773,7 @@ public string ResentMessageId { } /// - /// Gets or sets the MIME-Version. + /// Get or set the MIME-Version. /// /// /// The MIME-Version header specifies the version of the MIME specification @@ -798,7 +798,7 @@ public Version MimeVersion { } /// - /// Gets or sets the body of the message. + /// Get or set the body of the message. /// /// /// The body of the message can either be plain text or it can be a @@ -878,7 +878,7 @@ static bool TryGetMultipartBody (Multipart multipart, TextFormat format, out str } /// - /// Gets the text body of the message if it exists. + /// Get the text body of the message if it exists. /// /// /// Gets the text content of the first text/plain body part that is found (in depth-first @@ -890,7 +890,7 @@ public string TextBody { } /// - /// Gets the html body of the message if it exists. + /// Get the html body of the message if it exists. /// /// /// Gets the HTML-formatted body of the message if it exists. @@ -901,7 +901,7 @@ public string HtmlBody { } /// - /// Gets the text body in the specified format. + /// Get the text body in the specified format. /// /// /// Gets the text body in the specified format, if it exists. @@ -947,7 +947,7 @@ static IEnumerable EnumerateMimeParts (MimeEntity entity) } /// - /// Gets the body parts of the message. + /// Get the body parts of the message. /// /// /// Traverses over the MIME tree, enumerating all of the objects, @@ -962,7 +962,7 @@ public IEnumerable BodyParts { } /// - /// Gets the attachments. + /// Get the attachments. /// /// /// Traverses over the MIME tree, enumerating all of the objects that @@ -977,14 +977,14 @@ public IEnumerable Attachments { } /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// In general, the string returned from this method SHOULD NOT be used for serializing /// the message to disk. It is recommended that you use instead. /// - /// A that represents the current . + /// A that represents the current . public override string ToString () { using (var memory = new MemoryStream ()) { @@ -1005,12 +1005,12 @@ public override string ToString () /// Dispatches to the specific visit method for this MIME message. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -2536,7 +2536,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// specified . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// @@ -2580,7 +2580,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// specified . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// @@ -2684,7 +2684,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// default . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// @@ -2717,7 +2717,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// default . /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save mmeory usage, but also improve /// performance. /// diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 58230639c6..b667ef2b6a 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -99,8 +99,8 @@ enum MimeParserState : sbyte /// A MIME message and entity parser. ///
/// - /// A MIME parser is used to parse and - /// objects from arbitrary streams. + /// A MIME parser is used to parse and + /// objects from arbitrary streams. /// public partial class MimeParser : IEnumerable { @@ -145,13 +145,13 @@ public partial class MimeParser : IEnumerable long offset; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new that will parse the specified stream. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -168,13 +168,13 @@ public MimeParser (Stream stream, MimeFormat format, bool persistent = false) : } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new that will parse the specified stream. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -190,13 +190,13 @@ public MimeParser (Stream stream, bool persistent = false) : this (ParserOptions } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new that will parse the specified stream. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -215,13 +215,13 @@ public MimeParser (ParserOptions options, Stream stream, bool persistent = false } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new that will parse the specified stream. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -293,7 +293,7 @@ public string MboxMarker { /// Sets the stream to parse. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -355,7 +355,7 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, /// Sets the stream to parse. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -381,7 +381,7 @@ public void SetStream (ParserOptions options, Stream stream, bool persistent = f /// Sets the stream to parse. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible @@ -405,7 +405,7 @@ public void SetStream (Stream stream, MimeFormat format, bool persistent = false /// Sets the stream to parse. /// If is true and is seekable, then /// the will not copy the content of s into memory. Instead, - /// it will use a to reference a substream of . + /// it will use a to reference a substream of . /// This has the potential to not only save memory usage, but also improve /// performance. /// It should be noted, however, that disposing will make it impossible diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index aeb0a5c24f..7a20fafe79 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -57,11 +57,11 @@ public class MimePart : MimeEntity int? duration; /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// based on the . /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -72,7 +72,7 @@ public MimePart (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// with the specified media type and subtype. /// /// @@ -89,7 +89,7 @@ public MimePart (MimeEntityConstructorArgs args) : base (args) /// is null. /// /// - /// contains more than one or + /// contains more than one or /// . /// -or- /// contains one or more arguments of an unknown type. @@ -130,7 +130,7 @@ public MimePart (string mediaType, string mediaSubtype, params object[] args) : } /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// with the specified media type and subtype. /// /// @@ -148,7 +148,7 @@ public MimePart (string mediaType, string mediaSubtype) : base (mediaType, media } /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// with the specified content type. /// /// @@ -163,7 +163,7 @@ public MimePart (ContentType contentType) : base (contentType) } /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// with the specified content type. /// /// @@ -181,7 +181,7 @@ public MimePart (string contentType) : base (ContentType.Parse (contentType)) } /// - /// Initializes a new instance of the class + /// Initialize a new instance of the class /// with the default Content-Type of application/octet-stream. /// /// @@ -351,12 +351,12 @@ public IMimeContent ContentObject { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -538,7 +538,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } /// - /// Writes the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes the MIME part to the output stream. @@ -626,7 +626,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } /// - /// Asynchronously writes the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Asynchronously writes the MIME part to the output stream. diff --git a/MimeKit/MimeVisitor.cs b/MimeKit/MimeVisitor.cs index 0f2addee8e..d0965ad780 100644 --- a/MimeKit/MimeVisitor.cs +++ b/MimeKit/MimeVisitor.cs @@ -239,10 +239,10 @@ protected internal virtual void VisitMimePart (MimePart entity) } /// - /// Visit the children of a . + /// Visit the children of a . /// /// - /// Visits the children of a . + /// Visits the children of a . /// /// Multipart. protected virtual void VisitChildren (Multipart multipart) diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index e653369da7..8a2d43bd3e 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -67,10 +67,10 @@ public class Multipart : MimeEntity, ICollection, IList string preamble, epilogue; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -82,7 +82,7 @@ public Multipart (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified subtype. @@ -116,7 +116,7 @@ public Multipart (string subtype, params object[] args) : this (subtype) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with the specified subtype. @@ -133,7 +133,7 @@ public Multipart (string subtype) : base ("multipart", subtype) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with a ContentType of multipart/mixed. @@ -157,7 +157,7 @@ static string GenerateBoundary () } /// - /// Gets or sets the boundary. + /// Get or set the boundary. /// /// /// Gets or sets the boundary parameter on the Content-Type header. @@ -184,7 +184,7 @@ internal byte[] RawPreamble { } /// - /// Gets or sets the preamble. + /// Get or set the preamble. /// /// /// A multipart preamble appears before the first child entity of the @@ -223,7 +223,7 @@ internal byte[] RawEpilogue { } /// - /// Gets or sets the epilogue. + /// Get or set the epilogue. /// /// /// A multipart epiloque is the text that appears after the closing boundary @@ -266,7 +266,7 @@ public string Epilogue { } /// - /// Gets or sets whether the end boundary should be written. + /// Get or set whether the end boundary should be written. /// /// /// Gets or sets whether the end boundary should be written. @@ -280,12 +280,12 @@ internal bool WriteEndBoundary { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -400,7 +400,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } /// - /// Writes the to the specified output stream. + /// Write the to the specified output stream. /// /// /// Writes the multipart MIME entity and its subparts to the output stream. @@ -510,7 +510,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = } /// - /// Asynchronously writes the to the specified output stream. + /// Asynchronously write the to the specified output stream. /// /// /// Asynchronously writes the multipart MIME entity and its subparts to the output stream. @@ -585,7 +585,7 @@ public override void Prepare (EncodingConstraint constraint, int maxLineLength = #region ICollection implementation /// - /// Gets the number of parts in the multipart. + /// Get the number of parts in the multipart. /// /// /// Indicates the number of parts in the multipart. @@ -596,7 +596,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether this instance is read only. /// /// /// A is never read-only. @@ -607,7 +607,7 @@ public bool IsReadOnly { } /// - /// Adds the specified part. + /// Add an entity to the multipart. /// /// /// Adds the specified part to the multipart. @@ -626,7 +626,7 @@ public void Add (MimeEntity part) } /// - /// Clears the multipart. + /// Clear a multipart. /// /// /// Removes all of the parts within the multipart. @@ -638,7 +638,7 @@ public void Clear () } /// - /// Checks if the contains the specified part. + /// Check if the contains the specified part. /// /// /// Determines whether or not the multipart contains the specified part. @@ -658,7 +658,7 @@ public bool Contains (MimeEntity part) } /// - /// Copies all of the entities in the to the specified array. + /// Copy all of the entities in the to the specified array. /// /// /// Copies all of the entities within the into the array, @@ -678,7 +678,7 @@ public void CopyTo (MimeEntity[] array, int arrayIndex) } /// - /// Removes the specified part. + /// Remove an entity from the multipart. /// /// /// Removes the specified part, if it exists within the multipart. @@ -706,7 +706,7 @@ public bool Remove (MimeEntity part) #region IList implementation /// - /// Gets the index of the specified part. + /// Get the index of an entity. /// /// /// Finds the index of the specified part, if it exists. @@ -725,7 +725,7 @@ public int IndexOf (MimeEntity part) } /// - /// Inserts the part at the specified index. + /// Insert an entity into the at the specified index. /// /// /// Inserts the part into the multipart at the specified index. @@ -751,10 +751,10 @@ public void Insert (int index, MimeEntity part) } /// - /// Removes the part at the specified index. + /// Remove an entity from the at the specified index. /// /// - /// Removes the part at the specified index. + /// Removes the entity at the specified index. /// /// The index. /// @@ -767,7 +767,7 @@ public void RemoveAt (int index) } /// - /// Gets or sets the at the specified index. + /// Get or set the at the specified index. /// /// /// Gets or sets the at the specified index. @@ -796,7 +796,7 @@ public MimeEntity this[int index] { #region IEnumerable implementation /// - /// Gets the enumerator for the children of the . + /// Get the enumerator for the children of the . /// /// /// Gets the enumerator for the children of the . @@ -812,7 +812,7 @@ public IEnumerator GetEnumerator () #region IEnumerable implementation /// - /// Gets the enumerator for the children of the . + /// Get the enumerator for the children of the . /// /// /// Gets the enumerator for the children of the . diff --git a/MimeKit/MultipartAlternative.cs b/MimeKit/MultipartAlternative.cs index 67f0aa6dbe..c3d70e62b3 100644 --- a/MimeKit/MultipartAlternative.cs +++ b/MimeKit/MultipartAlternative.cs @@ -42,10 +42,10 @@ namespace MimeKit { public class MultipartAlternative : Multipart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -56,7 +56,7 @@ public MultipartAlternative (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new part. @@ -73,7 +73,7 @@ public MultipartAlternative (params object[] args) : base ("alternative", args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new part. @@ -108,12 +108,12 @@ public string HtmlBody { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index 11a18fa7d2..0d31955350 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -44,10 +44,10 @@ namespace MimeKit { public class MultipartRelated : Multipart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -58,7 +58,7 @@ public MultipartRelated (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new part. @@ -75,7 +75,7 @@ public MultipartRelated (params object[] args) : base ("related", args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new part. @@ -177,12 +177,12 @@ public MimeEntity Root { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index 74c0dfc549..745e90ec97 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -42,10 +42,10 @@ namespace MimeKit { public class MultipartReport : Multipart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -56,7 +56,7 @@ public MultipartReport (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new part. @@ -80,7 +80,7 @@ public MultipartReport (string reportType, params object[] args) : base ("report } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new part. @@ -129,12 +129,12 @@ public string ReportType { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/Parameter.cs b/MimeKit/Parameter.cs index 5f06455e87..ea5013952c 100644 --- a/MimeKit/Parameter.cs +++ b/MimeKit/Parameter.cs @@ -45,7 +45,7 @@ public class Parameter string text; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new parameter with the specified name and value. @@ -81,7 +81,7 @@ public Parameter (string name, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new parameter with the specified name and value. @@ -124,7 +124,7 @@ public Parameter (Encoding encoding, string name, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new parameter with the specified name and value. diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 3ed145328b..e62cdda307 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -46,7 +46,7 @@ public class ParameterList : IList readonly List parameters; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new parameter list. @@ -58,7 +58,7 @@ public ParameterList () } /// - /// Adds a parameter with the specified name and value. + /// Add a parameter with the specified name and value. /// /// /// Adds a new parameter to the list with the specified name and value. @@ -79,7 +79,7 @@ public void Add (string name, string value) } /// - /// Adds a parameter with the specified name and value. + /// Add a parameter with the specified name and value. /// /// /// Adds a new parameter to the list with the specified name and value. @@ -103,7 +103,7 @@ public void Add (Encoding encoding, string name, string value) } /// - /// Adds a parameter with the specified name and value. + /// Add a parameter with the specified name and value. /// /// /// Adds a new parameter to the list with the specified name and value. @@ -132,7 +132,7 @@ public void Add (string charset, string name, string value) } /// - /// Checks if the contains a parameter with the specified name. + /// Check if the contains a parameter with the specified name. /// /// /// Determines whether or not the parameter list contains a parameter with the specified name. @@ -152,7 +152,7 @@ public bool Contains (string name) } /// - /// Gets the index of the requested parameter, if it exists. + /// Get the index of the requested parameter, if it exists. /// /// /// Finds the index of the parameter with the specified name, if it exists. @@ -176,7 +176,7 @@ public int IndexOf (string name) } /// - /// Inserts a parameter with the specified name and value at the given index. + /// Insert a parameter with the specified name and value at the given index. /// /// /// Inserts a new parameter with the given name and value at the specified index. @@ -204,7 +204,7 @@ public void Insert (int index, string name, string value) } /// - /// Removes the specified parameter. + /// Remove the specified parameter. /// /// /// Removes the parameter with the specified name from the list, if it exists. @@ -228,7 +228,7 @@ public bool Remove (string name) } /// - /// Gets or sets the value of a parameter with the specified name. + /// Get or set the value of a parameter with the specified name. /// /// /// Gets or sets the value of a parameter with the specified name. @@ -271,7 +271,7 @@ public string this [string name] { } /// - /// Gets the parameter with the specified name. + /// Get the parameter with the specified name. /// /// /// Gets the parameter with the specified name. @@ -294,7 +294,7 @@ public bool TryGetValue (string name, out Parameter param) } /// - /// Gets the value of the parameter with the specified name. + /// Get the value of the parameter with the specified name. /// /// /// Gets the value of the parameter with the specified name. @@ -325,7 +325,7 @@ public bool TryGetValue (string name, out string value) #region ICollection implementation /// - /// Gets the number of parameters in the . + /// Get the number of parameters in the . /// /// /// Indicates the number of parameters in the list. @@ -336,7 +336,7 @@ public int Count { } /// - /// Gets a value indicating whether this instance is read only. + /// Get a value indicating whether this instance is read only. /// /// /// A is never read-only. @@ -347,7 +347,7 @@ public bool IsReadOnly { } /// - /// Adds the specified parameter. + /// Add a to a . /// /// /// Adds the specified parameter to the end of the list. @@ -376,7 +376,7 @@ public void Add (Parameter param) } /// - /// Clears the parameter list. + /// Clear the parameter list. /// /// /// Removes all of the parameters from the list. @@ -393,7 +393,7 @@ public void Clear () } /// - /// Checks if the contains the specified parameter. + /// Check if the contains the specified parameter. /// /// /// Determines whether or not the parameter list contains the specified parameter. @@ -413,7 +413,7 @@ public bool Contains (Parameter param) } /// - /// Copies all of the contained parameters to the specified array. + /// Copy all of the parameters in the list to the specified array. /// /// /// Copies all of the parameters within the into the array, @@ -427,7 +427,7 @@ public void CopyTo (Parameter[] array, int arrayIndex) } /// - /// Removes the specified parameter. + /// Remove a from a . /// /// /// Removes the specified parameter from the list. @@ -459,7 +459,7 @@ public bool Remove (Parameter param) #region IList implementation /// - /// Gets the index of the requested parameter, if it exists. + /// Ges the index of the requested parameter, if it exists. /// /// /// Finds the index of the specified parameter, if it exists. @@ -478,7 +478,7 @@ public int IndexOf (Parameter param) } /// - /// Inserts the specified parameter at the given index. + /// Insert a at the specified index. /// /// /// Inserts the parameter at the specified index in the list. @@ -514,7 +514,7 @@ public void Insert (int index, Parameter param) } /// - /// Removes the parameter at the specified index. + /// Remove the parameter at the specified index. /// /// /// Removes the parameter at the specified index. @@ -538,10 +538,10 @@ public void RemoveAt (int index) } /// - /// Gets or sets the at the specified index. + /// Get or set the at the specified index. /// /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// The parameter at the specified index. /// The index. @@ -595,7 +595,7 @@ public Parameter this [int index] { #region IEnumerable implementation /// - /// Gets an enumerator for the list of parameters. + /// Get an enumerator for the list of parameters. /// /// /// Gets an enumerator for the list of parameters. @@ -611,7 +611,7 @@ public IEnumerator GetEnumerator () #region IEnumerable implementation /// - /// Gets an enumerator for the list of parameters. + /// Get an enumerator for the list of parameters. /// /// /// Gets an enumerator for the list of parameters. @@ -631,7 +631,7 @@ internal void Encode (FormatOptions options, StringBuilder builder, ref int line } /// - /// Returns a string representation of the parameters in the . + /// Serialize a to a string. /// /// /// If there are multiple parameters in the list, they will be separated by a semicolon. diff --git a/MimeKit/ParseException.cs b/MimeKit/ParseException.cs index a2778577e9..dea64a3b26 100644 --- a/MimeKit/ParseException.cs +++ b/MimeKit/ParseException.cs @@ -49,7 +49,7 @@ public class ParseException : FormatException { #if SERIALIZABLE /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -67,7 +67,7 @@ protected ParseException (SerializationInfo info, StreamingContext context) : ba #endif /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -83,7 +83,7 @@ public ParseException (string message, int tokenIndex, int errorIndex, Exception } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 62e75c1bd4..037afa1679 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -163,8 +163,8 @@ public class ParserOptions /// Gets or sets the charset encoding to use as a fallback for 8bit headers. ///
/// - /// and - /// + /// and + /// /// use this charset encoding as a fallback when decoding 8bit text into unicode. The first /// charset encoding attempted is UTF-8, followed by this charset encoding, before finally /// falling back to iso-8859-1. @@ -173,7 +173,7 @@ public class ParserOptions public Encoding CharsetEncoding { get; set; } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// By default, new instances of enable rfc2047 work-arounds @@ -194,7 +194,7 @@ public ParserOptions () } /// - /// Clones an instance of . + /// Clones an instance of . /// /// /// Clones a set of options, allowing you to change a specific option diff --git a/MimeKit/Text/FlowedToHtml.cs b/MimeKit/Text/FlowedToHtml.cs index 580d9a511b..c149e6fc8a 100644 --- a/MimeKit/Text/FlowedToHtml.cs +++ b/MimeKit/Text/FlowedToHtml.cs @@ -44,7 +44,7 @@ public class FlowedToHtml : TextConverter readonly UrlScanner scanner; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new flowed text to HTML converter. diff --git a/MimeKit/Text/FlowedToText.cs b/MimeKit/Text/FlowedToText.cs index 392edb60da..5ab02b4c04 100644 --- a/MimeKit/Text/FlowedToText.cs +++ b/MimeKit/Text/FlowedToText.cs @@ -38,7 +38,7 @@ namespace MimeKit.Text { public class FlowedToText : TextConverter { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new flowed text to text converter. diff --git a/MimeKit/Text/HtmlAttribute.cs b/MimeKit/Text/HtmlAttribute.cs index b91c7ef5e3..1379a43d88 100644 --- a/MimeKit/Text/HtmlAttribute.cs +++ b/MimeKit/Text/HtmlAttribute.cs @@ -39,7 +39,7 @@ namespace MimeKit.Text { public class HtmlAttribute { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new HTML attribute with the given id and value. @@ -60,7 +60,7 @@ public HtmlAttribute (HtmlAttributeId id, string value) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new HTML attribute with the given name and value. diff --git a/MimeKit/Text/HtmlAttributeCollection.cs b/MimeKit/Text/HtmlAttributeCollection.cs index 7059a0699d..f47657985c 100644 --- a/MimeKit/Text/HtmlAttributeCollection.cs +++ b/MimeKit/Text/HtmlAttributeCollection.cs @@ -48,7 +48,7 @@ public class HtmlAttributeCollection : IEnumerable readonly List attributes = new List (); /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Text/HtmlEntityDecoder.cs b/MimeKit/Text/HtmlEntityDecoder.cs index 9d5075ad24..e339715ce5 100644 --- a/MimeKit/Text/HtmlEntityDecoder.cs +++ b/MimeKit/Text/HtmlEntityDecoder.cs @@ -44,7 +44,7 @@ public partial class HtmlEntityDecoder int index; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Text/HtmlTagContext.cs b/MimeKit/Text/HtmlTagContext.cs index 630a233a9e..829e2cfb52 100644 --- a/MimeKit/Text/HtmlTagContext.cs +++ b/MimeKit/Text/HtmlTagContext.cs @@ -39,7 +39,7 @@ namespace MimeKit.Text { public abstract class HtmlTagContext { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Text/HtmlTextPreviewer.cs b/MimeKit/Text/HtmlTextPreviewer.cs index e2a6b98733..6eba082c7c 100644 --- a/MimeKit/Text/HtmlTextPreviewer.cs +++ b/MimeKit/Text/HtmlTextPreviewer.cs @@ -39,7 +39,7 @@ namespace MimeKit.Text { public class HtmlTextPreviewer : TextPreviewer { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new previewer for HTML. diff --git a/MimeKit/Text/HtmlToHtml.cs b/MimeKit/Text/HtmlToHtml.cs index ba49c24c67..e2afb775ed 100644 --- a/MimeKit/Text/HtmlToHtml.cs +++ b/MimeKit/Text/HtmlToHtml.cs @@ -54,7 +54,7 @@ public class HtmlToHtml : TextConverter //} /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new HTML to HTML converter. diff --git a/MimeKit/Text/HtmlToken.cs b/MimeKit/Text/HtmlToken.cs index 947ea3e91c..edc9a6103e 100644 --- a/MimeKit/Text/HtmlToken.cs +++ b/MimeKit/Text/HtmlToken.cs @@ -38,7 +38,7 @@ namespace MimeKit.Text { public abstract class HtmlToken { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -98,7 +98,7 @@ public override string ToString () public class HtmlCommentToken : HtmlToken { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -181,7 +181,7 @@ public override void WriteTo (TextWriter output) public class HtmlDataToken : HtmlToken { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -211,7 +211,7 @@ protected HtmlDataToken (HtmlTokenKind kind, string data) : base (kind) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -277,7 +277,7 @@ public override void WriteTo (TextWriter output) public class HtmlCDataToken : HtmlDataToken { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -321,7 +321,7 @@ public override void WriteTo (TextWriter output) public class HtmlScriptDataToken : HtmlDataToken { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -363,7 +363,7 @@ public override void WriteTo (TextWriter output) public class HtmlTagToken : HtmlToken { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -391,7 +391,7 @@ public HtmlTagToken (string name, IEnumerable attributes, bool is } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -512,7 +512,7 @@ public class HtmlDocTypeToken : HtmlToken string systemIdentifier; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 3481fbdb86..91d223cfba 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -55,7 +55,7 @@ public class HtmlTokenizer char quote; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Text/HtmlWriter.cs b/MimeKit/Text/HtmlWriter.cs index 095b6c683c..e652066cd5 100644 --- a/MimeKit/Text/HtmlWriter.cs +++ b/MimeKit/Text/HtmlWriter.cs @@ -44,7 +44,7 @@ public class HtmlWriter : IDisposable bool empty; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -68,7 +68,7 @@ public HtmlWriter (Stream stream, Encoding encoding) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -87,11 +87,11 @@ public HtmlWriter (TextWriter output) /// /// Releas unmanaged resources and perform other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// ~HtmlWriter () { @@ -912,12 +912,12 @@ protected virtual void Dispose (bool disposing) } /// - /// Releases all resource used by the object. + /// Releases all resource used by the object. /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After calling - /// , you must release all references to the so the garbage - /// collector can reclaim the memory that the was occupying. + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After calling + /// , you must release all references to the so the garbage + /// collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); diff --git a/MimeKit/Text/PlainTextPreviewer.cs b/MimeKit/Text/PlainTextPreviewer.cs index bc76b1f1e0..2f171e4f52 100644 --- a/MimeKit/Text/PlainTextPreviewer.cs +++ b/MimeKit/Text/PlainTextPreviewer.cs @@ -37,7 +37,7 @@ namespace MimeKit.Text { public class PlainTextPreviewer : TextPreviewer { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new previewer for plain text. diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index 6516cc3846..4c374d9763 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -70,10 +70,10 @@ static TextConverter () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// protected TextConverter () { diff --git a/MimeKit/Text/TextPreviewer.cs b/MimeKit/Text/TextPreviewer.cs index a0a320381b..91c56e517b 100644 --- a/MimeKit/Text/TextPreviewer.cs +++ b/MimeKit/Text/TextPreviewer.cs @@ -42,10 +42,10 @@ public abstract class TextPreviewer int maximumPreviewLength; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// protected TextPreviewer () { diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index 95be8fc75c..6e301c009a 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -43,7 +43,7 @@ public class TextToFlowed : TextConverter const int MaxLineLength = 78; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new text to flowed text converter. diff --git a/MimeKit/Text/TextToHtml.cs b/MimeKit/Text/TextToHtml.cs index af9cd011ff..e884ce29e7 100644 --- a/MimeKit/Text/TextToHtml.cs +++ b/MimeKit/Text/TextToHtml.cs @@ -43,7 +43,7 @@ public class TextToHtml : TextConverter readonly UrlScanner scanner; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new text to HTML converter. diff --git a/MimeKit/Text/TextToText.cs b/MimeKit/Text/TextToText.cs index b61dffa835..6c35659a7e 100644 --- a/MimeKit/Text/TextToText.cs +++ b/MimeKit/Text/TextToText.cs @@ -37,7 +37,7 @@ namespace MimeKit.Text { public class TextToText : TextConverter { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new text to text converter. diff --git a/MimeKit/Text/Trie.cs b/MimeKit/Text/Trie.cs index e8b8f6b401..fa0b719982 100644 --- a/MimeKit/Text/Trie.cs +++ b/MimeKit/Text/Trie.cs @@ -66,7 +66,7 @@ public TrieMatch (char value) bool icase; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -80,7 +80,7 @@ public Trie (bool ignoreCase) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 27b8c676ef..65a30a3126 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -49,10 +49,10 @@ namespace MimeKit { public class TextPart : MimePart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -63,7 +63,7 @@ public TextPart (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the + /// Initialize a new instance of the /// class with the specified text subtype. /// /// @@ -132,7 +132,7 @@ internal TextPart (ContentType contentType) : base (contentType) } /// - /// Initializes a new instance of the + /// Initialize a new instance of the /// class with the specified text subtype. /// /// @@ -171,7 +171,7 @@ static string GetMediaSubtype (TextFormat format) } /// - /// Initializes a new instance of the + /// Initialize a new instance of the /// class with the specified text format. /// /// @@ -188,7 +188,7 @@ public TextPart (TextFormat format) : base ("text", GetMediaSubtype (format)) } /// - /// Initializes a new instance of the + /// Initialize a new instance of the /// class with a Content-Type of text/plain. /// /// @@ -333,12 +333,12 @@ public string Text { /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/TextRfc822Headers.cs b/MimeKit/TextRfc822Headers.cs index 4ec761f516..34f1c0b983 100644 --- a/MimeKit/TextRfc822Headers.cs +++ b/MimeKit/TextRfc822Headers.cs @@ -36,10 +36,10 @@ namespace MimeKit { public class TextRfc822Headers : MessagePart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -50,7 +50,7 @@ public TextRfc822Headers (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -60,7 +60,7 @@ public TextRfc822Headers (MimeEntityConstructorArgs args) : base (args) /// is null. /// /// - /// contains more than one . + /// contains more than one . /// -or- /// contains one or more arguments of an unknown type. /// @@ -88,7 +88,7 @@ public TextRfc822Headers (params object[] args) : this () } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new text/rfc822-headers MIME entity. @@ -101,12 +101,12 @@ public TextRfc822Headers () : base ("text", "rfc822-headers") /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// diff --git a/MimeKit/Tnef/RtfCompressedToRtf.cs b/MimeKit/Tnef/RtfCompressedToRtf.cs index 5a2f2fdeef..d58a6aeeb4 100644 --- a/MimeKit/Tnef/RtfCompressedToRtf.cs +++ b/MimeKit/Tnef/RtfCompressedToRtf.cs @@ -71,10 +71,10 @@ enum FilterState { int size; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// Creates a new converter filter. + /// Creates a new converter filter. /// public RtfCompressedToRtf () { diff --git a/MimeKit/Tnef/TnefException.cs b/MimeKit/Tnef/TnefException.cs index d954fe4090..afbd2d74d5 100644 --- a/MimeKit/Tnef/TnefException.cs +++ b/MimeKit/Tnef/TnefException.cs @@ -46,7 +46,7 @@ public class TnefException : FormatException { #if SERIALIZABLE /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -63,7 +63,7 @@ protected TnefException (SerializationInfo info, StreamingContext context) : bas #endif /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . @@ -77,7 +77,7 @@ public TnefException (TnefComplianceStatus error, string message, Exception inne } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . diff --git a/MimeKit/Tnef/TnefNameId.cs b/MimeKit/Tnef/TnefNameId.cs index 48eb069f29..d12e7b75f7 100644 --- a/MimeKit/Tnef/TnefNameId.cs +++ b/MimeKit/Tnef/TnefNameId.cs @@ -85,7 +85,7 @@ public int Id { } /// - /// Initializes a new instance of the struct. + /// Initialize a new instance of the struct. /// /// /// Creates a new with the specified integer identifier. @@ -101,7 +101,7 @@ public TnefNameId (Guid propertySetGuid, int id) } /// - /// Initializes a new instance of the struct. + /// Initialize a new instance of the struct. /// /// /// Creates a new with the specified string identifier. @@ -117,10 +117,10 @@ public TnefNameId (Guid propertySetGuid, string name) } /// - /// Serves as a hash function for a object. + /// Serves as a hash function for a object. /// /// - /// Serves as a hash function for a object. + /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms /// and data structures such as a hash table. @@ -132,14 +132,14 @@ public override int GetHashCode () } /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// - /// The to compare with the current . + /// The to compare with the current . /// true if the specified is equal to the current - /// ; otherwise, false. + /// ; otherwise, false. public override bool Equals (object obj) { if (!(obj is TnefNameId)) diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 14317d335e..c60bf8702f 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -45,10 +45,10 @@ namespace MimeKit.Tnef { public class TnefPart : MimePart { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// This constructor is used by . + /// This constructor is used by . /// /// Information used by the constructor. /// @@ -59,7 +59,7 @@ public TnefPart (MimeEntityConstructorArgs args) : base (args) } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new with a Content-Type of application/vnd.ms-tnef @@ -75,12 +75,12 @@ public TnefPart () : base ("application", "vnd.ms-tnef") /// Dispatches to the specific visit method for this MIME entity. ///
/// - /// This default implementation for nodes - /// calls . Override this + /// This default implementation for nodes + /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling - /// . + /// . /// /// The visitor. /// @@ -596,16 +596,16 @@ static MimeMessage ExtractTnefMessage (TnefReader reader) } /// - /// Converts the TNEF content into a . + /// Converts the TNEF content into a . /// /// - /// TNEF data often contains properties that map to + /// TNEF data often contains properties that map to /// headers. TNEF data also often contains file attachments which will be /// mapped to MIME parts. /// /// A message representing the TNEF data in MIME format. /// - /// The property is null. + /// The property is null. /// public MimeMessage ConvertToMessage () { @@ -632,7 +632,7 @@ public MimeMessage ConvertToMessage () /// /// The attachments. /// - /// The property is null. + /// The property is null. /// public IEnumerable ExtractAttachments () { diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index 7d93912163..4c5c04006b 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -1536,10 +1536,10 @@ internal Uri ReadValueAsUri () } /// - /// Serves as a hash function for a object. + /// Serves as a hash function for a object. /// /// - /// Serves as a hash function for a object. + /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms /// and data structures such as a hash table. @@ -1549,14 +1549,14 @@ public override int GetHashCode () } /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// - /// The to compare with the current . + /// The to compare with the current . /// true if the specified is equal to the current - /// ; otherwise, false. + /// ; otherwise, false. public override bool Equals (object obj) { var prop = obj as TnefPropertyReader; diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index ad3e7c92af..d26fad5cd6 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -5620,7 +5620,7 @@ public TnefPropertyType ValueTnefType { } /// - /// Initializes a new instance of the struct. + /// Initialize a new instance of the struct. /// /// /// Creates a new based on a 32-bit integer tag as read from @@ -5640,7 +5640,7 @@ public TnefPropertyTag (int tag) } /// - /// Initializes a new instance of the struct. + /// Initialize a new instance of the struct. /// /// /// Creates a new based on a @@ -5681,10 +5681,10 @@ public static implicit operator int (TnefPropertyTag tag) } /// - /// Serves as a hash function for a object. + /// Serves as a hash function for a object. /// /// - /// Serves as a hash function for a object. + /// Serves as a hash function for a object. /// /// A hash code for this instance that is suitable for use in hashing algorithms /// and data structures such as a hash table. @@ -5694,14 +5694,14 @@ public override int GetHashCode () } /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// - /// The to compare with the current . + /// The to compare with the current . /// true if the specified is equal to the current - /// ; otherwise, false. + /// ; otherwise, false. public override bool Equals (object obj) { if (!(obj is TnefPropertyTag)) @@ -5713,12 +5713,12 @@ public override bool Equals (object obj) } /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// - /// A that represents the current . + /// A that represents the current . public override string ToString () { return string.Format ("{0} ({1})", Id, ValueTnefType); diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index fa1ce8a259..01ed32e19d 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -210,7 +210,7 @@ private set { } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// When reading a TNEF stream using the mode, @@ -259,7 +259,7 @@ public TnefReader (Stream inputStream, int defaultMessageCodepage, TnefComplianc } /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new for the specified input stream. @@ -274,11 +274,11 @@ public TnefReader (Stream inputStream) : this (inputStream, 0, TnefComplianceMod /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// /// /// Releases unmanaged resources and performs other cleanup operations before the - /// is reclaimed by garbage collection. + /// is reclaimed by garbage collection. /// ~TnefReader () { @@ -740,12 +740,12 @@ protected virtual void Dispose (bool disposing) } /// - /// Releases all resource used by the object. + /// Releases all resource used by the object. /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After calling - /// , you must release all references to the so the garbage - /// collector can reclaim the memory that the was occupying. + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After calling + /// , you must release all references to the so the garbage + /// collector can reclaim the memory that the was occupying. public void Dispose () { Dispose (true); diff --git a/MimeKit/Tnef/TnefReaderStream.cs b/MimeKit/Tnef/TnefReaderStream.cs index 997b18cde4..2abcdd5248 100644 --- a/MimeKit/Tnef/TnefReaderStream.cs +++ b/MimeKit/Tnef/TnefReaderStream.cs @@ -41,7 +41,7 @@ class TnefReaderStream : Stream bool disposed; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a stream for reading a raw value from the . diff --git a/MimeKit/Utils/BufferPool.cs b/MimeKit/Utils/BufferPool.cs index 38d9d8b53f..764f409ce1 100644 --- a/MimeKit/Utils/BufferPool.cs +++ b/MimeKit/Utils/BufferPool.cs @@ -53,7 +53,7 @@ class BufferPool int index; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new buffer pool. diff --git a/MimeKit/Utils/Crc32.cs b/MimeKit/Utils/Crc32.cs index ab21f13e0c..a93874ad15 100644 --- a/MimeKit/Utils/Crc32.cs +++ b/MimeKit/Utils/Crc32.cs @@ -75,7 +75,7 @@ class Crc32 int crc; /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new CRC32 context. diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index 4f28fc1bd4..57dbaf5b4f 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -520,7 +520,7 @@ static bool TryParseUnknownDateFormat (IList tokens, byte[] text, out } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses an rfc822 date and time from the supplied buffer starting at the given index @@ -563,7 +563,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Date } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses an rfc822 date and time from the supplied buffer starting at the specified index. @@ -601,7 +601,7 @@ public static bool TryParse (byte[] buffer, int startIndex, out DateTimeOffset d } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses an rfc822 date and time from the specified buffer. @@ -631,7 +631,7 @@ public static bool TryParse (byte[] buffer, out DateTimeOffset date) } /// - /// Tries to parse the given input buffer into a new instance. + /// Try to parse the given input buffer into a new instance. /// /// /// Parses an rfc822 date and time from the specified text. diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 63f1fe2d3f..93890adf17 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -242,7 +242,7 @@ public static string ParseMessageId (string text) } /// - /// Tries to parse a version from a header such as Mime-Version. + /// Try to parse a version from a header such as Mime-Version. /// /// /// Parses a MIME version string from the supplied buffer starting at the given index @@ -301,7 +301,7 @@ public static bool TryParse (byte[] buffer, int startIndex, int length, out Vers } /// - /// Tries to parse a version from a header such as Mime-Version. + /// Try to parse a version from a header such as Mime-Version. /// /// /// Parses a MIME version string from the specified text. @@ -323,7 +323,7 @@ public static bool TryParse (string text, out Version version) } /// - /// Tries to parse the value of a Content-Transfer-Encoding header. + /// Try to parse the value of a Content-Transfer-Encoding header. /// /// /// Parses a Content-Transfer-Encoding header value. diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index 839ebcfc23..919d751861 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -38,7 +38,7 @@ namespace MimeKit.Utils { sealed class OptimizedOrdinalIgnoreCaseComparer : IEqualityComparer { /// - /// Initializes a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new . From 8b47a787a50fde23ee4b9c882491daee94a0884c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 May 2020 16:54:16 -0400 Subject: [PATCH 565/741] Fixed build warnings --- MimeKit/AttachmentCollection.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 2 +- MimeKit/MailboxAddress.cs | 2 +- MimeKit/MimeParser.cs | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 8ab6cdf2c3..7ea9fdf712 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -97,7 +97,7 @@ public bool IsReadOnly { } /// - /// Gets or sets the at the specified index. + /// Gets or sets the at the specified index. /// /// /// Gets or sets the at the specified index. diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index f58115209a..7833ea8ad8 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -113,7 +113,7 @@ protected OpenPgpContext () } /// - /// Initialize a new instance of the class. + /// Initialize a new instance of the class. /// /// /// Creates a new using the specified public and private keyring paths. diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index bec777b711..a71cdfedc4 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -397,7 +397,7 @@ public static string DecodeAddrspec (string addrspec) /// Get the mailbox address, optionally encoded according to IDN encoding rules. ///
/// - /// If is true, then the returned mailbox address will be encoded according to the IDN encoding rules. + /// If is true, then the returned mailbox address will be encoded according to the IDN encoding rules. /// /// true if the address should be encoded according to IDN encoding rules; otherwise, false. /// The mailbox address. diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index b667ef2b6a..1b32263500 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1257,7 +1257,6 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can { ScanContentResult result; Stream content; - bool isEmpty; if (persistent) { long begin = GetOffset (inputIndex); From 585eea79daa2e09bedf61fd4ec7aa5a9ea4f7a18 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 28 May 2020 17:54:02 -0400 Subject: [PATCH 566/741] Fixed XML doc warnings --- MimeKit/AttachmentCollection.cs | 3 +- .../Cryptography/ApplicationPgpSignature.cs | 4 +-- MimeKit/Cryptography/ArcSigner.cs | 3 +- MimeKit/Cryptography/CmsRecipient.cs | 3 +- MimeKit/Cryptography/CmsSigner.cs | 3 +- MimeKit/Cryptography/DkimSigner.cs | 3 +- MimeKit/Cryptography/SecureMimeContext.cs | 3 +- MimeKit/Cryptography/X509CertificateStore.cs | 9 ++--- MimeKit/HeaderList.cs | 12 +++---- MimeKit/MimeEntity.cs | 36 +++++++------------ MimeKit/MimeMessage.cs | 24 +++++-------- 11 files changed, 35 insertions(+), 68 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 7ea9fdf712..da7764069d 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -429,8 +429,7 @@ public MimeEntity Add (string fileName, ContentType contentType) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. diff --git a/MimeKit/Cryptography/ApplicationPgpSignature.cs b/MimeKit/Cryptography/ApplicationPgpSignature.cs index ecf50786f5..c933dd61d9 100644 --- a/MimeKit/Cryptography/ApplicationPgpSignature.cs +++ b/MimeKit/Cryptography/ApplicationPgpSignature.cs @@ -42,7 +42,7 @@ public class ApplicationPgpSignature : MimePart { /// /// Initialize a new instance of the - /// class based on the . + /// class based on the . /// /// /// This constructor is used by . @@ -87,7 +87,7 @@ public ApplicationPgpSignature (Stream stream) : base ("application", "pgp-signa /// This default implementation for nodes /// calls . Override this /// method to call into a more specific method on a derived visitor class - /// of the class. However, it should still + /// of the class. However, it should still /// support unknown visitors by calling /// . /// diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index ace2af8f93..56ea4d30aa 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -123,8 +123,7 @@ protected ArcSigner (AsymmetricKeyParameter key, string domain, string selector, /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The file did not contain a private key. diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index d7e06203c9..94e66b4a5e 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -133,8 +133,7 @@ public CmsRecipient (Stream stream, SubjectIdentifierType recipientIdentifierTyp /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index 493e03f383..fe74141c64 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -276,8 +276,7 @@ public CmsSigner (Stream stream, string password, SubjectIdentifierType signerId /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// -or- /// does not contain a private key. /// -or- diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index f142afc187..db24cf926f 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -132,8 +132,7 @@ public DkimSigner (AsymmetricKeyParameter key, string domain, string selector, D /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The file did not contain a private key. diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 5a71a0a39d..64779b462b 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -750,8 +750,7 @@ internal SmimeCapabilitiesAttribute GetSecureMimeCapabilitiesAttribute (bool inc /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// -or- /// does not contain a private key. /// -or- diff --git a/MimeKit/Cryptography/X509CertificateStore.cs b/MimeKit/Cryptography/X509CertificateStore.cs index e4742f87b5..9bff29562d 100644 --- a/MimeKit/Cryptography/X509CertificateStore.cs +++ b/MimeKit/Cryptography/X509CertificateStore.cs @@ -302,8 +302,7 @@ public void Import (Stream stream, string password) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The specified file could not be found. @@ -381,8 +380,7 @@ public void Export (Stream stream) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The specified path exceeds the maximum allowed path length of the system. @@ -477,8 +475,7 @@ public void Export (Stream stream, string password) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The specified path exceeds the maximum allowed path length of the system. diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index 426bd54b43..81ca363ef9 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -1382,8 +1382,7 @@ internal bool TryGetHeader (string field, out Header header) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -1433,8 +1432,7 @@ internal bool TryGetHeader (string field, out Header header) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -1481,8 +1479,7 @@ internal bool TryGetHeader (string field, out Header header) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -1522,8 +1519,7 @@ internal bool TryGetHeader (string field, out Header header) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 848738aef5..ebb0ff978d 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -618,8 +618,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -666,8 +665,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -712,8 +710,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -761,8 +758,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -807,8 +803,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -845,8 +840,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -881,8 +875,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -918,8 +911,7 @@ public virtual void Accept (MimeVisitor visitor) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -1406,8 +1398,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -1457,8 +1448,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -1505,8 +1495,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -1546,8 +1535,7 @@ void HeadersChanged (object sender, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 9760aabe41..a7df8b9cb6 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -1353,8 +1353,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -1402,8 +1401,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -1447,8 +1445,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -1484,8 +1481,7 @@ public virtual void Prepare (EncodingConstraint constraint, int maxLineLength = /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// The operation was canceled via the cancellation token. @@ -2814,8 +2810,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -2865,8 +2860,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -2913,8 +2907,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. @@ -2954,8 +2947,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) /// /// /// is a zero-length string, contains only white space, or - /// contains one or more invalid characters as defined by - /// . + /// contains one or more invalid characters. /// /// /// is an invalid file path. From 80a60c78d364db3a87d10f315a4e61eff2b8e662 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 29 May 2020 09:05:43 -0400 Subject: [PATCH 567/741] Update MimeParserTests.cs --- UnitTests/MimeParserTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 37a08b1e56..fc9636970c 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -41,8 +41,8 @@ namespace UnitTests { [TestFixture] public class MimeParserTests { - static string MessagesDataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "messages"); - static string MboxDataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "mbox"); + static readonly string MessagesDataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "messages"); + static readonly string MboxDataDir = Path.Combine (TestHelper.ProjectDir, "TestData", "mbox"); static FormatOptions UnixFormatOptions; public MimeParserTests () From 27e9705fcad72e09733335a945f94479ab444fb3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 30 May 2020 06:55:43 -0400 Subject: [PATCH 568/741] bumped version to 2.8.0 --- MimeKit/MimeKit.NetStandard.csproj | 2 +- MimeKit/MimeKitLite.NetStandard.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +++--- ReleaseNotes.md | 13 +++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 14 +++++++------- nuget/MimeKitLite.nuspec | 11 +++++------ .../DkimVerifier/DkimVerifier/DkimVerifier.csproj | 4 ++-- .../MessageReader.Android.csproj | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 4 ++-- .../MessageReader/MessageReader.csproj | 4 ++-- 12 files changed, 39 insertions(+), 27 deletions(-) diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index a7f22aaaea..8fd56eb451 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.7.0 + 2.8.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.NetStandard.csproj index 729b697831..c85c2bd4d4 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.NetStandard.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.7.0 + 2.8.0 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index c7f3798c6f..990b2567bf 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.7.0.0")] -[assembly: AssemblyFileVersion ("2.7.0.0")] -[assembly: AssemblyVersion ("2.7.0.0")] +[assembly: AssemblyInformationalVersion ("2.8.0.0")] +[assembly: AssemblyFileVersion ("2.8.0.0")] +[assembly: AssemblyVersion ("2.8.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 490d2fe065..9f5e038311 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,18 @@ # Release Notes +### MimeKit 2.8.0 (2020-05-26) + +* Improved logic for verifying signatures for MimeParts containing mixed line endings. + (issue [#569](https://github.com/jstedfast/MimeKit/issues/569)) +* Fixed MailboxAddress parser to decode IDN-encoded local-parts of email addresses. + (MailKit issue [#1026](https://github.com/jstedfast/MailKit/issues/1026)) +* Added new MailboxAddress.GetAddress(bool idnEncode) method. +* Improved subclassability of OpenPgpContext by making a number of methods virtual. + (issue [#571](https://github.com/jstedfast/MimeKit/issues/571)) +* Added support for RSACng and DSACng. + (issue [#567](https://github.com/jstedfast/MimeKit/issues/567)) +* Dropped Xamarin platforms since they are compatible with netstandard2.0. + ### MimeKit 2.7.0 (2020-05-19) * Fixed InternetAddressList.Insert() to allow inserting at the end of the list. diff --git a/appveyor.yml b/appveyor.yml index 2ad97089a7..f9fd724d00 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.7.0.{build} +version: 2.8.0.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 75ff2e7d7d..e8c1bb555f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.7.0$(Rev:.r) +name: 2.8.0$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 603973cee6..1d7dc5fff5 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.7.0 + 2.8.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,12 +26,12 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Fixed InternetAddressList.Insert() to allow inserting at the end of the list. (issue #559) -* Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth allowed by the parser. -* Added logic to handle multipart children without any headers or content. -* Added a new Verify(bool verifySignatureOnly) method to IDigitalSignature for developers who just want to be able to verify the signature without worrying about the certificate chain. -* Fixed MimePart.WriteTo() to avoid canonicalizing line endings for MimeParts that do not define a Content-Transfer-Encoding. (issue #569) -* NuGet packages now include the portable pdb's. +* Improved logic for verifying signatures for MimeParts containing mixed line endings. (issue #569) +* Fixed MailboxAddress parser to decode IDN-encoded local-parts of email addresses. (MailKit issue #1026) +* Added new MailboxAddress.GetAddress(bool idnEncode) method. +* Improved subclassability of OpenPgpContext by making a number of methods virtual. (issue #571) +* Added support for RSACng and DSACng. (issue #567) +* Dropped Xamarin platforms since they are compatible with netstandard2.0. Xamarin Inc. en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 98d0bec81c..e0e81c117d 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.7.0 + 2.8.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,11 +26,10 @@ An Open Source library for creating and parsing MIME messages. -* Fixed InternetAddressList.Insert() to allow inserting at the end of the list. (issue #559) -* Added ParserOptions.MaxMimeDepth to allow developers to set the max nesting depth allowed by the parser. -* Added logic to handle multipart children without any headers or content. -* Fixed MimePart.WriteTo() to avoid canonicalizing line endings for MimeParts that do not define a Content-Transfer-Encoding. (issue #569) -* NuGet packages now include the portable pdb's. +* Improved logic for verifying signatures for MimeParts containing mixed line endings. (issue #569) +* Fixed MailboxAddress parser to decode IDN-encoded local-parts of email addresses. (MailKit issue #1026) +* Added new MailboxAddress.GetAddress(bool idnEncode) method. +* Dropped Xamarin platforms since they are compatible with netstandard2.0. Xamarin Inc. en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index fd88e9107b..725e3c7a1c 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -36,7 +36,7 @@ - + @@ -46,4 +46,4 @@ - \ No newline at end of file + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 0aa07b2c7a..3e891a8ab8 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -64,7 +64,7 @@ - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index b9ec794862..e27644acf0 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -76,7 +76,7 @@ - + @@ -104,4 +104,4 @@ xamarin3.msg - \ No newline at end of file + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 3faeded213..5b8eff1d5f 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -47,7 +47,7 @@ - + @@ -95,4 +95,4 @@ --> - \ No newline at end of file + From c9ee1ef05366fece166b3d7406815f9724588dce Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 30 May 2020 08:03:33 -0400 Subject: [PATCH 569/741] Updated ReleaseNotes.md --- ReleaseNotes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 9f5e038311..1aff49a8af 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,6 +1,6 @@ # Release Notes -### MimeKit 2.8.0 (2020-05-26) +### MimeKit 2.8.0 (2020-05-30) * Improved logic for verifying signatures for MimeParts containing mixed line endings. (issue [#569](https://github.com/jstedfast/MimeKit/issues/569)) From d4f6a20742007de917072395b9b74e9c3a496eb5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 30 May 2020 13:27:03 -0400 Subject: [PATCH 570/741] Update SecureMailboxAddress.cs --- MimeKit/Cryptography/SecureMailboxAddress.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index dab0f2a387..7ee8aa261e 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -110,6 +110,7 @@ public SecureMailboxAddress (string name, IEnumerable route, string addr /// -or- /// is null. /// + [Obsolete ("Use new SecureMailboxAddress (string.Empty, route, address, fingerprint) instead.")] public SecureMailboxAddress (IEnumerable route, string address, string fingerprint) : base (route, address) { ValidateFingerprint (fingerprint); @@ -182,6 +183,7 @@ public SecureMailboxAddress (string name, string address, string fingerprint) : /// -or- /// is null. /// + [Obsolete ("Use new SecureMailboxAddress (string.Empty, address, fingerprint) instead.")] public SecureMailboxAddress (string address, string fingerprint) : base (address) { ValidateFingerprint (fingerprint); @@ -208,7 +210,7 @@ static void ValidateFingerprint (string fingerprint) /// as a unique identifier for a particular certificate in a certificate store. /// /// - /// + /// /// The fingerprint of the certificate. public string Fingerprint { get; private set; From b6e82a4560063da581c5ff0764d23237e9f357cc Mon Sep 17 00:00:00 2001 From: Thomas Hansen Date: Wed, 3 Jun 2020 04:32:02 +0300 Subject: [PATCH 571/741] Modified OpenPgpContext.GetSecretKey(long) to be public virtual (#575) --- MimeKit/Cryptography/OpenPgpContext.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 7833ea8ad8..b22bb6f44e 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -884,7 +884,13 @@ protected PgpPrivateKey GetPrivateKey (PgpSecretKey key) throw new UnauthorizedAccessException (); } - PgpSecretKey GetSecretKey (long keyId) + + /// + /// Returns the secret key with the specified key ID + /// + /// ID of secret key to retrieve. + /// + public virtual PgpSecretKey GetSecretKey (long keyId) { foreach (var key in EnumerateSecretKeys ()) { if (key.KeyId == keyId) From 7090df577f30c1a1386c6d5249a66954ab2eced4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 2 Jun 2020 21:38:38 -0400 Subject: [PATCH 572/741] Updated docs for OpenPgpContext.GetSecretKey() --- MimeKit/Cryptography/OpenPgpContext.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index b22bb6f44e..c6ead0ba53 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -886,10 +886,16 @@ protected PgpPrivateKey GetPrivateKey (PgpSecretKey key) /// - /// Returns the secret key with the specified key ID + /// Get the secret key for a specified key identifier. /// - /// ID of secret key to retrieve. - /// + /// + /// Gets the secret key for a specified key identifier. + /// + /// The key identifier for the desired secret key. + /// The secret key. + /// + /// The secret key specified by the could not be found. + /// public virtual PgpSecretKey GetSecretKey (long keyId) { foreach (var key in EnumerateSecretKeys ()) { @@ -897,7 +903,7 @@ public virtual PgpSecretKey GetSecretKey (long keyId) return key; } - throw new PrivateKeyNotFoundException (keyId, "The private key could not be found."); + throw new PrivateKeyNotFoundException (keyId, "The secret key could not be found."); } #if false From 878090d3f8abf301c895c2e74044c0c76ec5ea9d Mon Sep 17 00:00:00 2001 From: Thomas Hansen Date: Thu, 4 Jun 2020 16:24:29 +0300 Subject: [PATCH 573/741] Refactored OpenPgpContext to separate out key storage implementation (#576) --- MimeKit/Cryptography/CryptographyContext.cs | 14 +- MimeKit/Cryptography/KeyRetrievalResults.cs | 48 + MimeKit/Cryptography/OpenPgpContext.cs | 1756 +------------------ MimeKit/Cryptography/PgpContext.cs | 1747 ++++++++++++++++++ MimeKit/MimeKit.Net45.csproj | 6 +- MimeKit/MimeKit.NetStandard.csproj | 2 + 6 files changed, 1893 insertions(+), 1680 deletions(-) create mode 100644 MimeKit/Cryptography/KeyRetrievalResults.cs create mode 100644 MimeKit/Cryptography/PgpContext.cs diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index dfeea4d473..7ea4606f46 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -44,7 +44,7 @@ public abstract class CryptographyContext : IDisposable { const string SubclassAndRegisterFormat = "You need to subclass {0} and then register it with MimeKit.Cryptography.CryptographyContext.Register()."; static Func SecureMimeContextFactory; - static Func OpenPgpContextFactory; + static Func PgpContextFactory; static readonly object mutex = new object (); EncryptionAlgorithm[] encryptionAlgorithmRank; @@ -549,8 +549,8 @@ public static CryptographyContext Create (string protocol) case "application/pgp-encrypted": case "application/x-pgp-keys": case "application/pgp-keys": - if (OpenPgpContextFactory != null) - return OpenPgpContextFactory (); + if (PgpContextFactory != null) + return PgpContextFactory (); throw new NotSupportedException (string.Format (SubclassAndRegisterFormat, "MimeKit.Cryptography.OpenPgpContext or MimeKit.Cryptography.GnuPGContext")); default: @@ -596,9 +596,9 @@ public static void Register (Type type) lock (mutex) { SecureMimeContextFactory = () => (SecureMimeContext) ctor.Invoke (new object[0]); } - } else if (info.IsSubclassOf (typeof (OpenPgpContext))) { + } else if (info.IsSubclassOf (typeof (PgpContext))) { lock (mutex) { - OpenPgpContextFactory = () => (OpenPgpContext) ctor.Invoke (new object[0]); + PgpContextFactory = () => (PgpContext) ctor.Invoke (new object[0]); } } else { throw new ArgumentException ("The specified type must be a subclass of SecureMimeContext or OpenPgpContext.", nameof (type)); @@ -635,13 +635,13 @@ public static void Register (Func factory) /// /// is null. /// - public static void Register (Func factory) + public static void Register (Func factory) { if (factory == null) throw new ArgumentNullException(nameof (factory)); lock (mutex) { - OpenPgpContextFactory = factory; + PgpContextFactory = factory; } } } diff --git a/MimeKit/Cryptography/KeyRetrievalResults.cs b/MimeKit/Cryptography/KeyRetrievalResults.cs new file mode 100644 index 0000000000..073f6ad291 --- /dev/null +++ b/MimeKit/Cryptography/KeyRetrievalResults.cs @@ -0,0 +1,48 @@ +// +// OpenPgpContext.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using Org.BouncyCastle.Bcpg.OpenPgp; + +namespace MimeKit.Cryptography +{ + public abstract partial class PgpContext + { + /// + /// Helper class to return both public keyring and public key associated with each other. + /// + public class KeyRetrievalResults + { + public readonly PgpPublicKeyRing KeyRing; + public readonly PgpPublicKey Key; + + public KeyRetrievalResults (PgpPublicKeyRing keyring, PgpPublicKey pubkey) + { + KeyRing = keyring; + Key = pubkey; + } + } + } +} diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index c6ead0ba53..c89a9ab1d9 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -1,4 +1,4 @@ -// +// // OpenPgpContext.cs // // Author: Jeffrey Stedfast @@ -26,10 +26,7 @@ using System; using System.IO; -using System.Net; using System.Linq; -using System.Text; -using System.Net.Http; using System.Threading; using System.Diagnostics; using System.Threading.Tasks; @@ -46,48 +43,21 @@ using MimeKit.IO; using MimeKit.Utils; -namespace MimeKit.Cryptography { +namespace MimeKit.Cryptography +{ + // NOTE: This class should really be called "GnuPGContext", since it's based upon the GnuPG way to handle keys. + // However, renaming it now is impossible, since that would break every single class currently inheriting form it :/ /// - /// An abstract OpenPGP cryptography context which can be used for PGP/MIME. + /// An abstract OpenPGP cryptography context which can be used for PGP/MIME that is based upon GnuPG + /// files to store PGP keys. /// /// /// Generally speaking, applications should not use a /// directly, but rather via higher level APIs such as /// and . /// - public abstract class OpenPgpContext : CryptographyContext + public abstract class OpenPgpContext : PgpContext { - static readonly string[] ProtocolSubtypes = { "pgp-signature", "pgp-encrypted", "pgp-keys", "x-pgp-signature", "x-pgp-encrypted", "x-pgp-keys" }; - const string BeginPublicKeyBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; - const string EndPublicKeyBlock = "-----END PGP PUBLIC KEY BLOCK-----"; - - internal static readonly EncryptionAlgorithm[] DefaultEncryptionAlgorithmRank = { - EncryptionAlgorithm.Idea, - EncryptionAlgorithm.TripleDes, - EncryptionAlgorithm.Cast5, - EncryptionAlgorithm.Blowfish, - EncryptionAlgorithm.Aes128, - EncryptionAlgorithm.Aes192, - EncryptionAlgorithm.Aes256, - EncryptionAlgorithm.Twofish, - EncryptionAlgorithm.Camellia128, - EncryptionAlgorithm.Camellia192, - EncryptionAlgorithm.Camellia256 - }; - - internal static readonly DigestAlgorithm[] DefaultDigestAlgorithmRank = { - DigestAlgorithm.Sha1, - DigestAlgorithm.RipeMD160, - DigestAlgorithm.Sha256, - DigestAlgorithm.Sha384, - DigestAlgorithm.Sha512, - DigestAlgorithm.Sha224 - }; - - EncryptionAlgorithm defaultAlgorithm; - HttpClient client; - Uri keyServer; - /// /// Initialize a new instance of the class. /// @@ -96,21 +66,8 @@ public abstract class OpenPgpContext : CryptographyContext /// , , and the /// properties themselves. /// - protected OpenPgpContext () - { - EncryptionAlgorithmRank = DefaultEncryptionAlgorithmRank; - DigestAlgorithmRank = DefaultDigestAlgorithmRank; - - foreach (var algorithm in EncryptionAlgorithmRank) - Enable (algorithm); - - foreach (var algorithm in DigestAlgorithmRank) - Enable (algorithm); - - defaultAlgorithm = EncryptionAlgorithm.Cast5; - - client = new HttpClient (); - } + protected OpenPgpContext () : base() // Base constructor sets all defaults. + { } /// /// Initialize a new instance of the class. @@ -159,71 +116,6 @@ protected OpenPgpContext (string pubring, string secring) : this () } } - /// - /// Get or set the default encryption algorithm. - /// - /// - /// Gets or sets the default encryption algorithm. - /// - /// The encryption algorithm. - /// - /// The specified encryption algorithm is not supported. - /// - public EncryptionAlgorithm DefaultEncryptionAlgorithm { - get { return defaultAlgorithm; } - set { - GetSymmetricKeyAlgorithm (value); - defaultAlgorithm = value; - } - } - - bool IsValidKeyServer { - get { - if (keyServer == null) - return false; - - switch (keyServer.Scheme.ToLowerInvariant ()) { - case "https": case "http": case "hkp": return true; - default: return false; - } - } - } - - /// - /// Get or set the key server to use when automatically retrieving keys. - /// - /// - /// Gets or sets the key server to use when verifying keys that are - /// not already in the public keychain. - /// Only HTTP and HKP protocols are supported. - /// - /// The key server. - /// - /// is not an absolute URI. - /// - public Uri KeyServer { - get { return keyServer; } - set { - if (value != null && !value.IsAbsoluteUri) - throw new ArgumentException ("The key server URI must be absolute.", nameof (value)); - - keyServer = value; - } - } - - /// - /// Get or set whether unknown PGP keys should automtically be retrieved. - /// - /// - /// Gets or sets whether or not the should automatically - /// fetch keys as needed from the keyserver when verifying signatures. - /// Requires a valid to be set. - /// - /// true if unknown PGP keys should automatically be retrieved; otherwise, false. - public bool AutoKeyRetrieve { - get; set; - } - /// /// Get the public keyring path. /// @@ -269,257 +161,13 @@ public PgpSecretKeyRingBundle SecretKeyRingBundle { } /// - /// Get the signature protocol. - /// - /// - /// The signature protocol is used by - /// in order to determine what the protocol parameter of the Content-Type - /// header should be. - /// - /// The signature protocol. - public override string SignatureProtocol { - get { return "application/pgp-signature"; } - } - - /// - /// Get the encryption protocol. - /// - /// - /// The encryption protocol is used by - /// in order to determine what the protocol parameter of the Content-Type - /// header should be. - /// - /// The encryption protocol. - public override string EncryptionProtocol { - get { return "application/pgp-encrypted"; } - } - - /// - /// Get the key exchange protocol. - /// - /// - /// Gets the key exchange protocol. - /// - /// The key exchange protocol. - public override string KeyExchangeProtocol { - get { return "application/pgp-keys"; } - } - - /// - /// Check whether or not the specified protocol is supported. - /// - /// - /// Used in order to make sure that the protocol parameter value specified in either a multipart/signed - /// or multipart/encrypted part is supported by the supplied cryptography context. - /// - /// true if the protocol is supported; otherwise false - /// The protocol. - /// - /// is null. - /// - public override bool Supports (string protocol) - { - if (protocol == null) - throw new ArgumentNullException (nameof (protocol)); - - if (!protocol.StartsWith ("application/", StringComparison.OrdinalIgnoreCase)) - return false; - - int startIndex = "application/".Length; - int subtypeLength = protocol.Length - startIndex; - - for (int i = 0; i < ProtocolSubtypes.Length; i++) { - if (subtypeLength != ProtocolSubtypes[i].Length) - continue; - - if (string.Compare (protocol, startIndex, ProtocolSubtypes[i], 0, subtypeLength, StringComparison.OrdinalIgnoreCase) == 0) - return true; - } - - return false; - } - - /// - /// Get the string name of the digest algorithm for use with the micalg parameter of a multipart/signed part. - /// - /// - /// Maps the to the appropriate string identifier - /// as used by the micalg parameter value of a multipart/signed Content-Type - /// header. For example: - /// - /// AlgorithmName - /// pgp-md5 - /// pgp-sha1 - /// pgp-ripemd160 - /// pgp-md2 - /// pgp-tiger192 - /// pgp-haval-5-160 - /// pgp-sha256 - /// pgp-sha384 - /// pgp-sha512 - /// pgp-sha224 - /// - /// - /// The micalg value. - /// The digest algorithm. - /// - /// is out of range. - /// - public override string GetDigestAlgorithmName (DigestAlgorithm micalg) - { - switch (micalg) { - case DigestAlgorithm.MD5: return "pgp-md5"; - case DigestAlgorithm.Sha1: return "pgp-sha1"; - case DigestAlgorithm.RipeMD160: return "pgp-ripemd160"; - case DigestAlgorithm.MD2: return "pgp-md2"; - case DigestAlgorithm.Tiger192: return "pgp-tiger192"; - case DigestAlgorithm.Haval5160: return "pgp-haval-5-160"; - case DigestAlgorithm.Sha256: return "pgp-sha256"; - case DigestAlgorithm.Sha384: return "pgp-sha384"; - case DigestAlgorithm.Sha512: return "pgp-sha512"; - case DigestAlgorithm.Sha224: return "pgp-sha224"; - case DigestAlgorithm.MD4: return "pgp-md4"; - default: throw new ArgumentOutOfRangeException (nameof (micalg)); - } - } - - /// - /// Get the digest algorithm from the micalg parameter value in a multipart/signed part. + /// Helper method to retrieve a public key, and its keyring, given a key's ID /// - /// - /// Maps the micalg parameter value string back to the appropriate . - /// - /// The digest algorithm. - /// The micalg parameter value. - /// - /// is null. - /// - public override DigestAlgorithm GetDigestAlgorithm (string micalg) - { - if (micalg == null) - throw new ArgumentNullException (nameof (micalg)); - - switch (micalg.ToLowerInvariant ()) { - case "pgp-md5": return DigestAlgorithm.MD5; - case "pgp-sha1": return DigestAlgorithm.Sha1; - case "pgp-ripemd160": return DigestAlgorithm.RipeMD160; - case "pgp-md2": return DigestAlgorithm.MD2; - case "pgp-tiger192": return DigestAlgorithm.Tiger192; - case "pgp-haval-5-160": return DigestAlgorithm.Haval5160; - case "pgp-sha256": return DigestAlgorithm.Sha256; - case "pgp-sha384": return DigestAlgorithm.Sha384; - case "pgp-sha512": return DigestAlgorithm.Sha512; - case "pgp-sha224": return DigestAlgorithm.Sha224; - case "pgp-md4": return DigestAlgorithm.MD4; - default: return DigestAlgorithm.None; - } - } - - static string HexEncode (byte[] data) - { - var fingerprint = new StringBuilder (); - - for (int i = 0; i < data.Length; i++) - fingerprint.Append (data[i].ToString ("x2")); - - return fingerprint.ToString (); - } - - static bool PgpPublicKeyMatches (PgpPublicKey key, MailboxAddress mailbox) - { - var secure = mailbox as SecureMailboxAddress; - - if (secure != null && !string.IsNullOrEmpty (secure.Fingerprint)) { - if (secure.Fingerprint.Length > 16) { - var fingerprint = HexEncode (key.GetFingerprint ()); - - return secure.Fingerprint.Equals (fingerprint, StringComparison.OrdinalIgnoreCase); - } - - var id = ((int) key.KeyId).ToString ("X2"); - - return secure.Fingerprint.EndsWith (id, StringComparison.OrdinalIgnoreCase); - } - - foreach (string userId in key.GetUserIds ()) { - MailboxAddress email; - - if (!MailboxAddress.TryParse (userId, out email)) - continue; - - if (mailbox.Address.Equals (email.Address, StringComparison.OrdinalIgnoreCase)) - return true; - } - - return false; - } - - async Task RetrievePublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) - { - var scheme = keyServer.Scheme.ToLowerInvariant (); - var uri = new UriBuilder (); - - uri.Scheme = scheme == "hkp" ? "http" : scheme; - uri.Host = keyServer.Host; - - if (keyServer.IsDefaultPort) { - if (scheme == "hkp") - uri.Port = 11371; - } else { - uri.Port = keyServer.Port; - } - - uri.Path = "/pks/lookup"; - uri.Query = string.Format ("op=get&search=0x{0:X}", keyId); - - using (var stream = new MemoryBlockStream ()) { - using (var filtered = new FilteredStream (stream)) { - filtered.Add (new OpenPgpBlockFilter (BeginPublicKeyBlock, EndPublicKeyBlock)); - - if (doAsync) { - using (var response = await client.GetAsync (uri.ToString (), cancellationToken).ConfigureAwait (false)) - await response.Content.CopyToAsync (filtered).ConfigureAwait (false); - } else { -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 - var request = (HttpWebRequest) WebRequest.Create (uri.ToString ()); - using (var response = request.GetResponse ()) { - var content = response.GetResponseStream (); - content.CopyTo (filtered, 4096); - } -#else - using (var response = client.GetAsync (uri.ToString (), cancellationToken).GetAwaiter ().GetResult ()) - response.Content.CopyToAsync (filtered).GetAwaiter ().GetResult (); -#endif - } - - filtered.Flush (); - } - - stream.Position = 0; - - using (var armored = new ArmoredInputStream (stream, true)) { - var bundle = new PgpPublicKeyRingBundle (armored); - - Import (bundle); - - return bundle.GetPublicKeyRing (keyId); - } - } - } - - class KeyRetrievalResults - { - public readonly PgpPublicKeyRing KeyRing; - public readonly PgpPublicKey Key; - - public KeyRetrievalResults (PgpPublicKeyRing keyring, PgpPublicKey pubkey) - { - KeyRing = keyring; - Key = pubkey; - } - } - - async Task GetPublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) + /// + /// + /// + /// + public override async Task GetPublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) { foreach (PgpPublicKeyRing ring in PublicKeyRingBundle.GetKeyRings ()) { foreach (PgpPublicKey key in ring.GetPublicKeys ()) { @@ -529,14 +177,8 @@ async Task GetPublicKeyRingAsync (long keyId, bool doAsync, } if (AutoKeyRetrieve && IsValidKeyServer) { - try { - var keyring = await RetrievePublicKeyRingAsync (keyId, doAsync, cancellationToken).ConfigureAwait (false); - - return new KeyRetrievalResults (keyring, keyring.GetPublicKey (keyId)); - } catch (OperationCanceledException) { - throw; - } catch { - } + var keyring = await RetrievePublicKeyRingAsync (keyId, doAsync, cancellationToken).ConfigureAwait (false); + return new KeyRetrievalResults (keyring, keyring.GetPublicKey (keyId)); } return new KeyRetrievalResults (null, null); @@ -696,19 +338,6 @@ public virtual IEnumerable EnumerateSecretKeys (MailboxAddress mai yield break; } - static bool IsExpired (PgpPublicKey pubkey) - { - long seconds = pubkey.GetValidSeconds (); - - if (seconds != 0) { - var expires = pubkey.CreationTime.AddSeconds ((double) seconds); - if (expires <= DateTime.Now) - return true; - } - - return false; - } - /// /// Get the public key associated with the mailbox address. /// @@ -749,7 +378,7 @@ protected virtual PgpPublicKey GetPublicKey (MailboxAddress mailbox) /// /// A public key for one or more of the could not be found. /// - internal protected virtual IList GetPublicKeys (IEnumerable mailboxes) + public override IList GetPublicKeys (IEnumerable mailboxes) { if (mailboxes == null) throw new ArgumentNullException (nameof (mailboxes)); @@ -787,6 +416,27 @@ static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) return false; } + /// + /// Get the secret key for a specified key identifier. + /// + /// + /// Gets the secret key for a specified key identifier. + /// + /// The key identifier for the desired secret key. + /// The secret key. + /// + /// The secret key specified by the could not be found. + /// + public override PgpSecretKey GetSecretKey (long keyId) + { + foreach (var key in EnumerateSecretKeys ()) { + if (key.KeyId == keyId) + return key; + } + + throw new PrivateKeyNotFoundException (keyId, "The secret key could not be found."); + } + /// /// Get the signing key associated with the mailbox address. /// @@ -801,7 +451,7 @@ static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) /// /// A private key for the specified could not be found. /// - internal protected virtual PgpSecretKey GetSigningKey (MailboxAddress mailbox) + public override PgpSecretKey GetSigningKey (MailboxAddress mailbox) { if (mailbox == null) throw new ArgumentNullException (nameof (mailbox)); @@ -823,87 +473,59 @@ internal protected virtual PgpSecretKey GetSigningKey (MailboxAddress mailbox) } /// - /// Gets the password for key. - /// - /// - /// Gets the password for key. - /// - /// The password for key. - /// The key. - /// - /// The user chose to cancel the password request. - /// - protected abstract string GetPasswordForKey (PgpSecretKey key); - - /// - /// Gets the private key from the specified secret key. + /// Check whether or not a particular mailbox address can be used for signing. /// /// - /// Gets the private key from the specified secret key. + /// Checks whether or not as particular mailbocx address can be used for signing. /// - /// The private key. - /// The secret key. + /// true if the mailbox address can be used for signing; otherwise, false. + /// The signer. /// - /// is null. - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. + /// is null. /// - protected PgpPrivateKey GetPrivateKey (PgpSecretKey key) + public override bool CanSign (MailboxAddress signer) { - int attempts = 0; - string password; - - if (key == null) - throw new ArgumentNullException (nameof (key)); - - do { - if ((password = GetPasswordForKey (key)) == null) - throw new OperationCanceledException (); - - try { - var privateKey = key.ExtractPrivateKey (password.ToCharArray ()); + if (signer == null) + throw new ArgumentNullException (nameof (signer)); - // Note: the private key will be null if the private key is empty. - if (privateKey == null) - break; + foreach (var key in EnumerateSecretKeys (signer)) { + if (!key.IsSigningKey) + continue; - return privateKey; - } catch (Exception ex) { -#if DEBUG - Debug.WriteLine (string.Format ("Failed to extract secret key: {0}", ex)); -#endif - } + var pubkey = key.PublicKey; + if (pubkey.IsRevoked () || IsExpired (pubkey)) + continue; - attempts++; - } while (attempts < 3); + return true; + } - throw new UnauthorizedAccessException (); + return false; } - /// - /// Get the secret key for a specified key identifier. + /// Check whether or not the cryptography context can encrypt to a particular recipient. /// /// - /// Gets the secret key for a specified key identifier. + /// Checks whether or not the cryptography context can be used to encrypt to a particular recipient. /// - /// The key identifier for the desired secret key. - /// The secret key. - /// - /// The secret key specified by the could not be found. + /// true if the cryptography context can be used to encrypt to the designated recipient; otherwise, false. + /// The recipient's mailbox address. + /// + /// is null. /// - public virtual PgpSecretKey GetSecretKey (long keyId) + public override bool CanEncrypt (MailboxAddress mailbox) { - foreach (var key in EnumerateSecretKeys ()) { - if (key.KeyId == keyId) - return key; + if (mailbox == null) + throw new ArgumentNullException (nameof (mailbox)); + + foreach (var key in EnumeratePublicKeys (mailbox)) { + if (!key.IsEncryptionKey || key.IsRevoked () || IsExpired (key)) + continue; + + return true; } - throw new PrivateKeyNotFoundException (keyId, "The secret key could not be found."); + return false; } #if false @@ -1131,1212 +753,21 @@ public void SignKey (PgpSecretKey secretKey, PgpPublicKey publicKey, DigestAlgor } /// - /// Gets the equivalent for the - /// specified . + /// Saves the public key-ring bundle. /// /// - /// Maps a to the equivalent . + /// Atomically saves the public key-ring bundle to the path specified by . + /// Called by if any public keys were successfully imported. /// - /// The hash algorithm. - /// The digest algorithm. - /// - /// is out of range. - /// - /// - /// is not a supported digest algorithm. + /// + /// An error occured while saving the public key-ring bundle. /// - public static HashAlgorithmTag GetHashAlgorithm (DigestAlgorithm digestAlgo) + protected void SavePublicKeyRingBundle () { - switch (digestAlgo) { - case DigestAlgorithm.MD5: return HashAlgorithmTag.MD5; - case DigestAlgorithm.Sha1: return HashAlgorithmTag.Sha1; - case DigestAlgorithm.RipeMD160: return HashAlgorithmTag.RipeMD160; - case DigestAlgorithm.DoubleSha: throw new NotSupportedException ("The Double SHA digest algorithm is not supported."); - case DigestAlgorithm.MD2: return HashAlgorithmTag.MD2; - case DigestAlgorithm.Tiger192: throw new NotSupportedException ("The Tiger-192 digest algorithm is not supported."); - case DigestAlgorithm.Haval5160: throw new NotSupportedException ("The HAVAL 5 160 digest algorithm is not supported."); - case DigestAlgorithm.Sha256: return HashAlgorithmTag.Sha256; - case DigestAlgorithm.Sha384: return HashAlgorithmTag.Sha384; - case DigestAlgorithm.Sha512: return HashAlgorithmTag.Sha512; - case DigestAlgorithm.Sha224: return HashAlgorithmTag.Sha224; - case DigestAlgorithm.MD4: throw new NotSupportedException ("The MD4 digest algorithm is not supported."); - default: throw new ArgumentOutOfRangeException (nameof (digestAlgo)); - } - } - - /// - /// Check whether or not a particular mailbox address can be used for signing. - /// - /// - /// Checks whether or not as particular mailbocx address can be used for signing. - /// - /// true if the mailbox address can be used for signing; otherwise, false. - /// The signer. - /// - /// is null. - /// - public override bool CanSign (MailboxAddress signer) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - foreach (var key in EnumerateSecretKeys (signer)) { - if (!key.IsSigningKey) - continue; - - var pubkey = key.PublicKey; - if (pubkey.IsRevoked () || IsExpired (pubkey)) - continue; - - return true; - } - - return false; - } - - /// - /// Check whether or not the cryptography context can encrypt to a particular recipient. - /// - /// - /// Checks whether or not the cryptography context can be used to encrypt to a particular recipient. - /// - /// true if the cryptography context can be used to encrypt to the designated recipient; otherwise, false. - /// The recipient's mailbox address. - /// - /// is null. - /// - public override bool CanEncrypt (MailboxAddress mailbox) - { - if (mailbox == null) - throw new ArgumentNullException (nameof (mailbox)); - - foreach (var key in EnumeratePublicKeys (mailbox)) { - if (!key.IsEncryptionKey || key.IsRevoked () || IsExpired (key)) - continue; - - return true; - } - - return false; - } - - /// - /// Cryptographically signs the content. - /// - /// - /// Cryptographically signs the content using the specified signer and digest algorithm. - /// - /// A new instance - /// containing the detached signature data. - /// The signer. - /// The digest algorithm to use for signing. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// is out of range. - /// - /// - /// The specified is not supported by this context. - /// - /// - /// A signing key could not be found for . - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - public override MimePart Sign (MailboxAddress signer, DigestAlgorithm digestAlgo, Stream content) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - var key = GetSigningKey (signer); - - return Sign (key, digestAlgo, content); - } - - /// - /// Cryptographically signs the content. - /// - /// - /// Cryptographically signs the content using the specified signer and digest algorithm. - /// - /// A new instance - /// containing the detached signature data. - /// The signer. - /// The digest algorithm to use for signing. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// cannot be used for signing. - /// - /// - /// The was out of range. - /// - /// - /// The is not supported. - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - public ApplicationPgpSignature Sign (PgpSecretKey signer, DigestAlgorithm digestAlgo, Stream content) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - if (!signer.IsSigningKey) - throw new ArgumentException ("The specified secret key cannot be used for signing.", nameof (signer)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - var hashAlgorithm = GetHashAlgorithm (digestAlgo); - var memory = new MemoryBlockStream (); - - using (var armored = new ArmoredOutputStream (memory)) { - armored.SetHeader ("Version", null); - - var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); - using (var compressed = compresser.Open (armored)) { - var signatureGenerator = new PgpSignatureGenerator (signer.PublicKey.Algorithm, hashAlgorithm); - var buf = new byte[4096]; - int nread; - - signatureGenerator.InitSign (PgpSignature.CanonicalTextDocument, GetPrivateKey (signer)); - - while ((nread = content.Read (buf, 0, buf.Length)) > 0) - signatureGenerator.Update (buf, 0, nread); - - var signature = signatureGenerator.Generate (); - - signature.Encode (compressed); - compressed.Flush (); - } - - armored.Flush (); - } - - memory.Position = 0; - - return new ApplicationPgpSignature (memory); - } - - /// - /// Gets the equivalent for the specified - /// . - /// - /// - /// Gets the equivalent for the specified - /// . - /// - /// The digest algorithm. - /// The hash algorithm. - /// - /// is out of range. - /// - /// - /// does not have an equivalent value. - /// - public static DigestAlgorithm GetDigestAlgorithm (HashAlgorithmTag hashAlgorithm) - { - switch (hashAlgorithm) { - case HashAlgorithmTag.MD5: return DigestAlgorithm.MD5; - case HashAlgorithmTag.Sha1: return DigestAlgorithm.Sha1; - case HashAlgorithmTag.RipeMD160: return DigestAlgorithm.RipeMD160; - case HashAlgorithmTag.DoubleSha: return DigestAlgorithm.DoubleSha; - case HashAlgorithmTag.MD2: return DigestAlgorithm.MD2; - case HashAlgorithmTag.Tiger192: return DigestAlgorithm.Tiger192; - case HashAlgorithmTag.Haval5pass160: return DigestAlgorithm.Haval5160; - case HashAlgorithmTag.Sha256: return DigestAlgorithm.Sha256; - case HashAlgorithmTag.Sha384: return DigestAlgorithm.Sha384; - case HashAlgorithmTag.Sha512: return DigestAlgorithm.Sha512; - case HashAlgorithmTag.Sha224: return DigestAlgorithm.Sha224; - default: throw new ArgumentOutOfRangeException (nameof (hashAlgorithm)); - } - } - - /// - /// Gets the equivalent for the specified - /// . - /// - /// - /// Gets the equivalent for the specified - /// . - /// - /// The public-key algorithm. - /// The public-key algorithm. - /// - /// is out of range. - /// - /// - /// does not have an equivalent value. - /// - public static PublicKeyAlgorithm GetPublicKeyAlgorithm (PublicKeyAlgorithmTag algorithm) - { - switch (algorithm) { - case PublicKeyAlgorithmTag.RsaGeneral: return PublicKeyAlgorithm.RsaGeneral; - case PublicKeyAlgorithmTag.RsaEncrypt: return PublicKeyAlgorithm.RsaEncrypt; - case PublicKeyAlgorithmTag.RsaSign: return PublicKeyAlgorithm.RsaSign; - case PublicKeyAlgorithmTag.ElGamalGeneral: return PublicKeyAlgorithm.ElGamalGeneral; - case PublicKeyAlgorithmTag.ElGamalEncrypt: return PublicKeyAlgorithm.ElGamalEncrypt; - case PublicKeyAlgorithmTag.Dsa: return PublicKeyAlgorithm.Dsa; - case PublicKeyAlgorithmTag.ECDH: return PublicKeyAlgorithm.EllipticCurve; - case PublicKeyAlgorithmTag.ECDsa: return PublicKeyAlgorithm.EllipticCurveDsa; - case PublicKeyAlgorithmTag.DiffieHellman: return PublicKeyAlgorithm.DiffieHellman; - default: throw new ArgumentOutOfRangeException (nameof (algorithm)); - } - } - - async Task GetDigitalSignaturesAsync (PgpSignatureList signatureList, Stream content, bool doAsync, CancellationToken cancellationToken) - { - var signatures = new List (); - var buf = new byte[4096]; - int nread; - - for (int i = 0; i < signatureList.Count; i++) { - long keyId = signatureList[i].KeyId; - KeyRetrievalResults results; - - if (doAsync) - results = await GetPublicKeyRingAsync (keyId, doAsync, cancellationToken).ConfigureAwait (false); - else - results = GetPublicKeyRingAsync (keyId, doAsync, cancellationToken).GetAwaiter ().GetResult (); - - var signature = new OpenPgpDigitalSignature (results.KeyRing, results.Key, signatureList[i]) { - PublicKeyAlgorithm = GetPublicKeyAlgorithm (signatureList[i].KeyAlgorithm), - DigestAlgorithm = GetDigestAlgorithm (signatureList[i].HashAlgorithm), - CreationDate = signatureList[i].CreationTime, - }; - - if (results.Key != null) - signatureList[i].InitVerify (results.Key); - - signatures.Add (signature); - } - - while ((nread = content.Read (buf, 0, buf.Length)) > 0) { - for (int i = 0; i < signatures.Count; i++) { - if (signatures[i].SignerCertificate != null) { - var pgp = (OpenPgpDigitalSignature) signatures[i]; - pgp.Signature.Update (buf, 0, nread); - } - } - } - - return new DigitalSignatureCollection (signatures); - } - - Task VerifyAsync (Stream content, Stream signatureData, bool doAsync, CancellationToken cancellationToken) - { - if (content == null) - throw new ArgumentNullException (nameof (content)); - - if (signatureData == null) - throw new ArgumentNullException (nameof (signatureData)); - - using (var armored = new ArmoredInputStream (signatureData)) { - var factory = new PgpObjectFactory (armored); - var data = factory.NextPgpObject (); - PgpSignatureList signatureList; - - var compressed = data as PgpCompressedData; - if (compressed != null) { - factory = new PgpObjectFactory (compressed.GetDataStream ()); - data = factory.NextPgpObject (); - } - - if (data == null) - throw new FormatException ("Invalid PGP format."); - - signatureList = (PgpSignatureList) data; - - return GetDigitalSignaturesAsync (signatureList, content, doAsync, cancellationToken); - } - } - - /// - /// Verify the specified content using the detached signatureData. - /// - /// - /// Verifies the specified content using the detached signatureData. - /// If any of the signatures were made with an unrecognized key and is enabled, - /// an attempt will be made to retrieve said key(s). The can be used to cancel - /// key retrieval. - /// - /// A list of digital signatures. - /// The content. - /// The signature data. - /// The cancellation token. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// does not contain valid PGP signature data. - /// - public override DigitalSignatureCollection Verify (Stream content, Stream signatureData, CancellationToken cancellationToken = default (CancellationToken)) - { - return VerifyAsync (content, signatureData, false, cancellationToken).GetAwaiter ().GetResult (); - } - - /// - /// Asynchronously verify the specified content using the detached signatureData. - /// - /// - /// Verifies the specified content using the detached signatureData. - /// If any of the signatures were made with an unrecognized key and is enabled, - /// an attempt will be made to retrieve said key(s). The can be used to cancel - /// key retrieval. - /// - /// A list of digital signatures. - /// The content. - /// The signature data. - /// The cancellation token. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// does not contain valid PGP signature data. - /// - public override Task VerifyAsync (Stream content, Stream signatureData, CancellationToken cancellationToken = default (CancellationToken)) - { - return VerifyAsync (content, signatureData, true, cancellationToken); - } - - static Stream Compress (Stream content, byte[] buf) - { - var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); - var memory = new MemoryBlockStream (); - - using (var compressed = compresser.Open (memory)) { - var literalGenerator = new PgpLiteralDataGenerator (); - - using (var literal = literalGenerator.Open (compressed, 't', "mime.txt", content.Length, DateTime.Now)) { - int nread; - - while ((nread = content.Read (buf, 0, buf.Length)) > 0) - literal.Write (buf, 0, nread); - - literal.Flush (); - } - - compressed.Flush (); - } - - memory.Position = 0; - - return memory; - } - - static Stream Encrypt (PgpEncryptedDataGenerator encrypter, Stream content) - { - var memory = new MemoryBlockStream (); - - using (var armored = new ArmoredOutputStream (memory)) { - var buf = new byte[4096]; - - armored.SetHeader ("Version", null); - - using (var compressed = Compress (content, buf)) { - using (var encrypted = encrypter.Open (armored, compressed.Length)) { - int nread; - - while ((nread = compressed.Read (buf, 0, buf.Length)) > 0) - encrypted.Write (buf, 0, nread); - - encrypted.Flush (); - } - } - - armored.Flush (); - } - - memory.Position = 0; - - return memory; - } - - static SymmetricKeyAlgorithmTag GetSymmetricKeyAlgorithm (EncryptionAlgorithm algorithm) - { - switch (algorithm) { - case EncryptionAlgorithm.Aes128: return SymmetricKeyAlgorithmTag.Aes128; - case EncryptionAlgorithm.Aes192: return SymmetricKeyAlgorithmTag.Aes192; - case EncryptionAlgorithm.Aes256: return SymmetricKeyAlgorithmTag.Aes256; - case EncryptionAlgorithm.Camellia128: return SymmetricKeyAlgorithmTag.Camellia128; - case EncryptionAlgorithm.Camellia192: return SymmetricKeyAlgorithmTag.Camellia192; - case EncryptionAlgorithm.Camellia256: return SymmetricKeyAlgorithmTag.Camellia256; - case EncryptionAlgorithm.Cast5: return SymmetricKeyAlgorithmTag.Cast5; - case EncryptionAlgorithm.Des: return SymmetricKeyAlgorithmTag.Des; - case EncryptionAlgorithm.TripleDes: return SymmetricKeyAlgorithmTag.TripleDes; - case EncryptionAlgorithm.Idea: return SymmetricKeyAlgorithmTag.Idea; - case EncryptionAlgorithm.Blowfish: return SymmetricKeyAlgorithmTag.Blowfish; - case EncryptionAlgorithm.Twofish: return SymmetricKeyAlgorithmTag.Twofish; - default: throw new NotSupportedException (string.Format ("{0} is not supported.", algorithm)); - } - } - - /// - /// Encrypt the specified content for the specified recipients. - /// - /// - /// Encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// A public key could not be found for one or more of the . - /// - public override MimePart Encrypt (IEnumerable recipients, Stream content) - { - if (recipients == null) - throw new ArgumentNullException (nameof (recipients)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - // TODO: document the exceptions that can be thrown by BouncyCastle - return Encrypt (GetPublicKeys (recipients), content); - } - - /// - /// Encrypt the specified content for the specified recipients. - /// - /// - /// Encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The encryption algorithm. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// A public key could not be found for one or more of the . - /// - /// - /// The specified encryption algorithm is not supported. - /// - public MimePart Encrypt (EncryptionAlgorithm algorithm, IEnumerable recipients, Stream content) - { - if (recipients == null) - throw new ArgumentNullException (nameof (recipients)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - // TODO: document the exceptions that can be thrown by BouncyCastle - return Encrypt (algorithm, GetPublicKeys (recipients), content); - } - - /// - /// Encrypt the specified content for the specified recipients. - /// - /// - /// Encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The encryption algorithm. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// The specified encryption algorithm is not supported. - /// - public MimePart Encrypt (EncryptionAlgorithm algorithm, IEnumerable recipients, Stream content) - { - if (recipients == null) - throw new ArgumentNullException (nameof (recipients)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - var encrypter = new PgpEncryptedDataGenerator (GetSymmetricKeyAlgorithm (algorithm), true); - var unique = new HashSet (); - int count = 0; - - foreach (var recipient in recipients) { - if (!recipient.IsEncryptionKey) - throw new ArgumentException ("One or more of the recipient keys cannot be used for encrypting.", nameof (recipients)); - - if (unique.Add (recipient.KeyId)) { - encrypter.AddMethod (recipient); - count++; - } - } - - if (count == 0) - throw new ArgumentException ("No recipients specified.", nameof (recipients)); - - var encrypted = Encrypt (encrypter, content); - - return new MimePart ("application", "octet-stream") { - ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), - Content = new MimeContent (encrypted), - }; - } - - /// - /// Encrypt the specified content for the specified recipients. - /// - /// - /// Encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - public MimePart Encrypt (IEnumerable recipients, Stream content) - { - return Encrypt (defaultAlgorithm, recipients, content); - } - - /// - /// Cryptographically sign and encrypt the specified content for the specified recipients. - /// - /// - /// Cryptographically signs and encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The signer. - /// The digest algorithm to use for signing. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// -or- - /// is null. - /// - /// - /// is out of range. - /// - /// - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// The specified is not supported by this context. - /// - /// - /// The private key could not be found for . - /// - /// - /// A public key could not be found for one or more of the . - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - public MimePart SignAndEncrypt (MailboxAddress signer, DigestAlgorithm digestAlgo, IEnumerable recipients, Stream content) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - if (recipients == null) - throw new ArgumentNullException (nameof (recipients)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - var key = GetSigningKey (signer); - - return SignAndEncrypt (key, digestAlgo, GetPublicKeys (recipients), content); - } - - /// - /// Cryptographically sign and encrypt the specified content for the specified recipients. - /// - /// - /// Cryptographically signs and encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The signer. - /// The digest algorithm to use for signing. - /// The encryption algorithm. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// -or- - /// is null. - /// - /// - /// cannot be used for signing. - /// -or- - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// The specified encryption algorithm is not supported. - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - public MimePart SignAndEncrypt (MailboxAddress signer, DigestAlgorithm digestAlgo, EncryptionAlgorithm cipherAlgo, IEnumerable recipients, Stream content) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - if (recipients == null) - throw new ArgumentNullException (nameof (recipients)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - var key = GetSigningKey (signer); - - return SignAndEncrypt (key, digestAlgo, cipherAlgo, GetPublicKeys (recipients), content); - } - - /// - /// Cryptographically sign and encrypt the specified content for the specified recipients. - /// - /// - /// Cryptographically signs and encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The signer. - /// The digest algorithm to use for signing. - /// The encryption algorithm. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// -or- - /// is null. - /// - /// - /// cannot be used for signing. - /// -or- - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// The specified encryption algorithm is not supported. - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, EncryptionAlgorithm cipherAlgo, IEnumerable recipients, Stream content) - { - if (signer == null) - throw new ArgumentNullException (nameof (signer)); - - if (!signer.IsSigningKey) - throw new ArgumentException ("The specified secret key cannot be used for signing.", nameof (signer)); - - if (recipients == null) - throw new ArgumentNullException (nameof (recipients)); - - if (content == null) - throw new ArgumentNullException (nameof (content)); - - var encrypter = new PgpEncryptedDataGenerator (GetSymmetricKeyAlgorithm (cipherAlgo), true); - var hashAlgorithm = GetHashAlgorithm (digestAlgo); - var unique = new HashSet (); - var buf = new byte[4096]; - int nread, count = 0; - - foreach (var recipient in recipients) { - if (!recipient.IsEncryptionKey) - throw new ArgumentException ("One or more of the recipient keys cannot be used for encrypting.", nameof (recipients)); - - if (unique.Add (recipient.KeyId)) { - encrypter.AddMethod (recipient); - count++; - } - } - - if (count == 0) - throw new ArgumentException ("No recipients specified.", nameof (recipients)); - - var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); - - using (var compressed = new MemoryBlockStream ()) { - using (var signed = compresser.Open (compressed)) { - var signatureGenerator = new PgpSignatureGenerator (signer.PublicKey.Algorithm, hashAlgorithm); - signatureGenerator.InitSign (PgpSignature.CanonicalTextDocument, GetPrivateKey (signer)); - var subpacket = new PgpSignatureSubpacketGenerator (); - - foreach (string userId in signer.PublicKey.GetUserIds ()) { - subpacket.SetSignerUserId (false, userId); - break; - } - - signatureGenerator.SetHashedSubpackets (subpacket.Generate ()); - - var onepass = signatureGenerator.GenerateOnePassVersion (false); - onepass.Encode (signed); - - var literalGenerator = new PgpLiteralDataGenerator (); - using (var literal = literalGenerator.Open (signed, 't', "mime.txt", content.Length, DateTime.Now)) { - while ((nread = content.Read (buf, 0, buf.Length)) > 0) { - signatureGenerator.Update (buf, 0, nread); - literal.Write (buf, 0, nread); - } - - literal.Flush (); - } - - var signature = signatureGenerator.Generate (); - signature.Encode (signed); - - signed.Flush (); - } - - compressed.Position = 0; - - var memory = new MemoryBlockStream (); - - using (var armored = new ArmoredOutputStream (memory)) { - armored.SetHeader ("Version", null); - - using (var encrypted = encrypter.Open (armored, compressed.Length)) { - while ((nread = compressed.Read (buf, 0, buf.Length)) > 0) - encrypted.Write (buf, 0, nread); - - encrypted.Flush (); - } - - armored.Flush (); - } - - memory.Position = 0; - - return new MimePart ("application", "octet-stream") { - ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), - Content = new MimeContent (memory) - }; - } - } - - /// - /// Cryptographically sign and encrypt the specified content for the specified recipients. - /// - /// - /// Cryptographically signs and encrypts the specified content for the specified recipients. - /// - /// A new instance - /// containing the encrypted data. - /// The signer. - /// The digest algorithm to use for signing. - /// The recipients. - /// The content. - /// - /// is null. - /// -or- - /// is null. - /// -or- - /// is null. - /// - /// - /// cannot be used for signing. - /// -or- - /// One or more of the recipient keys cannot be used for encrypting. - /// -or- - /// No recipients were specified. - /// - /// - /// The user chose to cancel the password prompt. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, IEnumerable recipients, Stream content) - { - return SignAndEncrypt (signer, digestAlgo, defaultAlgorithm, recipients, content); - } - - async Task DecryptToAsync (Stream encryptedData, Stream decryptedData, bool doAsync, CancellationToken cancellationToken) - { - if (encryptedData == null) - throw new ArgumentNullException (nameof (encryptedData)); - - if (decryptedData == null) - throw new ArgumentNullException (nameof (decryptedData)); - - using (var armored = new ArmoredInputStream (encryptedData)) { - var factory = new PgpObjectFactory (armored); - var obj = factory.NextPgpObject (); - var list = obj as PgpEncryptedDataList; - - if (list == null) { - // probably a PgpMarker... - obj = factory.NextPgpObject (); - - list = obj as PgpEncryptedDataList; - - if (list == null) - throw new PgpException ("Unexpected OpenPGP packet."); - } - - PgpPublicKeyEncryptedData encrypted = null; - PrivateKeyNotFoundException pkex = null; - bool hasEncryptedPackets = false; - PgpSecretKey secret = null; - - foreach (PgpEncryptedData data in list.GetEncryptedDataObjects ()) { - if ((encrypted = data as PgpPublicKeyEncryptedData) == null) - continue; - - hasEncryptedPackets = true; - - try { - secret = GetSecretKey (encrypted.KeyId); - break; - } catch (PrivateKeyNotFoundException ex) { - pkex = ex; - } - } - - if (!hasEncryptedPackets) - throw new PgpException ("No encrypted packets found."); - - if (secret == null) - throw pkex; - - factory = new PgpObjectFactory (encrypted.GetDataStream (GetPrivateKey (secret))); - List onepassList = null; - DigitalSignatureCollection signatures; - PgpSignatureList signatureList = null; - PgpCompressedData compressed = null; - var position = decryptedData.Position; - long nwritten = 0; - - obj = factory.NextPgpObject (); - while (obj != null) { - if (obj is PgpCompressedData) { - if (compressed != null) - throw new PgpException ("Recursive compression packets are not supported."); - - compressed = (PgpCompressedData) obj; - factory = new PgpObjectFactory (compressed.GetDataStream ()); - } else if (obj is PgpOnePassSignatureList) { - if (nwritten == 0) { - var onepasses = (PgpOnePassSignatureList) obj; - - onepassList = new List (); - - for (int i = 0; i < onepasses.Count; i++) { - var onepass = onepasses[i]; - - var results = await GetPublicKeyRingAsync (onepass.KeyId, doAsync, cancellationToken).ConfigureAwait (false); - - if (results.KeyRing == null) { - // too messy, pretend we never found a one-pass signature list - onepassList = null; - break; - } - - onepass.InitVerify (results.Key); - - var signature = new OpenPgpDigitalSignature (results.KeyRing, results.Key, onepass) { - PublicKeyAlgorithm = GetPublicKeyAlgorithm (onepass.KeyAlgorithm), - DigestAlgorithm = GetDigestAlgorithm (onepass.HashAlgorithm), - }; - - onepassList.Add (signature); - } - } - } else if (obj is PgpSignatureList) { - signatureList = (PgpSignatureList) obj; - } else if (obj is PgpLiteralData) { - var literal = (PgpLiteralData) obj; - - using (var stream = literal.GetDataStream ()) { - var buffer = new byte[4096]; - int nread; - - while ((nread = stream.Read (buffer, 0, buffer.Length)) > 0) { - if (onepassList != null) { - // update our one-pass signatures... - for (int index = 0; index < nread; index++) { - byte c = buffer[index]; - - for (int i = 0; i < onepassList.Count; i++) { - var pgp = (OpenPgpDigitalSignature) onepassList[i]; - pgp.OnePassSignature.Update (c); - } - } - } - - if (doAsync) - await decryptedData.WriteAsync (buffer, 0, nread, cancellationToken).ConfigureAwait (false); - else - decryptedData.Write (buffer, 0, nread); - - nwritten += nread; - } - } - } - - obj = factory.NextPgpObject (); - } - - if (signatureList != null) { - if (onepassList != null && signatureList.Count == onepassList.Count) { - for (int i = 0; i < onepassList.Count; i++) { - var pgp = (OpenPgpDigitalSignature) onepassList[i]; - pgp.CreationDate = signatureList[i].CreationTime; - pgp.Signature = signatureList[i]; - } - - signatures = new DigitalSignatureCollection (onepassList); - } else { - decryptedData.Position = position; - signatures = await GetDigitalSignaturesAsync (signatureList, decryptedData, doAsync, cancellationToken).ConfigureAwait (false); - decryptedData.Position = decryptedData.Length; - } - } else { - signatures = null; - } - - return signatures; - } - } - - /// - /// Decrypt an encrypted stream and extract the digital signers if the content was also signed. - /// - /// - /// Decrypts an encrypted stream and extracts the digital signers if the content was also signed. - /// If any of the signatures were made with an unrecognized key and is enabled, - /// an attempt will be made to retrieve said key(s). The can be used to cancel - /// key retrieval. - /// - /// The list of digital signatures if the data was both signed and encrypted; otherwise, null. - /// The encrypted data. - /// The stream to write the decrypted data to. - /// The cancellation token. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// The private key could not be found to decrypt the stream. - /// - /// - /// The user chose to cancel the password prompt. - /// -or- - /// The operation was cancelled via the cancellation token. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - /// - /// An OpenPGP error occurred. - /// - public DigitalSignatureCollection DecryptTo (Stream encryptedData, Stream decryptedData, CancellationToken cancellationToken = default (CancellationToken)) - { - return DecryptToAsync (encryptedData, decryptedData, false, cancellationToken).GetAwaiter ().GetResult (); - } - - /// - /// Asynchronously decrypt an encrypted stream and extract the digital signers if the content was also signed. - /// - /// - /// Decrypts an encrypted stream and extracts the digital signers if the content was also signed. - /// If any of the signatures were made with an unrecognized key and is enabled, - /// an attempt will be made to retrieve said key(s). The can be used to cancel - /// key retrieval. - /// - /// The list of digital signatures if the data was both signed and encrypted; otherwise, null. - /// The encrypted data. - /// The stream to write the decrypted data to. - /// The cancellation token. - /// - /// is null. - /// -or- - /// is null. - /// - /// - /// The private key could not be found to decrypt the stream. - /// - /// - /// The user chose to cancel the password prompt. - /// -or- - /// The operation was cancelled via the cancellation token. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - /// - /// An OpenPGP error occurred. - /// - public Task DecryptToAsync (Stream encryptedData, Stream decryptedData, CancellationToken cancellationToken = default (CancellationToken)) - { - return DecryptToAsync (encryptedData, decryptedData, true, cancellationToken); - } - - /// - /// Decrypts the specified encryptedData and extracts the digital signers if the content was also signed. - /// - /// - /// Decrypts the specified encryptedData and extracts the digital signers if the content was also signed. - /// - /// The decrypted . - /// The encrypted data. - /// A list of digital signatures if the data was both signed and encrypted. - /// The cancellation token. - /// - /// is null. - /// - /// - /// The private key could not be found to decrypt the stream. - /// - /// - /// The user chose to cancel the password prompt. - /// -or- - /// The operation was cancelled via the cancellation token. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - /// - /// An OpenPGP error occurred. - /// - public MimeEntity Decrypt (Stream encryptedData, out DigitalSignatureCollection signatures, CancellationToken cancellationToken = default (CancellationToken)) - { - using (var decryptedData = new MemoryBlockStream ()) { - signatures = DecryptTo (encryptedData, decryptedData, cancellationToken); - decryptedData.Position = 0; - - return MimeEntity.Load (decryptedData, cancellationToken); - } - } - - /// - /// Decrypts the specified encryptedData. - /// - /// - /// Decrypts the specified encryptedData. - /// - /// The decrypted . - /// The encrypted data. - /// The cancellation token. - /// - /// is null. - /// - /// - /// The private key could not be found to decrypt the stream. - /// - /// - /// The user chose to cancel the password prompt. - /// -or- - /// The operation was cancelled via the cancellation token. - /// - /// - /// 3 bad attempts were made to unlock the secret key. - /// - /// - /// An OpenPGP error occurred. - /// - public override MimeEntity Decrypt (Stream encryptedData, CancellationToken cancellationToken = default (CancellationToken)) - { - using (var decryptedData = new MemoryBlockStream ()) { - DecryptTo (encryptedData, decryptedData, cancellationToken); - decryptedData.Position = 0; - - return MimeEntity.Load (decryptedData, cancellationToken); - } - } - - /// - /// Saves the public key-ring bundle. - /// - /// - /// Atomically saves the public key-ring bundle to the path specified by . - /// Called by if any public keys were successfully imported. - /// - /// - /// An error occured while saving the public key-ring bundle. - /// - protected void SavePublicKeyRingBundle () - { - var filename = Path.GetFileName (PublicKeyRingPath) + "~"; - var dirname = Path.GetDirectoryName (PublicKeyRingPath); - var tmp = Path.Combine (dirname, "." + filename); - var bak = Path.Combine (dirname, filename); + var filename = Path.GetFileName (PublicKeyRingPath) + "~"; + var dirname = Path.GetDirectoryName (PublicKeyRingPath); + var tmp = Path.Combine (dirname, "." + filename); + var bak = Path.Combine (dirname, filename); Directory.CreateDirectory (dirname); @@ -2426,7 +857,7 @@ public virtual void Import (PgpPublicKeyRing keyring) /// /// is null. /// - public virtual void Import (PgpPublicKeyRingBundle bundle) + public override void Import (PgpPublicKeyRingBundle bundle) { if (bundle == null) throw new ArgumentNullException (nameof (bundle)); @@ -2729,22 +1160,5 @@ public virtual void Delete (PgpSecretKeyRing keyring) SecretKeyRingBundle = PgpSecretKeyRingBundle.RemoveSecretKeyRing (SecretKeyRingBundle, keyring); SaveSecretKeyRingBundle (); } - - /// - /// Releases all resources used by the object. - /// - /// Call when you are finished using the . The - /// method leaves the in an unusable state. After - /// calling , you must release all references to the so - /// the garbage collector can reclaim the memory that the was occupying. - protected override void Dispose (bool disposing) - { - if (disposing && client != null) { - client.Dispose (); - client = null; - } - - base.Dispose (disposing); - } } } diff --git a/MimeKit/Cryptography/PgpContext.cs b/MimeKit/Cryptography/PgpContext.cs new file mode 100644 index 0000000000..a7edd7cd1e --- /dev/null +++ b/MimeKit/Cryptography/PgpContext.cs @@ -0,0 +1,1747 @@ +// +// OpenPgpContext.cs +// +// Author: Jeffrey Stedfast and Thomas Hansen +// +// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Net.Http; +using System.Threading; +using System.Diagnostics; +using System.Threading.Tasks; +using System.Collections.Generic; + +using Org.BouncyCastle.Bcpg; +using Org.BouncyCastle.Bcpg.OpenPgp; + +using MimeKit.IO; + +namespace MimeKit.Cryptography +{ + /// + /// An abstract OpenPGP cryptography context which can be used for PGP/MIME. This is a more + /// low level class than OpenPgpContext, since it allows you to persist your keys, any ways you + /// see fit, and is not dependent upon GnuPG in any ways. + /// + /// + /// Generally speaking, applications should not use a + /// directly, but rather via higher level APIs such as + /// and . + /// + public abstract partial class PgpContext : CryptographyContext + { + internal static readonly string[] ProtocolSubtypes = { "pgp-signature", "pgp-encrypted", "pgp-keys", "x-pgp-signature", "x-pgp-encrypted", "x-pgp-keys" }; + protected const string BeginPublicKeyBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; + protected const string EndPublicKeyBlock = "-----END PGP PUBLIC KEY BLOCK-----"; + + internal static readonly EncryptionAlgorithm[] DefaultEncryptionAlgorithmRank = { + EncryptionAlgorithm.Idea, + EncryptionAlgorithm.TripleDes, + EncryptionAlgorithm.Cast5, + EncryptionAlgorithm.Blowfish, + EncryptionAlgorithm.Aes128, + EncryptionAlgorithm.Aes192, + EncryptionAlgorithm.Aes256, + EncryptionAlgorithm.Twofish, + EncryptionAlgorithm.Camellia128, + EncryptionAlgorithm.Camellia192, + EncryptionAlgorithm.Camellia256 + }; + + internal static readonly DigestAlgorithm[] DefaultDigestAlgorithmRank = { + DigestAlgorithm.Sha1, + DigestAlgorithm.RipeMD160, + DigestAlgorithm.Sha256, + DigestAlgorithm.Sha384, + DigestAlgorithm.Sha512, + DigestAlgorithm.Sha224 + }; + + protected EncryptionAlgorithm defaultAlgorithm; + protected HttpClient client; + protected Uri keyServer; + + /// + /// Initialize a new instance of the class. + /// + /// + /// Subclasses choosing to use this constructor MUST set the , + /// , , and the + /// properties themselves. + /// + protected PgpContext () + { + EncryptionAlgorithmRank = DefaultEncryptionAlgorithmRank; + DigestAlgorithmRank = DefaultDigestAlgorithmRank; + + foreach (var algorithm in EncryptionAlgorithmRank) + Enable (algorithm); + + foreach (var algorithm in DigestAlgorithmRank) + Enable (algorithm); + + defaultAlgorithm = EncryptionAlgorithm.Cast5; + + client = new HttpClient (); + } + + /// + /// Imports the specified public key ring bundle. + /// + /// Bundle of keys to import. + public abstract void Import (PgpPublicKeyRingBundle bundle); + + /// + /// Gets the password for key. + /// + /// + /// Gets the password for key. + /// + /// The password for key. + /// The key. + /// + /// The user chose to cancel the password request. + /// + protected abstract string GetPasswordForKey (PgpSecretKey key); + + /// + /// Helper method to retrieve a public key, and its keyring, given a key's ID + /// + /// + /// + /// + /// + public abstract Task GetPublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken); + + /// + /// Get the secret key for a specified key identifier. + /// + /// + /// Gets the secret key for a specified key identifier. + /// + /// The key identifier for the desired secret key. + /// The secret key. + /// + /// The secret key specified by the could not be found. + /// + public abstract PgpSecretKey GetSecretKey (long keyId); + + /// + /// Returns public keys associated with enumerable of MailboxAddresses. + /// Notice, input can also be SecureMailboxAddress, at which point it might contain + /// a fingerprint, allowing you to do lookups according to fingerprints, instead of identity + /// of key. + /// + /// Address list to lookup key(s) for. + /// + public abstract IList GetPublicKeys (IEnumerable mailboxes); + + /// + /// Returns signing key for specified MailboxAddress. + /// Notice, input can also be SecureMailboxAddress, at which point it might contain + /// a fingerprint, allowing you to do lookups according to fingerprints, instead of identity + /// of key. + /// + /// Address to lookup key for. + /// + public abstract PgpSecretKey GetSigningKey (MailboxAddress mailbox); + + /// + /// Get or set the default encryption algorithm. + /// + /// + /// Gets or sets the default encryption algorithm. + /// + /// The encryption algorithm. + /// + /// The specified encryption algorithm is not supported. + /// + public EncryptionAlgorithm DefaultEncryptionAlgorithm { + get { return defaultAlgorithm; } + set { + GetSymmetricKeyAlgorithm (value); + defaultAlgorithm = value; + } + } + + internal protected bool IsValidKeyServer { + get { + if (keyServer == null) + return false; + + switch (keyServer.Scheme.ToLowerInvariant ()) { + case "https": case "http": case "hkp": return true; + default: return false; + } + } + } + + /// + /// Get or set the key server to use when automatically retrieving keys. + /// + /// + /// Gets or sets the key server to use when verifying keys that are + /// not already in the public keychain. + /// Only HTTP and HKP protocols are supported. + /// + /// The key server. + /// + /// is not an absolute URI. + /// + public Uri KeyServer { + get { return keyServer; } + set { + if (value != null && !value.IsAbsoluteUri) + throw new ArgumentException ("The key server URI must be absolute.", nameof (value)); + + keyServer = value; + } + } + + /// + /// Get or set whether unknown PGP keys should automtically be retrieved. + /// + /// + /// Gets or sets whether or not the should automatically + /// fetch keys as needed from the keyserver when verifying signatures. + /// Requires a valid to be set. + /// + /// true if unknown PGP keys should automatically be retrieved; otherwise, false. + public bool AutoKeyRetrieve { + get; set; + } + + /// + /// Get the signature protocol. + /// + /// + /// The signature protocol is used by + /// in order to determine what the protocol parameter of the Content-Type + /// header should be. + /// + /// The signature protocol. + public override string SignatureProtocol { + get { return "application/pgp-signature"; } + } + + /// + /// Get the encryption protocol. + /// + /// + /// The encryption protocol is used by + /// in order to determine what the protocol parameter of the Content-Type + /// header should be. + /// + /// The encryption protocol. + public override string EncryptionProtocol { + get { return "application/pgp-encrypted"; } + } + + /// + /// Get the key exchange protocol. + /// + /// + /// Gets the key exchange protocol. + /// + /// The key exchange protocol. + public override string KeyExchangeProtocol { + get { return "application/pgp-keys"; } + } + + /// + /// Check whether or not the specified protocol is supported. + /// + /// + /// Used in order to make sure that the protocol parameter value specified in either a multipart/signed + /// or multipart/encrypted part is supported by the supplied cryptography context. + /// + /// true if the protocol is supported; otherwise false + /// The protocol. + /// + /// is null. + /// + public override bool Supports (string protocol) + { + if (protocol == null) + throw new ArgumentNullException (nameof (protocol)); + + if (!protocol.StartsWith ("application/", StringComparison.OrdinalIgnoreCase)) + return false; + + int startIndex = "application/".Length; + int subtypeLength = protocol.Length - startIndex; + + for (int i = 0; i < ProtocolSubtypes.Length; i++) { + if (subtypeLength != ProtocolSubtypes[i].Length) + continue; + + if (string.Compare (protocol, startIndex, ProtocolSubtypes[i], 0, subtypeLength, StringComparison.OrdinalIgnoreCase) == 0) + return true; + } + + return false; + } + + /// + /// Get the string name of the digest algorithm for use with the micalg parameter of a multipart/signed part. + /// + /// + /// Maps the to the appropriate string identifier + /// as used by the micalg parameter value of a multipart/signed Content-Type + /// header. For example: + /// + /// AlgorithmName + /// pgp-md5 + /// pgp-sha1 + /// pgp-ripemd160 + /// pgp-md2 + /// pgp-tiger192 + /// pgp-haval-5-160 + /// pgp-sha256 + /// pgp-sha384 + /// pgp-sha512 + /// pgp-sha224 + /// + /// + /// The micalg value. + /// The digest algorithm. + /// + /// is out of range. + /// + public override string GetDigestAlgorithmName (DigestAlgorithm micalg) + { + switch (micalg) { + case DigestAlgorithm.MD5: return "pgp-md5"; + case DigestAlgorithm.Sha1: return "pgp-sha1"; + case DigestAlgorithm.RipeMD160: return "pgp-ripemd160"; + case DigestAlgorithm.MD2: return "pgp-md2"; + case DigestAlgorithm.Tiger192: return "pgp-tiger192"; + case DigestAlgorithm.Haval5160: return "pgp-haval-5-160"; + case DigestAlgorithm.Sha256: return "pgp-sha256"; + case DigestAlgorithm.Sha384: return "pgp-sha384"; + case DigestAlgorithm.Sha512: return "pgp-sha512"; + case DigestAlgorithm.Sha224: return "pgp-sha224"; + case DigestAlgorithm.MD4: return "pgp-md4"; + default: throw new ArgumentOutOfRangeException (nameof (micalg)); + } + } + + /// + /// Get the digest algorithm from the micalg parameter value in a multipart/signed part. + /// + /// + /// Maps the micalg parameter value string back to the appropriate . + /// + /// The digest algorithm. + /// The micalg parameter value. + /// + /// is null. + /// + public override DigestAlgorithm GetDigestAlgorithm (string micalg) + { + if (micalg == null) + throw new ArgumentNullException (nameof (micalg)); + + switch (micalg.ToLowerInvariant ()) { + case "pgp-md5": return DigestAlgorithm.MD5; + case "pgp-sha1": return DigestAlgorithm.Sha1; + case "pgp-ripemd160": return DigestAlgorithm.RipeMD160; + case "pgp-md2": return DigestAlgorithm.MD2; + case "pgp-tiger192": return DigestAlgorithm.Tiger192; + case "pgp-haval-5-160": return DigestAlgorithm.Haval5160; + case "pgp-sha256": return DigestAlgorithm.Sha256; + case "pgp-sha384": return DigestAlgorithm.Sha384; + case "pgp-sha512": return DigestAlgorithm.Sha512; + case "pgp-sha224": return DigestAlgorithm.Sha224; + case "pgp-md4": return DigestAlgorithm.MD4; + default: return DigestAlgorithm.None; + } + } + + /// + /// Helper method to turn a bunch of byte data, into a string. Useful for + /// among other things generating fingerprints. + /// + /// Byte array that should be turned into string representation. + /// Hexa encoded results from specified input data. + public static string HexEncode (byte[] data) + { + var fingerprint = new StringBuilder (); + + for (int i = 0; i < data.Length; i++) + fingerprint.Append (data[i].ToString ("x2")); + + return fingerprint.ToString (); + } + + /// + /// Returns true if the specified public key matches the specified MailboxAddress. + /// Might do a fingerprint lookup, if given address is of type SecureMailboxAddress. + /// + /// Key to check + /// Address to check + /// True if match. + public static bool PgpPublicKeyMatches (PgpPublicKey key, MailboxAddress mailbox) + { + var secure = mailbox as SecureMailboxAddress; + + if (secure != null && !string.IsNullOrEmpty (secure.Fingerprint)) { + if (secure.Fingerprint.Length > 16) { + var fingerprint = HexEncode (key.GetFingerprint ()); + + return secure.Fingerprint.Equals (fingerprint, StringComparison.OrdinalIgnoreCase); + } + + var id = ((int) key.KeyId).ToString ("X2"); + + return secure.Fingerprint.EndsWith (id, StringComparison.OrdinalIgnoreCase); + } + + foreach (string userId in key.GetUserIds ()) { + MailboxAddress email; + + if (!MailboxAddress.TryParse (userId, out email)) + continue; + + if (mailbox.Address.Equals (email.Address, StringComparison.OrdinalIgnoreCase)) + return true; + } + + return false; + } + + /// + /// Returns true if the specified secret key is matching the specified MailboxAddres. + /// Might do a fingerprint lookup, if given address is of type SecureMailboxAddress. + /// + /// Key to check + /// Address to check + /// True if match. + public static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) + { + if (mailbox is SecureMailboxAddress secure && !string.IsNullOrEmpty (secure.Fingerprint)) { + if (secure.Fingerprint.Length > 16) { + var fingerprint = HexEncode (key.PublicKey.GetFingerprint ()); + + return secure.Fingerprint.Equals (fingerprint, StringComparison.OrdinalIgnoreCase); + } + + var id = ((int) key.KeyId).ToString ("X2"); + + return secure.Fingerprint.EndsWith (id, StringComparison.OrdinalIgnoreCase); + } + + foreach (string userId in key.UserIds) { + if (!MailboxAddress.TryParse (userId, out var email)) + continue; + + if (mailbox.Address.Equals (email.Address, StringComparison.OrdinalIgnoreCase)) + return true; + } + + return false; + } + + /// + /// Returns true if the specified public key is expired. + /// + /// Key to check. + /// True if key is expired. + public static bool IsExpired (PgpPublicKey pubkey) + { + long seconds = pubkey.GetValidSeconds (); + + if (seconds != 0) { + var expires = pubkey.CreationTime.AddSeconds ((double) seconds); + if (expires <= DateTime.Now) + return true; + } + + return false; + } + + /// + /// Retrieves the public keyring, using the preferred key server, automatically importing it afterwards. + /// + /// ID of key to retrieve + /// whether or not this invocation should be handled as an async invocation. + /// Cancellation token for operation. + /// + public async Task RetrievePublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) + { + var scheme = keyServer.Scheme.ToLowerInvariant (); + var uri = new UriBuilder (); + + uri.Scheme = scheme == "hkp" ? "http" : scheme; + uri.Host = keyServer.Host; + + if (keyServer.IsDefaultPort) { + if (scheme == "hkp") + uri.Port = 11371; + } else { + uri.Port = keyServer.Port; + } + + uri.Path = "/pks/lookup"; + uri.Query = string.Format ("op=get&search=0x{0:X}", keyId); + + using (var stream = new MemoryBlockStream ()) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (new OpenPgpBlockFilter (BeginPublicKeyBlock, EndPublicKeyBlock)); + + if (doAsync) { + using (var response = await client.GetAsync (uri.ToString (), cancellationToken).ConfigureAwait (false)) + await response.Content.CopyToAsync (filtered).ConfigureAwait (false); + } else { +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + var request = (HttpWebRequest) WebRequest.Create (uri.ToString ()); + using (var response = request.GetResponse ()) { + var content = response.GetResponseStream (); + content.CopyTo (filtered, 4096); + } +#else + using (var response = client.GetAsync (uri.ToString (), cancellationToken).GetAwaiter ().GetResult ()) + response.Content.CopyToAsync (filtered).GetAwaiter ().GetResult (); +#endif + } + + filtered.Flush (); + } + + stream.Position = 0; + + using (var armored = new ArmoredInputStream (stream, true)) { + var bundle = new PgpPublicKeyRingBundle (armored); + + Import (bundle); + + return bundle.GetPublicKeyRing (keyId); + } + } + } + + /// + /// Gets the private key from the specified secret key. + /// + /// + /// Gets the private key from the specified secret key. + /// + /// The private key. + /// The secret key. + /// + /// is null. + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + protected PgpPrivateKey GetPrivateKey (PgpSecretKey key) + { + int attempts = 0; + string password; + + if (key == null) + throw new ArgumentNullException (nameof (key)); + + do { + if ((password = GetPasswordForKey (key)) == null) + throw new OperationCanceledException (); + + try { + var privateKey = key.ExtractPrivateKey (password.ToCharArray ()); + + // Note: the private key will be null if the private key is empty. + if (privateKey == null) + break; + + return privateKey; + } catch (Exception ex) { +#if DEBUG + Debug.WriteLine (string.Format ("Failed to extract secret key: {0}", ex)); +#endif + } + + attempts++; + } while (attempts < 3); + + throw new UnauthorizedAccessException (); + } + + /// + /// Gets the equivalent for the + /// specified . + /// + /// + /// Maps a to the equivalent . + /// + /// The hash algorithm. + /// The digest algorithm. + /// + /// is out of range. + /// + /// + /// is not a supported digest algorithm. + /// + public static HashAlgorithmTag GetHashAlgorithm (DigestAlgorithm digestAlgo) + { + switch (digestAlgo) { + case DigestAlgorithm.MD5: return HashAlgorithmTag.MD5; + case DigestAlgorithm.Sha1: return HashAlgorithmTag.Sha1; + case DigestAlgorithm.RipeMD160: return HashAlgorithmTag.RipeMD160; + case DigestAlgorithm.DoubleSha: throw new NotSupportedException ("The Double SHA digest algorithm is not supported."); + case DigestAlgorithm.MD2: return HashAlgorithmTag.MD2; + case DigestAlgorithm.Tiger192: throw new NotSupportedException ("The Tiger-192 digest algorithm is not supported."); + case DigestAlgorithm.Haval5160: throw new NotSupportedException ("The HAVAL 5 160 digest algorithm is not supported."); + case DigestAlgorithm.Sha256: return HashAlgorithmTag.Sha256; + case DigestAlgorithm.Sha384: return HashAlgorithmTag.Sha384; + case DigestAlgorithm.Sha512: return HashAlgorithmTag.Sha512; + case DigestAlgorithm.Sha224: return HashAlgorithmTag.Sha224; + case DigestAlgorithm.MD4: throw new NotSupportedException ("The MD4 digest algorithm is not supported."); + default: throw new ArgumentOutOfRangeException (nameof (digestAlgo)); + } + } + + /// + /// Cryptographically signs the content. + /// + /// + /// Cryptographically signs the content using the specified signer and digest algorithm. + /// + /// A new instance + /// containing the detached signature data. + /// The signer. + /// The digest algorithm to use for signing. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// is out of range. + /// + /// + /// The specified is not supported by this context. + /// + /// + /// A signing key could not be found for . + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + public override MimePart Sign (MailboxAddress signer, DigestAlgorithm digestAlgo, Stream content) + { + if (signer == null) + throw new ArgumentNullException (nameof (signer)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + var key = GetSigningKey (signer); + + return Sign (key, digestAlgo, content); + } + + /// + /// Cryptographically signs the content. + /// + /// + /// Cryptographically signs the content using the specified signer and digest algorithm. + /// + /// A new instance + /// containing the detached signature data. + /// The signer. + /// The digest algorithm to use for signing. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// cannot be used for signing. + /// + /// + /// The was out of range. + /// + /// + /// The is not supported. + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + public ApplicationPgpSignature Sign (PgpSecretKey signer, DigestAlgorithm digestAlgo, Stream content) + { + if (signer == null) + throw new ArgumentNullException (nameof (signer)); + + if (!signer.IsSigningKey) + throw new ArgumentException ("The specified secret key cannot be used for signing.", nameof (signer)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + var hashAlgorithm = GetHashAlgorithm (digestAlgo); + var memory = new MemoryBlockStream (); + + using (var armored = new ArmoredOutputStream (memory)) { + armored.SetHeader ("Version", null); + + var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); + using (var compressed = compresser.Open (armored)) { + var signatureGenerator = new PgpSignatureGenerator (signer.PublicKey.Algorithm, hashAlgorithm); + var buf = new byte[4096]; + int nread; + + signatureGenerator.InitSign (PgpSignature.CanonicalTextDocument, GetPrivateKey (signer)); + + while ((nread = content.Read (buf, 0, buf.Length)) > 0) + signatureGenerator.Update (buf, 0, nread); + + var signature = signatureGenerator.Generate (); + + signature.Encode (compressed); + compressed.Flush (); + } + + armored.Flush (); + } + + memory.Position = 0; + + return new ApplicationPgpSignature (memory); + } + + /// + /// Gets the equivalent for the specified + /// . + /// + /// + /// Gets the equivalent for the specified + /// . + /// + /// The digest algorithm. + /// The hash algorithm. + /// + /// is out of range. + /// + /// + /// does not have an equivalent value. + /// + public static DigestAlgorithm GetDigestAlgorithm (HashAlgorithmTag hashAlgorithm) + { + switch (hashAlgorithm) { + case HashAlgorithmTag.MD5: return DigestAlgorithm.MD5; + case HashAlgorithmTag.Sha1: return DigestAlgorithm.Sha1; + case HashAlgorithmTag.RipeMD160: return DigestAlgorithm.RipeMD160; + case HashAlgorithmTag.DoubleSha: return DigestAlgorithm.DoubleSha; + case HashAlgorithmTag.MD2: return DigestAlgorithm.MD2; + case HashAlgorithmTag.Tiger192: return DigestAlgorithm.Tiger192; + case HashAlgorithmTag.Haval5pass160: return DigestAlgorithm.Haval5160; + case HashAlgorithmTag.Sha256: return DigestAlgorithm.Sha256; + case HashAlgorithmTag.Sha384: return DigestAlgorithm.Sha384; + case HashAlgorithmTag.Sha512: return DigestAlgorithm.Sha512; + case HashAlgorithmTag.Sha224: return DigestAlgorithm.Sha224; + default: throw new ArgumentOutOfRangeException (nameof (hashAlgorithm)); + } + } + + /// + /// Gets the equivalent for the specified + /// . + /// + /// + /// Gets the equivalent for the specified + /// . + /// + /// The public-key algorithm. + /// The public-key algorithm. + /// + /// is out of range. + /// + /// + /// does not have an equivalent value. + /// + public static PublicKeyAlgorithm GetPublicKeyAlgorithm (PublicKeyAlgorithmTag algorithm) + { + switch (algorithm) { + case PublicKeyAlgorithmTag.RsaGeneral: return PublicKeyAlgorithm.RsaGeneral; + case PublicKeyAlgorithmTag.RsaEncrypt: return PublicKeyAlgorithm.RsaEncrypt; + case PublicKeyAlgorithmTag.RsaSign: return PublicKeyAlgorithm.RsaSign; + case PublicKeyAlgorithmTag.ElGamalGeneral: return PublicKeyAlgorithm.ElGamalGeneral; + case PublicKeyAlgorithmTag.ElGamalEncrypt: return PublicKeyAlgorithm.ElGamalEncrypt; + case PublicKeyAlgorithmTag.Dsa: return PublicKeyAlgorithm.Dsa; + case PublicKeyAlgorithmTag.ECDH: return PublicKeyAlgorithm.EllipticCurve; + case PublicKeyAlgorithmTag.ECDsa: return PublicKeyAlgorithm.EllipticCurveDsa; + case PublicKeyAlgorithmTag.DiffieHellman: return PublicKeyAlgorithm.DiffieHellman; + default: throw new ArgumentOutOfRangeException (nameof (algorithm)); + } + } + + async Task GetDigitalSignaturesAsync (PgpSignatureList signatureList, Stream content, bool doAsync, CancellationToken cancellationToken) + { + var signatures = new List (); + var buf = new byte[4096]; + int nread; + + for (int i = 0; i < signatureList.Count; i++) { + long keyId = signatureList[i].KeyId; + KeyRetrievalResults results; + + if (doAsync) + results = await GetPublicKeyRingAsync (keyId, doAsync, cancellationToken).ConfigureAwait (false); + else + results = GetPublicKeyRingAsync (keyId, doAsync, cancellationToken).GetAwaiter ().GetResult (); + + var signature = new OpenPgpDigitalSignature (results.KeyRing, results.Key, signatureList[i]) { + PublicKeyAlgorithm = GetPublicKeyAlgorithm (signatureList[i].KeyAlgorithm), + DigestAlgorithm = GetDigestAlgorithm (signatureList[i].HashAlgorithm), + CreationDate = signatureList[i].CreationTime, + }; + + if (results.Key != null) + signatureList[i].InitVerify (results.Key); + + signatures.Add (signature); + } + + while ((nread = content.Read (buf, 0, buf.Length)) > 0) { + for (int i = 0; i < signatures.Count; i++) { + if (signatures[i].SignerCertificate != null) { + var pgp = (OpenPgpDigitalSignature) signatures[i]; + pgp.Signature.Update (buf, 0, nread); + } + } + } + + return new DigitalSignatureCollection (signatures); + } + + Task VerifyAsync (Stream content, Stream signatureData, bool doAsync, CancellationToken cancellationToken) + { + if (content == null) + throw new ArgumentNullException (nameof (content)); + + if (signatureData == null) + throw new ArgumentNullException (nameof (signatureData)); + + using (var armored = new ArmoredInputStream (signatureData)) { + var factory = new PgpObjectFactory (armored); + var data = factory.NextPgpObject (); + PgpSignatureList signatureList; + + var compressed = data as PgpCompressedData; + if (compressed != null) { + factory = new PgpObjectFactory (compressed.GetDataStream ()); + data = factory.NextPgpObject (); + } + + if (data == null) + throw new FormatException ("Invalid PGP format."); + + signatureList = (PgpSignatureList) data; + + return GetDigitalSignaturesAsync (signatureList, content, doAsync, cancellationToken); + } + } + + /// + /// Verify the specified content using the detached signatureData. + /// + /// + /// Verifies the specified content using the detached signatureData. + /// If any of the signatures were made with an unrecognized key and is enabled, + /// an attempt will be made to retrieve said key(s). The can be used to cancel + /// key retrieval. + /// + /// A list of digital signatures. + /// The content. + /// The signature data. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain valid PGP signature data. + /// + public override DigitalSignatureCollection Verify (Stream content, Stream signatureData, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (content, signatureData, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously verify the specified content using the detached signatureData. + /// + /// + /// Verifies the specified content using the detached signatureData. + /// If any of the signatures were made with an unrecognized key and is enabled, + /// an attempt will be made to retrieve said key(s). The can be used to cancel + /// key retrieval. + /// + /// A list of digital signatures. + /// The content. + /// The signature data. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// does not contain valid PGP signature data. + /// + public override Task VerifyAsync (Stream content, Stream signatureData, CancellationToken cancellationToken = default (CancellationToken)) + { + return VerifyAsync (content, signatureData, true, cancellationToken); + } + + static Stream Compress (Stream content, byte[] buf) + { + var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); + var memory = new MemoryBlockStream (); + + using (var compressed = compresser.Open (memory)) { + var literalGenerator = new PgpLiteralDataGenerator (); + + using (var literal = literalGenerator.Open (compressed, 't', "mime.txt", content.Length, DateTime.Now)) { + int nread; + + while ((nread = content.Read (buf, 0, buf.Length)) > 0) + literal.Write (buf, 0, nread); + + literal.Flush (); + } + + compressed.Flush (); + } + + memory.Position = 0; + + return memory; + } + + static Stream Encrypt (PgpEncryptedDataGenerator encrypter, Stream content) + { + var memory = new MemoryBlockStream (); + + using (var armored = new ArmoredOutputStream (memory)) { + var buf = new byte[4096]; + + armored.SetHeader ("Version", null); + + using (var compressed = Compress (content, buf)) { + using (var encrypted = encrypter.Open (armored, compressed.Length)) { + int nread; + + while ((nread = compressed.Read (buf, 0, buf.Length)) > 0) + encrypted.Write (buf, 0, nread); + + encrypted.Flush (); + } + } + + armored.Flush (); + } + + memory.Position = 0; + + return memory; + } + + internal static SymmetricKeyAlgorithmTag GetSymmetricKeyAlgorithm (EncryptionAlgorithm algorithm) + { + switch (algorithm) { + case EncryptionAlgorithm.Aes128: return SymmetricKeyAlgorithmTag.Aes128; + case EncryptionAlgorithm.Aes192: return SymmetricKeyAlgorithmTag.Aes192; + case EncryptionAlgorithm.Aes256: return SymmetricKeyAlgorithmTag.Aes256; + case EncryptionAlgorithm.Camellia128: return SymmetricKeyAlgorithmTag.Camellia128; + case EncryptionAlgorithm.Camellia192: return SymmetricKeyAlgorithmTag.Camellia192; + case EncryptionAlgorithm.Camellia256: return SymmetricKeyAlgorithmTag.Camellia256; + case EncryptionAlgorithm.Cast5: return SymmetricKeyAlgorithmTag.Cast5; + case EncryptionAlgorithm.Des: return SymmetricKeyAlgorithmTag.Des; + case EncryptionAlgorithm.TripleDes: return SymmetricKeyAlgorithmTag.TripleDes; + case EncryptionAlgorithm.Idea: return SymmetricKeyAlgorithmTag.Idea; + case EncryptionAlgorithm.Blowfish: return SymmetricKeyAlgorithmTag.Blowfish; + case EncryptionAlgorithm.Twofish: return SymmetricKeyAlgorithmTag.Twofish; + default: throw new NotSupportedException (string.Format ("{0} is not supported.", algorithm)); + } + } + + /// + /// Encrypt the specified content for the specified recipients. + /// + /// + /// Encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// A public key could not be found for one or more of the . + /// + public override MimePart Encrypt (IEnumerable recipients, Stream content) + { + if (recipients == null) + throw new ArgumentNullException (nameof (recipients)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + // TODO: document the exceptions that can be thrown by BouncyCastle + return Encrypt (GetPublicKeys (recipients), content); + } + + /// + /// Encrypt the specified content for the specified recipients. + /// + /// + /// Encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The encryption algorithm. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// A public key could not be found for one or more of the . + /// + /// + /// The specified encryption algorithm is not supported. + /// + public MimePart Encrypt (EncryptionAlgorithm algorithm, IEnumerable recipients, Stream content) + { + if (recipients == null) + throw new ArgumentNullException (nameof (recipients)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + // TODO: document the exceptions that can be thrown by BouncyCastle + return Encrypt (algorithm, GetPublicKeys (recipients), content); + } + + /// + /// Encrypt the specified content for the specified recipients. + /// + /// + /// Encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The encryption algorithm. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// The specified encryption algorithm is not supported. + /// + public MimePart Encrypt (EncryptionAlgorithm algorithm, IEnumerable recipients, Stream content) + { + if (recipients == null) + throw new ArgumentNullException (nameof (recipients)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + var encrypter = new PgpEncryptedDataGenerator (GetSymmetricKeyAlgorithm (algorithm), true); + var unique = new HashSet (); + int count = 0; + + foreach (var recipient in recipients) { + if (!recipient.IsEncryptionKey) + throw new ArgumentException ("One or more of the recipient keys cannot be used for encrypting.", nameof (recipients)); + + if (unique.Add (recipient.KeyId)) { + encrypter.AddMethod (recipient); + count++; + } + } + + if (count == 0) + throw new ArgumentException ("No recipients specified.", nameof (recipients)); + + var encrypted = Encrypt (encrypter, content); + + return new MimePart ("application", "octet-stream") { + ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), + Content = new MimeContent (encrypted), + }; + } + + /// + /// Encrypt the specified content for the specified recipients. + /// + /// + /// Encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + public MimePart Encrypt (IEnumerable recipients, Stream content) + { + return Encrypt (defaultAlgorithm, recipients, content); + } + + /// + /// Cryptographically sign and encrypt the specified content for the specified recipients. + /// + /// + /// Cryptographically signs and encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The signer. + /// The digest algorithm to use for signing. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// is out of range. + /// + /// + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// The specified is not supported by this context. + /// + /// + /// The private key could not be found for . + /// + /// + /// A public key could not be found for one or more of the . + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + public MimePart SignAndEncrypt (MailboxAddress signer, DigestAlgorithm digestAlgo, IEnumerable recipients, Stream content) + { + if (signer == null) + throw new ArgumentNullException (nameof (signer)); + + if (recipients == null) + throw new ArgumentNullException (nameof (recipients)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + var key = GetSigningKey (signer); + + return SignAndEncrypt (key, digestAlgo, GetPublicKeys (recipients), content); + } + + /// + /// Cryptographically sign and encrypt the specified content for the specified recipients. + /// + /// + /// Cryptographically signs and encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The signer. + /// The digest algorithm to use for signing. + /// The encryption algorithm. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// cannot be used for signing. + /// -or- + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// The specified encryption algorithm is not supported. + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + public MimePart SignAndEncrypt (MailboxAddress signer, DigestAlgorithm digestAlgo, EncryptionAlgorithm cipherAlgo, IEnumerable recipients, Stream content) + { + if (signer == null) + throw new ArgumentNullException (nameof (signer)); + + if (recipients == null) + throw new ArgumentNullException (nameof (recipients)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + var key = GetSigningKey (signer); + + return SignAndEncrypt (key, digestAlgo, cipherAlgo, GetPublicKeys (recipients), content); + } + + /// + /// Cryptographically sign and encrypt the specified content for the specified recipients. + /// + /// + /// Cryptographically signs and encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The signer. + /// The digest algorithm to use for signing. + /// The encryption algorithm. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// cannot be used for signing. + /// -or- + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// The specified encryption algorithm is not supported. + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, EncryptionAlgorithm cipherAlgo, IEnumerable recipients, Stream content) + { + if (signer == null) + throw new ArgumentNullException (nameof (signer)); + + if (!signer.IsSigningKey) + throw new ArgumentException ("The specified secret key cannot be used for signing.", nameof (signer)); + + if (recipients == null) + throw new ArgumentNullException (nameof (recipients)); + + if (content == null) + throw new ArgumentNullException (nameof (content)); + + var encrypter = new PgpEncryptedDataGenerator (GetSymmetricKeyAlgorithm (cipherAlgo), true); + var hashAlgorithm = GetHashAlgorithm (digestAlgo); + var unique = new HashSet (); + var buf = new byte[4096]; + int nread, count = 0; + + foreach (var recipient in recipients) { + if (!recipient.IsEncryptionKey) + throw new ArgumentException ("One or more of the recipient keys cannot be used for encrypting.", nameof (recipients)); + + if (unique.Add (recipient.KeyId)) { + encrypter.AddMethod (recipient); + count++; + } + } + + if (count == 0) + throw new ArgumentException ("No recipients specified.", nameof (recipients)); + + var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); + + using (var compressed = new MemoryBlockStream ()) { + using (var signed = compresser.Open (compressed)) { + var signatureGenerator = new PgpSignatureGenerator (signer.PublicKey.Algorithm, hashAlgorithm); + signatureGenerator.InitSign (PgpSignature.CanonicalTextDocument, GetPrivateKey (signer)); + var subpacket = new PgpSignatureSubpacketGenerator (); + + foreach (string userId in signer.PublicKey.GetUserIds ()) { + subpacket.SetSignerUserId (false, userId); + break; + } + + signatureGenerator.SetHashedSubpackets (subpacket.Generate ()); + + var onepass = signatureGenerator.GenerateOnePassVersion (false); + onepass.Encode (signed); + + var literalGenerator = new PgpLiteralDataGenerator (); + using (var literal = literalGenerator.Open (signed, 't', "mime.txt", content.Length, DateTime.Now)) { + while ((nread = content.Read (buf, 0, buf.Length)) > 0) { + signatureGenerator.Update (buf, 0, nread); + literal.Write (buf, 0, nread); + } + + literal.Flush (); + } + + var signature = signatureGenerator.Generate (); + signature.Encode (signed); + + signed.Flush (); + } + + compressed.Position = 0; + + var memory = new MemoryBlockStream (); + + using (var armored = new ArmoredOutputStream (memory)) { + armored.SetHeader ("Version", null); + + using (var encrypted = encrypter.Open (armored, compressed.Length)) { + while ((nread = compressed.Read (buf, 0, buf.Length)) > 0) + encrypted.Write (buf, 0, nread); + + encrypted.Flush (); + } + + armored.Flush (); + } + + memory.Position = 0; + + return new MimePart ("application", "octet-stream") { + ContentDisposition = new ContentDisposition (ContentDisposition.Attachment), + Content = new MimeContent (memory) + }; + } + } + + /// + /// Cryptographically sign and encrypt the specified content for the specified recipients. + /// + /// + /// Cryptographically signs and encrypts the specified content for the specified recipients. + /// + /// A new instance + /// containing the encrypted data. + /// The signer. + /// The digest algorithm to use for signing. + /// The recipients. + /// The content. + /// + /// is null. + /// -or- + /// is null. + /// -or- + /// is null. + /// + /// + /// cannot be used for signing. + /// -or- + /// One or more of the recipient keys cannot be used for encrypting. + /// -or- + /// No recipients were specified. + /// + /// + /// The user chose to cancel the password prompt. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, IEnumerable recipients, Stream content) + { + return SignAndEncrypt (signer, digestAlgo, defaultAlgorithm, recipients, content); + } + + async Task DecryptToAsync (Stream encryptedData, Stream decryptedData, bool doAsync, CancellationToken cancellationToken) + { + if (encryptedData == null) + throw new ArgumentNullException (nameof (encryptedData)); + + if (decryptedData == null) + throw new ArgumentNullException (nameof (decryptedData)); + + using (var armored = new ArmoredInputStream (encryptedData)) { + var factory = new PgpObjectFactory (armored); + var obj = factory.NextPgpObject (); + var list = obj as PgpEncryptedDataList; + + if (list == null) { + // probably a PgpMarker... + obj = factory.NextPgpObject (); + + list = obj as PgpEncryptedDataList; + + if (list == null) + throw new PgpException ("Unexpected OpenPGP packet."); + } + + PgpPublicKeyEncryptedData encrypted = null; + PrivateKeyNotFoundException pkex = null; + bool hasEncryptedPackets = false; + PgpSecretKey secret = null; + + foreach (PgpEncryptedData data in list.GetEncryptedDataObjects ()) { + if ((encrypted = data as PgpPublicKeyEncryptedData) == null) + continue; + + hasEncryptedPackets = true; + + try { + secret = GetSecretKey (encrypted.KeyId); + break; + } catch (PrivateKeyNotFoundException ex) { + pkex = ex; + } + } + + if (!hasEncryptedPackets) + throw new PgpException ("No encrypted packets found."); + + if (secret == null) + throw pkex; + + factory = new PgpObjectFactory (encrypted.GetDataStream (GetPrivateKey (secret))); + List onepassList = null; + DigitalSignatureCollection signatures; + PgpSignatureList signatureList = null; + PgpCompressedData compressed = null; + var position = decryptedData.Position; + long nwritten = 0; + + obj = factory.NextPgpObject (); + while (obj != null) { + if (obj is PgpCompressedData) { + if (compressed != null) + throw new PgpException ("Recursive compression packets are not supported."); + + compressed = (PgpCompressedData) obj; + factory = new PgpObjectFactory (compressed.GetDataStream ()); + } else if (obj is PgpOnePassSignatureList) { + if (nwritten == 0) { + var onepasses = (PgpOnePassSignatureList) obj; + + onepassList = new List (); + + for (int i = 0; i < onepasses.Count; i++) { + var onepass = onepasses[i]; + + var results = await GetPublicKeyRingAsync (onepass.KeyId, doAsync, cancellationToken).ConfigureAwait (false); + + if (results.KeyRing == null) { + // too messy, pretend we never found a one-pass signature list + onepassList = null; + break; + } + + onepass.InitVerify (results.Key); + + var signature = new OpenPgpDigitalSignature (results.KeyRing, results.Key, onepass) { + PublicKeyAlgorithm = GetPublicKeyAlgorithm (onepass.KeyAlgorithm), + DigestAlgorithm = GetDigestAlgorithm (onepass.HashAlgorithm), + }; + + onepassList.Add (signature); + } + } + } else if (obj is PgpSignatureList) { + signatureList = (PgpSignatureList) obj; + } else if (obj is PgpLiteralData) { + var literal = (PgpLiteralData) obj; + + using (var stream = literal.GetDataStream ()) { + var buffer = new byte[4096]; + int nread; + + while ((nread = stream.Read (buffer, 0, buffer.Length)) > 0) { + if (onepassList != null) { + // update our one-pass signatures... + for (int index = 0; index < nread; index++) { + byte c = buffer[index]; + + for (int i = 0; i < onepassList.Count; i++) { + var pgp = (OpenPgpDigitalSignature) onepassList[i]; + pgp.OnePassSignature.Update (c); + } + } + } + + if (doAsync) + await decryptedData.WriteAsync (buffer, 0, nread, cancellationToken).ConfigureAwait (false); + else + decryptedData.Write (buffer, 0, nread); + + nwritten += nread; + } + } + } + + obj = factory.NextPgpObject (); + } + + if (signatureList != null) { + if (onepassList != null && signatureList.Count == onepassList.Count) { + for (int i = 0; i < onepassList.Count; i++) { + var pgp = (OpenPgpDigitalSignature) onepassList[i]; + pgp.CreationDate = signatureList[i].CreationTime; + pgp.Signature = signatureList[i]; + } + + signatures = new DigitalSignatureCollection (onepassList); + } else { + decryptedData.Position = position; + signatures = await GetDigitalSignaturesAsync (signatureList, decryptedData, doAsync, cancellationToken).ConfigureAwait (false); + decryptedData.Position = decryptedData.Length; + } + } else { + signatures = null; + } + + return signatures; + } + } + + /// + /// Decrypt an encrypted stream and extract the digital signers if the content was also signed. + /// + /// + /// Decrypts an encrypted stream and extracts the digital signers if the content was also signed. + /// If any of the signatures were made with an unrecognized key and is enabled, + /// an attempt will be made to retrieve said key(s). The can be used to cancel + /// key retrieval. + /// + /// The list of digital signatures if the data was both signed and encrypted; otherwise, null. + /// The encrypted data. + /// The stream to write the decrypted data to. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// The private key could not be found to decrypt the stream. + /// + /// + /// The user chose to cancel the password prompt. + /// -or- + /// The operation was cancelled via the cancellation token. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + /// + /// An OpenPGP error occurred. + /// + public DigitalSignatureCollection DecryptTo (Stream encryptedData, Stream decryptedData, CancellationToken cancellationToken = default (CancellationToken)) + { + return DecryptToAsync (encryptedData, decryptedData, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously decrypt an encrypted stream and extract the digital signers if the content was also signed. + /// + /// + /// Decrypts an encrypted stream and extracts the digital signers if the content was also signed. + /// If any of the signatures were made with an unrecognized key and is enabled, + /// an attempt will be made to retrieve said key(s). The can be used to cancel + /// key retrieval. + /// + /// The list of digital signatures if the data was both signed and encrypted; otherwise, null. + /// The encrypted data. + /// The stream to write the decrypted data to. + /// The cancellation token. + /// + /// is null. + /// -or- + /// is null. + /// + /// + /// The private key could not be found to decrypt the stream. + /// + /// + /// The user chose to cancel the password prompt. + /// -or- + /// The operation was cancelled via the cancellation token. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + /// + /// An OpenPGP error occurred. + /// + public Task DecryptToAsync (Stream encryptedData, Stream decryptedData, CancellationToken cancellationToken = default (CancellationToken)) + { + return DecryptToAsync (encryptedData, decryptedData, true, cancellationToken); + } + + /// + /// Decrypts the specified encryptedData and extracts the digital signers if the content was also signed. + /// + /// + /// Decrypts the specified encryptedData and extracts the digital signers if the content was also signed. + /// + /// The decrypted . + /// The encrypted data. + /// A list of digital signatures if the data was both signed and encrypted. + /// The cancellation token. + /// + /// is null. + /// + /// + /// The private key could not be found to decrypt the stream. + /// + /// + /// The user chose to cancel the password prompt. + /// -or- + /// The operation was cancelled via the cancellation token. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + /// + /// An OpenPGP error occurred. + /// + public MimeEntity Decrypt (Stream encryptedData, out DigitalSignatureCollection signatures, CancellationToken cancellationToken = default (CancellationToken)) + { + using (var decryptedData = new MemoryBlockStream ()) { + signatures = DecryptTo (encryptedData, decryptedData, cancellationToken); + decryptedData.Position = 0; + + return MimeEntity.Load (decryptedData, cancellationToken); + } + } + + /// + /// Decrypts the specified encryptedData. + /// + /// + /// Decrypts the specified encryptedData. + /// + /// The decrypted . + /// The encrypted data. + /// The cancellation token. + /// + /// is null. + /// + /// + /// The private key could not be found to decrypt the stream. + /// + /// + /// The user chose to cancel the password prompt. + /// -or- + /// The operation was cancelled via the cancellation token. + /// + /// + /// 3 bad attempts were made to unlock the secret key. + /// + /// + /// An OpenPGP error occurred. + /// + public override MimeEntity Decrypt (Stream encryptedData, CancellationToken cancellationToken = default (CancellationToken)) + { + using (var decryptedData = new MemoryBlockStream ()) { + DecryptTo (encryptedData, decryptedData, cancellationToken); + decryptedData.Position = 0; + + return MimeEntity.Load (decryptedData, cancellationToken); + } + } + + /// + /// Releases all resources used by the object. + /// + /// Call when you are finished using the . The + /// method leaves the in an unusable state. After + /// calling , you must release all references to the so + /// the garbage collector can reclaim the memory that the was occupying. + protected override void Dispose (bool disposing) + { + if (disposing && client != null) { + client.Dispose (); + client = null; + } + + base.Dispose (disposing); + } + } +} diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 683a7f73f9..46e63e9fe8 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -1,4 +1,4 @@ - + Debug @@ -98,9 +98,11 @@ + + @@ -293,4 +295,4 @@ - + \ No newline at end of file diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 8fd56eb451..c10aa73bbc 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -109,9 +109,11 @@ + + From cb9a9e8af423c3f7b0ebc7dc4707a27541e87e60 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 4 Jun 2020 09:46:09 -0400 Subject: [PATCH 574/741] Cleaned up the refactored API, added docs, etc. --- MimeKit/Cryptography/CryptographyContext.cs | 8 +- MimeKit/Cryptography/KeyRetrievalResults.cs | 48 ----- MimeKit/Cryptography/OpenPgpContext.cs | 98 ++++++--- .../{PgpContext.cs => OpenPgpContextBase.cs} | 189 +++++++++++++----- MimeKit/MimeKit.Net45.csproj | 3 +- MimeKit/MimeKit.NetStandard.csproj | 3 +- 6 files changed, 215 insertions(+), 134 deletions(-) delete mode 100644 MimeKit/Cryptography/KeyRetrievalResults.cs rename MimeKit/Cryptography/{PgpContext.cs => OpenPgpContextBase.cs} (90%) diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 7ea4606f46..0c1a0fadfa 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -44,7 +44,7 @@ public abstract class CryptographyContext : IDisposable { const string SubclassAndRegisterFormat = "You need to subclass {0} and then register it with MimeKit.Cryptography.CryptographyContext.Register()."; static Func SecureMimeContextFactory; - static Func PgpContextFactory; + static Func PgpContextFactory; static readonly object mutex = new object (); EncryptionAlgorithm[] encryptionAlgorithmRank; @@ -596,9 +596,9 @@ public static void Register (Type type) lock (mutex) { SecureMimeContextFactory = () => (SecureMimeContext) ctor.Invoke (new object[0]); } - } else if (info.IsSubclassOf (typeof (PgpContext))) { + } else if (info.IsSubclassOf (typeof (OpenPgpContextBase))) { lock (mutex) { - PgpContextFactory = () => (PgpContext) ctor.Invoke (new object[0]); + PgpContextFactory = () => (OpenPgpContextBase) ctor.Invoke (new object[0]); } } else { throw new ArgumentException ("The specified type must be a subclass of SecureMimeContext or OpenPgpContext.", nameof (type)); @@ -635,7 +635,7 @@ public static void Register (Func factory) /// /// is null. /// - public static void Register (Func factory) + public static void Register (Func factory) { if (factory == null) throw new ArgumentNullException(nameof (factory)); diff --git a/MimeKit/Cryptography/KeyRetrievalResults.cs b/MimeKit/Cryptography/KeyRetrievalResults.cs deleted file mode 100644 index 073f6ad291..0000000000 --- a/MimeKit/Cryptography/KeyRetrievalResults.cs +++ /dev/null @@ -1,48 +0,0 @@ -// -// OpenPgpContext.cs -// -// Author: Jeffrey Stedfast -// -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -using Org.BouncyCastle.Bcpg.OpenPgp; - -namespace MimeKit.Cryptography -{ - public abstract partial class PgpContext - { - /// - /// Helper class to return both public keyring and public key associated with each other. - /// - public class KeyRetrievalResults - { - public readonly PgpPublicKeyRing KeyRing; - public readonly PgpPublicKey Key; - - public KeyRetrievalResults (PgpPublicKeyRing keyring, PgpPublicKey pubkey) - { - KeyRing = keyring; - Key = pubkey; - } - } - } -} diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index c89a9ab1d9..5925fbc68d 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -43,20 +43,19 @@ using MimeKit.IO; using MimeKit.Utils; -namespace MimeKit.Cryptography -{ - // NOTE: This class should really be called "GnuPGContext", since it's based upon the GnuPG way to handle keys. - // However, renaming it now is impossible, since that would break every single class currently inheriting form it :/ +namespace MimeKit.Cryptography { /// - /// An abstract OpenPGP cryptography context which can be used for PGP/MIME that is based upon GnuPG - /// files to store PGP keys. + /// An abstract OpenPGP cryptography context which can be used for OpenPGP and PGP/MIME that + /// manages keyrings stored on the local file system as keyring bundles. /// /// - /// Generally speaking, applications should not use a + /// PGP software such as older versions of GnuPG (pre 2.1.0) typically store the user's + /// keyrings on the file system using the OpenPGP Keyring Bundle format. + /// Generally speaking, applications should not use a /// directly, but rather via higher level APIs such as - /// and . + /// and . /// - public abstract class OpenPgpContext : PgpContext + public abstract class OpenPgpContext : OpenPgpContextBase { /// /// Initialize a new instance of the class. @@ -66,8 +65,9 @@ public abstract class OpenPgpContext : PgpContext /// , , and the /// properties themselves. /// - protected OpenPgpContext () : base() // Base constructor sets all defaults. - { } + protected OpenPgpContext () : base () + { + } /// /// Initialize a new instance of the class. @@ -160,28 +160,74 @@ public PgpSecretKeyRingBundle SecretKeyRingBundle { get; protected set; } - /// - /// Helper method to retrieve a public key, and its keyring, given a key's ID - /// - /// - /// - /// - /// - public override async Task GetPublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) + bool TryGetPublicKeyRing (long keyId, out PgpPublicKeyRing keyring) { foreach (PgpPublicKeyRing ring in PublicKeyRingBundle.GetKeyRings ()) { foreach (PgpPublicKey key in ring.GetPublicKeys ()) { - if (key.KeyId == keyId) - return new KeyRetrievalResults (ring, key); + if (key.KeyId == keyId) { + keyring = ring; + return true; + } } } - if (AutoKeyRetrieve && IsValidKeyServer) { - var keyring = await RetrievePublicKeyRingAsync (keyId, doAsync, cancellationToken).ConfigureAwait (false); - return new KeyRetrievalResults (keyring, keyring.GetPublicKey (keyId)); - } + keyring = null; + + return false; + } + + /// + /// Get the public keyring that contains the specified key. + /// + /// + /// Gets the public keyring that contains the specified key. + /// Implementations should first try to obtain the keyring stored (or cached) locally. + /// Failing that, if is enabled, they should use + /// to attempt to + /// retrieve the keyring from the configured . + /// + /// The public key identifier. + /// The cancellation token. + /// The public keyring that contains the specified key or null if the keyring could not be found. + /// + /// The operation was cancelled. + /// + protected override PgpPublicKeyRing GetPublicKeyRing (long keyId, CancellationToken cancellationToken) + { + if (TryGetPublicKeyRing (keyId, out var keyring)) + return keyring; + + if (AutoKeyRetrieve) + return RetrievePublicKeyRing (keyId, cancellationToken); + + return null; + } + + /// + /// Asynchronously get the public keyring that contains the specified key. + /// + /// + /// Gets the public keyring that contains the specified key. + /// Implementations should first try to obtain the keyring stored (or cached) locally. + /// Failing that, if is enabled, they should use + /// to attempt to + /// retrieve the keyring from the configured . + /// + /// The public key identifier. + /// The cancellation token. + /// The public keyring that contains the specified key or null if the keyring could not be found. + /// + /// The operation was cancelled. + /// + protected override async Task GetPublicKeyRingAsync (long keyId, CancellationToken cancellationToken) + { + if (TryGetPublicKeyRing (keyId, out var keyring)) + return keyring; + + if (AutoKeyRetrieve) + return await RetrievePublicKeyRingAsync (keyId, cancellationToken).ConfigureAwait (false); - return new KeyRetrievalResults (null, null); + return null; } /// diff --git a/MimeKit/Cryptography/PgpContext.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs similarity index 90% rename from MimeKit/Cryptography/PgpContext.cs rename to MimeKit/Cryptography/OpenPgpContextBase.cs index a7edd7cd1e..8525a7e71f 100644 --- a/MimeKit/Cryptography/PgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -1,7 +1,8 @@ // // OpenPgpContext.cs // -// Author: Jeffrey Stedfast and Thomas Hansen +// Authors: Jeffrey Stedfast +// Thomas Hansen // // Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) // @@ -39,25 +40,22 @@ using MimeKit.IO; -namespace MimeKit.Cryptography -{ +namespace MimeKit.Cryptography { /// - /// An abstract OpenPGP cryptography context which can be used for PGP/MIME. This is a more - /// low level class than OpenPgpContext, since it allows you to persist your keys, any ways you - /// see fit, and is not dependent upon GnuPG in any ways. + /// An abstract OpenPGP cryptography context which can be used for PGP/MIME. /// /// - /// Generally speaking, applications should not use a + /// Generally speaking, applications should not use a /// directly, but rather via higher level APIs such as /// and . /// - public abstract partial class PgpContext : CryptographyContext + public abstract class OpenPgpContextBase : CryptographyContext { - internal static readonly string[] ProtocolSubtypes = { "pgp-signature", "pgp-encrypted", "pgp-keys", "x-pgp-signature", "x-pgp-encrypted", "x-pgp-keys" }; - protected const string BeginPublicKeyBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; - protected const string EndPublicKeyBlock = "-----END PGP PUBLIC KEY BLOCK-----"; + static readonly string[] ProtocolSubtypes = { "pgp-signature", "pgp-encrypted", "pgp-keys", "x-pgp-signature", "x-pgp-encrypted", "x-pgp-keys" }; + const string BeginPublicKeyBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; + const string EndPublicKeyBlock = "-----END PGP PUBLIC KEY BLOCK-----"; - internal static readonly EncryptionAlgorithm[] DefaultEncryptionAlgorithmRank = { + static readonly EncryptionAlgorithm[] DefaultEncryptionAlgorithmRank = { EncryptionAlgorithm.Idea, EncryptionAlgorithm.TripleDes, EncryptionAlgorithm.Cast5, @@ -71,7 +69,7 @@ public abstract partial class PgpContext : CryptographyContext EncryptionAlgorithm.Camellia256 }; - internal static readonly DigestAlgorithm[] DefaultDigestAlgorithmRank = { + static readonly DigestAlgorithm[] DefaultDigestAlgorithmRank = { DigestAlgorithm.Sha1, DigestAlgorithm.RipeMD160, DigestAlgorithm.Sha256, @@ -80,19 +78,17 @@ public abstract partial class PgpContext : CryptographyContext DigestAlgorithm.Sha224 }; - protected EncryptionAlgorithm defaultAlgorithm; - protected HttpClient client; - protected Uri keyServer; + EncryptionAlgorithm defaultAlgorithm; + HttpClient client; + Uri keyServer; /// - /// Initialize a new instance of the class. + /// Initialize a new instance of the class. /// /// - /// Subclasses choosing to use this constructor MUST set the , - /// , , and the - /// properties themselves. + /// Creates a new . /// - protected PgpContext () + protected OpenPgpContextBase () { EncryptionAlgorithmRank = DefaultEncryptionAlgorithmRank; DigestAlgorithmRank = DefaultDigestAlgorithmRank; @@ -109,32 +105,53 @@ protected PgpContext () } /// - /// Imports the specified public key ring bundle. + /// Get the password for a secret key. /// - /// Bundle of keys to import. - public abstract void Import (PgpPublicKeyRingBundle bundle); + /// + /// Gets the password for a secret key. + /// + /// The password for the secret key. + /// The secret key. + /// + /// The user chose to cancel the password request. + /// + protected abstract string GetPasswordForKey (PgpSecretKey key); /// - /// Gets the password for key. + /// Get the public keyring that contains the specified key. /// /// - /// Gets the password for key. + /// Gets the public keyring that contains the specified key. + /// Implementations should first try to obtain the keyring stored (or cached) locally. + /// Failing that, if is enabled, they should use + /// to attempt to + /// retrieve the keyring from the configured . /// - /// The password for key. - /// The key. + /// The public key identifier. + /// The cancellation token. + /// The public keyring that contains the specified key or null if the keyring could not be found. /// - /// The user chose to cancel the password request. + /// The operation was cancelled. /// - protected abstract string GetPasswordForKey (PgpSecretKey key); + protected abstract PgpPublicKeyRing GetPublicKeyRing (long keyId, CancellationToken cancellationToken); /// - /// Helper method to retrieve a public key, and its keyring, given a key's ID + /// Get the public keyring that contains the specified key asynchronously. /// - /// - /// - /// - /// - public abstract Task GetPublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken); + /// + /// Gets the public keyring that contains the specified key. + /// Implementations should first try to obtain the keyring stored (or cached) locally. + /// Failing that, if is enabled, they should use + /// to attempt to + /// retrieve the keyring from the configured . + /// + /// The public key identifier. + /// The cancellation token. + /// The public keyring that contains the specified key or null if the keyring could not be found. + /// + /// The operation was cancelled. + /// + protected abstract Task GetPublicKeyRingAsync (long keyId, CancellationToken cancellationToken); /// /// Get the secret key for a specified key identifier. @@ -187,7 +204,7 @@ public EncryptionAlgorithm DefaultEncryptionAlgorithm { } } - internal protected bool IsValidKeyServer { + bool IsValidKeyServer { get { if (keyServer == null) return false; @@ -486,12 +503,15 @@ public static bool IsExpired (PgpPublicKey pubkey) /// /// Retrieves the public keyring, using the preferred key server, automatically importing it afterwards. /// - /// ID of key to retrieve - /// whether or not this invocation should be handled as an async invocation. - /// Cancellation token for operation. - /// - public async Task RetrievePublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) + /// The identifier of the key to be retrieved. + /// true if this operation should be done asynchronously; otherweise, false. + /// The cancellation token. + /// The public key ring. + async Task RetrievePublicKeyRingAsync (long keyId, bool doAsync, CancellationToken cancellationToken) { + if (!IsValidKeyServer) + return null; + var scheme = keyServer.Scheme.ToLowerInvariant (); var uri = new UriBuilder (); @@ -543,6 +563,42 @@ public async Task RetrievePublicKeyRingAsync (long keyId, bool } } + /// + /// Retrieve the public keyring using the configured key server. + /// + /// + /// Retrieves the public keyring specified by the from the key server + /// set on the property. If the keyring is successfully retrieved, it will + /// be imported via . + /// This method should be called by + /// when the keyring is not available locally. + /// + /// The identifier of the public key to be retrieved. + /// The cancellation token. + /// The public key ring. + protected PgpPublicKeyRing RetrievePublicKeyRing (long keyId, CancellationToken cancellationToken) + { + return RetrievePublicKeyRingAsync (keyId, false, cancellationToken).GetAwaiter ().GetResult (); + } + + /// + /// Asynchronously retrieve the public keyring using the configured key server. + /// + /// + /// Retrieves the public keyring specified by the from the key server + /// set on the property. If the keyring is successfully retrieved, it will + /// be imported via . + /// This method should be called by + /// when the keyring is not available locally. + /// + /// The identifier of the public key to be retrieved. + /// The cancellation token. + /// The public key ring. + protected Task RetrievePublicKeyRingAsync (long keyId, CancellationToken cancellationToken) + { + return RetrievePublicKeyRingAsync (keyId, true, cancellationToken); + } + /// /// Gets the private key from the specified secret key. /// @@ -809,6 +865,20 @@ public static PublicKeyAlgorithm GetPublicKeyAlgorithm (PublicKeyAlgorithmTag al } } + bool TryGetPublicKey (PgpPublicKeyRing keyring, long keyId, out PgpPublicKey pubkey) + { + foreach (PgpPublicKey key in keyring.GetPublicKeys ()) { + if (key.KeyId == keyId) { + pubkey = key; + return true; + } + } + + pubkey = null; + + return false; + } + async Task GetDigitalSignaturesAsync (PgpSignatureList signatureList, Stream content, bool doAsync, CancellationToken cancellationToken) { var signatures = new List (); @@ -817,21 +887,23 @@ async Task GetDigitalSignaturesAsync (PgpSignatureLi for (int i = 0; i < signatureList.Count; i++) { long keyId = signatureList[i].KeyId; - KeyRetrievalResults results; + PgpPublicKeyRing keyring; if (doAsync) - results = await GetPublicKeyRingAsync (keyId, doAsync, cancellationToken).ConfigureAwait (false); + keyring = await GetPublicKeyRingAsync (keyId, cancellationToken).ConfigureAwait (false); else - results = GetPublicKeyRingAsync (keyId, doAsync, cancellationToken).GetAwaiter ().GetResult (); + keyring = GetPublicKeyRing (keyId, cancellationToken); - var signature = new OpenPgpDigitalSignature (results.KeyRing, results.Key, signatureList[i]) { + TryGetPublicKey (keyring, keyId, out var key); + + var signature = new OpenPgpDigitalSignature (keyring, key, signatureList[i]) { PublicKeyAlgorithm = GetPublicKeyAlgorithm (signatureList[i].KeyAlgorithm), DigestAlgorithm = GetDigestAlgorithm (signatureList[i].HashAlgorithm), CreationDate = signatureList[i].CreationTime, }; - if (results.Key != null) - signatureList[i].InitVerify (results.Key); + if (key != null) + signatureList[i].InitVerify (key); signatures.Add (signature); } @@ -1504,18 +1576,22 @@ async Task DecryptToAsync (Stream encryptedData, Str for (int i = 0; i < onepasses.Count; i++) { var onepass = onepasses[i]; + PgpPublicKeyRing keyring; - var results = await GetPublicKeyRingAsync (onepass.KeyId, doAsync, cancellationToken).ConfigureAwait (false); + if (doAsync) + keyring = await GetPublicKeyRingAsync (onepass.KeyId, cancellationToken).ConfigureAwait (false); + else + keyring = GetPublicKeyRing (onepass.KeyId, cancellationToken); - if (results.KeyRing == null) { + if (keyring == null || !TryGetPublicKey (keyring, onepass.KeyId, out var key)) { // too messy, pretend we never found a one-pass signature list onepassList = null; break; } - onepass.InitVerify (results.Key); + onepass.InitVerify (key); - var signature = new OpenPgpDigitalSignature (results.KeyRing, results.Key, onepass) { + var signature = new OpenPgpDigitalSignature (keyring, key, onepass) { PublicKeyAlgorithm = GetPublicKeyAlgorithm (onepass.KeyAlgorithm), DigestAlgorithm = GetDigestAlgorithm (onepass.HashAlgorithm), }; @@ -1727,6 +1803,15 @@ async Task DecryptToAsync (Stream encryptedData, Str } } + /// + /// Import the specified public keyring bundle. + /// + /// + /// Imports the specified public keyring bundle. + /// + /// THe bundle of public keyrings to import. + public abstract void Import (PgpPublicKeyRingBundle bundle); + /// /// Releases all resources used by the object. /// diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj index 46e63e9fe8..76c95dbe86 100644 --- a/MimeKit/MimeKit.Net45.csproj +++ b/MimeKit/MimeKit.Net45.csproj @@ -98,12 +98,11 @@ - - + diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index c10aa73bbc..ec0983e697 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -109,12 +109,11 @@ - - + From cc02a0b01a5c6bc595e7d04dd62880143fd6d775 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 4 Jun 2020 10:21:52 -0400 Subject: [PATCH 575/741] Simplified some OpenPgpContextBase logic --- MimeKit/Cryptography/OpenPgpContextBase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContextBase.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs index 8525a7e71f..e2f98019f5 100644 --- a/MimeKit/Cryptography/OpenPgpContextBase.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -867,10 +867,12 @@ public static PublicKeyAlgorithm GetPublicKeyAlgorithm (PublicKeyAlgorithmTag al bool TryGetPublicKey (PgpPublicKeyRing keyring, long keyId, out PgpPublicKey pubkey) { - foreach (PgpPublicKey key in keyring.GetPublicKeys ()) { - if (key.KeyId == keyId) { - pubkey = key; - return true; + if (keyring != null) { + foreach (PgpPublicKey key in keyring.GetPublicKeys ()) { + if (key.KeyId == keyId) { + pubkey = key; + return true; + } } } @@ -1583,7 +1585,7 @@ async Task DecryptToAsync (Stream encryptedData, Str else keyring = GetPublicKeyRing (onepass.KeyId, cancellationToken); - if (keyring == null || !TryGetPublicKey (keyring, onepass.KeyId, out var key)) { + if (!TryGetPublicKey (keyring, onepass.KeyId, out var key)) { // too messy, pretend we never found a one-pass signature list onepassList = null; break; From 87f99d99d4431e11534e6548ff7c62f283f6b691 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Jun 2020 10:52:18 -0400 Subject: [PATCH 576/741] Dropped support for RSACng and DSACng in the netstandard2.0 profile See https://github.com/xamarin/xamarin-macios/issues/8772 for details --- .../AsymmetricAlgorithmExtensions.cs | 16 ++++++++-------- MimeKit/MimeKit.NetStandard.csproj | 2 -- nuget/MimeKit.nuspec | 3 --- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index d03de2089f..f8fe6abcd6 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -112,7 +112,7 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvi } #endif -#if NET47 || NET48 || NETSTANDARD2_0 +#if NET47 || NET48 static AsymmetricKeyParameter GetAsymmetricKeyParameter (DSACng dsa) { GetAsymmetricKeyParameters (dsa, false, out _, out var key); @@ -128,7 +128,7 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACng dsa) } #endif -#if !NET45 +#if NET46 || NET47 || NET48 static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACng rsa) { GetAsymmetricKeyParameters (rsa, false, out _, out var key); @@ -164,12 +164,12 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl if (key == null) throw new ArgumentNullException (nameof (key)); -#if !NET45 +#if NET46 || NET47 || NET48 if (key is RSACng rsaCng) return GetAsymmetricKeyParameter (rsaCng); #endif -#if NET47 || NET48 || NETSTANDARD2_0 +#if NET47 || NET48 if (key is DSACng dsaCng) return GetAsymmetricKeyParameter (dsaCng); #endif @@ -210,12 +210,12 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric if (key == null) throw new ArgumentNullException (nameof (key)); -#if !NET45 +#if NET46 || NET47 || NET48 if (key is RSACng rsaCng) return GetAsymmetricCipherKeyPair (rsaCng); #endif -#if NET47 || NET48 || NETSTANDARD2_0 +#if NET47 || NET48 if (key is DSACng dsaCng) return GetAsymmetricCipherKeyPair (dsaCng); #endif @@ -314,7 +314,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters ke parameters.DP = GetPaddedByteArray (key.DP, parameters.P.Length); parameters.DQ = GetPaddedByteArray (key.DQ, parameters.Q.Length); -#if NET45 +#if NET45 || __MOBILE__ var rsa = new RSACryptoServiceProvider (); #else var rsa = new RSACng (); @@ -331,7 +331,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaKeyParameters key) parameters.Exponent = key.Exponent.ToByteArrayUnsigned (); parameters.Modulus = key.Modulus.ToByteArrayUnsigned (); -#if NET45 +#if NET45 || __MOBILE__ var rsa = new RSACryptoServiceProvider (); #else var rsa = new RSACng (); diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index ec0983e697..9e5b079649 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -46,7 +46,6 @@ - @@ -55,7 +54,6 @@ - diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 1d7dc5fff5..ecf1ff653a 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -80,7 +80,6 @@ - @@ -88,7 +87,6 @@ - @@ -96,7 +94,6 @@ - From 40ace7f4cc80619f44a09bc7b5171d935781469e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Jun 2020 11:09:46 -0400 Subject: [PATCH 577/741] Fixed the build for netstandard1.x --- .../AsymmetricAlgorithmExtensions.cs | 26 ++++--------------- MimeKit/MimeKit.NetStandard.csproj | 2 +- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index f8fe6abcd6..36dbb1b4d4 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -41,7 +41,6 @@ namespace MimeKit.Cryptography /// public static class AsymmetricAlgorithmExtensions { -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 static void GetAsymmetricKeyParameters (DSA dsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var dp = dsa.ExportParameters (!publicOnly); @@ -72,7 +71,6 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } -#endif static void GetAsymmetricKeyParameters (RSA rsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { @@ -93,7 +91,6 @@ static void GetAsymmetricKeyParameters (RSA rsa, bool publicOnly, out Asymmetric ); } -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACryptoServiceProvider rsa) { GetAsymmetricKeyParameters (rsa, rsa.PublicOnly, out var pub, out var key); @@ -110,7 +107,6 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } -#endif #if NET47 || NET48 static AsymmetricKeyParameter GetAsymmetricKeyParameter (DSACng dsa) @@ -174,13 +170,11 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl return GetAsymmetricKeyParameter (dsaCng); #endif -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key is RSACryptoServiceProvider rsaKey) return GetAsymmetricKeyParameter (rsaKey); if (key is DSACryptoServiceProvider dsaKey) return GetAsymmetricKeyParameter (dsaKey); -#endif // TODO: support ECDiffieHellman and ECDsa? @@ -220,13 +214,11 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric return GetAsymmetricCipherKeyPair (dsaCng); #endif -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key is RSACryptoServiceProvider rsaKey) return GetAsymmetricCipherKeyPair (rsaKey); if (key is DSACryptoServiceProvider dsaKey) return GetAsymmetricCipherKeyPair (dsaKey); -#endif // TODO: support ECDiffieHellman and ECDsa? @@ -247,7 +239,6 @@ static byte[] GetPaddedByteArray (BigInteger big, int length) return padded; } -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 static DSAParameters GetDSAParameters (DsaKeyParameters key) { var parameters = new DSAParameters (); @@ -272,7 +263,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPrivateKeyParameters key, if (pub != null) parameters.Y = pub.Y.ToByteArrayUnsigned (); -#if NET45 || NET46 || __MOBILE__ +#if NET45 || NET46 || NETSTANDARD2_0 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); #else var dsa = new DSACng (); @@ -288,7 +279,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPublicKeyParameters key) var parameters = GetDSAParameters (key); parameters.Y = key.Y.ToByteArrayUnsigned (); -#if NET45 || NET46 || __MOBILE__ +#if NET45 || NET46 || NETSTANDARD2_0 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); #else var dsa = new DSACng (); @@ -298,9 +289,8 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPublicKeyParameters key) return dsa; } -#endif - static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters key) + static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters key) { var parameters = new RSAParameters (); @@ -314,7 +304,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters ke parameters.DP = GetPaddedByteArray (key.DP, parameters.P.Length); parameters.DQ = GetPaddedByteArray (key.DQ, parameters.Q.Length); -#if NET45 || __MOBILE__ +#if NET45 || NETSTANDARD2_0 || __MOBILE__ var rsa = new RSACryptoServiceProvider (); #else var rsa = new RSACng (); @@ -331,7 +321,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaKeyParameters key) parameters.Exponent = key.Exponent.ToByteArrayUnsigned (); parameters.Modulus = key.Modulus.ToByteArrayUnsigned (); -#if NET45 || __MOBILE__ +#if NET45 || NETSTANDARD2_0 || __MOBILE__ var rsa = new RSACryptoServiceProvider (); #else var rsa = new RSACng (); @@ -366,18 +356,14 @@ public static AsymmetricAlgorithm AsAsymmetricAlgorithm (this AsymmetricKeyParam if (key is RsaPrivateCrtKeyParameters rsaPrivateKey) return GetAsymmetricAlgorithm (rsaPrivateKey); -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key is DsaPrivateKeyParameters dsaPrivateKey) return GetAsymmetricAlgorithm (dsaPrivateKey, null); -#endif } else { if (key is RsaKeyParameters rsaPublicKey) return GetAsymmetricAlgorithm (rsaPublicKey); -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key is DsaPublicKeyParameters dsaPublicKey) return GetAsymmetricAlgorithm (dsaPublicKey); -#endif } throw new NotSupportedException (string.Format ("{0} is currently not supported.", key.GetType ().Name)); @@ -406,10 +392,8 @@ public static AsymmetricAlgorithm AsAsymmetricAlgorithm (this AsymmetricCipherKe if (key.Private is RsaPrivateCrtKeyParameters rsaPrivateKey) return GetAsymmetricAlgorithm (rsaPrivateKey); -#if !NETSTANDARD1_3 && !NETSTANDARD1_6 if (key.Private is DsaPrivateKeyParameters dsaPrivateKey) return GetAsymmetricAlgorithm (dsaPrivateKey, (DsaPublicKeyParameters) key.Public); -#endif throw new NotSupportedException (string.Format ("{0} is currently not supported.", key.GetType ().Name)); } diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.NetStandard.csproj index 9e5b079649..d1daf05b00 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.NetStandard.csproj @@ -73,7 +73,7 @@ - + From faf7f1b1bd940f0a30eadc9033287086155e4c2c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Jun 2020 11:56:41 -0400 Subject: [PATCH 578/741] Added more docs to the new OpenPgpContextBase class and fixed up some API changes. --- MimeKit/Cryptography/OpenPgpContext.cs | 39 ++----- MimeKit/Cryptography/OpenPgpContextBase.cs | 125 +++++++++++++++------ 2 files changed, 95 insertions(+), 69 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index 5925fbc68d..b5eb36ab56 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -279,7 +279,7 @@ public virtual IEnumerable EnumeratePublicKeyRings (MailboxAdd throw new ArgumentNullException (nameof (mailbox)); foreach (var keyring in EnumeratePublicKeyRings ()) { - if (PgpPublicKeyMatches (keyring.GetPublicKey (), mailbox)) + if (IsMatch (keyring.GetPublicKey (), mailbox)) yield return keyring; } @@ -356,7 +356,7 @@ public virtual IEnumerable EnumerateSecretKeyRings (MailboxAdd throw new ArgumentNullException (nameof (mailbox)); foreach (var keyring in EnumerateSecretKeyRings ()) { - if (PgpSecretKeyMatches (keyring.GetSecretKey (), mailbox)) + if (IsMatch (keyring.GetSecretKey (), mailbox)) yield return keyring; } @@ -429,37 +429,12 @@ public override IList GetPublicKeys (IEnumerable m if (mailboxes == null) throw new ArgumentNullException (nameof (mailboxes)); - var recipients = new List (); + var keys = new List (); foreach (var mailbox in mailboxes) - recipients.Add (GetPublicKey (mailbox)); + keys.Add (GetPublicKey (mailbox)); - return recipients; - } - - static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) - { - if (mailbox is SecureMailboxAddress secure && !string.IsNullOrEmpty (secure.Fingerprint)) { - if (secure.Fingerprint.Length > 16) { - var fingerprint = HexEncode (key.PublicKey.GetFingerprint ()); - - return secure.Fingerprint.Equals (fingerprint, StringComparison.OrdinalIgnoreCase); - } - - var id = ((int) key.KeyId).ToString ("X2"); - - return secure.Fingerprint.EndsWith (id, StringComparison.OrdinalIgnoreCase); - } - - foreach (string userId in key.UserIds) { - if (!MailboxAddress.TryParse (userId, out var email)) - continue; - - if (mailbox.Address.Equals (email.Address, StringComparison.OrdinalIgnoreCase)) - return true; - } - - return false; + return keys; } /// @@ -473,7 +448,7 @@ static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) /// /// The secret key specified by the could not be found. /// - public override PgpSecretKey GetSecretKey (long keyId) + protected override PgpSecretKey GetSecretKey (long keyId) { foreach (var key in EnumerateSecretKeys ()) { if (key.KeyId == keyId) @@ -495,7 +470,7 @@ public override PgpSecretKey GetSecretKey (long keyId) /// is null. /// /// - /// A private key for the specified could not be found. + /// A secret key for the specified could not be found. /// public override PgpSecretKey GetSigningKey (MailboxAddress mailbox) { diff --git a/MimeKit/Cryptography/OpenPgpContextBase.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs index e2f98019f5..60c85a5dcf 100644 --- a/MimeKit/Cryptography/OpenPgpContextBase.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -115,7 +115,7 @@ protected OpenPgpContextBase () /// /// The user chose to cancel the password request. /// - protected abstract string GetPasswordForKey (PgpSecretKey key); + protected abstract string GetPasswordForKey (PgpSecretKey key); // FIXME: rename this to GetPassword() in the future /// /// Get the public keyring that contains the specified key. @@ -164,26 +164,38 @@ protected OpenPgpContextBase () /// /// The secret key specified by the could not be found. /// - public abstract PgpSecretKey GetSecretKey (long keyId); + protected abstract PgpSecretKey GetSecretKey (long keyId); /// - /// Returns public keys associated with enumerable of MailboxAddresses. - /// Notice, input can also be SecureMailboxAddress, at which point it might contain - /// a fingerprint, allowing you to do lookups according to fingerprints, instead of identity - /// of key. + /// Get the public keys for the specified mailbox addresses. /// - /// Address list to lookup key(s) for. - /// + /// + /// Gets a list of valid public keys for the specified mailbox addresses that can be used for encryption. + /// + /// The encryption keys. + /// The mailboxes. + /// + /// is null. + /// + /// + /// A public key for one or more of the could not be found. + /// public abstract IList GetPublicKeys (IEnumerable mailboxes); /// - /// Returns signing key for specified MailboxAddress. - /// Notice, input can also be SecureMailboxAddress, at which point it might contain - /// a fingerprint, allowing you to do lookups according to fingerprints, instead of identity - /// of key. + /// Get the signing key associated with the mailbox address. /// - /// Address to lookup key for. - /// + /// + /// Gets the signing key associated with the mailbox address. + /// + /// The signing key. + /// The mailbox. + /// + /// is null. + /// + /// + /// A secret key for the specified could not be found. + /// public abstract PgpSecretKey GetSigningKey (MailboxAddress mailbox); /// @@ -415,17 +427,32 @@ public static string HexEncode (byte[] data) } /// - /// Returns true if the specified public key matches the specified MailboxAddress. - /// Might do a fingerprint lookup, if given address is of type SecureMailboxAddress. + /// Check that a public key is a match for the specified mailbox. /// - /// Key to check - /// Address to check - /// True if match. - public static bool PgpPublicKeyMatches (PgpPublicKey key, MailboxAddress mailbox) + /// + /// Checks that the public key is a match for the specified mailbox. + /// If the is a with a non-empty + /// , then the fingerprint is used to match the key's + /// fingerprint. Otherwise, the email address(es) contained within the key's user identifier strings + /// are compared to the mailbox address. + /// + /// The public key. + /// The mailbox address. + /// true if the key is a match for the specified mailbox; otherwise, false. + /// + /// is null. + /// -or- + /// is null. + /// + protected static bool IsMatch (PgpPublicKey key, MailboxAddress mailbox) { - var secure = mailbox as SecureMailboxAddress; + if (key == null) + throw new ArgumentNullException (nameof (key)); - if (secure != null && !string.IsNullOrEmpty (secure.Fingerprint)) { + if (mailbox == null) + throw new ArgumentNullException (nameof (mailbox)); + + if (mailbox is SecureMailboxAddress secure && !string.IsNullOrEmpty (secure.Fingerprint)) { if (secure.Fingerprint.Length > 16) { var fingerprint = HexEncode (key.GetFingerprint ()); @@ -438,9 +465,7 @@ public static bool PgpPublicKeyMatches (PgpPublicKey key, MailboxAddress mailbox } foreach (string userId in key.GetUserIds ()) { - MailboxAddress email; - - if (!MailboxAddress.TryParse (userId, out email)) + if (!MailboxAddress.TryParse (userId, out var email)) continue; if (mailbox.Address.Equals (email.Address, StringComparison.OrdinalIgnoreCase)) @@ -451,14 +476,31 @@ public static bool PgpPublicKeyMatches (PgpPublicKey key, MailboxAddress mailbox } /// - /// Returns true if the specified secret key is matching the specified MailboxAddres. - /// Might do a fingerprint lookup, if given address is of type SecureMailboxAddress. + /// Check that a secret key is a match for the specified mailbox. /// - /// Key to check - /// Address to check - /// True if match. - public static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox) + /// + /// Checks that the secret key is a match for the specified mailbox. + /// If the is a with a non-empty + /// , then the fingerprint is used to match the key's + /// fingerprint. Otherwise, the email address(es) contained within the key's user identifier strings + /// are compared to the mailbox address. + /// + /// The secret key. + /// The mailbox address. + /// true if the key is a match for the specified mailbox; otherwise, false. + /// + /// is null. + /// -or- + /// is null. + /// + protected static bool IsMatch (PgpSecretKey key, MailboxAddress mailbox) { + if (key == null) + throw new ArgumentNullException (nameof (key)); + + if (mailbox == null) + throw new ArgumentNullException (nameof (mailbox)); + if (mailbox is SecureMailboxAddress secure && !string.IsNullOrEmpty (secure.Fingerprint)) { if (secure.Fingerprint.Length > 16) { var fingerprint = HexEncode (key.PublicKey.GetFingerprint ()); @@ -483,16 +525,25 @@ public static bool PgpSecretKeyMatches (PgpSecretKey key, MailboxAddress mailbox } /// - /// Returns true if the specified public key is expired. + /// Check if a public key is expired. /// - /// Key to check. - /// True if key is expired. - public static bool IsExpired (PgpPublicKey pubkey) + /// + /// Checks if a public key is expired. + /// + /// The public key. + /// true if the public key is expired; otherwise, false. + /// + /// is null. + /// + protected static bool IsExpired (PgpPublicKey key) { - long seconds = pubkey.GetValidSeconds (); + if (key == null) + throw new ArgumentNullException (nameof (key)); + + long seconds = key.GetValidSeconds (); if (seconds != 0) { - var expires = pubkey.CreationTime.AddSeconds ((double) seconds); + var expires = key.CreationTime.AddSeconds ((double) seconds); if (expires <= DateTime.Now) return true; } From 11646faa778ff2a218230781d4763064897947b0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Jun 2020 12:38:31 -0400 Subject: [PATCH 579/741] Update PgpMimeTests.cs --- UnitTests/Cryptography/PgpMimeTests.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index dc82a5827a..681ba4ce93 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -795,7 +795,19 @@ public void TestAutoKeyRetrieve () Assert.IsInstanceOf (multipart[0], "The first child is not a text part."); Assert.IsInstanceOf (multipart[1], "The second child is not a detached signature."); - var signatures = multipart.Verify (); + DigitalSignatureCollection signatures; + + try { + signatures = multipart.Verify (); + } catch (IOException ex) { + if (ex.Message == "unknown signature key algorithm: 22") { + Assert.Ignore ("Known issue: {0}", ex.Message); + return; + } + + throw; + } + Assert.AreEqual (1, signatures.Count, "Verify returned an unexpected number of signatures."); foreach (var signature in signatures) { try { From a581fdb3efe5a8434bca1c294e50728cdd60a018 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 9 Jun 2020 08:36:06 -0400 Subject: [PATCH 580/741] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index af1d5497be..6c0b13aaf6 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,12 @@ In the top-level MimeKit directory, there are a number of solution files; they a Once you've opened the appropriate MimeKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** build configuration and then build. +Both Visual Studio 2017 and Visual Studio 2019 should be able to build MimeKit without any issues, but older versions +such as Visual Studio 2015 will require modifications to the projects in order to build correctly. It has been reported +that adding NuGet package references to [Microsoft.Net.Compilers](https://www.nuget.org/packages/Microsoft.Net.Compilers/) +>= 3.6.0 and [System.ValueTuple](https://www.nuget.org/packages/System.ValueTuple/) >= 4.5.0 will allow MimeKit to build +successfully. + Note: The **Release** build will generate the xml API documentation, but the **Debug** build will not. ## Using MimeKit From 6bd65a41833702c6bd939a5accab8fa52b7caa52 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 9 Jun 2020 08:38:11 -0400 Subject: [PATCH 581/741] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6c0b13aaf6..e7dd51abca 100644 --- a/README.md +++ b/README.md @@ -155,11 +155,10 @@ In the top-level MimeKit directory, there are a number of solution files; they a Once you've opened the appropriate MimeKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** build configuration and then build. -Both Visual Studio 2017 and Visual Studio 2019 should be able to build MimeKit without any issues, but older versions -such as Visual Studio 2015 will require modifications to the projects in order to build correctly. It has been reported -that adding NuGet package references to [Microsoft.Net.Compilers](https://www.nuget.org/packages/Microsoft.Net.Compilers/) ->= 3.6.0 and [System.ValueTuple](https://www.nuget.org/packages/System.ValueTuple/) >= 4.5.0 will allow MimeKit to build -successfully. +Both Visual Studio 2017 and Visual Studio 2019 should be able to build MimeKit without any issues, but older versions such as +Visual Studio 2015 will require modifications to the projects in order to build correctly. It has been reported that adding +NuGet package references to [Microsoft.Net.Compilers](https://www.nuget.org/packages/Microsoft.Net.Compilers/) >= 3.6.0 +and [System.ValueTuple](https://www.nuget.org/packages/System.ValueTuple/) >= 4.5.0 will allow MimeKit to build successfully. Note: The **Release** build will generate the xml API documentation, but the **Debug** build will not. From 578a23058aef8599547ef913432f9888554a2283 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 9 Jun 2020 09:14:11 -0400 Subject: [PATCH 582/741] Added the start of a unit test for issue #580 --- UnitTests/Text/TextToFlowedTests.cs | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index c05fa97cfd..fe5f58e5da 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -140,5 +140,44 @@ public void TestSpaceStuffingLinesStartingWithSpace () Assert.AreEqual (text, result); } + + [Test] + public void TestFlowingLongLines () + { + string text = "But, soft! what light through yonder window breaks? " + + "It is the east, and Juliet is the sun. " + + "Arise, fair sun, and kill the envious moon, " + + "Who is already sick and pale with grief, " + + "That thou her maid art far more fair than she: " + + "Be not her maid, since she is envious; " + + "Her vestal livery is but sick and green " + + "And none but fools do wear it; cast it off. " + + "It is my lady, O, it is my love! " + + "O, that she knew she were! " + + "She speaks yet she says nothing: what of that? " + + "Her eye discourses; I will answer it. " + + "I am too bold, 'tis not to me she speaks: " + + "Two of the fairest stars in all the heaven, " + + "Having some business, do entreat her eyes " + + "To twinkle in their spheres till they return. " + + "What if her eyes were there, they in her head? " + + "The brightness of her cheek would shame those stars, " + + "As daylight doth a lamp; her eyes in heaven " + + "Would through the airy region stream so bright " + + "That birds would sing and think it were not night. " + + "See, how she leans her cheek upon her hand! " + + "O, that I were a glove upon that hand, " + + "That I might touch that cheek!" + Environment.NewLine; + const string expected = ""; + TextConverter converter = new TextToFlowed (); + string result = converter.Convert (text); + + Assert.AreEqual (expected, result); + + converter = new FlowedToText (); + result = converter.Convert (expected); + + Assert.AreEqual (text, result); + } } } From b4a92ebd77f15581a351c8dfdd0eebf7edd978b0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 9 Jun 2020 09:31:31 -0400 Subject: [PATCH 583/741] Added the expected result to the unit test --- UnitTests/Text/TextToFlowedTests.cs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index fe5f58e5da..89e5ebbb51 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -168,13 +168,36 @@ public void TestFlowingLongLines () "See, how she leans her cheek upon her hand! " + "O, that I were a glove upon that hand, " + "That I might touch that cheek!" + Environment.NewLine; - const string expected = ""; + string expected = "But, soft! what light through yonder window breaks? " + + "It is the east, " + Environment.NewLine + " and Juliet is the sun. " + + "Arise, fair sun, and kill the envious moon, " + Environment.NewLine + " " + + "Who is already sick and pale with grief, " + + "That thou her maid art far " + Environment.NewLine + " more fair than she: " + + "Be not her maid, since she is envious; " + + "Her vestal " + Environment.NewLine + " livery is but sick and green " + + "And none but fools do wear it; cast " + Environment.NewLine + "it off. " + // this looks like a bug + "It is my lady, O, it is my love! " + + "O, that she knew she were! " + Environment.NewLine + " " + + "She speaks yet she says nothing: what of that? " + + "Her eye discourses; " + Environment.NewLine + " I will answer it. " + + "I am too bold, 'tis not to me she speaks: " + + "Two of " + Environment.NewLine + " the fairest stars in all the heaven, " + + "Having some business, do entreat " + Environment.NewLine + " her eyes " + + "To twinkle in their spheres till they return. " + + "What if her " + Environment.NewLine + " eyes were there, they in her head? " + + "The brightness of her cheek would " + Environment.NewLine + " shame those stars, " + + "As daylight doth a lamp; her eyes in heaven " + + "Would " + Environment.NewLine + " through the airy region stream so bright " + + "That birds would sing and " + Environment.NewLine + " think it were not night. " + + "See, how she leans her cheek upon her hand! " + Environment.NewLine + " " + + "O, that I were a glove upon that hand, " + + "That I might touch that cheek!" + Environment.NewLine; TextConverter converter = new TextToFlowed (); string result = converter.Convert (text); Assert.AreEqual (expected, result); - converter = new FlowedToText (); + converter = new FlowedToText (); // { DeleteSpace = true }; result = converter.Convert (expected); Assert.AreEqual (text, result); From dfb1bd2de71bd12b60c20a624f367e2bc787248e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 9 Jun 2020 17:17:17 -0400 Subject: [PATCH 584/741] Copyright .NET Foundation and added Code of Conduct --- License.md | 2 +- README.md | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/License.md b/License.md index 32096396de..af18498898 100644 --- a/License.md +++ b/License.md @@ -1,6 +1,6 @@ ## License Information -MimeKit is Copyright (C) 2012-2020 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2020 .NET Foundation and Contributors and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index e7dd51abca..da3338ea95 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ How does your MIME parser compare? ## License Information -MimeKit is Copyright (C) 2012-2020 Xamarin Inc. and is licensed under the MIT license: +MimeKit is Copyright (C) 2012-2020 .NET Foundation and Contributors and is licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1229,3 +1229,11 @@ string. Please include the `Exception.StackTrace` as well. The `Message`, by its API documentation can be found at [http://www.mimekit.net/docs](http://www.mimekit.net/docs). A copy of the XML-formatted API reference documentation is also included in the NuGet package. + +## .NET Foundation + +MimeKit is a [.NET Foundation](https://www.dotnetfoundation.org/projects) project. + +This project has adopted the code of conduct defined by the [Contributor Covenant](http://contributor-covenant.org/) to clarify expected behavior in our community. For more information, see the [.NET Foundation Code of Conduct](http://www.dotnetfoundation.org/code-of-conduct). + +General .NET OSS discussions: [.NET Foundation forums](https://forums.dotnetfoundation.org) From 493de0b6036095e28e584bdb1ee2ef44a9cbcbfa Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 9 Jun 2020 17:24:36 -0400 Subject: [PATCH 585/741] Updated Copyright in .nuspec files --- nuget/MimeKit.nuspec | 2 +- nuget/MimeKitLite.nuspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index ecf1ff653a..5a23d79905 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -33,7 +33,7 @@ * Added support for RSACng and DSACng. (issue #567) * Dropped Xamarin platforms since they are compatible with netstandard2.0. - Xamarin Inc. + .NET Foundation and Contributors en-US mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index e0e81c117d..655b6b9798 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -31,7 +31,7 @@ * Added new MailboxAddress.GetAddress(bool idnEncode) method. * Dropped Xamarin platforms since they are compatible with netstandard2.0. - Xamarin Inc. + .NET Foundation and Contributors en-US mime mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 From ebbb75f8c9ca5f9e4fe424ca4f9c8d838d09671a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 10:09:41 -0400 Subject: [PATCH 586/741] FIxed RSA conversion unit test to pass with RSACng --- .../AsymmetricAlgorithmExtensionTests.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index 1e14123b1d..1e6daa3749 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -122,8 +122,8 @@ public void TestRsa () // first, check private key conversion var expected = rsa.ExportParameters (true); var keyParameter = rsa.AsAsymmetricKeyParameter (); - var windows = keyParameter.AsAsymmetricAlgorithm () as RSACryptoServiceProvider; - var actual = windows.ExportParameters (true); + var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as RSA; + var actual = asymmetricAlgorithm.ExportParameters (true); AssertAreEqual (expected.D, actual.D, "D"); AssertAreEqual (expected.DP, actual.DP, "DP"); @@ -136,8 +136,8 @@ public void TestRsa () // test AsymmetricCipherKeyPair conversion var keyPair = rsa.AsAsymmetricCipherKeyPair (); - windows = keyPair.AsAsymmetricAlgorithm () as RSACryptoServiceProvider; - actual = windows.ExportParameters (true); + asymmetricAlgorithm = keyPair.AsAsymmetricAlgorithm () as RSA; + actual = asymmetricAlgorithm.ExportParameters (true); AssertAreEqual (expected.D, actual.D, "D"); AssertAreEqual (expected.DP, actual.DP, "DP"); @@ -154,8 +154,8 @@ public void TestRsa () pubrsa.ImportParameters (expected); keyParameter = pubrsa.AsAsymmetricKeyParameter (); - windows = keyParameter.AsAsymmetricAlgorithm () as RSACryptoServiceProvider; - actual = windows.ExportParameters (false); + asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as RSA; + actual = asymmetricAlgorithm.ExportParameters (false); AssertAreEqual (expected.D, actual.D, "D"); AssertAreEqual (expected.DP, actual.DP, "DP"); From c9fa0e24d2f15f066622b83e4d9c46357aa3d88b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 10:40:40 -0400 Subject: [PATCH 587/741] Protect against ABRs in AuthenticationResults.TryParse Fixes issue #581 --- MimeKit/Cryptography/AuthenticationResults.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 8e6244c6b1..b70de79c5a 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -654,7 +654,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro int valueIndex = index; - if (!SkipPropertyValue (text, ref index, endIndex, out quoted)) { + if (index >= text.Length || !SkipPropertyValue (text, ref index, endIndex, out quoted)) { if (throwOnError) throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); From d559ed3662c1e6c0768a9065f40c6b08c9936520 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 11:11:19 -0400 Subject: [PATCH 588/741] Fixed TestHelper to be more robust --- UnitTests/TestHelper.cs | 43 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/UnitTests/TestHelper.cs b/UnitTests/TestHelper.cs index ddbb339ecf..a0ead40d15 100644 --- a/UnitTests/TestHelper.cs +++ b/UnitTests/TestHelper.cs @@ -24,34 +24,33 @@ // THE SOFTWARE. // - using System; using System.IO; -namespace UnitTests -{ - static class TestHelper - { - public static readonly string ProjectDir; +namespace UnitTests { + static class TestHelper + { + public static readonly string ProjectDir; - static TestHelper () - { - var codeBase = typeof (TestHelper).Assembly.CodeBase; - if (codeBase.StartsWith ("file://", StringComparison.OrdinalIgnoreCase)) - codeBase = codeBase.Substring ("file://".Length); + static TestHelper () + { + var codeBase = typeof (TestHelper).Assembly.CodeBase; + if (codeBase.StartsWith ("file://", StringComparison.OrdinalIgnoreCase)) + codeBase = codeBase.Substring ("file://".Length); - if (Path.DirectorySeparatorChar == '\\') { - if (codeBase[0] == '/') - codeBase = codeBase.Substring (1); + if (Path.DirectorySeparatorChar == '\\') { + if (codeBase[0] == '/') + codeBase = codeBase.Substring (1); - codeBase = codeBase.Replace ('/', '\\'); - } + codeBase = codeBase.Replace ('/', '\\'); + } + + var dir = Path.GetDirectoryName (codeBase); - var codeBaseDir = Path.GetDirectoryName (codeBase); - var binDir = Path.Combine (codeBaseDir, ".."); - var projectDir = Path.Combine (binDir, ".."); + while (Path.GetFileName (dir) != "UnitTests") + dir = Path.GetFullPath (Path.Combine (dir, "..")); - ProjectDir = Path.GetFullPath (projectDir); - } - } + ProjectDir = Path.GetFullPath (dir); + } + } } From 6d5a3a91c75b53d04b04ce1521e890e5b1668ff0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 19:41:27 -0400 Subject: [PATCH 589/741] Fixed DSACng tests --- .../Cryptography/AsymmetricAlgorithmExtensions.cs | 2 +- .../AsymmetricAlgorithmExtensionTests.cs | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 36dbb1b4d4..d7bd754cde 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -266,7 +266,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPrivateKeyParameters key, #if NET45 || NET46 || NETSTANDARD2_0 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); #else - var dsa = new DSACng (); + var dsa = pub != null ? (DSA) new DSACng () : (DSA) new DSACryptoServiceProvider (); #endif dsa.ImportParameters (parameters); diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index 1e6daa3749..aab13c4c51 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -72,8 +72,8 @@ public void TestDsa () // first, check private key conversion var expected = dsa.ExportParameters (true); var keyParameter = dsa.AsAsymmetricKeyParameter (); - var windows = keyParameter.AsAsymmetricAlgorithm () as DSACryptoServiceProvider; - var actual = windows.ExportParameters (true); + var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; + var actual = asymmetricAlgorithm.ExportParameters (true); Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); AssertAreEqual (expected.Seed, actual.Seed, "Seed"); @@ -85,8 +85,8 @@ public void TestDsa () // test AsymmetricCipherKeyPair conversion var keyPair = dsa.AsAsymmetricCipherKeyPair (); - windows = keyPair.AsAsymmetricAlgorithm () as DSACryptoServiceProvider; - actual = windows.ExportParameters (true); + asymmetricAlgorithm = keyPair.AsAsymmetricAlgorithm () as DSA; + actual = asymmetricAlgorithm.ExportParameters (true); Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); AssertAreEqual (expected.Seed, actual.Seed, "Seed"); @@ -102,8 +102,8 @@ public void TestDsa () pubdsa.ImportParameters (expected); keyParameter = pubdsa.AsAsymmetricKeyParameter (); - windows = keyParameter.AsAsymmetricAlgorithm () as DSACryptoServiceProvider; - actual = windows.ExportParameters (false); + asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; + actual = asymmetricAlgorithm.ExportParameters (false); Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); AssertAreEqual (expected.Seed, actual.Seed, "Seed"); From 62239afdcd79a2fc477b6b16306b75c93e7b8f5f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 21:48:47 -0400 Subject: [PATCH 590/741] Dropped the Net45-specific projects/solutions Added net45 to the .NetStandard projects and renamed them to MimeKit.csproj and MimeKitLite.csproj This also gets the unit tests working in Visual Studio on Windows after I gave up trying to get them to work with MimeKit.Net45.csproj due to NUnit3 being unable to load BouncyCastle because it was brokenly named BouncyCastle.Crypto.dll. The net45 version of MimeKit now also depends on Portable.BouncyCastle instead of the official BouncyCastle nuget package. --- Documentation/Documentation.shfbproj | 13 +- MimeKit.Documentation.sln | 31 +- MimeKit.Net45.sln | 87 ----- MimeKit.sln | 28 +- MimeKit/MimeKit.Net45.csproj | 297 ------------------ MimeKit/MimeKit.Net45.project.json | 12 - ...eKit.NetStandard.csproj => MimeKit.csproj} | 2 +- MimeKit/MimeKitLite.Net45.csproj | 225 ------------- MimeKit/MimeKitLite.Net45.project.json | 9 - ....NetStandard.csproj => MimeKitLite.csproj} | 2 +- MimeKit/packages.MimeKit.Net45.config | 4 - MimeKitLite.sln | 17 +- README.md | 2 +- UnitTests/UnitTests.csproj | 95 ++---- UnitTests/packages.config | 9 - appveyor.yml | 4 +- 16 files changed, 58 insertions(+), 779 deletions(-) delete mode 100644 MimeKit.Net45.sln delete mode 100644 MimeKit/MimeKit.Net45.csproj delete mode 100644 MimeKit/MimeKit.Net45.project.json rename MimeKit/{MimeKit.NetStandard.csproj => MimeKit.csproj} (99%) delete mode 100644 MimeKit/MimeKitLite.Net45.csproj delete mode 100644 MimeKit/MimeKitLite.Net45.project.json rename MimeKit/{MimeKitLite.NetStandard.csproj => MimeKitLite.csproj} (99%) delete mode 100644 MimeKit/packages.MimeKit.Net45.config delete mode 100644 UnitTests/packages.config diff --git a/Documentation/Documentation.shfbproj b/Documentation/Documentation.shfbproj index b8d1ac3663..56c2af87e5 100644 --- a/Documentation/Documentation.shfbproj +++ b/Documentation/Documentation.shfbproj @@ -1,5 +1,5 @@ - + @@ -7,7 +7,7 @@ AnyCPU 2.0 59115814-a1e3-46ae-ae30-4065ae8f4caf - 1.9.9.0 + 2017.9.26.0 Documentation Documentation @@ -117,17 +117,12 @@ - - BouncyCastle - {4c235092-820c-4deb-9074-d356fb797d8b} - True - MimeKit - {d5f54a4f-d84b-430f-9271-f7861e285b3e} + {76894ada-0818-4556-83bd-6510d8ea2809} True - + \ No newline at end of file diff --git a/MimeKit.Documentation.sln b/MimeKit.Documentation.sln index 3d20677c84..fc9df2585c 100644 --- a/MimeKit.Documentation.sln +++ b/MimeKit.Documentation.sln @@ -1,31 +1,31 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30204.135 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncyCastle", "submodules\bc-csharp\crypto\BouncyCastle.csproj", "{4C235092-820C-4DEB-9074-D356FB797D8B}" -EndProject Project("{7CF6DF6D-3B04-46F8-A40B-537D21BCA0B4}") = "Documentation", "Documentation\Documentation.shfbproj", "{59115814-A1E3-46AE-AE30-4065AE8F4CAF}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "MimeKit\MimeKit.csproj", "{76894ADA-0818-4556-83BD-6510D8EA2809}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4C235092-820C-4DEB-9074-D356FB797D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C235092-820C-4DEB-9074-D356FB797D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C235092-820C-4DEB-9074-D356FB797D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C235092-820C-4DEB-9074-D356FB797D8B}.Release|Any CPU.Build.0 = Release|Any CPU {59115814-A1E3-46AE-AE30-4065AE8F4CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59115814-A1E3-46AE-AE30-4065AE8F4CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU {59115814-A1E3-46AE-AE30-4065AE8F4CAF}.Release|Any CPU.Build.0 = Release|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.Build.0 = Release|Any CPU + {76894ADA-0818-4556-83BD-6510D8EA2809}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76894ADA-0818-4556-83BD-6510D8EA2809}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76894ADA-0818-4556-83BD-6510D8EA2809}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76894ADA-0818-4556-83BD-6510D8EA2809}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {59220391-9856-4F95-AC74-AD4BC4FF2011} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0 @@ -38,7 +38,4 @@ Global $2.inheritsSet = VisualStudio $2.inheritsScope = text/plain EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection EndGlobal diff --git a/MimeKit.Net45.sln b/MimeKit.Net45.sln deleted file mode 100644 index ff64820867..0000000000 --- a/MimeKit.Net45.sln +++ /dev/null @@ -1,87 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30114.105 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "UnitTests\UnitTests.csproj", "{0225FDB7-CF63-4402-BB30-9B149AC06C2E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{C2CA4C1F-78BB-41D1-8E31-F723FC88CF38}" - ProjectSection(SolutionItems) = preProject - .nuget\packages.config = .nuget\packages.config - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C21FE6EC-A72D-4501-89BE-1F2B5C70282A}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.Build.0 = Release|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.Build.0 = Release|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B61AEE43-BAA2-43BA-B535-912223825C5B} - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - Policies = $0 - $0.StandardHeader = $1 - $1.Text = @\n${FileName}\n \nAuthor: ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n - $0.TextStylePolicy = $4 - $2.scope = text/plain - $2.EolMarker = Unix - $0.CSharpFormattingPolicy = $3 - $3.NamespaceBraceStyle = EndOfLine - $3.StructBraceStyle = EndOfLine - $3.EnumBraceStyle = EndOfLine - $3.AfterDelegateDeclarationParameterComma = True - $3.BeforeSizeOfParentheses = True - $3.BeforeTypeOfParentheses = True - $3.SpacesBeforeBrackets = False - $3.SpacesAfterTypecast = True - $3.AlignToFirstIndexerArgument = True - $3.scope = text/x-csharp - $3.SpaceAfterCast = True - $3.IndentSwitchSection = False - $3.NewLinesForBracesInProperties = False - $3.NewLinesForBracesInAccessors = False - $3.NewLinesForBracesInAnonymousMethods = False - $3.NewLinesForBracesInControlBlocks = False - $3.NewLinesForBracesInAnonymousTypes = False - $3.NewLinesForBracesInObjectCollectionArrayInitializers = False - $3.NewLinesForBracesInLambdaExpressionBody = False - $3.NewLineForElse = False - $3.NewLineForCatch = False - $3.NewLineForFinally = False - $3.NewLineForClausesInQuery = False - $3.SpacingAfterMethodDeclarationName = True - $3.SpaceAfterMethodCallName = True - $4.FileWidth = 120 - $4.TabsToSpaces = False - $4.EolMarker = Unix - $4.inheritsSet = VisualStudio - $4.inheritsScope = text/plain - $4.scope = text/plain - EndGlobalSection -EndGlobal diff --git a/MimeKit.sln b/MimeKit.sln index 25eda090b2..9847b791be 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -3,17 +3,19 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4B4EB921-F77E-4A51-897F-BBA7FA3E3468}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "UnitTests\UnitTests.csproj", "{0225FDB7-CF63-4402-BB30-9B149AC06C2E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "MimeKit\MimeKit.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit.NetStandard", "MimeKit\MimeKit.NetStandard.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4B4EB921-F77E-4A51-897F-BBA7FA3E3468}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "UnitTests\UnitTests.csproj", "{88EC8D73-8099-4DD6-B78B-C21FCED97EA1}" + ProjectSection(ProjectDependencies) = postProject + {F26434C1-BA3D-41FB-B560-C009CB72B1B6} = {F26434C1-BA3D-41FB-B560-C009CB72B1B6} + {E8667DCE-A5BB-4D30-9815-FC8959E447F5} = {E8667DCE-A5BB-4D30-9815-FC8959E447F5} EndProjectSection EndProject Global @@ -22,14 +24,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.Build.0 = Release|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E}.Release|Any CPU.Build.0 = Release|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -38,6 +32,10 @@ Global {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.Build.0 = Debug|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.ActiveCfg = Release|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.Build.0 = Release|Any CPU + {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MimeKit/MimeKit.Net45.csproj b/MimeKit/MimeKit.Net45.csproj deleted file mode 100644 index 76c95dbe86..0000000000 --- a/MimeKit/MimeKit.Net45.csproj +++ /dev/null @@ -1,297 +0,0 @@ - - - - Debug - AnyCPU - AnyCPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E} - .NETFramework - v4.5 - Library - Properties - MimeKit - MimeKit - 512 - 8.0.30703 - 2.0 - - - True - full - False - bin\Debug\net45 - obj\Debug\net45 - DEBUG;TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NETFRAMEWORK;NET45 - prompt - 4 - True - - - true - portable - True - bin\Release\net45 - obj\Release\net45 - TRACE;SERIALIZABLE;ENABLE_CRYPTO;ENABLE_SNM;NETFRAMEWORK;NET45 - prompt - 4 - true - bin\Release\net45\MimeKit.xml - - - true - - - mimekit.snk - - - - - - - - - - - - ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MimeKit/MimeKit.Net45.project.json b/MimeKit/MimeKit.Net45.project.json deleted file mode 100644 index 44c64a7cbd..0000000000 --- a/MimeKit/MimeKit.Net45.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "frameworks": { - ".NETFramework,Version=v4.5": {} - }, - "runtimes": { - "win-anycpu": {}, - "win": {} - }, - "dependencies": { - "BouncyCastle": "1.8.5" - } -} \ No newline at end of file diff --git a/MimeKit/MimeKit.NetStandard.csproj b/MimeKit/MimeKit.csproj similarity index 99% rename from MimeKit/MimeKit.NetStandard.csproj rename to MimeKit/MimeKit.csproj index d1daf05b00..c7488f599e 100644 --- a/MimeKit/MimeKit.NetStandard.csproj +++ b/MimeKit/MimeKit.csproj @@ -5,7 +5,7 @@ MimeKit 2.8.0 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 + netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 true false MimeKit diff --git a/MimeKit/MimeKitLite.Net45.csproj b/MimeKit/MimeKitLite.Net45.csproj deleted file mode 100644 index 08d244bfff..0000000000 --- a/MimeKit/MimeKitLite.Net45.csproj +++ /dev/null @@ -1,225 +0,0 @@ - - - - Debug - AnyCPU - 10.0.0 - 2.0 - {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7} - v4.5 - Library - Properties - MimeKit - MimeKitLite - 512 - - - True - full - False - bin\Debug\net45 - obj\Debug\net45 - DEBUG;TRACE;SERIALIZABLE;ENABLE_SNM;NETFRAMEWORK;NET45 - prompt - 4 - True - - - true - portable - True - bin\Release\net45 - obj\Release\net45 - TRACE;SERIALIZABLE;ENABLE_SNM;NETFRAMEWORK;NET45 - prompt - 4 - true - bin\Release\net45\MimeKitLite.xml - - - true - - - mimekit.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HtmlEntityDecoder.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MimeKit/MimeKitLite.Net45.project.json b/MimeKit/MimeKitLite.Net45.project.json deleted file mode 100644 index 7b2e820fd1..0000000000 --- a/MimeKit/MimeKitLite.Net45.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "frameworks": { - "net45": {} - }, - "runtimes": { - "win-anycpu": {}, - "win": {} - } -} diff --git a/MimeKit/MimeKitLite.NetStandard.csproj b/MimeKit/MimeKitLite.csproj similarity index 99% rename from MimeKit/MimeKitLite.NetStandard.csproj rename to MimeKit/MimeKitLite.csproj index c85c2bd4d4..a5b2ec21e9 100644 --- a/MimeKit/MimeKitLite.NetStandard.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -5,7 +5,7 @@ MimeKit Lite 2.8.0 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net46;net47;net48 + netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 true false MimeKitLite diff --git a/MimeKit/packages.MimeKit.Net45.config b/MimeKit/packages.MimeKit.Net45.config deleted file mode 100644 index 0e7768b942..0000000000 --- a/MimeKit/packages.MimeKit.Net45.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/MimeKitLite.sln b/MimeKitLite.sln index 17adcdd468..c3a067b93f 100644 --- a/MimeKitLite.sln +++ b/MimeKitLite.sln @@ -3,25 +3,19 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKitLite.Net45", "MimeKit\MimeKitLite.Net45.csproj", "{B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKitLite.NetStandard", "MimeKit\MimeKitLite.NetStandard.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A56B6ECE-F1EE-41A2-A92B-18D2BDAFB6A2}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKitLite", "MimeKit\MimeKitLite.csproj", "{23F999AF-CF50-42FF-A011-D56D68E60FB9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B4DA3323-F83C-4731-BE30-B1DA19B8C3E7}.Release|Any CPU.Build.0 = Release|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Debug|Any CPU.Build.0 = Debug|Any CPU {23F999AF-CF50-42FF-A011-D56D68E60FB9}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -33,11 +27,4 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E07F961-6E08-4E6A-AF55-EC1428E15EAD} EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = MimeKit\MimeKitLite.Net45.csproj - Policies = $0 - $0.StandardHeader = $1 - $1.Text = @\n${FileName}\n \nAuthor: ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) ${Year} ${CopyrightHolder}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n - $0.TextStylePolicy = $4 - EndGlobalSection EndGlobal diff --git a/README.md b/README.md index da3338ea95..533317f87a 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ directory and select **Git Sync...** in the menu. Once you do that, you'll need In the top-level MimeKit directory, there are a number of solution files; they are: * **MimeKit.sln** - includes projects for .NET 4.5/4.6/4.7/4.8, .NETStandard 1.3/1.6/2.0 as well as the unit tests. -* **MimeKit.Net45.sln** - includes only the .NET 4.5 project and the unit tests. +* **MimeKitLite.sln** - includes projects for the stripped-down versions of MimeKit that drop support for crypto. Once you've opened the appropriate MimeKit solution file in [Visual Studio](https://www.visualstudio.com/downloads/), you can choose the **Debug** or **Release** build configuration and then build. diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 353915c20e..97c2068246 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,77 +1,31 @@ - - - - + + - Debug - AnyCPU - {0225FDB7-CF63-4402-BB30-9B149AC06C2E} - v4.5 - Library - UnitTests + net48 UnitTests - 8.0.30703 - 2.0 - - true ..\MimeKit\mimekit.snk - true - false - false - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - 612 - true - - - full - true - bin\Release - prompt - 4 - false - true + false + false + - - - ..\packages\System.Data.SQLite.Core.1.0.112.2\lib\net40\System.Data.SQLite.dll - - - - - ..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll - - - - - ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - - ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - + + + + + + + + + - - {D5F54A4F-D84B-430F-9271-F7861E285B3E} - MimeKit.Net45 - - - {F26434C1-BA3D-41FB-B560-C009CB72B1B6} - Mono.Data.Sqlite - + + + @@ -364,15 +318,6 @@ - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file + + diff --git a/UnitTests/packages.config b/UnitTests/packages.config deleted file mode 100644 index 97e1356de6..0000000000 --- a/UnitTests/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/appveyor.yml b/appveyor.yml index f9fd724d00..63a162c0f5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,10 +15,10 @@ environment: install: - cmd: git submodule update --init --recursive -- cmd: nuget restore MimeKit.Net45.sln +- cmd: dotnet restore MimeKit.sln build: - project: MimeKit.Net45.sln + project: MimeKit.sln verbosity: minimal parallel: true From 3a5616fc7920d8f36e2821d9b239f2597fe5eb76 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 21:53:48 -0400 Subject: [PATCH 591/741] Update .travis.yml --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a3f368ebf..44a477301e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: csharp -solution: MimeKit.Net45.sln +solution: MimeKit.sln install: - - nuget restore MimeKit.Net45.sln + - dotnet restore MimeKit.sln script: - msbuild /p:Configuration=Debug MimeKit.Net45.sln - - mono ./packages/NUnit.ConsoleRunner.3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/UnitTests.dll + - dotnet ./packages/NUnit.ConsoleRunner.3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/UnitTests.dll From c5f930200a93b2b2c07824b0615eb80dcd0d0f94 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 22:17:52 -0400 Subject: [PATCH 592/741] Try to get opencover/coveralls to work again --- UnitTests/UnitTests.csproj | 12 ++++++++++-- appveyor.yml | 6 +++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 97c2068246..42202a7f07 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -1,4 +1,4 @@ - + net48 @@ -14,10 +14,18 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/appveyor.yml b/appveyor.yml index 63a162c0f5..4450d7f1be 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,10 +24,10 @@ build: test_script: - ps: >- - regsvr32 .\packages\OpenCover.4.6.519\tools\x86\OpenCover.Profiler.dll + regsvr32 .\packages\OpenCover.4.7.922\tools\x86\OpenCover.Profiler.dll - regsvr32 .\packages\OpenCover.4.6.519\tools\x64\OpenCover.Profiler.dll + regsvr32 .\packages\OpenCover.4.7.922\tools\x64\OpenCover.Profiler.dll - .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml + .\packages\OpenCover.4.7.922\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From 6c8d76cce450fb4c889c2a7abd1ca22d4d03c6c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 22:30:13 -0400 Subject: [PATCH 593/741] Update appveyor.yml --- appveyor.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 4450d7f1be..8602c4c4b0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,11 +23,11 @@ build: parallel: true test_script: -- ps: >- - regsvr32 .\packages\OpenCover.4.7.922\tools\x86\OpenCover.Profiler.dll +- cmd: >- + regsvr32 %USERPROFILE%\.nuget\packages\opencover\4.7.922\tools\x86\OpenCover.Profiler.dll - regsvr32 .\packages\OpenCover.4.7.922\tools\x64\OpenCover.Profiler.dll + regsvr32 %USERPROFILE%\.nuget\packages\opencover\4.7.922\tools\x64\OpenCover.Profiler.dll - .\packages\OpenCover.4.7.922\tools\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml + %USERPROFILE%\.nuget\packages\opencover\4.7.922\tools\x64\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%USERPROFILE%\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml - .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor + %USERPROFILE%\.nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor From bc151d79a7a932a16dc0f24c15f47d7691e90e4c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 22:44:26 -0400 Subject: [PATCH 594/741] Updated appveyor.yml --- appveyor.bat | 12 ++++++++++++ appveyor.yml | 9 +-------- 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 appveyor.bat diff --git a/appveyor.bat b/appveyor.bat new file mode 100644 index 0000000000..911174d5a3 --- /dev/null +++ b/appveyor.bat @@ -0,0 +1,12 @@ +SET NUNITRUNNER=%USERPROFILE%\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe +SET COVERALLS=%USERPROFILE%\.nuget\packages\coveralls.net\tools +SET OPENCOVER=%USERPROFILE%\.nuget\packages\opencover\4.7.922\tools +SET OPENCOVER32=%OPENCOVER%\x86 +SET OPENCOVER64=%OPENCOVER%\x64 + +regsvr32 %OPENCOVER32%\OpenCover.Profiler.dll +regsvr32 %OPENCOVER64%\OpenCover.Profiler.dll + +%OPENCOVER64%\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%NUNITRUNNER%" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml + +%COVERALLS%\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken %COVERALLS_REPO_TOKEN% --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId %APPVEYOR_REPO_COMMIT% --commitBranch %APPVEYOR_REPO_BRANCH% --commitAuthor %APPVEYOR_REPO_COMMIT_AUTHOR% --commitEmail %APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL% --commitMessage %APPVEYOR_REPO_COMMIT_MESSAGE% --jobId %APPVEYOR_BUILD_NUMBER% --serviceName appveyor diff --git a/appveyor.yml b/appveyor.yml index 8602c4c4b0..34cb8e4632 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,11 +23,4 @@ build: parallel: true test_script: -- cmd: >- - regsvr32 %USERPROFILE%\.nuget\packages\opencover\4.7.922\tools\x86\OpenCover.Profiler.dll - - regsvr32 %USERPROFILE%\.nuget\packages\opencover\4.7.922\tools\x64\OpenCover.Profiler.dll - - %USERPROFILE%\.nuget\packages\opencover\4.7.922\tools\x64\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%USERPROFILE%\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml - - %USERPROFILE%\.nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_BUILD_NUMBER --serviceName appveyor +- cmd: appveyor.bat From ecac98761baa459f723662e1e3263d38f7916730 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 22:57:04 -0400 Subject: [PATCH 595/741] Update appveyor.bat --- appveyor.bat | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/appveyor.bat b/appveyor.bat index 911174d5a3..0a3b876af0 100644 --- a/appveyor.bat +++ b/appveyor.bat @@ -1,12 +1,9 @@ SET NUNITRUNNER=%USERPROFILE%\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe SET COVERALLS=%USERPROFILE%\.nuget\packages\coveralls.net\tools SET OPENCOVER=%USERPROFILE%\.nuget\packages\opencover\4.7.922\tools -SET OPENCOVER32=%OPENCOVER%\x86 -SET OPENCOVER64=%OPENCOVER%\x64 -regsvr32 %OPENCOVER32%\OpenCover.Profiler.dll -regsvr32 %OPENCOVER64%\OpenCover.Profiler.dll +regsvr32 %OPENCOVER%\OpenCover.Profiler.dll -%OPENCOVER64%\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%NUNITRUNNER%" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml +%OPENCOVER%\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%NUNITRUNNER%" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml %COVERALLS%\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken %COVERALLS_REPO_TOKEN% --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId %APPVEYOR_REPO_COMMIT% --commitBranch %APPVEYOR_REPO_BRANCH% --commitAuthor %APPVEYOR_REPO_COMMIT_AUTHOR% --commitEmail %APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL% --commitMessage %APPVEYOR_REPO_COMMIT_MESSAGE% --jobId %APPVEYOR_BUILD_NUMBER% --serviceName appveyor From 4cf9005c6d62981e5b03e956ba324b391c0cf46c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 23:08:36 -0400 Subject: [PATCH 596/741] Update appveyor.bat --- appveyor.bat | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/appveyor.bat b/appveyor.bat index 0a3b876af0..37e9615269 100644 --- a/appveyor.bat +++ b/appveyor.bat @@ -1,9 +1,8 @@ SET NUNITRUNNER=%USERPROFILE%\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe -SET COVERALLS=%USERPROFILE%\.nuget\packages\coveralls.net\tools +SET COVERALLS=%USERPROFILE%\.nuget\packages\coveralls.net\0.7.0\tools SET OPENCOVER=%USERPROFILE%\.nuget\packages\opencover\4.7.922\tools +SET OUTPUTDIR=UnitTests\bin\Debug\net48 -regsvr32 %OPENCOVER%\OpenCover.Profiler.dll +%OPENCOVER%\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%NUNITRUNNER%" -targetargs:"/domain:single %OUTPUTDIR%\UnitTests.dll" -output:opencover.xml -%OPENCOVER%\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%NUNITRUNNER%" -targetargs:"/domain:single UnitTests\bin\Debug\UnitTests.dll" -output:opencover.xml - -%COVERALLS%\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken %COVERALLS_REPO_TOKEN% --useRelativePaths --basePath .\UnitTests\bin\Debug --commitId %APPVEYOR_REPO_COMMIT% --commitBranch %APPVEYOR_REPO_BRANCH% --commitAuthor %APPVEYOR_REPO_COMMIT_AUTHOR% --commitEmail %APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL% --commitMessage %APPVEYOR_REPO_COMMIT_MESSAGE% --jobId %APPVEYOR_BUILD_NUMBER% --serviceName appveyor +%COVERALLS%\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken %COVERALLS_REPO_TOKEN% --useRelativePaths --basePath %OUTPUTDIR% --commitId %APPVEYOR_REPO_COMMIT% --commitBranch %APPVEYOR_REPO_BRANCH% --commitAuthor %APPVEYOR_REPO_COMMIT_AUTHOR% --commitEmail %APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL% --commitMessage %APPVEYOR_REPO_COMMIT_MESSAGE% --jobId %APPVEYOR_BUILD_NUMBER% --serviceName appveyor From cad2d98635f16db496cde25d4496cc7998b5bcd8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 10 Jun 2020 23:12:57 -0400 Subject: [PATCH 597/741] Update UnitTests.csproj --- UnitTests/UnitTests.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 42202a7f07..578f7abaf2 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -20,6 +20,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive From e75b95bcfa816f258c312f25b5ddec8dff0d1b45 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 08:39:07 -0400 Subject: [PATCH 598/741] Always convert TO a *CryptoServiceProvider X509Certificate2.PrivateKey does not allow assignment for any type of key except those that implement the CryptoServiceProvider interface (which the *Cng implementations do not). This was discovered after running the tests on net47 and net48. --- .../AsymmetricAlgorithmExtensions.cs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index d7bd754cde..8feccef902 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -263,11 +263,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPrivateKeyParameters key, if (pub != null) parameters.Y = pub.Y.ToByteArrayUnsigned (); -#if NET45 || NET46 || NETSTANDARD2_0 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); -#else - var dsa = pub != null ? (DSA) new DSACng () : (DSA) new DSACryptoServiceProvider (); -#endif dsa.ImportParameters (parameters); @@ -279,11 +275,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (DsaPublicKeyParameters key) var parameters = GetDSAParameters (key); parameters.Y = key.Y.ToByteArrayUnsigned (); -#if NET45 || NET46 || NETSTANDARD2_0 || __MOBILE__ var dsa = new DSACryptoServiceProvider (); -#else - var dsa = new DSACng (); -#endif dsa.ImportParameters (parameters); @@ -304,11 +296,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaPrivateCrtKeyParameters ke parameters.DP = GetPaddedByteArray (key.DP, parameters.P.Length); parameters.DQ = GetPaddedByteArray (key.DQ, parameters.Q.Length); -#if NET45 || NETSTANDARD2_0 || __MOBILE__ var rsa = new RSACryptoServiceProvider (); -#else - var rsa = new RSACng (); -#endif rsa.ImportParameters (parameters); @@ -321,11 +309,7 @@ static AsymmetricAlgorithm GetAsymmetricAlgorithm (RsaKeyParameters key) parameters.Exponent = key.Exponent.ToByteArrayUnsigned (); parameters.Modulus = key.Modulus.ToByteArrayUnsigned (); -#if NET45 || NETSTANDARD2_0 || __MOBILE__ var rsa = new RSACryptoServiceProvider (); -#else - var rsa = new RSACng (); -#endif rsa.ImportParameters (parameters); From 5cabd9ff8244d398d7ad792727334fcbc0d089ef Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 08:48:19 -0400 Subject: [PATCH 599/741] Update .travis.yml --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 44a477301e..84b3956c63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,9 @@ language: csharp +mono: none +dotnet: 2.1.807 solution: MimeKit.sln install: - dotnet restore MimeKit.sln script: - - msbuild /p:Configuration=Debug MimeKit.Net45.sln - - dotnet ./packages/NUnit.ConsoleRunner.3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/UnitTests.dll + - msbuild /p:Configuration=Debug MimeKit.sln + - dotnet ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll From 81ca2072346168ce1835d6585b305fccbc5f5b34 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 09:09:40 -0400 Subject: [PATCH 600/741] Fixed MimeParser tests to use an auto-detected new-line format when writing the mbox --- UnitTests/MimeParserTests.cs | 40 ++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index fc9636970c..bd25b6daaf 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -568,6 +568,26 @@ public void TestEmptyMultipartAlternative () } } + static NewLineFormat DetectNewLineFormat (string fileName) + { + using (var stream = File.OpenRead (fileName)) { + var buffer = new byte[1024]; + + var nread = stream.Read (buffer, 0, buffer.Length); + + for (int i = 0; i < nread; i++) { + if (buffer[i] == (byte) '\n') { + if (i > 0 && buffer[i - 1] == (byte) '\r') + return NewLineFormat.Dos; + + return NewLineFormat.Unix; + } + } + } + + return NewLineFormat.Dos; + } + static void AssertMboxResults (string baseName, string actual, Stream output) { // WORKAROUND: Mono's iso-2022-jp decoder breaks on this input in versions <= 3.2.3 but is fixed in 3.2.4+ @@ -615,13 +635,17 @@ static void AssertMboxResults (string baseName, string actual, Stream output) void TestMbox (ParserOptions options, string baseName) { + var mbox = Path.Combine (MboxDataDir, baseName + ".mbox.txt"); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { + using (var stream = File.OpenRead (mbox)) { var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); + var format = FormatOptions.Default.Clone (); int count = 0; + format.NewLineFormat = DetectNewLineFormat (mbox); + while (!parser.IsEndOfStream) { var message = parser.ParseMessage (); @@ -635,9 +659,9 @@ void TestMbox (ParserOptions options, string baseName) DumpMimeTree (builder, message); builder.Append ('\n'); - var marker = Encoding.UTF8.GetBytes ((count > 0 ? Environment.NewLine : string.Empty) + parser.MboxMarker + Environment.NewLine); + var marker = Encoding.UTF8.GetBytes ((count > 0 ? format.NewLine : string.Empty) + parser.MboxMarker + format.NewLine); output.Write (marker, 0, marker.Length); - message.WriteTo (output); + message.WriteTo (format, output); count++; } } @@ -647,13 +671,17 @@ void TestMbox (ParserOptions options, string baseName) async Task TestMboxAsync (ParserOptions options, string baseName) { + var mbox = Path.Combine (MboxDataDir, baseName + ".mbox.txt"); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - using (var stream = File.OpenRead (Path.Combine (MboxDataDir, baseName + ".mbox.txt"))) { + using (var stream = File.OpenRead (mbox)) { var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); + var format = FormatOptions.Default.Clone (); int count = 0; + format.NewLineFormat = DetectNewLineFormat (mbox); + while (!parser.IsEndOfStream) { var message = await parser.ParseMessageAsync (); @@ -667,9 +695,9 @@ async Task TestMboxAsync (ParserOptions options, string baseName) DumpMimeTree (builder, message); builder.Append ('\n'); - var marker = Encoding.UTF8.GetBytes ((count > 0 ? Environment.NewLine : string.Empty) + parser.MboxMarker + Environment.NewLine); + var marker = Encoding.UTF8.GetBytes ((count > 0 ? format.NewLine : string.Empty) + parser.MboxMarker + format.NewLine); await output.WriteAsync (marker, 0, marker.Length); - await message.WriteToAsync (output); + await message.WriteToAsync (format, output); count++; } } From a48d8b0b682bf89c413b339296b76302cf82395e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 09:28:50 -0400 Subject: [PATCH 601/741] Updated appveyor.yml --- appveyor.bat | 8 -------- appveyor.yml | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) delete mode 100644 appveyor.bat diff --git a/appveyor.bat b/appveyor.bat deleted file mode 100644 index 37e9615269..0000000000 --- a/appveyor.bat +++ /dev/null @@ -1,8 +0,0 @@ -SET NUNITRUNNER=%USERPROFILE%\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe -SET COVERALLS=%USERPROFILE%\.nuget\packages\coveralls.net\0.7.0\tools -SET OPENCOVER=%USERPROFILE%\.nuget\packages\opencover\4.7.922\tools -SET OUTPUTDIR=UnitTests\bin\Debug\net48 - -%OPENCOVER%\OpenCover.Console.exe -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"%NUNITRUNNER%" -targetargs:"/domain:single %OUTPUTDIR%\UnitTests.dll" -output:opencover.xml - -%COVERALLS%\csmacnz.Coveralls.exe --opencover -i opencover.xml --repoToken %COVERALLS_REPO_TOKEN% --useRelativePaths --basePath %OUTPUTDIR% --commitId %APPVEYOR_REPO_COMMIT% --commitBranch %APPVEYOR_REPO_BRANCH% --commitAuthor %APPVEYOR_REPO_COMMIT_AUTHOR% --commitEmail %APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL% --commitMessage %APPVEYOR_REPO_COMMIT_MESSAGE% --jobId %APPVEYOR_BUILD_NUMBER% --serviceName appveyor diff --git a/appveyor.yml b/appveyor.yml index 34cb8e4632..bbee32ddc5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,3 +24,17 @@ build: test_script: - cmd: appveyor.bat +- ps: >- + $NUnitConsoleRunner = Join-Path $Env.USERPROFILE ".nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" + + $Coveralls = Join-Path $Env.USERPROFILE ".nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe" + + $OpenCover = Join-Path $Env.USERPROFILE ".nuget\packages\opencover\4.7.922\tools\OpenCover.Console.exe" + + $OutputDir = "UnitTests\bin\Debug\net48" + + $UnitTestAssembly = Join-Path $OutputDir "UnitTests.dll" + + $OpenCover -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetargs:"/domain:single $UnitTestAssembly" -output:opencover.xml + + $Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath $OutputDir --commitId $Env:APPVEYOR_REPO_COMMIT --commitBranch $Env:APPVEYOR_REPO_BRANCH --commitAuthor $Env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $Env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $Env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $Env:APPVEYOR_BUILD_NUMBER --serviceName appveyor \ No newline at end of file From 6d50ae2d0b6fd840916600a9388104e252fb72f0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 09:32:35 -0400 Subject: [PATCH 602/741] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 84b3956c63..9000df4229 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,5 +5,5 @@ solution: MimeKit.sln install: - dotnet restore MimeKit.sln script: - - msbuild /p:Configuration=Debug MimeKit.sln + - dotnet build -c Debug MimeKit.sln - dotnet ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll From 93977bef36e95f056216705a80e9e323c959a96b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 09:34:05 -0400 Subject: [PATCH 603/741] Update appveyor.yml --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index bbee32ddc5..23d925bd74 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,7 +23,6 @@ build: parallel: true test_script: -- cmd: appveyor.bat - ps: >- $NUnitConsoleRunner = Join-Path $Env.USERPROFILE ".nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" From b7d5e6eae0f7abd1a85a299252d3b8f44f471890 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 09:50:50 -0400 Subject: [PATCH 604/741] Update appveyor.yml --- appveyor.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 23d925bd74..25f7e984d2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,16 +24,16 @@ build: test_script: - ps: >- - $NUnitConsoleRunner = Join-Path $Env.USERPROFILE ".nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" + $NUnitConsoleRunner = Join-Path $Home ".nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" - $Coveralls = Join-Path $Env.USERPROFILE ".nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe" + $Coveralls = Join-Path $Home ".nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe" - $OpenCover = Join-Path $Env.USERPROFILE ".nuget\packages\opencover\4.7.922\tools\OpenCover.Console.exe" + $OpenCover = Join-Path $Home ".nuget\packages\opencover\4.7.922\tools\OpenCover.Console.exe" $OutputDir = "UnitTests\bin\Debug\net48" $UnitTestAssembly = Join-Path $OutputDir "UnitTests.dll" - $OpenCover -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetargs:"/domain:single $UnitTestAssembly" -output:opencover.xml + & $OpenCover -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetargs:"/domain:single $UnitTestAssembly" -output:opencover.xml - $Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath $OutputDir --commitId $Env:APPVEYOR_REPO_COMMIT --commitBranch $Env:APPVEYOR_REPO_BRANCH --commitAuthor $Env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $Env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $Env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $Env:APPVEYOR_BUILD_NUMBER --serviceName appveyor \ No newline at end of file + & $Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath $OutputDir --commitId $Env:APPVEYOR_REPO_COMMIT --commitBranch $Env:APPVEYOR_REPO_BRANCH --commitAuthor $Env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $Env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $Env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $Env:APPVEYOR_BUILD_NUMBER --serviceName appveyor \ No newline at end of file From bd3a29e98f3be2a25e3335607cb8fee32aee45d2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 10:28:31 -0400 Subject: [PATCH 605/741] Update appveyor.yml --- appveyor.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 25f7e984d2..a7330a53a5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -32,8 +32,6 @@ test_script: $OutputDir = "UnitTests\bin\Debug\net48" - $UnitTestAssembly = Join-Path $OutputDir "UnitTests.dll" - - & $OpenCover -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetargs:"/domain:single $UnitTestAssembly" -output:opencover.xml + & $OpenCover -register:user -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetdir:"$OutputDir" -targetargs:"--domain:single UnitTests.dll" -output:opencover.xml & $Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath $OutputDir --commitId $Env:APPVEYOR_REPO_COMMIT --commitBranch $Env:APPVEYOR_REPO_BRANCH --commitAuthor $Env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $Env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $Env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $Env:APPVEYOR_BUILD_NUMBER --serviceName appveyor \ No newline at end of file From 12a10689bcee85e46a12687424a8ff9b76aee2f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 11:11:53 -0400 Subject: [PATCH 606/741] Revert back to OpenCover 4.6.519 --- UnitTests/UnitTests.csproj | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 578f7abaf2..5427e39e3a 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -26,7 +26,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/appveyor.yml b/appveyor.yml index a7330a53a5..44fe192616 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,7 @@ test_script: $Coveralls = Join-Path $Home ".nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe" - $OpenCover = Join-Path $Home ".nuget\packages\opencover\4.7.922\tools\OpenCover.Console.exe" + $OpenCover = Join-Path $Home ".nuget\packages\opencover\4.6.519\tools\OpenCover.Console.exe" $OutputDir = "UnitTests\bin\Debug\net48" From 5660449e7f923ba09735a9caacdb0430e32f192f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 14:28:36 -0400 Subject: [PATCH 607/741] Include Full debug symbols in UnitTests build to fix code coverage --- Makefile | 26 -------------------------- UnitTests/UnitTests.csproj | 2 ++ 2 files changed, 2 insertions(+), 26 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 1528c44c9f..0000000000 --- a/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -OUTDIR=MimeKit/bin/Release/lib/net45 -ASSEMBLY=$(OUTDIR)/MimeKit.dll -XMLDOCS=$(OUTDIR)/MimeKit.xml -SOLUTION=MimeKit.Net45.sln - -all: - msbuild /target:Build /p:Configuration=Release $(SOLUTION) - -debug: - msbuild /target:Build /p:Configuration=Debug $(SOLUTION) - -clean: - msbuild /target:Clean /p:Configuration=Debug $(SOLUTION) - msbuild /target:Clean /p:Configuration=Release $(SOLUTION) - -check-docs: - @find docs/en -name "*.xml" -exec grep -l "To be added." {} \; - -update-docs: $(ASSEMBLY) - mdoc update --delete -o docs/en $(ASSEMBLY) - -merge-docs: $(ASSEMBLY) $(XMLDOCS) - mdoc update -i $(XMLDOCS) -o docs/en $(ASSEMBLY) - -html-docs: - mdoc export-html --force-update --template=docs/github-pages.xslt -o ../MimeKit-docs/docs docs/en diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 5427e39e3a..58facc63db 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -3,6 +3,8 @@ net48 UnitTests + true + Full true ..\MimeKit\mimekit.snk false From 88425cb82359d8e0698d0069d54b4cf67d6facd7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 21:12:35 -0400 Subject: [PATCH 608/741] Update appveyor.yml --- appveyor.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 44fe192616..7260bb0010 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,10 +28,20 @@ test_script: $Coveralls = Join-Path $Home ".nuget\packages\coveralls.net\0.7.0\tools\csmacnz.Coveralls.exe" - $OpenCover = Join-Path $Home ".nuget\packages\opencover\4.6.519\tools\OpenCover.Console.exe" + $OpenCoverDir = Join-Path $Home ".nuget\packages\opencover\4.6.519\tools" + + $OpenCoverProfiler32 = Join-Path $OpenCoverDir "x86\OpenCover.Profiler.dll" + + $OpenCoverProfiler64 = Join-Path $OpenCoverDir "x64\OpenCover.Profiler.dll" + + $OpenCover = Join-Path $OpenCoverDir "OpenCover.Console.exe" $OutputDir = "UnitTests\bin\Debug\net48" - & $OpenCover -register:user -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetdir:"$OutputDir" -targetargs:"--domain:single UnitTests.dll" -output:opencover.xml + & regsvr32 $OpenCoverProfiler32 + + & regsvr32 $OpenCoverProfiler64 + + & $OpenCover --filter:"+[MimeKit]* -[UnitTests]*" --target:"$NUnitConsoleRunner" --targetdir:"$OutputDir" --targetargs:"--domain:single UnitTests.dll" --output:opencover.xml & $Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath $OutputDir --commitId $Env:APPVEYOR_REPO_COMMIT --commitBranch $Env:APPVEYOR_REPO_BRANCH --commitAuthor $Env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $Env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $Env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $Env:APPVEYOR_BUILD_NUMBER --serviceName appveyor \ No newline at end of file From 145aee6ccb8d66de66750619442208c2d50a4ec7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 21:18:39 -0400 Subject: [PATCH 609/741] Update appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 7260bb0010..80fda21c59 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,6 +42,6 @@ test_script: & regsvr32 $OpenCoverProfiler64 - & $OpenCover --filter:"+[MimeKit]* -[UnitTests]*" --target:"$NUnitConsoleRunner" --targetdir:"$OutputDir" --targetargs:"--domain:single UnitTests.dll" --output:opencover.xml + & $OpenCover -filter:"+[MimeKit]* -[UnitTests]*" -target:"$NUnitConsoleRunner" -targetdir:"$OutputDir" -targetargs:"--domain:single UnitTests.dll" -output:opencover.xml & $Coveralls --opencover -i opencover.xml --repoToken $Env:COVERALLS_REPO_TOKEN --useRelativePaths --basePath $OutputDir --commitId $Env:APPVEYOR_REPO_COMMIT --commitBranch $Env:APPVEYOR_REPO_BRANCH --commitAuthor $Env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $Env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $Env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $Env:APPVEYOR_BUILD_NUMBER --serviceName appveyor \ No newline at end of file From 766255764fe3eb242377345bb728f16eec953be7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 21:20:22 -0400 Subject: [PATCH 610/741] Update .travis.yml --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9000df4229..e5ccccb51c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ language: csharp -mono: none dotnet: 2.1.807 solution: MimeKit.sln install: - dotnet restore MimeKit.sln script: - - dotnet build -c Debug MimeKit.sln - - dotnet ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll + - msbuild /p:Configuration=Debug MimeKit.sln + - mono ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll From b146fd69941e68d3eeffd51cc8fb32229678ac93 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 21:39:20 -0400 Subject: [PATCH 611/741] Update AsymmetricAlgorithmExtensions.cs --- .../Cryptography/AsymmetricAlgorithmExtensions.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 8feccef902..48c311857d 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -41,6 +41,10 @@ namespace MimeKit.Cryptography /// public static class AsymmetricAlgorithmExtensions { +#if NET46 || NET47 || NET48 + static readonly bool IsMonoRuntime = Type.GetType ("Mono.Runtime") != null; +#endif + static void GetAsymmetricKeyParameters (DSA dsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var dp = dsa.ExportParameters (!publicOnly); @@ -161,12 +165,12 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl throw new ArgumentNullException (nameof (key)); #if NET46 || NET47 || NET48 - if (key is RSACng rsaCng) + if (!IsMonoRuntime && key is RSACng rsaCng) return GetAsymmetricKeyParameter (rsaCng); #endif #if NET47 || NET48 - if (key is DSACng dsaCng) + if (!IsMonoRuntime && key is DSACng dsaCng) return GetAsymmetricKeyParameter (dsaCng); #endif @@ -205,12 +209,12 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric throw new ArgumentNullException (nameof (key)); #if NET46 || NET47 || NET48 - if (key is RSACng rsaCng) + if (!IsMonoRuntime && key is RSACng rsaCng) return GetAsymmetricCipherKeyPair (rsaCng); #endif #if NET47 || NET48 - if (key is DSACng dsaCng) + if (!IsMonoRuntime && key is DSACng dsaCng) return GetAsymmetricCipherKeyPair (dsaCng); #endif From d2c61570ca165ba64683cc16a718b90f38d41c64 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 21:54:52 -0400 Subject: [PATCH 612/741] Update AsymmetricAlgorithmExtensions.cs Try reordering code to avoid TypeLoadExceptions in Mono for RSACng/DSACng --- .../AsymmetricAlgorithmExtensions.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 48c311857d..ebc5b60c22 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -164,6 +164,12 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl if (key == null) throw new ArgumentNullException (nameof (key)); + if (key is RSACryptoServiceProvider rsaKey) + return GetAsymmetricKeyParameter (rsaKey); + + if (key is DSACryptoServiceProvider dsaKey) + return GetAsymmetricKeyParameter (dsaKey); + #if NET46 || NET47 || NET48 if (!IsMonoRuntime && key is RSACng rsaCng) return GetAsymmetricKeyParameter (rsaCng); @@ -174,12 +180,6 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl return GetAsymmetricKeyParameter (dsaCng); #endif - if (key is RSACryptoServiceProvider rsaKey) - return GetAsymmetricKeyParameter (rsaKey); - - if (key is DSACryptoServiceProvider dsaKey) - return GetAsymmetricKeyParameter (dsaKey); - // TODO: support ECDiffieHellman and ECDsa? throw new NotSupportedException (string.Format ("'{0}' is currently not supported.", key.GetType ().Name)); @@ -208,6 +208,12 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric if (key == null) throw new ArgumentNullException (nameof (key)); + if (key is RSACryptoServiceProvider rsaKey) + return GetAsymmetricCipherKeyPair (rsaKey); + + if (key is DSACryptoServiceProvider dsaKey) + return GetAsymmetricCipherKeyPair (dsaKey); + #if NET46 || NET47 || NET48 if (!IsMonoRuntime && key is RSACng rsaCng) return GetAsymmetricCipherKeyPair (rsaCng); @@ -218,12 +224,6 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric return GetAsymmetricCipherKeyPair (dsaCng); #endif - if (key is RSACryptoServiceProvider rsaKey) - return GetAsymmetricCipherKeyPair (rsaKey); - - if (key is DSACryptoServiceProvider dsaKey) - return GetAsymmetricCipherKeyPair (dsaKey); - // TODO: support ECDiffieHellman and ECDsa? throw new NotSupportedException (string.Format ("'{0}' is currently not supported.", key.GetType ().Name)); From 30bf9407e3a570609a94b291e29075851749a3a8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 22:06:15 -0400 Subject: [PATCH 613/741] Update AsymmetricAlgorithmExtensions.cs Try catching TypeLoadExceptions --- .../AsymmetricAlgorithmExtensions.cs | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index ebc5b60c22..4815f46cde 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -41,10 +41,6 @@ namespace MimeKit.Cryptography /// public static class AsymmetricAlgorithmExtensions { -#if NET46 || NET47 || NET48 - static readonly bool IsMonoRuntime = Type.GetType ("Mono.Runtime") != null; -#endif - static void GetAsymmetricKeyParameters (DSA dsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var dp = dsa.ExportParameters (!publicOnly); @@ -171,13 +167,19 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl return GetAsymmetricKeyParameter (dsaKey); #if NET46 || NET47 || NET48 - if (!IsMonoRuntime && key is RSACng rsaCng) - return GetAsymmetricKeyParameter (rsaCng); + try { + if (key is RSACng rsaCng) + return GetAsymmetricKeyParameter (rsaCng); + } catch (TypeLoadException) { + } #endif #if NET47 || NET48 - if (!IsMonoRuntime && key is DSACng dsaCng) - return GetAsymmetricKeyParameter (dsaCng); + try { + if (key is DSACng dsaCng) + return GetAsymmetricKeyParameter (dsaCng); + } catch (TypeLoadException) { + } #endif // TODO: support ECDiffieHellman and ECDsa? @@ -215,13 +217,19 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric return GetAsymmetricCipherKeyPair (dsaKey); #if NET46 || NET47 || NET48 - if (!IsMonoRuntime && key is RSACng rsaCng) - return GetAsymmetricCipherKeyPair (rsaCng); + try { + if (key is RSACng rsaCng) + return GetAsymmetricCipherKeyPair (rsaCng); + } catch (TypeLoadException) { + } #endif #if NET47 || NET48 - if (!IsMonoRuntime && key is DSACng dsaCng) - return GetAsymmetricCipherKeyPair (dsaCng); + try { + if (key is DSACng dsaCng) + return GetAsymmetricCipherKeyPair (dsaCng); + } catch (TypeLoadException) { + } #endif // TODO: support ECDiffieHellman and ECDsa? From 5ac9ccdbec0c62962b885596c6450c0715e9f8d7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 22:26:13 -0400 Subject: [PATCH 614/741] Treat RSACng and DSACng as RSA and DSA respectively Don't need to cast to the *Cng class --- .../AsymmetricAlgorithmExtensions.cs | 76 +++++++------------ 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs index 4815f46cde..a422250732 100644 --- a/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs +++ b/MimeKit/Cryptography/AsymmetricAlgorithmExtensions.cs @@ -72,6 +72,20 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } + static AsymmetricKeyParameter GetAsymmetricKeyParameter (DSA dsa) + { + GetAsymmetricKeyParameters (dsa, false, out _, out var key); + + return key; + } + + static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSA dsa) + { + GetAsymmetricKeyParameters (dsa, false, out var pub, out var key); + + return new AsymmetricCipherKeyPair (pub, key); + } + static void GetAsymmetricKeyParameters (RSA rsa, bool publicOnly, out AsymmetricKeyParameter pub, out AsymmetricKeyParameter key) { var rp = rsa.ExportParameters (!publicOnly); @@ -108,37 +122,19 @@ static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACryptoServiceProvi return new AsymmetricCipherKeyPair (pub, key); } -#if NET47 || NET48 - static AsymmetricKeyParameter GetAsymmetricKeyParameter (DSACng dsa) - { - GetAsymmetricKeyParameters (dsa, false, out _, out var key); - - return key; - } - - static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (DSACng dsa) - { - GetAsymmetricKeyParameters (dsa, false, out var pub, out var key); - - return new AsymmetricCipherKeyPair (pub, key); - } -#endif - -#if NET46 || NET47 || NET48 - static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSACng rsa) + static AsymmetricKeyParameter GetAsymmetricKeyParameter (RSA rsa) { GetAsymmetricKeyParameters (rsa, false, out _, out var key); return key; } - static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSACng rsa) + static AsymmetricCipherKeyPair GetAsymmetricCipherKeyPair (RSA rsa) { GetAsymmetricKeyParameters (rsa, false, out var pub, out var key); return new AsymmetricCipherKeyPair (pub, key); } -#endif /// /// Convert an AsymmetricAlgorithm into a BouncyCastle AsymmetricKeyParameter. @@ -163,24 +159,14 @@ public static AsymmetricKeyParameter AsAsymmetricKeyParameter (this AsymmetricAl if (key is RSACryptoServiceProvider rsaKey) return GetAsymmetricKeyParameter (rsaKey); + if (key is RSA rsa) + return GetAsymmetricKeyParameter (rsa); + if (key is DSACryptoServiceProvider dsaKey) return GetAsymmetricKeyParameter (dsaKey); -#if NET46 || NET47 || NET48 - try { - if (key is RSACng rsaCng) - return GetAsymmetricKeyParameter (rsaCng); - } catch (TypeLoadException) { - } -#endif - -#if NET47 || NET48 - try { - if (key is DSACng dsaCng) - return GetAsymmetricKeyParameter (dsaCng); - } catch (TypeLoadException) { - } -#endif + if (key is DSA dsa) + return GetAsymmetricKeyParameter (dsa); // TODO: support ECDiffieHellman and ECDsa? @@ -213,24 +199,14 @@ public static AsymmetricCipherKeyPair AsAsymmetricCipherKeyPair (this Asymmetric if (key is RSACryptoServiceProvider rsaKey) return GetAsymmetricCipherKeyPair (rsaKey); + if (key is RSA rsa) + return GetAsymmetricCipherKeyPair (rsa); + if (key is DSACryptoServiceProvider dsaKey) return GetAsymmetricCipherKeyPair (dsaKey); -#if NET46 || NET47 || NET48 - try { - if (key is RSACng rsaCng) - return GetAsymmetricCipherKeyPair (rsaCng); - } catch (TypeLoadException) { - } -#endif - -#if NET47 || NET48 - try { - if (key is DSACng dsaCng) - return GetAsymmetricCipherKeyPair (dsaCng); - } catch (TypeLoadException) { - } -#endif + if (key is DSA dsa) + return GetAsymmetricCipherKeyPair (dsa); // TODO: support ECDiffieHellman and ECDsa? From 0c82aa82e3196ea2fcb510a95c7e8c8124cfcded Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 11 Jun 2020 22:41:55 -0400 Subject: [PATCH 615/741] Added tests for RSACng and DSACng --- .../AsymmetricAlgorithmExtensionTests.cs | 212 ++++++++++-------- 1 file changed, 117 insertions(+), 95 deletions(-) diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index aab13c4c51..ba84cbdf18 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -65,107 +65,129 @@ static void AssertAreEqual (byte[] expected, byte[] actual, string paramName) Assert.AreEqual (expectedBigInteger, actualBigInteger, "{0} are not equal", paramName); } + static void AssertDSA (DSA dsa) + { + // first, check private key conversion + var expected = dsa.ExportParameters (true); + var keyParameter = dsa.AsAsymmetricKeyParameter (); + var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; + var actual = asymmetricAlgorithm.ExportParameters (true); + + Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); + AssertAreEqual (expected.Seed, actual.Seed, "Seed"); + AssertAreEqual (expected.G, actual.G, "G"); + AssertAreEqual (expected.P, actual.P, "P"); + AssertAreEqual (expected.Q, actual.Q, "Q"); + AssertAreEqual (expected.X, actual.X, "X"); + AssertAreEqual (expected.Y, actual.Y, "Y"); + + // test AsymmetricCipherKeyPair conversion + var keyPair = dsa.AsAsymmetricCipherKeyPair (); + asymmetricAlgorithm = keyPair.AsAsymmetricAlgorithm () as DSA; + actual = asymmetricAlgorithm.ExportParameters (true); + + Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); + AssertAreEqual (expected.Seed, actual.Seed, "Seed"); + AssertAreEqual (expected.G, actual.G, "G"); + AssertAreEqual (expected.P, actual.P, "P"); + AssertAreEqual (expected.Q, actual.Q, "Q"); + AssertAreEqual (expected.X, actual.X, "X"); + AssertAreEqual (expected.Y, actual.Y, "Y"); + + // test public key conversion + expected = dsa.ExportParameters (false); + var pubdsa = new DSACryptoServiceProvider (); + pubdsa.ImportParameters (expected); + + keyParameter = pubdsa.AsAsymmetricKeyParameter (); + asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; + actual = asymmetricAlgorithm.ExportParameters (false); + + Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); + AssertAreEqual (expected.Seed, actual.Seed, "Seed"); + AssertAreEqual (expected.G, actual.G, "G"); + AssertAreEqual (expected.P, actual.P, "P"); + AssertAreEqual (expected.Q, actual.Q, "Q"); + AssertAreEqual (expected.X, actual.X, "X"); + AssertAreEqual (expected.Y, actual.Y, "Y"); + } + [Test] - public void TestDsa () + public void TestDSACryptoServiceProvider () { - using (var dsa = new DSACryptoServiceProvider (1024)) { - // first, check private key conversion - var expected = dsa.ExportParameters (true); - var keyParameter = dsa.AsAsymmetricKeyParameter (); - var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; - var actual = asymmetricAlgorithm.ExportParameters (true); - - Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); - AssertAreEqual (expected.Seed, actual.Seed, "Seed"); - AssertAreEqual (expected.G, actual.G, "G"); - AssertAreEqual (expected.P, actual.P, "P"); - AssertAreEqual (expected.Q, actual.Q, "Q"); - AssertAreEqual (expected.X, actual.X, "X"); - AssertAreEqual (expected.Y, actual.Y, "Y"); - - // test AsymmetricCipherKeyPair conversion - var keyPair = dsa.AsAsymmetricCipherKeyPair (); - asymmetricAlgorithm = keyPair.AsAsymmetricAlgorithm () as DSA; - actual = asymmetricAlgorithm.ExportParameters (true); - - Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); - AssertAreEqual (expected.Seed, actual.Seed, "Seed"); - AssertAreEqual (expected.G, actual.G, "G"); - AssertAreEqual (expected.P, actual.P, "P"); - AssertAreEqual (expected.Q, actual.Q, "Q"); - AssertAreEqual (expected.X, actual.X, "X"); - AssertAreEqual (expected.Y, actual.Y, "Y"); - - // test public key conversion - expected = dsa.ExportParameters (false); - var pubdsa = new DSACryptoServiceProvider (); - pubdsa.ImportParameters (expected); - - keyParameter = pubdsa.AsAsymmetricKeyParameter (); - asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; - actual = asymmetricAlgorithm.ExportParameters (false); - - Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); - AssertAreEqual (expected.Seed, actual.Seed, "Seed"); - AssertAreEqual (expected.G, actual.G, "G"); - AssertAreEqual (expected.P, actual.P, "P"); - AssertAreEqual (expected.Q, actual.Q, "Q"); - AssertAreEqual (expected.X, actual.X, "X"); - AssertAreEqual (expected.Y, actual.Y, "Y"); - } + using (var dsa = new DSACryptoServiceProvider (1024)) + AssertDSA (dsa); } [Test] - public void TestRsa () + public void TestDSACng () { - using (var rsa = new RSACryptoServiceProvider (1024)) { - // first, check private key conversion - var expected = rsa.ExportParameters (true); - var keyParameter = rsa.AsAsymmetricKeyParameter (); - var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as RSA; - var actual = asymmetricAlgorithm.ExportParameters (true); - - AssertAreEqual (expected.D, actual.D, "D"); - AssertAreEqual (expected.DP, actual.DP, "DP"); - AssertAreEqual (expected.DQ, actual.DQ, "DQ"); - AssertAreEqual (expected.P, actual.P, "P"); - AssertAreEqual (expected.Q, actual.Q, "Q"); - AssertAreEqual (expected.Exponent, actual.Exponent, "Exponent"); - AssertAreEqual (expected.InverseQ, actual.InverseQ, "InverseQ"); - AssertAreEqual (expected.Modulus, actual.Modulus, "Modulus"); - - // test AsymmetricCipherKeyPair conversion - var keyPair = rsa.AsAsymmetricCipherKeyPair (); - asymmetricAlgorithm = keyPair.AsAsymmetricAlgorithm () as RSA; - actual = asymmetricAlgorithm.ExportParameters (true); - - AssertAreEqual (expected.D, actual.D, "D"); - AssertAreEqual (expected.DP, actual.DP, "DP"); - AssertAreEqual (expected.DQ, actual.DQ, "DQ"); - AssertAreEqual (expected.P, actual.P, "P"); - AssertAreEqual (expected.Q, actual.Q, "Q"); - AssertAreEqual (expected.Exponent, actual.Exponent, "Exponent"); - AssertAreEqual (expected.InverseQ, actual.InverseQ, "InverseQ"); - AssertAreEqual (expected.Modulus, actual.Modulus, "Modulus"); - - // test public key conversion - expected = rsa.ExportParameters (false); - var pubrsa = new RSACryptoServiceProvider (); - pubrsa.ImportParameters (expected); - - keyParameter = pubrsa.AsAsymmetricKeyParameter (); - asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as RSA; - actual = asymmetricAlgorithm.ExportParameters (false); - - AssertAreEqual (expected.D, actual.D, "D"); - AssertAreEqual (expected.DP, actual.DP, "DP"); - AssertAreEqual (expected.DQ, actual.DQ, "DQ"); - AssertAreEqual (expected.P, actual.P, "P"); - AssertAreEqual (expected.Q, actual.Q, "Q"); - AssertAreEqual (expected.Exponent, actual.Exponent, "Exponent"); - AssertAreEqual (expected.InverseQ, actual.InverseQ, "InverseQ"); - AssertAreEqual (expected.Modulus, actual.Modulus, "Modulus"); - } + using (var dsa = new DSACng (1024)) + AssertDSA (dsa); + } + + static void AssertRSA (RSA rsa) + { + // first, check private key conversion + var expected = rsa.ExportParameters (true); + var keyParameter = rsa.AsAsymmetricKeyParameter (); + var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as RSA; + var actual = asymmetricAlgorithm.ExportParameters (true); + + AssertAreEqual (expected.D, actual.D, "D"); + AssertAreEqual (expected.DP, actual.DP, "DP"); + AssertAreEqual (expected.DQ, actual.DQ, "DQ"); + AssertAreEqual (expected.P, actual.P, "P"); + AssertAreEqual (expected.Q, actual.Q, "Q"); + AssertAreEqual (expected.Exponent, actual.Exponent, "Exponent"); + AssertAreEqual (expected.InverseQ, actual.InverseQ, "InverseQ"); + AssertAreEqual (expected.Modulus, actual.Modulus, "Modulus"); + + // test AsymmetricCipherKeyPair conversion + var keyPair = rsa.AsAsymmetricCipherKeyPair (); + asymmetricAlgorithm = keyPair.AsAsymmetricAlgorithm () as RSA; + actual = asymmetricAlgorithm.ExportParameters (true); + + AssertAreEqual (expected.D, actual.D, "D"); + AssertAreEqual (expected.DP, actual.DP, "DP"); + AssertAreEqual (expected.DQ, actual.DQ, "DQ"); + AssertAreEqual (expected.P, actual.P, "P"); + AssertAreEqual (expected.Q, actual.Q, "Q"); + AssertAreEqual (expected.Exponent, actual.Exponent, "Exponent"); + AssertAreEqual (expected.InverseQ, actual.InverseQ, "InverseQ"); + AssertAreEqual (expected.Modulus, actual.Modulus, "Modulus"); + + // test public key conversion + expected = rsa.ExportParameters (false); + var pubrsa = new RSACryptoServiceProvider (); + pubrsa.ImportParameters (expected); + + keyParameter = pubrsa.AsAsymmetricKeyParameter (); + asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as RSA; + actual = asymmetricAlgorithm.ExportParameters (false); + + AssertAreEqual (expected.D, actual.D, "D"); + AssertAreEqual (expected.DP, actual.DP, "DP"); + AssertAreEqual (expected.DQ, actual.DQ, "DQ"); + AssertAreEqual (expected.P, actual.P, "P"); + AssertAreEqual (expected.Q, actual.Q, "Q"); + AssertAreEqual (expected.Exponent, actual.Exponent, "Exponent"); + AssertAreEqual (expected.InverseQ, actual.InverseQ, "InverseQ"); + AssertAreEqual (expected.Modulus, actual.Modulus, "Modulus"); + } + + [Test] + public void TestRSACryptoServiceProvider () + { + using (var rsa = new RSACryptoServiceProvider (1024)) + AssertRSA (rsa); + } + + [Test] + public void TestRSACng () + { + using (var rsa = new RSACng (1024)) + AssertRSA (rsa); } } } From fb984b905edda4b263b46cea761955ad4f8f0159 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Jun 2020 17:50:20 -0400 Subject: [PATCH 616/741] Added hooks to allow getting Stream offsets as the MimeParser parses messages First pass at implementing issue #582 --- MimeKit/AsyncMimeParser.cs | 88 ++++++++-- MimeKit/MimeParser.cs | 317 ++++++++++++++++++++++++++++++++++--- 2 files changed, 371 insertions(+), 34 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 54ac53ab31..ce91faa887 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -30,8 +30,8 @@ using System.Diagnostics; using System.Threading.Tasks; -using MimeKit.Utils; using MimeKit.IO; +using MimeKit.Utils; namespace MimeKit { public partial class MimeParser @@ -47,7 +47,7 @@ async Task ReadAheadAsync (int atleast, int save, CancellationToken cancell if (nread > 0) { inputEnd += nread; - offset += nread; + position += nread; } else { eos = true; } @@ -117,6 +117,7 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) bool valid = true; int left = 0; + headerBlockBegin = GetOffset (inputIndex); boundary = BoundaryType.None; ResetRawHeaderData (); headers.Clear (); @@ -126,8 +127,10 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) do { unsafe { fixed (byte *inbuf = input) { - if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) + if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) { + headerBlockEnd = GetOffset (inputIndex); return; + } } } @@ -157,6 +160,7 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) ParseAndAppendHeader (); + headerBlockEnd = GetOffset (inputIndex); state = MimeParserState.Content; } return; @@ -249,13 +253,13 @@ async Task ScanContentAsync (Stream content, bool trimNewLine async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellationToken) { + long end, begin = GetOffset (inputIndex); ScanContentResult result; Stream content; - if (persistent) { - long begin = GetOffset (inputIndex); - long end; + OnMimeContentBegin (part, begin); + if (persistent) { using (var measured = new MeasuringStream ()) { result = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); end = begin + measured.Length; @@ -266,16 +270,21 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation content = new MemoryBlockStream (); result = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); content.Seek (0, SeekOrigin.Begin); + end = begin + content.Length; } + OnMimeContentEnd (part, end); + if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; else content.Dispose (); } - async Task ConstructMessagePartAsync (MessagePart part, int depth, CancellationToken cancellationToken) + async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, CancellationToken cancellationToken) { + OnMimeContentBegin (rfc822, GetOffset (inputIndex)); + if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); @@ -333,6 +342,11 @@ async Task ConstructMessagePartAsync (MessagePart part, int depth, CancellationT var entity = options.CreateEntity (type, headers, true, depth); message.Body = entity; + OnMimeMessageBegin (message, headerBlockBegin); + OnMimeMessageHeadersEnd (message, headerBlockEnd); + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) @@ -340,34 +354,52 @@ async Task ConstructMessagePartAsync (MessagePart part, int depth, CancellationT else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - part.Message = message; + rfc822.Message = message; + + var endOffset = GetOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); + OnMimeMessageEnd (message, endOffset); + OnMimeContentEnd (rfc822, endOffset); } async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { + long offset = GetOffset (inputIndex); + + OnMultipartPreambleBegin (multipart, offset); await ScanContentAsync (memory, false, cancellationToken).ConfigureAwait (false); multipart.RawPreamble = memory.ToArray (); + OnMultipartPreambleEnd (multipart, offset + memory.Length); } } async Task MultipartScanEpilogueAsync (Multipart multipart, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { + long offset = GetOffset (inputIndex); + + OnMultipartEpilogueBegin (multipart, offset); var result = await ScanContentAsync (memory, true, cancellationToken).ConfigureAwait (false); multipart.RawEpilogue = result.IsEmpty ? null : memory.ToArray (); + OnMultipartEpilogueEnd (multipart, offset + memory.Length); } } async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { do { + OnMultipartBoundaryBegin (multipart, GetOffset (inputIndex)); + // skip over the boundary marker if (!await SkipLineAsync (true, cancellationToken).ConfigureAwait (false)) { + OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); boundary = BoundaryType.Eos; return; } + OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + // parse the headers state = MimeParserState.Headers; if (await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) { @@ -392,6 +424,9 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat var type = GetContentType (multipart.ContentType); var entity = options.CreateEntity (type, headers, false, depth); + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) @@ -399,6 +434,8 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + OnMimeEntityEnd (entity, GetOffset (inputIndex)); + multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); } @@ -407,6 +444,8 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation { var marker = multipart.Boundary; + OnMimeContentBegin (multipart, GetOffset (inputIndex)); + if (marker == null) { #if DEBUG Debug.WriteLine ("Multipart without a boundary encountered!"); @@ -414,6 +453,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: this will scan all content into the preamble... await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); + OnMimeContentEnd (multipart, GetOffset (inputIndex)); return; } @@ -424,11 +464,15 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation await MultipartScanSubpartsAsync (multipart, depth, cancellationToken).ConfigureAwait (false); if (boundary == BoundaryType.ImmediateEndBoundary) { + OnMultipartEndBoundaryBegin (multipart, GetOffset (inputIndex)); + // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; await SkipLineAsync (false, cancellationToken).ConfigureAwait (false); PopBoundary (); + OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); + await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); return; } @@ -502,8 +546,8 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: if a previously parsed MimePart's content has been read, // then the stream position will have moved and will need to be // reset. - if (persistent && stream.Position != offset) - stream.Seek (offset, SeekOrigin.Begin); + if (persistent && stream.Position != position) + stream.Seek (position, SeekOrigin.Begin); state = MimeParserState.Headers; toplevel = true; @@ -516,6 +560,10 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. var entity = options.CreateEntity (type, headers, false, 0); + + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) @@ -523,6 +571,8 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + OnMimeEntityEnd (entity, GetOffset (inputIndex)); + if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else @@ -553,8 +603,8 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: if a previously parsed MimePart's content has been read, // then the stream position will have moved and will need to be // reset. - if (persistent && stream.Position != offset) - stream.Seek (offset, SeekOrigin.Begin); + if (persistent && stream.Position != position) + stream.Seek (position, SeekOrigin.Begin); // scan the from-line if we are parsing an mbox while (state != MimeParserState.MessageHeaders) { @@ -574,6 +624,9 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); + OnMimeMessageBegin (message, headerBlockBegin); + OnMimeMessageHeadersEnd (message, headerBlockEnd); + if (format == MimeFormat.Mbox && options.RespectContentLength) { contentEnd = 0; @@ -590,9 +643,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out length)) continue; - long endOffset = GetOffset (inputIndex) + length; - - contentEnd = endOffset; + contentEnd = GetOffset (inputIndex) + length; break; } } @@ -601,6 +652,9 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation var entity = options.CreateEntity (type, headers, true, 0); message.Body = entity; + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) @@ -608,6 +662,10 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + var endOffset = GetOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); + OnMimeMessageEnd (message, endOffset); + if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) state = MimeParserState.MboxMarker; diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 1b32263500..a0deaef6b5 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -32,8 +32,8 @@ using System.Collections; using System.Collections.Generic; -using MimeKit.Utils; using MimeKit.IO; +using MimeKit.Utils; namespace MimeKit { enum BoundaryType @@ -140,9 +140,11 @@ public partial class MimeParser : IEnumerable bool eos; ParserOptions options; + long headerBlockBegin; + long headerBlockEnd; long contentEnd; Stream stream; - long offset; + long position; /// /// Initialize a new instance of the class. @@ -326,9 +328,11 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, mboxMarkerOffset = 0; mboxMarkerLength = 0; + headerBlockBegin = 0; + headerBlockEnd = 0; contentEnd = 0; - offset = stream.CanSeek ? stream.Position : 0; + position = stream.CanSeek ? stream.Position : 0; preHeaderLength = 0; headers.Clear (); headerOffset = 0; @@ -421,6 +425,220 @@ public void SetStream (Stream stream, bool persistent = false) SetStream (ParserOptions.Default, stream, MimeFormat.Default, persistent); } + /// + /// Invoked when an mbox marker is found. + /// + /// + /// Invoked when an mbox marker is found, providing subclasses with the ability to track stream offsets. + /// + /// The stream offset at which the mbox marker begins. + protected virtual void OnMboxMarkerBegin (long offset) + { + } + + /// + /// Invoked when the end of an mbox marker is found. + /// + /// + /// Invoked when the end of an mbox marker is found, providing subclasses with the ability to track stream offsets. + /// + /// The stream offset at which the mbox marker ends. + protected virtual void OnMboxMarkerEnd (long offset) + { + } + + /// + /// Invoked when the beginning of a MIME message is found. + /// + /// + /// Invoked when the beginning of a MIME message is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME message. + /// The stream offset at which the MIME message begins. + protected virtual void OnMimeMessageBegin (MimeMessage message, long offset) + { + } + + /// + /// Invoked when the end of a MIME message is found. + /// + /// + /// Invoked when the end of a MIME message is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME message. + /// The stream offset at which the MIME message ends. + protected virtual void OnMimeMessageEnd (MimeMessage message, long offset) + { + } + + /// + /// Invoked when the end of the message headers is found. + /// + /// + /// Invoked when the end of the message headers is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME message. + /// The stream offset at which the MIME message headers end. + protected virtual void OnMimeMessageHeadersEnd (MimeMessage message, long offset) + { + } + + /// + /// Invoked when the beginning of a MIME entity is found. + /// + /// + /// Invoked when the beginning of a MIME entity is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME entity. + /// The stream offset at which the MIME entity begins. + protected virtual void OnMimeEntityBegin (MimeEntity entity, long offset) + { + } + + /// + /// Invoked when the end of a MIME entity is found. + /// + /// + /// Invoked when the end of a MIME entity is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME entity. + /// The stream offset at which the MIME entity ends. + protected virtual void OnMimeEntityEnd (MimeEntity entity, long offset) + { + } + + /// + /// Invoked when the end of MIME entity headers is found. + /// + /// + /// Invoked when the end of MIME entity headers is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME entity. + /// The stream offset at which the MIME entity ends. + protected virtual void OnMimeEntityHeadersEnd (MimeEntity entity, long offset) + { + } + + /// + /// Invoked when the beginning of a MIME entity's content is found. + /// + /// + /// Invoked when the beginning of a MIME entity's content is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME entity. + /// The stream offset at which the MIME entity's content begins. + protected virtual void OnMimeContentBegin (MimeEntity entity, long offset) + { + } + + /// + /// Invoked when the end of a MIME entity's content is found. + /// + /// + /// Invoked when the end of a MIME entity's content is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME entity. + /// The stream offset at which the MIME entity's content ends. + protected virtual void OnMimeContentEnd (MimeEntity entity, long offset) + { + } + + /// + /// Invoked when a multipart boundary is found. + /// + /// + /// Invoked when a multipart boundary is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the multipart boundary begins. + protected virtual void OnMultipartBoundaryBegin (Multipart multipart, long offset) + { + } + + /// + /// Invoked when the end of a multipart boundary is found. + /// + /// + /// Invoked when the end of a multipart boundary is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the multipart boundary ends. + protected virtual void OnMultipartBoundaryEnd (Multipart multipart, long offset) + { + } + + /// + /// Invoked when a multipart end-boundary is found. + /// + /// + /// Invoked when a multipart end-boundary is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the multipart end-boundary begins. + protected virtual void OnMultipartEndBoundaryBegin (Multipart multipart, long offset) + { + } + + /// + /// Invoked when the end of a multipart end-boundary is found. + /// + /// + /// Invoked when the end of a multipart end-boundary is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the multipart end-boundary ends. + protected virtual void OnMultipartEndBoundaryEnd (Multipart multipart, long offset) + { + } + + /// + /// Invoked when a multipart preamble is found. + /// + /// + /// Invoked when a multipart preamble is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the preamble begins. + protected virtual void OnMultipartPreambleBegin (Multipart multipart, long offset) + { + } + + /// + /// Invoked when the end of a multipart preamble is found. + /// + /// + /// Invoked when the end of a multipart preamble is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the preamble ends. + protected virtual void OnMultipartPreambleEnd (Multipart multipart, long offset) + { + } + + /// + /// Invoked when a multipart epilogue is found. + /// + /// + /// Invoked when a multipart epilogue is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the epilogue begins. + protected virtual void OnMultipartEpilogueBegin (Multipart multipart, long offset) + { + } + + /// + /// Invoked when the end of a multipart epilogue is found. + /// + /// + /// Invoked when the end of a multipart epilogue is found, providing subclasses with the ability to track stream offsets. + /// + /// The MIME multipart. + /// The stream offset at which the epilogue ends. + protected virtual void OnMultipartEpilogueEnd (Multipart multipart, long offset) + { + } + #if DEBUG static string ConvertToCString (byte[] buffer, int startIndex, int length) { @@ -495,7 +713,7 @@ int ReadAhead (int atleast, int save, CancellationToken cancellationToken) if (nread > 0) { inputEnd += nread; - offset += nread; + position += nread; } else { eos = true; } @@ -505,13 +723,13 @@ int ReadAhead (int atleast, int save, CancellationToken cancellationToken) long GetOffset (int index) { - if (offset == -1) + if (position == -1) return -1; if (index == -1) index = inputIndex; - return offset - (inputEnd - index); + return position - (inputEnd - index); } static unsafe bool CStringsEqual (byte* str1, byte* str2, int length) @@ -614,6 +832,9 @@ unsafe void StepMboxMarker (byte *inbuf, ref bool needInput, ref bool complete, mboxMarkerOffset = GetOffset (startIndex); mboxMarkerLength = (int) length; + OnMboxMarkerBegin (mboxMarkerOffset); + OnMboxMarkerEnd (mboxMarkerOffset + length); + if (mboxMarkerBuffer.Length < mboxMarkerLength) Array.Resize (ref mboxMarkerBuffer, mboxMarkerLength); @@ -883,6 +1104,7 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) bool valid = true; int left = 0; + headerBlockBegin = GetOffset (inputIndex); boundary = BoundaryType.None; ResetRawHeaderData (); headers.Clear (); @@ -890,8 +1112,10 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) ReadAhead (ReadAheadSize, 0, cancellationToken); do { - if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) + if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) { + headerBlockEnd = GetOffset (inputIndex); return; + } var available = ReadAhead (left + 1, 0, cancellationToken); @@ -919,6 +1143,7 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) ParseAndAppendHeader (); + headerBlockEnd = GetOffset (inputIndex); state = MimeParserState.Content; } return; @@ -1255,13 +1480,13 @@ unsafe ScanContentResult ScanContent (byte* inbuf, Stream content, bool trimNewL unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken cancellationToken) { + long end, begin = GetOffset (inputIndex); ScanContentResult result; Stream content; - if (persistent) { - long begin = GetOffset (inputIndex); - long end; + OnMimeContentBegin (part, begin); + if (persistent) { using (var measured = new MeasuringStream ()) { result = ScanContent (inbuf, measured, true, cancellationToken); end = begin + measured.Length; @@ -1272,16 +1497,21 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can content = new MemoryBlockStream (); result = ScanContent (inbuf, content, true, cancellationToken); content.Seek (0, SeekOrigin.Begin); + end = begin + content.Length; } + OnMimeContentEnd (part, end); + if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; else content.Dispose (); } - unsafe void ConstructMessagePart (MessagePart part, byte* inbuf, int depth, CancellationToken cancellationToken) + unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, CancellationToken cancellationToken) { + OnMimeContentBegin (rfc822, GetOffset (inputIndex)); + if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); @@ -1335,6 +1565,11 @@ unsafe void ConstructMessagePart (MessagePart part, byte* inbuf, int depth, Canc var entity = options.CreateEntity (type, headers, true, depth); message.Body = entity; + OnMimeMessageBegin (message, headerBlockBegin); + OnMimeMessageHeadersEnd (message, headerBlockEnd); + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) @@ -1342,34 +1577,52 @@ unsafe void ConstructMessagePart (MessagePart part, byte* inbuf, int depth, Canc else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - part.Message = message; + rfc822.Message = message; + + var endOffset = GetOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); + OnMimeMessageEnd (message, endOffset); + OnMimeContentEnd (rfc822, endOffset); } unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { + long offset = GetOffset (inputIndex); + + OnMultipartPreambleBegin (multipart, offset); ScanContent (inbuf, memory, false, cancellationToken); multipart.RawPreamble = memory.ToArray (); + OnMultipartPreambleEnd (multipart, offset + memory.Length); } } unsafe void MultipartScanEpilogue (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) { using (var memory = new MemoryStream ()) { + long offset = GetOffset (inputIndex); + + OnMultipartEpilogueBegin (multipart, offset); var result = ScanContent (inbuf, memory, true, cancellationToken); multipart.RawEpilogue = result.IsEmpty ? null : memory.ToArray (); + OnMultipartEpilogueEnd (multipart, offset + memory.Length); } } unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { do { + OnMultipartBoundaryBegin (multipart, GetOffset (inputIndex)); + // skip over the boundary marker if (!SkipLine (inbuf, true, cancellationToken)) { + OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); boundary = BoundaryType.Eos; break; } + OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + // parse the headers state = MimeParserState.Headers; if (Step (inbuf, cancellationToken) == MimeParserState.Error) { @@ -1394,6 +1647,9 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, var type = GetContentType (multipart.ContentType); var entity = options.CreateEntity (type, headers, false, depth); + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) @@ -1401,6 +1657,8 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + OnMimeEntityEnd (entity, GetOffset (inputIndex)); + multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); } @@ -1422,6 +1680,8 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can { var marker = multipart.Boundary; + OnMimeContentBegin (multipart, GetOffset (inputIndex)); + if (marker == null) { #if DEBUG Debug.WriteLine ("Multipart without a boundary encountered!"); @@ -1429,6 +1689,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); + OnMimeContentEnd (multipart, GetOffset (-1)); return; } @@ -1439,11 +1700,15 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can MultipartScanSubparts (multipart, inbuf, depth, cancellationToken); if (boundary == BoundaryType.ImmediateEndBoundary) { + OnMultipartEndBoundaryBegin (multipart, GetOffset (inputIndex)); + // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; SkipLine (inbuf, false, cancellationToken); PopBoundary (); + OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); + MultipartScanEpilogue (multipart, inbuf, cancellationToken); return; } @@ -1505,8 +1770,8 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) // Note: if a previously parsed MimePart's content has been read, // then the stream position will have moved and will need to be // reset. - if (persistent && stream.Position != offset) - stream.Seek (offset, SeekOrigin.Begin); + if (persistent && stream.Position != position) + stream.Seek (position, SeekOrigin.Begin); state = MimeParserState.Headers; toplevel = true; @@ -1519,6 +1784,10 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. var entity = options.CreateEntity (type, headers, false, 0); + + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); else if (entity is MessagePart) @@ -1526,6 +1795,8 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + OnMimeEntityEnd (entity, GetOffset (-1)); + if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else @@ -1565,8 +1836,8 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke // Note: if a previously parsed MimePart's content has been read, // then the stream position will have moved and will need to be // reset. - if (persistent && stream.Position != offset) - stream.Seek (offset, SeekOrigin.Begin); + if (persistent && stream.Position != position) + stream.Seek (position, SeekOrigin.Begin); // scan the from-line if we are parsing an mbox while (state != MimeParserState.MessageHeaders) { @@ -1586,6 +1857,9 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); + OnMimeMessageBegin (message, headerBlockBegin); + OnMimeMessageHeadersEnd (message, headerBlockEnd); + contentEnd = 0; if (format == MimeFormat.Mbox && options.RespectContentLength) { for (int i = 0; i < headers.Count; i++) { @@ -1601,9 +1875,7 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out length)) continue; - long endOffset = GetOffset (inputIndex) + length; - - contentEnd = endOffset; + contentEnd = GetOffset (inputIndex) + length; break; } } @@ -1612,6 +1884,9 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var entity = options.CreateEntity (type, headers, true, 0); message.Body = entity; + OnMimeEntityBegin (entity, headerBlockBegin); + OnMimeEntityHeadersEnd (entity, headerBlockEnd); + if (entity is Multipart) ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); else if (entity is MessagePart) @@ -1619,6 +1894,10 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + var endOffset = GetOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); + OnMimeMessageEnd (message, endOffset); + if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) state = MimeParserState.MboxMarker; From 91fe88a909389d545da0929651b464303ec4c8e9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Jun 2020 23:07:36 -0400 Subject: [PATCH 617/741] code cleanup --- MimeKit/AsyncMimeParser.cs | 11 +++++------ MimeKit/MimeParser.cs | 14 +++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index ce91faa887..d191fa9659 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -127,10 +127,8 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) do { unsafe { fixed (byte *inbuf = input) { - if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) { - headerBlockEnd = GetOffset (inputIndex); - return; - } + if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) + break; } } @@ -160,12 +158,13 @@ async Task StepHeadersAsync (CancellationToken cancellationToken) ParseAndAppendHeader (); - headerBlockEnd = GetOffset (inputIndex); state = MimeParserState.Content; } - return; + break; } } while (true); + + headerBlockEnd = GetOffset (inputIndex); } async Task SkipLineAsync (bool consumeNewLine, CancellationToken cancellationToken) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index a0deaef6b5..ba7d7f51e9 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1112,10 +1112,8 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) ReadAhead (ReadAheadSize, 0, cancellationToken); do { - if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) { - headerBlockEnd = GetOffset (inputIndex); - return; - } + if (!StepHeaders (inbuf, ref scanningFieldName, ref checkFolded, ref midline, ref blank, ref valid, ref left)) + break; var available = ReadAhead (left + 1, 0, cancellationToken); @@ -1146,9 +1144,11 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) headerBlockEnd = GetOffset (inputIndex); state = MimeParserState.Content; } - return; + break; } } while (true); + + headerBlockEnd = GetOffset (inputIndex); } unsafe bool SkipLine (byte* inbuf, bool consumeNewLine) @@ -1689,7 +1689,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); - OnMimeContentEnd (multipart, GetOffset (-1)); + OnMimeContentEnd (multipart, GetOffset (inputIndex)); return; } @@ -1795,7 +1795,7 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - OnMimeEntityEnd (entity, GetOffset (-1)); + OnMimeEntityEnd (entity, GetOffset (inputIndex)); if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; From 300eae03908cee540883c3961f3a58c5ae1e1214 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Jun 2020 23:08:03 -0400 Subject: [PATCH 618/741] Attempt to fix RSACng and DSACng tests on Linux/Mono --- .../AsymmetricAlgorithmExtensionTests.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index ba84cbdf18..40c9d4f8e0 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -122,8 +122,12 @@ public void TestDSACryptoServiceProvider () [Test] public void TestDSACng () { - using (var dsa = new DSACng (1024)) - AssertDSA (dsa); + try { + using (var dsa = new DSACng (1024)) + AssertDSA (dsa); + } catch (NotImplementedException) { + Assert.Ignore ("Mono does not implement DSACng"); + } } static void AssertRSA (RSA rsa) @@ -186,8 +190,12 @@ public void TestRSACryptoServiceProvider () [Test] public void TestRSACng () { - using (var rsa = new RSACng (1024)) - AssertRSA (rsa); + try { + using (var rsa = new RSACng (1024)) + AssertRSA (rsa); + } catch (NotImplementedException) { + Assert.Ignore ("Mono does not implement RSACng"); + } } } } From 9ae5ada644b7c0009287ba88345a4dc4b5800d36 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 09:29:02 -0400 Subject: [PATCH 619/741] Try to disable tests that will fail on Mono in .travis.yml --- .travis.yml | 2 +- .../AsymmetricAlgorithmExtensionTests.cs | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index e5ccccb51c..a8b8f29056 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,5 +4,5 @@ solution: MimeKit.sln install: - dotnet restore MimeKit.sln script: - - msbuild /p:Configuration=Debug MimeKit.sln + - msbuild /p:Configuration=Debug /p:DefineConstants=MONO MimeKit.sln - mono ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index 40c9d4f8e0..2ad3528eea 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -122,12 +122,12 @@ public void TestDSACryptoServiceProvider () [Test] public void TestDSACng () { - try { - using (var dsa = new DSACng (1024)) - AssertDSA (dsa); - } catch (NotImplementedException) { - Assert.Ignore ("Mono does not implement DSACng"); - } +#if !MONO + using (var dsa = new DSACng (1024)) + AssertDSA (dsa); +#else + Assert.Ignore ("Mono does not implement DSACng"); +#endif } static void AssertRSA (RSA rsa) @@ -190,12 +190,12 @@ public void TestRSACryptoServiceProvider () [Test] public void TestRSACng () { - try { - using (var rsa = new RSACng (1024)) - AssertRSA (rsa); - } catch (NotImplementedException) { - Assert.Ignore ("Mono does not implement RSACng"); - } +#if !MONO + using (var rsa = new RSACng (1024)) + AssertRSA (rsa); +#else + Assert.Ignore ("Mono does not implement RSACng"); +#endif } } } From 4a92a4136da52db260db6d6e4a6c7a3e3151503a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 09:59:04 -0400 Subject: [PATCH 620/741] Delete packages.config --- .nuget/packages.config | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .nuget/packages.config diff --git a/.nuget/packages.config b/.nuget/packages.config deleted file mode 100644 index d1563340fb..0000000000 --- a/.nuget/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - From d9c5e4ec0d20d12f6758263170d4bca799b58469 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 11:26:23 -0400 Subject: [PATCH 621/741] Updated azure-pipelines.yml --- azure-pipelines.yml | 8 +++++++- azure-test-runner.ps1 | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 azure-test-runner.ps1 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e8c1bb555f..0743ba2ede 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -36,11 +36,17 @@ steps: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' -- powershell: '.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[MimeKit]* -[UnitTests]* -[submodules]* -[Mono.Data.Sqlite]*" -target:"packages\NUnit.ConsoleRunner.3.11.1\tools\nunit3-console.exe" -targetargs:"/domain:single /out:UnitTests\bin\Release\TEST-UnitTests.xml UnitTests\bin\Release\UnitTests.dll" -output:opencover.xml' +- task: PowerShell@2 displayName: 'Run Unit Tests' + inputs: + targetType: 'filePath' + filePath: 'azure-test-runner.ps1' - task: PublishTestResults@2 displayName: 'Publish Unit Test Results' + inputs: + testResultsFormat: 'NUnit' + testResultsFiles: 'TestResult.xml' - task: NuGetCommand@2 displayName: 'Package MimeKit-$(Build.BuildNumber)' diff --git a/azure-test-runner.ps1 b/azure-test-runner.ps1 new file mode 100644 index 0000000000..0754bbac75 --- /dev/null +++ b/azure-test-runner.ps1 @@ -0,0 +1,3 @@ +$NUnitConsoleRunner = Join-Path $Home ".nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe" + +& $NUnitConsoleRunner --domain:single "UnitTests\bin\Release\net48\UnitTests.dll" From 650eca23ec1406131f2d4741e025b3c0c729cd9b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 11:45:22 -0400 Subject: [PATCH 622/741] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a8b8f29056..11485b238f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,5 +4,5 @@ solution: MimeKit.sln install: - dotnet restore MimeKit.sln script: - - msbuild /p:Configuration=Debug /p:DefineConstants=MONO MimeKit.sln + - msbuild /p:Configuration=Debug "/p:DefineConstants=$(DefineConstants);MONO" MimeKit.sln - mono ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll From 575f225f910c0242471d9b21b97c9fe109fc9991 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 11:46:07 -0400 Subject: [PATCH 623/741] Added unit tests for MimeParser offset APIs --- UnitTests/MimeParserTests.cs | 196 +- .../mbox/content-length.dos-offsets.txt | 952 +++ UnitTests/TestData/mbox/jwz.dos-offsets.txt | 6896 +++++++++++++++++ 3 files changed, 8037 insertions(+), 7 deletions(-) create mode 100644 UnitTests/TestData/mbox/content-length.dos-offsets.txt create mode 100644 UnitTests/TestData/mbox/jwz.dos-offsets.txt diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index bd25b6daaf..a53605315f 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -28,7 +28,9 @@ using System.IO; using System.Text; using System.Threading; +using System.Globalization; using System.Threading.Tasks; +using System.Collections.Generic; using NUnit.Framework; @@ -588,7 +590,164 @@ static NewLineFormat DetectNewLineFormat (string fileName) return NewLineFormat.Dos; } - static void AssertMboxResults (string baseName, string actual, Stream output) + enum MimeParserOffsetLocation + { + MboxMarkerBegin, + MboxMarkerEnd, + MimeMessageBegin, + MimeMessageHeadersEnd, + MimeMessageEnd, + MimeEntityBegin, + MimeEntityHeadersEnd, + MimeEntityEnd, + MimeContentBegin, + MimeContentEnd, + MultipartBoundaryBegin, + MultipartBoundaryEnd, + MultipartEndBoundaryBegin, + MultipartEndBoundaryEnd, + MultipartPreambleBegin, + MultipartPreambleEnd, + MultipartEpilogueBegin, + MultipartEpilogueEnd + } + + class MimeParserOffset + { + public readonly MimeParserOffsetLocation Location; + public readonly long Offset; + + public MimeParserOffset (MimeParserOffsetLocation location, long offset) + { + Location = location; + Offset = offset; + } + } + + static readonly char[] Space = new char[] { ' ' }; + + static IEnumerable EnumerateMimeParserOffsets (string fileName) + { + using (var reader = File.OpenText (fileName)) { + string line; + + while ((line = reader.ReadLine ()) != null) { + var values = line.Split (Space, 2, StringSplitOptions.RemoveEmptyEntries); + MimeParserOffsetLocation location; + long offset; + + if (!Enum.TryParse (values[0], out location) || !long.TryParse (values[1], NumberStyles.None, CultureInfo.InvariantCulture, out offset)) + continue; + + yield return new MimeParserOffset (location, offset); + } + } + } + + class CustomMimeParser : MimeParser + { + public readonly List Offsets = new List (); + + public CustomMimeParser (ParserOptions options, Stream stream, MimeFormat format) : base (options, stream, format) + { + } + + public CustomMimeParser (Stream stream, MimeFormat format) : base (stream, format) + { + } + + protected override void OnMboxMarkerBegin (long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MboxMarkerBegin, offset)); + } + + protected override void OnMboxMarkerEnd (long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MboxMarkerEnd, offset)); + } + + protected override void OnMimeMessageBegin (MimeMessage message, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeMessageBegin, offset)); + } + + protected override void OnMimeMessageEnd (MimeMessage message, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeMessageEnd, offset)); + } + + protected override void OnMimeMessageHeadersEnd (MimeMessage message, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeMessageHeadersEnd, offset)); + } + + protected override void OnMimeEntityBegin (MimeEntity entity, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityBegin, offset)); + } + + protected override void OnMimeEntityEnd (MimeEntity entity, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityEnd, offset)); + } + + protected override void OnMimeEntityHeadersEnd (MimeEntity entity, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityHeadersEnd, offset)); + } + + protected override void OnMimeContentBegin (MimeEntity entity, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeContentBegin, offset)); + } + + protected override void OnMimeContentEnd (MimeEntity entity, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeContentEnd, offset)); + } + + protected override void OnMultipartBoundaryBegin (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartBoundaryBegin, offset)); + } + + protected override void OnMultipartBoundaryEnd (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartBoundaryEnd, offset)); + } + + protected override void OnMultipartEndBoundaryBegin (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEndBoundaryBegin, offset)); + } + + protected override void OnMultipartEndBoundaryEnd (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEndBoundaryEnd, offset)); + } + + protected override void OnMultipartPreambleBegin (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartPreambleBegin, offset)); + } + + protected override void OnMultipartPreambleEnd (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartPreambleEnd, offset)); + } + + protected override void OnMultipartEpilogueBegin (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEpilogueBegin, offset)); + } + + protected override void OnMultipartEpilogueEnd (Multipart multipart, long offset) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEpilogueEnd, offset)); + } + } + + static void AssertMboxResults (string baseName, string actual, Stream output, List offsets, NewLineFormat newLineFormat) { // WORKAROUND: Mono's iso-2022-jp decoder breaks on this input in versions <= 3.2.3 but is fixed in 3.2.4+ string iso2022jp = Encoding.GetEncoding ("iso-2022-jp").GetString (Convert.FromBase64String ("GyRAOjRGI0stGyhK")); @@ -631,6 +790,21 @@ static void AssertMboxResults (string baseName, string actual, Stream output) } } while (true); } + + path = Path.Combine (MboxDataDir, baseName + "." + newLineFormat.ToString ().ToLowerInvariant () + "-offsets.txt"); + if (!File.Exists (path)) { + using (var writer = new StreamWriter (path)) { + foreach (var offset in offsets) + writer.WriteLine ($"{offset.Location} {offset.Offset}"); + } + } + + n = 0; + foreach (var offset in EnumerateMimeParserOffsets (path)) { + Assert.AreEqual (offset.Location, offsets[n].Location, $"Offset Location #{n}"); + Assert.AreEqual (offset.Offset, offsets[n].Offset, $"Stream Offset #{n}"); + n++; + } } void TestMbox (ParserOptions options, string baseName) @@ -638,13 +812,15 @@ void TestMbox (ParserOptions options, string baseName) var mbox = Path.Combine (MboxDataDir, baseName + ".mbox.txt"); var output = new MemoryBlockStream (); var builder = new StringBuilder (); + List offsets; + NewLineFormat newLineFormat; using (var stream = File.OpenRead (mbox)) { - var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); + var parser = options != null ? new CustomMimeParser (options, stream, MimeFormat.Mbox) : new CustomMimeParser (stream, MimeFormat.Mbox); var format = FormatOptions.Default.Clone (); int count = 0; - format.NewLineFormat = DetectNewLineFormat (mbox); + format.NewLineFormat = newLineFormat = DetectNewLineFormat (mbox); while (!parser.IsEndOfStream) { var message = parser.ParseMessage (); @@ -664,9 +840,11 @@ void TestMbox (ParserOptions options, string baseName) message.WriteTo (format, output); count++; } + + offsets = parser.Offsets; } - AssertMboxResults (baseName, builder.ToString (), output); + AssertMboxResults (baseName, builder.ToString (), output, offsets, newLineFormat); } async Task TestMboxAsync (ParserOptions options, string baseName) @@ -674,13 +852,15 @@ async Task TestMboxAsync (ParserOptions options, string baseName) var mbox = Path.Combine (MboxDataDir, baseName + ".mbox.txt"); var output = new MemoryBlockStream (); var builder = new StringBuilder (); + List offsets; + NewLineFormat newLineFormat; using (var stream = File.OpenRead (mbox)) { - var parser = options != null ? new MimeParser (options, stream, MimeFormat.Mbox) : new MimeParser (stream, MimeFormat.Mbox); + var parser = options != null ? new CustomMimeParser (options, stream, MimeFormat.Mbox) : new CustomMimeParser (stream, MimeFormat.Mbox); var format = FormatOptions.Default.Clone (); int count = 0; - format.NewLineFormat = DetectNewLineFormat (mbox); + format.NewLineFormat = newLineFormat = DetectNewLineFormat (mbox); while (!parser.IsEndOfStream) { var message = await parser.ParseMessageAsync (); @@ -700,9 +880,11 @@ async Task TestMboxAsync (ParserOptions options, string baseName) await message.WriteToAsync (format, output); count++; } + + offsets = parser.Offsets; } - AssertMboxResults (baseName, builder.ToString (), output); + AssertMboxResults (baseName, builder.ToString (), output, offsets, newLineFormat); } [Test] diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt new file mode 100644 index 0000000000..c58f7ff2a9 --- /dev/null +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -0,0 +1,952 @@ +MboxMarkerBegin 0 +MboxMarkerEnd 7 +MimeMessageBegin 9 +MimeMessageHeadersEnd 675 +MimeEntityBegin 9 +MimeEntityHeadersEnd 675 +MimeContentBegin 675 +MultipartPreambleBegin 675 +MultipartPreambleEnd 675 +MultipartBoundaryBegin 675 +MultipartBoundaryEnd 725 +MimeEntityBegin 725 +MimeEntityHeadersEnd 753 +MimeContentBegin 753 +MimeContentEnd 831 +MimeEntityEnd 833 +MultipartBoundaryBegin 833 +MultipartBoundaryEnd 883 +MimeEntityBegin 883 +MimeEntityHeadersEnd 948 +MimeContentBegin 948 +MimeMessageBegin 948 +MimeMessageHeadersEnd 1747 +MimeEntityBegin 948 +MimeEntityHeadersEnd 1747 +MimeContentBegin 1747 +MimeContentEnd 1887 +MimeEntityEnd 1889 +MimeMessageEnd 1889 +MimeContentEnd 1889 +MimeEntityEnd 1889 +MultipartEndBoundaryBegin 1889 +MultipartEndBoundaryEnd 1939 +MultipartEpilogueBegin 1939 +MultipartEpilogueEnd 1939 +MimeEntityEnd 1941 +MimeMessageEnd 1941 +MboxMarkerBegin 1941 +MboxMarkerEnd 1948 +MimeMessageBegin 1950 +MimeMessageHeadersEnd 2430 +MimeEntityBegin 1950 +MimeEntityHeadersEnd 2430 +MimeContentBegin 2430 +MultipartPreambleBegin 2430 +MultipartPreambleEnd 2478 +MultipartBoundaryBegin 2478 +MultipartBoundaryEnd 2506 +MimeEntityBegin 2506 +MimeEntityHeadersEnd 2655 +MimeContentBegin 2655 +MimeMessageBegin 2655 +MimeMessageHeadersEnd 3095 +MimeEntityBegin 2655 +MimeEntityHeadersEnd 3095 +MimeContentBegin 3095 +MimeContentEnd 3134 +MimeEntityEnd 3136 +MimeMessageEnd 3136 +MimeContentEnd 3136 +MimeEntityEnd 3136 +MultipartBoundaryBegin 3136 +MultipartBoundaryEnd 3164 +MimeEntityBegin 3164 +MimeEntityHeadersEnd 3291 +MimeContentBegin 3291 +MimeContentEnd 3755 +MimeEntityEnd 3757 +MultipartBoundaryBegin 3757 +MultipartBoundaryEnd 3785 +MimeEntityBegin 3785 +MimeEntityHeadersEnd 3912 +MimeContentBegin 3912 +MimeContentEnd 4404 +MimeEntityEnd 4406 +MultipartBoundaryBegin 4406 +MultipartBoundaryEnd 4434 +MimeEntityBegin 4434 +MimeEntityHeadersEnd 4565 +MimeContentBegin 4565 +MimeContentEnd 5099 +MimeEntityEnd 5101 +MultipartBoundaryBegin 5101 +MultipartBoundaryEnd 5129 +MimeEntityBegin 5129 +MimeEntityHeadersEnd 5258 +MimeContentBegin 5258 +MimeContentEnd 5762 +MimeEntityEnd 5764 +MultipartBoundaryBegin 5764 +MultipartBoundaryEnd 5792 +MimeEntityBegin 5792 +MimeEntityHeadersEnd 5941 +MimeContentBegin 5941 +MimeMessageBegin 5941 +MimeMessageHeadersEnd 6381 +MimeEntityBegin 5941 +MimeEntityHeadersEnd 6381 +MimeContentBegin 6381 +MimeContentEnd 6419 +MimeEntityEnd 6421 +MimeMessageEnd 6421 +MimeContentEnd 6421 +MimeEntityEnd 6421 +MultipartBoundaryBegin 6421 +MultipartBoundaryEnd 6449 +MimeEntityBegin 6449 +MimeEntityHeadersEnd 6625 +MimeContentBegin 6625 +MimeMessageBegin 6625 +MimeMessageHeadersEnd 7210 +MimeEntityBegin 6625 +MimeEntityHeadersEnd 7210 +MimeContentBegin 7210 +MimeMessageBegin 7210 +MimeMessageHeadersEnd 7735 +MimeEntityBegin 7210 +MimeEntityHeadersEnd 7735 +MimeContentBegin 7735 +MimeMessageBegin 7735 +MimeMessageHeadersEnd 8156 +MimeEntityBegin 7735 +MimeEntityHeadersEnd 8156 +MimeContentBegin 8156 +MimeContentEnd 8162 +MimeEntityEnd 8164 +MimeMessageEnd 8164 +MimeContentEnd 8164 +MimeEntityEnd 8164 +MimeMessageEnd 8164 +MimeContentEnd 8164 +MimeEntityEnd 8164 +MimeMessageEnd 8164 +MimeContentEnd 8164 +MimeEntityEnd 8164 +MultipartBoundaryBegin 8164 +MultipartBoundaryEnd 8192 +MimeEntityBegin 8192 +MimeEntityHeadersEnd 8248 +MimeContentBegin 8248 +MimeContentEnd 8301 +MimeEntityEnd 8303 +MultipartEndBoundaryBegin 8303 +MultipartEndBoundaryEnd 8331 +MultipartEpilogueBegin 8331 +MultipartEpilogueEnd 8331 +MimeEntityEnd 8333 +MimeMessageEnd 8333 +MboxMarkerBegin 8333 +MboxMarkerEnd 8340 +MimeMessageBegin 8342 +MimeMessageHeadersEnd 8825 +MimeEntityBegin 8342 +MimeEntityHeadersEnd 8825 +MimeContentBegin 8825 +MultipartPreambleBegin 8825 +MultipartPreambleEnd 8873 +MultipartBoundaryBegin 8873 +MultipartBoundaryEnd 8901 +MimeEntityBegin 8901 +MimeEntityHeadersEnd 9054 +MimeContentBegin 9054 +MimeMessageBegin 9054 +MimeMessageHeadersEnd 9493 +MimeEntityBegin 9054 +MimeEntityHeadersEnd 9493 +MimeContentBegin 9493 +MimeContentEnd 9532 +MimeEntityEnd 9534 +MimeMessageEnd 9534 +MimeContentEnd 9534 +MimeEntityEnd 9534 +MultipartBoundaryBegin 9534 +MultipartBoundaryEnd 9562 +MimeEntityBegin 9562 +MimeEntityHeadersEnd 9693 +MimeContentBegin 9693 +MimeContentEnd 10157 +MimeEntityEnd 10159 +MultipartBoundaryBegin 10159 +MultipartBoundaryEnd 10187 +MimeEntityBegin 10187 +MimeEntityHeadersEnd 10318 +MimeContentBegin 10318 +MimeContentEnd 10810 +MimeEntityEnd 10812 +MultipartBoundaryBegin 10812 +MultipartBoundaryEnd 10840 +MimeEntityBegin 10840 +MimeEntityHeadersEnd 10975 +MimeContentBegin 10975 +MimeContentEnd 11509 +MimeEntityEnd 11511 +MultipartBoundaryBegin 11511 +MultipartBoundaryEnd 11539 +MimeEntityBegin 11539 +MimeEntityHeadersEnd 11672 +MimeContentBegin 11672 +MimeContentEnd 12176 +MimeEntityEnd 12178 +MultipartBoundaryBegin 12178 +MultipartBoundaryEnd 12206 +MimeEntityBegin 12206 +MimeEntityHeadersEnd 12359 +MimeContentBegin 12359 +MimeMessageBegin 12359 +MimeMessageHeadersEnd 12798 +MimeEntityBegin 12359 +MimeEntityHeadersEnd 12798 +MimeContentBegin 12798 +MimeContentEnd 12836 +MimeEntityEnd 12838 +MimeMessageEnd 12838 +MimeContentEnd 12838 +MimeEntityEnd 12838 +MultipartBoundaryBegin 12838 +MultipartBoundaryEnd 12866 +MimeEntityBegin 12866 +MimeEntityHeadersEnd 13046 +MimeContentBegin 13046 +MimeMessageBegin 13046 +MimeMessageHeadersEnd 13634 +MimeEntityBegin 13046 +MimeEntityHeadersEnd 13634 +MimeContentBegin 13634 +MimeMessageBegin 13634 +MimeMessageHeadersEnd 14162 +MimeEntityBegin 13634 +MimeEntityHeadersEnd 14162 +MimeContentBegin 14162 +MimeMessageBegin 14162 +MimeMessageHeadersEnd 14582 +MimeEntityBegin 14162 +MimeEntityHeadersEnd 14582 +MimeContentBegin 14582 +MimeContentEnd 14588 +MimeEntityEnd 14590 +MimeMessageEnd 14590 +MimeContentEnd 14590 +MimeEntityEnd 14590 +MimeMessageEnd 14590 +MimeContentEnd 14590 +MimeEntityEnd 14590 +MimeMessageEnd 14590 +MimeContentEnd 14590 +MimeEntityEnd 14590 +MultipartBoundaryBegin 14590 +MultipartBoundaryEnd 14618 +MimeEntityBegin 14618 +MimeEntityHeadersEnd 14678 +MimeContentBegin 14678 +MimeContentEnd 14731 +MimeEntityEnd 14733 +MultipartEndBoundaryBegin 14733 +MultipartEndBoundaryEnd 14761 +MultipartEpilogueBegin 14761 +MultipartEpilogueEnd 14761 +MimeEntityEnd 14763 +MimeMessageEnd 14763 +MboxMarkerBegin 14763 +MboxMarkerEnd 14794 +MimeMessageBegin 14796 +MimeMessageHeadersEnd 16325 +MimeEntityBegin 14796 +MimeEntityHeadersEnd 16325 +MimeContentBegin 16325 +MultipartPreambleBegin 16325 +MultipartPreambleEnd 16327 +MultipartBoundaryBegin 16327 +MultipartBoundaryEnd 16372 +MimeEntityBegin 16372 +MimeEntityHeadersEnd 16466 +MimeContentBegin 16466 +MimeContentEnd 21776 +MimeEntityEnd 21778 +MultipartBoundaryBegin 21778 +MultipartBoundaryEnd 21823 +MimeEntityBegin 21823 +MimeEntityHeadersEnd 22028 +MimeContentBegin 22028 +MimeContentEnd 22970 +MimeEntityEnd 22972 +MultipartEndBoundaryBegin 22972 +MultipartEndBoundaryEnd 23017 +MultipartEpilogueBegin 23017 +MultipartEpilogueEnd 23019 +MimeEntityEnd 23021 +MimeMessageEnd 23021 +MboxMarkerBegin 23021 +MboxMarkerEnd 23052 +MimeMessageBegin 23054 +MimeMessageHeadersEnd 24310 +MimeEntityBegin 23054 +MimeEntityHeadersEnd 24310 +MimeContentBegin 24310 +MultipartPreambleBegin 24310 +MultipartPreambleEnd 24358 +MultipartBoundaryBegin 24358 +MultipartBoundaryEnd 24397 +MimeEntityBegin 24397 +MimeEntityHeadersEnd 24476 +MimeContentBegin 24476 +MimeContentEnd 24506 +MimeEntityEnd 24508 +MultipartBoundaryBegin 24508 +MultipartBoundaryEnd 24547 +MimeEntityBegin 24547 +MimeEntityHeadersEnd 24641 +MimeContentBegin 24641 +MimeMessageBegin 24641 +MimeMessageHeadersEnd 25478 +MimeEntityBegin 24641 +MimeEntityHeadersEnd 25478 +MimeContentBegin 25478 +MultipartPreambleBegin 25478 +MultipartPreambleEnd 25480 +MultipartBoundaryBegin 25480 +MultipartBoundaryEnd 25520 +MimeEntityBegin 25520 +MimeEntityHeadersEnd 25599 +MimeContentBegin 25599 +MimeContentEnd 26242 +MimeEntityEnd 26244 +MultipartBoundaryBegin 26244 +MultipartBoundaryEnd 26284 +MimeEntityBegin 26284 +MimeEntityHeadersEnd 26368 +MimeContentBegin 26368 +MultipartPreambleBegin 26368 +MultipartPreambleEnd 26370 +MultipartBoundaryBegin 26370 +MultipartBoundaryEnd 26410 +MimeEntityBegin 26410 +MimeEntityHeadersEnd 26488 +MimeContentBegin 26488 +MimeContentEnd 27356 +MimeEntityEnd 27358 +MultipartBoundaryBegin 27358 +MultipartBoundaryEnd 27398 +MimeEntityBegin 27398 +MimeEntityHeadersEnd 27587 +MimeContentBegin 27587 +MimeContentEnd 781745 +MimeEntityEnd 781747 +MultipartEndBoundaryBegin 781747 +MultipartEndBoundaryEnd 781787 +MultipartEpilogueBegin 781787 +MultipartEpilogueEnd 781789 +MimeEntityEnd 781791 +MultipartEndBoundaryBegin 781791 +MultipartEndBoundaryEnd 781831 +MultipartEpilogueBegin 781831 +MultipartEpilogueEnd 781837 +MimeEntityEnd 781839 +MimeMessageEnd 781839 +MimeContentEnd 781839 +MimeEntityEnd 781839 +MultipartEndBoundaryBegin 781839 +MultipartEndBoundaryEnd 781878 +MultipartEpilogueBegin 781878 +MultipartEpilogueEnd 781880 +MimeEntityEnd 781882 +MimeMessageEnd 781882 +MboxMarkerBegin 781882 +MboxMarkerEnd 781913 +MimeMessageBegin 781915 +MimeMessageHeadersEnd 783201 +MimeEntityBegin 781915 +MimeEntityHeadersEnd 783201 +MimeContentBegin 783201 +MultipartPreambleBegin 783201 +MultipartPreambleEnd 783203 +MultipartBoundaryBegin 783203 +MultipartBoundaryEnd 783248 +MimeEntityBegin 783248 +MimeEntityHeadersEnd 783342 +MimeContentBegin 783342 +MimeContentEnd 785774 +MimeEntityEnd 785776 +MultipartBoundaryBegin 785776 +MultipartBoundaryEnd 785821 +MimeEntityBegin 785821 +MimeEntityHeadersEnd 785985 +MimeContentBegin 785985 +MimeContentEnd 792087 +MimeEntityEnd 792089 +MultipartBoundaryBegin 792089 +MultipartBoundaryEnd 792134 +MimeEntityBegin 792134 +MimeEntityHeadersEnd 792297 +MimeContentBegin 792297 +MimeContentEnd 804527 +MimeEntityEnd 804529 +MultipartBoundaryBegin 804529 +MultipartBoundaryEnd 804574 +MimeEntityBegin 804574 +MimeEntityHeadersEnd 804739 +MimeContentBegin 804739 +MimeContentEnd 826735 +MimeEntityEnd 826737 +MultipartBoundaryBegin 826737 +MultipartBoundaryEnd 826782 +MimeEntityBegin 826782 +MimeEntityHeadersEnd 826991 +MimeContentBegin 826991 +MimeContentEnd 830429 +MimeEntityEnd 830431 +MultipartEndBoundaryBegin 830431 +MultipartEndBoundaryEnd 830476 +MultipartEpilogueBegin 830476 +MultipartEpilogueEnd 830478 +MimeEntityEnd 830480 +MimeMessageEnd 830480 +MboxMarkerBegin 830480 +MboxMarkerEnd 830487 +MimeMessageBegin 830489 +MimeMessageHeadersEnd 831421 +MimeEntityBegin 830489 +MimeEntityHeadersEnd 831421 +MimeContentBegin 831421 +MultipartPreambleBegin 831421 +MultipartPreambleEnd 831423 +MultipartBoundaryBegin 831423 +MultipartBoundaryEnd 831432 +MimeEntityBegin 831432 +MimeEntityHeadersEnd 831463 +MimeContentBegin 831463 +MimeContentEnd 834089 +MimeEntityEnd 834091 +MultipartEndBoundaryBegin 834091 +MultipartEndBoundaryEnd 834100 +MultipartEpilogueBegin 834100 +MultipartEpilogueEnd 834102 +MimeEntityEnd 834104 +MimeMessageEnd 834104 +MboxMarkerBegin 834104 +MboxMarkerEnd 834135 +MimeMessageBegin 834137 +MimeMessageHeadersEnd 835308 +MimeEntityBegin 834137 +MimeEntityHeadersEnd 835308 +MimeContentBegin 835308 +MultipartPreambleBegin 835308 +MultipartPreambleEnd 835308 +MultipartBoundaryBegin 835308 +MultipartBoundaryEnd 835326 +MimeEntityBegin 835326 +MimeEntityHeadersEnd 835328 +MimeContentBegin 835328 +MimeContentEnd 836249 +MimeEntityEnd 836251 +MultipartBoundaryBegin 836251 +MultipartBoundaryEnd 836269 +MimeEntityBegin 836269 +MimeEntityHeadersEnd 836351 +MimeContentBegin 836351 +MimeContentEnd 837111 +MimeEntityEnd 837113 +MultipartEndBoundaryBegin 837113 +MultipartEndBoundaryEnd 837131 +MultipartEpilogueBegin 837131 +MultipartEpilogueEnd 837133 +MimeEntityEnd 837135 +MimeMessageEnd 837135 +MboxMarkerBegin 837135 +MboxMarkerEnd 837166 +MimeMessageBegin 837168 +MimeMessageHeadersEnd 838329 +MimeEntityBegin 837168 +MimeEntityHeadersEnd 838329 +MimeContentBegin 838329 +MultipartPreambleBegin 838329 +MultipartPreambleEnd 838505 +MultipartBoundaryBegin 838505 +MultipartBoundaryEnd 838513 +MimeEntityBegin 838513 +MimeEntityHeadersEnd 838594 +MimeContentBegin 838594 +MimeContentEnd 839348 +MimeEntityEnd 839350 +MultipartBoundaryBegin 839350 +MultipartBoundaryEnd 839358 +MimeEntityBegin 839358 +MimeEntityHeadersEnd 839541 +MimeContentBegin 839541 +MimeContentEnd 841787 +MimeEntityEnd 841789 +MultipartEndBoundaryBegin 841789 +MultipartEndBoundaryEnd 841797 +MultipartEpilogueBegin 841797 +MultipartEpilogueEnd 841797 +MimeEntityEnd 841799 +MimeMessageEnd 841799 +MboxMarkerBegin 841799 +MboxMarkerEnd 841830 +MimeMessageBegin 841832 +MimeMessageHeadersEnd 842992 +MimeEntityBegin 841832 +MimeEntityHeadersEnd 842992 +MimeContentBegin 842992 +MultipartPreambleBegin 842992 +MultipartPreambleEnd 843168 +MultipartBoundaryBegin 843168 +MultipartBoundaryEnd 843190 +MimeEntityBegin 843190 +MimeEntityHeadersEnd 843271 +MimeContentBegin 843271 +MimeContentEnd 846129 +MimeEntityEnd 846131 +MultipartBoundaryBegin 846131 +MultipartBoundaryEnd 846153 +MimeEntityBegin 846153 +MimeEntityHeadersEnd 846336 +MimeContentBegin 846336 +MimeContentEnd 848918 +MimeEntityEnd 848920 +MultipartEndBoundaryBegin 848920 +MultipartEndBoundaryEnd 848942 +MultipartEpilogueBegin 848942 +MultipartEpilogueEnd 848942 +MimeEntityEnd 848944 +MimeMessageEnd 848944 +MboxMarkerBegin 848944 +MboxMarkerEnd 848975 +MimeMessageBegin 848977 +MimeMessageHeadersEnd 849895 +MimeEntityBegin 848977 +MimeEntityHeadersEnd 849895 +MimeContentBegin 849895 +MultipartPreambleBegin 849895 +MultipartPreambleEnd 849943 +MultipartBoundaryBegin 849943 +MultipartBoundaryEnd 849971 +MimeEntityBegin 849971 +MimeEntityHeadersEnd 850109 +MimeContentBegin 850109 +MimeContentEnd 860977 +MimeEntityEnd 860979 +MultipartBoundaryBegin 860979 +MultipartBoundaryEnd 861007 +MimeEntityBegin 861007 +MimeEntityHeadersEnd 861162 +MimeContentBegin 861162 +MimeContentEnd 865836 +MimeEntityEnd 865838 +MultipartEndBoundaryBegin 865838 +MultipartEndBoundaryEnd 865866 +MultipartEpilogueBegin 865866 +MultipartEpilogueEnd 865868 +MimeEntityEnd 865870 +MimeMessageEnd 865870 +MboxMarkerBegin 865870 +MboxMarkerEnd 865901 +MimeMessageBegin 865903 +MimeMessageHeadersEnd 867318 +MimeEntityBegin 865903 +MimeEntityHeadersEnd 867318 +MimeContentBegin 867318 +MimeContentEnd 868768 +MimeEntityEnd 868770 +MimeMessageEnd 868770 +MboxMarkerBegin 868770 +MboxMarkerEnd 868801 +MimeMessageBegin 868803 +MimeMessageHeadersEnd 870180 +MimeEntityBegin 868803 +MimeEntityHeadersEnd 870180 +MimeContentBegin 870180 +MultipartPreambleBegin 870180 +MultipartPreambleEnd 870182 +MultipartBoundaryBegin 870182 +MultipartBoundaryEnd 870227 +MimeEntityBegin 870227 +MimeEntityHeadersEnd 870294 +MimeContentBegin 870294 +MimeContentEnd 870404 +MimeEntityEnd 870406 +MultipartBoundaryBegin 870406 +MultipartBoundaryEnd 870451 +MimeEntityBegin 870451 +MimeEntityHeadersEnd 870606 +MimeContentBegin 870606 +MimeContentEnd 874592 +MimeEntityEnd 874594 +MultipartEndBoundaryBegin 874594 +MultipartEndBoundaryEnd 874639 +MultipartEpilogueBegin 874639 +MultipartEpilogueEnd 874641 +MimeEntityEnd 874643 +MimeMessageEnd 874643 +MboxMarkerBegin 874643 +MboxMarkerEnd 874674 +MimeMessageBegin 874676 +MimeMessageHeadersEnd 875907 +MimeEntityBegin 874676 +MimeEntityHeadersEnd 875907 +MimeContentBegin 875907 +MimeContentEnd 879457 +MimeEntityEnd 879459 +MimeMessageEnd 879459 +MboxMarkerBegin 879459 +MboxMarkerEnd 879490 +MimeMessageBegin 879492 +MimeMessageHeadersEnd 880590 +MimeEntityBegin 879492 +MimeEntityHeadersEnd 880590 +MimeContentBegin 880590 +MimeContentEnd 881260 +MimeEntityEnd 881262 +MimeMessageEnd 881262 +MboxMarkerBegin 881262 +MboxMarkerEnd 881293 +MimeMessageBegin 881295 +MimeMessageHeadersEnd 882097 +MimeEntityBegin 881295 +MimeEntityHeadersEnd 882097 +MimeContentBegin 882097 +MimeMessageBegin 882097 +MimeMessageHeadersEnd 883500 +MimeEntityBegin 882097 +MimeEntityHeadersEnd 883500 +MimeContentBegin 883500 +MimeContentEnd 884952 +MimeEntityEnd 884954 +MimeMessageEnd 884954 +MimeContentEnd 884954 +MimeEntityEnd 884954 +MimeMessageEnd 884954 +MboxMarkerBegin 884954 +MboxMarkerEnd 884985 +MimeMessageBegin 884987 +MimeMessageHeadersEnd 885714 +MimeEntityBegin 884987 +MimeEntityHeadersEnd 885714 +MimeContentBegin 885714 +MultipartPreambleBegin 885714 +MultipartPreambleEnd 885762 +MultipartBoundaryBegin 885762 +MultipartBoundaryEnd 885790 +MimeEntityBegin 885790 +MimeEntityHeadersEnd 885869 +MimeContentBegin 885869 +MimeContentEnd 885885 +MimeEntityEnd 885887 +MultipartBoundaryBegin 885887 +MultipartBoundaryEnd 885915 +MimeEntityBegin 885915 +MimeEntityHeadersEnd 886073 +MimeContentBegin 886073 +MimeMessageBegin 886073 +MimeMessageHeadersEnd 887476 +MimeEntityBegin 886073 +MimeEntityHeadersEnd 887476 +MimeContentBegin 887476 +MimeContentEnd 888928 +MimeEntityEnd 888930 +MimeMessageEnd 888930 +MimeContentEnd 888930 +MimeEntityEnd 888930 +MultipartEndBoundaryBegin 888930 +MultipartEndBoundaryEnd 888958 +MultipartEpilogueBegin 888958 +MultipartEpilogueEnd 888960 +MimeEntityEnd 888962 +MimeMessageEnd 888962 +MboxMarkerBegin 888962 +MboxMarkerEnd 888993 +MimeMessageBegin 888995 +MimeMessageHeadersEnd 889676 +MimeEntityBegin 888995 +MimeEntityHeadersEnd 889676 +MimeContentBegin 889676 +MultipartPreambleBegin 889676 +MultipartPreambleEnd 889738 +MultipartBoundaryBegin 889738 +MultipartBoundaryEnd 889780 +MimeEntityBegin 889780 +MimeEntityHeadersEnd 889859 +MimeContentBegin 889859 +MimeContentEnd 889901 +MimeEntityEnd 889903 +MultipartBoundaryBegin 889903 +MultipartBoundaryEnd 889945 +MimeEntityBegin 889945 +MimeEntityHeadersEnd 890100 +MimeContentBegin 890100 +MimeContentEnd 895732 +MimeEntityEnd 895734 +MultipartEndBoundaryBegin 895734 +MultipartEndBoundaryEnd 895776 +MultipartEpilogueBegin 895776 +MultipartEpilogueEnd 895778 +MimeEntityEnd 895780 +MimeMessageEnd 895780 +MboxMarkerBegin 895780 +MboxMarkerEnd 895811 +MimeMessageBegin 895813 +MimeMessageHeadersEnd 896896 +MimeEntityBegin 895813 +MimeEntityHeadersEnd 896896 +MimeContentBegin 896896 +MimeContentEnd 907272 +MimeEntityEnd 907274 +MimeMessageEnd 907274 +MboxMarkerBegin 907274 +MboxMarkerEnd 907305 +MimeMessageBegin 907307 +MimeMessageHeadersEnd 908707 +MimeEntityBegin 907307 +MimeEntityHeadersEnd 908707 +MimeContentBegin 908707 +MultipartPreambleBegin 908707 +MultipartPreambleEnd 908769 +MultipartBoundaryBegin 908769 +MultipartBoundaryEnd 908811 +MimeEntityBegin 908811 +MimeEntityHeadersEnd 908890 +MimeContentBegin 908890 +MimeContentEnd 909517 +MimeEntityEnd 909519 +MultipartBoundaryBegin 909519 +MultipartBoundaryEnd 909561 +MimeEntityBegin 909561 +MimeEntityHeadersEnd 909716 +MimeContentBegin 909716 +MimeContentEnd 911528 +MimeEntityEnd 911530 +MultipartEndBoundaryBegin 911530 +MultipartEndBoundaryEnd 911572 +MultipartEpilogueBegin 911572 +MultipartEpilogueEnd 911574 +MimeEntityEnd 911576 +MimeMessageEnd 911576 +MboxMarkerBegin 911576 +MboxMarkerEnd 911607 +MimeMessageBegin 911609 +MimeMessageHeadersEnd 912172 +MimeEntityBegin 911609 +MimeEntityHeadersEnd 912172 +MimeContentBegin 912172 +MimeContentEnd 912702 +MimeEntityEnd 912704 +MimeMessageEnd 912704 +MboxMarkerBegin 912704 +MboxMarkerEnd 912735 +MimeMessageBegin 912737 +MimeMessageHeadersEnd 913972 +MimeEntityBegin 912737 +MimeEntityHeadersEnd 913972 +MimeContentBegin 913972 +MimeContentEnd 916892 +MimeEntityEnd 916894 +MimeMessageEnd 916894 +MboxMarkerBegin 916894 +MboxMarkerEnd 916925 +MimeMessageBegin 916927 +MimeMessageHeadersEnd 918106 +MimeEntityBegin 916927 +MimeEntityHeadersEnd 918106 +MimeContentBegin 918106 +MimeContentEnd 920258 +MimeEntityEnd 920260 +MimeMessageEnd 920260 +MboxMarkerBegin 920260 +MboxMarkerEnd 920291 +MimeMessageBegin 920293 +MimeMessageHeadersEnd 921392 +MimeEntityBegin 920293 +MimeEntityHeadersEnd 921392 +MimeContentBegin 921392 +MultipartPreambleBegin 921392 +MultipartPreambleEnd 921394 +MultipartBoundaryBegin 921394 +MultipartBoundaryEnd 921427 +MimeEntityBegin 921427 +MimeEntityHeadersEnd 921494 +MimeContentBegin 921494 +MimeContentEnd 921494 +MimeEntityEnd 921496 +MultipartBoundaryBegin 921496 +MultipartBoundaryEnd 921529 +MimeEntityBegin 921529 +MimeEntityHeadersEnd 921611 +MimeContentBegin 921611 +MimeContentEnd 924365 +MimeEntityEnd 924367 +MultipartEndBoundaryBegin 924367 +MultipartEndBoundaryEnd 924400 +MultipartEpilogueBegin 924400 +MultipartEpilogueEnd 924402 +MimeEntityEnd 924404 +MimeMessageEnd 924404 +MboxMarkerBegin 924404 +MboxMarkerEnd 924435 +MimeMessageBegin 924437 +MimeMessageHeadersEnd 925493 +MimeEntityBegin 924437 +MimeEntityHeadersEnd 925493 +MimeContentBegin 925493 +MultipartPreambleBegin 925493 +MultipartPreambleEnd 925495 +MultipartBoundaryBegin 925495 +MultipartBoundaryEnd 925536 +MimeEntityBegin 925536 +MimeEntityHeadersEnd 925617 +MimeContentBegin 925617 +MimeContentEnd 926083 +MimeEntityEnd 926085 +MultipartBoundaryBegin 926085 +MultipartBoundaryEnd 926126 +MimeEntityBegin 926126 +MimeEntityHeadersEnd 926204 +MimeContentBegin 926204 +MimeContentEnd 927041 +MimeEntityEnd 927043 +MultipartBoundaryBegin 927043 +MultipartBoundaryEnd 927084 +MimeEntityBegin 927084 +MimeEntityHeadersEnd 927184 +MimeContentBegin 927184 +MimeContentEnd 928400 +MimeEntityEnd 928402 +MultipartEndBoundaryBegin 928402 +MultipartEndBoundaryEnd 928443 +MultipartEpilogueBegin 928443 +MultipartEpilogueEnd 928445 +MimeEntityEnd 928447 +MimeMessageEnd 928447 +MboxMarkerBegin 928447 +MboxMarkerEnd 928478 +MimeMessageBegin 928480 +MimeMessageHeadersEnd 929576 +MimeEntityBegin 928480 +MimeEntityHeadersEnd 929576 +MimeContentBegin 929576 +MultipartPreambleBegin 929576 +MultipartPreambleEnd 929578 +MultipartBoundaryBegin 929578 +MultipartBoundaryEnd 929621 +MimeEntityBegin 929621 +MimeEntityHeadersEnd 929694 +MimeContentBegin 929694 +MimeContentEnd 929853 +MimeEntityEnd 929855 +MultipartBoundaryBegin 929855 +MultipartBoundaryEnd 929898 +MimeEntityBegin 929898 +MimeEntityHeadersEnd 929980 +MimeContentBegin 929980 +MimeContentEnd 934132 +MimeEntityEnd 934134 +MultipartEndBoundaryBegin 934134 +MultipartEndBoundaryEnd 934177 +MultipartEpilogueBegin 934177 +MultipartEpilogueEnd 934179 +MimeEntityEnd 934181 +MimeMessageEnd 934181 +MboxMarkerBegin 934181 +MboxMarkerEnd 934212 +MimeMessageBegin 934214 +MimeMessageHeadersEnd 935337 +MimeEntityBegin 934214 +MimeEntityHeadersEnd 935337 +MimeContentBegin 935337 +MultipartPreambleBegin 935337 +MultipartPreambleEnd 935339 +MultipartBoundaryBegin 935339 +MultipartBoundaryEnd 935373 +MimeEntityBegin 935373 +MimeEntityHeadersEnd 935454 +MimeContentBegin 935454 +MimeContentEnd 935532 +MimeEntityEnd 935534 +MultipartBoundaryBegin 935534 +MultipartBoundaryEnd 935568 +MimeEntityBegin 935568 +MimeEntityHeadersEnd 935650 +MimeContentBegin 935650 +MimeContentEnd 939424 +MimeEntityEnd 939426 +MultipartEndBoundaryBegin 939426 +MultipartEndBoundaryEnd 939460 +MultipartEpilogueBegin 939460 +MultipartEpilogueEnd 939460 +MimeEntityEnd 939462 +MimeMessageEnd 939462 +MboxMarkerBegin 939462 +MboxMarkerEnd 939493 +MimeMessageBegin 939495 +MimeMessageHeadersEnd 940640 +MimeEntityBegin 939495 +MimeEntityHeadersEnd 940640 +MimeContentBegin 940640 +MultipartPreambleBegin 940640 +MultipartPreambleEnd 940757 +MultipartBoundaryBegin 940757 +MultipartBoundaryEnd 940782 +MimeEntityBegin 940782 +MimeEntityHeadersEnd 940823 +MimeContentBegin 940823 +MimeContentEnd 941017 +MimeEntityEnd 941019 +MultipartBoundaryBegin 941019 +MultipartBoundaryEnd 941044 +MimeEntityBegin 941044 +MimeEntityHeadersEnd 941076 +MimeContentBegin 941076 +MimeMessageBegin 941076 +MimeMessageHeadersEnd 941897 +MimeEntityBegin 941076 +MimeEntityHeadersEnd 941897 +MimeContentBegin 941897 +MimeContentEnd 941908 +MimeEntityEnd 941910 +MimeMessageEnd 941910 +MimeContentEnd 941910 +MimeEntityEnd 941910 +MultipartEndBoundaryBegin 941910 +MultipartEndBoundaryEnd 941935 +MultipartEpilogueBegin 941935 +MultipartEpilogueEnd 941937 +MimeEntityEnd 941939 +MimeMessageEnd 941939 +MboxMarkerBegin 941939 +MboxMarkerEnd 941970 +MimeMessageBegin 941972 +MimeMessageHeadersEnd 943868 +MimeEntityBegin 941972 +MimeEntityHeadersEnd 943868 +MimeContentBegin 943868 +MultipartPreambleBegin 943868 +MultipartPreambleEnd 943868 +MultipartBoundaryBegin 943868 +MultipartBoundaryEnd 943913 +MimeEntityBegin 943913 +MimeEntityHeadersEnd 943994 +MimeContentBegin 943994 +MimeContentEnd 944875 +MimeEntityEnd 944877 +MultipartBoundaryBegin 944877 +MultipartBoundaryEnd 944922 +MimeEntityBegin 944922 +MimeEntityHeadersEnd 945088 +MimeContentBegin 945088 +MimeContentEnd 948790 +MimeEntityEnd 948792 +MultipartEndBoundaryBegin 948792 +MultipartEndBoundaryEnd 948837 +MultipartEpilogueBegin 948837 +MultipartEpilogueEnd 948839 +MimeEntityEnd 948839 +MimeMessageEnd 948839 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt new file mode 100644 index 0000000000..222cc78580 --- /dev/null +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -0,0 +1,6896 @@ +MboxMarkerBegin 0 +MboxMarkerEnd 7 +MimeMessageBegin 9 +MimeMessageHeadersEnd 531 +MimeEntityBegin 9 +MimeEntityHeadersEnd 531 +MimeContentBegin 531 +MultipartPreambleBegin 531 +MultipartPreambleEnd 531 +MultipartBoundaryBegin 531 +MultipartBoundaryEnd 549 +MimeEntityBegin 549 +MimeEntityHeadersEnd 648 +MimeContentBegin 648 +MultipartPreambleBegin 648 +MultipartPreambleEnd 648 +MultipartBoundaryBegin 648 +MultipartBoundaryEnd 680 +MimeEntityBegin 680 +MimeEntityHeadersEnd 682 +MimeContentBegin 682 +MimeContentEnd 1413 +MimeEntityEnd 1415 +MultipartBoundaryBegin 1415 +MultipartBoundaryEnd 1447 +MimeEntityBegin 1447 +MimeEntityHeadersEnd 1535 +MimeContentBegin 1535 +MimeContentEnd 33007 +MimeEntityEnd 33009 +MultipartEndBoundaryBegin 33009 +MultipartEndBoundaryEnd 33041 +MultipartEpilogueBegin 33041 +MultipartEpilogueEnd 33041 +MimeEntityEnd 33043 +MultipartBoundaryBegin 33043 +MultipartBoundaryEnd 33061 +MimeEntityBegin 33061 +MimeEntityHeadersEnd 33157 +MimeContentBegin 33157 +MultipartPreambleBegin 33157 +MultipartPreambleEnd 33157 +MultipartBoundaryBegin 33157 +MultipartBoundaryEnd 33189 +MimeEntityBegin 33189 +MimeEntityHeadersEnd 33275 +MimeContentBegin 33275 +MimeContentEnd 59275 +MimeEntityEnd 59277 +MultipartBoundaryBegin 59277 +MultipartBoundaryEnd 59309 +MimeEntityBegin 59309 +MimeEntityHeadersEnd 59395 +MimeContentBegin 59395 +MimeContentEnd 78061 +MimeEntityEnd 78063 +MultipartBoundaryBegin 78063 +MultipartBoundaryEnd 78095 +MimeEntityBegin 78095 +MimeEntityHeadersEnd 78212 +MimeContentBegin 78212 +MimeContentEnd 124337 +MimeEntityEnd 124339 +MultipartBoundaryBegin 124339 +MultipartBoundaryEnd 124371 +MimeEntityBegin 124371 +MimeEntityHeadersEnd 124435 +MimeContentBegin 124435 +MimeContentEnd 133638 +MimeEntityEnd 133640 +MultipartEndBoundaryBegin 133640 +MultipartEndBoundaryEnd 133672 +MultipartEpilogueBegin 133672 +MultipartEpilogueEnd 133672 +MimeEntityEnd 133674 +MultipartBoundaryBegin 133674 +MultipartBoundaryEnd 133692 +MimeEntityBegin 133692 +MimeEntityHeadersEnd 133780 +MimeContentBegin 133780 +MimeContentEnd 181602 +MimeEntityEnd 181604 +MultipartEndBoundaryBegin 181604 +MultipartEndBoundaryEnd 181622 +MultipartEpilogueBegin 181622 +MultipartEpilogueEnd 181624 +MimeEntityEnd 181626 +MimeMessageEnd 181626 +MboxMarkerBegin 181626 +MboxMarkerEnd 181633 +MimeMessageBegin 181635 +MimeMessageHeadersEnd 182198 +MimeEntityBegin 181635 +MimeEntityHeadersEnd 182198 +MimeContentBegin 182198 +MimeContentEnd 319322 +MimeEntityEnd 319324 +MimeMessageEnd 319324 +MboxMarkerBegin 319324 +MboxMarkerEnd 319331 +MimeMessageBegin 319333 +MimeMessageHeadersEnd 319720 +MimeEntityBegin 319333 +MimeEntityHeadersEnd 319720 +MimeContentBegin 319720 +MimeContentEnd 319924 +MimeEntityEnd 319926 +MimeMessageEnd 319926 +MboxMarkerBegin 319926 +MboxMarkerEnd 319933 +MimeMessageBegin 319935 +MimeMessageHeadersEnd 320596 +MimeEntityBegin 319935 +MimeEntityHeadersEnd 320596 +MimeContentBegin 320596 +MultipartPreambleBegin 320596 +MultipartPreambleEnd 320754 +MultipartBoundaryBegin 320754 +MultipartBoundaryEnd 320795 +MimeEntityBegin 320795 +MimeEntityHeadersEnd 320841 +MimeContentBegin 320841 +MimeContentEnd 321080 +MimeEntityEnd 321082 +MultipartBoundaryBegin 321082 +MultipartBoundaryEnd 321123 +MimeEntityBegin 321123 +MimeEntityHeadersEnd 321211 +MimeContentBegin 321211 +MultipartPreambleBegin 321211 +MultipartPreambleEnd 321211 +MultipartBoundaryBegin 321211 +MultipartBoundaryEnd 321254 +MimeEntityBegin 321254 +MimeEntityHeadersEnd 321348 +MimeContentBegin 321348 +MimeContentEnd 321497 +MimeEntityEnd 321499 +MultipartBoundaryBegin 321499 +MultipartBoundaryEnd 321542 +MimeEntityBegin 321542 +MimeEntityHeadersEnd 321656 +MimeContentBegin 321656 +MimeContentEnd 326088 +MimeEntityEnd 326090 +MultipartBoundaryBegin 326090 +MultipartBoundaryEnd 326133 +MimeEntityBegin 326133 +MimeEntityHeadersEnd 326227 +MimeContentBegin 326227 +MimeContentEnd 326275 +MimeEntityEnd 326277 +MultipartEndBoundaryBegin 326277 +MultipartEndBoundaryEnd 326320 +MultipartEpilogueBegin 326320 +MultipartEpilogueEnd 326322 +MimeEntityEnd 326324 +MultipartEndBoundaryBegin 326324 +MultipartEndBoundaryEnd 326365 +MultipartEpilogueBegin 326365 +MultipartEpilogueEnd 326365 +MimeEntityEnd 326367 +MimeMessageEnd 326367 +MboxMarkerBegin 326367 +MboxMarkerEnd 326374 +MimeMessageBegin 326376 +MimeMessageHeadersEnd 327141 +MimeEntityBegin 326376 +MimeEntityHeadersEnd 327141 +MimeContentBegin 327141 +MultipartPreambleBegin 327141 +MultipartPreambleEnd 327340 +MultipartBoundaryBegin 327340 +MultipartBoundaryEnd 327403 +MimeEntityBegin 327403 +MimeEntityHeadersEnd 327479 +MimeContentBegin 327479 +MimeContentEnd 327915 +MimeEntityEnd 327917 +MultipartBoundaryBegin 327917 +MultipartBoundaryEnd 327980 +MimeEntityBegin 327980 +MimeEntityHeadersEnd 328012 +MimeContentBegin 328012 +MimeMessageBegin 328012 +MimeMessageHeadersEnd 328864 +MimeEntityBegin 328012 +MimeEntityHeadersEnd 328864 +MimeContentBegin 328864 +MultipartPreambleBegin 328864 +MultipartPreambleEnd 329148 +MultipartBoundaryBegin 329148 +MultipartBoundaryEnd 329179 +MimeEntityBegin 329179 +MimeEntityHeadersEnd 329276 +MimeContentBegin 329276 +MimeContentEnd 329386 +MimeEntityEnd 329388 +MultipartBoundaryBegin 329388 +MultipartBoundaryEnd 329419 +MimeEntityBegin 329419 +MimeEntityHeadersEnd 329511 +MimeContentBegin 329511 +MimeContentEnd 350421 +MimeEntityEnd 350423 +MultipartBoundaryBegin 350423 +MultipartBoundaryEnd 350454 +MimeEntityBegin 350454 +MimeEntityHeadersEnd 350456 +MimeContentBegin 350456 +MimeContentEnd 350456 +MimeEntityEnd 350456 +MimeEntityEnd 350456 +MimeMessageEnd 350456 +MimeContentEnd 350456 +MimeEntityEnd 350456 +MultipartBoundaryBegin 350456 +MultipartBoundaryEnd 350519 +MimeEntityBegin 350519 +MimeEntityHeadersEnd 350595 +MimeContentBegin 350595 +MimeContentEnd 350706 +MimeEntityEnd 350708 +MultipartEndBoundaryBegin 350708 +MultipartEndBoundaryEnd 350771 +MultipartEpilogueBegin 350771 +MultipartEpilogueEnd 350773 +MimeEntityEnd 350775 +MimeMessageEnd 350775 +MboxMarkerBegin 350775 +MboxMarkerEnd 350782 +MimeMessageBegin 350784 +MimeMessageHeadersEnd 351518 +MimeEntityBegin 350784 +MimeEntityHeadersEnd 351518 +MimeContentBegin 351518 +MultipartPreambleBegin 351518 +MultipartPreambleEnd 351676 +MultipartBoundaryBegin 351676 +MultipartBoundaryEnd 351717 +MimeEntityBegin 351717 +MimeEntityHeadersEnd 351763 +MimeContentBegin 351763 +MimeContentEnd 352541 +MimeEntityEnd 352543 +MultipartBoundaryBegin 352543 +MultipartBoundaryEnd 352584 +MimeEntityBegin 352584 +MimeEntityHeadersEnd 352672 +MimeContentBegin 352672 +MultipartPreambleBegin 352672 +MultipartPreambleEnd 352672 +MultipartBoundaryBegin 352672 +MultipartBoundaryEnd 352715 +MimeEntityBegin 352715 +MimeEntityHeadersEnd 352809 +MimeContentBegin 352809 +MimeContentEnd 353038 +MimeEntityEnd 353040 +MultipartBoundaryBegin 353040 +MultipartBoundaryEnd 353083 +MimeEntityBegin 353083 +MimeEntityHeadersEnd 353195 +MimeContentBegin 353195 +MimeContentEnd 1037241 +MimeEntityEnd 1037243 +MultipartBoundaryBegin 1037243 +MultipartBoundaryEnd 1037286 +MimeEntityBegin 1037286 +MimeEntityHeadersEnd 1037380 +MimeContentBegin 1037380 +MimeContentEnd 1037501 +MimeEntityEnd 1037503 +MultipartBoundaryBegin 1037503 +MultipartBoundaryEnd 1037546 +MimeEntityBegin 1037546 +MimeEntityHeadersEnd 1037676 +MimeContentBegin 1037676 +MimeContentEnd 1727872 +MimeEntityEnd 1727874 +MultipartBoundaryBegin 1727874 +MultipartBoundaryEnd 1727917 +MimeEntityBegin 1727917 +MimeEntityHeadersEnd 1728011 +MimeContentBegin 1728011 +MimeContentEnd 1728023 +MimeEntityEnd 1728025 +MultipartBoundaryBegin 1728025 +MultipartBoundaryEnd 1728068 +MimeEntityBegin 1728068 +MimeEntityHeadersEnd 1728189 +MimeContentBegin 1728189 +MimeContentEnd 1797301 +MimeEntityEnd 1797303 +MultipartBoundaryBegin 1797303 +MultipartBoundaryEnd 1797346 +MimeEntityBegin 1797346 +MimeEntityHeadersEnd 1797440 +MimeContentBegin 1797440 +MimeContentEnd 1797583 +MimeEntityEnd 1797585 +MultipartBoundaryBegin 1797585 +MultipartBoundaryEnd 1797628 +MimeEntityBegin 1797628 +MimeEntityHeadersEnd 1797750 +MimeContentBegin 1797750 +MimeContentEnd 2138984 +MimeEntityEnd 2138986 +MultipartBoundaryBegin 2138986 +MultipartBoundaryEnd 2139029 +MimeEntityBegin 2139029 +MimeEntityHeadersEnd 2139123 +MimeContentBegin 2139123 +MimeContentEnd 2139129 +MimeEntityEnd 2139131 +MultipartEndBoundaryBegin 2139131 +MultipartEndBoundaryEnd 2139174 +MultipartEpilogueBegin 2139174 +MultipartEpilogueEnd 2139176 +MimeEntityEnd 2139178 +MultipartEndBoundaryBegin 2139178 +MultipartEndBoundaryEnd 2139219 +MultipartEpilogueBegin 2139219 +MultipartEpilogueEnd 2139219 +MimeEntityEnd 2139221 +MimeMessageEnd 2139221 +MboxMarkerBegin 2139221 +MboxMarkerEnd 2139228 +MimeMessageBegin 2139230 +MimeMessageHeadersEnd 2140267 +MimeEntityBegin 2139230 +MimeEntityHeadersEnd 2140267 +MimeContentBegin 2140267 +MimeContentEnd 2141431 +MimeEntityEnd 2141433 +MimeMessageEnd 2141433 +MboxMarkerBegin 2141433 +MboxMarkerEnd 2141440 +MimeMessageBegin 2141442 +MimeMessageHeadersEnd 2141689 +MimeEntityBegin 2141442 +MimeEntityHeadersEnd 2141689 +MimeContentBegin 2141689 +MultipartPreambleBegin 2141689 +MultipartPreambleEnd 2141689 +MultipartBoundaryBegin 2141689 +MultipartBoundaryEnd 2141705 +MimeEntityBegin 2141705 +MimeEntityHeadersEnd 2141707 +MimeContentBegin 2141707 +MimeContentEnd 2142012 +MimeEntityEnd 2142014 +MultipartBoundaryBegin 2142014 +MultipartBoundaryEnd 2142030 +MimeEntityBegin 2142030 +MimeEntityHeadersEnd 2142109 +MimeContentBegin 2142109 +MultipartPreambleBegin 2142109 +MultipartPreambleEnd 2142109 +MultipartBoundaryBegin 2142109 +MultipartBoundaryEnd 2142126 +MimeEntityBegin 2142126 +MimeEntityHeadersEnd 2142207 +MimeContentBegin 2142207 +MimeContentEnd 2145483 +MimeEntityEnd 2145485 +MultipartBoundaryBegin 2145485 +MultipartBoundaryEnd 2145502 +MimeEntityBegin 2145502 +MimeEntityHeadersEnd 2145610 +MimeContentBegin 2145610 +MimeContentEnd 2302316 +MimeEntityEnd 2302318 +MultipartEndBoundaryBegin 2302318 +MultipartEndBoundaryEnd 2302335 +MultipartEpilogueBegin 2302335 +MultipartEpilogueEnd 2302335 +MimeEntityEnd 2302337 +MultipartBoundaryBegin 2302337 +MultipartBoundaryEnd 2302353 +MimeEntityBegin 2302353 +MimeEntityHeadersEnd 2302412 +MimeContentBegin 2302412 +MimeContentEnd 2307327 +MimeEntityEnd 2307329 +MultipartEndBoundaryBegin 2307329 +MultipartEndBoundaryEnd 2307345 +MultipartEpilogueBegin 2307345 +MultipartEpilogueEnd 2307345 +MimeEntityEnd 2307347 +MimeMessageEnd 2307347 +MboxMarkerBegin 2307347 +MboxMarkerEnd 2307354 +MimeMessageBegin 2307356 +MimeMessageHeadersEnd 2308328 +MimeEntityBegin 2307356 +MimeEntityHeadersEnd 2308328 +MimeContentBegin 2308328 +MimeContentEnd 2655844 +MimeEntityEnd 2655846 +MimeMessageEnd 2655846 +MboxMarkerBegin 2655846 +MboxMarkerEnd 2655853 +MimeMessageBegin 2655855 +MimeMessageHeadersEnd 2655994 +MimeEntityBegin 2655855 +MimeEntityHeadersEnd 2655994 +MimeContentBegin 2655994 +MultipartPreambleBegin 2655994 +MultipartPreambleEnd 2655994 +MultipartBoundaryBegin 2655994 +MultipartBoundaryEnd 2656012 +MimeEntityBegin 2656012 +MimeEntityHeadersEnd 2656087 +MimeContentBegin 2656087 +MultipartPreambleBegin 2656087 +MultipartPreambleEnd 2656087 +MultipartBoundaryBegin 2656087 +MultipartBoundaryEnd 2656119 +MimeEntityBegin 2656119 +MimeEntityHeadersEnd 2656121 +MimeContentBegin 2656121 +MimeContentEnd 2656845 +MimeEntityEnd 2656847 +MultipartBoundaryBegin 2656847 +MultipartBoundaryEnd 2656879 +MimeEntityBegin 2656879 +MimeEntityHeadersEnd 2656980 +MimeContentBegin 2656980 +MimeContentEnd 2688452 +MimeEntityEnd 2688454 +MultipartEndBoundaryBegin 2688454 +MultipartEndBoundaryEnd 2688486 +MultipartEpilogueBegin 2688486 +MultipartEpilogueEnd 2688486 +MimeEntityEnd 2688488 +MultipartEndBoundaryBegin 2688488 +MultipartEndBoundaryEnd 2688506 +MultipartEpilogueBegin 2688506 +MultipartEpilogueEnd 2688506 +MimeEntityEnd 2688508 +MimeMessageEnd 2688508 +MboxMarkerBegin 2688508 +MboxMarkerEnd 2688515 +MimeMessageBegin 2688517 +MimeMessageHeadersEnd 2689088 +MimeEntityBegin 2688517 +MimeEntityHeadersEnd 2689088 +MimeContentBegin 2689088 +MimeContentEnd 2746649 +MimeEntityEnd 2746651 +MimeMessageEnd 2746651 +MboxMarkerBegin 2746651 +MboxMarkerEnd 2746658 +MimeMessageBegin 2746660 +MimeMessageHeadersEnd 2747410 +MimeEntityBegin 2746660 +MimeEntityHeadersEnd 2747410 +MimeContentBegin 2747410 +MultipartPreambleBegin 2747410 +MultipartPreambleEnd 2747944 +MultipartBoundaryBegin 2747944 +MultipartBoundaryEnd 2748003 +MimeEntityBegin 2748003 +MimeEntityHeadersEnd 2748005 +MimeContentBegin 2748005 +MimeContentEnd 2748571 +MimeEntityEnd 2748573 +MultipartBoundaryBegin 2748573 +MultipartBoundaryEnd 2748632 +MimeEntityBegin 2748632 +MimeEntityHeadersEnd 2748738 +MimeContentBegin 2748738 +MultipartPreambleBegin 2748738 +MultipartPreambleEnd 2748738 +MultipartBoundaryBegin 2748738 +MultipartBoundaryEnd 2748799 +MimeEntityBegin 2748799 +MimeEntityHeadersEnd 2748875 +MimeContentBegin 2748875 +MimeContentEnd 2749301 +MimeEntityEnd 2749303 +MultipartBoundaryBegin 2749303 +MultipartBoundaryEnd 2749364 +MimeEntityBegin 2749364 +MimeEntityHeadersEnd 2749426 +MimeContentBegin 2749426 +MimeContentEnd 2779088 +MimeEntityEnd 2779090 +MultipartBoundaryBegin 2779090 +MultipartBoundaryEnd 2779151 +MimeEntityBegin 2779151 +MimeEntityHeadersEnd 2779224 +MimeContentBegin 2779224 +MimeContentEnd 2779269 +MimeEntityEnd 2779271 +MultipartEndBoundaryBegin 2779271 +MultipartEndBoundaryEnd 2779332 +MultipartEpilogueBegin 2779332 +MultipartEpilogueEnd 2779334 +MimeEntityEnd 2779336 +MultipartEndBoundaryBegin 2779336 +MultipartEndBoundaryEnd 2779395 +MultipartEpilogueBegin 2779395 +MultipartEpilogueEnd 2779395 +MimeEntityEnd 2779397 +MimeMessageEnd 2779397 +MboxMarkerBegin 2779397 +MboxMarkerEnd 2779404 +MimeMessageBegin 2779406 +MimeMessageHeadersEnd 2780075 +MimeEntityBegin 2779406 +MimeEntityHeadersEnd 2780075 +MimeContentBegin 2780075 +MultipartPreambleBegin 2780075 +MultipartPreambleEnd 2780422 +MultipartBoundaryBegin 2780422 +MultipartBoundaryEnd 2780452 +MimeEntityBegin 2780452 +MimeEntityHeadersEnd 2780454 +MimeContentBegin 2780454 +MimeContentEnd 2781302 +MimeEntityEnd 2781304 +MultipartBoundaryBegin 2781304 +MultipartBoundaryEnd 2781334 +MimeEntityBegin 2781334 +MimeEntityHeadersEnd 2781410 +MimeContentBegin 2781410 +MultipartPreambleBegin 2781410 +MultipartPreambleEnd 2781410 +MultipartBoundaryBegin 2781410 +MultipartBoundaryEnd 2781442 +MimeEntityBegin 2781442 +MimeEntityHeadersEnd 2781470 +MimeContentBegin 2781470 +MimeContentEnd 2781612 +MimeEntityEnd 2781614 +MultipartBoundaryBegin 2781614 +MultipartBoundaryEnd 2781646 +MimeEntityBegin 2781646 +MimeEntityHeadersEnd 2781714 +MimeContentBegin 2781714 +MimeContentEnd 2782928 +MimeEntityEnd 2782930 +MultipartBoundaryBegin 2782930 +MultipartBoundaryEnd 2782962 +MimeEntityBegin 2782962 +MimeEntityHeadersEnd 2782990 +MimeContentBegin 2782990 +MimeContentEnd 2783058 +MimeEntityEnd 2783060 +MultipartBoundaryBegin 2783060 +MultipartBoundaryEnd 2783092 +MimeEntityBegin 2783092 +MimeEntityHeadersEnd 2783160 +MimeContentBegin 2783160 +MimeContentEnd 2784382 +MimeEntityEnd 2784384 +MultipartBoundaryBegin 2784384 +MultipartBoundaryEnd 2784416 +MimeEntityBegin 2784416 +MimeEntityHeadersEnd 2784447 +MimeContentBegin 2784447 +MimeContentEnd 2785006 +MimeEntityEnd 2785008 +MultipartEndBoundaryBegin 2785008 +MultipartEndBoundaryEnd 2785040 +MultipartEpilogueBegin 2785040 +MultipartEpilogueEnd 2785042 +MimeEntityEnd 2785044 +MultipartEndBoundaryBegin 2785044 +MultipartEndBoundaryEnd 2785074 +MultipartEpilogueBegin 2785074 +MultipartEpilogueEnd 2785076 +MimeEntityEnd 2785078 +MimeMessageEnd 2785078 +MboxMarkerBegin 2785078 +MboxMarkerEnd 2785085 +MimeMessageBegin 2785087 +MimeMessageHeadersEnd 2786084 +MimeEntityBegin 2785087 +MimeEntityHeadersEnd 2786084 +MimeContentBegin 2786084 +MimeContentEnd 2787498 +MimeEntityEnd 2787500 +MimeMessageEnd 2787500 +MboxMarkerBegin 2787500 +MboxMarkerEnd 2787507 +MimeMessageBegin 2787509 +MimeMessageHeadersEnd 2787772 +MimeEntityBegin 2787509 +MimeEntityHeadersEnd 2787772 +MimeContentBegin 2787772 +MimeContentEnd 2788033 +MimeEntityEnd 2788035 +MimeMessageEnd 2788035 +MboxMarkerBegin 2788035 +MboxMarkerEnd 2788042 +MimeMessageBegin 2788044 +MimeMessageHeadersEnd 2788716 +MimeEntityBegin 2788044 +MimeEntityHeadersEnd 2788716 +MimeContentBegin 2788716 +MimeContentEnd 2789453 +MimeEntityEnd 2789455 +MimeMessageEnd 2789455 +MboxMarkerBegin 2789455 +MboxMarkerEnd 2789462 +MimeMessageBegin 2789464 +MimeMessageHeadersEnd 2790463 +MimeEntityBegin 2789464 +MimeEntityHeadersEnd 2790463 +MimeContentBegin 2790463 +MultipartPreambleBegin 2790463 +MultipartPreambleEnd 2790467 +MultipartBoundaryBegin 2790467 +MultipartBoundaryEnd 2790507 +MimeEntityBegin 2790507 +MimeEntityHeadersEnd 2790555 +MimeContentBegin 2790555 +MimeContentEnd 2790632 +MimeEntityEnd 2790634 +MultipartBoundaryBegin 2790634 +MultipartBoundaryEnd 2790674 +MimeEntityBegin 2790674 +MimeEntityHeadersEnd 2790763 +MimeContentBegin 2790763 +MultipartPreambleBegin 2790763 +MultipartPreambleEnd 2790767 +MultipartBoundaryBegin 2790767 +MultipartBoundaryEnd 2790808 +MimeEntityBegin 2790808 +MimeEntityHeadersEnd 2790967 +MimeContentBegin 2790967 +MimeContentEnd 2857841 +MimeEntityEnd 2857843 +MultipartBoundaryBegin 2857843 +MultipartBoundaryEnd 2857884 +MimeEntityBegin 2857884 +MimeEntityHeadersEnd 2858099 +MimeContentBegin 2858099 +MimeContentEnd 3227661 +MimeEntityEnd 3227663 +MultipartEndBoundaryBegin 3227663 +MultipartEndBoundaryEnd 3227704 +MultipartEpilogueBegin 3227704 +MultipartEpilogueEnd 3227708 +MimeEntityEnd 3227710 +MultipartEndBoundaryBegin 3227710 +MultipartEndBoundaryEnd 3227750 +MultipartEpilogueBegin 3227750 +MultipartEpilogueEnd 3227750 +MimeEntityEnd 3227752 +MimeMessageEnd 3227752 +MboxMarkerBegin 3227752 +MboxMarkerEnd 3227759 +MimeMessageBegin 3227761 +MimeMessageHeadersEnd 3228760 +MimeEntityBegin 3227761 +MimeEntityHeadersEnd 3228760 +MimeContentBegin 3228760 +MultipartPreambleBegin 3228760 +MultipartPreambleEnd 3228764 +MultipartBoundaryBegin 3228764 +MultipartBoundaryEnd 3228804 +MimeEntityBegin 3228804 +MimeEntityHeadersEnd 3228852 +MimeContentBegin 3228852 +MimeContentEnd 3228929 +MimeEntityEnd 3228931 +MultipartBoundaryBegin 3228931 +MultipartBoundaryEnd 3228971 +MimeEntityBegin 3228971 +MimeEntityHeadersEnd 3229059 +MimeContentBegin 3229059 +MultipartPreambleBegin 3229059 +MultipartPreambleEnd 3229063 +MultipartBoundaryBegin 3229063 +MultipartBoundaryEnd 3229104 +MimeEntityBegin 3229104 +MimeEntityHeadersEnd 3229263 +MimeContentBegin 3229263 +MimeContentEnd 3296137 +MimeEntityEnd 3296139 +MultipartBoundaryBegin 3296139 +MultipartBoundaryEnd 3296180 +MimeEntityBegin 3296180 +MimeEntityHeadersEnd 3296395 +MimeContentBegin 3296395 +MimeContentEnd 3665957 +MimeEntityEnd 3665959 +MultipartEndBoundaryBegin 3665959 +MultipartEndBoundaryEnd 3666000 +MultipartEpilogueBegin 3666000 +MultipartEpilogueEnd 3666004 +MimeEntityEnd 3666006 +MultipartEndBoundaryBegin 3666006 +MultipartEndBoundaryEnd 3666046 +MultipartEpilogueBegin 3666046 +MultipartEpilogueEnd 3666046 +MimeEntityEnd 3666048 +MimeMessageEnd 3666048 +MboxMarkerBegin 3666048 +MboxMarkerEnd 3666055 +MimeMessageBegin 3666057 +MimeMessageHeadersEnd 3666630 +MimeEntityBegin 3666057 +MimeEntityHeadersEnd 3666630 +MimeContentBegin 3666630 +MimeMessageBegin 3666630 +MimeMessageHeadersEnd 3666692 +MimeEntityBegin 3666630 +MimeEntityHeadersEnd 3666692 +MimeContentBegin 3666692 +MimeContentEnd 3667232 +MimeEntityEnd 3667234 +MimeMessageEnd 3667234 +MimeContentEnd 3667234 +MimeEntityEnd 3667234 +MimeMessageEnd 3667234 +MboxMarkerBegin 3667234 +MboxMarkerEnd 3667241 +MimeMessageBegin 3667243 +MimeMessageHeadersEnd 3667974 +MimeEntityBegin 3667243 +MimeEntityHeadersEnd 3667974 +MimeContentBegin 3667974 +MultipartPreambleBegin 3667974 +MultipartPreambleEnd 3667976 +MultipartBoundaryBegin 3667976 +MultipartBoundaryEnd 3668020 +MimeEntityBegin 3668020 +MimeEntityHeadersEnd 3668048 +MimeContentBegin 3668048 +MimeContentEnd 3668234 +MimeEntityEnd 3668236 +MultipartBoundaryBegin 3668236 +MultipartBoundaryEnd 3668280 +MimeEntityBegin 3668280 +MimeEntityHeadersEnd 3668355 +MimeContentBegin 3668355 +MimeContentEnd 3669259 +MimeEntityEnd 3669261 +MultipartEndBoundaryBegin 3669261 +MultipartEndBoundaryEnd 3669305 +MultipartEpilogueBegin 3669305 +MultipartEpilogueEnd 3669418 +MimeEntityEnd 3669420 +MimeMessageEnd 3669420 +MboxMarkerBegin 3669420 +MboxMarkerEnd 3669427 +MimeMessageBegin 3669429 +MimeMessageHeadersEnd 3669982 +MimeEntityBegin 3669429 +MimeEntityHeadersEnd 3669982 +MimeContentBegin 3669982 +MultipartPreambleBegin 3669982 +MultipartPreambleEnd 3670021 +MultipartBoundaryBegin 3670021 +MultipartBoundaryEnd 3670061 +MimeEntityBegin 3670061 +MimeEntityHeadersEnd 3670063 +MimeContentBegin 3670063 +MimeContentEnd 3670465 +MimeEntityEnd 3670467 +MultipartBoundaryBegin 3670467 +MultipartBoundaryEnd 3670507 +MimeEntityBegin 3670507 +MimeEntityHeadersEnd 3670539 +MimeContentBegin 3670539 +MimeMessageBegin 3670539 +MimeMessageHeadersEnd 3671342 +MimeEntityBegin 3670539 +MimeEntityHeadersEnd 3671342 +MimeContentBegin 3671342 +MimeContentEnd 3674767 +MimeEntityEnd 3674769 +MimeMessageEnd 3674769 +MimeContentEnd 3674769 +MimeEntityEnd 3674769 +MultipartEndBoundaryBegin 3674769 +MultipartEndBoundaryEnd 3674809 +MultipartEpilogueBegin 3674809 +MultipartEpilogueEnd 3674811 +MimeEntityEnd 3674813 +MimeMessageEnd 3674813 +MboxMarkerBegin 3674813 +MboxMarkerEnd 3674820 +MimeMessageBegin 3674822 +MimeMessageHeadersEnd 3675488 +MimeEntityBegin 3674822 +MimeEntityHeadersEnd 3675488 +MimeContentBegin 3675488 +MultipartPreambleBegin 3675488 +MultipartPreambleEnd 3675488 +MultipartBoundaryBegin 3675488 +MultipartBoundaryEnd 3675538 +MimeEntityBegin 3675538 +MimeEntityHeadersEnd 3675566 +MimeContentBegin 3675566 +MimeContentEnd 3675644 +MimeEntityEnd 3675646 +MultipartBoundaryBegin 3675646 +MultipartBoundaryEnd 3675696 +MimeEntityBegin 3675696 +MimeEntityHeadersEnd 3675761 +MimeContentBegin 3675761 +MimeMessageBegin 3675761 +MimeMessageHeadersEnd 3676560 +MimeEntityBegin 3675761 +MimeEntityHeadersEnd 3676560 +MimeContentBegin 3676560 +MimeContentEnd 3676700 +MimeEntityEnd 3676702 +MimeMessageEnd 3676702 +MimeContentEnd 3676702 +MimeEntityEnd 3676702 +MultipartEndBoundaryBegin 3676702 +MultipartEndBoundaryEnd 3676752 +MultipartEpilogueBegin 3676752 +MultipartEpilogueEnd 3676752 +MimeEntityEnd 3676754 +MimeMessageEnd 3676754 +MboxMarkerBegin 3676754 +MboxMarkerEnd 3676761 +MimeMessageBegin 3676763 +MimeMessageHeadersEnd 3677286 +MimeEntityBegin 3676763 +MimeEntityHeadersEnd 3677286 +MimeContentBegin 3677286 +MimeContentEnd 3678750 +MimeEntityEnd 3678752 +MimeMessageEnd 3678752 +MboxMarkerBegin 3678752 +MboxMarkerEnd 3678802 +MimeMessageBegin 3678804 +MimeMessageHeadersEnd 3679391 +MimeEntityBegin 3678804 +MimeEntityHeadersEnd 3679391 +MimeContentBegin 3679391 +MimeContentEnd 3740046 +MimeEntityEnd 3740048 +MimeMessageEnd 3740048 +MboxMarkerBegin 3740048 +MboxMarkerEnd 3740098 +MimeMessageBegin 3740100 +MimeMessageHeadersEnd 3740684 +MimeEntityBegin 3740100 +MimeEntityHeadersEnd 3740684 +MimeContentBegin 3740684 +MimeContentEnd 3801451 +MimeEntityEnd 3801453 +MimeMessageEnd 3801453 +MboxMarkerBegin 3801453 +MboxMarkerEnd 3801460 +MimeMessageBegin 3801462 +MimeMessageHeadersEnd 3802023 +MimeEntityBegin 3801462 +MimeEntityHeadersEnd 3802023 +MimeContentBegin 3802023 +MultipartPreambleBegin 3802023 +MultipartPreambleEnd 3802025 +MultipartBoundaryBegin 3802025 +MultipartBoundaryEnd 3802041 +MimeEntityBegin 3802041 +MimeEntityHeadersEnd 3802070 +MimeContentBegin 3802070 +MimeContentEnd 3802145 +MimeEntityEnd 3802147 +MultipartBoundaryBegin 3802147 +MultipartBoundaryEnd 3802163 +MimeEntityBegin 3802163 +MimeEntityHeadersEnd 3802247 +MimeContentBegin 3802247 +MimeContentEnd 3802897 +MimeEntityEnd 3802899 +MultipartEndBoundaryBegin 3802899 +MultipartEndBoundaryEnd 3802915 +MultipartEpilogueBegin 3802915 +MultipartEpilogueEnd 3802919 +MimeEntityEnd 3802921 +MimeMessageEnd 3802921 +MboxMarkerBegin 3802921 +MboxMarkerEnd 3802928 +MimeMessageBegin 3802930 +MimeMessageHeadersEnd 3803695 +MimeEntityBegin 3802930 +MimeEntityHeadersEnd 3803695 +MimeContentBegin 3803695 +MimeContentEnd 3845795 +MimeEntityEnd 3845797 +MimeMessageEnd 3845797 +MboxMarkerBegin 3845797 +MboxMarkerEnd 3845804 +MimeMessageBegin 3845806 +MimeMessageHeadersEnd 3846985 +MimeEntityBegin 3845806 +MimeEntityHeadersEnd 3846985 +MimeContentBegin 3846985 +MultipartPreambleBegin 3846985 +MultipartPreambleEnd 3846985 +MultipartBoundaryBegin 3846985 +MultipartBoundaryEnd 3846991 +MimeEntityBegin 3846991 +MimeEntityHeadersEnd 3846993 +MimeContentBegin 3846993 +MimeContentEnd 3848958 +MimeEntityEnd 3848960 +MultipartBoundaryBegin 3848960 +MultipartBoundaryEnd 3848966 +MimeEntityBegin 3848966 +MimeEntityHeadersEnd 3849075 +MimeContentBegin 3849075 +MimeContentEnd 3855383 +MimeEntityEnd 3855385 +MultipartEndBoundaryBegin 3855385 +MultipartEndBoundaryEnd 3855391 +MultipartEpilogueBegin 3855391 +MultipartEpilogueEnd 3855393 +MimeEntityEnd 3855395 +MimeMessageEnd 3855395 +MboxMarkerBegin 3855395 +MboxMarkerEnd 3855402 +MimeMessageBegin 3855404 +MimeMessageHeadersEnd 3856880 +MimeEntityBegin 3855404 +MimeEntityHeadersEnd 3856880 +MimeContentBegin 3856880 +MimeContentEnd 3965263 +MimeEntityEnd 3965265 +MimeMessageEnd 3965265 +MboxMarkerBegin 3965265 +MboxMarkerEnd 3965272 +MimeMessageBegin 3965274 +MimeMessageHeadersEnd 3965889 +MimeEntityBegin 3965274 +MimeEntityHeadersEnd 3965889 +MimeContentBegin 3965889 +MimeMessageBegin 3965889 +MimeMessageHeadersEnd 3966475 +MimeEntityBegin 3965889 +MimeEntityHeadersEnd 3966475 +MimeContentBegin 3966475 +MimeMessageBegin 3966475 +MimeMessageHeadersEnd 3967033 +MimeEntityBegin 3966475 +MimeEntityHeadersEnd 3967033 +MimeContentBegin 3967033 +MimeMessageBegin 3967033 +MimeMessageHeadersEnd 3967597 +MimeEntityBegin 3967033 +MimeEntityHeadersEnd 3967597 +MimeContentBegin 3967597 +MultipartPreambleBegin 3967597 +MultipartPreambleEnd 3967645 +MultipartBoundaryBegin 3967645 +MultipartBoundaryEnd 3967704 +MimeEntityBegin 3967704 +MimeEntityHeadersEnd 3967783 +MimeContentBegin 3967783 +MimeContentEnd 3967833 +MimeEntityEnd 3967835 +MultipartBoundaryBegin 3967835 +MultipartBoundaryEnd 3967894 +MimeEntityBegin 3967894 +MimeEntityHeadersEnd 3967959 +MimeContentBegin 3967959 +MimeMessageBegin 3967959 +MimeMessageHeadersEnd 3968475 +MimeEntityBegin 3967959 +MimeEntityHeadersEnd 3968475 +MimeContentBegin 3968475 +MultipartPreambleBegin 3968475 +MultipartPreambleEnd 3968523 +MultipartBoundaryBegin 3968523 +MultipartBoundaryEnd 3968572 +MimeEntityBegin 3968572 +MimeEntityHeadersEnd 3968651 +MimeContentBegin 3968651 +MimeContentEnd 3968778 +MimeEntityEnd 3968780 +MultipartBoundaryBegin 3968780 +MultipartBoundaryEnd 3968829 +MimeEntityBegin 3968829 +MimeEntityHeadersEnd 3968901 +MimeContentBegin 3968901 +MimeContentEnd 3969188 +MimeEntityEnd 3969190 +MultipartEndBoundaryBegin 3969190 +MultipartEndBoundaryEnd 3969239 +MultipartEpilogueBegin 3969239 +MultipartEpilogueEnd 3969241 +MimeEntityEnd 3969243 +MimeMessageEnd 3969243 +MimeContentEnd 3969243 +MimeEntityEnd 3969243 +MultipartEndBoundaryBegin 3969243 +MultipartEndBoundaryEnd 3969302 +MultipartEpilogueBegin 3969302 +MultipartEpilogueEnd 3969308 +MimeEntityEnd 3969310 +MimeMessageEnd 3969310 +MimeContentEnd 3969310 +MimeEntityEnd 3969310 +MimeMessageEnd 3969310 +MimeContentEnd 3969310 +MimeEntityEnd 3969310 +MimeMessageEnd 3969310 +MimeContentEnd 3969310 +MimeEntityEnd 3969310 +MimeMessageEnd 3969310 +MboxMarkerBegin 3969310 +MboxMarkerEnd 3969317 +MimeMessageBegin 3969319 +MimeMessageHeadersEnd 3970038 +MimeEntityBegin 3969319 +MimeEntityHeadersEnd 3970038 +MimeContentBegin 3970038 +MultipartPreambleBegin 3970038 +MultipartPreambleEnd 3970038 +MultipartBoundaryBegin 3970038 +MultipartBoundaryEnd 3970066 +MimeEntityBegin 3970066 +MimeEntityHeadersEnd 3970068 +MimeContentBegin 3970068 +MimeContentEnd 3970110 +MimeEntityEnd 3970112 +MultipartBoundaryBegin 3970112 +MultipartBoundaryEnd 3970140 +MimeEntityBegin 3970140 +MimeEntityHeadersEnd 3970290 +MimeContentBegin 3970290 +MimeContentEnd 4047906 +MimeEntityEnd 4047908 +MultipartBoundaryBegin 4047908 +MultipartBoundaryEnd 4047936 +MimeEntityBegin 4047936 +MimeEntityHeadersEnd 4047938 +MimeContentBegin 4047938 +MimeContentEnd 4047972 +MimeEntityEnd 4047974 +MultipartBoundaryBegin 4047974 +MultipartBoundaryEnd 4048002 +MimeEntityBegin 4048002 +MimeEntityHeadersEnd 4048154 +MimeContentBegin 4048154 +MimeContentEnd 4151890 +MimeEntityEnd 4151892 +MultipartBoundaryBegin 4151892 +MultipartBoundaryEnd 4151920 +MimeEntityBegin 4151920 +MimeEntityHeadersEnd 4151922 +MimeContentBegin 4151922 +MimeContentEnd 4152086 +MimeEntityEnd 4152088 +MultipartBoundaryBegin 4152088 +MultipartBoundaryEnd 4152116 +MimeEntityBegin 4152116 +MimeEntityHeadersEnd 4152208 +MimeContentBegin 4152208 +MimeContentEnd 4233632 +MimeEntityEnd 4233634 +MultipartBoundaryBegin 4233634 +MultipartBoundaryEnd 4233662 +MimeEntityBegin 4233662 +MimeEntityHeadersEnd 4233664 +MimeContentBegin 4233664 +MimeContentEnd 4233686 +MimeEntityEnd 4233688 +MultipartEndBoundaryBegin 4233688 +MultipartEndBoundaryEnd 4233716 +MultipartEpilogueBegin 4233716 +MultipartEpilogueEnd 4233718 +MimeEntityEnd 4233720 +MimeMessageEnd 4233720 +MboxMarkerBegin 4233720 +MboxMarkerEnd 4233727 +MimeMessageBegin 4233729 +MimeMessageHeadersEnd 4234408 +MimeEntityBegin 4233729 +MimeEntityHeadersEnd 4234408 +MimeContentBegin 4234408 +MimeContentEnd 4235418 +MimeEntityEnd 4235420 +MimeMessageEnd 4235420 +MboxMarkerBegin 4235420 +MboxMarkerEnd 4235427 +MimeMessageBegin 4235429 +MimeMessageHeadersEnd 4236508 +MimeEntityBegin 4235429 +MimeEntityHeadersEnd 4236508 +MimeContentBegin 4236508 +MultipartPreambleBegin 4236508 +MultipartPreambleEnd 4236666 +MultipartBoundaryBegin 4236666 +MultipartBoundaryEnd 4236707 +MimeEntityBegin 4236707 +MimeEntityHeadersEnd 4236753 +MimeContentBegin 4236753 +MimeContentEnd 4237170 +MimeEntityEnd 4237172 +MultipartBoundaryBegin 4237172 +MultipartBoundaryEnd 4237213 +MimeEntityBegin 4237213 +MimeEntityHeadersEnd 4237301 +MimeContentBegin 4237301 +MultipartPreambleBegin 4237301 +MultipartPreambleEnd 4237301 +MultipartBoundaryBegin 4237301 +MultipartBoundaryEnd 4237344 +MimeEntityBegin 4237344 +MimeEntityHeadersEnd 4237438 +MimeContentBegin 4237438 +MimeContentEnd 4237667 +MimeEntityEnd 4237669 +MultipartBoundaryBegin 4237669 +MultipartBoundaryEnd 4237712 +MimeEntityBegin 4237712 +MimeEntityHeadersEnd 4237835 +MimeContentBegin 4237835 +MimeContentEnd 4239256 +MimeEntityEnd 4239258 +MultipartBoundaryBegin 4239258 +MultipartBoundaryEnd 4239301 +MimeEntityBegin 4239301 +MimeEntityHeadersEnd 4239395 +MimeContentBegin 4239395 +MimeContentEnd 4239552 +MimeEntityEnd 4239554 +MultipartEndBoundaryBegin 4239554 +MultipartEndBoundaryEnd 4239597 +MultipartEpilogueBegin 4239597 +MultipartEpilogueEnd 4239599 +MimeEntityEnd 4239601 +MultipartEndBoundaryBegin 4239601 +MultipartEndBoundaryEnd 4239642 +MultipartEpilogueBegin 4239642 +MultipartEpilogueEnd 4239644 +MimeEntityEnd 4239646 +MimeMessageEnd 4239646 +MboxMarkerBegin 4239646 +MboxMarkerEnd 4239653 +MimeMessageBegin 4239655 +MimeMessageHeadersEnd 4240341 +MimeEntityBegin 4239655 +MimeEntityHeadersEnd 4240341 +MimeContentBegin 4240341 +MultipartPreambleBegin 4240341 +MultipartPreambleEnd 4240341 +MultipartBoundaryBegin 4240341 +MultipartBoundaryEnd 4240358 +MimeEntityBegin 4240358 +MimeEntityHeadersEnd 4240387 +MimeContentBegin 4240387 +MimeContentEnd 4240471 +MimeEntityEnd 4240473 +MultipartBoundaryBegin 4240473 +MultipartBoundaryEnd 4240490 +MimeEntityBegin 4240490 +MimeEntityHeadersEnd 4240553 +MimeContentBegin 4240553 +MimeContentEnd 4245787 +MimeEntityEnd 4245789 +MultipartEndBoundaryBegin 4245789 +MultipartEndBoundaryEnd 4245806 +MultipartEpilogueBegin 4245806 +MultipartEpilogueEnd 4245810 +MimeEntityEnd 4245812 +MimeMessageEnd 4245812 +MboxMarkerBegin 4245812 +MboxMarkerEnd 4245819 +MimeMessageBegin 4245821 +MimeMessageHeadersEnd 4246287 +MimeEntityBegin 4245821 +MimeEntityHeadersEnd 4246287 +MimeContentBegin 4246287 +MimeContentEnd 4257886 +MimeEntityEnd 4257888 +MimeMessageEnd 4257888 +MboxMarkerBegin 4257888 +MboxMarkerEnd 4257895 +MimeMessageBegin 4257897 +MimeMessageHeadersEnd 4258477 +MimeEntityBegin 4257897 +MimeEntityHeadersEnd 4258477 +MimeContentBegin 4258477 +MultipartPreambleBegin 4258477 +MultipartPreambleEnd 4258477 +MultipartBoundaryBegin 4258477 +MultipartBoundaryEnd 4258489 +MimeEntityBegin 4258489 +MimeEntityHeadersEnd 4258491 +MimeContentBegin 4258491 +MimeContentEnd 4258530 +MimeEntityEnd 4258532 +MultipartBoundaryBegin 4258532 +MultipartBoundaryEnd 4258544 +MimeEntityBegin 4258544 +MimeEntityHeadersEnd 4258601 +MimeContentBegin 4258601 +MultipartPreambleBegin 4258601 +MultipartPreambleEnd 4258601 +MultipartBoundaryBegin 4258601 +MultipartBoundaryEnd 4258616 +MimeEntityBegin 4258616 +MimeEntityHeadersEnd 4258736 +MimeContentBegin 4258736 +MimeMessageBegin 4258736 +MimeMessageHeadersEnd 4258816 +MimeEntityBegin 4258736 +MimeEntityHeadersEnd 4258816 +MimeContentBegin 4258816 +MimeContentEnd 4258885 +MimeEntityEnd 4258887 +MimeMessageEnd 4258887 +MimeContentEnd 4258887 +MimeEntityEnd 4258887 +MultipartBoundaryBegin 4258887 +MultipartBoundaryEnd 4258902 +MimeEntityBegin 4258902 +MimeEntityHeadersEnd 4259095 +MimeContentBegin 4259095 +MimeMessageBegin 4259095 +MimeMessageHeadersEnd 4259175 +MimeEntityBegin 4259095 +MimeEntityHeadersEnd 4259175 +MimeContentBegin 4259175 +MimeContentEnd 4259175 +MimeEntityEnd 4259175 +MimeMessageEnd 4259175 +MimeContentEnd 4259175 +MimeEntityEnd 4259175 +MultipartBoundaryBegin 4259175 +MultipartBoundaryEnd 4259190 +MimeEntityBegin 4259190 +MimeEntityHeadersEnd 4259332 +MimeContentBegin 4259332 +MimeMessageBegin 4259332 +MimeMessageHeadersEnd 4259403 +MimeEntityBegin 4259332 +MimeEntityHeadersEnd 4259403 +MimeContentBegin 4259403 +MimeContentEnd 4259403 +MimeEntityEnd 4259403 +MimeMessageEnd 4259403 +MimeContentEnd 4259403 +MimeEntityEnd 4259403 +MultipartBoundaryBegin 4259403 +MultipartBoundaryEnd 4259418 +MimeEntityBegin 4259418 +MimeEntityHeadersEnd 4259535 +MimeContentBegin 4259535 +MimeMessageBegin 4259535 +MimeMessageHeadersEnd 4259607 +MimeEntityBegin 4259535 +MimeEntityHeadersEnd 4259607 +MimeContentBegin 4259607 +MimeContentEnd 4259607 +MimeEntityEnd 4259607 +MimeMessageEnd 4259607 +MimeContentEnd 4259607 +MimeEntityEnd 4259607 +MultipartBoundaryBegin 4259607 +MultipartBoundaryEnd 4259622 +MimeEntityBegin 4259622 +MimeEntityHeadersEnd 4259731 +MimeContentBegin 4259731 +MimeMessageBegin 4259731 +MimeMessageHeadersEnd 4259803 +MimeEntityBegin 4259731 +MimeEntityHeadersEnd 4259803 +MimeContentBegin 4259803 +MimeContentEnd 4259803 +MimeEntityEnd 4259803 +MimeMessageEnd 4259803 +MimeContentEnd 4259803 +MimeEntityEnd 4259803 +MultipartEndBoundaryBegin 4259803 +MultipartEndBoundaryEnd 4259818 +MultipartEpilogueBegin 4259818 +MultipartEpilogueEnd 4259820 +MimeEntityEnd 4259822 +MultipartEndBoundaryBegin 4259822 +MultipartEndBoundaryEnd 4259834 +MultipartEpilogueBegin 4259834 +MultipartEpilogueEnd 4259836 +MimeEntityEnd 4259838 +MimeMessageEnd 4259838 +MboxMarkerBegin 4259838 +MboxMarkerEnd 4259845 +MimeMessageBegin 4259847 +MimeMessageHeadersEnd 4260427 +MimeEntityBegin 4259847 +MimeEntityHeadersEnd 4260427 +MimeContentBegin 4260427 +MultipartPreambleBegin 4260427 +MultipartPreambleEnd 4260427 +MultipartBoundaryBegin 4260427 +MultipartBoundaryEnd 4260439 +MimeEntityBegin 4260439 +MimeEntityHeadersEnd 4260441 +MimeContentBegin 4260441 +MimeContentEnd 4263710 +MimeEntityEnd 4263712 +MultipartBoundaryBegin 4263712 +MultipartBoundaryEnd 4263724 +MimeEntityBegin 4263724 +MimeEntityHeadersEnd 4263787 +MimeContentBegin 4263787 +MultipartPreambleBegin 4263787 +MultipartPreambleEnd 4263787 +MultipartBoundaryBegin 4263787 +MultipartBoundaryEnd 4263802 +MimeEntityBegin 4263802 +MimeEntityHeadersEnd 4263922 +MimeContentBegin 4263922 +MimeMessageBegin 4263922 +MimeMessageHeadersEnd 4264002 +MimeEntityBegin 4263922 +MimeEntityHeadersEnd 4264002 +MimeContentBegin 4264002 +MimeContentEnd 4264071 +MimeEntityEnd 4264073 +MimeMessageEnd 4264073 +MimeContentEnd 4264073 +MimeEntityEnd 4264073 +MultipartBoundaryBegin 4264073 +MultipartBoundaryEnd 4264088 +MimeEntityBegin 4264088 +MimeEntityHeadersEnd 4264281 +MimeContentBegin 4264281 +MimeMessageBegin 4264281 +MimeMessageHeadersEnd 4264361 +MimeEntityBegin 4264281 +MimeEntityHeadersEnd 4264361 +MimeContentBegin 4264361 +MimeContentEnd 4264361 +MimeEntityEnd 4264361 +MimeMessageEnd 4264361 +MimeContentEnd 4264361 +MimeEntityEnd 4264361 +MultipartEndBoundaryBegin 4264361 +MultipartEndBoundaryEnd 4264376 +MultipartEpilogueBegin 4264376 +MultipartEpilogueEnd 4264378 +MimeEntityEnd 4264380 +MultipartEndBoundaryBegin 4264380 +MultipartEndBoundaryEnd 4264392 +MultipartEpilogueBegin 4264392 +MultipartEpilogueEnd 4264394 +MimeEntityEnd 4264396 +MimeMessageEnd 4264396 +MboxMarkerBegin 4264396 +MboxMarkerEnd 4264403 +MimeMessageBegin 4264405 +MimeMessageHeadersEnd 4264885 +MimeEntityBegin 4264405 +MimeEntityHeadersEnd 4264885 +MimeContentBegin 4264885 +MultipartPreambleBegin 4264885 +MultipartPreambleEnd 4264933 +MultipartBoundaryBegin 4264933 +MultipartBoundaryEnd 4264961 +MimeEntityBegin 4264961 +MimeEntityHeadersEnd 4265110 +MimeContentBegin 4265110 +MimeMessageBegin 4265110 +MimeMessageHeadersEnd 4265550 +MimeEntityBegin 4265110 +MimeEntityHeadersEnd 4265550 +MimeContentBegin 4265550 +MimeContentEnd 4265589 +MimeEntityEnd 4265591 +MimeMessageEnd 4265591 +MimeContentEnd 4265591 +MimeEntityEnd 4265591 +MultipartBoundaryBegin 4265591 +MultipartBoundaryEnd 4265619 +MimeEntityBegin 4265619 +MimeEntityHeadersEnd 4265746 +MimeContentBegin 4265746 +MimeContentEnd 4266210 +MimeEntityEnd 4266212 +MultipartBoundaryBegin 4266212 +MultipartBoundaryEnd 4266240 +MimeEntityBegin 4266240 +MimeEntityHeadersEnd 4266367 +MimeContentBegin 4266367 +MimeContentEnd 4266859 +MimeEntityEnd 4266861 +MultipartBoundaryBegin 4266861 +MultipartBoundaryEnd 4266889 +MimeEntityBegin 4266889 +MimeEntityHeadersEnd 4267020 +MimeContentBegin 4267020 +MimeContentEnd 4267554 +MimeEntityEnd 4267556 +MultipartBoundaryBegin 4267556 +MultipartBoundaryEnd 4267584 +MimeEntityBegin 4267584 +MimeEntityHeadersEnd 4267713 +MimeContentBegin 4267713 +MimeContentEnd 4268217 +MimeEntityEnd 4268219 +MultipartBoundaryBegin 4268219 +MultipartBoundaryEnd 4268247 +MimeEntityBegin 4268247 +MimeEntityHeadersEnd 4268396 +MimeContentBegin 4268396 +MimeMessageBegin 4268396 +MimeMessageHeadersEnd 4268836 +MimeEntityBegin 4268396 +MimeEntityHeadersEnd 4268836 +MimeContentBegin 4268836 +MimeContentEnd 4268874 +MimeEntityEnd 4268876 +MimeMessageEnd 4268876 +MimeContentEnd 4268876 +MimeEntityEnd 4268876 +MultipartBoundaryBegin 4268876 +MultipartBoundaryEnd 4268904 +MimeEntityBegin 4268904 +MimeEntityHeadersEnd 4269080 +MimeContentBegin 4269080 +MimeMessageBegin 4269080 +MimeMessageHeadersEnd 4269665 +MimeEntityBegin 4269080 +MimeEntityHeadersEnd 4269665 +MimeContentBegin 4269665 +MimeMessageBegin 4269665 +MimeMessageHeadersEnd 4270190 +MimeEntityBegin 4269665 +MimeEntityHeadersEnd 4270190 +MimeContentBegin 4270190 +MimeMessageBegin 4270190 +MimeMessageHeadersEnd 4270611 +MimeEntityBegin 4270190 +MimeEntityHeadersEnd 4270611 +MimeContentBegin 4270611 +MimeContentEnd 4270617 +MimeEntityEnd 4270619 +MimeMessageEnd 4270619 +MimeContentEnd 4270619 +MimeEntityEnd 4270619 +MimeMessageEnd 4270619 +MimeContentEnd 4270619 +MimeEntityEnd 4270619 +MimeMessageEnd 4270619 +MimeContentEnd 4270619 +MimeEntityEnd 4270619 +MultipartBoundaryBegin 4270619 +MultipartBoundaryEnd 4270647 +MimeEntityBegin 4270647 +MimeEntityHeadersEnd 4270703 +MimeContentBegin 4270703 +MimeContentEnd 4270756 +MimeEntityEnd 4270758 +MultipartEndBoundaryBegin 4270758 +MultipartEndBoundaryEnd 4270786 +MultipartEpilogueBegin 4270786 +MultipartEpilogueEnd 4270786 +MimeEntityEnd 4270788 +MimeMessageEnd 4270788 +MboxMarkerBegin 4270788 +MboxMarkerEnd 4270795 +MimeMessageBegin 4270797 +MimeMessageHeadersEnd 4271280 +MimeEntityBegin 4270797 +MimeEntityHeadersEnd 4271280 +MimeContentBegin 4271280 +MultipartPreambleBegin 4271280 +MultipartPreambleEnd 4271328 +MultipartBoundaryBegin 4271328 +MultipartBoundaryEnd 4271356 +MimeEntityBegin 4271356 +MimeEntityHeadersEnd 4271509 +MimeContentBegin 4271509 +MimeMessageBegin 4271509 +MimeMessageHeadersEnd 4271948 +MimeEntityBegin 4271509 +MimeEntityHeadersEnd 4271948 +MimeContentBegin 4271948 +MimeContentEnd 4271987 +MimeEntityEnd 4271989 +MimeMessageEnd 4271989 +MimeContentEnd 4271989 +MimeEntityEnd 4271989 +MultipartBoundaryBegin 4271989 +MultipartBoundaryEnd 4272017 +MimeEntityBegin 4272017 +MimeEntityHeadersEnd 4272148 +MimeContentBegin 4272148 +MimeContentEnd 4272612 +MimeEntityEnd 4272614 +MultipartBoundaryBegin 4272614 +MultipartBoundaryEnd 4272642 +MimeEntityBegin 4272642 +MimeEntityHeadersEnd 4272773 +MimeContentBegin 4272773 +MimeContentEnd 4273265 +MimeEntityEnd 4273267 +MultipartBoundaryBegin 4273267 +MultipartBoundaryEnd 4273295 +MimeEntityBegin 4273295 +MimeEntityHeadersEnd 4273430 +MimeContentBegin 4273430 +MimeContentEnd 4273964 +MimeEntityEnd 4273966 +MultipartBoundaryBegin 4273966 +MultipartBoundaryEnd 4273994 +MimeEntityBegin 4273994 +MimeEntityHeadersEnd 4274127 +MimeContentBegin 4274127 +MimeContentEnd 4274631 +MimeEntityEnd 4274633 +MultipartBoundaryBegin 4274633 +MultipartBoundaryEnd 4274661 +MimeEntityBegin 4274661 +MimeEntityHeadersEnd 4274814 +MimeContentBegin 4274814 +MimeMessageBegin 4274814 +MimeMessageHeadersEnd 4275253 +MimeEntityBegin 4274814 +MimeEntityHeadersEnd 4275253 +MimeContentBegin 4275253 +MimeContentEnd 4275291 +MimeEntityEnd 4275293 +MimeMessageEnd 4275293 +MimeContentEnd 4275293 +MimeEntityEnd 4275293 +MultipartBoundaryBegin 4275293 +MultipartBoundaryEnd 4275321 +MimeEntityBegin 4275321 +MimeEntityHeadersEnd 4275501 +MimeContentBegin 4275501 +MimeMessageBegin 4275501 +MimeMessageHeadersEnd 4276089 +MimeEntityBegin 4275501 +MimeEntityHeadersEnd 4276089 +MimeContentBegin 4276089 +MimeMessageBegin 4276089 +MimeMessageHeadersEnd 4276617 +MimeEntityBegin 4276089 +MimeEntityHeadersEnd 4276617 +MimeContentBegin 4276617 +MimeMessageBegin 4276617 +MimeMessageHeadersEnd 4277037 +MimeEntityBegin 4276617 +MimeEntityHeadersEnd 4277037 +MimeContentBegin 4277037 +MimeContentEnd 4277043 +MimeEntityEnd 4277045 +MimeMessageEnd 4277045 +MimeContentEnd 4277045 +MimeEntityEnd 4277045 +MimeMessageEnd 4277045 +MimeContentEnd 4277045 +MimeEntityEnd 4277045 +MimeMessageEnd 4277045 +MimeContentEnd 4277045 +MimeEntityEnd 4277045 +MultipartBoundaryBegin 4277045 +MultipartBoundaryEnd 4277073 +MimeEntityBegin 4277073 +MimeEntityHeadersEnd 4277133 +MimeContentBegin 4277133 +MimeContentEnd 4277186 +MimeEntityEnd 4277188 +MultipartEndBoundaryBegin 4277188 +MultipartEndBoundaryEnd 4277216 +MultipartEpilogueBegin 4277216 +MultipartEpilogueEnd 4277216 +MimeEntityEnd 4277218 +MimeMessageEnd 4277218 +MboxMarkerBegin 4277218 +MboxMarkerEnd 4277225 +MimeMessageBegin 4277227 +MimeMessageHeadersEnd 4277931 +MimeEntityBegin 4277227 +MimeEntityHeadersEnd 4277931 +MimeContentBegin 4277931 +MultipartPreambleBegin 4277931 +MultipartPreambleEnd 4277974 +MultipartBoundaryBegin 4277974 +MultipartBoundaryEnd 4277981 +MimeEntityBegin 4277981 +MimeEntityHeadersEnd 4278012 +MimeContentBegin 4278012 +MimeContentEnd 4278458 +MimeEntityEnd 4278460 +MultipartBoundaryBegin 4278460 +MultipartBoundaryEnd 4278467 +MimeEntityBegin 4278467 +MimeEntityHeadersEnd 4278543 +MimeContentBegin 4278543 +MimeContentEnd 4279216 +MimeEntityEnd 4279218 +MultipartBoundaryBegin 4279218 +MultipartBoundaryEnd 4279225 +MimeEntityBegin 4279225 +MimeEntityHeadersEnd 4279227 +MimeContentBegin 4279227 +MimeContentEnd 4279245 +MimeEntityEnd 4279247 +MultipartBoundaryBegin 4279247 +MultipartBoundaryEnd 4279254 +MimeEntityBegin 4279254 +MimeEntityHeadersEnd 4279256 +MimeContentBegin 4279256 +MimeContentEnd 4279267 +MimeEntityEnd 4279269 +MultipartBoundaryBegin 4279269 +MultipartBoundaryEnd 4279276 +MimeEntityBegin 4279276 +MimeEntityHeadersEnd 4279308 +MimeContentBegin 4279308 +MimeMessageBegin 4279308 +MimeMessageHeadersEnd 4279530 +MimeEntityBegin 4279308 +MimeEntityHeadersEnd 4279530 +MimeContentBegin 4279530 +MultipartPreambleBegin 4279530 +MultipartPreambleEnd 4279530 +MultipartBoundaryBegin 4279530 +MultipartBoundaryEnd 4279537 +MimeEntityBegin 4279537 +MimeEntityHeadersEnd 4279564 +MimeContentBegin 4279564 +MimeContentEnd 4279587 +MimeEntityEnd 4279589 +MultipartBoundaryBegin 4279589 +MultipartBoundaryEnd 4279596 +MimeEntityBegin 4279596 +MimeEntityHeadersEnd 4279776 +MimeContentBegin 4279776 +MimeContentEnd 4279815 +MimeEntityEnd 4279817 +MultipartEndBoundaryBegin 4279817 +MultipartEndBoundaryEnd 4279824 +MultipartEpilogueBegin 4279824 +MultipartEpilogueEnd 4279824 +MimeEntityEnd 4279826 +MimeMessageEnd 4279826 +MimeContentEnd 4279826 +MimeEntityEnd 4279826 +MultipartBoundaryBegin 4279826 +MultipartBoundaryEnd 4279833 +MimeEntityBegin 4279833 +MimeEntityHeadersEnd 4279914 +MimeContentBegin 4279914 +MimeContentEnd 4289472 +MimeEntityEnd 4289474 +MultipartBoundaryBegin 4289474 +MultipartBoundaryEnd 4289481 +MimeEntityBegin 4289481 +MimeEntityHeadersEnd 4289661 +MimeContentBegin 4289661 +MimeContentEnd 4289700 +MimeEntityEnd 4289702 +MultipartBoundaryBegin 4289702 +MultipartBoundaryEnd 4289709 +MimeEntityBegin 4289709 +MimeEntityHeadersEnd 4289861 +MimeContentBegin 4289861 +MimeContentEnd 4297809 +MimeEntityEnd 4297811 +MultipartBoundaryBegin 4297811 +MultipartBoundaryEnd 4297818 +MimeEntityBegin 4297818 +MimeEntityHeadersEnd 4297872 +MimeContentBegin 4297872 +MultipartPreambleBegin 4297872 +MultipartPreambleEnd 4297872 +MultipartBoundaryBegin 4297872 +MultipartBoundaryEnd 4297883 +MimeEntityBegin 4297883 +MimeEntityHeadersEnd 4297885 +MimeContentBegin 4297885 +MimeMessageBegin 4297885 +MimeMessageHeadersEnd 4297914 +MimeEntityBegin 4297885 +MimeEntityHeadersEnd 4297914 +MimeContentBegin 4297914 +MimeContentEnd 4297919 +MimeEntityEnd 4297921 +MimeMessageEnd 4297921 +MimeContentEnd 4297921 +MimeEntityEnd 4297921 +MultipartBoundaryBegin 4297921 +MultipartBoundaryEnd 4297932 +MimeEntityBegin 4297932 +MimeEntityHeadersEnd 4297934 +MimeContentBegin 4297934 +MimeMessageBegin 4297934 +MimeMessageHeadersEnd 4297963 +MimeEntityBegin 4297934 +MimeEntityHeadersEnd 4297963 +MimeContentBegin 4297963 +MimeContentEnd 4297968 +MimeEntityEnd 4297970 +MimeMessageEnd 4297970 +MimeContentEnd 4297970 +MimeEntityEnd 4297970 +MultipartBoundaryBegin 4297970 +MultipartBoundaryEnd 4297981 +MimeEntityBegin 4297981 +MimeEntityHeadersEnd 4297983 +MimeContentBegin 4297983 +MimeMessageBegin 4297983 +MimeMessageHeadersEnd 4298012 +MimeEntityBegin 4297983 +MimeEntityHeadersEnd 4298012 +MimeContentBegin 4298012 +MimeContentEnd 4298017 +MimeEntityEnd 4298019 +MimeMessageEnd 4298019 +MimeContentEnd 4298019 +MimeEntityEnd 4298019 +MultipartBoundaryBegin 4298019 +MultipartBoundaryEnd 4298030 +MimeEntityBegin 4298030 +MimeEntityHeadersEnd 4298057 +MimeContentBegin 4298057 +MimeContentEnd 4298140 +MimeEntityEnd 4298142 +MultipartBoundaryBegin 4298142 +MultipartBoundaryEnd 4298153 +MimeEntityBegin 4298153 +MimeEntityHeadersEnd 4298155 +MimeContentBegin 4298155 +MimeMessageBegin 4298155 +MimeMessageHeadersEnd 4298213 +MimeEntityBegin 4298155 +MimeEntityHeadersEnd 4298213 +MimeContentBegin 4298213 +MimeContentEnd 4298262 +MimeEntityEnd 4298264 +MimeMessageEnd 4298264 +MimeContentEnd 4298264 +MimeEntityEnd 4298264 +MultipartBoundaryBegin 4298264 +MultipartBoundaryEnd 4298275 +MimeEntityBegin 4298275 +MimeEntityHeadersEnd 4298277 +MimeContentBegin 4298277 +MimeMessageBegin 4298277 +MimeMessageHeadersEnd 4298306 +MimeEntityBegin 4298277 +MimeEntityHeadersEnd 4298306 +MimeContentBegin 4298306 +MimeContentEnd 4298311 +MimeEntityEnd 4298313 +MimeMessageEnd 4298313 +MimeContentEnd 4298313 +MimeEntityEnd 4298313 +MultipartEndBoundaryBegin 4298313 +MultipartEndBoundaryEnd 4298324 +MultipartEpilogueBegin 4298324 +MultipartEpilogueEnd 4298324 +MimeEntityEnd 4298326 +MultipartEndBoundaryBegin 4298326 +MultipartEndBoundaryEnd 4298333 +MultipartEpilogueBegin 4298333 +MultipartEpilogueEnd 4298376 +MimeEntityEnd 4298378 +MimeMessageEnd 4298378 +MboxMarkerBegin 4298378 +MboxMarkerEnd 4298385 +MimeMessageBegin 4298387 +MimeMessageHeadersEnd 4299063 +MimeEntityBegin 4298387 +MimeEntityHeadersEnd 4299063 +MimeContentBegin 4299063 +MultipartPreambleBegin 4299063 +MultipartPreambleEnd 4299063 +MultipartBoundaryBegin 4299063 +MultipartBoundaryEnd 4299090 +MimeEntityBegin 4299090 +MimeEntityHeadersEnd 4299092 +MimeContentBegin 4299092 +MimeContentEnd 4300338 +MimeEntityEnd 4300340 +MultipartBoundaryBegin 4300340 +MultipartBoundaryEnd 4300367 +MimeEntityBegin 4300367 +MimeEntityHeadersEnd 4300517 +MimeContentBegin 4300517 +MimeContentEnd 4372203 +MimeEntityEnd 4372205 +MultipartBoundaryBegin 4372205 +MultipartBoundaryEnd 4372232 +MimeEntityBegin 4372232 +MimeEntityHeadersEnd 4372234 +MimeContentBegin 4372234 +MimeContentEnd 4372234 +MimeEntityEnd 4372236 +MultipartEndBoundaryBegin 4372236 +MultipartEndBoundaryEnd 4372263 +MultipartEpilogueBegin 4372263 +MultipartEpilogueEnd 4372265 +MimeEntityEnd 4372267 +MimeMessageEnd 4372267 +MboxMarkerBegin 4372267 +MboxMarkerEnd 4372274 +MimeMessageBegin 4372276 +MimeMessageHeadersEnd 4373229 +MimeEntityBegin 4372276 +MimeEntityHeadersEnd 4373229 +MimeContentBegin 4373229 +MimeContentEnd 4625700 +MimeEntityEnd 4625702 +MimeMessageEnd 4625702 +MboxMarkerBegin 4625702 +MboxMarkerEnd 4625709 +MimeMessageBegin 4625711 +MimeMessageHeadersEnd 4626660 +MimeEntityBegin 4625711 +MimeEntityHeadersEnd 4626660 +MimeContentBegin 4626660 +MultipartPreambleBegin 4626660 +MultipartPreambleEnd 4626859 +MultipartBoundaryBegin 4626859 +MultipartBoundaryEnd 4626905 +MimeEntityBegin 4626905 +MimeEntityHeadersEnd 4626981 +MimeContentBegin 4626981 +MimeContentEnd 4627454 +MimeEntityEnd 4627456 +MultipartBoundaryBegin 4627456 +MultipartBoundaryEnd 4627502 +MimeEntityBegin 4627502 +MimeEntityHeadersEnd 4627564 +MimeContentBegin 4627564 +MimeContentEnd 4652132 +MimeEntityEnd 4652134 +MultipartBoundaryBegin 4652134 +MultipartBoundaryEnd 4652180 +MimeEntityBegin 4652180 +MimeEntityHeadersEnd 4652256 +MimeContentBegin 4652256 +MimeContentEnd 4652714 +MimeEntityEnd 4652716 +MultipartBoundaryBegin 4652716 +MultipartBoundaryEnd 4652762 +MimeEntityBegin 4652762 +MimeEntityHeadersEnd 4652824 +MimeContentBegin 4652824 +MimeContentEnd 4664192 +MimeEntityEnd 4664194 +MultipartBoundaryBegin 4664194 +MultipartBoundaryEnd 4664240 +MimeEntityBegin 4664240 +MimeEntityHeadersEnd 4664316 +MimeContentBegin 4664316 +MimeContentEnd 4664626 +MimeEntityEnd 4664628 +MultipartBoundaryBegin 4664628 +MultipartBoundaryEnd 4664674 +MimeEntityBegin 4664674 +MimeEntityHeadersEnd 4664736 +MimeContentBegin 4664736 +MimeContentEnd 4681412 +MimeEntityEnd 4681414 +MultipartBoundaryBegin 4681414 +MultipartBoundaryEnd 4681460 +MimeEntityBegin 4681460 +MimeEntityHeadersEnd 4681536 +MimeContentBegin 4681536 +MimeContentEnd 4682211 +MimeEntityEnd 4682213 +MultipartEndBoundaryBegin 4682213 +MultipartEndBoundaryEnd 4682259 +MultipartEpilogueBegin 4682259 +MultipartEpilogueEnd 4682261 +MimeEntityEnd 4682263 +MimeMessageEnd 4682263 +MboxMarkerBegin 4682263 +MboxMarkerEnd 4682270 +MimeMessageBegin 4682272 +MimeMessageHeadersEnd 4683107 +MimeEntityBegin 4682272 +MimeEntityHeadersEnd 4683107 +MimeContentBegin 4683107 +MultipartPreambleBegin 4683107 +MultipartPreambleEnd 4683107 +MultipartBoundaryBegin 4683107 +MultipartBoundaryEnd 4683137 +MimeEntityBegin 4683137 +MimeEntityHeadersEnd 4683139 +MimeContentBegin 4683139 +MimeContentEnd 4683807 +MimeEntityEnd 4683809 +MultipartBoundaryBegin 4683809 +MultipartBoundaryEnd 4683839 +MimeEntityBegin 4683839 +MimeEntityHeadersEnd 4683902 +MimeContentBegin 4683902 +MimeContentEnd 4731116 +MimeEntityEnd 4731118 +MultipartEndBoundaryBegin 4731118 +MultipartEndBoundaryEnd 4731148 +MultipartEpilogueBegin 4731148 +MultipartEpilogueEnd 4731150 +MimeEntityEnd 4731152 +MimeMessageEnd 4731152 +MboxMarkerBegin 4731152 +MboxMarkerEnd 4731159 +MimeMessageBegin 4731161 +MimeMessageHeadersEnd 4731922 +MimeEntityBegin 4731161 +MimeEntityHeadersEnd 4731922 +MimeContentBegin 4731922 +MultipartPreambleBegin 4731922 +MultipartPreambleEnd 4732363 +MultipartBoundaryBegin 4732363 +MultipartBoundaryEnd 4732387 +MimeEntityBegin 4732387 +MimeEntityHeadersEnd 4732463 +MimeContentBegin 4732463 +MimeContentEnd 4737938 +MimeEntityEnd 4737940 +MultipartBoundaryBegin 4737940 +MultipartBoundaryEnd 4737964 +MimeEntityBegin 4737964 +MimeEntityHeadersEnd 4738065 +MimeContentBegin 4738065 +MimeContentEnd 4740681 +MimeEntityEnd 4740683 +MultipartBoundaryBegin 4740683 +MultipartBoundaryEnd 4740707 +MimeEntityBegin 4740707 +MimeEntityHeadersEnd 4740783 +MimeContentBegin 4740783 +MimeContentEnd 4741311 +MimeEntityEnd 4741313 +MultipartBoundaryBegin 4741313 +MultipartBoundaryEnd 4741337 +MimeEntityBegin 4741337 +MimeEntityHeadersEnd 4741455 +MimeContentBegin 4741455 +MimeContentEnd 4764831 +MimeEntityEnd 4764833 +MultipartBoundaryBegin 4764833 +MultipartBoundaryEnd 4764857 +MimeEntityBegin 4764857 +MimeEntityHeadersEnd 4764933 +MimeContentBegin 4764933 +MimeContentEnd 4765525 +MimeEntityEnd 4765527 +MultipartBoundaryBegin 4765527 +MultipartBoundaryEnd 4765551 +MimeEntityBegin 4765551 +MimeEntityHeadersEnd 4765640 +MimeContentBegin 4765640 +MimeMessageBegin 4765640 +MimeMessageHeadersEnd 4765713 +MimeEntityBegin 4765640 +MimeEntityHeadersEnd 4765713 +MimeContentBegin 4765713 +MimeContentEnd 4765713 +MimeEntityEnd 4765713 +MimeMessageEnd 4765713 +MimeContentEnd 4765713 +MimeEntityEnd 4765713 +MultipartBoundaryBegin 4765713 +MultipartBoundaryEnd 4765737 +MimeEntityBegin 4765737 +MimeEntityHeadersEnd 4765813 +MimeContentBegin 4765813 +MimeContentEnd 4766094 +MimeEntityEnd 4766096 +MultipartBoundaryBegin 4766096 +MultipartBoundaryEnd 4766120 +MimeEntityBegin 4766120 +MimeEntityHeadersEnd 4766273 +MimeContentBegin 4766273 +MimeMessageBegin 4766273 +MimeMessageHeadersEnd 4766346 +MimeEntityBegin 4766273 +MimeEntityHeadersEnd 4766346 +MimeContentBegin 4766346 +MimeContentEnd 4766346 +MimeEntityEnd 4766346 +MimeMessageEnd 4766346 +MimeContentEnd 4766346 +MimeEntityEnd 4766346 +MultipartBoundaryBegin 4766346 +MultipartBoundaryEnd 4766370 +MimeEntityBegin 4766370 +MimeEntityHeadersEnd 4766446 +MimeContentBegin 4766446 +MimeContentEnd 4767549 +MimeEntityEnd 4767551 +MultipartEndBoundaryBegin 4767551 +MultipartEndBoundaryEnd 4767575 +MultipartEpilogueBegin 4767575 +MultipartEpilogueEnd 4767575 +MimeEntityEnd 4767577 +MimeMessageEnd 4767577 +MboxMarkerBegin 4767577 +MboxMarkerEnd 4767584 +MimeMessageBegin 4767586 +MimeMessageHeadersEnd 4767753 +MimeEntityBegin 4767586 +MimeEntityHeadersEnd 4767753 +MimeContentBegin 4767753 +MultipartPreambleBegin 4767753 +MultipartPreambleEnd 4767753 +MultipartBoundaryBegin 4767753 +MultipartBoundaryEnd 4767766 +MimeEntityBegin 4767766 +MimeEntityHeadersEnd 4767838 +MimeContentBegin 4767838 +MimeContentEnd 4845327 +MimeEntityEnd 4845329 +MultipartBoundaryBegin 4845329 +MultipartBoundaryEnd 4845342 +MimeEntityBegin 4845342 +MimeEntityHeadersEnd 4845344 +MimeContentBegin 4845344 +MimeContentEnd 4845374 +MimeEntityEnd 4845376 +MultipartEndBoundaryBegin 4845376 +MultipartEndBoundaryEnd 4845389 +MultipartEpilogueBegin 4845389 +MultipartEpilogueEnd 4845389 +MimeEntityEnd 4845391 +MimeMessageEnd 4845391 +MboxMarkerBegin 4845391 +MboxMarkerEnd 4845398 +MimeMessageBegin 4845400 +MimeMessageHeadersEnd 4846638 +MimeEntityBegin 4845400 +MimeEntityHeadersEnd 4846638 +MimeContentBegin 4846638 +MultipartPreambleBegin 4846638 +MultipartPreambleEnd 4846638 +MultipartBoundaryBegin 4846638 +MultipartBoundaryEnd 4846677 +MimeEntityBegin 4846677 +MimeEntityHeadersEnd 4846723 +MimeContentBegin 4846723 +MimeContentEnd 4847183 +MimeEntityEnd 4847185 +MultipartBoundaryBegin 4847185 +MultipartBoundaryEnd 4847224 +MimeEntityBegin 4847224 +MimeEntityHeadersEnd 4847321 +MimeContentBegin 4847321 +MimeContentEnd 4977159 +MimeEntityEnd 4977161 +MultipartEndBoundaryBegin 4977161 +MultipartEndBoundaryEnd 4977200 +MultipartEpilogueBegin 4977200 +MultipartEpilogueEnd 4977202 +MimeEntityEnd 4977204 +MimeMessageEnd 4977204 +MboxMarkerBegin 4977204 +MboxMarkerEnd 4977211 +MimeMessageBegin 4977213 +MimeMessageHeadersEnd 4977982 +MimeEntityBegin 4977213 +MimeEntityHeadersEnd 4977982 +MimeContentBegin 4977982 +MultipartPreambleBegin 4977982 +MultipartPreambleEnd 4978327 +MultipartBoundaryBegin 4978327 +MultipartBoundaryEnd 4978386 +MimeEntityBegin 4978386 +MimeEntityHeadersEnd 4978388 +MimeContentBegin 4978388 +MimeContentEnd 4979201 +MimeEntityEnd 4979203 +MultipartBoundaryBegin 4979203 +MultipartBoundaryEnd 4979262 +MimeEntityBegin 4979262 +MimeEntityHeadersEnd 4979368 +MimeContentBegin 4979368 +MultipartPreambleBegin 4979368 +MultipartPreambleEnd 4979368 +MultipartBoundaryBegin 4979368 +MultipartBoundaryEnd 4979429 +MimeEntityBegin 4979429 +MimeEntityHeadersEnd 4979505 +MimeContentBegin 4979505 +MimeContentEnd 4980001 +MimeEntityEnd 4980003 +MultipartBoundaryBegin 4980003 +MultipartBoundaryEnd 4980064 +MimeEntityBegin 4980064 +MimeEntityHeadersEnd 4980164 +MimeContentBegin 4980164 +MimeContentEnd 4993344 +MimeEntityEnd 4993346 +MultipartBoundaryBegin 4993346 +MultipartBoundaryEnd 4993407 +MimeEntityBegin 4993407 +MimeEntityHeadersEnd 4993480 +MimeContentBegin 4993480 +MimeContentEnd 4993501 +MimeEntityEnd 4993503 +MultipartBoundaryBegin 4993503 +MultipartBoundaryEnd 4993564 +MimeEntityBegin 4993564 +MimeEntityHeadersEnd 4993664 +MimeContentBegin 4993664 +MimeContentEnd 5050148 +MimeEntityEnd 5050150 +MultipartBoundaryBegin 5050150 +MultipartBoundaryEnd 5050211 +MimeEntityBegin 5050211 +MimeEntityHeadersEnd 5050284 +MimeContentBegin 5050284 +MimeContentEnd 5050341 +MimeEntityEnd 5050343 +MultipartBoundaryBegin 5050343 +MultipartBoundaryEnd 5050404 +MimeEntityBegin 5050404 +MimeEntityHeadersEnd 5050468 +MimeContentBegin 5050468 +MimeContentEnd 5154020 +MimeEntityEnd 5154022 +MultipartBoundaryBegin 5154022 +MultipartBoundaryEnd 5154083 +MimeEntityBegin 5154083 +MimeEntityHeadersEnd 5154156 +MimeContentBegin 5154156 +MimeContentEnd 5154160 +MimeEntityEnd 5154162 +MultipartEndBoundaryBegin 5154162 +MultipartEndBoundaryEnd 5154223 +MultipartEpilogueBegin 5154223 +MultipartEpilogueEnd 5154225 +MimeEntityEnd 5154227 +MultipartEndBoundaryBegin 5154227 +MultipartEndBoundaryEnd 5154286 +MultipartEpilogueBegin 5154286 +MultipartEpilogueEnd 5154286 +MimeEntityEnd 5154288 +MimeMessageEnd 5154288 +MboxMarkerBegin 5154288 +MboxMarkerEnd 5154295 +MimeMessageBegin 5154297 +MimeMessageHeadersEnd 5154999 +MimeEntityBegin 5154297 +MimeEntityHeadersEnd 5154999 +MimeContentBegin 5154999 +MultipartPreambleBegin 5154999 +MultipartPreambleEnd 5155157 +MultipartBoundaryBegin 5155157 +MultipartBoundaryEnd 5155198 +MimeEntityBegin 5155198 +MimeEntityHeadersEnd 5155244 +MimeContentBegin 5155244 +MimeContentEnd 5156788 +MimeEntityEnd 5156790 +MultipartBoundaryBegin 5156790 +MultipartBoundaryEnd 5156831 +MimeEntityBegin 5156831 +MimeEntityHeadersEnd 5156919 +MimeContentBegin 5156919 +MultipartPreambleBegin 5156919 +MultipartPreambleEnd 5156919 +MultipartBoundaryBegin 5156919 +MultipartBoundaryEnd 5156962 +MimeEntityBegin 5156962 +MimeEntityHeadersEnd 5157056 +MimeContentBegin 5157056 +MimeContentEnd 5157976 +MimeEntityEnd 5157978 +MultipartBoundaryBegin 5157978 +MultipartBoundaryEnd 5158021 +MimeEntityBegin 5158021 +MimeEntityHeadersEnd 5158116 +MimeContentBegin 5158116 +MimeContentEnd 5193480 +MimeEntityEnd 5193482 +MultipartBoundaryBegin 5193482 +MultipartBoundaryEnd 5193525 +MimeEntityBegin 5193525 +MimeEntityHeadersEnd 5193619 +MimeContentBegin 5193619 +MimeContentEnd 5193631 +MimeEntityEnd 5193633 +MultipartBoundaryBegin 5193633 +MultipartBoundaryEnd 5193676 +MimeEntityBegin 5193676 +MimeEntityHeadersEnd 5193771 +MimeContentBegin 5193771 +MimeContentEnd 5215415 +MimeEntityEnd 5215417 +MultipartBoundaryBegin 5215417 +MultipartBoundaryEnd 5215460 +MimeEntityBegin 5215460 +MimeEntityHeadersEnd 5215554 +MimeContentBegin 5215554 +MimeContentEnd 5215566 +MimeEntityEnd 5215568 +MultipartBoundaryBegin 5215568 +MultipartBoundaryEnd 5215611 +MimeEntityBegin 5215611 +MimeEntityHeadersEnd 5215706 +MimeContentBegin 5215706 +MimeContentEnd 5248620 +MimeEntityEnd 5248622 +MultipartBoundaryBegin 5248622 +MultipartBoundaryEnd 5248665 +MimeEntityBegin 5248665 +MimeEntityHeadersEnd 5248759 +MimeContentBegin 5248759 +MimeContentEnd 5248771 +MimeEntityEnd 5248773 +MultipartBoundaryBegin 5248773 +MultipartBoundaryEnd 5248816 +MimeEntityBegin 5248816 +MimeEntityHeadersEnd 5248911 +MimeContentBegin 5248911 +MimeContentEnd 5282837 +MimeEntityEnd 5282839 +MultipartBoundaryBegin 5282839 +MultipartBoundaryEnd 5282882 +MimeEntityBegin 5282882 +MimeEntityHeadersEnd 5282976 +MimeContentBegin 5282976 +MimeContentEnd 5282988 +MimeEntityEnd 5282990 +MultipartBoundaryBegin 5282990 +MultipartBoundaryEnd 5283033 +MimeEntityBegin 5283033 +MimeEntityHeadersEnd 5283128 +MimeContentBegin 5283128 +MimeContentEnd 5311368 +MimeEntityEnd 5311370 +MultipartBoundaryBegin 5311370 +MultipartBoundaryEnd 5311413 +MimeEntityBegin 5311413 +MimeEntityHeadersEnd 5311507 +MimeContentBegin 5311507 +MimeContentEnd 5311519 +MimeEntityEnd 5311521 +MultipartBoundaryBegin 5311521 +MultipartBoundaryEnd 5311564 +MimeEntityBegin 5311564 +MimeEntityHeadersEnd 5311659 +MimeContentBegin 5311659 +MimeContentEnd 5345639 +MimeEntityEnd 5345641 +MultipartBoundaryBegin 5345641 +MultipartBoundaryEnd 5345684 +MimeEntityBegin 5345684 +MimeEntityHeadersEnd 5345778 +MimeContentBegin 5345778 +MimeContentEnd 5345790 +MimeEntityEnd 5345792 +MultipartBoundaryBegin 5345792 +MultipartBoundaryEnd 5345835 +MimeEntityBegin 5345835 +MimeEntityHeadersEnd 5345930 +MimeContentBegin 5345930 +MimeContentEnd 5372976 +MimeEntityEnd 5372978 +MultipartBoundaryBegin 5372978 +MultipartBoundaryEnd 5373021 +MimeEntityBegin 5373021 +MimeEntityHeadersEnd 5373115 +MimeContentBegin 5373115 +MimeContentEnd 5373192 +MimeEntityEnd 5373194 +MultipartEndBoundaryBegin 5373194 +MultipartEndBoundaryEnd 5373237 +MultipartEpilogueBegin 5373237 +MultipartEpilogueEnd 5373239 +MimeEntityEnd 5373241 +MultipartEndBoundaryBegin 5373241 +MultipartEndBoundaryEnd 5373282 +MultipartEpilogueBegin 5373282 +MultipartEpilogueEnd 5373282 +MimeEntityEnd 5373284 +MimeMessageEnd 5373284 +MboxMarkerBegin 5373284 +MboxMarkerEnd 5373291 +MimeMessageBegin 5373293 +MimeMessageHeadersEnd 5373698 +MimeEntityBegin 5373293 +MimeEntityHeadersEnd 5373698 +MimeContentBegin 5373698 +MultipartPreambleBegin 5373698 +MultipartPreambleEnd 5373897 +MultipartBoundaryBegin 5373897 +MultipartBoundaryEnd 5373947 +MimeEntityBegin 5373947 +MimeEntityHeadersEnd 5374045 +MimeContentBegin 5374045 +MimeContentEnd 5374257 +MimeEntityEnd 5374259 +MultipartBoundaryBegin 5374259 +MultipartBoundaryEnd 5374309 +MimeEntityBegin 5374309 +MimeEntityHeadersEnd 5374373 +MimeContentBegin 5374373 +MimeContentEnd 5464185 +MimeEntityEnd 5464187 +MultipartBoundaryBegin 5464187 +MultipartBoundaryEnd 5464237 +MimeEntityBegin 5464237 +MimeEntityHeadersEnd 5464265 +MimeContentBegin 5464265 +MimeContentEnd 5464296 +MimeEntityEnd 5464298 +MultipartEndBoundaryBegin 5464298 +MultipartEndBoundaryEnd 5464348 +MultipartEpilogueBegin 5464348 +MultipartEpilogueEnd 5464350 +MimeEntityEnd 5464352 +MimeMessageEnd 5464352 +MboxMarkerBegin 5464352 +MboxMarkerEnd 5464359 +MimeMessageBegin 5464361 +MimeMessageHeadersEnd 5465317 +MimeEntityBegin 5464361 +MimeEntityHeadersEnd 5465317 +MimeContentBegin 5465317 +MimeContentEnd 5516722 +MimeEntityEnd 5516724 +MimeMessageEnd 5516724 +MboxMarkerBegin 5516724 +MboxMarkerEnd 5516731 +MimeMessageBegin 5516733 +MimeMessageHeadersEnd 5517362 +MimeEntityBegin 5516733 +MimeEntityHeadersEnd 5517362 +MimeContentBegin 5517362 +MultipartPreambleBegin 5517362 +MultipartPreambleEnd 5517362 +MultipartBoundaryBegin 5517362 +MultipartBoundaryEnd 5517381 +MimeEntityBegin 5517381 +MimeEntityHeadersEnd 5517383 +MimeContentBegin 5517383 +MimeContentEnd 5521801 +MimeEntityEnd 5521803 +MultipartBoundaryBegin 5521803 +MultipartBoundaryEnd 5521822 +MimeEntityBegin 5521822 +MimeEntityHeadersEnd 5521966 +MimeContentBegin 5521966 +MultipartPreambleBegin 5521966 +MultipartPreambleEnd 5521966 +MultipartBoundaryBegin 5521966 +MultipartBoundaryEnd 5521998 +MimeEntityBegin 5521998 +MimeEntityHeadersEnd 5522000 +MimeContentBegin 5522000 +MimeMessageBegin 5522000 +MimeMessageHeadersEnd 5522109 +MimeEntityBegin 5522000 +MimeEntityHeadersEnd 5522109 +MimeContentBegin 5522109 +MimeContentEnd 5522748 +MimeEntityEnd 5522750 +MimeMessageEnd 5522750 +MimeContentEnd 5522750 +MimeEntityEnd 5522750 +MultipartBoundaryBegin 5522750 +MultipartBoundaryEnd 5522782 +MimeEntityBegin 5522782 +MimeEntityHeadersEnd 5522784 +MimeContentBegin 5522784 +MimeMessageBegin 5522784 +MimeMessageHeadersEnd 5522909 +MimeEntityBegin 5522784 +MimeEntityHeadersEnd 5522909 +MimeContentBegin 5522909 +MimeContentEnd 5523662 +MimeEntityEnd 5523664 +MimeMessageEnd 5523664 +MimeContentEnd 5523664 +MimeEntityEnd 5523664 +MultipartBoundaryBegin 5523664 +MultipartBoundaryEnd 5523696 +MimeEntityBegin 5523696 +MimeEntityHeadersEnd 5523698 +MimeContentBegin 5523698 +MimeMessageBegin 5523698 +MimeMessageHeadersEnd 5523821 +MimeEntityBegin 5523698 +MimeEntityHeadersEnd 5523821 +MimeContentBegin 5523821 +MimeContentEnd 5524481 +MimeEntityEnd 5524483 +MimeMessageEnd 5524483 +MimeContentEnd 5524483 +MimeEntityEnd 5524483 +MultipartBoundaryBegin 5524483 +MultipartBoundaryEnd 5524515 +MimeEntityBegin 5524515 +MimeEntityHeadersEnd 5524517 +MimeContentBegin 5524517 +MimeMessageBegin 5524517 +MimeMessageHeadersEnd 5524677 +MimeEntityBegin 5524517 +MimeEntityHeadersEnd 5524677 +MimeContentBegin 5524677 +MimeContentEnd 5525170 +MimeEntityEnd 5525172 +MimeMessageEnd 5525172 +MimeContentEnd 5525172 +MimeEntityEnd 5525172 +MultipartBoundaryBegin 5525172 +MultipartBoundaryEnd 5525204 +MimeEntityBegin 5525204 +MimeEntityHeadersEnd 5525206 +MimeContentBegin 5525206 +MimeMessageBegin 5525206 +MimeMessageHeadersEnd 5525364 +MimeEntityBegin 5525206 +MimeEntityHeadersEnd 5525364 +MimeContentBegin 5525364 +MimeContentEnd 5525951 +MimeEntityEnd 5525953 +MimeMessageEnd 5525953 +MimeContentEnd 5525953 +MimeEntityEnd 5525953 +MultipartBoundaryBegin 5525953 +MultipartBoundaryEnd 5525985 +MimeEntityBegin 5525985 +MimeEntityHeadersEnd 5525987 +MimeContentBegin 5525987 +MimeMessageBegin 5525987 +MimeMessageHeadersEnd 5526148 +MimeEntityBegin 5525987 +MimeEntityHeadersEnd 5526148 +MimeContentBegin 5526148 +MimeContentEnd 5527449 +MimeEntityEnd 5527451 +MimeMessageEnd 5527451 +MimeContentEnd 5527451 +MimeEntityEnd 5527451 +MultipartBoundaryBegin 5527451 +MultipartBoundaryEnd 5527483 +MimeEntityBegin 5527483 +MimeEntityHeadersEnd 5527485 +MimeContentBegin 5527485 +MimeMessageBegin 5527485 +MimeMessageHeadersEnd 5527642 +MimeEntityBegin 5527485 +MimeEntityHeadersEnd 5527642 +MimeContentBegin 5527642 +MimeContentEnd 5528052 +MimeEntityEnd 5528054 +MimeMessageEnd 5528054 +MimeContentEnd 5528054 +MimeEntityEnd 5528054 +MultipartBoundaryBegin 5528054 +MultipartBoundaryEnd 5528086 +MimeEntityBegin 5528086 +MimeEntityHeadersEnd 5528088 +MimeContentBegin 5528088 +MimeMessageBegin 5528088 +MimeMessageHeadersEnd 5528239 +MimeEntityBegin 5528088 +MimeEntityHeadersEnd 5528239 +MimeContentBegin 5528239 +MimeContentEnd 5528642 +MimeEntityEnd 5528644 +MimeMessageEnd 5528644 +MimeContentEnd 5528644 +MimeEntityEnd 5528644 +MultipartBoundaryBegin 5528644 +MultipartBoundaryEnd 5528676 +MimeEntityBegin 5528676 +MimeEntityHeadersEnd 5528678 +MimeContentBegin 5528678 +MimeMessageBegin 5528678 +MimeMessageHeadersEnd 5528825 +MimeEntityBegin 5528678 +MimeEntityHeadersEnd 5528825 +MimeContentBegin 5528825 +MimeContentEnd 5529476 +MimeEntityEnd 5529478 +MimeMessageEnd 5529478 +MimeContentEnd 5529478 +MimeEntityEnd 5529478 +MultipartBoundaryBegin 5529478 +MultipartBoundaryEnd 5529510 +MimeEntityBegin 5529510 +MimeEntityHeadersEnd 5529512 +MimeContentBegin 5529512 +MimeMessageBegin 5529512 +MimeMessageHeadersEnd 5529653 +MimeEntityBegin 5529512 +MimeEntityHeadersEnd 5529653 +MimeContentBegin 5529653 +MimeContentEnd 5530649 +MimeEntityEnd 5530651 +MimeMessageEnd 5530651 +MimeContentEnd 5530651 +MimeEntityEnd 5530651 +MultipartBoundaryBegin 5530651 +MultipartBoundaryEnd 5530683 +MimeEntityBegin 5530683 +MimeEntityHeadersEnd 5530685 +MimeContentBegin 5530685 +MimeMessageBegin 5530685 +MimeMessageHeadersEnd 5530836 +MimeEntityBegin 5530685 +MimeEntityHeadersEnd 5530836 +MimeContentBegin 5530836 +MimeContentEnd 5531753 +MimeEntityEnd 5531755 +MimeMessageEnd 5531755 +MimeContentEnd 5531755 +MimeEntityEnd 5531755 +MultipartBoundaryBegin 5531755 +MultipartBoundaryEnd 5531787 +MimeEntityBegin 5531787 +MimeEntityHeadersEnd 5531789 +MimeContentBegin 5531789 +MimeMessageBegin 5531789 +MimeMessageHeadersEnd 5531924 +MimeEntityBegin 5531789 +MimeEntityHeadersEnd 5531924 +MimeContentBegin 5531924 +MimeContentEnd 5532494 +MimeEntityEnd 5532496 +MimeMessageEnd 5532496 +MimeContentEnd 5532496 +MimeEntityEnd 5532496 +MultipartBoundaryBegin 5532496 +MultipartBoundaryEnd 5532528 +MimeEntityBegin 5532528 +MimeEntityHeadersEnd 5532530 +MimeContentBegin 5532530 +MimeMessageBegin 5532530 +MimeMessageHeadersEnd 5532666 +MimeEntityBegin 5532530 +MimeEntityHeadersEnd 5532666 +MimeContentBegin 5532666 +MimeContentEnd 5533113 +MimeEntityEnd 5533115 +MimeMessageEnd 5533115 +MimeContentEnd 5533115 +MimeEntityEnd 5533115 +MultipartBoundaryBegin 5533115 +MultipartBoundaryEnd 5533147 +MimeEntityBegin 5533147 +MimeEntityHeadersEnd 5533149 +MimeContentBegin 5533149 +MimeMessageBegin 5533149 +MimeMessageHeadersEnd 5533270 +MimeEntityBegin 5533149 +MimeEntityHeadersEnd 5533270 +MimeContentBegin 5533270 +MimeContentEnd 5533837 +MimeEntityEnd 5533839 +MimeMessageEnd 5533839 +MimeContentEnd 5533839 +MimeEntityEnd 5533839 +MultipartBoundaryBegin 5533839 +MultipartBoundaryEnd 5533871 +MimeEntityBegin 5533871 +MimeEntityHeadersEnd 5533873 +MimeContentBegin 5533873 +MimeMessageBegin 5533873 +MimeMessageHeadersEnd 5533992 +MimeEntityBegin 5533873 +MimeEntityHeadersEnd 5533992 +MimeContentBegin 5533992 +MimeContentEnd 5534185 +MimeEntityEnd 5534187 +MimeMessageEnd 5534187 +MimeContentEnd 5534187 +MimeEntityEnd 5534187 +MultipartBoundaryBegin 5534187 +MultipartBoundaryEnd 5534219 +MimeEntityBegin 5534219 +MimeEntityHeadersEnd 5534221 +MimeContentBegin 5534221 +MimeMessageBegin 5534221 +MimeMessageHeadersEnd 5534342 +MimeEntityBegin 5534221 +MimeEntityHeadersEnd 5534342 +MimeContentBegin 5534342 +MimeContentEnd 5534677 +MimeEntityEnd 5534679 +MimeMessageEnd 5534679 +MimeContentEnd 5534679 +MimeEntityEnd 5534679 +MultipartBoundaryBegin 5534679 +MultipartBoundaryEnd 5534711 +MimeEntityBegin 5534711 +MimeEntityHeadersEnd 5534713 +MimeContentBegin 5534713 +MimeMessageBegin 5534713 +MimeMessageHeadersEnd 5534840 +MimeEntityBegin 5534713 +MimeEntityHeadersEnd 5534840 +MimeContentBegin 5534840 +MimeContentEnd 5535528 +MimeEntityEnd 5535530 +MimeMessageEnd 5535530 +MimeContentEnd 5535530 +MimeEntityEnd 5535530 +MultipartBoundaryBegin 5535530 +MultipartBoundaryEnd 5535562 +MimeEntityBegin 5535562 +MimeEntityHeadersEnd 5535564 +MimeContentBegin 5535564 +MimeMessageBegin 5535564 +MimeMessageHeadersEnd 5535692 +MimeEntityBegin 5535564 +MimeEntityHeadersEnd 5535692 +MimeContentBegin 5535692 +MimeContentEnd 5535799 +MimeEntityEnd 5535801 +MimeMessageEnd 5535801 +MimeContentEnd 5535801 +MimeEntityEnd 5535801 +MultipartBoundaryBegin 5535801 +MultipartBoundaryEnd 5535833 +MimeEntityBegin 5535833 +MimeEntityHeadersEnd 5535835 +MimeContentBegin 5535835 +MimeMessageBegin 5535835 +MimeMessageHeadersEnd 5535981 +MimeEntityBegin 5535835 +MimeEntityHeadersEnd 5535981 +MimeContentBegin 5535981 +MimeContentEnd 5536838 +MimeEntityEnd 5536840 +MimeMessageEnd 5536840 +MimeContentEnd 5536840 +MimeEntityEnd 5536840 +MultipartBoundaryBegin 5536840 +MultipartBoundaryEnd 5536872 +MimeEntityBegin 5536872 +MimeEntityHeadersEnd 5536874 +MimeContentBegin 5536874 +MimeMessageBegin 5536874 +MimeMessageHeadersEnd 5536988 +MimeEntityBegin 5536874 +MimeEntityHeadersEnd 5536988 +MimeContentBegin 5536988 +MimeContentEnd 5537416 +MimeEntityEnd 5537418 +MimeMessageEnd 5537418 +MimeContentEnd 5537418 +MimeEntityEnd 5537418 +MultipartBoundaryBegin 5537418 +MultipartBoundaryEnd 5537450 +MimeEntityBegin 5537450 +MimeEntityHeadersEnd 5537452 +MimeContentBegin 5537452 +MimeMessageBegin 5537452 +MimeMessageHeadersEnd 5537628 +MimeEntityBegin 5537452 +MimeEntityHeadersEnd 5537628 +MimeContentBegin 5537628 +MimeContentEnd 5537867 +MimeEntityEnd 5537869 +MimeMessageEnd 5537869 +MimeContentEnd 5537869 +MimeEntityEnd 5537869 +MultipartBoundaryBegin 5537869 +MultipartBoundaryEnd 5537901 +MimeEntityBegin 5537901 +MimeEntityHeadersEnd 5537903 +MimeContentBegin 5537903 +MimeMessageBegin 5537903 +MimeMessageHeadersEnd 5538033 +MimeEntityBegin 5537903 +MimeEntityHeadersEnd 5538033 +MimeContentBegin 5538033 +MimeContentEnd 5538444 +MimeEntityEnd 5538446 +MimeMessageEnd 5538446 +MimeContentEnd 5538446 +MimeEntityEnd 5538446 +MultipartBoundaryBegin 5538446 +MultipartBoundaryEnd 5538478 +MimeEntityBegin 5538478 +MimeEntityHeadersEnd 5538480 +MimeContentBegin 5538480 +MimeMessageBegin 5538480 +MimeMessageHeadersEnd 5538601 +MimeEntityBegin 5538480 +MimeEntityHeadersEnd 5538601 +MimeContentBegin 5538601 +MimeContentEnd 5539533 +MimeEntityEnd 5539535 +MimeMessageEnd 5539535 +MimeContentEnd 5539535 +MimeEntityEnd 5539535 +MultipartBoundaryBegin 5539535 +MultipartBoundaryEnd 5539567 +MimeEntityBegin 5539567 +MimeEntityHeadersEnd 5539569 +MimeContentBegin 5539569 +MimeMessageBegin 5539569 +MimeMessageHeadersEnd 5539701 +MimeEntityBegin 5539569 +MimeEntityHeadersEnd 5539701 +MimeContentBegin 5539701 +MimeContentEnd 5540001 +MimeEntityEnd 5540003 +MimeMessageEnd 5540003 +MimeContentEnd 5540003 +MimeEntityEnd 5540003 +MultipartBoundaryBegin 5540003 +MultipartBoundaryEnd 5540035 +MimeEntityBegin 5540035 +MimeEntityHeadersEnd 5540037 +MimeContentBegin 5540037 +MimeMessageBegin 5540037 +MimeMessageHeadersEnd 5540170 +MimeEntityBegin 5540037 +MimeEntityHeadersEnd 5540170 +MimeContentBegin 5540170 +MimeContentEnd 5540594 +MimeEntityEnd 5540596 +MimeMessageEnd 5540596 +MimeContentEnd 5540596 +MimeEntityEnd 5540596 +MultipartBoundaryBegin 5540596 +MultipartBoundaryEnd 5540628 +MimeEntityBegin 5540628 +MimeEntityHeadersEnd 5540630 +MimeContentBegin 5540630 +MimeMessageBegin 5540630 +MimeMessageHeadersEnd 5540749 +MimeEntityBegin 5540630 +MimeEntityHeadersEnd 5540749 +MimeContentBegin 5540749 +MimeContentEnd 5540898 +MimeEntityEnd 5540900 +MimeMessageEnd 5540900 +MimeContentEnd 5540900 +MimeEntityEnd 5540900 +MultipartBoundaryBegin 5540900 +MultipartBoundaryEnd 5540932 +MimeEntityBegin 5540932 +MimeEntityHeadersEnd 5540934 +MimeContentBegin 5540934 +MimeMessageBegin 5540934 +MimeMessageHeadersEnd 5541063 +MimeEntityBegin 5540934 +MimeEntityHeadersEnd 5541063 +MimeContentBegin 5541063 +MimeContentEnd 5541249 +MimeEntityEnd 5541251 +MimeMessageEnd 5541251 +MimeContentEnd 5541251 +MimeEntityEnd 5541251 +MultipartBoundaryBegin 5541251 +MultipartBoundaryEnd 5541283 +MimeEntityBegin 5541283 +MimeEntityHeadersEnd 5541285 +MimeContentBegin 5541285 +MimeMessageBegin 5541285 +MimeMessageHeadersEnd 5541419 +MimeEntityBegin 5541285 +MimeEntityHeadersEnd 5541419 +MimeContentBegin 5541419 +MimeContentEnd 5542149 +MimeEntityEnd 5542151 +MimeMessageEnd 5542151 +MimeContentEnd 5542151 +MimeEntityEnd 5542151 +MultipartBoundaryBegin 5542151 +MultipartBoundaryEnd 5542183 +MimeEntityBegin 5542183 +MimeEntityHeadersEnd 5542185 +MimeContentBegin 5542185 +MimeMessageBegin 5542185 +MimeMessageHeadersEnd 5542335 +MimeEntityBegin 5542185 +MimeEntityHeadersEnd 5542335 +MimeContentBegin 5542335 +MimeContentEnd 5543318 +MimeEntityEnd 5543320 +MimeMessageEnd 5543320 +MimeContentEnd 5543320 +MimeEntityEnd 5543320 +MultipartBoundaryBegin 5543320 +MultipartBoundaryEnd 5543352 +MimeEntityBegin 5543352 +MimeEntityHeadersEnd 5543354 +MimeContentBegin 5543354 +MimeMessageBegin 5543354 +MimeMessageHeadersEnd 5543492 +MimeEntityBegin 5543354 +MimeEntityHeadersEnd 5543492 +MimeContentBegin 5543492 +MimeContentEnd 5543746 +MimeEntityEnd 5543748 +MimeMessageEnd 5543748 +MimeContentEnd 5543748 +MimeEntityEnd 5543748 +MultipartBoundaryBegin 5543748 +MultipartBoundaryEnd 5543780 +MimeEntityBegin 5543780 +MimeEntityHeadersEnd 5543782 +MimeContentBegin 5543782 +MimeMessageBegin 5543782 +MimeMessageHeadersEnd 5543908 +MimeEntityBegin 5543782 +MimeEntityHeadersEnd 5543908 +MimeContentBegin 5543908 +MimeContentEnd 5544041 +MimeEntityEnd 5544043 +MimeMessageEnd 5544043 +MimeContentEnd 5544043 +MimeEntityEnd 5544043 +MultipartBoundaryBegin 5544043 +MultipartBoundaryEnd 5544075 +MimeEntityBegin 5544075 +MimeEntityHeadersEnd 5544077 +MimeContentBegin 5544077 +MimeMessageBegin 5544077 +MimeMessageHeadersEnd 5544257 +MimeEntityBegin 5544077 +MimeEntityHeadersEnd 5544257 +MimeContentBegin 5544257 +MimeContentEnd 5545018 +MimeEntityEnd 5545020 +MimeMessageEnd 5545020 +MimeContentEnd 5545020 +MimeEntityEnd 5545020 +MultipartBoundaryBegin 5545020 +MultipartBoundaryEnd 5545052 +MimeEntityBegin 5545052 +MimeEntityHeadersEnd 5545054 +MimeContentBegin 5545054 +MimeMessageBegin 5545054 +MimeMessageHeadersEnd 5545218 +MimeEntityBegin 5545054 +MimeEntityHeadersEnd 5545218 +MimeContentBegin 5545218 +MimeContentEnd 5545633 +MimeEntityEnd 5545635 +MimeMessageEnd 5545635 +MimeContentEnd 5545635 +MimeEntityEnd 5545635 +MultipartBoundaryBegin 5545635 +MultipartBoundaryEnd 5545667 +MimeEntityBegin 5545667 +MimeEntityHeadersEnd 5545669 +MimeContentBegin 5545669 +MimeMessageBegin 5545669 +MimeMessageHeadersEnd 5545805 +MimeEntityBegin 5545669 +MimeEntityHeadersEnd 5545805 +MimeContentBegin 5545805 +MimeContentEnd 5547113 +MimeEntityEnd 5547115 +MimeMessageEnd 5547115 +MimeContentEnd 5547115 +MimeEntityEnd 5547115 +MultipartBoundaryBegin 5547115 +MultipartBoundaryEnd 5547147 +MimeEntityBegin 5547147 +MimeEntityHeadersEnd 5547149 +MimeContentBegin 5547149 +MimeMessageBegin 5547149 +MimeMessageHeadersEnd 5547259 +MimeEntityBegin 5547149 +MimeEntityHeadersEnd 5547259 +MimeContentBegin 5547259 +MimeContentEnd 5547408 +MimeEntityEnd 5547410 +MimeMessageEnd 5547410 +MimeContentEnd 5547410 +MimeEntityEnd 5547410 +MultipartBoundaryBegin 5547410 +MultipartBoundaryEnd 5547442 +MimeEntityBegin 5547442 +MimeEntityHeadersEnd 5547444 +MimeContentBegin 5547444 +MimeMessageBegin 5547444 +MimeMessageHeadersEnd 5547585 +MimeEntityBegin 5547444 +MimeEntityHeadersEnd 5547585 +MimeContentBegin 5547585 +MimeContentEnd 5547895 +MimeEntityEnd 5547897 +MimeMessageEnd 5547897 +MimeContentEnd 5547897 +MimeEntityEnd 5547897 +MultipartBoundaryBegin 5547897 +MultipartBoundaryEnd 5547929 +MimeEntityBegin 5547929 +MimeEntityHeadersEnd 5547931 +MimeContentBegin 5547931 +MimeMessageBegin 5547931 +MimeMessageHeadersEnd 5548061 +MimeEntityBegin 5547931 +MimeEntityHeadersEnd 5548061 +MimeContentBegin 5548061 +MimeContentEnd 5548254 +MimeEntityEnd 5548256 +MimeMessageEnd 5548256 +MimeContentEnd 5548256 +MimeEntityEnd 5548256 +MultipartBoundaryBegin 5548256 +MultipartBoundaryEnd 5548288 +MimeEntityBegin 5548288 +MimeEntityHeadersEnd 5548290 +MimeContentBegin 5548290 +MimeMessageBegin 5548290 +MimeMessageHeadersEnd 5548399 +MimeEntityBegin 5548290 +MimeEntityHeadersEnd 5548399 +MimeContentBegin 5548399 +MimeContentEnd 5548809 +MimeEntityEnd 5548811 +MimeMessageEnd 5548811 +MimeContentEnd 5548811 +MimeEntityEnd 5548811 +MultipartBoundaryBegin 5548811 +MultipartBoundaryEnd 5548843 +MimeEntityBegin 5548843 +MimeEntityHeadersEnd 5548845 +MimeContentBegin 5548845 +MimeMessageBegin 5548845 +MimeMessageHeadersEnd 5548983 +MimeEntityBegin 5548845 +MimeEntityHeadersEnd 5548983 +MimeContentBegin 5548983 +MimeContentEnd 5549293 +MimeEntityEnd 5549295 +MimeMessageEnd 5549295 +MimeContentEnd 5549295 +MimeEntityEnd 5549295 +MultipartBoundaryBegin 5549295 +MultipartBoundaryEnd 5549327 +MimeEntityBegin 5549327 +MimeEntityHeadersEnd 5549329 +MimeContentBegin 5549329 +MimeMessageBegin 5549329 +MimeMessageHeadersEnd 5549476 +MimeEntityBegin 5549329 +MimeEntityHeadersEnd 5549476 +MimeContentBegin 5549476 +MimeContentEnd 5550111 +MimeEntityEnd 5550113 +MimeMessageEnd 5550113 +MimeContentEnd 5550113 +MimeEntityEnd 5550113 +MultipartBoundaryBegin 5550113 +MultipartBoundaryEnd 5550145 +MimeEntityBegin 5550145 +MimeEntityHeadersEnd 5550147 +MimeContentBegin 5550147 +MimeMessageBegin 5550147 +MimeMessageHeadersEnd 5550304 +MimeEntityBegin 5550147 +MimeEntityHeadersEnd 5550304 +MimeContentBegin 5550304 +MimeContentEnd 5550789 +MimeEntityEnd 5550791 +MimeMessageEnd 5550791 +MimeContentEnd 5550791 +MimeEntityEnd 5550791 +MultipartBoundaryBegin 5550791 +MultipartBoundaryEnd 5550823 +MimeEntityBegin 5550823 +MimeEntityHeadersEnd 5550825 +MimeContentBegin 5550825 +MimeMessageBegin 5550825 +MimeMessageHeadersEnd 5550962 +MimeEntityBegin 5550825 +MimeEntityHeadersEnd 5550962 +MimeContentBegin 5550962 +MimeContentEnd 5552161 +MimeEntityEnd 5552163 +MimeMessageEnd 5552163 +MimeContentEnd 5552163 +MimeEntityEnd 5552163 +MultipartBoundaryBegin 5552163 +MultipartBoundaryEnd 5552195 +MimeEntityBegin 5552195 +MimeEntityHeadersEnd 5552197 +MimeContentBegin 5552197 +MimeMessageBegin 5552197 +MimeMessageHeadersEnd 5552377 +MimeEntityBegin 5552197 +MimeEntityHeadersEnd 5552377 +MimeContentBegin 5552377 +MimeContentEnd 5552644 +MimeEntityEnd 5552646 +MimeMessageEnd 5552646 +MimeContentEnd 5552646 +MimeEntityEnd 5552646 +MultipartBoundaryBegin 5552646 +MultipartBoundaryEnd 5552678 +MimeEntityBegin 5552678 +MimeEntityHeadersEnd 5552680 +MimeContentBegin 5552680 +MimeMessageBegin 5552680 +MimeMessageHeadersEnd 5552799 +MimeEntityBegin 5552680 +MimeEntityHeadersEnd 5552799 +MimeContentBegin 5552799 +MimeContentEnd 5552996 +MimeEntityEnd 5552998 +MimeMessageEnd 5552998 +MimeContentEnd 5552998 +MimeEntityEnd 5552998 +MultipartBoundaryBegin 5552998 +MultipartBoundaryEnd 5553030 +MimeEntityBegin 5553030 +MimeEntityHeadersEnd 5553032 +MimeContentBegin 5553032 +MimeMessageBegin 5553032 +MimeMessageHeadersEnd 5553176 +MimeEntityBegin 5553032 +MimeEntityHeadersEnd 5553176 +MimeContentBegin 5553176 +MimeContentEnd 5554065 +MimeEntityEnd 5554067 +MimeMessageEnd 5554067 +MimeContentEnd 5554067 +MimeEntityEnd 5554067 +MultipartBoundaryBegin 5554067 +MultipartBoundaryEnd 5554099 +MimeEntityBegin 5554099 +MimeEntityHeadersEnd 5554101 +MimeContentBegin 5554101 +MimeMessageBegin 5554101 +MimeMessageHeadersEnd 5554230 +MimeEntityBegin 5554101 +MimeEntityHeadersEnd 5554230 +MimeContentBegin 5554230 +MimeContentEnd 5554955 +MimeEntityEnd 5554957 +MimeMessageEnd 5554957 +MimeContentEnd 5554957 +MimeEntityEnd 5554957 +MultipartBoundaryBegin 5554957 +MultipartBoundaryEnd 5554989 +MimeEntityBegin 5554989 +MimeEntityHeadersEnd 5554991 +MimeContentBegin 5554991 +MimeMessageBegin 5554991 +MimeMessageHeadersEnd 5555107 +MimeEntityBegin 5554991 +MimeEntityHeadersEnd 5555107 +MimeContentBegin 5555107 +MimeContentEnd 5555827 +MimeEntityEnd 5555829 +MimeMessageEnd 5555829 +MimeContentEnd 5555829 +MimeEntityEnd 5555829 +MultipartBoundaryBegin 5555829 +MultipartBoundaryEnd 5555861 +MimeEntityBegin 5555861 +MimeEntityHeadersEnd 5555863 +MimeContentBegin 5555863 +MimeMessageBegin 5555863 +MimeMessageHeadersEnd 5555999 +MimeEntityBegin 5555863 +MimeEntityHeadersEnd 5555999 +MimeContentBegin 5555999 +MimeContentEnd 5556390 +MimeEntityEnd 5556392 +MimeMessageEnd 5556392 +MimeContentEnd 5556392 +MimeEntityEnd 5556392 +MultipartBoundaryBegin 5556392 +MultipartBoundaryEnd 5556424 +MimeEntityBegin 5556424 +MimeEntityHeadersEnd 5556426 +MimeContentBegin 5556426 +MimeMessageBegin 5556426 +MimeMessageHeadersEnd 5556566 +MimeEntityBegin 5556426 +MimeEntityHeadersEnd 5556566 +MimeContentBegin 5556566 +MimeContentEnd 5557567 +MimeEntityEnd 5557569 +MimeMessageEnd 5557569 +MimeContentEnd 5557569 +MimeEntityEnd 5557569 +MultipartBoundaryBegin 5557569 +MultipartBoundaryEnd 5557601 +MimeEntityBegin 5557601 +MimeEntityHeadersEnd 5557603 +MimeContentBegin 5557603 +MimeMessageBegin 5557603 +MimeMessageHeadersEnd 5557752 +MimeEntityBegin 5557603 +MimeEntityHeadersEnd 5557752 +MimeContentBegin 5557752 +MimeContentEnd 5558229 +MimeEntityEnd 5558231 +MimeMessageEnd 5558231 +MimeContentEnd 5558231 +MimeEntityEnd 5558231 +MultipartBoundaryBegin 5558231 +MultipartBoundaryEnd 5558263 +MimeEntityBegin 5558263 +MimeEntityHeadersEnd 5558265 +MimeContentBegin 5558265 +MimeMessageBegin 5558265 +MimeMessageHeadersEnd 5558402 +MimeEntityBegin 5558265 +MimeEntityHeadersEnd 5558402 +MimeContentBegin 5558402 +MimeContentEnd 5558691 +MimeEntityEnd 5558693 +MimeMessageEnd 5558693 +MimeContentEnd 5558693 +MimeEntityEnd 5558693 +MultipartBoundaryBegin 5558693 +MultipartBoundaryEnd 5558725 +MimeEntityBegin 5558725 +MimeEntityHeadersEnd 5558727 +MimeContentBegin 5558727 +MimeMessageBegin 5558727 +MimeMessageHeadersEnd 5558856 +MimeEntityBegin 5558727 +MimeEntityHeadersEnd 5558856 +MimeContentBegin 5558856 +MimeContentEnd 5559142 +MimeEntityEnd 5559144 +MimeMessageEnd 5559144 +MimeContentEnd 5559144 +MimeEntityEnd 5559144 +MultipartBoundaryBegin 5559144 +MultipartBoundaryEnd 5559176 +MimeEntityBegin 5559176 +MimeEntityHeadersEnd 5559178 +MimeContentBegin 5559178 +MimeMessageBegin 5559178 +MimeMessageHeadersEnd 5559303 +MimeEntityBegin 5559178 +MimeEntityHeadersEnd 5559303 +MimeContentBegin 5559303 +MimeContentEnd 5559973 +MimeEntityEnd 5559975 +MimeMessageEnd 5559975 +MimeContentEnd 5559975 +MimeEntityEnd 5559975 +MultipartBoundaryBegin 5559975 +MultipartBoundaryEnd 5560007 +MimeEntityBegin 5560007 +MimeEntityHeadersEnd 5560009 +MimeContentBegin 5560009 +MimeMessageBegin 5560009 +MimeMessageHeadersEnd 5560157 +MimeEntityBegin 5560009 +MimeEntityHeadersEnd 5560157 +MimeContentBegin 5560157 +MimeContentEnd 5562461 +MimeEntityEnd 5562463 +MimeMessageEnd 5562463 +MimeContentEnd 5562463 +MimeEntityEnd 5562463 +MultipartBoundaryBegin 5562463 +MultipartBoundaryEnd 5562495 +MimeEntityBegin 5562495 +MimeEntityHeadersEnd 5562497 +MimeContentBegin 5562497 +MimeMessageBegin 5562497 +MimeMessageHeadersEnd 5562623 +MimeEntityBegin 5562497 +MimeEntityHeadersEnd 5562623 +MimeContentBegin 5562623 +MimeContentEnd 5563432 +MimeEntityEnd 5563434 +MimeMessageEnd 5563434 +MimeContentEnd 5563434 +MimeEntityEnd 5563434 +MultipartBoundaryBegin 5563434 +MultipartBoundaryEnd 5563466 +MimeEntityBegin 5563466 +MimeEntityHeadersEnd 5563468 +MimeContentBegin 5563468 +MimeMessageBegin 5563468 +MimeMessageHeadersEnd 5563566 +MimeEntityBegin 5563468 +MimeEntityHeadersEnd 5563566 +MimeContentBegin 5563566 +MimeContentEnd 5563802 +MimeEntityEnd 5563804 +MimeMessageEnd 5563804 +MimeContentEnd 5563804 +MimeEntityEnd 5563804 +MultipartBoundaryBegin 5563804 +MultipartBoundaryEnd 5563836 +MimeEntityBegin 5563836 +MimeEntityHeadersEnd 5563838 +MimeContentBegin 5563838 +MimeMessageBegin 5563838 +MimeMessageHeadersEnd 5563963 +MimeEntityBegin 5563838 +MimeEntityHeadersEnd 5563963 +MimeContentBegin 5563963 +MimeContentEnd 5564651 +MimeEntityEnd 5564653 +MimeMessageEnd 5564653 +MimeContentEnd 5564653 +MimeEntityEnd 5564653 +MultipartBoundaryBegin 5564653 +MultipartBoundaryEnd 5564685 +MimeEntityBegin 5564685 +MimeEntityHeadersEnd 5564687 +MimeContentBegin 5564687 +MimeMessageBegin 5564687 +MimeMessageHeadersEnd 5564801 +MimeEntityBegin 5564687 +MimeEntityHeadersEnd 5564801 +MimeContentBegin 5564801 +MimeContentEnd 5567416 +MimeEntityEnd 5567418 +MimeMessageEnd 5567418 +MimeContentEnd 5567418 +MimeEntityEnd 5567418 +MultipartBoundaryBegin 5567418 +MultipartBoundaryEnd 5567450 +MimeEntityBegin 5567450 +MimeEntityHeadersEnd 5567452 +MimeContentBegin 5567452 +MimeMessageBegin 5567452 +MimeMessageHeadersEnd 5567562 +MimeEntityBegin 5567452 +MimeEntityHeadersEnd 5567562 +MimeContentBegin 5567562 +MimeContentEnd 5568805 +MimeEntityEnd 5568807 +MimeMessageEnd 5568807 +MimeContentEnd 5568807 +MimeEntityEnd 5568807 +MultipartBoundaryBegin 5568807 +MultipartBoundaryEnd 5568839 +MimeEntityBegin 5568839 +MimeEntityHeadersEnd 5568841 +MimeContentBegin 5568841 +MimeMessageBegin 5568841 +MimeMessageHeadersEnd 5568951 +MimeEntityBegin 5568841 +MimeEntityHeadersEnd 5568951 +MimeContentBegin 5568951 +MimeContentEnd 5570791 +MimeEntityEnd 5570793 +MimeMessageEnd 5570793 +MimeContentEnd 5570793 +MimeEntityEnd 5570793 +MultipartBoundaryBegin 5570793 +MultipartBoundaryEnd 5570825 +MimeEntityBegin 5570825 +MimeEntityHeadersEnd 5570827 +MimeContentBegin 5570827 +MimeMessageBegin 5570827 +MimeMessageHeadersEnd 5570960 +MimeEntityBegin 5570827 +MimeEntityHeadersEnd 5570960 +MimeContentBegin 5570960 +MimeContentEnd 5571542 +MimeEntityEnd 5571544 +MimeMessageEnd 5571544 +MimeContentEnd 5571544 +MimeEntityEnd 5571544 +MultipartBoundaryBegin 5571544 +MultipartBoundaryEnd 5571576 +MimeEntityBegin 5571576 +MimeEntityHeadersEnd 5571578 +MimeContentBegin 5571578 +MimeMessageBegin 5571578 +MimeMessageHeadersEnd 5571670 +MimeEntityBegin 5571578 +MimeEntityHeadersEnd 5571670 +MimeContentBegin 5571670 +MimeContentEnd 5573024 +MimeEntityEnd 5573026 +MimeMessageEnd 5573026 +MimeContentEnd 5573026 +MimeEntityEnd 5573026 +MultipartBoundaryBegin 5573026 +MultipartBoundaryEnd 5573058 +MimeEntityBegin 5573058 +MimeEntityHeadersEnd 5573060 +MimeContentBegin 5573060 +MimeMessageBegin 5573060 +MimeMessageHeadersEnd 5573180 +MimeEntityBegin 5573060 +MimeEntityHeadersEnd 5573180 +MimeContentBegin 5573180 +MimeContentEnd 5575356 +MimeEntityEnd 5575358 +MimeMessageEnd 5575358 +MimeContentEnd 5575358 +MimeEntityEnd 5575358 +MultipartBoundaryBegin 5575358 +MultipartBoundaryEnd 5575390 +MimeEntityBegin 5575390 +MimeEntityHeadersEnd 5575392 +MimeContentBegin 5575392 +MimeMessageBegin 5575392 +MimeMessageHeadersEnd 5575517 +MimeEntityBegin 5575392 +MimeEntityHeadersEnd 5575517 +MimeContentBegin 5575517 +MimeContentEnd 5577580 +MimeEntityEnd 5577582 +MimeMessageEnd 5577582 +MimeContentEnd 5577582 +MimeEntityEnd 5577582 +MultipartBoundaryBegin 5577582 +MultipartBoundaryEnd 5577614 +MimeEntityBegin 5577614 +MimeEntityHeadersEnd 5577616 +MimeContentBegin 5577616 +MimeMessageBegin 5577616 +MimeMessageHeadersEnd 5577741 +MimeEntityBegin 5577616 +MimeEntityHeadersEnd 5577741 +MimeContentBegin 5577741 +MimeContentEnd 5578437 +MimeEntityEnd 5578439 +MimeMessageEnd 5578439 +MimeContentEnd 5578439 +MimeEntityEnd 5578439 +MultipartBoundaryBegin 5578439 +MultipartBoundaryEnd 5578471 +MimeEntityBegin 5578471 +MimeEntityHeadersEnd 5578473 +MimeContentBegin 5578473 +MimeMessageBegin 5578473 +MimeMessageHeadersEnd 5578614 +MimeEntityBegin 5578473 +MimeEntityHeadersEnd 5578614 +MimeContentBegin 5578614 +MimeContentEnd 5579450 +MimeEntityEnd 5579452 +MimeMessageEnd 5579452 +MimeContentEnd 5579452 +MimeEntityEnd 5579452 +MultipartBoundaryBegin 5579452 +MultipartBoundaryEnd 5579484 +MimeEntityBegin 5579484 +MimeEntityHeadersEnd 5579486 +MimeContentBegin 5579486 +MimeMessageBegin 5579486 +MimeMessageHeadersEnd 5579614 +MimeEntityBegin 5579486 +MimeEntityHeadersEnd 5579614 +MimeContentBegin 5579614 +MimeContentEnd 5580359 +MimeEntityEnd 5580361 +MimeMessageEnd 5580361 +MimeContentEnd 5580361 +MimeEntityEnd 5580361 +MultipartBoundaryBegin 5580361 +MultipartBoundaryEnd 5580393 +MimeEntityBegin 5580393 +MimeEntityHeadersEnd 5580395 +MimeContentBegin 5580395 +MimeMessageBegin 5580395 +MimeMessageHeadersEnd 5580501 +MimeEntityBegin 5580395 +MimeEntityHeadersEnd 5580501 +MimeContentBegin 5580501 +MimeContentEnd 5581257 +MimeEntityEnd 5581259 +MimeMessageEnd 5581259 +MimeContentEnd 5581259 +MimeEntityEnd 5581259 +MultipartBoundaryBegin 5581259 +MultipartBoundaryEnd 5581291 +MimeEntityBegin 5581291 +MimeEntityHeadersEnd 5581293 +MimeContentBegin 5581293 +MimeMessageBegin 5581293 +MimeMessageHeadersEnd 5581454 +MimeEntityBegin 5581293 +MimeEntityHeadersEnd 5581454 +MimeContentBegin 5581454 +MimeContentEnd 5581820 +MimeEntityEnd 5581822 +MimeMessageEnd 5581822 +MimeContentEnd 5581822 +MimeEntityEnd 5581822 +MultipartBoundaryBegin 5581822 +MultipartBoundaryEnd 5581854 +MimeEntityBegin 5581854 +MimeEntityHeadersEnd 5581856 +MimeContentBegin 5581856 +MimeMessageBegin 5581856 +MimeMessageHeadersEnd 5581947 +MimeEntityBegin 5581856 +MimeEntityHeadersEnd 5581947 +MimeContentBegin 5581947 +MimeContentEnd 5582597 +MimeEntityEnd 5582599 +MimeMessageEnd 5582599 +MimeContentEnd 5582599 +MimeEntityEnd 5582599 +MultipartBoundaryBegin 5582599 +MultipartBoundaryEnd 5582631 +MimeEntityBegin 5582631 +MimeEntityHeadersEnd 5582633 +MimeContentBegin 5582633 +MimeMessageBegin 5582633 +MimeMessageHeadersEnd 5582786 +MimeEntityBegin 5582633 +MimeEntityHeadersEnd 5582786 +MimeContentBegin 5582786 +MimeContentEnd 5583169 +MimeEntityEnd 5583171 +MimeMessageEnd 5583171 +MimeContentEnd 5583171 +MimeEntityEnd 5583171 +MultipartBoundaryBegin 5583171 +MultipartBoundaryEnd 5583203 +MimeEntityBegin 5583203 +MimeEntityHeadersEnd 5583205 +MimeContentBegin 5583205 +MimeMessageBegin 5583205 +MimeMessageHeadersEnd 5583310 +MimeEntityBegin 5583205 +MimeEntityHeadersEnd 5583310 +MimeContentBegin 5583310 +MimeContentEnd 5583604 +MimeEntityEnd 5583606 +MimeMessageEnd 5583606 +MimeContentEnd 5583606 +MimeEntityEnd 5583606 +MultipartBoundaryBegin 5583606 +MultipartBoundaryEnd 5583638 +MimeEntityBegin 5583638 +MimeEntityHeadersEnd 5583640 +MimeContentBegin 5583640 +MimeMessageBegin 5583640 +MimeMessageHeadersEnd 5583772 +MimeEntityBegin 5583640 +MimeEntityHeadersEnd 5583772 +MimeContentBegin 5583772 +MimeContentEnd 5584267 +MimeEntityEnd 5584269 +MimeMessageEnd 5584269 +MimeContentEnd 5584269 +MimeEntityEnd 5584269 +MultipartBoundaryBegin 5584269 +MultipartBoundaryEnd 5584301 +MimeEntityBegin 5584301 +MimeEntityHeadersEnd 5584303 +MimeContentBegin 5584303 +MimeMessageBegin 5584303 +MimeMessageHeadersEnd 5584404 +MimeEntityBegin 5584303 +MimeEntityHeadersEnd 5584404 +MimeContentBegin 5584404 +MimeContentEnd 5584803 +MimeEntityEnd 5584805 +MimeMessageEnd 5584805 +MimeContentEnd 5584805 +MimeEntityEnd 5584805 +MultipartBoundaryBegin 5584805 +MultipartBoundaryEnd 5584837 +MimeEntityBegin 5584837 +MimeEntityHeadersEnd 5584839 +MimeContentBegin 5584839 +MimeMessageBegin 5584839 +MimeMessageHeadersEnd 5584958 +MimeEntityBegin 5584839 +MimeEntityHeadersEnd 5584958 +MimeContentBegin 5584958 +MimeContentEnd 5586303 +MimeEntityEnd 5586305 +MimeMessageEnd 5586305 +MimeContentEnd 5586305 +MimeEntityEnd 5586305 +MultipartBoundaryBegin 5586305 +MultipartBoundaryEnd 5586337 +MimeEntityBegin 5586337 +MimeEntityHeadersEnd 5586339 +MimeContentBegin 5586339 +MimeMessageBegin 5586339 +MimeMessageHeadersEnd 5586443 +MimeEntityBegin 5586339 +MimeEntityHeadersEnd 5586443 +MimeContentBegin 5586443 +MimeContentEnd 5586747 +MimeEntityEnd 5586749 +MimeMessageEnd 5586749 +MimeContentEnd 5586749 +MimeEntityEnd 5586749 +MultipartBoundaryBegin 5586749 +MultipartBoundaryEnd 5586781 +MimeEntityBegin 5586781 +MimeEntityHeadersEnd 5586783 +MimeContentBegin 5586783 +MimeMessageBegin 5586783 +MimeMessageHeadersEnd 5586930 +MimeEntityBegin 5586783 +MimeEntityHeadersEnd 5586930 +MimeContentBegin 5586930 +MimeContentEnd 5587985 +MimeEntityEnd 5587987 +MimeMessageEnd 5587987 +MimeContentEnd 5587987 +MimeEntityEnd 5587987 +MultipartEndBoundaryBegin 5587987 +MultipartEndBoundaryEnd 5588019 +MultipartEpilogueBegin 5588019 +MultipartEpilogueEnd 5588021 +MimeEntityEnd 5588023 +MultipartEndBoundaryBegin 5588023 +MultipartEndBoundaryEnd 5588042 +MultipartEpilogueBegin 5588042 +MultipartEpilogueEnd 5588100 +MimeEntityEnd 5588102 +MimeMessageEnd 5588102 +MboxMarkerBegin 5588102 +MboxMarkerEnd 5588109 +MimeMessageBegin 5588111 +MimeMessageHeadersEnd 5588934 +MimeEntityBegin 5588111 +MimeEntityHeadersEnd 5588934 +MimeContentBegin 5588934 +MimeContentEnd 5590853 +MimeEntityEnd 5590855 +MimeMessageEnd 5590855 +MboxMarkerBegin 5590855 +MboxMarkerEnd 5590862 +MimeMessageBegin 5590864 +MimeMessageHeadersEnd 5591607 +MimeEntityBegin 5590864 +MimeEntityHeadersEnd 5591607 +MimeContentBegin 5591607 +MultipartPreambleBegin 5591607 +MultipartPreambleEnd 5591607 +MultipartBoundaryBegin 5591607 +MultipartBoundaryEnd 5591635 +MimeEntityBegin 5591635 +MimeEntityHeadersEnd 5591637 +MimeContentBegin 5591637 +MimeContentEnd 5591750 +MimeEntityEnd 5591752 +MultipartBoundaryBegin 5591752 +MultipartBoundaryEnd 5591780 +MimeEntityBegin 5591780 +MimeEntityHeadersEnd 5591872 +MimeContentBegin 5591872 +MimeContentEnd 5724575 +MimeEntityEnd 5724577 +MultipartBoundaryBegin 5724577 +MultipartBoundaryEnd 5724605 +MimeEntityBegin 5724605 +MimeEntityHeadersEnd 5724607 +MimeContentBegin 5724607 +MimeContentEnd 5724663 +MimeEntityEnd 5724665 +MultipartBoundaryBegin 5724665 +MultipartBoundaryEnd 5724693 +MimeEntityBegin 5724693 +MimeEntityHeadersEnd 5724843 +MimeContentBegin 5724843 +MimeContentEnd 5739817 +MimeEntityEnd 5739819 +MultipartBoundaryBegin 5739819 +MultipartBoundaryEnd 5739847 +MimeEntityBegin 5739847 +MimeEntityHeadersEnd 5739849 +MimeContentBegin 5739849 +MimeContentEnd 5739944 +MimeEntityEnd 5739946 +MultipartBoundaryBegin 5739946 +MultipartBoundaryEnd 5739974 +MimeEntityBegin 5739974 +MimeEntityHeadersEnd 5740124 +MimeContentBegin 5740124 +MimeContentEnd 5748266 +MimeEntityEnd 5748268 +MultipartBoundaryBegin 5748268 +MultipartBoundaryEnd 5748296 +MimeEntityBegin 5748296 +MimeEntityHeadersEnd 5748298 +MimeContentBegin 5748298 +MimeContentEnd 5748375 +MimeEntityEnd 5748377 +MultipartEndBoundaryBegin 5748377 +MultipartEndBoundaryEnd 5748405 +MultipartEpilogueBegin 5748405 +MultipartEpilogueEnd 5748407 +MimeEntityEnd 5748409 +MimeMessageEnd 5748409 +MboxMarkerBegin 5748409 +MboxMarkerEnd 5748416 +MimeMessageBegin 5748418 +MimeMessageHeadersEnd 5748956 +MimeEntityBegin 5748418 +MimeEntityHeadersEnd 5748956 +MimeContentBegin 5748956 +MimeContentEnd 5749545 +MimeEntityEnd 5749547 +MimeMessageEnd 5749547 +MboxMarkerBegin 5749547 +MboxMarkerEnd 5749554 +MimeMessageBegin 5749556 +MimeMessageHeadersEnd 5750765 +MimeEntityBegin 5749556 +MimeEntityHeadersEnd 5750765 +MimeContentBegin 5750765 +MultipartPreambleBegin 5750765 +MultipartPreambleEnd 5750923 +MultipartBoundaryBegin 5750923 +MultipartBoundaryEnd 5750964 +MimeEntityBegin 5750964 +MimeEntityHeadersEnd 5751010 +MimeContentBegin 5751010 +MimeContentEnd 5751766 +MimeEntityEnd 5751768 +MultipartBoundaryBegin 5751768 +MultipartBoundaryEnd 5751809 +MimeEntityBegin 5751809 +MimeEntityHeadersEnd 5751897 +MimeContentBegin 5751897 +MultipartPreambleBegin 5751897 +MultipartPreambleEnd 5751897 +MultipartBoundaryBegin 5751897 +MultipartBoundaryEnd 5751940 +MimeEntityBegin 5751940 +MimeEntityHeadersEnd 5752034 +MimeContentBegin 5752034 +MimeContentEnd 5752861 +MimeEntityEnd 5752863 +MultipartBoundaryBegin 5752863 +MultipartBoundaryEnd 5752906 +MimeEntityBegin 5752906 +MimeEntityHeadersEnd 5753003 +MimeContentBegin 5753003 +MimeContentEnd 5811629 +MimeEntityEnd 5811631 +MultipartBoundaryBegin 5811631 +MultipartBoundaryEnd 5811674 +MimeEntityBegin 5811674 +MimeEntityHeadersEnd 5811768 +MimeContentBegin 5811768 +MimeContentEnd 5811774 +MimeEntityEnd 5811776 +MultipartEndBoundaryBegin 5811776 +MultipartEndBoundaryEnd 5811819 +MultipartEpilogueBegin 5811819 +MultipartEpilogueEnd 5811821 +MimeEntityEnd 5811823 +MultipartEndBoundaryBegin 5811823 +MultipartEndBoundaryEnd 5811864 +MultipartEpilogueBegin 5811864 +MultipartEpilogueEnd 5811866 +MimeEntityEnd 5811868 +MimeMessageEnd 5811868 +MboxMarkerBegin 5811868 +MboxMarkerEnd 5811875 +MimeMessageBegin 5811877 +MimeMessageHeadersEnd 5812634 +MimeEntityBegin 5811877 +MimeEntityHeadersEnd 5812634 +MimeContentBegin 5812634 +MultipartPreambleBegin 5812634 +MultipartPreambleEnd 5812636 +MultipartBoundaryBegin 5812636 +MultipartBoundaryEnd 5812686 +MimeEntityBegin 5812686 +MimeEntityHeadersEnd 5812779 +MimeContentBegin 5812779 +MimeContentEnd 5812960 +MimeEntityEnd 5812962 +MultipartBoundaryBegin 5812962 +MultipartBoundaryEnd 5813012 +MimeEntityBegin 5813012 +MimeEntityHeadersEnd 5813074 +MimeContentBegin 5813074 +MimeContentEnd 5869078 +MimeEntityEnd 5869080 +MultipartEndBoundaryBegin 5869080 +MultipartEndBoundaryEnd 5869130 +MultipartEpilogueBegin 5869130 +MultipartEpilogueEnd 5869132 +MimeEntityEnd 5869134 +MimeMessageEnd 5869134 +MboxMarkerBegin 5869134 +MboxMarkerEnd 5869165 +MimeMessageBegin 5869167 +MimeMessageHeadersEnd 5870664 +MimeEntityBegin 5869167 +MimeEntityHeadersEnd 5870664 +MimeContentBegin 5870664 +MimeContentEnd 5872038 +MimeEntityEnd 5872040 +MimeMessageEnd 5872040 +MboxMarkerBegin 5872040 +MboxMarkerEnd 5872047 +MimeMessageBegin 5872049 +MimeMessageHeadersEnd 5872857 +MimeEntityBegin 5872049 +MimeEntityHeadersEnd 5872857 +MimeContentBegin 5872857 +MultipartPreambleBegin 5872857 +MultipartPreambleEnd 5872905 +MultipartBoundaryBegin 5872905 +MultipartBoundaryEnd 5872931 +MimeEntityBegin 5872931 +MimeEntityHeadersEnd 5873010 +MimeContentBegin 5873010 +MimeContentEnd 5873393 +MimeEntityEnd 5873395 +MultipartBoundaryBegin 5873395 +MultipartBoundaryEnd 5873421 +MimeEntityBegin 5873421 +MimeEntityHeadersEnd 5873515 +MimeContentBegin 5873515 +MimeMessageBegin 5873515 +MimeMessageHeadersEnd 5874597 +MimeEntityBegin 5873515 +MimeEntityHeadersEnd 5874597 +MimeContentBegin 5874597 +MimeContentEnd 5899455 +MimeEntityEnd 5899457 +MimeMessageEnd 5899457 +MimeContentEnd 5899457 +MimeEntityEnd 5899457 +MultipartEndBoundaryBegin 5899457 +MultipartEndBoundaryEnd 5899483 +MultipartEpilogueBegin 5899483 +MultipartEpilogueEnd 5899485 +MimeEntityEnd 5899487 +MimeMessageEnd 5899487 +MboxMarkerBegin 5899487 +MboxMarkerEnd 5899494 +MimeMessageBegin 5899496 +MimeMessageHeadersEnd 5900178 +MimeEntityBegin 5899496 +MimeEntityHeadersEnd 5900178 +MimeContentBegin 5900178 +MultipartPreambleBegin 5900178 +MultipartPreambleEnd 5900226 +MultipartBoundaryBegin 5900226 +MultipartBoundaryEnd 5900275 +MimeEntityBegin 5900275 +MimeEntityHeadersEnd 5900356 +MimeContentBegin 5900356 +MimeContentEnd 5900391 +MimeEntityEnd 5900393 +MultipartBoundaryBegin 5900393 +MultipartBoundaryEnd 5900442 +MimeEntityBegin 5900442 +MimeEntityHeadersEnd 5900504 +MimeContentBegin 5900504 +MimeContentEnd 5922958 +MimeEntityEnd 5922960 +MultipartEndBoundaryBegin 5922960 +MultipartEndBoundaryEnd 5923009 +MultipartEpilogueBegin 5923009 +MultipartEpilogueEnd 5923009 +MimeEntityEnd 5923011 +MimeMessageEnd 5923011 +MboxMarkerBegin 5923011 +MboxMarkerEnd 5923042 +MimeMessageBegin 5923044 +MimeMessageHeadersEnd 5923581 +MimeEntityBegin 5923044 +MimeEntityHeadersEnd 5923581 +MimeContentBegin 5923581 +MultipartPreambleBegin 5923581 +MultipartPreambleEnd 5923581 +MultipartBoundaryBegin 5923581 +MultipartBoundaryEnd 5923590 +MimeEntityBegin 5923590 +MimeEntityHeadersEnd 5923636 +MimeContentBegin 5923636 +MimeContentEnd 5924829 +MimeEntityEnd 5924831 +MultipartBoundaryBegin 5924831 +MultipartBoundaryEnd 5924840 +MimeEntityBegin 5924840 +MimeEntityHeadersEnd 5924970 +MimeContentBegin 5924970 +MimeContentEnd 5925118 +MimeEntityEnd 5925120 +MultipartBoundaryBegin 5925120 +MultipartBoundaryEnd 5925129 +MimeEntityBegin 5925129 +MimeEntityHeadersEnd 5925249 +MimeContentBegin 5925249 +MimeContentEnd 5925445 +MimeEntityEnd 5925447 +MultipartEndBoundaryBegin 5925447 +MultipartEndBoundaryEnd 5925456 +MultipartEpilogueBegin 5925456 +MultipartEpilogueEnd 5925456 +MimeEntityEnd 5925458 +MimeMessageEnd 5925458 +MboxMarkerBegin 5925458 +MboxMarkerEnd 5925465 +MimeMessageBegin 5925467 +MimeMessageHeadersEnd 5926279 +MimeEntityBegin 5925467 +MimeEntityHeadersEnd 5926279 +MimeContentBegin 5926279 +MimeContentEnd 6186575 +MimeEntityEnd 6186577 +MimeMessageEnd 6186577 +MboxMarkerBegin 6186577 +MboxMarkerEnd 6186584 +MimeMessageBegin 6186586 +MimeMessageHeadersEnd 6187457 +MimeEntityBegin 6186586 +MimeEntityHeadersEnd 6187457 +MimeContentBegin 6187457 +MultipartPreambleBegin 6187457 +MultipartPreambleEnd 6187459 +MultipartBoundaryBegin 6187459 +MultipartBoundaryEnd 6187474 +MimeEntityBegin 6187474 +MimeEntityHeadersEnd 6187554 +MimeContentBegin 6187554 +MimeContentEnd 6187752 +MimeEntityEnd 6187754 +MultipartBoundaryBegin 6187754 +MultipartBoundaryEnd 6187769 +MimeEntityBegin 6187769 +MimeEntityHeadersEnd 6187877 +MimeContentBegin 6187877 +MimeContentEnd 6287399 +MimeEntityEnd 6287401 +MultipartEndBoundaryBegin 6287401 +MultipartEndBoundaryEnd 6287416 +MultipartEpilogueBegin 6287416 +MultipartEpilogueEnd 6287418 +MimeEntityEnd 6287420 +MimeMessageEnd 6287420 +MboxMarkerBegin 6287420 +MboxMarkerEnd 6287427 +MimeMessageBegin 6287429 +MimeMessageHeadersEnd 6288325 +MimeEntityBegin 6287429 +MimeEntityHeadersEnd 6288325 +MimeContentBegin 6288325 +MultipartPreambleBegin 6288325 +MultipartPreambleEnd 6288325 +MultipartBoundaryBegin 6288325 +MultipartBoundaryEnd 6288335 +MimeEntityBegin 6288335 +MimeEntityHeadersEnd 6288383 +MimeContentBegin 6288383 +MimeContentEnd 6289347 +MimeEntityEnd 6289349 +MultipartBoundaryBegin 6289349 +MultipartBoundaryEnd 6289359 +MimeEntityBegin 6289359 +MimeEntityHeadersEnd 6289424 +MimeContentBegin 6289424 +MultipartPreambleBegin 6289424 +MultipartPreambleEnd 6289426 +MultipartBoundaryBegin 6289426 +MultipartBoundaryEnd 6289449 +MimeEntityBegin 6289449 +MimeEntityHeadersEnd 6289818 +MimeContentBegin 6289818 +MultipartPreambleBegin 6289818 +MultipartPreambleEnd 6289818 +MultipartBoundaryBegin 6289818 +MultipartBoundaryEnd 6289841 +MimeEntityBegin 6289841 +MimeEntityHeadersEnd 6289946 +MimeContentBegin 6289946 +MultipartPreambleBegin 6289946 +MultipartPreambleEnd 6289946 +MultipartBoundaryBegin 6289946 +MultipartBoundaryEnd 6289969 +MimeEntityBegin 6289969 +MimeEntityHeadersEnd 6290096 +MimeContentBegin 6290096 +MimeContentEnd 6290470 +MimeEntityEnd 6290472 +MultipartBoundaryBegin 6290472 +MultipartBoundaryEnd 6290495 +MimeEntityBegin 6290495 +MimeEntityHeadersEnd 6290621 +MimeContentBegin 6290621 +MimeContentEnd 6291023 +MimeEntityEnd 6291025 +MultipartBoundaryBegin 6291025 +MultipartBoundaryEnd 6291048 +MimeEntityBegin 6291048 +MimeEntityHeadersEnd 6291177 +MimeContentBegin 6291177 +MimeContentEnd 6291903 +MimeEntityEnd 6291905 +MultipartEndBoundaryBegin 6291905 +MultipartEndBoundaryEnd 6291928 +MultipartEpilogueBegin 6291928 +MultipartEpilogueEnd 6291930 +MimeEntityEnd 6291932 +MultipartBoundaryBegin 6291932 +MultipartBoundaryEnd 6291955 +MimeEntityBegin 6291955 +MimeEntityHeadersEnd 6292057 +MimeContentBegin 6292057 +MultipartPreambleBegin 6292057 +MultipartPreambleEnd 6292057 +MultipartBoundaryBegin 6292057 +MultipartBoundaryEnd 6292080 +MimeEntityBegin 6292080 +MimeEntityHeadersEnd 6292216 +MimeContentBegin 6292216 +MimeContentEnd 6309101 +MimeEntityEnd 6309103 +MultipartBoundaryBegin 6309103 +MultipartBoundaryEnd 6309126 +MimeEntityBegin 6309126 +MimeEntityHeadersEnd 6309261 +MimeContentBegin 6309261 +MimeContentEnd 6323910 +MimeEntityEnd 6323912 +MultipartBoundaryBegin 6323912 +MultipartBoundaryEnd 6323935 +MimeEntityBegin 6323935 +MimeEntityHeadersEnd 6324039 +MimeContentBegin 6324039 +MultipartPreambleBegin 6324039 +MultipartPreambleEnd 6324039 +MultipartBoundaryBegin 6324039 +MultipartBoundaryEnd 6324062 +MimeEntityBegin 6324062 +MimeEntityHeadersEnd 6324208 +MimeContentBegin 6324208 +MimeContentEnd 6330524 +MimeEntityEnd 6330526 +MultipartBoundaryBegin 6330526 +MultipartBoundaryEnd 6330549 +MimeEntityBegin 6330549 +MimeEntityHeadersEnd 6330680 +MimeContentBegin 6330680 +MimeContentEnd 6336095 +MimeEntityEnd 6336097 +MultipartBoundaryBegin 6336097 +MultipartBoundaryEnd 6336120 +MimeEntityBegin 6336120 +MimeEntityHeadersEnd 6336261 +MimeContentBegin 6336261 +MimeContentEnd 6343756 +MimeEntityEnd 6343758 +MultipartBoundaryBegin 6343758 +MultipartBoundaryEnd 6343781 +MimeEntityBegin 6343781 +MimeEntityHeadersEnd 6343909 +MimeContentBegin 6343909 +MimeContentEnd 6350569 +MimeEntityEnd 6350571 +MultipartBoundaryBegin 6350571 +MultipartBoundaryEnd 6350594 +MimeEntityBegin 6350594 +MimeEntityHeadersEnd 6350735 +MimeContentBegin 6350735 +MimeContentEnd 6368395 +MimeEntityEnd 6368397 +MultipartEndBoundaryBegin 6368397 +MultipartEndBoundaryEnd 6368420 +MultipartEpilogueBegin 6368420 +MultipartEpilogueEnd 6368422 +MimeEntityEnd 6368424 +MultipartBoundaryBegin 6368424 +MultipartBoundaryEnd 6368447 +MimeEntityBegin 6368447 +MimeEntityHeadersEnd 6368545 +MimeContentBegin 6368545 +MultipartPreambleBegin 6368545 +MultipartPreambleEnd 6368545 +MultipartBoundaryBegin 6368545 +MultipartBoundaryEnd 6368568 +MimeEntityBegin 6368568 +MimeEntityHeadersEnd 6368706 +MimeContentBegin 6368706 +MimeContentEnd 6369222 +MimeEntityEnd 6369224 +MultipartEndBoundaryBegin 6369224 +MultipartEndBoundaryEnd 6369247 +MultipartEpilogueBegin 6369247 +MultipartEpilogueEnd 6369249 +MimeEntityEnd 6369251 +MultipartEndBoundaryBegin 6369251 +MultipartEndBoundaryEnd 6369274 +MultipartEpilogueBegin 6369274 +MultipartEpilogueEnd 6369276 +MimeEntityEnd 6369278 +MultipartBoundaryBegin 6369278 +MultipartBoundaryEnd 6369301 +MimeEntityBegin 6369301 +MimeEntityHeadersEnd 6369415 +MimeContentBegin 6369415 +MultipartPreambleBegin 6369415 +MultipartPreambleEnd 6369415 +MultipartBoundaryBegin 6369415 +MultipartBoundaryEnd 6369438 +MimeEntityBegin 6369438 +MimeEntityHeadersEnd 6369580 +MimeContentBegin 6369580 +MimeContentEnd 6370758 +MimeEntityEnd 6370760 +MultipartBoundaryBegin 6370760 +MultipartBoundaryEnd 6370783 +MimeEntityBegin 6370783 +MimeEntityHeadersEnd 6370913 +MimeContentBegin 6370913 +MimeContentEnd 6372168 +MimeEntityEnd 6372170 +MultipartBoundaryBegin 6372170 +MultipartBoundaryEnd 6372193 +MimeEntityBegin 6372193 +MimeEntityHeadersEnd 6372337 +MimeContentBegin 6372337 +MimeContentEnd 6373036 +MimeEntityEnd 6373038 +MultipartEndBoundaryBegin 6373038 +MultipartEndBoundaryEnd 6373061 +MultipartEpilogueBegin 6373061 +MultipartEpilogueEnd 6373063 +MimeEntityEnd 6373065 +MultipartEndBoundaryBegin 6373065 +MultipartEndBoundaryEnd 6373088 +MultipartEpilogueBegin 6373088 +MultipartEpilogueEnd 6373090 +MimeEntityEnd 6373092 +MultipartEndBoundaryBegin 6373092 +MultipartEndBoundaryEnd 6373115 +MultipartEpilogueBegin 6373115 +MultipartEpilogueEnd 6373117 +MimeEntityEnd 6373119 +MultipartEndBoundaryBegin 6373119 +MultipartEndBoundaryEnd 6373129 +MultipartEpilogueBegin 6373129 +MultipartEpilogueEnd 6373131 +MimeEntityEnd 6373133 +MimeMessageEnd 6373133 +MboxMarkerBegin 6373133 +MboxMarkerEnd 6373140 +MimeMessageBegin 6373142 +MimeMessageHeadersEnd 6373961 +MimeEntityBegin 6373142 +MimeEntityHeadersEnd 6373961 +MimeContentBegin 6373961 +MimeContentEnd 6383386 +MimeEntityEnd 6383388 +MimeMessageEnd 6383388 +MboxMarkerBegin 6383388 +MboxMarkerEnd 6383395 +MimeMessageBegin 6383397 +MimeMessageHeadersEnd 6384141 +MimeEntityBegin 6383397 +MimeEntityHeadersEnd 6384141 +MimeContentBegin 6384141 +MultipartPreambleBegin 6384141 +MultipartPreambleEnd 6384299 +MultipartBoundaryBegin 6384299 +MultipartBoundaryEnd 6384340 +MimeEntityBegin 6384340 +MimeEntityHeadersEnd 6384386 +MimeContentBegin 6384386 +MimeContentEnd 6385165 +MimeEntityEnd 6385167 +MultipartBoundaryBegin 6385167 +MultipartBoundaryEnd 6385208 +MimeEntityBegin 6385208 +MimeEntityHeadersEnd 6385296 +MimeContentBegin 6385296 +MultipartPreambleBegin 6385296 +MultipartPreambleEnd 6385296 +MultipartBoundaryBegin 6385296 +MultipartBoundaryEnd 6385339 +MimeEntityBegin 6385339 +MimeEntityHeadersEnd 6385433 +MimeContentBegin 6385433 +MimeContentEnd 6385767 +MimeEntityEnd 6385769 +MultipartBoundaryBegin 6385769 +MultipartBoundaryEnd 6385812 +MimeEntityBegin 6385812 +MimeEntityHeadersEnd 6385910 +MimeContentBegin 6385910 +MimeContentEnd 6408254 +MimeEntityEnd 6408256 +MultipartBoundaryBegin 6408256 +MultipartBoundaryEnd 6408299 +MimeEntityBegin 6408299 +MimeEntityHeadersEnd 6408393 +MimeContentBegin 6408393 +MimeContentEnd 6408564 +MimeEntityEnd 6408566 +MultipartBoundaryBegin 6408566 +MultipartBoundaryEnd 6408609 +MimeEntityBegin 6408609 +MimeEntityHeadersEnd 6408710 +MimeContentBegin 6408710 +MimeContentEnd 6456608 +MimeEntityEnd 6456610 +MultipartBoundaryBegin 6456610 +MultipartBoundaryEnd 6456653 +MimeEntityBegin 6456653 +MimeEntityHeadersEnd 6456747 +MimeContentBegin 6456747 +MimeContentEnd 6456819 +MimeEntityEnd 6456821 +MultipartBoundaryBegin 6456821 +MultipartBoundaryEnd 6456864 +MimeEntityBegin 6456864 +MimeEntityHeadersEnd 6456958 +MimeContentBegin 6456958 +MimeContentEnd 6477470 +MimeEntityEnd 6477472 +MultipartBoundaryBegin 6477472 +MultipartBoundaryEnd 6477515 +MimeEntityBegin 6477515 +MimeEntityHeadersEnd 6477609 +MimeContentBegin 6477609 +MimeContentEnd 6477721 +MimeEntityEnd 6477723 +MultipartEndBoundaryBegin 6477723 +MultipartEndBoundaryEnd 6477766 +MultipartEpilogueBegin 6477766 +MultipartEpilogueEnd 6477768 +MimeEntityEnd 6477770 +MultipartEndBoundaryBegin 6477770 +MultipartEndBoundaryEnd 6477811 +MultipartEpilogueBegin 6477811 +MultipartEpilogueEnd 6477811 +MimeEntityEnd 6477813 +MimeMessageEnd 6477813 +MboxMarkerBegin 6477813 +MboxMarkerEnd 6477820 +MimeMessageBegin 6477822 +MimeMessageHeadersEnd 6478593 +MimeEntityBegin 6477822 +MimeEntityHeadersEnd 6478593 +MimeContentBegin 6478593 +MultipartPreambleBegin 6478593 +MultipartPreambleEnd 6478792 +MultipartBoundaryBegin 6478792 +MultipartBoundaryEnd 6478838 +MimeEntityBegin 6478838 +MimeEntityHeadersEnd 6478914 +MimeContentBegin 6478914 +MimeContentEnd 6479347 +MimeEntityEnd 6479349 +MultipartBoundaryBegin 6479349 +MultipartBoundaryEnd 6479395 +MimeEntityBegin 6479395 +MimeEntityHeadersEnd 6479459 +MimeContentBegin 6479459 +MimeContentEnd 6513483 +MimeEntityEnd 6513485 +MultipartBoundaryBegin 6513485 +MultipartBoundaryEnd 6513531 +MimeEntityBegin 6513531 +MimeEntityHeadersEnd 6513607 +MimeContentBegin 6513607 +MimeContentEnd 6513708 +MimeEntityEnd 6513710 +MultipartEndBoundaryBegin 6513710 +MultipartEndBoundaryEnd 6513756 +MultipartEpilogueBegin 6513756 +MultipartEpilogueEnd 6513758 +MimeEntityEnd 6513760 +MimeMessageEnd 6513760 +MboxMarkerBegin 6513760 +MboxMarkerEnd 6513801 +MimeMessageBegin 6513803 +MimeMessageHeadersEnd 6513957 +MimeEntityBegin 6513803 +MimeEntityHeadersEnd 6513957 +MimeContentBegin 6513957 +MimeContentEnd 6557679 +MimeEntityEnd 6557681 +MimeMessageEnd 6557681 +MboxMarkerBegin 6557681 +MboxMarkerEnd 6557712 +MimeMessageBegin 6557714 +MimeMessageHeadersEnd 6558312 +MimeEntityBegin 6557714 +MimeEntityHeadersEnd 6558312 +MimeContentBegin 6558312 +MultipartPreambleBegin 6558312 +MultipartPreambleEnd 6558360 +MultipartBoundaryBegin 6558360 +MultipartBoundaryEnd 6558400 +MimeEntityBegin 6558400 +MimeEntityHeadersEnd 6558521 +MimeContentBegin 6558521 +MultipartPreambleBegin 6558521 +MultipartPreambleEnd 6558523 +MultipartBoundaryBegin 6558523 +MultipartBoundaryEnd 6558563 +MimeEntityBegin 6558563 +MimeEntityHeadersEnd 6558644 +MimeContentBegin 6558644 +MimeContentEnd 6559954 +MimeEntityEnd 6559956 +MultipartBoundaryBegin 6559956 +MultipartBoundaryEnd 6559996 +MimeEntityBegin 6559996 +MimeEntityHeadersEnd 6560078 +MimeContentBegin 6560078 +MimeContentEnd 6562574 +MimeEntityEnd 6562576 +MultipartEndBoundaryBegin 6562576 +MultipartEndBoundaryEnd 6562616 +MultipartEpilogueBegin 6562616 +MultipartEpilogueEnd 6562620 +MimeEntityEnd 6562622 +MultipartBoundaryBegin 6562622 +MultipartBoundaryEnd 6562662 +MimeEntityBegin 6562662 +MimeEntityHeadersEnd 6562872 +MimeContentBegin 6562872 +MimeContentEnd 6583892 +MimeEntityEnd 6583894 +MultipartEndBoundaryBegin 6583894 +MultipartEndBoundaryEnd 6583934 +MultipartEpilogueBegin 6583934 +MultipartEpilogueEnd 6583936 +MimeEntityEnd 6583938 +MimeMessageEnd 6583938 +MboxMarkerBegin 6583938 +MboxMarkerEnd 6583969 +MimeMessageBegin 6583971 +MimeMessageHeadersEnd 6584388 +MimeEntityBegin 6583971 +MimeEntityHeadersEnd 6584388 +MimeContentBegin 6584388 +MultipartPreambleBegin 6584388 +MultipartPreambleEnd 6584436 +MultipartBoundaryBegin 6584436 +MultipartBoundaryEnd 6584457 +MimeEntityBegin 6584457 +MimeEntityHeadersEnd 6584459 +MimeContentBegin 6584459 +MimeContentEnd 6584523 +MimeEntityEnd 6584525 +MultipartBoundaryBegin 6584525 +MultipartBoundaryEnd 6584546 +MimeEntityBegin 6584546 +MimeEntityHeadersEnd 6584622 +MimeContentBegin 6584622 +MultipartPreambleBegin 6584622 +MultipartPreambleEnd 6584622 +MultipartBoundaryBegin 6584622 +MultipartBoundaryEnd 6584650 +MimeEntityBegin 6584650 +MimeEntityHeadersEnd 6584760 +MimeContentBegin 6584760 +MimeContentEnd 6584843 +MimeEntityEnd 6584845 +MultipartBoundaryBegin 6584845 +MultipartBoundaryEnd 6584873 +MimeEntityBegin 6584873 +MimeEntityHeadersEnd 6584986 +MimeContentBegin 6584986 +MimeContentEnd 6585148 +MimeEntityEnd 6585150 +MultipartBoundaryBegin 6585150 +MultipartBoundaryEnd 6585178 +MimeEntityBegin 6585178 +MimeEntityHeadersEnd 6585291 +MimeContentBegin 6585291 +MimeContentEnd 6585464 +MimeEntityEnd 6585466 +MultipartBoundaryBegin 6585466 +MultipartBoundaryEnd 6585494 +MimeEntityBegin 6585494 +MimeEntityHeadersEnd 6585603 +MimeContentBegin 6585603 +MimeContentEnd 6585767 +MimeEntityEnd 6585769 +MultipartBoundaryBegin 6585769 +MultipartBoundaryEnd 6585797 +MimeEntityBegin 6585797 +MimeEntityHeadersEnd 6585925 +MimeContentBegin 6585925 +MimeContentEnd 6586358 +MimeEntityEnd 6586360 +MultipartEndBoundaryBegin 6586360 +MultipartEndBoundaryEnd 6586388 +MultipartEpilogueBegin 6586388 +MultipartEpilogueEnd 6586388 +MimeEntityEnd 6586390 +MultipartBoundaryBegin 6586390 +MultipartBoundaryEnd 6586411 +MimeEntityBegin 6586411 +MimeEntityHeadersEnd 6586413 +MimeContentBegin 6586413 +MimeContentEnd 6586582 +MimeEntityEnd 6586584 +MultipartBoundaryBegin 6586584 +MultipartBoundaryEnd 6586605 +MimeEntityBegin 6586605 +MimeEntityHeadersEnd 6586657 +MimeContentBegin 6586657 +MultipartPreambleBegin 6586657 +MultipartPreambleEnd 6586657 +MultipartBoundaryBegin 6586657 +MultipartBoundaryEnd 6586663 +MimeEntityBegin 6586663 +MimeEntityHeadersEnd 6586691 +MimeContentBegin 6586691 +MimeContentEnd 6586745 +MimeEntityEnd 6586747 +MultipartBoundaryBegin 6586747 +MultipartBoundaryEnd 6586753 +MimeEntityBegin 6586753 +MimeEntityHeadersEnd 6586805 +MimeContentBegin 6586805 +MultipartPreambleBegin 6586805 +MultipartPreambleEnd 6586805 +MultipartBoundaryBegin 6586805 +MultipartBoundaryEnd 6586811 +MimeEntityBegin 6586811 +MimeEntityHeadersEnd 6586839 +MimeContentBegin 6586839 +MimeContentEnd 6586893 +MimeEntityEnd 6586895 +MultipartBoundaryBegin 6586895 +MultipartBoundaryEnd 6586901 +MimeEntityBegin 6586901 +MimeEntityHeadersEnd 6586928 +MimeContentBegin 6586928 +MimeContentEnd 6586979 +MimeEntityEnd 6586981 +MultipartBoundaryBegin 6586981 +MultipartBoundaryEnd 6586987 +MimeEntityBegin 6586987 +MimeEntityHeadersEnd 6587016 +MimeContentBegin 6587016 +MimeContentEnd 6587071 +MimeEntityEnd 6587073 +MultipartEndBoundaryBegin 6587073 +MultipartEndBoundaryEnd 6587079 +MultipartEpilogueBegin 6587079 +MultipartEpilogueEnd 6587081 +MimeEntityEnd 6587083 +MultipartBoundaryBegin 6587083 +MultipartBoundaryEnd 6587089 +MimeEntityBegin 6587089 +MimeEntityHeadersEnd 6587184 +MimeContentBegin 6587184 +MimeContentEnd 6587200 +MimeEntityEnd 6587202 +MultipartEndBoundaryBegin 6587202 +MultipartEndBoundaryEnd 6587208 +MultipartEpilogueBegin 6587208 +MultipartEpilogueEnd 6587208 +MimeEntityEnd 6587210 +MultipartBoundaryBegin 6587210 +MultipartBoundaryEnd 6587231 +MimeEntityBegin 6587231 +MimeEntityHeadersEnd 6587233 +MimeContentBegin 6587233 +MimeContentEnd 6587243 +MimeEntityEnd 6587245 +MultipartEndBoundaryBegin 6587245 +MultipartEndBoundaryEnd 6587266 +MultipartEpilogueBegin 6587266 +MultipartEpilogueEnd 6587266 +MimeEntityEnd 6587268 +MimeMessageEnd 6587268 +MboxMarkerBegin 6587268 +MboxMarkerEnd 6587299 +MimeMessageBegin 6587301 +MimeMessageHeadersEnd 6587716 +MimeEntityBegin 6587301 +MimeEntityHeadersEnd 6587716 +MimeContentBegin 6587716 +MultipartPreambleBegin 6587716 +MultipartPreambleEnd 6587764 +MultipartBoundaryBegin 6587764 +MultipartBoundaryEnd 6587785 +MimeEntityBegin 6587785 +MimeEntityHeadersEnd 6587787 +MimeContentBegin 6587787 +MimeContentEnd 6587855 +MimeEntityEnd 6587857 +MultipartBoundaryBegin 6587857 +MultipartBoundaryEnd 6587878 +MimeEntityBegin 6587878 +MimeEntityHeadersEnd 6587954 +MimeContentBegin 6587954 +MultipartPreambleBegin 6587954 +MultipartPreambleEnd 6587954 +MultipartBoundaryBegin 6587954 +MultipartBoundaryEnd 6587982 +MimeEntityBegin 6587982 +MimeEntityHeadersEnd 6588142 +MimeContentBegin 6588142 +MimeContentEnd 6645008 +MimeEntityEnd 6645010 +MultipartBoundaryBegin 6645010 +MultipartBoundaryEnd 6645038 +MimeEntityBegin 6645038 +MimeEntityHeadersEnd 6645197 +MimeContentBegin 6645197 +MimeContentEnd 6754228 +MimeEntityEnd 6754230 +MultipartBoundaryBegin 6754230 +MultipartBoundaryEnd 6754258 +MimeEntityBegin 6754258 +MimeEntityHeadersEnd 6754408 +MimeContentBegin 6754408 +MimeContentEnd 6955876 +MimeEntityEnd 6955878 +MultipartEndBoundaryBegin 6955878 +MultipartEndBoundaryEnd 6955906 +MultipartEpilogueBegin 6955906 +MultipartEpilogueEnd 6955908 +MimeEntityEnd 6955910 +MultipartEndBoundaryBegin 6955910 +MultipartEndBoundaryEnd 6955931 +MultipartEpilogueBegin 6955931 +MultipartEpilogueEnd 6955939 +MimeEntityEnd 6955941 +MimeMessageEnd 6955941 +MboxMarkerBegin 6955941 +MboxMarkerEnd 6955948 +MimeMessageBegin 6955950 +MimeMessageHeadersEnd 6956567 +MimeEntityBegin 6955950 +MimeEntityHeadersEnd 6956567 +MimeContentBegin 6956567 +MultipartPreambleBegin 6956567 +MultipartPreambleEnd 6956787 +MultipartBoundaryBegin 6956787 +MultipartBoundaryEnd 6956828 +MimeEntityBegin 6956828 +MimeEntityHeadersEnd 6956943 +MimeContentBegin 6956943 +MimeContentEnd 6956943 +MimeEntityEnd 6956945 +MultipartBoundaryBegin 6956945 +MultipartBoundaryEnd 6956986 +MimeEntityBegin 6956986 +MimeEntityHeadersEnd 6957087 +MimeContentBegin 6957087 +MimeMessageBegin 6957087 +MimeMessageHeadersEnd 6957640 +MimeEntityBegin 6957087 +MimeEntityHeadersEnd 6957640 +MimeContentBegin 6957640 +MimeContentEnd 6958002 +MimeEntityEnd 6958004 +MimeMessageEnd 6958004 +MimeContentEnd 6958004 +MimeEntityEnd 6958004 +MultipartEndBoundaryBegin 6958004 +MultipartEndBoundaryEnd 6958045 +MultipartEpilogueBegin 6958045 +MultipartEpilogueEnd 6958045 +MimeEntityEnd 6958047 +MimeMessageEnd 6958047 +MboxMarkerBegin 6958047 +MboxMarkerEnd 6958054 +MimeMessageBegin 6958056 +MimeMessageHeadersEnd 6958361 +MimeEntityBegin 6958056 +MimeEntityHeadersEnd 6958361 +MimeContentBegin 6958361 +MultipartPreambleBegin 6958361 +MultipartPreambleEnd 6958361 +MultipartBoundaryBegin 6958361 +MultipartBoundaryEnd 6958401 +MimeEntityBegin 6958401 +MimeEntityHeadersEnd 6958654 +MimeContentBegin 6958654 +MimeContentEnd 6959403 +MimeEntityEnd 6959405 +MultipartBoundaryBegin 6959405 +MultipartBoundaryEnd 6959445 +MimeEntityBegin 6959445 +MimeEntityHeadersEnd 6959773 +MimeContentBegin 6959773 +MimeContentEnd 6970643 +MimeEntityEnd 6970645 +MultipartEndBoundaryBegin 6970645 +MultipartEndBoundaryEnd 6970685 +MultipartEpilogueBegin 6970685 +MultipartEpilogueEnd 6970685 +MimeEntityEnd 6970687 +MimeMessageEnd 6970687 +MboxMarkerBegin 6970687 +MboxMarkerEnd 6970694 +MimeMessageBegin 6970696 +MimeMessageHeadersEnd 6971001 +MimeEntityBegin 6970696 +MimeEntityHeadersEnd 6971001 +MimeContentBegin 6971001 +MultipartPreambleBegin 6971001 +MultipartPreambleEnd 6971001 +MultipartBoundaryBegin 6971001 +MultipartBoundaryEnd 6971041 +MimeEntityBegin 6971041 +MimeEntityHeadersEnd 6971294 +MimeContentBegin 6971294 +MimeContentEnd 6972042 +MimeEntityEnd 6972044 +MultipartBoundaryBegin 6972044 +MultipartBoundaryEnd 6972084 +MimeEntityBegin 6972084 +MimeEntityHeadersEnd 6972381 +MimeContentBegin 6972381 +MimeContentEnd 6983251 +MimeEntityEnd 6983253 +MultipartEndBoundaryBegin 6983253 +MultipartEndBoundaryEnd 6983293 +MultipartEpilogueBegin 6983293 +MultipartEpilogueEnd 6983293 +MimeEntityEnd 6983295 +MimeMessageEnd 6983295 +MboxMarkerBegin 6983295 +MboxMarkerEnd 6983326 +MimeMessageBegin 6983328 +MimeMessageHeadersEnd 6984857 +MimeEntityBegin 6983328 +MimeEntityHeadersEnd 6984857 +MimeContentBegin 6984857 +MultipartPreambleBegin 6984857 +MultipartPreambleEnd 6984859 +MultipartBoundaryBegin 6984859 +MultipartBoundaryEnd 6984904 +MimeEntityBegin 6984904 +MimeEntityHeadersEnd 6984998 +MimeContentBegin 6984998 +MimeContentEnd 6990308 +MimeEntityEnd 6990310 +MultipartBoundaryBegin 6990310 +MultipartBoundaryEnd 6990355 +MimeEntityBegin 6990355 +MimeEntityHeadersEnd 6990560 +MimeContentBegin 6990560 +MimeContentEnd 6991502 +MimeEntityEnd 6991504 +MultipartEndBoundaryBegin 6991504 +MultipartEndBoundaryEnd 6991549 +MultipartEpilogueBegin 6991549 +MultipartEpilogueEnd 6991551 +MimeEntityEnd 6991553 +MimeMessageEnd 6991553 +MboxMarkerBegin 6991553 +MboxMarkerEnd 6991584 +MimeMessageBegin 6991586 +MimeMessageHeadersEnd 6992045 +MimeEntityBegin 6991586 +MimeEntityHeadersEnd 6992045 +MimeContentBegin 6992045 +MultipartPreambleBegin 6992045 +MultipartPreambleEnd 6992045 +MultipartBoundaryBegin 6992045 +MultipartBoundaryEnd 6992085 +MimeEntityBegin 6992085 +MimeEntityHeadersEnd 6992113 +MimeContentBegin 6992113 +MimeContentEnd 6992366 +MimeEntityEnd 6992368 +MultipartBoundaryBegin 6992368 +MultipartBoundaryEnd 6992408 +MimeEntityBegin 6992408 +MimeEntityHeadersEnd 6992497 +MimeContentBegin 6992497 +MultipartPreambleBegin 6992497 +MultipartPreambleEnd 6992497 +MultipartBoundaryBegin 6992497 +MultipartBoundaryEnd 6992537 +MimeEntityBegin 6992537 +MimeEntityHeadersEnd 6992736 +MimeContentBegin 6992736 +MimeContentEnd 7000063 +MimeEntityEnd 7000065 +MultipartBoundaryBegin 7000065 +MultipartBoundaryEnd 7000105 +MimeEntityBegin 7000105 +MimeEntityHeadersEnd 7000286 +MimeContentBegin 7000286 +MimeContentEnd 7008376 +MimeEntityEnd 7008378 +MultipartBoundaryBegin 7008378 +MultipartBoundaryEnd 7008418 +MimeEntityBegin 7008418 +MimeEntityHeadersEnd 7008582 +MimeContentBegin 7008582 +MimeContentEnd 7016138 +MimeEntityEnd 7016140 +MultipartBoundaryBegin 7016140 +MultipartBoundaryEnd 7016180 +MimeEntityBegin 7016180 +MimeEntityHeadersEnd 7016343 +MimeContentBegin 7016343 +MimeContentEnd 7019721 +MimeEntityEnd 7019723 +MultipartBoundaryBegin 7019723 +MultipartBoundaryEnd 7019763 +MimeEntityBegin 7019763 +MimeEntityHeadersEnd 7019927 +MimeContentBegin 7019927 +MimeContentEnd 7028493 +MimeEntityEnd 7028495 +MultipartBoundaryBegin 7028495 +MultipartBoundaryEnd 7028535 +MimeEntityBegin 7028535 +MimeEntityHeadersEnd 7028696 +MimeContentBegin 7028696 +MimeContentEnd 7134494 +MimeEntityEnd 7134496 +MultipartBoundaryBegin 7134496 +MultipartBoundaryEnd 7134536 +MimeEntityBegin 7134536 +MimeEntityHeadersEnd 7134700 +MimeContentBegin 7134700 +MimeContentEnd 7173586 +MimeEntityEnd 7173588 +MultipartBoundaryBegin 7173588 +MultipartBoundaryEnd 7173628 +MimeEntityBegin 7173628 +MimeEntityHeadersEnd 7173797 +MimeContentBegin 7173797 +MimeContentEnd 7209595 +MimeEntityEnd 7209597 +MultipartEndBoundaryBegin 7209597 +MultipartEndBoundaryEnd 7209637 +MultipartEpilogueBegin 7209637 +MultipartEpilogueEnd 7209637 +MimeEntityEnd 7209639 +MultipartEndBoundaryBegin 7209639 +MultipartEndBoundaryEnd 7209679 +MultipartEpilogueBegin 7209679 +MultipartEpilogueEnd 7209679 +MimeEntityEnd 7209681 +MimeMessageEnd 7209681 +MboxMarkerBegin 7209681 +MboxMarkerEnd 7209688 +MimeMessageBegin 7209690 +MimeMessageHeadersEnd 7209994 +MimeEntityBegin 7209690 +MimeEntityHeadersEnd 7209994 +MimeContentBegin 7209994 +MultipartPreambleBegin 7209994 +MultipartPreambleEnd 7209994 +MultipartBoundaryBegin 7209994 +MultipartBoundaryEnd 7210034 +MimeEntityBegin 7210034 +MimeEntityHeadersEnd 7210195 +MimeContentBegin 7210195 +MimeContentEnd 7210773 +MimeEntityEnd 7210775 +MultipartBoundaryBegin 7210775 +MultipartBoundaryEnd 7210815 +MimeEntityBegin 7210815 +MimeEntityHeadersEnd 7210932 +MimeContentBegin 7210932 +MimeContentEnd 7221802 +MimeEntityEnd 7221804 +MultipartEndBoundaryBegin 7221804 +MultipartEndBoundaryEnd 7221844 +MultipartEpilogueBegin 7221844 +MultipartEpilogueEnd 7221844 +MimeEntityEnd 7221846 +MimeMessageEnd 7221846 +MboxMarkerBegin 7221846 +MboxMarkerEnd 7221853 +MimeMessageBegin 7221855 +MimeMessageHeadersEnd 7222159 +MimeEntityBegin 7221855 +MimeEntityHeadersEnd 7222159 +MimeContentBegin 7222159 +MultipartPreambleBegin 7222159 +MultipartPreambleEnd 7222159 +MultipartBoundaryBegin 7222159 +MultipartBoundaryEnd 7222199 +MimeEntityBegin 7222199 +MimeEntityHeadersEnd 7222417 +MimeContentBegin 7222417 +MimeContentEnd 7223042 +MimeEntityEnd 7223044 +MultipartBoundaryBegin 7223044 +MultipartBoundaryEnd 7223084 +MimeEntityBegin 7223084 +MimeEntityHeadersEnd 7223365 +MimeContentBegin 7223365 +MimeContentEnd 7234235 +MimeEntityEnd 7234237 +MultipartEndBoundaryBegin 7234237 +MultipartEndBoundaryEnd 7234277 +MultipartEpilogueBegin 7234277 +MultipartEpilogueEnd 7234277 +MimeEntityEnd 7234279 +MimeMessageEnd 7234279 +MboxMarkerBegin 7234279 +MboxMarkerEnd 7234286 +MimeMessageBegin 7234288 +MimeMessageHeadersEnd 7234592 +MimeEntityBegin 7234288 +MimeEntityHeadersEnd 7234592 +MimeContentBegin 7234592 +MultipartPreambleBegin 7234592 +MultipartPreambleEnd 7234592 +MultipartBoundaryBegin 7234592 +MultipartBoundaryEnd 7234632 +MimeEntityBegin 7234632 +MimeEntityHeadersEnd 7234854 +MimeContentBegin 7234854 +MimeContentEnd 7235483 +MimeEntityEnd 7235485 +MultipartBoundaryBegin 7235485 +MultipartBoundaryEnd 7235525 +MimeEntityBegin 7235525 +MimeEntityHeadersEnd 7235705 +MimeContentBegin 7235705 +MimeContentEnd 7246575 +MimeEntityEnd 7246577 +MultipartEndBoundaryBegin 7246577 +MultipartEndBoundaryEnd 7246617 +MultipartEpilogueBegin 7246617 +MultipartEpilogueEnd 7246617 +MimeEntityEnd 7246619 +MimeMessageEnd 7246619 +MboxMarkerBegin 7246619 +MboxMarkerEnd 7246626 +MimeMessageBegin 7246628 +MimeMessageHeadersEnd 7246932 +MimeEntityBegin 7246628 +MimeEntityHeadersEnd 7246932 +MimeContentBegin 7246932 +MultipartPreambleBegin 7246932 +MultipartPreambleEnd 7246932 +MultipartBoundaryBegin 7246932 +MultipartBoundaryEnd 7246972 +MimeEntityBegin 7246972 +MimeEntityHeadersEnd 7247224 +MimeContentBegin 7247224 +MimeContentEnd 7247884 +MimeEntityEnd 7247886 +MultipartBoundaryBegin 7247886 +MultipartBoundaryEnd 7247926 +MimeEntityBegin 7247926 +MimeEntityHeadersEnd 7248239 +MimeContentBegin 7248239 +MimeContentEnd 7259109 +MimeEntityEnd 7259111 +MultipartEndBoundaryBegin 7259111 +MultipartEndBoundaryEnd 7259151 +MultipartEpilogueBegin 7259151 +MultipartEpilogueEnd 7259151 +MimeEntityEnd 7259153 +MimeMessageEnd 7259153 +MboxMarkerBegin 7259153 +MboxMarkerEnd 7259160 +MimeMessageBegin 7259162 +MimeMessageHeadersEnd 7259466 +MimeEntityBegin 7259162 +MimeEntityHeadersEnd 7259466 +MimeContentBegin 7259466 +MultipartPreambleBegin 7259466 +MultipartPreambleEnd 7259466 +MultipartBoundaryBegin 7259466 +MultipartBoundaryEnd 7259506 +MimeEntityBegin 7259506 +MimeEntityHeadersEnd 7259728 +MimeContentBegin 7259728 +MimeContentEnd 7260401 +MimeEntityEnd 7260403 +MultipartBoundaryBegin 7260403 +MultipartBoundaryEnd 7260443 +MimeEntityBegin 7260443 +MimeEntityHeadersEnd 7260623 +MimeContentBegin 7260623 +MimeContentEnd 7271493 +MimeEntityEnd 7271495 +MultipartEndBoundaryBegin 7271495 +MultipartEndBoundaryEnd 7271535 +MultipartEpilogueBegin 7271535 +MultipartEpilogueEnd 7271535 +MimeEntityEnd 7271537 +MimeMessageEnd 7271537 +MboxMarkerBegin 7271537 +MboxMarkerEnd 7271544 +MimeMessageBegin 7271546 +MimeMessageHeadersEnd 7271850 +MimeEntityBegin 7271546 +MimeEntityHeadersEnd 7271850 +MimeContentBegin 7271850 +MultipartPreambleBegin 7271850 +MultipartPreambleEnd 7271850 +MultipartBoundaryBegin 7271850 +MultipartBoundaryEnd 7271890 +MimeEntityBegin 7271890 +MimeEntityHeadersEnd 7272142 +MimeContentBegin 7272142 +MimeContentEnd 7272841 +MimeEntityEnd 7272843 +MultipartBoundaryBegin 7272843 +MultipartBoundaryEnd 7272883 +MimeEntityBegin 7272883 +MimeEntityHeadersEnd 7273227 +MimeContentBegin 7273227 +MimeContentEnd 7284097 +MimeEntityEnd 7284099 +MultipartEndBoundaryBegin 7284099 +MultipartEndBoundaryEnd 7284139 +MultipartEpilogueBegin 7284139 +MultipartEpilogueEnd 7284139 +MimeEntityEnd 7284141 +MimeMessageEnd 7284141 +MboxMarkerBegin 7284141 +MboxMarkerEnd 7284172 +MimeMessageBegin 7284174 +MimeMessageHeadersEnd 7285430 +MimeEntityBegin 7284174 +MimeEntityHeadersEnd 7285430 +MimeContentBegin 7285430 +MultipartPreambleBegin 7285430 +MultipartPreambleEnd 7285478 +MultipartBoundaryBegin 7285478 +MultipartBoundaryEnd 7285517 +MimeEntityBegin 7285517 +MimeEntityHeadersEnd 7285596 +MimeContentBegin 7285596 +MimeContentEnd 7285626 +MimeEntityEnd 7285628 +MultipartBoundaryBegin 7285628 +MultipartBoundaryEnd 7285667 +MimeEntityBegin 7285667 +MimeEntityHeadersEnd 7285761 +MimeContentBegin 7285761 +MimeMessageBegin 7285761 +MimeMessageHeadersEnd 7286598 +MimeEntityBegin 7285761 +MimeEntityHeadersEnd 7286598 +MimeContentBegin 7286598 +MultipartPreambleBegin 7286598 +MultipartPreambleEnd 7286600 +MultipartBoundaryBegin 7286600 +MultipartBoundaryEnd 7286640 +MimeEntityBegin 7286640 +MimeEntityHeadersEnd 7286719 +MimeContentBegin 7286719 +MimeContentEnd 7287362 +MimeEntityEnd 7287364 +MultipartBoundaryBegin 7287364 +MultipartBoundaryEnd 7287404 +MimeEntityBegin 7287404 +MimeEntityHeadersEnd 7287488 +MimeContentBegin 7287488 +MultipartPreambleBegin 7287488 +MultipartPreambleEnd 7287490 +MultipartBoundaryBegin 7287490 +MultipartBoundaryEnd 7287530 +MimeEntityBegin 7287530 +MimeEntityHeadersEnd 7287608 +MimeContentBegin 7287608 +MimeContentEnd 7288476 +MimeEntityEnd 7288478 +MultipartBoundaryBegin 7288478 +MultipartBoundaryEnd 7288518 +MimeEntityBegin 7288518 +MimeEntityHeadersEnd 7288707 +MimeContentBegin 7288707 +MimeContentEnd 8042865 +MimeEntityEnd 8042867 +MultipartEndBoundaryBegin 8042867 +MultipartEndBoundaryEnd 8042907 +MultipartEpilogueBegin 8042907 +MultipartEpilogueEnd 8042909 +MimeEntityEnd 8042911 +MultipartEndBoundaryBegin 8042911 +MultipartEndBoundaryEnd 8042951 +MultipartEpilogueBegin 8042951 +MultipartEpilogueEnd 8042957 +MimeEntityEnd 8042959 +MimeMessageEnd 8042959 +MimeContentEnd 8042959 +MimeEntityEnd 8042959 +MultipartEndBoundaryBegin 8042959 +MultipartEndBoundaryEnd 8042998 +MultipartEpilogueBegin 8042998 +MultipartEpilogueEnd 8043000 +MimeEntityEnd 8043002 +MimeMessageEnd 8043002 +MboxMarkerBegin 8043002 +MboxMarkerEnd 8043033 +MimeMessageBegin 8043035 +MimeMessageHeadersEnd 8044321 +MimeEntityBegin 8043035 +MimeEntityHeadersEnd 8044321 +MimeContentBegin 8044321 +MultipartPreambleBegin 8044321 +MultipartPreambleEnd 8044323 +MultipartBoundaryBegin 8044323 +MultipartBoundaryEnd 8044368 +MimeEntityBegin 8044368 +MimeEntityHeadersEnd 8044462 +MimeContentBegin 8044462 +MimeContentEnd 8046894 +MimeEntityEnd 8046896 +MultipartBoundaryBegin 8046896 +MultipartBoundaryEnd 8046941 +MimeEntityBegin 8046941 +MimeEntityHeadersEnd 8047105 +MimeContentBegin 8047105 +MimeContentEnd 8053207 +MimeEntityEnd 8053209 +MultipartBoundaryBegin 8053209 +MultipartBoundaryEnd 8053254 +MimeEntityBegin 8053254 +MimeEntityHeadersEnd 8053417 +MimeContentBegin 8053417 +MimeContentEnd 8065647 +MimeEntityEnd 8065649 +MultipartBoundaryBegin 8065649 +MultipartBoundaryEnd 8065694 +MimeEntityBegin 8065694 +MimeEntityHeadersEnd 8065859 +MimeContentBegin 8065859 +MimeContentEnd 8087855 +MimeEntityEnd 8087857 +MultipartBoundaryBegin 8087857 +MultipartBoundaryEnd 8087902 +MimeEntityBegin 8087902 +MimeEntityHeadersEnd 8088111 +MimeContentBegin 8088111 +MimeContentEnd 8091549 +MimeEntityEnd 8091551 +MultipartEndBoundaryBegin 8091551 +MultipartEndBoundaryEnd 8091596 +MultipartEpilogueBegin 8091596 +MultipartEpilogueEnd 8091598 +MimeEntityEnd 8091600 +MimeMessageEnd 8091600 +MboxMarkerBegin 8091600 +MboxMarkerEnd 8091607 +MimeMessageBegin 8091609 +MimeMessageHeadersEnd 8092367 +MimeEntityBegin 8091609 +MimeEntityHeadersEnd 8092367 +MimeContentBegin 8092367 +MimeContentEnd 8644457 +MimeEntityEnd 8644459 +MimeMessageEnd 8644459 +MboxMarkerBegin 8644459 +MboxMarkerEnd 8644466 +MimeMessageBegin 8644468 +MimeMessageHeadersEnd 8645400 +MimeEntityBegin 8644468 +MimeEntityHeadersEnd 8645400 +MimeContentBegin 8645400 +MultipartPreambleBegin 8645400 +MultipartPreambleEnd 8645402 +MultipartBoundaryBegin 8645402 +MultipartBoundaryEnd 8645411 +MimeEntityBegin 8645411 +MimeEntityHeadersEnd 8645442 +MimeContentBegin 8645442 +MimeContentEnd 8648068 +MimeEntityEnd 8648070 +MultipartEndBoundaryBegin 8648070 +MultipartEndBoundaryEnd 8648079 +MultipartEpilogueBegin 8648079 +MultipartEpilogueEnd 8648081 +MimeEntityEnd 8648083 +MimeMessageEnd 8648083 +MboxMarkerBegin 8648083 +MboxMarkerEnd 8648114 +MimeMessageBegin 8648116 +MimeMessageHeadersEnd 8648726 +MimeEntityBegin 8648116 +MimeEntityHeadersEnd 8648726 +MimeContentBegin 8648726 +MultipartPreambleBegin 8648726 +MultipartPreambleEnd 8649013 +MultipartBoundaryBegin 8649013 +MultipartBoundaryEnd 8649031 +MimeEntityBegin 8649031 +MimeEntityHeadersEnd 8649078 +MimeContentBegin 8649078 +MimeContentEnd 8650186 +MimeEntityEnd 8650188 +MultipartBoundaryBegin 8650188 +MultipartBoundaryEnd 8650206 +MimeEntityBegin 8650206 +MimeEntityHeadersEnd 8650249 +MimeContentBegin 8650249 +MimeContentEnd 8650542 +MimeEntityEnd 8650544 +MultipartEndBoundaryBegin 8650544 +MultipartEndBoundaryEnd 8650562 +MultipartEpilogueBegin 8650562 +MultipartEpilogueEnd 8650562 +MimeEntityEnd 8650564 +MimeMessageEnd 8650564 +MboxMarkerBegin 8650564 +MboxMarkerEnd 8650571 +MimeMessageBegin 8650573 +MimeMessageHeadersEnd 8651756 +MimeEntityBegin 8650573 +MimeEntityHeadersEnd 8651756 +MimeContentBegin 8651756 +MimeContentEnd 8653178 +MimeEntityEnd 8653180 +MimeMessageEnd 8653180 +MboxMarkerBegin 8653180 +MboxMarkerEnd 8653187 +MimeMessageBegin 8653189 +MimeMessageHeadersEnd 8653839 +MimeEntityBegin 8653189 +MimeEntityHeadersEnd 8653839 +MimeContentBegin 8653839 +MimeContentEnd 8654840 +MimeEntityEnd 8654842 +MimeMessageEnd 8654842 +MboxMarkerBegin 8654842 +MboxMarkerEnd 8654849 +MimeMessageBegin 8654851 +MimeMessageHeadersEnd 8655631 +MimeEntityBegin 8654851 +MimeEntityHeadersEnd 8655631 +MimeContentBegin 8655631 +MultipartPreambleBegin 8655631 +MultipartPreambleEnd 8655789 +MultipartBoundaryBegin 8655789 +MultipartBoundaryEnd 8655830 +MimeEntityBegin 8655830 +MimeEntityHeadersEnd 8655876 +MimeContentBegin 8655876 +MimeContentEnd 8656708 +MimeEntityEnd 8656710 +MultipartBoundaryBegin 8656710 +MultipartBoundaryEnd 8656751 +MimeEntityBegin 8656751 +MimeEntityHeadersEnd 8656839 +MimeContentBegin 8656839 +MultipartPreambleBegin 8656839 +MultipartPreambleEnd 8656839 +MultipartBoundaryBegin 8656839 +MultipartBoundaryEnd 8656882 +MimeEntityBegin 8656882 +MimeEntityHeadersEnd 8656976 +MimeContentBegin 8656976 +MimeContentEnd 8657477 +MimeEntityEnd 8657479 +MultipartBoundaryBegin 8657479 +MultipartBoundaryEnd 8657522 +MimeEntityBegin 8657522 +MimeEntityHeadersEnd 8657715 +MimeContentBegin 8657715 +MimeMessageBegin 8657715 +MimeMessageHeadersEnd 8657744 +MimeEntityBegin 8657715 +MimeEntityHeadersEnd 8657744 +MimeContentBegin 8657744 +MimeContentEnd 8657748 +MimeEntityEnd 8657750 +MimeMessageEnd 8657750 +MimeContentEnd 8657750 +MimeEntityEnd 8657750 +MultipartBoundaryBegin 8657750 +MultipartBoundaryEnd 8657793 +MimeEntityBegin 8657793 +MimeEntityHeadersEnd 8657884 +MimeContentBegin 8657884 +MimeContentEnd 8657889 +MimeEntityEnd 8657891 +MultipartBoundaryBegin 8657891 +MultipartBoundaryEnd 8657934 +MimeEntityBegin 8657934 +MimeEntityHeadersEnd 8658142 +MimeContentBegin 8658142 +MimeMessageBegin 8658142 +MimeMessageHeadersEnd 8658169 +MimeEntityBegin 8658142 +MimeEntityHeadersEnd 8658169 +MimeContentBegin 8658169 +MimeContentEnd 8658173 +MimeEntityEnd 8658175 +MimeMessageEnd 8658175 +MimeContentEnd 8658175 +MimeEntityEnd 8658175 +MultipartBoundaryBegin 8658175 +MultipartBoundaryEnd 8658218 +MimeEntityBegin 8658218 +MimeEntityHeadersEnd 8658312 +MimeContentBegin 8658312 +MimeContentEnd 8658541 +MimeEntityEnd 8658543 +MultipartEndBoundaryBegin 8658543 +MultipartEndBoundaryEnd 8658586 +MultipartEpilogueBegin 8658586 +MultipartEpilogueEnd 8658588 +MimeEntityEnd 8658590 +MultipartEndBoundaryBegin 8658590 +MultipartEndBoundaryEnd 8658631 +MultipartEpilogueBegin 8658631 +MultipartEpilogueEnd 8658633 +MimeEntityEnd 8658635 +MimeMessageEnd 8658635 +MboxMarkerBegin 8658635 +MboxMarkerEnd 8658642 +MimeMessageBegin 8658644 +MimeMessageHeadersEnd 8659476 +MimeEntityBegin 8658644 +MimeEntityHeadersEnd 8659476 +MimeContentBegin 8659476 +MimeContentEnd 8660904 +MimeEntityEnd 8660906 +MimeMessageEnd 8660906 +MboxMarkerBegin 8660906 +MboxMarkerEnd 8660913 +MimeMessageBegin 8660915 +MimeMessageHeadersEnd 8661072 +MimeEntityBegin 8660915 +MimeEntityHeadersEnd 8661072 +MimeContentBegin 8661072 +MimeContentEnd 8665806 +MimeEntityEnd 8665808 +MimeMessageEnd 8665808 +MboxMarkerBegin 8665808 +MboxMarkerEnd 8665815 +MimeMessageBegin 8665817 +MimeMessageHeadersEnd 8667595 +MimeEntityBegin 8665817 +MimeEntityHeadersEnd 8667595 +MimeContentBegin 8667595 +MultipartPreambleBegin 8667595 +MultipartPreambleEnd 8667753 +MultipartBoundaryBegin 8667753 +MultipartBoundaryEnd 8667794 +MimeEntityBegin 8667794 +MimeEntityHeadersEnd 8667840 +MimeContentBegin 8667840 +MimeContentEnd 8669545 +MimeEntityEnd 8669547 +MultipartBoundaryBegin 8669547 +MultipartBoundaryEnd 8669588 +MimeEntityBegin 8669588 +MimeEntityHeadersEnd 8669676 +MimeContentBegin 8669676 +MultipartPreambleBegin 8669676 +MultipartPreambleEnd 8669676 +MultipartBoundaryBegin 8669676 +MultipartBoundaryEnd 8669719 +MimeEntityBegin 8669719 +MimeEntityHeadersEnd 8669813 +MimeContentBegin 8669813 +MimeContentEnd 8670384 +MimeEntityEnd 8670386 +MultipartBoundaryBegin 8670386 +MultipartBoundaryEnd 8670429 +MimeEntityBegin 8670429 +MimeEntityHeadersEnd 8670493 +MimeContentBegin 8670493 +MimeContentEnd 8671377 +MimeEntityEnd 8671379 +MultipartBoundaryBegin 8671379 +MultipartBoundaryEnd 8671422 +MimeEntityBegin 8671422 +MimeEntityHeadersEnd 8671516 +MimeContentBegin 8671516 +MimeContentEnd 8671567 +MimeEntityEnd 8671569 +MultipartBoundaryBegin 8671569 +MultipartBoundaryEnd 8671612 +MimeEntityBegin 8671612 +MimeEntityHeadersEnd 8671676 +MimeContentBegin 8671676 +MimeContentEnd 8672560 +MimeEntityEnd 8672562 +MultipartBoundaryBegin 8672562 +MultipartBoundaryEnd 8672605 +MimeEntityBegin 8672605 +MimeEntityHeadersEnd 8672699 +MimeContentBegin 8672699 +MimeContentEnd 8672750 +MimeEntityEnd 8672752 +MultipartBoundaryBegin 8672752 +MultipartBoundaryEnd 8672795 +MimeEntityBegin 8672795 +MimeEntityHeadersEnd 8672859 +MimeContentBegin 8672859 +MimeContentEnd 8673743 +MimeEntityEnd 8673745 +MultipartBoundaryBegin 8673745 +MultipartBoundaryEnd 8673788 +MimeEntityBegin 8673788 +MimeEntityHeadersEnd 8673882 +MimeContentBegin 8673882 +MimeContentEnd 8673927 +MimeEntityEnd 8673929 +MultipartBoundaryBegin 8673929 +MultipartBoundaryEnd 8673972 +MimeEntityBegin 8673972 +MimeEntityHeadersEnd 8674036 +MimeContentBegin 8674036 +MimeContentEnd 8674264 +MimeEntityEnd 8674266 +MultipartBoundaryBegin 8674266 +MultipartBoundaryEnd 8674309 +MimeEntityBegin 8674309 +MimeEntityHeadersEnd 8674403 +MimeContentBegin 8674403 +MimeContentEnd 8674472 +MimeEntityEnd 8674474 +MultipartBoundaryBegin 8674474 +MultipartBoundaryEnd 8674517 +MimeEntityBegin 8674517 +MimeEntityHeadersEnd 8674581 +MimeContentBegin 8674581 +MimeContentEnd 8674809 +MimeEntityEnd 8674811 +MultipartBoundaryBegin 8674811 +MultipartBoundaryEnd 8674854 +MimeEntityBegin 8674854 +MimeEntityHeadersEnd 8674948 +MimeContentBegin 8674948 +MimeContentEnd 8674997 +MimeEntityEnd 8674999 +MultipartBoundaryBegin 8674999 +MultipartBoundaryEnd 8675042 +MimeEntityBegin 8675042 +MimeEntityHeadersEnd 8675106 +MimeContentBegin 8675106 +MimeContentEnd 8675334 +MimeEntityEnd 8675336 +MultipartBoundaryBegin 8675336 +MultipartBoundaryEnd 8675379 +MimeEntityBegin 8675379 +MimeEntityHeadersEnd 8675473 +MimeContentBegin 8675473 +MimeContentEnd 8675776 +MimeEntityEnd 8675778 +MultipartBoundaryBegin 8675778 +MultipartBoundaryEnd 8675821 +MimeEntityBegin 8675821 +MimeEntityHeadersEnd 8675885 +MimeContentBegin 8675885 +MimeContentEnd 8676769 +MimeEntityEnd 8676771 +MultipartBoundaryBegin 8676771 +MultipartBoundaryEnd 8676814 +MimeEntityBegin 8676814 +MimeEntityHeadersEnd 8676908 +MimeContentBegin 8676908 +MimeContentEnd 8676952 +MimeEntityEnd 8676954 +MultipartBoundaryBegin 8676954 +MultipartBoundaryEnd 8676997 +MimeEntityBegin 8676997 +MimeEntityHeadersEnd 8677061 +MimeContentBegin 8677061 +MimeContentEnd 8679003 +MimeEntityEnd 8679005 +MultipartBoundaryBegin 8679005 +MultipartBoundaryEnd 8679048 +MimeEntityBegin 8679048 +MimeEntityHeadersEnd 8679142 +MimeContentBegin 8679142 +MimeContentEnd 8679153 +MimeEntityEnd 8679155 +MultipartEndBoundaryBegin 8679155 +MultipartEndBoundaryEnd 8679198 +MultipartEpilogueBegin 8679198 +MultipartEpilogueEnd 8679200 +MimeEntityEnd 8679202 +MultipartEndBoundaryBegin 8679202 +MultipartEndBoundaryEnd 8679243 +MultipartEpilogueBegin 8679243 +MultipartEpilogueEnd 8679245 +MimeEntityEnd 8679247 +MimeMessageEnd 8679247 +MboxMarkerBegin 8679247 +MboxMarkerEnd 8679254 +MimeMessageBegin 8679256 +MimeMessageHeadersEnd 8680000 +MimeEntityBegin 8679256 +MimeEntityHeadersEnd 8680000 +MimeContentBegin 8680000 +MultipartPreambleBegin 8680000 +MultipartPreambleEnd 8680158 +MultipartBoundaryBegin 8680158 +MultipartBoundaryEnd 8680199 +MimeEntityBegin 8680199 +MimeEntityHeadersEnd 8680245 +MimeContentBegin 8680245 +MimeContentEnd 8680884 +MimeEntityEnd 8680886 +MultipartBoundaryBegin 8680886 +MultipartBoundaryEnd 8680927 +MimeEntityBegin 8680927 +MimeEntityHeadersEnd 8681015 +MimeContentBegin 8681015 +MultipartPreambleBegin 8681015 +MultipartPreambleEnd 8681015 +MultipartBoundaryBegin 8681015 +MultipartBoundaryEnd 8681058 +MimeEntityBegin 8681058 +MimeEntityHeadersEnd 8681152 +MimeContentBegin 8681152 +MimeContentEnd 8681693 +MimeEntityEnd 8681695 +MultipartBoundaryBegin 8681695 +MultipartBoundaryEnd 8681738 +MimeEntityBegin 8681738 +MimeEntityHeadersEnd 8681850 +MimeContentBegin 8681850 +MimeContentEnd 8690560 +MimeEntityEnd 8690562 +MultipartBoundaryBegin 8690562 +MultipartBoundaryEnd 8690605 +MimeEntityBegin 8690605 +MimeEntityHeadersEnd 8690699 +MimeContentBegin 8690699 +MimeContentEnd 8690747 +MimeEntityEnd 8690749 +MultipartEndBoundaryBegin 8690749 +MultipartEndBoundaryEnd 8690792 +MultipartEpilogueBegin 8690792 +MultipartEpilogueEnd 8690794 +MimeEntityEnd 8690796 +MultipartEndBoundaryBegin 8690796 +MultipartEndBoundaryEnd 8690837 +MultipartEpilogueBegin 8690837 +MultipartEpilogueEnd 8690837 +MimeEntityEnd 8690839 +MimeMessageEnd 8690839 +MboxMarkerBegin 8690839 +MboxMarkerEnd 8690846 +MimeMessageBegin 8690848 +MimeMessageHeadersEnd 8691509 +MimeEntityBegin 8690848 +MimeEntityHeadersEnd 8691509 +MimeContentBegin 8691509 +MultipartPreambleBegin 8691509 +MultipartPreambleEnd 8691511 +MultipartBoundaryBegin 8691511 +MultipartBoundaryEnd 8691561 +MimeEntityBegin 8691561 +MimeEntityHeadersEnd 8691654 +MimeContentBegin 8691654 +MimeContentEnd 8691757 +MimeEntityEnd 8691759 +MultipartBoundaryBegin 8691759 +MultipartBoundaryEnd 8691809 +MimeEntityBegin 8691809 +MimeEntityHeadersEnd 8691940 +MimeContentBegin 8691940 +MimeContentEnd 8771456 +MimeEntityEnd 8771458 +MultipartEndBoundaryBegin 8771458 +MultipartEndBoundaryEnd 8771508 +MultipartEpilogueBegin 8771508 +MultipartEpilogueEnd 8771510 +MimeEntityEnd 8771512 +MimeMessageEnd 8771512 +MboxMarkerBegin 8771512 +MboxMarkerEnd 8771519 +MimeMessageBegin 8771521 +MimeMessageHeadersEnd 8772294 +MimeEntityBegin 8771521 +MimeEntityHeadersEnd 8772294 +MimeContentBegin 8772294 +MultipartPreambleBegin 8772294 +MultipartPreambleEnd 8772452 +MultipartBoundaryBegin 8772452 +MultipartBoundaryEnd 8772493 +MimeEntityBegin 8772493 +MimeEntityHeadersEnd 8772539 +MimeContentBegin 8772539 +MimeContentEnd 8773917 +MimeEntityEnd 8773919 +MultipartBoundaryBegin 8773919 +MultipartBoundaryEnd 8773960 +MimeEntityBegin 8773960 +MimeEntityHeadersEnd 8774048 +MimeContentBegin 8774048 +MultipartPreambleBegin 8774048 +MultipartPreambleEnd 8774048 +MultipartBoundaryBegin 8774048 +MultipartBoundaryEnd 8774091 +MimeEntityBegin 8774091 +MimeEntityHeadersEnd 8774185 +MimeContentBegin 8774185 +MimeContentEnd 8775346 +MimeEntityEnd 8775348 +MultipartBoundaryBegin 8775348 +MultipartBoundaryEnd 8775391 +MimeEntityBegin 8775391 +MimeEntityHeadersEnd 8775493 +MimeContentBegin 8775493 +MimeContentEnd 8892315 +MimeEntityEnd 8892317 +MultipartBoundaryBegin 8892317 +MultipartBoundaryEnd 8892360 +MimeEntityBegin 8892360 +MimeEntityHeadersEnd 8892454 +MimeContentBegin 8892454 +MimeContentEnd 8892580 +MimeEntityEnd 8892582 +MultipartBoundaryBegin 8892582 +MultipartBoundaryEnd 8892625 +MimeEntityBegin 8892625 +MimeEntityHeadersEnd 8892728 +MimeContentBegin 8892728 +MimeContentEnd 8959970 +MimeEntityEnd 8959972 +MultipartBoundaryBegin 8959972 +MultipartBoundaryEnd 8960015 +MimeEntityBegin 8960015 +MimeEntityHeadersEnd 8960106 +MimeContentBegin 8960106 +MimeContentEnd 8960106 +MimeEntityEnd 8960108 +MultipartEndBoundaryBegin 8960108 +MultipartEndBoundaryEnd 8960151 +MultipartEpilogueBegin 8960151 +MultipartEpilogueEnd 8960153 +MimeEntityEnd 8960155 +MultipartEndBoundaryBegin 8960155 +MultipartEndBoundaryEnd 8960196 +MultipartEpilogueBegin 8960196 +MultipartEpilogueEnd 8960196 +MimeEntityEnd 8960198 +MimeMessageEnd 8960198 +MboxMarkerBegin 8960198 +MboxMarkerEnd 8960205 +MimeMessageBegin 8960207 +MimeMessageHeadersEnd 8961063 +MimeEntityBegin 8960207 +MimeEntityHeadersEnd 8961063 +MimeContentBegin 8961063 +MimeContentEnd 8962821 +MimeEntityEnd 8962823 +MimeMessageEnd 8962823 +MboxMarkerBegin 8962823 +MboxMarkerEnd 8962830 +MimeMessageBegin 8962832 +MimeMessageHeadersEnd 8963476 +MimeEntityBegin 8962832 +MimeEntityHeadersEnd 8963476 +MimeContentBegin 8963476 +MimeMessageBegin 8963476 +MimeMessageHeadersEnd 8963972 +MimeEntityBegin 8963476 +MimeEntityHeadersEnd 8963972 +MimeContentBegin 8963972 +MimeContentEnd 8964871 +MimeEntityEnd 8964873 +MimeMessageEnd 8964873 +MimeContentEnd 8964873 +MimeEntityEnd 8964873 +MimeMessageEnd 8964873 +MboxMarkerBegin 8964873 +MboxMarkerEnd 8964880 +MimeMessageBegin 8964882 +MimeMessageHeadersEnd 8965340 +MimeEntityBegin 8964882 +MimeEntityHeadersEnd 8965340 +MimeContentBegin 8965340 +MultipartPreambleBegin 8965340 +MultipartPreambleEnd 8965340 +MultipartBoundaryBegin 8965340 +MultipartBoundaryEnd 8965350 +MimeEntityBegin 8965350 +MimeEntityHeadersEnd 8965352 +MimeContentBegin 8965352 +MimeContentEnd 8965393 +MimeEntityEnd 8965395 +MultipartBoundaryBegin 8965395 +MultipartBoundaryEnd 8965405 +MimeEntityBegin 8965405 +MimeEntityHeadersEnd 8965469 +MimeContentBegin 8965469 +MimeContentEnd 9057967 +MimeEntityEnd 9057969 +MultipartEndBoundaryBegin 9057969 +MultipartEndBoundaryEnd 9057979 +MultipartEpilogueBegin 9057979 +MultipartEpilogueEnd 9057985 +MimeEntityEnd 9057987 +MimeMessageEnd 9057987 +MboxMarkerBegin 9057987 +MboxMarkerEnd 9057994 +MimeMessageBegin 9057996 +MimeMessageHeadersEnd 9058498 +MimeEntityBegin 9057996 +MimeEntityHeadersEnd 9058498 +MimeContentBegin 9058498 +MimeContentEnd 9059667 +MimeEntityEnd 9059669 +MimeMessageEnd 9059669 +MboxMarkerBegin 9059669 +MboxMarkerEnd 9059676 +MimeMessageBegin 9059678 +MimeMessageHeadersEnd 9060843 +MimeEntityBegin 9059678 +MimeEntityHeadersEnd 9060843 +MimeContentBegin 9060843 +MultipartPreambleBegin 9060843 +MultipartPreambleEnd 9060843 +MultipartBoundaryBegin 9060843 +MultipartBoundaryEnd 9060849 +MimeEntityBegin 9060849 +MimeEntityHeadersEnd 9060851 +MimeContentBegin 9060851 +MimeContentEnd 9061403 +MimeEntityEnd 9061405 +MultipartBoundaryBegin 9061405 +MultipartBoundaryEnd 9061411 +MimeEntityBegin 9061411 +MimeEntityHeadersEnd 9061531 +MimeContentBegin 9061531 +MimeContentEnd 9119961 +MimeEntityEnd 9119963 +MultipartBoundaryBegin 9119963 +MultipartBoundaryEnd 9119969 +MimeEntityBegin 9119969 +MimeEntityHeadersEnd 9119971 +MimeContentBegin 9119971 +MimeContentEnd 9123837 +MimeEntityEnd 9123839 +MultipartBoundaryBegin 9123839 +MultipartBoundaryEnd 9123845 +MimeEntityBegin 9123845 +MimeEntityHeadersEnd 9124003 +MimeContentBegin 9124003 +MimeContentEnd 9154647 +MimeEntityEnd 9154649 +MultipartBoundaryBegin 9154649 +MultipartBoundaryEnd 9154655 +MimeEntityBegin 9154655 +MimeEntityHeadersEnd 9154764 +MimeContentBegin 9154764 +MimeContentEnd 9155504 +MimeEntityEnd 9155506 +MultipartBoundaryBegin 9155506 +MultipartBoundaryEnd 9155512 +MimeEntityBegin 9155512 +MimeEntityHeadersEnd 9155632 +MimeContentBegin 9155632 +MimeContentEnd 9156920 +MimeEntityEnd 9156922 +MultipartEndBoundaryBegin 9156922 +MultipartEndBoundaryEnd 9156928 +MultipartEpilogueBegin 9156928 +MultipartEpilogueEnd 9156930 +MimeEntityEnd 9156932 +MimeMessageEnd 9156932 +MboxMarkerBegin 9156932 +MboxMarkerEnd 9156963 +MimeMessageBegin 9156965 +MimeMessageHeadersEnd 9158136 +MimeEntityBegin 9156965 +MimeEntityHeadersEnd 9158136 +MimeContentBegin 9158136 +MultipartPreambleBegin 9158136 +MultipartPreambleEnd 9158136 +MultipartBoundaryBegin 9158136 +MultipartBoundaryEnd 9158154 +MimeEntityBegin 9158154 +MimeEntityHeadersEnd 9158156 +MimeContentBegin 9158156 +MimeContentEnd 9159077 +MimeEntityEnd 9159079 +MultipartBoundaryBegin 9159079 +MultipartBoundaryEnd 9159097 +MimeEntityBegin 9159097 +MimeEntityHeadersEnd 9159179 +MimeContentBegin 9159179 +MimeContentEnd 9159939 +MimeEntityEnd 9159941 +MultipartEndBoundaryBegin 9159941 +MultipartEndBoundaryEnd 9159959 +MultipartEpilogueBegin 9159959 +MultipartEpilogueEnd 9159961 +MimeEntityEnd 9159963 +MimeMessageEnd 9159963 +MboxMarkerBegin 9159963 +MboxMarkerEnd 9159994 +MimeMessageBegin 9159996 +MimeMessageHeadersEnd 9161157 +MimeEntityBegin 9159996 +MimeEntityHeadersEnd 9161157 +MimeContentBegin 9161157 +MultipartPreambleBegin 9161157 +MultipartPreambleEnd 9161333 +MultipartBoundaryBegin 9161333 +MultipartBoundaryEnd 9161341 +MimeEntityBegin 9161341 +MimeEntityHeadersEnd 9161422 +MimeContentBegin 9161422 +MimeContentEnd 9162176 +MimeEntityEnd 9162178 +MultipartBoundaryBegin 9162178 +MultipartBoundaryEnd 9162186 +MimeEntityBegin 9162186 +MimeEntityHeadersEnd 9162369 +MimeContentBegin 9162369 +MimeContentEnd 9164615 +MimeEntityEnd 9164617 +MultipartEndBoundaryBegin 9164617 +MultipartEndBoundaryEnd 9164625 +MultipartEpilogueBegin 9164625 +MultipartEpilogueEnd 9164625 +MimeEntityEnd 9164627 +MimeMessageEnd 9164627 +MboxMarkerBegin 9164627 +MboxMarkerEnd 9164658 +MimeMessageBegin 9164660 +MimeMessageHeadersEnd 9165820 +MimeEntityBegin 9164660 +MimeEntityHeadersEnd 9165820 +MimeContentBegin 9165820 +MultipartPreambleBegin 9165820 +MultipartPreambleEnd 9165996 +MultipartBoundaryBegin 9165996 +MultipartBoundaryEnd 9166018 +MimeEntityBegin 9166018 +MimeEntityHeadersEnd 9166099 +MimeContentBegin 9166099 +MimeContentEnd 9168957 +MimeEntityEnd 9168959 +MultipartBoundaryBegin 9168959 +MultipartBoundaryEnd 9168981 +MimeEntityBegin 9168981 +MimeEntityHeadersEnd 9169164 +MimeContentBegin 9169164 +MimeContentEnd 9171746 +MimeEntityEnd 9171748 +MultipartEndBoundaryBegin 9171748 +MultipartEndBoundaryEnd 9171770 +MultipartEpilogueBegin 9171770 +MultipartEpilogueEnd 9171770 +MimeEntityEnd 9171772 +MimeMessageEnd 9171772 +MboxMarkerBegin 9171772 +MboxMarkerEnd 9171779 +MimeMessageBegin 9171781 +MimeMessageHeadersEnd 9171996 +MimeEntityBegin 9171781 +MimeEntityHeadersEnd 9171996 +MimeContentBegin 9171996 +MimeContentEnd 9176246 +MimeEntityEnd 9176248 +MimeMessageEnd 9176248 +MboxMarkerBegin 9176248 +MboxMarkerEnd 9176279 +MimeMessageBegin 9176281 +MimeMessageHeadersEnd 9177199 +MimeEntityBegin 9176281 +MimeEntityHeadersEnd 9177199 +MimeContentBegin 9177199 +MultipartPreambleBegin 9177199 +MultipartPreambleEnd 9177247 +MultipartBoundaryBegin 9177247 +MultipartBoundaryEnd 9177275 +MimeEntityBegin 9177275 +MimeEntityHeadersEnd 9177413 +MimeContentBegin 9177413 +MimeContentEnd 9188281 +MimeEntityEnd 9188283 +MultipartBoundaryBegin 9188283 +MultipartBoundaryEnd 9188311 +MimeEntityBegin 9188311 +MimeEntityHeadersEnd 9188466 +MimeContentBegin 9188466 +MimeContentEnd 9193140 +MimeEntityEnd 9193142 +MultipartEndBoundaryBegin 9193142 +MultipartEndBoundaryEnd 9193170 +MultipartEpilogueBegin 9193170 +MultipartEpilogueEnd 9193172 +MimeEntityEnd 9193174 +MimeMessageEnd 9193174 +MboxMarkerBegin 9193174 +MboxMarkerEnd 9193205 +MimeMessageBegin 9193207 +MimeMessageHeadersEnd 9194031 +MimeEntityBegin 9193207 +MimeEntityHeadersEnd 9194031 +MimeContentBegin 9194031 +MimeContentEnd 9211049 +MimeEntityEnd 9211051 +MimeMessageEnd 9211051 +MboxMarkerBegin 9211051 +MboxMarkerEnd 9211082 +MimeMessageBegin 9211084 +MimeMessageHeadersEnd 9211913 +MimeEntityBegin 9211084 +MimeEntityHeadersEnd 9211913 +MimeContentBegin 9211913 +MimeContentEnd 9237261 +MimeEntityEnd 9237263 +MimeMessageEnd 9237263 +MboxMarkerBegin 9237263 +MboxMarkerEnd 9237294 +MimeMessageBegin 9237296 +MimeMessageHeadersEnd 9238125 +MimeEntityBegin 9237296 +MimeEntityHeadersEnd 9238125 +MimeContentBegin 9238125 +MimeContentEnd 9274811 +MimeEntityEnd 9274813 +MimeMessageEnd 9274813 +MboxMarkerBegin 9274813 +MboxMarkerEnd 9274844 +MimeMessageBegin 9274846 +MimeMessageHeadersEnd 9275678 +MimeEntityBegin 9274846 +MimeEntityHeadersEnd 9275678 +MimeContentBegin 9275678 +MimeContentEnd 9327768 +MimeEntityEnd 9327770 +MimeMessageEnd 9327770 +MboxMarkerBegin 9327770 +MboxMarkerEnd 9327801 +MimeMessageBegin 9327803 +MimeMessageHeadersEnd 9329218 +MimeEntityBegin 9327803 +MimeEntityHeadersEnd 9329218 +MimeContentBegin 9329218 +MimeContentEnd 9330668 +MimeEntityEnd 9330670 +MimeMessageEnd 9330670 +MboxMarkerBegin 9330670 +MboxMarkerEnd 9330701 +MimeMessageBegin 9330703 +MimeMessageHeadersEnd 9332080 +MimeEntityBegin 9330703 +MimeEntityHeadersEnd 9332080 +MimeContentBegin 9332080 +MultipartPreambleBegin 9332080 +MultipartPreambleEnd 9332082 +MultipartBoundaryBegin 9332082 +MultipartBoundaryEnd 9332127 +MimeEntityBegin 9332127 +MimeEntityHeadersEnd 9332194 +MimeContentBegin 9332194 +MimeContentEnd 9332304 +MimeEntityEnd 9332306 +MultipartBoundaryBegin 9332306 +MultipartBoundaryEnd 9332351 +MimeEntityBegin 9332351 +MimeEntityHeadersEnd 9332506 +MimeContentBegin 9332506 +MimeContentEnd 9336492 +MimeEntityEnd 9336494 +MultipartEndBoundaryBegin 9336494 +MultipartEndBoundaryEnd 9336539 +MultipartEpilogueBegin 9336539 +MultipartEpilogueEnd 9336541 +MimeEntityEnd 9336543 +MimeMessageEnd 9336543 +MboxMarkerBegin 9336543 +MboxMarkerEnd 9336574 +MimeMessageBegin 9336576 +MimeMessageHeadersEnd 9337807 +MimeEntityBegin 9336576 +MimeEntityHeadersEnd 9337807 +MimeContentBegin 9337807 +MimeContentEnd 9341357 +MimeEntityEnd 9341359 +MimeMessageEnd 9341359 +MboxMarkerBegin 9341359 +MboxMarkerEnd 9341390 +MimeMessageBegin 9341392 +MimeMessageHeadersEnd 9342490 +MimeEntityBegin 9341392 +MimeEntityHeadersEnd 9342490 +MimeContentBegin 9342490 +MimeContentEnd 9343160 +MimeEntityEnd 9343162 +MimeMessageEnd 9343162 +MboxMarkerBegin 9343162 +MboxMarkerEnd 9343169 +MimeMessageBegin 9343171 +MimeMessageHeadersEnd 9343574 +MimeEntityBegin 9343171 +MimeEntityHeadersEnd 9343574 +MimeContentBegin 9343574 +MimeContentEnd 9351298 +MimeEntityEnd 9351300 +MimeMessageEnd 9351300 +MboxMarkerBegin 9351300 +MboxMarkerEnd 9351331 +MimeMessageBegin 9351333 +MimeMessageHeadersEnd 9352135 +MimeEntityBegin 9351333 +MimeEntityHeadersEnd 9352135 +MimeContentBegin 9352135 +MimeMessageBegin 9352135 +MimeMessageHeadersEnd 9353538 +MimeEntityBegin 9352135 +MimeEntityHeadersEnd 9353538 +MimeContentBegin 9353538 +MimeContentEnd 9354990 +MimeEntityEnd 9354992 +MimeMessageEnd 9354992 +MimeContentEnd 9354992 +MimeEntityEnd 9354992 +MimeMessageEnd 9354992 +MboxMarkerBegin 9354992 +MboxMarkerEnd 9355023 +MimeMessageBegin 9355025 +MimeMessageHeadersEnd 9355752 +MimeEntityBegin 9355025 +MimeEntityHeadersEnd 9355752 +MimeContentBegin 9355752 +MultipartPreambleBegin 9355752 +MultipartPreambleEnd 9355800 +MultipartBoundaryBegin 9355800 +MultipartBoundaryEnd 9355828 +MimeEntityBegin 9355828 +MimeEntityHeadersEnd 9355907 +MimeContentBegin 9355907 +MimeContentEnd 9355923 +MimeEntityEnd 9355925 +MultipartBoundaryBegin 9355925 +MultipartBoundaryEnd 9355953 +MimeEntityBegin 9355953 +MimeEntityHeadersEnd 9356111 +MimeContentBegin 9356111 +MimeMessageBegin 9356111 +MimeMessageHeadersEnd 9357514 +MimeEntityBegin 9356111 +MimeEntityHeadersEnd 9357514 +MimeContentBegin 9357514 +MimeContentEnd 9358966 +MimeEntityEnd 9358968 +MimeMessageEnd 9358968 +MimeContentEnd 9358968 +MimeEntityEnd 9358968 +MultipartEndBoundaryBegin 9358968 +MultipartEndBoundaryEnd 9358996 +MultipartEpilogueBegin 9358996 +MultipartEpilogueEnd 9358998 +MimeEntityEnd 9359000 +MimeMessageEnd 9359000 +MboxMarkerBegin 9359000 +MboxMarkerEnd 9359031 +MimeMessageBegin 9359033 +MimeMessageHeadersEnd 9359714 +MimeEntityBegin 9359033 +MimeEntityHeadersEnd 9359714 +MimeContentBegin 9359714 +MultipartPreambleBegin 9359714 +MultipartPreambleEnd 9359776 +MultipartBoundaryBegin 9359776 +MultipartBoundaryEnd 9359818 +MimeEntityBegin 9359818 +MimeEntityHeadersEnd 9359897 +MimeContentBegin 9359897 +MimeContentEnd 9359939 +MimeEntityEnd 9359941 +MultipartBoundaryBegin 9359941 +MultipartBoundaryEnd 9359983 +MimeEntityBegin 9359983 +MimeEntityHeadersEnd 9360138 +MimeContentBegin 9360138 +MimeContentEnd 9365770 +MimeEntityEnd 9365772 +MultipartEndBoundaryBegin 9365772 +MultipartEndBoundaryEnd 9365814 +MultipartEpilogueBegin 9365814 +MultipartEpilogueEnd 9365816 +MimeEntityEnd 9365818 +MimeMessageEnd 9365818 +MboxMarkerBegin 9365818 +MboxMarkerEnd 9365849 +MimeMessageBegin 9365851 +MimeMessageHeadersEnd 9366934 +MimeEntityBegin 9365851 +MimeEntityHeadersEnd 9366934 +MimeContentBegin 9366934 +MimeContentEnd 9377310 +MimeEntityEnd 9377312 +MimeMessageEnd 9377312 +MboxMarkerBegin 9377312 +MboxMarkerEnd 9377343 +MimeMessageBegin 9377345 +MimeMessageHeadersEnd 9378745 +MimeEntityBegin 9377345 +MimeEntityHeadersEnd 9378745 +MimeContentBegin 9378745 +MultipartPreambleBegin 9378745 +MultipartPreambleEnd 9378807 +MultipartBoundaryBegin 9378807 +MultipartBoundaryEnd 9378849 +MimeEntityBegin 9378849 +MimeEntityHeadersEnd 9378928 +MimeContentBegin 9378928 +MimeContentEnd 9379555 +MimeEntityEnd 9379557 +MultipartBoundaryBegin 9379557 +MultipartBoundaryEnd 9379599 +MimeEntityBegin 9379599 +MimeEntityHeadersEnd 9379754 +MimeContentBegin 9379754 +MimeContentEnd 9381566 +MimeEntityEnd 9381568 +MultipartEndBoundaryBegin 9381568 +MultipartEndBoundaryEnd 9381610 +MultipartEpilogueBegin 9381610 +MultipartEpilogueEnd 9381612 +MimeEntityEnd 9381614 +MimeMessageEnd 9381614 +MboxMarkerBegin 9381614 +MboxMarkerEnd 9381645 +MimeMessageBegin 9381647 +MimeMessageHeadersEnd 9382210 +MimeEntityBegin 9381647 +MimeEntityHeadersEnd 9382210 +MimeContentBegin 9382210 +MimeContentEnd 9382740 +MimeEntityEnd 9382742 +MimeMessageEnd 9382742 +MboxMarkerBegin 9382742 +MboxMarkerEnd 9382749 +MimeMessageBegin 9382751 +MimeMessageHeadersEnd 9384087 +MimeEntityBegin 9382751 +MimeEntityHeadersEnd 9384087 +MimeContentBegin 9384087 +MultipartPreambleBegin 9384087 +MultipartPreambleEnd 9384307 +MultipartBoundaryBegin 9384307 +MultipartBoundaryEnd 9384349 +MimeEntityBegin 9384349 +MimeEntityHeadersEnd 9384395 +MimeContentBegin 9384395 +MimeContentEnd 9384998 +MimeEntityEnd 9385000 +MultipartEndBoundaryBegin 9385000 +MultipartEndBoundaryEnd 9385042 +MultipartEpilogueBegin 9385042 +MultipartEpilogueEnd 9385042 +MimeEntityEnd 9385044 +MimeMessageEnd 9385044 +MboxMarkerBegin 9385044 +MboxMarkerEnd 9385051 +MimeMessageBegin 9385053 +MimeMessageHeadersEnd 9386420 +MimeEntityBegin 9385053 +MimeEntityHeadersEnd 9386420 +MimeContentBegin 9386420 +MultipartPreambleBegin 9386420 +MultipartPreambleEnd 9386640 +MultipartBoundaryBegin 9386640 +MultipartBoundaryEnd 9386682 +MimeEntityBegin 9386682 +MimeEntityHeadersEnd 9386728 +MimeContentBegin 9386728 +MimeContentEnd 9386835 +MimeEntityEnd 9386837 +MultipartBoundaryBegin 9386837 +MultipartBoundaryEnd 9386879 +MimeEntityBegin 9386879 +MimeEntityHeadersEnd 9387046 +MimeContentBegin 9387046 +MultipartPreambleBegin 9387046 +MultipartPreambleEnd 9387266 +MultipartBoundaryBegin 9387266 +MultipartBoundaryEnd 9387306 +MimeEntityBegin 9387306 +MimeEntityHeadersEnd 9387416 +MimeContentBegin 9387416 +MimeContentEnd 9387511 +MimeEntityEnd 9387513 +MultipartBoundaryBegin 9387513 +MultipartBoundaryEnd 9387553 +MimeEntityBegin 9387553 +MimeEntityHeadersEnd 9387649 +MimeContentBegin 9387649 +MimeMessageBegin 9387649 +MimeMessageHeadersEnd 9388845 +MimeEntityBegin 9387649 +MimeEntityHeadersEnd 9388845 +MimeContentBegin 9388845 +MimeContentEnd 9389055 +MimeEntityEnd 9389057 +MimeMessageEnd 9389057 +MimeContentEnd 9389057 +MimeEntityEnd 9389057 +MultipartBoundaryBegin 9389057 +MultipartBoundaryEnd 9389097 +MimeEntityBegin 9389097 +MimeEntityHeadersEnd 9389267 +MimeContentBegin 9389267 +MimeContentEnd 9389757 +MimeEntityEnd 9389759 +MultipartEndBoundaryBegin 9389759 +MultipartEndBoundaryEnd 9389799 +MultipartEpilogueBegin 9389799 +MultipartEpilogueEnd 9389799 +MimeEntityEnd 9389801 +MultipartBoundaryBegin 9389801 +MultipartBoundaryEnd 9389843 +MimeEntityBegin 9389843 +MimeEntityHeadersEnd 9390060 +MimeContentBegin 9390060 +MimeContentEnd 9395354 +MimeEntityEnd 9395356 +MultipartEndBoundaryBegin 9395356 +MultipartEndBoundaryEnd 9395398 +MultipartEpilogueBegin 9395398 +MultipartEpilogueEnd 9395402 +MimeEntityEnd 9395404 +MimeMessageEnd 9395404 +MboxMarkerBegin 9395404 +MboxMarkerEnd 9395435 +MimeMessageBegin 9395437 +MimeMessageHeadersEnd 9396672 +MimeEntityBegin 9395437 +MimeEntityHeadersEnd 9396672 +MimeContentBegin 9396672 +MimeContentEnd 9399592 +MimeEntityEnd 9399594 +MimeMessageEnd 9399594 +MboxMarkerBegin 9399594 +MboxMarkerEnd 9399625 +MimeMessageBegin 9399627 +MimeMessageHeadersEnd 9400806 +MimeEntityBegin 9399627 +MimeEntityHeadersEnd 9400806 +MimeContentBegin 9400806 +MimeContentEnd 9402958 +MimeEntityEnd 9402960 +MimeMessageEnd 9402960 +MboxMarkerBegin 9402960 +MboxMarkerEnd 9402991 +MimeMessageBegin 9402993 +MimeMessageHeadersEnd 9404092 +MimeEntityBegin 9402993 +MimeEntityHeadersEnd 9404092 +MimeContentBegin 9404092 +MultipartPreambleBegin 9404092 +MultipartPreambleEnd 9404094 +MultipartBoundaryBegin 9404094 +MultipartBoundaryEnd 9404127 +MimeEntityBegin 9404127 +MimeEntityHeadersEnd 9404194 +MimeContentBegin 9404194 +MimeContentEnd 9404194 +MimeEntityEnd 9404196 +MultipartBoundaryBegin 9404196 +MultipartBoundaryEnd 9404229 +MimeEntityBegin 9404229 +MimeEntityHeadersEnd 9404311 +MimeContentBegin 9404311 +MimeContentEnd 9407065 +MimeEntityEnd 9407067 +MultipartEndBoundaryBegin 9407067 +MultipartEndBoundaryEnd 9407100 +MultipartEpilogueBegin 9407100 +MultipartEpilogueEnd 9407102 +MimeEntityEnd 9407104 +MimeMessageEnd 9407104 +MboxMarkerBegin 9407104 +MboxMarkerEnd 9407135 +MimeMessageBegin 9407137 +MimeMessageHeadersEnd 9408193 +MimeEntityBegin 9407137 +MimeEntityHeadersEnd 9408193 +MimeContentBegin 9408193 +MultipartPreambleBegin 9408193 +MultipartPreambleEnd 9408195 +MultipartBoundaryBegin 9408195 +MultipartBoundaryEnd 9408236 +MimeEntityBegin 9408236 +MimeEntityHeadersEnd 9408317 +MimeContentBegin 9408317 +MimeContentEnd 9408783 +MimeEntityEnd 9408785 +MultipartBoundaryBegin 9408785 +MultipartBoundaryEnd 9408826 +MimeEntityBegin 9408826 +MimeEntityHeadersEnd 9408904 +MimeContentBegin 9408904 +MimeContentEnd 9409741 +MimeEntityEnd 9409743 +MultipartBoundaryBegin 9409743 +MultipartBoundaryEnd 9409784 +MimeEntityBegin 9409784 +MimeEntityHeadersEnd 9409884 +MimeContentBegin 9409884 +MimeContentEnd 9411100 +MimeEntityEnd 9411102 +MultipartEndBoundaryBegin 9411102 +MultipartEndBoundaryEnd 9411143 +MultipartEpilogueBegin 9411143 +MultipartEpilogueEnd 9411145 +MimeEntityEnd 9411147 +MimeMessageEnd 9411147 +MboxMarkerBegin 9411147 +MboxMarkerEnd 9411178 +MimeMessageBegin 9411180 +MimeMessageHeadersEnd 9412276 +MimeEntityBegin 9411180 +MimeEntityHeadersEnd 9412276 +MimeContentBegin 9412276 +MultipartPreambleBegin 9412276 +MultipartPreambleEnd 9412278 +MultipartBoundaryBegin 9412278 +MultipartBoundaryEnd 9412321 +MimeEntityBegin 9412321 +MimeEntityHeadersEnd 9412394 +MimeContentBegin 9412394 +MimeContentEnd 9412553 +MimeEntityEnd 9412555 +MultipartBoundaryBegin 9412555 +MultipartBoundaryEnd 9412598 +MimeEntityBegin 9412598 +MimeEntityHeadersEnd 9412680 +MimeContentBegin 9412680 +MimeContentEnd 9416832 +MimeEntityEnd 9416834 +MultipartEndBoundaryBegin 9416834 +MultipartEndBoundaryEnd 9416877 +MultipartEpilogueBegin 9416877 +MultipartEpilogueEnd 9416879 +MimeEntityEnd 9416881 +MimeMessageEnd 9416881 +MboxMarkerBegin 9416881 +MboxMarkerEnd 9416888 +MimeMessageBegin 9416890 +MimeMessageHeadersEnd 9417456 +MimeEntityBegin 9416890 +MimeEntityHeadersEnd 9417456 +MimeContentBegin 9417456 +MultipartPreambleBegin 9417456 +MultipartPreambleEnd 9417458 +MultipartBoundaryBegin 9417458 +MultipartBoundaryEnd 9417502 +MimeEntityBegin 9417502 +MimeEntityHeadersEnd 9417569 +MimeContentBegin 9417569 +MimeContentEnd 9417727 +MimeEntityEnd 9417729 +MultipartBoundaryBegin 9417729 +MultipartBoundaryEnd 9417773 +MimeEntityBegin 9417773 +MimeEntityHeadersEnd 9417928 +MimeContentBegin 9417928 +MimeContentEnd 9421898 +MimeEntityEnd 9421900 +MultipartEndBoundaryBegin 9421900 +MultipartEndBoundaryEnd 9421944 +MultipartEpilogueBegin 9421944 +MultipartEpilogueEnd 9421944 +MimeEntityEnd 9421946 +MimeMessageEnd 9421946 +MboxMarkerBegin 9421946 +MboxMarkerEnd 9421977 +MimeMessageBegin 9421979 +MimeMessageHeadersEnd 9423163 +MimeEntityBegin 9421979 +MimeEntityHeadersEnd 9423163 +MimeContentBegin 9423163 +MultipartPreambleBegin 9423163 +MultipartPreambleEnd 9423303 +MultipartBoundaryBegin 9423303 +MultipartBoundaryEnd 9423344 +MimeEntityBegin 9423344 +MimeEntityHeadersEnd 9423425 +MimeContentBegin 9423425 +MimeContentEnd 9423502 +MimeEntityEnd 9423504 +MultipartBoundaryBegin 9423504 +MultipartBoundaryEnd 9423545 +MimeEntityBegin 9423545 +MimeEntityHeadersEnd 9423643 +MimeContentBegin 9423643 +MimeContentEnd 9427249 +MimeEntityEnd 9427251 +MultipartEndBoundaryBegin 9427251 +MultipartEndBoundaryEnd 9427292 +MultipartEpilogueBegin 9427292 +MultipartEpilogueEnd 9427294 +MimeEntityEnd 9427296 +MimeMessageEnd 9427296 +MboxMarkerBegin 9427296 +MboxMarkerEnd 9427327 +MimeMessageBegin 9427329 +MimeMessageHeadersEnd 9428452 +MimeEntityBegin 9427329 +MimeEntityHeadersEnd 9428452 +MimeContentBegin 9428452 +MultipartPreambleBegin 9428452 +MultipartPreambleEnd 9428454 +MultipartBoundaryBegin 9428454 +MultipartBoundaryEnd 9428488 +MimeEntityBegin 9428488 +MimeEntityHeadersEnd 9428569 +MimeContentBegin 9428569 +MimeContentEnd 9428647 +MimeEntityEnd 9428649 +MultipartBoundaryBegin 9428649 +MultipartBoundaryEnd 9428683 +MimeEntityBegin 9428683 +MimeEntityHeadersEnd 9428765 +MimeContentBegin 9428765 +MimeContentEnd 9432539 +MimeEntityEnd 9432541 +MultipartEndBoundaryBegin 9432541 +MultipartEndBoundaryEnd 9432575 +MultipartEpilogueBegin 9432575 +MultipartEpilogueEnd 9432575 +MimeEntityEnd 9432577 +MimeMessageEnd 9432577 +MboxMarkerBegin 9432577 +MboxMarkerEnd 9432608 +MimeMessageBegin 9432610 +MimeMessageHeadersEnd 9433755 +MimeEntityBegin 9432610 +MimeEntityHeadersEnd 9433755 +MimeContentBegin 9433755 +MultipartPreambleBegin 9433755 +MultipartPreambleEnd 9433872 +MultipartBoundaryBegin 9433872 +MultipartBoundaryEnd 9433897 +MimeEntityBegin 9433897 +MimeEntityHeadersEnd 9433938 +MimeContentBegin 9433938 +MimeContentEnd 9434132 +MimeEntityEnd 9434134 +MultipartBoundaryBegin 9434134 +MultipartBoundaryEnd 9434159 +MimeEntityBegin 9434159 +MimeEntityHeadersEnd 9434191 +MimeContentBegin 9434191 +MimeMessageBegin 9434191 +MimeMessageHeadersEnd 9435012 +MimeEntityBegin 9434191 +MimeEntityHeadersEnd 9435012 +MimeContentBegin 9435012 +MimeContentEnd 9435023 +MimeEntityEnd 9435025 +MimeMessageEnd 9435025 +MimeContentEnd 9435025 +MimeEntityEnd 9435025 +MultipartEndBoundaryBegin 9435025 +MultipartEndBoundaryEnd 9435050 +MultipartEpilogueBegin 9435050 +MultipartEpilogueEnd 9435052 +MimeEntityEnd 9435054 +MimeMessageEnd 9435054 +MboxMarkerBegin 9435054 +MboxMarkerEnd 9435099 +MimeMessageBegin 9435101 +MimeMessageHeadersEnd 9435272 +MimeEntityBegin 9435101 +MimeEntityHeadersEnd 9435272 +MimeContentBegin 9435272 +MimeContentEnd 9470358 +MimeEntityEnd 9470360 +MimeMessageEnd 9470360 +MboxMarkerBegin 9470360 +MboxMarkerEnd 9470405 +MimeMessageBegin 9470407 +MimeMessageHeadersEnd 9470571 +MimeEntityBegin 9470407 +MimeEntityHeadersEnd 9470571 +MimeContentBegin 9470571 +MimeContentEnd 9505657 +MimeEntityEnd 9505659 +MimeMessageEnd 9505659 +MboxMarkerBegin 9505659 +MboxMarkerEnd 9505666 +MimeMessageBegin 9505668 +MimeMessageHeadersEnd 9506276 +MimeEntityBegin 9505668 +MimeEntityHeadersEnd 9506276 +MimeContentBegin 9506276 +MimeContentEnd 9507714 +MimeEntityEnd 9507716 +MimeMessageEnd 9507716 +MboxMarkerBegin 9507716 +MboxMarkerEnd 9507723 +MimeMessageBegin 9507725 +MimeMessageHeadersEnd 9508642 +MimeEntityBegin 9507725 +MimeEntityHeadersEnd 9508642 +MimeContentBegin 9508642 +MultipartPreambleBegin 9508642 +MultipartPreambleEnd 9508642 +MultipartBoundaryBegin 9508642 +MultipartBoundaryEnd 9508682 +MimeEntityBegin 9508682 +MimeEntityHeadersEnd 9508710 +MimeContentBegin 9508710 +MimeContentEnd 9509065 +MimeEntityEnd 9509067 +MultipartBoundaryBegin 9509067 +MultipartBoundaryEnd 9509107 +MimeEntityBegin 9509107 +MimeEntityHeadersEnd 9509204 +MimeContentBegin 9509204 +MimeContentEnd 9754734 +MimeEntityEnd 9754736 +MultipartEndBoundaryBegin 9754736 +MultipartEndBoundaryEnd 9754776 +MultipartEpilogueBegin 9754776 +MultipartEpilogueEnd 9754778 +MimeEntityEnd 9754780 +MimeMessageEnd 9754780 +MboxMarkerBegin 9754780 +MboxMarkerEnd 9754787 +MimeMessageBegin 9754789 +MimeMessageHeadersEnd 9755397 +MimeEntityBegin 9754789 +MimeEntityHeadersEnd 9755397 +MimeContentBegin 9755397 +MultipartPreambleBegin 9755397 +MultipartPreambleEnd 9755433 +MultipartBoundaryBegin 9755433 +MultipartBoundaryEnd 9755461 +MimeEntityBegin 9755461 +MimeEntityHeadersEnd 9755625 +MimeContentBegin 9755625 +MimeContentEnd 9834319 +MimeEntityEnd 9834321 +MultipartEndBoundaryBegin 9834321 +MultipartEndBoundaryEnd 9834349 +MultipartEpilogueBegin 9834349 +MultipartEpilogueEnd 9834353 +MimeEntityEnd 9834355 +MimeMessageEnd 9834355 +MboxMarkerBegin 9834355 +MboxMarkerEnd 9834362 +MimeMessageBegin 9834364 +MimeMessageHeadersEnd 9834521 +MimeEntityBegin 9834364 +MimeEntityHeadersEnd 9834521 +MimeContentBegin 9834521 +MimeContentEnd 9838129 +MimeEntityEnd 9838131 +MimeMessageEnd 9838131 +MboxMarkerBegin 9838131 +MboxMarkerEnd 9838138 +MimeMessageBegin 9838140 +MimeMessageHeadersEnd 9838928 +MimeEntityBegin 9838140 +MimeEntityHeadersEnd 9838928 +MimeContentBegin 9838928 +MultipartPreambleBegin 9838928 +MultipartPreambleEnd 9839086 +MultipartBoundaryBegin 9839086 +MultipartBoundaryEnd 9839127 +MimeEntityBegin 9839127 +MimeEntityHeadersEnd 9839173 +MimeContentBegin 9839173 +MimeContentEnd 9839594 +MimeEntityEnd 9839596 +MultipartBoundaryBegin 9839596 +MultipartBoundaryEnd 9839637 +MimeEntityBegin 9839637 +MimeEntityHeadersEnd 9839725 +MimeContentBegin 9839725 +MultipartPreambleBegin 9839725 +MultipartPreambleEnd 9839725 +MultipartBoundaryBegin 9839725 +MultipartBoundaryEnd 9839768 +MimeEntityBegin 9839768 +MimeEntityHeadersEnd 9839862 +MimeContentBegin 9839862 +MimeContentEnd 9839934 +MimeEntityEnd 9839936 +MultipartBoundaryBegin 9839936 +MultipartBoundaryEnd 9839979 +MimeEntityBegin 9839979 +MimeEntityHeadersEnd 9840082 +MimeContentBegin 9840082 +MimeContentEnd 9850936 +MimeEntityEnd 9850938 +MultipartBoundaryBegin 9850938 +MultipartBoundaryEnd 9850981 +MimeEntityBegin 9850981 +MimeEntityHeadersEnd 9851075 +MimeContentBegin 9851075 +MimeContentEnd 9851141 +MimeEntityEnd 9851143 +MultipartBoundaryBegin 9851143 +MultipartBoundaryEnd 9851186 +MimeEntityBegin 9851186 +MimeEntityHeadersEnd 9851283 +MimeContentBegin 9851283 +MimeContentEnd 9857273 +MimeEntityEnd 9857275 +MultipartBoundaryBegin 9857275 +MultipartBoundaryEnd 9857318 +MimeEntityBegin 9857318 +MimeEntityHeadersEnd 9857412 +MimeContentBegin 9857412 +MimeContentEnd 9857447 +MimeEntityEnd 9857449 +MultipartBoundaryBegin 9857449 +MultipartBoundaryEnd 9857492 +MimeEntityBegin 9857492 +MimeEntityHeadersEnd 9857597 +MimeContentBegin 9857597 +MimeContentEnd 9869413 +MimeEntityEnd 9869415 +MultipartBoundaryBegin 9869415 +MultipartBoundaryEnd 9869458 +MimeEntityBegin 9869458 +MimeEntityHeadersEnd 9869552 +MimeContentBegin 9869552 +MimeContentEnd 9869585 +MimeEntityEnd 9869587 +MultipartEndBoundaryBegin 9869587 +MultipartEndBoundaryEnd 9869630 +MultipartEpilogueBegin 9869630 +MultipartEpilogueEnd 9869632 +MimeEntityEnd 9869634 +MultipartEndBoundaryBegin 9869634 +MultipartEndBoundaryEnd 9869675 +MultipartEpilogueBegin 9869675 +MultipartEpilogueEnd 9869675 +MimeEntityEnd 9869677 +MimeMessageEnd 9869677 +MboxMarkerBegin 9869677 +MboxMarkerEnd 9869684 +MimeMessageBegin 9869686 +MimeMessageHeadersEnd 9869745 +MimeEntityBegin 9869686 +MimeEntityHeadersEnd 9869745 +MimeContentBegin 9869745 +MimeContentEnd 9870980 +MimeEntityEnd 9870982 +MimeMessageEnd 9870982 +MboxMarkerBegin 9870982 +MboxMarkerEnd 9871013 +MimeMessageBegin 9871015 +MimeMessageHeadersEnd 9871171 +MimeEntityBegin 9871015 +MimeEntityHeadersEnd 9871171 +MimeContentBegin 9871171 +MimeContentEnd 9874346 +MimeEntityEnd 9874348 +MimeMessageEnd 9874348 +MboxMarkerBegin 9874348 +MboxMarkerEnd 9874379 +MimeMessageBegin 9874381 +MimeMessageHeadersEnd 9876277 +MimeEntityBegin 9874381 +MimeEntityHeadersEnd 9876277 +MimeContentBegin 9876277 +MultipartPreambleBegin 9876277 +MultipartPreambleEnd 9876277 +MultipartBoundaryBegin 9876277 +MultipartBoundaryEnd 9876322 +MimeEntityBegin 9876322 +MimeEntityHeadersEnd 9876403 +MimeContentBegin 9876403 +MimeContentEnd 9877284 +MimeEntityEnd 9877286 +MultipartBoundaryBegin 9877286 +MultipartBoundaryEnd 9877331 +MimeEntityBegin 9877331 +MimeEntityHeadersEnd 9877497 +MimeContentBegin 9877497 +MimeContentEnd 9881199 +MimeEntityEnd 9881201 +MultipartEndBoundaryBegin 9881201 +MultipartEndBoundaryEnd 9881246 +MultipartEpilogueBegin 9881246 +MultipartEpilogueEnd 9881248 +MimeEntityEnd 9881250 +MimeMessageEnd 9881250 +MboxMarkerBegin 9881250 +MboxMarkerEnd 9881257 +MimeMessageBegin 9881259 +MimeMessageHeadersEnd 9881826 +MimeEntityBegin 9881259 +MimeEntityHeadersEnd 9881826 +MimeContentBegin 9881826 +MultipartPreambleBegin 9881826 +MultipartPreambleEnd 9881828 +MultipartBoundaryBegin 9881828 +MultipartBoundaryEnd 9881845 +MimeEntityBegin 9881845 +MimeEntityHeadersEnd 9881874 +MimeContentBegin 9881874 +MimeContentEnd 9882856 +MimeEntityEnd 9882858 +MultipartBoundaryBegin 9882858 +MultipartBoundaryEnd 9882875 +MimeEntityBegin 9882875 +MimeEntityHeadersEnd 9882938 +MimeContentBegin 9882938 +MimeContentEnd 10000250 +MimeEntityEnd 10000252 +MultipartEndBoundaryBegin 10000252 +MultipartEndBoundaryEnd 10000269 +MultipartEpilogueBegin 10000269 +MultipartEpilogueEnd 10000273 +MimeEntityEnd 10000275 +MimeMessageEnd 10000275 +MboxMarkerBegin 10000275 +MboxMarkerEnd 10000282 +MimeMessageBegin 10000284 +MimeMessageHeadersEnd 10001099 +MimeEntityBegin 10000284 +MimeEntityHeadersEnd 10001099 +MimeContentBegin 10001099 +MultipartPreambleBegin 10001099 +MultipartPreambleEnd 10001257 +MultipartBoundaryBegin 10001257 +MultipartBoundaryEnd 10001298 +MimeEntityBegin 10001298 +MimeEntityHeadersEnd 10001344 +MimeContentBegin 10001344 +MimeContentEnd 10010656 +MimeEntityEnd 10010658 +MultipartBoundaryBegin 10010658 +MultipartBoundaryEnd 10010699 +MimeEntityBegin 10010699 +MimeEntityHeadersEnd 10010787 +MimeContentBegin 10010787 +MultipartPreambleBegin 10010787 +MultipartPreambleEnd 10010787 +MultipartBoundaryBegin 10010787 +MultipartBoundaryEnd 10010830 +MimeEntityBegin 10010830 +MimeEntityHeadersEnd 10010924 +MimeContentBegin 10010924 +MimeContentEnd 10013768 +MimeEntityEnd 10013770 +MultipartBoundaryBegin 10013770 +MultipartBoundaryEnd 10013813 +MimeEntityBegin 10013813 +MimeEntityHeadersEnd 10014016 +MimeContentBegin 10014016 +MimeMessageBegin 10014016 +MimeMessageHeadersEnd 10014045 +MimeEntityBegin 10014016 +MimeEntityHeadersEnd 10014045 +MimeContentBegin 10014045 +MimeContentEnd 10014049 +MimeEntityEnd 10014051 +MimeMessageEnd 10014051 +MimeContentEnd 10014051 +MimeEntityEnd 10014051 +MultipartBoundaryBegin 10014051 +MultipartBoundaryEnd 10014094 +MimeEntityBegin 10014094 +MimeEntityHeadersEnd 10014188 +MimeContentBegin 10014188 +MimeContentEnd 10015184 +MimeEntityEnd 10015186 +MultipartBoundaryBegin 10015186 +MultipartBoundaryEnd 10015229 +MimeEntityBegin 10015229 +MimeEntityHeadersEnd 10015349 +MimeContentBegin 10015349 +MimeContentEnd 10015723 +MimeEntityEnd 10015725 +MultipartBoundaryBegin 10015725 +MultipartBoundaryEnd 10015768 +MimeEntityBegin 10015768 +MimeEntityHeadersEnd 10015862 +MimeContentBegin 10015862 +MimeContentEnd 10015874 +MimeEntityEnd 10015876 +MultipartBoundaryBegin 10015876 +MultipartBoundaryEnd 10015919 +MimeEntityBegin 10015919 +MimeEntityHeadersEnd 10016110 +MimeContentBegin 10016110 +MimeMessageBegin 10016110 +MimeMessageHeadersEnd 10016139 +MimeEntityBegin 10016110 +MimeEntityHeadersEnd 10016139 +MimeContentBegin 10016139 +MimeContentEnd 10016141 +MimeEntityEnd 10016143 +MimeMessageEnd 10016143 +MimeContentEnd 10016143 +MimeEntityEnd 10016143 +MultipartBoundaryBegin 10016143 +MultipartBoundaryEnd 10016186 +MimeEntityBegin 10016186 +MimeEntityHeadersEnd 10016280 +MimeContentBegin 10016280 +MimeContentEnd 10016292 +MimeEntityEnd 10016294 +MultipartBoundaryBegin 10016294 +MultipartBoundaryEnd 10016337 +MimeEntityBegin 10016337 +MimeEntityHeadersEnd 10016447 +MimeContentBegin 10016447 +MimeContentEnd 10019473 +MimeEntityEnd 10019475 +MultipartBoundaryBegin 10019475 +MultipartBoundaryEnd 10019518 +MimeEntityBegin 10019518 +MimeEntityHeadersEnd 10019612 +MimeContentBegin 10019612 +MimeContentEnd 10026464 +MimeEntityEnd 10026466 +MultipartEndBoundaryBegin 10026466 +MultipartEndBoundaryEnd 10026509 +MultipartEpilogueBegin 10026509 +MultipartEpilogueEnd 10026511 +MimeEntityEnd 10026513 +MultipartEndBoundaryBegin 10026513 +MultipartEndBoundaryEnd 10026554 +MultipartEpilogueBegin 10026554 +MultipartEpilogueEnd 10026556 +MimeEntityEnd 10026558 +MimeMessageEnd 10026558 +MboxMarkerBegin 10026558 +MboxMarkerEnd 10026565 +MimeMessageBegin 10026567 +MimeMessageHeadersEnd 10027702 +MimeEntityBegin 10026567 +MimeEntityHeadersEnd 10027702 +MimeContentBegin 10027702 +MultipartPreambleBegin 10027702 +MultipartPreambleEnd 10027702 +MultipartBoundaryBegin 10027702 +MultipartBoundaryEnd 10027713 +MimeEntityBegin 10027713 +MimeEntityHeadersEnd 10027715 +MimeContentBegin 10027715 +MimeContentEnd 10028056 +MimeEntityEnd 10028058 +MultipartBoundaryBegin 10028058 +MultipartBoundaryEnd 10028069 +MimeEntityBegin 10028069 +MimeEntityHeadersEnd 10028131 +MimeContentBegin 10028131 +MimeContentEnd 10058521 +MimeEntityEnd 10058523 +MultipartBoundaryBegin 10058523 +MultipartBoundaryEnd 10058534 +MimeEntityBegin 10058534 +MimeEntityHeadersEnd 10058536 +MimeContentBegin 10058536 +MimeContentEnd 10058717 +MimeEntityEnd 10058719 +MultipartEndBoundaryBegin 10058719 +MultipartEndBoundaryEnd 10058730 +MultipartEpilogueBegin 10058730 +MultipartEpilogueEnd 10058732 +MimeEntityEnd 10058734 +MimeMessageEnd 10058734 +MboxMarkerBegin 10058734 +MboxMarkerEnd 10058741 +MimeMessageBegin 10058743 +MimeMessageHeadersEnd 10060481 +MimeEntityBegin 10058743 +MimeEntityHeadersEnd 10060481 +MimeContentBegin 10060481 +MimeContentEnd 10246231 +MimeEntityEnd 10246233 +MimeMessageEnd 10246233 +MboxMarkerBegin 10246233 +MboxMarkerEnd 10246240 +MimeMessageBegin 10246242 +MimeMessageHeadersEnd 10246965 +MimeEntityBegin 10246242 +MimeEntityHeadersEnd 10246965 +MimeContentBegin 10246965 +MultipartPreambleBegin 10246965 +MultipartPreambleEnd 10246965 +MultipartBoundaryBegin 10246965 +MultipartBoundaryEnd 10246993 +MimeEntityBegin 10246993 +MimeEntityHeadersEnd 10246995 +MimeContentBegin 10246995 +MimeContentEnd 10247016 +MimeEntityEnd 10247018 +MultipartBoundaryBegin 10247018 +MultipartBoundaryEnd 10247046 +MimeEntityBegin 10247046 +MimeEntityHeadersEnd 10247203 +MimeContentBegin 10247203 +MimeContentEnd 10331377 +MimeEntityEnd 10331379 +MultipartBoundaryBegin 10331379 +MultipartBoundaryEnd 10331407 +MimeEntityBegin 10331407 +MimeEntityHeadersEnd 10331409 +MimeContentBegin 10331409 +MimeContentEnd 10331676 +MimeEntityEnd 10331678 +MultipartEndBoundaryBegin 10331678 +MultipartEndBoundaryEnd 10331706 +MultipartEpilogueBegin 10331706 +MultipartEpilogueEnd 10331708 +MimeEntityEnd 10331710 +MimeMessageEnd 10331710 +MboxMarkerBegin 10331710 +MboxMarkerEnd 10331717 +MimeMessageBegin 10331719 +MimeMessageHeadersEnd 10332401 +MimeEntityBegin 10331719 +MimeEntityHeadersEnd 10332401 +MimeContentBegin 10332401 +MultipartPreambleBegin 10332401 +MultipartPreambleEnd 10332401 +MultipartBoundaryBegin 10332401 +MultipartBoundaryEnd 10332429 +MimeEntityBegin 10332429 +MimeEntityHeadersEnd 10332431 +MimeContentBegin 10332431 +MimeContentEnd 10332497 +MimeEntityEnd 10332499 +MultipartBoundaryBegin 10332499 +MultipartBoundaryEnd 10332527 +MimeEntityBegin 10332527 +MimeEntityHeadersEnd 10332693 +MimeContentBegin 10332693 +MimeContentEnd 10365025 +MimeEntityEnd 10365027 +MultipartBoundaryBegin 10365027 +MultipartBoundaryEnd 10365055 +MimeEntityBegin 10365055 +MimeEntityHeadersEnd 10365057 +MimeContentBegin 10365057 +MimeContentEnd 10365075 +MimeEntityEnd 10365077 +MultipartBoundaryBegin 10365077 +MultipartBoundaryEnd 10365105 +MimeEntityBegin 10365105 +MimeEntityHeadersEnd 10365269 +MimeContentBegin 10365269 +MimeContentEnd 10366359 +MimeEntityEnd 10366361 +MultipartBoundaryBegin 10366361 +MultipartBoundaryEnd 10366389 +MimeEntityBegin 10366389 +MimeEntityHeadersEnd 10366391 +MimeContentBegin 10366391 +MimeContentEnd 10366423 +MimeEntityEnd 10366425 +MultipartBoundaryBegin 10366425 +MultipartBoundaryEnd 10366453 +MimeEntityBegin 10366453 +MimeEntityHeadersEnd 10366524 +MimeContentBegin 10366524 +MimeContentEnd 10554551 +MimeEntityEnd 10554553 +MultipartBoundaryBegin 10554553 +MultipartBoundaryEnd 10554581 +MimeEntityBegin 10554581 +MimeEntityHeadersEnd 10554583 +MimeContentBegin 10554583 +MimeContentEnd 10554591 +MimeEntityEnd 10554593 +MultipartEndBoundaryBegin 10554593 +MultipartEndBoundaryEnd 10554621 +MultipartEpilogueBegin 10554621 +MultipartEpilogueEnd 10554623 +MimeEntityEnd 10554625 +MimeMessageEnd 10554625 +MboxMarkerBegin 10554625 +MboxMarkerEnd 10554632 +MimeMessageBegin 10554634 +MimeMessageHeadersEnd 10554906 +MimeEntityBegin 10554634 +MimeEntityHeadersEnd 10554906 +MimeContentBegin 10554906 +MimeContentEnd 10630586 +MimeEntityEnd 10630588 +MimeMessageEnd 10630588 +MboxMarkerBegin 10630588 +MboxMarkerEnd 10630595 +MimeMessageBegin 10630597 +MimeMessageHeadersEnd 10631896 +MimeEntityBegin 10630597 +MimeEntityHeadersEnd 10631896 +MimeContentBegin 10631896 +MultipartPreambleBegin 10631896 +MultipartPreambleEnd 10632430 +MultipartBoundaryBegin 10632430 +MultipartBoundaryEnd 10632489 +MimeEntityBegin 10632489 +MimeEntityHeadersEnd 10632491 +MimeContentBegin 10632491 +MimeContentEnd 10634372 +MimeEntityEnd 10634374 +MultipartBoundaryBegin 10634374 +MultipartBoundaryEnd 10634433 +MimeEntityBegin 10634433 +MimeEntityHeadersEnd 10634539 +MimeContentBegin 10634539 +MultipartPreambleBegin 10634539 +MultipartPreambleEnd 10634539 +MultipartBoundaryBegin 10634539 +MultipartBoundaryEnd 10634600 +MimeEntityBegin 10634600 +MimeEntityHeadersEnd 10634676 +MimeContentBegin 10634676 +MimeContentEnd 10636704 +MimeEntityEnd 10636706 +MultipartBoundaryBegin 10636706 +MultipartBoundaryEnd 10636767 +MimeEntityBegin 10636767 +MimeEntityHeadersEnd 10636829 +MimeContentBegin 10636829 +MimeContentEnd 10644867 +MimeEntityEnd 10644869 +MultipartBoundaryBegin 10644869 +MultipartBoundaryEnd 10644930 +MimeEntityBegin 10644930 +MimeEntityHeadersEnd 10645003 +MimeContentBegin 10645003 +MimeContentEnd 10645008 +MimeEntityEnd 10645010 +MultipartBoundaryBegin 10645010 +MultipartBoundaryEnd 10645071 +MimeEntityBegin 10645071 +MimeEntityHeadersEnd 10645168 +MimeContentBegin 10645168 +MimeContentEnd 10687620 +MimeEntityEnd 10687622 +MultipartEndBoundaryBegin 10687622 +MultipartEndBoundaryEnd 10687683 +MultipartEpilogueBegin 10687683 +MultipartEpilogueEnd 10687685 +MimeEntityEnd 10687687 +MultipartEndBoundaryBegin 10687687 +MultipartEndBoundaryEnd 10687746 +MultipartEpilogueBegin 10687746 +MultipartEpilogueEnd 10687748 +MimeEntityEnd 10687750 +MimeMessageEnd 10687750 +MboxMarkerBegin 10687750 +MboxMarkerEnd 10687757 +MimeMessageBegin 10687759 +MimeMessageHeadersEnd 10687916 +MimeEntityBegin 10687759 +MimeEntityHeadersEnd 10687916 +MimeContentBegin 10687916 +MimeContentEnd 10692786 +MimeEntityEnd 10692788 +MimeMessageEnd 10692788 +MboxMarkerBegin 10692788 +MboxMarkerEnd 10692795 +MimeMessageBegin 10692797 +MimeMessageHeadersEnd 10693559 +MimeEntityBegin 10692797 +MimeEntityHeadersEnd 10693559 +MimeContentBegin 10693559 +MultipartPreambleBegin 10693559 +MultipartPreambleEnd 10693904 +MultipartBoundaryBegin 10693904 +MultipartBoundaryEnd 10693945 +MimeEntityBegin 10693945 +MimeEntityHeadersEnd 10693947 +MimeContentBegin 10693947 +MimeContentEnd 10694323 +MimeEntityEnd 10694325 +MultipartBoundaryBegin 10694325 +MultipartBoundaryEnd 10694366 +MimeEntityBegin 10694366 +MimeEntityHeadersEnd 10694454 +MimeContentBegin 10694454 +MultipartPreambleBegin 10694454 +MultipartPreambleEnd 10694454 +MultipartBoundaryBegin 10694454 +MultipartBoundaryEnd 10694497 +MimeEntityBegin 10694497 +MimeEntityHeadersEnd 10694570 +MimeContentBegin 10694570 +MimeContentEnd 10694663 +MimeEntityEnd 10694665 +MultipartBoundaryBegin 10694665 +MultipartBoundaryEnd 10694708 +MimeEntityBegin 10694708 +MimeEntityHeadersEnd 10694826 +MimeContentBegin 10694826 +MimeContentEnd 10700572 +MimeEntityEnd 10700574 +MultipartBoundaryBegin 10700574 +MultipartBoundaryEnd 10700617 +MimeEntityBegin 10700617 +MimeEntityHeadersEnd 10700690 +MimeContentBegin 10700690 +MimeContentEnd 10700899 +MimeEntityEnd 10700901 +MultipartEndBoundaryBegin 10700901 +MultipartEndBoundaryEnd 10700944 +MultipartEpilogueBegin 10700944 +MultipartEpilogueEnd 10700946 +MimeEntityEnd 10700948 +MultipartEndBoundaryBegin 10700948 +MultipartEndBoundaryEnd 10700989 +MultipartEpilogueBegin 10700989 +MultipartEpilogueEnd 10700991 +MimeEntityEnd 10700991 +MimeMessageEnd 10700991 From df9aa492b6b512e187c8d089e617ffd527e2c82c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 12:00:57 -0400 Subject: [PATCH 624/741] Conditionally define MONO and fixed .travis.yml to do so --- .travis.yml | 2 +- UnitTests/UnitTests.csproj | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 11485b238f..65c7047fb1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,5 +4,5 @@ solution: MimeKit.sln install: - dotnet restore MimeKit.sln script: - - msbuild /p:Configuration=Debug "/p:DefineConstants=$(DefineConstants);MONO" MimeKit.sln + - msbuild /p:Configuration=Debug /p:MonoRuntime=true MimeKit.sln - mono ~/.nuget/packages/nunit.consolerunner/3.11.1/tools/nunit3-console.exe UnitTests/bin/Debug/net48/UnitTests.dll diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 58facc63db..9cf6fc99ac 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -6,6 +6,7 @@ true Full true + $(DefineConstants);MONO ..\MimeKit\mimekit.snk false false From 56fac4018c27ba5f9346362a9e9ba7b5f1fc0747 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 12:12:31 -0400 Subject: [PATCH 625/741] Added unix offsets for MimeParser tests --- .../mbox/content-length.unix-offsets.txt | 952 +++ UnitTests/TestData/mbox/jwz.unix-offsets.txt | 6896 +++++++++++++++++ UnitTests/UnitTests.csproj | 2 +- 3 files changed, 7849 insertions(+), 1 deletion(-) create mode 100644 UnitTests/TestData/mbox/content-length.unix-offsets.txt create mode 100644 UnitTests/TestData/mbox/jwz.unix-offsets.txt diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt new file mode 100644 index 0000000000..e4870b2060 --- /dev/null +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -0,0 +1,952 @@ +MboxMarkerBegin 0 +MboxMarkerEnd 7 +MimeMessageBegin 8 +MimeMessageHeadersEnd 657 +MimeEntityBegin 8 +MimeEntityHeadersEnd 657 +MimeContentBegin 657 +MultipartPreambleBegin 657 +MultipartPreambleEnd 657 +MultipartBoundaryBegin 657 +MultipartBoundaryEnd 706 +MimeEntityBegin 706 +MimeEntityHeadersEnd 732 +MimeContentBegin 732 +MimeContentEnd 806 +MimeEntityEnd 807 +MultipartBoundaryBegin 807 +MultipartBoundaryEnd 856 +MimeEntityBegin 856 +MimeEntityHeadersEnd 918 +MimeContentBegin 918 +MimeMessageBegin 918 +MimeMessageHeadersEnd 1700 +MimeEntityBegin 918 +MimeEntityHeadersEnd 1700 +MimeContentBegin 1700 +MimeContentEnd 1837 +MimeEntityEnd 1838 +MimeMessageEnd 1838 +MimeContentEnd 1838 +MimeEntityEnd 1838 +MultipartEndBoundaryBegin 1838 +MultipartEndBoundaryEnd 1888 +MultipartEpilogueBegin 1888 +MultipartEpilogueEnd 1888 +MimeEntityEnd 1889 +MimeMessageEnd 1889 +MboxMarkerBegin 1889 +MboxMarkerEnd 1896 +MimeMessageBegin 1897 +MimeMessageHeadersEnd 2365 +MimeEntityBegin 1897 +MimeEntityHeadersEnd 2365 +MimeContentBegin 2365 +MultipartPreambleBegin 2365 +MultipartPreambleEnd 2411 +MultipartBoundaryBegin 2411 +MultipartBoundaryEnd 2438 +MimeEntityBegin 2438 +MimeEntityHeadersEnd 2582 +MimeContentBegin 2582 +MimeMessageBegin 2582 +MimeMessageHeadersEnd 3011 +MimeEntityBegin 2582 +MimeEntityHeadersEnd 3011 +MimeContentBegin 3011 +MimeContentEnd 3048 +MimeEntityEnd 3049 +MimeMessageEnd 3049 +MimeContentEnd 3049 +MimeEntityEnd 3049 +MultipartBoundaryBegin 3049 +MultipartBoundaryEnd 3076 +MimeEntityBegin 3076 +MimeEntityHeadersEnd 3199 +MimeContentBegin 3199 +MimeContentEnd 3657 +MimeEntityEnd 3658 +MultipartBoundaryBegin 3658 +MultipartBoundaryEnd 3685 +MimeEntityBegin 3685 +MimeEntityHeadersEnd 3808 +MimeContentBegin 3808 +MimeContentEnd 4294 +MimeEntityEnd 4295 +MultipartBoundaryBegin 4295 +MultipartBoundaryEnd 4322 +MimeEntityBegin 4322 +MimeEntityHeadersEnd 4449 +MimeContentBegin 4449 +MimeContentEnd 4976 +MimeEntityEnd 4977 +MultipartBoundaryBegin 4977 +MultipartBoundaryEnd 5004 +MimeEntityBegin 5004 +MimeEntityHeadersEnd 5129 +MimeContentBegin 5129 +MimeContentEnd 5627 +MimeEntityEnd 5628 +MultipartBoundaryBegin 5628 +MultipartBoundaryEnd 5655 +MimeEntityBegin 5655 +MimeEntityHeadersEnd 5799 +MimeContentBegin 5799 +MimeMessageBegin 5799 +MimeMessageHeadersEnd 6228 +MimeEntityBegin 5799 +MimeEntityHeadersEnd 6228 +MimeContentBegin 6228 +MimeContentEnd 6265 +MimeEntityEnd 6266 +MimeMessageEnd 6266 +MimeContentEnd 6266 +MimeEntityEnd 6266 +MultipartBoundaryBegin 6266 +MultipartBoundaryEnd 6293 +MimeEntityBegin 6293 +MimeEntityHeadersEnd 6464 +MimeContentBegin 6464 +MimeMessageBegin 6464 +MimeMessageHeadersEnd 7034 +MimeEntityBegin 6464 +MimeEntityHeadersEnd 7034 +MimeContentBegin 7034 +MimeMessageBegin 7034 +MimeMessageHeadersEnd 7545 +MimeEntityBegin 7034 +MimeEntityHeadersEnd 7545 +MimeContentBegin 7545 +MimeMessageBegin 7545 +MimeMessageHeadersEnd 7955 +MimeEntityBegin 7545 +MimeEntityHeadersEnd 7955 +MimeContentBegin 7955 +MimeContentEnd 7960 +MimeEntityEnd 7961 +MimeMessageEnd 7961 +MimeContentEnd 7961 +MimeEntityEnd 7961 +MimeMessageEnd 7961 +MimeContentEnd 7961 +MimeEntityEnd 7961 +MimeMessageEnd 7961 +MimeContentEnd 7961 +MimeEntityEnd 7961 +MultipartBoundaryBegin 7961 +MultipartBoundaryEnd 7988 +MimeEntityBegin 7988 +MimeEntityHeadersEnd 8041 +MimeContentBegin 8041 +MimeContentEnd 8093 +MimeEntityEnd 8094 +MultipartEndBoundaryBegin 8094 +MultipartEndBoundaryEnd 8122 +MultipartEpilogueBegin 8122 +MultipartEpilogueEnd 8122 +MimeEntityEnd 8123 +MimeMessageEnd 8123 +MboxMarkerBegin 8123 +MboxMarkerEnd 8130 +MimeMessageBegin 8131 +MimeMessageHeadersEnd 8602 +MimeEntityBegin 8131 +MimeEntityHeadersEnd 8602 +MimeContentBegin 8602 +MultipartPreambleBegin 8602 +MultipartPreambleEnd 8648 +MultipartBoundaryBegin 8648 +MultipartBoundaryEnd 8675 +MimeEntityBegin 8675 +MimeEntityHeadersEnd 8823 +MimeContentBegin 8823 +MimeMessageBegin 8823 +MimeMessageHeadersEnd 9251 +MimeEntityBegin 8823 +MimeEntityHeadersEnd 9251 +MimeContentBegin 9251 +MimeContentEnd 9288 +MimeEntityEnd 9289 +MimeMessageEnd 9289 +MimeContentEnd 9289 +MimeEntityEnd 9289 +MultipartBoundaryBegin 9289 +MultipartBoundaryEnd 9316 +MimeEntityBegin 9316 +MimeEntityHeadersEnd 9443 +MimeContentBegin 9443 +MimeContentEnd 9901 +MimeEntityEnd 9902 +MultipartBoundaryBegin 9902 +MultipartBoundaryEnd 9929 +MimeEntityBegin 9929 +MimeEntityHeadersEnd 10056 +MimeContentBegin 10056 +MimeContentEnd 10542 +MimeEntityEnd 10543 +MultipartBoundaryBegin 10543 +MultipartBoundaryEnd 10570 +MimeEntityBegin 10570 +MimeEntityHeadersEnd 10701 +MimeContentBegin 10701 +MimeContentEnd 11228 +MimeEntityEnd 11229 +MultipartBoundaryBegin 11229 +MultipartBoundaryEnd 11256 +MimeEntityBegin 11256 +MimeEntityHeadersEnd 11385 +MimeContentBegin 11385 +MimeContentEnd 11883 +MimeEntityEnd 11884 +MultipartBoundaryBegin 11884 +MultipartBoundaryEnd 11911 +MimeEntityBegin 11911 +MimeEntityHeadersEnd 12059 +MimeContentBegin 12059 +MimeMessageBegin 12059 +MimeMessageHeadersEnd 12487 +MimeEntityBegin 12059 +MimeEntityHeadersEnd 12487 +MimeContentBegin 12487 +MimeContentEnd 12524 +MimeEntityEnd 12525 +MimeMessageEnd 12525 +MimeContentEnd 12525 +MimeEntityEnd 12525 +MultipartBoundaryBegin 12525 +MultipartBoundaryEnd 12552 +MimeEntityBegin 12552 +MimeEntityHeadersEnd 12727 +MimeContentBegin 12727 +MimeMessageBegin 12727 +MimeMessageHeadersEnd 13300 +MimeEntityBegin 12727 +MimeEntityHeadersEnd 13300 +MimeContentBegin 13300 +MimeMessageBegin 13300 +MimeMessageHeadersEnd 13814 +MimeEntityBegin 13300 +MimeEntityHeadersEnd 13814 +MimeContentBegin 13814 +MimeMessageBegin 13814 +MimeMessageHeadersEnd 14223 +MimeEntityBegin 13814 +MimeEntityHeadersEnd 14223 +MimeContentBegin 14223 +MimeContentEnd 14228 +MimeEntityEnd 14229 +MimeMessageEnd 14229 +MimeContentEnd 14229 +MimeEntityEnd 14229 +MimeMessageEnd 14229 +MimeContentEnd 14229 +MimeEntityEnd 14229 +MimeMessageEnd 14229 +MimeContentEnd 14229 +MimeEntityEnd 14229 +MultipartBoundaryBegin 14229 +MultipartBoundaryEnd 14256 +MimeEntityBegin 14256 +MimeEntityHeadersEnd 14313 +MimeContentBegin 14313 +MimeContentEnd 14365 +MimeEntityEnd 14366 +MultipartEndBoundaryBegin 14366 +MultipartEndBoundaryEnd 14394 +MultipartEpilogueBegin 14394 +MultipartEpilogueEnd 14394 +MimeEntityEnd 14395 +MimeMessageEnd 14395 +MboxMarkerBegin 14395 +MboxMarkerEnd 14426 +MimeMessageBegin 14427 +MimeMessageHeadersEnd 15930 +MimeEntityBegin 14427 +MimeEntityHeadersEnd 15930 +MimeContentBegin 15930 +MultipartPreambleBegin 15930 +MultipartPreambleEnd 15931 +MultipartBoundaryBegin 15931 +MultipartBoundaryEnd 15975 +MimeEntityBegin 15975 +MimeEntityHeadersEnd 16066 +MimeContentBegin 16066 +MimeContentEnd 21265 +MimeEntityEnd 21266 +MultipartBoundaryBegin 21266 +MultipartBoundaryEnd 21310 +MimeEntityBegin 21310 +MimeEntityHeadersEnd 21509 +MimeContentBegin 21509 +MimeContentEnd 22438 +MimeEntityEnd 22439 +MultipartEndBoundaryBegin 22439 +MultipartEndBoundaryEnd 22484 +MultipartEpilogueBegin 22484 +MultipartEpilogueEnd 22485 +MimeEntityEnd 22486 +MimeMessageEnd 22486 +MboxMarkerBegin 22486 +MboxMarkerEnd 22517 +MimeMessageBegin 22518 +MimeMessageHeadersEnd 23752 +MimeEntityBegin 22518 +MimeEntityHeadersEnd 23752 +MimeContentBegin 23752 +MultipartPreambleBegin 23752 +MultipartPreambleEnd 23798 +MultipartBoundaryBegin 23798 +MultipartBoundaryEnd 23836 +MimeEntityBegin 23836 +MimeEntityHeadersEnd 23912 +MimeContentBegin 23912 +MimeContentEnd 23939 +MimeEntityEnd 23940 +MultipartBoundaryBegin 23940 +MultipartBoundaryEnd 23978 +MimeEntityBegin 23978 +MimeEntityHeadersEnd 24068 +MimeContentBegin 24068 +MimeMessageBegin 24068 +MimeMessageHeadersEnd 24889 +MimeEntityBegin 24068 +MimeEntityHeadersEnd 24889 +MimeContentBegin 24889 +MultipartPreambleBegin 24889 +MultipartPreambleEnd 24890 +MultipartBoundaryBegin 24890 +MultipartBoundaryEnd 24929 +MimeEntityBegin 24929 +MimeEntityHeadersEnd 25005 +MimeContentBegin 25005 +MimeContentEnd 25632 +MimeEntityEnd 25633 +MultipartBoundaryBegin 25633 +MultipartBoundaryEnd 25672 +MimeEntityBegin 25672 +MimeEntityHeadersEnd 25754 +MimeContentBegin 25754 +MultipartPreambleBegin 25754 +MultipartPreambleEnd 25755 +MultipartBoundaryBegin 25755 +MultipartBoundaryEnd 25794 +MimeEntityBegin 25794 +MimeEntityHeadersEnd 25869 +MimeContentBegin 25869 +MimeContentEnd 26719 +MimeEntityEnd 26720 +MultipartBoundaryBegin 26720 +MultipartBoundaryEnd 26759 +MimeEntityBegin 26759 +MimeEntityHeadersEnd 26943 +MimeContentBegin 26943 +MimeContentEnd 770910 +MimeEntityEnd 770911 +MultipartEndBoundaryBegin 770911 +MultipartEndBoundaryEnd 770951 +MultipartEpilogueBegin 770951 +MultipartEpilogueEnd 770952 +MimeEntityEnd 770953 +MultipartEndBoundaryBegin 770953 +MultipartEndBoundaryEnd 770993 +MultipartEpilogueBegin 770993 +MultipartEpilogueEnd 770996 +MimeEntityEnd 770997 +MimeMessageEnd 770997 +MimeContentEnd 770997 +MimeEntityEnd 770997 +MultipartEndBoundaryBegin 770997 +MultipartEndBoundaryEnd 771036 +MultipartEpilogueBegin 771036 +MultipartEpilogueEnd 771037 +MimeEntityEnd 771038 +MimeMessageEnd 771038 +MboxMarkerBegin 771038 +MboxMarkerEnd 771069 +MimeMessageBegin 771070 +MimeMessageHeadersEnd 772334 +MimeEntityBegin 771070 +MimeEntityHeadersEnd 772334 +MimeContentBegin 772334 +MultipartPreambleBegin 772334 +MultipartPreambleEnd 772335 +MultipartBoundaryBegin 772335 +MultipartBoundaryEnd 772379 +MimeEntityBegin 772379 +MimeEntityHeadersEnd 772470 +MimeContentBegin 772470 +MimeContentEnd 774852 +MimeEntityEnd 774853 +MultipartBoundaryBegin 774853 +MultipartBoundaryEnd 774897 +MimeEntityBegin 774897 +MimeEntityHeadersEnd 775056 +MimeContentBegin 775056 +MimeContentEnd 781079 +MimeEntityEnd 781080 +MultipartBoundaryBegin 781080 +MultipartBoundaryEnd 781124 +MimeEntityBegin 781124 +MimeEntityHeadersEnd 781282 +MimeContentBegin 781282 +MimeContentEnd 793355 +MimeEntityEnd 793356 +MultipartBoundaryBegin 793356 +MultipartBoundaryEnd 793400 +MimeEntityBegin 793400 +MimeEntityHeadersEnd 793560 +MimeContentBegin 793560 +MimeContentEnd 815274 +MimeEntityEnd 815275 +MultipartBoundaryBegin 815275 +MultipartBoundaryEnd 815319 +MimeEntityBegin 815319 +MimeEntityHeadersEnd 815522 +MimeContentBegin 815522 +MimeContentEnd 818915 +MimeEntityEnd 818916 +MultipartEndBoundaryBegin 818916 +MultipartEndBoundaryEnd 818961 +MultipartEpilogueBegin 818961 +MultipartEpilogueEnd 818962 +MimeEntityEnd 818963 +MimeMessageEnd 818963 +MboxMarkerBegin 818963 +MboxMarkerEnd 818970 +MimeMessageBegin 818971 +MimeMessageHeadersEnd 819882 +MimeEntityBegin 818971 +MimeEntityHeadersEnd 819882 +MimeContentBegin 819882 +MultipartPreambleBegin 819882 +MultipartPreambleEnd 819883 +MultipartBoundaryBegin 819883 +MultipartBoundaryEnd 819891 +MimeEntityBegin 819891 +MimeEntityHeadersEnd 819920 +MimeContentBegin 819920 +MimeContentEnd 822450 +MimeEntityEnd 822451 +MultipartEndBoundaryBegin 822451 +MultipartEndBoundaryEnd 822460 +MultipartEpilogueBegin 822460 +MultipartEpilogueEnd 822461 +MimeEntityEnd 822462 +MimeMessageEnd 822462 +MboxMarkerBegin 822462 +MboxMarkerEnd 822493 +MimeMessageBegin 822494 +MimeMessageHeadersEnd 823647 +MimeEntityBegin 822494 +MimeEntityHeadersEnd 823647 +MimeContentBegin 823647 +MultipartPreambleBegin 823647 +MultipartPreambleEnd 823647 +MultipartBoundaryBegin 823647 +MultipartBoundaryEnd 823664 +MimeEntityBegin 823664 +MimeEntityHeadersEnd 823665 +MimeContentBegin 823665 +MimeContentEnd 824566 +MimeEntityEnd 824567 +MultipartBoundaryBegin 824567 +MultipartBoundaryEnd 824584 +MimeEntityBegin 824584 +MimeEntityHeadersEnd 824663 +MimeContentBegin 824663 +MimeContentEnd 825411 +MimeEntityEnd 825412 +MultipartEndBoundaryBegin 825412 +MultipartEndBoundaryEnd 825430 +MultipartEpilogueBegin 825430 +MultipartEpilogueEnd 825431 +MimeEntityEnd 825432 +MimeMessageEnd 825432 +MboxMarkerBegin 825432 +MboxMarkerEnd 825463 +MimeMessageBegin 825464 +MimeMessageHeadersEnd 826606 +MimeEntityBegin 825464 +MimeEntityHeadersEnd 826606 +MimeContentBegin 826606 +MultipartPreambleBegin 826606 +MultipartPreambleEnd 826779 +MultipartBoundaryBegin 826779 +MultipartBoundaryEnd 826786 +MimeEntityBegin 826786 +MimeEntityHeadersEnd 826864 +MimeContentBegin 826864 +MimeContentEnd 827605 +MimeEntityEnd 827606 +MultipartBoundaryBegin 827606 +MultipartBoundaryEnd 827613 +MimeEntityBegin 827613 +MimeEntityHeadersEnd 827791 +MimeContentBegin 827791 +MimeContentEnd 830006 +MimeEntityEnd 830007 +MultipartEndBoundaryBegin 830007 +MultipartEndBoundaryEnd 830015 +MultipartEpilogueBegin 830015 +MultipartEpilogueEnd 830015 +MimeEntityEnd 830016 +MimeMessageEnd 830016 +MboxMarkerBegin 830016 +MboxMarkerEnd 830047 +MimeMessageBegin 830048 +MimeMessageHeadersEnd 831185 +MimeEntityBegin 830048 +MimeEntityHeadersEnd 831185 +MimeContentBegin 831185 +MultipartPreambleBegin 831185 +MultipartPreambleEnd 831358 +MultipartBoundaryBegin 831358 +MultipartBoundaryEnd 831379 +MimeEntityBegin 831379 +MimeEntityHeadersEnd 831457 +MimeContentBegin 831457 +MimeContentEnd 834269 +MimeEntityEnd 834270 +MultipartBoundaryBegin 834270 +MultipartBoundaryEnd 834291 +MimeEntityBegin 834291 +MimeEntityHeadersEnd 834469 +MimeContentBegin 834469 +MimeContentEnd 837016 +MimeEntityEnd 837017 +MultipartEndBoundaryBegin 837017 +MultipartEndBoundaryEnd 837039 +MultipartEpilogueBegin 837039 +MultipartEpilogueEnd 837039 +MimeEntityEnd 837040 +MimeMessageEnd 837040 +MboxMarkerBegin 837040 +MboxMarkerEnd 837071 +MimeMessageBegin 837072 +MimeMessageHeadersEnd 837972 +MimeEntityBegin 837072 +MimeEntityHeadersEnd 837972 +MimeContentBegin 837972 +MultipartPreambleBegin 837972 +MultipartPreambleEnd 838018 +MultipartBoundaryBegin 838018 +MultipartBoundaryEnd 838045 +MimeEntityBegin 838045 +MimeEntityHeadersEnd 838179 +MimeContentBegin 838179 +MimeContentEnd 848901 +MimeEntityEnd 848902 +MultipartBoundaryBegin 848902 +MultipartBoundaryEnd 848929 +MimeEntityBegin 848929 +MimeEntityHeadersEnd 849080 +MimeContentBegin 849080 +MimeContentEnd 853691 +MimeEntityEnd 853692 +MultipartEndBoundaryBegin 853692 +MultipartEndBoundaryEnd 853720 +MultipartEpilogueBegin 853720 +MultipartEpilogueEnd 853721 +MimeEntityEnd 853722 +MimeMessageEnd 853722 +MboxMarkerBegin 853722 +MboxMarkerEnd 853753 +MimeMessageBegin 853754 +MimeMessageHeadersEnd 855145 +MimeEntityBegin 853754 +MimeEntityHeadersEnd 855145 +MimeContentBegin 855145 +MimeContentEnd 856576 +MimeEntityEnd 856577 +MimeMessageEnd 856577 +MboxMarkerBegin 856577 +MboxMarkerEnd 856608 +MimeMessageBegin 856609 +MimeMessageHeadersEnd 857962 +MimeEntityBegin 856609 +MimeEntityHeadersEnd 857962 +MimeContentBegin 857962 +MultipartPreambleBegin 857962 +MultipartPreambleEnd 857963 +MultipartBoundaryBegin 857963 +MultipartBoundaryEnd 858007 +MimeEntityBegin 858007 +MimeEntityHeadersEnd 858071 +MimeContentBegin 858071 +MimeContentEnd 858178 +MimeEntityEnd 858179 +MultipartBoundaryBegin 858179 +MultipartBoundaryEnd 858223 +MimeEntityBegin 858223 +MimeEntityHeadersEnd 858374 +MimeContentBegin 858374 +MimeContentEnd 862307 +MimeEntityEnd 862308 +MultipartEndBoundaryBegin 862308 +MultipartEndBoundaryEnd 862353 +MultipartEpilogueBegin 862353 +MultipartEpilogueEnd 862354 +MimeEntityEnd 862355 +MimeMessageEnd 862355 +MboxMarkerBegin 862355 +MboxMarkerEnd 862386 +MimeMessageBegin 862387 +MimeMessageHeadersEnd 863597 +MimeEntityBegin 862387 +MimeEntityHeadersEnd 863597 +MimeContentBegin 863597 +MimeContentEnd 867092 +MimeEntityEnd 867093 +MimeMessageEnd 867093 +MboxMarkerBegin 867093 +MboxMarkerEnd 867124 +MimeMessageBegin 867125 +MimeMessageHeadersEnd 868202 +MimeEntityBegin 867125 +MimeEntityHeadersEnd 868202 +MimeContentBegin 868202 +MimeContentEnd 868863 +MimeEntityEnd 868864 +MimeMessageEnd 868864 +MboxMarkerBegin 868864 +MboxMarkerEnd 868895 +MimeMessageBegin 868896 +MimeMessageHeadersEnd 869679 +MimeEntityBegin 868896 +MimeEntityHeadersEnd 869679 +MimeContentBegin 869679 +MimeMessageBegin 869679 +MimeMessageHeadersEnd 871059 +MimeEntityBegin 869679 +MimeEntityHeadersEnd 871059 +MimeContentBegin 871059 +MimeContentEnd 872491 +MimeEntityEnd 872492 +MimeMessageEnd 872492 +MimeContentEnd 872492 +MimeEntityEnd 872492 +MimeMessageEnd 872492 +MboxMarkerBegin 872492 +MboxMarkerEnd 872523 +MimeMessageBegin 872524 +MimeMessageHeadersEnd 873234 +MimeEntityBegin 872524 +MimeEntityHeadersEnd 873234 +MimeContentBegin 873234 +MultipartPreambleBegin 873234 +MultipartPreambleEnd 873280 +MultipartBoundaryBegin 873280 +MultipartBoundaryEnd 873307 +MimeEntityBegin 873307 +MimeEntityHeadersEnd 873383 +MimeContentBegin 873383 +MimeContentEnd 873398 +MimeEntityEnd 873399 +MultipartBoundaryBegin 873399 +MultipartBoundaryEnd 873426 +MimeEntityBegin 873426 +MimeEntityHeadersEnd 873580 +MimeContentBegin 873580 +MimeMessageBegin 873580 +MimeMessageHeadersEnd 874960 +MimeEntityBegin 873580 +MimeEntityHeadersEnd 874960 +MimeContentBegin 874960 +MimeContentEnd 876392 +MimeEntityEnd 876393 +MimeMessageEnd 876393 +MimeContentEnd 876393 +MimeEntityEnd 876393 +MultipartEndBoundaryBegin 876393 +MultipartEndBoundaryEnd 876421 +MultipartEpilogueBegin 876421 +MultipartEpilogueEnd 876422 +MimeEntityEnd 876423 +MimeMessageEnd 876423 +MboxMarkerBegin 876423 +MboxMarkerEnd 876454 +MimeMessageBegin 876455 +MimeMessageHeadersEnd 877120 +MimeEntityBegin 876455 +MimeEntityHeadersEnd 877120 +MimeContentBegin 877120 +MultipartPreambleBegin 877120 +MultipartPreambleEnd 877180 +MultipartBoundaryBegin 877180 +MultipartBoundaryEnd 877221 +MimeEntityBegin 877221 +MimeEntityHeadersEnd 877297 +MimeContentBegin 877297 +MimeContentEnd 877338 +MimeEntityEnd 877339 +MultipartBoundaryBegin 877339 +MultipartBoundaryEnd 877380 +MimeEntityBegin 877380 +MimeEntityHeadersEnd 877531 +MimeContentBegin 877531 +MimeContentEnd 883087 +MimeEntityEnd 883088 +MultipartEndBoundaryBegin 883088 +MultipartEndBoundaryEnd 883130 +MultipartEpilogueBegin 883130 +MultipartEpilogueEnd 883131 +MimeEntityEnd 883132 +MimeMessageEnd 883132 +MboxMarkerBegin 883132 +MboxMarkerEnd 883163 +MimeMessageBegin 883164 +MimeMessageHeadersEnd 884226 +MimeEntityBegin 883164 +MimeEntityHeadersEnd 884226 +MimeContentBegin 884226 +MimeContentEnd 894462 +MimeEntityEnd 894463 +MimeMessageEnd 894463 +MboxMarkerBegin 894463 +MboxMarkerEnd 894494 +MimeMessageBegin 894495 +MimeMessageHeadersEnd 895871 +MimeEntityBegin 894495 +MimeEntityHeadersEnd 895871 +MimeContentBegin 895871 +MultipartPreambleBegin 895871 +MultipartPreambleEnd 895931 +MultipartBoundaryBegin 895931 +MultipartBoundaryEnd 895972 +MimeEntityBegin 895972 +MimeEntityHeadersEnd 896048 +MimeContentBegin 896048 +MimeContentEnd 896659 +MimeEntityEnd 896660 +MultipartBoundaryBegin 896660 +MultipartBoundaryEnd 896701 +MimeEntityBegin 896701 +MimeEntityHeadersEnd 896852 +MimeContentBegin 896852 +MimeContentEnd 898640 +MimeEntityEnd 898641 +MultipartEndBoundaryBegin 898641 +MultipartEndBoundaryEnd 898683 +MultipartEpilogueBegin 898683 +MultipartEpilogueEnd 898684 +MimeEntityEnd 898685 +MimeMessageEnd 898685 +MboxMarkerBegin 898685 +MboxMarkerEnd 898716 +MimeMessageBegin 898717 +MimeMessageHeadersEnd 899265 +MimeEntityBegin 898717 +MimeEntityHeadersEnd 899265 +MimeContentBegin 899265 +MimeContentEnd 899788 +MimeEntityEnd 899789 +MimeMessageEnd 899789 +MboxMarkerBegin 899789 +MboxMarkerEnd 899820 +MimeMessageBegin 899821 +MimeMessageHeadersEnd 901036 +MimeEntityBegin 899821 +MimeEntityHeadersEnd 901036 +MimeContentBegin 901036 +MimeContentEnd 903918 +MimeEntityEnd 903919 +MimeMessageEnd 903919 +MboxMarkerBegin 903919 +MboxMarkerEnd 903950 +MimeMessageBegin 903951 +MimeMessageHeadersEnd 905109 +MimeEntityBegin 903951 +MimeEntityHeadersEnd 905109 +MimeContentBegin 905109 +MimeContentEnd 907231 +MimeEntityEnd 907232 +MimeMessageEnd 907232 +MboxMarkerBegin 907232 +MboxMarkerEnd 907263 +MimeMessageBegin 907264 +MimeMessageHeadersEnd 908342 +MimeEntityBegin 907264 +MimeEntityHeadersEnd 908342 +MimeContentBegin 908342 +MultipartPreambleBegin 908342 +MultipartPreambleEnd 908343 +MultipartBoundaryBegin 908343 +MultipartBoundaryEnd 908375 +MimeEntityBegin 908375 +MimeEntityHeadersEnd 908439 +MimeContentBegin 908439 +MimeContentEnd 908439 +MimeEntityEnd 908440 +MultipartBoundaryBegin 908440 +MultipartBoundaryEnd 908472 +MimeEntityBegin 908472 +MimeEntityHeadersEnd 908551 +MimeContentBegin 908551 +MimeContentEnd 911264 +MimeEntityEnd 911265 +MultipartEndBoundaryBegin 911265 +MultipartEndBoundaryEnd 911298 +MultipartEpilogueBegin 911298 +MultipartEpilogueEnd 911299 +MimeEntityEnd 911300 +MimeMessageEnd 911300 +MboxMarkerBegin 911300 +MboxMarkerEnd 911331 +MimeMessageBegin 911332 +MimeMessageHeadersEnd 912369 +MimeEntityBegin 911332 +MimeEntityHeadersEnd 912369 +MimeContentBegin 912369 +MultipartPreambleBegin 912369 +MultipartPreambleEnd 912370 +MultipartBoundaryBegin 912370 +MultipartBoundaryEnd 912410 +MimeEntityBegin 912410 +MimeEntityHeadersEnd 912488 +MimeContentBegin 912488 +MimeContentEnd 912941 +MimeEntityEnd 912942 +MultipartBoundaryBegin 912942 +MultipartBoundaryEnd 912982 +MimeEntityBegin 912982 +MimeEntityHeadersEnd 913057 +MimeContentBegin 913057 +MimeContentEnd 913868 +MimeEntityEnd 913869 +MultipartBoundaryBegin 913869 +MultipartBoundaryEnd 913909 +MimeEntityBegin 913909 +MimeEntityHeadersEnd 914006 +MimeContentBegin 914006 +MimeContentEnd 915206 +MimeEntityEnd 915207 +MultipartEndBoundaryBegin 915207 +MultipartEndBoundaryEnd 915248 +MultipartEpilogueBegin 915248 +MultipartEpilogueEnd 915249 +MimeEntityEnd 915250 +MimeMessageEnd 915250 +MboxMarkerBegin 915250 +MboxMarkerEnd 915281 +MimeMessageBegin 915282 +MimeMessageHeadersEnd 916357 +MimeEntityBegin 915282 +MimeEntityHeadersEnd 916357 +MimeContentBegin 916357 +MultipartPreambleBegin 916357 +MultipartPreambleEnd 916358 +MultipartBoundaryBegin 916358 +MultipartBoundaryEnd 916400 +MimeEntityBegin 916400 +MimeEntityHeadersEnd 916470 +MimeContentBegin 916470 +MimeContentEnd 916622 +MimeEntityEnd 916623 +MultipartBoundaryBegin 916623 +MultipartBoundaryEnd 916665 +MimeEntityBegin 916665 +MimeEntityHeadersEnd 916744 +MimeContentBegin 916744 +MimeContentEnd 920840 +MimeEntityEnd 920841 +MultipartEndBoundaryBegin 920841 +MultipartEndBoundaryEnd 920884 +MultipartEpilogueBegin 920884 +MultipartEpilogueEnd 920885 +MimeEntityEnd 920886 +MimeMessageEnd 920886 +MboxMarkerBegin 920886 +MboxMarkerEnd 920917 +MimeMessageBegin 920918 +MimeMessageHeadersEnd 922020 +MimeEntityBegin 920918 +MimeEntityHeadersEnd 922020 +MimeContentBegin 922020 +MultipartPreambleBegin 922020 +MultipartPreambleEnd 922021 +MultipartBoundaryBegin 922021 +MultipartBoundaryEnd 922054 +MimeEntityBegin 922054 +MimeEntityHeadersEnd 922132 +MimeContentBegin 922132 +MimeContentEnd 922206 +MimeEntityEnd 922207 +MultipartBoundaryBegin 922207 +MultipartBoundaryEnd 922240 +MimeEntityBegin 922240 +MimeEntityHeadersEnd 922319 +MimeContentBegin 922319 +MimeContentEnd 926036 +MimeEntityEnd 926037 +MultipartEndBoundaryBegin 926037 +MultipartEndBoundaryEnd 926071 +MultipartEpilogueBegin 926071 +MultipartEpilogueEnd 926071 +MimeEntityEnd 926072 +MimeMessageEnd 926072 +MboxMarkerBegin 926072 +MboxMarkerEnd 926103 +MimeMessageBegin 926104 +MimeMessageHeadersEnd 927232 +MimeEntityBegin 926104 +MimeEntityHeadersEnd 927232 +MimeContentBegin 927232 +MultipartPreambleBegin 927232 +MultipartPreambleEnd 927345 +MultipartBoundaryBegin 927345 +MultipartBoundaryEnd 927369 +MimeEntityBegin 927369 +MimeEntityHeadersEnd 927408 +MimeContentBegin 927408 +MimeContentEnd 927596 +MimeEntityEnd 927597 +MultipartBoundaryBegin 927597 +MultipartBoundaryEnd 927621 +MimeEntityBegin 927621 +MimeEntityHeadersEnd 927651 +MimeContentBegin 927651 +MimeMessageBegin 927651 +MimeMessageHeadersEnd 928457 +MimeEntityBegin 927651 +MimeEntityHeadersEnd 928457 +MimeContentBegin 928457 +MimeContentEnd 928468 +MimeEntityEnd 928469 +MimeMessageEnd 928469 +MimeContentEnd 928469 +MimeEntityEnd 928469 +MultipartEndBoundaryBegin 928469 +MultipartEndBoundaryEnd 928494 +MultipartEpilogueBegin 928494 +MultipartEpilogueEnd 928495 +MimeEntityEnd 928496 +MimeMessageEnd 928496 +MboxMarkerBegin 928496 +MboxMarkerEnd 928527 +MimeMessageBegin 928528 +MimeMessageHeadersEnd 930393 +MimeEntityBegin 928528 +MimeEntityHeadersEnd 930393 +MimeContentBegin 930393 +MultipartPreambleBegin 930393 +MultipartPreambleEnd 930393 +MultipartBoundaryBegin 930393 +MultipartBoundaryEnd 930437 +MimeEntityBegin 930437 +MimeEntityHeadersEnd 930515 +MimeContentBegin 930515 +MimeContentEnd 931378 +MimeEntityEnd 931379 +MultipartBoundaryBegin 931379 +MultipartBoundaryEnd 931423 +MimeEntityBegin 931423 +MimeEntityHeadersEnd 931584 +MimeContentBegin 931584 +MimeContentEnd 935225 +MimeEntityEnd 935226 +MultipartEndBoundaryBegin 935226 +MultipartEndBoundaryEnd 935271 +MultipartEpilogueBegin 935271 +MultipartEpilogueEnd 935272 +MimeEntityEnd 935272 +MimeMessageEnd 935272 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt new file mode 100644 index 0000000000..efb2203fa6 --- /dev/null +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -0,0 +1,6896 @@ +MboxMarkerBegin 0 +MboxMarkerEnd 7 +MimeMessageBegin 8 +MimeMessageHeadersEnd 517 +MimeEntityBegin 8 +MimeEntityHeadersEnd 517 +MimeContentBegin 517 +MultipartPreambleBegin 517 +MultipartPreambleEnd 517 +MultipartBoundaryBegin 517 +MultipartBoundaryEnd 534 +MimeEntityBegin 534 +MimeEntityHeadersEnd 630 +MimeContentBegin 630 +MultipartPreambleBegin 630 +MultipartPreambleEnd 630 +MultipartBoundaryBegin 630 +MultipartBoundaryEnd 661 +MimeEntityBegin 661 +MimeEntityHeadersEnd 662 +MimeContentBegin 662 +MimeContentEnd 1377 +MimeEntityEnd 1378 +MultipartBoundaryBegin 1378 +MultipartBoundaryEnd 1409 +MimeEntityBegin 1409 +MimeEntityHeadersEnd 1493 +MimeContentBegin 1493 +MimeContentEnd 32539 +MimeEntityEnd 32540 +MultipartEndBoundaryBegin 32540 +MultipartEndBoundaryEnd 32572 +MultipartEpilogueBegin 32572 +MultipartEpilogueEnd 32572 +MimeEntityEnd 32573 +MultipartBoundaryBegin 32573 +MultipartBoundaryEnd 32590 +MimeEntityBegin 32590 +MimeEntityHeadersEnd 32683 +MimeContentBegin 32683 +MultipartPreambleBegin 32683 +MultipartPreambleEnd 32683 +MultipartBoundaryBegin 32683 +MultipartBoundaryEnd 32714 +MimeEntityBegin 32714 +MimeEntityHeadersEnd 32796 +MimeContentBegin 32796 +MimeContentEnd 58444 +MimeEntityEnd 58445 +MultipartBoundaryBegin 58445 +MultipartBoundaryEnd 58476 +MimeEntityBegin 58476 +MimeEntityHeadersEnd 58558 +MimeContentBegin 58558 +MimeContentEnd 76971 +MimeEntityEnd 76972 +MultipartBoundaryBegin 76972 +MultipartBoundaryEnd 77003 +MimeEntityBegin 77003 +MimeEntityHeadersEnd 77117 +MimeContentBegin 77117 +MimeContentEnd 120806 +MimeEntityEnd 120807 +MultipartBoundaryBegin 120807 +MultipartBoundaryEnd 120838 +MimeEntityBegin 120838 +MimeEntityHeadersEnd 120899 +MimeContentBegin 120899 +MimeContentEnd 129745 +MimeEntityEnd 129746 +MultipartEndBoundaryBegin 129746 +MultipartEndBoundaryEnd 129778 +MultipartEpilogueBegin 129778 +MultipartEpilogueEnd 129778 +MimeEntityEnd 129779 +MultipartBoundaryBegin 129779 +MultipartBoundaryEnd 129796 +MimeEntityBegin 129796 +MimeEntityHeadersEnd 129880 +MimeContentBegin 129880 +MimeContentEnd 177055 +MimeEntityEnd 177056 +MultipartEndBoundaryBegin 177056 +MultipartEndBoundaryEnd 177074 +MultipartEpilogueBegin 177074 +MultipartEpilogueEnd 177075 +MimeEntityEnd 177076 +MimeMessageEnd 177076 +MboxMarkerBegin 177076 +MboxMarkerEnd 177083 +MimeMessageBegin 177084 +MimeMessageHeadersEnd 177633 +MimeEntityBegin 177084 +MimeEntityHeadersEnd 177633 +MimeContentBegin 177633 +MimeContentEnd 312903 +MimeEntityEnd 312904 +MimeMessageEnd 312904 +MboxMarkerBegin 312904 +MboxMarkerEnd 312911 +MimeMessageBegin 312912 +MimeMessageHeadersEnd 313291 +MimeEntityBegin 312912 +MimeEntityHeadersEnd 313291 +MimeContentBegin 313291 +MimeContentEnd 313492 +MimeEntityEnd 313493 +MimeMessageEnd 313493 +MboxMarkerBegin 313493 +MboxMarkerEnd 313500 +MimeMessageBegin 313501 +MimeMessageHeadersEnd 314147 +MimeEntityBegin 313501 +MimeEntityHeadersEnd 314147 +MimeContentBegin 314147 +MultipartPreambleBegin 314147 +MultipartPreambleEnd 314302 +MultipartBoundaryBegin 314302 +MultipartBoundaryEnd 314342 +MimeEntityBegin 314342 +MimeEntityHeadersEnd 314386 +MimeContentBegin 314386 +MimeContentEnd 314619 +MimeEntityEnd 314620 +MultipartBoundaryBegin 314620 +MultipartBoundaryEnd 314660 +MimeEntityBegin 314660 +MimeEntityHeadersEnd 314745 +MimeContentBegin 314745 +MultipartPreambleBegin 314745 +MultipartPreambleEnd 314745 +MultipartBoundaryBegin 314745 +MultipartBoundaryEnd 314787 +MimeEntityBegin 314787 +MimeEntityHeadersEnd 314878 +MimeContentBegin 314878 +MimeContentEnd 315024 +MimeEntityEnd 315025 +MultipartBoundaryBegin 315025 +MultipartBoundaryEnd 315067 +MimeEntityBegin 315067 +MimeEntityHeadersEnd 315177 +MimeContentBegin 315177 +MimeContentEnd 319545 +MimeEntityEnd 319546 +MultipartBoundaryBegin 319546 +MultipartBoundaryEnd 319588 +MimeEntityBegin 319588 +MimeEntityHeadersEnd 319679 +MimeContentBegin 319679 +MimeContentEnd 319724 +MimeEntityEnd 319725 +MultipartEndBoundaryBegin 319725 +MultipartEndBoundaryEnd 319768 +MultipartEpilogueBegin 319768 +MultipartEpilogueEnd 319769 +MimeEntityEnd 319770 +MultipartEndBoundaryBegin 319770 +MultipartEndBoundaryEnd 319811 +MultipartEpilogueBegin 319811 +MultipartEpilogueEnd 319811 +MimeEntityEnd 319812 +MimeMessageEnd 319812 +MboxMarkerBegin 319812 +MboxMarkerEnd 319819 +MimeMessageBegin 319820 +MimeMessageHeadersEnd 320568 +MimeEntityBegin 319820 +MimeEntityHeadersEnd 320568 +MimeContentBegin 320568 +MultipartPreambleBegin 320568 +MultipartPreambleEnd 320763 +MultipartBoundaryBegin 320763 +MultipartBoundaryEnd 320825 +MimeEntityBegin 320825 +MimeEntityHeadersEnd 320898 +MimeContentBegin 320898 +MimeContentEnd 321322 +MimeEntityEnd 321323 +MultipartBoundaryBegin 321323 +MultipartBoundaryEnd 321385 +MimeEntityBegin 321385 +MimeEntityHeadersEnd 321415 +MimeContentBegin 321415 +MimeMessageBegin 321415 +MimeMessageHeadersEnd 322251 +MimeEntityBegin 321415 +MimeEntityHeadersEnd 322251 +MimeContentBegin 322251 +MultipartPreambleBegin 322251 +MultipartPreambleEnd 322527 +MultipartBoundaryBegin 322527 +MultipartBoundaryEnd 322557 +MimeEntityBegin 322557 +MimeEntityHeadersEnd 322651 +MimeContentBegin 322651 +MimeContentEnd 322755 +MimeEntityEnd 322756 +MultipartBoundaryBegin 322756 +MultipartBoundaryEnd 322786 +MimeEntityBegin 322786 +MimeEntityHeadersEnd 322875 +MimeContentBegin 322875 +MimeContentEnd 343502 +MimeEntityEnd 343503 +MultipartBoundaryBegin 343503 +MultipartBoundaryEnd 343533 +MimeEntityBegin 343533 +MimeEntityHeadersEnd 343534 +MimeContentBegin 343534 +MimeContentEnd 343534 +MimeEntityEnd 343534 +MimeEntityEnd 343534 +MimeMessageEnd 343534 +MimeContentEnd 343534 +MimeEntityEnd 343534 +MultipartBoundaryBegin 343534 +MultipartBoundaryEnd 343596 +MimeEntityBegin 343596 +MimeEntityHeadersEnd 343669 +MimeContentBegin 343669 +MimeContentEnd 343776 +MimeEntityEnd 343777 +MultipartEndBoundaryBegin 343777 +MultipartEndBoundaryEnd 343840 +MultipartEpilogueBegin 343840 +MultipartEpilogueEnd 343841 +MimeEntityEnd 343842 +MimeMessageEnd 343842 +MboxMarkerBegin 343842 +MboxMarkerEnd 343849 +MimeMessageBegin 343850 +MimeMessageHeadersEnd 344568 +MimeEntityBegin 343850 +MimeEntityHeadersEnd 344568 +MimeContentBegin 344568 +MultipartPreambleBegin 344568 +MultipartPreambleEnd 344723 +MultipartBoundaryBegin 344723 +MultipartBoundaryEnd 344763 +MimeEntityBegin 344763 +MimeEntityHeadersEnd 344807 +MimeContentBegin 344807 +MimeContentEnd 345567 +MimeEntityEnd 345568 +MultipartBoundaryBegin 345568 +MultipartBoundaryEnd 345608 +MimeEntityBegin 345608 +MimeEntityHeadersEnd 345693 +MimeContentBegin 345693 +MultipartPreambleBegin 345693 +MultipartPreambleEnd 345693 +MultipartBoundaryBegin 345693 +MultipartBoundaryEnd 345735 +MimeEntityBegin 345735 +MimeEntityHeadersEnd 345826 +MimeContentBegin 345826 +MimeContentEnd 346051 +MimeEntityEnd 346052 +MultipartBoundaryBegin 346052 +MultipartBoundaryEnd 346094 +MimeEntityBegin 346094 +MimeEntityHeadersEnd 346202 +MimeContentBegin 346202 +MimeContentEnd 1021266 +MimeEntityEnd 1021267 +MultipartBoundaryBegin 1021267 +MultipartBoundaryEnd 1021309 +MimeEntityBegin 1021309 +MimeEntityHeadersEnd 1021400 +MimeContentBegin 1021400 +MimeContentEnd 1021516 +MimeEntityEnd 1021517 +MultipartBoundaryBegin 1021517 +MultipartBoundaryEnd 1021559 +MimeEntityBegin 1021559 +MimeEntityHeadersEnd 1021685 +MimeContentBegin 1021685 +MimeContentEnd 1702821 +MimeEntityEnd 1702822 +MultipartBoundaryBegin 1702822 +MultipartBoundaryEnd 1702864 +MimeEntityBegin 1702864 +MimeEntityHeadersEnd 1702955 +MimeContentBegin 1702955 +MimeContentEnd 1702965 +MimeEntityEnd 1702966 +MultipartBoundaryBegin 1702966 +MultipartBoundaryEnd 1703008 +MimeEntityBegin 1703008 +MimeEntityHeadersEnd 1703125 +MimeContentBegin 1703125 +MimeContentEnd 1771303 +MimeEntityEnd 1771304 +MultipartBoundaryBegin 1771304 +MultipartBoundaryEnd 1771346 +MimeEntityBegin 1771346 +MimeEntityHeadersEnd 1771437 +MimeContentBegin 1771437 +MimeContentEnd 1771575 +MimeEntityEnd 1771576 +MultipartBoundaryBegin 1771576 +MultipartBoundaryEnd 1771618 +MimeEntityBegin 1771618 +MimeEntityHeadersEnd 1771736 +MimeContentBegin 1771736 +MimeContentEnd 2108498 +MimeEntityEnd 2108499 +MultipartBoundaryBegin 2108499 +MultipartBoundaryEnd 2108541 +MimeEntityBegin 2108541 +MimeEntityHeadersEnd 2108632 +MimeContentBegin 2108632 +MimeContentEnd 2108637 +MimeEntityEnd 2108638 +MultipartEndBoundaryBegin 2108638 +MultipartEndBoundaryEnd 2108681 +MultipartEpilogueBegin 2108681 +MultipartEpilogueEnd 2108682 +MimeEntityEnd 2108683 +MultipartEndBoundaryBegin 2108683 +MultipartEndBoundaryEnd 2108724 +MultipartEpilogueBegin 2108724 +MultipartEpilogueEnd 2108724 +MimeEntityEnd 2108725 +MimeMessageEnd 2108725 +MboxMarkerBegin 2108725 +MboxMarkerEnd 2108732 +MimeMessageBegin 2108733 +MimeMessageHeadersEnd 2109749 +MimeEntityBegin 2108733 +MimeEntityHeadersEnd 2109749 +MimeContentBegin 2109749 +MimeContentEnd 2110874 +MimeEntityEnd 2110875 +MimeMessageEnd 2110875 +MboxMarkerBegin 2110875 +MboxMarkerEnd 2110882 +MimeMessageBegin 2110883 +MimeMessageHeadersEnd 2111121 +MimeEntityBegin 2110883 +MimeEntityHeadersEnd 2111121 +MimeContentBegin 2111121 +MultipartPreambleBegin 2111121 +MultipartPreambleEnd 2111121 +MultipartBoundaryBegin 2111121 +MultipartBoundaryEnd 2111136 +MimeEntityBegin 2111136 +MimeEntityHeadersEnd 2111137 +MimeContentBegin 2111137 +MimeContentEnd 2111437 +MimeEntityEnd 2111438 +MultipartBoundaryBegin 2111438 +MultipartBoundaryEnd 2111453 +MimeEntityBegin 2111453 +MimeEntityHeadersEnd 2111529 +MimeContentBegin 2111529 +MultipartPreambleBegin 2111529 +MultipartPreambleEnd 2111529 +MultipartBoundaryBegin 2111529 +MultipartBoundaryEnd 2111545 +MimeEntityBegin 2111545 +MimeEntityHeadersEnd 2111622 +MimeContentBegin 2111622 +MimeContentEnd 2114882 +MimeEntityEnd 2114883 +MultipartBoundaryBegin 2114883 +MultipartBoundaryEnd 2114899 +MimeEntityBegin 2114899 +MimeEntityHeadersEnd 2115002 +MimeContentBegin 2115002 +MimeContentEnd 2270901 +MimeEntityEnd 2270902 +MultipartEndBoundaryBegin 2270902 +MultipartEndBoundaryEnd 2270919 +MultipartEpilogueBegin 2270919 +MultipartEpilogueEnd 2270919 +MimeEntityEnd 2270920 +MultipartBoundaryBegin 2270920 +MultipartBoundaryEnd 2270935 +MimeEntityBegin 2270935 +MimeEntityHeadersEnd 2270991 +MimeContentBegin 2270991 +MimeContentEnd 2275711 +MimeEntityEnd 2275712 +MultipartEndBoundaryBegin 2275712 +MultipartEndBoundaryEnd 2275728 +MultipartEpilogueBegin 2275728 +MultipartEpilogueEnd 2275728 +MimeEntityEnd 2275729 +MimeMessageEnd 2275729 +MboxMarkerBegin 2275729 +MboxMarkerEnd 2275736 +MimeMessageBegin 2275737 +MimeMessageHeadersEnd 2276689 +MimeEntityBegin 2275737 +MimeEntityHeadersEnd 2276689 +MimeContentBegin 2276689 +MimeContentEnd 2619749 +MimeEntityEnd 2619750 +MimeMessageEnd 2619750 +MboxMarkerBegin 2619750 +MboxMarkerEnd 2619757 +MimeMessageBegin 2619758 +MimeMessageHeadersEnd 2619892 +MimeEntityBegin 2619758 +MimeEntityHeadersEnd 2619892 +MimeContentBegin 2619892 +MultipartPreambleBegin 2619892 +MultipartPreambleEnd 2619892 +MultipartBoundaryBegin 2619892 +MultipartBoundaryEnd 2619909 +MimeEntityBegin 2619909 +MimeEntityHeadersEnd 2619982 +MimeContentBegin 2619982 +MultipartPreambleBegin 2619982 +MultipartPreambleEnd 2619982 +MultipartBoundaryBegin 2619982 +MultipartBoundaryEnd 2620013 +MimeEntityBegin 2620013 +MimeEntityHeadersEnd 2620014 +MimeContentBegin 2620014 +MimeContentEnd 2620721 +MimeEntityEnd 2620722 +MultipartBoundaryBegin 2620722 +MultipartBoundaryEnd 2620753 +MimeEntityBegin 2620753 +MimeEntityHeadersEnd 2620850 +MimeContentBegin 2620850 +MimeContentEnd 2651896 +MimeEntityEnd 2651897 +MultipartEndBoundaryBegin 2651897 +MultipartEndBoundaryEnd 2651929 +MultipartEpilogueBegin 2651929 +MultipartEpilogueEnd 2651929 +MimeEntityEnd 2651930 +MultipartEndBoundaryBegin 2651930 +MultipartEndBoundaryEnd 2651948 +MultipartEpilogueBegin 2651948 +MultipartEpilogueEnd 2651948 +MimeEntityEnd 2651949 +MimeMessageEnd 2651949 +MboxMarkerBegin 2651949 +MboxMarkerEnd 2651956 +MimeMessageBegin 2651957 +MimeMessageHeadersEnd 2652514 +MimeEntityBegin 2651957 +MimeEntityHeadersEnd 2652514 +MimeContentBegin 2652514 +MimeContentEnd 2709293 +MimeEntityEnd 2709294 +MimeMessageEnd 2709294 +MboxMarkerBegin 2709294 +MboxMarkerEnd 2709301 +MimeMessageBegin 2709302 +MimeMessageHeadersEnd 2710035 +MimeEntityBegin 2709302 +MimeEntityHeadersEnd 2710035 +MimeContentBegin 2710035 +MultipartPreambleBegin 2710035 +MultipartPreambleEnd 2710561 +MultipartBoundaryBegin 2710561 +MultipartBoundaryEnd 2710619 +MimeEntityBegin 2710619 +MimeEntityHeadersEnd 2710620 +MimeContentBegin 2710620 +MimeContentEnd 2711172 +MimeEntityEnd 2711173 +MultipartBoundaryBegin 2711173 +MultipartBoundaryEnd 2711231 +MimeEntityBegin 2711231 +MimeEntityHeadersEnd 2711334 +MimeContentBegin 2711334 +MultipartPreambleBegin 2711334 +MultipartPreambleEnd 2711334 +MultipartBoundaryBegin 2711334 +MultipartBoundaryEnd 2711394 +MimeEntityBegin 2711394 +MimeEntityHeadersEnd 2711467 +MimeContentBegin 2711467 +MimeContentEnd 2711886 +MimeEntityEnd 2711887 +MultipartBoundaryBegin 2711887 +MultipartBoundaryEnd 2711947 +MimeEntityBegin 2711947 +MimeEntityHeadersEnd 2712006 +MimeContentBegin 2712006 +MimeContentEnd 2741267 +MimeEntityEnd 2741268 +MultipartBoundaryBegin 2741268 +MultipartBoundaryEnd 2741328 +MimeEntityBegin 2741328 +MimeEntityHeadersEnd 2741398 +MimeContentBegin 2741398 +MimeContentEnd 2741439 +MimeEntityEnd 2741440 +MultipartEndBoundaryBegin 2741440 +MultipartEndBoundaryEnd 2741501 +MultipartEpilogueBegin 2741501 +MultipartEpilogueEnd 2741502 +MimeEntityEnd 2741503 +MultipartEndBoundaryBegin 2741503 +MultipartEndBoundaryEnd 2741562 +MultipartEpilogueBegin 2741562 +MultipartEpilogueEnd 2741562 +MimeEntityEnd 2741563 +MimeMessageEnd 2741563 +MboxMarkerBegin 2741563 +MboxMarkerEnd 2741570 +MimeMessageBegin 2741571 +MimeMessageHeadersEnd 2742224 +MimeEntityBegin 2741571 +MimeEntityHeadersEnd 2742224 +MimeContentBegin 2742224 +MultipartPreambleBegin 2742224 +MultipartPreambleEnd 2742564 +MultipartBoundaryBegin 2742564 +MultipartBoundaryEnd 2742593 +MimeEntityBegin 2742593 +MimeEntityHeadersEnd 2742594 +MimeContentBegin 2742594 +MimeContentEnd 2743415 +MimeEntityEnd 2743416 +MultipartBoundaryBegin 2743416 +MultipartBoundaryEnd 2743445 +MimeEntityBegin 2743445 +MimeEntityHeadersEnd 2743518 +MimeContentBegin 2743518 +MultipartPreambleBegin 2743518 +MultipartPreambleEnd 2743518 +MultipartBoundaryBegin 2743518 +MultipartBoundaryEnd 2743549 +MimeEntityBegin 2743549 +MimeEntityHeadersEnd 2743575 +MimeContentBegin 2743575 +MimeContentEnd 2743712 +MimeEntityEnd 2743713 +MultipartBoundaryBegin 2743713 +MultipartBoundaryEnd 2743744 +MimeEntityBegin 2743744 +MimeEntityHeadersEnd 2743809 +MimeContentBegin 2743809 +MimeContentEnd 2745006 +MimeEntityEnd 2745007 +MultipartBoundaryBegin 2745007 +MultipartBoundaryEnd 2745038 +MimeEntityBegin 2745038 +MimeEntityHeadersEnd 2745064 +MimeContentBegin 2745064 +MimeContentEnd 2745132 +MimeEntityEnd 2745133 +MultipartBoundaryBegin 2745133 +MultipartBoundaryEnd 2745164 +MimeEntityBegin 2745164 +MimeEntityHeadersEnd 2745229 +MimeContentBegin 2745229 +MimeContentEnd 2746434 +MimeEntityEnd 2746435 +MultipartBoundaryBegin 2746435 +MultipartBoundaryEnd 2746466 +MimeEntityBegin 2746466 +MimeEntityHeadersEnd 2746495 +MimeContentBegin 2746495 +MimeContentEnd 2747041 +MimeEntityEnd 2747042 +MultipartEndBoundaryBegin 2747042 +MultipartEndBoundaryEnd 2747074 +MultipartEpilogueBegin 2747074 +MultipartEpilogueEnd 2747075 +MimeEntityEnd 2747076 +MultipartEndBoundaryBegin 2747076 +MultipartEndBoundaryEnd 2747106 +MultipartEpilogueBegin 2747106 +MultipartEpilogueEnd 2747107 +MimeEntityEnd 2747108 +MimeMessageEnd 2747108 +MboxMarkerBegin 2747108 +MboxMarkerEnd 2747115 +MimeMessageBegin 2747116 +MimeMessageHeadersEnd 2748092 +MimeEntityBegin 2747116 +MimeEntityHeadersEnd 2748092 +MimeContentBegin 2748092 +MimeContentEnd 2749474 +MimeEntityEnd 2749475 +MimeMessageEnd 2749475 +MboxMarkerBegin 2749475 +MboxMarkerEnd 2749482 +MimeMessageBegin 2749483 +MimeMessageHeadersEnd 2749739 +MimeEntityBegin 2749483 +MimeEntityHeadersEnd 2749739 +MimeContentBegin 2749739 +MimeContentEnd 2749995 +MimeEntityEnd 2749996 +MimeMessageEnd 2749996 +MboxMarkerBegin 2749996 +MboxMarkerEnd 2750003 +MimeMessageBegin 2750004 +MimeMessageHeadersEnd 2750661 +MimeEntityBegin 2750004 +MimeEntityHeadersEnd 2750661 +MimeContentBegin 2750661 +MimeContentEnd 2751385 +MimeEntityEnd 2751386 +MimeMessageEnd 2751386 +MboxMarkerBegin 2751386 +MboxMarkerEnd 2751393 +MimeMessageBegin 2751394 +MimeMessageHeadersEnd 2752379 +MimeEntityBegin 2751394 +MimeEntityHeadersEnd 2752379 +MimeContentBegin 2752379 +MultipartPreambleBegin 2752379 +MultipartPreambleEnd 2752381 +MultipartBoundaryBegin 2752381 +MultipartBoundaryEnd 2752420 +MimeEntityBegin 2752420 +MimeEntityHeadersEnd 2752466 +MimeContentBegin 2752466 +MimeContentEnd 2752538 +MimeEntityEnd 2752539 +MultipartBoundaryBegin 2752539 +MultipartBoundaryEnd 2752578 +MimeEntityBegin 2752578 +MimeEntityHeadersEnd 2752665 +MimeContentBegin 2752665 +MultipartPreambleBegin 2752665 +MultipartPreambleEnd 2752667 +MultipartBoundaryBegin 2752667 +MultipartBoundaryEnd 2752707 +MimeEntityBegin 2752707 +MimeEntityHeadersEnd 2752862 +MimeContentBegin 2752862 +MimeContentEnd 2818779 +MimeEntityEnd 2818780 +MultipartBoundaryBegin 2818780 +MultipartBoundaryEnd 2818820 +MimeEntityBegin 2818820 +MimeEntityHeadersEnd 2819029 +MimeContentBegin 2819029 +MimeContentEnd 3183310 +MimeEntityEnd 3183311 +MultipartEndBoundaryBegin 3183311 +MultipartEndBoundaryEnd 3183352 +MultipartEpilogueBegin 3183352 +MultipartEpilogueEnd 3183354 +MimeEntityEnd 3183355 +MultipartEndBoundaryBegin 3183355 +MultipartEndBoundaryEnd 3183395 +MultipartEpilogueBegin 3183395 +MultipartEpilogueEnd 3183395 +MimeEntityEnd 3183396 +MimeMessageEnd 3183396 +MboxMarkerBegin 3183396 +MboxMarkerEnd 3183403 +MimeMessageBegin 3183404 +MimeMessageHeadersEnd 3184389 +MimeEntityBegin 3183404 +MimeEntityHeadersEnd 3184389 +MimeContentBegin 3184389 +MultipartPreambleBegin 3184389 +MultipartPreambleEnd 3184391 +MultipartBoundaryBegin 3184391 +MultipartBoundaryEnd 3184430 +MimeEntityBegin 3184430 +MimeEntityHeadersEnd 3184476 +MimeContentBegin 3184476 +MimeContentEnd 3184548 +MimeEntityEnd 3184549 +MultipartBoundaryBegin 3184549 +MultipartBoundaryEnd 3184588 +MimeEntityBegin 3184588 +MimeEntityHeadersEnd 3184674 +MimeContentBegin 3184674 +MultipartPreambleBegin 3184674 +MultipartPreambleEnd 3184676 +MultipartBoundaryBegin 3184676 +MultipartBoundaryEnd 3184716 +MimeEntityBegin 3184716 +MimeEntityHeadersEnd 3184871 +MimeContentBegin 3184871 +MimeContentEnd 3250788 +MimeEntityEnd 3250789 +MultipartBoundaryBegin 3250789 +MultipartBoundaryEnd 3250829 +MimeEntityBegin 3250829 +MimeEntityHeadersEnd 3251038 +MimeContentBegin 3251038 +MimeContentEnd 3615319 +MimeEntityEnd 3615320 +MultipartEndBoundaryBegin 3615320 +MultipartEndBoundaryEnd 3615361 +MultipartEpilogueBegin 3615361 +MultipartEpilogueEnd 3615363 +MimeEntityEnd 3615364 +MultipartEndBoundaryBegin 3615364 +MultipartEndBoundaryEnd 3615404 +MultipartEpilogueBegin 3615404 +MultipartEpilogueEnd 3615404 +MimeEntityEnd 3615405 +MimeMessageEnd 3615405 +MboxMarkerBegin 3615405 +MboxMarkerEnd 3615412 +MimeMessageBegin 3615413 +MimeMessageHeadersEnd 3615971 +MimeEntityBegin 3615413 +MimeEntityHeadersEnd 3615971 +MimeContentBegin 3615971 +MimeMessageBegin 3615971 +MimeMessageHeadersEnd 3616030 +MimeEntityBegin 3615971 +MimeEntityHeadersEnd 3616030 +MimeContentBegin 3616030 +MimeContentEnd 3616557 +MimeEntityEnd 3616558 +MimeMessageEnd 3616558 +MimeContentEnd 3616558 +MimeEntityEnd 3616558 +MimeMessageEnd 3616558 +MboxMarkerBegin 3616558 +MboxMarkerEnd 3616565 +MimeMessageBegin 3616566 +MimeMessageHeadersEnd 3617279 +MimeEntityBegin 3616566 +MimeEntityHeadersEnd 3617279 +MimeContentBegin 3617279 +MultipartPreambleBegin 3617279 +MultipartPreambleEnd 3617280 +MultipartBoundaryBegin 3617280 +MultipartBoundaryEnd 3617323 +MimeEntityBegin 3617323 +MimeEntityHeadersEnd 3617349 +MimeContentBegin 3617349 +MimeContentEnd 3617529 +MimeEntityEnd 3617530 +MultipartBoundaryBegin 3617530 +MultipartBoundaryEnd 3617573 +MimeEntityBegin 3617573 +MimeEntityHeadersEnd 3617645 +MimeContentBegin 3617645 +MimeContentEnd 3618537 +MimeEntityEnd 3618538 +MultipartEndBoundaryBegin 3618538 +MultipartEndBoundaryEnd 3618582 +MultipartEpilogueBegin 3618582 +MultipartEpilogueEnd 3618690 +MimeEntityEnd 3618691 +MimeMessageEnd 3618691 +MboxMarkerBegin 3618691 +MboxMarkerEnd 3618698 +MimeMessageBegin 3618699 +MimeMessageHeadersEnd 3619238 +MimeEntityBegin 3618699 +MimeEntityHeadersEnd 3619238 +MimeContentBegin 3619238 +MultipartPreambleBegin 3619238 +MultipartPreambleEnd 3619275 +MultipartBoundaryBegin 3619275 +MultipartBoundaryEnd 3619314 +MimeEntityBegin 3619314 +MimeEntityHeadersEnd 3619315 +MimeContentBegin 3619315 +MimeContentEnd 3619707 +MimeEntityEnd 3619708 +MultipartBoundaryBegin 3619708 +MultipartBoundaryEnd 3619747 +MimeEntityBegin 3619747 +MimeEntityHeadersEnd 3619777 +MimeContentBegin 3619777 +MimeMessageBegin 3619777 +MimeMessageHeadersEnd 3620564 +MimeEntityBegin 3619777 +MimeEntityHeadersEnd 3620564 +MimeContentBegin 3620564 +MimeContentEnd 3623917 +MimeEntityEnd 3623918 +MimeMessageEnd 3623918 +MimeContentEnd 3623918 +MimeEntityEnd 3623918 +MultipartEndBoundaryBegin 3623918 +MultipartEndBoundaryEnd 3623958 +MultipartEpilogueBegin 3623958 +MultipartEpilogueEnd 3623959 +MimeEntityEnd 3623960 +MimeMessageEnd 3623960 +MboxMarkerBegin 3623960 +MboxMarkerEnd 3623967 +MimeMessageBegin 3623968 +MimeMessageHeadersEnd 3624617 +MimeEntityBegin 3623968 +MimeEntityHeadersEnd 3624617 +MimeContentBegin 3624617 +MultipartPreambleBegin 3624617 +MultipartPreambleEnd 3624617 +MultipartBoundaryBegin 3624617 +MultipartBoundaryEnd 3624666 +MimeEntityBegin 3624666 +MimeEntityHeadersEnd 3624692 +MimeContentBegin 3624692 +MimeContentEnd 3624766 +MimeEntityEnd 3624767 +MultipartBoundaryBegin 3624767 +MultipartBoundaryEnd 3624816 +MimeEntityBegin 3624816 +MimeEntityHeadersEnd 3624878 +MimeContentBegin 3624878 +MimeMessageBegin 3624878 +MimeMessageHeadersEnd 3625660 +MimeEntityBegin 3624878 +MimeEntityHeadersEnd 3625660 +MimeContentBegin 3625660 +MimeContentEnd 3625797 +MimeEntityEnd 3625798 +MimeMessageEnd 3625798 +MimeContentEnd 3625798 +MimeEntityEnd 3625798 +MultipartEndBoundaryBegin 3625798 +MultipartEndBoundaryEnd 3625848 +MultipartEpilogueBegin 3625848 +MultipartEpilogueEnd 3625848 +MimeEntityEnd 3625849 +MimeMessageEnd 3625849 +MboxMarkerBegin 3625849 +MboxMarkerEnd 3625856 +MimeMessageBegin 3625857 +MimeMessageHeadersEnd 3626367 +MimeEntityBegin 3625857 +MimeEntityHeadersEnd 3626367 +MimeContentBegin 3626367 +MimeContentEnd 3627786 +MimeEntityEnd 3627787 +MimeMessageEnd 3627787 +MboxMarkerBegin 3627787 +MboxMarkerEnd 3627837 +MimeMessageBegin 3627838 +MimeMessageHeadersEnd 3628410 +MimeEntityBegin 3627838 +MimeEntityHeadersEnd 3628410 +MimeContentBegin 3628410 +MimeContentEnd 3688111 +MimeEntityEnd 3688112 +MimeMessageEnd 3688112 +MboxMarkerBegin 3688112 +MboxMarkerEnd 3688162 +MimeMessageBegin 3688163 +MimeMessageHeadersEnd 3688732 +MimeEntityBegin 3688163 +MimeEntityHeadersEnd 3688732 +MimeContentBegin 3688732 +MimeContentEnd 3748539 +MimeEntityEnd 3748540 +MimeMessageEnd 3748540 +MboxMarkerBegin 3748540 +MboxMarkerEnd 3748547 +MimeMessageBegin 3748548 +MimeMessageHeadersEnd 3749096 +MimeEntityBegin 3748548 +MimeEntityHeadersEnd 3749096 +MimeContentBegin 3749096 +MultipartPreambleBegin 3749096 +MultipartPreambleEnd 3749097 +MultipartBoundaryBegin 3749097 +MultipartBoundaryEnd 3749112 +MimeEntityBegin 3749112 +MimeEntityHeadersEnd 3749139 +MimeContentBegin 3749139 +MimeContentEnd 3749210 +MimeEntityEnd 3749211 +MultipartBoundaryBegin 3749211 +MultipartBoundaryEnd 3749226 +MimeEntityBegin 3749226 +MimeEntityHeadersEnd 3749307 +MimeContentBegin 3749307 +MimeContentEnd 3749948 +MimeEntityEnd 3749949 +MultipartEndBoundaryBegin 3749949 +MultipartEndBoundaryEnd 3749965 +MultipartEpilogueBegin 3749965 +MultipartEpilogueEnd 3749967 +MimeEntityEnd 3749968 +MimeMessageEnd 3749968 +MboxMarkerBegin 3749968 +MboxMarkerEnd 3749975 +MimeMessageBegin 3749976 +MimeMessageHeadersEnd 3750723 +MimeEntityBegin 3749976 +MimeEntityHeadersEnd 3750723 +MimeContentBegin 3750723 +MimeContentEnd 3792253 +MimeEntityEnd 3792254 +MimeMessageEnd 3792254 +MboxMarkerBegin 3792254 +MboxMarkerEnd 3792261 +MimeMessageBegin 3792262 +MimeMessageHeadersEnd 3793416 +MimeEntityBegin 3792262 +MimeEntityHeadersEnd 3793416 +MimeContentBegin 3793416 +MultipartPreambleBegin 3793416 +MultipartPreambleEnd 3793416 +MultipartBoundaryBegin 3793416 +MultipartBoundaryEnd 3793421 +MimeEntityBegin 3793421 +MimeEntityHeadersEnd 3793422 +MimeContentBegin 3793422 +MimeContentEnd 3795344 +MimeEntityEnd 3795345 +MultipartBoundaryBegin 3795345 +MultipartBoundaryEnd 3795350 +MimeEntityBegin 3795350 +MimeEntityHeadersEnd 3795455 +MimeContentBegin 3795455 +MimeContentEnd 3801677 +MimeEntityEnd 3801678 +MultipartEndBoundaryBegin 3801678 +MultipartEndBoundaryEnd 3801684 +MultipartEpilogueBegin 3801684 +MultipartEpilogueEnd 3801685 +MimeEntityEnd 3801686 +MimeMessageEnd 3801686 +MboxMarkerBegin 3801686 +MboxMarkerEnd 3801693 +MimeMessageBegin 3801694 +MimeMessageHeadersEnd 3803142 +MimeEntityBegin 3801694 +MimeEntityHeadersEnd 3803142 +MimeContentBegin 3803142 +MimeContentEnd 3909955 +MimeEntityEnd 3909956 +MimeMessageEnd 3909956 +MboxMarkerBegin 3909956 +MboxMarkerEnd 3909963 +MimeMessageBegin 3909964 +MimeMessageHeadersEnd 3910563 +MimeEntityBegin 3909964 +MimeEntityHeadersEnd 3910563 +MimeContentBegin 3910563 +MimeMessageBegin 3910563 +MimeMessageHeadersEnd 3911133 +MimeEntityBegin 3910563 +MimeEntityHeadersEnd 3911133 +MimeContentBegin 3911133 +MimeMessageBegin 3911133 +MimeMessageHeadersEnd 3911675 +MimeEntityBegin 3911133 +MimeEntityHeadersEnd 3911675 +MimeContentBegin 3911675 +MimeMessageBegin 3911675 +MimeMessageHeadersEnd 3912223 +MimeEntityBegin 3911675 +MimeEntityHeadersEnd 3912223 +MimeContentBegin 3912223 +MultipartPreambleBegin 3912223 +MultipartPreambleEnd 3912269 +MultipartBoundaryBegin 3912269 +MultipartBoundaryEnd 3912327 +MimeEntityBegin 3912327 +MimeEntityHeadersEnd 3912403 +MimeContentBegin 3912403 +MimeContentEnd 3912452 +MimeEntityEnd 3912453 +MultipartBoundaryBegin 3912453 +MultipartBoundaryEnd 3912511 +MimeEntityBegin 3912511 +MimeEntityHeadersEnd 3912573 +MimeContentBegin 3912573 +MimeMessageBegin 3912573 +MimeMessageHeadersEnd 3913073 +MimeEntityBegin 3912573 +MimeEntityHeadersEnd 3913073 +MimeContentBegin 3913073 +MultipartPreambleBegin 3913073 +MultipartPreambleEnd 3913119 +MultipartBoundaryBegin 3913119 +MultipartBoundaryEnd 3913167 +MimeEntityBegin 3913167 +MimeEntityHeadersEnd 3913243 +MimeContentBegin 3913243 +MimeContentEnd 3913365 +MimeEntityEnd 3913366 +MultipartBoundaryBegin 3913366 +MultipartBoundaryEnd 3913414 +MimeEntityBegin 3913414 +MimeEntityHeadersEnd 3913483 +MimeContentBegin 3913483 +MimeContentEnd 3913766 +MimeEntityEnd 3913767 +MultipartEndBoundaryBegin 3913767 +MultipartEndBoundaryEnd 3913816 +MultipartEpilogueBegin 3913816 +MultipartEpilogueEnd 3913817 +MimeEntityEnd 3913818 +MimeMessageEnd 3913818 +MimeContentEnd 3913818 +MimeEntityEnd 3913818 +MultipartEndBoundaryBegin 3913818 +MultipartEndBoundaryEnd 3913877 +MultipartEpilogueBegin 3913877 +MultipartEpilogueEnd 3913880 +MimeEntityEnd 3913881 +MimeMessageEnd 3913881 +MimeContentEnd 3913881 +MimeEntityEnd 3913881 +MimeMessageEnd 3913881 +MimeContentEnd 3913881 +MimeEntityEnd 3913881 +MimeMessageEnd 3913881 +MimeContentEnd 3913881 +MimeEntityEnd 3913881 +MimeMessageEnd 3913881 +MboxMarkerBegin 3913881 +MboxMarkerEnd 3913888 +MimeMessageBegin 3913889 +MimeMessageHeadersEnd 3914592 +MimeEntityBegin 3913889 +MimeEntityHeadersEnd 3914592 +MimeContentBegin 3914592 +MultipartPreambleBegin 3914592 +MultipartPreambleEnd 3914592 +MultipartBoundaryBegin 3914592 +MultipartBoundaryEnd 3914619 +MimeEntityBegin 3914619 +MimeEntityHeadersEnd 3914620 +MimeContentBegin 3914620 +MimeContentEnd 3914661 +MimeEntityEnd 3914662 +MultipartBoundaryBegin 3914662 +MultipartBoundaryEnd 3914689 +MimeEntityBegin 3914689 +MimeEntityHeadersEnd 3914834 +MimeContentBegin 3914834 +MimeContentEnd 3992050 +MimeEntityEnd 3992051 +MultipartBoundaryBegin 3992051 +MultipartBoundaryEnd 3992078 +MimeEntityBegin 3992078 +MimeEntityHeadersEnd 3992079 +MimeContentBegin 3992079 +MimeContentEnd 3992110 +MimeEntityEnd 3992111 +MultipartBoundaryBegin 3992111 +MultipartBoundaryEnd 3992138 +MimeEntityBegin 3992138 +MimeEntityHeadersEnd 3992285 +MimeContentBegin 3992285 +MimeContentEnd 4095487 +MimeEntityEnd 4095488 +MultipartBoundaryBegin 4095488 +MultipartBoundaryEnd 4095515 +MimeEntityBegin 4095515 +MimeEntityHeadersEnd 4095516 +MimeContentBegin 4095516 +MimeContentEnd 4095676 +MimeEntityEnd 4095677 +MultipartBoundaryBegin 4095677 +MultipartBoundaryEnd 4095704 +MimeEntityBegin 4095704 +MimeEntityHeadersEnd 4095793 +MimeContentBegin 4095793 +MimeContentEnd 4175983 +MimeEntityEnd 4175984 +MultipartBoundaryBegin 4175984 +MultipartBoundaryEnd 4176011 +MimeEntityBegin 4176011 +MimeEntityHeadersEnd 4176012 +MimeContentBegin 4176012 +MimeContentEnd 4176032 +MimeEntityEnd 4176033 +MultipartEndBoundaryBegin 4176033 +MultipartEndBoundaryEnd 4176061 +MultipartEpilogueBegin 4176061 +MultipartEpilogueEnd 4176062 +MimeEntityEnd 4176063 +MimeMessageEnd 4176063 +MboxMarkerBegin 4176063 +MboxMarkerEnd 4176070 +MimeMessageBegin 4176071 +MimeMessageHeadersEnd 4176736 +MimeEntityBegin 4176071 +MimeEntityHeadersEnd 4176736 +MimeContentBegin 4176736 +MimeContentEnd 4177728 +MimeEntityEnd 4177729 +MimeMessageEnd 4177729 +MboxMarkerBegin 4177729 +MboxMarkerEnd 4177736 +MimeMessageBegin 4177737 +MimeMessageHeadersEnd 4178793 +MimeEntityBegin 4177737 +MimeEntityHeadersEnd 4178793 +MimeContentBegin 4178793 +MultipartPreambleBegin 4178793 +MultipartPreambleEnd 4178948 +MultipartBoundaryBegin 4178948 +MultipartBoundaryEnd 4178988 +MimeEntityBegin 4178988 +MimeEntityHeadersEnd 4179032 +MimeContentBegin 4179032 +MimeContentEnd 4179436 +MimeEntityEnd 4179437 +MultipartBoundaryBegin 4179437 +MultipartBoundaryEnd 4179477 +MimeEntityBegin 4179477 +MimeEntityHeadersEnd 4179562 +MimeContentBegin 4179562 +MultipartPreambleBegin 4179562 +MultipartPreambleEnd 4179562 +MultipartBoundaryBegin 4179562 +MultipartBoundaryEnd 4179604 +MimeEntityBegin 4179604 +MimeEntityHeadersEnd 4179695 +MimeContentBegin 4179695 +MimeContentEnd 4179920 +MimeEntityEnd 4179921 +MultipartBoundaryBegin 4179921 +MultipartBoundaryEnd 4179963 +MimeEntityBegin 4179963 +MimeEntityHeadersEnd 4180082 +MimeContentBegin 4180082 +MimeContentEnd 4181466 +MimeEntityEnd 4181467 +MultipartBoundaryBegin 4181467 +MultipartBoundaryEnd 4181509 +MimeEntityBegin 4181509 +MimeEntityHeadersEnd 4181600 +MimeContentBegin 4181600 +MimeContentEnd 4181748 +MimeEntityEnd 4181749 +MultipartEndBoundaryBegin 4181749 +MultipartEndBoundaryEnd 4181792 +MultipartEpilogueBegin 4181792 +MultipartEpilogueEnd 4181793 +MimeEntityEnd 4181794 +MultipartEndBoundaryBegin 4181794 +MultipartEndBoundaryEnd 4181835 +MultipartEpilogueBegin 4181835 +MultipartEpilogueEnd 4181836 +MimeEntityEnd 4181837 +MimeMessageEnd 4181837 +MboxMarkerBegin 4181837 +MboxMarkerEnd 4181844 +MimeMessageBegin 4181845 +MimeMessageHeadersEnd 4182515 +MimeEntityBegin 4181845 +MimeEntityHeadersEnd 4182515 +MimeContentBegin 4182515 +MultipartPreambleBegin 4182515 +MultipartPreambleEnd 4182515 +MultipartBoundaryBegin 4182515 +MultipartBoundaryEnd 4182531 +MimeEntityBegin 4182531 +MimeEntityHeadersEnd 4182558 +MimeContentBegin 4182558 +MimeContentEnd 4182636 +MimeEntityEnd 4182637 +MultipartBoundaryBegin 4182637 +MultipartBoundaryEnd 4182653 +MimeEntityBegin 4182653 +MimeEntityHeadersEnd 4182713 +MimeContentBegin 4182713 +MimeContentEnd 4187876 +MimeEntityEnd 4187877 +MultipartEndBoundaryBegin 4187877 +MultipartEndBoundaryEnd 4187894 +MultipartEpilogueBegin 4187894 +MultipartEpilogueEnd 4187896 +MimeEntityEnd 4187897 +MimeMessageEnd 4187897 +MboxMarkerBegin 4187897 +MboxMarkerEnd 4187904 +MimeMessageBegin 4187905 +MimeMessageHeadersEnd 4188357 +MimeEntityBegin 4187905 +MimeEntityHeadersEnd 4188357 +MimeContentBegin 4188357 +MimeContentEnd 4199771 +MimeEntityEnd 4199772 +MimeMessageEnd 4199772 +MboxMarkerBegin 4199772 +MboxMarkerEnd 4199779 +MimeMessageBegin 4199780 +MimeMessageHeadersEnd 4200345 +MimeEntityBegin 4199780 +MimeEntityHeadersEnd 4200345 +MimeContentBegin 4200345 +MultipartPreambleBegin 4200345 +MultipartPreambleEnd 4200345 +MultipartBoundaryBegin 4200345 +MultipartBoundaryEnd 4200356 +MimeEntityBegin 4200356 +MimeEntityHeadersEnd 4200357 +MimeContentBegin 4200357 +MimeContentEnd 4200395 +MimeEntityEnd 4200396 +MultipartBoundaryBegin 4200396 +MultipartBoundaryEnd 4200407 +MimeEntityBegin 4200407 +MimeEntityHeadersEnd 4200462 +MimeContentBegin 4200462 +MultipartPreambleBegin 4200462 +MultipartPreambleEnd 4200462 +MultipartBoundaryBegin 4200462 +MultipartBoundaryEnd 4200476 +MimeEntityBegin 4200476 +MimeEntityHeadersEnd 4200592 +MimeContentBegin 4200592 +MimeMessageBegin 4200592 +MimeMessageHeadersEnd 4200669 +MimeEntityBegin 4200592 +MimeEntityHeadersEnd 4200669 +MimeContentBegin 4200669 +MimeContentEnd 4200736 +MimeEntityEnd 4200737 +MimeMessageEnd 4200737 +MimeContentEnd 4200737 +MimeEntityEnd 4200737 +MultipartBoundaryBegin 4200737 +MultipartBoundaryEnd 4200751 +MimeEntityBegin 4200751 +MimeEntityHeadersEnd 4200938 +MimeContentBegin 4200938 +MimeMessageBegin 4200938 +MimeMessageHeadersEnd 4201015 +MimeEntityBegin 4200938 +MimeEntityHeadersEnd 4201015 +MimeContentBegin 4201015 +MimeContentEnd 4201015 +MimeEntityEnd 4201015 +MimeMessageEnd 4201015 +MimeContentEnd 4201015 +MimeEntityEnd 4201015 +MultipartBoundaryBegin 4201015 +MultipartBoundaryEnd 4201029 +MimeEntityBegin 4201029 +MimeEntityHeadersEnd 4201164 +MimeContentBegin 4201164 +MimeMessageBegin 4201164 +MimeMessageHeadersEnd 4201232 +MimeEntityBegin 4201164 +MimeEntityHeadersEnd 4201232 +MimeContentBegin 4201232 +MimeContentEnd 4201232 +MimeEntityEnd 4201232 +MimeMessageEnd 4201232 +MimeContentEnd 4201232 +MimeEntityEnd 4201232 +MultipartBoundaryBegin 4201232 +MultipartBoundaryEnd 4201246 +MimeEntityBegin 4201246 +MimeEntityHeadersEnd 4201359 +MimeContentBegin 4201359 +MimeMessageBegin 4201359 +MimeMessageHeadersEnd 4201428 +MimeEntityBegin 4201359 +MimeEntityHeadersEnd 4201428 +MimeContentBegin 4201428 +MimeContentEnd 4201428 +MimeEntityEnd 4201428 +MimeMessageEnd 4201428 +MimeContentEnd 4201428 +MimeEntityEnd 4201428 +MultipartBoundaryBegin 4201428 +MultipartBoundaryEnd 4201442 +MimeEntityBegin 4201442 +MimeEntityHeadersEnd 4201547 +MimeContentBegin 4201547 +MimeMessageBegin 4201547 +MimeMessageHeadersEnd 4201616 +MimeEntityBegin 4201547 +MimeEntityHeadersEnd 4201616 +MimeContentBegin 4201616 +MimeContentEnd 4201616 +MimeEntityEnd 4201616 +MimeMessageEnd 4201616 +MimeContentEnd 4201616 +MimeEntityEnd 4201616 +MultipartEndBoundaryBegin 4201616 +MultipartEndBoundaryEnd 4201631 +MultipartEpilogueBegin 4201631 +MultipartEpilogueEnd 4201632 +MimeEntityEnd 4201633 +MultipartEndBoundaryBegin 4201633 +MultipartEndBoundaryEnd 4201645 +MultipartEpilogueBegin 4201645 +MultipartEpilogueEnd 4201646 +MimeEntityEnd 4201647 +MimeMessageEnd 4201647 +MboxMarkerBegin 4201647 +MboxMarkerEnd 4201654 +MimeMessageBegin 4201655 +MimeMessageHeadersEnd 4202220 +MimeEntityBegin 4201655 +MimeEntityHeadersEnd 4202220 +MimeContentBegin 4202220 +MultipartPreambleBegin 4202220 +MultipartPreambleEnd 4202220 +MultipartBoundaryBegin 4202220 +MultipartBoundaryEnd 4202231 +MimeEntityBegin 4202231 +MimeEntityHeadersEnd 4202232 +MimeContentBegin 4202232 +MimeContentEnd 4205436 +MimeEntityEnd 4205437 +MultipartBoundaryBegin 4205437 +MultipartBoundaryEnd 4205448 +MimeEntityBegin 4205448 +MimeEntityHeadersEnd 4205509 +MimeContentBegin 4205509 +MultipartPreambleBegin 4205509 +MultipartPreambleEnd 4205509 +MultipartBoundaryBegin 4205509 +MultipartBoundaryEnd 4205523 +MimeEntityBegin 4205523 +MimeEntityHeadersEnd 4205639 +MimeContentBegin 4205639 +MimeMessageBegin 4205639 +MimeMessageHeadersEnd 4205716 +MimeEntityBegin 4205639 +MimeEntityHeadersEnd 4205716 +MimeContentBegin 4205716 +MimeContentEnd 4205783 +MimeEntityEnd 4205784 +MimeMessageEnd 4205784 +MimeContentEnd 4205784 +MimeEntityEnd 4205784 +MultipartBoundaryBegin 4205784 +MultipartBoundaryEnd 4205798 +MimeEntityBegin 4205798 +MimeEntityHeadersEnd 4205985 +MimeContentBegin 4205985 +MimeMessageBegin 4205985 +MimeMessageHeadersEnd 4206062 +MimeEntityBegin 4205985 +MimeEntityHeadersEnd 4206062 +MimeContentBegin 4206062 +MimeContentEnd 4206062 +MimeEntityEnd 4206062 +MimeMessageEnd 4206062 +MimeContentEnd 4206062 +MimeEntityEnd 4206062 +MultipartEndBoundaryBegin 4206062 +MultipartEndBoundaryEnd 4206077 +MultipartEpilogueBegin 4206077 +MultipartEpilogueEnd 4206078 +MimeEntityEnd 4206079 +MultipartEndBoundaryBegin 4206079 +MultipartEndBoundaryEnd 4206091 +MultipartEpilogueBegin 4206091 +MultipartEpilogueEnd 4206092 +MimeEntityEnd 4206093 +MimeMessageEnd 4206093 +MboxMarkerBegin 4206093 +MboxMarkerEnd 4206100 +MimeMessageBegin 4206101 +MimeMessageHeadersEnd 4206569 +MimeEntityBegin 4206101 +MimeEntityHeadersEnd 4206569 +MimeContentBegin 4206569 +MultipartPreambleBegin 4206569 +MultipartPreambleEnd 4206615 +MultipartBoundaryBegin 4206615 +MultipartBoundaryEnd 4206642 +MimeEntityBegin 4206642 +MimeEntityHeadersEnd 4206786 +MimeContentBegin 4206786 +MimeMessageBegin 4206786 +MimeMessageHeadersEnd 4207215 +MimeEntityBegin 4206786 +MimeEntityHeadersEnd 4207215 +MimeContentBegin 4207215 +MimeContentEnd 4207252 +MimeEntityEnd 4207253 +MimeMessageEnd 4207253 +MimeContentEnd 4207253 +MimeEntityEnd 4207253 +MultipartBoundaryBegin 4207253 +MultipartBoundaryEnd 4207280 +MimeEntityBegin 4207280 +MimeEntityHeadersEnd 4207403 +MimeContentBegin 4207403 +MimeContentEnd 4207861 +MimeEntityEnd 4207862 +MultipartBoundaryBegin 4207862 +MultipartBoundaryEnd 4207889 +MimeEntityBegin 4207889 +MimeEntityHeadersEnd 4208012 +MimeContentBegin 4208012 +MimeContentEnd 4208498 +MimeEntityEnd 4208499 +MultipartBoundaryBegin 4208499 +MultipartBoundaryEnd 4208526 +MimeEntityBegin 4208526 +MimeEntityHeadersEnd 4208653 +MimeContentBegin 4208653 +MimeContentEnd 4209180 +MimeEntityEnd 4209181 +MultipartBoundaryBegin 4209181 +MultipartBoundaryEnd 4209208 +MimeEntityBegin 4209208 +MimeEntityHeadersEnd 4209333 +MimeContentBegin 4209333 +MimeContentEnd 4209831 +MimeEntityEnd 4209832 +MultipartBoundaryBegin 4209832 +MultipartBoundaryEnd 4209859 +MimeEntityBegin 4209859 +MimeEntityHeadersEnd 4210003 +MimeContentBegin 4210003 +MimeMessageBegin 4210003 +MimeMessageHeadersEnd 4210432 +MimeEntityBegin 4210003 +MimeEntityHeadersEnd 4210432 +MimeContentBegin 4210432 +MimeContentEnd 4210469 +MimeEntityEnd 4210470 +MimeMessageEnd 4210470 +MimeContentEnd 4210470 +MimeEntityEnd 4210470 +MultipartBoundaryBegin 4210470 +MultipartBoundaryEnd 4210497 +MimeEntityBegin 4210497 +MimeEntityHeadersEnd 4210668 +MimeContentBegin 4210668 +MimeMessageBegin 4210668 +MimeMessageHeadersEnd 4211238 +MimeEntityBegin 4210668 +MimeEntityHeadersEnd 4211238 +MimeContentBegin 4211238 +MimeMessageBegin 4211238 +MimeMessageHeadersEnd 4211749 +MimeEntityBegin 4211238 +MimeEntityHeadersEnd 4211749 +MimeContentBegin 4211749 +MimeMessageBegin 4211749 +MimeMessageHeadersEnd 4212159 +MimeEntityBegin 4211749 +MimeEntityHeadersEnd 4212159 +MimeContentBegin 4212159 +MimeContentEnd 4212164 +MimeEntityEnd 4212165 +MimeMessageEnd 4212165 +MimeContentEnd 4212165 +MimeEntityEnd 4212165 +MimeMessageEnd 4212165 +MimeContentEnd 4212165 +MimeEntityEnd 4212165 +MimeMessageEnd 4212165 +MimeContentEnd 4212165 +MimeEntityEnd 4212165 +MultipartBoundaryBegin 4212165 +MultipartBoundaryEnd 4212192 +MimeEntityBegin 4212192 +MimeEntityHeadersEnd 4212245 +MimeContentBegin 4212245 +MimeContentEnd 4212297 +MimeEntityEnd 4212298 +MultipartEndBoundaryBegin 4212298 +MultipartEndBoundaryEnd 4212326 +MultipartEpilogueBegin 4212326 +MultipartEpilogueEnd 4212326 +MimeEntityEnd 4212327 +MimeMessageEnd 4212327 +MboxMarkerBegin 4212327 +MboxMarkerEnd 4212334 +MimeMessageBegin 4212335 +MimeMessageHeadersEnd 4212806 +MimeEntityBegin 4212335 +MimeEntityHeadersEnd 4212806 +MimeContentBegin 4212806 +MultipartPreambleBegin 4212806 +MultipartPreambleEnd 4212852 +MultipartBoundaryBegin 4212852 +MultipartBoundaryEnd 4212879 +MimeEntityBegin 4212879 +MimeEntityHeadersEnd 4213027 +MimeContentBegin 4213027 +MimeMessageBegin 4213027 +MimeMessageHeadersEnd 4213455 +MimeEntityBegin 4213027 +MimeEntityHeadersEnd 4213455 +MimeContentBegin 4213455 +MimeContentEnd 4213492 +MimeEntityEnd 4213493 +MimeMessageEnd 4213493 +MimeContentEnd 4213493 +MimeEntityEnd 4213493 +MultipartBoundaryBegin 4213493 +MultipartBoundaryEnd 4213520 +MimeEntityBegin 4213520 +MimeEntityHeadersEnd 4213647 +MimeContentBegin 4213647 +MimeContentEnd 4214105 +MimeEntityEnd 4214106 +MultipartBoundaryBegin 4214106 +MultipartBoundaryEnd 4214133 +MimeEntityBegin 4214133 +MimeEntityHeadersEnd 4214260 +MimeContentBegin 4214260 +MimeContentEnd 4214746 +MimeEntityEnd 4214747 +MultipartBoundaryBegin 4214747 +MultipartBoundaryEnd 4214774 +MimeEntityBegin 4214774 +MimeEntityHeadersEnd 4214905 +MimeContentBegin 4214905 +MimeContentEnd 4215432 +MimeEntityEnd 4215433 +MultipartBoundaryBegin 4215433 +MultipartBoundaryEnd 4215460 +MimeEntityBegin 4215460 +MimeEntityHeadersEnd 4215589 +MimeContentBegin 4215589 +MimeContentEnd 4216087 +MimeEntityEnd 4216088 +MultipartBoundaryBegin 4216088 +MultipartBoundaryEnd 4216115 +MimeEntityBegin 4216115 +MimeEntityHeadersEnd 4216263 +MimeContentBegin 4216263 +MimeMessageBegin 4216263 +MimeMessageHeadersEnd 4216691 +MimeEntityBegin 4216263 +MimeEntityHeadersEnd 4216691 +MimeContentBegin 4216691 +MimeContentEnd 4216728 +MimeEntityEnd 4216729 +MimeMessageEnd 4216729 +MimeContentEnd 4216729 +MimeEntityEnd 4216729 +MultipartBoundaryBegin 4216729 +MultipartBoundaryEnd 4216756 +MimeEntityBegin 4216756 +MimeEntityHeadersEnd 4216931 +MimeContentBegin 4216931 +MimeMessageBegin 4216931 +MimeMessageHeadersEnd 4217504 +MimeEntityBegin 4216931 +MimeEntityHeadersEnd 4217504 +MimeContentBegin 4217504 +MimeMessageBegin 4217504 +MimeMessageHeadersEnd 4218018 +MimeEntityBegin 4217504 +MimeEntityHeadersEnd 4218018 +MimeContentBegin 4218018 +MimeMessageBegin 4218018 +MimeMessageHeadersEnd 4218427 +MimeEntityBegin 4218018 +MimeEntityHeadersEnd 4218427 +MimeContentBegin 4218427 +MimeContentEnd 4218432 +MimeEntityEnd 4218433 +MimeMessageEnd 4218433 +MimeContentEnd 4218433 +MimeEntityEnd 4218433 +MimeMessageEnd 4218433 +MimeContentEnd 4218433 +MimeEntityEnd 4218433 +MimeMessageEnd 4218433 +MimeContentEnd 4218433 +MimeEntityEnd 4218433 +MultipartBoundaryBegin 4218433 +MultipartBoundaryEnd 4218460 +MimeEntityBegin 4218460 +MimeEntityHeadersEnd 4218517 +MimeContentBegin 4218517 +MimeContentEnd 4218569 +MimeEntityEnd 4218570 +MultipartEndBoundaryBegin 4218570 +MultipartEndBoundaryEnd 4218598 +MultipartEpilogueBegin 4218598 +MultipartEpilogueEnd 4218598 +MimeEntityEnd 4218599 +MimeMessageEnd 4218599 +MboxMarkerBegin 4218599 +MboxMarkerEnd 4218606 +MimeMessageBegin 4218607 +MimeMessageHeadersEnd 4219294 +MimeEntityBegin 4218607 +MimeEntityHeadersEnd 4219294 +MimeContentBegin 4219294 +MultipartPreambleBegin 4219294 +MultipartPreambleEnd 4219335 +MultipartBoundaryBegin 4219335 +MultipartBoundaryEnd 4219341 +MimeEntityBegin 4219341 +MimeEntityHeadersEnd 4219370 +MimeContentBegin 4219370 +MimeContentEnd 4219786 +MimeEntityEnd 4219787 +MultipartBoundaryBegin 4219787 +MultipartBoundaryEnd 4219793 +MimeEntityBegin 4219793 +MimeEntityHeadersEnd 4219866 +MimeContentBegin 4219866 +MimeContentEnd 4220497 +MimeEntityEnd 4220498 +MultipartBoundaryBegin 4220498 +MultipartBoundaryEnd 4220504 +MimeEntityBegin 4220504 +MimeEntityHeadersEnd 4220505 +MimeContentBegin 4220505 +MimeContentEnd 4220523 +MimeEntityEnd 4220524 +MultipartBoundaryBegin 4220524 +MultipartBoundaryEnd 4220530 +MimeEntityBegin 4220530 +MimeEntityHeadersEnd 4220531 +MimeContentBegin 4220531 +MimeContentEnd 4220542 +MimeEntityEnd 4220543 +MultipartBoundaryBegin 4220543 +MultipartBoundaryEnd 4220549 +MimeEntityBegin 4220549 +MimeEntityHeadersEnd 4220579 +MimeContentBegin 4220579 +MimeMessageBegin 4220579 +MimeMessageHeadersEnd 4220794 +MimeEntityBegin 4220579 +MimeEntityHeadersEnd 4220794 +MimeContentBegin 4220794 +MultipartPreambleBegin 4220794 +MultipartPreambleEnd 4220794 +MultipartBoundaryBegin 4220794 +MultipartBoundaryEnd 4220800 +MimeEntityBegin 4220800 +MimeEntityHeadersEnd 4220825 +MimeContentBegin 4220825 +MimeContentEnd 4220848 +MimeEntityEnd 4220849 +MultipartBoundaryBegin 4220849 +MultipartBoundaryEnd 4220855 +MimeEntityBegin 4220855 +MimeEntityHeadersEnd 4221030 +MimeContentBegin 4221030 +MimeContentEnd 4221068 +MimeEntityEnd 4221069 +MultipartEndBoundaryBegin 4221069 +MultipartEndBoundaryEnd 4221076 +MultipartEpilogueBegin 4221076 +MultipartEpilogueEnd 4221076 +MimeEntityEnd 4221077 +MimeMessageEnd 4221077 +MimeContentEnd 4221077 +MimeEntityEnd 4221077 +MultipartBoundaryBegin 4221077 +MultipartBoundaryEnd 4221083 +MimeEntityBegin 4221083 +MimeEntityHeadersEnd 4221161 +MimeContentBegin 4221161 +MimeContentEnd 4230592 +MimeEntityEnd 4230593 +MultipartBoundaryBegin 4230593 +MultipartBoundaryEnd 4230599 +MimeEntityBegin 4230599 +MimeEntityHeadersEnd 4230774 +MimeContentBegin 4230774 +MimeContentEnd 4230812 +MimeEntityEnd 4230813 +MultipartBoundaryBegin 4230813 +MultipartBoundaryEnd 4230819 +MimeEntityBegin 4230819 +MimeEntityHeadersEnd 4230967 +MimeContentBegin 4230967 +MimeContentEnd 4238788 +MimeEntityEnd 4238789 +MultipartBoundaryBegin 4238789 +MultipartBoundaryEnd 4238795 +MimeEntityBegin 4238795 +MimeEntityHeadersEnd 4238847 +MimeContentBegin 4238847 +MultipartPreambleBegin 4238847 +MultipartPreambleEnd 4238847 +MultipartBoundaryBegin 4238847 +MultipartBoundaryEnd 4238857 +MimeEntityBegin 4238857 +MimeEntityHeadersEnd 4238858 +MimeContentBegin 4238858 +MimeMessageBegin 4238858 +MimeMessageHeadersEnd 4238884 +MimeEntityBegin 4238858 +MimeEntityHeadersEnd 4238884 +MimeContentBegin 4238884 +MimeContentEnd 4238889 +MimeEntityEnd 4238890 +MimeMessageEnd 4238890 +MimeContentEnd 4238890 +MimeEntityEnd 4238890 +MultipartBoundaryBegin 4238890 +MultipartBoundaryEnd 4238900 +MimeEntityBegin 4238900 +MimeEntityHeadersEnd 4238901 +MimeContentBegin 4238901 +MimeMessageBegin 4238901 +MimeMessageHeadersEnd 4238927 +MimeEntityBegin 4238901 +MimeEntityHeadersEnd 4238927 +MimeContentBegin 4238927 +MimeContentEnd 4238932 +MimeEntityEnd 4238933 +MimeMessageEnd 4238933 +MimeContentEnd 4238933 +MimeEntityEnd 4238933 +MultipartBoundaryBegin 4238933 +MultipartBoundaryEnd 4238943 +MimeEntityBegin 4238943 +MimeEntityHeadersEnd 4238944 +MimeContentBegin 4238944 +MimeMessageBegin 4238944 +MimeMessageHeadersEnd 4238970 +MimeEntityBegin 4238944 +MimeEntityHeadersEnd 4238970 +MimeContentBegin 4238970 +MimeContentEnd 4238975 +MimeEntityEnd 4238976 +MimeMessageEnd 4238976 +MimeContentEnd 4238976 +MimeEntityEnd 4238976 +MultipartBoundaryBegin 4238976 +MultipartBoundaryEnd 4238986 +MimeEntityBegin 4238986 +MimeEntityHeadersEnd 4239011 +MimeContentBegin 4239011 +MimeContentEnd 4239093 +MimeEntityEnd 4239094 +MultipartBoundaryBegin 4239094 +MultipartBoundaryEnd 4239104 +MimeEntityBegin 4239104 +MimeEntityHeadersEnd 4239105 +MimeContentBegin 4239105 +MimeMessageBegin 4239105 +MimeMessageHeadersEnd 4239159 +MimeEntityBegin 4239105 +MimeEntityHeadersEnd 4239159 +MimeContentBegin 4239159 +MimeContentEnd 4239208 +MimeEntityEnd 4239209 +MimeMessageEnd 4239209 +MimeContentEnd 4239209 +MimeEntityEnd 4239209 +MultipartBoundaryBegin 4239209 +MultipartBoundaryEnd 4239219 +MimeEntityBegin 4239219 +MimeEntityHeadersEnd 4239220 +MimeContentBegin 4239220 +MimeMessageBegin 4239220 +MimeMessageHeadersEnd 4239246 +MimeEntityBegin 4239220 +MimeEntityHeadersEnd 4239246 +MimeContentBegin 4239246 +MimeContentEnd 4239251 +MimeEntityEnd 4239252 +MimeMessageEnd 4239252 +MimeContentEnd 4239252 +MimeEntityEnd 4239252 +MultipartEndBoundaryBegin 4239252 +MultipartEndBoundaryEnd 4239263 +MultipartEpilogueBegin 4239263 +MultipartEpilogueEnd 4239263 +MimeEntityEnd 4239264 +MultipartEndBoundaryBegin 4239264 +MultipartEndBoundaryEnd 4239271 +MultipartEpilogueBegin 4239271 +MultipartEpilogueEnd 4239312 +MimeEntityEnd 4239313 +MimeMessageEnd 4239313 +MboxMarkerBegin 4239313 +MboxMarkerEnd 4239320 +MimeMessageBegin 4239321 +MimeMessageHeadersEnd 4239982 +MimeEntityBegin 4239321 +MimeEntityHeadersEnd 4239982 +MimeContentBegin 4239982 +MultipartPreambleBegin 4239982 +MultipartPreambleEnd 4239982 +MultipartBoundaryBegin 4239982 +MultipartBoundaryEnd 4240008 +MimeEntityBegin 4240008 +MimeEntityHeadersEnd 4240009 +MimeContentBegin 4240009 +MimeContentEnd 4241229 +MimeEntityEnd 4241230 +MultipartBoundaryBegin 4241230 +MultipartBoundaryEnd 4241256 +MimeEntityBegin 4241256 +MimeEntityHeadersEnd 4241401 +MimeContentBegin 4241401 +MimeContentEnd 4312718 +MimeEntityEnd 4312719 +MultipartBoundaryBegin 4312719 +MultipartBoundaryEnd 4312745 +MimeEntityBegin 4312745 +MimeEntityHeadersEnd 4312746 +MimeContentBegin 4312746 +MimeContentEnd 4312746 +MimeEntityEnd 4312747 +MultipartEndBoundaryBegin 4312747 +MultipartEndBoundaryEnd 4312774 +MultipartEpilogueBegin 4312774 +MultipartEpilogueEnd 4312775 +MimeEntityEnd 4312776 +MimeMessageEnd 4312776 +MboxMarkerBegin 4312776 +MboxMarkerEnd 4312783 +MimeMessageBegin 4312784 +MimeMessageHeadersEnd 4313717 +MimeEntityBegin 4312784 +MimeEntityHeadersEnd 4313717 +MimeContentBegin 4313717 +MimeContentEnd 4562758 +MimeEntityEnd 4562759 +MimeMessageEnd 4562759 +MboxMarkerBegin 4562759 +MboxMarkerEnd 4562766 +MimeMessageBegin 4562767 +MimeMessageHeadersEnd 4563695 +MimeEntityBegin 4562767 +MimeEntityHeadersEnd 4563695 +MimeContentBegin 4563695 +MultipartPreambleBegin 4563695 +MultipartPreambleEnd 4563890 +MultipartBoundaryBegin 4563890 +MultipartBoundaryEnd 4563935 +MimeEntityBegin 4563935 +MimeEntityHeadersEnd 4564008 +MimeContentBegin 4564008 +MimeContentEnd 4564472 +MimeEntityEnd 4564473 +MultipartBoundaryBegin 4564473 +MultipartBoundaryEnd 4564518 +MimeEntityBegin 4564518 +MimeEntityHeadersEnd 4564577 +MimeContentBegin 4564577 +MimeContentEnd 4588813 +MimeEntityEnd 4588814 +MultipartBoundaryBegin 4588814 +MultipartBoundaryEnd 4588859 +MimeEntityBegin 4588859 +MimeEntityHeadersEnd 4588932 +MimeContentBegin 4588932 +MimeContentEnd 4589380 +MimeEntityEnd 4589381 +MultipartBoundaryBegin 4589381 +MultipartBoundaryEnd 4589426 +MimeEntityBegin 4589426 +MimeEntityHeadersEnd 4589485 +MimeContentBegin 4589485 +MimeContentEnd 4600699 +MimeEntityEnd 4600700 +MultipartBoundaryBegin 4600700 +MultipartBoundaryEnd 4600745 +MimeEntityBegin 4600745 +MimeEntityHeadersEnd 4600818 +MimeContentBegin 4600818 +MimeContentEnd 4601122 +MimeEntityEnd 4601123 +MultipartBoundaryBegin 4601123 +MultipartBoundaryEnd 4601168 +MimeEntityBegin 4601168 +MimeEntityHeadersEnd 4601227 +MimeContentBegin 4601227 +MimeContentEnd 4617677 +MimeEntityEnd 4617678 +MultipartBoundaryBegin 4617678 +MultipartBoundaryEnd 4617723 +MimeEntityBegin 4617723 +MimeEntityHeadersEnd 4617796 +MimeContentBegin 4617796 +MimeContentEnd 4618456 +MimeEntityEnd 4618457 +MultipartEndBoundaryBegin 4618457 +MultipartEndBoundaryEnd 4618503 +MultipartEpilogueBegin 4618503 +MultipartEpilogueEnd 4618504 +MimeEntityEnd 4618505 +MimeMessageEnd 4618505 +MboxMarkerBegin 4618505 +MboxMarkerEnd 4618512 +MimeMessageBegin 4618513 +MimeMessageHeadersEnd 4619332 +MimeEntityBegin 4618513 +MimeEntityHeadersEnd 4619332 +MimeContentBegin 4619332 +MultipartPreambleBegin 4619332 +MultipartPreambleEnd 4619332 +MultipartBoundaryBegin 4619332 +MultipartBoundaryEnd 4619361 +MimeEntityBegin 4619361 +MimeEntityHeadersEnd 4619362 +MimeContentBegin 4619362 +MimeContentEnd 4620012 +MimeEntityEnd 4620013 +MultipartBoundaryBegin 4620013 +MultipartBoundaryEnd 4620042 +MimeEntityBegin 4620042 +MimeEntityHeadersEnd 4620102 +MimeContentBegin 4620102 +MimeContentEnd 4666555 +MimeEntityEnd 4666556 +MultipartEndBoundaryBegin 4666556 +MultipartEndBoundaryEnd 4666586 +MultipartEpilogueBegin 4666586 +MultipartEpilogueEnd 4666587 +MimeEntityEnd 4666588 +MimeMessageEnd 4666588 +MboxMarkerBegin 4666588 +MboxMarkerEnd 4666595 +MimeMessageBegin 4666596 +MimeMessageHeadersEnd 4667343 +MimeEntityBegin 4666596 +MimeEntityHeadersEnd 4667343 +MimeContentBegin 4667343 +MultipartPreambleBegin 4667343 +MultipartPreambleEnd 4667777 +MultipartBoundaryBegin 4667777 +MultipartBoundaryEnd 4667800 +MimeEntityBegin 4667800 +MimeEntityHeadersEnd 4667873 +MimeContentBegin 4667873 +MimeContentEnd 4673188 +MimeEntityEnd 4673189 +MultipartBoundaryBegin 4673189 +MultipartBoundaryEnd 4673212 +MimeEntityBegin 4673212 +MimeEntityHeadersEnd 4673309 +MimeContentBegin 4673309 +MimeContentEnd 4675889 +MimeEntityEnd 4675890 +MultipartBoundaryBegin 4675890 +MultipartBoundaryEnd 4675913 +MimeEntityBegin 4675913 +MimeEntityHeadersEnd 4675986 +MimeContentBegin 4675986 +MimeContentEnd 4676504 +MimeEntityEnd 4676505 +MultipartBoundaryBegin 4676505 +MultipartBoundaryEnd 4676528 +MimeEntityBegin 4676528 +MimeEntityHeadersEnd 4676642 +MimeContentBegin 4676642 +MimeContentEnd 4699702 +MimeEntityEnd 4699703 +MultipartBoundaryBegin 4699703 +MultipartBoundaryEnd 4699726 +MimeEntityBegin 4699726 +MimeEntityHeadersEnd 4699799 +MimeContentBegin 4699799 +MimeContentEnd 4700377 +MimeEntityEnd 4700378 +MultipartBoundaryBegin 4700378 +MultipartBoundaryEnd 4700401 +MimeEntityBegin 4700401 +MimeEntityHeadersEnd 4700486 +MimeContentBegin 4700486 +MimeMessageBegin 4700486 +MimeMessageHeadersEnd 4700556 +MimeEntityBegin 4700486 +MimeEntityHeadersEnd 4700556 +MimeContentBegin 4700556 +MimeContentEnd 4700556 +MimeEntityEnd 4700556 +MimeMessageEnd 4700556 +MimeContentEnd 4700556 +MimeEntityEnd 4700556 +MultipartBoundaryBegin 4700556 +MultipartBoundaryEnd 4700579 +MimeEntityBegin 4700579 +MimeEntityHeadersEnd 4700652 +MimeContentBegin 4700652 +MimeContentEnd 4700928 +MimeEntityEnd 4700929 +MultipartBoundaryBegin 4700929 +MultipartBoundaryEnd 4700952 +MimeEntityBegin 4700952 +MimeEntityHeadersEnd 4701098 +MimeContentBegin 4701098 +MimeMessageBegin 4701098 +MimeMessageHeadersEnd 4701168 +MimeEntityBegin 4701098 +MimeEntityHeadersEnd 4701168 +MimeContentBegin 4701168 +MimeContentEnd 4701168 +MimeEntityEnd 4701168 +MimeMessageEnd 4701168 +MimeContentEnd 4701168 +MimeEntityEnd 4701168 +MultipartBoundaryBegin 4701168 +MultipartBoundaryEnd 4701191 +MimeEntityBegin 4701191 +MimeEntityHeadersEnd 4701264 +MimeContentBegin 4701264 +MimeContentEnd 4702333 +MimeEntityEnd 4702334 +MultipartEndBoundaryBegin 4702334 +MultipartEndBoundaryEnd 4702358 +MultipartEpilogueBegin 4702358 +MultipartEpilogueEnd 4702358 +MimeEntityEnd 4702359 +MimeMessageEnd 4702359 +MboxMarkerBegin 4702359 +MboxMarkerEnd 4702366 +MimeMessageBegin 4702367 +MimeMessageHeadersEnd 4702528 +MimeEntityBegin 4702367 +MimeEntityHeadersEnd 4702528 +MimeContentBegin 4702528 +MultipartPreambleBegin 4702528 +MultipartPreambleEnd 4702528 +MultipartBoundaryBegin 4702528 +MultipartBoundaryEnd 4702540 +MimeEntityBegin 4702540 +MimeEntityHeadersEnd 4702609 +MimeContentBegin 4702609 +MimeContentEnd 4778953 +MimeEntityEnd 4778954 +MultipartBoundaryBegin 4778954 +MultipartBoundaryEnd 4778966 +MimeEntityBegin 4778966 +MimeEntityHeadersEnd 4778967 +MimeContentBegin 4778967 +MimeContentEnd 4778997 +MimeEntityEnd 4778998 +MultipartEndBoundaryBegin 4778998 +MultipartEndBoundaryEnd 4779011 +MultipartEpilogueBegin 4779011 +MultipartEpilogueEnd 4779011 +MimeEntityEnd 4779012 +MimeMessageEnd 4779012 +MboxMarkerBegin 4779012 +MboxMarkerEnd 4779019 +MimeMessageBegin 4779020 +MimeMessageHeadersEnd 4780235 +MimeEntityBegin 4779020 +MimeEntityHeadersEnd 4780235 +MimeContentBegin 4780235 +MultipartPreambleBegin 4780235 +MultipartPreambleEnd 4780235 +MultipartBoundaryBegin 4780235 +MultipartBoundaryEnd 4780273 +MimeEntityBegin 4780273 +MimeEntityHeadersEnd 4780317 +MimeContentBegin 4780317 +MimeContentEnd 4780769 +MimeEntityEnd 4780770 +MultipartBoundaryBegin 4780770 +MultipartBoundaryEnd 4780808 +MimeEntityBegin 4780808 +MimeEntityHeadersEnd 4780901 +MimeContentBegin 4780901 +MimeContentEnd 4908644 +MimeEntityEnd 4908645 +MultipartEndBoundaryBegin 4908645 +MultipartEndBoundaryEnd 4908684 +MultipartEpilogueBegin 4908684 +MultipartEpilogueEnd 4908685 +MimeEntityEnd 4908686 +MimeMessageEnd 4908686 +MboxMarkerBegin 4908686 +MboxMarkerEnd 4908693 +MimeMessageBegin 4908694 +MimeMessageHeadersEnd 4909446 +MimeEntityBegin 4908694 +MimeEntityHeadersEnd 4909446 +MimeContentBegin 4909446 +MultipartPreambleBegin 4909446 +MultipartPreambleEnd 4909785 +MultipartBoundaryBegin 4909785 +MultipartBoundaryEnd 4909843 +MimeEntityBegin 4909843 +MimeEntityHeadersEnd 4909844 +MimeContentBegin 4909844 +MimeContentEnd 4910639 +MimeEntityEnd 4910640 +MultipartBoundaryBegin 4910640 +MultipartBoundaryEnd 4910698 +MimeEntityBegin 4910698 +MimeEntityHeadersEnd 4910801 +MimeContentBegin 4910801 +MultipartPreambleBegin 4910801 +MultipartPreambleEnd 4910801 +MultipartBoundaryBegin 4910801 +MultipartBoundaryEnd 4910861 +MimeEntityBegin 4910861 +MimeEntityHeadersEnd 4910934 +MimeContentBegin 4910934 +MimeContentEnd 4911423 +MimeEntityEnd 4911424 +MultipartBoundaryBegin 4911424 +MultipartBoundaryEnd 4911484 +MimeEntityBegin 4911484 +MimeEntityHeadersEnd 4911580 +MimeContentBegin 4911580 +MimeContentEnd 4924570 +MimeEntityEnd 4924571 +MultipartBoundaryBegin 4924571 +MultipartBoundaryEnd 4924631 +MimeEntityBegin 4924631 +MimeEntityHeadersEnd 4924701 +MimeContentBegin 4924701 +MimeContentEnd 4924721 +MimeEntityEnd 4924722 +MultipartBoundaryBegin 4924722 +MultipartBoundaryEnd 4924782 +MimeEntityBegin 4924782 +MimeEntityHeadersEnd 4924878 +MimeContentBegin 4924878 +MimeContentEnd 4980598 +MimeEntityEnd 4980599 +MultipartBoundaryBegin 4980599 +MultipartBoundaryEnd 4980659 +MimeEntityBegin 4980659 +MimeEntityHeadersEnd 4980729 +MimeContentBegin 4980729 +MimeContentEnd 4980781 +MimeEntityEnd 4980782 +MultipartBoundaryBegin 4980782 +MultipartBoundaryEnd 4980842 +MimeEntityBegin 4980842 +MimeEntityHeadersEnd 4980903 +MimeContentBegin 4980903 +MimeContentEnd 5083055 +MimeEntityEnd 5083056 +MultipartBoundaryBegin 5083056 +MultipartBoundaryEnd 5083116 +MimeEntityBegin 5083116 +MimeEntityHeadersEnd 5083186 +MimeContentBegin 5083186 +MimeContentEnd 5083188 +MimeEntityEnd 5083189 +MultipartEndBoundaryBegin 5083189 +MultipartEndBoundaryEnd 5083250 +MultipartEpilogueBegin 5083250 +MultipartEpilogueEnd 5083251 +MimeEntityEnd 5083252 +MultipartEndBoundaryBegin 5083252 +MultipartEndBoundaryEnd 5083311 +MultipartEpilogueBegin 5083311 +MultipartEpilogueEnd 5083311 +MimeEntityEnd 5083312 +MimeMessageEnd 5083312 +MboxMarkerBegin 5083312 +MboxMarkerEnd 5083319 +MimeMessageBegin 5083320 +MimeMessageHeadersEnd 5084006 +MimeEntityBegin 5083320 +MimeEntityHeadersEnd 5084006 +MimeContentBegin 5084006 +MultipartPreambleBegin 5084006 +MultipartPreambleEnd 5084161 +MultipartBoundaryBegin 5084161 +MultipartBoundaryEnd 5084201 +MimeEntityBegin 5084201 +MimeEntityHeadersEnd 5084245 +MimeContentBegin 5084245 +MimeContentEnd 5085760 +MimeEntityEnd 5085761 +MultipartBoundaryBegin 5085761 +MultipartBoundaryEnd 5085801 +MimeEntityBegin 5085801 +MimeEntityHeadersEnd 5085886 +MimeContentBegin 5085886 +MultipartPreambleBegin 5085886 +MultipartPreambleEnd 5085886 +MultipartBoundaryBegin 5085886 +MultipartBoundaryEnd 5085928 +MimeEntityBegin 5085928 +MimeEntityHeadersEnd 5086019 +MimeContentBegin 5086019 +MimeContentEnd 5086926 +MimeEntityEnd 5086927 +MultipartBoundaryBegin 5086927 +MultipartBoundaryEnd 5086969 +MimeEntityBegin 5086969 +MimeEntityHeadersEnd 5087060 +MimeContentBegin 5087060 +MimeContentEnd 5121918 +MimeEntityEnd 5121919 +MultipartBoundaryBegin 5121919 +MultipartBoundaryEnd 5121961 +MimeEntityBegin 5121961 +MimeEntityHeadersEnd 5122052 +MimeContentBegin 5122052 +MimeContentEnd 5122062 +MimeEntityEnd 5122063 +MultipartBoundaryBegin 5122063 +MultipartBoundaryEnd 5122105 +MimeEntityBegin 5122105 +MimeEntityHeadersEnd 5122196 +MimeContentBegin 5122196 +MimeContentEnd 5143530 +MimeEntityEnd 5143531 +MultipartBoundaryBegin 5143531 +MultipartBoundaryEnd 5143573 +MimeEntityBegin 5143573 +MimeEntityHeadersEnd 5143664 +MimeContentBegin 5143664 +MimeContentEnd 5143674 +MimeEntityEnd 5143675 +MultipartBoundaryBegin 5143675 +MultipartBoundaryEnd 5143717 +MimeEntityBegin 5143717 +MimeEntityHeadersEnd 5143808 +MimeContentBegin 5143808 +MimeContentEnd 5176251 +MimeEntityEnd 5176252 +MultipartBoundaryBegin 5176252 +MultipartBoundaryEnd 5176294 +MimeEntityBegin 5176294 +MimeEntityHeadersEnd 5176385 +MimeContentBegin 5176385 +MimeContentEnd 5176395 +MimeEntityEnd 5176396 +MultipartBoundaryBegin 5176396 +MultipartBoundaryEnd 5176438 +MimeEntityBegin 5176438 +MimeEntityHeadersEnd 5176529 +MimeContentBegin 5176529 +MimeContentEnd 5209970 +MimeEntityEnd 5209971 +MultipartBoundaryBegin 5209971 +MultipartBoundaryEnd 5210013 +MimeEntityBegin 5210013 +MimeEntityHeadersEnd 5210104 +MimeContentBegin 5210104 +MimeContentEnd 5210114 +MimeEntityEnd 5210115 +MultipartBoundaryBegin 5210115 +MultipartBoundaryEnd 5210157 +MimeEntityBegin 5210157 +MimeEntityHeadersEnd 5210248 +MimeContentBegin 5210248 +MimeContentEnd 5238084 +MimeEntityEnd 5238085 +MultipartBoundaryBegin 5238085 +MultipartBoundaryEnd 5238127 +MimeEntityBegin 5238127 +MimeEntityHeadersEnd 5238218 +MimeContentBegin 5238218 +MimeContentEnd 5238228 +MimeEntityEnd 5238229 +MultipartBoundaryBegin 5238229 +MultipartBoundaryEnd 5238271 +MimeEntityBegin 5238271 +MimeEntityHeadersEnd 5238362 +MimeContentBegin 5238362 +MimeContentEnd 5271856 +MimeEntityEnd 5271857 +MultipartBoundaryBegin 5271857 +MultipartBoundaryEnd 5271899 +MimeEntityBegin 5271899 +MimeEntityHeadersEnd 5271990 +MimeContentBegin 5271990 +MimeContentEnd 5272000 +MimeEntityEnd 5272001 +MultipartBoundaryBegin 5272001 +MultipartBoundaryEnd 5272043 +MimeEntityBegin 5272043 +MimeEntityHeadersEnd 5272134 +MimeContentBegin 5272134 +MimeContentEnd 5298793 +MimeEntityEnd 5298794 +MultipartBoundaryBegin 5298794 +MultipartBoundaryEnd 5298836 +MimeEntityBegin 5298836 +MimeEntityHeadersEnd 5298927 +MimeContentBegin 5298927 +MimeContentEnd 5299001 +MimeEntityEnd 5299002 +MultipartEndBoundaryBegin 5299002 +MultipartEndBoundaryEnd 5299045 +MultipartEpilogueBegin 5299045 +MultipartEpilogueEnd 5299046 +MimeEntityEnd 5299047 +MultipartEndBoundaryBegin 5299047 +MultipartEndBoundaryEnd 5299088 +MultipartEpilogueBegin 5299088 +MultipartEpilogueEnd 5299088 +MimeEntityEnd 5299089 +MimeMessageEnd 5299089 +MboxMarkerBegin 5299089 +MboxMarkerEnd 5299096 +MimeMessageBegin 5299097 +MimeMessageHeadersEnd 5299489 +MimeEntityBegin 5299097 +MimeEntityHeadersEnd 5299489 +MimeContentBegin 5299489 +MultipartPreambleBegin 5299489 +MultipartPreambleEnd 5299684 +MultipartBoundaryBegin 5299684 +MultipartBoundaryEnd 5299733 +MimeEntityBegin 5299733 +MimeEntityHeadersEnd 5299828 +MimeContentBegin 5299828 +MimeContentEnd 5300031 +MimeEntityEnd 5300032 +MultipartBoundaryBegin 5300032 +MultipartBoundaryEnd 5300081 +MimeEntityBegin 5300081 +MimeEntityHeadersEnd 5300142 +MimeContentBegin 5300142 +MimeContentEnd 5388740 +MimeEntityEnd 5388741 +MultipartBoundaryBegin 5388741 +MultipartBoundaryEnd 5388790 +MimeEntityBegin 5388790 +MimeEntityHeadersEnd 5388816 +MimeContentBegin 5388816 +MimeContentEnd 5388846 +MimeEntityEnd 5388847 +MultipartEndBoundaryBegin 5388847 +MultipartEndBoundaryEnd 5388897 +MultipartEpilogueBegin 5388897 +MultipartEpilogueEnd 5388898 +MimeEntityEnd 5388899 +MimeMessageEnd 5388899 +MboxMarkerBegin 5388899 +MboxMarkerEnd 5388906 +MimeMessageBegin 5388907 +MimeMessageHeadersEnd 5389843 +MimeEntityBegin 5388907 +MimeEntityHeadersEnd 5389843 +MimeContentBegin 5389843 +MimeContentEnd 5440552 +MimeEntityEnd 5440553 +MimeMessageEnd 5440553 +MboxMarkerBegin 5440553 +MboxMarkerEnd 5440560 +MimeMessageBegin 5440561 +MimeMessageHeadersEnd 5441173 +MimeEntityBegin 5440561 +MimeEntityHeadersEnd 5441173 +MimeContentBegin 5441173 +MultipartPreambleBegin 5441173 +MultipartPreambleEnd 5441173 +MultipartBoundaryBegin 5441173 +MultipartBoundaryEnd 5441191 +MimeEntityBegin 5441191 +MimeEntityHeadersEnd 5441192 +MimeContentBegin 5441192 +MimeContentEnd 5445509 +MimeEntityEnd 5445510 +MultipartBoundaryBegin 5445510 +MultipartBoundaryEnd 5445528 +MimeEntityBegin 5445528 +MimeEntityHeadersEnd 5445669 +MimeContentBegin 5445669 +MultipartPreambleBegin 5445669 +MultipartPreambleEnd 5445669 +MultipartBoundaryBegin 5445669 +MultipartBoundaryEnd 5445700 +MimeEntityBegin 5445700 +MimeEntityHeadersEnd 5445701 +MimeContentBegin 5445701 +MimeMessageBegin 5445701 +MimeMessageHeadersEnd 5445806 +MimeEntityBegin 5445701 +MimeEntityHeadersEnd 5445806 +MimeContentBegin 5445806 +MimeContentEnd 5446427 +MimeEntityEnd 5446428 +MimeMessageEnd 5446428 +MimeContentEnd 5446428 +MimeEntityEnd 5446428 +MultipartBoundaryBegin 5446428 +MultipartBoundaryEnd 5446459 +MimeEntityBegin 5446459 +MimeEntityHeadersEnd 5446460 +MimeContentBegin 5446460 +MimeMessageBegin 5446460 +MimeMessageHeadersEnd 5446581 +MimeEntityBegin 5446460 +MimeEntityHeadersEnd 5446581 +MimeContentBegin 5446581 +MimeContentEnd 5447314 +MimeEntityEnd 5447315 +MimeMessageEnd 5447315 +MimeContentEnd 5447315 +MimeEntityEnd 5447315 +MultipartBoundaryBegin 5447315 +MultipartBoundaryEnd 5447346 +MimeEntityBegin 5447346 +MimeEntityHeadersEnd 5447347 +MimeContentBegin 5447347 +MimeMessageBegin 5447347 +MimeMessageHeadersEnd 5447466 +MimeEntityBegin 5447347 +MimeEntityHeadersEnd 5447466 +MimeContentBegin 5447466 +MimeContentEnd 5448112 +MimeEntityEnd 5448113 +MimeMessageEnd 5448113 +MimeContentEnd 5448113 +MimeEntityEnd 5448113 +MultipartBoundaryBegin 5448113 +MultipartBoundaryEnd 5448144 +MimeEntityBegin 5448144 +MimeEntityHeadersEnd 5448145 +MimeContentBegin 5448145 +MimeMessageBegin 5448145 +MimeMessageHeadersEnd 5448301 +MimeEntityBegin 5448145 +MimeEntityHeadersEnd 5448301 +MimeContentBegin 5448301 +MimeContentEnd 5448784 +MimeEntityEnd 5448785 +MimeMessageEnd 5448785 +MimeContentEnd 5448785 +MimeEntityEnd 5448785 +MultipartBoundaryBegin 5448785 +MultipartBoundaryEnd 5448816 +MimeEntityBegin 5448816 +MimeEntityHeadersEnd 5448817 +MimeContentBegin 5448817 +MimeMessageBegin 5448817 +MimeMessageHeadersEnd 5448971 +MimeEntityBegin 5448817 +MimeEntityHeadersEnd 5448971 +MimeContentBegin 5448971 +MimeContentEnd 5449543 +MimeEntityEnd 5449544 +MimeMessageEnd 5449544 +MimeContentEnd 5449544 +MimeEntityEnd 5449544 +MultipartBoundaryBegin 5449544 +MultipartBoundaryEnd 5449575 +MimeEntityBegin 5449575 +MimeEntityHeadersEnd 5449576 +MimeContentBegin 5449576 +MimeMessageBegin 5449576 +MimeMessageHeadersEnd 5449733 +MimeEntityBegin 5449576 +MimeEntityHeadersEnd 5449733 +MimeContentBegin 5449733 +MimeContentEnd 5451008 +MimeEntityEnd 5451009 +MimeMessageEnd 5451009 +MimeContentEnd 5451009 +MimeEntityEnd 5451009 +MultipartBoundaryBegin 5451009 +MultipartBoundaryEnd 5451040 +MimeEntityBegin 5451040 +MimeEntityHeadersEnd 5451041 +MimeContentBegin 5451041 +MimeMessageBegin 5451041 +MimeMessageHeadersEnd 5451194 +MimeEntityBegin 5451041 +MimeEntityHeadersEnd 5451194 +MimeContentBegin 5451194 +MimeContentEnd 5451595 +MimeEntityEnd 5451596 +MimeMessageEnd 5451596 +MimeContentEnd 5451596 +MimeEntityEnd 5451596 +MultipartBoundaryBegin 5451596 +MultipartBoundaryEnd 5451627 +MimeEntityBegin 5451627 +MimeEntityHeadersEnd 5451628 +MimeContentBegin 5451628 +MimeMessageBegin 5451628 +MimeMessageHeadersEnd 5451775 +MimeEntityBegin 5451628 +MimeEntityHeadersEnd 5451775 +MimeContentBegin 5451775 +MimeContentEnd 5452171 +MimeEntityEnd 5452172 +MimeMessageEnd 5452172 +MimeContentEnd 5452172 +MimeEntityEnd 5452172 +MultipartBoundaryBegin 5452172 +MultipartBoundaryEnd 5452203 +MimeEntityBegin 5452203 +MimeEntityHeadersEnd 5452204 +MimeContentBegin 5452204 +MimeMessageBegin 5452204 +MimeMessageHeadersEnd 5452347 +MimeEntityBegin 5452204 +MimeEntityHeadersEnd 5452347 +MimeContentBegin 5452347 +MimeContentEnd 5452987 +MimeEntityEnd 5452988 +MimeMessageEnd 5452988 +MimeContentEnd 5452988 +MimeEntityEnd 5452988 +MultipartBoundaryBegin 5452988 +MultipartBoundaryEnd 5453019 +MimeEntityBegin 5453019 +MimeEntityHeadersEnd 5453020 +MimeContentBegin 5453020 +MimeMessageBegin 5453020 +MimeMessageHeadersEnd 5453157 +MimeEntityBegin 5453020 +MimeEntityHeadersEnd 5453157 +MimeContentBegin 5453157 +MimeContentEnd 5454134 +MimeEntityEnd 5454135 +MimeMessageEnd 5454135 +MimeContentEnd 5454135 +MimeEntityEnd 5454135 +MultipartBoundaryBegin 5454135 +MultipartBoundaryEnd 5454166 +MimeEntityBegin 5454166 +MimeEntityHeadersEnd 5454167 +MimeContentBegin 5454167 +MimeMessageBegin 5454167 +MimeMessageHeadersEnd 5454314 +MimeEntityBegin 5454167 +MimeEntityHeadersEnd 5454314 +MimeContentBegin 5454314 +MimeContentEnd 5455204 +MimeEntityEnd 5455205 +MimeMessageEnd 5455205 +MimeContentEnd 5455205 +MimeEntityEnd 5455205 +MultipartBoundaryBegin 5455205 +MultipartBoundaryEnd 5455236 +MimeEntityBegin 5455236 +MimeEntityHeadersEnd 5455237 +MimeContentBegin 5455237 +MimeMessageBegin 5455237 +MimeMessageHeadersEnd 5455368 +MimeEntityBegin 5455237 +MimeEntityHeadersEnd 5455368 +MimeContentBegin 5455368 +MimeContentEnd 5455927 +MimeEntityEnd 5455928 +MimeMessageEnd 5455928 +MimeContentEnd 5455928 +MimeEntityEnd 5455928 +MultipartBoundaryBegin 5455928 +MultipartBoundaryEnd 5455959 +MimeEntityBegin 5455959 +MimeEntityHeadersEnd 5455960 +MimeContentBegin 5455960 +MimeMessageBegin 5455960 +MimeMessageHeadersEnd 5456092 +MimeEntityBegin 5455960 +MimeEntityHeadersEnd 5456092 +MimeContentBegin 5456092 +MimeContentEnd 5456529 +MimeEntityEnd 5456530 +MimeMessageEnd 5456530 +MimeContentEnd 5456530 +MimeEntityEnd 5456530 +MultipartBoundaryBegin 5456530 +MultipartBoundaryEnd 5456561 +MimeEntityBegin 5456561 +MimeEntityHeadersEnd 5456562 +MimeContentBegin 5456562 +MimeMessageBegin 5456562 +MimeMessageHeadersEnd 5456679 +MimeEntityBegin 5456562 +MimeEntityHeadersEnd 5456679 +MimeContentBegin 5456679 +MimeContentEnd 5457231 +MimeEntityEnd 5457232 +MimeMessageEnd 5457232 +MimeContentEnd 5457232 +MimeEntityEnd 5457232 +MultipartBoundaryBegin 5457232 +MultipartBoundaryEnd 5457263 +MimeEntityBegin 5457263 +MimeEntityHeadersEnd 5457264 +MimeContentBegin 5457264 +MimeMessageBegin 5457264 +MimeMessageHeadersEnd 5457379 +MimeEntityBegin 5457264 +MimeEntityHeadersEnd 5457379 +MimeContentBegin 5457379 +MimeContentEnd 5457564 +MimeEntityEnd 5457565 +MimeMessageEnd 5457565 +MimeContentEnd 5457565 +MimeEntityEnd 5457565 +MultipartBoundaryBegin 5457565 +MultipartBoundaryEnd 5457596 +MimeEntityBegin 5457596 +MimeEntityHeadersEnd 5457597 +MimeContentBegin 5457597 +MimeMessageBegin 5457597 +MimeMessageHeadersEnd 5457714 +MimeEntityBegin 5457597 +MimeEntityHeadersEnd 5457714 +MimeContentBegin 5457714 +MimeContentEnd 5458042 +MimeEntityEnd 5458043 +MimeMessageEnd 5458043 +MimeContentEnd 5458043 +MimeEntityEnd 5458043 +MultipartBoundaryBegin 5458043 +MultipartBoundaryEnd 5458074 +MimeEntityBegin 5458074 +MimeEntityHeadersEnd 5458075 +MimeContentBegin 5458075 +MimeMessageBegin 5458075 +MimeMessageHeadersEnd 5458198 +MimeEntityBegin 5458075 +MimeEntityHeadersEnd 5458198 +MimeContentBegin 5458198 +MimeContentEnd 5458865 +MimeEntityEnd 5458866 +MimeMessageEnd 5458866 +MimeContentEnd 5458866 +MimeEntityEnd 5458866 +MultipartBoundaryBegin 5458866 +MultipartBoundaryEnd 5458897 +MimeEntityBegin 5458897 +MimeEntityHeadersEnd 5458898 +MimeContentBegin 5458898 +MimeMessageBegin 5458898 +MimeMessageHeadersEnd 5459022 +MimeEntityBegin 5458898 +MimeEntityHeadersEnd 5459022 +MimeContentBegin 5459022 +MimeContentEnd 5459124 +MimeEntityEnd 5459125 +MimeMessageEnd 5459125 +MimeContentEnd 5459125 +MimeEntityEnd 5459125 +MultipartBoundaryBegin 5459125 +MultipartBoundaryEnd 5459156 +MimeEntityBegin 5459156 +MimeEntityHeadersEnd 5459157 +MimeContentBegin 5459157 +MimeMessageBegin 5459157 +MimeMessageHeadersEnd 5459299 +MimeEntityBegin 5459157 +MimeEntityHeadersEnd 5459299 +MimeContentBegin 5459299 +MimeContentEnd 5460135 +MimeEntityEnd 5460136 +MimeMessageEnd 5460136 +MimeContentEnd 5460136 +MimeEntityEnd 5460136 +MultipartBoundaryBegin 5460136 +MultipartBoundaryEnd 5460167 +MimeEntityBegin 5460167 +MimeEntityHeadersEnd 5460168 +MimeContentBegin 5460168 +MimeMessageBegin 5460168 +MimeMessageHeadersEnd 5460278 +MimeEntityBegin 5460168 +MimeEntityHeadersEnd 5460278 +MimeContentBegin 5460278 +MimeContentEnd 5460697 +MimeEntityEnd 5460698 +MimeMessageEnd 5460698 +MimeContentEnd 5460698 +MimeEntityEnd 5460698 +MultipartBoundaryBegin 5460698 +MultipartBoundaryEnd 5460729 +MimeEntityBegin 5460729 +MimeEntityHeadersEnd 5460730 +MimeContentBegin 5460730 +MimeMessageBegin 5460730 +MimeMessageHeadersEnd 5460902 +MimeEntityBegin 5460730 +MimeEntityHeadersEnd 5460902 +MimeContentBegin 5460902 +MimeContentEnd 5461132 +MimeEntityEnd 5461133 +MimeMessageEnd 5461133 +MimeContentEnd 5461133 +MimeEntityEnd 5461133 +MultipartBoundaryBegin 5461133 +MultipartBoundaryEnd 5461164 +MimeEntityBegin 5461164 +MimeEntityHeadersEnd 5461165 +MimeContentBegin 5461165 +MimeMessageBegin 5461165 +MimeMessageHeadersEnd 5461291 +MimeEntityBegin 5461165 +MimeEntityHeadersEnd 5461291 +MimeContentBegin 5461291 +MimeContentEnd 5461690 +MimeEntityEnd 5461691 +MimeMessageEnd 5461691 +MimeContentEnd 5461691 +MimeEntityEnd 5461691 +MultipartBoundaryBegin 5461691 +MultipartBoundaryEnd 5461722 +MimeEntityBegin 5461722 +MimeEntityHeadersEnd 5461723 +MimeContentBegin 5461723 +MimeMessageBegin 5461723 +MimeMessageHeadersEnd 5461840 +MimeEntityBegin 5461723 +MimeEntityHeadersEnd 5461840 +MimeContentBegin 5461840 +MimeContentEnd 5462744 +MimeEntityEnd 5462745 +MimeMessageEnd 5462745 +MimeContentEnd 5462745 +MimeEntityEnd 5462745 +MultipartBoundaryBegin 5462745 +MultipartBoundaryEnd 5462776 +MimeEntityBegin 5462776 +MimeEntityHeadersEnd 5462777 +MimeContentBegin 5462777 +MimeMessageBegin 5462777 +MimeMessageHeadersEnd 5462905 +MimeEntityBegin 5462777 +MimeEntityHeadersEnd 5462905 +MimeContentBegin 5462905 +MimeContentEnd 5463196 +MimeEntityEnd 5463197 +MimeMessageEnd 5463197 +MimeContentEnd 5463197 +MimeEntityEnd 5463197 +MultipartBoundaryBegin 5463197 +MultipartBoundaryEnd 5463228 +MimeEntityBegin 5463228 +MimeEntityHeadersEnd 5463229 +MimeContentBegin 5463229 +MimeMessageBegin 5463229 +MimeMessageHeadersEnd 5463358 +MimeEntityBegin 5463229 +MimeEntityHeadersEnd 5463358 +MimeContentBegin 5463358 +MimeContentEnd 5463768 +MimeEntityEnd 5463769 +MimeMessageEnd 5463769 +MimeContentEnd 5463769 +MimeEntityEnd 5463769 +MultipartBoundaryBegin 5463769 +MultipartBoundaryEnd 5463800 +MimeEntityBegin 5463800 +MimeEntityHeadersEnd 5463801 +MimeContentBegin 5463801 +MimeMessageBegin 5463801 +MimeMessageHeadersEnd 5463916 +MimeEntityBegin 5463801 +MimeEntityHeadersEnd 5463916 +MimeContentBegin 5463916 +MimeContentEnd 5464061 +MimeEntityEnd 5464062 +MimeMessageEnd 5464062 +MimeContentEnd 5464062 +MimeEntityEnd 5464062 +MultipartBoundaryBegin 5464062 +MultipartBoundaryEnd 5464093 +MimeEntityBegin 5464093 +MimeEntityHeadersEnd 5464094 +MimeContentBegin 5464094 +MimeMessageBegin 5464094 +MimeMessageHeadersEnd 5464219 +MimeEntityBegin 5464094 +MimeEntityHeadersEnd 5464219 +MimeContentBegin 5464219 +MimeContentEnd 5464398 +MimeEntityEnd 5464399 +MimeMessageEnd 5464399 +MimeContentEnd 5464399 +MimeEntityEnd 5464399 +MultipartBoundaryBegin 5464399 +MultipartBoundaryEnd 5464430 +MimeEntityBegin 5464430 +MimeEntityHeadersEnd 5464431 +MimeContentBegin 5464431 +MimeMessageBegin 5464431 +MimeMessageHeadersEnd 5464561 +MimeEntityBegin 5464431 +MimeEntityHeadersEnd 5464561 +MimeContentBegin 5464561 +MimeContentEnd 5465277 +MimeEntityEnd 5465278 +MimeMessageEnd 5465278 +MimeContentEnd 5465278 +MimeEntityEnd 5465278 +MultipartBoundaryBegin 5465278 +MultipartBoundaryEnd 5465309 +MimeEntityBegin 5465309 +MimeEntityHeadersEnd 5465310 +MimeContentBegin 5465310 +MimeMessageBegin 5465310 +MimeMessageHeadersEnd 5465456 +MimeEntityBegin 5465310 +MimeEntityHeadersEnd 5465456 +MimeContentBegin 5465456 +MimeContentEnd 5466413 +MimeEntityEnd 5466414 +MimeMessageEnd 5466414 +MimeContentEnd 5466414 +MimeEntityEnd 5466414 +MultipartBoundaryBegin 5466414 +MultipartBoundaryEnd 5466445 +MimeEntityBegin 5466445 +MimeEntityHeadersEnd 5466446 +MimeContentBegin 5466446 +MimeMessageBegin 5466446 +MimeMessageHeadersEnd 5466580 +MimeEntityBegin 5466446 +MimeEntityHeadersEnd 5466580 +MimeContentBegin 5466580 +MimeContentEnd 5466827 +MimeEntityEnd 5466828 +MimeMessageEnd 5466828 +MimeContentEnd 5466828 +MimeEntityEnd 5466828 +MultipartBoundaryBegin 5466828 +MultipartBoundaryEnd 5466859 +MimeEntityBegin 5466859 +MimeEntityHeadersEnd 5466860 +MimeContentBegin 5466860 +MimeMessageBegin 5466860 +MimeMessageHeadersEnd 5466982 +MimeEntityBegin 5466860 +MimeEntityHeadersEnd 5466982 +MimeContentBegin 5466982 +MimeContentEnd 5467109 +MimeEntityEnd 5467110 +MimeMessageEnd 5467110 +MimeContentEnd 5467110 +MimeEntityEnd 5467110 +MultipartBoundaryBegin 5467110 +MultipartBoundaryEnd 5467141 +MimeEntityBegin 5467141 +MimeEntityHeadersEnd 5467142 +MimeContentBegin 5467142 +MimeMessageBegin 5467142 +MimeMessageHeadersEnd 5467317 +MimeEntityBegin 5467142 +MimeEntityHeadersEnd 5467317 +MimeContentBegin 5467317 +MimeContentEnd 5468062 +MimeEntityEnd 5468063 +MimeMessageEnd 5468063 +MimeContentEnd 5468063 +MimeEntityEnd 5468063 +MultipartBoundaryBegin 5468063 +MultipartBoundaryEnd 5468094 +MimeEntityBegin 5468094 +MimeEntityHeadersEnd 5468095 +MimeContentBegin 5468095 +MimeMessageBegin 5468095 +MimeMessageHeadersEnd 5468255 +MimeEntityBegin 5468095 +MimeEntityHeadersEnd 5468255 +MimeContentBegin 5468255 +MimeContentEnd 5468654 +MimeEntityEnd 5468655 +MimeMessageEnd 5468655 +MimeContentEnd 5468655 +MimeEntityEnd 5468655 +MultipartBoundaryBegin 5468655 +MultipartBoundaryEnd 5468686 +MimeEntityBegin 5468686 +MimeEntityHeadersEnd 5468687 +MimeContentBegin 5468687 +MimeMessageBegin 5468687 +MimeMessageHeadersEnd 5468819 +MimeEntityBegin 5468687 +MimeEntityHeadersEnd 5468819 +MimeContentBegin 5468819 +MimeContentEnd 5470106 +MimeEntityEnd 5470107 +MimeMessageEnd 5470107 +MimeContentEnd 5470107 +MimeEntityEnd 5470107 +MultipartBoundaryBegin 5470107 +MultipartBoundaryEnd 5470138 +MimeEntityBegin 5470138 +MimeEntityHeadersEnd 5470139 +MimeContentBegin 5470139 +MimeMessageBegin 5470139 +MimeMessageHeadersEnd 5470245 +MimeEntityBegin 5470139 +MimeEntityHeadersEnd 5470245 +MimeContentBegin 5470245 +MimeContentEnd 5470388 +MimeEntityEnd 5470389 +MimeMessageEnd 5470389 +MimeContentEnd 5470389 +MimeEntityEnd 5470389 +MultipartBoundaryBegin 5470389 +MultipartBoundaryEnd 5470420 +MimeEntityBegin 5470420 +MimeEntityHeadersEnd 5470421 +MimeContentBegin 5470421 +MimeMessageBegin 5470421 +MimeMessageHeadersEnd 5470558 +MimeEntityBegin 5470421 +MimeEntityHeadersEnd 5470558 +MimeContentBegin 5470558 +MimeContentEnd 5470857 +MimeEntityEnd 5470858 +MimeMessageEnd 5470858 +MimeContentEnd 5470858 +MimeEntityEnd 5470858 +MultipartBoundaryBegin 5470858 +MultipartBoundaryEnd 5470889 +MimeEntityBegin 5470889 +MimeEntityHeadersEnd 5470890 +MimeContentBegin 5470890 +MimeMessageBegin 5470890 +MimeMessageHeadersEnd 5471016 +MimeEntityBegin 5470890 +MimeEntityHeadersEnd 5471016 +MimeContentBegin 5471016 +MimeContentEnd 5471203 +MimeEntityEnd 5471204 +MimeMessageEnd 5471204 +MimeContentEnd 5471204 +MimeEntityEnd 5471204 +MultipartBoundaryBegin 5471204 +MultipartBoundaryEnd 5471235 +MimeEntityBegin 5471235 +MimeEntityHeadersEnd 5471236 +MimeContentBegin 5471236 +MimeMessageBegin 5471236 +MimeMessageHeadersEnd 5471341 +MimeEntityBegin 5471236 +MimeEntityHeadersEnd 5471341 +MimeContentBegin 5471341 +MimeContentEnd 5471739 +MimeEntityEnd 5471740 +MimeMessageEnd 5471740 +MimeContentEnd 5471740 +MimeEntityEnd 5471740 +MultipartBoundaryBegin 5471740 +MultipartBoundaryEnd 5471771 +MimeEntityBegin 5471771 +MimeEntityHeadersEnd 5471772 +MimeContentBegin 5471772 +MimeMessageBegin 5471772 +MimeMessageHeadersEnd 5471906 +MimeEntityBegin 5471772 +MimeEntityHeadersEnd 5471906 +MimeContentBegin 5471906 +MimeContentEnd 5472208 +MimeEntityEnd 5472209 +MimeMessageEnd 5472209 +MimeContentEnd 5472209 +MimeEntityEnd 5472209 +MultipartBoundaryBegin 5472209 +MultipartBoundaryEnd 5472240 +MimeEntityBegin 5472240 +MimeEntityHeadersEnd 5472241 +MimeContentBegin 5472241 +MimeMessageBegin 5472241 +MimeMessageHeadersEnd 5472384 +MimeEntityBegin 5472241 +MimeEntityHeadersEnd 5472384 +MimeContentBegin 5472384 +MimeContentEnd 5473002 +MimeEntityEnd 5473003 +MimeMessageEnd 5473003 +MimeContentEnd 5473003 +MimeEntityEnd 5473003 +MultipartBoundaryBegin 5473003 +MultipartBoundaryEnd 5473034 +MimeEntityBegin 5473034 +MimeEntityHeadersEnd 5473035 +MimeContentBegin 5473035 +MimeMessageBegin 5473035 +MimeMessageHeadersEnd 5473188 +MimeEntityBegin 5473035 +MimeEntityHeadersEnd 5473188 +MimeContentBegin 5473188 +MimeContentEnd 5473663 +MimeEntityEnd 5473664 +MimeMessageEnd 5473664 +MimeContentEnd 5473664 +MimeEntityEnd 5473664 +MultipartBoundaryBegin 5473664 +MultipartBoundaryEnd 5473695 +MimeEntityBegin 5473695 +MimeEntityHeadersEnd 5473696 +MimeContentBegin 5473696 +MimeMessageBegin 5473696 +MimeMessageHeadersEnd 5473829 +MimeEntityBegin 5473696 +MimeEntityHeadersEnd 5473829 +MimeContentBegin 5473829 +MimeContentEnd 5475001 +MimeEntityEnd 5475002 +MimeMessageEnd 5475002 +MimeContentEnd 5475002 +MimeEntityEnd 5475002 +MultipartBoundaryBegin 5475002 +MultipartBoundaryEnd 5475033 +MimeEntityBegin 5475033 +MimeEntityHeadersEnd 5475034 +MimeContentBegin 5475034 +MimeMessageBegin 5475034 +MimeMessageHeadersEnd 5475210 +MimeEntityBegin 5475034 +MimeEntityHeadersEnd 5475210 +MimeContentBegin 5475210 +MimeContentEnd 5475469 +MimeEntityEnd 5475470 +MimeMessageEnd 5475470 +MimeContentEnd 5475470 +MimeEntityEnd 5475470 +MultipartBoundaryBegin 5475470 +MultipartBoundaryEnd 5475501 +MimeEntityBegin 5475501 +MimeEntityHeadersEnd 5475502 +MimeContentBegin 5475502 +MimeMessageBegin 5475502 +MimeMessageHeadersEnd 5475617 +MimeEntityBegin 5475502 +MimeEntityHeadersEnd 5475617 +MimeContentBegin 5475617 +MimeContentEnd 5475810 +MimeEntityEnd 5475811 +MimeMessageEnd 5475811 +MimeContentEnd 5475811 +MimeEntityEnd 5475811 +MultipartBoundaryBegin 5475811 +MultipartBoundaryEnd 5475842 +MimeEntityBegin 5475842 +MimeEntityHeadersEnd 5475843 +MimeContentBegin 5475843 +MimeMessageBegin 5475843 +MimeMessageHeadersEnd 5475983 +MimeEntityBegin 5475843 +MimeEntityHeadersEnd 5475983 +MimeContentBegin 5475983 +MimeContentEnd 5476848 +MimeEntityEnd 5476849 +MimeMessageEnd 5476849 +MimeContentEnd 5476849 +MimeEntityEnd 5476849 +MultipartBoundaryBegin 5476849 +MultipartBoundaryEnd 5476880 +MimeEntityBegin 5476880 +MimeEntityHeadersEnd 5476881 +MimeContentBegin 5476881 +MimeMessageBegin 5476881 +MimeMessageHeadersEnd 5477006 +MimeEntityBegin 5476881 +MimeEntityHeadersEnd 5477006 +MimeContentBegin 5477006 +MimeContentEnd 5477720 +MimeEntityEnd 5477721 +MimeMessageEnd 5477721 +MimeContentEnd 5477721 +MimeEntityEnd 5477721 +MultipartBoundaryBegin 5477721 +MultipartBoundaryEnd 5477752 +MimeEntityBegin 5477752 +MimeEntityHeadersEnd 5477753 +MimeContentBegin 5477753 +MimeMessageBegin 5477753 +MimeMessageHeadersEnd 5477865 +MimeEntityBegin 5477753 +MimeEntityHeadersEnd 5477865 +MimeContentBegin 5477865 +MimeContentEnd 5478568 +MimeEntityEnd 5478569 +MimeMessageEnd 5478569 +MimeContentEnd 5478569 +MimeEntityEnd 5478569 +MultipartBoundaryBegin 5478569 +MultipartBoundaryEnd 5478600 +MimeEntityBegin 5478600 +MimeEntityHeadersEnd 5478601 +MimeContentBegin 5478601 +MimeMessageBegin 5478601 +MimeMessageHeadersEnd 5478733 +MimeEntityBegin 5478601 +MimeEntityHeadersEnd 5478733 +MimeContentBegin 5478733 +MimeContentEnd 5479113 +MimeEntityEnd 5479114 +MimeMessageEnd 5479114 +MimeContentEnd 5479114 +MimeEntityEnd 5479114 +MultipartBoundaryBegin 5479114 +MultipartBoundaryEnd 5479145 +MimeEntityBegin 5479145 +MimeEntityHeadersEnd 5479146 +MimeContentBegin 5479146 +MimeMessageBegin 5479146 +MimeMessageHeadersEnd 5479282 +MimeEntityBegin 5479146 +MimeEntityHeadersEnd 5479282 +MimeContentBegin 5479282 +MimeContentEnd 5480259 +MimeEntityEnd 5480260 +MimeMessageEnd 5480260 +MimeContentEnd 5480260 +MimeEntityEnd 5480260 +MultipartBoundaryBegin 5480260 +MultipartBoundaryEnd 5480291 +MimeEntityBegin 5480291 +MimeEntityHeadersEnd 5480292 +MimeContentBegin 5480292 +MimeMessageBegin 5480292 +MimeMessageHeadersEnd 5480437 +MimeEntityBegin 5480292 +MimeEntityHeadersEnd 5480437 +MimeContentBegin 5480437 +MimeContentEnd 5480904 +MimeEntityEnd 5480905 +MimeMessageEnd 5480905 +MimeContentEnd 5480905 +MimeEntityEnd 5480905 +MultipartBoundaryBegin 5480905 +MultipartBoundaryEnd 5480936 +MimeEntityBegin 5480936 +MimeEntityHeadersEnd 5480937 +MimeContentBegin 5480937 +MimeMessageBegin 5480937 +MimeMessageHeadersEnd 5481070 +MimeEntityBegin 5480937 +MimeEntityHeadersEnd 5481070 +MimeContentBegin 5481070 +MimeContentEnd 5481349 +MimeEntityEnd 5481350 +MimeMessageEnd 5481350 +MimeContentEnd 5481350 +MimeEntityEnd 5481350 +MultipartBoundaryBegin 5481350 +MultipartBoundaryEnd 5481381 +MimeEntityBegin 5481381 +MimeEntityHeadersEnd 5481382 +MimeContentBegin 5481382 +MimeMessageBegin 5481382 +MimeMessageHeadersEnd 5481507 +MimeEntityBegin 5481382 +MimeEntityHeadersEnd 5481507 +MimeContentBegin 5481507 +MimeContentEnd 5481789 +MimeEntityEnd 5481790 +MimeMessageEnd 5481790 +MimeContentEnd 5481790 +MimeEntityEnd 5481790 +MultipartBoundaryBegin 5481790 +MultipartBoundaryEnd 5481821 +MimeEntityBegin 5481821 +MimeEntityHeadersEnd 5481822 +MimeContentBegin 5481822 +MimeMessageBegin 5481822 +MimeMessageHeadersEnd 5481943 +MimeEntityBegin 5481822 +MimeEntityHeadersEnd 5481943 +MimeContentBegin 5481943 +MimeContentEnd 5482586 +MimeEntityEnd 5482587 +MimeMessageEnd 5482587 +MimeContentEnd 5482587 +MimeEntityEnd 5482587 +MultipartBoundaryBegin 5482587 +MultipartBoundaryEnd 5482618 +MimeEntityBegin 5482618 +MimeEntityHeadersEnd 5482619 +MimeContentBegin 5482619 +MimeMessageBegin 5482619 +MimeMessageHeadersEnd 5482763 +MimeEntityBegin 5482619 +MimeEntityHeadersEnd 5482763 +MimeContentBegin 5482763 +MimeContentEnd 5485021 +MimeEntityEnd 5485022 +MimeMessageEnd 5485022 +MimeContentEnd 5485022 +MimeEntityEnd 5485022 +MultipartBoundaryBegin 5485022 +MultipartBoundaryEnd 5485053 +MimeEntityBegin 5485053 +MimeEntityHeadersEnd 5485054 +MimeContentBegin 5485054 +MimeMessageBegin 5485054 +MimeMessageHeadersEnd 5485176 +MimeEntityBegin 5485054 +MimeEntityHeadersEnd 5485176 +MimeContentBegin 5485176 +MimeContentEnd 5485968 +MimeEntityEnd 5485969 +MimeMessageEnd 5485969 +MimeContentEnd 5485969 +MimeEntityEnd 5485969 +MultipartBoundaryBegin 5485969 +MultipartBoundaryEnd 5486000 +MimeEntityBegin 5486000 +MimeEntityHeadersEnd 5486001 +MimeContentBegin 5486001 +MimeMessageBegin 5486001 +MimeMessageHeadersEnd 5486095 +MimeEntityBegin 5486001 +MimeEntityHeadersEnd 5486095 +MimeContentBegin 5486095 +MimeContentEnd 5486321 +MimeEntityEnd 5486322 +MimeMessageEnd 5486322 +MimeContentEnd 5486322 +MimeEntityEnd 5486322 +MultipartBoundaryBegin 5486322 +MultipartBoundaryEnd 5486353 +MimeEntityBegin 5486353 +MimeEntityHeadersEnd 5486354 +MimeContentBegin 5486354 +MimeMessageBegin 5486354 +MimeMessageHeadersEnd 5486475 +MimeEntityBegin 5486354 +MimeEntityHeadersEnd 5486475 +MimeContentBegin 5486475 +MimeContentEnd 5487143 +MimeEntityEnd 5487144 +MimeMessageEnd 5487144 +MimeContentEnd 5487144 +MimeEntityEnd 5487144 +MultipartBoundaryBegin 5487144 +MultipartBoundaryEnd 5487175 +MimeEntityBegin 5487175 +MimeEntityHeadersEnd 5487176 +MimeContentBegin 5487176 +MimeMessageBegin 5487176 +MimeMessageHeadersEnd 5487286 +MimeEntityBegin 5487176 +MimeEntityHeadersEnd 5487286 +MimeContentBegin 5487286 +MimeContentEnd 5489833 +MimeEntityEnd 5489834 +MimeMessageEnd 5489834 +MimeContentEnd 5489834 +MimeEntityEnd 5489834 +MultipartBoundaryBegin 5489834 +MultipartBoundaryEnd 5489865 +MimeEntityBegin 5489865 +MimeEntityHeadersEnd 5489866 +MimeContentBegin 5489866 +MimeMessageBegin 5489866 +MimeMessageHeadersEnd 5489972 +MimeEntityBegin 5489866 +MimeEntityHeadersEnd 5489972 +MimeContentBegin 5489972 +MimeContentEnd 5491181 +MimeEntityEnd 5491182 +MimeMessageEnd 5491182 +MimeContentEnd 5491182 +MimeEntityEnd 5491182 +MultipartBoundaryBegin 5491182 +MultipartBoundaryEnd 5491213 +MimeEntityBegin 5491213 +MimeEntityHeadersEnd 5491214 +MimeContentBegin 5491214 +MimeMessageBegin 5491214 +MimeMessageHeadersEnd 5491320 +MimeEntityBegin 5491214 +MimeEntityHeadersEnd 5491320 +MimeContentBegin 5491320 +MimeContentEnd 5493117 +MimeEntityEnd 5493118 +MimeMessageEnd 5493118 +MimeContentEnd 5493118 +MimeEntityEnd 5493118 +MultipartBoundaryBegin 5493118 +MultipartBoundaryEnd 5493149 +MimeEntityBegin 5493149 +MimeEntityHeadersEnd 5493150 +MimeContentBegin 5493150 +MimeMessageBegin 5493150 +MimeMessageHeadersEnd 5493279 +MimeEntityBegin 5493150 +MimeEntityHeadersEnd 5493279 +MimeContentBegin 5493279 +MimeContentEnd 5493849 +MimeEntityEnd 5493850 +MimeMessageEnd 5493850 +MimeContentEnd 5493850 +MimeEntityEnd 5493850 +MultipartBoundaryBegin 5493850 +MultipartBoundaryEnd 5493881 +MimeEntityBegin 5493881 +MimeEntityHeadersEnd 5493882 +MimeContentBegin 5493882 +MimeMessageBegin 5493882 +MimeMessageHeadersEnd 5493970 +MimeEntityBegin 5493882 +MimeEntityHeadersEnd 5493970 +MimeContentBegin 5493970 +MimeContentEnd 5495304 +MimeEntityEnd 5495305 +MimeMessageEnd 5495305 +MimeContentEnd 5495305 +MimeEntityEnd 5495305 +MultipartBoundaryBegin 5495305 +MultipartBoundaryEnd 5495336 +MimeEntityBegin 5495336 +MimeEntityHeadersEnd 5495337 +MimeContentBegin 5495337 +MimeMessageBegin 5495337 +MimeMessageHeadersEnd 5495453 +MimeEntityBegin 5495337 +MimeEntityHeadersEnd 5495453 +MimeContentBegin 5495453 +MimeContentEnd 5497580 +MimeEntityEnd 5497581 +MimeMessageEnd 5497581 +MimeContentEnd 5497581 +MimeEntityEnd 5497581 +MultipartBoundaryBegin 5497581 +MultipartBoundaryEnd 5497612 +MimeEntityBegin 5497612 +MimeEntityHeadersEnd 5497613 +MimeContentBegin 5497613 +MimeMessageBegin 5497613 +MimeMessageHeadersEnd 5497734 +MimeEntityBegin 5497613 +MimeEntityHeadersEnd 5497734 +MimeContentBegin 5497734 +MimeContentEnd 5499755 +MimeEntityEnd 5499756 +MimeMessageEnd 5499756 +MimeContentEnd 5499756 +MimeEntityEnd 5499756 +MultipartBoundaryBegin 5499756 +MultipartBoundaryEnd 5499787 +MimeEntityBegin 5499787 +MimeEntityHeadersEnd 5499788 +MimeContentBegin 5499788 +MimeMessageBegin 5499788 +MimeMessageHeadersEnd 5499909 +MimeEntityBegin 5499788 +MimeEntityHeadersEnd 5499909 +MimeContentBegin 5499909 +MimeContentEnd 5500586 +MimeEntityEnd 5500587 +MimeMessageEnd 5500587 +MimeContentEnd 5500587 +MimeEntityEnd 5500587 +MultipartBoundaryBegin 5500587 +MultipartBoundaryEnd 5500618 +MimeEntityBegin 5500618 +MimeEntityHeadersEnd 5500619 +MimeContentBegin 5500619 +MimeMessageBegin 5500619 +MimeMessageHeadersEnd 5500756 +MimeEntityBegin 5500619 +MimeEntityHeadersEnd 5500756 +MimeContentBegin 5500756 +MimeContentEnd 5501576 +MimeEntityEnd 5501577 +MimeMessageEnd 5501577 +MimeContentEnd 5501577 +MimeEntityEnd 5501577 +MultipartBoundaryBegin 5501577 +MultipartBoundaryEnd 5501608 +MimeEntityBegin 5501608 +MimeEntityHeadersEnd 5501609 +MimeContentBegin 5501609 +MimeMessageBegin 5501609 +MimeMessageHeadersEnd 5501733 +MimeEntityBegin 5501609 +MimeEntityHeadersEnd 5501733 +MimeContentBegin 5501733 +MimeContentEnd 5502457 +MimeEntityEnd 5502458 +MimeMessageEnd 5502458 +MimeContentEnd 5502458 +MimeEntityEnd 5502458 +MultipartBoundaryBegin 5502458 +MultipartBoundaryEnd 5502489 +MimeEntityBegin 5502489 +MimeEntityHeadersEnd 5502490 +MimeContentBegin 5502490 +MimeMessageBegin 5502490 +MimeMessageHeadersEnd 5502592 +MimeEntityBegin 5502490 +MimeEntityHeadersEnd 5502592 +MimeContentBegin 5502592 +MimeContentEnd 5503332 +MimeEntityEnd 5503333 +MimeMessageEnd 5503333 +MimeContentEnd 5503333 +MimeEntityEnd 5503333 +MultipartBoundaryBegin 5503333 +MultipartBoundaryEnd 5503364 +MimeEntityBegin 5503364 +MimeEntityHeadersEnd 5503365 +MimeContentBegin 5503365 +MimeMessageBegin 5503365 +MimeMessageHeadersEnd 5503521 +MimeEntityBegin 5503365 +MimeEntityHeadersEnd 5503521 +MimeContentBegin 5503521 +MimeContentEnd 5503880 +MimeEntityEnd 5503881 +MimeMessageEnd 5503881 +MimeContentEnd 5503881 +MimeEntityEnd 5503881 +MultipartBoundaryBegin 5503881 +MultipartBoundaryEnd 5503912 +MimeEntityBegin 5503912 +MimeEntityHeadersEnd 5503913 +MimeContentBegin 5503913 +MimeMessageBegin 5503913 +MimeMessageHeadersEnd 5504000 +MimeEntityBegin 5503913 +MimeEntityHeadersEnd 5504000 +MimeContentBegin 5504000 +MimeContentEnd 5504635 +MimeEntityEnd 5504636 +MimeMessageEnd 5504636 +MimeContentEnd 5504636 +MimeEntityEnd 5504636 +MultipartBoundaryBegin 5504636 +MultipartBoundaryEnd 5504667 +MimeEntityBegin 5504667 +MimeEntityHeadersEnd 5504668 +MimeContentBegin 5504668 +MimeMessageBegin 5504668 +MimeMessageHeadersEnd 5504817 +MimeEntityBegin 5504668 +MimeEntityHeadersEnd 5504817 +MimeContentBegin 5504817 +MimeContentEnd 5505183 +MimeEntityEnd 5505184 +MimeMessageEnd 5505184 +MimeContentEnd 5505184 +MimeEntityEnd 5505184 +MultipartBoundaryBegin 5505184 +MultipartBoundaryEnd 5505215 +MimeEntityBegin 5505215 +MimeEntityHeadersEnd 5505216 +MimeContentBegin 5505216 +MimeMessageBegin 5505216 +MimeMessageHeadersEnd 5505317 +MimeEntityBegin 5505216 +MimeEntityHeadersEnd 5505317 +MimeContentBegin 5505317 +MimeContentEnd 5505605 +MimeEntityEnd 5505606 +MimeMessageEnd 5505606 +MimeContentEnd 5505606 +MimeEntityEnd 5505606 +MultipartBoundaryBegin 5505606 +MultipartBoundaryEnd 5505637 +MimeEntityBegin 5505637 +MimeEntityHeadersEnd 5505638 +MimeContentBegin 5505638 +MimeMessageBegin 5505638 +MimeMessageHeadersEnd 5505766 +MimeEntityBegin 5505638 +MimeEntityHeadersEnd 5505766 +MimeContentBegin 5505766 +MimeContentEnd 5506245 +MimeEntityEnd 5506246 +MimeMessageEnd 5506246 +MimeContentEnd 5506246 +MimeEntityEnd 5506246 +MultipartBoundaryBegin 5506246 +MultipartBoundaryEnd 5506277 +MimeEntityBegin 5506277 +MimeEntityHeadersEnd 5506278 +MimeContentBegin 5506278 +MimeMessageBegin 5506278 +MimeMessageHeadersEnd 5506375 +MimeEntityBegin 5506278 +MimeEntityHeadersEnd 5506375 +MimeContentBegin 5506375 +MimeContentEnd 5506755 +MimeEntityEnd 5506756 +MimeMessageEnd 5506756 +MimeContentEnd 5506756 +MimeEntityEnd 5506756 +MultipartBoundaryBegin 5506756 +MultipartBoundaryEnd 5506787 +MimeEntityBegin 5506787 +MimeEntityHeadersEnd 5506788 +MimeContentBegin 5506788 +MimeMessageBegin 5506788 +MimeMessageHeadersEnd 5506903 +MimeEntityBegin 5506788 +MimeEntityHeadersEnd 5506903 +MimeContentBegin 5506903 +MimeContentEnd 5508222 +MimeEntityEnd 5508223 +MimeMessageEnd 5508223 +MimeContentEnd 5508223 +MimeEntityEnd 5508223 +MultipartBoundaryBegin 5508223 +MultipartBoundaryEnd 5508254 +MimeEntityBegin 5508254 +MimeEntityHeadersEnd 5508255 +MimeContentBegin 5508255 +MimeMessageBegin 5508255 +MimeMessageHeadersEnd 5508355 +MimeEntityBegin 5508255 +MimeEntityHeadersEnd 5508355 +MimeContentBegin 5508355 +MimeContentEnd 5508650 +MimeEntityEnd 5508651 +MimeMessageEnd 5508651 +MimeContentEnd 5508651 +MimeEntityEnd 5508651 +MultipartBoundaryBegin 5508651 +MultipartBoundaryEnd 5508682 +MimeEntityBegin 5508682 +MimeEntityHeadersEnd 5508683 +MimeContentBegin 5508683 +MimeMessageBegin 5508683 +MimeMessageHeadersEnd 5508826 +MimeEntityBegin 5508683 +MimeEntityHeadersEnd 5508826 +MimeContentBegin 5508826 +MimeContentEnd 5509845 +MimeEntityEnd 5509846 +MimeMessageEnd 5509846 +MimeContentEnd 5509846 +MimeEntityEnd 5509846 +MultipartEndBoundaryBegin 5509846 +MultipartEndBoundaryEnd 5509878 +MultipartEpilogueBegin 5509878 +MultipartEpilogueEnd 5509879 +MimeEntityEnd 5509880 +MultipartEndBoundaryBegin 5509880 +MultipartEndBoundaryEnd 5509899 +MultipartEpilogueBegin 5509899 +MultipartEpilogueEnd 5509954 +MimeEntityEnd 5509955 +MimeMessageEnd 5509955 +MboxMarkerBegin 5509955 +MboxMarkerEnd 5509962 +MimeMessageBegin 5509963 +MimeMessageHeadersEnd 5510771 +MimeEntityBegin 5509963 +MimeEntityHeadersEnd 5510771 +MimeContentBegin 5510771 +MimeContentEnd 5512642 +MimeEntityEnd 5512643 +MimeMessageEnd 5512643 +MboxMarkerBegin 5512643 +MboxMarkerEnd 5512650 +MimeMessageBegin 5512651 +MimeMessageHeadersEnd 5513378 +MimeEntityBegin 5512651 +MimeEntityHeadersEnd 5513378 +MimeContentBegin 5513378 +MultipartPreambleBegin 5513378 +MultipartPreambleEnd 5513378 +MultipartBoundaryBegin 5513378 +MultipartBoundaryEnd 5513405 +MimeEntityBegin 5513405 +MimeEntityHeadersEnd 5513406 +MimeContentBegin 5513406 +MimeContentEnd 5513518 +MimeEntityEnd 5513519 +MultipartBoundaryBegin 5513519 +MultipartBoundaryEnd 5513546 +MimeEntityBegin 5513546 +MimeEntityHeadersEnd 5513635 +MimeContentBegin 5513635 +MimeContentEnd 5644327 +MimeEntityEnd 5644328 +MultipartBoundaryBegin 5644328 +MultipartBoundaryEnd 5644355 +MimeEntityBegin 5644355 +MimeEntityHeadersEnd 5644356 +MimeContentBegin 5644356 +MimeContentEnd 5644411 +MimeEntityEnd 5644412 +MultipartBoundaryBegin 5644412 +MultipartBoundaryEnd 5644439 +MimeEntityBegin 5644439 +MimeEntityHeadersEnd 5644584 +MimeContentBegin 5644584 +MimeContentEnd 5659481 +MimeEntityEnd 5659482 +MultipartBoundaryBegin 5659482 +MultipartBoundaryEnd 5659509 +MimeEntityBegin 5659509 +MimeEntityHeadersEnd 5659510 +MimeContentBegin 5659510 +MimeContentEnd 5659600 +MimeEntityEnd 5659601 +MultipartBoundaryBegin 5659601 +MultipartBoundaryEnd 5659628 +MimeEntityBegin 5659628 +MimeEntityHeadersEnd 5659773 +MimeContentBegin 5659773 +MimeContentEnd 5667874 +MimeEntityEnd 5667875 +MultipartBoundaryBegin 5667875 +MultipartBoundaryEnd 5667902 +MimeEntityBegin 5667902 +MimeEntityHeadersEnd 5667903 +MimeContentBegin 5667903 +MimeContentEnd 5667977 +MimeEntityEnd 5667978 +MultipartEndBoundaryBegin 5667978 +MultipartEndBoundaryEnd 5668006 +MultipartEpilogueBegin 5668006 +MultipartEpilogueEnd 5668007 +MimeEntityEnd 5668008 +MimeMessageEnd 5668008 +MboxMarkerBegin 5668008 +MboxMarkerEnd 5668015 +MimeMessageBegin 5668016 +MimeMessageHeadersEnd 5668539 +MimeEntityBegin 5668016 +MimeEntityHeadersEnd 5668539 +MimeContentBegin 5668539 +MimeContentEnd 5669107 +MimeEntityEnd 5669108 +MimeMessageEnd 5669108 +MboxMarkerBegin 5669108 +MboxMarkerEnd 5669115 +MimeMessageBegin 5669116 +MimeMessageHeadersEnd 5670302 +MimeEntityBegin 5669116 +MimeEntityHeadersEnd 5670302 +MimeContentBegin 5670302 +MultipartPreambleBegin 5670302 +MultipartPreambleEnd 5670457 +MultipartBoundaryBegin 5670457 +MultipartBoundaryEnd 5670497 +MimeEntityBegin 5670497 +MimeEntityHeadersEnd 5670541 +MimeContentBegin 5670541 +MimeContentEnd 5671271 +MimeEntityEnd 5671272 +MultipartBoundaryBegin 5671272 +MultipartBoundaryEnd 5671312 +MimeEntityBegin 5671312 +MimeEntityHeadersEnd 5671397 +MimeContentBegin 5671397 +MultipartPreambleBegin 5671397 +MultipartPreambleEnd 5671397 +MultipartBoundaryBegin 5671397 +MultipartBoundaryEnd 5671439 +MimeEntityBegin 5671439 +MimeEntityHeadersEnd 5671530 +MimeContentBegin 5671530 +MimeContentEnd 5672332 +MimeEntityEnd 5672333 +MultipartBoundaryBegin 5672333 +MultipartBoundaryEnd 5672375 +MimeEntityBegin 5672375 +MimeEntityHeadersEnd 5672468 +MimeContentBegin 5672468 +MimeContentEnd 5730339 +MimeEntityEnd 5730340 +MultipartBoundaryBegin 5730340 +MultipartBoundaryEnd 5730382 +MimeEntityBegin 5730382 +MimeEntityHeadersEnd 5730473 +MimeContentBegin 5730473 +MimeContentEnd 5730478 +MimeEntityEnd 5730479 +MultipartEndBoundaryBegin 5730479 +MultipartEndBoundaryEnd 5730522 +MultipartEpilogueBegin 5730522 +MultipartEpilogueEnd 5730523 +MimeEntityEnd 5730524 +MultipartEndBoundaryBegin 5730524 +MultipartEndBoundaryEnd 5730565 +MultipartEpilogueBegin 5730565 +MultipartEpilogueEnd 5730566 +MimeEntityEnd 5730567 +MimeMessageEnd 5730567 +MboxMarkerBegin 5730567 +MboxMarkerEnd 5730574 +MimeMessageBegin 5730575 +MimeMessageHeadersEnd 5731315 +MimeEntityBegin 5730575 +MimeEntityHeadersEnd 5731315 +MimeContentBegin 5731315 +MultipartPreambleBegin 5731315 +MultipartPreambleEnd 5731316 +MultipartBoundaryBegin 5731316 +MultipartBoundaryEnd 5731365 +MimeEntityBegin 5731365 +MimeEntityHeadersEnd 5731455 +MimeContentBegin 5731455 +MimeContentEnd 5731629 +MimeEntityEnd 5731630 +MultipartBoundaryBegin 5731630 +MultipartBoundaryEnd 5731679 +MimeEntityBegin 5731679 +MimeEntityHeadersEnd 5731738 +MimeContentBegin 5731738 +MimeContentEnd 5786986 +MimeEntityEnd 5786987 +MultipartEndBoundaryBegin 5786987 +MultipartEndBoundaryEnd 5787037 +MultipartEpilogueBegin 5787037 +MultipartEpilogueEnd 5787038 +MimeEntityEnd 5787039 +MimeMessageEnd 5787039 +MboxMarkerBegin 5787039 +MboxMarkerEnd 5787070 +MimeMessageBegin 5787071 +MimeMessageHeadersEnd 5788538 +MimeEntityBegin 5787071 +MimeEntityHeadersEnd 5788538 +MimeContentBegin 5788538 +MimeContentEnd 5789878 +MimeEntityEnd 5789879 +MimeMessageEnd 5789879 +MboxMarkerBegin 5789879 +MboxMarkerEnd 5789886 +MimeMessageBegin 5789887 +MimeMessageHeadersEnd 5790681 +MimeEntityBegin 5789887 +MimeEntityHeadersEnd 5790681 +MimeContentBegin 5790681 +MultipartPreambleBegin 5790681 +MultipartPreambleEnd 5790727 +MultipartBoundaryBegin 5790727 +MultipartBoundaryEnd 5790752 +MimeEntityBegin 5790752 +MimeEntityHeadersEnd 5790828 +MimeContentBegin 5790828 +MimeContentEnd 5791198 +MimeEntityEnd 5791199 +MultipartBoundaryBegin 5791199 +MultipartBoundaryEnd 5791224 +MimeEntityBegin 5791224 +MimeEntityHeadersEnd 5791314 +MimeContentBegin 5791314 +MimeMessageBegin 5791314 +MimeMessageHeadersEnd 5792382 +MimeEntityBegin 5791314 +MimeEntityHeadersEnd 5792382 +MimeContentBegin 5792382 +MimeContentEnd 5816777 +MimeEntityEnd 5816778 +MimeMessageEnd 5816778 +MimeContentEnd 5816778 +MimeEntityEnd 5816778 +MultipartEndBoundaryBegin 5816778 +MultipartEndBoundaryEnd 5816804 +MultipartEpilogueBegin 5816804 +MultipartEpilogueEnd 5816805 +MimeEntityEnd 5816806 +MimeMessageEnd 5816806 +MboxMarkerBegin 5816806 +MboxMarkerEnd 5816813 +MimeMessageBegin 5816814 +MimeMessageHeadersEnd 5817482 +MimeEntityBegin 5816814 +MimeEntityHeadersEnd 5817482 +MimeContentBegin 5817482 +MultipartPreambleBegin 5817482 +MultipartPreambleEnd 5817528 +MultipartBoundaryBegin 5817528 +MultipartBoundaryEnd 5817576 +MimeEntityBegin 5817576 +MimeEntityHeadersEnd 5817654 +MimeContentBegin 5817654 +MimeContentEnd 5817688 +MimeEntityEnd 5817689 +MultipartBoundaryBegin 5817689 +MultipartBoundaryEnd 5817737 +MimeEntityBegin 5817737 +MimeEntityHeadersEnd 5817796 +MimeContentBegin 5817796 +MimeContentEnd 5839947 +MimeEntityEnd 5839948 +MultipartEndBoundaryBegin 5839948 +MultipartEndBoundaryEnd 5839997 +MultipartEpilogueBegin 5839997 +MultipartEpilogueEnd 5839997 +MimeEntityEnd 5839998 +MimeMessageEnd 5839998 +MboxMarkerBegin 5839998 +MboxMarkerEnd 5840029 +MimeMessageBegin 5840030 +MimeMessageHeadersEnd 5840554 +MimeEntityBegin 5840030 +MimeEntityHeadersEnd 5840554 +MimeContentBegin 5840554 +MultipartPreambleBegin 5840554 +MultipartPreambleEnd 5840554 +MultipartBoundaryBegin 5840554 +MultipartBoundaryEnd 5840562 +MimeEntityBegin 5840562 +MimeEntityHeadersEnd 5840606 +MimeContentBegin 5840606 +MimeContentEnd 5841778 +MimeEntityEnd 5841779 +MultipartBoundaryBegin 5841779 +MultipartBoundaryEnd 5841787 +MimeEntityBegin 5841787 +MimeEntityHeadersEnd 5841913 +MimeContentBegin 5841913 +MimeContentEnd 5842059 +MimeEntityEnd 5842060 +MultipartBoundaryBegin 5842060 +MultipartBoundaryEnd 5842068 +MimeEntityBegin 5842068 +MimeEntityHeadersEnd 5842184 +MimeContentBegin 5842184 +MimeContentEnd 5842378 +MimeEntityEnd 5842379 +MultipartEndBoundaryBegin 5842379 +MultipartEndBoundaryEnd 5842388 +MultipartEpilogueBegin 5842388 +MultipartEpilogueEnd 5842388 +MimeEntityEnd 5842389 +MimeMessageEnd 5842389 +MboxMarkerBegin 5842389 +MboxMarkerEnd 5842396 +MimeMessageBegin 5842397 +MimeMessageHeadersEnd 5843191 +MimeEntityBegin 5842397 +MimeEntityHeadersEnd 5843191 +MimeContentBegin 5843191 +MimeContentEnd 6099969 +MimeEntityEnd 6099970 +MimeMessageEnd 6099970 +MboxMarkerBegin 6099970 +MboxMarkerEnd 6099977 +MimeMessageBegin 6099978 +MimeMessageHeadersEnd 6100830 +MimeEntityBegin 6099978 +MimeEntityHeadersEnd 6100830 +MimeContentBegin 6100830 +MultipartPreambleBegin 6100830 +MultipartPreambleEnd 6100831 +MultipartBoundaryBegin 6100831 +MultipartBoundaryEnd 6100845 +MimeEntityBegin 6100845 +MimeEntityHeadersEnd 6100922 +MimeContentBegin 6100922 +MimeContentEnd 6101112 +MimeEntityEnd 6101113 +MultipartBoundaryBegin 6101113 +MultipartBoundaryEnd 6101127 +MimeEntityBegin 6101127 +MimeEntityHeadersEnd 6101231 +MimeContentBegin 6101231 +MimeContentEnd 6199478 +MimeEntityEnd 6199479 +MultipartEndBoundaryBegin 6199479 +MultipartEndBoundaryEnd 6199494 +MultipartEpilogueBegin 6199494 +MultipartEpilogueEnd 6199495 +MimeEntityEnd 6199496 +MimeMessageEnd 6199496 +MboxMarkerBegin 6199496 +MboxMarkerEnd 6199503 +MimeMessageBegin 6199504 +MimeMessageHeadersEnd 6200381 +MimeEntityBegin 6199504 +MimeEntityHeadersEnd 6200381 +MimeContentBegin 6200381 +MultipartPreambleBegin 6200381 +MultipartPreambleEnd 6200381 +MultipartBoundaryBegin 6200381 +MultipartBoundaryEnd 6200390 +MimeEntityBegin 6200390 +MimeEntityHeadersEnd 6200436 +MimeContentBegin 6200436 +MimeContentEnd 6201379 +MimeEntityEnd 6201380 +MultipartBoundaryBegin 6201380 +MultipartBoundaryEnd 6201389 +MimeEntityBegin 6201389 +MimeEntityHeadersEnd 6201452 +MimeContentBegin 6201452 +MultipartPreambleBegin 6201452 +MultipartPreambleEnd 6201453 +MultipartBoundaryBegin 6201453 +MultipartBoundaryEnd 6201475 +MimeEntityBegin 6201475 +MimeEntityHeadersEnd 6201836 +MimeContentBegin 6201836 +MultipartPreambleBegin 6201836 +MultipartPreambleEnd 6201836 +MultipartBoundaryBegin 6201836 +MultipartBoundaryEnd 6201858 +MimeEntityBegin 6201858 +MimeEntityHeadersEnd 6201960 +MimeContentBegin 6201960 +MultipartPreambleBegin 6201960 +MultipartPreambleEnd 6201960 +MultipartBoundaryBegin 6201960 +MultipartBoundaryEnd 6201982 +MimeEntityBegin 6201982 +MimeEntityHeadersEnd 6202105 +MimeContentBegin 6202105 +MimeContentEnd 6202471 +MimeEntityEnd 6202472 +MultipartBoundaryBegin 6202472 +MultipartBoundaryEnd 6202494 +MimeEntityBegin 6202494 +MimeEntityHeadersEnd 6202616 +MimeContentBegin 6202616 +MimeContentEnd 6203008 +MimeEntityEnd 6203009 +MultipartBoundaryBegin 6203009 +MultipartBoundaryEnd 6203031 +MimeEntityBegin 6203031 +MimeEntityHeadersEnd 6203156 +MimeContentBegin 6203156 +MimeContentEnd 6203864 +MimeEntityEnd 6203865 +MultipartEndBoundaryBegin 6203865 +MultipartEndBoundaryEnd 6203888 +MultipartEpilogueBegin 6203888 +MultipartEpilogueEnd 6203889 +MimeEntityEnd 6203890 +MultipartBoundaryBegin 6203890 +MultipartBoundaryEnd 6203912 +MimeEntityBegin 6203912 +MimeEntityHeadersEnd 6204011 +MimeContentBegin 6204011 +MultipartPreambleBegin 6204011 +MultipartPreambleEnd 6204011 +MultipartBoundaryBegin 6204011 +MultipartBoundaryEnd 6204033 +MimeEntityBegin 6204033 +MimeEntityHeadersEnd 6204165 +MimeContentBegin 6204165 +MimeContentEnd 6220580 +MimeEntityEnd 6220581 +MultipartBoundaryBegin 6220581 +MultipartBoundaryEnd 6220603 +MimeEntityBegin 6220603 +MimeEntityHeadersEnd 6220734 +MimeContentBegin 6220734 +MimeContentEnd 6234988 +MimeEntityEnd 6234989 +MultipartBoundaryBegin 6234989 +MultipartBoundaryEnd 6235011 +MimeEntityBegin 6235011 +MimeEntityHeadersEnd 6235112 +MimeContentBegin 6235112 +MultipartPreambleBegin 6235112 +MultipartPreambleEnd 6235112 +MultipartBoundaryBegin 6235112 +MultipartBoundaryEnd 6235134 +MimeEntityBegin 6235134 +MimeEntityHeadersEnd 6235276 +MimeContentBegin 6235276 +MimeContentEnd 6241428 +MimeEntityEnd 6241429 +MultipartBoundaryBegin 6241429 +MultipartBoundaryEnd 6241451 +MimeEntityBegin 6241451 +MimeEntityHeadersEnd 6241578 +MimeContentBegin 6241578 +MimeContentEnd 6246833 +MimeEntityEnd 6246834 +MultipartBoundaryBegin 6246834 +MultipartBoundaryEnd 6246856 +MimeEntityBegin 6246856 +MimeEntityHeadersEnd 6246993 +MimeContentBegin 6246993 +MimeContentEnd 6254291 +MimeEntityEnd 6254292 +MultipartBoundaryBegin 6254292 +MultipartBoundaryEnd 6254314 +MimeEntityBegin 6254314 +MimeEntityHeadersEnd 6254438 +MimeContentBegin 6254438 +MimeContentEnd 6260914 +MimeEntityEnd 6260915 +MultipartBoundaryBegin 6260915 +MultipartBoundaryEnd 6260937 +MimeEntityBegin 6260937 +MimeEntityHeadersEnd 6261074 +MimeContentBegin 6261074 +MimeContentEnd 6278242 +MimeEntityEnd 6278243 +MultipartEndBoundaryBegin 6278243 +MultipartEndBoundaryEnd 6278266 +MultipartEpilogueBegin 6278266 +MultipartEpilogueEnd 6278267 +MimeEntityEnd 6278268 +MultipartBoundaryBegin 6278268 +MultipartBoundaryEnd 6278290 +MimeEntityBegin 6278290 +MimeEntityHeadersEnd 6278385 +MimeContentBegin 6278385 +MultipartPreambleBegin 6278385 +MultipartPreambleEnd 6278385 +MultipartBoundaryBegin 6278385 +MultipartBoundaryEnd 6278407 +MimeEntityBegin 6278407 +MimeEntityHeadersEnd 6278541 +MimeContentBegin 6278541 +MimeContentEnd 6279036 +MimeEntityEnd 6279037 +MultipartEndBoundaryBegin 6279037 +MultipartEndBoundaryEnd 6279060 +MultipartEpilogueBegin 6279060 +MultipartEpilogueEnd 6279061 +MimeEntityEnd 6279062 +MultipartEndBoundaryBegin 6279062 +MultipartEndBoundaryEnd 6279085 +MultipartEpilogueBegin 6279085 +MultipartEpilogueEnd 6279086 +MimeEntityEnd 6279087 +MultipartBoundaryBegin 6279087 +MultipartBoundaryEnd 6279109 +MimeEntityBegin 6279109 +MimeEntityHeadersEnd 6279220 +MimeContentBegin 6279220 +MultipartPreambleBegin 6279220 +MultipartPreambleEnd 6279220 +MultipartBoundaryBegin 6279220 +MultipartBoundaryEnd 6279242 +MimeEntityBegin 6279242 +MimeEntityHeadersEnd 6279380 +MimeContentBegin 6279380 +MimeContentEnd 6280529 +MimeEntityEnd 6280530 +MultipartBoundaryBegin 6280530 +MultipartBoundaryEnd 6280552 +MimeEntityBegin 6280552 +MimeEntityHeadersEnd 6280678 +MimeContentBegin 6280678 +MimeContentEnd 6281898 +MimeEntityEnd 6281899 +MultipartBoundaryBegin 6281899 +MultipartBoundaryEnd 6281921 +MimeEntityBegin 6281921 +MimeEntityHeadersEnd 6282061 +MimeContentBegin 6282061 +MimeContentEnd 6282738 +MimeEntityEnd 6282739 +MultipartEndBoundaryBegin 6282739 +MultipartEndBoundaryEnd 6282762 +MultipartEpilogueBegin 6282762 +MultipartEpilogueEnd 6282763 +MimeEntityEnd 6282764 +MultipartEndBoundaryBegin 6282764 +MultipartEndBoundaryEnd 6282787 +MultipartEpilogueBegin 6282787 +MultipartEpilogueEnd 6282788 +MimeEntityEnd 6282789 +MultipartEndBoundaryBegin 6282789 +MultipartEndBoundaryEnd 6282812 +MultipartEpilogueBegin 6282812 +MultipartEpilogueEnd 6282813 +MimeEntityEnd 6282814 +MultipartEndBoundaryBegin 6282814 +MultipartEndBoundaryEnd 6282824 +MultipartEpilogueBegin 6282824 +MultipartEpilogueEnd 6282825 +MimeEntityEnd 6282826 +MimeMessageEnd 6282826 +MboxMarkerBegin 6282826 +MboxMarkerEnd 6282833 +MimeMessageBegin 6282834 +MimeMessageHeadersEnd 6283636 +MimeEntityBegin 6282834 +MimeEntityHeadersEnd 6283636 +MimeContentBegin 6283636 +MimeContentEnd 6292835 +MimeEntityEnd 6292836 +MimeMessageEnd 6292836 +MboxMarkerBegin 6292836 +MboxMarkerEnd 6292843 +MimeMessageBegin 6292844 +MimeMessageHeadersEnd 6293572 +MimeEntityBegin 6292844 +MimeEntityHeadersEnd 6293572 +MimeContentBegin 6293572 +MultipartPreambleBegin 6293572 +MultipartPreambleEnd 6293727 +MultipartBoundaryBegin 6293727 +MultipartBoundaryEnd 6293767 +MimeEntityBegin 6293767 +MimeEntityHeadersEnd 6293811 +MimeContentBegin 6293811 +MimeContentEnd 6294567 +MimeEntityEnd 6294568 +MultipartBoundaryBegin 6294568 +MultipartBoundaryEnd 6294608 +MimeEntityBegin 6294608 +MimeEntityHeadersEnd 6294693 +MimeContentBegin 6294693 +MultipartPreambleBegin 6294693 +MultipartPreambleEnd 6294693 +MultipartBoundaryBegin 6294693 +MultipartBoundaryEnd 6294735 +MimeEntityBegin 6294735 +MimeEntityHeadersEnd 6294826 +MimeContentBegin 6294826 +MimeContentEnd 6295153 +MimeEntityEnd 6295154 +MultipartBoundaryBegin 6295154 +MultipartBoundaryEnd 6295196 +MimeEntityBegin 6295196 +MimeEntityHeadersEnd 6295290 +MimeContentBegin 6295290 +MimeContentEnd 6317314 +MimeEntityEnd 6317315 +MultipartBoundaryBegin 6317315 +MultipartBoundaryEnd 6317357 +MimeEntityBegin 6317357 +MimeEntityHeadersEnd 6317448 +MimeContentBegin 6317448 +MimeContentEnd 6317614 +MimeEntityEnd 6317615 +MultipartBoundaryBegin 6317615 +MultipartBoundaryEnd 6317657 +MimeEntityBegin 6317657 +MimeEntityHeadersEnd 6317754 +MimeContentBegin 6317754 +MimeContentEnd 6364967 +MimeEntityEnd 6364968 +MultipartBoundaryBegin 6364968 +MultipartBoundaryEnd 6365010 +MimeEntityBegin 6365010 +MimeEntityHeadersEnd 6365101 +MimeContentBegin 6365101 +MimeContentEnd 6365171 +MimeEntityEnd 6365172 +MultipartBoundaryBegin 6365172 +MultipartBoundaryEnd 6365214 +MimeEntityBegin 6365214 +MimeEntityHeadersEnd 6365304 +MimeContentBegin 6365304 +MimeContentEnd 6385522 +MimeEntityEnd 6385523 +MultipartBoundaryBegin 6385523 +MultipartBoundaryEnd 6385565 +MimeEntityBegin 6385565 +MimeEntityHeadersEnd 6385656 +MimeContentBegin 6385656 +MimeContentEnd 6385760 +MimeEntityEnd 6385761 +MultipartEndBoundaryBegin 6385761 +MultipartEndBoundaryEnd 6385804 +MultipartEpilogueBegin 6385804 +MultipartEpilogueEnd 6385805 +MimeEntityEnd 6385806 +MultipartEndBoundaryBegin 6385806 +MultipartEndBoundaryEnd 6385847 +MultipartEpilogueBegin 6385847 +MultipartEpilogueEnd 6385847 +MimeEntityEnd 6385848 +MimeMessageEnd 6385848 +MboxMarkerBegin 6385848 +MboxMarkerEnd 6385855 +MimeMessageBegin 6385856 +MimeMessageHeadersEnd 6386610 +MimeEntityBegin 6385856 +MimeEntityHeadersEnd 6386610 +MimeContentBegin 6386610 +MultipartPreambleBegin 6386610 +MultipartPreambleEnd 6386805 +MultipartBoundaryBegin 6386805 +MultipartBoundaryEnd 6386850 +MimeEntityBegin 6386850 +MimeEntityHeadersEnd 6386923 +MimeContentBegin 6386923 +MimeContentEnd 6387343 +MimeEntityEnd 6387344 +MultipartBoundaryBegin 6387344 +MultipartBoundaryEnd 6387389 +MimeEntityBegin 6387389 +MimeEntityHeadersEnd 6387450 +MimeContentBegin 6387450 +MimeContentEnd 6421014 +MimeEntityEnd 6421015 +MultipartBoundaryBegin 6421015 +MultipartBoundaryEnd 6421060 +MimeEntityBegin 6421060 +MimeEntityHeadersEnd 6421133 +MimeContentBegin 6421133 +MimeContentEnd 6421227 +MimeEntityEnd 6421228 +MultipartEndBoundaryBegin 6421228 +MultipartEndBoundaryEnd 6421274 +MultipartEpilogueBegin 6421274 +MultipartEpilogueEnd 6421275 +MimeEntityEnd 6421276 +MimeMessageEnd 6421276 +MboxMarkerBegin 6421276 +MboxMarkerEnd 6421317 +MimeMessageBegin 6421318 +MimeMessageHeadersEnd 6421466 +MimeEntityBegin 6421318 +MimeEntityHeadersEnd 6421466 +MimeContentBegin 6421466 +MimeContentEnd 6464495 +MimeEntityEnd 6464496 +MimeMessageEnd 6464496 +MboxMarkerBegin 6464496 +MboxMarkerEnd 6464527 +MimeMessageBegin 6464528 +MimeMessageHeadersEnd 6465111 +MimeEntityBegin 6464528 +MimeEntityHeadersEnd 6465111 +MimeContentBegin 6465111 +MultipartPreambleBegin 6465111 +MultipartPreambleEnd 6465157 +MultipartBoundaryBegin 6465157 +MultipartBoundaryEnd 6465196 +MimeEntityBegin 6465196 +MimeEntityHeadersEnd 6465314 +MimeContentBegin 6465314 +MultipartPreambleBegin 6465314 +MultipartPreambleEnd 6465315 +MultipartBoundaryBegin 6465315 +MultipartBoundaryEnd 6465354 +MimeEntityBegin 6465354 +MimeEntityHeadersEnd 6465432 +MimeContentBegin 6465432 +MimeContentEnd 6466704 +MimeEntityEnd 6466705 +MultipartBoundaryBegin 6466705 +MultipartBoundaryEnd 6466744 +MimeEntityBegin 6466744 +MimeEntityHeadersEnd 6466823 +MimeContentBegin 6466823 +MimeContentEnd 6469287 +MimeEntityEnd 6469288 +MultipartEndBoundaryBegin 6469288 +MultipartEndBoundaryEnd 6469328 +MultipartEpilogueBegin 6469328 +MultipartEpilogueEnd 6469330 +MimeEntityEnd 6469331 +MultipartBoundaryBegin 6469331 +MultipartBoundaryEnd 6469370 +MimeEntityBegin 6469370 +MimeEntityHeadersEnd 6469575 +MimeContentBegin 6469575 +MimeContentEnd 6490325 +MimeEntityEnd 6490326 +MultipartEndBoundaryBegin 6490326 +MultipartEndBoundaryEnd 6490366 +MultipartEpilogueBegin 6490366 +MultipartEpilogueEnd 6490367 +MimeEntityEnd 6490368 +MimeMessageEnd 6490368 +MboxMarkerBegin 6490368 +MboxMarkerEnd 6490399 +MimeMessageBegin 6490400 +MimeMessageHeadersEnd 6490806 +MimeEntityBegin 6490400 +MimeEntityHeadersEnd 6490806 +MimeContentBegin 6490806 +MultipartPreambleBegin 6490806 +MultipartPreambleEnd 6490852 +MultipartBoundaryBegin 6490852 +MultipartBoundaryEnd 6490872 +MimeEntityBegin 6490872 +MimeEntityHeadersEnd 6490873 +MimeContentBegin 6490873 +MimeContentEnd 6490936 +MimeEntityEnd 6490937 +MultipartBoundaryBegin 6490937 +MultipartBoundaryEnd 6490957 +MimeEntityBegin 6490957 +MimeEntityHeadersEnd 6491031 +MimeContentBegin 6491031 +MultipartPreambleBegin 6491031 +MultipartPreambleEnd 6491031 +MultipartBoundaryBegin 6491031 +MultipartBoundaryEnd 6491058 +MimeEntityBegin 6491058 +MimeEntityHeadersEnd 6491164 +MimeContentBegin 6491164 +MimeContentEnd 6491244 +MimeEntityEnd 6491245 +MultipartBoundaryBegin 6491245 +MultipartBoundaryEnd 6491272 +MimeEntityBegin 6491272 +MimeEntityHeadersEnd 6491381 +MimeContentBegin 6491381 +MimeContentEnd 6491539 +MimeEntityEnd 6491540 +MultipartBoundaryBegin 6491540 +MultipartBoundaryEnd 6491567 +MimeEntityBegin 6491567 +MimeEntityHeadersEnd 6491676 +MimeContentBegin 6491676 +MimeContentEnd 6491839 +MimeEntityEnd 6491840 +MultipartBoundaryBegin 6491840 +MultipartBoundaryEnd 6491867 +MimeEntityBegin 6491867 +MimeEntityHeadersEnd 6491972 +MimeContentBegin 6491972 +MimeContentEnd 6492133 +MimeEntityEnd 6492134 +MultipartBoundaryBegin 6492134 +MultipartBoundaryEnd 6492161 +MimeEntityBegin 6492161 +MimeEntityHeadersEnd 6492285 +MimeContentBegin 6492285 +MimeContentEnd 6492712 +MimeEntityEnd 6492713 +MultipartEndBoundaryBegin 6492713 +MultipartEndBoundaryEnd 6492741 +MultipartEpilogueBegin 6492741 +MultipartEpilogueEnd 6492741 +MimeEntityEnd 6492742 +MultipartBoundaryBegin 6492742 +MultipartBoundaryEnd 6492762 +MimeEntityBegin 6492762 +MimeEntityHeadersEnd 6492763 +MimeContentBegin 6492763 +MimeContentEnd 6492928 +MimeEntityEnd 6492929 +MultipartBoundaryBegin 6492929 +MultipartBoundaryEnd 6492949 +MimeEntityBegin 6492949 +MimeEntityHeadersEnd 6492999 +MimeContentBegin 6492999 +MultipartPreambleBegin 6492999 +MultipartPreambleEnd 6492999 +MultipartBoundaryBegin 6492999 +MultipartBoundaryEnd 6493004 +MimeEntityBegin 6493004 +MimeEntityHeadersEnd 6493030 +MimeContentBegin 6493030 +MimeContentEnd 6493083 +MimeEntityEnd 6493084 +MultipartBoundaryBegin 6493084 +MultipartBoundaryEnd 6493089 +MimeEntityBegin 6493089 +MimeEntityHeadersEnd 6493139 +MimeContentBegin 6493139 +MultipartPreambleBegin 6493139 +MultipartPreambleEnd 6493139 +MultipartBoundaryBegin 6493139 +MultipartBoundaryEnd 6493144 +MimeEntityBegin 6493144 +MimeEntityHeadersEnd 6493170 +MimeContentBegin 6493170 +MimeContentEnd 6493223 +MimeEntityEnd 6493224 +MultipartBoundaryBegin 6493224 +MultipartBoundaryEnd 6493229 +MimeEntityBegin 6493229 +MimeEntityHeadersEnd 6493254 +MimeContentBegin 6493254 +MimeContentEnd 6493304 +MimeEntityEnd 6493305 +MultipartBoundaryBegin 6493305 +MultipartBoundaryEnd 6493310 +MimeEntityBegin 6493310 +MimeEntityHeadersEnd 6493337 +MimeContentBegin 6493337 +MimeContentEnd 6493391 +MimeEntityEnd 6493392 +MultipartEndBoundaryBegin 6493392 +MultipartEndBoundaryEnd 6493398 +MultipartEpilogueBegin 6493398 +MultipartEpilogueEnd 6493399 +MimeEntityEnd 6493400 +MultipartBoundaryBegin 6493400 +MultipartBoundaryEnd 6493405 +MimeEntityBegin 6493405 +MimeEntityHeadersEnd 6493497 +MimeContentBegin 6493497 +MimeContentEnd 6493512 +MimeEntityEnd 6493513 +MultipartEndBoundaryBegin 6493513 +MultipartEndBoundaryEnd 6493519 +MultipartEpilogueBegin 6493519 +MultipartEpilogueEnd 6493519 +MimeEntityEnd 6493520 +MultipartBoundaryBegin 6493520 +MultipartBoundaryEnd 6493540 +MimeEntityBegin 6493540 +MimeEntityHeadersEnd 6493541 +MimeContentBegin 6493541 +MimeContentEnd 6493550 +MimeEntityEnd 6493551 +MultipartEndBoundaryBegin 6493551 +MultipartEndBoundaryEnd 6493572 +MultipartEpilogueBegin 6493572 +MultipartEpilogueEnd 6493572 +MimeEntityEnd 6493573 +MimeMessageEnd 6493573 +MboxMarkerBegin 6493573 +MboxMarkerEnd 6493604 +MimeMessageBegin 6493605 +MimeMessageHeadersEnd 6494009 +MimeEntityBegin 6493605 +MimeEntityHeadersEnd 6494009 +MimeContentBegin 6494009 +MultipartPreambleBegin 6494009 +MultipartPreambleEnd 6494055 +MultipartBoundaryBegin 6494055 +MultipartBoundaryEnd 6494075 +MimeEntityBegin 6494075 +MimeEntityHeadersEnd 6494076 +MimeContentBegin 6494076 +MimeContentEnd 6494143 +MimeEntityEnd 6494144 +MultipartBoundaryBegin 6494144 +MultipartBoundaryEnd 6494164 +MimeEntityBegin 6494164 +MimeEntityHeadersEnd 6494238 +MimeContentBegin 6494238 +MultipartPreambleBegin 6494238 +MultipartPreambleEnd 6494238 +MultipartBoundaryBegin 6494238 +MultipartBoundaryEnd 6494265 +MimeEntityBegin 6494265 +MimeEntityHeadersEnd 6494421 +MimeContentBegin 6494421 +MimeContentEnd 6549684 +MimeEntityEnd 6549685 +MultipartBoundaryBegin 6549685 +MultipartBoundaryEnd 6549712 +MimeEntityBegin 6549712 +MimeEntityHeadersEnd 6549867 +MimeContentBegin 6549867 +MimeContentEnd 6655916 +MimeEntityEnd 6655917 +MultipartBoundaryBegin 6655917 +MultipartBoundaryEnd 6655944 +MimeEntityBegin 6655944 +MimeEntityHeadersEnd 6656090 +MimeContentBegin 6656090 +MimeContentEnd 6844449 +MimeEntityEnd 6844450 +MultipartEndBoundaryBegin 6844450 +MultipartEndBoundaryEnd 6844478 +MultipartEpilogueBegin 6844478 +MultipartEpilogueEnd 6844479 +MimeEntityEnd 6844480 +MultipartEndBoundaryBegin 6844480 +MultipartEndBoundaryEnd 6844501 +MultipartEpilogueBegin 6844501 +MultipartEpilogueEnd 6844507 +MimeEntityEnd 6844508 +MimeMessageEnd 6844508 +MboxMarkerBegin 6844508 +MboxMarkerEnd 6844515 +MimeMessageBegin 6844516 +MimeMessageHeadersEnd 6845120 +MimeEntityBegin 6844516 +MimeEntityHeadersEnd 6845120 +MimeContentBegin 6845120 +MultipartPreambleBegin 6845120 +MultipartPreambleEnd 6845336 +MultipartBoundaryBegin 6845336 +MultipartBoundaryEnd 6845376 +MimeEntityBegin 6845376 +MimeEntityHeadersEnd 6845488 +MimeContentBegin 6845488 +MimeContentEnd 6845488 +MimeEntityEnd 6845489 +MultipartBoundaryBegin 6845489 +MultipartBoundaryEnd 6845529 +MimeEntityBegin 6845529 +MimeEntityHeadersEnd 6845627 +MimeContentBegin 6845627 +MimeMessageBegin 6845627 +MimeMessageHeadersEnd 6846168 +MimeEntityBegin 6845627 +MimeEntityHeadersEnd 6846168 +MimeContentBegin 6846168 +MimeContentEnd 6846514 +MimeEntityEnd 6846515 +MimeMessageEnd 6846515 +MimeContentEnd 6846515 +MimeEntityEnd 6846515 +MultipartEndBoundaryBegin 6846515 +MultipartEndBoundaryEnd 6846556 +MultipartEpilogueBegin 6846556 +MultipartEpilogueEnd 6846556 +MimeEntityEnd 6846557 +MimeMessageEnd 6846557 +MboxMarkerBegin 6846557 +MboxMarkerEnd 6846564 +MimeMessageBegin 6846565 +MimeMessageHeadersEnd 6846861 +MimeEntityBegin 6846565 +MimeEntityHeadersEnd 6846861 +MimeContentBegin 6846861 +MultipartPreambleBegin 6846861 +MultipartPreambleEnd 6846861 +MultipartBoundaryBegin 6846861 +MultipartBoundaryEnd 6846900 +MimeEntityBegin 6846900 +MimeEntityHeadersEnd 6847146 +MimeContentBegin 6847146 +MimeContentEnd 6847865 +MimeEntityEnd 6847866 +MultipartBoundaryBegin 6847866 +MultipartBoundaryEnd 6847905 +MimeEntityBegin 6847905 +MimeEntityHeadersEnd 6848225 +MimeContentBegin 6848225 +MimeContentEnd 6858948 +MimeEntityEnd 6858949 +MultipartEndBoundaryBegin 6858949 +MultipartEndBoundaryEnd 6858989 +MultipartEpilogueBegin 6858989 +MultipartEpilogueEnd 6858989 +MimeEntityEnd 6858990 +MimeMessageEnd 6858990 +MboxMarkerBegin 6858990 +MboxMarkerEnd 6858997 +MimeMessageBegin 6858998 +MimeMessageHeadersEnd 6859294 +MimeEntityBegin 6858998 +MimeEntityHeadersEnd 6859294 +MimeContentBegin 6859294 +MultipartPreambleBegin 6859294 +MultipartPreambleEnd 6859294 +MultipartBoundaryBegin 6859294 +MultipartBoundaryEnd 6859333 +MimeEntityBegin 6859333 +MimeEntityHeadersEnd 6859579 +MimeContentBegin 6859579 +MimeContentEnd 6860297 +MimeEntityEnd 6860298 +MultipartBoundaryBegin 6860298 +MultipartBoundaryEnd 6860337 +MimeEntityBegin 6860337 +MimeEntityHeadersEnd 6860626 +MimeContentBegin 6860626 +MimeContentEnd 6871349 +MimeEntityEnd 6871350 +MultipartEndBoundaryBegin 6871350 +MultipartEndBoundaryEnd 6871390 +MultipartEpilogueBegin 6871390 +MultipartEpilogueEnd 6871390 +MimeEntityEnd 6871391 +MimeMessageEnd 6871391 +MboxMarkerBegin 6871391 +MboxMarkerEnd 6871422 +MimeMessageBegin 6871423 +MimeMessageHeadersEnd 6872926 +MimeEntityBegin 6871423 +MimeEntityHeadersEnd 6872926 +MimeContentBegin 6872926 +MultipartPreambleBegin 6872926 +MultipartPreambleEnd 6872927 +MultipartBoundaryBegin 6872927 +MultipartBoundaryEnd 6872971 +MimeEntityBegin 6872971 +MimeEntityHeadersEnd 6873062 +MimeContentBegin 6873062 +MimeContentEnd 6878261 +MimeEntityEnd 6878262 +MultipartBoundaryBegin 6878262 +MultipartBoundaryEnd 6878306 +MimeEntityBegin 6878306 +MimeEntityHeadersEnd 6878505 +MimeContentBegin 6878505 +MimeContentEnd 6879434 +MimeEntityEnd 6879435 +MultipartEndBoundaryBegin 6879435 +MultipartEndBoundaryEnd 6879480 +MultipartEpilogueBegin 6879480 +MultipartEpilogueEnd 6879481 +MimeEntityEnd 6879482 +MimeMessageEnd 6879482 +MboxMarkerBegin 6879482 +MboxMarkerEnd 6879513 +MimeMessageBegin 6879514 +MimeMessageHeadersEnd 6879961 +MimeEntityBegin 6879514 +MimeEntityHeadersEnd 6879961 +MimeContentBegin 6879961 +MultipartPreambleBegin 6879961 +MultipartPreambleEnd 6879961 +MultipartBoundaryBegin 6879961 +MultipartBoundaryEnd 6880000 +MimeEntityBegin 6880000 +MimeEntityHeadersEnd 6880026 +MimeContentBegin 6880026 +MimeContentEnd 6880273 +MimeEntityEnd 6880274 +MultipartBoundaryBegin 6880274 +MultipartBoundaryEnd 6880313 +MimeEntityBegin 6880313 +MimeEntityHeadersEnd 6880399 +MimeContentBegin 6880399 +MultipartPreambleBegin 6880399 +MultipartPreambleEnd 6880399 +MultipartBoundaryBegin 6880399 +MultipartBoundaryEnd 6880438 +MimeEntityBegin 6880438 +MimeEntityHeadersEnd 6880632 +MimeContentBegin 6880632 +MimeContentEnd 6887780 +MimeEntityEnd 6887781 +MultipartBoundaryBegin 6887781 +MultipartBoundaryEnd 6887820 +MimeEntityBegin 6887820 +MimeEntityHeadersEnd 6887996 +MimeContentBegin 6887996 +MimeContentEnd 6895977 +MimeEntityEnd 6895978 +MultipartBoundaryBegin 6895978 +MultipartBoundaryEnd 6896017 +MimeEntityBegin 6896017 +MimeEntityHeadersEnd 6896176 +MimeContentBegin 6896176 +MimeContentEnd 6903630 +MimeEntityEnd 6903631 +MultipartBoundaryBegin 6903631 +MultipartBoundaryEnd 6903670 +MimeEntityBegin 6903670 +MimeEntityHeadersEnd 6903828 +MimeContentBegin 6903828 +MimeContentEnd 6907161 +MimeEntityEnd 6907162 +MultipartBoundaryBegin 6907162 +MultipartBoundaryEnd 6907201 +MimeEntityBegin 6907201 +MimeEntityHeadersEnd 6907360 +MimeContentBegin 6907360 +MimeContentEnd 6915811 +MimeEntityEnd 6915812 +MultipartBoundaryBegin 6915812 +MultipartBoundaryEnd 6915851 +MimeEntityBegin 6915851 +MimeEntityHeadersEnd 6916007 +MimeContentBegin 6916007 +MimeContentEnd 7020376 +MimeEntityEnd 7020377 +MultipartBoundaryBegin 7020377 +MultipartBoundaryEnd 7020416 +MimeEntityBegin 7020416 +MimeEntityHeadersEnd 7020575 +MimeContentBegin 7020575 +MimeContentEnd 7058936 +MimeEntityEnd 7058937 +MultipartBoundaryBegin 7058937 +MultipartBoundaryEnd 7058976 +MimeEntityBegin 7058976 +MimeEntityHeadersEnd 7059140 +MimeContentBegin 7059140 +MimeContentEnd 7094455 +MimeEntityEnd 7094456 +MultipartEndBoundaryBegin 7094456 +MultipartEndBoundaryEnd 7094496 +MultipartEpilogueBegin 7094496 +MultipartEpilogueEnd 7094496 +MimeEntityEnd 7094497 +MultipartEndBoundaryBegin 7094497 +MultipartEndBoundaryEnd 7094537 +MultipartEpilogueBegin 7094537 +MultipartEpilogueEnd 7094537 +MimeEntityEnd 7094538 +MimeMessageEnd 7094538 +MboxMarkerBegin 7094538 +MboxMarkerEnd 7094545 +MimeMessageBegin 7094546 +MimeMessageHeadersEnd 7094841 +MimeEntityBegin 7094546 +MimeEntityHeadersEnd 7094841 +MimeContentBegin 7094841 +MultipartPreambleBegin 7094841 +MultipartPreambleEnd 7094841 +MultipartBoundaryBegin 7094841 +MultipartBoundaryEnd 7094880 +MimeEntityBegin 7094880 +MimeEntityHeadersEnd 7095036 +MimeContentBegin 7095036 +MimeContentEnd 7095587 +MimeEntityEnd 7095588 +MultipartBoundaryBegin 7095588 +MultipartBoundaryEnd 7095627 +MimeEntityBegin 7095627 +MimeEntityHeadersEnd 7095740 +MimeContentBegin 7095740 +MimeContentEnd 7106463 +MimeEntityEnd 7106464 +MultipartEndBoundaryBegin 7106464 +MultipartEndBoundaryEnd 7106504 +MultipartEpilogueBegin 7106504 +MultipartEpilogueEnd 7106504 +MimeEntityEnd 7106505 +MimeMessageEnd 7106505 +MboxMarkerBegin 7106505 +MboxMarkerEnd 7106512 +MimeMessageBegin 7106513 +MimeMessageHeadersEnd 7106808 +MimeEntityBegin 7106513 +MimeEntityHeadersEnd 7106808 +MimeContentBegin 7106808 +MultipartPreambleBegin 7106808 +MultipartPreambleEnd 7106808 +MultipartBoundaryBegin 7106808 +MultipartBoundaryEnd 7106847 +MimeEntityBegin 7106847 +MimeEntityHeadersEnd 7107059 +MimeContentBegin 7107059 +MimeContentEnd 7107656 +MimeEntityEnd 7107657 +MultipartBoundaryBegin 7107657 +MultipartBoundaryEnd 7107696 +MimeEntityBegin 7107696 +MimeEntityHeadersEnd 7107970 +MimeContentBegin 7107970 +MimeContentEnd 7118693 +MimeEntityEnd 7118694 +MultipartEndBoundaryBegin 7118694 +MultipartEndBoundaryEnd 7118734 +MultipartEpilogueBegin 7118734 +MultipartEpilogueEnd 7118734 +MimeEntityEnd 7118735 +MimeMessageEnd 7118735 +MboxMarkerBegin 7118735 +MboxMarkerEnd 7118742 +MimeMessageBegin 7118743 +MimeMessageHeadersEnd 7119038 +MimeEntityBegin 7118743 +MimeEntityHeadersEnd 7119038 +MimeContentBegin 7119038 +MultipartPreambleBegin 7119038 +MultipartPreambleEnd 7119038 +MultipartBoundaryBegin 7119038 +MultipartBoundaryEnd 7119077 +MimeEntityBegin 7119077 +MimeEntityHeadersEnd 7119293 +MimeContentBegin 7119293 +MimeContentEnd 7119894 +MimeEntityEnd 7119895 +MultipartBoundaryBegin 7119895 +MultipartBoundaryEnd 7119934 +MimeEntityBegin 7119934 +MimeEntityHeadersEnd 7120109 +MimeContentBegin 7120109 +MimeContentEnd 7130832 +MimeEntityEnd 7130833 +MultipartEndBoundaryBegin 7130833 +MultipartEndBoundaryEnd 7130873 +MultipartEpilogueBegin 7130873 +MultipartEpilogueEnd 7130873 +MimeEntityEnd 7130874 +MimeMessageEnd 7130874 +MboxMarkerBegin 7130874 +MboxMarkerEnd 7130881 +MimeMessageBegin 7130882 +MimeMessageHeadersEnd 7131177 +MimeEntityBegin 7130882 +MimeEntityHeadersEnd 7131177 +MimeContentBegin 7131177 +MultipartPreambleBegin 7131177 +MultipartPreambleEnd 7131177 +MultipartBoundaryBegin 7131177 +MultipartBoundaryEnd 7131216 +MimeEntityBegin 7131216 +MimeEntityHeadersEnd 7131461 +MimeContentBegin 7131461 +MimeContentEnd 7132092 +MimeEntityEnd 7132093 +MultipartBoundaryBegin 7132093 +MultipartBoundaryEnd 7132132 +MimeEntityBegin 7132132 +MimeEntityHeadersEnd 7132437 +MimeContentBegin 7132437 +MimeContentEnd 7143160 +MimeEntityEnd 7143161 +MultipartEndBoundaryBegin 7143161 +MultipartEndBoundaryEnd 7143201 +MultipartEpilogueBegin 7143201 +MultipartEpilogueEnd 7143201 +MimeEntityEnd 7143202 +MimeMessageEnd 7143202 +MboxMarkerBegin 7143202 +MboxMarkerEnd 7143209 +MimeMessageBegin 7143210 +MimeMessageHeadersEnd 7143505 +MimeEntityBegin 7143210 +MimeEntityHeadersEnd 7143505 +MimeContentBegin 7143505 +MultipartPreambleBegin 7143505 +MultipartPreambleEnd 7143505 +MultipartBoundaryBegin 7143505 +MultipartBoundaryEnd 7143544 +MimeEntityBegin 7143544 +MimeEntityHeadersEnd 7143760 +MimeContentBegin 7143760 +MimeContentEnd 7144405 +MimeEntityEnd 7144406 +MultipartBoundaryBegin 7144406 +MultipartBoundaryEnd 7144445 +MimeEntityBegin 7144445 +MimeEntityHeadersEnd 7144620 +MimeContentBegin 7144620 +MimeContentEnd 7155343 +MimeEntityEnd 7155344 +MultipartEndBoundaryBegin 7155344 +MultipartEndBoundaryEnd 7155384 +MultipartEpilogueBegin 7155384 +MultipartEpilogueEnd 7155384 +MimeEntityEnd 7155385 +MimeMessageEnd 7155385 +MboxMarkerBegin 7155385 +MboxMarkerEnd 7155392 +MimeMessageBegin 7155393 +MimeMessageHeadersEnd 7155688 +MimeEntityBegin 7155393 +MimeEntityHeadersEnd 7155688 +MimeContentBegin 7155688 +MultipartPreambleBegin 7155688 +MultipartPreambleEnd 7155688 +MultipartBoundaryBegin 7155688 +MultipartBoundaryEnd 7155727 +MimeEntityBegin 7155727 +MimeEntityHeadersEnd 7155972 +MimeContentBegin 7155972 +MimeContentEnd 7156642 +MimeEntityEnd 7156643 +MultipartBoundaryBegin 7156643 +MultipartBoundaryEnd 7156682 +MimeEntityBegin 7156682 +MimeEntityHeadersEnd 7157018 +MimeContentBegin 7157018 +MimeContentEnd 7167741 +MimeEntityEnd 7167742 +MultipartEndBoundaryBegin 7167742 +MultipartEndBoundaryEnd 7167782 +MultipartEpilogueBegin 7167782 +MultipartEpilogueEnd 7167782 +MimeEntityEnd 7167783 +MimeMessageEnd 7167783 +MboxMarkerBegin 7167783 +MboxMarkerEnd 7167814 +MimeMessageBegin 7167815 +MimeMessageHeadersEnd 7169049 +MimeEntityBegin 7167815 +MimeEntityHeadersEnd 7169049 +MimeContentBegin 7169049 +MultipartPreambleBegin 7169049 +MultipartPreambleEnd 7169095 +MultipartBoundaryBegin 7169095 +MultipartBoundaryEnd 7169133 +MimeEntityBegin 7169133 +MimeEntityHeadersEnd 7169209 +MimeContentBegin 7169209 +MimeContentEnd 7169236 +MimeEntityEnd 7169237 +MultipartBoundaryBegin 7169237 +MultipartBoundaryEnd 7169275 +MimeEntityBegin 7169275 +MimeEntityHeadersEnd 7169365 +MimeContentBegin 7169365 +MimeMessageBegin 7169365 +MimeMessageHeadersEnd 7170186 +MimeEntityBegin 7169365 +MimeEntityHeadersEnd 7170186 +MimeContentBegin 7170186 +MultipartPreambleBegin 7170186 +MultipartPreambleEnd 7170187 +MultipartBoundaryBegin 7170187 +MultipartBoundaryEnd 7170226 +MimeEntityBegin 7170226 +MimeEntityHeadersEnd 7170302 +MimeContentBegin 7170302 +MimeContentEnd 7170929 +MimeEntityEnd 7170930 +MultipartBoundaryBegin 7170930 +MultipartBoundaryEnd 7170969 +MimeEntityBegin 7170969 +MimeEntityHeadersEnd 7171051 +MimeContentBegin 7171051 +MultipartPreambleBegin 7171051 +MultipartPreambleEnd 7171052 +MultipartBoundaryBegin 7171052 +MultipartBoundaryEnd 7171091 +MimeEntityBegin 7171091 +MimeEntityHeadersEnd 7171166 +MimeContentBegin 7171166 +MimeContentEnd 7172016 +MimeEntityEnd 7172017 +MultipartBoundaryBegin 7172017 +MultipartBoundaryEnd 7172056 +MimeEntityBegin 7172056 +MimeEntityHeadersEnd 7172240 +MimeContentBegin 7172240 +MimeContentEnd 7916207 +MimeEntityEnd 7916208 +MultipartEndBoundaryBegin 7916208 +MultipartEndBoundaryEnd 7916248 +MultipartEpilogueBegin 7916248 +MultipartEpilogueEnd 7916249 +MimeEntityEnd 7916250 +MultipartEndBoundaryBegin 7916250 +MultipartEndBoundaryEnd 7916290 +MultipartEpilogueBegin 7916290 +MultipartEpilogueEnd 7916293 +MimeEntityEnd 7916294 +MimeMessageEnd 7916294 +MimeContentEnd 7916294 +MimeEntityEnd 7916294 +MultipartEndBoundaryBegin 7916294 +MultipartEndBoundaryEnd 7916333 +MultipartEpilogueBegin 7916333 +MultipartEpilogueEnd 7916334 +MimeEntityEnd 7916335 +MimeMessageEnd 7916335 +MboxMarkerBegin 7916335 +MboxMarkerEnd 7916366 +MimeMessageBegin 7916367 +MimeMessageHeadersEnd 7917631 +MimeEntityBegin 7916367 +MimeEntityHeadersEnd 7917631 +MimeContentBegin 7917631 +MultipartPreambleBegin 7917631 +MultipartPreambleEnd 7917632 +MultipartBoundaryBegin 7917632 +MultipartBoundaryEnd 7917676 +MimeEntityBegin 7917676 +MimeEntityHeadersEnd 7917767 +MimeContentBegin 7917767 +MimeContentEnd 7920149 +MimeEntityEnd 7920150 +MultipartBoundaryBegin 7920150 +MultipartBoundaryEnd 7920194 +MimeEntityBegin 7920194 +MimeEntityHeadersEnd 7920353 +MimeContentBegin 7920353 +MimeContentEnd 7926376 +MimeEntityEnd 7926377 +MultipartBoundaryBegin 7926377 +MultipartBoundaryEnd 7926421 +MimeEntityBegin 7926421 +MimeEntityHeadersEnd 7926579 +MimeContentBegin 7926579 +MimeContentEnd 7938652 +MimeEntityEnd 7938653 +MultipartBoundaryBegin 7938653 +MultipartBoundaryEnd 7938697 +MimeEntityBegin 7938697 +MimeEntityHeadersEnd 7938857 +MimeContentBegin 7938857 +MimeContentEnd 7960571 +MimeEntityEnd 7960572 +MultipartBoundaryBegin 7960572 +MultipartBoundaryEnd 7960616 +MimeEntityBegin 7960616 +MimeEntityHeadersEnd 7960819 +MimeContentBegin 7960819 +MimeContentEnd 7964212 +MimeEntityEnd 7964213 +MultipartEndBoundaryBegin 7964213 +MultipartEndBoundaryEnd 7964258 +MultipartEpilogueBegin 7964258 +MultipartEpilogueEnd 7964259 +MimeEntityEnd 7964260 +MimeMessageEnd 7964260 +MboxMarkerBegin 7964260 +MboxMarkerEnd 7964267 +MimeMessageBegin 7964268 +MimeMessageHeadersEnd 7965009 +MimeEntityBegin 7964268 +MimeEntityHeadersEnd 7965009 +MimeContentBegin 7965009 +MimeContentEnd 8509625 +MimeEntityEnd 8509626 +MimeMessageEnd 8509626 +MboxMarkerBegin 8509626 +MboxMarkerEnd 8509633 +MimeMessageBegin 8509634 +MimeMessageHeadersEnd 8510545 +MimeEntityBegin 8509634 +MimeEntityHeadersEnd 8510545 +MimeContentBegin 8510545 +MultipartPreambleBegin 8510545 +MultipartPreambleEnd 8510546 +MultipartBoundaryBegin 8510546 +MultipartBoundaryEnd 8510554 +MimeEntityBegin 8510554 +MimeEntityHeadersEnd 8510583 +MimeContentBegin 8510583 +MimeContentEnd 8513113 +MimeEntityEnd 8513114 +MultipartEndBoundaryBegin 8513114 +MultipartEndBoundaryEnd 8513123 +MultipartEpilogueBegin 8513123 +MultipartEpilogueEnd 8513124 +MimeEntityEnd 8513125 +MimeMessageEnd 8513125 +MboxMarkerBegin 8513125 +MboxMarkerEnd 8513156 +MimeMessageBegin 8513157 +MimeMessageHeadersEnd 8513751 +MimeEntityBegin 8513157 +MimeEntityHeadersEnd 8513751 +MimeContentBegin 8513751 +MultipartPreambleBegin 8513751 +MultipartPreambleEnd 8514031 +MultipartBoundaryBegin 8514031 +MultipartBoundaryEnd 8514048 +MimeEntityBegin 8514048 +MimeEntityHeadersEnd 8514093 +MimeContentBegin 8514093 +MimeContentEnd 8515175 +MimeEntityEnd 8515176 +MultipartBoundaryBegin 8515176 +MultipartBoundaryEnd 8515193 +MimeEntityBegin 8515193 +MimeEntityHeadersEnd 8515234 +MimeContentBegin 8515234 +MimeContentEnd 8515518 +MimeEntityEnd 8515519 +MultipartEndBoundaryBegin 8515519 +MultipartEndBoundaryEnd 8515537 +MultipartEpilogueBegin 8515537 +MultipartEpilogueEnd 8515537 +MimeEntityEnd 8515538 +MimeMessageEnd 8515538 +MboxMarkerBegin 8515538 +MboxMarkerEnd 8515545 +MimeMessageBegin 8515546 +MimeMessageHeadersEnd 8516708 +MimeEntityBegin 8515546 +MimeEntityHeadersEnd 8516708 +MimeContentBegin 8516708 +MimeContentEnd 8518091 +MimeEntityEnd 8518092 +MimeMessageEnd 8518092 +MboxMarkerBegin 8518092 +MboxMarkerEnd 8518099 +MimeMessageBegin 8518100 +MimeMessageHeadersEnd 8518733 +MimeEntityBegin 8518100 +MimeEntityHeadersEnd 8518733 +MimeContentBegin 8518733 +MimeContentEnd 8519707 +MimeEntityEnd 8519708 +MimeMessageEnd 8519708 +MboxMarkerBegin 8519708 +MboxMarkerEnd 8519715 +MimeMessageBegin 8519716 +MimeMessageHeadersEnd 8520478 +MimeEntityBegin 8519716 +MimeEntityHeadersEnd 8520478 +MimeContentBegin 8520478 +MultipartPreambleBegin 8520478 +MultipartPreambleEnd 8520633 +MultipartBoundaryBegin 8520633 +MultipartBoundaryEnd 8520673 +MimeEntityBegin 8520673 +MimeEntityHeadersEnd 8520717 +MimeContentBegin 8520717 +MimeContentEnd 8521534 +MimeEntityEnd 8521535 +MultipartBoundaryBegin 8521535 +MultipartBoundaryEnd 8521575 +MimeEntityBegin 8521575 +MimeEntityHeadersEnd 8521660 +MimeContentBegin 8521660 +MultipartPreambleBegin 8521660 +MultipartPreambleEnd 8521660 +MultipartBoundaryBegin 8521660 +MultipartBoundaryEnd 8521702 +MimeEntityBegin 8521702 +MimeEntityHeadersEnd 8521793 +MimeContentBegin 8521793 +MimeContentEnd 8522284 +MimeEntityEnd 8522285 +MultipartBoundaryBegin 8522285 +MultipartBoundaryEnd 8522327 +MimeEntityBegin 8522327 +MimeEntityHeadersEnd 8522513 +MimeContentBegin 8522513 +MimeMessageBegin 8522513 +MimeMessageHeadersEnd 8522540 +MimeEntityBegin 8522513 +MimeEntityHeadersEnd 8522540 +MimeContentBegin 8522540 +MimeContentEnd 8522542 +MimeEntityEnd 8522543 +MimeMessageEnd 8522543 +MimeContentEnd 8522543 +MimeEntityEnd 8522543 +MultipartBoundaryBegin 8522543 +MultipartBoundaryEnd 8522585 +MimeEntityBegin 8522585 +MimeEntityHeadersEnd 8522673 +MimeContentBegin 8522673 +MimeContentEnd 8522676 +MimeEntityEnd 8522677 +MultipartBoundaryBegin 8522677 +MultipartBoundaryEnd 8522719 +MimeEntityBegin 8522719 +MimeEntityHeadersEnd 8522920 +MimeContentBegin 8522920 +MimeMessageBegin 8522920 +MimeMessageHeadersEnd 8522945 +MimeEntityBegin 8522920 +MimeEntityHeadersEnd 8522945 +MimeContentBegin 8522945 +MimeContentEnd 8522947 +MimeEntityEnd 8522948 +MimeMessageEnd 8522948 +MimeContentEnd 8522948 +MimeEntityEnd 8522948 +MultipartBoundaryBegin 8522948 +MultipartBoundaryEnd 8522990 +MimeEntityBegin 8522990 +MimeEntityHeadersEnd 8523081 +MimeContentBegin 8523081 +MimeContentEnd 8523303 +MimeEntityEnd 8523304 +MultipartEndBoundaryBegin 8523304 +MultipartEndBoundaryEnd 8523347 +MultipartEpilogueBegin 8523347 +MultipartEpilogueEnd 8523348 +MimeEntityEnd 8523349 +MultipartEndBoundaryBegin 8523349 +MultipartEndBoundaryEnd 8523390 +MultipartEpilogueBegin 8523390 +MultipartEpilogueEnd 8523391 +MimeEntityEnd 8523392 +MimeMessageEnd 8523392 +MboxMarkerBegin 8523392 +MboxMarkerEnd 8523399 +MimeMessageBegin 8523400 +MimeMessageHeadersEnd 8524214 +MimeEntityBegin 8523400 +MimeEntityHeadersEnd 8524214 +MimeContentBegin 8524214 +MimeContentEnd 8525600 +MimeEntityEnd 8525601 +MimeMessageEnd 8525601 +MboxMarkerBegin 8525601 +MboxMarkerEnd 8525608 +MimeMessageBegin 8525609 +MimeMessageHeadersEnd 8525761 +MimeEntityBegin 8525609 +MimeEntityHeadersEnd 8525761 +MimeContentBegin 8525761 +MimeContentEnd 8530432 +MimeEntityEnd 8530433 +MimeMessageEnd 8530433 +MboxMarkerBegin 8530433 +MboxMarkerEnd 8530440 +MimeMessageBegin 8530441 +MimeMessageHeadersEnd 8532184 +MimeEntityBegin 8530441 +MimeEntityHeadersEnd 8532184 +MimeContentBegin 8532184 +MultipartPreambleBegin 8532184 +MultipartPreambleEnd 8532339 +MultipartBoundaryBegin 8532339 +MultipartBoundaryEnd 8532379 +MimeEntityBegin 8532379 +MimeEntityHeadersEnd 8532423 +MimeContentBegin 8532423 +MimeContentEnd 8534090 +MimeEntityEnd 8534091 +MultipartBoundaryBegin 8534091 +MultipartBoundaryEnd 8534131 +MimeEntityBegin 8534131 +MimeEntityHeadersEnd 8534216 +MimeContentBegin 8534216 +MultipartPreambleBegin 8534216 +MultipartPreambleEnd 8534216 +MultipartBoundaryBegin 8534216 +MultipartBoundaryEnd 8534258 +MimeEntityBegin 8534258 +MimeEntityHeadersEnd 8534349 +MimeContentBegin 8534349 +MimeContentEnd 8534906 +MimeEntityEnd 8534907 +MultipartBoundaryBegin 8534907 +MultipartBoundaryEnd 8534949 +MimeEntityBegin 8534949 +MimeEntityHeadersEnd 8535010 +MimeContentBegin 8535010 +MimeContentEnd 8535882 +MimeEntityEnd 8535883 +MultipartBoundaryBegin 8535883 +MultipartBoundaryEnd 8535925 +MimeEntityBegin 8535925 +MimeEntityHeadersEnd 8536016 +MimeContentBegin 8536016 +MimeContentEnd 8536062 +MimeEntityEnd 8536063 +MultipartBoundaryBegin 8536063 +MultipartBoundaryEnd 8536105 +MimeEntityBegin 8536105 +MimeEntityHeadersEnd 8536166 +MimeContentBegin 8536166 +MimeContentEnd 8537038 +MimeEntityEnd 8537039 +MultipartBoundaryBegin 8537039 +MultipartBoundaryEnd 8537081 +MimeEntityBegin 8537081 +MimeEntityHeadersEnd 8537172 +MimeContentBegin 8537172 +MimeContentEnd 8537218 +MimeEntityEnd 8537219 +MultipartBoundaryBegin 8537219 +MultipartBoundaryEnd 8537261 +MimeEntityBegin 8537261 +MimeEntityHeadersEnd 8537322 +MimeContentBegin 8537322 +MimeContentEnd 8538194 +MimeEntityEnd 8538195 +MultipartBoundaryBegin 8538195 +MultipartBoundaryEnd 8538237 +MimeEntityBegin 8538237 +MimeEntityHeadersEnd 8538328 +MimeContentBegin 8538328 +MimeContentEnd 8538368 +MimeEntityEnd 8538369 +MultipartBoundaryBegin 8538369 +MultipartBoundaryEnd 8538411 +MimeEntityBegin 8538411 +MimeEntityHeadersEnd 8538472 +MimeContentBegin 8538472 +MimeContentEnd 8538696 +MimeEntityEnd 8538697 +MultipartBoundaryBegin 8538697 +MultipartBoundaryEnd 8538739 +MimeEntityBegin 8538739 +MimeEntityHeadersEnd 8538830 +MimeContentBegin 8538830 +MimeContentEnd 8538894 +MimeEntityEnd 8538895 +MultipartBoundaryBegin 8538895 +MultipartBoundaryEnd 8538937 +MimeEntityBegin 8538937 +MimeEntityHeadersEnd 8538998 +MimeContentBegin 8538998 +MimeContentEnd 8539222 +MimeEntityEnd 8539223 +MultipartBoundaryBegin 8539223 +MultipartBoundaryEnd 8539265 +MimeEntityBegin 8539265 +MimeEntityHeadersEnd 8539356 +MimeContentBegin 8539356 +MimeContentEnd 8539400 +MimeEntityEnd 8539401 +MultipartBoundaryBegin 8539401 +MultipartBoundaryEnd 8539443 +MimeEntityBegin 8539443 +MimeEntityHeadersEnd 8539504 +MimeContentBegin 8539504 +MimeContentEnd 8539728 +MimeEntityEnd 8539729 +MultipartBoundaryBegin 8539729 +MultipartBoundaryEnd 8539771 +MimeEntityBegin 8539771 +MimeEntityHeadersEnd 8539862 +MimeContentBegin 8539862 +MimeContentEnd 8540154 +MimeEntityEnd 8540155 +MultipartBoundaryBegin 8540155 +MultipartBoundaryEnd 8540197 +MimeEntityBegin 8540197 +MimeEntityHeadersEnd 8540258 +MimeContentBegin 8540258 +MimeContentEnd 8541130 +MimeEntityEnd 8541131 +MultipartBoundaryBegin 8541131 +MultipartBoundaryEnd 8541173 +MimeEntityBegin 8541173 +MimeEntityHeadersEnd 8541264 +MimeContentBegin 8541264 +MimeContentEnd 8541304 +MimeEntityEnd 8541305 +MultipartBoundaryBegin 8541305 +MultipartBoundaryEnd 8541347 +MimeEntityBegin 8541347 +MimeEntityHeadersEnd 8541408 +MimeContentBegin 8541408 +MimeContentEnd 8543323 +MimeEntityEnd 8543324 +MultipartBoundaryBegin 8543324 +MultipartBoundaryEnd 8543366 +MimeEntityBegin 8543366 +MimeEntityHeadersEnd 8543457 +MimeContentBegin 8543457 +MimeContentEnd 8543467 +MimeEntityEnd 8543468 +MultipartEndBoundaryBegin 8543468 +MultipartEndBoundaryEnd 8543511 +MultipartEpilogueBegin 8543511 +MultipartEpilogueEnd 8543512 +MimeEntityEnd 8543513 +MultipartEndBoundaryBegin 8543513 +MultipartEndBoundaryEnd 8543554 +MultipartEpilogueBegin 8543554 +MultipartEpilogueEnd 8543555 +MimeEntityEnd 8543556 +MimeMessageEnd 8543556 +MboxMarkerBegin 8543556 +MboxMarkerEnd 8543563 +MimeMessageBegin 8543564 +MimeMessageHeadersEnd 8544292 +MimeEntityBegin 8543564 +MimeEntityHeadersEnd 8544292 +MimeContentBegin 8544292 +MultipartPreambleBegin 8544292 +MultipartPreambleEnd 8544447 +MultipartBoundaryBegin 8544447 +MultipartBoundaryEnd 8544487 +MimeEntityBegin 8544487 +MimeEntityHeadersEnd 8544531 +MimeContentBegin 8544531 +MimeContentEnd 8545158 +MimeEntityEnd 8545159 +MultipartBoundaryBegin 8545159 +MultipartBoundaryEnd 8545199 +MimeEntityBegin 8545199 +MimeEntityHeadersEnd 8545284 +MimeContentBegin 8545284 +MultipartPreambleBegin 8545284 +MultipartPreambleEnd 8545284 +MultipartBoundaryBegin 8545284 +MultipartBoundaryEnd 8545326 +MimeEntityBegin 8545326 +MimeEntityHeadersEnd 8545417 +MimeContentBegin 8545417 +MimeContentEnd 8545950 +MimeEntityEnd 8545951 +MultipartBoundaryBegin 8545951 +MultipartBoundaryEnd 8545993 +MimeEntityBegin 8545993 +MimeEntityHeadersEnd 8546101 +MimeContentBegin 8546101 +MimeContentEnd 8554686 +MimeEntityEnd 8554687 +MultipartBoundaryBegin 8554687 +MultipartBoundaryEnd 8554729 +MimeEntityBegin 8554729 +MimeEntityHeadersEnd 8554820 +MimeContentBegin 8554820 +MimeContentEnd 8554865 +MimeEntityEnd 8554866 +MultipartEndBoundaryBegin 8554866 +MultipartEndBoundaryEnd 8554909 +MultipartEpilogueBegin 8554909 +MultipartEpilogueEnd 8554910 +MimeEntityEnd 8554911 +MultipartEndBoundaryBegin 8554911 +MultipartEndBoundaryEnd 8554952 +MultipartEpilogueBegin 8554952 +MultipartEpilogueEnd 8554952 +MimeEntityEnd 8554953 +MimeMessageEnd 8554953 +MboxMarkerBegin 8554953 +MboxMarkerEnd 8554960 +MimeMessageBegin 8554961 +MimeMessageHeadersEnd 8555607 +MimeEntityBegin 8554961 +MimeEntityHeadersEnd 8555607 +MimeContentBegin 8555607 +MultipartPreambleBegin 8555607 +MultipartPreambleEnd 8555608 +MultipartBoundaryBegin 8555608 +MultipartBoundaryEnd 8555657 +MimeEntityBegin 8555657 +MimeEntityHeadersEnd 8555747 +MimeContentBegin 8555747 +MimeContentEnd 8555844 +MimeEntityEnd 8555845 +MultipartBoundaryBegin 8555845 +MultipartBoundaryEnd 8555894 +MimeEntityBegin 8555894 +MimeEntityHeadersEnd 8556021 +MimeContentBegin 8556021 +MimeContentEnd 8634463 +MimeEntityEnd 8634464 +MultipartEndBoundaryBegin 8634464 +MultipartEndBoundaryEnd 8634514 +MultipartEpilogueBegin 8634514 +MultipartEpilogueEnd 8634515 +MimeEntityEnd 8634516 +MimeMessageEnd 8634516 +MboxMarkerBegin 8634516 +MboxMarkerEnd 8634523 +MimeMessageBegin 8634524 +MimeMessageHeadersEnd 8635280 +MimeEntityBegin 8634524 +MimeEntityHeadersEnd 8635280 +MimeContentBegin 8635280 +MultipartPreambleBegin 8635280 +MultipartPreambleEnd 8635435 +MultipartBoundaryBegin 8635435 +MultipartBoundaryEnd 8635475 +MimeEntityBegin 8635475 +MimeEntityHeadersEnd 8635519 +MimeContentBegin 8635519 +MimeContentEnd 8636869 +MimeEntityEnd 8636870 +MultipartBoundaryBegin 8636870 +MultipartBoundaryEnd 8636910 +MimeEntityBegin 8636910 +MimeEntityHeadersEnd 8636995 +MimeContentBegin 8636995 +MultipartPreambleBegin 8636995 +MultipartPreambleEnd 8636995 +MultipartBoundaryBegin 8636995 +MultipartBoundaryEnd 8637037 +MimeEntityBegin 8637037 +MimeEntityHeadersEnd 8637128 +MimeContentBegin 8637128 +MimeContentEnd 8638267 +MimeEntityEnd 8638268 +MultipartBoundaryBegin 8638268 +MultipartBoundaryEnd 8638310 +MimeEntityBegin 8638310 +MimeEntityHeadersEnd 8638408 +MimeContentBegin 8638408 +MimeContentEnd 8753651 +MimeEntityEnd 8753652 +MultipartBoundaryBegin 8753652 +MultipartBoundaryEnd 8753694 +MimeEntityBegin 8753694 +MimeEntityHeadersEnd 8753785 +MimeContentBegin 8753785 +MimeContentEnd 8753908 +MimeEntityEnd 8753909 +MultipartBoundaryBegin 8753909 +MultipartBoundaryEnd 8753951 +MimeEntityBegin 8753951 +MimeEntityHeadersEnd 8754050 +MimeContentBegin 8754050 +MimeContentEnd 8820331 +MimeEntityEnd 8820332 +MultipartBoundaryBegin 8820332 +MultipartBoundaryEnd 8820374 +MimeEntityBegin 8820374 +MimeEntityHeadersEnd 8820462 +MimeContentBegin 8820462 +MimeContentEnd 8820462 +MimeEntityEnd 8820463 +MultipartEndBoundaryBegin 8820463 +MultipartEndBoundaryEnd 8820506 +MultipartEpilogueBegin 8820506 +MultipartEpilogueEnd 8820507 +MimeEntityEnd 8820508 +MultipartEndBoundaryBegin 8820508 +MultipartEndBoundaryEnd 8820549 +MultipartEpilogueBegin 8820549 +MultipartEpilogueEnd 8820549 +MimeEntityEnd 8820550 +MimeMessageEnd 8820550 +MboxMarkerBegin 8820550 +MboxMarkerEnd 8820557 +MimeMessageBegin 8820558 +MimeMessageHeadersEnd 8821395 +MimeEntityBegin 8820558 +MimeEntityHeadersEnd 8821395 +MimeContentBegin 8821395 +MimeContentEnd 8823128 +MimeEntityEnd 8823129 +MimeMessageEnd 8823129 +MboxMarkerBegin 8823129 +MboxMarkerEnd 8823136 +MimeMessageBegin 8823137 +MimeMessageHeadersEnd 8823767 +MimeEntityBegin 8823137 +MimeEntityHeadersEnd 8823767 +MimeContentBegin 8823767 +MimeMessageBegin 8823767 +MimeMessageHeadersEnd 8824250 +MimeEntityBegin 8823767 +MimeEntityHeadersEnd 8824250 +MimeContentBegin 8824250 +MimeContentEnd 8825125 +MimeEntityEnd 8825126 +MimeMessageEnd 8825126 +MimeContentEnd 8825126 +MimeEntityEnd 8825126 +MimeMessageEnd 8825126 +MboxMarkerBegin 8825126 +MboxMarkerEnd 8825133 +MimeMessageBegin 8825134 +MimeMessageHeadersEnd 8825579 +MimeEntityBegin 8825134 +MimeEntityHeadersEnd 8825579 +MimeContentBegin 8825579 +MultipartPreambleBegin 8825579 +MultipartPreambleEnd 8825579 +MultipartBoundaryBegin 8825579 +MultipartBoundaryEnd 8825588 +MimeEntityBegin 8825588 +MimeEntityHeadersEnd 8825589 +MimeContentBegin 8825589 +MimeContentEnd 8825629 +MimeEntityEnd 8825630 +MultipartBoundaryBegin 8825630 +MultipartBoundaryEnd 8825639 +MimeEntityBegin 8825639 +MimeEntityHeadersEnd 8825700 +MimeContentBegin 8825700 +MimeContentEnd 8916949 +MimeEntityEnd 8916950 +MultipartEndBoundaryBegin 8916950 +MultipartEndBoundaryEnd 8916960 +MultipartEpilogueBegin 8916960 +MultipartEpilogueEnd 8916963 +MimeEntityEnd 8916964 +MimeMessageEnd 8916964 +MboxMarkerBegin 8916964 +MboxMarkerEnd 8916971 +MimeMessageBegin 8916972 +MimeMessageHeadersEnd 8917462 +MimeEntityBegin 8916972 +MimeEntityHeadersEnd 8917462 +MimeContentBegin 8917462 +MimeContentEnd 8918604 +MimeEntityEnd 8918605 +MimeMessageEnd 8918605 +MboxMarkerBegin 8918605 +MboxMarkerEnd 8918612 +MimeMessageBegin 8918613 +MimeMessageHeadersEnd 8919753 +MimeEntityBegin 8918613 +MimeEntityHeadersEnd 8919753 +MimeContentBegin 8919753 +MultipartPreambleBegin 8919753 +MultipartPreambleEnd 8919753 +MultipartBoundaryBegin 8919753 +MultipartBoundaryEnd 8919758 +MimeEntityBegin 8919758 +MimeEntityHeadersEnd 8919759 +MimeContentBegin 8919759 +MimeContentEnd 8920299 +MimeEntityEnd 8920300 +MultipartBoundaryBegin 8920300 +MultipartBoundaryEnd 8920305 +MimeEntityBegin 8920305 +MimeEntityHeadersEnd 8920421 +MimeContentBegin 8920421 +MimeContentEnd 8978062 +MimeEntityEnd 8978063 +MultipartBoundaryBegin 8978063 +MultipartBoundaryEnd 8978068 +MimeEntityBegin 8978068 +MimeEntityHeadersEnd 8978069 +MimeContentBegin 8978069 +MimeContentEnd 8981852 +MimeEntityEnd 8981853 +MultipartBoundaryBegin 8981853 +MultipartBoundaryEnd 8981858 +MimeEntityBegin 8981858 +MimeEntityHeadersEnd 8982012 +MimeContentBegin 8982012 +MimeContentEnd 9011647 +MimeEntityEnd 9011648 +MultipartBoundaryBegin 9011648 +MultipartBoundaryEnd 9011653 +MimeEntityBegin 9011653 +MimeEntityHeadersEnd 9011759 +MimeContentBegin 9011759 +MimeContentEnd 9012475 +MimeEntityEnd 9012476 +MultipartBoundaryBegin 9012476 +MultipartBoundaryEnd 9012481 +MimeEntityBegin 9012481 +MimeEntityHeadersEnd 9012598 +MimeContentBegin 9012598 +MimeContentEnd 9013862 +MimeEntityEnd 9013863 +MultipartEndBoundaryBegin 9013863 +MultipartEndBoundaryEnd 9013869 +MultipartEpilogueBegin 9013869 +MultipartEpilogueEnd 9013870 +MimeEntityEnd 9013871 +MimeMessageEnd 9013871 +MboxMarkerBegin 9013871 +MboxMarkerEnd 9013902 +MimeMessageBegin 9013903 +MimeMessageHeadersEnd 9015056 +MimeEntityBegin 9013903 +MimeEntityHeadersEnd 9015056 +MimeContentBegin 9015056 +MultipartPreambleBegin 9015056 +MultipartPreambleEnd 9015056 +MultipartBoundaryBegin 9015056 +MultipartBoundaryEnd 9015073 +MimeEntityBegin 9015073 +MimeEntityHeadersEnd 9015074 +MimeContentBegin 9015074 +MimeContentEnd 9015975 +MimeEntityEnd 9015976 +MultipartBoundaryBegin 9015976 +MultipartBoundaryEnd 9015993 +MimeEntityBegin 9015993 +MimeEntityHeadersEnd 9016072 +MimeContentBegin 9016072 +MimeContentEnd 9016820 +MimeEntityEnd 9016821 +MultipartEndBoundaryBegin 9016821 +MultipartEndBoundaryEnd 9016839 +MultipartEpilogueBegin 9016839 +MultipartEpilogueEnd 9016840 +MimeEntityEnd 9016841 +MimeMessageEnd 9016841 +MboxMarkerBegin 9016841 +MboxMarkerEnd 9016872 +MimeMessageBegin 9016873 +MimeMessageHeadersEnd 9018015 +MimeEntityBegin 9016873 +MimeEntityHeadersEnd 9018015 +MimeContentBegin 9018015 +MultipartPreambleBegin 9018015 +MultipartPreambleEnd 9018188 +MultipartBoundaryBegin 9018188 +MultipartBoundaryEnd 9018195 +MimeEntityBegin 9018195 +MimeEntityHeadersEnd 9018273 +MimeContentBegin 9018273 +MimeContentEnd 9019014 +MimeEntityEnd 9019015 +MultipartBoundaryBegin 9019015 +MultipartBoundaryEnd 9019022 +MimeEntityBegin 9019022 +MimeEntityHeadersEnd 9019200 +MimeContentBegin 9019200 +MimeContentEnd 9021415 +MimeEntityEnd 9021416 +MultipartEndBoundaryBegin 9021416 +MultipartEndBoundaryEnd 9021424 +MultipartEpilogueBegin 9021424 +MultipartEpilogueEnd 9021424 +MimeEntityEnd 9021425 +MimeMessageEnd 9021425 +MboxMarkerBegin 9021425 +MboxMarkerEnd 9021456 +MimeMessageBegin 9021457 +MimeMessageHeadersEnd 9022594 +MimeEntityBegin 9021457 +MimeEntityHeadersEnd 9022594 +MimeContentBegin 9022594 +MultipartPreambleBegin 9022594 +MultipartPreambleEnd 9022767 +MultipartBoundaryBegin 9022767 +MultipartBoundaryEnd 9022788 +MimeEntityBegin 9022788 +MimeEntityHeadersEnd 9022866 +MimeContentBegin 9022866 +MimeContentEnd 9025678 +MimeEntityEnd 9025679 +MultipartBoundaryBegin 9025679 +MultipartBoundaryEnd 9025700 +MimeEntityBegin 9025700 +MimeEntityHeadersEnd 9025878 +MimeContentBegin 9025878 +MimeContentEnd 9028425 +MimeEntityEnd 9028426 +MultipartEndBoundaryBegin 9028426 +MultipartEndBoundaryEnd 9028448 +MultipartEpilogueBegin 9028448 +MultipartEpilogueEnd 9028448 +MimeEntityEnd 9028449 +MimeMessageEnd 9028449 +MboxMarkerBegin 9028449 +MboxMarkerEnd 9028456 +MimeMessageBegin 9028457 +MimeMessageHeadersEnd 9028665 +MimeEntityBegin 9028457 +MimeEntityHeadersEnd 9028665 +MimeContentBegin 9028665 +MimeContentEnd 9032858 +MimeEntityEnd 9032859 +MimeMessageEnd 9032859 +MboxMarkerBegin 9032859 +MboxMarkerEnd 9032890 +MimeMessageBegin 9032891 +MimeMessageHeadersEnd 9033791 +MimeEntityBegin 9032891 +MimeEntityHeadersEnd 9033791 +MimeContentBegin 9033791 +MultipartPreambleBegin 9033791 +MultipartPreambleEnd 9033837 +MultipartBoundaryBegin 9033837 +MultipartBoundaryEnd 9033864 +MimeEntityBegin 9033864 +MimeEntityHeadersEnd 9033998 +MimeContentBegin 9033998 +MimeContentEnd 9044720 +MimeEntityEnd 9044721 +MultipartBoundaryBegin 9044721 +MultipartBoundaryEnd 9044748 +MimeEntityBegin 9044748 +MimeEntityHeadersEnd 9044899 +MimeContentBegin 9044899 +MimeContentEnd 9049510 +MimeEntityEnd 9049511 +MultipartEndBoundaryBegin 9049511 +MultipartEndBoundaryEnd 9049539 +MultipartEpilogueBegin 9049539 +MultipartEpilogueEnd 9049540 +MimeEntityEnd 9049541 +MimeMessageEnd 9049541 +MboxMarkerBegin 9049541 +MboxMarkerEnd 9049572 +MimeMessageBegin 9049573 +MimeMessageHeadersEnd 9050380 +MimeEntityBegin 9049573 +MimeEntityHeadersEnd 9050380 +MimeContentBegin 9050380 +MimeContentEnd 9067141 +MimeEntityEnd 9067142 +MimeMessageEnd 9067142 +MboxMarkerBegin 9067142 +MboxMarkerEnd 9067173 +MimeMessageBegin 9067174 +MimeMessageHeadersEnd 9067986 +MimeEntityBegin 9067174 +MimeEntityHeadersEnd 9067986 +MimeContentBegin 9067986 +MimeContentEnd 9092950 +MimeEntityEnd 9092951 +MimeMessageEnd 9092951 +MboxMarkerBegin 9092951 +MboxMarkerEnd 9092982 +MimeMessageBegin 9092983 +MimeMessageHeadersEnd 9093795 +MimeEntityBegin 9092983 +MimeEntityHeadersEnd 9093795 +MimeContentBegin 9093795 +MimeContentEnd 9129926 +MimeEntityEnd 9129927 +MimeMessageEnd 9129927 +MboxMarkerBegin 9129927 +MboxMarkerEnd 9129958 +MimeMessageBegin 9129959 +MimeMessageHeadersEnd 9130774 +MimeEntityBegin 9129959 +MimeEntityHeadersEnd 9130774 +MimeContentBegin 9130774 +MimeContentEnd 9182075 +MimeEntityEnd 9182076 +MimeMessageEnd 9182076 +MboxMarkerBegin 9182076 +MboxMarkerEnd 9182107 +MimeMessageBegin 9182108 +MimeMessageHeadersEnd 9183499 +MimeEntityBegin 9182108 +MimeEntityHeadersEnd 9183499 +MimeContentBegin 9183499 +MimeContentEnd 9184930 +MimeEntityEnd 9184931 +MimeMessageEnd 9184931 +MboxMarkerBegin 9184931 +MboxMarkerEnd 9184962 +MimeMessageBegin 9184963 +MimeMessageHeadersEnd 9186316 +MimeEntityBegin 9184963 +MimeEntityHeadersEnd 9186316 +MimeContentBegin 9186316 +MultipartPreambleBegin 9186316 +MultipartPreambleEnd 9186317 +MultipartBoundaryBegin 9186317 +MultipartBoundaryEnd 9186361 +MimeEntityBegin 9186361 +MimeEntityHeadersEnd 9186425 +MimeContentBegin 9186425 +MimeContentEnd 9186532 +MimeEntityEnd 9186533 +MultipartBoundaryBegin 9186533 +MultipartBoundaryEnd 9186577 +MimeEntityBegin 9186577 +MimeEntityHeadersEnd 9186728 +MimeContentBegin 9186728 +MimeContentEnd 9190661 +MimeEntityEnd 9190662 +MultipartEndBoundaryBegin 9190662 +MultipartEndBoundaryEnd 9190707 +MultipartEpilogueBegin 9190707 +MultipartEpilogueEnd 9190708 +MimeEntityEnd 9190709 +MimeMessageEnd 9190709 +MboxMarkerBegin 9190709 +MboxMarkerEnd 9190740 +MimeMessageBegin 9190741 +MimeMessageHeadersEnd 9191951 +MimeEntityBegin 9190741 +MimeEntityHeadersEnd 9191951 +MimeContentBegin 9191951 +MimeContentEnd 9195446 +MimeEntityEnd 9195447 +MimeMessageEnd 9195447 +MboxMarkerBegin 9195447 +MboxMarkerEnd 9195478 +MimeMessageBegin 9195479 +MimeMessageHeadersEnd 9196556 +MimeEntityBegin 9195479 +MimeEntityHeadersEnd 9196556 +MimeContentBegin 9196556 +MimeContentEnd 9197217 +MimeEntityEnd 9197218 +MimeMessageEnd 9197218 +MboxMarkerBegin 9197218 +MboxMarkerEnd 9197225 +MimeMessageBegin 9197226 +MimeMessageHeadersEnd 9197618 +MimeEntityBegin 9197226 +MimeEntityHeadersEnd 9197618 +MimeContentBegin 9197618 +MimeContentEnd 9205238 +MimeEntityEnd 9205239 +MimeMessageEnd 9205239 +MboxMarkerBegin 9205239 +MboxMarkerEnd 9205270 +MimeMessageBegin 9205271 +MimeMessageHeadersEnd 9206054 +MimeEntityBegin 9205271 +MimeEntityHeadersEnd 9206054 +MimeContentBegin 9206054 +MimeMessageBegin 9206054 +MimeMessageHeadersEnd 9207434 +MimeEntityBegin 9206054 +MimeEntityHeadersEnd 9207434 +MimeContentBegin 9207434 +MimeContentEnd 9208866 +MimeEntityEnd 9208867 +MimeMessageEnd 9208867 +MimeContentEnd 9208867 +MimeEntityEnd 9208867 +MimeMessageEnd 9208867 +MboxMarkerBegin 9208867 +MboxMarkerEnd 9208898 +MimeMessageBegin 9208899 +MimeMessageHeadersEnd 9209609 +MimeEntityBegin 9208899 +MimeEntityHeadersEnd 9209609 +MimeContentBegin 9209609 +MultipartPreambleBegin 9209609 +MultipartPreambleEnd 9209655 +MultipartBoundaryBegin 9209655 +MultipartBoundaryEnd 9209682 +MimeEntityBegin 9209682 +MimeEntityHeadersEnd 9209758 +MimeContentBegin 9209758 +MimeContentEnd 9209773 +MimeEntityEnd 9209774 +MultipartBoundaryBegin 9209774 +MultipartBoundaryEnd 9209801 +MimeEntityBegin 9209801 +MimeEntityHeadersEnd 9209955 +MimeContentBegin 9209955 +MimeMessageBegin 9209955 +MimeMessageHeadersEnd 9211335 +MimeEntityBegin 9209955 +MimeEntityHeadersEnd 9211335 +MimeContentBegin 9211335 +MimeContentEnd 9212767 +MimeEntityEnd 9212768 +MimeMessageEnd 9212768 +MimeContentEnd 9212768 +MimeEntityEnd 9212768 +MultipartEndBoundaryBegin 9212768 +MultipartEndBoundaryEnd 9212796 +MultipartEpilogueBegin 9212796 +MultipartEpilogueEnd 9212797 +MimeEntityEnd 9212798 +MimeMessageEnd 9212798 +MboxMarkerBegin 9212798 +MboxMarkerEnd 9212829 +MimeMessageBegin 9212830 +MimeMessageHeadersEnd 9213495 +MimeEntityBegin 9212830 +MimeEntityHeadersEnd 9213495 +MimeContentBegin 9213495 +MultipartPreambleBegin 9213495 +MultipartPreambleEnd 9213555 +MultipartBoundaryBegin 9213555 +MultipartBoundaryEnd 9213596 +MimeEntityBegin 9213596 +MimeEntityHeadersEnd 9213672 +MimeContentBegin 9213672 +MimeContentEnd 9213713 +MimeEntityEnd 9213714 +MultipartBoundaryBegin 9213714 +MultipartBoundaryEnd 9213755 +MimeEntityBegin 9213755 +MimeEntityHeadersEnd 9213906 +MimeContentBegin 9213906 +MimeContentEnd 9219462 +MimeEntityEnd 9219463 +MultipartEndBoundaryBegin 9219463 +MultipartEndBoundaryEnd 9219505 +MultipartEpilogueBegin 9219505 +MultipartEpilogueEnd 9219506 +MimeEntityEnd 9219507 +MimeMessageEnd 9219507 +MboxMarkerBegin 9219507 +MboxMarkerEnd 9219538 +MimeMessageBegin 9219539 +MimeMessageHeadersEnd 9220601 +MimeEntityBegin 9219539 +MimeEntityHeadersEnd 9220601 +MimeContentBegin 9220601 +MimeContentEnd 9230837 +MimeEntityEnd 9230838 +MimeMessageEnd 9230838 +MboxMarkerBegin 9230838 +MboxMarkerEnd 9230869 +MimeMessageBegin 9230870 +MimeMessageHeadersEnd 9232246 +MimeEntityBegin 9230870 +MimeEntityHeadersEnd 9232246 +MimeContentBegin 9232246 +MultipartPreambleBegin 9232246 +MultipartPreambleEnd 9232306 +MultipartBoundaryBegin 9232306 +MultipartBoundaryEnd 9232347 +MimeEntityBegin 9232347 +MimeEntityHeadersEnd 9232423 +MimeContentBegin 9232423 +MimeContentEnd 9233034 +MimeEntityEnd 9233035 +MultipartBoundaryBegin 9233035 +MultipartBoundaryEnd 9233076 +MimeEntityBegin 9233076 +MimeEntityHeadersEnd 9233227 +MimeContentBegin 9233227 +MimeContentEnd 9235015 +MimeEntityEnd 9235016 +MultipartEndBoundaryBegin 9235016 +MultipartEndBoundaryEnd 9235058 +MultipartEpilogueBegin 9235058 +MultipartEpilogueEnd 9235059 +MimeEntityEnd 9235060 +MimeMessageEnd 9235060 +MboxMarkerBegin 9235060 +MboxMarkerEnd 9235091 +MimeMessageBegin 9235092 +MimeMessageHeadersEnd 9235640 +MimeEntityBegin 9235092 +MimeEntityHeadersEnd 9235640 +MimeContentBegin 9235640 +MimeContentEnd 9236163 +MimeEntityEnd 9236164 +MimeMessageEnd 9236164 +MboxMarkerBegin 9236164 +MboxMarkerEnd 9236171 +MimeMessageBegin 9236172 +MimeMessageHeadersEnd 9237488 +MimeEntityBegin 9236172 +MimeEntityHeadersEnd 9237488 +MimeContentBegin 9237488 +MultipartPreambleBegin 9237488 +MultipartPreambleEnd 9237704 +MultipartBoundaryBegin 9237704 +MultipartBoundaryEnd 9237745 +MimeEntityBegin 9237745 +MimeEntityHeadersEnd 9237789 +MimeContentBegin 9237789 +MimeContentEnd 9238377 +MimeEntityEnd 9238378 +MultipartEndBoundaryBegin 9238378 +MultipartEndBoundaryEnd 9238420 +MultipartEpilogueBegin 9238420 +MultipartEpilogueEnd 9238420 +MimeEntityEnd 9238421 +MimeMessageEnd 9238421 +MboxMarkerBegin 9238421 +MboxMarkerEnd 9238428 +MimeMessageBegin 9238429 +MimeMessageHeadersEnd 9239776 +MimeEntityBegin 9238429 +MimeEntityHeadersEnd 9239776 +MimeContentBegin 9239776 +MultipartPreambleBegin 9239776 +MultipartPreambleEnd 9239992 +MultipartBoundaryBegin 9239992 +MultipartBoundaryEnd 9240033 +MimeEntityBegin 9240033 +MimeEntityHeadersEnd 9240077 +MimeContentBegin 9240077 +MimeContentEnd 9240178 +MimeEntityEnd 9240179 +MultipartBoundaryBegin 9240179 +MultipartBoundaryEnd 9240220 +MimeEntityBegin 9240220 +MimeEntityHeadersEnd 9240383 +MimeContentBegin 9240383 +MultipartPreambleBegin 9240383 +MultipartPreambleEnd 9240599 +MultipartBoundaryBegin 9240599 +MultipartBoundaryEnd 9240638 +MimeEntityBegin 9240638 +MimeEntityHeadersEnd 9240745 +MimeContentBegin 9240745 +MimeContentEnd 9240836 +MimeEntityEnd 9240837 +MultipartBoundaryBegin 9240837 +MultipartBoundaryEnd 9240876 +MimeEntityBegin 9240876 +MimeEntityHeadersEnd 9240969 +MimeContentBegin 9240969 +MimeMessageBegin 9240969 +MimeMessageHeadersEnd 9242136 +MimeEntityBegin 9240969 +MimeEntityHeadersEnd 9242136 +MimeContentBegin 9242136 +MimeContentEnd 9242341 +MimeEntityEnd 9242342 +MimeMessageEnd 9242342 +MimeContentEnd 9242342 +MimeEntityEnd 9242342 +MultipartBoundaryBegin 9242342 +MultipartBoundaryEnd 9242381 +MimeEntityBegin 9242381 +MimeEntityHeadersEnd 9242547 +MimeContentBegin 9242547 +MimeContentEnd 9243026 +MimeEntityEnd 9243027 +MultipartEndBoundaryBegin 9243027 +MultipartEndBoundaryEnd 9243067 +MultipartEpilogueBegin 9243067 +MultipartEpilogueEnd 9243067 +MimeEntityEnd 9243068 +MultipartBoundaryBegin 9243068 +MultipartBoundaryEnd 9243109 +MimeEntityBegin 9243109 +MimeEntityHeadersEnd 9243321 +MimeContentBegin 9243321 +MimeContentEnd 9248544 +MimeEntityEnd 9248545 +MultipartEndBoundaryBegin 9248545 +MultipartEndBoundaryEnd 9248587 +MultipartEpilogueBegin 9248587 +MultipartEpilogueEnd 9248589 +MimeEntityEnd 9248590 +MimeMessageEnd 9248590 +MboxMarkerBegin 9248590 +MboxMarkerEnd 9248621 +MimeMessageBegin 9248622 +MimeMessageHeadersEnd 9249837 +MimeEntityBegin 9248622 +MimeEntityHeadersEnd 9249837 +MimeContentBegin 9249837 +MimeContentEnd 9252719 +MimeEntityEnd 9252720 +MimeMessageEnd 9252720 +MboxMarkerBegin 9252720 +MboxMarkerEnd 9252751 +MimeMessageBegin 9252752 +MimeMessageHeadersEnd 9253910 +MimeEntityBegin 9252752 +MimeEntityHeadersEnd 9253910 +MimeContentBegin 9253910 +MimeContentEnd 9256032 +MimeEntityEnd 9256033 +MimeMessageEnd 9256033 +MboxMarkerBegin 9256033 +MboxMarkerEnd 9256064 +MimeMessageBegin 9256065 +MimeMessageHeadersEnd 9257143 +MimeEntityBegin 9256065 +MimeEntityHeadersEnd 9257143 +MimeContentBegin 9257143 +MultipartPreambleBegin 9257143 +MultipartPreambleEnd 9257144 +MultipartBoundaryBegin 9257144 +MultipartBoundaryEnd 9257176 +MimeEntityBegin 9257176 +MimeEntityHeadersEnd 9257240 +MimeContentBegin 9257240 +MimeContentEnd 9257240 +MimeEntityEnd 9257241 +MultipartBoundaryBegin 9257241 +MultipartBoundaryEnd 9257273 +MimeEntityBegin 9257273 +MimeEntityHeadersEnd 9257352 +MimeContentBegin 9257352 +MimeContentEnd 9260065 +MimeEntityEnd 9260066 +MultipartEndBoundaryBegin 9260066 +MultipartEndBoundaryEnd 9260099 +MultipartEpilogueBegin 9260099 +MultipartEpilogueEnd 9260100 +MimeEntityEnd 9260101 +MimeMessageEnd 9260101 +MboxMarkerBegin 9260101 +MboxMarkerEnd 9260132 +MimeMessageBegin 9260133 +MimeMessageHeadersEnd 9261170 +MimeEntityBegin 9260133 +MimeEntityHeadersEnd 9261170 +MimeContentBegin 9261170 +MultipartPreambleBegin 9261170 +MultipartPreambleEnd 9261171 +MultipartBoundaryBegin 9261171 +MultipartBoundaryEnd 9261211 +MimeEntityBegin 9261211 +MimeEntityHeadersEnd 9261289 +MimeContentBegin 9261289 +MimeContentEnd 9261742 +MimeEntityEnd 9261743 +MultipartBoundaryBegin 9261743 +MultipartBoundaryEnd 9261783 +MimeEntityBegin 9261783 +MimeEntityHeadersEnd 9261858 +MimeContentBegin 9261858 +MimeContentEnd 9262669 +MimeEntityEnd 9262670 +MultipartBoundaryBegin 9262670 +MultipartBoundaryEnd 9262710 +MimeEntityBegin 9262710 +MimeEntityHeadersEnd 9262807 +MimeContentBegin 9262807 +MimeContentEnd 9264007 +MimeEntityEnd 9264008 +MultipartEndBoundaryBegin 9264008 +MultipartEndBoundaryEnd 9264049 +MultipartEpilogueBegin 9264049 +MultipartEpilogueEnd 9264050 +MimeEntityEnd 9264051 +MimeMessageEnd 9264051 +MboxMarkerBegin 9264051 +MboxMarkerEnd 9264082 +MimeMessageBegin 9264083 +MimeMessageHeadersEnd 9265158 +MimeEntityBegin 9264083 +MimeEntityHeadersEnd 9265158 +MimeContentBegin 9265158 +MultipartPreambleBegin 9265158 +MultipartPreambleEnd 9265159 +MultipartBoundaryBegin 9265159 +MultipartBoundaryEnd 9265201 +MimeEntityBegin 9265201 +MimeEntityHeadersEnd 9265271 +MimeContentBegin 9265271 +MimeContentEnd 9265423 +MimeEntityEnd 9265424 +MultipartBoundaryBegin 9265424 +MultipartBoundaryEnd 9265466 +MimeEntityBegin 9265466 +MimeEntityHeadersEnd 9265545 +MimeContentBegin 9265545 +MimeContentEnd 9269641 +MimeEntityEnd 9269642 +MultipartEndBoundaryBegin 9269642 +MultipartEndBoundaryEnd 9269685 +MultipartEpilogueBegin 9269685 +MultipartEpilogueEnd 9269686 +MimeEntityEnd 9269687 +MimeMessageEnd 9269687 +MboxMarkerBegin 9269687 +MboxMarkerEnd 9269694 +MimeMessageBegin 9269695 +MimeMessageHeadersEnd 9270246 +MimeEntityBegin 9269695 +MimeEntityHeadersEnd 9270246 +MimeContentBegin 9270246 +MultipartPreambleBegin 9270246 +MultipartPreambleEnd 9270247 +MultipartBoundaryBegin 9270247 +MultipartBoundaryEnd 9270290 +MimeEntityBegin 9270290 +MimeEntityHeadersEnd 9270354 +MimeContentBegin 9270354 +MimeContentEnd 9270509 +MimeEntityEnd 9270510 +MultipartBoundaryBegin 9270510 +MultipartBoundaryEnd 9270553 +MimeEntityBegin 9270553 +MimeEntityHeadersEnd 9270704 +MimeContentBegin 9270704 +MimeContentEnd 9274621 +MimeEntityEnd 9274622 +MultipartEndBoundaryBegin 9274622 +MultipartEndBoundaryEnd 9274666 +MultipartEpilogueBegin 9274666 +MultipartEpilogueEnd 9274666 +MimeEntityEnd 9274667 +MimeMessageEnd 9274667 +MboxMarkerBegin 9274667 +MboxMarkerEnd 9274698 +MimeMessageBegin 9274699 +MimeMessageHeadersEnd 9275863 +MimeEntityBegin 9274699 +MimeEntityHeadersEnd 9275863 +MimeContentBegin 9275863 +MultipartPreambleBegin 9275863 +MultipartPreambleEnd 9276000 +MultipartBoundaryBegin 9276000 +MultipartBoundaryEnd 9276040 +MimeEntityBegin 9276040 +MimeEntityHeadersEnd 9276118 +MimeContentBegin 9276118 +MimeContentEnd 9276190 +MimeEntityEnd 9276191 +MultipartBoundaryBegin 9276191 +MultipartBoundaryEnd 9276231 +MimeEntityBegin 9276231 +MimeEntityHeadersEnd 9276326 +MimeContentBegin 9276326 +MimeContentEnd 9279885 +MimeEntityEnd 9279886 +MultipartEndBoundaryBegin 9279886 +MultipartEndBoundaryEnd 9279927 +MultipartEpilogueBegin 9279927 +MultipartEpilogueEnd 9279928 +MimeEntityEnd 9279929 +MimeMessageEnd 9279929 +MboxMarkerBegin 9279929 +MboxMarkerEnd 9279960 +MimeMessageBegin 9279961 +MimeMessageHeadersEnd 9281063 +MimeEntityBegin 9279961 +MimeEntityHeadersEnd 9281063 +MimeContentBegin 9281063 +MultipartPreambleBegin 9281063 +MultipartPreambleEnd 9281064 +MultipartBoundaryBegin 9281064 +MultipartBoundaryEnd 9281097 +MimeEntityBegin 9281097 +MimeEntityHeadersEnd 9281175 +MimeContentBegin 9281175 +MimeContentEnd 9281249 +MimeEntityEnd 9281250 +MultipartBoundaryBegin 9281250 +MultipartBoundaryEnd 9281283 +MimeEntityBegin 9281283 +MimeEntityHeadersEnd 9281362 +MimeContentBegin 9281362 +MimeContentEnd 9285079 +MimeEntityEnd 9285080 +MultipartEndBoundaryBegin 9285080 +MultipartEndBoundaryEnd 9285114 +MultipartEpilogueBegin 9285114 +MultipartEpilogueEnd 9285114 +MimeEntityEnd 9285115 +MimeMessageEnd 9285115 +MboxMarkerBegin 9285115 +MboxMarkerEnd 9285146 +MimeMessageBegin 9285147 +MimeMessageHeadersEnd 9286275 +MimeEntityBegin 9285147 +MimeEntityHeadersEnd 9286275 +MimeContentBegin 9286275 +MultipartPreambleBegin 9286275 +MultipartPreambleEnd 9286388 +MultipartBoundaryBegin 9286388 +MultipartBoundaryEnd 9286412 +MimeEntityBegin 9286412 +MimeEntityHeadersEnd 9286451 +MimeContentBegin 9286451 +MimeContentEnd 9286639 +MimeEntityEnd 9286640 +MultipartBoundaryBegin 9286640 +MultipartBoundaryEnd 9286664 +MimeEntityBegin 9286664 +MimeEntityHeadersEnd 9286694 +MimeContentBegin 9286694 +MimeMessageBegin 9286694 +MimeMessageHeadersEnd 9287500 +MimeEntityBegin 9286694 +MimeEntityHeadersEnd 9287500 +MimeContentBegin 9287500 +MimeContentEnd 9287511 +MimeEntityEnd 9287512 +MimeMessageEnd 9287512 +MimeContentEnd 9287512 +MimeEntityEnd 9287512 +MultipartEndBoundaryBegin 9287512 +MultipartEndBoundaryEnd 9287537 +MultipartEpilogueBegin 9287537 +MultipartEpilogueEnd 9287538 +MimeEntityEnd 9287539 +MimeMessageEnd 9287539 +MboxMarkerBegin 9287539 +MboxMarkerEnd 9287584 +MimeMessageBegin 9287585 +MimeMessageHeadersEnd 9287750 +MimeEntityBegin 9287585 +MimeEntityHeadersEnd 9287750 +MimeContentBegin 9287750 +MimeContentEnd 9322244 +MimeEntityEnd 9322245 +MimeMessageEnd 9322245 +MboxMarkerBegin 9322245 +MboxMarkerEnd 9322290 +MimeMessageBegin 9322291 +MimeMessageHeadersEnd 9322449 +MimeEntityBegin 9322291 +MimeEntityHeadersEnd 9322449 +MimeContentBegin 9322449 +MimeContentEnd 9356943 +MimeEntityEnd 9356944 +MimeMessageEnd 9356944 +MboxMarkerBegin 9356944 +MboxMarkerEnd 9356951 +MimeMessageBegin 9356952 +MimeMessageHeadersEnd 9357549 +MimeEntityBegin 9356952 +MimeEntityHeadersEnd 9357549 +MimeContentBegin 9357549 +MimeContentEnd 9358949 +MimeEntityEnd 9358950 +MimeMessageEnd 9358950 +MboxMarkerBegin 9358950 +MboxMarkerEnd 9358957 +MimeMessageBegin 9358958 +MimeMessageHeadersEnd 9359858 +MimeEntityBegin 9358958 +MimeEntityHeadersEnd 9359858 +MimeContentBegin 9359858 +MultipartPreambleBegin 9359858 +MultipartPreambleEnd 9359858 +MultipartBoundaryBegin 9359858 +MultipartBoundaryEnd 9359897 +MimeEntityBegin 9359897 +MimeEntityHeadersEnd 9359923 +MimeContentBegin 9359923 +MimeContentEnd 9360268 +MimeEntityEnd 9360269 +MultipartBoundaryBegin 9360269 +MultipartBoundaryEnd 9360308 +MimeEntityBegin 9360308 +MimeEntityHeadersEnd 9360401 +MimeContentBegin 9360401 +MimeContentEnd 9601970 +MimeEntityEnd 9601971 +MultipartEndBoundaryBegin 9601971 +MultipartEndBoundaryEnd 9602011 +MultipartEpilogueBegin 9602011 +MultipartEpilogueEnd 9602012 +MimeEntityEnd 9602013 +MimeMessageEnd 9602013 +MboxMarkerBegin 9602013 +MboxMarkerEnd 9602020 +MimeMessageBegin 9602021 +MimeMessageHeadersEnd 9602615 +MimeEntityBegin 9602021 +MimeEntityHeadersEnd 9602615 +MimeContentBegin 9602615 +MultipartPreambleBegin 9602615 +MultipartPreambleEnd 9602649 +MultipartBoundaryBegin 9602649 +MultipartBoundaryEnd 9602676 +MimeEntityBegin 9602676 +MimeEntityHeadersEnd 9602835 +MimeContentBegin 9602835 +MimeContentEnd 9681124 +MimeEntityEnd 9681125 +MultipartEndBoundaryBegin 9681125 +MultipartEndBoundaryEnd 9681153 +MultipartEpilogueBegin 9681153 +MultipartEpilogueEnd 9681155 +MimeEntityEnd 9681156 +MimeMessageEnd 9681156 +MboxMarkerBegin 9681156 +MboxMarkerEnd 9681163 +MimeMessageBegin 9681164 +MimeMessageHeadersEnd 9681316 +MimeEntityBegin 9681164 +MimeEntityHeadersEnd 9681316 +MimeContentBegin 9681316 +MimeContentEnd 9684876 +MimeEntityEnd 9684877 +MimeMessageEnd 9684877 +MboxMarkerBegin 9684877 +MboxMarkerEnd 9684884 +MimeMessageBegin 9684885 +MimeMessageHeadersEnd 9685657 +MimeEntityBegin 9684885 +MimeEntityHeadersEnd 9685657 +MimeContentBegin 9685657 +MultipartPreambleBegin 9685657 +MultipartPreambleEnd 9685812 +MultipartBoundaryBegin 9685812 +MultipartBoundaryEnd 9685852 +MimeEntityBegin 9685852 +MimeEntityHeadersEnd 9685896 +MimeContentBegin 9685896 +MimeContentEnd 9686310 +MimeEntityEnd 9686311 +MultipartBoundaryBegin 9686311 +MultipartBoundaryEnd 9686351 +MimeEntityBegin 9686351 +MimeEntityHeadersEnd 9686436 +MimeContentBegin 9686436 +MultipartPreambleBegin 9686436 +MultipartPreambleEnd 9686436 +MultipartBoundaryBegin 9686436 +MultipartBoundaryEnd 9686478 +MimeEntityBegin 9686478 +MimeEntityHeadersEnd 9686569 +MimeContentBegin 9686569 +MimeContentEnd 9686640 +MimeEntityEnd 9686641 +MultipartBoundaryBegin 9686641 +MultipartBoundaryEnd 9686683 +MimeEntityBegin 9686683 +MimeEntityHeadersEnd 9686782 +MimeContentBegin 9686782 +MimeContentEnd 9697479 +MimeEntityEnd 9697480 +MultipartBoundaryBegin 9697480 +MultipartBoundaryEnd 9697522 +MimeEntityBegin 9697522 +MimeEntityHeadersEnd 9697613 +MimeContentBegin 9697613 +MimeContentEnd 9697677 +MimeEntityEnd 9697678 +MultipartBoundaryBegin 9697678 +MultipartBoundaryEnd 9697720 +MimeEntityBegin 9697720 +MimeEntityHeadersEnd 9697813 +MimeContentBegin 9697813 +MimeContentEnd 9703716 +MimeEntityEnd 9703717 +MultipartBoundaryBegin 9703717 +MultipartBoundaryEnd 9703759 +MimeEntityBegin 9703759 +MimeEntityHeadersEnd 9703850 +MimeContentBegin 9703850 +MimeContentEnd 9703883 +MimeEntityEnd 9703884 +MultipartBoundaryBegin 9703884 +MultipartBoundaryEnd 9703926 +MimeEntityBegin 9703926 +MimeEntityHeadersEnd 9704027 +MimeContentBegin 9704027 +MimeContentEnd 9715673 +MimeEntityEnd 9715674 +MultipartBoundaryBegin 9715674 +MultipartBoundaryEnd 9715716 +MimeEntityBegin 9715716 +MimeEntityHeadersEnd 9715807 +MimeContentBegin 9715807 +MimeContentEnd 9715838 +MimeEntityEnd 9715839 +MultipartEndBoundaryBegin 9715839 +MultipartEndBoundaryEnd 9715882 +MultipartEpilogueBegin 9715882 +MultipartEpilogueEnd 9715883 +MimeEntityEnd 9715884 +MultipartEndBoundaryBegin 9715884 +MultipartEndBoundaryEnd 9715925 +MultipartEpilogueBegin 9715925 +MultipartEpilogueEnd 9715925 +MimeEntityEnd 9715926 +MimeMessageEnd 9715926 +MboxMarkerBegin 9715926 +MboxMarkerEnd 9715933 +MimeMessageBegin 9715934 +MimeMessageHeadersEnd 9715990 +MimeEntityBegin 9715934 +MimeEntityHeadersEnd 9715990 +MimeContentBegin 9715990 +MimeContentEnd 9717198 +MimeEntityEnd 9717199 +MimeMessageEnd 9717199 +MboxMarkerBegin 9717199 +MboxMarkerEnd 9717230 +MimeMessageBegin 9717231 +MimeMessageHeadersEnd 9717382 +MimeEntityBegin 9717231 +MimeEntityHeadersEnd 9717382 +MimeContentBegin 9717382 +MimeContentEnd 9720490 +MimeEntityEnd 9720491 +MimeMessageEnd 9720491 +MboxMarkerBegin 9720491 +MboxMarkerEnd 9720522 +MimeMessageBegin 9720523 +MimeMessageHeadersEnd 9722388 +MimeEntityBegin 9720523 +MimeEntityHeadersEnd 9722388 +MimeContentBegin 9722388 +MultipartPreambleBegin 9722388 +MultipartPreambleEnd 9722388 +MultipartBoundaryBegin 9722388 +MultipartBoundaryEnd 9722432 +MimeEntityBegin 9722432 +MimeEntityHeadersEnd 9722510 +MimeContentBegin 9722510 +MimeContentEnd 9723373 +MimeEntityEnd 9723374 +MultipartBoundaryBegin 9723374 +MultipartBoundaryEnd 9723418 +MimeEntityBegin 9723418 +MimeEntityHeadersEnd 9723579 +MimeContentBegin 9723579 +MimeContentEnd 9727220 +MimeEntityEnd 9727221 +MultipartEndBoundaryBegin 9727221 +MultipartEndBoundaryEnd 9727266 +MultipartEpilogueBegin 9727266 +MultipartEpilogueEnd 9727267 +MimeEntityEnd 9727268 +MimeMessageEnd 9727268 +MboxMarkerBegin 9727268 +MboxMarkerEnd 9727275 +MimeMessageBegin 9727276 +MimeMessageHeadersEnd 9727830 +MimeEntityBegin 9727276 +MimeEntityHeadersEnd 9727830 +MimeContentBegin 9727830 +MultipartPreambleBegin 9727830 +MultipartPreambleEnd 9727831 +MultipartBoundaryBegin 9727831 +MultipartBoundaryEnd 9727847 +MimeEntityBegin 9727847 +MimeEntityHeadersEnd 9727874 +MimeContentBegin 9727874 +MimeContentEnd 9728837 +MimeEntityEnd 9728838 +MultipartBoundaryBegin 9728838 +MultipartBoundaryEnd 9728854 +MimeEntityBegin 9728854 +MimeEntityHeadersEnd 9728914 +MimeContentBegin 9728914 +MimeContentEnd 9844640 +MimeEntityEnd 9844641 +MultipartEndBoundaryBegin 9844641 +MultipartEndBoundaryEnd 9844658 +MultipartEpilogueBegin 9844658 +MultipartEpilogueEnd 9844660 +MimeEntityEnd 9844661 +MimeMessageEnd 9844661 +MboxMarkerBegin 9844661 +MboxMarkerEnd 9844668 +MimeMessageBegin 9844669 +MimeMessageHeadersEnd 9845465 +MimeEntityBegin 9844669 +MimeEntityHeadersEnd 9845465 +MimeContentBegin 9845465 +MultipartPreambleBegin 9845465 +MultipartPreambleEnd 9845620 +MultipartBoundaryBegin 9845620 +MultipartBoundaryEnd 9845660 +MimeEntityBegin 9845660 +MimeEntityHeadersEnd 9845704 +MimeContentBegin 9845704 +MimeContentEnd 9854667 +MimeEntityEnd 9854668 +MultipartBoundaryBegin 9854668 +MultipartBoundaryEnd 9854708 +MimeEntityBegin 9854708 +MimeEntityHeadersEnd 9854793 +MimeContentBegin 9854793 +MultipartPreambleBegin 9854793 +MultipartPreambleEnd 9854793 +MultipartBoundaryBegin 9854793 +MultipartBoundaryEnd 9854835 +MimeEntityBegin 9854835 +MimeEntityHeadersEnd 9854926 +MimeContentBegin 9854926 +MimeContentEnd 9857701 +MimeEntityEnd 9857702 +MultipartBoundaryBegin 9857702 +MultipartBoundaryEnd 9857744 +MimeEntityBegin 9857744 +MimeEntityHeadersEnd 9857940 +MimeContentBegin 9857940 +MimeMessageBegin 9857940 +MimeMessageHeadersEnd 9857967 +MimeEntityBegin 9857940 +MimeEntityHeadersEnd 9857967 +MimeContentBegin 9857967 +MimeContentEnd 9857969 +MimeEntityEnd 9857970 +MimeMessageEnd 9857970 +MimeContentEnd 9857970 +MimeEntityEnd 9857970 +MultipartBoundaryBegin 9857970 +MultipartBoundaryEnd 9858012 +MimeEntityBegin 9858012 +MimeEntityHeadersEnd 9858103 +MimeContentBegin 9858103 +MimeContentEnd 9859077 +MimeEntityEnd 9859078 +MultipartBoundaryBegin 9859078 +MultipartBoundaryEnd 9859120 +MimeEntityBegin 9859120 +MimeEntityHeadersEnd 9859236 +MimeContentBegin 9859236 +MimeContentEnd 9859595 +MimeEntityEnd 9859596 +MultipartBoundaryBegin 9859596 +MultipartBoundaryEnd 9859638 +MimeEntityBegin 9859638 +MimeEntityHeadersEnd 9859729 +MimeContentBegin 9859729 +MimeContentEnd 9859739 +MimeEntityEnd 9859740 +MultipartBoundaryBegin 9859740 +MultipartBoundaryEnd 9859782 +MimeEntityBegin 9859782 +MimeEntityHeadersEnd 9859967 +MimeContentBegin 9859967 +MimeMessageBegin 9859967 +MimeMessageHeadersEnd 9859994 +MimeEntityBegin 9859967 +MimeEntityHeadersEnd 9859994 +MimeContentBegin 9859994 +MimeContentEnd 9859995 +MimeEntityEnd 9859996 +MimeMessageEnd 9859996 +MimeContentEnd 9859996 +MimeEntityEnd 9859996 +MultipartBoundaryBegin 9859996 +MultipartBoundaryEnd 9860038 +MimeEntityBegin 9860038 +MimeEntityHeadersEnd 9860129 +MimeContentBegin 9860129 +MimeContentEnd 9860139 +MimeEntityEnd 9860140 +MultipartBoundaryBegin 9860140 +MultipartBoundaryEnd 9860182 +MimeEntityBegin 9860182 +MimeEntityHeadersEnd 9860288 +MimeContentBegin 9860288 +MimeContentEnd 9863271 +MimeEntityEnd 9863272 +MultipartBoundaryBegin 9863272 +MultipartBoundaryEnd 9863314 +MimeEntityBegin 9863314 +MimeEntityHeadersEnd 9863405 +MimeContentBegin 9863405 +MimeContentEnd 9869997 +MimeEntityEnd 9869998 +MultipartEndBoundaryBegin 9869998 +MultipartEndBoundaryEnd 9870041 +MultipartEpilogueBegin 9870041 +MultipartEpilogueEnd 9870042 +MimeEntityEnd 9870043 +MultipartEndBoundaryBegin 9870043 +MultipartEndBoundaryEnd 9870084 +MultipartEpilogueBegin 9870084 +MultipartEpilogueEnd 9870085 +MimeEntityEnd 9870086 +MimeMessageEnd 9870086 +MboxMarkerBegin 9870086 +MboxMarkerEnd 9870093 +MimeMessageBegin 9870094 +MimeMessageHeadersEnd 9871206 +MimeEntityBegin 9870094 +MimeEntityHeadersEnd 9871206 +MimeContentBegin 9871206 +MultipartPreambleBegin 9871206 +MultipartPreambleEnd 9871206 +MultipartBoundaryBegin 9871206 +MultipartBoundaryEnd 9871216 +MimeEntityBegin 9871216 +MimeEntityHeadersEnd 9871217 +MimeContentBegin 9871217 +MimeContentEnd 9871550 +MimeEntityEnd 9871551 +MultipartBoundaryBegin 9871551 +MultipartBoundaryEnd 9871561 +MimeEntityBegin 9871561 +MimeEntityHeadersEnd 9871620 +MimeContentBegin 9871620 +MimeContentEnd 9901599 +MimeEntityEnd 9901600 +MultipartBoundaryBegin 9901600 +MultipartBoundaryEnd 9901610 +MimeEntityBegin 9901610 +MimeEntityHeadersEnd 9901611 +MimeContentBegin 9901611 +MimeContentEnd 9901783 +MimeEntityEnd 9901784 +MultipartEndBoundaryBegin 9901784 +MultipartEndBoundaryEnd 9901795 +MultipartEpilogueBegin 9901795 +MultipartEpilogueEnd 9901796 +MimeEntityEnd 9901797 +MimeMessageEnd 9901797 +MboxMarkerBegin 9901797 +MboxMarkerEnd 9901804 +MimeMessageBegin 9901805 +MimeMessageHeadersEnd 9903514 +MimeEntityBegin 9901805 +MimeEntityHeadersEnd 9903514 +MimeContentBegin 9903514 +MimeContentEnd 10086313 +MimeEntityEnd 10086314 +MimeMessageEnd 10086314 +MboxMarkerBegin 10086314 +MboxMarkerEnd 10086321 +MimeMessageBegin 10086322 +MimeMessageHeadersEnd 10087029 +MimeEntityBegin 10086322 +MimeEntityHeadersEnd 10087029 +MimeContentBegin 10087029 +MultipartPreambleBegin 10087029 +MultipartPreambleEnd 10087029 +MultipartBoundaryBegin 10087029 +MultipartBoundaryEnd 10087056 +MimeEntityBegin 10087056 +MimeEntityHeadersEnd 10087057 +MimeContentBegin 10087057 +MimeContentEnd 10087078 +MimeEntityEnd 10087079 +MultipartBoundaryBegin 10087079 +MultipartBoundaryEnd 10087106 +MimeEntityBegin 10087106 +MimeEntityHeadersEnd 10087258 +MimeContentBegin 10087258 +MimeContentEnd 10170999 +MimeEntityEnd 10171000 +MultipartBoundaryBegin 10171000 +MultipartBoundaryEnd 10171027 +MimeEntityBegin 10171027 +MimeEntityHeadersEnd 10171028 +MimeContentBegin 10171028 +MimeContentEnd 10171287 +MimeEntityEnd 10171288 +MultipartEndBoundaryBegin 10171288 +MultipartEndBoundaryEnd 10171316 +MultipartEpilogueBegin 10171316 +MultipartEpilogueEnd 10171317 +MimeEntityEnd 10171318 +MimeMessageEnd 10171318 +MboxMarkerBegin 10171318 +MboxMarkerEnd 10171325 +MimeMessageBegin 10171326 +MimeMessageHeadersEnd 10171993 +MimeEntityBegin 10171326 +MimeEntityHeadersEnd 10171993 +MimeContentBegin 10171993 +MultipartPreambleBegin 10171993 +MultipartPreambleEnd 10171993 +MultipartBoundaryBegin 10171993 +MultipartBoundaryEnd 10172020 +MimeEntityBegin 10172020 +MimeEntityHeadersEnd 10172021 +MimeContentBegin 10172021 +MimeContentEnd 10172087 +MimeEntityEnd 10172088 +MultipartBoundaryBegin 10172088 +MultipartBoundaryEnd 10172115 +MimeEntityBegin 10172115 +MimeEntityHeadersEnd 10172276 +MimeContentBegin 10172276 +MimeContentEnd 10204442 +MimeEntityEnd 10204443 +MultipartBoundaryBegin 10204443 +MultipartBoundaryEnd 10204470 +MimeEntityBegin 10204470 +MimeEntityHeadersEnd 10204471 +MimeContentBegin 10204471 +MimeContentEnd 10204488 +MimeEntityEnd 10204489 +MultipartBoundaryBegin 10204489 +MultipartBoundaryEnd 10204516 +MimeEntityBegin 10204516 +MimeEntityHeadersEnd 10204675 +MimeContentBegin 10204675 +MimeContentEnd 10205760 +MimeEntityEnd 10205761 +MultipartBoundaryBegin 10205761 +MultipartBoundaryEnd 10205788 +MimeEntityBegin 10205788 +MimeEntityHeadersEnd 10205789 +MimeContentBegin 10205789 +MimeContentEnd 10205819 +MimeEntityEnd 10205820 +MultipartBoundaryBegin 10205820 +MultipartBoundaryEnd 10205847 +MimeEntityBegin 10205847 +MimeEntityHeadersEnd 10205915 +MimeContentBegin 10205915 +MimeContentEnd 10391952 +MimeEntityEnd 10391953 +MultipartBoundaryBegin 10391953 +MultipartBoundaryEnd 10391980 +MimeEntityBegin 10391980 +MimeEntityHeadersEnd 10391981 +MimeContentBegin 10391981 +MimeContentEnd 10391989 +MimeEntityEnd 10391990 +MultipartEndBoundaryBegin 10391990 +MultipartEndBoundaryEnd 10392018 +MultipartEpilogueBegin 10392018 +MultipartEpilogueEnd 10392019 +MimeEntityEnd 10392020 +MimeMessageEnd 10392020 +MboxMarkerBegin 10392020 +MboxMarkerEnd 10392027 +MimeMessageBegin 10392028 +MimeMessageHeadersEnd 10392292 +MimeEntityBegin 10392028 +MimeEntityHeadersEnd 10392292 +MimeContentBegin 10392292 +MimeContentEnd 10466950 +MimeEntityEnd 10466951 +MimeMessageEnd 10466951 +MboxMarkerBegin 10466951 +MboxMarkerEnd 10466958 +MimeMessageBegin 10466959 +MimeMessageHeadersEnd 10468233 +MimeEntityBegin 10466959 +MimeEntityHeadersEnd 10468233 +MimeContentBegin 10468233 +MultipartPreambleBegin 10468233 +MultipartPreambleEnd 10468759 +MultipartBoundaryBegin 10468759 +MultipartBoundaryEnd 10468817 +MimeEntityBegin 10468817 +MimeEntityHeadersEnd 10468818 +MimeContentBegin 10468818 +MimeContentEnd 10470665 +MimeEntityEnd 10470666 +MultipartBoundaryBegin 10470666 +MultipartBoundaryEnd 10470724 +MimeEntityBegin 10470724 +MimeEntityHeadersEnd 10470827 +MimeContentBegin 10470827 +MultipartPreambleBegin 10470827 +MultipartPreambleEnd 10470827 +MultipartBoundaryBegin 10470827 +MultipartBoundaryEnd 10470887 +MimeEntityBegin 10470887 +MimeEntityHeadersEnd 10470960 +MimeContentBegin 10470960 +MimeContentEnd 10472959 +MimeEntityEnd 10472960 +MultipartBoundaryBegin 10472960 +MultipartBoundaryEnd 10473020 +MimeEntityBegin 10473020 +MimeEntityHeadersEnd 10473079 +MimeContentBegin 10473079 +MimeContentEnd 10481008 +MimeEntityEnd 10481009 +MultipartBoundaryBegin 10481009 +MultipartBoundaryEnd 10481069 +MimeEntityBegin 10481069 +MimeEntityHeadersEnd 10481139 +MimeContentBegin 10481139 +MimeContentEnd 10481142 +MimeEntityEnd 10481143 +MultipartBoundaryBegin 10481143 +MultipartBoundaryEnd 10481203 +MimeEntityBegin 10481203 +MimeEntityHeadersEnd 10481296 +MimeContentBegin 10481296 +MimeContentEnd 10523174 +MimeEntityEnd 10523175 +MultipartEndBoundaryBegin 10523175 +MultipartEndBoundaryEnd 10523236 +MultipartEpilogueBegin 10523236 +MultipartEpilogueEnd 10523237 +MimeEntityEnd 10523238 +MultipartEndBoundaryBegin 10523238 +MultipartEndBoundaryEnd 10523297 +MultipartEpilogueBegin 10523297 +MultipartEpilogueEnd 10523298 +MimeEntityEnd 10523299 +MimeMessageEnd 10523299 +MboxMarkerBegin 10523299 +MboxMarkerEnd 10523306 +MimeMessageBegin 10523307 +MimeMessageHeadersEnd 10523459 +MimeEntityBegin 10523307 +MimeEntityHeadersEnd 10523459 +MimeContentBegin 10523459 +MimeContentEnd 10528262 +MimeEntityEnd 10528263 +MimeMessageEnd 10528263 +MboxMarkerBegin 10528263 +MboxMarkerEnd 10528270 +MimeMessageBegin 10528271 +MimeMessageHeadersEnd 10529016 +MimeEntityBegin 10528271 +MimeEntityHeadersEnd 10529016 +MimeContentBegin 10529016 +MultipartPreambleBegin 10529016 +MultipartPreambleEnd 10529355 +MultipartBoundaryBegin 10529355 +MultipartBoundaryEnd 10529395 +MimeEntityBegin 10529395 +MimeEntityHeadersEnd 10529396 +MimeContentBegin 10529396 +MimeContentEnd 10529764 +MimeEntityEnd 10529765 +MultipartBoundaryBegin 10529765 +MultipartBoundaryEnd 10529805 +MimeEntityBegin 10529805 +MimeEntityHeadersEnd 10529890 +MimeContentBegin 10529890 +MultipartPreambleBegin 10529890 +MultipartPreambleEnd 10529890 +MultipartBoundaryBegin 10529890 +MultipartBoundaryEnd 10529932 +MimeEntityBegin 10529932 +MimeEntityHeadersEnd 10530002 +MimeContentBegin 10530002 +MimeContentEnd 10530091 +MimeEntityEnd 10530092 +MultipartBoundaryBegin 10530092 +MultipartBoundaryEnd 10530134 +MimeEntityBegin 10530134 +MimeEntityHeadersEnd 10530248 +MimeContentBegin 10530248 +MimeContentEnd 10535911 +MimeEntityEnd 10535912 +MultipartBoundaryBegin 10535912 +MultipartBoundaryEnd 10535954 +MimeEntityBegin 10535954 +MimeEntityHeadersEnd 10536024 +MimeContentBegin 10536024 +MimeContentEnd 10536227 +MimeEntityEnd 10536228 +MultipartEndBoundaryBegin 10536228 +MultipartEndBoundaryEnd 10536271 +MultipartEpilogueBegin 10536271 +MultipartEpilogueEnd 10536272 +MimeEntityEnd 10536273 +MultipartEndBoundaryBegin 10536273 +MultipartEndBoundaryEnd 10536314 +MultipartEpilogueBegin 10536314 +MultipartEpilogueEnd 10536315 +MimeEntityEnd 10536315 +MimeMessageEnd 10536315 diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 9cf6fc99ac..58043d87f0 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -6,7 +6,7 @@ true Full true - $(DefineConstants);MONO + $(DefineConstants);MONO ..\MimeKit\mimekit.snk false false From 2c72c711168fc0ca6d1c3a37f107b2b6fedea6bc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 14:36:24 -0400 Subject: [PATCH 626/741] Make OpenPgpCOntextBase.HexEncode() private again I don't know how this became public, but it should not be exposed in the public API. --- MimeKit/Cryptography/OpenPgpContextBase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/MimeKit/Cryptography/OpenPgpContextBase.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs index 60c85a5dcf..18ae393ff2 100644 --- a/MimeKit/Cryptography/OpenPgpContextBase.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -411,12 +411,14 @@ public override DigestAlgorithm GetDigestAlgorithm (string micalg) } /// - /// Helper method to turn a bunch of byte data, into a string. Useful for - /// among other things generating fingerprints. + /// Hex encode an array of bytes. /// - /// Byte array that should be turned into string representation. - /// Hexa encoded results from specified input data. - public static string HexEncode (byte[] data) + /// + /// This method is used to hex-encode the PGP key fingerprints. + /// + /// The data to encode. + /// A string representing the hex-encoded data. + static string HexEncode (byte[] data) { var fingerprint = new StringBuilder (); From b2195a02bd33df408d172abc54dfcffa5e6e57d0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 19:37:58 -0400 Subject: [PATCH 627/741] Fixed the TextToFlowed converter Fixes issue #580 (I think?) --- MimeKit/Text/FlowedToText.cs | 2 +- MimeKit/Text/TextToFlowed.cs | 40 +++++++---- UnitTests/Text/TextToFlowedTests.cs | 100 +++++++++++++++++++++------- 3 files changed, 105 insertions(+), 37 deletions(-) diff --git a/MimeKit/Text/FlowedToText.cs b/MimeKit/Text/FlowedToText.cs index 5ab02b4c04..33f61ffe56 100644 --- a/MimeKit/Text/FlowedToText.cs +++ b/MimeKit/Text/FlowedToText.cs @@ -77,7 +77,7 @@ public override TextFormat OutputFormat { /// The flowed text format defines a Content-Type parameter called "delsp" which can /// have a value of "yes" or "no". If the parameter exists and the value is "yes", then /// should be set to true, otherwise - /// should be set to false. + /// should be set to false. /// /// true if the trailing space on a wrapped line should be deleted; otherwise, false. public bool DeleteSpace { diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index 6e301c009a..2b888af316 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -39,7 +39,6 @@ namespace MimeKit.Text { /// public class TextToFlowed : TextConverter { - const int OptimalLineLength = 66; const int MaxLineLength = 78; /// @@ -115,7 +114,7 @@ static string GetFlowedLine (StringBuilder flowed, string line, ref int index, i flowed.Append ('>', quoteDepth); // Space-stuffed lines which start with a space, "From ", or ">". - if (quoteDepth > 0 || (line.Length > 0 && line[0] == ' ') || StartsWith (line, index, "From ")) + if (quoteDepth > 0 || (line.Length > index && line[index] == ' ') || StartsWith (line, index, "From ")) flowed.Append (' '); if (flowed.Length + (line.Length - index) <= MaxLineLength) { @@ -126,18 +125,34 @@ static string GetFlowedLine (StringBuilder flowed, string line, ref int index, i } do { - do { - flowed.Append (line[index++]); - } while (flowed.Length + 1 < MaxLineLength && index < line.Length && line[index] != ' '); - - if (flowed.Length >= OptimalLineLength) { - flowed.Append (' '); + int nextSpace = line.IndexOf (' ', index); + int wordEnd = nextSpace == -1 ? line.Length : nextSpace; + int softBreak = nextSpace == -1 ? 0 : 2; // 2 = space + soft-break space + int wordLength = wordEnd - index; + + if (flowed.Length + wordLength + softBreak <= MaxLineLength) { + // The entire word will fit on the remainder of the line. + flowed.Append (line, index, wordLength); + index = wordEnd; + } else if (wordLength > MaxLineLength - (quoteDepth + 1)) { + // Even if we insert a soft-break here, the word is longer than what will fit on its own line. + // No matter what we do, we will need to break the word apart. + wordLength = MaxLineLength - (flowed.Length + 1); + flowed.Append (line, index, wordLength); + index += wordLength; + break; + } else { + // Only part of the word will fit on the remainder of this line, but it will easily fit + // on its own line. Insert a soft-break so that we don't break apart this word. break; } while (flowed.Length + 1 < MaxLineLength && index < line.Length && line[index] == ' ') flowed.Append (line[index++]); - } while (index < line.Length && flowed.Length < OptimalLineLength); + } while (index < line.Length && flowed.Length + 1 < MaxLineLength); + + if (index < line.Length) + flowed.Append (' '); return flowed.ToString (); } @@ -174,18 +189,17 @@ public override void Convert (TextReader reader, TextWriter writer) flowed = new StringBuilder (MaxLineLength); while ((line = reader.ReadLine ()) != null) { - int quoteDepth; - int index = 0; - // Trim spaces before user-inserted hard line breaks. line = line.TrimEnd (' '); - line = Unquote (line, out quoteDepth); + line = Unquote (line, out var quoteDepth); // Ensure all lines (fixed and flowed) are 78 characters or fewer in // length, counting any trailing space as well as a space added as // stuffing, but not counting the CRLF, unless a word by itself // exceeds 78 characters. + int index = 0; + do { var flowedLine = GetFlowedLine (flowed, line, ref index, quoteDepth); writer.WriteLine (flowedLine); diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index 89e5ebbb51..4e1351169a 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -80,12 +80,12 @@ public void TestDefaultPropertyValues () [Test] public void TestSimpleTextToFlowed () { - string expected = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned " + Environment.NewLine + - "> pigeon-egg!" + Environment.NewLine + + string expected = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned " + Environment.NewLine + + "> pigeon-egg!" + Environment.NewLine + ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed scut!" + Environment.NewLine + ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!" + Environment.NewLine + - ">>>> Henceforth, the coding style is to be strictly enforced, including " + Environment.NewLine + - ">>>> the use of only upper case." + Environment.NewLine + + ">>>> Henceforth, the coding style is to be strictly enforced, including the " + Environment.NewLine + + ">>>> use of only upper case." + Environment.NewLine + ">>>>> I've noticed a lack of adherence to the coding styles, of late." + Environment.NewLine + ">>>>>> Any complaints?" + Environment.NewLine; string text = "> Thou art a villainous ill-breeding spongy dizzy-eyed reeky elf-skinned pigeon-egg!" + Environment.NewLine + @@ -144,7 +144,7 @@ public void TestSpaceStuffingLinesStartingWithSpace () [Test] public void TestFlowingLongLines () { - string text = "But, soft! what light through yonder window breaks? " + + const string text = "But, soft! what light through yonder window breaks? " + "It is the east, and Juliet is the sun. " + "Arise, fair sun, and kill the envious moon, " + "Who is already sick and pale with grief, " + @@ -167,37 +167,91 @@ public void TestFlowingLongLines () "That birds would sing and think it were not night. " + "See, how she leans her cheek upon her hand! " + "O, that I were a glove upon that hand, " + - "That I might touch that cheek!" + Environment.NewLine; - string expected = "But, soft! what light through yonder window breaks? " + - "It is the east, " + Environment.NewLine + " and Juliet is the sun. " + - "Arise, fair sun, and kill the envious moon, " + Environment.NewLine + " " + + "That I might touch that cheek!\r\n"; + string expected = @"But, soft! what light through yonder window breaks? It is the east, and +Juliet is the sun. Arise, fair sun, and kill the envious moon, Who is +already sick and pale with grief, That thou her maid art far more fair than +she: Be not her maid, since she is envious; Her vestal livery is but sick +and green And none but fools do wear it; cast it off. It is my lady, O, it +is my love! O, that she knew she were! She speaks yet she says nothing: what +of that? Her eye discourses; I will answer it. I am too bold, 'tis not to me +she speaks: Two of the fairest stars in all the heaven, Having some +business, do entreat her eyes To twinkle in their spheres till they return. +What if her eyes were there, they in her head? The brightness of her cheek +would shame those stars, As daylight doth a lamp; her eyes in heaven Would +through the airy region stream so bright That birds would sing and think it +were not night. See, how she leans her cheek upon her hand! O, that I were a +glove upon that hand, That I might touch that cheek! +".Replace ("\r\n", "\n").Replace ("\n", "\r\n"); + TextConverter converter = new TextToFlowed (); + string result = converter.Convert (text); + + Assert.AreEqual (expected, result); + + converter = new FlowedToText () { DeleteSpace = true }; + result = converter.Convert (expected); + + Assert.AreEqual (text, result); + } + + [Test] + public void TestFlowingLongQuotedLines () + { + const string text = "A passage from Shakespear's Romeo + Juliet:\r\n" + + "> Begin quote\r\n" + + ">> But, soft! what light through yonder window breaks? " + + "It is the east, and Juliet is the sun. " + + "Arise, fair sun, and kill the envious moon, " + "Who is already sick and pale with grief, " + - "That thou her maid art far " + Environment.NewLine + " more fair than she: " + + "That thou her maid art far more fair than she: " + "Be not her maid, since she is envious; " + - "Her vestal " + Environment.NewLine + " livery is but sick and green " + - "And none but fools do wear it; cast " + Environment.NewLine + "it off. " + // this looks like a bug + "Her vestal livery is but sick and green " + + "And none but fools do wear it; cast it off. " + "It is my lady, O, it is my love! " + - "O, that she knew she were! " + Environment.NewLine + " " + + "O, that she knew she were! " + "She speaks yet she says nothing: what of that? " + - "Her eye discourses; " + Environment.NewLine + " I will answer it. " + + "Her eye discourses; I will answer it. " + "I am too bold, 'tis not to me she speaks: " + - "Two of " + Environment.NewLine + " the fairest stars in all the heaven, " + - "Having some business, do entreat " + Environment.NewLine + " her eyes " + + "Two of the fairest stars in all the heaven, " + + "Having some business, do entreat her eyes " + "To twinkle in their spheres till they return. " + - "What if her " + Environment.NewLine + " eyes were there, they in her head? " + - "The brightness of her cheek would " + Environment.NewLine + " shame those stars, " + + "What if her eyes were there, they in her head? " + + "The brightness of her cheek would shame those stars, " + "As daylight doth a lamp; her eyes in heaven " + - "Would " + Environment.NewLine + " through the airy region stream so bright " + - "That birds would sing and " + Environment.NewLine + " think it were not night. " + - "See, how she leans her cheek upon her hand! " + Environment.NewLine + " " + + "Would through the airy region stream so bright " + + "That birds would sing and think it were not night. " + + "See, how she leans her cheek upon her hand! " + "O, that I were a glove upon that hand, " + - "That I might touch that cheek!" + Environment.NewLine; + "That I might touch that cheek!\r\n" + + "> End quote\r\n\r\n" + + "Did that flow correctly?\r\n"; + string expected = @"A passage from Shakespear's Romeo + Juliet: +> Begin quote +>> But, soft! what light through yonder window breaks? It is the east, and +>> Juliet is the sun. Arise, fair sun, and kill the envious moon, Who is +>> already sick and pale with grief, That thou her maid art far more fair +>> than she: Be not her maid, since she is envious; Her vestal livery is but +>> sick and green And none but fools do wear it; cast it off. It is my lady, +>> O, it is my love! O, that she knew she were! She speaks yet she says +>> nothing: what of that? Her eye discourses; I will answer it. I am too +>> bold, 'tis not to me she speaks: Two of the fairest stars in all the +>> heaven, Having some business, do entreat her eyes To twinkle in their +>> spheres till they return. What if her eyes were there, they in her head? +>> The brightness of her cheek would shame those stars, As daylight doth a +>> lamp; her eyes in heaven Would through the airy region stream so bright +>> That birds would sing and think it were not night. See, how she leans her +>> cheek upon her hand! O, that I were a glove upon that hand, That I might +>> touch that cheek! +> End quote + +Did that flow correctly? +".Replace ("\r\n", "\n").Replace ("\n", "\r\n"); TextConverter converter = new TextToFlowed (); string result = converter.Convert (text); Assert.AreEqual (expected, result); - converter = new FlowedToText (); // { DeleteSpace = true }; + converter = new FlowedToText () { DeleteSpace = true }; result = converter.Convert (expected); Assert.AreEqual (text, result); From 7a7655eb33b2c9b6eac90fd473e4b9daf622cc71 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 13 Jun 2020 19:55:40 -0400 Subject: [PATCH 628/741] Fixed TextToFlowedTests to pass on Linux --- UnitTests/Text/TextToFlowedTests.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index 4e1351169a..da4f8f7e70 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -167,7 +167,7 @@ public void TestFlowingLongLines () "That birds would sing and think it were not night. " + "See, how she leans her cheek upon her hand! " + "O, that I were a glove upon that hand, " + - "That I might touch that cheek!\r\n"; + "That I might touch that cheek!\n"; string expected = @"But, soft! what light through yonder window breaks? It is the east, and Juliet is the sun. Arise, fair sun, and kill the envious moon, Who is already sick and pale with grief, That thou her maid art far more fair than @@ -182,14 +182,14 @@ public void TestFlowingLongLines () through the airy region stream so bright That birds would sing and think it were not night. See, how she leans her cheek upon her hand! O, that I were a glove upon that hand, That I might touch that cheek! -".Replace ("\r\n", "\n").Replace ("\n", "\r\n"); +".Replace ("\r\n", "\n"); TextConverter converter = new TextToFlowed (); - string result = converter.Convert (text); + string result = converter.Convert (text).Replace ("\r\n", "\n"); Assert.AreEqual (expected, result); converter = new FlowedToText () { DeleteSpace = true }; - result = converter.Convert (expected); + result = converter.Convert (expected).Replace ("\r\n", "\n"); Assert.AreEqual (text, result); } @@ -197,8 +197,8 @@ through the airy region stream so bright That birds would sing and think it [Test] public void TestFlowingLongQuotedLines () { - const string text = "A passage from Shakespear's Romeo + Juliet:\r\n" + - "> Begin quote\r\n" + + const string text = "A passage from Shakespear's Romeo + Juliet:\n" + + "> Begin quote\n" + ">> But, soft! what light through yonder window breaks? " + "It is the east, and Juliet is the sun. " + "Arise, fair sun, and kill the envious moon, " + @@ -222,9 +222,9 @@ public void TestFlowingLongQuotedLines () "That birds would sing and think it were not night. " + "See, how she leans her cheek upon her hand! " + "O, that I were a glove upon that hand, " + - "That I might touch that cheek!\r\n" + - "> End quote\r\n\r\n" + - "Did that flow correctly?\r\n"; + "That I might touch that cheek!\n" + + "> End quote\n\n" + + "Did that flow correctly?\n"; string expected = @"A passage from Shakespear's Romeo + Juliet: > Begin quote >> But, soft! what light through yonder window breaks? It is the east, and @@ -245,14 +245,14 @@ public void TestFlowingLongQuotedLines () > End quote Did that flow correctly? -".Replace ("\r\n", "\n").Replace ("\n", "\r\n"); +".Replace ("\r\n", "\n"); TextConverter converter = new TextToFlowed (); - string result = converter.Convert (text); + string result = converter.Convert (text).Replace ("\r\n", "\n"); Assert.AreEqual (expected, result); converter = new FlowedToText () { DeleteSpace = true }; - result = converter.Convert (expected); + result = converter.Convert (expected).Replace ("\r\n", "\n"); Assert.AreEqual (text, result); } From 330d3a66f401820791e19a9622eb0ca1952a070d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 14 Jun 2020 09:55:38 -0400 Subject: [PATCH 629/741] Make MimeMessage and MimeEntity.ToString() more clear about being for debug only --- MimeKit/MimeEntity.cs | 14 ++++++++------ MimeKit/MimeMessage.cs | 12 +++++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index ebb0ff978d..397bab8a71 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -32,8 +32,8 @@ using System.Threading.Tasks; using System.Collections.Generic; -using MimeKit.Utils; using MimeKit.IO; +using MimeKit.Utils; namespace MimeKit { /// @@ -323,14 +323,16 @@ public bool IsAttachment { } /// - /// Returns a that represents the current . + /// Returns a that represents the for debugging purposes. /// /// - /// Returns a that represents the current . - /// In general, the string returned from this method SHOULD NOT be used for serializing - /// the message to disk. It is recommended that you use instead. + /// Returns a that represents the for debugging purposes. + /// In general, the string returned from this method SHOULD NOT be used for serializing + /// the entity to disk. It is recommended that you use instead. + /// If this method is used for serializing the entity to disk, the iso-8859-1 text encoding should be used for + /// conversion. /// - /// A that represents the current . + /// A that represents the for debugging purposes. public override string ToString () { using (var memory = new MemoryStream ()) { diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index a7df8b9cb6..7c3076bdcd 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -977,14 +977,16 @@ public IEnumerable Attachments { } /// - /// Returns a that represents the current . + /// Returns a that represents the for debugging purposes. /// /// - /// Returns a that represents the current . - /// In general, the string returned from this method SHOULD NOT be used for serializing - /// the message to disk. It is recommended that you use instead. + /// Returns a that represents the for debugging purposes. + /// In general, the string returned from this method SHOULD NOT be used for serializing + /// the message to disk. It is recommended that you use instead. + /// If this method is used for serializing the message to disk, the iso-8859-1 text encoding should be used for + /// conversion. /// - /// A that represents the current . + /// A that represents the for debugging purposes. public override string ToString () { using (var memory = new MemoryStream ()) { From 2bc9282a460c7eb261ed18f150b64a91c2da0007 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 15 Jun 2020 09:02:10 -0400 Subject: [PATCH 630/741] Update LICENSE --- LICENSE | 21 +++++++++++++++++++++ License.md | 21 --------------------- 2 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 LICENSE delete mode 100644 License.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..7614a032f3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2012-2020 .NET Foundation and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/License.md b/License.md deleted file mode 100644 index af18498898..0000000000 --- a/License.md +++ /dev/null @@ -1,21 +0,0 @@ -## License Information - -MimeKit is Copyright (C) 2012-2020 .NET Foundation and Contributors and is licensed under the MIT license: - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. From 778ca3f1ac1d3edb16f9adb8894097218d37f742 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 15 Jun 2020 09:13:34 -0400 Subject: [PATCH 631/741] Updated Copyright notices to .NET Foundation --- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/AttachmentCollection.cs | 2 +- MimeKit/BodyBuilder.cs | 2 +- MimeKit/ContentDisposition.cs | 2 +- MimeKit/ContentEncoding.cs | 2 +- MimeKit/ContentType.cs | 2 +- MimeKit/Cryptography/ApplicationPgpEncrypted.cs | 2 +- MimeKit/Cryptography/ApplicationPgpSignature.cs | 2 +- MimeKit/Cryptography/ApplicationPkcs7Mime.cs | 2 +- MimeKit/Cryptography/ApplicationPkcs7Signature.cs | 2 +- MimeKit/Cryptography/ArcSigner.cs | 2 +- MimeKit/Cryptography/ArcVerifier.cs | 2 +- MimeKit/Cryptography/AuthenticationResults.cs | 2 +- MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs | 2 +- MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs | 2 +- MimeKit/Cryptography/CertificateNotFoundException.cs | 2 +- MimeKit/Cryptography/CmsRecipient.cs | 2 +- MimeKit/Cryptography/CmsRecipientCollection.cs | 2 +- MimeKit/Cryptography/CmsSigner.cs | 2 +- MimeKit/Cryptography/CryptographyContext.cs | 2 +- MimeKit/Cryptography/DbExtensions.cs | 2 +- MimeKit/Cryptography/DefaultSecureMimeContext.cs | 2 +- MimeKit/Cryptography/DigestAlgorithm.cs | 2 +- MimeKit/Cryptography/DigitalSignatureCollection.cs | 2 +- MimeKit/Cryptography/DigitalSignatureVerifyException.cs | 2 +- MimeKit/Cryptography/DkimBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs | 2 +- MimeKit/Cryptography/DkimHashStream.cs | 2 +- MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs | 2 +- MimeKit/Cryptography/DkimRelaxedBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimSignatureAlgorithm.cs | 2 +- MimeKit/Cryptography/DkimSignatureStream.cs | 2 +- MimeKit/Cryptography/DkimSigner.cs | 2 +- MimeKit/Cryptography/DkimSignerBase.cs | 2 +- MimeKit/Cryptography/DkimSimpleBodyFilter.cs | 2 +- MimeKit/Cryptography/DkimVerifier.cs | 2 +- MimeKit/Cryptography/DkimVerifierBase.cs | 2 +- MimeKit/Cryptography/Ed25519DigestSigner.cs | 2 +- MimeKit/Cryptography/EncryptionAlgorithm.cs | 2 +- MimeKit/Cryptography/GnuPGContext.cs | 2 +- MimeKit/Cryptography/IDigitalCertificate.cs | 2 +- MimeKit/Cryptography/IDigitalSignature.cs | 2 +- MimeKit/Cryptography/IDkimPublicKeyLocator.cs | 2 +- MimeKit/Cryptography/IX509CertificateDatabase.cs | 2 +- MimeKit/Cryptography/MultipartEncrypted.cs | 2 +- MimeKit/Cryptography/MultipartSigned.cs | 2 +- MimeKit/Cryptography/OpenPgpBlockFilter.cs | 2 +- MimeKit/Cryptography/OpenPgpContext.cs | 2 +- MimeKit/Cryptography/OpenPgpContextBase.cs | 2 +- MimeKit/Cryptography/OpenPgpDataType.cs | 2 +- MimeKit/Cryptography/OpenPgpDetectionFilter.cs | 2 +- MimeKit/Cryptography/OpenPgpDigitalCertificate.cs | 2 +- MimeKit/Cryptography/OpenPgpDigitalSignature.cs | 2 +- MimeKit/Cryptography/OpenPgpKeyCertification.cs | 2 +- MimeKit/Cryptography/PrivateKeyNotFoundException.cs | 2 +- MimeKit/Cryptography/PublicKeyAlgorithm.cs | 2 +- MimeKit/Cryptography/PublicKeyNotFoundException.cs | 2 +- MimeKit/Cryptography/RsaEncryptionPadding.cs | 2 +- MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs | 2 +- MimeKit/Cryptography/RsaSignaturePadding.cs | 2 +- MimeKit/Cryptography/RsaSignaturePaddingScheme.cs | 2 +- MimeKit/Cryptography/SecureMailboxAddress.cs | 2 +- MimeKit/Cryptography/SecureMimeContext.cs | 2 +- MimeKit/Cryptography/SecureMimeDigitalCertificate.cs | 2 +- MimeKit/Cryptography/SecureMimeDigitalSignature.cs | 2 +- MimeKit/Cryptography/SecureMimeType.cs | 2 +- MimeKit/Cryptography/SqlCertificateDatabase.cs | 2 +- MimeKit/Cryptography/SqliteCertificateDatabase.cs | 2 +- MimeKit/Cryptography/SubjectIdentifierType.cs | 2 +- MimeKit/Cryptography/TemporarySecureMimeContext.cs | 2 +- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 2 +- MimeKit/Cryptography/X509CertificateChain.cs | 2 +- MimeKit/Cryptography/X509CertificateDatabase.cs | 2 +- MimeKit/Cryptography/X509CertificateRecord.cs | 2 +- MimeKit/Cryptography/X509CertificateStore.cs | 2 +- MimeKit/Cryptography/X509CrlRecord.cs | 2 +- MimeKit/Cryptography/X509KeyUsageFlags.cs | 2 +- MimeKit/DomainList.cs | 2 +- MimeKit/EncodingConstraint.cs | 2 +- MimeKit/Encodings/Base64Decoder.cs | 2 +- MimeKit/Encodings/Base64Encoder.cs | 2 +- MimeKit/Encodings/HexDecoder.cs | 2 +- MimeKit/Encodings/HexEncoder.cs | 2 +- MimeKit/Encodings/IMimeDecoder.cs | 2 +- MimeKit/Encodings/IMimeEncoder.cs | 2 +- MimeKit/Encodings/PassThroughDecoder.cs | 2 +- MimeKit/Encodings/PassThroughEncoder.cs | 2 +- MimeKit/Encodings/QEncoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableDecoder.cs | 2 +- MimeKit/Encodings/QuotedPrintableEncoder.cs | 2 +- MimeKit/Encodings/UUDecoder.cs | 2 +- MimeKit/Encodings/UUEncoder.cs | 2 +- MimeKit/Encodings/YDecoder.cs | 2 +- MimeKit/Encodings/YEncoder.cs | 2 +- MimeKit/FormatOptions.cs | 2 +- MimeKit/GroupAddress.cs | 2 +- MimeKit/Header.cs | 2 +- MimeKit/HeaderId.cs | 2 +- MimeKit/HeaderList.cs | 2 +- MimeKit/HeaderListChangedEventArgs.cs | 2 +- MimeKit/HeaderListCollection.cs | 2 +- MimeKit/IMimeContent.cs | 2 +- MimeKit/IO/BoundStream.cs | 2 +- MimeKit/IO/ChainedStream.cs | 2 +- MimeKit/IO/FilteredStream.cs | 2 +- MimeKit/IO/Filters/ArmoredFromFilter.cs | 2 +- MimeKit/IO/Filters/BestEncodingFilter.cs | 2 +- MimeKit/IO/Filters/CharsetFilter.cs | 2 +- MimeKit/IO/Filters/DecoderFilter.cs | 2 +- MimeKit/IO/Filters/Dos2UnixFilter.cs | 2 +- MimeKit/IO/Filters/EncoderFilter.cs | 2 +- MimeKit/IO/Filters/IMimeFilter.cs | 2 +- MimeKit/IO/Filters/MimeFilterBase.cs | 2 +- MimeKit/IO/Filters/PassThroughFilter.cs | 2 +- MimeKit/IO/Filters/TrailingWhitespaceFilter.cs | 2 +- MimeKit/IO/Filters/Unix2DosFilter.cs | 2 +- MimeKit/IO/ICancellableStream.cs | 2 +- MimeKit/IO/MeasuringStream.cs | 2 +- MimeKit/IO/MemoryBlockStream.cs | 2 +- MimeKit/InternetAddress.cs | 2 +- MimeKit/InternetAddressList.cs | 2 +- MimeKit/MailboxAddress.cs | 2 +- MimeKit/MessageDeliveryStatus.cs | 2 +- MimeKit/MessageDispositionNotification.cs | 2 +- MimeKit/MessageIdList.cs | 2 +- MimeKit/MessageImportance.cs | 2 +- MimeKit/MessagePart.cs | 2 +- MimeKit/MessagePartial.cs | 2 +- MimeKit/MessagePriority.cs | 2 +- MimeKit/MimeContent.cs | 2 +- MimeKit/MimeEntity.cs | 2 +- MimeKit/MimeEntityConstructorArgs.cs | 2 +- MimeKit/MimeFormat.cs | 2 +- MimeKit/MimeIterator.cs | 2 +- MimeKit/MimeMessage.cs | 2 +- MimeKit/MimeParser.cs | 2 +- MimeKit/MimePart.cs | 2 +- MimeKit/MimeTypes.cs | 2 +- MimeKit/MimeVisitor.cs | 2 +- MimeKit/Multipart.cs | 2 +- MimeKit/MultipartAlternative.cs | 2 +- MimeKit/MultipartRelated.cs | 2 +- MimeKit/MultipartReport.cs | 2 +- MimeKit/Parameter.cs | 2 +- MimeKit/ParameterEncodingMethod.cs | 2 +- MimeKit/ParameterList.cs | 2 +- MimeKit/ParseException.cs | 2 +- MimeKit/ParserOptions.cs | 2 +- MimeKit/Properties/AssemblyInfo.cs | 8 ++++---- MimeKit/RfcComplianceMode.cs | 2 +- MimeKit/Text/CharBuffer.cs | 2 +- MimeKit/Text/FlowedToHtml.cs | 2 +- MimeKit/Text/FlowedToText.cs | 2 +- MimeKit/Text/HeaderFooterFormat.cs | 2 +- MimeKit/Text/HtmlAttribute.cs | 2 +- MimeKit/Text/HtmlAttributeCollection.cs | 2 +- MimeKit/Text/HtmlAttributeId.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.cs | 2 +- MimeKit/Text/HtmlEntityDecoder.g.cs | 2 +- MimeKit/Text/HtmlNamespace.cs | 2 +- MimeKit/Text/HtmlTagCallback.cs | 2 +- MimeKit/Text/HtmlTagContext.cs | 2 +- MimeKit/Text/HtmlTagId.cs | 2 +- MimeKit/Text/HtmlTextPreviewer.cs | 2 +- MimeKit/Text/HtmlToHtml.cs | 2 +- MimeKit/Text/HtmlToken.cs | 2 +- MimeKit/Text/HtmlTokenKind.cs | 2 +- MimeKit/Text/HtmlTokenizer.cs | 2 +- MimeKit/Text/HtmlTokenizerState.cs | 2 +- MimeKit/Text/HtmlUtils.cs | 2 +- MimeKit/Text/HtmlWriter.cs | 2 +- MimeKit/Text/HtmlWriterState.cs | 2 +- MimeKit/Text/ICharArray.cs | 2 +- MimeKit/Text/PlainTextPreviewer.cs | 2 +- MimeKit/Text/TextConverter.cs | 2 +- MimeKit/Text/TextFormat.cs | 2 +- MimeKit/Text/TextPreviewer.cs | 2 +- MimeKit/Text/TextToFlowed.cs | 2 +- MimeKit/Text/TextToHtml.cs | 2 +- MimeKit/Text/TextToText.cs | 2 +- MimeKit/Text/Trie.cs | 2 +- MimeKit/Text/UrlScanner.cs | 2 +- MimeKit/TextPart.cs | 2 +- MimeKit/TextRfc822Headers.cs | 2 +- MimeKit/Tnef/RtfCompressedToRtf.cs | 2 +- MimeKit/Tnef/RtfCompressionMode.cs | 2 +- MimeKit/Tnef/TnefAttachFlags.cs | 2 +- MimeKit/Tnef/TnefAttachMethod.cs | 2 +- MimeKit/Tnef/TnefAttributeLevel.cs | 2 +- MimeKit/Tnef/TnefAttributeTag.cs | 2 +- MimeKit/Tnef/TnefComplianceMode.cs | 2 +- MimeKit/Tnef/TnefComplianceStatus.cs | 2 +- MimeKit/Tnef/TnefException.cs | 2 +- MimeKit/Tnef/TnefNameId.cs | 2 +- MimeKit/Tnef/TnefNameIdKind.cs | 2 +- MimeKit/Tnef/TnefPart.cs | 2 +- MimeKit/Tnef/TnefPropertyId.cs | 2 +- MimeKit/Tnef/TnefPropertyReader.cs | 2 +- MimeKit/Tnef/TnefPropertyTag.cs | 2 +- MimeKit/Tnef/TnefPropertyType.cs | 2 +- MimeKit/Tnef/TnefReader.cs | 2 +- MimeKit/Tnef/TnefReaderStream.cs | 2 +- MimeKit/Utils/BufferPool.cs | 2 +- MimeKit/Utils/ByteExtensions.cs | 2 +- MimeKit/Utils/CharsetUtils.cs | 2 +- MimeKit/Utils/Crc32.cs | 2 +- MimeKit/Utils/DateUtils.cs | 2 +- MimeKit/Utils/MimeUtils.cs | 2 +- MimeKit/Utils/OptimizedOrdinalComparer.cs | 2 +- MimeKit/Utils/PackedByteArray.cs | 2 +- MimeKit/Utils/ParseUtils.cs | 2 +- MimeKit/Utils/Rfc2047.cs | 2 +- MimeKit/Utils/StringBuilderExtensions.cs | 2 +- MimeKit/XMessagePriority.cs | 2 +- UnitTests/ArgumentExceptionTests.cs | 2 +- UnitTests/AssortedTests.cs | 2 +- UnitTests/AttachmentCollectionTests.cs | 2 +- UnitTests/ConstructorTests.cs | 2 +- UnitTests/ContentDispositionTests.cs | 2 +- UnitTests/ContentObjectTests.cs | 2 +- UnitTests/ContentTypeTests.cs | 2 +- UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs | 2 +- UnitTests/Cryptography/ArcSignerTests.cs | 2 +- UnitTests/Cryptography/ArcVerifierTests.cs | 2 +- .../Cryptography/AsymmetricAlgorithmExtensionTests.cs | 2 +- UnitTests/Cryptography/AuthenticationResultsTests.cs | 2 +- UnitTests/Cryptography/CertificateExtensionTests.cs | 2 +- UnitTests/Cryptography/CmsRecipientTests.cs | 2 +- UnitTests/Cryptography/CmsSignerTests.cs | 2 +- UnitTests/Cryptography/DefaultSecureMimeContextTests.cs | 2 +- UnitTests/Cryptography/DkimPublicKeyLocator.cs | 2 +- UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs | 2 +- UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs | 2 +- UnitTests/Cryptography/DkimTests.cs | 2 +- UnitTests/Cryptography/DummyArcSigner.cs | 2 +- UnitTests/Cryptography/DummyOpenPgpContext.cs | 2 +- UnitTests/Cryptography/LdapUriTests.cs | 2 +- UnitTests/Cryptography/PgpMimeTests.cs | 2 +- UnitTests/Cryptography/RsaEncryptionPaddingTests.cs | 2 +- UnitTests/Cryptography/RsaSignaturePaddingTests.cs | 2 +- .../Cryptography/SecureMimeDigitalCertificateTests.cs | 2 +- UnitTests/Cryptography/SecureMimeTests.cs | 2 +- UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs | 2 +- UnitTests/Cryptography/X509CertificateChainTests.cs | 2 +- UnitTests/Cryptography/X509CertificateRecordTests.cs | 2 +- UnitTests/Cryptography/X509CertificateStoreTests.cs | 2 +- UnitTests/DomainListTests.cs | 2 +- UnitTests/Encodings/EncoderTests.cs | 2 +- UnitTests/Encodings/YEncodingTests.cs | 2 +- UnitTests/ExceptionTests.cs | 2 +- UnitTests/FormatOptionsTests.cs | 2 +- UnitTests/GroupAddressTests.cs | 2 +- UnitTests/HeaderListTests.cs | 2 +- UnitTests/HeaderTests.cs | 2 +- UnitTests/HtmlPreviewVisitor.cs | 2 +- UnitTests/IO/BoundStreamTests.cs | 2 +- UnitTests/IO/CanReadWriteSeekStream.cs | 2 +- UnitTests/IO/ChainedStreamTests.cs | 2 +- UnitTests/IO/FilteredStreamTests.cs | 2 +- UnitTests/IO/Filters/FilterTests.cs | 2 +- UnitTests/IO/MeasuringStreamTests.cs | 2 +- UnitTests/IO/MemoryBlockStreamTests.cs | 2 +- UnitTests/IO/ReadOneByteStream.cs | 2 +- UnitTests/IO/TimeoutStream.cs | 2 +- UnitTests/InternetAddressListTests.cs | 2 +- UnitTests/InternetAddressTests.cs | 2 +- UnitTests/MailboxAddressTests.cs | 2 +- UnitTests/MessageDeliveryStatusTests.cs | 2 +- UnitTests/MessageDispositionNotificiationTests.cs | 2 +- UnitTests/MessageIdListTests.cs | 2 +- UnitTests/MessagePartialTests.cs | 2 +- UnitTests/MimeIteratorTests.cs | 2 +- UnitTests/MimeMessageTests.cs | 2 +- UnitTests/MimeParserTests.cs | 2 +- UnitTests/MimePartTests.cs | 2 +- UnitTests/MimeTypeTests.cs | 2 +- UnitTests/MimeVisitorTests.cs | 2 +- UnitTests/MultipartAlternativeTests.cs | 2 +- UnitTests/MultipartRelatedTests.cs | 2 +- UnitTests/MultipartReportTests.cs | 2 +- UnitTests/MultipartTests.cs | 2 +- UnitTests/ParameterListTests.cs | 2 +- UnitTests/ParameterTests.cs | 2 +- UnitTests/ParserOptionsTests.cs | 2 +- UnitTests/TestHelper.cs | 2 +- UnitTests/Text/FlowedToHtmlTests.cs | 2 +- UnitTests/Text/FlowedToTextTests.cs | 2 +- UnitTests/Text/HtmlAttributeTests.cs | 2 +- UnitTests/Text/HtmlEntityDecoderTests.cs | 2 +- UnitTests/Text/HtmlTagIdTests.cs | 2 +- UnitTests/Text/HtmlTextPreviewerTests.cs | 2 +- UnitTests/Text/HtmlToHtmlTests.cs | 2 +- UnitTests/Text/HtmlTokenTests.cs | 2 +- UnitTests/Text/HtmlTokenizerTests.cs | 2 +- UnitTests/Text/HtmlUtilsTests.cs | 2 +- UnitTests/Text/HtmlWriterTests.cs | 2 +- UnitTests/Text/PlainTextPreviewerTests.cs | 2 +- UnitTests/Text/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Text/TextConverterTests.cs | 2 +- UnitTests/Text/TextPreviewerTests.cs | 2 +- UnitTests/Text/TextToFlowedTests.cs | 2 +- UnitTests/Text/TextToHtmlTests.cs | 2 +- UnitTests/Text/TextToTextTests.cs | 2 +- UnitTests/Text/TrieTests.cs | 2 +- UnitTests/Text/UrlScannerTests.cs | 2 +- UnitTests/TextPartTests.cs | 2 +- UnitTests/TextRfc822HeadersTests.cs | 2 +- UnitTests/Tnef/RtfCompressedToRtfTests.cs | 2 +- UnitTests/Tnef/TnefReaderStreamTests.cs | 2 +- UnitTests/Tnef/TnefReaderTests.cs | 2 +- UnitTests/Tnef/TnefTests.cs | 2 +- UnitTests/Utils/CharsetUtilsTests.cs | 2 +- UnitTests/Utils/DateParserTests.cs | 2 +- UnitTests/Utils/MimeUtilsTests.cs | 2 +- UnitTests/Utils/PackedByteArrayTests.cs | 2 +- UnitTests/Utils/ParseUtilsTests.cs | 2 +- UnitTests/Utils/Rfc2047Tests.cs | 2 +- UnitTests/Utils/StringBuilderExtensionTests.cs | 2 +- 318 files changed, 321 insertions(+), 321 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index d191fa9659..5e6e51258a 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index da7764069d..d6cea7f6cf 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index b807814104..8aae0ef04e 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index 1d06643c40..9912153b92 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentEncoding.cs b/MimeKit/ContentEncoding.cs index 1bdbff0b55..53c6cbd650 100644 --- a/MimeKit/ContentEncoding.cs +++ b/MimeKit/ContentEncoding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index 34c99d91b9..02244daf94 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs index 44d5dfbd47..05859d6fc7 100644 --- a/MimeKit/Cryptography/ApplicationPgpEncrypted.cs +++ b/MimeKit/Cryptography/ApplicationPgpEncrypted.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPgpSignature.cs b/MimeKit/Cryptography/ApplicationPgpSignature.cs index c933dd61d9..d7590e31c3 100644 --- a/MimeKit/Cryptography/ApplicationPgpSignature.cs +++ b/MimeKit/Cryptography/ApplicationPgpSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs index 3788492d26..12ebd8045a 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Mime.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Mime.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs index 24aae0b7f8..200d503211 100644 --- a/MimeKit/Cryptography/ApplicationPkcs7Signature.cs +++ b/MimeKit/Cryptography/ApplicationPkcs7Signature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 56ea4d30aa..4f6fbb360e 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 087b162651..982929ffc9 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index b70de79c5a..f2ea9c1918 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 11d6577ec9..292b6d16b8 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs index 50352b41ce..616060f332 100644 --- a/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs +++ b/MimeKit/Cryptography/BouncyCastleSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CertificateNotFoundException.cs b/MimeKit/Cryptography/CertificateNotFoundException.cs index 22f6fd256e..1d538e75da 100644 --- a/MimeKit/Cryptography/CertificateNotFoundException.cs +++ b/MimeKit/Cryptography/CertificateNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsRecipient.cs b/MimeKit/Cryptography/CmsRecipient.cs index 94e66b4a5e..aae14c1aeb 100644 --- a/MimeKit/Cryptography/CmsRecipient.cs +++ b/MimeKit/Cryptography/CmsRecipient.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsRecipientCollection.cs b/MimeKit/Cryptography/CmsRecipientCollection.cs index 5fbb206db4..e50234cd4c 100644 --- a/MimeKit/Cryptography/CmsRecipientCollection.cs +++ b/MimeKit/Cryptography/CmsRecipientCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CmsSigner.cs b/MimeKit/Cryptography/CmsSigner.cs index fe74141c64..47c8ee8d3c 100644 --- a/MimeKit/Cryptography/CmsSigner.cs +++ b/MimeKit/Cryptography/CmsSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/CryptographyContext.cs b/MimeKit/Cryptography/CryptographyContext.cs index 0c1a0fadfa..60bed14d8d 100644 --- a/MimeKit/Cryptography/CryptographyContext.cs +++ b/MimeKit/Cryptography/CryptographyContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DbExtensions.cs b/MimeKit/Cryptography/DbExtensions.cs index 24aa4bb49a..0d66fa1015 100644 --- a/MimeKit/Cryptography/DbExtensions.cs +++ b/MimeKit/Cryptography/DbExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DefaultSecureMimeContext.cs b/MimeKit/Cryptography/DefaultSecureMimeContext.cs index 947b189c5e..ceee70cf56 100644 --- a/MimeKit/Cryptography/DefaultSecureMimeContext.cs +++ b/MimeKit/Cryptography/DefaultSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigestAlgorithm.cs b/MimeKit/Cryptography/DigestAlgorithm.cs index 2f27437839..154f73a237 100644 --- a/MimeKit/Cryptography/DigestAlgorithm.cs +++ b/MimeKit/Cryptography/DigestAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigitalSignatureCollection.cs b/MimeKit/Cryptography/DigitalSignatureCollection.cs index b0a144406d..211dfe46f3 100644 --- a/MimeKit/Cryptography/DigitalSignatureCollection.cs +++ b/MimeKit/Cryptography/DigitalSignatureCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs index 1bc9a5bf09..cd491ebcd4 100644 --- a/MimeKit/Cryptography/DigitalSignatureVerifyException.cs +++ b/MimeKit/Cryptography/DigitalSignatureVerifyException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimBodyFilter.cs b/MimeKit/Cryptography/DkimBodyFilter.cs index 836d38ce54..b675cc3cbf 100644 --- a/MimeKit/Cryptography/DkimBodyFilter.cs +++ b/MimeKit/Cryptography/DkimBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs index a77cfa4c0c..67f0f75019 100644 --- a/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs +++ b/MimeKit/Cryptography/DkimCanonicalizationAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimHashStream.cs b/MimeKit/Cryptography/DkimHashStream.cs index ef2d241b27..b639b74466 100644 --- a/MimeKit/Cryptography/DkimHashStream.cs +++ b/MimeKit/Cryptography/DkimHashStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index 3d5da14bc8..3edc6a9804 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs index a4f79cc76a..91905ac019 100644 --- a/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs +++ b/MimeKit/Cryptography/DkimRelaxedBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs index ec884b1b35..5b38ddc736 100644 --- a/MimeKit/Cryptography/DkimSignatureAlgorithm.cs +++ b/MimeKit/Cryptography/DkimSignatureAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignatureStream.cs b/MimeKit/Cryptography/DkimSignatureStream.cs index 3dd39e9ac4..83badb54dd 100644 --- a/MimeKit/Cryptography/DkimSignatureStream.cs +++ b/MimeKit/Cryptography/DkimSignatureStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSigner.cs b/MimeKit/Cryptography/DkimSigner.cs index db24cf926f..8b86833d92 100644 --- a/MimeKit/Cryptography/DkimSigner.cs +++ b/MimeKit/Cryptography/DkimSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSignerBase.cs b/MimeKit/Cryptography/DkimSignerBase.cs index 53a389885d..a7f525785e 100644 --- a/MimeKit/Cryptography/DkimSignerBase.cs +++ b/MimeKit/Cryptography/DkimSignerBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs index dd9a30fe5e..1c1e440f57 100644 --- a/MimeKit/Cryptography/DkimSimpleBodyFilter.cs +++ b/MimeKit/Cryptography/DkimSimpleBodyFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index deeec18b74..f45745ed73 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index f599908e5b..2528b610a6 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/Ed25519DigestSigner.cs b/MimeKit/Cryptography/Ed25519DigestSigner.cs index ed747e7f87..5f00ab5639 100644 --- a/MimeKit/Cryptography/Ed25519DigestSigner.cs +++ b/MimeKit/Cryptography/Ed25519DigestSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/EncryptionAlgorithm.cs b/MimeKit/Cryptography/EncryptionAlgorithm.cs index 3f9a92b22d..cc092f2d6f 100644 --- a/MimeKit/Cryptography/EncryptionAlgorithm.cs +++ b/MimeKit/Cryptography/EncryptionAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/GnuPGContext.cs b/MimeKit/Cryptography/GnuPGContext.cs index 6e13d23a7f..efbe928782 100644 --- a/MimeKit/Cryptography/GnuPGContext.cs +++ b/MimeKit/Cryptography/GnuPGContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDigitalCertificate.cs b/MimeKit/Cryptography/IDigitalCertificate.cs index 550edf4c55..45e6fac287 100644 --- a/MimeKit/Cryptography/IDigitalCertificate.cs +++ b/MimeKit/Cryptography/IDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDigitalSignature.cs b/MimeKit/Cryptography/IDigitalSignature.cs index 21a489b1bf..aa26eb09df 100644 --- a/MimeKit/Cryptography/IDigitalSignature.cs +++ b/MimeKit/Cryptography/IDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs index 4a21d2c78f..c729dbf2d4 100644 --- a/MimeKit/Cryptography/IDkimPublicKeyLocator.cs +++ b/MimeKit/Cryptography/IDkimPublicKeyLocator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/IX509CertificateDatabase.cs b/MimeKit/Cryptography/IX509CertificateDatabase.cs index e97bf14436..9be106ad4f 100644 --- a/MimeKit/Cryptography/IX509CertificateDatabase.cs +++ b/MimeKit/Cryptography/IX509CertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/MultipartEncrypted.cs b/MimeKit/Cryptography/MultipartEncrypted.cs index e3141bcda3..d6a69fc9a4 100644 --- a/MimeKit/Cryptography/MultipartEncrypted.cs +++ b/MimeKit/Cryptography/MultipartEncrypted.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/MultipartSigned.cs b/MimeKit/Cryptography/MultipartSigned.cs index 7142e7918b..04b30c01ad 100644 --- a/MimeKit/Cryptography/MultipartSigned.cs +++ b/MimeKit/Cryptography/MultipartSigned.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpBlockFilter.cs b/MimeKit/Cryptography/OpenPgpBlockFilter.cs index 97ca32f1bb..d5c109b42d 100644 --- a/MimeKit/Cryptography/OpenPgpBlockFilter.cs +++ b/MimeKit/Cryptography/OpenPgpBlockFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpContext.cs b/MimeKit/Cryptography/OpenPgpContext.cs index b5eb36ab56..37c504d5ef 100644 --- a/MimeKit/Cryptography/OpenPgpContext.cs +++ b/MimeKit/Cryptography/OpenPgpContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpContextBase.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs index 18ae393ff2..5a9b8a843a 100644 --- a/MimeKit/Cryptography/OpenPgpContextBase.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -4,7 +4,7 @@ // Authors: Jeffrey Stedfast // Thomas Hansen // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDataType.cs b/MimeKit/Cryptography/OpenPgpDataType.cs index 934ac58a3f..55cdc30718 100644 --- a/MimeKit/Cryptography/OpenPgpDataType.cs +++ b/MimeKit/Cryptography/OpenPgpDataType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs index 64b5810b02..ea9c7574c5 100644 --- a/MimeKit/Cryptography/OpenPgpDetectionFilter.cs +++ b/MimeKit/Cryptography/OpenPgpDetectionFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs index ebdc5a7497..bba0c865a5 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs index 52d9dfa170..63073ff3c3 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/OpenPgpKeyCertification.cs b/MimeKit/Cryptography/OpenPgpKeyCertification.cs index 36d6147ad2..656315b5c7 100644 --- a/MimeKit/Cryptography/OpenPgpKeyCertification.cs +++ b/MimeKit/Cryptography/OpenPgpKeyCertification.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs index 4695e025de..b4bf7bb259 100644 --- a/MimeKit/Cryptography/PrivateKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PrivateKeyNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PublicKeyAlgorithm.cs b/MimeKit/Cryptography/PublicKeyAlgorithm.cs index a2b60f9b2f..8ece4b6096 100644 --- a/MimeKit/Cryptography/PublicKeyAlgorithm.cs +++ b/MimeKit/Cryptography/PublicKeyAlgorithm.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/PublicKeyNotFoundException.cs b/MimeKit/Cryptography/PublicKeyNotFoundException.cs index cc258cba6e..2221f8f000 100644 --- a/MimeKit/Cryptography/PublicKeyNotFoundException.cs +++ b/MimeKit/Cryptography/PublicKeyNotFoundException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaEncryptionPadding.cs b/MimeKit/Cryptography/RsaEncryptionPadding.cs index 77fb38d878..e009605a8e 100644 --- a/MimeKit/Cryptography/RsaEncryptionPadding.cs +++ b/MimeKit/Cryptography/RsaEncryptionPadding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs index 60276291bd..c867bc3778 100644 --- a/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs +++ b/MimeKit/Cryptography/RsaEncryptionPaddingScheme.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaSignaturePadding.cs b/MimeKit/Cryptography/RsaSignaturePadding.cs index 29dc55efb5..dce313236e 100644 --- a/MimeKit/Cryptography/RsaSignaturePadding.cs +++ b/MimeKit/Cryptography/RsaSignaturePadding.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs index 1738b1e002..c408c47877 100644 --- a/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs +++ b/MimeKit/Cryptography/RsaSignaturePaddingScheme.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMailboxAddress.cs b/MimeKit/Cryptography/SecureMailboxAddress.cs index 7ee8aa261e..c93bd8dc90 100644 --- a/MimeKit/Cryptography/SecureMailboxAddress.cs +++ b/MimeKit/Cryptography/SecureMailboxAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeContext.cs b/MimeKit/Cryptography/SecureMimeContext.cs index 64779b462b..2aa2978f6b 100644 --- a/MimeKit/Cryptography/SecureMimeContext.cs +++ b/MimeKit/Cryptography/SecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs index f57158e959..073460a142 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalCertificate.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 9b4bf9ed1e..61c3f8c302 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SecureMimeType.cs b/MimeKit/Cryptography/SecureMimeType.cs index 7c0929db67..150e0022f2 100644 --- a/MimeKit/Cryptography/SecureMimeType.cs +++ b/MimeKit/Cryptography/SecureMimeType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index c536fbd1b1..4bdaadaa25 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index 7e3b1b8b3a..c37e68f0a0 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/SubjectIdentifierType.cs b/MimeKit/Cryptography/SubjectIdentifierType.cs index 3be42608d6..6206f45f71 100644 --- a/MimeKit/Cryptography/SubjectIdentifierType.cs +++ b/MimeKit/Cryptography/SubjectIdentifierType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/TemporarySecureMimeContext.cs b/MimeKit/Cryptography/TemporarySecureMimeContext.cs index c0e4b1e2c4..7400847475 100644 --- a/MimeKit/Cryptography/TemporarySecureMimeContext.cs +++ b/MimeKit/Cryptography/TemporarySecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index df5a78a76e..6d78974b30 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateChain.cs b/MimeKit/Cryptography/X509CertificateChain.cs index 7a99a7ca80..9193fe323a 100644 --- a/MimeKit/Cryptography/X509CertificateChain.cs +++ b/MimeKit/Cryptography/X509CertificateChain.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateDatabase.cs b/MimeKit/Cryptography/X509CertificateDatabase.cs index f1c7e8669c..2a64837a3d 100644 --- a/MimeKit/Cryptography/X509CertificateDatabase.cs +++ b/MimeKit/Cryptography/X509CertificateDatabase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateRecord.cs b/MimeKit/Cryptography/X509CertificateRecord.cs index 089c61e217..fa971db127 100644 --- a/MimeKit/Cryptography/X509CertificateRecord.cs +++ b/MimeKit/Cryptography/X509CertificateRecord.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CertificateStore.cs b/MimeKit/Cryptography/X509CertificateStore.cs index 9bff29562d..6bdd6e0c22 100644 --- a/MimeKit/Cryptography/X509CertificateStore.cs +++ b/MimeKit/Cryptography/X509CertificateStore.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509CrlRecord.cs b/MimeKit/Cryptography/X509CrlRecord.cs index e62ca2aabc..1bb17b6eec 100644 --- a/MimeKit/Cryptography/X509CrlRecord.cs +++ b/MimeKit/Cryptography/X509CrlRecord.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Cryptography/X509KeyUsageFlags.cs b/MimeKit/Cryptography/X509KeyUsageFlags.cs index 8dbe539747..689924acd6 100644 --- a/MimeKit/Cryptography/X509KeyUsageFlags.cs +++ b/MimeKit/Cryptography/X509KeyUsageFlags.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/DomainList.cs b/MimeKit/DomainList.cs index c9f3cfe8df..778960781e 100644 --- a/MimeKit/DomainList.cs +++ b/MimeKit/DomainList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/EncodingConstraint.cs b/MimeKit/EncodingConstraint.cs index 0793a9536f..d3ce03b205 100644 --- a/MimeKit/EncodingConstraint.cs +++ b/MimeKit/EncodingConstraint.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/Base64Decoder.cs b/MimeKit/Encodings/Base64Decoder.cs index b2807d179a..ba2e5b2aca 100644 --- a/MimeKit/Encodings/Base64Decoder.cs +++ b/MimeKit/Encodings/Base64Decoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/Base64Encoder.cs b/MimeKit/Encodings/Base64Encoder.cs index dac04562a9..5dcf0f45ec 100644 --- a/MimeKit/Encodings/Base64Encoder.cs +++ b/MimeKit/Encodings/Base64Encoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/HexDecoder.cs b/MimeKit/Encodings/HexDecoder.cs index 4d793e40b0..d7fb2e5155 100644 --- a/MimeKit/Encodings/HexDecoder.cs +++ b/MimeKit/Encodings/HexDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/HexEncoder.cs b/MimeKit/Encodings/HexEncoder.cs index 175fc84c64..5a7beaea5d 100644 --- a/MimeKit/Encodings/HexEncoder.cs +++ b/MimeKit/Encodings/HexEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/IMimeDecoder.cs b/MimeKit/Encodings/IMimeDecoder.cs index 091a6771e0..dec3d763ef 100644 --- a/MimeKit/Encodings/IMimeDecoder.cs +++ b/MimeKit/Encodings/IMimeDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/IMimeEncoder.cs b/MimeKit/Encodings/IMimeEncoder.cs index ac7c240e67..741bb1255e 100644 --- a/MimeKit/Encodings/IMimeEncoder.cs +++ b/MimeKit/Encodings/IMimeEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/PassThroughDecoder.cs b/MimeKit/Encodings/PassThroughDecoder.cs index 98ad1513a2..87aaf73f6c 100644 --- a/MimeKit/Encodings/PassThroughDecoder.cs +++ b/MimeKit/Encodings/PassThroughDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/PassThroughEncoder.cs b/MimeKit/Encodings/PassThroughEncoder.cs index 9082be84af..3dc50db2ad 100644 --- a/MimeKit/Encodings/PassThroughEncoder.cs +++ b/MimeKit/Encodings/PassThroughEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QEncoder.cs b/MimeKit/Encodings/QEncoder.cs index 5b07ed4299..e8a5ba3d8c 100644 --- a/MimeKit/Encodings/QEncoder.cs +++ b/MimeKit/Encodings/QEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QuotedPrintableDecoder.cs b/MimeKit/Encodings/QuotedPrintableDecoder.cs index ddf6fe9f9c..eee3f167ac 100644 --- a/MimeKit/Encodings/QuotedPrintableDecoder.cs +++ b/MimeKit/Encodings/QuotedPrintableDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/QuotedPrintableEncoder.cs b/MimeKit/Encodings/QuotedPrintableEncoder.cs index ce5913cdd0..ff7d4fc892 100644 --- a/MimeKit/Encodings/QuotedPrintableEncoder.cs +++ b/MimeKit/Encodings/QuotedPrintableEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/UUDecoder.cs b/MimeKit/Encodings/UUDecoder.cs index 8f83e46779..59a86c8ed5 100644 --- a/MimeKit/Encodings/UUDecoder.cs +++ b/MimeKit/Encodings/UUDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/UUEncoder.cs b/MimeKit/Encodings/UUEncoder.cs index 84e6591654..eef18cdc1f 100644 --- a/MimeKit/Encodings/UUEncoder.cs +++ b/MimeKit/Encodings/UUEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/YDecoder.cs b/MimeKit/Encodings/YDecoder.cs index d60f945559..61d8cbbf5c 100644 --- a/MimeKit/Encodings/YDecoder.cs +++ b/MimeKit/Encodings/YDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Encodings/YEncoder.cs b/MimeKit/Encodings/YEncoder.cs index 31c8f677e9..0873eec5fe 100644 --- a/MimeKit/Encodings/YEncoder.cs +++ b/MimeKit/Encodings/YEncoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/FormatOptions.cs b/MimeKit/FormatOptions.cs index c382baa237..8866754dc8 100644 --- a/MimeKit/FormatOptions.cs +++ b/MimeKit/FormatOptions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 3f82e66128..3f29dc4d2e 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Header.cs b/MimeKit/Header.cs index d13f6728db..24b60853e1 100644 --- a/MimeKit/Header.cs +++ b/MimeKit/Header.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 923d096c88..33f8a8c16a 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index 81ca363ef9..0317d412fa 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderListChangedEventArgs.cs b/MimeKit/HeaderListChangedEventArgs.cs index 5972a2f7b8..7da76af394 100644 --- a/MimeKit/HeaderListChangedEventArgs.cs +++ b/MimeKit/HeaderListChangedEventArgs.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/HeaderListCollection.cs b/MimeKit/HeaderListCollection.cs index 4a704e7c70..211e113b6f 100644 --- a/MimeKit/HeaderListCollection.cs +++ b/MimeKit/HeaderListCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IMimeContent.cs b/MimeKit/IMimeContent.cs index 6271a3fff3..d14331c8b0 100644 --- a/MimeKit/IMimeContent.cs +++ b/MimeKit/IMimeContent.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/BoundStream.cs b/MimeKit/IO/BoundStream.cs index 8235b9fee5..0bc2c79cd0 100644 --- a/MimeKit/IO/BoundStream.cs +++ b/MimeKit/IO/BoundStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/ChainedStream.cs b/MimeKit/IO/ChainedStream.cs index 7a80dc08b1..7561e4c981 100644 --- a/MimeKit/IO/ChainedStream.cs +++ b/MimeKit/IO/ChainedStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/FilteredStream.cs b/MimeKit/IO/FilteredStream.cs index 833a361481..604bc8fe44 100644 --- a/MimeKit/IO/FilteredStream.cs +++ b/MimeKit/IO/FilteredStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/ArmoredFromFilter.cs b/MimeKit/IO/Filters/ArmoredFromFilter.cs index 0c96f3bb7d..48237a21d0 100644 --- a/MimeKit/IO/Filters/ArmoredFromFilter.cs +++ b/MimeKit/IO/Filters/ArmoredFromFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/BestEncodingFilter.cs b/MimeKit/IO/Filters/BestEncodingFilter.cs index acca9210d5..557d851f43 100644 --- a/MimeKit/IO/Filters/BestEncodingFilter.cs +++ b/MimeKit/IO/Filters/BestEncodingFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/CharsetFilter.cs b/MimeKit/IO/Filters/CharsetFilter.cs index 3f4c0f9e9a..d673fe366d 100644 --- a/MimeKit/IO/Filters/CharsetFilter.cs +++ b/MimeKit/IO/Filters/CharsetFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/DecoderFilter.cs b/MimeKit/IO/Filters/DecoderFilter.cs index 12a2ea3c59..c85cc491ba 100644 --- a/MimeKit/IO/Filters/DecoderFilter.cs +++ b/MimeKit/IO/Filters/DecoderFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/Dos2UnixFilter.cs b/MimeKit/IO/Filters/Dos2UnixFilter.cs index c478dab645..14978344f7 100644 --- a/MimeKit/IO/Filters/Dos2UnixFilter.cs +++ b/MimeKit/IO/Filters/Dos2UnixFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/EncoderFilter.cs b/MimeKit/IO/Filters/EncoderFilter.cs index 2156e683fc..8f261bc31a 100644 --- a/MimeKit/IO/Filters/EncoderFilter.cs +++ b/MimeKit/IO/Filters/EncoderFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/IMimeFilter.cs b/MimeKit/IO/Filters/IMimeFilter.cs index f707728039..01547422a3 100644 --- a/MimeKit/IO/Filters/IMimeFilter.cs +++ b/MimeKit/IO/Filters/IMimeFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/MimeFilterBase.cs b/MimeKit/IO/Filters/MimeFilterBase.cs index 295d1194e7..4f229b92b0 100644 --- a/MimeKit/IO/Filters/MimeFilterBase.cs +++ b/MimeKit/IO/Filters/MimeFilterBase.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/PassThroughFilter.cs b/MimeKit/IO/Filters/PassThroughFilter.cs index 7ae01a60f5..61bc497fe0 100644 --- a/MimeKit/IO/Filters/PassThroughFilter.cs +++ b/MimeKit/IO/Filters/PassThroughFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs index 286e7f2495..08916e5936 100644 --- a/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs +++ b/MimeKit/IO/Filters/TrailingWhitespaceFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/Filters/Unix2DosFilter.cs b/MimeKit/IO/Filters/Unix2DosFilter.cs index d9582dda51..d70f31e315 100644 --- a/MimeKit/IO/Filters/Unix2DosFilter.cs +++ b/MimeKit/IO/Filters/Unix2DosFilter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/ICancellableStream.cs b/MimeKit/IO/ICancellableStream.cs index 2e08f0b01e..2fa2c6dd52 100644 --- a/MimeKit/IO/ICancellableStream.cs +++ b/MimeKit/IO/ICancellableStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/MeasuringStream.cs b/MimeKit/IO/MeasuringStream.cs index fe188d9cc4..6ce1c70911 100644 --- a/MimeKit/IO/MeasuringStream.cs +++ b/MimeKit/IO/MeasuringStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index c9caad3419..0f3e6a0f5b 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index 14a822c4b3..d71fc2b21f 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/InternetAddressList.cs b/MimeKit/InternetAddressList.cs index 12b4d3b99e..e989bfc786 100644 --- a/MimeKit/InternetAddressList.cs +++ b/MimeKit/InternetAddressList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index a71cdfedc4..f8ab8d3910 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageDeliveryStatus.cs b/MimeKit/MessageDeliveryStatus.cs index bccef8a8fc..3495bdcdc3 100644 --- a/MimeKit/MessageDeliveryStatus.cs +++ b/MimeKit/MessageDeliveryStatus.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageDispositionNotification.cs b/MimeKit/MessageDispositionNotification.cs index 0bcba10419..975fc2404c 100644 --- a/MimeKit/MessageDispositionNotification.cs +++ b/MimeKit/MessageDispositionNotification.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageIdList.cs b/MimeKit/MessageIdList.cs index c7db71d502..52c435c5cb 100644 --- a/MimeKit/MessageIdList.cs +++ b/MimeKit/MessageIdList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessageImportance.cs b/MimeKit/MessageImportance.cs index 05e2cb7863..24867ca31e 100644 --- a/MimeKit/MessageImportance.cs +++ b/MimeKit/MessageImportance.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePart.cs b/MimeKit/MessagePart.cs index 9eb97e8241..763ad3fadf 100644 --- a/MimeKit/MessagePart.cs +++ b/MimeKit/MessagePart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePartial.cs b/MimeKit/MessagePartial.cs index 077476b1a2..75984864d3 100644 --- a/MimeKit/MessagePartial.cs +++ b/MimeKit/MessagePartial.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MessagePriority.cs b/MimeKit/MessagePriority.cs index a31bf5c236..e97261fc4d 100644 --- a/MimeKit/MessagePriority.cs +++ b/MimeKit/MessagePriority.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index 4ac25bc861..27cffac638 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index 397bab8a71..a654c28dff 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeEntityConstructorArgs.cs b/MimeKit/MimeEntityConstructorArgs.cs index a9730b3560..e2896bca85 100644 --- a/MimeKit/MimeEntityConstructorArgs.cs +++ b/MimeKit/MimeEntityConstructorArgs.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeFormat.cs b/MimeKit/MimeFormat.cs index 60d758b06c..30a169226a 100644 --- a/MimeKit/MimeFormat.cs +++ b/MimeKit/MimeFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeIterator.cs b/MimeKit/MimeIterator.cs index 0ac9b43002..1503d43c99 100644 --- a/MimeKit/MimeIterator.cs +++ b/MimeKit/MimeIterator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 7c3076bdcd..35fada6e3e 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index ba7d7f51e9..bffecbd9b2 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 7a20fafe79..39838b2fdc 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeTypes.cs b/MimeKit/MimeTypes.cs index 062a9bb4f5..957248b831 100644 --- a/MimeKit/MimeTypes.cs +++ b/MimeKit/MimeTypes.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MimeVisitor.cs b/MimeKit/MimeVisitor.cs index d0965ad780..39b2cad4be 100644 --- a/MimeKit/MimeVisitor.cs +++ b/MimeKit/MimeVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 8a2d43bd3e..976f1ed008 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartAlternative.cs b/MimeKit/MultipartAlternative.cs index c3d70e62b3..1fd29ff23c 100644 --- a/MimeKit/MultipartAlternative.cs +++ b/MimeKit/MultipartAlternative.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index 0d31955350..7522c166ef 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/MultipartReport.cs b/MimeKit/MultipartReport.cs index 745e90ec97..5754f098c7 100644 --- a/MimeKit/MultipartReport.cs +++ b/MimeKit/MultipartReport.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Parameter.cs b/MimeKit/Parameter.cs index ea5013952c..d773e86326 100644 --- a/MimeKit/Parameter.cs +++ b/MimeKit/Parameter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParameterEncodingMethod.cs b/MimeKit/ParameterEncodingMethod.cs index 7c7543ffb7..3670f6e8cc 100644 --- a/MimeKit/ParameterEncodingMethod.cs +++ b/MimeKit/ParameterEncodingMethod.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index e62cdda307..6f2bd91022 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParseException.cs b/MimeKit/ParseException.cs index dea64a3b26..1e87e66534 100644 --- a/MimeKit/ParseException.cs +++ b/MimeKit/ParseException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/ParserOptions.cs b/MimeKit/ParserOptions.cs index 037afa1679..e851f11f92 100644 --- a/MimeKit/ParserOptions.cs +++ b/MimeKit/ParserOptions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 990b2567bf..f559374a67 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -33,10 +33,10 @@ [assembly: AssemblyTitle ("MimeKit")] [assembly: AssemblyDescription ("A complete MIME library with support for S/MIME, PGP, DKIM and Unix mbox spools.")] [assembly: AssemblyConfiguration ("")] -[assembly: AssemblyCompany ("Xamarin Inc.")] +[assembly: AssemblyCompany (".NET Foundation")] [assembly: AssemblyProduct ("MimeKit")] -[assembly: AssemblyCopyright ("Copyright © 2013-2020 Xamarin Inc. (www.xamarin.com)")] -[assembly: AssemblyTrademark ("Xamarin Inc.")] +[assembly: AssemblyCopyright ("Copyright © 2013-2020 .NET Foundation and Contributors")] +[assembly: AssemblyTrademark (".NET Foundation")] [assembly: AssemblyCulture ("")] // Setting ComVisible to false makes the types in this assembly not visible diff --git a/MimeKit/RfcComplianceMode.cs b/MimeKit/RfcComplianceMode.cs index d4caa9630d..2522f2fb25 100644 --- a/MimeKit/RfcComplianceMode.cs +++ b/MimeKit/RfcComplianceMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/CharBuffer.cs b/MimeKit/Text/CharBuffer.cs index 02ca0df608..6afdac1e7e 100644 --- a/MimeKit/Text/CharBuffer.cs +++ b/MimeKit/Text/CharBuffer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/FlowedToHtml.cs b/MimeKit/Text/FlowedToHtml.cs index c149e6fc8a..22f77dccec 100644 --- a/MimeKit/Text/FlowedToHtml.cs +++ b/MimeKit/Text/FlowedToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/FlowedToText.cs b/MimeKit/Text/FlowedToText.cs index 33f61ffe56..3b0092fc64 100644 --- a/MimeKit/Text/FlowedToText.cs +++ b/MimeKit/Text/FlowedToText.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HeaderFooterFormat.cs b/MimeKit/Text/HeaderFooterFormat.cs index a15d1c544b..a5bd0ebdbd 100644 --- a/MimeKit/Text/HeaderFooterFormat.cs +++ b/MimeKit/Text/HeaderFooterFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttribute.cs b/MimeKit/Text/HtmlAttribute.cs index 1379a43d88..3586c5942f 100644 --- a/MimeKit/Text/HtmlAttribute.cs +++ b/MimeKit/Text/HtmlAttribute.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttributeCollection.cs b/MimeKit/Text/HtmlAttributeCollection.cs index f47657985c..e805c2fbec 100644 --- a/MimeKit/Text/HtmlAttributeCollection.cs +++ b/MimeKit/Text/HtmlAttributeCollection.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlAttributeId.cs b/MimeKit/Text/HtmlAttributeId.cs index eae46511bc..7c61ead19a 100644 --- a/MimeKit/Text/HtmlAttributeId.cs +++ b/MimeKit/Text/HtmlAttributeId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlEntityDecoder.cs b/MimeKit/Text/HtmlEntityDecoder.cs index e339715ce5..3838bdcd19 100644 --- a/MimeKit/Text/HtmlEntityDecoder.cs +++ b/MimeKit/Text/HtmlEntityDecoder.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlEntityDecoder.g.cs b/MimeKit/Text/HtmlEntityDecoder.g.cs index c642be92be..f9cc9c908c 100644 --- a/MimeKit/Text/HtmlEntityDecoder.g.cs +++ b/MimeKit/Text/HtmlEntityDecoder.g.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlNamespace.cs b/MimeKit/Text/HtmlNamespace.cs index 270dbeb44b..ee4d935c72 100644 --- a/MimeKit/Text/HtmlNamespace.cs +++ b/MimeKit/Text/HtmlNamespace.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagCallback.cs b/MimeKit/Text/HtmlTagCallback.cs index 1a23d0f8d3..61deac18f1 100644 --- a/MimeKit/Text/HtmlTagCallback.cs +++ b/MimeKit/Text/HtmlTagCallback.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagContext.cs b/MimeKit/Text/HtmlTagContext.cs index 829e2cfb52..ac36b76639 100644 --- a/MimeKit/Text/HtmlTagContext.cs +++ b/MimeKit/Text/HtmlTagContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTagId.cs b/MimeKit/Text/HtmlTagId.cs index f5d0f87041..a6f57ce06a 100644 --- a/MimeKit/Text/HtmlTagId.cs +++ b/MimeKit/Text/HtmlTagId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTextPreviewer.cs b/MimeKit/Text/HtmlTextPreviewer.cs index 6eba082c7c..b3e2e11943 100644 --- a/MimeKit/Text/HtmlTextPreviewer.cs +++ b/MimeKit/Text/HtmlTextPreviewer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlToHtml.cs b/MimeKit/Text/HtmlToHtml.cs index e2afb775ed..c9b4abf9d6 100644 --- a/MimeKit/Text/HtmlToHtml.cs +++ b/MimeKit/Text/HtmlToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlToken.cs b/MimeKit/Text/HtmlToken.cs index edc9a6103e..fd85943a79 100644 --- a/MimeKit/Text/HtmlToken.cs +++ b/MimeKit/Text/HtmlToken.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenKind.cs b/MimeKit/Text/HtmlTokenKind.cs index fa595a9d62..0ff55fa49b 100644 --- a/MimeKit/Text/HtmlTokenKind.cs +++ b/MimeKit/Text/HtmlTokenKind.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenizer.cs b/MimeKit/Text/HtmlTokenizer.cs index 91d223cfba..b414052c58 100644 --- a/MimeKit/Text/HtmlTokenizer.cs +++ b/MimeKit/Text/HtmlTokenizer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlTokenizerState.cs b/MimeKit/Text/HtmlTokenizerState.cs index 06b26ee985..9737df10be 100644 --- a/MimeKit/Text/HtmlTokenizerState.cs +++ b/MimeKit/Text/HtmlTokenizerState.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlUtils.cs b/MimeKit/Text/HtmlUtils.cs index 61ed9abecc..17dce53993 100644 --- a/MimeKit/Text/HtmlUtils.cs +++ b/MimeKit/Text/HtmlUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlWriter.cs b/MimeKit/Text/HtmlWriter.cs index e652066cd5..ee7cee8e9e 100644 --- a/MimeKit/Text/HtmlWriter.cs +++ b/MimeKit/Text/HtmlWriter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/HtmlWriterState.cs b/MimeKit/Text/HtmlWriterState.cs index 1d6c31cce6..2836a8d91a 100644 --- a/MimeKit/Text/HtmlWriterState.cs +++ b/MimeKit/Text/HtmlWriterState.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/ICharArray.cs b/MimeKit/Text/ICharArray.cs index 35bcf406c9..cefb92b9c0 100644 --- a/MimeKit/Text/ICharArray.cs +++ b/MimeKit/Text/ICharArray.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/PlainTextPreviewer.cs b/MimeKit/Text/PlainTextPreviewer.cs index 2f171e4f52..9adffd091f 100644 --- a/MimeKit/Text/PlainTextPreviewer.cs +++ b/MimeKit/Text/PlainTextPreviewer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextConverter.cs b/MimeKit/Text/TextConverter.cs index 4c374d9763..2003c39185 100644 --- a/MimeKit/Text/TextConverter.cs +++ b/MimeKit/Text/TextConverter.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextFormat.cs b/MimeKit/Text/TextFormat.cs index e32bf2d009..673f2a2ffb 100644 --- a/MimeKit/Text/TextFormat.cs +++ b/MimeKit/Text/TextFormat.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextPreviewer.cs b/MimeKit/Text/TextPreviewer.cs index 91c56e517b..b0b195cb3c 100644 --- a/MimeKit/Text/TextPreviewer.cs +++ b/MimeKit/Text/TextPreviewer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToFlowed.cs b/MimeKit/Text/TextToFlowed.cs index 2b888af316..c3263376a0 100644 --- a/MimeKit/Text/TextToFlowed.cs +++ b/MimeKit/Text/TextToFlowed.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToHtml.cs b/MimeKit/Text/TextToHtml.cs index e884ce29e7..8613630cf5 100644 --- a/MimeKit/Text/TextToHtml.cs +++ b/MimeKit/Text/TextToHtml.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/TextToText.cs b/MimeKit/Text/TextToText.cs index 6c35659a7e..5df0bf1fdd 100644 --- a/MimeKit/Text/TextToText.cs +++ b/MimeKit/Text/TextToText.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/Trie.cs b/MimeKit/Text/Trie.cs index fa0b719982..0862261477 100644 --- a/MimeKit/Text/Trie.cs +++ b/MimeKit/Text/Trie.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Text/UrlScanner.cs b/MimeKit/Text/UrlScanner.cs index 415d4c3a3f..3b0dda748a 100644 --- a/MimeKit/Text/UrlScanner.cs +++ b/MimeKit/Text/UrlScanner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/TextPart.cs b/MimeKit/TextPart.cs index 65a30a3126..1f0cd42870 100644 --- a/MimeKit/TextPart.cs +++ b/MimeKit/TextPart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/TextRfc822Headers.cs b/MimeKit/TextRfc822Headers.cs index 34f1c0b983..6312345114 100644 --- a/MimeKit/TextRfc822Headers.cs +++ b/MimeKit/TextRfc822Headers.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/RtfCompressedToRtf.cs b/MimeKit/Tnef/RtfCompressedToRtf.cs index d58a6aeeb4..773c96f27c 100644 --- a/MimeKit/Tnef/RtfCompressedToRtf.cs +++ b/MimeKit/Tnef/RtfCompressedToRtf.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/RtfCompressionMode.cs b/MimeKit/Tnef/RtfCompressionMode.cs index 2e90f997e8..8949c0c630 100644 --- a/MimeKit/Tnef/RtfCompressionMode.cs +++ b/MimeKit/Tnef/RtfCompressionMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttachFlags.cs b/MimeKit/Tnef/TnefAttachFlags.cs index 9ea7fbf767..7ec444b88c 100644 --- a/MimeKit/Tnef/TnefAttachFlags.cs +++ b/MimeKit/Tnef/TnefAttachFlags.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttachMethod.cs b/MimeKit/Tnef/TnefAttachMethod.cs index 84bd7d06cb..558e394c40 100644 --- a/MimeKit/Tnef/TnefAttachMethod.cs +++ b/MimeKit/Tnef/TnefAttachMethod.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttributeLevel.cs b/MimeKit/Tnef/TnefAttributeLevel.cs index cc1ece4e0b..8f8fe1e1c3 100644 --- a/MimeKit/Tnef/TnefAttributeLevel.cs +++ b/MimeKit/Tnef/TnefAttributeLevel.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefAttributeTag.cs b/MimeKit/Tnef/TnefAttributeTag.cs index 5b3a28091b..66bbee38ba 100644 --- a/MimeKit/Tnef/TnefAttributeTag.cs +++ b/MimeKit/Tnef/TnefAttributeTag.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefComplianceMode.cs b/MimeKit/Tnef/TnefComplianceMode.cs index 14ac1d4467..8466abc7f0 100644 --- a/MimeKit/Tnef/TnefComplianceMode.cs +++ b/MimeKit/Tnef/TnefComplianceMode.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefComplianceStatus.cs b/MimeKit/Tnef/TnefComplianceStatus.cs index f7f9485d52..201f953953 100644 --- a/MimeKit/Tnef/TnefComplianceStatus.cs +++ b/MimeKit/Tnef/TnefComplianceStatus.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefException.cs b/MimeKit/Tnef/TnefException.cs index afbd2d74d5..5b8f2d9093 100644 --- a/MimeKit/Tnef/TnefException.cs +++ b/MimeKit/Tnef/TnefException.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefNameId.cs b/MimeKit/Tnef/TnefNameId.cs index d12e7b75f7..201b0a95e2 100644 --- a/MimeKit/Tnef/TnefNameId.cs +++ b/MimeKit/Tnef/TnefNameId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefNameIdKind.cs b/MimeKit/Tnef/TnefNameIdKind.cs index 5b5d61c001..ff1c580e10 100644 --- a/MimeKit/Tnef/TnefNameIdKind.cs +++ b/MimeKit/Tnef/TnefNameIdKind.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index c60bf8702f..ad6453651e 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyId.cs b/MimeKit/Tnef/TnefPropertyId.cs index f5c93c6182..d4405fb330 100644 --- a/MimeKit/Tnef/TnefPropertyId.cs +++ b/MimeKit/Tnef/TnefPropertyId.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index 4c5c04006b..c1f9e8da5a 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyTag.cs b/MimeKit/Tnef/TnefPropertyTag.cs index d26fad5cd6..a72d50cbd2 100644 --- a/MimeKit/Tnef/TnefPropertyTag.cs +++ b/MimeKit/Tnef/TnefPropertyTag.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefPropertyType.cs b/MimeKit/Tnef/TnefPropertyType.cs index fba42c7b8d..b0270a6538 100644 --- a/MimeKit/Tnef/TnefPropertyType.cs +++ b/MimeKit/Tnef/TnefPropertyType.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index 01ed32e19d..87f4bfa62e 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Tnef/TnefReaderStream.cs b/MimeKit/Tnef/TnefReaderStream.cs index 2abcdd5248..70d9b35869 100644 --- a/MimeKit/Tnef/TnefReaderStream.cs +++ b/MimeKit/Tnef/TnefReaderStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/BufferPool.cs b/MimeKit/Utils/BufferPool.cs index 764f409ce1..eb831583ad 100644 --- a/MimeKit/Utils/BufferPool.cs +++ b/MimeKit/Utils/BufferPool.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/ByteExtensions.cs b/MimeKit/Utils/ByteExtensions.cs index ca34061ed2..8edd7a1bb1 100644 --- a/MimeKit/Utils/ByteExtensions.cs +++ b/MimeKit/Utils/ByteExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index 13aa8404e0..7d8362bed6 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/Crc32.cs b/MimeKit/Utils/Crc32.cs index a93874ad15..63730f642f 100644 --- a/MimeKit/Utils/Crc32.cs +++ b/MimeKit/Utils/Crc32.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index 57dbaf5b4f..aeccd451e7 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 93890adf17..7afea00491 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/OptimizedOrdinalComparer.cs b/MimeKit/Utils/OptimizedOrdinalComparer.cs index 919d751861..b5ba6d3047 100644 --- a/MimeKit/Utils/OptimizedOrdinalComparer.cs +++ b/MimeKit/Utils/OptimizedOrdinalComparer.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/PackedByteArray.cs b/MimeKit/Utils/PackedByteArray.cs index 94cb6412f5..5ea52ac4b8 100644 --- a/MimeKit/Utils/PackedByteArray.cs +++ b/MimeKit/Utils/PackedByteArray.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index f13c3fd525..7ad8ea1b1c 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/Rfc2047.cs b/MimeKit/Utils/Rfc2047.cs index e995cc16a5..948ec353ee 100644 --- a/MimeKit/Utils/Rfc2047.cs +++ b/MimeKit/Utils/Rfc2047.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/Utils/StringBuilderExtensions.cs b/MimeKit/Utils/StringBuilderExtensions.cs index f2c065424b..c9f90fd462 100644 --- a/MimeKit/Utils/StringBuilderExtensions.cs +++ b/MimeKit/Utils/StringBuilderExtensions.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/MimeKit/XMessagePriority.cs b/MimeKit/XMessagePriority.cs index b4fd7d76de..cf4a84ced8 100644 --- a/MimeKit/XMessagePriority.cs +++ b/MimeKit/XMessagePriority.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index b7f0bd0d6f..849e55ef5c 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AssortedTests.cs b/UnitTests/AssortedTests.cs index d71e08b808..46b0f03d4b 100644 --- a/UnitTests/AssortedTests.cs +++ b/UnitTests/AssortedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index f7869de89f..0d963f2c2b 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ConstructorTests.cs b/UnitTests/ConstructorTests.cs index e70067ba86..cb5da4db5d 100644 --- a/UnitTests/ConstructorTests.cs +++ b/UnitTests/ConstructorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentDispositionTests.cs b/UnitTests/ContentDispositionTests.cs index 56a722c38b..1360488026 100644 --- a/UnitTests/ContentDispositionTests.cs +++ b/UnitTests/ContentDispositionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentObjectTests.cs b/UnitTests/ContentObjectTests.cs index 5fc2cd807a..8b11c1f20b 100644 --- a/UnitTests/ContentObjectTests.cs +++ b/UnitTests/ContentObjectTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index bb90243c54..1d5995832d 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs index 509a605383..301801f006 100644 --- a/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs +++ b/UnitTests/Cryptography/ApplicationPkcs7MimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ArcSignerTests.cs b/UnitTests/Cryptography/ArcSignerTests.cs index 4cbcaa35ed..722535b48c 100644 --- a/UnitTests/Cryptography/ArcSignerTests.cs +++ b/UnitTests/Cryptography/ArcSignerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index 5e0166b0e6..8deee7e6a5 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index 2ad3528eea..cb7b19adeb 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 7817d2633f..5d1761d6b5 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CertificateExtensionTests.cs b/UnitTests/Cryptography/CertificateExtensionTests.cs index 35909f07c0..5d43df15af 100644 --- a/UnitTests/Cryptography/CertificateExtensionTests.cs +++ b/UnitTests/Cryptography/CertificateExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsRecipientTests.cs b/UnitTests/Cryptography/CmsRecipientTests.cs index 2146e37c80..779610ef71 100644 --- a/UnitTests/Cryptography/CmsRecipientTests.cs +++ b/UnitTests/Cryptography/CmsRecipientTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/CmsSignerTests.cs b/UnitTests/Cryptography/CmsSignerTests.cs index 84e6eaa170..3bc847351d 100644 --- a/UnitTests/Cryptography/CmsSignerTests.cs +++ b/UnitTests/Cryptography/CmsSignerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs index f3581fa536..179688bed0 100644 --- a/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs +++ b/UnitTests/Cryptography/DefaultSecureMimeContextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimPublicKeyLocator.cs b/UnitTests/Cryptography/DkimPublicKeyLocator.cs index 004f2dc480..f59d899906 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocator.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocator.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs index 9b67149c8a..db4f381223 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs index a8f6cf92d9..053d4276fd 100644 --- a/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs +++ b/UnitTests/Cryptography/DkimRelaxedBodyFilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DkimTests.cs b/UnitTests/Cryptography/DkimTests.cs index 4156ae6324..c6299d9dca 100644 --- a/UnitTests/Cryptography/DkimTests.cs +++ b/UnitTests/Cryptography/DkimTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DummyArcSigner.cs b/UnitTests/Cryptography/DummyArcSigner.cs index 368c2350cd..29ed69bd79 100644 --- a/UnitTests/Cryptography/DummyArcSigner.cs +++ b/UnitTests/Cryptography/DummyArcSigner.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/DummyOpenPgpContext.cs b/UnitTests/Cryptography/DummyOpenPgpContext.cs index a293d51a18..c0602e9381 100644 --- a/UnitTests/Cryptography/DummyOpenPgpContext.cs +++ b/UnitTests/Cryptography/DummyOpenPgpContext.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/LdapUriTests.cs b/UnitTests/Cryptography/LdapUriTests.cs index 18fee21dfc..50ac20d27b 100644 --- a/UnitTests/Cryptography/LdapUriTests.cs +++ b/UnitTests/Cryptography/LdapUriTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index 681ba4ce93..a5eae4b2c8 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs index b06d19540f..45ff33dc9c 100644 --- a/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs +++ b/UnitTests/Cryptography/RsaEncryptionPaddingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs index 02ca3a9270..85d351418d 100644 --- a/UnitTests/Cryptography/RsaSignaturePaddingTests.cs +++ b/UnitTests/Cryptography/RsaSignaturePaddingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs index 94e7958121..6a41b55f14 100644 --- a/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs +++ b/UnitTests/Cryptography/SecureMimeDigitalCertificateTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SecureMimeTests.cs b/UnitTests/Cryptography/SecureMimeTests.cs index c0ac035cf9..6949198d6e 100644 --- a/UnitTests/Cryptography/SecureMimeTests.cs +++ b/UnitTests/Cryptography/SecureMimeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs index 6ec4a59528..737b4c0504 100644 --- a/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs +++ b/UnitTests/Cryptography/SqliteCertificateDatabaseTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateChainTests.cs b/UnitTests/Cryptography/X509CertificateChainTests.cs index f44e6a8a0b..afce0edcd4 100644 --- a/UnitTests/Cryptography/X509CertificateChainTests.cs +++ b/UnitTests/Cryptography/X509CertificateChainTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateRecordTests.cs b/UnitTests/Cryptography/X509CertificateRecordTests.cs index a386cba232..20449bce61 100644 --- a/UnitTests/Cryptography/X509CertificateRecordTests.cs +++ b/UnitTests/Cryptography/X509CertificateRecordTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Cryptography/X509CertificateStoreTests.cs b/UnitTests/Cryptography/X509CertificateStoreTests.cs index 5b54b50833..3c81ae05c8 100644 --- a/UnitTests/Cryptography/X509CertificateStoreTests.cs +++ b/UnitTests/Cryptography/X509CertificateStoreTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/DomainListTests.cs b/UnitTests/DomainListTests.cs index e797b84d06..0168972f01 100644 --- a/UnitTests/DomainListTests.cs +++ b/UnitTests/DomainListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/EncoderTests.cs b/UnitTests/Encodings/EncoderTests.cs index 070c54aea8..3c8c0f1eca 100644 --- a/UnitTests/Encodings/EncoderTests.cs +++ b/UnitTests/Encodings/EncoderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Encodings/YEncodingTests.cs b/UnitTests/Encodings/YEncodingTests.cs index 3c250f48df..e749154a5e 100644 --- a/UnitTests/Encodings/YEncodingTests.cs +++ b/UnitTests/Encodings/YEncodingTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ExceptionTests.cs b/UnitTests/ExceptionTests.cs index 4673fd6b0a..aeb3b2c3f8 100644 --- a/UnitTests/ExceptionTests.cs +++ b/UnitTests/ExceptionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/FormatOptionsTests.cs b/UnitTests/FormatOptionsTests.cs index 4e746c03a7..979425c31e 100644 --- a/UnitTests/FormatOptionsTests.cs +++ b/UnitTests/FormatOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/GroupAddressTests.cs b/UnitTests/GroupAddressTests.cs index 178ffe5d22..982e8a0c02 100644 --- a/UnitTests/GroupAddressTests.cs +++ b/UnitTests/GroupAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderListTests.cs b/UnitTests/HeaderListTests.cs index 99142b774e..fb88312b99 100644 --- a/UnitTests/HeaderListTests.cs +++ b/UnitTests/HeaderListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index cc98d2a447..7d01084828 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/HtmlPreviewVisitor.cs b/UnitTests/HtmlPreviewVisitor.cs index 385122a782..55020dfb20 100644 --- a/UnitTests/HtmlPreviewVisitor.cs +++ b/UnitTests/HtmlPreviewVisitor.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/BoundStreamTests.cs b/UnitTests/IO/BoundStreamTests.cs index e5ef0cf1f4..36a527e757 100644 --- a/UnitTests/IO/BoundStreamTests.cs +++ b/UnitTests/IO/BoundStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/CanReadWriteSeekStream.cs b/UnitTests/IO/CanReadWriteSeekStream.cs index 9e512cd6d4..8f7e6625aa 100644 --- a/UnitTests/IO/CanReadWriteSeekStream.cs +++ b/UnitTests/IO/CanReadWriteSeekStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ChainedStreamTests.cs b/UnitTests/IO/ChainedStreamTests.cs index 590bc61bc7..ae824e0fe1 100644 --- a/UnitTests/IO/ChainedStreamTests.cs +++ b/UnitTests/IO/ChainedStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/FilteredStreamTests.cs b/UnitTests/IO/FilteredStreamTests.cs index 36c4b911b4..34ebd682c6 100644 --- a/UnitTests/IO/FilteredStreamTests.cs +++ b/UnitTests/IO/FilteredStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/Filters/FilterTests.cs b/UnitTests/IO/Filters/FilterTests.cs index d85c71b161..a45539fc47 100644 --- a/UnitTests/IO/Filters/FilterTests.cs +++ b/UnitTests/IO/Filters/FilterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MeasuringStreamTests.cs b/UnitTests/IO/MeasuringStreamTests.cs index bd13fe4337..8e8543681e 100644 --- a/UnitTests/IO/MeasuringStreamTests.cs +++ b/UnitTests/IO/MeasuringStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index 6df4592a7a..05704b3d1c 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/ReadOneByteStream.cs b/UnitTests/IO/ReadOneByteStream.cs index 6a02086bbc..c6a9222493 100644 --- a/UnitTests/IO/ReadOneByteStream.cs +++ b/UnitTests/IO/ReadOneByteStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/IO/TimeoutStream.cs b/UnitTests/IO/TimeoutStream.cs index 4214ce37aa..cb0dc72c73 100644 --- a/UnitTests/IO/TimeoutStream.cs +++ b/UnitTests/IO/TimeoutStream.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressListTests.cs b/UnitTests/InternetAddressListTests.cs index 74ad609521..141a3a0cbb 100644 --- a/UnitTests/InternetAddressListTests.cs +++ b/UnitTests/InternetAddressListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index 7bbfb1d296..0dcd5bfe78 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index 07b1af976d..bbe9142404 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDeliveryStatusTests.cs b/UnitTests/MessageDeliveryStatusTests.cs index 80efc23853..21e497603a 100644 --- a/UnitTests/MessageDeliveryStatusTests.cs +++ b/UnitTests/MessageDeliveryStatusTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageDispositionNotificiationTests.cs b/UnitTests/MessageDispositionNotificiationTests.cs index 077ec5179d..c94d7f9343 100644 --- a/UnitTests/MessageDispositionNotificiationTests.cs +++ b/UnitTests/MessageDispositionNotificiationTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessageIdListTests.cs b/UnitTests/MessageIdListTests.cs index 02a506c5c4..db91b5ae72 100644 --- a/UnitTests/MessageIdListTests.cs +++ b/UnitTests/MessageIdListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MessagePartialTests.cs b/UnitTests/MessagePartialTests.cs index 8b5352881e..47030f6b2a 100644 --- a/UnitTests/MessagePartialTests.cs +++ b/UnitTests/MessagePartialTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeIteratorTests.cs b/UnitTests/MimeIteratorTests.cs index 25e97331cb..fa9f259d07 100644 --- a/UnitTests/MimeIteratorTests.cs +++ b/UnitTests/MimeIteratorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeMessageTests.cs b/UnitTests/MimeMessageTests.cs index 2a7f7fc44e..c2d113b3c9 100644 --- a/UnitTests/MimeMessageTests.cs +++ b/UnitTests/MimeMessageTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index a53605315f..f54585966d 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 9cb0d72f20..2626988c29 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeTypeTests.cs b/UnitTests/MimeTypeTests.cs index 3c1faa3587..4e9e26e269 100644 --- a/UnitTests/MimeTypeTests.cs +++ b/UnitTests/MimeTypeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index b90f214a44..a1ef7b3639 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartAlternativeTests.cs b/UnitTests/MultipartAlternativeTests.cs index 70eb0a0093..f2d4bab563 100644 --- a/UnitTests/MultipartAlternativeTests.cs +++ b/UnitTests/MultipartAlternativeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index 0b38d0447e..53c590c120 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartReportTests.cs b/UnitTests/MultipartReportTests.cs index 93268dbaf1..77dd1ba449 100644 --- a/UnitTests/MultipartReportTests.cs +++ b/UnitTests/MultipartReportTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/MultipartTests.cs b/UnitTests/MultipartTests.cs index d253488eb9..f97bba736d 100644 --- a/UnitTests/MultipartTests.cs +++ b/UnitTests/MultipartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterListTests.cs b/UnitTests/ParameterListTests.cs index fba53800d0..970e308c4b 100644 --- a/UnitTests/ParameterListTests.cs +++ b/UnitTests/ParameterListTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParameterTests.cs b/UnitTests/ParameterTests.cs index cfcd5b0f1a..d87ea4659a 100644 --- a/UnitTests/ParameterTests.cs +++ b/UnitTests/ParameterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/ParserOptionsTests.cs b/UnitTests/ParserOptionsTests.cs index a521764fa5..ce6da9827e 100644 --- a/UnitTests/ParserOptionsTests.cs +++ b/UnitTests/ParserOptionsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TestHelper.cs b/UnitTests/TestHelper.cs index a0ead40d15..676225af16 100644 --- a/UnitTests/TestHelper.cs +++ b/UnitTests/TestHelper.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/FlowedToHtmlTests.cs b/UnitTests/Text/FlowedToHtmlTests.cs index b9d8109165..ddd2a0b91b 100644 --- a/UnitTests/Text/FlowedToHtmlTests.cs +++ b/UnitTests/Text/FlowedToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/FlowedToTextTests.cs b/UnitTests/Text/FlowedToTextTests.cs index c3c050511b..708b2ec684 100644 --- a/UnitTests/Text/FlowedToTextTests.cs +++ b/UnitTests/Text/FlowedToTextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlAttributeTests.cs b/UnitTests/Text/HtmlAttributeTests.cs index d67aa9ddf1..fa3b207673 100644 --- a/UnitTests/Text/HtmlAttributeTests.cs +++ b/UnitTests/Text/HtmlAttributeTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlEntityDecoderTests.cs b/UnitTests/Text/HtmlEntityDecoderTests.cs index 1328a401ba..d14239fae9 100644 --- a/UnitTests/Text/HtmlEntityDecoderTests.cs +++ b/UnitTests/Text/HtmlEntityDecoderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTagIdTests.cs b/UnitTests/Text/HtmlTagIdTests.cs index d65c092d6b..581278e671 100644 --- a/UnitTests/Text/HtmlTagIdTests.cs +++ b/UnitTests/Text/HtmlTagIdTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTextPreviewerTests.cs b/UnitTests/Text/HtmlTextPreviewerTests.cs index d6ca897070..21d5e38c50 100644 --- a/UnitTests/Text/HtmlTextPreviewerTests.cs +++ b/UnitTests/Text/HtmlTextPreviewerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlToHtmlTests.cs b/UnitTests/Text/HtmlToHtmlTests.cs index 983abca302..0759200431 100644 --- a/UnitTests/Text/HtmlToHtmlTests.cs +++ b/UnitTests/Text/HtmlToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenTests.cs b/UnitTests/Text/HtmlTokenTests.cs index 1fe16920ce..f69430e855 100644 --- a/UnitTests/Text/HtmlTokenTests.cs +++ b/UnitTests/Text/HtmlTokenTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlTokenizerTests.cs b/UnitTests/Text/HtmlTokenizerTests.cs index 0c7338e6a4..92488444c9 100644 --- a/UnitTests/Text/HtmlTokenizerTests.cs +++ b/UnitTests/Text/HtmlTokenizerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlUtilsTests.cs b/UnitTests/Text/HtmlUtilsTests.cs index 960063f690..433ec4e192 100644 --- a/UnitTests/Text/HtmlUtilsTests.cs +++ b/UnitTests/Text/HtmlUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/HtmlWriterTests.cs b/UnitTests/Text/HtmlWriterTests.cs index 4f31f7e0f0..8af7abae77 100644 --- a/UnitTests/Text/HtmlWriterTests.cs +++ b/UnitTests/Text/HtmlWriterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/PlainTextPreviewerTests.cs b/UnitTests/Text/PlainTextPreviewerTests.cs index 5a96e7e477..e3c79ac0ea 100644 --- a/UnitTests/Text/PlainTextPreviewerTests.cs +++ b/UnitTests/Text/PlainTextPreviewerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/RtfCompressedToRtfTests.cs b/UnitTests/Text/RtfCompressedToRtfTests.cs index 490baaa54e..6316b3d8c7 100644 --- a/UnitTests/Text/RtfCompressedToRtfTests.cs +++ b/UnitTests/Text/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextConverterTests.cs b/UnitTests/Text/TextConverterTests.cs index 9132e7a86a..ceb2b54bcc 100644 --- a/UnitTests/Text/TextConverterTests.cs +++ b/UnitTests/Text/TextConverterTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextPreviewerTests.cs b/UnitTests/Text/TextPreviewerTests.cs index f5e3b52b6b..79a28d345c 100644 --- a/UnitTests/Text/TextPreviewerTests.cs +++ b/UnitTests/Text/TextPreviewerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToFlowedTests.cs b/UnitTests/Text/TextToFlowedTests.cs index da4f8f7e70..0d53f5ed22 100644 --- a/UnitTests/Text/TextToFlowedTests.cs +++ b/UnitTests/Text/TextToFlowedTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToHtmlTests.cs b/UnitTests/Text/TextToHtmlTests.cs index 06fcf4e3e9..e1c72b9004 100644 --- a/UnitTests/Text/TextToHtmlTests.cs +++ b/UnitTests/Text/TextToHtmlTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TextToTextTests.cs b/UnitTests/Text/TextToTextTests.cs index 4ced3bccc1..6b9f2f737a 100644 --- a/UnitTests/Text/TextToTextTests.cs +++ b/UnitTests/Text/TextToTextTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/TrieTests.cs b/UnitTests/Text/TrieTests.cs index 6a4bc09505..98f43849d7 100644 --- a/UnitTests/Text/TrieTests.cs +++ b/UnitTests/Text/TrieTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Text/UrlScannerTests.cs b/UnitTests/Text/UrlScannerTests.cs index 2527ff58d8..93d2f89575 100644 --- a/UnitTests/Text/UrlScannerTests.cs +++ b/UnitTests/Text/UrlScannerTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextPartTests.cs b/UnitTests/TextPartTests.cs index a155cc44e4..4d10c0ff60 100644 --- a/UnitTests/TextPartTests.cs +++ b/UnitTests/TextPartTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/TextRfc822HeadersTests.cs b/UnitTests/TextRfc822HeadersTests.cs index d0a604cc8f..b09a0b0597 100644 --- a/UnitTests/TextRfc822HeadersTests.cs +++ b/UnitTests/TextRfc822HeadersTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/RtfCompressedToRtfTests.cs b/UnitTests/Tnef/RtfCompressedToRtfTests.cs index 03c3cf9a8b..f2243a7430 100644 --- a/UnitTests/Tnef/RtfCompressedToRtfTests.cs +++ b/UnitTests/Tnef/RtfCompressedToRtfTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderStreamTests.cs b/UnitTests/Tnef/TnefReaderStreamTests.cs index e26fc5c8f5..d0ef6c9d9b 100644 --- a/UnitTests/Tnef/TnefReaderStreamTests.cs +++ b/UnitTests/Tnef/TnefReaderStreamTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefReaderTests.cs b/UnitTests/Tnef/TnefReaderTests.cs index 6647a4bd39..73a0e9c0d5 100644 --- a/UnitTests/Tnef/TnefReaderTests.cs +++ b/UnitTests/Tnef/TnefReaderTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index a579227dfe..161ed2eba6 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/CharsetUtilsTests.cs b/UnitTests/Utils/CharsetUtilsTests.cs index 6ca3a15224..a711afebe8 100644 --- a/UnitTests/Utils/CharsetUtilsTests.cs +++ b/UnitTests/Utils/CharsetUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/DateParserTests.cs b/UnitTests/Utils/DateParserTests.cs index f1e3da5b48..5061b4258b 100644 --- a/UnitTests/Utils/DateParserTests.cs +++ b/UnitTests/Utils/DateParserTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index fb480d5346..a2acc4f356 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/PackedByteArrayTests.cs b/UnitTests/Utils/PackedByteArrayTests.cs index 63e4a2685c..ffeab5b923 100644 --- a/UnitTests/Utils/PackedByteArrayTests.cs +++ b/UnitTests/Utils/PackedByteArrayTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/ParseUtilsTests.cs b/UnitTests/Utils/ParseUtilsTests.cs index f02e8107fc..54fe288e28 100644 --- a/UnitTests/Utils/ParseUtilsTests.cs +++ b/UnitTests/Utils/ParseUtilsTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/Rfc2047Tests.cs b/UnitTests/Utils/Rfc2047Tests.cs index 1673476e24..11feb0816f 100644 --- a/UnitTests/Utils/Rfc2047Tests.cs +++ b/UnitTests/Utils/Rfc2047Tests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/UnitTests/Utils/StringBuilderExtensionTests.cs b/UnitTests/Utils/StringBuilderExtensionTests.cs index be08260b55..273de4cd1a 100644 --- a/UnitTests/Utils/StringBuilderExtensionTests.cs +++ b/UnitTests/Utils/StringBuilderExtensionTests.cs @@ -3,7 +3,7 @@ // // Author: Jeffrey Stedfast // -// Copyright (c) 2013-2020 Xamarin Inc. (www.xamarin.com) +// Copyright (c) 2013-2020 .NET Foundation and Contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal From e687c90417377cef69c6c73a873255ecd3f2a02e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 15 Jun 2020 17:02:04 -0400 Subject: [PATCH 632/741] Added MimeParser.OnMimeContentOctets/Lines() More hooks that may be useful for issue #582 Also fixed missing OnMimeContentEnd() calls for Multipart --- MimeKit/AsyncMimeParser.cs | 44 +- MimeKit/MimeParser.cs | 84 +- UnitTests/MimeParserTests.cs | 18 +- .../mbox/content-length.dos-offsets.txt | 233 +++ UnitTests/TestData/mbox/jwz.dos-offsets.txt | 1745 +++++++++++++++++ 5 files changed, 2099 insertions(+), 25 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 5e6e51258a..3471a5030b 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -252,27 +252,30 @@ async Task ScanContentAsync (Stream content, bool trimNewLine async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellationToken) { - long end, begin = GetOffset (inputIndex); + long endOffset, beginOffset = GetOffset (inputIndex); + var beginLineNumber = lineNumber; ScanContentResult result; Stream content; - OnMimeContentBegin (part, begin); + OnMimeContentBegin (part, beginOffset); if (persistent) { using (var measured = new MeasuringStream ()) { result = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); - end = begin + measured.Length; + endOffset = beginOffset + measured.Length; } - content = new BoundStream (stream, begin, end, true); + content = new BoundStream (stream, beginOffset, endOffset, true); } else { content = new MemoryBlockStream (); result = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); content.Seek (0, SeekOrigin.Begin); - end = begin + content.Length; + endOffset = beginOffset + content.Length; } - OnMimeContentEnd (part, end); + OnMimeContentEnd (part, endOffset); + OnMimeContentOctets (part, endOffset - beginOffset); + OnMimeContentLines (part, lineNumber - beginLineNumber); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -282,7 +285,10 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, CancellationToken cancellationToken) { - OnMimeContentBegin (rfc822, GetOffset (inputIndex)); + var beginOffset = GetOffset (inputIndex); + var beginLineNumber = lineNumber; + + OnMimeContentBegin (rfc822, beginOffset); if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); @@ -359,6 +365,8 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentEnd (rfc822, endOffset); + OnMimeContentOctets (rfc822, endOffset - beginOffset); + OnMimeContentLines (rfc822, lineNumber - beginLineNumber); } async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) @@ -441,9 +449,12 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat async Task ConstructMultipartAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { + var beginOffset = GetOffset (inputIndex); + var beginLineNumber = lineNumber; var marker = multipart.Boundary; + long endOffset; - OnMimeContentBegin (multipart, GetOffset (inputIndex)); + OnMimeContentBegin (multipart, beginOffset); if (marker == null) { #if DEBUG @@ -452,7 +463,11 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: this will scan all content into the preamble... await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); - OnMimeContentEnd (multipart, GetOffset (inputIndex)); + endOffset = GetOffset (inputIndex); + + OnMimeContentEnd (multipart, endOffset); + OnMimeContentOctets (multipart, endOffset - beginOffset); + OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; } @@ -473,9 +488,20 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); + endOffset = GetOffset (inputIndex); + + OnMimeContentEnd (multipart, endOffset); + OnMimeContentOctets (multipart, endOffset - beginOffset); + OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; } + endOffset = GetOffset (inputIndex); + + OnMimeContentEnd (multipart, endOffset); + OnMimeContentOctets (multipart, endOffset - beginOffset); + OnMimeContentLines (multipart, lineNumber - beginLineNumber); + multipart.WriteEndBoundary = false; // We either found the end of the stream or we found a parent's boundary diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index bffecbd9b2..e63d09e056 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -143,6 +143,7 @@ public partial class MimeParser : IEnumerable long headerBlockBegin; long headerBlockEnd; long contentEnd; + int lineNumber; Stream stream; long position; @@ -330,6 +331,7 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, mboxMarkerLength = 0; headerBlockBegin = 0; headerBlockEnd = 0; + lineNumber = 0; contentEnd = 0; position = stream.CanSeek ? stream.Position : 0; @@ -639,6 +641,30 @@ protected virtual void OnMultipartEpilogueEnd (Multipart multipart, long offset) { } + /// + /// Invoked for all MIME entities once the octet count for the content has been calculated. + /// + /// + /// Invoked for all MIME entities once the octet count for the content has been calculated. + /// + /// The MIME entity. + /// The number of octets contained in the content of the entity. + protected virtual void OnMimeContentOctets (MimeEntity entity, long octets) + { + } + + /// + /// Invoked for all MIME entities once the line count for the content has been calculated. + /// + /// + /// Invoked for all MIME entities once the line count for the content has been calculated. + /// + /// The MIME entity. + /// The number of lines contained in the content of the entity. + protected virtual void OnMimeContentLines (MimeEntity entity, int lines) + { + } + #if DEBUG static string ConvertToCString (byte[] buffer, int startIndex, int length) { @@ -826,6 +852,8 @@ unsafe void StepMboxMarker (byte *inbuf, ref bool needInput, ref bool complete, break; } + lineNumber++; + if (length >= 5 && IsMboxMarker (start)) { int startIndex = (int) (start - inbuf); @@ -1043,6 +1071,8 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check break; } + lineNumber++; + // check to see if we've reached the end of the headers if (!midline && IsEoln (start)) { inputIndex = (int) (inptr - inbuf) + 1; @@ -1166,6 +1196,7 @@ unsafe bool SkipLine (byte* inbuf, bool consumeNewLine) if (consumeNewLine) { inputIndex++; + lineNumber++; } else if (*(inptr - 1) == (byte) '\r') { inputIndex--; } @@ -1215,8 +1246,6 @@ unsafe MimeParserState Step (byte* inbuf, CancellationToken cancellationToken) ContentType GetContentType (ContentType parent) { - ContentType type; - for (int i = 0; i < headers.Count; i++) { if (!headers[i].Field.Equals ("Content-Type", StringComparison.OrdinalIgnoreCase)) continue; @@ -1224,7 +1253,7 @@ ContentType GetContentType (ContentType parent) var rawValue = headers[i].RawValue; int index = 0; - if (!ContentType.TryParse (options, rawValue, ref index, rawValue.Length, false, out type) && type == null) { + if (!ContentType.TryParse (options, rawValue, ref index, rawValue.Length, false, out var type) && type == null) { // if 'type' is null, then it means that even the mime-type was unintelligible type = new ContentType ("application", "octet-stream"); @@ -1233,9 +1262,7 @@ ContentType GetContentType (ContentType parent) index++; if (++index < rawValue.Length) { - ParameterList parameters; - - if (ParameterList.TryParse (options, rawValue, ref index, rawValue.Length, false, out parameters)) + if (ParameterList.TryParse (options, rawValue, ref index, rawValue.Length, false, out var parameters)) type.Parameters = parameters; } } @@ -1398,6 +1425,7 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b else formats[(int) NewLineFormat.Unix] = true; + lineNumber++; length++; inptr++; } else { @@ -1480,27 +1508,30 @@ unsafe ScanContentResult ScanContent (byte* inbuf, Stream content, bool trimNewL unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken cancellationToken) { - long end, begin = GetOffset (inputIndex); + long endOffset, beginOffset = GetOffset (inputIndex); + var beginLineNumber = lineNumber; ScanContentResult result; Stream content; - OnMimeContentBegin (part, begin); + OnMimeContentBegin (part, beginOffset); if (persistent) { using (var measured = new MeasuringStream ()) { result = ScanContent (inbuf, measured, true, cancellationToken); - end = begin + measured.Length; + endOffset = beginOffset + measured.Length; } - content = new BoundStream (stream, begin, end, true); + content = new BoundStream (stream, beginOffset, endOffset, true); } else { content = new MemoryBlockStream (); result = ScanContent (inbuf, content, true, cancellationToken); content.Seek (0, SeekOrigin.Begin); - end = begin + content.Length; + endOffset = beginOffset + content.Length; } - OnMimeContentEnd (part, end); + OnMimeContentEnd (part, endOffset); + OnMimeContentOctets (part, endOffset - beginOffset); + OnMimeContentLines (part, lineNumber - beginLineNumber); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -1510,7 +1541,10 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, CancellationToken cancellationToken) { - OnMimeContentBegin (rfc822, GetOffset (inputIndex)); + var beginOffset = GetOffset (inputIndex); + var beginLineNumber = lineNumber; + + OnMimeContentBegin (rfc822, beginOffset); if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); @@ -1583,6 +1617,8 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentEnd (rfc822, endOffset); + OnMimeContentOctets (rfc822, endOffset - beginOffset); + OnMimeContentLines (rfc822, lineNumber - beginLineNumber); } unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) @@ -1678,9 +1714,12 @@ void PopBoundary () unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { + var beginOffset = GetOffset (inputIndex); + var beginLineNumber = lineNumber; var marker = multipart.Boundary; + long endOffset; - OnMimeContentBegin (multipart, GetOffset (inputIndex)); + OnMimeContentBegin (multipart, beginOffset); if (marker == null) { #if DEBUG @@ -1689,7 +1728,11 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); - OnMimeContentEnd (multipart, GetOffset (inputIndex)); + endOffset = GetOffset (inputIndex); + + OnMimeContentEnd (multipart, endOffset); + OnMimeContentOctets (multipart, endOffset - beginOffset); + OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; } @@ -1710,9 +1753,20 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); MultipartScanEpilogue (multipart, inbuf, cancellationToken); + endOffset = GetOffset (inputIndex); + + OnMimeContentEnd (multipart, endOffset); + OnMimeContentOctets (multipart, endOffset - beginOffset); + OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; } + endOffset = GetOffset (inputIndex); + + OnMimeContentEnd (multipart, endOffset); + OnMimeContentOctets (multipart, endOffset - beginOffset); + OnMimeContentLines (multipart, lineNumber - beginLineNumber); + multipart.WriteEndBoundary = false; // We either found the end of the stream or we found a parent's boundary diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index f54585966d..23ca4c4f85 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -609,7 +609,11 @@ enum MimeParserOffsetLocation MultipartPreambleBegin, MultipartPreambleEnd, MultipartEpilogueBegin, - MultipartEpilogueEnd + MultipartEpilogueEnd, + + // These last 2 aren't really offsets, but we're recording them anyway to test them. + Octets, + Lines } class MimeParserOffset @@ -745,6 +749,18 @@ protected override void OnMultipartEpilogueEnd (Multipart multipart, long offset { Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEpilogueEnd, offset)); } + + // These last 2 aren't really offsets, but we're recording them anyway to test them. + + protected override void OnMimeContentOctets (MimeEntity entity, long octets) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.Octets, octets)); + } + + protected override void OnMimeContentLines (MimeEntity entity, int lines) + { + Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.Lines, lines)); + } } static void AssertMboxResults (string baseName, string actual, Stream output, List offsets, NewLineFormat newLineFormat) diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index c58f7ff2a9..a97c1486ca 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -13,6 +13,8 @@ MimeEntityBegin 725 MimeEntityHeadersEnd 753 MimeContentBegin 753 MimeContentEnd 831 +Octets 78 +Lines 5 MimeEntityEnd 833 MultipartBoundaryBegin 833 MultipartBoundaryEnd 883 @@ -25,14 +27,21 @@ MimeEntityBegin 948 MimeEntityHeadersEnd 1747 MimeContentBegin 1747 MimeContentEnd 1887 +Octets 140 +Lines 4 MimeEntityEnd 1889 MimeMessageEnd 1889 MimeContentEnd 1889 +Octets 941 +Lines 21 MimeEntityEnd 1889 MultipartEndBoundaryBegin 1889 MultipartEndBoundaryEnd 1939 MultipartEpilogueBegin 1939 MultipartEpilogueEnd 1939 +MimeContentEnd 1941 +Octets 1266 +Lines 34 MimeEntityEnd 1941 MimeMessageEnd 1941 MboxMarkerBegin 1941 @@ -55,9 +64,13 @@ MimeEntityBegin 2655 MimeEntityHeadersEnd 3095 MimeContentBegin 3095 MimeContentEnd 3134 +Octets 39 +Lines 3 MimeEntityEnd 3136 MimeMessageEnd 3136 MimeContentEnd 3136 +Octets 481 +Lines 14 MimeEntityEnd 3136 MultipartBoundaryBegin 3136 MultipartBoundaryEnd 3164 @@ -65,6 +78,8 @@ MimeEntityBegin 3164 MimeEntityHeadersEnd 3291 MimeContentBegin 3291 MimeContentEnd 3755 +Octets 464 +Lines 7 MimeEntityEnd 3757 MultipartBoundaryBegin 3757 MultipartBoundaryEnd 3785 @@ -72,6 +87,8 @@ MimeEntityBegin 3785 MimeEntityHeadersEnd 3912 MimeContentBegin 3912 MimeContentEnd 4404 +Octets 492 +Lines 7 MimeEntityEnd 4406 MultipartBoundaryBegin 4406 MultipartBoundaryEnd 4434 @@ -79,6 +96,8 @@ MimeEntityBegin 4434 MimeEntityHeadersEnd 4565 MimeContentBegin 4565 MimeContentEnd 5099 +Octets 534 +Lines 8 MimeEntityEnd 5101 MultipartBoundaryBegin 5101 MultipartBoundaryEnd 5129 @@ -86,6 +105,8 @@ MimeEntityBegin 5129 MimeEntityHeadersEnd 5258 MimeContentBegin 5258 MimeContentEnd 5762 +Octets 504 +Lines 7 MimeEntityEnd 5764 MultipartBoundaryBegin 5764 MultipartBoundaryEnd 5792 @@ -98,9 +119,13 @@ MimeEntityBegin 5941 MimeEntityHeadersEnd 6381 MimeContentBegin 6381 MimeContentEnd 6419 +Octets 38 +Lines 2 MimeEntityEnd 6421 MimeMessageEnd 6421 MimeContentEnd 6421 +Octets 480 +Lines 13 MimeEntityEnd 6421 MultipartBoundaryBegin 6421 MultipartBoundaryEnd 6449 @@ -123,15 +148,23 @@ MimeEntityBegin 7735 MimeEntityHeadersEnd 8156 MimeContentBegin 8156 MimeContentEnd 8162 +Octets 6 +Lines 2 MimeEntityEnd 8164 MimeMessageEnd 8164 MimeContentEnd 8164 +Octets 429 +Lines 13 MimeEntityEnd 8164 MimeMessageEnd 8164 MimeContentEnd 8164 +Octets 954 +Lines 27 MimeEntityEnd 8164 MimeMessageEnd 8164 MimeContentEnd 8164 +Octets 1539 +Lines 42 MimeEntityEnd 8164 MultipartBoundaryBegin 8164 MultipartBoundaryEnd 8192 @@ -139,11 +172,16 @@ MimeEntityBegin 8192 MimeEntityHeadersEnd 8248 MimeContentBegin 8248 MimeContentEnd 8301 +Octets 53 +Lines 2 MimeEntityEnd 8303 MultipartEndBoundaryBegin 8303 MultipartEndBoundaryEnd 8331 MultipartEpilogueBegin 8331 MultipartEpilogueEnd 8331 +MimeContentEnd 8333 +Octets 5903 +Lines 145 MimeEntityEnd 8333 MimeMessageEnd 8333 MboxMarkerBegin 8333 @@ -166,9 +204,13 @@ MimeEntityBegin 9054 MimeEntityHeadersEnd 9493 MimeContentBegin 9493 MimeContentEnd 9532 +Octets 39 +Lines 3 MimeEntityEnd 9534 MimeMessageEnd 9534 MimeContentEnd 9534 +Octets 480 +Lines 14 MimeEntityEnd 9534 MultipartBoundaryBegin 9534 MultipartBoundaryEnd 9562 @@ -176,6 +218,8 @@ MimeEntityBegin 9562 MimeEntityHeadersEnd 9693 MimeContentBegin 9693 MimeContentEnd 10157 +Octets 464 +Lines 7 MimeEntityEnd 10159 MultipartBoundaryBegin 10159 MultipartBoundaryEnd 10187 @@ -183,6 +227,8 @@ MimeEntityBegin 10187 MimeEntityHeadersEnd 10318 MimeContentBegin 10318 MimeContentEnd 10810 +Octets 492 +Lines 7 MimeEntityEnd 10812 MultipartBoundaryBegin 10812 MultipartBoundaryEnd 10840 @@ -190,6 +236,8 @@ MimeEntityBegin 10840 MimeEntityHeadersEnd 10975 MimeContentBegin 10975 MimeContentEnd 11509 +Octets 534 +Lines 8 MimeEntityEnd 11511 MultipartBoundaryBegin 11511 MultipartBoundaryEnd 11539 @@ -197,6 +245,8 @@ MimeEntityBegin 11539 MimeEntityHeadersEnd 11672 MimeContentBegin 11672 MimeContentEnd 12176 +Octets 504 +Lines 7 MimeEntityEnd 12178 MultipartBoundaryBegin 12178 MultipartBoundaryEnd 12206 @@ -209,9 +259,13 @@ MimeEntityBegin 12359 MimeEntityHeadersEnd 12798 MimeContentBegin 12798 MimeContentEnd 12836 +Octets 38 +Lines 2 MimeEntityEnd 12838 MimeMessageEnd 12838 MimeContentEnd 12838 +Octets 479 +Lines 13 MimeEntityEnd 12838 MultipartBoundaryBegin 12838 MultipartBoundaryEnd 12866 @@ -234,15 +288,23 @@ MimeEntityBegin 14162 MimeEntityHeadersEnd 14582 MimeContentBegin 14582 MimeContentEnd 14588 +Octets 6 +Lines 2 MimeEntityEnd 14590 MimeMessageEnd 14590 MimeContentEnd 14590 +Octets 428 +Lines 13 MimeEntityEnd 14590 MimeMessageEnd 14590 MimeContentEnd 14590 +Octets 956 +Lines 27 MimeEntityEnd 14590 MimeMessageEnd 14590 MimeContentEnd 14590 +Octets 1544 +Lines 42 MimeEntityEnd 14590 MultipartBoundaryBegin 14590 MultipartBoundaryEnd 14618 @@ -250,11 +312,16 @@ MimeEntityBegin 14618 MimeEntityHeadersEnd 14678 MimeContentBegin 14678 MimeContentEnd 14731 +Octets 53 +Lines 2 MimeEntityEnd 14733 MultipartEndBoundaryBegin 14733 MultipartEndBoundaryEnd 14761 MultipartEpilogueBegin 14761 MultipartEpilogueEnd 14761 +MimeContentEnd 14763 +Octets 5938 +Lines 145 MimeEntityEnd 14763 MimeMessageEnd 14763 MboxMarkerBegin 14763 @@ -272,6 +339,8 @@ MimeEntityBegin 16372 MimeEntityHeadersEnd 16466 MimeContentBegin 16466 MimeContentEnd 21776 +Octets 5310 +Lines 112 MimeEntityEnd 21778 MultipartBoundaryBegin 21778 MultipartBoundaryEnd 21823 @@ -279,11 +348,16 @@ MimeEntityBegin 21823 MimeEntityHeadersEnd 22028 MimeContentBegin 22028 MimeContentEnd 22970 +Octets 942 +Lines 14 MimeEntityEnd 22972 MultipartEndBoundaryBegin 22972 MultipartEndBoundaryEnd 23017 MultipartEpilogueBegin 23017 MultipartEpilogueEnd 23019 +MimeContentEnd 23021 +Octets 6696 +Lines 140 MimeEntityEnd 23021 MimeMessageEnd 23021 MboxMarkerBegin 23021 @@ -301,6 +375,8 @@ MimeEntityBegin 24397 MimeEntityHeadersEnd 24476 MimeContentBegin 24476 MimeContentEnd 24506 +Octets 30 +Lines 4 MimeEntityEnd 24508 MultipartBoundaryBegin 24508 MultipartBoundaryEnd 24547 @@ -320,6 +396,8 @@ MimeEntityBegin 25520 MimeEntityHeadersEnd 25599 MimeContentBegin 25599 MimeContentEnd 26242 +Octets 643 +Lines 17 MimeEntityEnd 26244 MultipartBoundaryBegin 26244 MultipartBoundaryEnd 26284 @@ -334,6 +412,8 @@ MimeEntityBegin 26410 MimeEntityHeadersEnd 26488 MimeContentBegin 26488 MimeContentEnd 27356 +Octets 868 +Lines 19 MimeEntityEnd 27358 MultipartBoundaryBegin 27358 MultipartBoundaryEnd 27398 @@ -341,24 +421,37 @@ MimeEntityBegin 27398 MimeEntityHeadersEnd 27587 MimeContentBegin 27587 MimeContentEnd 781745 +Octets 754158 +Lines 10192 MimeEntityEnd 781747 MultipartEndBoundaryBegin 781747 MultipartEndBoundaryEnd 781787 MultipartEpilogueBegin 781787 MultipartEpilogueEnd 781789 +MimeContentEnd 781791 +Octets 755423 +Lines 10224 MimeEntityEnd 781791 MultipartEndBoundaryBegin 781791 MultipartEndBoundaryEnd 781831 MultipartEpilogueBegin 781831 MultipartEpilogueEnd 781837 +MimeContentEnd 781839 +Octets 756361 +Lines 10253 MimeEntityEnd 781839 MimeMessageEnd 781839 MimeContentEnd 781839 +Octets 757198 +Lines 10269 MimeEntityEnd 781839 MultipartEndBoundaryBegin 781839 MultipartEndBoundaryEnd 781878 MultipartEpilogueBegin 781878 MultipartEpilogueEnd 781880 +MimeContentEnd 781882 +Octets 757572 +Lines 10286 MimeEntityEnd 781882 MimeMessageEnd 781882 MboxMarkerBegin 781882 @@ -376,6 +469,8 @@ MimeEntityBegin 783248 MimeEntityHeadersEnd 783342 MimeContentBegin 783342 MimeContentEnd 785774 +Octets 2432 +Lines 51 MimeEntityEnd 785776 MultipartBoundaryBegin 785776 MultipartBoundaryEnd 785821 @@ -383,6 +478,8 @@ MimeEntityBegin 785821 MimeEntityHeadersEnd 785985 MimeContentBegin 785985 MimeContentEnd 792087 +Octets 6102 +Lines 80 MimeEntityEnd 792089 MultipartBoundaryBegin 792089 MultipartBoundaryEnd 792134 @@ -390,6 +487,8 @@ MimeEntityBegin 792134 MimeEntityHeadersEnd 792297 MimeContentBegin 792297 MimeContentEnd 804527 +Octets 12230 +Lines 158 MimeEntityEnd 804529 MultipartBoundaryBegin 804529 MultipartBoundaryEnd 804574 @@ -397,6 +496,8 @@ MimeEntityBegin 804574 MimeEntityHeadersEnd 804739 MimeContentBegin 804739 MimeContentEnd 826735 +Octets 21996 +Lines 283 MimeEntityEnd 826737 MultipartBoundaryBegin 826737 MultipartBoundaryEnd 826782 @@ -404,11 +505,16 @@ MimeEntityBegin 826782 MimeEntityHeadersEnd 826991 MimeContentBegin 826991 MimeContentEnd 830429 +Octets 3438 +Lines 46 MimeEntityEnd 830431 MultipartEndBoundaryBegin 830431 MultipartEndBoundaryEnd 830476 MultipartEpilogueBegin 830476 MultipartEpilogueEnd 830478 +MimeContentEnd 830480 +Octets 47279 +Lines 650 MimeEntityEnd 830480 MimeMessageEnd 830480 MboxMarkerBegin 830480 @@ -426,11 +532,16 @@ MimeEntityBegin 831432 MimeEntityHeadersEnd 831463 MimeContentBegin 831463 MimeContentEnd 834089 +Octets 2626 +Lines 97 MimeEntityEnd 834091 MultipartEndBoundaryBegin 834091 MultipartEndBoundaryEnd 834100 MultipartEpilogueBegin 834100 MultipartEpilogueEnd 834102 +MimeContentEnd 834104 +Octets 2683 +Lines 103 MimeEntityEnd 834104 MimeMessageEnd 834104 MboxMarkerBegin 834104 @@ -448,6 +559,8 @@ MimeEntityBegin 835326 MimeEntityHeadersEnd 835328 MimeContentBegin 835328 MimeContentEnd 836249 +Octets 921 +Lines 21 MimeEntityEnd 836251 MultipartBoundaryBegin 836251 MultipartBoundaryEnd 836269 @@ -455,11 +568,16 @@ MimeEntityBegin 836269 MimeEntityHeadersEnd 836351 MimeContentBegin 836351 MimeContentEnd 837111 +Octets 760 +Lines 13 MimeEntityEnd 837113 MultipartEndBoundaryBegin 837113 MultipartEndBoundaryEnd 837131 MultipartEpilogueBegin 837131 MultipartEpilogueEnd 837133 +MimeContentEnd 837135 +Octets 1827 +Lines 42 MimeEntityEnd 837135 MimeMessageEnd 837135 MboxMarkerBegin 837135 @@ -477,6 +595,8 @@ MimeEntityBegin 838513 MimeEntityHeadersEnd 838594 MimeContentBegin 838594 MimeContentEnd 839348 +Octets 754 +Lines 14 MimeEntityEnd 839350 MultipartBoundaryBegin 839350 MultipartBoundaryEnd 839358 @@ -484,11 +604,16 @@ MimeEntityBegin 839358 MimeEntityHeadersEnd 839541 MimeContentBegin 839541 MimeContentEnd 841787 +Octets 2246 +Lines 32 MimeEntityEnd 841789 MultipartEndBoundaryBegin 841789 MultipartEndBoundaryEnd 841797 MultipartEpilogueBegin 841797 MultipartEpilogueEnd 841797 +MimeContentEnd 841799 +Octets 3470 +Lines 60 MimeEntityEnd 841799 MimeMessageEnd 841799 MboxMarkerBegin 841799 @@ -506,6 +631,8 @@ MimeEntityBegin 843190 MimeEntityHeadersEnd 843271 MimeContentBegin 843271 MimeContentEnd 846129 +Octets 2858 +Lines 47 MimeEntityEnd 846131 MultipartBoundaryBegin 846131 MultipartBoundaryEnd 846153 @@ -513,11 +640,16 @@ MimeEntityBegin 846153 MimeEntityHeadersEnd 846336 MimeContentBegin 846336 MimeContentEnd 848918 +Octets 2582 +Lines 36 MimeEntityEnd 848920 MultipartEndBoundaryBegin 848920 MultipartEndBoundaryEnd 848942 MultipartEpilogueBegin 848942 MultipartEpilogueEnd 848942 +MimeContentEnd 848944 +Octets 5952 +Lines 97 MimeEntityEnd 848944 MimeMessageEnd 848944 MboxMarkerBegin 848944 @@ -535,6 +667,8 @@ MimeEntityBegin 849971 MimeEntityHeadersEnd 850109 MimeContentBegin 850109 MimeContentEnd 860977 +Octets 10868 +Lines 147 MimeEntityEnd 860979 MultipartBoundaryBegin 860979 MultipartBoundaryEnd 861007 @@ -542,11 +676,16 @@ MimeEntityBegin 861007 MimeEntityHeadersEnd 861162 MimeContentBegin 861162 MimeContentEnd 865836 +Octets 4674 +Lines 64 MimeEntityEnd 865838 MultipartEndBoundaryBegin 865838 MultipartEndBoundaryEnd 865866 MultipartEpilogueBegin 865866 MultipartEpilogueEnd 865868 +MimeContentEnd 865870 +Octets 15975 +Lines 225 MimeEntityEnd 865870 MimeMessageEnd 865870 MboxMarkerBegin 865870 @@ -557,6 +696,8 @@ MimeEntityBegin 865903 MimeEntityHeadersEnd 867318 MimeContentBegin 867318 MimeContentEnd 868768 +Octets 1450 +Lines 20 MimeEntityEnd 868770 MimeMessageEnd 868770 MboxMarkerBegin 868770 @@ -574,6 +715,8 @@ MimeEntityBegin 870227 MimeEntityHeadersEnd 870294 MimeContentBegin 870294 MimeContentEnd 870404 +Octets 110 +Lines 4 MimeEntityEnd 870406 MultipartBoundaryBegin 870406 MultipartBoundaryEnd 870451 @@ -581,11 +724,16 @@ MimeEntityBegin 870451 MimeEntityHeadersEnd 870606 MimeContentBegin 870606 MimeContentEnd 874592 +Octets 3986 +Lines 54 MimeEntityEnd 874594 MultipartEndBoundaryBegin 874594 MultipartEndBoundaryEnd 874639 MultipartEpilogueBegin 874639 MultipartEpilogueEnd 874641 +MimeContentEnd 874643 +Octets 4463 +Lines 70 MimeEntityEnd 874643 MimeMessageEnd 874643 MboxMarkerBegin 874643 @@ -596,6 +744,8 @@ MimeEntityBegin 874676 MimeEntityHeadersEnd 875907 MimeContentBegin 875907 MimeContentEnd 879457 +Octets 3550 +Lines 56 MimeEntityEnd 879459 MimeMessageEnd 879459 MboxMarkerBegin 879459 @@ -606,6 +756,8 @@ MimeEntityBegin 879492 MimeEntityHeadersEnd 880590 MimeContentBegin 880590 MimeContentEnd 881260 +Octets 670 +Lines 10 MimeEntityEnd 881262 MimeMessageEnd 881262 MboxMarkerBegin 881262 @@ -621,9 +773,13 @@ MimeEntityBegin 882097 MimeEntityHeadersEnd 883500 MimeContentBegin 883500 MimeContentEnd 884952 +Octets 1452 +Lines 21 MimeEntityEnd 884954 MimeMessageEnd 884954 MimeContentEnd 884954 +Octets 2857 +Lines 44 MimeEntityEnd 884954 MimeMessageEnd 884954 MboxMarkerBegin 884954 @@ -641,6 +797,8 @@ MimeEntityBegin 885790 MimeEntityHeadersEnd 885869 MimeContentBegin 885869 MimeContentEnd 885885 +Octets 16 +Lines 2 MimeEntityEnd 885887 MultipartBoundaryBegin 885887 MultipartBoundaryEnd 885915 @@ -653,14 +811,21 @@ MimeEntityBegin 886073 MimeEntityHeadersEnd 887476 MimeContentBegin 887476 MimeContentEnd 888928 +Octets 1452 +Lines 21 MimeEntityEnd 888930 MimeMessageEnd 888930 MimeContentEnd 888930 +Octets 2857 +Lines 44 MimeEntityEnd 888930 MultipartEndBoundaryBegin 888930 MultipartEndBoundaryEnd 888958 MultipartEpilogueBegin 888958 MultipartEpilogueEnd 888960 +MimeContentEnd 888962 +Octets 3248 +Lines 59 MimeEntityEnd 888962 MimeMessageEnd 888962 MboxMarkerBegin 888962 @@ -678,6 +843,8 @@ MimeEntityBegin 889780 MimeEntityHeadersEnd 889859 MimeContentBegin 889859 MimeContentEnd 889901 +Octets 42 +Lines 2 MimeEntityEnd 889903 MultipartBoundaryBegin 889903 MultipartBoundaryEnd 889945 @@ -685,11 +852,16 @@ MimeEntityBegin 889945 MimeEntityHeadersEnd 890100 MimeContentBegin 890100 MimeContentEnd 895732 +Octets 5632 +Lines 77 MimeEntityEnd 895734 MultipartEndBoundaryBegin 895734 MultipartEndBoundaryEnd 895776 MultipartEpilogueBegin 895776 MultipartEpilogueEnd 895778 +MimeContentEnd 895780 +Octets 6104 +Lines 92 MimeEntityEnd 895780 MimeMessageEnd 895780 MboxMarkerBegin 895780 @@ -700,6 +872,8 @@ MimeEntityBegin 895813 MimeEntityHeadersEnd 896896 MimeContentBegin 896896 MimeContentEnd 907272 +Octets 10376 +Lines 141 MimeEntityEnd 907274 MimeMessageEnd 907274 MboxMarkerBegin 907274 @@ -717,6 +891,8 @@ MimeEntityBegin 908811 MimeEntityHeadersEnd 908890 MimeContentBegin 908890 MimeContentEnd 909517 +Octets 627 +Lines 17 MimeEntityEnd 909519 MultipartBoundaryBegin 909519 MultipartBoundaryEnd 909561 @@ -724,11 +900,16 @@ MimeEntityBegin 909561 MimeEntityHeadersEnd 909716 MimeContentBegin 909716 MimeContentEnd 911528 +Octets 1812 +Lines 25 MimeEntityEnd 911530 MultipartEndBoundaryBegin 911530 MultipartEndBoundaryEnd 911572 MultipartEpilogueBegin 911572 MultipartEpilogueEnd 911574 +MimeContentEnd 911576 +Octets 2869 +Lines 55 MimeEntityEnd 911576 MimeMessageEnd 911576 MboxMarkerBegin 911576 @@ -739,6 +920,8 @@ MimeEntityBegin 911609 MimeEntityHeadersEnd 912172 MimeContentBegin 912172 MimeContentEnd 912702 +Octets 530 +Lines 8 MimeEntityEnd 912704 MimeMessageEnd 912704 MboxMarkerBegin 912704 @@ -749,6 +932,8 @@ MimeEntityBegin 912737 MimeEntityHeadersEnd 913972 MimeContentBegin 913972 MimeContentEnd 916892 +Octets 2920 +Lines 39 MimeEntityEnd 916894 MimeMessageEnd 916894 MboxMarkerBegin 916894 @@ -759,6 +944,8 @@ MimeEntityBegin 916927 MimeEntityHeadersEnd 918106 MimeContentBegin 918106 MimeContentEnd 920258 +Octets 2152 +Lines 31 MimeEntityEnd 920260 MimeMessageEnd 920260 MboxMarkerBegin 920260 @@ -776,6 +963,8 @@ MimeEntityBegin 921427 MimeEntityHeadersEnd 921494 MimeContentBegin 921494 MimeContentEnd 921494 +Octets 0 +Lines 1 MimeEntityEnd 921496 MultipartBoundaryBegin 921496 MultipartBoundaryEnd 921529 @@ -783,11 +972,16 @@ MimeEntityBegin 921529 MimeEntityHeadersEnd 921611 MimeContentBegin 921611 MimeContentEnd 924365 +Octets 2754 +Lines 42 MimeEntityEnd 924367 MultipartEndBoundaryBegin 924367 MultipartEndBoundaryEnd 924400 MultipartEpilogueBegin 924400 MultipartEpilogueEnd 924402 +MimeContentEnd 924404 +Octets 3012 +Lines 54 MimeEntityEnd 924404 MimeMessageEnd 924404 MboxMarkerBegin 924404 @@ -805,6 +999,8 @@ MimeEntityBegin 925536 MimeEntityHeadersEnd 925617 MimeContentBegin 925617 MimeContentEnd 926083 +Octets 466 +Lines 14 MimeEntityEnd 926085 MultipartBoundaryBegin 926085 MultipartBoundaryEnd 926126 @@ -812,6 +1008,8 @@ MimeEntityBegin 926126 MimeEntityHeadersEnd 926204 MimeContentBegin 926204 MimeContentEnd 927041 +Octets 837 +Lines 27 MimeEntityEnd 927043 MultipartBoundaryBegin 927043 MultipartBoundaryEnd 927084 @@ -819,11 +1017,16 @@ MimeEntityBegin 927084 MimeEntityHeadersEnd 927184 MimeContentBegin 927184 MimeContentEnd 928400 +Octets 1216 +Lines 17 MimeEntityEnd 928402 MultipartEndBoundaryBegin 928402 MultipartEndBoundaryEnd 928443 MultipartEpilogueBegin 928443 MultipartEpilogueEnd 928445 +MimeContentEnd 928447 +Octets 2954 +Lines 73 MimeEntityEnd 928447 MimeMessageEnd 928447 MboxMarkerBegin 928447 @@ -841,6 +1044,8 @@ MimeEntityBegin 929621 MimeEntityHeadersEnd 929694 MimeContentBegin 929694 MimeContentEnd 929853 +Octets 159 +Lines 8 MimeEntityEnd 929855 MultipartBoundaryBegin 929855 MultipartBoundaryEnd 929898 @@ -848,11 +1053,16 @@ MimeEntityBegin 929898 MimeEntityHeadersEnd 929980 MimeContentBegin 929980 MimeContentEnd 934132 +Octets 4152 +Lines 57 MimeEntityEnd 934134 MultipartEndBoundaryBegin 934134 MultipartEndBoundaryEnd 934177 MultipartEpilogueBegin 934177 MultipartEpilogueEnd 934179 +MimeContentEnd 934181 +Octets 4605 +Lines 76 MimeEntityEnd 934181 MimeMessageEnd 934181 MboxMarkerBegin 934181 @@ -870,6 +1080,8 @@ MimeEntityBegin 935373 MimeEntityHeadersEnd 935454 MimeContentBegin 935454 MimeContentEnd 935532 +Octets 78 +Lines 5 MimeEntityEnd 935534 MultipartBoundaryBegin 935534 MultipartBoundaryEnd 935568 @@ -877,11 +1089,16 @@ MimeEntityBegin 935568 MimeEntityHeadersEnd 935650 MimeContentBegin 935650 MimeContentEnd 939424 +Octets 3774 +Lines 58 MimeEntityEnd 939426 MultipartEndBoundaryBegin 939426 MultipartEndBoundaryEnd 939460 MultipartEpilogueBegin 939460 MultipartEpilogueEnd 939460 +MimeContentEnd 939462 +Octets 4125 +Lines 73 MimeEntityEnd 939462 MimeMessageEnd 939462 MboxMarkerBegin 939462 @@ -899,6 +1116,8 @@ MimeEntityBegin 940782 MimeEntityHeadersEnd 940823 MimeContentBegin 940823 MimeContentEnd 941017 +Octets 194 +Lines 7 MimeEntityEnd 941019 MultipartBoundaryBegin 941019 MultipartBoundaryEnd 941044 @@ -911,14 +1130,21 @@ MimeEntityBegin 941076 MimeEntityHeadersEnd 941897 MimeContentBegin 941897 MimeContentEnd 941908 +Octets 11 +Lines 1 MimeEntityEnd 941910 MimeMessageEnd 941910 MimeContentEnd 941910 +Octets 834 +Lines 16 MimeEntityEnd 941910 MultipartEndBoundaryBegin 941910 MultipartEndBoundaryEnd 941935 MultipartEpilogueBegin 941935 MultipartEpilogueEnd 941937 +MimeContentEnd 941939 +Octets 1299 +Lines 35 MimeEntityEnd 941939 MimeMessageEnd 941939 MboxMarkerBegin 941939 @@ -936,6 +1162,8 @@ MimeEntityBegin 943913 MimeEntityHeadersEnd 943994 MimeContentBegin 943994 MimeContentEnd 944875 +Octets 881 +Lines 19 MimeEntityEnd 944877 MultipartBoundaryBegin 944877 MultipartBoundaryEnd 944922 @@ -943,10 +1171,15 @@ MimeEntityBegin 944922 MimeEntityHeadersEnd 945088 MimeContentBegin 945088 MimeContentEnd 948790 +Octets 3702 +Lines 62 MimeEntityEnd 948792 MultipartEndBoundaryBegin 948792 MultipartEndBoundaryEnd 948837 MultipartEpilogueBegin 948837 MultipartEpilogueEnd 948839 +MimeContentEnd 948839 +Octets 4971 +Lines 92 MimeEntityEnd 948839 MimeMessageEnd 948839 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index 222cc78580..b9927f1533 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -20,6 +20,8 @@ MimeEntityBegin 680 MimeEntityHeadersEnd 682 MimeContentBegin 682 MimeContentEnd 1413 +Octets 731 +Lines 17 MimeEntityEnd 1415 MultipartBoundaryBegin 1415 MultipartBoundaryEnd 1447 @@ -27,11 +29,16 @@ MimeEntityBegin 1447 MimeEntityHeadersEnd 1535 MimeContentBegin 1535 MimeContentEnd 33007 +Octets 31472 +Lines 427 MimeEntityEnd 33009 MultipartEndBoundaryBegin 33009 MultipartEndBoundaryEnd 33041 MultipartEpilogueBegin 33041 MultipartEpilogueEnd 33041 +MimeContentEnd 33043 +Octets 32395 +Lines 452 MimeEntityEnd 33043 MultipartBoundaryBegin 33043 MultipartBoundaryEnd 33061 @@ -46,6 +53,8 @@ MimeEntityBegin 33189 MimeEntityHeadersEnd 33275 MimeContentBegin 33275 MimeContentEnd 59275 +Octets 26000 +Lines 353 MimeEntityEnd 59277 MultipartBoundaryBegin 59277 MultipartBoundaryEnd 59309 @@ -53,6 +62,8 @@ MimeEntityBegin 59309 MimeEntityHeadersEnd 59395 MimeContentBegin 59395 MimeContentEnd 78061 +Octets 18666 +Lines 254 MimeEntityEnd 78063 MultipartBoundaryBegin 78063 MultipartBoundaryEnd 78095 @@ -60,6 +71,8 @@ MimeEntityBegin 78095 MimeEntityHeadersEnd 78212 MimeContentBegin 78212 MimeContentEnd 124337 +Octets 46125 +Lines 2437 MimeEntityEnd 124339 MultipartBoundaryBegin 124339 MultipartBoundaryEnd 124371 @@ -67,11 +80,16 @@ MimeEntityBegin 124371 MimeEntityHeadersEnd 124435 MimeContentBegin 124435 MimeContentEnd 133638 +Octets 9203 +Lines 358 MimeEntityEnd 133640 MultipartEndBoundaryBegin 133640 MultipartEndBoundaryEnd 133672 MultipartEpilogueBegin 133672 MultipartEpilogueEnd 133672 +MimeContentEnd 133674 +Octets 100517 +Lines 3421 MimeEntityEnd 133674 MultipartBoundaryBegin 133674 MultipartBoundaryEnd 133692 @@ -79,11 +97,16 @@ MimeEntityBegin 133692 MimeEntityHeadersEnd 133780 MimeContentBegin 133780 MimeContentEnd 181602 +Octets 47822 +Lines 648 MimeEntityEnd 181604 MultipartEndBoundaryBegin 181604 MultipartEndBoundaryEnd 181622 MultipartEpilogueBegin 181622 MultipartEpilogueEnd 181624 +MimeContentEnd 181626 +Octets 181095 +Lines 4536 MimeEntityEnd 181626 MimeMessageEnd 181626 MboxMarkerBegin 181626 @@ -94,6 +117,8 @@ MimeEntityBegin 181635 MimeEntityHeadersEnd 182198 MimeContentBegin 182198 MimeContentEnd 319322 +Octets 137124 +Lines 1855 MimeEntityEnd 319324 MimeMessageEnd 319324 MboxMarkerBegin 319324 @@ -104,6 +129,8 @@ MimeEntityBegin 319333 MimeEntityHeadersEnd 319720 MimeContentBegin 319720 MimeContentEnd 319924 +Octets 204 +Lines 4 MimeEntityEnd 319926 MimeMessageEnd 319926 MboxMarkerBegin 319926 @@ -121,6 +148,8 @@ MimeEntityBegin 320795 MimeEntityHeadersEnd 320841 MimeContentBegin 320841 MimeContentEnd 321080 +Octets 239 +Lines 7 MimeEntityEnd 321082 MultipartBoundaryBegin 321082 MultipartBoundaryEnd 321123 @@ -135,6 +164,8 @@ MimeEntityBegin 321254 MimeEntityHeadersEnd 321348 MimeContentBegin 321348 MimeContentEnd 321497 +Octets 149 +Lines 4 MimeEntityEnd 321499 MultipartBoundaryBegin 321499 MultipartBoundaryEnd 321542 @@ -142,6 +173,8 @@ MimeEntityBegin 321542 MimeEntityHeadersEnd 321656 MimeContentBegin 321656 MimeContentEnd 326088 +Octets 4432 +Lines 65 MimeEntityEnd 326090 MultipartBoundaryBegin 326090 MultipartBoundaryEnd 326133 @@ -149,16 +182,24 @@ MimeEntityBegin 326133 MimeEntityHeadersEnd 326227 MimeContentBegin 326227 MimeContentEnd 326275 +Octets 48 +Lines 4 MimeEntityEnd 326277 MultipartEndBoundaryBegin 326277 MultipartEndBoundaryEnd 326320 MultipartEpilogueBegin 326320 MultipartEpilogueEnd 326322 +MimeContentEnd 326324 +Octets 5113 +Lines 88 MimeEntityEnd 326324 MultipartEndBoundaryBegin 326324 MultipartEndBoundaryEnd 326365 MultipartEpilogueBegin 326365 MultipartEpilogueEnd 326365 +MimeContentEnd 326367 +Octets 5771 +Lines 106 MimeEntityEnd 326367 MimeMessageEnd 326367 MboxMarkerBegin 326367 @@ -176,6 +217,8 @@ MimeEntityBegin 327403 MimeEntityHeadersEnd 327479 MimeContentBegin 327479 MimeContentEnd 327915 +Octets 436 +Lines 13 MimeEntityEnd 327917 MultipartBoundaryBegin 327917 MultipartBoundaryEnd 327980 @@ -195,6 +238,8 @@ MimeEntityBegin 329179 MimeEntityHeadersEnd 329276 MimeContentBegin 329276 MimeContentEnd 329386 +Octets 110 +Lines 7 MimeEntityEnd 329388 MultipartBoundaryBegin 329388 MultipartBoundaryEnd 329419 @@ -202,6 +247,8 @@ MimeEntityBegin 329419 MimeEntityHeadersEnd 329511 MimeContentBegin 329511 MimeContentEnd 350421 +Octets 20910 +Lines 284 MimeEntityEnd 350423 MultipartBoundaryBegin 350423 MultipartBoundaryEnd 350454 @@ -209,10 +256,17 @@ MimeEntityBegin 350454 MimeEntityHeadersEnd 350456 MimeContentBegin 350456 MimeContentEnd 350456 +Octets 0 +Lines 0 MimeEntityEnd 350456 +MimeContentEnd 350456 +Octets 21592 +Lines 309 MimeEntityEnd 350456 MimeMessageEnd 350456 MimeContentEnd 350456 +Octets 22444 +Lines 325 MimeEntityEnd 350456 MultipartBoundaryBegin 350456 MultipartBoundaryEnd 350519 @@ -220,11 +274,16 @@ MimeEntityBegin 350519 MimeEntityHeadersEnd 350595 MimeContentBegin 350595 MimeContentEnd 350706 +Octets 111 +Lines 5 MimeEntityEnd 350708 MultipartEndBoundaryBegin 350708 MultipartEndBoundaryEnd 350771 MultipartEpilogueBegin 350771 MultipartEpilogueEnd 350773 +MimeContentEnd 350775 +Octets 23634 +Lines 360 MimeEntityEnd 350775 MimeMessageEnd 350775 MboxMarkerBegin 350775 @@ -242,6 +301,8 @@ MimeEntityBegin 351717 MimeEntityHeadersEnd 351763 MimeContentBegin 351763 MimeContentEnd 352541 +Octets 778 +Lines 19 MimeEntityEnd 352543 MultipartBoundaryBegin 352543 MultipartBoundaryEnd 352584 @@ -256,6 +317,8 @@ MimeEntityBegin 352715 MimeEntityHeadersEnd 352809 MimeContentBegin 352809 MimeContentEnd 353038 +Octets 229 +Lines 5 MimeEntityEnd 353040 MultipartBoundaryBegin 353040 MultipartBoundaryEnd 353083 @@ -263,6 +326,8 @@ MimeEntityBegin 353083 MimeEntityHeadersEnd 353195 MimeContentBegin 353195 MimeContentEnd 1037241 +Octets 684046 +Lines 8983 MimeEntityEnd 1037243 MultipartBoundaryBegin 1037243 MultipartBoundaryEnd 1037286 @@ -270,6 +335,8 @@ MimeEntityBegin 1037286 MimeEntityHeadersEnd 1037380 MimeContentBegin 1037380 MimeContentEnd 1037501 +Octets 121 +Lines 6 MimeEntityEnd 1037503 MultipartBoundaryBegin 1037503 MultipartBoundaryEnd 1037546 @@ -277,6 +344,8 @@ MimeEntityBegin 1037546 MimeEntityHeadersEnd 1037676 MimeContentBegin 1037676 MimeContentEnd 1727872 +Octets 690196 +Lines 9061 MimeEntityEnd 1727874 MultipartBoundaryBegin 1727874 MultipartBoundaryEnd 1727917 @@ -284,6 +353,8 @@ MimeEntityBegin 1727917 MimeEntityHeadersEnd 1728011 MimeContentBegin 1728011 MimeContentEnd 1728023 +Octets 12 +Lines 3 MimeEntityEnd 1728025 MultipartBoundaryBegin 1728025 MultipartBoundaryEnd 1728068 @@ -291,6 +362,8 @@ MimeEntityBegin 1728068 MimeEntityHeadersEnd 1728189 MimeContentBegin 1728189 MimeContentEnd 1797301 +Octets 69112 +Lines 935 MimeEntityEnd 1797303 MultipartBoundaryBegin 1797303 MultipartBoundaryEnd 1797346 @@ -298,6 +371,8 @@ MimeEntityBegin 1797346 MimeEntityHeadersEnd 1797440 MimeContentBegin 1797440 MimeContentEnd 1797583 +Octets 143 +Lines 6 MimeEntityEnd 1797585 MultipartBoundaryBegin 1797585 MultipartBoundaryEnd 1797628 @@ -305,6 +380,8 @@ MimeEntityBegin 1797628 MimeEntityHeadersEnd 1797750 MimeContentBegin 1797750 MimeContentEnd 2138984 +Octets 341234 +Lines 4473 MimeEntityEnd 2138986 MultipartBoundaryBegin 2138986 MultipartBoundaryEnd 2139029 @@ -312,16 +389,24 @@ MimeEntityBegin 2139029 MimeEntityHeadersEnd 2139123 MimeContentBegin 2139123 MimeContentEnd 2139129 +Octets 6 +Lines 2 MimeEntityEnd 2139131 MultipartEndBoundaryBegin 2139131 MultipartEndBoundaryEnd 2139174 MultipartEpilogueBegin 2139174 MultipartEpilogueEnd 2139176 +MimeContentEnd 2139178 +Octets 1786506 +Lines 23516 MimeEntityEnd 2139178 MultipartEndBoundaryBegin 2139178 MultipartEndBoundaryEnd 2139219 MultipartEpilogueBegin 2139219 MultipartEpilogueEnd 2139219 +MimeContentEnd 2139221 +Octets 1787703 +Lines 23546 MimeEntityEnd 2139221 MimeMessageEnd 2139221 MboxMarkerBegin 2139221 @@ -332,6 +417,8 @@ MimeEntityBegin 2139230 MimeEntityHeadersEnd 2140267 MimeContentBegin 2140267 MimeContentEnd 2141431 +Octets 1164 +Lines 40 MimeEntityEnd 2141433 MimeMessageEnd 2141433 MboxMarkerBegin 2141433 @@ -349,6 +436,8 @@ MimeEntityBegin 2141705 MimeEntityHeadersEnd 2141707 MimeContentBegin 2141707 MimeContentEnd 2142012 +Octets 305 +Lines 6 MimeEntityEnd 2142014 MultipartBoundaryBegin 2142014 MultipartBoundaryEnd 2142030 @@ -363,6 +452,8 @@ MimeEntityBegin 2142126 MimeEntityHeadersEnd 2142207 MimeContentBegin 2142207 MimeContentEnd 2145483 +Octets 3276 +Lines 17 MimeEntityEnd 2145485 MultipartBoundaryBegin 2145485 MultipartBoundaryEnd 2145502 @@ -370,11 +461,16 @@ MimeEntityBegin 2145502 MimeEntityHeadersEnd 2145610 MimeContentBegin 2145610 MimeContentEnd 2302316 +Octets 156706 +Lines 808 MimeEntityEnd 2302318 MultipartEndBoundaryBegin 2302318 MultipartEndBoundaryEnd 2302335 MultipartEpilogueBegin 2302335 MultipartEpilogueEnd 2302335 +MimeContentEnd 2302337 +Octets 160228 +Lines 837 MimeEntityEnd 2302337 MultipartBoundaryBegin 2302337 MultipartBoundaryEnd 2302353 @@ -382,11 +478,16 @@ MimeEntityBegin 2302353 MimeEntityHeadersEnd 2302412 MimeContentBegin 2302412 MimeContentEnd 2307327 +Octets 4915 +Lines 196 MimeEntityEnd 2307329 MultipartEndBoundaryBegin 2307329 MultipartEndBoundaryEnd 2307345 MultipartEpilogueBegin 2307345 MultipartEpilogueEnd 2307345 +MimeContentEnd 2307347 +Octets 165658 +Lines 1050 MimeEntityEnd 2307347 MimeMessageEnd 2307347 MboxMarkerBegin 2307347 @@ -397,6 +498,8 @@ MimeEntityBegin 2307356 MimeEntityHeadersEnd 2308328 MimeContentBegin 2308328 MimeContentEnd 2655844 +Octets 347516 +Lines 4457 MimeEntityEnd 2655846 MimeMessageEnd 2655846 MboxMarkerBegin 2655846 @@ -421,6 +524,8 @@ MimeEntityBegin 2656119 MimeEntityHeadersEnd 2656121 MimeContentBegin 2656121 MimeContentEnd 2656845 +Octets 724 +Lines 18 MimeEntityEnd 2656847 MultipartBoundaryBegin 2656847 MultipartBoundaryEnd 2656879 @@ -428,16 +533,24 @@ MimeEntityBegin 2656879 MimeEntityHeadersEnd 2656980 MimeContentBegin 2656980 MimeContentEnd 2688452 +Octets 31472 +Lines 427 MimeEntityEnd 2688454 MultipartEndBoundaryBegin 2688454 MultipartEndBoundaryEnd 2688486 MultipartEpilogueBegin 2688486 MultipartEpilogueEnd 2688486 +MimeContentEnd 2688488 +Octets 32401 +Lines 453 MimeEntityEnd 2688488 MultipartEndBoundaryBegin 2688488 MultipartEndBoundaryEnd 2688506 MultipartEpilogueBegin 2688506 MultipartEpilogueEnd 2688506 +MimeContentEnd 2688508 +Octets 32514 +Lines 457 MimeEntityEnd 2688508 MimeMessageEnd 2688508 MboxMarkerBegin 2688508 @@ -448,6 +561,8 @@ MimeEntityBegin 2688517 MimeEntityHeadersEnd 2689088 MimeContentBegin 2689088 MimeContentEnd 2746649 +Octets 57561 +Lines 783 MimeEntityEnd 2746651 MimeMessageEnd 2746651 MboxMarkerBegin 2746651 @@ -465,6 +580,8 @@ MimeEntityBegin 2748003 MimeEntityHeadersEnd 2748005 MimeContentBegin 2748005 MimeContentEnd 2748571 +Octets 566 +Lines 15 MimeEntityEnd 2748573 MultipartBoundaryBegin 2748573 MultipartBoundaryEnd 2748632 @@ -479,6 +596,8 @@ MimeEntityBegin 2748799 MimeEntityHeadersEnd 2748875 MimeContentBegin 2748875 MimeContentEnd 2749301 +Octets 426 +Lines 8 MimeEntityEnd 2749303 MultipartBoundaryBegin 2749303 MultipartBoundaryEnd 2749364 @@ -486,6 +605,8 @@ MimeEntityBegin 2749364 MimeEntityHeadersEnd 2749426 MimeContentBegin 2749426 MimeContentEnd 2779088 +Octets 29662 +Lines 402 MimeEntityEnd 2779090 MultipartBoundaryBegin 2779090 MultipartBoundaryEnd 2779151 @@ -493,16 +614,24 @@ MimeEntityBegin 2779151 MimeEntityHeadersEnd 2779224 MimeContentBegin 2779224 MimeContentEnd 2779269 +Octets 45 +Lines 5 MimeEntityEnd 2779271 MultipartEndBoundaryBegin 2779271 MultipartEndBoundaryEnd 2779332 MultipartEpilogueBegin 2779332 MultipartEpilogueEnd 2779334 +MimeContentEnd 2779336 +Octets 30598 +Lines 429 MimeEntityEnd 2779336 MultipartEndBoundaryBegin 2779336 MultipartEndBoundaryEnd 2779395 MultipartEpilogueBegin 2779395 MultipartEpilogueEnd 2779395 +MimeContentEnd 2779397 +Octets 31987 +Lines 459 MimeEntityEnd 2779397 MimeMessageEnd 2779397 MboxMarkerBegin 2779397 @@ -520,6 +649,8 @@ MimeEntityBegin 2780452 MimeEntityHeadersEnd 2780454 MimeContentBegin 2780454 MimeContentEnd 2781302 +Octets 848 +Lines 28 MimeEntityEnd 2781304 MultipartBoundaryBegin 2781304 MultipartBoundaryEnd 2781334 @@ -534,6 +665,8 @@ MimeEntityBegin 2781442 MimeEntityHeadersEnd 2781470 MimeContentBegin 2781470 MimeContentEnd 2781612 +Octets 142 +Lines 6 MimeEntityEnd 2781614 MultipartBoundaryBegin 2781614 MultipartBoundaryEnd 2781646 @@ -541,6 +674,8 @@ MimeEntityBegin 2781646 MimeEntityHeadersEnd 2781714 MimeContentBegin 2781714 MimeContentEnd 2782928 +Octets 1214 +Lines 18 MimeEntityEnd 2782930 MultipartBoundaryBegin 2782930 MultipartBoundaryEnd 2782962 @@ -548,6 +683,8 @@ MimeEntityBegin 2782962 MimeEntityHeadersEnd 2782990 MimeContentBegin 2782990 MimeContentEnd 2783058 +Octets 68 +Lines 1 MimeEntityEnd 2783060 MultipartBoundaryBegin 2783060 MultipartBoundaryEnd 2783092 @@ -555,6 +692,8 @@ MimeEntityBegin 2783092 MimeEntityHeadersEnd 2783160 MimeContentBegin 2783160 MimeContentEnd 2784382 +Octets 1222 +Lines 18 MimeEntityEnd 2784384 MultipartBoundaryBegin 2784384 MultipartBoundaryEnd 2784416 @@ -562,16 +701,24 @@ MimeEntityBegin 2784416 MimeEntityHeadersEnd 2784447 MimeContentBegin 2784447 MimeContentEnd 2785006 +Octets 559 +Lines 14 MimeEntityEnd 2785008 MultipartEndBoundaryBegin 2785008 MultipartEndBoundaryEnd 2785040 MultipartEpilogueBegin 2785040 MultipartEpilogueEnd 2785042 +MimeContentEnd 2785044 +Octets 3634 +Lines 76 MimeEntityEnd 2785044 MultipartEndBoundaryBegin 2785044 MultipartEndBoundaryEnd 2785074 MultipartEpilogueBegin 2785074 MultipartEpilogueEnd 2785076 +MimeContentEnd 2785078 +Octets 5003 +Lines 119 MimeEntityEnd 2785078 MimeMessageEnd 2785078 MboxMarkerBegin 2785078 @@ -582,6 +729,8 @@ MimeEntityBegin 2785087 MimeEntityHeadersEnd 2786084 MimeContentBegin 2786084 MimeContentEnd 2787498 +Octets 1414 +Lines 33 MimeEntityEnd 2787500 MimeMessageEnd 2787500 MboxMarkerBegin 2787500 @@ -592,6 +741,8 @@ MimeEntityBegin 2787509 MimeEntityHeadersEnd 2787772 MimeContentBegin 2787772 MimeContentEnd 2788033 +Octets 261 +Lines 6 MimeEntityEnd 2788035 MimeMessageEnd 2788035 MboxMarkerBegin 2788035 @@ -602,6 +753,8 @@ MimeEntityBegin 2788044 MimeEntityHeadersEnd 2788716 MimeContentBegin 2788716 MimeContentEnd 2789453 +Octets 737 +Lines 14 MimeEntityEnd 2789455 MimeMessageEnd 2789455 MboxMarkerBegin 2789455 @@ -619,6 +772,8 @@ MimeEntityBegin 2790507 MimeEntityHeadersEnd 2790555 MimeContentBegin 2790555 MimeContentEnd 2790632 +Octets 77 +Lines 6 MimeEntityEnd 2790634 MultipartBoundaryBegin 2790634 MultipartBoundaryEnd 2790674 @@ -633,6 +788,8 @@ MimeEntityBegin 2790808 MimeEntityHeadersEnd 2790967 MimeContentBegin 2790967 MimeContentEnd 2857841 +Octets 66874 +Lines 958 MimeEntityEnd 2857843 MultipartBoundaryBegin 2857843 MultipartBoundaryEnd 2857884 @@ -640,16 +797,24 @@ MimeEntityBegin 2857884 MimeEntityHeadersEnd 2858099 MimeContentBegin 2858099 MimeContentEnd 3227661 +Octets 369562 +Lines 5282 MimeEntityEnd 3227663 MultipartEndBoundaryBegin 3227663 MultipartEndBoundaryEnd 3227704 MultipartEpilogueBegin 3227704 MultipartEpilogueEnd 3227708 +MimeContentEnd 3227710 +Octets 436947 +Lines 6257 MimeEntityEnd 3227710 MultipartEndBoundaryBegin 3227710 MultipartEndBoundaryEnd 3227750 MultipartEpilogueBegin 3227750 MultipartEpilogueEnd 3227750 +MimeContentEnd 3227752 +Octets 437289 +Lines 6272 MimeEntityEnd 3227752 MimeMessageEnd 3227752 MboxMarkerBegin 3227752 @@ -667,6 +832,8 @@ MimeEntityBegin 3228804 MimeEntityHeadersEnd 3228852 MimeContentBegin 3228852 MimeContentEnd 3228929 +Octets 77 +Lines 6 MimeEntityEnd 3228931 MultipartBoundaryBegin 3228931 MultipartBoundaryEnd 3228971 @@ -681,6 +848,8 @@ MimeEntityBegin 3229104 MimeEntityHeadersEnd 3229263 MimeContentBegin 3229263 MimeContentEnd 3296137 +Octets 66874 +Lines 958 MimeEntityEnd 3296139 MultipartBoundaryBegin 3296139 MultipartBoundaryEnd 3296180 @@ -688,16 +857,24 @@ MimeEntityBegin 3296180 MimeEntityHeadersEnd 3296395 MimeContentBegin 3296395 MimeContentEnd 3665957 +Octets 369562 +Lines 5282 MimeEntityEnd 3665959 MultipartEndBoundaryBegin 3665959 MultipartEndBoundaryEnd 3666000 MultipartEpilogueBegin 3666000 MultipartEpilogueEnd 3666004 +MimeContentEnd 3666006 +Octets 436947 +Lines 6257 MimeEntityEnd 3666006 MultipartEndBoundaryBegin 3666006 MultipartEndBoundaryEnd 3666046 MultipartEpilogueBegin 3666046 MultipartEpilogueEnd 3666046 +MimeContentEnd 3666048 +Octets 437288 +Lines 6272 MimeEntityEnd 3666048 MimeMessageEnd 3666048 MboxMarkerBegin 3666048 @@ -713,9 +890,13 @@ MimeEntityBegin 3666630 MimeEntityHeadersEnd 3666692 MimeContentBegin 3666692 MimeContentEnd 3667232 +Octets 540 +Lines 14 MimeEntityEnd 3667234 MimeMessageEnd 3667234 MimeContentEnd 3667234 +Octets 604 +Lines 17 MimeEntityEnd 3667234 MimeMessageEnd 3667234 MboxMarkerBegin 3667234 @@ -733,6 +914,8 @@ MimeEntityBegin 3668020 MimeEntityHeadersEnd 3668048 MimeContentBegin 3668048 MimeContentEnd 3668234 +Octets 186 +Lines 7 MimeEntityEnd 3668236 MultipartBoundaryBegin 3668236 MultipartBoundaryEnd 3668280 @@ -740,11 +923,16 @@ MimeEntityBegin 3668280 MimeEntityHeadersEnd 3668355 MimeContentBegin 3668355 MimeContentEnd 3669259 +Octets 904 +Lines 13 MimeEntityEnd 3669261 MultipartEndBoundaryBegin 3669261 MultipartEndBoundaryEnd 3669305 MultipartEpilogueBegin 3669305 MultipartEpilogueEnd 3669418 +MimeContentEnd 3669420 +Octets 1446 +Lines 34 MimeEntityEnd 3669420 MimeMessageEnd 3669420 MboxMarkerBegin 3669420 @@ -762,6 +950,8 @@ MimeEntityBegin 3670061 MimeEntityHeadersEnd 3670063 MimeContentBegin 3670063 MimeContentEnd 3670465 +Octets 402 +Lines 11 MimeEntityEnd 3670467 MultipartBoundaryBegin 3670467 MultipartBoundaryEnd 3670507 @@ -774,14 +964,21 @@ MimeEntityBegin 3670539 MimeEntityHeadersEnd 3671342 MimeContentBegin 3671342 MimeContentEnd 3674767 +Octets 3425 +Lines 73 MimeEntityEnd 3674769 MimeMessageEnd 3674769 MimeContentEnd 3674769 +Octets 4230 +Lines 89 MimeEntityEnd 3674769 MultipartEndBoundaryBegin 3674769 MultipartEndBoundaryEnd 3674809 MultipartEpilogueBegin 3674809 MultipartEpilogueEnd 3674811 +MimeContentEnd 3674813 +Octets 4831 +Lines 109 MimeEntityEnd 3674813 MimeMessageEnd 3674813 MboxMarkerBegin 3674813 @@ -799,6 +996,8 @@ MimeEntityBegin 3675538 MimeEntityHeadersEnd 3675566 MimeContentBegin 3675566 MimeContentEnd 3675644 +Octets 78 +Lines 5 MimeEntityEnd 3675646 MultipartBoundaryBegin 3675646 MultipartBoundaryEnd 3675696 @@ -811,14 +1010,21 @@ MimeEntityBegin 3675761 MimeEntityHeadersEnd 3676560 MimeContentBegin 3676560 MimeContentEnd 3676700 +Octets 140 +Lines 4 MimeEntityEnd 3676702 MimeMessageEnd 3676702 MimeContentEnd 3676702 +Octets 941 +Lines 21 MimeEntityEnd 3676702 MultipartEndBoundaryBegin 3676702 MultipartEndBoundaryEnd 3676752 MultipartEpilogueBegin 3676752 MultipartEpilogueEnd 3676752 +MimeContentEnd 3676754 +Octets 1266 +Lines 34 MimeEntityEnd 3676754 MimeMessageEnd 3676754 MboxMarkerBegin 3676754 @@ -829,6 +1035,8 @@ MimeEntityBegin 3676763 MimeEntityHeadersEnd 3677286 MimeContentBegin 3677286 MimeContentEnd 3678750 +Octets 1464 +Lines 46 MimeEntityEnd 3678752 MimeMessageEnd 3678752 MboxMarkerBegin 3678752 @@ -839,6 +1047,8 @@ MimeEntityBegin 3678804 MimeEntityHeadersEnd 3679391 MimeContentBegin 3679391 MimeContentEnd 3740046 +Octets 60655 +Lines 955 MimeEntityEnd 3740048 MimeMessageEnd 3740048 MboxMarkerBegin 3740048 @@ -849,6 +1059,8 @@ MimeEntityBegin 3740100 MimeEntityHeadersEnd 3740684 MimeContentBegin 3740684 MimeContentEnd 3801451 +Octets 60767 +Lines 961 MimeEntityEnd 3801453 MimeMessageEnd 3801453 MboxMarkerBegin 3801453 @@ -866,6 +1078,8 @@ MimeEntityBegin 3802041 MimeEntityHeadersEnd 3802070 MimeContentBegin 3802070 MimeContentEnd 3802145 +Octets 75 +Lines 5 MimeEntityEnd 3802147 MultipartBoundaryBegin 3802147 MultipartBoundaryEnd 3802163 @@ -873,11 +1087,16 @@ MimeEntityBegin 3802163 MimeEntityHeadersEnd 3802247 MimeContentBegin 3802247 MimeContentEnd 3802897 +Octets 650 +Lines 10 MimeEntityEnd 3802899 MultipartEndBoundaryBegin 3802899 MultipartEndBoundaryEnd 3802915 MultipartEpilogueBegin 3802915 MultipartEpilogueEnd 3802919 +MimeContentEnd 3802921 +Octets 898 +Lines 26 MimeEntityEnd 3802921 MimeMessageEnd 3802921 MboxMarkerBegin 3802921 @@ -888,6 +1107,8 @@ MimeEntityBegin 3802930 MimeEntityHeadersEnd 3803695 MimeContentBegin 3803695 MimeContentEnd 3845795 +Octets 42100 +Lines 571 MimeEntityEnd 3845797 MimeMessageEnd 3845797 MboxMarkerBegin 3845797 @@ -905,6 +1126,8 @@ MimeEntityBegin 3846991 MimeEntityHeadersEnd 3846993 MimeContentBegin 3846993 MimeContentEnd 3848958 +Octets 1965 +Lines 44 MimeEntityEnd 3848960 MultipartBoundaryBegin 3848960 MultipartBoundaryEnd 3848966 @@ -912,11 +1135,16 @@ MimeEntityBegin 3848966 MimeEntityHeadersEnd 3849075 MimeContentBegin 3849075 MimeContentEnd 3855383 +Octets 6308 +Lines 87 MimeEntityEnd 3855385 MultipartEndBoundaryBegin 3855385 MultipartEndBoundaryEnd 3855391 MultipartEpilogueBegin 3855391 MultipartEpilogueEnd 3855393 +MimeContentEnd 3855395 +Octets 8410 +Lines 140 MimeEntityEnd 3855395 MimeMessageEnd 3855395 MboxMarkerBegin 3855395 @@ -927,6 +1155,8 @@ MimeEntityBegin 3855404 MimeEntityHeadersEnd 3856880 MimeContentBegin 3856880 MimeContentEnd 3965263 +Octets 108383 +Lines 1571 MimeEntityEnd 3965265 MimeMessageEnd 3965265 MboxMarkerBegin 3965265 @@ -959,6 +1189,8 @@ MimeEntityBegin 3967704 MimeEntityHeadersEnd 3967783 MimeContentBegin 3967783 MimeContentEnd 3967833 +Octets 50 +Lines 2 MimeEntityEnd 3967835 MultipartBoundaryBegin 3967835 MultipartBoundaryEnd 3967894 @@ -978,6 +1210,8 @@ MimeEntityBegin 3968572 MimeEntityHeadersEnd 3968651 MimeContentBegin 3968651 MimeContentEnd 3968778 +Octets 127 +Lines 6 MimeEntityEnd 3968780 MultipartBoundaryBegin 3968780 MultipartBoundaryEnd 3968829 @@ -985,28 +1219,44 @@ MimeEntityBegin 3968829 MimeEntityHeadersEnd 3968901 MimeContentBegin 3968901 MimeContentEnd 3969188 +Octets 287 +Lines 5 MimeEntityEnd 3969190 MultipartEndBoundaryBegin 3969190 MultipartEndBoundaryEnd 3969239 MultipartEpilogueBegin 3969239 MultipartEpilogueEnd 3969241 +MimeContentEnd 3969243 +Octets 768 +Lines 23 MimeEntityEnd 3969243 MimeMessageEnd 3969243 MimeContentEnd 3969243 +Octets 1284 +Lines 39 MimeEntityEnd 3969243 MultipartEndBoundaryBegin 3969243 MultipartEndBoundaryEnd 3969302 MultipartEpilogueBegin 3969302 MultipartEpilogueEnd 3969308 +MimeContentEnd 3969310 +Octets 1713 +Lines 55 MimeEntityEnd 3969310 MimeMessageEnd 3969310 MimeContentEnd 3969310 +Octets 2277 +Lines 71 MimeEntityEnd 3969310 MimeMessageEnd 3969310 MimeContentEnd 3969310 +Octets 2835 +Lines 87 MimeEntityEnd 3969310 MimeMessageEnd 3969310 MimeContentEnd 3969310 +Octets 3421 +Lines 103 MimeEntityEnd 3969310 MimeMessageEnd 3969310 MboxMarkerBegin 3969310 @@ -1024,6 +1274,8 @@ MimeEntityBegin 3970066 MimeEntityHeadersEnd 3970068 MimeContentBegin 3970068 MimeContentEnd 3970110 +Octets 42 +Lines 2 MimeEntityEnd 3970112 MultipartBoundaryBegin 3970112 MultipartBoundaryEnd 3970140 @@ -1031,6 +1283,8 @@ MimeEntityBegin 3970140 MimeEntityHeadersEnd 3970290 MimeContentBegin 3970290 MimeContentEnd 4047906 +Octets 77616 +Lines 401 MimeEntityEnd 4047908 MultipartBoundaryBegin 4047908 MultipartBoundaryEnd 4047936 @@ -1038,6 +1292,8 @@ MimeEntityBegin 4047936 MimeEntityHeadersEnd 4047938 MimeContentBegin 4047938 MimeContentEnd 4047972 +Octets 34 +Lines 4 MimeEntityEnd 4047974 MultipartBoundaryBegin 4047974 MultipartBoundaryEnd 4048002 @@ -1045,6 +1301,8 @@ MimeEntityBegin 4048002 MimeEntityHeadersEnd 4048154 MimeContentBegin 4048154 MimeContentEnd 4151890 +Octets 103736 +Lines 535 MimeEntityEnd 4151892 MultipartBoundaryBegin 4151892 MultipartBoundaryEnd 4151920 @@ -1052,6 +1310,8 @@ MimeEntityBegin 4151920 MimeEntityHeadersEnd 4151922 MimeContentBegin 4151922 MimeContentEnd 4152086 +Octets 164 +Lines 5 MimeEntityEnd 4152088 MultipartBoundaryBegin 4152088 MultipartBoundaryEnd 4152116 @@ -1059,6 +1319,8 @@ MimeEntityBegin 4152116 MimeEntityHeadersEnd 4152208 MimeContentBegin 4152208 MimeContentEnd 4233632 +Octets 81424 +Lines 1235 MimeEntityEnd 4233634 MultipartBoundaryBegin 4233634 MultipartBoundaryEnd 4233662 @@ -1066,11 +1328,16 @@ MimeEntityBegin 4233662 MimeEntityHeadersEnd 4233664 MimeContentBegin 4233664 MimeContentEnd 4233686 +Octets 22 +Lines 3 MimeEntityEnd 4233688 MultipartEndBoundaryBegin 4233688 MultipartEndBoundaryEnd 4233716 MultipartEpilogueBegin 4233716 MultipartEpilogueEnd 4233718 +MimeContentEnd 4233720 +Octets 263682 +Lines 2211 MimeEntityEnd 4233720 MimeMessageEnd 4233720 MboxMarkerBegin 4233720 @@ -1081,6 +1348,8 @@ MimeEntityBegin 4233729 MimeEntityHeadersEnd 4234408 MimeContentBegin 4234408 MimeContentEnd 4235418 +Octets 1010 +Lines 19 MimeEntityEnd 4235420 MimeMessageEnd 4235420 MboxMarkerBegin 4235420 @@ -1098,6 +1367,8 @@ MimeEntityBegin 4236707 MimeEntityHeadersEnd 4236753 MimeContentBegin 4236753 MimeContentEnd 4237170 +Octets 417 +Lines 14 MimeEntityEnd 4237172 MultipartBoundaryBegin 4237172 MultipartBoundaryEnd 4237213 @@ -1112,6 +1383,8 @@ MimeEntityBegin 4237344 MimeEntityHeadersEnd 4237438 MimeContentBegin 4237438 MimeContentEnd 4237667 +Octets 229 +Lines 5 MimeEntityEnd 4237669 MultipartBoundaryBegin 4237669 MultipartBoundaryEnd 4237712 @@ -1119,6 +1392,8 @@ MimeEntityBegin 4237712 MimeEntityHeadersEnd 4237835 MimeContentBegin 4237835 MimeContentEnd 4239256 +Octets 1421 +Lines 38 MimeEntityEnd 4239258 MultipartBoundaryBegin 4239258 MultipartBoundaryEnd 4239301 @@ -1126,16 +1401,24 @@ MimeEntityBegin 4239301 MimeEntityHeadersEnd 4239395 MimeContentBegin 4239395 MimeContentEnd 4239552 +Octets 157 +Lines 10 MimeEntityEnd 4239554 MultipartEndBoundaryBegin 4239554 MultipartEndBoundaryEnd 4239597 MultipartEpilogueBegin 4239597 MultipartEpilogueEnd 4239599 +MimeContentEnd 4239601 +Octets 2300 +Lines 68 MimeEntityEnd 4239601 MultipartEndBoundaryBegin 4239601 MultipartEndBoundaryEnd 4239642 MultipartEpilogueBegin 4239642 MultipartEpilogueEnd 4239644 +MimeContentEnd 4239646 +Octets 3138 +Lines 94 MimeEntityEnd 4239646 MimeMessageEnd 4239646 MboxMarkerBegin 4239646 @@ -1153,6 +1436,8 @@ MimeEntityBegin 4240358 MimeEntityHeadersEnd 4240387 MimeContentBegin 4240387 MimeContentEnd 4240471 +Octets 84 +Lines 7 MimeEntityEnd 4240473 MultipartBoundaryBegin 4240473 MultipartBoundaryEnd 4240490 @@ -1160,11 +1445,16 @@ MimeEntityBegin 4240490 MimeEntityHeadersEnd 4240553 MimeContentBegin 4240553 MimeContentEnd 4245787 +Octets 5234 +Lines 72 MimeEntityEnd 4245789 MultipartEndBoundaryBegin 4245789 MultipartEndBoundaryEnd 4245806 MultipartEpilogueBegin 4245806 MultipartEpilogueEnd 4245810 +MimeContentEnd 4245812 +Octets 5471 +Lines 89 MimeEntityEnd 4245812 MimeMessageEnd 4245812 MboxMarkerBegin 4245812 @@ -1175,6 +1465,8 @@ MimeEntityBegin 4245821 MimeEntityHeadersEnd 4246287 MimeContentBegin 4246287 MimeContentEnd 4257886 +Octets 11599 +Lines 186 MimeEntityEnd 4257888 MimeMessageEnd 4257888 MboxMarkerBegin 4257888 @@ -1192,6 +1484,8 @@ MimeEntityBegin 4258489 MimeEntityHeadersEnd 4258491 MimeContentBegin 4258491 MimeContentEnd 4258530 +Octets 39 +Lines 2 MimeEntityEnd 4258532 MultipartBoundaryBegin 4258532 MultipartBoundaryEnd 4258544 @@ -1211,9 +1505,13 @@ MimeEntityBegin 4258736 MimeEntityHeadersEnd 4258816 MimeContentBegin 4258816 MimeContentEnd 4258885 +Octets 69 +Lines 3 MimeEntityEnd 4258887 MimeMessageEnd 4258887 MimeContentEnd 4258887 +Octets 151 +Lines 6 MimeEntityEnd 4258887 MultipartBoundaryBegin 4258887 MultipartBoundaryEnd 4258902 @@ -1226,9 +1524,13 @@ MimeEntityBegin 4259095 MimeEntityHeadersEnd 4259175 MimeContentBegin 4259175 MimeContentEnd 4259175 +Octets 0 +Lines 0 MimeEntityEnd 4259175 MimeMessageEnd 4259175 MimeContentEnd 4259175 +Octets 80 +Lines 3 MimeEntityEnd 4259175 MultipartBoundaryBegin 4259175 MultipartBoundaryEnd 4259190 @@ -1241,9 +1543,13 @@ MimeEntityBegin 4259332 MimeEntityHeadersEnd 4259403 MimeContentBegin 4259403 MimeContentEnd 4259403 +Octets 0 +Lines 0 MimeEntityEnd 4259403 MimeMessageEnd 4259403 MimeContentEnd 4259403 +Octets 71 +Lines 3 MimeEntityEnd 4259403 MultipartBoundaryBegin 4259403 MultipartBoundaryEnd 4259418 @@ -1256,9 +1562,13 @@ MimeEntityBegin 4259535 MimeEntityHeadersEnd 4259607 MimeContentBegin 4259607 MimeContentEnd 4259607 +Octets 0 +Lines 0 MimeEntityEnd 4259607 MimeMessageEnd 4259607 MimeContentEnd 4259607 +Octets 72 +Lines 3 MimeEntityEnd 4259607 MultipartBoundaryBegin 4259607 MultipartBoundaryEnd 4259622 @@ -1271,19 +1581,29 @@ MimeEntityBegin 4259731 MimeEntityHeadersEnd 4259803 MimeContentBegin 4259803 MimeContentEnd 4259803 +Octets 0 +Lines 0 MimeEntityEnd 4259803 MimeMessageEnd 4259803 MimeContentEnd 4259803 +Octets 72 +Lines 3 MimeEntityEnd 4259803 MultipartEndBoundaryBegin 4259803 MultipartEndBoundaryEnd 4259818 MultipartEpilogueBegin 4259818 MultipartEpilogueEnd 4259820 +MimeContentEnd 4259822 +Octets 1221 +Lines 50 MimeEntityEnd 4259822 MultipartEndBoundaryBegin 4259822 MultipartEndBoundaryEnd 4259834 MultipartEpilogueBegin 4259834 MultipartEpilogueEnd 4259836 +MimeContentEnd 4259838 +Octets 1361 +Lines 59 MimeEntityEnd 4259838 MimeMessageEnd 4259838 MboxMarkerBegin 4259838 @@ -1301,6 +1621,8 @@ MimeEntityBegin 4260439 MimeEntityHeadersEnd 4260441 MimeContentBegin 4260441 MimeContentEnd 4263710 +Octets 3269 +Lines 66 MimeEntityEnd 4263712 MultipartBoundaryBegin 4263712 MultipartBoundaryEnd 4263724 @@ -1320,9 +1642,13 @@ MimeEntityBegin 4263922 MimeEntityHeadersEnd 4264002 MimeContentBegin 4264002 MimeContentEnd 4264071 +Octets 69 +Lines 3 MimeEntityEnd 4264073 MimeMessageEnd 4264073 MimeContentEnd 4264073 +Octets 151 +Lines 6 MimeEntityEnd 4264073 MultipartBoundaryBegin 4264073 MultipartBoundaryEnd 4264088 @@ -1335,19 +1661,29 @@ MimeEntityBegin 4264281 MimeEntityHeadersEnd 4264361 MimeContentBegin 4264361 MimeContentEnd 4264361 +Octets 0 +Lines 0 MimeEntityEnd 4264361 MimeMessageEnd 4264361 MimeContentEnd 4264361 +Octets 80 +Lines 3 MimeEntityEnd 4264361 MultipartEndBoundaryBegin 4264361 MultipartEndBoundaryEnd 4264376 MultipartEpilogueBegin 4264376 MultipartEpilogueEnd 4264378 +MimeContentEnd 4264380 +Octets 593 +Lines 23 MimeEntityEnd 4264380 MultipartEndBoundaryBegin 4264380 MultipartEndBoundaryEnd 4264392 MultipartEpilogueBegin 4264392 MultipartEpilogueEnd 4264394 +MimeContentEnd 4264396 +Octets 3969 +Lines 96 MimeEntityEnd 4264396 MimeMessageEnd 4264396 MboxMarkerBegin 4264396 @@ -1370,9 +1706,13 @@ MimeEntityBegin 4265110 MimeEntityHeadersEnd 4265550 MimeContentBegin 4265550 MimeContentEnd 4265589 +Octets 39 +Lines 3 MimeEntityEnd 4265591 MimeMessageEnd 4265591 MimeContentEnd 4265591 +Octets 481 +Lines 14 MimeEntityEnd 4265591 MultipartBoundaryBegin 4265591 MultipartBoundaryEnd 4265619 @@ -1380,6 +1720,8 @@ MimeEntityBegin 4265619 MimeEntityHeadersEnd 4265746 MimeContentBegin 4265746 MimeContentEnd 4266210 +Octets 464 +Lines 7 MimeEntityEnd 4266212 MultipartBoundaryBegin 4266212 MultipartBoundaryEnd 4266240 @@ -1387,6 +1729,8 @@ MimeEntityBegin 4266240 MimeEntityHeadersEnd 4266367 MimeContentBegin 4266367 MimeContentEnd 4266859 +Octets 492 +Lines 7 MimeEntityEnd 4266861 MultipartBoundaryBegin 4266861 MultipartBoundaryEnd 4266889 @@ -1394,6 +1738,8 @@ MimeEntityBegin 4266889 MimeEntityHeadersEnd 4267020 MimeContentBegin 4267020 MimeContentEnd 4267554 +Octets 534 +Lines 8 MimeEntityEnd 4267556 MultipartBoundaryBegin 4267556 MultipartBoundaryEnd 4267584 @@ -1401,6 +1747,8 @@ MimeEntityBegin 4267584 MimeEntityHeadersEnd 4267713 MimeContentBegin 4267713 MimeContentEnd 4268217 +Octets 504 +Lines 7 MimeEntityEnd 4268219 MultipartBoundaryBegin 4268219 MultipartBoundaryEnd 4268247 @@ -1413,9 +1761,13 @@ MimeEntityBegin 4268396 MimeEntityHeadersEnd 4268836 MimeContentBegin 4268836 MimeContentEnd 4268874 +Octets 38 +Lines 2 MimeEntityEnd 4268876 MimeMessageEnd 4268876 MimeContentEnd 4268876 +Octets 480 +Lines 13 MimeEntityEnd 4268876 MultipartBoundaryBegin 4268876 MultipartBoundaryEnd 4268904 @@ -1438,15 +1790,23 @@ MimeEntityBegin 4270190 MimeEntityHeadersEnd 4270611 MimeContentBegin 4270611 MimeContentEnd 4270617 +Octets 6 +Lines 2 MimeEntityEnd 4270619 MimeMessageEnd 4270619 MimeContentEnd 4270619 +Octets 429 +Lines 13 MimeEntityEnd 4270619 MimeMessageEnd 4270619 MimeContentEnd 4270619 +Octets 954 +Lines 27 MimeEntityEnd 4270619 MimeMessageEnd 4270619 MimeContentEnd 4270619 +Octets 1539 +Lines 42 MimeEntityEnd 4270619 MultipartBoundaryBegin 4270619 MultipartBoundaryEnd 4270647 @@ -1454,11 +1814,16 @@ MimeEntityBegin 4270647 MimeEntityHeadersEnd 4270703 MimeContentBegin 4270703 MimeContentEnd 4270756 +Octets 53 +Lines 2 MimeEntityEnd 4270758 MultipartEndBoundaryBegin 4270758 MultipartEndBoundaryEnd 4270786 MultipartEpilogueBegin 4270786 MultipartEpilogueEnd 4270786 +MimeContentEnd 4270788 +Octets 5903 +Lines 145 MimeEntityEnd 4270788 MimeMessageEnd 4270788 MboxMarkerBegin 4270788 @@ -1481,9 +1846,13 @@ MimeEntityBegin 4271509 MimeEntityHeadersEnd 4271948 MimeContentBegin 4271948 MimeContentEnd 4271987 +Octets 39 +Lines 3 MimeEntityEnd 4271989 MimeMessageEnd 4271989 MimeContentEnd 4271989 +Octets 480 +Lines 14 MimeEntityEnd 4271989 MultipartBoundaryBegin 4271989 MultipartBoundaryEnd 4272017 @@ -1491,6 +1860,8 @@ MimeEntityBegin 4272017 MimeEntityHeadersEnd 4272148 MimeContentBegin 4272148 MimeContentEnd 4272612 +Octets 464 +Lines 7 MimeEntityEnd 4272614 MultipartBoundaryBegin 4272614 MultipartBoundaryEnd 4272642 @@ -1498,6 +1869,8 @@ MimeEntityBegin 4272642 MimeEntityHeadersEnd 4272773 MimeContentBegin 4272773 MimeContentEnd 4273265 +Octets 492 +Lines 7 MimeEntityEnd 4273267 MultipartBoundaryBegin 4273267 MultipartBoundaryEnd 4273295 @@ -1505,6 +1878,8 @@ MimeEntityBegin 4273295 MimeEntityHeadersEnd 4273430 MimeContentBegin 4273430 MimeContentEnd 4273964 +Octets 534 +Lines 8 MimeEntityEnd 4273966 MultipartBoundaryBegin 4273966 MultipartBoundaryEnd 4273994 @@ -1512,6 +1887,8 @@ MimeEntityBegin 4273994 MimeEntityHeadersEnd 4274127 MimeContentBegin 4274127 MimeContentEnd 4274631 +Octets 504 +Lines 7 MimeEntityEnd 4274633 MultipartBoundaryBegin 4274633 MultipartBoundaryEnd 4274661 @@ -1524,9 +1901,13 @@ MimeEntityBegin 4274814 MimeEntityHeadersEnd 4275253 MimeContentBegin 4275253 MimeContentEnd 4275291 +Octets 38 +Lines 2 MimeEntityEnd 4275293 MimeMessageEnd 4275293 MimeContentEnd 4275293 +Octets 479 +Lines 13 MimeEntityEnd 4275293 MultipartBoundaryBegin 4275293 MultipartBoundaryEnd 4275321 @@ -1549,15 +1930,23 @@ MimeEntityBegin 4276617 MimeEntityHeadersEnd 4277037 MimeContentBegin 4277037 MimeContentEnd 4277043 +Octets 6 +Lines 2 MimeEntityEnd 4277045 MimeMessageEnd 4277045 MimeContentEnd 4277045 +Octets 428 +Lines 13 MimeEntityEnd 4277045 MimeMessageEnd 4277045 MimeContentEnd 4277045 +Octets 956 +Lines 27 MimeEntityEnd 4277045 MimeMessageEnd 4277045 MimeContentEnd 4277045 +Octets 1544 +Lines 42 MimeEntityEnd 4277045 MultipartBoundaryBegin 4277045 MultipartBoundaryEnd 4277073 @@ -1565,11 +1954,16 @@ MimeEntityBegin 4277073 MimeEntityHeadersEnd 4277133 MimeContentBegin 4277133 MimeContentEnd 4277186 +Octets 53 +Lines 2 MimeEntityEnd 4277188 MultipartEndBoundaryBegin 4277188 MultipartEndBoundaryEnd 4277216 MultipartEpilogueBegin 4277216 MultipartEpilogueEnd 4277216 +MimeContentEnd 4277218 +Octets 5938 +Lines 145 MimeEntityEnd 4277218 MimeMessageEnd 4277218 MboxMarkerBegin 4277218 @@ -1587,6 +1981,8 @@ MimeEntityBegin 4277981 MimeEntityHeadersEnd 4278012 MimeContentBegin 4278012 MimeContentEnd 4278458 +Octets 446 +Lines 31 MimeEntityEnd 4278460 MultipartBoundaryBegin 4278460 MultipartBoundaryEnd 4278467 @@ -1594,6 +1990,8 @@ MimeEntityBegin 4278467 MimeEntityHeadersEnd 4278543 MimeContentBegin 4278543 MimeContentEnd 4279216 +Octets 673 +Lines 43 MimeEntityEnd 4279218 MultipartBoundaryBegin 4279218 MultipartBoundaryEnd 4279225 @@ -1601,6 +1999,8 @@ MimeEntityBegin 4279225 MimeEntityHeadersEnd 4279227 MimeContentBegin 4279227 MimeContentEnd 4279245 +Octets 18 +Lines 1 MimeEntityEnd 4279247 MultipartBoundaryBegin 4279247 MultipartBoundaryEnd 4279254 @@ -1608,6 +2008,8 @@ MimeEntityBegin 4279254 MimeEntityHeadersEnd 4279256 MimeContentBegin 4279256 MimeContentEnd 4279267 +Octets 11 +Lines 1 MimeEntityEnd 4279269 MultipartBoundaryBegin 4279269 MultipartBoundaryEnd 4279276 @@ -1627,6 +2029,8 @@ MimeEntityBegin 4279537 MimeEntityHeadersEnd 4279564 MimeContentBegin 4279564 MimeContentEnd 4279587 +Octets 23 +Lines 1 MimeEntityEnd 4279589 MultipartBoundaryBegin 4279589 MultipartBoundaryEnd 4279596 @@ -1634,14 +2038,21 @@ MimeEntityBegin 4279596 MimeEntityHeadersEnd 4279776 MimeContentBegin 4279776 MimeContentEnd 4279815 +Octets 39 +Lines 2 MimeEntityEnd 4279817 MultipartEndBoundaryBegin 4279817 MultipartEndBoundaryEnd 4279824 MultipartEpilogueBegin 4279824 MultipartEpilogueEnd 4279824 +MimeContentEnd 4279826 +Octets 296 +Lines 13 MimeEntityEnd 4279826 MimeMessageEnd 4279826 MimeContentEnd 4279826 +Octets 518 +Lines 20 MimeEntityEnd 4279826 MultipartBoundaryBegin 4279826 MultipartBoundaryEnd 4279833 @@ -1649,6 +2060,8 @@ MimeEntityBegin 4279833 MimeEntityHeadersEnd 4279914 MimeContentBegin 4279914 MimeContentEnd 4289472 +Octets 9558 +Lines 128 MimeEntityEnd 4289474 MultipartBoundaryBegin 4289474 MultipartBoundaryEnd 4289481 @@ -1656,6 +2069,8 @@ MimeEntityBegin 4289481 MimeEntityHeadersEnd 4289661 MimeContentBegin 4289661 MimeContentEnd 4289700 +Octets 39 +Lines 2 MimeEntityEnd 4289702 MultipartBoundaryBegin 4289702 MultipartBoundaryEnd 4289709 @@ -1663,6 +2078,8 @@ MimeEntityBegin 4289709 MimeEntityHeadersEnd 4289861 MimeContentBegin 4289861 MimeContentEnd 4297809 +Octets 7948 +Lines 128 MimeEntityEnd 4297811 MultipartBoundaryBegin 4297811 MultipartBoundaryEnd 4297818 @@ -1682,9 +2099,13 @@ MimeEntityBegin 4297885 MimeEntityHeadersEnd 4297914 MimeContentBegin 4297914 MimeContentEnd 4297919 +Octets 5 +Lines 1 MimeEntityEnd 4297921 MimeMessageEnd 4297921 MimeContentEnd 4297921 +Octets 36 +Lines 4 MimeEntityEnd 4297921 MultipartBoundaryBegin 4297921 MultipartBoundaryEnd 4297932 @@ -1697,9 +2118,13 @@ MimeEntityBegin 4297934 MimeEntityHeadersEnd 4297963 MimeContentBegin 4297963 MimeContentEnd 4297968 +Octets 5 +Lines 1 MimeEntityEnd 4297970 MimeMessageEnd 4297970 MimeContentEnd 4297970 +Octets 36 +Lines 4 MimeEntityEnd 4297970 MultipartBoundaryBegin 4297970 MultipartBoundaryEnd 4297981 @@ -1712,9 +2137,13 @@ MimeEntityBegin 4297983 MimeEntityHeadersEnd 4298012 MimeContentBegin 4298012 MimeContentEnd 4298017 +Octets 5 +Lines 1 MimeEntityEnd 4298019 MimeMessageEnd 4298019 MimeContentEnd 4298019 +Octets 36 +Lines 4 MimeEntityEnd 4298019 MultipartBoundaryBegin 4298019 MultipartBoundaryEnd 4298030 @@ -1722,6 +2151,8 @@ MimeEntityBegin 4298030 MimeEntityHeadersEnd 4298057 MimeContentBegin 4298057 MimeContentEnd 4298140 +Octets 83 +Lines 2 MimeEntityEnd 4298142 MultipartBoundaryBegin 4298142 MultipartBoundaryEnd 4298153 @@ -1734,9 +2165,13 @@ MimeEntityBegin 4298155 MimeEntityHeadersEnd 4298213 MimeContentBegin 4298213 MimeContentEnd 4298262 +Octets 49 +Lines 1 MimeEntityEnd 4298264 MimeMessageEnd 4298264 MimeContentEnd 4298264 +Octets 109 +Lines 5 MimeEntityEnd 4298264 MultipartBoundaryBegin 4298264 MultipartBoundaryEnd 4298275 @@ -1749,19 +2184,29 @@ MimeEntityBegin 4298277 MimeEntityHeadersEnd 4298306 MimeContentBegin 4298306 MimeContentEnd 4298311 +Octets 5 +Lines 1 MimeEntityEnd 4298313 MimeMessageEnd 4298313 MimeContentEnd 4298313 +Octets 36 +Lines 4 MimeEntityEnd 4298313 MultipartEndBoundaryBegin 4298313 MultipartEndBoundaryEnd 4298324 MultipartEpilogueBegin 4298324 MultipartEpilogueEnd 4298324 +MimeContentEnd 4298326 +Octets 454 +Lines 37 MimeEntityEnd 4298326 MultipartEndBoundaryBegin 4298326 MultipartEndBoundaryEnd 4298333 MultipartEpilogueBegin 4298333 MultipartEpilogueEnd 4298376 +MimeContentEnd 4298378 +Octets 20447 +Lines 428 MimeEntityEnd 4298378 MimeMessageEnd 4298378 MboxMarkerBegin 4298378 @@ -1779,6 +2224,8 @@ MimeEntityBegin 4299090 MimeEntityHeadersEnd 4299092 MimeContentBegin 4299092 MimeContentEnd 4300338 +Octets 1246 +Lines 27 MimeEntityEnd 4300340 MultipartBoundaryBegin 4300340 MultipartBoundaryEnd 4300367 @@ -1786,6 +2233,8 @@ MimeEntityBegin 4300367 MimeEntityHeadersEnd 4300517 MimeContentBegin 4300517 MimeContentEnd 4372203 +Octets 71686 +Lines 370 MimeEntityEnd 4372205 MultipartBoundaryBegin 4372205 MultipartBoundaryEnd 4372232 @@ -1793,11 +2242,16 @@ MimeEntityBegin 4372232 MimeEntityHeadersEnd 4372234 MimeContentBegin 4372234 MimeContentEnd 4372234 +Octets 0 +Lines 1 MimeEntityEnd 4372236 MultipartEndBoundaryBegin 4372236 MultipartEndBoundaryEnd 4372263 MultipartEpilogueBegin 4372263 MultipartEpilogueEnd 4372265 +MimeContentEnd 4372267 +Octets 73204 +Lines 410 MimeEntityEnd 4372267 MimeMessageEnd 4372267 MboxMarkerBegin 4372267 @@ -1808,6 +2262,8 @@ MimeEntityBegin 4372276 MimeEntityHeadersEnd 4373229 MimeContentBegin 4373229 MimeContentEnd 4625700 +Octets 252471 +Lines 3431 MimeEntityEnd 4625702 MimeMessageEnd 4625702 MboxMarkerBegin 4625702 @@ -1825,6 +2281,8 @@ MimeEntityBegin 4626905 MimeEntityHeadersEnd 4626981 MimeContentBegin 4626981 MimeContentEnd 4627454 +Octets 473 +Lines 10 MimeEntityEnd 4627456 MultipartBoundaryBegin 4627456 MultipartBoundaryEnd 4627502 @@ -1832,6 +2290,8 @@ MimeEntityBegin 4627502 MimeEntityHeadersEnd 4627564 MimeContentBegin 4627564 MimeContentEnd 4652132 +Octets 24568 +Lines 333 MimeEntityEnd 4652134 MultipartBoundaryBegin 4652134 MultipartBoundaryEnd 4652180 @@ -1839,6 +2299,8 @@ MimeEntityBegin 4652180 MimeEntityHeadersEnd 4652256 MimeContentBegin 4652256 MimeContentEnd 4652714 +Octets 458 +Lines 11 MimeEntityEnd 4652716 MultipartBoundaryBegin 4652716 MultipartBoundaryEnd 4652762 @@ -1846,6 +2308,8 @@ MimeEntityBegin 4652762 MimeEntityHeadersEnd 4652824 MimeContentBegin 4652824 MimeContentEnd 4664192 +Octets 11368 +Lines 155 MimeEntityEnd 4664194 MultipartBoundaryBegin 4664194 MultipartBoundaryEnd 4664240 @@ -1853,6 +2317,8 @@ MimeEntityBegin 4664240 MimeEntityHeadersEnd 4664316 MimeContentBegin 4664316 MimeContentEnd 4664626 +Octets 310 +Lines 7 MimeEntityEnd 4664628 MultipartBoundaryBegin 4664628 MultipartBoundaryEnd 4664674 @@ -1860,6 +2326,8 @@ MimeEntityBegin 4664674 MimeEntityHeadersEnd 4664736 MimeContentBegin 4664736 MimeContentEnd 4681412 +Octets 16676 +Lines 227 MimeEntityEnd 4681414 MultipartBoundaryBegin 4681414 MultipartBoundaryEnd 4681460 @@ -1867,11 +2335,16 @@ MimeEntityBegin 4681460 MimeEntityHeadersEnd 4681536 MimeContentBegin 4681536 MimeContentEnd 4682211 +Octets 675 +Lines 16 MimeEntityEnd 4682213 MultipartEndBoundaryBegin 4682213 MultipartEndBoundaryEnd 4682259 MultipartEpilogueBegin 4682259 MultipartEpilogueEnd 4682261 +MimeContentEnd 4682263 +Octets 55603 +Lines 793 MimeEntityEnd 4682263 MimeMessageEnd 4682263 MboxMarkerBegin 4682263 @@ -1889,6 +2362,8 @@ MimeEntityBegin 4683137 MimeEntityHeadersEnd 4683139 MimeContentBegin 4683139 MimeContentEnd 4683807 +Octets 668 +Lines 19 MimeEntityEnd 4683809 MultipartBoundaryBegin 4683809 MultipartBoundaryEnd 4683839 @@ -1896,11 +2371,16 @@ MimeEntityBegin 4683839 MimeEntityHeadersEnd 4683902 MimeContentBegin 4683902 MimeContentEnd 4731116 +Octets 47214 +Lines 762 MimeEntityEnd 4731118 MultipartEndBoundaryBegin 4731118 MultipartEndBoundaryEnd 4731148 MultipartEpilogueBegin 4731148 MultipartEpilogueEnd 4731150 +MimeContentEnd 4731152 +Octets 48045 +Lines 789 MimeEntityEnd 4731152 MimeMessageEnd 4731152 MboxMarkerBegin 4731152 @@ -1918,6 +2398,8 @@ MimeEntityBegin 4732387 MimeEntityHeadersEnd 4732463 MimeContentBegin 4732463 MimeContentEnd 4737938 +Octets 5475 +Lines 161 MimeEntityEnd 4737940 MultipartBoundaryBegin 4737940 MultipartBoundaryEnd 4737964 @@ -1925,6 +2407,8 @@ MimeEntityBegin 4737964 MimeEntityHeadersEnd 4738065 MimeContentBegin 4738065 MimeContentEnd 4740681 +Octets 2616 +Lines 37 MimeEntityEnd 4740683 MultipartBoundaryBegin 4740683 MultipartBoundaryEnd 4740707 @@ -1932,6 +2416,8 @@ MimeEntityBegin 4740707 MimeEntityHeadersEnd 4740783 MimeContentBegin 4740783 MimeContentEnd 4741311 +Octets 528 +Lines 11 MimeEntityEnd 4741313 MultipartBoundaryBegin 4741313 MultipartBoundaryEnd 4741337 @@ -1939,6 +2425,8 @@ MimeEntityBegin 4741337 MimeEntityHeadersEnd 4741455 MimeContentBegin 4741455 MimeContentEnd 4764831 +Octets 23376 +Lines 317 MimeEntityEnd 4764833 MultipartBoundaryBegin 4764833 MultipartBoundaryEnd 4764857 @@ -1946,6 +2434,8 @@ MimeEntityBegin 4764857 MimeEntityHeadersEnd 4764933 MimeContentBegin 4764933 MimeContentEnd 4765525 +Octets 592 +Lines 15 MimeEntityEnd 4765527 MultipartBoundaryBegin 4765527 MultipartBoundaryEnd 4765551 @@ -1958,9 +2448,13 @@ MimeEntityBegin 4765640 MimeEntityHeadersEnd 4765713 MimeContentBegin 4765713 MimeContentEnd 4765713 +Octets 0 +Lines 0 MimeEntityEnd 4765713 MimeMessageEnd 4765713 MimeContentEnd 4765713 +Octets 73 +Lines 3 MimeEntityEnd 4765713 MultipartBoundaryBegin 4765713 MultipartBoundaryEnd 4765737 @@ -1968,6 +2462,8 @@ MimeEntityBegin 4765737 MimeEntityHeadersEnd 4765813 MimeContentBegin 4765813 MimeContentEnd 4766094 +Octets 281 +Lines 6 MimeEntityEnd 4766096 MultipartBoundaryBegin 4766096 MultipartBoundaryEnd 4766120 @@ -1980,9 +2476,13 @@ MimeEntityBegin 4766273 MimeEntityHeadersEnd 4766346 MimeContentBegin 4766346 MimeContentEnd 4766346 +Octets 0 +Lines 0 MimeEntityEnd 4766346 MimeMessageEnd 4766346 MimeContentEnd 4766346 +Octets 73 +Lines 3 MimeEntityEnd 4766346 MultipartBoundaryBegin 4766346 MultipartBoundaryEnd 4766370 @@ -1990,11 +2490,16 @@ MimeEntityBegin 4766370 MimeEntityHeadersEnd 4766446 MimeContentBegin 4766446 MimeContentEnd 4767549 +Octets 1103 +Lines 35 MimeEntityEnd 4767551 MultipartEndBoundaryBegin 4767551 MultipartEndBoundaryEnd 4767575 MultipartEpilogueBegin 4767575 MultipartEpilogueEnd 4767575 +MimeContentEnd 4767577 +Octets 35655 +Lines 639 MimeEntityEnd 4767577 MimeMessageEnd 4767577 MboxMarkerBegin 4767577 @@ -2012,6 +2517,8 @@ MimeEntityBegin 4767766 MimeEntityHeadersEnd 4767838 MimeContentBegin 4767838 MimeContentEnd 4845327 +Octets 77489 +Lines 1146 MimeEntityEnd 4845329 MultipartBoundaryBegin 4845329 MultipartBoundaryEnd 4845342 @@ -2019,11 +2526,16 @@ MimeEntityBegin 4845342 MimeEntityHeadersEnd 4845344 MimeContentBegin 4845344 MimeContentEnd 4845374 +Octets 30 +Lines 1 MimeEntityEnd 4845376 MultipartEndBoundaryBegin 4845376 MultipartEndBoundaryEnd 4845389 MultipartEpilogueBegin 4845389 MultipartEpilogueEnd 4845389 +MimeContentEnd 4845391 +Octets 77638 +Lines 1154 MimeEntityEnd 4845391 MimeMessageEnd 4845391 MboxMarkerBegin 4845391 @@ -2041,6 +2553,8 @@ MimeEntityBegin 4846677 MimeEntityHeadersEnd 4846723 MimeContentBegin 4846723 MimeContentEnd 4847183 +Octets 460 +Lines 9 MimeEntityEnd 4847185 MultipartBoundaryBegin 4847185 MultipartBoundaryEnd 4847224 @@ -2048,11 +2562,16 @@ MimeEntityBegin 4847224 MimeEntityHeadersEnd 4847321 MimeContentBegin 4847321 MimeContentEnd 4977159 +Octets 129838 +Lines 2096 MimeEntityEnd 4977161 MultipartEndBoundaryBegin 4977161 MultipartEndBoundaryEnd 4977200 MultipartEpilogueBegin 4977200 MultipartEpilogueEnd 4977202 +MimeContentEnd 4977204 +Octets 130566 +Lines 2115 MimeEntityEnd 4977204 MimeMessageEnd 4977204 MboxMarkerBegin 4977204 @@ -2070,6 +2589,8 @@ MimeEntityBegin 4978386 MimeEntityHeadersEnd 4978388 MimeContentBegin 4978388 MimeContentEnd 4979201 +Octets 813 +Lines 19 MimeEntityEnd 4979203 MultipartBoundaryBegin 4979203 MultipartBoundaryEnd 4979262 @@ -2084,6 +2605,8 @@ MimeEntityBegin 4979429 MimeEntityHeadersEnd 4979505 MimeContentBegin 4979505 MimeContentEnd 4980001 +Octets 496 +Lines 8 MimeEntityEnd 4980003 MultipartBoundaryBegin 4980003 MultipartBoundaryEnd 4980064 @@ -2091,6 +2614,8 @@ MimeEntityBegin 4980064 MimeEntityHeadersEnd 4980164 MimeContentBegin 4980164 MimeContentEnd 4993344 +Octets 13180 +Lines 191 MimeEntityEnd 4993346 MultipartBoundaryBegin 4993346 MultipartBoundaryEnd 4993407 @@ -2098,6 +2623,8 @@ MimeEntityBegin 4993407 MimeEntityHeadersEnd 4993480 MimeContentBegin 4993480 MimeContentEnd 4993501 +Octets 21 +Lines 2 MimeEntityEnd 4993503 MultipartBoundaryBegin 4993503 MultipartBoundaryEnd 4993564 @@ -2105,6 +2632,8 @@ MimeEntityBegin 4993564 MimeEntityHeadersEnd 4993664 MimeContentBegin 4993664 MimeContentEnd 5050148 +Octets 56484 +Lines 765 MimeEntityEnd 5050150 MultipartBoundaryBegin 5050150 MultipartBoundaryEnd 5050211 @@ -2112,6 +2641,8 @@ MimeEntityBegin 5050211 MimeEntityHeadersEnd 5050284 MimeContentBegin 5050284 MimeContentEnd 5050341 +Octets 57 +Lines 6 MimeEntityEnd 5050343 MultipartBoundaryBegin 5050343 MultipartBoundaryEnd 5050404 @@ -2119,6 +2650,8 @@ MimeEntityBegin 5050404 MimeEntityHeadersEnd 5050468 MimeContentBegin 5050468 MimeContentEnd 5154020 +Octets 103552 +Lines 1401 MimeEntityEnd 5154022 MultipartBoundaryBegin 5154022 MultipartBoundaryEnd 5154083 @@ -2126,16 +2659,24 @@ MimeEntityBegin 5154083 MimeEntityHeadersEnd 5154156 MimeContentBegin 5154156 MimeContentEnd 5154160 +Octets 4 +Lines 3 MimeEntityEnd 5154162 MultipartEndBoundaryBegin 5154162 MultipartEndBoundaryEnd 5154223 MultipartEpilogueBegin 5154223 MultipartEpilogueEnd 5154225 +MimeContentEnd 5154227 +Octets 174859 +Lines 2408 MimeEntityEnd 5154227 MultipartEndBoundaryBegin 5154227 MultipartEndBoundaryEnd 5154286 MultipartEpilogueBegin 5154286 MultipartEpilogueEnd 5154286 +MimeContentEnd 5154288 +Octets 176306 +Lines 2440 MimeEntityEnd 5154288 MimeMessageEnd 5154288 MboxMarkerBegin 5154288 @@ -2153,6 +2694,8 @@ MimeEntityBegin 5155198 MimeEntityHeadersEnd 5155244 MimeContentBegin 5155244 MimeContentEnd 5156788 +Octets 1544 +Lines 30 MimeEntityEnd 5156790 MultipartBoundaryBegin 5156790 MultipartBoundaryEnd 5156831 @@ -2167,6 +2710,8 @@ MimeEntityBegin 5156962 MimeEntityHeadersEnd 5157056 MimeContentBegin 5157056 MimeContentEnd 5157976 +Octets 920 +Lines 14 MimeEntityEnd 5157978 MultipartBoundaryBegin 5157978 MultipartBoundaryEnd 5158021 @@ -2174,6 +2719,8 @@ MimeEntityBegin 5158021 MimeEntityHeadersEnd 5158116 MimeContentBegin 5158116 MimeContentEnd 5193480 +Octets 35364 +Lines 507 MimeEntityEnd 5193482 MultipartBoundaryBegin 5193482 MultipartBoundaryEnd 5193525 @@ -2181,6 +2728,8 @@ MimeEntityBegin 5193525 MimeEntityHeadersEnd 5193619 MimeContentBegin 5193619 MimeContentEnd 5193631 +Octets 12 +Lines 3 MimeEntityEnd 5193633 MultipartBoundaryBegin 5193633 MultipartBoundaryEnd 5193676 @@ -2188,6 +2737,8 @@ MimeEntityBegin 5193676 MimeEntityHeadersEnd 5193771 MimeContentBegin 5193771 MimeContentEnd 5215415 +Octets 21644 +Lines 311 MimeEntityEnd 5215417 MultipartBoundaryBegin 5215417 MultipartBoundaryEnd 5215460 @@ -2195,6 +2746,8 @@ MimeEntityBegin 5215460 MimeEntityHeadersEnd 5215554 MimeContentBegin 5215554 MimeContentEnd 5215566 +Octets 12 +Lines 3 MimeEntityEnd 5215568 MultipartBoundaryBegin 5215568 MultipartBoundaryEnd 5215611 @@ -2202,6 +2755,8 @@ MimeEntityBegin 5215611 MimeEntityHeadersEnd 5215706 MimeContentBegin 5215706 MimeContentEnd 5248620 +Octets 32914 +Lines 472 MimeEntityEnd 5248622 MultipartBoundaryBegin 5248622 MultipartBoundaryEnd 5248665 @@ -2209,6 +2764,8 @@ MimeEntityBegin 5248665 MimeEntityHeadersEnd 5248759 MimeContentBegin 5248759 MimeContentEnd 5248771 +Octets 12 +Lines 3 MimeEntityEnd 5248773 MultipartBoundaryBegin 5248773 MultipartBoundaryEnd 5248816 @@ -2216,6 +2773,8 @@ MimeEntityBegin 5248816 MimeEntityHeadersEnd 5248911 MimeContentBegin 5248911 MimeContentEnd 5282837 +Octets 33926 +Lines 486 MimeEntityEnd 5282839 MultipartBoundaryBegin 5282839 MultipartBoundaryEnd 5282882 @@ -2223,6 +2782,8 @@ MimeEntityBegin 5282882 MimeEntityHeadersEnd 5282976 MimeContentBegin 5282976 MimeContentEnd 5282988 +Octets 12 +Lines 3 MimeEntityEnd 5282990 MultipartBoundaryBegin 5282990 MultipartBoundaryEnd 5283033 @@ -2230,6 +2791,8 @@ MimeEntityBegin 5283033 MimeEntityHeadersEnd 5283128 MimeContentBegin 5283128 MimeContentEnd 5311368 +Octets 28240 +Lines 405 MimeEntityEnd 5311370 MultipartBoundaryBegin 5311370 MultipartBoundaryEnd 5311413 @@ -2237,6 +2800,8 @@ MimeEntityBegin 5311413 MimeEntityHeadersEnd 5311507 MimeContentBegin 5311507 MimeContentEnd 5311519 +Octets 12 +Lines 3 MimeEntityEnd 5311521 MultipartBoundaryBegin 5311521 MultipartBoundaryEnd 5311564 @@ -2244,6 +2809,8 @@ MimeEntityBegin 5311564 MimeEntityHeadersEnd 5311659 MimeContentBegin 5311659 MimeContentEnd 5345639 +Octets 33980 +Lines 487 MimeEntityEnd 5345641 MultipartBoundaryBegin 5345641 MultipartBoundaryEnd 5345684 @@ -2251,6 +2818,8 @@ MimeEntityBegin 5345684 MimeEntityHeadersEnd 5345778 MimeContentBegin 5345778 MimeContentEnd 5345790 +Octets 12 +Lines 3 MimeEntityEnd 5345792 MultipartBoundaryBegin 5345792 MultipartBoundaryEnd 5345835 @@ -2258,6 +2827,8 @@ MimeEntityBegin 5345835 MimeEntityHeadersEnd 5345930 MimeContentBegin 5345930 MimeContentEnd 5372976 +Octets 27046 +Lines 388 MimeEntityEnd 5372978 MultipartBoundaryBegin 5372978 MultipartBoundaryEnd 5373021 @@ -2265,16 +2836,24 @@ MimeEntityBegin 5373021 MimeEntityHeadersEnd 5373115 MimeContentBegin 5373115 MimeContentEnd 5373192 +Octets 77 +Lines 4 MimeEntityEnd 5373194 MultipartEndBoundaryBegin 5373194 MultipartEndBoundaryEnd 5373237 MultipartEpilogueBegin 5373237 MultipartEpilogueEnd 5373239 +MimeContentEnd 5373241 +Octets 216322 +Lines 3161 MimeEntityEnd 5373241 MultipartEndBoundaryBegin 5373241 MultipartEndBoundaryEnd 5373282 MultipartEpilogueBegin 5373282 MultipartEpilogueEnd 5373282 +MimeContentEnd 5373284 +Octets 218285 +Lines 3202 MimeEntityEnd 5373284 MimeMessageEnd 5373284 MboxMarkerBegin 5373284 @@ -2292,6 +2871,8 @@ MimeEntityBegin 5373947 MimeEntityHeadersEnd 5374045 MimeContentBegin 5374045 MimeContentEnd 5374257 +Octets 212 +Lines 10 MimeEntityEnd 5374259 MultipartBoundaryBegin 5374259 MultipartBoundaryEnd 5374309 @@ -2299,6 +2880,8 @@ MimeEntityBegin 5374309 MimeEntityHeadersEnd 5374373 MimeContentBegin 5374373 MimeContentEnd 5464185 +Octets 89812 +Lines 1215 MimeEntityEnd 5464187 MultipartBoundaryBegin 5464187 MultipartBoundaryEnd 5464237 @@ -2306,11 +2889,16 @@ MimeEntityBegin 5464237 MimeEntityHeadersEnd 5464265 MimeContentBegin 5464265 MimeContentEnd 5464296 +Octets 31 +Lines 2 MimeEntityEnd 5464298 MultipartEndBoundaryBegin 5464298 MultipartEndBoundaryEnd 5464348 MultipartEpilogueBegin 5464348 MultipartEpilogueEnd 5464350 +MimeContentEnd 5464352 +Octets 90654 +Lines 1244 MimeEntityEnd 5464352 MimeMessageEnd 5464352 MboxMarkerBegin 5464352 @@ -2321,6 +2909,8 @@ MimeEntityBegin 5464361 MimeEntityHeadersEnd 5465317 MimeContentBegin 5465317 MimeContentEnd 5516722 +Octets 51405 +Lines 697 MimeEntityEnd 5516724 MimeMessageEnd 5516724 MboxMarkerBegin 5516724 @@ -2338,6 +2928,8 @@ MimeEntityBegin 5517381 MimeEntityHeadersEnd 5517383 MimeContentBegin 5517383 MimeContentEnd 5521801 +Octets 4418 +Lines 102 MimeEntityEnd 5521803 MultipartBoundaryBegin 5521803 MultipartBoundaryEnd 5521822 @@ -2357,9 +2949,13 @@ MimeEntityBegin 5522000 MimeEntityHeadersEnd 5522109 MimeContentBegin 5522109 MimeContentEnd 5522748 +Octets 639 +Lines 19 MimeEntityEnd 5522750 MimeMessageEnd 5522750 MimeContentEnd 5522750 +Octets 750 +Lines 23 MimeEntityEnd 5522750 MultipartBoundaryBegin 5522750 MultipartBoundaryEnd 5522782 @@ -2372,9 +2968,13 @@ MimeEntityBegin 5522784 MimeEntityHeadersEnd 5522909 MimeContentBegin 5522909 MimeContentEnd 5523662 +Octets 753 +Lines 21 MimeEntityEnd 5523664 MimeMessageEnd 5523664 MimeContentEnd 5523664 +Octets 880 +Lines 25 MimeEntityEnd 5523664 MultipartBoundaryBegin 5523664 MultipartBoundaryEnd 5523696 @@ -2387,9 +2987,13 @@ MimeEntityBegin 5523698 MimeEntityHeadersEnd 5523821 MimeContentBegin 5523821 MimeContentEnd 5524481 +Octets 660 +Lines 15 MimeEntityEnd 5524483 MimeMessageEnd 5524483 MimeContentEnd 5524483 +Octets 785 +Lines 19 MimeEntityEnd 5524483 MultipartBoundaryBegin 5524483 MultipartBoundaryEnd 5524515 @@ -2402,9 +3006,13 @@ MimeEntityBegin 5524517 MimeEntityHeadersEnd 5524677 MimeContentBegin 5524677 MimeContentEnd 5525170 +Octets 493 +Lines 11 MimeEntityEnd 5525172 MimeMessageEnd 5525172 MimeContentEnd 5525172 +Octets 655 +Lines 15 MimeEntityEnd 5525172 MultipartBoundaryBegin 5525172 MultipartBoundaryEnd 5525204 @@ -2417,9 +3025,13 @@ MimeEntityBegin 5525206 MimeEntityHeadersEnd 5525364 MimeContentBegin 5525364 MimeContentEnd 5525951 +Octets 587 +Lines 16 MimeEntityEnd 5525953 MimeMessageEnd 5525953 MimeContentEnd 5525953 +Octets 747 +Lines 20 MimeEntityEnd 5525953 MultipartBoundaryBegin 5525953 MultipartBoundaryEnd 5525985 @@ -2432,9 +3044,13 @@ MimeEntityBegin 5525987 MimeEntityHeadersEnd 5526148 MimeContentBegin 5526148 MimeContentEnd 5527449 +Octets 1301 +Lines 27 MimeEntityEnd 5527451 MimeMessageEnd 5527451 MimeContentEnd 5527451 +Octets 1464 +Lines 31 MimeEntityEnd 5527451 MultipartBoundaryBegin 5527451 MultipartBoundaryEnd 5527483 @@ -2447,9 +3063,13 @@ MimeEntityBegin 5527485 MimeEntityHeadersEnd 5527642 MimeContentBegin 5527642 MimeContentEnd 5528052 +Octets 410 +Lines 10 MimeEntityEnd 5528054 MimeMessageEnd 5528054 MimeContentEnd 5528054 +Octets 569 +Lines 14 MimeEntityEnd 5528054 MultipartBoundaryBegin 5528054 MultipartBoundaryEnd 5528086 @@ -2462,9 +3082,13 @@ MimeEntityBegin 5528088 MimeEntityHeadersEnd 5528239 MimeContentBegin 5528239 MimeContentEnd 5528642 +Octets 403 +Lines 8 MimeEntityEnd 5528644 MimeMessageEnd 5528644 MimeContentEnd 5528644 +Octets 556 +Lines 12 MimeEntityEnd 5528644 MultipartBoundaryBegin 5528644 MultipartBoundaryEnd 5528676 @@ -2477,9 +3101,13 @@ MimeEntityBegin 5528678 MimeEntityHeadersEnd 5528825 MimeContentBegin 5528825 MimeContentEnd 5529476 +Octets 651 +Lines 12 MimeEntityEnd 5529478 MimeMessageEnd 5529478 MimeContentEnd 5529478 +Octets 800 +Lines 16 MimeEntityEnd 5529478 MultipartBoundaryBegin 5529478 MultipartBoundaryEnd 5529510 @@ -2492,9 +3120,13 @@ MimeEntityBegin 5529512 MimeEntityHeadersEnd 5529653 MimeContentBegin 5529653 MimeContentEnd 5530649 +Octets 996 +Lines 20 MimeEntityEnd 5530651 MimeMessageEnd 5530651 MimeContentEnd 5530651 +Octets 1139 +Lines 24 MimeEntityEnd 5530651 MultipartBoundaryBegin 5530651 MultipartBoundaryEnd 5530683 @@ -2507,9 +3139,13 @@ MimeEntityBegin 5530685 MimeEntityHeadersEnd 5530836 MimeContentBegin 5530836 MimeContentEnd 5531753 +Octets 917 +Lines 28 MimeEntityEnd 5531755 MimeMessageEnd 5531755 MimeContentEnd 5531755 +Octets 1070 +Lines 32 MimeEntityEnd 5531755 MultipartBoundaryBegin 5531755 MultipartBoundaryEnd 5531787 @@ -2522,9 +3158,13 @@ MimeEntityBegin 5531789 MimeEntityHeadersEnd 5531924 MimeContentBegin 5531924 MimeContentEnd 5532494 +Octets 570 +Lines 12 MimeEntityEnd 5532496 MimeMessageEnd 5532496 MimeContentEnd 5532496 +Octets 707 +Lines 16 MimeEntityEnd 5532496 MultipartBoundaryBegin 5532496 MultipartBoundaryEnd 5532528 @@ -2537,9 +3177,13 @@ MimeEntityBegin 5532530 MimeEntityHeadersEnd 5532666 MimeContentBegin 5532666 MimeContentEnd 5533113 +Octets 447 +Lines 11 MimeEntityEnd 5533115 MimeMessageEnd 5533115 MimeContentEnd 5533115 +Octets 585 +Lines 15 MimeEntityEnd 5533115 MultipartBoundaryBegin 5533115 MultipartBoundaryEnd 5533147 @@ -2552,9 +3196,13 @@ MimeEntityBegin 5533149 MimeEntityHeadersEnd 5533270 MimeContentBegin 5533270 MimeContentEnd 5533837 +Octets 567 +Lines 16 MimeEntityEnd 5533839 MimeMessageEnd 5533839 MimeContentEnd 5533839 +Octets 690 +Lines 20 MimeEntityEnd 5533839 MultipartBoundaryBegin 5533839 MultipartBoundaryEnd 5533871 @@ -2567,9 +3215,13 @@ MimeEntityBegin 5533873 MimeEntityHeadersEnd 5533992 MimeContentBegin 5533992 MimeContentEnd 5534185 +Octets 193 +Lines 9 MimeEntityEnd 5534187 MimeMessageEnd 5534187 MimeContentEnd 5534187 +Octets 314 +Lines 13 MimeEntityEnd 5534187 MultipartBoundaryBegin 5534187 MultipartBoundaryEnd 5534219 @@ -2582,9 +3234,13 @@ MimeEntityBegin 5534221 MimeEntityHeadersEnd 5534342 MimeContentBegin 5534342 MimeContentEnd 5534677 +Octets 335 +Lines 8 MimeEntityEnd 5534679 MimeMessageEnd 5534679 MimeContentEnd 5534679 +Octets 458 +Lines 12 MimeEntityEnd 5534679 MultipartBoundaryBegin 5534679 MultipartBoundaryEnd 5534711 @@ -2597,9 +3253,13 @@ MimeEntityBegin 5534713 MimeEntityHeadersEnd 5534840 MimeContentBegin 5534840 MimeContentEnd 5535528 +Octets 688 +Lines 22 MimeEntityEnd 5535530 MimeMessageEnd 5535530 MimeContentEnd 5535530 +Octets 817 +Lines 26 MimeEntityEnd 5535530 MultipartBoundaryBegin 5535530 MultipartBoundaryEnd 5535562 @@ -2612,9 +3272,13 @@ MimeEntityBegin 5535564 MimeEntityHeadersEnd 5535692 MimeContentBegin 5535692 MimeContentEnd 5535799 +Octets 107 +Lines 6 MimeEntityEnd 5535801 MimeMessageEnd 5535801 MimeContentEnd 5535801 +Octets 237 +Lines 10 MimeEntityEnd 5535801 MultipartBoundaryBegin 5535801 MultipartBoundaryEnd 5535833 @@ -2627,9 +3291,13 @@ MimeEntityBegin 5535835 MimeEntityHeadersEnd 5535981 MimeContentBegin 5535981 MimeContentEnd 5536838 +Octets 857 +Lines 22 MimeEntityEnd 5536840 MimeMessageEnd 5536840 MimeContentEnd 5536840 +Octets 1005 +Lines 26 MimeEntityEnd 5536840 MultipartBoundaryBegin 5536840 MultipartBoundaryEnd 5536872 @@ -2642,9 +3310,13 @@ MimeEntityBegin 5536874 MimeEntityHeadersEnd 5536988 MimeContentBegin 5536988 MimeContentEnd 5537416 +Octets 428 +Lines 10 MimeEntityEnd 5537418 MimeMessageEnd 5537418 MimeContentEnd 5537418 +Octets 544 +Lines 14 MimeEntityEnd 5537418 MultipartBoundaryBegin 5537418 MultipartBoundaryEnd 5537450 @@ -2657,9 +3329,13 @@ MimeEntityBegin 5537452 MimeEntityHeadersEnd 5537628 MimeContentBegin 5537628 MimeContentEnd 5537867 +Octets 239 +Lines 10 MimeEntityEnd 5537869 MimeMessageEnd 5537869 MimeContentEnd 5537869 +Octets 417 +Lines 14 MimeEntityEnd 5537869 MultipartBoundaryBegin 5537869 MultipartBoundaryEnd 5537901 @@ -2672,9 +3348,13 @@ MimeEntityBegin 5537903 MimeEntityHeadersEnd 5538033 MimeContentBegin 5538033 MimeContentEnd 5538444 +Octets 411 +Lines 13 MimeEntityEnd 5538446 MimeMessageEnd 5538446 MimeContentEnd 5538446 +Octets 543 +Lines 17 MimeEntityEnd 5538446 MultipartBoundaryBegin 5538446 MultipartBoundaryEnd 5538478 @@ -2687,9 +3367,13 @@ MimeEntityBegin 5538480 MimeEntityHeadersEnd 5538601 MimeContentBegin 5538601 MimeContentEnd 5539533 +Octets 932 +Lines 29 MimeEntityEnd 5539535 MimeMessageEnd 5539535 MimeContentEnd 5539535 +Octets 1055 +Lines 33 MimeEntityEnd 5539535 MultipartBoundaryBegin 5539535 MultipartBoundaryEnd 5539567 @@ -2702,9 +3386,13 @@ MimeEntityBegin 5539569 MimeEntityHeadersEnd 5539701 MimeContentBegin 5539701 MimeContentEnd 5540001 +Octets 300 +Lines 10 MimeEntityEnd 5540003 MimeMessageEnd 5540003 MimeContentEnd 5540003 +Octets 434 +Lines 14 MimeEntityEnd 5540003 MultipartBoundaryBegin 5540003 MultipartBoundaryEnd 5540035 @@ -2717,9 +3405,13 @@ MimeEntityBegin 5540037 MimeEntityHeadersEnd 5540170 MimeContentBegin 5540170 MimeContentEnd 5540594 +Octets 424 +Lines 15 MimeEntityEnd 5540596 MimeMessageEnd 5540596 MimeContentEnd 5540596 +Octets 559 +Lines 19 MimeEntityEnd 5540596 MultipartBoundaryBegin 5540596 MultipartBoundaryEnd 5540628 @@ -2732,9 +3424,13 @@ MimeEntityBegin 5540630 MimeEntityHeadersEnd 5540749 MimeContentBegin 5540749 MimeContentEnd 5540898 +Octets 149 +Lines 5 MimeEntityEnd 5540900 MimeMessageEnd 5540900 MimeContentEnd 5540900 +Octets 270 +Lines 9 MimeEntityEnd 5540900 MultipartBoundaryBegin 5540900 MultipartBoundaryEnd 5540932 @@ -2747,9 +3443,13 @@ MimeEntityBegin 5540934 MimeEntityHeadersEnd 5541063 MimeContentBegin 5541063 MimeContentEnd 5541249 +Octets 186 +Lines 8 MimeEntityEnd 5541251 MimeMessageEnd 5541251 MimeContentEnd 5541251 +Octets 317 +Lines 12 MimeEntityEnd 5541251 MultipartBoundaryBegin 5541251 MultipartBoundaryEnd 5541283 @@ -2762,9 +3462,13 @@ MimeEntityBegin 5541285 MimeEntityHeadersEnd 5541419 MimeContentBegin 5541419 MimeContentEnd 5542149 +Octets 730 +Lines 15 MimeEntityEnd 5542151 MimeMessageEnd 5542151 MimeContentEnd 5542151 +Octets 866 +Lines 19 MimeEntityEnd 5542151 MultipartBoundaryBegin 5542151 MultipartBoundaryEnd 5542183 @@ -2777,9 +3481,13 @@ MimeEntityBegin 5542185 MimeEntityHeadersEnd 5542335 MimeContentBegin 5542335 MimeContentEnd 5543318 +Octets 983 +Lines 27 MimeEntityEnd 5543320 MimeMessageEnd 5543320 MimeContentEnd 5543320 +Octets 1135 +Lines 31 MimeEntityEnd 5543320 MultipartBoundaryBegin 5543320 MultipartBoundaryEnd 5543352 @@ -2792,9 +3500,13 @@ MimeEntityBegin 5543354 MimeEntityHeadersEnd 5543492 MimeContentBegin 5543492 MimeContentEnd 5543746 +Octets 254 +Lines 8 MimeEntityEnd 5543748 MimeMessageEnd 5543748 MimeContentEnd 5543748 +Octets 394 +Lines 12 MimeEntityEnd 5543748 MultipartBoundaryBegin 5543748 MultipartBoundaryEnd 5543780 @@ -2807,9 +3519,13 @@ MimeEntityBegin 5543782 MimeEntityHeadersEnd 5543908 MimeContentBegin 5543908 MimeContentEnd 5544041 +Octets 133 +Lines 7 MimeEntityEnd 5544043 MimeMessageEnd 5544043 MimeContentEnd 5544043 +Octets 261 +Lines 11 MimeEntityEnd 5544043 MultipartBoundaryBegin 5544043 MultipartBoundaryEnd 5544075 @@ -2822,9 +3538,13 @@ MimeEntityBegin 5544077 MimeEntityHeadersEnd 5544257 MimeContentBegin 5544257 MimeContentEnd 5545018 +Octets 761 +Lines 17 MimeEntityEnd 5545020 MimeMessageEnd 5545020 MimeContentEnd 5545020 +Octets 943 +Lines 22 MimeEntityEnd 5545020 MultipartBoundaryBegin 5545020 MultipartBoundaryEnd 5545052 @@ -2837,9 +3557,13 @@ MimeEntityBegin 5545054 MimeEntityHeadersEnd 5545218 MimeContentBegin 5545218 MimeContentEnd 5545633 +Octets 415 +Lines 17 MimeEntityEnd 5545635 MimeMessageEnd 5545635 MimeContentEnd 5545635 +Octets 581 +Lines 21 MimeEntityEnd 5545635 MultipartBoundaryBegin 5545635 MultipartBoundaryEnd 5545667 @@ -2852,9 +3576,13 @@ MimeEntityBegin 5545669 MimeEntityHeadersEnd 5545805 MimeContentBegin 5545805 MimeContentEnd 5547113 +Octets 1308 +Lines 22 MimeEntityEnd 5547115 MimeMessageEnd 5547115 MimeContentEnd 5547115 +Octets 1446 +Lines 26 MimeEntityEnd 5547115 MultipartBoundaryBegin 5547115 MultipartBoundaryEnd 5547147 @@ -2867,9 +3595,13 @@ MimeEntityBegin 5547149 MimeEntityHeadersEnd 5547259 MimeContentBegin 5547259 MimeContentEnd 5547408 +Octets 149 +Lines 7 MimeEntityEnd 5547410 MimeMessageEnd 5547410 MimeContentEnd 5547410 +Octets 261 +Lines 11 MimeEntityEnd 5547410 MultipartBoundaryBegin 5547410 MultipartBoundaryEnd 5547442 @@ -2882,9 +3614,13 @@ MimeEntityBegin 5547444 MimeEntityHeadersEnd 5547585 MimeContentBegin 5547585 MimeContentEnd 5547895 +Octets 310 +Lines 12 MimeEntityEnd 5547897 MimeMessageEnd 5547897 MimeContentEnd 5547897 +Octets 453 +Lines 16 MimeEntityEnd 5547897 MultipartBoundaryBegin 5547897 MultipartBoundaryEnd 5547929 @@ -2897,9 +3633,13 @@ MimeEntityBegin 5547931 MimeEntityHeadersEnd 5548061 MimeContentBegin 5548061 MimeContentEnd 5548254 +Octets 193 +Lines 7 MimeEntityEnd 5548256 MimeMessageEnd 5548256 MimeContentEnd 5548256 +Octets 325 +Lines 11 MimeEntityEnd 5548256 MultipartBoundaryBegin 5548256 MultipartBoundaryEnd 5548288 @@ -2912,9 +3652,13 @@ MimeEntityBegin 5548290 MimeEntityHeadersEnd 5548399 MimeContentBegin 5548399 MimeContentEnd 5548809 +Octets 410 +Lines 13 MimeEntityEnd 5548811 MimeMessageEnd 5548811 MimeContentEnd 5548811 +Octets 521 +Lines 17 MimeEntityEnd 5548811 MultipartBoundaryBegin 5548811 MultipartBoundaryEnd 5548843 @@ -2927,9 +3671,13 @@ MimeEntityBegin 5548845 MimeEntityHeadersEnd 5548983 MimeContentBegin 5548983 MimeContentEnd 5549293 +Octets 310 +Lines 9 MimeEntityEnd 5549295 MimeMessageEnd 5549295 MimeContentEnd 5549295 +Octets 450 +Lines 13 MimeEntityEnd 5549295 MultipartBoundaryBegin 5549295 MultipartBoundaryEnd 5549327 @@ -2942,9 +3690,13 @@ MimeEntityBegin 5549329 MimeEntityHeadersEnd 5549476 MimeContentBegin 5549476 MimeContentEnd 5550111 +Octets 635 +Lines 18 MimeEntityEnd 5550113 MimeMessageEnd 5550113 MimeContentEnd 5550113 +Octets 784 +Lines 22 MimeEntityEnd 5550113 MultipartBoundaryBegin 5550113 MultipartBoundaryEnd 5550145 @@ -2957,9 +3709,13 @@ MimeEntityBegin 5550147 MimeEntityHeadersEnd 5550304 MimeContentBegin 5550304 MimeContentEnd 5550789 +Octets 485 +Lines 11 MimeEntityEnd 5550791 MimeMessageEnd 5550791 MimeContentEnd 5550791 +Octets 644 +Lines 15 MimeEntityEnd 5550791 MultipartBoundaryBegin 5550791 MultipartBoundaryEnd 5550823 @@ -2972,9 +3728,13 @@ MimeEntityBegin 5550825 MimeEntityHeadersEnd 5550962 MimeContentBegin 5550962 MimeContentEnd 5552161 +Octets 1199 +Lines 28 MimeEntityEnd 5552163 MimeMessageEnd 5552163 MimeContentEnd 5552163 +Octets 1338 +Lines 32 MimeEntityEnd 5552163 MultipartBoundaryBegin 5552163 MultipartBoundaryEnd 5552195 @@ -2987,9 +3747,13 @@ MimeEntityBegin 5552197 MimeEntityHeadersEnd 5552377 MimeContentBegin 5552377 MimeContentEnd 5552644 +Octets 267 +Lines 9 MimeEntityEnd 5552646 MimeMessageEnd 5552646 MimeContentEnd 5552646 +Octets 449 +Lines 13 MimeEntityEnd 5552646 MultipartBoundaryBegin 5552646 MultipartBoundaryEnd 5552678 @@ -3002,9 +3766,13 @@ MimeEntityBegin 5552680 MimeEntityHeadersEnd 5552799 MimeContentBegin 5552799 MimeContentEnd 5552996 +Octets 197 +Lines 5 MimeEntityEnd 5552998 MimeMessageEnd 5552998 MimeContentEnd 5552998 +Octets 318 +Lines 9 MimeEntityEnd 5552998 MultipartBoundaryBegin 5552998 MultipartBoundaryEnd 5553030 @@ -3017,9 +3785,13 @@ MimeEntityBegin 5553032 MimeEntityHeadersEnd 5553176 MimeContentBegin 5553176 MimeContentEnd 5554065 +Octets 889 +Lines 25 MimeEntityEnd 5554067 MimeMessageEnd 5554067 MimeContentEnd 5554067 +Octets 1035 +Lines 29 MimeEntityEnd 5554067 MultipartBoundaryBegin 5554067 MultipartBoundaryEnd 5554099 @@ -3032,9 +3804,13 @@ MimeEntityBegin 5554101 MimeEntityHeadersEnd 5554230 MimeContentBegin 5554230 MimeContentEnd 5554955 +Octets 725 +Lines 12 MimeEntityEnd 5554957 MimeMessageEnd 5554957 MimeContentEnd 5554957 +Octets 856 +Lines 16 MimeEntityEnd 5554957 MultipartBoundaryBegin 5554957 MultipartBoundaryEnd 5554989 @@ -3047,9 +3823,13 @@ MimeEntityBegin 5554991 MimeEntityHeadersEnd 5555107 MimeContentBegin 5555107 MimeContentEnd 5555827 +Octets 720 +Lines 18 MimeEntityEnd 5555829 MimeMessageEnd 5555829 MimeContentEnd 5555829 +Octets 838 +Lines 22 MimeEntityEnd 5555829 MultipartBoundaryBegin 5555829 MultipartBoundaryEnd 5555861 @@ -3062,9 +3842,13 @@ MimeEntityBegin 5555863 MimeEntityHeadersEnd 5555999 MimeContentBegin 5555999 MimeContentEnd 5556390 +Octets 391 +Lines 12 MimeEntityEnd 5556392 MimeMessageEnd 5556392 MimeContentEnd 5556392 +Octets 529 +Lines 16 MimeEntityEnd 5556392 MultipartBoundaryBegin 5556392 MultipartBoundaryEnd 5556424 @@ -3077,9 +3861,13 @@ MimeEntityBegin 5556426 MimeEntityHeadersEnd 5556566 MimeContentBegin 5556566 MimeContentEnd 5557567 +Octets 1001 +Lines 25 MimeEntityEnd 5557569 MimeMessageEnd 5557569 MimeContentEnd 5557569 +Octets 1143 +Lines 29 MimeEntityEnd 5557569 MultipartBoundaryBegin 5557569 MultipartBoundaryEnd 5557601 @@ -3092,9 +3880,13 @@ MimeEntityBegin 5557603 MimeEntityHeadersEnd 5557752 MimeContentBegin 5557752 MimeContentEnd 5558229 +Octets 477 +Lines 11 MimeEntityEnd 5558231 MimeMessageEnd 5558231 MimeContentEnd 5558231 +Octets 628 +Lines 15 MimeEntityEnd 5558231 MultipartBoundaryBegin 5558231 MultipartBoundaryEnd 5558263 @@ -3107,9 +3899,13 @@ MimeEntityBegin 5558265 MimeEntityHeadersEnd 5558402 MimeContentBegin 5558402 MimeContentEnd 5558691 +Octets 289 +Lines 11 MimeEntityEnd 5558693 MimeMessageEnd 5558693 MimeContentEnd 5558693 +Octets 428 +Lines 15 MimeEntityEnd 5558693 MultipartBoundaryBegin 5558693 MultipartBoundaryEnd 5558725 @@ -3122,9 +3918,13 @@ MimeEntityBegin 5558727 MimeEntityHeadersEnd 5558856 MimeContentBegin 5558856 MimeContentEnd 5559142 +Octets 286 +Lines 5 MimeEntityEnd 5559144 MimeMessageEnd 5559144 MimeContentEnd 5559144 +Octets 417 +Lines 9 MimeEntityEnd 5559144 MultipartBoundaryBegin 5559144 MultipartBoundaryEnd 5559176 @@ -3137,9 +3937,13 @@ MimeEntityBegin 5559178 MimeEntityHeadersEnd 5559303 MimeContentBegin 5559303 MimeContentEnd 5559973 +Octets 670 +Lines 28 MimeEntityEnd 5559975 MimeMessageEnd 5559975 MimeContentEnd 5559975 +Octets 797 +Lines 32 MimeEntityEnd 5559975 MultipartBoundaryBegin 5559975 MultipartBoundaryEnd 5560007 @@ -3152,9 +3956,13 @@ MimeEntityBegin 5560009 MimeEntityHeadersEnd 5560157 MimeContentBegin 5560157 MimeContentEnd 5562461 +Octets 2304 +Lines 47 MimeEntityEnd 5562463 MimeMessageEnd 5562463 MimeContentEnd 5562463 +Octets 2454 +Lines 51 MimeEntityEnd 5562463 MultipartBoundaryBegin 5562463 MultipartBoundaryEnd 5562495 @@ -3167,9 +3975,13 @@ MimeEntityBegin 5562497 MimeEntityHeadersEnd 5562623 MimeContentBegin 5562623 MimeContentEnd 5563432 +Octets 809 +Lines 18 MimeEntityEnd 5563434 MimeMessageEnd 5563434 MimeContentEnd 5563434 +Octets 937 +Lines 22 MimeEntityEnd 5563434 MultipartBoundaryBegin 5563434 MultipartBoundaryEnd 5563466 @@ -3182,9 +3994,13 @@ MimeEntityBegin 5563468 MimeEntityHeadersEnd 5563566 MimeContentBegin 5563566 MimeContentEnd 5563802 +Octets 236 +Lines 11 MimeEntityEnd 5563804 MimeMessageEnd 5563804 MimeContentEnd 5563804 +Octets 336 +Lines 15 MimeEntityEnd 5563804 MultipartBoundaryBegin 5563804 MultipartBoundaryEnd 5563836 @@ -3197,9 +4013,13 @@ MimeEntityBegin 5563838 MimeEntityHeadersEnd 5563963 MimeContentBegin 5563963 MimeContentEnd 5564651 +Octets 688 +Lines 21 MimeEntityEnd 5564653 MimeMessageEnd 5564653 MimeContentEnd 5564653 +Octets 815 +Lines 25 MimeEntityEnd 5564653 MultipartBoundaryBegin 5564653 MultipartBoundaryEnd 5564685 @@ -3212,9 +4032,13 @@ MimeEntityBegin 5564687 MimeEntityHeadersEnd 5564801 MimeContentBegin 5564801 MimeContentEnd 5567416 +Octets 2615 +Lines 69 MimeEntityEnd 5567418 MimeMessageEnd 5567418 MimeContentEnd 5567418 +Octets 2731 +Lines 73 MimeEntityEnd 5567418 MultipartBoundaryBegin 5567418 MultipartBoundaryEnd 5567450 @@ -3227,9 +4051,13 @@ MimeEntityBegin 5567452 MimeEntityHeadersEnd 5567562 MimeContentBegin 5567562 MimeContentEnd 5568805 +Octets 1243 +Lines 35 MimeEntityEnd 5568807 MimeMessageEnd 5568807 MimeContentEnd 5568807 +Octets 1355 +Lines 39 MimeEntityEnd 5568807 MultipartBoundaryBegin 5568807 MultipartBoundaryEnd 5568839 @@ -3242,9 +4070,13 @@ MimeEntityBegin 5568841 MimeEntityHeadersEnd 5568951 MimeContentBegin 5568951 MimeContentEnd 5570791 +Octets 1840 +Lines 44 MimeEntityEnd 5570793 MimeMessageEnd 5570793 MimeContentEnd 5570793 +Octets 1952 +Lines 48 MimeEntityEnd 5570793 MultipartBoundaryBegin 5570793 MultipartBoundaryEnd 5570825 @@ -3257,9 +4089,13 @@ MimeEntityBegin 5570827 MimeEntityHeadersEnd 5570960 MimeContentBegin 5570960 MimeContentEnd 5571542 +Octets 582 +Lines 13 MimeEntityEnd 5571544 MimeMessageEnd 5571544 MimeContentEnd 5571544 +Octets 717 +Lines 17 MimeEntityEnd 5571544 MultipartBoundaryBegin 5571544 MultipartBoundaryEnd 5571576 @@ -3272,9 +4108,13 @@ MimeEntityBegin 5571578 MimeEntityHeadersEnd 5571670 MimeContentBegin 5571670 MimeContentEnd 5573024 +Octets 1354 +Lines 21 MimeEntityEnd 5573026 MimeMessageEnd 5573026 MimeContentEnd 5573026 +Octets 1448 +Lines 25 MimeEntityEnd 5573026 MultipartBoundaryBegin 5573026 MultipartBoundaryEnd 5573058 @@ -3287,9 +4127,13 @@ MimeEntityBegin 5573060 MimeEntityHeadersEnd 5573180 MimeContentBegin 5573180 MimeContentEnd 5575356 +Octets 2176 +Lines 50 MimeEntityEnd 5575358 MimeMessageEnd 5575358 MimeContentEnd 5575358 +Octets 2298 +Lines 54 MimeEntityEnd 5575358 MultipartBoundaryBegin 5575358 MultipartBoundaryEnd 5575390 @@ -3302,9 +4146,13 @@ MimeEntityBegin 5575392 MimeEntityHeadersEnd 5575517 MimeContentBegin 5575517 MimeContentEnd 5577580 +Octets 2063 +Lines 43 MimeEntityEnd 5577582 MimeMessageEnd 5577582 MimeContentEnd 5577582 +Octets 2190 +Lines 47 MimeEntityEnd 5577582 MultipartBoundaryBegin 5577582 MultipartBoundaryEnd 5577614 @@ -3317,9 +4165,13 @@ MimeEntityBegin 5577616 MimeEntityHeadersEnd 5577741 MimeContentBegin 5577741 MimeContentEnd 5578437 +Octets 696 +Lines 20 MimeEntityEnd 5578439 MimeMessageEnd 5578439 MimeContentEnd 5578439 +Octets 823 +Lines 24 MimeEntityEnd 5578439 MultipartBoundaryBegin 5578439 MultipartBoundaryEnd 5578471 @@ -3332,9 +4184,13 @@ MimeEntityBegin 5578473 MimeEntityHeadersEnd 5578614 MimeContentBegin 5578614 MimeContentEnd 5579450 +Octets 836 +Lines 17 MimeEntityEnd 5579452 MimeMessageEnd 5579452 MimeContentEnd 5579452 +Octets 979 +Lines 21 MimeEntityEnd 5579452 MultipartBoundaryBegin 5579452 MultipartBoundaryEnd 5579484 @@ -3347,9 +4203,13 @@ MimeEntityBegin 5579486 MimeEntityHeadersEnd 5579614 MimeContentBegin 5579614 MimeContentEnd 5580359 +Octets 745 +Lines 22 MimeEntityEnd 5580361 MimeMessageEnd 5580361 MimeContentEnd 5580361 +Octets 875 +Lines 26 MimeEntityEnd 5580361 MultipartBoundaryBegin 5580361 MultipartBoundaryEnd 5580393 @@ -3362,9 +4222,13 @@ MimeEntityBegin 5580395 MimeEntityHeadersEnd 5580501 MimeContentBegin 5580501 MimeContentEnd 5581257 +Octets 756 +Lines 17 MimeEntityEnd 5581259 MimeMessageEnd 5581259 MimeContentEnd 5581259 +Octets 864 +Lines 21 MimeEntityEnd 5581259 MultipartBoundaryBegin 5581259 MultipartBoundaryEnd 5581291 @@ -3377,9 +4241,13 @@ MimeEntityBegin 5581293 MimeEntityHeadersEnd 5581454 MimeContentBegin 5581454 MimeContentEnd 5581820 +Octets 366 +Lines 8 MimeEntityEnd 5581822 MimeMessageEnd 5581822 MimeContentEnd 5581822 +Octets 529 +Lines 13 MimeEntityEnd 5581822 MultipartBoundaryBegin 5581822 MultipartBoundaryEnd 5581854 @@ -3392,9 +4260,13 @@ MimeEntityBegin 5581856 MimeEntityHeadersEnd 5581947 MimeContentBegin 5581947 MimeContentEnd 5582597 +Octets 650 +Lines 16 MimeEntityEnd 5582599 MimeMessageEnd 5582599 MimeContentEnd 5582599 +Octets 743 +Lines 20 MimeEntityEnd 5582599 MultipartBoundaryBegin 5582599 MultipartBoundaryEnd 5582631 @@ -3407,9 +4279,13 @@ MimeEntityBegin 5582633 MimeEntityHeadersEnd 5582786 MimeContentBegin 5582786 MimeContentEnd 5583169 +Octets 383 +Lines 18 MimeEntityEnd 5583171 MimeMessageEnd 5583171 MimeContentEnd 5583171 +Octets 538 +Lines 22 MimeEntityEnd 5583171 MultipartBoundaryBegin 5583171 MultipartBoundaryEnd 5583203 @@ -3422,9 +4298,13 @@ MimeEntityBegin 5583205 MimeEntityHeadersEnd 5583310 MimeContentBegin 5583310 MimeContentEnd 5583604 +Octets 294 +Lines 7 MimeEntityEnd 5583606 MimeMessageEnd 5583606 MimeContentEnd 5583606 +Octets 401 +Lines 11 MimeEntityEnd 5583606 MultipartBoundaryBegin 5583606 MultipartBoundaryEnd 5583638 @@ -3437,9 +4317,13 @@ MimeEntityBegin 5583640 MimeEntityHeadersEnd 5583772 MimeContentBegin 5583772 MimeContentEnd 5584267 +Octets 495 +Lines 17 MimeEntityEnd 5584269 MimeMessageEnd 5584269 MimeContentEnd 5584269 +Octets 629 +Lines 21 MimeEntityEnd 5584269 MultipartBoundaryBegin 5584269 MultipartBoundaryEnd 5584301 @@ -3452,9 +4336,13 @@ MimeEntityBegin 5584303 MimeEntityHeadersEnd 5584404 MimeContentBegin 5584404 MimeContentEnd 5584803 +Octets 399 +Lines 20 MimeEntityEnd 5584805 MimeMessageEnd 5584805 MimeContentEnd 5584805 +Octets 502 +Lines 24 MimeEntityEnd 5584805 MultipartBoundaryBegin 5584805 MultipartBoundaryEnd 5584837 @@ -3467,9 +4355,13 @@ MimeEntityBegin 5584839 MimeEntityHeadersEnd 5584958 MimeContentBegin 5584958 MimeContentEnd 5586303 +Octets 1345 +Lines 27 MimeEntityEnd 5586305 MimeMessageEnd 5586305 MimeContentEnd 5586305 +Octets 1466 +Lines 31 MimeEntityEnd 5586305 MultipartBoundaryBegin 5586305 MultipartBoundaryEnd 5586337 @@ -3482,9 +4374,13 @@ MimeEntityBegin 5586339 MimeEntityHeadersEnd 5586443 MimeContentBegin 5586443 MimeContentEnd 5586747 +Octets 304 +Lines 10 MimeEntityEnd 5586749 MimeMessageEnd 5586749 MimeContentEnd 5586749 +Octets 410 +Lines 14 MimeEntityEnd 5586749 MultipartBoundaryBegin 5586749 MultipartBoundaryEnd 5586781 @@ -3497,19 +4393,29 @@ MimeEntityBegin 5586783 MimeEntityHeadersEnd 5586930 MimeContentBegin 5586930 MimeContentEnd 5587985 +Octets 1055 +Lines 37 MimeEntityEnd 5587987 MimeMessageEnd 5587987 MimeContentEnd 5587987 +Octets 1204 +Lines 41 MimeEntityEnd 5587987 MultipartEndBoundaryBegin 5587987 MultipartEndBoundaryEnd 5588019 MultipartEpilogueBegin 5588019 MultipartEpilogueEnd 5588021 +MimeContentEnd 5588023 +Octets 66057 +Lines 1846 MimeEntityEnd 5588023 MultipartEndBoundaryBegin 5588023 MultipartEndBoundaryEnd 5588042 MultipartEpilogueBegin 5588042 MultipartEpilogueEnd 5588100 +MimeContentEnd 5588102 +Octets 70740 +Lines 1958 MimeEntityEnd 5588102 MimeMessageEnd 5588102 MboxMarkerBegin 5588102 @@ -3520,6 +4426,8 @@ MimeEntityBegin 5588111 MimeEntityHeadersEnd 5588934 MimeContentBegin 5588934 MimeContentEnd 5590853 +Octets 1919 +Lines 49 MimeEntityEnd 5590855 MimeMessageEnd 5590855 MboxMarkerBegin 5590855 @@ -3537,6 +4445,8 @@ MimeEntityBegin 5591635 MimeEntityHeadersEnd 5591637 MimeContentBegin 5591637 MimeContentEnd 5591750 +Octets 113 +Lines 2 MimeEntityEnd 5591752 MultipartBoundaryBegin 5591752 MultipartBoundaryEnd 5591780 @@ -3544,6 +4454,8 @@ MimeEntityBegin 5591780 MimeEntityHeadersEnd 5591872 MimeContentBegin 5591872 MimeContentEnd 5724575 +Octets 132703 +Lines 2012 MimeEntityEnd 5724577 MultipartBoundaryBegin 5724577 MultipartBoundaryEnd 5724605 @@ -3551,6 +4463,8 @@ MimeEntityBegin 5724605 MimeEntityHeadersEnd 5724607 MimeContentBegin 5724607 MimeContentEnd 5724663 +Octets 56 +Lines 2 MimeEntityEnd 5724665 MultipartBoundaryBegin 5724665 MultipartBoundaryEnd 5724693 @@ -3558,6 +4472,8 @@ MimeEntityBegin 5724693 MimeEntityHeadersEnd 5724843 MimeContentBegin 5724843 MimeContentEnd 5739817 +Octets 14974 +Lines 78 MimeEntityEnd 5739819 MultipartBoundaryBegin 5739819 MultipartBoundaryEnd 5739847 @@ -3565,6 +4481,8 @@ MimeEntityBegin 5739847 MimeEntityHeadersEnd 5739849 MimeContentBegin 5739849 MimeContentEnd 5739944 +Octets 95 +Lines 6 MimeEntityEnd 5739946 MultipartBoundaryBegin 5739946 MultipartBoundaryEnd 5739974 @@ -3572,6 +4490,8 @@ MimeEntityBegin 5739974 MimeEntityHeadersEnd 5740124 MimeContentBegin 5740124 MimeContentEnd 5748266 +Octets 8142 +Lines 42 MimeEntityEnd 5748268 MultipartBoundaryBegin 5748268 MultipartBoundaryEnd 5748296 @@ -3579,11 +4499,16 @@ MimeEntityBegin 5748296 MimeEntityHeadersEnd 5748298 MimeContentBegin 5748298 MimeContentEnd 5748375 +Octets 77 +Lines 4 MimeEntityEnd 5748377 MultipartEndBoundaryBegin 5748377 MultipartEndBoundaryEnd 5748405 MultipartEpilogueBegin 5748405 MultipartEpilogueEnd 5748407 +MimeContentEnd 5748409 +Octets 156802 +Lines 2172 MimeEntityEnd 5748409 MimeMessageEnd 5748409 MboxMarkerBegin 5748409 @@ -3594,6 +4519,8 @@ MimeEntityBegin 5748418 MimeEntityHeadersEnd 5748956 MimeContentBegin 5748956 MimeContentEnd 5749545 +Octets 589 +Lines 22 MimeEntityEnd 5749547 MimeMessageEnd 5749547 MboxMarkerBegin 5749547 @@ -3611,6 +4538,8 @@ MimeEntityBegin 5750964 MimeEntityHeadersEnd 5751010 MimeContentBegin 5751010 MimeContentEnd 5751766 +Octets 756 +Lines 27 MimeEntityEnd 5751768 MultipartBoundaryBegin 5751768 MultipartBoundaryEnd 5751809 @@ -3625,6 +4554,8 @@ MimeEntityBegin 5751940 MimeEntityHeadersEnd 5752034 MimeContentBegin 5752034 MimeContentEnd 5752861 +Octets 827 +Lines 26 MimeEntityEnd 5752863 MultipartBoundaryBegin 5752863 MultipartBoundaryEnd 5752906 @@ -3632,6 +4563,8 @@ MimeEntityBegin 5752906 MimeEntityHeadersEnd 5753003 MimeContentBegin 5753003 MimeContentEnd 5811629 +Octets 58626 +Lines 756 MimeEntityEnd 5811631 MultipartBoundaryBegin 5811631 MultipartBoundaryEnd 5811674 @@ -3639,16 +4572,24 @@ MimeEntityBegin 5811674 MimeEntityHeadersEnd 5811768 MimeContentBegin 5811768 MimeContentEnd 5811774 +Octets 6 +Lines 2 MimeEntityEnd 5811776 MultipartEndBoundaryBegin 5811776 MultipartEndBoundaryEnd 5811819 MultipartEpilogueBegin 5811819 MultipartEpilogueEnd 5811821 +MimeContentEnd 5811823 +Octets 59926 +Lines 799 MimeEntityEnd 5811823 MultipartEndBoundaryBegin 5811823 MultipartEndBoundaryEnd 5811864 MultipartEpilogueBegin 5811864 MultipartEpilogueEnd 5811866 +MimeContentEnd 5811868 +Octets 61103 +Lines 838 MimeEntityEnd 5811868 MimeMessageEnd 5811868 MboxMarkerBegin 5811868 @@ -3666,6 +4607,8 @@ MimeEntityBegin 5812686 MimeEntityHeadersEnd 5812779 MimeContentBegin 5812779 MimeContentEnd 5812960 +Octets 181 +Lines 8 MimeEntityEnd 5812962 MultipartBoundaryBegin 5812962 MultipartBoundaryEnd 5813012 @@ -3673,11 +4616,16 @@ MimeEntityBegin 5813012 MimeEntityHeadersEnd 5813074 MimeContentBegin 5813074 MimeContentEnd 5869078 +Octets 56004 +Lines 757 MimeEntityEnd 5869080 MultipartEndBoundaryBegin 5869080 MultipartEndBoundaryEnd 5869130 MultipartEpilogueBegin 5869130 MultipartEpilogueEnd 5869132 +MimeContentEnd 5869134 +Octets 56500 +Lines 776 MimeEntityEnd 5869134 MimeMessageEnd 5869134 MboxMarkerBegin 5869134 @@ -3688,6 +4636,8 @@ MimeEntityBegin 5869167 MimeEntityHeadersEnd 5870664 MimeContentBegin 5870664 MimeContentEnd 5872038 +Octets 1374 +Lines 35 MimeEntityEnd 5872040 MimeMessageEnd 5872040 MboxMarkerBegin 5872040 @@ -3705,6 +4655,8 @@ MimeEntityBegin 5872931 MimeEntityHeadersEnd 5873010 MimeContentBegin 5873010 MimeContentEnd 5873393 +Octets 383 +Lines 14 MimeEntityEnd 5873395 MultipartBoundaryBegin 5873395 MultipartBoundaryEnd 5873421 @@ -3717,14 +4669,21 @@ MimeEntityBegin 5873515 MimeEntityHeadersEnd 5874597 MimeContentBegin 5874597 MimeContentEnd 5899455 +Octets 24858 +Lines 464 MimeEntityEnd 5899457 MimeMessageEnd 5899457 MimeContentEnd 5899457 +Octets 25942 +Lines 478 MimeEntityEnd 5899457 MultipartEndBoundaryBegin 5899457 MultipartEndBoundaryEnd 5899483 MultipartEpilogueBegin 5899483 MultipartEpilogueEnd 5899485 +MimeContentEnd 5899487 +Octets 26630 +Lines 505 MimeEntityEnd 5899487 MimeMessageEnd 5899487 MboxMarkerBegin 5899487 @@ -3742,6 +4701,8 @@ MimeEntityBegin 5900275 MimeEntityHeadersEnd 5900356 MimeContentBegin 5900356 MimeContentEnd 5900391 +Octets 35 +Lines 2 MimeEntityEnd 5900393 MultipartBoundaryBegin 5900393 MultipartBoundaryEnd 5900442 @@ -3749,11 +4710,16 @@ MimeEntityBegin 5900442 MimeEntityHeadersEnd 5900504 MimeContentBegin 5900504 MimeContentEnd 5922958 +Octets 22454 +Lines 304 MimeEntityEnd 5922960 MultipartEndBoundaryBegin 5922960 MultipartEndBoundaryEnd 5923009 MultipartEpilogueBegin 5923009 MultipartEpilogueEnd 5923009 +MimeContentEnd 5923011 +Octets 22833 +Lines 317 MimeEntityEnd 5923011 MimeMessageEnd 5923011 MboxMarkerBegin 5923011 @@ -3771,6 +4737,8 @@ MimeEntityBegin 5923590 MimeEntityHeadersEnd 5923636 MimeContentBegin 5923636 MimeContentEnd 5924829 +Octets 1193 +Lines 22 MimeEntityEnd 5924831 MultipartBoundaryBegin 5924831 MultipartBoundaryEnd 5924840 @@ -3778,6 +4746,8 @@ MimeEntityBegin 5924840 MimeEntityHeadersEnd 5924970 MimeContentBegin 5924970 MimeContentEnd 5925118 +Octets 148 +Lines 3 MimeEntityEnd 5925120 MultipartBoundaryBegin 5925120 MultipartBoundaryEnd 5925129 @@ -3785,11 +4755,16 @@ MimeEntityBegin 5925129 MimeEntityHeadersEnd 5925249 MimeContentBegin 5925249 MimeContentEnd 5925445 +Octets 196 +Lines 3 MimeEntityEnd 5925447 MultipartEndBoundaryBegin 5925447 MultipartEndBoundaryEnd 5925456 MultipartEpilogueBegin 5925456 MultipartEpilogueEnd 5925456 +MimeContentEnd 5925458 +Octets 1877 +Lines 42 MimeEntityEnd 5925458 MimeMessageEnd 5925458 MboxMarkerBegin 5925458 @@ -3800,6 +4775,8 @@ MimeEntityBegin 5925467 MimeEntityHeadersEnd 5926279 MimeContentBegin 5926279 MimeContentEnd 6186575 +Octets 260296 +Lines 3519 MimeEntityEnd 6186577 MimeMessageEnd 6186577 MboxMarkerBegin 6186577 @@ -3817,6 +4794,8 @@ MimeEntityBegin 6187474 MimeEntityHeadersEnd 6187554 MimeContentBegin 6187554 MimeContentEnd 6187752 +Octets 198 +Lines 9 MimeEntityEnd 6187754 MultipartBoundaryBegin 6187754 MultipartBoundaryEnd 6187769 @@ -3824,11 +4803,16 @@ MimeEntityBegin 6187769 MimeEntityHeadersEnd 6187877 MimeContentBegin 6187877 MimeContentEnd 6287399 +Octets 99522 +Lines 1276 MimeEntityEnd 6287401 MultipartEndBoundaryBegin 6287401 MultipartEndBoundaryEnd 6287416 MultipartEpilogueBegin 6287416 MultipartEpilogueEnd 6287418 +MimeContentEnd 6287420 +Octets 99963 +Lines 1297 MimeEntityEnd 6287420 MimeMessageEnd 6287420 MboxMarkerBegin 6287420 @@ -3846,6 +4830,8 @@ MimeEntityBegin 6288335 MimeEntityHeadersEnd 6288383 MimeContentBegin 6288383 MimeContentEnd 6289347 +Octets 964 +Lines 22 MimeEntityEnd 6289349 MultipartBoundaryBegin 6289349 MultipartBoundaryEnd 6289359 @@ -3874,6 +4860,8 @@ MimeEntityBegin 6289969 MimeEntityHeadersEnd 6290096 MimeContentBegin 6290096 MimeContentEnd 6290470 +Octets 374 +Lines 9 MimeEntityEnd 6290472 MultipartBoundaryBegin 6290472 MultipartBoundaryEnd 6290495 @@ -3881,6 +4869,8 @@ MimeEntityBegin 6290495 MimeEntityHeadersEnd 6290621 MimeContentBegin 6290621 MimeContentEnd 6291023 +Octets 402 +Lines 11 MimeEntityEnd 6291025 MultipartBoundaryBegin 6291025 MultipartBoundaryEnd 6291048 @@ -3888,11 +4878,16 @@ MimeEntityBegin 6291048 MimeEntityHeadersEnd 6291177 MimeContentBegin 6291177 MimeContentEnd 6291903 +Octets 726 +Lines 19 MimeEntityEnd 6291905 MultipartEndBoundaryBegin 6291905 MultipartEndBoundaryEnd 6291928 MultipartEpilogueBegin 6291928 MultipartEpilogueEnd 6291930 +MimeContentEnd 6291932 +Octets 1986 +Lines 56 MimeEntityEnd 6291932 MultipartBoundaryBegin 6291932 MultipartBoundaryEnd 6291955 @@ -3907,6 +4902,8 @@ MimeEntityBegin 6292080 MimeEntityHeadersEnd 6292216 MimeContentBegin 6292216 MimeContentEnd 6309101 +Octets 16885 +Lines 471 MimeEntityEnd 6309103 MultipartBoundaryBegin 6309103 MultipartBoundaryEnd 6309126 @@ -3914,6 +4911,8 @@ MimeEntityBegin 6309126 MimeEntityHeadersEnd 6309261 MimeContentBegin 6309261 MimeContentEnd 6323910 +Octets 14649 +Lines 396 MimeEntityEnd 6323912 MultipartBoundaryBegin 6323912 MultipartBoundaryEnd 6323935 @@ -3928,6 +4927,8 @@ MimeEntityBegin 6324062 MimeEntityHeadersEnd 6324208 MimeContentBegin 6324208 MimeContentEnd 6330524 +Octets 6316 +Lines 165 MimeEntityEnd 6330526 MultipartBoundaryBegin 6330526 MultipartBoundaryEnd 6330549 @@ -3935,6 +4936,8 @@ MimeEntityBegin 6330549 MimeEntityHeadersEnd 6330680 MimeContentBegin 6330680 MimeContentEnd 6336095 +Octets 5415 +Lines 161 MimeEntityEnd 6336097 MultipartBoundaryBegin 6336097 MultipartBoundaryEnd 6336120 @@ -3942,6 +4945,8 @@ MimeEntityBegin 6336120 MimeEntityHeadersEnd 6336261 MimeContentBegin 6336261 MimeContentEnd 6343756 +Octets 7495 +Lines 198 MimeEntityEnd 6343758 MultipartBoundaryBegin 6343758 MultipartBoundaryEnd 6343781 @@ -3949,6 +4954,8 @@ MimeEntityBegin 6343781 MimeEntityHeadersEnd 6343909 MimeContentBegin 6343909 MimeContentEnd 6350569 +Octets 6660 +Lines 185 MimeEntityEnd 6350571 MultipartBoundaryBegin 6350571 MultipartBoundaryEnd 6350594 @@ -3956,11 +4963,16 @@ MimeEntityBegin 6350594 MimeEntityHeadersEnd 6350735 MimeContentBegin 6350735 MimeContentEnd 6368395 +Octets 17660 +Lines 493 MimeEntityEnd 6368397 MultipartEndBoundaryBegin 6368397 MultipartEndBoundaryEnd 6368420 MultipartEpilogueBegin 6368420 MultipartEpilogueEnd 6368422 +MimeContentEnd 6368424 +Octets 44385 +Lines 1229 MimeEntityEnd 6368424 MultipartBoundaryBegin 6368424 MultipartBoundaryEnd 6368447 @@ -3975,16 +4987,24 @@ MimeEntityBegin 6368568 MimeEntityHeadersEnd 6368706 MimeContentBegin 6368706 MimeContentEnd 6369222 +Octets 516 +Lines 22 MimeEntityEnd 6369224 MultipartEndBoundaryBegin 6369224 MultipartEndBoundaryEnd 6369247 MultipartEpilogueBegin 6369247 MultipartEpilogueEnd 6369249 +MimeContentEnd 6369251 +Octets 706 +Lines 29 MimeEntityEnd 6369251 MultipartEndBoundaryBegin 6369251 MultipartEndBoundaryEnd 6369274 MultipartEpilogueBegin 6369274 MultipartEpilogueEnd 6369276 +MimeContentEnd 6369278 +Octets 77221 +Lines 2145 MimeEntityEnd 6369278 MultipartBoundaryBegin 6369278 MultipartBoundaryEnd 6369301 @@ -3999,6 +5019,8 @@ MimeEntityBegin 6369438 MimeEntityHeadersEnd 6369580 MimeContentBegin 6369580 MimeContentEnd 6370758 +Octets 1178 +Lines 30 MimeEntityEnd 6370760 MultipartBoundaryBegin 6370760 MultipartBoundaryEnd 6370783 @@ -4006,6 +5028,8 @@ MimeEntityBegin 6370783 MimeEntityHeadersEnd 6370913 MimeContentBegin 6370913 MimeContentEnd 6372168 +Octets 1255 +Lines 36 MimeEntityEnd 6372170 MultipartBoundaryBegin 6372170 MultipartBoundaryEnd 6372193 @@ -4013,26 +5037,40 @@ MimeEntityBegin 6372193 MimeEntityHeadersEnd 6372337 MimeContentBegin 6372337 MimeContentEnd 6373036 +Octets 699 +Lines 23 MimeEntityEnd 6373038 MultipartEndBoundaryBegin 6373038 MultipartEndBoundaryEnd 6373061 MultipartEpilogueBegin 6373061 MultipartEpilogueEnd 6373063 +MimeContentEnd 6373065 +Octets 3650 +Lines 106 MimeEntityEnd 6373065 MultipartEndBoundaryBegin 6373065 MultipartEndBoundaryEnd 6373088 MultipartEpilogueBegin 6373088 MultipartEpilogueEnd 6373090 +MimeContentEnd 6373092 +Octets 83274 +Lines 2321 MimeEntityEnd 6373092 MultipartEndBoundaryBegin 6373092 MultipartEndBoundaryEnd 6373115 MultipartEpilogueBegin 6373115 MultipartEpilogueEnd 6373117 +MimeContentEnd 6373119 +Octets 83695 +Lines 2333 MimeEntityEnd 6373119 MultipartEndBoundaryBegin 6373119 MultipartEndBoundaryEnd 6373129 MultipartEpilogueBegin 6373129 MultipartEpilogueEnd 6373131 +MimeContentEnd 6373133 +Octets 84808 +Lines 2363 MimeEntityEnd 6373133 MimeMessageEnd 6373133 MboxMarkerBegin 6373133 @@ -4043,6 +5081,8 @@ MimeEntityBegin 6373142 MimeEntityHeadersEnd 6373961 MimeContentBegin 6373961 MimeContentEnd 6383386 +Octets 9425 +Lines 227 MimeEntityEnd 6383388 MimeMessageEnd 6383388 MboxMarkerBegin 6383388 @@ -4060,6 +5100,8 @@ MimeEntityBegin 6384340 MimeEntityHeadersEnd 6384386 MimeContentBegin 6384386 MimeContentEnd 6385165 +Octets 779 +Lines 24 MimeEntityEnd 6385167 MultipartBoundaryBegin 6385167 MultipartBoundaryEnd 6385208 @@ -4074,6 +5116,8 @@ MimeEntityBegin 6385339 MimeEntityHeadersEnd 6385433 MimeContentBegin 6385433 MimeContentEnd 6385767 +Octets 334 +Lines 8 MimeEntityEnd 6385769 MultipartBoundaryBegin 6385769 MultipartBoundaryEnd 6385812 @@ -4081,6 +5125,8 @@ MimeEntityBegin 6385812 MimeEntityHeadersEnd 6385910 MimeContentBegin 6385910 MimeContentEnd 6408254 +Octets 22344 +Lines 321 MimeEntityEnd 6408256 MultipartBoundaryBegin 6408256 MultipartBoundaryEnd 6408299 @@ -4088,6 +5134,8 @@ MimeEntityBegin 6408299 MimeEntityHeadersEnd 6408393 MimeContentBegin 6408393 MimeContentEnd 6408564 +Octets 171 +Lines 6 MimeEntityEnd 6408566 MultipartBoundaryBegin 6408566 MultipartBoundaryEnd 6408609 @@ -4095,6 +5143,8 @@ MimeEntityBegin 6408609 MimeEntityHeadersEnd 6408710 MimeContentBegin 6408710 MimeContentEnd 6456608 +Octets 47898 +Lines 686 MimeEntityEnd 6456610 MultipartBoundaryBegin 6456610 MultipartBoundaryEnd 6456653 @@ -4102,6 +5152,8 @@ MimeEntityBegin 6456653 MimeEntityHeadersEnd 6456747 MimeContentBegin 6456747 MimeContentEnd 6456819 +Octets 72 +Lines 3 MimeEntityEnd 6456821 MultipartBoundaryBegin 6456821 MultipartBoundaryEnd 6456864 @@ -4109,6 +5161,8 @@ MimeEntityBegin 6456864 MimeEntityHeadersEnd 6456958 MimeContentBegin 6456958 MimeContentEnd 6477470 +Octets 20512 +Lines 295 MimeEntityEnd 6477472 MultipartBoundaryBegin 6477472 MultipartBoundaryEnd 6477515 @@ -4116,16 +5170,24 @@ MimeEntityBegin 6477515 MimeEntityHeadersEnd 6477609 MimeContentBegin 6477609 MimeContentEnd 6477721 +Octets 112 +Lines 9 MimeEntityEnd 6477723 MultipartEndBoundaryBegin 6477723 MultipartEndBoundaryEnd 6477766 MultipartEpilogueBegin 6477766 MultipartEpilogueEnd 6477768 +MimeContentEnd 6477770 +Octets 92474 +Lines 1361 MimeEntityEnd 6477770 MultipartEndBoundaryBegin 6477770 MultipartEndBoundaryEnd 6477811 MultipartEpilogueBegin 6477811 MultipartEpilogueEnd 6477811 +MimeContentEnd 6477813 +Octets 93672 +Lines 1396 MimeEntityEnd 6477813 MimeMessageEnd 6477813 MboxMarkerBegin 6477813 @@ -4143,6 +5205,8 @@ MimeEntityBegin 6478838 MimeEntityHeadersEnd 6478914 MimeContentBegin 6478914 MimeContentEnd 6479347 +Octets 433 +Lines 14 MimeEntityEnd 6479349 MultipartBoundaryBegin 6479349 MultipartBoundaryEnd 6479395 @@ -4150,6 +5214,8 @@ MimeEntityBegin 6479395 MimeEntityHeadersEnd 6479459 MimeContentBegin 6479459 MimeContentEnd 6513483 +Octets 34024 +Lines 461 MimeEntityEnd 6513485 MultipartBoundaryBegin 6513485 MultipartBoundaryEnd 6513531 @@ -4157,11 +5223,16 @@ MimeEntityBegin 6513531 MimeEntityHeadersEnd 6513607 MimeContentBegin 6513607 MimeContentEnd 6513708 +Octets 101 +Lines 8 MimeEntityEnd 6513710 MultipartEndBoundaryBegin 6513710 MultipartEndBoundaryEnd 6513756 MultipartEpilogueBegin 6513756 MultipartEpilogueEnd 6513758 +MimeContentEnd 6513760 +Octets 35167 +Lines 501 MimeEntityEnd 6513760 MimeMessageEnd 6513760 MboxMarkerBegin 6513760 @@ -4172,6 +5243,8 @@ MimeEntityBegin 6513803 MimeEntityHeadersEnd 6513957 MimeContentBegin 6513957 MimeContentEnd 6557679 +Octets 43722 +Lines 694 MimeEntityEnd 6557681 MimeMessageEnd 6557681 MboxMarkerBegin 6557681 @@ -4196,6 +5269,8 @@ MimeEntityBegin 6558563 MimeEntityHeadersEnd 6558644 MimeContentBegin 6558644 MimeContentEnd 6559954 +Octets 1310 +Lines 39 MimeEntityEnd 6559956 MultipartBoundaryBegin 6559956 MultipartBoundaryEnd 6559996 @@ -4203,11 +5278,16 @@ MimeEntityBegin 6559996 MimeEntityHeadersEnd 6560078 MimeContentBegin 6560078 MimeContentEnd 6562574 +Octets 2496 +Lines 33 MimeEntityEnd 6562576 MultipartEndBoundaryBegin 6562576 MultipartEndBoundaryEnd 6562616 MultipartEpilogueBegin 6562616 MultipartEpilogueEnd 6562620 +MimeContentEnd 6562622 +Octets 4101 +Lines 84 MimeEntityEnd 6562622 MultipartBoundaryBegin 6562622 MultipartBoundaryEnd 6562662 @@ -4215,11 +5295,16 @@ MimeEntityBegin 6562662 MimeEntityHeadersEnd 6562872 MimeContentBegin 6562872 MimeContentEnd 6583892 +Octets 21020 +Lines 271 MimeEntityEnd 6583894 MultipartEndBoundaryBegin 6583894 MultipartEndBoundaryEnd 6583934 MultipartEpilogueBegin 6583934 MultipartEpilogueEnd 6583936 +MimeContentEnd 6583938 +Octets 25626 +Lines 369 MimeEntityEnd 6583938 MimeMessageEnd 6583938 MboxMarkerBegin 6583938 @@ -4237,6 +5322,8 @@ MimeEntityBegin 6584457 MimeEntityHeadersEnd 6584459 MimeContentBegin 6584459 MimeContentEnd 6584523 +Octets 64 +Lines 2 MimeEntityEnd 6584525 MultipartBoundaryBegin 6584525 MultipartBoundaryEnd 6584546 @@ -4251,6 +5338,8 @@ MimeEntityBegin 6584650 MimeEntityHeadersEnd 6584760 MimeContentBegin 6584760 MimeContentEnd 6584843 +Octets 83 +Lines 4 MimeEntityEnd 6584845 MultipartBoundaryBegin 6584845 MultipartBoundaryEnd 6584873 @@ -4258,6 +5347,8 @@ MimeEntityBegin 6584873 MimeEntityHeadersEnd 6584986 MimeContentBegin 6584986 MimeContentEnd 6585148 +Octets 162 +Lines 5 MimeEntityEnd 6585150 MultipartBoundaryBegin 6585150 MultipartBoundaryEnd 6585178 @@ -4265,6 +5356,8 @@ MimeEntityBegin 6585178 MimeEntityHeadersEnd 6585291 MimeContentBegin 6585291 MimeContentEnd 6585464 +Octets 173 +Lines 11 MimeEntityEnd 6585466 MultipartBoundaryBegin 6585466 MultipartBoundaryEnd 6585494 @@ -4272,6 +5365,8 @@ MimeEntityBegin 6585494 MimeEntityHeadersEnd 6585603 MimeContentBegin 6585603 MimeContentEnd 6585767 +Octets 164 +Lines 4 MimeEntityEnd 6585769 MultipartBoundaryBegin 6585769 MultipartBoundaryEnd 6585797 @@ -4279,11 +5374,16 @@ MimeEntityBegin 6585797 MimeEntityHeadersEnd 6585925 MimeContentBegin 6585925 MimeContentEnd 6586358 +Octets 433 +Lines 7 MimeEntityEnd 6586360 MultipartEndBoundaryBegin 6586360 MultipartEndBoundaryEnd 6586388 MultipartEpilogueBegin 6586388 MultipartEpilogueEnd 6586388 +MimeContentEnd 6586390 +Octets 1768 +Lines 57 MimeEntityEnd 6586390 MultipartBoundaryBegin 6586390 MultipartBoundaryEnd 6586411 @@ -4291,6 +5391,8 @@ MimeEntityBegin 6586411 MimeEntityHeadersEnd 6586413 MimeContentBegin 6586413 MimeContentEnd 6586582 +Octets 169 +Lines 5 MimeEntityEnd 6586584 MultipartBoundaryBegin 6586584 MultipartBoundaryEnd 6586605 @@ -4305,6 +5407,8 @@ MimeEntityBegin 6586663 MimeEntityHeadersEnd 6586691 MimeContentBegin 6586691 MimeContentEnd 6586745 +Octets 54 +Lines 2 MimeEntityEnd 6586747 MultipartBoundaryBegin 6586747 MultipartBoundaryEnd 6586753 @@ -4319,6 +5423,8 @@ MimeEntityBegin 6586811 MimeEntityHeadersEnd 6586839 MimeContentBegin 6586839 MimeContentEnd 6586893 +Octets 54 +Lines 2 MimeEntityEnd 6586895 MultipartBoundaryBegin 6586895 MultipartBoundaryEnd 6586901 @@ -4326,6 +5432,8 @@ MimeEntityBegin 6586901 MimeEntityHeadersEnd 6586928 MimeContentBegin 6586928 MimeContentEnd 6586979 +Octets 51 +Lines 2 MimeEntityEnd 6586981 MultipartBoundaryBegin 6586981 MultipartBoundaryEnd 6586987 @@ -4333,11 +5441,16 @@ MimeEntityBegin 6586987 MimeEntityHeadersEnd 6587016 MimeContentBegin 6587016 MimeContentEnd 6587071 +Octets 55 +Lines 2 MimeEntityEnd 6587073 MultipartEndBoundaryBegin 6587073 MultipartEndBoundaryEnd 6587079 MultipartEpilogueBegin 6587079 MultipartEpilogueEnd 6587081 +MimeContentEnd 6587083 +Octets 278 +Lines 17 MimeEntityEnd 6587083 MultipartBoundaryBegin 6587083 MultipartBoundaryEnd 6587089 @@ -4345,11 +5458,16 @@ MimeEntityBegin 6587089 MimeEntityHeadersEnd 6587184 MimeContentBegin 6587184 MimeContentEnd 6587200 +Octets 16 +Lines 2 MimeEntityEnd 6587202 MultipartEndBoundaryBegin 6587202 MultipartEndBoundaryEnd 6587208 MultipartEpilogueBegin 6587208 MultipartEpilogueEnd 6587208 +MimeContentEnd 6587210 +Octets 553 +Lines 32 MimeEntityEnd 6587210 MultipartBoundaryBegin 6587210 MultipartBoundaryEnd 6587231 @@ -4357,11 +5475,16 @@ MimeEntityBegin 6587231 MimeEntityHeadersEnd 6587233 MimeContentBegin 6587233 MimeContentEnd 6587243 +Octets 10 +Lines 2 MimeEntityEnd 6587245 MultipartEndBoundaryBegin 6587245 MultipartEndBoundaryEnd 6587266 MultipartEpilogueBegin 6587266 MultipartEpilogueEnd 6587266 +MimeContentEnd 6587268 +Octets 2880 +Lines 113 MimeEntityEnd 6587268 MimeMessageEnd 6587268 MboxMarkerBegin 6587268 @@ -4379,6 +5502,8 @@ MimeEntityBegin 6587785 MimeEntityHeadersEnd 6587787 MimeContentBegin 6587787 MimeContentEnd 6587855 +Octets 68 +Lines 2 MimeEntityEnd 6587857 MultipartBoundaryBegin 6587857 MultipartBoundaryEnd 6587878 @@ -4393,6 +5518,8 @@ MimeEntityBegin 6587982 MimeEntityHeadersEnd 6588142 MimeContentBegin 6588142 MimeContentEnd 6645008 +Octets 56866 +Lines 1604 MimeEntityEnd 6645010 MultipartBoundaryBegin 6645010 MultipartBoundaryEnd 6645038 @@ -4400,6 +5527,8 @@ MimeEntityBegin 6645038 MimeEntityHeadersEnd 6645197 MimeContentBegin 6645197 MimeContentEnd 6754228 +Octets 109031 +Lines 2983 MimeEntityEnd 6754230 MultipartBoundaryBegin 6754230 MultipartBoundaryEnd 6754258 @@ -4407,16 +5536,24 @@ MimeEntityBegin 6754258 MimeEntityHeadersEnd 6754408 MimeContentBegin 6754408 MimeContentEnd 6955876 +Octets 201468 +Lines 13110 MimeEntityEnd 6955878 MultipartEndBoundaryBegin 6955878 MultipartEndBoundaryEnd 6955906 MultipartEpilogueBegin 6955906 MultipartEpilogueEnd 6955908 +MimeContentEnd 6955910 +Octets 367956 +Lines 17714 MimeEntityEnd 6955910 MultipartEndBoundaryBegin 6955910 MultipartEndBoundaryEnd 6955931 MultipartEpilogueBegin 6955931 MultipartEpilogueEnd 6955939 +MimeContentEnd 6955941 +Octets 368225 +Lines 17726 MimeEntityEnd 6955941 MimeMessageEnd 6955941 MboxMarkerBegin 6955941 @@ -4434,6 +5571,8 @@ MimeEntityBegin 6956828 MimeEntityHeadersEnd 6956943 MimeContentBegin 6956943 MimeContentEnd 6956943 +Octets 0 +Lines 1 MimeEntityEnd 6956945 MultipartBoundaryBegin 6956945 MultipartBoundaryEnd 6956986 @@ -4446,14 +5585,21 @@ MimeEntityBegin 6957087 MimeEntityHeadersEnd 6957640 MimeContentBegin 6957640 MimeContentEnd 6958002 +Octets 362 +Lines 17 MimeEntityEnd 6958004 MimeMessageEnd 6958004 MimeContentEnd 6958004 +Octets 917 +Lines 29 MimeEntityEnd 6958004 MultipartEndBoundaryBegin 6958004 MultipartEndBoundaryEnd 6958045 MultipartEpilogueBegin 6958045 MultipartEpilogueEnd 6958045 +MimeContentEnd 6958047 +Octets 1480 +Lines 43 MimeEntityEnd 6958047 MimeMessageEnd 6958047 MboxMarkerBegin 6958047 @@ -4471,6 +5617,8 @@ MimeEntityBegin 6958401 MimeEntityHeadersEnd 6958654 MimeContentBegin 6958654 MimeContentEnd 6959403 +Octets 749 +Lines 31 MimeEntityEnd 6959405 MultipartBoundaryBegin 6959405 MultipartBoundaryEnd 6959445 @@ -4478,11 +5626,16 @@ MimeEntityBegin 6959445 MimeEntityHeadersEnd 6959773 MimeContentBegin 6959773 MimeContentEnd 6970643 +Octets 10870 +Lines 148 MimeEntityEnd 6970645 MultipartEndBoundaryBegin 6970645 MultipartEndBoundaryEnd 6970685 MultipartEpilogueBegin 6970685 MultipartEpilogueEnd 6970685 +MimeContentEnd 6970687 +Octets 12326 +Lines 197 MimeEntityEnd 6970687 MimeMessageEnd 6970687 MboxMarkerBegin 6970687 @@ -4500,6 +5653,8 @@ MimeEntityBegin 6971041 MimeEntityHeadersEnd 6971294 MimeContentBegin 6971294 MimeContentEnd 6972042 +Octets 748 +Lines 31 MimeEntityEnd 6972044 MultipartBoundaryBegin 6972044 MultipartBoundaryEnd 6972084 @@ -4507,11 +5662,16 @@ MimeEntityBegin 6972084 MimeEntityHeadersEnd 6972381 MimeContentBegin 6972381 MimeContentEnd 6983251 +Octets 10870 +Lines 148 MimeEntityEnd 6983253 MultipartEndBoundaryBegin 6983253 MultipartEndBoundaryEnd 6983293 MultipartEpilogueBegin 6983293 MultipartEpilogueEnd 6983293 +MimeContentEnd 6983295 +Octets 12294 +Lines 197 MimeEntityEnd 6983295 MimeMessageEnd 6983295 MboxMarkerBegin 6983295 @@ -4529,6 +5689,8 @@ MimeEntityBegin 6984904 MimeEntityHeadersEnd 6984998 MimeContentBegin 6984998 MimeContentEnd 6990308 +Octets 5310 +Lines 112 MimeEntityEnd 6990310 MultipartBoundaryBegin 6990310 MultipartBoundaryEnd 6990355 @@ -4536,11 +5698,16 @@ MimeEntityBegin 6990355 MimeEntityHeadersEnd 6990560 MimeContentBegin 6990560 MimeContentEnd 6991502 +Octets 942 +Lines 14 MimeEntityEnd 6991504 MultipartEndBoundaryBegin 6991504 MultipartEndBoundaryEnd 6991549 MultipartEpilogueBegin 6991549 MultipartEpilogueEnd 6991551 +MimeContentEnd 6991553 +Octets 6696 +Lines 140 MimeEntityEnd 6991553 MimeMessageEnd 6991553 MboxMarkerBegin 6991553 @@ -4558,6 +5725,8 @@ MimeEntityBegin 6992085 MimeEntityHeadersEnd 6992113 MimeContentBegin 6992113 MimeContentEnd 6992366 +Octets 253 +Lines 7 MimeEntityEnd 6992368 MultipartBoundaryBegin 6992368 MultipartBoundaryEnd 6992408 @@ -4572,6 +5741,8 @@ MimeEntityBegin 6992537 MimeEntityHeadersEnd 6992736 MimeContentBegin 6992736 MimeContentEnd 7000063 +Octets 7327 +Lines 180 MimeEntityEnd 7000065 MultipartBoundaryBegin 7000065 MultipartBoundaryEnd 7000105 @@ -4579,6 +5750,8 @@ MimeEntityBegin 7000105 MimeEntityHeadersEnd 7000286 MimeContentBegin 7000286 MimeContentEnd 7008376 +Octets 8090 +Lines 110 MimeEntityEnd 7008378 MultipartBoundaryBegin 7008378 MultipartBoundaryEnd 7008418 @@ -4586,6 +5759,8 @@ MimeEntityBegin 7008418 MimeEntityHeadersEnd 7008582 MimeContentBegin 7008582 MimeContentEnd 7016138 +Octets 7556 +Lines 103 MimeEntityEnd 7016140 MultipartBoundaryBegin 7016140 MultipartBoundaryEnd 7016180 @@ -4593,6 +5768,8 @@ MimeEntityBegin 7016180 MimeEntityHeadersEnd 7016343 MimeContentBegin 7016343 MimeContentEnd 7019721 +Octets 3378 +Lines 46 MimeEntityEnd 7019723 MultipartBoundaryBegin 7019723 MultipartBoundaryEnd 7019763 @@ -4600,6 +5777,8 @@ MimeEntityBegin 7019763 MimeEntityHeadersEnd 7019927 MimeContentBegin 7019927 MimeContentEnd 7028493 +Octets 8566 +Lines 116 MimeEntityEnd 7028495 MultipartBoundaryBegin 7028495 MultipartBoundaryEnd 7028535 @@ -4607,6 +5786,8 @@ MimeEntityBegin 7028535 MimeEntityHeadersEnd 7028696 MimeContentBegin 7028696 MimeContentEnd 7134494 +Octets 105798 +Lines 1430 MimeEntityEnd 7134496 MultipartBoundaryBegin 7134496 MultipartBoundaryEnd 7134536 @@ -4614,6 +5795,8 @@ MimeEntityBegin 7134536 MimeEntityHeadersEnd 7134700 MimeContentBegin 7134700 MimeContentEnd 7173586 +Octets 38886 +Lines 526 MimeEntityEnd 7173588 MultipartBoundaryBegin 7173588 MultipartBoundaryEnd 7173628 @@ -4621,16 +5804,24 @@ MimeEntityBegin 7173628 MimeEntityHeadersEnd 7173797 MimeContentBegin 7173797 MimeContentEnd 7209595 +Octets 35798 +Lines 484 MimeEntityEnd 7209597 MultipartEndBoundaryBegin 7209597 MultipartEndBoundaryEnd 7209637 MultipartEpilogueBegin 7209637 MultipartEpilogueEnd 7209637 +MimeContentEnd 7209639 +Octets 217142 +Lines 3044 MimeEntityEnd 7209639 MultipartEndBoundaryBegin 7209639 MultipartEndBoundaryEnd 7209679 MultipartEpilogueBegin 7209679 MultipartEpilogueEnd 7209679 +MimeContentEnd 7209681 +Octets 217636 +Lines 3059 MimeEntityEnd 7209681 MimeMessageEnd 7209681 MboxMarkerBegin 7209681 @@ -4648,6 +5839,8 @@ MimeEntityBegin 7210034 MimeEntityHeadersEnd 7210195 MimeContentBegin 7210195 MimeContentEnd 7210773 +Octets 578 +Lines 28 MimeEntityEnd 7210775 MultipartBoundaryBegin 7210775 MultipartBoundaryEnd 7210815 @@ -4655,11 +5848,16 @@ MimeEntityBegin 7210815 MimeEntityHeadersEnd 7210932 MimeContentBegin 7210932 MimeContentEnd 7221802 +Octets 10870 +Lines 148 MimeEntityEnd 7221804 MultipartEndBoundaryBegin 7221804 MultipartEndBoundaryEnd 7221844 MultipartEpilogueBegin 7221844 MultipartEpilogueEnd 7221844 +MimeContentEnd 7221846 +Octets 11852 +Lines 188 MimeEntityEnd 7221846 MimeMessageEnd 7221846 MboxMarkerBegin 7221846 @@ -4677,6 +5875,8 @@ MimeEntityBegin 7222199 MimeEntityHeadersEnd 7222417 MimeContentBegin 7222417 MimeContentEnd 7223042 +Octets 625 +Lines 29 MimeEntityEnd 7223044 MultipartBoundaryBegin 7223044 MultipartBoundaryEnd 7223084 @@ -4684,11 +5884,16 @@ MimeEntityBegin 7223084 MimeEntityHeadersEnd 7223365 MimeContentBegin 7223365 MimeContentEnd 7234235 +Octets 10870 +Lines 148 MimeEntityEnd 7234237 MultipartEndBoundaryBegin 7234237 MultipartEndBoundaryEnd 7234277 MultipartEpilogueBegin 7234277 MultipartEpilogueEnd 7234277 +MimeContentEnd 7234279 +Octets 12120 +Lines 193 MimeEntityEnd 7234279 MimeMessageEnd 7234279 MboxMarkerBegin 7234279 @@ -4706,6 +5911,8 @@ MimeEntityBegin 7234632 MimeEntityHeadersEnd 7234854 MimeContentBegin 7234854 MimeContentEnd 7235483 +Octets 629 +Lines 29 MimeEntityEnd 7235485 MultipartBoundaryBegin 7235485 MultipartBoundaryEnd 7235525 @@ -4713,11 +5920,16 @@ MimeEntityBegin 7235525 MimeEntityHeadersEnd 7235705 MimeContentBegin 7235705 MimeContentEnd 7246575 +Octets 10870 +Lines 148 MimeEntityEnd 7246577 MultipartEndBoundaryBegin 7246577 MultipartEndBoundaryEnd 7246617 MultipartEpilogueBegin 7246617 MultipartEpilogueEnd 7246617 +MimeContentEnd 7246619 +Octets 12027 +Lines 191 MimeEntityEnd 7246619 MimeMessageEnd 7246619 MboxMarkerBegin 7246619 @@ -4735,6 +5947,8 @@ MimeEntityBegin 7246972 MimeEntityHeadersEnd 7247224 MimeContentBegin 7247224 MimeContentEnd 7247884 +Octets 660 +Lines 30 MimeEntityEnd 7247886 MultipartBoundaryBegin 7247886 MultipartBoundaryEnd 7247926 @@ -4742,11 +5956,16 @@ MimeEntityBegin 7247926 MimeEntityHeadersEnd 7248239 MimeContentBegin 7248239 MimeContentEnd 7259109 +Octets 10870 +Lines 148 MimeEntityEnd 7259111 MultipartEndBoundaryBegin 7259111 MultipartEndBoundaryEnd 7259151 MultipartEpilogueBegin 7259151 MultipartEpilogueEnd 7259151 +MimeContentEnd 7259153 +Octets 12221 +Lines 196 MimeEntityEnd 7259153 MimeMessageEnd 7259153 MboxMarkerBegin 7259153 @@ -4764,6 +5983,8 @@ MimeEntityBegin 7259506 MimeEntityHeadersEnd 7259728 MimeContentBegin 7259728 MimeContentEnd 7260401 +Octets 673 +Lines 29 MimeEntityEnd 7260403 MultipartBoundaryBegin 7260403 MultipartBoundaryEnd 7260443 @@ -4771,11 +5992,16 @@ MimeEntityBegin 7260443 MimeEntityHeadersEnd 7260623 MimeContentBegin 7260623 MimeContentEnd 7271493 +Octets 10870 +Lines 148 MimeEntityEnd 7271495 MultipartEndBoundaryBegin 7271495 MultipartEndBoundaryEnd 7271535 MultipartEpilogueBegin 7271535 MultipartEpilogueEnd 7271535 +MimeContentEnd 7271537 +Octets 12071 +Lines 191 MimeEntityEnd 7271537 MimeMessageEnd 7271537 MboxMarkerBegin 7271537 @@ -4793,6 +6019,8 @@ MimeEntityBegin 7271890 MimeEntityHeadersEnd 7272142 MimeContentBegin 7272142 MimeContentEnd 7272841 +Octets 699 +Lines 30 MimeEntityEnd 7272843 MultipartBoundaryBegin 7272843 MultipartBoundaryEnd 7272883 @@ -4800,11 +6028,16 @@ MimeEntityBegin 7272883 MimeEntityHeadersEnd 7273227 MimeContentBegin 7273227 MimeContentEnd 7284097 +Octets 10870 +Lines 148 MimeEntityEnd 7284099 MultipartEndBoundaryBegin 7284099 MultipartEndBoundaryEnd 7284139 MultipartEpilogueBegin 7284139 MultipartEpilogueEnd 7284139 +MimeContentEnd 7284141 +Octets 12291 +Lines 196 MimeEntityEnd 7284141 MimeMessageEnd 7284141 MboxMarkerBegin 7284141 @@ -4822,6 +6055,8 @@ MimeEntityBegin 7285517 MimeEntityHeadersEnd 7285596 MimeContentBegin 7285596 MimeContentEnd 7285626 +Octets 30 +Lines 4 MimeEntityEnd 7285628 MultipartBoundaryBegin 7285628 MultipartBoundaryEnd 7285667 @@ -4841,6 +6076,8 @@ MimeEntityBegin 7286640 MimeEntityHeadersEnd 7286719 MimeContentBegin 7286719 MimeContentEnd 7287362 +Octets 643 +Lines 17 MimeEntityEnd 7287364 MultipartBoundaryBegin 7287364 MultipartBoundaryEnd 7287404 @@ -4855,6 +6092,8 @@ MimeEntityBegin 7287530 MimeEntityHeadersEnd 7287608 MimeContentBegin 7287608 MimeContentEnd 7288476 +Octets 868 +Lines 19 MimeEntityEnd 7288478 MultipartBoundaryBegin 7288478 MultipartBoundaryEnd 7288518 @@ -4862,24 +6101,37 @@ MimeEntityBegin 7288518 MimeEntityHeadersEnd 7288707 MimeContentBegin 7288707 MimeContentEnd 8042865 +Octets 754158 +Lines 10192 MimeEntityEnd 8042867 MultipartEndBoundaryBegin 8042867 MultipartEndBoundaryEnd 8042907 MultipartEpilogueBegin 8042907 MultipartEpilogueEnd 8042909 +MimeContentEnd 8042911 +Octets 755423 +Lines 10224 MimeEntityEnd 8042911 MultipartEndBoundaryBegin 8042911 MultipartEndBoundaryEnd 8042951 MultipartEpilogueBegin 8042951 MultipartEpilogueEnd 8042957 +MimeContentEnd 8042959 +Octets 756361 +Lines 10253 MimeEntityEnd 8042959 MimeMessageEnd 8042959 MimeContentEnd 8042959 +Octets 757198 +Lines 10269 MimeEntityEnd 8042959 MultipartEndBoundaryBegin 8042959 MultipartEndBoundaryEnd 8042998 MultipartEpilogueBegin 8042998 MultipartEpilogueEnd 8043000 +MimeContentEnd 8043002 +Octets 757572 +Lines 10286 MimeEntityEnd 8043002 MimeMessageEnd 8043002 MboxMarkerBegin 8043002 @@ -4897,6 +6149,8 @@ MimeEntityBegin 8044368 MimeEntityHeadersEnd 8044462 MimeContentBegin 8044462 MimeContentEnd 8046894 +Octets 2432 +Lines 51 MimeEntityEnd 8046896 MultipartBoundaryBegin 8046896 MultipartBoundaryEnd 8046941 @@ -4904,6 +6158,8 @@ MimeEntityBegin 8046941 MimeEntityHeadersEnd 8047105 MimeContentBegin 8047105 MimeContentEnd 8053207 +Octets 6102 +Lines 80 MimeEntityEnd 8053209 MultipartBoundaryBegin 8053209 MultipartBoundaryEnd 8053254 @@ -4911,6 +6167,8 @@ MimeEntityBegin 8053254 MimeEntityHeadersEnd 8053417 MimeContentBegin 8053417 MimeContentEnd 8065647 +Octets 12230 +Lines 158 MimeEntityEnd 8065649 MultipartBoundaryBegin 8065649 MultipartBoundaryEnd 8065694 @@ -4918,6 +6176,8 @@ MimeEntityBegin 8065694 MimeEntityHeadersEnd 8065859 MimeContentBegin 8065859 MimeContentEnd 8087855 +Octets 21996 +Lines 283 MimeEntityEnd 8087857 MultipartBoundaryBegin 8087857 MultipartBoundaryEnd 8087902 @@ -4925,11 +6185,16 @@ MimeEntityBegin 8087902 MimeEntityHeadersEnd 8088111 MimeContentBegin 8088111 MimeContentEnd 8091549 +Octets 3438 +Lines 46 MimeEntityEnd 8091551 MultipartEndBoundaryBegin 8091551 MultipartEndBoundaryEnd 8091596 MultipartEpilogueBegin 8091596 MultipartEpilogueEnd 8091598 +MimeContentEnd 8091600 +Octets 47279 +Lines 650 MimeEntityEnd 8091600 MimeMessageEnd 8091600 MboxMarkerBegin 8091600 @@ -4940,6 +6205,8 @@ MimeEntityBegin 8091609 MimeEntityHeadersEnd 8092367 MimeContentBegin 8092367 MimeContentEnd 8644457 +Octets 552090 +Lines 7475 MimeEntityEnd 8644459 MimeMessageEnd 8644459 MboxMarkerBegin 8644459 @@ -4957,11 +6224,16 @@ MimeEntityBegin 8645411 MimeEntityHeadersEnd 8645442 MimeContentBegin 8645442 MimeContentEnd 8648068 +Octets 2626 +Lines 97 MimeEntityEnd 8648070 MultipartEndBoundaryBegin 8648070 MultipartEndBoundaryEnd 8648079 MultipartEpilogueBegin 8648079 MultipartEpilogueEnd 8648081 +MimeContentEnd 8648083 +Octets 2683 +Lines 103 MimeEntityEnd 8648083 MimeMessageEnd 8648083 MboxMarkerBegin 8648083 @@ -4979,6 +6251,8 @@ MimeEntityBegin 8649031 MimeEntityHeadersEnd 8649078 MimeContentBegin 8649078 MimeContentEnd 8650186 +Octets 1108 +Lines 27 MimeEntityEnd 8650188 MultipartBoundaryBegin 8650188 MultipartBoundaryEnd 8650206 @@ -4986,11 +6260,16 @@ MimeEntityBegin 8650206 MimeEntityHeadersEnd 8650249 MimeContentBegin 8650249 MimeContentEnd 8650542 +Octets 293 +Lines 10 MimeEntityEnd 8650544 MultipartEndBoundaryBegin 8650544 MultipartEndBoundaryEnd 8650562 MultipartEpilogueBegin 8650562 MultipartEpilogueEnd 8650562 +MimeContentEnd 8650564 +Octets 1838 +Lines 51 MimeEntityEnd 8650564 MimeMessageEnd 8650564 MboxMarkerBegin 8650564 @@ -5001,6 +6280,8 @@ MimeEntityBegin 8650573 MimeEntityHeadersEnd 8651756 MimeContentBegin 8651756 MimeContentEnd 8653178 +Octets 1422 +Lines 40 MimeEntityEnd 8653180 MimeMessageEnd 8653180 MboxMarkerBegin 8653180 @@ -5011,6 +6292,8 @@ MimeEntityBegin 8653189 MimeEntityHeadersEnd 8653839 MimeContentBegin 8653839 MimeContentEnd 8654840 +Octets 1001 +Lines 28 MimeEntityEnd 8654842 MimeMessageEnd 8654842 MboxMarkerBegin 8654842 @@ -5028,6 +6311,8 @@ MimeEntityBegin 8655830 MimeEntityHeadersEnd 8655876 MimeContentBegin 8655876 MimeContentEnd 8656708 +Octets 832 +Lines 16 MimeEntityEnd 8656710 MultipartBoundaryBegin 8656710 MultipartBoundaryEnd 8656751 @@ -5042,6 +6327,8 @@ MimeEntityBegin 8656882 MimeEntityHeadersEnd 8656976 MimeContentBegin 8656976 MimeContentEnd 8657477 +Octets 501 +Lines 11 MimeEntityEnd 8657479 MultipartBoundaryBegin 8657479 MultipartBoundaryEnd 8657522 @@ -5054,9 +6341,13 @@ MimeEntityBegin 8657715 MimeEntityHeadersEnd 8657744 MimeContentBegin 8657744 MimeContentEnd 8657748 +Octets 4 +Lines 3 MimeEntityEnd 8657750 MimeMessageEnd 8657750 MimeContentEnd 8657750 +Octets 35 +Lines 5 MimeEntityEnd 8657750 MultipartBoundaryBegin 8657750 MultipartBoundaryEnd 8657793 @@ -5064,6 +6355,8 @@ MimeEntityBegin 8657793 MimeEntityHeadersEnd 8657884 MimeContentBegin 8657884 MimeContentEnd 8657889 +Octets 5 +Lines 3 MimeEntityEnd 8657891 MultipartBoundaryBegin 8657891 MultipartBoundaryEnd 8657934 @@ -5076,9 +6369,13 @@ MimeEntityBegin 8658142 MimeEntityHeadersEnd 8658169 MimeContentBegin 8658169 MimeContentEnd 8658173 +Octets 4 +Lines 3 MimeEntityEnd 8658175 MimeMessageEnd 8658175 MimeContentEnd 8658175 +Octets 33 +Lines 5 MimeEntityEnd 8658175 MultipartBoundaryBegin 8658175 MultipartBoundaryEnd 8658218 @@ -5086,16 +6383,24 @@ MimeEntityBegin 8658218 MimeEntityHeadersEnd 8658312 MimeContentBegin 8658312 MimeContentEnd 8658541 +Octets 229 +Lines 8 MimeEntityEnd 8658543 MultipartEndBoundaryBegin 8658543 MultipartEndBoundaryEnd 8658586 MultipartEpilogueBegin 8658586 MultipartEpilogueEnd 8658588 +MimeContentEnd 8658590 +Octets 1751 +Lines 62 MimeEntityEnd 8658590 MultipartEndBoundaryBegin 8658590 MultipartEndBoundaryEnd 8658631 MultipartEpilogueBegin 8658631 MultipartEpilogueEnd 8658633 +MimeContentEnd 8658635 +Octets 3004 +Lines 90 MimeEntityEnd 8658635 MimeMessageEnd 8658635 MboxMarkerBegin 8658635 @@ -5106,6 +6411,8 @@ MimeEntityBegin 8658644 MimeEntityHeadersEnd 8659476 MimeContentBegin 8659476 MimeContentEnd 8660904 +Octets 1428 +Lines 43 MimeEntityEnd 8660906 MimeMessageEnd 8660906 MboxMarkerBegin 8660906 @@ -5116,6 +6423,8 @@ MimeEntityBegin 8660915 MimeEntityHeadersEnd 8661072 MimeContentBegin 8661072 MimeContentEnd 8665806 +Octets 4734 +Lines 64 MimeEntityEnd 8665808 MimeMessageEnd 8665808 MboxMarkerBegin 8665808 @@ -5133,6 +6442,8 @@ MimeEntityBegin 8667794 MimeEntityHeadersEnd 8667840 MimeContentBegin 8667840 MimeContentEnd 8669545 +Octets 1705 +Lines 39 MimeEntityEnd 8669547 MultipartBoundaryBegin 8669547 MultipartBoundaryEnd 8669588 @@ -5147,6 +6458,8 @@ MimeEntityBegin 8669719 MimeEntityHeadersEnd 8669813 MimeContentBegin 8669813 MimeContentEnd 8670384 +Octets 571 +Lines 15 MimeEntityEnd 8670386 MultipartBoundaryBegin 8670386 MultipartBoundaryEnd 8670429 @@ -5154,6 +6467,8 @@ MimeEntityBegin 8670429 MimeEntityHeadersEnd 8670493 MimeContentBegin 8670493 MimeContentEnd 8671377 +Octets 884 +Lines 13 MimeEntityEnd 8671379 MultipartBoundaryBegin 8671379 MultipartBoundaryEnd 8671422 @@ -5161,6 +6476,8 @@ MimeEntityBegin 8671422 MimeEntityHeadersEnd 8671516 MimeContentBegin 8671516 MimeContentEnd 8671567 +Octets 51 +Lines 6 MimeEntityEnd 8671569 MultipartBoundaryBegin 8671569 MultipartBoundaryEnd 8671612 @@ -5168,6 +6485,8 @@ MimeEntityBegin 8671612 MimeEntityHeadersEnd 8671676 MimeContentBegin 8671676 MimeContentEnd 8672560 +Octets 884 +Lines 13 MimeEntityEnd 8672562 MultipartBoundaryBegin 8672562 MultipartBoundaryEnd 8672605 @@ -5175,6 +6494,8 @@ MimeEntityBegin 8672605 MimeEntityHeadersEnd 8672699 MimeContentBegin 8672699 MimeContentEnd 8672750 +Octets 51 +Lines 6 MimeEntityEnd 8672752 MultipartBoundaryBegin 8672752 MultipartBoundaryEnd 8672795 @@ -5182,6 +6503,8 @@ MimeEntityBegin 8672795 MimeEntityHeadersEnd 8672859 MimeContentBegin 8672859 MimeContentEnd 8673743 +Octets 884 +Lines 13 MimeEntityEnd 8673745 MultipartBoundaryBegin 8673745 MultipartBoundaryEnd 8673788 @@ -5189,6 +6512,8 @@ MimeEntityBegin 8673788 MimeEntityHeadersEnd 8673882 MimeContentBegin 8673882 MimeContentEnd 8673927 +Octets 45 +Lines 6 MimeEntityEnd 8673929 MultipartBoundaryBegin 8673929 MultipartBoundaryEnd 8673972 @@ -5196,6 +6521,8 @@ MimeEntityBegin 8673972 MimeEntityHeadersEnd 8674036 MimeContentBegin 8674036 MimeContentEnd 8674264 +Octets 228 +Lines 5 MimeEntityEnd 8674266 MultipartBoundaryBegin 8674266 MultipartBoundaryEnd 8674309 @@ -5203,6 +6530,8 @@ MimeEntityBegin 8674309 MimeEntityHeadersEnd 8674403 MimeContentBegin 8674403 MimeContentEnd 8674472 +Octets 69 +Lines 6 MimeEntityEnd 8674474 MultipartBoundaryBegin 8674474 MultipartBoundaryEnd 8674517 @@ -5210,6 +6539,8 @@ MimeEntityBegin 8674517 MimeEntityHeadersEnd 8674581 MimeContentBegin 8674581 MimeContentEnd 8674809 +Octets 228 +Lines 5 MimeEntityEnd 8674811 MultipartBoundaryBegin 8674811 MultipartBoundaryEnd 8674854 @@ -5217,6 +6548,8 @@ MimeEntityBegin 8674854 MimeEntityHeadersEnd 8674948 MimeContentBegin 8674948 MimeContentEnd 8674997 +Octets 49 +Lines 6 MimeEntityEnd 8674999 MultipartBoundaryBegin 8674999 MultipartBoundaryEnd 8675042 @@ -5224,6 +6557,8 @@ MimeEntityBegin 8675042 MimeEntityHeadersEnd 8675106 MimeContentBegin 8675106 MimeContentEnd 8675334 +Octets 228 +Lines 5 MimeEntityEnd 8675336 MultipartBoundaryBegin 8675336 MultipartBoundaryEnd 8675379 @@ -5231,6 +6566,8 @@ MimeEntityBegin 8675379 MimeEntityHeadersEnd 8675473 MimeContentBegin 8675473 MimeContentEnd 8675776 +Octets 303 +Lines 12 MimeEntityEnd 8675778 MultipartBoundaryBegin 8675778 MultipartBoundaryEnd 8675821 @@ -5238,6 +6575,8 @@ MimeEntityBegin 8675821 MimeEntityHeadersEnd 8675885 MimeContentBegin 8675885 MimeContentEnd 8676769 +Octets 884 +Lines 13 MimeEntityEnd 8676771 MultipartBoundaryBegin 8676771 MultipartBoundaryEnd 8676814 @@ -5245,6 +6584,8 @@ MimeEntityBegin 8676814 MimeEntityHeadersEnd 8676908 MimeContentBegin 8676908 MimeContentEnd 8676952 +Octets 44 +Lines 5 MimeEntityEnd 8676954 MultipartBoundaryBegin 8676954 MultipartBoundaryEnd 8676997 @@ -5252,6 +6593,8 @@ MimeEntityBegin 8676997 MimeEntityHeadersEnd 8677061 MimeContentBegin 8677061 MimeContentEnd 8679003 +Octets 1942 +Lines 28 MimeEntityEnd 8679005 MultipartBoundaryBegin 8679005 MultipartBoundaryEnd 8679048 @@ -5259,16 +6602,24 @@ MimeEntityBegin 8679048 MimeEntityHeadersEnd 8679142 MimeContentBegin 8679142 MimeContentEnd 8679153 +Octets 11 +Lines 2 MimeEntityEnd 8679155 MultipartEndBoundaryBegin 8679155 MultipartEndBoundaryEnd 8679198 MultipartEpilogueBegin 8679198 MultipartEpilogueEnd 8679200 +MimeContentEnd 8679202 +Octets 9526 +Lines 229 MimeEntityEnd 8679202 MultipartEndBoundaryBegin 8679202 MultipartEndBoundaryEnd 8679243 MultipartEpilogueBegin 8679243 MultipartEpilogueEnd 8679245 +MimeContentEnd 8679247 +Octets 11652 +Lines 280 MimeEntityEnd 8679247 MimeMessageEnd 8679247 MboxMarkerBegin 8679247 @@ -5286,6 +6637,8 @@ MimeEntityBegin 8680199 MimeEntityHeadersEnd 8680245 MimeContentBegin 8680245 MimeContentEnd 8680884 +Octets 639 +Lines 13 MimeEntityEnd 8680886 MultipartBoundaryBegin 8680886 MultipartBoundaryEnd 8680927 @@ -5300,6 +6653,8 @@ MimeEntityBegin 8681058 MimeEntityHeadersEnd 8681152 MimeContentBegin 8681152 MimeContentEnd 8681693 +Octets 541 +Lines 9 MimeEntityEnd 8681695 MultipartBoundaryBegin 8681695 MultipartBoundaryEnd 8681738 @@ -5307,6 +6662,8 @@ MimeEntityBegin 8681738 MimeEntityHeadersEnd 8681850 MimeContentBegin 8681850 MimeContentEnd 8690560 +Octets 8710 +Lines 126 MimeEntityEnd 8690562 MultipartBoundaryBegin 8690562 MultipartBoundaryEnd 8690605 @@ -5314,16 +6671,24 @@ MimeEntityBegin 8690605 MimeEntityHeadersEnd 8690699 MimeContentBegin 8690699 MimeContentEnd 8690747 +Octets 48 +Lines 4 MimeEntityEnd 8690749 MultipartEndBoundaryBegin 8690749 MultipartEndBoundaryEnd 8690792 MultipartEpilogueBegin 8690792 MultipartEpilogueEnd 8690794 +MimeContentEnd 8690796 +Octets 9781 +Lines 154 MimeEntityEnd 8690796 MultipartEndBoundaryBegin 8690796 MultipartEndBoundaryEnd 8690837 MultipartEpilogueBegin 8690837 MultipartEpilogueEnd 8690837 +MimeContentEnd 8690839 +Octets 10839 +Lines 178 MimeEntityEnd 8690839 MimeMessageEnd 8690839 MboxMarkerBegin 8690839 @@ -5341,6 +6706,8 @@ MimeEntityBegin 8691561 MimeEntityHeadersEnd 8691654 MimeContentBegin 8691654 MimeContentEnd 8691757 +Octets 103 +Lines 7 MimeEntityEnd 8691759 MultipartBoundaryBegin 8691759 MultipartBoundaryEnd 8691809 @@ -5348,11 +6715,16 @@ MimeEntityBegin 8691809 MimeEntityHeadersEnd 8691940 MimeContentBegin 8691940 MimeContentEnd 8771456 +Octets 79516 +Lines 1075 MimeEntityEnd 8771458 MultipartEndBoundaryBegin 8771458 MultipartEndBoundaryEnd 8771508 MultipartEpilogueBegin 8771508 MultipartEpilogueEnd 8771510 +MimeContentEnd 8771512 +Octets 80003 +Lines 1094 MimeEntityEnd 8771512 MimeMessageEnd 8771512 MboxMarkerBegin 8771512 @@ -5370,6 +6742,8 @@ MimeEntityBegin 8772493 MimeEntityHeadersEnd 8772539 MimeContentBegin 8772539 MimeContentEnd 8773917 +Octets 1378 +Lines 29 MimeEntityEnd 8773919 MultipartBoundaryBegin 8773919 MultipartBoundaryEnd 8773960 @@ -5384,6 +6758,8 @@ MimeEntityBegin 8774091 MimeEntityHeadersEnd 8774185 MimeContentBegin 8774185 MimeContentEnd 8775346 +Octets 1161 +Lines 23 MimeEntityEnd 8775348 MultipartBoundaryBegin 8775348 MultipartBoundaryEnd 8775391 @@ -5391,6 +6767,8 @@ MimeEntityBegin 8775391 MimeEntityHeadersEnd 8775493 MimeContentBegin 8775493 MimeContentEnd 8892315 +Octets 116822 +Lines 1580 MimeEntityEnd 8892317 MultipartBoundaryBegin 8892317 MultipartBoundaryEnd 8892360 @@ -5398,6 +6776,8 @@ MimeEntityBegin 8892360 MimeEntityHeadersEnd 8892454 MimeContentBegin 8892454 MimeContentEnd 8892580 +Octets 126 +Lines 4 MimeEntityEnd 8892582 MultipartBoundaryBegin 8892582 MultipartBoundaryEnd 8892625 @@ -5405,6 +6785,8 @@ MimeEntityBegin 8892625 MimeEntityHeadersEnd 8892728 MimeContentBegin 8892728 MimeContentEnd 8959970 +Octets 67242 +Lines 962 MimeEntityEnd 8959972 MultipartBoundaryBegin 8959972 MultipartBoundaryEnd 8960015 @@ -5412,16 +6794,24 @@ MimeEntityBegin 8960015 MimeEntityHeadersEnd 8960106 MimeContentBegin 8960106 MimeContentEnd 8960106 +Octets 0 +Lines 1 MimeEntityEnd 8960108 MultipartEndBoundaryBegin 8960108 MultipartEndBoundaryEnd 8960151 MultipartEpilogueBegin 8960151 MultipartEpilogueEnd 8960153 +MimeContentEnd 8960155 +Octets 186107 +Lines 2594 MimeEntityEnd 8960155 MultipartEndBoundaryBegin 8960155 MultipartEndBoundaryEnd 8960196 MultipartEpilogueBegin 8960196 MultipartEpilogueEnd 8960196 +MimeContentEnd 8960198 +Octets 187904 +Lines 2634 MimeEntityEnd 8960198 MimeMessageEnd 8960198 MboxMarkerBegin 8960198 @@ -5432,6 +6822,8 @@ MimeEntityBegin 8960207 MimeEntityHeadersEnd 8961063 MimeContentBegin 8961063 MimeContentEnd 8962821 +Octets 1758 +Lines 26 MimeEntityEnd 8962823 MimeMessageEnd 8962823 MboxMarkerBegin 8962823 @@ -5447,9 +6839,13 @@ MimeEntityBegin 8963476 MimeEntityHeadersEnd 8963972 MimeContentBegin 8963972 MimeContentEnd 8964871 +Octets 899 +Lines 25 MimeEntityEnd 8964873 MimeMessageEnd 8964873 MimeContentEnd 8964873 +Octets 1397 +Lines 38 MimeEntityEnd 8964873 MimeMessageEnd 8964873 MboxMarkerBegin 8964873 @@ -5467,6 +6863,8 @@ MimeEntityBegin 8965350 MimeEntityHeadersEnd 8965352 MimeContentBegin 8965352 MimeContentEnd 8965393 +Octets 41 +Lines 2 MimeEntityEnd 8965395 MultipartBoundaryBegin 8965395 MultipartBoundaryEnd 8965405 @@ -5474,11 +6872,16 @@ MimeEntityBegin 8965405 MimeEntityHeadersEnd 8965469 MimeContentBegin 8965469 MimeContentEnd 9057967 +Octets 92498 +Lines 1250 MimeEntityEnd 9057969 MultipartEndBoundaryBegin 9057969 MultipartEndBoundaryEnd 9057979 MultipartEpilogueBegin 9057979 MultipartEpilogueEnd 9057985 +MimeContentEnd 9057987 +Octets 92647 +Lines 1262 MimeEntityEnd 9057987 MimeMessageEnd 9057987 MboxMarkerBegin 9057987 @@ -5489,6 +6892,8 @@ MimeEntityBegin 9057996 MimeEntityHeadersEnd 9058498 MimeContentBegin 9058498 MimeContentEnd 9059667 +Octets 1169 +Lines 28 MimeEntityEnd 9059669 MimeMessageEnd 9059669 MboxMarkerBegin 9059669 @@ -5506,6 +6911,8 @@ MimeEntityBegin 9060849 MimeEntityHeadersEnd 9060851 MimeContentBegin 9060851 MimeContentEnd 9061403 +Octets 552 +Lines 13 MimeEntityEnd 9061405 MultipartBoundaryBegin 9061405 MultipartBoundaryEnd 9061411 @@ -5513,6 +6920,8 @@ MimeEntityBegin 9061411 MimeEntityHeadersEnd 9061531 MimeContentBegin 9061531 MimeContentEnd 9119961 +Octets 58430 +Lines 790 MimeEntityEnd 9119963 MultipartBoundaryBegin 9119963 MultipartBoundaryEnd 9119969 @@ -5520,6 +6929,8 @@ MimeEntityBegin 9119969 MimeEntityHeadersEnd 9119971 MimeContentBegin 9119971 MimeContentEnd 9123837 +Octets 3866 +Lines 84 MimeEntityEnd 9123839 MultipartBoundaryBegin 9123839 MultipartBoundaryEnd 9123845 @@ -5527,6 +6938,8 @@ MimeEntityBegin 9123845 MimeEntityHeadersEnd 9124003 MimeContentBegin 9124003 MimeContentEnd 9154647 +Octets 30644 +Lines 1010 MimeEntityEnd 9154649 MultipartBoundaryBegin 9154649 MultipartBoundaryEnd 9154655 @@ -5534,6 +6947,8 @@ MimeEntityBegin 9154655 MimeEntityHeadersEnd 9154764 MimeContentBegin 9154764 MimeContentEnd 9155504 +Octets 740 +Lines 25 MimeEntityEnd 9155506 MultipartBoundaryBegin 9155506 MultipartBoundaryEnd 9155512 @@ -5541,11 +6956,16 @@ MimeEntityBegin 9155512 MimeEntityHeadersEnd 9155632 MimeContentBegin 9155632 MimeContentEnd 9156920 +Octets 1288 +Lines 25 MimeEntityEnd 9156922 MultipartEndBoundaryBegin 9156922 MultipartEndBoundaryEnd 9156928 MultipartEpilogueBegin 9156928 MultipartEpilogueEnd 9156930 +MimeContentEnd 9156932 +Octets 96089 +Lines 1971 MimeEntityEnd 9156932 MimeMessageEnd 9156932 MboxMarkerBegin 9156932 @@ -5563,6 +6983,8 @@ MimeEntityBegin 9158154 MimeEntityHeadersEnd 9158156 MimeContentBegin 9158156 MimeContentEnd 9159077 +Octets 921 +Lines 21 MimeEntityEnd 9159079 MultipartBoundaryBegin 9159079 MultipartBoundaryEnd 9159097 @@ -5570,11 +6992,16 @@ MimeEntityBegin 9159097 MimeEntityHeadersEnd 9159179 MimeContentBegin 9159179 MimeContentEnd 9159939 +Octets 760 +Lines 13 MimeEntityEnd 9159941 MultipartEndBoundaryBegin 9159941 MultipartEndBoundaryEnd 9159959 MultipartEpilogueBegin 9159959 MultipartEpilogueEnd 9159961 +MimeContentEnd 9159963 +Octets 1827 +Lines 42 MimeEntityEnd 9159963 MimeMessageEnd 9159963 MboxMarkerBegin 9159963 @@ -5592,6 +7019,8 @@ MimeEntityBegin 9161341 MimeEntityHeadersEnd 9161422 MimeContentBegin 9161422 MimeContentEnd 9162176 +Octets 754 +Lines 14 MimeEntityEnd 9162178 MultipartBoundaryBegin 9162178 MultipartBoundaryEnd 9162186 @@ -5599,11 +7028,16 @@ MimeEntityBegin 9162186 MimeEntityHeadersEnd 9162369 MimeContentBegin 9162369 MimeContentEnd 9164615 +Octets 2246 +Lines 32 MimeEntityEnd 9164617 MultipartEndBoundaryBegin 9164617 MultipartEndBoundaryEnd 9164625 MultipartEpilogueBegin 9164625 MultipartEpilogueEnd 9164625 +MimeContentEnd 9164627 +Octets 3470 +Lines 60 MimeEntityEnd 9164627 MimeMessageEnd 9164627 MboxMarkerBegin 9164627 @@ -5621,6 +7055,8 @@ MimeEntityBegin 9166018 MimeEntityHeadersEnd 9166099 MimeContentBegin 9166099 MimeContentEnd 9168957 +Octets 2858 +Lines 47 MimeEntityEnd 9168959 MultipartBoundaryBegin 9168959 MultipartBoundaryEnd 9168981 @@ -5628,11 +7064,16 @@ MimeEntityBegin 9168981 MimeEntityHeadersEnd 9169164 MimeContentBegin 9169164 MimeContentEnd 9171746 +Octets 2582 +Lines 36 MimeEntityEnd 9171748 MultipartEndBoundaryBegin 9171748 MultipartEndBoundaryEnd 9171770 MultipartEpilogueBegin 9171770 MultipartEpilogueEnd 9171770 +MimeContentEnd 9171772 +Octets 5952 +Lines 97 MimeEntityEnd 9171772 MimeMessageEnd 9171772 MboxMarkerBegin 9171772 @@ -5643,6 +7084,8 @@ MimeEntityBegin 9171781 MimeEntityHeadersEnd 9171996 MimeContentBegin 9171996 MimeContentEnd 9176246 +Octets 4250 +Lines 58 MimeEntityEnd 9176248 MimeMessageEnd 9176248 MboxMarkerBegin 9176248 @@ -5660,6 +7103,8 @@ MimeEntityBegin 9177275 MimeEntityHeadersEnd 9177413 MimeContentBegin 9177413 MimeContentEnd 9188281 +Octets 10868 +Lines 147 MimeEntityEnd 9188283 MultipartBoundaryBegin 9188283 MultipartBoundaryEnd 9188311 @@ -5667,11 +7112,16 @@ MimeEntityBegin 9188311 MimeEntityHeadersEnd 9188466 MimeContentBegin 9188466 MimeContentEnd 9193140 +Octets 4674 +Lines 64 MimeEntityEnd 9193142 MultipartEndBoundaryBegin 9193142 MultipartEndBoundaryEnd 9193170 MultipartEpilogueBegin 9193170 MultipartEpilogueEnd 9193172 +MimeContentEnd 9193174 +Octets 15975 +Lines 225 MimeEntityEnd 9193174 MimeMessageEnd 9193174 MboxMarkerBegin 9193174 @@ -5682,6 +7132,8 @@ MimeEntityBegin 9193207 MimeEntityHeadersEnd 9194031 MimeContentBegin 9194031 MimeContentEnd 9211049 +Octets 17018 +Lines 258 MimeEntityEnd 9211051 MimeMessageEnd 9211051 MboxMarkerBegin 9211051 @@ -5692,6 +7144,8 @@ MimeEntityBegin 9211084 MimeEntityHeadersEnd 9211913 MimeContentBegin 9211913 MimeContentEnd 9237261 +Octets 25348 +Lines 385 MimeEntityEnd 9237263 MimeMessageEnd 9237263 MboxMarkerBegin 9237263 @@ -5702,6 +7156,8 @@ MimeEntityBegin 9237296 MimeEntityHeadersEnd 9238125 MimeContentBegin 9238125 MimeContentEnd 9274811 +Octets 36686 +Lines 556 MimeEntityEnd 9274813 MimeMessageEnd 9274813 MboxMarkerBegin 9274813 @@ -5712,6 +7168,8 @@ MimeEntityBegin 9274846 MimeEntityHeadersEnd 9275678 MimeContentBegin 9275678 MimeContentEnd 9327768 +Octets 52090 +Lines 790 MimeEntityEnd 9327770 MimeMessageEnd 9327770 MboxMarkerBegin 9327770 @@ -5722,6 +7180,8 @@ MimeEntityBegin 9327803 MimeEntityHeadersEnd 9329218 MimeContentBegin 9329218 MimeContentEnd 9330668 +Octets 1450 +Lines 20 MimeEntityEnd 9330670 MimeMessageEnd 9330670 MboxMarkerBegin 9330670 @@ -5739,6 +7199,8 @@ MimeEntityBegin 9332127 MimeEntityHeadersEnd 9332194 MimeContentBegin 9332194 MimeContentEnd 9332304 +Octets 110 +Lines 4 MimeEntityEnd 9332306 MultipartBoundaryBegin 9332306 MultipartBoundaryEnd 9332351 @@ -5746,11 +7208,16 @@ MimeEntityBegin 9332351 MimeEntityHeadersEnd 9332506 MimeContentBegin 9332506 MimeContentEnd 9336492 +Octets 3986 +Lines 54 MimeEntityEnd 9336494 MultipartEndBoundaryBegin 9336494 MultipartEndBoundaryEnd 9336539 MultipartEpilogueBegin 9336539 MultipartEpilogueEnd 9336541 +MimeContentEnd 9336543 +Octets 4463 +Lines 70 MimeEntityEnd 9336543 MimeMessageEnd 9336543 MboxMarkerBegin 9336543 @@ -5761,6 +7228,8 @@ MimeEntityBegin 9336576 MimeEntityHeadersEnd 9337807 MimeContentBegin 9337807 MimeContentEnd 9341357 +Octets 3550 +Lines 56 MimeEntityEnd 9341359 MimeMessageEnd 9341359 MboxMarkerBegin 9341359 @@ -5771,6 +7240,8 @@ MimeEntityBegin 9341392 MimeEntityHeadersEnd 9342490 MimeContentBegin 9342490 MimeContentEnd 9343160 +Octets 670 +Lines 10 MimeEntityEnd 9343162 MimeMessageEnd 9343162 MboxMarkerBegin 9343162 @@ -5781,6 +7252,8 @@ MimeEntityBegin 9343171 MimeEntityHeadersEnd 9343574 MimeContentBegin 9343574 MimeContentEnd 9351298 +Octets 7724 +Lines 105 MimeEntityEnd 9351300 MimeMessageEnd 9351300 MboxMarkerBegin 9351300 @@ -5796,9 +7269,13 @@ MimeEntityBegin 9352135 MimeEntityHeadersEnd 9353538 MimeContentBegin 9353538 MimeContentEnd 9354990 +Octets 1452 +Lines 21 MimeEntityEnd 9354992 MimeMessageEnd 9354992 MimeContentEnd 9354992 +Octets 2857 +Lines 44 MimeEntityEnd 9354992 MimeMessageEnd 9354992 MboxMarkerBegin 9354992 @@ -5816,6 +7293,8 @@ MimeEntityBegin 9355828 MimeEntityHeadersEnd 9355907 MimeContentBegin 9355907 MimeContentEnd 9355923 +Octets 16 +Lines 2 MimeEntityEnd 9355925 MultipartBoundaryBegin 9355925 MultipartBoundaryEnd 9355953 @@ -5828,14 +7307,21 @@ MimeEntityBegin 9356111 MimeEntityHeadersEnd 9357514 MimeContentBegin 9357514 MimeContentEnd 9358966 +Octets 1452 +Lines 21 MimeEntityEnd 9358968 MimeMessageEnd 9358968 MimeContentEnd 9358968 +Octets 2857 +Lines 44 MimeEntityEnd 9358968 MultipartEndBoundaryBegin 9358968 MultipartEndBoundaryEnd 9358996 MultipartEpilogueBegin 9358996 MultipartEpilogueEnd 9358998 +MimeContentEnd 9359000 +Octets 3248 +Lines 59 MimeEntityEnd 9359000 MimeMessageEnd 9359000 MboxMarkerBegin 9359000 @@ -5853,6 +7339,8 @@ MimeEntityBegin 9359818 MimeEntityHeadersEnd 9359897 MimeContentBegin 9359897 MimeContentEnd 9359939 +Octets 42 +Lines 2 MimeEntityEnd 9359941 MultipartBoundaryBegin 9359941 MultipartBoundaryEnd 9359983 @@ -5860,11 +7348,16 @@ MimeEntityBegin 9359983 MimeEntityHeadersEnd 9360138 MimeContentBegin 9360138 MimeContentEnd 9365770 +Octets 5632 +Lines 77 MimeEntityEnd 9365772 MultipartEndBoundaryBegin 9365772 MultipartEndBoundaryEnd 9365814 MultipartEpilogueBegin 9365814 MultipartEpilogueEnd 9365816 +MimeContentEnd 9365818 +Octets 6104 +Lines 92 MimeEntityEnd 9365818 MimeMessageEnd 9365818 MboxMarkerBegin 9365818 @@ -5875,6 +7368,8 @@ MimeEntityBegin 9365851 MimeEntityHeadersEnd 9366934 MimeContentBegin 9366934 MimeContentEnd 9377310 +Octets 10376 +Lines 141 MimeEntityEnd 9377312 MimeMessageEnd 9377312 MboxMarkerBegin 9377312 @@ -5892,6 +7387,8 @@ MimeEntityBegin 9378849 MimeEntityHeadersEnd 9378928 MimeContentBegin 9378928 MimeContentEnd 9379555 +Octets 627 +Lines 17 MimeEntityEnd 9379557 MultipartBoundaryBegin 9379557 MultipartBoundaryEnd 9379599 @@ -5899,11 +7396,16 @@ MimeEntityBegin 9379599 MimeEntityHeadersEnd 9379754 MimeContentBegin 9379754 MimeContentEnd 9381566 +Octets 1812 +Lines 25 MimeEntityEnd 9381568 MultipartEndBoundaryBegin 9381568 MultipartEndBoundaryEnd 9381610 MultipartEpilogueBegin 9381610 MultipartEpilogueEnd 9381612 +MimeContentEnd 9381614 +Octets 2869 +Lines 55 MimeEntityEnd 9381614 MimeMessageEnd 9381614 MboxMarkerBegin 9381614 @@ -5914,6 +7416,8 @@ MimeEntityBegin 9381647 MimeEntityHeadersEnd 9382210 MimeContentBegin 9382210 MimeContentEnd 9382740 +Octets 530 +Lines 8 MimeEntityEnd 9382742 MimeMessageEnd 9382742 MboxMarkerBegin 9382742 @@ -5931,11 +7435,16 @@ MimeEntityBegin 9384349 MimeEntityHeadersEnd 9384395 MimeContentBegin 9384395 MimeContentEnd 9384998 +Octets 603 +Lines 16 MimeEntityEnd 9385000 MultipartEndBoundaryBegin 9385000 MultipartEndBoundaryEnd 9385042 MultipartEpilogueBegin 9385042 MultipartEpilogueEnd 9385042 +MimeContentEnd 9385044 +Octets 957 +Lines 24 MimeEntityEnd 9385044 MimeMessageEnd 9385044 MboxMarkerBegin 9385044 @@ -5953,6 +7462,8 @@ MimeEntityBegin 9386682 MimeEntityHeadersEnd 9386728 MimeContentBegin 9386728 MimeContentEnd 9386835 +Octets 107 +Lines 7 MimeEntityEnd 9386837 MultipartBoundaryBegin 9386837 MultipartBoundaryEnd 9386879 @@ -5967,6 +7478,8 @@ MimeEntityBegin 9387306 MimeEntityHeadersEnd 9387416 MimeContentBegin 9387416 MimeContentEnd 9387511 +Octets 95 +Lines 5 MimeEntityEnd 9387513 MultipartBoundaryBegin 9387513 MultipartBoundaryEnd 9387553 @@ -5979,9 +7492,13 @@ MimeEntityBegin 9387649 MimeEntityHeadersEnd 9388845 MimeContentBegin 9388845 MimeContentEnd 9389055 +Octets 210 +Lines 6 MimeEntityEnd 9389057 MimeMessageEnd 9389057 MimeContentEnd 9389057 +Octets 1408 +Lines 35 MimeEntityEnd 9389057 MultipartBoundaryBegin 9389057 MultipartBoundaryEnd 9389097 @@ -5989,11 +7506,16 @@ MimeEntityBegin 9389097 MimeEntityHeadersEnd 9389267 MimeContentBegin 9389267 MimeContentEnd 9389757 +Octets 490 +Lines 12 MimeEntityEnd 9389759 MultipartEndBoundaryBegin 9389759 MultipartEndBoundaryEnd 9389799 MultipartEpilogueBegin 9389799 MultipartEpilogueEnd 9389799 +MimeContentEnd 9389801 +Octets 2755 +Lines 70 MimeEntityEnd 9389801 MultipartBoundaryBegin 9389801 MultipartBoundaryEnd 9389843 @@ -6001,11 +7523,16 @@ MimeEntityBegin 9389843 MimeEntityHeadersEnd 9390060 MimeContentBegin 9390060 MimeContentEnd 9395354 +Octets 5294 +Lines 72 MimeEntityEnd 9395356 MultipartEndBoundaryBegin 9395356 MultipartEndBoundaryEnd 9395398 MultipartEpilogueBegin 9395398 MultipartEpilogueEnd 9395402 +MimeContentEnd 9395404 +Octets 8984 +Lines 170 MimeEntityEnd 9395404 MimeMessageEnd 9395404 MboxMarkerBegin 9395404 @@ -6016,6 +7543,8 @@ MimeEntityBegin 9395437 MimeEntityHeadersEnd 9396672 MimeContentBegin 9396672 MimeContentEnd 9399592 +Octets 2920 +Lines 39 MimeEntityEnd 9399594 MimeMessageEnd 9399594 MboxMarkerBegin 9399594 @@ -6026,6 +7555,8 @@ MimeEntityBegin 9399627 MimeEntityHeadersEnd 9400806 MimeContentBegin 9400806 MimeContentEnd 9402958 +Octets 2152 +Lines 31 MimeEntityEnd 9402960 MimeMessageEnd 9402960 MboxMarkerBegin 9402960 @@ -6043,6 +7574,8 @@ MimeEntityBegin 9404127 MimeEntityHeadersEnd 9404194 MimeContentBegin 9404194 MimeContentEnd 9404194 +Octets 0 +Lines 1 MimeEntityEnd 9404196 MultipartBoundaryBegin 9404196 MultipartBoundaryEnd 9404229 @@ -6050,11 +7583,16 @@ MimeEntityBegin 9404229 MimeEntityHeadersEnd 9404311 MimeContentBegin 9404311 MimeContentEnd 9407065 +Octets 2754 +Lines 42 MimeEntityEnd 9407067 MultipartEndBoundaryBegin 9407067 MultipartEndBoundaryEnd 9407100 MultipartEpilogueBegin 9407100 MultipartEpilogueEnd 9407102 +MimeContentEnd 9407104 +Octets 3012 +Lines 54 MimeEntityEnd 9407104 MimeMessageEnd 9407104 MboxMarkerBegin 9407104 @@ -6072,6 +7610,8 @@ MimeEntityBegin 9408236 MimeEntityHeadersEnd 9408317 MimeContentBegin 9408317 MimeContentEnd 9408783 +Octets 466 +Lines 14 MimeEntityEnd 9408785 MultipartBoundaryBegin 9408785 MultipartBoundaryEnd 9408826 @@ -6079,6 +7619,8 @@ MimeEntityBegin 9408826 MimeEntityHeadersEnd 9408904 MimeContentBegin 9408904 MimeContentEnd 9409741 +Octets 837 +Lines 27 MimeEntityEnd 9409743 MultipartBoundaryBegin 9409743 MultipartBoundaryEnd 9409784 @@ -6086,11 +7628,16 @@ MimeEntityBegin 9409784 MimeEntityHeadersEnd 9409884 MimeContentBegin 9409884 MimeContentEnd 9411100 +Octets 1216 +Lines 17 MimeEntityEnd 9411102 MultipartEndBoundaryBegin 9411102 MultipartEndBoundaryEnd 9411143 MultipartEpilogueBegin 9411143 MultipartEpilogueEnd 9411145 +MimeContentEnd 9411147 +Octets 2954 +Lines 73 MimeEntityEnd 9411147 MimeMessageEnd 9411147 MboxMarkerBegin 9411147 @@ -6108,6 +7655,8 @@ MimeEntityBegin 9412321 MimeEntityHeadersEnd 9412394 MimeContentBegin 9412394 MimeContentEnd 9412553 +Octets 159 +Lines 8 MimeEntityEnd 9412555 MultipartBoundaryBegin 9412555 MultipartBoundaryEnd 9412598 @@ -6115,11 +7664,16 @@ MimeEntityBegin 9412598 MimeEntityHeadersEnd 9412680 MimeContentBegin 9412680 MimeContentEnd 9416832 +Octets 4152 +Lines 57 MimeEntityEnd 9416834 MultipartEndBoundaryBegin 9416834 MultipartEndBoundaryEnd 9416877 MultipartEpilogueBegin 9416877 MultipartEpilogueEnd 9416879 +MimeContentEnd 9416881 +Octets 4605 +Lines 76 MimeEntityEnd 9416881 MimeMessageEnd 9416881 MboxMarkerBegin 9416881 @@ -6137,6 +7691,8 @@ MimeEntityBegin 9417502 MimeEntityHeadersEnd 9417569 MimeContentBegin 9417569 MimeContentEnd 9417727 +Octets 158 +Lines 4 MimeEntityEnd 9417729 MultipartBoundaryBegin 9417729 MultipartBoundaryEnd 9417773 @@ -6144,11 +7700,16 @@ MimeEntityBegin 9417773 MimeEntityHeadersEnd 9417928 MimeContentBegin 9417928 MimeContentEnd 9421898 +Octets 3970 +Lines 54 MimeEntityEnd 9421900 MultipartEndBoundaryBegin 9421900 MultipartEndBoundaryEnd 9421944 MultipartEpilogueBegin 9421944 MultipartEpilogueEnd 9421944 +MimeContentEnd 9421946 +Octets 4490 +Lines 69 MimeEntityEnd 9421946 MimeMessageEnd 9421946 MboxMarkerBegin 9421946 @@ -6166,6 +7727,8 @@ MimeEntityBegin 9423344 MimeEntityHeadersEnd 9423425 MimeContentBegin 9423425 MimeContentEnd 9423502 +Octets 77 +Lines 6 MimeEntityEnd 9423504 MultipartBoundaryBegin 9423504 MultipartBoundaryEnd 9423545 @@ -6173,11 +7736,16 @@ MimeEntityBegin 9423545 MimeEntityHeadersEnd 9423643 MimeContentBegin 9423643 MimeContentEnd 9427249 +Octets 3606 +Lines 48 MimeEntityEnd 9427251 MultipartEndBoundaryBegin 9427251 MultipartEndBoundaryEnd 9427292 MultipartEpilogueBegin 9427292 MultipartEpilogueEnd 9427294 +MimeContentEnd 9427296 +Octets 4133 +Lines 67 MimeEntityEnd 9427296 MimeMessageEnd 9427296 MboxMarkerBegin 9427296 @@ -6195,6 +7763,8 @@ MimeEntityBegin 9428488 MimeEntityHeadersEnd 9428569 MimeContentBegin 9428569 MimeContentEnd 9428647 +Octets 78 +Lines 5 MimeEntityEnd 9428649 MultipartBoundaryBegin 9428649 MultipartBoundaryEnd 9428683 @@ -6202,11 +7772,16 @@ MimeEntityBegin 9428683 MimeEntityHeadersEnd 9428765 MimeContentBegin 9428765 MimeContentEnd 9432539 +Octets 3774 +Lines 58 MimeEntityEnd 9432541 MultipartEndBoundaryBegin 9432541 MultipartEndBoundaryEnd 9432575 MultipartEpilogueBegin 9432575 MultipartEpilogueEnd 9432575 +MimeContentEnd 9432577 +Octets 4125 +Lines 73 MimeEntityEnd 9432577 MimeMessageEnd 9432577 MboxMarkerBegin 9432577 @@ -6224,6 +7799,8 @@ MimeEntityBegin 9433897 MimeEntityHeadersEnd 9433938 MimeContentBegin 9433938 MimeContentEnd 9434132 +Octets 194 +Lines 7 MimeEntityEnd 9434134 MultipartBoundaryBegin 9434134 MultipartBoundaryEnd 9434159 @@ -6236,14 +7813,21 @@ MimeEntityBegin 9434191 MimeEntityHeadersEnd 9435012 MimeContentBegin 9435012 MimeContentEnd 9435023 +Octets 11 +Lines 1 MimeEntityEnd 9435025 MimeMessageEnd 9435025 MimeContentEnd 9435025 +Octets 834 +Lines 16 MimeEntityEnd 9435025 MultipartEndBoundaryBegin 9435025 MultipartEndBoundaryEnd 9435050 MultipartEpilogueBegin 9435050 MultipartEpilogueEnd 9435052 +MimeContentEnd 9435054 +Octets 1299 +Lines 35 MimeEntityEnd 9435054 MimeMessageEnd 9435054 MboxMarkerBegin 9435054 @@ -6254,6 +7838,8 @@ MimeEntityBegin 9435101 MimeEntityHeadersEnd 9435272 MimeContentBegin 9435272 MimeContentEnd 9470358 +Octets 35086 +Lines 593 MimeEntityEnd 9470360 MimeMessageEnd 9470360 MboxMarkerBegin 9470360 @@ -6264,6 +7850,8 @@ MimeEntityBegin 9470407 MimeEntityHeadersEnd 9470571 MimeContentBegin 9470571 MimeContentEnd 9505657 +Octets 35086 +Lines 593 MimeEntityEnd 9505659 MimeMessageEnd 9505659 MboxMarkerBegin 9505659 @@ -6274,6 +7862,8 @@ MimeEntityBegin 9505668 MimeEntityHeadersEnd 9506276 MimeContentBegin 9506276 MimeContentEnd 9507714 +Octets 1438 +Lines 39 MimeEntityEnd 9507716 MimeMessageEnd 9507716 MboxMarkerBegin 9507716 @@ -6291,6 +7881,8 @@ MimeEntityBegin 9508682 MimeEntityHeadersEnd 9508710 MimeContentBegin 9508710 MimeContentEnd 9509065 +Octets 355 +Lines 11 MimeEntityEnd 9509067 MultipartBoundaryBegin 9509067 MultipartBoundaryEnd 9509107 @@ -6298,11 +7890,16 @@ MimeEntityBegin 9509107 MimeEntityHeadersEnd 9509204 MimeContentBegin 9509204 MimeContentEnd 9754734 +Octets 245530 +Lines 3962 MimeEntityEnd 9754736 MultipartEndBoundaryBegin 9754736 MultipartEndBoundaryEnd 9754776 MultipartEpilogueBegin 9754776 MultipartEpilogueEnd 9754778 +MimeContentEnd 9754780 +Octets 246138 +Lines 3983 MimeEntityEnd 9754780 MimeMessageEnd 9754780 MboxMarkerBegin 9754780 @@ -6320,11 +7917,16 @@ MimeEntityBegin 9755461 MimeEntityHeadersEnd 9755625 MimeContentBegin 9755625 MimeContentEnd 9834319 +Octets 78694 +Lines 406 MimeEntityEnd 9834321 MultipartEndBoundaryBegin 9834321 MultipartEndBoundaryEnd 9834349 MultipartEpilogueBegin 9834349 MultipartEpilogueEnd 9834353 +MimeContentEnd 9834355 +Octets 78958 +Lines 417 MimeEntityEnd 9834355 MimeMessageEnd 9834355 MboxMarkerBegin 9834355 @@ -6335,6 +7937,8 @@ MimeEntityBegin 9834364 MimeEntityHeadersEnd 9834521 MimeContentBegin 9834521 MimeContentEnd 9838129 +Octets 3608 +Lines 49 MimeEntityEnd 9838131 MimeMessageEnd 9838131 MboxMarkerBegin 9838131 @@ -6352,6 +7956,8 @@ MimeEntityBegin 9839127 MimeEntityHeadersEnd 9839173 MimeContentBegin 9839173 MimeContentEnd 9839594 +Octets 421 +Lines 8 MimeEntityEnd 9839596 MultipartBoundaryBegin 9839596 MultipartBoundaryEnd 9839637 @@ -6366,6 +7972,8 @@ MimeEntityBegin 9839768 MimeEntityHeadersEnd 9839862 MimeContentBegin 9839862 MimeContentEnd 9839934 +Octets 72 +Lines 2 MimeEntityEnd 9839936 MultipartBoundaryBegin 9839936 MultipartBoundaryEnd 9839979 @@ -6373,6 +7981,8 @@ MimeEntityBegin 9839979 MimeEntityHeadersEnd 9840082 MimeContentBegin 9840082 MimeContentEnd 9850936 +Octets 10854 +Lines 158 MimeEntityEnd 9850938 MultipartBoundaryBegin 9850938 MultipartBoundaryEnd 9850981 @@ -6380,6 +7990,8 @@ MimeEntityBegin 9850981 MimeEntityHeadersEnd 9851075 MimeContentBegin 9851075 MimeContentEnd 9851141 +Octets 66 +Lines 3 MimeEntityEnd 9851143 MultipartBoundaryBegin 9851143 MultipartBoundaryEnd 9851186 @@ -6387,6 +7999,8 @@ MimeEntityBegin 9851186 MimeEntityHeadersEnd 9851283 MimeContentBegin 9851283 MimeContentEnd 9857273 +Octets 5990 +Lines 88 MimeEntityEnd 9857275 MultipartBoundaryBegin 9857275 MultipartBoundaryEnd 9857318 @@ -6394,6 +8008,8 @@ MimeEntityBegin 9857318 MimeEntityHeadersEnd 9857412 MimeContentBegin 9857412 MimeContentEnd 9857447 +Octets 35 +Lines 3 MimeEntityEnd 9857449 MultipartBoundaryBegin 9857449 MultipartBoundaryEnd 9857492 @@ -6401,6 +8017,8 @@ MimeEntityBegin 9857492 MimeEntityHeadersEnd 9857597 MimeContentBegin 9857597 MimeContentEnd 9869413 +Octets 11816 +Lines 171 MimeEntityEnd 9869415 MultipartBoundaryBegin 9869415 MultipartBoundaryEnd 9869458 @@ -6408,16 +8026,24 @@ MimeEntityBegin 9869458 MimeEntityHeadersEnd 9869552 MimeContentBegin 9869552 MimeContentEnd 9869585 +Octets 33 +Lines 3 MimeEntityEnd 9869587 MultipartEndBoundaryBegin 9869587 MultipartEndBoundaryEnd 9869630 MultipartEpilogueBegin 9869630 MultipartEpilogueEnd 9869632 +MimeContentEnd 9869634 +Octets 29909 +Lines 461 MimeEntityEnd 9869634 MultipartEndBoundaryBegin 9869634 MultipartEndBoundaryEnd 9869675 MultipartEpilogueBegin 9869675 MultipartEpilogueEnd 9869675 +MimeContentEnd 9869677 +Octets 30749 +Lines 480 MimeEntityEnd 9869677 MimeMessageEnd 9869677 MboxMarkerBegin 9869677 @@ -6428,6 +8054,8 @@ MimeEntityBegin 9869686 MimeEntityHeadersEnd 9869745 MimeContentBegin 9869745 MimeContentEnd 9870980 +Octets 1235 +Lines 28 MimeEntityEnd 9870982 MimeMessageEnd 9870982 MboxMarkerBegin 9870982 @@ -6438,6 +8066,8 @@ MimeEntityBegin 9871015 MimeEntityHeadersEnd 9871171 MimeContentBegin 9871171 MimeContentEnd 9874346 +Octets 3175 +Lines 68 MimeEntityEnd 9874348 MimeMessageEnd 9874348 MboxMarkerBegin 9874348 @@ -6455,6 +8085,8 @@ MimeEntityBegin 9876322 MimeEntityHeadersEnd 9876403 MimeContentBegin 9876403 MimeContentEnd 9877284 +Octets 881 +Lines 19 MimeEntityEnd 9877286 MultipartBoundaryBegin 9877286 MultipartBoundaryEnd 9877331 @@ -6462,11 +8094,16 @@ MimeEntityBegin 9877331 MimeEntityHeadersEnd 9877497 MimeContentBegin 9877497 MimeContentEnd 9881199 +Octets 3702 +Lines 62 MimeEntityEnd 9881201 MultipartEndBoundaryBegin 9881201 MultipartEndBoundaryEnd 9881246 MultipartEpilogueBegin 9881246 MultipartEpilogueEnd 9881248 +MimeContentEnd 9881250 +Octets 4973 +Lines 93 MimeEntityEnd 9881250 MimeMessageEnd 9881250 MboxMarkerBegin 9881250 @@ -6484,6 +8121,8 @@ MimeEntityBegin 9881845 MimeEntityHeadersEnd 9881874 MimeContentBegin 9881874 MimeContentEnd 9882856 +Octets 982 +Lines 20 MimeEntityEnd 9882858 MultipartBoundaryBegin 9882858 MultipartBoundaryEnd 9882875 @@ -6491,11 +8130,16 @@ MimeEntityBegin 9882875 MimeEntityHeadersEnd 9882938 MimeContentBegin 9882938 MimeContentEnd 10000250 +Octets 117312 +Lines 1587 MimeEntityEnd 10000252 MultipartEndBoundaryBegin 10000252 MultipartEndBoundaryEnd 10000269 MultipartEpilogueBegin 10000269 MultipartEpilogueEnd 10000273 +MimeContentEnd 10000275 +Octets 118449 +Lines 1618 MimeEntityEnd 10000275 MimeMessageEnd 10000275 MboxMarkerBegin 10000275 @@ -6513,6 +8157,8 @@ MimeEntityBegin 10001298 MimeEntityHeadersEnd 10001344 MimeContentBegin 10001344 MimeContentEnd 10010656 +Octets 9312 +Lines 350 MimeEntityEnd 10010658 MultipartBoundaryBegin 10010658 MultipartBoundaryEnd 10010699 @@ -6527,6 +8173,8 @@ MimeEntityBegin 10010830 MimeEntityHeadersEnd 10010924 MimeContentBegin 10010924 MimeContentEnd 10013768 +Octets 2844 +Lines 70 MimeEntityEnd 10013770 MultipartBoundaryBegin 10013770 MultipartBoundaryEnd 10013813 @@ -6539,9 +8187,13 @@ MimeEntityBegin 10014016 MimeEntityHeadersEnd 10014045 MimeContentBegin 10014045 MimeContentEnd 10014049 +Octets 4 +Lines 3 MimeEntityEnd 10014051 MimeMessageEnd 10014051 MimeContentEnd 10014051 +Octets 35 +Lines 5 MimeEntityEnd 10014051 MultipartBoundaryBegin 10014051 MultipartBoundaryEnd 10014094 @@ -6549,6 +8201,8 @@ MimeEntityBegin 10014094 MimeEntityHeadersEnd 10014188 MimeContentBegin 10014188 MimeContentEnd 10015184 +Octets 996 +Lines 23 MimeEntityEnd 10015186 MultipartBoundaryBegin 10015186 MultipartBoundaryEnd 10015229 @@ -6556,6 +8210,8 @@ MimeEntityBegin 10015229 MimeEntityHeadersEnd 10015349 MimeContentBegin 10015349 MimeContentEnd 10015723 +Octets 374 +Lines 16 MimeEntityEnd 10015725 MultipartBoundaryBegin 10015725 MultipartBoundaryEnd 10015768 @@ -6563,6 +8219,8 @@ MimeEntityBegin 10015768 MimeEntityHeadersEnd 10015862 MimeContentBegin 10015862 MimeContentEnd 10015874 +Octets 12 +Lines 3 MimeEntityEnd 10015876 MultipartBoundaryBegin 10015876 MultipartBoundaryEnd 10015919 @@ -6575,9 +8233,13 @@ MimeEntityBegin 10016110 MimeEntityHeadersEnd 10016139 MimeContentBegin 10016139 MimeContentEnd 10016141 +Octets 2 +Lines 2 MimeEntityEnd 10016143 MimeMessageEnd 10016143 MimeContentEnd 10016143 +Octets 33 +Lines 4 MimeEntityEnd 10016143 MultipartBoundaryBegin 10016143 MultipartBoundaryEnd 10016186 @@ -6585,6 +8247,8 @@ MimeEntityBegin 10016186 MimeEntityHeadersEnd 10016280 MimeContentBegin 10016280 MimeContentEnd 10016292 +Octets 12 +Lines 3 MimeEntityEnd 10016294 MultipartBoundaryBegin 10016294 MultipartBoundaryEnd 10016337 @@ -6592,6 +8256,8 @@ MimeEntityBegin 10016337 MimeEntityHeadersEnd 10016447 MimeContentBegin 10016447 MimeContentEnd 10019473 +Octets 3026 +Lines 44 MimeEntityEnd 10019475 MultipartBoundaryBegin 10019475 MultipartBoundaryEnd 10019518 @@ -6599,16 +8265,24 @@ MimeEntityBegin 10019518 MimeEntityHeadersEnd 10019612 MimeContentBegin 10019612 MimeContentEnd 10026464 +Octets 6852 +Lines 261 MimeEntityEnd 10026466 MultipartEndBoundaryBegin 10026466 MultipartEndBoundaryEnd 10026509 MultipartEpilogueBegin 10026509 MultipartEpilogueEnd 10026511 +MimeContentEnd 10026513 +Octets 15726 +Lines 476 MimeEntityEnd 10026513 MultipartEndBoundaryBegin 10026513 MultipartEndBoundaryEnd 10026554 MultipartEpilogueBegin 10026554 MultipartEpilogueEnd 10026556 +MimeContentEnd 10026558 +Octets 25459 +Lines 838 MimeEntityEnd 10026558 MimeMessageEnd 10026558 MboxMarkerBegin 10026558 @@ -6626,6 +8300,8 @@ MimeEntityBegin 10027713 MimeEntityHeadersEnd 10027715 MimeContentBegin 10027715 MimeContentEnd 10028056 +Octets 341 +Lines 9 MimeEntityEnd 10028058 MultipartBoundaryBegin 10028058 MultipartBoundaryEnd 10028069 @@ -6633,6 +8309,8 @@ MimeEntityBegin 10028069 MimeEntityHeadersEnd 10028131 MimeContentBegin 10028131 MimeContentEnd 10058521 +Octets 30390 +Lines 412 MimeEntityEnd 10058523 MultipartBoundaryBegin 10058523 MultipartBoundaryEnd 10058534 @@ -6640,11 +8318,16 @@ MimeEntityBegin 10058534 MimeEntityHeadersEnd 10058536 MimeContentBegin 10058536 MimeContentEnd 10058717 +Octets 181 +Lines 10 MimeEntityEnd 10058719 MultipartEndBoundaryBegin 10058719 MultipartEndBoundaryEnd 10058730 MultipartEpilogueBegin 10058730 MultipartEpilogueEnd 10058732 +MimeContentEnd 10058734 +Octets 31032 +Lines 441 MimeEntityEnd 10058734 MimeMessageEnd 10058734 MboxMarkerBegin 10058734 @@ -6655,6 +8338,8 @@ MimeEntityBegin 10058743 MimeEntityHeadersEnd 10060481 MimeContentBegin 10060481 MimeContentEnd 10246231 +Octets 185750 +Lines 2952 MimeEntityEnd 10246233 MimeMessageEnd 10246233 MboxMarkerBegin 10246233 @@ -6672,6 +8357,8 @@ MimeEntityBegin 10246993 MimeEntityHeadersEnd 10246995 MimeContentBegin 10246995 MimeContentEnd 10247016 +Octets 21 +Lines 1 MimeEntityEnd 10247018 MultipartBoundaryBegin 10247018 MultipartBoundaryEnd 10247046 @@ -6679,6 +8366,8 @@ MimeEntityBegin 10247046 MimeEntityHeadersEnd 10247203 MimeContentBegin 10247203 MimeContentEnd 10331377 +Octets 84174 +Lines 434 MimeEntityEnd 10331379 MultipartBoundaryBegin 10331379 MultipartBoundaryEnd 10331407 @@ -6686,11 +8375,16 @@ MimeEntityBegin 10331407 MimeEntityHeadersEnd 10331409 MimeContentBegin 10331409 MimeContentEnd 10331676 +Octets 267 +Lines 9 MimeEntityEnd 10331678 MultipartEndBoundaryBegin 10331678 MultipartEndBoundaryEnd 10331706 MultipartEpilogueBegin 10331706 MultipartEpilogueEnd 10331708 +MimeContentEnd 10331710 +Octets 84745 +Lines 456 MimeEntityEnd 10331710 MimeMessageEnd 10331710 MboxMarkerBegin 10331710 @@ -6708,6 +8402,8 @@ MimeEntityBegin 10332429 MimeEntityHeadersEnd 10332431 MimeContentBegin 10332431 MimeContentEnd 10332497 +Octets 66 +Lines 1 MimeEntityEnd 10332499 MultipartBoundaryBegin 10332499 MultipartBoundaryEnd 10332527 @@ -6715,6 +8411,8 @@ MimeEntityBegin 10332527 MimeEntityHeadersEnd 10332693 MimeContentBegin 10332693 MimeContentEnd 10365025 +Octets 32332 +Lines 167 MimeEntityEnd 10365027 MultipartBoundaryBegin 10365027 MultipartBoundaryEnd 10365055 @@ -6722,6 +8420,8 @@ MimeEntityBegin 10365055 MimeEntityHeadersEnd 10365057 MimeContentBegin 10365057 MimeContentEnd 10365075 +Octets 18 +Lines 2 MimeEntityEnd 10365077 MultipartBoundaryBegin 10365077 MultipartBoundaryEnd 10365105 @@ -6729,6 +8429,8 @@ MimeEntityBegin 10365105 MimeEntityHeadersEnd 10365269 MimeContentBegin 10365269 MimeContentEnd 10366359 +Octets 1090 +Lines 6 MimeEntityEnd 10366361 MultipartBoundaryBegin 10366361 MultipartBoundaryEnd 10366389 @@ -6736,6 +8438,8 @@ MimeEntityBegin 10366389 MimeEntityHeadersEnd 10366391 MimeContentBegin 10366391 MimeContentEnd 10366423 +Octets 32 +Lines 3 MimeEntityEnd 10366425 MultipartBoundaryBegin 10366425 MultipartBoundaryEnd 10366453 @@ -6743,6 +8447,8 @@ MimeEntityBegin 10366453 MimeEntityHeadersEnd 10366524 MimeContentBegin 10366524 MimeContentEnd 10554551 +Octets 188027 +Lines 1991 MimeEntityEnd 10554553 MultipartBoundaryBegin 10554553 MultipartBoundaryEnd 10554581 @@ -6750,11 +8456,16 @@ MimeEntityBegin 10554581 MimeEntityHeadersEnd 10554583 MimeContentBegin 10554583 MimeContentEnd 10554591 +Octets 8 +Lines 1 MimeEntityEnd 10554593 MultipartEndBoundaryBegin 10554593 MultipartEndBoundaryEnd 10554621 MultipartEpilogueBegin 10554621 MultipartEpilogueEnd 10554623 +MimeContentEnd 10554625 +Octets 222224 +Lines 2197 MimeEntityEnd 10554625 MimeMessageEnd 10554625 MboxMarkerBegin 10554625 @@ -6765,6 +8476,8 @@ MimeEntityBegin 10554634 MimeEntityHeadersEnd 10554906 MimeContentBegin 10554906 MimeContentEnd 10630586 +Octets 75680 +Lines 1023 MimeEntityEnd 10630588 MimeMessageEnd 10630588 MboxMarkerBegin 10630588 @@ -6782,6 +8495,8 @@ MimeEntityBegin 10632489 MimeEntityHeadersEnd 10632491 MimeContentBegin 10632491 MimeContentEnd 10634372 +Octets 1881 +Lines 35 MimeEntityEnd 10634374 MultipartBoundaryBegin 10634374 MultipartBoundaryEnd 10634433 @@ -6796,6 +8511,8 @@ MimeEntityBegin 10634600 MimeEntityHeadersEnd 10634676 MimeContentBegin 10634676 MimeContentEnd 10636704 +Octets 2028 +Lines 30 MimeEntityEnd 10636706 MultipartBoundaryBegin 10636706 MultipartBoundaryEnd 10636767 @@ -6803,6 +8520,8 @@ MimeEntityBegin 10636767 MimeEntityHeadersEnd 10636829 MimeContentBegin 10636829 MimeContentEnd 10644867 +Octets 8038 +Lines 110 MimeEntityEnd 10644869 MultipartBoundaryBegin 10644869 MultipartBoundaryEnd 10644930 @@ -6810,6 +8529,8 @@ MimeEntityBegin 10644930 MimeEntityHeadersEnd 10645003 MimeContentBegin 10645003 MimeContentEnd 10645008 +Octets 5 +Lines 3 MimeEntityEnd 10645010 MultipartBoundaryBegin 10645010 MultipartBoundaryEnd 10645071 @@ -6817,16 +8538,24 @@ MimeEntityBegin 10645071 MimeEntityHeadersEnd 10645168 MimeContentBegin 10645168 MimeContentEnd 10687620 +Octets 42452 +Lines 575 MimeEntityEnd 10687622 MultipartEndBoundaryBegin 10687622 MultipartEndBoundaryEnd 10687683 MultipartEpilogueBegin 10687683 MultipartEpilogueEnd 10687685 +MimeContentEnd 10687687 +Octets 53148 +Lines 737 MimeEntityEnd 10687687 MultipartEndBoundaryBegin 10687687 MultipartEndBoundaryEnd 10687746 MultipartEpilogueBegin 10687746 MultipartEpilogueEnd 10687748 +MimeContentEnd 10687750 +Octets 55854 +Lines 788 MimeEntityEnd 10687750 MimeMessageEnd 10687750 MboxMarkerBegin 10687750 @@ -6837,6 +8566,8 @@ MimeEntityBegin 10687759 MimeEntityHeadersEnd 10687916 MimeContentBegin 10687916 MimeContentEnd 10692786 +Octets 4870 +Lines 68 MimeEntityEnd 10692788 MimeMessageEnd 10692788 MboxMarkerBegin 10692788 @@ -6854,6 +8585,8 @@ MimeEntityBegin 10693945 MimeEntityHeadersEnd 10693947 MimeContentBegin 10693947 MimeContentEnd 10694323 +Octets 376 +Lines 9 MimeEntityEnd 10694325 MultipartBoundaryBegin 10694325 MultipartBoundaryEnd 10694366 @@ -6868,6 +8601,8 @@ MimeEntityBegin 10694497 MimeEntityHeadersEnd 10694570 MimeContentBegin 10694570 MimeContentEnd 10694663 +Octets 93 +Lines 5 MimeEntityEnd 10694665 MultipartBoundaryBegin 10694665 MultipartBoundaryEnd 10694708 @@ -6875,6 +8610,8 @@ MimeEntityBegin 10694708 MimeEntityHeadersEnd 10694826 MimeContentBegin 10694826 MimeContentEnd 10700572 +Octets 5746 +Lines 84 MimeEntityEnd 10700574 MultipartBoundaryBegin 10700574 MultipartBoundaryEnd 10700617 @@ -6882,15 +8619,23 @@ MimeEntityBegin 10700617 MimeEntityHeadersEnd 10700690 MimeContentBegin 10700690 MimeContentEnd 10700899 +Octets 209 +Lines 7 MimeEntityEnd 10700901 MultipartEndBoundaryBegin 10700901 MultipartEndBoundaryEnd 10700944 MultipartEpilogueBegin 10700944 MultipartEpilogueEnd 10700946 +MimeContentEnd 10700948 +Octets 6494 +Lines 111 MimeEntityEnd 10700948 MultipartEndBoundaryBegin 10700948 MultipartEndBoundaryEnd 10700989 MultipartEpilogueBegin 10700989 MultipartEpilogueEnd 10700991 +MimeContentEnd 10700991 +Octets 7432 +Lines 133 MimeEntityEnd 10700991 MimeMessageEnd 10700991 From 7a33e7056a0c25a2ff59bf52238e47a3c4c6ccc3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 15 Jun 2020 17:28:12 -0400 Subject: [PATCH 633/741] Updated unit offsets for the unit tests --- .../mbox/content-length.unix-offsets.txt | 233 +++ UnitTests/TestData/mbox/jwz.unix-offsets.txt | 1745 +++++++++++++++++ 2 files changed, 1978 insertions(+) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt index e4870b2060..b53c61af96 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -13,6 +13,8 @@ MimeEntityBegin 706 MimeEntityHeadersEnd 732 MimeContentBegin 732 MimeContentEnd 806 +Octets 74 +Lines 5 MimeEntityEnd 807 MultipartBoundaryBegin 807 MultipartBoundaryEnd 856 @@ -25,14 +27,21 @@ MimeEntityBegin 918 MimeEntityHeadersEnd 1700 MimeContentBegin 1700 MimeContentEnd 1837 +Octets 137 +Lines 4 MimeEntityEnd 1838 MimeMessageEnd 1838 MimeContentEnd 1838 +Octets 920 +Lines 21 MimeEntityEnd 1838 MultipartEndBoundaryBegin 1838 MultipartEndBoundaryEnd 1888 MultipartEpilogueBegin 1888 MultipartEpilogueEnd 1888 +MimeContentEnd 1889 +Octets 1232 +Lines 34 MimeEntityEnd 1889 MimeMessageEnd 1889 MboxMarkerBegin 1889 @@ -55,9 +64,13 @@ MimeEntityBegin 2582 MimeEntityHeadersEnd 3011 MimeContentBegin 3011 MimeContentEnd 3048 +Octets 37 +Lines 3 MimeEntityEnd 3049 MimeMessageEnd 3049 MimeContentEnd 3049 +Octets 467 +Lines 14 MimeEntityEnd 3049 MultipartBoundaryBegin 3049 MultipartBoundaryEnd 3076 @@ -65,6 +78,8 @@ MimeEntityBegin 3076 MimeEntityHeadersEnd 3199 MimeContentBegin 3199 MimeContentEnd 3657 +Octets 458 +Lines 7 MimeEntityEnd 3658 MultipartBoundaryBegin 3658 MultipartBoundaryEnd 3685 @@ -72,6 +87,8 @@ MimeEntityBegin 3685 MimeEntityHeadersEnd 3808 MimeContentBegin 3808 MimeContentEnd 4294 +Octets 486 +Lines 7 MimeEntityEnd 4295 MultipartBoundaryBegin 4295 MultipartBoundaryEnd 4322 @@ -79,6 +96,8 @@ MimeEntityBegin 4322 MimeEntityHeadersEnd 4449 MimeContentBegin 4449 MimeContentEnd 4976 +Octets 527 +Lines 8 MimeEntityEnd 4977 MultipartBoundaryBegin 4977 MultipartBoundaryEnd 5004 @@ -86,6 +105,8 @@ MimeEntityBegin 5004 MimeEntityHeadersEnd 5129 MimeContentBegin 5129 MimeContentEnd 5627 +Octets 498 +Lines 7 MimeEntityEnd 5628 MultipartBoundaryBegin 5628 MultipartBoundaryEnd 5655 @@ -98,9 +119,13 @@ MimeEntityBegin 5799 MimeEntityHeadersEnd 6228 MimeContentBegin 6228 MimeContentEnd 6265 +Octets 37 +Lines 2 MimeEntityEnd 6266 MimeMessageEnd 6266 MimeContentEnd 6266 +Octets 467 +Lines 13 MimeEntityEnd 6266 MultipartBoundaryBegin 6266 MultipartBoundaryEnd 6293 @@ -123,15 +148,23 @@ MimeEntityBegin 7545 MimeEntityHeadersEnd 7955 MimeContentBegin 7955 MimeContentEnd 7960 +Octets 5 +Lines 2 MimeEntityEnd 7961 MimeMessageEnd 7961 MimeContentEnd 7961 +Octets 416 +Lines 13 MimeEntityEnd 7961 MimeMessageEnd 7961 MimeContentEnd 7961 +Octets 927 +Lines 27 MimeEntityEnd 7961 MimeMessageEnd 7961 MimeContentEnd 7961 +Octets 1497 +Lines 42 MimeEntityEnd 7961 MultipartBoundaryBegin 7961 MultipartBoundaryEnd 7988 @@ -139,11 +172,16 @@ MimeEntityBegin 7988 MimeEntityHeadersEnd 8041 MimeContentBegin 8041 MimeContentEnd 8093 +Octets 52 +Lines 2 MimeEntityEnd 8094 MultipartEndBoundaryBegin 8094 MultipartEndBoundaryEnd 8122 MultipartEpilogueBegin 8122 MultipartEpilogueEnd 8122 +MimeContentEnd 8123 +Octets 5758 +Lines 145 MimeEntityEnd 8123 MimeMessageEnd 8123 MboxMarkerBegin 8123 @@ -166,9 +204,13 @@ MimeEntityBegin 8823 MimeEntityHeadersEnd 9251 MimeContentBegin 9251 MimeContentEnd 9288 +Octets 37 +Lines 3 MimeEntityEnd 9289 MimeMessageEnd 9289 MimeContentEnd 9289 +Octets 466 +Lines 14 MimeEntityEnd 9289 MultipartBoundaryBegin 9289 MultipartBoundaryEnd 9316 @@ -176,6 +218,8 @@ MimeEntityBegin 9316 MimeEntityHeadersEnd 9443 MimeContentBegin 9443 MimeContentEnd 9901 +Octets 458 +Lines 7 MimeEntityEnd 9902 MultipartBoundaryBegin 9902 MultipartBoundaryEnd 9929 @@ -183,6 +227,8 @@ MimeEntityBegin 9929 MimeEntityHeadersEnd 10056 MimeContentBegin 10056 MimeContentEnd 10542 +Octets 486 +Lines 7 MimeEntityEnd 10543 MultipartBoundaryBegin 10543 MultipartBoundaryEnd 10570 @@ -190,6 +236,8 @@ MimeEntityBegin 10570 MimeEntityHeadersEnd 10701 MimeContentBegin 10701 MimeContentEnd 11228 +Octets 527 +Lines 8 MimeEntityEnd 11229 MultipartBoundaryBegin 11229 MultipartBoundaryEnd 11256 @@ -197,6 +245,8 @@ MimeEntityBegin 11256 MimeEntityHeadersEnd 11385 MimeContentBegin 11385 MimeContentEnd 11883 +Octets 498 +Lines 7 MimeEntityEnd 11884 MultipartBoundaryBegin 11884 MultipartBoundaryEnd 11911 @@ -209,9 +259,13 @@ MimeEntityBegin 12059 MimeEntityHeadersEnd 12487 MimeContentBegin 12487 MimeContentEnd 12524 +Octets 37 +Lines 2 MimeEntityEnd 12525 MimeMessageEnd 12525 MimeContentEnd 12525 +Octets 466 +Lines 13 MimeEntityEnd 12525 MultipartBoundaryBegin 12525 MultipartBoundaryEnd 12552 @@ -234,15 +288,23 @@ MimeEntityBegin 13814 MimeEntityHeadersEnd 14223 MimeContentBegin 14223 MimeContentEnd 14228 +Octets 5 +Lines 2 MimeEntityEnd 14229 MimeMessageEnd 14229 MimeContentEnd 14229 +Octets 415 +Lines 13 MimeEntityEnd 14229 MimeMessageEnd 14229 MimeContentEnd 14229 +Octets 929 +Lines 27 MimeEntityEnd 14229 MimeMessageEnd 14229 MimeContentEnd 14229 +Octets 1502 +Lines 42 MimeEntityEnd 14229 MultipartBoundaryBegin 14229 MultipartBoundaryEnd 14256 @@ -250,11 +312,16 @@ MimeEntityBegin 14256 MimeEntityHeadersEnd 14313 MimeContentBegin 14313 MimeContentEnd 14365 +Octets 52 +Lines 2 MimeEntityEnd 14366 MultipartEndBoundaryBegin 14366 MultipartEndBoundaryEnd 14394 MultipartEpilogueBegin 14394 MultipartEpilogueEnd 14394 +MimeContentEnd 14395 +Octets 5793 +Lines 145 MimeEntityEnd 14395 MimeMessageEnd 14395 MboxMarkerBegin 14395 @@ -272,6 +339,8 @@ MimeEntityBegin 15975 MimeEntityHeadersEnd 16066 MimeContentBegin 16066 MimeContentEnd 21265 +Octets 5199 +Lines 112 MimeEntityEnd 21266 MultipartBoundaryBegin 21266 MultipartBoundaryEnd 21310 @@ -279,11 +348,16 @@ MimeEntityBegin 21310 MimeEntityHeadersEnd 21509 MimeContentBegin 21509 MimeContentEnd 22438 +Octets 929 +Lines 14 MimeEntityEnd 22439 MultipartEndBoundaryBegin 22439 MultipartEndBoundaryEnd 22484 MultipartEpilogueBegin 22484 MultipartEpilogueEnd 22485 +MimeContentEnd 22486 +Octets 6556 +Lines 140 MimeEntityEnd 22486 MimeMessageEnd 22486 MboxMarkerBegin 22486 @@ -301,6 +375,8 @@ MimeEntityBegin 23836 MimeEntityHeadersEnd 23912 MimeContentBegin 23912 MimeContentEnd 23939 +Octets 27 +Lines 4 MimeEntityEnd 23940 MultipartBoundaryBegin 23940 MultipartBoundaryEnd 23978 @@ -320,6 +396,8 @@ MimeEntityBegin 24929 MimeEntityHeadersEnd 25005 MimeContentBegin 25005 MimeContentEnd 25632 +Octets 627 +Lines 17 MimeEntityEnd 25633 MultipartBoundaryBegin 25633 MultipartBoundaryEnd 25672 @@ -334,6 +412,8 @@ MimeEntityBegin 25794 MimeEntityHeadersEnd 25869 MimeContentBegin 25869 MimeContentEnd 26719 +Octets 850 +Lines 19 MimeEntityEnd 26720 MultipartBoundaryBegin 26720 MultipartBoundaryEnd 26759 @@ -341,24 +421,37 @@ MimeEntityBegin 26759 MimeEntityHeadersEnd 26943 MimeContentBegin 26943 MimeContentEnd 770910 +Octets 743967 +Lines 10192 MimeEntityEnd 770911 MultipartEndBoundaryBegin 770911 MultipartEndBoundaryEnd 770951 MultipartEpilogueBegin 770951 MultipartEpilogueEnd 770952 +MimeContentEnd 770953 +Octets 745199 +Lines 10224 MimeEntityEnd 770953 MultipartEndBoundaryBegin 770953 MultipartEndBoundaryEnd 770993 MultipartEpilogueBegin 770993 MultipartEpilogueEnd 770996 +MimeContentEnd 770997 +Octets 746108 +Lines 10253 MimeEntityEnd 770997 MimeMessageEnd 770997 MimeContentEnd 770997 +Octets 746929 +Lines 10269 MimeEntityEnd 770997 MultipartEndBoundaryBegin 770997 MultipartEndBoundaryEnd 771036 MultipartEpilogueBegin 771036 MultipartEpilogueEnd 771037 +MimeContentEnd 771038 +Octets 747286 +Lines 10286 MimeEntityEnd 771038 MimeMessageEnd 771038 MboxMarkerBegin 771038 @@ -376,6 +469,8 @@ MimeEntityBegin 772379 MimeEntityHeadersEnd 772470 MimeContentBegin 772470 MimeContentEnd 774852 +Octets 2382 +Lines 51 MimeEntityEnd 774853 MultipartBoundaryBegin 774853 MultipartBoundaryEnd 774897 @@ -383,6 +478,8 @@ MimeEntityBegin 774897 MimeEntityHeadersEnd 775056 MimeContentBegin 775056 MimeContentEnd 781079 +Octets 6023 +Lines 80 MimeEntityEnd 781080 MultipartBoundaryBegin 781080 MultipartBoundaryEnd 781124 @@ -390,6 +487,8 @@ MimeEntityBegin 781124 MimeEntityHeadersEnd 781282 MimeContentBegin 781282 MimeContentEnd 793355 +Octets 12073 +Lines 158 MimeEntityEnd 793356 MultipartBoundaryBegin 793356 MultipartBoundaryEnd 793400 @@ -397,6 +496,8 @@ MimeEntityBegin 793400 MimeEntityHeadersEnd 793560 MimeContentBegin 793560 MimeContentEnd 815274 +Octets 21714 +Lines 283 MimeEntityEnd 815275 MultipartBoundaryBegin 815275 MultipartBoundaryEnd 815319 @@ -404,11 +505,16 @@ MimeEntityBegin 815319 MimeEntityHeadersEnd 815522 MimeContentBegin 815522 MimeContentEnd 818915 +Octets 3393 +Lines 46 MimeEntityEnd 818916 MultipartEndBoundaryBegin 818916 MultipartEndBoundaryEnd 818961 MultipartEpilogueBegin 818961 MultipartEpilogueEnd 818962 +MimeContentEnd 818963 +Octets 46629 +Lines 650 MimeEntityEnd 818963 MimeMessageEnd 818963 MboxMarkerBegin 818963 @@ -426,11 +532,16 @@ MimeEntityBegin 819891 MimeEntityHeadersEnd 819920 MimeContentBegin 819920 MimeContentEnd 822450 +Octets 2530 +Lines 97 MimeEntityEnd 822451 MultipartEndBoundaryBegin 822451 MultipartEndBoundaryEnd 822460 MultipartEpilogueBegin 822460 MultipartEpilogueEnd 822461 +MimeContentEnd 822462 +Octets 2580 +Lines 103 MimeEntityEnd 822462 MimeMessageEnd 822462 MboxMarkerBegin 822462 @@ -448,6 +559,8 @@ MimeEntityBegin 823664 MimeEntityHeadersEnd 823665 MimeContentBegin 823665 MimeContentEnd 824566 +Octets 901 +Lines 21 MimeEntityEnd 824567 MultipartBoundaryBegin 824567 MultipartBoundaryEnd 824584 @@ -455,11 +568,16 @@ MimeEntityBegin 824584 MimeEntityHeadersEnd 824663 MimeContentBegin 824663 MimeContentEnd 825411 +Octets 748 +Lines 13 MimeEntityEnd 825412 MultipartEndBoundaryBegin 825412 MultipartEndBoundaryEnd 825430 MultipartEpilogueBegin 825430 MultipartEpilogueEnd 825431 +MimeContentEnd 825432 +Octets 1785 +Lines 42 MimeEntityEnd 825432 MimeMessageEnd 825432 MboxMarkerBegin 825432 @@ -477,6 +595,8 @@ MimeEntityBegin 826786 MimeEntityHeadersEnd 826864 MimeContentBegin 826864 MimeContentEnd 827605 +Octets 741 +Lines 14 MimeEntityEnd 827606 MultipartBoundaryBegin 827606 MultipartBoundaryEnd 827613 @@ -484,11 +604,16 @@ MimeEntityBegin 827613 MimeEntityHeadersEnd 827791 MimeContentBegin 827791 MimeContentEnd 830006 +Octets 2215 +Lines 32 MimeEntityEnd 830007 MultipartEndBoundaryBegin 830007 MultipartEndBoundaryEnd 830015 MultipartEpilogueBegin 830015 MultipartEpilogueEnd 830015 +MimeContentEnd 830016 +Octets 3410 +Lines 60 MimeEntityEnd 830016 MimeMessageEnd 830016 MboxMarkerBegin 830016 @@ -506,6 +631,8 @@ MimeEntityBegin 831379 MimeEntityHeadersEnd 831457 MimeContentBegin 831457 MimeContentEnd 834269 +Octets 2812 +Lines 47 MimeEntityEnd 834270 MultipartBoundaryBegin 834270 MultipartBoundaryEnd 834291 @@ -513,11 +640,16 @@ MimeEntityBegin 834291 MimeEntityHeadersEnd 834469 MimeContentBegin 834469 MimeContentEnd 837016 +Octets 2547 +Lines 36 MimeEntityEnd 837017 MultipartEndBoundaryBegin 837017 MultipartEndBoundaryEnd 837039 MultipartEpilogueBegin 837039 MultipartEpilogueEnd 837039 +MimeContentEnd 837040 +Octets 5855 +Lines 97 MimeEntityEnd 837040 MimeMessageEnd 837040 MboxMarkerBegin 837040 @@ -535,6 +667,8 @@ MimeEntityBegin 838045 MimeEntityHeadersEnd 838179 MimeContentBegin 838179 MimeContentEnd 848901 +Octets 10722 +Lines 147 MimeEntityEnd 848902 MultipartBoundaryBegin 848902 MultipartBoundaryEnd 848929 @@ -542,11 +676,16 @@ MimeEntityBegin 848929 MimeEntityHeadersEnd 849080 MimeContentBegin 849080 MimeContentEnd 853691 +Octets 4611 +Lines 64 MimeEntityEnd 853692 MultipartEndBoundaryBegin 853692 MultipartEndBoundaryEnd 853720 MultipartEpilogueBegin 853720 MultipartEpilogueEnd 853721 +MimeContentEnd 853722 +Octets 15750 +Lines 225 MimeEntityEnd 853722 MimeMessageEnd 853722 MboxMarkerBegin 853722 @@ -557,6 +696,8 @@ MimeEntityBegin 853754 MimeEntityHeadersEnd 855145 MimeContentBegin 855145 MimeContentEnd 856576 +Octets 1431 +Lines 20 MimeEntityEnd 856577 MimeMessageEnd 856577 MboxMarkerBegin 856577 @@ -574,6 +715,8 @@ MimeEntityBegin 858007 MimeEntityHeadersEnd 858071 MimeContentBegin 858071 MimeContentEnd 858178 +Octets 107 +Lines 4 MimeEntityEnd 858179 MultipartBoundaryBegin 858179 MultipartBoundaryEnd 858223 @@ -581,11 +724,16 @@ MimeEntityBegin 858223 MimeEntityHeadersEnd 858374 MimeContentBegin 858374 MimeContentEnd 862307 +Octets 3933 +Lines 54 MimeEntityEnd 862308 MultipartEndBoundaryBegin 862308 MultipartEndBoundaryEnd 862353 MultipartEpilogueBegin 862353 MultipartEpilogueEnd 862354 +MimeContentEnd 862355 +Octets 4393 +Lines 70 MimeEntityEnd 862355 MimeMessageEnd 862355 MboxMarkerBegin 862355 @@ -596,6 +744,8 @@ MimeEntityBegin 862387 MimeEntityHeadersEnd 863597 MimeContentBegin 863597 MimeContentEnd 867092 +Octets 3495 +Lines 56 MimeEntityEnd 867093 MimeMessageEnd 867093 MboxMarkerBegin 867093 @@ -606,6 +756,8 @@ MimeEntityBegin 867125 MimeEntityHeadersEnd 868202 MimeContentBegin 868202 MimeContentEnd 868863 +Octets 661 +Lines 10 MimeEntityEnd 868864 MimeMessageEnd 868864 MboxMarkerBegin 868864 @@ -621,9 +773,13 @@ MimeEntityBegin 869679 MimeEntityHeadersEnd 871059 MimeContentBegin 871059 MimeContentEnd 872491 +Octets 1432 +Lines 21 MimeEntityEnd 872492 MimeMessageEnd 872492 MimeContentEnd 872492 +Octets 2813 +Lines 44 MimeEntityEnd 872492 MimeMessageEnd 872492 MboxMarkerBegin 872492 @@ -641,6 +797,8 @@ MimeEntityBegin 873307 MimeEntityHeadersEnd 873383 MimeContentBegin 873383 MimeContentEnd 873398 +Octets 15 +Lines 2 MimeEntityEnd 873399 MultipartBoundaryBegin 873399 MultipartBoundaryEnd 873426 @@ -653,14 +811,21 @@ MimeEntityBegin 873580 MimeEntityHeadersEnd 874960 MimeContentBegin 874960 MimeContentEnd 876392 +Octets 1432 +Lines 21 MimeEntityEnd 876393 MimeMessageEnd 876393 MimeContentEnd 876393 +Octets 2813 +Lines 44 MimeEntityEnd 876393 MultipartEndBoundaryBegin 876393 MultipartEndBoundaryEnd 876421 MultipartEpilogueBegin 876421 MultipartEpilogueEnd 876422 +MimeContentEnd 876423 +Octets 3189 +Lines 59 MimeEntityEnd 876423 MimeMessageEnd 876423 MboxMarkerBegin 876423 @@ -678,6 +843,8 @@ MimeEntityBegin 877221 MimeEntityHeadersEnd 877297 MimeContentBegin 877297 MimeContentEnd 877338 +Octets 41 +Lines 2 MimeEntityEnd 877339 MultipartBoundaryBegin 877339 MultipartBoundaryEnd 877380 @@ -685,11 +852,16 @@ MimeEntityBegin 877380 MimeEntityHeadersEnd 877531 MimeContentBegin 877531 MimeContentEnd 883087 +Octets 5556 +Lines 77 MimeEntityEnd 883088 MultipartEndBoundaryBegin 883088 MultipartEndBoundaryEnd 883130 MultipartEpilogueBegin 883130 MultipartEpilogueEnd 883131 +MimeContentEnd 883132 +Octets 6012 +Lines 92 MimeEntityEnd 883132 MimeMessageEnd 883132 MboxMarkerBegin 883132 @@ -700,6 +872,8 @@ MimeEntityBegin 883164 MimeEntityHeadersEnd 884226 MimeContentBegin 884226 MimeContentEnd 894462 +Octets 10236 +Lines 141 MimeEntityEnd 894463 MimeMessageEnd 894463 MboxMarkerBegin 894463 @@ -717,6 +891,8 @@ MimeEntityBegin 895972 MimeEntityHeadersEnd 896048 MimeContentBegin 896048 MimeContentEnd 896659 +Octets 611 +Lines 17 MimeEntityEnd 896660 MultipartBoundaryBegin 896660 MultipartBoundaryEnd 896701 @@ -724,11 +900,16 @@ MimeEntityBegin 896701 MimeEntityHeadersEnd 896852 MimeContentBegin 896852 MimeContentEnd 898640 +Octets 1788 +Lines 25 MimeEntityEnd 898641 MultipartEndBoundaryBegin 898641 MultipartEndBoundaryEnd 898683 MultipartEpilogueBegin 898683 MultipartEpilogueEnd 898684 +MimeContentEnd 898685 +Octets 2814 +Lines 55 MimeEntityEnd 898685 MimeMessageEnd 898685 MboxMarkerBegin 898685 @@ -739,6 +920,8 @@ MimeEntityBegin 898717 MimeEntityHeadersEnd 899265 MimeContentBegin 899265 MimeContentEnd 899788 +Octets 523 +Lines 8 MimeEntityEnd 899789 MimeMessageEnd 899789 MboxMarkerBegin 899789 @@ -749,6 +932,8 @@ MimeEntityBegin 899821 MimeEntityHeadersEnd 901036 MimeContentBegin 901036 MimeContentEnd 903918 +Octets 2882 +Lines 39 MimeEntityEnd 903919 MimeMessageEnd 903919 MboxMarkerBegin 903919 @@ -759,6 +944,8 @@ MimeEntityBegin 903951 MimeEntityHeadersEnd 905109 MimeContentBegin 905109 MimeContentEnd 907231 +Octets 2122 +Lines 31 MimeEntityEnd 907232 MimeMessageEnd 907232 MboxMarkerBegin 907232 @@ -776,6 +963,8 @@ MimeEntityBegin 908375 MimeEntityHeadersEnd 908439 MimeContentBegin 908439 MimeContentEnd 908439 +Octets 0 +Lines 1 MimeEntityEnd 908440 MultipartBoundaryBegin 908440 MultipartBoundaryEnd 908472 @@ -783,11 +972,16 @@ MimeEntityBegin 908472 MimeEntityHeadersEnd 908551 MimeContentBegin 908551 MimeContentEnd 911264 +Octets 2713 +Lines 42 MimeEntityEnd 911265 MultipartEndBoundaryBegin 911265 MultipartEndBoundaryEnd 911298 MultipartEpilogueBegin 911298 MultipartEpilogueEnd 911299 +MimeContentEnd 911300 +Octets 2958 +Lines 54 MimeEntityEnd 911300 MimeMessageEnd 911300 MboxMarkerBegin 911300 @@ -805,6 +999,8 @@ MimeEntityBegin 912410 MimeEntityHeadersEnd 912488 MimeContentBegin 912488 MimeContentEnd 912941 +Octets 453 +Lines 14 MimeEntityEnd 912942 MultipartBoundaryBegin 912942 MultipartBoundaryEnd 912982 @@ -812,6 +1008,8 @@ MimeEntityBegin 912982 MimeEntityHeadersEnd 913057 MimeContentBegin 913057 MimeContentEnd 913868 +Octets 811 +Lines 27 MimeEntityEnd 913869 MultipartBoundaryBegin 913869 MultipartBoundaryEnd 913909 @@ -819,11 +1017,16 @@ MimeEntityBegin 913909 MimeEntityHeadersEnd 914006 MimeContentBegin 914006 MimeContentEnd 915206 +Octets 1200 +Lines 17 MimeEntityEnd 915207 MultipartEndBoundaryBegin 915207 MultipartEndBoundaryEnd 915248 MultipartEpilogueBegin 915248 MultipartEpilogueEnd 915249 +MimeContentEnd 915250 +Octets 2881 +Lines 73 MimeEntityEnd 915250 MimeMessageEnd 915250 MboxMarkerBegin 915250 @@ -841,6 +1044,8 @@ MimeEntityBegin 916400 MimeEntityHeadersEnd 916470 MimeContentBegin 916470 MimeContentEnd 916622 +Octets 152 +Lines 8 MimeEntityEnd 916623 MultipartBoundaryBegin 916623 MultipartBoundaryEnd 916665 @@ -848,11 +1053,16 @@ MimeEntityBegin 916665 MimeEntityHeadersEnd 916744 MimeContentBegin 916744 MimeContentEnd 920840 +Octets 4096 +Lines 57 MimeEntityEnd 920841 MultipartEndBoundaryBegin 920841 MultipartEndBoundaryEnd 920884 MultipartEpilogueBegin 920884 MultipartEpilogueEnd 920885 +MimeContentEnd 920886 +Octets 4529 +Lines 76 MimeEntityEnd 920886 MimeMessageEnd 920886 MboxMarkerBegin 920886 @@ -870,6 +1080,8 @@ MimeEntityBegin 922054 MimeEntityHeadersEnd 922132 MimeContentBegin 922132 MimeContentEnd 922206 +Octets 74 +Lines 5 MimeEntityEnd 922207 MultipartBoundaryBegin 922207 MultipartBoundaryEnd 922240 @@ -877,11 +1089,16 @@ MimeEntityBegin 922240 MimeEntityHeadersEnd 922319 MimeContentBegin 922319 MimeContentEnd 926036 +Octets 3717 +Lines 58 MimeEntityEnd 926037 MultipartEndBoundaryBegin 926037 MultipartEndBoundaryEnd 926071 MultipartEpilogueBegin 926071 MultipartEpilogueEnd 926071 +MimeContentEnd 926072 +Octets 4052 +Lines 73 MimeEntityEnd 926072 MimeMessageEnd 926072 MboxMarkerBegin 926072 @@ -899,6 +1116,8 @@ MimeEntityBegin 927369 MimeEntityHeadersEnd 927408 MimeContentBegin 927408 MimeContentEnd 927596 +Octets 188 +Lines 7 MimeEntityEnd 927597 MultipartBoundaryBegin 927597 MultipartBoundaryEnd 927621 @@ -911,14 +1130,21 @@ MimeEntityBegin 927651 MimeEntityHeadersEnd 928457 MimeContentBegin 928457 MimeContentEnd 928468 +Octets 11 +Lines 1 MimeEntityEnd 928469 MimeMessageEnd 928469 MimeContentEnd 928469 +Octets 818 +Lines 16 MimeEntityEnd 928469 MultipartEndBoundaryBegin 928469 MultipartEndBoundaryEnd 928494 MultipartEpilogueBegin 928494 MultipartEpilogueEnd 928495 +MimeContentEnd 928496 +Octets 1264 +Lines 35 MimeEntityEnd 928496 MimeMessageEnd 928496 MboxMarkerBegin 928496 @@ -936,6 +1162,8 @@ MimeEntityBegin 930437 MimeEntityHeadersEnd 930515 MimeContentBegin 930515 MimeContentEnd 931378 +Octets 863 +Lines 19 MimeEntityEnd 931379 MultipartBoundaryBegin 931379 MultipartBoundaryEnd 931423 @@ -943,10 +1171,15 @@ MimeEntityBegin 931423 MimeEntityHeadersEnd 931584 MimeContentBegin 931584 MimeContentEnd 935225 +Octets 3641 +Lines 62 MimeEntityEnd 935226 MultipartEndBoundaryBegin 935226 MultipartEndBoundaryEnd 935271 MultipartEpilogueBegin 935271 MultipartEpilogueEnd 935272 +MimeContentEnd 935272 +Octets 4879 +Lines 92 MimeEntityEnd 935272 MimeMessageEnd 935272 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt index efb2203fa6..5ff75016d9 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -20,6 +20,8 @@ MimeEntityBegin 661 MimeEntityHeadersEnd 662 MimeContentBegin 662 MimeContentEnd 1377 +Octets 715 +Lines 17 MimeEntityEnd 1378 MultipartBoundaryBegin 1378 MultipartBoundaryEnd 1409 @@ -27,11 +29,16 @@ MimeEntityBegin 1409 MimeEntityHeadersEnd 1493 MimeContentBegin 1493 MimeContentEnd 32539 +Octets 31046 +Lines 427 MimeEntityEnd 32540 MultipartEndBoundaryBegin 32540 MultipartEndBoundaryEnd 32572 MultipartEpilogueBegin 32572 MultipartEpilogueEnd 32572 +MimeContentEnd 32573 +Octets 31943 +Lines 452 MimeEntityEnd 32573 MultipartBoundaryBegin 32573 MultipartBoundaryEnd 32590 @@ -46,6 +53,8 @@ MimeEntityBegin 32714 MimeEntityHeadersEnd 32796 MimeContentBegin 32796 MimeContentEnd 58444 +Octets 25648 +Lines 353 MimeEntityEnd 58445 MultipartBoundaryBegin 58445 MultipartBoundaryEnd 58476 @@ -53,6 +62,8 @@ MimeEntityBegin 58476 MimeEntityHeadersEnd 58558 MimeContentBegin 58558 MimeContentEnd 76971 +Octets 18413 +Lines 254 MimeEntityEnd 76972 MultipartBoundaryBegin 76972 MultipartBoundaryEnd 77003 @@ -60,6 +71,8 @@ MimeEntityBegin 77003 MimeEntityHeadersEnd 77117 MimeContentBegin 77117 MimeContentEnd 120806 +Octets 43689 +Lines 2437 MimeEntityEnd 120807 MultipartBoundaryBegin 120807 MultipartBoundaryEnd 120838 @@ -67,11 +80,16 @@ MimeEntityBegin 120838 MimeEntityHeadersEnd 120899 MimeContentBegin 120899 MimeContentEnd 129745 +Octets 8846 +Lines 358 MimeEntityEnd 129746 MultipartEndBoundaryBegin 129746 MultipartEndBoundaryEnd 129778 MultipartEpilogueBegin 129778 MultipartEpilogueEnd 129778 +MimeContentEnd 129779 +Octets 97096 +Lines 3421 MimeEntityEnd 129779 MultipartBoundaryBegin 129779 MultipartBoundaryEnd 129796 @@ -79,11 +97,16 @@ MimeEntityBegin 129796 MimeEntityHeadersEnd 129880 MimeContentBegin 129880 MimeContentEnd 177055 +Octets 47175 +Lines 648 MimeEntityEnd 177056 MultipartEndBoundaryBegin 177056 MultipartEndBoundaryEnd 177074 MultipartEpilogueBegin 177074 MultipartEpilogueEnd 177075 +MimeContentEnd 177076 +Octets 176559 +Lines 4536 MimeEntityEnd 177076 MimeMessageEnd 177076 MboxMarkerBegin 177076 @@ -94,6 +117,8 @@ MimeEntityBegin 177084 MimeEntityHeadersEnd 177633 MimeContentBegin 177633 MimeContentEnd 312903 +Octets 135270 +Lines 1855 MimeEntityEnd 312904 MimeMessageEnd 312904 MboxMarkerBegin 312904 @@ -104,6 +129,8 @@ MimeEntityBegin 312912 MimeEntityHeadersEnd 313291 MimeContentBegin 313291 MimeContentEnd 313492 +Octets 201 +Lines 4 MimeEntityEnd 313493 MimeMessageEnd 313493 MboxMarkerBegin 313493 @@ -121,6 +148,8 @@ MimeEntityBegin 314342 MimeEntityHeadersEnd 314386 MimeContentBegin 314386 MimeContentEnd 314619 +Octets 233 +Lines 7 MimeEntityEnd 314620 MultipartBoundaryBegin 314620 MultipartBoundaryEnd 314660 @@ -135,6 +164,8 @@ MimeEntityBegin 314787 MimeEntityHeadersEnd 314878 MimeContentBegin 314878 MimeContentEnd 315024 +Octets 146 +Lines 4 MimeEntityEnd 315025 MultipartBoundaryBegin 315025 MultipartBoundaryEnd 315067 @@ -142,6 +173,8 @@ MimeEntityBegin 315067 MimeEntityHeadersEnd 315177 MimeContentBegin 315177 MimeContentEnd 319545 +Octets 4368 +Lines 65 MimeEntityEnd 319546 MultipartBoundaryBegin 319546 MultipartBoundaryEnd 319588 @@ -149,16 +182,24 @@ MimeEntityBegin 319588 MimeEntityHeadersEnd 319679 MimeContentBegin 319679 MimeContentEnd 319724 +Octets 45 +Lines 4 MimeEntityEnd 319725 MultipartEndBoundaryBegin 319725 MultipartEndBoundaryEnd 319768 MultipartEpilogueBegin 319768 MultipartEpilogueEnd 319769 +MimeContentEnd 319770 +Octets 5025 +Lines 88 MimeEntityEnd 319770 MultipartEndBoundaryBegin 319770 MultipartEndBoundaryEnd 319811 MultipartEpilogueBegin 319811 MultipartEpilogueEnd 319811 +MimeContentEnd 319812 +Octets 5665 +Lines 106 MimeEntityEnd 319812 MimeMessageEnd 319812 MboxMarkerBegin 319812 @@ -176,6 +217,8 @@ MimeEntityBegin 320825 MimeEntityHeadersEnd 320898 MimeContentBegin 320898 MimeContentEnd 321322 +Octets 424 +Lines 13 MimeEntityEnd 321323 MultipartBoundaryBegin 321323 MultipartBoundaryEnd 321385 @@ -195,6 +238,8 @@ MimeEntityBegin 322557 MimeEntityHeadersEnd 322651 MimeContentBegin 322651 MimeContentEnd 322755 +Octets 104 +Lines 7 MimeEntityEnd 322756 MultipartBoundaryBegin 322756 MultipartBoundaryEnd 322786 @@ -202,6 +247,8 @@ MimeEntityBegin 322786 MimeEntityHeadersEnd 322875 MimeContentBegin 322875 MimeContentEnd 343502 +Octets 20627 +Lines 284 MimeEntityEnd 343503 MultipartBoundaryBegin 343503 MultipartBoundaryEnd 343533 @@ -209,10 +256,17 @@ MimeEntityBegin 343533 MimeEntityHeadersEnd 343534 MimeContentBegin 343534 MimeContentEnd 343534 +Octets 0 +Lines 0 MimeEntityEnd 343534 +MimeContentEnd 343534 +Octets 21283 +Lines 309 MimeEntityEnd 343534 MimeMessageEnd 343534 MimeContentEnd 343534 +Octets 22119 +Lines 325 MimeEntityEnd 343534 MultipartBoundaryBegin 343534 MultipartBoundaryEnd 343596 @@ -220,11 +274,16 @@ MimeEntityBegin 343596 MimeEntityHeadersEnd 343669 MimeContentBegin 343669 MimeContentEnd 343776 +Octets 107 +Lines 5 MimeEntityEnd 343777 MultipartEndBoundaryBegin 343777 MultipartEndBoundaryEnd 343840 MultipartEpilogueBegin 343840 MultipartEpilogueEnd 343841 +MimeContentEnd 343842 +Octets 23274 +Lines 360 MimeEntityEnd 343842 MimeMessageEnd 343842 MboxMarkerBegin 343842 @@ -242,6 +301,8 @@ MimeEntityBegin 344763 MimeEntityHeadersEnd 344807 MimeContentBegin 344807 MimeContentEnd 345567 +Octets 760 +Lines 19 MimeEntityEnd 345568 MultipartBoundaryBegin 345568 MultipartBoundaryEnd 345608 @@ -256,6 +317,8 @@ MimeEntityBegin 345735 MimeEntityHeadersEnd 345826 MimeContentBegin 345826 MimeContentEnd 346051 +Octets 225 +Lines 5 MimeEntityEnd 346052 MultipartBoundaryBegin 346052 MultipartBoundaryEnd 346094 @@ -263,6 +326,8 @@ MimeEntityBegin 346094 MimeEntityHeadersEnd 346202 MimeContentBegin 346202 MimeContentEnd 1021266 +Octets 675064 +Lines 8983 MimeEntityEnd 1021267 MultipartBoundaryBegin 1021267 MultipartBoundaryEnd 1021309 @@ -270,6 +335,8 @@ MimeEntityBegin 1021309 MimeEntityHeadersEnd 1021400 MimeContentBegin 1021400 MimeContentEnd 1021516 +Octets 116 +Lines 6 MimeEntityEnd 1021517 MultipartBoundaryBegin 1021517 MultipartBoundaryEnd 1021559 @@ -277,6 +344,8 @@ MimeEntityBegin 1021559 MimeEntityHeadersEnd 1021685 MimeContentBegin 1021685 MimeContentEnd 1702821 +Octets 681136 +Lines 9061 MimeEntityEnd 1702822 MultipartBoundaryBegin 1702822 MultipartBoundaryEnd 1702864 @@ -284,6 +353,8 @@ MimeEntityBegin 1702864 MimeEntityHeadersEnd 1702955 MimeContentBegin 1702955 MimeContentEnd 1702965 +Octets 10 +Lines 3 MimeEntityEnd 1702966 MultipartBoundaryBegin 1702966 MultipartBoundaryEnd 1703008 @@ -291,6 +362,8 @@ MimeEntityBegin 1703008 MimeEntityHeadersEnd 1703125 MimeContentBegin 1703125 MimeContentEnd 1771303 +Octets 68178 +Lines 935 MimeEntityEnd 1771304 MultipartBoundaryBegin 1771304 MultipartBoundaryEnd 1771346 @@ -298,6 +371,8 @@ MimeEntityBegin 1771346 MimeEntityHeadersEnd 1771437 MimeContentBegin 1771437 MimeContentEnd 1771575 +Octets 138 +Lines 6 MimeEntityEnd 1771576 MultipartBoundaryBegin 1771576 MultipartBoundaryEnd 1771618 @@ -305,6 +380,8 @@ MimeEntityBegin 1771618 MimeEntityHeadersEnd 1771736 MimeContentBegin 1771736 MimeContentEnd 2108498 +Octets 336762 +Lines 4473 MimeEntityEnd 2108499 MultipartBoundaryBegin 2108499 MultipartBoundaryEnd 2108541 @@ -312,16 +389,24 @@ MimeEntityBegin 2108541 MimeEntityHeadersEnd 2108632 MimeContentBegin 2108632 MimeContentEnd 2108637 +Octets 5 +Lines 2 MimeEntityEnd 2108638 MultipartEndBoundaryBegin 2108638 MultipartEndBoundaryEnd 2108681 MultipartEpilogueBegin 2108681 MultipartEpilogueEnd 2108682 +MimeContentEnd 2108683 +Octets 1762990 +Lines 23516 MimeEntityEnd 2108683 MultipartEndBoundaryBegin 2108683 MultipartEndBoundaryEnd 2108724 MultipartEpilogueBegin 2108724 MultipartEpilogueEnd 2108724 +MimeContentEnd 2108725 +Octets 1764157 +Lines 23546 MimeEntityEnd 2108725 MimeMessageEnd 2108725 MboxMarkerBegin 2108725 @@ -332,6 +417,8 @@ MimeEntityBegin 2108733 MimeEntityHeadersEnd 2109749 MimeContentBegin 2109749 MimeContentEnd 2110874 +Octets 1125 +Lines 40 MimeEntityEnd 2110875 MimeMessageEnd 2110875 MboxMarkerBegin 2110875 @@ -349,6 +436,8 @@ MimeEntityBegin 2111136 MimeEntityHeadersEnd 2111137 MimeContentBegin 2111137 MimeContentEnd 2111437 +Octets 300 +Lines 6 MimeEntityEnd 2111438 MultipartBoundaryBegin 2111438 MultipartBoundaryEnd 2111453 @@ -363,6 +452,8 @@ MimeEntityBegin 2111545 MimeEntityHeadersEnd 2111622 MimeContentBegin 2111622 MimeContentEnd 2114882 +Octets 3260 +Lines 17 MimeEntityEnd 2114883 MultipartBoundaryBegin 2114883 MultipartBoundaryEnd 2114899 @@ -370,11 +461,16 @@ MimeEntityBegin 2114899 MimeEntityHeadersEnd 2115002 MimeContentBegin 2115002 MimeContentEnd 2270901 +Octets 155899 +Lines 808 MimeEntityEnd 2270902 MultipartEndBoundaryBegin 2270902 MultipartEndBoundaryEnd 2270919 MultipartEpilogueBegin 2270919 MultipartEpilogueEnd 2270919 +MimeContentEnd 2270920 +Octets 159391 +Lines 837 MimeEntityEnd 2270920 MultipartBoundaryBegin 2270920 MultipartBoundaryEnd 2270935 @@ -382,11 +478,16 @@ MimeEntityBegin 2270935 MimeEntityHeadersEnd 2270991 MimeContentBegin 2270991 MimeContentEnd 2275711 +Octets 4720 +Lines 196 MimeEntityEnd 2275712 MultipartEndBoundaryBegin 2275712 MultipartEndBoundaryEnd 2275728 MultipartEpilogueBegin 2275728 MultipartEpilogueEnd 2275728 +MimeContentEnd 2275729 +Octets 164608 +Lines 1050 MimeEntityEnd 2275729 MimeMessageEnd 2275729 MboxMarkerBegin 2275729 @@ -397,6 +498,8 @@ MimeEntityBegin 2275737 MimeEntityHeadersEnd 2276689 MimeContentBegin 2276689 MimeContentEnd 2619749 +Octets 343060 +Lines 4457 MimeEntityEnd 2619750 MimeMessageEnd 2619750 MboxMarkerBegin 2619750 @@ -421,6 +524,8 @@ MimeEntityBegin 2620013 MimeEntityHeadersEnd 2620014 MimeContentBegin 2620014 MimeContentEnd 2620721 +Octets 707 +Lines 18 MimeEntityEnd 2620722 MultipartBoundaryBegin 2620722 MultipartBoundaryEnd 2620753 @@ -428,16 +533,24 @@ MimeEntityBegin 2620753 MimeEntityHeadersEnd 2620850 MimeContentBegin 2620850 MimeContentEnd 2651896 +Octets 31046 +Lines 427 MimeEntityEnd 2651897 MultipartEndBoundaryBegin 2651897 MultipartEndBoundaryEnd 2651929 MultipartEpilogueBegin 2651929 MultipartEpilogueEnd 2651929 +MimeContentEnd 2651930 +Octets 31948 +Lines 453 MimeEntityEnd 2651930 MultipartEndBoundaryBegin 2651930 MultipartEndBoundaryEnd 2651948 MultipartEpilogueBegin 2651948 MultipartEpilogueEnd 2651948 +MimeContentEnd 2651949 +Octets 32057 +Lines 457 MimeEntityEnd 2651949 MimeMessageEnd 2651949 MboxMarkerBegin 2651949 @@ -448,6 +561,8 @@ MimeEntityBegin 2651957 MimeEntityHeadersEnd 2652514 MimeContentBegin 2652514 MimeContentEnd 2709293 +Octets 56779 +Lines 783 MimeEntityEnd 2709294 MimeMessageEnd 2709294 MboxMarkerBegin 2709294 @@ -465,6 +580,8 @@ MimeEntityBegin 2710619 MimeEntityHeadersEnd 2710620 MimeContentBegin 2710620 MimeContentEnd 2711172 +Octets 552 +Lines 15 MimeEntityEnd 2711173 MultipartBoundaryBegin 2711173 MultipartBoundaryEnd 2711231 @@ -479,6 +596,8 @@ MimeEntityBegin 2711394 MimeEntityHeadersEnd 2711467 MimeContentBegin 2711467 MimeContentEnd 2711886 +Octets 419 +Lines 8 MimeEntityEnd 2711887 MultipartBoundaryBegin 2711887 MultipartBoundaryEnd 2711947 @@ -486,6 +605,8 @@ MimeEntityBegin 2711947 MimeEntityHeadersEnd 2712006 MimeContentBegin 2712006 MimeContentEnd 2741267 +Octets 29261 +Lines 402 MimeEntityEnd 2741268 MultipartBoundaryBegin 2741268 MultipartBoundaryEnd 2741328 @@ -493,16 +614,24 @@ MimeEntityBegin 2741328 MimeEntityHeadersEnd 2741398 MimeContentBegin 2741398 MimeContentEnd 2741439 +Octets 41 +Lines 5 MimeEntityEnd 2741440 MultipartEndBoundaryBegin 2741440 MultipartEndBoundaryEnd 2741501 MultipartEpilogueBegin 2741501 MultipartEpilogueEnd 2741502 +MimeContentEnd 2741503 +Octets 30169 +Lines 429 MimeEntityEnd 2741503 MultipartEndBoundaryBegin 2741503 MultipartEndBoundaryEnd 2741562 MultipartEpilogueBegin 2741562 MultipartEpilogueEnd 2741562 +MimeContentEnd 2741563 +Octets 31528 +Lines 459 MimeEntityEnd 2741563 MimeMessageEnd 2741563 MboxMarkerBegin 2741563 @@ -520,6 +649,8 @@ MimeEntityBegin 2742593 MimeEntityHeadersEnd 2742594 MimeContentBegin 2742594 MimeContentEnd 2743415 +Octets 821 +Lines 28 MimeEntityEnd 2743416 MultipartBoundaryBegin 2743416 MultipartBoundaryEnd 2743445 @@ -534,6 +665,8 @@ MimeEntityBegin 2743549 MimeEntityHeadersEnd 2743575 MimeContentBegin 2743575 MimeContentEnd 2743712 +Octets 137 +Lines 6 MimeEntityEnd 2743713 MultipartBoundaryBegin 2743713 MultipartBoundaryEnd 2743744 @@ -541,6 +674,8 @@ MimeEntityBegin 2743744 MimeEntityHeadersEnd 2743809 MimeContentBegin 2743809 MimeContentEnd 2745006 +Octets 1197 +Lines 18 MimeEntityEnd 2745007 MultipartBoundaryBegin 2745007 MultipartBoundaryEnd 2745038 @@ -548,6 +683,8 @@ MimeEntityBegin 2745038 MimeEntityHeadersEnd 2745064 MimeContentBegin 2745064 MimeContentEnd 2745132 +Octets 68 +Lines 1 MimeEntityEnd 2745133 MultipartBoundaryBegin 2745133 MultipartBoundaryEnd 2745164 @@ -555,6 +692,8 @@ MimeEntityBegin 2745164 MimeEntityHeadersEnd 2745229 MimeContentBegin 2745229 MimeContentEnd 2746434 +Octets 1205 +Lines 18 MimeEntityEnd 2746435 MultipartBoundaryBegin 2746435 MultipartBoundaryEnd 2746466 @@ -562,16 +701,24 @@ MimeEntityBegin 2746466 MimeEntityHeadersEnd 2746495 MimeContentBegin 2746495 MimeContentEnd 2747041 +Octets 546 +Lines 14 MimeEntityEnd 2747042 MultipartEndBoundaryBegin 2747042 MultipartEndBoundaryEnd 2747074 MultipartEpilogueBegin 2747074 MultipartEpilogueEnd 2747075 +MimeContentEnd 2747076 +Octets 3558 +Lines 76 MimeEntityEnd 2747076 MultipartEndBoundaryBegin 2747076 MultipartEndBoundaryEnd 2747106 MultipartEpilogueBegin 2747106 MultipartEpilogueEnd 2747107 +MimeContentEnd 2747108 +Octets 4884 +Lines 119 MimeEntityEnd 2747108 MimeMessageEnd 2747108 MboxMarkerBegin 2747108 @@ -582,6 +729,8 @@ MimeEntityBegin 2747116 MimeEntityHeadersEnd 2748092 MimeContentBegin 2748092 MimeContentEnd 2749474 +Octets 1382 +Lines 33 MimeEntityEnd 2749475 MimeMessageEnd 2749475 MboxMarkerBegin 2749475 @@ -592,6 +741,8 @@ MimeEntityBegin 2749483 MimeEntityHeadersEnd 2749739 MimeContentBegin 2749739 MimeContentEnd 2749995 +Octets 256 +Lines 6 MimeEntityEnd 2749996 MimeMessageEnd 2749996 MboxMarkerBegin 2749996 @@ -602,6 +753,8 @@ MimeEntityBegin 2750004 MimeEntityHeadersEnd 2750661 MimeContentBegin 2750661 MimeContentEnd 2751385 +Octets 724 +Lines 14 MimeEntityEnd 2751386 MimeMessageEnd 2751386 MboxMarkerBegin 2751386 @@ -619,6 +772,8 @@ MimeEntityBegin 2752420 MimeEntityHeadersEnd 2752466 MimeContentBegin 2752466 MimeContentEnd 2752538 +Octets 72 +Lines 6 MimeEntityEnd 2752539 MultipartBoundaryBegin 2752539 MultipartBoundaryEnd 2752578 @@ -633,6 +788,8 @@ MimeEntityBegin 2752707 MimeEntityHeadersEnd 2752862 MimeContentBegin 2752862 MimeContentEnd 2818779 +Octets 65917 +Lines 958 MimeEntityEnd 2818780 MultipartBoundaryBegin 2818780 MultipartBoundaryEnd 2818820 @@ -640,16 +797,24 @@ MimeEntityBegin 2818820 MimeEntityHeadersEnd 2819029 MimeContentBegin 2819029 MimeContentEnd 3183310 +Octets 364281 +Lines 5282 MimeEntityEnd 3183311 MultipartEndBoundaryBegin 3183311 MultipartEndBoundaryEnd 3183352 MultipartEpilogueBegin 3183352 MultipartEpilogueEnd 3183354 +MimeContentEnd 3183355 +Octets 430690 +Lines 6257 MimeEntityEnd 3183355 MultipartEndBoundaryBegin 3183355 MultipartEndBoundaryEnd 3183395 MultipartEpilogueBegin 3183395 MultipartEpilogueEnd 3183395 +MimeContentEnd 3183396 +Octets 431017 +Lines 6272 MimeEntityEnd 3183396 MimeMessageEnd 3183396 MboxMarkerBegin 3183396 @@ -667,6 +832,8 @@ MimeEntityBegin 3184430 MimeEntityHeadersEnd 3184476 MimeContentBegin 3184476 MimeContentEnd 3184548 +Octets 72 +Lines 6 MimeEntityEnd 3184549 MultipartBoundaryBegin 3184549 MultipartBoundaryEnd 3184588 @@ -681,6 +848,8 @@ MimeEntityBegin 3184716 MimeEntityHeadersEnd 3184871 MimeContentBegin 3184871 MimeContentEnd 3250788 +Octets 65917 +Lines 958 MimeEntityEnd 3250789 MultipartBoundaryBegin 3250789 MultipartBoundaryEnd 3250829 @@ -688,16 +857,24 @@ MimeEntityBegin 3250829 MimeEntityHeadersEnd 3251038 MimeContentBegin 3251038 MimeContentEnd 3615319 +Octets 364281 +Lines 5282 MimeEntityEnd 3615320 MultipartEndBoundaryBegin 3615320 MultipartEndBoundaryEnd 3615361 MultipartEpilogueBegin 3615361 MultipartEpilogueEnd 3615363 +MimeContentEnd 3615364 +Octets 430690 +Lines 6257 MimeEntityEnd 3615364 MultipartEndBoundaryBegin 3615364 MultipartEndBoundaryEnd 3615404 MultipartEpilogueBegin 3615404 MultipartEpilogueEnd 3615404 +MimeContentEnd 3615405 +Octets 431016 +Lines 6272 MimeEntityEnd 3615405 MimeMessageEnd 3615405 MboxMarkerBegin 3615405 @@ -713,9 +890,13 @@ MimeEntityBegin 3615971 MimeEntityHeadersEnd 3616030 MimeContentBegin 3616030 MimeContentEnd 3616557 +Octets 527 +Lines 14 MimeEntityEnd 3616558 MimeMessageEnd 3616558 MimeContentEnd 3616558 +Octets 587 +Lines 17 MimeEntityEnd 3616558 MimeMessageEnd 3616558 MboxMarkerBegin 3616558 @@ -733,6 +914,8 @@ MimeEntityBegin 3617323 MimeEntityHeadersEnd 3617349 MimeContentBegin 3617349 MimeContentEnd 3617529 +Octets 180 +Lines 7 MimeEntityEnd 3617530 MultipartBoundaryBegin 3617530 MultipartBoundaryEnd 3617573 @@ -740,11 +923,16 @@ MimeEntityBegin 3617573 MimeEntityHeadersEnd 3617645 MimeContentBegin 3617645 MimeContentEnd 3618537 +Octets 892 +Lines 13 MimeEntityEnd 3618538 MultipartEndBoundaryBegin 3618538 MultipartEndBoundaryEnd 3618582 MultipartEpilogueBegin 3618582 MultipartEpilogueEnd 3618690 +MimeContentEnd 3618691 +Octets 1412 +Lines 34 MimeEntityEnd 3618691 MimeMessageEnd 3618691 MboxMarkerBegin 3618691 @@ -762,6 +950,8 @@ MimeEntityBegin 3619314 MimeEntityHeadersEnd 3619315 MimeContentBegin 3619315 MimeContentEnd 3619707 +Octets 392 +Lines 11 MimeEntityEnd 3619708 MultipartBoundaryBegin 3619708 MultipartBoundaryEnd 3619747 @@ -774,14 +964,21 @@ MimeEntityBegin 3619777 MimeEntityHeadersEnd 3620564 MimeContentBegin 3620564 MimeContentEnd 3623917 +Octets 3353 +Lines 73 MimeEntityEnd 3623918 MimeMessageEnd 3623918 MimeContentEnd 3623918 +Octets 4141 +Lines 89 MimeEntityEnd 3623918 MultipartEndBoundaryBegin 3623918 MultipartEndBoundaryEnd 3623958 MultipartEpilogueBegin 3623958 MultipartEpilogueEnd 3623959 +MimeContentEnd 3623960 +Octets 4722 +Lines 109 MimeEntityEnd 3623960 MimeMessageEnd 3623960 MboxMarkerBegin 3623960 @@ -799,6 +996,8 @@ MimeEntityBegin 3624666 MimeEntityHeadersEnd 3624692 MimeContentBegin 3624692 MimeContentEnd 3624766 +Octets 74 +Lines 5 MimeEntityEnd 3624767 MultipartBoundaryBegin 3624767 MultipartBoundaryEnd 3624816 @@ -811,14 +1010,21 @@ MimeEntityBegin 3624878 MimeEntityHeadersEnd 3625660 MimeContentBegin 3625660 MimeContentEnd 3625797 +Octets 137 +Lines 4 MimeEntityEnd 3625798 MimeMessageEnd 3625798 MimeContentEnd 3625798 +Octets 920 +Lines 21 MimeEntityEnd 3625798 MultipartEndBoundaryBegin 3625798 MultipartEndBoundaryEnd 3625848 MultipartEpilogueBegin 3625848 MultipartEpilogueEnd 3625848 +MimeContentEnd 3625849 +Octets 1232 +Lines 34 MimeEntityEnd 3625849 MimeMessageEnd 3625849 MboxMarkerBegin 3625849 @@ -829,6 +1035,8 @@ MimeEntityBegin 3625857 MimeEntityHeadersEnd 3626367 MimeContentBegin 3626367 MimeContentEnd 3627786 +Octets 1419 +Lines 46 MimeEntityEnd 3627787 MimeMessageEnd 3627787 MboxMarkerBegin 3627787 @@ -839,6 +1047,8 @@ MimeEntityBegin 3627838 MimeEntityHeadersEnd 3628410 MimeContentBegin 3628410 MimeContentEnd 3688111 +Octets 59701 +Lines 955 MimeEntityEnd 3688112 MimeMessageEnd 3688112 MboxMarkerBegin 3688112 @@ -849,6 +1059,8 @@ MimeEntityBegin 3688163 MimeEntityHeadersEnd 3688732 MimeContentBegin 3688732 MimeContentEnd 3748539 +Octets 59807 +Lines 961 MimeEntityEnd 3748540 MimeMessageEnd 3748540 MboxMarkerBegin 3748540 @@ -866,6 +1078,8 @@ MimeEntityBegin 3749112 MimeEntityHeadersEnd 3749139 MimeContentBegin 3749139 MimeContentEnd 3749210 +Octets 71 +Lines 5 MimeEntityEnd 3749211 MultipartBoundaryBegin 3749211 MultipartBoundaryEnd 3749226 @@ -873,11 +1087,16 @@ MimeEntityBegin 3749226 MimeEntityHeadersEnd 3749307 MimeContentBegin 3749307 MimeContentEnd 3749948 +Octets 641 +Lines 10 MimeEntityEnd 3749949 MultipartEndBoundaryBegin 3749949 MultipartEndBoundaryEnd 3749965 MultipartEpilogueBegin 3749965 MultipartEpilogueEnd 3749967 +MimeContentEnd 3749968 +Octets 872 +Lines 26 MimeEntityEnd 3749968 MimeMessageEnd 3749968 MboxMarkerBegin 3749968 @@ -888,6 +1107,8 @@ MimeEntityBegin 3749976 MimeEntityHeadersEnd 3750723 MimeContentBegin 3750723 MimeContentEnd 3792253 +Octets 41530 +Lines 571 MimeEntityEnd 3792254 MimeMessageEnd 3792254 MboxMarkerBegin 3792254 @@ -905,6 +1126,8 @@ MimeEntityBegin 3793421 MimeEntityHeadersEnd 3793422 MimeContentBegin 3793422 MimeContentEnd 3795344 +Octets 1922 +Lines 44 MimeEntityEnd 3795345 MultipartBoundaryBegin 3795345 MultipartBoundaryEnd 3795350 @@ -912,11 +1135,16 @@ MimeEntityBegin 3795350 MimeEntityHeadersEnd 3795455 MimeContentBegin 3795455 MimeContentEnd 3801677 +Octets 6222 +Lines 87 MimeEntityEnd 3801678 MultipartEndBoundaryBegin 3801678 MultipartEndBoundaryEnd 3801684 MultipartEpilogueBegin 3801684 MultipartEpilogueEnd 3801685 +MimeContentEnd 3801686 +Octets 8270 +Lines 140 MimeEntityEnd 3801686 MimeMessageEnd 3801686 MboxMarkerBegin 3801686 @@ -927,6 +1155,8 @@ MimeEntityBegin 3801694 MimeEntityHeadersEnd 3803142 MimeContentBegin 3803142 MimeContentEnd 3909955 +Octets 106813 +Lines 1571 MimeEntityEnd 3909956 MimeMessageEnd 3909956 MboxMarkerBegin 3909956 @@ -959,6 +1189,8 @@ MimeEntityBegin 3912327 MimeEntityHeadersEnd 3912403 MimeContentBegin 3912403 MimeContentEnd 3912452 +Octets 49 +Lines 2 MimeEntityEnd 3912453 MultipartBoundaryBegin 3912453 MultipartBoundaryEnd 3912511 @@ -978,6 +1210,8 @@ MimeEntityBegin 3913167 MimeEntityHeadersEnd 3913243 MimeContentBegin 3913243 MimeContentEnd 3913365 +Octets 122 +Lines 6 MimeEntityEnd 3913366 MultipartBoundaryBegin 3913366 MultipartBoundaryEnd 3913414 @@ -985,28 +1219,44 @@ MimeEntityBegin 3913414 MimeEntityHeadersEnd 3913483 MimeContentBegin 3913483 MimeContentEnd 3913766 +Octets 283 +Lines 5 MimeEntityEnd 3913767 MultipartEndBoundaryBegin 3913767 MultipartEndBoundaryEnd 3913816 MultipartEpilogueBegin 3913816 MultipartEpilogueEnd 3913817 +MimeContentEnd 3913818 +Octets 745 +Lines 23 MimeEntityEnd 3913818 MimeMessageEnd 3913818 MimeContentEnd 3913818 +Octets 1245 +Lines 39 MimeEntityEnd 3913818 MultipartEndBoundaryBegin 3913818 MultipartEndBoundaryEnd 3913877 MultipartEpilogueBegin 3913877 MultipartEpilogueEnd 3913880 +MimeContentEnd 3913881 +Octets 1658 +Lines 55 MimeEntityEnd 3913881 MimeMessageEnd 3913881 MimeContentEnd 3913881 +Octets 2206 +Lines 71 MimeEntityEnd 3913881 MimeMessageEnd 3913881 MimeContentEnd 3913881 +Octets 2748 +Lines 87 MimeEntityEnd 3913881 MimeMessageEnd 3913881 MimeContentEnd 3913881 +Octets 3318 +Lines 103 MimeEntityEnd 3913881 MimeMessageEnd 3913881 MboxMarkerBegin 3913881 @@ -1024,6 +1274,8 @@ MimeEntityBegin 3914619 MimeEntityHeadersEnd 3914620 MimeContentBegin 3914620 MimeContentEnd 3914661 +Octets 41 +Lines 2 MimeEntityEnd 3914662 MultipartBoundaryBegin 3914662 MultipartBoundaryEnd 3914689 @@ -1031,6 +1283,8 @@ MimeEntityBegin 3914689 MimeEntityHeadersEnd 3914834 MimeContentBegin 3914834 MimeContentEnd 3992050 +Octets 77216 +Lines 401 MimeEntityEnd 3992051 MultipartBoundaryBegin 3992051 MultipartBoundaryEnd 3992078 @@ -1038,6 +1292,8 @@ MimeEntityBegin 3992078 MimeEntityHeadersEnd 3992079 MimeContentBegin 3992079 MimeContentEnd 3992110 +Octets 31 +Lines 4 MimeEntityEnd 3992111 MultipartBoundaryBegin 3992111 MultipartBoundaryEnd 3992138 @@ -1045,6 +1301,8 @@ MimeEntityBegin 3992138 MimeEntityHeadersEnd 3992285 MimeContentBegin 3992285 MimeContentEnd 4095487 +Octets 103202 +Lines 535 MimeEntityEnd 4095488 MultipartBoundaryBegin 4095488 MultipartBoundaryEnd 4095515 @@ -1052,6 +1310,8 @@ MimeEntityBegin 4095515 MimeEntityHeadersEnd 4095516 MimeContentBegin 4095516 MimeContentEnd 4095676 +Octets 160 +Lines 5 MimeEntityEnd 4095677 MultipartBoundaryBegin 4095677 MultipartBoundaryEnd 4095704 @@ -1059,6 +1319,8 @@ MimeEntityBegin 4095704 MimeEntityHeadersEnd 4095793 MimeContentBegin 4095793 MimeContentEnd 4175983 +Octets 80190 +Lines 1235 MimeEntityEnd 4175984 MultipartBoundaryBegin 4175984 MultipartBoundaryEnd 4176011 @@ -1066,11 +1328,16 @@ MimeEntityBegin 4176011 MimeEntityHeadersEnd 4176012 MimeContentBegin 4176012 MimeContentEnd 4176032 +Octets 20 +Lines 3 MimeEntityEnd 4176033 MultipartEndBoundaryBegin 4176033 MultipartEndBoundaryEnd 4176061 MultipartEpilogueBegin 4176061 MultipartEpilogueEnd 4176062 +MimeContentEnd 4176063 +Octets 261471 +Lines 2211 MimeEntityEnd 4176063 MimeMessageEnd 4176063 MboxMarkerBegin 4176063 @@ -1081,6 +1348,8 @@ MimeEntityBegin 4176071 MimeEntityHeadersEnd 4176736 MimeContentBegin 4176736 MimeContentEnd 4177728 +Octets 992 +Lines 19 MimeEntityEnd 4177729 MimeMessageEnd 4177729 MboxMarkerBegin 4177729 @@ -1098,6 +1367,8 @@ MimeEntityBegin 4178988 MimeEntityHeadersEnd 4179032 MimeContentBegin 4179032 MimeContentEnd 4179436 +Octets 404 +Lines 14 MimeEntityEnd 4179437 MultipartBoundaryBegin 4179437 MultipartBoundaryEnd 4179477 @@ -1112,6 +1383,8 @@ MimeEntityBegin 4179604 MimeEntityHeadersEnd 4179695 MimeContentBegin 4179695 MimeContentEnd 4179920 +Octets 225 +Lines 5 MimeEntityEnd 4179921 MultipartBoundaryBegin 4179921 MultipartBoundaryEnd 4179963 @@ -1119,6 +1392,8 @@ MimeEntityBegin 4179963 MimeEntityHeadersEnd 4180082 MimeContentBegin 4180082 MimeContentEnd 4181466 +Octets 1384 +Lines 38 MimeEntityEnd 4181467 MultipartBoundaryBegin 4181467 MultipartBoundaryEnd 4181509 @@ -1126,16 +1401,24 @@ MimeEntityBegin 4181509 MimeEntityHeadersEnd 4181600 MimeContentBegin 4181600 MimeContentEnd 4181748 +Octets 148 +Lines 10 MimeEntityEnd 4181749 MultipartEndBoundaryBegin 4181749 MultipartEndBoundaryEnd 4181792 MultipartEpilogueBegin 4181792 MultipartEpilogueEnd 4181793 +MimeContentEnd 4181794 +Octets 2232 +Lines 68 MimeEntityEnd 4181794 MultipartEndBoundaryBegin 4181794 MultipartEndBoundaryEnd 4181835 MultipartEpilogueBegin 4181835 MultipartEpilogueEnd 4181836 +MimeContentEnd 4181837 +Octets 3044 +Lines 94 MimeEntityEnd 4181837 MimeMessageEnd 4181837 MboxMarkerBegin 4181837 @@ -1153,6 +1436,8 @@ MimeEntityBegin 4182531 MimeEntityHeadersEnd 4182558 MimeContentBegin 4182558 MimeContentEnd 4182636 +Octets 78 +Lines 7 MimeEntityEnd 4182637 MultipartBoundaryBegin 4182637 MultipartBoundaryEnd 4182653 @@ -1160,11 +1445,16 @@ MimeEntityBegin 4182653 MimeEntityHeadersEnd 4182713 MimeContentBegin 4182713 MimeContentEnd 4187876 +Octets 5163 +Lines 72 MimeEntityEnd 4187877 MultipartEndBoundaryBegin 4187877 MultipartEndBoundaryEnd 4187894 MultipartEpilogueBegin 4187894 MultipartEpilogueEnd 4187896 +MimeContentEnd 4187897 +Octets 5382 +Lines 89 MimeEntityEnd 4187897 MimeMessageEnd 4187897 MboxMarkerBegin 4187897 @@ -1175,6 +1465,8 @@ MimeEntityBegin 4187905 MimeEntityHeadersEnd 4188357 MimeContentBegin 4188357 MimeContentEnd 4199771 +Octets 11414 +Lines 186 MimeEntityEnd 4199772 MimeMessageEnd 4199772 MboxMarkerBegin 4199772 @@ -1192,6 +1484,8 @@ MimeEntityBegin 4200356 MimeEntityHeadersEnd 4200357 MimeContentBegin 4200357 MimeContentEnd 4200395 +Octets 38 +Lines 2 MimeEntityEnd 4200396 MultipartBoundaryBegin 4200396 MultipartBoundaryEnd 4200407 @@ -1211,9 +1505,13 @@ MimeEntityBegin 4200592 MimeEntityHeadersEnd 4200669 MimeContentBegin 4200669 MimeContentEnd 4200736 +Octets 67 +Lines 3 MimeEntityEnd 4200737 MimeMessageEnd 4200737 MimeContentEnd 4200737 +Octets 145 +Lines 6 MimeEntityEnd 4200737 MultipartBoundaryBegin 4200737 MultipartBoundaryEnd 4200751 @@ -1226,9 +1524,13 @@ MimeEntityBegin 4200938 MimeEntityHeadersEnd 4201015 MimeContentBegin 4201015 MimeContentEnd 4201015 +Octets 0 +Lines 0 MimeEntityEnd 4201015 MimeMessageEnd 4201015 MimeContentEnd 4201015 +Octets 77 +Lines 3 MimeEntityEnd 4201015 MultipartBoundaryBegin 4201015 MultipartBoundaryEnd 4201029 @@ -1241,9 +1543,13 @@ MimeEntityBegin 4201164 MimeEntityHeadersEnd 4201232 MimeContentBegin 4201232 MimeContentEnd 4201232 +Octets 0 +Lines 0 MimeEntityEnd 4201232 MimeMessageEnd 4201232 MimeContentEnd 4201232 +Octets 68 +Lines 3 MimeEntityEnd 4201232 MultipartBoundaryBegin 4201232 MultipartBoundaryEnd 4201246 @@ -1256,9 +1562,13 @@ MimeEntityBegin 4201359 MimeEntityHeadersEnd 4201428 MimeContentBegin 4201428 MimeContentEnd 4201428 +Octets 0 +Lines 0 MimeEntityEnd 4201428 MimeMessageEnd 4201428 MimeContentEnd 4201428 +Octets 69 +Lines 3 MimeEntityEnd 4201428 MultipartBoundaryBegin 4201428 MultipartBoundaryEnd 4201442 @@ -1271,19 +1581,29 @@ MimeEntityBegin 4201547 MimeEntityHeadersEnd 4201616 MimeContentBegin 4201616 MimeContentEnd 4201616 +Octets 0 +Lines 0 MimeEntityEnd 4201616 MimeMessageEnd 4201616 MimeContentEnd 4201616 +Octets 69 +Lines 3 MimeEntityEnd 4201616 MultipartEndBoundaryBegin 4201616 MultipartEndBoundaryEnd 4201631 MultipartEpilogueBegin 4201631 MultipartEpilogueEnd 4201632 +MimeContentEnd 4201633 +Octets 1171 +Lines 50 MimeEntityEnd 4201633 MultipartEndBoundaryBegin 4201633 MultipartEndBoundaryEnd 4201645 MultipartEpilogueBegin 4201645 MultipartEpilogueEnd 4201646 +MimeContentEnd 4201647 +Octets 1302 +Lines 59 MimeEntityEnd 4201647 MimeMessageEnd 4201647 MboxMarkerBegin 4201647 @@ -1301,6 +1621,8 @@ MimeEntityBegin 4202231 MimeEntityHeadersEnd 4202232 MimeContentBegin 4202232 MimeContentEnd 4205436 +Octets 3204 +Lines 66 MimeEntityEnd 4205437 MultipartBoundaryBegin 4205437 MultipartBoundaryEnd 4205448 @@ -1320,9 +1642,13 @@ MimeEntityBegin 4205639 MimeEntityHeadersEnd 4205716 MimeContentBegin 4205716 MimeContentEnd 4205783 +Octets 67 +Lines 3 MimeEntityEnd 4205784 MimeMessageEnd 4205784 MimeContentEnd 4205784 +Octets 145 +Lines 6 MimeEntityEnd 4205784 MultipartBoundaryBegin 4205784 MultipartBoundaryEnd 4205798 @@ -1335,19 +1661,29 @@ MimeEntityBegin 4205985 MimeEntityHeadersEnd 4206062 MimeContentBegin 4206062 MimeContentEnd 4206062 +Octets 0 +Lines 0 MimeEntityEnd 4206062 MimeMessageEnd 4206062 MimeContentEnd 4206062 +Octets 77 +Lines 3 MimeEntityEnd 4206062 MultipartEndBoundaryBegin 4206062 MultipartEndBoundaryEnd 4206077 MultipartEpilogueBegin 4206077 MultipartEpilogueEnd 4206078 +MimeContentEnd 4206079 +Octets 570 +Lines 23 MimeEntityEnd 4206079 MultipartEndBoundaryBegin 4206079 MultipartEndBoundaryEnd 4206091 MultipartEpilogueBegin 4206091 MultipartEpilogueEnd 4206092 +MimeContentEnd 4206093 +Octets 3873 +Lines 96 MimeEntityEnd 4206093 MimeMessageEnd 4206093 MboxMarkerBegin 4206093 @@ -1370,9 +1706,13 @@ MimeEntityBegin 4206786 MimeEntityHeadersEnd 4207215 MimeContentBegin 4207215 MimeContentEnd 4207252 +Octets 37 +Lines 3 MimeEntityEnd 4207253 MimeMessageEnd 4207253 MimeContentEnd 4207253 +Octets 467 +Lines 14 MimeEntityEnd 4207253 MultipartBoundaryBegin 4207253 MultipartBoundaryEnd 4207280 @@ -1380,6 +1720,8 @@ MimeEntityBegin 4207280 MimeEntityHeadersEnd 4207403 MimeContentBegin 4207403 MimeContentEnd 4207861 +Octets 458 +Lines 7 MimeEntityEnd 4207862 MultipartBoundaryBegin 4207862 MultipartBoundaryEnd 4207889 @@ -1387,6 +1729,8 @@ MimeEntityBegin 4207889 MimeEntityHeadersEnd 4208012 MimeContentBegin 4208012 MimeContentEnd 4208498 +Octets 486 +Lines 7 MimeEntityEnd 4208499 MultipartBoundaryBegin 4208499 MultipartBoundaryEnd 4208526 @@ -1394,6 +1738,8 @@ MimeEntityBegin 4208526 MimeEntityHeadersEnd 4208653 MimeContentBegin 4208653 MimeContentEnd 4209180 +Octets 527 +Lines 8 MimeEntityEnd 4209181 MultipartBoundaryBegin 4209181 MultipartBoundaryEnd 4209208 @@ -1401,6 +1747,8 @@ MimeEntityBegin 4209208 MimeEntityHeadersEnd 4209333 MimeContentBegin 4209333 MimeContentEnd 4209831 +Octets 498 +Lines 7 MimeEntityEnd 4209832 MultipartBoundaryBegin 4209832 MultipartBoundaryEnd 4209859 @@ -1413,9 +1761,13 @@ MimeEntityBegin 4210003 MimeEntityHeadersEnd 4210432 MimeContentBegin 4210432 MimeContentEnd 4210469 +Octets 37 +Lines 2 MimeEntityEnd 4210470 MimeMessageEnd 4210470 MimeContentEnd 4210470 +Octets 467 +Lines 13 MimeEntityEnd 4210470 MultipartBoundaryBegin 4210470 MultipartBoundaryEnd 4210497 @@ -1438,15 +1790,23 @@ MimeEntityBegin 4211749 MimeEntityHeadersEnd 4212159 MimeContentBegin 4212159 MimeContentEnd 4212164 +Octets 5 +Lines 2 MimeEntityEnd 4212165 MimeMessageEnd 4212165 MimeContentEnd 4212165 +Octets 416 +Lines 13 MimeEntityEnd 4212165 MimeMessageEnd 4212165 MimeContentEnd 4212165 +Octets 927 +Lines 27 MimeEntityEnd 4212165 MimeMessageEnd 4212165 MimeContentEnd 4212165 +Octets 1497 +Lines 42 MimeEntityEnd 4212165 MultipartBoundaryBegin 4212165 MultipartBoundaryEnd 4212192 @@ -1454,11 +1814,16 @@ MimeEntityBegin 4212192 MimeEntityHeadersEnd 4212245 MimeContentBegin 4212245 MimeContentEnd 4212297 +Octets 52 +Lines 2 MimeEntityEnd 4212298 MultipartEndBoundaryBegin 4212298 MultipartEndBoundaryEnd 4212326 MultipartEpilogueBegin 4212326 MultipartEpilogueEnd 4212326 +MimeContentEnd 4212327 +Octets 5758 +Lines 145 MimeEntityEnd 4212327 MimeMessageEnd 4212327 MboxMarkerBegin 4212327 @@ -1481,9 +1846,13 @@ MimeEntityBegin 4213027 MimeEntityHeadersEnd 4213455 MimeContentBegin 4213455 MimeContentEnd 4213492 +Octets 37 +Lines 3 MimeEntityEnd 4213493 MimeMessageEnd 4213493 MimeContentEnd 4213493 +Octets 466 +Lines 14 MimeEntityEnd 4213493 MultipartBoundaryBegin 4213493 MultipartBoundaryEnd 4213520 @@ -1491,6 +1860,8 @@ MimeEntityBegin 4213520 MimeEntityHeadersEnd 4213647 MimeContentBegin 4213647 MimeContentEnd 4214105 +Octets 458 +Lines 7 MimeEntityEnd 4214106 MultipartBoundaryBegin 4214106 MultipartBoundaryEnd 4214133 @@ -1498,6 +1869,8 @@ MimeEntityBegin 4214133 MimeEntityHeadersEnd 4214260 MimeContentBegin 4214260 MimeContentEnd 4214746 +Octets 486 +Lines 7 MimeEntityEnd 4214747 MultipartBoundaryBegin 4214747 MultipartBoundaryEnd 4214774 @@ -1505,6 +1878,8 @@ MimeEntityBegin 4214774 MimeEntityHeadersEnd 4214905 MimeContentBegin 4214905 MimeContentEnd 4215432 +Octets 527 +Lines 8 MimeEntityEnd 4215433 MultipartBoundaryBegin 4215433 MultipartBoundaryEnd 4215460 @@ -1512,6 +1887,8 @@ MimeEntityBegin 4215460 MimeEntityHeadersEnd 4215589 MimeContentBegin 4215589 MimeContentEnd 4216087 +Octets 498 +Lines 7 MimeEntityEnd 4216088 MultipartBoundaryBegin 4216088 MultipartBoundaryEnd 4216115 @@ -1524,9 +1901,13 @@ MimeEntityBegin 4216263 MimeEntityHeadersEnd 4216691 MimeContentBegin 4216691 MimeContentEnd 4216728 +Octets 37 +Lines 2 MimeEntityEnd 4216729 MimeMessageEnd 4216729 MimeContentEnd 4216729 +Octets 466 +Lines 13 MimeEntityEnd 4216729 MultipartBoundaryBegin 4216729 MultipartBoundaryEnd 4216756 @@ -1549,15 +1930,23 @@ MimeEntityBegin 4218018 MimeEntityHeadersEnd 4218427 MimeContentBegin 4218427 MimeContentEnd 4218432 +Octets 5 +Lines 2 MimeEntityEnd 4218433 MimeMessageEnd 4218433 MimeContentEnd 4218433 +Octets 415 +Lines 13 MimeEntityEnd 4218433 MimeMessageEnd 4218433 MimeContentEnd 4218433 +Octets 929 +Lines 27 MimeEntityEnd 4218433 MimeMessageEnd 4218433 MimeContentEnd 4218433 +Octets 1502 +Lines 42 MimeEntityEnd 4218433 MultipartBoundaryBegin 4218433 MultipartBoundaryEnd 4218460 @@ -1565,11 +1954,16 @@ MimeEntityBegin 4218460 MimeEntityHeadersEnd 4218517 MimeContentBegin 4218517 MimeContentEnd 4218569 +Octets 52 +Lines 2 MimeEntityEnd 4218570 MultipartEndBoundaryBegin 4218570 MultipartEndBoundaryEnd 4218598 MultipartEpilogueBegin 4218598 MultipartEpilogueEnd 4218598 +MimeContentEnd 4218599 +Octets 5793 +Lines 145 MimeEntityEnd 4218599 MimeMessageEnd 4218599 MboxMarkerBegin 4218599 @@ -1587,6 +1981,8 @@ MimeEntityBegin 4219341 MimeEntityHeadersEnd 4219370 MimeContentBegin 4219370 MimeContentEnd 4219786 +Octets 416 +Lines 31 MimeEntityEnd 4219787 MultipartBoundaryBegin 4219787 MultipartBoundaryEnd 4219793 @@ -1594,6 +1990,8 @@ MimeEntityBegin 4219793 MimeEntityHeadersEnd 4219866 MimeContentBegin 4219866 MimeContentEnd 4220497 +Octets 631 +Lines 43 MimeEntityEnd 4220498 MultipartBoundaryBegin 4220498 MultipartBoundaryEnd 4220504 @@ -1601,6 +1999,8 @@ MimeEntityBegin 4220504 MimeEntityHeadersEnd 4220505 MimeContentBegin 4220505 MimeContentEnd 4220523 +Octets 18 +Lines 1 MimeEntityEnd 4220524 MultipartBoundaryBegin 4220524 MultipartBoundaryEnd 4220530 @@ -1608,6 +2008,8 @@ MimeEntityBegin 4220530 MimeEntityHeadersEnd 4220531 MimeContentBegin 4220531 MimeContentEnd 4220542 +Octets 11 +Lines 1 MimeEntityEnd 4220543 MultipartBoundaryBegin 4220543 MultipartBoundaryEnd 4220549 @@ -1627,6 +2029,8 @@ MimeEntityBegin 4220800 MimeEntityHeadersEnd 4220825 MimeContentBegin 4220825 MimeContentEnd 4220848 +Octets 23 +Lines 1 MimeEntityEnd 4220849 MultipartBoundaryBegin 4220849 MultipartBoundaryEnd 4220855 @@ -1634,14 +2038,21 @@ MimeEntityBegin 4220855 MimeEntityHeadersEnd 4221030 MimeContentBegin 4221030 MimeContentEnd 4221068 +Octets 38 +Lines 2 MimeEntityEnd 4221069 MultipartEndBoundaryBegin 4221069 MultipartEndBoundaryEnd 4221076 MultipartEpilogueBegin 4221076 MultipartEpilogueEnd 4221076 +MimeContentEnd 4221077 +Octets 283 +Lines 13 MimeEntityEnd 4221077 MimeMessageEnd 4221077 MimeContentEnd 4221077 +Octets 498 +Lines 20 MimeEntityEnd 4221077 MultipartBoundaryBegin 4221077 MultipartBoundaryEnd 4221083 @@ -1649,6 +2060,8 @@ MimeEntityBegin 4221083 MimeEntityHeadersEnd 4221161 MimeContentBegin 4221161 MimeContentEnd 4230592 +Octets 9431 +Lines 128 MimeEntityEnd 4230593 MultipartBoundaryBegin 4230593 MultipartBoundaryEnd 4230599 @@ -1656,6 +2069,8 @@ MimeEntityBegin 4230599 MimeEntityHeadersEnd 4230774 MimeContentBegin 4230774 MimeContentEnd 4230812 +Octets 38 +Lines 2 MimeEntityEnd 4230813 MultipartBoundaryBegin 4230813 MultipartBoundaryEnd 4230819 @@ -1663,6 +2078,8 @@ MimeEntityBegin 4230819 MimeEntityHeadersEnd 4230967 MimeContentBegin 4230967 MimeContentEnd 4238788 +Octets 7821 +Lines 128 MimeEntityEnd 4238789 MultipartBoundaryBegin 4238789 MultipartBoundaryEnd 4238795 @@ -1682,9 +2099,13 @@ MimeEntityBegin 4238858 MimeEntityHeadersEnd 4238884 MimeContentBegin 4238884 MimeContentEnd 4238889 +Octets 5 +Lines 1 MimeEntityEnd 4238890 MimeMessageEnd 4238890 MimeContentEnd 4238890 +Octets 32 +Lines 4 MimeEntityEnd 4238890 MultipartBoundaryBegin 4238890 MultipartBoundaryEnd 4238900 @@ -1697,9 +2118,13 @@ MimeEntityBegin 4238901 MimeEntityHeadersEnd 4238927 MimeContentBegin 4238927 MimeContentEnd 4238932 +Octets 5 +Lines 1 MimeEntityEnd 4238933 MimeMessageEnd 4238933 MimeContentEnd 4238933 +Octets 32 +Lines 4 MimeEntityEnd 4238933 MultipartBoundaryBegin 4238933 MultipartBoundaryEnd 4238943 @@ -1712,9 +2137,13 @@ MimeEntityBegin 4238944 MimeEntityHeadersEnd 4238970 MimeContentBegin 4238970 MimeContentEnd 4238975 +Octets 5 +Lines 1 MimeEntityEnd 4238976 MimeMessageEnd 4238976 MimeContentEnd 4238976 +Octets 32 +Lines 4 MimeEntityEnd 4238976 MultipartBoundaryBegin 4238976 MultipartBoundaryEnd 4238986 @@ -1722,6 +2151,8 @@ MimeEntityBegin 4238986 MimeEntityHeadersEnd 4239011 MimeContentBegin 4239011 MimeContentEnd 4239093 +Octets 82 +Lines 2 MimeEntityEnd 4239094 MultipartBoundaryBegin 4239094 MultipartBoundaryEnd 4239104 @@ -1734,9 +2165,13 @@ MimeEntityBegin 4239105 MimeEntityHeadersEnd 4239159 MimeContentBegin 4239159 MimeContentEnd 4239208 +Octets 49 +Lines 1 MimeEntityEnd 4239209 MimeMessageEnd 4239209 MimeContentEnd 4239209 +Octets 104 +Lines 5 MimeEntityEnd 4239209 MultipartBoundaryBegin 4239209 MultipartBoundaryEnd 4239219 @@ -1749,19 +2184,29 @@ MimeEntityBegin 4239220 MimeEntityHeadersEnd 4239246 MimeContentBegin 4239246 MimeContentEnd 4239251 +Octets 5 +Lines 1 MimeEntityEnd 4239252 MimeMessageEnd 4239252 MimeContentEnd 4239252 +Octets 32 +Lines 4 MimeEntityEnd 4239252 MultipartEndBoundaryBegin 4239252 MultipartEndBoundaryEnd 4239263 MultipartEpilogueBegin 4239263 MultipartEpilogueEnd 4239263 +MimeContentEnd 4239264 +Octets 417 +Lines 37 MimeEntityEnd 4239264 MultipartEndBoundaryBegin 4239264 MultipartEndBoundaryEnd 4239271 MultipartEpilogueBegin 4239271 MultipartEpilogueEnd 4239312 +MimeContentEnd 4239313 +Octets 20019 +Lines 428 MimeEntityEnd 4239313 MimeMessageEnd 4239313 MboxMarkerBegin 4239313 @@ -1779,6 +2224,8 @@ MimeEntityBegin 4240008 MimeEntityHeadersEnd 4240009 MimeContentBegin 4240009 MimeContentEnd 4241229 +Octets 1220 +Lines 27 MimeEntityEnd 4241230 MultipartBoundaryBegin 4241230 MultipartBoundaryEnd 4241256 @@ -1786,6 +2233,8 @@ MimeEntityBegin 4241256 MimeEntityHeadersEnd 4241401 MimeContentBegin 4241401 MimeContentEnd 4312718 +Octets 71317 +Lines 370 MimeEntityEnd 4312719 MultipartBoundaryBegin 4312719 MultipartBoundaryEnd 4312745 @@ -1793,11 +2242,16 @@ MimeEntityBegin 4312745 MimeEntityHeadersEnd 4312746 MimeContentBegin 4312746 MimeContentEnd 4312746 +Octets 0 +Lines 1 MimeEntityEnd 4312747 MultipartEndBoundaryBegin 4312747 MultipartEndBoundaryEnd 4312774 MultipartEpilogueBegin 4312774 MultipartEpilogueEnd 4312775 +MimeContentEnd 4312776 +Octets 72794 +Lines 410 MimeEntityEnd 4312776 MimeMessageEnd 4312776 MboxMarkerBegin 4312776 @@ -1808,6 +2262,8 @@ MimeEntityBegin 4312784 MimeEntityHeadersEnd 4313717 MimeContentBegin 4313717 MimeContentEnd 4562758 +Octets 249041 +Lines 3431 MimeEntityEnd 4562759 MimeMessageEnd 4562759 MboxMarkerBegin 4562759 @@ -1825,6 +2281,8 @@ MimeEntityBegin 4563935 MimeEntityHeadersEnd 4564008 MimeContentBegin 4564008 MimeContentEnd 4564472 +Octets 464 +Lines 10 MimeEntityEnd 4564473 MultipartBoundaryBegin 4564473 MultipartBoundaryEnd 4564518 @@ -1832,6 +2290,8 @@ MimeEntityBegin 4564518 MimeEntityHeadersEnd 4564577 MimeContentBegin 4564577 MimeContentEnd 4588813 +Octets 24236 +Lines 333 MimeEntityEnd 4588814 MultipartBoundaryBegin 4588814 MultipartBoundaryEnd 4588859 @@ -1839,6 +2299,8 @@ MimeEntityBegin 4588859 MimeEntityHeadersEnd 4588932 MimeContentBegin 4588932 MimeContentEnd 4589380 +Octets 448 +Lines 11 MimeEntityEnd 4589381 MultipartBoundaryBegin 4589381 MultipartBoundaryEnd 4589426 @@ -1846,6 +2308,8 @@ MimeEntityBegin 4589426 MimeEntityHeadersEnd 4589485 MimeContentBegin 4589485 MimeContentEnd 4600699 +Octets 11214 +Lines 155 MimeEntityEnd 4600700 MultipartBoundaryBegin 4600700 MultipartBoundaryEnd 4600745 @@ -1853,6 +2317,8 @@ MimeEntityBegin 4600745 MimeEntityHeadersEnd 4600818 MimeContentBegin 4600818 MimeContentEnd 4601122 +Octets 304 +Lines 7 MimeEntityEnd 4601123 MultipartBoundaryBegin 4601123 MultipartBoundaryEnd 4601168 @@ -1860,6 +2326,8 @@ MimeEntityBegin 4601168 MimeEntityHeadersEnd 4601227 MimeContentBegin 4601227 MimeContentEnd 4617677 +Octets 16450 +Lines 227 MimeEntityEnd 4617678 MultipartBoundaryBegin 4617678 MultipartBoundaryEnd 4617723 @@ -1867,11 +2335,16 @@ MimeEntityBegin 4617723 MimeEntityHeadersEnd 4617796 MimeContentBegin 4617796 MimeContentEnd 4618456 +Octets 660 +Lines 16 MimeEntityEnd 4618457 MultipartEndBoundaryBegin 4618457 MultipartEndBoundaryEnd 4618503 MultipartEpilogueBegin 4618503 MultipartEpilogueEnd 4618504 +MimeContentEnd 4618505 +Octets 54810 +Lines 793 MimeEntityEnd 4618505 MimeMessageEnd 4618505 MboxMarkerBegin 4618505 @@ -1889,6 +2362,8 @@ MimeEntityBegin 4619361 MimeEntityHeadersEnd 4619362 MimeContentBegin 4619362 MimeContentEnd 4620012 +Octets 650 +Lines 19 MimeEntityEnd 4620013 MultipartBoundaryBegin 4620013 MultipartBoundaryEnd 4620042 @@ -1896,11 +2371,16 @@ MimeEntityBegin 4620042 MimeEntityHeadersEnd 4620102 MimeContentBegin 4620102 MimeContentEnd 4666555 +Octets 46453 +Lines 762 MimeEntityEnd 4666556 MultipartEndBoundaryBegin 4666556 MultipartEndBoundaryEnd 4666586 MultipartEpilogueBegin 4666586 MultipartEpilogueEnd 4666587 +MimeContentEnd 4666588 +Octets 47256 +Lines 789 MimeEntityEnd 4666588 MimeMessageEnd 4666588 MboxMarkerBegin 4666588 @@ -1918,6 +2398,8 @@ MimeEntityBegin 4667800 MimeEntityHeadersEnd 4667873 MimeContentBegin 4667873 MimeContentEnd 4673188 +Octets 5315 +Lines 161 MimeEntityEnd 4673189 MultipartBoundaryBegin 4673189 MultipartBoundaryEnd 4673212 @@ -1925,6 +2407,8 @@ MimeEntityBegin 4673212 MimeEntityHeadersEnd 4673309 MimeContentBegin 4673309 MimeContentEnd 4675889 +Octets 2580 +Lines 37 MimeEntityEnd 4675890 MultipartBoundaryBegin 4675890 MultipartBoundaryEnd 4675913 @@ -1932,6 +2416,8 @@ MimeEntityBegin 4675913 MimeEntityHeadersEnd 4675986 MimeContentBegin 4675986 MimeContentEnd 4676504 +Octets 518 +Lines 11 MimeEntityEnd 4676505 MultipartBoundaryBegin 4676505 MultipartBoundaryEnd 4676528 @@ -1939,6 +2425,8 @@ MimeEntityBegin 4676528 MimeEntityHeadersEnd 4676642 MimeContentBegin 4676642 MimeContentEnd 4699702 +Octets 23060 +Lines 317 MimeEntityEnd 4699703 MultipartBoundaryBegin 4699703 MultipartBoundaryEnd 4699726 @@ -1946,6 +2434,8 @@ MimeEntityBegin 4699726 MimeEntityHeadersEnd 4699799 MimeContentBegin 4699799 MimeContentEnd 4700377 +Octets 578 +Lines 15 MimeEntityEnd 4700378 MultipartBoundaryBegin 4700378 MultipartBoundaryEnd 4700401 @@ -1958,9 +2448,13 @@ MimeEntityBegin 4700486 MimeEntityHeadersEnd 4700556 MimeContentBegin 4700556 MimeContentEnd 4700556 +Octets 0 +Lines 0 MimeEntityEnd 4700556 MimeMessageEnd 4700556 MimeContentEnd 4700556 +Octets 70 +Lines 3 MimeEntityEnd 4700556 MultipartBoundaryBegin 4700556 MultipartBoundaryEnd 4700579 @@ -1968,6 +2462,8 @@ MimeEntityBegin 4700579 MimeEntityHeadersEnd 4700652 MimeContentBegin 4700652 MimeContentEnd 4700928 +Octets 276 +Lines 6 MimeEntityEnd 4700929 MultipartBoundaryBegin 4700929 MultipartBoundaryEnd 4700952 @@ -1980,9 +2476,13 @@ MimeEntityBegin 4701098 MimeEntityHeadersEnd 4701168 MimeContentBegin 4701168 MimeContentEnd 4701168 +Octets 0 +Lines 0 MimeEntityEnd 4701168 MimeMessageEnd 4701168 MimeContentEnd 4701168 +Octets 70 +Lines 3 MimeEntityEnd 4701168 MultipartBoundaryBegin 4701168 MultipartBoundaryEnd 4701191 @@ -1990,11 +2490,16 @@ MimeEntityBegin 4701191 MimeEntityHeadersEnd 4701264 MimeContentBegin 4701264 MimeContentEnd 4702333 +Octets 1069 +Lines 35 MimeEntityEnd 4702334 MultipartEndBoundaryBegin 4702334 MultipartEndBoundaryEnd 4702358 MultipartEpilogueBegin 4702358 MultipartEpilogueEnd 4702358 +MimeContentEnd 4702359 +Octets 35016 +Lines 639 MimeEntityEnd 4702359 MimeMessageEnd 4702359 MboxMarkerBegin 4702359 @@ -2012,6 +2517,8 @@ MimeEntityBegin 4702540 MimeEntityHeadersEnd 4702609 MimeContentBegin 4702609 MimeContentEnd 4778953 +Octets 76344 +Lines 1146 MimeEntityEnd 4778954 MultipartBoundaryBegin 4778954 MultipartBoundaryEnd 4778966 @@ -2019,11 +2526,16 @@ MimeEntityBegin 4778966 MimeEntityHeadersEnd 4778967 MimeContentBegin 4778967 MimeContentEnd 4778997 +Octets 30 +Lines 1 MimeEntityEnd 4778998 MultipartEndBoundaryBegin 4778998 MultipartEndBoundaryEnd 4779011 MultipartEpilogueBegin 4779011 MultipartEpilogueEnd 4779011 +MimeContentEnd 4779012 +Octets 76484 +Lines 1154 MimeEntityEnd 4779012 MimeMessageEnd 4779012 MboxMarkerBegin 4779012 @@ -2041,6 +2553,8 @@ MimeEntityBegin 4780273 MimeEntityHeadersEnd 4780317 MimeContentBegin 4780317 MimeContentEnd 4780769 +Octets 452 +Lines 9 MimeEntityEnd 4780770 MultipartBoundaryBegin 4780770 MultipartBoundaryEnd 4780808 @@ -2048,11 +2562,16 @@ MimeEntityBegin 4780808 MimeEntityHeadersEnd 4780901 MimeContentBegin 4780901 MimeContentEnd 4908644 +Octets 127743 +Lines 2096 MimeEntityEnd 4908645 MultipartEndBoundaryBegin 4908645 MultipartEndBoundaryEnd 4908684 MultipartEpilogueBegin 4908684 MultipartEpilogueEnd 4908685 +MimeContentEnd 4908686 +Octets 128451 +Lines 2115 MimeEntityEnd 4908686 MimeMessageEnd 4908686 MboxMarkerBegin 4908686 @@ -2070,6 +2589,8 @@ MimeEntityBegin 4909843 MimeEntityHeadersEnd 4909844 MimeContentBegin 4909844 MimeContentEnd 4910639 +Octets 795 +Lines 19 MimeEntityEnd 4910640 MultipartBoundaryBegin 4910640 MultipartBoundaryEnd 4910698 @@ -2084,6 +2605,8 @@ MimeEntityBegin 4910861 MimeEntityHeadersEnd 4910934 MimeContentBegin 4910934 MimeContentEnd 4911423 +Octets 489 +Lines 8 MimeEntityEnd 4911424 MultipartBoundaryBegin 4911424 MultipartBoundaryEnd 4911484 @@ -2091,6 +2614,8 @@ MimeEntityBegin 4911484 MimeEntityHeadersEnd 4911580 MimeContentBegin 4911580 MimeContentEnd 4924570 +Octets 12990 +Lines 191 MimeEntityEnd 4924571 MultipartBoundaryBegin 4924571 MultipartBoundaryEnd 4924631 @@ -2098,6 +2623,8 @@ MimeEntityBegin 4924631 MimeEntityHeadersEnd 4924701 MimeContentBegin 4924701 MimeContentEnd 4924721 +Octets 20 +Lines 2 MimeEntityEnd 4924722 MultipartBoundaryBegin 4924722 MultipartBoundaryEnd 4924782 @@ -2105,6 +2632,8 @@ MimeEntityBegin 4924782 MimeEntityHeadersEnd 4924878 MimeContentBegin 4924878 MimeContentEnd 4980598 +Octets 55720 +Lines 765 MimeEntityEnd 4980599 MultipartBoundaryBegin 4980599 MultipartBoundaryEnd 4980659 @@ -2112,6 +2641,8 @@ MimeEntityBegin 4980659 MimeEntityHeadersEnd 4980729 MimeContentBegin 4980729 MimeContentEnd 4980781 +Octets 52 +Lines 6 MimeEntityEnd 4980782 MultipartBoundaryBegin 4980782 MultipartBoundaryEnd 4980842 @@ -2119,6 +2650,8 @@ MimeEntityBegin 4980842 MimeEntityHeadersEnd 4980903 MimeContentBegin 4980903 MimeContentEnd 5083055 +Octets 102152 +Lines 1401 MimeEntityEnd 5083056 MultipartBoundaryBegin 5083056 MultipartBoundaryEnd 5083116 @@ -2126,16 +2659,24 @@ MimeEntityBegin 5083116 MimeEntityHeadersEnd 5083186 MimeContentBegin 5083186 MimeContentEnd 5083188 +Octets 2 +Lines 3 MimeEntityEnd 5083189 MultipartEndBoundaryBegin 5083189 MultipartEndBoundaryEnd 5083250 MultipartEpilogueBegin 5083250 MultipartEpilogueEnd 5083251 +MimeContentEnd 5083252 +Octets 172451 +Lines 2408 MimeEntityEnd 5083252 MultipartEndBoundaryBegin 5083252 MultipartEndBoundaryEnd 5083311 MultipartEpilogueBegin 5083311 MultipartEpilogueEnd 5083311 +MimeContentEnd 5083312 +Octets 173866 +Lines 2440 MimeEntityEnd 5083312 MimeMessageEnd 5083312 MboxMarkerBegin 5083312 @@ -2153,6 +2694,8 @@ MimeEntityBegin 5084201 MimeEntityHeadersEnd 5084245 MimeContentBegin 5084245 MimeContentEnd 5085760 +Octets 1515 +Lines 30 MimeEntityEnd 5085761 MultipartBoundaryBegin 5085761 MultipartBoundaryEnd 5085801 @@ -2167,6 +2710,8 @@ MimeEntityBegin 5085928 MimeEntityHeadersEnd 5086019 MimeContentBegin 5086019 MimeContentEnd 5086926 +Octets 907 +Lines 14 MimeEntityEnd 5086927 MultipartBoundaryBegin 5086927 MultipartBoundaryEnd 5086969 @@ -2174,6 +2719,8 @@ MimeEntityBegin 5086969 MimeEntityHeadersEnd 5087060 MimeContentBegin 5087060 MimeContentEnd 5121918 +Octets 34858 +Lines 507 MimeEntityEnd 5121919 MultipartBoundaryBegin 5121919 MultipartBoundaryEnd 5121961 @@ -2181,6 +2728,8 @@ MimeEntityBegin 5121961 MimeEntityHeadersEnd 5122052 MimeContentBegin 5122052 MimeContentEnd 5122062 +Octets 10 +Lines 3 MimeEntityEnd 5122063 MultipartBoundaryBegin 5122063 MultipartBoundaryEnd 5122105 @@ -2188,6 +2737,8 @@ MimeEntityBegin 5122105 MimeEntityHeadersEnd 5122196 MimeContentBegin 5122196 MimeContentEnd 5143530 +Octets 21334 +Lines 311 MimeEntityEnd 5143531 MultipartBoundaryBegin 5143531 MultipartBoundaryEnd 5143573 @@ -2195,6 +2746,8 @@ MimeEntityBegin 5143573 MimeEntityHeadersEnd 5143664 MimeContentBegin 5143664 MimeContentEnd 5143674 +Octets 10 +Lines 3 MimeEntityEnd 5143675 MultipartBoundaryBegin 5143675 MultipartBoundaryEnd 5143717 @@ -2202,6 +2755,8 @@ MimeEntityBegin 5143717 MimeEntityHeadersEnd 5143808 MimeContentBegin 5143808 MimeContentEnd 5176251 +Octets 32443 +Lines 472 MimeEntityEnd 5176252 MultipartBoundaryBegin 5176252 MultipartBoundaryEnd 5176294 @@ -2209,6 +2764,8 @@ MimeEntityBegin 5176294 MimeEntityHeadersEnd 5176385 MimeContentBegin 5176385 MimeContentEnd 5176395 +Octets 10 +Lines 3 MimeEntityEnd 5176396 MultipartBoundaryBegin 5176396 MultipartBoundaryEnd 5176438 @@ -2216,6 +2773,8 @@ MimeEntityBegin 5176438 MimeEntityHeadersEnd 5176529 MimeContentBegin 5176529 MimeContentEnd 5209970 +Octets 33441 +Lines 486 MimeEntityEnd 5209971 MultipartBoundaryBegin 5209971 MultipartBoundaryEnd 5210013 @@ -2223,6 +2782,8 @@ MimeEntityBegin 5210013 MimeEntityHeadersEnd 5210104 MimeContentBegin 5210104 MimeContentEnd 5210114 +Octets 10 +Lines 3 MimeEntityEnd 5210115 MultipartBoundaryBegin 5210115 MultipartBoundaryEnd 5210157 @@ -2230,6 +2791,8 @@ MimeEntityBegin 5210157 MimeEntityHeadersEnd 5210248 MimeContentBegin 5210248 MimeContentEnd 5238084 +Octets 27836 +Lines 405 MimeEntityEnd 5238085 MultipartBoundaryBegin 5238085 MultipartBoundaryEnd 5238127 @@ -2237,6 +2800,8 @@ MimeEntityBegin 5238127 MimeEntityHeadersEnd 5238218 MimeContentBegin 5238218 MimeContentEnd 5238228 +Octets 10 +Lines 3 MimeEntityEnd 5238229 MultipartBoundaryBegin 5238229 MultipartBoundaryEnd 5238271 @@ -2244,6 +2809,8 @@ MimeEntityBegin 5238271 MimeEntityHeadersEnd 5238362 MimeContentBegin 5238362 MimeContentEnd 5271856 +Octets 33494 +Lines 487 MimeEntityEnd 5271857 MultipartBoundaryBegin 5271857 MultipartBoundaryEnd 5271899 @@ -2251,6 +2818,8 @@ MimeEntityBegin 5271899 MimeEntityHeadersEnd 5271990 MimeContentBegin 5271990 MimeContentEnd 5272000 +Octets 10 +Lines 3 MimeEntityEnd 5272001 MultipartBoundaryBegin 5272001 MultipartBoundaryEnd 5272043 @@ -2258,6 +2827,8 @@ MimeEntityBegin 5272043 MimeEntityHeadersEnd 5272134 MimeContentBegin 5272134 MimeContentEnd 5298793 +Octets 26659 +Lines 388 MimeEntityEnd 5298794 MultipartBoundaryBegin 5298794 MultipartBoundaryEnd 5298836 @@ -2265,16 +2836,24 @@ MimeEntityBegin 5298836 MimeEntityHeadersEnd 5298927 MimeContentBegin 5298927 MimeContentEnd 5299001 +Octets 74 +Lines 4 MimeEntityEnd 5299002 MultipartEndBoundaryBegin 5299002 MultipartEndBoundaryEnd 5299045 MultipartEpilogueBegin 5299045 MultipartEpilogueEnd 5299046 +MimeContentEnd 5299047 +Octets 213161 +Lines 3161 MimeEntityEnd 5299047 MultipartEndBoundaryBegin 5299047 MultipartEndBoundaryEnd 5299088 MultipartEpilogueBegin 5299088 MultipartEpilogueEnd 5299088 +MimeContentEnd 5299089 +Octets 215083 +Lines 3202 MimeEntityEnd 5299089 MimeMessageEnd 5299089 MboxMarkerBegin 5299089 @@ -2292,6 +2871,8 @@ MimeEntityBegin 5299733 MimeEntityHeadersEnd 5299828 MimeContentBegin 5299828 MimeContentEnd 5300031 +Octets 203 +Lines 10 MimeEntityEnd 5300032 MultipartBoundaryBegin 5300032 MultipartBoundaryEnd 5300081 @@ -2299,6 +2880,8 @@ MimeEntityBegin 5300081 MimeEntityHeadersEnd 5300142 MimeContentBegin 5300142 MimeContentEnd 5388740 +Octets 88598 +Lines 1215 MimeEntityEnd 5388741 MultipartBoundaryBegin 5388741 MultipartBoundaryEnd 5388790 @@ -2306,11 +2889,16 @@ MimeEntityBegin 5388790 MimeEntityHeadersEnd 5388816 MimeContentBegin 5388816 MimeContentEnd 5388846 +Octets 30 +Lines 2 MimeEntityEnd 5388847 MultipartEndBoundaryBegin 5388847 MultipartEndBoundaryEnd 5388897 MultipartEpilogueBegin 5388897 MultipartEpilogueEnd 5388898 +MimeContentEnd 5388899 +Octets 89410 +Lines 1244 MimeEntityEnd 5388899 MimeMessageEnd 5388899 MboxMarkerBegin 5388899 @@ -2321,6 +2909,8 @@ MimeEntityBegin 5388907 MimeEntityHeadersEnd 5389843 MimeContentBegin 5389843 MimeContentEnd 5440552 +Octets 50709 +Lines 697 MimeEntityEnd 5440553 MimeMessageEnd 5440553 MboxMarkerBegin 5440553 @@ -2338,6 +2928,8 @@ MimeEntityBegin 5441191 MimeEntityHeadersEnd 5441192 MimeContentBegin 5441192 MimeContentEnd 5445509 +Octets 4317 +Lines 102 MimeEntityEnd 5445510 MultipartBoundaryBegin 5445510 MultipartBoundaryEnd 5445528 @@ -2357,9 +2949,13 @@ MimeEntityBegin 5445701 MimeEntityHeadersEnd 5445806 MimeContentBegin 5445806 MimeContentEnd 5446427 +Octets 621 +Lines 19 MimeEntityEnd 5446428 MimeMessageEnd 5446428 MimeContentEnd 5446428 +Octets 727 +Lines 23 MimeEntityEnd 5446428 MultipartBoundaryBegin 5446428 MultipartBoundaryEnd 5446459 @@ -2372,9 +2968,13 @@ MimeEntityBegin 5446460 MimeEntityHeadersEnd 5446581 MimeContentBegin 5446581 MimeContentEnd 5447314 +Octets 733 +Lines 21 MimeEntityEnd 5447315 MimeMessageEnd 5447315 MimeContentEnd 5447315 +Octets 855 +Lines 25 MimeEntityEnd 5447315 MultipartBoundaryBegin 5447315 MultipartBoundaryEnd 5447346 @@ -2387,9 +2987,13 @@ MimeEntityBegin 5447347 MimeEntityHeadersEnd 5447466 MimeContentBegin 5447466 MimeContentEnd 5448112 +Octets 646 +Lines 15 MimeEntityEnd 5448113 MimeMessageEnd 5448113 MimeContentEnd 5448113 +Octets 766 +Lines 19 MimeEntityEnd 5448113 MultipartBoundaryBegin 5448113 MultipartBoundaryEnd 5448144 @@ -2402,9 +3006,13 @@ MimeEntityBegin 5448145 MimeEntityHeadersEnd 5448301 MimeContentBegin 5448301 MimeContentEnd 5448784 +Octets 483 +Lines 11 MimeEntityEnd 5448785 MimeMessageEnd 5448785 MimeContentEnd 5448785 +Octets 640 +Lines 15 MimeEntityEnd 5448785 MultipartBoundaryBegin 5448785 MultipartBoundaryEnd 5448816 @@ -2417,9 +3025,13 @@ MimeEntityBegin 5448817 MimeEntityHeadersEnd 5448971 MimeContentBegin 5448971 MimeContentEnd 5449543 +Octets 572 +Lines 16 MimeEntityEnd 5449544 MimeMessageEnd 5449544 MimeContentEnd 5449544 +Octets 727 +Lines 20 MimeEntityEnd 5449544 MultipartBoundaryBegin 5449544 MultipartBoundaryEnd 5449575 @@ -2432,9 +3044,13 @@ MimeEntityBegin 5449576 MimeEntityHeadersEnd 5449733 MimeContentBegin 5449733 MimeContentEnd 5451008 +Octets 1275 +Lines 27 MimeEntityEnd 5451009 MimeMessageEnd 5451009 MimeContentEnd 5451009 +Octets 1433 +Lines 31 MimeEntityEnd 5451009 MultipartBoundaryBegin 5451009 MultipartBoundaryEnd 5451040 @@ -2447,9 +3063,13 @@ MimeEntityBegin 5451041 MimeEntityHeadersEnd 5451194 MimeContentBegin 5451194 MimeContentEnd 5451595 +Octets 401 +Lines 10 MimeEntityEnd 5451596 MimeMessageEnd 5451596 MimeContentEnd 5451596 +Octets 555 +Lines 14 MimeEntityEnd 5451596 MultipartBoundaryBegin 5451596 MultipartBoundaryEnd 5451627 @@ -2462,9 +3082,13 @@ MimeEntityBegin 5451628 MimeEntityHeadersEnd 5451775 MimeContentBegin 5451775 MimeContentEnd 5452171 +Octets 396 +Lines 8 MimeEntityEnd 5452172 MimeMessageEnd 5452172 MimeContentEnd 5452172 +Octets 544 +Lines 12 MimeEntityEnd 5452172 MultipartBoundaryBegin 5452172 MultipartBoundaryEnd 5452203 @@ -2477,9 +3101,13 @@ MimeEntityBegin 5452204 MimeEntityHeadersEnd 5452347 MimeContentBegin 5452347 MimeContentEnd 5452987 +Octets 640 +Lines 12 MimeEntityEnd 5452988 MimeMessageEnd 5452988 MimeContentEnd 5452988 +Octets 784 +Lines 16 MimeEntityEnd 5452988 MultipartBoundaryBegin 5452988 MultipartBoundaryEnd 5453019 @@ -2492,9 +3120,13 @@ MimeEntityBegin 5453020 MimeEntityHeadersEnd 5453157 MimeContentBegin 5453157 MimeContentEnd 5454134 +Octets 977 +Lines 20 MimeEntityEnd 5454135 MimeMessageEnd 5454135 MimeContentEnd 5454135 +Octets 1115 +Lines 24 MimeEntityEnd 5454135 MultipartBoundaryBegin 5454135 MultipartBoundaryEnd 5454166 @@ -2507,9 +3139,13 @@ MimeEntityBegin 5454167 MimeEntityHeadersEnd 5454314 MimeContentBegin 5454314 MimeContentEnd 5455204 +Octets 890 +Lines 28 MimeEntityEnd 5455205 MimeMessageEnd 5455205 MimeContentEnd 5455205 +Octets 1038 +Lines 32 MimeEntityEnd 5455205 MultipartBoundaryBegin 5455205 MultipartBoundaryEnd 5455236 @@ -2522,9 +3158,13 @@ MimeEntityBegin 5455237 MimeEntityHeadersEnd 5455368 MimeContentBegin 5455368 MimeContentEnd 5455927 +Octets 559 +Lines 12 MimeEntityEnd 5455928 MimeMessageEnd 5455928 MimeContentEnd 5455928 +Octets 691 +Lines 16 MimeEntityEnd 5455928 MultipartBoundaryBegin 5455928 MultipartBoundaryEnd 5455959 @@ -2537,9 +3177,13 @@ MimeEntityBegin 5455960 MimeEntityHeadersEnd 5456092 MimeContentBegin 5456092 MimeContentEnd 5456529 +Octets 437 +Lines 11 MimeEntityEnd 5456530 MimeMessageEnd 5456530 MimeContentEnd 5456530 +Octets 570 +Lines 15 MimeEntityEnd 5456530 MultipartBoundaryBegin 5456530 MultipartBoundaryEnd 5456561 @@ -2552,9 +3196,13 @@ MimeEntityBegin 5456562 MimeEntityHeadersEnd 5456679 MimeContentBegin 5456679 MimeContentEnd 5457231 +Octets 552 +Lines 16 MimeEntityEnd 5457232 MimeMessageEnd 5457232 MimeContentEnd 5457232 +Octets 670 +Lines 20 MimeEntityEnd 5457232 MultipartBoundaryBegin 5457232 MultipartBoundaryEnd 5457263 @@ -2567,9 +3215,13 @@ MimeEntityBegin 5457264 MimeEntityHeadersEnd 5457379 MimeContentBegin 5457379 MimeContentEnd 5457564 +Octets 185 +Lines 9 MimeEntityEnd 5457565 MimeMessageEnd 5457565 MimeContentEnd 5457565 +Octets 301 +Lines 13 MimeEntityEnd 5457565 MultipartBoundaryBegin 5457565 MultipartBoundaryEnd 5457596 @@ -2582,9 +3234,13 @@ MimeEntityBegin 5457597 MimeEntityHeadersEnd 5457714 MimeContentBegin 5457714 MimeContentEnd 5458042 +Octets 328 +Lines 8 MimeEntityEnd 5458043 MimeMessageEnd 5458043 MimeContentEnd 5458043 +Octets 446 +Lines 12 MimeEntityEnd 5458043 MultipartBoundaryBegin 5458043 MultipartBoundaryEnd 5458074 @@ -2597,9 +3253,13 @@ MimeEntityBegin 5458075 MimeEntityHeadersEnd 5458198 MimeContentBegin 5458198 MimeContentEnd 5458865 +Octets 667 +Lines 22 MimeEntityEnd 5458866 MimeMessageEnd 5458866 MimeContentEnd 5458866 +Octets 791 +Lines 26 MimeEntityEnd 5458866 MultipartBoundaryBegin 5458866 MultipartBoundaryEnd 5458897 @@ -2612,9 +3272,13 @@ MimeEntityBegin 5458898 MimeEntityHeadersEnd 5459022 MimeContentBegin 5459022 MimeContentEnd 5459124 +Octets 102 +Lines 6 MimeEntityEnd 5459125 MimeMessageEnd 5459125 MimeContentEnd 5459125 +Octets 227 +Lines 10 MimeEntityEnd 5459125 MultipartBoundaryBegin 5459125 MultipartBoundaryEnd 5459156 @@ -2627,9 +3291,13 @@ MimeEntityBegin 5459157 MimeEntityHeadersEnd 5459299 MimeContentBegin 5459299 MimeContentEnd 5460135 +Octets 836 +Lines 22 MimeEntityEnd 5460136 MimeMessageEnd 5460136 MimeContentEnd 5460136 +Octets 979 +Lines 26 MimeEntityEnd 5460136 MultipartBoundaryBegin 5460136 MultipartBoundaryEnd 5460167 @@ -2642,9 +3310,13 @@ MimeEntityBegin 5460168 MimeEntityHeadersEnd 5460278 MimeContentBegin 5460278 MimeContentEnd 5460697 +Octets 419 +Lines 10 MimeEntityEnd 5460698 MimeMessageEnd 5460698 MimeContentEnd 5460698 +Octets 530 +Lines 14 MimeEntityEnd 5460698 MultipartBoundaryBegin 5460698 MultipartBoundaryEnd 5460729 @@ -2657,9 +3329,13 @@ MimeEntityBegin 5460730 MimeEntityHeadersEnd 5460902 MimeContentBegin 5460902 MimeContentEnd 5461132 +Octets 230 +Lines 10 MimeEntityEnd 5461133 MimeMessageEnd 5461133 MimeContentEnd 5461133 +Octets 403 +Lines 14 MimeEntityEnd 5461133 MultipartBoundaryBegin 5461133 MultipartBoundaryEnd 5461164 @@ -2672,9 +3348,13 @@ MimeEntityBegin 5461165 MimeEntityHeadersEnd 5461291 MimeContentBegin 5461291 MimeContentEnd 5461690 +Octets 399 +Lines 13 MimeEntityEnd 5461691 MimeMessageEnd 5461691 MimeContentEnd 5461691 +Octets 526 +Lines 17 MimeEntityEnd 5461691 MultipartBoundaryBegin 5461691 MultipartBoundaryEnd 5461722 @@ -2687,9 +3367,13 @@ MimeEntityBegin 5461723 MimeEntityHeadersEnd 5461840 MimeContentBegin 5461840 MimeContentEnd 5462744 +Octets 904 +Lines 29 MimeEntityEnd 5462745 MimeMessageEnd 5462745 MimeContentEnd 5462745 +Octets 1022 +Lines 33 MimeEntityEnd 5462745 MultipartBoundaryBegin 5462745 MultipartBoundaryEnd 5462776 @@ -2702,9 +3386,13 @@ MimeEntityBegin 5462777 MimeEntityHeadersEnd 5462905 MimeContentBegin 5462905 MimeContentEnd 5463196 +Octets 291 +Lines 10 MimeEntityEnd 5463197 MimeMessageEnd 5463197 MimeContentEnd 5463197 +Octets 420 +Lines 14 MimeEntityEnd 5463197 MultipartBoundaryBegin 5463197 MultipartBoundaryEnd 5463228 @@ -2717,9 +3405,13 @@ MimeEntityBegin 5463229 MimeEntityHeadersEnd 5463358 MimeContentBegin 5463358 MimeContentEnd 5463768 +Octets 410 +Lines 15 MimeEntityEnd 5463769 MimeMessageEnd 5463769 MimeContentEnd 5463769 +Octets 540 +Lines 19 MimeEntityEnd 5463769 MultipartBoundaryBegin 5463769 MultipartBoundaryEnd 5463800 @@ -2732,9 +3424,13 @@ MimeEntityBegin 5463801 MimeEntityHeadersEnd 5463916 MimeContentBegin 5463916 MimeContentEnd 5464061 +Octets 145 +Lines 5 MimeEntityEnd 5464062 MimeMessageEnd 5464062 MimeContentEnd 5464062 +Octets 261 +Lines 9 MimeEntityEnd 5464062 MultipartBoundaryBegin 5464062 MultipartBoundaryEnd 5464093 @@ -2747,9 +3443,13 @@ MimeEntityBegin 5464094 MimeEntityHeadersEnd 5464219 MimeContentBegin 5464219 MimeContentEnd 5464398 +Octets 179 +Lines 8 MimeEntityEnd 5464399 MimeMessageEnd 5464399 MimeContentEnd 5464399 +Octets 305 +Lines 12 MimeEntityEnd 5464399 MultipartBoundaryBegin 5464399 MultipartBoundaryEnd 5464430 @@ -2762,9 +3462,13 @@ MimeEntityBegin 5464431 MimeEntityHeadersEnd 5464561 MimeContentBegin 5464561 MimeContentEnd 5465277 +Octets 716 +Lines 15 MimeEntityEnd 5465278 MimeMessageEnd 5465278 MimeContentEnd 5465278 +Octets 847 +Lines 19 MimeEntityEnd 5465278 MultipartBoundaryBegin 5465278 MultipartBoundaryEnd 5465309 @@ -2777,9 +3481,13 @@ MimeEntityBegin 5465310 MimeEntityHeadersEnd 5465456 MimeContentBegin 5465456 MimeContentEnd 5466413 +Octets 957 +Lines 27 MimeEntityEnd 5466414 MimeMessageEnd 5466414 MimeContentEnd 5466414 +Octets 1104 +Lines 31 MimeEntityEnd 5466414 MultipartBoundaryBegin 5466414 MultipartBoundaryEnd 5466445 @@ -2792,9 +3500,13 @@ MimeEntityBegin 5466446 MimeEntityHeadersEnd 5466580 MimeContentBegin 5466580 MimeContentEnd 5466827 +Octets 247 +Lines 8 MimeEntityEnd 5466828 MimeMessageEnd 5466828 MimeContentEnd 5466828 +Octets 382 +Lines 12 MimeEntityEnd 5466828 MultipartBoundaryBegin 5466828 MultipartBoundaryEnd 5466859 @@ -2807,9 +3519,13 @@ MimeEntityBegin 5466860 MimeEntityHeadersEnd 5466982 MimeContentBegin 5466982 MimeContentEnd 5467109 +Octets 127 +Lines 7 MimeEntityEnd 5467110 MimeMessageEnd 5467110 MimeContentEnd 5467110 +Octets 250 +Lines 11 MimeEntityEnd 5467110 MultipartBoundaryBegin 5467110 MultipartBoundaryEnd 5467141 @@ -2822,9 +3538,13 @@ MimeEntityBegin 5467142 MimeEntityHeadersEnd 5467317 MimeContentBegin 5467317 MimeContentEnd 5468062 +Octets 745 +Lines 17 MimeEntityEnd 5468063 MimeMessageEnd 5468063 MimeContentEnd 5468063 +Octets 921 +Lines 22 MimeEntityEnd 5468063 MultipartBoundaryBegin 5468063 MultipartBoundaryEnd 5468094 @@ -2837,9 +3557,13 @@ MimeEntityBegin 5468095 MimeEntityHeadersEnd 5468255 MimeContentBegin 5468255 MimeContentEnd 5468654 +Octets 399 +Lines 17 MimeEntityEnd 5468655 MimeMessageEnd 5468655 MimeContentEnd 5468655 +Octets 560 +Lines 21 MimeEntityEnd 5468655 MultipartBoundaryBegin 5468655 MultipartBoundaryEnd 5468686 @@ -2852,9 +3576,13 @@ MimeEntityBegin 5468687 MimeEntityHeadersEnd 5468819 MimeContentBegin 5468819 MimeContentEnd 5470106 +Octets 1287 +Lines 22 MimeEntityEnd 5470107 MimeMessageEnd 5470107 MimeContentEnd 5470107 +Octets 1420 +Lines 26 MimeEntityEnd 5470107 MultipartBoundaryBegin 5470107 MultipartBoundaryEnd 5470138 @@ -2867,9 +3595,13 @@ MimeEntityBegin 5470139 MimeEntityHeadersEnd 5470245 MimeContentBegin 5470245 MimeContentEnd 5470388 +Octets 143 +Lines 7 MimeEntityEnd 5470389 MimeMessageEnd 5470389 MimeContentEnd 5470389 +Octets 250 +Lines 11 MimeEntityEnd 5470389 MultipartBoundaryBegin 5470389 MultipartBoundaryEnd 5470420 @@ -2882,9 +3614,13 @@ MimeEntityBegin 5470421 MimeEntityHeadersEnd 5470558 MimeContentBegin 5470558 MimeContentEnd 5470857 +Octets 299 +Lines 12 MimeEntityEnd 5470858 MimeMessageEnd 5470858 MimeContentEnd 5470858 +Octets 437 +Lines 16 MimeEntityEnd 5470858 MultipartBoundaryBegin 5470858 MultipartBoundaryEnd 5470889 @@ -2897,9 +3633,13 @@ MimeEntityBegin 5470890 MimeEntityHeadersEnd 5471016 MimeContentBegin 5471016 MimeContentEnd 5471203 +Octets 187 +Lines 7 MimeEntityEnd 5471204 MimeMessageEnd 5471204 MimeContentEnd 5471204 +Octets 314 +Lines 11 MimeEntityEnd 5471204 MultipartBoundaryBegin 5471204 MultipartBoundaryEnd 5471235 @@ -2912,9 +3652,13 @@ MimeEntityBegin 5471236 MimeEntityHeadersEnd 5471341 MimeContentBegin 5471341 MimeContentEnd 5471739 +Octets 398 +Lines 13 MimeEntityEnd 5471740 MimeMessageEnd 5471740 MimeContentEnd 5471740 +Octets 504 +Lines 17 MimeEntityEnd 5471740 MultipartBoundaryBegin 5471740 MultipartBoundaryEnd 5471771 @@ -2927,9 +3671,13 @@ MimeEntityBegin 5471772 MimeEntityHeadersEnd 5471906 MimeContentBegin 5471906 MimeContentEnd 5472208 +Octets 302 +Lines 9 MimeEntityEnd 5472209 MimeMessageEnd 5472209 MimeContentEnd 5472209 +Octets 437 +Lines 13 MimeEntityEnd 5472209 MultipartBoundaryBegin 5472209 MultipartBoundaryEnd 5472240 @@ -2942,9 +3690,13 @@ MimeEntityBegin 5472241 MimeEntityHeadersEnd 5472384 MimeContentBegin 5472384 MimeContentEnd 5473002 +Octets 618 +Lines 18 MimeEntityEnd 5473003 MimeMessageEnd 5473003 MimeContentEnd 5473003 +Octets 762 +Lines 22 MimeEntityEnd 5473003 MultipartBoundaryBegin 5473003 MultipartBoundaryEnd 5473034 @@ -2957,9 +3709,13 @@ MimeEntityBegin 5473035 MimeEntityHeadersEnd 5473188 MimeContentBegin 5473188 MimeContentEnd 5473663 +Octets 475 +Lines 11 MimeEntityEnd 5473664 MimeMessageEnd 5473664 MimeContentEnd 5473664 +Octets 629 +Lines 15 MimeEntityEnd 5473664 MultipartBoundaryBegin 5473664 MultipartBoundaryEnd 5473695 @@ -2972,9 +3728,13 @@ MimeEntityBegin 5473696 MimeEntityHeadersEnd 5473829 MimeContentBegin 5473829 MimeContentEnd 5475001 +Octets 1172 +Lines 28 MimeEntityEnd 5475002 MimeMessageEnd 5475002 MimeContentEnd 5475002 +Octets 1306 +Lines 32 MimeEntityEnd 5475002 MultipartBoundaryBegin 5475002 MultipartBoundaryEnd 5475033 @@ -2987,9 +3747,13 @@ MimeEntityBegin 5475034 MimeEntityHeadersEnd 5475210 MimeContentBegin 5475210 MimeContentEnd 5475469 +Octets 259 +Lines 9 MimeEntityEnd 5475470 MimeMessageEnd 5475470 MimeContentEnd 5475470 +Octets 436 +Lines 13 MimeEntityEnd 5475470 MultipartBoundaryBegin 5475470 MultipartBoundaryEnd 5475501 @@ -3002,9 +3766,13 @@ MimeEntityBegin 5475502 MimeEntityHeadersEnd 5475617 MimeContentBegin 5475617 MimeContentEnd 5475810 +Octets 193 +Lines 5 MimeEntityEnd 5475811 MimeMessageEnd 5475811 MimeContentEnd 5475811 +Octets 309 +Lines 9 MimeEntityEnd 5475811 MultipartBoundaryBegin 5475811 MultipartBoundaryEnd 5475842 @@ -3017,9 +3785,13 @@ MimeEntityBegin 5475843 MimeEntityHeadersEnd 5475983 MimeContentBegin 5475983 MimeContentEnd 5476848 +Octets 865 +Lines 25 MimeEntityEnd 5476849 MimeMessageEnd 5476849 MimeContentEnd 5476849 +Octets 1006 +Lines 29 MimeEntityEnd 5476849 MultipartBoundaryBegin 5476849 MultipartBoundaryEnd 5476880 @@ -3032,9 +3804,13 @@ MimeEntityBegin 5476881 MimeEntityHeadersEnd 5477006 MimeContentBegin 5477006 MimeContentEnd 5477720 +Octets 714 +Lines 12 MimeEntityEnd 5477721 MimeMessageEnd 5477721 MimeContentEnd 5477721 +Octets 840 +Lines 16 MimeEntityEnd 5477721 MultipartBoundaryBegin 5477721 MultipartBoundaryEnd 5477752 @@ -3047,9 +3823,13 @@ MimeEntityBegin 5477753 MimeEntityHeadersEnd 5477865 MimeContentBegin 5477865 MimeContentEnd 5478568 +Octets 703 +Lines 18 MimeEntityEnd 5478569 MimeMessageEnd 5478569 MimeContentEnd 5478569 +Octets 816 +Lines 22 MimeEntityEnd 5478569 MultipartBoundaryBegin 5478569 MultipartBoundaryEnd 5478600 @@ -3062,9 +3842,13 @@ MimeEntityBegin 5478601 MimeEntityHeadersEnd 5478733 MimeContentBegin 5478733 MimeContentEnd 5479113 +Octets 380 +Lines 12 MimeEntityEnd 5479114 MimeMessageEnd 5479114 MimeContentEnd 5479114 +Octets 513 +Lines 16 MimeEntityEnd 5479114 MultipartBoundaryBegin 5479114 MultipartBoundaryEnd 5479145 @@ -3077,9 +3861,13 @@ MimeEntityBegin 5479146 MimeEntityHeadersEnd 5479282 MimeContentBegin 5479282 MimeContentEnd 5480259 +Octets 977 +Lines 25 MimeEntityEnd 5480260 MimeMessageEnd 5480260 MimeContentEnd 5480260 +Octets 1114 +Lines 29 MimeEntityEnd 5480260 MultipartBoundaryBegin 5480260 MultipartBoundaryEnd 5480291 @@ -3092,9 +3880,13 @@ MimeEntityBegin 5480292 MimeEntityHeadersEnd 5480437 MimeContentBegin 5480437 MimeContentEnd 5480904 +Octets 467 +Lines 11 MimeEntityEnd 5480905 MimeMessageEnd 5480905 MimeContentEnd 5480905 +Octets 613 +Lines 15 MimeEntityEnd 5480905 MultipartBoundaryBegin 5480905 MultipartBoundaryEnd 5480936 @@ -3107,9 +3899,13 @@ MimeEntityBegin 5480937 MimeEntityHeadersEnd 5481070 MimeContentBegin 5481070 MimeContentEnd 5481349 +Octets 279 +Lines 11 MimeEntityEnd 5481350 MimeMessageEnd 5481350 MimeContentEnd 5481350 +Octets 413 +Lines 15 MimeEntityEnd 5481350 MultipartBoundaryBegin 5481350 MultipartBoundaryEnd 5481381 @@ -3122,9 +3918,13 @@ MimeEntityBegin 5481382 MimeEntityHeadersEnd 5481507 MimeContentBegin 5481507 MimeContentEnd 5481789 +Octets 282 +Lines 5 MimeEntityEnd 5481790 MimeMessageEnd 5481790 MimeContentEnd 5481790 +Octets 408 +Lines 9 MimeEntityEnd 5481790 MultipartBoundaryBegin 5481790 MultipartBoundaryEnd 5481821 @@ -3137,9 +3937,13 @@ MimeEntityBegin 5481822 MimeEntityHeadersEnd 5481943 MimeContentBegin 5481943 MimeContentEnd 5482586 +Octets 643 +Lines 28 MimeEntityEnd 5482587 MimeMessageEnd 5482587 MimeContentEnd 5482587 +Octets 765 +Lines 32 MimeEntityEnd 5482587 MultipartBoundaryBegin 5482587 MultipartBoundaryEnd 5482618 @@ -3152,9 +3956,13 @@ MimeEntityBegin 5482619 MimeEntityHeadersEnd 5482763 MimeContentBegin 5482763 MimeContentEnd 5485021 +Octets 2258 +Lines 47 MimeEntityEnd 5485022 MimeMessageEnd 5485022 MimeContentEnd 5485022 +Octets 2403 +Lines 51 MimeEntityEnd 5485022 MultipartBoundaryBegin 5485022 MultipartBoundaryEnd 5485053 @@ -3167,9 +3975,13 @@ MimeEntityBegin 5485054 MimeEntityHeadersEnd 5485176 MimeContentBegin 5485176 MimeContentEnd 5485968 +Octets 792 +Lines 18 MimeEntityEnd 5485969 MimeMessageEnd 5485969 MimeContentEnd 5485969 +Octets 915 +Lines 22 MimeEntityEnd 5485969 MultipartBoundaryBegin 5485969 MultipartBoundaryEnd 5486000 @@ -3182,9 +3994,13 @@ MimeEntityBegin 5486001 MimeEntityHeadersEnd 5486095 MimeContentBegin 5486095 MimeContentEnd 5486321 +Octets 226 +Lines 11 MimeEntityEnd 5486322 MimeMessageEnd 5486322 MimeContentEnd 5486322 +Octets 321 +Lines 15 MimeEntityEnd 5486322 MultipartBoundaryBegin 5486322 MultipartBoundaryEnd 5486353 @@ -3197,9 +4013,13 @@ MimeEntityBegin 5486354 MimeEntityHeadersEnd 5486475 MimeContentBegin 5486475 MimeContentEnd 5487143 +Octets 668 +Lines 21 MimeEntityEnd 5487144 MimeMessageEnd 5487144 MimeContentEnd 5487144 +Octets 790 +Lines 25 MimeEntityEnd 5487144 MultipartBoundaryBegin 5487144 MultipartBoundaryEnd 5487175 @@ -3212,9 +4032,13 @@ MimeEntityBegin 5487176 MimeEntityHeadersEnd 5487286 MimeContentBegin 5487286 MimeContentEnd 5489833 +Octets 2547 +Lines 69 MimeEntityEnd 5489834 MimeMessageEnd 5489834 MimeContentEnd 5489834 +Octets 2658 +Lines 73 MimeEntityEnd 5489834 MultipartBoundaryBegin 5489834 MultipartBoundaryEnd 5489865 @@ -3227,9 +4051,13 @@ MimeEntityBegin 5489866 MimeEntityHeadersEnd 5489972 MimeContentBegin 5489972 MimeContentEnd 5491181 +Octets 1209 +Lines 35 MimeEntityEnd 5491182 MimeMessageEnd 5491182 MimeContentEnd 5491182 +Octets 1316 +Lines 39 MimeEntityEnd 5491182 MultipartBoundaryBegin 5491182 MultipartBoundaryEnd 5491213 @@ -3242,9 +4070,13 @@ MimeEntityBegin 5491214 MimeEntityHeadersEnd 5491320 MimeContentBegin 5491320 MimeContentEnd 5493117 +Octets 1797 +Lines 44 MimeEntityEnd 5493118 MimeMessageEnd 5493118 MimeContentEnd 5493118 +Octets 1904 +Lines 48 MimeEntityEnd 5493118 MultipartBoundaryBegin 5493118 MultipartBoundaryEnd 5493149 @@ -3257,9 +4089,13 @@ MimeEntityBegin 5493150 MimeEntityHeadersEnd 5493279 MimeContentBegin 5493279 MimeContentEnd 5493849 +Octets 570 +Lines 13 MimeEntityEnd 5493850 MimeMessageEnd 5493850 MimeContentEnd 5493850 +Octets 700 +Lines 17 MimeEntityEnd 5493850 MultipartBoundaryBegin 5493850 MultipartBoundaryEnd 5493881 @@ -3272,9 +4108,13 @@ MimeEntityBegin 5493882 MimeEntityHeadersEnd 5493970 MimeContentBegin 5493970 MimeContentEnd 5495304 +Octets 1334 +Lines 21 MimeEntityEnd 5495305 MimeMessageEnd 5495305 MimeContentEnd 5495305 +Octets 1423 +Lines 25 MimeEntityEnd 5495305 MultipartBoundaryBegin 5495305 MultipartBoundaryEnd 5495336 @@ -3287,9 +4127,13 @@ MimeEntityBegin 5495337 MimeEntityHeadersEnd 5495453 MimeContentBegin 5495453 MimeContentEnd 5497580 +Octets 2127 +Lines 50 MimeEntityEnd 5497581 MimeMessageEnd 5497581 MimeContentEnd 5497581 +Octets 2244 +Lines 54 MimeEntityEnd 5497581 MultipartBoundaryBegin 5497581 MultipartBoundaryEnd 5497612 @@ -3302,9 +4146,13 @@ MimeEntityBegin 5497613 MimeEntityHeadersEnd 5497734 MimeContentBegin 5497734 MimeContentEnd 5499755 +Octets 2021 +Lines 43 MimeEntityEnd 5499756 MimeMessageEnd 5499756 MimeContentEnd 5499756 +Octets 2143 +Lines 47 MimeEntityEnd 5499756 MultipartBoundaryBegin 5499756 MultipartBoundaryEnd 5499787 @@ -3317,9 +4165,13 @@ MimeEntityBegin 5499788 MimeEntityHeadersEnd 5499909 MimeContentBegin 5499909 MimeContentEnd 5500586 +Octets 677 +Lines 20 MimeEntityEnd 5500587 MimeMessageEnd 5500587 MimeContentEnd 5500587 +Octets 799 +Lines 24 MimeEntityEnd 5500587 MultipartBoundaryBegin 5500587 MultipartBoundaryEnd 5500618 @@ -3332,9 +4184,13 @@ MimeEntityBegin 5500619 MimeEntityHeadersEnd 5500756 MimeContentBegin 5500756 MimeContentEnd 5501576 +Octets 820 +Lines 17 MimeEntityEnd 5501577 MimeMessageEnd 5501577 MimeContentEnd 5501577 +Octets 958 +Lines 21 MimeEntityEnd 5501577 MultipartBoundaryBegin 5501577 MultipartBoundaryEnd 5501608 @@ -3347,9 +4203,13 @@ MimeEntityBegin 5501609 MimeEntityHeadersEnd 5501733 MimeContentBegin 5501733 MimeContentEnd 5502457 +Octets 724 +Lines 22 MimeEntityEnd 5502458 MimeMessageEnd 5502458 MimeContentEnd 5502458 +Octets 849 +Lines 26 MimeEntityEnd 5502458 MultipartBoundaryBegin 5502458 MultipartBoundaryEnd 5502489 @@ -3362,9 +4222,13 @@ MimeEntityBegin 5502490 MimeEntityHeadersEnd 5502592 MimeContentBegin 5502592 MimeContentEnd 5503332 +Octets 740 +Lines 17 MimeEntityEnd 5503333 MimeMessageEnd 5503333 MimeContentEnd 5503333 +Octets 843 +Lines 21 MimeEntityEnd 5503333 MultipartBoundaryBegin 5503333 MultipartBoundaryEnd 5503364 @@ -3377,9 +4241,13 @@ MimeEntityBegin 5503365 MimeEntityHeadersEnd 5503521 MimeContentBegin 5503521 MimeContentEnd 5503880 +Octets 359 +Lines 8 MimeEntityEnd 5503881 MimeMessageEnd 5503881 MimeContentEnd 5503881 +Octets 516 +Lines 13 MimeEntityEnd 5503881 MultipartBoundaryBegin 5503881 MultipartBoundaryEnd 5503912 @@ -3392,9 +4260,13 @@ MimeEntityBegin 5503913 MimeEntityHeadersEnd 5504000 MimeContentBegin 5504000 MimeContentEnd 5504635 +Octets 635 +Lines 16 MimeEntityEnd 5504636 MimeMessageEnd 5504636 MimeContentEnd 5504636 +Octets 723 +Lines 20 MimeEntityEnd 5504636 MultipartBoundaryBegin 5504636 MultipartBoundaryEnd 5504667 @@ -3407,9 +4279,13 @@ MimeEntityBegin 5504668 MimeEntityHeadersEnd 5504817 MimeContentBegin 5504817 MimeContentEnd 5505183 +Octets 366 +Lines 18 MimeEntityEnd 5505184 MimeMessageEnd 5505184 MimeContentEnd 5505184 +Octets 516 +Lines 22 MimeEntityEnd 5505184 MultipartBoundaryBegin 5505184 MultipartBoundaryEnd 5505215 @@ -3422,9 +4298,13 @@ MimeEntityBegin 5505216 MimeEntityHeadersEnd 5505317 MimeContentBegin 5505317 MimeContentEnd 5505605 +Octets 288 +Lines 7 MimeEntityEnd 5505606 MimeMessageEnd 5505606 MimeContentEnd 5505606 +Octets 390 +Lines 11 MimeEntityEnd 5505606 MultipartBoundaryBegin 5505606 MultipartBoundaryEnd 5505637 @@ -3437,9 +4317,13 @@ MimeEntityBegin 5505638 MimeEntityHeadersEnd 5505766 MimeContentBegin 5505766 MimeContentEnd 5506245 +Octets 479 +Lines 17 MimeEntityEnd 5506246 MimeMessageEnd 5506246 MimeContentEnd 5506246 +Octets 608 +Lines 21 MimeEntityEnd 5506246 MultipartBoundaryBegin 5506246 MultipartBoundaryEnd 5506277 @@ -3452,9 +4336,13 @@ MimeEntityBegin 5506278 MimeEntityHeadersEnd 5506375 MimeContentBegin 5506375 MimeContentEnd 5506755 +Octets 380 +Lines 20 MimeEntityEnd 5506756 MimeMessageEnd 5506756 MimeContentEnd 5506756 +Octets 478 +Lines 24 MimeEntityEnd 5506756 MultipartBoundaryBegin 5506756 MultipartBoundaryEnd 5506787 @@ -3467,9 +4355,13 @@ MimeEntityBegin 5506788 MimeEntityHeadersEnd 5506903 MimeContentBegin 5506903 MimeContentEnd 5508222 +Octets 1319 +Lines 27 MimeEntityEnd 5508223 MimeMessageEnd 5508223 MimeContentEnd 5508223 +Octets 1435 +Lines 31 MimeEntityEnd 5508223 MultipartBoundaryBegin 5508223 MultipartBoundaryEnd 5508254 @@ -3482,9 +4374,13 @@ MimeEntityBegin 5508255 MimeEntityHeadersEnd 5508355 MimeContentBegin 5508355 MimeContentEnd 5508650 +Octets 295 +Lines 10 MimeEntityEnd 5508651 MimeMessageEnd 5508651 MimeContentEnd 5508651 +Octets 396 +Lines 14 MimeEntityEnd 5508651 MultipartBoundaryBegin 5508651 MultipartBoundaryEnd 5508682 @@ -3497,19 +4393,29 @@ MimeEntityBegin 5508683 MimeEntityHeadersEnd 5508826 MimeContentBegin 5508826 MimeContentEnd 5509845 +Octets 1019 +Lines 37 MimeEntityEnd 5509846 MimeMessageEnd 5509846 MimeContentEnd 5509846 +Octets 1163 +Lines 41 MimeEntityEnd 5509846 MultipartEndBoundaryBegin 5509846 MultipartEndBoundaryEnd 5509878 MultipartEpilogueBegin 5509878 MultipartEpilogueEnd 5509879 +MimeContentEnd 5509880 +Octets 64211 +Lines 1846 MimeEntityEnd 5509880 MultipartEndBoundaryBegin 5509880 MultipartEndBoundaryEnd 5509899 MultipartEpilogueBegin 5509899 MultipartEpilogueEnd 5509954 +MimeContentEnd 5509955 +Octets 68782 +Lines 1958 MimeEntityEnd 5509955 MimeMessageEnd 5509955 MboxMarkerBegin 5509955 @@ -3520,6 +4426,8 @@ MimeEntityBegin 5509963 MimeEntityHeadersEnd 5510771 MimeContentBegin 5510771 MimeContentEnd 5512642 +Octets 1871 +Lines 49 MimeEntityEnd 5512643 MimeMessageEnd 5512643 MboxMarkerBegin 5512643 @@ -3537,6 +4445,8 @@ MimeEntityBegin 5513405 MimeEntityHeadersEnd 5513406 MimeContentBegin 5513406 MimeContentEnd 5513518 +Octets 112 +Lines 2 MimeEntityEnd 5513519 MultipartBoundaryBegin 5513519 MultipartBoundaryEnd 5513546 @@ -3544,6 +4454,8 @@ MimeEntityBegin 5513546 MimeEntityHeadersEnd 5513635 MimeContentBegin 5513635 MimeContentEnd 5644327 +Octets 130692 +Lines 2012 MimeEntityEnd 5644328 MultipartBoundaryBegin 5644328 MultipartBoundaryEnd 5644355 @@ -3551,6 +4463,8 @@ MimeEntityBegin 5644355 MimeEntityHeadersEnd 5644356 MimeContentBegin 5644356 MimeContentEnd 5644411 +Octets 55 +Lines 2 MimeEntityEnd 5644412 MultipartBoundaryBegin 5644412 MultipartBoundaryEnd 5644439 @@ -3558,6 +4472,8 @@ MimeEntityBegin 5644439 MimeEntityHeadersEnd 5644584 MimeContentBegin 5644584 MimeContentEnd 5659481 +Octets 14897 +Lines 78 MimeEntityEnd 5659482 MultipartBoundaryBegin 5659482 MultipartBoundaryEnd 5659509 @@ -3565,6 +4481,8 @@ MimeEntityBegin 5659509 MimeEntityHeadersEnd 5659510 MimeContentBegin 5659510 MimeContentEnd 5659600 +Octets 90 +Lines 6 MimeEntityEnd 5659601 MultipartBoundaryBegin 5659601 MultipartBoundaryEnd 5659628 @@ -3572,6 +4490,8 @@ MimeEntityBegin 5659628 MimeEntityHeadersEnd 5659773 MimeContentBegin 5659773 MimeContentEnd 5667874 +Octets 8101 +Lines 42 MimeEntityEnd 5667875 MultipartBoundaryBegin 5667875 MultipartBoundaryEnd 5667902 @@ -3579,11 +4499,16 @@ MimeEntityBegin 5667902 MimeEntityHeadersEnd 5667903 MimeContentBegin 5667903 MimeContentEnd 5667977 +Octets 74 +Lines 4 MimeEntityEnd 5667978 MultipartEndBoundaryBegin 5667978 MultipartEndBoundaryEnd 5668006 MultipartEpilogueBegin 5668006 MultipartEpilogueEnd 5668007 +MimeContentEnd 5668008 +Octets 154630 +Lines 2172 MimeEntityEnd 5668008 MimeMessageEnd 5668008 MboxMarkerBegin 5668008 @@ -3594,6 +4519,8 @@ MimeEntityBegin 5668016 MimeEntityHeadersEnd 5668539 MimeContentBegin 5668539 MimeContentEnd 5669107 +Octets 568 +Lines 22 MimeEntityEnd 5669108 MimeMessageEnd 5669108 MboxMarkerBegin 5669108 @@ -3611,6 +4538,8 @@ MimeEntityBegin 5670497 MimeEntityHeadersEnd 5670541 MimeContentBegin 5670541 MimeContentEnd 5671271 +Octets 730 +Lines 27 MimeEntityEnd 5671272 MultipartBoundaryBegin 5671272 MultipartBoundaryEnd 5671312 @@ -3625,6 +4554,8 @@ MimeEntityBegin 5671439 MimeEntityHeadersEnd 5671530 MimeContentBegin 5671530 MimeContentEnd 5672332 +Octets 802 +Lines 26 MimeEntityEnd 5672333 MultipartBoundaryBegin 5672333 MultipartBoundaryEnd 5672375 @@ -3632,6 +4563,8 @@ MimeEntityBegin 5672375 MimeEntityHeadersEnd 5672468 MimeContentBegin 5672468 MimeContentEnd 5730339 +Octets 57871 +Lines 756 MimeEntityEnd 5730340 MultipartBoundaryBegin 5730340 MultipartBoundaryEnd 5730382 @@ -3639,16 +4572,24 @@ MimeEntityBegin 5730382 MimeEntityHeadersEnd 5730473 MimeContentBegin 5730473 MimeContentEnd 5730478 +Octets 5 +Lines 2 MimeEntityEnd 5730479 MultipartEndBoundaryBegin 5730479 MultipartEndBoundaryEnd 5730522 MultipartEpilogueBegin 5730522 MultipartEpilogueEnd 5730523 +MimeContentEnd 5730524 +Octets 59127 +Lines 799 MimeEntityEnd 5730524 MultipartEndBoundaryBegin 5730524 MultipartEndBoundaryEnd 5730565 MultipartEpilogueBegin 5730565 MultipartEpilogueEnd 5730566 +MimeContentEnd 5730567 +Octets 60265 +Lines 838 MimeEntityEnd 5730567 MimeMessageEnd 5730567 MboxMarkerBegin 5730567 @@ -3666,6 +4607,8 @@ MimeEntityBegin 5731365 MimeEntityHeadersEnd 5731455 MimeContentBegin 5731455 MimeContentEnd 5731629 +Octets 174 +Lines 8 MimeEntityEnd 5731630 MultipartBoundaryBegin 5731630 MultipartBoundaryEnd 5731679 @@ -3673,11 +4616,16 @@ MimeEntityBegin 5731679 MimeEntityHeadersEnd 5731738 MimeContentBegin 5731738 MimeContentEnd 5786986 +Octets 55248 +Lines 757 MimeEntityEnd 5786987 MultipartEndBoundaryBegin 5786987 MultipartEndBoundaryEnd 5787037 MultipartEpilogueBegin 5787037 MultipartEpilogueEnd 5787038 +MimeContentEnd 5787039 +Octets 55724 +Lines 776 MimeEntityEnd 5787039 MimeMessageEnd 5787039 MboxMarkerBegin 5787039 @@ -3688,6 +4636,8 @@ MimeEntityBegin 5787071 MimeEntityHeadersEnd 5788538 MimeContentBegin 5788538 MimeContentEnd 5789878 +Octets 1340 +Lines 35 MimeEntityEnd 5789879 MimeMessageEnd 5789879 MboxMarkerBegin 5789879 @@ -3705,6 +4655,8 @@ MimeEntityBegin 5790752 MimeEntityHeadersEnd 5790828 MimeContentBegin 5790828 MimeContentEnd 5791198 +Octets 370 +Lines 14 MimeEntityEnd 5791199 MultipartBoundaryBegin 5791199 MultipartBoundaryEnd 5791224 @@ -3717,14 +4669,21 @@ MimeEntityBegin 5791314 MimeEntityHeadersEnd 5792382 MimeContentBegin 5792382 MimeContentEnd 5816777 +Octets 24395 +Lines 464 MimeEntityEnd 5816778 MimeMessageEnd 5816778 MimeContentEnd 5816778 +Octets 25464 +Lines 478 MimeEntityEnd 5816778 MultipartEndBoundaryBegin 5816778 MultipartEndBoundaryEnd 5816804 MultipartEpilogueBegin 5816804 MultipartEpilogueEnd 5816805 +MimeContentEnd 5816806 +Octets 26125 +Lines 505 MimeEntityEnd 5816806 MimeMessageEnd 5816806 MboxMarkerBegin 5816806 @@ -3742,6 +4701,8 @@ MimeEntityBegin 5817576 MimeEntityHeadersEnd 5817654 MimeContentBegin 5817654 MimeContentEnd 5817688 +Octets 34 +Lines 2 MimeEntityEnd 5817689 MultipartBoundaryBegin 5817689 MultipartBoundaryEnd 5817737 @@ -3749,11 +4710,16 @@ MimeEntityBegin 5817737 MimeEntityHeadersEnd 5817796 MimeContentBegin 5817796 MimeContentEnd 5839947 +Octets 22151 +Lines 304 MimeEntityEnd 5839948 MultipartEndBoundaryBegin 5839948 MultipartEndBoundaryEnd 5839997 MultipartEpilogueBegin 5839997 MultipartEpilogueEnd 5839997 +MimeContentEnd 5839998 +Octets 22516 +Lines 317 MimeEntityEnd 5839998 MimeMessageEnd 5839998 MboxMarkerBegin 5839998 @@ -3771,6 +4737,8 @@ MimeEntityBegin 5840562 MimeEntityHeadersEnd 5840606 MimeContentBegin 5840606 MimeContentEnd 5841778 +Octets 1172 +Lines 22 MimeEntityEnd 5841779 MultipartBoundaryBegin 5841779 MultipartBoundaryEnd 5841787 @@ -3778,6 +4746,8 @@ MimeEntityBegin 5841787 MimeEntityHeadersEnd 5841913 MimeContentBegin 5841913 MimeContentEnd 5842059 +Octets 146 +Lines 3 MimeEntityEnd 5842060 MultipartBoundaryBegin 5842060 MultipartBoundaryEnd 5842068 @@ -3785,11 +4755,16 @@ MimeEntityBegin 5842068 MimeEntityHeadersEnd 5842184 MimeContentBegin 5842184 MimeContentEnd 5842378 +Octets 194 +Lines 3 MimeEntityEnd 5842379 MultipartEndBoundaryBegin 5842379 MultipartEndBoundaryEnd 5842388 MultipartEpilogueBegin 5842388 MultipartEpilogueEnd 5842388 +MimeContentEnd 5842389 +Octets 1835 +Lines 42 MimeEntityEnd 5842389 MimeMessageEnd 5842389 MboxMarkerBegin 5842389 @@ -3800,6 +4775,8 @@ MimeEntityBegin 5842397 MimeEntityHeadersEnd 5843191 MimeContentBegin 5843191 MimeContentEnd 6099969 +Octets 256778 +Lines 3519 MimeEntityEnd 6099970 MimeMessageEnd 6099970 MboxMarkerBegin 6099970 @@ -3817,6 +4794,8 @@ MimeEntityBegin 6100845 MimeEntityHeadersEnd 6100922 MimeContentBegin 6100922 MimeContentEnd 6101112 +Octets 190 +Lines 9 MimeEntityEnd 6101113 MultipartBoundaryBegin 6101113 MultipartBoundaryEnd 6101127 @@ -3824,11 +4803,16 @@ MimeEntityBegin 6101127 MimeEntityHeadersEnd 6101231 MimeContentBegin 6101231 MimeContentEnd 6199478 +Octets 98247 +Lines 1276 MimeEntityEnd 6199479 MultipartEndBoundaryBegin 6199479 MultipartEndBoundaryEnd 6199494 MultipartEpilogueBegin 6199494 MultipartEpilogueEnd 6199495 +MimeContentEnd 6199496 +Octets 98666 +Lines 1297 MimeEntityEnd 6199496 MimeMessageEnd 6199496 MboxMarkerBegin 6199496 @@ -3846,6 +4830,8 @@ MimeEntityBegin 6200390 MimeEntityHeadersEnd 6200436 MimeContentBegin 6200436 MimeContentEnd 6201379 +Octets 943 +Lines 22 MimeEntityEnd 6201380 MultipartBoundaryBegin 6201380 MultipartBoundaryEnd 6201389 @@ -3874,6 +4860,8 @@ MimeEntityBegin 6201982 MimeEntityHeadersEnd 6202105 MimeContentBegin 6202105 MimeContentEnd 6202471 +Octets 366 +Lines 9 MimeEntityEnd 6202472 MultipartBoundaryBegin 6202472 MultipartBoundaryEnd 6202494 @@ -3881,6 +4869,8 @@ MimeEntityBegin 6202494 MimeEntityHeadersEnd 6202616 MimeContentBegin 6202616 MimeContentEnd 6203008 +Octets 392 +Lines 11 MimeEntityEnd 6203009 MultipartBoundaryBegin 6203009 MultipartBoundaryEnd 6203031 @@ -3888,11 +4878,16 @@ MimeEntityBegin 6203031 MimeEntityHeadersEnd 6203156 MimeContentBegin 6203156 MimeContentEnd 6203864 +Octets 708 +Lines 19 MimeEntityEnd 6203865 MultipartEndBoundaryBegin 6203865 MultipartEndBoundaryEnd 6203888 MultipartEpilogueBegin 6203888 MultipartEpilogueEnd 6203889 +MimeContentEnd 6203890 +Octets 1930 +Lines 56 MimeEntityEnd 6203890 MultipartBoundaryBegin 6203890 MultipartBoundaryEnd 6203912 @@ -3907,6 +4902,8 @@ MimeEntityBegin 6204033 MimeEntityHeadersEnd 6204165 MimeContentBegin 6204165 MimeContentEnd 6220580 +Octets 16415 +Lines 471 MimeEntityEnd 6220581 MultipartBoundaryBegin 6220581 MultipartBoundaryEnd 6220603 @@ -3914,6 +4911,8 @@ MimeEntityBegin 6220603 MimeEntityHeadersEnd 6220734 MimeContentBegin 6220734 MimeContentEnd 6234988 +Octets 14254 +Lines 396 MimeEntityEnd 6234989 MultipartBoundaryBegin 6234989 MultipartBoundaryEnd 6235011 @@ -3928,6 +4927,8 @@ MimeEntityBegin 6235134 MimeEntityHeadersEnd 6235276 MimeContentBegin 6235276 MimeContentEnd 6241428 +Octets 6152 +Lines 165 MimeEntityEnd 6241429 MultipartBoundaryBegin 6241429 MultipartBoundaryEnd 6241451 @@ -3935,6 +4936,8 @@ MimeEntityBegin 6241451 MimeEntityHeadersEnd 6241578 MimeContentBegin 6241578 MimeContentEnd 6246833 +Octets 5255 +Lines 161 MimeEntityEnd 6246834 MultipartBoundaryBegin 6246834 MultipartBoundaryEnd 6246856 @@ -3942,6 +4945,8 @@ MimeEntityBegin 6246856 MimeEntityHeadersEnd 6246993 MimeContentBegin 6246993 MimeContentEnd 6254291 +Octets 7298 +Lines 198 MimeEntityEnd 6254292 MultipartBoundaryBegin 6254292 MultipartBoundaryEnd 6254314 @@ -3949,6 +4954,8 @@ MimeEntityBegin 6254314 MimeEntityHeadersEnd 6254438 MimeContentBegin 6254438 MimeContentEnd 6260914 +Octets 6476 +Lines 185 MimeEntityEnd 6260915 MultipartBoundaryBegin 6260915 MultipartBoundaryEnd 6260937 @@ -3956,11 +4963,16 @@ MimeEntityBegin 6260937 MimeEntityHeadersEnd 6261074 MimeContentBegin 6261074 MimeContentEnd 6278242 +Octets 17168 +Lines 493 MimeEntityEnd 6278243 MultipartEndBoundaryBegin 6278243 MultipartEndBoundaryEnd 6278266 MultipartEpilogueBegin 6278266 MultipartEpilogueEnd 6278267 +MimeContentEnd 6278268 +Octets 43156 +Lines 1229 MimeEntityEnd 6278268 MultipartBoundaryBegin 6278268 MultipartBoundaryEnd 6278290 @@ -3975,16 +4987,24 @@ MimeEntityBegin 6278407 MimeEntityHeadersEnd 6278541 MimeContentBegin 6278541 MimeContentEnd 6279036 +Octets 495 +Lines 22 MimeEntityEnd 6279037 MultipartEndBoundaryBegin 6279037 MultipartEndBoundaryEnd 6279060 MultipartEpilogueBegin 6279060 MultipartEpilogueEnd 6279061 +MimeContentEnd 6279062 +Octets 677 +Lines 29 MimeEntityEnd 6279062 MultipartEndBoundaryBegin 6279062 MultipartEndBoundaryEnd 6279085 MultipartEpilogueBegin 6279085 MultipartEpilogueEnd 6279086 +MimeContentEnd 6279087 +Octets 75076 +Lines 2145 MimeEntityEnd 6279087 MultipartBoundaryBegin 6279087 MultipartBoundaryEnd 6279109 @@ -3999,6 +5019,8 @@ MimeEntityBegin 6279242 MimeEntityHeadersEnd 6279380 MimeContentBegin 6279380 MimeContentEnd 6280529 +Octets 1149 +Lines 30 MimeEntityEnd 6280530 MultipartBoundaryBegin 6280530 MultipartBoundaryEnd 6280552 @@ -4006,6 +5028,8 @@ MimeEntityBegin 6280552 MimeEntityHeadersEnd 6280678 MimeContentBegin 6280678 MimeContentEnd 6281898 +Octets 1220 +Lines 36 MimeEntityEnd 6281899 MultipartBoundaryBegin 6281899 MultipartBoundaryEnd 6281921 @@ -4013,26 +5037,40 @@ MimeEntityBegin 6281921 MimeEntityHeadersEnd 6282061 MimeContentBegin 6282061 MimeContentEnd 6282738 +Octets 677 +Lines 23 MimeEntityEnd 6282739 MultipartEndBoundaryBegin 6282739 MultipartEndBoundaryEnd 6282762 MultipartEpilogueBegin 6282762 MultipartEpilogueEnd 6282763 +MimeContentEnd 6282764 +Octets 3544 +Lines 106 MimeEntityEnd 6282764 MultipartEndBoundaryBegin 6282764 MultipartEndBoundaryEnd 6282787 MultipartEpilogueBegin 6282787 MultipartEpilogueEnd 6282788 +MimeContentEnd 6282789 +Octets 80953 +Lines 2321 MimeEntityEnd 6282789 MultipartEndBoundaryBegin 6282789 MultipartEndBoundaryEnd 6282812 MultipartEpilogueBegin 6282812 MultipartEpilogueEnd 6282813 +MimeContentEnd 6282814 +Octets 81362 +Lines 2333 MimeEntityEnd 6282814 MultipartEndBoundaryBegin 6282814 MultipartEndBoundaryEnd 6282824 MultipartEpilogueBegin 6282824 MultipartEpilogueEnd 6282825 +MimeContentEnd 6282826 +Octets 82445 +Lines 2363 MimeEntityEnd 6282826 MimeMessageEnd 6282826 MboxMarkerBegin 6282826 @@ -4043,6 +5081,8 @@ MimeEntityBegin 6282834 MimeEntityHeadersEnd 6283636 MimeContentBegin 6283636 MimeContentEnd 6292835 +Octets 9199 +Lines 227 MimeEntityEnd 6292836 MimeMessageEnd 6292836 MboxMarkerBegin 6292836 @@ -4060,6 +5100,8 @@ MimeEntityBegin 6293767 MimeEntityHeadersEnd 6293811 MimeContentBegin 6293811 MimeContentEnd 6294567 +Octets 756 +Lines 24 MimeEntityEnd 6294568 MultipartBoundaryBegin 6294568 MultipartBoundaryEnd 6294608 @@ -4074,6 +5116,8 @@ MimeEntityBegin 6294735 MimeEntityHeadersEnd 6294826 MimeContentBegin 6294826 MimeContentEnd 6295153 +Octets 327 +Lines 8 MimeEntityEnd 6295154 MultipartBoundaryBegin 6295154 MultipartBoundaryEnd 6295196 @@ -4081,6 +5125,8 @@ MimeEntityBegin 6295196 MimeEntityHeadersEnd 6295290 MimeContentBegin 6295290 MimeContentEnd 6317314 +Octets 22024 +Lines 321 MimeEntityEnd 6317315 MultipartBoundaryBegin 6317315 MultipartBoundaryEnd 6317357 @@ -4088,6 +5134,8 @@ MimeEntityBegin 6317357 MimeEntityHeadersEnd 6317448 MimeContentBegin 6317448 MimeContentEnd 6317614 +Octets 166 +Lines 6 MimeEntityEnd 6317615 MultipartBoundaryBegin 6317615 MultipartBoundaryEnd 6317657 @@ -4095,6 +5143,8 @@ MimeEntityBegin 6317657 MimeEntityHeadersEnd 6317754 MimeContentBegin 6317754 MimeContentEnd 6364967 +Octets 47213 +Lines 686 MimeEntityEnd 6364968 MultipartBoundaryBegin 6364968 MultipartBoundaryEnd 6365010 @@ -4102,6 +5152,8 @@ MimeEntityBegin 6365010 MimeEntityHeadersEnd 6365101 MimeContentBegin 6365101 MimeContentEnd 6365171 +Octets 70 +Lines 3 MimeEntityEnd 6365172 MultipartBoundaryBegin 6365172 MultipartBoundaryEnd 6365214 @@ -4109,6 +5161,8 @@ MimeEntityBegin 6365214 MimeEntityHeadersEnd 6365304 MimeContentBegin 6365304 MimeContentEnd 6385522 +Octets 20218 +Lines 295 MimeEntityEnd 6385523 MultipartBoundaryBegin 6385523 MultipartBoundaryEnd 6385565 @@ -4116,16 +5170,24 @@ MimeEntityBegin 6385565 MimeEntityHeadersEnd 6385656 MimeContentBegin 6385656 MimeContentEnd 6385760 +Octets 104 +Lines 9 MimeEntityEnd 6385761 MultipartEndBoundaryBegin 6385761 MultipartEndBoundaryEnd 6385804 MultipartEpilogueBegin 6385804 MultipartEpilogueEnd 6385805 +MimeContentEnd 6385806 +Octets 91113 +Lines 1361 MimeEntityEnd 6385806 MultipartEndBoundaryBegin 6385806 MultipartEndBoundaryEnd 6385847 MultipartEpilogueBegin 6385847 MultipartEpilogueEnd 6385847 +MimeContentEnd 6385848 +Octets 92276 +Lines 1396 MimeEntityEnd 6385848 MimeMessageEnd 6385848 MboxMarkerBegin 6385848 @@ -4143,6 +5205,8 @@ MimeEntityBegin 6386850 MimeEntityHeadersEnd 6386923 MimeContentBegin 6386923 MimeContentEnd 6387343 +Octets 420 +Lines 14 MimeEntityEnd 6387344 MultipartBoundaryBegin 6387344 MultipartBoundaryEnd 6387389 @@ -4150,6 +5214,8 @@ MimeEntityBegin 6387389 MimeEntityHeadersEnd 6387450 MimeContentBegin 6387450 MimeContentEnd 6421014 +Octets 33564 +Lines 461 MimeEntityEnd 6421015 MultipartBoundaryBegin 6421015 MultipartBoundaryEnd 6421060 @@ -4157,11 +5223,16 @@ MimeEntityBegin 6421060 MimeEntityHeadersEnd 6421133 MimeContentBegin 6421133 MimeContentEnd 6421227 +Octets 94 +Lines 8 MimeEntityEnd 6421228 MultipartEndBoundaryBegin 6421228 MultipartEndBoundaryEnd 6421274 MultipartEpilogueBegin 6421274 MultipartEpilogueEnd 6421275 +MimeContentEnd 6421276 +Octets 34666 +Lines 501 MimeEntityEnd 6421276 MimeMessageEnd 6421276 MboxMarkerBegin 6421276 @@ -4172,6 +5243,8 @@ MimeEntityBegin 6421318 MimeEntityHeadersEnd 6421466 MimeContentBegin 6421466 MimeContentEnd 6464495 +Octets 43029 +Lines 694 MimeEntityEnd 6464496 MimeMessageEnd 6464496 MboxMarkerBegin 6464496 @@ -4196,6 +5269,8 @@ MimeEntityBegin 6465354 MimeEntityHeadersEnd 6465432 MimeContentBegin 6465432 MimeContentEnd 6466704 +Octets 1272 +Lines 39 MimeEntityEnd 6466705 MultipartBoundaryBegin 6466705 MultipartBoundaryEnd 6466744 @@ -4203,11 +5278,16 @@ MimeEntityBegin 6466744 MimeEntityHeadersEnd 6466823 MimeContentBegin 6466823 MimeContentEnd 6469287 +Octets 2464 +Lines 33 MimeEntityEnd 6469288 MultipartEndBoundaryBegin 6469288 MultipartEndBoundaryEnd 6469328 MultipartEpilogueBegin 6469328 MultipartEpilogueEnd 6469330 +MimeContentEnd 6469331 +Octets 4017 +Lines 84 MimeEntityEnd 6469331 MultipartBoundaryBegin 6469331 MultipartBoundaryEnd 6469370 @@ -4215,11 +5295,16 @@ MimeEntityBegin 6469370 MimeEntityHeadersEnd 6469575 MimeContentBegin 6469575 MimeContentEnd 6490325 +Octets 20750 +Lines 271 MimeEntityEnd 6490326 MultipartEndBoundaryBegin 6490326 MultipartEndBoundaryEnd 6490366 MultipartEpilogueBegin 6490366 MultipartEpilogueEnd 6490367 +MimeContentEnd 6490368 +Octets 25257 +Lines 369 MimeEntityEnd 6490368 MimeMessageEnd 6490368 MboxMarkerBegin 6490368 @@ -4237,6 +5322,8 @@ MimeEntityBegin 6490872 MimeEntityHeadersEnd 6490873 MimeContentBegin 6490873 MimeContentEnd 6490936 +Octets 63 +Lines 2 MimeEntityEnd 6490937 MultipartBoundaryBegin 6490937 MultipartBoundaryEnd 6490957 @@ -4251,6 +5338,8 @@ MimeEntityBegin 6491058 MimeEntityHeadersEnd 6491164 MimeContentBegin 6491164 MimeContentEnd 6491244 +Octets 80 +Lines 4 MimeEntityEnd 6491245 MultipartBoundaryBegin 6491245 MultipartBoundaryEnd 6491272 @@ -4258,6 +5347,8 @@ MimeEntityBegin 6491272 MimeEntityHeadersEnd 6491381 MimeContentBegin 6491381 MimeContentEnd 6491539 +Octets 158 +Lines 5 MimeEntityEnd 6491540 MultipartBoundaryBegin 6491540 MultipartBoundaryEnd 6491567 @@ -4265,6 +5356,8 @@ MimeEntityBegin 6491567 MimeEntityHeadersEnd 6491676 MimeContentBegin 6491676 MimeContentEnd 6491839 +Octets 163 +Lines 11 MimeEntityEnd 6491840 MultipartBoundaryBegin 6491840 MultipartBoundaryEnd 6491867 @@ -4272,6 +5365,8 @@ MimeEntityBegin 6491867 MimeEntityHeadersEnd 6491972 MimeContentBegin 6491972 MimeContentEnd 6492133 +Octets 161 +Lines 4 MimeEntityEnd 6492134 MultipartBoundaryBegin 6492134 MultipartBoundaryEnd 6492161 @@ -4279,11 +5374,16 @@ MimeEntityBegin 6492161 MimeEntityHeadersEnd 6492285 MimeContentBegin 6492285 MimeContentEnd 6492712 +Octets 427 +Lines 7 MimeEntityEnd 6492713 MultipartEndBoundaryBegin 6492713 MultipartEndBoundaryEnd 6492741 MultipartEpilogueBegin 6492741 MultipartEpilogueEnd 6492741 +MimeContentEnd 6492742 +Octets 1711 +Lines 57 MimeEntityEnd 6492742 MultipartBoundaryBegin 6492742 MultipartBoundaryEnd 6492762 @@ -4291,6 +5391,8 @@ MimeEntityBegin 6492762 MimeEntityHeadersEnd 6492763 MimeContentBegin 6492763 MimeContentEnd 6492928 +Octets 165 +Lines 5 MimeEntityEnd 6492929 MultipartBoundaryBegin 6492929 MultipartBoundaryEnd 6492949 @@ -4305,6 +5407,8 @@ MimeEntityBegin 6493004 MimeEntityHeadersEnd 6493030 MimeContentBegin 6493030 MimeContentEnd 6493083 +Octets 53 +Lines 2 MimeEntityEnd 6493084 MultipartBoundaryBegin 6493084 MultipartBoundaryEnd 6493089 @@ -4319,6 +5423,8 @@ MimeEntityBegin 6493144 MimeEntityHeadersEnd 6493170 MimeContentBegin 6493170 MimeContentEnd 6493223 +Octets 53 +Lines 2 MimeEntityEnd 6493224 MultipartBoundaryBegin 6493224 MultipartBoundaryEnd 6493229 @@ -4326,6 +5432,8 @@ MimeEntityBegin 6493229 MimeEntityHeadersEnd 6493254 MimeContentBegin 6493254 MimeContentEnd 6493304 +Octets 50 +Lines 2 MimeEntityEnd 6493305 MultipartBoundaryBegin 6493305 MultipartBoundaryEnd 6493310 @@ -4333,11 +5441,16 @@ MimeEntityBegin 6493310 MimeEntityHeadersEnd 6493337 MimeContentBegin 6493337 MimeContentEnd 6493391 +Octets 54 +Lines 2 MimeEntityEnd 6493392 MultipartEndBoundaryBegin 6493392 MultipartEndBoundaryEnd 6493398 MultipartEpilogueBegin 6493398 MultipartEpilogueEnd 6493399 +MimeContentEnd 6493400 +Octets 261 +Lines 17 MimeEntityEnd 6493400 MultipartBoundaryBegin 6493400 MultipartBoundaryEnd 6493405 @@ -4345,11 +5458,16 @@ MimeEntityBegin 6493405 MimeEntityHeadersEnd 6493497 MimeContentBegin 6493497 MimeContentEnd 6493512 +Octets 15 +Lines 2 MimeEntityEnd 6493513 MultipartEndBoundaryBegin 6493513 MultipartEndBoundaryEnd 6493519 MultipartEpilogueBegin 6493519 MultipartEpilogueEnd 6493519 +MimeContentEnd 6493520 +Octets 521 +Lines 32 MimeEntityEnd 6493520 MultipartBoundaryBegin 6493520 MultipartBoundaryEnd 6493540 @@ -4357,11 +5475,16 @@ MimeEntityBegin 6493540 MimeEntityHeadersEnd 6493541 MimeContentBegin 6493541 MimeContentEnd 6493550 +Octets 9 +Lines 2 MimeEntityEnd 6493551 MultipartEndBoundaryBegin 6493551 MultipartEndBoundaryEnd 6493572 MultipartEpilogueBegin 6493572 MultipartEpilogueEnd 6493572 +MimeContentEnd 6493573 +Octets 2767 +Lines 113 MimeEntityEnd 6493573 MimeMessageEnd 6493573 MboxMarkerBegin 6493573 @@ -4379,6 +5502,8 @@ MimeEntityBegin 6494075 MimeEntityHeadersEnd 6494076 MimeContentBegin 6494076 MimeContentEnd 6494143 +Octets 67 +Lines 2 MimeEntityEnd 6494144 MultipartBoundaryBegin 6494144 MultipartBoundaryEnd 6494164 @@ -4393,6 +5518,8 @@ MimeEntityBegin 6494265 MimeEntityHeadersEnd 6494421 MimeContentBegin 6494421 MimeContentEnd 6549684 +Octets 55263 +Lines 1604 MimeEntityEnd 6549685 MultipartBoundaryBegin 6549685 MultipartBoundaryEnd 6549712 @@ -4400,6 +5527,8 @@ MimeEntityBegin 6549712 MimeEntityHeadersEnd 6549867 MimeContentBegin 6549867 MimeContentEnd 6655916 +Octets 106049 +Lines 2983 MimeEntityEnd 6655917 MultipartBoundaryBegin 6655917 MultipartBoundaryEnd 6655944 @@ -4407,16 +5536,24 @@ MimeEntityBegin 6655944 MimeEntityHeadersEnd 6656090 MimeContentBegin 6656090 MimeContentEnd 6844449 +Octets 188359 +Lines 13110 MimeEntityEnd 6844450 MultipartEndBoundaryBegin 6844450 MultipartEndBoundaryEnd 6844478 MultipartEpilogueBegin 6844478 MultipartEpilogueEnd 6844479 +MimeContentEnd 6844480 +Octets 350242 +Lines 17714 MimeEntityEnd 6844480 MultipartEndBoundaryBegin 6844480 MultipartEndBoundaryEnd 6844501 MultipartEpilogueBegin 6844501 MultipartEpilogueEnd 6844507 +MimeContentEnd 6844508 +Octets 350499 +Lines 17726 MimeEntityEnd 6844508 MimeMessageEnd 6844508 MboxMarkerBegin 6844508 @@ -4434,6 +5571,8 @@ MimeEntityBegin 6845376 MimeEntityHeadersEnd 6845488 MimeContentBegin 6845488 MimeContentEnd 6845488 +Octets 0 +Lines 1 MimeEntityEnd 6845489 MultipartBoundaryBegin 6845489 MultipartBoundaryEnd 6845529 @@ -4446,14 +5585,21 @@ MimeEntityBegin 6845627 MimeEntityHeadersEnd 6846168 MimeContentBegin 6846168 MimeContentEnd 6846514 +Octets 346 +Lines 17 MimeEntityEnd 6846515 MimeMessageEnd 6846515 MimeContentEnd 6846515 +Octets 888 +Lines 29 MimeEntityEnd 6846515 MultipartEndBoundaryBegin 6846515 MultipartEndBoundaryEnd 6846556 MultipartEpilogueBegin 6846556 MultipartEpilogueEnd 6846556 +MimeContentEnd 6846557 +Octets 1437 +Lines 43 MimeEntityEnd 6846557 MimeMessageEnd 6846557 MboxMarkerBegin 6846557 @@ -4471,6 +5617,8 @@ MimeEntityBegin 6846900 MimeEntityHeadersEnd 6847146 MimeContentBegin 6847146 MimeContentEnd 6847865 +Octets 719 +Lines 31 MimeEntityEnd 6847866 MultipartBoundaryBegin 6847866 MultipartBoundaryEnd 6847905 @@ -4478,11 +5626,16 @@ MimeEntityBegin 6847905 MimeEntityHeadersEnd 6848225 MimeContentBegin 6848225 MimeContentEnd 6858948 +Octets 10723 +Lines 148 MimeEntityEnd 6858949 MultipartEndBoundaryBegin 6858949 MultipartEndBoundaryEnd 6858989 MultipartEpilogueBegin 6858989 MultipartEpilogueEnd 6858989 +MimeContentEnd 6858990 +Octets 12129 +Lines 197 MimeEntityEnd 6858990 MimeMessageEnd 6858990 MboxMarkerBegin 6858990 @@ -4500,6 +5653,8 @@ MimeEntityBegin 6859333 MimeEntityHeadersEnd 6859579 MimeContentBegin 6859579 MimeContentEnd 6860297 +Octets 718 +Lines 31 MimeEntityEnd 6860298 MultipartBoundaryBegin 6860298 MultipartBoundaryEnd 6860337 @@ -4507,11 +5662,16 @@ MimeEntityBegin 6860337 MimeEntityHeadersEnd 6860626 MimeContentBegin 6860626 MimeContentEnd 6871349 +Octets 10723 +Lines 148 MimeEntityEnd 6871350 MultipartEndBoundaryBegin 6871350 MultipartEndBoundaryEnd 6871390 MultipartEpilogueBegin 6871390 MultipartEpilogueEnd 6871390 +MimeContentEnd 6871391 +Octets 12097 +Lines 197 MimeEntityEnd 6871391 MimeMessageEnd 6871391 MboxMarkerBegin 6871391 @@ -4529,6 +5689,8 @@ MimeEntityBegin 6872971 MimeEntityHeadersEnd 6873062 MimeContentBegin 6873062 MimeContentEnd 6878261 +Octets 5199 +Lines 112 MimeEntityEnd 6878262 MultipartBoundaryBegin 6878262 MultipartBoundaryEnd 6878306 @@ -4536,11 +5698,16 @@ MimeEntityBegin 6878306 MimeEntityHeadersEnd 6878505 MimeContentBegin 6878505 MimeContentEnd 6879434 +Octets 929 +Lines 14 MimeEntityEnd 6879435 MultipartEndBoundaryBegin 6879435 MultipartEndBoundaryEnd 6879480 MultipartEpilogueBegin 6879480 MultipartEpilogueEnd 6879481 +MimeContentEnd 6879482 +Octets 6556 +Lines 140 MimeEntityEnd 6879482 MimeMessageEnd 6879482 MboxMarkerBegin 6879482 @@ -4558,6 +5725,8 @@ MimeEntityBegin 6880000 MimeEntityHeadersEnd 6880026 MimeContentBegin 6880026 MimeContentEnd 6880273 +Octets 247 +Lines 7 MimeEntityEnd 6880274 MultipartBoundaryBegin 6880274 MultipartBoundaryEnd 6880313 @@ -4572,6 +5741,8 @@ MimeEntityBegin 6880438 MimeEntityHeadersEnd 6880632 MimeContentBegin 6880632 MimeContentEnd 6887780 +Octets 7148 +Lines 180 MimeEntityEnd 6887781 MultipartBoundaryBegin 6887781 MultipartBoundaryEnd 6887820 @@ -4579,6 +5750,8 @@ MimeEntityBegin 6887820 MimeEntityHeadersEnd 6887996 MimeContentBegin 6887996 MimeContentEnd 6895977 +Octets 7981 +Lines 110 MimeEntityEnd 6895978 MultipartBoundaryBegin 6895978 MultipartBoundaryEnd 6896017 @@ -4586,6 +5759,8 @@ MimeEntityBegin 6896017 MimeEntityHeadersEnd 6896176 MimeContentBegin 6896176 MimeContentEnd 6903630 +Octets 7454 +Lines 103 MimeEntityEnd 6903631 MultipartBoundaryBegin 6903631 MultipartBoundaryEnd 6903670 @@ -4593,6 +5768,8 @@ MimeEntityBegin 6903670 MimeEntityHeadersEnd 6903828 MimeContentBegin 6903828 MimeContentEnd 6907161 +Octets 3333 +Lines 46 MimeEntityEnd 6907162 MultipartBoundaryBegin 6907162 MultipartBoundaryEnd 6907201 @@ -4600,6 +5777,8 @@ MimeEntityBegin 6907201 MimeEntityHeadersEnd 6907360 MimeContentBegin 6907360 MimeContentEnd 6915811 +Octets 8451 +Lines 116 MimeEntityEnd 6915812 MultipartBoundaryBegin 6915812 MultipartBoundaryEnd 6915851 @@ -4607,6 +5786,8 @@ MimeEntityBegin 6915851 MimeEntityHeadersEnd 6916007 MimeContentBegin 6916007 MimeContentEnd 7020376 +Octets 104369 +Lines 1430 MimeEntityEnd 7020377 MultipartBoundaryBegin 7020377 MultipartBoundaryEnd 7020416 @@ -4614,6 +5795,8 @@ MimeEntityBegin 7020416 MimeEntityHeadersEnd 7020575 MimeContentBegin 7020575 MimeContentEnd 7058936 +Octets 38361 +Lines 526 MimeEntityEnd 7058937 MultipartBoundaryBegin 7058937 MultipartBoundaryEnd 7058976 @@ -4621,16 +5804,24 @@ MimeEntityBegin 7058976 MimeEntityHeadersEnd 7059140 MimeContentBegin 7059140 MimeContentEnd 7094455 +Octets 35315 +Lines 484 MimeEntityEnd 7094456 MultipartEndBoundaryBegin 7094456 MultipartEndBoundaryEnd 7094496 MultipartEpilogueBegin 7094496 MultipartEpilogueEnd 7094496 +MimeContentEnd 7094497 +Octets 214098 +Lines 3044 MimeEntityEnd 7094497 MultipartEndBoundaryBegin 7094497 MultipartEndBoundaryEnd 7094537 MultipartEpilogueBegin 7094537 MultipartEpilogueEnd 7094537 +MimeContentEnd 7094538 +Octets 214577 +Lines 3059 MimeEntityEnd 7094538 MimeMessageEnd 7094538 MboxMarkerBegin 7094538 @@ -4648,6 +5839,8 @@ MimeEntityBegin 7094880 MimeEntityHeadersEnd 7095036 MimeContentBegin 7095036 MimeContentEnd 7095587 +Octets 551 +Lines 28 MimeEntityEnd 7095588 MultipartBoundaryBegin 7095588 MultipartBoundaryEnd 7095627 @@ -4655,11 +5848,16 @@ MimeEntityBegin 7095627 MimeEntityHeadersEnd 7095740 MimeContentBegin 7095740 MimeContentEnd 7106463 +Octets 10723 +Lines 148 MimeEntityEnd 7106464 MultipartEndBoundaryBegin 7106464 MultipartEndBoundaryEnd 7106504 MultipartEpilogueBegin 7106504 MultipartEpilogueEnd 7106504 +MimeContentEnd 7106505 +Octets 11664 +Lines 188 MimeEntityEnd 7106505 MimeMessageEnd 7106505 MboxMarkerBegin 7106505 @@ -4677,6 +5875,8 @@ MimeEntityBegin 7106847 MimeEntityHeadersEnd 7107059 MimeContentBegin 7107059 MimeContentEnd 7107656 +Octets 597 +Lines 29 MimeEntityEnd 7107657 MultipartBoundaryBegin 7107657 MultipartBoundaryEnd 7107696 @@ -4684,11 +5884,16 @@ MimeEntityBegin 7107696 MimeEntityHeadersEnd 7107970 MimeContentBegin 7107970 MimeContentEnd 7118693 +Octets 10723 +Lines 148 MimeEntityEnd 7118694 MultipartEndBoundaryBegin 7118694 MultipartEndBoundaryEnd 7118734 MultipartEpilogueBegin 7118734 MultipartEpilogueEnd 7118734 +MimeContentEnd 7118735 +Octets 11927 +Lines 193 MimeEntityEnd 7118735 MimeMessageEnd 7118735 MboxMarkerBegin 7118735 @@ -4706,6 +5911,8 @@ MimeEntityBegin 7119077 MimeEntityHeadersEnd 7119293 MimeContentBegin 7119293 MimeContentEnd 7119894 +Octets 601 +Lines 29 MimeEntityEnd 7119895 MultipartBoundaryBegin 7119895 MultipartBoundaryEnd 7119934 @@ -4713,11 +5920,16 @@ MimeEntityBegin 7119934 MimeEntityHeadersEnd 7120109 MimeContentBegin 7120109 MimeContentEnd 7130832 +Octets 10723 +Lines 148 MimeEntityEnd 7130833 MultipartEndBoundaryBegin 7130833 MultipartEndBoundaryEnd 7130873 MultipartEpilogueBegin 7130873 MultipartEpilogueEnd 7130873 +MimeContentEnd 7130874 +Octets 11836 +Lines 191 MimeEntityEnd 7130874 MimeMessageEnd 7130874 MboxMarkerBegin 7130874 @@ -4735,6 +5947,8 @@ MimeEntityBegin 7131216 MimeEntityHeadersEnd 7131461 MimeContentBegin 7131461 MimeContentEnd 7132092 +Octets 631 +Lines 30 MimeEntityEnd 7132093 MultipartBoundaryBegin 7132093 MultipartBoundaryEnd 7132132 @@ -4742,11 +5956,16 @@ MimeEntityBegin 7132132 MimeEntityHeadersEnd 7132437 MimeContentBegin 7132437 MimeContentEnd 7143160 +Octets 10723 +Lines 148 MimeEntityEnd 7143161 MultipartEndBoundaryBegin 7143161 MultipartEndBoundaryEnd 7143201 MultipartEpilogueBegin 7143201 MultipartEpilogueEnd 7143201 +MimeContentEnd 7143202 +Octets 12025 +Lines 196 MimeEntityEnd 7143202 MimeMessageEnd 7143202 MboxMarkerBegin 7143202 @@ -4764,6 +5983,8 @@ MimeEntityBegin 7143544 MimeEntityHeadersEnd 7143760 MimeContentBegin 7143760 MimeContentEnd 7144405 +Octets 645 +Lines 29 MimeEntityEnd 7144406 MultipartBoundaryBegin 7144406 MultipartBoundaryEnd 7144445 @@ -4771,11 +5992,16 @@ MimeEntityBegin 7144445 MimeEntityHeadersEnd 7144620 MimeContentBegin 7144620 MimeContentEnd 7155343 +Octets 10723 +Lines 148 MimeEntityEnd 7155344 MultipartEndBoundaryBegin 7155344 MultipartEndBoundaryEnd 7155384 MultipartEpilogueBegin 7155384 MultipartEpilogueEnd 7155384 +MimeContentEnd 7155385 +Octets 11880 +Lines 191 MimeEntityEnd 7155385 MimeMessageEnd 7155385 MboxMarkerBegin 7155385 @@ -4793,6 +6019,8 @@ MimeEntityBegin 7155727 MimeEntityHeadersEnd 7155972 MimeContentBegin 7155972 MimeContentEnd 7156642 +Octets 670 +Lines 30 MimeEntityEnd 7156643 MultipartBoundaryBegin 7156643 MultipartBoundaryEnd 7156682 @@ -4800,11 +6028,16 @@ MimeEntityBegin 7156682 MimeEntityHeadersEnd 7157018 MimeContentBegin 7157018 MimeContentEnd 7167741 +Octets 10723 +Lines 148 MimeEntityEnd 7167742 MultipartEndBoundaryBegin 7167742 MultipartEndBoundaryEnd 7167782 MultipartEpilogueBegin 7167782 MultipartEpilogueEnd 7167782 +MimeContentEnd 7167783 +Octets 12095 +Lines 196 MimeEntityEnd 7167783 MimeMessageEnd 7167783 MboxMarkerBegin 7167783 @@ -4822,6 +6055,8 @@ MimeEntityBegin 7169133 MimeEntityHeadersEnd 7169209 MimeContentBegin 7169209 MimeContentEnd 7169236 +Octets 27 +Lines 4 MimeEntityEnd 7169237 MultipartBoundaryBegin 7169237 MultipartBoundaryEnd 7169275 @@ -4841,6 +6076,8 @@ MimeEntityBegin 7170226 MimeEntityHeadersEnd 7170302 MimeContentBegin 7170302 MimeContentEnd 7170929 +Octets 627 +Lines 17 MimeEntityEnd 7170930 MultipartBoundaryBegin 7170930 MultipartBoundaryEnd 7170969 @@ -4855,6 +6092,8 @@ MimeEntityBegin 7171091 MimeEntityHeadersEnd 7171166 MimeContentBegin 7171166 MimeContentEnd 7172016 +Octets 850 +Lines 19 MimeEntityEnd 7172017 MultipartBoundaryBegin 7172017 MultipartBoundaryEnd 7172056 @@ -4862,24 +6101,37 @@ MimeEntityBegin 7172056 MimeEntityHeadersEnd 7172240 MimeContentBegin 7172240 MimeContentEnd 7916207 +Octets 743967 +Lines 10192 MimeEntityEnd 7916208 MultipartEndBoundaryBegin 7916208 MultipartEndBoundaryEnd 7916248 MultipartEpilogueBegin 7916248 MultipartEpilogueEnd 7916249 +MimeContentEnd 7916250 +Octets 745199 +Lines 10224 MimeEntityEnd 7916250 MultipartEndBoundaryBegin 7916250 MultipartEndBoundaryEnd 7916290 MultipartEpilogueBegin 7916290 MultipartEpilogueEnd 7916293 +MimeContentEnd 7916294 +Octets 746108 +Lines 10253 MimeEntityEnd 7916294 MimeMessageEnd 7916294 MimeContentEnd 7916294 +Octets 746929 +Lines 10269 MimeEntityEnd 7916294 MultipartEndBoundaryBegin 7916294 MultipartEndBoundaryEnd 7916333 MultipartEpilogueBegin 7916333 MultipartEpilogueEnd 7916334 +MimeContentEnd 7916335 +Octets 747286 +Lines 10286 MimeEntityEnd 7916335 MimeMessageEnd 7916335 MboxMarkerBegin 7916335 @@ -4897,6 +6149,8 @@ MimeEntityBegin 7917676 MimeEntityHeadersEnd 7917767 MimeContentBegin 7917767 MimeContentEnd 7920149 +Octets 2382 +Lines 51 MimeEntityEnd 7920150 MultipartBoundaryBegin 7920150 MultipartBoundaryEnd 7920194 @@ -4904,6 +6158,8 @@ MimeEntityBegin 7920194 MimeEntityHeadersEnd 7920353 MimeContentBegin 7920353 MimeContentEnd 7926376 +Octets 6023 +Lines 80 MimeEntityEnd 7926377 MultipartBoundaryBegin 7926377 MultipartBoundaryEnd 7926421 @@ -4911,6 +6167,8 @@ MimeEntityBegin 7926421 MimeEntityHeadersEnd 7926579 MimeContentBegin 7926579 MimeContentEnd 7938652 +Octets 12073 +Lines 158 MimeEntityEnd 7938653 MultipartBoundaryBegin 7938653 MultipartBoundaryEnd 7938697 @@ -4918,6 +6176,8 @@ MimeEntityBegin 7938697 MimeEntityHeadersEnd 7938857 MimeContentBegin 7938857 MimeContentEnd 7960571 +Octets 21714 +Lines 283 MimeEntityEnd 7960572 MultipartBoundaryBegin 7960572 MultipartBoundaryEnd 7960616 @@ -4925,11 +6185,16 @@ MimeEntityBegin 7960616 MimeEntityHeadersEnd 7960819 MimeContentBegin 7960819 MimeContentEnd 7964212 +Octets 3393 +Lines 46 MimeEntityEnd 7964213 MultipartEndBoundaryBegin 7964213 MultipartEndBoundaryEnd 7964258 MultipartEpilogueBegin 7964258 MultipartEpilogueEnd 7964259 +MimeContentEnd 7964260 +Octets 46629 +Lines 650 MimeEntityEnd 7964260 MimeMessageEnd 7964260 MboxMarkerBegin 7964260 @@ -4940,6 +6205,8 @@ MimeEntityBegin 7964268 MimeEntityHeadersEnd 7965009 MimeContentBegin 7965009 MimeContentEnd 8509625 +Octets 544616 +Lines 7475 MimeEntityEnd 8509626 MimeMessageEnd 8509626 MboxMarkerBegin 8509626 @@ -4957,11 +6224,16 @@ MimeEntityBegin 8510554 MimeEntityHeadersEnd 8510583 MimeContentBegin 8510583 MimeContentEnd 8513113 +Octets 2530 +Lines 97 MimeEntityEnd 8513114 MultipartEndBoundaryBegin 8513114 MultipartEndBoundaryEnd 8513123 MultipartEpilogueBegin 8513123 MultipartEpilogueEnd 8513124 +MimeContentEnd 8513125 +Octets 2580 +Lines 103 MimeEntityEnd 8513125 MimeMessageEnd 8513125 MboxMarkerBegin 8513125 @@ -4979,6 +6251,8 @@ MimeEntityBegin 8514048 MimeEntityHeadersEnd 8514093 MimeContentBegin 8514093 MimeContentEnd 8515175 +Octets 1082 +Lines 27 MimeEntityEnd 8515176 MultipartBoundaryBegin 8515176 MultipartBoundaryEnd 8515193 @@ -4986,11 +6260,16 @@ MimeEntityBegin 8515193 MimeEntityHeadersEnd 8515234 MimeContentBegin 8515234 MimeContentEnd 8515518 +Octets 284 +Lines 10 MimeEntityEnd 8515519 MultipartEndBoundaryBegin 8515519 MultipartEndBoundaryEnd 8515537 MultipartEpilogueBegin 8515537 MultipartEpilogueEnd 8515537 +MimeContentEnd 8515538 +Octets 1787 +Lines 51 MimeEntityEnd 8515538 MimeMessageEnd 8515538 MboxMarkerBegin 8515538 @@ -5001,6 +6280,8 @@ MimeEntityBegin 8515546 MimeEntityHeadersEnd 8516708 MimeContentBegin 8516708 MimeContentEnd 8518091 +Octets 1383 +Lines 40 MimeEntityEnd 8518092 MimeMessageEnd 8518092 MboxMarkerBegin 8518092 @@ -5011,6 +6292,8 @@ MimeEntityBegin 8518100 MimeEntityHeadersEnd 8518733 MimeContentBegin 8518733 MimeContentEnd 8519707 +Octets 974 +Lines 28 MimeEntityEnd 8519708 MimeMessageEnd 8519708 MboxMarkerBegin 8519708 @@ -5028,6 +6311,8 @@ MimeEntityBegin 8520673 MimeEntityHeadersEnd 8520717 MimeContentBegin 8520717 MimeContentEnd 8521534 +Octets 817 +Lines 16 MimeEntityEnd 8521535 MultipartBoundaryBegin 8521535 MultipartBoundaryEnd 8521575 @@ -5042,6 +6327,8 @@ MimeEntityBegin 8521702 MimeEntityHeadersEnd 8521793 MimeContentBegin 8521793 MimeContentEnd 8522284 +Octets 491 +Lines 11 MimeEntityEnd 8522285 MultipartBoundaryBegin 8522285 MultipartBoundaryEnd 8522327 @@ -5054,9 +6341,13 @@ MimeEntityBegin 8522513 MimeEntityHeadersEnd 8522540 MimeContentBegin 8522540 MimeContentEnd 8522542 +Octets 2 +Lines 3 MimeEntityEnd 8522543 MimeMessageEnd 8522543 MimeContentEnd 8522543 +Octets 30 +Lines 5 MimeEntityEnd 8522543 MultipartBoundaryBegin 8522543 MultipartBoundaryEnd 8522585 @@ -5064,6 +6355,8 @@ MimeEntityBegin 8522585 MimeEntityHeadersEnd 8522673 MimeContentBegin 8522673 MimeContentEnd 8522676 +Octets 3 +Lines 3 MimeEntityEnd 8522677 MultipartBoundaryBegin 8522677 MultipartBoundaryEnd 8522719 @@ -5076,9 +6369,13 @@ MimeEntityBegin 8522920 MimeEntityHeadersEnd 8522945 MimeContentBegin 8522945 MimeContentEnd 8522947 +Octets 2 +Lines 3 MimeEntityEnd 8522948 MimeMessageEnd 8522948 MimeContentEnd 8522948 +Octets 28 +Lines 5 MimeEntityEnd 8522948 MultipartBoundaryBegin 8522948 MultipartBoundaryEnd 8522990 @@ -5086,16 +6383,24 @@ MimeEntityBegin 8522990 MimeEntityHeadersEnd 8523081 MimeContentBegin 8523081 MimeContentEnd 8523303 +Octets 222 +Lines 8 MimeEntityEnd 8523304 MultipartEndBoundaryBegin 8523304 MultipartEndBoundaryEnd 8523347 MultipartEpilogueBegin 8523347 MultipartEpilogueEnd 8523348 +MimeContentEnd 8523349 +Octets 1689 +Lines 62 MimeEntityEnd 8523349 MultipartEndBoundaryBegin 8523349 MultipartEndBoundaryEnd 8523390 MultipartEpilogueBegin 8523390 MultipartEpilogueEnd 8523391 +MimeContentEnd 8523392 +Octets 2914 +Lines 90 MimeEntityEnd 8523392 MimeMessageEnd 8523392 MboxMarkerBegin 8523392 @@ -5106,6 +6411,8 @@ MimeEntityBegin 8523400 MimeEntityHeadersEnd 8524214 MimeContentBegin 8524214 MimeContentEnd 8525600 +Octets 1386 +Lines 43 MimeEntityEnd 8525601 MimeMessageEnd 8525601 MboxMarkerBegin 8525601 @@ -5116,6 +6423,8 @@ MimeEntityBegin 8525609 MimeEntityHeadersEnd 8525761 MimeContentBegin 8525761 MimeContentEnd 8530432 +Octets 4671 +Lines 64 MimeEntityEnd 8530433 MimeMessageEnd 8530433 MboxMarkerBegin 8530433 @@ -5133,6 +6442,8 @@ MimeEntityBegin 8532379 MimeEntityHeadersEnd 8532423 MimeContentBegin 8532423 MimeContentEnd 8534090 +Octets 1667 +Lines 39 MimeEntityEnd 8534091 MultipartBoundaryBegin 8534091 MultipartBoundaryEnd 8534131 @@ -5147,6 +6458,8 @@ MimeEntityBegin 8534258 MimeEntityHeadersEnd 8534349 MimeContentBegin 8534349 MimeContentEnd 8534906 +Octets 557 +Lines 15 MimeEntityEnd 8534907 MultipartBoundaryBegin 8534907 MultipartBoundaryEnd 8534949 @@ -5154,6 +6467,8 @@ MimeEntityBegin 8534949 MimeEntityHeadersEnd 8535010 MimeContentBegin 8535010 MimeContentEnd 8535882 +Octets 872 +Lines 13 MimeEntityEnd 8535883 MultipartBoundaryBegin 8535883 MultipartBoundaryEnd 8535925 @@ -5161,6 +6476,8 @@ MimeEntityBegin 8535925 MimeEntityHeadersEnd 8536016 MimeContentBegin 8536016 MimeContentEnd 8536062 +Octets 46 +Lines 6 MimeEntityEnd 8536063 MultipartBoundaryBegin 8536063 MultipartBoundaryEnd 8536105 @@ -5168,6 +6485,8 @@ MimeEntityBegin 8536105 MimeEntityHeadersEnd 8536166 MimeContentBegin 8536166 MimeContentEnd 8537038 +Octets 872 +Lines 13 MimeEntityEnd 8537039 MultipartBoundaryBegin 8537039 MultipartBoundaryEnd 8537081 @@ -5175,6 +6494,8 @@ MimeEntityBegin 8537081 MimeEntityHeadersEnd 8537172 MimeContentBegin 8537172 MimeContentEnd 8537218 +Octets 46 +Lines 6 MimeEntityEnd 8537219 MultipartBoundaryBegin 8537219 MultipartBoundaryEnd 8537261 @@ -5182,6 +6503,8 @@ MimeEntityBegin 8537261 MimeEntityHeadersEnd 8537322 MimeContentBegin 8537322 MimeContentEnd 8538194 +Octets 872 +Lines 13 MimeEntityEnd 8538195 MultipartBoundaryBegin 8538195 MultipartBoundaryEnd 8538237 @@ -5189,6 +6512,8 @@ MimeEntityBegin 8538237 MimeEntityHeadersEnd 8538328 MimeContentBegin 8538328 MimeContentEnd 8538368 +Octets 40 +Lines 6 MimeEntityEnd 8538369 MultipartBoundaryBegin 8538369 MultipartBoundaryEnd 8538411 @@ -5196,6 +6521,8 @@ MimeEntityBegin 8538411 MimeEntityHeadersEnd 8538472 MimeContentBegin 8538472 MimeContentEnd 8538696 +Octets 224 +Lines 5 MimeEntityEnd 8538697 MultipartBoundaryBegin 8538697 MultipartBoundaryEnd 8538739 @@ -5203,6 +6530,8 @@ MimeEntityBegin 8538739 MimeEntityHeadersEnd 8538830 MimeContentBegin 8538830 MimeContentEnd 8538894 +Octets 64 +Lines 6 MimeEntityEnd 8538895 MultipartBoundaryBegin 8538895 MultipartBoundaryEnd 8538937 @@ -5210,6 +6539,8 @@ MimeEntityBegin 8538937 MimeEntityHeadersEnd 8538998 MimeContentBegin 8538998 MimeContentEnd 8539222 +Octets 224 +Lines 5 MimeEntityEnd 8539223 MultipartBoundaryBegin 8539223 MultipartBoundaryEnd 8539265 @@ -5217,6 +6548,8 @@ MimeEntityBegin 8539265 MimeEntityHeadersEnd 8539356 MimeContentBegin 8539356 MimeContentEnd 8539400 +Octets 44 +Lines 6 MimeEntityEnd 8539401 MultipartBoundaryBegin 8539401 MultipartBoundaryEnd 8539443 @@ -5224,6 +6557,8 @@ MimeEntityBegin 8539443 MimeEntityHeadersEnd 8539504 MimeContentBegin 8539504 MimeContentEnd 8539728 +Octets 224 +Lines 5 MimeEntityEnd 8539729 MultipartBoundaryBegin 8539729 MultipartBoundaryEnd 8539771 @@ -5231,6 +6566,8 @@ MimeEntityBegin 8539771 MimeEntityHeadersEnd 8539862 MimeContentBegin 8539862 MimeContentEnd 8540154 +Octets 292 +Lines 12 MimeEntityEnd 8540155 MultipartBoundaryBegin 8540155 MultipartBoundaryEnd 8540197 @@ -5238,6 +6575,8 @@ MimeEntityBegin 8540197 MimeEntityHeadersEnd 8540258 MimeContentBegin 8540258 MimeContentEnd 8541130 +Octets 872 +Lines 13 MimeEntityEnd 8541131 MultipartBoundaryBegin 8541131 MultipartBoundaryEnd 8541173 @@ -5245,6 +6584,8 @@ MimeEntityBegin 8541173 MimeEntityHeadersEnd 8541264 MimeContentBegin 8541264 MimeContentEnd 8541304 +Octets 40 +Lines 5 MimeEntityEnd 8541305 MultipartBoundaryBegin 8541305 MultipartBoundaryEnd 8541347 @@ -5252,6 +6593,8 @@ MimeEntityBegin 8541347 MimeEntityHeadersEnd 8541408 MimeContentBegin 8541408 MimeContentEnd 8543323 +Octets 1915 +Lines 28 MimeEntityEnd 8543324 MultipartBoundaryBegin 8543324 MultipartBoundaryEnd 8543366 @@ -5259,16 +6602,24 @@ MimeEntityBegin 8543366 MimeEntityHeadersEnd 8543457 MimeContentBegin 8543457 MimeContentEnd 8543467 +Octets 10 +Lines 2 MimeEntityEnd 8543468 MultipartEndBoundaryBegin 8543468 MultipartEndBoundaryEnd 8543511 MultipartEpilogueBegin 8543511 MultipartEpilogueEnd 8543512 +MimeContentEnd 8543513 +Octets 9297 +Lines 229 MimeEntityEnd 8543513 MultipartEndBoundaryBegin 8543513 MultipartEndBoundaryEnd 8543554 MultipartEpilogueBegin 8543554 MultipartEpilogueEnd 8543555 +MimeContentEnd 8543556 +Octets 11372 +Lines 280 MimeEntityEnd 8543556 MimeMessageEnd 8543556 MboxMarkerBegin 8543556 @@ -5286,6 +6637,8 @@ MimeEntityBegin 8544487 MimeEntityHeadersEnd 8544531 MimeContentBegin 8544531 MimeContentEnd 8545158 +Octets 627 +Lines 13 MimeEntityEnd 8545159 MultipartBoundaryBegin 8545159 MultipartBoundaryEnd 8545199 @@ -5300,6 +6653,8 @@ MimeEntityBegin 8545326 MimeEntityHeadersEnd 8545417 MimeContentBegin 8545417 MimeContentEnd 8545950 +Octets 533 +Lines 9 MimeEntityEnd 8545951 MultipartBoundaryBegin 8545951 MultipartBoundaryEnd 8545993 @@ -5307,6 +6662,8 @@ MimeEntityBegin 8545993 MimeEntityHeadersEnd 8546101 MimeContentBegin 8546101 MimeContentEnd 8554686 +Octets 8585 +Lines 126 MimeEntityEnd 8554687 MultipartBoundaryBegin 8554687 MultipartBoundaryEnd 8554729 @@ -5314,16 +6671,24 @@ MimeEntityBegin 8554729 MimeEntityHeadersEnd 8554820 MimeContentBegin 8554820 MimeContentEnd 8554865 +Octets 45 +Lines 4 MimeEntityEnd 8554866 MultipartEndBoundaryBegin 8554866 MultipartEndBoundaryEnd 8554909 MultipartEpilogueBegin 8554909 MultipartEpilogueEnd 8554910 +MimeContentEnd 8554911 +Octets 9627 +Lines 154 MimeEntityEnd 8554911 MultipartEndBoundaryBegin 8554911 MultipartEndBoundaryEnd 8554952 MultipartEpilogueBegin 8554952 MultipartEpilogueEnd 8554952 +MimeContentEnd 8554953 +Octets 10661 +Lines 178 MimeEntityEnd 8554953 MimeMessageEnd 8554953 MboxMarkerBegin 8554953 @@ -5341,6 +6706,8 @@ MimeEntityBegin 8555657 MimeEntityHeadersEnd 8555747 MimeContentBegin 8555747 MimeContentEnd 8555844 +Octets 97 +Lines 7 MimeEntityEnd 8555845 MultipartBoundaryBegin 8555845 MultipartBoundaryEnd 8555894 @@ -5348,11 +6715,16 @@ MimeEntityBegin 8555894 MimeEntityHeadersEnd 8556021 MimeContentBegin 8556021 MimeContentEnd 8634463 +Octets 78442 +Lines 1075 MimeEntityEnd 8634464 MultipartEndBoundaryBegin 8634464 MultipartEndBoundaryEnd 8634514 MultipartEpilogueBegin 8634514 MultipartEpilogueEnd 8634515 +MimeContentEnd 8634516 +Octets 78909 +Lines 1094 MimeEntityEnd 8634516 MimeMessageEnd 8634516 MboxMarkerBegin 8634516 @@ -5370,6 +6742,8 @@ MimeEntityBegin 8635475 MimeEntityHeadersEnd 8635519 MimeContentBegin 8635519 MimeContentEnd 8636869 +Octets 1350 +Lines 29 MimeEntityEnd 8636870 MultipartBoundaryBegin 8636870 MultipartBoundaryEnd 8636910 @@ -5384,6 +6758,8 @@ MimeEntityBegin 8637037 MimeEntityHeadersEnd 8637128 MimeContentBegin 8637128 MimeContentEnd 8638267 +Octets 1139 +Lines 23 MimeEntityEnd 8638268 MultipartBoundaryBegin 8638268 MultipartBoundaryEnd 8638310 @@ -5391,6 +6767,8 @@ MimeEntityBegin 8638310 MimeEntityHeadersEnd 8638408 MimeContentBegin 8638408 MimeContentEnd 8753651 +Octets 115243 +Lines 1580 MimeEntityEnd 8753652 MultipartBoundaryBegin 8753652 MultipartBoundaryEnd 8753694 @@ -5398,6 +6776,8 @@ MimeEntityBegin 8753694 MimeEntityHeadersEnd 8753785 MimeContentBegin 8753785 MimeContentEnd 8753908 +Octets 123 +Lines 4 MimeEntityEnd 8753909 MultipartBoundaryBegin 8753909 MultipartBoundaryEnd 8753951 @@ -5405,6 +6785,8 @@ MimeEntityBegin 8753951 MimeEntityHeadersEnd 8754050 MimeContentBegin 8754050 MimeContentEnd 8820331 +Octets 66281 +Lines 962 MimeEntityEnd 8820332 MultipartBoundaryBegin 8820332 MultipartBoundaryEnd 8820374 @@ -5412,16 +6794,24 @@ MimeEntityBegin 8820374 MimeEntityHeadersEnd 8820462 MimeContentBegin 8820462 MimeContentEnd 8820462 +Octets 0 +Lines 1 MimeEntityEnd 8820463 MultipartEndBoundaryBegin 8820463 MultipartEndBoundaryEnd 8820506 MultipartEpilogueBegin 8820506 MultipartEpilogueEnd 8820507 +MimeContentEnd 8820508 +Octets 183513 +Lines 2594 MimeEntityEnd 8820508 MultipartEndBoundaryBegin 8820508 MultipartEndBoundaryEnd 8820549 MultipartEpilogueBegin 8820549 MultipartEpilogueEnd 8820549 +MimeContentEnd 8820550 +Octets 185270 +Lines 2634 MimeEntityEnd 8820550 MimeMessageEnd 8820550 MboxMarkerBegin 8820550 @@ -5432,6 +6822,8 @@ MimeEntityBegin 8820558 MimeEntityHeadersEnd 8821395 MimeContentBegin 8821395 MimeContentEnd 8823128 +Octets 1733 +Lines 26 MimeEntityEnd 8823129 MimeMessageEnd 8823129 MboxMarkerBegin 8823129 @@ -5447,9 +6839,13 @@ MimeEntityBegin 8823767 MimeEntityHeadersEnd 8824250 MimeContentBegin 8824250 MimeContentEnd 8825125 +Octets 875 +Lines 25 MimeEntityEnd 8825126 MimeMessageEnd 8825126 MimeContentEnd 8825126 +Octets 1359 +Lines 38 MimeEntityEnd 8825126 MimeMessageEnd 8825126 MboxMarkerBegin 8825126 @@ -5467,6 +6863,8 @@ MimeEntityBegin 8825588 MimeEntityHeadersEnd 8825589 MimeContentBegin 8825589 MimeContentEnd 8825629 +Octets 40 +Lines 2 MimeEntityEnd 8825630 MultipartBoundaryBegin 8825630 MultipartBoundaryEnd 8825639 @@ -5474,11 +6872,16 @@ MimeEntityBegin 8825639 MimeEntityHeadersEnd 8825700 MimeContentBegin 8825700 MimeContentEnd 8916949 +Octets 91249 +Lines 1250 MimeEntityEnd 8916950 MultipartEndBoundaryBegin 8916950 MultipartEndBoundaryEnd 8916960 MultipartEpilogueBegin 8916960 MultipartEpilogueEnd 8916963 +MimeContentEnd 8916964 +Octets 91385 +Lines 1262 MimeEntityEnd 8916964 MimeMessageEnd 8916964 MboxMarkerBegin 8916964 @@ -5489,6 +6892,8 @@ MimeEntityBegin 8916972 MimeEntityHeadersEnd 8917462 MimeContentBegin 8917462 MimeContentEnd 8918604 +Octets 1142 +Lines 28 MimeEntityEnd 8918605 MimeMessageEnd 8918605 MboxMarkerBegin 8918605 @@ -5506,6 +6911,8 @@ MimeEntityBegin 8919758 MimeEntityHeadersEnd 8919759 MimeContentBegin 8919759 MimeContentEnd 8920299 +Octets 540 +Lines 13 MimeEntityEnd 8920300 MultipartBoundaryBegin 8920300 MultipartBoundaryEnd 8920305 @@ -5513,6 +6920,8 @@ MimeEntityBegin 8920305 MimeEntityHeadersEnd 8920421 MimeContentBegin 8920421 MimeContentEnd 8978062 +Octets 57641 +Lines 790 MimeEntityEnd 8978063 MultipartBoundaryBegin 8978063 MultipartBoundaryEnd 8978068 @@ -5520,6 +6929,8 @@ MimeEntityBegin 8978068 MimeEntityHeadersEnd 8978069 MimeContentBegin 8978069 MimeContentEnd 8981852 +Octets 3783 +Lines 84 MimeEntityEnd 8981853 MultipartBoundaryBegin 8981853 MultipartBoundaryEnd 8981858 @@ -5527,6 +6938,8 @@ MimeEntityBegin 8981858 MimeEntityHeadersEnd 8982012 MimeContentBegin 8982012 MimeContentEnd 9011647 +Octets 29635 +Lines 1010 MimeEntityEnd 9011648 MultipartBoundaryBegin 9011648 MultipartBoundaryEnd 9011653 @@ -5534,6 +6947,8 @@ MimeEntityBegin 9011653 MimeEntityHeadersEnd 9011759 MimeContentBegin 9011759 MimeContentEnd 9012475 +Octets 716 +Lines 25 MimeEntityEnd 9012476 MultipartBoundaryBegin 9012476 MultipartBoundaryEnd 9012481 @@ -5541,11 +6956,16 @@ MimeEntityBegin 9012481 MimeEntityHeadersEnd 9012598 MimeContentBegin 9012598 MimeContentEnd 9013862 +Octets 1264 +Lines 25 MimeEntityEnd 9013863 MultipartEndBoundaryBegin 9013863 MultipartEndBoundaryEnd 9013869 MultipartEpilogueBegin 9013869 MultipartEpilogueEnd 9013870 +MimeContentEnd 9013871 +Octets 94118 +Lines 1971 MimeEntityEnd 9013871 MimeMessageEnd 9013871 MboxMarkerBegin 9013871 @@ -5563,6 +6983,8 @@ MimeEntityBegin 9015073 MimeEntityHeadersEnd 9015074 MimeContentBegin 9015074 MimeContentEnd 9015975 +Octets 901 +Lines 21 MimeEntityEnd 9015976 MultipartBoundaryBegin 9015976 MultipartBoundaryEnd 9015993 @@ -5570,11 +6992,16 @@ MimeEntityBegin 9015993 MimeEntityHeadersEnd 9016072 MimeContentBegin 9016072 MimeContentEnd 9016820 +Octets 748 +Lines 13 MimeEntityEnd 9016821 MultipartEndBoundaryBegin 9016821 MultipartEndBoundaryEnd 9016839 MultipartEpilogueBegin 9016839 MultipartEpilogueEnd 9016840 +MimeContentEnd 9016841 +Octets 1785 +Lines 42 MimeEntityEnd 9016841 MimeMessageEnd 9016841 MboxMarkerBegin 9016841 @@ -5592,6 +7019,8 @@ MimeEntityBegin 9018195 MimeEntityHeadersEnd 9018273 MimeContentBegin 9018273 MimeContentEnd 9019014 +Octets 741 +Lines 14 MimeEntityEnd 9019015 MultipartBoundaryBegin 9019015 MultipartBoundaryEnd 9019022 @@ -5599,11 +7028,16 @@ MimeEntityBegin 9019022 MimeEntityHeadersEnd 9019200 MimeContentBegin 9019200 MimeContentEnd 9021415 +Octets 2215 +Lines 32 MimeEntityEnd 9021416 MultipartEndBoundaryBegin 9021416 MultipartEndBoundaryEnd 9021424 MultipartEpilogueBegin 9021424 MultipartEpilogueEnd 9021424 +MimeContentEnd 9021425 +Octets 3410 +Lines 60 MimeEntityEnd 9021425 MimeMessageEnd 9021425 MboxMarkerBegin 9021425 @@ -5621,6 +7055,8 @@ MimeEntityBegin 9022788 MimeEntityHeadersEnd 9022866 MimeContentBegin 9022866 MimeContentEnd 9025678 +Octets 2812 +Lines 47 MimeEntityEnd 9025679 MultipartBoundaryBegin 9025679 MultipartBoundaryEnd 9025700 @@ -5628,11 +7064,16 @@ MimeEntityBegin 9025700 MimeEntityHeadersEnd 9025878 MimeContentBegin 9025878 MimeContentEnd 9028425 +Octets 2547 +Lines 36 MimeEntityEnd 9028426 MultipartEndBoundaryBegin 9028426 MultipartEndBoundaryEnd 9028448 MultipartEpilogueBegin 9028448 MultipartEpilogueEnd 9028448 +MimeContentEnd 9028449 +Octets 5855 +Lines 97 MimeEntityEnd 9028449 MimeMessageEnd 9028449 MboxMarkerBegin 9028449 @@ -5643,6 +7084,8 @@ MimeEntityBegin 9028457 MimeEntityHeadersEnd 9028665 MimeContentBegin 9028665 MimeContentEnd 9032858 +Octets 4193 +Lines 58 MimeEntityEnd 9032859 MimeMessageEnd 9032859 MboxMarkerBegin 9032859 @@ -5660,6 +7103,8 @@ MimeEntityBegin 9033864 MimeEntityHeadersEnd 9033998 MimeContentBegin 9033998 MimeContentEnd 9044720 +Octets 10722 +Lines 147 MimeEntityEnd 9044721 MultipartBoundaryBegin 9044721 MultipartBoundaryEnd 9044748 @@ -5667,11 +7112,16 @@ MimeEntityBegin 9044748 MimeEntityHeadersEnd 9044899 MimeContentBegin 9044899 MimeContentEnd 9049510 +Octets 4611 +Lines 64 MimeEntityEnd 9049511 MultipartEndBoundaryBegin 9049511 MultipartEndBoundaryEnd 9049539 MultipartEpilogueBegin 9049539 MultipartEpilogueEnd 9049540 +MimeContentEnd 9049541 +Octets 15750 +Lines 225 MimeEntityEnd 9049541 MimeMessageEnd 9049541 MboxMarkerBegin 9049541 @@ -5682,6 +7132,8 @@ MimeEntityBegin 9049573 MimeEntityHeadersEnd 9050380 MimeContentBegin 9050380 MimeContentEnd 9067141 +Octets 16761 +Lines 258 MimeEntityEnd 9067142 MimeMessageEnd 9067142 MboxMarkerBegin 9067142 @@ -5692,6 +7144,8 @@ MimeEntityBegin 9067174 MimeEntityHeadersEnd 9067986 MimeContentBegin 9067986 MimeContentEnd 9092950 +Octets 24964 +Lines 385 MimeEntityEnd 9092951 MimeMessageEnd 9092951 MboxMarkerBegin 9092951 @@ -5702,6 +7156,8 @@ MimeEntityBegin 9092983 MimeEntityHeadersEnd 9093795 MimeContentBegin 9093795 MimeContentEnd 9129926 +Octets 36131 +Lines 556 MimeEntityEnd 9129927 MimeMessageEnd 9129927 MboxMarkerBegin 9129927 @@ -5712,6 +7168,8 @@ MimeEntityBegin 9129959 MimeEntityHeadersEnd 9130774 MimeContentBegin 9130774 MimeContentEnd 9182075 +Octets 51301 +Lines 790 MimeEntityEnd 9182076 MimeMessageEnd 9182076 MboxMarkerBegin 9182076 @@ -5722,6 +7180,8 @@ MimeEntityBegin 9182108 MimeEntityHeadersEnd 9183499 MimeContentBegin 9183499 MimeContentEnd 9184930 +Octets 1431 +Lines 20 MimeEntityEnd 9184931 MimeMessageEnd 9184931 MboxMarkerBegin 9184931 @@ -5739,6 +7199,8 @@ MimeEntityBegin 9186361 MimeEntityHeadersEnd 9186425 MimeContentBegin 9186425 MimeContentEnd 9186532 +Octets 107 +Lines 4 MimeEntityEnd 9186533 MultipartBoundaryBegin 9186533 MultipartBoundaryEnd 9186577 @@ -5746,11 +7208,16 @@ MimeEntityBegin 9186577 MimeEntityHeadersEnd 9186728 MimeContentBegin 9186728 MimeContentEnd 9190661 +Octets 3933 +Lines 54 MimeEntityEnd 9190662 MultipartEndBoundaryBegin 9190662 MultipartEndBoundaryEnd 9190707 MultipartEpilogueBegin 9190707 MultipartEpilogueEnd 9190708 +MimeContentEnd 9190709 +Octets 4393 +Lines 70 MimeEntityEnd 9190709 MimeMessageEnd 9190709 MboxMarkerBegin 9190709 @@ -5761,6 +7228,8 @@ MimeEntityBegin 9190741 MimeEntityHeadersEnd 9191951 MimeContentBegin 9191951 MimeContentEnd 9195446 +Octets 3495 +Lines 56 MimeEntityEnd 9195447 MimeMessageEnd 9195447 MboxMarkerBegin 9195447 @@ -5771,6 +7240,8 @@ MimeEntityBegin 9195479 MimeEntityHeadersEnd 9196556 MimeContentBegin 9196556 MimeContentEnd 9197217 +Octets 661 +Lines 10 MimeEntityEnd 9197218 MimeMessageEnd 9197218 MboxMarkerBegin 9197218 @@ -5781,6 +7252,8 @@ MimeEntityBegin 9197226 MimeEntityHeadersEnd 9197618 MimeContentBegin 9197618 MimeContentEnd 9205238 +Octets 7620 +Lines 105 MimeEntityEnd 9205239 MimeMessageEnd 9205239 MboxMarkerBegin 9205239 @@ -5796,9 +7269,13 @@ MimeEntityBegin 9206054 MimeEntityHeadersEnd 9207434 MimeContentBegin 9207434 MimeContentEnd 9208866 +Octets 1432 +Lines 21 MimeEntityEnd 9208867 MimeMessageEnd 9208867 MimeContentEnd 9208867 +Octets 2813 +Lines 44 MimeEntityEnd 9208867 MimeMessageEnd 9208867 MboxMarkerBegin 9208867 @@ -5816,6 +7293,8 @@ MimeEntityBegin 9209682 MimeEntityHeadersEnd 9209758 MimeContentBegin 9209758 MimeContentEnd 9209773 +Octets 15 +Lines 2 MimeEntityEnd 9209774 MultipartBoundaryBegin 9209774 MultipartBoundaryEnd 9209801 @@ -5828,14 +7307,21 @@ MimeEntityBegin 9209955 MimeEntityHeadersEnd 9211335 MimeContentBegin 9211335 MimeContentEnd 9212767 +Octets 1432 +Lines 21 MimeEntityEnd 9212768 MimeMessageEnd 9212768 MimeContentEnd 9212768 +Octets 2813 +Lines 44 MimeEntityEnd 9212768 MultipartEndBoundaryBegin 9212768 MultipartEndBoundaryEnd 9212796 MultipartEpilogueBegin 9212796 MultipartEpilogueEnd 9212797 +MimeContentEnd 9212798 +Octets 3189 +Lines 59 MimeEntityEnd 9212798 MimeMessageEnd 9212798 MboxMarkerBegin 9212798 @@ -5853,6 +7339,8 @@ MimeEntityBegin 9213596 MimeEntityHeadersEnd 9213672 MimeContentBegin 9213672 MimeContentEnd 9213713 +Octets 41 +Lines 2 MimeEntityEnd 9213714 MultipartBoundaryBegin 9213714 MultipartBoundaryEnd 9213755 @@ -5860,11 +7348,16 @@ MimeEntityBegin 9213755 MimeEntityHeadersEnd 9213906 MimeContentBegin 9213906 MimeContentEnd 9219462 +Octets 5556 +Lines 77 MimeEntityEnd 9219463 MultipartEndBoundaryBegin 9219463 MultipartEndBoundaryEnd 9219505 MultipartEpilogueBegin 9219505 MultipartEpilogueEnd 9219506 +MimeContentEnd 9219507 +Octets 6012 +Lines 92 MimeEntityEnd 9219507 MimeMessageEnd 9219507 MboxMarkerBegin 9219507 @@ -5875,6 +7368,8 @@ MimeEntityBegin 9219539 MimeEntityHeadersEnd 9220601 MimeContentBegin 9220601 MimeContentEnd 9230837 +Octets 10236 +Lines 141 MimeEntityEnd 9230838 MimeMessageEnd 9230838 MboxMarkerBegin 9230838 @@ -5892,6 +7387,8 @@ MimeEntityBegin 9232347 MimeEntityHeadersEnd 9232423 MimeContentBegin 9232423 MimeContentEnd 9233034 +Octets 611 +Lines 17 MimeEntityEnd 9233035 MultipartBoundaryBegin 9233035 MultipartBoundaryEnd 9233076 @@ -5899,11 +7396,16 @@ MimeEntityBegin 9233076 MimeEntityHeadersEnd 9233227 MimeContentBegin 9233227 MimeContentEnd 9235015 +Octets 1788 +Lines 25 MimeEntityEnd 9235016 MultipartEndBoundaryBegin 9235016 MultipartEndBoundaryEnd 9235058 MultipartEpilogueBegin 9235058 MultipartEpilogueEnd 9235059 +MimeContentEnd 9235060 +Octets 2814 +Lines 55 MimeEntityEnd 9235060 MimeMessageEnd 9235060 MboxMarkerBegin 9235060 @@ -5914,6 +7416,8 @@ MimeEntityBegin 9235092 MimeEntityHeadersEnd 9235640 MimeContentBegin 9235640 MimeContentEnd 9236163 +Octets 523 +Lines 8 MimeEntityEnd 9236164 MimeMessageEnd 9236164 MboxMarkerBegin 9236164 @@ -5931,11 +7435,16 @@ MimeEntityBegin 9237745 MimeEntityHeadersEnd 9237789 MimeContentBegin 9237789 MimeContentEnd 9238377 +Octets 588 +Lines 16 MimeEntityEnd 9238378 MultipartEndBoundaryBegin 9238378 MultipartEndBoundaryEnd 9238420 MultipartEpilogueBegin 9238420 MultipartEpilogueEnd 9238420 +MimeContentEnd 9238421 +Octets 933 +Lines 24 MimeEntityEnd 9238421 MimeMessageEnd 9238421 MboxMarkerBegin 9238421 @@ -5953,6 +7462,8 @@ MimeEntityBegin 9240033 MimeEntityHeadersEnd 9240077 MimeContentBegin 9240077 MimeContentEnd 9240178 +Octets 101 +Lines 7 MimeEntityEnd 9240179 MultipartBoundaryBegin 9240179 MultipartBoundaryEnd 9240220 @@ -5967,6 +7478,8 @@ MimeEntityBegin 9240638 MimeEntityHeadersEnd 9240745 MimeContentBegin 9240745 MimeContentEnd 9240836 +Octets 91 +Lines 5 MimeEntityEnd 9240837 MultipartBoundaryBegin 9240837 MultipartBoundaryEnd 9240876 @@ -5979,9 +7492,13 @@ MimeEntityBegin 9240969 MimeEntityHeadersEnd 9242136 MimeContentBegin 9242136 MimeContentEnd 9242341 +Octets 205 +Lines 6 MimeEntityEnd 9242342 MimeMessageEnd 9242342 MimeContentEnd 9242342 +Octets 1373 +Lines 35 MimeEntityEnd 9242342 MultipartBoundaryBegin 9242342 MultipartBoundaryEnd 9242381 @@ -5989,11 +7506,16 @@ MimeEntityBegin 9242381 MimeEntityHeadersEnd 9242547 MimeContentBegin 9242547 MimeContentEnd 9243026 +Octets 479 +Lines 12 MimeEntityEnd 9243027 MultipartEndBoundaryBegin 9243027 MultipartEndBoundaryEnd 9243067 MultipartEpilogueBegin 9243067 MultipartEpilogueEnd 9243067 +MimeContentEnd 9243068 +Octets 2685 +Lines 70 MimeEntityEnd 9243068 MultipartBoundaryBegin 9243068 MultipartBoundaryEnd 9243109 @@ -6001,11 +7523,16 @@ MimeEntityBegin 9243109 MimeEntityHeadersEnd 9243321 MimeContentBegin 9243321 MimeContentEnd 9248544 +Octets 5223 +Lines 72 MimeEntityEnd 9248545 MultipartEndBoundaryBegin 9248545 MultipartEndBoundaryEnd 9248587 MultipartEpilogueBegin 9248587 MultipartEpilogueEnd 9248589 +MimeContentEnd 9248590 +Octets 8814 +Lines 170 MimeEntityEnd 9248590 MimeMessageEnd 9248590 MboxMarkerBegin 9248590 @@ -6016,6 +7543,8 @@ MimeEntityBegin 9248622 MimeEntityHeadersEnd 9249837 MimeContentBegin 9249837 MimeContentEnd 9252719 +Octets 2882 +Lines 39 MimeEntityEnd 9252720 MimeMessageEnd 9252720 MboxMarkerBegin 9252720 @@ -6026,6 +7555,8 @@ MimeEntityBegin 9252752 MimeEntityHeadersEnd 9253910 MimeContentBegin 9253910 MimeContentEnd 9256032 +Octets 2122 +Lines 31 MimeEntityEnd 9256033 MimeMessageEnd 9256033 MboxMarkerBegin 9256033 @@ -6043,6 +7574,8 @@ MimeEntityBegin 9257176 MimeEntityHeadersEnd 9257240 MimeContentBegin 9257240 MimeContentEnd 9257240 +Octets 0 +Lines 1 MimeEntityEnd 9257241 MultipartBoundaryBegin 9257241 MultipartBoundaryEnd 9257273 @@ -6050,11 +7583,16 @@ MimeEntityBegin 9257273 MimeEntityHeadersEnd 9257352 MimeContentBegin 9257352 MimeContentEnd 9260065 +Octets 2713 +Lines 42 MimeEntityEnd 9260066 MultipartEndBoundaryBegin 9260066 MultipartEndBoundaryEnd 9260099 MultipartEpilogueBegin 9260099 MultipartEpilogueEnd 9260100 +MimeContentEnd 9260101 +Octets 2958 +Lines 54 MimeEntityEnd 9260101 MimeMessageEnd 9260101 MboxMarkerBegin 9260101 @@ -6072,6 +7610,8 @@ MimeEntityBegin 9261211 MimeEntityHeadersEnd 9261289 MimeContentBegin 9261289 MimeContentEnd 9261742 +Octets 453 +Lines 14 MimeEntityEnd 9261743 MultipartBoundaryBegin 9261743 MultipartBoundaryEnd 9261783 @@ -6079,6 +7619,8 @@ MimeEntityBegin 9261783 MimeEntityHeadersEnd 9261858 MimeContentBegin 9261858 MimeContentEnd 9262669 +Octets 811 +Lines 27 MimeEntityEnd 9262670 MultipartBoundaryBegin 9262670 MultipartBoundaryEnd 9262710 @@ -6086,11 +7628,16 @@ MimeEntityBegin 9262710 MimeEntityHeadersEnd 9262807 MimeContentBegin 9262807 MimeContentEnd 9264007 +Octets 1200 +Lines 17 MimeEntityEnd 9264008 MultipartEndBoundaryBegin 9264008 MultipartEndBoundaryEnd 9264049 MultipartEpilogueBegin 9264049 MultipartEpilogueEnd 9264050 +MimeContentEnd 9264051 +Octets 2881 +Lines 73 MimeEntityEnd 9264051 MimeMessageEnd 9264051 MboxMarkerBegin 9264051 @@ -6108,6 +7655,8 @@ MimeEntityBegin 9265201 MimeEntityHeadersEnd 9265271 MimeContentBegin 9265271 MimeContentEnd 9265423 +Octets 152 +Lines 8 MimeEntityEnd 9265424 MultipartBoundaryBegin 9265424 MultipartBoundaryEnd 9265466 @@ -6115,11 +7664,16 @@ MimeEntityBegin 9265466 MimeEntityHeadersEnd 9265545 MimeContentBegin 9265545 MimeContentEnd 9269641 +Octets 4096 +Lines 57 MimeEntityEnd 9269642 MultipartEndBoundaryBegin 9269642 MultipartEndBoundaryEnd 9269685 MultipartEpilogueBegin 9269685 MultipartEpilogueEnd 9269686 +MimeContentEnd 9269687 +Octets 4529 +Lines 76 MimeEntityEnd 9269687 MimeMessageEnd 9269687 MboxMarkerBegin 9269687 @@ -6137,6 +7691,8 @@ MimeEntityBegin 9270290 MimeEntityHeadersEnd 9270354 MimeContentBegin 9270354 MimeContentEnd 9270509 +Octets 155 +Lines 4 MimeEntityEnd 9270510 MultipartBoundaryBegin 9270510 MultipartBoundaryEnd 9270553 @@ -6144,11 +7700,16 @@ MimeEntityBegin 9270553 MimeEntityHeadersEnd 9270704 MimeContentBegin 9270704 MimeContentEnd 9274621 +Octets 3917 +Lines 54 MimeEntityEnd 9274622 MultipartEndBoundaryBegin 9274622 MultipartEndBoundaryEnd 9274666 MultipartEpilogueBegin 9274666 MultipartEpilogueEnd 9274666 +MimeContentEnd 9274667 +Octets 4421 +Lines 69 MimeEntityEnd 9274667 MimeMessageEnd 9274667 MboxMarkerBegin 9274667 @@ -6166,6 +7727,8 @@ MimeEntityBegin 9276040 MimeEntityHeadersEnd 9276118 MimeContentBegin 9276118 MimeContentEnd 9276190 +Octets 72 +Lines 6 MimeEntityEnd 9276191 MultipartBoundaryBegin 9276191 MultipartBoundaryEnd 9276231 @@ -6173,11 +7736,16 @@ MimeEntityBegin 9276231 MimeEntityHeadersEnd 9276326 MimeContentBegin 9276326 MimeContentEnd 9279885 +Octets 3559 +Lines 48 MimeEntityEnd 9279886 MultipartEndBoundaryBegin 9279886 MultipartEndBoundaryEnd 9279927 MultipartEpilogueBegin 9279927 MultipartEpilogueEnd 9279928 +MimeContentEnd 9279929 +Octets 4066 +Lines 67 MimeEntityEnd 9279929 MimeMessageEnd 9279929 MboxMarkerBegin 9279929 @@ -6195,6 +7763,8 @@ MimeEntityBegin 9281097 MimeEntityHeadersEnd 9281175 MimeContentBegin 9281175 MimeContentEnd 9281249 +Octets 74 +Lines 5 MimeEntityEnd 9281250 MultipartBoundaryBegin 9281250 MultipartBoundaryEnd 9281283 @@ -6202,11 +7772,16 @@ MimeEntityBegin 9281283 MimeEntityHeadersEnd 9281362 MimeContentBegin 9281362 MimeContentEnd 9285079 +Octets 3717 +Lines 58 MimeEntityEnd 9285080 MultipartEndBoundaryBegin 9285080 MultipartEndBoundaryEnd 9285114 MultipartEpilogueBegin 9285114 MultipartEpilogueEnd 9285114 +MimeContentEnd 9285115 +Octets 4052 +Lines 73 MimeEntityEnd 9285115 MimeMessageEnd 9285115 MboxMarkerBegin 9285115 @@ -6224,6 +7799,8 @@ MimeEntityBegin 9286412 MimeEntityHeadersEnd 9286451 MimeContentBegin 9286451 MimeContentEnd 9286639 +Octets 188 +Lines 7 MimeEntityEnd 9286640 MultipartBoundaryBegin 9286640 MultipartBoundaryEnd 9286664 @@ -6236,14 +7813,21 @@ MimeEntityBegin 9286694 MimeEntityHeadersEnd 9287500 MimeContentBegin 9287500 MimeContentEnd 9287511 +Octets 11 +Lines 1 MimeEntityEnd 9287512 MimeMessageEnd 9287512 MimeContentEnd 9287512 +Octets 818 +Lines 16 MimeEntityEnd 9287512 MultipartEndBoundaryBegin 9287512 MultipartEndBoundaryEnd 9287537 MultipartEpilogueBegin 9287537 MultipartEpilogueEnd 9287538 +MimeContentEnd 9287539 +Octets 1264 +Lines 35 MimeEntityEnd 9287539 MimeMessageEnd 9287539 MboxMarkerBegin 9287539 @@ -6254,6 +7838,8 @@ MimeEntityBegin 9287585 MimeEntityHeadersEnd 9287750 MimeContentBegin 9287750 MimeContentEnd 9322244 +Octets 34494 +Lines 593 MimeEntityEnd 9322245 MimeMessageEnd 9322245 MboxMarkerBegin 9322245 @@ -6264,6 +7850,8 @@ MimeEntityBegin 9322291 MimeEntityHeadersEnd 9322449 MimeContentBegin 9322449 MimeContentEnd 9356943 +Octets 34494 +Lines 593 MimeEntityEnd 9356944 MimeMessageEnd 9356944 MboxMarkerBegin 9356944 @@ -6274,6 +7862,8 @@ MimeEntityBegin 9356952 MimeEntityHeadersEnd 9357549 MimeContentBegin 9357549 MimeContentEnd 9358949 +Octets 1400 +Lines 39 MimeEntityEnd 9358950 MimeMessageEnd 9358950 MboxMarkerBegin 9358950 @@ -6291,6 +7881,8 @@ MimeEntityBegin 9359897 MimeEntityHeadersEnd 9359923 MimeContentBegin 9359923 MimeContentEnd 9360268 +Octets 345 +Lines 11 MimeEntityEnd 9360269 MultipartBoundaryBegin 9360269 MultipartBoundaryEnd 9360308 @@ -6298,11 +7890,16 @@ MimeEntityBegin 9360308 MimeEntityHeadersEnd 9360401 MimeContentBegin 9360401 MimeContentEnd 9601970 +Octets 241569 +Lines 3962 MimeEntityEnd 9601971 MultipartEndBoundaryBegin 9601971 MultipartEndBoundaryEnd 9602011 MultipartEpilogueBegin 9602011 MultipartEpilogueEnd 9602012 +MimeContentEnd 9602013 +Octets 242155 +Lines 3983 MimeEntityEnd 9602013 MimeMessageEnd 9602013 MboxMarkerBegin 9602013 @@ -6320,11 +7917,16 @@ MimeEntityBegin 9602676 MimeEntityHeadersEnd 9602835 MimeContentBegin 9602835 MimeContentEnd 9681124 +Octets 78289 +Lines 406 MimeEntityEnd 9681125 MultipartEndBoundaryBegin 9681125 MultipartEndBoundaryEnd 9681153 MultipartEpilogueBegin 9681153 MultipartEpilogueEnd 9681155 +MimeContentEnd 9681156 +Octets 78541 +Lines 417 MimeEntityEnd 9681156 MimeMessageEnd 9681156 MboxMarkerBegin 9681156 @@ -6335,6 +7937,8 @@ MimeEntityBegin 9681164 MimeEntityHeadersEnd 9681316 MimeContentBegin 9681316 MimeContentEnd 9684876 +Octets 3560 +Lines 49 MimeEntityEnd 9684877 MimeMessageEnd 9684877 MboxMarkerBegin 9684877 @@ -6352,6 +7956,8 @@ MimeEntityBegin 9685852 MimeEntityHeadersEnd 9685896 MimeContentBegin 9685896 MimeContentEnd 9686310 +Octets 414 +Lines 8 MimeEntityEnd 9686311 MultipartBoundaryBegin 9686311 MultipartBoundaryEnd 9686351 @@ -6366,6 +7972,8 @@ MimeEntityBegin 9686478 MimeEntityHeadersEnd 9686569 MimeContentBegin 9686569 MimeContentEnd 9686640 +Octets 71 +Lines 2 MimeEntityEnd 9686641 MultipartBoundaryBegin 9686641 MultipartBoundaryEnd 9686683 @@ -6373,6 +7981,8 @@ MimeEntityBegin 9686683 MimeEntityHeadersEnd 9686782 MimeContentBegin 9686782 MimeContentEnd 9697479 +Octets 10697 +Lines 158 MimeEntityEnd 9697480 MultipartBoundaryBegin 9697480 MultipartBoundaryEnd 9697522 @@ -6380,6 +7990,8 @@ MimeEntityBegin 9697522 MimeEntityHeadersEnd 9697613 MimeContentBegin 9697613 MimeContentEnd 9697677 +Octets 64 +Lines 3 MimeEntityEnd 9697678 MultipartBoundaryBegin 9697678 MultipartBoundaryEnd 9697720 @@ -6387,6 +7999,8 @@ MimeEntityBegin 9697720 MimeEntityHeadersEnd 9697813 MimeContentBegin 9697813 MimeContentEnd 9703716 +Octets 5903 +Lines 88 MimeEntityEnd 9703717 MultipartBoundaryBegin 9703717 MultipartBoundaryEnd 9703759 @@ -6394,6 +8008,8 @@ MimeEntityBegin 9703759 MimeEntityHeadersEnd 9703850 MimeContentBegin 9703850 MimeContentEnd 9703883 +Octets 33 +Lines 3 MimeEntityEnd 9703884 MultipartBoundaryBegin 9703884 MultipartBoundaryEnd 9703926 @@ -6401,6 +8017,8 @@ MimeEntityBegin 9703926 MimeEntityHeadersEnd 9704027 MimeContentBegin 9704027 MimeContentEnd 9715673 +Octets 11646 +Lines 171 MimeEntityEnd 9715674 MultipartBoundaryBegin 9715674 MultipartBoundaryEnd 9715716 @@ -6408,16 +8026,24 @@ MimeEntityBegin 9715716 MimeEntityHeadersEnd 9715807 MimeContentBegin 9715807 MimeContentEnd 9715838 +Octets 31 +Lines 3 MimeEntityEnd 9715839 MultipartEndBoundaryBegin 9715839 MultipartEndBoundaryEnd 9715882 MultipartEpilogueBegin 9715882 MultipartEpilogueEnd 9715883 +MimeContentEnd 9715884 +Octets 29448 +Lines 461 MimeEntityEnd 9715884 MultipartEndBoundaryBegin 9715884 MultipartEndBoundaryEnd 9715925 MultipartEpilogueBegin 9715925 MultipartEpilogueEnd 9715925 +MimeContentEnd 9715926 +Octets 30269 +Lines 480 MimeEntityEnd 9715926 MimeMessageEnd 9715926 MboxMarkerBegin 9715926 @@ -6428,6 +8054,8 @@ MimeEntityBegin 9715934 MimeEntityHeadersEnd 9715990 MimeContentBegin 9715990 MimeContentEnd 9717198 +Octets 1208 +Lines 28 MimeEntityEnd 9717199 MimeMessageEnd 9717199 MboxMarkerBegin 9717199 @@ -6438,6 +8066,8 @@ MimeEntityBegin 9717231 MimeEntityHeadersEnd 9717382 MimeContentBegin 9717382 MimeContentEnd 9720490 +Octets 3108 +Lines 68 MimeEntityEnd 9720491 MimeMessageEnd 9720491 MboxMarkerBegin 9720491 @@ -6455,6 +8085,8 @@ MimeEntityBegin 9722432 MimeEntityHeadersEnd 9722510 MimeContentBegin 9722510 MimeContentEnd 9723373 +Octets 863 +Lines 19 MimeEntityEnd 9723374 MultipartBoundaryBegin 9723374 MultipartBoundaryEnd 9723418 @@ -6462,11 +8094,16 @@ MimeEntityBegin 9723418 MimeEntityHeadersEnd 9723579 MimeContentBegin 9723579 MimeContentEnd 9727220 +Octets 3641 +Lines 62 MimeEntityEnd 9727221 MultipartEndBoundaryBegin 9727221 MultipartEndBoundaryEnd 9727266 MultipartEpilogueBegin 9727266 MultipartEpilogueEnd 9727267 +MimeContentEnd 9727268 +Octets 4880 +Lines 93 MimeEntityEnd 9727268 MimeMessageEnd 9727268 MboxMarkerBegin 9727268 @@ -6484,6 +8121,8 @@ MimeEntityBegin 9727847 MimeEntityHeadersEnd 9727874 MimeContentBegin 9727874 MimeContentEnd 9728837 +Octets 963 +Lines 20 MimeEntityEnd 9728838 MultipartBoundaryBegin 9728838 MultipartBoundaryEnd 9728854 @@ -6491,11 +8130,16 @@ MimeEntityBegin 9728854 MimeEntityHeadersEnd 9728914 MimeContentBegin 9728914 MimeContentEnd 9844640 +Octets 115726 +Lines 1587 MimeEntityEnd 9844641 MultipartEndBoundaryBegin 9844641 MultipartEndBoundaryEnd 9844658 MultipartEpilogueBegin 9844658 MultipartEpilogueEnd 9844660 +MimeContentEnd 9844661 +Octets 116831 +Lines 1618 MimeEntityEnd 9844661 MimeMessageEnd 9844661 MboxMarkerBegin 9844661 @@ -6513,6 +8157,8 @@ MimeEntityBegin 9845660 MimeEntityHeadersEnd 9845704 MimeContentBegin 9845704 MimeContentEnd 9854667 +Octets 8963 +Lines 350 MimeEntityEnd 9854668 MultipartBoundaryBegin 9854668 MultipartBoundaryEnd 9854708 @@ -6527,6 +8173,8 @@ MimeEntityBegin 9854835 MimeEntityHeadersEnd 9854926 MimeContentBegin 9854926 MimeContentEnd 9857701 +Octets 2775 +Lines 70 MimeEntityEnd 9857702 MultipartBoundaryBegin 9857702 MultipartBoundaryEnd 9857744 @@ -6539,9 +8187,13 @@ MimeEntityBegin 9857940 MimeEntityHeadersEnd 9857967 MimeContentBegin 9857967 MimeContentEnd 9857969 +Octets 2 +Lines 3 MimeEntityEnd 9857970 MimeMessageEnd 9857970 MimeContentEnd 9857970 +Octets 30 +Lines 5 MimeEntityEnd 9857970 MultipartBoundaryBegin 9857970 MultipartBoundaryEnd 9858012 @@ -6549,6 +8201,8 @@ MimeEntityBegin 9858012 MimeEntityHeadersEnd 9858103 MimeContentBegin 9858103 MimeContentEnd 9859077 +Octets 974 +Lines 23 MimeEntityEnd 9859078 MultipartBoundaryBegin 9859078 MultipartBoundaryEnd 9859120 @@ -6556,6 +8210,8 @@ MimeEntityBegin 9859120 MimeEntityHeadersEnd 9859236 MimeContentBegin 9859236 MimeContentEnd 9859595 +Octets 359 +Lines 16 MimeEntityEnd 9859596 MultipartBoundaryBegin 9859596 MultipartBoundaryEnd 9859638 @@ -6563,6 +8219,8 @@ MimeEntityBegin 9859638 MimeEntityHeadersEnd 9859729 MimeContentBegin 9859729 MimeContentEnd 9859739 +Octets 10 +Lines 3 MimeEntityEnd 9859740 MultipartBoundaryBegin 9859740 MultipartBoundaryEnd 9859782 @@ -6575,9 +8233,13 @@ MimeEntityBegin 9859967 MimeEntityHeadersEnd 9859994 MimeContentBegin 9859994 MimeContentEnd 9859995 +Octets 1 +Lines 2 MimeEntityEnd 9859996 MimeMessageEnd 9859996 MimeContentEnd 9859996 +Octets 29 +Lines 4 MimeEntityEnd 9859996 MultipartBoundaryBegin 9859996 MultipartBoundaryEnd 9860038 @@ -6585,6 +8247,8 @@ MimeEntityBegin 9860038 MimeEntityHeadersEnd 9860129 MimeContentBegin 9860129 MimeContentEnd 9860139 +Octets 10 +Lines 3 MimeEntityEnd 9860140 MultipartBoundaryBegin 9860140 MultipartBoundaryEnd 9860182 @@ -6592,6 +8256,8 @@ MimeEntityBegin 9860182 MimeEntityHeadersEnd 9860288 MimeContentBegin 9860288 MimeContentEnd 9863271 +Octets 2983 +Lines 44 MimeEntityEnd 9863272 MultipartBoundaryBegin 9863272 MultipartBoundaryEnd 9863314 @@ -6599,16 +8265,24 @@ MimeEntityBegin 9863314 MimeEntityHeadersEnd 9863405 MimeContentBegin 9863405 MimeContentEnd 9869997 +Octets 6592 +Lines 261 MimeEntityEnd 9869998 MultipartEndBoundaryBegin 9869998 MultipartEndBoundaryEnd 9870041 MultipartEpilogueBegin 9870041 MultipartEpilogueEnd 9870042 +MimeContentEnd 9870043 +Octets 15250 +Lines 476 MimeEntityEnd 9870043 MultipartEndBoundaryBegin 9870043 MultipartEndBoundaryEnd 9870084 MultipartEpilogueBegin 9870084 MultipartEpilogueEnd 9870085 +MimeContentEnd 9870086 +Octets 24621 +Lines 838 MimeEntityEnd 9870086 MimeMessageEnd 9870086 MboxMarkerBegin 9870086 @@ -6626,6 +8300,8 @@ MimeEntityBegin 9871216 MimeEntityHeadersEnd 9871217 MimeContentBegin 9871217 MimeContentEnd 9871550 +Octets 333 +Lines 9 MimeEntityEnd 9871551 MultipartBoundaryBegin 9871551 MultipartBoundaryEnd 9871561 @@ -6633,6 +8309,8 @@ MimeEntityBegin 9871561 MimeEntityHeadersEnd 9871620 MimeContentBegin 9871620 MimeContentEnd 9901599 +Octets 29979 +Lines 412 MimeEntityEnd 9901600 MultipartBoundaryBegin 9901600 MultipartBoundaryEnd 9901610 @@ -6640,11 +8318,16 @@ MimeEntityBegin 9901610 MimeEntityHeadersEnd 9901611 MimeContentBegin 9901611 MimeContentEnd 9901783 +Octets 172 +Lines 10 MimeEntityEnd 9901784 MultipartEndBoundaryBegin 9901784 MultipartEndBoundaryEnd 9901795 MultipartEpilogueBegin 9901795 MultipartEpilogueEnd 9901796 +MimeContentEnd 9901797 +Octets 30591 +Lines 441 MimeEntityEnd 9901797 MimeMessageEnd 9901797 MboxMarkerBegin 9901797 @@ -6655,6 +8338,8 @@ MimeEntityBegin 9901805 MimeEntityHeadersEnd 9903514 MimeContentBegin 9903514 MimeContentEnd 10086313 +Octets 182799 +Lines 2952 MimeEntityEnd 10086314 MimeMessageEnd 10086314 MboxMarkerBegin 10086314 @@ -6672,6 +8357,8 @@ MimeEntityBegin 10087056 MimeEntityHeadersEnd 10087057 MimeContentBegin 10087057 MimeContentEnd 10087078 +Octets 21 +Lines 1 MimeEntityEnd 10087079 MultipartBoundaryBegin 10087079 MultipartBoundaryEnd 10087106 @@ -6679,6 +8366,8 @@ MimeEntityBegin 10087106 MimeEntityHeadersEnd 10087258 MimeContentBegin 10087258 MimeContentEnd 10170999 +Octets 83741 +Lines 434 MimeEntityEnd 10171000 MultipartBoundaryBegin 10171000 MultipartBoundaryEnd 10171027 @@ -6686,11 +8375,16 @@ MimeEntityBegin 10171027 MimeEntityHeadersEnd 10171028 MimeContentBegin 10171028 MimeContentEnd 10171287 +Octets 259 +Lines 9 MimeEntityEnd 10171288 MultipartEndBoundaryBegin 10171288 MultipartEndBoundaryEnd 10171316 MultipartEpilogueBegin 10171316 MultipartEpilogueEnd 10171317 +MimeContentEnd 10171318 +Octets 84289 +Lines 456 MimeEntityEnd 10171318 MimeMessageEnd 10171318 MboxMarkerBegin 10171318 @@ -6708,6 +8402,8 @@ MimeEntityBegin 10172020 MimeEntityHeadersEnd 10172021 MimeContentBegin 10172021 MimeContentEnd 10172087 +Octets 66 +Lines 1 MimeEntityEnd 10172088 MultipartBoundaryBegin 10172088 MultipartBoundaryEnd 10172115 @@ -6715,6 +8411,8 @@ MimeEntityBegin 10172115 MimeEntityHeadersEnd 10172276 MimeContentBegin 10172276 MimeContentEnd 10204442 +Octets 32166 +Lines 167 MimeEntityEnd 10204443 MultipartBoundaryBegin 10204443 MultipartBoundaryEnd 10204470 @@ -6722,6 +8420,8 @@ MimeEntityBegin 10204470 MimeEntityHeadersEnd 10204471 MimeContentBegin 10204471 MimeContentEnd 10204488 +Octets 17 +Lines 2 MimeEntityEnd 10204489 MultipartBoundaryBegin 10204489 MultipartBoundaryEnd 10204516 @@ -6729,6 +8429,8 @@ MimeEntityBegin 10204516 MimeEntityHeadersEnd 10204675 MimeContentBegin 10204675 MimeContentEnd 10205760 +Octets 1085 +Lines 6 MimeEntityEnd 10205761 MultipartBoundaryBegin 10205761 MultipartBoundaryEnd 10205788 @@ -6736,6 +8438,8 @@ MimeEntityBegin 10205788 MimeEntityHeadersEnd 10205789 MimeContentBegin 10205789 MimeContentEnd 10205819 +Octets 30 +Lines 3 MimeEntityEnd 10205820 MultipartBoundaryBegin 10205820 MultipartBoundaryEnd 10205847 @@ -6743,6 +8447,8 @@ MimeEntityBegin 10205847 MimeEntityHeadersEnd 10205915 MimeContentBegin 10205915 MimeContentEnd 10391952 +Octets 186037 +Lines 1991 MimeEntityEnd 10391953 MultipartBoundaryBegin 10391953 MultipartBoundaryEnd 10391980 @@ -6750,11 +8456,16 @@ MimeEntityBegin 10391980 MimeEntityHeadersEnd 10391981 MimeContentBegin 10391981 MimeContentEnd 10391989 +Octets 8 +Lines 1 MimeEntityEnd 10391990 MultipartEndBoundaryBegin 10391990 MultipartEndBoundaryEnd 10392018 MultipartEpilogueBegin 10392018 MultipartEpilogueEnd 10392019 +MimeContentEnd 10392020 +Octets 220027 +Lines 2197 MimeEntityEnd 10392020 MimeMessageEnd 10392020 MboxMarkerBegin 10392020 @@ -6765,6 +8476,8 @@ MimeEntityBegin 10392028 MimeEntityHeadersEnd 10392292 MimeContentBegin 10392292 MimeContentEnd 10466950 +Octets 74658 +Lines 1023 MimeEntityEnd 10466951 MimeMessageEnd 10466951 MboxMarkerBegin 10466951 @@ -6782,6 +8495,8 @@ MimeEntityBegin 10468817 MimeEntityHeadersEnd 10468818 MimeContentBegin 10468818 MimeContentEnd 10470665 +Octets 1847 +Lines 35 MimeEntityEnd 10470666 MultipartBoundaryBegin 10470666 MultipartBoundaryEnd 10470724 @@ -6796,6 +8511,8 @@ MimeEntityBegin 10470887 MimeEntityHeadersEnd 10470960 MimeContentBegin 10470960 MimeContentEnd 10472959 +Octets 1999 +Lines 30 MimeEntityEnd 10472960 MultipartBoundaryBegin 10472960 MultipartBoundaryEnd 10473020 @@ -6803,6 +8520,8 @@ MimeEntityBegin 10473020 MimeEntityHeadersEnd 10473079 MimeContentBegin 10473079 MimeContentEnd 10481008 +Octets 7929 +Lines 110 MimeEntityEnd 10481009 MultipartBoundaryBegin 10481009 MultipartBoundaryEnd 10481069 @@ -6810,6 +8529,8 @@ MimeEntityBegin 10481069 MimeEntityHeadersEnd 10481139 MimeContentBegin 10481139 MimeContentEnd 10481142 +Octets 3 +Lines 3 MimeEntityEnd 10481143 MultipartBoundaryBegin 10481143 MultipartBoundaryEnd 10481203 @@ -6817,16 +8538,24 @@ MimeEntityBegin 10481203 MimeEntityHeadersEnd 10481296 MimeContentBegin 10481296 MimeContentEnd 10523174 +Octets 41878 +Lines 575 MimeEntityEnd 10523175 MultipartEndBoundaryBegin 10523175 MultipartEndBoundaryEnd 10523236 MultipartEpilogueBegin 10523236 MultipartEpilogueEnd 10523237 +MimeContentEnd 10523238 +Octets 52411 +Lines 737 MimeEntityEnd 10523238 MultipartEndBoundaryBegin 10523238 MultipartEndBoundaryEnd 10523297 MultipartEpilogueBegin 10523297 MultipartEpilogueEnd 10523298 +MimeContentEnd 10523299 +Octets 55066 +Lines 788 MimeEntityEnd 10523299 MimeMessageEnd 10523299 MboxMarkerBegin 10523299 @@ -6837,6 +8566,8 @@ MimeEntityBegin 10523307 MimeEntityHeadersEnd 10523459 MimeContentBegin 10523459 MimeContentEnd 10528262 +Octets 4803 +Lines 68 MimeEntityEnd 10528263 MimeMessageEnd 10528263 MboxMarkerBegin 10528263 @@ -6854,6 +8585,8 @@ MimeEntityBegin 10529395 MimeEntityHeadersEnd 10529396 MimeContentBegin 10529396 MimeContentEnd 10529764 +Octets 368 +Lines 9 MimeEntityEnd 10529765 MultipartBoundaryBegin 10529765 MultipartBoundaryEnd 10529805 @@ -6868,6 +8601,8 @@ MimeEntityBegin 10529932 MimeEntityHeadersEnd 10530002 MimeContentBegin 10530002 MimeContentEnd 10530091 +Octets 89 +Lines 5 MimeEntityEnd 10530092 MultipartBoundaryBegin 10530092 MultipartBoundaryEnd 10530134 @@ -6875,6 +8610,8 @@ MimeEntityBegin 10530134 MimeEntityHeadersEnd 10530248 MimeContentBegin 10530248 MimeContentEnd 10535911 +Octets 5663 +Lines 84 MimeEntityEnd 10535912 MultipartBoundaryBegin 10535912 MultipartBoundaryEnd 10535954 @@ -6882,15 +8619,23 @@ MimeEntityBegin 10535954 MimeEntityHeadersEnd 10536024 MimeContentBegin 10536024 MimeContentEnd 10536227 +Octets 203 +Lines 7 MimeEntityEnd 10536228 MultipartEndBoundaryBegin 10536228 MultipartEndBoundaryEnd 10536271 MultipartEpilogueBegin 10536271 MultipartEpilogueEnd 10536272 +MimeContentEnd 10536273 +Octets 6383 +Lines 111 MimeEntityEnd 10536273 MultipartEndBoundaryBegin 10536273 MultipartEndBoundaryEnd 10536314 MultipartEpilogueBegin 10536314 MultipartEpilogueEnd 10536315 +MimeContentEnd 10536315 +Octets 7299 +Lines 133 MimeEntityEnd 10536315 MimeMessageEnd 10536315 From 39b0384029ce917555fa3206e79fa195e02ef963 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 16 Jun 2020 08:55:06 -0400 Subject: [PATCH 634/741] Updated README.md --- README.md | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 533317f87a..24b30477ce 100644 --- a/README.md +++ b/README.md @@ -86,25 +86,29 @@ How does your MIME parser compare? ## License Information -MimeKit is Copyright (C) 2012-2020 .NET Foundation and Contributors and is licensed under the MIT license: - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +``` +MIT License + +Copyright (C) 2012-2020 .NET Foundation and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` ## Installing via NuGet From d5a8f3756489ef89b9f9561a4f837051a1fdf363 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 16 Jun 2020 21:30:22 -0400 Subject: [PATCH 635/741] Don't include CRLF belonging to boundary marker Some more fixes for issue #582 --- MimeKit/AsyncMimeParser.cs | 15 +- MimeKit/MimeParser.cs | 32 +- UnitTests/MimeParserTests.cs | 2 +- .../mbox/content-length.dos-offsets.txt | 450 +-- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 3210 ++++++++--------- 5 files changed, 1860 insertions(+), 1849 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 3471a5030b..a0447e615b 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -361,7 +361,8 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio rfc822.Message = message; - var endOffset = GetOffset (inputIndex); + var endOffset = GetEndOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentEnd (rfc822, endOffset); @@ -441,7 +442,7 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - OnMimeEntityEnd (entity, GetOffset (inputIndex)); + OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); @@ -463,7 +464,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: this will scan all content into the preamble... await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); - endOffset = GetOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); @@ -488,7 +489,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); - endOffset = GetOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); @@ -496,7 +497,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation return; } - endOffset = GetOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); @@ -596,7 +597,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - OnMimeEntityEnd (entity, GetOffset (inputIndex)); + OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; @@ -687,7 +688,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - var endOffset = GetOffset (inputIndex); + var endOffset = GetEndOffset (inputIndex); OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index e63d09e056..45dac86b7c 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -264,7 +264,7 @@ public bool IsEndOfStream { /// /// The stream offset. public long Position { - get { return GetOffset (-1); } + get { return GetOffset (inputIndex); } } /// @@ -752,12 +752,21 @@ long GetOffset (int index) if (position == -1) return -1; - if (index == -1) - index = inputIndex; - return position - (inputEnd - index); } + long GetEndOffset (int index) + { + if (index > 1 && input[index - 1] == (byte) '\n') { + index--; + + if (index > 1 && input[index - 1] == (byte) '\r') + index--; + } + + return GetOffset (index); + } + static unsafe bool CStringsEqual (byte* str1, byte* str2, int length) { byte* se = str1 + length; @@ -1613,7 +1622,8 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca rfc822.Message = message; - var endOffset = GetOffset (inputIndex); + var endOffset = GetEndOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentEnd (rfc822, endOffset); @@ -1693,7 +1703,7 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - OnMimeEntityEnd (entity, GetOffset (inputIndex)); + OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); @@ -1728,7 +1738,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); - endOffset = GetOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); @@ -1753,7 +1763,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); MultipartScanEpilogue (multipart, inbuf, cancellationToken); - endOffset = GetOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); @@ -1761,7 +1771,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can return; } - endOffset = GetOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); @@ -1849,7 +1859,7 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - OnMimeEntityEnd (entity, GetOffset (inputIndex)); + OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; @@ -1948,7 +1958,7 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - var endOffset = GetOffset (inputIndex); + var endOffset = GetEndOffset (inputIndex); OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 23ca4c4f85..0e363bda54 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -818,7 +818,7 @@ static void AssertMboxResults (string baseName, string actual, Stream output, Li n = 0; foreach (var offset in EnumerateMimeParserOffsets (path)) { Assert.AreEqual (offset.Location, offsets[n].Location, $"Offset Location #{n}"); - Assert.AreEqual (offset.Offset, offsets[n].Offset, $"Stream Offset #{n}"); + Assert.AreEqual (offset.Offset, offsets[n].Offset, $"Stream Offset #{n} ({offset.Location})"); n++; } } diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index a97c1486ca..8d3f42606c 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -15,7 +15,7 @@ MimeContentBegin 753 MimeContentEnd 831 Octets 78 Lines 5 -MimeEntityEnd 833 +MimeEntityEnd 831 MultipartBoundaryBegin 833 MultipartBoundaryEnd 883 MimeEntityBegin 883 @@ -29,21 +29,21 @@ MimeContentBegin 1747 MimeContentEnd 1887 Octets 140 Lines 4 -MimeEntityEnd 1889 -MimeMessageEnd 1889 -MimeContentEnd 1889 -Octets 941 +MimeEntityEnd 1887 +MimeMessageEnd 1887 +MimeContentEnd 1887 +Octets 939 Lines 21 -MimeEntityEnd 1889 +MimeEntityEnd 1887 MultipartEndBoundaryBegin 1889 MultipartEndBoundaryEnd 1939 MultipartEpilogueBegin 1939 MultipartEpilogueEnd 1939 -MimeContentEnd 1941 -Octets 1266 +MimeContentEnd 1939 +Octets 1264 Lines 34 -MimeEntityEnd 1941 -MimeMessageEnd 1941 +MimeEntityEnd 1939 +MimeMessageEnd 1939 MboxMarkerBegin 1941 MboxMarkerEnd 1948 MimeMessageBegin 1950 @@ -66,12 +66,12 @@ MimeContentBegin 3095 MimeContentEnd 3134 Octets 39 Lines 3 -MimeEntityEnd 3136 -MimeMessageEnd 3136 -MimeContentEnd 3136 -Octets 481 +MimeEntityEnd 3134 +MimeMessageEnd 3134 +MimeContentEnd 3134 +Octets 479 Lines 14 -MimeEntityEnd 3136 +MimeEntityEnd 3134 MultipartBoundaryBegin 3136 MultipartBoundaryEnd 3164 MimeEntityBegin 3164 @@ -80,7 +80,7 @@ MimeContentBegin 3291 MimeContentEnd 3755 Octets 464 Lines 7 -MimeEntityEnd 3757 +MimeEntityEnd 3755 MultipartBoundaryBegin 3757 MultipartBoundaryEnd 3785 MimeEntityBegin 3785 @@ -89,7 +89,7 @@ MimeContentBegin 3912 MimeContentEnd 4404 Octets 492 Lines 7 -MimeEntityEnd 4406 +MimeEntityEnd 4404 MultipartBoundaryBegin 4406 MultipartBoundaryEnd 4434 MimeEntityBegin 4434 @@ -98,7 +98,7 @@ MimeContentBegin 4565 MimeContentEnd 5099 Octets 534 Lines 8 -MimeEntityEnd 5101 +MimeEntityEnd 5099 MultipartBoundaryBegin 5101 MultipartBoundaryEnd 5129 MimeEntityBegin 5129 @@ -107,7 +107,7 @@ MimeContentBegin 5258 MimeContentEnd 5762 Octets 504 Lines 7 -MimeEntityEnd 5764 +MimeEntityEnd 5762 MultipartBoundaryBegin 5764 MultipartBoundaryEnd 5792 MimeEntityBegin 5792 @@ -121,12 +121,12 @@ MimeContentBegin 6381 MimeContentEnd 6419 Octets 38 Lines 2 -MimeEntityEnd 6421 -MimeMessageEnd 6421 -MimeContentEnd 6421 -Octets 480 +MimeEntityEnd 6419 +MimeMessageEnd 6419 +MimeContentEnd 6419 +Octets 478 Lines 13 -MimeEntityEnd 6421 +MimeEntityEnd 6419 MultipartBoundaryBegin 6421 MultipartBoundaryEnd 6449 MimeEntityBegin 6449 @@ -150,22 +150,22 @@ MimeContentBegin 8156 MimeContentEnd 8162 Octets 6 Lines 2 -MimeEntityEnd 8164 -MimeMessageEnd 8164 -MimeContentEnd 8164 -Octets 429 +MimeEntityEnd 8162 +MimeMessageEnd 8162 +MimeContentEnd 8162 +Octets 427 Lines 13 -MimeEntityEnd 8164 -MimeMessageEnd 8164 -MimeContentEnd 8164 -Octets 954 +MimeEntityEnd 8162 +MimeMessageEnd 8162 +MimeContentEnd 8162 +Octets 952 Lines 27 -MimeEntityEnd 8164 -MimeMessageEnd 8164 -MimeContentEnd 8164 -Octets 1539 +MimeEntityEnd 8162 +MimeMessageEnd 8162 +MimeContentEnd 8162 +Octets 1537 Lines 42 -MimeEntityEnd 8164 +MimeEntityEnd 8162 MultipartBoundaryBegin 8164 MultipartBoundaryEnd 8192 MimeEntityBegin 8192 @@ -174,16 +174,16 @@ MimeContentBegin 8248 MimeContentEnd 8301 Octets 53 Lines 2 -MimeEntityEnd 8303 +MimeEntityEnd 8301 MultipartEndBoundaryBegin 8303 MultipartEndBoundaryEnd 8331 MultipartEpilogueBegin 8331 MultipartEpilogueEnd 8331 -MimeContentEnd 8333 -Octets 5903 +MimeContentEnd 8331 +Octets 5901 Lines 145 -MimeEntityEnd 8333 -MimeMessageEnd 8333 +MimeEntityEnd 8331 +MimeMessageEnd 8331 MboxMarkerBegin 8333 MboxMarkerEnd 8340 MimeMessageBegin 8342 @@ -206,12 +206,12 @@ MimeContentBegin 9493 MimeContentEnd 9532 Octets 39 Lines 3 -MimeEntityEnd 9534 -MimeMessageEnd 9534 -MimeContentEnd 9534 -Octets 480 +MimeEntityEnd 9532 +MimeMessageEnd 9532 +MimeContentEnd 9532 +Octets 478 Lines 14 -MimeEntityEnd 9534 +MimeEntityEnd 9532 MultipartBoundaryBegin 9534 MultipartBoundaryEnd 9562 MimeEntityBegin 9562 @@ -220,7 +220,7 @@ MimeContentBegin 9693 MimeContentEnd 10157 Octets 464 Lines 7 -MimeEntityEnd 10159 +MimeEntityEnd 10157 MultipartBoundaryBegin 10159 MultipartBoundaryEnd 10187 MimeEntityBegin 10187 @@ -229,7 +229,7 @@ MimeContentBegin 10318 MimeContentEnd 10810 Octets 492 Lines 7 -MimeEntityEnd 10812 +MimeEntityEnd 10810 MultipartBoundaryBegin 10812 MultipartBoundaryEnd 10840 MimeEntityBegin 10840 @@ -238,7 +238,7 @@ MimeContentBegin 10975 MimeContentEnd 11509 Octets 534 Lines 8 -MimeEntityEnd 11511 +MimeEntityEnd 11509 MultipartBoundaryBegin 11511 MultipartBoundaryEnd 11539 MimeEntityBegin 11539 @@ -247,7 +247,7 @@ MimeContentBegin 11672 MimeContentEnd 12176 Octets 504 Lines 7 -MimeEntityEnd 12178 +MimeEntityEnd 12176 MultipartBoundaryBegin 12178 MultipartBoundaryEnd 12206 MimeEntityBegin 12206 @@ -261,12 +261,12 @@ MimeContentBegin 12798 MimeContentEnd 12836 Octets 38 Lines 2 -MimeEntityEnd 12838 -MimeMessageEnd 12838 -MimeContentEnd 12838 -Octets 479 +MimeEntityEnd 12836 +MimeMessageEnd 12836 +MimeContentEnd 12836 +Octets 477 Lines 13 -MimeEntityEnd 12838 +MimeEntityEnd 12836 MultipartBoundaryBegin 12838 MultipartBoundaryEnd 12866 MimeEntityBegin 12866 @@ -290,22 +290,22 @@ MimeContentBegin 14582 MimeContentEnd 14588 Octets 6 Lines 2 -MimeEntityEnd 14590 -MimeMessageEnd 14590 -MimeContentEnd 14590 -Octets 428 +MimeEntityEnd 14588 +MimeMessageEnd 14588 +MimeContentEnd 14588 +Octets 426 Lines 13 -MimeEntityEnd 14590 -MimeMessageEnd 14590 -MimeContentEnd 14590 -Octets 956 +MimeEntityEnd 14588 +MimeMessageEnd 14588 +MimeContentEnd 14588 +Octets 954 Lines 27 -MimeEntityEnd 14590 -MimeMessageEnd 14590 -MimeContentEnd 14590 -Octets 1544 +MimeEntityEnd 14588 +MimeMessageEnd 14588 +MimeContentEnd 14588 +Octets 1542 Lines 42 -MimeEntityEnd 14590 +MimeEntityEnd 14588 MultipartBoundaryBegin 14590 MultipartBoundaryEnd 14618 MimeEntityBegin 14618 @@ -314,16 +314,16 @@ MimeContentBegin 14678 MimeContentEnd 14731 Octets 53 Lines 2 -MimeEntityEnd 14733 +MimeEntityEnd 14731 MultipartEndBoundaryBegin 14733 MultipartEndBoundaryEnd 14761 MultipartEpilogueBegin 14761 MultipartEpilogueEnd 14761 -MimeContentEnd 14763 -Octets 5938 +MimeContentEnd 14761 +Octets 5936 Lines 145 -MimeEntityEnd 14763 -MimeMessageEnd 14763 +MimeEntityEnd 14761 +MimeMessageEnd 14761 MboxMarkerBegin 14763 MboxMarkerEnd 14794 MimeMessageBegin 14796 @@ -341,7 +341,7 @@ MimeContentBegin 16466 MimeContentEnd 21776 Octets 5310 Lines 112 -MimeEntityEnd 21778 +MimeEntityEnd 21776 MultipartBoundaryBegin 21778 MultipartBoundaryEnd 21823 MimeEntityBegin 21823 @@ -350,16 +350,16 @@ MimeContentBegin 22028 MimeContentEnd 22970 Octets 942 Lines 14 -MimeEntityEnd 22972 +MimeEntityEnd 22970 MultipartEndBoundaryBegin 22972 MultipartEndBoundaryEnd 23017 MultipartEpilogueBegin 23017 MultipartEpilogueEnd 23019 -MimeContentEnd 23021 -Octets 6696 +MimeContentEnd 23019 +Octets 6694 Lines 140 -MimeEntityEnd 23021 -MimeMessageEnd 23021 +MimeEntityEnd 23019 +MimeMessageEnd 23019 MboxMarkerBegin 23021 MboxMarkerEnd 23052 MimeMessageBegin 23054 @@ -377,7 +377,7 @@ MimeContentBegin 24476 MimeContentEnd 24506 Octets 30 Lines 4 -MimeEntityEnd 24508 +MimeEntityEnd 24506 MultipartBoundaryBegin 24508 MultipartBoundaryEnd 24547 MimeEntityBegin 24547 @@ -398,7 +398,7 @@ MimeContentBegin 25599 MimeContentEnd 26242 Octets 643 Lines 17 -MimeEntityEnd 26244 +MimeEntityEnd 26242 MultipartBoundaryBegin 26244 MultipartBoundaryEnd 26284 MimeEntityBegin 26284 @@ -414,7 +414,7 @@ MimeContentBegin 26488 MimeContentEnd 27356 Octets 868 Lines 19 -MimeEntityEnd 27358 +MimeEntityEnd 27356 MultipartBoundaryBegin 27358 MultipartBoundaryEnd 27398 MimeEntityBegin 27398 @@ -423,37 +423,37 @@ MimeContentBegin 27587 MimeContentEnd 781745 Octets 754158 Lines 10192 -MimeEntityEnd 781747 +MimeEntityEnd 781745 MultipartEndBoundaryBegin 781747 MultipartEndBoundaryEnd 781787 MultipartEpilogueBegin 781787 MultipartEpilogueEnd 781789 -MimeContentEnd 781791 -Octets 755423 +MimeContentEnd 781789 +Octets 755421 Lines 10224 -MimeEntityEnd 781791 +MimeEntityEnd 781789 MultipartEndBoundaryBegin 781791 MultipartEndBoundaryEnd 781831 MultipartEpilogueBegin 781831 MultipartEpilogueEnd 781837 -MimeContentEnd 781839 -Octets 756361 +MimeContentEnd 781837 +Octets 756359 Lines 10253 -MimeEntityEnd 781839 -MimeMessageEnd 781839 -MimeContentEnd 781839 -Octets 757198 +MimeEntityEnd 781837 +MimeMessageEnd 781837 +MimeContentEnd 781837 +Octets 757196 Lines 10269 -MimeEntityEnd 781839 +MimeEntityEnd 781837 MultipartEndBoundaryBegin 781839 MultipartEndBoundaryEnd 781878 MultipartEpilogueBegin 781878 MultipartEpilogueEnd 781880 -MimeContentEnd 781882 -Octets 757572 +MimeContentEnd 781880 +Octets 757570 Lines 10286 -MimeEntityEnd 781882 -MimeMessageEnd 781882 +MimeEntityEnd 781880 +MimeMessageEnd 781880 MboxMarkerBegin 781882 MboxMarkerEnd 781913 MimeMessageBegin 781915 @@ -471,7 +471,7 @@ MimeContentBegin 783342 MimeContentEnd 785774 Octets 2432 Lines 51 -MimeEntityEnd 785776 +MimeEntityEnd 785774 MultipartBoundaryBegin 785776 MultipartBoundaryEnd 785821 MimeEntityBegin 785821 @@ -480,7 +480,7 @@ MimeContentBegin 785985 MimeContentEnd 792087 Octets 6102 Lines 80 -MimeEntityEnd 792089 +MimeEntityEnd 792087 MultipartBoundaryBegin 792089 MultipartBoundaryEnd 792134 MimeEntityBegin 792134 @@ -489,7 +489,7 @@ MimeContentBegin 792297 MimeContentEnd 804527 Octets 12230 Lines 158 -MimeEntityEnd 804529 +MimeEntityEnd 804527 MultipartBoundaryBegin 804529 MultipartBoundaryEnd 804574 MimeEntityBegin 804574 @@ -498,7 +498,7 @@ MimeContentBegin 804739 MimeContentEnd 826735 Octets 21996 Lines 283 -MimeEntityEnd 826737 +MimeEntityEnd 826735 MultipartBoundaryBegin 826737 MultipartBoundaryEnd 826782 MimeEntityBegin 826782 @@ -507,16 +507,16 @@ MimeContentBegin 826991 MimeContentEnd 830429 Octets 3438 Lines 46 -MimeEntityEnd 830431 +MimeEntityEnd 830429 MultipartEndBoundaryBegin 830431 MultipartEndBoundaryEnd 830476 MultipartEpilogueBegin 830476 MultipartEpilogueEnd 830478 -MimeContentEnd 830480 -Octets 47279 +MimeContentEnd 830478 +Octets 47277 Lines 650 -MimeEntityEnd 830480 -MimeMessageEnd 830480 +MimeEntityEnd 830478 +MimeMessageEnd 830478 MboxMarkerBegin 830480 MboxMarkerEnd 830487 MimeMessageBegin 830489 @@ -534,16 +534,16 @@ MimeContentBegin 831463 MimeContentEnd 834089 Octets 2626 Lines 97 -MimeEntityEnd 834091 +MimeEntityEnd 834089 MultipartEndBoundaryBegin 834091 MultipartEndBoundaryEnd 834100 MultipartEpilogueBegin 834100 MultipartEpilogueEnd 834102 -MimeContentEnd 834104 -Octets 2683 +MimeContentEnd 834102 +Octets 2681 Lines 103 -MimeEntityEnd 834104 -MimeMessageEnd 834104 +MimeEntityEnd 834102 +MimeMessageEnd 834102 MboxMarkerBegin 834104 MboxMarkerEnd 834135 MimeMessageBegin 834137 @@ -561,7 +561,7 @@ MimeContentBegin 835328 MimeContentEnd 836249 Octets 921 Lines 21 -MimeEntityEnd 836251 +MimeEntityEnd 836249 MultipartBoundaryBegin 836251 MultipartBoundaryEnd 836269 MimeEntityBegin 836269 @@ -570,16 +570,16 @@ MimeContentBegin 836351 MimeContentEnd 837111 Octets 760 Lines 13 -MimeEntityEnd 837113 +MimeEntityEnd 837111 MultipartEndBoundaryBegin 837113 MultipartEndBoundaryEnd 837131 MultipartEpilogueBegin 837131 MultipartEpilogueEnd 837133 -MimeContentEnd 837135 -Octets 1827 +MimeContentEnd 837133 +Octets 1825 Lines 42 -MimeEntityEnd 837135 -MimeMessageEnd 837135 +MimeEntityEnd 837133 +MimeMessageEnd 837133 MboxMarkerBegin 837135 MboxMarkerEnd 837166 MimeMessageBegin 837168 @@ -597,7 +597,7 @@ MimeContentBegin 838594 MimeContentEnd 839348 Octets 754 Lines 14 -MimeEntityEnd 839350 +MimeEntityEnd 839348 MultipartBoundaryBegin 839350 MultipartBoundaryEnd 839358 MimeEntityBegin 839358 @@ -606,16 +606,16 @@ MimeContentBegin 839541 MimeContentEnd 841787 Octets 2246 Lines 32 -MimeEntityEnd 841789 +MimeEntityEnd 841787 MultipartEndBoundaryBegin 841789 MultipartEndBoundaryEnd 841797 MultipartEpilogueBegin 841797 MultipartEpilogueEnd 841797 -MimeContentEnd 841799 -Octets 3470 +MimeContentEnd 841797 +Octets 3468 Lines 60 -MimeEntityEnd 841799 -MimeMessageEnd 841799 +MimeEntityEnd 841797 +MimeMessageEnd 841797 MboxMarkerBegin 841799 MboxMarkerEnd 841830 MimeMessageBegin 841832 @@ -633,7 +633,7 @@ MimeContentBegin 843271 MimeContentEnd 846129 Octets 2858 Lines 47 -MimeEntityEnd 846131 +MimeEntityEnd 846129 MultipartBoundaryBegin 846131 MultipartBoundaryEnd 846153 MimeEntityBegin 846153 @@ -642,16 +642,16 @@ MimeContentBegin 846336 MimeContentEnd 848918 Octets 2582 Lines 36 -MimeEntityEnd 848920 +MimeEntityEnd 848918 MultipartEndBoundaryBegin 848920 MultipartEndBoundaryEnd 848942 MultipartEpilogueBegin 848942 MultipartEpilogueEnd 848942 -MimeContentEnd 848944 -Octets 5952 +MimeContentEnd 848942 +Octets 5950 Lines 97 -MimeEntityEnd 848944 -MimeMessageEnd 848944 +MimeEntityEnd 848942 +MimeMessageEnd 848942 MboxMarkerBegin 848944 MboxMarkerEnd 848975 MimeMessageBegin 848977 @@ -669,7 +669,7 @@ MimeContentBegin 850109 MimeContentEnd 860977 Octets 10868 Lines 147 -MimeEntityEnd 860979 +MimeEntityEnd 860977 MultipartBoundaryBegin 860979 MultipartBoundaryEnd 861007 MimeEntityBegin 861007 @@ -678,16 +678,16 @@ MimeContentBegin 861162 MimeContentEnd 865836 Octets 4674 Lines 64 -MimeEntityEnd 865838 +MimeEntityEnd 865836 MultipartEndBoundaryBegin 865838 MultipartEndBoundaryEnd 865866 MultipartEpilogueBegin 865866 MultipartEpilogueEnd 865868 -MimeContentEnd 865870 -Octets 15975 +MimeContentEnd 865868 +Octets 15973 Lines 225 -MimeEntityEnd 865870 -MimeMessageEnd 865870 +MimeEntityEnd 865868 +MimeMessageEnd 865868 MboxMarkerBegin 865870 MboxMarkerEnd 865901 MimeMessageBegin 865903 @@ -698,8 +698,8 @@ MimeContentBegin 867318 MimeContentEnd 868768 Octets 1450 Lines 20 -MimeEntityEnd 868770 -MimeMessageEnd 868770 +MimeEntityEnd 868768 +MimeMessageEnd 868768 MboxMarkerBegin 868770 MboxMarkerEnd 868801 MimeMessageBegin 868803 @@ -717,7 +717,7 @@ MimeContentBegin 870294 MimeContentEnd 870404 Octets 110 Lines 4 -MimeEntityEnd 870406 +MimeEntityEnd 870404 MultipartBoundaryBegin 870406 MultipartBoundaryEnd 870451 MimeEntityBegin 870451 @@ -726,16 +726,16 @@ MimeContentBegin 870606 MimeContentEnd 874592 Octets 3986 Lines 54 -MimeEntityEnd 874594 +MimeEntityEnd 874592 MultipartEndBoundaryBegin 874594 MultipartEndBoundaryEnd 874639 MultipartEpilogueBegin 874639 MultipartEpilogueEnd 874641 -MimeContentEnd 874643 -Octets 4463 +MimeContentEnd 874641 +Octets 4461 Lines 70 -MimeEntityEnd 874643 -MimeMessageEnd 874643 +MimeEntityEnd 874641 +MimeMessageEnd 874641 MboxMarkerBegin 874643 MboxMarkerEnd 874674 MimeMessageBegin 874676 @@ -746,8 +746,8 @@ MimeContentBegin 875907 MimeContentEnd 879457 Octets 3550 Lines 56 -MimeEntityEnd 879459 -MimeMessageEnd 879459 +MimeEntityEnd 879457 +MimeMessageEnd 879457 MboxMarkerBegin 879459 MboxMarkerEnd 879490 MimeMessageBegin 879492 @@ -758,8 +758,8 @@ MimeContentBegin 880590 MimeContentEnd 881260 Octets 670 Lines 10 -MimeEntityEnd 881262 -MimeMessageEnd 881262 +MimeEntityEnd 881260 +MimeMessageEnd 881260 MboxMarkerBegin 881262 MboxMarkerEnd 881293 MimeMessageBegin 881295 @@ -775,13 +775,13 @@ MimeContentBegin 883500 MimeContentEnd 884952 Octets 1452 Lines 21 -MimeEntityEnd 884954 -MimeMessageEnd 884954 -MimeContentEnd 884954 -Octets 2857 +MimeEntityEnd 884952 +MimeMessageEnd 884952 +MimeContentEnd 884952 +Octets 2855 Lines 44 -MimeEntityEnd 884954 -MimeMessageEnd 884954 +MimeEntityEnd 884952 +MimeMessageEnd 884952 MboxMarkerBegin 884954 MboxMarkerEnd 884985 MimeMessageBegin 884987 @@ -799,7 +799,7 @@ MimeContentBegin 885869 MimeContentEnd 885885 Octets 16 Lines 2 -MimeEntityEnd 885887 +MimeEntityEnd 885885 MultipartBoundaryBegin 885887 MultipartBoundaryEnd 885915 MimeEntityBegin 885915 @@ -813,21 +813,21 @@ MimeContentBegin 887476 MimeContentEnd 888928 Octets 1452 Lines 21 -MimeEntityEnd 888930 -MimeMessageEnd 888930 -MimeContentEnd 888930 -Octets 2857 +MimeEntityEnd 888928 +MimeMessageEnd 888928 +MimeContentEnd 888928 +Octets 2855 Lines 44 -MimeEntityEnd 888930 +MimeEntityEnd 888928 MultipartEndBoundaryBegin 888930 MultipartEndBoundaryEnd 888958 MultipartEpilogueBegin 888958 MultipartEpilogueEnd 888960 -MimeContentEnd 888962 -Octets 3248 +MimeContentEnd 888960 +Octets 3246 Lines 59 -MimeEntityEnd 888962 -MimeMessageEnd 888962 +MimeEntityEnd 888960 +MimeMessageEnd 888960 MboxMarkerBegin 888962 MboxMarkerEnd 888993 MimeMessageBegin 888995 @@ -845,7 +845,7 @@ MimeContentBegin 889859 MimeContentEnd 889901 Octets 42 Lines 2 -MimeEntityEnd 889903 +MimeEntityEnd 889901 MultipartBoundaryBegin 889903 MultipartBoundaryEnd 889945 MimeEntityBegin 889945 @@ -854,16 +854,16 @@ MimeContentBegin 890100 MimeContentEnd 895732 Octets 5632 Lines 77 -MimeEntityEnd 895734 +MimeEntityEnd 895732 MultipartEndBoundaryBegin 895734 MultipartEndBoundaryEnd 895776 MultipartEpilogueBegin 895776 MultipartEpilogueEnd 895778 -MimeContentEnd 895780 -Octets 6104 +MimeContentEnd 895778 +Octets 6102 Lines 92 -MimeEntityEnd 895780 -MimeMessageEnd 895780 +MimeEntityEnd 895778 +MimeMessageEnd 895778 MboxMarkerBegin 895780 MboxMarkerEnd 895811 MimeMessageBegin 895813 @@ -874,8 +874,8 @@ MimeContentBegin 896896 MimeContentEnd 907272 Octets 10376 Lines 141 -MimeEntityEnd 907274 -MimeMessageEnd 907274 +MimeEntityEnd 907272 +MimeMessageEnd 907272 MboxMarkerBegin 907274 MboxMarkerEnd 907305 MimeMessageBegin 907307 @@ -893,7 +893,7 @@ MimeContentBegin 908890 MimeContentEnd 909517 Octets 627 Lines 17 -MimeEntityEnd 909519 +MimeEntityEnd 909517 MultipartBoundaryBegin 909519 MultipartBoundaryEnd 909561 MimeEntityBegin 909561 @@ -902,16 +902,16 @@ MimeContentBegin 909716 MimeContentEnd 911528 Octets 1812 Lines 25 -MimeEntityEnd 911530 +MimeEntityEnd 911528 MultipartEndBoundaryBegin 911530 MultipartEndBoundaryEnd 911572 MultipartEpilogueBegin 911572 MultipartEpilogueEnd 911574 -MimeContentEnd 911576 -Octets 2869 +MimeContentEnd 911574 +Octets 2867 Lines 55 -MimeEntityEnd 911576 -MimeMessageEnd 911576 +MimeEntityEnd 911574 +MimeMessageEnd 911574 MboxMarkerBegin 911576 MboxMarkerEnd 911607 MimeMessageBegin 911609 @@ -922,8 +922,8 @@ MimeContentBegin 912172 MimeContentEnd 912702 Octets 530 Lines 8 -MimeEntityEnd 912704 -MimeMessageEnd 912704 +MimeEntityEnd 912702 +MimeMessageEnd 912702 MboxMarkerBegin 912704 MboxMarkerEnd 912735 MimeMessageBegin 912737 @@ -934,8 +934,8 @@ MimeContentBegin 913972 MimeContentEnd 916892 Octets 2920 Lines 39 -MimeEntityEnd 916894 -MimeMessageEnd 916894 +MimeEntityEnd 916892 +MimeMessageEnd 916892 MboxMarkerBegin 916894 MboxMarkerEnd 916925 MimeMessageBegin 916927 @@ -946,8 +946,8 @@ MimeContentBegin 918106 MimeContentEnd 920258 Octets 2152 Lines 31 -MimeEntityEnd 920260 -MimeMessageEnd 920260 +MimeEntityEnd 920258 +MimeMessageEnd 920258 MboxMarkerBegin 920260 MboxMarkerEnd 920291 MimeMessageBegin 920293 @@ -965,7 +965,7 @@ MimeContentBegin 921494 MimeContentEnd 921494 Octets 0 Lines 1 -MimeEntityEnd 921496 +MimeEntityEnd 921494 MultipartBoundaryBegin 921496 MultipartBoundaryEnd 921529 MimeEntityBegin 921529 @@ -974,16 +974,16 @@ MimeContentBegin 921611 MimeContentEnd 924365 Octets 2754 Lines 42 -MimeEntityEnd 924367 +MimeEntityEnd 924365 MultipartEndBoundaryBegin 924367 MultipartEndBoundaryEnd 924400 MultipartEpilogueBegin 924400 MultipartEpilogueEnd 924402 -MimeContentEnd 924404 -Octets 3012 +MimeContentEnd 924402 +Octets 3010 Lines 54 -MimeEntityEnd 924404 -MimeMessageEnd 924404 +MimeEntityEnd 924402 +MimeMessageEnd 924402 MboxMarkerBegin 924404 MboxMarkerEnd 924435 MimeMessageBegin 924437 @@ -1001,7 +1001,7 @@ MimeContentBegin 925617 MimeContentEnd 926083 Octets 466 Lines 14 -MimeEntityEnd 926085 +MimeEntityEnd 926083 MultipartBoundaryBegin 926085 MultipartBoundaryEnd 926126 MimeEntityBegin 926126 @@ -1010,7 +1010,7 @@ MimeContentBegin 926204 MimeContentEnd 927041 Octets 837 Lines 27 -MimeEntityEnd 927043 +MimeEntityEnd 927041 MultipartBoundaryBegin 927043 MultipartBoundaryEnd 927084 MimeEntityBegin 927084 @@ -1019,16 +1019,16 @@ MimeContentBegin 927184 MimeContentEnd 928400 Octets 1216 Lines 17 -MimeEntityEnd 928402 +MimeEntityEnd 928400 MultipartEndBoundaryBegin 928402 MultipartEndBoundaryEnd 928443 MultipartEpilogueBegin 928443 MultipartEpilogueEnd 928445 -MimeContentEnd 928447 -Octets 2954 +MimeContentEnd 928445 +Octets 2952 Lines 73 -MimeEntityEnd 928447 -MimeMessageEnd 928447 +MimeEntityEnd 928445 +MimeMessageEnd 928445 MboxMarkerBegin 928447 MboxMarkerEnd 928478 MimeMessageBegin 928480 @@ -1046,7 +1046,7 @@ MimeContentBegin 929694 MimeContentEnd 929853 Octets 159 Lines 8 -MimeEntityEnd 929855 +MimeEntityEnd 929853 MultipartBoundaryBegin 929855 MultipartBoundaryEnd 929898 MimeEntityBegin 929898 @@ -1055,16 +1055,16 @@ MimeContentBegin 929980 MimeContentEnd 934132 Octets 4152 Lines 57 -MimeEntityEnd 934134 +MimeEntityEnd 934132 MultipartEndBoundaryBegin 934134 MultipartEndBoundaryEnd 934177 MultipartEpilogueBegin 934177 MultipartEpilogueEnd 934179 -MimeContentEnd 934181 -Octets 4605 +MimeContentEnd 934179 +Octets 4603 Lines 76 -MimeEntityEnd 934181 -MimeMessageEnd 934181 +MimeEntityEnd 934179 +MimeMessageEnd 934179 MboxMarkerBegin 934181 MboxMarkerEnd 934212 MimeMessageBegin 934214 @@ -1082,7 +1082,7 @@ MimeContentBegin 935454 MimeContentEnd 935532 Octets 78 Lines 5 -MimeEntityEnd 935534 +MimeEntityEnd 935532 MultipartBoundaryBegin 935534 MultipartBoundaryEnd 935568 MimeEntityBegin 935568 @@ -1091,16 +1091,16 @@ MimeContentBegin 935650 MimeContentEnd 939424 Octets 3774 Lines 58 -MimeEntityEnd 939426 +MimeEntityEnd 939424 MultipartEndBoundaryBegin 939426 MultipartEndBoundaryEnd 939460 MultipartEpilogueBegin 939460 MultipartEpilogueEnd 939460 -MimeContentEnd 939462 -Octets 4125 +MimeContentEnd 939460 +Octets 4123 Lines 73 -MimeEntityEnd 939462 -MimeMessageEnd 939462 +MimeEntityEnd 939460 +MimeMessageEnd 939460 MboxMarkerBegin 939462 MboxMarkerEnd 939493 MimeMessageBegin 939495 @@ -1118,7 +1118,7 @@ MimeContentBegin 940823 MimeContentEnd 941017 Octets 194 Lines 7 -MimeEntityEnd 941019 +MimeEntityEnd 941017 MultipartBoundaryBegin 941019 MultipartBoundaryEnd 941044 MimeEntityBegin 941044 @@ -1132,21 +1132,21 @@ MimeContentBegin 941897 MimeContentEnd 941908 Octets 11 Lines 1 -MimeEntityEnd 941910 -MimeMessageEnd 941910 -MimeContentEnd 941910 -Octets 834 +MimeEntityEnd 941908 +MimeMessageEnd 941908 +MimeContentEnd 941908 +Octets 832 Lines 16 -MimeEntityEnd 941910 +MimeEntityEnd 941908 MultipartEndBoundaryBegin 941910 MultipartEndBoundaryEnd 941935 MultipartEpilogueBegin 941935 MultipartEpilogueEnd 941937 -MimeContentEnd 941939 -Octets 1299 +MimeContentEnd 941937 +Octets 1297 Lines 35 -MimeEntityEnd 941939 -MimeMessageEnd 941939 +MimeEntityEnd 941937 +MimeMessageEnd 941937 MboxMarkerBegin 941939 MboxMarkerEnd 941970 MimeMessageBegin 941972 @@ -1164,7 +1164,7 @@ MimeContentBegin 943994 MimeContentEnd 944875 Octets 881 Lines 19 -MimeEntityEnd 944877 +MimeEntityEnd 944875 MultipartBoundaryBegin 944877 MultipartBoundaryEnd 944922 MimeEntityBegin 944922 @@ -1173,13 +1173,13 @@ MimeContentBegin 945088 MimeContentEnd 948790 Octets 3702 Lines 62 -MimeEntityEnd 948792 +MimeEntityEnd 948790 MultipartEndBoundaryBegin 948792 MultipartEndBoundaryEnd 948837 MultipartEpilogueBegin 948837 MultipartEpilogueEnd 948839 -MimeContentEnd 948839 -Octets 4971 +MimeContentEnd 948837 +Octets 4969 Lines 92 -MimeEntityEnd 948839 -MimeMessageEnd 948839 +MimeEntityEnd 948837 +MimeMessageEnd 948837 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index b9927f1533..534dac6080 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -22,7 +22,7 @@ MimeContentBegin 682 MimeContentEnd 1413 Octets 731 Lines 17 -MimeEntityEnd 1415 +MimeEntityEnd 1413 MultipartBoundaryBegin 1415 MultipartBoundaryEnd 1447 MimeEntityBegin 1447 @@ -31,15 +31,15 @@ MimeContentBegin 1535 MimeContentEnd 33007 Octets 31472 Lines 427 -MimeEntityEnd 33009 +MimeEntityEnd 33007 MultipartEndBoundaryBegin 33009 MultipartEndBoundaryEnd 33041 MultipartEpilogueBegin 33041 MultipartEpilogueEnd 33041 -MimeContentEnd 33043 -Octets 32395 +MimeContentEnd 33041 +Octets 32393 Lines 452 -MimeEntityEnd 33043 +MimeEntityEnd 33041 MultipartBoundaryBegin 33043 MultipartBoundaryEnd 33061 MimeEntityBegin 33061 @@ -55,7 +55,7 @@ MimeContentBegin 33275 MimeContentEnd 59275 Octets 26000 Lines 353 -MimeEntityEnd 59277 +MimeEntityEnd 59275 MultipartBoundaryBegin 59277 MultipartBoundaryEnd 59309 MimeEntityBegin 59309 @@ -64,7 +64,7 @@ MimeContentBegin 59395 MimeContentEnd 78061 Octets 18666 Lines 254 -MimeEntityEnd 78063 +MimeEntityEnd 78061 MultipartBoundaryBegin 78063 MultipartBoundaryEnd 78095 MimeEntityBegin 78095 @@ -73,7 +73,7 @@ MimeContentBegin 78212 MimeContentEnd 124337 Octets 46125 Lines 2437 -MimeEntityEnd 124339 +MimeEntityEnd 124337 MultipartBoundaryBegin 124339 MultipartBoundaryEnd 124371 MimeEntityBegin 124371 @@ -82,15 +82,15 @@ MimeContentBegin 124435 MimeContentEnd 133638 Octets 9203 Lines 358 -MimeEntityEnd 133640 +MimeEntityEnd 133638 MultipartEndBoundaryBegin 133640 MultipartEndBoundaryEnd 133672 MultipartEpilogueBegin 133672 MultipartEpilogueEnd 133672 -MimeContentEnd 133674 -Octets 100517 +MimeContentEnd 133672 +Octets 100515 Lines 3421 -MimeEntityEnd 133674 +MimeEntityEnd 133672 MultipartBoundaryBegin 133674 MultipartBoundaryEnd 133692 MimeEntityBegin 133692 @@ -99,16 +99,16 @@ MimeContentBegin 133780 MimeContentEnd 181602 Octets 47822 Lines 648 -MimeEntityEnd 181604 +MimeEntityEnd 181602 MultipartEndBoundaryBegin 181604 MultipartEndBoundaryEnd 181622 MultipartEpilogueBegin 181622 MultipartEpilogueEnd 181624 -MimeContentEnd 181626 -Octets 181095 +MimeContentEnd 181624 +Octets 181093 Lines 4536 -MimeEntityEnd 181626 -MimeMessageEnd 181626 +MimeEntityEnd 181624 +MimeMessageEnd 181624 MboxMarkerBegin 181626 MboxMarkerEnd 181633 MimeMessageBegin 181635 @@ -119,8 +119,8 @@ MimeContentBegin 182198 MimeContentEnd 319322 Octets 137124 Lines 1855 -MimeEntityEnd 319324 -MimeMessageEnd 319324 +MimeEntityEnd 319322 +MimeMessageEnd 319322 MboxMarkerBegin 319324 MboxMarkerEnd 319331 MimeMessageBegin 319333 @@ -131,8 +131,8 @@ MimeContentBegin 319720 MimeContentEnd 319924 Octets 204 Lines 4 -MimeEntityEnd 319926 -MimeMessageEnd 319926 +MimeEntityEnd 319924 +MimeMessageEnd 319924 MboxMarkerBegin 319926 MboxMarkerEnd 319933 MimeMessageBegin 319935 @@ -150,7 +150,7 @@ MimeContentBegin 320841 MimeContentEnd 321080 Octets 239 Lines 7 -MimeEntityEnd 321082 +MimeEntityEnd 321080 MultipartBoundaryBegin 321082 MultipartBoundaryEnd 321123 MimeEntityBegin 321123 @@ -166,7 +166,7 @@ MimeContentBegin 321348 MimeContentEnd 321497 Octets 149 Lines 4 -MimeEntityEnd 321499 +MimeEntityEnd 321497 MultipartBoundaryBegin 321499 MultipartBoundaryEnd 321542 MimeEntityBegin 321542 @@ -175,7 +175,7 @@ MimeContentBegin 321656 MimeContentEnd 326088 Octets 4432 Lines 65 -MimeEntityEnd 326090 +MimeEntityEnd 326088 MultipartBoundaryBegin 326090 MultipartBoundaryEnd 326133 MimeEntityBegin 326133 @@ -184,24 +184,24 @@ MimeContentBegin 326227 MimeContentEnd 326275 Octets 48 Lines 4 -MimeEntityEnd 326277 +MimeEntityEnd 326275 MultipartEndBoundaryBegin 326277 MultipartEndBoundaryEnd 326320 MultipartEpilogueBegin 326320 MultipartEpilogueEnd 326322 -MimeContentEnd 326324 -Octets 5113 +MimeContentEnd 326322 +Octets 5111 Lines 88 -MimeEntityEnd 326324 +MimeEntityEnd 326322 MultipartEndBoundaryBegin 326324 MultipartEndBoundaryEnd 326365 MultipartEpilogueBegin 326365 MultipartEpilogueEnd 326365 -MimeContentEnd 326367 -Octets 5771 +MimeContentEnd 326365 +Octets 5769 Lines 106 -MimeEntityEnd 326367 -MimeMessageEnd 326367 +MimeEntityEnd 326365 +MimeMessageEnd 326365 MboxMarkerBegin 326367 MboxMarkerEnd 326374 MimeMessageBegin 326376 @@ -219,7 +219,7 @@ MimeContentBegin 327479 MimeContentEnd 327915 Octets 436 Lines 13 -MimeEntityEnd 327917 +MimeEntityEnd 327915 MultipartBoundaryBegin 327917 MultipartBoundaryEnd 327980 MimeEntityBegin 327980 @@ -240,7 +240,7 @@ MimeContentBegin 329276 MimeContentEnd 329386 Octets 110 Lines 7 -MimeEntityEnd 329388 +MimeEntityEnd 329386 MultipartBoundaryBegin 329388 MultipartBoundaryEnd 329419 MimeEntityBegin 329419 @@ -249,7 +249,7 @@ MimeContentBegin 329511 MimeContentEnd 350421 Octets 20910 Lines 284 -MimeEntityEnd 350423 +MimeEntityEnd 350421 MultipartBoundaryBegin 350423 MultipartBoundaryEnd 350454 MimeEntityBegin 350454 @@ -258,16 +258,16 @@ MimeContentBegin 350456 MimeContentEnd 350456 Octets 0 Lines 0 -MimeEntityEnd 350456 -MimeContentEnd 350456 -Octets 21592 +MimeEntityEnd 350454 +MimeContentEnd 350454 +Octets 21590 Lines 309 -MimeEntityEnd 350456 -MimeMessageEnd 350456 -MimeContentEnd 350456 -Octets 22444 +MimeEntityEnd 350454 +MimeMessageEnd 350454 +MimeContentEnd 350454 +Octets 22442 Lines 325 -MimeEntityEnd 350456 +MimeEntityEnd 350454 MultipartBoundaryBegin 350456 MultipartBoundaryEnd 350519 MimeEntityBegin 350519 @@ -276,16 +276,16 @@ MimeContentBegin 350595 MimeContentEnd 350706 Octets 111 Lines 5 -MimeEntityEnd 350708 +MimeEntityEnd 350706 MultipartEndBoundaryBegin 350708 MultipartEndBoundaryEnd 350771 MultipartEpilogueBegin 350771 MultipartEpilogueEnd 350773 -MimeContentEnd 350775 -Octets 23634 +MimeContentEnd 350773 +Octets 23632 Lines 360 -MimeEntityEnd 350775 -MimeMessageEnd 350775 +MimeEntityEnd 350773 +MimeMessageEnd 350773 MboxMarkerBegin 350775 MboxMarkerEnd 350782 MimeMessageBegin 350784 @@ -303,7 +303,7 @@ MimeContentBegin 351763 MimeContentEnd 352541 Octets 778 Lines 19 -MimeEntityEnd 352543 +MimeEntityEnd 352541 MultipartBoundaryBegin 352543 MultipartBoundaryEnd 352584 MimeEntityBegin 352584 @@ -319,7 +319,7 @@ MimeContentBegin 352809 MimeContentEnd 353038 Octets 229 Lines 5 -MimeEntityEnd 353040 +MimeEntityEnd 353038 MultipartBoundaryBegin 353040 MultipartBoundaryEnd 353083 MimeEntityBegin 353083 @@ -328,7 +328,7 @@ MimeContentBegin 353195 MimeContentEnd 1037241 Octets 684046 Lines 8983 -MimeEntityEnd 1037243 +MimeEntityEnd 1037241 MultipartBoundaryBegin 1037243 MultipartBoundaryEnd 1037286 MimeEntityBegin 1037286 @@ -337,7 +337,7 @@ MimeContentBegin 1037380 MimeContentEnd 1037501 Octets 121 Lines 6 -MimeEntityEnd 1037503 +MimeEntityEnd 1037501 MultipartBoundaryBegin 1037503 MultipartBoundaryEnd 1037546 MimeEntityBegin 1037546 @@ -346,7 +346,7 @@ MimeContentBegin 1037676 MimeContentEnd 1727872 Octets 690196 Lines 9061 -MimeEntityEnd 1727874 +MimeEntityEnd 1727872 MultipartBoundaryBegin 1727874 MultipartBoundaryEnd 1727917 MimeEntityBegin 1727917 @@ -355,7 +355,7 @@ MimeContentBegin 1728011 MimeContentEnd 1728023 Octets 12 Lines 3 -MimeEntityEnd 1728025 +MimeEntityEnd 1728023 MultipartBoundaryBegin 1728025 MultipartBoundaryEnd 1728068 MimeEntityBegin 1728068 @@ -364,7 +364,7 @@ MimeContentBegin 1728189 MimeContentEnd 1797301 Octets 69112 Lines 935 -MimeEntityEnd 1797303 +MimeEntityEnd 1797301 MultipartBoundaryBegin 1797303 MultipartBoundaryEnd 1797346 MimeEntityBegin 1797346 @@ -373,7 +373,7 @@ MimeContentBegin 1797440 MimeContentEnd 1797583 Octets 143 Lines 6 -MimeEntityEnd 1797585 +MimeEntityEnd 1797583 MultipartBoundaryBegin 1797585 MultipartBoundaryEnd 1797628 MimeEntityBegin 1797628 @@ -382,7 +382,7 @@ MimeContentBegin 1797750 MimeContentEnd 2138984 Octets 341234 Lines 4473 -MimeEntityEnd 2138986 +MimeEntityEnd 2138984 MultipartBoundaryBegin 2138986 MultipartBoundaryEnd 2139029 MimeEntityBegin 2139029 @@ -391,24 +391,24 @@ MimeContentBegin 2139123 MimeContentEnd 2139129 Octets 6 Lines 2 -MimeEntityEnd 2139131 +MimeEntityEnd 2139129 MultipartEndBoundaryBegin 2139131 MultipartEndBoundaryEnd 2139174 MultipartEpilogueBegin 2139174 MultipartEpilogueEnd 2139176 -MimeContentEnd 2139178 -Octets 1786506 +MimeContentEnd 2139176 +Octets 1786504 Lines 23516 -MimeEntityEnd 2139178 +MimeEntityEnd 2139176 MultipartEndBoundaryBegin 2139178 MultipartEndBoundaryEnd 2139219 MultipartEpilogueBegin 2139219 MultipartEpilogueEnd 2139219 -MimeContentEnd 2139221 -Octets 1787703 +MimeContentEnd 2139219 +Octets 1787701 Lines 23546 -MimeEntityEnd 2139221 -MimeMessageEnd 2139221 +MimeEntityEnd 2139219 +MimeMessageEnd 2139219 MboxMarkerBegin 2139221 MboxMarkerEnd 2139228 MimeMessageBegin 2139230 @@ -419,8 +419,8 @@ MimeContentBegin 2140267 MimeContentEnd 2141431 Octets 1164 Lines 40 -MimeEntityEnd 2141433 -MimeMessageEnd 2141433 +MimeEntityEnd 2141431 +MimeMessageEnd 2141431 MboxMarkerBegin 2141433 MboxMarkerEnd 2141440 MimeMessageBegin 2141442 @@ -438,7 +438,7 @@ MimeContentBegin 2141707 MimeContentEnd 2142012 Octets 305 Lines 6 -MimeEntityEnd 2142014 +MimeEntityEnd 2142012 MultipartBoundaryBegin 2142014 MultipartBoundaryEnd 2142030 MimeEntityBegin 2142030 @@ -454,7 +454,7 @@ MimeContentBegin 2142207 MimeContentEnd 2145483 Octets 3276 Lines 17 -MimeEntityEnd 2145485 +MimeEntityEnd 2145483 MultipartBoundaryBegin 2145485 MultipartBoundaryEnd 2145502 MimeEntityBegin 2145502 @@ -463,15 +463,15 @@ MimeContentBegin 2145610 MimeContentEnd 2302316 Octets 156706 Lines 808 -MimeEntityEnd 2302318 +MimeEntityEnd 2302316 MultipartEndBoundaryBegin 2302318 MultipartEndBoundaryEnd 2302335 MultipartEpilogueBegin 2302335 MultipartEpilogueEnd 2302335 -MimeContentEnd 2302337 -Octets 160228 +MimeContentEnd 2302335 +Octets 160226 Lines 837 -MimeEntityEnd 2302337 +MimeEntityEnd 2302335 MultipartBoundaryBegin 2302337 MultipartBoundaryEnd 2302353 MimeEntityBegin 2302353 @@ -480,16 +480,16 @@ MimeContentBegin 2302412 MimeContentEnd 2307327 Octets 4915 Lines 196 -MimeEntityEnd 2307329 +MimeEntityEnd 2307327 MultipartEndBoundaryBegin 2307329 MultipartEndBoundaryEnd 2307345 MultipartEpilogueBegin 2307345 MultipartEpilogueEnd 2307345 -MimeContentEnd 2307347 -Octets 165658 +MimeContentEnd 2307345 +Octets 165656 Lines 1050 -MimeEntityEnd 2307347 -MimeMessageEnd 2307347 +MimeEntityEnd 2307345 +MimeMessageEnd 2307345 MboxMarkerBegin 2307347 MboxMarkerEnd 2307354 MimeMessageBegin 2307356 @@ -500,8 +500,8 @@ MimeContentBegin 2308328 MimeContentEnd 2655844 Octets 347516 Lines 4457 -MimeEntityEnd 2655846 -MimeMessageEnd 2655846 +MimeEntityEnd 2655844 +MimeMessageEnd 2655844 MboxMarkerBegin 2655846 MboxMarkerEnd 2655853 MimeMessageBegin 2655855 @@ -526,7 +526,7 @@ MimeContentBegin 2656121 MimeContentEnd 2656845 Octets 724 Lines 18 -MimeEntityEnd 2656847 +MimeEntityEnd 2656845 MultipartBoundaryBegin 2656847 MultipartBoundaryEnd 2656879 MimeEntityBegin 2656879 @@ -535,24 +535,24 @@ MimeContentBegin 2656980 MimeContentEnd 2688452 Octets 31472 Lines 427 -MimeEntityEnd 2688454 +MimeEntityEnd 2688452 MultipartEndBoundaryBegin 2688454 MultipartEndBoundaryEnd 2688486 MultipartEpilogueBegin 2688486 MultipartEpilogueEnd 2688486 -MimeContentEnd 2688488 -Octets 32401 +MimeContentEnd 2688486 +Octets 32399 Lines 453 -MimeEntityEnd 2688488 +MimeEntityEnd 2688486 MultipartEndBoundaryBegin 2688488 MultipartEndBoundaryEnd 2688506 MultipartEpilogueBegin 2688506 MultipartEpilogueEnd 2688506 -MimeContentEnd 2688508 -Octets 32514 +MimeContentEnd 2688506 +Octets 32512 Lines 457 -MimeEntityEnd 2688508 -MimeMessageEnd 2688508 +MimeEntityEnd 2688506 +MimeMessageEnd 2688506 MboxMarkerBegin 2688508 MboxMarkerEnd 2688515 MimeMessageBegin 2688517 @@ -563,8 +563,8 @@ MimeContentBegin 2689088 MimeContentEnd 2746649 Octets 57561 Lines 783 -MimeEntityEnd 2746651 -MimeMessageEnd 2746651 +MimeEntityEnd 2746649 +MimeMessageEnd 2746649 MboxMarkerBegin 2746651 MboxMarkerEnd 2746658 MimeMessageBegin 2746660 @@ -582,7 +582,7 @@ MimeContentBegin 2748005 MimeContentEnd 2748571 Octets 566 Lines 15 -MimeEntityEnd 2748573 +MimeEntityEnd 2748571 MultipartBoundaryBegin 2748573 MultipartBoundaryEnd 2748632 MimeEntityBegin 2748632 @@ -598,7 +598,7 @@ MimeContentBegin 2748875 MimeContentEnd 2749301 Octets 426 Lines 8 -MimeEntityEnd 2749303 +MimeEntityEnd 2749301 MultipartBoundaryBegin 2749303 MultipartBoundaryEnd 2749364 MimeEntityBegin 2749364 @@ -607,7 +607,7 @@ MimeContentBegin 2749426 MimeContentEnd 2779088 Octets 29662 Lines 402 -MimeEntityEnd 2779090 +MimeEntityEnd 2779088 MultipartBoundaryBegin 2779090 MultipartBoundaryEnd 2779151 MimeEntityBegin 2779151 @@ -616,24 +616,24 @@ MimeContentBegin 2779224 MimeContentEnd 2779269 Octets 45 Lines 5 -MimeEntityEnd 2779271 +MimeEntityEnd 2779269 MultipartEndBoundaryBegin 2779271 MultipartEndBoundaryEnd 2779332 MultipartEpilogueBegin 2779332 MultipartEpilogueEnd 2779334 -MimeContentEnd 2779336 -Octets 30598 +MimeContentEnd 2779334 +Octets 30596 Lines 429 -MimeEntityEnd 2779336 +MimeEntityEnd 2779334 MultipartEndBoundaryBegin 2779336 MultipartEndBoundaryEnd 2779395 MultipartEpilogueBegin 2779395 MultipartEpilogueEnd 2779395 -MimeContentEnd 2779397 -Octets 31987 +MimeContentEnd 2779395 +Octets 31985 Lines 459 -MimeEntityEnd 2779397 -MimeMessageEnd 2779397 +MimeEntityEnd 2779395 +MimeMessageEnd 2779395 MboxMarkerBegin 2779397 MboxMarkerEnd 2779404 MimeMessageBegin 2779406 @@ -651,7 +651,7 @@ MimeContentBegin 2780454 MimeContentEnd 2781302 Octets 848 Lines 28 -MimeEntityEnd 2781304 +MimeEntityEnd 2781302 MultipartBoundaryBegin 2781304 MultipartBoundaryEnd 2781334 MimeEntityBegin 2781334 @@ -667,7 +667,7 @@ MimeContentBegin 2781470 MimeContentEnd 2781612 Octets 142 Lines 6 -MimeEntityEnd 2781614 +MimeEntityEnd 2781612 MultipartBoundaryBegin 2781614 MultipartBoundaryEnd 2781646 MimeEntityBegin 2781646 @@ -676,7 +676,7 @@ MimeContentBegin 2781714 MimeContentEnd 2782928 Octets 1214 Lines 18 -MimeEntityEnd 2782930 +MimeEntityEnd 2782928 MultipartBoundaryBegin 2782930 MultipartBoundaryEnd 2782962 MimeEntityBegin 2782962 @@ -685,7 +685,7 @@ MimeContentBegin 2782990 MimeContentEnd 2783058 Octets 68 Lines 1 -MimeEntityEnd 2783060 +MimeEntityEnd 2783058 MultipartBoundaryBegin 2783060 MultipartBoundaryEnd 2783092 MimeEntityBegin 2783092 @@ -694,7 +694,7 @@ MimeContentBegin 2783160 MimeContentEnd 2784382 Octets 1222 Lines 18 -MimeEntityEnd 2784384 +MimeEntityEnd 2784382 MultipartBoundaryBegin 2784384 MultipartBoundaryEnd 2784416 MimeEntityBegin 2784416 @@ -703,24 +703,24 @@ MimeContentBegin 2784447 MimeContentEnd 2785006 Octets 559 Lines 14 -MimeEntityEnd 2785008 +MimeEntityEnd 2785006 MultipartEndBoundaryBegin 2785008 MultipartEndBoundaryEnd 2785040 MultipartEpilogueBegin 2785040 MultipartEpilogueEnd 2785042 -MimeContentEnd 2785044 -Octets 3634 +MimeContentEnd 2785042 +Octets 3632 Lines 76 -MimeEntityEnd 2785044 +MimeEntityEnd 2785042 MultipartEndBoundaryBegin 2785044 MultipartEndBoundaryEnd 2785074 MultipartEpilogueBegin 2785074 MultipartEpilogueEnd 2785076 -MimeContentEnd 2785078 -Octets 5003 +MimeContentEnd 2785076 +Octets 5001 Lines 119 -MimeEntityEnd 2785078 -MimeMessageEnd 2785078 +MimeEntityEnd 2785076 +MimeMessageEnd 2785076 MboxMarkerBegin 2785078 MboxMarkerEnd 2785085 MimeMessageBegin 2785087 @@ -731,8 +731,8 @@ MimeContentBegin 2786084 MimeContentEnd 2787498 Octets 1414 Lines 33 -MimeEntityEnd 2787500 -MimeMessageEnd 2787500 +MimeEntityEnd 2787498 +MimeMessageEnd 2787498 MboxMarkerBegin 2787500 MboxMarkerEnd 2787507 MimeMessageBegin 2787509 @@ -743,8 +743,8 @@ MimeContentBegin 2787772 MimeContentEnd 2788033 Octets 261 Lines 6 -MimeEntityEnd 2788035 -MimeMessageEnd 2788035 +MimeEntityEnd 2788033 +MimeMessageEnd 2788033 MboxMarkerBegin 2788035 MboxMarkerEnd 2788042 MimeMessageBegin 2788044 @@ -755,8 +755,8 @@ MimeContentBegin 2788716 MimeContentEnd 2789453 Octets 737 Lines 14 -MimeEntityEnd 2789455 -MimeMessageEnd 2789455 +MimeEntityEnd 2789453 +MimeMessageEnd 2789453 MboxMarkerBegin 2789455 MboxMarkerEnd 2789462 MimeMessageBegin 2789464 @@ -774,7 +774,7 @@ MimeContentBegin 2790555 MimeContentEnd 2790632 Octets 77 Lines 6 -MimeEntityEnd 2790634 +MimeEntityEnd 2790632 MultipartBoundaryBegin 2790634 MultipartBoundaryEnd 2790674 MimeEntityBegin 2790674 @@ -790,7 +790,7 @@ MimeContentBegin 2790967 MimeContentEnd 2857841 Octets 66874 Lines 958 -MimeEntityEnd 2857843 +MimeEntityEnd 2857841 MultipartBoundaryBegin 2857843 MultipartBoundaryEnd 2857884 MimeEntityBegin 2857884 @@ -799,24 +799,24 @@ MimeContentBegin 2858099 MimeContentEnd 3227661 Octets 369562 Lines 5282 -MimeEntityEnd 3227663 +MimeEntityEnd 3227661 MultipartEndBoundaryBegin 3227663 MultipartEndBoundaryEnd 3227704 MultipartEpilogueBegin 3227704 MultipartEpilogueEnd 3227708 -MimeContentEnd 3227710 -Octets 436947 +MimeContentEnd 3227708 +Octets 436945 Lines 6257 -MimeEntityEnd 3227710 +MimeEntityEnd 3227708 MultipartEndBoundaryBegin 3227710 MultipartEndBoundaryEnd 3227750 MultipartEpilogueBegin 3227750 MultipartEpilogueEnd 3227750 -MimeContentEnd 3227752 -Octets 437289 +MimeContentEnd 3227750 +Octets 437287 Lines 6272 -MimeEntityEnd 3227752 -MimeMessageEnd 3227752 +MimeEntityEnd 3227750 +MimeMessageEnd 3227750 MboxMarkerBegin 3227752 MboxMarkerEnd 3227759 MimeMessageBegin 3227761 @@ -834,7 +834,7 @@ MimeContentBegin 3228852 MimeContentEnd 3228929 Octets 77 Lines 6 -MimeEntityEnd 3228931 +MimeEntityEnd 3228929 MultipartBoundaryBegin 3228931 MultipartBoundaryEnd 3228971 MimeEntityBegin 3228971 @@ -850,7 +850,7 @@ MimeContentBegin 3229263 MimeContentEnd 3296137 Octets 66874 Lines 958 -MimeEntityEnd 3296139 +MimeEntityEnd 3296137 MultipartBoundaryBegin 3296139 MultipartBoundaryEnd 3296180 MimeEntityBegin 3296180 @@ -859,24 +859,24 @@ MimeContentBegin 3296395 MimeContentEnd 3665957 Octets 369562 Lines 5282 -MimeEntityEnd 3665959 +MimeEntityEnd 3665957 MultipartEndBoundaryBegin 3665959 MultipartEndBoundaryEnd 3666000 MultipartEpilogueBegin 3666000 MultipartEpilogueEnd 3666004 -MimeContentEnd 3666006 -Octets 436947 +MimeContentEnd 3666004 +Octets 436945 Lines 6257 -MimeEntityEnd 3666006 +MimeEntityEnd 3666004 MultipartEndBoundaryBegin 3666006 MultipartEndBoundaryEnd 3666046 MultipartEpilogueBegin 3666046 MultipartEpilogueEnd 3666046 -MimeContentEnd 3666048 -Octets 437288 +MimeContentEnd 3666046 +Octets 437286 Lines 6272 -MimeEntityEnd 3666048 -MimeMessageEnd 3666048 +MimeEntityEnd 3666046 +MimeMessageEnd 3666046 MboxMarkerBegin 3666048 MboxMarkerEnd 3666055 MimeMessageBegin 3666057 @@ -892,13 +892,13 @@ MimeContentBegin 3666692 MimeContentEnd 3667232 Octets 540 Lines 14 -MimeEntityEnd 3667234 -MimeMessageEnd 3667234 -MimeContentEnd 3667234 -Octets 604 +MimeEntityEnd 3667232 +MimeMessageEnd 3667232 +MimeContentEnd 3667232 +Octets 602 Lines 17 -MimeEntityEnd 3667234 -MimeMessageEnd 3667234 +MimeEntityEnd 3667232 +MimeMessageEnd 3667232 MboxMarkerBegin 3667234 MboxMarkerEnd 3667241 MimeMessageBegin 3667243 @@ -916,7 +916,7 @@ MimeContentBegin 3668048 MimeContentEnd 3668234 Octets 186 Lines 7 -MimeEntityEnd 3668236 +MimeEntityEnd 3668234 MultipartBoundaryBegin 3668236 MultipartBoundaryEnd 3668280 MimeEntityBegin 3668280 @@ -925,16 +925,16 @@ MimeContentBegin 3668355 MimeContentEnd 3669259 Octets 904 Lines 13 -MimeEntityEnd 3669261 +MimeEntityEnd 3669259 MultipartEndBoundaryBegin 3669261 MultipartEndBoundaryEnd 3669305 MultipartEpilogueBegin 3669305 MultipartEpilogueEnd 3669418 -MimeContentEnd 3669420 -Octets 1446 +MimeContentEnd 3669418 +Octets 1444 Lines 34 -MimeEntityEnd 3669420 -MimeMessageEnd 3669420 +MimeEntityEnd 3669418 +MimeMessageEnd 3669418 MboxMarkerBegin 3669420 MboxMarkerEnd 3669427 MimeMessageBegin 3669429 @@ -952,7 +952,7 @@ MimeContentBegin 3670063 MimeContentEnd 3670465 Octets 402 Lines 11 -MimeEntityEnd 3670467 +MimeEntityEnd 3670465 MultipartBoundaryBegin 3670467 MultipartBoundaryEnd 3670507 MimeEntityBegin 3670507 @@ -966,21 +966,21 @@ MimeContentBegin 3671342 MimeContentEnd 3674767 Octets 3425 Lines 73 -MimeEntityEnd 3674769 -MimeMessageEnd 3674769 -MimeContentEnd 3674769 -Octets 4230 +MimeEntityEnd 3674767 +MimeMessageEnd 3674767 +MimeContentEnd 3674767 +Octets 4228 Lines 89 -MimeEntityEnd 3674769 +MimeEntityEnd 3674767 MultipartEndBoundaryBegin 3674769 MultipartEndBoundaryEnd 3674809 MultipartEpilogueBegin 3674809 MultipartEpilogueEnd 3674811 -MimeContentEnd 3674813 -Octets 4831 +MimeContentEnd 3674811 +Octets 4829 Lines 109 -MimeEntityEnd 3674813 -MimeMessageEnd 3674813 +MimeEntityEnd 3674811 +MimeMessageEnd 3674811 MboxMarkerBegin 3674813 MboxMarkerEnd 3674820 MimeMessageBegin 3674822 @@ -998,7 +998,7 @@ MimeContentBegin 3675566 MimeContentEnd 3675644 Octets 78 Lines 5 -MimeEntityEnd 3675646 +MimeEntityEnd 3675644 MultipartBoundaryBegin 3675646 MultipartBoundaryEnd 3675696 MimeEntityBegin 3675696 @@ -1012,21 +1012,21 @@ MimeContentBegin 3676560 MimeContentEnd 3676700 Octets 140 Lines 4 -MimeEntityEnd 3676702 -MimeMessageEnd 3676702 -MimeContentEnd 3676702 -Octets 941 +MimeEntityEnd 3676700 +MimeMessageEnd 3676700 +MimeContentEnd 3676700 +Octets 939 Lines 21 -MimeEntityEnd 3676702 +MimeEntityEnd 3676700 MultipartEndBoundaryBegin 3676702 MultipartEndBoundaryEnd 3676752 MultipartEpilogueBegin 3676752 MultipartEpilogueEnd 3676752 -MimeContentEnd 3676754 -Octets 1266 +MimeContentEnd 3676752 +Octets 1264 Lines 34 -MimeEntityEnd 3676754 -MimeMessageEnd 3676754 +MimeEntityEnd 3676752 +MimeMessageEnd 3676752 MboxMarkerBegin 3676754 MboxMarkerEnd 3676761 MimeMessageBegin 3676763 @@ -1037,8 +1037,8 @@ MimeContentBegin 3677286 MimeContentEnd 3678750 Octets 1464 Lines 46 -MimeEntityEnd 3678752 -MimeMessageEnd 3678752 +MimeEntityEnd 3678750 +MimeMessageEnd 3678750 MboxMarkerBegin 3678752 MboxMarkerEnd 3678802 MimeMessageBegin 3678804 @@ -1049,8 +1049,8 @@ MimeContentBegin 3679391 MimeContentEnd 3740046 Octets 60655 Lines 955 -MimeEntityEnd 3740048 -MimeMessageEnd 3740048 +MimeEntityEnd 3740046 +MimeMessageEnd 3740046 MboxMarkerBegin 3740048 MboxMarkerEnd 3740098 MimeMessageBegin 3740100 @@ -1061,8 +1061,8 @@ MimeContentBegin 3740684 MimeContentEnd 3801451 Octets 60767 Lines 961 -MimeEntityEnd 3801453 -MimeMessageEnd 3801453 +MimeEntityEnd 3801451 +MimeMessageEnd 3801451 MboxMarkerBegin 3801453 MboxMarkerEnd 3801460 MimeMessageBegin 3801462 @@ -1080,7 +1080,7 @@ MimeContentBegin 3802070 MimeContentEnd 3802145 Octets 75 Lines 5 -MimeEntityEnd 3802147 +MimeEntityEnd 3802145 MultipartBoundaryBegin 3802147 MultipartBoundaryEnd 3802163 MimeEntityBegin 3802163 @@ -1089,16 +1089,16 @@ MimeContentBegin 3802247 MimeContentEnd 3802897 Octets 650 Lines 10 -MimeEntityEnd 3802899 +MimeEntityEnd 3802897 MultipartEndBoundaryBegin 3802899 MultipartEndBoundaryEnd 3802915 MultipartEpilogueBegin 3802915 MultipartEpilogueEnd 3802919 -MimeContentEnd 3802921 -Octets 898 +MimeContentEnd 3802919 +Octets 896 Lines 26 -MimeEntityEnd 3802921 -MimeMessageEnd 3802921 +MimeEntityEnd 3802919 +MimeMessageEnd 3802919 MboxMarkerBegin 3802921 MboxMarkerEnd 3802928 MimeMessageBegin 3802930 @@ -1109,8 +1109,8 @@ MimeContentBegin 3803695 MimeContentEnd 3845795 Octets 42100 Lines 571 -MimeEntityEnd 3845797 -MimeMessageEnd 3845797 +MimeEntityEnd 3845795 +MimeMessageEnd 3845795 MboxMarkerBegin 3845797 MboxMarkerEnd 3845804 MimeMessageBegin 3845806 @@ -1128,7 +1128,7 @@ MimeContentBegin 3846993 MimeContentEnd 3848958 Octets 1965 Lines 44 -MimeEntityEnd 3848960 +MimeEntityEnd 3848958 MultipartBoundaryBegin 3848960 MultipartBoundaryEnd 3848966 MimeEntityBegin 3848966 @@ -1137,16 +1137,16 @@ MimeContentBegin 3849075 MimeContentEnd 3855383 Octets 6308 Lines 87 -MimeEntityEnd 3855385 +MimeEntityEnd 3855383 MultipartEndBoundaryBegin 3855385 MultipartEndBoundaryEnd 3855391 MultipartEpilogueBegin 3855391 MultipartEpilogueEnd 3855393 -MimeContentEnd 3855395 -Octets 8410 +MimeContentEnd 3855393 +Octets 8408 Lines 140 -MimeEntityEnd 3855395 -MimeMessageEnd 3855395 +MimeEntityEnd 3855393 +MimeMessageEnd 3855393 MboxMarkerBegin 3855395 MboxMarkerEnd 3855402 MimeMessageBegin 3855404 @@ -1157,8 +1157,8 @@ MimeContentBegin 3856880 MimeContentEnd 3965263 Octets 108383 Lines 1571 -MimeEntityEnd 3965265 -MimeMessageEnd 3965265 +MimeEntityEnd 3965263 +MimeMessageEnd 3965263 MboxMarkerBegin 3965265 MboxMarkerEnd 3965272 MimeMessageBegin 3965274 @@ -1191,7 +1191,7 @@ MimeContentBegin 3967783 MimeContentEnd 3967833 Octets 50 Lines 2 -MimeEntityEnd 3967835 +MimeEntityEnd 3967833 MultipartBoundaryBegin 3967835 MultipartBoundaryEnd 3967894 MimeEntityBegin 3967894 @@ -1212,7 +1212,7 @@ MimeContentBegin 3968651 MimeContentEnd 3968778 Octets 127 Lines 6 -MimeEntityEnd 3968780 +MimeEntityEnd 3968778 MultipartBoundaryBegin 3968780 MultipartBoundaryEnd 3968829 MimeEntityBegin 3968829 @@ -1221,44 +1221,44 @@ MimeContentBegin 3968901 MimeContentEnd 3969188 Octets 287 Lines 5 -MimeEntityEnd 3969190 +MimeEntityEnd 3969188 MultipartEndBoundaryBegin 3969190 MultipartEndBoundaryEnd 3969239 MultipartEpilogueBegin 3969239 MultipartEpilogueEnd 3969241 -MimeContentEnd 3969243 -Octets 768 +MimeContentEnd 3969241 +Octets 766 Lines 23 -MimeEntityEnd 3969243 -MimeMessageEnd 3969243 -MimeContentEnd 3969243 -Octets 1284 +MimeEntityEnd 3969241 +MimeMessageEnd 3969241 +MimeContentEnd 3969241 +Octets 1282 Lines 39 -MimeEntityEnd 3969243 +MimeEntityEnd 3969241 MultipartEndBoundaryBegin 3969243 MultipartEndBoundaryEnd 3969302 MultipartEpilogueBegin 3969302 MultipartEpilogueEnd 3969308 -MimeContentEnd 3969310 -Octets 1713 +MimeContentEnd 3969308 +Octets 1711 Lines 55 -MimeEntityEnd 3969310 -MimeMessageEnd 3969310 -MimeContentEnd 3969310 -Octets 2277 +MimeEntityEnd 3969308 +MimeMessageEnd 3969308 +MimeContentEnd 3969308 +Octets 2275 Lines 71 -MimeEntityEnd 3969310 -MimeMessageEnd 3969310 -MimeContentEnd 3969310 -Octets 2835 +MimeEntityEnd 3969308 +MimeMessageEnd 3969308 +MimeContentEnd 3969308 +Octets 2833 Lines 87 -MimeEntityEnd 3969310 -MimeMessageEnd 3969310 -MimeContentEnd 3969310 -Octets 3421 +MimeEntityEnd 3969308 +MimeMessageEnd 3969308 +MimeContentEnd 3969308 +Octets 3419 Lines 103 -MimeEntityEnd 3969310 -MimeMessageEnd 3969310 +MimeEntityEnd 3969308 +MimeMessageEnd 3969308 MboxMarkerBegin 3969310 MboxMarkerEnd 3969317 MimeMessageBegin 3969319 @@ -1276,7 +1276,7 @@ MimeContentBegin 3970068 MimeContentEnd 3970110 Octets 42 Lines 2 -MimeEntityEnd 3970112 +MimeEntityEnd 3970110 MultipartBoundaryBegin 3970112 MultipartBoundaryEnd 3970140 MimeEntityBegin 3970140 @@ -1285,7 +1285,7 @@ MimeContentBegin 3970290 MimeContentEnd 4047906 Octets 77616 Lines 401 -MimeEntityEnd 4047908 +MimeEntityEnd 4047906 MultipartBoundaryBegin 4047908 MultipartBoundaryEnd 4047936 MimeEntityBegin 4047936 @@ -1294,7 +1294,7 @@ MimeContentBegin 4047938 MimeContentEnd 4047972 Octets 34 Lines 4 -MimeEntityEnd 4047974 +MimeEntityEnd 4047972 MultipartBoundaryBegin 4047974 MultipartBoundaryEnd 4048002 MimeEntityBegin 4048002 @@ -1303,7 +1303,7 @@ MimeContentBegin 4048154 MimeContentEnd 4151890 Octets 103736 Lines 535 -MimeEntityEnd 4151892 +MimeEntityEnd 4151890 MultipartBoundaryBegin 4151892 MultipartBoundaryEnd 4151920 MimeEntityBegin 4151920 @@ -1312,7 +1312,7 @@ MimeContentBegin 4151922 MimeContentEnd 4152086 Octets 164 Lines 5 -MimeEntityEnd 4152088 +MimeEntityEnd 4152086 MultipartBoundaryBegin 4152088 MultipartBoundaryEnd 4152116 MimeEntityBegin 4152116 @@ -1321,7 +1321,7 @@ MimeContentBegin 4152208 MimeContentEnd 4233632 Octets 81424 Lines 1235 -MimeEntityEnd 4233634 +MimeEntityEnd 4233632 MultipartBoundaryBegin 4233634 MultipartBoundaryEnd 4233662 MimeEntityBegin 4233662 @@ -1330,16 +1330,16 @@ MimeContentBegin 4233664 MimeContentEnd 4233686 Octets 22 Lines 3 -MimeEntityEnd 4233688 +MimeEntityEnd 4233686 MultipartEndBoundaryBegin 4233688 MultipartEndBoundaryEnd 4233716 MultipartEpilogueBegin 4233716 MultipartEpilogueEnd 4233718 -MimeContentEnd 4233720 -Octets 263682 +MimeContentEnd 4233718 +Octets 263680 Lines 2211 -MimeEntityEnd 4233720 -MimeMessageEnd 4233720 +MimeEntityEnd 4233718 +MimeMessageEnd 4233718 MboxMarkerBegin 4233720 MboxMarkerEnd 4233727 MimeMessageBegin 4233729 @@ -1350,8 +1350,8 @@ MimeContentBegin 4234408 MimeContentEnd 4235418 Octets 1010 Lines 19 -MimeEntityEnd 4235420 -MimeMessageEnd 4235420 +MimeEntityEnd 4235418 +MimeMessageEnd 4235418 MboxMarkerBegin 4235420 MboxMarkerEnd 4235427 MimeMessageBegin 4235429 @@ -1369,7 +1369,7 @@ MimeContentBegin 4236753 MimeContentEnd 4237170 Octets 417 Lines 14 -MimeEntityEnd 4237172 +MimeEntityEnd 4237170 MultipartBoundaryBegin 4237172 MultipartBoundaryEnd 4237213 MimeEntityBegin 4237213 @@ -1385,7 +1385,7 @@ MimeContentBegin 4237438 MimeContentEnd 4237667 Octets 229 Lines 5 -MimeEntityEnd 4237669 +MimeEntityEnd 4237667 MultipartBoundaryBegin 4237669 MultipartBoundaryEnd 4237712 MimeEntityBegin 4237712 @@ -1394,7 +1394,7 @@ MimeContentBegin 4237835 MimeContentEnd 4239256 Octets 1421 Lines 38 -MimeEntityEnd 4239258 +MimeEntityEnd 4239256 MultipartBoundaryBegin 4239258 MultipartBoundaryEnd 4239301 MimeEntityBegin 4239301 @@ -1403,24 +1403,24 @@ MimeContentBegin 4239395 MimeContentEnd 4239552 Octets 157 Lines 10 -MimeEntityEnd 4239554 +MimeEntityEnd 4239552 MultipartEndBoundaryBegin 4239554 MultipartEndBoundaryEnd 4239597 MultipartEpilogueBegin 4239597 MultipartEpilogueEnd 4239599 -MimeContentEnd 4239601 -Octets 2300 +MimeContentEnd 4239599 +Octets 2298 Lines 68 -MimeEntityEnd 4239601 +MimeEntityEnd 4239599 MultipartEndBoundaryBegin 4239601 MultipartEndBoundaryEnd 4239642 MultipartEpilogueBegin 4239642 MultipartEpilogueEnd 4239644 -MimeContentEnd 4239646 -Octets 3138 +MimeContentEnd 4239644 +Octets 3136 Lines 94 -MimeEntityEnd 4239646 -MimeMessageEnd 4239646 +MimeEntityEnd 4239644 +MimeMessageEnd 4239644 MboxMarkerBegin 4239646 MboxMarkerEnd 4239653 MimeMessageBegin 4239655 @@ -1438,7 +1438,7 @@ MimeContentBegin 4240387 MimeContentEnd 4240471 Octets 84 Lines 7 -MimeEntityEnd 4240473 +MimeEntityEnd 4240471 MultipartBoundaryBegin 4240473 MultipartBoundaryEnd 4240490 MimeEntityBegin 4240490 @@ -1447,16 +1447,16 @@ MimeContentBegin 4240553 MimeContentEnd 4245787 Octets 5234 Lines 72 -MimeEntityEnd 4245789 +MimeEntityEnd 4245787 MultipartEndBoundaryBegin 4245789 MultipartEndBoundaryEnd 4245806 MultipartEpilogueBegin 4245806 MultipartEpilogueEnd 4245810 -MimeContentEnd 4245812 -Octets 5471 +MimeContentEnd 4245810 +Octets 5469 Lines 89 -MimeEntityEnd 4245812 -MimeMessageEnd 4245812 +MimeEntityEnd 4245810 +MimeMessageEnd 4245810 MboxMarkerBegin 4245812 MboxMarkerEnd 4245819 MimeMessageBegin 4245821 @@ -1467,8 +1467,8 @@ MimeContentBegin 4246287 MimeContentEnd 4257886 Octets 11599 Lines 186 -MimeEntityEnd 4257888 -MimeMessageEnd 4257888 +MimeEntityEnd 4257886 +MimeMessageEnd 4257886 MboxMarkerBegin 4257888 MboxMarkerEnd 4257895 MimeMessageBegin 4257897 @@ -1486,7 +1486,7 @@ MimeContentBegin 4258491 MimeContentEnd 4258530 Octets 39 Lines 2 -MimeEntityEnd 4258532 +MimeEntityEnd 4258530 MultipartBoundaryBegin 4258532 MultipartBoundaryEnd 4258544 MimeEntityBegin 4258544 @@ -1507,12 +1507,12 @@ MimeContentBegin 4258816 MimeContentEnd 4258885 Octets 69 Lines 3 -MimeEntityEnd 4258887 -MimeMessageEnd 4258887 -MimeContentEnd 4258887 -Octets 151 +MimeEntityEnd 4258885 +MimeMessageEnd 4258885 +MimeContentEnd 4258885 +Octets 149 Lines 6 -MimeEntityEnd 4258887 +MimeEntityEnd 4258885 MultipartBoundaryBegin 4258887 MultipartBoundaryEnd 4258902 MimeEntityBegin 4258902 @@ -1526,12 +1526,12 @@ MimeContentBegin 4259175 MimeContentEnd 4259175 Octets 0 Lines 0 -MimeEntityEnd 4259175 -MimeMessageEnd 4259175 -MimeContentEnd 4259175 -Octets 80 +MimeEntityEnd 4259173 +MimeMessageEnd 4259173 +MimeContentEnd 4259173 +Octets 78 Lines 3 -MimeEntityEnd 4259175 +MimeEntityEnd 4259173 MultipartBoundaryBegin 4259175 MultipartBoundaryEnd 4259190 MimeEntityBegin 4259190 @@ -1545,12 +1545,12 @@ MimeContentBegin 4259403 MimeContentEnd 4259403 Octets 0 Lines 0 -MimeEntityEnd 4259403 -MimeMessageEnd 4259403 -MimeContentEnd 4259403 -Octets 71 +MimeEntityEnd 4259401 +MimeMessageEnd 4259401 +MimeContentEnd 4259401 +Octets 69 Lines 3 -MimeEntityEnd 4259403 +MimeEntityEnd 4259401 MultipartBoundaryBegin 4259403 MultipartBoundaryEnd 4259418 MimeEntityBegin 4259418 @@ -1564,12 +1564,12 @@ MimeContentBegin 4259607 MimeContentEnd 4259607 Octets 0 Lines 0 -MimeEntityEnd 4259607 -MimeMessageEnd 4259607 -MimeContentEnd 4259607 -Octets 72 +MimeEntityEnd 4259605 +MimeMessageEnd 4259605 +MimeContentEnd 4259605 +Octets 70 Lines 3 -MimeEntityEnd 4259607 +MimeEntityEnd 4259605 MultipartBoundaryBegin 4259607 MultipartBoundaryEnd 4259622 MimeEntityBegin 4259622 @@ -1583,29 +1583,29 @@ MimeContentBegin 4259803 MimeContentEnd 4259803 Octets 0 Lines 0 -MimeEntityEnd 4259803 -MimeMessageEnd 4259803 -MimeContentEnd 4259803 -Octets 72 +MimeEntityEnd 4259801 +MimeMessageEnd 4259801 +MimeContentEnd 4259801 +Octets 70 Lines 3 -MimeEntityEnd 4259803 +MimeEntityEnd 4259801 MultipartEndBoundaryBegin 4259803 MultipartEndBoundaryEnd 4259818 MultipartEpilogueBegin 4259818 MultipartEpilogueEnd 4259820 -MimeContentEnd 4259822 -Octets 1221 +MimeContentEnd 4259820 +Octets 1219 Lines 50 -MimeEntityEnd 4259822 +MimeEntityEnd 4259820 MultipartEndBoundaryBegin 4259822 MultipartEndBoundaryEnd 4259834 MultipartEpilogueBegin 4259834 MultipartEpilogueEnd 4259836 -MimeContentEnd 4259838 -Octets 1361 +MimeContentEnd 4259836 +Octets 1359 Lines 59 -MimeEntityEnd 4259838 -MimeMessageEnd 4259838 +MimeEntityEnd 4259836 +MimeMessageEnd 4259836 MboxMarkerBegin 4259838 MboxMarkerEnd 4259845 MimeMessageBegin 4259847 @@ -1623,7 +1623,7 @@ MimeContentBegin 4260441 MimeContentEnd 4263710 Octets 3269 Lines 66 -MimeEntityEnd 4263712 +MimeEntityEnd 4263710 MultipartBoundaryBegin 4263712 MultipartBoundaryEnd 4263724 MimeEntityBegin 4263724 @@ -1644,12 +1644,12 @@ MimeContentBegin 4264002 MimeContentEnd 4264071 Octets 69 Lines 3 -MimeEntityEnd 4264073 -MimeMessageEnd 4264073 -MimeContentEnd 4264073 -Octets 151 +MimeEntityEnd 4264071 +MimeMessageEnd 4264071 +MimeContentEnd 4264071 +Octets 149 Lines 6 -MimeEntityEnd 4264073 +MimeEntityEnd 4264071 MultipartBoundaryBegin 4264073 MultipartBoundaryEnd 4264088 MimeEntityBegin 4264088 @@ -1663,29 +1663,29 @@ MimeContentBegin 4264361 MimeContentEnd 4264361 Octets 0 Lines 0 -MimeEntityEnd 4264361 -MimeMessageEnd 4264361 -MimeContentEnd 4264361 -Octets 80 +MimeEntityEnd 4264359 +MimeMessageEnd 4264359 +MimeContentEnd 4264359 +Octets 78 Lines 3 -MimeEntityEnd 4264361 +MimeEntityEnd 4264359 MultipartEndBoundaryBegin 4264361 MultipartEndBoundaryEnd 4264376 MultipartEpilogueBegin 4264376 MultipartEpilogueEnd 4264378 -MimeContentEnd 4264380 -Octets 593 +MimeContentEnd 4264378 +Octets 591 Lines 23 -MimeEntityEnd 4264380 +MimeEntityEnd 4264378 MultipartEndBoundaryBegin 4264380 MultipartEndBoundaryEnd 4264392 MultipartEpilogueBegin 4264392 MultipartEpilogueEnd 4264394 -MimeContentEnd 4264396 -Octets 3969 +MimeContentEnd 4264394 +Octets 3967 Lines 96 -MimeEntityEnd 4264396 -MimeMessageEnd 4264396 +MimeEntityEnd 4264394 +MimeMessageEnd 4264394 MboxMarkerBegin 4264396 MboxMarkerEnd 4264403 MimeMessageBegin 4264405 @@ -1708,12 +1708,12 @@ MimeContentBegin 4265550 MimeContentEnd 4265589 Octets 39 Lines 3 -MimeEntityEnd 4265591 -MimeMessageEnd 4265591 -MimeContentEnd 4265591 -Octets 481 +MimeEntityEnd 4265589 +MimeMessageEnd 4265589 +MimeContentEnd 4265589 +Octets 479 Lines 14 -MimeEntityEnd 4265591 +MimeEntityEnd 4265589 MultipartBoundaryBegin 4265591 MultipartBoundaryEnd 4265619 MimeEntityBegin 4265619 @@ -1722,7 +1722,7 @@ MimeContentBegin 4265746 MimeContentEnd 4266210 Octets 464 Lines 7 -MimeEntityEnd 4266212 +MimeEntityEnd 4266210 MultipartBoundaryBegin 4266212 MultipartBoundaryEnd 4266240 MimeEntityBegin 4266240 @@ -1731,7 +1731,7 @@ MimeContentBegin 4266367 MimeContentEnd 4266859 Octets 492 Lines 7 -MimeEntityEnd 4266861 +MimeEntityEnd 4266859 MultipartBoundaryBegin 4266861 MultipartBoundaryEnd 4266889 MimeEntityBegin 4266889 @@ -1740,7 +1740,7 @@ MimeContentBegin 4267020 MimeContentEnd 4267554 Octets 534 Lines 8 -MimeEntityEnd 4267556 +MimeEntityEnd 4267554 MultipartBoundaryBegin 4267556 MultipartBoundaryEnd 4267584 MimeEntityBegin 4267584 @@ -1749,7 +1749,7 @@ MimeContentBegin 4267713 MimeContentEnd 4268217 Octets 504 Lines 7 -MimeEntityEnd 4268219 +MimeEntityEnd 4268217 MultipartBoundaryBegin 4268219 MultipartBoundaryEnd 4268247 MimeEntityBegin 4268247 @@ -1763,12 +1763,12 @@ MimeContentBegin 4268836 MimeContentEnd 4268874 Octets 38 Lines 2 -MimeEntityEnd 4268876 -MimeMessageEnd 4268876 -MimeContentEnd 4268876 -Octets 480 +MimeEntityEnd 4268874 +MimeMessageEnd 4268874 +MimeContentEnd 4268874 +Octets 478 Lines 13 -MimeEntityEnd 4268876 +MimeEntityEnd 4268874 MultipartBoundaryBegin 4268876 MultipartBoundaryEnd 4268904 MimeEntityBegin 4268904 @@ -1792,22 +1792,22 @@ MimeContentBegin 4270611 MimeContentEnd 4270617 Octets 6 Lines 2 -MimeEntityEnd 4270619 -MimeMessageEnd 4270619 -MimeContentEnd 4270619 -Octets 429 +MimeEntityEnd 4270617 +MimeMessageEnd 4270617 +MimeContentEnd 4270617 +Octets 427 Lines 13 -MimeEntityEnd 4270619 -MimeMessageEnd 4270619 -MimeContentEnd 4270619 -Octets 954 +MimeEntityEnd 4270617 +MimeMessageEnd 4270617 +MimeContentEnd 4270617 +Octets 952 Lines 27 -MimeEntityEnd 4270619 -MimeMessageEnd 4270619 -MimeContentEnd 4270619 -Octets 1539 +MimeEntityEnd 4270617 +MimeMessageEnd 4270617 +MimeContentEnd 4270617 +Octets 1537 Lines 42 -MimeEntityEnd 4270619 +MimeEntityEnd 4270617 MultipartBoundaryBegin 4270619 MultipartBoundaryEnd 4270647 MimeEntityBegin 4270647 @@ -1816,16 +1816,16 @@ MimeContentBegin 4270703 MimeContentEnd 4270756 Octets 53 Lines 2 -MimeEntityEnd 4270758 +MimeEntityEnd 4270756 MultipartEndBoundaryBegin 4270758 MultipartEndBoundaryEnd 4270786 MultipartEpilogueBegin 4270786 MultipartEpilogueEnd 4270786 -MimeContentEnd 4270788 -Octets 5903 +MimeContentEnd 4270786 +Octets 5901 Lines 145 -MimeEntityEnd 4270788 -MimeMessageEnd 4270788 +MimeEntityEnd 4270786 +MimeMessageEnd 4270786 MboxMarkerBegin 4270788 MboxMarkerEnd 4270795 MimeMessageBegin 4270797 @@ -1848,12 +1848,12 @@ MimeContentBegin 4271948 MimeContentEnd 4271987 Octets 39 Lines 3 -MimeEntityEnd 4271989 -MimeMessageEnd 4271989 -MimeContentEnd 4271989 -Octets 480 +MimeEntityEnd 4271987 +MimeMessageEnd 4271987 +MimeContentEnd 4271987 +Octets 478 Lines 14 -MimeEntityEnd 4271989 +MimeEntityEnd 4271987 MultipartBoundaryBegin 4271989 MultipartBoundaryEnd 4272017 MimeEntityBegin 4272017 @@ -1862,7 +1862,7 @@ MimeContentBegin 4272148 MimeContentEnd 4272612 Octets 464 Lines 7 -MimeEntityEnd 4272614 +MimeEntityEnd 4272612 MultipartBoundaryBegin 4272614 MultipartBoundaryEnd 4272642 MimeEntityBegin 4272642 @@ -1871,7 +1871,7 @@ MimeContentBegin 4272773 MimeContentEnd 4273265 Octets 492 Lines 7 -MimeEntityEnd 4273267 +MimeEntityEnd 4273265 MultipartBoundaryBegin 4273267 MultipartBoundaryEnd 4273295 MimeEntityBegin 4273295 @@ -1880,7 +1880,7 @@ MimeContentBegin 4273430 MimeContentEnd 4273964 Octets 534 Lines 8 -MimeEntityEnd 4273966 +MimeEntityEnd 4273964 MultipartBoundaryBegin 4273966 MultipartBoundaryEnd 4273994 MimeEntityBegin 4273994 @@ -1889,7 +1889,7 @@ MimeContentBegin 4274127 MimeContentEnd 4274631 Octets 504 Lines 7 -MimeEntityEnd 4274633 +MimeEntityEnd 4274631 MultipartBoundaryBegin 4274633 MultipartBoundaryEnd 4274661 MimeEntityBegin 4274661 @@ -1903,12 +1903,12 @@ MimeContentBegin 4275253 MimeContentEnd 4275291 Octets 38 Lines 2 -MimeEntityEnd 4275293 -MimeMessageEnd 4275293 -MimeContentEnd 4275293 -Octets 479 +MimeEntityEnd 4275291 +MimeMessageEnd 4275291 +MimeContentEnd 4275291 +Octets 477 Lines 13 -MimeEntityEnd 4275293 +MimeEntityEnd 4275291 MultipartBoundaryBegin 4275293 MultipartBoundaryEnd 4275321 MimeEntityBegin 4275321 @@ -1932,22 +1932,22 @@ MimeContentBegin 4277037 MimeContentEnd 4277043 Octets 6 Lines 2 -MimeEntityEnd 4277045 -MimeMessageEnd 4277045 -MimeContentEnd 4277045 -Octets 428 +MimeEntityEnd 4277043 +MimeMessageEnd 4277043 +MimeContentEnd 4277043 +Octets 426 Lines 13 -MimeEntityEnd 4277045 -MimeMessageEnd 4277045 -MimeContentEnd 4277045 -Octets 956 +MimeEntityEnd 4277043 +MimeMessageEnd 4277043 +MimeContentEnd 4277043 +Octets 954 Lines 27 -MimeEntityEnd 4277045 -MimeMessageEnd 4277045 -MimeContentEnd 4277045 -Octets 1544 +MimeEntityEnd 4277043 +MimeMessageEnd 4277043 +MimeContentEnd 4277043 +Octets 1542 Lines 42 -MimeEntityEnd 4277045 +MimeEntityEnd 4277043 MultipartBoundaryBegin 4277045 MultipartBoundaryEnd 4277073 MimeEntityBegin 4277073 @@ -1956,16 +1956,16 @@ MimeContentBegin 4277133 MimeContentEnd 4277186 Octets 53 Lines 2 -MimeEntityEnd 4277188 +MimeEntityEnd 4277186 MultipartEndBoundaryBegin 4277188 MultipartEndBoundaryEnd 4277216 MultipartEpilogueBegin 4277216 MultipartEpilogueEnd 4277216 -MimeContentEnd 4277218 -Octets 5938 +MimeContentEnd 4277216 +Octets 5936 Lines 145 -MimeEntityEnd 4277218 -MimeMessageEnd 4277218 +MimeEntityEnd 4277216 +MimeMessageEnd 4277216 MboxMarkerBegin 4277218 MboxMarkerEnd 4277225 MimeMessageBegin 4277227 @@ -1983,7 +1983,7 @@ MimeContentBegin 4278012 MimeContentEnd 4278458 Octets 446 Lines 31 -MimeEntityEnd 4278460 +MimeEntityEnd 4278458 MultipartBoundaryBegin 4278460 MultipartBoundaryEnd 4278467 MimeEntityBegin 4278467 @@ -1992,7 +1992,7 @@ MimeContentBegin 4278543 MimeContentEnd 4279216 Octets 673 Lines 43 -MimeEntityEnd 4279218 +MimeEntityEnd 4279216 MultipartBoundaryBegin 4279218 MultipartBoundaryEnd 4279225 MimeEntityBegin 4279225 @@ -2001,7 +2001,7 @@ MimeContentBegin 4279227 MimeContentEnd 4279245 Octets 18 Lines 1 -MimeEntityEnd 4279247 +MimeEntityEnd 4279245 MultipartBoundaryBegin 4279247 MultipartBoundaryEnd 4279254 MimeEntityBegin 4279254 @@ -2010,7 +2010,7 @@ MimeContentBegin 4279256 MimeContentEnd 4279267 Octets 11 Lines 1 -MimeEntityEnd 4279269 +MimeEntityEnd 4279267 MultipartBoundaryBegin 4279269 MultipartBoundaryEnd 4279276 MimeEntityBegin 4279276 @@ -2031,7 +2031,7 @@ MimeContentBegin 4279564 MimeContentEnd 4279587 Octets 23 Lines 1 -MimeEntityEnd 4279589 +MimeEntityEnd 4279587 MultipartBoundaryBegin 4279589 MultipartBoundaryEnd 4279596 MimeEntityBegin 4279596 @@ -2040,20 +2040,20 @@ MimeContentBegin 4279776 MimeContentEnd 4279815 Octets 39 Lines 2 -MimeEntityEnd 4279817 +MimeEntityEnd 4279815 MultipartEndBoundaryBegin 4279817 MultipartEndBoundaryEnd 4279824 MultipartEpilogueBegin 4279824 MultipartEpilogueEnd 4279824 -MimeContentEnd 4279826 -Octets 296 +MimeContentEnd 4279824 +Octets 294 Lines 13 -MimeEntityEnd 4279826 -MimeMessageEnd 4279826 -MimeContentEnd 4279826 -Octets 518 +MimeEntityEnd 4279824 +MimeMessageEnd 4279824 +MimeContentEnd 4279824 +Octets 516 Lines 20 -MimeEntityEnd 4279826 +MimeEntityEnd 4279824 MultipartBoundaryBegin 4279826 MultipartBoundaryEnd 4279833 MimeEntityBegin 4279833 @@ -2062,7 +2062,7 @@ MimeContentBegin 4279914 MimeContentEnd 4289472 Octets 9558 Lines 128 -MimeEntityEnd 4289474 +MimeEntityEnd 4289472 MultipartBoundaryBegin 4289474 MultipartBoundaryEnd 4289481 MimeEntityBegin 4289481 @@ -2071,7 +2071,7 @@ MimeContentBegin 4289661 MimeContentEnd 4289700 Octets 39 Lines 2 -MimeEntityEnd 4289702 +MimeEntityEnd 4289700 MultipartBoundaryBegin 4289702 MultipartBoundaryEnd 4289709 MimeEntityBegin 4289709 @@ -2080,7 +2080,7 @@ MimeContentBegin 4289861 MimeContentEnd 4297809 Octets 7948 Lines 128 -MimeEntityEnd 4297811 +MimeEntityEnd 4297809 MultipartBoundaryBegin 4297811 MultipartBoundaryEnd 4297818 MimeEntityBegin 4297818 @@ -2101,12 +2101,12 @@ MimeContentBegin 4297914 MimeContentEnd 4297919 Octets 5 Lines 1 -MimeEntityEnd 4297921 -MimeMessageEnd 4297921 -MimeContentEnd 4297921 -Octets 36 +MimeEntityEnd 4297919 +MimeMessageEnd 4297919 +MimeContentEnd 4297919 +Octets 34 Lines 4 -MimeEntityEnd 4297921 +MimeEntityEnd 4297919 MultipartBoundaryBegin 4297921 MultipartBoundaryEnd 4297932 MimeEntityBegin 4297932 @@ -2120,12 +2120,12 @@ MimeContentBegin 4297963 MimeContentEnd 4297968 Octets 5 Lines 1 -MimeEntityEnd 4297970 -MimeMessageEnd 4297970 -MimeContentEnd 4297970 -Octets 36 +MimeEntityEnd 4297968 +MimeMessageEnd 4297968 +MimeContentEnd 4297968 +Octets 34 Lines 4 -MimeEntityEnd 4297970 +MimeEntityEnd 4297968 MultipartBoundaryBegin 4297970 MultipartBoundaryEnd 4297981 MimeEntityBegin 4297981 @@ -2139,12 +2139,12 @@ MimeContentBegin 4298012 MimeContentEnd 4298017 Octets 5 Lines 1 -MimeEntityEnd 4298019 -MimeMessageEnd 4298019 -MimeContentEnd 4298019 -Octets 36 +MimeEntityEnd 4298017 +MimeMessageEnd 4298017 +MimeContentEnd 4298017 +Octets 34 Lines 4 -MimeEntityEnd 4298019 +MimeEntityEnd 4298017 MultipartBoundaryBegin 4298019 MultipartBoundaryEnd 4298030 MimeEntityBegin 4298030 @@ -2153,7 +2153,7 @@ MimeContentBegin 4298057 MimeContentEnd 4298140 Octets 83 Lines 2 -MimeEntityEnd 4298142 +MimeEntityEnd 4298140 MultipartBoundaryBegin 4298142 MultipartBoundaryEnd 4298153 MimeEntityBegin 4298153 @@ -2167,12 +2167,12 @@ MimeContentBegin 4298213 MimeContentEnd 4298262 Octets 49 Lines 1 -MimeEntityEnd 4298264 -MimeMessageEnd 4298264 -MimeContentEnd 4298264 -Octets 109 +MimeEntityEnd 4298262 +MimeMessageEnd 4298262 +MimeContentEnd 4298262 +Octets 107 Lines 5 -MimeEntityEnd 4298264 +MimeEntityEnd 4298262 MultipartBoundaryBegin 4298264 MultipartBoundaryEnd 4298275 MimeEntityBegin 4298275 @@ -2186,29 +2186,29 @@ MimeContentBegin 4298306 MimeContentEnd 4298311 Octets 5 Lines 1 -MimeEntityEnd 4298313 -MimeMessageEnd 4298313 -MimeContentEnd 4298313 -Octets 36 +MimeEntityEnd 4298311 +MimeMessageEnd 4298311 +MimeContentEnd 4298311 +Octets 34 Lines 4 -MimeEntityEnd 4298313 +MimeEntityEnd 4298311 MultipartEndBoundaryBegin 4298313 MultipartEndBoundaryEnd 4298324 MultipartEpilogueBegin 4298324 MultipartEpilogueEnd 4298324 -MimeContentEnd 4298326 -Octets 454 +MimeContentEnd 4298324 +Octets 452 Lines 37 -MimeEntityEnd 4298326 +MimeEntityEnd 4298324 MultipartEndBoundaryBegin 4298326 MultipartEndBoundaryEnd 4298333 MultipartEpilogueBegin 4298333 MultipartEpilogueEnd 4298376 -MimeContentEnd 4298378 -Octets 20447 +MimeContentEnd 4298376 +Octets 20445 Lines 428 -MimeEntityEnd 4298378 -MimeMessageEnd 4298378 +MimeEntityEnd 4298376 +MimeMessageEnd 4298376 MboxMarkerBegin 4298378 MboxMarkerEnd 4298385 MimeMessageBegin 4298387 @@ -2226,7 +2226,7 @@ MimeContentBegin 4299092 MimeContentEnd 4300338 Octets 1246 Lines 27 -MimeEntityEnd 4300340 +MimeEntityEnd 4300338 MultipartBoundaryBegin 4300340 MultipartBoundaryEnd 4300367 MimeEntityBegin 4300367 @@ -2235,7 +2235,7 @@ MimeContentBegin 4300517 MimeContentEnd 4372203 Octets 71686 Lines 370 -MimeEntityEnd 4372205 +MimeEntityEnd 4372203 MultipartBoundaryBegin 4372205 MultipartBoundaryEnd 4372232 MimeEntityBegin 4372232 @@ -2244,16 +2244,16 @@ MimeContentBegin 4372234 MimeContentEnd 4372234 Octets 0 Lines 1 -MimeEntityEnd 4372236 +MimeEntityEnd 4372234 MultipartEndBoundaryBegin 4372236 MultipartEndBoundaryEnd 4372263 MultipartEpilogueBegin 4372263 MultipartEpilogueEnd 4372265 -MimeContentEnd 4372267 -Octets 73204 +MimeContentEnd 4372265 +Octets 73202 Lines 410 -MimeEntityEnd 4372267 -MimeMessageEnd 4372267 +MimeEntityEnd 4372265 +MimeMessageEnd 4372265 MboxMarkerBegin 4372267 MboxMarkerEnd 4372274 MimeMessageBegin 4372276 @@ -2264,8 +2264,8 @@ MimeContentBegin 4373229 MimeContentEnd 4625700 Octets 252471 Lines 3431 -MimeEntityEnd 4625702 -MimeMessageEnd 4625702 +MimeEntityEnd 4625700 +MimeMessageEnd 4625700 MboxMarkerBegin 4625702 MboxMarkerEnd 4625709 MimeMessageBegin 4625711 @@ -2283,7 +2283,7 @@ MimeContentBegin 4626981 MimeContentEnd 4627454 Octets 473 Lines 10 -MimeEntityEnd 4627456 +MimeEntityEnd 4627454 MultipartBoundaryBegin 4627456 MultipartBoundaryEnd 4627502 MimeEntityBegin 4627502 @@ -2292,7 +2292,7 @@ MimeContentBegin 4627564 MimeContentEnd 4652132 Octets 24568 Lines 333 -MimeEntityEnd 4652134 +MimeEntityEnd 4652132 MultipartBoundaryBegin 4652134 MultipartBoundaryEnd 4652180 MimeEntityBegin 4652180 @@ -2301,7 +2301,7 @@ MimeContentBegin 4652256 MimeContentEnd 4652714 Octets 458 Lines 11 -MimeEntityEnd 4652716 +MimeEntityEnd 4652714 MultipartBoundaryBegin 4652716 MultipartBoundaryEnd 4652762 MimeEntityBegin 4652762 @@ -2310,7 +2310,7 @@ MimeContentBegin 4652824 MimeContentEnd 4664192 Octets 11368 Lines 155 -MimeEntityEnd 4664194 +MimeEntityEnd 4664192 MultipartBoundaryBegin 4664194 MultipartBoundaryEnd 4664240 MimeEntityBegin 4664240 @@ -2319,7 +2319,7 @@ MimeContentBegin 4664316 MimeContentEnd 4664626 Octets 310 Lines 7 -MimeEntityEnd 4664628 +MimeEntityEnd 4664626 MultipartBoundaryBegin 4664628 MultipartBoundaryEnd 4664674 MimeEntityBegin 4664674 @@ -2328,7 +2328,7 @@ MimeContentBegin 4664736 MimeContentEnd 4681412 Octets 16676 Lines 227 -MimeEntityEnd 4681414 +MimeEntityEnd 4681412 MultipartBoundaryBegin 4681414 MultipartBoundaryEnd 4681460 MimeEntityBegin 4681460 @@ -2337,16 +2337,16 @@ MimeContentBegin 4681536 MimeContentEnd 4682211 Octets 675 Lines 16 -MimeEntityEnd 4682213 +MimeEntityEnd 4682211 MultipartEndBoundaryBegin 4682213 MultipartEndBoundaryEnd 4682259 MultipartEpilogueBegin 4682259 MultipartEpilogueEnd 4682261 -MimeContentEnd 4682263 -Octets 55603 +MimeContentEnd 4682261 +Octets 55601 Lines 793 -MimeEntityEnd 4682263 -MimeMessageEnd 4682263 +MimeEntityEnd 4682261 +MimeMessageEnd 4682261 MboxMarkerBegin 4682263 MboxMarkerEnd 4682270 MimeMessageBegin 4682272 @@ -2364,7 +2364,7 @@ MimeContentBegin 4683139 MimeContentEnd 4683807 Octets 668 Lines 19 -MimeEntityEnd 4683809 +MimeEntityEnd 4683807 MultipartBoundaryBegin 4683809 MultipartBoundaryEnd 4683839 MimeEntityBegin 4683839 @@ -2373,16 +2373,16 @@ MimeContentBegin 4683902 MimeContentEnd 4731116 Octets 47214 Lines 762 -MimeEntityEnd 4731118 +MimeEntityEnd 4731116 MultipartEndBoundaryBegin 4731118 MultipartEndBoundaryEnd 4731148 MultipartEpilogueBegin 4731148 MultipartEpilogueEnd 4731150 -MimeContentEnd 4731152 -Octets 48045 +MimeContentEnd 4731150 +Octets 48043 Lines 789 -MimeEntityEnd 4731152 -MimeMessageEnd 4731152 +MimeEntityEnd 4731150 +MimeMessageEnd 4731150 MboxMarkerBegin 4731152 MboxMarkerEnd 4731159 MimeMessageBegin 4731161 @@ -2400,7 +2400,7 @@ MimeContentBegin 4732463 MimeContentEnd 4737938 Octets 5475 Lines 161 -MimeEntityEnd 4737940 +MimeEntityEnd 4737938 MultipartBoundaryBegin 4737940 MultipartBoundaryEnd 4737964 MimeEntityBegin 4737964 @@ -2409,7 +2409,7 @@ MimeContentBegin 4738065 MimeContentEnd 4740681 Octets 2616 Lines 37 -MimeEntityEnd 4740683 +MimeEntityEnd 4740681 MultipartBoundaryBegin 4740683 MultipartBoundaryEnd 4740707 MimeEntityBegin 4740707 @@ -2418,7 +2418,7 @@ MimeContentBegin 4740783 MimeContentEnd 4741311 Octets 528 Lines 11 -MimeEntityEnd 4741313 +MimeEntityEnd 4741311 MultipartBoundaryBegin 4741313 MultipartBoundaryEnd 4741337 MimeEntityBegin 4741337 @@ -2427,7 +2427,7 @@ MimeContentBegin 4741455 MimeContentEnd 4764831 Octets 23376 Lines 317 -MimeEntityEnd 4764833 +MimeEntityEnd 4764831 MultipartBoundaryBegin 4764833 MultipartBoundaryEnd 4764857 MimeEntityBegin 4764857 @@ -2436,7 +2436,7 @@ MimeContentBegin 4764933 MimeContentEnd 4765525 Octets 592 Lines 15 -MimeEntityEnd 4765527 +MimeEntityEnd 4765525 MultipartBoundaryBegin 4765527 MultipartBoundaryEnd 4765551 MimeEntityBegin 4765551 @@ -2450,12 +2450,12 @@ MimeContentBegin 4765713 MimeContentEnd 4765713 Octets 0 Lines 0 -MimeEntityEnd 4765713 -MimeMessageEnd 4765713 -MimeContentEnd 4765713 -Octets 73 +MimeEntityEnd 4765711 +MimeMessageEnd 4765711 +MimeContentEnd 4765711 +Octets 71 Lines 3 -MimeEntityEnd 4765713 +MimeEntityEnd 4765711 MultipartBoundaryBegin 4765713 MultipartBoundaryEnd 4765737 MimeEntityBegin 4765737 @@ -2464,7 +2464,7 @@ MimeContentBegin 4765813 MimeContentEnd 4766094 Octets 281 Lines 6 -MimeEntityEnd 4766096 +MimeEntityEnd 4766094 MultipartBoundaryBegin 4766096 MultipartBoundaryEnd 4766120 MimeEntityBegin 4766120 @@ -2478,12 +2478,12 @@ MimeContentBegin 4766346 MimeContentEnd 4766346 Octets 0 Lines 0 -MimeEntityEnd 4766346 -MimeMessageEnd 4766346 -MimeContentEnd 4766346 -Octets 73 +MimeEntityEnd 4766344 +MimeMessageEnd 4766344 +MimeContentEnd 4766344 +Octets 71 Lines 3 -MimeEntityEnd 4766346 +MimeEntityEnd 4766344 MultipartBoundaryBegin 4766346 MultipartBoundaryEnd 4766370 MimeEntityBegin 4766370 @@ -2492,16 +2492,16 @@ MimeContentBegin 4766446 MimeContentEnd 4767549 Octets 1103 Lines 35 -MimeEntityEnd 4767551 +MimeEntityEnd 4767549 MultipartEndBoundaryBegin 4767551 MultipartEndBoundaryEnd 4767575 MultipartEpilogueBegin 4767575 MultipartEpilogueEnd 4767575 -MimeContentEnd 4767577 -Octets 35655 +MimeContentEnd 4767575 +Octets 35653 Lines 639 -MimeEntityEnd 4767577 -MimeMessageEnd 4767577 +MimeEntityEnd 4767575 +MimeMessageEnd 4767575 MboxMarkerBegin 4767577 MboxMarkerEnd 4767584 MimeMessageBegin 4767586 @@ -2519,7 +2519,7 @@ MimeContentBegin 4767838 MimeContentEnd 4845327 Octets 77489 Lines 1146 -MimeEntityEnd 4845329 +MimeEntityEnd 4845327 MultipartBoundaryBegin 4845329 MultipartBoundaryEnd 4845342 MimeEntityBegin 4845342 @@ -2528,16 +2528,16 @@ MimeContentBegin 4845344 MimeContentEnd 4845374 Octets 30 Lines 1 -MimeEntityEnd 4845376 +MimeEntityEnd 4845374 MultipartEndBoundaryBegin 4845376 MultipartEndBoundaryEnd 4845389 MultipartEpilogueBegin 4845389 MultipartEpilogueEnd 4845389 -MimeContentEnd 4845391 -Octets 77638 +MimeContentEnd 4845389 +Octets 77636 Lines 1154 -MimeEntityEnd 4845391 -MimeMessageEnd 4845391 +MimeEntityEnd 4845389 +MimeMessageEnd 4845389 MboxMarkerBegin 4845391 MboxMarkerEnd 4845398 MimeMessageBegin 4845400 @@ -2555,7 +2555,7 @@ MimeContentBegin 4846723 MimeContentEnd 4847183 Octets 460 Lines 9 -MimeEntityEnd 4847185 +MimeEntityEnd 4847183 MultipartBoundaryBegin 4847185 MultipartBoundaryEnd 4847224 MimeEntityBegin 4847224 @@ -2564,16 +2564,16 @@ MimeContentBegin 4847321 MimeContentEnd 4977159 Octets 129838 Lines 2096 -MimeEntityEnd 4977161 +MimeEntityEnd 4977159 MultipartEndBoundaryBegin 4977161 MultipartEndBoundaryEnd 4977200 MultipartEpilogueBegin 4977200 MultipartEpilogueEnd 4977202 -MimeContentEnd 4977204 -Octets 130566 +MimeContentEnd 4977202 +Octets 130564 Lines 2115 -MimeEntityEnd 4977204 -MimeMessageEnd 4977204 +MimeEntityEnd 4977202 +MimeMessageEnd 4977202 MboxMarkerBegin 4977204 MboxMarkerEnd 4977211 MimeMessageBegin 4977213 @@ -2591,7 +2591,7 @@ MimeContentBegin 4978388 MimeContentEnd 4979201 Octets 813 Lines 19 -MimeEntityEnd 4979203 +MimeEntityEnd 4979201 MultipartBoundaryBegin 4979203 MultipartBoundaryEnd 4979262 MimeEntityBegin 4979262 @@ -2607,7 +2607,7 @@ MimeContentBegin 4979505 MimeContentEnd 4980001 Octets 496 Lines 8 -MimeEntityEnd 4980003 +MimeEntityEnd 4980001 MultipartBoundaryBegin 4980003 MultipartBoundaryEnd 4980064 MimeEntityBegin 4980064 @@ -2616,7 +2616,7 @@ MimeContentBegin 4980164 MimeContentEnd 4993344 Octets 13180 Lines 191 -MimeEntityEnd 4993346 +MimeEntityEnd 4993344 MultipartBoundaryBegin 4993346 MultipartBoundaryEnd 4993407 MimeEntityBegin 4993407 @@ -2625,7 +2625,7 @@ MimeContentBegin 4993480 MimeContentEnd 4993501 Octets 21 Lines 2 -MimeEntityEnd 4993503 +MimeEntityEnd 4993501 MultipartBoundaryBegin 4993503 MultipartBoundaryEnd 4993564 MimeEntityBegin 4993564 @@ -2634,7 +2634,7 @@ MimeContentBegin 4993664 MimeContentEnd 5050148 Octets 56484 Lines 765 -MimeEntityEnd 5050150 +MimeEntityEnd 5050148 MultipartBoundaryBegin 5050150 MultipartBoundaryEnd 5050211 MimeEntityBegin 5050211 @@ -2643,7 +2643,7 @@ MimeContentBegin 5050284 MimeContentEnd 5050341 Octets 57 Lines 6 -MimeEntityEnd 5050343 +MimeEntityEnd 5050341 MultipartBoundaryBegin 5050343 MultipartBoundaryEnd 5050404 MimeEntityBegin 5050404 @@ -2652,7 +2652,7 @@ MimeContentBegin 5050468 MimeContentEnd 5154020 Octets 103552 Lines 1401 -MimeEntityEnd 5154022 +MimeEntityEnd 5154020 MultipartBoundaryBegin 5154022 MultipartBoundaryEnd 5154083 MimeEntityBegin 5154083 @@ -2661,24 +2661,24 @@ MimeContentBegin 5154156 MimeContentEnd 5154160 Octets 4 Lines 3 -MimeEntityEnd 5154162 +MimeEntityEnd 5154160 MultipartEndBoundaryBegin 5154162 MultipartEndBoundaryEnd 5154223 MultipartEpilogueBegin 5154223 MultipartEpilogueEnd 5154225 -MimeContentEnd 5154227 -Octets 174859 +MimeContentEnd 5154225 +Octets 174857 Lines 2408 -MimeEntityEnd 5154227 +MimeEntityEnd 5154225 MultipartEndBoundaryBegin 5154227 MultipartEndBoundaryEnd 5154286 MultipartEpilogueBegin 5154286 MultipartEpilogueEnd 5154286 -MimeContentEnd 5154288 -Octets 176306 +MimeContentEnd 5154286 +Octets 176304 Lines 2440 -MimeEntityEnd 5154288 -MimeMessageEnd 5154288 +MimeEntityEnd 5154286 +MimeMessageEnd 5154286 MboxMarkerBegin 5154288 MboxMarkerEnd 5154295 MimeMessageBegin 5154297 @@ -2696,7 +2696,7 @@ MimeContentBegin 5155244 MimeContentEnd 5156788 Octets 1544 Lines 30 -MimeEntityEnd 5156790 +MimeEntityEnd 5156788 MultipartBoundaryBegin 5156790 MultipartBoundaryEnd 5156831 MimeEntityBegin 5156831 @@ -2712,7 +2712,7 @@ MimeContentBegin 5157056 MimeContentEnd 5157976 Octets 920 Lines 14 -MimeEntityEnd 5157978 +MimeEntityEnd 5157976 MultipartBoundaryBegin 5157978 MultipartBoundaryEnd 5158021 MimeEntityBegin 5158021 @@ -2721,7 +2721,7 @@ MimeContentBegin 5158116 MimeContentEnd 5193480 Octets 35364 Lines 507 -MimeEntityEnd 5193482 +MimeEntityEnd 5193480 MultipartBoundaryBegin 5193482 MultipartBoundaryEnd 5193525 MimeEntityBegin 5193525 @@ -2730,7 +2730,7 @@ MimeContentBegin 5193619 MimeContentEnd 5193631 Octets 12 Lines 3 -MimeEntityEnd 5193633 +MimeEntityEnd 5193631 MultipartBoundaryBegin 5193633 MultipartBoundaryEnd 5193676 MimeEntityBegin 5193676 @@ -2739,7 +2739,7 @@ MimeContentBegin 5193771 MimeContentEnd 5215415 Octets 21644 Lines 311 -MimeEntityEnd 5215417 +MimeEntityEnd 5215415 MultipartBoundaryBegin 5215417 MultipartBoundaryEnd 5215460 MimeEntityBegin 5215460 @@ -2748,7 +2748,7 @@ MimeContentBegin 5215554 MimeContentEnd 5215566 Octets 12 Lines 3 -MimeEntityEnd 5215568 +MimeEntityEnd 5215566 MultipartBoundaryBegin 5215568 MultipartBoundaryEnd 5215611 MimeEntityBegin 5215611 @@ -2757,7 +2757,7 @@ MimeContentBegin 5215706 MimeContentEnd 5248620 Octets 32914 Lines 472 -MimeEntityEnd 5248622 +MimeEntityEnd 5248620 MultipartBoundaryBegin 5248622 MultipartBoundaryEnd 5248665 MimeEntityBegin 5248665 @@ -2766,7 +2766,7 @@ MimeContentBegin 5248759 MimeContentEnd 5248771 Octets 12 Lines 3 -MimeEntityEnd 5248773 +MimeEntityEnd 5248771 MultipartBoundaryBegin 5248773 MultipartBoundaryEnd 5248816 MimeEntityBegin 5248816 @@ -2775,7 +2775,7 @@ MimeContentBegin 5248911 MimeContentEnd 5282837 Octets 33926 Lines 486 -MimeEntityEnd 5282839 +MimeEntityEnd 5282837 MultipartBoundaryBegin 5282839 MultipartBoundaryEnd 5282882 MimeEntityBegin 5282882 @@ -2784,7 +2784,7 @@ MimeContentBegin 5282976 MimeContentEnd 5282988 Octets 12 Lines 3 -MimeEntityEnd 5282990 +MimeEntityEnd 5282988 MultipartBoundaryBegin 5282990 MultipartBoundaryEnd 5283033 MimeEntityBegin 5283033 @@ -2793,7 +2793,7 @@ MimeContentBegin 5283128 MimeContentEnd 5311368 Octets 28240 Lines 405 -MimeEntityEnd 5311370 +MimeEntityEnd 5311368 MultipartBoundaryBegin 5311370 MultipartBoundaryEnd 5311413 MimeEntityBegin 5311413 @@ -2802,7 +2802,7 @@ MimeContentBegin 5311507 MimeContentEnd 5311519 Octets 12 Lines 3 -MimeEntityEnd 5311521 +MimeEntityEnd 5311519 MultipartBoundaryBegin 5311521 MultipartBoundaryEnd 5311564 MimeEntityBegin 5311564 @@ -2811,7 +2811,7 @@ MimeContentBegin 5311659 MimeContentEnd 5345639 Octets 33980 Lines 487 -MimeEntityEnd 5345641 +MimeEntityEnd 5345639 MultipartBoundaryBegin 5345641 MultipartBoundaryEnd 5345684 MimeEntityBegin 5345684 @@ -2820,7 +2820,7 @@ MimeContentBegin 5345778 MimeContentEnd 5345790 Octets 12 Lines 3 -MimeEntityEnd 5345792 +MimeEntityEnd 5345790 MultipartBoundaryBegin 5345792 MultipartBoundaryEnd 5345835 MimeEntityBegin 5345835 @@ -2829,7 +2829,7 @@ MimeContentBegin 5345930 MimeContentEnd 5372976 Octets 27046 Lines 388 -MimeEntityEnd 5372978 +MimeEntityEnd 5372976 MultipartBoundaryBegin 5372978 MultipartBoundaryEnd 5373021 MimeEntityBegin 5373021 @@ -2838,24 +2838,24 @@ MimeContentBegin 5373115 MimeContentEnd 5373192 Octets 77 Lines 4 -MimeEntityEnd 5373194 +MimeEntityEnd 5373192 MultipartEndBoundaryBegin 5373194 MultipartEndBoundaryEnd 5373237 MultipartEpilogueBegin 5373237 MultipartEpilogueEnd 5373239 -MimeContentEnd 5373241 -Octets 216322 +MimeContentEnd 5373239 +Octets 216320 Lines 3161 -MimeEntityEnd 5373241 +MimeEntityEnd 5373239 MultipartEndBoundaryBegin 5373241 MultipartEndBoundaryEnd 5373282 MultipartEpilogueBegin 5373282 MultipartEpilogueEnd 5373282 -MimeContentEnd 5373284 -Octets 218285 +MimeContentEnd 5373282 +Octets 218283 Lines 3202 -MimeEntityEnd 5373284 -MimeMessageEnd 5373284 +MimeEntityEnd 5373282 +MimeMessageEnd 5373282 MboxMarkerBegin 5373284 MboxMarkerEnd 5373291 MimeMessageBegin 5373293 @@ -2873,7 +2873,7 @@ MimeContentBegin 5374045 MimeContentEnd 5374257 Octets 212 Lines 10 -MimeEntityEnd 5374259 +MimeEntityEnd 5374257 MultipartBoundaryBegin 5374259 MultipartBoundaryEnd 5374309 MimeEntityBegin 5374309 @@ -2882,7 +2882,7 @@ MimeContentBegin 5374373 MimeContentEnd 5464185 Octets 89812 Lines 1215 -MimeEntityEnd 5464187 +MimeEntityEnd 5464185 MultipartBoundaryBegin 5464187 MultipartBoundaryEnd 5464237 MimeEntityBegin 5464237 @@ -2891,16 +2891,16 @@ MimeContentBegin 5464265 MimeContentEnd 5464296 Octets 31 Lines 2 -MimeEntityEnd 5464298 +MimeEntityEnd 5464296 MultipartEndBoundaryBegin 5464298 MultipartEndBoundaryEnd 5464348 MultipartEpilogueBegin 5464348 MultipartEpilogueEnd 5464350 -MimeContentEnd 5464352 -Octets 90654 +MimeContentEnd 5464350 +Octets 90652 Lines 1244 -MimeEntityEnd 5464352 -MimeMessageEnd 5464352 +MimeEntityEnd 5464350 +MimeMessageEnd 5464350 MboxMarkerBegin 5464352 MboxMarkerEnd 5464359 MimeMessageBegin 5464361 @@ -2911,8 +2911,8 @@ MimeContentBegin 5465317 MimeContentEnd 5516722 Octets 51405 Lines 697 -MimeEntityEnd 5516724 -MimeMessageEnd 5516724 +MimeEntityEnd 5516722 +MimeMessageEnd 5516722 MboxMarkerBegin 5516724 MboxMarkerEnd 5516731 MimeMessageBegin 5516733 @@ -2930,7 +2930,7 @@ MimeContentBegin 5517383 MimeContentEnd 5521801 Octets 4418 Lines 102 -MimeEntityEnd 5521803 +MimeEntityEnd 5521801 MultipartBoundaryBegin 5521803 MultipartBoundaryEnd 5521822 MimeEntityBegin 5521822 @@ -2951,12 +2951,12 @@ MimeContentBegin 5522109 MimeContentEnd 5522748 Octets 639 Lines 19 -MimeEntityEnd 5522750 -MimeMessageEnd 5522750 -MimeContentEnd 5522750 -Octets 750 +MimeEntityEnd 5522748 +MimeMessageEnd 5522748 +MimeContentEnd 5522748 +Octets 748 Lines 23 -MimeEntityEnd 5522750 +MimeEntityEnd 5522748 MultipartBoundaryBegin 5522750 MultipartBoundaryEnd 5522782 MimeEntityBegin 5522782 @@ -2970,12 +2970,12 @@ MimeContentBegin 5522909 MimeContentEnd 5523662 Octets 753 Lines 21 -MimeEntityEnd 5523664 -MimeMessageEnd 5523664 -MimeContentEnd 5523664 -Octets 880 +MimeEntityEnd 5523662 +MimeMessageEnd 5523662 +MimeContentEnd 5523662 +Octets 878 Lines 25 -MimeEntityEnd 5523664 +MimeEntityEnd 5523662 MultipartBoundaryBegin 5523664 MultipartBoundaryEnd 5523696 MimeEntityBegin 5523696 @@ -2989,12 +2989,12 @@ MimeContentBegin 5523821 MimeContentEnd 5524481 Octets 660 Lines 15 -MimeEntityEnd 5524483 -MimeMessageEnd 5524483 -MimeContentEnd 5524483 -Octets 785 +MimeEntityEnd 5524481 +MimeMessageEnd 5524481 +MimeContentEnd 5524481 +Octets 783 Lines 19 -MimeEntityEnd 5524483 +MimeEntityEnd 5524481 MultipartBoundaryBegin 5524483 MultipartBoundaryEnd 5524515 MimeEntityBegin 5524515 @@ -3008,12 +3008,12 @@ MimeContentBegin 5524677 MimeContentEnd 5525170 Octets 493 Lines 11 -MimeEntityEnd 5525172 -MimeMessageEnd 5525172 -MimeContentEnd 5525172 -Octets 655 +MimeEntityEnd 5525170 +MimeMessageEnd 5525170 +MimeContentEnd 5525170 +Octets 653 Lines 15 -MimeEntityEnd 5525172 +MimeEntityEnd 5525170 MultipartBoundaryBegin 5525172 MultipartBoundaryEnd 5525204 MimeEntityBegin 5525204 @@ -3027,12 +3027,12 @@ MimeContentBegin 5525364 MimeContentEnd 5525951 Octets 587 Lines 16 -MimeEntityEnd 5525953 -MimeMessageEnd 5525953 -MimeContentEnd 5525953 -Octets 747 +MimeEntityEnd 5525951 +MimeMessageEnd 5525951 +MimeContentEnd 5525951 +Octets 745 Lines 20 -MimeEntityEnd 5525953 +MimeEntityEnd 5525951 MultipartBoundaryBegin 5525953 MultipartBoundaryEnd 5525985 MimeEntityBegin 5525985 @@ -3046,12 +3046,12 @@ MimeContentBegin 5526148 MimeContentEnd 5527449 Octets 1301 Lines 27 -MimeEntityEnd 5527451 -MimeMessageEnd 5527451 -MimeContentEnd 5527451 -Octets 1464 +MimeEntityEnd 5527449 +MimeMessageEnd 5527449 +MimeContentEnd 5527449 +Octets 1462 Lines 31 -MimeEntityEnd 5527451 +MimeEntityEnd 5527449 MultipartBoundaryBegin 5527451 MultipartBoundaryEnd 5527483 MimeEntityBegin 5527483 @@ -3065,12 +3065,12 @@ MimeContentBegin 5527642 MimeContentEnd 5528052 Octets 410 Lines 10 -MimeEntityEnd 5528054 -MimeMessageEnd 5528054 -MimeContentEnd 5528054 -Octets 569 +MimeEntityEnd 5528052 +MimeMessageEnd 5528052 +MimeContentEnd 5528052 +Octets 567 Lines 14 -MimeEntityEnd 5528054 +MimeEntityEnd 5528052 MultipartBoundaryBegin 5528054 MultipartBoundaryEnd 5528086 MimeEntityBegin 5528086 @@ -3084,12 +3084,12 @@ MimeContentBegin 5528239 MimeContentEnd 5528642 Octets 403 Lines 8 -MimeEntityEnd 5528644 -MimeMessageEnd 5528644 -MimeContentEnd 5528644 -Octets 556 +MimeEntityEnd 5528642 +MimeMessageEnd 5528642 +MimeContentEnd 5528642 +Octets 554 Lines 12 -MimeEntityEnd 5528644 +MimeEntityEnd 5528642 MultipartBoundaryBegin 5528644 MultipartBoundaryEnd 5528676 MimeEntityBegin 5528676 @@ -3103,12 +3103,12 @@ MimeContentBegin 5528825 MimeContentEnd 5529476 Octets 651 Lines 12 -MimeEntityEnd 5529478 -MimeMessageEnd 5529478 -MimeContentEnd 5529478 -Octets 800 +MimeEntityEnd 5529476 +MimeMessageEnd 5529476 +MimeContentEnd 5529476 +Octets 798 Lines 16 -MimeEntityEnd 5529478 +MimeEntityEnd 5529476 MultipartBoundaryBegin 5529478 MultipartBoundaryEnd 5529510 MimeEntityBegin 5529510 @@ -3122,12 +3122,12 @@ MimeContentBegin 5529653 MimeContentEnd 5530649 Octets 996 Lines 20 -MimeEntityEnd 5530651 -MimeMessageEnd 5530651 -MimeContentEnd 5530651 -Octets 1139 +MimeEntityEnd 5530649 +MimeMessageEnd 5530649 +MimeContentEnd 5530649 +Octets 1137 Lines 24 -MimeEntityEnd 5530651 +MimeEntityEnd 5530649 MultipartBoundaryBegin 5530651 MultipartBoundaryEnd 5530683 MimeEntityBegin 5530683 @@ -3141,12 +3141,12 @@ MimeContentBegin 5530836 MimeContentEnd 5531753 Octets 917 Lines 28 -MimeEntityEnd 5531755 -MimeMessageEnd 5531755 -MimeContentEnd 5531755 -Octets 1070 +MimeEntityEnd 5531753 +MimeMessageEnd 5531753 +MimeContentEnd 5531753 +Octets 1068 Lines 32 -MimeEntityEnd 5531755 +MimeEntityEnd 5531753 MultipartBoundaryBegin 5531755 MultipartBoundaryEnd 5531787 MimeEntityBegin 5531787 @@ -3160,12 +3160,12 @@ MimeContentBegin 5531924 MimeContentEnd 5532494 Octets 570 Lines 12 -MimeEntityEnd 5532496 -MimeMessageEnd 5532496 -MimeContentEnd 5532496 -Octets 707 +MimeEntityEnd 5532494 +MimeMessageEnd 5532494 +MimeContentEnd 5532494 +Octets 705 Lines 16 -MimeEntityEnd 5532496 +MimeEntityEnd 5532494 MultipartBoundaryBegin 5532496 MultipartBoundaryEnd 5532528 MimeEntityBegin 5532528 @@ -3179,12 +3179,12 @@ MimeContentBegin 5532666 MimeContentEnd 5533113 Octets 447 Lines 11 -MimeEntityEnd 5533115 -MimeMessageEnd 5533115 -MimeContentEnd 5533115 -Octets 585 +MimeEntityEnd 5533113 +MimeMessageEnd 5533113 +MimeContentEnd 5533113 +Octets 583 Lines 15 -MimeEntityEnd 5533115 +MimeEntityEnd 5533113 MultipartBoundaryBegin 5533115 MultipartBoundaryEnd 5533147 MimeEntityBegin 5533147 @@ -3198,12 +3198,12 @@ MimeContentBegin 5533270 MimeContentEnd 5533837 Octets 567 Lines 16 -MimeEntityEnd 5533839 -MimeMessageEnd 5533839 -MimeContentEnd 5533839 -Octets 690 +MimeEntityEnd 5533837 +MimeMessageEnd 5533837 +MimeContentEnd 5533837 +Octets 688 Lines 20 -MimeEntityEnd 5533839 +MimeEntityEnd 5533837 MultipartBoundaryBegin 5533839 MultipartBoundaryEnd 5533871 MimeEntityBegin 5533871 @@ -3217,12 +3217,12 @@ MimeContentBegin 5533992 MimeContentEnd 5534185 Octets 193 Lines 9 -MimeEntityEnd 5534187 -MimeMessageEnd 5534187 -MimeContentEnd 5534187 -Octets 314 +MimeEntityEnd 5534185 +MimeMessageEnd 5534185 +MimeContentEnd 5534185 +Octets 312 Lines 13 -MimeEntityEnd 5534187 +MimeEntityEnd 5534185 MultipartBoundaryBegin 5534187 MultipartBoundaryEnd 5534219 MimeEntityBegin 5534219 @@ -3236,12 +3236,12 @@ MimeContentBegin 5534342 MimeContentEnd 5534677 Octets 335 Lines 8 -MimeEntityEnd 5534679 -MimeMessageEnd 5534679 -MimeContentEnd 5534679 -Octets 458 +MimeEntityEnd 5534677 +MimeMessageEnd 5534677 +MimeContentEnd 5534677 +Octets 456 Lines 12 -MimeEntityEnd 5534679 +MimeEntityEnd 5534677 MultipartBoundaryBegin 5534679 MultipartBoundaryEnd 5534711 MimeEntityBegin 5534711 @@ -3255,12 +3255,12 @@ MimeContentBegin 5534840 MimeContentEnd 5535528 Octets 688 Lines 22 -MimeEntityEnd 5535530 -MimeMessageEnd 5535530 -MimeContentEnd 5535530 -Octets 817 +MimeEntityEnd 5535528 +MimeMessageEnd 5535528 +MimeContentEnd 5535528 +Octets 815 Lines 26 -MimeEntityEnd 5535530 +MimeEntityEnd 5535528 MultipartBoundaryBegin 5535530 MultipartBoundaryEnd 5535562 MimeEntityBegin 5535562 @@ -3274,12 +3274,12 @@ MimeContentBegin 5535692 MimeContentEnd 5535799 Octets 107 Lines 6 -MimeEntityEnd 5535801 -MimeMessageEnd 5535801 -MimeContentEnd 5535801 -Octets 237 +MimeEntityEnd 5535799 +MimeMessageEnd 5535799 +MimeContentEnd 5535799 +Octets 235 Lines 10 -MimeEntityEnd 5535801 +MimeEntityEnd 5535799 MultipartBoundaryBegin 5535801 MultipartBoundaryEnd 5535833 MimeEntityBegin 5535833 @@ -3293,12 +3293,12 @@ MimeContentBegin 5535981 MimeContentEnd 5536838 Octets 857 Lines 22 -MimeEntityEnd 5536840 -MimeMessageEnd 5536840 -MimeContentEnd 5536840 -Octets 1005 +MimeEntityEnd 5536838 +MimeMessageEnd 5536838 +MimeContentEnd 5536838 +Octets 1003 Lines 26 -MimeEntityEnd 5536840 +MimeEntityEnd 5536838 MultipartBoundaryBegin 5536840 MultipartBoundaryEnd 5536872 MimeEntityBegin 5536872 @@ -3312,12 +3312,12 @@ MimeContentBegin 5536988 MimeContentEnd 5537416 Octets 428 Lines 10 -MimeEntityEnd 5537418 -MimeMessageEnd 5537418 -MimeContentEnd 5537418 -Octets 544 +MimeEntityEnd 5537416 +MimeMessageEnd 5537416 +MimeContentEnd 5537416 +Octets 542 Lines 14 -MimeEntityEnd 5537418 +MimeEntityEnd 5537416 MultipartBoundaryBegin 5537418 MultipartBoundaryEnd 5537450 MimeEntityBegin 5537450 @@ -3331,12 +3331,12 @@ MimeContentBegin 5537628 MimeContentEnd 5537867 Octets 239 Lines 10 -MimeEntityEnd 5537869 -MimeMessageEnd 5537869 -MimeContentEnd 5537869 -Octets 417 +MimeEntityEnd 5537867 +MimeMessageEnd 5537867 +MimeContentEnd 5537867 +Octets 415 Lines 14 -MimeEntityEnd 5537869 +MimeEntityEnd 5537867 MultipartBoundaryBegin 5537869 MultipartBoundaryEnd 5537901 MimeEntityBegin 5537901 @@ -3350,12 +3350,12 @@ MimeContentBegin 5538033 MimeContentEnd 5538444 Octets 411 Lines 13 -MimeEntityEnd 5538446 -MimeMessageEnd 5538446 -MimeContentEnd 5538446 -Octets 543 +MimeEntityEnd 5538444 +MimeMessageEnd 5538444 +MimeContentEnd 5538444 +Octets 541 Lines 17 -MimeEntityEnd 5538446 +MimeEntityEnd 5538444 MultipartBoundaryBegin 5538446 MultipartBoundaryEnd 5538478 MimeEntityBegin 5538478 @@ -3369,12 +3369,12 @@ MimeContentBegin 5538601 MimeContentEnd 5539533 Octets 932 Lines 29 -MimeEntityEnd 5539535 -MimeMessageEnd 5539535 -MimeContentEnd 5539535 -Octets 1055 +MimeEntityEnd 5539533 +MimeMessageEnd 5539533 +MimeContentEnd 5539533 +Octets 1053 Lines 33 -MimeEntityEnd 5539535 +MimeEntityEnd 5539533 MultipartBoundaryBegin 5539535 MultipartBoundaryEnd 5539567 MimeEntityBegin 5539567 @@ -3388,12 +3388,12 @@ MimeContentBegin 5539701 MimeContentEnd 5540001 Octets 300 Lines 10 -MimeEntityEnd 5540003 -MimeMessageEnd 5540003 -MimeContentEnd 5540003 -Octets 434 +MimeEntityEnd 5540001 +MimeMessageEnd 5540001 +MimeContentEnd 5540001 +Octets 432 Lines 14 -MimeEntityEnd 5540003 +MimeEntityEnd 5540001 MultipartBoundaryBegin 5540003 MultipartBoundaryEnd 5540035 MimeEntityBegin 5540035 @@ -3407,12 +3407,12 @@ MimeContentBegin 5540170 MimeContentEnd 5540594 Octets 424 Lines 15 -MimeEntityEnd 5540596 -MimeMessageEnd 5540596 -MimeContentEnd 5540596 -Octets 559 +MimeEntityEnd 5540594 +MimeMessageEnd 5540594 +MimeContentEnd 5540594 +Octets 557 Lines 19 -MimeEntityEnd 5540596 +MimeEntityEnd 5540594 MultipartBoundaryBegin 5540596 MultipartBoundaryEnd 5540628 MimeEntityBegin 5540628 @@ -3426,12 +3426,12 @@ MimeContentBegin 5540749 MimeContentEnd 5540898 Octets 149 Lines 5 -MimeEntityEnd 5540900 -MimeMessageEnd 5540900 -MimeContentEnd 5540900 -Octets 270 +MimeEntityEnd 5540898 +MimeMessageEnd 5540898 +MimeContentEnd 5540898 +Octets 268 Lines 9 -MimeEntityEnd 5540900 +MimeEntityEnd 5540898 MultipartBoundaryBegin 5540900 MultipartBoundaryEnd 5540932 MimeEntityBegin 5540932 @@ -3445,12 +3445,12 @@ MimeContentBegin 5541063 MimeContentEnd 5541249 Octets 186 Lines 8 -MimeEntityEnd 5541251 -MimeMessageEnd 5541251 -MimeContentEnd 5541251 -Octets 317 +MimeEntityEnd 5541249 +MimeMessageEnd 5541249 +MimeContentEnd 5541249 +Octets 315 Lines 12 -MimeEntityEnd 5541251 +MimeEntityEnd 5541249 MultipartBoundaryBegin 5541251 MultipartBoundaryEnd 5541283 MimeEntityBegin 5541283 @@ -3464,12 +3464,12 @@ MimeContentBegin 5541419 MimeContentEnd 5542149 Octets 730 Lines 15 -MimeEntityEnd 5542151 -MimeMessageEnd 5542151 -MimeContentEnd 5542151 -Octets 866 +MimeEntityEnd 5542149 +MimeMessageEnd 5542149 +MimeContentEnd 5542149 +Octets 864 Lines 19 -MimeEntityEnd 5542151 +MimeEntityEnd 5542149 MultipartBoundaryBegin 5542151 MultipartBoundaryEnd 5542183 MimeEntityBegin 5542183 @@ -3483,12 +3483,12 @@ MimeContentBegin 5542335 MimeContentEnd 5543318 Octets 983 Lines 27 -MimeEntityEnd 5543320 -MimeMessageEnd 5543320 -MimeContentEnd 5543320 -Octets 1135 +MimeEntityEnd 5543318 +MimeMessageEnd 5543318 +MimeContentEnd 5543318 +Octets 1133 Lines 31 -MimeEntityEnd 5543320 +MimeEntityEnd 5543318 MultipartBoundaryBegin 5543320 MultipartBoundaryEnd 5543352 MimeEntityBegin 5543352 @@ -3502,12 +3502,12 @@ MimeContentBegin 5543492 MimeContentEnd 5543746 Octets 254 Lines 8 -MimeEntityEnd 5543748 -MimeMessageEnd 5543748 -MimeContentEnd 5543748 -Octets 394 +MimeEntityEnd 5543746 +MimeMessageEnd 5543746 +MimeContentEnd 5543746 +Octets 392 Lines 12 -MimeEntityEnd 5543748 +MimeEntityEnd 5543746 MultipartBoundaryBegin 5543748 MultipartBoundaryEnd 5543780 MimeEntityBegin 5543780 @@ -3521,12 +3521,12 @@ MimeContentBegin 5543908 MimeContentEnd 5544041 Octets 133 Lines 7 -MimeEntityEnd 5544043 -MimeMessageEnd 5544043 -MimeContentEnd 5544043 -Octets 261 +MimeEntityEnd 5544041 +MimeMessageEnd 5544041 +MimeContentEnd 5544041 +Octets 259 Lines 11 -MimeEntityEnd 5544043 +MimeEntityEnd 5544041 MultipartBoundaryBegin 5544043 MultipartBoundaryEnd 5544075 MimeEntityBegin 5544075 @@ -3540,12 +3540,12 @@ MimeContentBegin 5544257 MimeContentEnd 5545018 Octets 761 Lines 17 -MimeEntityEnd 5545020 -MimeMessageEnd 5545020 -MimeContentEnd 5545020 -Octets 943 +MimeEntityEnd 5545018 +MimeMessageEnd 5545018 +MimeContentEnd 5545018 +Octets 941 Lines 22 -MimeEntityEnd 5545020 +MimeEntityEnd 5545018 MultipartBoundaryBegin 5545020 MultipartBoundaryEnd 5545052 MimeEntityBegin 5545052 @@ -3559,12 +3559,12 @@ MimeContentBegin 5545218 MimeContentEnd 5545633 Octets 415 Lines 17 -MimeEntityEnd 5545635 -MimeMessageEnd 5545635 -MimeContentEnd 5545635 -Octets 581 +MimeEntityEnd 5545633 +MimeMessageEnd 5545633 +MimeContentEnd 5545633 +Octets 579 Lines 21 -MimeEntityEnd 5545635 +MimeEntityEnd 5545633 MultipartBoundaryBegin 5545635 MultipartBoundaryEnd 5545667 MimeEntityBegin 5545667 @@ -3578,12 +3578,12 @@ MimeContentBegin 5545805 MimeContentEnd 5547113 Octets 1308 Lines 22 -MimeEntityEnd 5547115 -MimeMessageEnd 5547115 -MimeContentEnd 5547115 -Octets 1446 +MimeEntityEnd 5547113 +MimeMessageEnd 5547113 +MimeContentEnd 5547113 +Octets 1444 Lines 26 -MimeEntityEnd 5547115 +MimeEntityEnd 5547113 MultipartBoundaryBegin 5547115 MultipartBoundaryEnd 5547147 MimeEntityBegin 5547147 @@ -3597,12 +3597,12 @@ MimeContentBegin 5547259 MimeContentEnd 5547408 Octets 149 Lines 7 -MimeEntityEnd 5547410 -MimeMessageEnd 5547410 -MimeContentEnd 5547410 -Octets 261 +MimeEntityEnd 5547408 +MimeMessageEnd 5547408 +MimeContentEnd 5547408 +Octets 259 Lines 11 -MimeEntityEnd 5547410 +MimeEntityEnd 5547408 MultipartBoundaryBegin 5547410 MultipartBoundaryEnd 5547442 MimeEntityBegin 5547442 @@ -3616,12 +3616,12 @@ MimeContentBegin 5547585 MimeContentEnd 5547895 Octets 310 Lines 12 -MimeEntityEnd 5547897 -MimeMessageEnd 5547897 -MimeContentEnd 5547897 -Octets 453 +MimeEntityEnd 5547895 +MimeMessageEnd 5547895 +MimeContentEnd 5547895 +Octets 451 Lines 16 -MimeEntityEnd 5547897 +MimeEntityEnd 5547895 MultipartBoundaryBegin 5547897 MultipartBoundaryEnd 5547929 MimeEntityBegin 5547929 @@ -3635,12 +3635,12 @@ MimeContentBegin 5548061 MimeContentEnd 5548254 Octets 193 Lines 7 -MimeEntityEnd 5548256 -MimeMessageEnd 5548256 -MimeContentEnd 5548256 -Octets 325 +MimeEntityEnd 5548254 +MimeMessageEnd 5548254 +MimeContentEnd 5548254 +Octets 323 Lines 11 -MimeEntityEnd 5548256 +MimeEntityEnd 5548254 MultipartBoundaryBegin 5548256 MultipartBoundaryEnd 5548288 MimeEntityBegin 5548288 @@ -3654,12 +3654,12 @@ MimeContentBegin 5548399 MimeContentEnd 5548809 Octets 410 Lines 13 -MimeEntityEnd 5548811 -MimeMessageEnd 5548811 -MimeContentEnd 5548811 -Octets 521 +MimeEntityEnd 5548809 +MimeMessageEnd 5548809 +MimeContentEnd 5548809 +Octets 519 Lines 17 -MimeEntityEnd 5548811 +MimeEntityEnd 5548809 MultipartBoundaryBegin 5548811 MultipartBoundaryEnd 5548843 MimeEntityBegin 5548843 @@ -3673,12 +3673,12 @@ MimeContentBegin 5548983 MimeContentEnd 5549293 Octets 310 Lines 9 -MimeEntityEnd 5549295 -MimeMessageEnd 5549295 -MimeContentEnd 5549295 -Octets 450 +MimeEntityEnd 5549293 +MimeMessageEnd 5549293 +MimeContentEnd 5549293 +Octets 448 Lines 13 -MimeEntityEnd 5549295 +MimeEntityEnd 5549293 MultipartBoundaryBegin 5549295 MultipartBoundaryEnd 5549327 MimeEntityBegin 5549327 @@ -3692,12 +3692,12 @@ MimeContentBegin 5549476 MimeContentEnd 5550111 Octets 635 Lines 18 -MimeEntityEnd 5550113 -MimeMessageEnd 5550113 -MimeContentEnd 5550113 -Octets 784 +MimeEntityEnd 5550111 +MimeMessageEnd 5550111 +MimeContentEnd 5550111 +Octets 782 Lines 22 -MimeEntityEnd 5550113 +MimeEntityEnd 5550111 MultipartBoundaryBegin 5550113 MultipartBoundaryEnd 5550145 MimeEntityBegin 5550145 @@ -3711,12 +3711,12 @@ MimeContentBegin 5550304 MimeContentEnd 5550789 Octets 485 Lines 11 -MimeEntityEnd 5550791 -MimeMessageEnd 5550791 -MimeContentEnd 5550791 -Octets 644 +MimeEntityEnd 5550789 +MimeMessageEnd 5550789 +MimeContentEnd 5550789 +Octets 642 Lines 15 -MimeEntityEnd 5550791 +MimeEntityEnd 5550789 MultipartBoundaryBegin 5550791 MultipartBoundaryEnd 5550823 MimeEntityBegin 5550823 @@ -3730,12 +3730,12 @@ MimeContentBegin 5550962 MimeContentEnd 5552161 Octets 1199 Lines 28 -MimeEntityEnd 5552163 -MimeMessageEnd 5552163 -MimeContentEnd 5552163 -Octets 1338 +MimeEntityEnd 5552161 +MimeMessageEnd 5552161 +MimeContentEnd 5552161 +Octets 1336 Lines 32 -MimeEntityEnd 5552163 +MimeEntityEnd 5552161 MultipartBoundaryBegin 5552163 MultipartBoundaryEnd 5552195 MimeEntityBegin 5552195 @@ -3749,12 +3749,12 @@ MimeContentBegin 5552377 MimeContentEnd 5552644 Octets 267 Lines 9 -MimeEntityEnd 5552646 -MimeMessageEnd 5552646 -MimeContentEnd 5552646 -Octets 449 +MimeEntityEnd 5552644 +MimeMessageEnd 5552644 +MimeContentEnd 5552644 +Octets 447 Lines 13 -MimeEntityEnd 5552646 +MimeEntityEnd 5552644 MultipartBoundaryBegin 5552646 MultipartBoundaryEnd 5552678 MimeEntityBegin 5552678 @@ -3768,12 +3768,12 @@ MimeContentBegin 5552799 MimeContentEnd 5552996 Octets 197 Lines 5 -MimeEntityEnd 5552998 -MimeMessageEnd 5552998 -MimeContentEnd 5552998 -Octets 318 +MimeEntityEnd 5552996 +MimeMessageEnd 5552996 +MimeContentEnd 5552996 +Octets 316 Lines 9 -MimeEntityEnd 5552998 +MimeEntityEnd 5552996 MultipartBoundaryBegin 5552998 MultipartBoundaryEnd 5553030 MimeEntityBegin 5553030 @@ -3787,12 +3787,12 @@ MimeContentBegin 5553176 MimeContentEnd 5554065 Octets 889 Lines 25 -MimeEntityEnd 5554067 -MimeMessageEnd 5554067 -MimeContentEnd 5554067 -Octets 1035 +MimeEntityEnd 5554065 +MimeMessageEnd 5554065 +MimeContentEnd 5554065 +Octets 1033 Lines 29 -MimeEntityEnd 5554067 +MimeEntityEnd 5554065 MultipartBoundaryBegin 5554067 MultipartBoundaryEnd 5554099 MimeEntityBegin 5554099 @@ -3806,12 +3806,12 @@ MimeContentBegin 5554230 MimeContentEnd 5554955 Octets 725 Lines 12 -MimeEntityEnd 5554957 -MimeMessageEnd 5554957 -MimeContentEnd 5554957 -Octets 856 +MimeEntityEnd 5554955 +MimeMessageEnd 5554955 +MimeContentEnd 5554955 +Octets 854 Lines 16 -MimeEntityEnd 5554957 +MimeEntityEnd 5554955 MultipartBoundaryBegin 5554957 MultipartBoundaryEnd 5554989 MimeEntityBegin 5554989 @@ -3825,12 +3825,12 @@ MimeContentBegin 5555107 MimeContentEnd 5555827 Octets 720 Lines 18 -MimeEntityEnd 5555829 -MimeMessageEnd 5555829 -MimeContentEnd 5555829 -Octets 838 +MimeEntityEnd 5555827 +MimeMessageEnd 5555827 +MimeContentEnd 5555827 +Octets 836 Lines 22 -MimeEntityEnd 5555829 +MimeEntityEnd 5555827 MultipartBoundaryBegin 5555829 MultipartBoundaryEnd 5555861 MimeEntityBegin 5555861 @@ -3844,12 +3844,12 @@ MimeContentBegin 5555999 MimeContentEnd 5556390 Octets 391 Lines 12 -MimeEntityEnd 5556392 -MimeMessageEnd 5556392 -MimeContentEnd 5556392 -Octets 529 +MimeEntityEnd 5556390 +MimeMessageEnd 5556390 +MimeContentEnd 5556390 +Octets 527 Lines 16 -MimeEntityEnd 5556392 +MimeEntityEnd 5556390 MultipartBoundaryBegin 5556392 MultipartBoundaryEnd 5556424 MimeEntityBegin 5556424 @@ -3863,12 +3863,12 @@ MimeContentBegin 5556566 MimeContentEnd 5557567 Octets 1001 Lines 25 -MimeEntityEnd 5557569 -MimeMessageEnd 5557569 -MimeContentEnd 5557569 -Octets 1143 +MimeEntityEnd 5557567 +MimeMessageEnd 5557567 +MimeContentEnd 5557567 +Octets 1141 Lines 29 -MimeEntityEnd 5557569 +MimeEntityEnd 5557567 MultipartBoundaryBegin 5557569 MultipartBoundaryEnd 5557601 MimeEntityBegin 5557601 @@ -3882,12 +3882,12 @@ MimeContentBegin 5557752 MimeContentEnd 5558229 Octets 477 Lines 11 -MimeEntityEnd 5558231 -MimeMessageEnd 5558231 -MimeContentEnd 5558231 -Octets 628 +MimeEntityEnd 5558229 +MimeMessageEnd 5558229 +MimeContentEnd 5558229 +Octets 626 Lines 15 -MimeEntityEnd 5558231 +MimeEntityEnd 5558229 MultipartBoundaryBegin 5558231 MultipartBoundaryEnd 5558263 MimeEntityBegin 5558263 @@ -3901,12 +3901,12 @@ MimeContentBegin 5558402 MimeContentEnd 5558691 Octets 289 Lines 11 -MimeEntityEnd 5558693 -MimeMessageEnd 5558693 -MimeContentEnd 5558693 -Octets 428 +MimeEntityEnd 5558691 +MimeMessageEnd 5558691 +MimeContentEnd 5558691 +Octets 426 Lines 15 -MimeEntityEnd 5558693 +MimeEntityEnd 5558691 MultipartBoundaryBegin 5558693 MultipartBoundaryEnd 5558725 MimeEntityBegin 5558725 @@ -3920,12 +3920,12 @@ MimeContentBegin 5558856 MimeContentEnd 5559142 Octets 286 Lines 5 -MimeEntityEnd 5559144 -MimeMessageEnd 5559144 -MimeContentEnd 5559144 -Octets 417 +MimeEntityEnd 5559142 +MimeMessageEnd 5559142 +MimeContentEnd 5559142 +Octets 415 Lines 9 -MimeEntityEnd 5559144 +MimeEntityEnd 5559142 MultipartBoundaryBegin 5559144 MultipartBoundaryEnd 5559176 MimeEntityBegin 5559176 @@ -3939,12 +3939,12 @@ MimeContentBegin 5559303 MimeContentEnd 5559973 Octets 670 Lines 28 -MimeEntityEnd 5559975 -MimeMessageEnd 5559975 -MimeContentEnd 5559975 -Octets 797 +MimeEntityEnd 5559973 +MimeMessageEnd 5559973 +MimeContentEnd 5559973 +Octets 795 Lines 32 -MimeEntityEnd 5559975 +MimeEntityEnd 5559973 MultipartBoundaryBegin 5559975 MultipartBoundaryEnd 5560007 MimeEntityBegin 5560007 @@ -3958,12 +3958,12 @@ MimeContentBegin 5560157 MimeContentEnd 5562461 Octets 2304 Lines 47 -MimeEntityEnd 5562463 -MimeMessageEnd 5562463 -MimeContentEnd 5562463 -Octets 2454 +MimeEntityEnd 5562461 +MimeMessageEnd 5562461 +MimeContentEnd 5562461 +Octets 2452 Lines 51 -MimeEntityEnd 5562463 +MimeEntityEnd 5562461 MultipartBoundaryBegin 5562463 MultipartBoundaryEnd 5562495 MimeEntityBegin 5562495 @@ -3977,12 +3977,12 @@ MimeContentBegin 5562623 MimeContentEnd 5563432 Octets 809 Lines 18 -MimeEntityEnd 5563434 -MimeMessageEnd 5563434 -MimeContentEnd 5563434 -Octets 937 +MimeEntityEnd 5563432 +MimeMessageEnd 5563432 +MimeContentEnd 5563432 +Octets 935 Lines 22 -MimeEntityEnd 5563434 +MimeEntityEnd 5563432 MultipartBoundaryBegin 5563434 MultipartBoundaryEnd 5563466 MimeEntityBegin 5563466 @@ -3996,12 +3996,12 @@ MimeContentBegin 5563566 MimeContentEnd 5563802 Octets 236 Lines 11 -MimeEntityEnd 5563804 -MimeMessageEnd 5563804 -MimeContentEnd 5563804 -Octets 336 +MimeEntityEnd 5563802 +MimeMessageEnd 5563802 +MimeContentEnd 5563802 +Octets 334 Lines 15 -MimeEntityEnd 5563804 +MimeEntityEnd 5563802 MultipartBoundaryBegin 5563804 MultipartBoundaryEnd 5563836 MimeEntityBegin 5563836 @@ -4015,12 +4015,12 @@ MimeContentBegin 5563963 MimeContentEnd 5564651 Octets 688 Lines 21 -MimeEntityEnd 5564653 -MimeMessageEnd 5564653 -MimeContentEnd 5564653 -Octets 815 +MimeEntityEnd 5564651 +MimeMessageEnd 5564651 +MimeContentEnd 5564651 +Octets 813 Lines 25 -MimeEntityEnd 5564653 +MimeEntityEnd 5564651 MultipartBoundaryBegin 5564653 MultipartBoundaryEnd 5564685 MimeEntityBegin 5564685 @@ -4034,12 +4034,12 @@ MimeContentBegin 5564801 MimeContentEnd 5567416 Octets 2615 Lines 69 -MimeEntityEnd 5567418 -MimeMessageEnd 5567418 -MimeContentEnd 5567418 -Octets 2731 +MimeEntityEnd 5567416 +MimeMessageEnd 5567416 +MimeContentEnd 5567416 +Octets 2729 Lines 73 -MimeEntityEnd 5567418 +MimeEntityEnd 5567416 MultipartBoundaryBegin 5567418 MultipartBoundaryEnd 5567450 MimeEntityBegin 5567450 @@ -4053,12 +4053,12 @@ MimeContentBegin 5567562 MimeContentEnd 5568805 Octets 1243 Lines 35 -MimeEntityEnd 5568807 -MimeMessageEnd 5568807 -MimeContentEnd 5568807 -Octets 1355 +MimeEntityEnd 5568805 +MimeMessageEnd 5568805 +MimeContentEnd 5568805 +Octets 1353 Lines 39 -MimeEntityEnd 5568807 +MimeEntityEnd 5568805 MultipartBoundaryBegin 5568807 MultipartBoundaryEnd 5568839 MimeEntityBegin 5568839 @@ -4072,12 +4072,12 @@ MimeContentBegin 5568951 MimeContentEnd 5570791 Octets 1840 Lines 44 -MimeEntityEnd 5570793 -MimeMessageEnd 5570793 -MimeContentEnd 5570793 -Octets 1952 +MimeEntityEnd 5570791 +MimeMessageEnd 5570791 +MimeContentEnd 5570791 +Octets 1950 Lines 48 -MimeEntityEnd 5570793 +MimeEntityEnd 5570791 MultipartBoundaryBegin 5570793 MultipartBoundaryEnd 5570825 MimeEntityBegin 5570825 @@ -4091,12 +4091,12 @@ MimeContentBegin 5570960 MimeContentEnd 5571542 Octets 582 Lines 13 -MimeEntityEnd 5571544 -MimeMessageEnd 5571544 -MimeContentEnd 5571544 -Octets 717 +MimeEntityEnd 5571542 +MimeMessageEnd 5571542 +MimeContentEnd 5571542 +Octets 715 Lines 17 -MimeEntityEnd 5571544 +MimeEntityEnd 5571542 MultipartBoundaryBegin 5571544 MultipartBoundaryEnd 5571576 MimeEntityBegin 5571576 @@ -4110,12 +4110,12 @@ MimeContentBegin 5571670 MimeContentEnd 5573024 Octets 1354 Lines 21 -MimeEntityEnd 5573026 -MimeMessageEnd 5573026 -MimeContentEnd 5573026 -Octets 1448 +MimeEntityEnd 5573024 +MimeMessageEnd 5573024 +MimeContentEnd 5573024 +Octets 1446 Lines 25 -MimeEntityEnd 5573026 +MimeEntityEnd 5573024 MultipartBoundaryBegin 5573026 MultipartBoundaryEnd 5573058 MimeEntityBegin 5573058 @@ -4129,12 +4129,12 @@ MimeContentBegin 5573180 MimeContentEnd 5575356 Octets 2176 Lines 50 -MimeEntityEnd 5575358 -MimeMessageEnd 5575358 -MimeContentEnd 5575358 -Octets 2298 +MimeEntityEnd 5575356 +MimeMessageEnd 5575356 +MimeContentEnd 5575356 +Octets 2296 Lines 54 -MimeEntityEnd 5575358 +MimeEntityEnd 5575356 MultipartBoundaryBegin 5575358 MultipartBoundaryEnd 5575390 MimeEntityBegin 5575390 @@ -4148,12 +4148,12 @@ MimeContentBegin 5575517 MimeContentEnd 5577580 Octets 2063 Lines 43 -MimeEntityEnd 5577582 -MimeMessageEnd 5577582 -MimeContentEnd 5577582 -Octets 2190 +MimeEntityEnd 5577580 +MimeMessageEnd 5577580 +MimeContentEnd 5577580 +Octets 2188 Lines 47 -MimeEntityEnd 5577582 +MimeEntityEnd 5577580 MultipartBoundaryBegin 5577582 MultipartBoundaryEnd 5577614 MimeEntityBegin 5577614 @@ -4167,12 +4167,12 @@ MimeContentBegin 5577741 MimeContentEnd 5578437 Octets 696 Lines 20 -MimeEntityEnd 5578439 -MimeMessageEnd 5578439 -MimeContentEnd 5578439 -Octets 823 +MimeEntityEnd 5578437 +MimeMessageEnd 5578437 +MimeContentEnd 5578437 +Octets 821 Lines 24 -MimeEntityEnd 5578439 +MimeEntityEnd 5578437 MultipartBoundaryBegin 5578439 MultipartBoundaryEnd 5578471 MimeEntityBegin 5578471 @@ -4186,12 +4186,12 @@ MimeContentBegin 5578614 MimeContentEnd 5579450 Octets 836 Lines 17 -MimeEntityEnd 5579452 -MimeMessageEnd 5579452 -MimeContentEnd 5579452 -Octets 979 +MimeEntityEnd 5579450 +MimeMessageEnd 5579450 +MimeContentEnd 5579450 +Octets 977 Lines 21 -MimeEntityEnd 5579452 +MimeEntityEnd 5579450 MultipartBoundaryBegin 5579452 MultipartBoundaryEnd 5579484 MimeEntityBegin 5579484 @@ -4205,12 +4205,12 @@ MimeContentBegin 5579614 MimeContentEnd 5580359 Octets 745 Lines 22 -MimeEntityEnd 5580361 -MimeMessageEnd 5580361 -MimeContentEnd 5580361 -Octets 875 +MimeEntityEnd 5580359 +MimeMessageEnd 5580359 +MimeContentEnd 5580359 +Octets 873 Lines 26 -MimeEntityEnd 5580361 +MimeEntityEnd 5580359 MultipartBoundaryBegin 5580361 MultipartBoundaryEnd 5580393 MimeEntityBegin 5580393 @@ -4224,12 +4224,12 @@ MimeContentBegin 5580501 MimeContentEnd 5581257 Octets 756 Lines 17 -MimeEntityEnd 5581259 -MimeMessageEnd 5581259 -MimeContentEnd 5581259 -Octets 864 +MimeEntityEnd 5581257 +MimeMessageEnd 5581257 +MimeContentEnd 5581257 +Octets 862 Lines 21 -MimeEntityEnd 5581259 +MimeEntityEnd 5581257 MultipartBoundaryBegin 5581259 MultipartBoundaryEnd 5581291 MimeEntityBegin 5581291 @@ -4243,12 +4243,12 @@ MimeContentBegin 5581454 MimeContentEnd 5581820 Octets 366 Lines 8 -MimeEntityEnd 5581822 -MimeMessageEnd 5581822 -MimeContentEnd 5581822 -Octets 529 +MimeEntityEnd 5581820 +MimeMessageEnd 5581820 +MimeContentEnd 5581820 +Octets 527 Lines 13 -MimeEntityEnd 5581822 +MimeEntityEnd 5581820 MultipartBoundaryBegin 5581822 MultipartBoundaryEnd 5581854 MimeEntityBegin 5581854 @@ -4262,12 +4262,12 @@ MimeContentBegin 5581947 MimeContentEnd 5582597 Octets 650 Lines 16 -MimeEntityEnd 5582599 -MimeMessageEnd 5582599 -MimeContentEnd 5582599 -Octets 743 +MimeEntityEnd 5582597 +MimeMessageEnd 5582597 +MimeContentEnd 5582597 +Octets 741 Lines 20 -MimeEntityEnd 5582599 +MimeEntityEnd 5582597 MultipartBoundaryBegin 5582599 MultipartBoundaryEnd 5582631 MimeEntityBegin 5582631 @@ -4281,12 +4281,12 @@ MimeContentBegin 5582786 MimeContentEnd 5583169 Octets 383 Lines 18 -MimeEntityEnd 5583171 -MimeMessageEnd 5583171 -MimeContentEnd 5583171 -Octets 538 +MimeEntityEnd 5583169 +MimeMessageEnd 5583169 +MimeContentEnd 5583169 +Octets 536 Lines 22 -MimeEntityEnd 5583171 +MimeEntityEnd 5583169 MultipartBoundaryBegin 5583171 MultipartBoundaryEnd 5583203 MimeEntityBegin 5583203 @@ -4300,12 +4300,12 @@ MimeContentBegin 5583310 MimeContentEnd 5583604 Octets 294 Lines 7 -MimeEntityEnd 5583606 -MimeMessageEnd 5583606 -MimeContentEnd 5583606 -Octets 401 +MimeEntityEnd 5583604 +MimeMessageEnd 5583604 +MimeContentEnd 5583604 +Octets 399 Lines 11 -MimeEntityEnd 5583606 +MimeEntityEnd 5583604 MultipartBoundaryBegin 5583606 MultipartBoundaryEnd 5583638 MimeEntityBegin 5583638 @@ -4319,12 +4319,12 @@ MimeContentBegin 5583772 MimeContentEnd 5584267 Octets 495 Lines 17 -MimeEntityEnd 5584269 -MimeMessageEnd 5584269 -MimeContentEnd 5584269 -Octets 629 +MimeEntityEnd 5584267 +MimeMessageEnd 5584267 +MimeContentEnd 5584267 +Octets 627 Lines 21 -MimeEntityEnd 5584269 +MimeEntityEnd 5584267 MultipartBoundaryBegin 5584269 MultipartBoundaryEnd 5584301 MimeEntityBegin 5584301 @@ -4338,12 +4338,12 @@ MimeContentBegin 5584404 MimeContentEnd 5584803 Octets 399 Lines 20 -MimeEntityEnd 5584805 -MimeMessageEnd 5584805 -MimeContentEnd 5584805 -Octets 502 +MimeEntityEnd 5584803 +MimeMessageEnd 5584803 +MimeContentEnd 5584803 +Octets 500 Lines 24 -MimeEntityEnd 5584805 +MimeEntityEnd 5584803 MultipartBoundaryBegin 5584805 MultipartBoundaryEnd 5584837 MimeEntityBegin 5584837 @@ -4357,12 +4357,12 @@ MimeContentBegin 5584958 MimeContentEnd 5586303 Octets 1345 Lines 27 -MimeEntityEnd 5586305 -MimeMessageEnd 5586305 -MimeContentEnd 5586305 -Octets 1466 +MimeEntityEnd 5586303 +MimeMessageEnd 5586303 +MimeContentEnd 5586303 +Octets 1464 Lines 31 -MimeEntityEnd 5586305 +MimeEntityEnd 5586303 MultipartBoundaryBegin 5586305 MultipartBoundaryEnd 5586337 MimeEntityBegin 5586337 @@ -4376,12 +4376,12 @@ MimeContentBegin 5586443 MimeContentEnd 5586747 Octets 304 Lines 10 -MimeEntityEnd 5586749 -MimeMessageEnd 5586749 -MimeContentEnd 5586749 -Octets 410 +MimeEntityEnd 5586747 +MimeMessageEnd 5586747 +MimeContentEnd 5586747 +Octets 408 Lines 14 -MimeEntityEnd 5586749 +MimeEntityEnd 5586747 MultipartBoundaryBegin 5586749 MultipartBoundaryEnd 5586781 MimeEntityBegin 5586781 @@ -4395,29 +4395,29 @@ MimeContentBegin 5586930 MimeContentEnd 5587985 Octets 1055 Lines 37 -MimeEntityEnd 5587987 -MimeMessageEnd 5587987 -MimeContentEnd 5587987 -Octets 1204 +MimeEntityEnd 5587985 +MimeMessageEnd 5587985 +MimeContentEnd 5587985 +Octets 1202 Lines 41 -MimeEntityEnd 5587987 +MimeEntityEnd 5587985 MultipartEndBoundaryBegin 5587987 MultipartEndBoundaryEnd 5588019 MultipartEpilogueBegin 5588019 MultipartEpilogueEnd 5588021 -MimeContentEnd 5588023 -Octets 66057 +MimeContentEnd 5588021 +Octets 66055 Lines 1846 -MimeEntityEnd 5588023 +MimeEntityEnd 5588021 MultipartEndBoundaryBegin 5588023 MultipartEndBoundaryEnd 5588042 MultipartEpilogueBegin 5588042 MultipartEpilogueEnd 5588100 -MimeContentEnd 5588102 -Octets 70740 +MimeContentEnd 5588100 +Octets 70738 Lines 1958 -MimeEntityEnd 5588102 -MimeMessageEnd 5588102 +MimeEntityEnd 5588100 +MimeMessageEnd 5588100 MboxMarkerBegin 5588102 MboxMarkerEnd 5588109 MimeMessageBegin 5588111 @@ -4428,8 +4428,8 @@ MimeContentBegin 5588934 MimeContentEnd 5590853 Octets 1919 Lines 49 -MimeEntityEnd 5590855 -MimeMessageEnd 5590855 +MimeEntityEnd 5590853 +MimeMessageEnd 5590853 MboxMarkerBegin 5590855 MboxMarkerEnd 5590862 MimeMessageBegin 5590864 @@ -4447,7 +4447,7 @@ MimeContentBegin 5591637 MimeContentEnd 5591750 Octets 113 Lines 2 -MimeEntityEnd 5591752 +MimeEntityEnd 5591750 MultipartBoundaryBegin 5591752 MultipartBoundaryEnd 5591780 MimeEntityBegin 5591780 @@ -4456,7 +4456,7 @@ MimeContentBegin 5591872 MimeContentEnd 5724575 Octets 132703 Lines 2012 -MimeEntityEnd 5724577 +MimeEntityEnd 5724575 MultipartBoundaryBegin 5724577 MultipartBoundaryEnd 5724605 MimeEntityBegin 5724605 @@ -4465,7 +4465,7 @@ MimeContentBegin 5724607 MimeContentEnd 5724663 Octets 56 Lines 2 -MimeEntityEnd 5724665 +MimeEntityEnd 5724663 MultipartBoundaryBegin 5724665 MultipartBoundaryEnd 5724693 MimeEntityBegin 5724693 @@ -4474,7 +4474,7 @@ MimeContentBegin 5724843 MimeContentEnd 5739817 Octets 14974 Lines 78 -MimeEntityEnd 5739819 +MimeEntityEnd 5739817 MultipartBoundaryBegin 5739819 MultipartBoundaryEnd 5739847 MimeEntityBegin 5739847 @@ -4483,7 +4483,7 @@ MimeContentBegin 5739849 MimeContentEnd 5739944 Octets 95 Lines 6 -MimeEntityEnd 5739946 +MimeEntityEnd 5739944 MultipartBoundaryBegin 5739946 MultipartBoundaryEnd 5739974 MimeEntityBegin 5739974 @@ -4492,7 +4492,7 @@ MimeContentBegin 5740124 MimeContentEnd 5748266 Octets 8142 Lines 42 -MimeEntityEnd 5748268 +MimeEntityEnd 5748266 MultipartBoundaryBegin 5748268 MultipartBoundaryEnd 5748296 MimeEntityBegin 5748296 @@ -4501,16 +4501,16 @@ MimeContentBegin 5748298 MimeContentEnd 5748375 Octets 77 Lines 4 -MimeEntityEnd 5748377 +MimeEntityEnd 5748375 MultipartEndBoundaryBegin 5748377 MultipartEndBoundaryEnd 5748405 MultipartEpilogueBegin 5748405 MultipartEpilogueEnd 5748407 -MimeContentEnd 5748409 -Octets 156802 +MimeContentEnd 5748407 +Octets 156800 Lines 2172 -MimeEntityEnd 5748409 -MimeMessageEnd 5748409 +MimeEntityEnd 5748407 +MimeMessageEnd 5748407 MboxMarkerBegin 5748409 MboxMarkerEnd 5748416 MimeMessageBegin 5748418 @@ -4521,8 +4521,8 @@ MimeContentBegin 5748956 MimeContentEnd 5749545 Octets 589 Lines 22 -MimeEntityEnd 5749547 -MimeMessageEnd 5749547 +MimeEntityEnd 5749545 +MimeMessageEnd 5749545 MboxMarkerBegin 5749547 MboxMarkerEnd 5749554 MimeMessageBegin 5749556 @@ -4540,7 +4540,7 @@ MimeContentBegin 5751010 MimeContentEnd 5751766 Octets 756 Lines 27 -MimeEntityEnd 5751768 +MimeEntityEnd 5751766 MultipartBoundaryBegin 5751768 MultipartBoundaryEnd 5751809 MimeEntityBegin 5751809 @@ -4556,7 +4556,7 @@ MimeContentBegin 5752034 MimeContentEnd 5752861 Octets 827 Lines 26 -MimeEntityEnd 5752863 +MimeEntityEnd 5752861 MultipartBoundaryBegin 5752863 MultipartBoundaryEnd 5752906 MimeEntityBegin 5752906 @@ -4565,7 +4565,7 @@ MimeContentBegin 5753003 MimeContentEnd 5811629 Octets 58626 Lines 756 -MimeEntityEnd 5811631 +MimeEntityEnd 5811629 MultipartBoundaryBegin 5811631 MultipartBoundaryEnd 5811674 MimeEntityBegin 5811674 @@ -4574,24 +4574,24 @@ MimeContentBegin 5811768 MimeContentEnd 5811774 Octets 6 Lines 2 -MimeEntityEnd 5811776 +MimeEntityEnd 5811774 MultipartEndBoundaryBegin 5811776 MultipartEndBoundaryEnd 5811819 MultipartEpilogueBegin 5811819 MultipartEpilogueEnd 5811821 -MimeContentEnd 5811823 -Octets 59926 +MimeContentEnd 5811821 +Octets 59924 Lines 799 -MimeEntityEnd 5811823 +MimeEntityEnd 5811821 MultipartEndBoundaryBegin 5811823 MultipartEndBoundaryEnd 5811864 MultipartEpilogueBegin 5811864 MultipartEpilogueEnd 5811866 -MimeContentEnd 5811868 -Octets 61103 +MimeContentEnd 5811866 +Octets 61101 Lines 838 -MimeEntityEnd 5811868 -MimeMessageEnd 5811868 +MimeEntityEnd 5811866 +MimeMessageEnd 5811866 MboxMarkerBegin 5811868 MboxMarkerEnd 5811875 MimeMessageBegin 5811877 @@ -4609,7 +4609,7 @@ MimeContentBegin 5812779 MimeContentEnd 5812960 Octets 181 Lines 8 -MimeEntityEnd 5812962 +MimeEntityEnd 5812960 MultipartBoundaryBegin 5812962 MultipartBoundaryEnd 5813012 MimeEntityBegin 5813012 @@ -4618,16 +4618,16 @@ MimeContentBegin 5813074 MimeContentEnd 5869078 Octets 56004 Lines 757 -MimeEntityEnd 5869080 +MimeEntityEnd 5869078 MultipartEndBoundaryBegin 5869080 MultipartEndBoundaryEnd 5869130 MultipartEpilogueBegin 5869130 MultipartEpilogueEnd 5869132 -MimeContentEnd 5869134 -Octets 56500 +MimeContentEnd 5869132 +Octets 56498 Lines 776 -MimeEntityEnd 5869134 -MimeMessageEnd 5869134 +MimeEntityEnd 5869132 +MimeMessageEnd 5869132 MboxMarkerBegin 5869134 MboxMarkerEnd 5869165 MimeMessageBegin 5869167 @@ -4638,8 +4638,8 @@ MimeContentBegin 5870664 MimeContentEnd 5872038 Octets 1374 Lines 35 -MimeEntityEnd 5872040 -MimeMessageEnd 5872040 +MimeEntityEnd 5872038 +MimeMessageEnd 5872038 MboxMarkerBegin 5872040 MboxMarkerEnd 5872047 MimeMessageBegin 5872049 @@ -4657,7 +4657,7 @@ MimeContentBegin 5873010 MimeContentEnd 5873393 Octets 383 Lines 14 -MimeEntityEnd 5873395 +MimeEntityEnd 5873393 MultipartBoundaryBegin 5873395 MultipartBoundaryEnd 5873421 MimeEntityBegin 5873421 @@ -4671,21 +4671,21 @@ MimeContentBegin 5874597 MimeContentEnd 5899455 Octets 24858 Lines 464 -MimeEntityEnd 5899457 -MimeMessageEnd 5899457 -MimeContentEnd 5899457 -Octets 25942 +MimeEntityEnd 5899455 +MimeMessageEnd 5899455 +MimeContentEnd 5899455 +Octets 25940 Lines 478 -MimeEntityEnd 5899457 +MimeEntityEnd 5899455 MultipartEndBoundaryBegin 5899457 MultipartEndBoundaryEnd 5899483 MultipartEpilogueBegin 5899483 MultipartEpilogueEnd 5899485 -MimeContentEnd 5899487 -Octets 26630 +MimeContentEnd 5899485 +Octets 26628 Lines 505 -MimeEntityEnd 5899487 -MimeMessageEnd 5899487 +MimeEntityEnd 5899485 +MimeMessageEnd 5899485 MboxMarkerBegin 5899487 MboxMarkerEnd 5899494 MimeMessageBegin 5899496 @@ -4703,7 +4703,7 @@ MimeContentBegin 5900356 MimeContentEnd 5900391 Octets 35 Lines 2 -MimeEntityEnd 5900393 +MimeEntityEnd 5900391 MultipartBoundaryBegin 5900393 MultipartBoundaryEnd 5900442 MimeEntityBegin 5900442 @@ -4712,16 +4712,16 @@ MimeContentBegin 5900504 MimeContentEnd 5922958 Octets 22454 Lines 304 -MimeEntityEnd 5922960 +MimeEntityEnd 5922958 MultipartEndBoundaryBegin 5922960 MultipartEndBoundaryEnd 5923009 MultipartEpilogueBegin 5923009 MultipartEpilogueEnd 5923009 -MimeContentEnd 5923011 -Octets 22833 +MimeContentEnd 5923009 +Octets 22831 Lines 317 -MimeEntityEnd 5923011 -MimeMessageEnd 5923011 +MimeEntityEnd 5923009 +MimeMessageEnd 5923009 MboxMarkerBegin 5923011 MboxMarkerEnd 5923042 MimeMessageBegin 5923044 @@ -4739,7 +4739,7 @@ MimeContentBegin 5923636 MimeContentEnd 5924829 Octets 1193 Lines 22 -MimeEntityEnd 5924831 +MimeEntityEnd 5924829 MultipartBoundaryBegin 5924831 MultipartBoundaryEnd 5924840 MimeEntityBegin 5924840 @@ -4748,7 +4748,7 @@ MimeContentBegin 5924970 MimeContentEnd 5925118 Octets 148 Lines 3 -MimeEntityEnd 5925120 +MimeEntityEnd 5925118 MultipartBoundaryBegin 5925120 MultipartBoundaryEnd 5925129 MimeEntityBegin 5925129 @@ -4757,16 +4757,16 @@ MimeContentBegin 5925249 MimeContentEnd 5925445 Octets 196 Lines 3 -MimeEntityEnd 5925447 +MimeEntityEnd 5925445 MultipartEndBoundaryBegin 5925447 MultipartEndBoundaryEnd 5925456 MultipartEpilogueBegin 5925456 MultipartEpilogueEnd 5925456 -MimeContentEnd 5925458 -Octets 1877 +MimeContentEnd 5925456 +Octets 1875 Lines 42 -MimeEntityEnd 5925458 -MimeMessageEnd 5925458 +MimeEntityEnd 5925456 +MimeMessageEnd 5925456 MboxMarkerBegin 5925458 MboxMarkerEnd 5925465 MimeMessageBegin 5925467 @@ -4777,8 +4777,8 @@ MimeContentBegin 5926279 MimeContentEnd 6186575 Octets 260296 Lines 3519 -MimeEntityEnd 6186577 -MimeMessageEnd 6186577 +MimeEntityEnd 6186575 +MimeMessageEnd 6186575 MboxMarkerBegin 6186577 MboxMarkerEnd 6186584 MimeMessageBegin 6186586 @@ -4796,7 +4796,7 @@ MimeContentBegin 6187554 MimeContentEnd 6187752 Octets 198 Lines 9 -MimeEntityEnd 6187754 +MimeEntityEnd 6187752 MultipartBoundaryBegin 6187754 MultipartBoundaryEnd 6187769 MimeEntityBegin 6187769 @@ -4805,16 +4805,16 @@ MimeContentBegin 6187877 MimeContentEnd 6287399 Octets 99522 Lines 1276 -MimeEntityEnd 6287401 +MimeEntityEnd 6287399 MultipartEndBoundaryBegin 6287401 MultipartEndBoundaryEnd 6287416 MultipartEpilogueBegin 6287416 MultipartEpilogueEnd 6287418 -MimeContentEnd 6287420 -Octets 99963 +MimeContentEnd 6287418 +Octets 99961 Lines 1297 -MimeEntityEnd 6287420 -MimeMessageEnd 6287420 +MimeEntityEnd 6287418 +MimeMessageEnd 6287418 MboxMarkerBegin 6287420 MboxMarkerEnd 6287427 MimeMessageBegin 6287429 @@ -4832,7 +4832,7 @@ MimeContentBegin 6288383 MimeContentEnd 6289347 Octets 964 Lines 22 -MimeEntityEnd 6289349 +MimeEntityEnd 6289347 MultipartBoundaryBegin 6289349 MultipartBoundaryEnd 6289359 MimeEntityBegin 6289359 @@ -4862,7 +4862,7 @@ MimeContentBegin 6290096 MimeContentEnd 6290470 Octets 374 Lines 9 -MimeEntityEnd 6290472 +MimeEntityEnd 6290470 MultipartBoundaryBegin 6290472 MultipartBoundaryEnd 6290495 MimeEntityBegin 6290495 @@ -4871,7 +4871,7 @@ MimeContentBegin 6290621 MimeContentEnd 6291023 Octets 402 Lines 11 -MimeEntityEnd 6291025 +MimeEntityEnd 6291023 MultipartBoundaryBegin 6291025 MultipartBoundaryEnd 6291048 MimeEntityBegin 6291048 @@ -4880,15 +4880,15 @@ MimeContentBegin 6291177 MimeContentEnd 6291903 Octets 726 Lines 19 -MimeEntityEnd 6291905 +MimeEntityEnd 6291903 MultipartEndBoundaryBegin 6291905 MultipartEndBoundaryEnd 6291928 MultipartEpilogueBegin 6291928 MultipartEpilogueEnd 6291930 -MimeContentEnd 6291932 -Octets 1986 +MimeContentEnd 6291930 +Octets 1984 Lines 56 -MimeEntityEnd 6291932 +MimeEntityEnd 6291930 MultipartBoundaryBegin 6291932 MultipartBoundaryEnd 6291955 MimeEntityBegin 6291955 @@ -4904,7 +4904,7 @@ MimeContentBegin 6292216 MimeContentEnd 6309101 Octets 16885 Lines 471 -MimeEntityEnd 6309103 +MimeEntityEnd 6309101 MultipartBoundaryBegin 6309103 MultipartBoundaryEnd 6309126 MimeEntityBegin 6309126 @@ -4913,7 +4913,7 @@ MimeContentBegin 6309261 MimeContentEnd 6323910 Octets 14649 Lines 396 -MimeEntityEnd 6323912 +MimeEntityEnd 6323910 MultipartBoundaryBegin 6323912 MultipartBoundaryEnd 6323935 MimeEntityBegin 6323935 @@ -4929,7 +4929,7 @@ MimeContentBegin 6324208 MimeContentEnd 6330524 Octets 6316 Lines 165 -MimeEntityEnd 6330526 +MimeEntityEnd 6330524 MultipartBoundaryBegin 6330526 MultipartBoundaryEnd 6330549 MimeEntityBegin 6330549 @@ -4938,7 +4938,7 @@ MimeContentBegin 6330680 MimeContentEnd 6336095 Octets 5415 Lines 161 -MimeEntityEnd 6336097 +MimeEntityEnd 6336095 MultipartBoundaryBegin 6336097 MultipartBoundaryEnd 6336120 MimeEntityBegin 6336120 @@ -4947,7 +4947,7 @@ MimeContentBegin 6336261 MimeContentEnd 6343756 Octets 7495 Lines 198 -MimeEntityEnd 6343758 +MimeEntityEnd 6343756 MultipartBoundaryBegin 6343758 MultipartBoundaryEnd 6343781 MimeEntityBegin 6343781 @@ -4956,7 +4956,7 @@ MimeContentBegin 6343909 MimeContentEnd 6350569 Octets 6660 Lines 185 -MimeEntityEnd 6350571 +MimeEntityEnd 6350569 MultipartBoundaryBegin 6350571 MultipartBoundaryEnd 6350594 MimeEntityBegin 6350594 @@ -4965,15 +4965,15 @@ MimeContentBegin 6350735 MimeContentEnd 6368395 Octets 17660 Lines 493 -MimeEntityEnd 6368397 +MimeEntityEnd 6368395 MultipartEndBoundaryBegin 6368397 MultipartEndBoundaryEnd 6368420 MultipartEpilogueBegin 6368420 MultipartEpilogueEnd 6368422 -MimeContentEnd 6368424 -Octets 44385 +MimeContentEnd 6368422 +Octets 44383 Lines 1229 -MimeEntityEnd 6368424 +MimeEntityEnd 6368422 MultipartBoundaryBegin 6368424 MultipartBoundaryEnd 6368447 MimeEntityBegin 6368447 @@ -4989,23 +4989,23 @@ MimeContentBegin 6368706 MimeContentEnd 6369222 Octets 516 Lines 22 -MimeEntityEnd 6369224 +MimeEntityEnd 6369222 MultipartEndBoundaryBegin 6369224 MultipartEndBoundaryEnd 6369247 MultipartEpilogueBegin 6369247 MultipartEpilogueEnd 6369249 -MimeContentEnd 6369251 -Octets 706 +MimeContentEnd 6369249 +Octets 704 Lines 29 -MimeEntityEnd 6369251 +MimeEntityEnd 6369249 MultipartEndBoundaryBegin 6369251 MultipartEndBoundaryEnd 6369274 MultipartEpilogueBegin 6369274 MultipartEpilogueEnd 6369276 -MimeContentEnd 6369278 -Octets 77221 +MimeContentEnd 6369276 +Octets 77219 Lines 2145 -MimeEntityEnd 6369278 +MimeEntityEnd 6369276 MultipartBoundaryBegin 6369278 MultipartBoundaryEnd 6369301 MimeEntityBegin 6369301 @@ -5021,7 +5021,7 @@ MimeContentBegin 6369580 MimeContentEnd 6370758 Octets 1178 Lines 30 -MimeEntityEnd 6370760 +MimeEntityEnd 6370758 MultipartBoundaryBegin 6370760 MultipartBoundaryEnd 6370783 MimeEntityBegin 6370783 @@ -5030,7 +5030,7 @@ MimeContentBegin 6370913 MimeContentEnd 6372168 Octets 1255 Lines 36 -MimeEntityEnd 6372170 +MimeEntityEnd 6372168 MultipartBoundaryBegin 6372170 MultipartBoundaryEnd 6372193 MimeEntityBegin 6372193 @@ -5039,40 +5039,40 @@ MimeContentBegin 6372337 MimeContentEnd 6373036 Octets 699 Lines 23 -MimeEntityEnd 6373038 +MimeEntityEnd 6373036 MultipartEndBoundaryBegin 6373038 MultipartEndBoundaryEnd 6373061 MultipartEpilogueBegin 6373061 MultipartEpilogueEnd 6373063 -MimeContentEnd 6373065 -Octets 3650 +MimeContentEnd 6373063 +Octets 3648 Lines 106 -MimeEntityEnd 6373065 +MimeEntityEnd 6373063 MultipartEndBoundaryBegin 6373065 MultipartEndBoundaryEnd 6373088 MultipartEpilogueBegin 6373088 MultipartEpilogueEnd 6373090 -MimeContentEnd 6373092 -Octets 83274 +MimeContentEnd 6373090 +Octets 83272 Lines 2321 -MimeEntityEnd 6373092 +MimeEntityEnd 6373090 MultipartEndBoundaryBegin 6373092 MultipartEndBoundaryEnd 6373115 MultipartEpilogueBegin 6373115 MultipartEpilogueEnd 6373117 -MimeContentEnd 6373119 -Octets 83695 +MimeContentEnd 6373117 +Octets 83693 Lines 2333 -MimeEntityEnd 6373119 +MimeEntityEnd 6373117 MultipartEndBoundaryBegin 6373119 MultipartEndBoundaryEnd 6373129 MultipartEpilogueBegin 6373129 MultipartEpilogueEnd 6373131 -MimeContentEnd 6373133 -Octets 84808 +MimeContentEnd 6373131 +Octets 84806 Lines 2363 -MimeEntityEnd 6373133 -MimeMessageEnd 6373133 +MimeEntityEnd 6373131 +MimeMessageEnd 6373131 MboxMarkerBegin 6373133 MboxMarkerEnd 6373140 MimeMessageBegin 6373142 @@ -5083,8 +5083,8 @@ MimeContentBegin 6373961 MimeContentEnd 6383386 Octets 9425 Lines 227 -MimeEntityEnd 6383388 -MimeMessageEnd 6383388 +MimeEntityEnd 6383386 +MimeMessageEnd 6383386 MboxMarkerBegin 6383388 MboxMarkerEnd 6383395 MimeMessageBegin 6383397 @@ -5102,7 +5102,7 @@ MimeContentBegin 6384386 MimeContentEnd 6385165 Octets 779 Lines 24 -MimeEntityEnd 6385167 +MimeEntityEnd 6385165 MultipartBoundaryBegin 6385167 MultipartBoundaryEnd 6385208 MimeEntityBegin 6385208 @@ -5118,7 +5118,7 @@ MimeContentBegin 6385433 MimeContentEnd 6385767 Octets 334 Lines 8 -MimeEntityEnd 6385769 +MimeEntityEnd 6385767 MultipartBoundaryBegin 6385769 MultipartBoundaryEnd 6385812 MimeEntityBegin 6385812 @@ -5127,7 +5127,7 @@ MimeContentBegin 6385910 MimeContentEnd 6408254 Octets 22344 Lines 321 -MimeEntityEnd 6408256 +MimeEntityEnd 6408254 MultipartBoundaryBegin 6408256 MultipartBoundaryEnd 6408299 MimeEntityBegin 6408299 @@ -5136,7 +5136,7 @@ MimeContentBegin 6408393 MimeContentEnd 6408564 Octets 171 Lines 6 -MimeEntityEnd 6408566 +MimeEntityEnd 6408564 MultipartBoundaryBegin 6408566 MultipartBoundaryEnd 6408609 MimeEntityBegin 6408609 @@ -5145,7 +5145,7 @@ MimeContentBegin 6408710 MimeContentEnd 6456608 Octets 47898 Lines 686 -MimeEntityEnd 6456610 +MimeEntityEnd 6456608 MultipartBoundaryBegin 6456610 MultipartBoundaryEnd 6456653 MimeEntityBegin 6456653 @@ -5154,7 +5154,7 @@ MimeContentBegin 6456747 MimeContentEnd 6456819 Octets 72 Lines 3 -MimeEntityEnd 6456821 +MimeEntityEnd 6456819 MultipartBoundaryBegin 6456821 MultipartBoundaryEnd 6456864 MimeEntityBegin 6456864 @@ -5163,7 +5163,7 @@ MimeContentBegin 6456958 MimeContentEnd 6477470 Octets 20512 Lines 295 -MimeEntityEnd 6477472 +MimeEntityEnd 6477470 MultipartBoundaryBegin 6477472 MultipartBoundaryEnd 6477515 MimeEntityBegin 6477515 @@ -5172,24 +5172,24 @@ MimeContentBegin 6477609 MimeContentEnd 6477721 Octets 112 Lines 9 -MimeEntityEnd 6477723 +MimeEntityEnd 6477721 MultipartEndBoundaryBegin 6477723 MultipartEndBoundaryEnd 6477766 MultipartEpilogueBegin 6477766 MultipartEpilogueEnd 6477768 -MimeContentEnd 6477770 -Octets 92474 +MimeContentEnd 6477768 +Octets 92472 Lines 1361 -MimeEntityEnd 6477770 +MimeEntityEnd 6477768 MultipartEndBoundaryBegin 6477770 MultipartEndBoundaryEnd 6477811 MultipartEpilogueBegin 6477811 MultipartEpilogueEnd 6477811 -MimeContentEnd 6477813 -Octets 93672 +MimeContentEnd 6477811 +Octets 93670 Lines 1396 -MimeEntityEnd 6477813 -MimeMessageEnd 6477813 +MimeEntityEnd 6477811 +MimeMessageEnd 6477811 MboxMarkerBegin 6477813 MboxMarkerEnd 6477820 MimeMessageBegin 6477822 @@ -5207,7 +5207,7 @@ MimeContentBegin 6478914 MimeContentEnd 6479347 Octets 433 Lines 14 -MimeEntityEnd 6479349 +MimeEntityEnd 6479347 MultipartBoundaryBegin 6479349 MultipartBoundaryEnd 6479395 MimeEntityBegin 6479395 @@ -5216,7 +5216,7 @@ MimeContentBegin 6479459 MimeContentEnd 6513483 Octets 34024 Lines 461 -MimeEntityEnd 6513485 +MimeEntityEnd 6513483 MultipartBoundaryBegin 6513485 MultipartBoundaryEnd 6513531 MimeEntityBegin 6513531 @@ -5225,16 +5225,16 @@ MimeContentBegin 6513607 MimeContentEnd 6513708 Octets 101 Lines 8 -MimeEntityEnd 6513710 +MimeEntityEnd 6513708 MultipartEndBoundaryBegin 6513710 MultipartEndBoundaryEnd 6513756 MultipartEpilogueBegin 6513756 MultipartEpilogueEnd 6513758 -MimeContentEnd 6513760 -Octets 35167 +MimeContentEnd 6513758 +Octets 35165 Lines 501 -MimeEntityEnd 6513760 -MimeMessageEnd 6513760 +MimeEntityEnd 6513758 +MimeMessageEnd 6513758 MboxMarkerBegin 6513760 MboxMarkerEnd 6513801 MimeMessageBegin 6513803 @@ -5245,8 +5245,8 @@ MimeContentBegin 6513957 MimeContentEnd 6557679 Octets 43722 Lines 694 -MimeEntityEnd 6557681 -MimeMessageEnd 6557681 +MimeEntityEnd 6557679 +MimeMessageEnd 6557679 MboxMarkerBegin 6557681 MboxMarkerEnd 6557712 MimeMessageBegin 6557714 @@ -5271,7 +5271,7 @@ MimeContentBegin 6558644 MimeContentEnd 6559954 Octets 1310 Lines 39 -MimeEntityEnd 6559956 +MimeEntityEnd 6559954 MultipartBoundaryBegin 6559956 MultipartBoundaryEnd 6559996 MimeEntityBegin 6559996 @@ -5280,15 +5280,15 @@ MimeContentBegin 6560078 MimeContentEnd 6562574 Octets 2496 Lines 33 -MimeEntityEnd 6562576 +MimeEntityEnd 6562574 MultipartEndBoundaryBegin 6562576 MultipartEndBoundaryEnd 6562616 MultipartEpilogueBegin 6562616 MultipartEpilogueEnd 6562620 -MimeContentEnd 6562622 -Octets 4101 +MimeContentEnd 6562620 +Octets 4099 Lines 84 -MimeEntityEnd 6562622 +MimeEntityEnd 6562620 MultipartBoundaryBegin 6562622 MultipartBoundaryEnd 6562662 MimeEntityBegin 6562662 @@ -5297,16 +5297,16 @@ MimeContentBegin 6562872 MimeContentEnd 6583892 Octets 21020 Lines 271 -MimeEntityEnd 6583894 +MimeEntityEnd 6583892 MultipartEndBoundaryBegin 6583894 MultipartEndBoundaryEnd 6583934 MultipartEpilogueBegin 6583934 MultipartEpilogueEnd 6583936 -MimeContentEnd 6583938 -Octets 25626 +MimeContentEnd 6583936 +Octets 25624 Lines 369 -MimeEntityEnd 6583938 -MimeMessageEnd 6583938 +MimeEntityEnd 6583936 +MimeMessageEnd 6583936 MboxMarkerBegin 6583938 MboxMarkerEnd 6583969 MimeMessageBegin 6583971 @@ -5324,7 +5324,7 @@ MimeContentBegin 6584459 MimeContentEnd 6584523 Octets 64 Lines 2 -MimeEntityEnd 6584525 +MimeEntityEnd 6584523 MultipartBoundaryBegin 6584525 MultipartBoundaryEnd 6584546 MimeEntityBegin 6584546 @@ -5340,7 +5340,7 @@ MimeContentBegin 6584760 MimeContentEnd 6584843 Octets 83 Lines 4 -MimeEntityEnd 6584845 +MimeEntityEnd 6584843 MultipartBoundaryBegin 6584845 MultipartBoundaryEnd 6584873 MimeEntityBegin 6584873 @@ -5349,7 +5349,7 @@ MimeContentBegin 6584986 MimeContentEnd 6585148 Octets 162 Lines 5 -MimeEntityEnd 6585150 +MimeEntityEnd 6585148 MultipartBoundaryBegin 6585150 MultipartBoundaryEnd 6585178 MimeEntityBegin 6585178 @@ -5358,7 +5358,7 @@ MimeContentBegin 6585291 MimeContentEnd 6585464 Octets 173 Lines 11 -MimeEntityEnd 6585466 +MimeEntityEnd 6585464 MultipartBoundaryBegin 6585466 MultipartBoundaryEnd 6585494 MimeEntityBegin 6585494 @@ -5367,7 +5367,7 @@ MimeContentBegin 6585603 MimeContentEnd 6585767 Octets 164 Lines 4 -MimeEntityEnd 6585769 +MimeEntityEnd 6585767 MultipartBoundaryBegin 6585769 MultipartBoundaryEnd 6585797 MimeEntityBegin 6585797 @@ -5376,15 +5376,15 @@ MimeContentBegin 6585925 MimeContentEnd 6586358 Octets 433 Lines 7 -MimeEntityEnd 6586360 +MimeEntityEnd 6586358 MultipartEndBoundaryBegin 6586360 MultipartEndBoundaryEnd 6586388 MultipartEpilogueBegin 6586388 MultipartEpilogueEnd 6586388 -MimeContentEnd 6586390 -Octets 1768 +MimeContentEnd 6586388 +Octets 1766 Lines 57 -MimeEntityEnd 6586390 +MimeEntityEnd 6586388 MultipartBoundaryBegin 6586390 MultipartBoundaryEnd 6586411 MimeEntityBegin 6586411 @@ -5393,7 +5393,7 @@ MimeContentBegin 6586413 MimeContentEnd 6586582 Octets 169 Lines 5 -MimeEntityEnd 6586584 +MimeEntityEnd 6586582 MultipartBoundaryBegin 6586584 MultipartBoundaryEnd 6586605 MimeEntityBegin 6586605 @@ -5409,7 +5409,7 @@ MimeContentBegin 6586691 MimeContentEnd 6586745 Octets 54 Lines 2 -MimeEntityEnd 6586747 +MimeEntityEnd 6586745 MultipartBoundaryBegin 6586747 MultipartBoundaryEnd 6586753 MimeEntityBegin 6586753 @@ -5425,7 +5425,7 @@ MimeContentBegin 6586839 MimeContentEnd 6586893 Octets 54 Lines 2 -MimeEntityEnd 6586895 +MimeEntityEnd 6586893 MultipartBoundaryBegin 6586895 MultipartBoundaryEnd 6586901 MimeEntityBegin 6586901 @@ -5434,7 +5434,7 @@ MimeContentBegin 6586928 MimeContentEnd 6586979 Octets 51 Lines 2 -MimeEntityEnd 6586981 +MimeEntityEnd 6586979 MultipartBoundaryBegin 6586981 MultipartBoundaryEnd 6586987 MimeEntityBegin 6586987 @@ -5443,15 +5443,15 @@ MimeContentBegin 6587016 MimeContentEnd 6587071 Octets 55 Lines 2 -MimeEntityEnd 6587073 +MimeEntityEnd 6587071 MultipartEndBoundaryBegin 6587073 MultipartEndBoundaryEnd 6587079 MultipartEpilogueBegin 6587079 MultipartEpilogueEnd 6587081 -MimeContentEnd 6587083 -Octets 278 +MimeContentEnd 6587081 +Octets 276 Lines 17 -MimeEntityEnd 6587083 +MimeEntityEnd 6587081 MultipartBoundaryBegin 6587083 MultipartBoundaryEnd 6587089 MimeEntityBegin 6587089 @@ -5460,15 +5460,15 @@ MimeContentBegin 6587184 MimeContentEnd 6587200 Octets 16 Lines 2 -MimeEntityEnd 6587202 +MimeEntityEnd 6587200 MultipartEndBoundaryBegin 6587202 MultipartEndBoundaryEnd 6587208 MultipartEpilogueBegin 6587208 MultipartEpilogueEnd 6587208 -MimeContentEnd 6587210 -Octets 553 +MimeContentEnd 6587208 +Octets 551 Lines 32 -MimeEntityEnd 6587210 +MimeEntityEnd 6587208 MultipartBoundaryBegin 6587210 MultipartBoundaryEnd 6587231 MimeEntityBegin 6587231 @@ -5477,16 +5477,16 @@ MimeContentBegin 6587233 MimeContentEnd 6587243 Octets 10 Lines 2 -MimeEntityEnd 6587245 +MimeEntityEnd 6587243 MultipartEndBoundaryBegin 6587245 MultipartEndBoundaryEnd 6587266 MultipartEpilogueBegin 6587266 MultipartEpilogueEnd 6587266 -MimeContentEnd 6587268 -Octets 2880 +MimeContentEnd 6587266 +Octets 2878 Lines 113 -MimeEntityEnd 6587268 -MimeMessageEnd 6587268 +MimeEntityEnd 6587266 +MimeMessageEnd 6587266 MboxMarkerBegin 6587268 MboxMarkerEnd 6587299 MimeMessageBegin 6587301 @@ -5504,7 +5504,7 @@ MimeContentBegin 6587787 MimeContentEnd 6587855 Octets 68 Lines 2 -MimeEntityEnd 6587857 +MimeEntityEnd 6587855 MultipartBoundaryBegin 6587857 MultipartBoundaryEnd 6587878 MimeEntityBegin 6587878 @@ -5520,7 +5520,7 @@ MimeContentBegin 6588142 MimeContentEnd 6645008 Octets 56866 Lines 1604 -MimeEntityEnd 6645010 +MimeEntityEnd 6645008 MultipartBoundaryBegin 6645010 MultipartBoundaryEnd 6645038 MimeEntityBegin 6645038 @@ -5529,7 +5529,7 @@ MimeContentBegin 6645197 MimeContentEnd 6754228 Octets 109031 Lines 2983 -MimeEntityEnd 6754230 +MimeEntityEnd 6754228 MultipartBoundaryBegin 6754230 MultipartBoundaryEnd 6754258 MimeEntityBegin 6754258 @@ -5538,24 +5538,24 @@ MimeContentBegin 6754408 MimeContentEnd 6955876 Octets 201468 Lines 13110 -MimeEntityEnd 6955878 +MimeEntityEnd 6955876 MultipartEndBoundaryBegin 6955878 MultipartEndBoundaryEnd 6955906 MultipartEpilogueBegin 6955906 MultipartEpilogueEnd 6955908 -MimeContentEnd 6955910 -Octets 367956 +MimeContentEnd 6955908 +Octets 367954 Lines 17714 -MimeEntityEnd 6955910 +MimeEntityEnd 6955908 MultipartEndBoundaryBegin 6955910 MultipartEndBoundaryEnd 6955931 MultipartEpilogueBegin 6955931 MultipartEpilogueEnd 6955939 -MimeContentEnd 6955941 -Octets 368225 +MimeContentEnd 6955939 +Octets 368223 Lines 17726 -MimeEntityEnd 6955941 -MimeMessageEnd 6955941 +MimeEntityEnd 6955939 +MimeMessageEnd 6955939 MboxMarkerBegin 6955941 MboxMarkerEnd 6955948 MimeMessageBegin 6955950 @@ -5573,7 +5573,7 @@ MimeContentBegin 6956943 MimeContentEnd 6956943 Octets 0 Lines 1 -MimeEntityEnd 6956945 +MimeEntityEnd 6956943 MultipartBoundaryBegin 6956945 MultipartBoundaryEnd 6956986 MimeEntityBegin 6956986 @@ -5587,21 +5587,21 @@ MimeContentBegin 6957640 MimeContentEnd 6958002 Octets 362 Lines 17 -MimeEntityEnd 6958004 -MimeMessageEnd 6958004 -MimeContentEnd 6958004 -Octets 917 +MimeEntityEnd 6958002 +MimeMessageEnd 6958002 +MimeContentEnd 6958002 +Octets 915 Lines 29 -MimeEntityEnd 6958004 +MimeEntityEnd 6958002 MultipartEndBoundaryBegin 6958004 MultipartEndBoundaryEnd 6958045 MultipartEpilogueBegin 6958045 MultipartEpilogueEnd 6958045 -MimeContentEnd 6958047 -Octets 1480 +MimeContentEnd 6958045 +Octets 1478 Lines 43 -MimeEntityEnd 6958047 -MimeMessageEnd 6958047 +MimeEntityEnd 6958045 +MimeMessageEnd 6958045 MboxMarkerBegin 6958047 MboxMarkerEnd 6958054 MimeMessageBegin 6958056 @@ -5619,7 +5619,7 @@ MimeContentBegin 6958654 MimeContentEnd 6959403 Octets 749 Lines 31 -MimeEntityEnd 6959405 +MimeEntityEnd 6959403 MultipartBoundaryBegin 6959405 MultipartBoundaryEnd 6959445 MimeEntityBegin 6959445 @@ -5628,16 +5628,16 @@ MimeContentBegin 6959773 MimeContentEnd 6970643 Octets 10870 Lines 148 -MimeEntityEnd 6970645 +MimeEntityEnd 6970643 MultipartEndBoundaryBegin 6970645 MultipartEndBoundaryEnd 6970685 MultipartEpilogueBegin 6970685 MultipartEpilogueEnd 6970685 -MimeContentEnd 6970687 -Octets 12326 +MimeContentEnd 6970685 +Octets 12324 Lines 197 -MimeEntityEnd 6970687 -MimeMessageEnd 6970687 +MimeEntityEnd 6970685 +MimeMessageEnd 6970685 MboxMarkerBegin 6970687 MboxMarkerEnd 6970694 MimeMessageBegin 6970696 @@ -5655,7 +5655,7 @@ MimeContentBegin 6971294 MimeContentEnd 6972042 Octets 748 Lines 31 -MimeEntityEnd 6972044 +MimeEntityEnd 6972042 MultipartBoundaryBegin 6972044 MultipartBoundaryEnd 6972084 MimeEntityBegin 6972084 @@ -5664,16 +5664,16 @@ MimeContentBegin 6972381 MimeContentEnd 6983251 Octets 10870 Lines 148 -MimeEntityEnd 6983253 +MimeEntityEnd 6983251 MultipartEndBoundaryBegin 6983253 MultipartEndBoundaryEnd 6983293 MultipartEpilogueBegin 6983293 MultipartEpilogueEnd 6983293 -MimeContentEnd 6983295 -Octets 12294 +MimeContentEnd 6983293 +Octets 12292 Lines 197 -MimeEntityEnd 6983295 -MimeMessageEnd 6983295 +MimeEntityEnd 6983293 +MimeMessageEnd 6983293 MboxMarkerBegin 6983295 MboxMarkerEnd 6983326 MimeMessageBegin 6983328 @@ -5691,7 +5691,7 @@ MimeContentBegin 6984998 MimeContentEnd 6990308 Octets 5310 Lines 112 -MimeEntityEnd 6990310 +MimeEntityEnd 6990308 MultipartBoundaryBegin 6990310 MultipartBoundaryEnd 6990355 MimeEntityBegin 6990355 @@ -5700,16 +5700,16 @@ MimeContentBegin 6990560 MimeContentEnd 6991502 Octets 942 Lines 14 -MimeEntityEnd 6991504 +MimeEntityEnd 6991502 MultipartEndBoundaryBegin 6991504 MultipartEndBoundaryEnd 6991549 MultipartEpilogueBegin 6991549 MultipartEpilogueEnd 6991551 -MimeContentEnd 6991553 -Octets 6696 +MimeContentEnd 6991551 +Octets 6694 Lines 140 -MimeEntityEnd 6991553 -MimeMessageEnd 6991553 +MimeEntityEnd 6991551 +MimeMessageEnd 6991551 MboxMarkerBegin 6991553 MboxMarkerEnd 6991584 MimeMessageBegin 6991586 @@ -5727,7 +5727,7 @@ MimeContentBegin 6992113 MimeContentEnd 6992366 Octets 253 Lines 7 -MimeEntityEnd 6992368 +MimeEntityEnd 6992366 MultipartBoundaryBegin 6992368 MultipartBoundaryEnd 6992408 MimeEntityBegin 6992408 @@ -5743,7 +5743,7 @@ MimeContentBegin 6992736 MimeContentEnd 7000063 Octets 7327 Lines 180 -MimeEntityEnd 7000065 +MimeEntityEnd 7000063 MultipartBoundaryBegin 7000065 MultipartBoundaryEnd 7000105 MimeEntityBegin 7000105 @@ -5752,7 +5752,7 @@ MimeContentBegin 7000286 MimeContentEnd 7008376 Octets 8090 Lines 110 -MimeEntityEnd 7008378 +MimeEntityEnd 7008376 MultipartBoundaryBegin 7008378 MultipartBoundaryEnd 7008418 MimeEntityBegin 7008418 @@ -5761,7 +5761,7 @@ MimeContentBegin 7008582 MimeContentEnd 7016138 Octets 7556 Lines 103 -MimeEntityEnd 7016140 +MimeEntityEnd 7016138 MultipartBoundaryBegin 7016140 MultipartBoundaryEnd 7016180 MimeEntityBegin 7016180 @@ -5770,7 +5770,7 @@ MimeContentBegin 7016343 MimeContentEnd 7019721 Octets 3378 Lines 46 -MimeEntityEnd 7019723 +MimeEntityEnd 7019721 MultipartBoundaryBegin 7019723 MultipartBoundaryEnd 7019763 MimeEntityBegin 7019763 @@ -5779,7 +5779,7 @@ MimeContentBegin 7019927 MimeContentEnd 7028493 Octets 8566 Lines 116 -MimeEntityEnd 7028495 +MimeEntityEnd 7028493 MultipartBoundaryBegin 7028495 MultipartBoundaryEnd 7028535 MimeEntityBegin 7028535 @@ -5788,7 +5788,7 @@ MimeContentBegin 7028696 MimeContentEnd 7134494 Octets 105798 Lines 1430 -MimeEntityEnd 7134496 +MimeEntityEnd 7134494 MultipartBoundaryBegin 7134496 MultipartBoundaryEnd 7134536 MimeEntityBegin 7134536 @@ -5797,7 +5797,7 @@ MimeContentBegin 7134700 MimeContentEnd 7173586 Octets 38886 Lines 526 -MimeEntityEnd 7173588 +MimeEntityEnd 7173586 MultipartBoundaryBegin 7173588 MultipartBoundaryEnd 7173628 MimeEntityBegin 7173628 @@ -5806,24 +5806,24 @@ MimeContentBegin 7173797 MimeContentEnd 7209595 Octets 35798 Lines 484 -MimeEntityEnd 7209597 +MimeEntityEnd 7209595 MultipartEndBoundaryBegin 7209597 MultipartEndBoundaryEnd 7209637 MultipartEpilogueBegin 7209637 MultipartEpilogueEnd 7209637 -MimeContentEnd 7209639 -Octets 217142 +MimeContentEnd 7209637 +Octets 217140 Lines 3044 -MimeEntityEnd 7209639 +MimeEntityEnd 7209637 MultipartEndBoundaryBegin 7209639 MultipartEndBoundaryEnd 7209679 MultipartEpilogueBegin 7209679 MultipartEpilogueEnd 7209679 -MimeContentEnd 7209681 -Octets 217636 +MimeContentEnd 7209679 +Octets 217634 Lines 3059 -MimeEntityEnd 7209681 -MimeMessageEnd 7209681 +MimeEntityEnd 7209679 +MimeMessageEnd 7209679 MboxMarkerBegin 7209681 MboxMarkerEnd 7209688 MimeMessageBegin 7209690 @@ -5841,7 +5841,7 @@ MimeContentBegin 7210195 MimeContentEnd 7210773 Octets 578 Lines 28 -MimeEntityEnd 7210775 +MimeEntityEnd 7210773 MultipartBoundaryBegin 7210775 MultipartBoundaryEnd 7210815 MimeEntityBegin 7210815 @@ -5850,16 +5850,16 @@ MimeContentBegin 7210932 MimeContentEnd 7221802 Octets 10870 Lines 148 -MimeEntityEnd 7221804 +MimeEntityEnd 7221802 MultipartEndBoundaryBegin 7221804 MultipartEndBoundaryEnd 7221844 MultipartEpilogueBegin 7221844 MultipartEpilogueEnd 7221844 -MimeContentEnd 7221846 -Octets 11852 +MimeContentEnd 7221844 +Octets 11850 Lines 188 -MimeEntityEnd 7221846 -MimeMessageEnd 7221846 +MimeEntityEnd 7221844 +MimeMessageEnd 7221844 MboxMarkerBegin 7221846 MboxMarkerEnd 7221853 MimeMessageBegin 7221855 @@ -5877,7 +5877,7 @@ MimeContentBegin 7222417 MimeContentEnd 7223042 Octets 625 Lines 29 -MimeEntityEnd 7223044 +MimeEntityEnd 7223042 MultipartBoundaryBegin 7223044 MultipartBoundaryEnd 7223084 MimeEntityBegin 7223084 @@ -5886,16 +5886,16 @@ MimeContentBegin 7223365 MimeContentEnd 7234235 Octets 10870 Lines 148 -MimeEntityEnd 7234237 +MimeEntityEnd 7234235 MultipartEndBoundaryBegin 7234237 MultipartEndBoundaryEnd 7234277 MultipartEpilogueBegin 7234277 MultipartEpilogueEnd 7234277 -MimeContentEnd 7234279 -Octets 12120 +MimeContentEnd 7234277 +Octets 12118 Lines 193 -MimeEntityEnd 7234279 -MimeMessageEnd 7234279 +MimeEntityEnd 7234277 +MimeMessageEnd 7234277 MboxMarkerBegin 7234279 MboxMarkerEnd 7234286 MimeMessageBegin 7234288 @@ -5913,7 +5913,7 @@ MimeContentBegin 7234854 MimeContentEnd 7235483 Octets 629 Lines 29 -MimeEntityEnd 7235485 +MimeEntityEnd 7235483 MultipartBoundaryBegin 7235485 MultipartBoundaryEnd 7235525 MimeEntityBegin 7235525 @@ -5922,16 +5922,16 @@ MimeContentBegin 7235705 MimeContentEnd 7246575 Octets 10870 Lines 148 -MimeEntityEnd 7246577 +MimeEntityEnd 7246575 MultipartEndBoundaryBegin 7246577 MultipartEndBoundaryEnd 7246617 MultipartEpilogueBegin 7246617 MultipartEpilogueEnd 7246617 -MimeContentEnd 7246619 -Octets 12027 +MimeContentEnd 7246617 +Octets 12025 Lines 191 -MimeEntityEnd 7246619 -MimeMessageEnd 7246619 +MimeEntityEnd 7246617 +MimeMessageEnd 7246617 MboxMarkerBegin 7246619 MboxMarkerEnd 7246626 MimeMessageBegin 7246628 @@ -5949,7 +5949,7 @@ MimeContentBegin 7247224 MimeContentEnd 7247884 Octets 660 Lines 30 -MimeEntityEnd 7247886 +MimeEntityEnd 7247884 MultipartBoundaryBegin 7247886 MultipartBoundaryEnd 7247926 MimeEntityBegin 7247926 @@ -5958,16 +5958,16 @@ MimeContentBegin 7248239 MimeContentEnd 7259109 Octets 10870 Lines 148 -MimeEntityEnd 7259111 +MimeEntityEnd 7259109 MultipartEndBoundaryBegin 7259111 MultipartEndBoundaryEnd 7259151 MultipartEpilogueBegin 7259151 MultipartEpilogueEnd 7259151 -MimeContentEnd 7259153 -Octets 12221 +MimeContentEnd 7259151 +Octets 12219 Lines 196 -MimeEntityEnd 7259153 -MimeMessageEnd 7259153 +MimeEntityEnd 7259151 +MimeMessageEnd 7259151 MboxMarkerBegin 7259153 MboxMarkerEnd 7259160 MimeMessageBegin 7259162 @@ -5985,7 +5985,7 @@ MimeContentBegin 7259728 MimeContentEnd 7260401 Octets 673 Lines 29 -MimeEntityEnd 7260403 +MimeEntityEnd 7260401 MultipartBoundaryBegin 7260403 MultipartBoundaryEnd 7260443 MimeEntityBegin 7260443 @@ -5994,16 +5994,16 @@ MimeContentBegin 7260623 MimeContentEnd 7271493 Octets 10870 Lines 148 -MimeEntityEnd 7271495 +MimeEntityEnd 7271493 MultipartEndBoundaryBegin 7271495 MultipartEndBoundaryEnd 7271535 MultipartEpilogueBegin 7271535 MultipartEpilogueEnd 7271535 -MimeContentEnd 7271537 -Octets 12071 +MimeContentEnd 7271535 +Octets 12069 Lines 191 -MimeEntityEnd 7271537 -MimeMessageEnd 7271537 +MimeEntityEnd 7271535 +MimeMessageEnd 7271535 MboxMarkerBegin 7271537 MboxMarkerEnd 7271544 MimeMessageBegin 7271546 @@ -6021,7 +6021,7 @@ MimeContentBegin 7272142 MimeContentEnd 7272841 Octets 699 Lines 30 -MimeEntityEnd 7272843 +MimeEntityEnd 7272841 MultipartBoundaryBegin 7272843 MultipartBoundaryEnd 7272883 MimeEntityBegin 7272883 @@ -6030,16 +6030,16 @@ MimeContentBegin 7273227 MimeContentEnd 7284097 Octets 10870 Lines 148 -MimeEntityEnd 7284099 +MimeEntityEnd 7284097 MultipartEndBoundaryBegin 7284099 MultipartEndBoundaryEnd 7284139 MultipartEpilogueBegin 7284139 MultipartEpilogueEnd 7284139 -MimeContentEnd 7284141 -Octets 12291 +MimeContentEnd 7284139 +Octets 12289 Lines 196 -MimeEntityEnd 7284141 -MimeMessageEnd 7284141 +MimeEntityEnd 7284139 +MimeMessageEnd 7284139 MboxMarkerBegin 7284141 MboxMarkerEnd 7284172 MimeMessageBegin 7284174 @@ -6057,7 +6057,7 @@ MimeContentBegin 7285596 MimeContentEnd 7285626 Octets 30 Lines 4 -MimeEntityEnd 7285628 +MimeEntityEnd 7285626 MultipartBoundaryBegin 7285628 MultipartBoundaryEnd 7285667 MimeEntityBegin 7285667 @@ -6078,7 +6078,7 @@ MimeContentBegin 7286719 MimeContentEnd 7287362 Octets 643 Lines 17 -MimeEntityEnd 7287364 +MimeEntityEnd 7287362 MultipartBoundaryBegin 7287364 MultipartBoundaryEnd 7287404 MimeEntityBegin 7287404 @@ -6094,7 +6094,7 @@ MimeContentBegin 7287608 MimeContentEnd 7288476 Octets 868 Lines 19 -MimeEntityEnd 7288478 +MimeEntityEnd 7288476 MultipartBoundaryBegin 7288478 MultipartBoundaryEnd 7288518 MimeEntityBegin 7288518 @@ -6103,37 +6103,37 @@ MimeContentBegin 7288707 MimeContentEnd 8042865 Octets 754158 Lines 10192 -MimeEntityEnd 8042867 +MimeEntityEnd 8042865 MultipartEndBoundaryBegin 8042867 MultipartEndBoundaryEnd 8042907 MultipartEpilogueBegin 8042907 MultipartEpilogueEnd 8042909 -MimeContentEnd 8042911 -Octets 755423 +MimeContentEnd 8042909 +Octets 755421 Lines 10224 -MimeEntityEnd 8042911 +MimeEntityEnd 8042909 MultipartEndBoundaryBegin 8042911 MultipartEndBoundaryEnd 8042951 MultipartEpilogueBegin 8042951 MultipartEpilogueEnd 8042957 -MimeContentEnd 8042959 -Octets 756361 +MimeContentEnd 8042957 +Octets 756359 Lines 10253 -MimeEntityEnd 8042959 -MimeMessageEnd 8042959 -MimeContentEnd 8042959 -Octets 757198 +MimeEntityEnd 8042957 +MimeMessageEnd 8042957 +MimeContentEnd 8042957 +Octets 757196 Lines 10269 -MimeEntityEnd 8042959 +MimeEntityEnd 8042957 MultipartEndBoundaryBegin 8042959 MultipartEndBoundaryEnd 8042998 MultipartEpilogueBegin 8042998 MultipartEpilogueEnd 8043000 -MimeContentEnd 8043002 -Octets 757572 +MimeContentEnd 8043000 +Octets 757570 Lines 10286 -MimeEntityEnd 8043002 -MimeMessageEnd 8043002 +MimeEntityEnd 8043000 +MimeMessageEnd 8043000 MboxMarkerBegin 8043002 MboxMarkerEnd 8043033 MimeMessageBegin 8043035 @@ -6151,7 +6151,7 @@ MimeContentBegin 8044462 MimeContentEnd 8046894 Octets 2432 Lines 51 -MimeEntityEnd 8046896 +MimeEntityEnd 8046894 MultipartBoundaryBegin 8046896 MultipartBoundaryEnd 8046941 MimeEntityBegin 8046941 @@ -6160,7 +6160,7 @@ MimeContentBegin 8047105 MimeContentEnd 8053207 Octets 6102 Lines 80 -MimeEntityEnd 8053209 +MimeEntityEnd 8053207 MultipartBoundaryBegin 8053209 MultipartBoundaryEnd 8053254 MimeEntityBegin 8053254 @@ -6169,7 +6169,7 @@ MimeContentBegin 8053417 MimeContentEnd 8065647 Octets 12230 Lines 158 -MimeEntityEnd 8065649 +MimeEntityEnd 8065647 MultipartBoundaryBegin 8065649 MultipartBoundaryEnd 8065694 MimeEntityBegin 8065694 @@ -6178,7 +6178,7 @@ MimeContentBegin 8065859 MimeContentEnd 8087855 Octets 21996 Lines 283 -MimeEntityEnd 8087857 +MimeEntityEnd 8087855 MultipartBoundaryBegin 8087857 MultipartBoundaryEnd 8087902 MimeEntityBegin 8087902 @@ -6187,16 +6187,16 @@ MimeContentBegin 8088111 MimeContentEnd 8091549 Octets 3438 Lines 46 -MimeEntityEnd 8091551 +MimeEntityEnd 8091549 MultipartEndBoundaryBegin 8091551 MultipartEndBoundaryEnd 8091596 MultipartEpilogueBegin 8091596 MultipartEpilogueEnd 8091598 -MimeContentEnd 8091600 -Octets 47279 +MimeContentEnd 8091598 +Octets 47277 Lines 650 -MimeEntityEnd 8091600 -MimeMessageEnd 8091600 +MimeEntityEnd 8091598 +MimeMessageEnd 8091598 MboxMarkerBegin 8091600 MboxMarkerEnd 8091607 MimeMessageBegin 8091609 @@ -6207,8 +6207,8 @@ MimeContentBegin 8092367 MimeContentEnd 8644457 Octets 552090 Lines 7475 -MimeEntityEnd 8644459 -MimeMessageEnd 8644459 +MimeEntityEnd 8644457 +MimeMessageEnd 8644457 MboxMarkerBegin 8644459 MboxMarkerEnd 8644466 MimeMessageBegin 8644468 @@ -6226,16 +6226,16 @@ MimeContentBegin 8645442 MimeContentEnd 8648068 Octets 2626 Lines 97 -MimeEntityEnd 8648070 +MimeEntityEnd 8648068 MultipartEndBoundaryBegin 8648070 MultipartEndBoundaryEnd 8648079 MultipartEpilogueBegin 8648079 MultipartEpilogueEnd 8648081 -MimeContentEnd 8648083 -Octets 2683 +MimeContentEnd 8648081 +Octets 2681 Lines 103 -MimeEntityEnd 8648083 -MimeMessageEnd 8648083 +MimeEntityEnd 8648081 +MimeMessageEnd 8648081 MboxMarkerBegin 8648083 MboxMarkerEnd 8648114 MimeMessageBegin 8648116 @@ -6253,7 +6253,7 @@ MimeContentBegin 8649078 MimeContentEnd 8650186 Octets 1108 Lines 27 -MimeEntityEnd 8650188 +MimeEntityEnd 8650186 MultipartBoundaryBegin 8650188 MultipartBoundaryEnd 8650206 MimeEntityBegin 8650206 @@ -6262,16 +6262,16 @@ MimeContentBegin 8650249 MimeContentEnd 8650542 Octets 293 Lines 10 -MimeEntityEnd 8650544 +MimeEntityEnd 8650542 MultipartEndBoundaryBegin 8650544 MultipartEndBoundaryEnd 8650562 MultipartEpilogueBegin 8650562 MultipartEpilogueEnd 8650562 -MimeContentEnd 8650564 -Octets 1838 +MimeContentEnd 8650562 +Octets 1836 Lines 51 -MimeEntityEnd 8650564 -MimeMessageEnd 8650564 +MimeEntityEnd 8650562 +MimeMessageEnd 8650562 MboxMarkerBegin 8650564 MboxMarkerEnd 8650571 MimeMessageBegin 8650573 @@ -6282,8 +6282,8 @@ MimeContentBegin 8651756 MimeContentEnd 8653178 Octets 1422 Lines 40 -MimeEntityEnd 8653180 -MimeMessageEnd 8653180 +MimeEntityEnd 8653178 +MimeMessageEnd 8653178 MboxMarkerBegin 8653180 MboxMarkerEnd 8653187 MimeMessageBegin 8653189 @@ -6294,8 +6294,8 @@ MimeContentBegin 8653839 MimeContentEnd 8654840 Octets 1001 Lines 28 -MimeEntityEnd 8654842 -MimeMessageEnd 8654842 +MimeEntityEnd 8654840 +MimeMessageEnd 8654840 MboxMarkerBegin 8654842 MboxMarkerEnd 8654849 MimeMessageBegin 8654851 @@ -6313,7 +6313,7 @@ MimeContentBegin 8655876 MimeContentEnd 8656708 Octets 832 Lines 16 -MimeEntityEnd 8656710 +MimeEntityEnd 8656708 MultipartBoundaryBegin 8656710 MultipartBoundaryEnd 8656751 MimeEntityBegin 8656751 @@ -6329,7 +6329,7 @@ MimeContentBegin 8656976 MimeContentEnd 8657477 Octets 501 Lines 11 -MimeEntityEnd 8657479 +MimeEntityEnd 8657477 MultipartBoundaryBegin 8657479 MultipartBoundaryEnd 8657522 MimeEntityBegin 8657522 @@ -6343,12 +6343,12 @@ MimeContentBegin 8657744 MimeContentEnd 8657748 Octets 4 Lines 3 -MimeEntityEnd 8657750 -MimeMessageEnd 8657750 -MimeContentEnd 8657750 -Octets 35 +MimeEntityEnd 8657748 +MimeMessageEnd 8657748 +MimeContentEnd 8657748 +Octets 33 Lines 5 -MimeEntityEnd 8657750 +MimeEntityEnd 8657748 MultipartBoundaryBegin 8657750 MultipartBoundaryEnd 8657793 MimeEntityBegin 8657793 @@ -6357,7 +6357,7 @@ MimeContentBegin 8657884 MimeContentEnd 8657889 Octets 5 Lines 3 -MimeEntityEnd 8657891 +MimeEntityEnd 8657889 MultipartBoundaryBegin 8657891 MultipartBoundaryEnd 8657934 MimeEntityBegin 8657934 @@ -6371,12 +6371,12 @@ MimeContentBegin 8658169 MimeContentEnd 8658173 Octets 4 Lines 3 -MimeEntityEnd 8658175 -MimeMessageEnd 8658175 -MimeContentEnd 8658175 -Octets 33 +MimeEntityEnd 8658173 +MimeMessageEnd 8658173 +MimeContentEnd 8658173 +Octets 31 Lines 5 -MimeEntityEnd 8658175 +MimeEntityEnd 8658173 MultipartBoundaryBegin 8658175 MultipartBoundaryEnd 8658218 MimeEntityBegin 8658218 @@ -6385,24 +6385,24 @@ MimeContentBegin 8658312 MimeContentEnd 8658541 Octets 229 Lines 8 -MimeEntityEnd 8658543 +MimeEntityEnd 8658541 MultipartEndBoundaryBegin 8658543 MultipartEndBoundaryEnd 8658586 MultipartEpilogueBegin 8658586 MultipartEpilogueEnd 8658588 -MimeContentEnd 8658590 -Octets 1751 +MimeContentEnd 8658588 +Octets 1749 Lines 62 -MimeEntityEnd 8658590 +MimeEntityEnd 8658588 MultipartEndBoundaryBegin 8658590 MultipartEndBoundaryEnd 8658631 MultipartEpilogueBegin 8658631 MultipartEpilogueEnd 8658633 -MimeContentEnd 8658635 -Octets 3004 +MimeContentEnd 8658633 +Octets 3002 Lines 90 -MimeEntityEnd 8658635 -MimeMessageEnd 8658635 +MimeEntityEnd 8658633 +MimeMessageEnd 8658633 MboxMarkerBegin 8658635 MboxMarkerEnd 8658642 MimeMessageBegin 8658644 @@ -6413,8 +6413,8 @@ MimeContentBegin 8659476 MimeContentEnd 8660904 Octets 1428 Lines 43 -MimeEntityEnd 8660906 -MimeMessageEnd 8660906 +MimeEntityEnd 8660904 +MimeMessageEnd 8660904 MboxMarkerBegin 8660906 MboxMarkerEnd 8660913 MimeMessageBegin 8660915 @@ -6425,8 +6425,8 @@ MimeContentBegin 8661072 MimeContentEnd 8665806 Octets 4734 Lines 64 -MimeEntityEnd 8665808 -MimeMessageEnd 8665808 +MimeEntityEnd 8665806 +MimeMessageEnd 8665806 MboxMarkerBegin 8665808 MboxMarkerEnd 8665815 MimeMessageBegin 8665817 @@ -6444,7 +6444,7 @@ MimeContentBegin 8667840 MimeContentEnd 8669545 Octets 1705 Lines 39 -MimeEntityEnd 8669547 +MimeEntityEnd 8669545 MultipartBoundaryBegin 8669547 MultipartBoundaryEnd 8669588 MimeEntityBegin 8669588 @@ -6460,7 +6460,7 @@ MimeContentBegin 8669813 MimeContentEnd 8670384 Octets 571 Lines 15 -MimeEntityEnd 8670386 +MimeEntityEnd 8670384 MultipartBoundaryBegin 8670386 MultipartBoundaryEnd 8670429 MimeEntityBegin 8670429 @@ -6469,7 +6469,7 @@ MimeContentBegin 8670493 MimeContentEnd 8671377 Octets 884 Lines 13 -MimeEntityEnd 8671379 +MimeEntityEnd 8671377 MultipartBoundaryBegin 8671379 MultipartBoundaryEnd 8671422 MimeEntityBegin 8671422 @@ -6478,7 +6478,7 @@ MimeContentBegin 8671516 MimeContentEnd 8671567 Octets 51 Lines 6 -MimeEntityEnd 8671569 +MimeEntityEnd 8671567 MultipartBoundaryBegin 8671569 MultipartBoundaryEnd 8671612 MimeEntityBegin 8671612 @@ -6487,7 +6487,7 @@ MimeContentBegin 8671676 MimeContentEnd 8672560 Octets 884 Lines 13 -MimeEntityEnd 8672562 +MimeEntityEnd 8672560 MultipartBoundaryBegin 8672562 MultipartBoundaryEnd 8672605 MimeEntityBegin 8672605 @@ -6496,7 +6496,7 @@ MimeContentBegin 8672699 MimeContentEnd 8672750 Octets 51 Lines 6 -MimeEntityEnd 8672752 +MimeEntityEnd 8672750 MultipartBoundaryBegin 8672752 MultipartBoundaryEnd 8672795 MimeEntityBegin 8672795 @@ -6505,7 +6505,7 @@ MimeContentBegin 8672859 MimeContentEnd 8673743 Octets 884 Lines 13 -MimeEntityEnd 8673745 +MimeEntityEnd 8673743 MultipartBoundaryBegin 8673745 MultipartBoundaryEnd 8673788 MimeEntityBegin 8673788 @@ -6514,7 +6514,7 @@ MimeContentBegin 8673882 MimeContentEnd 8673927 Octets 45 Lines 6 -MimeEntityEnd 8673929 +MimeEntityEnd 8673927 MultipartBoundaryBegin 8673929 MultipartBoundaryEnd 8673972 MimeEntityBegin 8673972 @@ -6523,7 +6523,7 @@ MimeContentBegin 8674036 MimeContentEnd 8674264 Octets 228 Lines 5 -MimeEntityEnd 8674266 +MimeEntityEnd 8674264 MultipartBoundaryBegin 8674266 MultipartBoundaryEnd 8674309 MimeEntityBegin 8674309 @@ -6532,7 +6532,7 @@ MimeContentBegin 8674403 MimeContentEnd 8674472 Octets 69 Lines 6 -MimeEntityEnd 8674474 +MimeEntityEnd 8674472 MultipartBoundaryBegin 8674474 MultipartBoundaryEnd 8674517 MimeEntityBegin 8674517 @@ -6541,7 +6541,7 @@ MimeContentBegin 8674581 MimeContentEnd 8674809 Octets 228 Lines 5 -MimeEntityEnd 8674811 +MimeEntityEnd 8674809 MultipartBoundaryBegin 8674811 MultipartBoundaryEnd 8674854 MimeEntityBegin 8674854 @@ -6550,7 +6550,7 @@ MimeContentBegin 8674948 MimeContentEnd 8674997 Octets 49 Lines 6 -MimeEntityEnd 8674999 +MimeEntityEnd 8674997 MultipartBoundaryBegin 8674999 MultipartBoundaryEnd 8675042 MimeEntityBegin 8675042 @@ -6559,7 +6559,7 @@ MimeContentBegin 8675106 MimeContentEnd 8675334 Octets 228 Lines 5 -MimeEntityEnd 8675336 +MimeEntityEnd 8675334 MultipartBoundaryBegin 8675336 MultipartBoundaryEnd 8675379 MimeEntityBegin 8675379 @@ -6568,7 +6568,7 @@ MimeContentBegin 8675473 MimeContentEnd 8675776 Octets 303 Lines 12 -MimeEntityEnd 8675778 +MimeEntityEnd 8675776 MultipartBoundaryBegin 8675778 MultipartBoundaryEnd 8675821 MimeEntityBegin 8675821 @@ -6577,7 +6577,7 @@ MimeContentBegin 8675885 MimeContentEnd 8676769 Octets 884 Lines 13 -MimeEntityEnd 8676771 +MimeEntityEnd 8676769 MultipartBoundaryBegin 8676771 MultipartBoundaryEnd 8676814 MimeEntityBegin 8676814 @@ -6586,7 +6586,7 @@ MimeContentBegin 8676908 MimeContentEnd 8676952 Octets 44 Lines 5 -MimeEntityEnd 8676954 +MimeEntityEnd 8676952 MultipartBoundaryBegin 8676954 MultipartBoundaryEnd 8676997 MimeEntityBegin 8676997 @@ -6595,7 +6595,7 @@ MimeContentBegin 8677061 MimeContentEnd 8679003 Octets 1942 Lines 28 -MimeEntityEnd 8679005 +MimeEntityEnd 8679003 MultipartBoundaryBegin 8679005 MultipartBoundaryEnd 8679048 MimeEntityBegin 8679048 @@ -6604,24 +6604,24 @@ MimeContentBegin 8679142 MimeContentEnd 8679153 Octets 11 Lines 2 -MimeEntityEnd 8679155 +MimeEntityEnd 8679153 MultipartEndBoundaryBegin 8679155 MultipartEndBoundaryEnd 8679198 MultipartEpilogueBegin 8679198 MultipartEpilogueEnd 8679200 -MimeContentEnd 8679202 -Octets 9526 +MimeContentEnd 8679200 +Octets 9524 Lines 229 -MimeEntityEnd 8679202 +MimeEntityEnd 8679200 MultipartEndBoundaryBegin 8679202 MultipartEndBoundaryEnd 8679243 MultipartEpilogueBegin 8679243 MultipartEpilogueEnd 8679245 -MimeContentEnd 8679247 -Octets 11652 +MimeContentEnd 8679245 +Octets 11650 Lines 280 -MimeEntityEnd 8679247 -MimeMessageEnd 8679247 +MimeEntityEnd 8679245 +MimeMessageEnd 8679245 MboxMarkerBegin 8679247 MboxMarkerEnd 8679254 MimeMessageBegin 8679256 @@ -6639,7 +6639,7 @@ MimeContentBegin 8680245 MimeContentEnd 8680884 Octets 639 Lines 13 -MimeEntityEnd 8680886 +MimeEntityEnd 8680884 MultipartBoundaryBegin 8680886 MultipartBoundaryEnd 8680927 MimeEntityBegin 8680927 @@ -6655,7 +6655,7 @@ MimeContentBegin 8681152 MimeContentEnd 8681693 Octets 541 Lines 9 -MimeEntityEnd 8681695 +MimeEntityEnd 8681693 MultipartBoundaryBegin 8681695 MultipartBoundaryEnd 8681738 MimeEntityBegin 8681738 @@ -6664,7 +6664,7 @@ MimeContentBegin 8681850 MimeContentEnd 8690560 Octets 8710 Lines 126 -MimeEntityEnd 8690562 +MimeEntityEnd 8690560 MultipartBoundaryBegin 8690562 MultipartBoundaryEnd 8690605 MimeEntityBegin 8690605 @@ -6673,24 +6673,24 @@ MimeContentBegin 8690699 MimeContentEnd 8690747 Octets 48 Lines 4 -MimeEntityEnd 8690749 +MimeEntityEnd 8690747 MultipartEndBoundaryBegin 8690749 MultipartEndBoundaryEnd 8690792 MultipartEpilogueBegin 8690792 MultipartEpilogueEnd 8690794 -MimeContentEnd 8690796 -Octets 9781 +MimeContentEnd 8690794 +Octets 9779 Lines 154 -MimeEntityEnd 8690796 +MimeEntityEnd 8690794 MultipartEndBoundaryBegin 8690796 MultipartEndBoundaryEnd 8690837 MultipartEpilogueBegin 8690837 MultipartEpilogueEnd 8690837 -MimeContentEnd 8690839 -Octets 10839 +MimeContentEnd 8690837 +Octets 10837 Lines 178 -MimeEntityEnd 8690839 -MimeMessageEnd 8690839 +MimeEntityEnd 8690837 +MimeMessageEnd 8690837 MboxMarkerBegin 8690839 MboxMarkerEnd 8690846 MimeMessageBegin 8690848 @@ -6708,7 +6708,7 @@ MimeContentBegin 8691654 MimeContentEnd 8691757 Octets 103 Lines 7 -MimeEntityEnd 8691759 +MimeEntityEnd 8691757 MultipartBoundaryBegin 8691759 MultipartBoundaryEnd 8691809 MimeEntityBegin 8691809 @@ -6717,16 +6717,16 @@ MimeContentBegin 8691940 MimeContentEnd 8771456 Octets 79516 Lines 1075 -MimeEntityEnd 8771458 +MimeEntityEnd 8771456 MultipartEndBoundaryBegin 8771458 MultipartEndBoundaryEnd 8771508 MultipartEpilogueBegin 8771508 MultipartEpilogueEnd 8771510 -MimeContentEnd 8771512 -Octets 80003 +MimeContentEnd 8771510 +Octets 80001 Lines 1094 -MimeEntityEnd 8771512 -MimeMessageEnd 8771512 +MimeEntityEnd 8771510 +MimeMessageEnd 8771510 MboxMarkerBegin 8771512 MboxMarkerEnd 8771519 MimeMessageBegin 8771521 @@ -6744,7 +6744,7 @@ MimeContentBegin 8772539 MimeContentEnd 8773917 Octets 1378 Lines 29 -MimeEntityEnd 8773919 +MimeEntityEnd 8773917 MultipartBoundaryBegin 8773919 MultipartBoundaryEnd 8773960 MimeEntityBegin 8773960 @@ -6760,7 +6760,7 @@ MimeContentBegin 8774185 MimeContentEnd 8775346 Octets 1161 Lines 23 -MimeEntityEnd 8775348 +MimeEntityEnd 8775346 MultipartBoundaryBegin 8775348 MultipartBoundaryEnd 8775391 MimeEntityBegin 8775391 @@ -6769,7 +6769,7 @@ MimeContentBegin 8775493 MimeContentEnd 8892315 Octets 116822 Lines 1580 -MimeEntityEnd 8892317 +MimeEntityEnd 8892315 MultipartBoundaryBegin 8892317 MultipartBoundaryEnd 8892360 MimeEntityBegin 8892360 @@ -6778,7 +6778,7 @@ MimeContentBegin 8892454 MimeContentEnd 8892580 Octets 126 Lines 4 -MimeEntityEnd 8892582 +MimeEntityEnd 8892580 MultipartBoundaryBegin 8892582 MultipartBoundaryEnd 8892625 MimeEntityBegin 8892625 @@ -6787,7 +6787,7 @@ MimeContentBegin 8892728 MimeContentEnd 8959970 Octets 67242 Lines 962 -MimeEntityEnd 8959972 +MimeEntityEnd 8959970 MultipartBoundaryBegin 8959972 MultipartBoundaryEnd 8960015 MimeEntityBegin 8960015 @@ -6796,24 +6796,24 @@ MimeContentBegin 8960106 MimeContentEnd 8960106 Octets 0 Lines 1 -MimeEntityEnd 8960108 +MimeEntityEnd 8960106 MultipartEndBoundaryBegin 8960108 MultipartEndBoundaryEnd 8960151 MultipartEpilogueBegin 8960151 MultipartEpilogueEnd 8960153 -MimeContentEnd 8960155 -Octets 186107 +MimeContentEnd 8960153 +Octets 186105 Lines 2594 -MimeEntityEnd 8960155 +MimeEntityEnd 8960153 MultipartEndBoundaryBegin 8960155 MultipartEndBoundaryEnd 8960196 MultipartEpilogueBegin 8960196 MultipartEpilogueEnd 8960196 -MimeContentEnd 8960198 -Octets 187904 +MimeContentEnd 8960196 +Octets 187902 Lines 2634 -MimeEntityEnd 8960198 -MimeMessageEnd 8960198 +MimeEntityEnd 8960196 +MimeMessageEnd 8960196 MboxMarkerBegin 8960198 MboxMarkerEnd 8960205 MimeMessageBegin 8960207 @@ -6824,8 +6824,8 @@ MimeContentBegin 8961063 MimeContentEnd 8962821 Octets 1758 Lines 26 -MimeEntityEnd 8962823 -MimeMessageEnd 8962823 +MimeEntityEnd 8962821 +MimeMessageEnd 8962821 MboxMarkerBegin 8962823 MboxMarkerEnd 8962830 MimeMessageBegin 8962832 @@ -6841,13 +6841,13 @@ MimeContentBegin 8963972 MimeContentEnd 8964871 Octets 899 Lines 25 -MimeEntityEnd 8964873 -MimeMessageEnd 8964873 -MimeContentEnd 8964873 -Octets 1397 +MimeEntityEnd 8964871 +MimeMessageEnd 8964871 +MimeContentEnd 8964871 +Octets 1395 Lines 38 -MimeEntityEnd 8964873 -MimeMessageEnd 8964873 +MimeEntityEnd 8964871 +MimeMessageEnd 8964871 MboxMarkerBegin 8964873 MboxMarkerEnd 8964880 MimeMessageBegin 8964882 @@ -6865,7 +6865,7 @@ MimeContentBegin 8965352 MimeContentEnd 8965393 Octets 41 Lines 2 -MimeEntityEnd 8965395 +MimeEntityEnd 8965393 MultipartBoundaryBegin 8965395 MultipartBoundaryEnd 8965405 MimeEntityBegin 8965405 @@ -6874,16 +6874,16 @@ MimeContentBegin 8965469 MimeContentEnd 9057967 Octets 92498 Lines 1250 -MimeEntityEnd 9057969 +MimeEntityEnd 9057967 MultipartEndBoundaryBegin 9057969 MultipartEndBoundaryEnd 9057979 MultipartEpilogueBegin 9057979 MultipartEpilogueEnd 9057985 -MimeContentEnd 9057987 -Octets 92647 +MimeContentEnd 9057985 +Octets 92645 Lines 1262 -MimeEntityEnd 9057987 -MimeMessageEnd 9057987 +MimeEntityEnd 9057985 +MimeMessageEnd 9057985 MboxMarkerBegin 9057987 MboxMarkerEnd 9057994 MimeMessageBegin 9057996 @@ -6894,8 +6894,8 @@ MimeContentBegin 9058498 MimeContentEnd 9059667 Octets 1169 Lines 28 -MimeEntityEnd 9059669 -MimeMessageEnd 9059669 +MimeEntityEnd 9059667 +MimeMessageEnd 9059667 MboxMarkerBegin 9059669 MboxMarkerEnd 9059676 MimeMessageBegin 9059678 @@ -6913,7 +6913,7 @@ MimeContentBegin 9060851 MimeContentEnd 9061403 Octets 552 Lines 13 -MimeEntityEnd 9061405 +MimeEntityEnd 9061403 MultipartBoundaryBegin 9061405 MultipartBoundaryEnd 9061411 MimeEntityBegin 9061411 @@ -6922,7 +6922,7 @@ MimeContentBegin 9061531 MimeContentEnd 9119961 Octets 58430 Lines 790 -MimeEntityEnd 9119963 +MimeEntityEnd 9119961 MultipartBoundaryBegin 9119963 MultipartBoundaryEnd 9119969 MimeEntityBegin 9119969 @@ -6931,7 +6931,7 @@ MimeContentBegin 9119971 MimeContentEnd 9123837 Octets 3866 Lines 84 -MimeEntityEnd 9123839 +MimeEntityEnd 9123837 MultipartBoundaryBegin 9123839 MultipartBoundaryEnd 9123845 MimeEntityBegin 9123845 @@ -6940,7 +6940,7 @@ MimeContentBegin 9124003 MimeContentEnd 9154647 Octets 30644 Lines 1010 -MimeEntityEnd 9154649 +MimeEntityEnd 9154647 MultipartBoundaryBegin 9154649 MultipartBoundaryEnd 9154655 MimeEntityBegin 9154655 @@ -6949,7 +6949,7 @@ MimeContentBegin 9154764 MimeContentEnd 9155504 Octets 740 Lines 25 -MimeEntityEnd 9155506 +MimeEntityEnd 9155504 MultipartBoundaryBegin 9155506 MultipartBoundaryEnd 9155512 MimeEntityBegin 9155512 @@ -6958,16 +6958,16 @@ MimeContentBegin 9155632 MimeContentEnd 9156920 Octets 1288 Lines 25 -MimeEntityEnd 9156922 +MimeEntityEnd 9156920 MultipartEndBoundaryBegin 9156922 MultipartEndBoundaryEnd 9156928 MultipartEpilogueBegin 9156928 MultipartEpilogueEnd 9156930 -MimeContentEnd 9156932 -Octets 96089 +MimeContentEnd 9156930 +Octets 96087 Lines 1971 -MimeEntityEnd 9156932 -MimeMessageEnd 9156932 +MimeEntityEnd 9156930 +MimeMessageEnd 9156930 MboxMarkerBegin 9156932 MboxMarkerEnd 9156963 MimeMessageBegin 9156965 @@ -6985,7 +6985,7 @@ MimeContentBegin 9158156 MimeContentEnd 9159077 Octets 921 Lines 21 -MimeEntityEnd 9159079 +MimeEntityEnd 9159077 MultipartBoundaryBegin 9159079 MultipartBoundaryEnd 9159097 MimeEntityBegin 9159097 @@ -6994,16 +6994,16 @@ MimeContentBegin 9159179 MimeContentEnd 9159939 Octets 760 Lines 13 -MimeEntityEnd 9159941 +MimeEntityEnd 9159939 MultipartEndBoundaryBegin 9159941 MultipartEndBoundaryEnd 9159959 MultipartEpilogueBegin 9159959 MultipartEpilogueEnd 9159961 -MimeContentEnd 9159963 -Octets 1827 +MimeContentEnd 9159961 +Octets 1825 Lines 42 -MimeEntityEnd 9159963 -MimeMessageEnd 9159963 +MimeEntityEnd 9159961 +MimeMessageEnd 9159961 MboxMarkerBegin 9159963 MboxMarkerEnd 9159994 MimeMessageBegin 9159996 @@ -7021,7 +7021,7 @@ MimeContentBegin 9161422 MimeContentEnd 9162176 Octets 754 Lines 14 -MimeEntityEnd 9162178 +MimeEntityEnd 9162176 MultipartBoundaryBegin 9162178 MultipartBoundaryEnd 9162186 MimeEntityBegin 9162186 @@ -7030,16 +7030,16 @@ MimeContentBegin 9162369 MimeContentEnd 9164615 Octets 2246 Lines 32 -MimeEntityEnd 9164617 +MimeEntityEnd 9164615 MultipartEndBoundaryBegin 9164617 MultipartEndBoundaryEnd 9164625 MultipartEpilogueBegin 9164625 MultipartEpilogueEnd 9164625 -MimeContentEnd 9164627 -Octets 3470 +MimeContentEnd 9164625 +Octets 3468 Lines 60 -MimeEntityEnd 9164627 -MimeMessageEnd 9164627 +MimeEntityEnd 9164625 +MimeMessageEnd 9164625 MboxMarkerBegin 9164627 MboxMarkerEnd 9164658 MimeMessageBegin 9164660 @@ -7057,7 +7057,7 @@ MimeContentBegin 9166099 MimeContentEnd 9168957 Octets 2858 Lines 47 -MimeEntityEnd 9168959 +MimeEntityEnd 9168957 MultipartBoundaryBegin 9168959 MultipartBoundaryEnd 9168981 MimeEntityBegin 9168981 @@ -7066,16 +7066,16 @@ MimeContentBegin 9169164 MimeContentEnd 9171746 Octets 2582 Lines 36 -MimeEntityEnd 9171748 +MimeEntityEnd 9171746 MultipartEndBoundaryBegin 9171748 MultipartEndBoundaryEnd 9171770 MultipartEpilogueBegin 9171770 MultipartEpilogueEnd 9171770 -MimeContentEnd 9171772 -Octets 5952 +MimeContentEnd 9171770 +Octets 5950 Lines 97 -MimeEntityEnd 9171772 -MimeMessageEnd 9171772 +MimeEntityEnd 9171770 +MimeMessageEnd 9171770 MboxMarkerBegin 9171772 MboxMarkerEnd 9171779 MimeMessageBegin 9171781 @@ -7086,8 +7086,8 @@ MimeContentBegin 9171996 MimeContentEnd 9176246 Octets 4250 Lines 58 -MimeEntityEnd 9176248 -MimeMessageEnd 9176248 +MimeEntityEnd 9176246 +MimeMessageEnd 9176246 MboxMarkerBegin 9176248 MboxMarkerEnd 9176279 MimeMessageBegin 9176281 @@ -7105,7 +7105,7 @@ MimeContentBegin 9177413 MimeContentEnd 9188281 Octets 10868 Lines 147 -MimeEntityEnd 9188283 +MimeEntityEnd 9188281 MultipartBoundaryBegin 9188283 MultipartBoundaryEnd 9188311 MimeEntityBegin 9188311 @@ -7114,16 +7114,16 @@ MimeContentBegin 9188466 MimeContentEnd 9193140 Octets 4674 Lines 64 -MimeEntityEnd 9193142 +MimeEntityEnd 9193140 MultipartEndBoundaryBegin 9193142 MultipartEndBoundaryEnd 9193170 MultipartEpilogueBegin 9193170 MultipartEpilogueEnd 9193172 -MimeContentEnd 9193174 -Octets 15975 +MimeContentEnd 9193172 +Octets 15973 Lines 225 -MimeEntityEnd 9193174 -MimeMessageEnd 9193174 +MimeEntityEnd 9193172 +MimeMessageEnd 9193172 MboxMarkerBegin 9193174 MboxMarkerEnd 9193205 MimeMessageBegin 9193207 @@ -7134,8 +7134,8 @@ MimeContentBegin 9194031 MimeContentEnd 9211049 Octets 17018 Lines 258 -MimeEntityEnd 9211051 -MimeMessageEnd 9211051 +MimeEntityEnd 9211049 +MimeMessageEnd 9211049 MboxMarkerBegin 9211051 MboxMarkerEnd 9211082 MimeMessageBegin 9211084 @@ -7146,8 +7146,8 @@ MimeContentBegin 9211913 MimeContentEnd 9237261 Octets 25348 Lines 385 -MimeEntityEnd 9237263 -MimeMessageEnd 9237263 +MimeEntityEnd 9237261 +MimeMessageEnd 9237261 MboxMarkerBegin 9237263 MboxMarkerEnd 9237294 MimeMessageBegin 9237296 @@ -7158,8 +7158,8 @@ MimeContentBegin 9238125 MimeContentEnd 9274811 Octets 36686 Lines 556 -MimeEntityEnd 9274813 -MimeMessageEnd 9274813 +MimeEntityEnd 9274811 +MimeMessageEnd 9274811 MboxMarkerBegin 9274813 MboxMarkerEnd 9274844 MimeMessageBegin 9274846 @@ -7170,8 +7170,8 @@ MimeContentBegin 9275678 MimeContentEnd 9327768 Octets 52090 Lines 790 -MimeEntityEnd 9327770 -MimeMessageEnd 9327770 +MimeEntityEnd 9327768 +MimeMessageEnd 9327768 MboxMarkerBegin 9327770 MboxMarkerEnd 9327801 MimeMessageBegin 9327803 @@ -7182,8 +7182,8 @@ MimeContentBegin 9329218 MimeContentEnd 9330668 Octets 1450 Lines 20 -MimeEntityEnd 9330670 -MimeMessageEnd 9330670 +MimeEntityEnd 9330668 +MimeMessageEnd 9330668 MboxMarkerBegin 9330670 MboxMarkerEnd 9330701 MimeMessageBegin 9330703 @@ -7201,7 +7201,7 @@ MimeContentBegin 9332194 MimeContentEnd 9332304 Octets 110 Lines 4 -MimeEntityEnd 9332306 +MimeEntityEnd 9332304 MultipartBoundaryBegin 9332306 MultipartBoundaryEnd 9332351 MimeEntityBegin 9332351 @@ -7210,16 +7210,16 @@ MimeContentBegin 9332506 MimeContentEnd 9336492 Octets 3986 Lines 54 -MimeEntityEnd 9336494 +MimeEntityEnd 9336492 MultipartEndBoundaryBegin 9336494 MultipartEndBoundaryEnd 9336539 MultipartEpilogueBegin 9336539 MultipartEpilogueEnd 9336541 -MimeContentEnd 9336543 -Octets 4463 +MimeContentEnd 9336541 +Octets 4461 Lines 70 -MimeEntityEnd 9336543 -MimeMessageEnd 9336543 +MimeEntityEnd 9336541 +MimeMessageEnd 9336541 MboxMarkerBegin 9336543 MboxMarkerEnd 9336574 MimeMessageBegin 9336576 @@ -7230,8 +7230,8 @@ MimeContentBegin 9337807 MimeContentEnd 9341357 Octets 3550 Lines 56 -MimeEntityEnd 9341359 -MimeMessageEnd 9341359 +MimeEntityEnd 9341357 +MimeMessageEnd 9341357 MboxMarkerBegin 9341359 MboxMarkerEnd 9341390 MimeMessageBegin 9341392 @@ -7242,8 +7242,8 @@ MimeContentBegin 9342490 MimeContentEnd 9343160 Octets 670 Lines 10 -MimeEntityEnd 9343162 -MimeMessageEnd 9343162 +MimeEntityEnd 9343160 +MimeMessageEnd 9343160 MboxMarkerBegin 9343162 MboxMarkerEnd 9343169 MimeMessageBegin 9343171 @@ -7254,8 +7254,8 @@ MimeContentBegin 9343574 MimeContentEnd 9351298 Octets 7724 Lines 105 -MimeEntityEnd 9351300 -MimeMessageEnd 9351300 +MimeEntityEnd 9351298 +MimeMessageEnd 9351298 MboxMarkerBegin 9351300 MboxMarkerEnd 9351331 MimeMessageBegin 9351333 @@ -7271,13 +7271,13 @@ MimeContentBegin 9353538 MimeContentEnd 9354990 Octets 1452 Lines 21 -MimeEntityEnd 9354992 -MimeMessageEnd 9354992 -MimeContentEnd 9354992 -Octets 2857 +MimeEntityEnd 9354990 +MimeMessageEnd 9354990 +MimeContentEnd 9354990 +Octets 2855 Lines 44 -MimeEntityEnd 9354992 -MimeMessageEnd 9354992 +MimeEntityEnd 9354990 +MimeMessageEnd 9354990 MboxMarkerBegin 9354992 MboxMarkerEnd 9355023 MimeMessageBegin 9355025 @@ -7295,7 +7295,7 @@ MimeContentBegin 9355907 MimeContentEnd 9355923 Octets 16 Lines 2 -MimeEntityEnd 9355925 +MimeEntityEnd 9355923 MultipartBoundaryBegin 9355925 MultipartBoundaryEnd 9355953 MimeEntityBegin 9355953 @@ -7309,21 +7309,21 @@ MimeContentBegin 9357514 MimeContentEnd 9358966 Octets 1452 Lines 21 -MimeEntityEnd 9358968 -MimeMessageEnd 9358968 -MimeContentEnd 9358968 -Octets 2857 +MimeEntityEnd 9358966 +MimeMessageEnd 9358966 +MimeContentEnd 9358966 +Octets 2855 Lines 44 -MimeEntityEnd 9358968 +MimeEntityEnd 9358966 MultipartEndBoundaryBegin 9358968 MultipartEndBoundaryEnd 9358996 MultipartEpilogueBegin 9358996 MultipartEpilogueEnd 9358998 -MimeContentEnd 9359000 -Octets 3248 +MimeContentEnd 9358998 +Octets 3246 Lines 59 -MimeEntityEnd 9359000 -MimeMessageEnd 9359000 +MimeEntityEnd 9358998 +MimeMessageEnd 9358998 MboxMarkerBegin 9359000 MboxMarkerEnd 9359031 MimeMessageBegin 9359033 @@ -7341,7 +7341,7 @@ MimeContentBegin 9359897 MimeContentEnd 9359939 Octets 42 Lines 2 -MimeEntityEnd 9359941 +MimeEntityEnd 9359939 MultipartBoundaryBegin 9359941 MultipartBoundaryEnd 9359983 MimeEntityBegin 9359983 @@ -7350,16 +7350,16 @@ MimeContentBegin 9360138 MimeContentEnd 9365770 Octets 5632 Lines 77 -MimeEntityEnd 9365772 +MimeEntityEnd 9365770 MultipartEndBoundaryBegin 9365772 MultipartEndBoundaryEnd 9365814 MultipartEpilogueBegin 9365814 MultipartEpilogueEnd 9365816 -MimeContentEnd 9365818 -Octets 6104 +MimeContentEnd 9365816 +Octets 6102 Lines 92 -MimeEntityEnd 9365818 -MimeMessageEnd 9365818 +MimeEntityEnd 9365816 +MimeMessageEnd 9365816 MboxMarkerBegin 9365818 MboxMarkerEnd 9365849 MimeMessageBegin 9365851 @@ -7370,8 +7370,8 @@ MimeContentBegin 9366934 MimeContentEnd 9377310 Octets 10376 Lines 141 -MimeEntityEnd 9377312 -MimeMessageEnd 9377312 +MimeEntityEnd 9377310 +MimeMessageEnd 9377310 MboxMarkerBegin 9377312 MboxMarkerEnd 9377343 MimeMessageBegin 9377345 @@ -7389,7 +7389,7 @@ MimeContentBegin 9378928 MimeContentEnd 9379555 Octets 627 Lines 17 -MimeEntityEnd 9379557 +MimeEntityEnd 9379555 MultipartBoundaryBegin 9379557 MultipartBoundaryEnd 9379599 MimeEntityBegin 9379599 @@ -7398,16 +7398,16 @@ MimeContentBegin 9379754 MimeContentEnd 9381566 Octets 1812 Lines 25 -MimeEntityEnd 9381568 +MimeEntityEnd 9381566 MultipartEndBoundaryBegin 9381568 MultipartEndBoundaryEnd 9381610 MultipartEpilogueBegin 9381610 MultipartEpilogueEnd 9381612 -MimeContentEnd 9381614 -Octets 2869 +MimeContentEnd 9381612 +Octets 2867 Lines 55 -MimeEntityEnd 9381614 -MimeMessageEnd 9381614 +MimeEntityEnd 9381612 +MimeMessageEnd 9381612 MboxMarkerBegin 9381614 MboxMarkerEnd 9381645 MimeMessageBegin 9381647 @@ -7418,8 +7418,8 @@ MimeContentBegin 9382210 MimeContentEnd 9382740 Octets 530 Lines 8 -MimeEntityEnd 9382742 -MimeMessageEnd 9382742 +MimeEntityEnd 9382740 +MimeMessageEnd 9382740 MboxMarkerBegin 9382742 MboxMarkerEnd 9382749 MimeMessageBegin 9382751 @@ -7437,16 +7437,16 @@ MimeContentBegin 9384395 MimeContentEnd 9384998 Octets 603 Lines 16 -MimeEntityEnd 9385000 +MimeEntityEnd 9384998 MultipartEndBoundaryBegin 9385000 MultipartEndBoundaryEnd 9385042 MultipartEpilogueBegin 9385042 MultipartEpilogueEnd 9385042 -MimeContentEnd 9385044 -Octets 957 +MimeContentEnd 9385042 +Octets 955 Lines 24 -MimeEntityEnd 9385044 -MimeMessageEnd 9385044 +MimeEntityEnd 9385042 +MimeMessageEnd 9385042 MboxMarkerBegin 9385044 MboxMarkerEnd 9385051 MimeMessageBegin 9385053 @@ -7464,7 +7464,7 @@ MimeContentBegin 9386728 MimeContentEnd 9386835 Octets 107 Lines 7 -MimeEntityEnd 9386837 +MimeEntityEnd 9386835 MultipartBoundaryBegin 9386837 MultipartBoundaryEnd 9386879 MimeEntityBegin 9386879 @@ -7480,7 +7480,7 @@ MimeContentBegin 9387416 MimeContentEnd 9387511 Octets 95 Lines 5 -MimeEntityEnd 9387513 +MimeEntityEnd 9387511 MultipartBoundaryBegin 9387513 MultipartBoundaryEnd 9387553 MimeEntityBegin 9387553 @@ -7494,12 +7494,12 @@ MimeContentBegin 9388845 MimeContentEnd 9389055 Octets 210 Lines 6 -MimeEntityEnd 9389057 -MimeMessageEnd 9389057 -MimeContentEnd 9389057 -Octets 1408 +MimeEntityEnd 9389055 +MimeMessageEnd 9389055 +MimeContentEnd 9389055 +Octets 1406 Lines 35 -MimeEntityEnd 9389057 +MimeEntityEnd 9389055 MultipartBoundaryBegin 9389057 MultipartBoundaryEnd 9389097 MimeEntityBegin 9389097 @@ -7508,15 +7508,15 @@ MimeContentBegin 9389267 MimeContentEnd 9389757 Octets 490 Lines 12 -MimeEntityEnd 9389759 +MimeEntityEnd 9389757 MultipartEndBoundaryBegin 9389759 MultipartEndBoundaryEnd 9389799 MultipartEpilogueBegin 9389799 MultipartEpilogueEnd 9389799 -MimeContentEnd 9389801 -Octets 2755 +MimeContentEnd 9389799 +Octets 2753 Lines 70 -MimeEntityEnd 9389801 +MimeEntityEnd 9389799 MultipartBoundaryBegin 9389801 MultipartBoundaryEnd 9389843 MimeEntityBegin 9389843 @@ -7525,16 +7525,16 @@ MimeContentBegin 9390060 MimeContentEnd 9395354 Octets 5294 Lines 72 -MimeEntityEnd 9395356 +MimeEntityEnd 9395354 MultipartEndBoundaryBegin 9395356 MultipartEndBoundaryEnd 9395398 MultipartEpilogueBegin 9395398 MultipartEpilogueEnd 9395402 -MimeContentEnd 9395404 -Octets 8984 +MimeContentEnd 9395402 +Octets 8982 Lines 170 -MimeEntityEnd 9395404 -MimeMessageEnd 9395404 +MimeEntityEnd 9395402 +MimeMessageEnd 9395402 MboxMarkerBegin 9395404 MboxMarkerEnd 9395435 MimeMessageBegin 9395437 @@ -7545,8 +7545,8 @@ MimeContentBegin 9396672 MimeContentEnd 9399592 Octets 2920 Lines 39 -MimeEntityEnd 9399594 -MimeMessageEnd 9399594 +MimeEntityEnd 9399592 +MimeMessageEnd 9399592 MboxMarkerBegin 9399594 MboxMarkerEnd 9399625 MimeMessageBegin 9399627 @@ -7557,8 +7557,8 @@ MimeContentBegin 9400806 MimeContentEnd 9402958 Octets 2152 Lines 31 -MimeEntityEnd 9402960 -MimeMessageEnd 9402960 +MimeEntityEnd 9402958 +MimeMessageEnd 9402958 MboxMarkerBegin 9402960 MboxMarkerEnd 9402991 MimeMessageBegin 9402993 @@ -7576,7 +7576,7 @@ MimeContentBegin 9404194 MimeContentEnd 9404194 Octets 0 Lines 1 -MimeEntityEnd 9404196 +MimeEntityEnd 9404194 MultipartBoundaryBegin 9404196 MultipartBoundaryEnd 9404229 MimeEntityBegin 9404229 @@ -7585,16 +7585,16 @@ MimeContentBegin 9404311 MimeContentEnd 9407065 Octets 2754 Lines 42 -MimeEntityEnd 9407067 +MimeEntityEnd 9407065 MultipartEndBoundaryBegin 9407067 MultipartEndBoundaryEnd 9407100 MultipartEpilogueBegin 9407100 MultipartEpilogueEnd 9407102 -MimeContentEnd 9407104 -Octets 3012 +MimeContentEnd 9407102 +Octets 3010 Lines 54 -MimeEntityEnd 9407104 -MimeMessageEnd 9407104 +MimeEntityEnd 9407102 +MimeMessageEnd 9407102 MboxMarkerBegin 9407104 MboxMarkerEnd 9407135 MimeMessageBegin 9407137 @@ -7612,7 +7612,7 @@ MimeContentBegin 9408317 MimeContentEnd 9408783 Octets 466 Lines 14 -MimeEntityEnd 9408785 +MimeEntityEnd 9408783 MultipartBoundaryBegin 9408785 MultipartBoundaryEnd 9408826 MimeEntityBegin 9408826 @@ -7621,7 +7621,7 @@ MimeContentBegin 9408904 MimeContentEnd 9409741 Octets 837 Lines 27 -MimeEntityEnd 9409743 +MimeEntityEnd 9409741 MultipartBoundaryBegin 9409743 MultipartBoundaryEnd 9409784 MimeEntityBegin 9409784 @@ -7630,16 +7630,16 @@ MimeContentBegin 9409884 MimeContentEnd 9411100 Octets 1216 Lines 17 -MimeEntityEnd 9411102 +MimeEntityEnd 9411100 MultipartEndBoundaryBegin 9411102 MultipartEndBoundaryEnd 9411143 MultipartEpilogueBegin 9411143 MultipartEpilogueEnd 9411145 -MimeContentEnd 9411147 -Octets 2954 +MimeContentEnd 9411145 +Octets 2952 Lines 73 -MimeEntityEnd 9411147 -MimeMessageEnd 9411147 +MimeEntityEnd 9411145 +MimeMessageEnd 9411145 MboxMarkerBegin 9411147 MboxMarkerEnd 9411178 MimeMessageBegin 9411180 @@ -7657,7 +7657,7 @@ MimeContentBegin 9412394 MimeContentEnd 9412553 Octets 159 Lines 8 -MimeEntityEnd 9412555 +MimeEntityEnd 9412553 MultipartBoundaryBegin 9412555 MultipartBoundaryEnd 9412598 MimeEntityBegin 9412598 @@ -7666,16 +7666,16 @@ MimeContentBegin 9412680 MimeContentEnd 9416832 Octets 4152 Lines 57 -MimeEntityEnd 9416834 +MimeEntityEnd 9416832 MultipartEndBoundaryBegin 9416834 MultipartEndBoundaryEnd 9416877 MultipartEpilogueBegin 9416877 MultipartEpilogueEnd 9416879 -MimeContentEnd 9416881 -Octets 4605 +MimeContentEnd 9416879 +Octets 4603 Lines 76 -MimeEntityEnd 9416881 -MimeMessageEnd 9416881 +MimeEntityEnd 9416879 +MimeMessageEnd 9416879 MboxMarkerBegin 9416881 MboxMarkerEnd 9416888 MimeMessageBegin 9416890 @@ -7693,7 +7693,7 @@ MimeContentBegin 9417569 MimeContentEnd 9417727 Octets 158 Lines 4 -MimeEntityEnd 9417729 +MimeEntityEnd 9417727 MultipartBoundaryBegin 9417729 MultipartBoundaryEnd 9417773 MimeEntityBegin 9417773 @@ -7702,16 +7702,16 @@ MimeContentBegin 9417928 MimeContentEnd 9421898 Octets 3970 Lines 54 -MimeEntityEnd 9421900 +MimeEntityEnd 9421898 MultipartEndBoundaryBegin 9421900 MultipartEndBoundaryEnd 9421944 MultipartEpilogueBegin 9421944 MultipartEpilogueEnd 9421944 -MimeContentEnd 9421946 -Octets 4490 +MimeContentEnd 9421944 +Octets 4488 Lines 69 -MimeEntityEnd 9421946 -MimeMessageEnd 9421946 +MimeEntityEnd 9421944 +MimeMessageEnd 9421944 MboxMarkerBegin 9421946 MboxMarkerEnd 9421977 MimeMessageBegin 9421979 @@ -7729,7 +7729,7 @@ MimeContentBegin 9423425 MimeContentEnd 9423502 Octets 77 Lines 6 -MimeEntityEnd 9423504 +MimeEntityEnd 9423502 MultipartBoundaryBegin 9423504 MultipartBoundaryEnd 9423545 MimeEntityBegin 9423545 @@ -7738,16 +7738,16 @@ MimeContentBegin 9423643 MimeContentEnd 9427249 Octets 3606 Lines 48 -MimeEntityEnd 9427251 +MimeEntityEnd 9427249 MultipartEndBoundaryBegin 9427251 MultipartEndBoundaryEnd 9427292 MultipartEpilogueBegin 9427292 MultipartEpilogueEnd 9427294 -MimeContentEnd 9427296 -Octets 4133 +MimeContentEnd 9427294 +Octets 4131 Lines 67 -MimeEntityEnd 9427296 -MimeMessageEnd 9427296 +MimeEntityEnd 9427294 +MimeMessageEnd 9427294 MboxMarkerBegin 9427296 MboxMarkerEnd 9427327 MimeMessageBegin 9427329 @@ -7765,7 +7765,7 @@ MimeContentBegin 9428569 MimeContentEnd 9428647 Octets 78 Lines 5 -MimeEntityEnd 9428649 +MimeEntityEnd 9428647 MultipartBoundaryBegin 9428649 MultipartBoundaryEnd 9428683 MimeEntityBegin 9428683 @@ -7774,16 +7774,16 @@ MimeContentBegin 9428765 MimeContentEnd 9432539 Octets 3774 Lines 58 -MimeEntityEnd 9432541 +MimeEntityEnd 9432539 MultipartEndBoundaryBegin 9432541 MultipartEndBoundaryEnd 9432575 MultipartEpilogueBegin 9432575 MultipartEpilogueEnd 9432575 -MimeContentEnd 9432577 -Octets 4125 +MimeContentEnd 9432575 +Octets 4123 Lines 73 -MimeEntityEnd 9432577 -MimeMessageEnd 9432577 +MimeEntityEnd 9432575 +MimeMessageEnd 9432575 MboxMarkerBegin 9432577 MboxMarkerEnd 9432608 MimeMessageBegin 9432610 @@ -7801,7 +7801,7 @@ MimeContentBegin 9433938 MimeContentEnd 9434132 Octets 194 Lines 7 -MimeEntityEnd 9434134 +MimeEntityEnd 9434132 MultipartBoundaryBegin 9434134 MultipartBoundaryEnd 9434159 MimeEntityBegin 9434159 @@ -7815,21 +7815,21 @@ MimeContentBegin 9435012 MimeContentEnd 9435023 Octets 11 Lines 1 -MimeEntityEnd 9435025 -MimeMessageEnd 9435025 -MimeContentEnd 9435025 -Octets 834 +MimeEntityEnd 9435023 +MimeMessageEnd 9435023 +MimeContentEnd 9435023 +Octets 832 Lines 16 -MimeEntityEnd 9435025 +MimeEntityEnd 9435023 MultipartEndBoundaryBegin 9435025 MultipartEndBoundaryEnd 9435050 MultipartEpilogueBegin 9435050 MultipartEpilogueEnd 9435052 -MimeContentEnd 9435054 -Octets 1299 +MimeContentEnd 9435052 +Octets 1297 Lines 35 -MimeEntityEnd 9435054 -MimeMessageEnd 9435054 +MimeEntityEnd 9435052 +MimeMessageEnd 9435052 MboxMarkerBegin 9435054 MboxMarkerEnd 9435099 MimeMessageBegin 9435101 @@ -7840,8 +7840,8 @@ MimeContentBegin 9435272 MimeContentEnd 9470358 Octets 35086 Lines 593 -MimeEntityEnd 9470360 -MimeMessageEnd 9470360 +MimeEntityEnd 9470358 +MimeMessageEnd 9470358 MboxMarkerBegin 9470360 MboxMarkerEnd 9470405 MimeMessageBegin 9470407 @@ -7852,8 +7852,8 @@ MimeContentBegin 9470571 MimeContentEnd 9505657 Octets 35086 Lines 593 -MimeEntityEnd 9505659 -MimeMessageEnd 9505659 +MimeEntityEnd 9505657 +MimeMessageEnd 9505657 MboxMarkerBegin 9505659 MboxMarkerEnd 9505666 MimeMessageBegin 9505668 @@ -7864,8 +7864,8 @@ MimeContentBegin 9506276 MimeContentEnd 9507714 Octets 1438 Lines 39 -MimeEntityEnd 9507716 -MimeMessageEnd 9507716 +MimeEntityEnd 9507714 +MimeMessageEnd 9507714 MboxMarkerBegin 9507716 MboxMarkerEnd 9507723 MimeMessageBegin 9507725 @@ -7883,7 +7883,7 @@ MimeContentBegin 9508710 MimeContentEnd 9509065 Octets 355 Lines 11 -MimeEntityEnd 9509067 +MimeEntityEnd 9509065 MultipartBoundaryBegin 9509067 MultipartBoundaryEnd 9509107 MimeEntityBegin 9509107 @@ -7892,16 +7892,16 @@ MimeContentBegin 9509204 MimeContentEnd 9754734 Octets 245530 Lines 3962 -MimeEntityEnd 9754736 +MimeEntityEnd 9754734 MultipartEndBoundaryBegin 9754736 MultipartEndBoundaryEnd 9754776 MultipartEpilogueBegin 9754776 MultipartEpilogueEnd 9754778 -MimeContentEnd 9754780 -Octets 246138 +MimeContentEnd 9754778 +Octets 246136 Lines 3983 -MimeEntityEnd 9754780 -MimeMessageEnd 9754780 +MimeEntityEnd 9754778 +MimeMessageEnd 9754778 MboxMarkerBegin 9754780 MboxMarkerEnd 9754787 MimeMessageBegin 9754789 @@ -7919,16 +7919,16 @@ MimeContentBegin 9755625 MimeContentEnd 9834319 Octets 78694 Lines 406 -MimeEntityEnd 9834321 +MimeEntityEnd 9834319 MultipartEndBoundaryBegin 9834321 MultipartEndBoundaryEnd 9834349 MultipartEpilogueBegin 9834349 MultipartEpilogueEnd 9834353 -MimeContentEnd 9834355 -Octets 78958 +MimeContentEnd 9834353 +Octets 78956 Lines 417 -MimeEntityEnd 9834355 -MimeMessageEnd 9834355 +MimeEntityEnd 9834353 +MimeMessageEnd 9834353 MboxMarkerBegin 9834355 MboxMarkerEnd 9834362 MimeMessageBegin 9834364 @@ -7939,8 +7939,8 @@ MimeContentBegin 9834521 MimeContentEnd 9838129 Octets 3608 Lines 49 -MimeEntityEnd 9838131 -MimeMessageEnd 9838131 +MimeEntityEnd 9838129 +MimeMessageEnd 9838129 MboxMarkerBegin 9838131 MboxMarkerEnd 9838138 MimeMessageBegin 9838140 @@ -7958,7 +7958,7 @@ MimeContentBegin 9839173 MimeContentEnd 9839594 Octets 421 Lines 8 -MimeEntityEnd 9839596 +MimeEntityEnd 9839594 MultipartBoundaryBegin 9839596 MultipartBoundaryEnd 9839637 MimeEntityBegin 9839637 @@ -7974,7 +7974,7 @@ MimeContentBegin 9839862 MimeContentEnd 9839934 Octets 72 Lines 2 -MimeEntityEnd 9839936 +MimeEntityEnd 9839934 MultipartBoundaryBegin 9839936 MultipartBoundaryEnd 9839979 MimeEntityBegin 9839979 @@ -7983,7 +7983,7 @@ MimeContentBegin 9840082 MimeContentEnd 9850936 Octets 10854 Lines 158 -MimeEntityEnd 9850938 +MimeEntityEnd 9850936 MultipartBoundaryBegin 9850938 MultipartBoundaryEnd 9850981 MimeEntityBegin 9850981 @@ -7992,7 +7992,7 @@ MimeContentBegin 9851075 MimeContentEnd 9851141 Octets 66 Lines 3 -MimeEntityEnd 9851143 +MimeEntityEnd 9851141 MultipartBoundaryBegin 9851143 MultipartBoundaryEnd 9851186 MimeEntityBegin 9851186 @@ -8001,7 +8001,7 @@ MimeContentBegin 9851283 MimeContentEnd 9857273 Octets 5990 Lines 88 -MimeEntityEnd 9857275 +MimeEntityEnd 9857273 MultipartBoundaryBegin 9857275 MultipartBoundaryEnd 9857318 MimeEntityBegin 9857318 @@ -8010,7 +8010,7 @@ MimeContentBegin 9857412 MimeContentEnd 9857447 Octets 35 Lines 3 -MimeEntityEnd 9857449 +MimeEntityEnd 9857447 MultipartBoundaryBegin 9857449 MultipartBoundaryEnd 9857492 MimeEntityBegin 9857492 @@ -8019,7 +8019,7 @@ MimeContentBegin 9857597 MimeContentEnd 9869413 Octets 11816 Lines 171 -MimeEntityEnd 9869415 +MimeEntityEnd 9869413 MultipartBoundaryBegin 9869415 MultipartBoundaryEnd 9869458 MimeEntityBegin 9869458 @@ -8028,24 +8028,24 @@ MimeContentBegin 9869552 MimeContentEnd 9869585 Octets 33 Lines 3 -MimeEntityEnd 9869587 +MimeEntityEnd 9869585 MultipartEndBoundaryBegin 9869587 MultipartEndBoundaryEnd 9869630 MultipartEpilogueBegin 9869630 MultipartEpilogueEnd 9869632 -MimeContentEnd 9869634 -Octets 29909 +MimeContentEnd 9869632 +Octets 29907 Lines 461 -MimeEntityEnd 9869634 +MimeEntityEnd 9869632 MultipartEndBoundaryBegin 9869634 MultipartEndBoundaryEnd 9869675 MultipartEpilogueBegin 9869675 MultipartEpilogueEnd 9869675 -MimeContentEnd 9869677 -Octets 30749 +MimeContentEnd 9869675 +Octets 30747 Lines 480 -MimeEntityEnd 9869677 -MimeMessageEnd 9869677 +MimeEntityEnd 9869675 +MimeMessageEnd 9869675 MboxMarkerBegin 9869677 MboxMarkerEnd 9869684 MimeMessageBegin 9869686 @@ -8056,8 +8056,8 @@ MimeContentBegin 9869745 MimeContentEnd 9870980 Octets 1235 Lines 28 -MimeEntityEnd 9870982 -MimeMessageEnd 9870982 +MimeEntityEnd 9870980 +MimeMessageEnd 9870980 MboxMarkerBegin 9870982 MboxMarkerEnd 9871013 MimeMessageBegin 9871015 @@ -8068,8 +8068,8 @@ MimeContentBegin 9871171 MimeContentEnd 9874346 Octets 3175 Lines 68 -MimeEntityEnd 9874348 -MimeMessageEnd 9874348 +MimeEntityEnd 9874346 +MimeMessageEnd 9874346 MboxMarkerBegin 9874348 MboxMarkerEnd 9874379 MimeMessageBegin 9874381 @@ -8087,7 +8087,7 @@ MimeContentBegin 9876403 MimeContentEnd 9877284 Octets 881 Lines 19 -MimeEntityEnd 9877286 +MimeEntityEnd 9877284 MultipartBoundaryBegin 9877286 MultipartBoundaryEnd 9877331 MimeEntityBegin 9877331 @@ -8096,16 +8096,16 @@ MimeContentBegin 9877497 MimeContentEnd 9881199 Octets 3702 Lines 62 -MimeEntityEnd 9881201 +MimeEntityEnd 9881199 MultipartEndBoundaryBegin 9881201 MultipartEndBoundaryEnd 9881246 MultipartEpilogueBegin 9881246 MultipartEpilogueEnd 9881248 -MimeContentEnd 9881250 -Octets 4973 +MimeContentEnd 9881248 +Octets 4971 Lines 93 -MimeEntityEnd 9881250 -MimeMessageEnd 9881250 +MimeEntityEnd 9881248 +MimeMessageEnd 9881248 MboxMarkerBegin 9881250 MboxMarkerEnd 9881257 MimeMessageBegin 9881259 @@ -8123,7 +8123,7 @@ MimeContentBegin 9881874 MimeContentEnd 9882856 Octets 982 Lines 20 -MimeEntityEnd 9882858 +MimeEntityEnd 9882856 MultipartBoundaryBegin 9882858 MultipartBoundaryEnd 9882875 MimeEntityBegin 9882875 @@ -8132,16 +8132,16 @@ MimeContentBegin 9882938 MimeContentEnd 10000250 Octets 117312 Lines 1587 -MimeEntityEnd 10000252 +MimeEntityEnd 10000250 MultipartEndBoundaryBegin 10000252 MultipartEndBoundaryEnd 10000269 MultipartEpilogueBegin 10000269 MultipartEpilogueEnd 10000273 -MimeContentEnd 10000275 -Octets 118449 +MimeContentEnd 10000273 +Octets 118447 Lines 1618 -MimeEntityEnd 10000275 -MimeMessageEnd 10000275 +MimeEntityEnd 10000273 +MimeMessageEnd 10000273 MboxMarkerBegin 10000275 MboxMarkerEnd 10000282 MimeMessageBegin 10000284 @@ -8159,7 +8159,7 @@ MimeContentBegin 10001344 MimeContentEnd 10010656 Octets 9312 Lines 350 -MimeEntityEnd 10010658 +MimeEntityEnd 10010656 MultipartBoundaryBegin 10010658 MultipartBoundaryEnd 10010699 MimeEntityBegin 10010699 @@ -8175,7 +8175,7 @@ MimeContentBegin 10010924 MimeContentEnd 10013768 Octets 2844 Lines 70 -MimeEntityEnd 10013770 +MimeEntityEnd 10013768 MultipartBoundaryBegin 10013770 MultipartBoundaryEnd 10013813 MimeEntityBegin 10013813 @@ -8189,12 +8189,12 @@ MimeContentBegin 10014045 MimeContentEnd 10014049 Octets 4 Lines 3 -MimeEntityEnd 10014051 -MimeMessageEnd 10014051 -MimeContentEnd 10014051 -Octets 35 +MimeEntityEnd 10014049 +MimeMessageEnd 10014049 +MimeContentEnd 10014049 +Octets 33 Lines 5 -MimeEntityEnd 10014051 +MimeEntityEnd 10014049 MultipartBoundaryBegin 10014051 MultipartBoundaryEnd 10014094 MimeEntityBegin 10014094 @@ -8203,7 +8203,7 @@ MimeContentBegin 10014188 MimeContentEnd 10015184 Octets 996 Lines 23 -MimeEntityEnd 10015186 +MimeEntityEnd 10015184 MultipartBoundaryBegin 10015186 MultipartBoundaryEnd 10015229 MimeEntityBegin 10015229 @@ -8212,7 +8212,7 @@ MimeContentBegin 10015349 MimeContentEnd 10015723 Octets 374 Lines 16 -MimeEntityEnd 10015725 +MimeEntityEnd 10015723 MultipartBoundaryBegin 10015725 MultipartBoundaryEnd 10015768 MimeEntityBegin 10015768 @@ -8221,7 +8221,7 @@ MimeContentBegin 10015862 MimeContentEnd 10015874 Octets 12 Lines 3 -MimeEntityEnd 10015876 +MimeEntityEnd 10015874 MultipartBoundaryBegin 10015876 MultipartBoundaryEnd 10015919 MimeEntityBegin 10015919 @@ -8235,12 +8235,12 @@ MimeContentBegin 10016139 MimeContentEnd 10016141 Octets 2 Lines 2 -MimeEntityEnd 10016143 -MimeMessageEnd 10016143 -MimeContentEnd 10016143 -Octets 33 +MimeEntityEnd 10016141 +MimeMessageEnd 10016141 +MimeContentEnd 10016141 +Octets 31 Lines 4 -MimeEntityEnd 10016143 +MimeEntityEnd 10016141 MultipartBoundaryBegin 10016143 MultipartBoundaryEnd 10016186 MimeEntityBegin 10016186 @@ -8249,7 +8249,7 @@ MimeContentBegin 10016280 MimeContentEnd 10016292 Octets 12 Lines 3 -MimeEntityEnd 10016294 +MimeEntityEnd 10016292 MultipartBoundaryBegin 10016294 MultipartBoundaryEnd 10016337 MimeEntityBegin 10016337 @@ -8258,7 +8258,7 @@ MimeContentBegin 10016447 MimeContentEnd 10019473 Octets 3026 Lines 44 -MimeEntityEnd 10019475 +MimeEntityEnd 10019473 MultipartBoundaryBegin 10019475 MultipartBoundaryEnd 10019518 MimeEntityBegin 10019518 @@ -8267,24 +8267,24 @@ MimeContentBegin 10019612 MimeContentEnd 10026464 Octets 6852 Lines 261 -MimeEntityEnd 10026466 +MimeEntityEnd 10026464 MultipartEndBoundaryBegin 10026466 MultipartEndBoundaryEnd 10026509 MultipartEpilogueBegin 10026509 MultipartEpilogueEnd 10026511 -MimeContentEnd 10026513 -Octets 15726 +MimeContentEnd 10026511 +Octets 15724 Lines 476 -MimeEntityEnd 10026513 +MimeEntityEnd 10026511 MultipartEndBoundaryBegin 10026513 MultipartEndBoundaryEnd 10026554 MultipartEpilogueBegin 10026554 MultipartEpilogueEnd 10026556 -MimeContentEnd 10026558 -Octets 25459 +MimeContentEnd 10026556 +Octets 25457 Lines 838 -MimeEntityEnd 10026558 -MimeMessageEnd 10026558 +MimeEntityEnd 10026556 +MimeMessageEnd 10026556 MboxMarkerBegin 10026558 MboxMarkerEnd 10026565 MimeMessageBegin 10026567 @@ -8302,7 +8302,7 @@ MimeContentBegin 10027715 MimeContentEnd 10028056 Octets 341 Lines 9 -MimeEntityEnd 10028058 +MimeEntityEnd 10028056 MultipartBoundaryBegin 10028058 MultipartBoundaryEnd 10028069 MimeEntityBegin 10028069 @@ -8311,7 +8311,7 @@ MimeContentBegin 10028131 MimeContentEnd 10058521 Octets 30390 Lines 412 -MimeEntityEnd 10058523 +MimeEntityEnd 10058521 MultipartBoundaryBegin 10058523 MultipartBoundaryEnd 10058534 MimeEntityBegin 10058534 @@ -8320,16 +8320,16 @@ MimeContentBegin 10058536 MimeContentEnd 10058717 Octets 181 Lines 10 -MimeEntityEnd 10058719 +MimeEntityEnd 10058717 MultipartEndBoundaryBegin 10058719 MultipartEndBoundaryEnd 10058730 MultipartEpilogueBegin 10058730 MultipartEpilogueEnd 10058732 -MimeContentEnd 10058734 -Octets 31032 +MimeContentEnd 10058732 +Octets 31030 Lines 441 -MimeEntityEnd 10058734 -MimeMessageEnd 10058734 +MimeEntityEnd 10058732 +MimeMessageEnd 10058732 MboxMarkerBegin 10058734 MboxMarkerEnd 10058741 MimeMessageBegin 10058743 @@ -8340,8 +8340,8 @@ MimeContentBegin 10060481 MimeContentEnd 10246231 Octets 185750 Lines 2952 -MimeEntityEnd 10246233 -MimeMessageEnd 10246233 +MimeEntityEnd 10246231 +MimeMessageEnd 10246231 MboxMarkerBegin 10246233 MboxMarkerEnd 10246240 MimeMessageBegin 10246242 @@ -8359,7 +8359,7 @@ MimeContentBegin 10246995 MimeContentEnd 10247016 Octets 21 Lines 1 -MimeEntityEnd 10247018 +MimeEntityEnd 10247016 MultipartBoundaryBegin 10247018 MultipartBoundaryEnd 10247046 MimeEntityBegin 10247046 @@ -8368,7 +8368,7 @@ MimeContentBegin 10247203 MimeContentEnd 10331377 Octets 84174 Lines 434 -MimeEntityEnd 10331379 +MimeEntityEnd 10331377 MultipartBoundaryBegin 10331379 MultipartBoundaryEnd 10331407 MimeEntityBegin 10331407 @@ -8377,16 +8377,16 @@ MimeContentBegin 10331409 MimeContentEnd 10331676 Octets 267 Lines 9 -MimeEntityEnd 10331678 +MimeEntityEnd 10331676 MultipartEndBoundaryBegin 10331678 MultipartEndBoundaryEnd 10331706 MultipartEpilogueBegin 10331706 MultipartEpilogueEnd 10331708 -MimeContentEnd 10331710 -Octets 84745 +MimeContentEnd 10331708 +Octets 84743 Lines 456 -MimeEntityEnd 10331710 -MimeMessageEnd 10331710 +MimeEntityEnd 10331708 +MimeMessageEnd 10331708 MboxMarkerBegin 10331710 MboxMarkerEnd 10331717 MimeMessageBegin 10331719 @@ -8404,7 +8404,7 @@ MimeContentBegin 10332431 MimeContentEnd 10332497 Octets 66 Lines 1 -MimeEntityEnd 10332499 +MimeEntityEnd 10332497 MultipartBoundaryBegin 10332499 MultipartBoundaryEnd 10332527 MimeEntityBegin 10332527 @@ -8413,7 +8413,7 @@ MimeContentBegin 10332693 MimeContentEnd 10365025 Octets 32332 Lines 167 -MimeEntityEnd 10365027 +MimeEntityEnd 10365025 MultipartBoundaryBegin 10365027 MultipartBoundaryEnd 10365055 MimeEntityBegin 10365055 @@ -8422,7 +8422,7 @@ MimeContentBegin 10365057 MimeContentEnd 10365075 Octets 18 Lines 2 -MimeEntityEnd 10365077 +MimeEntityEnd 10365075 MultipartBoundaryBegin 10365077 MultipartBoundaryEnd 10365105 MimeEntityBegin 10365105 @@ -8431,7 +8431,7 @@ MimeContentBegin 10365269 MimeContentEnd 10366359 Octets 1090 Lines 6 -MimeEntityEnd 10366361 +MimeEntityEnd 10366359 MultipartBoundaryBegin 10366361 MultipartBoundaryEnd 10366389 MimeEntityBegin 10366389 @@ -8440,7 +8440,7 @@ MimeContentBegin 10366391 MimeContentEnd 10366423 Octets 32 Lines 3 -MimeEntityEnd 10366425 +MimeEntityEnd 10366423 MultipartBoundaryBegin 10366425 MultipartBoundaryEnd 10366453 MimeEntityBegin 10366453 @@ -8449,7 +8449,7 @@ MimeContentBegin 10366524 MimeContentEnd 10554551 Octets 188027 Lines 1991 -MimeEntityEnd 10554553 +MimeEntityEnd 10554551 MultipartBoundaryBegin 10554553 MultipartBoundaryEnd 10554581 MimeEntityBegin 10554581 @@ -8458,16 +8458,16 @@ MimeContentBegin 10554583 MimeContentEnd 10554591 Octets 8 Lines 1 -MimeEntityEnd 10554593 +MimeEntityEnd 10554591 MultipartEndBoundaryBegin 10554593 MultipartEndBoundaryEnd 10554621 MultipartEpilogueBegin 10554621 MultipartEpilogueEnd 10554623 -MimeContentEnd 10554625 -Octets 222224 +MimeContentEnd 10554623 +Octets 222222 Lines 2197 -MimeEntityEnd 10554625 -MimeMessageEnd 10554625 +MimeEntityEnd 10554623 +MimeMessageEnd 10554623 MboxMarkerBegin 10554625 MboxMarkerEnd 10554632 MimeMessageBegin 10554634 @@ -8478,8 +8478,8 @@ MimeContentBegin 10554906 MimeContentEnd 10630586 Octets 75680 Lines 1023 -MimeEntityEnd 10630588 -MimeMessageEnd 10630588 +MimeEntityEnd 10630586 +MimeMessageEnd 10630586 MboxMarkerBegin 10630588 MboxMarkerEnd 10630595 MimeMessageBegin 10630597 @@ -8497,7 +8497,7 @@ MimeContentBegin 10632491 MimeContentEnd 10634372 Octets 1881 Lines 35 -MimeEntityEnd 10634374 +MimeEntityEnd 10634372 MultipartBoundaryBegin 10634374 MultipartBoundaryEnd 10634433 MimeEntityBegin 10634433 @@ -8513,7 +8513,7 @@ MimeContentBegin 10634676 MimeContentEnd 10636704 Octets 2028 Lines 30 -MimeEntityEnd 10636706 +MimeEntityEnd 10636704 MultipartBoundaryBegin 10636706 MultipartBoundaryEnd 10636767 MimeEntityBegin 10636767 @@ -8522,7 +8522,7 @@ MimeContentBegin 10636829 MimeContentEnd 10644867 Octets 8038 Lines 110 -MimeEntityEnd 10644869 +MimeEntityEnd 10644867 MultipartBoundaryBegin 10644869 MultipartBoundaryEnd 10644930 MimeEntityBegin 10644930 @@ -8531,7 +8531,7 @@ MimeContentBegin 10645003 MimeContentEnd 10645008 Octets 5 Lines 3 -MimeEntityEnd 10645010 +MimeEntityEnd 10645008 MultipartBoundaryBegin 10645010 MultipartBoundaryEnd 10645071 MimeEntityBegin 10645071 @@ -8540,24 +8540,24 @@ MimeContentBegin 10645168 MimeContentEnd 10687620 Octets 42452 Lines 575 -MimeEntityEnd 10687622 +MimeEntityEnd 10687620 MultipartEndBoundaryBegin 10687622 MultipartEndBoundaryEnd 10687683 MultipartEpilogueBegin 10687683 MultipartEpilogueEnd 10687685 -MimeContentEnd 10687687 -Octets 53148 +MimeContentEnd 10687685 +Octets 53146 Lines 737 -MimeEntityEnd 10687687 +MimeEntityEnd 10687685 MultipartEndBoundaryBegin 10687687 MultipartEndBoundaryEnd 10687746 MultipartEpilogueBegin 10687746 MultipartEpilogueEnd 10687748 -MimeContentEnd 10687750 -Octets 55854 +MimeContentEnd 10687748 +Octets 55852 Lines 788 -MimeEntityEnd 10687750 -MimeMessageEnd 10687750 +MimeEntityEnd 10687748 +MimeMessageEnd 10687748 MboxMarkerBegin 10687750 MboxMarkerEnd 10687757 MimeMessageBegin 10687759 @@ -8568,8 +8568,8 @@ MimeContentBegin 10687916 MimeContentEnd 10692786 Octets 4870 Lines 68 -MimeEntityEnd 10692788 -MimeMessageEnd 10692788 +MimeEntityEnd 10692786 +MimeMessageEnd 10692786 MboxMarkerBegin 10692788 MboxMarkerEnd 10692795 MimeMessageBegin 10692797 @@ -8587,7 +8587,7 @@ MimeContentBegin 10693947 MimeContentEnd 10694323 Octets 376 Lines 9 -MimeEntityEnd 10694325 +MimeEntityEnd 10694323 MultipartBoundaryBegin 10694325 MultipartBoundaryEnd 10694366 MimeEntityBegin 10694366 @@ -8603,7 +8603,7 @@ MimeContentBegin 10694570 MimeContentEnd 10694663 Octets 93 Lines 5 -MimeEntityEnd 10694665 +MimeEntityEnd 10694663 MultipartBoundaryBegin 10694665 MultipartBoundaryEnd 10694708 MimeEntityBegin 10694708 @@ -8612,7 +8612,7 @@ MimeContentBegin 10694826 MimeContentEnd 10700572 Octets 5746 Lines 84 -MimeEntityEnd 10700574 +MimeEntityEnd 10700572 MultipartBoundaryBegin 10700574 MultipartBoundaryEnd 10700617 MimeEntityBegin 10700617 @@ -8621,21 +8621,21 @@ MimeContentBegin 10700690 MimeContentEnd 10700899 Octets 209 Lines 7 -MimeEntityEnd 10700901 +MimeEntityEnd 10700899 MultipartEndBoundaryBegin 10700901 MultipartEndBoundaryEnd 10700944 MultipartEpilogueBegin 10700944 MultipartEpilogueEnd 10700946 -MimeContentEnd 10700948 -Octets 6494 +MimeContentEnd 10700946 +Octets 6492 Lines 111 -MimeEntityEnd 10700948 +MimeEntityEnd 10700946 MultipartEndBoundaryBegin 10700948 MultipartEndBoundaryEnd 10700989 MultipartEpilogueBegin 10700989 MultipartEpilogueEnd 10700991 -MimeContentEnd 10700991 -Octets 7432 +MimeContentEnd 10700989 +Octets 7430 Lines 133 -MimeEntityEnd 10700991 -MimeMessageEnd 10700991 +MimeEntityEnd 10700989 +MimeMessageEnd 10700989 From 7f1f7ce7d016e3dc045a8cb5e0512a17c1b17f18 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 09:42:43 -0400 Subject: [PATCH 636/741] Fixed parsing of truncated/broken message/rfc822 parts to emit offset events --- MimeKit/AsyncMimeParser.cs | 9 ++++++++- MimeKit/MimeParser.cs | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index a0447e615b..0a4fbda773 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -294,6 +294,9 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (await ReadAheadAsync (atleast, 0, cancellationToken).ConfigureAwait (false) <= 0) { + OnMimeContentEnd (rfc822, beginOffset); + OnMimeContentOctets (rfc822, 0); + OnMimeContentLines (rfc822, 0); boundary = BoundaryType.Eos; return; } @@ -318,8 +321,12 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio return; case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... - if (!IsMboxMarker (start)) + if (!IsMboxMarker (start)) { + OnMimeContentEnd (rfc822, beginOffset); + OnMimeContentOctets (rfc822, 0); + OnMimeContentLines (rfc822, 0); return; + } break; } } diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 45dac86b7c..ad05a8b528 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1559,6 +1559,9 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (ReadAhead (atleast, 0, cancellationToken) <= 0) { + OnMimeContentEnd (rfc822, beginOffset); + OnMimeContentOctets (rfc822, 0); + OnMimeContentLines (rfc822, 0); boundary = BoundaryType.Eos; return; } @@ -1581,8 +1584,12 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca return; case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... - if (!IsMboxMarker (start)) + if (!IsMboxMarker (start)) { + OnMimeContentEnd (rfc822, beginOffset); + OnMimeContentOctets (rfc822, 0); + OnMimeContentLines (rfc822, 0); return; + } break; } } From 15a5d1e746b32dd9485af7e393e464319af85f26 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 16:21:06 -0400 Subject: [PATCH 637/741] Treat unspecified 'k' values in DKIM DNS records as k=rsa Fixes issue #583 --- MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs index 3edc6a9804..d86c8b83ae 100644 --- a/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs +++ b/MimeKit/Cryptography/DkimPublicKeyLocatorBase.cs @@ -67,7 +67,7 @@ public abstract class DkimPublicKeyLocatorBase : IDkimPublicKeyLocator protected AsymmetricKeyParameter GetPublicKey (string txt) { AsymmetricKeyParameter pubkey; - string k = null, p = null; + string k = "rsa", p = null; int index = 0; if (txt == null) @@ -117,7 +117,7 @@ protected AsymmetricKeyParameter GetPublicKey (string txt) index++; } - if (k != null && p != null) { + if (p != null) { if (k == "ed25519") { var decoded = Convert.FromBase64String (p); From e17bb1fa019fbd6f1435a3e74f9023962ad92cef Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 20:57:53 -0400 Subject: [PATCH 638/741] Update DkimPublicKeyLocatorBaseTests.cs --- .../DkimPublicKeyLocatorBaseTests.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs index db4f381223..d0a0b90ba3 100644 --- a/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs +++ b/UnitTests/Cryptography/DkimPublicKeyLocatorBaseTests.cs @@ -29,6 +29,7 @@ using NUnit.Framework; using MimeKit; +using Org.BouncyCastle.Crypto.Parameters; namespace UnitTests.Cryptography { [TestFixture] @@ -53,16 +54,28 @@ public void TestParseExceptions () locator.Add ("empty._domainkey.example.org", string.Empty); locator.Add ("whitespace._domainkey.example.org", " "); locator.Add ("no-k-or-p-params._domainkey.example.org", "v=DKIM1; x=abc; y=def"); - locator.Add ("no-k-param._domainkey.example.org", "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + //locator.Add ("no-k-param._domainkey.example.org", "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); locator.Add ("no-p-param._domainkey.example.org", "v=DKIM1; k=rsa"); locator.Add ("unknown-algorithm._domainkey.example.org", "v=DKIM1; k=dummy; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id"); Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "empty")); Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "whitespace")); Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-k-or-p-params")); - Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-k-param")); + //Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-k-param")); Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "no-p-param")); Assert.Throws (() => locator.LocatePublicKey ("dns/txt", "example.org", "unknown-algorithm")); } + + [Test] + public void TestParseMissingKParamDefaultsToRsa () + { + var locator = new DkimPublicKeyLocator (); + + locator.Add ("no-k-param._domainkey.example.org", "v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); + + var key = locator.LocatePublicKey ("dns/txt", "example.org", "no-k-param"); + + Assert.IsInstanceOf (key); + } } } From bf57c25a2ed352d0fcfcf6d7a816640462f8dab8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 21:13:22 -0400 Subject: [PATCH 639/741] Removed MimeParser.OnMimeContentBegin/End These methods are superflous with OnMimeEntityHeadersEnd and OnMimeEntityEnd. --- MimeKit/AsyncMimeParser.cs | 13 - MimeKit/MimeParser.cs | 37 - UnitTests/MimeParserTests.cs | 12 - .../mbox/content-length.dos-offsets.txt | 210 --- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 1602 ----------------- 5 files changed, 1874 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 0a4fbda773..69df9b0ef0 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -257,8 +257,6 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation ScanContentResult result; Stream content; - OnMimeContentBegin (part, beginOffset); - if (persistent) { using (var measured = new MeasuringStream ()) { result = await ScanContentAsync (measured, true, cancellationToken).ConfigureAwait (false); @@ -273,7 +271,6 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation endOffset = beginOffset + content.Length; } - OnMimeContentEnd (part, endOffset); OnMimeContentOctets (part, endOffset - beginOffset); OnMimeContentLines (part, lineNumber - beginLineNumber); @@ -288,13 +285,10 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio var beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; - OnMimeContentBegin (rfc822, beginOffset); - if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (await ReadAheadAsync (atleast, 0, cancellationToken).ConfigureAwait (false) <= 0) { - OnMimeContentEnd (rfc822, beginOffset); OnMimeContentOctets (rfc822, 0); OnMimeContentLines (rfc822, 0); boundary = BoundaryType.Eos; @@ -322,7 +316,6 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) { - OnMimeContentEnd (rfc822, beginOffset); OnMimeContentOctets (rfc822, 0); OnMimeContentLines (rfc822, 0); return; @@ -372,7 +365,6 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); - OnMimeContentEnd (rfc822, endOffset); OnMimeContentOctets (rfc822, endOffset - beginOffset); OnMimeContentLines (rfc822, lineNumber - beginLineNumber); } @@ -462,8 +454,6 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation var marker = multipart.Boundary; long endOffset; - OnMimeContentBegin (multipart, beginOffset); - if (marker == null) { #if DEBUG Debug.WriteLine ("Multipart without a boundary encountered!"); @@ -473,7 +463,6 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); endOffset = GetEndOffset (inputIndex); - OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; @@ -498,7 +487,6 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); endOffset = GetEndOffset (inputIndex); - OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; @@ -506,7 +494,6 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation endOffset = GetEndOffset (inputIndex); - OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); OnMimeContentLines (multipart, lineNumber - beginLineNumber); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index ad05a8b528..5ef1c14325 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -521,30 +521,6 @@ protected virtual void OnMimeEntityHeadersEnd (MimeEntity entity, long offset) { } - /// - /// Invoked when the beginning of a MIME entity's content is found. - /// - /// - /// Invoked when the beginning of a MIME entity's content is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME entity. - /// The stream offset at which the MIME entity's content begins. - protected virtual void OnMimeContentBegin (MimeEntity entity, long offset) - { - } - - /// - /// Invoked when the end of a MIME entity's content is found. - /// - /// - /// Invoked when the end of a MIME entity's content is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME entity. - /// The stream offset at which the MIME entity's content ends. - protected virtual void OnMimeContentEnd (MimeEntity entity, long offset) - { - } - /// /// Invoked when a multipart boundary is found. /// @@ -1522,8 +1498,6 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can ScanContentResult result; Stream content; - OnMimeContentBegin (part, beginOffset); - if (persistent) { using (var measured = new MeasuringStream ()) { result = ScanContent (inbuf, measured, true, cancellationToken); @@ -1538,7 +1512,6 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can endOffset = beginOffset + content.Length; } - OnMimeContentEnd (part, endOffset); OnMimeContentOctets (part, endOffset - beginOffset); OnMimeContentLines (part, lineNumber - beginLineNumber); @@ -1553,13 +1526,10 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca var beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; - OnMimeContentBegin (rfc822, beginOffset); - if (bounds.Count > 0) { int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (ReadAhead (atleast, 0, cancellationToken) <= 0) { - OnMimeContentEnd (rfc822, beginOffset); OnMimeContentOctets (rfc822, 0); OnMimeContentLines (rfc822, 0); boundary = BoundaryType.Eos; @@ -1585,7 +1555,6 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) { - OnMimeContentEnd (rfc822, beginOffset); OnMimeContentOctets (rfc822, 0); OnMimeContentLines (rfc822, 0); return; @@ -1633,7 +1602,6 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); - OnMimeContentEnd (rfc822, endOffset); OnMimeContentOctets (rfc822, endOffset - beginOffset); OnMimeContentLines (rfc822, lineNumber - beginLineNumber); } @@ -1736,8 +1704,6 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can var marker = multipart.Boundary; long endOffset; - OnMimeContentBegin (multipart, beginOffset); - if (marker == null) { #if DEBUG Debug.WriteLine ("Multipart without a boundary encountered!"); @@ -1747,7 +1713,6 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can MultipartScanPreamble (multipart, inbuf, cancellationToken); endOffset = GetEndOffset (inputIndex); - OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; @@ -1772,7 +1737,6 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can MultipartScanEpilogue (multipart, inbuf, cancellationToken); endOffset = GetEndOffset (inputIndex); - OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); OnMimeContentLines (multipart, lineNumber - beginLineNumber); return; @@ -1780,7 +1744,6 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can endOffset = GetEndOffset (inputIndex); - OnMimeContentEnd (multipart, endOffset); OnMimeContentOctets (multipart, endOffset - beginOffset); OnMimeContentLines (multipart, lineNumber - beginLineNumber); diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 0e363bda54..c604bbfd3d 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -600,8 +600,6 @@ enum MimeParserOffsetLocation MimeEntityBegin, MimeEntityHeadersEnd, MimeEntityEnd, - MimeContentBegin, - MimeContentEnd, MultipartBoundaryBegin, MultipartBoundaryEnd, MultipartEndBoundaryBegin, @@ -700,16 +698,6 @@ protected override void OnMimeEntityHeadersEnd (MimeEntity entity, long offset) Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityHeadersEnd, offset)); } - protected override void OnMimeContentBegin (MimeEntity entity, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeContentBegin, offset)); - } - - protected override void OnMimeContentEnd (MimeEntity entity, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeContentEnd, offset)); - } - protected override void OnMultipartBoundaryBegin (Multipart multipart, long offset) { Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartBoundaryBegin, offset)); diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index 8d3f42606c..aad0733ffd 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -4,15 +4,12 @@ MimeMessageBegin 9 MimeMessageHeadersEnd 675 MimeEntityBegin 9 MimeEntityHeadersEnd 675 -MimeContentBegin 675 MultipartPreambleBegin 675 MultipartPreambleEnd 675 MultipartBoundaryBegin 675 MultipartBoundaryEnd 725 MimeEntityBegin 725 MimeEntityHeadersEnd 753 -MimeContentBegin 753 -MimeContentEnd 831 Octets 78 Lines 5 MimeEntityEnd 831 @@ -20,18 +17,14 @@ MultipartBoundaryBegin 833 MultipartBoundaryEnd 883 MimeEntityBegin 883 MimeEntityHeadersEnd 948 -MimeContentBegin 948 MimeMessageBegin 948 MimeMessageHeadersEnd 1747 MimeEntityBegin 948 MimeEntityHeadersEnd 1747 -MimeContentBegin 1747 -MimeContentEnd 1887 Octets 140 Lines 4 MimeEntityEnd 1887 MimeMessageEnd 1887 -MimeContentEnd 1887 Octets 939 Lines 21 MimeEntityEnd 1887 @@ -39,7 +32,6 @@ MultipartEndBoundaryBegin 1889 MultipartEndBoundaryEnd 1939 MultipartEpilogueBegin 1939 MultipartEpilogueEnd 1939 -MimeContentEnd 1939 Octets 1264 Lines 34 MimeEntityEnd 1939 @@ -50,25 +42,20 @@ MimeMessageBegin 1950 MimeMessageHeadersEnd 2430 MimeEntityBegin 1950 MimeEntityHeadersEnd 2430 -MimeContentBegin 2430 MultipartPreambleBegin 2430 MultipartPreambleEnd 2478 MultipartBoundaryBegin 2478 MultipartBoundaryEnd 2506 MimeEntityBegin 2506 MimeEntityHeadersEnd 2655 -MimeContentBegin 2655 MimeMessageBegin 2655 MimeMessageHeadersEnd 3095 MimeEntityBegin 2655 MimeEntityHeadersEnd 3095 -MimeContentBegin 3095 -MimeContentEnd 3134 Octets 39 Lines 3 MimeEntityEnd 3134 MimeMessageEnd 3134 -MimeContentEnd 3134 Octets 479 Lines 14 MimeEntityEnd 3134 @@ -76,8 +63,6 @@ MultipartBoundaryBegin 3136 MultipartBoundaryEnd 3164 MimeEntityBegin 3164 MimeEntityHeadersEnd 3291 -MimeContentBegin 3291 -MimeContentEnd 3755 Octets 464 Lines 7 MimeEntityEnd 3755 @@ -85,8 +70,6 @@ MultipartBoundaryBegin 3757 MultipartBoundaryEnd 3785 MimeEntityBegin 3785 MimeEntityHeadersEnd 3912 -MimeContentBegin 3912 -MimeContentEnd 4404 Octets 492 Lines 7 MimeEntityEnd 4404 @@ -94,8 +77,6 @@ MultipartBoundaryBegin 4406 MultipartBoundaryEnd 4434 MimeEntityBegin 4434 MimeEntityHeadersEnd 4565 -MimeContentBegin 4565 -MimeContentEnd 5099 Octets 534 Lines 8 MimeEntityEnd 5099 @@ -103,8 +84,6 @@ MultipartBoundaryBegin 5101 MultipartBoundaryEnd 5129 MimeEntityBegin 5129 MimeEntityHeadersEnd 5258 -MimeContentBegin 5258 -MimeContentEnd 5762 Octets 504 Lines 7 MimeEntityEnd 5762 @@ -112,18 +91,14 @@ MultipartBoundaryBegin 5764 MultipartBoundaryEnd 5792 MimeEntityBegin 5792 MimeEntityHeadersEnd 5941 -MimeContentBegin 5941 MimeMessageBegin 5941 MimeMessageHeadersEnd 6381 MimeEntityBegin 5941 MimeEntityHeadersEnd 6381 -MimeContentBegin 6381 -MimeContentEnd 6419 Octets 38 Lines 2 MimeEntityEnd 6419 MimeMessageEnd 6419 -MimeContentEnd 6419 Octets 478 Lines 13 MimeEntityEnd 6419 @@ -131,38 +106,30 @@ MultipartBoundaryBegin 6421 MultipartBoundaryEnd 6449 MimeEntityBegin 6449 MimeEntityHeadersEnd 6625 -MimeContentBegin 6625 MimeMessageBegin 6625 MimeMessageHeadersEnd 7210 MimeEntityBegin 6625 MimeEntityHeadersEnd 7210 -MimeContentBegin 7210 MimeMessageBegin 7210 MimeMessageHeadersEnd 7735 MimeEntityBegin 7210 MimeEntityHeadersEnd 7735 -MimeContentBegin 7735 MimeMessageBegin 7735 MimeMessageHeadersEnd 8156 MimeEntityBegin 7735 MimeEntityHeadersEnd 8156 -MimeContentBegin 8156 -MimeContentEnd 8162 Octets 6 Lines 2 MimeEntityEnd 8162 MimeMessageEnd 8162 -MimeContentEnd 8162 Octets 427 Lines 13 MimeEntityEnd 8162 MimeMessageEnd 8162 -MimeContentEnd 8162 Octets 952 Lines 27 MimeEntityEnd 8162 MimeMessageEnd 8162 -MimeContentEnd 8162 Octets 1537 Lines 42 MimeEntityEnd 8162 @@ -170,8 +137,6 @@ MultipartBoundaryBegin 8164 MultipartBoundaryEnd 8192 MimeEntityBegin 8192 MimeEntityHeadersEnd 8248 -MimeContentBegin 8248 -MimeContentEnd 8301 Octets 53 Lines 2 MimeEntityEnd 8301 @@ -179,7 +144,6 @@ MultipartEndBoundaryBegin 8303 MultipartEndBoundaryEnd 8331 MultipartEpilogueBegin 8331 MultipartEpilogueEnd 8331 -MimeContentEnd 8331 Octets 5901 Lines 145 MimeEntityEnd 8331 @@ -190,25 +154,20 @@ MimeMessageBegin 8342 MimeMessageHeadersEnd 8825 MimeEntityBegin 8342 MimeEntityHeadersEnd 8825 -MimeContentBegin 8825 MultipartPreambleBegin 8825 MultipartPreambleEnd 8873 MultipartBoundaryBegin 8873 MultipartBoundaryEnd 8901 MimeEntityBegin 8901 MimeEntityHeadersEnd 9054 -MimeContentBegin 9054 MimeMessageBegin 9054 MimeMessageHeadersEnd 9493 MimeEntityBegin 9054 MimeEntityHeadersEnd 9493 -MimeContentBegin 9493 -MimeContentEnd 9532 Octets 39 Lines 3 MimeEntityEnd 9532 MimeMessageEnd 9532 -MimeContentEnd 9532 Octets 478 Lines 14 MimeEntityEnd 9532 @@ -216,8 +175,6 @@ MultipartBoundaryBegin 9534 MultipartBoundaryEnd 9562 MimeEntityBegin 9562 MimeEntityHeadersEnd 9693 -MimeContentBegin 9693 -MimeContentEnd 10157 Octets 464 Lines 7 MimeEntityEnd 10157 @@ -225,8 +182,6 @@ MultipartBoundaryBegin 10159 MultipartBoundaryEnd 10187 MimeEntityBegin 10187 MimeEntityHeadersEnd 10318 -MimeContentBegin 10318 -MimeContentEnd 10810 Octets 492 Lines 7 MimeEntityEnd 10810 @@ -234,8 +189,6 @@ MultipartBoundaryBegin 10812 MultipartBoundaryEnd 10840 MimeEntityBegin 10840 MimeEntityHeadersEnd 10975 -MimeContentBegin 10975 -MimeContentEnd 11509 Octets 534 Lines 8 MimeEntityEnd 11509 @@ -243,8 +196,6 @@ MultipartBoundaryBegin 11511 MultipartBoundaryEnd 11539 MimeEntityBegin 11539 MimeEntityHeadersEnd 11672 -MimeContentBegin 11672 -MimeContentEnd 12176 Octets 504 Lines 7 MimeEntityEnd 12176 @@ -252,18 +203,14 @@ MultipartBoundaryBegin 12178 MultipartBoundaryEnd 12206 MimeEntityBegin 12206 MimeEntityHeadersEnd 12359 -MimeContentBegin 12359 MimeMessageBegin 12359 MimeMessageHeadersEnd 12798 MimeEntityBegin 12359 MimeEntityHeadersEnd 12798 -MimeContentBegin 12798 -MimeContentEnd 12836 Octets 38 Lines 2 MimeEntityEnd 12836 MimeMessageEnd 12836 -MimeContentEnd 12836 Octets 477 Lines 13 MimeEntityEnd 12836 @@ -271,38 +218,30 @@ MultipartBoundaryBegin 12838 MultipartBoundaryEnd 12866 MimeEntityBegin 12866 MimeEntityHeadersEnd 13046 -MimeContentBegin 13046 MimeMessageBegin 13046 MimeMessageHeadersEnd 13634 MimeEntityBegin 13046 MimeEntityHeadersEnd 13634 -MimeContentBegin 13634 MimeMessageBegin 13634 MimeMessageHeadersEnd 14162 MimeEntityBegin 13634 MimeEntityHeadersEnd 14162 -MimeContentBegin 14162 MimeMessageBegin 14162 MimeMessageHeadersEnd 14582 MimeEntityBegin 14162 MimeEntityHeadersEnd 14582 -MimeContentBegin 14582 -MimeContentEnd 14588 Octets 6 Lines 2 MimeEntityEnd 14588 MimeMessageEnd 14588 -MimeContentEnd 14588 Octets 426 Lines 13 MimeEntityEnd 14588 MimeMessageEnd 14588 -MimeContentEnd 14588 Octets 954 Lines 27 MimeEntityEnd 14588 MimeMessageEnd 14588 -MimeContentEnd 14588 Octets 1542 Lines 42 MimeEntityEnd 14588 @@ -310,8 +249,6 @@ MultipartBoundaryBegin 14590 MultipartBoundaryEnd 14618 MimeEntityBegin 14618 MimeEntityHeadersEnd 14678 -MimeContentBegin 14678 -MimeContentEnd 14731 Octets 53 Lines 2 MimeEntityEnd 14731 @@ -319,7 +256,6 @@ MultipartEndBoundaryBegin 14733 MultipartEndBoundaryEnd 14761 MultipartEpilogueBegin 14761 MultipartEpilogueEnd 14761 -MimeContentEnd 14761 Octets 5936 Lines 145 MimeEntityEnd 14761 @@ -330,15 +266,12 @@ MimeMessageBegin 14796 MimeMessageHeadersEnd 16325 MimeEntityBegin 14796 MimeEntityHeadersEnd 16325 -MimeContentBegin 16325 MultipartPreambleBegin 16325 MultipartPreambleEnd 16327 MultipartBoundaryBegin 16327 MultipartBoundaryEnd 16372 MimeEntityBegin 16372 MimeEntityHeadersEnd 16466 -MimeContentBegin 16466 -MimeContentEnd 21776 Octets 5310 Lines 112 MimeEntityEnd 21776 @@ -346,8 +279,6 @@ MultipartBoundaryBegin 21778 MultipartBoundaryEnd 21823 MimeEntityBegin 21823 MimeEntityHeadersEnd 22028 -MimeContentBegin 22028 -MimeContentEnd 22970 Octets 942 Lines 14 MimeEntityEnd 22970 @@ -355,7 +286,6 @@ MultipartEndBoundaryBegin 22972 MultipartEndBoundaryEnd 23017 MultipartEpilogueBegin 23017 MultipartEpilogueEnd 23019 -MimeContentEnd 23019 Octets 6694 Lines 140 MimeEntityEnd 23019 @@ -366,15 +296,12 @@ MimeMessageBegin 23054 MimeMessageHeadersEnd 24310 MimeEntityBegin 23054 MimeEntityHeadersEnd 24310 -MimeContentBegin 24310 MultipartPreambleBegin 24310 MultipartPreambleEnd 24358 MultipartBoundaryBegin 24358 MultipartBoundaryEnd 24397 MimeEntityBegin 24397 MimeEntityHeadersEnd 24476 -MimeContentBegin 24476 -MimeContentEnd 24506 Octets 30 Lines 4 MimeEntityEnd 24506 @@ -382,20 +309,16 @@ MultipartBoundaryBegin 24508 MultipartBoundaryEnd 24547 MimeEntityBegin 24547 MimeEntityHeadersEnd 24641 -MimeContentBegin 24641 MimeMessageBegin 24641 MimeMessageHeadersEnd 25478 MimeEntityBegin 24641 MimeEntityHeadersEnd 25478 -MimeContentBegin 25478 MultipartPreambleBegin 25478 MultipartPreambleEnd 25480 MultipartBoundaryBegin 25480 MultipartBoundaryEnd 25520 MimeEntityBegin 25520 MimeEntityHeadersEnd 25599 -MimeContentBegin 25599 -MimeContentEnd 26242 Octets 643 Lines 17 MimeEntityEnd 26242 @@ -403,15 +326,12 @@ MultipartBoundaryBegin 26244 MultipartBoundaryEnd 26284 MimeEntityBegin 26284 MimeEntityHeadersEnd 26368 -MimeContentBegin 26368 MultipartPreambleBegin 26368 MultipartPreambleEnd 26370 MultipartBoundaryBegin 26370 MultipartBoundaryEnd 26410 MimeEntityBegin 26410 MimeEntityHeadersEnd 26488 -MimeContentBegin 26488 -MimeContentEnd 27356 Octets 868 Lines 19 MimeEntityEnd 27356 @@ -419,8 +339,6 @@ MultipartBoundaryBegin 27358 MultipartBoundaryEnd 27398 MimeEntityBegin 27398 MimeEntityHeadersEnd 27587 -MimeContentBegin 27587 -MimeContentEnd 781745 Octets 754158 Lines 10192 MimeEntityEnd 781745 @@ -428,7 +346,6 @@ MultipartEndBoundaryBegin 781747 MultipartEndBoundaryEnd 781787 MultipartEpilogueBegin 781787 MultipartEpilogueEnd 781789 -MimeContentEnd 781789 Octets 755421 Lines 10224 MimeEntityEnd 781789 @@ -436,12 +353,10 @@ MultipartEndBoundaryBegin 781791 MultipartEndBoundaryEnd 781831 MultipartEpilogueBegin 781831 MultipartEpilogueEnd 781837 -MimeContentEnd 781837 Octets 756359 Lines 10253 MimeEntityEnd 781837 MimeMessageEnd 781837 -MimeContentEnd 781837 Octets 757196 Lines 10269 MimeEntityEnd 781837 @@ -449,7 +364,6 @@ MultipartEndBoundaryBegin 781839 MultipartEndBoundaryEnd 781878 MultipartEpilogueBegin 781878 MultipartEpilogueEnd 781880 -MimeContentEnd 781880 Octets 757570 Lines 10286 MimeEntityEnd 781880 @@ -460,15 +374,12 @@ MimeMessageBegin 781915 MimeMessageHeadersEnd 783201 MimeEntityBegin 781915 MimeEntityHeadersEnd 783201 -MimeContentBegin 783201 MultipartPreambleBegin 783201 MultipartPreambleEnd 783203 MultipartBoundaryBegin 783203 MultipartBoundaryEnd 783248 MimeEntityBegin 783248 MimeEntityHeadersEnd 783342 -MimeContentBegin 783342 -MimeContentEnd 785774 Octets 2432 Lines 51 MimeEntityEnd 785774 @@ -476,8 +387,6 @@ MultipartBoundaryBegin 785776 MultipartBoundaryEnd 785821 MimeEntityBegin 785821 MimeEntityHeadersEnd 785985 -MimeContentBegin 785985 -MimeContentEnd 792087 Octets 6102 Lines 80 MimeEntityEnd 792087 @@ -485,8 +394,6 @@ MultipartBoundaryBegin 792089 MultipartBoundaryEnd 792134 MimeEntityBegin 792134 MimeEntityHeadersEnd 792297 -MimeContentBegin 792297 -MimeContentEnd 804527 Octets 12230 Lines 158 MimeEntityEnd 804527 @@ -494,8 +401,6 @@ MultipartBoundaryBegin 804529 MultipartBoundaryEnd 804574 MimeEntityBegin 804574 MimeEntityHeadersEnd 804739 -MimeContentBegin 804739 -MimeContentEnd 826735 Octets 21996 Lines 283 MimeEntityEnd 826735 @@ -503,8 +408,6 @@ MultipartBoundaryBegin 826737 MultipartBoundaryEnd 826782 MimeEntityBegin 826782 MimeEntityHeadersEnd 826991 -MimeContentBegin 826991 -MimeContentEnd 830429 Octets 3438 Lines 46 MimeEntityEnd 830429 @@ -512,7 +415,6 @@ MultipartEndBoundaryBegin 830431 MultipartEndBoundaryEnd 830476 MultipartEpilogueBegin 830476 MultipartEpilogueEnd 830478 -MimeContentEnd 830478 Octets 47277 Lines 650 MimeEntityEnd 830478 @@ -523,15 +425,12 @@ MimeMessageBegin 830489 MimeMessageHeadersEnd 831421 MimeEntityBegin 830489 MimeEntityHeadersEnd 831421 -MimeContentBegin 831421 MultipartPreambleBegin 831421 MultipartPreambleEnd 831423 MultipartBoundaryBegin 831423 MultipartBoundaryEnd 831432 MimeEntityBegin 831432 MimeEntityHeadersEnd 831463 -MimeContentBegin 831463 -MimeContentEnd 834089 Octets 2626 Lines 97 MimeEntityEnd 834089 @@ -539,7 +438,6 @@ MultipartEndBoundaryBegin 834091 MultipartEndBoundaryEnd 834100 MultipartEpilogueBegin 834100 MultipartEpilogueEnd 834102 -MimeContentEnd 834102 Octets 2681 Lines 103 MimeEntityEnd 834102 @@ -550,15 +448,12 @@ MimeMessageBegin 834137 MimeMessageHeadersEnd 835308 MimeEntityBegin 834137 MimeEntityHeadersEnd 835308 -MimeContentBegin 835308 MultipartPreambleBegin 835308 MultipartPreambleEnd 835308 MultipartBoundaryBegin 835308 MultipartBoundaryEnd 835326 MimeEntityBegin 835326 MimeEntityHeadersEnd 835328 -MimeContentBegin 835328 -MimeContentEnd 836249 Octets 921 Lines 21 MimeEntityEnd 836249 @@ -566,8 +461,6 @@ MultipartBoundaryBegin 836251 MultipartBoundaryEnd 836269 MimeEntityBegin 836269 MimeEntityHeadersEnd 836351 -MimeContentBegin 836351 -MimeContentEnd 837111 Octets 760 Lines 13 MimeEntityEnd 837111 @@ -575,7 +468,6 @@ MultipartEndBoundaryBegin 837113 MultipartEndBoundaryEnd 837131 MultipartEpilogueBegin 837131 MultipartEpilogueEnd 837133 -MimeContentEnd 837133 Octets 1825 Lines 42 MimeEntityEnd 837133 @@ -586,15 +478,12 @@ MimeMessageBegin 837168 MimeMessageHeadersEnd 838329 MimeEntityBegin 837168 MimeEntityHeadersEnd 838329 -MimeContentBegin 838329 MultipartPreambleBegin 838329 MultipartPreambleEnd 838505 MultipartBoundaryBegin 838505 MultipartBoundaryEnd 838513 MimeEntityBegin 838513 MimeEntityHeadersEnd 838594 -MimeContentBegin 838594 -MimeContentEnd 839348 Octets 754 Lines 14 MimeEntityEnd 839348 @@ -602,8 +491,6 @@ MultipartBoundaryBegin 839350 MultipartBoundaryEnd 839358 MimeEntityBegin 839358 MimeEntityHeadersEnd 839541 -MimeContentBegin 839541 -MimeContentEnd 841787 Octets 2246 Lines 32 MimeEntityEnd 841787 @@ -611,7 +498,6 @@ MultipartEndBoundaryBegin 841789 MultipartEndBoundaryEnd 841797 MultipartEpilogueBegin 841797 MultipartEpilogueEnd 841797 -MimeContentEnd 841797 Octets 3468 Lines 60 MimeEntityEnd 841797 @@ -622,15 +508,12 @@ MimeMessageBegin 841832 MimeMessageHeadersEnd 842992 MimeEntityBegin 841832 MimeEntityHeadersEnd 842992 -MimeContentBegin 842992 MultipartPreambleBegin 842992 MultipartPreambleEnd 843168 MultipartBoundaryBegin 843168 MultipartBoundaryEnd 843190 MimeEntityBegin 843190 MimeEntityHeadersEnd 843271 -MimeContentBegin 843271 -MimeContentEnd 846129 Octets 2858 Lines 47 MimeEntityEnd 846129 @@ -638,8 +521,6 @@ MultipartBoundaryBegin 846131 MultipartBoundaryEnd 846153 MimeEntityBegin 846153 MimeEntityHeadersEnd 846336 -MimeContentBegin 846336 -MimeContentEnd 848918 Octets 2582 Lines 36 MimeEntityEnd 848918 @@ -647,7 +528,6 @@ MultipartEndBoundaryBegin 848920 MultipartEndBoundaryEnd 848942 MultipartEpilogueBegin 848942 MultipartEpilogueEnd 848942 -MimeContentEnd 848942 Octets 5950 Lines 97 MimeEntityEnd 848942 @@ -658,15 +538,12 @@ MimeMessageBegin 848977 MimeMessageHeadersEnd 849895 MimeEntityBegin 848977 MimeEntityHeadersEnd 849895 -MimeContentBegin 849895 MultipartPreambleBegin 849895 MultipartPreambleEnd 849943 MultipartBoundaryBegin 849943 MultipartBoundaryEnd 849971 MimeEntityBegin 849971 MimeEntityHeadersEnd 850109 -MimeContentBegin 850109 -MimeContentEnd 860977 Octets 10868 Lines 147 MimeEntityEnd 860977 @@ -674,8 +551,6 @@ MultipartBoundaryBegin 860979 MultipartBoundaryEnd 861007 MimeEntityBegin 861007 MimeEntityHeadersEnd 861162 -MimeContentBegin 861162 -MimeContentEnd 865836 Octets 4674 Lines 64 MimeEntityEnd 865836 @@ -683,7 +558,6 @@ MultipartEndBoundaryBegin 865838 MultipartEndBoundaryEnd 865866 MultipartEpilogueBegin 865866 MultipartEpilogueEnd 865868 -MimeContentEnd 865868 Octets 15973 Lines 225 MimeEntityEnd 865868 @@ -694,8 +568,6 @@ MimeMessageBegin 865903 MimeMessageHeadersEnd 867318 MimeEntityBegin 865903 MimeEntityHeadersEnd 867318 -MimeContentBegin 867318 -MimeContentEnd 868768 Octets 1450 Lines 20 MimeEntityEnd 868768 @@ -706,15 +578,12 @@ MimeMessageBegin 868803 MimeMessageHeadersEnd 870180 MimeEntityBegin 868803 MimeEntityHeadersEnd 870180 -MimeContentBegin 870180 MultipartPreambleBegin 870180 MultipartPreambleEnd 870182 MultipartBoundaryBegin 870182 MultipartBoundaryEnd 870227 MimeEntityBegin 870227 MimeEntityHeadersEnd 870294 -MimeContentBegin 870294 -MimeContentEnd 870404 Octets 110 Lines 4 MimeEntityEnd 870404 @@ -722,8 +591,6 @@ MultipartBoundaryBegin 870406 MultipartBoundaryEnd 870451 MimeEntityBegin 870451 MimeEntityHeadersEnd 870606 -MimeContentBegin 870606 -MimeContentEnd 874592 Octets 3986 Lines 54 MimeEntityEnd 874592 @@ -731,7 +598,6 @@ MultipartEndBoundaryBegin 874594 MultipartEndBoundaryEnd 874639 MultipartEpilogueBegin 874639 MultipartEpilogueEnd 874641 -MimeContentEnd 874641 Octets 4461 Lines 70 MimeEntityEnd 874641 @@ -742,8 +608,6 @@ MimeMessageBegin 874676 MimeMessageHeadersEnd 875907 MimeEntityBegin 874676 MimeEntityHeadersEnd 875907 -MimeContentBegin 875907 -MimeContentEnd 879457 Octets 3550 Lines 56 MimeEntityEnd 879457 @@ -754,8 +618,6 @@ MimeMessageBegin 879492 MimeMessageHeadersEnd 880590 MimeEntityBegin 879492 MimeEntityHeadersEnd 880590 -MimeContentBegin 880590 -MimeContentEnd 881260 Octets 670 Lines 10 MimeEntityEnd 881260 @@ -766,18 +628,14 @@ MimeMessageBegin 881295 MimeMessageHeadersEnd 882097 MimeEntityBegin 881295 MimeEntityHeadersEnd 882097 -MimeContentBegin 882097 MimeMessageBegin 882097 MimeMessageHeadersEnd 883500 MimeEntityBegin 882097 MimeEntityHeadersEnd 883500 -MimeContentBegin 883500 -MimeContentEnd 884952 Octets 1452 Lines 21 MimeEntityEnd 884952 MimeMessageEnd 884952 -MimeContentEnd 884952 Octets 2855 Lines 44 MimeEntityEnd 884952 @@ -788,15 +646,12 @@ MimeMessageBegin 884987 MimeMessageHeadersEnd 885714 MimeEntityBegin 884987 MimeEntityHeadersEnd 885714 -MimeContentBegin 885714 MultipartPreambleBegin 885714 MultipartPreambleEnd 885762 MultipartBoundaryBegin 885762 MultipartBoundaryEnd 885790 MimeEntityBegin 885790 MimeEntityHeadersEnd 885869 -MimeContentBegin 885869 -MimeContentEnd 885885 Octets 16 Lines 2 MimeEntityEnd 885885 @@ -804,18 +659,14 @@ MultipartBoundaryBegin 885887 MultipartBoundaryEnd 885915 MimeEntityBegin 885915 MimeEntityHeadersEnd 886073 -MimeContentBegin 886073 MimeMessageBegin 886073 MimeMessageHeadersEnd 887476 MimeEntityBegin 886073 MimeEntityHeadersEnd 887476 -MimeContentBegin 887476 -MimeContentEnd 888928 Octets 1452 Lines 21 MimeEntityEnd 888928 MimeMessageEnd 888928 -MimeContentEnd 888928 Octets 2855 Lines 44 MimeEntityEnd 888928 @@ -823,7 +674,6 @@ MultipartEndBoundaryBegin 888930 MultipartEndBoundaryEnd 888958 MultipartEpilogueBegin 888958 MultipartEpilogueEnd 888960 -MimeContentEnd 888960 Octets 3246 Lines 59 MimeEntityEnd 888960 @@ -834,15 +684,12 @@ MimeMessageBegin 888995 MimeMessageHeadersEnd 889676 MimeEntityBegin 888995 MimeEntityHeadersEnd 889676 -MimeContentBegin 889676 MultipartPreambleBegin 889676 MultipartPreambleEnd 889738 MultipartBoundaryBegin 889738 MultipartBoundaryEnd 889780 MimeEntityBegin 889780 MimeEntityHeadersEnd 889859 -MimeContentBegin 889859 -MimeContentEnd 889901 Octets 42 Lines 2 MimeEntityEnd 889901 @@ -850,8 +697,6 @@ MultipartBoundaryBegin 889903 MultipartBoundaryEnd 889945 MimeEntityBegin 889945 MimeEntityHeadersEnd 890100 -MimeContentBegin 890100 -MimeContentEnd 895732 Octets 5632 Lines 77 MimeEntityEnd 895732 @@ -859,7 +704,6 @@ MultipartEndBoundaryBegin 895734 MultipartEndBoundaryEnd 895776 MultipartEpilogueBegin 895776 MultipartEpilogueEnd 895778 -MimeContentEnd 895778 Octets 6102 Lines 92 MimeEntityEnd 895778 @@ -870,8 +714,6 @@ MimeMessageBegin 895813 MimeMessageHeadersEnd 896896 MimeEntityBegin 895813 MimeEntityHeadersEnd 896896 -MimeContentBegin 896896 -MimeContentEnd 907272 Octets 10376 Lines 141 MimeEntityEnd 907272 @@ -882,15 +724,12 @@ MimeMessageBegin 907307 MimeMessageHeadersEnd 908707 MimeEntityBegin 907307 MimeEntityHeadersEnd 908707 -MimeContentBegin 908707 MultipartPreambleBegin 908707 MultipartPreambleEnd 908769 MultipartBoundaryBegin 908769 MultipartBoundaryEnd 908811 MimeEntityBegin 908811 MimeEntityHeadersEnd 908890 -MimeContentBegin 908890 -MimeContentEnd 909517 Octets 627 Lines 17 MimeEntityEnd 909517 @@ -898,8 +737,6 @@ MultipartBoundaryBegin 909519 MultipartBoundaryEnd 909561 MimeEntityBegin 909561 MimeEntityHeadersEnd 909716 -MimeContentBegin 909716 -MimeContentEnd 911528 Octets 1812 Lines 25 MimeEntityEnd 911528 @@ -907,7 +744,6 @@ MultipartEndBoundaryBegin 911530 MultipartEndBoundaryEnd 911572 MultipartEpilogueBegin 911572 MultipartEpilogueEnd 911574 -MimeContentEnd 911574 Octets 2867 Lines 55 MimeEntityEnd 911574 @@ -918,8 +754,6 @@ MimeMessageBegin 911609 MimeMessageHeadersEnd 912172 MimeEntityBegin 911609 MimeEntityHeadersEnd 912172 -MimeContentBegin 912172 -MimeContentEnd 912702 Octets 530 Lines 8 MimeEntityEnd 912702 @@ -930,8 +764,6 @@ MimeMessageBegin 912737 MimeMessageHeadersEnd 913972 MimeEntityBegin 912737 MimeEntityHeadersEnd 913972 -MimeContentBegin 913972 -MimeContentEnd 916892 Octets 2920 Lines 39 MimeEntityEnd 916892 @@ -942,8 +774,6 @@ MimeMessageBegin 916927 MimeMessageHeadersEnd 918106 MimeEntityBegin 916927 MimeEntityHeadersEnd 918106 -MimeContentBegin 918106 -MimeContentEnd 920258 Octets 2152 Lines 31 MimeEntityEnd 920258 @@ -954,15 +784,12 @@ MimeMessageBegin 920293 MimeMessageHeadersEnd 921392 MimeEntityBegin 920293 MimeEntityHeadersEnd 921392 -MimeContentBegin 921392 MultipartPreambleBegin 921392 MultipartPreambleEnd 921394 MultipartBoundaryBegin 921394 MultipartBoundaryEnd 921427 MimeEntityBegin 921427 MimeEntityHeadersEnd 921494 -MimeContentBegin 921494 -MimeContentEnd 921494 Octets 0 Lines 1 MimeEntityEnd 921494 @@ -970,8 +797,6 @@ MultipartBoundaryBegin 921496 MultipartBoundaryEnd 921529 MimeEntityBegin 921529 MimeEntityHeadersEnd 921611 -MimeContentBegin 921611 -MimeContentEnd 924365 Octets 2754 Lines 42 MimeEntityEnd 924365 @@ -979,7 +804,6 @@ MultipartEndBoundaryBegin 924367 MultipartEndBoundaryEnd 924400 MultipartEpilogueBegin 924400 MultipartEpilogueEnd 924402 -MimeContentEnd 924402 Octets 3010 Lines 54 MimeEntityEnd 924402 @@ -990,15 +814,12 @@ MimeMessageBegin 924437 MimeMessageHeadersEnd 925493 MimeEntityBegin 924437 MimeEntityHeadersEnd 925493 -MimeContentBegin 925493 MultipartPreambleBegin 925493 MultipartPreambleEnd 925495 MultipartBoundaryBegin 925495 MultipartBoundaryEnd 925536 MimeEntityBegin 925536 MimeEntityHeadersEnd 925617 -MimeContentBegin 925617 -MimeContentEnd 926083 Octets 466 Lines 14 MimeEntityEnd 926083 @@ -1006,8 +827,6 @@ MultipartBoundaryBegin 926085 MultipartBoundaryEnd 926126 MimeEntityBegin 926126 MimeEntityHeadersEnd 926204 -MimeContentBegin 926204 -MimeContentEnd 927041 Octets 837 Lines 27 MimeEntityEnd 927041 @@ -1015,8 +834,6 @@ MultipartBoundaryBegin 927043 MultipartBoundaryEnd 927084 MimeEntityBegin 927084 MimeEntityHeadersEnd 927184 -MimeContentBegin 927184 -MimeContentEnd 928400 Octets 1216 Lines 17 MimeEntityEnd 928400 @@ -1024,7 +841,6 @@ MultipartEndBoundaryBegin 928402 MultipartEndBoundaryEnd 928443 MultipartEpilogueBegin 928443 MultipartEpilogueEnd 928445 -MimeContentEnd 928445 Octets 2952 Lines 73 MimeEntityEnd 928445 @@ -1035,15 +851,12 @@ MimeMessageBegin 928480 MimeMessageHeadersEnd 929576 MimeEntityBegin 928480 MimeEntityHeadersEnd 929576 -MimeContentBegin 929576 MultipartPreambleBegin 929576 MultipartPreambleEnd 929578 MultipartBoundaryBegin 929578 MultipartBoundaryEnd 929621 MimeEntityBegin 929621 MimeEntityHeadersEnd 929694 -MimeContentBegin 929694 -MimeContentEnd 929853 Octets 159 Lines 8 MimeEntityEnd 929853 @@ -1051,8 +864,6 @@ MultipartBoundaryBegin 929855 MultipartBoundaryEnd 929898 MimeEntityBegin 929898 MimeEntityHeadersEnd 929980 -MimeContentBegin 929980 -MimeContentEnd 934132 Octets 4152 Lines 57 MimeEntityEnd 934132 @@ -1060,7 +871,6 @@ MultipartEndBoundaryBegin 934134 MultipartEndBoundaryEnd 934177 MultipartEpilogueBegin 934177 MultipartEpilogueEnd 934179 -MimeContentEnd 934179 Octets 4603 Lines 76 MimeEntityEnd 934179 @@ -1071,15 +881,12 @@ MimeMessageBegin 934214 MimeMessageHeadersEnd 935337 MimeEntityBegin 934214 MimeEntityHeadersEnd 935337 -MimeContentBegin 935337 MultipartPreambleBegin 935337 MultipartPreambleEnd 935339 MultipartBoundaryBegin 935339 MultipartBoundaryEnd 935373 MimeEntityBegin 935373 MimeEntityHeadersEnd 935454 -MimeContentBegin 935454 -MimeContentEnd 935532 Octets 78 Lines 5 MimeEntityEnd 935532 @@ -1087,8 +894,6 @@ MultipartBoundaryBegin 935534 MultipartBoundaryEnd 935568 MimeEntityBegin 935568 MimeEntityHeadersEnd 935650 -MimeContentBegin 935650 -MimeContentEnd 939424 Octets 3774 Lines 58 MimeEntityEnd 939424 @@ -1096,7 +901,6 @@ MultipartEndBoundaryBegin 939426 MultipartEndBoundaryEnd 939460 MultipartEpilogueBegin 939460 MultipartEpilogueEnd 939460 -MimeContentEnd 939460 Octets 4123 Lines 73 MimeEntityEnd 939460 @@ -1107,15 +911,12 @@ MimeMessageBegin 939495 MimeMessageHeadersEnd 940640 MimeEntityBegin 939495 MimeEntityHeadersEnd 940640 -MimeContentBegin 940640 MultipartPreambleBegin 940640 MultipartPreambleEnd 940757 MultipartBoundaryBegin 940757 MultipartBoundaryEnd 940782 MimeEntityBegin 940782 MimeEntityHeadersEnd 940823 -MimeContentBegin 940823 -MimeContentEnd 941017 Octets 194 Lines 7 MimeEntityEnd 941017 @@ -1123,18 +924,14 @@ MultipartBoundaryBegin 941019 MultipartBoundaryEnd 941044 MimeEntityBegin 941044 MimeEntityHeadersEnd 941076 -MimeContentBegin 941076 MimeMessageBegin 941076 MimeMessageHeadersEnd 941897 MimeEntityBegin 941076 MimeEntityHeadersEnd 941897 -MimeContentBegin 941897 -MimeContentEnd 941908 Octets 11 Lines 1 MimeEntityEnd 941908 MimeMessageEnd 941908 -MimeContentEnd 941908 Octets 832 Lines 16 MimeEntityEnd 941908 @@ -1142,7 +939,6 @@ MultipartEndBoundaryBegin 941910 MultipartEndBoundaryEnd 941935 MultipartEpilogueBegin 941935 MultipartEpilogueEnd 941937 -MimeContentEnd 941937 Octets 1297 Lines 35 MimeEntityEnd 941937 @@ -1153,15 +949,12 @@ MimeMessageBegin 941972 MimeMessageHeadersEnd 943868 MimeEntityBegin 941972 MimeEntityHeadersEnd 943868 -MimeContentBegin 943868 MultipartPreambleBegin 943868 MultipartPreambleEnd 943868 MultipartBoundaryBegin 943868 MultipartBoundaryEnd 943913 MimeEntityBegin 943913 MimeEntityHeadersEnd 943994 -MimeContentBegin 943994 -MimeContentEnd 944875 Octets 881 Lines 19 MimeEntityEnd 944875 @@ -1169,8 +962,6 @@ MultipartBoundaryBegin 944877 MultipartBoundaryEnd 944922 MimeEntityBegin 944922 MimeEntityHeadersEnd 945088 -MimeContentBegin 945088 -MimeContentEnd 948790 Octets 3702 Lines 62 MimeEntityEnd 948790 @@ -1178,7 +969,6 @@ MultipartEndBoundaryBegin 948792 MultipartEndBoundaryEnd 948837 MultipartEpilogueBegin 948837 MultipartEpilogueEnd 948839 -MimeContentEnd 948837 Octets 4969 Lines 92 MimeEntityEnd 948837 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index 534dac6080..c79afbac3c 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -4,22 +4,18 @@ MimeMessageBegin 9 MimeMessageHeadersEnd 531 MimeEntityBegin 9 MimeEntityHeadersEnd 531 -MimeContentBegin 531 MultipartPreambleBegin 531 MultipartPreambleEnd 531 MultipartBoundaryBegin 531 MultipartBoundaryEnd 549 MimeEntityBegin 549 MimeEntityHeadersEnd 648 -MimeContentBegin 648 MultipartPreambleBegin 648 MultipartPreambleEnd 648 MultipartBoundaryBegin 648 MultipartBoundaryEnd 680 MimeEntityBegin 680 MimeEntityHeadersEnd 682 -MimeContentBegin 682 -MimeContentEnd 1413 Octets 731 Lines 17 MimeEntityEnd 1413 @@ -27,8 +23,6 @@ MultipartBoundaryBegin 1415 MultipartBoundaryEnd 1447 MimeEntityBegin 1447 MimeEntityHeadersEnd 1535 -MimeContentBegin 1535 -MimeContentEnd 33007 Octets 31472 Lines 427 MimeEntityEnd 33007 @@ -36,7 +30,6 @@ MultipartEndBoundaryBegin 33009 MultipartEndBoundaryEnd 33041 MultipartEpilogueBegin 33041 MultipartEpilogueEnd 33041 -MimeContentEnd 33041 Octets 32393 Lines 452 MimeEntityEnd 33041 @@ -44,15 +37,12 @@ MultipartBoundaryBegin 33043 MultipartBoundaryEnd 33061 MimeEntityBegin 33061 MimeEntityHeadersEnd 33157 -MimeContentBegin 33157 MultipartPreambleBegin 33157 MultipartPreambleEnd 33157 MultipartBoundaryBegin 33157 MultipartBoundaryEnd 33189 MimeEntityBegin 33189 MimeEntityHeadersEnd 33275 -MimeContentBegin 33275 -MimeContentEnd 59275 Octets 26000 Lines 353 MimeEntityEnd 59275 @@ -60,8 +50,6 @@ MultipartBoundaryBegin 59277 MultipartBoundaryEnd 59309 MimeEntityBegin 59309 MimeEntityHeadersEnd 59395 -MimeContentBegin 59395 -MimeContentEnd 78061 Octets 18666 Lines 254 MimeEntityEnd 78061 @@ -69,8 +57,6 @@ MultipartBoundaryBegin 78063 MultipartBoundaryEnd 78095 MimeEntityBegin 78095 MimeEntityHeadersEnd 78212 -MimeContentBegin 78212 -MimeContentEnd 124337 Octets 46125 Lines 2437 MimeEntityEnd 124337 @@ -78,8 +64,6 @@ MultipartBoundaryBegin 124339 MultipartBoundaryEnd 124371 MimeEntityBegin 124371 MimeEntityHeadersEnd 124435 -MimeContentBegin 124435 -MimeContentEnd 133638 Octets 9203 Lines 358 MimeEntityEnd 133638 @@ -87,7 +71,6 @@ MultipartEndBoundaryBegin 133640 MultipartEndBoundaryEnd 133672 MultipartEpilogueBegin 133672 MultipartEpilogueEnd 133672 -MimeContentEnd 133672 Octets 100515 Lines 3421 MimeEntityEnd 133672 @@ -95,8 +78,6 @@ MultipartBoundaryBegin 133674 MultipartBoundaryEnd 133692 MimeEntityBegin 133692 MimeEntityHeadersEnd 133780 -MimeContentBegin 133780 -MimeContentEnd 181602 Octets 47822 Lines 648 MimeEntityEnd 181602 @@ -104,7 +85,6 @@ MultipartEndBoundaryBegin 181604 MultipartEndBoundaryEnd 181622 MultipartEpilogueBegin 181622 MultipartEpilogueEnd 181624 -MimeContentEnd 181624 Octets 181093 Lines 4536 MimeEntityEnd 181624 @@ -115,8 +95,6 @@ MimeMessageBegin 181635 MimeMessageHeadersEnd 182198 MimeEntityBegin 181635 MimeEntityHeadersEnd 182198 -MimeContentBegin 182198 -MimeContentEnd 319322 Octets 137124 Lines 1855 MimeEntityEnd 319322 @@ -127,8 +105,6 @@ MimeMessageBegin 319333 MimeMessageHeadersEnd 319720 MimeEntityBegin 319333 MimeEntityHeadersEnd 319720 -MimeContentBegin 319720 -MimeContentEnd 319924 Octets 204 Lines 4 MimeEntityEnd 319924 @@ -139,15 +115,12 @@ MimeMessageBegin 319935 MimeMessageHeadersEnd 320596 MimeEntityBegin 319935 MimeEntityHeadersEnd 320596 -MimeContentBegin 320596 MultipartPreambleBegin 320596 MultipartPreambleEnd 320754 MultipartBoundaryBegin 320754 MultipartBoundaryEnd 320795 MimeEntityBegin 320795 MimeEntityHeadersEnd 320841 -MimeContentBegin 320841 -MimeContentEnd 321080 Octets 239 Lines 7 MimeEntityEnd 321080 @@ -155,15 +128,12 @@ MultipartBoundaryBegin 321082 MultipartBoundaryEnd 321123 MimeEntityBegin 321123 MimeEntityHeadersEnd 321211 -MimeContentBegin 321211 MultipartPreambleBegin 321211 MultipartPreambleEnd 321211 MultipartBoundaryBegin 321211 MultipartBoundaryEnd 321254 MimeEntityBegin 321254 MimeEntityHeadersEnd 321348 -MimeContentBegin 321348 -MimeContentEnd 321497 Octets 149 Lines 4 MimeEntityEnd 321497 @@ -171,8 +141,6 @@ MultipartBoundaryBegin 321499 MultipartBoundaryEnd 321542 MimeEntityBegin 321542 MimeEntityHeadersEnd 321656 -MimeContentBegin 321656 -MimeContentEnd 326088 Octets 4432 Lines 65 MimeEntityEnd 326088 @@ -180,8 +148,6 @@ MultipartBoundaryBegin 326090 MultipartBoundaryEnd 326133 MimeEntityBegin 326133 MimeEntityHeadersEnd 326227 -MimeContentBegin 326227 -MimeContentEnd 326275 Octets 48 Lines 4 MimeEntityEnd 326275 @@ -189,7 +155,6 @@ MultipartEndBoundaryBegin 326277 MultipartEndBoundaryEnd 326320 MultipartEpilogueBegin 326320 MultipartEpilogueEnd 326322 -MimeContentEnd 326322 Octets 5111 Lines 88 MimeEntityEnd 326322 @@ -197,7 +162,6 @@ MultipartEndBoundaryBegin 326324 MultipartEndBoundaryEnd 326365 MultipartEpilogueBegin 326365 MultipartEpilogueEnd 326365 -MimeContentEnd 326365 Octets 5769 Lines 106 MimeEntityEnd 326365 @@ -208,15 +172,12 @@ MimeMessageBegin 326376 MimeMessageHeadersEnd 327141 MimeEntityBegin 326376 MimeEntityHeadersEnd 327141 -MimeContentBegin 327141 MultipartPreambleBegin 327141 MultipartPreambleEnd 327340 MultipartBoundaryBegin 327340 MultipartBoundaryEnd 327403 MimeEntityBegin 327403 MimeEntityHeadersEnd 327479 -MimeContentBegin 327479 -MimeContentEnd 327915 Octets 436 Lines 13 MimeEntityEnd 327915 @@ -224,20 +185,16 @@ MultipartBoundaryBegin 327917 MultipartBoundaryEnd 327980 MimeEntityBegin 327980 MimeEntityHeadersEnd 328012 -MimeContentBegin 328012 MimeMessageBegin 328012 MimeMessageHeadersEnd 328864 MimeEntityBegin 328012 MimeEntityHeadersEnd 328864 -MimeContentBegin 328864 MultipartPreambleBegin 328864 MultipartPreambleEnd 329148 MultipartBoundaryBegin 329148 MultipartBoundaryEnd 329179 MimeEntityBegin 329179 MimeEntityHeadersEnd 329276 -MimeContentBegin 329276 -MimeContentEnd 329386 Octets 110 Lines 7 MimeEntityEnd 329386 @@ -245,8 +202,6 @@ MultipartBoundaryBegin 329388 MultipartBoundaryEnd 329419 MimeEntityBegin 329419 MimeEntityHeadersEnd 329511 -MimeContentBegin 329511 -MimeContentEnd 350421 Octets 20910 Lines 284 MimeEntityEnd 350421 @@ -254,17 +209,13 @@ MultipartBoundaryBegin 350423 MultipartBoundaryEnd 350454 MimeEntityBegin 350454 MimeEntityHeadersEnd 350456 -MimeContentBegin 350456 -MimeContentEnd 350456 Octets 0 Lines 0 MimeEntityEnd 350454 -MimeContentEnd 350454 Octets 21590 Lines 309 MimeEntityEnd 350454 MimeMessageEnd 350454 -MimeContentEnd 350454 Octets 22442 Lines 325 MimeEntityEnd 350454 @@ -272,8 +223,6 @@ MultipartBoundaryBegin 350456 MultipartBoundaryEnd 350519 MimeEntityBegin 350519 MimeEntityHeadersEnd 350595 -MimeContentBegin 350595 -MimeContentEnd 350706 Octets 111 Lines 5 MimeEntityEnd 350706 @@ -281,7 +230,6 @@ MultipartEndBoundaryBegin 350708 MultipartEndBoundaryEnd 350771 MultipartEpilogueBegin 350771 MultipartEpilogueEnd 350773 -MimeContentEnd 350773 Octets 23632 Lines 360 MimeEntityEnd 350773 @@ -292,15 +240,12 @@ MimeMessageBegin 350784 MimeMessageHeadersEnd 351518 MimeEntityBegin 350784 MimeEntityHeadersEnd 351518 -MimeContentBegin 351518 MultipartPreambleBegin 351518 MultipartPreambleEnd 351676 MultipartBoundaryBegin 351676 MultipartBoundaryEnd 351717 MimeEntityBegin 351717 MimeEntityHeadersEnd 351763 -MimeContentBegin 351763 -MimeContentEnd 352541 Octets 778 Lines 19 MimeEntityEnd 352541 @@ -308,15 +253,12 @@ MultipartBoundaryBegin 352543 MultipartBoundaryEnd 352584 MimeEntityBegin 352584 MimeEntityHeadersEnd 352672 -MimeContentBegin 352672 MultipartPreambleBegin 352672 MultipartPreambleEnd 352672 MultipartBoundaryBegin 352672 MultipartBoundaryEnd 352715 MimeEntityBegin 352715 MimeEntityHeadersEnd 352809 -MimeContentBegin 352809 -MimeContentEnd 353038 Octets 229 Lines 5 MimeEntityEnd 353038 @@ -324,8 +266,6 @@ MultipartBoundaryBegin 353040 MultipartBoundaryEnd 353083 MimeEntityBegin 353083 MimeEntityHeadersEnd 353195 -MimeContentBegin 353195 -MimeContentEnd 1037241 Octets 684046 Lines 8983 MimeEntityEnd 1037241 @@ -333,8 +273,6 @@ MultipartBoundaryBegin 1037243 MultipartBoundaryEnd 1037286 MimeEntityBegin 1037286 MimeEntityHeadersEnd 1037380 -MimeContentBegin 1037380 -MimeContentEnd 1037501 Octets 121 Lines 6 MimeEntityEnd 1037501 @@ -342,8 +280,6 @@ MultipartBoundaryBegin 1037503 MultipartBoundaryEnd 1037546 MimeEntityBegin 1037546 MimeEntityHeadersEnd 1037676 -MimeContentBegin 1037676 -MimeContentEnd 1727872 Octets 690196 Lines 9061 MimeEntityEnd 1727872 @@ -351,8 +287,6 @@ MultipartBoundaryBegin 1727874 MultipartBoundaryEnd 1727917 MimeEntityBegin 1727917 MimeEntityHeadersEnd 1728011 -MimeContentBegin 1728011 -MimeContentEnd 1728023 Octets 12 Lines 3 MimeEntityEnd 1728023 @@ -360,8 +294,6 @@ MultipartBoundaryBegin 1728025 MultipartBoundaryEnd 1728068 MimeEntityBegin 1728068 MimeEntityHeadersEnd 1728189 -MimeContentBegin 1728189 -MimeContentEnd 1797301 Octets 69112 Lines 935 MimeEntityEnd 1797301 @@ -369,8 +301,6 @@ MultipartBoundaryBegin 1797303 MultipartBoundaryEnd 1797346 MimeEntityBegin 1797346 MimeEntityHeadersEnd 1797440 -MimeContentBegin 1797440 -MimeContentEnd 1797583 Octets 143 Lines 6 MimeEntityEnd 1797583 @@ -378,8 +308,6 @@ MultipartBoundaryBegin 1797585 MultipartBoundaryEnd 1797628 MimeEntityBegin 1797628 MimeEntityHeadersEnd 1797750 -MimeContentBegin 1797750 -MimeContentEnd 2138984 Octets 341234 Lines 4473 MimeEntityEnd 2138984 @@ -387,8 +315,6 @@ MultipartBoundaryBegin 2138986 MultipartBoundaryEnd 2139029 MimeEntityBegin 2139029 MimeEntityHeadersEnd 2139123 -MimeContentBegin 2139123 -MimeContentEnd 2139129 Octets 6 Lines 2 MimeEntityEnd 2139129 @@ -396,7 +322,6 @@ MultipartEndBoundaryBegin 2139131 MultipartEndBoundaryEnd 2139174 MultipartEpilogueBegin 2139174 MultipartEpilogueEnd 2139176 -MimeContentEnd 2139176 Octets 1786504 Lines 23516 MimeEntityEnd 2139176 @@ -404,7 +329,6 @@ MultipartEndBoundaryBegin 2139178 MultipartEndBoundaryEnd 2139219 MultipartEpilogueBegin 2139219 MultipartEpilogueEnd 2139219 -MimeContentEnd 2139219 Octets 1787701 Lines 23546 MimeEntityEnd 2139219 @@ -415,8 +339,6 @@ MimeMessageBegin 2139230 MimeMessageHeadersEnd 2140267 MimeEntityBegin 2139230 MimeEntityHeadersEnd 2140267 -MimeContentBegin 2140267 -MimeContentEnd 2141431 Octets 1164 Lines 40 MimeEntityEnd 2141431 @@ -427,15 +349,12 @@ MimeMessageBegin 2141442 MimeMessageHeadersEnd 2141689 MimeEntityBegin 2141442 MimeEntityHeadersEnd 2141689 -MimeContentBegin 2141689 MultipartPreambleBegin 2141689 MultipartPreambleEnd 2141689 MultipartBoundaryBegin 2141689 MultipartBoundaryEnd 2141705 MimeEntityBegin 2141705 MimeEntityHeadersEnd 2141707 -MimeContentBegin 2141707 -MimeContentEnd 2142012 Octets 305 Lines 6 MimeEntityEnd 2142012 @@ -443,15 +362,12 @@ MultipartBoundaryBegin 2142014 MultipartBoundaryEnd 2142030 MimeEntityBegin 2142030 MimeEntityHeadersEnd 2142109 -MimeContentBegin 2142109 MultipartPreambleBegin 2142109 MultipartPreambleEnd 2142109 MultipartBoundaryBegin 2142109 MultipartBoundaryEnd 2142126 MimeEntityBegin 2142126 MimeEntityHeadersEnd 2142207 -MimeContentBegin 2142207 -MimeContentEnd 2145483 Octets 3276 Lines 17 MimeEntityEnd 2145483 @@ -459,8 +375,6 @@ MultipartBoundaryBegin 2145485 MultipartBoundaryEnd 2145502 MimeEntityBegin 2145502 MimeEntityHeadersEnd 2145610 -MimeContentBegin 2145610 -MimeContentEnd 2302316 Octets 156706 Lines 808 MimeEntityEnd 2302316 @@ -468,7 +382,6 @@ MultipartEndBoundaryBegin 2302318 MultipartEndBoundaryEnd 2302335 MultipartEpilogueBegin 2302335 MultipartEpilogueEnd 2302335 -MimeContentEnd 2302335 Octets 160226 Lines 837 MimeEntityEnd 2302335 @@ -476,8 +389,6 @@ MultipartBoundaryBegin 2302337 MultipartBoundaryEnd 2302353 MimeEntityBegin 2302353 MimeEntityHeadersEnd 2302412 -MimeContentBegin 2302412 -MimeContentEnd 2307327 Octets 4915 Lines 196 MimeEntityEnd 2307327 @@ -485,7 +396,6 @@ MultipartEndBoundaryBegin 2307329 MultipartEndBoundaryEnd 2307345 MultipartEpilogueBegin 2307345 MultipartEpilogueEnd 2307345 -MimeContentEnd 2307345 Octets 165656 Lines 1050 MimeEntityEnd 2307345 @@ -496,8 +406,6 @@ MimeMessageBegin 2307356 MimeMessageHeadersEnd 2308328 MimeEntityBegin 2307356 MimeEntityHeadersEnd 2308328 -MimeContentBegin 2308328 -MimeContentEnd 2655844 Octets 347516 Lines 4457 MimeEntityEnd 2655844 @@ -508,22 +416,18 @@ MimeMessageBegin 2655855 MimeMessageHeadersEnd 2655994 MimeEntityBegin 2655855 MimeEntityHeadersEnd 2655994 -MimeContentBegin 2655994 MultipartPreambleBegin 2655994 MultipartPreambleEnd 2655994 MultipartBoundaryBegin 2655994 MultipartBoundaryEnd 2656012 MimeEntityBegin 2656012 MimeEntityHeadersEnd 2656087 -MimeContentBegin 2656087 MultipartPreambleBegin 2656087 MultipartPreambleEnd 2656087 MultipartBoundaryBegin 2656087 MultipartBoundaryEnd 2656119 MimeEntityBegin 2656119 MimeEntityHeadersEnd 2656121 -MimeContentBegin 2656121 -MimeContentEnd 2656845 Octets 724 Lines 18 MimeEntityEnd 2656845 @@ -531,8 +435,6 @@ MultipartBoundaryBegin 2656847 MultipartBoundaryEnd 2656879 MimeEntityBegin 2656879 MimeEntityHeadersEnd 2656980 -MimeContentBegin 2656980 -MimeContentEnd 2688452 Octets 31472 Lines 427 MimeEntityEnd 2688452 @@ -540,7 +442,6 @@ MultipartEndBoundaryBegin 2688454 MultipartEndBoundaryEnd 2688486 MultipartEpilogueBegin 2688486 MultipartEpilogueEnd 2688486 -MimeContentEnd 2688486 Octets 32399 Lines 453 MimeEntityEnd 2688486 @@ -548,7 +449,6 @@ MultipartEndBoundaryBegin 2688488 MultipartEndBoundaryEnd 2688506 MultipartEpilogueBegin 2688506 MultipartEpilogueEnd 2688506 -MimeContentEnd 2688506 Octets 32512 Lines 457 MimeEntityEnd 2688506 @@ -559,8 +459,6 @@ MimeMessageBegin 2688517 MimeMessageHeadersEnd 2689088 MimeEntityBegin 2688517 MimeEntityHeadersEnd 2689088 -MimeContentBegin 2689088 -MimeContentEnd 2746649 Octets 57561 Lines 783 MimeEntityEnd 2746649 @@ -571,15 +469,12 @@ MimeMessageBegin 2746660 MimeMessageHeadersEnd 2747410 MimeEntityBegin 2746660 MimeEntityHeadersEnd 2747410 -MimeContentBegin 2747410 MultipartPreambleBegin 2747410 MultipartPreambleEnd 2747944 MultipartBoundaryBegin 2747944 MultipartBoundaryEnd 2748003 MimeEntityBegin 2748003 MimeEntityHeadersEnd 2748005 -MimeContentBegin 2748005 -MimeContentEnd 2748571 Octets 566 Lines 15 MimeEntityEnd 2748571 @@ -587,15 +482,12 @@ MultipartBoundaryBegin 2748573 MultipartBoundaryEnd 2748632 MimeEntityBegin 2748632 MimeEntityHeadersEnd 2748738 -MimeContentBegin 2748738 MultipartPreambleBegin 2748738 MultipartPreambleEnd 2748738 MultipartBoundaryBegin 2748738 MultipartBoundaryEnd 2748799 MimeEntityBegin 2748799 MimeEntityHeadersEnd 2748875 -MimeContentBegin 2748875 -MimeContentEnd 2749301 Octets 426 Lines 8 MimeEntityEnd 2749301 @@ -603,8 +495,6 @@ MultipartBoundaryBegin 2749303 MultipartBoundaryEnd 2749364 MimeEntityBegin 2749364 MimeEntityHeadersEnd 2749426 -MimeContentBegin 2749426 -MimeContentEnd 2779088 Octets 29662 Lines 402 MimeEntityEnd 2779088 @@ -612,8 +502,6 @@ MultipartBoundaryBegin 2779090 MultipartBoundaryEnd 2779151 MimeEntityBegin 2779151 MimeEntityHeadersEnd 2779224 -MimeContentBegin 2779224 -MimeContentEnd 2779269 Octets 45 Lines 5 MimeEntityEnd 2779269 @@ -621,7 +509,6 @@ MultipartEndBoundaryBegin 2779271 MultipartEndBoundaryEnd 2779332 MultipartEpilogueBegin 2779332 MultipartEpilogueEnd 2779334 -MimeContentEnd 2779334 Octets 30596 Lines 429 MimeEntityEnd 2779334 @@ -629,7 +516,6 @@ MultipartEndBoundaryBegin 2779336 MultipartEndBoundaryEnd 2779395 MultipartEpilogueBegin 2779395 MultipartEpilogueEnd 2779395 -MimeContentEnd 2779395 Octets 31985 Lines 459 MimeEntityEnd 2779395 @@ -640,15 +526,12 @@ MimeMessageBegin 2779406 MimeMessageHeadersEnd 2780075 MimeEntityBegin 2779406 MimeEntityHeadersEnd 2780075 -MimeContentBegin 2780075 MultipartPreambleBegin 2780075 MultipartPreambleEnd 2780422 MultipartBoundaryBegin 2780422 MultipartBoundaryEnd 2780452 MimeEntityBegin 2780452 MimeEntityHeadersEnd 2780454 -MimeContentBegin 2780454 -MimeContentEnd 2781302 Octets 848 Lines 28 MimeEntityEnd 2781302 @@ -656,15 +539,12 @@ MultipartBoundaryBegin 2781304 MultipartBoundaryEnd 2781334 MimeEntityBegin 2781334 MimeEntityHeadersEnd 2781410 -MimeContentBegin 2781410 MultipartPreambleBegin 2781410 MultipartPreambleEnd 2781410 MultipartBoundaryBegin 2781410 MultipartBoundaryEnd 2781442 MimeEntityBegin 2781442 MimeEntityHeadersEnd 2781470 -MimeContentBegin 2781470 -MimeContentEnd 2781612 Octets 142 Lines 6 MimeEntityEnd 2781612 @@ -672,8 +552,6 @@ MultipartBoundaryBegin 2781614 MultipartBoundaryEnd 2781646 MimeEntityBegin 2781646 MimeEntityHeadersEnd 2781714 -MimeContentBegin 2781714 -MimeContentEnd 2782928 Octets 1214 Lines 18 MimeEntityEnd 2782928 @@ -681,8 +559,6 @@ MultipartBoundaryBegin 2782930 MultipartBoundaryEnd 2782962 MimeEntityBegin 2782962 MimeEntityHeadersEnd 2782990 -MimeContentBegin 2782990 -MimeContentEnd 2783058 Octets 68 Lines 1 MimeEntityEnd 2783058 @@ -690,8 +566,6 @@ MultipartBoundaryBegin 2783060 MultipartBoundaryEnd 2783092 MimeEntityBegin 2783092 MimeEntityHeadersEnd 2783160 -MimeContentBegin 2783160 -MimeContentEnd 2784382 Octets 1222 Lines 18 MimeEntityEnd 2784382 @@ -699,8 +573,6 @@ MultipartBoundaryBegin 2784384 MultipartBoundaryEnd 2784416 MimeEntityBegin 2784416 MimeEntityHeadersEnd 2784447 -MimeContentBegin 2784447 -MimeContentEnd 2785006 Octets 559 Lines 14 MimeEntityEnd 2785006 @@ -708,7 +580,6 @@ MultipartEndBoundaryBegin 2785008 MultipartEndBoundaryEnd 2785040 MultipartEpilogueBegin 2785040 MultipartEpilogueEnd 2785042 -MimeContentEnd 2785042 Octets 3632 Lines 76 MimeEntityEnd 2785042 @@ -716,7 +587,6 @@ MultipartEndBoundaryBegin 2785044 MultipartEndBoundaryEnd 2785074 MultipartEpilogueBegin 2785074 MultipartEpilogueEnd 2785076 -MimeContentEnd 2785076 Octets 5001 Lines 119 MimeEntityEnd 2785076 @@ -727,8 +597,6 @@ MimeMessageBegin 2785087 MimeMessageHeadersEnd 2786084 MimeEntityBegin 2785087 MimeEntityHeadersEnd 2786084 -MimeContentBegin 2786084 -MimeContentEnd 2787498 Octets 1414 Lines 33 MimeEntityEnd 2787498 @@ -739,8 +607,6 @@ MimeMessageBegin 2787509 MimeMessageHeadersEnd 2787772 MimeEntityBegin 2787509 MimeEntityHeadersEnd 2787772 -MimeContentBegin 2787772 -MimeContentEnd 2788033 Octets 261 Lines 6 MimeEntityEnd 2788033 @@ -751,8 +617,6 @@ MimeMessageBegin 2788044 MimeMessageHeadersEnd 2788716 MimeEntityBegin 2788044 MimeEntityHeadersEnd 2788716 -MimeContentBegin 2788716 -MimeContentEnd 2789453 Octets 737 Lines 14 MimeEntityEnd 2789453 @@ -763,15 +627,12 @@ MimeMessageBegin 2789464 MimeMessageHeadersEnd 2790463 MimeEntityBegin 2789464 MimeEntityHeadersEnd 2790463 -MimeContentBegin 2790463 MultipartPreambleBegin 2790463 MultipartPreambleEnd 2790467 MultipartBoundaryBegin 2790467 MultipartBoundaryEnd 2790507 MimeEntityBegin 2790507 MimeEntityHeadersEnd 2790555 -MimeContentBegin 2790555 -MimeContentEnd 2790632 Octets 77 Lines 6 MimeEntityEnd 2790632 @@ -779,15 +640,12 @@ MultipartBoundaryBegin 2790634 MultipartBoundaryEnd 2790674 MimeEntityBegin 2790674 MimeEntityHeadersEnd 2790763 -MimeContentBegin 2790763 MultipartPreambleBegin 2790763 MultipartPreambleEnd 2790767 MultipartBoundaryBegin 2790767 MultipartBoundaryEnd 2790808 MimeEntityBegin 2790808 MimeEntityHeadersEnd 2790967 -MimeContentBegin 2790967 -MimeContentEnd 2857841 Octets 66874 Lines 958 MimeEntityEnd 2857841 @@ -795,8 +653,6 @@ MultipartBoundaryBegin 2857843 MultipartBoundaryEnd 2857884 MimeEntityBegin 2857884 MimeEntityHeadersEnd 2858099 -MimeContentBegin 2858099 -MimeContentEnd 3227661 Octets 369562 Lines 5282 MimeEntityEnd 3227661 @@ -804,7 +660,6 @@ MultipartEndBoundaryBegin 3227663 MultipartEndBoundaryEnd 3227704 MultipartEpilogueBegin 3227704 MultipartEpilogueEnd 3227708 -MimeContentEnd 3227708 Octets 436945 Lines 6257 MimeEntityEnd 3227708 @@ -812,7 +667,6 @@ MultipartEndBoundaryBegin 3227710 MultipartEndBoundaryEnd 3227750 MultipartEpilogueBegin 3227750 MultipartEpilogueEnd 3227750 -MimeContentEnd 3227750 Octets 437287 Lines 6272 MimeEntityEnd 3227750 @@ -823,15 +677,12 @@ MimeMessageBegin 3227761 MimeMessageHeadersEnd 3228760 MimeEntityBegin 3227761 MimeEntityHeadersEnd 3228760 -MimeContentBegin 3228760 MultipartPreambleBegin 3228760 MultipartPreambleEnd 3228764 MultipartBoundaryBegin 3228764 MultipartBoundaryEnd 3228804 MimeEntityBegin 3228804 MimeEntityHeadersEnd 3228852 -MimeContentBegin 3228852 -MimeContentEnd 3228929 Octets 77 Lines 6 MimeEntityEnd 3228929 @@ -839,15 +690,12 @@ MultipartBoundaryBegin 3228931 MultipartBoundaryEnd 3228971 MimeEntityBegin 3228971 MimeEntityHeadersEnd 3229059 -MimeContentBegin 3229059 MultipartPreambleBegin 3229059 MultipartPreambleEnd 3229063 MultipartBoundaryBegin 3229063 MultipartBoundaryEnd 3229104 MimeEntityBegin 3229104 MimeEntityHeadersEnd 3229263 -MimeContentBegin 3229263 -MimeContentEnd 3296137 Octets 66874 Lines 958 MimeEntityEnd 3296137 @@ -855,8 +703,6 @@ MultipartBoundaryBegin 3296139 MultipartBoundaryEnd 3296180 MimeEntityBegin 3296180 MimeEntityHeadersEnd 3296395 -MimeContentBegin 3296395 -MimeContentEnd 3665957 Octets 369562 Lines 5282 MimeEntityEnd 3665957 @@ -864,7 +710,6 @@ MultipartEndBoundaryBegin 3665959 MultipartEndBoundaryEnd 3666000 MultipartEpilogueBegin 3666000 MultipartEpilogueEnd 3666004 -MimeContentEnd 3666004 Octets 436945 Lines 6257 MimeEntityEnd 3666004 @@ -872,7 +717,6 @@ MultipartEndBoundaryBegin 3666006 MultipartEndBoundaryEnd 3666046 MultipartEpilogueBegin 3666046 MultipartEpilogueEnd 3666046 -MimeContentEnd 3666046 Octets 437286 Lines 6272 MimeEntityEnd 3666046 @@ -883,18 +727,14 @@ MimeMessageBegin 3666057 MimeMessageHeadersEnd 3666630 MimeEntityBegin 3666057 MimeEntityHeadersEnd 3666630 -MimeContentBegin 3666630 MimeMessageBegin 3666630 MimeMessageHeadersEnd 3666692 MimeEntityBegin 3666630 MimeEntityHeadersEnd 3666692 -MimeContentBegin 3666692 -MimeContentEnd 3667232 Octets 540 Lines 14 MimeEntityEnd 3667232 MimeMessageEnd 3667232 -MimeContentEnd 3667232 Octets 602 Lines 17 MimeEntityEnd 3667232 @@ -905,15 +745,12 @@ MimeMessageBegin 3667243 MimeMessageHeadersEnd 3667974 MimeEntityBegin 3667243 MimeEntityHeadersEnd 3667974 -MimeContentBegin 3667974 MultipartPreambleBegin 3667974 MultipartPreambleEnd 3667976 MultipartBoundaryBegin 3667976 MultipartBoundaryEnd 3668020 MimeEntityBegin 3668020 MimeEntityHeadersEnd 3668048 -MimeContentBegin 3668048 -MimeContentEnd 3668234 Octets 186 Lines 7 MimeEntityEnd 3668234 @@ -921,8 +758,6 @@ MultipartBoundaryBegin 3668236 MultipartBoundaryEnd 3668280 MimeEntityBegin 3668280 MimeEntityHeadersEnd 3668355 -MimeContentBegin 3668355 -MimeContentEnd 3669259 Octets 904 Lines 13 MimeEntityEnd 3669259 @@ -930,7 +765,6 @@ MultipartEndBoundaryBegin 3669261 MultipartEndBoundaryEnd 3669305 MultipartEpilogueBegin 3669305 MultipartEpilogueEnd 3669418 -MimeContentEnd 3669418 Octets 1444 Lines 34 MimeEntityEnd 3669418 @@ -941,15 +775,12 @@ MimeMessageBegin 3669429 MimeMessageHeadersEnd 3669982 MimeEntityBegin 3669429 MimeEntityHeadersEnd 3669982 -MimeContentBegin 3669982 MultipartPreambleBegin 3669982 MultipartPreambleEnd 3670021 MultipartBoundaryBegin 3670021 MultipartBoundaryEnd 3670061 MimeEntityBegin 3670061 MimeEntityHeadersEnd 3670063 -MimeContentBegin 3670063 -MimeContentEnd 3670465 Octets 402 Lines 11 MimeEntityEnd 3670465 @@ -957,18 +788,14 @@ MultipartBoundaryBegin 3670467 MultipartBoundaryEnd 3670507 MimeEntityBegin 3670507 MimeEntityHeadersEnd 3670539 -MimeContentBegin 3670539 MimeMessageBegin 3670539 MimeMessageHeadersEnd 3671342 MimeEntityBegin 3670539 MimeEntityHeadersEnd 3671342 -MimeContentBegin 3671342 -MimeContentEnd 3674767 Octets 3425 Lines 73 MimeEntityEnd 3674767 MimeMessageEnd 3674767 -MimeContentEnd 3674767 Octets 4228 Lines 89 MimeEntityEnd 3674767 @@ -976,7 +803,6 @@ MultipartEndBoundaryBegin 3674769 MultipartEndBoundaryEnd 3674809 MultipartEpilogueBegin 3674809 MultipartEpilogueEnd 3674811 -MimeContentEnd 3674811 Octets 4829 Lines 109 MimeEntityEnd 3674811 @@ -987,15 +813,12 @@ MimeMessageBegin 3674822 MimeMessageHeadersEnd 3675488 MimeEntityBegin 3674822 MimeEntityHeadersEnd 3675488 -MimeContentBegin 3675488 MultipartPreambleBegin 3675488 MultipartPreambleEnd 3675488 MultipartBoundaryBegin 3675488 MultipartBoundaryEnd 3675538 MimeEntityBegin 3675538 MimeEntityHeadersEnd 3675566 -MimeContentBegin 3675566 -MimeContentEnd 3675644 Octets 78 Lines 5 MimeEntityEnd 3675644 @@ -1003,18 +826,14 @@ MultipartBoundaryBegin 3675646 MultipartBoundaryEnd 3675696 MimeEntityBegin 3675696 MimeEntityHeadersEnd 3675761 -MimeContentBegin 3675761 MimeMessageBegin 3675761 MimeMessageHeadersEnd 3676560 MimeEntityBegin 3675761 MimeEntityHeadersEnd 3676560 -MimeContentBegin 3676560 -MimeContentEnd 3676700 Octets 140 Lines 4 MimeEntityEnd 3676700 MimeMessageEnd 3676700 -MimeContentEnd 3676700 Octets 939 Lines 21 MimeEntityEnd 3676700 @@ -1022,7 +841,6 @@ MultipartEndBoundaryBegin 3676702 MultipartEndBoundaryEnd 3676752 MultipartEpilogueBegin 3676752 MultipartEpilogueEnd 3676752 -MimeContentEnd 3676752 Octets 1264 Lines 34 MimeEntityEnd 3676752 @@ -1033,8 +851,6 @@ MimeMessageBegin 3676763 MimeMessageHeadersEnd 3677286 MimeEntityBegin 3676763 MimeEntityHeadersEnd 3677286 -MimeContentBegin 3677286 -MimeContentEnd 3678750 Octets 1464 Lines 46 MimeEntityEnd 3678750 @@ -1045,8 +861,6 @@ MimeMessageBegin 3678804 MimeMessageHeadersEnd 3679391 MimeEntityBegin 3678804 MimeEntityHeadersEnd 3679391 -MimeContentBegin 3679391 -MimeContentEnd 3740046 Octets 60655 Lines 955 MimeEntityEnd 3740046 @@ -1057,8 +871,6 @@ MimeMessageBegin 3740100 MimeMessageHeadersEnd 3740684 MimeEntityBegin 3740100 MimeEntityHeadersEnd 3740684 -MimeContentBegin 3740684 -MimeContentEnd 3801451 Octets 60767 Lines 961 MimeEntityEnd 3801451 @@ -1069,15 +881,12 @@ MimeMessageBegin 3801462 MimeMessageHeadersEnd 3802023 MimeEntityBegin 3801462 MimeEntityHeadersEnd 3802023 -MimeContentBegin 3802023 MultipartPreambleBegin 3802023 MultipartPreambleEnd 3802025 MultipartBoundaryBegin 3802025 MultipartBoundaryEnd 3802041 MimeEntityBegin 3802041 MimeEntityHeadersEnd 3802070 -MimeContentBegin 3802070 -MimeContentEnd 3802145 Octets 75 Lines 5 MimeEntityEnd 3802145 @@ -1085,8 +894,6 @@ MultipartBoundaryBegin 3802147 MultipartBoundaryEnd 3802163 MimeEntityBegin 3802163 MimeEntityHeadersEnd 3802247 -MimeContentBegin 3802247 -MimeContentEnd 3802897 Octets 650 Lines 10 MimeEntityEnd 3802897 @@ -1094,7 +901,6 @@ MultipartEndBoundaryBegin 3802899 MultipartEndBoundaryEnd 3802915 MultipartEpilogueBegin 3802915 MultipartEpilogueEnd 3802919 -MimeContentEnd 3802919 Octets 896 Lines 26 MimeEntityEnd 3802919 @@ -1105,8 +911,6 @@ MimeMessageBegin 3802930 MimeMessageHeadersEnd 3803695 MimeEntityBegin 3802930 MimeEntityHeadersEnd 3803695 -MimeContentBegin 3803695 -MimeContentEnd 3845795 Octets 42100 Lines 571 MimeEntityEnd 3845795 @@ -1117,15 +921,12 @@ MimeMessageBegin 3845806 MimeMessageHeadersEnd 3846985 MimeEntityBegin 3845806 MimeEntityHeadersEnd 3846985 -MimeContentBegin 3846985 MultipartPreambleBegin 3846985 MultipartPreambleEnd 3846985 MultipartBoundaryBegin 3846985 MultipartBoundaryEnd 3846991 MimeEntityBegin 3846991 MimeEntityHeadersEnd 3846993 -MimeContentBegin 3846993 -MimeContentEnd 3848958 Octets 1965 Lines 44 MimeEntityEnd 3848958 @@ -1133,8 +934,6 @@ MultipartBoundaryBegin 3848960 MultipartBoundaryEnd 3848966 MimeEntityBegin 3848966 MimeEntityHeadersEnd 3849075 -MimeContentBegin 3849075 -MimeContentEnd 3855383 Octets 6308 Lines 87 MimeEntityEnd 3855383 @@ -1142,7 +941,6 @@ MultipartEndBoundaryBegin 3855385 MultipartEndBoundaryEnd 3855391 MultipartEpilogueBegin 3855391 MultipartEpilogueEnd 3855393 -MimeContentEnd 3855393 Octets 8408 Lines 140 MimeEntityEnd 3855393 @@ -1153,8 +951,6 @@ MimeMessageBegin 3855404 MimeMessageHeadersEnd 3856880 MimeEntityBegin 3855404 MimeEntityHeadersEnd 3856880 -MimeContentBegin 3856880 -MimeContentEnd 3965263 Octets 108383 Lines 1571 MimeEntityEnd 3965263 @@ -1165,30 +961,24 @@ MimeMessageBegin 3965274 MimeMessageHeadersEnd 3965889 MimeEntityBegin 3965274 MimeEntityHeadersEnd 3965889 -MimeContentBegin 3965889 MimeMessageBegin 3965889 MimeMessageHeadersEnd 3966475 MimeEntityBegin 3965889 MimeEntityHeadersEnd 3966475 -MimeContentBegin 3966475 MimeMessageBegin 3966475 MimeMessageHeadersEnd 3967033 MimeEntityBegin 3966475 MimeEntityHeadersEnd 3967033 -MimeContentBegin 3967033 MimeMessageBegin 3967033 MimeMessageHeadersEnd 3967597 MimeEntityBegin 3967033 MimeEntityHeadersEnd 3967597 -MimeContentBegin 3967597 MultipartPreambleBegin 3967597 MultipartPreambleEnd 3967645 MultipartBoundaryBegin 3967645 MultipartBoundaryEnd 3967704 MimeEntityBegin 3967704 MimeEntityHeadersEnd 3967783 -MimeContentBegin 3967783 -MimeContentEnd 3967833 Octets 50 Lines 2 MimeEntityEnd 3967833 @@ -1196,20 +986,16 @@ MultipartBoundaryBegin 3967835 MultipartBoundaryEnd 3967894 MimeEntityBegin 3967894 MimeEntityHeadersEnd 3967959 -MimeContentBegin 3967959 MimeMessageBegin 3967959 MimeMessageHeadersEnd 3968475 MimeEntityBegin 3967959 MimeEntityHeadersEnd 3968475 -MimeContentBegin 3968475 MultipartPreambleBegin 3968475 MultipartPreambleEnd 3968523 MultipartBoundaryBegin 3968523 MultipartBoundaryEnd 3968572 MimeEntityBegin 3968572 MimeEntityHeadersEnd 3968651 -MimeContentBegin 3968651 -MimeContentEnd 3968778 Octets 127 Lines 6 MimeEntityEnd 3968778 @@ -1217,8 +1003,6 @@ MultipartBoundaryBegin 3968780 MultipartBoundaryEnd 3968829 MimeEntityBegin 3968829 MimeEntityHeadersEnd 3968901 -MimeContentBegin 3968901 -MimeContentEnd 3969188 Octets 287 Lines 5 MimeEntityEnd 3969188 @@ -1226,12 +1010,10 @@ MultipartEndBoundaryBegin 3969190 MultipartEndBoundaryEnd 3969239 MultipartEpilogueBegin 3969239 MultipartEpilogueEnd 3969241 -MimeContentEnd 3969241 Octets 766 Lines 23 MimeEntityEnd 3969241 MimeMessageEnd 3969241 -MimeContentEnd 3969241 Octets 1282 Lines 39 MimeEntityEnd 3969241 @@ -1239,22 +1021,18 @@ MultipartEndBoundaryBegin 3969243 MultipartEndBoundaryEnd 3969302 MultipartEpilogueBegin 3969302 MultipartEpilogueEnd 3969308 -MimeContentEnd 3969308 Octets 1711 Lines 55 MimeEntityEnd 3969308 MimeMessageEnd 3969308 -MimeContentEnd 3969308 Octets 2275 Lines 71 MimeEntityEnd 3969308 MimeMessageEnd 3969308 -MimeContentEnd 3969308 Octets 2833 Lines 87 MimeEntityEnd 3969308 MimeMessageEnd 3969308 -MimeContentEnd 3969308 Octets 3419 Lines 103 MimeEntityEnd 3969308 @@ -1265,15 +1043,12 @@ MimeMessageBegin 3969319 MimeMessageHeadersEnd 3970038 MimeEntityBegin 3969319 MimeEntityHeadersEnd 3970038 -MimeContentBegin 3970038 MultipartPreambleBegin 3970038 MultipartPreambleEnd 3970038 MultipartBoundaryBegin 3970038 MultipartBoundaryEnd 3970066 MimeEntityBegin 3970066 MimeEntityHeadersEnd 3970068 -MimeContentBegin 3970068 -MimeContentEnd 3970110 Octets 42 Lines 2 MimeEntityEnd 3970110 @@ -1281,8 +1056,6 @@ MultipartBoundaryBegin 3970112 MultipartBoundaryEnd 3970140 MimeEntityBegin 3970140 MimeEntityHeadersEnd 3970290 -MimeContentBegin 3970290 -MimeContentEnd 4047906 Octets 77616 Lines 401 MimeEntityEnd 4047906 @@ -1290,8 +1063,6 @@ MultipartBoundaryBegin 4047908 MultipartBoundaryEnd 4047936 MimeEntityBegin 4047936 MimeEntityHeadersEnd 4047938 -MimeContentBegin 4047938 -MimeContentEnd 4047972 Octets 34 Lines 4 MimeEntityEnd 4047972 @@ -1299,8 +1070,6 @@ MultipartBoundaryBegin 4047974 MultipartBoundaryEnd 4048002 MimeEntityBegin 4048002 MimeEntityHeadersEnd 4048154 -MimeContentBegin 4048154 -MimeContentEnd 4151890 Octets 103736 Lines 535 MimeEntityEnd 4151890 @@ -1308,8 +1077,6 @@ MultipartBoundaryBegin 4151892 MultipartBoundaryEnd 4151920 MimeEntityBegin 4151920 MimeEntityHeadersEnd 4151922 -MimeContentBegin 4151922 -MimeContentEnd 4152086 Octets 164 Lines 5 MimeEntityEnd 4152086 @@ -1317,8 +1084,6 @@ MultipartBoundaryBegin 4152088 MultipartBoundaryEnd 4152116 MimeEntityBegin 4152116 MimeEntityHeadersEnd 4152208 -MimeContentBegin 4152208 -MimeContentEnd 4233632 Octets 81424 Lines 1235 MimeEntityEnd 4233632 @@ -1326,8 +1091,6 @@ MultipartBoundaryBegin 4233634 MultipartBoundaryEnd 4233662 MimeEntityBegin 4233662 MimeEntityHeadersEnd 4233664 -MimeContentBegin 4233664 -MimeContentEnd 4233686 Octets 22 Lines 3 MimeEntityEnd 4233686 @@ -1335,7 +1098,6 @@ MultipartEndBoundaryBegin 4233688 MultipartEndBoundaryEnd 4233716 MultipartEpilogueBegin 4233716 MultipartEpilogueEnd 4233718 -MimeContentEnd 4233718 Octets 263680 Lines 2211 MimeEntityEnd 4233718 @@ -1346,8 +1108,6 @@ MimeMessageBegin 4233729 MimeMessageHeadersEnd 4234408 MimeEntityBegin 4233729 MimeEntityHeadersEnd 4234408 -MimeContentBegin 4234408 -MimeContentEnd 4235418 Octets 1010 Lines 19 MimeEntityEnd 4235418 @@ -1358,15 +1118,12 @@ MimeMessageBegin 4235429 MimeMessageHeadersEnd 4236508 MimeEntityBegin 4235429 MimeEntityHeadersEnd 4236508 -MimeContentBegin 4236508 MultipartPreambleBegin 4236508 MultipartPreambleEnd 4236666 MultipartBoundaryBegin 4236666 MultipartBoundaryEnd 4236707 MimeEntityBegin 4236707 MimeEntityHeadersEnd 4236753 -MimeContentBegin 4236753 -MimeContentEnd 4237170 Octets 417 Lines 14 MimeEntityEnd 4237170 @@ -1374,15 +1131,12 @@ MultipartBoundaryBegin 4237172 MultipartBoundaryEnd 4237213 MimeEntityBegin 4237213 MimeEntityHeadersEnd 4237301 -MimeContentBegin 4237301 MultipartPreambleBegin 4237301 MultipartPreambleEnd 4237301 MultipartBoundaryBegin 4237301 MultipartBoundaryEnd 4237344 MimeEntityBegin 4237344 MimeEntityHeadersEnd 4237438 -MimeContentBegin 4237438 -MimeContentEnd 4237667 Octets 229 Lines 5 MimeEntityEnd 4237667 @@ -1390,8 +1144,6 @@ MultipartBoundaryBegin 4237669 MultipartBoundaryEnd 4237712 MimeEntityBegin 4237712 MimeEntityHeadersEnd 4237835 -MimeContentBegin 4237835 -MimeContentEnd 4239256 Octets 1421 Lines 38 MimeEntityEnd 4239256 @@ -1399,8 +1151,6 @@ MultipartBoundaryBegin 4239258 MultipartBoundaryEnd 4239301 MimeEntityBegin 4239301 MimeEntityHeadersEnd 4239395 -MimeContentBegin 4239395 -MimeContentEnd 4239552 Octets 157 Lines 10 MimeEntityEnd 4239552 @@ -1408,7 +1158,6 @@ MultipartEndBoundaryBegin 4239554 MultipartEndBoundaryEnd 4239597 MultipartEpilogueBegin 4239597 MultipartEpilogueEnd 4239599 -MimeContentEnd 4239599 Octets 2298 Lines 68 MimeEntityEnd 4239599 @@ -1416,7 +1165,6 @@ MultipartEndBoundaryBegin 4239601 MultipartEndBoundaryEnd 4239642 MultipartEpilogueBegin 4239642 MultipartEpilogueEnd 4239644 -MimeContentEnd 4239644 Octets 3136 Lines 94 MimeEntityEnd 4239644 @@ -1427,15 +1175,12 @@ MimeMessageBegin 4239655 MimeMessageHeadersEnd 4240341 MimeEntityBegin 4239655 MimeEntityHeadersEnd 4240341 -MimeContentBegin 4240341 MultipartPreambleBegin 4240341 MultipartPreambleEnd 4240341 MultipartBoundaryBegin 4240341 MultipartBoundaryEnd 4240358 MimeEntityBegin 4240358 MimeEntityHeadersEnd 4240387 -MimeContentBegin 4240387 -MimeContentEnd 4240471 Octets 84 Lines 7 MimeEntityEnd 4240471 @@ -1443,8 +1188,6 @@ MultipartBoundaryBegin 4240473 MultipartBoundaryEnd 4240490 MimeEntityBegin 4240490 MimeEntityHeadersEnd 4240553 -MimeContentBegin 4240553 -MimeContentEnd 4245787 Octets 5234 Lines 72 MimeEntityEnd 4245787 @@ -1452,7 +1195,6 @@ MultipartEndBoundaryBegin 4245789 MultipartEndBoundaryEnd 4245806 MultipartEpilogueBegin 4245806 MultipartEpilogueEnd 4245810 -MimeContentEnd 4245810 Octets 5469 Lines 89 MimeEntityEnd 4245810 @@ -1463,8 +1205,6 @@ MimeMessageBegin 4245821 MimeMessageHeadersEnd 4246287 MimeEntityBegin 4245821 MimeEntityHeadersEnd 4246287 -MimeContentBegin 4246287 -MimeContentEnd 4257886 Octets 11599 Lines 186 MimeEntityEnd 4257886 @@ -1475,15 +1215,12 @@ MimeMessageBegin 4257897 MimeMessageHeadersEnd 4258477 MimeEntityBegin 4257897 MimeEntityHeadersEnd 4258477 -MimeContentBegin 4258477 MultipartPreambleBegin 4258477 MultipartPreambleEnd 4258477 MultipartBoundaryBegin 4258477 MultipartBoundaryEnd 4258489 MimeEntityBegin 4258489 MimeEntityHeadersEnd 4258491 -MimeContentBegin 4258491 -MimeContentEnd 4258530 Octets 39 Lines 2 MimeEntityEnd 4258530 @@ -1491,25 +1228,20 @@ MultipartBoundaryBegin 4258532 MultipartBoundaryEnd 4258544 MimeEntityBegin 4258544 MimeEntityHeadersEnd 4258601 -MimeContentBegin 4258601 MultipartPreambleBegin 4258601 MultipartPreambleEnd 4258601 MultipartBoundaryBegin 4258601 MultipartBoundaryEnd 4258616 MimeEntityBegin 4258616 MimeEntityHeadersEnd 4258736 -MimeContentBegin 4258736 MimeMessageBegin 4258736 MimeMessageHeadersEnd 4258816 MimeEntityBegin 4258736 MimeEntityHeadersEnd 4258816 -MimeContentBegin 4258816 -MimeContentEnd 4258885 Octets 69 Lines 3 MimeEntityEnd 4258885 MimeMessageEnd 4258885 -MimeContentEnd 4258885 Octets 149 Lines 6 MimeEntityEnd 4258885 @@ -1517,18 +1249,14 @@ MultipartBoundaryBegin 4258887 MultipartBoundaryEnd 4258902 MimeEntityBegin 4258902 MimeEntityHeadersEnd 4259095 -MimeContentBegin 4259095 MimeMessageBegin 4259095 MimeMessageHeadersEnd 4259175 MimeEntityBegin 4259095 MimeEntityHeadersEnd 4259175 -MimeContentBegin 4259175 -MimeContentEnd 4259175 Octets 0 Lines 0 MimeEntityEnd 4259173 MimeMessageEnd 4259173 -MimeContentEnd 4259173 Octets 78 Lines 3 MimeEntityEnd 4259173 @@ -1536,18 +1264,14 @@ MultipartBoundaryBegin 4259175 MultipartBoundaryEnd 4259190 MimeEntityBegin 4259190 MimeEntityHeadersEnd 4259332 -MimeContentBegin 4259332 MimeMessageBegin 4259332 MimeMessageHeadersEnd 4259403 MimeEntityBegin 4259332 MimeEntityHeadersEnd 4259403 -MimeContentBegin 4259403 -MimeContentEnd 4259403 Octets 0 Lines 0 MimeEntityEnd 4259401 MimeMessageEnd 4259401 -MimeContentEnd 4259401 Octets 69 Lines 3 MimeEntityEnd 4259401 @@ -1555,18 +1279,14 @@ MultipartBoundaryBegin 4259403 MultipartBoundaryEnd 4259418 MimeEntityBegin 4259418 MimeEntityHeadersEnd 4259535 -MimeContentBegin 4259535 MimeMessageBegin 4259535 MimeMessageHeadersEnd 4259607 MimeEntityBegin 4259535 MimeEntityHeadersEnd 4259607 -MimeContentBegin 4259607 -MimeContentEnd 4259607 Octets 0 Lines 0 MimeEntityEnd 4259605 MimeMessageEnd 4259605 -MimeContentEnd 4259605 Octets 70 Lines 3 MimeEntityEnd 4259605 @@ -1574,18 +1294,14 @@ MultipartBoundaryBegin 4259607 MultipartBoundaryEnd 4259622 MimeEntityBegin 4259622 MimeEntityHeadersEnd 4259731 -MimeContentBegin 4259731 MimeMessageBegin 4259731 MimeMessageHeadersEnd 4259803 MimeEntityBegin 4259731 MimeEntityHeadersEnd 4259803 -MimeContentBegin 4259803 -MimeContentEnd 4259803 Octets 0 Lines 0 MimeEntityEnd 4259801 MimeMessageEnd 4259801 -MimeContentEnd 4259801 Octets 70 Lines 3 MimeEntityEnd 4259801 @@ -1593,7 +1309,6 @@ MultipartEndBoundaryBegin 4259803 MultipartEndBoundaryEnd 4259818 MultipartEpilogueBegin 4259818 MultipartEpilogueEnd 4259820 -MimeContentEnd 4259820 Octets 1219 Lines 50 MimeEntityEnd 4259820 @@ -1601,7 +1316,6 @@ MultipartEndBoundaryBegin 4259822 MultipartEndBoundaryEnd 4259834 MultipartEpilogueBegin 4259834 MultipartEpilogueEnd 4259836 -MimeContentEnd 4259836 Octets 1359 Lines 59 MimeEntityEnd 4259836 @@ -1612,15 +1326,12 @@ MimeMessageBegin 4259847 MimeMessageHeadersEnd 4260427 MimeEntityBegin 4259847 MimeEntityHeadersEnd 4260427 -MimeContentBegin 4260427 MultipartPreambleBegin 4260427 MultipartPreambleEnd 4260427 MultipartBoundaryBegin 4260427 MultipartBoundaryEnd 4260439 MimeEntityBegin 4260439 MimeEntityHeadersEnd 4260441 -MimeContentBegin 4260441 -MimeContentEnd 4263710 Octets 3269 Lines 66 MimeEntityEnd 4263710 @@ -1628,25 +1339,20 @@ MultipartBoundaryBegin 4263712 MultipartBoundaryEnd 4263724 MimeEntityBegin 4263724 MimeEntityHeadersEnd 4263787 -MimeContentBegin 4263787 MultipartPreambleBegin 4263787 MultipartPreambleEnd 4263787 MultipartBoundaryBegin 4263787 MultipartBoundaryEnd 4263802 MimeEntityBegin 4263802 MimeEntityHeadersEnd 4263922 -MimeContentBegin 4263922 MimeMessageBegin 4263922 MimeMessageHeadersEnd 4264002 MimeEntityBegin 4263922 MimeEntityHeadersEnd 4264002 -MimeContentBegin 4264002 -MimeContentEnd 4264071 Octets 69 Lines 3 MimeEntityEnd 4264071 MimeMessageEnd 4264071 -MimeContentEnd 4264071 Octets 149 Lines 6 MimeEntityEnd 4264071 @@ -1654,18 +1360,14 @@ MultipartBoundaryBegin 4264073 MultipartBoundaryEnd 4264088 MimeEntityBegin 4264088 MimeEntityHeadersEnd 4264281 -MimeContentBegin 4264281 MimeMessageBegin 4264281 MimeMessageHeadersEnd 4264361 MimeEntityBegin 4264281 MimeEntityHeadersEnd 4264361 -MimeContentBegin 4264361 -MimeContentEnd 4264361 Octets 0 Lines 0 MimeEntityEnd 4264359 MimeMessageEnd 4264359 -MimeContentEnd 4264359 Octets 78 Lines 3 MimeEntityEnd 4264359 @@ -1673,7 +1375,6 @@ MultipartEndBoundaryBegin 4264361 MultipartEndBoundaryEnd 4264376 MultipartEpilogueBegin 4264376 MultipartEpilogueEnd 4264378 -MimeContentEnd 4264378 Octets 591 Lines 23 MimeEntityEnd 4264378 @@ -1681,7 +1382,6 @@ MultipartEndBoundaryBegin 4264380 MultipartEndBoundaryEnd 4264392 MultipartEpilogueBegin 4264392 MultipartEpilogueEnd 4264394 -MimeContentEnd 4264394 Octets 3967 Lines 96 MimeEntityEnd 4264394 @@ -1692,25 +1392,20 @@ MimeMessageBegin 4264405 MimeMessageHeadersEnd 4264885 MimeEntityBegin 4264405 MimeEntityHeadersEnd 4264885 -MimeContentBegin 4264885 MultipartPreambleBegin 4264885 MultipartPreambleEnd 4264933 MultipartBoundaryBegin 4264933 MultipartBoundaryEnd 4264961 MimeEntityBegin 4264961 MimeEntityHeadersEnd 4265110 -MimeContentBegin 4265110 MimeMessageBegin 4265110 MimeMessageHeadersEnd 4265550 MimeEntityBegin 4265110 MimeEntityHeadersEnd 4265550 -MimeContentBegin 4265550 -MimeContentEnd 4265589 Octets 39 Lines 3 MimeEntityEnd 4265589 MimeMessageEnd 4265589 -MimeContentEnd 4265589 Octets 479 Lines 14 MimeEntityEnd 4265589 @@ -1718,8 +1413,6 @@ MultipartBoundaryBegin 4265591 MultipartBoundaryEnd 4265619 MimeEntityBegin 4265619 MimeEntityHeadersEnd 4265746 -MimeContentBegin 4265746 -MimeContentEnd 4266210 Octets 464 Lines 7 MimeEntityEnd 4266210 @@ -1727,8 +1420,6 @@ MultipartBoundaryBegin 4266212 MultipartBoundaryEnd 4266240 MimeEntityBegin 4266240 MimeEntityHeadersEnd 4266367 -MimeContentBegin 4266367 -MimeContentEnd 4266859 Octets 492 Lines 7 MimeEntityEnd 4266859 @@ -1736,8 +1427,6 @@ MultipartBoundaryBegin 4266861 MultipartBoundaryEnd 4266889 MimeEntityBegin 4266889 MimeEntityHeadersEnd 4267020 -MimeContentBegin 4267020 -MimeContentEnd 4267554 Octets 534 Lines 8 MimeEntityEnd 4267554 @@ -1745,8 +1434,6 @@ MultipartBoundaryBegin 4267556 MultipartBoundaryEnd 4267584 MimeEntityBegin 4267584 MimeEntityHeadersEnd 4267713 -MimeContentBegin 4267713 -MimeContentEnd 4268217 Octets 504 Lines 7 MimeEntityEnd 4268217 @@ -1754,18 +1441,14 @@ MultipartBoundaryBegin 4268219 MultipartBoundaryEnd 4268247 MimeEntityBegin 4268247 MimeEntityHeadersEnd 4268396 -MimeContentBegin 4268396 MimeMessageBegin 4268396 MimeMessageHeadersEnd 4268836 MimeEntityBegin 4268396 MimeEntityHeadersEnd 4268836 -MimeContentBegin 4268836 -MimeContentEnd 4268874 Octets 38 Lines 2 MimeEntityEnd 4268874 MimeMessageEnd 4268874 -MimeContentEnd 4268874 Octets 478 Lines 13 MimeEntityEnd 4268874 @@ -1773,38 +1456,30 @@ MultipartBoundaryBegin 4268876 MultipartBoundaryEnd 4268904 MimeEntityBegin 4268904 MimeEntityHeadersEnd 4269080 -MimeContentBegin 4269080 MimeMessageBegin 4269080 MimeMessageHeadersEnd 4269665 MimeEntityBegin 4269080 MimeEntityHeadersEnd 4269665 -MimeContentBegin 4269665 MimeMessageBegin 4269665 MimeMessageHeadersEnd 4270190 MimeEntityBegin 4269665 MimeEntityHeadersEnd 4270190 -MimeContentBegin 4270190 MimeMessageBegin 4270190 MimeMessageHeadersEnd 4270611 MimeEntityBegin 4270190 MimeEntityHeadersEnd 4270611 -MimeContentBegin 4270611 -MimeContentEnd 4270617 Octets 6 Lines 2 MimeEntityEnd 4270617 MimeMessageEnd 4270617 -MimeContentEnd 4270617 Octets 427 Lines 13 MimeEntityEnd 4270617 MimeMessageEnd 4270617 -MimeContentEnd 4270617 Octets 952 Lines 27 MimeEntityEnd 4270617 MimeMessageEnd 4270617 -MimeContentEnd 4270617 Octets 1537 Lines 42 MimeEntityEnd 4270617 @@ -1812,8 +1487,6 @@ MultipartBoundaryBegin 4270619 MultipartBoundaryEnd 4270647 MimeEntityBegin 4270647 MimeEntityHeadersEnd 4270703 -MimeContentBegin 4270703 -MimeContentEnd 4270756 Octets 53 Lines 2 MimeEntityEnd 4270756 @@ -1821,7 +1494,6 @@ MultipartEndBoundaryBegin 4270758 MultipartEndBoundaryEnd 4270786 MultipartEpilogueBegin 4270786 MultipartEpilogueEnd 4270786 -MimeContentEnd 4270786 Octets 5901 Lines 145 MimeEntityEnd 4270786 @@ -1832,25 +1504,20 @@ MimeMessageBegin 4270797 MimeMessageHeadersEnd 4271280 MimeEntityBegin 4270797 MimeEntityHeadersEnd 4271280 -MimeContentBegin 4271280 MultipartPreambleBegin 4271280 MultipartPreambleEnd 4271328 MultipartBoundaryBegin 4271328 MultipartBoundaryEnd 4271356 MimeEntityBegin 4271356 MimeEntityHeadersEnd 4271509 -MimeContentBegin 4271509 MimeMessageBegin 4271509 MimeMessageHeadersEnd 4271948 MimeEntityBegin 4271509 MimeEntityHeadersEnd 4271948 -MimeContentBegin 4271948 -MimeContentEnd 4271987 Octets 39 Lines 3 MimeEntityEnd 4271987 MimeMessageEnd 4271987 -MimeContentEnd 4271987 Octets 478 Lines 14 MimeEntityEnd 4271987 @@ -1858,8 +1525,6 @@ MultipartBoundaryBegin 4271989 MultipartBoundaryEnd 4272017 MimeEntityBegin 4272017 MimeEntityHeadersEnd 4272148 -MimeContentBegin 4272148 -MimeContentEnd 4272612 Octets 464 Lines 7 MimeEntityEnd 4272612 @@ -1867,8 +1532,6 @@ MultipartBoundaryBegin 4272614 MultipartBoundaryEnd 4272642 MimeEntityBegin 4272642 MimeEntityHeadersEnd 4272773 -MimeContentBegin 4272773 -MimeContentEnd 4273265 Octets 492 Lines 7 MimeEntityEnd 4273265 @@ -1876,8 +1539,6 @@ MultipartBoundaryBegin 4273267 MultipartBoundaryEnd 4273295 MimeEntityBegin 4273295 MimeEntityHeadersEnd 4273430 -MimeContentBegin 4273430 -MimeContentEnd 4273964 Octets 534 Lines 8 MimeEntityEnd 4273964 @@ -1885,8 +1546,6 @@ MultipartBoundaryBegin 4273966 MultipartBoundaryEnd 4273994 MimeEntityBegin 4273994 MimeEntityHeadersEnd 4274127 -MimeContentBegin 4274127 -MimeContentEnd 4274631 Octets 504 Lines 7 MimeEntityEnd 4274631 @@ -1894,18 +1553,14 @@ MultipartBoundaryBegin 4274633 MultipartBoundaryEnd 4274661 MimeEntityBegin 4274661 MimeEntityHeadersEnd 4274814 -MimeContentBegin 4274814 MimeMessageBegin 4274814 MimeMessageHeadersEnd 4275253 MimeEntityBegin 4274814 MimeEntityHeadersEnd 4275253 -MimeContentBegin 4275253 -MimeContentEnd 4275291 Octets 38 Lines 2 MimeEntityEnd 4275291 MimeMessageEnd 4275291 -MimeContentEnd 4275291 Octets 477 Lines 13 MimeEntityEnd 4275291 @@ -1913,38 +1568,30 @@ MultipartBoundaryBegin 4275293 MultipartBoundaryEnd 4275321 MimeEntityBegin 4275321 MimeEntityHeadersEnd 4275501 -MimeContentBegin 4275501 MimeMessageBegin 4275501 MimeMessageHeadersEnd 4276089 MimeEntityBegin 4275501 MimeEntityHeadersEnd 4276089 -MimeContentBegin 4276089 MimeMessageBegin 4276089 MimeMessageHeadersEnd 4276617 MimeEntityBegin 4276089 MimeEntityHeadersEnd 4276617 -MimeContentBegin 4276617 MimeMessageBegin 4276617 MimeMessageHeadersEnd 4277037 MimeEntityBegin 4276617 MimeEntityHeadersEnd 4277037 -MimeContentBegin 4277037 -MimeContentEnd 4277043 Octets 6 Lines 2 MimeEntityEnd 4277043 MimeMessageEnd 4277043 -MimeContentEnd 4277043 Octets 426 Lines 13 MimeEntityEnd 4277043 MimeMessageEnd 4277043 -MimeContentEnd 4277043 Octets 954 Lines 27 MimeEntityEnd 4277043 MimeMessageEnd 4277043 -MimeContentEnd 4277043 Octets 1542 Lines 42 MimeEntityEnd 4277043 @@ -1952,8 +1599,6 @@ MultipartBoundaryBegin 4277045 MultipartBoundaryEnd 4277073 MimeEntityBegin 4277073 MimeEntityHeadersEnd 4277133 -MimeContentBegin 4277133 -MimeContentEnd 4277186 Octets 53 Lines 2 MimeEntityEnd 4277186 @@ -1961,7 +1606,6 @@ MultipartEndBoundaryBegin 4277188 MultipartEndBoundaryEnd 4277216 MultipartEpilogueBegin 4277216 MultipartEpilogueEnd 4277216 -MimeContentEnd 4277216 Octets 5936 Lines 145 MimeEntityEnd 4277216 @@ -1972,15 +1616,12 @@ MimeMessageBegin 4277227 MimeMessageHeadersEnd 4277931 MimeEntityBegin 4277227 MimeEntityHeadersEnd 4277931 -MimeContentBegin 4277931 MultipartPreambleBegin 4277931 MultipartPreambleEnd 4277974 MultipartBoundaryBegin 4277974 MultipartBoundaryEnd 4277981 MimeEntityBegin 4277981 MimeEntityHeadersEnd 4278012 -MimeContentBegin 4278012 -MimeContentEnd 4278458 Octets 446 Lines 31 MimeEntityEnd 4278458 @@ -1988,8 +1629,6 @@ MultipartBoundaryBegin 4278460 MultipartBoundaryEnd 4278467 MimeEntityBegin 4278467 MimeEntityHeadersEnd 4278543 -MimeContentBegin 4278543 -MimeContentEnd 4279216 Octets 673 Lines 43 MimeEntityEnd 4279216 @@ -1997,8 +1636,6 @@ MultipartBoundaryBegin 4279218 MultipartBoundaryEnd 4279225 MimeEntityBegin 4279225 MimeEntityHeadersEnd 4279227 -MimeContentBegin 4279227 -MimeContentEnd 4279245 Octets 18 Lines 1 MimeEntityEnd 4279245 @@ -2006,8 +1643,6 @@ MultipartBoundaryBegin 4279247 MultipartBoundaryEnd 4279254 MimeEntityBegin 4279254 MimeEntityHeadersEnd 4279256 -MimeContentBegin 4279256 -MimeContentEnd 4279267 Octets 11 Lines 1 MimeEntityEnd 4279267 @@ -2015,20 +1650,16 @@ MultipartBoundaryBegin 4279269 MultipartBoundaryEnd 4279276 MimeEntityBegin 4279276 MimeEntityHeadersEnd 4279308 -MimeContentBegin 4279308 MimeMessageBegin 4279308 MimeMessageHeadersEnd 4279530 MimeEntityBegin 4279308 MimeEntityHeadersEnd 4279530 -MimeContentBegin 4279530 MultipartPreambleBegin 4279530 MultipartPreambleEnd 4279530 MultipartBoundaryBegin 4279530 MultipartBoundaryEnd 4279537 MimeEntityBegin 4279537 MimeEntityHeadersEnd 4279564 -MimeContentBegin 4279564 -MimeContentEnd 4279587 Octets 23 Lines 1 MimeEntityEnd 4279587 @@ -2036,8 +1667,6 @@ MultipartBoundaryBegin 4279589 MultipartBoundaryEnd 4279596 MimeEntityBegin 4279596 MimeEntityHeadersEnd 4279776 -MimeContentBegin 4279776 -MimeContentEnd 4279815 Octets 39 Lines 2 MimeEntityEnd 4279815 @@ -2045,12 +1674,10 @@ MultipartEndBoundaryBegin 4279817 MultipartEndBoundaryEnd 4279824 MultipartEpilogueBegin 4279824 MultipartEpilogueEnd 4279824 -MimeContentEnd 4279824 Octets 294 Lines 13 MimeEntityEnd 4279824 MimeMessageEnd 4279824 -MimeContentEnd 4279824 Octets 516 Lines 20 MimeEntityEnd 4279824 @@ -2058,8 +1685,6 @@ MultipartBoundaryBegin 4279826 MultipartBoundaryEnd 4279833 MimeEntityBegin 4279833 MimeEntityHeadersEnd 4279914 -MimeContentBegin 4279914 -MimeContentEnd 4289472 Octets 9558 Lines 128 MimeEntityEnd 4289472 @@ -2067,8 +1692,6 @@ MultipartBoundaryBegin 4289474 MultipartBoundaryEnd 4289481 MimeEntityBegin 4289481 MimeEntityHeadersEnd 4289661 -MimeContentBegin 4289661 -MimeContentEnd 4289700 Octets 39 Lines 2 MimeEntityEnd 4289700 @@ -2076,8 +1699,6 @@ MultipartBoundaryBegin 4289702 MultipartBoundaryEnd 4289709 MimeEntityBegin 4289709 MimeEntityHeadersEnd 4289861 -MimeContentBegin 4289861 -MimeContentEnd 4297809 Octets 7948 Lines 128 MimeEntityEnd 4297809 @@ -2085,25 +1706,20 @@ MultipartBoundaryBegin 4297811 MultipartBoundaryEnd 4297818 MimeEntityBegin 4297818 MimeEntityHeadersEnd 4297872 -MimeContentBegin 4297872 MultipartPreambleBegin 4297872 MultipartPreambleEnd 4297872 MultipartBoundaryBegin 4297872 MultipartBoundaryEnd 4297883 MimeEntityBegin 4297883 MimeEntityHeadersEnd 4297885 -MimeContentBegin 4297885 MimeMessageBegin 4297885 MimeMessageHeadersEnd 4297914 MimeEntityBegin 4297885 MimeEntityHeadersEnd 4297914 -MimeContentBegin 4297914 -MimeContentEnd 4297919 Octets 5 Lines 1 MimeEntityEnd 4297919 MimeMessageEnd 4297919 -MimeContentEnd 4297919 Octets 34 Lines 4 MimeEntityEnd 4297919 @@ -2111,18 +1727,14 @@ MultipartBoundaryBegin 4297921 MultipartBoundaryEnd 4297932 MimeEntityBegin 4297932 MimeEntityHeadersEnd 4297934 -MimeContentBegin 4297934 MimeMessageBegin 4297934 MimeMessageHeadersEnd 4297963 MimeEntityBegin 4297934 MimeEntityHeadersEnd 4297963 -MimeContentBegin 4297963 -MimeContentEnd 4297968 Octets 5 Lines 1 MimeEntityEnd 4297968 MimeMessageEnd 4297968 -MimeContentEnd 4297968 Octets 34 Lines 4 MimeEntityEnd 4297968 @@ -2130,18 +1742,14 @@ MultipartBoundaryBegin 4297970 MultipartBoundaryEnd 4297981 MimeEntityBegin 4297981 MimeEntityHeadersEnd 4297983 -MimeContentBegin 4297983 MimeMessageBegin 4297983 MimeMessageHeadersEnd 4298012 MimeEntityBegin 4297983 MimeEntityHeadersEnd 4298012 -MimeContentBegin 4298012 -MimeContentEnd 4298017 Octets 5 Lines 1 MimeEntityEnd 4298017 MimeMessageEnd 4298017 -MimeContentEnd 4298017 Octets 34 Lines 4 MimeEntityEnd 4298017 @@ -2149,8 +1757,6 @@ MultipartBoundaryBegin 4298019 MultipartBoundaryEnd 4298030 MimeEntityBegin 4298030 MimeEntityHeadersEnd 4298057 -MimeContentBegin 4298057 -MimeContentEnd 4298140 Octets 83 Lines 2 MimeEntityEnd 4298140 @@ -2158,18 +1764,14 @@ MultipartBoundaryBegin 4298142 MultipartBoundaryEnd 4298153 MimeEntityBegin 4298153 MimeEntityHeadersEnd 4298155 -MimeContentBegin 4298155 MimeMessageBegin 4298155 MimeMessageHeadersEnd 4298213 MimeEntityBegin 4298155 MimeEntityHeadersEnd 4298213 -MimeContentBegin 4298213 -MimeContentEnd 4298262 Octets 49 Lines 1 MimeEntityEnd 4298262 MimeMessageEnd 4298262 -MimeContentEnd 4298262 Octets 107 Lines 5 MimeEntityEnd 4298262 @@ -2177,18 +1779,14 @@ MultipartBoundaryBegin 4298264 MultipartBoundaryEnd 4298275 MimeEntityBegin 4298275 MimeEntityHeadersEnd 4298277 -MimeContentBegin 4298277 MimeMessageBegin 4298277 MimeMessageHeadersEnd 4298306 MimeEntityBegin 4298277 MimeEntityHeadersEnd 4298306 -MimeContentBegin 4298306 -MimeContentEnd 4298311 Octets 5 Lines 1 MimeEntityEnd 4298311 MimeMessageEnd 4298311 -MimeContentEnd 4298311 Octets 34 Lines 4 MimeEntityEnd 4298311 @@ -2196,7 +1794,6 @@ MultipartEndBoundaryBegin 4298313 MultipartEndBoundaryEnd 4298324 MultipartEpilogueBegin 4298324 MultipartEpilogueEnd 4298324 -MimeContentEnd 4298324 Octets 452 Lines 37 MimeEntityEnd 4298324 @@ -2204,7 +1801,6 @@ MultipartEndBoundaryBegin 4298326 MultipartEndBoundaryEnd 4298333 MultipartEpilogueBegin 4298333 MultipartEpilogueEnd 4298376 -MimeContentEnd 4298376 Octets 20445 Lines 428 MimeEntityEnd 4298376 @@ -2215,15 +1811,12 @@ MimeMessageBegin 4298387 MimeMessageHeadersEnd 4299063 MimeEntityBegin 4298387 MimeEntityHeadersEnd 4299063 -MimeContentBegin 4299063 MultipartPreambleBegin 4299063 MultipartPreambleEnd 4299063 MultipartBoundaryBegin 4299063 MultipartBoundaryEnd 4299090 MimeEntityBegin 4299090 MimeEntityHeadersEnd 4299092 -MimeContentBegin 4299092 -MimeContentEnd 4300338 Octets 1246 Lines 27 MimeEntityEnd 4300338 @@ -2231,8 +1824,6 @@ MultipartBoundaryBegin 4300340 MultipartBoundaryEnd 4300367 MimeEntityBegin 4300367 MimeEntityHeadersEnd 4300517 -MimeContentBegin 4300517 -MimeContentEnd 4372203 Octets 71686 Lines 370 MimeEntityEnd 4372203 @@ -2240,8 +1831,6 @@ MultipartBoundaryBegin 4372205 MultipartBoundaryEnd 4372232 MimeEntityBegin 4372232 MimeEntityHeadersEnd 4372234 -MimeContentBegin 4372234 -MimeContentEnd 4372234 Octets 0 Lines 1 MimeEntityEnd 4372234 @@ -2249,7 +1838,6 @@ MultipartEndBoundaryBegin 4372236 MultipartEndBoundaryEnd 4372263 MultipartEpilogueBegin 4372263 MultipartEpilogueEnd 4372265 -MimeContentEnd 4372265 Octets 73202 Lines 410 MimeEntityEnd 4372265 @@ -2260,8 +1848,6 @@ MimeMessageBegin 4372276 MimeMessageHeadersEnd 4373229 MimeEntityBegin 4372276 MimeEntityHeadersEnd 4373229 -MimeContentBegin 4373229 -MimeContentEnd 4625700 Octets 252471 Lines 3431 MimeEntityEnd 4625700 @@ -2272,15 +1858,12 @@ MimeMessageBegin 4625711 MimeMessageHeadersEnd 4626660 MimeEntityBegin 4625711 MimeEntityHeadersEnd 4626660 -MimeContentBegin 4626660 MultipartPreambleBegin 4626660 MultipartPreambleEnd 4626859 MultipartBoundaryBegin 4626859 MultipartBoundaryEnd 4626905 MimeEntityBegin 4626905 MimeEntityHeadersEnd 4626981 -MimeContentBegin 4626981 -MimeContentEnd 4627454 Octets 473 Lines 10 MimeEntityEnd 4627454 @@ -2288,8 +1871,6 @@ MultipartBoundaryBegin 4627456 MultipartBoundaryEnd 4627502 MimeEntityBegin 4627502 MimeEntityHeadersEnd 4627564 -MimeContentBegin 4627564 -MimeContentEnd 4652132 Octets 24568 Lines 333 MimeEntityEnd 4652132 @@ -2297,8 +1878,6 @@ MultipartBoundaryBegin 4652134 MultipartBoundaryEnd 4652180 MimeEntityBegin 4652180 MimeEntityHeadersEnd 4652256 -MimeContentBegin 4652256 -MimeContentEnd 4652714 Octets 458 Lines 11 MimeEntityEnd 4652714 @@ -2306,8 +1885,6 @@ MultipartBoundaryBegin 4652716 MultipartBoundaryEnd 4652762 MimeEntityBegin 4652762 MimeEntityHeadersEnd 4652824 -MimeContentBegin 4652824 -MimeContentEnd 4664192 Octets 11368 Lines 155 MimeEntityEnd 4664192 @@ -2315,8 +1892,6 @@ MultipartBoundaryBegin 4664194 MultipartBoundaryEnd 4664240 MimeEntityBegin 4664240 MimeEntityHeadersEnd 4664316 -MimeContentBegin 4664316 -MimeContentEnd 4664626 Octets 310 Lines 7 MimeEntityEnd 4664626 @@ -2324,8 +1899,6 @@ MultipartBoundaryBegin 4664628 MultipartBoundaryEnd 4664674 MimeEntityBegin 4664674 MimeEntityHeadersEnd 4664736 -MimeContentBegin 4664736 -MimeContentEnd 4681412 Octets 16676 Lines 227 MimeEntityEnd 4681412 @@ -2333,8 +1906,6 @@ MultipartBoundaryBegin 4681414 MultipartBoundaryEnd 4681460 MimeEntityBegin 4681460 MimeEntityHeadersEnd 4681536 -MimeContentBegin 4681536 -MimeContentEnd 4682211 Octets 675 Lines 16 MimeEntityEnd 4682211 @@ -2342,7 +1913,6 @@ MultipartEndBoundaryBegin 4682213 MultipartEndBoundaryEnd 4682259 MultipartEpilogueBegin 4682259 MultipartEpilogueEnd 4682261 -MimeContentEnd 4682261 Octets 55601 Lines 793 MimeEntityEnd 4682261 @@ -2353,15 +1923,12 @@ MimeMessageBegin 4682272 MimeMessageHeadersEnd 4683107 MimeEntityBegin 4682272 MimeEntityHeadersEnd 4683107 -MimeContentBegin 4683107 MultipartPreambleBegin 4683107 MultipartPreambleEnd 4683107 MultipartBoundaryBegin 4683107 MultipartBoundaryEnd 4683137 MimeEntityBegin 4683137 MimeEntityHeadersEnd 4683139 -MimeContentBegin 4683139 -MimeContentEnd 4683807 Octets 668 Lines 19 MimeEntityEnd 4683807 @@ -2369,8 +1936,6 @@ MultipartBoundaryBegin 4683809 MultipartBoundaryEnd 4683839 MimeEntityBegin 4683839 MimeEntityHeadersEnd 4683902 -MimeContentBegin 4683902 -MimeContentEnd 4731116 Octets 47214 Lines 762 MimeEntityEnd 4731116 @@ -2378,7 +1943,6 @@ MultipartEndBoundaryBegin 4731118 MultipartEndBoundaryEnd 4731148 MultipartEpilogueBegin 4731148 MultipartEpilogueEnd 4731150 -MimeContentEnd 4731150 Octets 48043 Lines 789 MimeEntityEnd 4731150 @@ -2389,15 +1953,12 @@ MimeMessageBegin 4731161 MimeMessageHeadersEnd 4731922 MimeEntityBegin 4731161 MimeEntityHeadersEnd 4731922 -MimeContentBegin 4731922 MultipartPreambleBegin 4731922 MultipartPreambleEnd 4732363 MultipartBoundaryBegin 4732363 MultipartBoundaryEnd 4732387 MimeEntityBegin 4732387 MimeEntityHeadersEnd 4732463 -MimeContentBegin 4732463 -MimeContentEnd 4737938 Octets 5475 Lines 161 MimeEntityEnd 4737938 @@ -2405,8 +1966,6 @@ MultipartBoundaryBegin 4737940 MultipartBoundaryEnd 4737964 MimeEntityBegin 4737964 MimeEntityHeadersEnd 4738065 -MimeContentBegin 4738065 -MimeContentEnd 4740681 Octets 2616 Lines 37 MimeEntityEnd 4740681 @@ -2414,8 +1973,6 @@ MultipartBoundaryBegin 4740683 MultipartBoundaryEnd 4740707 MimeEntityBegin 4740707 MimeEntityHeadersEnd 4740783 -MimeContentBegin 4740783 -MimeContentEnd 4741311 Octets 528 Lines 11 MimeEntityEnd 4741311 @@ -2423,8 +1980,6 @@ MultipartBoundaryBegin 4741313 MultipartBoundaryEnd 4741337 MimeEntityBegin 4741337 MimeEntityHeadersEnd 4741455 -MimeContentBegin 4741455 -MimeContentEnd 4764831 Octets 23376 Lines 317 MimeEntityEnd 4764831 @@ -2432,8 +1987,6 @@ MultipartBoundaryBegin 4764833 MultipartBoundaryEnd 4764857 MimeEntityBegin 4764857 MimeEntityHeadersEnd 4764933 -MimeContentBegin 4764933 -MimeContentEnd 4765525 Octets 592 Lines 15 MimeEntityEnd 4765525 @@ -2441,18 +1994,14 @@ MultipartBoundaryBegin 4765527 MultipartBoundaryEnd 4765551 MimeEntityBegin 4765551 MimeEntityHeadersEnd 4765640 -MimeContentBegin 4765640 MimeMessageBegin 4765640 MimeMessageHeadersEnd 4765713 MimeEntityBegin 4765640 MimeEntityHeadersEnd 4765713 -MimeContentBegin 4765713 -MimeContentEnd 4765713 Octets 0 Lines 0 MimeEntityEnd 4765711 MimeMessageEnd 4765711 -MimeContentEnd 4765711 Octets 71 Lines 3 MimeEntityEnd 4765711 @@ -2460,8 +2009,6 @@ MultipartBoundaryBegin 4765713 MultipartBoundaryEnd 4765737 MimeEntityBegin 4765737 MimeEntityHeadersEnd 4765813 -MimeContentBegin 4765813 -MimeContentEnd 4766094 Octets 281 Lines 6 MimeEntityEnd 4766094 @@ -2469,18 +2016,14 @@ MultipartBoundaryBegin 4766096 MultipartBoundaryEnd 4766120 MimeEntityBegin 4766120 MimeEntityHeadersEnd 4766273 -MimeContentBegin 4766273 MimeMessageBegin 4766273 MimeMessageHeadersEnd 4766346 MimeEntityBegin 4766273 MimeEntityHeadersEnd 4766346 -MimeContentBegin 4766346 -MimeContentEnd 4766346 Octets 0 Lines 0 MimeEntityEnd 4766344 MimeMessageEnd 4766344 -MimeContentEnd 4766344 Octets 71 Lines 3 MimeEntityEnd 4766344 @@ -2488,8 +2031,6 @@ MultipartBoundaryBegin 4766346 MultipartBoundaryEnd 4766370 MimeEntityBegin 4766370 MimeEntityHeadersEnd 4766446 -MimeContentBegin 4766446 -MimeContentEnd 4767549 Octets 1103 Lines 35 MimeEntityEnd 4767549 @@ -2497,7 +2038,6 @@ MultipartEndBoundaryBegin 4767551 MultipartEndBoundaryEnd 4767575 MultipartEpilogueBegin 4767575 MultipartEpilogueEnd 4767575 -MimeContentEnd 4767575 Octets 35653 Lines 639 MimeEntityEnd 4767575 @@ -2508,15 +2048,12 @@ MimeMessageBegin 4767586 MimeMessageHeadersEnd 4767753 MimeEntityBegin 4767586 MimeEntityHeadersEnd 4767753 -MimeContentBegin 4767753 MultipartPreambleBegin 4767753 MultipartPreambleEnd 4767753 MultipartBoundaryBegin 4767753 MultipartBoundaryEnd 4767766 MimeEntityBegin 4767766 MimeEntityHeadersEnd 4767838 -MimeContentBegin 4767838 -MimeContentEnd 4845327 Octets 77489 Lines 1146 MimeEntityEnd 4845327 @@ -2524,8 +2061,6 @@ MultipartBoundaryBegin 4845329 MultipartBoundaryEnd 4845342 MimeEntityBegin 4845342 MimeEntityHeadersEnd 4845344 -MimeContentBegin 4845344 -MimeContentEnd 4845374 Octets 30 Lines 1 MimeEntityEnd 4845374 @@ -2533,7 +2068,6 @@ MultipartEndBoundaryBegin 4845376 MultipartEndBoundaryEnd 4845389 MultipartEpilogueBegin 4845389 MultipartEpilogueEnd 4845389 -MimeContentEnd 4845389 Octets 77636 Lines 1154 MimeEntityEnd 4845389 @@ -2544,15 +2078,12 @@ MimeMessageBegin 4845400 MimeMessageHeadersEnd 4846638 MimeEntityBegin 4845400 MimeEntityHeadersEnd 4846638 -MimeContentBegin 4846638 MultipartPreambleBegin 4846638 MultipartPreambleEnd 4846638 MultipartBoundaryBegin 4846638 MultipartBoundaryEnd 4846677 MimeEntityBegin 4846677 MimeEntityHeadersEnd 4846723 -MimeContentBegin 4846723 -MimeContentEnd 4847183 Octets 460 Lines 9 MimeEntityEnd 4847183 @@ -2560,8 +2091,6 @@ MultipartBoundaryBegin 4847185 MultipartBoundaryEnd 4847224 MimeEntityBegin 4847224 MimeEntityHeadersEnd 4847321 -MimeContentBegin 4847321 -MimeContentEnd 4977159 Octets 129838 Lines 2096 MimeEntityEnd 4977159 @@ -2569,7 +2098,6 @@ MultipartEndBoundaryBegin 4977161 MultipartEndBoundaryEnd 4977200 MultipartEpilogueBegin 4977200 MultipartEpilogueEnd 4977202 -MimeContentEnd 4977202 Octets 130564 Lines 2115 MimeEntityEnd 4977202 @@ -2580,15 +2108,12 @@ MimeMessageBegin 4977213 MimeMessageHeadersEnd 4977982 MimeEntityBegin 4977213 MimeEntityHeadersEnd 4977982 -MimeContentBegin 4977982 MultipartPreambleBegin 4977982 MultipartPreambleEnd 4978327 MultipartBoundaryBegin 4978327 MultipartBoundaryEnd 4978386 MimeEntityBegin 4978386 MimeEntityHeadersEnd 4978388 -MimeContentBegin 4978388 -MimeContentEnd 4979201 Octets 813 Lines 19 MimeEntityEnd 4979201 @@ -2596,15 +2121,12 @@ MultipartBoundaryBegin 4979203 MultipartBoundaryEnd 4979262 MimeEntityBegin 4979262 MimeEntityHeadersEnd 4979368 -MimeContentBegin 4979368 MultipartPreambleBegin 4979368 MultipartPreambleEnd 4979368 MultipartBoundaryBegin 4979368 MultipartBoundaryEnd 4979429 MimeEntityBegin 4979429 MimeEntityHeadersEnd 4979505 -MimeContentBegin 4979505 -MimeContentEnd 4980001 Octets 496 Lines 8 MimeEntityEnd 4980001 @@ -2612,8 +2134,6 @@ MultipartBoundaryBegin 4980003 MultipartBoundaryEnd 4980064 MimeEntityBegin 4980064 MimeEntityHeadersEnd 4980164 -MimeContentBegin 4980164 -MimeContentEnd 4993344 Octets 13180 Lines 191 MimeEntityEnd 4993344 @@ -2621,8 +2141,6 @@ MultipartBoundaryBegin 4993346 MultipartBoundaryEnd 4993407 MimeEntityBegin 4993407 MimeEntityHeadersEnd 4993480 -MimeContentBegin 4993480 -MimeContentEnd 4993501 Octets 21 Lines 2 MimeEntityEnd 4993501 @@ -2630,8 +2148,6 @@ MultipartBoundaryBegin 4993503 MultipartBoundaryEnd 4993564 MimeEntityBegin 4993564 MimeEntityHeadersEnd 4993664 -MimeContentBegin 4993664 -MimeContentEnd 5050148 Octets 56484 Lines 765 MimeEntityEnd 5050148 @@ -2639,8 +2155,6 @@ MultipartBoundaryBegin 5050150 MultipartBoundaryEnd 5050211 MimeEntityBegin 5050211 MimeEntityHeadersEnd 5050284 -MimeContentBegin 5050284 -MimeContentEnd 5050341 Octets 57 Lines 6 MimeEntityEnd 5050341 @@ -2648,8 +2162,6 @@ MultipartBoundaryBegin 5050343 MultipartBoundaryEnd 5050404 MimeEntityBegin 5050404 MimeEntityHeadersEnd 5050468 -MimeContentBegin 5050468 -MimeContentEnd 5154020 Octets 103552 Lines 1401 MimeEntityEnd 5154020 @@ -2657,8 +2169,6 @@ MultipartBoundaryBegin 5154022 MultipartBoundaryEnd 5154083 MimeEntityBegin 5154083 MimeEntityHeadersEnd 5154156 -MimeContentBegin 5154156 -MimeContentEnd 5154160 Octets 4 Lines 3 MimeEntityEnd 5154160 @@ -2666,7 +2176,6 @@ MultipartEndBoundaryBegin 5154162 MultipartEndBoundaryEnd 5154223 MultipartEpilogueBegin 5154223 MultipartEpilogueEnd 5154225 -MimeContentEnd 5154225 Octets 174857 Lines 2408 MimeEntityEnd 5154225 @@ -2674,7 +2183,6 @@ MultipartEndBoundaryBegin 5154227 MultipartEndBoundaryEnd 5154286 MultipartEpilogueBegin 5154286 MultipartEpilogueEnd 5154286 -MimeContentEnd 5154286 Octets 176304 Lines 2440 MimeEntityEnd 5154286 @@ -2685,15 +2193,12 @@ MimeMessageBegin 5154297 MimeMessageHeadersEnd 5154999 MimeEntityBegin 5154297 MimeEntityHeadersEnd 5154999 -MimeContentBegin 5154999 MultipartPreambleBegin 5154999 MultipartPreambleEnd 5155157 MultipartBoundaryBegin 5155157 MultipartBoundaryEnd 5155198 MimeEntityBegin 5155198 MimeEntityHeadersEnd 5155244 -MimeContentBegin 5155244 -MimeContentEnd 5156788 Octets 1544 Lines 30 MimeEntityEnd 5156788 @@ -2701,15 +2206,12 @@ MultipartBoundaryBegin 5156790 MultipartBoundaryEnd 5156831 MimeEntityBegin 5156831 MimeEntityHeadersEnd 5156919 -MimeContentBegin 5156919 MultipartPreambleBegin 5156919 MultipartPreambleEnd 5156919 MultipartBoundaryBegin 5156919 MultipartBoundaryEnd 5156962 MimeEntityBegin 5156962 MimeEntityHeadersEnd 5157056 -MimeContentBegin 5157056 -MimeContentEnd 5157976 Octets 920 Lines 14 MimeEntityEnd 5157976 @@ -2717,8 +2219,6 @@ MultipartBoundaryBegin 5157978 MultipartBoundaryEnd 5158021 MimeEntityBegin 5158021 MimeEntityHeadersEnd 5158116 -MimeContentBegin 5158116 -MimeContentEnd 5193480 Octets 35364 Lines 507 MimeEntityEnd 5193480 @@ -2726,8 +2226,6 @@ MultipartBoundaryBegin 5193482 MultipartBoundaryEnd 5193525 MimeEntityBegin 5193525 MimeEntityHeadersEnd 5193619 -MimeContentBegin 5193619 -MimeContentEnd 5193631 Octets 12 Lines 3 MimeEntityEnd 5193631 @@ -2735,8 +2233,6 @@ MultipartBoundaryBegin 5193633 MultipartBoundaryEnd 5193676 MimeEntityBegin 5193676 MimeEntityHeadersEnd 5193771 -MimeContentBegin 5193771 -MimeContentEnd 5215415 Octets 21644 Lines 311 MimeEntityEnd 5215415 @@ -2744,8 +2240,6 @@ MultipartBoundaryBegin 5215417 MultipartBoundaryEnd 5215460 MimeEntityBegin 5215460 MimeEntityHeadersEnd 5215554 -MimeContentBegin 5215554 -MimeContentEnd 5215566 Octets 12 Lines 3 MimeEntityEnd 5215566 @@ -2753,8 +2247,6 @@ MultipartBoundaryBegin 5215568 MultipartBoundaryEnd 5215611 MimeEntityBegin 5215611 MimeEntityHeadersEnd 5215706 -MimeContentBegin 5215706 -MimeContentEnd 5248620 Octets 32914 Lines 472 MimeEntityEnd 5248620 @@ -2762,8 +2254,6 @@ MultipartBoundaryBegin 5248622 MultipartBoundaryEnd 5248665 MimeEntityBegin 5248665 MimeEntityHeadersEnd 5248759 -MimeContentBegin 5248759 -MimeContentEnd 5248771 Octets 12 Lines 3 MimeEntityEnd 5248771 @@ -2771,8 +2261,6 @@ MultipartBoundaryBegin 5248773 MultipartBoundaryEnd 5248816 MimeEntityBegin 5248816 MimeEntityHeadersEnd 5248911 -MimeContentBegin 5248911 -MimeContentEnd 5282837 Octets 33926 Lines 486 MimeEntityEnd 5282837 @@ -2780,8 +2268,6 @@ MultipartBoundaryBegin 5282839 MultipartBoundaryEnd 5282882 MimeEntityBegin 5282882 MimeEntityHeadersEnd 5282976 -MimeContentBegin 5282976 -MimeContentEnd 5282988 Octets 12 Lines 3 MimeEntityEnd 5282988 @@ -2789,8 +2275,6 @@ MultipartBoundaryBegin 5282990 MultipartBoundaryEnd 5283033 MimeEntityBegin 5283033 MimeEntityHeadersEnd 5283128 -MimeContentBegin 5283128 -MimeContentEnd 5311368 Octets 28240 Lines 405 MimeEntityEnd 5311368 @@ -2798,8 +2282,6 @@ MultipartBoundaryBegin 5311370 MultipartBoundaryEnd 5311413 MimeEntityBegin 5311413 MimeEntityHeadersEnd 5311507 -MimeContentBegin 5311507 -MimeContentEnd 5311519 Octets 12 Lines 3 MimeEntityEnd 5311519 @@ -2807,8 +2289,6 @@ MultipartBoundaryBegin 5311521 MultipartBoundaryEnd 5311564 MimeEntityBegin 5311564 MimeEntityHeadersEnd 5311659 -MimeContentBegin 5311659 -MimeContentEnd 5345639 Octets 33980 Lines 487 MimeEntityEnd 5345639 @@ -2816,8 +2296,6 @@ MultipartBoundaryBegin 5345641 MultipartBoundaryEnd 5345684 MimeEntityBegin 5345684 MimeEntityHeadersEnd 5345778 -MimeContentBegin 5345778 -MimeContentEnd 5345790 Octets 12 Lines 3 MimeEntityEnd 5345790 @@ -2825,8 +2303,6 @@ MultipartBoundaryBegin 5345792 MultipartBoundaryEnd 5345835 MimeEntityBegin 5345835 MimeEntityHeadersEnd 5345930 -MimeContentBegin 5345930 -MimeContentEnd 5372976 Octets 27046 Lines 388 MimeEntityEnd 5372976 @@ -2834,8 +2310,6 @@ MultipartBoundaryBegin 5372978 MultipartBoundaryEnd 5373021 MimeEntityBegin 5373021 MimeEntityHeadersEnd 5373115 -MimeContentBegin 5373115 -MimeContentEnd 5373192 Octets 77 Lines 4 MimeEntityEnd 5373192 @@ -2843,7 +2317,6 @@ MultipartEndBoundaryBegin 5373194 MultipartEndBoundaryEnd 5373237 MultipartEpilogueBegin 5373237 MultipartEpilogueEnd 5373239 -MimeContentEnd 5373239 Octets 216320 Lines 3161 MimeEntityEnd 5373239 @@ -2851,7 +2324,6 @@ MultipartEndBoundaryBegin 5373241 MultipartEndBoundaryEnd 5373282 MultipartEpilogueBegin 5373282 MultipartEpilogueEnd 5373282 -MimeContentEnd 5373282 Octets 218283 Lines 3202 MimeEntityEnd 5373282 @@ -2862,15 +2334,12 @@ MimeMessageBegin 5373293 MimeMessageHeadersEnd 5373698 MimeEntityBegin 5373293 MimeEntityHeadersEnd 5373698 -MimeContentBegin 5373698 MultipartPreambleBegin 5373698 MultipartPreambleEnd 5373897 MultipartBoundaryBegin 5373897 MultipartBoundaryEnd 5373947 MimeEntityBegin 5373947 MimeEntityHeadersEnd 5374045 -MimeContentBegin 5374045 -MimeContentEnd 5374257 Octets 212 Lines 10 MimeEntityEnd 5374257 @@ -2878,8 +2347,6 @@ MultipartBoundaryBegin 5374259 MultipartBoundaryEnd 5374309 MimeEntityBegin 5374309 MimeEntityHeadersEnd 5374373 -MimeContentBegin 5374373 -MimeContentEnd 5464185 Octets 89812 Lines 1215 MimeEntityEnd 5464185 @@ -2887,8 +2354,6 @@ MultipartBoundaryBegin 5464187 MultipartBoundaryEnd 5464237 MimeEntityBegin 5464237 MimeEntityHeadersEnd 5464265 -MimeContentBegin 5464265 -MimeContentEnd 5464296 Octets 31 Lines 2 MimeEntityEnd 5464296 @@ -2896,7 +2361,6 @@ MultipartEndBoundaryBegin 5464298 MultipartEndBoundaryEnd 5464348 MultipartEpilogueBegin 5464348 MultipartEpilogueEnd 5464350 -MimeContentEnd 5464350 Octets 90652 Lines 1244 MimeEntityEnd 5464350 @@ -2907,8 +2371,6 @@ MimeMessageBegin 5464361 MimeMessageHeadersEnd 5465317 MimeEntityBegin 5464361 MimeEntityHeadersEnd 5465317 -MimeContentBegin 5465317 -MimeContentEnd 5516722 Octets 51405 Lines 697 MimeEntityEnd 5516722 @@ -2919,15 +2381,12 @@ MimeMessageBegin 5516733 MimeMessageHeadersEnd 5517362 MimeEntityBegin 5516733 MimeEntityHeadersEnd 5517362 -MimeContentBegin 5517362 MultipartPreambleBegin 5517362 MultipartPreambleEnd 5517362 MultipartBoundaryBegin 5517362 MultipartBoundaryEnd 5517381 MimeEntityBegin 5517381 MimeEntityHeadersEnd 5517383 -MimeContentBegin 5517383 -MimeContentEnd 5521801 Octets 4418 Lines 102 MimeEntityEnd 5521801 @@ -2935,25 +2394,20 @@ MultipartBoundaryBegin 5521803 MultipartBoundaryEnd 5521822 MimeEntityBegin 5521822 MimeEntityHeadersEnd 5521966 -MimeContentBegin 5521966 MultipartPreambleBegin 5521966 MultipartPreambleEnd 5521966 MultipartBoundaryBegin 5521966 MultipartBoundaryEnd 5521998 MimeEntityBegin 5521998 MimeEntityHeadersEnd 5522000 -MimeContentBegin 5522000 MimeMessageBegin 5522000 MimeMessageHeadersEnd 5522109 MimeEntityBegin 5522000 MimeEntityHeadersEnd 5522109 -MimeContentBegin 5522109 -MimeContentEnd 5522748 Octets 639 Lines 19 MimeEntityEnd 5522748 MimeMessageEnd 5522748 -MimeContentEnd 5522748 Octets 748 Lines 23 MimeEntityEnd 5522748 @@ -2961,18 +2415,14 @@ MultipartBoundaryBegin 5522750 MultipartBoundaryEnd 5522782 MimeEntityBegin 5522782 MimeEntityHeadersEnd 5522784 -MimeContentBegin 5522784 MimeMessageBegin 5522784 MimeMessageHeadersEnd 5522909 MimeEntityBegin 5522784 MimeEntityHeadersEnd 5522909 -MimeContentBegin 5522909 -MimeContentEnd 5523662 Octets 753 Lines 21 MimeEntityEnd 5523662 MimeMessageEnd 5523662 -MimeContentEnd 5523662 Octets 878 Lines 25 MimeEntityEnd 5523662 @@ -2980,18 +2430,14 @@ MultipartBoundaryBegin 5523664 MultipartBoundaryEnd 5523696 MimeEntityBegin 5523696 MimeEntityHeadersEnd 5523698 -MimeContentBegin 5523698 MimeMessageBegin 5523698 MimeMessageHeadersEnd 5523821 MimeEntityBegin 5523698 MimeEntityHeadersEnd 5523821 -MimeContentBegin 5523821 -MimeContentEnd 5524481 Octets 660 Lines 15 MimeEntityEnd 5524481 MimeMessageEnd 5524481 -MimeContentEnd 5524481 Octets 783 Lines 19 MimeEntityEnd 5524481 @@ -2999,18 +2445,14 @@ MultipartBoundaryBegin 5524483 MultipartBoundaryEnd 5524515 MimeEntityBegin 5524515 MimeEntityHeadersEnd 5524517 -MimeContentBegin 5524517 MimeMessageBegin 5524517 MimeMessageHeadersEnd 5524677 MimeEntityBegin 5524517 MimeEntityHeadersEnd 5524677 -MimeContentBegin 5524677 -MimeContentEnd 5525170 Octets 493 Lines 11 MimeEntityEnd 5525170 MimeMessageEnd 5525170 -MimeContentEnd 5525170 Octets 653 Lines 15 MimeEntityEnd 5525170 @@ -3018,18 +2460,14 @@ MultipartBoundaryBegin 5525172 MultipartBoundaryEnd 5525204 MimeEntityBegin 5525204 MimeEntityHeadersEnd 5525206 -MimeContentBegin 5525206 MimeMessageBegin 5525206 MimeMessageHeadersEnd 5525364 MimeEntityBegin 5525206 MimeEntityHeadersEnd 5525364 -MimeContentBegin 5525364 -MimeContentEnd 5525951 Octets 587 Lines 16 MimeEntityEnd 5525951 MimeMessageEnd 5525951 -MimeContentEnd 5525951 Octets 745 Lines 20 MimeEntityEnd 5525951 @@ -3037,18 +2475,14 @@ MultipartBoundaryBegin 5525953 MultipartBoundaryEnd 5525985 MimeEntityBegin 5525985 MimeEntityHeadersEnd 5525987 -MimeContentBegin 5525987 MimeMessageBegin 5525987 MimeMessageHeadersEnd 5526148 MimeEntityBegin 5525987 MimeEntityHeadersEnd 5526148 -MimeContentBegin 5526148 -MimeContentEnd 5527449 Octets 1301 Lines 27 MimeEntityEnd 5527449 MimeMessageEnd 5527449 -MimeContentEnd 5527449 Octets 1462 Lines 31 MimeEntityEnd 5527449 @@ -3056,18 +2490,14 @@ MultipartBoundaryBegin 5527451 MultipartBoundaryEnd 5527483 MimeEntityBegin 5527483 MimeEntityHeadersEnd 5527485 -MimeContentBegin 5527485 MimeMessageBegin 5527485 MimeMessageHeadersEnd 5527642 MimeEntityBegin 5527485 MimeEntityHeadersEnd 5527642 -MimeContentBegin 5527642 -MimeContentEnd 5528052 Octets 410 Lines 10 MimeEntityEnd 5528052 MimeMessageEnd 5528052 -MimeContentEnd 5528052 Octets 567 Lines 14 MimeEntityEnd 5528052 @@ -3075,18 +2505,14 @@ MultipartBoundaryBegin 5528054 MultipartBoundaryEnd 5528086 MimeEntityBegin 5528086 MimeEntityHeadersEnd 5528088 -MimeContentBegin 5528088 MimeMessageBegin 5528088 MimeMessageHeadersEnd 5528239 MimeEntityBegin 5528088 MimeEntityHeadersEnd 5528239 -MimeContentBegin 5528239 -MimeContentEnd 5528642 Octets 403 Lines 8 MimeEntityEnd 5528642 MimeMessageEnd 5528642 -MimeContentEnd 5528642 Octets 554 Lines 12 MimeEntityEnd 5528642 @@ -3094,18 +2520,14 @@ MultipartBoundaryBegin 5528644 MultipartBoundaryEnd 5528676 MimeEntityBegin 5528676 MimeEntityHeadersEnd 5528678 -MimeContentBegin 5528678 MimeMessageBegin 5528678 MimeMessageHeadersEnd 5528825 MimeEntityBegin 5528678 MimeEntityHeadersEnd 5528825 -MimeContentBegin 5528825 -MimeContentEnd 5529476 Octets 651 Lines 12 MimeEntityEnd 5529476 MimeMessageEnd 5529476 -MimeContentEnd 5529476 Octets 798 Lines 16 MimeEntityEnd 5529476 @@ -3113,18 +2535,14 @@ MultipartBoundaryBegin 5529478 MultipartBoundaryEnd 5529510 MimeEntityBegin 5529510 MimeEntityHeadersEnd 5529512 -MimeContentBegin 5529512 MimeMessageBegin 5529512 MimeMessageHeadersEnd 5529653 MimeEntityBegin 5529512 MimeEntityHeadersEnd 5529653 -MimeContentBegin 5529653 -MimeContentEnd 5530649 Octets 996 Lines 20 MimeEntityEnd 5530649 MimeMessageEnd 5530649 -MimeContentEnd 5530649 Octets 1137 Lines 24 MimeEntityEnd 5530649 @@ -3132,18 +2550,14 @@ MultipartBoundaryBegin 5530651 MultipartBoundaryEnd 5530683 MimeEntityBegin 5530683 MimeEntityHeadersEnd 5530685 -MimeContentBegin 5530685 MimeMessageBegin 5530685 MimeMessageHeadersEnd 5530836 MimeEntityBegin 5530685 MimeEntityHeadersEnd 5530836 -MimeContentBegin 5530836 -MimeContentEnd 5531753 Octets 917 Lines 28 MimeEntityEnd 5531753 MimeMessageEnd 5531753 -MimeContentEnd 5531753 Octets 1068 Lines 32 MimeEntityEnd 5531753 @@ -3151,18 +2565,14 @@ MultipartBoundaryBegin 5531755 MultipartBoundaryEnd 5531787 MimeEntityBegin 5531787 MimeEntityHeadersEnd 5531789 -MimeContentBegin 5531789 MimeMessageBegin 5531789 MimeMessageHeadersEnd 5531924 MimeEntityBegin 5531789 MimeEntityHeadersEnd 5531924 -MimeContentBegin 5531924 -MimeContentEnd 5532494 Octets 570 Lines 12 MimeEntityEnd 5532494 MimeMessageEnd 5532494 -MimeContentEnd 5532494 Octets 705 Lines 16 MimeEntityEnd 5532494 @@ -3170,18 +2580,14 @@ MultipartBoundaryBegin 5532496 MultipartBoundaryEnd 5532528 MimeEntityBegin 5532528 MimeEntityHeadersEnd 5532530 -MimeContentBegin 5532530 MimeMessageBegin 5532530 MimeMessageHeadersEnd 5532666 MimeEntityBegin 5532530 MimeEntityHeadersEnd 5532666 -MimeContentBegin 5532666 -MimeContentEnd 5533113 Octets 447 Lines 11 MimeEntityEnd 5533113 MimeMessageEnd 5533113 -MimeContentEnd 5533113 Octets 583 Lines 15 MimeEntityEnd 5533113 @@ -3189,18 +2595,14 @@ MultipartBoundaryBegin 5533115 MultipartBoundaryEnd 5533147 MimeEntityBegin 5533147 MimeEntityHeadersEnd 5533149 -MimeContentBegin 5533149 MimeMessageBegin 5533149 MimeMessageHeadersEnd 5533270 MimeEntityBegin 5533149 MimeEntityHeadersEnd 5533270 -MimeContentBegin 5533270 -MimeContentEnd 5533837 Octets 567 Lines 16 MimeEntityEnd 5533837 MimeMessageEnd 5533837 -MimeContentEnd 5533837 Octets 688 Lines 20 MimeEntityEnd 5533837 @@ -3208,18 +2610,14 @@ MultipartBoundaryBegin 5533839 MultipartBoundaryEnd 5533871 MimeEntityBegin 5533871 MimeEntityHeadersEnd 5533873 -MimeContentBegin 5533873 MimeMessageBegin 5533873 MimeMessageHeadersEnd 5533992 MimeEntityBegin 5533873 MimeEntityHeadersEnd 5533992 -MimeContentBegin 5533992 -MimeContentEnd 5534185 Octets 193 Lines 9 MimeEntityEnd 5534185 MimeMessageEnd 5534185 -MimeContentEnd 5534185 Octets 312 Lines 13 MimeEntityEnd 5534185 @@ -3227,18 +2625,14 @@ MultipartBoundaryBegin 5534187 MultipartBoundaryEnd 5534219 MimeEntityBegin 5534219 MimeEntityHeadersEnd 5534221 -MimeContentBegin 5534221 MimeMessageBegin 5534221 MimeMessageHeadersEnd 5534342 MimeEntityBegin 5534221 MimeEntityHeadersEnd 5534342 -MimeContentBegin 5534342 -MimeContentEnd 5534677 Octets 335 Lines 8 MimeEntityEnd 5534677 MimeMessageEnd 5534677 -MimeContentEnd 5534677 Octets 456 Lines 12 MimeEntityEnd 5534677 @@ -3246,18 +2640,14 @@ MultipartBoundaryBegin 5534679 MultipartBoundaryEnd 5534711 MimeEntityBegin 5534711 MimeEntityHeadersEnd 5534713 -MimeContentBegin 5534713 MimeMessageBegin 5534713 MimeMessageHeadersEnd 5534840 MimeEntityBegin 5534713 MimeEntityHeadersEnd 5534840 -MimeContentBegin 5534840 -MimeContentEnd 5535528 Octets 688 Lines 22 MimeEntityEnd 5535528 MimeMessageEnd 5535528 -MimeContentEnd 5535528 Octets 815 Lines 26 MimeEntityEnd 5535528 @@ -3265,18 +2655,14 @@ MultipartBoundaryBegin 5535530 MultipartBoundaryEnd 5535562 MimeEntityBegin 5535562 MimeEntityHeadersEnd 5535564 -MimeContentBegin 5535564 MimeMessageBegin 5535564 MimeMessageHeadersEnd 5535692 MimeEntityBegin 5535564 MimeEntityHeadersEnd 5535692 -MimeContentBegin 5535692 -MimeContentEnd 5535799 Octets 107 Lines 6 MimeEntityEnd 5535799 MimeMessageEnd 5535799 -MimeContentEnd 5535799 Octets 235 Lines 10 MimeEntityEnd 5535799 @@ -3284,18 +2670,14 @@ MultipartBoundaryBegin 5535801 MultipartBoundaryEnd 5535833 MimeEntityBegin 5535833 MimeEntityHeadersEnd 5535835 -MimeContentBegin 5535835 MimeMessageBegin 5535835 MimeMessageHeadersEnd 5535981 MimeEntityBegin 5535835 MimeEntityHeadersEnd 5535981 -MimeContentBegin 5535981 -MimeContentEnd 5536838 Octets 857 Lines 22 MimeEntityEnd 5536838 MimeMessageEnd 5536838 -MimeContentEnd 5536838 Octets 1003 Lines 26 MimeEntityEnd 5536838 @@ -3303,18 +2685,14 @@ MultipartBoundaryBegin 5536840 MultipartBoundaryEnd 5536872 MimeEntityBegin 5536872 MimeEntityHeadersEnd 5536874 -MimeContentBegin 5536874 MimeMessageBegin 5536874 MimeMessageHeadersEnd 5536988 MimeEntityBegin 5536874 MimeEntityHeadersEnd 5536988 -MimeContentBegin 5536988 -MimeContentEnd 5537416 Octets 428 Lines 10 MimeEntityEnd 5537416 MimeMessageEnd 5537416 -MimeContentEnd 5537416 Octets 542 Lines 14 MimeEntityEnd 5537416 @@ -3322,18 +2700,14 @@ MultipartBoundaryBegin 5537418 MultipartBoundaryEnd 5537450 MimeEntityBegin 5537450 MimeEntityHeadersEnd 5537452 -MimeContentBegin 5537452 MimeMessageBegin 5537452 MimeMessageHeadersEnd 5537628 MimeEntityBegin 5537452 MimeEntityHeadersEnd 5537628 -MimeContentBegin 5537628 -MimeContentEnd 5537867 Octets 239 Lines 10 MimeEntityEnd 5537867 MimeMessageEnd 5537867 -MimeContentEnd 5537867 Octets 415 Lines 14 MimeEntityEnd 5537867 @@ -3341,18 +2715,14 @@ MultipartBoundaryBegin 5537869 MultipartBoundaryEnd 5537901 MimeEntityBegin 5537901 MimeEntityHeadersEnd 5537903 -MimeContentBegin 5537903 MimeMessageBegin 5537903 MimeMessageHeadersEnd 5538033 MimeEntityBegin 5537903 MimeEntityHeadersEnd 5538033 -MimeContentBegin 5538033 -MimeContentEnd 5538444 Octets 411 Lines 13 MimeEntityEnd 5538444 MimeMessageEnd 5538444 -MimeContentEnd 5538444 Octets 541 Lines 17 MimeEntityEnd 5538444 @@ -3360,18 +2730,14 @@ MultipartBoundaryBegin 5538446 MultipartBoundaryEnd 5538478 MimeEntityBegin 5538478 MimeEntityHeadersEnd 5538480 -MimeContentBegin 5538480 MimeMessageBegin 5538480 MimeMessageHeadersEnd 5538601 MimeEntityBegin 5538480 MimeEntityHeadersEnd 5538601 -MimeContentBegin 5538601 -MimeContentEnd 5539533 Octets 932 Lines 29 MimeEntityEnd 5539533 MimeMessageEnd 5539533 -MimeContentEnd 5539533 Octets 1053 Lines 33 MimeEntityEnd 5539533 @@ -3379,18 +2745,14 @@ MultipartBoundaryBegin 5539535 MultipartBoundaryEnd 5539567 MimeEntityBegin 5539567 MimeEntityHeadersEnd 5539569 -MimeContentBegin 5539569 MimeMessageBegin 5539569 MimeMessageHeadersEnd 5539701 MimeEntityBegin 5539569 MimeEntityHeadersEnd 5539701 -MimeContentBegin 5539701 -MimeContentEnd 5540001 Octets 300 Lines 10 MimeEntityEnd 5540001 MimeMessageEnd 5540001 -MimeContentEnd 5540001 Octets 432 Lines 14 MimeEntityEnd 5540001 @@ -3398,18 +2760,14 @@ MultipartBoundaryBegin 5540003 MultipartBoundaryEnd 5540035 MimeEntityBegin 5540035 MimeEntityHeadersEnd 5540037 -MimeContentBegin 5540037 MimeMessageBegin 5540037 MimeMessageHeadersEnd 5540170 MimeEntityBegin 5540037 MimeEntityHeadersEnd 5540170 -MimeContentBegin 5540170 -MimeContentEnd 5540594 Octets 424 Lines 15 MimeEntityEnd 5540594 MimeMessageEnd 5540594 -MimeContentEnd 5540594 Octets 557 Lines 19 MimeEntityEnd 5540594 @@ -3417,18 +2775,14 @@ MultipartBoundaryBegin 5540596 MultipartBoundaryEnd 5540628 MimeEntityBegin 5540628 MimeEntityHeadersEnd 5540630 -MimeContentBegin 5540630 MimeMessageBegin 5540630 MimeMessageHeadersEnd 5540749 MimeEntityBegin 5540630 MimeEntityHeadersEnd 5540749 -MimeContentBegin 5540749 -MimeContentEnd 5540898 Octets 149 Lines 5 MimeEntityEnd 5540898 MimeMessageEnd 5540898 -MimeContentEnd 5540898 Octets 268 Lines 9 MimeEntityEnd 5540898 @@ -3436,18 +2790,14 @@ MultipartBoundaryBegin 5540900 MultipartBoundaryEnd 5540932 MimeEntityBegin 5540932 MimeEntityHeadersEnd 5540934 -MimeContentBegin 5540934 MimeMessageBegin 5540934 MimeMessageHeadersEnd 5541063 MimeEntityBegin 5540934 MimeEntityHeadersEnd 5541063 -MimeContentBegin 5541063 -MimeContentEnd 5541249 Octets 186 Lines 8 MimeEntityEnd 5541249 MimeMessageEnd 5541249 -MimeContentEnd 5541249 Octets 315 Lines 12 MimeEntityEnd 5541249 @@ -3455,18 +2805,14 @@ MultipartBoundaryBegin 5541251 MultipartBoundaryEnd 5541283 MimeEntityBegin 5541283 MimeEntityHeadersEnd 5541285 -MimeContentBegin 5541285 MimeMessageBegin 5541285 MimeMessageHeadersEnd 5541419 MimeEntityBegin 5541285 MimeEntityHeadersEnd 5541419 -MimeContentBegin 5541419 -MimeContentEnd 5542149 Octets 730 Lines 15 MimeEntityEnd 5542149 MimeMessageEnd 5542149 -MimeContentEnd 5542149 Octets 864 Lines 19 MimeEntityEnd 5542149 @@ -3474,18 +2820,14 @@ MultipartBoundaryBegin 5542151 MultipartBoundaryEnd 5542183 MimeEntityBegin 5542183 MimeEntityHeadersEnd 5542185 -MimeContentBegin 5542185 MimeMessageBegin 5542185 MimeMessageHeadersEnd 5542335 MimeEntityBegin 5542185 MimeEntityHeadersEnd 5542335 -MimeContentBegin 5542335 -MimeContentEnd 5543318 Octets 983 Lines 27 MimeEntityEnd 5543318 MimeMessageEnd 5543318 -MimeContentEnd 5543318 Octets 1133 Lines 31 MimeEntityEnd 5543318 @@ -3493,18 +2835,14 @@ MultipartBoundaryBegin 5543320 MultipartBoundaryEnd 5543352 MimeEntityBegin 5543352 MimeEntityHeadersEnd 5543354 -MimeContentBegin 5543354 MimeMessageBegin 5543354 MimeMessageHeadersEnd 5543492 MimeEntityBegin 5543354 MimeEntityHeadersEnd 5543492 -MimeContentBegin 5543492 -MimeContentEnd 5543746 Octets 254 Lines 8 MimeEntityEnd 5543746 MimeMessageEnd 5543746 -MimeContentEnd 5543746 Octets 392 Lines 12 MimeEntityEnd 5543746 @@ -3512,18 +2850,14 @@ MultipartBoundaryBegin 5543748 MultipartBoundaryEnd 5543780 MimeEntityBegin 5543780 MimeEntityHeadersEnd 5543782 -MimeContentBegin 5543782 MimeMessageBegin 5543782 MimeMessageHeadersEnd 5543908 MimeEntityBegin 5543782 MimeEntityHeadersEnd 5543908 -MimeContentBegin 5543908 -MimeContentEnd 5544041 Octets 133 Lines 7 MimeEntityEnd 5544041 MimeMessageEnd 5544041 -MimeContentEnd 5544041 Octets 259 Lines 11 MimeEntityEnd 5544041 @@ -3531,18 +2865,14 @@ MultipartBoundaryBegin 5544043 MultipartBoundaryEnd 5544075 MimeEntityBegin 5544075 MimeEntityHeadersEnd 5544077 -MimeContentBegin 5544077 MimeMessageBegin 5544077 MimeMessageHeadersEnd 5544257 MimeEntityBegin 5544077 MimeEntityHeadersEnd 5544257 -MimeContentBegin 5544257 -MimeContentEnd 5545018 Octets 761 Lines 17 MimeEntityEnd 5545018 MimeMessageEnd 5545018 -MimeContentEnd 5545018 Octets 941 Lines 22 MimeEntityEnd 5545018 @@ -3550,18 +2880,14 @@ MultipartBoundaryBegin 5545020 MultipartBoundaryEnd 5545052 MimeEntityBegin 5545052 MimeEntityHeadersEnd 5545054 -MimeContentBegin 5545054 MimeMessageBegin 5545054 MimeMessageHeadersEnd 5545218 MimeEntityBegin 5545054 MimeEntityHeadersEnd 5545218 -MimeContentBegin 5545218 -MimeContentEnd 5545633 Octets 415 Lines 17 MimeEntityEnd 5545633 MimeMessageEnd 5545633 -MimeContentEnd 5545633 Octets 579 Lines 21 MimeEntityEnd 5545633 @@ -3569,18 +2895,14 @@ MultipartBoundaryBegin 5545635 MultipartBoundaryEnd 5545667 MimeEntityBegin 5545667 MimeEntityHeadersEnd 5545669 -MimeContentBegin 5545669 MimeMessageBegin 5545669 MimeMessageHeadersEnd 5545805 MimeEntityBegin 5545669 MimeEntityHeadersEnd 5545805 -MimeContentBegin 5545805 -MimeContentEnd 5547113 Octets 1308 Lines 22 MimeEntityEnd 5547113 MimeMessageEnd 5547113 -MimeContentEnd 5547113 Octets 1444 Lines 26 MimeEntityEnd 5547113 @@ -3588,18 +2910,14 @@ MultipartBoundaryBegin 5547115 MultipartBoundaryEnd 5547147 MimeEntityBegin 5547147 MimeEntityHeadersEnd 5547149 -MimeContentBegin 5547149 MimeMessageBegin 5547149 MimeMessageHeadersEnd 5547259 MimeEntityBegin 5547149 MimeEntityHeadersEnd 5547259 -MimeContentBegin 5547259 -MimeContentEnd 5547408 Octets 149 Lines 7 MimeEntityEnd 5547408 MimeMessageEnd 5547408 -MimeContentEnd 5547408 Octets 259 Lines 11 MimeEntityEnd 5547408 @@ -3607,18 +2925,14 @@ MultipartBoundaryBegin 5547410 MultipartBoundaryEnd 5547442 MimeEntityBegin 5547442 MimeEntityHeadersEnd 5547444 -MimeContentBegin 5547444 MimeMessageBegin 5547444 MimeMessageHeadersEnd 5547585 MimeEntityBegin 5547444 MimeEntityHeadersEnd 5547585 -MimeContentBegin 5547585 -MimeContentEnd 5547895 Octets 310 Lines 12 MimeEntityEnd 5547895 MimeMessageEnd 5547895 -MimeContentEnd 5547895 Octets 451 Lines 16 MimeEntityEnd 5547895 @@ -3626,18 +2940,14 @@ MultipartBoundaryBegin 5547897 MultipartBoundaryEnd 5547929 MimeEntityBegin 5547929 MimeEntityHeadersEnd 5547931 -MimeContentBegin 5547931 MimeMessageBegin 5547931 MimeMessageHeadersEnd 5548061 MimeEntityBegin 5547931 MimeEntityHeadersEnd 5548061 -MimeContentBegin 5548061 -MimeContentEnd 5548254 Octets 193 Lines 7 MimeEntityEnd 5548254 MimeMessageEnd 5548254 -MimeContentEnd 5548254 Octets 323 Lines 11 MimeEntityEnd 5548254 @@ -3645,18 +2955,14 @@ MultipartBoundaryBegin 5548256 MultipartBoundaryEnd 5548288 MimeEntityBegin 5548288 MimeEntityHeadersEnd 5548290 -MimeContentBegin 5548290 MimeMessageBegin 5548290 MimeMessageHeadersEnd 5548399 MimeEntityBegin 5548290 MimeEntityHeadersEnd 5548399 -MimeContentBegin 5548399 -MimeContentEnd 5548809 Octets 410 Lines 13 MimeEntityEnd 5548809 MimeMessageEnd 5548809 -MimeContentEnd 5548809 Octets 519 Lines 17 MimeEntityEnd 5548809 @@ -3664,18 +2970,14 @@ MultipartBoundaryBegin 5548811 MultipartBoundaryEnd 5548843 MimeEntityBegin 5548843 MimeEntityHeadersEnd 5548845 -MimeContentBegin 5548845 MimeMessageBegin 5548845 MimeMessageHeadersEnd 5548983 MimeEntityBegin 5548845 MimeEntityHeadersEnd 5548983 -MimeContentBegin 5548983 -MimeContentEnd 5549293 Octets 310 Lines 9 MimeEntityEnd 5549293 MimeMessageEnd 5549293 -MimeContentEnd 5549293 Octets 448 Lines 13 MimeEntityEnd 5549293 @@ -3683,18 +2985,14 @@ MultipartBoundaryBegin 5549295 MultipartBoundaryEnd 5549327 MimeEntityBegin 5549327 MimeEntityHeadersEnd 5549329 -MimeContentBegin 5549329 MimeMessageBegin 5549329 MimeMessageHeadersEnd 5549476 MimeEntityBegin 5549329 MimeEntityHeadersEnd 5549476 -MimeContentBegin 5549476 -MimeContentEnd 5550111 Octets 635 Lines 18 MimeEntityEnd 5550111 MimeMessageEnd 5550111 -MimeContentEnd 5550111 Octets 782 Lines 22 MimeEntityEnd 5550111 @@ -3702,18 +3000,14 @@ MultipartBoundaryBegin 5550113 MultipartBoundaryEnd 5550145 MimeEntityBegin 5550145 MimeEntityHeadersEnd 5550147 -MimeContentBegin 5550147 MimeMessageBegin 5550147 MimeMessageHeadersEnd 5550304 MimeEntityBegin 5550147 MimeEntityHeadersEnd 5550304 -MimeContentBegin 5550304 -MimeContentEnd 5550789 Octets 485 Lines 11 MimeEntityEnd 5550789 MimeMessageEnd 5550789 -MimeContentEnd 5550789 Octets 642 Lines 15 MimeEntityEnd 5550789 @@ -3721,18 +3015,14 @@ MultipartBoundaryBegin 5550791 MultipartBoundaryEnd 5550823 MimeEntityBegin 5550823 MimeEntityHeadersEnd 5550825 -MimeContentBegin 5550825 MimeMessageBegin 5550825 MimeMessageHeadersEnd 5550962 MimeEntityBegin 5550825 MimeEntityHeadersEnd 5550962 -MimeContentBegin 5550962 -MimeContentEnd 5552161 Octets 1199 Lines 28 MimeEntityEnd 5552161 MimeMessageEnd 5552161 -MimeContentEnd 5552161 Octets 1336 Lines 32 MimeEntityEnd 5552161 @@ -3740,18 +3030,14 @@ MultipartBoundaryBegin 5552163 MultipartBoundaryEnd 5552195 MimeEntityBegin 5552195 MimeEntityHeadersEnd 5552197 -MimeContentBegin 5552197 MimeMessageBegin 5552197 MimeMessageHeadersEnd 5552377 MimeEntityBegin 5552197 MimeEntityHeadersEnd 5552377 -MimeContentBegin 5552377 -MimeContentEnd 5552644 Octets 267 Lines 9 MimeEntityEnd 5552644 MimeMessageEnd 5552644 -MimeContentEnd 5552644 Octets 447 Lines 13 MimeEntityEnd 5552644 @@ -3759,18 +3045,14 @@ MultipartBoundaryBegin 5552646 MultipartBoundaryEnd 5552678 MimeEntityBegin 5552678 MimeEntityHeadersEnd 5552680 -MimeContentBegin 5552680 MimeMessageBegin 5552680 MimeMessageHeadersEnd 5552799 MimeEntityBegin 5552680 MimeEntityHeadersEnd 5552799 -MimeContentBegin 5552799 -MimeContentEnd 5552996 Octets 197 Lines 5 MimeEntityEnd 5552996 MimeMessageEnd 5552996 -MimeContentEnd 5552996 Octets 316 Lines 9 MimeEntityEnd 5552996 @@ -3778,18 +3060,14 @@ MultipartBoundaryBegin 5552998 MultipartBoundaryEnd 5553030 MimeEntityBegin 5553030 MimeEntityHeadersEnd 5553032 -MimeContentBegin 5553032 MimeMessageBegin 5553032 MimeMessageHeadersEnd 5553176 MimeEntityBegin 5553032 MimeEntityHeadersEnd 5553176 -MimeContentBegin 5553176 -MimeContentEnd 5554065 Octets 889 Lines 25 MimeEntityEnd 5554065 MimeMessageEnd 5554065 -MimeContentEnd 5554065 Octets 1033 Lines 29 MimeEntityEnd 5554065 @@ -3797,18 +3075,14 @@ MultipartBoundaryBegin 5554067 MultipartBoundaryEnd 5554099 MimeEntityBegin 5554099 MimeEntityHeadersEnd 5554101 -MimeContentBegin 5554101 MimeMessageBegin 5554101 MimeMessageHeadersEnd 5554230 MimeEntityBegin 5554101 MimeEntityHeadersEnd 5554230 -MimeContentBegin 5554230 -MimeContentEnd 5554955 Octets 725 Lines 12 MimeEntityEnd 5554955 MimeMessageEnd 5554955 -MimeContentEnd 5554955 Octets 854 Lines 16 MimeEntityEnd 5554955 @@ -3816,18 +3090,14 @@ MultipartBoundaryBegin 5554957 MultipartBoundaryEnd 5554989 MimeEntityBegin 5554989 MimeEntityHeadersEnd 5554991 -MimeContentBegin 5554991 MimeMessageBegin 5554991 MimeMessageHeadersEnd 5555107 MimeEntityBegin 5554991 MimeEntityHeadersEnd 5555107 -MimeContentBegin 5555107 -MimeContentEnd 5555827 Octets 720 Lines 18 MimeEntityEnd 5555827 MimeMessageEnd 5555827 -MimeContentEnd 5555827 Octets 836 Lines 22 MimeEntityEnd 5555827 @@ -3835,18 +3105,14 @@ MultipartBoundaryBegin 5555829 MultipartBoundaryEnd 5555861 MimeEntityBegin 5555861 MimeEntityHeadersEnd 5555863 -MimeContentBegin 5555863 MimeMessageBegin 5555863 MimeMessageHeadersEnd 5555999 MimeEntityBegin 5555863 MimeEntityHeadersEnd 5555999 -MimeContentBegin 5555999 -MimeContentEnd 5556390 Octets 391 Lines 12 MimeEntityEnd 5556390 MimeMessageEnd 5556390 -MimeContentEnd 5556390 Octets 527 Lines 16 MimeEntityEnd 5556390 @@ -3854,18 +3120,14 @@ MultipartBoundaryBegin 5556392 MultipartBoundaryEnd 5556424 MimeEntityBegin 5556424 MimeEntityHeadersEnd 5556426 -MimeContentBegin 5556426 MimeMessageBegin 5556426 MimeMessageHeadersEnd 5556566 MimeEntityBegin 5556426 MimeEntityHeadersEnd 5556566 -MimeContentBegin 5556566 -MimeContentEnd 5557567 Octets 1001 Lines 25 MimeEntityEnd 5557567 MimeMessageEnd 5557567 -MimeContentEnd 5557567 Octets 1141 Lines 29 MimeEntityEnd 5557567 @@ -3873,18 +3135,14 @@ MultipartBoundaryBegin 5557569 MultipartBoundaryEnd 5557601 MimeEntityBegin 5557601 MimeEntityHeadersEnd 5557603 -MimeContentBegin 5557603 MimeMessageBegin 5557603 MimeMessageHeadersEnd 5557752 MimeEntityBegin 5557603 MimeEntityHeadersEnd 5557752 -MimeContentBegin 5557752 -MimeContentEnd 5558229 Octets 477 Lines 11 MimeEntityEnd 5558229 MimeMessageEnd 5558229 -MimeContentEnd 5558229 Octets 626 Lines 15 MimeEntityEnd 5558229 @@ -3892,18 +3150,14 @@ MultipartBoundaryBegin 5558231 MultipartBoundaryEnd 5558263 MimeEntityBegin 5558263 MimeEntityHeadersEnd 5558265 -MimeContentBegin 5558265 MimeMessageBegin 5558265 MimeMessageHeadersEnd 5558402 MimeEntityBegin 5558265 MimeEntityHeadersEnd 5558402 -MimeContentBegin 5558402 -MimeContentEnd 5558691 Octets 289 Lines 11 MimeEntityEnd 5558691 MimeMessageEnd 5558691 -MimeContentEnd 5558691 Octets 426 Lines 15 MimeEntityEnd 5558691 @@ -3911,18 +3165,14 @@ MultipartBoundaryBegin 5558693 MultipartBoundaryEnd 5558725 MimeEntityBegin 5558725 MimeEntityHeadersEnd 5558727 -MimeContentBegin 5558727 MimeMessageBegin 5558727 MimeMessageHeadersEnd 5558856 MimeEntityBegin 5558727 MimeEntityHeadersEnd 5558856 -MimeContentBegin 5558856 -MimeContentEnd 5559142 Octets 286 Lines 5 MimeEntityEnd 5559142 MimeMessageEnd 5559142 -MimeContentEnd 5559142 Octets 415 Lines 9 MimeEntityEnd 5559142 @@ -3930,18 +3180,14 @@ MultipartBoundaryBegin 5559144 MultipartBoundaryEnd 5559176 MimeEntityBegin 5559176 MimeEntityHeadersEnd 5559178 -MimeContentBegin 5559178 MimeMessageBegin 5559178 MimeMessageHeadersEnd 5559303 MimeEntityBegin 5559178 MimeEntityHeadersEnd 5559303 -MimeContentBegin 5559303 -MimeContentEnd 5559973 Octets 670 Lines 28 MimeEntityEnd 5559973 MimeMessageEnd 5559973 -MimeContentEnd 5559973 Octets 795 Lines 32 MimeEntityEnd 5559973 @@ -3949,18 +3195,14 @@ MultipartBoundaryBegin 5559975 MultipartBoundaryEnd 5560007 MimeEntityBegin 5560007 MimeEntityHeadersEnd 5560009 -MimeContentBegin 5560009 MimeMessageBegin 5560009 MimeMessageHeadersEnd 5560157 MimeEntityBegin 5560009 MimeEntityHeadersEnd 5560157 -MimeContentBegin 5560157 -MimeContentEnd 5562461 Octets 2304 Lines 47 MimeEntityEnd 5562461 MimeMessageEnd 5562461 -MimeContentEnd 5562461 Octets 2452 Lines 51 MimeEntityEnd 5562461 @@ -3968,18 +3210,14 @@ MultipartBoundaryBegin 5562463 MultipartBoundaryEnd 5562495 MimeEntityBegin 5562495 MimeEntityHeadersEnd 5562497 -MimeContentBegin 5562497 MimeMessageBegin 5562497 MimeMessageHeadersEnd 5562623 MimeEntityBegin 5562497 MimeEntityHeadersEnd 5562623 -MimeContentBegin 5562623 -MimeContentEnd 5563432 Octets 809 Lines 18 MimeEntityEnd 5563432 MimeMessageEnd 5563432 -MimeContentEnd 5563432 Octets 935 Lines 22 MimeEntityEnd 5563432 @@ -3987,18 +3225,14 @@ MultipartBoundaryBegin 5563434 MultipartBoundaryEnd 5563466 MimeEntityBegin 5563466 MimeEntityHeadersEnd 5563468 -MimeContentBegin 5563468 MimeMessageBegin 5563468 MimeMessageHeadersEnd 5563566 MimeEntityBegin 5563468 MimeEntityHeadersEnd 5563566 -MimeContentBegin 5563566 -MimeContentEnd 5563802 Octets 236 Lines 11 MimeEntityEnd 5563802 MimeMessageEnd 5563802 -MimeContentEnd 5563802 Octets 334 Lines 15 MimeEntityEnd 5563802 @@ -4006,18 +3240,14 @@ MultipartBoundaryBegin 5563804 MultipartBoundaryEnd 5563836 MimeEntityBegin 5563836 MimeEntityHeadersEnd 5563838 -MimeContentBegin 5563838 MimeMessageBegin 5563838 MimeMessageHeadersEnd 5563963 MimeEntityBegin 5563838 MimeEntityHeadersEnd 5563963 -MimeContentBegin 5563963 -MimeContentEnd 5564651 Octets 688 Lines 21 MimeEntityEnd 5564651 MimeMessageEnd 5564651 -MimeContentEnd 5564651 Octets 813 Lines 25 MimeEntityEnd 5564651 @@ -4025,18 +3255,14 @@ MultipartBoundaryBegin 5564653 MultipartBoundaryEnd 5564685 MimeEntityBegin 5564685 MimeEntityHeadersEnd 5564687 -MimeContentBegin 5564687 MimeMessageBegin 5564687 MimeMessageHeadersEnd 5564801 MimeEntityBegin 5564687 MimeEntityHeadersEnd 5564801 -MimeContentBegin 5564801 -MimeContentEnd 5567416 Octets 2615 Lines 69 MimeEntityEnd 5567416 MimeMessageEnd 5567416 -MimeContentEnd 5567416 Octets 2729 Lines 73 MimeEntityEnd 5567416 @@ -4044,18 +3270,14 @@ MultipartBoundaryBegin 5567418 MultipartBoundaryEnd 5567450 MimeEntityBegin 5567450 MimeEntityHeadersEnd 5567452 -MimeContentBegin 5567452 MimeMessageBegin 5567452 MimeMessageHeadersEnd 5567562 MimeEntityBegin 5567452 MimeEntityHeadersEnd 5567562 -MimeContentBegin 5567562 -MimeContentEnd 5568805 Octets 1243 Lines 35 MimeEntityEnd 5568805 MimeMessageEnd 5568805 -MimeContentEnd 5568805 Octets 1353 Lines 39 MimeEntityEnd 5568805 @@ -4063,18 +3285,14 @@ MultipartBoundaryBegin 5568807 MultipartBoundaryEnd 5568839 MimeEntityBegin 5568839 MimeEntityHeadersEnd 5568841 -MimeContentBegin 5568841 MimeMessageBegin 5568841 MimeMessageHeadersEnd 5568951 MimeEntityBegin 5568841 MimeEntityHeadersEnd 5568951 -MimeContentBegin 5568951 -MimeContentEnd 5570791 Octets 1840 Lines 44 MimeEntityEnd 5570791 MimeMessageEnd 5570791 -MimeContentEnd 5570791 Octets 1950 Lines 48 MimeEntityEnd 5570791 @@ -4082,18 +3300,14 @@ MultipartBoundaryBegin 5570793 MultipartBoundaryEnd 5570825 MimeEntityBegin 5570825 MimeEntityHeadersEnd 5570827 -MimeContentBegin 5570827 MimeMessageBegin 5570827 MimeMessageHeadersEnd 5570960 MimeEntityBegin 5570827 MimeEntityHeadersEnd 5570960 -MimeContentBegin 5570960 -MimeContentEnd 5571542 Octets 582 Lines 13 MimeEntityEnd 5571542 MimeMessageEnd 5571542 -MimeContentEnd 5571542 Octets 715 Lines 17 MimeEntityEnd 5571542 @@ -4101,18 +3315,14 @@ MultipartBoundaryBegin 5571544 MultipartBoundaryEnd 5571576 MimeEntityBegin 5571576 MimeEntityHeadersEnd 5571578 -MimeContentBegin 5571578 MimeMessageBegin 5571578 MimeMessageHeadersEnd 5571670 MimeEntityBegin 5571578 MimeEntityHeadersEnd 5571670 -MimeContentBegin 5571670 -MimeContentEnd 5573024 Octets 1354 Lines 21 MimeEntityEnd 5573024 MimeMessageEnd 5573024 -MimeContentEnd 5573024 Octets 1446 Lines 25 MimeEntityEnd 5573024 @@ -4120,18 +3330,14 @@ MultipartBoundaryBegin 5573026 MultipartBoundaryEnd 5573058 MimeEntityBegin 5573058 MimeEntityHeadersEnd 5573060 -MimeContentBegin 5573060 MimeMessageBegin 5573060 MimeMessageHeadersEnd 5573180 MimeEntityBegin 5573060 MimeEntityHeadersEnd 5573180 -MimeContentBegin 5573180 -MimeContentEnd 5575356 Octets 2176 Lines 50 MimeEntityEnd 5575356 MimeMessageEnd 5575356 -MimeContentEnd 5575356 Octets 2296 Lines 54 MimeEntityEnd 5575356 @@ -4139,18 +3345,14 @@ MultipartBoundaryBegin 5575358 MultipartBoundaryEnd 5575390 MimeEntityBegin 5575390 MimeEntityHeadersEnd 5575392 -MimeContentBegin 5575392 MimeMessageBegin 5575392 MimeMessageHeadersEnd 5575517 MimeEntityBegin 5575392 MimeEntityHeadersEnd 5575517 -MimeContentBegin 5575517 -MimeContentEnd 5577580 Octets 2063 Lines 43 MimeEntityEnd 5577580 MimeMessageEnd 5577580 -MimeContentEnd 5577580 Octets 2188 Lines 47 MimeEntityEnd 5577580 @@ -4158,18 +3360,14 @@ MultipartBoundaryBegin 5577582 MultipartBoundaryEnd 5577614 MimeEntityBegin 5577614 MimeEntityHeadersEnd 5577616 -MimeContentBegin 5577616 MimeMessageBegin 5577616 MimeMessageHeadersEnd 5577741 MimeEntityBegin 5577616 MimeEntityHeadersEnd 5577741 -MimeContentBegin 5577741 -MimeContentEnd 5578437 Octets 696 Lines 20 MimeEntityEnd 5578437 MimeMessageEnd 5578437 -MimeContentEnd 5578437 Octets 821 Lines 24 MimeEntityEnd 5578437 @@ -4177,18 +3375,14 @@ MultipartBoundaryBegin 5578439 MultipartBoundaryEnd 5578471 MimeEntityBegin 5578471 MimeEntityHeadersEnd 5578473 -MimeContentBegin 5578473 MimeMessageBegin 5578473 MimeMessageHeadersEnd 5578614 MimeEntityBegin 5578473 MimeEntityHeadersEnd 5578614 -MimeContentBegin 5578614 -MimeContentEnd 5579450 Octets 836 Lines 17 MimeEntityEnd 5579450 MimeMessageEnd 5579450 -MimeContentEnd 5579450 Octets 977 Lines 21 MimeEntityEnd 5579450 @@ -4196,18 +3390,14 @@ MultipartBoundaryBegin 5579452 MultipartBoundaryEnd 5579484 MimeEntityBegin 5579484 MimeEntityHeadersEnd 5579486 -MimeContentBegin 5579486 MimeMessageBegin 5579486 MimeMessageHeadersEnd 5579614 MimeEntityBegin 5579486 MimeEntityHeadersEnd 5579614 -MimeContentBegin 5579614 -MimeContentEnd 5580359 Octets 745 Lines 22 MimeEntityEnd 5580359 MimeMessageEnd 5580359 -MimeContentEnd 5580359 Octets 873 Lines 26 MimeEntityEnd 5580359 @@ -4215,18 +3405,14 @@ MultipartBoundaryBegin 5580361 MultipartBoundaryEnd 5580393 MimeEntityBegin 5580393 MimeEntityHeadersEnd 5580395 -MimeContentBegin 5580395 MimeMessageBegin 5580395 MimeMessageHeadersEnd 5580501 MimeEntityBegin 5580395 MimeEntityHeadersEnd 5580501 -MimeContentBegin 5580501 -MimeContentEnd 5581257 Octets 756 Lines 17 MimeEntityEnd 5581257 MimeMessageEnd 5581257 -MimeContentEnd 5581257 Octets 862 Lines 21 MimeEntityEnd 5581257 @@ -4234,18 +3420,14 @@ MultipartBoundaryBegin 5581259 MultipartBoundaryEnd 5581291 MimeEntityBegin 5581291 MimeEntityHeadersEnd 5581293 -MimeContentBegin 5581293 MimeMessageBegin 5581293 MimeMessageHeadersEnd 5581454 MimeEntityBegin 5581293 MimeEntityHeadersEnd 5581454 -MimeContentBegin 5581454 -MimeContentEnd 5581820 Octets 366 Lines 8 MimeEntityEnd 5581820 MimeMessageEnd 5581820 -MimeContentEnd 5581820 Octets 527 Lines 13 MimeEntityEnd 5581820 @@ -4253,18 +3435,14 @@ MultipartBoundaryBegin 5581822 MultipartBoundaryEnd 5581854 MimeEntityBegin 5581854 MimeEntityHeadersEnd 5581856 -MimeContentBegin 5581856 MimeMessageBegin 5581856 MimeMessageHeadersEnd 5581947 MimeEntityBegin 5581856 MimeEntityHeadersEnd 5581947 -MimeContentBegin 5581947 -MimeContentEnd 5582597 Octets 650 Lines 16 MimeEntityEnd 5582597 MimeMessageEnd 5582597 -MimeContentEnd 5582597 Octets 741 Lines 20 MimeEntityEnd 5582597 @@ -4272,18 +3450,14 @@ MultipartBoundaryBegin 5582599 MultipartBoundaryEnd 5582631 MimeEntityBegin 5582631 MimeEntityHeadersEnd 5582633 -MimeContentBegin 5582633 MimeMessageBegin 5582633 MimeMessageHeadersEnd 5582786 MimeEntityBegin 5582633 MimeEntityHeadersEnd 5582786 -MimeContentBegin 5582786 -MimeContentEnd 5583169 Octets 383 Lines 18 MimeEntityEnd 5583169 MimeMessageEnd 5583169 -MimeContentEnd 5583169 Octets 536 Lines 22 MimeEntityEnd 5583169 @@ -4291,18 +3465,14 @@ MultipartBoundaryBegin 5583171 MultipartBoundaryEnd 5583203 MimeEntityBegin 5583203 MimeEntityHeadersEnd 5583205 -MimeContentBegin 5583205 MimeMessageBegin 5583205 MimeMessageHeadersEnd 5583310 MimeEntityBegin 5583205 MimeEntityHeadersEnd 5583310 -MimeContentBegin 5583310 -MimeContentEnd 5583604 Octets 294 Lines 7 MimeEntityEnd 5583604 MimeMessageEnd 5583604 -MimeContentEnd 5583604 Octets 399 Lines 11 MimeEntityEnd 5583604 @@ -4310,18 +3480,14 @@ MultipartBoundaryBegin 5583606 MultipartBoundaryEnd 5583638 MimeEntityBegin 5583638 MimeEntityHeadersEnd 5583640 -MimeContentBegin 5583640 MimeMessageBegin 5583640 MimeMessageHeadersEnd 5583772 MimeEntityBegin 5583640 MimeEntityHeadersEnd 5583772 -MimeContentBegin 5583772 -MimeContentEnd 5584267 Octets 495 Lines 17 MimeEntityEnd 5584267 MimeMessageEnd 5584267 -MimeContentEnd 5584267 Octets 627 Lines 21 MimeEntityEnd 5584267 @@ -4329,18 +3495,14 @@ MultipartBoundaryBegin 5584269 MultipartBoundaryEnd 5584301 MimeEntityBegin 5584301 MimeEntityHeadersEnd 5584303 -MimeContentBegin 5584303 MimeMessageBegin 5584303 MimeMessageHeadersEnd 5584404 MimeEntityBegin 5584303 MimeEntityHeadersEnd 5584404 -MimeContentBegin 5584404 -MimeContentEnd 5584803 Octets 399 Lines 20 MimeEntityEnd 5584803 MimeMessageEnd 5584803 -MimeContentEnd 5584803 Octets 500 Lines 24 MimeEntityEnd 5584803 @@ -4348,18 +3510,14 @@ MultipartBoundaryBegin 5584805 MultipartBoundaryEnd 5584837 MimeEntityBegin 5584837 MimeEntityHeadersEnd 5584839 -MimeContentBegin 5584839 MimeMessageBegin 5584839 MimeMessageHeadersEnd 5584958 MimeEntityBegin 5584839 MimeEntityHeadersEnd 5584958 -MimeContentBegin 5584958 -MimeContentEnd 5586303 Octets 1345 Lines 27 MimeEntityEnd 5586303 MimeMessageEnd 5586303 -MimeContentEnd 5586303 Octets 1464 Lines 31 MimeEntityEnd 5586303 @@ -4367,18 +3525,14 @@ MultipartBoundaryBegin 5586305 MultipartBoundaryEnd 5586337 MimeEntityBegin 5586337 MimeEntityHeadersEnd 5586339 -MimeContentBegin 5586339 MimeMessageBegin 5586339 MimeMessageHeadersEnd 5586443 MimeEntityBegin 5586339 MimeEntityHeadersEnd 5586443 -MimeContentBegin 5586443 -MimeContentEnd 5586747 Octets 304 Lines 10 MimeEntityEnd 5586747 MimeMessageEnd 5586747 -MimeContentEnd 5586747 Octets 408 Lines 14 MimeEntityEnd 5586747 @@ -4386,18 +3540,14 @@ MultipartBoundaryBegin 5586749 MultipartBoundaryEnd 5586781 MimeEntityBegin 5586781 MimeEntityHeadersEnd 5586783 -MimeContentBegin 5586783 MimeMessageBegin 5586783 MimeMessageHeadersEnd 5586930 MimeEntityBegin 5586783 MimeEntityHeadersEnd 5586930 -MimeContentBegin 5586930 -MimeContentEnd 5587985 Octets 1055 Lines 37 MimeEntityEnd 5587985 MimeMessageEnd 5587985 -MimeContentEnd 5587985 Octets 1202 Lines 41 MimeEntityEnd 5587985 @@ -4405,7 +3555,6 @@ MultipartEndBoundaryBegin 5587987 MultipartEndBoundaryEnd 5588019 MultipartEpilogueBegin 5588019 MultipartEpilogueEnd 5588021 -MimeContentEnd 5588021 Octets 66055 Lines 1846 MimeEntityEnd 5588021 @@ -4413,7 +3562,6 @@ MultipartEndBoundaryBegin 5588023 MultipartEndBoundaryEnd 5588042 MultipartEpilogueBegin 5588042 MultipartEpilogueEnd 5588100 -MimeContentEnd 5588100 Octets 70738 Lines 1958 MimeEntityEnd 5588100 @@ -4424,8 +3572,6 @@ MimeMessageBegin 5588111 MimeMessageHeadersEnd 5588934 MimeEntityBegin 5588111 MimeEntityHeadersEnd 5588934 -MimeContentBegin 5588934 -MimeContentEnd 5590853 Octets 1919 Lines 49 MimeEntityEnd 5590853 @@ -4436,15 +3582,12 @@ MimeMessageBegin 5590864 MimeMessageHeadersEnd 5591607 MimeEntityBegin 5590864 MimeEntityHeadersEnd 5591607 -MimeContentBegin 5591607 MultipartPreambleBegin 5591607 MultipartPreambleEnd 5591607 MultipartBoundaryBegin 5591607 MultipartBoundaryEnd 5591635 MimeEntityBegin 5591635 MimeEntityHeadersEnd 5591637 -MimeContentBegin 5591637 -MimeContentEnd 5591750 Octets 113 Lines 2 MimeEntityEnd 5591750 @@ -4452,8 +3595,6 @@ MultipartBoundaryBegin 5591752 MultipartBoundaryEnd 5591780 MimeEntityBegin 5591780 MimeEntityHeadersEnd 5591872 -MimeContentBegin 5591872 -MimeContentEnd 5724575 Octets 132703 Lines 2012 MimeEntityEnd 5724575 @@ -4461,8 +3602,6 @@ MultipartBoundaryBegin 5724577 MultipartBoundaryEnd 5724605 MimeEntityBegin 5724605 MimeEntityHeadersEnd 5724607 -MimeContentBegin 5724607 -MimeContentEnd 5724663 Octets 56 Lines 2 MimeEntityEnd 5724663 @@ -4470,8 +3609,6 @@ MultipartBoundaryBegin 5724665 MultipartBoundaryEnd 5724693 MimeEntityBegin 5724693 MimeEntityHeadersEnd 5724843 -MimeContentBegin 5724843 -MimeContentEnd 5739817 Octets 14974 Lines 78 MimeEntityEnd 5739817 @@ -4479,8 +3616,6 @@ MultipartBoundaryBegin 5739819 MultipartBoundaryEnd 5739847 MimeEntityBegin 5739847 MimeEntityHeadersEnd 5739849 -MimeContentBegin 5739849 -MimeContentEnd 5739944 Octets 95 Lines 6 MimeEntityEnd 5739944 @@ -4488,8 +3623,6 @@ MultipartBoundaryBegin 5739946 MultipartBoundaryEnd 5739974 MimeEntityBegin 5739974 MimeEntityHeadersEnd 5740124 -MimeContentBegin 5740124 -MimeContentEnd 5748266 Octets 8142 Lines 42 MimeEntityEnd 5748266 @@ -4497,8 +3630,6 @@ MultipartBoundaryBegin 5748268 MultipartBoundaryEnd 5748296 MimeEntityBegin 5748296 MimeEntityHeadersEnd 5748298 -MimeContentBegin 5748298 -MimeContentEnd 5748375 Octets 77 Lines 4 MimeEntityEnd 5748375 @@ -4506,7 +3637,6 @@ MultipartEndBoundaryBegin 5748377 MultipartEndBoundaryEnd 5748405 MultipartEpilogueBegin 5748405 MultipartEpilogueEnd 5748407 -MimeContentEnd 5748407 Octets 156800 Lines 2172 MimeEntityEnd 5748407 @@ -4517,8 +3647,6 @@ MimeMessageBegin 5748418 MimeMessageHeadersEnd 5748956 MimeEntityBegin 5748418 MimeEntityHeadersEnd 5748956 -MimeContentBegin 5748956 -MimeContentEnd 5749545 Octets 589 Lines 22 MimeEntityEnd 5749545 @@ -4529,15 +3657,12 @@ MimeMessageBegin 5749556 MimeMessageHeadersEnd 5750765 MimeEntityBegin 5749556 MimeEntityHeadersEnd 5750765 -MimeContentBegin 5750765 MultipartPreambleBegin 5750765 MultipartPreambleEnd 5750923 MultipartBoundaryBegin 5750923 MultipartBoundaryEnd 5750964 MimeEntityBegin 5750964 MimeEntityHeadersEnd 5751010 -MimeContentBegin 5751010 -MimeContentEnd 5751766 Octets 756 Lines 27 MimeEntityEnd 5751766 @@ -4545,15 +3670,12 @@ MultipartBoundaryBegin 5751768 MultipartBoundaryEnd 5751809 MimeEntityBegin 5751809 MimeEntityHeadersEnd 5751897 -MimeContentBegin 5751897 MultipartPreambleBegin 5751897 MultipartPreambleEnd 5751897 MultipartBoundaryBegin 5751897 MultipartBoundaryEnd 5751940 MimeEntityBegin 5751940 MimeEntityHeadersEnd 5752034 -MimeContentBegin 5752034 -MimeContentEnd 5752861 Octets 827 Lines 26 MimeEntityEnd 5752861 @@ -4561,8 +3683,6 @@ MultipartBoundaryBegin 5752863 MultipartBoundaryEnd 5752906 MimeEntityBegin 5752906 MimeEntityHeadersEnd 5753003 -MimeContentBegin 5753003 -MimeContentEnd 5811629 Octets 58626 Lines 756 MimeEntityEnd 5811629 @@ -4570,8 +3690,6 @@ MultipartBoundaryBegin 5811631 MultipartBoundaryEnd 5811674 MimeEntityBegin 5811674 MimeEntityHeadersEnd 5811768 -MimeContentBegin 5811768 -MimeContentEnd 5811774 Octets 6 Lines 2 MimeEntityEnd 5811774 @@ -4579,7 +3697,6 @@ MultipartEndBoundaryBegin 5811776 MultipartEndBoundaryEnd 5811819 MultipartEpilogueBegin 5811819 MultipartEpilogueEnd 5811821 -MimeContentEnd 5811821 Octets 59924 Lines 799 MimeEntityEnd 5811821 @@ -4587,7 +3704,6 @@ MultipartEndBoundaryBegin 5811823 MultipartEndBoundaryEnd 5811864 MultipartEpilogueBegin 5811864 MultipartEpilogueEnd 5811866 -MimeContentEnd 5811866 Octets 61101 Lines 838 MimeEntityEnd 5811866 @@ -4598,15 +3714,12 @@ MimeMessageBegin 5811877 MimeMessageHeadersEnd 5812634 MimeEntityBegin 5811877 MimeEntityHeadersEnd 5812634 -MimeContentBegin 5812634 MultipartPreambleBegin 5812634 MultipartPreambleEnd 5812636 MultipartBoundaryBegin 5812636 MultipartBoundaryEnd 5812686 MimeEntityBegin 5812686 MimeEntityHeadersEnd 5812779 -MimeContentBegin 5812779 -MimeContentEnd 5812960 Octets 181 Lines 8 MimeEntityEnd 5812960 @@ -4614,8 +3727,6 @@ MultipartBoundaryBegin 5812962 MultipartBoundaryEnd 5813012 MimeEntityBegin 5813012 MimeEntityHeadersEnd 5813074 -MimeContentBegin 5813074 -MimeContentEnd 5869078 Octets 56004 Lines 757 MimeEntityEnd 5869078 @@ -4623,7 +3734,6 @@ MultipartEndBoundaryBegin 5869080 MultipartEndBoundaryEnd 5869130 MultipartEpilogueBegin 5869130 MultipartEpilogueEnd 5869132 -MimeContentEnd 5869132 Octets 56498 Lines 776 MimeEntityEnd 5869132 @@ -4634,8 +3744,6 @@ MimeMessageBegin 5869167 MimeMessageHeadersEnd 5870664 MimeEntityBegin 5869167 MimeEntityHeadersEnd 5870664 -MimeContentBegin 5870664 -MimeContentEnd 5872038 Octets 1374 Lines 35 MimeEntityEnd 5872038 @@ -4646,15 +3754,12 @@ MimeMessageBegin 5872049 MimeMessageHeadersEnd 5872857 MimeEntityBegin 5872049 MimeEntityHeadersEnd 5872857 -MimeContentBegin 5872857 MultipartPreambleBegin 5872857 MultipartPreambleEnd 5872905 MultipartBoundaryBegin 5872905 MultipartBoundaryEnd 5872931 MimeEntityBegin 5872931 MimeEntityHeadersEnd 5873010 -MimeContentBegin 5873010 -MimeContentEnd 5873393 Octets 383 Lines 14 MimeEntityEnd 5873393 @@ -4662,18 +3767,14 @@ MultipartBoundaryBegin 5873395 MultipartBoundaryEnd 5873421 MimeEntityBegin 5873421 MimeEntityHeadersEnd 5873515 -MimeContentBegin 5873515 MimeMessageBegin 5873515 MimeMessageHeadersEnd 5874597 MimeEntityBegin 5873515 MimeEntityHeadersEnd 5874597 -MimeContentBegin 5874597 -MimeContentEnd 5899455 Octets 24858 Lines 464 MimeEntityEnd 5899455 MimeMessageEnd 5899455 -MimeContentEnd 5899455 Octets 25940 Lines 478 MimeEntityEnd 5899455 @@ -4681,7 +3782,6 @@ MultipartEndBoundaryBegin 5899457 MultipartEndBoundaryEnd 5899483 MultipartEpilogueBegin 5899483 MultipartEpilogueEnd 5899485 -MimeContentEnd 5899485 Octets 26628 Lines 505 MimeEntityEnd 5899485 @@ -4692,15 +3792,12 @@ MimeMessageBegin 5899496 MimeMessageHeadersEnd 5900178 MimeEntityBegin 5899496 MimeEntityHeadersEnd 5900178 -MimeContentBegin 5900178 MultipartPreambleBegin 5900178 MultipartPreambleEnd 5900226 MultipartBoundaryBegin 5900226 MultipartBoundaryEnd 5900275 MimeEntityBegin 5900275 MimeEntityHeadersEnd 5900356 -MimeContentBegin 5900356 -MimeContentEnd 5900391 Octets 35 Lines 2 MimeEntityEnd 5900391 @@ -4708,8 +3805,6 @@ MultipartBoundaryBegin 5900393 MultipartBoundaryEnd 5900442 MimeEntityBegin 5900442 MimeEntityHeadersEnd 5900504 -MimeContentBegin 5900504 -MimeContentEnd 5922958 Octets 22454 Lines 304 MimeEntityEnd 5922958 @@ -4717,7 +3812,6 @@ MultipartEndBoundaryBegin 5922960 MultipartEndBoundaryEnd 5923009 MultipartEpilogueBegin 5923009 MultipartEpilogueEnd 5923009 -MimeContentEnd 5923009 Octets 22831 Lines 317 MimeEntityEnd 5923009 @@ -4728,15 +3822,12 @@ MimeMessageBegin 5923044 MimeMessageHeadersEnd 5923581 MimeEntityBegin 5923044 MimeEntityHeadersEnd 5923581 -MimeContentBegin 5923581 MultipartPreambleBegin 5923581 MultipartPreambleEnd 5923581 MultipartBoundaryBegin 5923581 MultipartBoundaryEnd 5923590 MimeEntityBegin 5923590 MimeEntityHeadersEnd 5923636 -MimeContentBegin 5923636 -MimeContentEnd 5924829 Octets 1193 Lines 22 MimeEntityEnd 5924829 @@ -4744,8 +3835,6 @@ MultipartBoundaryBegin 5924831 MultipartBoundaryEnd 5924840 MimeEntityBegin 5924840 MimeEntityHeadersEnd 5924970 -MimeContentBegin 5924970 -MimeContentEnd 5925118 Octets 148 Lines 3 MimeEntityEnd 5925118 @@ -4753,8 +3842,6 @@ MultipartBoundaryBegin 5925120 MultipartBoundaryEnd 5925129 MimeEntityBegin 5925129 MimeEntityHeadersEnd 5925249 -MimeContentBegin 5925249 -MimeContentEnd 5925445 Octets 196 Lines 3 MimeEntityEnd 5925445 @@ -4762,7 +3849,6 @@ MultipartEndBoundaryBegin 5925447 MultipartEndBoundaryEnd 5925456 MultipartEpilogueBegin 5925456 MultipartEpilogueEnd 5925456 -MimeContentEnd 5925456 Octets 1875 Lines 42 MimeEntityEnd 5925456 @@ -4773,8 +3859,6 @@ MimeMessageBegin 5925467 MimeMessageHeadersEnd 5926279 MimeEntityBegin 5925467 MimeEntityHeadersEnd 5926279 -MimeContentBegin 5926279 -MimeContentEnd 6186575 Octets 260296 Lines 3519 MimeEntityEnd 6186575 @@ -4785,15 +3869,12 @@ MimeMessageBegin 6186586 MimeMessageHeadersEnd 6187457 MimeEntityBegin 6186586 MimeEntityHeadersEnd 6187457 -MimeContentBegin 6187457 MultipartPreambleBegin 6187457 MultipartPreambleEnd 6187459 MultipartBoundaryBegin 6187459 MultipartBoundaryEnd 6187474 MimeEntityBegin 6187474 MimeEntityHeadersEnd 6187554 -MimeContentBegin 6187554 -MimeContentEnd 6187752 Octets 198 Lines 9 MimeEntityEnd 6187752 @@ -4801,8 +3882,6 @@ MultipartBoundaryBegin 6187754 MultipartBoundaryEnd 6187769 MimeEntityBegin 6187769 MimeEntityHeadersEnd 6187877 -MimeContentBegin 6187877 -MimeContentEnd 6287399 Octets 99522 Lines 1276 MimeEntityEnd 6287399 @@ -4810,7 +3889,6 @@ MultipartEndBoundaryBegin 6287401 MultipartEndBoundaryEnd 6287416 MultipartEpilogueBegin 6287416 MultipartEpilogueEnd 6287418 -MimeContentEnd 6287418 Octets 99961 Lines 1297 MimeEntityEnd 6287418 @@ -4821,15 +3899,12 @@ MimeMessageBegin 6287429 MimeMessageHeadersEnd 6288325 MimeEntityBegin 6287429 MimeEntityHeadersEnd 6288325 -MimeContentBegin 6288325 MultipartPreambleBegin 6288325 MultipartPreambleEnd 6288325 MultipartBoundaryBegin 6288325 MultipartBoundaryEnd 6288335 MimeEntityBegin 6288335 MimeEntityHeadersEnd 6288383 -MimeContentBegin 6288383 -MimeContentEnd 6289347 Octets 964 Lines 22 MimeEntityEnd 6289347 @@ -4837,29 +3912,24 @@ MultipartBoundaryBegin 6289349 MultipartBoundaryEnd 6289359 MimeEntityBegin 6289359 MimeEntityHeadersEnd 6289424 -MimeContentBegin 6289424 MultipartPreambleBegin 6289424 MultipartPreambleEnd 6289426 MultipartBoundaryBegin 6289426 MultipartBoundaryEnd 6289449 MimeEntityBegin 6289449 MimeEntityHeadersEnd 6289818 -MimeContentBegin 6289818 MultipartPreambleBegin 6289818 MultipartPreambleEnd 6289818 MultipartBoundaryBegin 6289818 MultipartBoundaryEnd 6289841 MimeEntityBegin 6289841 MimeEntityHeadersEnd 6289946 -MimeContentBegin 6289946 MultipartPreambleBegin 6289946 MultipartPreambleEnd 6289946 MultipartBoundaryBegin 6289946 MultipartBoundaryEnd 6289969 MimeEntityBegin 6289969 MimeEntityHeadersEnd 6290096 -MimeContentBegin 6290096 -MimeContentEnd 6290470 Octets 374 Lines 9 MimeEntityEnd 6290470 @@ -4867,8 +3937,6 @@ MultipartBoundaryBegin 6290472 MultipartBoundaryEnd 6290495 MimeEntityBegin 6290495 MimeEntityHeadersEnd 6290621 -MimeContentBegin 6290621 -MimeContentEnd 6291023 Octets 402 Lines 11 MimeEntityEnd 6291023 @@ -4876,8 +3944,6 @@ MultipartBoundaryBegin 6291025 MultipartBoundaryEnd 6291048 MimeEntityBegin 6291048 MimeEntityHeadersEnd 6291177 -MimeContentBegin 6291177 -MimeContentEnd 6291903 Octets 726 Lines 19 MimeEntityEnd 6291903 @@ -4885,7 +3951,6 @@ MultipartEndBoundaryBegin 6291905 MultipartEndBoundaryEnd 6291928 MultipartEpilogueBegin 6291928 MultipartEpilogueEnd 6291930 -MimeContentEnd 6291930 Octets 1984 Lines 56 MimeEntityEnd 6291930 @@ -4893,15 +3958,12 @@ MultipartBoundaryBegin 6291932 MultipartBoundaryEnd 6291955 MimeEntityBegin 6291955 MimeEntityHeadersEnd 6292057 -MimeContentBegin 6292057 MultipartPreambleBegin 6292057 MultipartPreambleEnd 6292057 MultipartBoundaryBegin 6292057 MultipartBoundaryEnd 6292080 MimeEntityBegin 6292080 MimeEntityHeadersEnd 6292216 -MimeContentBegin 6292216 -MimeContentEnd 6309101 Octets 16885 Lines 471 MimeEntityEnd 6309101 @@ -4909,8 +3971,6 @@ MultipartBoundaryBegin 6309103 MultipartBoundaryEnd 6309126 MimeEntityBegin 6309126 MimeEntityHeadersEnd 6309261 -MimeContentBegin 6309261 -MimeContentEnd 6323910 Octets 14649 Lines 396 MimeEntityEnd 6323910 @@ -4918,15 +3978,12 @@ MultipartBoundaryBegin 6323912 MultipartBoundaryEnd 6323935 MimeEntityBegin 6323935 MimeEntityHeadersEnd 6324039 -MimeContentBegin 6324039 MultipartPreambleBegin 6324039 MultipartPreambleEnd 6324039 MultipartBoundaryBegin 6324039 MultipartBoundaryEnd 6324062 MimeEntityBegin 6324062 MimeEntityHeadersEnd 6324208 -MimeContentBegin 6324208 -MimeContentEnd 6330524 Octets 6316 Lines 165 MimeEntityEnd 6330524 @@ -4934,8 +3991,6 @@ MultipartBoundaryBegin 6330526 MultipartBoundaryEnd 6330549 MimeEntityBegin 6330549 MimeEntityHeadersEnd 6330680 -MimeContentBegin 6330680 -MimeContentEnd 6336095 Octets 5415 Lines 161 MimeEntityEnd 6336095 @@ -4943,8 +3998,6 @@ MultipartBoundaryBegin 6336097 MultipartBoundaryEnd 6336120 MimeEntityBegin 6336120 MimeEntityHeadersEnd 6336261 -MimeContentBegin 6336261 -MimeContentEnd 6343756 Octets 7495 Lines 198 MimeEntityEnd 6343756 @@ -4952,8 +4005,6 @@ MultipartBoundaryBegin 6343758 MultipartBoundaryEnd 6343781 MimeEntityBegin 6343781 MimeEntityHeadersEnd 6343909 -MimeContentBegin 6343909 -MimeContentEnd 6350569 Octets 6660 Lines 185 MimeEntityEnd 6350569 @@ -4961,8 +4012,6 @@ MultipartBoundaryBegin 6350571 MultipartBoundaryEnd 6350594 MimeEntityBegin 6350594 MimeEntityHeadersEnd 6350735 -MimeContentBegin 6350735 -MimeContentEnd 6368395 Octets 17660 Lines 493 MimeEntityEnd 6368395 @@ -4970,7 +4019,6 @@ MultipartEndBoundaryBegin 6368397 MultipartEndBoundaryEnd 6368420 MultipartEpilogueBegin 6368420 MultipartEpilogueEnd 6368422 -MimeContentEnd 6368422 Octets 44383 Lines 1229 MimeEntityEnd 6368422 @@ -4978,15 +4026,12 @@ MultipartBoundaryBegin 6368424 MultipartBoundaryEnd 6368447 MimeEntityBegin 6368447 MimeEntityHeadersEnd 6368545 -MimeContentBegin 6368545 MultipartPreambleBegin 6368545 MultipartPreambleEnd 6368545 MultipartBoundaryBegin 6368545 MultipartBoundaryEnd 6368568 MimeEntityBegin 6368568 MimeEntityHeadersEnd 6368706 -MimeContentBegin 6368706 -MimeContentEnd 6369222 Octets 516 Lines 22 MimeEntityEnd 6369222 @@ -4994,7 +4039,6 @@ MultipartEndBoundaryBegin 6369224 MultipartEndBoundaryEnd 6369247 MultipartEpilogueBegin 6369247 MultipartEpilogueEnd 6369249 -MimeContentEnd 6369249 Octets 704 Lines 29 MimeEntityEnd 6369249 @@ -5002,7 +4046,6 @@ MultipartEndBoundaryBegin 6369251 MultipartEndBoundaryEnd 6369274 MultipartEpilogueBegin 6369274 MultipartEpilogueEnd 6369276 -MimeContentEnd 6369276 Octets 77219 Lines 2145 MimeEntityEnd 6369276 @@ -5010,15 +4053,12 @@ MultipartBoundaryBegin 6369278 MultipartBoundaryEnd 6369301 MimeEntityBegin 6369301 MimeEntityHeadersEnd 6369415 -MimeContentBegin 6369415 MultipartPreambleBegin 6369415 MultipartPreambleEnd 6369415 MultipartBoundaryBegin 6369415 MultipartBoundaryEnd 6369438 MimeEntityBegin 6369438 MimeEntityHeadersEnd 6369580 -MimeContentBegin 6369580 -MimeContentEnd 6370758 Octets 1178 Lines 30 MimeEntityEnd 6370758 @@ -5026,8 +4066,6 @@ MultipartBoundaryBegin 6370760 MultipartBoundaryEnd 6370783 MimeEntityBegin 6370783 MimeEntityHeadersEnd 6370913 -MimeContentBegin 6370913 -MimeContentEnd 6372168 Octets 1255 Lines 36 MimeEntityEnd 6372168 @@ -5035,8 +4073,6 @@ MultipartBoundaryBegin 6372170 MultipartBoundaryEnd 6372193 MimeEntityBegin 6372193 MimeEntityHeadersEnd 6372337 -MimeContentBegin 6372337 -MimeContentEnd 6373036 Octets 699 Lines 23 MimeEntityEnd 6373036 @@ -5044,7 +4080,6 @@ MultipartEndBoundaryBegin 6373038 MultipartEndBoundaryEnd 6373061 MultipartEpilogueBegin 6373061 MultipartEpilogueEnd 6373063 -MimeContentEnd 6373063 Octets 3648 Lines 106 MimeEntityEnd 6373063 @@ -5052,7 +4087,6 @@ MultipartEndBoundaryBegin 6373065 MultipartEndBoundaryEnd 6373088 MultipartEpilogueBegin 6373088 MultipartEpilogueEnd 6373090 -MimeContentEnd 6373090 Octets 83272 Lines 2321 MimeEntityEnd 6373090 @@ -5060,7 +4094,6 @@ MultipartEndBoundaryBegin 6373092 MultipartEndBoundaryEnd 6373115 MultipartEpilogueBegin 6373115 MultipartEpilogueEnd 6373117 -MimeContentEnd 6373117 Octets 83693 Lines 2333 MimeEntityEnd 6373117 @@ -5068,7 +4101,6 @@ MultipartEndBoundaryBegin 6373119 MultipartEndBoundaryEnd 6373129 MultipartEpilogueBegin 6373129 MultipartEpilogueEnd 6373131 -MimeContentEnd 6373131 Octets 84806 Lines 2363 MimeEntityEnd 6373131 @@ -5079,8 +4111,6 @@ MimeMessageBegin 6373142 MimeMessageHeadersEnd 6373961 MimeEntityBegin 6373142 MimeEntityHeadersEnd 6373961 -MimeContentBegin 6373961 -MimeContentEnd 6383386 Octets 9425 Lines 227 MimeEntityEnd 6383386 @@ -5091,15 +4121,12 @@ MimeMessageBegin 6383397 MimeMessageHeadersEnd 6384141 MimeEntityBegin 6383397 MimeEntityHeadersEnd 6384141 -MimeContentBegin 6384141 MultipartPreambleBegin 6384141 MultipartPreambleEnd 6384299 MultipartBoundaryBegin 6384299 MultipartBoundaryEnd 6384340 MimeEntityBegin 6384340 MimeEntityHeadersEnd 6384386 -MimeContentBegin 6384386 -MimeContentEnd 6385165 Octets 779 Lines 24 MimeEntityEnd 6385165 @@ -5107,15 +4134,12 @@ MultipartBoundaryBegin 6385167 MultipartBoundaryEnd 6385208 MimeEntityBegin 6385208 MimeEntityHeadersEnd 6385296 -MimeContentBegin 6385296 MultipartPreambleBegin 6385296 MultipartPreambleEnd 6385296 MultipartBoundaryBegin 6385296 MultipartBoundaryEnd 6385339 MimeEntityBegin 6385339 MimeEntityHeadersEnd 6385433 -MimeContentBegin 6385433 -MimeContentEnd 6385767 Octets 334 Lines 8 MimeEntityEnd 6385767 @@ -5123,8 +4147,6 @@ MultipartBoundaryBegin 6385769 MultipartBoundaryEnd 6385812 MimeEntityBegin 6385812 MimeEntityHeadersEnd 6385910 -MimeContentBegin 6385910 -MimeContentEnd 6408254 Octets 22344 Lines 321 MimeEntityEnd 6408254 @@ -5132,8 +4154,6 @@ MultipartBoundaryBegin 6408256 MultipartBoundaryEnd 6408299 MimeEntityBegin 6408299 MimeEntityHeadersEnd 6408393 -MimeContentBegin 6408393 -MimeContentEnd 6408564 Octets 171 Lines 6 MimeEntityEnd 6408564 @@ -5141,8 +4161,6 @@ MultipartBoundaryBegin 6408566 MultipartBoundaryEnd 6408609 MimeEntityBegin 6408609 MimeEntityHeadersEnd 6408710 -MimeContentBegin 6408710 -MimeContentEnd 6456608 Octets 47898 Lines 686 MimeEntityEnd 6456608 @@ -5150,8 +4168,6 @@ MultipartBoundaryBegin 6456610 MultipartBoundaryEnd 6456653 MimeEntityBegin 6456653 MimeEntityHeadersEnd 6456747 -MimeContentBegin 6456747 -MimeContentEnd 6456819 Octets 72 Lines 3 MimeEntityEnd 6456819 @@ -5159,8 +4175,6 @@ MultipartBoundaryBegin 6456821 MultipartBoundaryEnd 6456864 MimeEntityBegin 6456864 MimeEntityHeadersEnd 6456958 -MimeContentBegin 6456958 -MimeContentEnd 6477470 Octets 20512 Lines 295 MimeEntityEnd 6477470 @@ -5168,8 +4182,6 @@ MultipartBoundaryBegin 6477472 MultipartBoundaryEnd 6477515 MimeEntityBegin 6477515 MimeEntityHeadersEnd 6477609 -MimeContentBegin 6477609 -MimeContentEnd 6477721 Octets 112 Lines 9 MimeEntityEnd 6477721 @@ -5177,7 +4189,6 @@ MultipartEndBoundaryBegin 6477723 MultipartEndBoundaryEnd 6477766 MultipartEpilogueBegin 6477766 MultipartEpilogueEnd 6477768 -MimeContentEnd 6477768 Octets 92472 Lines 1361 MimeEntityEnd 6477768 @@ -5185,7 +4196,6 @@ MultipartEndBoundaryBegin 6477770 MultipartEndBoundaryEnd 6477811 MultipartEpilogueBegin 6477811 MultipartEpilogueEnd 6477811 -MimeContentEnd 6477811 Octets 93670 Lines 1396 MimeEntityEnd 6477811 @@ -5196,15 +4206,12 @@ MimeMessageBegin 6477822 MimeMessageHeadersEnd 6478593 MimeEntityBegin 6477822 MimeEntityHeadersEnd 6478593 -MimeContentBegin 6478593 MultipartPreambleBegin 6478593 MultipartPreambleEnd 6478792 MultipartBoundaryBegin 6478792 MultipartBoundaryEnd 6478838 MimeEntityBegin 6478838 MimeEntityHeadersEnd 6478914 -MimeContentBegin 6478914 -MimeContentEnd 6479347 Octets 433 Lines 14 MimeEntityEnd 6479347 @@ -5212,8 +4219,6 @@ MultipartBoundaryBegin 6479349 MultipartBoundaryEnd 6479395 MimeEntityBegin 6479395 MimeEntityHeadersEnd 6479459 -MimeContentBegin 6479459 -MimeContentEnd 6513483 Octets 34024 Lines 461 MimeEntityEnd 6513483 @@ -5221,8 +4226,6 @@ MultipartBoundaryBegin 6513485 MultipartBoundaryEnd 6513531 MimeEntityBegin 6513531 MimeEntityHeadersEnd 6513607 -MimeContentBegin 6513607 -MimeContentEnd 6513708 Octets 101 Lines 8 MimeEntityEnd 6513708 @@ -5230,7 +4233,6 @@ MultipartEndBoundaryBegin 6513710 MultipartEndBoundaryEnd 6513756 MultipartEpilogueBegin 6513756 MultipartEpilogueEnd 6513758 -MimeContentEnd 6513758 Octets 35165 Lines 501 MimeEntityEnd 6513758 @@ -5241,8 +4243,6 @@ MimeMessageBegin 6513803 MimeMessageHeadersEnd 6513957 MimeEntityBegin 6513803 MimeEntityHeadersEnd 6513957 -MimeContentBegin 6513957 -MimeContentEnd 6557679 Octets 43722 Lines 694 MimeEntityEnd 6557679 @@ -5253,22 +4253,18 @@ MimeMessageBegin 6557714 MimeMessageHeadersEnd 6558312 MimeEntityBegin 6557714 MimeEntityHeadersEnd 6558312 -MimeContentBegin 6558312 MultipartPreambleBegin 6558312 MultipartPreambleEnd 6558360 MultipartBoundaryBegin 6558360 MultipartBoundaryEnd 6558400 MimeEntityBegin 6558400 MimeEntityHeadersEnd 6558521 -MimeContentBegin 6558521 MultipartPreambleBegin 6558521 MultipartPreambleEnd 6558523 MultipartBoundaryBegin 6558523 MultipartBoundaryEnd 6558563 MimeEntityBegin 6558563 MimeEntityHeadersEnd 6558644 -MimeContentBegin 6558644 -MimeContentEnd 6559954 Octets 1310 Lines 39 MimeEntityEnd 6559954 @@ -5276,8 +4272,6 @@ MultipartBoundaryBegin 6559956 MultipartBoundaryEnd 6559996 MimeEntityBegin 6559996 MimeEntityHeadersEnd 6560078 -MimeContentBegin 6560078 -MimeContentEnd 6562574 Octets 2496 Lines 33 MimeEntityEnd 6562574 @@ -5285,7 +4279,6 @@ MultipartEndBoundaryBegin 6562576 MultipartEndBoundaryEnd 6562616 MultipartEpilogueBegin 6562616 MultipartEpilogueEnd 6562620 -MimeContentEnd 6562620 Octets 4099 Lines 84 MimeEntityEnd 6562620 @@ -5293,8 +4286,6 @@ MultipartBoundaryBegin 6562622 MultipartBoundaryEnd 6562662 MimeEntityBegin 6562662 MimeEntityHeadersEnd 6562872 -MimeContentBegin 6562872 -MimeContentEnd 6583892 Octets 21020 Lines 271 MimeEntityEnd 6583892 @@ -5302,7 +4293,6 @@ MultipartEndBoundaryBegin 6583894 MultipartEndBoundaryEnd 6583934 MultipartEpilogueBegin 6583934 MultipartEpilogueEnd 6583936 -MimeContentEnd 6583936 Octets 25624 Lines 369 MimeEntityEnd 6583936 @@ -5313,15 +4303,12 @@ MimeMessageBegin 6583971 MimeMessageHeadersEnd 6584388 MimeEntityBegin 6583971 MimeEntityHeadersEnd 6584388 -MimeContentBegin 6584388 MultipartPreambleBegin 6584388 MultipartPreambleEnd 6584436 MultipartBoundaryBegin 6584436 MultipartBoundaryEnd 6584457 MimeEntityBegin 6584457 MimeEntityHeadersEnd 6584459 -MimeContentBegin 6584459 -MimeContentEnd 6584523 Octets 64 Lines 2 MimeEntityEnd 6584523 @@ -5329,15 +4316,12 @@ MultipartBoundaryBegin 6584525 MultipartBoundaryEnd 6584546 MimeEntityBegin 6584546 MimeEntityHeadersEnd 6584622 -MimeContentBegin 6584622 MultipartPreambleBegin 6584622 MultipartPreambleEnd 6584622 MultipartBoundaryBegin 6584622 MultipartBoundaryEnd 6584650 MimeEntityBegin 6584650 MimeEntityHeadersEnd 6584760 -MimeContentBegin 6584760 -MimeContentEnd 6584843 Octets 83 Lines 4 MimeEntityEnd 6584843 @@ -5345,8 +4329,6 @@ MultipartBoundaryBegin 6584845 MultipartBoundaryEnd 6584873 MimeEntityBegin 6584873 MimeEntityHeadersEnd 6584986 -MimeContentBegin 6584986 -MimeContentEnd 6585148 Octets 162 Lines 5 MimeEntityEnd 6585148 @@ -5354,8 +4336,6 @@ MultipartBoundaryBegin 6585150 MultipartBoundaryEnd 6585178 MimeEntityBegin 6585178 MimeEntityHeadersEnd 6585291 -MimeContentBegin 6585291 -MimeContentEnd 6585464 Octets 173 Lines 11 MimeEntityEnd 6585464 @@ -5363,8 +4343,6 @@ MultipartBoundaryBegin 6585466 MultipartBoundaryEnd 6585494 MimeEntityBegin 6585494 MimeEntityHeadersEnd 6585603 -MimeContentBegin 6585603 -MimeContentEnd 6585767 Octets 164 Lines 4 MimeEntityEnd 6585767 @@ -5372,8 +4350,6 @@ MultipartBoundaryBegin 6585769 MultipartBoundaryEnd 6585797 MimeEntityBegin 6585797 MimeEntityHeadersEnd 6585925 -MimeContentBegin 6585925 -MimeContentEnd 6586358 Octets 433 Lines 7 MimeEntityEnd 6586358 @@ -5381,7 +4357,6 @@ MultipartEndBoundaryBegin 6586360 MultipartEndBoundaryEnd 6586388 MultipartEpilogueBegin 6586388 MultipartEpilogueEnd 6586388 -MimeContentEnd 6586388 Octets 1766 Lines 57 MimeEntityEnd 6586388 @@ -5389,8 +4364,6 @@ MultipartBoundaryBegin 6586390 MultipartBoundaryEnd 6586411 MimeEntityBegin 6586411 MimeEntityHeadersEnd 6586413 -MimeContentBegin 6586413 -MimeContentEnd 6586582 Octets 169 Lines 5 MimeEntityEnd 6586582 @@ -5398,15 +4371,12 @@ MultipartBoundaryBegin 6586584 MultipartBoundaryEnd 6586605 MimeEntityBegin 6586605 MimeEntityHeadersEnd 6586657 -MimeContentBegin 6586657 MultipartPreambleBegin 6586657 MultipartPreambleEnd 6586657 MultipartBoundaryBegin 6586657 MultipartBoundaryEnd 6586663 MimeEntityBegin 6586663 MimeEntityHeadersEnd 6586691 -MimeContentBegin 6586691 -MimeContentEnd 6586745 Octets 54 Lines 2 MimeEntityEnd 6586745 @@ -5414,15 +4384,12 @@ MultipartBoundaryBegin 6586747 MultipartBoundaryEnd 6586753 MimeEntityBegin 6586753 MimeEntityHeadersEnd 6586805 -MimeContentBegin 6586805 MultipartPreambleBegin 6586805 MultipartPreambleEnd 6586805 MultipartBoundaryBegin 6586805 MultipartBoundaryEnd 6586811 MimeEntityBegin 6586811 MimeEntityHeadersEnd 6586839 -MimeContentBegin 6586839 -MimeContentEnd 6586893 Octets 54 Lines 2 MimeEntityEnd 6586893 @@ -5430,8 +4397,6 @@ MultipartBoundaryBegin 6586895 MultipartBoundaryEnd 6586901 MimeEntityBegin 6586901 MimeEntityHeadersEnd 6586928 -MimeContentBegin 6586928 -MimeContentEnd 6586979 Octets 51 Lines 2 MimeEntityEnd 6586979 @@ -5439,8 +4404,6 @@ MultipartBoundaryBegin 6586981 MultipartBoundaryEnd 6586987 MimeEntityBegin 6586987 MimeEntityHeadersEnd 6587016 -MimeContentBegin 6587016 -MimeContentEnd 6587071 Octets 55 Lines 2 MimeEntityEnd 6587071 @@ -5448,7 +4411,6 @@ MultipartEndBoundaryBegin 6587073 MultipartEndBoundaryEnd 6587079 MultipartEpilogueBegin 6587079 MultipartEpilogueEnd 6587081 -MimeContentEnd 6587081 Octets 276 Lines 17 MimeEntityEnd 6587081 @@ -5456,8 +4418,6 @@ MultipartBoundaryBegin 6587083 MultipartBoundaryEnd 6587089 MimeEntityBegin 6587089 MimeEntityHeadersEnd 6587184 -MimeContentBegin 6587184 -MimeContentEnd 6587200 Octets 16 Lines 2 MimeEntityEnd 6587200 @@ -5465,7 +4425,6 @@ MultipartEndBoundaryBegin 6587202 MultipartEndBoundaryEnd 6587208 MultipartEpilogueBegin 6587208 MultipartEpilogueEnd 6587208 -MimeContentEnd 6587208 Octets 551 Lines 32 MimeEntityEnd 6587208 @@ -5473,8 +4432,6 @@ MultipartBoundaryBegin 6587210 MultipartBoundaryEnd 6587231 MimeEntityBegin 6587231 MimeEntityHeadersEnd 6587233 -MimeContentBegin 6587233 -MimeContentEnd 6587243 Octets 10 Lines 2 MimeEntityEnd 6587243 @@ -5482,7 +4439,6 @@ MultipartEndBoundaryBegin 6587245 MultipartEndBoundaryEnd 6587266 MultipartEpilogueBegin 6587266 MultipartEpilogueEnd 6587266 -MimeContentEnd 6587266 Octets 2878 Lines 113 MimeEntityEnd 6587266 @@ -5493,15 +4449,12 @@ MimeMessageBegin 6587301 MimeMessageHeadersEnd 6587716 MimeEntityBegin 6587301 MimeEntityHeadersEnd 6587716 -MimeContentBegin 6587716 MultipartPreambleBegin 6587716 MultipartPreambleEnd 6587764 MultipartBoundaryBegin 6587764 MultipartBoundaryEnd 6587785 MimeEntityBegin 6587785 MimeEntityHeadersEnd 6587787 -MimeContentBegin 6587787 -MimeContentEnd 6587855 Octets 68 Lines 2 MimeEntityEnd 6587855 @@ -5509,15 +4462,12 @@ MultipartBoundaryBegin 6587857 MultipartBoundaryEnd 6587878 MimeEntityBegin 6587878 MimeEntityHeadersEnd 6587954 -MimeContentBegin 6587954 MultipartPreambleBegin 6587954 MultipartPreambleEnd 6587954 MultipartBoundaryBegin 6587954 MultipartBoundaryEnd 6587982 MimeEntityBegin 6587982 MimeEntityHeadersEnd 6588142 -MimeContentBegin 6588142 -MimeContentEnd 6645008 Octets 56866 Lines 1604 MimeEntityEnd 6645008 @@ -5525,8 +4475,6 @@ MultipartBoundaryBegin 6645010 MultipartBoundaryEnd 6645038 MimeEntityBegin 6645038 MimeEntityHeadersEnd 6645197 -MimeContentBegin 6645197 -MimeContentEnd 6754228 Octets 109031 Lines 2983 MimeEntityEnd 6754228 @@ -5534,8 +4482,6 @@ MultipartBoundaryBegin 6754230 MultipartBoundaryEnd 6754258 MimeEntityBegin 6754258 MimeEntityHeadersEnd 6754408 -MimeContentBegin 6754408 -MimeContentEnd 6955876 Octets 201468 Lines 13110 MimeEntityEnd 6955876 @@ -5543,7 +4489,6 @@ MultipartEndBoundaryBegin 6955878 MultipartEndBoundaryEnd 6955906 MultipartEpilogueBegin 6955906 MultipartEpilogueEnd 6955908 -MimeContentEnd 6955908 Octets 367954 Lines 17714 MimeEntityEnd 6955908 @@ -5551,7 +4496,6 @@ MultipartEndBoundaryBegin 6955910 MultipartEndBoundaryEnd 6955931 MultipartEpilogueBegin 6955931 MultipartEpilogueEnd 6955939 -MimeContentEnd 6955939 Octets 368223 Lines 17726 MimeEntityEnd 6955939 @@ -5562,15 +4506,12 @@ MimeMessageBegin 6955950 MimeMessageHeadersEnd 6956567 MimeEntityBegin 6955950 MimeEntityHeadersEnd 6956567 -MimeContentBegin 6956567 MultipartPreambleBegin 6956567 MultipartPreambleEnd 6956787 MultipartBoundaryBegin 6956787 MultipartBoundaryEnd 6956828 MimeEntityBegin 6956828 MimeEntityHeadersEnd 6956943 -MimeContentBegin 6956943 -MimeContentEnd 6956943 Octets 0 Lines 1 MimeEntityEnd 6956943 @@ -5578,18 +4519,14 @@ MultipartBoundaryBegin 6956945 MultipartBoundaryEnd 6956986 MimeEntityBegin 6956986 MimeEntityHeadersEnd 6957087 -MimeContentBegin 6957087 MimeMessageBegin 6957087 MimeMessageHeadersEnd 6957640 MimeEntityBegin 6957087 MimeEntityHeadersEnd 6957640 -MimeContentBegin 6957640 -MimeContentEnd 6958002 Octets 362 Lines 17 MimeEntityEnd 6958002 MimeMessageEnd 6958002 -MimeContentEnd 6958002 Octets 915 Lines 29 MimeEntityEnd 6958002 @@ -5597,7 +4534,6 @@ MultipartEndBoundaryBegin 6958004 MultipartEndBoundaryEnd 6958045 MultipartEpilogueBegin 6958045 MultipartEpilogueEnd 6958045 -MimeContentEnd 6958045 Octets 1478 Lines 43 MimeEntityEnd 6958045 @@ -5608,15 +4544,12 @@ MimeMessageBegin 6958056 MimeMessageHeadersEnd 6958361 MimeEntityBegin 6958056 MimeEntityHeadersEnd 6958361 -MimeContentBegin 6958361 MultipartPreambleBegin 6958361 MultipartPreambleEnd 6958361 MultipartBoundaryBegin 6958361 MultipartBoundaryEnd 6958401 MimeEntityBegin 6958401 MimeEntityHeadersEnd 6958654 -MimeContentBegin 6958654 -MimeContentEnd 6959403 Octets 749 Lines 31 MimeEntityEnd 6959403 @@ -5624,8 +4557,6 @@ MultipartBoundaryBegin 6959405 MultipartBoundaryEnd 6959445 MimeEntityBegin 6959445 MimeEntityHeadersEnd 6959773 -MimeContentBegin 6959773 -MimeContentEnd 6970643 Octets 10870 Lines 148 MimeEntityEnd 6970643 @@ -5633,7 +4564,6 @@ MultipartEndBoundaryBegin 6970645 MultipartEndBoundaryEnd 6970685 MultipartEpilogueBegin 6970685 MultipartEpilogueEnd 6970685 -MimeContentEnd 6970685 Octets 12324 Lines 197 MimeEntityEnd 6970685 @@ -5644,15 +4574,12 @@ MimeMessageBegin 6970696 MimeMessageHeadersEnd 6971001 MimeEntityBegin 6970696 MimeEntityHeadersEnd 6971001 -MimeContentBegin 6971001 MultipartPreambleBegin 6971001 MultipartPreambleEnd 6971001 MultipartBoundaryBegin 6971001 MultipartBoundaryEnd 6971041 MimeEntityBegin 6971041 MimeEntityHeadersEnd 6971294 -MimeContentBegin 6971294 -MimeContentEnd 6972042 Octets 748 Lines 31 MimeEntityEnd 6972042 @@ -5660,8 +4587,6 @@ MultipartBoundaryBegin 6972044 MultipartBoundaryEnd 6972084 MimeEntityBegin 6972084 MimeEntityHeadersEnd 6972381 -MimeContentBegin 6972381 -MimeContentEnd 6983251 Octets 10870 Lines 148 MimeEntityEnd 6983251 @@ -5669,7 +4594,6 @@ MultipartEndBoundaryBegin 6983253 MultipartEndBoundaryEnd 6983293 MultipartEpilogueBegin 6983293 MultipartEpilogueEnd 6983293 -MimeContentEnd 6983293 Octets 12292 Lines 197 MimeEntityEnd 6983293 @@ -5680,15 +4604,12 @@ MimeMessageBegin 6983328 MimeMessageHeadersEnd 6984857 MimeEntityBegin 6983328 MimeEntityHeadersEnd 6984857 -MimeContentBegin 6984857 MultipartPreambleBegin 6984857 MultipartPreambleEnd 6984859 MultipartBoundaryBegin 6984859 MultipartBoundaryEnd 6984904 MimeEntityBegin 6984904 MimeEntityHeadersEnd 6984998 -MimeContentBegin 6984998 -MimeContentEnd 6990308 Octets 5310 Lines 112 MimeEntityEnd 6990308 @@ -5696,8 +4617,6 @@ MultipartBoundaryBegin 6990310 MultipartBoundaryEnd 6990355 MimeEntityBegin 6990355 MimeEntityHeadersEnd 6990560 -MimeContentBegin 6990560 -MimeContentEnd 6991502 Octets 942 Lines 14 MimeEntityEnd 6991502 @@ -5705,7 +4624,6 @@ MultipartEndBoundaryBegin 6991504 MultipartEndBoundaryEnd 6991549 MultipartEpilogueBegin 6991549 MultipartEpilogueEnd 6991551 -MimeContentEnd 6991551 Octets 6694 Lines 140 MimeEntityEnd 6991551 @@ -5716,15 +4634,12 @@ MimeMessageBegin 6991586 MimeMessageHeadersEnd 6992045 MimeEntityBegin 6991586 MimeEntityHeadersEnd 6992045 -MimeContentBegin 6992045 MultipartPreambleBegin 6992045 MultipartPreambleEnd 6992045 MultipartBoundaryBegin 6992045 MultipartBoundaryEnd 6992085 MimeEntityBegin 6992085 MimeEntityHeadersEnd 6992113 -MimeContentBegin 6992113 -MimeContentEnd 6992366 Octets 253 Lines 7 MimeEntityEnd 6992366 @@ -5732,15 +4647,12 @@ MultipartBoundaryBegin 6992368 MultipartBoundaryEnd 6992408 MimeEntityBegin 6992408 MimeEntityHeadersEnd 6992497 -MimeContentBegin 6992497 MultipartPreambleBegin 6992497 MultipartPreambleEnd 6992497 MultipartBoundaryBegin 6992497 MultipartBoundaryEnd 6992537 MimeEntityBegin 6992537 MimeEntityHeadersEnd 6992736 -MimeContentBegin 6992736 -MimeContentEnd 7000063 Octets 7327 Lines 180 MimeEntityEnd 7000063 @@ -5748,8 +4660,6 @@ MultipartBoundaryBegin 7000065 MultipartBoundaryEnd 7000105 MimeEntityBegin 7000105 MimeEntityHeadersEnd 7000286 -MimeContentBegin 7000286 -MimeContentEnd 7008376 Octets 8090 Lines 110 MimeEntityEnd 7008376 @@ -5757,8 +4667,6 @@ MultipartBoundaryBegin 7008378 MultipartBoundaryEnd 7008418 MimeEntityBegin 7008418 MimeEntityHeadersEnd 7008582 -MimeContentBegin 7008582 -MimeContentEnd 7016138 Octets 7556 Lines 103 MimeEntityEnd 7016138 @@ -5766,8 +4674,6 @@ MultipartBoundaryBegin 7016140 MultipartBoundaryEnd 7016180 MimeEntityBegin 7016180 MimeEntityHeadersEnd 7016343 -MimeContentBegin 7016343 -MimeContentEnd 7019721 Octets 3378 Lines 46 MimeEntityEnd 7019721 @@ -5775,8 +4681,6 @@ MultipartBoundaryBegin 7019723 MultipartBoundaryEnd 7019763 MimeEntityBegin 7019763 MimeEntityHeadersEnd 7019927 -MimeContentBegin 7019927 -MimeContentEnd 7028493 Octets 8566 Lines 116 MimeEntityEnd 7028493 @@ -5784,8 +4688,6 @@ MultipartBoundaryBegin 7028495 MultipartBoundaryEnd 7028535 MimeEntityBegin 7028535 MimeEntityHeadersEnd 7028696 -MimeContentBegin 7028696 -MimeContentEnd 7134494 Octets 105798 Lines 1430 MimeEntityEnd 7134494 @@ -5793,8 +4695,6 @@ MultipartBoundaryBegin 7134496 MultipartBoundaryEnd 7134536 MimeEntityBegin 7134536 MimeEntityHeadersEnd 7134700 -MimeContentBegin 7134700 -MimeContentEnd 7173586 Octets 38886 Lines 526 MimeEntityEnd 7173586 @@ -5802,8 +4702,6 @@ MultipartBoundaryBegin 7173588 MultipartBoundaryEnd 7173628 MimeEntityBegin 7173628 MimeEntityHeadersEnd 7173797 -MimeContentBegin 7173797 -MimeContentEnd 7209595 Octets 35798 Lines 484 MimeEntityEnd 7209595 @@ -5811,7 +4709,6 @@ MultipartEndBoundaryBegin 7209597 MultipartEndBoundaryEnd 7209637 MultipartEpilogueBegin 7209637 MultipartEpilogueEnd 7209637 -MimeContentEnd 7209637 Octets 217140 Lines 3044 MimeEntityEnd 7209637 @@ -5819,7 +4716,6 @@ MultipartEndBoundaryBegin 7209639 MultipartEndBoundaryEnd 7209679 MultipartEpilogueBegin 7209679 MultipartEpilogueEnd 7209679 -MimeContentEnd 7209679 Octets 217634 Lines 3059 MimeEntityEnd 7209679 @@ -5830,15 +4726,12 @@ MimeMessageBegin 7209690 MimeMessageHeadersEnd 7209994 MimeEntityBegin 7209690 MimeEntityHeadersEnd 7209994 -MimeContentBegin 7209994 MultipartPreambleBegin 7209994 MultipartPreambleEnd 7209994 MultipartBoundaryBegin 7209994 MultipartBoundaryEnd 7210034 MimeEntityBegin 7210034 MimeEntityHeadersEnd 7210195 -MimeContentBegin 7210195 -MimeContentEnd 7210773 Octets 578 Lines 28 MimeEntityEnd 7210773 @@ -5846,8 +4739,6 @@ MultipartBoundaryBegin 7210775 MultipartBoundaryEnd 7210815 MimeEntityBegin 7210815 MimeEntityHeadersEnd 7210932 -MimeContentBegin 7210932 -MimeContentEnd 7221802 Octets 10870 Lines 148 MimeEntityEnd 7221802 @@ -5855,7 +4746,6 @@ MultipartEndBoundaryBegin 7221804 MultipartEndBoundaryEnd 7221844 MultipartEpilogueBegin 7221844 MultipartEpilogueEnd 7221844 -MimeContentEnd 7221844 Octets 11850 Lines 188 MimeEntityEnd 7221844 @@ -5866,15 +4756,12 @@ MimeMessageBegin 7221855 MimeMessageHeadersEnd 7222159 MimeEntityBegin 7221855 MimeEntityHeadersEnd 7222159 -MimeContentBegin 7222159 MultipartPreambleBegin 7222159 MultipartPreambleEnd 7222159 MultipartBoundaryBegin 7222159 MultipartBoundaryEnd 7222199 MimeEntityBegin 7222199 MimeEntityHeadersEnd 7222417 -MimeContentBegin 7222417 -MimeContentEnd 7223042 Octets 625 Lines 29 MimeEntityEnd 7223042 @@ -5882,8 +4769,6 @@ MultipartBoundaryBegin 7223044 MultipartBoundaryEnd 7223084 MimeEntityBegin 7223084 MimeEntityHeadersEnd 7223365 -MimeContentBegin 7223365 -MimeContentEnd 7234235 Octets 10870 Lines 148 MimeEntityEnd 7234235 @@ -5891,7 +4776,6 @@ MultipartEndBoundaryBegin 7234237 MultipartEndBoundaryEnd 7234277 MultipartEpilogueBegin 7234277 MultipartEpilogueEnd 7234277 -MimeContentEnd 7234277 Octets 12118 Lines 193 MimeEntityEnd 7234277 @@ -5902,15 +4786,12 @@ MimeMessageBegin 7234288 MimeMessageHeadersEnd 7234592 MimeEntityBegin 7234288 MimeEntityHeadersEnd 7234592 -MimeContentBegin 7234592 MultipartPreambleBegin 7234592 MultipartPreambleEnd 7234592 MultipartBoundaryBegin 7234592 MultipartBoundaryEnd 7234632 MimeEntityBegin 7234632 MimeEntityHeadersEnd 7234854 -MimeContentBegin 7234854 -MimeContentEnd 7235483 Octets 629 Lines 29 MimeEntityEnd 7235483 @@ -5918,8 +4799,6 @@ MultipartBoundaryBegin 7235485 MultipartBoundaryEnd 7235525 MimeEntityBegin 7235525 MimeEntityHeadersEnd 7235705 -MimeContentBegin 7235705 -MimeContentEnd 7246575 Octets 10870 Lines 148 MimeEntityEnd 7246575 @@ -5927,7 +4806,6 @@ MultipartEndBoundaryBegin 7246577 MultipartEndBoundaryEnd 7246617 MultipartEpilogueBegin 7246617 MultipartEpilogueEnd 7246617 -MimeContentEnd 7246617 Octets 12025 Lines 191 MimeEntityEnd 7246617 @@ -5938,15 +4816,12 @@ MimeMessageBegin 7246628 MimeMessageHeadersEnd 7246932 MimeEntityBegin 7246628 MimeEntityHeadersEnd 7246932 -MimeContentBegin 7246932 MultipartPreambleBegin 7246932 MultipartPreambleEnd 7246932 MultipartBoundaryBegin 7246932 MultipartBoundaryEnd 7246972 MimeEntityBegin 7246972 MimeEntityHeadersEnd 7247224 -MimeContentBegin 7247224 -MimeContentEnd 7247884 Octets 660 Lines 30 MimeEntityEnd 7247884 @@ -5954,8 +4829,6 @@ MultipartBoundaryBegin 7247886 MultipartBoundaryEnd 7247926 MimeEntityBegin 7247926 MimeEntityHeadersEnd 7248239 -MimeContentBegin 7248239 -MimeContentEnd 7259109 Octets 10870 Lines 148 MimeEntityEnd 7259109 @@ -5963,7 +4836,6 @@ MultipartEndBoundaryBegin 7259111 MultipartEndBoundaryEnd 7259151 MultipartEpilogueBegin 7259151 MultipartEpilogueEnd 7259151 -MimeContentEnd 7259151 Octets 12219 Lines 196 MimeEntityEnd 7259151 @@ -5974,15 +4846,12 @@ MimeMessageBegin 7259162 MimeMessageHeadersEnd 7259466 MimeEntityBegin 7259162 MimeEntityHeadersEnd 7259466 -MimeContentBegin 7259466 MultipartPreambleBegin 7259466 MultipartPreambleEnd 7259466 MultipartBoundaryBegin 7259466 MultipartBoundaryEnd 7259506 MimeEntityBegin 7259506 MimeEntityHeadersEnd 7259728 -MimeContentBegin 7259728 -MimeContentEnd 7260401 Octets 673 Lines 29 MimeEntityEnd 7260401 @@ -5990,8 +4859,6 @@ MultipartBoundaryBegin 7260403 MultipartBoundaryEnd 7260443 MimeEntityBegin 7260443 MimeEntityHeadersEnd 7260623 -MimeContentBegin 7260623 -MimeContentEnd 7271493 Octets 10870 Lines 148 MimeEntityEnd 7271493 @@ -5999,7 +4866,6 @@ MultipartEndBoundaryBegin 7271495 MultipartEndBoundaryEnd 7271535 MultipartEpilogueBegin 7271535 MultipartEpilogueEnd 7271535 -MimeContentEnd 7271535 Octets 12069 Lines 191 MimeEntityEnd 7271535 @@ -6010,15 +4876,12 @@ MimeMessageBegin 7271546 MimeMessageHeadersEnd 7271850 MimeEntityBegin 7271546 MimeEntityHeadersEnd 7271850 -MimeContentBegin 7271850 MultipartPreambleBegin 7271850 MultipartPreambleEnd 7271850 MultipartBoundaryBegin 7271850 MultipartBoundaryEnd 7271890 MimeEntityBegin 7271890 MimeEntityHeadersEnd 7272142 -MimeContentBegin 7272142 -MimeContentEnd 7272841 Octets 699 Lines 30 MimeEntityEnd 7272841 @@ -6026,8 +4889,6 @@ MultipartBoundaryBegin 7272843 MultipartBoundaryEnd 7272883 MimeEntityBegin 7272883 MimeEntityHeadersEnd 7273227 -MimeContentBegin 7273227 -MimeContentEnd 7284097 Octets 10870 Lines 148 MimeEntityEnd 7284097 @@ -6035,7 +4896,6 @@ MultipartEndBoundaryBegin 7284099 MultipartEndBoundaryEnd 7284139 MultipartEpilogueBegin 7284139 MultipartEpilogueEnd 7284139 -MimeContentEnd 7284139 Octets 12289 Lines 196 MimeEntityEnd 7284139 @@ -6046,15 +4906,12 @@ MimeMessageBegin 7284174 MimeMessageHeadersEnd 7285430 MimeEntityBegin 7284174 MimeEntityHeadersEnd 7285430 -MimeContentBegin 7285430 MultipartPreambleBegin 7285430 MultipartPreambleEnd 7285478 MultipartBoundaryBegin 7285478 MultipartBoundaryEnd 7285517 MimeEntityBegin 7285517 MimeEntityHeadersEnd 7285596 -MimeContentBegin 7285596 -MimeContentEnd 7285626 Octets 30 Lines 4 MimeEntityEnd 7285626 @@ -6062,20 +4919,16 @@ MultipartBoundaryBegin 7285628 MultipartBoundaryEnd 7285667 MimeEntityBegin 7285667 MimeEntityHeadersEnd 7285761 -MimeContentBegin 7285761 MimeMessageBegin 7285761 MimeMessageHeadersEnd 7286598 MimeEntityBegin 7285761 MimeEntityHeadersEnd 7286598 -MimeContentBegin 7286598 MultipartPreambleBegin 7286598 MultipartPreambleEnd 7286600 MultipartBoundaryBegin 7286600 MultipartBoundaryEnd 7286640 MimeEntityBegin 7286640 MimeEntityHeadersEnd 7286719 -MimeContentBegin 7286719 -MimeContentEnd 7287362 Octets 643 Lines 17 MimeEntityEnd 7287362 @@ -6083,15 +4936,12 @@ MultipartBoundaryBegin 7287364 MultipartBoundaryEnd 7287404 MimeEntityBegin 7287404 MimeEntityHeadersEnd 7287488 -MimeContentBegin 7287488 MultipartPreambleBegin 7287488 MultipartPreambleEnd 7287490 MultipartBoundaryBegin 7287490 MultipartBoundaryEnd 7287530 MimeEntityBegin 7287530 MimeEntityHeadersEnd 7287608 -MimeContentBegin 7287608 -MimeContentEnd 7288476 Octets 868 Lines 19 MimeEntityEnd 7288476 @@ -6099,8 +4949,6 @@ MultipartBoundaryBegin 7288478 MultipartBoundaryEnd 7288518 MimeEntityBegin 7288518 MimeEntityHeadersEnd 7288707 -MimeContentBegin 7288707 -MimeContentEnd 8042865 Octets 754158 Lines 10192 MimeEntityEnd 8042865 @@ -6108,7 +4956,6 @@ MultipartEndBoundaryBegin 8042867 MultipartEndBoundaryEnd 8042907 MultipartEpilogueBegin 8042907 MultipartEpilogueEnd 8042909 -MimeContentEnd 8042909 Octets 755421 Lines 10224 MimeEntityEnd 8042909 @@ -6116,12 +4963,10 @@ MultipartEndBoundaryBegin 8042911 MultipartEndBoundaryEnd 8042951 MultipartEpilogueBegin 8042951 MultipartEpilogueEnd 8042957 -MimeContentEnd 8042957 Octets 756359 Lines 10253 MimeEntityEnd 8042957 MimeMessageEnd 8042957 -MimeContentEnd 8042957 Octets 757196 Lines 10269 MimeEntityEnd 8042957 @@ -6129,7 +4974,6 @@ MultipartEndBoundaryBegin 8042959 MultipartEndBoundaryEnd 8042998 MultipartEpilogueBegin 8042998 MultipartEpilogueEnd 8043000 -MimeContentEnd 8043000 Octets 757570 Lines 10286 MimeEntityEnd 8043000 @@ -6140,15 +4984,12 @@ MimeMessageBegin 8043035 MimeMessageHeadersEnd 8044321 MimeEntityBegin 8043035 MimeEntityHeadersEnd 8044321 -MimeContentBegin 8044321 MultipartPreambleBegin 8044321 MultipartPreambleEnd 8044323 MultipartBoundaryBegin 8044323 MultipartBoundaryEnd 8044368 MimeEntityBegin 8044368 MimeEntityHeadersEnd 8044462 -MimeContentBegin 8044462 -MimeContentEnd 8046894 Octets 2432 Lines 51 MimeEntityEnd 8046894 @@ -6156,8 +4997,6 @@ MultipartBoundaryBegin 8046896 MultipartBoundaryEnd 8046941 MimeEntityBegin 8046941 MimeEntityHeadersEnd 8047105 -MimeContentBegin 8047105 -MimeContentEnd 8053207 Octets 6102 Lines 80 MimeEntityEnd 8053207 @@ -6165,8 +5004,6 @@ MultipartBoundaryBegin 8053209 MultipartBoundaryEnd 8053254 MimeEntityBegin 8053254 MimeEntityHeadersEnd 8053417 -MimeContentBegin 8053417 -MimeContentEnd 8065647 Octets 12230 Lines 158 MimeEntityEnd 8065647 @@ -6174,8 +5011,6 @@ MultipartBoundaryBegin 8065649 MultipartBoundaryEnd 8065694 MimeEntityBegin 8065694 MimeEntityHeadersEnd 8065859 -MimeContentBegin 8065859 -MimeContentEnd 8087855 Octets 21996 Lines 283 MimeEntityEnd 8087855 @@ -6183,8 +5018,6 @@ MultipartBoundaryBegin 8087857 MultipartBoundaryEnd 8087902 MimeEntityBegin 8087902 MimeEntityHeadersEnd 8088111 -MimeContentBegin 8088111 -MimeContentEnd 8091549 Octets 3438 Lines 46 MimeEntityEnd 8091549 @@ -6192,7 +5025,6 @@ MultipartEndBoundaryBegin 8091551 MultipartEndBoundaryEnd 8091596 MultipartEpilogueBegin 8091596 MultipartEpilogueEnd 8091598 -MimeContentEnd 8091598 Octets 47277 Lines 650 MimeEntityEnd 8091598 @@ -6203,8 +5035,6 @@ MimeMessageBegin 8091609 MimeMessageHeadersEnd 8092367 MimeEntityBegin 8091609 MimeEntityHeadersEnd 8092367 -MimeContentBegin 8092367 -MimeContentEnd 8644457 Octets 552090 Lines 7475 MimeEntityEnd 8644457 @@ -6215,15 +5045,12 @@ MimeMessageBegin 8644468 MimeMessageHeadersEnd 8645400 MimeEntityBegin 8644468 MimeEntityHeadersEnd 8645400 -MimeContentBegin 8645400 MultipartPreambleBegin 8645400 MultipartPreambleEnd 8645402 MultipartBoundaryBegin 8645402 MultipartBoundaryEnd 8645411 MimeEntityBegin 8645411 MimeEntityHeadersEnd 8645442 -MimeContentBegin 8645442 -MimeContentEnd 8648068 Octets 2626 Lines 97 MimeEntityEnd 8648068 @@ -6231,7 +5058,6 @@ MultipartEndBoundaryBegin 8648070 MultipartEndBoundaryEnd 8648079 MultipartEpilogueBegin 8648079 MultipartEpilogueEnd 8648081 -MimeContentEnd 8648081 Octets 2681 Lines 103 MimeEntityEnd 8648081 @@ -6242,15 +5068,12 @@ MimeMessageBegin 8648116 MimeMessageHeadersEnd 8648726 MimeEntityBegin 8648116 MimeEntityHeadersEnd 8648726 -MimeContentBegin 8648726 MultipartPreambleBegin 8648726 MultipartPreambleEnd 8649013 MultipartBoundaryBegin 8649013 MultipartBoundaryEnd 8649031 MimeEntityBegin 8649031 MimeEntityHeadersEnd 8649078 -MimeContentBegin 8649078 -MimeContentEnd 8650186 Octets 1108 Lines 27 MimeEntityEnd 8650186 @@ -6258,8 +5081,6 @@ MultipartBoundaryBegin 8650188 MultipartBoundaryEnd 8650206 MimeEntityBegin 8650206 MimeEntityHeadersEnd 8650249 -MimeContentBegin 8650249 -MimeContentEnd 8650542 Octets 293 Lines 10 MimeEntityEnd 8650542 @@ -6267,7 +5088,6 @@ MultipartEndBoundaryBegin 8650544 MultipartEndBoundaryEnd 8650562 MultipartEpilogueBegin 8650562 MultipartEpilogueEnd 8650562 -MimeContentEnd 8650562 Octets 1836 Lines 51 MimeEntityEnd 8650562 @@ -6278,8 +5098,6 @@ MimeMessageBegin 8650573 MimeMessageHeadersEnd 8651756 MimeEntityBegin 8650573 MimeEntityHeadersEnd 8651756 -MimeContentBegin 8651756 -MimeContentEnd 8653178 Octets 1422 Lines 40 MimeEntityEnd 8653178 @@ -6290,8 +5108,6 @@ MimeMessageBegin 8653189 MimeMessageHeadersEnd 8653839 MimeEntityBegin 8653189 MimeEntityHeadersEnd 8653839 -MimeContentBegin 8653839 -MimeContentEnd 8654840 Octets 1001 Lines 28 MimeEntityEnd 8654840 @@ -6302,15 +5118,12 @@ MimeMessageBegin 8654851 MimeMessageHeadersEnd 8655631 MimeEntityBegin 8654851 MimeEntityHeadersEnd 8655631 -MimeContentBegin 8655631 MultipartPreambleBegin 8655631 MultipartPreambleEnd 8655789 MultipartBoundaryBegin 8655789 MultipartBoundaryEnd 8655830 MimeEntityBegin 8655830 MimeEntityHeadersEnd 8655876 -MimeContentBegin 8655876 -MimeContentEnd 8656708 Octets 832 Lines 16 MimeEntityEnd 8656708 @@ -6318,15 +5131,12 @@ MultipartBoundaryBegin 8656710 MultipartBoundaryEnd 8656751 MimeEntityBegin 8656751 MimeEntityHeadersEnd 8656839 -MimeContentBegin 8656839 MultipartPreambleBegin 8656839 MultipartPreambleEnd 8656839 MultipartBoundaryBegin 8656839 MultipartBoundaryEnd 8656882 MimeEntityBegin 8656882 MimeEntityHeadersEnd 8656976 -MimeContentBegin 8656976 -MimeContentEnd 8657477 Octets 501 Lines 11 MimeEntityEnd 8657477 @@ -6334,18 +5144,14 @@ MultipartBoundaryBegin 8657479 MultipartBoundaryEnd 8657522 MimeEntityBegin 8657522 MimeEntityHeadersEnd 8657715 -MimeContentBegin 8657715 MimeMessageBegin 8657715 MimeMessageHeadersEnd 8657744 MimeEntityBegin 8657715 MimeEntityHeadersEnd 8657744 -MimeContentBegin 8657744 -MimeContentEnd 8657748 Octets 4 Lines 3 MimeEntityEnd 8657748 MimeMessageEnd 8657748 -MimeContentEnd 8657748 Octets 33 Lines 5 MimeEntityEnd 8657748 @@ -6353,8 +5159,6 @@ MultipartBoundaryBegin 8657750 MultipartBoundaryEnd 8657793 MimeEntityBegin 8657793 MimeEntityHeadersEnd 8657884 -MimeContentBegin 8657884 -MimeContentEnd 8657889 Octets 5 Lines 3 MimeEntityEnd 8657889 @@ -6362,18 +5166,14 @@ MultipartBoundaryBegin 8657891 MultipartBoundaryEnd 8657934 MimeEntityBegin 8657934 MimeEntityHeadersEnd 8658142 -MimeContentBegin 8658142 MimeMessageBegin 8658142 MimeMessageHeadersEnd 8658169 MimeEntityBegin 8658142 MimeEntityHeadersEnd 8658169 -MimeContentBegin 8658169 -MimeContentEnd 8658173 Octets 4 Lines 3 MimeEntityEnd 8658173 MimeMessageEnd 8658173 -MimeContentEnd 8658173 Octets 31 Lines 5 MimeEntityEnd 8658173 @@ -6381,8 +5181,6 @@ MultipartBoundaryBegin 8658175 MultipartBoundaryEnd 8658218 MimeEntityBegin 8658218 MimeEntityHeadersEnd 8658312 -MimeContentBegin 8658312 -MimeContentEnd 8658541 Octets 229 Lines 8 MimeEntityEnd 8658541 @@ -6390,7 +5188,6 @@ MultipartEndBoundaryBegin 8658543 MultipartEndBoundaryEnd 8658586 MultipartEpilogueBegin 8658586 MultipartEpilogueEnd 8658588 -MimeContentEnd 8658588 Octets 1749 Lines 62 MimeEntityEnd 8658588 @@ -6398,7 +5195,6 @@ MultipartEndBoundaryBegin 8658590 MultipartEndBoundaryEnd 8658631 MultipartEpilogueBegin 8658631 MultipartEpilogueEnd 8658633 -MimeContentEnd 8658633 Octets 3002 Lines 90 MimeEntityEnd 8658633 @@ -6409,8 +5205,6 @@ MimeMessageBegin 8658644 MimeMessageHeadersEnd 8659476 MimeEntityBegin 8658644 MimeEntityHeadersEnd 8659476 -MimeContentBegin 8659476 -MimeContentEnd 8660904 Octets 1428 Lines 43 MimeEntityEnd 8660904 @@ -6421,8 +5215,6 @@ MimeMessageBegin 8660915 MimeMessageHeadersEnd 8661072 MimeEntityBegin 8660915 MimeEntityHeadersEnd 8661072 -MimeContentBegin 8661072 -MimeContentEnd 8665806 Octets 4734 Lines 64 MimeEntityEnd 8665806 @@ -6433,15 +5225,12 @@ MimeMessageBegin 8665817 MimeMessageHeadersEnd 8667595 MimeEntityBegin 8665817 MimeEntityHeadersEnd 8667595 -MimeContentBegin 8667595 MultipartPreambleBegin 8667595 MultipartPreambleEnd 8667753 MultipartBoundaryBegin 8667753 MultipartBoundaryEnd 8667794 MimeEntityBegin 8667794 MimeEntityHeadersEnd 8667840 -MimeContentBegin 8667840 -MimeContentEnd 8669545 Octets 1705 Lines 39 MimeEntityEnd 8669545 @@ -6449,15 +5238,12 @@ MultipartBoundaryBegin 8669547 MultipartBoundaryEnd 8669588 MimeEntityBegin 8669588 MimeEntityHeadersEnd 8669676 -MimeContentBegin 8669676 MultipartPreambleBegin 8669676 MultipartPreambleEnd 8669676 MultipartBoundaryBegin 8669676 MultipartBoundaryEnd 8669719 MimeEntityBegin 8669719 MimeEntityHeadersEnd 8669813 -MimeContentBegin 8669813 -MimeContentEnd 8670384 Octets 571 Lines 15 MimeEntityEnd 8670384 @@ -6465,8 +5251,6 @@ MultipartBoundaryBegin 8670386 MultipartBoundaryEnd 8670429 MimeEntityBegin 8670429 MimeEntityHeadersEnd 8670493 -MimeContentBegin 8670493 -MimeContentEnd 8671377 Octets 884 Lines 13 MimeEntityEnd 8671377 @@ -6474,8 +5258,6 @@ MultipartBoundaryBegin 8671379 MultipartBoundaryEnd 8671422 MimeEntityBegin 8671422 MimeEntityHeadersEnd 8671516 -MimeContentBegin 8671516 -MimeContentEnd 8671567 Octets 51 Lines 6 MimeEntityEnd 8671567 @@ -6483,8 +5265,6 @@ MultipartBoundaryBegin 8671569 MultipartBoundaryEnd 8671612 MimeEntityBegin 8671612 MimeEntityHeadersEnd 8671676 -MimeContentBegin 8671676 -MimeContentEnd 8672560 Octets 884 Lines 13 MimeEntityEnd 8672560 @@ -6492,8 +5272,6 @@ MultipartBoundaryBegin 8672562 MultipartBoundaryEnd 8672605 MimeEntityBegin 8672605 MimeEntityHeadersEnd 8672699 -MimeContentBegin 8672699 -MimeContentEnd 8672750 Octets 51 Lines 6 MimeEntityEnd 8672750 @@ -6501,8 +5279,6 @@ MultipartBoundaryBegin 8672752 MultipartBoundaryEnd 8672795 MimeEntityBegin 8672795 MimeEntityHeadersEnd 8672859 -MimeContentBegin 8672859 -MimeContentEnd 8673743 Octets 884 Lines 13 MimeEntityEnd 8673743 @@ -6510,8 +5286,6 @@ MultipartBoundaryBegin 8673745 MultipartBoundaryEnd 8673788 MimeEntityBegin 8673788 MimeEntityHeadersEnd 8673882 -MimeContentBegin 8673882 -MimeContentEnd 8673927 Octets 45 Lines 6 MimeEntityEnd 8673927 @@ -6519,8 +5293,6 @@ MultipartBoundaryBegin 8673929 MultipartBoundaryEnd 8673972 MimeEntityBegin 8673972 MimeEntityHeadersEnd 8674036 -MimeContentBegin 8674036 -MimeContentEnd 8674264 Octets 228 Lines 5 MimeEntityEnd 8674264 @@ -6528,8 +5300,6 @@ MultipartBoundaryBegin 8674266 MultipartBoundaryEnd 8674309 MimeEntityBegin 8674309 MimeEntityHeadersEnd 8674403 -MimeContentBegin 8674403 -MimeContentEnd 8674472 Octets 69 Lines 6 MimeEntityEnd 8674472 @@ -6537,8 +5307,6 @@ MultipartBoundaryBegin 8674474 MultipartBoundaryEnd 8674517 MimeEntityBegin 8674517 MimeEntityHeadersEnd 8674581 -MimeContentBegin 8674581 -MimeContentEnd 8674809 Octets 228 Lines 5 MimeEntityEnd 8674809 @@ -6546,8 +5314,6 @@ MultipartBoundaryBegin 8674811 MultipartBoundaryEnd 8674854 MimeEntityBegin 8674854 MimeEntityHeadersEnd 8674948 -MimeContentBegin 8674948 -MimeContentEnd 8674997 Octets 49 Lines 6 MimeEntityEnd 8674997 @@ -6555,8 +5321,6 @@ MultipartBoundaryBegin 8674999 MultipartBoundaryEnd 8675042 MimeEntityBegin 8675042 MimeEntityHeadersEnd 8675106 -MimeContentBegin 8675106 -MimeContentEnd 8675334 Octets 228 Lines 5 MimeEntityEnd 8675334 @@ -6564,8 +5328,6 @@ MultipartBoundaryBegin 8675336 MultipartBoundaryEnd 8675379 MimeEntityBegin 8675379 MimeEntityHeadersEnd 8675473 -MimeContentBegin 8675473 -MimeContentEnd 8675776 Octets 303 Lines 12 MimeEntityEnd 8675776 @@ -6573,8 +5335,6 @@ MultipartBoundaryBegin 8675778 MultipartBoundaryEnd 8675821 MimeEntityBegin 8675821 MimeEntityHeadersEnd 8675885 -MimeContentBegin 8675885 -MimeContentEnd 8676769 Octets 884 Lines 13 MimeEntityEnd 8676769 @@ -6582,8 +5342,6 @@ MultipartBoundaryBegin 8676771 MultipartBoundaryEnd 8676814 MimeEntityBegin 8676814 MimeEntityHeadersEnd 8676908 -MimeContentBegin 8676908 -MimeContentEnd 8676952 Octets 44 Lines 5 MimeEntityEnd 8676952 @@ -6591,8 +5349,6 @@ MultipartBoundaryBegin 8676954 MultipartBoundaryEnd 8676997 MimeEntityBegin 8676997 MimeEntityHeadersEnd 8677061 -MimeContentBegin 8677061 -MimeContentEnd 8679003 Octets 1942 Lines 28 MimeEntityEnd 8679003 @@ -6600,8 +5356,6 @@ MultipartBoundaryBegin 8679005 MultipartBoundaryEnd 8679048 MimeEntityBegin 8679048 MimeEntityHeadersEnd 8679142 -MimeContentBegin 8679142 -MimeContentEnd 8679153 Octets 11 Lines 2 MimeEntityEnd 8679153 @@ -6609,7 +5363,6 @@ MultipartEndBoundaryBegin 8679155 MultipartEndBoundaryEnd 8679198 MultipartEpilogueBegin 8679198 MultipartEpilogueEnd 8679200 -MimeContentEnd 8679200 Octets 9524 Lines 229 MimeEntityEnd 8679200 @@ -6617,7 +5370,6 @@ MultipartEndBoundaryBegin 8679202 MultipartEndBoundaryEnd 8679243 MultipartEpilogueBegin 8679243 MultipartEpilogueEnd 8679245 -MimeContentEnd 8679245 Octets 11650 Lines 280 MimeEntityEnd 8679245 @@ -6628,15 +5380,12 @@ MimeMessageBegin 8679256 MimeMessageHeadersEnd 8680000 MimeEntityBegin 8679256 MimeEntityHeadersEnd 8680000 -MimeContentBegin 8680000 MultipartPreambleBegin 8680000 MultipartPreambleEnd 8680158 MultipartBoundaryBegin 8680158 MultipartBoundaryEnd 8680199 MimeEntityBegin 8680199 MimeEntityHeadersEnd 8680245 -MimeContentBegin 8680245 -MimeContentEnd 8680884 Octets 639 Lines 13 MimeEntityEnd 8680884 @@ -6644,15 +5393,12 @@ MultipartBoundaryBegin 8680886 MultipartBoundaryEnd 8680927 MimeEntityBegin 8680927 MimeEntityHeadersEnd 8681015 -MimeContentBegin 8681015 MultipartPreambleBegin 8681015 MultipartPreambleEnd 8681015 MultipartBoundaryBegin 8681015 MultipartBoundaryEnd 8681058 MimeEntityBegin 8681058 MimeEntityHeadersEnd 8681152 -MimeContentBegin 8681152 -MimeContentEnd 8681693 Octets 541 Lines 9 MimeEntityEnd 8681693 @@ -6660,8 +5406,6 @@ MultipartBoundaryBegin 8681695 MultipartBoundaryEnd 8681738 MimeEntityBegin 8681738 MimeEntityHeadersEnd 8681850 -MimeContentBegin 8681850 -MimeContentEnd 8690560 Octets 8710 Lines 126 MimeEntityEnd 8690560 @@ -6669,8 +5413,6 @@ MultipartBoundaryBegin 8690562 MultipartBoundaryEnd 8690605 MimeEntityBegin 8690605 MimeEntityHeadersEnd 8690699 -MimeContentBegin 8690699 -MimeContentEnd 8690747 Octets 48 Lines 4 MimeEntityEnd 8690747 @@ -6678,7 +5420,6 @@ MultipartEndBoundaryBegin 8690749 MultipartEndBoundaryEnd 8690792 MultipartEpilogueBegin 8690792 MultipartEpilogueEnd 8690794 -MimeContentEnd 8690794 Octets 9779 Lines 154 MimeEntityEnd 8690794 @@ -6686,7 +5427,6 @@ MultipartEndBoundaryBegin 8690796 MultipartEndBoundaryEnd 8690837 MultipartEpilogueBegin 8690837 MultipartEpilogueEnd 8690837 -MimeContentEnd 8690837 Octets 10837 Lines 178 MimeEntityEnd 8690837 @@ -6697,15 +5437,12 @@ MimeMessageBegin 8690848 MimeMessageHeadersEnd 8691509 MimeEntityBegin 8690848 MimeEntityHeadersEnd 8691509 -MimeContentBegin 8691509 MultipartPreambleBegin 8691509 MultipartPreambleEnd 8691511 MultipartBoundaryBegin 8691511 MultipartBoundaryEnd 8691561 MimeEntityBegin 8691561 MimeEntityHeadersEnd 8691654 -MimeContentBegin 8691654 -MimeContentEnd 8691757 Octets 103 Lines 7 MimeEntityEnd 8691757 @@ -6713,8 +5450,6 @@ MultipartBoundaryBegin 8691759 MultipartBoundaryEnd 8691809 MimeEntityBegin 8691809 MimeEntityHeadersEnd 8691940 -MimeContentBegin 8691940 -MimeContentEnd 8771456 Octets 79516 Lines 1075 MimeEntityEnd 8771456 @@ -6722,7 +5457,6 @@ MultipartEndBoundaryBegin 8771458 MultipartEndBoundaryEnd 8771508 MultipartEpilogueBegin 8771508 MultipartEpilogueEnd 8771510 -MimeContentEnd 8771510 Octets 80001 Lines 1094 MimeEntityEnd 8771510 @@ -6733,15 +5467,12 @@ MimeMessageBegin 8771521 MimeMessageHeadersEnd 8772294 MimeEntityBegin 8771521 MimeEntityHeadersEnd 8772294 -MimeContentBegin 8772294 MultipartPreambleBegin 8772294 MultipartPreambleEnd 8772452 MultipartBoundaryBegin 8772452 MultipartBoundaryEnd 8772493 MimeEntityBegin 8772493 MimeEntityHeadersEnd 8772539 -MimeContentBegin 8772539 -MimeContentEnd 8773917 Octets 1378 Lines 29 MimeEntityEnd 8773917 @@ -6749,15 +5480,12 @@ MultipartBoundaryBegin 8773919 MultipartBoundaryEnd 8773960 MimeEntityBegin 8773960 MimeEntityHeadersEnd 8774048 -MimeContentBegin 8774048 MultipartPreambleBegin 8774048 MultipartPreambleEnd 8774048 MultipartBoundaryBegin 8774048 MultipartBoundaryEnd 8774091 MimeEntityBegin 8774091 MimeEntityHeadersEnd 8774185 -MimeContentBegin 8774185 -MimeContentEnd 8775346 Octets 1161 Lines 23 MimeEntityEnd 8775346 @@ -6765,8 +5493,6 @@ MultipartBoundaryBegin 8775348 MultipartBoundaryEnd 8775391 MimeEntityBegin 8775391 MimeEntityHeadersEnd 8775493 -MimeContentBegin 8775493 -MimeContentEnd 8892315 Octets 116822 Lines 1580 MimeEntityEnd 8892315 @@ -6774,8 +5500,6 @@ MultipartBoundaryBegin 8892317 MultipartBoundaryEnd 8892360 MimeEntityBegin 8892360 MimeEntityHeadersEnd 8892454 -MimeContentBegin 8892454 -MimeContentEnd 8892580 Octets 126 Lines 4 MimeEntityEnd 8892580 @@ -6783,8 +5507,6 @@ MultipartBoundaryBegin 8892582 MultipartBoundaryEnd 8892625 MimeEntityBegin 8892625 MimeEntityHeadersEnd 8892728 -MimeContentBegin 8892728 -MimeContentEnd 8959970 Octets 67242 Lines 962 MimeEntityEnd 8959970 @@ -6792,8 +5514,6 @@ MultipartBoundaryBegin 8959972 MultipartBoundaryEnd 8960015 MimeEntityBegin 8960015 MimeEntityHeadersEnd 8960106 -MimeContentBegin 8960106 -MimeContentEnd 8960106 Octets 0 Lines 1 MimeEntityEnd 8960106 @@ -6801,7 +5521,6 @@ MultipartEndBoundaryBegin 8960108 MultipartEndBoundaryEnd 8960151 MultipartEpilogueBegin 8960151 MultipartEpilogueEnd 8960153 -MimeContentEnd 8960153 Octets 186105 Lines 2594 MimeEntityEnd 8960153 @@ -6809,7 +5528,6 @@ MultipartEndBoundaryBegin 8960155 MultipartEndBoundaryEnd 8960196 MultipartEpilogueBegin 8960196 MultipartEpilogueEnd 8960196 -MimeContentEnd 8960196 Octets 187902 Lines 2634 MimeEntityEnd 8960196 @@ -6820,8 +5538,6 @@ MimeMessageBegin 8960207 MimeMessageHeadersEnd 8961063 MimeEntityBegin 8960207 MimeEntityHeadersEnd 8961063 -MimeContentBegin 8961063 -MimeContentEnd 8962821 Octets 1758 Lines 26 MimeEntityEnd 8962821 @@ -6832,18 +5548,14 @@ MimeMessageBegin 8962832 MimeMessageHeadersEnd 8963476 MimeEntityBegin 8962832 MimeEntityHeadersEnd 8963476 -MimeContentBegin 8963476 MimeMessageBegin 8963476 MimeMessageHeadersEnd 8963972 MimeEntityBegin 8963476 MimeEntityHeadersEnd 8963972 -MimeContentBegin 8963972 -MimeContentEnd 8964871 Octets 899 Lines 25 MimeEntityEnd 8964871 MimeMessageEnd 8964871 -MimeContentEnd 8964871 Octets 1395 Lines 38 MimeEntityEnd 8964871 @@ -6854,15 +5566,12 @@ MimeMessageBegin 8964882 MimeMessageHeadersEnd 8965340 MimeEntityBegin 8964882 MimeEntityHeadersEnd 8965340 -MimeContentBegin 8965340 MultipartPreambleBegin 8965340 MultipartPreambleEnd 8965340 MultipartBoundaryBegin 8965340 MultipartBoundaryEnd 8965350 MimeEntityBegin 8965350 MimeEntityHeadersEnd 8965352 -MimeContentBegin 8965352 -MimeContentEnd 8965393 Octets 41 Lines 2 MimeEntityEnd 8965393 @@ -6870,8 +5579,6 @@ MultipartBoundaryBegin 8965395 MultipartBoundaryEnd 8965405 MimeEntityBegin 8965405 MimeEntityHeadersEnd 8965469 -MimeContentBegin 8965469 -MimeContentEnd 9057967 Octets 92498 Lines 1250 MimeEntityEnd 9057967 @@ -6879,7 +5586,6 @@ MultipartEndBoundaryBegin 9057969 MultipartEndBoundaryEnd 9057979 MultipartEpilogueBegin 9057979 MultipartEpilogueEnd 9057985 -MimeContentEnd 9057985 Octets 92645 Lines 1262 MimeEntityEnd 9057985 @@ -6890,8 +5596,6 @@ MimeMessageBegin 9057996 MimeMessageHeadersEnd 9058498 MimeEntityBegin 9057996 MimeEntityHeadersEnd 9058498 -MimeContentBegin 9058498 -MimeContentEnd 9059667 Octets 1169 Lines 28 MimeEntityEnd 9059667 @@ -6902,15 +5606,12 @@ MimeMessageBegin 9059678 MimeMessageHeadersEnd 9060843 MimeEntityBegin 9059678 MimeEntityHeadersEnd 9060843 -MimeContentBegin 9060843 MultipartPreambleBegin 9060843 MultipartPreambleEnd 9060843 MultipartBoundaryBegin 9060843 MultipartBoundaryEnd 9060849 MimeEntityBegin 9060849 MimeEntityHeadersEnd 9060851 -MimeContentBegin 9060851 -MimeContentEnd 9061403 Octets 552 Lines 13 MimeEntityEnd 9061403 @@ -6918,8 +5619,6 @@ MultipartBoundaryBegin 9061405 MultipartBoundaryEnd 9061411 MimeEntityBegin 9061411 MimeEntityHeadersEnd 9061531 -MimeContentBegin 9061531 -MimeContentEnd 9119961 Octets 58430 Lines 790 MimeEntityEnd 9119961 @@ -6927,8 +5626,6 @@ MultipartBoundaryBegin 9119963 MultipartBoundaryEnd 9119969 MimeEntityBegin 9119969 MimeEntityHeadersEnd 9119971 -MimeContentBegin 9119971 -MimeContentEnd 9123837 Octets 3866 Lines 84 MimeEntityEnd 9123837 @@ -6936,8 +5633,6 @@ MultipartBoundaryBegin 9123839 MultipartBoundaryEnd 9123845 MimeEntityBegin 9123845 MimeEntityHeadersEnd 9124003 -MimeContentBegin 9124003 -MimeContentEnd 9154647 Octets 30644 Lines 1010 MimeEntityEnd 9154647 @@ -6945,8 +5640,6 @@ MultipartBoundaryBegin 9154649 MultipartBoundaryEnd 9154655 MimeEntityBegin 9154655 MimeEntityHeadersEnd 9154764 -MimeContentBegin 9154764 -MimeContentEnd 9155504 Octets 740 Lines 25 MimeEntityEnd 9155504 @@ -6954,8 +5647,6 @@ MultipartBoundaryBegin 9155506 MultipartBoundaryEnd 9155512 MimeEntityBegin 9155512 MimeEntityHeadersEnd 9155632 -MimeContentBegin 9155632 -MimeContentEnd 9156920 Octets 1288 Lines 25 MimeEntityEnd 9156920 @@ -6963,7 +5654,6 @@ MultipartEndBoundaryBegin 9156922 MultipartEndBoundaryEnd 9156928 MultipartEpilogueBegin 9156928 MultipartEpilogueEnd 9156930 -MimeContentEnd 9156930 Octets 96087 Lines 1971 MimeEntityEnd 9156930 @@ -6974,15 +5664,12 @@ MimeMessageBegin 9156965 MimeMessageHeadersEnd 9158136 MimeEntityBegin 9156965 MimeEntityHeadersEnd 9158136 -MimeContentBegin 9158136 MultipartPreambleBegin 9158136 MultipartPreambleEnd 9158136 MultipartBoundaryBegin 9158136 MultipartBoundaryEnd 9158154 MimeEntityBegin 9158154 MimeEntityHeadersEnd 9158156 -MimeContentBegin 9158156 -MimeContentEnd 9159077 Octets 921 Lines 21 MimeEntityEnd 9159077 @@ -6990,8 +5677,6 @@ MultipartBoundaryBegin 9159079 MultipartBoundaryEnd 9159097 MimeEntityBegin 9159097 MimeEntityHeadersEnd 9159179 -MimeContentBegin 9159179 -MimeContentEnd 9159939 Octets 760 Lines 13 MimeEntityEnd 9159939 @@ -6999,7 +5684,6 @@ MultipartEndBoundaryBegin 9159941 MultipartEndBoundaryEnd 9159959 MultipartEpilogueBegin 9159959 MultipartEpilogueEnd 9159961 -MimeContentEnd 9159961 Octets 1825 Lines 42 MimeEntityEnd 9159961 @@ -7010,15 +5694,12 @@ MimeMessageBegin 9159996 MimeMessageHeadersEnd 9161157 MimeEntityBegin 9159996 MimeEntityHeadersEnd 9161157 -MimeContentBegin 9161157 MultipartPreambleBegin 9161157 MultipartPreambleEnd 9161333 MultipartBoundaryBegin 9161333 MultipartBoundaryEnd 9161341 MimeEntityBegin 9161341 MimeEntityHeadersEnd 9161422 -MimeContentBegin 9161422 -MimeContentEnd 9162176 Octets 754 Lines 14 MimeEntityEnd 9162176 @@ -7026,8 +5707,6 @@ MultipartBoundaryBegin 9162178 MultipartBoundaryEnd 9162186 MimeEntityBegin 9162186 MimeEntityHeadersEnd 9162369 -MimeContentBegin 9162369 -MimeContentEnd 9164615 Octets 2246 Lines 32 MimeEntityEnd 9164615 @@ -7035,7 +5714,6 @@ MultipartEndBoundaryBegin 9164617 MultipartEndBoundaryEnd 9164625 MultipartEpilogueBegin 9164625 MultipartEpilogueEnd 9164625 -MimeContentEnd 9164625 Octets 3468 Lines 60 MimeEntityEnd 9164625 @@ -7046,15 +5724,12 @@ MimeMessageBegin 9164660 MimeMessageHeadersEnd 9165820 MimeEntityBegin 9164660 MimeEntityHeadersEnd 9165820 -MimeContentBegin 9165820 MultipartPreambleBegin 9165820 MultipartPreambleEnd 9165996 MultipartBoundaryBegin 9165996 MultipartBoundaryEnd 9166018 MimeEntityBegin 9166018 MimeEntityHeadersEnd 9166099 -MimeContentBegin 9166099 -MimeContentEnd 9168957 Octets 2858 Lines 47 MimeEntityEnd 9168957 @@ -7062,8 +5737,6 @@ MultipartBoundaryBegin 9168959 MultipartBoundaryEnd 9168981 MimeEntityBegin 9168981 MimeEntityHeadersEnd 9169164 -MimeContentBegin 9169164 -MimeContentEnd 9171746 Octets 2582 Lines 36 MimeEntityEnd 9171746 @@ -7071,7 +5744,6 @@ MultipartEndBoundaryBegin 9171748 MultipartEndBoundaryEnd 9171770 MultipartEpilogueBegin 9171770 MultipartEpilogueEnd 9171770 -MimeContentEnd 9171770 Octets 5950 Lines 97 MimeEntityEnd 9171770 @@ -7082,8 +5754,6 @@ MimeMessageBegin 9171781 MimeMessageHeadersEnd 9171996 MimeEntityBegin 9171781 MimeEntityHeadersEnd 9171996 -MimeContentBegin 9171996 -MimeContentEnd 9176246 Octets 4250 Lines 58 MimeEntityEnd 9176246 @@ -7094,15 +5764,12 @@ MimeMessageBegin 9176281 MimeMessageHeadersEnd 9177199 MimeEntityBegin 9176281 MimeEntityHeadersEnd 9177199 -MimeContentBegin 9177199 MultipartPreambleBegin 9177199 MultipartPreambleEnd 9177247 MultipartBoundaryBegin 9177247 MultipartBoundaryEnd 9177275 MimeEntityBegin 9177275 MimeEntityHeadersEnd 9177413 -MimeContentBegin 9177413 -MimeContentEnd 9188281 Octets 10868 Lines 147 MimeEntityEnd 9188281 @@ -7110,8 +5777,6 @@ MultipartBoundaryBegin 9188283 MultipartBoundaryEnd 9188311 MimeEntityBegin 9188311 MimeEntityHeadersEnd 9188466 -MimeContentBegin 9188466 -MimeContentEnd 9193140 Octets 4674 Lines 64 MimeEntityEnd 9193140 @@ -7119,7 +5784,6 @@ MultipartEndBoundaryBegin 9193142 MultipartEndBoundaryEnd 9193170 MultipartEpilogueBegin 9193170 MultipartEpilogueEnd 9193172 -MimeContentEnd 9193172 Octets 15973 Lines 225 MimeEntityEnd 9193172 @@ -7130,8 +5794,6 @@ MimeMessageBegin 9193207 MimeMessageHeadersEnd 9194031 MimeEntityBegin 9193207 MimeEntityHeadersEnd 9194031 -MimeContentBegin 9194031 -MimeContentEnd 9211049 Octets 17018 Lines 258 MimeEntityEnd 9211049 @@ -7142,8 +5804,6 @@ MimeMessageBegin 9211084 MimeMessageHeadersEnd 9211913 MimeEntityBegin 9211084 MimeEntityHeadersEnd 9211913 -MimeContentBegin 9211913 -MimeContentEnd 9237261 Octets 25348 Lines 385 MimeEntityEnd 9237261 @@ -7154,8 +5814,6 @@ MimeMessageBegin 9237296 MimeMessageHeadersEnd 9238125 MimeEntityBegin 9237296 MimeEntityHeadersEnd 9238125 -MimeContentBegin 9238125 -MimeContentEnd 9274811 Octets 36686 Lines 556 MimeEntityEnd 9274811 @@ -7166,8 +5824,6 @@ MimeMessageBegin 9274846 MimeMessageHeadersEnd 9275678 MimeEntityBegin 9274846 MimeEntityHeadersEnd 9275678 -MimeContentBegin 9275678 -MimeContentEnd 9327768 Octets 52090 Lines 790 MimeEntityEnd 9327768 @@ -7178,8 +5834,6 @@ MimeMessageBegin 9327803 MimeMessageHeadersEnd 9329218 MimeEntityBegin 9327803 MimeEntityHeadersEnd 9329218 -MimeContentBegin 9329218 -MimeContentEnd 9330668 Octets 1450 Lines 20 MimeEntityEnd 9330668 @@ -7190,15 +5844,12 @@ MimeMessageBegin 9330703 MimeMessageHeadersEnd 9332080 MimeEntityBegin 9330703 MimeEntityHeadersEnd 9332080 -MimeContentBegin 9332080 MultipartPreambleBegin 9332080 MultipartPreambleEnd 9332082 MultipartBoundaryBegin 9332082 MultipartBoundaryEnd 9332127 MimeEntityBegin 9332127 MimeEntityHeadersEnd 9332194 -MimeContentBegin 9332194 -MimeContentEnd 9332304 Octets 110 Lines 4 MimeEntityEnd 9332304 @@ -7206,8 +5857,6 @@ MultipartBoundaryBegin 9332306 MultipartBoundaryEnd 9332351 MimeEntityBegin 9332351 MimeEntityHeadersEnd 9332506 -MimeContentBegin 9332506 -MimeContentEnd 9336492 Octets 3986 Lines 54 MimeEntityEnd 9336492 @@ -7215,7 +5864,6 @@ MultipartEndBoundaryBegin 9336494 MultipartEndBoundaryEnd 9336539 MultipartEpilogueBegin 9336539 MultipartEpilogueEnd 9336541 -MimeContentEnd 9336541 Octets 4461 Lines 70 MimeEntityEnd 9336541 @@ -7226,8 +5874,6 @@ MimeMessageBegin 9336576 MimeMessageHeadersEnd 9337807 MimeEntityBegin 9336576 MimeEntityHeadersEnd 9337807 -MimeContentBegin 9337807 -MimeContentEnd 9341357 Octets 3550 Lines 56 MimeEntityEnd 9341357 @@ -7238,8 +5884,6 @@ MimeMessageBegin 9341392 MimeMessageHeadersEnd 9342490 MimeEntityBegin 9341392 MimeEntityHeadersEnd 9342490 -MimeContentBegin 9342490 -MimeContentEnd 9343160 Octets 670 Lines 10 MimeEntityEnd 9343160 @@ -7250,8 +5894,6 @@ MimeMessageBegin 9343171 MimeMessageHeadersEnd 9343574 MimeEntityBegin 9343171 MimeEntityHeadersEnd 9343574 -MimeContentBegin 9343574 -MimeContentEnd 9351298 Octets 7724 Lines 105 MimeEntityEnd 9351298 @@ -7262,18 +5904,14 @@ MimeMessageBegin 9351333 MimeMessageHeadersEnd 9352135 MimeEntityBegin 9351333 MimeEntityHeadersEnd 9352135 -MimeContentBegin 9352135 MimeMessageBegin 9352135 MimeMessageHeadersEnd 9353538 MimeEntityBegin 9352135 MimeEntityHeadersEnd 9353538 -MimeContentBegin 9353538 -MimeContentEnd 9354990 Octets 1452 Lines 21 MimeEntityEnd 9354990 MimeMessageEnd 9354990 -MimeContentEnd 9354990 Octets 2855 Lines 44 MimeEntityEnd 9354990 @@ -7284,15 +5922,12 @@ MimeMessageBegin 9355025 MimeMessageHeadersEnd 9355752 MimeEntityBegin 9355025 MimeEntityHeadersEnd 9355752 -MimeContentBegin 9355752 MultipartPreambleBegin 9355752 MultipartPreambleEnd 9355800 MultipartBoundaryBegin 9355800 MultipartBoundaryEnd 9355828 MimeEntityBegin 9355828 MimeEntityHeadersEnd 9355907 -MimeContentBegin 9355907 -MimeContentEnd 9355923 Octets 16 Lines 2 MimeEntityEnd 9355923 @@ -7300,18 +5935,14 @@ MultipartBoundaryBegin 9355925 MultipartBoundaryEnd 9355953 MimeEntityBegin 9355953 MimeEntityHeadersEnd 9356111 -MimeContentBegin 9356111 MimeMessageBegin 9356111 MimeMessageHeadersEnd 9357514 MimeEntityBegin 9356111 MimeEntityHeadersEnd 9357514 -MimeContentBegin 9357514 -MimeContentEnd 9358966 Octets 1452 Lines 21 MimeEntityEnd 9358966 MimeMessageEnd 9358966 -MimeContentEnd 9358966 Octets 2855 Lines 44 MimeEntityEnd 9358966 @@ -7319,7 +5950,6 @@ MultipartEndBoundaryBegin 9358968 MultipartEndBoundaryEnd 9358996 MultipartEpilogueBegin 9358996 MultipartEpilogueEnd 9358998 -MimeContentEnd 9358998 Octets 3246 Lines 59 MimeEntityEnd 9358998 @@ -7330,15 +5960,12 @@ MimeMessageBegin 9359033 MimeMessageHeadersEnd 9359714 MimeEntityBegin 9359033 MimeEntityHeadersEnd 9359714 -MimeContentBegin 9359714 MultipartPreambleBegin 9359714 MultipartPreambleEnd 9359776 MultipartBoundaryBegin 9359776 MultipartBoundaryEnd 9359818 MimeEntityBegin 9359818 MimeEntityHeadersEnd 9359897 -MimeContentBegin 9359897 -MimeContentEnd 9359939 Octets 42 Lines 2 MimeEntityEnd 9359939 @@ -7346,8 +5973,6 @@ MultipartBoundaryBegin 9359941 MultipartBoundaryEnd 9359983 MimeEntityBegin 9359983 MimeEntityHeadersEnd 9360138 -MimeContentBegin 9360138 -MimeContentEnd 9365770 Octets 5632 Lines 77 MimeEntityEnd 9365770 @@ -7355,7 +5980,6 @@ MultipartEndBoundaryBegin 9365772 MultipartEndBoundaryEnd 9365814 MultipartEpilogueBegin 9365814 MultipartEpilogueEnd 9365816 -MimeContentEnd 9365816 Octets 6102 Lines 92 MimeEntityEnd 9365816 @@ -7366,8 +5990,6 @@ MimeMessageBegin 9365851 MimeMessageHeadersEnd 9366934 MimeEntityBegin 9365851 MimeEntityHeadersEnd 9366934 -MimeContentBegin 9366934 -MimeContentEnd 9377310 Octets 10376 Lines 141 MimeEntityEnd 9377310 @@ -7378,15 +6000,12 @@ MimeMessageBegin 9377345 MimeMessageHeadersEnd 9378745 MimeEntityBegin 9377345 MimeEntityHeadersEnd 9378745 -MimeContentBegin 9378745 MultipartPreambleBegin 9378745 MultipartPreambleEnd 9378807 MultipartBoundaryBegin 9378807 MultipartBoundaryEnd 9378849 MimeEntityBegin 9378849 MimeEntityHeadersEnd 9378928 -MimeContentBegin 9378928 -MimeContentEnd 9379555 Octets 627 Lines 17 MimeEntityEnd 9379555 @@ -7394,8 +6013,6 @@ MultipartBoundaryBegin 9379557 MultipartBoundaryEnd 9379599 MimeEntityBegin 9379599 MimeEntityHeadersEnd 9379754 -MimeContentBegin 9379754 -MimeContentEnd 9381566 Octets 1812 Lines 25 MimeEntityEnd 9381566 @@ -7403,7 +6020,6 @@ MultipartEndBoundaryBegin 9381568 MultipartEndBoundaryEnd 9381610 MultipartEpilogueBegin 9381610 MultipartEpilogueEnd 9381612 -MimeContentEnd 9381612 Octets 2867 Lines 55 MimeEntityEnd 9381612 @@ -7414,8 +6030,6 @@ MimeMessageBegin 9381647 MimeMessageHeadersEnd 9382210 MimeEntityBegin 9381647 MimeEntityHeadersEnd 9382210 -MimeContentBegin 9382210 -MimeContentEnd 9382740 Octets 530 Lines 8 MimeEntityEnd 9382740 @@ -7426,15 +6040,12 @@ MimeMessageBegin 9382751 MimeMessageHeadersEnd 9384087 MimeEntityBegin 9382751 MimeEntityHeadersEnd 9384087 -MimeContentBegin 9384087 MultipartPreambleBegin 9384087 MultipartPreambleEnd 9384307 MultipartBoundaryBegin 9384307 MultipartBoundaryEnd 9384349 MimeEntityBegin 9384349 MimeEntityHeadersEnd 9384395 -MimeContentBegin 9384395 -MimeContentEnd 9384998 Octets 603 Lines 16 MimeEntityEnd 9384998 @@ -7442,7 +6053,6 @@ MultipartEndBoundaryBegin 9385000 MultipartEndBoundaryEnd 9385042 MultipartEpilogueBegin 9385042 MultipartEpilogueEnd 9385042 -MimeContentEnd 9385042 Octets 955 Lines 24 MimeEntityEnd 9385042 @@ -7453,15 +6063,12 @@ MimeMessageBegin 9385053 MimeMessageHeadersEnd 9386420 MimeEntityBegin 9385053 MimeEntityHeadersEnd 9386420 -MimeContentBegin 9386420 MultipartPreambleBegin 9386420 MultipartPreambleEnd 9386640 MultipartBoundaryBegin 9386640 MultipartBoundaryEnd 9386682 MimeEntityBegin 9386682 MimeEntityHeadersEnd 9386728 -MimeContentBegin 9386728 -MimeContentEnd 9386835 Octets 107 Lines 7 MimeEntityEnd 9386835 @@ -7469,15 +6076,12 @@ MultipartBoundaryBegin 9386837 MultipartBoundaryEnd 9386879 MimeEntityBegin 9386879 MimeEntityHeadersEnd 9387046 -MimeContentBegin 9387046 MultipartPreambleBegin 9387046 MultipartPreambleEnd 9387266 MultipartBoundaryBegin 9387266 MultipartBoundaryEnd 9387306 MimeEntityBegin 9387306 MimeEntityHeadersEnd 9387416 -MimeContentBegin 9387416 -MimeContentEnd 9387511 Octets 95 Lines 5 MimeEntityEnd 9387511 @@ -7485,18 +6089,14 @@ MultipartBoundaryBegin 9387513 MultipartBoundaryEnd 9387553 MimeEntityBegin 9387553 MimeEntityHeadersEnd 9387649 -MimeContentBegin 9387649 MimeMessageBegin 9387649 MimeMessageHeadersEnd 9388845 MimeEntityBegin 9387649 MimeEntityHeadersEnd 9388845 -MimeContentBegin 9388845 -MimeContentEnd 9389055 Octets 210 Lines 6 MimeEntityEnd 9389055 MimeMessageEnd 9389055 -MimeContentEnd 9389055 Octets 1406 Lines 35 MimeEntityEnd 9389055 @@ -7504,8 +6104,6 @@ MultipartBoundaryBegin 9389057 MultipartBoundaryEnd 9389097 MimeEntityBegin 9389097 MimeEntityHeadersEnd 9389267 -MimeContentBegin 9389267 -MimeContentEnd 9389757 Octets 490 Lines 12 MimeEntityEnd 9389757 @@ -7513,7 +6111,6 @@ MultipartEndBoundaryBegin 9389759 MultipartEndBoundaryEnd 9389799 MultipartEpilogueBegin 9389799 MultipartEpilogueEnd 9389799 -MimeContentEnd 9389799 Octets 2753 Lines 70 MimeEntityEnd 9389799 @@ -7521,8 +6118,6 @@ MultipartBoundaryBegin 9389801 MultipartBoundaryEnd 9389843 MimeEntityBegin 9389843 MimeEntityHeadersEnd 9390060 -MimeContentBegin 9390060 -MimeContentEnd 9395354 Octets 5294 Lines 72 MimeEntityEnd 9395354 @@ -7530,7 +6125,6 @@ MultipartEndBoundaryBegin 9395356 MultipartEndBoundaryEnd 9395398 MultipartEpilogueBegin 9395398 MultipartEpilogueEnd 9395402 -MimeContentEnd 9395402 Octets 8982 Lines 170 MimeEntityEnd 9395402 @@ -7541,8 +6135,6 @@ MimeMessageBegin 9395437 MimeMessageHeadersEnd 9396672 MimeEntityBegin 9395437 MimeEntityHeadersEnd 9396672 -MimeContentBegin 9396672 -MimeContentEnd 9399592 Octets 2920 Lines 39 MimeEntityEnd 9399592 @@ -7553,8 +6145,6 @@ MimeMessageBegin 9399627 MimeMessageHeadersEnd 9400806 MimeEntityBegin 9399627 MimeEntityHeadersEnd 9400806 -MimeContentBegin 9400806 -MimeContentEnd 9402958 Octets 2152 Lines 31 MimeEntityEnd 9402958 @@ -7565,15 +6155,12 @@ MimeMessageBegin 9402993 MimeMessageHeadersEnd 9404092 MimeEntityBegin 9402993 MimeEntityHeadersEnd 9404092 -MimeContentBegin 9404092 MultipartPreambleBegin 9404092 MultipartPreambleEnd 9404094 MultipartBoundaryBegin 9404094 MultipartBoundaryEnd 9404127 MimeEntityBegin 9404127 MimeEntityHeadersEnd 9404194 -MimeContentBegin 9404194 -MimeContentEnd 9404194 Octets 0 Lines 1 MimeEntityEnd 9404194 @@ -7581,8 +6168,6 @@ MultipartBoundaryBegin 9404196 MultipartBoundaryEnd 9404229 MimeEntityBegin 9404229 MimeEntityHeadersEnd 9404311 -MimeContentBegin 9404311 -MimeContentEnd 9407065 Octets 2754 Lines 42 MimeEntityEnd 9407065 @@ -7590,7 +6175,6 @@ MultipartEndBoundaryBegin 9407067 MultipartEndBoundaryEnd 9407100 MultipartEpilogueBegin 9407100 MultipartEpilogueEnd 9407102 -MimeContentEnd 9407102 Octets 3010 Lines 54 MimeEntityEnd 9407102 @@ -7601,15 +6185,12 @@ MimeMessageBegin 9407137 MimeMessageHeadersEnd 9408193 MimeEntityBegin 9407137 MimeEntityHeadersEnd 9408193 -MimeContentBegin 9408193 MultipartPreambleBegin 9408193 MultipartPreambleEnd 9408195 MultipartBoundaryBegin 9408195 MultipartBoundaryEnd 9408236 MimeEntityBegin 9408236 MimeEntityHeadersEnd 9408317 -MimeContentBegin 9408317 -MimeContentEnd 9408783 Octets 466 Lines 14 MimeEntityEnd 9408783 @@ -7617,8 +6198,6 @@ MultipartBoundaryBegin 9408785 MultipartBoundaryEnd 9408826 MimeEntityBegin 9408826 MimeEntityHeadersEnd 9408904 -MimeContentBegin 9408904 -MimeContentEnd 9409741 Octets 837 Lines 27 MimeEntityEnd 9409741 @@ -7626,8 +6205,6 @@ MultipartBoundaryBegin 9409743 MultipartBoundaryEnd 9409784 MimeEntityBegin 9409784 MimeEntityHeadersEnd 9409884 -MimeContentBegin 9409884 -MimeContentEnd 9411100 Octets 1216 Lines 17 MimeEntityEnd 9411100 @@ -7635,7 +6212,6 @@ MultipartEndBoundaryBegin 9411102 MultipartEndBoundaryEnd 9411143 MultipartEpilogueBegin 9411143 MultipartEpilogueEnd 9411145 -MimeContentEnd 9411145 Octets 2952 Lines 73 MimeEntityEnd 9411145 @@ -7646,15 +6222,12 @@ MimeMessageBegin 9411180 MimeMessageHeadersEnd 9412276 MimeEntityBegin 9411180 MimeEntityHeadersEnd 9412276 -MimeContentBegin 9412276 MultipartPreambleBegin 9412276 MultipartPreambleEnd 9412278 MultipartBoundaryBegin 9412278 MultipartBoundaryEnd 9412321 MimeEntityBegin 9412321 MimeEntityHeadersEnd 9412394 -MimeContentBegin 9412394 -MimeContentEnd 9412553 Octets 159 Lines 8 MimeEntityEnd 9412553 @@ -7662,8 +6235,6 @@ MultipartBoundaryBegin 9412555 MultipartBoundaryEnd 9412598 MimeEntityBegin 9412598 MimeEntityHeadersEnd 9412680 -MimeContentBegin 9412680 -MimeContentEnd 9416832 Octets 4152 Lines 57 MimeEntityEnd 9416832 @@ -7671,7 +6242,6 @@ MultipartEndBoundaryBegin 9416834 MultipartEndBoundaryEnd 9416877 MultipartEpilogueBegin 9416877 MultipartEpilogueEnd 9416879 -MimeContentEnd 9416879 Octets 4603 Lines 76 MimeEntityEnd 9416879 @@ -7682,15 +6252,12 @@ MimeMessageBegin 9416890 MimeMessageHeadersEnd 9417456 MimeEntityBegin 9416890 MimeEntityHeadersEnd 9417456 -MimeContentBegin 9417456 MultipartPreambleBegin 9417456 MultipartPreambleEnd 9417458 MultipartBoundaryBegin 9417458 MultipartBoundaryEnd 9417502 MimeEntityBegin 9417502 MimeEntityHeadersEnd 9417569 -MimeContentBegin 9417569 -MimeContentEnd 9417727 Octets 158 Lines 4 MimeEntityEnd 9417727 @@ -7698,8 +6265,6 @@ MultipartBoundaryBegin 9417729 MultipartBoundaryEnd 9417773 MimeEntityBegin 9417773 MimeEntityHeadersEnd 9417928 -MimeContentBegin 9417928 -MimeContentEnd 9421898 Octets 3970 Lines 54 MimeEntityEnd 9421898 @@ -7707,7 +6272,6 @@ MultipartEndBoundaryBegin 9421900 MultipartEndBoundaryEnd 9421944 MultipartEpilogueBegin 9421944 MultipartEpilogueEnd 9421944 -MimeContentEnd 9421944 Octets 4488 Lines 69 MimeEntityEnd 9421944 @@ -7718,15 +6282,12 @@ MimeMessageBegin 9421979 MimeMessageHeadersEnd 9423163 MimeEntityBegin 9421979 MimeEntityHeadersEnd 9423163 -MimeContentBegin 9423163 MultipartPreambleBegin 9423163 MultipartPreambleEnd 9423303 MultipartBoundaryBegin 9423303 MultipartBoundaryEnd 9423344 MimeEntityBegin 9423344 MimeEntityHeadersEnd 9423425 -MimeContentBegin 9423425 -MimeContentEnd 9423502 Octets 77 Lines 6 MimeEntityEnd 9423502 @@ -7734,8 +6295,6 @@ MultipartBoundaryBegin 9423504 MultipartBoundaryEnd 9423545 MimeEntityBegin 9423545 MimeEntityHeadersEnd 9423643 -MimeContentBegin 9423643 -MimeContentEnd 9427249 Octets 3606 Lines 48 MimeEntityEnd 9427249 @@ -7743,7 +6302,6 @@ MultipartEndBoundaryBegin 9427251 MultipartEndBoundaryEnd 9427292 MultipartEpilogueBegin 9427292 MultipartEpilogueEnd 9427294 -MimeContentEnd 9427294 Octets 4131 Lines 67 MimeEntityEnd 9427294 @@ -7754,15 +6312,12 @@ MimeMessageBegin 9427329 MimeMessageHeadersEnd 9428452 MimeEntityBegin 9427329 MimeEntityHeadersEnd 9428452 -MimeContentBegin 9428452 MultipartPreambleBegin 9428452 MultipartPreambleEnd 9428454 MultipartBoundaryBegin 9428454 MultipartBoundaryEnd 9428488 MimeEntityBegin 9428488 MimeEntityHeadersEnd 9428569 -MimeContentBegin 9428569 -MimeContentEnd 9428647 Octets 78 Lines 5 MimeEntityEnd 9428647 @@ -7770,8 +6325,6 @@ MultipartBoundaryBegin 9428649 MultipartBoundaryEnd 9428683 MimeEntityBegin 9428683 MimeEntityHeadersEnd 9428765 -MimeContentBegin 9428765 -MimeContentEnd 9432539 Octets 3774 Lines 58 MimeEntityEnd 9432539 @@ -7779,7 +6332,6 @@ MultipartEndBoundaryBegin 9432541 MultipartEndBoundaryEnd 9432575 MultipartEpilogueBegin 9432575 MultipartEpilogueEnd 9432575 -MimeContentEnd 9432575 Octets 4123 Lines 73 MimeEntityEnd 9432575 @@ -7790,15 +6342,12 @@ MimeMessageBegin 9432610 MimeMessageHeadersEnd 9433755 MimeEntityBegin 9432610 MimeEntityHeadersEnd 9433755 -MimeContentBegin 9433755 MultipartPreambleBegin 9433755 MultipartPreambleEnd 9433872 MultipartBoundaryBegin 9433872 MultipartBoundaryEnd 9433897 MimeEntityBegin 9433897 MimeEntityHeadersEnd 9433938 -MimeContentBegin 9433938 -MimeContentEnd 9434132 Octets 194 Lines 7 MimeEntityEnd 9434132 @@ -7806,18 +6355,14 @@ MultipartBoundaryBegin 9434134 MultipartBoundaryEnd 9434159 MimeEntityBegin 9434159 MimeEntityHeadersEnd 9434191 -MimeContentBegin 9434191 MimeMessageBegin 9434191 MimeMessageHeadersEnd 9435012 MimeEntityBegin 9434191 MimeEntityHeadersEnd 9435012 -MimeContentBegin 9435012 -MimeContentEnd 9435023 Octets 11 Lines 1 MimeEntityEnd 9435023 MimeMessageEnd 9435023 -MimeContentEnd 9435023 Octets 832 Lines 16 MimeEntityEnd 9435023 @@ -7825,7 +6370,6 @@ MultipartEndBoundaryBegin 9435025 MultipartEndBoundaryEnd 9435050 MultipartEpilogueBegin 9435050 MultipartEpilogueEnd 9435052 -MimeContentEnd 9435052 Octets 1297 Lines 35 MimeEntityEnd 9435052 @@ -7836,8 +6380,6 @@ MimeMessageBegin 9435101 MimeMessageHeadersEnd 9435272 MimeEntityBegin 9435101 MimeEntityHeadersEnd 9435272 -MimeContentBegin 9435272 -MimeContentEnd 9470358 Octets 35086 Lines 593 MimeEntityEnd 9470358 @@ -7848,8 +6390,6 @@ MimeMessageBegin 9470407 MimeMessageHeadersEnd 9470571 MimeEntityBegin 9470407 MimeEntityHeadersEnd 9470571 -MimeContentBegin 9470571 -MimeContentEnd 9505657 Octets 35086 Lines 593 MimeEntityEnd 9505657 @@ -7860,8 +6400,6 @@ MimeMessageBegin 9505668 MimeMessageHeadersEnd 9506276 MimeEntityBegin 9505668 MimeEntityHeadersEnd 9506276 -MimeContentBegin 9506276 -MimeContentEnd 9507714 Octets 1438 Lines 39 MimeEntityEnd 9507714 @@ -7872,15 +6410,12 @@ MimeMessageBegin 9507725 MimeMessageHeadersEnd 9508642 MimeEntityBegin 9507725 MimeEntityHeadersEnd 9508642 -MimeContentBegin 9508642 MultipartPreambleBegin 9508642 MultipartPreambleEnd 9508642 MultipartBoundaryBegin 9508642 MultipartBoundaryEnd 9508682 MimeEntityBegin 9508682 MimeEntityHeadersEnd 9508710 -MimeContentBegin 9508710 -MimeContentEnd 9509065 Octets 355 Lines 11 MimeEntityEnd 9509065 @@ -7888,8 +6423,6 @@ MultipartBoundaryBegin 9509067 MultipartBoundaryEnd 9509107 MimeEntityBegin 9509107 MimeEntityHeadersEnd 9509204 -MimeContentBegin 9509204 -MimeContentEnd 9754734 Octets 245530 Lines 3962 MimeEntityEnd 9754734 @@ -7897,7 +6430,6 @@ MultipartEndBoundaryBegin 9754736 MultipartEndBoundaryEnd 9754776 MultipartEpilogueBegin 9754776 MultipartEpilogueEnd 9754778 -MimeContentEnd 9754778 Octets 246136 Lines 3983 MimeEntityEnd 9754778 @@ -7908,15 +6440,12 @@ MimeMessageBegin 9754789 MimeMessageHeadersEnd 9755397 MimeEntityBegin 9754789 MimeEntityHeadersEnd 9755397 -MimeContentBegin 9755397 MultipartPreambleBegin 9755397 MultipartPreambleEnd 9755433 MultipartBoundaryBegin 9755433 MultipartBoundaryEnd 9755461 MimeEntityBegin 9755461 MimeEntityHeadersEnd 9755625 -MimeContentBegin 9755625 -MimeContentEnd 9834319 Octets 78694 Lines 406 MimeEntityEnd 9834319 @@ -7924,7 +6453,6 @@ MultipartEndBoundaryBegin 9834321 MultipartEndBoundaryEnd 9834349 MultipartEpilogueBegin 9834349 MultipartEpilogueEnd 9834353 -MimeContentEnd 9834353 Octets 78956 Lines 417 MimeEntityEnd 9834353 @@ -7935,8 +6463,6 @@ MimeMessageBegin 9834364 MimeMessageHeadersEnd 9834521 MimeEntityBegin 9834364 MimeEntityHeadersEnd 9834521 -MimeContentBegin 9834521 -MimeContentEnd 9838129 Octets 3608 Lines 49 MimeEntityEnd 9838129 @@ -7947,15 +6473,12 @@ MimeMessageBegin 9838140 MimeMessageHeadersEnd 9838928 MimeEntityBegin 9838140 MimeEntityHeadersEnd 9838928 -MimeContentBegin 9838928 MultipartPreambleBegin 9838928 MultipartPreambleEnd 9839086 MultipartBoundaryBegin 9839086 MultipartBoundaryEnd 9839127 MimeEntityBegin 9839127 MimeEntityHeadersEnd 9839173 -MimeContentBegin 9839173 -MimeContentEnd 9839594 Octets 421 Lines 8 MimeEntityEnd 9839594 @@ -7963,15 +6486,12 @@ MultipartBoundaryBegin 9839596 MultipartBoundaryEnd 9839637 MimeEntityBegin 9839637 MimeEntityHeadersEnd 9839725 -MimeContentBegin 9839725 MultipartPreambleBegin 9839725 MultipartPreambleEnd 9839725 MultipartBoundaryBegin 9839725 MultipartBoundaryEnd 9839768 MimeEntityBegin 9839768 MimeEntityHeadersEnd 9839862 -MimeContentBegin 9839862 -MimeContentEnd 9839934 Octets 72 Lines 2 MimeEntityEnd 9839934 @@ -7979,8 +6499,6 @@ MultipartBoundaryBegin 9839936 MultipartBoundaryEnd 9839979 MimeEntityBegin 9839979 MimeEntityHeadersEnd 9840082 -MimeContentBegin 9840082 -MimeContentEnd 9850936 Octets 10854 Lines 158 MimeEntityEnd 9850936 @@ -7988,8 +6506,6 @@ MultipartBoundaryBegin 9850938 MultipartBoundaryEnd 9850981 MimeEntityBegin 9850981 MimeEntityHeadersEnd 9851075 -MimeContentBegin 9851075 -MimeContentEnd 9851141 Octets 66 Lines 3 MimeEntityEnd 9851141 @@ -7997,8 +6513,6 @@ MultipartBoundaryBegin 9851143 MultipartBoundaryEnd 9851186 MimeEntityBegin 9851186 MimeEntityHeadersEnd 9851283 -MimeContentBegin 9851283 -MimeContentEnd 9857273 Octets 5990 Lines 88 MimeEntityEnd 9857273 @@ -8006,8 +6520,6 @@ MultipartBoundaryBegin 9857275 MultipartBoundaryEnd 9857318 MimeEntityBegin 9857318 MimeEntityHeadersEnd 9857412 -MimeContentBegin 9857412 -MimeContentEnd 9857447 Octets 35 Lines 3 MimeEntityEnd 9857447 @@ -8015,8 +6527,6 @@ MultipartBoundaryBegin 9857449 MultipartBoundaryEnd 9857492 MimeEntityBegin 9857492 MimeEntityHeadersEnd 9857597 -MimeContentBegin 9857597 -MimeContentEnd 9869413 Octets 11816 Lines 171 MimeEntityEnd 9869413 @@ -8024,8 +6534,6 @@ MultipartBoundaryBegin 9869415 MultipartBoundaryEnd 9869458 MimeEntityBegin 9869458 MimeEntityHeadersEnd 9869552 -MimeContentBegin 9869552 -MimeContentEnd 9869585 Octets 33 Lines 3 MimeEntityEnd 9869585 @@ -8033,7 +6541,6 @@ MultipartEndBoundaryBegin 9869587 MultipartEndBoundaryEnd 9869630 MultipartEpilogueBegin 9869630 MultipartEpilogueEnd 9869632 -MimeContentEnd 9869632 Octets 29907 Lines 461 MimeEntityEnd 9869632 @@ -8041,7 +6548,6 @@ MultipartEndBoundaryBegin 9869634 MultipartEndBoundaryEnd 9869675 MultipartEpilogueBegin 9869675 MultipartEpilogueEnd 9869675 -MimeContentEnd 9869675 Octets 30747 Lines 480 MimeEntityEnd 9869675 @@ -8052,8 +6558,6 @@ MimeMessageBegin 9869686 MimeMessageHeadersEnd 9869745 MimeEntityBegin 9869686 MimeEntityHeadersEnd 9869745 -MimeContentBegin 9869745 -MimeContentEnd 9870980 Octets 1235 Lines 28 MimeEntityEnd 9870980 @@ -8064,8 +6568,6 @@ MimeMessageBegin 9871015 MimeMessageHeadersEnd 9871171 MimeEntityBegin 9871015 MimeEntityHeadersEnd 9871171 -MimeContentBegin 9871171 -MimeContentEnd 9874346 Octets 3175 Lines 68 MimeEntityEnd 9874346 @@ -8076,15 +6578,12 @@ MimeMessageBegin 9874381 MimeMessageHeadersEnd 9876277 MimeEntityBegin 9874381 MimeEntityHeadersEnd 9876277 -MimeContentBegin 9876277 MultipartPreambleBegin 9876277 MultipartPreambleEnd 9876277 MultipartBoundaryBegin 9876277 MultipartBoundaryEnd 9876322 MimeEntityBegin 9876322 MimeEntityHeadersEnd 9876403 -MimeContentBegin 9876403 -MimeContentEnd 9877284 Octets 881 Lines 19 MimeEntityEnd 9877284 @@ -8092,8 +6591,6 @@ MultipartBoundaryBegin 9877286 MultipartBoundaryEnd 9877331 MimeEntityBegin 9877331 MimeEntityHeadersEnd 9877497 -MimeContentBegin 9877497 -MimeContentEnd 9881199 Octets 3702 Lines 62 MimeEntityEnd 9881199 @@ -8101,7 +6598,6 @@ MultipartEndBoundaryBegin 9881201 MultipartEndBoundaryEnd 9881246 MultipartEpilogueBegin 9881246 MultipartEpilogueEnd 9881248 -MimeContentEnd 9881248 Octets 4971 Lines 93 MimeEntityEnd 9881248 @@ -8112,15 +6608,12 @@ MimeMessageBegin 9881259 MimeMessageHeadersEnd 9881826 MimeEntityBegin 9881259 MimeEntityHeadersEnd 9881826 -MimeContentBegin 9881826 MultipartPreambleBegin 9881826 MultipartPreambleEnd 9881828 MultipartBoundaryBegin 9881828 MultipartBoundaryEnd 9881845 MimeEntityBegin 9881845 MimeEntityHeadersEnd 9881874 -MimeContentBegin 9881874 -MimeContentEnd 9882856 Octets 982 Lines 20 MimeEntityEnd 9882856 @@ -8128,8 +6621,6 @@ MultipartBoundaryBegin 9882858 MultipartBoundaryEnd 9882875 MimeEntityBegin 9882875 MimeEntityHeadersEnd 9882938 -MimeContentBegin 9882938 -MimeContentEnd 10000250 Octets 117312 Lines 1587 MimeEntityEnd 10000250 @@ -8137,7 +6628,6 @@ MultipartEndBoundaryBegin 10000252 MultipartEndBoundaryEnd 10000269 MultipartEpilogueBegin 10000269 MultipartEpilogueEnd 10000273 -MimeContentEnd 10000273 Octets 118447 Lines 1618 MimeEntityEnd 10000273 @@ -8148,15 +6638,12 @@ MimeMessageBegin 10000284 MimeMessageHeadersEnd 10001099 MimeEntityBegin 10000284 MimeEntityHeadersEnd 10001099 -MimeContentBegin 10001099 MultipartPreambleBegin 10001099 MultipartPreambleEnd 10001257 MultipartBoundaryBegin 10001257 MultipartBoundaryEnd 10001298 MimeEntityBegin 10001298 MimeEntityHeadersEnd 10001344 -MimeContentBegin 10001344 -MimeContentEnd 10010656 Octets 9312 Lines 350 MimeEntityEnd 10010656 @@ -8164,15 +6651,12 @@ MultipartBoundaryBegin 10010658 MultipartBoundaryEnd 10010699 MimeEntityBegin 10010699 MimeEntityHeadersEnd 10010787 -MimeContentBegin 10010787 MultipartPreambleBegin 10010787 MultipartPreambleEnd 10010787 MultipartBoundaryBegin 10010787 MultipartBoundaryEnd 10010830 MimeEntityBegin 10010830 MimeEntityHeadersEnd 10010924 -MimeContentBegin 10010924 -MimeContentEnd 10013768 Octets 2844 Lines 70 MimeEntityEnd 10013768 @@ -8180,18 +6664,14 @@ MultipartBoundaryBegin 10013770 MultipartBoundaryEnd 10013813 MimeEntityBegin 10013813 MimeEntityHeadersEnd 10014016 -MimeContentBegin 10014016 MimeMessageBegin 10014016 MimeMessageHeadersEnd 10014045 MimeEntityBegin 10014016 MimeEntityHeadersEnd 10014045 -MimeContentBegin 10014045 -MimeContentEnd 10014049 Octets 4 Lines 3 MimeEntityEnd 10014049 MimeMessageEnd 10014049 -MimeContentEnd 10014049 Octets 33 Lines 5 MimeEntityEnd 10014049 @@ -8199,8 +6679,6 @@ MultipartBoundaryBegin 10014051 MultipartBoundaryEnd 10014094 MimeEntityBegin 10014094 MimeEntityHeadersEnd 10014188 -MimeContentBegin 10014188 -MimeContentEnd 10015184 Octets 996 Lines 23 MimeEntityEnd 10015184 @@ -8208,8 +6686,6 @@ MultipartBoundaryBegin 10015186 MultipartBoundaryEnd 10015229 MimeEntityBegin 10015229 MimeEntityHeadersEnd 10015349 -MimeContentBegin 10015349 -MimeContentEnd 10015723 Octets 374 Lines 16 MimeEntityEnd 10015723 @@ -8217,8 +6693,6 @@ MultipartBoundaryBegin 10015725 MultipartBoundaryEnd 10015768 MimeEntityBegin 10015768 MimeEntityHeadersEnd 10015862 -MimeContentBegin 10015862 -MimeContentEnd 10015874 Octets 12 Lines 3 MimeEntityEnd 10015874 @@ -8226,18 +6700,14 @@ MultipartBoundaryBegin 10015876 MultipartBoundaryEnd 10015919 MimeEntityBegin 10015919 MimeEntityHeadersEnd 10016110 -MimeContentBegin 10016110 MimeMessageBegin 10016110 MimeMessageHeadersEnd 10016139 MimeEntityBegin 10016110 MimeEntityHeadersEnd 10016139 -MimeContentBegin 10016139 -MimeContentEnd 10016141 Octets 2 Lines 2 MimeEntityEnd 10016141 MimeMessageEnd 10016141 -MimeContentEnd 10016141 Octets 31 Lines 4 MimeEntityEnd 10016141 @@ -8245,8 +6715,6 @@ MultipartBoundaryBegin 10016143 MultipartBoundaryEnd 10016186 MimeEntityBegin 10016186 MimeEntityHeadersEnd 10016280 -MimeContentBegin 10016280 -MimeContentEnd 10016292 Octets 12 Lines 3 MimeEntityEnd 10016292 @@ -8254,8 +6722,6 @@ MultipartBoundaryBegin 10016294 MultipartBoundaryEnd 10016337 MimeEntityBegin 10016337 MimeEntityHeadersEnd 10016447 -MimeContentBegin 10016447 -MimeContentEnd 10019473 Octets 3026 Lines 44 MimeEntityEnd 10019473 @@ -8263,8 +6729,6 @@ MultipartBoundaryBegin 10019475 MultipartBoundaryEnd 10019518 MimeEntityBegin 10019518 MimeEntityHeadersEnd 10019612 -MimeContentBegin 10019612 -MimeContentEnd 10026464 Octets 6852 Lines 261 MimeEntityEnd 10026464 @@ -8272,7 +6736,6 @@ MultipartEndBoundaryBegin 10026466 MultipartEndBoundaryEnd 10026509 MultipartEpilogueBegin 10026509 MultipartEpilogueEnd 10026511 -MimeContentEnd 10026511 Octets 15724 Lines 476 MimeEntityEnd 10026511 @@ -8280,7 +6743,6 @@ MultipartEndBoundaryBegin 10026513 MultipartEndBoundaryEnd 10026554 MultipartEpilogueBegin 10026554 MultipartEpilogueEnd 10026556 -MimeContentEnd 10026556 Octets 25457 Lines 838 MimeEntityEnd 10026556 @@ -8291,15 +6753,12 @@ MimeMessageBegin 10026567 MimeMessageHeadersEnd 10027702 MimeEntityBegin 10026567 MimeEntityHeadersEnd 10027702 -MimeContentBegin 10027702 MultipartPreambleBegin 10027702 MultipartPreambleEnd 10027702 MultipartBoundaryBegin 10027702 MultipartBoundaryEnd 10027713 MimeEntityBegin 10027713 MimeEntityHeadersEnd 10027715 -MimeContentBegin 10027715 -MimeContentEnd 10028056 Octets 341 Lines 9 MimeEntityEnd 10028056 @@ -8307,8 +6766,6 @@ MultipartBoundaryBegin 10028058 MultipartBoundaryEnd 10028069 MimeEntityBegin 10028069 MimeEntityHeadersEnd 10028131 -MimeContentBegin 10028131 -MimeContentEnd 10058521 Octets 30390 Lines 412 MimeEntityEnd 10058521 @@ -8316,8 +6773,6 @@ MultipartBoundaryBegin 10058523 MultipartBoundaryEnd 10058534 MimeEntityBegin 10058534 MimeEntityHeadersEnd 10058536 -MimeContentBegin 10058536 -MimeContentEnd 10058717 Octets 181 Lines 10 MimeEntityEnd 10058717 @@ -8325,7 +6780,6 @@ MultipartEndBoundaryBegin 10058719 MultipartEndBoundaryEnd 10058730 MultipartEpilogueBegin 10058730 MultipartEpilogueEnd 10058732 -MimeContentEnd 10058732 Octets 31030 Lines 441 MimeEntityEnd 10058732 @@ -8336,8 +6790,6 @@ MimeMessageBegin 10058743 MimeMessageHeadersEnd 10060481 MimeEntityBegin 10058743 MimeEntityHeadersEnd 10060481 -MimeContentBegin 10060481 -MimeContentEnd 10246231 Octets 185750 Lines 2952 MimeEntityEnd 10246231 @@ -8348,15 +6800,12 @@ MimeMessageBegin 10246242 MimeMessageHeadersEnd 10246965 MimeEntityBegin 10246242 MimeEntityHeadersEnd 10246965 -MimeContentBegin 10246965 MultipartPreambleBegin 10246965 MultipartPreambleEnd 10246965 MultipartBoundaryBegin 10246965 MultipartBoundaryEnd 10246993 MimeEntityBegin 10246993 MimeEntityHeadersEnd 10246995 -MimeContentBegin 10246995 -MimeContentEnd 10247016 Octets 21 Lines 1 MimeEntityEnd 10247016 @@ -8364,8 +6813,6 @@ MultipartBoundaryBegin 10247018 MultipartBoundaryEnd 10247046 MimeEntityBegin 10247046 MimeEntityHeadersEnd 10247203 -MimeContentBegin 10247203 -MimeContentEnd 10331377 Octets 84174 Lines 434 MimeEntityEnd 10331377 @@ -8373,8 +6820,6 @@ MultipartBoundaryBegin 10331379 MultipartBoundaryEnd 10331407 MimeEntityBegin 10331407 MimeEntityHeadersEnd 10331409 -MimeContentBegin 10331409 -MimeContentEnd 10331676 Octets 267 Lines 9 MimeEntityEnd 10331676 @@ -8382,7 +6827,6 @@ MultipartEndBoundaryBegin 10331678 MultipartEndBoundaryEnd 10331706 MultipartEpilogueBegin 10331706 MultipartEpilogueEnd 10331708 -MimeContentEnd 10331708 Octets 84743 Lines 456 MimeEntityEnd 10331708 @@ -8393,15 +6837,12 @@ MimeMessageBegin 10331719 MimeMessageHeadersEnd 10332401 MimeEntityBegin 10331719 MimeEntityHeadersEnd 10332401 -MimeContentBegin 10332401 MultipartPreambleBegin 10332401 MultipartPreambleEnd 10332401 MultipartBoundaryBegin 10332401 MultipartBoundaryEnd 10332429 MimeEntityBegin 10332429 MimeEntityHeadersEnd 10332431 -MimeContentBegin 10332431 -MimeContentEnd 10332497 Octets 66 Lines 1 MimeEntityEnd 10332497 @@ -8409,8 +6850,6 @@ MultipartBoundaryBegin 10332499 MultipartBoundaryEnd 10332527 MimeEntityBegin 10332527 MimeEntityHeadersEnd 10332693 -MimeContentBegin 10332693 -MimeContentEnd 10365025 Octets 32332 Lines 167 MimeEntityEnd 10365025 @@ -8418,8 +6857,6 @@ MultipartBoundaryBegin 10365027 MultipartBoundaryEnd 10365055 MimeEntityBegin 10365055 MimeEntityHeadersEnd 10365057 -MimeContentBegin 10365057 -MimeContentEnd 10365075 Octets 18 Lines 2 MimeEntityEnd 10365075 @@ -8427,8 +6864,6 @@ MultipartBoundaryBegin 10365077 MultipartBoundaryEnd 10365105 MimeEntityBegin 10365105 MimeEntityHeadersEnd 10365269 -MimeContentBegin 10365269 -MimeContentEnd 10366359 Octets 1090 Lines 6 MimeEntityEnd 10366359 @@ -8436,8 +6871,6 @@ MultipartBoundaryBegin 10366361 MultipartBoundaryEnd 10366389 MimeEntityBegin 10366389 MimeEntityHeadersEnd 10366391 -MimeContentBegin 10366391 -MimeContentEnd 10366423 Octets 32 Lines 3 MimeEntityEnd 10366423 @@ -8445,8 +6878,6 @@ MultipartBoundaryBegin 10366425 MultipartBoundaryEnd 10366453 MimeEntityBegin 10366453 MimeEntityHeadersEnd 10366524 -MimeContentBegin 10366524 -MimeContentEnd 10554551 Octets 188027 Lines 1991 MimeEntityEnd 10554551 @@ -8454,8 +6885,6 @@ MultipartBoundaryBegin 10554553 MultipartBoundaryEnd 10554581 MimeEntityBegin 10554581 MimeEntityHeadersEnd 10554583 -MimeContentBegin 10554583 -MimeContentEnd 10554591 Octets 8 Lines 1 MimeEntityEnd 10554591 @@ -8463,7 +6892,6 @@ MultipartEndBoundaryBegin 10554593 MultipartEndBoundaryEnd 10554621 MultipartEpilogueBegin 10554621 MultipartEpilogueEnd 10554623 -MimeContentEnd 10554623 Octets 222222 Lines 2197 MimeEntityEnd 10554623 @@ -8474,8 +6902,6 @@ MimeMessageBegin 10554634 MimeMessageHeadersEnd 10554906 MimeEntityBegin 10554634 MimeEntityHeadersEnd 10554906 -MimeContentBegin 10554906 -MimeContentEnd 10630586 Octets 75680 Lines 1023 MimeEntityEnd 10630586 @@ -8486,15 +6912,12 @@ MimeMessageBegin 10630597 MimeMessageHeadersEnd 10631896 MimeEntityBegin 10630597 MimeEntityHeadersEnd 10631896 -MimeContentBegin 10631896 MultipartPreambleBegin 10631896 MultipartPreambleEnd 10632430 MultipartBoundaryBegin 10632430 MultipartBoundaryEnd 10632489 MimeEntityBegin 10632489 MimeEntityHeadersEnd 10632491 -MimeContentBegin 10632491 -MimeContentEnd 10634372 Octets 1881 Lines 35 MimeEntityEnd 10634372 @@ -8502,15 +6925,12 @@ MultipartBoundaryBegin 10634374 MultipartBoundaryEnd 10634433 MimeEntityBegin 10634433 MimeEntityHeadersEnd 10634539 -MimeContentBegin 10634539 MultipartPreambleBegin 10634539 MultipartPreambleEnd 10634539 MultipartBoundaryBegin 10634539 MultipartBoundaryEnd 10634600 MimeEntityBegin 10634600 MimeEntityHeadersEnd 10634676 -MimeContentBegin 10634676 -MimeContentEnd 10636704 Octets 2028 Lines 30 MimeEntityEnd 10636704 @@ -8518,8 +6938,6 @@ MultipartBoundaryBegin 10636706 MultipartBoundaryEnd 10636767 MimeEntityBegin 10636767 MimeEntityHeadersEnd 10636829 -MimeContentBegin 10636829 -MimeContentEnd 10644867 Octets 8038 Lines 110 MimeEntityEnd 10644867 @@ -8527,8 +6945,6 @@ MultipartBoundaryBegin 10644869 MultipartBoundaryEnd 10644930 MimeEntityBegin 10644930 MimeEntityHeadersEnd 10645003 -MimeContentBegin 10645003 -MimeContentEnd 10645008 Octets 5 Lines 3 MimeEntityEnd 10645008 @@ -8536,8 +6952,6 @@ MultipartBoundaryBegin 10645010 MultipartBoundaryEnd 10645071 MimeEntityBegin 10645071 MimeEntityHeadersEnd 10645168 -MimeContentBegin 10645168 -MimeContentEnd 10687620 Octets 42452 Lines 575 MimeEntityEnd 10687620 @@ -8545,7 +6959,6 @@ MultipartEndBoundaryBegin 10687622 MultipartEndBoundaryEnd 10687683 MultipartEpilogueBegin 10687683 MultipartEpilogueEnd 10687685 -MimeContentEnd 10687685 Octets 53146 Lines 737 MimeEntityEnd 10687685 @@ -8553,7 +6966,6 @@ MultipartEndBoundaryBegin 10687687 MultipartEndBoundaryEnd 10687746 MultipartEpilogueBegin 10687746 MultipartEpilogueEnd 10687748 -MimeContentEnd 10687748 Octets 55852 Lines 788 MimeEntityEnd 10687748 @@ -8564,8 +6976,6 @@ MimeMessageBegin 10687759 MimeMessageHeadersEnd 10687916 MimeEntityBegin 10687759 MimeEntityHeadersEnd 10687916 -MimeContentBegin 10687916 -MimeContentEnd 10692786 Octets 4870 Lines 68 MimeEntityEnd 10692786 @@ -8576,15 +6986,12 @@ MimeMessageBegin 10692797 MimeMessageHeadersEnd 10693559 MimeEntityBegin 10692797 MimeEntityHeadersEnd 10693559 -MimeContentBegin 10693559 MultipartPreambleBegin 10693559 MultipartPreambleEnd 10693904 MultipartBoundaryBegin 10693904 MultipartBoundaryEnd 10693945 MimeEntityBegin 10693945 MimeEntityHeadersEnd 10693947 -MimeContentBegin 10693947 -MimeContentEnd 10694323 Octets 376 Lines 9 MimeEntityEnd 10694323 @@ -8592,15 +6999,12 @@ MultipartBoundaryBegin 10694325 MultipartBoundaryEnd 10694366 MimeEntityBegin 10694366 MimeEntityHeadersEnd 10694454 -MimeContentBegin 10694454 MultipartPreambleBegin 10694454 MultipartPreambleEnd 10694454 MultipartBoundaryBegin 10694454 MultipartBoundaryEnd 10694497 MimeEntityBegin 10694497 MimeEntityHeadersEnd 10694570 -MimeContentBegin 10694570 -MimeContentEnd 10694663 Octets 93 Lines 5 MimeEntityEnd 10694663 @@ -8608,8 +7012,6 @@ MultipartBoundaryBegin 10694665 MultipartBoundaryEnd 10694708 MimeEntityBegin 10694708 MimeEntityHeadersEnd 10694826 -MimeContentBegin 10694826 -MimeContentEnd 10700572 Octets 5746 Lines 84 MimeEntityEnd 10700572 @@ -8617,8 +7019,6 @@ MultipartBoundaryBegin 10700574 MultipartBoundaryEnd 10700617 MimeEntityBegin 10700617 MimeEntityHeadersEnd 10700690 -MimeContentBegin 10700690 -MimeContentEnd 10700899 Octets 209 Lines 7 MimeEntityEnd 10700899 @@ -8626,7 +7026,6 @@ MultipartEndBoundaryBegin 10700901 MultipartEndBoundaryEnd 10700944 MultipartEpilogueBegin 10700944 MultipartEpilogueEnd 10700946 -MimeContentEnd 10700946 Octets 6492 Lines 111 MimeEntityEnd 10700946 @@ -8634,7 +7033,6 @@ MultipartEndBoundaryBegin 10700948 MultipartEndBoundaryEnd 10700989 MultipartEpilogueBegin 10700989 MultipartEpilogueEnd 10700991 -MimeContentEnd 10700989 Octets 7430 Lines 133 MimeEntityEnd 10700989 From 79961931169ee3c611ffd63c6cebf87d6a2aa379 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 21:24:28 -0400 Subject: [PATCH 640/741] Reordered some MimeParser offset notifications OnMimeMessageBegin OnMimeEntityBegin OnMimeEntityHeadersEnd OnMimeMessageHeadersEnd This makes the offsets flow more sequentially. --- MimeKit/AsyncMimeParser.cs | 2 +- MimeKit/MimeParser.cs | 2 +- .../mbox/content-length.dos-offsets.txt | 30 +-- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 244 +++++++++--------- 4 files changed, 139 insertions(+), 139 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 69df9b0ef0..5804ea97f1 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -348,9 +348,9 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio message.Body = entity; OnMimeMessageBegin (message, headerBlockBegin); - OnMimeMessageHeadersEnd (message, headerBlockEnd); OnMimeEntityBegin (entity, headerBlockBegin); OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeMessageHeadersEnd (message, headerBlockEnd); if (entity is Multipart) await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 5ef1c14325..0052a29aea 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1585,9 +1585,9 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca message.Body = entity; OnMimeMessageBegin (message, headerBlockBegin); - OnMimeMessageHeadersEnd (message, headerBlockEnd); OnMimeEntityBegin (entity, headerBlockBegin); OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeMessageHeadersEnd (message, headerBlockEnd); if (entity is Multipart) ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index aad0733ffd..0ee89e77de 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -18,9 +18,9 @@ MultipartBoundaryEnd 883 MimeEntityBegin 883 MimeEntityHeadersEnd 948 MimeMessageBegin 948 -MimeMessageHeadersEnd 1747 MimeEntityBegin 948 MimeEntityHeadersEnd 1747 +MimeMessageHeadersEnd 1747 Octets 140 Lines 4 MimeEntityEnd 1887 @@ -49,9 +49,9 @@ MultipartBoundaryEnd 2506 MimeEntityBegin 2506 MimeEntityHeadersEnd 2655 MimeMessageBegin 2655 -MimeMessageHeadersEnd 3095 MimeEntityBegin 2655 MimeEntityHeadersEnd 3095 +MimeMessageHeadersEnd 3095 Octets 39 Lines 3 MimeEntityEnd 3134 @@ -92,9 +92,9 @@ MultipartBoundaryEnd 5792 MimeEntityBegin 5792 MimeEntityHeadersEnd 5941 MimeMessageBegin 5941 -MimeMessageHeadersEnd 6381 MimeEntityBegin 5941 MimeEntityHeadersEnd 6381 +MimeMessageHeadersEnd 6381 Octets 38 Lines 2 MimeEntityEnd 6419 @@ -107,17 +107,17 @@ MultipartBoundaryEnd 6449 MimeEntityBegin 6449 MimeEntityHeadersEnd 6625 MimeMessageBegin 6625 -MimeMessageHeadersEnd 7210 MimeEntityBegin 6625 MimeEntityHeadersEnd 7210 +MimeMessageHeadersEnd 7210 MimeMessageBegin 7210 -MimeMessageHeadersEnd 7735 MimeEntityBegin 7210 MimeEntityHeadersEnd 7735 +MimeMessageHeadersEnd 7735 MimeMessageBegin 7735 -MimeMessageHeadersEnd 8156 MimeEntityBegin 7735 MimeEntityHeadersEnd 8156 +MimeMessageHeadersEnd 8156 Octets 6 Lines 2 MimeEntityEnd 8162 @@ -161,9 +161,9 @@ MultipartBoundaryEnd 8901 MimeEntityBegin 8901 MimeEntityHeadersEnd 9054 MimeMessageBegin 9054 -MimeMessageHeadersEnd 9493 MimeEntityBegin 9054 MimeEntityHeadersEnd 9493 +MimeMessageHeadersEnd 9493 Octets 39 Lines 3 MimeEntityEnd 9532 @@ -204,9 +204,9 @@ MultipartBoundaryEnd 12206 MimeEntityBegin 12206 MimeEntityHeadersEnd 12359 MimeMessageBegin 12359 -MimeMessageHeadersEnd 12798 MimeEntityBegin 12359 MimeEntityHeadersEnd 12798 +MimeMessageHeadersEnd 12798 Octets 38 Lines 2 MimeEntityEnd 12836 @@ -219,17 +219,17 @@ MultipartBoundaryEnd 12866 MimeEntityBegin 12866 MimeEntityHeadersEnd 13046 MimeMessageBegin 13046 -MimeMessageHeadersEnd 13634 MimeEntityBegin 13046 MimeEntityHeadersEnd 13634 +MimeMessageHeadersEnd 13634 MimeMessageBegin 13634 -MimeMessageHeadersEnd 14162 MimeEntityBegin 13634 MimeEntityHeadersEnd 14162 +MimeMessageHeadersEnd 14162 MimeMessageBegin 14162 -MimeMessageHeadersEnd 14582 MimeEntityBegin 14162 MimeEntityHeadersEnd 14582 +MimeMessageHeadersEnd 14582 Octets 6 Lines 2 MimeEntityEnd 14588 @@ -310,9 +310,9 @@ MultipartBoundaryEnd 24547 MimeEntityBegin 24547 MimeEntityHeadersEnd 24641 MimeMessageBegin 24641 -MimeMessageHeadersEnd 25478 MimeEntityBegin 24641 MimeEntityHeadersEnd 25478 +MimeMessageHeadersEnd 25478 MultipartPreambleBegin 25478 MultipartPreambleEnd 25480 MultipartBoundaryBegin 25480 @@ -629,9 +629,9 @@ MimeMessageHeadersEnd 882097 MimeEntityBegin 881295 MimeEntityHeadersEnd 882097 MimeMessageBegin 882097 -MimeMessageHeadersEnd 883500 MimeEntityBegin 882097 MimeEntityHeadersEnd 883500 +MimeMessageHeadersEnd 883500 Octets 1452 Lines 21 MimeEntityEnd 884952 @@ -660,9 +660,9 @@ MultipartBoundaryEnd 885915 MimeEntityBegin 885915 MimeEntityHeadersEnd 886073 MimeMessageBegin 886073 -MimeMessageHeadersEnd 887476 MimeEntityBegin 886073 MimeEntityHeadersEnd 887476 +MimeMessageHeadersEnd 887476 Octets 1452 Lines 21 MimeEntityEnd 888928 @@ -925,9 +925,9 @@ MultipartBoundaryEnd 941044 MimeEntityBegin 941044 MimeEntityHeadersEnd 941076 MimeMessageBegin 941076 -MimeMessageHeadersEnd 941897 MimeEntityBegin 941076 MimeEntityHeadersEnd 941897 +MimeMessageHeadersEnd 941897 Octets 11 Lines 1 MimeEntityEnd 941908 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index c79afbac3c..49c625dd13 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -186,9 +186,9 @@ MultipartBoundaryEnd 327980 MimeEntityBegin 327980 MimeEntityHeadersEnd 328012 MimeMessageBegin 328012 -MimeMessageHeadersEnd 328864 MimeEntityBegin 328012 MimeEntityHeadersEnd 328864 +MimeMessageHeadersEnd 328864 MultipartPreambleBegin 328864 MultipartPreambleEnd 329148 MultipartBoundaryBegin 329148 @@ -728,9 +728,9 @@ MimeMessageHeadersEnd 3666630 MimeEntityBegin 3666057 MimeEntityHeadersEnd 3666630 MimeMessageBegin 3666630 -MimeMessageHeadersEnd 3666692 MimeEntityBegin 3666630 MimeEntityHeadersEnd 3666692 +MimeMessageHeadersEnd 3666692 Octets 540 Lines 14 MimeEntityEnd 3667232 @@ -789,9 +789,9 @@ MultipartBoundaryEnd 3670507 MimeEntityBegin 3670507 MimeEntityHeadersEnd 3670539 MimeMessageBegin 3670539 -MimeMessageHeadersEnd 3671342 MimeEntityBegin 3670539 MimeEntityHeadersEnd 3671342 +MimeMessageHeadersEnd 3671342 Octets 3425 Lines 73 MimeEntityEnd 3674767 @@ -827,9 +827,9 @@ MultipartBoundaryEnd 3675696 MimeEntityBegin 3675696 MimeEntityHeadersEnd 3675761 MimeMessageBegin 3675761 -MimeMessageHeadersEnd 3676560 MimeEntityBegin 3675761 MimeEntityHeadersEnd 3676560 +MimeMessageHeadersEnd 3676560 Octets 140 Lines 4 MimeEntityEnd 3676700 @@ -962,17 +962,17 @@ MimeMessageHeadersEnd 3965889 MimeEntityBegin 3965274 MimeEntityHeadersEnd 3965889 MimeMessageBegin 3965889 -MimeMessageHeadersEnd 3966475 MimeEntityBegin 3965889 MimeEntityHeadersEnd 3966475 +MimeMessageHeadersEnd 3966475 MimeMessageBegin 3966475 -MimeMessageHeadersEnd 3967033 MimeEntityBegin 3966475 MimeEntityHeadersEnd 3967033 +MimeMessageHeadersEnd 3967033 MimeMessageBegin 3967033 -MimeMessageHeadersEnd 3967597 MimeEntityBegin 3967033 MimeEntityHeadersEnd 3967597 +MimeMessageHeadersEnd 3967597 MultipartPreambleBegin 3967597 MultipartPreambleEnd 3967645 MultipartBoundaryBegin 3967645 @@ -987,9 +987,9 @@ MultipartBoundaryEnd 3967894 MimeEntityBegin 3967894 MimeEntityHeadersEnd 3967959 MimeMessageBegin 3967959 -MimeMessageHeadersEnd 3968475 MimeEntityBegin 3967959 MimeEntityHeadersEnd 3968475 +MimeMessageHeadersEnd 3968475 MultipartPreambleBegin 3968475 MultipartPreambleEnd 3968523 MultipartBoundaryBegin 3968523 @@ -1235,9 +1235,9 @@ MultipartBoundaryEnd 4258616 MimeEntityBegin 4258616 MimeEntityHeadersEnd 4258736 MimeMessageBegin 4258736 -MimeMessageHeadersEnd 4258816 MimeEntityBegin 4258736 MimeEntityHeadersEnd 4258816 +MimeMessageHeadersEnd 4258816 Octets 69 Lines 3 MimeEntityEnd 4258885 @@ -1250,9 +1250,9 @@ MultipartBoundaryEnd 4258902 MimeEntityBegin 4258902 MimeEntityHeadersEnd 4259095 MimeMessageBegin 4259095 -MimeMessageHeadersEnd 4259175 MimeEntityBegin 4259095 MimeEntityHeadersEnd 4259175 +MimeMessageHeadersEnd 4259175 Octets 0 Lines 0 MimeEntityEnd 4259173 @@ -1265,9 +1265,9 @@ MultipartBoundaryEnd 4259190 MimeEntityBegin 4259190 MimeEntityHeadersEnd 4259332 MimeMessageBegin 4259332 -MimeMessageHeadersEnd 4259403 MimeEntityBegin 4259332 MimeEntityHeadersEnd 4259403 +MimeMessageHeadersEnd 4259403 Octets 0 Lines 0 MimeEntityEnd 4259401 @@ -1280,9 +1280,9 @@ MultipartBoundaryEnd 4259418 MimeEntityBegin 4259418 MimeEntityHeadersEnd 4259535 MimeMessageBegin 4259535 -MimeMessageHeadersEnd 4259607 MimeEntityBegin 4259535 MimeEntityHeadersEnd 4259607 +MimeMessageHeadersEnd 4259607 Octets 0 Lines 0 MimeEntityEnd 4259605 @@ -1295,9 +1295,9 @@ MultipartBoundaryEnd 4259622 MimeEntityBegin 4259622 MimeEntityHeadersEnd 4259731 MimeMessageBegin 4259731 -MimeMessageHeadersEnd 4259803 MimeEntityBegin 4259731 MimeEntityHeadersEnd 4259803 +MimeMessageHeadersEnd 4259803 Octets 0 Lines 0 MimeEntityEnd 4259801 @@ -1346,9 +1346,9 @@ MultipartBoundaryEnd 4263802 MimeEntityBegin 4263802 MimeEntityHeadersEnd 4263922 MimeMessageBegin 4263922 -MimeMessageHeadersEnd 4264002 MimeEntityBegin 4263922 MimeEntityHeadersEnd 4264002 +MimeMessageHeadersEnd 4264002 Octets 69 Lines 3 MimeEntityEnd 4264071 @@ -1361,9 +1361,9 @@ MultipartBoundaryEnd 4264088 MimeEntityBegin 4264088 MimeEntityHeadersEnd 4264281 MimeMessageBegin 4264281 -MimeMessageHeadersEnd 4264361 MimeEntityBegin 4264281 MimeEntityHeadersEnd 4264361 +MimeMessageHeadersEnd 4264361 Octets 0 Lines 0 MimeEntityEnd 4264359 @@ -1399,9 +1399,9 @@ MultipartBoundaryEnd 4264961 MimeEntityBegin 4264961 MimeEntityHeadersEnd 4265110 MimeMessageBegin 4265110 -MimeMessageHeadersEnd 4265550 MimeEntityBegin 4265110 MimeEntityHeadersEnd 4265550 +MimeMessageHeadersEnd 4265550 Octets 39 Lines 3 MimeEntityEnd 4265589 @@ -1442,9 +1442,9 @@ MultipartBoundaryEnd 4268247 MimeEntityBegin 4268247 MimeEntityHeadersEnd 4268396 MimeMessageBegin 4268396 -MimeMessageHeadersEnd 4268836 MimeEntityBegin 4268396 MimeEntityHeadersEnd 4268836 +MimeMessageHeadersEnd 4268836 Octets 38 Lines 2 MimeEntityEnd 4268874 @@ -1457,17 +1457,17 @@ MultipartBoundaryEnd 4268904 MimeEntityBegin 4268904 MimeEntityHeadersEnd 4269080 MimeMessageBegin 4269080 -MimeMessageHeadersEnd 4269665 MimeEntityBegin 4269080 MimeEntityHeadersEnd 4269665 +MimeMessageHeadersEnd 4269665 MimeMessageBegin 4269665 -MimeMessageHeadersEnd 4270190 MimeEntityBegin 4269665 MimeEntityHeadersEnd 4270190 +MimeMessageHeadersEnd 4270190 MimeMessageBegin 4270190 -MimeMessageHeadersEnd 4270611 MimeEntityBegin 4270190 MimeEntityHeadersEnd 4270611 +MimeMessageHeadersEnd 4270611 Octets 6 Lines 2 MimeEntityEnd 4270617 @@ -1511,9 +1511,9 @@ MultipartBoundaryEnd 4271356 MimeEntityBegin 4271356 MimeEntityHeadersEnd 4271509 MimeMessageBegin 4271509 -MimeMessageHeadersEnd 4271948 MimeEntityBegin 4271509 MimeEntityHeadersEnd 4271948 +MimeMessageHeadersEnd 4271948 Octets 39 Lines 3 MimeEntityEnd 4271987 @@ -1554,9 +1554,9 @@ MultipartBoundaryEnd 4274661 MimeEntityBegin 4274661 MimeEntityHeadersEnd 4274814 MimeMessageBegin 4274814 -MimeMessageHeadersEnd 4275253 MimeEntityBegin 4274814 MimeEntityHeadersEnd 4275253 +MimeMessageHeadersEnd 4275253 Octets 38 Lines 2 MimeEntityEnd 4275291 @@ -1569,17 +1569,17 @@ MultipartBoundaryEnd 4275321 MimeEntityBegin 4275321 MimeEntityHeadersEnd 4275501 MimeMessageBegin 4275501 -MimeMessageHeadersEnd 4276089 MimeEntityBegin 4275501 MimeEntityHeadersEnd 4276089 +MimeMessageHeadersEnd 4276089 MimeMessageBegin 4276089 -MimeMessageHeadersEnd 4276617 MimeEntityBegin 4276089 MimeEntityHeadersEnd 4276617 +MimeMessageHeadersEnd 4276617 MimeMessageBegin 4276617 -MimeMessageHeadersEnd 4277037 MimeEntityBegin 4276617 MimeEntityHeadersEnd 4277037 +MimeMessageHeadersEnd 4277037 Octets 6 Lines 2 MimeEntityEnd 4277043 @@ -1651,9 +1651,9 @@ MultipartBoundaryEnd 4279276 MimeEntityBegin 4279276 MimeEntityHeadersEnd 4279308 MimeMessageBegin 4279308 -MimeMessageHeadersEnd 4279530 MimeEntityBegin 4279308 MimeEntityHeadersEnd 4279530 +MimeMessageHeadersEnd 4279530 MultipartPreambleBegin 4279530 MultipartPreambleEnd 4279530 MultipartBoundaryBegin 4279530 @@ -1713,9 +1713,9 @@ MultipartBoundaryEnd 4297883 MimeEntityBegin 4297883 MimeEntityHeadersEnd 4297885 MimeMessageBegin 4297885 -MimeMessageHeadersEnd 4297914 MimeEntityBegin 4297885 MimeEntityHeadersEnd 4297914 +MimeMessageHeadersEnd 4297914 Octets 5 Lines 1 MimeEntityEnd 4297919 @@ -1728,9 +1728,9 @@ MultipartBoundaryEnd 4297932 MimeEntityBegin 4297932 MimeEntityHeadersEnd 4297934 MimeMessageBegin 4297934 -MimeMessageHeadersEnd 4297963 MimeEntityBegin 4297934 MimeEntityHeadersEnd 4297963 +MimeMessageHeadersEnd 4297963 Octets 5 Lines 1 MimeEntityEnd 4297968 @@ -1743,9 +1743,9 @@ MultipartBoundaryEnd 4297981 MimeEntityBegin 4297981 MimeEntityHeadersEnd 4297983 MimeMessageBegin 4297983 -MimeMessageHeadersEnd 4298012 MimeEntityBegin 4297983 MimeEntityHeadersEnd 4298012 +MimeMessageHeadersEnd 4298012 Octets 5 Lines 1 MimeEntityEnd 4298017 @@ -1765,9 +1765,9 @@ MultipartBoundaryEnd 4298153 MimeEntityBegin 4298153 MimeEntityHeadersEnd 4298155 MimeMessageBegin 4298155 -MimeMessageHeadersEnd 4298213 MimeEntityBegin 4298155 MimeEntityHeadersEnd 4298213 +MimeMessageHeadersEnd 4298213 Octets 49 Lines 1 MimeEntityEnd 4298262 @@ -1780,9 +1780,9 @@ MultipartBoundaryEnd 4298275 MimeEntityBegin 4298275 MimeEntityHeadersEnd 4298277 MimeMessageBegin 4298277 -MimeMessageHeadersEnd 4298306 MimeEntityBegin 4298277 MimeEntityHeadersEnd 4298306 +MimeMessageHeadersEnd 4298306 Octets 5 Lines 1 MimeEntityEnd 4298311 @@ -1995,9 +1995,9 @@ MultipartBoundaryEnd 4765551 MimeEntityBegin 4765551 MimeEntityHeadersEnd 4765640 MimeMessageBegin 4765640 -MimeMessageHeadersEnd 4765713 MimeEntityBegin 4765640 MimeEntityHeadersEnd 4765713 +MimeMessageHeadersEnd 4765713 Octets 0 Lines 0 MimeEntityEnd 4765711 @@ -2017,9 +2017,9 @@ MultipartBoundaryEnd 4766120 MimeEntityBegin 4766120 MimeEntityHeadersEnd 4766273 MimeMessageBegin 4766273 -MimeMessageHeadersEnd 4766346 MimeEntityBegin 4766273 MimeEntityHeadersEnd 4766346 +MimeMessageHeadersEnd 4766346 Octets 0 Lines 0 MimeEntityEnd 4766344 @@ -2401,9 +2401,9 @@ MultipartBoundaryEnd 5521998 MimeEntityBegin 5521998 MimeEntityHeadersEnd 5522000 MimeMessageBegin 5522000 -MimeMessageHeadersEnd 5522109 MimeEntityBegin 5522000 MimeEntityHeadersEnd 5522109 +MimeMessageHeadersEnd 5522109 Octets 639 Lines 19 MimeEntityEnd 5522748 @@ -2416,9 +2416,9 @@ MultipartBoundaryEnd 5522782 MimeEntityBegin 5522782 MimeEntityHeadersEnd 5522784 MimeMessageBegin 5522784 -MimeMessageHeadersEnd 5522909 MimeEntityBegin 5522784 MimeEntityHeadersEnd 5522909 +MimeMessageHeadersEnd 5522909 Octets 753 Lines 21 MimeEntityEnd 5523662 @@ -2431,9 +2431,9 @@ MultipartBoundaryEnd 5523696 MimeEntityBegin 5523696 MimeEntityHeadersEnd 5523698 MimeMessageBegin 5523698 -MimeMessageHeadersEnd 5523821 MimeEntityBegin 5523698 MimeEntityHeadersEnd 5523821 +MimeMessageHeadersEnd 5523821 Octets 660 Lines 15 MimeEntityEnd 5524481 @@ -2446,9 +2446,9 @@ MultipartBoundaryEnd 5524515 MimeEntityBegin 5524515 MimeEntityHeadersEnd 5524517 MimeMessageBegin 5524517 -MimeMessageHeadersEnd 5524677 MimeEntityBegin 5524517 MimeEntityHeadersEnd 5524677 +MimeMessageHeadersEnd 5524677 Octets 493 Lines 11 MimeEntityEnd 5525170 @@ -2461,9 +2461,9 @@ MultipartBoundaryEnd 5525204 MimeEntityBegin 5525204 MimeEntityHeadersEnd 5525206 MimeMessageBegin 5525206 -MimeMessageHeadersEnd 5525364 MimeEntityBegin 5525206 MimeEntityHeadersEnd 5525364 +MimeMessageHeadersEnd 5525364 Octets 587 Lines 16 MimeEntityEnd 5525951 @@ -2476,9 +2476,9 @@ MultipartBoundaryEnd 5525985 MimeEntityBegin 5525985 MimeEntityHeadersEnd 5525987 MimeMessageBegin 5525987 -MimeMessageHeadersEnd 5526148 MimeEntityBegin 5525987 MimeEntityHeadersEnd 5526148 +MimeMessageHeadersEnd 5526148 Octets 1301 Lines 27 MimeEntityEnd 5527449 @@ -2491,9 +2491,9 @@ MultipartBoundaryEnd 5527483 MimeEntityBegin 5527483 MimeEntityHeadersEnd 5527485 MimeMessageBegin 5527485 -MimeMessageHeadersEnd 5527642 MimeEntityBegin 5527485 MimeEntityHeadersEnd 5527642 +MimeMessageHeadersEnd 5527642 Octets 410 Lines 10 MimeEntityEnd 5528052 @@ -2506,9 +2506,9 @@ MultipartBoundaryEnd 5528086 MimeEntityBegin 5528086 MimeEntityHeadersEnd 5528088 MimeMessageBegin 5528088 -MimeMessageHeadersEnd 5528239 MimeEntityBegin 5528088 MimeEntityHeadersEnd 5528239 +MimeMessageHeadersEnd 5528239 Octets 403 Lines 8 MimeEntityEnd 5528642 @@ -2521,9 +2521,9 @@ MultipartBoundaryEnd 5528676 MimeEntityBegin 5528676 MimeEntityHeadersEnd 5528678 MimeMessageBegin 5528678 -MimeMessageHeadersEnd 5528825 MimeEntityBegin 5528678 MimeEntityHeadersEnd 5528825 +MimeMessageHeadersEnd 5528825 Octets 651 Lines 12 MimeEntityEnd 5529476 @@ -2536,9 +2536,9 @@ MultipartBoundaryEnd 5529510 MimeEntityBegin 5529510 MimeEntityHeadersEnd 5529512 MimeMessageBegin 5529512 -MimeMessageHeadersEnd 5529653 MimeEntityBegin 5529512 MimeEntityHeadersEnd 5529653 +MimeMessageHeadersEnd 5529653 Octets 996 Lines 20 MimeEntityEnd 5530649 @@ -2551,9 +2551,9 @@ MultipartBoundaryEnd 5530683 MimeEntityBegin 5530683 MimeEntityHeadersEnd 5530685 MimeMessageBegin 5530685 -MimeMessageHeadersEnd 5530836 MimeEntityBegin 5530685 MimeEntityHeadersEnd 5530836 +MimeMessageHeadersEnd 5530836 Octets 917 Lines 28 MimeEntityEnd 5531753 @@ -2566,9 +2566,9 @@ MultipartBoundaryEnd 5531787 MimeEntityBegin 5531787 MimeEntityHeadersEnd 5531789 MimeMessageBegin 5531789 -MimeMessageHeadersEnd 5531924 MimeEntityBegin 5531789 MimeEntityHeadersEnd 5531924 +MimeMessageHeadersEnd 5531924 Octets 570 Lines 12 MimeEntityEnd 5532494 @@ -2581,9 +2581,9 @@ MultipartBoundaryEnd 5532528 MimeEntityBegin 5532528 MimeEntityHeadersEnd 5532530 MimeMessageBegin 5532530 -MimeMessageHeadersEnd 5532666 MimeEntityBegin 5532530 MimeEntityHeadersEnd 5532666 +MimeMessageHeadersEnd 5532666 Octets 447 Lines 11 MimeEntityEnd 5533113 @@ -2596,9 +2596,9 @@ MultipartBoundaryEnd 5533147 MimeEntityBegin 5533147 MimeEntityHeadersEnd 5533149 MimeMessageBegin 5533149 -MimeMessageHeadersEnd 5533270 MimeEntityBegin 5533149 MimeEntityHeadersEnd 5533270 +MimeMessageHeadersEnd 5533270 Octets 567 Lines 16 MimeEntityEnd 5533837 @@ -2611,9 +2611,9 @@ MultipartBoundaryEnd 5533871 MimeEntityBegin 5533871 MimeEntityHeadersEnd 5533873 MimeMessageBegin 5533873 -MimeMessageHeadersEnd 5533992 MimeEntityBegin 5533873 MimeEntityHeadersEnd 5533992 +MimeMessageHeadersEnd 5533992 Octets 193 Lines 9 MimeEntityEnd 5534185 @@ -2626,9 +2626,9 @@ MultipartBoundaryEnd 5534219 MimeEntityBegin 5534219 MimeEntityHeadersEnd 5534221 MimeMessageBegin 5534221 -MimeMessageHeadersEnd 5534342 MimeEntityBegin 5534221 MimeEntityHeadersEnd 5534342 +MimeMessageHeadersEnd 5534342 Octets 335 Lines 8 MimeEntityEnd 5534677 @@ -2641,9 +2641,9 @@ MultipartBoundaryEnd 5534711 MimeEntityBegin 5534711 MimeEntityHeadersEnd 5534713 MimeMessageBegin 5534713 -MimeMessageHeadersEnd 5534840 MimeEntityBegin 5534713 MimeEntityHeadersEnd 5534840 +MimeMessageHeadersEnd 5534840 Octets 688 Lines 22 MimeEntityEnd 5535528 @@ -2656,9 +2656,9 @@ MultipartBoundaryEnd 5535562 MimeEntityBegin 5535562 MimeEntityHeadersEnd 5535564 MimeMessageBegin 5535564 -MimeMessageHeadersEnd 5535692 MimeEntityBegin 5535564 MimeEntityHeadersEnd 5535692 +MimeMessageHeadersEnd 5535692 Octets 107 Lines 6 MimeEntityEnd 5535799 @@ -2671,9 +2671,9 @@ MultipartBoundaryEnd 5535833 MimeEntityBegin 5535833 MimeEntityHeadersEnd 5535835 MimeMessageBegin 5535835 -MimeMessageHeadersEnd 5535981 MimeEntityBegin 5535835 MimeEntityHeadersEnd 5535981 +MimeMessageHeadersEnd 5535981 Octets 857 Lines 22 MimeEntityEnd 5536838 @@ -2686,9 +2686,9 @@ MultipartBoundaryEnd 5536872 MimeEntityBegin 5536872 MimeEntityHeadersEnd 5536874 MimeMessageBegin 5536874 -MimeMessageHeadersEnd 5536988 MimeEntityBegin 5536874 MimeEntityHeadersEnd 5536988 +MimeMessageHeadersEnd 5536988 Octets 428 Lines 10 MimeEntityEnd 5537416 @@ -2701,9 +2701,9 @@ MultipartBoundaryEnd 5537450 MimeEntityBegin 5537450 MimeEntityHeadersEnd 5537452 MimeMessageBegin 5537452 -MimeMessageHeadersEnd 5537628 MimeEntityBegin 5537452 MimeEntityHeadersEnd 5537628 +MimeMessageHeadersEnd 5537628 Octets 239 Lines 10 MimeEntityEnd 5537867 @@ -2716,9 +2716,9 @@ MultipartBoundaryEnd 5537901 MimeEntityBegin 5537901 MimeEntityHeadersEnd 5537903 MimeMessageBegin 5537903 -MimeMessageHeadersEnd 5538033 MimeEntityBegin 5537903 MimeEntityHeadersEnd 5538033 +MimeMessageHeadersEnd 5538033 Octets 411 Lines 13 MimeEntityEnd 5538444 @@ -2731,9 +2731,9 @@ MultipartBoundaryEnd 5538478 MimeEntityBegin 5538478 MimeEntityHeadersEnd 5538480 MimeMessageBegin 5538480 -MimeMessageHeadersEnd 5538601 MimeEntityBegin 5538480 MimeEntityHeadersEnd 5538601 +MimeMessageHeadersEnd 5538601 Octets 932 Lines 29 MimeEntityEnd 5539533 @@ -2746,9 +2746,9 @@ MultipartBoundaryEnd 5539567 MimeEntityBegin 5539567 MimeEntityHeadersEnd 5539569 MimeMessageBegin 5539569 -MimeMessageHeadersEnd 5539701 MimeEntityBegin 5539569 MimeEntityHeadersEnd 5539701 +MimeMessageHeadersEnd 5539701 Octets 300 Lines 10 MimeEntityEnd 5540001 @@ -2761,9 +2761,9 @@ MultipartBoundaryEnd 5540035 MimeEntityBegin 5540035 MimeEntityHeadersEnd 5540037 MimeMessageBegin 5540037 -MimeMessageHeadersEnd 5540170 MimeEntityBegin 5540037 MimeEntityHeadersEnd 5540170 +MimeMessageHeadersEnd 5540170 Octets 424 Lines 15 MimeEntityEnd 5540594 @@ -2776,9 +2776,9 @@ MultipartBoundaryEnd 5540628 MimeEntityBegin 5540628 MimeEntityHeadersEnd 5540630 MimeMessageBegin 5540630 -MimeMessageHeadersEnd 5540749 MimeEntityBegin 5540630 MimeEntityHeadersEnd 5540749 +MimeMessageHeadersEnd 5540749 Octets 149 Lines 5 MimeEntityEnd 5540898 @@ -2791,9 +2791,9 @@ MultipartBoundaryEnd 5540932 MimeEntityBegin 5540932 MimeEntityHeadersEnd 5540934 MimeMessageBegin 5540934 -MimeMessageHeadersEnd 5541063 MimeEntityBegin 5540934 MimeEntityHeadersEnd 5541063 +MimeMessageHeadersEnd 5541063 Octets 186 Lines 8 MimeEntityEnd 5541249 @@ -2806,9 +2806,9 @@ MultipartBoundaryEnd 5541283 MimeEntityBegin 5541283 MimeEntityHeadersEnd 5541285 MimeMessageBegin 5541285 -MimeMessageHeadersEnd 5541419 MimeEntityBegin 5541285 MimeEntityHeadersEnd 5541419 +MimeMessageHeadersEnd 5541419 Octets 730 Lines 15 MimeEntityEnd 5542149 @@ -2821,9 +2821,9 @@ MultipartBoundaryEnd 5542183 MimeEntityBegin 5542183 MimeEntityHeadersEnd 5542185 MimeMessageBegin 5542185 -MimeMessageHeadersEnd 5542335 MimeEntityBegin 5542185 MimeEntityHeadersEnd 5542335 +MimeMessageHeadersEnd 5542335 Octets 983 Lines 27 MimeEntityEnd 5543318 @@ -2836,9 +2836,9 @@ MultipartBoundaryEnd 5543352 MimeEntityBegin 5543352 MimeEntityHeadersEnd 5543354 MimeMessageBegin 5543354 -MimeMessageHeadersEnd 5543492 MimeEntityBegin 5543354 MimeEntityHeadersEnd 5543492 +MimeMessageHeadersEnd 5543492 Octets 254 Lines 8 MimeEntityEnd 5543746 @@ -2851,9 +2851,9 @@ MultipartBoundaryEnd 5543780 MimeEntityBegin 5543780 MimeEntityHeadersEnd 5543782 MimeMessageBegin 5543782 -MimeMessageHeadersEnd 5543908 MimeEntityBegin 5543782 MimeEntityHeadersEnd 5543908 +MimeMessageHeadersEnd 5543908 Octets 133 Lines 7 MimeEntityEnd 5544041 @@ -2866,9 +2866,9 @@ MultipartBoundaryEnd 5544075 MimeEntityBegin 5544075 MimeEntityHeadersEnd 5544077 MimeMessageBegin 5544077 -MimeMessageHeadersEnd 5544257 MimeEntityBegin 5544077 MimeEntityHeadersEnd 5544257 +MimeMessageHeadersEnd 5544257 Octets 761 Lines 17 MimeEntityEnd 5545018 @@ -2881,9 +2881,9 @@ MultipartBoundaryEnd 5545052 MimeEntityBegin 5545052 MimeEntityHeadersEnd 5545054 MimeMessageBegin 5545054 -MimeMessageHeadersEnd 5545218 MimeEntityBegin 5545054 MimeEntityHeadersEnd 5545218 +MimeMessageHeadersEnd 5545218 Octets 415 Lines 17 MimeEntityEnd 5545633 @@ -2896,9 +2896,9 @@ MultipartBoundaryEnd 5545667 MimeEntityBegin 5545667 MimeEntityHeadersEnd 5545669 MimeMessageBegin 5545669 -MimeMessageHeadersEnd 5545805 MimeEntityBegin 5545669 MimeEntityHeadersEnd 5545805 +MimeMessageHeadersEnd 5545805 Octets 1308 Lines 22 MimeEntityEnd 5547113 @@ -2911,9 +2911,9 @@ MultipartBoundaryEnd 5547147 MimeEntityBegin 5547147 MimeEntityHeadersEnd 5547149 MimeMessageBegin 5547149 -MimeMessageHeadersEnd 5547259 MimeEntityBegin 5547149 MimeEntityHeadersEnd 5547259 +MimeMessageHeadersEnd 5547259 Octets 149 Lines 7 MimeEntityEnd 5547408 @@ -2926,9 +2926,9 @@ MultipartBoundaryEnd 5547442 MimeEntityBegin 5547442 MimeEntityHeadersEnd 5547444 MimeMessageBegin 5547444 -MimeMessageHeadersEnd 5547585 MimeEntityBegin 5547444 MimeEntityHeadersEnd 5547585 +MimeMessageHeadersEnd 5547585 Octets 310 Lines 12 MimeEntityEnd 5547895 @@ -2941,9 +2941,9 @@ MultipartBoundaryEnd 5547929 MimeEntityBegin 5547929 MimeEntityHeadersEnd 5547931 MimeMessageBegin 5547931 -MimeMessageHeadersEnd 5548061 MimeEntityBegin 5547931 MimeEntityHeadersEnd 5548061 +MimeMessageHeadersEnd 5548061 Octets 193 Lines 7 MimeEntityEnd 5548254 @@ -2956,9 +2956,9 @@ MultipartBoundaryEnd 5548288 MimeEntityBegin 5548288 MimeEntityHeadersEnd 5548290 MimeMessageBegin 5548290 -MimeMessageHeadersEnd 5548399 MimeEntityBegin 5548290 MimeEntityHeadersEnd 5548399 +MimeMessageHeadersEnd 5548399 Octets 410 Lines 13 MimeEntityEnd 5548809 @@ -2971,9 +2971,9 @@ MultipartBoundaryEnd 5548843 MimeEntityBegin 5548843 MimeEntityHeadersEnd 5548845 MimeMessageBegin 5548845 -MimeMessageHeadersEnd 5548983 MimeEntityBegin 5548845 MimeEntityHeadersEnd 5548983 +MimeMessageHeadersEnd 5548983 Octets 310 Lines 9 MimeEntityEnd 5549293 @@ -2986,9 +2986,9 @@ MultipartBoundaryEnd 5549327 MimeEntityBegin 5549327 MimeEntityHeadersEnd 5549329 MimeMessageBegin 5549329 -MimeMessageHeadersEnd 5549476 MimeEntityBegin 5549329 MimeEntityHeadersEnd 5549476 +MimeMessageHeadersEnd 5549476 Octets 635 Lines 18 MimeEntityEnd 5550111 @@ -3001,9 +3001,9 @@ MultipartBoundaryEnd 5550145 MimeEntityBegin 5550145 MimeEntityHeadersEnd 5550147 MimeMessageBegin 5550147 -MimeMessageHeadersEnd 5550304 MimeEntityBegin 5550147 MimeEntityHeadersEnd 5550304 +MimeMessageHeadersEnd 5550304 Octets 485 Lines 11 MimeEntityEnd 5550789 @@ -3016,9 +3016,9 @@ MultipartBoundaryEnd 5550823 MimeEntityBegin 5550823 MimeEntityHeadersEnd 5550825 MimeMessageBegin 5550825 -MimeMessageHeadersEnd 5550962 MimeEntityBegin 5550825 MimeEntityHeadersEnd 5550962 +MimeMessageHeadersEnd 5550962 Octets 1199 Lines 28 MimeEntityEnd 5552161 @@ -3031,9 +3031,9 @@ MultipartBoundaryEnd 5552195 MimeEntityBegin 5552195 MimeEntityHeadersEnd 5552197 MimeMessageBegin 5552197 -MimeMessageHeadersEnd 5552377 MimeEntityBegin 5552197 MimeEntityHeadersEnd 5552377 +MimeMessageHeadersEnd 5552377 Octets 267 Lines 9 MimeEntityEnd 5552644 @@ -3046,9 +3046,9 @@ MultipartBoundaryEnd 5552678 MimeEntityBegin 5552678 MimeEntityHeadersEnd 5552680 MimeMessageBegin 5552680 -MimeMessageHeadersEnd 5552799 MimeEntityBegin 5552680 MimeEntityHeadersEnd 5552799 +MimeMessageHeadersEnd 5552799 Octets 197 Lines 5 MimeEntityEnd 5552996 @@ -3061,9 +3061,9 @@ MultipartBoundaryEnd 5553030 MimeEntityBegin 5553030 MimeEntityHeadersEnd 5553032 MimeMessageBegin 5553032 -MimeMessageHeadersEnd 5553176 MimeEntityBegin 5553032 MimeEntityHeadersEnd 5553176 +MimeMessageHeadersEnd 5553176 Octets 889 Lines 25 MimeEntityEnd 5554065 @@ -3076,9 +3076,9 @@ MultipartBoundaryEnd 5554099 MimeEntityBegin 5554099 MimeEntityHeadersEnd 5554101 MimeMessageBegin 5554101 -MimeMessageHeadersEnd 5554230 MimeEntityBegin 5554101 MimeEntityHeadersEnd 5554230 +MimeMessageHeadersEnd 5554230 Octets 725 Lines 12 MimeEntityEnd 5554955 @@ -3091,9 +3091,9 @@ MultipartBoundaryEnd 5554989 MimeEntityBegin 5554989 MimeEntityHeadersEnd 5554991 MimeMessageBegin 5554991 -MimeMessageHeadersEnd 5555107 MimeEntityBegin 5554991 MimeEntityHeadersEnd 5555107 +MimeMessageHeadersEnd 5555107 Octets 720 Lines 18 MimeEntityEnd 5555827 @@ -3106,9 +3106,9 @@ MultipartBoundaryEnd 5555861 MimeEntityBegin 5555861 MimeEntityHeadersEnd 5555863 MimeMessageBegin 5555863 -MimeMessageHeadersEnd 5555999 MimeEntityBegin 5555863 MimeEntityHeadersEnd 5555999 +MimeMessageHeadersEnd 5555999 Octets 391 Lines 12 MimeEntityEnd 5556390 @@ -3121,9 +3121,9 @@ MultipartBoundaryEnd 5556424 MimeEntityBegin 5556424 MimeEntityHeadersEnd 5556426 MimeMessageBegin 5556426 -MimeMessageHeadersEnd 5556566 MimeEntityBegin 5556426 MimeEntityHeadersEnd 5556566 +MimeMessageHeadersEnd 5556566 Octets 1001 Lines 25 MimeEntityEnd 5557567 @@ -3136,9 +3136,9 @@ MultipartBoundaryEnd 5557601 MimeEntityBegin 5557601 MimeEntityHeadersEnd 5557603 MimeMessageBegin 5557603 -MimeMessageHeadersEnd 5557752 MimeEntityBegin 5557603 MimeEntityHeadersEnd 5557752 +MimeMessageHeadersEnd 5557752 Octets 477 Lines 11 MimeEntityEnd 5558229 @@ -3151,9 +3151,9 @@ MultipartBoundaryEnd 5558263 MimeEntityBegin 5558263 MimeEntityHeadersEnd 5558265 MimeMessageBegin 5558265 -MimeMessageHeadersEnd 5558402 MimeEntityBegin 5558265 MimeEntityHeadersEnd 5558402 +MimeMessageHeadersEnd 5558402 Octets 289 Lines 11 MimeEntityEnd 5558691 @@ -3166,9 +3166,9 @@ MultipartBoundaryEnd 5558725 MimeEntityBegin 5558725 MimeEntityHeadersEnd 5558727 MimeMessageBegin 5558727 -MimeMessageHeadersEnd 5558856 MimeEntityBegin 5558727 MimeEntityHeadersEnd 5558856 +MimeMessageHeadersEnd 5558856 Octets 286 Lines 5 MimeEntityEnd 5559142 @@ -3181,9 +3181,9 @@ MultipartBoundaryEnd 5559176 MimeEntityBegin 5559176 MimeEntityHeadersEnd 5559178 MimeMessageBegin 5559178 -MimeMessageHeadersEnd 5559303 MimeEntityBegin 5559178 MimeEntityHeadersEnd 5559303 +MimeMessageHeadersEnd 5559303 Octets 670 Lines 28 MimeEntityEnd 5559973 @@ -3196,9 +3196,9 @@ MultipartBoundaryEnd 5560007 MimeEntityBegin 5560007 MimeEntityHeadersEnd 5560009 MimeMessageBegin 5560009 -MimeMessageHeadersEnd 5560157 MimeEntityBegin 5560009 MimeEntityHeadersEnd 5560157 +MimeMessageHeadersEnd 5560157 Octets 2304 Lines 47 MimeEntityEnd 5562461 @@ -3211,9 +3211,9 @@ MultipartBoundaryEnd 5562495 MimeEntityBegin 5562495 MimeEntityHeadersEnd 5562497 MimeMessageBegin 5562497 -MimeMessageHeadersEnd 5562623 MimeEntityBegin 5562497 MimeEntityHeadersEnd 5562623 +MimeMessageHeadersEnd 5562623 Octets 809 Lines 18 MimeEntityEnd 5563432 @@ -3226,9 +3226,9 @@ MultipartBoundaryEnd 5563466 MimeEntityBegin 5563466 MimeEntityHeadersEnd 5563468 MimeMessageBegin 5563468 -MimeMessageHeadersEnd 5563566 MimeEntityBegin 5563468 MimeEntityHeadersEnd 5563566 +MimeMessageHeadersEnd 5563566 Octets 236 Lines 11 MimeEntityEnd 5563802 @@ -3241,9 +3241,9 @@ MultipartBoundaryEnd 5563836 MimeEntityBegin 5563836 MimeEntityHeadersEnd 5563838 MimeMessageBegin 5563838 -MimeMessageHeadersEnd 5563963 MimeEntityBegin 5563838 MimeEntityHeadersEnd 5563963 +MimeMessageHeadersEnd 5563963 Octets 688 Lines 21 MimeEntityEnd 5564651 @@ -3256,9 +3256,9 @@ MultipartBoundaryEnd 5564685 MimeEntityBegin 5564685 MimeEntityHeadersEnd 5564687 MimeMessageBegin 5564687 -MimeMessageHeadersEnd 5564801 MimeEntityBegin 5564687 MimeEntityHeadersEnd 5564801 +MimeMessageHeadersEnd 5564801 Octets 2615 Lines 69 MimeEntityEnd 5567416 @@ -3271,9 +3271,9 @@ MultipartBoundaryEnd 5567450 MimeEntityBegin 5567450 MimeEntityHeadersEnd 5567452 MimeMessageBegin 5567452 -MimeMessageHeadersEnd 5567562 MimeEntityBegin 5567452 MimeEntityHeadersEnd 5567562 +MimeMessageHeadersEnd 5567562 Octets 1243 Lines 35 MimeEntityEnd 5568805 @@ -3286,9 +3286,9 @@ MultipartBoundaryEnd 5568839 MimeEntityBegin 5568839 MimeEntityHeadersEnd 5568841 MimeMessageBegin 5568841 -MimeMessageHeadersEnd 5568951 MimeEntityBegin 5568841 MimeEntityHeadersEnd 5568951 +MimeMessageHeadersEnd 5568951 Octets 1840 Lines 44 MimeEntityEnd 5570791 @@ -3301,9 +3301,9 @@ MultipartBoundaryEnd 5570825 MimeEntityBegin 5570825 MimeEntityHeadersEnd 5570827 MimeMessageBegin 5570827 -MimeMessageHeadersEnd 5570960 MimeEntityBegin 5570827 MimeEntityHeadersEnd 5570960 +MimeMessageHeadersEnd 5570960 Octets 582 Lines 13 MimeEntityEnd 5571542 @@ -3316,9 +3316,9 @@ MultipartBoundaryEnd 5571576 MimeEntityBegin 5571576 MimeEntityHeadersEnd 5571578 MimeMessageBegin 5571578 -MimeMessageHeadersEnd 5571670 MimeEntityBegin 5571578 MimeEntityHeadersEnd 5571670 +MimeMessageHeadersEnd 5571670 Octets 1354 Lines 21 MimeEntityEnd 5573024 @@ -3331,9 +3331,9 @@ MultipartBoundaryEnd 5573058 MimeEntityBegin 5573058 MimeEntityHeadersEnd 5573060 MimeMessageBegin 5573060 -MimeMessageHeadersEnd 5573180 MimeEntityBegin 5573060 MimeEntityHeadersEnd 5573180 +MimeMessageHeadersEnd 5573180 Octets 2176 Lines 50 MimeEntityEnd 5575356 @@ -3346,9 +3346,9 @@ MultipartBoundaryEnd 5575390 MimeEntityBegin 5575390 MimeEntityHeadersEnd 5575392 MimeMessageBegin 5575392 -MimeMessageHeadersEnd 5575517 MimeEntityBegin 5575392 MimeEntityHeadersEnd 5575517 +MimeMessageHeadersEnd 5575517 Octets 2063 Lines 43 MimeEntityEnd 5577580 @@ -3361,9 +3361,9 @@ MultipartBoundaryEnd 5577614 MimeEntityBegin 5577614 MimeEntityHeadersEnd 5577616 MimeMessageBegin 5577616 -MimeMessageHeadersEnd 5577741 MimeEntityBegin 5577616 MimeEntityHeadersEnd 5577741 +MimeMessageHeadersEnd 5577741 Octets 696 Lines 20 MimeEntityEnd 5578437 @@ -3376,9 +3376,9 @@ MultipartBoundaryEnd 5578471 MimeEntityBegin 5578471 MimeEntityHeadersEnd 5578473 MimeMessageBegin 5578473 -MimeMessageHeadersEnd 5578614 MimeEntityBegin 5578473 MimeEntityHeadersEnd 5578614 +MimeMessageHeadersEnd 5578614 Octets 836 Lines 17 MimeEntityEnd 5579450 @@ -3391,9 +3391,9 @@ MultipartBoundaryEnd 5579484 MimeEntityBegin 5579484 MimeEntityHeadersEnd 5579486 MimeMessageBegin 5579486 -MimeMessageHeadersEnd 5579614 MimeEntityBegin 5579486 MimeEntityHeadersEnd 5579614 +MimeMessageHeadersEnd 5579614 Octets 745 Lines 22 MimeEntityEnd 5580359 @@ -3406,9 +3406,9 @@ MultipartBoundaryEnd 5580393 MimeEntityBegin 5580393 MimeEntityHeadersEnd 5580395 MimeMessageBegin 5580395 -MimeMessageHeadersEnd 5580501 MimeEntityBegin 5580395 MimeEntityHeadersEnd 5580501 +MimeMessageHeadersEnd 5580501 Octets 756 Lines 17 MimeEntityEnd 5581257 @@ -3421,9 +3421,9 @@ MultipartBoundaryEnd 5581291 MimeEntityBegin 5581291 MimeEntityHeadersEnd 5581293 MimeMessageBegin 5581293 -MimeMessageHeadersEnd 5581454 MimeEntityBegin 5581293 MimeEntityHeadersEnd 5581454 +MimeMessageHeadersEnd 5581454 Octets 366 Lines 8 MimeEntityEnd 5581820 @@ -3436,9 +3436,9 @@ MultipartBoundaryEnd 5581854 MimeEntityBegin 5581854 MimeEntityHeadersEnd 5581856 MimeMessageBegin 5581856 -MimeMessageHeadersEnd 5581947 MimeEntityBegin 5581856 MimeEntityHeadersEnd 5581947 +MimeMessageHeadersEnd 5581947 Octets 650 Lines 16 MimeEntityEnd 5582597 @@ -3451,9 +3451,9 @@ MultipartBoundaryEnd 5582631 MimeEntityBegin 5582631 MimeEntityHeadersEnd 5582633 MimeMessageBegin 5582633 -MimeMessageHeadersEnd 5582786 MimeEntityBegin 5582633 MimeEntityHeadersEnd 5582786 +MimeMessageHeadersEnd 5582786 Octets 383 Lines 18 MimeEntityEnd 5583169 @@ -3466,9 +3466,9 @@ MultipartBoundaryEnd 5583203 MimeEntityBegin 5583203 MimeEntityHeadersEnd 5583205 MimeMessageBegin 5583205 -MimeMessageHeadersEnd 5583310 MimeEntityBegin 5583205 MimeEntityHeadersEnd 5583310 +MimeMessageHeadersEnd 5583310 Octets 294 Lines 7 MimeEntityEnd 5583604 @@ -3481,9 +3481,9 @@ MultipartBoundaryEnd 5583638 MimeEntityBegin 5583638 MimeEntityHeadersEnd 5583640 MimeMessageBegin 5583640 -MimeMessageHeadersEnd 5583772 MimeEntityBegin 5583640 MimeEntityHeadersEnd 5583772 +MimeMessageHeadersEnd 5583772 Octets 495 Lines 17 MimeEntityEnd 5584267 @@ -3496,9 +3496,9 @@ MultipartBoundaryEnd 5584301 MimeEntityBegin 5584301 MimeEntityHeadersEnd 5584303 MimeMessageBegin 5584303 -MimeMessageHeadersEnd 5584404 MimeEntityBegin 5584303 MimeEntityHeadersEnd 5584404 +MimeMessageHeadersEnd 5584404 Octets 399 Lines 20 MimeEntityEnd 5584803 @@ -3511,9 +3511,9 @@ MultipartBoundaryEnd 5584837 MimeEntityBegin 5584837 MimeEntityHeadersEnd 5584839 MimeMessageBegin 5584839 -MimeMessageHeadersEnd 5584958 MimeEntityBegin 5584839 MimeEntityHeadersEnd 5584958 +MimeMessageHeadersEnd 5584958 Octets 1345 Lines 27 MimeEntityEnd 5586303 @@ -3526,9 +3526,9 @@ MultipartBoundaryEnd 5586337 MimeEntityBegin 5586337 MimeEntityHeadersEnd 5586339 MimeMessageBegin 5586339 -MimeMessageHeadersEnd 5586443 MimeEntityBegin 5586339 MimeEntityHeadersEnd 5586443 +MimeMessageHeadersEnd 5586443 Octets 304 Lines 10 MimeEntityEnd 5586747 @@ -3541,9 +3541,9 @@ MultipartBoundaryEnd 5586781 MimeEntityBegin 5586781 MimeEntityHeadersEnd 5586783 MimeMessageBegin 5586783 -MimeMessageHeadersEnd 5586930 MimeEntityBegin 5586783 MimeEntityHeadersEnd 5586930 +MimeMessageHeadersEnd 5586930 Octets 1055 Lines 37 MimeEntityEnd 5587985 @@ -3768,9 +3768,9 @@ MultipartBoundaryEnd 5873421 MimeEntityBegin 5873421 MimeEntityHeadersEnd 5873515 MimeMessageBegin 5873515 -MimeMessageHeadersEnd 5874597 MimeEntityBegin 5873515 MimeEntityHeadersEnd 5874597 +MimeMessageHeadersEnd 5874597 Octets 24858 Lines 464 MimeEntityEnd 5899455 @@ -4520,9 +4520,9 @@ MultipartBoundaryEnd 6956986 MimeEntityBegin 6956986 MimeEntityHeadersEnd 6957087 MimeMessageBegin 6957087 -MimeMessageHeadersEnd 6957640 MimeEntityBegin 6957087 MimeEntityHeadersEnd 6957640 +MimeMessageHeadersEnd 6957640 Octets 362 Lines 17 MimeEntityEnd 6958002 @@ -4920,9 +4920,9 @@ MultipartBoundaryEnd 7285667 MimeEntityBegin 7285667 MimeEntityHeadersEnd 7285761 MimeMessageBegin 7285761 -MimeMessageHeadersEnd 7286598 MimeEntityBegin 7285761 MimeEntityHeadersEnd 7286598 +MimeMessageHeadersEnd 7286598 MultipartPreambleBegin 7286598 MultipartPreambleEnd 7286600 MultipartBoundaryBegin 7286600 @@ -5145,9 +5145,9 @@ MultipartBoundaryEnd 8657522 MimeEntityBegin 8657522 MimeEntityHeadersEnd 8657715 MimeMessageBegin 8657715 -MimeMessageHeadersEnd 8657744 MimeEntityBegin 8657715 MimeEntityHeadersEnd 8657744 +MimeMessageHeadersEnd 8657744 Octets 4 Lines 3 MimeEntityEnd 8657748 @@ -5167,9 +5167,9 @@ MultipartBoundaryEnd 8657934 MimeEntityBegin 8657934 MimeEntityHeadersEnd 8658142 MimeMessageBegin 8658142 -MimeMessageHeadersEnd 8658169 MimeEntityBegin 8658142 MimeEntityHeadersEnd 8658169 +MimeMessageHeadersEnd 8658169 Octets 4 Lines 3 MimeEntityEnd 8658173 @@ -5549,9 +5549,9 @@ MimeMessageHeadersEnd 8963476 MimeEntityBegin 8962832 MimeEntityHeadersEnd 8963476 MimeMessageBegin 8963476 -MimeMessageHeadersEnd 8963972 MimeEntityBegin 8963476 MimeEntityHeadersEnd 8963972 +MimeMessageHeadersEnd 8963972 Octets 899 Lines 25 MimeEntityEnd 8964871 @@ -5905,9 +5905,9 @@ MimeMessageHeadersEnd 9352135 MimeEntityBegin 9351333 MimeEntityHeadersEnd 9352135 MimeMessageBegin 9352135 -MimeMessageHeadersEnd 9353538 MimeEntityBegin 9352135 MimeEntityHeadersEnd 9353538 +MimeMessageHeadersEnd 9353538 Octets 1452 Lines 21 MimeEntityEnd 9354990 @@ -5936,9 +5936,9 @@ MultipartBoundaryEnd 9355953 MimeEntityBegin 9355953 MimeEntityHeadersEnd 9356111 MimeMessageBegin 9356111 -MimeMessageHeadersEnd 9357514 MimeEntityBegin 9356111 MimeEntityHeadersEnd 9357514 +MimeMessageHeadersEnd 9357514 Octets 1452 Lines 21 MimeEntityEnd 9358966 @@ -6090,9 +6090,9 @@ MultipartBoundaryEnd 9387553 MimeEntityBegin 9387553 MimeEntityHeadersEnd 9387649 MimeMessageBegin 9387649 -MimeMessageHeadersEnd 9388845 MimeEntityBegin 9387649 MimeEntityHeadersEnd 9388845 +MimeMessageHeadersEnd 9388845 Octets 210 Lines 6 MimeEntityEnd 9389055 @@ -6356,9 +6356,9 @@ MultipartBoundaryEnd 9434159 MimeEntityBegin 9434159 MimeEntityHeadersEnd 9434191 MimeMessageBegin 9434191 -MimeMessageHeadersEnd 9435012 MimeEntityBegin 9434191 MimeEntityHeadersEnd 9435012 +MimeMessageHeadersEnd 9435012 Octets 11 Lines 1 MimeEntityEnd 9435023 @@ -6665,9 +6665,9 @@ MultipartBoundaryEnd 10013813 MimeEntityBegin 10013813 MimeEntityHeadersEnd 10014016 MimeMessageBegin 10014016 -MimeMessageHeadersEnd 10014045 MimeEntityBegin 10014016 MimeEntityHeadersEnd 10014045 +MimeMessageHeadersEnd 10014045 Octets 4 Lines 3 MimeEntityEnd 10014049 @@ -6701,9 +6701,9 @@ MultipartBoundaryEnd 10015919 MimeEntityBegin 10015919 MimeEntityHeadersEnd 10016110 MimeMessageBegin 10016110 -MimeMessageHeadersEnd 10016139 MimeEntityBegin 10016110 MimeEntityHeadersEnd 10016139 +MimeMessageHeadersEnd 10016139 Octets 2 Lines 2 MimeEntityEnd 10016141 From 10987711e6297c088a137424b667b42edb9ce35b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 21:39:41 -0400 Subject: [PATCH 641/741] Fixed MultipartBoundaryBegin to use an offset that includes the preceding CRLF Another adjustment for issue #582 --- MimeKit/AsyncMimeParser.cs | 14 +- MimeKit/MimeParser.cs | 14 +- .../mbox/content-length.dos-offsets.txt | 122 +- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 1052 ++++++++--------- 4 files changed, 607 insertions(+), 595 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 5804ea97f1..b8ed04ba52 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -395,8 +395,10 @@ async Task MultipartScanEpilogueAsync (Multipart multipart, CancellationToken ca async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { + var beginOffset = GetOffset (inputIndex); + do { - OnMultipartBoundaryBegin (multipart, GetOffset (inputIndex)); + OnMultipartBoundaryBegin (multipart, beginOffset); // skip over the boundary marker if (!await SkipLineAsync (true, cancellationToken).ConfigureAwait (false)) { @@ -416,8 +418,10 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat if (state == MimeParserState.Boundary) { if (headers.Count == 0) { - if (boundary == BoundaryType.ImmediateBoundary) + if (boundary == BoundaryType.ImmediateBoundary) { + beginOffset = GetOffset (inputIndex); continue; + } break; } @@ -441,7 +445,9 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat else await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); + var endOffset = GetEndOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); + beginOffset = endOffset; multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); @@ -475,7 +481,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation await MultipartScanSubpartsAsync (multipart, depth, cancellationToken).ConfigureAwait (false); if (boundary == BoundaryType.ImmediateEndBoundary) { - OnMultipartEndBoundaryBegin (multipart, GetOffset (inputIndex)); + OnMultipartEndBoundaryBegin (multipart, GetEndOffset (inputIndex)); // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 0052a29aea..7cb26d4cb5 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1632,8 +1632,10 @@ unsafe void MultipartScanEpilogue (Multipart multipart, byte* inbuf, Cancellatio unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { + var beginOffset = GetOffset (inputIndex); + do { - OnMultipartBoundaryBegin (multipart, GetOffset (inputIndex)); + OnMultipartBoundaryBegin (multipart, beginOffset); // skip over the boundary marker if (!SkipLine (inbuf, true, cancellationToken)) { @@ -1653,8 +1655,10 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, if (state == MimeParserState.Boundary) { if (headers.Count == 0) { - if (boundary == BoundaryType.ImmediateBoundary) + if (boundary == BoundaryType.ImmediateBoundary) { + beginOffset = GetOffset (inputIndex); continue; + } break; } @@ -1678,7 +1682,9 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, else ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); + var endOffset = GetEndOffset (inputIndex); + OnMimeEntityEnd (entity, endOffset); + beginOffset = endOffset; multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); @@ -1725,7 +1731,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can MultipartScanSubparts (multipart, inbuf, depth, cancellationToken); if (boundary == BoundaryType.ImmediateEndBoundary) { - OnMultipartEndBoundaryBegin (multipart, GetOffset (inputIndex)); + OnMultipartEndBoundaryBegin (multipart, GetEndOffset (inputIndex)); // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index 0ee89e77de..b961b351b9 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -13,7 +13,7 @@ MimeEntityHeadersEnd 753 Octets 78 Lines 5 MimeEntityEnd 831 -MultipartBoundaryBegin 833 +MultipartBoundaryBegin 831 MultipartBoundaryEnd 883 MimeEntityBegin 883 MimeEntityHeadersEnd 948 @@ -28,7 +28,7 @@ MimeMessageEnd 1887 Octets 939 Lines 21 MimeEntityEnd 1887 -MultipartEndBoundaryBegin 1889 +MultipartEndBoundaryBegin 1887 MultipartEndBoundaryEnd 1939 MultipartEpilogueBegin 1939 MultipartEpilogueEnd 1939 @@ -59,35 +59,35 @@ MimeMessageEnd 3134 Octets 479 Lines 14 MimeEntityEnd 3134 -MultipartBoundaryBegin 3136 +MultipartBoundaryBegin 3134 MultipartBoundaryEnd 3164 MimeEntityBegin 3164 MimeEntityHeadersEnd 3291 Octets 464 Lines 7 MimeEntityEnd 3755 -MultipartBoundaryBegin 3757 +MultipartBoundaryBegin 3755 MultipartBoundaryEnd 3785 MimeEntityBegin 3785 MimeEntityHeadersEnd 3912 Octets 492 Lines 7 MimeEntityEnd 4404 -MultipartBoundaryBegin 4406 +MultipartBoundaryBegin 4404 MultipartBoundaryEnd 4434 MimeEntityBegin 4434 MimeEntityHeadersEnd 4565 Octets 534 Lines 8 MimeEntityEnd 5099 -MultipartBoundaryBegin 5101 +MultipartBoundaryBegin 5099 MultipartBoundaryEnd 5129 MimeEntityBegin 5129 MimeEntityHeadersEnd 5258 Octets 504 Lines 7 MimeEntityEnd 5762 -MultipartBoundaryBegin 5764 +MultipartBoundaryBegin 5762 MultipartBoundaryEnd 5792 MimeEntityBegin 5792 MimeEntityHeadersEnd 5941 @@ -102,7 +102,7 @@ MimeMessageEnd 6419 Octets 478 Lines 13 MimeEntityEnd 6419 -MultipartBoundaryBegin 6421 +MultipartBoundaryBegin 6419 MultipartBoundaryEnd 6449 MimeEntityBegin 6449 MimeEntityHeadersEnd 6625 @@ -133,14 +133,14 @@ MimeMessageEnd 8162 Octets 1537 Lines 42 MimeEntityEnd 8162 -MultipartBoundaryBegin 8164 +MultipartBoundaryBegin 8162 MultipartBoundaryEnd 8192 MimeEntityBegin 8192 MimeEntityHeadersEnd 8248 Octets 53 Lines 2 MimeEntityEnd 8301 -MultipartEndBoundaryBegin 8303 +MultipartEndBoundaryBegin 8301 MultipartEndBoundaryEnd 8331 MultipartEpilogueBegin 8331 MultipartEpilogueEnd 8331 @@ -171,35 +171,35 @@ MimeMessageEnd 9532 Octets 478 Lines 14 MimeEntityEnd 9532 -MultipartBoundaryBegin 9534 +MultipartBoundaryBegin 9532 MultipartBoundaryEnd 9562 MimeEntityBegin 9562 MimeEntityHeadersEnd 9693 Octets 464 Lines 7 MimeEntityEnd 10157 -MultipartBoundaryBegin 10159 +MultipartBoundaryBegin 10157 MultipartBoundaryEnd 10187 MimeEntityBegin 10187 MimeEntityHeadersEnd 10318 Octets 492 Lines 7 MimeEntityEnd 10810 -MultipartBoundaryBegin 10812 +MultipartBoundaryBegin 10810 MultipartBoundaryEnd 10840 MimeEntityBegin 10840 MimeEntityHeadersEnd 10975 Octets 534 Lines 8 MimeEntityEnd 11509 -MultipartBoundaryBegin 11511 +MultipartBoundaryBegin 11509 MultipartBoundaryEnd 11539 MimeEntityBegin 11539 MimeEntityHeadersEnd 11672 Octets 504 Lines 7 MimeEntityEnd 12176 -MultipartBoundaryBegin 12178 +MultipartBoundaryBegin 12176 MultipartBoundaryEnd 12206 MimeEntityBegin 12206 MimeEntityHeadersEnd 12359 @@ -214,7 +214,7 @@ MimeMessageEnd 12836 Octets 477 Lines 13 MimeEntityEnd 12836 -MultipartBoundaryBegin 12838 +MultipartBoundaryBegin 12836 MultipartBoundaryEnd 12866 MimeEntityBegin 12866 MimeEntityHeadersEnd 13046 @@ -245,14 +245,14 @@ MimeMessageEnd 14588 Octets 1542 Lines 42 MimeEntityEnd 14588 -MultipartBoundaryBegin 14590 +MultipartBoundaryBegin 14588 MultipartBoundaryEnd 14618 MimeEntityBegin 14618 MimeEntityHeadersEnd 14678 Octets 53 Lines 2 MimeEntityEnd 14731 -MultipartEndBoundaryBegin 14733 +MultipartEndBoundaryBegin 14731 MultipartEndBoundaryEnd 14761 MultipartEpilogueBegin 14761 MultipartEpilogueEnd 14761 @@ -275,14 +275,14 @@ MimeEntityHeadersEnd 16466 Octets 5310 Lines 112 MimeEntityEnd 21776 -MultipartBoundaryBegin 21778 +MultipartBoundaryBegin 21776 MultipartBoundaryEnd 21823 MimeEntityBegin 21823 MimeEntityHeadersEnd 22028 Octets 942 Lines 14 MimeEntityEnd 22970 -MultipartEndBoundaryBegin 22972 +MultipartEndBoundaryBegin 22970 MultipartEndBoundaryEnd 23017 MultipartEpilogueBegin 23017 MultipartEpilogueEnd 23019 @@ -305,7 +305,7 @@ MimeEntityHeadersEnd 24476 Octets 30 Lines 4 MimeEntityEnd 24506 -MultipartBoundaryBegin 24508 +MultipartBoundaryBegin 24506 MultipartBoundaryEnd 24547 MimeEntityBegin 24547 MimeEntityHeadersEnd 24641 @@ -322,7 +322,7 @@ MimeEntityHeadersEnd 25599 Octets 643 Lines 17 MimeEntityEnd 26242 -MultipartBoundaryBegin 26244 +MultipartBoundaryBegin 26242 MultipartBoundaryEnd 26284 MimeEntityBegin 26284 MimeEntityHeadersEnd 26368 @@ -335,21 +335,21 @@ MimeEntityHeadersEnd 26488 Octets 868 Lines 19 MimeEntityEnd 27356 -MultipartBoundaryBegin 27358 +MultipartBoundaryBegin 27356 MultipartBoundaryEnd 27398 MimeEntityBegin 27398 MimeEntityHeadersEnd 27587 Octets 754158 Lines 10192 MimeEntityEnd 781745 -MultipartEndBoundaryBegin 781747 +MultipartEndBoundaryBegin 781745 MultipartEndBoundaryEnd 781787 MultipartEpilogueBegin 781787 MultipartEpilogueEnd 781789 Octets 755421 Lines 10224 MimeEntityEnd 781789 -MultipartEndBoundaryBegin 781791 +MultipartEndBoundaryBegin 781789 MultipartEndBoundaryEnd 781831 MultipartEpilogueBegin 781831 MultipartEpilogueEnd 781837 @@ -360,7 +360,7 @@ MimeMessageEnd 781837 Octets 757196 Lines 10269 MimeEntityEnd 781837 -MultipartEndBoundaryBegin 781839 +MultipartEndBoundaryBegin 781837 MultipartEndBoundaryEnd 781878 MultipartEpilogueBegin 781878 MultipartEpilogueEnd 781880 @@ -383,35 +383,35 @@ MimeEntityHeadersEnd 783342 Octets 2432 Lines 51 MimeEntityEnd 785774 -MultipartBoundaryBegin 785776 +MultipartBoundaryBegin 785774 MultipartBoundaryEnd 785821 MimeEntityBegin 785821 MimeEntityHeadersEnd 785985 Octets 6102 Lines 80 MimeEntityEnd 792087 -MultipartBoundaryBegin 792089 +MultipartBoundaryBegin 792087 MultipartBoundaryEnd 792134 MimeEntityBegin 792134 MimeEntityHeadersEnd 792297 Octets 12230 Lines 158 MimeEntityEnd 804527 -MultipartBoundaryBegin 804529 +MultipartBoundaryBegin 804527 MultipartBoundaryEnd 804574 MimeEntityBegin 804574 MimeEntityHeadersEnd 804739 Octets 21996 Lines 283 MimeEntityEnd 826735 -MultipartBoundaryBegin 826737 +MultipartBoundaryBegin 826735 MultipartBoundaryEnd 826782 MimeEntityBegin 826782 MimeEntityHeadersEnd 826991 Octets 3438 Lines 46 MimeEntityEnd 830429 -MultipartEndBoundaryBegin 830431 +MultipartEndBoundaryBegin 830429 MultipartEndBoundaryEnd 830476 MultipartEpilogueBegin 830476 MultipartEpilogueEnd 830478 @@ -434,7 +434,7 @@ MimeEntityHeadersEnd 831463 Octets 2626 Lines 97 MimeEntityEnd 834089 -MultipartEndBoundaryBegin 834091 +MultipartEndBoundaryBegin 834089 MultipartEndBoundaryEnd 834100 MultipartEpilogueBegin 834100 MultipartEpilogueEnd 834102 @@ -457,14 +457,14 @@ MimeEntityHeadersEnd 835328 Octets 921 Lines 21 MimeEntityEnd 836249 -MultipartBoundaryBegin 836251 +MultipartBoundaryBegin 836249 MultipartBoundaryEnd 836269 MimeEntityBegin 836269 MimeEntityHeadersEnd 836351 Octets 760 Lines 13 MimeEntityEnd 837111 -MultipartEndBoundaryBegin 837113 +MultipartEndBoundaryBegin 837111 MultipartEndBoundaryEnd 837131 MultipartEpilogueBegin 837131 MultipartEpilogueEnd 837133 @@ -487,14 +487,14 @@ MimeEntityHeadersEnd 838594 Octets 754 Lines 14 MimeEntityEnd 839348 -MultipartBoundaryBegin 839350 +MultipartBoundaryBegin 839348 MultipartBoundaryEnd 839358 MimeEntityBegin 839358 MimeEntityHeadersEnd 839541 Octets 2246 Lines 32 MimeEntityEnd 841787 -MultipartEndBoundaryBegin 841789 +MultipartEndBoundaryBegin 841787 MultipartEndBoundaryEnd 841797 MultipartEpilogueBegin 841797 MultipartEpilogueEnd 841797 @@ -517,14 +517,14 @@ MimeEntityHeadersEnd 843271 Octets 2858 Lines 47 MimeEntityEnd 846129 -MultipartBoundaryBegin 846131 +MultipartBoundaryBegin 846129 MultipartBoundaryEnd 846153 MimeEntityBegin 846153 MimeEntityHeadersEnd 846336 Octets 2582 Lines 36 MimeEntityEnd 848918 -MultipartEndBoundaryBegin 848920 +MultipartEndBoundaryBegin 848918 MultipartEndBoundaryEnd 848942 MultipartEpilogueBegin 848942 MultipartEpilogueEnd 848942 @@ -547,14 +547,14 @@ MimeEntityHeadersEnd 850109 Octets 10868 Lines 147 MimeEntityEnd 860977 -MultipartBoundaryBegin 860979 +MultipartBoundaryBegin 860977 MultipartBoundaryEnd 861007 MimeEntityBegin 861007 MimeEntityHeadersEnd 861162 Octets 4674 Lines 64 MimeEntityEnd 865836 -MultipartEndBoundaryBegin 865838 +MultipartEndBoundaryBegin 865836 MultipartEndBoundaryEnd 865866 MultipartEpilogueBegin 865866 MultipartEpilogueEnd 865868 @@ -587,14 +587,14 @@ MimeEntityHeadersEnd 870294 Octets 110 Lines 4 MimeEntityEnd 870404 -MultipartBoundaryBegin 870406 +MultipartBoundaryBegin 870404 MultipartBoundaryEnd 870451 MimeEntityBegin 870451 MimeEntityHeadersEnd 870606 Octets 3986 Lines 54 MimeEntityEnd 874592 -MultipartEndBoundaryBegin 874594 +MultipartEndBoundaryBegin 874592 MultipartEndBoundaryEnd 874639 MultipartEpilogueBegin 874639 MultipartEpilogueEnd 874641 @@ -655,7 +655,7 @@ MimeEntityHeadersEnd 885869 Octets 16 Lines 2 MimeEntityEnd 885885 -MultipartBoundaryBegin 885887 +MultipartBoundaryBegin 885885 MultipartBoundaryEnd 885915 MimeEntityBegin 885915 MimeEntityHeadersEnd 886073 @@ -670,7 +670,7 @@ MimeMessageEnd 888928 Octets 2855 Lines 44 MimeEntityEnd 888928 -MultipartEndBoundaryBegin 888930 +MultipartEndBoundaryBegin 888928 MultipartEndBoundaryEnd 888958 MultipartEpilogueBegin 888958 MultipartEpilogueEnd 888960 @@ -693,14 +693,14 @@ MimeEntityHeadersEnd 889859 Octets 42 Lines 2 MimeEntityEnd 889901 -MultipartBoundaryBegin 889903 +MultipartBoundaryBegin 889901 MultipartBoundaryEnd 889945 MimeEntityBegin 889945 MimeEntityHeadersEnd 890100 Octets 5632 Lines 77 MimeEntityEnd 895732 -MultipartEndBoundaryBegin 895734 +MultipartEndBoundaryBegin 895732 MultipartEndBoundaryEnd 895776 MultipartEpilogueBegin 895776 MultipartEpilogueEnd 895778 @@ -733,14 +733,14 @@ MimeEntityHeadersEnd 908890 Octets 627 Lines 17 MimeEntityEnd 909517 -MultipartBoundaryBegin 909519 +MultipartBoundaryBegin 909517 MultipartBoundaryEnd 909561 MimeEntityBegin 909561 MimeEntityHeadersEnd 909716 Octets 1812 Lines 25 MimeEntityEnd 911528 -MultipartEndBoundaryBegin 911530 +MultipartEndBoundaryBegin 911528 MultipartEndBoundaryEnd 911572 MultipartEpilogueBegin 911572 MultipartEpilogueEnd 911574 @@ -793,14 +793,14 @@ MimeEntityHeadersEnd 921494 Octets 0 Lines 1 MimeEntityEnd 921494 -MultipartBoundaryBegin 921496 +MultipartBoundaryBegin 921494 MultipartBoundaryEnd 921529 MimeEntityBegin 921529 MimeEntityHeadersEnd 921611 Octets 2754 Lines 42 MimeEntityEnd 924365 -MultipartEndBoundaryBegin 924367 +MultipartEndBoundaryBegin 924365 MultipartEndBoundaryEnd 924400 MultipartEpilogueBegin 924400 MultipartEpilogueEnd 924402 @@ -823,21 +823,21 @@ MimeEntityHeadersEnd 925617 Octets 466 Lines 14 MimeEntityEnd 926083 -MultipartBoundaryBegin 926085 +MultipartBoundaryBegin 926083 MultipartBoundaryEnd 926126 MimeEntityBegin 926126 MimeEntityHeadersEnd 926204 Octets 837 Lines 27 MimeEntityEnd 927041 -MultipartBoundaryBegin 927043 +MultipartBoundaryBegin 927041 MultipartBoundaryEnd 927084 MimeEntityBegin 927084 MimeEntityHeadersEnd 927184 Octets 1216 Lines 17 MimeEntityEnd 928400 -MultipartEndBoundaryBegin 928402 +MultipartEndBoundaryBegin 928400 MultipartEndBoundaryEnd 928443 MultipartEpilogueBegin 928443 MultipartEpilogueEnd 928445 @@ -860,14 +860,14 @@ MimeEntityHeadersEnd 929694 Octets 159 Lines 8 MimeEntityEnd 929853 -MultipartBoundaryBegin 929855 +MultipartBoundaryBegin 929853 MultipartBoundaryEnd 929898 MimeEntityBegin 929898 MimeEntityHeadersEnd 929980 Octets 4152 Lines 57 MimeEntityEnd 934132 -MultipartEndBoundaryBegin 934134 +MultipartEndBoundaryBegin 934132 MultipartEndBoundaryEnd 934177 MultipartEpilogueBegin 934177 MultipartEpilogueEnd 934179 @@ -890,14 +890,14 @@ MimeEntityHeadersEnd 935454 Octets 78 Lines 5 MimeEntityEnd 935532 -MultipartBoundaryBegin 935534 +MultipartBoundaryBegin 935532 MultipartBoundaryEnd 935568 MimeEntityBegin 935568 MimeEntityHeadersEnd 935650 Octets 3774 Lines 58 MimeEntityEnd 939424 -MultipartEndBoundaryBegin 939426 +MultipartEndBoundaryBegin 939424 MultipartEndBoundaryEnd 939460 MultipartEpilogueBegin 939460 MultipartEpilogueEnd 939460 @@ -920,7 +920,7 @@ MimeEntityHeadersEnd 940823 Octets 194 Lines 7 MimeEntityEnd 941017 -MultipartBoundaryBegin 941019 +MultipartBoundaryBegin 941017 MultipartBoundaryEnd 941044 MimeEntityBegin 941044 MimeEntityHeadersEnd 941076 @@ -935,7 +935,7 @@ MimeMessageEnd 941908 Octets 832 Lines 16 MimeEntityEnd 941908 -MultipartEndBoundaryBegin 941910 +MultipartEndBoundaryBegin 941908 MultipartEndBoundaryEnd 941935 MultipartEpilogueBegin 941935 MultipartEpilogueEnd 941937 @@ -958,14 +958,14 @@ MimeEntityHeadersEnd 943994 Octets 881 Lines 19 MimeEntityEnd 944875 -MultipartBoundaryBegin 944877 +MultipartBoundaryBegin 944875 MultipartBoundaryEnd 944922 MimeEntityBegin 944922 MimeEntityHeadersEnd 945088 Octets 3702 Lines 62 MimeEntityEnd 948790 -MultipartEndBoundaryBegin 948792 +MultipartEndBoundaryBegin 948790 MultipartEndBoundaryEnd 948837 MultipartEpilogueBegin 948837 MultipartEpilogueEnd 948839 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index 49c625dd13..fa70ff6eae 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -19,21 +19,21 @@ MimeEntityHeadersEnd 682 Octets 731 Lines 17 MimeEntityEnd 1413 -MultipartBoundaryBegin 1415 +MultipartBoundaryBegin 1413 MultipartBoundaryEnd 1447 MimeEntityBegin 1447 MimeEntityHeadersEnd 1535 Octets 31472 Lines 427 MimeEntityEnd 33007 -MultipartEndBoundaryBegin 33009 +MultipartEndBoundaryBegin 33007 MultipartEndBoundaryEnd 33041 MultipartEpilogueBegin 33041 MultipartEpilogueEnd 33041 Octets 32393 Lines 452 MimeEntityEnd 33041 -MultipartBoundaryBegin 33043 +MultipartBoundaryBegin 33041 MultipartBoundaryEnd 33061 MimeEntityBegin 33061 MimeEntityHeadersEnd 33157 @@ -46,42 +46,42 @@ MimeEntityHeadersEnd 33275 Octets 26000 Lines 353 MimeEntityEnd 59275 -MultipartBoundaryBegin 59277 +MultipartBoundaryBegin 59275 MultipartBoundaryEnd 59309 MimeEntityBegin 59309 MimeEntityHeadersEnd 59395 Octets 18666 Lines 254 MimeEntityEnd 78061 -MultipartBoundaryBegin 78063 +MultipartBoundaryBegin 78061 MultipartBoundaryEnd 78095 MimeEntityBegin 78095 MimeEntityHeadersEnd 78212 Octets 46125 Lines 2437 MimeEntityEnd 124337 -MultipartBoundaryBegin 124339 +MultipartBoundaryBegin 124337 MultipartBoundaryEnd 124371 MimeEntityBegin 124371 MimeEntityHeadersEnd 124435 Octets 9203 Lines 358 MimeEntityEnd 133638 -MultipartEndBoundaryBegin 133640 +MultipartEndBoundaryBegin 133638 MultipartEndBoundaryEnd 133672 MultipartEpilogueBegin 133672 MultipartEpilogueEnd 133672 Octets 100515 Lines 3421 MimeEntityEnd 133672 -MultipartBoundaryBegin 133674 +MultipartBoundaryBegin 133672 MultipartBoundaryEnd 133692 MimeEntityBegin 133692 MimeEntityHeadersEnd 133780 Octets 47822 Lines 648 MimeEntityEnd 181602 -MultipartEndBoundaryBegin 181604 +MultipartEndBoundaryBegin 181602 MultipartEndBoundaryEnd 181622 MultipartEpilogueBegin 181622 MultipartEpilogueEnd 181624 @@ -124,7 +124,7 @@ MimeEntityHeadersEnd 320841 Octets 239 Lines 7 MimeEntityEnd 321080 -MultipartBoundaryBegin 321082 +MultipartBoundaryBegin 321080 MultipartBoundaryEnd 321123 MimeEntityBegin 321123 MimeEntityHeadersEnd 321211 @@ -137,28 +137,28 @@ MimeEntityHeadersEnd 321348 Octets 149 Lines 4 MimeEntityEnd 321497 -MultipartBoundaryBegin 321499 +MultipartBoundaryBegin 321497 MultipartBoundaryEnd 321542 MimeEntityBegin 321542 MimeEntityHeadersEnd 321656 Octets 4432 Lines 65 MimeEntityEnd 326088 -MultipartBoundaryBegin 326090 +MultipartBoundaryBegin 326088 MultipartBoundaryEnd 326133 MimeEntityBegin 326133 MimeEntityHeadersEnd 326227 Octets 48 Lines 4 MimeEntityEnd 326275 -MultipartEndBoundaryBegin 326277 +MultipartEndBoundaryBegin 326275 MultipartEndBoundaryEnd 326320 MultipartEpilogueBegin 326320 MultipartEpilogueEnd 326322 Octets 5111 Lines 88 MimeEntityEnd 326322 -MultipartEndBoundaryBegin 326324 +MultipartEndBoundaryBegin 326322 MultipartEndBoundaryEnd 326365 MultipartEpilogueBegin 326365 MultipartEpilogueEnd 326365 @@ -181,7 +181,7 @@ MimeEntityHeadersEnd 327479 Octets 436 Lines 13 MimeEntityEnd 327915 -MultipartBoundaryBegin 327917 +MultipartBoundaryBegin 327915 MultipartBoundaryEnd 327980 MimeEntityBegin 327980 MimeEntityHeadersEnd 328012 @@ -198,14 +198,14 @@ MimeEntityHeadersEnd 329276 Octets 110 Lines 7 MimeEntityEnd 329386 -MultipartBoundaryBegin 329388 +MultipartBoundaryBegin 329386 MultipartBoundaryEnd 329419 MimeEntityBegin 329419 MimeEntityHeadersEnd 329511 Octets 20910 Lines 284 MimeEntityEnd 350421 -MultipartBoundaryBegin 350423 +MultipartBoundaryBegin 350421 MultipartBoundaryEnd 350454 MimeEntityBegin 350454 MimeEntityHeadersEnd 350456 @@ -219,14 +219,14 @@ MimeMessageEnd 350454 Octets 22442 Lines 325 MimeEntityEnd 350454 -MultipartBoundaryBegin 350456 +MultipartBoundaryBegin 350454 MultipartBoundaryEnd 350519 MimeEntityBegin 350519 MimeEntityHeadersEnd 350595 Octets 111 Lines 5 MimeEntityEnd 350706 -MultipartEndBoundaryBegin 350708 +MultipartEndBoundaryBegin 350706 MultipartEndBoundaryEnd 350771 MultipartEpilogueBegin 350771 MultipartEpilogueEnd 350773 @@ -249,7 +249,7 @@ MimeEntityHeadersEnd 351763 Octets 778 Lines 19 MimeEntityEnd 352541 -MultipartBoundaryBegin 352543 +MultipartBoundaryBegin 352541 MultipartBoundaryEnd 352584 MimeEntityBegin 352584 MimeEntityHeadersEnd 352672 @@ -262,70 +262,70 @@ MimeEntityHeadersEnd 352809 Octets 229 Lines 5 MimeEntityEnd 353038 -MultipartBoundaryBegin 353040 +MultipartBoundaryBegin 353038 MultipartBoundaryEnd 353083 MimeEntityBegin 353083 MimeEntityHeadersEnd 353195 Octets 684046 Lines 8983 MimeEntityEnd 1037241 -MultipartBoundaryBegin 1037243 +MultipartBoundaryBegin 1037241 MultipartBoundaryEnd 1037286 MimeEntityBegin 1037286 MimeEntityHeadersEnd 1037380 Octets 121 Lines 6 MimeEntityEnd 1037501 -MultipartBoundaryBegin 1037503 +MultipartBoundaryBegin 1037501 MultipartBoundaryEnd 1037546 MimeEntityBegin 1037546 MimeEntityHeadersEnd 1037676 Octets 690196 Lines 9061 MimeEntityEnd 1727872 -MultipartBoundaryBegin 1727874 +MultipartBoundaryBegin 1727872 MultipartBoundaryEnd 1727917 MimeEntityBegin 1727917 MimeEntityHeadersEnd 1728011 Octets 12 Lines 3 MimeEntityEnd 1728023 -MultipartBoundaryBegin 1728025 +MultipartBoundaryBegin 1728023 MultipartBoundaryEnd 1728068 MimeEntityBegin 1728068 MimeEntityHeadersEnd 1728189 Octets 69112 Lines 935 MimeEntityEnd 1797301 -MultipartBoundaryBegin 1797303 +MultipartBoundaryBegin 1797301 MultipartBoundaryEnd 1797346 MimeEntityBegin 1797346 MimeEntityHeadersEnd 1797440 Octets 143 Lines 6 MimeEntityEnd 1797583 -MultipartBoundaryBegin 1797585 +MultipartBoundaryBegin 1797583 MultipartBoundaryEnd 1797628 MimeEntityBegin 1797628 MimeEntityHeadersEnd 1797750 Octets 341234 Lines 4473 MimeEntityEnd 2138984 -MultipartBoundaryBegin 2138986 +MultipartBoundaryBegin 2138984 MultipartBoundaryEnd 2139029 MimeEntityBegin 2139029 MimeEntityHeadersEnd 2139123 Octets 6 Lines 2 MimeEntityEnd 2139129 -MultipartEndBoundaryBegin 2139131 +MultipartEndBoundaryBegin 2139129 MultipartEndBoundaryEnd 2139174 MultipartEpilogueBegin 2139174 MultipartEpilogueEnd 2139176 Octets 1786504 Lines 23516 MimeEntityEnd 2139176 -MultipartEndBoundaryBegin 2139178 +MultipartEndBoundaryBegin 2139176 MultipartEndBoundaryEnd 2139219 MultipartEpilogueBegin 2139219 MultipartEpilogueEnd 2139219 @@ -358,7 +358,7 @@ MimeEntityHeadersEnd 2141707 Octets 305 Lines 6 MimeEntityEnd 2142012 -MultipartBoundaryBegin 2142014 +MultipartBoundaryBegin 2142012 MultipartBoundaryEnd 2142030 MimeEntityBegin 2142030 MimeEntityHeadersEnd 2142109 @@ -371,28 +371,28 @@ MimeEntityHeadersEnd 2142207 Octets 3276 Lines 17 MimeEntityEnd 2145483 -MultipartBoundaryBegin 2145485 +MultipartBoundaryBegin 2145483 MultipartBoundaryEnd 2145502 MimeEntityBegin 2145502 MimeEntityHeadersEnd 2145610 Octets 156706 Lines 808 MimeEntityEnd 2302316 -MultipartEndBoundaryBegin 2302318 +MultipartEndBoundaryBegin 2302316 MultipartEndBoundaryEnd 2302335 MultipartEpilogueBegin 2302335 MultipartEpilogueEnd 2302335 Octets 160226 Lines 837 MimeEntityEnd 2302335 -MultipartBoundaryBegin 2302337 +MultipartBoundaryBegin 2302335 MultipartBoundaryEnd 2302353 MimeEntityBegin 2302353 MimeEntityHeadersEnd 2302412 Octets 4915 Lines 196 MimeEntityEnd 2307327 -MultipartEndBoundaryBegin 2307329 +MultipartEndBoundaryBegin 2307327 MultipartEndBoundaryEnd 2307345 MultipartEpilogueBegin 2307345 MultipartEpilogueEnd 2307345 @@ -431,21 +431,21 @@ MimeEntityHeadersEnd 2656121 Octets 724 Lines 18 MimeEntityEnd 2656845 -MultipartBoundaryBegin 2656847 +MultipartBoundaryBegin 2656845 MultipartBoundaryEnd 2656879 MimeEntityBegin 2656879 MimeEntityHeadersEnd 2656980 Octets 31472 Lines 427 MimeEntityEnd 2688452 -MultipartEndBoundaryBegin 2688454 +MultipartEndBoundaryBegin 2688452 MultipartEndBoundaryEnd 2688486 MultipartEpilogueBegin 2688486 MultipartEpilogueEnd 2688486 Octets 32399 Lines 453 MimeEntityEnd 2688486 -MultipartEndBoundaryBegin 2688488 +MultipartEndBoundaryBegin 2688486 MultipartEndBoundaryEnd 2688506 MultipartEpilogueBegin 2688506 MultipartEpilogueEnd 2688506 @@ -478,7 +478,7 @@ MimeEntityHeadersEnd 2748005 Octets 566 Lines 15 MimeEntityEnd 2748571 -MultipartBoundaryBegin 2748573 +MultipartBoundaryBegin 2748571 MultipartBoundaryEnd 2748632 MimeEntityBegin 2748632 MimeEntityHeadersEnd 2748738 @@ -491,28 +491,28 @@ MimeEntityHeadersEnd 2748875 Octets 426 Lines 8 MimeEntityEnd 2749301 -MultipartBoundaryBegin 2749303 +MultipartBoundaryBegin 2749301 MultipartBoundaryEnd 2749364 MimeEntityBegin 2749364 MimeEntityHeadersEnd 2749426 Octets 29662 Lines 402 MimeEntityEnd 2779088 -MultipartBoundaryBegin 2779090 +MultipartBoundaryBegin 2779088 MultipartBoundaryEnd 2779151 MimeEntityBegin 2779151 MimeEntityHeadersEnd 2779224 Octets 45 Lines 5 MimeEntityEnd 2779269 -MultipartEndBoundaryBegin 2779271 +MultipartEndBoundaryBegin 2779269 MultipartEndBoundaryEnd 2779332 MultipartEpilogueBegin 2779332 MultipartEpilogueEnd 2779334 Octets 30596 Lines 429 MimeEntityEnd 2779334 -MultipartEndBoundaryBegin 2779336 +MultipartEndBoundaryBegin 2779334 MultipartEndBoundaryEnd 2779395 MultipartEpilogueBegin 2779395 MultipartEpilogueEnd 2779395 @@ -535,7 +535,7 @@ MimeEntityHeadersEnd 2780454 Octets 848 Lines 28 MimeEntityEnd 2781302 -MultipartBoundaryBegin 2781304 +MultipartBoundaryBegin 2781302 MultipartBoundaryEnd 2781334 MimeEntityBegin 2781334 MimeEntityHeadersEnd 2781410 @@ -548,42 +548,42 @@ MimeEntityHeadersEnd 2781470 Octets 142 Lines 6 MimeEntityEnd 2781612 -MultipartBoundaryBegin 2781614 +MultipartBoundaryBegin 2781612 MultipartBoundaryEnd 2781646 MimeEntityBegin 2781646 MimeEntityHeadersEnd 2781714 Octets 1214 Lines 18 MimeEntityEnd 2782928 -MultipartBoundaryBegin 2782930 +MultipartBoundaryBegin 2782928 MultipartBoundaryEnd 2782962 MimeEntityBegin 2782962 MimeEntityHeadersEnd 2782990 Octets 68 Lines 1 MimeEntityEnd 2783058 -MultipartBoundaryBegin 2783060 +MultipartBoundaryBegin 2783058 MultipartBoundaryEnd 2783092 MimeEntityBegin 2783092 MimeEntityHeadersEnd 2783160 Octets 1222 Lines 18 MimeEntityEnd 2784382 -MultipartBoundaryBegin 2784384 +MultipartBoundaryBegin 2784382 MultipartBoundaryEnd 2784416 MimeEntityBegin 2784416 MimeEntityHeadersEnd 2784447 Octets 559 Lines 14 MimeEntityEnd 2785006 -MultipartEndBoundaryBegin 2785008 +MultipartEndBoundaryBegin 2785006 MultipartEndBoundaryEnd 2785040 MultipartEpilogueBegin 2785040 MultipartEpilogueEnd 2785042 Octets 3632 Lines 76 MimeEntityEnd 2785042 -MultipartEndBoundaryBegin 2785044 +MultipartEndBoundaryBegin 2785042 MultipartEndBoundaryEnd 2785074 MultipartEpilogueBegin 2785074 MultipartEpilogueEnd 2785076 @@ -636,7 +636,7 @@ MimeEntityHeadersEnd 2790555 Octets 77 Lines 6 MimeEntityEnd 2790632 -MultipartBoundaryBegin 2790634 +MultipartBoundaryBegin 2790632 MultipartBoundaryEnd 2790674 MimeEntityBegin 2790674 MimeEntityHeadersEnd 2790763 @@ -649,21 +649,21 @@ MimeEntityHeadersEnd 2790967 Octets 66874 Lines 958 MimeEntityEnd 2857841 -MultipartBoundaryBegin 2857843 +MultipartBoundaryBegin 2857841 MultipartBoundaryEnd 2857884 MimeEntityBegin 2857884 MimeEntityHeadersEnd 2858099 Octets 369562 Lines 5282 MimeEntityEnd 3227661 -MultipartEndBoundaryBegin 3227663 +MultipartEndBoundaryBegin 3227661 MultipartEndBoundaryEnd 3227704 MultipartEpilogueBegin 3227704 MultipartEpilogueEnd 3227708 Octets 436945 Lines 6257 MimeEntityEnd 3227708 -MultipartEndBoundaryBegin 3227710 +MultipartEndBoundaryBegin 3227708 MultipartEndBoundaryEnd 3227750 MultipartEpilogueBegin 3227750 MultipartEpilogueEnd 3227750 @@ -686,7 +686,7 @@ MimeEntityHeadersEnd 3228852 Octets 77 Lines 6 MimeEntityEnd 3228929 -MultipartBoundaryBegin 3228931 +MultipartBoundaryBegin 3228929 MultipartBoundaryEnd 3228971 MimeEntityBegin 3228971 MimeEntityHeadersEnd 3229059 @@ -699,21 +699,21 @@ MimeEntityHeadersEnd 3229263 Octets 66874 Lines 958 MimeEntityEnd 3296137 -MultipartBoundaryBegin 3296139 +MultipartBoundaryBegin 3296137 MultipartBoundaryEnd 3296180 MimeEntityBegin 3296180 MimeEntityHeadersEnd 3296395 Octets 369562 Lines 5282 MimeEntityEnd 3665957 -MultipartEndBoundaryBegin 3665959 +MultipartEndBoundaryBegin 3665957 MultipartEndBoundaryEnd 3666000 MultipartEpilogueBegin 3666000 MultipartEpilogueEnd 3666004 Octets 436945 Lines 6257 MimeEntityEnd 3666004 -MultipartEndBoundaryBegin 3666006 +MultipartEndBoundaryBegin 3666004 MultipartEndBoundaryEnd 3666046 MultipartEpilogueBegin 3666046 MultipartEpilogueEnd 3666046 @@ -754,14 +754,14 @@ MimeEntityHeadersEnd 3668048 Octets 186 Lines 7 MimeEntityEnd 3668234 -MultipartBoundaryBegin 3668236 +MultipartBoundaryBegin 3668234 MultipartBoundaryEnd 3668280 MimeEntityBegin 3668280 MimeEntityHeadersEnd 3668355 Octets 904 Lines 13 MimeEntityEnd 3669259 -MultipartEndBoundaryBegin 3669261 +MultipartEndBoundaryBegin 3669259 MultipartEndBoundaryEnd 3669305 MultipartEpilogueBegin 3669305 MultipartEpilogueEnd 3669418 @@ -784,7 +784,7 @@ MimeEntityHeadersEnd 3670063 Octets 402 Lines 11 MimeEntityEnd 3670465 -MultipartBoundaryBegin 3670467 +MultipartBoundaryBegin 3670465 MultipartBoundaryEnd 3670507 MimeEntityBegin 3670507 MimeEntityHeadersEnd 3670539 @@ -799,7 +799,7 @@ MimeMessageEnd 3674767 Octets 4228 Lines 89 MimeEntityEnd 3674767 -MultipartEndBoundaryBegin 3674769 +MultipartEndBoundaryBegin 3674767 MultipartEndBoundaryEnd 3674809 MultipartEpilogueBegin 3674809 MultipartEpilogueEnd 3674811 @@ -822,7 +822,7 @@ MimeEntityHeadersEnd 3675566 Octets 78 Lines 5 MimeEntityEnd 3675644 -MultipartBoundaryBegin 3675646 +MultipartBoundaryBegin 3675644 MultipartBoundaryEnd 3675696 MimeEntityBegin 3675696 MimeEntityHeadersEnd 3675761 @@ -837,7 +837,7 @@ MimeMessageEnd 3676700 Octets 939 Lines 21 MimeEntityEnd 3676700 -MultipartEndBoundaryBegin 3676702 +MultipartEndBoundaryBegin 3676700 MultipartEndBoundaryEnd 3676752 MultipartEpilogueBegin 3676752 MultipartEpilogueEnd 3676752 @@ -890,14 +890,14 @@ MimeEntityHeadersEnd 3802070 Octets 75 Lines 5 MimeEntityEnd 3802145 -MultipartBoundaryBegin 3802147 +MultipartBoundaryBegin 3802145 MultipartBoundaryEnd 3802163 MimeEntityBegin 3802163 MimeEntityHeadersEnd 3802247 Octets 650 Lines 10 MimeEntityEnd 3802897 -MultipartEndBoundaryBegin 3802899 +MultipartEndBoundaryBegin 3802897 MultipartEndBoundaryEnd 3802915 MultipartEpilogueBegin 3802915 MultipartEpilogueEnd 3802919 @@ -930,14 +930,14 @@ MimeEntityHeadersEnd 3846993 Octets 1965 Lines 44 MimeEntityEnd 3848958 -MultipartBoundaryBegin 3848960 +MultipartBoundaryBegin 3848958 MultipartBoundaryEnd 3848966 MimeEntityBegin 3848966 MimeEntityHeadersEnd 3849075 Octets 6308 Lines 87 MimeEntityEnd 3855383 -MultipartEndBoundaryBegin 3855385 +MultipartEndBoundaryBegin 3855383 MultipartEndBoundaryEnd 3855391 MultipartEpilogueBegin 3855391 MultipartEpilogueEnd 3855393 @@ -982,7 +982,7 @@ MimeEntityHeadersEnd 3967783 Octets 50 Lines 2 MimeEntityEnd 3967833 -MultipartBoundaryBegin 3967835 +MultipartBoundaryBegin 3967833 MultipartBoundaryEnd 3967894 MimeEntityBegin 3967894 MimeEntityHeadersEnd 3967959 @@ -999,14 +999,14 @@ MimeEntityHeadersEnd 3968651 Octets 127 Lines 6 MimeEntityEnd 3968778 -MultipartBoundaryBegin 3968780 +MultipartBoundaryBegin 3968778 MultipartBoundaryEnd 3968829 MimeEntityBegin 3968829 MimeEntityHeadersEnd 3968901 Octets 287 Lines 5 MimeEntityEnd 3969188 -MultipartEndBoundaryBegin 3969190 +MultipartEndBoundaryBegin 3969188 MultipartEndBoundaryEnd 3969239 MultipartEpilogueBegin 3969239 MultipartEpilogueEnd 3969241 @@ -1017,7 +1017,7 @@ MimeMessageEnd 3969241 Octets 1282 Lines 39 MimeEntityEnd 3969241 -MultipartEndBoundaryBegin 3969243 +MultipartEndBoundaryBegin 3969241 MultipartEndBoundaryEnd 3969302 MultipartEpilogueBegin 3969302 MultipartEpilogueEnd 3969308 @@ -1052,49 +1052,49 @@ MimeEntityHeadersEnd 3970068 Octets 42 Lines 2 MimeEntityEnd 3970110 -MultipartBoundaryBegin 3970112 +MultipartBoundaryBegin 3970110 MultipartBoundaryEnd 3970140 MimeEntityBegin 3970140 MimeEntityHeadersEnd 3970290 Octets 77616 Lines 401 MimeEntityEnd 4047906 -MultipartBoundaryBegin 4047908 +MultipartBoundaryBegin 4047906 MultipartBoundaryEnd 4047936 MimeEntityBegin 4047936 MimeEntityHeadersEnd 4047938 Octets 34 Lines 4 MimeEntityEnd 4047972 -MultipartBoundaryBegin 4047974 +MultipartBoundaryBegin 4047972 MultipartBoundaryEnd 4048002 MimeEntityBegin 4048002 MimeEntityHeadersEnd 4048154 Octets 103736 Lines 535 MimeEntityEnd 4151890 -MultipartBoundaryBegin 4151892 +MultipartBoundaryBegin 4151890 MultipartBoundaryEnd 4151920 MimeEntityBegin 4151920 MimeEntityHeadersEnd 4151922 Octets 164 Lines 5 MimeEntityEnd 4152086 -MultipartBoundaryBegin 4152088 +MultipartBoundaryBegin 4152086 MultipartBoundaryEnd 4152116 MimeEntityBegin 4152116 MimeEntityHeadersEnd 4152208 Octets 81424 Lines 1235 MimeEntityEnd 4233632 -MultipartBoundaryBegin 4233634 +MultipartBoundaryBegin 4233632 MultipartBoundaryEnd 4233662 MimeEntityBegin 4233662 MimeEntityHeadersEnd 4233664 Octets 22 Lines 3 MimeEntityEnd 4233686 -MultipartEndBoundaryBegin 4233688 +MultipartEndBoundaryBegin 4233686 MultipartEndBoundaryEnd 4233716 MultipartEpilogueBegin 4233716 MultipartEpilogueEnd 4233718 @@ -1127,7 +1127,7 @@ MimeEntityHeadersEnd 4236753 Octets 417 Lines 14 MimeEntityEnd 4237170 -MultipartBoundaryBegin 4237172 +MultipartBoundaryBegin 4237170 MultipartBoundaryEnd 4237213 MimeEntityBegin 4237213 MimeEntityHeadersEnd 4237301 @@ -1140,28 +1140,28 @@ MimeEntityHeadersEnd 4237438 Octets 229 Lines 5 MimeEntityEnd 4237667 -MultipartBoundaryBegin 4237669 +MultipartBoundaryBegin 4237667 MultipartBoundaryEnd 4237712 MimeEntityBegin 4237712 MimeEntityHeadersEnd 4237835 Octets 1421 Lines 38 MimeEntityEnd 4239256 -MultipartBoundaryBegin 4239258 +MultipartBoundaryBegin 4239256 MultipartBoundaryEnd 4239301 MimeEntityBegin 4239301 MimeEntityHeadersEnd 4239395 Octets 157 Lines 10 MimeEntityEnd 4239552 -MultipartEndBoundaryBegin 4239554 +MultipartEndBoundaryBegin 4239552 MultipartEndBoundaryEnd 4239597 MultipartEpilogueBegin 4239597 MultipartEpilogueEnd 4239599 Octets 2298 Lines 68 MimeEntityEnd 4239599 -MultipartEndBoundaryBegin 4239601 +MultipartEndBoundaryBegin 4239599 MultipartEndBoundaryEnd 4239642 MultipartEpilogueBegin 4239642 MultipartEpilogueEnd 4239644 @@ -1184,14 +1184,14 @@ MimeEntityHeadersEnd 4240387 Octets 84 Lines 7 MimeEntityEnd 4240471 -MultipartBoundaryBegin 4240473 +MultipartBoundaryBegin 4240471 MultipartBoundaryEnd 4240490 MimeEntityBegin 4240490 MimeEntityHeadersEnd 4240553 Octets 5234 Lines 72 MimeEntityEnd 4245787 -MultipartEndBoundaryBegin 4245789 +MultipartEndBoundaryBegin 4245787 MultipartEndBoundaryEnd 4245806 MultipartEpilogueBegin 4245806 MultipartEpilogueEnd 4245810 @@ -1224,7 +1224,7 @@ MimeEntityHeadersEnd 4258491 Octets 39 Lines 2 MimeEntityEnd 4258530 -MultipartBoundaryBegin 4258532 +MultipartBoundaryBegin 4258530 MultipartBoundaryEnd 4258544 MimeEntityBegin 4258544 MimeEntityHeadersEnd 4258601 @@ -1245,7 +1245,7 @@ MimeMessageEnd 4258885 Octets 149 Lines 6 MimeEntityEnd 4258885 -MultipartBoundaryBegin 4258887 +MultipartBoundaryBegin 4258885 MultipartBoundaryEnd 4258902 MimeEntityBegin 4258902 MimeEntityHeadersEnd 4259095 @@ -1260,7 +1260,7 @@ MimeMessageEnd 4259173 Octets 78 Lines 3 MimeEntityEnd 4259173 -MultipartBoundaryBegin 4259175 +MultipartBoundaryBegin 4259173 MultipartBoundaryEnd 4259190 MimeEntityBegin 4259190 MimeEntityHeadersEnd 4259332 @@ -1275,7 +1275,7 @@ MimeMessageEnd 4259401 Octets 69 Lines 3 MimeEntityEnd 4259401 -MultipartBoundaryBegin 4259403 +MultipartBoundaryBegin 4259401 MultipartBoundaryEnd 4259418 MimeEntityBegin 4259418 MimeEntityHeadersEnd 4259535 @@ -1290,7 +1290,7 @@ MimeMessageEnd 4259605 Octets 70 Lines 3 MimeEntityEnd 4259605 -MultipartBoundaryBegin 4259607 +MultipartBoundaryBegin 4259605 MultipartBoundaryEnd 4259622 MimeEntityBegin 4259622 MimeEntityHeadersEnd 4259731 @@ -1305,14 +1305,14 @@ MimeMessageEnd 4259801 Octets 70 Lines 3 MimeEntityEnd 4259801 -MultipartEndBoundaryBegin 4259803 +MultipartEndBoundaryBegin 4259801 MultipartEndBoundaryEnd 4259818 MultipartEpilogueBegin 4259818 MultipartEpilogueEnd 4259820 Octets 1219 Lines 50 MimeEntityEnd 4259820 -MultipartEndBoundaryBegin 4259822 +MultipartEndBoundaryBegin 4259820 MultipartEndBoundaryEnd 4259834 MultipartEpilogueBegin 4259834 MultipartEpilogueEnd 4259836 @@ -1335,7 +1335,7 @@ MimeEntityHeadersEnd 4260441 Octets 3269 Lines 66 MimeEntityEnd 4263710 -MultipartBoundaryBegin 4263712 +MultipartBoundaryBegin 4263710 MultipartBoundaryEnd 4263724 MimeEntityBegin 4263724 MimeEntityHeadersEnd 4263787 @@ -1356,7 +1356,7 @@ MimeMessageEnd 4264071 Octets 149 Lines 6 MimeEntityEnd 4264071 -MultipartBoundaryBegin 4264073 +MultipartBoundaryBegin 4264071 MultipartBoundaryEnd 4264088 MimeEntityBegin 4264088 MimeEntityHeadersEnd 4264281 @@ -1371,14 +1371,14 @@ MimeMessageEnd 4264359 Octets 78 Lines 3 MimeEntityEnd 4264359 -MultipartEndBoundaryBegin 4264361 +MultipartEndBoundaryBegin 4264359 MultipartEndBoundaryEnd 4264376 MultipartEpilogueBegin 4264376 MultipartEpilogueEnd 4264378 Octets 591 Lines 23 MimeEntityEnd 4264378 -MultipartEndBoundaryBegin 4264380 +MultipartEndBoundaryBegin 4264378 MultipartEndBoundaryEnd 4264392 MultipartEpilogueBegin 4264392 MultipartEpilogueEnd 4264394 @@ -1409,35 +1409,35 @@ MimeMessageEnd 4265589 Octets 479 Lines 14 MimeEntityEnd 4265589 -MultipartBoundaryBegin 4265591 +MultipartBoundaryBegin 4265589 MultipartBoundaryEnd 4265619 MimeEntityBegin 4265619 MimeEntityHeadersEnd 4265746 Octets 464 Lines 7 MimeEntityEnd 4266210 -MultipartBoundaryBegin 4266212 +MultipartBoundaryBegin 4266210 MultipartBoundaryEnd 4266240 MimeEntityBegin 4266240 MimeEntityHeadersEnd 4266367 Octets 492 Lines 7 MimeEntityEnd 4266859 -MultipartBoundaryBegin 4266861 +MultipartBoundaryBegin 4266859 MultipartBoundaryEnd 4266889 MimeEntityBegin 4266889 MimeEntityHeadersEnd 4267020 Octets 534 Lines 8 MimeEntityEnd 4267554 -MultipartBoundaryBegin 4267556 +MultipartBoundaryBegin 4267554 MultipartBoundaryEnd 4267584 MimeEntityBegin 4267584 MimeEntityHeadersEnd 4267713 Octets 504 Lines 7 MimeEntityEnd 4268217 -MultipartBoundaryBegin 4268219 +MultipartBoundaryBegin 4268217 MultipartBoundaryEnd 4268247 MimeEntityBegin 4268247 MimeEntityHeadersEnd 4268396 @@ -1452,7 +1452,7 @@ MimeMessageEnd 4268874 Octets 478 Lines 13 MimeEntityEnd 4268874 -MultipartBoundaryBegin 4268876 +MultipartBoundaryBegin 4268874 MultipartBoundaryEnd 4268904 MimeEntityBegin 4268904 MimeEntityHeadersEnd 4269080 @@ -1483,14 +1483,14 @@ MimeMessageEnd 4270617 Octets 1537 Lines 42 MimeEntityEnd 4270617 -MultipartBoundaryBegin 4270619 +MultipartBoundaryBegin 4270617 MultipartBoundaryEnd 4270647 MimeEntityBegin 4270647 MimeEntityHeadersEnd 4270703 Octets 53 Lines 2 MimeEntityEnd 4270756 -MultipartEndBoundaryBegin 4270758 +MultipartEndBoundaryBegin 4270756 MultipartEndBoundaryEnd 4270786 MultipartEpilogueBegin 4270786 MultipartEpilogueEnd 4270786 @@ -1521,35 +1521,35 @@ MimeMessageEnd 4271987 Octets 478 Lines 14 MimeEntityEnd 4271987 -MultipartBoundaryBegin 4271989 +MultipartBoundaryBegin 4271987 MultipartBoundaryEnd 4272017 MimeEntityBegin 4272017 MimeEntityHeadersEnd 4272148 Octets 464 Lines 7 MimeEntityEnd 4272612 -MultipartBoundaryBegin 4272614 +MultipartBoundaryBegin 4272612 MultipartBoundaryEnd 4272642 MimeEntityBegin 4272642 MimeEntityHeadersEnd 4272773 Octets 492 Lines 7 MimeEntityEnd 4273265 -MultipartBoundaryBegin 4273267 +MultipartBoundaryBegin 4273265 MultipartBoundaryEnd 4273295 MimeEntityBegin 4273295 MimeEntityHeadersEnd 4273430 Octets 534 Lines 8 MimeEntityEnd 4273964 -MultipartBoundaryBegin 4273966 +MultipartBoundaryBegin 4273964 MultipartBoundaryEnd 4273994 MimeEntityBegin 4273994 MimeEntityHeadersEnd 4274127 Octets 504 Lines 7 MimeEntityEnd 4274631 -MultipartBoundaryBegin 4274633 +MultipartBoundaryBegin 4274631 MultipartBoundaryEnd 4274661 MimeEntityBegin 4274661 MimeEntityHeadersEnd 4274814 @@ -1564,7 +1564,7 @@ MimeMessageEnd 4275291 Octets 477 Lines 13 MimeEntityEnd 4275291 -MultipartBoundaryBegin 4275293 +MultipartBoundaryBegin 4275291 MultipartBoundaryEnd 4275321 MimeEntityBegin 4275321 MimeEntityHeadersEnd 4275501 @@ -1595,14 +1595,14 @@ MimeMessageEnd 4277043 Octets 1542 Lines 42 MimeEntityEnd 4277043 -MultipartBoundaryBegin 4277045 +MultipartBoundaryBegin 4277043 MultipartBoundaryEnd 4277073 MimeEntityBegin 4277073 MimeEntityHeadersEnd 4277133 Octets 53 Lines 2 MimeEntityEnd 4277186 -MultipartEndBoundaryBegin 4277188 +MultipartEndBoundaryBegin 4277186 MultipartEndBoundaryEnd 4277216 MultipartEpilogueBegin 4277216 MultipartEpilogueEnd 4277216 @@ -1625,28 +1625,28 @@ MimeEntityHeadersEnd 4278012 Octets 446 Lines 31 MimeEntityEnd 4278458 -MultipartBoundaryBegin 4278460 +MultipartBoundaryBegin 4278458 MultipartBoundaryEnd 4278467 MimeEntityBegin 4278467 MimeEntityHeadersEnd 4278543 Octets 673 Lines 43 MimeEntityEnd 4279216 -MultipartBoundaryBegin 4279218 +MultipartBoundaryBegin 4279216 MultipartBoundaryEnd 4279225 MimeEntityBegin 4279225 MimeEntityHeadersEnd 4279227 Octets 18 Lines 1 MimeEntityEnd 4279245 -MultipartBoundaryBegin 4279247 +MultipartBoundaryBegin 4279245 MultipartBoundaryEnd 4279254 MimeEntityBegin 4279254 MimeEntityHeadersEnd 4279256 Octets 11 Lines 1 MimeEntityEnd 4279267 -MultipartBoundaryBegin 4279269 +MultipartBoundaryBegin 4279267 MultipartBoundaryEnd 4279276 MimeEntityBegin 4279276 MimeEntityHeadersEnd 4279308 @@ -1663,14 +1663,14 @@ MimeEntityHeadersEnd 4279564 Octets 23 Lines 1 MimeEntityEnd 4279587 -MultipartBoundaryBegin 4279589 +MultipartBoundaryBegin 4279587 MultipartBoundaryEnd 4279596 MimeEntityBegin 4279596 MimeEntityHeadersEnd 4279776 Octets 39 Lines 2 MimeEntityEnd 4279815 -MultipartEndBoundaryBegin 4279817 +MultipartEndBoundaryBegin 4279815 MultipartEndBoundaryEnd 4279824 MultipartEpilogueBegin 4279824 MultipartEpilogueEnd 4279824 @@ -1681,28 +1681,28 @@ MimeMessageEnd 4279824 Octets 516 Lines 20 MimeEntityEnd 4279824 -MultipartBoundaryBegin 4279826 +MultipartBoundaryBegin 4279824 MultipartBoundaryEnd 4279833 MimeEntityBegin 4279833 MimeEntityHeadersEnd 4279914 Octets 9558 Lines 128 MimeEntityEnd 4289472 -MultipartBoundaryBegin 4289474 +MultipartBoundaryBegin 4289472 MultipartBoundaryEnd 4289481 MimeEntityBegin 4289481 MimeEntityHeadersEnd 4289661 Octets 39 Lines 2 MimeEntityEnd 4289700 -MultipartBoundaryBegin 4289702 +MultipartBoundaryBegin 4289700 MultipartBoundaryEnd 4289709 MimeEntityBegin 4289709 MimeEntityHeadersEnd 4289861 Octets 7948 Lines 128 MimeEntityEnd 4297809 -MultipartBoundaryBegin 4297811 +MultipartBoundaryBegin 4297809 MultipartBoundaryEnd 4297818 MimeEntityBegin 4297818 MimeEntityHeadersEnd 4297872 @@ -1723,7 +1723,7 @@ MimeMessageEnd 4297919 Octets 34 Lines 4 MimeEntityEnd 4297919 -MultipartBoundaryBegin 4297921 +MultipartBoundaryBegin 4297919 MultipartBoundaryEnd 4297932 MimeEntityBegin 4297932 MimeEntityHeadersEnd 4297934 @@ -1738,7 +1738,7 @@ MimeMessageEnd 4297968 Octets 34 Lines 4 MimeEntityEnd 4297968 -MultipartBoundaryBegin 4297970 +MultipartBoundaryBegin 4297968 MultipartBoundaryEnd 4297981 MimeEntityBegin 4297981 MimeEntityHeadersEnd 4297983 @@ -1753,14 +1753,14 @@ MimeMessageEnd 4298017 Octets 34 Lines 4 MimeEntityEnd 4298017 -MultipartBoundaryBegin 4298019 +MultipartBoundaryBegin 4298017 MultipartBoundaryEnd 4298030 MimeEntityBegin 4298030 MimeEntityHeadersEnd 4298057 Octets 83 Lines 2 MimeEntityEnd 4298140 -MultipartBoundaryBegin 4298142 +MultipartBoundaryBegin 4298140 MultipartBoundaryEnd 4298153 MimeEntityBegin 4298153 MimeEntityHeadersEnd 4298155 @@ -1775,7 +1775,7 @@ MimeMessageEnd 4298262 Octets 107 Lines 5 MimeEntityEnd 4298262 -MultipartBoundaryBegin 4298264 +MultipartBoundaryBegin 4298262 MultipartBoundaryEnd 4298275 MimeEntityBegin 4298275 MimeEntityHeadersEnd 4298277 @@ -1790,14 +1790,14 @@ MimeMessageEnd 4298311 Octets 34 Lines 4 MimeEntityEnd 4298311 -MultipartEndBoundaryBegin 4298313 +MultipartEndBoundaryBegin 4298311 MultipartEndBoundaryEnd 4298324 MultipartEpilogueBegin 4298324 MultipartEpilogueEnd 4298324 Octets 452 Lines 37 MimeEntityEnd 4298324 -MultipartEndBoundaryBegin 4298326 +MultipartEndBoundaryBegin 4298324 MultipartEndBoundaryEnd 4298333 MultipartEpilogueBegin 4298333 MultipartEpilogueEnd 4298376 @@ -1820,21 +1820,21 @@ MimeEntityHeadersEnd 4299092 Octets 1246 Lines 27 MimeEntityEnd 4300338 -MultipartBoundaryBegin 4300340 +MultipartBoundaryBegin 4300338 MultipartBoundaryEnd 4300367 MimeEntityBegin 4300367 MimeEntityHeadersEnd 4300517 Octets 71686 Lines 370 MimeEntityEnd 4372203 -MultipartBoundaryBegin 4372205 +MultipartBoundaryBegin 4372203 MultipartBoundaryEnd 4372232 MimeEntityBegin 4372232 MimeEntityHeadersEnd 4372234 Octets 0 Lines 1 MimeEntityEnd 4372234 -MultipartEndBoundaryBegin 4372236 +MultipartEndBoundaryBegin 4372234 MultipartEndBoundaryEnd 4372263 MultipartEpilogueBegin 4372263 MultipartEpilogueEnd 4372265 @@ -1867,49 +1867,49 @@ MimeEntityHeadersEnd 4626981 Octets 473 Lines 10 MimeEntityEnd 4627454 -MultipartBoundaryBegin 4627456 +MultipartBoundaryBegin 4627454 MultipartBoundaryEnd 4627502 MimeEntityBegin 4627502 MimeEntityHeadersEnd 4627564 Octets 24568 Lines 333 MimeEntityEnd 4652132 -MultipartBoundaryBegin 4652134 +MultipartBoundaryBegin 4652132 MultipartBoundaryEnd 4652180 MimeEntityBegin 4652180 MimeEntityHeadersEnd 4652256 Octets 458 Lines 11 MimeEntityEnd 4652714 -MultipartBoundaryBegin 4652716 +MultipartBoundaryBegin 4652714 MultipartBoundaryEnd 4652762 MimeEntityBegin 4652762 MimeEntityHeadersEnd 4652824 Octets 11368 Lines 155 MimeEntityEnd 4664192 -MultipartBoundaryBegin 4664194 +MultipartBoundaryBegin 4664192 MultipartBoundaryEnd 4664240 MimeEntityBegin 4664240 MimeEntityHeadersEnd 4664316 Octets 310 Lines 7 MimeEntityEnd 4664626 -MultipartBoundaryBegin 4664628 +MultipartBoundaryBegin 4664626 MultipartBoundaryEnd 4664674 MimeEntityBegin 4664674 MimeEntityHeadersEnd 4664736 Octets 16676 Lines 227 MimeEntityEnd 4681412 -MultipartBoundaryBegin 4681414 +MultipartBoundaryBegin 4681412 MultipartBoundaryEnd 4681460 MimeEntityBegin 4681460 MimeEntityHeadersEnd 4681536 Octets 675 Lines 16 MimeEntityEnd 4682211 -MultipartEndBoundaryBegin 4682213 +MultipartEndBoundaryBegin 4682211 MultipartEndBoundaryEnd 4682259 MultipartEpilogueBegin 4682259 MultipartEpilogueEnd 4682261 @@ -1932,14 +1932,14 @@ MimeEntityHeadersEnd 4683139 Octets 668 Lines 19 MimeEntityEnd 4683807 -MultipartBoundaryBegin 4683809 +MultipartBoundaryBegin 4683807 MultipartBoundaryEnd 4683839 MimeEntityBegin 4683839 MimeEntityHeadersEnd 4683902 Octets 47214 Lines 762 MimeEntityEnd 4731116 -MultipartEndBoundaryBegin 4731118 +MultipartEndBoundaryBegin 4731116 MultipartEndBoundaryEnd 4731148 MultipartEpilogueBegin 4731148 MultipartEpilogueEnd 4731150 @@ -1962,35 +1962,35 @@ MimeEntityHeadersEnd 4732463 Octets 5475 Lines 161 MimeEntityEnd 4737938 -MultipartBoundaryBegin 4737940 +MultipartBoundaryBegin 4737938 MultipartBoundaryEnd 4737964 MimeEntityBegin 4737964 MimeEntityHeadersEnd 4738065 Octets 2616 Lines 37 MimeEntityEnd 4740681 -MultipartBoundaryBegin 4740683 +MultipartBoundaryBegin 4740681 MultipartBoundaryEnd 4740707 MimeEntityBegin 4740707 MimeEntityHeadersEnd 4740783 Octets 528 Lines 11 MimeEntityEnd 4741311 -MultipartBoundaryBegin 4741313 +MultipartBoundaryBegin 4741311 MultipartBoundaryEnd 4741337 MimeEntityBegin 4741337 MimeEntityHeadersEnd 4741455 Octets 23376 Lines 317 MimeEntityEnd 4764831 -MultipartBoundaryBegin 4764833 +MultipartBoundaryBegin 4764831 MultipartBoundaryEnd 4764857 MimeEntityBegin 4764857 MimeEntityHeadersEnd 4764933 Octets 592 Lines 15 MimeEntityEnd 4765525 -MultipartBoundaryBegin 4765527 +MultipartBoundaryBegin 4765525 MultipartBoundaryEnd 4765551 MimeEntityBegin 4765551 MimeEntityHeadersEnd 4765640 @@ -2005,14 +2005,14 @@ MimeMessageEnd 4765711 Octets 71 Lines 3 MimeEntityEnd 4765711 -MultipartBoundaryBegin 4765713 +MultipartBoundaryBegin 4765711 MultipartBoundaryEnd 4765737 MimeEntityBegin 4765737 MimeEntityHeadersEnd 4765813 Octets 281 Lines 6 MimeEntityEnd 4766094 -MultipartBoundaryBegin 4766096 +MultipartBoundaryBegin 4766094 MultipartBoundaryEnd 4766120 MimeEntityBegin 4766120 MimeEntityHeadersEnd 4766273 @@ -2027,14 +2027,14 @@ MimeMessageEnd 4766344 Octets 71 Lines 3 MimeEntityEnd 4766344 -MultipartBoundaryBegin 4766346 +MultipartBoundaryBegin 4766344 MultipartBoundaryEnd 4766370 MimeEntityBegin 4766370 MimeEntityHeadersEnd 4766446 Octets 1103 Lines 35 MimeEntityEnd 4767549 -MultipartEndBoundaryBegin 4767551 +MultipartEndBoundaryBegin 4767549 MultipartEndBoundaryEnd 4767575 MultipartEpilogueBegin 4767575 MultipartEpilogueEnd 4767575 @@ -2057,14 +2057,14 @@ MimeEntityHeadersEnd 4767838 Octets 77489 Lines 1146 MimeEntityEnd 4845327 -MultipartBoundaryBegin 4845329 +MultipartBoundaryBegin 4845327 MultipartBoundaryEnd 4845342 MimeEntityBegin 4845342 MimeEntityHeadersEnd 4845344 Octets 30 Lines 1 MimeEntityEnd 4845374 -MultipartEndBoundaryBegin 4845376 +MultipartEndBoundaryBegin 4845374 MultipartEndBoundaryEnd 4845389 MultipartEpilogueBegin 4845389 MultipartEpilogueEnd 4845389 @@ -2087,14 +2087,14 @@ MimeEntityHeadersEnd 4846723 Octets 460 Lines 9 MimeEntityEnd 4847183 -MultipartBoundaryBegin 4847185 +MultipartBoundaryBegin 4847183 MultipartBoundaryEnd 4847224 MimeEntityBegin 4847224 MimeEntityHeadersEnd 4847321 Octets 129838 Lines 2096 MimeEntityEnd 4977159 -MultipartEndBoundaryBegin 4977161 +MultipartEndBoundaryBegin 4977159 MultipartEndBoundaryEnd 4977200 MultipartEpilogueBegin 4977200 MultipartEpilogueEnd 4977202 @@ -2117,7 +2117,7 @@ MimeEntityHeadersEnd 4978388 Octets 813 Lines 19 MimeEntityEnd 4979201 -MultipartBoundaryBegin 4979203 +MultipartBoundaryBegin 4979201 MultipartBoundaryEnd 4979262 MimeEntityBegin 4979262 MimeEntityHeadersEnd 4979368 @@ -2130,56 +2130,56 @@ MimeEntityHeadersEnd 4979505 Octets 496 Lines 8 MimeEntityEnd 4980001 -MultipartBoundaryBegin 4980003 +MultipartBoundaryBegin 4980001 MultipartBoundaryEnd 4980064 MimeEntityBegin 4980064 MimeEntityHeadersEnd 4980164 Octets 13180 Lines 191 MimeEntityEnd 4993344 -MultipartBoundaryBegin 4993346 +MultipartBoundaryBegin 4993344 MultipartBoundaryEnd 4993407 MimeEntityBegin 4993407 MimeEntityHeadersEnd 4993480 Octets 21 Lines 2 MimeEntityEnd 4993501 -MultipartBoundaryBegin 4993503 +MultipartBoundaryBegin 4993501 MultipartBoundaryEnd 4993564 MimeEntityBegin 4993564 MimeEntityHeadersEnd 4993664 Octets 56484 Lines 765 MimeEntityEnd 5050148 -MultipartBoundaryBegin 5050150 +MultipartBoundaryBegin 5050148 MultipartBoundaryEnd 5050211 MimeEntityBegin 5050211 MimeEntityHeadersEnd 5050284 Octets 57 Lines 6 MimeEntityEnd 5050341 -MultipartBoundaryBegin 5050343 +MultipartBoundaryBegin 5050341 MultipartBoundaryEnd 5050404 MimeEntityBegin 5050404 MimeEntityHeadersEnd 5050468 Octets 103552 Lines 1401 MimeEntityEnd 5154020 -MultipartBoundaryBegin 5154022 +MultipartBoundaryBegin 5154020 MultipartBoundaryEnd 5154083 MimeEntityBegin 5154083 MimeEntityHeadersEnd 5154156 Octets 4 Lines 3 MimeEntityEnd 5154160 -MultipartEndBoundaryBegin 5154162 +MultipartEndBoundaryBegin 5154160 MultipartEndBoundaryEnd 5154223 MultipartEpilogueBegin 5154223 MultipartEpilogueEnd 5154225 Octets 174857 Lines 2408 MimeEntityEnd 5154225 -MultipartEndBoundaryBegin 5154227 +MultipartEndBoundaryBegin 5154225 MultipartEndBoundaryEnd 5154286 MultipartEpilogueBegin 5154286 MultipartEpilogueEnd 5154286 @@ -2202,7 +2202,7 @@ MimeEntityHeadersEnd 5155244 Octets 1544 Lines 30 MimeEntityEnd 5156788 -MultipartBoundaryBegin 5156790 +MultipartBoundaryBegin 5156788 MultipartBoundaryEnd 5156831 MimeEntityBegin 5156831 MimeEntityHeadersEnd 5156919 @@ -2215,112 +2215,112 @@ MimeEntityHeadersEnd 5157056 Octets 920 Lines 14 MimeEntityEnd 5157976 -MultipartBoundaryBegin 5157978 +MultipartBoundaryBegin 5157976 MultipartBoundaryEnd 5158021 MimeEntityBegin 5158021 MimeEntityHeadersEnd 5158116 Octets 35364 Lines 507 MimeEntityEnd 5193480 -MultipartBoundaryBegin 5193482 +MultipartBoundaryBegin 5193480 MultipartBoundaryEnd 5193525 MimeEntityBegin 5193525 MimeEntityHeadersEnd 5193619 Octets 12 Lines 3 MimeEntityEnd 5193631 -MultipartBoundaryBegin 5193633 +MultipartBoundaryBegin 5193631 MultipartBoundaryEnd 5193676 MimeEntityBegin 5193676 MimeEntityHeadersEnd 5193771 Octets 21644 Lines 311 MimeEntityEnd 5215415 -MultipartBoundaryBegin 5215417 +MultipartBoundaryBegin 5215415 MultipartBoundaryEnd 5215460 MimeEntityBegin 5215460 MimeEntityHeadersEnd 5215554 Octets 12 Lines 3 MimeEntityEnd 5215566 -MultipartBoundaryBegin 5215568 +MultipartBoundaryBegin 5215566 MultipartBoundaryEnd 5215611 MimeEntityBegin 5215611 MimeEntityHeadersEnd 5215706 Octets 32914 Lines 472 MimeEntityEnd 5248620 -MultipartBoundaryBegin 5248622 +MultipartBoundaryBegin 5248620 MultipartBoundaryEnd 5248665 MimeEntityBegin 5248665 MimeEntityHeadersEnd 5248759 Octets 12 Lines 3 MimeEntityEnd 5248771 -MultipartBoundaryBegin 5248773 +MultipartBoundaryBegin 5248771 MultipartBoundaryEnd 5248816 MimeEntityBegin 5248816 MimeEntityHeadersEnd 5248911 Octets 33926 Lines 486 MimeEntityEnd 5282837 -MultipartBoundaryBegin 5282839 +MultipartBoundaryBegin 5282837 MultipartBoundaryEnd 5282882 MimeEntityBegin 5282882 MimeEntityHeadersEnd 5282976 Octets 12 Lines 3 MimeEntityEnd 5282988 -MultipartBoundaryBegin 5282990 +MultipartBoundaryBegin 5282988 MultipartBoundaryEnd 5283033 MimeEntityBegin 5283033 MimeEntityHeadersEnd 5283128 Octets 28240 Lines 405 MimeEntityEnd 5311368 -MultipartBoundaryBegin 5311370 +MultipartBoundaryBegin 5311368 MultipartBoundaryEnd 5311413 MimeEntityBegin 5311413 MimeEntityHeadersEnd 5311507 Octets 12 Lines 3 MimeEntityEnd 5311519 -MultipartBoundaryBegin 5311521 +MultipartBoundaryBegin 5311519 MultipartBoundaryEnd 5311564 MimeEntityBegin 5311564 MimeEntityHeadersEnd 5311659 Octets 33980 Lines 487 MimeEntityEnd 5345639 -MultipartBoundaryBegin 5345641 +MultipartBoundaryBegin 5345639 MultipartBoundaryEnd 5345684 MimeEntityBegin 5345684 MimeEntityHeadersEnd 5345778 Octets 12 Lines 3 MimeEntityEnd 5345790 -MultipartBoundaryBegin 5345792 +MultipartBoundaryBegin 5345790 MultipartBoundaryEnd 5345835 MimeEntityBegin 5345835 MimeEntityHeadersEnd 5345930 Octets 27046 Lines 388 MimeEntityEnd 5372976 -MultipartBoundaryBegin 5372978 +MultipartBoundaryBegin 5372976 MultipartBoundaryEnd 5373021 MimeEntityBegin 5373021 MimeEntityHeadersEnd 5373115 Octets 77 Lines 4 MimeEntityEnd 5373192 -MultipartEndBoundaryBegin 5373194 +MultipartEndBoundaryBegin 5373192 MultipartEndBoundaryEnd 5373237 MultipartEpilogueBegin 5373237 MultipartEpilogueEnd 5373239 Octets 216320 Lines 3161 MimeEntityEnd 5373239 -MultipartEndBoundaryBegin 5373241 +MultipartEndBoundaryBegin 5373239 MultipartEndBoundaryEnd 5373282 MultipartEpilogueBegin 5373282 MultipartEpilogueEnd 5373282 @@ -2343,21 +2343,21 @@ MimeEntityHeadersEnd 5374045 Octets 212 Lines 10 MimeEntityEnd 5374257 -MultipartBoundaryBegin 5374259 +MultipartBoundaryBegin 5374257 MultipartBoundaryEnd 5374309 MimeEntityBegin 5374309 MimeEntityHeadersEnd 5374373 Octets 89812 Lines 1215 MimeEntityEnd 5464185 -MultipartBoundaryBegin 5464187 +MultipartBoundaryBegin 5464185 MultipartBoundaryEnd 5464237 MimeEntityBegin 5464237 MimeEntityHeadersEnd 5464265 Octets 31 Lines 2 MimeEntityEnd 5464296 -MultipartEndBoundaryBegin 5464298 +MultipartEndBoundaryBegin 5464296 MultipartEndBoundaryEnd 5464348 MultipartEpilogueBegin 5464348 MultipartEpilogueEnd 5464350 @@ -2390,7 +2390,7 @@ MimeEntityHeadersEnd 5517383 Octets 4418 Lines 102 MimeEntityEnd 5521801 -MultipartBoundaryBegin 5521803 +MultipartBoundaryBegin 5521801 MultipartBoundaryEnd 5521822 MimeEntityBegin 5521822 MimeEntityHeadersEnd 5521966 @@ -2411,7 +2411,7 @@ MimeMessageEnd 5522748 Octets 748 Lines 23 MimeEntityEnd 5522748 -MultipartBoundaryBegin 5522750 +MultipartBoundaryBegin 5522748 MultipartBoundaryEnd 5522782 MimeEntityBegin 5522782 MimeEntityHeadersEnd 5522784 @@ -2426,7 +2426,7 @@ MimeMessageEnd 5523662 Octets 878 Lines 25 MimeEntityEnd 5523662 -MultipartBoundaryBegin 5523664 +MultipartBoundaryBegin 5523662 MultipartBoundaryEnd 5523696 MimeEntityBegin 5523696 MimeEntityHeadersEnd 5523698 @@ -2441,7 +2441,7 @@ MimeMessageEnd 5524481 Octets 783 Lines 19 MimeEntityEnd 5524481 -MultipartBoundaryBegin 5524483 +MultipartBoundaryBegin 5524481 MultipartBoundaryEnd 5524515 MimeEntityBegin 5524515 MimeEntityHeadersEnd 5524517 @@ -2456,7 +2456,7 @@ MimeMessageEnd 5525170 Octets 653 Lines 15 MimeEntityEnd 5525170 -MultipartBoundaryBegin 5525172 +MultipartBoundaryBegin 5525170 MultipartBoundaryEnd 5525204 MimeEntityBegin 5525204 MimeEntityHeadersEnd 5525206 @@ -2471,7 +2471,7 @@ MimeMessageEnd 5525951 Octets 745 Lines 20 MimeEntityEnd 5525951 -MultipartBoundaryBegin 5525953 +MultipartBoundaryBegin 5525951 MultipartBoundaryEnd 5525985 MimeEntityBegin 5525985 MimeEntityHeadersEnd 5525987 @@ -2486,7 +2486,7 @@ MimeMessageEnd 5527449 Octets 1462 Lines 31 MimeEntityEnd 5527449 -MultipartBoundaryBegin 5527451 +MultipartBoundaryBegin 5527449 MultipartBoundaryEnd 5527483 MimeEntityBegin 5527483 MimeEntityHeadersEnd 5527485 @@ -2501,7 +2501,7 @@ MimeMessageEnd 5528052 Octets 567 Lines 14 MimeEntityEnd 5528052 -MultipartBoundaryBegin 5528054 +MultipartBoundaryBegin 5528052 MultipartBoundaryEnd 5528086 MimeEntityBegin 5528086 MimeEntityHeadersEnd 5528088 @@ -2516,7 +2516,7 @@ MimeMessageEnd 5528642 Octets 554 Lines 12 MimeEntityEnd 5528642 -MultipartBoundaryBegin 5528644 +MultipartBoundaryBegin 5528642 MultipartBoundaryEnd 5528676 MimeEntityBegin 5528676 MimeEntityHeadersEnd 5528678 @@ -2531,7 +2531,7 @@ MimeMessageEnd 5529476 Octets 798 Lines 16 MimeEntityEnd 5529476 -MultipartBoundaryBegin 5529478 +MultipartBoundaryBegin 5529476 MultipartBoundaryEnd 5529510 MimeEntityBegin 5529510 MimeEntityHeadersEnd 5529512 @@ -2546,7 +2546,7 @@ MimeMessageEnd 5530649 Octets 1137 Lines 24 MimeEntityEnd 5530649 -MultipartBoundaryBegin 5530651 +MultipartBoundaryBegin 5530649 MultipartBoundaryEnd 5530683 MimeEntityBegin 5530683 MimeEntityHeadersEnd 5530685 @@ -2561,7 +2561,7 @@ MimeMessageEnd 5531753 Octets 1068 Lines 32 MimeEntityEnd 5531753 -MultipartBoundaryBegin 5531755 +MultipartBoundaryBegin 5531753 MultipartBoundaryEnd 5531787 MimeEntityBegin 5531787 MimeEntityHeadersEnd 5531789 @@ -2576,7 +2576,7 @@ MimeMessageEnd 5532494 Octets 705 Lines 16 MimeEntityEnd 5532494 -MultipartBoundaryBegin 5532496 +MultipartBoundaryBegin 5532494 MultipartBoundaryEnd 5532528 MimeEntityBegin 5532528 MimeEntityHeadersEnd 5532530 @@ -2591,7 +2591,7 @@ MimeMessageEnd 5533113 Octets 583 Lines 15 MimeEntityEnd 5533113 -MultipartBoundaryBegin 5533115 +MultipartBoundaryBegin 5533113 MultipartBoundaryEnd 5533147 MimeEntityBegin 5533147 MimeEntityHeadersEnd 5533149 @@ -2606,7 +2606,7 @@ MimeMessageEnd 5533837 Octets 688 Lines 20 MimeEntityEnd 5533837 -MultipartBoundaryBegin 5533839 +MultipartBoundaryBegin 5533837 MultipartBoundaryEnd 5533871 MimeEntityBegin 5533871 MimeEntityHeadersEnd 5533873 @@ -2621,7 +2621,7 @@ MimeMessageEnd 5534185 Octets 312 Lines 13 MimeEntityEnd 5534185 -MultipartBoundaryBegin 5534187 +MultipartBoundaryBegin 5534185 MultipartBoundaryEnd 5534219 MimeEntityBegin 5534219 MimeEntityHeadersEnd 5534221 @@ -2636,7 +2636,7 @@ MimeMessageEnd 5534677 Octets 456 Lines 12 MimeEntityEnd 5534677 -MultipartBoundaryBegin 5534679 +MultipartBoundaryBegin 5534677 MultipartBoundaryEnd 5534711 MimeEntityBegin 5534711 MimeEntityHeadersEnd 5534713 @@ -2651,7 +2651,7 @@ MimeMessageEnd 5535528 Octets 815 Lines 26 MimeEntityEnd 5535528 -MultipartBoundaryBegin 5535530 +MultipartBoundaryBegin 5535528 MultipartBoundaryEnd 5535562 MimeEntityBegin 5535562 MimeEntityHeadersEnd 5535564 @@ -2666,7 +2666,7 @@ MimeMessageEnd 5535799 Octets 235 Lines 10 MimeEntityEnd 5535799 -MultipartBoundaryBegin 5535801 +MultipartBoundaryBegin 5535799 MultipartBoundaryEnd 5535833 MimeEntityBegin 5535833 MimeEntityHeadersEnd 5535835 @@ -2681,7 +2681,7 @@ MimeMessageEnd 5536838 Octets 1003 Lines 26 MimeEntityEnd 5536838 -MultipartBoundaryBegin 5536840 +MultipartBoundaryBegin 5536838 MultipartBoundaryEnd 5536872 MimeEntityBegin 5536872 MimeEntityHeadersEnd 5536874 @@ -2696,7 +2696,7 @@ MimeMessageEnd 5537416 Octets 542 Lines 14 MimeEntityEnd 5537416 -MultipartBoundaryBegin 5537418 +MultipartBoundaryBegin 5537416 MultipartBoundaryEnd 5537450 MimeEntityBegin 5537450 MimeEntityHeadersEnd 5537452 @@ -2711,7 +2711,7 @@ MimeMessageEnd 5537867 Octets 415 Lines 14 MimeEntityEnd 5537867 -MultipartBoundaryBegin 5537869 +MultipartBoundaryBegin 5537867 MultipartBoundaryEnd 5537901 MimeEntityBegin 5537901 MimeEntityHeadersEnd 5537903 @@ -2726,7 +2726,7 @@ MimeMessageEnd 5538444 Octets 541 Lines 17 MimeEntityEnd 5538444 -MultipartBoundaryBegin 5538446 +MultipartBoundaryBegin 5538444 MultipartBoundaryEnd 5538478 MimeEntityBegin 5538478 MimeEntityHeadersEnd 5538480 @@ -2741,7 +2741,7 @@ MimeMessageEnd 5539533 Octets 1053 Lines 33 MimeEntityEnd 5539533 -MultipartBoundaryBegin 5539535 +MultipartBoundaryBegin 5539533 MultipartBoundaryEnd 5539567 MimeEntityBegin 5539567 MimeEntityHeadersEnd 5539569 @@ -2756,7 +2756,7 @@ MimeMessageEnd 5540001 Octets 432 Lines 14 MimeEntityEnd 5540001 -MultipartBoundaryBegin 5540003 +MultipartBoundaryBegin 5540001 MultipartBoundaryEnd 5540035 MimeEntityBegin 5540035 MimeEntityHeadersEnd 5540037 @@ -2771,7 +2771,7 @@ MimeMessageEnd 5540594 Octets 557 Lines 19 MimeEntityEnd 5540594 -MultipartBoundaryBegin 5540596 +MultipartBoundaryBegin 5540594 MultipartBoundaryEnd 5540628 MimeEntityBegin 5540628 MimeEntityHeadersEnd 5540630 @@ -2786,7 +2786,7 @@ MimeMessageEnd 5540898 Octets 268 Lines 9 MimeEntityEnd 5540898 -MultipartBoundaryBegin 5540900 +MultipartBoundaryBegin 5540898 MultipartBoundaryEnd 5540932 MimeEntityBegin 5540932 MimeEntityHeadersEnd 5540934 @@ -2801,7 +2801,7 @@ MimeMessageEnd 5541249 Octets 315 Lines 12 MimeEntityEnd 5541249 -MultipartBoundaryBegin 5541251 +MultipartBoundaryBegin 5541249 MultipartBoundaryEnd 5541283 MimeEntityBegin 5541283 MimeEntityHeadersEnd 5541285 @@ -2816,7 +2816,7 @@ MimeMessageEnd 5542149 Octets 864 Lines 19 MimeEntityEnd 5542149 -MultipartBoundaryBegin 5542151 +MultipartBoundaryBegin 5542149 MultipartBoundaryEnd 5542183 MimeEntityBegin 5542183 MimeEntityHeadersEnd 5542185 @@ -2831,7 +2831,7 @@ MimeMessageEnd 5543318 Octets 1133 Lines 31 MimeEntityEnd 5543318 -MultipartBoundaryBegin 5543320 +MultipartBoundaryBegin 5543318 MultipartBoundaryEnd 5543352 MimeEntityBegin 5543352 MimeEntityHeadersEnd 5543354 @@ -2846,7 +2846,7 @@ MimeMessageEnd 5543746 Octets 392 Lines 12 MimeEntityEnd 5543746 -MultipartBoundaryBegin 5543748 +MultipartBoundaryBegin 5543746 MultipartBoundaryEnd 5543780 MimeEntityBegin 5543780 MimeEntityHeadersEnd 5543782 @@ -2861,7 +2861,7 @@ MimeMessageEnd 5544041 Octets 259 Lines 11 MimeEntityEnd 5544041 -MultipartBoundaryBegin 5544043 +MultipartBoundaryBegin 5544041 MultipartBoundaryEnd 5544075 MimeEntityBegin 5544075 MimeEntityHeadersEnd 5544077 @@ -2876,7 +2876,7 @@ MimeMessageEnd 5545018 Octets 941 Lines 22 MimeEntityEnd 5545018 -MultipartBoundaryBegin 5545020 +MultipartBoundaryBegin 5545018 MultipartBoundaryEnd 5545052 MimeEntityBegin 5545052 MimeEntityHeadersEnd 5545054 @@ -2891,7 +2891,7 @@ MimeMessageEnd 5545633 Octets 579 Lines 21 MimeEntityEnd 5545633 -MultipartBoundaryBegin 5545635 +MultipartBoundaryBegin 5545633 MultipartBoundaryEnd 5545667 MimeEntityBegin 5545667 MimeEntityHeadersEnd 5545669 @@ -2906,7 +2906,7 @@ MimeMessageEnd 5547113 Octets 1444 Lines 26 MimeEntityEnd 5547113 -MultipartBoundaryBegin 5547115 +MultipartBoundaryBegin 5547113 MultipartBoundaryEnd 5547147 MimeEntityBegin 5547147 MimeEntityHeadersEnd 5547149 @@ -2921,7 +2921,7 @@ MimeMessageEnd 5547408 Octets 259 Lines 11 MimeEntityEnd 5547408 -MultipartBoundaryBegin 5547410 +MultipartBoundaryBegin 5547408 MultipartBoundaryEnd 5547442 MimeEntityBegin 5547442 MimeEntityHeadersEnd 5547444 @@ -2936,7 +2936,7 @@ MimeMessageEnd 5547895 Octets 451 Lines 16 MimeEntityEnd 5547895 -MultipartBoundaryBegin 5547897 +MultipartBoundaryBegin 5547895 MultipartBoundaryEnd 5547929 MimeEntityBegin 5547929 MimeEntityHeadersEnd 5547931 @@ -2951,7 +2951,7 @@ MimeMessageEnd 5548254 Octets 323 Lines 11 MimeEntityEnd 5548254 -MultipartBoundaryBegin 5548256 +MultipartBoundaryBegin 5548254 MultipartBoundaryEnd 5548288 MimeEntityBegin 5548288 MimeEntityHeadersEnd 5548290 @@ -2966,7 +2966,7 @@ MimeMessageEnd 5548809 Octets 519 Lines 17 MimeEntityEnd 5548809 -MultipartBoundaryBegin 5548811 +MultipartBoundaryBegin 5548809 MultipartBoundaryEnd 5548843 MimeEntityBegin 5548843 MimeEntityHeadersEnd 5548845 @@ -2981,7 +2981,7 @@ MimeMessageEnd 5549293 Octets 448 Lines 13 MimeEntityEnd 5549293 -MultipartBoundaryBegin 5549295 +MultipartBoundaryBegin 5549293 MultipartBoundaryEnd 5549327 MimeEntityBegin 5549327 MimeEntityHeadersEnd 5549329 @@ -2996,7 +2996,7 @@ MimeMessageEnd 5550111 Octets 782 Lines 22 MimeEntityEnd 5550111 -MultipartBoundaryBegin 5550113 +MultipartBoundaryBegin 5550111 MultipartBoundaryEnd 5550145 MimeEntityBegin 5550145 MimeEntityHeadersEnd 5550147 @@ -3011,7 +3011,7 @@ MimeMessageEnd 5550789 Octets 642 Lines 15 MimeEntityEnd 5550789 -MultipartBoundaryBegin 5550791 +MultipartBoundaryBegin 5550789 MultipartBoundaryEnd 5550823 MimeEntityBegin 5550823 MimeEntityHeadersEnd 5550825 @@ -3026,7 +3026,7 @@ MimeMessageEnd 5552161 Octets 1336 Lines 32 MimeEntityEnd 5552161 -MultipartBoundaryBegin 5552163 +MultipartBoundaryBegin 5552161 MultipartBoundaryEnd 5552195 MimeEntityBegin 5552195 MimeEntityHeadersEnd 5552197 @@ -3041,7 +3041,7 @@ MimeMessageEnd 5552644 Octets 447 Lines 13 MimeEntityEnd 5552644 -MultipartBoundaryBegin 5552646 +MultipartBoundaryBegin 5552644 MultipartBoundaryEnd 5552678 MimeEntityBegin 5552678 MimeEntityHeadersEnd 5552680 @@ -3056,7 +3056,7 @@ MimeMessageEnd 5552996 Octets 316 Lines 9 MimeEntityEnd 5552996 -MultipartBoundaryBegin 5552998 +MultipartBoundaryBegin 5552996 MultipartBoundaryEnd 5553030 MimeEntityBegin 5553030 MimeEntityHeadersEnd 5553032 @@ -3071,7 +3071,7 @@ MimeMessageEnd 5554065 Octets 1033 Lines 29 MimeEntityEnd 5554065 -MultipartBoundaryBegin 5554067 +MultipartBoundaryBegin 5554065 MultipartBoundaryEnd 5554099 MimeEntityBegin 5554099 MimeEntityHeadersEnd 5554101 @@ -3086,7 +3086,7 @@ MimeMessageEnd 5554955 Octets 854 Lines 16 MimeEntityEnd 5554955 -MultipartBoundaryBegin 5554957 +MultipartBoundaryBegin 5554955 MultipartBoundaryEnd 5554989 MimeEntityBegin 5554989 MimeEntityHeadersEnd 5554991 @@ -3101,7 +3101,7 @@ MimeMessageEnd 5555827 Octets 836 Lines 22 MimeEntityEnd 5555827 -MultipartBoundaryBegin 5555829 +MultipartBoundaryBegin 5555827 MultipartBoundaryEnd 5555861 MimeEntityBegin 5555861 MimeEntityHeadersEnd 5555863 @@ -3116,7 +3116,7 @@ MimeMessageEnd 5556390 Octets 527 Lines 16 MimeEntityEnd 5556390 -MultipartBoundaryBegin 5556392 +MultipartBoundaryBegin 5556390 MultipartBoundaryEnd 5556424 MimeEntityBegin 5556424 MimeEntityHeadersEnd 5556426 @@ -3131,7 +3131,7 @@ MimeMessageEnd 5557567 Octets 1141 Lines 29 MimeEntityEnd 5557567 -MultipartBoundaryBegin 5557569 +MultipartBoundaryBegin 5557567 MultipartBoundaryEnd 5557601 MimeEntityBegin 5557601 MimeEntityHeadersEnd 5557603 @@ -3146,7 +3146,7 @@ MimeMessageEnd 5558229 Octets 626 Lines 15 MimeEntityEnd 5558229 -MultipartBoundaryBegin 5558231 +MultipartBoundaryBegin 5558229 MultipartBoundaryEnd 5558263 MimeEntityBegin 5558263 MimeEntityHeadersEnd 5558265 @@ -3161,7 +3161,7 @@ MimeMessageEnd 5558691 Octets 426 Lines 15 MimeEntityEnd 5558691 -MultipartBoundaryBegin 5558693 +MultipartBoundaryBegin 5558691 MultipartBoundaryEnd 5558725 MimeEntityBegin 5558725 MimeEntityHeadersEnd 5558727 @@ -3176,7 +3176,7 @@ MimeMessageEnd 5559142 Octets 415 Lines 9 MimeEntityEnd 5559142 -MultipartBoundaryBegin 5559144 +MultipartBoundaryBegin 5559142 MultipartBoundaryEnd 5559176 MimeEntityBegin 5559176 MimeEntityHeadersEnd 5559178 @@ -3191,7 +3191,7 @@ MimeMessageEnd 5559973 Octets 795 Lines 32 MimeEntityEnd 5559973 -MultipartBoundaryBegin 5559975 +MultipartBoundaryBegin 5559973 MultipartBoundaryEnd 5560007 MimeEntityBegin 5560007 MimeEntityHeadersEnd 5560009 @@ -3206,7 +3206,7 @@ MimeMessageEnd 5562461 Octets 2452 Lines 51 MimeEntityEnd 5562461 -MultipartBoundaryBegin 5562463 +MultipartBoundaryBegin 5562461 MultipartBoundaryEnd 5562495 MimeEntityBegin 5562495 MimeEntityHeadersEnd 5562497 @@ -3221,7 +3221,7 @@ MimeMessageEnd 5563432 Octets 935 Lines 22 MimeEntityEnd 5563432 -MultipartBoundaryBegin 5563434 +MultipartBoundaryBegin 5563432 MultipartBoundaryEnd 5563466 MimeEntityBegin 5563466 MimeEntityHeadersEnd 5563468 @@ -3236,7 +3236,7 @@ MimeMessageEnd 5563802 Octets 334 Lines 15 MimeEntityEnd 5563802 -MultipartBoundaryBegin 5563804 +MultipartBoundaryBegin 5563802 MultipartBoundaryEnd 5563836 MimeEntityBegin 5563836 MimeEntityHeadersEnd 5563838 @@ -3251,7 +3251,7 @@ MimeMessageEnd 5564651 Octets 813 Lines 25 MimeEntityEnd 5564651 -MultipartBoundaryBegin 5564653 +MultipartBoundaryBegin 5564651 MultipartBoundaryEnd 5564685 MimeEntityBegin 5564685 MimeEntityHeadersEnd 5564687 @@ -3266,7 +3266,7 @@ MimeMessageEnd 5567416 Octets 2729 Lines 73 MimeEntityEnd 5567416 -MultipartBoundaryBegin 5567418 +MultipartBoundaryBegin 5567416 MultipartBoundaryEnd 5567450 MimeEntityBegin 5567450 MimeEntityHeadersEnd 5567452 @@ -3281,7 +3281,7 @@ MimeMessageEnd 5568805 Octets 1353 Lines 39 MimeEntityEnd 5568805 -MultipartBoundaryBegin 5568807 +MultipartBoundaryBegin 5568805 MultipartBoundaryEnd 5568839 MimeEntityBegin 5568839 MimeEntityHeadersEnd 5568841 @@ -3296,7 +3296,7 @@ MimeMessageEnd 5570791 Octets 1950 Lines 48 MimeEntityEnd 5570791 -MultipartBoundaryBegin 5570793 +MultipartBoundaryBegin 5570791 MultipartBoundaryEnd 5570825 MimeEntityBegin 5570825 MimeEntityHeadersEnd 5570827 @@ -3311,7 +3311,7 @@ MimeMessageEnd 5571542 Octets 715 Lines 17 MimeEntityEnd 5571542 -MultipartBoundaryBegin 5571544 +MultipartBoundaryBegin 5571542 MultipartBoundaryEnd 5571576 MimeEntityBegin 5571576 MimeEntityHeadersEnd 5571578 @@ -3326,7 +3326,7 @@ MimeMessageEnd 5573024 Octets 1446 Lines 25 MimeEntityEnd 5573024 -MultipartBoundaryBegin 5573026 +MultipartBoundaryBegin 5573024 MultipartBoundaryEnd 5573058 MimeEntityBegin 5573058 MimeEntityHeadersEnd 5573060 @@ -3341,7 +3341,7 @@ MimeMessageEnd 5575356 Octets 2296 Lines 54 MimeEntityEnd 5575356 -MultipartBoundaryBegin 5575358 +MultipartBoundaryBegin 5575356 MultipartBoundaryEnd 5575390 MimeEntityBegin 5575390 MimeEntityHeadersEnd 5575392 @@ -3356,7 +3356,7 @@ MimeMessageEnd 5577580 Octets 2188 Lines 47 MimeEntityEnd 5577580 -MultipartBoundaryBegin 5577582 +MultipartBoundaryBegin 5577580 MultipartBoundaryEnd 5577614 MimeEntityBegin 5577614 MimeEntityHeadersEnd 5577616 @@ -3371,7 +3371,7 @@ MimeMessageEnd 5578437 Octets 821 Lines 24 MimeEntityEnd 5578437 -MultipartBoundaryBegin 5578439 +MultipartBoundaryBegin 5578437 MultipartBoundaryEnd 5578471 MimeEntityBegin 5578471 MimeEntityHeadersEnd 5578473 @@ -3386,7 +3386,7 @@ MimeMessageEnd 5579450 Octets 977 Lines 21 MimeEntityEnd 5579450 -MultipartBoundaryBegin 5579452 +MultipartBoundaryBegin 5579450 MultipartBoundaryEnd 5579484 MimeEntityBegin 5579484 MimeEntityHeadersEnd 5579486 @@ -3401,7 +3401,7 @@ MimeMessageEnd 5580359 Octets 873 Lines 26 MimeEntityEnd 5580359 -MultipartBoundaryBegin 5580361 +MultipartBoundaryBegin 5580359 MultipartBoundaryEnd 5580393 MimeEntityBegin 5580393 MimeEntityHeadersEnd 5580395 @@ -3416,7 +3416,7 @@ MimeMessageEnd 5581257 Octets 862 Lines 21 MimeEntityEnd 5581257 -MultipartBoundaryBegin 5581259 +MultipartBoundaryBegin 5581257 MultipartBoundaryEnd 5581291 MimeEntityBegin 5581291 MimeEntityHeadersEnd 5581293 @@ -3431,7 +3431,7 @@ MimeMessageEnd 5581820 Octets 527 Lines 13 MimeEntityEnd 5581820 -MultipartBoundaryBegin 5581822 +MultipartBoundaryBegin 5581820 MultipartBoundaryEnd 5581854 MimeEntityBegin 5581854 MimeEntityHeadersEnd 5581856 @@ -3446,7 +3446,7 @@ MimeMessageEnd 5582597 Octets 741 Lines 20 MimeEntityEnd 5582597 -MultipartBoundaryBegin 5582599 +MultipartBoundaryBegin 5582597 MultipartBoundaryEnd 5582631 MimeEntityBegin 5582631 MimeEntityHeadersEnd 5582633 @@ -3461,7 +3461,7 @@ MimeMessageEnd 5583169 Octets 536 Lines 22 MimeEntityEnd 5583169 -MultipartBoundaryBegin 5583171 +MultipartBoundaryBegin 5583169 MultipartBoundaryEnd 5583203 MimeEntityBegin 5583203 MimeEntityHeadersEnd 5583205 @@ -3476,7 +3476,7 @@ MimeMessageEnd 5583604 Octets 399 Lines 11 MimeEntityEnd 5583604 -MultipartBoundaryBegin 5583606 +MultipartBoundaryBegin 5583604 MultipartBoundaryEnd 5583638 MimeEntityBegin 5583638 MimeEntityHeadersEnd 5583640 @@ -3491,7 +3491,7 @@ MimeMessageEnd 5584267 Octets 627 Lines 21 MimeEntityEnd 5584267 -MultipartBoundaryBegin 5584269 +MultipartBoundaryBegin 5584267 MultipartBoundaryEnd 5584301 MimeEntityBegin 5584301 MimeEntityHeadersEnd 5584303 @@ -3506,7 +3506,7 @@ MimeMessageEnd 5584803 Octets 500 Lines 24 MimeEntityEnd 5584803 -MultipartBoundaryBegin 5584805 +MultipartBoundaryBegin 5584803 MultipartBoundaryEnd 5584837 MimeEntityBegin 5584837 MimeEntityHeadersEnd 5584839 @@ -3521,7 +3521,7 @@ MimeMessageEnd 5586303 Octets 1464 Lines 31 MimeEntityEnd 5586303 -MultipartBoundaryBegin 5586305 +MultipartBoundaryBegin 5586303 MultipartBoundaryEnd 5586337 MimeEntityBegin 5586337 MimeEntityHeadersEnd 5586339 @@ -3536,7 +3536,7 @@ MimeMessageEnd 5586747 Octets 408 Lines 14 MimeEntityEnd 5586747 -MultipartBoundaryBegin 5586749 +MultipartBoundaryBegin 5586747 MultipartBoundaryEnd 5586781 MimeEntityBegin 5586781 MimeEntityHeadersEnd 5586783 @@ -3551,14 +3551,14 @@ MimeMessageEnd 5587985 Octets 1202 Lines 41 MimeEntityEnd 5587985 -MultipartEndBoundaryBegin 5587987 +MultipartEndBoundaryBegin 5587985 MultipartEndBoundaryEnd 5588019 MultipartEpilogueBegin 5588019 MultipartEpilogueEnd 5588021 Octets 66055 Lines 1846 MimeEntityEnd 5588021 -MultipartEndBoundaryBegin 5588023 +MultipartEndBoundaryBegin 5588021 MultipartEndBoundaryEnd 5588042 MultipartEpilogueBegin 5588042 MultipartEpilogueEnd 5588100 @@ -3591,49 +3591,49 @@ MimeEntityHeadersEnd 5591637 Octets 113 Lines 2 MimeEntityEnd 5591750 -MultipartBoundaryBegin 5591752 +MultipartBoundaryBegin 5591750 MultipartBoundaryEnd 5591780 MimeEntityBegin 5591780 MimeEntityHeadersEnd 5591872 Octets 132703 Lines 2012 MimeEntityEnd 5724575 -MultipartBoundaryBegin 5724577 +MultipartBoundaryBegin 5724575 MultipartBoundaryEnd 5724605 MimeEntityBegin 5724605 MimeEntityHeadersEnd 5724607 Octets 56 Lines 2 MimeEntityEnd 5724663 -MultipartBoundaryBegin 5724665 +MultipartBoundaryBegin 5724663 MultipartBoundaryEnd 5724693 MimeEntityBegin 5724693 MimeEntityHeadersEnd 5724843 Octets 14974 Lines 78 MimeEntityEnd 5739817 -MultipartBoundaryBegin 5739819 +MultipartBoundaryBegin 5739817 MultipartBoundaryEnd 5739847 MimeEntityBegin 5739847 MimeEntityHeadersEnd 5739849 Octets 95 Lines 6 MimeEntityEnd 5739944 -MultipartBoundaryBegin 5739946 +MultipartBoundaryBegin 5739944 MultipartBoundaryEnd 5739974 MimeEntityBegin 5739974 MimeEntityHeadersEnd 5740124 Octets 8142 Lines 42 MimeEntityEnd 5748266 -MultipartBoundaryBegin 5748268 +MultipartBoundaryBegin 5748266 MultipartBoundaryEnd 5748296 MimeEntityBegin 5748296 MimeEntityHeadersEnd 5748298 Octets 77 Lines 4 MimeEntityEnd 5748375 -MultipartEndBoundaryBegin 5748377 +MultipartEndBoundaryBegin 5748375 MultipartEndBoundaryEnd 5748405 MultipartEpilogueBegin 5748405 MultipartEpilogueEnd 5748407 @@ -3666,7 +3666,7 @@ MimeEntityHeadersEnd 5751010 Octets 756 Lines 27 MimeEntityEnd 5751766 -MultipartBoundaryBegin 5751768 +MultipartBoundaryBegin 5751766 MultipartBoundaryEnd 5751809 MimeEntityBegin 5751809 MimeEntityHeadersEnd 5751897 @@ -3679,28 +3679,28 @@ MimeEntityHeadersEnd 5752034 Octets 827 Lines 26 MimeEntityEnd 5752861 -MultipartBoundaryBegin 5752863 +MultipartBoundaryBegin 5752861 MultipartBoundaryEnd 5752906 MimeEntityBegin 5752906 MimeEntityHeadersEnd 5753003 Octets 58626 Lines 756 MimeEntityEnd 5811629 -MultipartBoundaryBegin 5811631 +MultipartBoundaryBegin 5811629 MultipartBoundaryEnd 5811674 MimeEntityBegin 5811674 MimeEntityHeadersEnd 5811768 Octets 6 Lines 2 MimeEntityEnd 5811774 -MultipartEndBoundaryBegin 5811776 +MultipartEndBoundaryBegin 5811774 MultipartEndBoundaryEnd 5811819 MultipartEpilogueBegin 5811819 MultipartEpilogueEnd 5811821 Octets 59924 Lines 799 MimeEntityEnd 5811821 -MultipartEndBoundaryBegin 5811823 +MultipartEndBoundaryBegin 5811821 MultipartEndBoundaryEnd 5811864 MultipartEpilogueBegin 5811864 MultipartEpilogueEnd 5811866 @@ -3723,14 +3723,14 @@ MimeEntityHeadersEnd 5812779 Octets 181 Lines 8 MimeEntityEnd 5812960 -MultipartBoundaryBegin 5812962 +MultipartBoundaryBegin 5812960 MultipartBoundaryEnd 5813012 MimeEntityBegin 5813012 MimeEntityHeadersEnd 5813074 Octets 56004 Lines 757 MimeEntityEnd 5869078 -MultipartEndBoundaryBegin 5869080 +MultipartEndBoundaryBegin 5869078 MultipartEndBoundaryEnd 5869130 MultipartEpilogueBegin 5869130 MultipartEpilogueEnd 5869132 @@ -3763,7 +3763,7 @@ MimeEntityHeadersEnd 5873010 Octets 383 Lines 14 MimeEntityEnd 5873393 -MultipartBoundaryBegin 5873395 +MultipartBoundaryBegin 5873393 MultipartBoundaryEnd 5873421 MimeEntityBegin 5873421 MimeEntityHeadersEnd 5873515 @@ -3778,7 +3778,7 @@ MimeMessageEnd 5899455 Octets 25940 Lines 478 MimeEntityEnd 5899455 -MultipartEndBoundaryBegin 5899457 +MultipartEndBoundaryBegin 5899455 MultipartEndBoundaryEnd 5899483 MultipartEpilogueBegin 5899483 MultipartEpilogueEnd 5899485 @@ -3801,14 +3801,14 @@ MimeEntityHeadersEnd 5900356 Octets 35 Lines 2 MimeEntityEnd 5900391 -MultipartBoundaryBegin 5900393 +MultipartBoundaryBegin 5900391 MultipartBoundaryEnd 5900442 MimeEntityBegin 5900442 MimeEntityHeadersEnd 5900504 Octets 22454 Lines 304 MimeEntityEnd 5922958 -MultipartEndBoundaryBegin 5922960 +MultipartEndBoundaryBegin 5922958 MultipartEndBoundaryEnd 5923009 MultipartEpilogueBegin 5923009 MultipartEpilogueEnd 5923009 @@ -3831,21 +3831,21 @@ MimeEntityHeadersEnd 5923636 Octets 1193 Lines 22 MimeEntityEnd 5924829 -MultipartBoundaryBegin 5924831 +MultipartBoundaryBegin 5924829 MultipartBoundaryEnd 5924840 MimeEntityBegin 5924840 MimeEntityHeadersEnd 5924970 Octets 148 Lines 3 MimeEntityEnd 5925118 -MultipartBoundaryBegin 5925120 +MultipartBoundaryBegin 5925118 MultipartBoundaryEnd 5925129 MimeEntityBegin 5925129 MimeEntityHeadersEnd 5925249 Octets 196 Lines 3 MimeEntityEnd 5925445 -MultipartEndBoundaryBegin 5925447 +MultipartEndBoundaryBegin 5925445 MultipartEndBoundaryEnd 5925456 MultipartEpilogueBegin 5925456 MultipartEpilogueEnd 5925456 @@ -3878,14 +3878,14 @@ MimeEntityHeadersEnd 6187554 Octets 198 Lines 9 MimeEntityEnd 6187752 -MultipartBoundaryBegin 6187754 +MultipartBoundaryBegin 6187752 MultipartBoundaryEnd 6187769 MimeEntityBegin 6187769 MimeEntityHeadersEnd 6187877 Octets 99522 Lines 1276 MimeEntityEnd 6287399 -MultipartEndBoundaryBegin 6287401 +MultipartEndBoundaryBegin 6287399 MultipartEndBoundaryEnd 6287416 MultipartEpilogueBegin 6287416 MultipartEpilogueEnd 6287418 @@ -3908,7 +3908,7 @@ MimeEntityHeadersEnd 6288383 Octets 964 Lines 22 MimeEntityEnd 6289347 -MultipartBoundaryBegin 6289349 +MultipartBoundaryBegin 6289347 MultipartBoundaryEnd 6289359 MimeEntityBegin 6289359 MimeEntityHeadersEnd 6289424 @@ -3933,28 +3933,28 @@ MimeEntityHeadersEnd 6290096 Octets 374 Lines 9 MimeEntityEnd 6290470 -MultipartBoundaryBegin 6290472 +MultipartBoundaryBegin 6290470 MultipartBoundaryEnd 6290495 MimeEntityBegin 6290495 MimeEntityHeadersEnd 6290621 Octets 402 Lines 11 MimeEntityEnd 6291023 -MultipartBoundaryBegin 6291025 +MultipartBoundaryBegin 6291023 MultipartBoundaryEnd 6291048 MimeEntityBegin 6291048 MimeEntityHeadersEnd 6291177 Octets 726 Lines 19 MimeEntityEnd 6291903 -MultipartEndBoundaryBegin 6291905 +MultipartEndBoundaryBegin 6291903 MultipartEndBoundaryEnd 6291928 MultipartEpilogueBegin 6291928 MultipartEpilogueEnd 6291930 Octets 1984 Lines 56 MimeEntityEnd 6291930 -MultipartBoundaryBegin 6291932 +MultipartBoundaryBegin 6291930 MultipartBoundaryEnd 6291955 MimeEntityBegin 6291955 MimeEntityHeadersEnd 6292057 @@ -3967,14 +3967,14 @@ MimeEntityHeadersEnd 6292216 Octets 16885 Lines 471 MimeEntityEnd 6309101 -MultipartBoundaryBegin 6309103 +MultipartBoundaryBegin 6309101 MultipartBoundaryEnd 6309126 MimeEntityBegin 6309126 MimeEntityHeadersEnd 6309261 Octets 14649 Lines 396 MimeEntityEnd 6323910 -MultipartBoundaryBegin 6323912 +MultipartBoundaryBegin 6323910 MultipartBoundaryEnd 6323935 MimeEntityBegin 6323935 MimeEntityHeadersEnd 6324039 @@ -3987,42 +3987,42 @@ MimeEntityHeadersEnd 6324208 Octets 6316 Lines 165 MimeEntityEnd 6330524 -MultipartBoundaryBegin 6330526 +MultipartBoundaryBegin 6330524 MultipartBoundaryEnd 6330549 MimeEntityBegin 6330549 MimeEntityHeadersEnd 6330680 Octets 5415 Lines 161 MimeEntityEnd 6336095 -MultipartBoundaryBegin 6336097 +MultipartBoundaryBegin 6336095 MultipartBoundaryEnd 6336120 MimeEntityBegin 6336120 MimeEntityHeadersEnd 6336261 Octets 7495 Lines 198 MimeEntityEnd 6343756 -MultipartBoundaryBegin 6343758 +MultipartBoundaryBegin 6343756 MultipartBoundaryEnd 6343781 MimeEntityBegin 6343781 MimeEntityHeadersEnd 6343909 Octets 6660 Lines 185 MimeEntityEnd 6350569 -MultipartBoundaryBegin 6350571 +MultipartBoundaryBegin 6350569 MultipartBoundaryEnd 6350594 MimeEntityBegin 6350594 MimeEntityHeadersEnd 6350735 Octets 17660 Lines 493 MimeEntityEnd 6368395 -MultipartEndBoundaryBegin 6368397 +MultipartEndBoundaryBegin 6368395 MultipartEndBoundaryEnd 6368420 MultipartEpilogueBegin 6368420 MultipartEpilogueEnd 6368422 Octets 44383 Lines 1229 MimeEntityEnd 6368422 -MultipartBoundaryBegin 6368424 +MultipartBoundaryBegin 6368422 MultipartBoundaryEnd 6368447 MimeEntityBegin 6368447 MimeEntityHeadersEnd 6368545 @@ -4035,21 +4035,21 @@ MimeEntityHeadersEnd 6368706 Octets 516 Lines 22 MimeEntityEnd 6369222 -MultipartEndBoundaryBegin 6369224 +MultipartEndBoundaryBegin 6369222 MultipartEndBoundaryEnd 6369247 MultipartEpilogueBegin 6369247 MultipartEpilogueEnd 6369249 Octets 704 Lines 29 MimeEntityEnd 6369249 -MultipartEndBoundaryBegin 6369251 +MultipartEndBoundaryBegin 6369249 MultipartEndBoundaryEnd 6369274 MultipartEpilogueBegin 6369274 MultipartEpilogueEnd 6369276 Octets 77219 Lines 2145 MimeEntityEnd 6369276 -MultipartBoundaryBegin 6369278 +MultipartBoundaryBegin 6369276 MultipartBoundaryEnd 6369301 MimeEntityBegin 6369301 MimeEntityHeadersEnd 6369415 @@ -4062,42 +4062,42 @@ MimeEntityHeadersEnd 6369580 Octets 1178 Lines 30 MimeEntityEnd 6370758 -MultipartBoundaryBegin 6370760 +MultipartBoundaryBegin 6370758 MultipartBoundaryEnd 6370783 MimeEntityBegin 6370783 MimeEntityHeadersEnd 6370913 Octets 1255 Lines 36 MimeEntityEnd 6372168 -MultipartBoundaryBegin 6372170 +MultipartBoundaryBegin 6372168 MultipartBoundaryEnd 6372193 MimeEntityBegin 6372193 MimeEntityHeadersEnd 6372337 Octets 699 Lines 23 MimeEntityEnd 6373036 -MultipartEndBoundaryBegin 6373038 +MultipartEndBoundaryBegin 6373036 MultipartEndBoundaryEnd 6373061 MultipartEpilogueBegin 6373061 MultipartEpilogueEnd 6373063 Octets 3648 Lines 106 MimeEntityEnd 6373063 -MultipartEndBoundaryBegin 6373065 +MultipartEndBoundaryBegin 6373063 MultipartEndBoundaryEnd 6373088 MultipartEpilogueBegin 6373088 MultipartEpilogueEnd 6373090 Octets 83272 Lines 2321 MimeEntityEnd 6373090 -MultipartEndBoundaryBegin 6373092 +MultipartEndBoundaryBegin 6373090 MultipartEndBoundaryEnd 6373115 MultipartEpilogueBegin 6373115 MultipartEpilogueEnd 6373117 Octets 83693 Lines 2333 MimeEntityEnd 6373117 -MultipartEndBoundaryBegin 6373119 +MultipartEndBoundaryBegin 6373117 MultipartEndBoundaryEnd 6373129 MultipartEpilogueBegin 6373129 MultipartEpilogueEnd 6373131 @@ -4130,7 +4130,7 @@ MimeEntityHeadersEnd 6384386 Octets 779 Lines 24 MimeEntityEnd 6385165 -MultipartBoundaryBegin 6385167 +MultipartBoundaryBegin 6385165 MultipartBoundaryEnd 6385208 MimeEntityBegin 6385208 MimeEntityHeadersEnd 6385296 @@ -4143,56 +4143,56 @@ MimeEntityHeadersEnd 6385433 Octets 334 Lines 8 MimeEntityEnd 6385767 -MultipartBoundaryBegin 6385769 +MultipartBoundaryBegin 6385767 MultipartBoundaryEnd 6385812 MimeEntityBegin 6385812 MimeEntityHeadersEnd 6385910 Octets 22344 Lines 321 MimeEntityEnd 6408254 -MultipartBoundaryBegin 6408256 +MultipartBoundaryBegin 6408254 MultipartBoundaryEnd 6408299 MimeEntityBegin 6408299 MimeEntityHeadersEnd 6408393 Octets 171 Lines 6 MimeEntityEnd 6408564 -MultipartBoundaryBegin 6408566 +MultipartBoundaryBegin 6408564 MultipartBoundaryEnd 6408609 MimeEntityBegin 6408609 MimeEntityHeadersEnd 6408710 Octets 47898 Lines 686 MimeEntityEnd 6456608 -MultipartBoundaryBegin 6456610 +MultipartBoundaryBegin 6456608 MultipartBoundaryEnd 6456653 MimeEntityBegin 6456653 MimeEntityHeadersEnd 6456747 Octets 72 Lines 3 MimeEntityEnd 6456819 -MultipartBoundaryBegin 6456821 +MultipartBoundaryBegin 6456819 MultipartBoundaryEnd 6456864 MimeEntityBegin 6456864 MimeEntityHeadersEnd 6456958 Octets 20512 Lines 295 MimeEntityEnd 6477470 -MultipartBoundaryBegin 6477472 +MultipartBoundaryBegin 6477470 MultipartBoundaryEnd 6477515 MimeEntityBegin 6477515 MimeEntityHeadersEnd 6477609 Octets 112 Lines 9 MimeEntityEnd 6477721 -MultipartEndBoundaryBegin 6477723 +MultipartEndBoundaryBegin 6477721 MultipartEndBoundaryEnd 6477766 MultipartEpilogueBegin 6477766 MultipartEpilogueEnd 6477768 Octets 92472 Lines 1361 MimeEntityEnd 6477768 -MultipartEndBoundaryBegin 6477770 +MultipartEndBoundaryBegin 6477768 MultipartEndBoundaryEnd 6477811 MultipartEpilogueBegin 6477811 MultipartEpilogueEnd 6477811 @@ -4215,21 +4215,21 @@ MimeEntityHeadersEnd 6478914 Octets 433 Lines 14 MimeEntityEnd 6479347 -MultipartBoundaryBegin 6479349 +MultipartBoundaryBegin 6479347 MultipartBoundaryEnd 6479395 MimeEntityBegin 6479395 MimeEntityHeadersEnd 6479459 Octets 34024 Lines 461 MimeEntityEnd 6513483 -MultipartBoundaryBegin 6513485 +MultipartBoundaryBegin 6513483 MultipartBoundaryEnd 6513531 MimeEntityBegin 6513531 MimeEntityHeadersEnd 6513607 Octets 101 Lines 8 MimeEntityEnd 6513708 -MultipartEndBoundaryBegin 6513710 +MultipartEndBoundaryBegin 6513708 MultipartEndBoundaryEnd 6513756 MultipartEpilogueBegin 6513756 MultipartEpilogueEnd 6513758 @@ -4268,28 +4268,28 @@ MimeEntityHeadersEnd 6558644 Octets 1310 Lines 39 MimeEntityEnd 6559954 -MultipartBoundaryBegin 6559956 +MultipartBoundaryBegin 6559954 MultipartBoundaryEnd 6559996 MimeEntityBegin 6559996 MimeEntityHeadersEnd 6560078 Octets 2496 Lines 33 MimeEntityEnd 6562574 -MultipartEndBoundaryBegin 6562576 +MultipartEndBoundaryBegin 6562574 MultipartEndBoundaryEnd 6562616 MultipartEpilogueBegin 6562616 MultipartEpilogueEnd 6562620 Octets 4099 Lines 84 MimeEntityEnd 6562620 -MultipartBoundaryBegin 6562622 +MultipartBoundaryBegin 6562620 MultipartBoundaryEnd 6562662 MimeEntityBegin 6562662 MimeEntityHeadersEnd 6562872 Octets 21020 Lines 271 MimeEntityEnd 6583892 -MultipartEndBoundaryBegin 6583894 +MultipartEndBoundaryBegin 6583892 MultipartEndBoundaryEnd 6583934 MultipartEpilogueBegin 6583934 MultipartEpilogueEnd 6583936 @@ -4312,7 +4312,7 @@ MimeEntityHeadersEnd 6584459 Octets 64 Lines 2 MimeEntityEnd 6584523 -MultipartBoundaryBegin 6584525 +MultipartBoundaryBegin 6584523 MultipartBoundaryEnd 6584546 MimeEntityBegin 6584546 MimeEntityHeadersEnd 6584622 @@ -4325,49 +4325,49 @@ MimeEntityHeadersEnd 6584760 Octets 83 Lines 4 MimeEntityEnd 6584843 -MultipartBoundaryBegin 6584845 +MultipartBoundaryBegin 6584843 MultipartBoundaryEnd 6584873 MimeEntityBegin 6584873 MimeEntityHeadersEnd 6584986 Octets 162 Lines 5 MimeEntityEnd 6585148 -MultipartBoundaryBegin 6585150 +MultipartBoundaryBegin 6585148 MultipartBoundaryEnd 6585178 MimeEntityBegin 6585178 MimeEntityHeadersEnd 6585291 Octets 173 Lines 11 MimeEntityEnd 6585464 -MultipartBoundaryBegin 6585466 +MultipartBoundaryBegin 6585464 MultipartBoundaryEnd 6585494 MimeEntityBegin 6585494 MimeEntityHeadersEnd 6585603 Octets 164 Lines 4 MimeEntityEnd 6585767 -MultipartBoundaryBegin 6585769 +MultipartBoundaryBegin 6585767 MultipartBoundaryEnd 6585797 MimeEntityBegin 6585797 MimeEntityHeadersEnd 6585925 Octets 433 Lines 7 MimeEntityEnd 6586358 -MultipartEndBoundaryBegin 6586360 +MultipartEndBoundaryBegin 6586358 MultipartEndBoundaryEnd 6586388 MultipartEpilogueBegin 6586388 MultipartEpilogueEnd 6586388 Octets 1766 Lines 57 MimeEntityEnd 6586388 -MultipartBoundaryBegin 6586390 +MultipartBoundaryBegin 6586388 MultipartBoundaryEnd 6586411 MimeEntityBegin 6586411 MimeEntityHeadersEnd 6586413 Octets 169 Lines 5 MimeEntityEnd 6586582 -MultipartBoundaryBegin 6586584 +MultipartBoundaryBegin 6586582 MultipartBoundaryEnd 6586605 MimeEntityBegin 6586605 MimeEntityHeadersEnd 6586657 @@ -4380,7 +4380,7 @@ MimeEntityHeadersEnd 6586691 Octets 54 Lines 2 MimeEntityEnd 6586745 -MultipartBoundaryBegin 6586747 +MultipartBoundaryBegin 6586745 MultipartBoundaryEnd 6586753 MimeEntityBegin 6586753 MimeEntityHeadersEnd 6586805 @@ -4393,49 +4393,49 @@ MimeEntityHeadersEnd 6586839 Octets 54 Lines 2 MimeEntityEnd 6586893 -MultipartBoundaryBegin 6586895 +MultipartBoundaryBegin 6586893 MultipartBoundaryEnd 6586901 MimeEntityBegin 6586901 MimeEntityHeadersEnd 6586928 Octets 51 Lines 2 MimeEntityEnd 6586979 -MultipartBoundaryBegin 6586981 +MultipartBoundaryBegin 6586979 MultipartBoundaryEnd 6586987 MimeEntityBegin 6586987 MimeEntityHeadersEnd 6587016 Octets 55 Lines 2 MimeEntityEnd 6587071 -MultipartEndBoundaryBegin 6587073 +MultipartEndBoundaryBegin 6587071 MultipartEndBoundaryEnd 6587079 MultipartEpilogueBegin 6587079 MultipartEpilogueEnd 6587081 Octets 276 Lines 17 MimeEntityEnd 6587081 -MultipartBoundaryBegin 6587083 +MultipartBoundaryBegin 6587081 MultipartBoundaryEnd 6587089 MimeEntityBegin 6587089 MimeEntityHeadersEnd 6587184 Octets 16 Lines 2 MimeEntityEnd 6587200 -MultipartEndBoundaryBegin 6587202 +MultipartEndBoundaryBegin 6587200 MultipartEndBoundaryEnd 6587208 MultipartEpilogueBegin 6587208 MultipartEpilogueEnd 6587208 Octets 551 Lines 32 MimeEntityEnd 6587208 -MultipartBoundaryBegin 6587210 +MultipartBoundaryBegin 6587208 MultipartBoundaryEnd 6587231 MimeEntityBegin 6587231 MimeEntityHeadersEnd 6587233 Octets 10 Lines 2 MimeEntityEnd 6587243 -MultipartEndBoundaryBegin 6587245 +MultipartEndBoundaryBegin 6587243 MultipartEndBoundaryEnd 6587266 MultipartEpilogueBegin 6587266 MultipartEpilogueEnd 6587266 @@ -4458,7 +4458,7 @@ MimeEntityHeadersEnd 6587787 Octets 68 Lines 2 MimeEntityEnd 6587855 -MultipartBoundaryBegin 6587857 +MultipartBoundaryBegin 6587855 MultipartBoundaryEnd 6587878 MimeEntityBegin 6587878 MimeEntityHeadersEnd 6587954 @@ -4471,28 +4471,28 @@ MimeEntityHeadersEnd 6588142 Octets 56866 Lines 1604 MimeEntityEnd 6645008 -MultipartBoundaryBegin 6645010 +MultipartBoundaryBegin 6645008 MultipartBoundaryEnd 6645038 MimeEntityBegin 6645038 MimeEntityHeadersEnd 6645197 Octets 109031 Lines 2983 MimeEntityEnd 6754228 -MultipartBoundaryBegin 6754230 +MultipartBoundaryBegin 6754228 MultipartBoundaryEnd 6754258 MimeEntityBegin 6754258 MimeEntityHeadersEnd 6754408 Octets 201468 Lines 13110 MimeEntityEnd 6955876 -MultipartEndBoundaryBegin 6955878 +MultipartEndBoundaryBegin 6955876 MultipartEndBoundaryEnd 6955906 MultipartEpilogueBegin 6955906 MultipartEpilogueEnd 6955908 Octets 367954 Lines 17714 MimeEntityEnd 6955908 -MultipartEndBoundaryBegin 6955910 +MultipartEndBoundaryBegin 6955908 MultipartEndBoundaryEnd 6955931 MultipartEpilogueBegin 6955931 MultipartEpilogueEnd 6955939 @@ -4515,7 +4515,7 @@ MimeEntityHeadersEnd 6956943 Octets 0 Lines 1 MimeEntityEnd 6956943 -MultipartBoundaryBegin 6956945 +MultipartBoundaryBegin 6956943 MultipartBoundaryEnd 6956986 MimeEntityBegin 6956986 MimeEntityHeadersEnd 6957087 @@ -4530,7 +4530,7 @@ MimeMessageEnd 6958002 Octets 915 Lines 29 MimeEntityEnd 6958002 -MultipartEndBoundaryBegin 6958004 +MultipartEndBoundaryBegin 6958002 MultipartEndBoundaryEnd 6958045 MultipartEpilogueBegin 6958045 MultipartEpilogueEnd 6958045 @@ -4553,14 +4553,14 @@ MimeEntityHeadersEnd 6958654 Octets 749 Lines 31 MimeEntityEnd 6959403 -MultipartBoundaryBegin 6959405 +MultipartBoundaryBegin 6959403 MultipartBoundaryEnd 6959445 MimeEntityBegin 6959445 MimeEntityHeadersEnd 6959773 Octets 10870 Lines 148 MimeEntityEnd 6970643 -MultipartEndBoundaryBegin 6970645 +MultipartEndBoundaryBegin 6970643 MultipartEndBoundaryEnd 6970685 MultipartEpilogueBegin 6970685 MultipartEpilogueEnd 6970685 @@ -4583,14 +4583,14 @@ MimeEntityHeadersEnd 6971294 Octets 748 Lines 31 MimeEntityEnd 6972042 -MultipartBoundaryBegin 6972044 +MultipartBoundaryBegin 6972042 MultipartBoundaryEnd 6972084 MimeEntityBegin 6972084 MimeEntityHeadersEnd 6972381 Octets 10870 Lines 148 MimeEntityEnd 6983251 -MultipartEndBoundaryBegin 6983253 +MultipartEndBoundaryBegin 6983251 MultipartEndBoundaryEnd 6983293 MultipartEpilogueBegin 6983293 MultipartEpilogueEnd 6983293 @@ -4613,14 +4613,14 @@ MimeEntityHeadersEnd 6984998 Octets 5310 Lines 112 MimeEntityEnd 6990308 -MultipartBoundaryBegin 6990310 +MultipartBoundaryBegin 6990308 MultipartBoundaryEnd 6990355 MimeEntityBegin 6990355 MimeEntityHeadersEnd 6990560 Octets 942 Lines 14 MimeEntityEnd 6991502 -MultipartEndBoundaryBegin 6991504 +MultipartEndBoundaryBegin 6991502 MultipartEndBoundaryEnd 6991549 MultipartEpilogueBegin 6991549 MultipartEpilogueEnd 6991551 @@ -4643,7 +4643,7 @@ MimeEntityHeadersEnd 6992113 Octets 253 Lines 7 MimeEntityEnd 6992366 -MultipartBoundaryBegin 6992368 +MultipartBoundaryBegin 6992366 MultipartBoundaryEnd 6992408 MimeEntityBegin 6992408 MimeEntityHeadersEnd 6992497 @@ -4656,63 +4656,63 @@ MimeEntityHeadersEnd 6992736 Octets 7327 Lines 180 MimeEntityEnd 7000063 -MultipartBoundaryBegin 7000065 +MultipartBoundaryBegin 7000063 MultipartBoundaryEnd 7000105 MimeEntityBegin 7000105 MimeEntityHeadersEnd 7000286 Octets 8090 Lines 110 MimeEntityEnd 7008376 -MultipartBoundaryBegin 7008378 +MultipartBoundaryBegin 7008376 MultipartBoundaryEnd 7008418 MimeEntityBegin 7008418 MimeEntityHeadersEnd 7008582 Octets 7556 Lines 103 MimeEntityEnd 7016138 -MultipartBoundaryBegin 7016140 +MultipartBoundaryBegin 7016138 MultipartBoundaryEnd 7016180 MimeEntityBegin 7016180 MimeEntityHeadersEnd 7016343 Octets 3378 Lines 46 MimeEntityEnd 7019721 -MultipartBoundaryBegin 7019723 +MultipartBoundaryBegin 7019721 MultipartBoundaryEnd 7019763 MimeEntityBegin 7019763 MimeEntityHeadersEnd 7019927 Octets 8566 Lines 116 MimeEntityEnd 7028493 -MultipartBoundaryBegin 7028495 +MultipartBoundaryBegin 7028493 MultipartBoundaryEnd 7028535 MimeEntityBegin 7028535 MimeEntityHeadersEnd 7028696 Octets 105798 Lines 1430 MimeEntityEnd 7134494 -MultipartBoundaryBegin 7134496 +MultipartBoundaryBegin 7134494 MultipartBoundaryEnd 7134536 MimeEntityBegin 7134536 MimeEntityHeadersEnd 7134700 Octets 38886 Lines 526 MimeEntityEnd 7173586 -MultipartBoundaryBegin 7173588 +MultipartBoundaryBegin 7173586 MultipartBoundaryEnd 7173628 MimeEntityBegin 7173628 MimeEntityHeadersEnd 7173797 Octets 35798 Lines 484 MimeEntityEnd 7209595 -MultipartEndBoundaryBegin 7209597 +MultipartEndBoundaryBegin 7209595 MultipartEndBoundaryEnd 7209637 MultipartEpilogueBegin 7209637 MultipartEpilogueEnd 7209637 Octets 217140 Lines 3044 MimeEntityEnd 7209637 -MultipartEndBoundaryBegin 7209639 +MultipartEndBoundaryBegin 7209637 MultipartEndBoundaryEnd 7209679 MultipartEpilogueBegin 7209679 MultipartEpilogueEnd 7209679 @@ -4735,14 +4735,14 @@ MimeEntityHeadersEnd 7210195 Octets 578 Lines 28 MimeEntityEnd 7210773 -MultipartBoundaryBegin 7210775 +MultipartBoundaryBegin 7210773 MultipartBoundaryEnd 7210815 MimeEntityBegin 7210815 MimeEntityHeadersEnd 7210932 Octets 10870 Lines 148 MimeEntityEnd 7221802 -MultipartEndBoundaryBegin 7221804 +MultipartEndBoundaryBegin 7221802 MultipartEndBoundaryEnd 7221844 MultipartEpilogueBegin 7221844 MultipartEpilogueEnd 7221844 @@ -4765,14 +4765,14 @@ MimeEntityHeadersEnd 7222417 Octets 625 Lines 29 MimeEntityEnd 7223042 -MultipartBoundaryBegin 7223044 +MultipartBoundaryBegin 7223042 MultipartBoundaryEnd 7223084 MimeEntityBegin 7223084 MimeEntityHeadersEnd 7223365 Octets 10870 Lines 148 MimeEntityEnd 7234235 -MultipartEndBoundaryBegin 7234237 +MultipartEndBoundaryBegin 7234235 MultipartEndBoundaryEnd 7234277 MultipartEpilogueBegin 7234277 MultipartEpilogueEnd 7234277 @@ -4795,14 +4795,14 @@ MimeEntityHeadersEnd 7234854 Octets 629 Lines 29 MimeEntityEnd 7235483 -MultipartBoundaryBegin 7235485 +MultipartBoundaryBegin 7235483 MultipartBoundaryEnd 7235525 MimeEntityBegin 7235525 MimeEntityHeadersEnd 7235705 Octets 10870 Lines 148 MimeEntityEnd 7246575 -MultipartEndBoundaryBegin 7246577 +MultipartEndBoundaryBegin 7246575 MultipartEndBoundaryEnd 7246617 MultipartEpilogueBegin 7246617 MultipartEpilogueEnd 7246617 @@ -4825,14 +4825,14 @@ MimeEntityHeadersEnd 7247224 Octets 660 Lines 30 MimeEntityEnd 7247884 -MultipartBoundaryBegin 7247886 +MultipartBoundaryBegin 7247884 MultipartBoundaryEnd 7247926 MimeEntityBegin 7247926 MimeEntityHeadersEnd 7248239 Octets 10870 Lines 148 MimeEntityEnd 7259109 -MultipartEndBoundaryBegin 7259111 +MultipartEndBoundaryBegin 7259109 MultipartEndBoundaryEnd 7259151 MultipartEpilogueBegin 7259151 MultipartEpilogueEnd 7259151 @@ -4855,14 +4855,14 @@ MimeEntityHeadersEnd 7259728 Octets 673 Lines 29 MimeEntityEnd 7260401 -MultipartBoundaryBegin 7260403 +MultipartBoundaryBegin 7260401 MultipartBoundaryEnd 7260443 MimeEntityBegin 7260443 MimeEntityHeadersEnd 7260623 Octets 10870 Lines 148 MimeEntityEnd 7271493 -MultipartEndBoundaryBegin 7271495 +MultipartEndBoundaryBegin 7271493 MultipartEndBoundaryEnd 7271535 MultipartEpilogueBegin 7271535 MultipartEpilogueEnd 7271535 @@ -4885,14 +4885,14 @@ MimeEntityHeadersEnd 7272142 Octets 699 Lines 30 MimeEntityEnd 7272841 -MultipartBoundaryBegin 7272843 +MultipartBoundaryBegin 7272841 MultipartBoundaryEnd 7272883 MimeEntityBegin 7272883 MimeEntityHeadersEnd 7273227 Octets 10870 Lines 148 MimeEntityEnd 7284097 -MultipartEndBoundaryBegin 7284099 +MultipartEndBoundaryBegin 7284097 MultipartEndBoundaryEnd 7284139 MultipartEpilogueBegin 7284139 MultipartEpilogueEnd 7284139 @@ -4915,7 +4915,7 @@ MimeEntityHeadersEnd 7285596 Octets 30 Lines 4 MimeEntityEnd 7285626 -MultipartBoundaryBegin 7285628 +MultipartBoundaryBegin 7285626 MultipartBoundaryEnd 7285667 MimeEntityBegin 7285667 MimeEntityHeadersEnd 7285761 @@ -4932,7 +4932,7 @@ MimeEntityHeadersEnd 7286719 Octets 643 Lines 17 MimeEntityEnd 7287362 -MultipartBoundaryBegin 7287364 +MultipartBoundaryBegin 7287362 MultipartBoundaryEnd 7287404 MimeEntityBegin 7287404 MimeEntityHeadersEnd 7287488 @@ -4945,21 +4945,21 @@ MimeEntityHeadersEnd 7287608 Octets 868 Lines 19 MimeEntityEnd 7288476 -MultipartBoundaryBegin 7288478 +MultipartBoundaryBegin 7288476 MultipartBoundaryEnd 7288518 MimeEntityBegin 7288518 MimeEntityHeadersEnd 7288707 Octets 754158 Lines 10192 MimeEntityEnd 8042865 -MultipartEndBoundaryBegin 8042867 +MultipartEndBoundaryBegin 8042865 MultipartEndBoundaryEnd 8042907 MultipartEpilogueBegin 8042907 MultipartEpilogueEnd 8042909 Octets 755421 Lines 10224 MimeEntityEnd 8042909 -MultipartEndBoundaryBegin 8042911 +MultipartEndBoundaryBegin 8042909 MultipartEndBoundaryEnd 8042951 MultipartEpilogueBegin 8042951 MultipartEpilogueEnd 8042957 @@ -4970,7 +4970,7 @@ MimeMessageEnd 8042957 Octets 757196 Lines 10269 MimeEntityEnd 8042957 -MultipartEndBoundaryBegin 8042959 +MultipartEndBoundaryBegin 8042957 MultipartEndBoundaryEnd 8042998 MultipartEpilogueBegin 8042998 MultipartEpilogueEnd 8043000 @@ -4993,35 +4993,35 @@ MimeEntityHeadersEnd 8044462 Octets 2432 Lines 51 MimeEntityEnd 8046894 -MultipartBoundaryBegin 8046896 +MultipartBoundaryBegin 8046894 MultipartBoundaryEnd 8046941 MimeEntityBegin 8046941 MimeEntityHeadersEnd 8047105 Octets 6102 Lines 80 MimeEntityEnd 8053207 -MultipartBoundaryBegin 8053209 +MultipartBoundaryBegin 8053207 MultipartBoundaryEnd 8053254 MimeEntityBegin 8053254 MimeEntityHeadersEnd 8053417 Octets 12230 Lines 158 MimeEntityEnd 8065647 -MultipartBoundaryBegin 8065649 +MultipartBoundaryBegin 8065647 MultipartBoundaryEnd 8065694 MimeEntityBegin 8065694 MimeEntityHeadersEnd 8065859 Octets 21996 Lines 283 MimeEntityEnd 8087855 -MultipartBoundaryBegin 8087857 +MultipartBoundaryBegin 8087855 MultipartBoundaryEnd 8087902 MimeEntityBegin 8087902 MimeEntityHeadersEnd 8088111 Octets 3438 Lines 46 MimeEntityEnd 8091549 -MultipartEndBoundaryBegin 8091551 +MultipartEndBoundaryBegin 8091549 MultipartEndBoundaryEnd 8091596 MultipartEpilogueBegin 8091596 MultipartEpilogueEnd 8091598 @@ -5054,7 +5054,7 @@ MimeEntityHeadersEnd 8645442 Octets 2626 Lines 97 MimeEntityEnd 8648068 -MultipartEndBoundaryBegin 8648070 +MultipartEndBoundaryBegin 8648068 MultipartEndBoundaryEnd 8648079 MultipartEpilogueBegin 8648079 MultipartEpilogueEnd 8648081 @@ -5077,14 +5077,14 @@ MimeEntityHeadersEnd 8649078 Octets 1108 Lines 27 MimeEntityEnd 8650186 -MultipartBoundaryBegin 8650188 +MultipartBoundaryBegin 8650186 MultipartBoundaryEnd 8650206 MimeEntityBegin 8650206 MimeEntityHeadersEnd 8650249 Octets 293 Lines 10 MimeEntityEnd 8650542 -MultipartEndBoundaryBegin 8650544 +MultipartEndBoundaryBegin 8650542 MultipartEndBoundaryEnd 8650562 MultipartEpilogueBegin 8650562 MultipartEpilogueEnd 8650562 @@ -5127,7 +5127,7 @@ MimeEntityHeadersEnd 8655876 Octets 832 Lines 16 MimeEntityEnd 8656708 -MultipartBoundaryBegin 8656710 +MultipartBoundaryBegin 8656708 MultipartBoundaryEnd 8656751 MimeEntityBegin 8656751 MimeEntityHeadersEnd 8656839 @@ -5140,7 +5140,7 @@ MimeEntityHeadersEnd 8656976 Octets 501 Lines 11 MimeEntityEnd 8657477 -MultipartBoundaryBegin 8657479 +MultipartBoundaryBegin 8657477 MultipartBoundaryEnd 8657522 MimeEntityBegin 8657522 MimeEntityHeadersEnd 8657715 @@ -5155,14 +5155,14 @@ MimeMessageEnd 8657748 Octets 33 Lines 5 MimeEntityEnd 8657748 -MultipartBoundaryBegin 8657750 +MultipartBoundaryBegin 8657748 MultipartBoundaryEnd 8657793 MimeEntityBegin 8657793 MimeEntityHeadersEnd 8657884 Octets 5 Lines 3 MimeEntityEnd 8657889 -MultipartBoundaryBegin 8657891 +MultipartBoundaryBegin 8657889 MultipartBoundaryEnd 8657934 MimeEntityBegin 8657934 MimeEntityHeadersEnd 8658142 @@ -5177,21 +5177,21 @@ MimeMessageEnd 8658173 Octets 31 Lines 5 MimeEntityEnd 8658173 -MultipartBoundaryBegin 8658175 +MultipartBoundaryBegin 8658173 MultipartBoundaryEnd 8658218 MimeEntityBegin 8658218 MimeEntityHeadersEnd 8658312 Octets 229 Lines 8 MimeEntityEnd 8658541 -MultipartEndBoundaryBegin 8658543 +MultipartEndBoundaryBegin 8658541 MultipartEndBoundaryEnd 8658586 MultipartEpilogueBegin 8658586 MultipartEpilogueEnd 8658588 Octets 1749 Lines 62 MimeEntityEnd 8658588 -MultipartEndBoundaryBegin 8658590 +MultipartEndBoundaryBegin 8658588 MultipartEndBoundaryEnd 8658631 MultipartEpilogueBegin 8658631 MultipartEpilogueEnd 8658633 @@ -5234,7 +5234,7 @@ MimeEntityHeadersEnd 8667840 Octets 1705 Lines 39 MimeEntityEnd 8669545 -MultipartBoundaryBegin 8669547 +MultipartBoundaryBegin 8669545 MultipartBoundaryEnd 8669588 MimeEntityBegin 8669588 MimeEntityHeadersEnd 8669676 @@ -5247,126 +5247,126 @@ MimeEntityHeadersEnd 8669813 Octets 571 Lines 15 MimeEntityEnd 8670384 -MultipartBoundaryBegin 8670386 +MultipartBoundaryBegin 8670384 MultipartBoundaryEnd 8670429 MimeEntityBegin 8670429 MimeEntityHeadersEnd 8670493 Octets 884 Lines 13 MimeEntityEnd 8671377 -MultipartBoundaryBegin 8671379 +MultipartBoundaryBegin 8671377 MultipartBoundaryEnd 8671422 MimeEntityBegin 8671422 MimeEntityHeadersEnd 8671516 Octets 51 Lines 6 MimeEntityEnd 8671567 -MultipartBoundaryBegin 8671569 +MultipartBoundaryBegin 8671567 MultipartBoundaryEnd 8671612 MimeEntityBegin 8671612 MimeEntityHeadersEnd 8671676 Octets 884 Lines 13 MimeEntityEnd 8672560 -MultipartBoundaryBegin 8672562 +MultipartBoundaryBegin 8672560 MultipartBoundaryEnd 8672605 MimeEntityBegin 8672605 MimeEntityHeadersEnd 8672699 Octets 51 Lines 6 MimeEntityEnd 8672750 -MultipartBoundaryBegin 8672752 +MultipartBoundaryBegin 8672750 MultipartBoundaryEnd 8672795 MimeEntityBegin 8672795 MimeEntityHeadersEnd 8672859 Octets 884 Lines 13 MimeEntityEnd 8673743 -MultipartBoundaryBegin 8673745 +MultipartBoundaryBegin 8673743 MultipartBoundaryEnd 8673788 MimeEntityBegin 8673788 MimeEntityHeadersEnd 8673882 Octets 45 Lines 6 MimeEntityEnd 8673927 -MultipartBoundaryBegin 8673929 +MultipartBoundaryBegin 8673927 MultipartBoundaryEnd 8673972 MimeEntityBegin 8673972 MimeEntityHeadersEnd 8674036 Octets 228 Lines 5 MimeEntityEnd 8674264 -MultipartBoundaryBegin 8674266 +MultipartBoundaryBegin 8674264 MultipartBoundaryEnd 8674309 MimeEntityBegin 8674309 MimeEntityHeadersEnd 8674403 Octets 69 Lines 6 MimeEntityEnd 8674472 -MultipartBoundaryBegin 8674474 +MultipartBoundaryBegin 8674472 MultipartBoundaryEnd 8674517 MimeEntityBegin 8674517 MimeEntityHeadersEnd 8674581 Octets 228 Lines 5 MimeEntityEnd 8674809 -MultipartBoundaryBegin 8674811 +MultipartBoundaryBegin 8674809 MultipartBoundaryEnd 8674854 MimeEntityBegin 8674854 MimeEntityHeadersEnd 8674948 Octets 49 Lines 6 MimeEntityEnd 8674997 -MultipartBoundaryBegin 8674999 +MultipartBoundaryBegin 8674997 MultipartBoundaryEnd 8675042 MimeEntityBegin 8675042 MimeEntityHeadersEnd 8675106 Octets 228 Lines 5 MimeEntityEnd 8675334 -MultipartBoundaryBegin 8675336 +MultipartBoundaryBegin 8675334 MultipartBoundaryEnd 8675379 MimeEntityBegin 8675379 MimeEntityHeadersEnd 8675473 Octets 303 Lines 12 MimeEntityEnd 8675776 -MultipartBoundaryBegin 8675778 +MultipartBoundaryBegin 8675776 MultipartBoundaryEnd 8675821 MimeEntityBegin 8675821 MimeEntityHeadersEnd 8675885 Octets 884 Lines 13 MimeEntityEnd 8676769 -MultipartBoundaryBegin 8676771 +MultipartBoundaryBegin 8676769 MultipartBoundaryEnd 8676814 MimeEntityBegin 8676814 MimeEntityHeadersEnd 8676908 Octets 44 Lines 5 MimeEntityEnd 8676952 -MultipartBoundaryBegin 8676954 +MultipartBoundaryBegin 8676952 MultipartBoundaryEnd 8676997 MimeEntityBegin 8676997 MimeEntityHeadersEnd 8677061 Octets 1942 Lines 28 MimeEntityEnd 8679003 -MultipartBoundaryBegin 8679005 +MultipartBoundaryBegin 8679003 MultipartBoundaryEnd 8679048 MimeEntityBegin 8679048 MimeEntityHeadersEnd 8679142 Octets 11 Lines 2 MimeEntityEnd 8679153 -MultipartEndBoundaryBegin 8679155 +MultipartEndBoundaryBegin 8679153 MultipartEndBoundaryEnd 8679198 MultipartEpilogueBegin 8679198 MultipartEpilogueEnd 8679200 Octets 9524 Lines 229 MimeEntityEnd 8679200 -MultipartEndBoundaryBegin 8679202 +MultipartEndBoundaryBegin 8679200 MultipartEndBoundaryEnd 8679243 MultipartEpilogueBegin 8679243 MultipartEpilogueEnd 8679245 @@ -5389,7 +5389,7 @@ MimeEntityHeadersEnd 8680245 Octets 639 Lines 13 MimeEntityEnd 8680884 -MultipartBoundaryBegin 8680886 +MultipartBoundaryBegin 8680884 MultipartBoundaryEnd 8680927 MimeEntityBegin 8680927 MimeEntityHeadersEnd 8681015 @@ -5402,28 +5402,28 @@ MimeEntityHeadersEnd 8681152 Octets 541 Lines 9 MimeEntityEnd 8681693 -MultipartBoundaryBegin 8681695 +MultipartBoundaryBegin 8681693 MultipartBoundaryEnd 8681738 MimeEntityBegin 8681738 MimeEntityHeadersEnd 8681850 Octets 8710 Lines 126 MimeEntityEnd 8690560 -MultipartBoundaryBegin 8690562 +MultipartBoundaryBegin 8690560 MultipartBoundaryEnd 8690605 MimeEntityBegin 8690605 MimeEntityHeadersEnd 8690699 Octets 48 Lines 4 MimeEntityEnd 8690747 -MultipartEndBoundaryBegin 8690749 +MultipartEndBoundaryBegin 8690747 MultipartEndBoundaryEnd 8690792 MultipartEpilogueBegin 8690792 MultipartEpilogueEnd 8690794 Octets 9779 Lines 154 MimeEntityEnd 8690794 -MultipartEndBoundaryBegin 8690796 +MultipartEndBoundaryBegin 8690794 MultipartEndBoundaryEnd 8690837 MultipartEpilogueBegin 8690837 MultipartEpilogueEnd 8690837 @@ -5446,14 +5446,14 @@ MimeEntityHeadersEnd 8691654 Octets 103 Lines 7 MimeEntityEnd 8691757 -MultipartBoundaryBegin 8691759 +MultipartBoundaryBegin 8691757 MultipartBoundaryEnd 8691809 MimeEntityBegin 8691809 MimeEntityHeadersEnd 8691940 Octets 79516 Lines 1075 MimeEntityEnd 8771456 -MultipartEndBoundaryBegin 8771458 +MultipartEndBoundaryBegin 8771456 MultipartEndBoundaryEnd 8771508 MultipartEpilogueBegin 8771508 MultipartEpilogueEnd 8771510 @@ -5476,7 +5476,7 @@ MimeEntityHeadersEnd 8772539 Octets 1378 Lines 29 MimeEntityEnd 8773917 -MultipartBoundaryBegin 8773919 +MultipartBoundaryBegin 8773917 MultipartBoundaryEnd 8773960 MimeEntityBegin 8773960 MimeEntityHeadersEnd 8774048 @@ -5489,42 +5489,42 @@ MimeEntityHeadersEnd 8774185 Octets 1161 Lines 23 MimeEntityEnd 8775346 -MultipartBoundaryBegin 8775348 +MultipartBoundaryBegin 8775346 MultipartBoundaryEnd 8775391 MimeEntityBegin 8775391 MimeEntityHeadersEnd 8775493 Octets 116822 Lines 1580 MimeEntityEnd 8892315 -MultipartBoundaryBegin 8892317 +MultipartBoundaryBegin 8892315 MultipartBoundaryEnd 8892360 MimeEntityBegin 8892360 MimeEntityHeadersEnd 8892454 Octets 126 Lines 4 MimeEntityEnd 8892580 -MultipartBoundaryBegin 8892582 +MultipartBoundaryBegin 8892580 MultipartBoundaryEnd 8892625 MimeEntityBegin 8892625 MimeEntityHeadersEnd 8892728 Octets 67242 Lines 962 MimeEntityEnd 8959970 -MultipartBoundaryBegin 8959972 +MultipartBoundaryBegin 8959970 MultipartBoundaryEnd 8960015 MimeEntityBegin 8960015 MimeEntityHeadersEnd 8960106 Octets 0 Lines 1 MimeEntityEnd 8960106 -MultipartEndBoundaryBegin 8960108 +MultipartEndBoundaryBegin 8960106 MultipartEndBoundaryEnd 8960151 MultipartEpilogueBegin 8960151 MultipartEpilogueEnd 8960153 Octets 186105 Lines 2594 MimeEntityEnd 8960153 -MultipartEndBoundaryBegin 8960155 +MultipartEndBoundaryBegin 8960153 MultipartEndBoundaryEnd 8960196 MultipartEpilogueBegin 8960196 MultipartEpilogueEnd 8960196 @@ -5575,14 +5575,14 @@ MimeEntityHeadersEnd 8965352 Octets 41 Lines 2 MimeEntityEnd 8965393 -MultipartBoundaryBegin 8965395 +MultipartBoundaryBegin 8965393 MultipartBoundaryEnd 8965405 MimeEntityBegin 8965405 MimeEntityHeadersEnd 8965469 Octets 92498 Lines 1250 MimeEntityEnd 9057967 -MultipartEndBoundaryBegin 9057969 +MultipartEndBoundaryBegin 9057967 MultipartEndBoundaryEnd 9057979 MultipartEpilogueBegin 9057979 MultipartEpilogueEnd 9057985 @@ -5615,42 +5615,42 @@ MimeEntityHeadersEnd 9060851 Octets 552 Lines 13 MimeEntityEnd 9061403 -MultipartBoundaryBegin 9061405 +MultipartBoundaryBegin 9061403 MultipartBoundaryEnd 9061411 MimeEntityBegin 9061411 MimeEntityHeadersEnd 9061531 Octets 58430 Lines 790 MimeEntityEnd 9119961 -MultipartBoundaryBegin 9119963 +MultipartBoundaryBegin 9119961 MultipartBoundaryEnd 9119969 MimeEntityBegin 9119969 MimeEntityHeadersEnd 9119971 Octets 3866 Lines 84 MimeEntityEnd 9123837 -MultipartBoundaryBegin 9123839 +MultipartBoundaryBegin 9123837 MultipartBoundaryEnd 9123845 MimeEntityBegin 9123845 MimeEntityHeadersEnd 9124003 Octets 30644 Lines 1010 MimeEntityEnd 9154647 -MultipartBoundaryBegin 9154649 +MultipartBoundaryBegin 9154647 MultipartBoundaryEnd 9154655 MimeEntityBegin 9154655 MimeEntityHeadersEnd 9154764 Octets 740 Lines 25 MimeEntityEnd 9155504 -MultipartBoundaryBegin 9155506 +MultipartBoundaryBegin 9155504 MultipartBoundaryEnd 9155512 MimeEntityBegin 9155512 MimeEntityHeadersEnd 9155632 Octets 1288 Lines 25 MimeEntityEnd 9156920 -MultipartEndBoundaryBegin 9156922 +MultipartEndBoundaryBegin 9156920 MultipartEndBoundaryEnd 9156928 MultipartEpilogueBegin 9156928 MultipartEpilogueEnd 9156930 @@ -5673,14 +5673,14 @@ MimeEntityHeadersEnd 9158156 Octets 921 Lines 21 MimeEntityEnd 9159077 -MultipartBoundaryBegin 9159079 +MultipartBoundaryBegin 9159077 MultipartBoundaryEnd 9159097 MimeEntityBegin 9159097 MimeEntityHeadersEnd 9159179 Octets 760 Lines 13 MimeEntityEnd 9159939 -MultipartEndBoundaryBegin 9159941 +MultipartEndBoundaryBegin 9159939 MultipartEndBoundaryEnd 9159959 MultipartEpilogueBegin 9159959 MultipartEpilogueEnd 9159961 @@ -5703,14 +5703,14 @@ MimeEntityHeadersEnd 9161422 Octets 754 Lines 14 MimeEntityEnd 9162176 -MultipartBoundaryBegin 9162178 +MultipartBoundaryBegin 9162176 MultipartBoundaryEnd 9162186 MimeEntityBegin 9162186 MimeEntityHeadersEnd 9162369 Octets 2246 Lines 32 MimeEntityEnd 9164615 -MultipartEndBoundaryBegin 9164617 +MultipartEndBoundaryBegin 9164615 MultipartEndBoundaryEnd 9164625 MultipartEpilogueBegin 9164625 MultipartEpilogueEnd 9164625 @@ -5733,14 +5733,14 @@ MimeEntityHeadersEnd 9166099 Octets 2858 Lines 47 MimeEntityEnd 9168957 -MultipartBoundaryBegin 9168959 +MultipartBoundaryBegin 9168957 MultipartBoundaryEnd 9168981 MimeEntityBegin 9168981 MimeEntityHeadersEnd 9169164 Octets 2582 Lines 36 MimeEntityEnd 9171746 -MultipartEndBoundaryBegin 9171748 +MultipartEndBoundaryBegin 9171746 MultipartEndBoundaryEnd 9171770 MultipartEpilogueBegin 9171770 MultipartEpilogueEnd 9171770 @@ -5773,14 +5773,14 @@ MimeEntityHeadersEnd 9177413 Octets 10868 Lines 147 MimeEntityEnd 9188281 -MultipartBoundaryBegin 9188283 +MultipartBoundaryBegin 9188281 MultipartBoundaryEnd 9188311 MimeEntityBegin 9188311 MimeEntityHeadersEnd 9188466 Octets 4674 Lines 64 MimeEntityEnd 9193140 -MultipartEndBoundaryBegin 9193142 +MultipartEndBoundaryBegin 9193140 MultipartEndBoundaryEnd 9193170 MultipartEpilogueBegin 9193170 MultipartEpilogueEnd 9193172 @@ -5853,14 +5853,14 @@ MimeEntityHeadersEnd 9332194 Octets 110 Lines 4 MimeEntityEnd 9332304 -MultipartBoundaryBegin 9332306 +MultipartBoundaryBegin 9332304 MultipartBoundaryEnd 9332351 MimeEntityBegin 9332351 MimeEntityHeadersEnd 9332506 Octets 3986 Lines 54 MimeEntityEnd 9336492 -MultipartEndBoundaryBegin 9336494 +MultipartEndBoundaryBegin 9336492 MultipartEndBoundaryEnd 9336539 MultipartEpilogueBegin 9336539 MultipartEpilogueEnd 9336541 @@ -5931,7 +5931,7 @@ MimeEntityHeadersEnd 9355907 Octets 16 Lines 2 MimeEntityEnd 9355923 -MultipartBoundaryBegin 9355925 +MultipartBoundaryBegin 9355923 MultipartBoundaryEnd 9355953 MimeEntityBegin 9355953 MimeEntityHeadersEnd 9356111 @@ -5946,7 +5946,7 @@ MimeMessageEnd 9358966 Octets 2855 Lines 44 MimeEntityEnd 9358966 -MultipartEndBoundaryBegin 9358968 +MultipartEndBoundaryBegin 9358966 MultipartEndBoundaryEnd 9358996 MultipartEpilogueBegin 9358996 MultipartEpilogueEnd 9358998 @@ -5969,14 +5969,14 @@ MimeEntityHeadersEnd 9359897 Octets 42 Lines 2 MimeEntityEnd 9359939 -MultipartBoundaryBegin 9359941 +MultipartBoundaryBegin 9359939 MultipartBoundaryEnd 9359983 MimeEntityBegin 9359983 MimeEntityHeadersEnd 9360138 Octets 5632 Lines 77 MimeEntityEnd 9365770 -MultipartEndBoundaryBegin 9365772 +MultipartEndBoundaryBegin 9365770 MultipartEndBoundaryEnd 9365814 MultipartEpilogueBegin 9365814 MultipartEpilogueEnd 9365816 @@ -6009,14 +6009,14 @@ MimeEntityHeadersEnd 9378928 Octets 627 Lines 17 MimeEntityEnd 9379555 -MultipartBoundaryBegin 9379557 +MultipartBoundaryBegin 9379555 MultipartBoundaryEnd 9379599 MimeEntityBegin 9379599 MimeEntityHeadersEnd 9379754 Octets 1812 Lines 25 MimeEntityEnd 9381566 -MultipartEndBoundaryBegin 9381568 +MultipartEndBoundaryBegin 9381566 MultipartEndBoundaryEnd 9381610 MultipartEpilogueBegin 9381610 MultipartEpilogueEnd 9381612 @@ -6049,7 +6049,7 @@ MimeEntityHeadersEnd 9384395 Octets 603 Lines 16 MimeEntityEnd 9384998 -MultipartEndBoundaryBegin 9385000 +MultipartEndBoundaryBegin 9384998 MultipartEndBoundaryEnd 9385042 MultipartEpilogueBegin 9385042 MultipartEpilogueEnd 9385042 @@ -6072,7 +6072,7 @@ MimeEntityHeadersEnd 9386728 Octets 107 Lines 7 MimeEntityEnd 9386835 -MultipartBoundaryBegin 9386837 +MultipartBoundaryBegin 9386835 MultipartBoundaryEnd 9386879 MimeEntityBegin 9386879 MimeEntityHeadersEnd 9387046 @@ -6085,7 +6085,7 @@ MimeEntityHeadersEnd 9387416 Octets 95 Lines 5 MimeEntityEnd 9387511 -MultipartBoundaryBegin 9387513 +MultipartBoundaryBegin 9387511 MultipartBoundaryEnd 9387553 MimeEntityBegin 9387553 MimeEntityHeadersEnd 9387649 @@ -6100,28 +6100,28 @@ MimeMessageEnd 9389055 Octets 1406 Lines 35 MimeEntityEnd 9389055 -MultipartBoundaryBegin 9389057 +MultipartBoundaryBegin 9389055 MultipartBoundaryEnd 9389097 MimeEntityBegin 9389097 MimeEntityHeadersEnd 9389267 Octets 490 Lines 12 MimeEntityEnd 9389757 -MultipartEndBoundaryBegin 9389759 +MultipartEndBoundaryBegin 9389757 MultipartEndBoundaryEnd 9389799 MultipartEpilogueBegin 9389799 MultipartEpilogueEnd 9389799 Octets 2753 Lines 70 MimeEntityEnd 9389799 -MultipartBoundaryBegin 9389801 +MultipartBoundaryBegin 9389799 MultipartBoundaryEnd 9389843 MimeEntityBegin 9389843 MimeEntityHeadersEnd 9390060 Octets 5294 Lines 72 MimeEntityEnd 9395354 -MultipartEndBoundaryBegin 9395356 +MultipartEndBoundaryBegin 9395354 MultipartEndBoundaryEnd 9395398 MultipartEpilogueBegin 9395398 MultipartEpilogueEnd 9395402 @@ -6164,14 +6164,14 @@ MimeEntityHeadersEnd 9404194 Octets 0 Lines 1 MimeEntityEnd 9404194 -MultipartBoundaryBegin 9404196 +MultipartBoundaryBegin 9404194 MultipartBoundaryEnd 9404229 MimeEntityBegin 9404229 MimeEntityHeadersEnd 9404311 Octets 2754 Lines 42 MimeEntityEnd 9407065 -MultipartEndBoundaryBegin 9407067 +MultipartEndBoundaryBegin 9407065 MultipartEndBoundaryEnd 9407100 MultipartEpilogueBegin 9407100 MultipartEpilogueEnd 9407102 @@ -6194,21 +6194,21 @@ MimeEntityHeadersEnd 9408317 Octets 466 Lines 14 MimeEntityEnd 9408783 -MultipartBoundaryBegin 9408785 +MultipartBoundaryBegin 9408783 MultipartBoundaryEnd 9408826 MimeEntityBegin 9408826 MimeEntityHeadersEnd 9408904 Octets 837 Lines 27 MimeEntityEnd 9409741 -MultipartBoundaryBegin 9409743 +MultipartBoundaryBegin 9409741 MultipartBoundaryEnd 9409784 MimeEntityBegin 9409784 MimeEntityHeadersEnd 9409884 Octets 1216 Lines 17 MimeEntityEnd 9411100 -MultipartEndBoundaryBegin 9411102 +MultipartEndBoundaryBegin 9411100 MultipartEndBoundaryEnd 9411143 MultipartEpilogueBegin 9411143 MultipartEpilogueEnd 9411145 @@ -6231,14 +6231,14 @@ MimeEntityHeadersEnd 9412394 Octets 159 Lines 8 MimeEntityEnd 9412553 -MultipartBoundaryBegin 9412555 +MultipartBoundaryBegin 9412553 MultipartBoundaryEnd 9412598 MimeEntityBegin 9412598 MimeEntityHeadersEnd 9412680 Octets 4152 Lines 57 MimeEntityEnd 9416832 -MultipartEndBoundaryBegin 9416834 +MultipartEndBoundaryBegin 9416832 MultipartEndBoundaryEnd 9416877 MultipartEpilogueBegin 9416877 MultipartEpilogueEnd 9416879 @@ -6261,14 +6261,14 @@ MimeEntityHeadersEnd 9417569 Octets 158 Lines 4 MimeEntityEnd 9417727 -MultipartBoundaryBegin 9417729 +MultipartBoundaryBegin 9417727 MultipartBoundaryEnd 9417773 MimeEntityBegin 9417773 MimeEntityHeadersEnd 9417928 Octets 3970 Lines 54 MimeEntityEnd 9421898 -MultipartEndBoundaryBegin 9421900 +MultipartEndBoundaryBegin 9421898 MultipartEndBoundaryEnd 9421944 MultipartEpilogueBegin 9421944 MultipartEpilogueEnd 9421944 @@ -6291,14 +6291,14 @@ MimeEntityHeadersEnd 9423425 Octets 77 Lines 6 MimeEntityEnd 9423502 -MultipartBoundaryBegin 9423504 +MultipartBoundaryBegin 9423502 MultipartBoundaryEnd 9423545 MimeEntityBegin 9423545 MimeEntityHeadersEnd 9423643 Octets 3606 Lines 48 MimeEntityEnd 9427249 -MultipartEndBoundaryBegin 9427251 +MultipartEndBoundaryBegin 9427249 MultipartEndBoundaryEnd 9427292 MultipartEpilogueBegin 9427292 MultipartEpilogueEnd 9427294 @@ -6321,14 +6321,14 @@ MimeEntityHeadersEnd 9428569 Octets 78 Lines 5 MimeEntityEnd 9428647 -MultipartBoundaryBegin 9428649 +MultipartBoundaryBegin 9428647 MultipartBoundaryEnd 9428683 MimeEntityBegin 9428683 MimeEntityHeadersEnd 9428765 Octets 3774 Lines 58 MimeEntityEnd 9432539 -MultipartEndBoundaryBegin 9432541 +MultipartEndBoundaryBegin 9432539 MultipartEndBoundaryEnd 9432575 MultipartEpilogueBegin 9432575 MultipartEpilogueEnd 9432575 @@ -6351,7 +6351,7 @@ MimeEntityHeadersEnd 9433938 Octets 194 Lines 7 MimeEntityEnd 9434132 -MultipartBoundaryBegin 9434134 +MultipartBoundaryBegin 9434132 MultipartBoundaryEnd 9434159 MimeEntityBegin 9434159 MimeEntityHeadersEnd 9434191 @@ -6366,7 +6366,7 @@ MimeMessageEnd 9435023 Octets 832 Lines 16 MimeEntityEnd 9435023 -MultipartEndBoundaryBegin 9435025 +MultipartEndBoundaryBegin 9435023 MultipartEndBoundaryEnd 9435050 MultipartEpilogueBegin 9435050 MultipartEpilogueEnd 9435052 @@ -6419,14 +6419,14 @@ MimeEntityHeadersEnd 9508710 Octets 355 Lines 11 MimeEntityEnd 9509065 -MultipartBoundaryBegin 9509067 +MultipartBoundaryBegin 9509065 MultipartBoundaryEnd 9509107 MimeEntityBegin 9509107 MimeEntityHeadersEnd 9509204 Octets 245530 Lines 3962 MimeEntityEnd 9754734 -MultipartEndBoundaryBegin 9754736 +MultipartEndBoundaryBegin 9754734 MultipartEndBoundaryEnd 9754776 MultipartEpilogueBegin 9754776 MultipartEpilogueEnd 9754778 @@ -6449,7 +6449,7 @@ MimeEntityHeadersEnd 9755625 Octets 78694 Lines 406 MimeEntityEnd 9834319 -MultipartEndBoundaryBegin 9834321 +MultipartEndBoundaryBegin 9834319 MultipartEndBoundaryEnd 9834349 MultipartEpilogueBegin 9834349 MultipartEpilogueEnd 9834353 @@ -6482,7 +6482,7 @@ MimeEntityHeadersEnd 9839173 Octets 421 Lines 8 MimeEntityEnd 9839594 -MultipartBoundaryBegin 9839596 +MultipartBoundaryBegin 9839594 MultipartBoundaryEnd 9839637 MimeEntityBegin 9839637 MimeEntityHeadersEnd 9839725 @@ -6495,56 +6495,56 @@ MimeEntityHeadersEnd 9839862 Octets 72 Lines 2 MimeEntityEnd 9839934 -MultipartBoundaryBegin 9839936 +MultipartBoundaryBegin 9839934 MultipartBoundaryEnd 9839979 MimeEntityBegin 9839979 MimeEntityHeadersEnd 9840082 Octets 10854 Lines 158 MimeEntityEnd 9850936 -MultipartBoundaryBegin 9850938 +MultipartBoundaryBegin 9850936 MultipartBoundaryEnd 9850981 MimeEntityBegin 9850981 MimeEntityHeadersEnd 9851075 Octets 66 Lines 3 MimeEntityEnd 9851141 -MultipartBoundaryBegin 9851143 +MultipartBoundaryBegin 9851141 MultipartBoundaryEnd 9851186 MimeEntityBegin 9851186 MimeEntityHeadersEnd 9851283 Octets 5990 Lines 88 MimeEntityEnd 9857273 -MultipartBoundaryBegin 9857275 +MultipartBoundaryBegin 9857273 MultipartBoundaryEnd 9857318 MimeEntityBegin 9857318 MimeEntityHeadersEnd 9857412 Octets 35 Lines 3 MimeEntityEnd 9857447 -MultipartBoundaryBegin 9857449 +MultipartBoundaryBegin 9857447 MultipartBoundaryEnd 9857492 MimeEntityBegin 9857492 MimeEntityHeadersEnd 9857597 Octets 11816 Lines 171 MimeEntityEnd 9869413 -MultipartBoundaryBegin 9869415 +MultipartBoundaryBegin 9869413 MultipartBoundaryEnd 9869458 MimeEntityBegin 9869458 MimeEntityHeadersEnd 9869552 Octets 33 Lines 3 MimeEntityEnd 9869585 -MultipartEndBoundaryBegin 9869587 +MultipartEndBoundaryBegin 9869585 MultipartEndBoundaryEnd 9869630 MultipartEpilogueBegin 9869630 MultipartEpilogueEnd 9869632 Octets 29907 Lines 461 MimeEntityEnd 9869632 -MultipartEndBoundaryBegin 9869634 +MultipartEndBoundaryBegin 9869632 MultipartEndBoundaryEnd 9869675 MultipartEpilogueBegin 9869675 MultipartEpilogueEnd 9869675 @@ -6587,14 +6587,14 @@ MimeEntityHeadersEnd 9876403 Octets 881 Lines 19 MimeEntityEnd 9877284 -MultipartBoundaryBegin 9877286 +MultipartBoundaryBegin 9877284 MultipartBoundaryEnd 9877331 MimeEntityBegin 9877331 MimeEntityHeadersEnd 9877497 Octets 3702 Lines 62 MimeEntityEnd 9881199 -MultipartEndBoundaryBegin 9881201 +MultipartEndBoundaryBegin 9881199 MultipartEndBoundaryEnd 9881246 MultipartEpilogueBegin 9881246 MultipartEpilogueEnd 9881248 @@ -6617,14 +6617,14 @@ MimeEntityHeadersEnd 9881874 Octets 982 Lines 20 MimeEntityEnd 9882856 -MultipartBoundaryBegin 9882858 +MultipartBoundaryBegin 9882856 MultipartBoundaryEnd 9882875 MimeEntityBegin 9882875 MimeEntityHeadersEnd 9882938 Octets 117312 Lines 1587 MimeEntityEnd 10000250 -MultipartEndBoundaryBegin 10000252 +MultipartEndBoundaryBegin 10000250 MultipartEndBoundaryEnd 10000269 MultipartEpilogueBegin 10000269 MultipartEpilogueEnd 10000273 @@ -6647,7 +6647,7 @@ MimeEntityHeadersEnd 10001344 Octets 9312 Lines 350 MimeEntityEnd 10010656 -MultipartBoundaryBegin 10010658 +MultipartBoundaryBegin 10010656 MultipartBoundaryEnd 10010699 MimeEntityBegin 10010699 MimeEntityHeadersEnd 10010787 @@ -6660,7 +6660,7 @@ MimeEntityHeadersEnd 10010924 Octets 2844 Lines 70 MimeEntityEnd 10013768 -MultipartBoundaryBegin 10013770 +MultipartBoundaryBegin 10013768 MultipartBoundaryEnd 10013813 MimeEntityBegin 10013813 MimeEntityHeadersEnd 10014016 @@ -6675,28 +6675,28 @@ MimeMessageEnd 10014049 Octets 33 Lines 5 MimeEntityEnd 10014049 -MultipartBoundaryBegin 10014051 +MultipartBoundaryBegin 10014049 MultipartBoundaryEnd 10014094 MimeEntityBegin 10014094 MimeEntityHeadersEnd 10014188 Octets 996 Lines 23 MimeEntityEnd 10015184 -MultipartBoundaryBegin 10015186 +MultipartBoundaryBegin 10015184 MultipartBoundaryEnd 10015229 MimeEntityBegin 10015229 MimeEntityHeadersEnd 10015349 Octets 374 Lines 16 MimeEntityEnd 10015723 -MultipartBoundaryBegin 10015725 +MultipartBoundaryBegin 10015723 MultipartBoundaryEnd 10015768 MimeEntityBegin 10015768 MimeEntityHeadersEnd 10015862 Octets 12 Lines 3 MimeEntityEnd 10015874 -MultipartBoundaryBegin 10015876 +MultipartBoundaryBegin 10015874 MultipartBoundaryEnd 10015919 MimeEntityBegin 10015919 MimeEntityHeadersEnd 10016110 @@ -6711,35 +6711,35 @@ MimeMessageEnd 10016141 Octets 31 Lines 4 MimeEntityEnd 10016141 -MultipartBoundaryBegin 10016143 +MultipartBoundaryBegin 10016141 MultipartBoundaryEnd 10016186 MimeEntityBegin 10016186 MimeEntityHeadersEnd 10016280 Octets 12 Lines 3 MimeEntityEnd 10016292 -MultipartBoundaryBegin 10016294 +MultipartBoundaryBegin 10016292 MultipartBoundaryEnd 10016337 MimeEntityBegin 10016337 MimeEntityHeadersEnd 10016447 Octets 3026 Lines 44 MimeEntityEnd 10019473 -MultipartBoundaryBegin 10019475 +MultipartBoundaryBegin 10019473 MultipartBoundaryEnd 10019518 MimeEntityBegin 10019518 MimeEntityHeadersEnd 10019612 Octets 6852 Lines 261 MimeEntityEnd 10026464 -MultipartEndBoundaryBegin 10026466 +MultipartEndBoundaryBegin 10026464 MultipartEndBoundaryEnd 10026509 MultipartEpilogueBegin 10026509 MultipartEpilogueEnd 10026511 Octets 15724 Lines 476 MimeEntityEnd 10026511 -MultipartEndBoundaryBegin 10026513 +MultipartEndBoundaryBegin 10026511 MultipartEndBoundaryEnd 10026554 MultipartEpilogueBegin 10026554 MultipartEpilogueEnd 10026556 @@ -6762,21 +6762,21 @@ MimeEntityHeadersEnd 10027715 Octets 341 Lines 9 MimeEntityEnd 10028056 -MultipartBoundaryBegin 10028058 +MultipartBoundaryBegin 10028056 MultipartBoundaryEnd 10028069 MimeEntityBegin 10028069 MimeEntityHeadersEnd 10028131 Octets 30390 Lines 412 MimeEntityEnd 10058521 -MultipartBoundaryBegin 10058523 +MultipartBoundaryBegin 10058521 MultipartBoundaryEnd 10058534 MimeEntityBegin 10058534 MimeEntityHeadersEnd 10058536 Octets 181 Lines 10 MimeEntityEnd 10058717 -MultipartEndBoundaryBegin 10058719 +MultipartEndBoundaryBegin 10058717 MultipartEndBoundaryEnd 10058730 MultipartEpilogueBegin 10058730 MultipartEpilogueEnd 10058732 @@ -6809,21 +6809,21 @@ MimeEntityHeadersEnd 10246995 Octets 21 Lines 1 MimeEntityEnd 10247016 -MultipartBoundaryBegin 10247018 +MultipartBoundaryBegin 10247016 MultipartBoundaryEnd 10247046 MimeEntityBegin 10247046 MimeEntityHeadersEnd 10247203 Octets 84174 Lines 434 MimeEntityEnd 10331377 -MultipartBoundaryBegin 10331379 +MultipartBoundaryBegin 10331377 MultipartBoundaryEnd 10331407 MimeEntityBegin 10331407 MimeEntityHeadersEnd 10331409 Octets 267 Lines 9 MimeEntityEnd 10331676 -MultipartEndBoundaryBegin 10331678 +MultipartEndBoundaryBegin 10331676 MultipartEndBoundaryEnd 10331706 MultipartEpilogueBegin 10331706 MultipartEpilogueEnd 10331708 @@ -6846,49 +6846,49 @@ MimeEntityHeadersEnd 10332431 Octets 66 Lines 1 MimeEntityEnd 10332497 -MultipartBoundaryBegin 10332499 +MultipartBoundaryBegin 10332497 MultipartBoundaryEnd 10332527 MimeEntityBegin 10332527 MimeEntityHeadersEnd 10332693 Octets 32332 Lines 167 MimeEntityEnd 10365025 -MultipartBoundaryBegin 10365027 +MultipartBoundaryBegin 10365025 MultipartBoundaryEnd 10365055 MimeEntityBegin 10365055 MimeEntityHeadersEnd 10365057 Octets 18 Lines 2 MimeEntityEnd 10365075 -MultipartBoundaryBegin 10365077 +MultipartBoundaryBegin 10365075 MultipartBoundaryEnd 10365105 MimeEntityBegin 10365105 MimeEntityHeadersEnd 10365269 Octets 1090 Lines 6 MimeEntityEnd 10366359 -MultipartBoundaryBegin 10366361 +MultipartBoundaryBegin 10366359 MultipartBoundaryEnd 10366389 MimeEntityBegin 10366389 MimeEntityHeadersEnd 10366391 Octets 32 Lines 3 MimeEntityEnd 10366423 -MultipartBoundaryBegin 10366425 +MultipartBoundaryBegin 10366423 MultipartBoundaryEnd 10366453 MimeEntityBegin 10366453 MimeEntityHeadersEnd 10366524 Octets 188027 Lines 1991 MimeEntityEnd 10554551 -MultipartBoundaryBegin 10554553 +MultipartBoundaryBegin 10554551 MultipartBoundaryEnd 10554581 MimeEntityBegin 10554581 MimeEntityHeadersEnd 10554583 Octets 8 Lines 1 MimeEntityEnd 10554591 -MultipartEndBoundaryBegin 10554593 +MultipartEndBoundaryBegin 10554591 MultipartEndBoundaryEnd 10554621 MultipartEpilogueBegin 10554621 MultipartEpilogueEnd 10554623 @@ -6921,7 +6921,7 @@ MimeEntityHeadersEnd 10632491 Octets 1881 Lines 35 MimeEntityEnd 10634372 -MultipartBoundaryBegin 10634374 +MultipartBoundaryBegin 10634372 MultipartBoundaryEnd 10634433 MimeEntityBegin 10634433 MimeEntityHeadersEnd 10634539 @@ -6934,35 +6934,35 @@ MimeEntityHeadersEnd 10634676 Octets 2028 Lines 30 MimeEntityEnd 10636704 -MultipartBoundaryBegin 10636706 +MultipartBoundaryBegin 10636704 MultipartBoundaryEnd 10636767 MimeEntityBegin 10636767 MimeEntityHeadersEnd 10636829 Octets 8038 Lines 110 MimeEntityEnd 10644867 -MultipartBoundaryBegin 10644869 +MultipartBoundaryBegin 10644867 MultipartBoundaryEnd 10644930 MimeEntityBegin 10644930 MimeEntityHeadersEnd 10645003 Octets 5 Lines 3 MimeEntityEnd 10645008 -MultipartBoundaryBegin 10645010 +MultipartBoundaryBegin 10645008 MultipartBoundaryEnd 10645071 MimeEntityBegin 10645071 MimeEntityHeadersEnd 10645168 Octets 42452 Lines 575 MimeEntityEnd 10687620 -MultipartEndBoundaryBegin 10687622 +MultipartEndBoundaryBegin 10687620 MultipartEndBoundaryEnd 10687683 MultipartEpilogueBegin 10687683 MultipartEpilogueEnd 10687685 Octets 53146 Lines 737 MimeEntityEnd 10687685 -MultipartEndBoundaryBegin 10687687 +MultipartEndBoundaryBegin 10687685 MultipartEndBoundaryEnd 10687746 MultipartEpilogueBegin 10687746 MultipartEpilogueEnd 10687748 @@ -6995,7 +6995,7 @@ MimeEntityHeadersEnd 10693947 Octets 376 Lines 9 MimeEntityEnd 10694323 -MultipartBoundaryBegin 10694325 +MultipartBoundaryBegin 10694323 MultipartBoundaryEnd 10694366 MimeEntityBegin 10694366 MimeEntityHeadersEnd 10694454 @@ -7008,28 +7008,28 @@ MimeEntityHeadersEnd 10694570 Octets 93 Lines 5 MimeEntityEnd 10694663 -MultipartBoundaryBegin 10694665 +MultipartBoundaryBegin 10694663 MultipartBoundaryEnd 10694708 MimeEntityBegin 10694708 MimeEntityHeadersEnd 10694826 Octets 5746 Lines 84 MimeEntityEnd 10700572 -MultipartBoundaryBegin 10700574 +MultipartBoundaryBegin 10700572 MultipartBoundaryEnd 10700617 MimeEntityBegin 10700617 MimeEntityHeadersEnd 10700690 Octets 209 Lines 7 MimeEntityEnd 10700899 -MultipartEndBoundaryBegin 10700901 +MultipartEndBoundaryBegin 10700899 MultipartEndBoundaryEnd 10700944 MultipartEpilogueBegin 10700944 MultipartEpilogueEnd 10700946 Octets 6492 Lines 111 MimeEntityEnd 10700946 -MultipartEndBoundaryBegin 10700948 +MultipartEndBoundaryBegin 10700946 MultipartEndBoundaryEnd 10700989 MultipartEpilogueBegin 10700989 MultipartEpilogueEnd 10700991 From 466c362656a24604fd464a094bd8db38a4291dc0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 17 Jun 2020 21:51:45 -0400 Subject: [PATCH 642/741] Updated unix offsets in the unit tests --- .../mbox/content-length.unix-offsets.txt | 736 +-- UnitTests/TestData/mbox/jwz.unix-offsets.txt | 5578 ++++++----------- 2 files changed, 2251 insertions(+), 4063 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt index b53c61af96..68e13b6732 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -4,1182 +4,972 @@ MimeMessageBegin 8 MimeMessageHeadersEnd 657 MimeEntityBegin 8 MimeEntityHeadersEnd 657 -MimeContentBegin 657 MultipartPreambleBegin 657 MultipartPreambleEnd 657 MultipartBoundaryBegin 657 MultipartBoundaryEnd 706 MimeEntityBegin 706 MimeEntityHeadersEnd 732 -MimeContentBegin 732 -MimeContentEnd 806 Octets 74 Lines 5 -MimeEntityEnd 807 -MultipartBoundaryBegin 807 +MimeEntityEnd 806 +MultipartBoundaryBegin 806 MultipartBoundaryEnd 856 MimeEntityBegin 856 MimeEntityHeadersEnd 918 -MimeContentBegin 918 MimeMessageBegin 918 -MimeMessageHeadersEnd 1700 MimeEntityBegin 918 MimeEntityHeadersEnd 1700 -MimeContentBegin 1700 -MimeContentEnd 1837 +MimeMessageHeadersEnd 1700 Octets 137 Lines 4 -MimeEntityEnd 1838 -MimeMessageEnd 1838 -MimeContentEnd 1838 -Octets 920 +MimeEntityEnd 1837 +MimeMessageEnd 1837 +Octets 919 Lines 21 -MimeEntityEnd 1838 -MultipartEndBoundaryBegin 1838 +MimeEntityEnd 1837 +MultipartEndBoundaryBegin 1837 MultipartEndBoundaryEnd 1888 MultipartEpilogueBegin 1888 MultipartEpilogueEnd 1888 -MimeContentEnd 1889 -Octets 1232 +Octets 1231 Lines 34 -MimeEntityEnd 1889 -MimeMessageEnd 1889 +MimeEntityEnd 1888 +MimeMessageEnd 1888 MboxMarkerBegin 1889 MboxMarkerEnd 1896 MimeMessageBegin 1897 MimeMessageHeadersEnd 2365 MimeEntityBegin 1897 MimeEntityHeadersEnd 2365 -MimeContentBegin 2365 MultipartPreambleBegin 2365 MultipartPreambleEnd 2411 MultipartBoundaryBegin 2411 MultipartBoundaryEnd 2438 MimeEntityBegin 2438 MimeEntityHeadersEnd 2582 -MimeContentBegin 2582 MimeMessageBegin 2582 -MimeMessageHeadersEnd 3011 MimeEntityBegin 2582 MimeEntityHeadersEnd 3011 -MimeContentBegin 3011 -MimeContentEnd 3048 +MimeMessageHeadersEnd 3011 Octets 37 Lines 3 -MimeEntityEnd 3049 -MimeMessageEnd 3049 -MimeContentEnd 3049 -Octets 467 +MimeEntityEnd 3048 +MimeMessageEnd 3048 +Octets 466 Lines 14 -MimeEntityEnd 3049 -MultipartBoundaryBegin 3049 +MimeEntityEnd 3048 +MultipartBoundaryBegin 3048 MultipartBoundaryEnd 3076 MimeEntityBegin 3076 MimeEntityHeadersEnd 3199 -MimeContentBegin 3199 -MimeContentEnd 3657 Octets 458 Lines 7 -MimeEntityEnd 3658 -MultipartBoundaryBegin 3658 +MimeEntityEnd 3657 +MultipartBoundaryBegin 3657 MultipartBoundaryEnd 3685 MimeEntityBegin 3685 MimeEntityHeadersEnd 3808 -MimeContentBegin 3808 -MimeContentEnd 4294 Octets 486 Lines 7 -MimeEntityEnd 4295 -MultipartBoundaryBegin 4295 +MimeEntityEnd 4294 +MultipartBoundaryBegin 4294 MultipartBoundaryEnd 4322 MimeEntityBegin 4322 MimeEntityHeadersEnd 4449 -MimeContentBegin 4449 -MimeContentEnd 4976 Octets 527 Lines 8 -MimeEntityEnd 4977 -MultipartBoundaryBegin 4977 +MimeEntityEnd 4976 +MultipartBoundaryBegin 4976 MultipartBoundaryEnd 5004 MimeEntityBegin 5004 MimeEntityHeadersEnd 5129 -MimeContentBegin 5129 -MimeContentEnd 5627 Octets 498 Lines 7 -MimeEntityEnd 5628 -MultipartBoundaryBegin 5628 +MimeEntityEnd 5627 +MultipartBoundaryBegin 5627 MultipartBoundaryEnd 5655 MimeEntityBegin 5655 MimeEntityHeadersEnd 5799 -MimeContentBegin 5799 MimeMessageBegin 5799 -MimeMessageHeadersEnd 6228 MimeEntityBegin 5799 MimeEntityHeadersEnd 6228 -MimeContentBegin 6228 -MimeContentEnd 6265 +MimeMessageHeadersEnd 6228 Octets 37 Lines 2 -MimeEntityEnd 6266 -MimeMessageEnd 6266 -MimeContentEnd 6266 -Octets 467 +MimeEntityEnd 6265 +MimeMessageEnd 6265 +Octets 466 Lines 13 -MimeEntityEnd 6266 -MultipartBoundaryBegin 6266 +MimeEntityEnd 6265 +MultipartBoundaryBegin 6265 MultipartBoundaryEnd 6293 MimeEntityBegin 6293 MimeEntityHeadersEnd 6464 -MimeContentBegin 6464 MimeMessageBegin 6464 -MimeMessageHeadersEnd 7034 MimeEntityBegin 6464 MimeEntityHeadersEnd 7034 -MimeContentBegin 7034 +MimeMessageHeadersEnd 7034 MimeMessageBegin 7034 -MimeMessageHeadersEnd 7545 MimeEntityBegin 7034 MimeEntityHeadersEnd 7545 -MimeContentBegin 7545 +MimeMessageHeadersEnd 7545 MimeMessageBegin 7545 -MimeMessageHeadersEnd 7955 MimeEntityBegin 7545 MimeEntityHeadersEnd 7955 -MimeContentBegin 7955 -MimeContentEnd 7960 +MimeMessageHeadersEnd 7955 Octets 5 Lines 2 -MimeEntityEnd 7961 -MimeMessageEnd 7961 -MimeContentEnd 7961 -Octets 416 +MimeEntityEnd 7960 +MimeMessageEnd 7960 +Octets 415 Lines 13 -MimeEntityEnd 7961 -MimeMessageEnd 7961 -MimeContentEnd 7961 -Octets 927 +MimeEntityEnd 7960 +MimeMessageEnd 7960 +Octets 926 Lines 27 -MimeEntityEnd 7961 -MimeMessageEnd 7961 -MimeContentEnd 7961 -Octets 1497 +MimeEntityEnd 7960 +MimeMessageEnd 7960 +Octets 1496 Lines 42 -MimeEntityEnd 7961 -MultipartBoundaryBegin 7961 +MimeEntityEnd 7960 +MultipartBoundaryBegin 7960 MultipartBoundaryEnd 7988 MimeEntityBegin 7988 MimeEntityHeadersEnd 8041 -MimeContentBegin 8041 -MimeContentEnd 8093 Octets 52 Lines 2 -MimeEntityEnd 8094 -MultipartEndBoundaryBegin 8094 +MimeEntityEnd 8093 +MultipartEndBoundaryBegin 8093 MultipartEndBoundaryEnd 8122 MultipartEpilogueBegin 8122 MultipartEpilogueEnd 8122 -MimeContentEnd 8123 -Octets 5758 +Octets 5757 Lines 145 -MimeEntityEnd 8123 -MimeMessageEnd 8123 +MimeEntityEnd 8122 +MimeMessageEnd 8122 MboxMarkerBegin 8123 MboxMarkerEnd 8130 MimeMessageBegin 8131 MimeMessageHeadersEnd 8602 MimeEntityBegin 8131 MimeEntityHeadersEnd 8602 -MimeContentBegin 8602 MultipartPreambleBegin 8602 MultipartPreambleEnd 8648 MultipartBoundaryBegin 8648 MultipartBoundaryEnd 8675 MimeEntityBegin 8675 MimeEntityHeadersEnd 8823 -MimeContentBegin 8823 MimeMessageBegin 8823 -MimeMessageHeadersEnd 9251 MimeEntityBegin 8823 MimeEntityHeadersEnd 9251 -MimeContentBegin 9251 -MimeContentEnd 9288 +MimeMessageHeadersEnd 9251 Octets 37 Lines 3 -MimeEntityEnd 9289 -MimeMessageEnd 9289 -MimeContentEnd 9289 -Octets 466 +MimeEntityEnd 9288 +MimeMessageEnd 9288 +Octets 465 Lines 14 -MimeEntityEnd 9289 -MultipartBoundaryBegin 9289 +MimeEntityEnd 9288 +MultipartBoundaryBegin 9288 MultipartBoundaryEnd 9316 MimeEntityBegin 9316 MimeEntityHeadersEnd 9443 -MimeContentBegin 9443 -MimeContentEnd 9901 Octets 458 Lines 7 -MimeEntityEnd 9902 -MultipartBoundaryBegin 9902 +MimeEntityEnd 9901 +MultipartBoundaryBegin 9901 MultipartBoundaryEnd 9929 MimeEntityBegin 9929 MimeEntityHeadersEnd 10056 -MimeContentBegin 10056 -MimeContentEnd 10542 Octets 486 Lines 7 -MimeEntityEnd 10543 -MultipartBoundaryBegin 10543 +MimeEntityEnd 10542 +MultipartBoundaryBegin 10542 MultipartBoundaryEnd 10570 MimeEntityBegin 10570 MimeEntityHeadersEnd 10701 -MimeContentBegin 10701 -MimeContentEnd 11228 Octets 527 Lines 8 -MimeEntityEnd 11229 -MultipartBoundaryBegin 11229 +MimeEntityEnd 11228 +MultipartBoundaryBegin 11228 MultipartBoundaryEnd 11256 MimeEntityBegin 11256 MimeEntityHeadersEnd 11385 -MimeContentBegin 11385 -MimeContentEnd 11883 Octets 498 Lines 7 -MimeEntityEnd 11884 -MultipartBoundaryBegin 11884 +MimeEntityEnd 11883 +MultipartBoundaryBegin 11883 MultipartBoundaryEnd 11911 MimeEntityBegin 11911 MimeEntityHeadersEnd 12059 -MimeContentBegin 12059 MimeMessageBegin 12059 -MimeMessageHeadersEnd 12487 MimeEntityBegin 12059 MimeEntityHeadersEnd 12487 -MimeContentBegin 12487 -MimeContentEnd 12524 +MimeMessageHeadersEnd 12487 Octets 37 Lines 2 -MimeEntityEnd 12525 -MimeMessageEnd 12525 -MimeContentEnd 12525 -Octets 466 +MimeEntityEnd 12524 +MimeMessageEnd 12524 +Octets 465 Lines 13 -MimeEntityEnd 12525 -MultipartBoundaryBegin 12525 +MimeEntityEnd 12524 +MultipartBoundaryBegin 12524 MultipartBoundaryEnd 12552 MimeEntityBegin 12552 MimeEntityHeadersEnd 12727 -MimeContentBegin 12727 MimeMessageBegin 12727 -MimeMessageHeadersEnd 13300 MimeEntityBegin 12727 MimeEntityHeadersEnd 13300 -MimeContentBegin 13300 +MimeMessageHeadersEnd 13300 MimeMessageBegin 13300 -MimeMessageHeadersEnd 13814 MimeEntityBegin 13300 MimeEntityHeadersEnd 13814 -MimeContentBegin 13814 +MimeMessageHeadersEnd 13814 MimeMessageBegin 13814 -MimeMessageHeadersEnd 14223 MimeEntityBegin 13814 MimeEntityHeadersEnd 14223 -MimeContentBegin 14223 -MimeContentEnd 14228 +MimeMessageHeadersEnd 14223 Octets 5 Lines 2 -MimeEntityEnd 14229 -MimeMessageEnd 14229 -MimeContentEnd 14229 -Octets 415 +MimeEntityEnd 14228 +MimeMessageEnd 14228 +Octets 414 Lines 13 -MimeEntityEnd 14229 -MimeMessageEnd 14229 -MimeContentEnd 14229 -Octets 929 +MimeEntityEnd 14228 +MimeMessageEnd 14228 +Octets 928 Lines 27 -MimeEntityEnd 14229 -MimeMessageEnd 14229 -MimeContentEnd 14229 -Octets 1502 +MimeEntityEnd 14228 +MimeMessageEnd 14228 +Octets 1501 Lines 42 -MimeEntityEnd 14229 -MultipartBoundaryBegin 14229 +MimeEntityEnd 14228 +MultipartBoundaryBegin 14228 MultipartBoundaryEnd 14256 MimeEntityBegin 14256 MimeEntityHeadersEnd 14313 -MimeContentBegin 14313 -MimeContentEnd 14365 Octets 52 Lines 2 -MimeEntityEnd 14366 -MultipartEndBoundaryBegin 14366 +MimeEntityEnd 14365 +MultipartEndBoundaryBegin 14365 MultipartEndBoundaryEnd 14394 MultipartEpilogueBegin 14394 MultipartEpilogueEnd 14394 -MimeContentEnd 14395 -Octets 5793 +Octets 5792 Lines 145 -MimeEntityEnd 14395 -MimeMessageEnd 14395 +MimeEntityEnd 14394 +MimeMessageEnd 14394 MboxMarkerBegin 14395 MboxMarkerEnd 14426 MimeMessageBegin 14427 MimeMessageHeadersEnd 15930 MimeEntityBegin 14427 MimeEntityHeadersEnd 15930 -MimeContentBegin 15930 MultipartPreambleBegin 15930 MultipartPreambleEnd 15931 MultipartBoundaryBegin 15931 MultipartBoundaryEnd 15975 MimeEntityBegin 15975 MimeEntityHeadersEnd 16066 -MimeContentBegin 16066 -MimeContentEnd 21265 Octets 5199 Lines 112 -MimeEntityEnd 21266 -MultipartBoundaryBegin 21266 +MimeEntityEnd 21265 +MultipartBoundaryBegin 21265 MultipartBoundaryEnd 21310 MimeEntityBegin 21310 MimeEntityHeadersEnd 21509 -MimeContentBegin 21509 -MimeContentEnd 22438 Octets 929 Lines 14 -MimeEntityEnd 22439 -MultipartEndBoundaryBegin 22439 +MimeEntityEnd 22438 +MultipartEndBoundaryBegin 22438 MultipartEndBoundaryEnd 22484 MultipartEpilogueBegin 22484 MultipartEpilogueEnd 22485 -MimeContentEnd 22486 -Octets 6556 +Octets 6555 Lines 140 -MimeEntityEnd 22486 -MimeMessageEnd 22486 +MimeEntityEnd 22485 +MimeMessageEnd 22485 MboxMarkerBegin 22486 MboxMarkerEnd 22517 MimeMessageBegin 22518 MimeMessageHeadersEnd 23752 MimeEntityBegin 22518 MimeEntityHeadersEnd 23752 -MimeContentBegin 23752 MultipartPreambleBegin 23752 MultipartPreambleEnd 23798 MultipartBoundaryBegin 23798 MultipartBoundaryEnd 23836 MimeEntityBegin 23836 MimeEntityHeadersEnd 23912 -MimeContentBegin 23912 -MimeContentEnd 23939 Octets 27 Lines 4 -MimeEntityEnd 23940 -MultipartBoundaryBegin 23940 +MimeEntityEnd 23939 +MultipartBoundaryBegin 23939 MultipartBoundaryEnd 23978 MimeEntityBegin 23978 MimeEntityHeadersEnd 24068 -MimeContentBegin 24068 MimeMessageBegin 24068 -MimeMessageHeadersEnd 24889 MimeEntityBegin 24068 MimeEntityHeadersEnd 24889 -MimeContentBegin 24889 +MimeMessageHeadersEnd 24889 MultipartPreambleBegin 24889 MultipartPreambleEnd 24890 MultipartBoundaryBegin 24890 MultipartBoundaryEnd 24929 MimeEntityBegin 24929 MimeEntityHeadersEnd 25005 -MimeContentBegin 25005 -MimeContentEnd 25632 Octets 627 Lines 17 -MimeEntityEnd 25633 -MultipartBoundaryBegin 25633 +MimeEntityEnd 25632 +MultipartBoundaryBegin 25632 MultipartBoundaryEnd 25672 MimeEntityBegin 25672 MimeEntityHeadersEnd 25754 -MimeContentBegin 25754 MultipartPreambleBegin 25754 MultipartPreambleEnd 25755 MultipartBoundaryBegin 25755 MultipartBoundaryEnd 25794 MimeEntityBegin 25794 MimeEntityHeadersEnd 25869 -MimeContentBegin 25869 -MimeContentEnd 26719 Octets 850 Lines 19 -MimeEntityEnd 26720 -MultipartBoundaryBegin 26720 +MimeEntityEnd 26719 +MultipartBoundaryBegin 26719 MultipartBoundaryEnd 26759 MimeEntityBegin 26759 MimeEntityHeadersEnd 26943 -MimeContentBegin 26943 -MimeContentEnd 770910 Octets 743967 Lines 10192 -MimeEntityEnd 770911 -MultipartEndBoundaryBegin 770911 +MimeEntityEnd 770910 +MultipartEndBoundaryBegin 770910 MultipartEndBoundaryEnd 770951 MultipartEpilogueBegin 770951 MultipartEpilogueEnd 770952 -MimeContentEnd 770953 -Octets 745199 +Octets 745198 Lines 10224 -MimeEntityEnd 770953 -MultipartEndBoundaryBegin 770953 +MimeEntityEnd 770952 +MultipartEndBoundaryBegin 770952 MultipartEndBoundaryEnd 770993 MultipartEpilogueBegin 770993 MultipartEpilogueEnd 770996 -MimeContentEnd 770997 -Octets 746108 +Octets 746107 Lines 10253 -MimeEntityEnd 770997 -MimeMessageEnd 770997 -MimeContentEnd 770997 -Octets 746929 +MimeEntityEnd 770996 +MimeMessageEnd 770996 +Octets 746928 Lines 10269 -MimeEntityEnd 770997 -MultipartEndBoundaryBegin 770997 +MimeEntityEnd 770996 +MultipartEndBoundaryBegin 770996 MultipartEndBoundaryEnd 771036 MultipartEpilogueBegin 771036 MultipartEpilogueEnd 771037 -MimeContentEnd 771038 -Octets 747286 +Octets 747285 Lines 10286 -MimeEntityEnd 771038 -MimeMessageEnd 771038 +MimeEntityEnd 771037 +MimeMessageEnd 771037 MboxMarkerBegin 771038 MboxMarkerEnd 771069 MimeMessageBegin 771070 MimeMessageHeadersEnd 772334 MimeEntityBegin 771070 MimeEntityHeadersEnd 772334 -MimeContentBegin 772334 MultipartPreambleBegin 772334 MultipartPreambleEnd 772335 MultipartBoundaryBegin 772335 MultipartBoundaryEnd 772379 MimeEntityBegin 772379 MimeEntityHeadersEnd 772470 -MimeContentBegin 772470 -MimeContentEnd 774852 Octets 2382 Lines 51 -MimeEntityEnd 774853 -MultipartBoundaryBegin 774853 +MimeEntityEnd 774852 +MultipartBoundaryBegin 774852 MultipartBoundaryEnd 774897 MimeEntityBegin 774897 MimeEntityHeadersEnd 775056 -MimeContentBegin 775056 -MimeContentEnd 781079 Octets 6023 Lines 80 -MimeEntityEnd 781080 -MultipartBoundaryBegin 781080 +MimeEntityEnd 781079 +MultipartBoundaryBegin 781079 MultipartBoundaryEnd 781124 MimeEntityBegin 781124 MimeEntityHeadersEnd 781282 -MimeContentBegin 781282 -MimeContentEnd 793355 Octets 12073 Lines 158 -MimeEntityEnd 793356 -MultipartBoundaryBegin 793356 +MimeEntityEnd 793355 +MultipartBoundaryBegin 793355 MultipartBoundaryEnd 793400 MimeEntityBegin 793400 MimeEntityHeadersEnd 793560 -MimeContentBegin 793560 -MimeContentEnd 815274 Octets 21714 Lines 283 -MimeEntityEnd 815275 -MultipartBoundaryBegin 815275 +MimeEntityEnd 815274 +MultipartBoundaryBegin 815274 MultipartBoundaryEnd 815319 MimeEntityBegin 815319 MimeEntityHeadersEnd 815522 -MimeContentBegin 815522 -MimeContentEnd 818915 Octets 3393 Lines 46 -MimeEntityEnd 818916 -MultipartEndBoundaryBegin 818916 +MimeEntityEnd 818915 +MultipartEndBoundaryBegin 818915 MultipartEndBoundaryEnd 818961 MultipartEpilogueBegin 818961 MultipartEpilogueEnd 818962 -MimeContentEnd 818963 -Octets 46629 +Octets 46628 Lines 650 -MimeEntityEnd 818963 -MimeMessageEnd 818963 +MimeEntityEnd 818962 +MimeMessageEnd 818962 MboxMarkerBegin 818963 MboxMarkerEnd 818970 MimeMessageBegin 818971 MimeMessageHeadersEnd 819882 MimeEntityBegin 818971 MimeEntityHeadersEnd 819882 -MimeContentBegin 819882 MultipartPreambleBegin 819882 MultipartPreambleEnd 819883 MultipartBoundaryBegin 819883 MultipartBoundaryEnd 819891 MimeEntityBegin 819891 MimeEntityHeadersEnd 819920 -MimeContentBegin 819920 -MimeContentEnd 822450 Octets 2530 Lines 97 -MimeEntityEnd 822451 -MultipartEndBoundaryBegin 822451 +MimeEntityEnd 822450 +MultipartEndBoundaryBegin 822450 MultipartEndBoundaryEnd 822460 MultipartEpilogueBegin 822460 MultipartEpilogueEnd 822461 -MimeContentEnd 822462 -Octets 2580 +Octets 2579 Lines 103 -MimeEntityEnd 822462 -MimeMessageEnd 822462 +MimeEntityEnd 822461 +MimeMessageEnd 822461 MboxMarkerBegin 822462 MboxMarkerEnd 822493 MimeMessageBegin 822494 MimeMessageHeadersEnd 823647 MimeEntityBegin 822494 MimeEntityHeadersEnd 823647 -MimeContentBegin 823647 MultipartPreambleBegin 823647 MultipartPreambleEnd 823647 MultipartBoundaryBegin 823647 MultipartBoundaryEnd 823664 MimeEntityBegin 823664 MimeEntityHeadersEnd 823665 -MimeContentBegin 823665 -MimeContentEnd 824566 Octets 901 Lines 21 -MimeEntityEnd 824567 -MultipartBoundaryBegin 824567 +MimeEntityEnd 824566 +MultipartBoundaryBegin 824566 MultipartBoundaryEnd 824584 MimeEntityBegin 824584 MimeEntityHeadersEnd 824663 -MimeContentBegin 824663 -MimeContentEnd 825411 Octets 748 Lines 13 -MimeEntityEnd 825412 -MultipartEndBoundaryBegin 825412 +MimeEntityEnd 825411 +MultipartEndBoundaryBegin 825411 MultipartEndBoundaryEnd 825430 MultipartEpilogueBegin 825430 MultipartEpilogueEnd 825431 -MimeContentEnd 825432 -Octets 1785 +Octets 1784 Lines 42 -MimeEntityEnd 825432 -MimeMessageEnd 825432 +MimeEntityEnd 825431 +MimeMessageEnd 825431 MboxMarkerBegin 825432 MboxMarkerEnd 825463 MimeMessageBegin 825464 MimeMessageHeadersEnd 826606 MimeEntityBegin 825464 MimeEntityHeadersEnd 826606 -MimeContentBegin 826606 MultipartPreambleBegin 826606 MultipartPreambleEnd 826779 MultipartBoundaryBegin 826779 MultipartBoundaryEnd 826786 MimeEntityBegin 826786 MimeEntityHeadersEnd 826864 -MimeContentBegin 826864 -MimeContentEnd 827605 Octets 741 Lines 14 -MimeEntityEnd 827606 -MultipartBoundaryBegin 827606 +MimeEntityEnd 827605 +MultipartBoundaryBegin 827605 MultipartBoundaryEnd 827613 MimeEntityBegin 827613 MimeEntityHeadersEnd 827791 -MimeContentBegin 827791 -MimeContentEnd 830006 Octets 2215 Lines 32 -MimeEntityEnd 830007 -MultipartEndBoundaryBegin 830007 +MimeEntityEnd 830006 +MultipartEndBoundaryBegin 830006 MultipartEndBoundaryEnd 830015 MultipartEpilogueBegin 830015 MultipartEpilogueEnd 830015 -MimeContentEnd 830016 -Octets 3410 +Octets 3409 Lines 60 -MimeEntityEnd 830016 -MimeMessageEnd 830016 +MimeEntityEnd 830015 +MimeMessageEnd 830015 MboxMarkerBegin 830016 MboxMarkerEnd 830047 MimeMessageBegin 830048 MimeMessageHeadersEnd 831185 MimeEntityBegin 830048 MimeEntityHeadersEnd 831185 -MimeContentBegin 831185 MultipartPreambleBegin 831185 MultipartPreambleEnd 831358 MultipartBoundaryBegin 831358 MultipartBoundaryEnd 831379 MimeEntityBegin 831379 MimeEntityHeadersEnd 831457 -MimeContentBegin 831457 -MimeContentEnd 834269 Octets 2812 Lines 47 -MimeEntityEnd 834270 -MultipartBoundaryBegin 834270 +MimeEntityEnd 834269 +MultipartBoundaryBegin 834269 MultipartBoundaryEnd 834291 MimeEntityBegin 834291 MimeEntityHeadersEnd 834469 -MimeContentBegin 834469 -MimeContentEnd 837016 Octets 2547 Lines 36 -MimeEntityEnd 837017 -MultipartEndBoundaryBegin 837017 +MimeEntityEnd 837016 +MultipartEndBoundaryBegin 837016 MultipartEndBoundaryEnd 837039 MultipartEpilogueBegin 837039 MultipartEpilogueEnd 837039 -MimeContentEnd 837040 -Octets 5855 +Octets 5854 Lines 97 -MimeEntityEnd 837040 -MimeMessageEnd 837040 +MimeEntityEnd 837039 +MimeMessageEnd 837039 MboxMarkerBegin 837040 MboxMarkerEnd 837071 MimeMessageBegin 837072 MimeMessageHeadersEnd 837972 MimeEntityBegin 837072 MimeEntityHeadersEnd 837972 -MimeContentBegin 837972 MultipartPreambleBegin 837972 MultipartPreambleEnd 838018 MultipartBoundaryBegin 838018 MultipartBoundaryEnd 838045 MimeEntityBegin 838045 MimeEntityHeadersEnd 838179 -MimeContentBegin 838179 -MimeContentEnd 848901 Octets 10722 Lines 147 -MimeEntityEnd 848902 -MultipartBoundaryBegin 848902 +MimeEntityEnd 848901 +MultipartBoundaryBegin 848901 MultipartBoundaryEnd 848929 MimeEntityBegin 848929 MimeEntityHeadersEnd 849080 -MimeContentBegin 849080 -MimeContentEnd 853691 Octets 4611 Lines 64 -MimeEntityEnd 853692 -MultipartEndBoundaryBegin 853692 +MimeEntityEnd 853691 +MultipartEndBoundaryBegin 853691 MultipartEndBoundaryEnd 853720 MultipartEpilogueBegin 853720 MultipartEpilogueEnd 853721 -MimeContentEnd 853722 -Octets 15750 +Octets 15749 Lines 225 -MimeEntityEnd 853722 -MimeMessageEnd 853722 +MimeEntityEnd 853721 +MimeMessageEnd 853721 MboxMarkerBegin 853722 MboxMarkerEnd 853753 MimeMessageBegin 853754 MimeMessageHeadersEnd 855145 MimeEntityBegin 853754 MimeEntityHeadersEnd 855145 -MimeContentBegin 855145 -MimeContentEnd 856576 Octets 1431 Lines 20 -MimeEntityEnd 856577 -MimeMessageEnd 856577 +MimeEntityEnd 856576 +MimeMessageEnd 856576 MboxMarkerBegin 856577 MboxMarkerEnd 856608 MimeMessageBegin 856609 MimeMessageHeadersEnd 857962 MimeEntityBegin 856609 MimeEntityHeadersEnd 857962 -MimeContentBegin 857962 MultipartPreambleBegin 857962 MultipartPreambleEnd 857963 MultipartBoundaryBegin 857963 MultipartBoundaryEnd 858007 MimeEntityBegin 858007 MimeEntityHeadersEnd 858071 -MimeContentBegin 858071 -MimeContentEnd 858178 Octets 107 Lines 4 -MimeEntityEnd 858179 -MultipartBoundaryBegin 858179 +MimeEntityEnd 858178 +MultipartBoundaryBegin 858178 MultipartBoundaryEnd 858223 MimeEntityBegin 858223 MimeEntityHeadersEnd 858374 -MimeContentBegin 858374 -MimeContentEnd 862307 Octets 3933 Lines 54 -MimeEntityEnd 862308 -MultipartEndBoundaryBegin 862308 +MimeEntityEnd 862307 +MultipartEndBoundaryBegin 862307 MultipartEndBoundaryEnd 862353 MultipartEpilogueBegin 862353 MultipartEpilogueEnd 862354 -MimeContentEnd 862355 -Octets 4393 +Octets 4392 Lines 70 -MimeEntityEnd 862355 -MimeMessageEnd 862355 +MimeEntityEnd 862354 +MimeMessageEnd 862354 MboxMarkerBegin 862355 MboxMarkerEnd 862386 MimeMessageBegin 862387 MimeMessageHeadersEnd 863597 MimeEntityBegin 862387 MimeEntityHeadersEnd 863597 -MimeContentBegin 863597 -MimeContentEnd 867092 Octets 3495 Lines 56 -MimeEntityEnd 867093 -MimeMessageEnd 867093 +MimeEntityEnd 867092 +MimeMessageEnd 867092 MboxMarkerBegin 867093 MboxMarkerEnd 867124 MimeMessageBegin 867125 MimeMessageHeadersEnd 868202 MimeEntityBegin 867125 MimeEntityHeadersEnd 868202 -MimeContentBegin 868202 -MimeContentEnd 868863 Octets 661 Lines 10 -MimeEntityEnd 868864 -MimeMessageEnd 868864 +MimeEntityEnd 868863 +MimeMessageEnd 868863 MboxMarkerBegin 868864 MboxMarkerEnd 868895 MimeMessageBegin 868896 MimeMessageHeadersEnd 869679 MimeEntityBegin 868896 MimeEntityHeadersEnd 869679 -MimeContentBegin 869679 MimeMessageBegin 869679 -MimeMessageHeadersEnd 871059 MimeEntityBegin 869679 MimeEntityHeadersEnd 871059 -MimeContentBegin 871059 -MimeContentEnd 872491 +MimeMessageHeadersEnd 871059 Octets 1432 Lines 21 -MimeEntityEnd 872492 -MimeMessageEnd 872492 -MimeContentEnd 872492 -Octets 2813 +MimeEntityEnd 872491 +MimeMessageEnd 872491 +Octets 2812 Lines 44 -MimeEntityEnd 872492 -MimeMessageEnd 872492 +MimeEntityEnd 872491 +MimeMessageEnd 872491 MboxMarkerBegin 872492 MboxMarkerEnd 872523 MimeMessageBegin 872524 MimeMessageHeadersEnd 873234 MimeEntityBegin 872524 MimeEntityHeadersEnd 873234 -MimeContentBegin 873234 MultipartPreambleBegin 873234 MultipartPreambleEnd 873280 MultipartBoundaryBegin 873280 MultipartBoundaryEnd 873307 MimeEntityBegin 873307 MimeEntityHeadersEnd 873383 -MimeContentBegin 873383 -MimeContentEnd 873398 Octets 15 Lines 2 -MimeEntityEnd 873399 -MultipartBoundaryBegin 873399 +MimeEntityEnd 873398 +MultipartBoundaryBegin 873398 MultipartBoundaryEnd 873426 MimeEntityBegin 873426 MimeEntityHeadersEnd 873580 -MimeContentBegin 873580 MimeMessageBegin 873580 -MimeMessageHeadersEnd 874960 MimeEntityBegin 873580 MimeEntityHeadersEnd 874960 -MimeContentBegin 874960 -MimeContentEnd 876392 +MimeMessageHeadersEnd 874960 Octets 1432 Lines 21 -MimeEntityEnd 876393 -MimeMessageEnd 876393 -MimeContentEnd 876393 -Octets 2813 +MimeEntityEnd 876392 +MimeMessageEnd 876392 +Octets 2812 Lines 44 -MimeEntityEnd 876393 -MultipartEndBoundaryBegin 876393 +MimeEntityEnd 876392 +MultipartEndBoundaryBegin 876392 MultipartEndBoundaryEnd 876421 MultipartEpilogueBegin 876421 MultipartEpilogueEnd 876422 -MimeContentEnd 876423 -Octets 3189 +Octets 3188 Lines 59 -MimeEntityEnd 876423 -MimeMessageEnd 876423 +MimeEntityEnd 876422 +MimeMessageEnd 876422 MboxMarkerBegin 876423 MboxMarkerEnd 876454 MimeMessageBegin 876455 MimeMessageHeadersEnd 877120 MimeEntityBegin 876455 MimeEntityHeadersEnd 877120 -MimeContentBegin 877120 MultipartPreambleBegin 877120 MultipartPreambleEnd 877180 MultipartBoundaryBegin 877180 MultipartBoundaryEnd 877221 MimeEntityBegin 877221 MimeEntityHeadersEnd 877297 -MimeContentBegin 877297 -MimeContentEnd 877338 Octets 41 Lines 2 -MimeEntityEnd 877339 -MultipartBoundaryBegin 877339 +MimeEntityEnd 877338 +MultipartBoundaryBegin 877338 MultipartBoundaryEnd 877380 MimeEntityBegin 877380 MimeEntityHeadersEnd 877531 -MimeContentBegin 877531 -MimeContentEnd 883087 Octets 5556 Lines 77 -MimeEntityEnd 883088 -MultipartEndBoundaryBegin 883088 +MimeEntityEnd 883087 +MultipartEndBoundaryBegin 883087 MultipartEndBoundaryEnd 883130 MultipartEpilogueBegin 883130 MultipartEpilogueEnd 883131 -MimeContentEnd 883132 -Octets 6012 +Octets 6011 Lines 92 -MimeEntityEnd 883132 -MimeMessageEnd 883132 +MimeEntityEnd 883131 +MimeMessageEnd 883131 MboxMarkerBegin 883132 MboxMarkerEnd 883163 MimeMessageBegin 883164 MimeMessageHeadersEnd 884226 MimeEntityBegin 883164 MimeEntityHeadersEnd 884226 -MimeContentBegin 884226 -MimeContentEnd 894462 Octets 10236 Lines 141 -MimeEntityEnd 894463 -MimeMessageEnd 894463 +MimeEntityEnd 894462 +MimeMessageEnd 894462 MboxMarkerBegin 894463 MboxMarkerEnd 894494 MimeMessageBegin 894495 MimeMessageHeadersEnd 895871 MimeEntityBegin 894495 MimeEntityHeadersEnd 895871 -MimeContentBegin 895871 MultipartPreambleBegin 895871 MultipartPreambleEnd 895931 MultipartBoundaryBegin 895931 MultipartBoundaryEnd 895972 MimeEntityBegin 895972 MimeEntityHeadersEnd 896048 -MimeContentBegin 896048 -MimeContentEnd 896659 Octets 611 Lines 17 -MimeEntityEnd 896660 -MultipartBoundaryBegin 896660 +MimeEntityEnd 896659 +MultipartBoundaryBegin 896659 MultipartBoundaryEnd 896701 MimeEntityBegin 896701 MimeEntityHeadersEnd 896852 -MimeContentBegin 896852 -MimeContentEnd 898640 Octets 1788 Lines 25 -MimeEntityEnd 898641 -MultipartEndBoundaryBegin 898641 +MimeEntityEnd 898640 +MultipartEndBoundaryBegin 898640 MultipartEndBoundaryEnd 898683 MultipartEpilogueBegin 898683 MultipartEpilogueEnd 898684 -MimeContentEnd 898685 -Octets 2814 +Octets 2813 Lines 55 -MimeEntityEnd 898685 -MimeMessageEnd 898685 +MimeEntityEnd 898684 +MimeMessageEnd 898684 MboxMarkerBegin 898685 MboxMarkerEnd 898716 MimeMessageBegin 898717 MimeMessageHeadersEnd 899265 MimeEntityBegin 898717 MimeEntityHeadersEnd 899265 -MimeContentBegin 899265 -MimeContentEnd 899788 Octets 523 Lines 8 -MimeEntityEnd 899789 -MimeMessageEnd 899789 +MimeEntityEnd 899788 +MimeMessageEnd 899788 MboxMarkerBegin 899789 MboxMarkerEnd 899820 MimeMessageBegin 899821 MimeMessageHeadersEnd 901036 MimeEntityBegin 899821 MimeEntityHeadersEnd 901036 -MimeContentBegin 901036 -MimeContentEnd 903918 Octets 2882 Lines 39 -MimeEntityEnd 903919 -MimeMessageEnd 903919 +MimeEntityEnd 903918 +MimeMessageEnd 903918 MboxMarkerBegin 903919 MboxMarkerEnd 903950 MimeMessageBegin 903951 MimeMessageHeadersEnd 905109 MimeEntityBegin 903951 MimeEntityHeadersEnd 905109 -MimeContentBegin 905109 -MimeContentEnd 907231 Octets 2122 Lines 31 -MimeEntityEnd 907232 -MimeMessageEnd 907232 +MimeEntityEnd 907231 +MimeMessageEnd 907231 MboxMarkerBegin 907232 MboxMarkerEnd 907263 MimeMessageBegin 907264 MimeMessageHeadersEnd 908342 MimeEntityBegin 907264 MimeEntityHeadersEnd 908342 -MimeContentBegin 908342 MultipartPreambleBegin 908342 MultipartPreambleEnd 908343 MultipartBoundaryBegin 908343 MultipartBoundaryEnd 908375 MimeEntityBegin 908375 MimeEntityHeadersEnd 908439 -MimeContentBegin 908439 -MimeContentEnd 908439 Octets 0 Lines 1 -MimeEntityEnd 908440 -MultipartBoundaryBegin 908440 +MimeEntityEnd 908439 +MultipartBoundaryBegin 908439 MultipartBoundaryEnd 908472 MimeEntityBegin 908472 MimeEntityHeadersEnd 908551 -MimeContentBegin 908551 -MimeContentEnd 911264 Octets 2713 Lines 42 -MimeEntityEnd 911265 -MultipartEndBoundaryBegin 911265 +MimeEntityEnd 911264 +MultipartEndBoundaryBegin 911264 MultipartEndBoundaryEnd 911298 MultipartEpilogueBegin 911298 MultipartEpilogueEnd 911299 -MimeContentEnd 911300 -Octets 2958 +Octets 2957 Lines 54 -MimeEntityEnd 911300 -MimeMessageEnd 911300 +MimeEntityEnd 911299 +MimeMessageEnd 911299 MboxMarkerBegin 911300 MboxMarkerEnd 911331 MimeMessageBegin 911332 MimeMessageHeadersEnd 912369 MimeEntityBegin 911332 MimeEntityHeadersEnd 912369 -MimeContentBegin 912369 MultipartPreambleBegin 912369 MultipartPreambleEnd 912370 MultipartBoundaryBegin 912370 MultipartBoundaryEnd 912410 MimeEntityBegin 912410 MimeEntityHeadersEnd 912488 -MimeContentBegin 912488 -MimeContentEnd 912941 Octets 453 Lines 14 -MimeEntityEnd 912942 -MultipartBoundaryBegin 912942 +MimeEntityEnd 912941 +MultipartBoundaryBegin 912941 MultipartBoundaryEnd 912982 MimeEntityBegin 912982 MimeEntityHeadersEnd 913057 -MimeContentBegin 913057 -MimeContentEnd 913868 Octets 811 Lines 27 -MimeEntityEnd 913869 -MultipartBoundaryBegin 913869 +MimeEntityEnd 913868 +MultipartBoundaryBegin 913868 MultipartBoundaryEnd 913909 MimeEntityBegin 913909 MimeEntityHeadersEnd 914006 -MimeContentBegin 914006 -MimeContentEnd 915206 Octets 1200 Lines 17 -MimeEntityEnd 915207 -MultipartEndBoundaryBegin 915207 +MimeEntityEnd 915206 +MultipartEndBoundaryBegin 915206 MultipartEndBoundaryEnd 915248 MultipartEpilogueBegin 915248 MultipartEpilogueEnd 915249 -MimeContentEnd 915250 -Octets 2881 +Octets 2880 Lines 73 -MimeEntityEnd 915250 -MimeMessageEnd 915250 +MimeEntityEnd 915249 +MimeMessageEnd 915249 MboxMarkerBegin 915250 MboxMarkerEnd 915281 MimeMessageBegin 915282 MimeMessageHeadersEnd 916357 MimeEntityBegin 915282 MimeEntityHeadersEnd 916357 -MimeContentBegin 916357 MultipartPreambleBegin 916357 MultipartPreambleEnd 916358 MultipartBoundaryBegin 916358 MultipartBoundaryEnd 916400 MimeEntityBegin 916400 MimeEntityHeadersEnd 916470 -MimeContentBegin 916470 -MimeContentEnd 916622 Octets 152 Lines 8 -MimeEntityEnd 916623 -MultipartBoundaryBegin 916623 +MimeEntityEnd 916622 +MultipartBoundaryBegin 916622 MultipartBoundaryEnd 916665 MimeEntityBegin 916665 MimeEntityHeadersEnd 916744 -MimeContentBegin 916744 -MimeContentEnd 920840 Octets 4096 Lines 57 -MimeEntityEnd 920841 -MultipartEndBoundaryBegin 920841 +MimeEntityEnd 920840 +MultipartEndBoundaryBegin 920840 MultipartEndBoundaryEnd 920884 MultipartEpilogueBegin 920884 MultipartEpilogueEnd 920885 -MimeContentEnd 920886 -Octets 4529 +Octets 4528 Lines 76 -MimeEntityEnd 920886 -MimeMessageEnd 920886 +MimeEntityEnd 920885 +MimeMessageEnd 920885 MboxMarkerBegin 920886 MboxMarkerEnd 920917 MimeMessageBegin 920918 MimeMessageHeadersEnd 922020 MimeEntityBegin 920918 MimeEntityHeadersEnd 922020 -MimeContentBegin 922020 MultipartPreambleBegin 922020 MultipartPreambleEnd 922021 MultipartBoundaryBegin 922021 MultipartBoundaryEnd 922054 MimeEntityBegin 922054 MimeEntityHeadersEnd 922132 -MimeContentBegin 922132 -MimeContentEnd 922206 Octets 74 Lines 5 -MimeEntityEnd 922207 -MultipartBoundaryBegin 922207 +MimeEntityEnd 922206 +MultipartBoundaryBegin 922206 MultipartBoundaryEnd 922240 MimeEntityBegin 922240 MimeEntityHeadersEnd 922319 -MimeContentBegin 922319 -MimeContentEnd 926036 Octets 3717 Lines 58 -MimeEntityEnd 926037 -MultipartEndBoundaryBegin 926037 +MimeEntityEnd 926036 +MultipartEndBoundaryBegin 926036 MultipartEndBoundaryEnd 926071 MultipartEpilogueBegin 926071 MultipartEpilogueEnd 926071 -MimeContentEnd 926072 -Octets 4052 +Octets 4051 Lines 73 -MimeEntityEnd 926072 -MimeMessageEnd 926072 +MimeEntityEnd 926071 +MimeMessageEnd 926071 MboxMarkerBegin 926072 MboxMarkerEnd 926103 MimeMessageBegin 926104 MimeMessageHeadersEnd 927232 MimeEntityBegin 926104 MimeEntityHeadersEnd 927232 -MimeContentBegin 927232 MultipartPreambleBegin 927232 MultipartPreambleEnd 927345 MultipartBoundaryBegin 927345 MultipartBoundaryEnd 927369 MimeEntityBegin 927369 MimeEntityHeadersEnd 927408 -MimeContentBegin 927408 -MimeContentEnd 927596 Octets 188 Lines 7 -MimeEntityEnd 927597 -MultipartBoundaryBegin 927597 +MimeEntityEnd 927596 +MultipartBoundaryBegin 927596 MultipartBoundaryEnd 927621 MimeEntityBegin 927621 MimeEntityHeadersEnd 927651 -MimeContentBegin 927651 MimeMessageBegin 927651 -MimeMessageHeadersEnd 928457 MimeEntityBegin 927651 MimeEntityHeadersEnd 928457 -MimeContentBegin 928457 -MimeContentEnd 928468 +MimeMessageHeadersEnd 928457 Octets 11 Lines 1 -MimeEntityEnd 928469 -MimeMessageEnd 928469 -MimeContentEnd 928469 -Octets 818 +MimeEntityEnd 928468 +MimeMessageEnd 928468 +Octets 817 Lines 16 -MimeEntityEnd 928469 -MultipartEndBoundaryBegin 928469 +MimeEntityEnd 928468 +MultipartEndBoundaryBegin 928468 MultipartEndBoundaryEnd 928494 MultipartEpilogueBegin 928494 MultipartEpilogueEnd 928495 -MimeContentEnd 928496 -Octets 1264 +Octets 1263 Lines 35 -MimeEntityEnd 928496 -MimeMessageEnd 928496 +MimeEntityEnd 928495 +MimeMessageEnd 928495 MboxMarkerBegin 928496 MboxMarkerEnd 928527 MimeMessageBegin 928528 MimeMessageHeadersEnd 930393 MimeEntityBegin 928528 MimeEntityHeadersEnd 930393 -MimeContentBegin 930393 MultipartPreambleBegin 930393 MultipartPreambleEnd 930393 MultipartBoundaryBegin 930393 MultipartBoundaryEnd 930437 MimeEntityBegin 930437 MimeEntityHeadersEnd 930515 -MimeContentBegin 930515 -MimeContentEnd 931378 Octets 863 Lines 19 -MimeEntityEnd 931379 -MultipartBoundaryBegin 931379 +MimeEntityEnd 931378 +MultipartBoundaryBegin 931378 MultipartBoundaryEnd 931423 MimeEntityBegin 931423 MimeEntityHeadersEnd 931584 -MimeContentBegin 931584 -MimeContentEnd 935225 Octets 3641 Lines 62 -MimeEntityEnd 935226 -MultipartEndBoundaryBegin 935226 +MimeEntityEnd 935225 +MultipartEndBoundaryBegin 935225 MultipartEndBoundaryEnd 935271 MultipartEpilogueBegin 935271 MultipartEpilogueEnd 935272 -MimeContentEnd 935272 -Octets 4879 +Octets 4878 Lines 92 -MimeEntityEnd 935272 -MimeMessageEnd 935272 +MimeEntityEnd 935271 +MimeMessageEnd 935271 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt index 5ff75016d9..20e13faf10 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -4,8638 +4,7036 @@ MimeMessageBegin 8 MimeMessageHeadersEnd 517 MimeEntityBegin 8 MimeEntityHeadersEnd 517 -MimeContentBegin 517 MultipartPreambleBegin 517 MultipartPreambleEnd 517 MultipartBoundaryBegin 517 MultipartBoundaryEnd 534 MimeEntityBegin 534 MimeEntityHeadersEnd 630 -MimeContentBegin 630 MultipartPreambleBegin 630 MultipartPreambleEnd 630 MultipartBoundaryBegin 630 MultipartBoundaryEnd 661 MimeEntityBegin 661 MimeEntityHeadersEnd 662 -MimeContentBegin 662 -MimeContentEnd 1377 Octets 715 Lines 17 -MimeEntityEnd 1378 -MultipartBoundaryBegin 1378 +MimeEntityEnd 1377 +MultipartBoundaryBegin 1377 MultipartBoundaryEnd 1409 MimeEntityBegin 1409 MimeEntityHeadersEnd 1493 -MimeContentBegin 1493 -MimeContentEnd 32539 Octets 31046 Lines 427 -MimeEntityEnd 32540 -MultipartEndBoundaryBegin 32540 +MimeEntityEnd 32539 +MultipartEndBoundaryBegin 32539 MultipartEndBoundaryEnd 32572 MultipartEpilogueBegin 32572 MultipartEpilogueEnd 32572 -MimeContentEnd 32573 -Octets 31943 +Octets 31942 Lines 452 -MimeEntityEnd 32573 -MultipartBoundaryBegin 32573 +MimeEntityEnd 32572 +MultipartBoundaryBegin 32572 MultipartBoundaryEnd 32590 MimeEntityBegin 32590 MimeEntityHeadersEnd 32683 -MimeContentBegin 32683 MultipartPreambleBegin 32683 MultipartPreambleEnd 32683 MultipartBoundaryBegin 32683 MultipartBoundaryEnd 32714 MimeEntityBegin 32714 MimeEntityHeadersEnd 32796 -MimeContentBegin 32796 -MimeContentEnd 58444 Octets 25648 Lines 353 -MimeEntityEnd 58445 -MultipartBoundaryBegin 58445 +MimeEntityEnd 58444 +MultipartBoundaryBegin 58444 MultipartBoundaryEnd 58476 MimeEntityBegin 58476 MimeEntityHeadersEnd 58558 -MimeContentBegin 58558 -MimeContentEnd 76971 Octets 18413 Lines 254 -MimeEntityEnd 76972 -MultipartBoundaryBegin 76972 +MimeEntityEnd 76971 +MultipartBoundaryBegin 76971 MultipartBoundaryEnd 77003 MimeEntityBegin 77003 MimeEntityHeadersEnd 77117 -MimeContentBegin 77117 -MimeContentEnd 120806 Octets 43689 Lines 2437 -MimeEntityEnd 120807 -MultipartBoundaryBegin 120807 +MimeEntityEnd 120806 +MultipartBoundaryBegin 120806 MultipartBoundaryEnd 120838 MimeEntityBegin 120838 MimeEntityHeadersEnd 120899 -MimeContentBegin 120899 -MimeContentEnd 129745 Octets 8846 Lines 358 -MimeEntityEnd 129746 -MultipartEndBoundaryBegin 129746 +MimeEntityEnd 129745 +MultipartEndBoundaryBegin 129745 MultipartEndBoundaryEnd 129778 MultipartEpilogueBegin 129778 MultipartEpilogueEnd 129778 -MimeContentEnd 129779 -Octets 97096 +Octets 97095 Lines 3421 -MimeEntityEnd 129779 -MultipartBoundaryBegin 129779 +MimeEntityEnd 129778 +MultipartBoundaryBegin 129778 MultipartBoundaryEnd 129796 MimeEntityBegin 129796 MimeEntityHeadersEnd 129880 -MimeContentBegin 129880 -MimeContentEnd 177055 Octets 47175 Lines 648 -MimeEntityEnd 177056 -MultipartEndBoundaryBegin 177056 +MimeEntityEnd 177055 +MultipartEndBoundaryBegin 177055 MultipartEndBoundaryEnd 177074 MultipartEpilogueBegin 177074 MultipartEpilogueEnd 177075 -MimeContentEnd 177076 -Octets 176559 +Octets 176558 Lines 4536 -MimeEntityEnd 177076 -MimeMessageEnd 177076 +MimeEntityEnd 177075 +MimeMessageEnd 177075 MboxMarkerBegin 177076 MboxMarkerEnd 177083 MimeMessageBegin 177084 MimeMessageHeadersEnd 177633 MimeEntityBegin 177084 MimeEntityHeadersEnd 177633 -MimeContentBegin 177633 -MimeContentEnd 312903 Octets 135270 Lines 1855 -MimeEntityEnd 312904 -MimeMessageEnd 312904 +MimeEntityEnd 312903 +MimeMessageEnd 312903 MboxMarkerBegin 312904 MboxMarkerEnd 312911 MimeMessageBegin 312912 MimeMessageHeadersEnd 313291 MimeEntityBegin 312912 MimeEntityHeadersEnd 313291 -MimeContentBegin 313291 -MimeContentEnd 313492 Octets 201 Lines 4 -MimeEntityEnd 313493 -MimeMessageEnd 313493 +MimeEntityEnd 313492 +MimeMessageEnd 313492 MboxMarkerBegin 313493 MboxMarkerEnd 313500 MimeMessageBegin 313501 MimeMessageHeadersEnd 314147 MimeEntityBegin 313501 MimeEntityHeadersEnd 314147 -MimeContentBegin 314147 MultipartPreambleBegin 314147 MultipartPreambleEnd 314302 MultipartBoundaryBegin 314302 MultipartBoundaryEnd 314342 MimeEntityBegin 314342 MimeEntityHeadersEnd 314386 -MimeContentBegin 314386 -MimeContentEnd 314619 Octets 233 Lines 7 -MimeEntityEnd 314620 -MultipartBoundaryBegin 314620 +MimeEntityEnd 314619 +MultipartBoundaryBegin 314619 MultipartBoundaryEnd 314660 MimeEntityBegin 314660 MimeEntityHeadersEnd 314745 -MimeContentBegin 314745 MultipartPreambleBegin 314745 MultipartPreambleEnd 314745 MultipartBoundaryBegin 314745 MultipartBoundaryEnd 314787 MimeEntityBegin 314787 MimeEntityHeadersEnd 314878 -MimeContentBegin 314878 -MimeContentEnd 315024 Octets 146 Lines 4 -MimeEntityEnd 315025 -MultipartBoundaryBegin 315025 +MimeEntityEnd 315024 +MultipartBoundaryBegin 315024 MultipartBoundaryEnd 315067 MimeEntityBegin 315067 MimeEntityHeadersEnd 315177 -MimeContentBegin 315177 -MimeContentEnd 319545 Octets 4368 Lines 65 -MimeEntityEnd 319546 -MultipartBoundaryBegin 319546 +MimeEntityEnd 319545 +MultipartBoundaryBegin 319545 MultipartBoundaryEnd 319588 MimeEntityBegin 319588 MimeEntityHeadersEnd 319679 -MimeContentBegin 319679 -MimeContentEnd 319724 Octets 45 Lines 4 -MimeEntityEnd 319725 -MultipartEndBoundaryBegin 319725 +MimeEntityEnd 319724 +MultipartEndBoundaryBegin 319724 MultipartEndBoundaryEnd 319768 MultipartEpilogueBegin 319768 MultipartEpilogueEnd 319769 -MimeContentEnd 319770 -Octets 5025 +Octets 5024 Lines 88 -MimeEntityEnd 319770 -MultipartEndBoundaryBegin 319770 +MimeEntityEnd 319769 +MultipartEndBoundaryBegin 319769 MultipartEndBoundaryEnd 319811 MultipartEpilogueBegin 319811 MultipartEpilogueEnd 319811 -MimeContentEnd 319812 -Octets 5665 +Octets 5664 Lines 106 -MimeEntityEnd 319812 -MimeMessageEnd 319812 +MimeEntityEnd 319811 +MimeMessageEnd 319811 MboxMarkerBegin 319812 MboxMarkerEnd 319819 MimeMessageBegin 319820 MimeMessageHeadersEnd 320568 MimeEntityBegin 319820 MimeEntityHeadersEnd 320568 -MimeContentBegin 320568 MultipartPreambleBegin 320568 MultipartPreambleEnd 320763 MultipartBoundaryBegin 320763 MultipartBoundaryEnd 320825 MimeEntityBegin 320825 MimeEntityHeadersEnd 320898 -MimeContentBegin 320898 -MimeContentEnd 321322 Octets 424 Lines 13 -MimeEntityEnd 321323 -MultipartBoundaryBegin 321323 +MimeEntityEnd 321322 +MultipartBoundaryBegin 321322 MultipartBoundaryEnd 321385 MimeEntityBegin 321385 MimeEntityHeadersEnd 321415 -MimeContentBegin 321415 MimeMessageBegin 321415 -MimeMessageHeadersEnd 322251 MimeEntityBegin 321415 MimeEntityHeadersEnd 322251 -MimeContentBegin 322251 +MimeMessageHeadersEnd 322251 MultipartPreambleBegin 322251 MultipartPreambleEnd 322527 MultipartBoundaryBegin 322527 MultipartBoundaryEnd 322557 MimeEntityBegin 322557 MimeEntityHeadersEnd 322651 -MimeContentBegin 322651 -MimeContentEnd 322755 Octets 104 Lines 7 -MimeEntityEnd 322756 -MultipartBoundaryBegin 322756 +MimeEntityEnd 322755 +MultipartBoundaryBegin 322755 MultipartBoundaryEnd 322786 MimeEntityBegin 322786 MimeEntityHeadersEnd 322875 -MimeContentBegin 322875 -MimeContentEnd 343502 Octets 20627 Lines 284 -MimeEntityEnd 343503 -MultipartBoundaryBegin 343503 +MimeEntityEnd 343502 +MultipartBoundaryBegin 343502 MultipartBoundaryEnd 343533 MimeEntityBegin 343533 MimeEntityHeadersEnd 343534 -MimeContentBegin 343534 -MimeContentEnd 343534 Octets 0 Lines 0 -MimeEntityEnd 343534 -MimeContentEnd 343534 -Octets 21283 +MimeEntityEnd 343533 +Octets 21282 Lines 309 -MimeEntityEnd 343534 -MimeMessageEnd 343534 -MimeContentEnd 343534 -Octets 22119 +MimeEntityEnd 343533 +MimeMessageEnd 343533 +Octets 22118 Lines 325 -MimeEntityEnd 343534 -MultipartBoundaryBegin 343534 +MimeEntityEnd 343533 +MultipartBoundaryBegin 343533 MultipartBoundaryEnd 343596 MimeEntityBegin 343596 MimeEntityHeadersEnd 343669 -MimeContentBegin 343669 -MimeContentEnd 343776 Octets 107 Lines 5 -MimeEntityEnd 343777 -MultipartEndBoundaryBegin 343777 +MimeEntityEnd 343776 +MultipartEndBoundaryBegin 343776 MultipartEndBoundaryEnd 343840 MultipartEpilogueBegin 343840 MultipartEpilogueEnd 343841 -MimeContentEnd 343842 -Octets 23274 +Octets 23273 Lines 360 -MimeEntityEnd 343842 -MimeMessageEnd 343842 +MimeEntityEnd 343841 +MimeMessageEnd 343841 MboxMarkerBegin 343842 MboxMarkerEnd 343849 MimeMessageBegin 343850 MimeMessageHeadersEnd 344568 MimeEntityBegin 343850 MimeEntityHeadersEnd 344568 -MimeContentBegin 344568 MultipartPreambleBegin 344568 MultipartPreambleEnd 344723 MultipartBoundaryBegin 344723 MultipartBoundaryEnd 344763 MimeEntityBegin 344763 MimeEntityHeadersEnd 344807 -MimeContentBegin 344807 -MimeContentEnd 345567 Octets 760 Lines 19 -MimeEntityEnd 345568 -MultipartBoundaryBegin 345568 +MimeEntityEnd 345567 +MultipartBoundaryBegin 345567 MultipartBoundaryEnd 345608 MimeEntityBegin 345608 MimeEntityHeadersEnd 345693 -MimeContentBegin 345693 MultipartPreambleBegin 345693 MultipartPreambleEnd 345693 MultipartBoundaryBegin 345693 MultipartBoundaryEnd 345735 MimeEntityBegin 345735 MimeEntityHeadersEnd 345826 -MimeContentBegin 345826 -MimeContentEnd 346051 Octets 225 Lines 5 -MimeEntityEnd 346052 -MultipartBoundaryBegin 346052 +MimeEntityEnd 346051 +MultipartBoundaryBegin 346051 MultipartBoundaryEnd 346094 MimeEntityBegin 346094 MimeEntityHeadersEnd 346202 -MimeContentBegin 346202 -MimeContentEnd 1021266 Octets 675064 Lines 8983 -MimeEntityEnd 1021267 -MultipartBoundaryBegin 1021267 +MimeEntityEnd 1021266 +MultipartBoundaryBegin 1021266 MultipartBoundaryEnd 1021309 MimeEntityBegin 1021309 MimeEntityHeadersEnd 1021400 -MimeContentBegin 1021400 -MimeContentEnd 1021516 Octets 116 Lines 6 -MimeEntityEnd 1021517 -MultipartBoundaryBegin 1021517 +MimeEntityEnd 1021516 +MultipartBoundaryBegin 1021516 MultipartBoundaryEnd 1021559 MimeEntityBegin 1021559 MimeEntityHeadersEnd 1021685 -MimeContentBegin 1021685 -MimeContentEnd 1702821 Octets 681136 Lines 9061 -MimeEntityEnd 1702822 -MultipartBoundaryBegin 1702822 +MimeEntityEnd 1702821 +MultipartBoundaryBegin 1702821 MultipartBoundaryEnd 1702864 MimeEntityBegin 1702864 MimeEntityHeadersEnd 1702955 -MimeContentBegin 1702955 -MimeContentEnd 1702965 Octets 10 Lines 3 -MimeEntityEnd 1702966 -MultipartBoundaryBegin 1702966 +MimeEntityEnd 1702965 +MultipartBoundaryBegin 1702965 MultipartBoundaryEnd 1703008 MimeEntityBegin 1703008 MimeEntityHeadersEnd 1703125 -MimeContentBegin 1703125 -MimeContentEnd 1771303 Octets 68178 Lines 935 -MimeEntityEnd 1771304 -MultipartBoundaryBegin 1771304 +MimeEntityEnd 1771303 +MultipartBoundaryBegin 1771303 MultipartBoundaryEnd 1771346 MimeEntityBegin 1771346 MimeEntityHeadersEnd 1771437 -MimeContentBegin 1771437 -MimeContentEnd 1771575 Octets 138 Lines 6 -MimeEntityEnd 1771576 -MultipartBoundaryBegin 1771576 +MimeEntityEnd 1771575 +MultipartBoundaryBegin 1771575 MultipartBoundaryEnd 1771618 MimeEntityBegin 1771618 MimeEntityHeadersEnd 1771736 -MimeContentBegin 1771736 -MimeContentEnd 2108498 Octets 336762 Lines 4473 -MimeEntityEnd 2108499 -MultipartBoundaryBegin 2108499 +MimeEntityEnd 2108498 +MultipartBoundaryBegin 2108498 MultipartBoundaryEnd 2108541 MimeEntityBegin 2108541 MimeEntityHeadersEnd 2108632 -MimeContentBegin 2108632 -MimeContentEnd 2108637 Octets 5 Lines 2 -MimeEntityEnd 2108638 -MultipartEndBoundaryBegin 2108638 +MimeEntityEnd 2108637 +MultipartEndBoundaryBegin 2108637 MultipartEndBoundaryEnd 2108681 MultipartEpilogueBegin 2108681 MultipartEpilogueEnd 2108682 -MimeContentEnd 2108683 -Octets 1762990 +Octets 1762989 Lines 23516 -MimeEntityEnd 2108683 -MultipartEndBoundaryBegin 2108683 +MimeEntityEnd 2108682 +MultipartEndBoundaryBegin 2108682 MultipartEndBoundaryEnd 2108724 MultipartEpilogueBegin 2108724 MultipartEpilogueEnd 2108724 -MimeContentEnd 2108725 -Octets 1764157 +Octets 1764156 Lines 23546 -MimeEntityEnd 2108725 -MimeMessageEnd 2108725 +MimeEntityEnd 2108724 +MimeMessageEnd 2108724 MboxMarkerBegin 2108725 MboxMarkerEnd 2108732 MimeMessageBegin 2108733 MimeMessageHeadersEnd 2109749 MimeEntityBegin 2108733 MimeEntityHeadersEnd 2109749 -MimeContentBegin 2109749 -MimeContentEnd 2110874 Octets 1125 Lines 40 -MimeEntityEnd 2110875 -MimeMessageEnd 2110875 +MimeEntityEnd 2110874 +MimeMessageEnd 2110874 MboxMarkerBegin 2110875 MboxMarkerEnd 2110882 MimeMessageBegin 2110883 MimeMessageHeadersEnd 2111121 MimeEntityBegin 2110883 MimeEntityHeadersEnd 2111121 -MimeContentBegin 2111121 MultipartPreambleBegin 2111121 MultipartPreambleEnd 2111121 MultipartBoundaryBegin 2111121 MultipartBoundaryEnd 2111136 MimeEntityBegin 2111136 MimeEntityHeadersEnd 2111137 -MimeContentBegin 2111137 -MimeContentEnd 2111437 Octets 300 Lines 6 -MimeEntityEnd 2111438 -MultipartBoundaryBegin 2111438 +MimeEntityEnd 2111437 +MultipartBoundaryBegin 2111437 MultipartBoundaryEnd 2111453 MimeEntityBegin 2111453 MimeEntityHeadersEnd 2111529 -MimeContentBegin 2111529 MultipartPreambleBegin 2111529 MultipartPreambleEnd 2111529 MultipartBoundaryBegin 2111529 MultipartBoundaryEnd 2111545 MimeEntityBegin 2111545 MimeEntityHeadersEnd 2111622 -MimeContentBegin 2111622 -MimeContentEnd 2114882 Octets 3260 Lines 17 -MimeEntityEnd 2114883 -MultipartBoundaryBegin 2114883 +MimeEntityEnd 2114882 +MultipartBoundaryBegin 2114882 MultipartBoundaryEnd 2114899 MimeEntityBegin 2114899 MimeEntityHeadersEnd 2115002 -MimeContentBegin 2115002 -MimeContentEnd 2270901 Octets 155899 Lines 808 -MimeEntityEnd 2270902 -MultipartEndBoundaryBegin 2270902 +MimeEntityEnd 2270901 +MultipartEndBoundaryBegin 2270901 MultipartEndBoundaryEnd 2270919 MultipartEpilogueBegin 2270919 MultipartEpilogueEnd 2270919 -MimeContentEnd 2270920 -Octets 159391 +Octets 159390 Lines 837 -MimeEntityEnd 2270920 -MultipartBoundaryBegin 2270920 +MimeEntityEnd 2270919 +MultipartBoundaryBegin 2270919 MultipartBoundaryEnd 2270935 MimeEntityBegin 2270935 MimeEntityHeadersEnd 2270991 -MimeContentBegin 2270991 -MimeContentEnd 2275711 Octets 4720 Lines 196 -MimeEntityEnd 2275712 -MultipartEndBoundaryBegin 2275712 +MimeEntityEnd 2275711 +MultipartEndBoundaryBegin 2275711 MultipartEndBoundaryEnd 2275728 MultipartEpilogueBegin 2275728 MultipartEpilogueEnd 2275728 -MimeContentEnd 2275729 -Octets 164608 +Octets 164607 Lines 1050 -MimeEntityEnd 2275729 -MimeMessageEnd 2275729 +MimeEntityEnd 2275728 +MimeMessageEnd 2275728 MboxMarkerBegin 2275729 MboxMarkerEnd 2275736 MimeMessageBegin 2275737 MimeMessageHeadersEnd 2276689 MimeEntityBegin 2275737 MimeEntityHeadersEnd 2276689 -MimeContentBegin 2276689 -MimeContentEnd 2619749 Octets 343060 Lines 4457 -MimeEntityEnd 2619750 -MimeMessageEnd 2619750 +MimeEntityEnd 2619749 +MimeMessageEnd 2619749 MboxMarkerBegin 2619750 MboxMarkerEnd 2619757 MimeMessageBegin 2619758 MimeMessageHeadersEnd 2619892 MimeEntityBegin 2619758 MimeEntityHeadersEnd 2619892 -MimeContentBegin 2619892 MultipartPreambleBegin 2619892 MultipartPreambleEnd 2619892 MultipartBoundaryBegin 2619892 MultipartBoundaryEnd 2619909 MimeEntityBegin 2619909 MimeEntityHeadersEnd 2619982 -MimeContentBegin 2619982 MultipartPreambleBegin 2619982 MultipartPreambleEnd 2619982 MultipartBoundaryBegin 2619982 MultipartBoundaryEnd 2620013 MimeEntityBegin 2620013 MimeEntityHeadersEnd 2620014 -MimeContentBegin 2620014 -MimeContentEnd 2620721 Octets 707 Lines 18 -MimeEntityEnd 2620722 -MultipartBoundaryBegin 2620722 +MimeEntityEnd 2620721 +MultipartBoundaryBegin 2620721 MultipartBoundaryEnd 2620753 MimeEntityBegin 2620753 MimeEntityHeadersEnd 2620850 -MimeContentBegin 2620850 -MimeContentEnd 2651896 Octets 31046 Lines 427 -MimeEntityEnd 2651897 -MultipartEndBoundaryBegin 2651897 +MimeEntityEnd 2651896 +MultipartEndBoundaryBegin 2651896 MultipartEndBoundaryEnd 2651929 MultipartEpilogueBegin 2651929 MultipartEpilogueEnd 2651929 -MimeContentEnd 2651930 -Octets 31948 +Octets 31947 Lines 453 -MimeEntityEnd 2651930 -MultipartEndBoundaryBegin 2651930 +MimeEntityEnd 2651929 +MultipartEndBoundaryBegin 2651929 MultipartEndBoundaryEnd 2651948 MultipartEpilogueBegin 2651948 MultipartEpilogueEnd 2651948 -MimeContentEnd 2651949 -Octets 32057 +Octets 32056 Lines 457 -MimeEntityEnd 2651949 -MimeMessageEnd 2651949 +MimeEntityEnd 2651948 +MimeMessageEnd 2651948 MboxMarkerBegin 2651949 MboxMarkerEnd 2651956 MimeMessageBegin 2651957 MimeMessageHeadersEnd 2652514 MimeEntityBegin 2651957 MimeEntityHeadersEnd 2652514 -MimeContentBegin 2652514 -MimeContentEnd 2709293 Octets 56779 Lines 783 -MimeEntityEnd 2709294 -MimeMessageEnd 2709294 +MimeEntityEnd 2709293 +MimeMessageEnd 2709293 MboxMarkerBegin 2709294 MboxMarkerEnd 2709301 MimeMessageBegin 2709302 MimeMessageHeadersEnd 2710035 MimeEntityBegin 2709302 MimeEntityHeadersEnd 2710035 -MimeContentBegin 2710035 MultipartPreambleBegin 2710035 MultipartPreambleEnd 2710561 MultipartBoundaryBegin 2710561 MultipartBoundaryEnd 2710619 MimeEntityBegin 2710619 MimeEntityHeadersEnd 2710620 -MimeContentBegin 2710620 -MimeContentEnd 2711172 Octets 552 Lines 15 -MimeEntityEnd 2711173 -MultipartBoundaryBegin 2711173 +MimeEntityEnd 2711172 +MultipartBoundaryBegin 2711172 MultipartBoundaryEnd 2711231 MimeEntityBegin 2711231 MimeEntityHeadersEnd 2711334 -MimeContentBegin 2711334 MultipartPreambleBegin 2711334 MultipartPreambleEnd 2711334 MultipartBoundaryBegin 2711334 MultipartBoundaryEnd 2711394 MimeEntityBegin 2711394 MimeEntityHeadersEnd 2711467 -MimeContentBegin 2711467 -MimeContentEnd 2711886 Octets 419 Lines 8 -MimeEntityEnd 2711887 -MultipartBoundaryBegin 2711887 +MimeEntityEnd 2711886 +MultipartBoundaryBegin 2711886 MultipartBoundaryEnd 2711947 MimeEntityBegin 2711947 MimeEntityHeadersEnd 2712006 -MimeContentBegin 2712006 -MimeContentEnd 2741267 Octets 29261 Lines 402 -MimeEntityEnd 2741268 -MultipartBoundaryBegin 2741268 +MimeEntityEnd 2741267 +MultipartBoundaryBegin 2741267 MultipartBoundaryEnd 2741328 MimeEntityBegin 2741328 MimeEntityHeadersEnd 2741398 -MimeContentBegin 2741398 -MimeContentEnd 2741439 Octets 41 Lines 5 -MimeEntityEnd 2741440 -MultipartEndBoundaryBegin 2741440 +MimeEntityEnd 2741439 +MultipartEndBoundaryBegin 2741439 MultipartEndBoundaryEnd 2741501 MultipartEpilogueBegin 2741501 MultipartEpilogueEnd 2741502 -MimeContentEnd 2741503 -Octets 30169 +Octets 30168 Lines 429 -MimeEntityEnd 2741503 -MultipartEndBoundaryBegin 2741503 +MimeEntityEnd 2741502 +MultipartEndBoundaryBegin 2741502 MultipartEndBoundaryEnd 2741562 MultipartEpilogueBegin 2741562 MultipartEpilogueEnd 2741562 -MimeContentEnd 2741563 -Octets 31528 +Octets 31527 Lines 459 -MimeEntityEnd 2741563 -MimeMessageEnd 2741563 +MimeEntityEnd 2741562 +MimeMessageEnd 2741562 MboxMarkerBegin 2741563 MboxMarkerEnd 2741570 MimeMessageBegin 2741571 MimeMessageHeadersEnd 2742224 MimeEntityBegin 2741571 MimeEntityHeadersEnd 2742224 -MimeContentBegin 2742224 MultipartPreambleBegin 2742224 MultipartPreambleEnd 2742564 MultipartBoundaryBegin 2742564 MultipartBoundaryEnd 2742593 MimeEntityBegin 2742593 MimeEntityHeadersEnd 2742594 -MimeContentBegin 2742594 -MimeContentEnd 2743415 Octets 821 Lines 28 -MimeEntityEnd 2743416 -MultipartBoundaryBegin 2743416 +MimeEntityEnd 2743415 +MultipartBoundaryBegin 2743415 MultipartBoundaryEnd 2743445 MimeEntityBegin 2743445 MimeEntityHeadersEnd 2743518 -MimeContentBegin 2743518 MultipartPreambleBegin 2743518 MultipartPreambleEnd 2743518 MultipartBoundaryBegin 2743518 MultipartBoundaryEnd 2743549 MimeEntityBegin 2743549 MimeEntityHeadersEnd 2743575 -MimeContentBegin 2743575 -MimeContentEnd 2743712 Octets 137 Lines 6 -MimeEntityEnd 2743713 -MultipartBoundaryBegin 2743713 +MimeEntityEnd 2743712 +MultipartBoundaryBegin 2743712 MultipartBoundaryEnd 2743744 MimeEntityBegin 2743744 MimeEntityHeadersEnd 2743809 -MimeContentBegin 2743809 -MimeContentEnd 2745006 Octets 1197 Lines 18 -MimeEntityEnd 2745007 -MultipartBoundaryBegin 2745007 +MimeEntityEnd 2745006 +MultipartBoundaryBegin 2745006 MultipartBoundaryEnd 2745038 MimeEntityBegin 2745038 MimeEntityHeadersEnd 2745064 -MimeContentBegin 2745064 -MimeContentEnd 2745132 Octets 68 Lines 1 -MimeEntityEnd 2745133 -MultipartBoundaryBegin 2745133 +MimeEntityEnd 2745132 +MultipartBoundaryBegin 2745132 MultipartBoundaryEnd 2745164 MimeEntityBegin 2745164 MimeEntityHeadersEnd 2745229 -MimeContentBegin 2745229 -MimeContentEnd 2746434 Octets 1205 Lines 18 -MimeEntityEnd 2746435 -MultipartBoundaryBegin 2746435 +MimeEntityEnd 2746434 +MultipartBoundaryBegin 2746434 MultipartBoundaryEnd 2746466 MimeEntityBegin 2746466 MimeEntityHeadersEnd 2746495 -MimeContentBegin 2746495 -MimeContentEnd 2747041 Octets 546 Lines 14 -MimeEntityEnd 2747042 -MultipartEndBoundaryBegin 2747042 +MimeEntityEnd 2747041 +MultipartEndBoundaryBegin 2747041 MultipartEndBoundaryEnd 2747074 MultipartEpilogueBegin 2747074 MultipartEpilogueEnd 2747075 -MimeContentEnd 2747076 -Octets 3558 +Octets 3557 Lines 76 -MimeEntityEnd 2747076 -MultipartEndBoundaryBegin 2747076 +MimeEntityEnd 2747075 +MultipartEndBoundaryBegin 2747075 MultipartEndBoundaryEnd 2747106 MultipartEpilogueBegin 2747106 MultipartEpilogueEnd 2747107 -MimeContentEnd 2747108 -Octets 4884 +Octets 4883 Lines 119 -MimeEntityEnd 2747108 -MimeMessageEnd 2747108 +MimeEntityEnd 2747107 +MimeMessageEnd 2747107 MboxMarkerBegin 2747108 MboxMarkerEnd 2747115 MimeMessageBegin 2747116 MimeMessageHeadersEnd 2748092 MimeEntityBegin 2747116 MimeEntityHeadersEnd 2748092 -MimeContentBegin 2748092 -MimeContentEnd 2749474 Octets 1382 Lines 33 -MimeEntityEnd 2749475 -MimeMessageEnd 2749475 +MimeEntityEnd 2749474 +MimeMessageEnd 2749474 MboxMarkerBegin 2749475 MboxMarkerEnd 2749482 MimeMessageBegin 2749483 MimeMessageHeadersEnd 2749739 MimeEntityBegin 2749483 MimeEntityHeadersEnd 2749739 -MimeContentBegin 2749739 -MimeContentEnd 2749995 Octets 256 Lines 6 -MimeEntityEnd 2749996 -MimeMessageEnd 2749996 +MimeEntityEnd 2749995 +MimeMessageEnd 2749995 MboxMarkerBegin 2749996 MboxMarkerEnd 2750003 MimeMessageBegin 2750004 MimeMessageHeadersEnd 2750661 MimeEntityBegin 2750004 MimeEntityHeadersEnd 2750661 -MimeContentBegin 2750661 -MimeContentEnd 2751385 Octets 724 Lines 14 -MimeEntityEnd 2751386 -MimeMessageEnd 2751386 +MimeEntityEnd 2751385 +MimeMessageEnd 2751385 MboxMarkerBegin 2751386 MboxMarkerEnd 2751393 MimeMessageBegin 2751394 MimeMessageHeadersEnd 2752379 MimeEntityBegin 2751394 MimeEntityHeadersEnd 2752379 -MimeContentBegin 2752379 MultipartPreambleBegin 2752379 MultipartPreambleEnd 2752381 MultipartBoundaryBegin 2752381 MultipartBoundaryEnd 2752420 MimeEntityBegin 2752420 MimeEntityHeadersEnd 2752466 -MimeContentBegin 2752466 -MimeContentEnd 2752538 Octets 72 Lines 6 -MimeEntityEnd 2752539 -MultipartBoundaryBegin 2752539 +MimeEntityEnd 2752538 +MultipartBoundaryBegin 2752538 MultipartBoundaryEnd 2752578 MimeEntityBegin 2752578 MimeEntityHeadersEnd 2752665 -MimeContentBegin 2752665 MultipartPreambleBegin 2752665 MultipartPreambleEnd 2752667 MultipartBoundaryBegin 2752667 MultipartBoundaryEnd 2752707 MimeEntityBegin 2752707 MimeEntityHeadersEnd 2752862 -MimeContentBegin 2752862 -MimeContentEnd 2818779 Octets 65917 Lines 958 -MimeEntityEnd 2818780 -MultipartBoundaryBegin 2818780 +MimeEntityEnd 2818779 +MultipartBoundaryBegin 2818779 MultipartBoundaryEnd 2818820 MimeEntityBegin 2818820 MimeEntityHeadersEnd 2819029 -MimeContentBegin 2819029 -MimeContentEnd 3183310 Octets 364281 Lines 5282 -MimeEntityEnd 3183311 -MultipartEndBoundaryBegin 3183311 +MimeEntityEnd 3183310 +MultipartEndBoundaryBegin 3183310 MultipartEndBoundaryEnd 3183352 MultipartEpilogueBegin 3183352 MultipartEpilogueEnd 3183354 -MimeContentEnd 3183355 -Octets 430690 +Octets 430689 Lines 6257 -MimeEntityEnd 3183355 -MultipartEndBoundaryBegin 3183355 +MimeEntityEnd 3183354 +MultipartEndBoundaryBegin 3183354 MultipartEndBoundaryEnd 3183395 MultipartEpilogueBegin 3183395 MultipartEpilogueEnd 3183395 -MimeContentEnd 3183396 -Octets 431017 +Octets 431016 Lines 6272 -MimeEntityEnd 3183396 -MimeMessageEnd 3183396 +MimeEntityEnd 3183395 +MimeMessageEnd 3183395 MboxMarkerBegin 3183396 MboxMarkerEnd 3183403 MimeMessageBegin 3183404 MimeMessageHeadersEnd 3184389 MimeEntityBegin 3183404 MimeEntityHeadersEnd 3184389 -MimeContentBegin 3184389 MultipartPreambleBegin 3184389 MultipartPreambleEnd 3184391 MultipartBoundaryBegin 3184391 MultipartBoundaryEnd 3184430 MimeEntityBegin 3184430 MimeEntityHeadersEnd 3184476 -MimeContentBegin 3184476 -MimeContentEnd 3184548 Octets 72 Lines 6 -MimeEntityEnd 3184549 -MultipartBoundaryBegin 3184549 +MimeEntityEnd 3184548 +MultipartBoundaryBegin 3184548 MultipartBoundaryEnd 3184588 MimeEntityBegin 3184588 MimeEntityHeadersEnd 3184674 -MimeContentBegin 3184674 MultipartPreambleBegin 3184674 MultipartPreambleEnd 3184676 MultipartBoundaryBegin 3184676 MultipartBoundaryEnd 3184716 MimeEntityBegin 3184716 MimeEntityHeadersEnd 3184871 -MimeContentBegin 3184871 -MimeContentEnd 3250788 Octets 65917 Lines 958 -MimeEntityEnd 3250789 -MultipartBoundaryBegin 3250789 +MimeEntityEnd 3250788 +MultipartBoundaryBegin 3250788 MultipartBoundaryEnd 3250829 MimeEntityBegin 3250829 MimeEntityHeadersEnd 3251038 -MimeContentBegin 3251038 -MimeContentEnd 3615319 Octets 364281 Lines 5282 -MimeEntityEnd 3615320 -MultipartEndBoundaryBegin 3615320 +MimeEntityEnd 3615319 +MultipartEndBoundaryBegin 3615319 MultipartEndBoundaryEnd 3615361 MultipartEpilogueBegin 3615361 MultipartEpilogueEnd 3615363 -MimeContentEnd 3615364 -Octets 430690 +Octets 430689 Lines 6257 -MimeEntityEnd 3615364 -MultipartEndBoundaryBegin 3615364 +MimeEntityEnd 3615363 +MultipartEndBoundaryBegin 3615363 MultipartEndBoundaryEnd 3615404 MultipartEpilogueBegin 3615404 MultipartEpilogueEnd 3615404 -MimeContentEnd 3615405 -Octets 431016 +Octets 431015 Lines 6272 -MimeEntityEnd 3615405 -MimeMessageEnd 3615405 +MimeEntityEnd 3615404 +MimeMessageEnd 3615404 MboxMarkerBegin 3615405 MboxMarkerEnd 3615412 MimeMessageBegin 3615413 MimeMessageHeadersEnd 3615971 MimeEntityBegin 3615413 MimeEntityHeadersEnd 3615971 -MimeContentBegin 3615971 MimeMessageBegin 3615971 -MimeMessageHeadersEnd 3616030 MimeEntityBegin 3615971 MimeEntityHeadersEnd 3616030 -MimeContentBegin 3616030 -MimeContentEnd 3616557 +MimeMessageHeadersEnd 3616030 Octets 527 Lines 14 -MimeEntityEnd 3616558 -MimeMessageEnd 3616558 -MimeContentEnd 3616558 -Octets 587 +MimeEntityEnd 3616557 +MimeMessageEnd 3616557 +Octets 586 Lines 17 -MimeEntityEnd 3616558 -MimeMessageEnd 3616558 +MimeEntityEnd 3616557 +MimeMessageEnd 3616557 MboxMarkerBegin 3616558 MboxMarkerEnd 3616565 MimeMessageBegin 3616566 MimeMessageHeadersEnd 3617279 MimeEntityBegin 3616566 MimeEntityHeadersEnd 3617279 -MimeContentBegin 3617279 MultipartPreambleBegin 3617279 MultipartPreambleEnd 3617280 MultipartBoundaryBegin 3617280 MultipartBoundaryEnd 3617323 MimeEntityBegin 3617323 MimeEntityHeadersEnd 3617349 -MimeContentBegin 3617349 -MimeContentEnd 3617529 Octets 180 Lines 7 -MimeEntityEnd 3617530 -MultipartBoundaryBegin 3617530 +MimeEntityEnd 3617529 +MultipartBoundaryBegin 3617529 MultipartBoundaryEnd 3617573 MimeEntityBegin 3617573 MimeEntityHeadersEnd 3617645 -MimeContentBegin 3617645 -MimeContentEnd 3618537 Octets 892 Lines 13 -MimeEntityEnd 3618538 -MultipartEndBoundaryBegin 3618538 +MimeEntityEnd 3618537 +MultipartEndBoundaryBegin 3618537 MultipartEndBoundaryEnd 3618582 MultipartEpilogueBegin 3618582 MultipartEpilogueEnd 3618690 -MimeContentEnd 3618691 -Octets 1412 +Octets 1411 Lines 34 -MimeEntityEnd 3618691 -MimeMessageEnd 3618691 +MimeEntityEnd 3618690 +MimeMessageEnd 3618690 MboxMarkerBegin 3618691 MboxMarkerEnd 3618698 MimeMessageBegin 3618699 MimeMessageHeadersEnd 3619238 MimeEntityBegin 3618699 MimeEntityHeadersEnd 3619238 -MimeContentBegin 3619238 MultipartPreambleBegin 3619238 MultipartPreambleEnd 3619275 MultipartBoundaryBegin 3619275 MultipartBoundaryEnd 3619314 MimeEntityBegin 3619314 MimeEntityHeadersEnd 3619315 -MimeContentBegin 3619315 -MimeContentEnd 3619707 Octets 392 Lines 11 -MimeEntityEnd 3619708 -MultipartBoundaryBegin 3619708 +MimeEntityEnd 3619707 +MultipartBoundaryBegin 3619707 MultipartBoundaryEnd 3619747 MimeEntityBegin 3619747 MimeEntityHeadersEnd 3619777 -MimeContentBegin 3619777 MimeMessageBegin 3619777 -MimeMessageHeadersEnd 3620564 MimeEntityBegin 3619777 MimeEntityHeadersEnd 3620564 -MimeContentBegin 3620564 -MimeContentEnd 3623917 +MimeMessageHeadersEnd 3620564 Octets 3353 Lines 73 -MimeEntityEnd 3623918 -MimeMessageEnd 3623918 -MimeContentEnd 3623918 -Octets 4141 +MimeEntityEnd 3623917 +MimeMessageEnd 3623917 +Octets 4140 Lines 89 -MimeEntityEnd 3623918 -MultipartEndBoundaryBegin 3623918 +MimeEntityEnd 3623917 +MultipartEndBoundaryBegin 3623917 MultipartEndBoundaryEnd 3623958 MultipartEpilogueBegin 3623958 MultipartEpilogueEnd 3623959 -MimeContentEnd 3623960 -Octets 4722 +Octets 4721 Lines 109 -MimeEntityEnd 3623960 -MimeMessageEnd 3623960 +MimeEntityEnd 3623959 +MimeMessageEnd 3623959 MboxMarkerBegin 3623960 MboxMarkerEnd 3623967 MimeMessageBegin 3623968 MimeMessageHeadersEnd 3624617 MimeEntityBegin 3623968 MimeEntityHeadersEnd 3624617 -MimeContentBegin 3624617 MultipartPreambleBegin 3624617 MultipartPreambleEnd 3624617 MultipartBoundaryBegin 3624617 MultipartBoundaryEnd 3624666 MimeEntityBegin 3624666 MimeEntityHeadersEnd 3624692 -MimeContentBegin 3624692 -MimeContentEnd 3624766 Octets 74 Lines 5 -MimeEntityEnd 3624767 -MultipartBoundaryBegin 3624767 +MimeEntityEnd 3624766 +MultipartBoundaryBegin 3624766 MultipartBoundaryEnd 3624816 MimeEntityBegin 3624816 MimeEntityHeadersEnd 3624878 -MimeContentBegin 3624878 MimeMessageBegin 3624878 -MimeMessageHeadersEnd 3625660 MimeEntityBegin 3624878 MimeEntityHeadersEnd 3625660 -MimeContentBegin 3625660 -MimeContentEnd 3625797 +MimeMessageHeadersEnd 3625660 Octets 137 Lines 4 -MimeEntityEnd 3625798 -MimeMessageEnd 3625798 -MimeContentEnd 3625798 -Octets 920 +MimeEntityEnd 3625797 +MimeMessageEnd 3625797 +Octets 919 Lines 21 -MimeEntityEnd 3625798 -MultipartEndBoundaryBegin 3625798 +MimeEntityEnd 3625797 +MultipartEndBoundaryBegin 3625797 MultipartEndBoundaryEnd 3625848 MultipartEpilogueBegin 3625848 MultipartEpilogueEnd 3625848 -MimeContentEnd 3625849 -Octets 1232 +Octets 1231 Lines 34 -MimeEntityEnd 3625849 -MimeMessageEnd 3625849 +MimeEntityEnd 3625848 +MimeMessageEnd 3625848 MboxMarkerBegin 3625849 MboxMarkerEnd 3625856 MimeMessageBegin 3625857 MimeMessageHeadersEnd 3626367 MimeEntityBegin 3625857 MimeEntityHeadersEnd 3626367 -MimeContentBegin 3626367 -MimeContentEnd 3627786 Octets 1419 Lines 46 -MimeEntityEnd 3627787 -MimeMessageEnd 3627787 +MimeEntityEnd 3627786 +MimeMessageEnd 3627786 MboxMarkerBegin 3627787 MboxMarkerEnd 3627837 MimeMessageBegin 3627838 MimeMessageHeadersEnd 3628410 MimeEntityBegin 3627838 MimeEntityHeadersEnd 3628410 -MimeContentBegin 3628410 -MimeContentEnd 3688111 Octets 59701 Lines 955 -MimeEntityEnd 3688112 -MimeMessageEnd 3688112 +MimeEntityEnd 3688111 +MimeMessageEnd 3688111 MboxMarkerBegin 3688112 MboxMarkerEnd 3688162 MimeMessageBegin 3688163 MimeMessageHeadersEnd 3688732 MimeEntityBegin 3688163 MimeEntityHeadersEnd 3688732 -MimeContentBegin 3688732 -MimeContentEnd 3748539 Octets 59807 Lines 961 -MimeEntityEnd 3748540 -MimeMessageEnd 3748540 +MimeEntityEnd 3748539 +MimeMessageEnd 3748539 MboxMarkerBegin 3748540 MboxMarkerEnd 3748547 MimeMessageBegin 3748548 MimeMessageHeadersEnd 3749096 MimeEntityBegin 3748548 MimeEntityHeadersEnd 3749096 -MimeContentBegin 3749096 MultipartPreambleBegin 3749096 MultipartPreambleEnd 3749097 MultipartBoundaryBegin 3749097 MultipartBoundaryEnd 3749112 MimeEntityBegin 3749112 MimeEntityHeadersEnd 3749139 -MimeContentBegin 3749139 -MimeContentEnd 3749210 Octets 71 Lines 5 -MimeEntityEnd 3749211 -MultipartBoundaryBegin 3749211 +MimeEntityEnd 3749210 +MultipartBoundaryBegin 3749210 MultipartBoundaryEnd 3749226 MimeEntityBegin 3749226 MimeEntityHeadersEnd 3749307 -MimeContentBegin 3749307 -MimeContentEnd 3749948 Octets 641 Lines 10 -MimeEntityEnd 3749949 -MultipartEndBoundaryBegin 3749949 +MimeEntityEnd 3749948 +MultipartEndBoundaryBegin 3749948 MultipartEndBoundaryEnd 3749965 MultipartEpilogueBegin 3749965 MultipartEpilogueEnd 3749967 -MimeContentEnd 3749968 -Octets 872 +Octets 871 Lines 26 -MimeEntityEnd 3749968 -MimeMessageEnd 3749968 +MimeEntityEnd 3749967 +MimeMessageEnd 3749967 MboxMarkerBegin 3749968 MboxMarkerEnd 3749975 MimeMessageBegin 3749976 MimeMessageHeadersEnd 3750723 MimeEntityBegin 3749976 MimeEntityHeadersEnd 3750723 -MimeContentBegin 3750723 -MimeContentEnd 3792253 Octets 41530 Lines 571 -MimeEntityEnd 3792254 -MimeMessageEnd 3792254 +MimeEntityEnd 3792253 +MimeMessageEnd 3792253 MboxMarkerBegin 3792254 MboxMarkerEnd 3792261 MimeMessageBegin 3792262 MimeMessageHeadersEnd 3793416 MimeEntityBegin 3792262 MimeEntityHeadersEnd 3793416 -MimeContentBegin 3793416 MultipartPreambleBegin 3793416 MultipartPreambleEnd 3793416 MultipartBoundaryBegin 3793416 MultipartBoundaryEnd 3793421 MimeEntityBegin 3793421 MimeEntityHeadersEnd 3793422 -MimeContentBegin 3793422 -MimeContentEnd 3795344 Octets 1922 Lines 44 -MimeEntityEnd 3795345 -MultipartBoundaryBegin 3795345 +MimeEntityEnd 3795344 +MultipartBoundaryBegin 3795344 MultipartBoundaryEnd 3795350 MimeEntityBegin 3795350 MimeEntityHeadersEnd 3795455 -MimeContentBegin 3795455 -MimeContentEnd 3801677 Octets 6222 Lines 87 -MimeEntityEnd 3801678 -MultipartEndBoundaryBegin 3801678 +MimeEntityEnd 3801677 +MultipartEndBoundaryBegin 3801677 MultipartEndBoundaryEnd 3801684 MultipartEpilogueBegin 3801684 MultipartEpilogueEnd 3801685 -MimeContentEnd 3801686 -Octets 8270 +Octets 8269 Lines 140 -MimeEntityEnd 3801686 -MimeMessageEnd 3801686 +MimeEntityEnd 3801685 +MimeMessageEnd 3801685 MboxMarkerBegin 3801686 MboxMarkerEnd 3801693 MimeMessageBegin 3801694 MimeMessageHeadersEnd 3803142 MimeEntityBegin 3801694 MimeEntityHeadersEnd 3803142 -MimeContentBegin 3803142 -MimeContentEnd 3909955 Octets 106813 Lines 1571 -MimeEntityEnd 3909956 -MimeMessageEnd 3909956 +MimeEntityEnd 3909955 +MimeMessageEnd 3909955 MboxMarkerBegin 3909956 MboxMarkerEnd 3909963 MimeMessageBegin 3909964 MimeMessageHeadersEnd 3910563 MimeEntityBegin 3909964 MimeEntityHeadersEnd 3910563 -MimeContentBegin 3910563 MimeMessageBegin 3910563 -MimeMessageHeadersEnd 3911133 MimeEntityBegin 3910563 MimeEntityHeadersEnd 3911133 -MimeContentBegin 3911133 +MimeMessageHeadersEnd 3911133 MimeMessageBegin 3911133 -MimeMessageHeadersEnd 3911675 MimeEntityBegin 3911133 MimeEntityHeadersEnd 3911675 -MimeContentBegin 3911675 +MimeMessageHeadersEnd 3911675 MimeMessageBegin 3911675 -MimeMessageHeadersEnd 3912223 MimeEntityBegin 3911675 MimeEntityHeadersEnd 3912223 -MimeContentBegin 3912223 +MimeMessageHeadersEnd 3912223 MultipartPreambleBegin 3912223 MultipartPreambleEnd 3912269 MultipartBoundaryBegin 3912269 MultipartBoundaryEnd 3912327 MimeEntityBegin 3912327 MimeEntityHeadersEnd 3912403 -MimeContentBegin 3912403 -MimeContentEnd 3912452 Octets 49 Lines 2 -MimeEntityEnd 3912453 -MultipartBoundaryBegin 3912453 +MimeEntityEnd 3912452 +MultipartBoundaryBegin 3912452 MultipartBoundaryEnd 3912511 MimeEntityBegin 3912511 MimeEntityHeadersEnd 3912573 -MimeContentBegin 3912573 MimeMessageBegin 3912573 -MimeMessageHeadersEnd 3913073 MimeEntityBegin 3912573 MimeEntityHeadersEnd 3913073 -MimeContentBegin 3913073 +MimeMessageHeadersEnd 3913073 MultipartPreambleBegin 3913073 MultipartPreambleEnd 3913119 MultipartBoundaryBegin 3913119 MultipartBoundaryEnd 3913167 MimeEntityBegin 3913167 MimeEntityHeadersEnd 3913243 -MimeContentBegin 3913243 -MimeContentEnd 3913365 Octets 122 Lines 6 -MimeEntityEnd 3913366 -MultipartBoundaryBegin 3913366 +MimeEntityEnd 3913365 +MultipartBoundaryBegin 3913365 MultipartBoundaryEnd 3913414 MimeEntityBegin 3913414 MimeEntityHeadersEnd 3913483 -MimeContentBegin 3913483 -MimeContentEnd 3913766 Octets 283 Lines 5 -MimeEntityEnd 3913767 -MultipartEndBoundaryBegin 3913767 +MimeEntityEnd 3913766 +MultipartEndBoundaryBegin 3913766 MultipartEndBoundaryEnd 3913816 MultipartEpilogueBegin 3913816 MultipartEpilogueEnd 3913817 -MimeContentEnd 3913818 -Octets 745 +Octets 744 Lines 23 -MimeEntityEnd 3913818 -MimeMessageEnd 3913818 -MimeContentEnd 3913818 -Octets 1245 +MimeEntityEnd 3913817 +MimeMessageEnd 3913817 +Octets 1244 Lines 39 -MimeEntityEnd 3913818 -MultipartEndBoundaryBegin 3913818 +MimeEntityEnd 3913817 +MultipartEndBoundaryBegin 3913817 MultipartEndBoundaryEnd 3913877 MultipartEpilogueBegin 3913877 MultipartEpilogueEnd 3913880 -MimeContentEnd 3913881 -Octets 1658 +Octets 1657 Lines 55 -MimeEntityEnd 3913881 -MimeMessageEnd 3913881 -MimeContentEnd 3913881 -Octets 2206 +MimeEntityEnd 3913880 +MimeMessageEnd 3913880 +Octets 2205 Lines 71 -MimeEntityEnd 3913881 -MimeMessageEnd 3913881 -MimeContentEnd 3913881 -Octets 2748 +MimeEntityEnd 3913880 +MimeMessageEnd 3913880 +Octets 2747 Lines 87 -MimeEntityEnd 3913881 -MimeMessageEnd 3913881 -MimeContentEnd 3913881 -Octets 3318 +MimeEntityEnd 3913880 +MimeMessageEnd 3913880 +Octets 3317 Lines 103 -MimeEntityEnd 3913881 -MimeMessageEnd 3913881 +MimeEntityEnd 3913880 +MimeMessageEnd 3913880 MboxMarkerBegin 3913881 MboxMarkerEnd 3913888 MimeMessageBegin 3913889 MimeMessageHeadersEnd 3914592 MimeEntityBegin 3913889 MimeEntityHeadersEnd 3914592 -MimeContentBegin 3914592 MultipartPreambleBegin 3914592 MultipartPreambleEnd 3914592 MultipartBoundaryBegin 3914592 MultipartBoundaryEnd 3914619 MimeEntityBegin 3914619 MimeEntityHeadersEnd 3914620 -MimeContentBegin 3914620 -MimeContentEnd 3914661 Octets 41 Lines 2 -MimeEntityEnd 3914662 -MultipartBoundaryBegin 3914662 +MimeEntityEnd 3914661 +MultipartBoundaryBegin 3914661 MultipartBoundaryEnd 3914689 MimeEntityBegin 3914689 MimeEntityHeadersEnd 3914834 -MimeContentBegin 3914834 -MimeContentEnd 3992050 Octets 77216 Lines 401 -MimeEntityEnd 3992051 -MultipartBoundaryBegin 3992051 +MimeEntityEnd 3992050 +MultipartBoundaryBegin 3992050 MultipartBoundaryEnd 3992078 MimeEntityBegin 3992078 MimeEntityHeadersEnd 3992079 -MimeContentBegin 3992079 -MimeContentEnd 3992110 Octets 31 Lines 4 -MimeEntityEnd 3992111 -MultipartBoundaryBegin 3992111 +MimeEntityEnd 3992110 +MultipartBoundaryBegin 3992110 MultipartBoundaryEnd 3992138 MimeEntityBegin 3992138 MimeEntityHeadersEnd 3992285 -MimeContentBegin 3992285 -MimeContentEnd 4095487 Octets 103202 Lines 535 -MimeEntityEnd 4095488 -MultipartBoundaryBegin 4095488 +MimeEntityEnd 4095487 +MultipartBoundaryBegin 4095487 MultipartBoundaryEnd 4095515 MimeEntityBegin 4095515 MimeEntityHeadersEnd 4095516 -MimeContentBegin 4095516 -MimeContentEnd 4095676 Octets 160 Lines 5 -MimeEntityEnd 4095677 -MultipartBoundaryBegin 4095677 +MimeEntityEnd 4095676 +MultipartBoundaryBegin 4095676 MultipartBoundaryEnd 4095704 MimeEntityBegin 4095704 MimeEntityHeadersEnd 4095793 -MimeContentBegin 4095793 -MimeContentEnd 4175983 Octets 80190 Lines 1235 -MimeEntityEnd 4175984 -MultipartBoundaryBegin 4175984 +MimeEntityEnd 4175983 +MultipartBoundaryBegin 4175983 MultipartBoundaryEnd 4176011 MimeEntityBegin 4176011 MimeEntityHeadersEnd 4176012 -MimeContentBegin 4176012 -MimeContentEnd 4176032 Octets 20 Lines 3 -MimeEntityEnd 4176033 -MultipartEndBoundaryBegin 4176033 +MimeEntityEnd 4176032 +MultipartEndBoundaryBegin 4176032 MultipartEndBoundaryEnd 4176061 MultipartEpilogueBegin 4176061 MultipartEpilogueEnd 4176062 -MimeContentEnd 4176063 -Octets 261471 +Octets 261470 Lines 2211 -MimeEntityEnd 4176063 -MimeMessageEnd 4176063 +MimeEntityEnd 4176062 +MimeMessageEnd 4176062 MboxMarkerBegin 4176063 MboxMarkerEnd 4176070 MimeMessageBegin 4176071 MimeMessageHeadersEnd 4176736 MimeEntityBegin 4176071 MimeEntityHeadersEnd 4176736 -MimeContentBegin 4176736 -MimeContentEnd 4177728 Octets 992 Lines 19 -MimeEntityEnd 4177729 -MimeMessageEnd 4177729 +MimeEntityEnd 4177728 +MimeMessageEnd 4177728 MboxMarkerBegin 4177729 MboxMarkerEnd 4177736 MimeMessageBegin 4177737 MimeMessageHeadersEnd 4178793 MimeEntityBegin 4177737 MimeEntityHeadersEnd 4178793 -MimeContentBegin 4178793 MultipartPreambleBegin 4178793 MultipartPreambleEnd 4178948 MultipartBoundaryBegin 4178948 MultipartBoundaryEnd 4178988 MimeEntityBegin 4178988 MimeEntityHeadersEnd 4179032 -MimeContentBegin 4179032 -MimeContentEnd 4179436 Octets 404 Lines 14 -MimeEntityEnd 4179437 -MultipartBoundaryBegin 4179437 +MimeEntityEnd 4179436 +MultipartBoundaryBegin 4179436 MultipartBoundaryEnd 4179477 MimeEntityBegin 4179477 MimeEntityHeadersEnd 4179562 -MimeContentBegin 4179562 MultipartPreambleBegin 4179562 MultipartPreambleEnd 4179562 MultipartBoundaryBegin 4179562 MultipartBoundaryEnd 4179604 MimeEntityBegin 4179604 MimeEntityHeadersEnd 4179695 -MimeContentBegin 4179695 -MimeContentEnd 4179920 Octets 225 Lines 5 -MimeEntityEnd 4179921 -MultipartBoundaryBegin 4179921 +MimeEntityEnd 4179920 +MultipartBoundaryBegin 4179920 MultipartBoundaryEnd 4179963 MimeEntityBegin 4179963 MimeEntityHeadersEnd 4180082 -MimeContentBegin 4180082 -MimeContentEnd 4181466 Octets 1384 Lines 38 -MimeEntityEnd 4181467 -MultipartBoundaryBegin 4181467 +MimeEntityEnd 4181466 +MultipartBoundaryBegin 4181466 MultipartBoundaryEnd 4181509 MimeEntityBegin 4181509 MimeEntityHeadersEnd 4181600 -MimeContentBegin 4181600 -MimeContentEnd 4181748 Octets 148 Lines 10 -MimeEntityEnd 4181749 -MultipartEndBoundaryBegin 4181749 +MimeEntityEnd 4181748 +MultipartEndBoundaryBegin 4181748 MultipartEndBoundaryEnd 4181792 MultipartEpilogueBegin 4181792 MultipartEpilogueEnd 4181793 -MimeContentEnd 4181794 -Octets 2232 +Octets 2231 Lines 68 -MimeEntityEnd 4181794 -MultipartEndBoundaryBegin 4181794 +MimeEntityEnd 4181793 +MultipartEndBoundaryBegin 4181793 MultipartEndBoundaryEnd 4181835 MultipartEpilogueBegin 4181835 MultipartEpilogueEnd 4181836 -MimeContentEnd 4181837 -Octets 3044 +Octets 3043 Lines 94 -MimeEntityEnd 4181837 -MimeMessageEnd 4181837 +MimeEntityEnd 4181836 +MimeMessageEnd 4181836 MboxMarkerBegin 4181837 MboxMarkerEnd 4181844 MimeMessageBegin 4181845 MimeMessageHeadersEnd 4182515 MimeEntityBegin 4181845 MimeEntityHeadersEnd 4182515 -MimeContentBegin 4182515 MultipartPreambleBegin 4182515 MultipartPreambleEnd 4182515 MultipartBoundaryBegin 4182515 MultipartBoundaryEnd 4182531 MimeEntityBegin 4182531 MimeEntityHeadersEnd 4182558 -MimeContentBegin 4182558 -MimeContentEnd 4182636 Octets 78 Lines 7 -MimeEntityEnd 4182637 -MultipartBoundaryBegin 4182637 +MimeEntityEnd 4182636 +MultipartBoundaryBegin 4182636 MultipartBoundaryEnd 4182653 MimeEntityBegin 4182653 MimeEntityHeadersEnd 4182713 -MimeContentBegin 4182713 -MimeContentEnd 4187876 Octets 5163 Lines 72 -MimeEntityEnd 4187877 -MultipartEndBoundaryBegin 4187877 +MimeEntityEnd 4187876 +MultipartEndBoundaryBegin 4187876 MultipartEndBoundaryEnd 4187894 MultipartEpilogueBegin 4187894 MultipartEpilogueEnd 4187896 -MimeContentEnd 4187897 -Octets 5382 +Octets 5381 Lines 89 -MimeEntityEnd 4187897 -MimeMessageEnd 4187897 +MimeEntityEnd 4187896 +MimeMessageEnd 4187896 MboxMarkerBegin 4187897 MboxMarkerEnd 4187904 MimeMessageBegin 4187905 MimeMessageHeadersEnd 4188357 MimeEntityBegin 4187905 MimeEntityHeadersEnd 4188357 -MimeContentBegin 4188357 -MimeContentEnd 4199771 Octets 11414 Lines 186 -MimeEntityEnd 4199772 -MimeMessageEnd 4199772 +MimeEntityEnd 4199771 +MimeMessageEnd 4199771 MboxMarkerBegin 4199772 MboxMarkerEnd 4199779 MimeMessageBegin 4199780 MimeMessageHeadersEnd 4200345 MimeEntityBegin 4199780 MimeEntityHeadersEnd 4200345 -MimeContentBegin 4200345 MultipartPreambleBegin 4200345 MultipartPreambleEnd 4200345 MultipartBoundaryBegin 4200345 MultipartBoundaryEnd 4200356 MimeEntityBegin 4200356 MimeEntityHeadersEnd 4200357 -MimeContentBegin 4200357 -MimeContentEnd 4200395 Octets 38 Lines 2 -MimeEntityEnd 4200396 -MultipartBoundaryBegin 4200396 +MimeEntityEnd 4200395 +MultipartBoundaryBegin 4200395 MultipartBoundaryEnd 4200407 MimeEntityBegin 4200407 MimeEntityHeadersEnd 4200462 -MimeContentBegin 4200462 MultipartPreambleBegin 4200462 MultipartPreambleEnd 4200462 MultipartBoundaryBegin 4200462 MultipartBoundaryEnd 4200476 MimeEntityBegin 4200476 MimeEntityHeadersEnd 4200592 -MimeContentBegin 4200592 MimeMessageBegin 4200592 -MimeMessageHeadersEnd 4200669 MimeEntityBegin 4200592 MimeEntityHeadersEnd 4200669 -MimeContentBegin 4200669 -MimeContentEnd 4200736 +MimeMessageHeadersEnd 4200669 Octets 67 Lines 3 -MimeEntityEnd 4200737 -MimeMessageEnd 4200737 -MimeContentEnd 4200737 -Octets 145 +MimeEntityEnd 4200736 +MimeMessageEnd 4200736 +Octets 144 Lines 6 -MimeEntityEnd 4200737 -MultipartBoundaryBegin 4200737 +MimeEntityEnd 4200736 +MultipartBoundaryBegin 4200736 MultipartBoundaryEnd 4200751 MimeEntityBegin 4200751 MimeEntityHeadersEnd 4200938 -MimeContentBegin 4200938 MimeMessageBegin 4200938 -MimeMessageHeadersEnd 4201015 MimeEntityBegin 4200938 MimeEntityHeadersEnd 4201015 -MimeContentBegin 4201015 -MimeContentEnd 4201015 +MimeMessageHeadersEnd 4201015 Octets 0 Lines 0 -MimeEntityEnd 4201015 -MimeMessageEnd 4201015 -MimeContentEnd 4201015 -Octets 77 +MimeEntityEnd 4201014 +MimeMessageEnd 4201014 +Octets 76 Lines 3 -MimeEntityEnd 4201015 -MultipartBoundaryBegin 4201015 +MimeEntityEnd 4201014 +MultipartBoundaryBegin 4201014 MultipartBoundaryEnd 4201029 MimeEntityBegin 4201029 MimeEntityHeadersEnd 4201164 -MimeContentBegin 4201164 MimeMessageBegin 4201164 -MimeMessageHeadersEnd 4201232 MimeEntityBegin 4201164 MimeEntityHeadersEnd 4201232 -MimeContentBegin 4201232 -MimeContentEnd 4201232 +MimeMessageHeadersEnd 4201232 Octets 0 Lines 0 -MimeEntityEnd 4201232 -MimeMessageEnd 4201232 -MimeContentEnd 4201232 -Octets 68 +MimeEntityEnd 4201231 +MimeMessageEnd 4201231 +Octets 67 Lines 3 -MimeEntityEnd 4201232 -MultipartBoundaryBegin 4201232 +MimeEntityEnd 4201231 +MultipartBoundaryBegin 4201231 MultipartBoundaryEnd 4201246 MimeEntityBegin 4201246 MimeEntityHeadersEnd 4201359 -MimeContentBegin 4201359 MimeMessageBegin 4201359 -MimeMessageHeadersEnd 4201428 MimeEntityBegin 4201359 MimeEntityHeadersEnd 4201428 -MimeContentBegin 4201428 -MimeContentEnd 4201428 +MimeMessageHeadersEnd 4201428 Octets 0 Lines 0 -MimeEntityEnd 4201428 -MimeMessageEnd 4201428 -MimeContentEnd 4201428 -Octets 69 +MimeEntityEnd 4201427 +MimeMessageEnd 4201427 +Octets 68 Lines 3 -MimeEntityEnd 4201428 -MultipartBoundaryBegin 4201428 +MimeEntityEnd 4201427 +MultipartBoundaryBegin 4201427 MultipartBoundaryEnd 4201442 MimeEntityBegin 4201442 MimeEntityHeadersEnd 4201547 -MimeContentBegin 4201547 MimeMessageBegin 4201547 -MimeMessageHeadersEnd 4201616 MimeEntityBegin 4201547 MimeEntityHeadersEnd 4201616 -MimeContentBegin 4201616 -MimeContentEnd 4201616 +MimeMessageHeadersEnd 4201616 Octets 0 Lines 0 -MimeEntityEnd 4201616 -MimeMessageEnd 4201616 -MimeContentEnd 4201616 -Octets 69 +MimeEntityEnd 4201615 +MimeMessageEnd 4201615 +Octets 68 Lines 3 -MimeEntityEnd 4201616 -MultipartEndBoundaryBegin 4201616 +MimeEntityEnd 4201615 +MultipartEndBoundaryBegin 4201615 MultipartEndBoundaryEnd 4201631 MultipartEpilogueBegin 4201631 MultipartEpilogueEnd 4201632 -MimeContentEnd 4201633 -Octets 1171 +Octets 1170 Lines 50 -MimeEntityEnd 4201633 -MultipartEndBoundaryBegin 4201633 +MimeEntityEnd 4201632 +MultipartEndBoundaryBegin 4201632 MultipartEndBoundaryEnd 4201645 MultipartEpilogueBegin 4201645 MultipartEpilogueEnd 4201646 -MimeContentEnd 4201647 -Octets 1302 +Octets 1301 Lines 59 -MimeEntityEnd 4201647 -MimeMessageEnd 4201647 +MimeEntityEnd 4201646 +MimeMessageEnd 4201646 MboxMarkerBegin 4201647 MboxMarkerEnd 4201654 MimeMessageBegin 4201655 MimeMessageHeadersEnd 4202220 MimeEntityBegin 4201655 MimeEntityHeadersEnd 4202220 -MimeContentBegin 4202220 MultipartPreambleBegin 4202220 MultipartPreambleEnd 4202220 MultipartBoundaryBegin 4202220 MultipartBoundaryEnd 4202231 MimeEntityBegin 4202231 MimeEntityHeadersEnd 4202232 -MimeContentBegin 4202232 -MimeContentEnd 4205436 Octets 3204 Lines 66 -MimeEntityEnd 4205437 -MultipartBoundaryBegin 4205437 +MimeEntityEnd 4205436 +MultipartBoundaryBegin 4205436 MultipartBoundaryEnd 4205448 MimeEntityBegin 4205448 MimeEntityHeadersEnd 4205509 -MimeContentBegin 4205509 MultipartPreambleBegin 4205509 MultipartPreambleEnd 4205509 MultipartBoundaryBegin 4205509 MultipartBoundaryEnd 4205523 MimeEntityBegin 4205523 MimeEntityHeadersEnd 4205639 -MimeContentBegin 4205639 MimeMessageBegin 4205639 -MimeMessageHeadersEnd 4205716 MimeEntityBegin 4205639 MimeEntityHeadersEnd 4205716 -MimeContentBegin 4205716 -MimeContentEnd 4205783 +MimeMessageHeadersEnd 4205716 Octets 67 Lines 3 -MimeEntityEnd 4205784 -MimeMessageEnd 4205784 -MimeContentEnd 4205784 -Octets 145 +MimeEntityEnd 4205783 +MimeMessageEnd 4205783 +Octets 144 Lines 6 -MimeEntityEnd 4205784 -MultipartBoundaryBegin 4205784 +MimeEntityEnd 4205783 +MultipartBoundaryBegin 4205783 MultipartBoundaryEnd 4205798 MimeEntityBegin 4205798 MimeEntityHeadersEnd 4205985 -MimeContentBegin 4205985 MimeMessageBegin 4205985 -MimeMessageHeadersEnd 4206062 MimeEntityBegin 4205985 MimeEntityHeadersEnd 4206062 -MimeContentBegin 4206062 -MimeContentEnd 4206062 +MimeMessageHeadersEnd 4206062 Octets 0 Lines 0 -MimeEntityEnd 4206062 -MimeMessageEnd 4206062 -MimeContentEnd 4206062 -Octets 77 +MimeEntityEnd 4206061 +MimeMessageEnd 4206061 +Octets 76 Lines 3 -MimeEntityEnd 4206062 -MultipartEndBoundaryBegin 4206062 +MimeEntityEnd 4206061 +MultipartEndBoundaryBegin 4206061 MultipartEndBoundaryEnd 4206077 MultipartEpilogueBegin 4206077 MultipartEpilogueEnd 4206078 -MimeContentEnd 4206079 -Octets 570 +Octets 569 Lines 23 -MimeEntityEnd 4206079 -MultipartEndBoundaryBegin 4206079 +MimeEntityEnd 4206078 +MultipartEndBoundaryBegin 4206078 MultipartEndBoundaryEnd 4206091 MultipartEpilogueBegin 4206091 MultipartEpilogueEnd 4206092 -MimeContentEnd 4206093 -Octets 3873 +Octets 3872 Lines 96 -MimeEntityEnd 4206093 -MimeMessageEnd 4206093 +MimeEntityEnd 4206092 +MimeMessageEnd 4206092 MboxMarkerBegin 4206093 MboxMarkerEnd 4206100 MimeMessageBegin 4206101 MimeMessageHeadersEnd 4206569 MimeEntityBegin 4206101 MimeEntityHeadersEnd 4206569 -MimeContentBegin 4206569 MultipartPreambleBegin 4206569 MultipartPreambleEnd 4206615 MultipartBoundaryBegin 4206615 MultipartBoundaryEnd 4206642 MimeEntityBegin 4206642 MimeEntityHeadersEnd 4206786 -MimeContentBegin 4206786 MimeMessageBegin 4206786 -MimeMessageHeadersEnd 4207215 MimeEntityBegin 4206786 MimeEntityHeadersEnd 4207215 -MimeContentBegin 4207215 -MimeContentEnd 4207252 +MimeMessageHeadersEnd 4207215 Octets 37 Lines 3 -MimeEntityEnd 4207253 -MimeMessageEnd 4207253 -MimeContentEnd 4207253 -Octets 467 +MimeEntityEnd 4207252 +MimeMessageEnd 4207252 +Octets 466 Lines 14 -MimeEntityEnd 4207253 -MultipartBoundaryBegin 4207253 +MimeEntityEnd 4207252 +MultipartBoundaryBegin 4207252 MultipartBoundaryEnd 4207280 MimeEntityBegin 4207280 MimeEntityHeadersEnd 4207403 -MimeContentBegin 4207403 -MimeContentEnd 4207861 Octets 458 Lines 7 -MimeEntityEnd 4207862 -MultipartBoundaryBegin 4207862 +MimeEntityEnd 4207861 +MultipartBoundaryBegin 4207861 MultipartBoundaryEnd 4207889 MimeEntityBegin 4207889 MimeEntityHeadersEnd 4208012 -MimeContentBegin 4208012 -MimeContentEnd 4208498 Octets 486 Lines 7 -MimeEntityEnd 4208499 -MultipartBoundaryBegin 4208499 +MimeEntityEnd 4208498 +MultipartBoundaryBegin 4208498 MultipartBoundaryEnd 4208526 MimeEntityBegin 4208526 MimeEntityHeadersEnd 4208653 -MimeContentBegin 4208653 -MimeContentEnd 4209180 Octets 527 Lines 8 -MimeEntityEnd 4209181 -MultipartBoundaryBegin 4209181 +MimeEntityEnd 4209180 +MultipartBoundaryBegin 4209180 MultipartBoundaryEnd 4209208 MimeEntityBegin 4209208 MimeEntityHeadersEnd 4209333 -MimeContentBegin 4209333 -MimeContentEnd 4209831 Octets 498 Lines 7 -MimeEntityEnd 4209832 -MultipartBoundaryBegin 4209832 +MimeEntityEnd 4209831 +MultipartBoundaryBegin 4209831 MultipartBoundaryEnd 4209859 MimeEntityBegin 4209859 MimeEntityHeadersEnd 4210003 -MimeContentBegin 4210003 MimeMessageBegin 4210003 -MimeMessageHeadersEnd 4210432 MimeEntityBegin 4210003 MimeEntityHeadersEnd 4210432 -MimeContentBegin 4210432 -MimeContentEnd 4210469 +MimeMessageHeadersEnd 4210432 Octets 37 Lines 2 -MimeEntityEnd 4210470 -MimeMessageEnd 4210470 -MimeContentEnd 4210470 -Octets 467 +MimeEntityEnd 4210469 +MimeMessageEnd 4210469 +Octets 466 Lines 13 -MimeEntityEnd 4210470 -MultipartBoundaryBegin 4210470 +MimeEntityEnd 4210469 +MultipartBoundaryBegin 4210469 MultipartBoundaryEnd 4210497 MimeEntityBegin 4210497 MimeEntityHeadersEnd 4210668 -MimeContentBegin 4210668 MimeMessageBegin 4210668 -MimeMessageHeadersEnd 4211238 MimeEntityBegin 4210668 MimeEntityHeadersEnd 4211238 -MimeContentBegin 4211238 +MimeMessageHeadersEnd 4211238 MimeMessageBegin 4211238 -MimeMessageHeadersEnd 4211749 MimeEntityBegin 4211238 MimeEntityHeadersEnd 4211749 -MimeContentBegin 4211749 +MimeMessageHeadersEnd 4211749 MimeMessageBegin 4211749 -MimeMessageHeadersEnd 4212159 MimeEntityBegin 4211749 MimeEntityHeadersEnd 4212159 -MimeContentBegin 4212159 -MimeContentEnd 4212164 +MimeMessageHeadersEnd 4212159 Octets 5 Lines 2 -MimeEntityEnd 4212165 -MimeMessageEnd 4212165 -MimeContentEnd 4212165 -Octets 416 +MimeEntityEnd 4212164 +MimeMessageEnd 4212164 +Octets 415 Lines 13 -MimeEntityEnd 4212165 -MimeMessageEnd 4212165 -MimeContentEnd 4212165 -Octets 927 +MimeEntityEnd 4212164 +MimeMessageEnd 4212164 +Octets 926 Lines 27 -MimeEntityEnd 4212165 -MimeMessageEnd 4212165 -MimeContentEnd 4212165 -Octets 1497 +MimeEntityEnd 4212164 +MimeMessageEnd 4212164 +Octets 1496 Lines 42 -MimeEntityEnd 4212165 -MultipartBoundaryBegin 4212165 +MimeEntityEnd 4212164 +MultipartBoundaryBegin 4212164 MultipartBoundaryEnd 4212192 MimeEntityBegin 4212192 MimeEntityHeadersEnd 4212245 -MimeContentBegin 4212245 -MimeContentEnd 4212297 Octets 52 Lines 2 -MimeEntityEnd 4212298 -MultipartEndBoundaryBegin 4212298 +MimeEntityEnd 4212297 +MultipartEndBoundaryBegin 4212297 MultipartEndBoundaryEnd 4212326 MultipartEpilogueBegin 4212326 MultipartEpilogueEnd 4212326 -MimeContentEnd 4212327 -Octets 5758 +Octets 5757 Lines 145 -MimeEntityEnd 4212327 -MimeMessageEnd 4212327 +MimeEntityEnd 4212326 +MimeMessageEnd 4212326 MboxMarkerBegin 4212327 MboxMarkerEnd 4212334 MimeMessageBegin 4212335 MimeMessageHeadersEnd 4212806 MimeEntityBegin 4212335 MimeEntityHeadersEnd 4212806 -MimeContentBegin 4212806 MultipartPreambleBegin 4212806 MultipartPreambleEnd 4212852 MultipartBoundaryBegin 4212852 MultipartBoundaryEnd 4212879 MimeEntityBegin 4212879 MimeEntityHeadersEnd 4213027 -MimeContentBegin 4213027 MimeMessageBegin 4213027 -MimeMessageHeadersEnd 4213455 MimeEntityBegin 4213027 MimeEntityHeadersEnd 4213455 -MimeContentBegin 4213455 -MimeContentEnd 4213492 +MimeMessageHeadersEnd 4213455 Octets 37 Lines 3 -MimeEntityEnd 4213493 -MimeMessageEnd 4213493 -MimeContentEnd 4213493 -Octets 466 +MimeEntityEnd 4213492 +MimeMessageEnd 4213492 +Octets 465 Lines 14 -MimeEntityEnd 4213493 -MultipartBoundaryBegin 4213493 +MimeEntityEnd 4213492 +MultipartBoundaryBegin 4213492 MultipartBoundaryEnd 4213520 MimeEntityBegin 4213520 MimeEntityHeadersEnd 4213647 -MimeContentBegin 4213647 -MimeContentEnd 4214105 Octets 458 Lines 7 -MimeEntityEnd 4214106 -MultipartBoundaryBegin 4214106 +MimeEntityEnd 4214105 +MultipartBoundaryBegin 4214105 MultipartBoundaryEnd 4214133 MimeEntityBegin 4214133 MimeEntityHeadersEnd 4214260 -MimeContentBegin 4214260 -MimeContentEnd 4214746 Octets 486 Lines 7 -MimeEntityEnd 4214747 -MultipartBoundaryBegin 4214747 +MimeEntityEnd 4214746 +MultipartBoundaryBegin 4214746 MultipartBoundaryEnd 4214774 MimeEntityBegin 4214774 MimeEntityHeadersEnd 4214905 -MimeContentBegin 4214905 -MimeContentEnd 4215432 Octets 527 Lines 8 -MimeEntityEnd 4215433 -MultipartBoundaryBegin 4215433 +MimeEntityEnd 4215432 +MultipartBoundaryBegin 4215432 MultipartBoundaryEnd 4215460 MimeEntityBegin 4215460 MimeEntityHeadersEnd 4215589 -MimeContentBegin 4215589 -MimeContentEnd 4216087 Octets 498 Lines 7 -MimeEntityEnd 4216088 -MultipartBoundaryBegin 4216088 +MimeEntityEnd 4216087 +MultipartBoundaryBegin 4216087 MultipartBoundaryEnd 4216115 MimeEntityBegin 4216115 MimeEntityHeadersEnd 4216263 -MimeContentBegin 4216263 MimeMessageBegin 4216263 -MimeMessageHeadersEnd 4216691 MimeEntityBegin 4216263 MimeEntityHeadersEnd 4216691 -MimeContentBegin 4216691 -MimeContentEnd 4216728 +MimeMessageHeadersEnd 4216691 Octets 37 Lines 2 -MimeEntityEnd 4216729 -MimeMessageEnd 4216729 -MimeContentEnd 4216729 -Octets 466 +MimeEntityEnd 4216728 +MimeMessageEnd 4216728 +Octets 465 Lines 13 -MimeEntityEnd 4216729 -MultipartBoundaryBegin 4216729 +MimeEntityEnd 4216728 +MultipartBoundaryBegin 4216728 MultipartBoundaryEnd 4216756 MimeEntityBegin 4216756 MimeEntityHeadersEnd 4216931 -MimeContentBegin 4216931 MimeMessageBegin 4216931 -MimeMessageHeadersEnd 4217504 MimeEntityBegin 4216931 MimeEntityHeadersEnd 4217504 -MimeContentBegin 4217504 +MimeMessageHeadersEnd 4217504 MimeMessageBegin 4217504 -MimeMessageHeadersEnd 4218018 MimeEntityBegin 4217504 MimeEntityHeadersEnd 4218018 -MimeContentBegin 4218018 +MimeMessageHeadersEnd 4218018 MimeMessageBegin 4218018 -MimeMessageHeadersEnd 4218427 MimeEntityBegin 4218018 MimeEntityHeadersEnd 4218427 -MimeContentBegin 4218427 -MimeContentEnd 4218432 +MimeMessageHeadersEnd 4218427 Octets 5 Lines 2 -MimeEntityEnd 4218433 -MimeMessageEnd 4218433 -MimeContentEnd 4218433 -Octets 415 +MimeEntityEnd 4218432 +MimeMessageEnd 4218432 +Octets 414 Lines 13 -MimeEntityEnd 4218433 -MimeMessageEnd 4218433 -MimeContentEnd 4218433 -Octets 929 +MimeEntityEnd 4218432 +MimeMessageEnd 4218432 +Octets 928 Lines 27 -MimeEntityEnd 4218433 -MimeMessageEnd 4218433 -MimeContentEnd 4218433 -Octets 1502 +MimeEntityEnd 4218432 +MimeMessageEnd 4218432 +Octets 1501 Lines 42 -MimeEntityEnd 4218433 -MultipartBoundaryBegin 4218433 +MimeEntityEnd 4218432 +MultipartBoundaryBegin 4218432 MultipartBoundaryEnd 4218460 MimeEntityBegin 4218460 MimeEntityHeadersEnd 4218517 -MimeContentBegin 4218517 -MimeContentEnd 4218569 Octets 52 Lines 2 -MimeEntityEnd 4218570 -MultipartEndBoundaryBegin 4218570 +MimeEntityEnd 4218569 +MultipartEndBoundaryBegin 4218569 MultipartEndBoundaryEnd 4218598 MultipartEpilogueBegin 4218598 MultipartEpilogueEnd 4218598 -MimeContentEnd 4218599 -Octets 5793 +Octets 5792 Lines 145 -MimeEntityEnd 4218599 -MimeMessageEnd 4218599 +MimeEntityEnd 4218598 +MimeMessageEnd 4218598 MboxMarkerBegin 4218599 MboxMarkerEnd 4218606 MimeMessageBegin 4218607 MimeMessageHeadersEnd 4219294 MimeEntityBegin 4218607 MimeEntityHeadersEnd 4219294 -MimeContentBegin 4219294 MultipartPreambleBegin 4219294 MultipartPreambleEnd 4219335 MultipartBoundaryBegin 4219335 MultipartBoundaryEnd 4219341 MimeEntityBegin 4219341 MimeEntityHeadersEnd 4219370 -MimeContentBegin 4219370 -MimeContentEnd 4219786 Octets 416 Lines 31 -MimeEntityEnd 4219787 -MultipartBoundaryBegin 4219787 +MimeEntityEnd 4219786 +MultipartBoundaryBegin 4219786 MultipartBoundaryEnd 4219793 MimeEntityBegin 4219793 MimeEntityHeadersEnd 4219866 -MimeContentBegin 4219866 -MimeContentEnd 4220497 Octets 631 Lines 43 -MimeEntityEnd 4220498 -MultipartBoundaryBegin 4220498 +MimeEntityEnd 4220497 +MultipartBoundaryBegin 4220497 MultipartBoundaryEnd 4220504 MimeEntityBegin 4220504 MimeEntityHeadersEnd 4220505 -MimeContentBegin 4220505 -MimeContentEnd 4220523 Octets 18 Lines 1 -MimeEntityEnd 4220524 -MultipartBoundaryBegin 4220524 +MimeEntityEnd 4220523 +MultipartBoundaryBegin 4220523 MultipartBoundaryEnd 4220530 MimeEntityBegin 4220530 MimeEntityHeadersEnd 4220531 -MimeContentBegin 4220531 -MimeContentEnd 4220542 Octets 11 Lines 1 -MimeEntityEnd 4220543 -MultipartBoundaryBegin 4220543 +MimeEntityEnd 4220542 +MultipartBoundaryBegin 4220542 MultipartBoundaryEnd 4220549 MimeEntityBegin 4220549 MimeEntityHeadersEnd 4220579 -MimeContentBegin 4220579 MimeMessageBegin 4220579 -MimeMessageHeadersEnd 4220794 MimeEntityBegin 4220579 MimeEntityHeadersEnd 4220794 -MimeContentBegin 4220794 +MimeMessageHeadersEnd 4220794 MultipartPreambleBegin 4220794 MultipartPreambleEnd 4220794 MultipartBoundaryBegin 4220794 MultipartBoundaryEnd 4220800 MimeEntityBegin 4220800 MimeEntityHeadersEnd 4220825 -MimeContentBegin 4220825 -MimeContentEnd 4220848 Octets 23 Lines 1 -MimeEntityEnd 4220849 -MultipartBoundaryBegin 4220849 +MimeEntityEnd 4220848 +MultipartBoundaryBegin 4220848 MultipartBoundaryEnd 4220855 MimeEntityBegin 4220855 MimeEntityHeadersEnd 4221030 -MimeContentBegin 4221030 -MimeContentEnd 4221068 Octets 38 Lines 2 -MimeEntityEnd 4221069 -MultipartEndBoundaryBegin 4221069 +MimeEntityEnd 4221068 +MultipartEndBoundaryBegin 4221068 MultipartEndBoundaryEnd 4221076 MultipartEpilogueBegin 4221076 MultipartEpilogueEnd 4221076 -MimeContentEnd 4221077 -Octets 283 +Octets 282 Lines 13 -MimeEntityEnd 4221077 -MimeMessageEnd 4221077 -MimeContentEnd 4221077 -Octets 498 +MimeEntityEnd 4221076 +MimeMessageEnd 4221076 +Octets 497 Lines 20 -MimeEntityEnd 4221077 -MultipartBoundaryBegin 4221077 +MimeEntityEnd 4221076 +MultipartBoundaryBegin 4221076 MultipartBoundaryEnd 4221083 MimeEntityBegin 4221083 MimeEntityHeadersEnd 4221161 -MimeContentBegin 4221161 -MimeContentEnd 4230592 Octets 9431 Lines 128 -MimeEntityEnd 4230593 -MultipartBoundaryBegin 4230593 +MimeEntityEnd 4230592 +MultipartBoundaryBegin 4230592 MultipartBoundaryEnd 4230599 MimeEntityBegin 4230599 MimeEntityHeadersEnd 4230774 -MimeContentBegin 4230774 -MimeContentEnd 4230812 Octets 38 Lines 2 -MimeEntityEnd 4230813 -MultipartBoundaryBegin 4230813 +MimeEntityEnd 4230812 +MultipartBoundaryBegin 4230812 MultipartBoundaryEnd 4230819 MimeEntityBegin 4230819 MimeEntityHeadersEnd 4230967 -MimeContentBegin 4230967 -MimeContentEnd 4238788 Octets 7821 Lines 128 -MimeEntityEnd 4238789 -MultipartBoundaryBegin 4238789 +MimeEntityEnd 4238788 +MultipartBoundaryBegin 4238788 MultipartBoundaryEnd 4238795 MimeEntityBegin 4238795 MimeEntityHeadersEnd 4238847 -MimeContentBegin 4238847 MultipartPreambleBegin 4238847 MultipartPreambleEnd 4238847 MultipartBoundaryBegin 4238847 MultipartBoundaryEnd 4238857 MimeEntityBegin 4238857 MimeEntityHeadersEnd 4238858 -MimeContentBegin 4238858 MimeMessageBegin 4238858 -MimeMessageHeadersEnd 4238884 MimeEntityBegin 4238858 MimeEntityHeadersEnd 4238884 -MimeContentBegin 4238884 -MimeContentEnd 4238889 +MimeMessageHeadersEnd 4238884 Octets 5 Lines 1 -MimeEntityEnd 4238890 -MimeMessageEnd 4238890 -MimeContentEnd 4238890 -Octets 32 +MimeEntityEnd 4238889 +MimeMessageEnd 4238889 +Octets 31 Lines 4 -MimeEntityEnd 4238890 -MultipartBoundaryBegin 4238890 +MimeEntityEnd 4238889 +MultipartBoundaryBegin 4238889 MultipartBoundaryEnd 4238900 MimeEntityBegin 4238900 MimeEntityHeadersEnd 4238901 -MimeContentBegin 4238901 MimeMessageBegin 4238901 -MimeMessageHeadersEnd 4238927 MimeEntityBegin 4238901 MimeEntityHeadersEnd 4238927 -MimeContentBegin 4238927 -MimeContentEnd 4238932 +MimeMessageHeadersEnd 4238927 Octets 5 Lines 1 -MimeEntityEnd 4238933 -MimeMessageEnd 4238933 -MimeContentEnd 4238933 -Octets 32 +MimeEntityEnd 4238932 +MimeMessageEnd 4238932 +Octets 31 Lines 4 -MimeEntityEnd 4238933 -MultipartBoundaryBegin 4238933 +MimeEntityEnd 4238932 +MultipartBoundaryBegin 4238932 MultipartBoundaryEnd 4238943 MimeEntityBegin 4238943 MimeEntityHeadersEnd 4238944 -MimeContentBegin 4238944 MimeMessageBegin 4238944 -MimeMessageHeadersEnd 4238970 MimeEntityBegin 4238944 MimeEntityHeadersEnd 4238970 -MimeContentBegin 4238970 -MimeContentEnd 4238975 +MimeMessageHeadersEnd 4238970 Octets 5 Lines 1 -MimeEntityEnd 4238976 -MimeMessageEnd 4238976 -MimeContentEnd 4238976 -Octets 32 +MimeEntityEnd 4238975 +MimeMessageEnd 4238975 +Octets 31 Lines 4 -MimeEntityEnd 4238976 -MultipartBoundaryBegin 4238976 +MimeEntityEnd 4238975 +MultipartBoundaryBegin 4238975 MultipartBoundaryEnd 4238986 MimeEntityBegin 4238986 MimeEntityHeadersEnd 4239011 -MimeContentBegin 4239011 -MimeContentEnd 4239093 Octets 82 Lines 2 -MimeEntityEnd 4239094 -MultipartBoundaryBegin 4239094 +MimeEntityEnd 4239093 +MultipartBoundaryBegin 4239093 MultipartBoundaryEnd 4239104 MimeEntityBegin 4239104 MimeEntityHeadersEnd 4239105 -MimeContentBegin 4239105 MimeMessageBegin 4239105 -MimeMessageHeadersEnd 4239159 MimeEntityBegin 4239105 MimeEntityHeadersEnd 4239159 -MimeContentBegin 4239159 -MimeContentEnd 4239208 +MimeMessageHeadersEnd 4239159 Octets 49 Lines 1 -MimeEntityEnd 4239209 -MimeMessageEnd 4239209 -MimeContentEnd 4239209 -Octets 104 +MimeEntityEnd 4239208 +MimeMessageEnd 4239208 +Octets 103 Lines 5 -MimeEntityEnd 4239209 -MultipartBoundaryBegin 4239209 +MimeEntityEnd 4239208 +MultipartBoundaryBegin 4239208 MultipartBoundaryEnd 4239219 MimeEntityBegin 4239219 MimeEntityHeadersEnd 4239220 -MimeContentBegin 4239220 MimeMessageBegin 4239220 -MimeMessageHeadersEnd 4239246 MimeEntityBegin 4239220 MimeEntityHeadersEnd 4239246 -MimeContentBegin 4239246 -MimeContentEnd 4239251 +MimeMessageHeadersEnd 4239246 Octets 5 Lines 1 -MimeEntityEnd 4239252 -MimeMessageEnd 4239252 -MimeContentEnd 4239252 -Octets 32 +MimeEntityEnd 4239251 +MimeMessageEnd 4239251 +Octets 31 Lines 4 -MimeEntityEnd 4239252 -MultipartEndBoundaryBegin 4239252 +MimeEntityEnd 4239251 +MultipartEndBoundaryBegin 4239251 MultipartEndBoundaryEnd 4239263 MultipartEpilogueBegin 4239263 MultipartEpilogueEnd 4239263 -MimeContentEnd 4239264 -Octets 417 +Octets 416 Lines 37 -MimeEntityEnd 4239264 -MultipartEndBoundaryBegin 4239264 +MimeEntityEnd 4239263 +MultipartEndBoundaryBegin 4239263 MultipartEndBoundaryEnd 4239271 MultipartEpilogueBegin 4239271 MultipartEpilogueEnd 4239312 -MimeContentEnd 4239313 -Octets 20019 +Octets 20018 Lines 428 -MimeEntityEnd 4239313 -MimeMessageEnd 4239313 +MimeEntityEnd 4239312 +MimeMessageEnd 4239312 MboxMarkerBegin 4239313 MboxMarkerEnd 4239320 MimeMessageBegin 4239321 MimeMessageHeadersEnd 4239982 MimeEntityBegin 4239321 MimeEntityHeadersEnd 4239982 -MimeContentBegin 4239982 MultipartPreambleBegin 4239982 MultipartPreambleEnd 4239982 MultipartBoundaryBegin 4239982 MultipartBoundaryEnd 4240008 MimeEntityBegin 4240008 MimeEntityHeadersEnd 4240009 -MimeContentBegin 4240009 -MimeContentEnd 4241229 Octets 1220 Lines 27 -MimeEntityEnd 4241230 -MultipartBoundaryBegin 4241230 +MimeEntityEnd 4241229 +MultipartBoundaryBegin 4241229 MultipartBoundaryEnd 4241256 MimeEntityBegin 4241256 MimeEntityHeadersEnd 4241401 -MimeContentBegin 4241401 -MimeContentEnd 4312718 Octets 71317 Lines 370 -MimeEntityEnd 4312719 -MultipartBoundaryBegin 4312719 +MimeEntityEnd 4312718 +MultipartBoundaryBegin 4312718 MultipartBoundaryEnd 4312745 MimeEntityBegin 4312745 MimeEntityHeadersEnd 4312746 -MimeContentBegin 4312746 -MimeContentEnd 4312746 Octets 0 Lines 1 -MimeEntityEnd 4312747 -MultipartEndBoundaryBegin 4312747 +MimeEntityEnd 4312746 +MultipartEndBoundaryBegin 4312746 MultipartEndBoundaryEnd 4312774 MultipartEpilogueBegin 4312774 MultipartEpilogueEnd 4312775 -MimeContentEnd 4312776 -Octets 72794 +Octets 72793 Lines 410 -MimeEntityEnd 4312776 -MimeMessageEnd 4312776 +MimeEntityEnd 4312775 +MimeMessageEnd 4312775 MboxMarkerBegin 4312776 MboxMarkerEnd 4312783 MimeMessageBegin 4312784 MimeMessageHeadersEnd 4313717 MimeEntityBegin 4312784 MimeEntityHeadersEnd 4313717 -MimeContentBegin 4313717 -MimeContentEnd 4562758 Octets 249041 Lines 3431 -MimeEntityEnd 4562759 -MimeMessageEnd 4562759 +MimeEntityEnd 4562758 +MimeMessageEnd 4562758 MboxMarkerBegin 4562759 MboxMarkerEnd 4562766 MimeMessageBegin 4562767 MimeMessageHeadersEnd 4563695 MimeEntityBegin 4562767 MimeEntityHeadersEnd 4563695 -MimeContentBegin 4563695 MultipartPreambleBegin 4563695 MultipartPreambleEnd 4563890 MultipartBoundaryBegin 4563890 MultipartBoundaryEnd 4563935 MimeEntityBegin 4563935 MimeEntityHeadersEnd 4564008 -MimeContentBegin 4564008 -MimeContentEnd 4564472 Octets 464 Lines 10 -MimeEntityEnd 4564473 -MultipartBoundaryBegin 4564473 +MimeEntityEnd 4564472 +MultipartBoundaryBegin 4564472 MultipartBoundaryEnd 4564518 MimeEntityBegin 4564518 MimeEntityHeadersEnd 4564577 -MimeContentBegin 4564577 -MimeContentEnd 4588813 Octets 24236 Lines 333 -MimeEntityEnd 4588814 -MultipartBoundaryBegin 4588814 +MimeEntityEnd 4588813 +MultipartBoundaryBegin 4588813 MultipartBoundaryEnd 4588859 MimeEntityBegin 4588859 MimeEntityHeadersEnd 4588932 -MimeContentBegin 4588932 -MimeContentEnd 4589380 Octets 448 Lines 11 -MimeEntityEnd 4589381 -MultipartBoundaryBegin 4589381 +MimeEntityEnd 4589380 +MultipartBoundaryBegin 4589380 MultipartBoundaryEnd 4589426 MimeEntityBegin 4589426 MimeEntityHeadersEnd 4589485 -MimeContentBegin 4589485 -MimeContentEnd 4600699 Octets 11214 Lines 155 -MimeEntityEnd 4600700 -MultipartBoundaryBegin 4600700 +MimeEntityEnd 4600699 +MultipartBoundaryBegin 4600699 MultipartBoundaryEnd 4600745 MimeEntityBegin 4600745 MimeEntityHeadersEnd 4600818 -MimeContentBegin 4600818 -MimeContentEnd 4601122 Octets 304 Lines 7 -MimeEntityEnd 4601123 -MultipartBoundaryBegin 4601123 +MimeEntityEnd 4601122 +MultipartBoundaryBegin 4601122 MultipartBoundaryEnd 4601168 MimeEntityBegin 4601168 MimeEntityHeadersEnd 4601227 -MimeContentBegin 4601227 -MimeContentEnd 4617677 Octets 16450 Lines 227 -MimeEntityEnd 4617678 -MultipartBoundaryBegin 4617678 +MimeEntityEnd 4617677 +MultipartBoundaryBegin 4617677 MultipartBoundaryEnd 4617723 MimeEntityBegin 4617723 MimeEntityHeadersEnd 4617796 -MimeContentBegin 4617796 -MimeContentEnd 4618456 Octets 660 Lines 16 -MimeEntityEnd 4618457 -MultipartEndBoundaryBegin 4618457 +MimeEntityEnd 4618456 +MultipartEndBoundaryBegin 4618456 MultipartEndBoundaryEnd 4618503 MultipartEpilogueBegin 4618503 MultipartEpilogueEnd 4618504 -MimeContentEnd 4618505 -Octets 54810 +Octets 54809 Lines 793 -MimeEntityEnd 4618505 -MimeMessageEnd 4618505 +MimeEntityEnd 4618504 +MimeMessageEnd 4618504 MboxMarkerBegin 4618505 MboxMarkerEnd 4618512 MimeMessageBegin 4618513 MimeMessageHeadersEnd 4619332 MimeEntityBegin 4618513 MimeEntityHeadersEnd 4619332 -MimeContentBegin 4619332 MultipartPreambleBegin 4619332 MultipartPreambleEnd 4619332 MultipartBoundaryBegin 4619332 MultipartBoundaryEnd 4619361 MimeEntityBegin 4619361 MimeEntityHeadersEnd 4619362 -MimeContentBegin 4619362 -MimeContentEnd 4620012 Octets 650 Lines 19 -MimeEntityEnd 4620013 -MultipartBoundaryBegin 4620013 +MimeEntityEnd 4620012 +MultipartBoundaryBegin 4620012 MultipartBoundaryEnd 4620042 MimeEntityBegin 4620042 MimeEntityHeadersEnd 4620102 -MimeContentBegin 4620102 -MimeContentEnd 4666555 Octets 46453 Lines 762 -MimeEntityEnd 4666556 -MultipartEndBoundaryBegin 4666556 +MimeEntityEnd 4666555 +MultipartEndBoundaryBegin 4666555 MultipartEndBoundaryEnd 4666586 MultipartEpilogueBegin 4666586 MultipartEpilogueEnd 4666587 -MimeContentEnd 4666588 -Octets 47256 +Octets 47255 Lines 789 -MimeEntityEnd 4666588 -MimeMessageEnd 4666588 +MimeEntityEnd 4666587 +MimeMessageEnd 4666587 MboxMarkerBegin 4666588 MboxMarkerEnd 4666595 MimeMessageBegin 4666596 MimeMessageHeadersEnd 4667343 MimeEntityBegin 4666596 MimeEntityHeadersEnd 4667343 -MimeContentBegin 4667343 MultipartPreambleBegin 4667343 MultipartPreambleEnd 4667777 MultipartBoundaryBegin 4667777 MultipartBoundaryEnd 4667800 MimeEntityBegin 4667800 MimeEntityHeadersEnd 4667873 -MimeContentBegin 4667873 -MimeContentEnd 4673188 Octets 5315 Lines 161 -MimeEntityEnd 4673189 -MultipartBoundaryBegin 4673189 +MimeEntityEnd 4673188 +MultipartBoundaryBegin 4673188 MultipartBoundaryEnd 4673212 MimeEntityBegin 4673212 MimeEntityHeadersEnd 4673309 -MimeContentBegin 4673309 -MimeContentEnd 4675889 Octets 2580 Lines 37 -MimeEntityEnd 4675890 -MultipartBoundaryBegin 4675890 +MimeEntityEnd 4675889 +MultipartBoundaryBegin 4675889 MultipartBoundaryEnd 4675913 MimeEntityBegin 4675913 MimeEntityHeadersEnd 4675986 -MimeContentBegin 4675986 -MimeContentEnd 4676504 Octets 518 Lines 11 -MimeEntityEnd 4676505 -MultipartBoundaryBegin 4676505 +MimeEntityEnd 4676504 +MultipartBoundaryBegin 4676504 MultipartBoundaryEnd 4676528 MimeEntityBegin 4676528 MimeEntityHeadersEnd 4676642 -MimeContentBegin 4676642 -MimeContentEnd 4699702 Octets 23060 Lines 317 -MimeEntityEnd 4699703 -MultipartBoundaryBegin 4699703 +MimeEntityEnd 4699702 +MultipartBoundaryBegin 4699702 MultipartBoundaryEnd 4699726 MimeEntityBegin 4699726 MimeEntityHeadersEnd 4699799 -MimeContentBegin 4699799 -MimeContentEnd 4700377 Octets 578 Lines 15 -MimeEntityEnd 4700378 -MultipartBoundaryBegin 4700378 +MimeEntityEnd 4700377 +MultipartBoundaryBegin 4700377 MultipartBoundaryEnd 4700401 MimeEntityBegin 4700401 MimeEntityHeadersEnd 4700486 -MimeContentBegin 4700486 MimeMessageBegin 4700486 -MimeMessageHeadersEnd 4700556 MimeEntityBegin 4700486 MimeEntityHeadersEnd 4700556 -MimeContentBegin 4700556 -MimeContentEnd 4700556 +MimeMessageHeadersEnd 4700556 Octets 0 Lines 0 -MimeEntityEnd 4700556 -MimeMessageEnd 4700556 -MimeContentEnd 4700556 -Octets 70 +MimeEntityEnd 4700555 +MimeMessageEnd 4700555 +Octets 69 Lines 3 -MimeEntityEnd 4700556 -MultipartBoundaryBegin 4700556 +MimeEntityEnd 4700555 +MultipartBoundaryBegin 4700555 MultipartBoundaryEnd 4700579 MimeEntityBegin 4700579 MimeEntityHeadersEnd 4700652 -MimeContentBegin 4700652 -MimeContentEnd 4700928 Octets 276 Lines 6 -MimeEntityEnd 4700929 -MultipartBoundaryBegin 4700929 +MimeEntityEnd 4700928 +MultipartBoundaryBegin 4700928 MultipartBoundaryEnd 4700952 MimeEntityBegin 4700952 MimeEntityHeadersEnd 4701098 -MimeContentBegin 4701098 MimeMessageBegin 4701098 -MimeMessageHeadersEnd 4701168 MimeEntityBegin 4701098 MimeEntityHeadersEnd 4701168 -MimeContentBegin 4701168 -MimeContentEnd 4701168 +MimeMessageHeadersEnd 4701168 Octets 0 Lines 0 -MimeEntityEnd 4701168 -MimeMessageEnd 4701168 -MimeContentEnd 4701168 -Octets 70 +MimeEntityEnd 4701167 +MimeMessageEnd 4701167 +Octets 69 Lines 3 -MimeEntityEnd 4701168 -MultipartBoundaryBegin 4701168 +MimeEntityEnd 4701167 +MultipartBoundaryBegin 4701167 MultipartBoundaryEnd 4701191 MimeEntityBegin 4701191 MimeEntityHeadersEnd 4701264 -MimeContentBegin 4701264 -MimeContentEnd 4702333 Octets 1069 Lines 35 -MimeEntityEnd 4702334 -MultipartEndBoundaryBegin 4702334 +MimeEntityEnd 4702333 +MultipartEndBoundaryBegin 4702333 MultipartEndBoundaryEnd 4702358 MultipartEpilogueBegin 4702358 MultipartEpilogueEnd 4702358 -MimeContentEnd 4702359 -Octets 35016 +Octets 35015 Lines 639 -MimeEntityEnd 4702359 -MimeMessageEnd 4702359 +MimeEntityEnd 4702358 +MimeMessageEnd 4702358 MboxMarkerBegin 4702359 MboxMarkerEnd 4702366 MimeMessageBegin 4702367 MimeMessageHeadersEnd 4702528 MimeEntityBegin 4702367 MimeEntityHeadersEnd 4702528 -MimeContentBegin 4702528 MultipartPreambleBegin 4702528 MultipartPreambleEnd 4702528 MultipartBoundaryBegin 4702528 MultipartBoundaryEnd 4702540 MimeEntityBegin 4702540 MimeEntityHeadersEnd 4702609 -MimeContentBegin 4702609 -MimeContentEnd 4778953 Octets 76344 Lines 1146 -MimeEntityEnd 4778954 -MultipartBoundaryBegin 4778954 +MimeEntityEnd 4778953 +MultipartBoundaryBegin 4778953 MultipartBoundaryEnd 4778966 MimeEntityBegin 4778966 MimeEntityHeadersEnd 4778967 -MimeContentBegin 4778967 -MimeContentEnd 4778997 Octets 30 Lines 1 -MimeEntityEnd 4778998 -MultipartEndBoundaryBegin 4778998 +MimeEntityEnd 4778997 +MultipartEndBoundaryBegin 4778997 MultipartEndBoundaryEnd 4779011 MultipartEpilogueBegin 4779011 MultipartEpilogueEnd 4779011 -MimeContentEnd 4779012 -Octets 76484 +Octets 76483 Lines 1154 -MimeEntityEnd 4779012 -MimeMessageEnd 4779012 +MimeEntityEnd 4779011 +MimeMessageEnd 4779011 MboxMarkerBegin 4779012 MboxMarkerEnd 4779019 MimeMessageBegin 4779020 MimeMessageHeadersEnd 4780235 MimeEntityBegin 4779020 MimeEntityHeadersEnd 4780235 -MimeContentBegin 4780235 MultipartPreambleBegin 4780235 MultipartPreambleEnd 4780235 MultipartBoundaryBegin 4780235 MultipartBoundaryEnd 4780273 MimeEntityBegin 4780273 MimeEntityHeadersEnd 4780317 -MimeContentBegin 4780317 -MimeContentEnd 4780769 Octets 452 Lines 9 -MimeEntityEnd 4780770 -MultipartBoundaryBegin 4780770 +MimeEntityEnd 4780769 +MultipartBoundaryBegin 4780769 MultipartBoundaryEnd 4780808 MimeEntityBegin 4780808 MimeEntityHeadersEnd 4780901 -MimeContentBegin 4780901 -MimeContentEnd 4908644 Octets 127743 Lines 2096 -MimeEntityEnd 4908645 -MultipartEndBoundaryBegin 4908645 +MimeEntityEnd 4908644 +MultipartEndBoundaryBegin 4908644 MultipartEndBoundaryEnd 4908684 MultipartEpilogueBegin 4908684 MultipartEpilogueEnd 4908685 -MimeContentEnd 4908686 -Octets 128451 +Octets 128450 Lines 2115 -MimeEntityEnd 4908686 -MimeMessageEnd 4908686 +MimeEntityEnd 4908685 +MimeMessageEnd 4908685 MboxMarkerBegin 4908686 MboxMarkerEnd 4908693 MimeMessageBegin 4908694 MimeMessageHeadersEnd 4909446 MimeEntityBegin 4908694 MimeEntityHeadersEnd 4909446 -MimeContentBegin 4909446 MultipartPreambleBegin 4909446 MultipartPreambleEnd 4909785 MultipartBoundaryBegin 4909785 MultipartBoundaryEnd 4909843 MimeEntityBegin 4909843 MimeEntityHeadersEnd 4909844 -MimeContentBegin 4909844 -MimeContentEnd 4910639 Octets 795 Lines 19 -MimeEntityEnd 4910640 -MultipartBoundaryBegin 4910640 +MimeEntityEnd 4910639 +MultipartBoundaryBegin 4910639 MultipartBoundaryEnd 4910698 MimeEntityBegin 4910698 MimeEntityHeadersEnd 4910801 -MimeContentBegin 4910801 MultipartPreambleBegin 4910801 MultipartPreambleEnd 4910801 MultipartBoundaryBegin 4910801 MultipartBoundaryEnd 4910861 MimeEntityBegin 4910861 MimeEntityHeadersEnd 4910934 -MimeContentBegin 4910934 -MimeContentEnd 4911423 Octets 489 Lines 8 -MimeEntityEnd 4911424 -MultipartBoundaryBegin 4911424 +MimeEntityEnd 4911423 +MultipartBoundaryBegin 4911423 MultipartBoundaryEnd 4911484 MimeEntityBegin 4911484 MimeEntityHeadersEnd 4911580 -MimeContentBegin 4911580 -MimeContentEnd 4924570 Octets 12990 Lines 191 -MimeEntityEnd 4924571 -MultipartBoundaryBegin 4924571 +MimeEntityEnd 4924570 +MultipartBoundaryBegin 4924570 MultipartBoundaryEnd 4924631 MimeEntityBegin 4924631 MimeEntityHeadersEnd 4924701 -MimeContentBegin 4924701 -MimeContentEnd 4924721 Octets 20 Lines 2 -MimeEntityEnd 4924722 -MultipartBoundaryBegin 4924722 +MimeEntityEnd 4924721 +MultipartBoundaryBegin 4924721 MultipartBoundaryEnd 4924782 MimeEntityBegin 4924782 MimeEntityHeadersEnd 4924878 -MimeContentBegin 4924878 -MimeContentEnd 4980598 Octets 55720 Lines 765 -MimeEntityEnd 4980599 -MultipartBoundaryBegin 4980599 +MimeEntityEnd 4980598 +MultipartBoundaryBegin 4980598 MultipartBoundaryEnd 4980659 MimeEntityBegin 4980659 MimeEntityHeadersEnd 4980729 -MimeContentBegin 4980729 -MimeContentEnd 4980781 Octets 52 Lines 6 -MimeEntityEnd 4980782 -MultipartBoundaryBegin 4980782 +MimeEntityEnd 4980781 +MultipartBoundaryBegin 4980781 MultipartBoundaryEnd 4980842 MimeEntityBegin 4980842 MimeEntityHeadersEnd 4980903 -MimeContentBegin 4980903 -MimeContentEnd 5083055 Octets 102152 Lines 1401 -MimeEntityEnd 5083056 -MultipartBoundaryBegin 5083056 +MimeEntityEnd 5083055 +MultipartBoundaryBegin 5083055 MultipartBoundaryEnd 5083116 MimeEntityBegin 5083116 MimeEntityHeadersEnd 5083186 -MimeContentBegin 5083186 -MimeContentEnd 5083188 Octets 2 Lines 3 -MimeEntityEnd 5083189 -MultipartEndBoundaryBegin 5083189 +MimeEntityEnd 5083188 +MultipartEndBoundaryBegin 5083188 MultipartEndBoundaryEnd 5083250 MultipartEpilogueBegin 5083250 MultipartEpilogueEnd 5083251 -MimeContentEnd 5083252 -Octets 172451 +Octets 172450 Lines 2408 -MimeEntityEnd 5083252 -MultipartEndBoundaryBegin 5083252 +MimeEntityEnd 5083251 +MultipartEndBoundaryBegin 5083251 MultipartEndBoundaryEnd 5083311 MultipartEpilogueBegin 5083311 MultipartEpilogueEnd 5083311 -MimeContentEnd 5083312 -Octets 173866 +Octets 173865 Lines 2440 -MimeEntityEnd 5083312 -MimeMessageEnd 5083312 +MimeEntityEnd 5083311 +MimeMessageEnd 5083311 MboxMarkerBegin 5083312 MboxMarkerEnd 5083319 MimeMessageBegin 5083320 MimeMessageHeadersEnd 5084006 MimeEntityBegin 5083320 MimeEntityHeadersEnd 5084006 -MimeContentBegin 5084006 MultipartPreambleBegin 5084006 MultipartPreambleEnd 5084161 MultipartBoundaryBegin 5084161 MultipartBoundaryEnd 5084201 MimeEntityBegin 5084201 MimeEntityHeadersEnd 5084245 -MimeContentBegin 5084245 -MimeContentEnd 5085760 Octets 1515 Lines 30 -MimeEntityEnd 5085761 -MultipartBoundaryBegin 5085761 +MimeEntityEnd 5085760 +MultipartBoundaryBegin 5085760 MultipartBoundaryEnd 5085801 MimeEntityBegin 5085801 MimeEntityHeadersEnd 5085886 -MimeContentBegin 5085886 MultipartPreambleBegin 5085886 MultipartPreambleEnd 5085886 MultipartBoundaryBegin 5085886 MultipartBoundaryEnd 5085928 MimeEntityBegin 5085928 MimeEntityHeadersEnd 5086019 -MimeContentBegin 5086019 -MimeContentEnd 5086926 Octets 907 Lines 14 -MimeEntityEnd 5086927 -MultipartBoundaryBegin 5086927 +MimeEntityEnd 5086926 +MultipartBoundaryBegin 5086926 MultipartBoundaryEnd 5086969 MimeEntityBegin 5086969 MimeEntityHeadersEnd 5087060 -MimeContentBegin 5087060 -MimeContentEnd 5121918 Octets 34858 Lines 507 -MimeEntityEnd 5121919 -MultipartBoundaryBegin 5121919 +MimeEntityEnd 5121918 +MultipartBoundaryBegin 5121918 MultipartBoundaryEnd 5121961 MimeEntityBegin 5121961 MimeEntityHeadersEnd 5122052 -MimeContentBegin 5122052 -MimeContentEnd 5122062 Octets 10 Lines 3 -MimeEntityEnd 5122063 -MultipartBoundaryBegin 5122063 +MimeEntityEnd 5122062 +MultipartBoundaryBegin 5122062 MultipartBoundaryEnd 5122105 MimeEntityBegin 5122105 MimeEntityHeadersEnd 5122196 -MimeContentBegin 5122196 -MimeContentEnd 5143530 Octets 21334 Lines 311 -MimeEntityEnd 5143531 -MultipartBoundaryBegin 5143531 +MimeEntityEnd 5143530 +MultipartBoundaryBegin 5143530 MultipartBoundaryEnd 5143573 MimeEntityBegin 5143573 MimeEntityHeadersEnd 5143664 -MimeContentBegin 5143664 -MimeContentEnd 5143674 Octets 10 Lines 3 -MimeEntityEnd 5143675 -MultipartBoundaryBegin 5143675 +MimeEntityEnd 5143674 +MultipartBoundaryBegin 5143674 MultipartBoundaryEnd 5143717 MimeEntityBegin 5143717 MimeEntityHeadersEnd 5143808 -MimeContentBegin 5143808 -MimeContentEnd 5176251 Octets 32443 Lines 472 -MimeEntityEnd 5176252 -MultipartBoundaryBegin 5176252 +MimeEntityEnd 5176251 +MultipartBoundaryBegin 5176251 MultipartBoundaryEnd 5176294 MimeEntityBegin 5176294 MimeEntityHeadersEnd 5176385 -MimeContentBegin 5176385 -MimeContentEnd 5176395 Octets 10 Lines 3 -MimeEntityEnd 5176396 -MultipartBoundaryBegin 5176396 +MimeEntityEnd 5176395 +MultipartBoundaryBegin 5176395 MultipartBoundaryEnd 5176438 MimeEntityBegin 5176438 MimeEntityHeadersEnd 5176529 -MimeContentBegin 5176529 -MimeContentEnd 5209970 Octets 33441 Lines 486 -MimeEntityEnd 5209971 -MultipartBoundaryBegin 5209971 +MimeEntityEnd 5209970 +MultipartBoundaryBegin 5209970 MultipartBoundaryEnd 5210013 MimeEntityBegin 5210013 MimeEntityHeadersEnd 5210104 -MimeContentBegin 5210104 -MimeContentEnd 5210114 Octets 10 Lines 3 -MimeEntityEnd 5210115 -MultipartBoundaryBegin 5210115 +MimeEntityEnd 5210114 +MultipartBoundaryBegin 5210114 MultipartBoundaryEnd 5210157 MimeEntityBegin 5210157 MimeEntityHeadersEnd 5210248 -MimeContentBegin 5210248 -MimeContentEnd 5238084 Octets 27836 Lines 405 -MimeEntityEnd 5238085 -MultipartBoundaryBegin 5238085 +MimeEntityEnd 5238084 +MultipartBoundaryBegin 5238084 MultipartBoundaryEnd 5238127 MimeEntityBegin 5238127 MimeEntityHeadersEnd 5238218 -MimeContentBegin 5238218 -MimeContentEnd 5238228 Octets 10 Lines 3 -MimeEntityEnd 5238229 -MultipartBoundaryBegin 5238229 +MimeEntityEnd 5238228 +MultipartBoundaryBegin 5238228 MultipartBoundaryEnd 5238271 MimeEntityBegin 5238271 MimeEntityHeadersEnd 5238362 -MimeContentBegin 5238362 -MimeContentEnd 5271856 Octets 33494 Lines 487 -MimeEntityEnd 5271857 -MultipartBoundaryBegin 5271857 +MimeEntityEnd 5271856 +MultipartBoundaryBegin 5271856 MultipartBoundaryEnd 5271899 MimeEntityBegin 5271899 MimeEntityHeadersEnd 5271990 -MimeContentBegin 5271990 -MimeContentEnd 5272000 Octets 10 Lines 3 -MimeEntityEnd 5272001 -MultipartBoundaryBegin 5272001 +MimeEntityEnd 5272000 +MultipartBoundaryBegin 5272000 MultipartBoundaryEnd 5272043 MimeEntityBegin 5272043 MimeEntityHeadersEnd 5272134 -MimeContentBegin 5272134 -MimeContentEnd 5298793 Octets 26659 Lines 388 -MimeEntityEnd 5298794 -MultipartBoundaryBegin 5298794 +MimeEntityEnd 5298793 +MultipartBoundaryBegin 5298793 MultipartBoundaryEnd 5298836 MimeEntityBegin 5298836 MimeEntityHeadersEnd 5298927 -MimeContentBegin 5298927 -MimeContentEnd 5299001 Octets 74 Lines 4 -MimeEntityEnd 5299002 -MultipartEndBoundaryBegin 5299002 +MimeEntityEnd 5299001 +MultipartEndBoundaryBegin 5299001 MultipartEndBoundaryEnd 5299045 MultipartEpilogueBegin 5299045 MultipartEpilogueEnd 5299046 -MimeContentEnd 5299047 -Octets 213161 +Octets 213160 Lines 3161 -MimeEntityEnd 5299047 -MultipartEndBoundaryBegin 5299047 +MimeEntityEnd 5299046 +MultipartEndBoundaryBegin 5299046 MultipartEndBoundaryEnd 5299088 MultipartEpilogueBegin 5299088 MultipartEpilogueEnd 5299088 -MimeContentEnd 5299089 -Octets 215083 +Octets 215082 Lines 3202 -MimeEntityEnd 5299089 -MimeMessageEnd 5299089 +MimeEntityEnd 5299088 +MimeMessageEnd 5299088 MboxMarkerBegin 5299089 MboxMarkerEnd 5299096 MimeMessageBegin 5299097 MimeMessageHeadersEnd 5299489 MimeEntityBegin 5299097 MimeEntityHeadersEnd 5299489 -MimeContentBegin 5299489 MultipartPreambleBegin 5299489 MultipartPreambleEnd 5299684 MultipartBoundaryBegin 5299684 MultipartBoundaryEnd 5299733 MimeEntityBegin 5299733 MimeEntityHeadersEnd 5299828 -MimeContentBegin 5299828 -MimeContentEnd 5300031 Octets 203 Lines 10 -MimeEntityEnd 5300032 -MultipartBoundaryBegin 5300032 +MimeEntityEnd 5300031 +MultipartBoundaryBegin 5300031 MultipartBoundaryEnd 5300081 MimeEntityBegin 5300081 MimeEntityHeadersEnd 5300142 -MimeContentBegin 5300142 -MimeContentEnd 5388740 Octets 88598 Lines 1215 -MimeEntityEnd 5388741 -MultipartBoundaryBegin 5388741 +MimeEntityEnd 5388740 +MultipartBoundaryBegin 5388740 MultipartBoundaryEnd 5388790 MimeEntityBegin 5388790 MimeEntityHeadersEnd 5388816 -MimeContentBegin 5388816 -MimeContentEnd 5388846 Octets 30 Lines 2 -MimeEntityEnd 5388847 -MultipartEndBoundaryBegin 5388847 +MimeEntityEnd 5388846 +MultipartEndBoundaryBegin 5388846 MultipartEndBoundaryEnd 5388897 MultipartEpilogueBegin 5388897 MultipartEpilogueEnd 5388898 -MimeContentEnd 5388899 -Octets 89410 +Octets 89409 Lines 1244 -MimeEntityEnd 5388899 -MimeMessageEnd 5388899 +MimeEntityEnd 5388898 +MimeMessageEnd 5388898 MboxMarkerBegin 5388899 MboxMarkerEnd 5388906 MimeMessageBegin 5388907 MimeMessageHeadersEnd 5389843 MimeEntityBegin 5388907 MimeEntityHeadersEnd 5389843 -MimeContentBegin 5389843 -MimeContentEnd 5440552 Octets 50709 Lines 697 -MimeEntityEnd 5440553 -MimeMessageEnd 5440553 +MimeEntityEnd 5440552 +MimeMessageEnd 5440552 MboxMarkerBegin 5440553 MboxMarkerEnd 5440560 MimeMessageBegin 5440561 MimeMessageHeadersEnd 5441173 MimeEntityBegin 5440561 MimeEntityHeadersEnd 5441173 -MimeContentBegin 5441173 MultipartPreambleBegin 5441173 MultipartPreambleEnd 5441173 MultipartBoundaryBegin 5441173 MultipartBoundaryEnd 5441191 MimeEntityBegin 5441191 MimeEntityHeadersEnd 5441192 -MimeContentBegin 5441192 -MimeContentEnd 5445509 Octets 4317 Lines 102 -MimeEntityEnd 5445510 -MultipartBoundaryBegin 5445510 +MimeEntityEnd 5445509 +MultipartBoundaryBegin 5445509 MultipartBoundaryEnd 5445528 MimeEntityBegin 5445528 MimeEntityHeadersEnd 5445669 -MimeContentBegin 5445669 MultipartPreambleBegin 5445669 MultipartPreambleEnd 5445669 MultipartBoundaryBegin 5445669 MultipartBoundaryEnd 5445700 MimeEntityBegin 5445700 MimeEntityHeadersEnd 5445701 -MimeContentBegin 5445701 MimeMessageBegin 5445701 -MimeMessageHeadersEnd 5445806 MimeEntityBegin 5445701 MimeEntityHeadersEnd 5445806 -MimeContentBegin 5445806 -MimeContentEnd 5446427 +MimeMessageHeadersEnd 5445806 Octets 621 Lines 19 -MimeEntityEnd 5446428 -MimeMessageEnd 5446428 -MimeContentEnd 5446428 -Octets 727 +MimeEntityEnd 5446427 +MimeMessageEnd 5446427 +Octets 726 Lines 23 -MimeEntityEnd 5446428 -MultipartBoundaryBegin 5446428 +MimeEntityEnd 5446427 +MultipartBoundaryBegin 5446427 MultipartBoundaryEnd 5446459 MimeEntityBegin 5446459 MimeEntityHeadersEnd 5446460 -MimeContentBegin 5446460 MimeMessageBegin 5446460 -MimeMessageHeadersEnd 5446581 MimeEntityBegin 5446460 MimeEntityHeadersEnd 5446581 -MimeContentBegin 5446581 -MimeContentEnd 5447314 +MimeMessageHeadersEnd 5446581 Octets 733 Lines 21 -MimeEntityEnd 5447315 -MimeMessageEnd 5447315 -MimeContentEnd 5447315 -Octets 855 +MimeEntityEnd 5447314 +MimeMessageEnd 5447314 +Octets 854 Lines 25 -MimeEntityEnd 5447315 -MultipartBoundaryBegin 5447315 +MimeEntityEnd 5447314 +MultipartBoundaryBegin 5447314 MultipartBoundaryEnd 5447346 MimeEntityBegin 5447346 MimeEntityHeadersEnd 5447347 -MimeContentBegin 5447347 MimeMessageBegin 5447347 -MimeMessageHeadersEnd 5447466 MimeEntityBegin 5447347 MimeEntityHeadersEnd 5447466 -MimeContentBegin 5447466 -MimeContentEnd 5448112 +MimeMessageHeadersEnd 5447466 Octets 646 Lines 15 -MimeEntityEnd 5448113 -MimeMessageEnd 5448113 -MimeContentEnd 5448113 -Octets 766 +MimeEntityEnd 5448112 +MimeMessageEnd 5448112 +Octets 765 Lines 19 -MimeEntityEnd 5448113 -MultipartBoundaryBegin 5448113 +MimeEntityEnd 5448112 +MultipartBoundaryBegin 5448112 MultipartBoundaryEnd 5448144 MimeEntityBegin 5448144 MimeEntityHeadersEnd 5448145 -MimeContentBegin 5448145 MimeMessageBegin 5448145 -MimeMessageHeadersEnd 5448301 MimeEntityBegin 5448145 MimeEntityHeadersEnd 5448301 -MimeContentBegin 5448301 -MimeContentEnd 5448784 +MimeMessageHeadersEnd 5448301 Octets 483 Lines 11 -MimeEntityEnd 5448785 -MimeMessageEnd 5448785 -MimeContentEnd 5448785 -Octets 640 +MimeEntityEnd 5448784 +MimeMessageEnd 5448784 +Octets 639 Lines 15 -MimeEntityEnd 5448785 -MultipartBoundaryBegin 5448785 +MimeEntityEnd 5448784 +MultipartBoundaryBegin 5448784 MultipartBoundaryEnd 5448816 MimeEntityBegin 5448816 MimeEntityHeadersEnd 5448817 -MimeContentBegin 5448817 MimeMessageBegin 5448817 -MimeMessageHeadersEnd 5448971 MimeEntityBegin 5448817 MimeEntityHeadersEnd 5448971 -MimeContentBegin 5448971 -MimeContentEnd 5449543 +MimeMessageHeadersEnd 5448971 Octets 572 Lines 16 -MimeEntityEnd 5449544 -MimeMessageEnd 5449544 -MimeContentEnd 5449544 -Octets 727 +MimeEntityEnd 5449543 +MimeMessageEnd 5449543 +Octets 726 Lines 20 -MimeEntityEnd 5449544 -MultipartBoundaryBegin 5449544 +MimeEntityEnd 5449543 +MultipartBoundaryBegin 5449543 MultipartBoundaryEnd 5449575 MimeEntityBegin 5449575 MimeEntityHeadersEnd 5449576 -MimeContentBegin 5449576 MimeMessageBegin 5449576 -MimeMessageHeadersEnd 5449733 MimeEntityBegin 5449576 MimeEntityHeadersEnd 5449733 -MimeContentBegin 5449733 -MimeContentEnd 5451008 +MimeMessageHeadersEnd 5449733 Octets 1275 Lines 27 -MimeEntityEnd 5451009 -MimeMessageEnd 5451009 -MimeContentEnd 5451009 -Octets 1433 +MimeEntityEnd 5451008 +MimeMessageEnd 5451008 +Octets 1432 Lines 31 -MimeEntityEnd 5451009 -MultipartBoundaryBegin 5451009 +MimeEntityEnd 5451008 +MultipartBoundaryBegin 5451008 MultipartBoundaryEnd 5451040 MimeEntityBegin 5451040 MimeEntityHeadersEnd 5451041 -MimeContentBegin 5451041 MimeMessageBegin 5451041 -MimeMessageHeadersEnd 5451194 MimeEntityBegin 5451041 MimeEntityHeadersEnd 5451194 -MimeContentBegin 5451194 -MimeContentEnd 5451595 +MimeMessageHeadersEnd 5451194 Octets 401 Lines 10 -MimeEntityEnd 5451596 -MimeMessageEnd 5451596 -MimeContentEnd 5451596 -Octets 555 +MimeEntityEnd 5451595 +MimeMessageEnd 5451595 +Octets 554 Lines 14 -MimeEntityEnd 5451596 -MultipartBoundaryBegin 5451596 +MimeEntityEnd 5451595 +MultipartBoundaryBegin 5451595 MultipartBoundaryEnd 5451627 MimeEntityBegin 5451627 MimeEntityHeadersEnd 5451628 -MimeContentBegin 5451628 MimeMessageBegin 5451628 -MimeMessageHeadersEnd 5451775 MimeEntityBegin 5451628 MimeEntityHeadersEnd 5451775 -MimeContentBegin 5451775 -MimeContentEnd 5452171 +MimeMessageHeadersEnd 5451775 Octets 396 Lines 8 -MimeEntityEnd 5452172 -MimeMessageEnd 5452172 -MimeContentEnd 5452172 -Octets 544 +MimeEntityEnd 5452171 +MimeMessageEnd 5452171 +Octets 543 Lines 12 -MimeEntityEnd 5452172 -MultipartBoundaryBegin 5452172 +MimeEntityEnd 5452171 +MultipartBoundaryBegin 5452171 MultipartBoundaryEnd 5452203 MimeEntityBegin 5452203 MimeEntityHeadersEnd 5452204 -MimeContentBegin 5452204 MimeMessageBegin 5452204 -MimeMessageHeadersEnd 5452347 MimeEntityBegin 5452204 MimeEntityHeadersEnd 5452347 -MimeContentBegin 5452347 -MimeContentEnd 5452987 +MimeMessageHeadersEnd 5452347 Octets 640 Lines 12 -MimeEntityEnd 5452988 -MimeMessageEnd 5452988 -MimeContentEnd 5452988 -Octets 784 +MimeEntityEnd 5452987 +MimeMessageEnd 5452987 +Octets 783 Lines 16 -MimeEntityEnd 5452988 -MultipartBoundaryBegin 5452988 +MimeEntityEnd 5452987 +MultipartBoundaryBegin 5452987 MultipartBoundaryEnd 5453019 MimeEntityBegin 5453019 MimeEntityHeadersEnd 5453020 -MimeContentBegin 5453020 MimeMessageBegin 5453020 -MimeMessageHeadersEnd 5453157 MimeEntityBegin 5453020 MimeEntityHeadersEnd 5453157 -MimeContentBegin 5453157 -MimeContentEnd 5454134 +MimeMessageHeadersEnd 5453157 Octets 977 Lines 20 -MimeEntityEnd 5454135 -MimeMessageEnd 5454135 -MimeContentEnd 5454135 -Octets 1115 +MimeEntityEnd 5454134 +MimeMessageEnd 5454134 +Octets 1114 Lines 24 -MimeEntityEnd 5454135 -MultipartBoundaryBegin 5454135 +MimeEntityEnd 5454134 +MultipartBoundaryBegin 5454134 MultipartBoundaryEnd 5454166 MimeEntityBegin 5454166 MimeEntityHeadersEnd 5454167 -MimeContentBegin 5454167 MimeMessageBegin 5454167 -MimeMessageHeadersEnd 5454314 MimeEntityBegin 5454167 MimeEntityHeadersEnd 5454314 -MimeContentBegin 5454314 -MimeContentEnd 5455204 +MimeMessageHeadersEnd 5454314 Octets 890 Lines 28 -MimeEntityEnd 5455205 -MimeMessageEnd 5455205 -MimeContentEnd 5455205 -Octets 1038 +MimeEntityEnd 5455204 +MimeMessageEnd 5455204 +Octets 1037 Lines 32 -MimeEntityEnd 5455205 -MultipartBoundaryBegin 5455205 +MimeEntityEnd 5455204 +MultipartBoundaryBegin 5455204 MultipartBoundaryEnd 5455236 MimeEntityBegin 5455236 MimeEntityHeadersEnd 5455237 -MimeContentBegin 5455237 MimeMessageBegin 5455237 -MimeMessageHeadersEnd 5455368 MimeEntityBegin 5455237 MimeEntityHeadersEnd 5455368 -MimeContentBegin 5455368 -MimeContentEnd 5455927 +MimeMessageHeadersEnd 5455368 Octets 559 Lines 12 -MimeEntityEnd 5455928 -MimeMessageEnd 5455928 -MimeContentEnd 5455928 -Octets 691 +MimeEntityEnd 5455927 +MimeMessageEnd 5455927 +Octets 690 Lines 16 -MimeEntityEnd 5455928 -MultipartBoundaryBegin 5455928 +MimeEntityEnd 5455927 +MultipartBoundaryBegin 5455927 MultipartBoundaryEnd 5455959 MimeEntityBegin 5455959 MimeEntityHeadersEnd 5455960 -MimeContentBegin 5455960 MimeMessageBegin 5455960 -MimeMessageHeadersEnd 5456092 MimeEntityBegin 5455960 MimeEntityHeadersEnd 5456092 -MimeContentBegin 5456092 -MimeContentEnd 5456529 +MimeMessageHeadersEnd 5456092 Octets 437 Lines 11 -MimeEntityEnd 5456530 -MimeMessageEnd 5456530 -MimeContentEnd 5456530 -Octets 570 +MimeEntityEnd 5456529 +MimeMessageEnd 5456529 +Octets 569 Lines 15 -MimeEntityEnd 5456530 -MultipartBoundaryBegin 5456530 +MimeEntityEnd 5456529 +MultipartBoundaryBegin 5456529 MultipartBoundaryEnd 5456561 MimeEntityBegin 5456561 MimeEntityHeadersEnd 5456562 -MimeContentBegin 5456562 MimeMessageBegin 5456562 -MimeMessageHeadersEnd 5456679 MimeEntityBegin 5456562 MimeEntityHeadersEnd 5456679 -MimeContentBegin 5456679 -MimeContentEnd 5457231 +MimeMessageHeadersEnd 5456679 Octets 552 Lines 16 -MimeEntityEnd 5457232 -MimeMessageEnd 5457232 -MimeContentEnd 5457232 -Octets 670 +MimeEntityEnd 5457231 +MimeMessageEnd 5457231 +Octets 669 Lines 20 -MimeEntityEnd 5457232 -MultipartBoundaryBegin 5457232 +MimeEntityEnd 5457231 +MultipartBoundaryBegin 5457231 MultipartBoundaryEnd 5457263 MimeEntityBegin 5457263 MimeEntityHeadersEnd 5457264 -MimeContentBegin 5457264 MimeMessageBegin 5457264 -MimeMessageHeadersEnd 5457379 MimeEntityBegin 5457264 MimeEntityHeadersEnd 5457379 -MimeContentBegin 5457379 -MimeContentEnd 5457564 +MimeMessageHeadersEnd 5457379 Octets 185 Lines 9 -MimeEntityEnd 5457565 -MimeMessageEnd 5457565 -MimeContentEnd 5457565 -Octets 301 +MimeEntityEnd 5457564 +MimeMessageEnd 5457564 +Octets 300 Lines 13 -MimeEntityEnd 5457565 -MultipartBoundaryBegin 5457565 +MimeEntityEnd 5457564 +MultipartBoundaryBegin 5457564 MultipartBoundaryEnd 5457596 MimeEntityBegin 5457596 MimeEntityHeadersEnd 5457597 -MimeContentBegin 5457597 MimeMessageBegin 5457597 -MimeMessageHeadersEnd 5457714 MimeEntityBegin 5457597 MimeEntityHeadersEnd 5457714 -MimeContentBegin 5457714 -MimeContentEnd 5458042 +MimeMessageHeadersEnd 5457714 Octets 328 Lines 8 -MimeEntityEnd 5458043 -MimeMessageEnd 5458043 -MimeContentEnd 5458043 -Octets 446 +MimeEntityEnd 5458042 +MimeMessageEnd 5458042 +Octets 445 Lines 12 -MimeEntityEnd 5458043 -MultipartBoundaryBegin 5458043 +MimeEntityEnd 5458042 +MultipartBoundaryBegin 5458042 MultipartBoundaryEnd 5458074 MimeEntityBegin 5458074 MimeEntityHeadersEnd 5458075 -MimeContentBegin 5458075 MimeMessageBegin 5458075 -MimeMessageHeadersEnd 5458198 MimeEntityBegin 5458075 MimeEntityHeadersEnd 5458198 -MimeContentBegin 5458198 -MimeContentEnd 5458865 +MimeMessageHeadersEnd 5458198 Octets 667 Lines 22 -MimeEntityEnd 5458866 -MimeMessageEnd 5458866 -MimeContentEnd 5458866 -Octets 791 +MimeEntityEnd 5458865 +MimeMessageEnd 5458865 +Octets 790 Lines 26 -MimeEntityEnd 5458866 -MultipartBoundaryBegin 5458866 +MimeEntityEnd 5458865 +MultipartBoundaryBegin 5458865 MultipartBoundaryEnd 5458897 MimeEntityBegin 5458897 MimeEntityHeadersEnd 5458898 -MimeContentBegin 5458898 MimeMessageBegin 5458898 -MimeMessageHeadersEnd 5459022 MimeEntityBegin 5458898 MimeEntityHeadersEnd 5459022 -MimeContentBegin 5459022 -MimeContentEnd 5459124 +MimeMessageHeadersEnd 5459022 Octets 102 Lines 6 -MimeEntityEnd 5459125 -MimeMessageEnd 5459125 -MimeContentEnd 5459125 -Octets 227 +MimeEntityEnd 5459124 +MimeMessageEnd 5459124 +Octets 226 Lines 10 -MimeEntityEnd 5459125 -MultipartBoundaryBegin 5459125 +MimeEntityEnd 5459124 +MultipartBoundaryBegin 5459124 MultipartBoundaryEnd 5459156 MimeEntityBegin 5459156 MimeEntityHeadersEnd 5459157 -MimeContentBegin 5459157 MimeMessageBegin 5459157 -MimeMessageHeadersEnd 5459299 MimeEntityBegin 5459157 MimeEntityHeadersEnd 5459299 -MimeContentBegin 5459299 -MimeContentEnd 5460135 +MimeMessageHeadersEnd 5459299 Octets 836 Lines 22 -MimeEntityEnd 5460136 -MimeMessageEnd 5460136 -MimeContentEnd 5460136 -Octets 979 +MimeEntityEnd 5460135 +MimeMessageEnd 5460135 +Octets 978 Lines 26 -MimeEntityEnd 5460136 -MultipartBoundaryBegin 5460136 +MimeEntityEnd 5460135 +MultipartBoundaryBegin 5460135 MultipartBoundaryEnd 5460167 MimeEntityBegin 5460167 MimeEntityHeadersEnd 5460168 -MimeContentBegin 5460168 MimeMessageBegin 5460168 -MimeMessageHeadersEnd 5460278 MimeEntityBegin 5460168 MimeEntityHeadersEnd 5460278 -MimeContentBegin 5460278 -MimeContentEnd 5460697 +MimeMessageHeadersEnd 5460278 Octets 419 Lines 10 -MimeEntityEnd 5460698 -MimeMessageEnd 5460698 -MimeContentEnd 5460698 -Octets 530 +MimeEntityEnd 5460697 +MimeMessageEnd 5460697 +Octets 529 Lines 14 -MimeEntityEnd 5460698 -MultipartBoundaryBegin 5460698 +MimeEntityEnd 5460697 +MultipartBoundaryBegin 5460697 MultipartBoundaryEnd 5460729 MimeEntityBegin 5460729 MimeEntityHeadersEnd 5460730 -MimeContentBegin 5460730 MimeMessageBegin 5460730 -MimeMessageHeadersEnd 5460902 MimeEntityBegin 5460730 MimeEntityHeadersEnd 5460902 -MimeContentBegin 5460902 -MimeContentEnd 5461132 +MimeMessageHeadersEnd 5460902 Octets 230 Lines 10 -MimeEntityEnd 5461133 -MimeMessageEnd 5461133 -MimeContentEnd 5461133 -Octets 403 +MimeEntityEnd 5461132 +MimeMessageEnd 5461132 +Octets 402 Lines 14 -MimeEntityEnd 5461133 -MultipartBoundaryBegin 5461133 +MimeEntityEnd 5461132 +MultipartBoundaryBegin 5461132 MultipartBoundaryEnd 5461164 MimeEntityBegin 5461164 MimeEntityHeadersEnd 5461165 -MimeContentBegin 5461165 MimeMessageBegin 5461165 -MimeMessageHeadersEnd 5461291 MimeEntityBegin 5461165 MimeEntityHeadersEnd 5461291 -MimeContentBegin 5461291 -MimeContentEnd 5461690 +MimeMessageHeadersEnd 5461291 Octets 399 Lines 13 -MimeEntityEnd 5461691 -MimeMessageEnd 5461691 -MimeContentEnd 5461691 -Octets 526 +MimeEntityEnd 5461690 +MimeMessageEnd 5461690 +Octets 525 Lines 17 -MimeEntityEnd 5461691 -MultipartBoundaryBegin 5461691 +MimeEntityEnd 5461690 +MultipartBoundaryBegin 5461690 MultipartBoundaryEnd 5461722 MimeEntityBegin 5461722 MimeEntityHeadersEnd 5461723 -MimeContentBegin 5461723 MimeMessageBegin 5461723 -MimeMessageHeadersEnd 5461840 MimeEntityBegin 5461723 MimeEntityHeadersEnd 5461840 -MimeContentBegin 5461840 -MimeContentEnd 5462744 +MimeMessageHeadersEnd 5461840 Octets 904 Lines 29 -MimeEntityEnd 5462745 -MimeMessageEnd 5462745 -MimeContentEnd 5462745 -Octets 1022 +MimeEntityEnd 5462744 +MimeMessageEnd 5462744 +Octets 1021 Lines 33 -MimeEntityEnd 5462745 -MultipartBoundaryBegin 5462745 +MimeEntityEnd 5462744 +MultipartBoundaryBegin 5462744 MultipartBoundaryEnd 5462776 MimeEntityBegin 5462776 MimeEntityHeadersEnd 5462777 -MimeContentBegin 5462777 MimeMessageBegin 5462777 -MimeMessageHeadersEnd 5462905 MimeEntityBegin 5462777 MimeEntityHeadersEnd 5462905 -MimeContentBegin 5462905 -MimeContentEnd 5463196 +MimeMessageHeadersEnd 5462905 Octets 291 Lines 10 -MimeEntityEnd 5463197 -MimeMessageEnd 5463197 -MimeContentEnd 5463197 -Octets 420 +MimeEntityEnd 5463196 +MimeMessageEnd 5463196 +Octets 419 Lines 14 -MimeEntityEnd 5463197 -MultipartBoundaryBegin 5463197 +MimeEntityEnd 5463196 +MultipartBoundaryBegin 5463196 MultipartBoundaryEnd 5463228 MimeEntityBegin 5463228 MimeEntityHeadersEnd 5463229 -MimeContentBegin 5463229 MimeMessageBegin 5463229 -MimeMessageHeadersEnd 5463358 MimeEntityBegin 5463229 MimeEntityHeadersEnd 5463358 -MimeContentBegin 5463358 -MimeContentEnd 5463768 +MimeMessageHeadersEnd 5463358 Octets 410 Lines 15 -MimeEntityEnd 5463769 -MimeMessageEnd 5463769 -MimeContentEnd 5463769 -Octets 540 +MimeEntityEnd 5463768 +MimeMessageEnd 5463768 +Octets 539 Lines 19 -MimeEntityEnd 5463769 -MultipartBoundaryBegin 5463769 +MimeEntityEnd 5463768 +MultipartBoundaryBegin 5463768 MultipartBoundaryEnd 5463800 MimeEntityBegin 5463800 MimeEntityHeadersEnd 5463801 -MimeContentBegin 5463801 MimeMessageBegin 5463801 -MimeMessageHeadersEnd 5463916 MimeEntityBegin 5463801 MimeEntityHeadersEnd 5463916 -MimeContentBegin 5463916 -MimeContentEnd 5464061 +MimeMessageHeadersEnd 5463916 Octets 145 Lines 5 -MimeEntityEnd 5464062 -MimeMessageEnd 5464062 -MimeContentEnd 5464062 -Octets 261 +MimeEntityEnd 5464061 +MimeMessageEnd 5464061 +Octets 260 Lines 9 -MimeEntityEnd 5464062 -MultipartBoundaryBegin 5464062 +MimeEntityEnd 5464061 +MultipartBoundaryBegin 5464061 MultipartBoundaryEnd 5464093 MimeEntityBegin 5464093 MimeEntityHeadersEnd 5464094 -MimeContentBegin 5464094 MimeMessageBegin 5464094 -MimeMessageHeadersEnd 5464219 MimeEntityBegin 5464094 MimeEntityHeadersEnd 5464219 -MimeContentBegin 5464219 -MimeContentEnd 5464398 +MimeMessageHeadersEnd 5464219 Octets 179 Lines 8 -MimeEntityEnd 5464399 -MimeMessageEnd 5464399 -MimeContentEnd 5464399 -Octets 305 +MimeEntityEnd 5464398 +MimeMessageEnd 5464398 +Octets 304 Lines 12 -MimeEntityEnd 5464399 -MultipartBoundaryBegin 5464399 +MimeEntityEnd 5464398 +MultipartBoundaryBegin 5464398 MultipartBoundaryEnd 5464430 MimeEntityBegin 5464430 MimeEntityHeadersEnd 5464431 -MimeContentBegin 5464431 MimeMessageBegin 5464431 -MimeMessageHeadersEnd 5464561 MimeEntityBegin 5464431 MimeEntityHeadersEnd 5464561 -MimeContentBegin 5464561 -MimeContentEnd 5465277 +MimeMessageHeadersEnd 5464561 Octets 716 Lines 15 -MimeEntityEnd 5465278 -MimeMessageEnd 5465278 -MimeContentEnd 5465278 -Octets 847 +MimeEntityEnd 5465277 +MimeMessageEnd 5465277 +Octets 846 Lines 19 -MimeEntityEnd 5465278 -MultipartBoundaryBegin 5465278 +MimeEntityEnd 5465277 +MultipartBoundaryBegin 5465277 MultipartBoundaryEnd 5465309 MimeEntityBegin 5465309 MimeEntityHeadersEnd 5465310 -MimeContentBegin 5465310 MimeMessageBegin 5465310 -MimeMessageHeadersEnd 5465456 MimeEntityBegin 5465310 MimeEntityHeadersEnd 5465456 -MimeContentBegin 5465456 -MimeContentEnd 5466413 +MimeMessageHeadersEnd 5465456 Octets 957 Lines 27 -MimeEntityEnd 5466414 -MimeMessageEnd 5466414 -MimeContentEnd 5466414 -Octets 1104 +MimeEntityEnd 5466413 +MimeMessageEnd 5466413 +Octets 1103 Lines 31 -MimeEntityEnd 5466414 -MultipartBoundaryBegin 5466414 +MimeEntityEnd 5466413 +MultipartBoundaryBegin 5466413 MultipartBoundaryEnd 5466445 MimeEntityBegin 5466445 MimeEntityHeadersEnd 5466446 -MimeContentBegin 5466446 MimeMessageBegin 5466446 -MimeMessageHeadersEnd 5466580 MimeEntityBegin 5466446 MimeEntityHeadersEnd 5466580 -MimeContentBegin 5466580 -MimeContentEnd 5466827 +MimeMessageHeadersEnd 5466580 Octets 247 Lines 8 -MimeEntityEnd 5466828 -MimeMessageEnd 5466828 -MimeContentEnd 5466828 -Octets 382 +MimeEntityEnd 5466827 +MimeMessageEnd 5466827 +Octets 381 Lines 12 -MimeEntityEnd 5466828 -MultipartBoundaryBegin 5466828 +MimeEntityEnd 5466827 +MultipartBoundaryBegin 5466827 MultipartBoundaryEnd 5466859 MimeEntityBegin 5466859 MimeEntityHeadersEnd 5466860 -MimeContentBegin 5466860 MimeMessageBegin 5466860 -MimeMessageHeadersEnd 5466982 MimeEntityBegin 5466860 MimeEntityHeadersEnd 5466982 -MimeContentBegin 5466982 -MimeContentEnd 5467109 +MimeMessageHeadersEnd 5466982 Octets 127 Lines 7 -MimeEntityEnd 5467110 -MimeMessageEnd 5467110 -MimeContentEnd 5467110 -Octets 250 +MimeEntityEnd 5467109 +MimeMessageEnd 5467109 +Octets 249 Lines 11 -MimeEntityEnd 5467110 -MultipartBoundaryBegin 5467110 +MimeEntityEnd 5467109 +MultipartBoundaryBegin 5467109 MultipartBoundaryEnd 5467141 MimeEntityBegin 5467141 MimeEntityHeadersEnd 5467142 -MimeContentBegin 5467142 MimeMessageBegin 5467142 -MimeMessageHeadersEnd 5467317 MimeEntityBegin 5467142 MimeEntityHeadersEnd 5467317 -MimeContentBegin 5467317 -MimeContentEnd 5468062 +MimeMessageHeadersEnd 5467317 Octets 745 Lines 17 -MimeEntityEnd 5468063 -MimeMessageEnd 5468063 -MimeContentEnd 5468063 -Octets 921 +MimeEntityEnd 5468062 +MimeMessageEnd 5468062 +Octets 920 Lines 22 -MimeEntityEnd 5468063 -MultipartBoundaryBegin 5468063 +MimeEntityEnd 5468062 +MultipartBoundaryBegin 5468062 MultipartBoundaryEnd 5468094 MimeEntityBegin 5468094 MimeEntityHeadersEnd 5468095 -MimeContentBegin 5468095 MimeMessageBegin 5468095 -MimeMessageHeadersEnd 5468255 MimeEntityBegin 5468095 MimeEntityHeadersEnd 5468255 -MimeContentBegin 5468255 -MimeContentEnd 5468654 +MimeMessageHeadersEnd 5468255 Octets 399 Lines 17 -MimeEntityEnd 5468655 -MimeMessageEnd 5468655 -MimeContentEnd 5468655 -Octets 560 +MimeEntityEnd 5468654 +MimeMessageEnd 5468654 +Octets 559 Lines 21 -MimeEntityEnd 5468655 -MultipartBoundaryBegin 5468655 +MimeEntityEnd 5468654 +MultipartBoundaryBegin 5468654 MultipartBoundaryEnd 5468686 MimeEntityBegin 5468686 MimeEntityHeadersEnd 5468687 -MimeContentBegin 5468687 MimeMessageBegin 5468687 -MimeMessageHeadersEnd 5468819 MimeEntityBegin 5468687 MimeEntityHeadersEnd 5468819 -MimeContentBegin 5468819 -MimeContentEnd 5470106 +MimeMessageHeadersEnd 5468819 Octets 1287 Lines 22 -MimeEntityEnd 5470107 -MimeMessageEnd 5470107 -MimeContentEnd 5470107 -Octets 1420 +MimeEntityEnd 5470106 +MimeMessageEnd 5470106 +Octets 1419 Lines 26 -MimeEntityEnd 5470107 -MultipartBoundaryBegin 5470107 +MimeEntityEnd 5470106 +MultipartBoundaryBegin 5470106 MultipartBoundaryEnd 5470138 MimeEntityBegin 5470138 MimeEntityHeadersEnd 5470139 -MimeContentBegin 5470139 MimeMessageBegin 5470139 -MimeMessageHeadersEnd 5470245 MimeEntityBegin 5470139 MimeEntityHeadersEnd 5470245 -MimeContentBegin 5470245 -MimeContentEnd 5470388 +MimeMessageHeadersEnd 5470245 Octets 143 Lines 7 -MimeEntityEnd 5470389 -MimeMessageEnd 5470389 -MimeContentEnd 5470389 -Octets 250 +MimeEntityEnd 5470388 +MimeMessageEnd 5470388 +Octets 249 Lines 11 -MimeEntityEnd 5470389 -MultipartBoundaryBegin 5470389 +MimeEntityEnd 5470388 +MultipartBoundaryBegin 5470388 MultipartBoundaryEnd 5470420 MimeEntityBegin 5470420 MimeEntityHeadersEnd 5470421 -MimeContentBegin 5470421 MimeMessageBegin 5470421 -MimeMessageHeadersEnd 5470558 MimeEntityBegin 5470421 MimeEntityHeadersEnd 5470558 -MimeContentBegin 5470558 -MimeContentEnd 5470857 +MimeMessageHeadersEnd 5470558 Octets 299 Lines 12 -MimeEntityEnd 5470858 -MimeMessageEnd 5470858 -MimeContentEnd 5470858 -Octets 437 +MimeEntityEnd 5470857 +MimeMessageEnd 5470857 +Octets 436 Lines 16 -MimeEntityEnd 5470858 -MultipartBoundaryBegin 5470858 +MimeEntityEnd 5470857 +MultipartBoundaryBegin 5470857 MultipartBoundaryEnd 5470889 MimeEntityBegin 5470889 MimeEntityHeadersEnd 5470890 -MimeContentBegin 5470890 MimeMessageBegin 5470890 -MimeMessageHeadersEnd 5471016 MimeEntityBegin 5470890 MimeEntityHeadersEnd 5471016 -MimeContentBegin 5471016 -MimeContentEnd 5471203 +MimeMessageHeadersEnd 5471016 Octets 187 Lines 7 -MimeEntityEnd 5471204 -MimeMessageEnd 5471204 -MimeContentEnd 5471204 -Octets 314 +MimeEntityEnd 5471203 +MimeMessageEnd 5471203 +Octets 313 Lines 11 -MimeEntityEnd 5471204 -MultipartBoundaryBegin 5471204 +MimeEntityEnd 5471203 +MultipartBoundaryBegin 5471203 MultipartBoundaryEnd 5471235 MimeEntityBegin 5471235 MimeEntityHeadersEnd 5471236 -MimeContentBegin 5471236 MimeMessageBegin 5471236 -MimeMessageHeadersEnd 5471341 MimeEntityBegin 5471236 MimeEntityHeadersEnd 5471341 -MimeContentBegin 5471341 -MimeContentEnd 5471739 +MimeMessageHeadersEnd 5471341 Octets 398 Lines 13 -MimeEntityEnd 5471740 -MimeMessageEnd 5471740 -MimeContentEnd 5471740 -Octets 504 +MimeEntityEnd 5471739 +MimeMessageEnd 5471739 +Octets 503 Lines 17 -MimeEntityEnd 5471740 -MultipartBoundaryBegin 5471740 +MimeEntityEnd 5471739 +MultipartBoundaryBegin 5471739 MultipartBoundaryEnd 5471771 MimeEntityBegin 5471771 MimeEntityHeadersEnd 5471772 -MimeContentBegin 5471772 MimeMessageBegin 5471772 -MimeMessageHeadersEnd 5471906 MimeEntityBegin 5471772 MimeEntityHeadersEnd 5471906 -MimeContentBegin 5471906 -MimeContentEnd 5472208 +MimeMessageHeadersEnd 5471906 Octets 302 Lines 9 -MimeEntityEnd 5472209 -MimeMessageEnd 5472209 -MimeContentEnd 5472209 -Octets 437 +MimeEntityEnd 5472208 +MimeMessageEnd 5472208 +Octets 436 Lines 13 -MimeEntityEnd 5472209 -MultipartBoundaryBegin 5472209 +MimeEntityEnd 5472208 +MultipartBoundaryBegin 5472208 MultipartBoundaryEnd 5472240 MimeEntityBegin 5472240 MimeEntityHeadersEnd 5472241 -MimeContentBegin 5472241 MimeMessageBegin 5472241 -MimeMessageHeadersEnd 5472384 MimeEntityBegin 5472241 MimeEntityHeadersEnd 5472384 -MimeContentBegin 5472384 -MimeContentEnd 5473002 +MimeMessageHeadersEnd 5472384 Octets 618 Lines 18 -MimeEntityEnd 5473003 -MimeMessageEnd 5473003 -MimeContentEnd 5473003 -Octets 762 +MimeEntityEnd 5473002 +MimeMessageEnd 5473002 +Octets 761 Lines 22 -MimeEntityEnd 5473003 -MultipartBoundaryBegin 5473003 +MimeEntityEnd 5473002 +MultipartBoundaryBegin 5473002 MultipartBoundaryEnd 5473034 MimeEntityBegin 5473034 MimeEntityHeadersEnd 5473035 -MimeContentBegin 5473035 MimeMessageBegin 5473035 -MimeMessageHeadersEnd 5473188 MimeEntityBegin 5473035 MimeEntityHeadersEnd 5473188 -MimeContentBegin 5473188 -MimeContentEnd 5473663 +MimeMessageHeadersEnd 5473188 Octets 475 Lines 11 -MimeEntityEnd 5473664 -MimeMessageEnd 5473664 -MimeContentEnd 5473664 -Octets 629 +MimeEntityEnd 5473663 +MimeMessageEnd 5473663 +Octets 628 Lines 15 -MimeEntityEnd 5473664 -MultipartBoundaryBegin 5473664 +MimeEntityEnd 5473663 +MultipartBoundaryBegin 5473663 MultipartBoundaryEnd 5473695 MimeEntityBegin 5473695 MimeEntityHeadersEnd 5473696 -MimeContentBegin 5473696 MimeMessageBegin 5473696 -MimeMessageHeadersEnd 5473829 MimeEntityBegin 5473696 MimeEntityHeadersEnd 5473829 -MimeContentBegin 5473829 -MimeContentEnd 5475001 +MimeMessageHeadersEnd 5473829 Octets 1172 Lines 28 -MimeEntityEnd 5475002 -MimeMessageEnd 5475002 -MimeContentEnd 5475002 -Octets 1306 +MimeEntityEnd 5475001 +MimeMessageEnd 5475001 +Octets 1305 Lines 32 -MimeEntityEnd 5475002 -MultipartBoundaryBegin 5475002 +MimeEntityEnd 5475001 +MultipartBoundaryBegin 5475001 MultipartBoundaryEnd 5475033 MimeEntityBegin 5475033 MimeEntityHeadersEnd 5475034 -MimeContentBegin 5475034 MimeMessageBegin 5475034 -MimeMessageHeadersEnd 5475210 MimeEntityBegin 5475034 MimeEntityHeadersEnd 5475210 -MimeContentBegin 5475210 -MimeContentEnd 5475469 +MimeMessageHeadersEnd 5475210 Octets 259 Lines 9 -MimeEntityEnd 5475470 -MimeMessageEnd 5475470 -MimeContentEnd 5475470 -Octets 436 +MimeEntityEnd 5475469 +MimeMessageEnd 5475469 +Octets 435 Lines 13 -MimeEntityEnd 5475470 -MultipartBoundaryBegin 5475470 +MimeEntityEnd 5475469 +MultipartBoundaryBegin 5475469 MultipartBoundaryEnd 5475501 MimeEntityBegin 5475501 MimeEntityHeadersEnd 5475502 -MimeContentBegin 5475502 MimeMessageBegin 5475502 -MimeMessageHeadersEnd 5475617 MimeEntityBegin 5475502 MimeEntityHeadersEnd 5475617 -MimeContentBegin 5475617 -MimeContentEnd 5475810 +MimeMessageHeadersEnd 5475617 Octets 193 Lines 5 -MimeEntityEnd 5475811 -MimeMessageEnd 5475811 -MimeContentEnd 5475811 -Octets 309 +MimeEntityEnd 5475810 +MimeMessageEnd 5475810 +Octets 308 Lines 9 -MimeEntityEnd 5475811 -MultipartBoundaryBegin 5475811 +MimeEntityEnd 5475810 +MultipartBoundaryBegin 5475810 MultipartBoundaryEnd 5475842 MimeEntityBegin 5475842 MimeEntityHeadersEnd 5475843 -MimeContentBegin 5475843 MimeMessageBegin 5475843 -MimeMessageHeadersEnd 5475983 MimeEntityBegin 5475843 MimeEntityHeadersEnd 5475983 -MimeContentBegin 5475983 -MimeContentEnd 5476848 +MimeMessageHeadersEnd 5475983 Octets 865 Lines 25 -MimeEntityEnd 5476849 -MimeMessageEnd 5476849 -MimeContentEnd 5476849 -Octets 1006 +MimeEntityEnd 5476848 +MimeMessageEnd 5476848 +Octets 1005 Lines 29 -MimeEntityEnd 5476849 -MultipartBoundaryBegin 5476849 +MimeEntityEnd 5476848 +MultipartBoundaryBegin 5476848 MultipartBoundaryEnd 5476880 MimeEntityBegin 5476880 MimeEntityHeadersEnd 5476881 -MimeContentBegin 5476881 MimeMessageBegin 5476881 -MimeMessageHeadersEnd 5477006 MimeEntityBegin 5476881 MimeEntityHeadersEnd 5477006 -MimeContentBegin 5477006 -MimeContentEnd 5477720 +MimeMessageHeadersEnd 5477006 Octets 714 Lines 12 -MimeEntityEnd 5477721 -MimeMessageEnd 5477721 -MimeContentEnd 5477721 -Octets 840 +MimeEntityEnd 5477720 +MimeMessageEnd 5477720 +Octets 839 Lines 16 -MimeEntityEnd 5477721 -MultipartBoundaryBegin 5477721 +MimeEntityEnd 5477720 +MultipartBoundaryBegin 5477720 MultipartBoundaryEnd 5477752 MimeEntityBegin 5477752 MimeEntityHeadersEnd 5477753 -MimeContentBegin 5477753 MimeMessageBegin 5477753 -MimeMessageHeadersEnd 5477865 MimeEntityBegin 5477753 MimeEntityHeadersEnd 5477865 -MimeContentBegin 5477865 -MimeContentEnd 5478568 +MimeMessageHeadersEnd 5477865 Octets 703 Lines 18 -MimeEntityEnd 5478569 -MimeMessageEnd 5478569 -MimeContentEnd 5478569 -Octets 816 +MimeEntityEnd 5478568 +MimeMessageEnd 5478568 +Octets 815 Lines 22 -MimeEntityEnd 5478569 -MultipartBoundaryBegin 5478569 +MimeEntityEnd 5478568 +MultipartBoundaryBegin 5478568 MultipartBoundaryEnd 5478600 MimeEntityBegin 5478600 MimeEntityHeadersEnd 5478601 -MimeContentBegin 5478601 MimeMessageBegin 5478601 -MimeMessageHeadersEnd 5478733 MimeEntityBegin 5478601 MimeEntityHeadersEnd 5478733 -MimeContentBegin 5478733 -MimeContentEnd 5479113 +MimeMessageHeadersEnd 5478733 Octets 380 Lines 12 -MimeEntityEnd 5479114 -MimeMessageEnd 5479114 -MimeContentEnd 5479114 -Octets 513 +MimeEntityEnd 5479113 +MimeMessageEnd 5479113 +Octets 512 Lines 16 -MimeEntityEnd 5479114 -MultipartBoundaryBegin 5479114 +MimeEntityEnd 5479113 +MultipartBoundaryBegin 5479113 MultipartBoundaryEnd 5479145 MimeEntityBegin 5479145 MimeEntityHeadersEnd 5479146 -MimeContentBegin 5479146 MimeMessageBegin 5479146 -MimeMessageHeadersEnd 5479282 MimeEntityBegin 5479146 MimeEntityHeadersEnd 5479282 -MimeContentBegin 5479282 -MimeContentEnd 5480259 +MimeMessageHeadersEnd 5479282 Octets 977 Lines 25 -MimeEntityEnd 5480260 -MimeMessageEnd 5480260 -MimeContentEnd 5480260 -Octets 1114 +MimeEntityEnd 5480259 +MimeMessageEnd 5480259 +Octets 1113 Lines 29 -MimeEntityEnd 5480260 -MultipartBoundaryBegin 5480260 +MimeEntityEnd 5480259 +MultipartBoundaryBegin 5480259 MultipartBoundaryEnd 5480291 MimeEntityBegin 5480291 MimeEntityHeadersEnd 5480292 -MimeContentBegin 5480292 MimeMessageBegin 5480292 -MimeMessageHeadersEnd 5480437 MimeEntityBegin 5480292 MimeEntityHeadersEnd 5480437 -MimeContentBegin 5480437 -MimeContentEnd 5480904 +MimeMessageHeadersEnd 5480437 Octets 467 Lines 11 -MimeEntityEnd 5480905 -MimeMessageEnd 5480905 -MimeContentEnd 5480905 -Octets 613 +MimeEntityEnd 5480904 +MimeMessageEnd 5480904 +Octets 612 Lines 15 -MimeEntityEnd 5480905 -MultipartBoundaryBegin 5480905 +MimeEntityEnd 5480904 +MultipartBoundaryBegin 5480904 MultipartBoundaryEnd 5480936 MimeEntityBegin 5480936 MimeEntityHeadersEnd 5480937 -MimeContentBegin 5480937 MimeMessageBegin 5480937 -MimeMessageHeadersEnd 5481070 MimeEntityBegin 5480937 MimeEntityHeadersEnd 5481070 -MimeContentBegin 5481070 -MimeContentEnd 5481349 +MimeMessageHeadersEnd 5481070 Octets 279 Lines 11 -MimeEntityEnd 5481350 -MimeMessageEnd 5481350 -MimeContentEnd 5481350 -Octets 413 +MimeEntityEnd 5481349 +MimeMessageEnd 5481349 +Octets 412 Lines 15 -MimeEntityEnd 5481350 -MultipartBoundaryBegin 5481350 +MimeEntityEnd 5481349 +MultipartBoundaryBegin 5481349 MultipartBoundaryEnd 5481381 MimeEntityBegin 5481381 MimeEntityHeadersEnd 5481382 -MimeContentBegin 5481382 MimeMessageBegin 5481382 -MimeMessageHeadersEnd 5481507 MimeEntityBegin 5481382 MimeEntityHeadersEnd 5481507 -MimeContentBegin 5481507 -MimeContentEnd 5481789 +MimeMessageHeadersEnd 5481507 Octets 282 Lines 5 -MimeEntityEnd 5481790 -MimeMessageEnd 5481790 -MimeContentEnd 5481790 -Octets 408 +MimeEntityEnd 5481789 +MimeMessageEnd 5481789 +Octets 407 Lines 9 -MimeEntityEnd 5481790 -MultipartBoundaryBegin 5481790 +MimeEntityEnd 5481789 +MultipartBoundaryBegin 5481789 MultipartBoundaryEnd 5481821 MimeEntityBegin 5481821 MimeEntityHeadersEnd 5481822 -MimeContentBegin 5481822 MimeMessageBegin 5481822 -MimeMessageHeadersEnd 5481943 MimeEntityBegin 5481822 MimeEntityHeadersEnd 5481943 -MimeContentBegin 5481943 -MimeContentEnd 5482586 +MimeMessageHeadersEnd 5481943 Octets 643 Lines 28 -MimeEntityEnd 5482587 -MimeMessageEnd 5482587 -MimeContentEnd 5482587 -Octets 765 +MimeEntityEnd 5482586 +MimeMessageEnd 5482586 +Octets 764 Lines 32 -MimeEntityEnd 5482587 -MultipartBoundaryBegin 5482587 +MimeEntityEnd 5482586 +MultipartBoundaryBegin 5482586 MultipartBoundaryEnd 5482618 MimeEntityBegin 5482618 MimeEntityHeadersEnd 5482619 -MimeContentBegin 5482619 MimeMessageBegin 5482619 -MimeMessageHeadersEnd 5482763 MimeEntityBegin 5482619 MimeEntityHeadersEnd 5482763 -MimeContentBegin 5482763 -MimeContentEnd 5485021 +MimeMessageHeadersEnd 5482763 Octets 2258 Lines 47 -MimeEntityEnd 5485022 -MimeMessageEnd 5485022 -MimeContentEnd 5485022 -Octets 2403 +MimeEntityEnd 5485021 +MimeMessageEnd 5485021 +Octets 2402 Lines 51 -MimeEntityEnd 5485022 -MultipartBoundaryBegin 5485022 +MimeEntityEnd 5485021 +MultipartBoundaryBegin 5485021 MultipartBoundaryEnd 5485053 MimeEntityBegin 5485053 MimeEntityHeadersEnd 5485054 -MimeContentBegin 5485054 MimeMessageBegin 5485054 -MimeMessageHeadersEnd 5485176 MimeEntityBegin 5485054 MimeEntityHeadersEnd 5485176 -MimeContentBegin 5485176 -MimeContentEnd 5485968 +MimeMessageHeadersEnd 5485176 Octets 792 Lines 18 -MimeEntityEnd 5485969 -MimeMessageEnd 5485969 -MimeContentEnd 5485969 -Octets 915 +MimeEntityEnd 5485968 +MimeMessageEnd 5485968 +Octets 914 Lines 22 -MimeEntityEnd 5485969 -MultipartBoundaryBegin 5485969 +MimeEntityEnd 5485968 +MultipartBoundaryBegin 5485968 MultipartBoundaryEnd 5486000 MimeEntityBegin 5486000 MimeEntityHeadersEnd 5486001 -MimeContentBegin 5486001 MimeMessageBegin 5486001 -MimeMessageHeadersEnd 5486095 MimeEntityBegin 5486001 MimeEntityHeadersEnd 5486095 -MimeContentBegin 5486095 -MimeContentEnd 5486321 +MimeMessageHeadersEnd 5486095 Octets 226 Lines 11 -MimeEntityEnd 5486322 -MimeMessageEnd 5486322 -MimeContentEnd 5486322 -Octets 321 +MimeEntityEnd 5486321 +MimeMessageEnd 5486321 +Octets 320 Lines 15 -MimeEntityEnd 5486322 -MultipartBoundaryBegin 5486322 +MimeEntityEnd 5486321 +MultipartBoundaryBegin 5486321 MultipartBoundaryEnd 5486353 MimeEntityBegin 5486353 MimeEntityHeadersEnd 5486354 -MimeContentBegin 5486354 MimeMessageBegin 5486354 -MimeMessageHeadersEnd 5486475 MimeEntityBegin 5486354 MimeEntityHeadersEnd 5486475 -MimeContentBegin 5486475 -MimeContentEnd 5487143 +MimeMessageHeadersEnd 5486475 Octets 668 Lines 21 -MimeEntityEnd 5487144 -MimeMessageEnd 5487144 -MimeContentEnd 5487144 -Octets 790 +MimeEntityEnd 5487143 +MimeMessageEnd 5487143 +Octets 789 Lines 25 -MimeEntityEnd 5487144 -MultipartBoundaryBegin 5487144 +MimeEntityEnd 5487143 +MultipartBoundaryBegin 5487143 MultipartBoundaryEnd 5487175 MimeEntityBegin 5487175 MimeEntityHeadersEnd 5487176 -MimeContentBegin 5487176 MimeMessageBegin 5487176 -MimeMessageHeadersEnd 5487286 MimeEntityBegin 5487176 MimeEntityHeadersEnd 5487286 -MimeContentBegin 5487286 -MimeContentEnd 5489833 +MimeMessageHeadersEnd 5487286 Octets 2547 Lines 69 -MimeEntityEnd 5489834 -MimeMessageEnd 5489834 -MimeContentEnd 5489834 -Octets 2658 +MimeEntityEnd 5489833 +MimeMessageEnd 5489833 +Octets 2657 Lines 73 -MimeEntityEnd 5489834 -MultipartBoundaryBegin 5489834 +MimeEntityEnd 5489833 +MultipartBoundaryBegin 5489833 MultipartBoundaryEnd 5489865 MimeEntityBegin 5489865 MimeEntityHeadersEnd 5489866 -MimeContentBegin 5489866 MimeMessageBegin 5489866 -MimeMessageHeadersEnd 5489972 MimeEntityBegin 5489866 MimeEntityHeadersEnd 5489972 -MimeContentBegin 5489972 -MimeContentEnd 5491181 +MimeMessageHeadersEnd 5489972 Octets 1209 Lines 35 -MimeEntityEnd 5491182 -MimeMessageEnd 5491182 -MimeContentEnd 5491182 -Octets 1316 +MimeEntityEnd 5491181 +MimeMessageEnd 5491181 +Octets 1315 Lines 39 -MimeEntityEnd 5491182 -MultipartBoundaryBegin 5491182 +MimeEntityEnd 5491181 +MultipartBoundaryBegin 5491181 MultipartBoundaryEnd 5491213 MimeEntityBegin 5491213 MimeEntityHeadersEnd 5491214 -MimeContentBegin 5491214 MimeMessageBegin 5491214 -MimeMessageHeadersEnd 5491320 MimeEntityBegin 5491214 MimeEntityHeadersEnd 5491320 -MimeContentBegin 5491320 -MimeContentEnd 5493117 +MimeMessageHeadersEnd 5491320 Octets 1797 Lines 44 -MimeEntityEnd 5493118 -MimeMessageEnd 5493118 -MimeContentEnd 5493118 -Octets 1904 +MimeEntityEnd 5493117 +MimeMessageEnd 5493117 +Octets 1903 Lines 48 -MimeEntityEnd 5493118 -MultipartBoundaryBegin 5493118 +MimeEntityEnd 5493117 +MultipartBoundaryBegin 5493117 MultipartBoundaryEnd 5493149 MimeEntityBegin 5493149 MimeEntityHeadersEnd 5493150 -MimeContentBegin 5493150 MimeMessageBegin 5493150 -MimeMessageHeadersEnd 5493279 MimeEntityBegin 5493150 MimeEntityHeadersEnd 5493279 -MimeContentBegin 5493279 -MimeContentEnd 5493849 +MimeMessageHeadersEnd 5493279 Octets 570 Lines 13 -MimeEntityEnd 5493850 -MimeMessageEnd 5493850 -MimeContentEnd 5493850 -Octets 700 +MimeEntityEnd 5493849 +MimeMessageEnd 5493849 +Octets 699 Lines 17 -MimeEntityEnd 5493850 -MultipartBoundaryBegin 5493850 +MimeEntityEnd 5493849 +MultipartBoundaryBegin 5493849 MultipartBoundaryEnd 5493881 MimeEntityBegin 5493881 MimeEntityHeadersEnd 5493882 -MimeContentBegin 5493882 MimeMessageBegin 5493882 -MimeMessageHeadersEnd 5493970 MimeEntityBegin 5493882 MimeEntityHeadersEnd 5493970 -MimeContentBegin 5493970 -MimeContentEnd 5495304 +MimeMessageHeadersEnd 5493970 Octets 1334 Lines 21 -MimeEntityEnd 5495305 -MimeMessageEnd 5495305 -MimeContentEnd 5495305 -Octets 1423 +MimeEntityEnd 5495304 +MimeMessageEnd 5495304 +Octets 1422 Lines 25 -MimeEntityEnd 5495305 -MultipartBoundaryBegin 5495305 +MimeEntityEnd 5495304 +MultipartBoundaryBegin 5495304 MultipartBoundaryEnd 5495336 MimeEntityBegin 5495336 MimeEntityHeadersEnd 5495337 -MimeContentBegin 5495337 MimeMessageBegin 5495337 -MimeMessageHeadersEnd 5495453 MimeEntityBegin 5495337 MimeEntityHeadersEnd 5495453 -MimeContentBegin 5495453 -MimeContentEnd 5497580 +MimeMessageHeadersEnd 5495453 Octets 2127 Lines 50 -MimeEntityEnd 5497581 -MimeMessageEnd 5497581 -MimeContentEnd 5497581 -Octets 2244 +MimeEntityEnd 5497580 +MimeMessageEnd 5497580 +Octets 2243 Lines 54 -MimeEntityEnd 5497581 -MultipartBoundaryBegin 5497581 +MimeEntityEnd 5497580 +MultipartBoundaryBegin 5497580 MultipartBoundaryEnd 5497612 MimeEntityBegin 5497612 MimeEntityHeadersEnd 5497613 -MimeContentBegin 5497613 MimeMessageBegin 5497613 -MimeMessageHeadersEnd 5497734 MimeEntityBegin 5497613 MimeEntityHeadersEnd 5497734 -MimeContentBegin 5497734 -MimeContentEnd 5499755 +MimeMessageHeadersEnd 5497734 Octets 2021 Lines 43 -MimeEntityEnd 5499756 -MimeMessageEnd 5499756 -MimeContentEnd 5499756 -Octets 2143 +MimeEntityEnd 5499755 +MimeMessageEnd 5499755 +Octets 2142 Lines 47 -MimeEntityEnd 5499756 -MultipartBoundaryBegin 5499756 +MimeEntityEnd 5499755 +MultipartBoundaryBegin 5499755 MultipartBoundaryEnd 5499787 MimeEntityBegin 5499787 MimeEntityHeadersEnd 5499788 -MimeContentBegin 5499788 MimeMessageBegin 5499788 -MimeMessageHeadersEnd 5499909 MimeEntityBegin 5499788 MimeEntityHeadersEnd 5499909 -MimeContentBegin 5499909 -MimeContentEnd 5500586 +MimeMessageHeadersEnd 5499909 Octets 677 Lines 20 -MimeEntityEnd 5500587 -MimeMessageEnd 5500587 -MimeContentEnd 5500587 -Octets 799 +MimeEntityEnd 5500586 +MimeMessageEnd 5500586 +Octets 798 Lines 24 -MimeEntityEnd 5500587 -MultipartBoundaryBegin 5500587 +MimeEntityEnd 5500586 +MultipartBoundaryBegin 5500586 MultipartBoundaryEnd 5500618 MimeEntityBegin 5500618 MimeEntityHeadersEnd 5500619 -MimeContentBegin 5500619 MimeMessageBegin 5500619 -MimeMessageHeadersEnd 5500756 MimeEntityBegin 5500619 MimeEntityHeadersEnd 5500756 -MimeContentBegin 5500756 -MimeContentEnd 5501576 +MimeMessageHeadersEnd 5500756 Octets 820 Lines 17 -MimeEntityEnd 5501577 -MimeMessageEnd 5501577 -MimeContentEnd 5501577 -Octets 958 +MimeEntityEnd 5501576 +MimeMessageEnd 5501576 +Octets 957 Lines 21 -MimeEntityEnd 5501577 -MultipartBoundaryBegin 5501577 +MimeEntityEnd 5501576 +MultipartBoundaryBegin 5501576 MultipartBoundaryEnd 5501608 MimeEntityBegin 5501608 MimeEntityHeadersEnd 5501609 -MimeContentBegin 5501609 MimeMessageBegin 5501609 -MimeMessageHeadersEnd 5501733 MimeEntityBegin 5501609 MimeEntityHeadersEnd 5501733 -MimeContentBegin 5501733 -MimeContentEnd 5502457 +MimeMessageHeadersEnd 5501733 Octets 724 Lines 22 -MimeEntityEnd 5502458 -MimeMessageEnd 5502458 -MimeContentEnd 5502458 -Octets 849 +MimeEntityEnd 5502457 +MimeMessageEnd 5502457 +Octets 848 Lines 26 -MimeEntityEnd 5502458 -MultipartBoundaryBegin 5502458 +MimeEntityEnd 5502457 +MultipartBoundaryBegin 5502457 MultipartBoundaryEnd 5502489 MimeEntityBegin 5502489 MimeEntityHeadersEnd 5502490 -MimeContentBegin 5502490 MimeMessageBegin 5502490 -MimeMessageHeadersEnd 5502592 MimeEntityBegin 5502490 MimeEntityHeadersEnd 5502592 -MimeContentBegin 5502592 -MimeContentEnd 5503332 +MimeMessageHeadersEnd 5502592 Octets 740 Lines 17 -MimeEntityEnd 5503333 -MimeMessageEnd 5503333 -MimeContentEnd 5503333 -Octets 843 +MimeEntityEnd 5503332 +MimeMessageEnd 5503332 +Octets 842 Lines 21 -MimeEntityEnd 5503333 -MultipartBoundaryBegin 5503333 +MimeEntityEnd 5503332 +MultipartBoundaryBegin 5503332 MultipartBoundaryEnd 5503364 MimeEntityBegin 5503364 MimeEntityHeadersEnd 5503365 -MimeContentBegin 5503365 MimeMessageBegin 5503365 -MimeMessageHeadersEnd 5503521 MimeEntityBegin 5503365 MimeEntityHeadersEnd 5503521 -MimeContentBegin 5503521 -MimeContentEnd 5503880 +MimeMessageHeadersEnd 5503521 Octets 359 Lines 8 -MimeEntityEnd 5503881 -MimeMessageEnd 5503881 -MimeContentEnd 5503881 -Octets 516 +MimeEntityEnd 5503880 +MimeMessageEnd 5503880 +Octets 515 Lines 13 -MimeEntityEnd 5503881 -MultipartBoundaryBegin 5503881 +MimeEntityEnd 5503880 +MultipartBoundaryBegin 5503880 MultipartBoundaryEnd 5503912 MimeEntityBegin 5503912 MimeEntityHeadersEnd 5503913 -MimeContentBegin 5503913 MimeMessageBegin 5503913 -MimeMessageHeadersEnd 5504000 MimeEntityBegin 5503913 MimeEntityHeadersEnd 5504000 -MimeContentBegin 5504000 -MimeContentEnd 5504635 +MimeMessageHeadersEnd 5504000 Octets 635 Lines 16 -MimeEntityEnd 5504636 -MimeMessageEnd 5504636 -MimeContentEnd 5504636 -Octets 723 +MimeEntityEnd 5504635 +MimeMessageEnd 5504635 +Octets 722 Lines 20 -MimeEntityEnd 5504636 -MultipartBoundaryBegin 5504636 +MimeEntityEnd 5504635 +MultipartBoundaryBegin 5504635 MultipartBoundaryEnd 5504667 MimeEntityBegin 5504667 MimeEntityHeadersEnd 5504668 -MimeContentBegin 5504668 MimeMessageBegin 5504668 -MimeMessageHeadersEnd 5504817 MimeEntityBegin 5504668 MimeEntityHeadersEnd 5504817 -MimeContentBegin 5504817 -MimeContentEnd 5505183 +MimeMessageHeadersEnd 5504817 Octets 366 Lines 18 -MimeEntityEnd 5505184 -MimeMessageEnd 5505184 -MimeContentEnd 5505184 -Octets 516 +MimeEntityEnd 5505183 +MimeMessageEnd 5505183 +Octets 515 Lines 22 -MimeEntityEnd 5505184 -MultipartBoundaryBegin 5505184 +MimeEntityEnd 5505183 +MultipartBoundaryBegin 5505183 MultipartBoundaryEnd 5505215 MimeEntityBegin 5505215 MimeEntityHeadersEnd 5505216 -MimeContentBegin 5505216 MimeMessageBegin 5505216 -MimeMessageHeadersEnd 5505317 MimeEntityBegin 5505216 MimeEntityHeadersEnd 5505317 -MimeContentBegin 5505317 -MimeContentEnd 5505605 +MimeMessageHeadersEnd 5505317 Octets 288 Lines 7 -MimeEntityEnd 5505606 -MimeMessageEnd 5505606 -MimeContentEnd 5505606 -Octets 390 +MimeEntityEnd 5505605 +MimeMessageEnd 5505605 +Octets 389 Lines 11 -MimeEntityEnd 5505606 -MultipartBoundaryBegin 5505606 +MimeEntityEnd 5505605 +MultipartBoundaryBegin 5505605 MultipartBoundaryEnd 5505637 MimeEntityBegin 5505637 MimeEntityHeadersEnd 5505638 -MimeContentBegin 5505638 MimeMessageBegin 5505638 -MimeMessageHeadersEnd 5505766 MimeEntityBegin 5505638 MimeEntityHeadersEnd 5505766 -MimeContentBegin 5505766 -MimeContentEnd 5506245 +MimeMessageHeadersEnd 5505766 Octets 479 Lines 17 -MimeEntityEnd 5506246 -MimeMessageEnd 5506246 -MimeContentEnd 5506246 -Octets 608 +MimeEntityEnd 5506245 +MimeMessageEnd 5506245 +Octets 607 Lines 21 -MimeEntityEnd 5506246 -MultipartBoundaryBegin 5506246 +MimeEntityEnd 5506245 +MultipartBoundaryBegin 5506245 MultipartBoundaryEnd 5506277 MimeEntityBegin 5506277 MimeEntityHeadersEnd 5506278 -MimeContentBegin 5506278 MimeMessageBegin 5506278 -MimeMessageHeadersEnd 5506375 MimeEntityBegin 5506278 MimeEntityHeadersEnd 5506375 -MimeContentBegin 5506375 -MimeContentEnd 5506755 +MimeMessageHeadersEnd 5506375 Octets 380 Lines 20 -MimeEntityEnd 5506756 -MimeMessageEnd 5506756 -MimeContentEnd 5506756 -Octets 478 +MimeEntityEnd 5506755 +MimeMessageEnd 5506755 +Octets 477 Lines 24 -MimeEntityEnd 5506756 -MultipartBoundaryBegin 5506756 +MimeEntityEnd 5506755 +MultipartBoundaryBegin 5506755 MultipartBoundaryEnd 5506787 MimeEntityBegin 5506787 MimeEntityHeadersEnd 5506788 -MimeContentBegin 5506788 MimeMessageBegin 5506788 -MimeMessageHeadersEnd 5506903 MimeEntityBegin 5506788 MimeEntityHeadersEnd 5506903 -MimeContentBegin 5506903 -MimeContentEnd 5508222 +MimeMessageHeadersEnd 5506903 Octets 1319 Lines 27 -MimeEntityEnd 5508223 -MimeMessageEnd 5508223 -MimeContentEnd 5508223 -Octets 1435 +MimeEntityEnd 5508222 +MimeMessageEnd 5508222 +Octets 1434 Lines 31 -MimeEntityEnd 5508223 -MultipartBoundaryBegin 5508223 +MimeEntityEnd 5508222 +MultipartBoundaryBegin 5508222 MultipartBoundaryEnd 5508254 MimeEntityBegin 5508254 MimeEntityHeadersEnd 5508255 -MimeContentBegin 5508255 MimeMessageBegin 5508255 -MimeMessageHeadersEnd 5508355 MimeEntityBegin 5508255 MimeEntityHeadersEnd 5508355 -MimeContentBegin 5508355 -MimeContentEnd 5508650 +MimeMessageHeadersEnd 5508355 Octets 295 Lines 10 -MimeEntityEnd 5508651 -MimeMessageEnd 5508651 -MimeContentEnd 5508651 -Octets 396 +MimeEntityEnd 5508650 +MimeMessageEnd 5508650 +Octets 395 Lines 14 -MimeEntityEnd 5508651 -MultipartBoundaryBegin 5508651 +MimeEntityEnd 5508650 +MultipartBoundaryBegin 5508650 MultipartBoundaryEnd 5508682 MimeEntityBegin 5508682 MimeEntityHeadersEnd 5508683 -MimeContentBegin 5508683 MimeMessageBegin 5508683 -MimeMessageHeadersEnd 5508826 MimeEntityBegin 5508683 MimeEntityHeadersEnd 5508826 -MimeContentBegin 5508826 -MimeContentEnd 5509845 +MimeMessageHeadersEnd 5508826 Octets 1019 Lines 37 -MimeEntityEnd 5509846 -MimeMessageEnd 5509846 -MimeContentEnd 5509846 -Octets 1163 +MimeEntityEnd 5509845 +MimeMessageEnd 5509845 +Octets 1162 Lines 41 -MimeEntityEnd 5509846 -MultipartEndBoundaryBegin 5509846 +MimeEntityEnd 5509845 +MultipartEndBoundaryBegin 5509845 MultipartEndBoundaryEnd 5509878 MultipartEpilogueBegin 5509878 MultipartEpilogueEnd 5509879 -MimeContentEnd 5509880 -Octets 64211 +Octets 64210 Lines 1846 -MimeEntityEnd 5509880 -MultipartEndBoundaryBegin 5509880 +MimeEntityEnd 5509879 +MultipartEndBoundaryBegin 5509879 MultipartEndBoundaryEnd 5509899 MultipartEpilogueBegin 5509899 MultipartEpilogueEnd 5509954 -MimeContentEnd 5509955 -Octets 68782 +Octets 68781 Lines 1958 -MimeEntityEnd 5509955 -MimeMessageEnd 5509955 +MimeEntityEnd 5509954 +MimeMessageEnd 5509954 MboxMarkerBegin 5509955 MboxMarkerEnd 5509962 MimeMessageBegin 5509963 MimeMessageHeadersEnd 5510771 MimeEntityBegin 5509963 MimeEntityHeadersEnd 5510771 -MimeContentBegin 5510771 -MimeContentEnd 5512642 Octets 1871 Lines 49 -MimeEntityEnd 5512643 -MimeMessageEnd 5512643 +MimeEntityEnd 5512642 +MimeMessageEnd 5512642 MboxMarkerBegin 5512643 MboxMarkerEnd 5512650 MimeMessageBegin 5512651 MimeMessageHeadersEnd 5513378 MimeEntityBegin 5512651 MimeEntityHeadersEnd 5513378 -MimeContentBegin 5513378 MultipartPreambleBegin 5513378 MultipartPreambleEnd 5513378 MultipartBoundaryBegin 5513378 MultipartBoundaryEnd 5513405 MimeEntityBegin 5513405 MimeEntityHeadersEnd 5513406 -MimeContentBegin 5513406 -MimeContentEnd 5513518 Octets 112 Lines 2 -MimeEntityEnd 5513519 -MultipartBoundaryBegin 5513519 +MimeEntityEnd 5513518 +MultipartBoundaryBegin 5513518 MultipartBoundaryEnd 5513546 MimeEntityBegin 5513546 MimeEntityHeadersEnd 5513635 -MimeContentBegin 5513635 -MimeContentEnd 5644327 Octets 130692 Lines 2012 -MimeEntityEnd 5644328 -MultipartBoundaryBegin 5644328 +MimeEntityEnd 5644327 +MultipartBoundaryBegin 5644327 MultipartBoundaryEnd 5644355 MimeEntityBegin 5644355 MimeEntityHeadersEnd 5644356 -MimeContentBegin 5644356 -MimeContentEnd 5644411 Octets 55 Lines 2 -MimeEntityEnd 5644412 -MultipartBoundaryBegin 5644412 +MimeEntityEnd 5644411 +MultipartBoundaryBegin 5644411 MultipartBoundaryEnd 5644439 MimeEntityBegin 5644439 MimeEntityHeadersEnd 5644584 -MimeContentBegin 5644584 -MimeContentEnd 5659481 Octets 14897 Lines 78 -MimeEntityEnd 5659482 -MultipartBoundaryBegin 5659482 +MimeEntityEnd 5659481 +MultipartBoundaryBegin 5659481 MultipartBoundaryEnd 5659509 MimeEntityBegin 5659509 MimeEntityHeadersEnd 5659510 -MimeContentBegin 5659510 -MimeContentEnd 5659600 Octets 90 Lines 6 -MimeEntityEnd 5659601 -MultipartBoundaryBegin 5659601 +MimeEntityEnd 5659600 +MultipartBoundaryBegin 5659600 MultipartBoundaryEnd 5659628 MimeEntityBegin 5659628 MimeEntityHeadersEnd 5659773 -MimeContentBegin 5659773 -MimeContentEnd 5667874 Octets 8101 Lines 42 -MimeEntityEnd 5667875 -MultipartBoundaryBegin 5667875 +MimeEntityEnd 5667874 +MultipartBoundaryBegin 5667874 MultipartBoundaryEnd 5667902 MimeEntityBegin 5667902 MimeEntityHeadersEnd 5667903 -MimeContentBegin 5667903 -MimeContentEnd 5667977 Octets 74 Lines 4 -MimeEntityEnd 5667978 -MultipartEndBoundaryBegin 5667978 +MimeEntityEnd 5667977 +MultipartEndBoundaryBegin 5667977 MultipartEndBoundaryEnd 5668006 MultipartEpilogueBegin 5668006 MultipartEpilogueEnd 5668007 -MimeContentEnd 5668008 -Octets 154630 +Octets 154629 Lines 2172 -MimeEntityEnd 5668008 -MimeMessageEnd 5668008 +MimeEntityEnd 5668007 +MimeMessageEnd 5668007 MboxMarkerBegin 5668008 MboxMarkerEnd 5668015 MimeMessageBegin 5668016 MimeMessageHeadersEnd 5668539 MimeEntityBegin 5668016 MimeEntityHeadersEnd 5668539 -MimeContentBegin 5668539 -MimeContentEnd 5669107 Octets 568 Lines 22 -MimeEntityEnd 5669108 -MimeMessageEnd 5669108 +MimeEntityEnd 5669107 +MimeMessageEnd 5669107 MboxMarkerBegin 5669108 MboxMarkerEnd 5669115 MimeMessageBegin 5669116 MimeMessageHeadersEnd 5670302 MimeEntityBegin 5669116 MimeEntityHeadersEnd 5670302 -MimeContentBegin 5670302 MultipartPreambleBegin 5670302 MultipartPreambleEnd 5670457 MultipartBoundaryBegin 5670457 MultipartBoundaryEnd 5670497 MimeEntityBegin 5670497 MimeEntityHeadersEnd 5670541 -MimeContentBegin 5670541 -MimeContentEnd 5671271 Octets 730 Lines 27 -MimeEntityEnd 5671272 -MultipartBoundaryBegin 5671272 +MimeEntityEnd 5671271 +MultipartBoundaryBegin 5671271 MultipartBoundaryEnd 5671312 MimeEntityBegin 5671312 MimeEntityHeadersEnd 5671397 -MimeContentBegin 5671397 MultipartPreambleBegin 5671397 MultipartPreambleEnd 5671397 MultipartBoundaryBegin 5671397 MultipartBoundaryEnd 5671439 MimeEntityBegin 5671439 MimeEntityHeadersEnd 5671530 -MimeContentBegin 5671530 -MimeContentEnd 5672332 Octets 802 Lines 26 -MimeEntityEnd 5672333 -MultipartBoundaryBegin 5672333 +MimeEntityEnd 5672332 +MultipartBoundaryBegin 5672332 MultipartBoundaryEnd 5672375 MimeEntityBegin 5672375 MimeEntityHeadersEnd 5672468 -MimeContentBegin 5672468 -MimeContentEnd 5730339 Octets 57871 Lines 756 -MimeEntityEnd 5730340 -MultipartBoundaryBegin 5730340 +MimeEntityEnd 5730339 +MultipartBoundaryBegin 5730339 MultipartBoundaryEnd 5730382 MimeEntityBegin 5730382 MimeEntityHeadersEnd 5730473 -MimeContentBegin 5730473 -MimeContentEnd 5730478 Octets 5 Lines 2 -MimeEntityEnd 5730479 -MultipartEndBoundaryBegin 5730479 +MimeEntityEnd 5730478 +MultipartEndBoundaryBegin 5730478 MultipartEndBoundaryEnd 5730522 MultipartEpilogueBegin 5730522 MultipartEpilogueEnd 5730523 -MimeContentEnd 5730524 -Octets 59127 +Octets 59126 Lines 799 -MimeEntityEnd 5730524 -MultipartEndBoundaryBegin 5730524 +MimeEntityEnd 5730523 +MultipartEndBoundaryBegin 5730523 MultipartEndBoundaryEnd 5730565 MultipartEpilogueBegin 5730565 MultipartEpilogueEnd 5730566 -MimeContentEnd 5730567 -Octets 60265 +Octets 60264 Lines 838 -MimeEntityEnd 5730567 -MimeMessageEnd 5730567 +MimeEntityEnd 5730566 +MimeMessageEnd 5730566 MboxMarkerBegin 5730567 MboxMarkerEnd 5730574 MimeMessageBegin 5730575 MimeMessageHeadersEnd 5731315 MimeEntityBegin 5730575 MimeEntityHeadersEnd 5731315 -MimeContentBegin 5731315 MultipartPreambleBegin 5731315 MultipartPreambleEnd 5731316 MultipartBoundaryBegin 5731316 MultipartBoundaryEnd 5731365 MimeEntityBegin 5731365 MimeEntityHeadersEnd 5731455 -MimeContentBegin 5731455 -MimeContentEnd 5731629 Octets 174 Lines 8 -MimeEntityEnd 5731630 -MultipartBoundaryBegin 5731630 +MimeEntityEnd 5731629 +MultipartBoundaryBegin 5731629 MultipartBoundaryEnd 5731679 MimeEntityBegin 5731679 MimeEntityHeadersEnd 5731738 -MimeContentBegin 5731738 -MimeContentEnd 5786986 Octets 55248 Lines 757 -MimeEntityEnd 5786987 -MultipartEndBoundaryBegin 5786987 +MimeEntityEnd 5786986 +MultipartEndBoundaryBegin 5786986 MultipartEndBoundaryEnd 5787037 MultipartEpilogueBegin 5787037 MultipartEpilogueEnd 5787038 -MimeContentEnd 5787039 -Octets 55724 +Octets 55723 Lines 776 -MimeEntityEnd 5787039 -MimeMessageEnd 5787039 +MimeEntityEnd 5787038 +MimeMessageEnd 5787038 MboxMarkerBegin 5787039 MboxMarkerEnd 5787070 MimeMessageBegin 5787071 MimeMessageHeadersEnd 5788538 MimeEntityBegin 5787071 MimeEntityHeadersEnd 5788538 -MimeContentBegin 5788538 -MimeContentEnd 5789878 Octets 1340 Lines 35 -MimeEntityEnd 5789879 -MimeMessageEnd 5789879 +MimeEntityEnd 5789878 +MimeMessageEnd 5789878 MboxMarkerBegin 5789879 MboxMarkerEnd 5789886 MimeMessageBegin 5789887 MimeMessageHeadersEnd 5790681 MimeEntityBegin 5789887 MimeEntityHeadersEnd 5790681 -MimeContentBegin 5790681 MultipartPreambleBegin 5790681 MultipartPreambleEnd 5790727 MultipartBoundaryBegin 5790727 MultipartBoundaryEnd 5790752 MimeEntityBegin 5790752 MimeEntityHeadersEnd 5790828 -MimeContentBegin 5790828 -MimeContentEnd 5791198 Octets 370 Lines 14 -MimeEntityEnd 5791199 -MultipartBoundaryBegin 5791199 +MimeEntityEnd 5791198 +MultipartBoundaryBegin 5791198 MultipartBoundaryEnd 5791224 MimeEntityBegin 5791224 MimeEntityHeadersEnd 5791314 -MimeContentBegin 5791314 MimeMessageBegin 5791314 -MimeMessageHeadersEnd 5792382 MimeEntityBegin 5791314 MimeEntityHeadersEnd 5792382 -MimeContentBegin 5792382 -MimeContentEnd 5816777 +MimeMessageHeadersEnd 5792382 Octets 24395 Lines 464 -MimeEntityEnd 5816778 -MimeMessageEnd 5816778 -MimeContentEnd 5816778 -Octets 25464 +MimeEntityEnd 5816777 +MimeMessageEnd 5816777 +Octets 25463 Lines 478 -MimeEntityEnd 5816778 -MultipartEndBoundaryBegin 5816778 +MimeEntityEnd 5816777 +MultipartEndBoundaryBegin 5816777 MultipartEndBoundaryEnd 5816804 MultipartEpilogueBegin 5816804 MultipartEpilogueEnd 5816805 -MimeContentEnd 5816806 -Octets 26125 +Octets 26124 Lines 505 -MimeEntityEnd 5816806 -MimeMessageEnd 5816806 +MimeEntityEnd 5816805 +MimeMessageEnd 5816805 MboxMarkerBegin 5816806 MboxMarkerEnd 5816813 MimeMessageBegin 5816814 MimeMessageHeadersEnd 5817482 MimeEntityBegin 5816814 MimeEntityHeadersEnd 5817482 -MimeContentBegin 5817482 MultipartPreambleBegin 5817482 MultipartPreambleEnd 5817528 MultipartBoundaryBegin 5817528 MultipartBoundaryEnd 5817576 MimeEntityBegin 5817576 MimeEntityHeadersEnd 5817654 -MimeContentBegin 5817654 -MimeContentEnd 5817688 Octets 34 Lines 2 -MimeEntityEnd 5817689 -MultipartBoundaryBegin 5817689 +MimeEntityEnd 5817688 +MultipartBoundaryBegin 5817688 MultipartBoundaryEnd 5817737 MimeEntityBegin 5817737 MimeEntityHeadersEnd 5817796 -MimeContentBegin 5817796 -MimeContentEnd 5839947 Octets 22151 Lines 304 -MimeEntityEnd 5839948 -MultipartEndBoundaryBegin 5839948 +MimeEntityEnd 5839947 +MultipartEndBoundaryBegin 5839947 MultipartEndBoundaryEnd 5839997 MultipartEpilogueBegin 5839997 MultipartEpilogueEnd 5839997 -MimeContentEnd 5839998 -Octets 22516 +Octets 22515 Lines 317 -MimeEntityEnd 5839998 -MimeMessageEnd 5839998 +MimeEntityEnd 5839997 +MimeMessageEnd 5839997 MboxMarkerBegin 5839998 MboxMarkerEnd 5840029 MimeMessageBegin 5840030 MimeMessageHeadersEnd 5840554 MimeEntityBegin 5840030 MimeEntityHeadersEnd 5840554 -MimeContentBegin 5840554 MultipartPreambleBegin 5840554 MultipartPreambleEnd 5840554 MultipartBoundaryBegin 5840554 MultipartBoundaryEnd 5840562 MimeEntityBegin 5840562 MimeEntityHeadersEnd 5840606 -MimeContentBegin 5840606 -MimeContentEnd 5841778 Octets 1172 Lines 22 -MimeEntityEnd 5841779 -MultipartBoundaryBegin 5841779 +MimeEntityEnd 5841778 +MultipartBoundaryBegin 5841778 MultipartBoundaryEnd 5841787 MimeEntityBegin 5841787 MimeEntityHeadersEnd 5841913 -MimeContentBegin 5841913 -MimeContentEnd 5842059 Octets 146 Lines 3 -MimeEntityEnd 5842060 -MultipartBoundaryBegin 5842060 +MimeEntityEnd 5842059 +MultipartBoundaryBegin 5842059 MultipartBoundaryEnd 5842068 MimeEntityBegin 5842068 MimeEntityHeadersEnd 5842184 -MimeContentBegin 5842184 -MimeContentEnd 5842378 Octets 194 Lines 3 -MimeEntityEnd 5842379 -MultipartEndBoundaryBegin 5842379 +MimeEntityEnd 5842378 +MultipartEndBoundaryBegin 5842378 MultipartEndBoundaryEnd 5842388 MultipartEpilogueBegin 5842388 MultipartEpilogueEnd 5842388 -MimeContentEnd 5842389 -Octets 1835 +Octets 1834 Lines 42 -MimeEntityEnd 5842389 -MimeMessageEnd 5842389 +MimeEntityEnd 5842388 +MimeMessageEnd 5842388 MboxMarkerBegin 5842389 MboxMarkerEnd 5842396 MimeMessageBegin 5842397 MimeMessageHeadersEnd 5843191 MimeEntityBegin 5842397 MimeEntityHeadersEnd 5843191 -MimeContentBegin 5843191 -MimeContentEnd 6099969 Octets 256778 Lines 3519 -MimeEntityEnd 6099970 -MimeMessageEnd 6099970 +MimeEntityEnd 6099969 +MimeMessageEnd 6099969 MboxMarkerBegin 6099970 MboxMarkerEnd 6099977 MimeMessageBegin 6099978 MimeMessageHeadersEnd 6100830 MimeEntityBegin 6099978 MimeEntityHeadersEnd 6100830 -MimeContentBegin 6100830 MultipartPreambleBegin 6100830 MultipartPreambleEnd 6100831 MultipartBoundaryBegin 6100831 MultipartBoundaryEnd 6100845 MimeEntityBegin 6100845 MimeEntityHeadersEnd 6100922 -MimeContentBegin 6100922 -MimeContentEnd 6101112 Octets 190 Lines 9 -MimeEntityEnd 6101113 -MultipartBoundaryBegin 6101113 +MimeEntityEnd 6101112 +MultipartBoundaryBegin 6101112 MultipartBoundaryEnd 6101127 MimeEntityBegin 6101127 MimeEntityHeadersEnd 6101231 -MimeContentBegin 6101231 -MimeContentEnd 6199478 Octets 98247 Lines 1276 -MimeEntityEnd 6199479 -MultipartEndBoundaryBegin 6199479 +MimeEntityEnd 6199478 +MultipartEndBoundaryBegin 6199478 MultipartEndBoundaryEnd 6199494 MultipartEpilogueBegin 6199494 MultipartEpilogueEnd 6199495 -MimeContentEnd 6199496 -Octets 98666 +Octets 98665 Lines 1297 -MimeEntityEnd 6199496 -MimeMessageEnd 6199496 +MimeEntityEnd 6199495 +MimeMessageEnd 6199495 MboxMarkerBegin 6199496 MboxMarkerEnd 6199503 MimeMessageBegin 6199504 MimeMessageHeadersEnd 6200381 MimeEntityBegin 6199504 MimeEntityHeadersEnd 6200381 -MimeContentBegin 6200381 MultipartPreambleBegin 6200381 MultipartPreambleEnd 6200381 MultipartBoundaryBegin 6200381 MultipartBoundaryEnd 6200390 MimeEntityBegin 6200390 MimeEntityHeadersEnd 6200436 -MimeContentBegin 6200436 -MimeContentEnd 6201379 Octets 943 Lines 22 -MimeEntityEnd 6201380 -MultipartBoundaryBegin 6201380 +MimeEntityEnd 6201379 +MultipartBoundaryBegin 6201379 MultipartBoundaryEnd 6201389 MimeEntityBegin 6201389 MimeEntityHeadersEnd 6201452 -MimeContentBegin 6201452 MultipartPreambleBegin 6201452 MultipartPreambleEnd 6201453 MultipartBoundaryBegin 6201453 MultipartBoundaryEnd 6201475 MimeEntityBegin 6201475 MimeEntityHeadersEnd 6201836 -MimeContentBegin 6201836 MultipartPreambleBegin 6201836 MultipartPreambleEnd 6201836 MultipartBoundaryBegin 6201836 MultipartBoundaryEnd 6201858 MimeEntityBegin 6201858 MimeEntityHeadersEnd 6201960 -MimeContentBegin 6201960 MultipartPreambleBegin 6201960 MultipartPreambleEnd 6201960 MultipartBoundaryBegin 6201960 MultipartBoundaryEnd 6201982 MimeEntityBegin 6201982 MimeEntityHeadersEnd 6202105 -MimeContentBegin 6202105 -MimeContentEnd 6202471 Octets 366 Lines 9 -MimeEntityEnd 6202472 -MultipartBoundaryBegin 6202472 +MimeEntityEnd 6202471 +MultipartBoundaryBegin 6202471 MultipartBoundaryEnd 6202494 MimeEntityBegin 6202494 MimeEntityHeadersEnd 6202616 -MimeContentBegin 6202616 -MimeContentEnd 6203008 Octets 392 Lines 11 -MimeEntityEnd 6203009 -MultipartBoundaryBegin 6203009 +MimeEntityEnd 6203008 +MultipartBoundaryBegin 6203008 MultipartBoundaryEnd 6203031 MimeEntityBegin 6203031 MimeEntityHeadersEnd 6203156 -MimeContentBegin 6203156 -MimeContentEnd 6203864 Octets 708 Lines 19 -MimeEntityEnd 6203865 -MultipartEndBoundaryBegin 6203865 +MimeEntityEnd 6203864 +MultipartEndBoundaryBegin 6203864 MultipartEndBoundaryEnd 6203888 MultipartEpilogueBegin 6203888 MultipartEpilogueEnd 6203889 -MimeContentEnd 6203890 -Octets 1930 +Octets 1929 Lines 56 -MimeEntityEnd 6203890 -MultipartBoundaryBegin 6203890 +MimeEntityEnd 6203889 +MultipartBoundaryBegin 6203889 MultipartBoundaryEnd 6203912 MimeEntityBegin 6203912 MimeEntityHeadersEnd 6204011 -MimeContentBegin 6204011 MultipartPreambleBegin 6204011 MultipartPreambleEnd 6204011 MultipartBoundaryBegin 6204011 MultipartBoundaryEnd 6204033 MimeEntityBegin 6204033 MimeEntityHeadersEnd 6204165 -MimeContentBegin 6204165 -MimeContentEnd 6220580 Octets 16415 Lines 471 -MimeEntityEnd 6220581 -MultipartBoundaryBegin 6220581 +MimeEntityEnd 6220580 +MultipartBoundaryBegin 6220580 MultipartBoundaryEnd 6220603 MimeEntityBegin 6220603 MimeEntityHeadersEnd 6220734 -MimeContentBegin 6220734 -MimeContentEnd 6234988 Octets 14254 Lines 396 -MimeEntityEnd 6234989 -MultipartBoundaryBegin 6234989 +MimeEntityEnd 6234988 +MultipartBoundaryBegin 6234988 MultipartBoundaryEnd 6235011 MimeEntityBegin 6235011 MimeEntityHeadersEnd 6235112 -MimeContentBegin 6235112 MultipartPreambleBegin 6235112 MultipartPreambleEnd 6235112 MultipartBoundaryBegin 6235112 MultipartBoundaryEnd 6235134 MimeEntityBegin 6235134 MimeEntityHeadersEnd 6235276 -MimeContentBegin 6235276 -MimeContentEnd 6241428 Octets 6152 Lines 165 -MimeEntityEnd 6241429 -MultipartBoundaryBegin 6241429 +MimeEntityEnd 6241428 +MultipartBoundaryBegin 6241428 MultipartBoundaryEnd 6241451 MimeEntityBegin 6241451 MimeEntityHeadersEnd 6241578 -MimeContentBegin 6241578 -MimeContentEnd 6246833 Octets 5255 Lines 161 -MimeEntityEnd 6246834 -MultipartBoundaryBegin 6246834 +MimeEntityEnd 6246833 +MultipartBoundaryBegin 6246833 MultipartBoundaryEnd 6246856 MimeEntityBegin 6246856 MimeEntityHeadersEnd 6246993 -MimeContentBegin 6246993 -MimeContentEnd 6254291 Octets 7298 Lines 198 -MimeEntityEnd 6254292 -MultipartBoundaryBegin 6254292 +MimeEntityEnd 6254291 +MultipartBoundaryBegin 6254291 MultipartBoundaryEnd 6254314 MimeEntityBegin 6254314 MimeEntityHeadersEnd 6254438 -MimeContentBegin 6254438 -MimeContentEnd 6260914 Octets 6476 Lines 185 -MimeEntityEnd 6260915 -MultipartBoundaryBegin 6260915 +MimeEntityEnd 6260914 +MultipartBoundaryBegin 6260914 MultipartBoundaryEnd 6260937 MimeEntityBegin 6260937 MimeEntityHeadersEnd 6261074 -MimeContentBegin 6261074 -MimeContentEnd 6278242 Octets 17168 Lines 493 -MimeEntityEnd 6278243 -MultipartEndBoundaryBegin 6278243 +MimeEntityEnd 6278242 +MultipartEndBoundaryBegin 6278242 MultipartEndBoundaryEnd 6278266 MultipartEpilogueBegin 6278266 MultipartEpilogueEnd 6278267 -MimeContentEnd 6278268 -Octets 43156 +Octets 43155 Lines 1229 -MimeEntityEnd 6278268 -MultipartBoundaryBegin 6278268 +MimeEntityEnd 6278267 +MultipartBoundaryBegin 6278267 MultipartBoundaryEnd 6278290 MimeEntityBegin 6278290 MimeEntityHeadersEnd 6278385 -MimeContentBegin 6278385 MultipartPreambleBegin 6278385 MultipartPreambleEnd 6278385 MultipartBoundaryBegin 6278385 MultipartBoundaryEnd 6278407 MimeEntityBegin 6278407 MimeEntityHeadersEnd 6278541 -MimeContentBegin 6278541 -MimeContentEnd 6279036 Octets 495 Lines 22 -MimeEntityEnd 6279037 -MultipartEndBoundaryBegin 6279037 +MimeEntityEnd 6279036 +MultipartEndBoundaryBegin 6279036 MultipartEndBoundaryEnd 6279060 MultipartEpilogueBegin 6279060 MultipartEpilogueEnd 6279061 -MimeContentEnd 6279062 -Octets 677 +Octets 676 Lines 29 -MimeEntityEnd 6279062 -MultipartEndBoundaryBegin 6279062 +MimeEntityEnd 6279061 +MultipartEndBoundaryBegin 6279061 MultipartEndBoundaryEnd 6279085 MultipartEpilogueBegin 6279085 MultipartEpilogueEnd 6279086 -MimeContentEnd 6279087 -Octets 75076 +Octets 75075 Lines 2145 -MimeEntityEnd 6279087 -MultipartBoundaryBegin 6279087 +MimeEntityEnd 6279086 +MultipartBoundaryBegin 6279086 MultipartBoundaryEnd 6279109 MimeEntityBegin 6279109 MimeEntityHeadersEnd 6279220 -MimeContentBegin 6279220 MultipartPreambleBegin 6279220 MultipartPreambleEnd 6279220 MultipartBoundaryBegin 6279220 MultipartBoundaryEnd 6279242 MimeEntityBegin 6279242 MimeEntityHeadersEnd 6279380 -MimeContentBegin 6279380 -MimeContentEnd 6280529 Octets 1149 Lines 30 -MimeEntityEnd 6280530 -MultipartBoundaryBegin 6280530 +MimeEntityEnd 6280529 +MultipartBoundaryBegin 6280529 MultipartBoundaryEnd 6280552 MimeEntityBegin 6280552 MimeEntityHeadersEnd 6280678 -MimeContentBegin 6280678 -MimeContentEnd 6281898 Octets 1220 Lines 36 -MimeEntityEnd 6281899 -MultipartBoundaryBegin 6281899 +MimeEntityEnd 6281898 +MultipartBoundaryBegin 6281898 MultipartBoundaryEnd 6281921 MimeEntityBegin 6281921 MimeEntityHeadersEnd 6282061 -MimeContentBegin 6282061 -MimeContentEnd 6282738 Octets 677 Lines 23 -MimeEntityEnd 6282739 -MultipartEndBoundaryBegin 6282739 +MimeEntityEnd 6282738 +MultipartEndBoundaryBegin 6282738 MultipartEndBoundaryEnd 6282762 MultipartEpilogueBegin 6282762 MultipartEpilogueEnd 6282763 -MimeContentEnd 6282764 -Octets 3544 +Octets 3543 Lines 106 -MimeEntityEnd 6282764 -MultipartEndBoundaryBegin 6282764 +MimeEntityEnd 6282763 +MultipartEndBoundaryBegin 6282763 MultipartEndBoundaryEnd 6282787 MultipartEpilogueBegin 6282787 MultipartEpilogueEnd 6282788 -MimeContentEnd 6282789 -Octets 80953 +Octets 80952 Lines 2321 -MimeEntityEnd 6282789 -MultipartEndBoundaryBegin 6282789 +MimeEntityEnd 6282788 +MultipartEndBoundaryBegin 6282788 MultipartEndBoundaryEnd 6282812 MultipartEpilogueBegin 6282812 MultipartEpilogueEnd 6282813 -MimeContentEnd 6282814 -Octets 81362 +Octets 81361 Lines 2333 -MimeEntityEnd 6282814 -MultipartEndBoundaryBegin 6282814 +MimeEntityEnd 6282813 +MultipartEndBoundaryBegin 6282813 MultipartEndBoundaryEnd 6282824 MultipartEpilogueBegin 6282824 MultipartEpilogueEnd 6282825 -MimeContentEnd 6282826 -Octets 82445 +Octets 82444 Lines 2363 -MimeEntityEnd 6282826 -MimeMessageEnd 6282826 +MimeEntityEnd 6282825 +MimeMessageEnd 6282825 MboxMarkerBegin 6282826 MboxMarkerEnd 6282833 MimeMessageBegin 6282834 MimeMessageHeadersEnd 6283636 MimeEntityBegin 6282834 MimeEntityHeadersEnd 6283636 -MimeContentBegin 6283636 -MimeContentEnd 6292835 Octets 9199 Lines 227 -MimeEntityEnd 6292836 -MimeMessageEnd 6292836 +MimeEntityEnd 6292835 +MimeMessageEnd 6292835 MboxMarkerBegin 6292836 MboxMarkerEnd 6292843 MimeMessageBegin 6292844 MimeMessageHeadersEnd 6293572 MimeEntityBegin 6292844 MimeEntityHeadersEnd 6293572 -MimeContentBegin 6293572 MultipartPreambleBegin 6293572 MultipartPreambleEnd 6293727 MultipartBoundaryBegin 6293727 MultipartBoundaryEnd 6293767 MimeEntityBegin 6293767 MimeEntityHeadersEnd 6293811 -MimeContentBegin 6293811 -MimeContentEnd 6294567 Octets 756 Lines 24 -MimeEntityEnd 6294568 -MultipartBoundaryBegin 6294568 +MimeEntityEnd 6294567 +MultipartBoundaryBegin 6294567 MultipartBoundaryEnd 6294608 MimeEntityBegin 6294608 MimeEntityHeadersEnd 6294693 -MimeContentBegin 6294693 MultipartPreambleBegin 6294693 MultipartPreambleEnd 6294693 MultipartBoundaryBegin 6294693 MultipartBoundaryEnd 6294735 MimeEntityBegin 6294735 MimeEntityHeadersEnd 6294826 -MimeContentBegin 6294826 -MimeContentEnd 6295153 Octets 327 Lines 8 -MimeEntityEnd 6295154 -MultipartBoundaryBegin 6295154 +MimeEntityEnd 6295153 +MultipartBoundaryBegin 6295153 MultipartBoundaryEnd 6295196 MimeEntityBegin 6295196 MimeEntityHeadersEnd 6295290 -MimeContentBegin 6295290 -MimeContentEnd 6317314 Octets 22024 Lines 321 -MimeEntityEnd 6317315 -MultipartBoundaryBegin 6317315 +MimeEntityEnd 6317314 +MultipartBoundaryBegin 6317314 MultipartBoundaryEnd 6317357 MimeEntityBegin 6317357 MimeEntityHeadersEnd 6317448 -MimeContentBegin 6317448 -MimeContentEnd 6317614 Octets 166 Lines 6 -MimeEntityEnd 6317615 -MultipartBoundaryBegin 6317615 +MimeEntityEnd 6317614 +MultipartBoundaryBegin 6317614 MultipartBoundaryEnd 6317657 MimeEntityBegin 6317657 MimeEntityHeadersEnd 6317754 -MimeContentBegin 6317754 -MimeContentEnd 6364967 Octets 47213 Lines 686 -MimeEntityEnd 6364968 -MultipartBoundaryBegin 6364968 +MimeEntityEnd 6364967 +MultipartBoundaryBegin 6364967 MultipartBoundaryEnd 6365010 MimeEntityBegin 6365010 MimeEntityHeadersEnd 6365101 -MimeContentBegin 6365101 -MimeContentEnd 6365171 Octets 70 Lines 3 -MimeEntityEnd 6365172 -MultipartBoundaryBegin 6365172 +MimeEntityEnd 6365171 +MultipartBoundaryBegin 6365171 MultipartBoundaryEnd 6365214 MimeEntityBegin 6365214 MimeEntityHeadersEnd 6365304 -MimeContentBegin 6365304 -MimeContentEnd 6385522 Octets 20218 Lines 295 -MimeEntityEnd 6385523 -MultipartBoundaryBegin 6385523 +MimeEntityEnd 6385522 +MultipartBoundaryBegin 6385522 MultipartBoundaryEnd 6385565 MimeEntityBegin 6385565 MimeEntityHeadersEnd 6385656 -MimeContentBegin 6385656 -MimeContentEnd 6385760 Octets 104 Lines 9 -MimeEntityEnd 6385761 -MultipartEndBoundaryBegin 6385761 +MimeEntityEnd 6385760 +MultipartEndBoundaryBegin 6385760 MultipartEndBoundaryEnd 6385804 MultipartEpilogueBegin 6385804 MultipartEpilogueEnd 6385805 -MimeContentEnd 6385806 -Octets 91113 +Octets 91112 Lines 1361 -MimeEntityEnd 6385806 -MultipartEndBoundaryBegin 6385806 +MimeEntityEnd 6385805 +MultipartEndBoundaryBegin 6385805 MultipartEndBoundaryEnd 6385847 MultipartEpilogueBegin 6385847 MultipartEpilogueEnd 6385847 -MimeContentEnd 6385848 -Octets 92276 +Octets 92275 Lines 1396 -MimeEntityEnd 6385848 -MimeMessageEnd 6385848 +MimeEntityEnd 6385847 +MimeMessageEnd 6385847 MboxMarkerBegin 6385848 MboxMarkerEnd 6385855 MimeMessageBegin 6385856 MimeMessageHeadersEnd 6386610 MimeEntityBegin 6385856 MimeEntityHeadersEnd 6386610 -MimeContentBegin 6386610 MultipartPreambleBegin 6386610 MultipartPreambleEnd 6386805 MultipartBoundaryBegin 6386805 MultipartBoundaryEnd 6386850 MimeEntityBegin 6386850 MimeEntityHeadersEnd 6386923 -MimeContentBegin 6386923 -MimeContentEnd 6387343 Octets 420 Lines 14 -MimeEntityEnd 6387344 -MultipartBoundaryBegin 6387344 +MimeEntityEnd 6387343 +MultipartBoundaryBegin 6387343 MultipartBoundaryEnd 6387389 MimeEntityBegin 6387389 MimeEntityHeadersEnd 6387450 -MimeContentBegin 6387450 -MimeContentEnd 6421014 Octets 33564 Lines 461 -MimeEntityEnd 6421015 -MultipartBoundaryBegin 6421015 +MimeEntityEnd 6421014 +MultipartBoundaryBegin 6421014 MultipartBoundaryEnd 6421060 MimeEntityBegin 6421060 MimeEntityHeadersEnd 6421133 -MimeContentBegin 6421133 -MimeContentEnd 6421227 Octets 94 Lines 8 -MimeEntityEnd 6421228 -MultipartEndBoundaryBegin 6421228 +MimeEntityEnd 6421227 +MultipartEndBoundaryBegin 6421227 MultipartEndBoundaryEnd 6421274 MultipartEpilogueBegin 6421274 MultipartEpilogueEnd 6421275 -MimeContentEnd 6421276 -Octets 34666 +Octets 34665 Lines 501 -MimeEntityEnd 6421276 -MimeMessageEnd 6421276 +MimeEntityEnd 6421275 +MimeMessageEnd 6421275 MboxMarkerBegin 6421276 MboxMarkerEnd 6421317 MimeMessageBegin 6421318 MimeMessageHeadersEnd 6421466 MimeEntityBegin 6421318 MimeEntityHeadersEnd 6421466 -MimeContentBegin 6421466 -MimeContentEnd 6464495 Octets 43029 Lines 694 -MimeEntityEnd 6464496 -MimeMessageEnd 6464496 +MimeEntityEnd 6464495 +MimeMessageEnd 6464495 MboxMarkerBegin 6464496 MboxMarkerEnd 6464527 MimeMessageBegin 6464528 MimeMessageHeadersEnd 6465111 MimeEntityBegin 6464528 MimeEntityHeadersEnd 6465111 -MimeContentBegin 6465111 MultipartPreambleBegin 6465111 MultipartPreambleEnd 6465157 MultipartBoundaryBegin 6465157 MultipartBoundaryEnd 6465196 MimeEntityBegin 6465196 MimeEntityHeadersEnd 6465314 -MimeContentBegin 6465314 MultipartPreambleBegin 6465314 MultipartPreambleEnd 6465315 MultipartBoundaryBegin 6465315 MultipartBoundaryEnd 6465354 MimeEntityBegin 6465354 MimeEntityHeadersEnd 6465432 -MimeContentBegin 6465432 -MimeContentEnd 6466704 Octets 1272 Lines 39 -MimeEntityEnd 6466705 -MultipartBoundaryBegin 6466705 +MimeEntityEnd 6466704 +MultipartBoundaryBegin 6466704 MultipartBoundaryEnd 6466744 MimeEntityBegin 6466744 MimeEntityHeadersEnd 6466823 -MimeContentBegin 6466823 -MimeContentEnd 6469287 Octets 2464 Lines 33 -MimeEntityEnd 6469288 -MultipartEndBoundaryBegin 6469288 +MimeEntityEnd 6469287 +MultipartEndBoundaryBegin 6469287 MultipartEndBoundaryEnd 6469328 MultipartEpilogueBegin 6469328 MultipartEpilogueEnd 6469330 -MimeContentEnd 6469331 -Octets 4017 +Octets 4016 Lines 84 -MimeEntityEnd 6469331 -MultipartBoundaryBegin 6469331 +MimeEntityEnd 6469330 +MultipartBoundaryBegin 6469330 MultipartBoundaryEnd 6469370 MimeEntityBegin 6469370 MimeEntityHeadersEnd 6469575 -MimeContentBegin 6469575 -MimeContentEnd 6490325 Octets 20750 Lines 271 -MimeEntityEnd 6490326 -MultipartEndBoundaryBegin 6490326 +MimeEntityEnd 6490325 +MultipartEndBoundaryBegin 6490325 MultipartEndBoundaryEnd 6490366 MultipartEpilogueBegin 6490366 MultipartEpilogueEnd 6490367 -MimeContentEnd 6490368 -Octets 25257 +Octets 25256 Lines 369 -MimeEntityEnd 6490368 -MimeMessageEnd 6490368 +MimeEntityEnd 6490367 +MimeMessageEnd 6490367 MboxMarkerBegin 6490368 MboxMarkerEnd 6490399 MimeMessageBegin 6490400 MimeMessageHeadersEnd 6490806 MimeEntityBegin 6490400 MimeEntityHeadersEnd 6490806 -MimeContentBegin 6490806 MultipartPreambleBegin 6490806 MultipartPreambleEnd 6490852 MultipartBoundaryBegin 6490852 MultipartBoundaryEnd 6490872 MimeEntityBegin 6490872 MimeEntityHeadersEnd 6490873 -MimeContentBegin 6490873 -MimeContentEnd 6490936 Octets 63 Lines 2 -MimeEntityEnd 6490937 -MultipartBoundaryBegin 6490937 +MimeEntityEnd 6490936 +MultipartBoundaryBegin 6490936 MultipartBoundaryEnd 6490957 MimeEntityBegin 6490957 MimeEntityHeadersEnd 6491031 -MimeContentBegin 6491031 MultipartPreambleBegin 6491031 MultipartPreambleEnd 6491031 MultipartBoundaryBegin 6491031 MultipartBoundaryEnd 6491058 MimeEntityBegin 6491058 MimeEntityHeadersEnd 6491164 -MimeContentBegin 6491164 -MimeContentEnd 6491244 Octets 80 Lines 4 -MimeEntityEnd 6491245 -MultipartBoundaryBegin 6491245 +MimeEntityEnd 6491244 +MultipartBoundaryBegin 6491244 MultipartBoundaryEnd 6491272 MimeEntityBegin 6491272 MimeEntityHeadersEnd 6491381 -MimeContentBegin 6491381 -MimeContentEnd 6491539 Octets 158 Lines 5 -MimeEntityEnd 6491540 -MultipartBoundaryBegin 6491540 +MimeEntityEnd 6491539 +MultipartBoundaryBegin 6491539 MultipartBoundaryEnd 6491567 MimeEntityBegin 6491567 MimeEntityHeadersEnd 6491676 -MimeContentBegin 6491676 -MimeContentEnd 6491839 Octets 163 Lines 11 -MimeEntityEnd 6491840 -MultipartBoundaryBegin 6491840 +MimeEntityEnd 6491839 +MultipartBoundaryBegin 6491839 MultipartBoundaryEnd 6491867 MimeEntityBegin 6491867 MimeEntityHeadersEnd 6491972 -MimeContentBegin 6491972 -MimeContentEnd 6492133 Octets 161 Lines 4 -MimeEntityEnd 6492134 -MultipartBoundaryBegin 6492134 +MimeEntityEnd 6492133 +MultipartBoundaryBegin 6492133 MultipartBoundaryEnd 6492161 MimeEntityBegin 6492161 MimeEntityHeadersEnd 6492285 -MimeContentBegin 6492285 -MimeContentEnd 6492712 Octets 427 Lines 7 -MimeEntityEnd 6492713 -MultipartEndBoundaryBegin 6492713 +MimeEntityEnd 6492712 +MultipartEndBoundaryBegin 6492712 MultipartEndBoundaryEnd 6492741 MultipartEpilogueBegin 6492741 MultipartEpilogueEnd 6492741 -MimeContentEnd 6492742 -Octets 1711 +Octets 1710 Lines 57 -MimeEntityEnd 6492742 -MultipartBoundaryBegin 6492742 +MimeEntityEnd 6492741 +MultipartBoundaryBegin 6492741 MultipartBoundaryEnd 6492762 MimeEntityBegin 6492762 MimeEntityHeadersEnd 6492763 -MimeContentBegin 6492763 -MimeContentEnd 6492928 Octets 165 Lines 5 -MimeEntityEnd 6492929 -MultipartBoundaryBegin 6492929 +MimeEntityEnd 6492928 +MultipartBoundaryBegin 6492928 MultipartBoundaryEnd 6492949 MimeEntityBegin 6492949 MimeEntityHeadersEnd 6492999 -MimeContentBegin 6492999 MultipartPreambleBegin 6492999 MultipartPreambleEnd 6492999 MultipartBoundaryBegin 6492999 MultipartBoundaryEnd 6493004 MimeEntityBegin 6493004 MimeEntityHeadersEnd 6493030 -MimeContentBegin 6493030 -MimeContentEnd 6493083 Octets 53 Lines 2 -MimeEntityEnd 6493084 -MultipartBoundaryBegin 6493084 +MimeEntityEnd 6493083 +MultipartBoundaryBegin 6493083 MultipartBoundaryEnd 6493089 MimeEntityBegin 6493089 MimeEntityHeadersEnd 6493139 -MimeContentBegin 6493139 MultipartPreambleBegin 6493139 MultipartPreambleEnd 6493139 MultipartBoundaryBegin 6493139 MultipartBoundaryEnd 6493144 MimeEntityBegin 6493144 MimeEntityHeadersEnd 6493170 -MimeContentBegin 6493170 -MimeContentEnd 6493223 Octets 53 Lines 2 -MimeEntityEnd 6493224 -MultipartBoundaryBegin 6493224 +MimeEntityEnd 6493223 +MultipartBoundaryBegin 6493223 MultipartBoundaryEnd 6493229 MimeEntityBegin 6493229 MimeEntityHeadersEnd 6493254 -MimeContentBegin 6493254 -MimeContentEnd 6493304 Octets 50 Lines 2 -MimeEntityEnd 6493305 -MultipartBoundaryBegin 6493305 +MimeEntityEnd 6493304 +MultipartBoundaryBegin 6493304 MultipartBoundaryEnd 6493310 MimeEntityBegin 6493310 MimeEntityHeadersEnd 6493337 -MimeContentBegin 6493337 -MimeContentEnd 6493391 Octets 54 Lines 2 -MimeEntityEnd 6493392 -MultipartEndBoundaryBegin 6493392 +MimeEntityEnd 6493391 +MultipartEndBoundaryBegin 6493391 MultipartEndBoundaryEnd 6493398 MultipartEpilogueBegin 6493398 MultipartEpilogueEnd 6493399 -MimeContentEnd 6493400 -Octets 261 +Octets 260 Lines 17 -MimeEntityEnd 6493400 -MultipartBoundaryBegin 6493400 +MimeEntityEnd 6493399 +MultipartBoundaryBegin 6493399 MultipartBoundaryEnd 6493405 MimeEntityBegin 6493405 MimeEntityHeadersEnd 6493497 -MimeContentBegin 6493497 -MimeContentEnd 6493512 Octets 15 Lines 2 -MimeEntityEnd 6493513 -MultipartEndBoundaryBegin 6493513 +MimeEntityEnd 6493512 +MultipartEndBoundaryBegin 6493512 MultipartEndBoundaryEnd 6493519 MultipartEpilogueBegin 6493519 MultipartEpilogueEnd 6493519 -MimeContentEnd 6493520 -Octets 521 +Octets 520 Lines 32 -MimeEntityEnd 6493520 -MultipartBoundaryBegin 6493520 +MimeEntityEnd 6493519 +MultipartBoundaryBegin 6493519 MultipartBoundaryEnd 6493540 MimeEntityBegin 6493540 MimeEntityHeadersEnd 6493541 -MimeContentBegin 6493541 -MimeContentEnd 6493550 Octets 9 Lines 2 -MimeEntityEnd 6493551 -MultipartEndBoundaryBegin 6493551 +MimeEntityEnd 6493550 +MultipartEndBoundaryBegin 6493550 MultipartEndBoundaryEnd 6493572 MultipartEpilogueBegin 6493572 MultipartEpilogueEnd 6493572 -MimeContentEnd 6493573 -Octets 2767 +Octets 2766 Lines 113 -MimeEntityEnd 6493573 -MimeMessageEnd 6493573 +MimeEntityEnd 6493572 +MimeMessageEnd 6493572 MboxMarkerBegin 6493573 MboxMarkerEnd 6493604 MimeMessageBegin 6493605 MimeMessageHeadersEnd 6494009 MimeEntityBegin 6493605 MimeEntityHeadersEnd 6494009 -MimeContentBegin 6494009 MultipartPreambleBegin 6494009 MultipartPreambleEnd 6494055 MultipartBoundaryBegin 6494055 MultipartBoundaryEnd 6494075 MimeEntityBegin 6494075 MimeEntityHeadersEnd 6494076 -MimeContentBegin 6494076 -MimeContentEnd 6494143 Octets 67 Lines 2 -MimeEntityEnd 6494144 -MultipartBoundaryBegin 6494144 +MimeEntityEnd 6494143 +MultipartBoundaryBegin 6494143 MultipartBoundaryEnd 6494164 MimeEntityBegin 6494164 MimeEntityHeadersEnd 6494238 -MimeContentBegin 6494238 MultipartPreambleBegin 6494238 MultipartPreambleEnd 6494238 MultipartBoundaryBegin 6494238 MultipartBoundaryEnd 6494265 MimeEntityBegin 6494265 MimeEntityHeadersEnd 6494421 -MimeContentBegin 6494421 -MimeContentEnd 6549684 Octets 55263 Lines 1604 -MimeEntityEnd 6549685 -MultipartBoundaryBegin 6549685 +MimeEntityEnd 6549684 +MultipartBoundaryBegin 6549684 MultipartBoundaryEnd 6549712 MimeEntityBegin 6549712 MimeEntityHeadersEnd 6549867 -MimeContentBegin 6549867 -MimeContentEnd 6655916 Octets 106049 Lines 2983 -MimeEntityEnd 6655917 -MultipartBoundaryBegin 6655917 +MimeEntityEnd 6655916 +MultipartBoundaryBegin 6655916 MultipartBoundaryEnd 6655944 MimeEntityBegin 6655944 MimeEntityHeadersEnd 6656090 -MimeContentBegin 6656090 -MimeContentEnd 6844449 Octets 188359 Lines 13110 -MimeEntityEnd 6844450 -MultipartEndBoundaryBegin 6844450 +MimeEntityEnd 6844449 +MultipartEndBoundaryBegin 6844449 MultipartEndBoundaryEnd 6844478 MultipartEpilogueBegin 6844478 MultipartEpilogueEnd 6844479 -MimeContentEnd 6844480 -Octets 350242 +Octets 350241 Lines 17714 -MimeEntityEnd 6844480 -MultipartEndBoundaryBegin 6844480 +MimeEntityEnd 6844479 +MultipartEndBoundaryBegin 6844479 MultipartEndBoundaryEnd 6844501 MultipartEpilogueBegin 6844501 MultipartEpilogueEnd 6844507 -MimeContentEnd 6844508 -Octets 350499 +Octets 350498 Lines 17726 -MimeEntityEnd 6844508 -MimeMessageEnd 6844508 +MimeEntityEnd 6844507 +MimeMessageEnd 6844507 MboxMarkerBegin 6844508 MboxMarkerEnd 6844515 MimeMessageBegin 6844516 MimeMessageHeadersEnd 6845120 MimeEntityBegin 6844516 MimeEntityHeadersEnd 6845120 -MimeContentBegin 6845120 MultipartPreambleBegin 6845120 MultipartPreambleEnd 6845336 MultipartBoundaryBegin 6845336 MultipartBoundaryEnd 6845376 MimeEntityBegin 6845376 MimeEntityHeadersEnd 6845488 -MimeContentBegin 6845488 -MimeContentEnd 6845488 Octets 0 Lines 1 -MimeEntityEnd 6845489 -MultipartBoundaryBegin 6845489 +MimeEntityEnd 6845488 +MultipartBoundaryBegin 6845488 MultipartBoundaryEnd 6845529 MimeEntityBegin 6845529 MimeEntityHeadersEnd 6845627 -MimeContentBegin 6845627 MimeMessageBegin 6845627 -MimeMessageHeadersEnd 6846168 MimeEntityBegin 6845627 MimeEntityHeadersEnd 6846168 -MimeContentBegin 6846168 -MimeContentEnd 6846514 +MimeMessageHeadersEnd 6846168 Octets 346 Lines 17 -MimeEntityEnd 6846515 -MimeMessageEnd 6846515 -MimeContentEnd 6846515 -Octets 888 +MimeEntityEnd 6846514 +MimeMessageEnd 6846514 +Octets 887 Lines 29 -MimeEntityEnd 6846515 -MultipartEndBoundaryBegin 6846515 +MimeEntityEnd 6846514 +MultipartEndBoundaryBegin 6846514 MultipartEndBoundaryEnd 6846556 MultipartEpilogueBegin 6846556 MultipartEpilogueEnd 6846556 -MimeContentEnd 6846557 -Octets 1437 +Octets 1436 Lines 43 -MimeEntityEnd 6846557 -MimeMessageEnd 6846557 +MimeEntityEnd 6846556 +MimeMessageEnd 6846556 MboxMarkerBegin 6846557 MboxMarkerEnd 6846564 MimeMessageBegin 6846565 MimeMessageHeadersEnd 6846861 MimeEntityBegin 6846565 MimeEntityHeadersEnd 6846861 -MimeContentBegin 6846861 MultipartPreambleBegin 6846861 MultipartPreambleEnd 6846861 MultipartBoundaryBegin 6846861 MultipartBoundaryEnd 6846900 MimeEntityBegin 6846900 MimeEntityHeadersEnd 6847146 -MimeContentBegin 6847146 -MimeContentEnd 6847865 Octets 719 Lines 31 -MimeEntityEnd 6847866 -MultipartBoundaryBegin 6847866 +MimeEntityEnd 6847865 +MultipartBoundaryBegin 6847865 MultipartBoundaryEnd 6847905 MimeEntityBegin 6847905 MimeEntityHeadersEnd 6848225 -MimeContentBegin 6848225 -MimeContentEnd 6858948 Octets 10723 Lines 148 -MimeEntityEnd 6858949 -MultipartEndBoundaryBegin 6858949 +MimeEntityEnd 6858948 +MultipartEndBoundaryBegin 6858948 MultipartEndBoundaryEnd 6858989 MultipartEpilogueBegin 6858989 MultipartEpilogueEnd 6858989 -MimeContentEnd 6858990 -Octets 12129 +Octets 12128 Lines 197 -MimeEntityEnd 6858990 -MimeMessageEnd 6858990 +MimeEntityEnd 6858989 +MimeMessageEnd 6858989 MboxMarkerBegin 6858990 MboxMarkerEnd 6858997 MimeMessageBegin 6858998 MimeMessageHeadersEnd 6859294 MimeEntityBegin 6858998 MimeEntityHeadersEnd 6859294 -MimeContentBegin 6859294 MultipartPreambleBegin 6859294 MultipartPreambleEnd 6859294 MultipartBoundaryBegin 6859294 MultipartBoundaryEnd 6859333 MimeEntityBegin 6859333 MimeEntityHeadersEnd 6859579 -MimeContentBegin 6859579 -MimeContentEnd 6860297 Octets 718 Lines 31 -MimeEntityEnd 6860298 -MultipartBoundaryBegin 6860298 +MimeEntityEnd 6860297 +MultipartBoundaryBegin 6860297 MultipartBoundaryEnd 6860337 MimeEntityBegin 6860337 MimeEntityHeadersEnd 6860626 -MimeContentBegin 6860626 -MimeContentEnd 6871349 Octets 10723 Lines 148 -MimeEntityEnd 6871350 -MultipartEndBoundaryBegin 6871350 +MimeEntityEnd 6871349 +MultipartEndBoundaryBegin 6871349 MultipartEndBoundaryEnd 6871390 MultipartEpilogueBegin 6871390 MultipartEpilogueEnd 6871390 -MimeContentEnd 6871391 -Octets 12097 +Octets 12096 Lines 197 -MimeEntityEnd 6871391 -MimeMessageEnd 6871391 +MimeEntityEnd 6871390 +MimeMessageEnd 6871390 MboxMarkerBegin 6871391 MboxMarkerEnd 6871422 MimeMessageBegin 6871423 MimeMessageHeadersEnd 6872926 MimeEntityBegin 6871423 MimeEntityHeadersEnd 6872926 -MimeContentBegin 6872926 MultipartPreambleBegin 6872926 MultipartPreambleEnd 6872927 MultipartBoundaryBegin 6872927 MultipartBoundaryEnd 6872971 MimeEntityBegin 6872971 MimeEntityHeadersEnd 6873062 -MimeContentBegin 6873062 -MimeContentEnd 6878261 Octets 5199 Lines 112 -MimeEntityEnd 6878262 -MultipartBoundaryBegin 6878262 +MimeEntityEnd 6878261 +MultipartBoundaryBegin 6878261 MultipartBoundaryEnd 6878306 MimeEntityBegin 6878306 MimeEntityHeadersEnd 6878505 -MimeContentBegin 6878505 -MimeContentEnd 6879434 Octets 929 Lines 14 -MimeEntityEnd 6879435 -MultipartEndBoundaryBegin 6879435 +MimeEntityEnd 6879434 +MultipartEndBoundaryBegin 6879434 MultipartEndBoundaryEnd 6879480 MultipartEpilogueBegin 6879480 MultipartEpilogueEnd 6879481 -MimeContentEnd 6879482 -Octets 6556 +Octets 6555 Lines 140 -MimeEntityEnd 6879482 -MimeMessageEnd 6879482 +MimeEntityEnd 6879481 +MimeMessageEnd 6879481 MboxMarkerBegin 6879482 MboxMarkerEnd 6879513 MimeMessageBegin 6879514 MimeMessageHeadersEnd 6879961 MimeEntityBegin 6879514 MimeEntityHeadersEnd 6879961 -MimeContentBegin 6879961 MultipartPreambleBegin 6879961 MultipartPreambleEnd 6879961 MultipartBoundaryBegin 6879961 MultipartBoundaryEnd 6880000 MimeEntityBegin 6880000 MimeEntityHeadersEnd 6880026 -MimeContentBegin 6880026 -MimeContentEnd 6880273 Octets 247 Lines 7 -MimeEntityEnd 6880274 -MultipartBoundaryBegin 6880274 +MimeEntityEnd 6880273 +MultipartBoundaryBegin 6880273 MultipartBoundaryEnd 6880313 MimeEntityBegin 6880313 MimeEntityHeadersEnd 6880399 -MimeContentBegin 6880399 MultipartPreambleBegin 6880399 MultipartPreambleEnd 6880399 MultipartBoundaryBegin 6880399 MultipartBoundaryEnd 6880438 MimeEntityBegin 6880438 MimeEntityHeadersEnd 6880632 -MimeContentBegin 6880632 -MimeContentEnd 6887780 Octets 7148 Lines 180 -MimeEntityEnd 6887781 -MultipartBoundaryBegin 6887781 +MimeEntityEnd 6887780 +MultipartBoundaryBegin 6887780 MultipartBoundaryEnd 6887820 MimeEntityBegin 6887820 MimeEntityHeadersEnd 6887996 -MimeContentBegin 6887996 -MimeContentEnd 6895977 Octets 7981 Lines 110 -MimeEntityEnd 6895978 -MultipartBoundaryBegin 6895978 +MimeEntityEnd 6895977 +MultipartBoundaryBegin 6895977 MultipartBoundaryEnd 6896017 MimeEntityBegin 6896017 MimeEntityHeadersEnd 6896176 -MimeContentBegin 6896176 -MimeContentEnd 6903630 Octets 7454 Lines 103 -MimeEntityEnd 6903631 -MultipartBoundaryBegin 6903631 +MimeEntityEnd 6903630 +MultipartBoundaryBegin 6903630 MultipartBoundaryEnd 6903670 MimeEntityBegin 6903670 MimeEntityHeadersEnd 6903828 -MimeContentBegin 6903828 -MimeContentEnd 6907161 Octets 3333 Lines 46 -MimeEntityEnd 6907162 -MultipartBoundaryBegin 6907162 +MimeEntityEnd 6907161 +MultipartBoundaryBegin 6907161 MultipartBoundaryEnd 6907201 MimeEntityBegin 6907201 MimeEntityHeadersEnd 6907360 -MimeContentBegin 6907360 -MimeContentEnd 6915811 Octets 8451 Lines 116 -MimeEntityEnd 6915812 -MultipartBoundaryBegin 6915812 +MimeEntityEnd 6915811 +MultipartBoundaryBegin 6915811 MultipartBoundaryEnd 6915851 MimeEntityBegin 6915851 MimeEntityHeadersEnd 6916007 -MimeContentBegin 6916007 -MimeContentEnd 7020376 Octets 104369 Lines 1430 -MimeEntityEnd 7020377 -MultipartBoundaryBegin 7020377 +MimeEntityEnd 7020376 +MultipartBoundaryBegin 7020376 MultipartBoundaryEnd 7020416 MimeEntityBegin 7020416 MimeEntityHeadersEnd 7020575 -MimeContentBegin 7020575 -MimeContentEnd 7058936 Octets 38361 Lines 526 -MimeEntityEnd 7058937 -MultipartBoundaryBegin 7058937 +MimeEntityEnd 7058936 +MultipartBoundaryBegin 7058936 MultipartBoundaryEnd 7058976 MimeEntityBegin 7058976 MimeEntityHeadersEnd 7059140 -MimeContentBegin 7059140 -MimeContentEnd 7094455 Octets 35315 Lines 484 -MimeEntityEnd 7094456 -MultipartEndBoundaryBegin 7094456 +MimeEntityEnd 7094455 +MultipartEndBoundaryBegin 7094455 MultipartEndBoundaryEnd 7094496 MultipartEpilogueBegin 7094496 MultipartEpilogueEnd 7094496 -MimeContentEnd 7094497 -Octets 214098 +Octets 214097 Lines 3044 -MimeEntityEnd 7094497 -MultipartEndBoundaryBegin 7094497 +MimeEntityEnd 7094496 +MultipartEndBoundaryBegin 7094496 MultipartEndBoundaryEnd 7094537 MultipartEpilogueBegin 7094537 MultipartEpilogueEnd 7094537 -MimeContentEnd 7094538 -Octets 214577 +Octets 214576 Lines 3059 -MimeEntityEnd 7094538 -MimeMessageEnd 7094538 +MimeEntityEnd 7094537 +MimeMessageEnd 7094537 MboxMarkerBegin 7094538 MboxMarkerEnd 7094545 MimeMessageBegin 7094546 MimeMessageHeadersEnd 7094841 MimeEntityBegin 7094546 MimeEntityHeadersEnd 7094841 -MimeContentBegin 7094841 MultipartPreambleBegin 7094841 MultipartPreambleEnd 7094841 MultipartBoundaryBegin 7094841 MultipartBoundaryEnd 7094880 MimeEntityBegin 7094880 MimeEntityHeadersEnd 7095036 -MimeContentBegin 7095036 -MimeContentEnd 7095587 Octets 551 Lines 28 -MimeEntityEnd 7095588 -MultipartBoundaryBegin 7095588 +MimeEntityEnd 7095587 +MultipartBoundaryBegin 7095587 MultipartBoundaryEnd 7095627 MimeEntityBegin 7095627 MimeEntityHeadersEnd 7095740 -MimeContentBegin 7095740 -MimeContentEnd 7106463 Octets 10723 Lines 148 -MimeEntityEnd 7106464 -MultipartEndBoundaryBegin 7106464 +MimeEntityEnd 7106463 +MultipartEndBoundaryBegin 7106463 MultipartEndBoundaryEnd 7106504 MultipartEpilogueBegin 7106504 MultipartEpilogueEnd 7106504 -MimeContentEnd 7106505 -Octets 11664 +Octets 11663 Lines 188 -MimeEntityEnd 7106505 -MimeMessageEnd 7106505 +MimeEntityEnd 7106504 +MimeMessageEnd 7106504 MboxMarkerBegin 7106505 MboxMarkerEnd 7106512 MimeMessageBegin 7106513 MimeMessageHeadersEnd 7106808 MimeEntityBegin 7106513 MimeEntityHeadersEnd 7106808 -MimeContentBegin 7106808 MultipartPreambleBegin 7106808 MultipartPreambleEnd 7106808 MultipartBoundaryBegin 7106808 MultipartBoundaryEnd 7106847 MimeEntityBegin 7106847 MimeEntityHeadersEnd 7107059 -MimeContentBegin 7107059 -MimeContentEnd 7107656 Octets 597 Lines 29 -MimeEntityEnd 7107657 -MultipartBoundaryBegin 7107657 +MimeEntityEnd 7107656 +MultipartBoundaryBegin 7107656 MultipartBoundaryEnd 7107696 MimeEntityBegin 7107696 MimeEntityHeadersEnd 7107970 -MimeContentBegin 7107970 -MimeContentEnd 7118693 Octets 10723 Lines 148 -MimeEntityEnd 7118694 -MultipartEndBoundaryBegin 7118694 +MimeEntityEnd 7118693 +MultipartEndBoundaryBegin 7118693 MultipartEndBoundaryEnd 7118734 MultipartEpilogueBegin 7118734 MultipartEpilogueEnd 7118734 -MimeContentEnd 7118735 -Octets 11927 +Octets 11926 Lines 193 -MimeEntityEnd 7118735 -MimeMessageEnd 7118735 +MimeEntityEnd 7118734 +MimeMessageEnd 7118734 MboxMarkerBegin 7118735 MboxMarkerEnd 7118742 MimeMessageBegin 7118743 MimeMessageHeadersEnd 7119038 MimeEntityBegin 7118743 MimeEntityHeadersEnd 7119038 -MimeContentBegin 7119038 MultipartPreambleBegin 7119038 MultipartPreambleEnd 7119038 MultipartBoundaryBegin 7119038 MultipartBoundaryEnd 7119077 MimeEntityBegin 7119077 MimeEntityHeadersEnd 7119293 -MimeContentBegin 7119293 -MimeContentEnd 7119894 Octets 601 Lines 29 -MimeEntityEnd 7119895 -MultipartBoundaryBegin 7119895 +MimeEntityEnd 7119894 +MultipartBoundaryBegin 7119894 MultipartBoundaryEnd 7119934 MimeEntityBegin 7119934 MimeEntityHeadersEnd 7120109 -MimeContentBegin 7120109 -MimeContentEnd 7130832 Octets 10723 Lines 148 -MimeEntityEnd 7130833 -MultipartEndBoundaryBegin 7130833 +MimeEntityEnd 7130832 +MultipartEndBoundaryBegin 7130832 MultipartEndBoundaryEnd 7130873 MultipartEpilogueBegin 7130873 MultipartEpilogueEnd 7130873 -MimeContentEnd 7130874 -Octets 11836 +Octets 11835 Lines 191 -MimeEntityEnd 7130874 -MimeMessageEnd 7130874 +MimeEntityEnd 7130873 +MimeMessageEnd 7130873 MboxMarkerBegin 7130874 MboxMarkerEnd 7130881 MimeMessageBegin 7130882 MimeMessageHeadersEnd 7131177 MimeEntityBegin 7130882 MimeEntityHeadersEnd 7131177 -MimeContentBegin 7131177 MultipartPreambleBegin 7131177 MultipartPreambleEnd 7131177 MultipartBoundaryBegin 7131177 MultipartBoundaryEnd 7131216 MimeEntityBegin 7131216 MimeEntityHeadersEnd 7131461 -MimeContentBegin 7131461 -MimeContentEnd 7132092 Octets 631 Lines 30 -MimeEntityEnd 7132093 -MultipartBoundaryBegin 7132093 +MimeEntityEnd 7132092 +MultipartBoundaryBegin 7132092 MultipartBoundaryEnd 7132132 MimeEntityBegin 7132132 MimeEntityHeadersEnd 7132437 -MimeContentBegin 7132437 -MimeContentEnd 7143160 Octets 10723 Lines 148 -MimeEntityEnd 7143161 -MultipartEndBoundaryBegin 7143161 +MimeEntityEnd 7143160 +MultipartEndBoundaryBegin 7143160 MultipartEndBoundaryEnd 7143201 MultipartEpilogueBegin 7143201 MultipartEpilogueEnd 7143201 -MimeContentEnd 7143202 -Octets 12025 +Octets 12024 Lines 196 -MimeEntityEnd 7143202 -MimeMessageEnd 7143202 +MimeEntityEnd 7143201 +MimeMessageEnd 7143201 MboxMarkerBegin 7143202 MboxMarkerEnd 7143209 MimeMessageBegin 7143210 MimeMessageHeadersEnd 7143505 MimeEntityBegin 7143210 MimeEntityHeadersEnd 7143505 -MimeContentBegin 7143505 MultipartPreambleBegin 7143505 MultipartPreambleEnd 7143505 MultipartBoundaryBegin 7143505 MultipartBoundaryEnd 7143544 MimeEntityBegin 7143544 MimeEntityHeadersEnd 7143760 -MimeContentBegin 7143760 -MimeContentEnd 7144405 Octets 645 Lines 29 -MimeEntityEnd 7144406 -MultipartBoundaryBegin 7144406 +MimeEntityEnd 7144405 +MultipartBoundaryBegin 7144405 MultipartBoundaryEnd 7144445 MimeEntityBegin 7144445 MimeEntityHeadersEnd 7144620 -MimeContentBegin 7144620 -MimeContentEnd 7155343 Octets 10723 Lines 148 -MimeEntityEnd 7155344 -MultipartEndBoundaryBegin 7155344 +MimeEntityEnd 7155343 +MultipartEndBoundaryBegin 7155343 MultipartEndBoundaryEnd 7155384 MultipartEpilogueBegin 7155384 MultipartEpilogueEnd 7155384 -MimeContentEnd 7155385 -Octets 11880 +Octets 11879 Lines 191 -MimeEntityEnd 7155385 -MimeMessageEnd 7155385 +MimeEntityEnd 7155384 +MimeMessageEnd 7155384 MboxMarkerBegin 7155385 MboxMarkerEnd 7155392 MimeMessageBegin 7155393 MimeMessageHeadersEnd 7155688 MimeEntityBegin 7155393 MimeEntityHeadersEnd 7155688 -MimeContentBegin 7155688 MultipartPreambleBegin 7155688 MultipartPreambleEnd 7155688 MultipartBoundaryBegin 7155688 MultipartBoundaryEnd 7155727 MimeEntityBegin 7155727 MimeEntityHeadersEnd 7155972 -MimeContentBegin 7155972 -MimeContentEnd 7156642 Octets 670 Lines 30 -MimeEntityEnd 7156643 -MultipartBoundaryBegin 7156643 +MimeEntityEnd 7156642 +MultipartBoundaryBegin 7156642 MultipartBoundaryEnd 7156682 MimeEntityBegin 7156682 MimeEntityHeadersEnd 7157018 -MimeContentBegin 7157018 -MimeContentEnd 7167741 Octets 10723 Lines 148 -MimeEntityEnd 7167742 -MultipartEndBoundaryBegin 7167742 +MimeEntityEnd 7167741 +MultipartEndBoundaryBegin 7167741 MultipartEndBoundaryEnd 7167782 MultipartEpilogueBegin 7167782 MultipartEpilogueEnd 7167782 -MimeContentEnd 7167783 -Octets 12095 +Octets 12094 Lines 196 -MimeEntityEnd 7167783 -MimeMessageEnd 7167783 +MimeEntityEnd 7167782 +MimeMessageEnd 7167782 MboxMarkerBegin 7167783 MboxMarkerEnd 7167814 MimeMessageBegin 7167815 MimeMessageHeadersEnd 7169049 MimeEntityBegin 7167815 MimeEntityHeadersEnd 7169049 -MimeContentBegin 7169049 MultipartPreambleBegin 7169049 MultipartPreambleEnd 7169095 MultipartBoundaryBegin 7169095 MultipartBoundaryEnd 7169133 MimeEntityBegin 7169133 MimeEntityHeadersEnd 7169209 -MimeContentBegin 7169209 -MimeContentEnd 7169236 Octets 27 Lines 4 -MimeEntityEnd 7169237 -MultipartBoundaryBegin 7169237 +MimeEntityEnd 7169236 +MultipartBoundaryBegin 7169236 MultipartBoundaryEnd 7169275 MimeEntityBegin 7169275 MimeEntityHeadersEnd 7169365 -MimeContentBegin 7169365 MimeMessageBegin 7169365 -MimeMessageHeadersEnd 7170186 MimeEntityBegin 7169365 MimeEntityHeadersEnd 7170186 -MimeContentBegin 7170186 +MimeMessageHeadersEnd 7170186 MultipartPreambleBegin 7170186 MultipartPreambleEnd 7170187 MultipartBoundaryBegin 7170187 MultipartBoundaryEnd 7170226 MimeEntityBegin 7170226 MimeEntityHeadersEnd 7170302 -MimeContentBegin 7170302 -MimeContentEnd 7170929 Octets 627 Lines 17 -MimeEntityEnd 7170930 -MultipartBoundaryBegin 7170930 +MimeEntityEnd 7170929 +MultipartBoundaryBegin 7170929 MultipartBoundaryEnd 7170969 MimeEntityBegin 7170969 MimeEntityHeadersEnd 7171051 -MimeContentBegin 7171051 MultipartPreambleBegin 7171051 MultipartPreambleEnd 7171052 MultipartBoundaryBegin 7171052 MultipartBoundaryEnd 7171091 MimeEntityBegin 7171091 MimeEntityHeadersEnd 7171166 -MimeContentBegin 7171166 -MimeContentEnd 7172016 Octets 850 Lines 19 -MimeEntityEnd 7172017 -MultipartBoundaryBegin 7172017 +MimeEntityEnd 7172016 +MultipartBoundaryBegin 7172016 MultipartBoundaryEnd 7172056 MimeEntityBegin 7172056 MimeEntityHeadersEnd 7172240 -MimeContentBegin 7172240 -MimeContentEnd 7916207 Octets 743967 Lines 10192 -MimeEntityEnd 7916208 -MultipartEndBoundaryBegin 7916208 +MimeEntityEnd 7916207 +MultipartEndBoundaryBegin 7916207 MultipartEndBoundaryEnd 7916248 MultipartEpilogueBegin 7916248 MultipartEpilogueEnd 7916249 -MimeContentEnd 7916250 -Octets 745199 +Octets 745198 Lines 10224 -MimeEntityEnd 7916250 -MultipartEndBoundaryBegin 7916250 +MimeEntityEnd 7916249 +MultipartEndBoundaryBegin 7916249 MultipartEndBoundaryEnd 7916290 MultipartEpilogueBegin 7916290 MultipartEpilogueEnd 7916293 -MimeContentEnd 7916294 -Octets 746108 +Octets 746107 Lines 10253 -MimeEntityEnd 7916294 -MimeMessageEnd 7916294 -MimeContentEnd 7916294 -Octets 746929 +MimeEntityEnd 7916293 +MimeMessageEnd 7916293 +Octets 746928 Lines 10269 -MimeEntityEnd 7916294 -MultipartEndBoundaryBegin 7916294 +MimeEntityEnd 7916293 +MultipartEndBoundaryBegin 7916293 MultipartEndBoundaryEnd 7916333 MultipartEpilogueBegin 7916333 MultipartEpilogueEnd 7916334 -MimeContentEnd 7916335 -Octets 747286 +Octets 747285 Lines 10286 -MimeEntityEnd 7916335 -MimeMessageEnd 7916335 +MimeEntityEnd 7916334 +MimeMessageEnd 7916334 MboxMarkerBegin 7916335 MboxMarkerEnd 7916366 MimeMessageBegin 7916367 MimeMessageHeadersEnd 7917631 MimeEntityBegin 7916367 MimeEntityHeadersEnd 7917631 -MimeContentBegin 7917631 MultipartPreambleBegin 7917631 MultipartPreambleEnd 7917632 MultipartBoundaryBegin 7917632 MultipartBoundaryEnd 7917676 MimeEntityBegin 7917676 MimeEntityHeadersEnd 7917767 -MimeContentBegin 7917767 -MimeContentEnd 7920149 Octets 2382 Lines 51 -MimeEntityEnd 7920150 -MultipartBoundaryBegin 7920150 +MimeEntityEnd 7920149 +MultipartBoundaryBegin 7920149 MultipartBoundaryEnd 7920194 MimeEntityBegin 7920194 MimeEntityHeadersEnd 7920353 -MimeContentBegin 7920353 -MimeContentEnd 7926376 Octets 6023 Lines 80 -MimeEntityEnd 7926377 -MultipartBoundaryBegin 7926377 +MimeEntityEnd 7926376 +MultipartBoundaryBegin 7926376 MultipartBoundaryEnd 7926421 MimeEntityBegin 7926421 MimeEntityHeadersEnd 7926579 -MimeContentBegin 7926579 -MimeContentEnd 7938652 Octets 12073 Lines 158 -MimeEntityEnd 7938653 -MultipartBoundaryBegin 7938653 +MimeEntityEnd 7938652 +MultipartBoundaryBegin 7938652 MultipartBoundaryEnd 7938697 MimeEntityBegin 7938697 MimeEntityHeadersEnd 7938857 -MimeContentBegin 7938857 -MimeContentEnd 7960571 Octets 21714 Lines 283 -MimeEntityEnd 7960572 -MultipartBoundaryBegin 7960572 +MimeEntityEnd 7960571 +MultipartBoundaryBegin 7960571 MultipartBoundaryEnd 7960616 MimeEntityBegin 7960616 MimeEntityHeadersEnd 7960819 -MimeContentBegin 7960819 -MimeContentEnd 7964212 Octets 3393 Lines 46 -MimeEntityEnd 7964213 -MultipartEndBoundaryBegin 7964213 +MimeEntityEnd 7964212 +MultipartEndBoundaryBegin 7964212 MultipartEndBoundaryEnd 7964258 MultipartEpilogueBegin 7964258 MultipartEpilogueEnd 7964259 -MimeContentEnd 7964260 -Octets 46629 +Octets 46628 Lines 650 -MimeEntityEnd 7964260 -MimeMessageEnd 7964260 +MimeEntityEnd 7964259 +MimeMessageEnd 7964259 MboxMarkerBegin 7964260 MboxMarkerEnd 7964267 MimeMessageBegin 7964268 MimeMessageHeadersEnd 7965009 MimeEntityBegin 7964268 MimeEntityHeadersEnd 7965009 -MimeContentBegin 7965009 -MimeContentEnd 8509625 Octets 544616 Lines 7475 -MimeEntityEnd 8509626 -MimeMessageEnd 8509626 +MimeEntityEnd 8509625 +MimeMessageEnd 8509625 MboxMarkerBegin 8509626 MboxMarkerEnd 8509633 MimeMessageBegin 8509634 MimeMessageHeadersEnd 8510545 MimeEntityBegin 8509634 MimeEntityHeadersEnd 8510545 -MimeContentBegin 8510545 MultipartPreambleBegin 8510545 MultipartPreambleEnd 8510546 MultipartBoundaryBegin 8510546 MultipartBoundaryEnd 8510554 MimeEntityBegin 8510554 MimeEntityHeadersEnd 8510583 -MimeContentBegin 8510583 -MimeContentEnd 8513113 Octets 2530 Lines 97 -MimeEntityEnd 8513114 -MultipartEndBoundaryBegin 8513114 +MimeEntityEnd 8513113 +MultipartEndBoundaryBegin 8513113 MultipartEndBoundaryEnd 8513123 MultipartEpilogueBegin 8513123 MultipartEpilogueEnd 8513124 -MimeContentEnd 8513125 -Octets 2580 +Octets 2579 Lines 103 -MimeEntityEnd 8513125 -MimeMessageEnd 8513125 +MimeEntityEnd 8513124 +MimeMessageEnd 8513124 MboxMarkerBegin 8513125 MboxMarkerEnd 8513156 MimeMessageBegin 8513157 MimeMessageHeadersEnd 8513751 MimeEntityBegin 8513157 MimeEntityHeadersEnd 8513751 -MimeContentBegin 8513751 MultipartPreambleBegin 8513751 MultipartPreambleEnd 8514031 MultipartBoundaryBegin 8514031 MultipartBoundaryEnd 8514048 MimeEntityBegin 8514048 MimeEntityHeadersEnd 8514093 -MimeContentBegin 8514093 -MimeContentEnd 8515175 Octets 1082 Lines 27 -MimeEntityEnd 8515176 -MultipartBoundaryBegin 8515176 +MimeEntityEnd 8515175 +MultipartBoundaryBegin 8515175 MultipartBoundaryEnd 8515193 MimeEntityBegin 8515193 MimeEntityHeadersEnd 8515234 -MimeContentBegin 8515234 -MimeContentEnd 8515518 Octets 284 Lines 10 -MimeEntityEnd 8515519 -MultipartEndBoundaryBegin 8515519 +MimeEntityEnd 8515518 +MultipartEndBoundaryBegin 8515518 MultipartEndBoundaryEnd 8515537 MultipartEpilogueBegin 8515537 MultipartEpilogueEnd 8515537 -MimeContentEnd 8515538 -Octets 1787 +Octets 1786 Lines 51 -MimeEntityEnd 8515538 -MimeMessageEnd 8515538 +MimeEntityEnd 8515537 +MimeMessageEnd 8515537 MboxMarkerBegin 8515538 MboxMarkerEnd 8515545 MimeMessageBegin 8515546 MimeMessageHeadersEnd 8516708 MimeEntityBegin 8515546 MimeEntityHeadersEnd 8516708 -MimeContentBegin 8516708 -MimeContentEnd 8518091 Octets 1383 Lines 40 -MimeEntityEnd 8518092 -MimeMessageEnd 8518092 +MimeEntityEnd 8518091 +MimeMessageEnd 8518091 MboxMarkerBegin 8518092 MboxMarkerEnd 8518099 MimeMessageBegin 8518100 MimeMessageHeadersEnd 8518733 MimeEntityBegin 8518100 MimeEntityHeadersEnd 8518733 -MimeContentBegin 8518733 -MimeContentEnd 8519707 Octets 974 Lines 28 -MimeEntityEnd 8519708 -MimeMessageEnd 8519708 +MimeEntityEnd 8519707 +MimeMessageEnd 8519707 MboxMarkerBegin 8519708 MboxMarkerEnd 8519715 MimeMessageBegin 8519716 MimeMessageHeadersEnd 8520478 MimeEntityBegin 8519716 MimeEntityHeadersEnd 8520478 -MimeContentBegin 8520478 MultipartPreambleBegin 8520478 MultipartPreambleEnd 8520633 MultipartBoundaryBegin 8520633 MultipartBoundaryEnd 8520673 MimeEntityBegin 8520673 MimeEntityHeadersEnd 8520717 -MimeContentBegin 8520717 -MimeContentEnd 8521534 Octets 817 Lines 16 -MimeEntityEnd 8521535 -MultipartBoundaryBegin 8521535 +MimeEntityEnd 8521534 +MultipartBoundaryBegin 8521534 MultipartBoundaryEnd 8521575 MimeEntityBegin 8521575 MimeEntityHeadersEnd 8521660 -MimeContentBegin 8521660 MultipartPreambleBegin 8521660 MultipartPreambleEnd 8521660 MultipartBoundaryBegin 8521660 MultipartBoundaryEnd 8521702 MimeEntityBegin 8521702 MimeEntityHeadersEnd 8521793 -MimeContentBegin 8521793 -MimeContentEnd 8522284 Octets 491 Lines 11 -MimeEntityEnd 8522285 -MultipartBoundaryBegin 8522285 +MimeEntityEnd 8522284 +MultipartBoundaryBegin 8522284 MultipartBoundaryEnd 8522327 MimeEntityBegin 8522327 MimeEntityHeadersEnd 8522513 -MimeContentBegin 8522513 MimeMessageBegin 8522513 -MimeMessageHeadersEnd 8522540 MimeEntityBegin 8522513 MimeEntityHeadersEnd 8522540 -MimeContentBegin 8522540 -MimeContentEnd 8522542 +MimeMessageHeadersEnd 8522540 Octets 2 Lines 3 -MimeEntityEnd 8522543 -MimeMessageEnd 8522543 -MimeContentEnd 8522543 -Octets 30 +MimeEntityEnd 8522542 +MimeMessageEnd 8522542 +Octets 29 Lines 5 -MimeEntityEnd 8522543 -MultipartBoundaryBegin 8522543 +MimeEntityEnd 8522542 +MultipartBoundaryBegin 8522542 MultipartBoundaryEnd 8522585 MimeEntityBegin 8522585 MimeEntityHeadersEnd 8522673 -MimeContentBegin 8522673 -MimeContentEnd 8522676 Octets 3 Lines 3 -MimeEntityEnd 8522677 -MultipartBoundaryBegin 8522677 +MimeEntityEnd 8522676 +MultipartBoundaryBegin 8522676 MultipartBoundaryEnd 8522719 MimeEntityBegin 8522719 MimeEntityHeadersEnd 8522920 -MimeContentBegin 8522920 MimeMessageBegin 8522920 -MimeMessageHeadersEnd 8522945 MimeEntityBegin 8522920 MimeEntityHeadersEnd 8522945 -MimeContentBegin 8522945 -MimeContentEnd 8522947 +MimeMessageHeadersEnd 8522945 Octets 2 Lines 3 -MimeEntityEnd 8522948 -MimeMessageEnd 8522948 -MimeContentEnd 8522948 -Octets 28 +MimeEntityEnd 8522947 +MimeMessageEnd 8522947 +Octets 27 Lines 5 -MimeEntityEnd 8522948 -MultipartBoundaryBegin 8522948 +MimeEntityEnd 8522947 +MultipartBoundaryBegin 8522947 MultipartBoundaryEnd 8522990 MimeEntityBegin 8522990 MimeEntityHeadersEnd 8523081 -MimeContentBegin 8523081 -MimeContentEnd 8523303 Octets 222 Lines 8 -MimeEntityEnd 8523304 -MultipartEndBoundaryBegin 8523304 +MimeEntityEnd 8523303 +MultipartEndBoundaryBegin 8523303 MultipartEndBoundaryEnd 8523347 MultipartEpilogueBegin 8523347 MultipartEpilogueEnd 8523348 -MimeContentEnd 8523349 -Octets 1689 +Octets 1688 Lines 62 -MimeEntityEnd 8523349 -MultipartEndBoundaryBegin 8523349 +MimeEntityEnd 8523348 +MultipartEndBoundaryBegin 8523348 MultipartEndBoundaryEnd 8523390 MultipartEpilogueBegin 8523390 MultipartEpilogueEnd 8523391 -MimeContentEnd 8523392 -Octets 2914 +Octets 2913 Lines 90 -MimeEntityEnd 8523392 -MimeMessageEnd 8523392 +MimeEntityEnd 8523391 +MimeMessageEnd 8523391 MboxMarkerBegin 8523392 MboxMarkerEnd 8523399 MimeMessageBegin 8523400 MimeMessageHeadersEnd 8524214 MimeEntityBegin 8523400 MimeEntityHeadersEnd 8524214 -MimeContentBegin 8524214 -MimeContentEnd 8525600 Octets 1386 Lines 43 -MimeEntityEnd 8525601 -MimeMessageEnd 8525601 +MimeEntityEnd 8525600 +MimeMessageEnd 8525600 MboxMarkerBegin 8525601 MboxMarkerEnd 8525608 MimeMessageBegin 8525609 MimeMessageHeadersEnd 8525761 MimeEntityBegin 8525609 MimeEntityHeadersEnd 8525761 -MimeContentBegin 8525761 -MimeContentEnd 8530432 Octets 4671 Lines 64 -MimeEntityEnd 8530433 -MimeMessageEnd 8530433 +MimeEntityEnd 8530432 +MimeMessageEnd 8530432 MboxMarkerBegin 8530433 MboxMarkerEnd 8530440 MimeMessageBegin 8530441 MimeMessageHeadersEnd 8532184 MimeEntityBegin 8530441 MimeEntityHeadersEnd 8532184 -MimeContentBegin 8532184 MultipartPreambleBegin 8532184 MultipartPreambleEnd 8532339 MultipartBoundaryBegin 8532339 MultipartBoundaryEnd 8532379 MimeEntityBegin 8532379 MimeEntityHeadersEnd 8532423 -MimeContentBegin 8532423 -MimeContentEnd 8534090 Octets 1667 Lines 39 -MimeEntityEnd 8534091 -MultipartBoundaryBegin 8534091 +MimeEntityEnd 8534090 +MultipartBoundaryBegin 8534090 MultipartBoundaryEnd 8534131 MimeEntityBegin 8534131 MimeEntityHeadersEnd 8534216 -MimeContentBegin 8534216 MultipartPreambleBegin 8534216 MultipartPreambleEnd 8534216 MultipartBoundaryBegin 8534216 MultipartBoundaryEnd 8534258 MimeEntityBegin 8534258 MimeEntityHeadersEnd 8534349 -MimeContentBegin 8534349 -MimeContentEnd 8534906 Octets 557 Lines 15 -MimeEntityEnd 8534907 -MultipartBoundaryBegin 8534907 +MimeEntityEnd 8534906 +MultipartBoundaryBegin 8534906 MultipartBoundaryEnd 8534949 MimeEntityBegin 8534949 MimeEntityHeadersEnd 8535010 -MimeContentBegin 8535010 -MimeContentEnd 8535882 Octets 872 Lines 13 -MimeEntityEnd 8535883 -MultipartBoundaryBegin 8535883 +MimeEntityEnd 8535882 +MultipartBoundaryBegin 8535882 MultipartBoundaryEnd 8535925 MimeEntityBegin 8535925 MimeEntityHeadersEnd 8536016 -MimeContentBegin 8536016 -MimeContentEnd 8536062 Octets 46 Lines 6 -MimeEntityEnd 8536063 -MultipartBoundaryBegin 8536063 +MimeEntityEnd 8536062 +MultipartBoundaryBegin 8536062 MultipartBoundaryEnd 8536105 MimeEntityBegin 8536105 MimeEntityHeadersEnd 8536166 -MimeContentBegin 8536166 -MimeContentEnd 8537038 Octets 872 Lines 13 -MimeEntityEnd 8537039 -MultipartBoundaryBegin 8537039 +MimeEntityEnd 8537038 +MultipartBoundaryBegin 8537038 MultipartBoundaryEnd 8537081 MimeEntityBegin 8537081 MimeEntityHeadersEnd 8537172 -MimeContentBegin 8537172 -MimeContentEnd 8537218 Octets 46 Lines 6 -MimeEntityEnd 8537219 -MultipartBoundaryBegin 8537219 +MimeEntityEnd 8537218 +MultipartBoundaryBegin 8537218 MultipartBoundaryEnd 8537261 MimeEntityBegin 8537261 MimeEntityHeadersEnd 8537322 -MimeContentBegin 8537322 -MimeContentEnd 8538194 Octets 872 Lines 13 -MimeEntityEnd 8538195 -MultipartBoundaryBegin 8538195 +MimeEntityEnd 8538194 +MultipartBoundaryBegin 8538194 MultipartBoundaryEnd 8538237 MimeEntityBegin 8538237 MimeEntityHeadersEnd 8538328 -MimeContentBegin 8538328 -MimeContentEnd 8538368 Octets 40 Lines 6 -MimeEntityEnd 8538369 -MultipartBoundaryBegin 8538369 +MimeEntityEnd 8538368 +MultipartBoundaryBegin 8538368 MultipartBoundaryEnd 8538411 MimeEntityBegin 8538411 MimeEntityHeadersEnd 8538472 -MimeContentBegin 8538472 -MimeContentEnd 8538696 Octets 224 Lines 5 -MimeEntityEnd 8538697 -MultipartBoundaryBegin 8538697 +MimeEntityEnd 8538696 +MultipartBoundaryBegin 8538696 MultipartBoundaryEnd 8538739 MimeEntityBegin 8538739 MimeEntityHeadersEnd 8538830 -MimeContentBegin 8538830 -MimeContentEnd 8538894 Octets 64 Lines 6 -MimeEntityEnd 8538895 -MultipartBoundaryBegin 8538895 +MimeEntityEnd 8538894 +MultipartBoundaryBegin 8538894 MultipartBoundaryEnd 8538937 MimeEntityBegin 8538937 MimeEntityHeadersEnd 8538998 -MimeContentBegin 8538998 -MimeContentEnd 8539222 Octets 224 Lines 5 -MimeEntityEnd 8539223 -MultipartBoundaryBegin 8539223 +MimeEntityEnd 8539222 +MultipartBoundaryBegin 8539222 MultipartBoundaryEnd 8539265 MimeEntityBegin 8539265 MimeEntityHeadersEnd 8539356 -MimeContentBegin 8539356 -MimeContentEnd 8539400 Octets 44 Lines 6 -MimeEntityEnd 8539401 -MultipartBoundaryBegin 8539401 +MimeEntityEnd 8539400 +MultipartBoundaryBegin 8539400 MultipartBoundaryEnd 8539443 MimeEntityBegin 8539443 MimeEntityHeadersEnd 8539504 -MimeContentBegin 8539504 -MimeContentEnd 8539728 Octets 224 Lines 5 -MimeEntityEnd 8539729 -MultipartBoundaryBegin 8539729 +MimeEntityEnd 8539728 +MultipartBoundaryBegin 8539728 MultipartBoundaryEnd 8539771 MimeEntityBegin 8539771 MimeEntityHeadersEnd 8539862 -MimeContentBegin 8539862 -MimeContentEnd 8540154 Octets 292 Lines 12 -MimeEntityEnd 8540155 -MultipartBoundaryBegin 8540155 +MimeEntityEnd 8540154 +MultipartBoundaryBegin 8540154 MultipartBoundaryEnd 8540197 MimeEntityBegin 8540197 MimeEntityHeadersEnd 8540258 -MimeContentBegin 8540258 -MimeContentEnd 8541130 Octets 872 Lines 13 -MimeEntityEnd 8541131 -MultipartBoundaryBegin 8541131 +MimeEntityEnd 8541130 +MultipartBoundaryBegin 8541130 MultipartBoundaryEnd 8541173 MimeEntityBegin 8541173 MimeEntityHeadersEnd 8541264 -MimeContentBegin 8541264 -MimeContentEnd 8541304 Octets 40 Lines 5 -MimeEntityEnd 8541305 -MultipartBoundaryBegin 8541305 +MimeEntityEnd 8541304 +MultipartBoundaryBegin 8541304 MultipartBoundaryEnd 8541347 MimeEntityBegin 8541347 MimeEntityHeadersEnd 8541408 -MimeContentBegin 8541408 -MimeContentEnd 8543323 Octets 1915 Lines 28 -MimeEntityEnd 8543324 -MultipartBoundaryBegin 8543324 +MimeEntityEnd 8543323 +MultipartBoundaryBegin 8543323 MultipartBoundaryEnd 8543366 MimeEntityBegin 8543366 MimeEntityHeadersEnd 8543457 -MimeContentBegin 8543457 -MimeContentEnd 8543467 Octets 10 Lines 2 -MimeEntityEnd 8543468 -MultipartEndBoundaryBegin 8543468 +MimeEntityEnd 8543467 +MultipartEndBoundaryBegin 8543467 MultipartEndBoundaryEnd 8543511 MultipartEpilogueBegin 8543511 MultipartEpilogueEnd 8543512 -MimeContentEnd 8543513 -Octets 9297 +Octets 9296 Lines 229 -MimeEntityEnd 8543513 -MultipartEndBoundaryBegin 8543513 +MimeEntityEnd 8543512 +MultipartEndBoundaryBegin 8543512 MultipartEndBoundaryEnd 8543554 MultipartEpilogueBegin 8543554 MultipartEpilogueEnd 8543555 -MimeContentEnd 8543556 -Octets 11372 +Octets 11371 Lines 280 -MimeEntityEnd 8543556 -MimeMessageEnd 8543556 +MimeEntityEnd 8543555 +MimeMessageEnd 8543555 MboxMarkerBegin 8543556 MboxMarkerEnd 8543563 MimeMessageBegin 8543564 MimeMessageHeadersEnd 8544292 MimeEntityBegin 8543564 MimeEntityHeadersEnd 8544292 -MimeContentBegin 8544292 MultipartPreambleBegin 8544292 MultipartPreambleEnd 8544447 MultipartBoundaryBegin 8544447 MultipartBoundaryEnd 8544487 MimeEntityBegin 8544487 MimeEntityHeadersEnd 8544531 -MimeContentBegin 8544531 -MimeContentEnd 8545158 Octets 627 Lines 13 -MimeEntityEnd 8545159 -MultipartBoundaryBegin 8545159 +MimeEntityEnd 8545158 +MultipartBoundaryBegin 8545158 MultipartBoundaryEnd 8545199 MimeEntityBegin 8545199 MimeEntityHeadersEnd 8545284 -MimeContentBegin 8545284 MultipartPreambleBegin 8545284 MultipartPreambleEnd 8545284 MultipartBoundaryBegin 8545284 MultipartBoundaryEnd 8545326 MimeEntityBegin 8545326 MimeEntityHeadersEnd 8545417 -MimeContentBegin 8545417 -MimeContentEnd 8545950 Octets 533 Lines 9 -MimeEntityEnd 8545951 -MultipartBoundaryBegin 8545951 +MimeEntityEnd 8545950 +MultipartBoundaryBegin 8545950 MultipartBoundaryEnd 8545993 MimeEntityBegin 8545993 MimeEntityHeadersEnd 8546101 -MimeContentBegin 8546101 -MimeContentEnd 8554686 Octets 8585 Lines 126 -MimeEntityEnd 8554687 -MultipartBoundaryBegin 8554687 +MimeEntityEnd 8554686 +MultipartBoundaryBegin 8554686 MultipartBoundaryEnd 8554729 MimeEntityBegin 8554729 MimeEntityHeadersEnd 8554820 -MimeContentBegin 8554820 -MimeContentEnd 8554865 Octets 45 Lines 4 -MimeEntityEnd 8554866 -MultipartEndBoundaryBegin 8554866 +MimeEntityEnd 8554865 +MultipartEndBoundaryBegin 8554865 MultipartEndBoundaryEnd 8554909 MultipartEpilogueBegin 8554909 MultipartEpilogueEnd 8554910 -MimeContentEnd 8554911 -Octets 9627 +Octets 9626 Lines 154 -MimeEntityEnd 8554911 -MultipartEndBoundaryBegin 8554911 +MimeEntityEnd 8554910 +MultipartEndBoundaryBegin 8554910 MultipartEndBoundaryEnd 8554952 MultipartEpilogueBegin 8554952 MultipartEpilogueEnd 8554952 -MimeContentEnd 8554953 -Octets 10661 +Octets 10660 Lines 178 -MimeEntityEnd 8554953 -MimeMessageEnd 8554953 +MimeEntityEnd 8554952 +MimeMessageEnd 8554952 MboxMarkerBegin 8554953 MboxMarkerEnd 8554960 MimeMessageBegin 8554961 MimeMessageHeadersEnd 8555607 MimeEntityBegin 8554961 MimeEntityHeadersEnd 8555607 -MimeContentBegin 8555607 MultipartPreambleBegin 8555607 MultipartPreambleEnd 8555608 MultipartBoundaryBegin 8555608 MultipartBoundaryEnd 8555657 MimeEntityBegin 8555657 MimeEntityHeadersEnd 8555747 -MimeContentBegin 8555747 -MimeContentEnd 8555844 Octets 97 Lines 7 -MimeEntityEnd 8555845 -MultipartBoundaryBegin 8555845 +MimeEntityEnd 8555844 +MultipartBoundaryBegin 8555844 MultipartBoundaryEnd 8555894 MimeEntityBegin 8555894 MimeEntityHeadersEnd 8556021 -MimeContentBegin 8556021 -MimeContentEnd 8634463 Octets 78442 Lines 1075 -MimeEntityEnd 8634464 -MultipartEndBoundaryBegin 8634464 +MimeEntityEnd 8634463 +MultipartEndBoundaryBegin 8634463 MultipartEndBoundaryEnd 8634514 MultipartEpilogueBegin 8634514 MultipartEpilogueEnd 8634515 -MimeContentEnd 8634516 -Octets 78909 +Octets 78908 Lines 1094 -MimeEntityEnd 8634516 -MimeMessageEnd 8634516 +MimeEntityEnd 8634515 +MimeMessageEnd 8634515 MboxMarkerBegin 8634516 MboxMarkerEnd 8634523 MimeMessageBegin 8634524 MimeMessageHeadersEnd 8635280 MimeEntityBegin 8634524 MimeEntityHeadersEnd 8635280 -MimeContentBegin 8635280 MultipartPreambleBegin 8635280 MultipartPreambleEnd 8635435 MultipartBoundaryBegin 8635435 MultipartBoundaryEnd 8635475 MimeEntityBegin 8635475 MimeEntityHeadersEnd 8635519 -MimeContentBegin 8635519 -MimeContentEnd 8636869 Octets 1350 Lines 29 -MimeEntityEnd 8636870 -MultipartBoundaryBegin 8636870 +MimeEntityEnd 8636869 +MultipartBoundaryBegin 8636869 MultipartBoundaryEnd 8636910 MimeEntityBegin 8636910 MimeEntityHeadersEnd 8636995 -MimeContentBegin 8636995 MultipartPreambleBegin 8636995 MultipartPreambleEnd 8636995 MultipartBoundaryBegin 8636995 MultipartBoundaryEnd 8637037 MimeEntityBegin 8637037 MimeEntityHeadersEnd 8637128 -MimeContentBegin 8637128 -MimeContentEnd 8638267 Octets 1139 Lines 23 -MimeEntityEnd 8638268 -MultipartBoundaryBegin 8638268 +MimeEntityEnd 8638267 +MultipartBoundaryBegin 8638267 MultipartBoundaryEnd 8638310 MimeEntityBegin 8638310 MimeEntityHeadersEnd 8638408 -MimeContentBegin 8638408 -MimeContentEnd 8753651 Octets 115243 Lines 1580 -MimeEntityEnd 8753652 -MultipartBoundaryBegin 8753652 +MimeEntityEnd 8753651 +MultipartBoundaryBegin 8753651 MultipartBoundaryEnd 8753694 MimeEntityBegin 8753694 MimeEntityHeadersEnd 8753785 -MimeContentBegin 8753785 -MimeContentEnd 8753908 Octets 123 Lines 4 -MimeEntityEnd 8753909 -MultipartBoundaryBegin 8753909 +MimeEntityEnd 8753908 +MultipartBoundaryBegin 8753908 MultipartBoundaryEnd 8753951 MimeEntityBegin 8753951 MimeEntityHeadersEnd 8754050 -MimeContentBegin 8754050 -MimeContentEnd 8820331 Octets 66281 Lines 962 -MimeEntityEnd 8820332 -MultipartBoundaryBegin 8820332 +MimeEntityEnd 8820331 +MultipartBoundaryBegin 8820331 MultipartBoundaryEnd 8820374 MimeEntityBegin 8820374 MimeEntityHeadersEnd 8820462 -MimeContentBegin 8820462 -MimeContentEnd 8820462 Octets 0 Lines 1 -MimeEntityEnd 8820463 -MultipartEndBoundaryBegin 8820463 +MimeEntityEnd 8820462 +MultipartEndBoundaryBegin 8820462 MultipartEndBoundaryEnd 8820506 MultipartEpilogueBegin 8820506 MultipartEpilogueEnd 8820507 -MimeContentEnd 8820508 -Octets 183513 +Octets 183512 Lines 2594 -MimeEntityEnd 8820508 -MultipartEndBoundaryBegin 8820508 +MimeEntityEnd 8820507 +MultipartEndBoundaryBegin 8820507 MultipartEndBoundaryEnd 8820549 MultipartEpilogueBegin 8820549 MultipartEpilogueEnd 8820549 -MimeContentEnd 8820550 -Octets 185270 +Octets 185269 Lines 2634 -MimeEntityEnd 8820550 -MimeMessageEnd 8820550 +MimeEntityEnd 8820549 +MimeMessageEnd 8820549 MboxMarkerBegin 8820550 MboxMarkerEnd 8820557 MimeMessageBegin 8820558 MimeMessageHeadersEnd 8821395 MimeEntityBegin 8820558 MimeEntityHeadersEnd 8821395 -MimeContentBegin 8821395 -MimeContentEnd 8823128 Octets 1733 Lines 26 -MimeEntityEnd 8823129 -MimeMessageEnd 8823129 +MimeEntityEnd 8823128 +MimeMessageEnd 8823128 MboxMarkerBegin 8823129 MboxMarkerEnd 8823136 MimeMessageBegin 8823137 MimeMessageHeadersEnd 8823767 MimeEntityBegin 8823137 MimeEntityHeadersEnd 8823767 -MimeContentBegin 8823767 MimeMessageBegin 8823767 -MimeMessageHeadersEnd 8824250 MimeEntityBegin 8823767 MimeEntityHeadersEnd 8824250 -MimeContentBegin 8824250 -MimeContentEnd 8825125 +MimeMessageHeadersEnd 8824250 Octets 875 Lines 25 -MimeEntityEnd 8825126 -MimeMessageEnd 8825126 -MimeContentEnd 8825126 -Octets 1359 +MimeEntityEnd 8825125 +MimeMessageEnd 8825125 +Octets 1358 Lines 38 -MimeEntityEnd 8825126 -MimeMessageEnd 8825126 +MimeEntityEnd 8825125 +MimeMessageEnd 8825125 MboxMarkerBegin 8825126 MboxMarkerEnd 8825133 MimeMessageBegin 8825134 MimeMessageHeadersEnd 8825579 MimeEntityBegin 8825134 MimeEntityHeadersEnd 8825579 -MimeContentBegin 8825579 MultipartPreambleBegin 8825579 MultipartPreambleEnd 8825579 MultipartBoundaryBegin 8825579 MultipartBoundaryEnd 8825588 MimeEntityBegin 8825588 MimeEntityHeadersEnd 8825589 -MimeContentBegin 8825589 -MimeContentEnd 8825629 Octets 40 Lines 2 -MimeEntityEnd 8825630 -MultipartBoundaryBegin 8825630 +MimeEntityEnd 8825629 +MultipartBoundaryBegin 8825629 MultipartBoundaryEnd 8825639 MimeEntityBegin 8825639 MimeEntityHeadersEnd 8825700 -MimeContentBegin 8825700 -MimeContentEnd 8916949 Octets 91249 Lines 1250 -MimeEntityEnd 8916950 -MultipartEndBoundaryBegin 8916950 +MimeEntityEnd 8916949 +MultipartEndBoundaryBegin 8916949 MultipartEndBoundaryEnd 8916960 MultipartEpilogueBegin 8916960 MultipartEpilogueEnd 8916963 -MimeContentEnd 8916964 -Octets 91385 +Octets 91384 Lines 1262 -MimeEntityEnd 8916964 -MimeMessageEnd 8916964 +MimeEntityEnd 8916963 +MimeMessageEnd 8916963 MboxMarkerBegin 8916964 MboxMarkerEnd 8916971 MimeMessageBegin 8916972 MimeMessageHeadersEnd 8917462 MimeEntityBegin 8916972 MimeEntityHeadersEnd 8917462 -MimeContentBegin 8917462 -MimeContentEnd 8918604 Octets 1142 Lines 28 -MimeEntityEnd 8918605 -MimeMessageEnd 8918605 +MimeEntityEnd 8918604 +MimeMessageEnd 8918604 MboxMarkerBegin 8918605 MboxMarkerEnd 8918612 MimeMessageBegin 8918613 MimeMessageHeadersEnd 8919753 MimeEntityBegin 8918613 MimeEntityHeadersEnd 8919753 -MimeContentBegin 8919753 MultipartPreambleBegin 8919753 MultipartPreambleEnd 8919753 MultipartBoundaryBegin 8919753 MultipartBoundaryEnd 8919758 MimeEntityBegin 8919758 MimeEntityHeadersEnd 8919759 -MimeContentBegin 8919759 -MimeContentEnd 8920299 Octets 540 Lines 13 -MimeEntityEnd 8920300 -MultipartBoundaryBegin 8920300 +MimeEntityEnd 8920299 +MultipartBoundaryBegin 8920299 MultipartBoundaryEnd 8920305 MimeEntityBegin 8920305 MimeEntityHeadersEnd 8920421 -MimeContentBegin 8920421 -MimeContentEnd 8978062 Octets 57641 Lines 790 -MimeEntityEnd 8978063 -MultipartBoundaryBegin 8978063 +MimeEntityEnd 8978062 +MultipartBoundaryBegin 8978062 MultipartBoundaryEnd 8978068 MimeEntityBegin 8978068 MimeEntityHeadersEnd 8978069 -MimeContentBegin 8978069 -MimeContentEnd 8981852 Octets 3783 Lines 84 -MimeEntityEnd 8981853 -MultipartBoundaryBegin 8981853 +MimeEntityEnd 8981852 +MultipartBoundaryBegin 8981852 MultipartBoundaryEnd 8981858 MimeEntityBegin 8981858 MimeEntityHeadersEnd 8982012 -MimeContentBegin 8982012 -MimeContentEnd 9011647 Octets 29635 Lines 1010 -MimeEntityEnd 9011648 -MultipartBoundaryBegin 9011648 +MimeEntityEnd 9011647 +MultipartBoundaryBegin 9011647 MultipartBoundaryEnd 9011653 MimeEntityBegin 9011653 MimeEntityHeadersEnd 9011759 -MimeContentBegin 9011759 -MimeContentEnd 9012475 Octets 716 Lines 25 -MimeEntityEnd 9012476 -MultipartBoundaryBegin 9012476 +MimeEntityEnd 9012475 +MultipartBoundaryBegin 9012475 MultipartBoundaryEnd 9012481 MimeEntityBegin 9012481 MimeEntityHeadersEnd 9012598 -MimeContentBegin 9012598 -MimeContentEnd 9013862 Octets 1264 Lines 25 -MimeEntityEnd 9013863 -MultipartEndBoundaryBegin 9013863 +MimeEntityEnd 9013862 +MultipartEndBoundaryBegin 9013862 MultipartEndBoundaryEnd 9013869 MultipartEpilogueBegin 9013869 MultipartEpilogueEnd 9013870 -MimeContentEnd 9013871 -Octets 94118 +Octets 94117 Lines 1971 -MimeEntityEnd 9013871 -MimeMessageEnd 9013871 +MimeEntityEnd 9013870 +MimeMessageEnd 9013870 MboxMarkerBegin 9013871 MboxMarkerEnd 9013902 MimeMessageBegin 9013903 MimeMessageHeadersEnd 9015056 MimeEntityBegin 9013903 MimeEntityHeadersEnd 9015056 -MimeContentBegin 9015056 MultipartPreambleBegin 9015056 MultipartPreambleEnd 9015056 MultipartBoundaryBegin 9015056 MultipartBoundaryEnd 9015073 MimeEntityBegin 9015073 MimeEntityHeadersEnd 9015074 -MimeContentBegin 9015074 -MimeContentEnd 9015975 Octets 901 Lines 21 -MimeEntityEnd 9015976 -MultipartBoundaryBegin 9015976 +MimeEntityEnd 9015975 +MultipartBoundaryBegin 9015975 MultipartBoundaryEnd 9015993 MimeEntityBegin 9015993 MimeEntityHeadersEnd 9016072 -MimeContentBegin 9016072 -MimeContentEnd 9016820 Octets 748 Lines 13 -MimeEntityEnd 9016821 -MultipartEndBoundaryBegin 9016821 +MimeEntityEnd 9016820 +MultipartEndBoundaryBegin 9016820 MultipartEndBoundaryEnd 9016839 MultipartEpilogueBegin 9016839 MultipartEpilogueEnd 9016840 -MimeContentEnd 9016841 -Octets 1785 +Octets 1784 Lines 42 -MimeEntityEnd 9016841 -MimeMessageEnd 9016841 +MimeEntityEnd 9016840 +MimeMessageEnd 9016840 MboxMarkerBegin 9016841 MboxMarkerEnd 9016872 MimeMessageBegin 9016873 MimeMessageHeadersEnd 9018015 MimeEntityBegin 9016873 MimeEntityHeadersEnd 9018015 -MimeContentBegin 9018015 MultipartPreambleBegin 9018015 MultipartPreambleEnd 9018188 MultipartBoundaryBegin 9018188 MultipartBoundaryEnd 9018195 MimeEntityBegin 9018195 MimeEntityHeadersEnd 9018273 -MimeContentBegin 9018273 -MimeContentEnd 9019014 Octets 741 Lines 14 -MimeEntityEnd 9019015 -MultipartBoundaryBegin 9019015 +MimeEntityEnd 9019014 +MultipartBoundaryBegin 9019014 MultipartBoundaryEnd 9019022 MimeEntityBegin 9019022 MimeEntityHeadersEnd 9019200 -MimeContentBegin 9019200 -MimeContentEnd 9021415 Octets 2215 Lines 32 -MimeEntityEnd 9021416 -MultipartEndBoundaryBegin 9021416 +MimeEntityEnd 9021415 +MultipartEndBoundaryBegin 9021415 MultipartEndBoundaryEnd 9021424 MultipartEpilogueBegin 9021424 MultipartEpilogueEnd 9021424 -MimeContentEnd 9021425 -Octets 3410 +Octets 3409 Lines 60 -MimeEntityEnd 9021425 -MimeMessageEnd 9021425 +MimeEntityEnd 9021424 +MimeMessageEnd 9021424 MboxMarkerBegin 9021425 MboxMarkerEnd 9021456 MimeMessageBegin 9021457 MimeMessageHeadersEnd 9022594 MimeEntityBegin 9021457 MimeEntityHeadersEnd 9022594 -MimeContentBegin 9022594 MultipartPreambleBegin 9022594 MultipartPreambleEnd 9022767 MultipartBoundaryBegin 9022767 MultipartBoundaryEnd 9022788 MimeEntityBegin 9022788 MimeEntityHeadersEnd 9022866 -MimeContentBegin 9022866 -MimeContentEnd 9025678 Octets 2812 Lines 47 -MimeEntityEnd 9025679 -MultipartBoundaryBegin 9025679 +MimeEntityEnd 9025678 +MultipartBoundaryBegin 9025678 MultipartBoundaryEnd 9025700 MimeEntityBegin 9025700 MimeEntityHeadersEnd 9025878 -MimeContentBegin 9025878 -MimeContentEnd 9028425 Octets 2547 Lines 36 -MimeEntityEnd 9028426 -MultipartEndBoundaryBegin 9028426 +MimeEntityEnd 9028425 +MultipartEndBoundaryBegin 9028425 MultipartEndBoundaryEnd 9028448 MultipartEpilogueBegin 9028448 MultipartEpilogueEnd 9028448 -MimeContentEnd 9028449 -Octets 5855 +Octets 5854 Lines 97 -MimeEntityEnd 9028449 -MimeMessageEnd 9028449 +MimeEntityEnd 9028448 +MimeMessageEnd 9028448 MboxMarkerBegin 9028449 MboxMarkerEnd 9028456 MimeMessageBegin 9028457 MimeMessageHeadersEnd 9028665 MimeEntityBegin 9028457 MimeEntityHeadersEnd 9028665 -MimeContentBegin 9028665 -MimeContentEnd 9032858 Octets 4193 Lines 58 -MimeEntityEnd 9032859 -MimeMessageEnd 9032859 +MimeEntityEnd 9032858 +MimeMessageEnd 9032858 MboxMarkerBegin 9032859 MboxMarkerEnd 9032890 MimeMessageBegin 9032891 MimeMessageHeadersEnd 9033791 MimeEntityBegin 9032891 MimeEntityHeadersEnd 9033791 -MimeContentBegin 9033791 MultipartPreambleBegin 9033791 MultipartPreambleEnd 9033837 MultipartBoundaryBegin 9033837 MultipartBoundaryEnd 9033864 MimeEntityBegin 9033864 MimeEntityHeadersEnd 9033998 -MimeContentBegin 9033998 -MimeContentEnd 9044720 Octets 10722 Lines 147 -MimeEntityEnd 9044721 -MultipartBoundaryBegin 9044721 +MimeEntityEnd 9044720 +MultipartBoundaryBegin 9044720 MultipartBoundaryEnd 9044748 MimeEntityBegin 9044748 MimeEntityHeadersEnd 9044899 -MimeContentBegin 9044899 -MimeContentEnd 9049510 Octets 4611 Lines 64 -MimeEntityEnd 9049511 -MultipartEndBoundaryBegin 9049511 +MimeEntityEnd 9049510 +MultipartEndBoundaryBegin 9049510 MultipartEndBoundaryEnd 9049539 MultipartEpilogueBegin 9049539 MultipartEpilogueEnd 9049540 -MimeContentEnd 9049541 -Octets 15750 +Octets 15749 Lines 225 -MimeEntityEnd 9049541 -MimeMessageEnd 9049541 +MimeEntityEnd 9049540 +MimeMessageEnd 9049540 MboxMarkerBegin 9049541 MboxMarkerEnd 9049572 MimeMessageBegin 9049573 MimeMessageHeadersEnd 9050380 MimeEntityBegin 9049573 MimeEntityHeadersEnd 9050380 -MimeContentBegin 9050380 -MimeContentEnd 9067141 Octets 16761 Lines 258 -MimeEntityEnd 9067142 -MimeMessageEnd 9067142 +MimeEntityEnd 9067141 +MimeMessageEnd 9067141 MboxMarkerBegin 9067142 MboxMarkerEnd 9067173 MimeMessageBegin 9067174 MimeMessageHeadersEnd 9067986 MimeEntityBegin 9067174 MimeEntityHeadersEnd 9067986 -MimeContentBegin 9067986 -MimeContentEnd 9092950 Octets 24964 Lines 385 -MimeEntityEnd 9092951 -MimeMessageEnd 9092951 +MimeEntityEnd 9092950 +MimeMessageEnd 9092950 MboxMarkerBegin 9092951 MboxMarkerEnd 9092982 MimeMessageBegin 9092983 MimeMessageHeadersEnd 9093795 MimeEntityBegin 9092983 MimeEntityHeadersEnd 9093795 -MimeContentBegin 9093795 -MimeContentEnd 9129926 Octets 36131 Lines 556 -MimeEntityEnd 9129927 -MimeMessageEnd 9129927 +MimeEntityEnd 9129926 +MimeMessageEnd 9129926 MboxMarkerBegin 9129927 MboxMarkerEnd 9129958 MimeMessageBegin 9129959 MimeMessageHeadersEnd 9130774 MimeEntityBegin 9129959 MimeEntityHeadersEnd 9130774 -MimeContentBegin 9130774 -MimeContentEnd 9182075 Octets 51301 Lines 790 -MimeEntityEnd 9182076 -MimeMessageEnd 9182076 +MimeEntityEnd 9182075 +MimeMessageEnd 9182075 MboxMarkerBegin 9182076 MboxMarkerEnd 9182107 MimeMessageBegin 9182108 MimeMessageHeadersEnd 9183499 MimeEntityBegin 9182108 MimeEntityHeadersEnd 9183499 -MimeContentBegin 9183499 -MimeContentEnd 9184930 Octets 1431 Lines 20 -MimeEntityEnd 9184931 -MimeMessageEnd 9184931 +MimeEntityEnd 9184930 +MimeMessageEnd 9184930 MboxMarkerBegin 9184931 MboxMarkerEnd 9184962 MimeMessageBegin 9184963 MimeMessageHeadersEnd 9186316 MimeEntityBegin 9184963 MimeEntityHeadersEnd 9186316 -MimeContentBegin 9186316 MultipartPreambleBegin 9186316 MultipartPreambleEnd 9186317 MultipartBoundaryBegin 9186317 MultipartBoundaryEnd 9186361 MimeEntityBegin 9186361 MimeEntityHeadersEnd 9186425 -MimeContentBegin 9186425 -MimeContentEnd 9186532 Octets 107 Lines 4 -MimeEntityEnd 9186533 -MultipartBoundaryBegin 9186533 +MimeEntityEnd 9186532 +MultipartBoundaryBegin 9186532 MultipartBoundaryEnd 9186577 MimeEntityBegin 9186577 MimeEntityHeadersEnd 9186728 -MimeContentBegin 9186728 -MimeContentEnd 9190661 Octets 3933 Lines 54 -MimeEntityEnd 9190662 -MultipartEndBoundaryBegin 9190662 +MimeEntityEnd 9190661 +MultipartEndBoundaryBegin 9190661 MultipartEndBoundaryEnd 9190707 MultipartEpilogueBegin 9190707 MultipartEpilogueEnd 9190708 -MimeContentEnd 9190709 -Octets 4393 +Octets 4392 Lines 70 -MimeEntityEnd 9190709 -MimeMessageEnd 9190709 +MimeEntityEnd 9190708 +MimeMessageEnd 9190708 MboxMarkerBegin 9190709 MboxMarkerEnd 9190740 MimeMessageBegin 9190741 MimeMessageHeadersEnd 9191951 MimeEntityBegin 9190741 MimeEntityHeadersEnd 9191951 -MimeContentBegin 9191951 -MimeContentEnd 9195446 Octets 3495 Lines 56 -MimeEntityEnd 9195447 -MimeMessageEnd 9195447 +MimeEntityEnd 9195446 +MimeMessageEnd 9195446 MboxMarkerBegin 9195447 MboxMarkerEnd 9195478 MimeMessageBegin 9195479 MimeMessageHeadersEnd 9196556 MimeEntityBegin 9195479 MimeEntityHeadersEnd 9196556 -MimeContentBegin 9196556 -MimeContentEnd 9197217 Octets 661 Lines 10 -MimeEntityEnd 9197218 -MimeMessageEnd 9197218 +MimeEntityEnd 9197217 +MimeMessageEnd 9197217 MboxMarkerBegin 9197218 MboxMarkerEnd 9197225 MimeMessageBegin 9197226 MimeMessageHeadersEnd 9197618 MimeEntityBegin 9197226 MimeEntityHeadersEnd 9197618 -MimeContentBegin 9197618 -MimeContentEnd 9205238 Octets 7620 Lines 105 -MimeEntityEnd 9205239 -MimeMessageEnd 9205239 +MimeEntityEnd 9205238 +MimeMessageEnd 9205238 MboxMarkerBegin 9205239 MboxMarkerEnd 9205270 MimeMessageBegin 9205271 MimeMessageHeadersEnd 9206054 MimeEntityBegin 9205271 MimeEntityHeadersEnd 9206054 -MimeContentBegin 9206054 MimeMessageBegin 9206054 -MimeMessageHeadersEnd 9207434 MimeEntityBegin 9206054 MimeEntityHeadersEnd 9207434 -MimeContentBegin 9207434 -MimeContentEnd 9208866 +MimeMessageHeadersEnd 9207434 Octets 1432 Lines 21 -MimeEntityEnd 9208867 -MimeMessageEnd 9208867 -MimeContentEnd 9208867 -Octets 2813 +MimeEntityEnd 9208866 +MimeMessageEnd 9208866 +Octets 2812 Lines 44 -MimeEntityEnd 9208867 -MimeMessageEnd 9208867 +MimeEntityEnd 9208866 +MimeMessageEnd 9208866 MboxMarkerBegin 9208867 MboxMarkerEnd 9208898 MimeMessageBegin 9208899 MimeMessageHeadersEnd 9209609 MimeEntityBegin 9208899 MimeEntityHeadersEnd 9209609 -MimeContentBegin 9209609 MultipartPreambleBegin 9209609 MultipartPreambleEnd 9209655 MultipartBoundaryBegin 9209655 MultipartBoundaryEnd 9209682 MimeEntityBegin 9209682 MimeEntityHeadersEnd 9209758 -MimeContentBegin 9209758 -MimeContentEnd 9209773 Octets 15 Lines 2 -MimeEntityEnd 9209774 -MultipartBoundaryBegin 9209774 +MimeEntityEnd 9209773 +MultipartBoundaryBegin 9209773 MultipartBoundaryEnd 9209801 MimeEntityBegin 9209801 MimeEntityHeadersEnd 9209955 -MimeContentBegin 9209955 MimeMessageBegin 9209955 -MimeMessageHeadersEnd 9211335 MimeEntityBegin 9209955 MimeEntityHeadersEnd 9211335 -MimeContentBegin 9211335 -MimeContentEnd 9212767 +MimeMessageHeadersEnd 9211335 Octets 1432 Lines 21 -MimeEntityEnd 9212768 -MimeMessageEnd 9212768 -MimeContentEnd 9212768 -Octets 2813 +MimeEntityEnd 9212767 +MimeMessageEnd 9212767 +Octets 2812 Lines 44 -MimeEntityEnd 9212768 -MultipartEndBoundaryBegin 9212768 +MimeEntityEnd 9212767 +MultipartEndBoundaryBegin 9212767 MultipartEndBoundaryEnd 9212796 MultipartEpilogueBegin 9212796 MultipartEpilogueEnd 9212797 -MimeContentEnd 9212798 -Octets 3189 +Octets 3188 Lines 59 -MimeEntityEnd 9212798 -MimeMessageEnd 9212798 +MimeEntityEnd 9212797 +MimeMessageEnd 9212797 MboxMarkerBegin 9212798 MboxMarkerEnd 9212829 MimeMessageBegin 9212830 MimeMessageHeadersEnd 9213495 MimeEntityBegin 9212830 MimeEntityHeadersEnd 9213495 -MimeContentBegin 9213495 MultipartPreambleBegin 9213495 MultipartPreambleEnd 9213555 MultipartBoundaryBegin 9213555 MultipartBoundaryEnd 9213596 MimeEntityBegin 9213596 MimeEntityHeadersEnd 9213672 -MimeContentBegin 9213672 -MimeContentEnd 9213713 Octets 41 Lines 2 -MimeEntityEnd 9213714 -MultipartBoundaryBegin 9213714 +MimeEntityEnd 9213713 +MultipartBoundaryBegin 9213713 MultipartBoundaryEnd 9213755 MimeEntityBegin 9213755 MimeEntityHeadersEnd 9213906 -MimeContentBegin 9213906 -MimeContentEnd 9219462 Octets 5556 Lines 77 -MimeEntityEnd 9219463 -MultipartEndBoundaryBegin 9219463 +MimeEntityEnd 9219462 +MultipartEndBoundaryBegin 9219462 MultipartEndBoundaryEnd 9219505 MultipartEpilogueBegin 9219505 MultipartEpilogueEnd 9219506 -MimeContentEnd 9219507 -Octets 6012 +Octets 6011 Lines 92 -MimeEntityEnd 9219507 -MimeMessageEnd 9219507 +MimeEntityEnd 9219506 +MimeMessageEnd 9219506 MboxMarkerBegin 9219507 MboxMarkerEnd 9219538 MimeMessageBegin 9219539 MimeMessageHeadersEnd 9220601 MimeEntityBegin 9219539 MimeEntityHeadersEnd 9220601 -MimeContentBegin 9220601 -MimeContentEnd 9230837 Octets 10236 Lines 141 -MimeEntityEnd 9230838 -MimeMessageEnd 9230838 +MimeEntityEnd 9230837 +MimeMessageEnd 9230837 MboxMarkerBegin 9230838 MboxMarkerEnd 9230869 MimeMessageBegin 9230870 MimeMessageHeadersEnd 9232246 MimeEntityBegin 9230870 MimeEntityHeadersEnd 9232246 -MimeContentBegin 9232246 MultipartPreambleBegin 9232246 MultipartPreambleEnd 9232306 MultipartBoundaryBegin 9232306 MultipartBoundaryEnd 9232347 MimeEntityBegin 9232347 MimeEntityHeadersEnd 9232423 -MimeContentBegin 9232423 -MimeContentEnd 9233034 Octets 611 Lines 17 -MimeEntityEnd 9233035 -MultipartBoundaryBegin 9233035 +MimeEntityEnd 9233034 +MultipartBoundaryBegin 9233034 MultipartBoundaryEnd 9233076 MimeEntityBegin 9233076 MimeEntityHeadersEnd 9233227 -MimeContentBegin 9233227 -MimeContentEnd 9235015 Octets 1788 Lines 25 -MimeEntityEnd 9235016 -MultipartEndBoundaryBegin 9235016 +MimeEntityEnd 9235015 +MultipartEndBoundaryBegin 9235015 MultipartEndBoundaryEnd 9235058 MultipartEpilogueBegin 9235058 MultipartEpilogueEnd 9235059 -MimeContentEnd 9235060 -Octets 2814 +Octets 2813 Lines 55 -MimeEntityEnd 9235060 -MimeMessageEnd 9235060 +MimeEntityEnd 9235059 +MimeMessageEnd 9235059 MboxMarkerBegin 9235060 MboxMarkerEnd 9235091 MimeMessageBegin 9235092 MimeMessageHeadersEnd 9235640 MimeEntityBegin 9235092 MimeEntityHeadersEnd 9235640 -MimeContentBegin 9235640 -MimeContentEnd 9236163 Octets 523 Lines 8 -MimeEntityEnd 9236164 -MimeMessageEnd 9236164 +MimeEntityEnd 9236163 +MimeMessageEnd 9236163 MboxMarkerBegin 9236164 MboxMarkerEnd 9236171 MimeMessageBegin 9236172 MimeMessageHeadersEnd 9237488 MimeEntityBegin 9236172 MimeEntityHeadersEnd 9237488 -MimeContentBegin 9237488 MultipartPreambleBegin 9237488 MultipartPreambleEnd 9237704 MultipartBoundaryBegin 9237704 MultipartBoundaryEnd 9237745 MimeEntityBegin 9237745 MimeEntityHeadersEnd 9237789 -MimeContentBegin 9237789 -MimeContentEnd 9238377 Octets 588 Lines 16 -MimeEntityEnd 9238378 -MultipartEndBoundaryBegin 9238378 +MimeEntityEnd 9238377 +MultipartEndBoundaryBegin 9238377 MultipartEndBoundaryEnd 9238420 MultipartEpilogueBegin 9238420 MultipartEpilogueEnd 9238420 -MimeContentEnd 9238421 -Octets 933 +Octets 932 Lines 24 -MimeEntityEnd 9238421 -MimeMessageEnd 9238421 +MimeEntityEnd 9238420 +MimeMessageEnd 9238420 MboxMarkerBegin 9238421 MboxMarkerEnd 9238428 MimeMessageBegin 9238429 MimeMessageHeadersEnd 9239776 MimeEntityBegin 9238429 MimeEntityHeadersEnd 9239776 -MimeContentBegin 9239776 MultipartPreambleBegin 9239776 MultipartPreambleEnd 9239992 MultipartBoundaryBegin 9239992 MultipartBoundaryEnd 9240033 MimeEntityBegin 9240033 MimeEntityHeadersEnd 9240077 -MimeContentBegin 9240077 -MimeContentEnd 9240178 Octets 101 Lines 7 -MimeEntityEnd 9240179 -MultipartBoundaryBegin 9240179 +MimeEntityEnd 9240178 +MultipartBoundaryBegin 9240178 MultipartBoundaryEnd 9240220 MimeEntityBegin 9240220 MimeEntityHeadersEnd 9240383 -MimeContentBegin 9240383 MultipartPreambleBegin 9240383 MultipartPreambleEnd 9240599 MultipartBoundaryBegin 9240599 MultipartBoundaryEnd 9240638 MimeEntityBegin 9240638 MimeEntityHeadersEnd 9240745 -MimeContentBegin 9240745 -MimeContentEnd 9240836 Octets 91 Lines 5 -MimeEntityEnd 9240837 -MultipartBoundaryBegin 9240837 +MimeEntityEnd 9240836 +MultipartBoundaryBegin 9240836 MultipartBoundaryEnd 9240876 MimeEntityBegin 9240876 MimeEntityHeadersEnd 9240969 -MimeContentBegin 9240969 MimeMessageBegin 9240969 -MimeMessageHeadersEnd 9242136 MimeEntityBegin 9240969 MimeEntityHeadersEnd 9242136 -MimeContentBegin 9242136 -MimeContentEnd 9242341 +MimeMessageHeadersEnd 9242136 Octets 205 Lines 6 -MimeEntityEnd 9242342 -MimeMessageEnd 9242342 -MimeContentEnd 9242342 -Octets 1373 +MimeEntityEnd 9242341 +MimeMessageEnd 9242341 +Octets 1372 Lines 35 -MimeEntityEnd 9242342 -MultipartBoundaryBegin 9242342 +MimeEntityEnd 9242341 +MultipartBoundaryBegin 9242341 MultipartBoundaryEnd 9242381 MimeEntityBegin 9242381 MimeEntityHeadersEnd 9242547 -MimeContentBegin 9242547 -MimeContentEnd 9243026 Octets 479 Lines 12 -MimeEntityEnd 9243027 -MultipartEndBoundaryBegin 9243027 +MimeEntityEnd 9243026 +MultipartEndBoundaryBegin 9243026 MultipartEndBoundaryEnd 9243067 MultipartEpilogueBegin 9243067 MultipartEpilogueEnd 9243067 -MimeContentEnd 9243068 -Octets 2685 +Octets 2684 Lines 70 -MimeEntityEnd 9243068 -MultipartBoundaryBegin 9243068 +MimeEntityEnd 9243067 +MultipartBoundaryBegin 9243067 MultipartBoundaryEnd 9243109 MimeEntityBegin 9243109 MimeEntityHeadersEnd 9243321 -MimeContentBegin 9243321 -MimeContentEnd 9248544 Octets 5223 Lines 72 -MimeEntityEnd 9248545 -MultipartEndBoundaryBegin 9248545 +MimeEntityEnd 9248544 +MultipartEndBoundaryBegin 9248544 MultipartEndBoundaryEnd 9248587 MultipartEpilogueBegin 9248587 MultipartEpilogueEnd 9248589 -MimeContentEnd 9248590 -Octets 8814 +Octets 8813 Lines 170 -MimeEntityEnd 9248590 -MimeMessageEnd 9248590 +MimeEntityEnd 9248589 +MimeMessageEnd 9248589 MboxMarkerBegin 9248590 MboxMarkerEnd 9248621 MimeMessageBegin 9248622 MimeMessageHeadersEnd 9249837 MimeEntityBegin 9248622 MimeEntityHeadersEnd 9249837 -MimeContentBegin 9249837 -MimeContentEnd 9252719 Octets 2882 Lines 39 -MimeEntityEnd 9252720 -MimeMessageEnd 9252720 +MimeEntityEnd 9252719 +MimeMessageEnd 9252719 MboxMarkerBegin 9252720 MboxMarkerEnd 9252751 MimeMessageBegin 9252752 MimeMessageHeadersEnd 9253910 MimeEntityBegin 9252752 MimeEntityHeadersEnd 9253910 -MimeContentBegin 9253910 -MimeContentEnd 9256032 Octets 2122 Lines 31 -MimeEntityEnd 9256033 -MimeMessageEnd 9256033 +MimeEntityEnd 9256032 +MimeMessageEnd 9256032 MboxMarkerBegin 9256033 MboxMarkerEnd 9256064 MimeMessageBegin 9256065 MimeMessageHeadersEnd 9257143 MimeEntityBegin 9256065 MimeEntityHeadersEnd 9257143 -MimeContentBegin 9257143 MultipartPreambleBegin 9257143 MultipartPreambleEnd 9257144 MultipartBoundaryBegin 9257144 MultipartBoundaryEnd 9257176 MimeEntityBegin 9257176 MimeEntityHeadersEnd 9257240 -MimeContentBegin 9257240 -MimeContentEnd 9257240 Octets 0 Lines 1 -MimeEntityEnd 9257241 -MultipartBoundaryBegin 9257241 +MimeEntityEnd 9257240 +MultipartBoundaryBegin 9257240 MultipartBoundaryEnd 9257273 MimeEntityBegin 9257273 MimeEntityHeadersEnd 9257352 -MimeContentBegin 9257352 -MimeContentEnd 9260065 Octets 2713 Lines 42 -MimeEntityEnd 9260066 -MultipartEndBoundaryBegin 9260066 +MimeEntityEnd 9260065 +MultipartEndBoundaryBegin 9260065 MultipartEndBoundaryEnd 9260099 MultipartEpilogueBegin 9260099 MultipartEpilogueEnd 9260100 -MimeContentEnd 9260101 -Octets 2958 +Octets 2957 Lines 54 -MimeEntityEnd 9260101 -MimeMessageEnd 9260101 +MimeEntityEnd 9260100 +MimeMessageEnd 9260100 MboxMarkerBegin 9260101 MboxMarkerEnd 9260132 MimeMessageBegin 9260133 MimeMessageHeadersEnd 9261170 MimeEntityBegin 9260133 MimeEntityHeadersEnd 9261170 -MimeContentBegin 9261170 MultipartPreambleBegin 9261170 MultipartPreambleEnd 9261171 MultipartBoundaryBegin 9261171 MultipartBoundaryEnd 9261211 MimeEntityBegin 9261211 MimeEntityHeadersEnd 9261289 -MimeContentBegin 9261289 -MimeContentEnd 9261742 Octets 453 Lines 14 -MimeEntityEnd 9261743 -MultipartBoundaryBegin 9261743 +MimeEntityEnd 9261742 +MultipartBoundaryBegin 9261742 MultipartBoundaryEnd 9261783 MimeEntityBegin 9261783 MimeEntityHeadersEnd 9261858 -MimeContentBegin 9261858 -MimeContentEnd 9262669 Octets 811 Lines 27 -MimeEntityEnd 9262670 -MultipartBoundaryBegin 9262670 +MimeEntityEnd 9262669 +MultipartBoundaryBegin 9262669 MultipartBoundaryEnd 9262710 MimeEntityBegin 9262710 MimeEntityHeadersEnd 9262807 -MimeContentBegin 9262807 -MimeContentEnd 9264007 Octets 1200 Lines 17 -MimeEntityEnd 9264008 -MultipartEndBoundaryBegin 9264008 +MimeEntityEnd 9264007 +MultipartEndBoundaryBegin 9264007 MultipartEndBoundaryEnd 9264049 MultipartEpilogueBegin 9264049 MultipartEpilogueEnd 9264050 -MimeContentEnd 9264051 -Octets 2881 +Octets 2880 Lines 73 -MimeEntityEnd 9264051 -MimeMessageEnd 9264051 +MimeEntityEnd 9264050 +MimeMessageEnd 9264050 MboxMarkerBegin 9264051 MboxMarkerEnd 9264082 MimeMessageBegin 9264083 MimeMessageHeadersEnd 9265158 MimeEntityBegin 9264083 MimeEntityHeadersEnd 9265158 -MimeContentBegin 9265158 MultipartPreambleBegin 9265158 MultipartPreambleEnd 9265159 MultipartBoundaryBegin 9265159 MultipartBoundaryEnd 9265201 MimeEntityBegin 9265201 MimeEntityHeadersEnd 9265271 -MimeContentBegin 9265271 -MimeContentEnd 9265423 Octets 152 Lines 8 -MimeEntityEnd 9265424 -MultipartBoundaryBegin 9265424 +MimeEntityEnd 9265423 +MultipartBoundaryBegin 9265423 MultipartBoundaryEnd 9265466 MimeEntityBegin 9265466 MimeEntityHeadersEnd 9265545 -MimeContentBegin 9265545 -MimeContentEnd 9269641 Octets 4096 Lines 57 -MimeEntityEnd 9269642 -MultipartEndBoundaryBegin 9269642 +MimeEntityEnd 9269641 +MultipartEndBoundaryBegin 9269641 MultipartEndBoundaryEnd 9269685 MultipartEpilogueBegin 9269685 MultipartEpilogueEnd 9269686 -MimeContentEnd 9269687 -Octets 4529 +Octets 4528 Lines 76 -MimeEntityEnd 9269687 -MimeMessageEnd 9269687 +MimeEntityEnd 9269686 +MimeMessageEnd 9269686 MboxMarkerBegin 9269687 MboxMarkerEnd 9269694 MimeMessageBegin 9269695 MimeMessageHeadersEnd 9270246 MimeEntityBegin 9269695 MimeEntityHeadersEnd 9270246 -MimeContentBegin 9270246 MultipartPreambleBegin 9270246 MultipartPreambleEnd 9270247 MultipartBoundaryBegin 9270247 MultipartBoundaryEnd 9270290 MimeEntityBegin 9270290 MimeEntityHeadersEnd 9270354 -MimeContentBegin 9270354 -MimeContentEnd 9270509 Octets 155 Lines 4 -MimeEntityEnd 9270510 -MultipartBoundaryBegin 9270510 +MimeEntityEnd 9270509 +MultipartBoundaryBegin 9270509 MultipartBoundaryEnd 9270553 MimeEntityBegin 9270553 MimeEntityHeadersEnd 9270704 -MimeContentBegin 9270704 -MimeContentEnd 9274621 Octets 3917 Lines 54 -MimeEntityEnd 9274622 -MultipartEndBoundaryBegin 9274622 +MimeEntityEnd 9274621 +MultipartEndBoundaryBegin 9274621 MultipartEndBoundaryEnd 9274666 MultipartEpilogueBegin 9274666 MultipartEpilogueEnd 9274666 -MimeContentEnd 9274667 -Octets 4421 +Octets 4420 Lines 69 -MimeEntityEnd 9274667 -MimeMessageEnd 9274667 +MimeEntityEnd 9274666 +MimeMessageEnd 9274666 MboxMarkerBegin 9274667 MboxMarkerEnd 9274698 MimeMessageBegin 9274699 MimeMessageHeadersEnd 9275863 MimeEntityBegin 9274699 MimeEntityHeadersEnd 9275863 -MimeContentBegin 9275863 MultipartPreambleBegin 9275863 MultipartPreambleEnd 9276000 MultipartBoundaryBegin 9276000 MultipartBoundaryEnd 9276040 MimeEntityBegin 9276040 MimeEntityHeadersEnd 9276118 -MimeContentBegin 9276118 -MimeContentEnd 9276190 Octets 72 Lines 6 -MimeEntityEnd 9276191 -MultipartBoundaryBegin 9276191 +MimeEntityEnd 9276190 +MultipartBoundaryBegin 9276190 MultipartBoundaryEnd 9276231 MimeEntityBegin 9276231 MimeEntityHeadersEnd 9276326 -MimeContentBegin 9276326 -MimeContentEnd 9279885 Octets 3559 Lines 48 -MimeEntityEnd 9279886 -MultipartEndBoundaryBegin 9279886 +MimeEntityEnd 9279885 +MultipartEndBoundaryBegin 9279885 MultipartEndBoundaryEnd 9279927 MultipartEpilogueBegin 9279927 MultipartEpilogueEnd 9279928 -MimeContentEnd 9279929 -Octets 4066 +Octets 4065 Lines 67 -MimeEntityEnd 9279929 -MimeMessageEnd 9279929 +MimeEntityEnd 9279928 +MimeMessageEnd 9279928 MboxMarkerBegin 9279929 MboxMarkerEnd 9279960 MimeMessageBegin 9279961 MimeMessageHeadersEnd 9281063 MimeEntityBegin 9279961 MimeEntityHeadersEnd 9281063 -MimeContentBegin 9281063 MultipartPreambleBegin 9281063 MultipartPreambleEnd 9281064 MultipartBoundaryBegin 9281064 MultipartBoundaryEnd 9281097 MimeEntityBegin 9281097 MimeEntityHeadersEnd 9281175 -MimeContentBegin 9281175 -MimeContentEnd 9281249 Octets 74 Lines 5 -MimeEntityEnd 9281250 -MultipartBoundaryBegin 9281250 +MimeEntityEnd 9281249 +MultipartBoundaryBegin 9281249 MultipartBoundaryEnd 9281283 MimeEntityBegin 9281283 MimeEntityHeadersEnd 9281362 -MimeContentBegin 9281362 -MimeContentEnd 9285079 Octets 3717 Lines 58 -MimeEntityEnd 9285080 -MultipartEndBoundaryBegin 9285080 +MimeEntityEnd 9285079 +MultipartEndBoundaryBegin 9285079 MultipartEndBoundaryEnd 9285114 MultipartEpilogueBegin 9285114 MultipartEpilogueEnd 9285114 -MimeContentEnd 9285115 -Octets 4052 +Octets 4051 Lines 73 -MimeEntityEnd 9285115 -MimeMessageEnd 9285115 +MimeEntityEnd 9285114 +MimeMessageEnd 9285114 MboxMarkerBegin 9285115 MboxMarkerEnd 9285146 MimeMessageBegin 9285147 MimeMessageHeadersEnd 9286275 MimeEntityBegin 9285147 MimeEntityHeadersEnd 9286275 -MimeContentBegin 9286275 MultipartPreambleBegin 9286275 MultipartPreambleEnd 9286388 MultipartBoundaryBegin 9286388 MultipartBoundaryEnd 9286412 MimeEntityBegin 9286412 MimeEntityHeadersEnd 9286451 -MimeContentBegin 9286451 -MimeContentEnd 9286639 Octets 188 Lines 7 -MimeEntityEnd 9286640 -MultipartBoundaryBegin 9286640 +MimeEntityEnd 9286639 +MultipartBoundaryBegin 9286639 MultipartBoundaryEnd 9286664 MimeEntityBegin 9286664 MimeEntityHeadersEnd 9286694 -MimeContentBegin 9286694 MimeMessageBegin 9286694 -MimeMessageHeadersEnd 9287500 MimeEntityBegin 9286694 MimeEntityHeadersEnd 9287500 -MimeContentBegin 9287500 -MimeContentEnd 9287511 +MimeMessageHeadersEnd 9287500 Octets 11 Lines 1 -MimeEntityEnd 9287512 -MimeMessageEnd 9287512 -MimeContentEnd 9287512 -Octets 818 +MimeEntityEnd 9287511 +MimeMessageEnd 9287511 +Octets 817 Lines 16 -MimeEntityEnd 9287512 -MultipartEndBoundaryBegin 9287512 +MimeEntityEnd 9287511 +MultipartEndBoundaryBegin 9287511 MultipartEndBoundaryEnd 9287537 MultipartEpilogueBegin 9287537 MultipartEpilogueEnd 9287538 -MimeContentEnd 9287539 -Octets 1264 +Octets 1263 Lines 35 -MimeEntityEnd 9287539 -MimeMessageEnd 9287539 +MimeEntityEnd 9287538 +MimeMessageEnd 9287538 MboxMarkerBegin 9287539 MboxMarkerEnd 9287584 MimeMessageBegin 9287585 MimeMessageHeadersEnd 9287750 MimeEntityBegin 9287585 MimeEntityHeadersEnd 9287750 -MimeContentBegin 9287750 -MimeContentEnd 9322244 Octets 34494 Lines 593 -MimeEntityEnd 9322245 -MimeMessageEnd 9322245 +MimeEntityEnd 9322244 +MimeMessageEnd 9322244 MboxMarkerBegin 9322245 MboxMarkerEnd 9322290 MimeMessageBegin 9322291 MimeMessageHeadersEnd 9322449 MimeEntityBegin 9322291 MimeEntityHeadersEnd 9322449 -MimeContentBegin 9322449 -MimeContentEnd 9356943 Octets 34494 Lines 593 -MimeEntityEnd 9356944 -MimeMessageEnd 9356944 +MimeEntityEnd 9356943 +MimeMessageEnd 9356943 MboxMarkerBegin 9356944 MboxMarkerEnd 9356951 MimeMessageBegin 9356952 MimeMessageHeadersEnd 9357549 MimeEntityBegin 9356952 MimeEntityHeadersEnd 9357549 -MimeContentBegin 9357549 -MimeContentEnd 9358949 Octets 1400 Lines 39 -MimeEntityEnd 9358950 -MimeMessageEnd 9358950 +MimeEntityEnd 9358949 +MimeMessageEnd 9358949 MboxMarkerBegin 9358950 MboxMarkerEnd 9358957 MimeMessageBegin 9358958 MimeMessageHeadersEnd 9359858 MimeEntityBegin 9358958 MimeEntityHeadersEnd 9359858 -MimeContentBegin 9359858 MultipartPreambleBegin 9359858 MultipartPreambleEnd 9359858 MultipartBoundaryBegin 9359858 MultipartBoundaryEnd 9359897 MimeEntityBegin 9359897 MimeEntityHeadersEnd 9359923 -MimeContentBegin 9359923 -MimeContentEnd 9360268 Octets 345 Lines 11 -MimeEntityEnd 9360269 -MultipartBoundaryBegin 9360269 +MimeEntityEnd 9360268 +MultipartBoundaryBegin 9360268 MultipartBoundaryEnd 9360308 MimeEntityBegin 9360308 MimeEntityHeadersEnd 9360401 -MimeContentBegin 9360401 -MimeContentEnd 9601970 Octets 241569 Lines 3962 -MimeEntityEnd 9601971 -MultipartEndBoundaryBegin 9601971 +MimeEntityEnd 9601970 +MultipartEndBoundaryBegin 9601970 MultipartEndBoundaryEnd 9602011 MultipartEpilogueBegin 9602011 MultipartEpilogueEnd 9602012 -MimeContentEnd 9602013 -Octets 242155 +Octets 242154 Lines 3983 -MimeEntityEnd 9602013 -MimeMessageEnd 9602013 +MimeEntityEnd 9602012 +MimeMessageEnd 9602012 MboxMarkerBegin 9602013 MboxMarkerEnd 9602020 MimeMessageBegin 9602021 MimeMessageHeadersEnd 9602615 MimeEntityBegin 9602021 MimeEntityHeadersEnd 9602615 -MimeContentBegin 9602615 MultipartPreambleBegin 9602615 MultipartPreambleEnd 9602649 MultipartBoundaryBegin 9602649 MultipartBoundaryEnd 9602676 MimeEntityBegin 9602676 MimeEntityHeadersEnd 9602835 -MimeContentBegin 9602835 -MimeContentEnd 9681124 Octets 78289 Lines 406 -MimeEntityEnd 9681125 -MultipartEndBoundaryBegin 9681125 +MimeEntityEnd 9681124 +MultipartEndBoundaryBegin 9681124 MultipartEndBoundaryEnd 9681153 MultipartEpilogueBegin 9681153 MultipartEpilogueEnd 9681155 -MimeContentEnd 9681156 -Octets 78541 +Octets 78540 Lines 417 -MimeEntityEnd 9681156 -MimeMessageEnd 9681156 +MimeEntityEnd 9681155 +MimeMessageEnd 9681155 MboxMarkerBegin 9681156 MboxMarkerEnd 9681163 MimeMessageBegin 9681164 MimeMessageHeadersEnd 9681316 MimeEntityBegin 9681164 MimeEntityHeadersEnd 9681316 -MimeContentBegin 9681316 -MimeContentEnd 9684876 Octets 3560 Lines 49 -MimeEntityEnd 9684877 -MimeMessageEnd 9684877 +MimeEntityEnd 9684876 +MimeMessageEnd 9684876 MboxMarkerBegin 9684877 MboxMarkerEnd 9684884 MimeMessageBegin 9684885 MimeMessageHeadersEnd 9685657 MimeEntityBegin 9684885 MimeEntityHeadersEnd 9685657 -MimeContentBegin 9685657 MultipartPreambleBegin 9685657 MultipartPreambleEnd 9685812 MultipartBoundaryBegin 9685812 MultipartBoundaryEnd 9685852 MimeEntityBegin 9685852 MimeEntityHeadersEnd 9685896 -MimeContentBegin 9685896 -MimeContentEnd 9686310 Octets 414 Lines 8 -MimeEntityEnd 9686311 -MultipartBoundaryBegin 9686311 +MimeEntityEnd 9686310 +MultipartBoundaryBegin 9686310 MultipartBoundaryEnd 9686351 MimeEntityBegin 9686351 MimeEntityHeadersEnd 9686436 -MimeContentBegin 9686436 MultipartPreambleBegin 9686436 MultipartPreambleEnd 9686436 MultipartBoundaryBegin 9686436 MultipartBoundaryEnd 9686478 MimeEntityBegin 9686478 MimeEntityHeadersEnd 9686569 -MimeContentBegin 9686569 -MimeContentEnd 9686640 Octets 71 Lines 2 -MimeEntityEnd 9686641 -MultipartBoundaryBegin 9686641 +MimeEntityEnd 9686640 +MultipartBoundaryBegin 9686640 MultipartBoundaryEnd 9686683 MimeEntityBegin 9686683 MimeEntityHeadersEnd 9686782 -MimeContentBegin 9686782 -MimeContentEnd 9697479 Octets 10697 Lines 158 -MimeEntityEnd 9697480 -MultipartBoundaryBegin 9697480 +MimeEntityEnd 9697479 +MultipartBoundaryBegin 9697479 MultipartBoundaryEnd 9697522 MimeEntityBegin 9697522 MimeEntityHeadersEnd 9697613 -MimeContentBegin 9697613 -MimeContentEnd 9697677 Octets 64 Lines 3 -MimeEntityEnd 9697678 -MultipartBoundaryBegin 9697678 +MimeEntityEnd 9697677 +MultipartBoundaryBegin 9697677 MultipartBoundaryEnd 9697720 MimeEntityBegin 9697720 MimeEntityHeadersEnd 9697813 -MimeContentBegin 9697813 -MimeContentEnd 9703716 Octets 5903 Lines 88 -MimeEntityEnd 9703717 -MultipartBoundaryBegin 9703717 +MimeEntityEnd 9703716 +MultipartBoundaryBegin 9703716 MultipartBoundaryEnd 9703759 MimeEntityBegin 9703759 MimeEntityHeadersEnd 9703850 -MimeContentBegin 9703850 -MimeContentEnd 9703883 Octets 33 Lines 3 -MimeEntityEnd 9703884 -MultipartBoundaryBegin 9703884 +MimeEntityEnd 9703883 +MultipartBoundaryBegin 9703883 MultipartBoundaryEnd 9703926 MimeEntityBegin 9703926 MimeEntityHeadersEnd 9704027 -MimeContentBegin 9704027 -MimeContentEnd 9715673 Octets 11646 Lines 171 -MimeEntityEnd 9715674 -MultipartBoundaryBegin 9715674 +MimeEntityEnd 9715673 +MultipartBoundaryBegin 9715673 MultipartBoundaryEnd 9715716 MimeEntityBegin 9715716 MimeEntityHeadersEnd 9715807 -MimeContentBegin 9715807 -MimeContentEnd 9715838 Octets 31 Lines 3 -MimeEntityEnd 9715839 -MultipartEndBoundaryBegin 9715839 +MimeEntityEnd 9715838 +MultipartEndBoundaryBegin 9715838 MultipartEndBoundaryEnd 9715882 MultipartEpilogueBegin 9715882 MultipartEpilogueEnd 9715883 -MimeContentEnd 9715884 -Octets 29448 +Octets 29447 Lines 461 -MimeEntityEnd 9715884 -MultipartEndBoundaryBegin 9715884 +MimeEntityEnd 9715883 +MultipartEndBoundaryBegin 9715883 MultipartEndBoundaryEnd 9715925 MultipartEpilogueBegin 9715925 MultipartEpilogueEnd 9715925 -MimeContentEnd 9715926 -Octets 30269 +Octets 30268 Lines 480 -MimeEntityEnd 9715926 -MimeMessageEnd 9715926 +MimeEntityEnd 9715925 +MimeMessageEnd 9715925 MboxMarkerBegin 9715926 MboxMarkerEnd 9715933 MimeMessageBegin 9715934 MimeMessageHeadersEnd 9715990 MimeEntityBegin 9715934 MimeEntityHeadersEnd 9715990 -MimeContentBegin 9715990 -MimeContentEnd 9717198 Octets 1208 Lines 28 -MimeEntityEnd 9717199 -MimeMessageEnd 9717199 +MimeEntityEnd 9717198 +MimeMessageEnd 9717198 MboxMarkerBegin 9717199 MboxMarkerEnd 9717230 MimeMessageBegin 9717231 MimeMessageHeadersEnd 9717382 MimeEntityBegin 9717231 MimeEntityHeadersEnd 9717382 -MimeContentBegin 9717382 -MimeContentEnd 9720490 Octets 3108 Lines 68 -MimeEntityEnd 9720491 -MimeMessageEnd 9720491 +MimeEntityEnd 9720490 +MimeMessageEnd 9720490 MboxMarkerBegin 9720491 MboxMarkerEnd 9720522 MimeMessageBegin 9720523 MimeMessageHeadersEnd 9722388 MimeEntityBegin 9720523 MimeEntityHeadersEnd 9722388 -MimeContentBegin 9722388 MultipartPreambleBegin 9722388 MultipartPreambleEnd 9722388 MultipartBoundaryBegin 9722388 MultipartBoundaryEnd 9722432 MimeEntityBegin 9722432 MimeEntityHeadersEnd 9722510 -MimeContentBegin 9722510 -MimeContentEnd 9723373 Octets 863 Lines 19 -MimeEntityEnd 9723374 -MultipartBoundaryBegin 9723374 +MimeEntityEnd 9723373 +MultipartBoundaryBegin 9723373 MultipartBoundaryEnd 9723418 MimeEntityBegin 9723418 MimeEntityHeadersEnd 9723579 -MimeContentBegin 9723579 -MimeContentEnd 9727220 Octets 3641 Lines 62 -MimeEntityEnd 9727221 -MultipartEndBoundaryBegin 9727221 +MimeEntityEnd 9727220 +MultipartEndBoundaryBegin 9727220 MultipartEndBoundaryEnd 9727266 MultipartEpilogueBegin 9727266 MultipartEpilogueEnd 9727267 -MimeContentEnd 9727268 -Octets 4880 +Octets 4879 Lines 93 -MimeEntityEnd 9727268 -MimeMessageEnd 9727268 +MimeEntityEnd 9727267 +MimeMessageEnd 9727267 MboxMarkerBegin 9727268 MboxMarkerEnd 9727275 MimeMessageBegin 9727276 MimeMessageHeadersEnd 9727830 MimeEntityBegin 9727276 MimeEntityHeadersEnd 9727830 -MimeContentBegin 9727830 MultipartPreambleBegin 9727830 MultipartPreambleEnd 9727831 MultipartBoundaryBegin 9727831 MultipartBoundaryEnd 9727847 MimeEntityBegin 9727847 MimeEntityHeadersEnd 9727874 -MimeContentBegin 9727874 -MimeContentEnd 9728837 Octets 963 Lines 20 -MimeEntityEnd 9728838 -MultipartBoundaryBegin 9728838 +MimeEntityEnd 9728837 +MultipartBoundaryBegin 9728837 MultipartBoundaryEnd 9728854 MimeEntityBegin 9728854 MimeEntityHeadersEnd 9728914 -MimeContentBegin 9728914 -MimeContentEnd 9844640 Octets 115726 Lines 1587 -MimeEntityEnd 9844641 -MultipartEndBoundaryBegin 9844641 +MimeEntityEnd 9844640 +MultipartEndBoundaryBegin 9844640 MultipartEndBoundaryEnd 9844658 MultipartEpilogueBegin 9844658 MultipartEpilogueEnd 9844660 -MimeContentEnd 9844661 -Octets 116831 +Octets 116830 Lines 1618 -MimeEntityEnd 9844661 -MimeMessageEnd 9844661 +MimeEntityEnd 9844660 +MimeMessageEnd 9844660 MboxMarkerBegin 9844661 MboxMarkerEnd 9844668 MimeMessageBegin 9844669 MimeMessageHeadersEnd 9845465 MimeEntityBegin 9844669 MimeEntityHeadersEnd 9845465 -MimeContentBegin 9845465 MultipartPreambleBegin 9845465 MultipartPreambleEnd 9845620 MultipartBoundaryBegin 9845620 MultipartBoundaryEnd 9845660 MimeEntityBegin 9845660 MimeEntityHeadersEnd 9845704 -MimeContentBegin 9845704 -MimeContentEnd 9854667 Octets 8963 Lines 350 -MimeEntityEnd 9854668 -MultipartBoundaryBegin 9854668 +MimeEntityEnd 9854667 +MultipartBoundaryBegin 9854667 MultipartBoundaryEnd 9854708 MimeEntityBegin 9854708 MimeEntityHeadersEnd 9854793 -MimeContentBegin 9854793 MultipartPreambleBegin 9854793 MultipartPreambleEnd 9854793 MultipartBoundaryBegin 9854793 MultipartBoundaryEnd 9854835 MimeEntityBegin 9854835 MimeEntityHeadersEnd 9854926 -MimeContentBegin 9854926 -MimeContentEnd 9857701 Octets 2775 Lines 70 -MimeEntityEnd 9857702 -MultipartBoundaryBegin 9857702 +MimeEntityEnd 9857701 +MultipartBoundaryBegin 9857701 MultipartBoundaryEnd 9857744 MimeEntityBegin 9857744 MimeEntityHeadersEnd 9857940 -MimeContentBegin 9857940 MimeMessageBegin 9857940 -MimeMessageHeadersEnd 9857967 MimeEntityBegin 9857940 MimeEntityHeadersEnd 9857967 -MimeContentBegin 9857967 -MimeContentEnd 9857969 +MimeMessageHeadersEnd 9857967 Octets 2 Lines 3 -MimeEntityEnd 9857970 -MimeMessageEnd 9857970 -MimeContentEnd 9857970 -Octets 30 +MimeEntityEnd 9857969 +MimeMessageEnd 9857969 +Octets 29 Lines 5 -MimeEntityEnd 9857970 -MultipartBoundaryBegin 9857970 +MimeEntityEnd 9857969 +MultipartBoundaryBegin 9857969 MultipartBoundaryEnd 9858012 MimeEntityBegin 9858012 MimeEntityHeadersEnd 9858103 -MimeContentBegin 9858103 -MimeContentEnd 9859077 Octets 974 Lines 23 -MimeEntityEnd 9859078 -MultipartBoundaryBegin 9859078 +MimeEntityEnd 9859077 +MultipartBoundaryBegin 9859077 MultipartBoundaryEnd 9859120 MimeEntityBegin 9859120 MimeEntityHeadersEnd 9859236 -MimeContentBegin 9859236 -MimeContentEnd 9859595 Octets 359 Lines 16 -MimeEntityEnd 9859596 -MultipartBoundaryBegin 9859596 +MimeEntityEnd 9859595 +MultipartBoundaryBegin 9859595 MultipartBoundaryEnd 9859638 MimeEntityBegin 9859638 MimeEntityHeadersEnd 9859729 -MimeContentBegin 9859729 -MimeContentEnd 9859739 Octets 10 Lines 3 -MimeEntityEnd 9859740 -MultipartBoundaryBegin 9859740 +MimeEntityEnd 9859739 +MultipartBoundaryBegin 9859739 MultipartBoundaryEnd 9859782 MimeEntityBegin 9859782 MimeEntityHeadersEnd 9859967 -MimeContentBegin 9859967 MimeMessageBegin 9859967 -MimeMessageHeadersEnd 9859994 MimeEntityBegin 9859967 MimeEntityHeadersEnd 9859994 -MimeContentBegin 9859994 -MimeContentEnd 9859995 +MimeMessageHeadersEnd 9859994 Octets 1 Lines 2 -MimeEntityEnd 9859996 -MimeMessageEnd 9859996 -MimeContentEnd 9859996 -Octets 29 +MimeEntityEnd 9859995 +MimeMessageEnd 9859995 +Octets 28 Lines 4 -MimeEntityEnd 9859996 -MultipartBoundaryBegin 9859996 +MimeEntityEnd 9859995 +MultipartBoundaryBegin 9859995 MultipartBoundaryEnd 9860038 MimeEntityBegin 9860038 MimeEntityHeadersEnd 9860129 -MimeContentBegin 9860129 -MimeContentEnd 9860139 Octets 10 Lines 3 -MimeEntityEnd 9860140 -MultipartBoundaryBegin 9860140 +MimeEntityEnd 9860139 +MultipartBoundaryBegin 9860139 MultipartBoundaryEnd 9860182 MimeEntityBegin 9860182 MimeEntityHeadersEnd 9860288 -MimeContentBegin 9860288 -MimeContentEnd 9863271 Octets 2983 Lines 44 -MimeEntityEnd 9863272 -MultipartBoundaryBegin 9863272 +MimeEntityEnd 9863271 +MultipartBoundaryBegin 9863271 MultipartBoundaryEnd 9863314 MimeEntityBegin 9863314 MimeEntityHeadersEnd 9863405 -MimeContentBegin 9863405 -MimeContentEnd 9869997 Octets 6592 Lines 261 -MimeEntityEnd 9869998 -MultipartEndBoundaryBegin 9869998 +MimeEntityEnd 9869997 +MultipartEndBoundaryBegin 9869997 MultipartEndBoundaryEnd 9870041 MultipartEpilogueBegin 9870041 MultipartEpilogueEnd 9870042 -MimeContentEnd 9870043 -Octets 15250 +Octets 15249 Lines 476 -MimeEntityEnd 9870043 -MultipartEndBoundaryBegin 9870043 +MimeEntityEnd 9870042 +MultipartEndBoundaryBegin 9870042 MultipartEndBoundaryEnd 9870084 MultipartEpilogueBegin 9870084 MultipartEpilogueEnd 9870085 -MimeContentEnd 9870086 -Octets 24621 +Octets 24620 Lines 838 -MimeEntityEnd 9870086 -MimeMessageEnd 9870086 +MimeEntityEnd 9870085 +MimeMessageEnd 9870085 MboxMarkerBegin 9870086 MboxMarkerEnd 9870093 MimeMessageBegin 9870094 MimeMessageHeadersEnd 9871206 MimeEntityBegin 9870094 MimeEntityHeadersEnd 9871206 -MimeContentBegin 9871206 MultipartPreambleBegin 9871206 MultipartPreambleEnd 9871206 MultipartBoundaryBegin 9871206 MultipartBoundaryEnd 9871216 MimeEntityBegin 9871216 MimeEntityHeadersEnd 9871217 -MimeContentBegin 9871217 -MimeContentEnd 9871550 Octets 333 Lines 9 -MimeEntityEnd 9871551 -MultipartBoundaryBegin 9871551 +MimeEntityEnd 9871550 +MultipartBoundaryBegin 9871550 MultipartBoundaryEnd 9871561 MimeEntityBegin 9871561 MimeEntityHeadersEnd 9871620 -MimeContentBegin 9871620 -MimeContentEnd 9901599 Octets 29979 Lines 412 -MimeEntityEnd 9901600 -MultipartBoundaryBegin 9901600 +MimeEntityEnd 9901599 +MultipartBoundaryBegin 9901599 MultipartBoundaryEnd 9901610 MimeEntityBegin 9901610 MimeEntityHeadersEnd 9901611 -MimeContentBegin 9901611 -MimeContentEnd 9901783 Octets 172 Lines 10 -MimeEntityEnd 9901784 -MultipartEndBoundaryBegin 9901784 +MimeEntityEnd 9901783 +MultipartEndBoundaryBegin 9901783 MultipartEndBoundaryEnd 9901795 MultipartEpilogueBegin 9901795 MultipartEpilogueEnd 9901796 -MimeContentEnd 9901797 -Octets 30591 +Octets 30590 Lines 441 -MimeEntityEnd 9901797 -MimeMessageEnd 9901797 +MimeEntityEnd 9901796 +MimeMessageEnd 9901796 MboxMarkerBegin 9901797 MboxMarkerEnd 9901804 MimeMessageBegin 9901805 MimeMessageHeadersEnd 9903514 MimeEntityBegin 9901805 MimeEntityHeadersEnd 9903514 -MimeContentBegin 9903514 -MimeContentEnd 10086313 Octets 182799 Lines 2952 -MimeEntityEnd 10086314 -MimeMessageEnd 10086314 +MimeEntityEnd 10086313 +MimeMessageEnd 10086313 MboxMarkerBegin 10086314 MboxMarkerEnd 10086321 MimeMessageBegin 10086322 MimeMessageHeadersEnd 10087029 MimeEntityBegin 10086322 MimeEntityHeadersEnd 10087029 -MimeContentBegin 10087029 MultipartPreambleBegin 10087029 MultipartPreambleEnd 10087029 MultipartBoundaryBegin 10087029 MultipartBoundaryEnd 10087056 MimeEntityBegin 10087056 MimeEntityHeadersEnd 10087057 -MimeContentBegin 10087057 -MimeContentEnd 10087078 Octets 21 Lines 1 -MimeEntityEnd 10087079 -MultipartBoundaryBegin 10087079 +MimeEntityEnd 10087078 +MultipartBoundaryBegin 10087078 MultipartBoundaryEnd 10087106 MimeEntityBegin 10087106 MimeEntityHeadersEnd 10087258 -MimeContentBegin 10087258 -MimeContentEnd 10170999 Octets 83741 Lines 434 -MimeEntityEnd 10171000 -MultipartBoundaryBegin 10171000 +MimeEntityEnd 10170999 +MultipartBoundaryBegin 10170999 MultipartBoundaryEnd 10171027 MimeEntityBegin 10171027 MimeEntityHeadersEnd 10171028 -MimeContentBegin 10171028 -MimeContentEnd 10171287 Octets 259 Lines 9 -MimeEntityEnd 10171288 -MultipartEndBoundaryBegin 10171288 +MimeEntityEnd 10171287 +MultipartEndBoundaryBegin 10171287 MultipartEndBoundaryEnd 10171316 MultipartEpilogueBegin 10171316 MultipartEpilogueEnd 10171317 -MimeContentEnd 10171318 -Octets 84289 +Octets 84288 Lines 456 -MimeEntityEnd 10171318 -MimeMessageEnd 10171318 +MimeEntityEnd 10171317 +MimeMessageEnd 10171317 MboxMarkerBegin 10171318 MboxMarkerEnd 10171325 MimeMessageBegin 10171326 MimeMessageHeadersEnd 10171993 MimeEntityBegin 10171326 MimeEntityHeadersEnd 10171993 -MimeContentBegin 10171993 MultipartPreambleBegin 10171993 MultipartPreambleEnd 10171993 MultipartBoundaryBegin 10171993 MultipartBoundaryEnd 10172020 MimeEntityBegin 10172020 MimeEntityHeadersEnd 10172021 -MimeContentBegin 10172021 -MimeContentEnd 10172087 Octets 66 Lines 1 -MimeEntityEnd 10172088 -MultipartBoundaryBegin 10172088 +MimeEntityEnd 10172087 +MultipartBoundaryBegin 10172087 MultipartBoundaryEnd 10172115 MimeEntityBegin 10172115 MimeEntityHeadersEnd 10172276 -MimeContentBegin 10172276 -MimeContentEnd 10204442 Octets 32166 Lines 167 -MimeEntityEnd 10204443 -MultipartBoundaryBegin 10204443 +MimeEntityEnd 10204442 +MultipartBoundaryBegin 10204442 MultipartBoundaryEnd 10204470 MimeEntityBegin 10204470 MimeEntityHeadersEnd 10204471 -MimeContentBegin 10204471 -MimeContentEnd 10204488 Octets 17 Lines 2 -MimeEntityEnd 10204489 -MultipartBoundaryBegin 10204489 +MimeEntityEnd 10204488 +MultipartBoundaryBegin 10204488 MultipartBoundaryEnd 10204516 MimeEntityBegin 10204516 MimeEntityHeadersEnd 10204675 -MimeContentBegin 10204675 -MimeContentEnd 10205760 Octets 1085 Lines 6 -MimeEntityEnd 10205761 -MultipartBoundaryBegin 10205761 +MimeEntityEnd 10205760 +MultipartBoundaryBegin 10205760 MultipartBoundaryEnd 10205788 MimeEntityBegin 10205788 MimeEntityHeadersEnd 10205789 -MimeContentBegin 10205789 -MimeContentEnd 10205819 Octets 30 Lines 3 -MimeEntityEnd 10205820 -MultipartBoundaryBegin 10205820 +MimeEntityEnd 10205819 +MultipartBoundaryBegin 10205819 MultipartBoundaryEnd 10205847 MimeEntityBegin 10205847 MimeEntityHeadersEnd 10205915 -MimeContentBegin 10205915 -MimeContentEnd 10391952 Octets 186037 Lines 1991 -MimeEntityEnd 10391953 -MultipartBoundaryBegin 10391953 +MimeEntityEnd 10391952 +MultipartBoundaryBegin 10391952 MultipartBoundaryEnd 10391980 MimeEntityBegin 10391980 MimeEntityHeadersEnd 10391981 -MimeContentBegin 10391981 -MimeContentEnd 10391989 Octets 8 Lines 1 -MimeEntityEnd 10391990 -MultipartEndBoundaryBegin 10391990 +MimeEntityEnd 10391989 +MultipartEndBoundaryBegin 10391989 MultipartEndBoundaryEnd 10392018 MultipartEpilogueBegin 10392018 MultipartEpilogueEnd 10392019 -MimeContentEnd 10392020 -Octets 220027 +Octets 220026 Lines 2197 -MimeEntityEnd 10392020 -MimeMessageEnd 10392020 +MimeEntityEnd 10392019 +MimeMessageEnd 10392019 MboxMarkerBegin 10392020 MboxMarkerEnd 10392027 MimeMessageBegin 10392028 MimeMessageHeadersEnd 10392292 MimeEntityBegin 10392028 MimeEntityHeadersEnd 10392292 -MimeContentBegin 10392292 -MimeContentEnd 10466950 Octets 74658 Lines 1023 -MimeEntityEnd 10466951 -MimeMessageEnd 10466951 +MimeEntityEnd 10466950 +MimeMessageEnd 10466950 MboxMarkerBegin 10466951 MboxMarkerEnd 10466958 MimeMessageBegin 10466959 MimeMessageHeadersEnd 10468233 MimeEntityBegin 10466959 MimeEntityHeadersEnd 10468233 -MimeContentBegin 10468233 MultipartPreambleBegin 10468233 MultipartPreambleEnd 10468759 MultipartBoundaryBegin 10468759 MultipartBoundaryEnd 10468817 MimeEntityBegin 10468817 MimeEntityHeadersEnd 10468818 -MimeContentBegin 10468818 -MimeContentEnd 10470665 Octets 1847 Lines 35 -MimeEntityEnd 10470666 -MultipartBoundaryBegin 10470666 +MimeEntityEnd 10470665 +MultipartBoundaryBegin 10470665 MultipartBoundaryEnd 10470724 MimeEntityBegin 10470724 MimeEntityHeadersEnd 10470827 -MimeContentBegin 10470827 MultipartPreambleBegin 10470827 MultipartPreambleEnd 10470827 MultipartBoundaryBegin 10470827 MultipartBoundaryEnd 10470887 MimeEntityBegin 10470887 MimeEntityHeadersEnd 10470960 -MimeContentBegin 10470960 -MimeContentEnd 10472959 Octets 1999 Lines 30 -MimeEntityEnd 10472960 -MultipartBoundaryBegin 10472960 +MimeEntityEnd 10472959 +MultipartBoundaryBegin 10472959 MultipartBoundaryEnd 10473020 MimeEntityBegin 10473020 MimeEntityHeadersEnd 10473079 -MimeContentBegin 10473079 -MimeContentEnd 10481008 Octets 7929 Lines 110 -MimeEntityEnd 10481009 -MultipartBoundaryBegin 10481009 +MimeEntityEnd 10481008 +MultipartBoundaryBegin 10481008 MultipartBoundaryEnd 10481069 MimeEntityBegin 10481069 MimeEntityHeadersEnd 10481139 -MimeContentBegin 10481139 -MimeContentEnd 10481142 Octets 3 Lines 3 -MimeEntityEnd 10481143 -MultipartBoundaryBegin 10481143 +MimeEntityEnd 10481142 +MultipartBoundaryBegin 10481142 MultipartBoundaryEnd 10481203 MimeEntityBegin 10481203 MimeEntityHeadersEnd 10481296 -MimeContentBegin 10481296 -MimeContentEnd 10523174 Octets 41878 Lines 575 -MimeEntityEnd 10523175 -MultipartEndBoundaryBegin 10523175 +MimeEntityEnd 10523174 +MultipartEndBoundaryBegin 10523174 MultipartEndBoundaryEnd 10523236 MultipartEpilogueBegin 10523236 MultipartEpilogueEnd 10523237 -MimeContentEnd 10523238 -Octets 52411 +Octets 52410 Lines 737 -MimeEntityEnd 10523238 -MultipartEndBoundaryBegin 10523238 +MimeEntityEnd 10523237 +MultipartEndBoundaryBegin 10523237 MultipartEndBoundaryEnd 10523297 MultipartEpilogueBegin 10523297 MultipartEpilogueEnd 10523298 -MimeContentEnd 10523299 -Octets 55066 +Octets 55065 Lines 788 -MimeEntityEnd 10523299 -MimeMessageEnd 10523299 +MimeEntityEnd 10523298 +MimeMessageEnd 10523298 MboxMarkerBegin 10523299 MboxMarkerEnd 10523306 MimeMessageBegin 10523307 MimeMessageHeadersEnd 10523459 MimeEntityBegin 10523307 MimeEntityHeadersEnd 10523459 -MimeContentBegin 10523459 -MimeContentEnd 10528262 Octets 4803 Lines 68 -MimeEntityEnd 10528263 -MimeMessageEnd 10528263 +MimeEntityEnd 10528262 +MimeMessageEnd 10528262 MboxMarkerBegin 10528263 MboxMarkerEnd 10528270 MimeMessageBegin 10528271 MimeMessageHeadersEnd 10529016 MimeEntityBegin 10528271 MimeEntityHeadersEnd 10529016 -MimeContentBegin 10529016 MultipartPreambleBegin 10529016 MultipartPreambleEnd 10529355 MultipartBoundaryBegin 10529355 MultipartBoundaryEnd 10529395 MimeEntityBegin 10529395 MimeEntityHeadersEnd 10529396 -MimeContentBegin 10529396 -MimeContentEnd 10529764 Octets 368 Lines 9 -MimeEntityEnd 10529765 -MultipartBoundaryBegin 10529765 +MimeEntityEnd 10529764 +MultipartBoundaryBegin 10529764 MultipartBoundaryEnd 10529805 MimeEntityBegin 10529805 MimeEntityHeadersEnd 10529890 -MimeContentBegin 10529890 MultipartPreambleBegin 10529890 MultipartPreambleEnd 10529890 MultipartBoundaryBegin 10529890 MultipartBoundaryEnd 10529932 MimeEntityBegin 10529932 MimeEntityHeadersEnd 10530002 -MimeContentBegin 10530002 -MimeContentEnd 10530091 Octets 89 Lines 5 -MimeEntityEnd 10530092 -MultipartBoundaryBegin 10530092 +MimeEntityEnd 10530091 +MultipartBoundaryBegin 10530091 MultipartBoundaryEnd 10530134 MimeEntityBegin 10530134 MimeEntityHeadersEnd 10530248 -MimeContentBegin 10530248 -MimeContentEnd 10535911 Octets 5663 Lines 84 -MimeEntityEnd 10535912 -MultipartBoundaryBegin 10535912 +MimeEntityEnd 10535911 +MultipartBoundaryBegin 10535911 MultipartBoundaryEnd 10535954 MimeEntityBegin 10535954 MimeEntityHeadersEnd 10536024 -MimeContentBegin 10536024 -MimeContentEnd 10536227 Octets 203 Lines 7 -MimeEntityEnd 10536228 -MultipartEndBoundaryBegin 10536228 +MimeEntityEnd 10536227 +MultipartEndBoundaryBegin 10536227 MultipartEndBoundaryEnd 10536271 MultipartEpilogueBegin 10536271 MultipartEpilogueEnd 10536272 -MimeContentEnd 10536273 -Octets 6383 +Octets 6382 Lines 111 -MimeEntityEnd 10536273 -MultipartEndBoundaryBegin 10536273 +MimeEntityEnd 10536272 +MultipartEndBoundaryBegin 10536272 MultipartEndBoundaryEnd 10536314 MultipartEpilogueBegin 10536314 MultipartEpilogueEnd 10536315 -MimeContentEnd 10536315 -Octets 7299 +Octets 7298 Lines 133 -MimeEntityEnd 10536315 -MimeMessageEnd 10536315 +MimeEntityEnd 10536314 +MimeMessageEnd 10536314 From 8d1adae077f712f480a915621b7bb2de9cbdc20a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 09:41:29 -0400 Subject: [PATCH 643/741] Updated code to use CultureInfo.InvariantCulture when formatting ints --- MimeKit/ContentDisposition.cs | 9 +-- MimeKit/ContentType.cs | 9 +-- MimeKit/Cryptography/ArcVerifier.cs | 18 +++--- MimeKit/Cryptography/AuthenticationResults.cs | 64 +++++++++---------- MimeKit/Cryptography/OpenPgpContextBase.cs | 3 +- .../Cryptography/OpenPgpDigitalSignature.cs | 3 +- .../SecureMimeDigitalSignature.cs | 2 +- MimeKit/DomainList.cs | 3 +- MimeKit/GroupAddress.cs | 9 +-- MimeKit/IO/MemoryBlockStream.cs | 7 +- MimeKit/InternetAddress.cs | 59 ++++++++--------- MimeKit/MailboxAddress.cs | 11 ++-- MimeKit/ParameterList.cs | 17 ++--- MimeKit/Tnef/TnefReader.cs | 5 +- MimeKit/Utils/DateUtils.cs | 3 +- MimeKit/Utils/ParseUtils.cs | 20 +++--- UnitTests/AssortedTests.cs | 11 ++-- UnitTests/MimeVisitorTests.cs | 3 +- UnitTests/Tnef/TnefTests.cs | 3 +- 19 files changed, 137 insertions(+), 122 deletions(-) diff --git a/MimeKit/ContentDisposition.cs b/MimeKit/ContentDisposition.cs index 9912153b92..cafcfe88d2 100644 --- a/MimeKit/ContentDisposition.cs +++ b/MimeKit/ContentDisposition.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Globalization; using MimeKit.Utils; @@ -440,7 +441,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Expected atom token at position {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Expected atom token at position {0}", index), index, index); return false; } @@ -448,7 +449,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index atom = index; if (text[index] == '"') { if (throwOnError) - throw new ParseException (string.Format ("Unxpected qstring token at position {0}", atom), atom, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unxpected qstring token at position {0}", atom), atom, index); // Note: This is a work-around for broken mailers that quote the disposition value... // @@ -464,7 +465,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } else { if (!ParseUtils.SkipAtom (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid atom token at position {0}", atom), atom, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid atom token at position {0}", atom), atom, index); // Note: this is a work-around for broken mailers that do not specify a disposition value... // @@ -489,7 +490,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (text[index] != (byte) ';') { if (throwOnError) - throw new ParseException (string.Format ("Expected ';' at position {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Expected ';' at position {0}", index), index, index); return false; } diff --git a/MimeKit/ContentType.cs b/MimeKit/ContentType.cs index 02244daf94..0c0ab73ed9 100644 --- a/MimeKit/ContentType.cs +++ b/MimeKit/ContentType.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Globalization; using MimeKit.Utils; @@ -411,7 +412,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index start = index; if (!SkipType (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid type token at position {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid type token at position {0}", start), start, index); return false; } @@ -423,7 +424,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (index >= endIndex || text[index] != (byte) '/') { if (throwOnError) - throw new ParseException (string.Format ("Expected '/' at position {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Expected '/' at position {0}", index), index, index); return false; } @@ -437,7 +438,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index start = index; if (!ParseUtils.SkipToken (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid atom token at position {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid atom token at position {0}", start), start, index); return false; } @@ -454,7 +455,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (text[index] != (byte) ';') { if (throwOnError) - throw new ParseException (string.Format ("Expected ';' at position {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Expected ';' at position {0}", index), index, index); return false; } diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 982929ffc9..22dd0bb500 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -287,7 +287,7 @@ static void ValidateArcSealParameters (IDictionary parameters, o ValidateCommonParameters ("ARC-Seal", parameters, out algorithm, out d, out s, out q, out b); if (parameters.TryGetValue ("h", out string h)) - throw new FormatException (string.Format ("Malformed ARC-Seal header: the 'h' parameter tag is not allowed.")); + throw new FormatException ("Malformed ARC-Seal header: the 'h' parameter tag is not allowed."); } async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMessage message, Header arcSignature, Dictionary parameters, bool doAsync, CancellationToken cancellationToken) @@ -429,7 +429,7 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (instance < 1 || instance > 50) { if (throwOnError) - throw new FormatException (string.Format ("Invalid instance tag in ARC-Authentication-Results header: i={0}", instance)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Invalid instance tag in ARC-Authentication-Results header: i={0}", instance)); return ArcSignatureValidationResult.Fail; } @@ -447,14 +447,14 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (!parameters.TryGetValue ("i", out value)) { if (throwOnError) - throw new FormatException (string.Format ("Missing instance tag in {0} header.", header.Id.ToHeaderName ())); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing instance tag in {0} header.", header.Id.ToHeaderName ())); return ArcSignatureValidationResult.Fail; } if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out instance) || instance < 1 || instance > 50) { if (throwOnError) - throw new FormatException (string.Format ("Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); return ArcSignatureValidationResult.Fail; } @@ -489,35 +489,35 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (set == null) { if (throwOnError) - throw new FormatException (string.Format ("Missing ARC headers for i={0}", i + 1)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC headers for i={0}", i + 1)); return ArcSignatureValidationResult.Fail; } if (set.ArcAuthenticationResult == null) { if (throwOnError) - throw new FormatException (string.Format ("Missing ARC-Authentication-Results header for i={0}", i + 1)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC-Authentication-Results header for i={0}", i + 1)); return ArcSignatureValidationResult.Fail; } if (set.ArcMessageSignature == null) { if (throwOnError) - throw new FormatException (string.Format ("Missing ARC-Message-Signature header for i={0}", i + 1)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC-Message-Signature header for i={0}", i + 1)); return ArcSignatureValidationResult.Fail; } if (set.ArcSeal == null) { if (throwOnError) - throw new FormatException (string.Format ("Missing ARC-Seal header for i={0}", i + 1)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC-Seal header for i={0}", i + 1)); return ArcSignatureValidationResult.Fail; } if (!set.ArcSealParameters.TryGetValue ("cv", out string cv)) { if (throwOnError) - throw new FormatException (string.Format ("Missing chain validation tag in ARC-Seal header for i={0}.", i + 1)); + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing chain validation tag in ARC-Seal header for i={0}.", i + 1)); return ArcSignatureValidationResult.Fail; } diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index f2ea9c1918..5a5c78f31e 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -347,7 +347,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro // skip the method name if (!SkipKeyword (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid method token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid method token at offset {0}", methodIndex), methodIndex, index); return false; } @@ -361,7 +361,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!SkipDomain (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid Office365 authserv-id token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid Office365 authserv-id token at offset {0}", methodIndex), methodIndex, index); return false; } @@ -373,14 +373,14 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Missing semi-colon after Office365 authserv-id token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Missing semi-colon after Office365 authserv-id token at offset {0}", methodIndex), methodIndex, index); return false; } if (text[index] != (byte) ';') { if (throwOnError) - throw new ParseException (string.Format ("Unexpected token after Office365 authserv-id token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token after Office365 authserv-id token at offset {0}", index), index, index); return false; } @@ -399,14 +399,14 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (method != "none") { if (throwOnError) - throw new ParseException (string.Format ("Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); return false; } if (authres.Results.Count > 0) { if (throwOnError) - throw new ParseException (string.Format ("Invalid no-result token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid no-result token at offset {0}", methodIndex), methodIndex, index); return false; } @@ -431,7 +431,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int version)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid method-version token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid method-version token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -443,7 +443,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); return false; } @@ -451,7 +451,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (text[index] != (byte) '=') { if (throwOnError) - throw new ParseException (string.Format ("Invalid methodspec token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid methodspec token at offset {0}", methodIndex), methodIndex, index); return false; } @@ -464,7 +464,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete methodspec token at offset {0}", methodIndex), methodIndex, index); return false; } @@ -473,7 +473,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!SkipKeyword (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid result token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid result token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -487,7 +487,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!ParseUtils.SkipComment (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete comment token at offset {0}", commentIndex), commentIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete comment token at offset {0}", commentIndex), commentIndex, index); return false; } @@ -513,7 +513,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!SkipKeyword (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid reasonspec or propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid reasonspec or propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -526,14 +526,14 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete {0}spec token at offset {1}", value, tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete {0}spec token at offset {1}", value, tokenIndex), tokenIndex, index); return false; } if (text[index] != (byte) '=') { if (throwOnError) - throw new ParseException (string.Format ("Invalid {0}spec token at offset {1}", value, tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid {0}spec token at offset {1}", value, tokenIndex), tokenIndex, index); return false; } @@ -547,7 +547,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid {0}spec value token at offset {1}", value, reasonIndex), reasonIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid {0}spec value token at offset {1}", value, reasonIndex), reasonIndex, index); return false; } @@ -578,7 +578,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!SkipKeyword (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -595,14 +595,14 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } if (text[index] != (byte) '.') { if (throwOnError) - throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -614,7 +614,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -623,7 +623,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!SkipKeyword (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid property token at offset {0}", propertyIndex), propertyIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid property token at offset {0}", propertyIndex), propertyIndex, index); return false; } @@ -635,14 +635,14 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } if (text[index] != (byte) '=') { if (throwOnError) - throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -656,7 +656,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (index >= text.Length || !SkipPropertyValue (text, ref index, endIndex, out quoted)) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -679,7 +679,7 @@ static bool TryParseMethods (byte[] text, ref int index, int endIndex, bool thro if (!SkipKeyword (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid propspec token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -711,7 +711,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (index >= endIndex || !SkipValue (text, ref index, endIndex, out quoted)) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete authserv-id token at offset {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete authserv-id token at offset {0}", start), start, index); return false; } @@ -730,7 +730,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro // probably i=# if (instance.HasValue) { if (throwOnError) - throw new ParseException (string.Format ("Invalid token at offset {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid token at offset {0}", start), start, index); return false; } @@ -758,7 +758,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int i)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid instance value at offset {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid instance value at offset {0}", start), start, index); return false; } @@ -770,14 +770,14 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Missing semi-colon after instance value at offset {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Missing semi-colon after instance value at offset {0}", start), start, index); return false; } if (text[index] != (byte) ';') { if (throwOnError) - throw new ParseException (string.Format ("Unexpected token after instance value at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token after instance value at offset {0}", index), index, index); return false; } @@ -807,7 +807,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (!ParseUtils.TryParseInt32 (text, ref index, endIndex, out int version)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid authres-version at offset {0}", start), start, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid authres-version at offset {0}", start), start, index); return false; } @@ -822,7 +822,7 @@ static bool TryParse (byte[] text, ref int index, int endIndex, bool throwOnErro if (text[index] != (byte) ';') { if (throwOnError) - throw new ParseException (string.Format ("Unknown token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unknown token at offset {0}", index), index, index); return false; } diff --git a/MimeKit/Cryptography/OpenPgpContextBase.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs index 5a9b8a843a..237c55c4d6 100644 --- a/MimeKit/Cryptography/OpenPgpContextBase.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -32,6 +32,7 @@ using System.Net.Http; using System.Threading; using System.Diagnostics; +using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; @@ -579,7 +580,7 @@ async Task RetrievePublicKeyRingAsync (long keyId, bool doAsyn } uri.Path = "/pks/lookup"; - uri.Query = string.Format ("op=get&search=0x{0:X}", keyId); + uri.Query = string.Format (CultureInfo.InvariantCulture, "op=get&search=0x{0:X}", keyId); using (var stream = new MemoryBlockStream ()) { using (var filtered = new FilteredStream (stream)) { diff --git a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs index 63073ff3c3..f74e079af3 100644 --- a/MimeKit/Cryptography/OpenPgpDigitalSignature.cs +++ b/MimeKit/Cryptography/OpenPgpDigitalSignature.cs @@ -25,6 +25,7 @@ // using System; +using System.Globalization; using Org.BouncyCastle.Bcpg.OpenPgp; @@ -125,7 +126,7 @@ public bool Verify () throw vex; if (SignerCertificate == null) { - var message = string.Format ("Failed to verify digital signature: no public key found for {0:X8}", (int) Signature.KeyId); + var message = string.Format (CultureInfo.InvariantCulture, "Failed to verify digital signature: no public key found for {0:X8}", (int) Signature.KeyId); vex = new DigitalSignatureVerifyException (Signature.KeyId, message); throw vex; } diff --git a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs index 61c3f8c302..9739810f8c 100644 --- a/MimeKit/Cryptography/SecureMimeDigitalSignature.cs +++ b/MimeKit/Cryptography/SecureMimeDigitalSignature.cs @@ -235,7 +235,7 @@ public bool Verify (bool verifySignatureOnly) throw vex; if (SignerCertificate == null) { - var message = string.Format ("Failed to verify digital signature: missing certificate."); + var message = "Failed to verify digital signature: missing certificate."; vex = new DigitalSignatureVerifyException (message); throw vex; } diff --git a/MimeKit/DomainList.cs b/MimeKit/DomainList.cs index 778960781e..14d4e33f65 100644 --- a/MimeKit/DomainList.cs +++ b/MimeKit/DomainList.cs @@ -27,6 +27,7 @@ using System; using System.Text; using System.Collections; +using System.Globalization; using System.Collections.Generic; using MimeKit.Utils; @@ -418,7 +419,7 @@ internal static bool TryParse (byte[] buffer, ref int index, int endIndex, bool if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete domain-list at offset: {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete domain-list at offset: {0}", startIndex), startIndex, index); return false; } diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 3f29dc4d2e..745ebad150 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -27,6 +27,7 @@ using System; using System.Linq; using System.Text; +using System.Globalization; using System.Collections.Generic; using MimeKit.Utils; @@ -529,7 +530,7 @@ public static bool TryParse (string text, out GroupAddress group) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return group; } @@ -596,7 +597,7 @@ public static bool TryParse (string text, out GroupAddress group) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return group; } @@ -657,7 +658,7 @@ public static bool TryParse (string text, out GroupAddress group) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return group; } @@ -719,7 +720,7 @@ public static bool TryParse (string text, out GroupAddress group) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return group; } diff --git a/MimeKit/IO/MemoryBlockStream.cs b/MimeKit/IO/MemoryBlockStream.cs index 0f3e6a0f5b..441f5123b8 100644 --- a/MimeKit/IO/MemoryBlockStream.cs +++ b/MimeKit/IO/MemoryBlockStream.cs @@ -27,9 +27,10 @@ using System; using System.IO; using System.Threading; +using System.Diagnostics; +using System.Globalization; using System.Threading.Tasks; using System.Collections.Generic; -using System.Diagnostics; using MimeKit.Utils; @@ -326,7 +327,7 @@ public override void Write (byte[] buffer, int offset, int count) ValidateArguments (buffer, offset, count); if (position + count >= MaxCapacity) - throw new IOException (string.Format ("Cannot exceed {0} bytes", MaxCapacity)); + throw new IOException (string.Format (CultureInfo.InvariantCulture, "Cannot exceed {0} bytes", MaxCapacity)); int startIndex = (int) (position % BlockSize); long capacity = blocks.Count * BlockSize; @@ -433,7 +434,7 @@ public override long Seek (long offset, SeekOrigin origin) throw new IOException ("Cannot seek to a position before the beginning of the stream"); if (real > MaxCapacity) - throw new IOException (string.Format ("Cannot exceed {0} bytes", MaxCapacity)); + throw new IOException (string.Format (CultureInfo.InvariantCulture, "Cannot exceed {0} bytes", MaxCapacity)); // short-cut if we are seeking to our current position if (real == position) diff --git a/MimeKit/InternetAddress.cs b/MimeKit/InternetAddress.cs index d71fc2b21f..e1dcc76420 100644 --- a/MimeKit/InternetAddress.cs +++ b/MimeKit/InternetAddress.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Globalization; using System.Collections.Generic; using MimeKit.Utils; @@ -306,7 +307,7 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex do { if (!text[index].IsAtom () && text[index] != '"') { if (throwOnError) - throw new ParseException (string.Format ("Invalid local-part at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid local-part at offset {0}", startIndex), startIndex, index); return false; } @@ -346,7 +347,7 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete local-part at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete local-part at offset {0}", startIndex), startIndex, index); return false; } @@ -380,7 +381,7 @@ internal static bool TryParseAddrspec (byte[] text, ref int index, int endIndex, if (text[index] != (byte) '@') { if (throwOnError) - throw new ParseException (string.Format ("Invalid addr-spec token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid addr-spec token at offset {0}", startIndex), startIndex, index); return false; } @@ -388,7 +389,7 @@ internal static bool TryParseAddrspec (byte[] text, ref int index, int endIndex, index++; if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); return false; } @@ -398,7 +399,7 @@ internal static bool TryParseAddrspec (byte[] text, ref int index, int endIndex, if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); return false; } @@ -436,7 +437,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st if (index < endIndex && text[index] == (byte) '<') { if (options.AddressParserComplianceMode == RfcComplianceMode.Strict) { if (throwOnError) - throw new ParseException (string.Format ("Excessive angle brackets at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Excessive angle brackets at offset {0}", index), startIndex, index); return false; } @@ -451,7 +452,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete mailbox at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete mailbox at offset {0}", startIndex), startIndex, index); return false; } @@ -460,14 +461,14 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st // Note: we always pass 'false' as the throwOnError argument here so that we can throw a more informative exception on error if (!DomainList.TryParse (text, ref index, endIndex, false, out route)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid route in mailbox at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid route in mailbox at offset {0}", startIndex), startIndex, index); return false; } if (index >= endIndex || text[index] != (byte) ':') { if (throwOnError) - throw new ParseException (string.Format ("Incomplete route in mailbox at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete route in mailbox at offset {0}", startIndex), startIndex, index); return false; } @@ -480,7 +481,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete mailbox at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete mailbox at offset {0}", startIndex), startIndex, index); return false; } @@ -503,7 +504,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st if (index >= endIndex || text[index] != (byte) '>') { if (options.AddressParserComplianceMode == RfcComplianceMode.Strict) { if (throwOnError) - throw new ParseException (string.Format ("Unexpected end of mailbox at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected end of mailbox at offset {0}", startIndex), startIndex, index); return false; } @@ -515,7 +516,7 @@ internal static bool TryParseMailbox (ParserOptions options, byte[] text, int st if (index < endIndex && text[index] == (byte) '>') { if (options.AddressParserComplianceMode == RfcComplianceMode.Strict) { if (throwOnError) - throw new ParseException (string.Format ("Excessive angle brackets at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Excessive angle brackets at offset {0}", index), startIndex, index); return false; } @@ -560,7 +561,7 @@ static bool TryParseGroup (ParserOptions options, byte[] text, int startIndex, r if (index >= endIndex || text[index] != (byte) ';') { if (throwOnError && options.AddressParserComplianceMode == RfcComplianceMode.Strict) - throw new ParseException (string.Format ("Expected to find ';' at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Expected to find ';' at offset {0}", index), startIndex, index); while (index < endIndex && text[index] != (byte) ';') index++; @@ -619,7 +620,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (!ParseUtils.SkipPhraseAtom (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete quoted-string token at offset {0}", qstringIndex), qstringIndex, endIndex); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete quoted-string token at offset {0}", qstringIndex), qstringIndex, endIndex); break; } @@ -674,14 +675,14 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if ((flags & AddressParserFlags.AllowMailboxAddress) == 0) { if (throwOnError) - throw new ParseException (string.Format ("Addr-spec token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Addr-spec token at offset {0}", startIndex), startIndex, index); return false; } if (!options.AllowAddressesWithoutDomain) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete addr-spec token at offset {0}", startIndex), startIndex, index); return false; } @@ -710,7 +711,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (index < endIndex && text[index] == (byte) '>') { if (strict) { if (throwOnError) - throw new ParseException (string.Format ("Unexpected '>' token at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected '>' token at offset {0}", index), startIndex, index); return false; } @@ -720,7 +721,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (index < endIndex && text[index] != sentinel) { if (throwOnError) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), startIndex, index); return false; } @@ -738,14 +739,14 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if ((flags & AddressParserFlags.AllowGroupAddress) == 0) { if (throwOnError) - throw new ParseException (string.Format ("Group address token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Group address token at offset {0}", startIndex), startIndex, index); return false; } if (groupDepth >= options.MaxAddressGroupDepth) { if (throwOnError) - throw new ParseException (string.Format ("Exceeded maximum rfc822 group depth at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Exceeded maximum rfc822 group depth at offset {0}", startIndex), startIndex, index); return false; } @@ -769,7 +770,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if ((flags & AddressParserFlags.AllowMailboxAddress) == 0) { if (throwOnError) - throw new ParseException (string.Format ("Mailbox address token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Mailbox address token at offset {0}", startIndex), startIndex, index); return false; } @@ -792,7 +793,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (!ParseUtils.SkipComment (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete comment token at offset {0}", comment), comment, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete comment token at offset {0}", comment), comment, index); return false; } @@ -816,7 +817,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index // We have an address like "user@example.com "; i.e. the name is an unquoted string with an '@'. if (strict) { if (throwOnError) - throw new ParseException (string.Format ("Unexpected '<' token at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected '<' token at offset {0}", index), startIndex, index); return false; } @@ -834,7 +835,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (text[index] == (byte) '>') { if (strict) { if (throwOnError) - throw new ParseException (string.Format ("Unexpected '>' token at offset {0}", index), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected '>' token at offset {0}", index), startIndex, index); return false; } @@ -872,7 +873,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index } if (throwOnError) - throw new ParseException (string.Format ("Invalid address token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid address token at offset {0}", startIndex), startIndex, index); return false; } @@ -1147,7 +1148,7 @@ public static InternetAddress Parse (ParserOptions options, byte[] buffer, int s ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return address; } @@ -1214,7 +1215,7 @@ public static InternetAddress Parse (ParserOptions options, byte[] buffer, int s ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return address; } @@ -1275,7 +1276,7 @@ public static InternetAddress Parse (ParserOptions options, byte[] buffer) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return address; } @@ -1333,7 +1334,7 @@ public static InternetAddress Parse (ParserOptions options, string text) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return address; } diff --git a/MimeKit/MailboxAddress.cs b/MimeKit/MailboxAddress.cs index f8ab8d3910..652f0acdda 100644 --- a/MimeKit/MailboxAddress.cs +++ b/MimeKit/MailboxAddress.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Globalization; using System.Collections.Generic; #if ENABLE_SNM @@ -261,7 +262,7 @@ public string Address { TryParseAddrspec (buffer, ref index, buffer.Length, new byte[0], true, out string addrspec, out int atIndex); if (index != buffer.Length) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); address = addrspec; at = atIndex; @@ -848,7 +849,7 @@ public static bool TryParse (string text, out MailboxAddress mailbox) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return mailbox; } @@ -915,7 +916,7 @@ public static bool TryParse (string text, out MailboxAddress mailbox) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return mailbox; } @@ -976,7 +977,7 @@ public static bool TryParse (string text, out MailboxAddress mailbox) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return mailbox; } @@ -1038,7 +1039,7 @@ public static bool TryParse (string text, out MailboxAddress mailbox) ParseUtils.SkipCommentsAndWhiteSpace (buffer, ref index, endIndex, true); if (index != endIndex) - throw new ParseException (string.Format ("Unexpected token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Unexpected token at offset {0}", index), index, index); return mailbox; } diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 6f2bd91022..97799c0bce 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -28,6 +28,7 @@ using System.IO; using System.Text; using System.Collections; +using System.Globalization; using System.Collections.Generic; using MimeKit.Encodings; @@ -711,7 +712,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i startIndex = index; if (!SkipParamName (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Invalid parameter name token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid parameter name token at offset {0}", startIndex), startIndex, index); return false; } @@ -723,7 +724,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete parameter at offset {0}", startIndex), startIndex, index); return false; } @@ -737,7 +738,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete parameter at offset {0}", startIndex), startIndex, index); return false; } @@ -749,7 +750,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete parameter at offset {0}", startIndex), startIndex, index); return false; } @@ -763,7 +764,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete parameter at offset {0}", startIndex), startIndex, index); return false; } @@ -777,7 +778,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i if (text[index] != (byte) '=') { if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete parameter at offset {0}", startIndex), startIndex, index); return false; } @@ -789,7 +790,7 @@ static bool TryParseNameValuePair (ParserOptions options, byte[] text, ref int i if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete parameter at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete parameter at offset {0}", startIndex), startIndex, index); return false; } @@ -973,7 +974,7 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index if (text[index] != (byte) ';') { if (throwOnError) - throw new ParseException (string.Format ("Invalid parameter list token at offset {0}", index), index, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid parameter list token at offset {0}", index), index, index); return false; } diff --git a/MimeKit/Tnef/TnefReader.cs b/MimeKit/Tnef/TnefReader.cs index 87f4bfa62e..60717d2b26 100644 --- a/MimeKit/Tnef/TnefReader.cs +++ b/MimeKit/Tnef/TnefReader.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Globalization; namespace MimeKit.Tnef { /// @@ -161,7 +162,7 @@ private set { } catch (Exception ex) { ComplianceStatus |= TnefComplianceStatus.InvalidMessageCodepage; if (ComplianceMode == TnefComplianceMode.Strict) - throw new TnefException (TnefComplianceStatus.InvalidMessageCodepage, string.Format ("Invalid message codepage: {0}", value), ex); + throw new TnefException (TnefComplianceStatus.InvalidMessageCodepage, string.Format (CultureInfo.InvariantCulture, "Invalid message codepage: {0}", value), ex); codepage = 1252; } } @@ -202,7 +203,7 @@ private set { if (value != 0x00010000) { ComplianceStatus |= TnefComplianceStatus.InvalidTnefVersion; if (ComplianceMode == TnefComplianceMode.Strict) - throw new TnefException (TnefComplianceStatus.InvalidTnefVersion, string.Format ("Invalid TNEF version: {0}", value)); + throw new TnefException (TnefComplianceStatus.InvalidTnefVersion, string.Format (CultureInfo.InvariantCulture, "Invalid TNEF version: {0}", value)); } version = value; diff --git a/MimeKit/Utils/DateUtils.cs b/MimeKit/Utils/DateUtils.cs index aeccd451e7..931fb0885f 100644 --- a/MimeKit/Utils/DateUtils.cs +++ b/MimeKit/Utils/DateUtils.cs @@ -26,6 +26,7 @@ using System; using System.Text; +using System.Globalization; using System.Collections.Generic; namespace MimeKit.Utils { @@ -715,7 +716,7 @@ internal static DateTime Parse (string text, string format) /// The date. public static string FormatDate (DateTimeOffset date) { - return string.Format ("{0}, {1:00} {2} {3:0000} {4:00}:{5:00}:{6:00} {7:+00;-00}{8:00}", + return string.Format (CultureInfo.InvariantCulture, "{0}, {1:00} {2} {3:0000} {4:00}:{5:00}:{6:00} {7:+00;-00}{8:00}", WeekDays[(int) date.DayOfWeek], date.Day, Months[date.Month - 1], date.Year, date.Hour, date.Minute, date.Second, date.Offset.Hours, date.Offset.Minutes); } diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index 7ad8ea1b1c..ac654a37ab 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -161,7 +161,7 @@ public static bool SkipCommentsAndWhiteSpace (byte[] text, ref int index, int en if (!SkipComment (text, ref index, endIndex)) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete comment token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete comment token at offset {0}", startIndex), startIndex, index); return false; } @@ -195,7 +195,7 @@ public static bool SkipQuoted (byte[] text, ref int index, int endIndex, bool th if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete quoted-string token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete quoted-string token at offset {0}", startIndex), startIndex, index); return false; } @@ -269,7 +269,7 @@ static bool TryParseDotAtom (byte[] text, ref int index, int endIndex, byte[] se do { if (!text[index].IsAtom ()) { if (throwOnError) - throw new ParseException (string.Format ("Invalid {0} token at offset {1}", tokenType, startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid {0} token at offset {1}", tokenType, startIndex), startIndex, index); return false; } @@ -333,7 +333,7 @@ static bool TryParseDomainLiteral (byte[] text, ref int index, int endIndex, boo if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete domain literal token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete domain literal token at offset {0}", startIndex), startIndex, index); return false; } @@ -343,7 +343,7 @@ static bool TryParseDomainLiteral (byte[] text, ref int index, int endIndex, boo if (!text[index].IsDomain ()) { if (throwOnError) - throw new ParseException (string.Format ("Invalid domain literal token at offset {0}", startIndex), startIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid domain literal token at offset {0}", startIndex), startIndex, index); return false; } @@ -395,7 +395,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -431,7 +431,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (index >= endIndex) { if (angleAddr) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -445,7 +445,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (text[index] != (byte) '.') { if (throwOnError) - throw new ParseException (string.Format ("Invalid msg-id token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid msg-id token at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -458,7 +458,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (index >= endIndex) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete msg-id at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete msg-id at offset {0}", tokenIndex), tokenIndex, index); return false; } @@ -506,7 +506,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool if (angleAddr && (index >= endIndex || text[index] != '>')) { if (throwOnError) - throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); return false; } diff --git a/UnitTests/AssortedTests.cs b/UnitTests/AssortedTests.cs index 46b0f03d4b..ed8c15e0e0 100644 --- a/UnitTests/AssortedTests.cs +++ b/UnitTests/AssortedTests.cs @@ -28,6 +28,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Globalization; using NUnit.Framework; @@ -201,7 +202,7 @@ public void TestCharsetUtilsGetCodePage () int expected, codepage; string name; - name = string.Format ("iso-8859-{0}", i); + name = string.Format (CultureInfo.InvariantCulture, "iso-8859-{0}", i); codepage = CharsetUtils.GetCodePage (name); switch (i) { @@ -233,17 +234,17 @@ public void TestCharsetUtilsGetCodePage () else expected = -1; - name = string.Format ("windows-125{0}", i); + name = string.Format (CultureInfo.InvariantCulture, "windows-125{0}", i); codepage = CharsetUtils.GetCodePage (name); Assert.AreEqual (expected, codepage, "Invalid codepage for: {0}", name); - name = string.Format ("windows-cp125{0}", i); + name = string.Format (CultureInfo.InvariantCulture, "windows-cp125{0}", i); codepage = CharsetUtils.GetCodePage (name); Assert.AreEqual (expected, codepage, "Invalid codepage for: {0}", name); - name = string.Format ("cp125{0}", i); + name = string.Format (CultureInfo.InvariantCulture, "cp125{0}", i); codepage = CharsetUtils.GetCodePage (name); Assert.AreEqual (expected, codepage, "Invalid codepage for: {0}", name); @@ -253,7 +254,7 @@ public void TestCharsetUtilsGetCodePage () int codepage; string name; - name = string.Format ("ibm-{0}", ibm); + name = string.Format (CultureInfo.InvariantCulture, "ibm-{0}", ibm); codepage = CharsetUtils.GetCodePage (name); Assert.AreEqual (ibm, codepage, "Invalid codepage for: {0}", name); diff --git a/UnitTests/MimeVisitorTests.cs b/UnitTests/MimeVisitorTests.cs index a1ef7b3639..521b4bcad9 100644 --- a/UnitTests/MimeVisitorTests.cs +++ b/UnitTests/MimeVisitorTests.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Globalization; using NUnit.Framework; @@ -49,7 +50,7 @@ public void TestMimeVisitor () var parser = new MimeParser (stream, MimeFormat.Mbox); while (!parser.IsEndOfStream) { - var filename = string.Format ("jwz.body.{0}.html", index); + var filename = string.Format (CultureInfo.InvariantCulture, "jwz.body.{0}.html", index); var path = Path.Combine (dataDir, filename); var message = parser.ParseMessage (); string expected, actual; diff --git a/UnitTests/Tnef/TnefTests.cs b/UnitTests/Tnef/TnefTests.cs index 161ed2eba6..825537f8bf 100644 --- a/UnitTests/Tnef/TnefTests.cs +++ b/UnitTests/Tnef/TnefTests.cs @@ -28,6 +28,7 @@ using System.IO; using System.Text; using System.Linq; +using System.Globalization; using MimeKit; using MimeKit.IO; @@ -783,7 +784,7 @@ static void TestTnefParser (string baseFileName, TnefComplianceStatus expected = isText = true; } else if (part.FileName == "Untitled Attachment") { // special case for winmail.tnef and christmas.tnef - fileName = string.Format ("Untitled Attachment.{0}", untitled++); + fileName = string.Format (CultureInfo.InvariantCulture, "Untitled Attachment.{0}", untitled++); } else { var extension = Path.GetExtension (part.FileName); From 7e90a5b87e35d4a1dd48aae2274e5df8b0cce33c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 09:48:27 -0400 Subject: [PATCH 644/741] Fixed another location that was commented out --- MimeKit/Utils/ParseUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Utils/ParseUtils.cs b/MimeKit/Utils/ParseUtils.cs index ac654a37ab..183f838e09 100644 --- a/MimeKit/Utils/ParseUtils.cs +++ b/MimeKit/Utils/ParseUtils.cs @@ -498,7 +498,7 @@ public static bool TryParseMsgId (byte[] text, ref int index, int endIndex, bool // https://github.com/jstedfast/MimeKit/issues/102 //if (throwOnError) - // throw new ParseException (string.Format ("Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); + // throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Incomplete msg-id token at offset {0}", tokenIndex), tokenIndex, index); //return false; } From b02e7af4c48785aba6f33444c6b9e772965dacb6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 10:08:27 -0400 Subject: [PATCH 645/741] Fixed ParseMessage() to use consistent ordering of offset events --- MimeKit/AsyncMimeParser.cs | 5 ++--- MimeKit/MimeParser.cs | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index b8ed04ba52..5a77b6f9db 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -650,9 +650,6 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); - OnMimeMessageBegin (message, headerBlockBegin); - OnMimeMessageHeadersEnd (message, headerBlockEnd); - if (format == MimeFormat.Mbox && options.RespectContentLength) { contentEnd = 0; @@ -678,8 +675,10 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation var entity = options.CreateEntity (type, headers, true, 0); message.Body = entity; + OnMimeMessageBegin (message, headerBlockBegin); OnMimeEntityBegin (entity, headerBlockBegin); OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeMessageHeadersEnd (message, headerBlockEnd); if (entity is Multipart) await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 7cb26d4cb5..b2ce5dd45f 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1897,9 +1897,6 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); - OnMimeMessageBegin (message, headerBlockBegin); - OnMimeMessageHeadersEnd (message, headerBlockEnd); - contentEnd = 0; if (format == MimeFormat.Mbox && options.RespectContentLength) { for (int i = 0; i < headers.Count; i++) { @@ -1924,8 +1921,10 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var entity = options.CreateEntity (type, headers, true, 0); message.Body = entity; + OnMimeMessageBegin (message, headerBlockBegin); OnMimeEntityBegin (entity, headerBlockBegin); OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeMessageHeadersEnd (message, headerBlockEnd); if (entity is Multipart) ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); From 02db38f17a0b1940636c1278319f606809674633 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 10:29:26 -0400 Subject: [PATCH 646/741] Fixed tests on Unix --- .../mbox/content-length.unix-offsets.txt | 58 ++-- UnitTests/TestData/mbox/jwz.unix-offsets.txt | 304 +++++++++--------- 2 files changed, 181 insertions(+), 181 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt index 68e13b6732..079629238d 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -1,9 +1,9 @@ MboxMarkerBegin 0 MboxMarkerEnd 7 MimeMessageBegin 8 -MimeMessageHeadersEnd 657 MimeEntityBegin 8 MimeEntityHeadersEnd 657 +MimeMessageHeadersEnd 657 MultipartPreambleBegin 657 MultipartPreambleEnd 657 MultipartBoundaryBegin 657 @@ -39,9 +39,9 @@ MimeMessageEnd 1888 MboxMarkerBegin 1889 MboxMarkerEnd 1896 MimeMessageBegin 1897 -MimeMessageHeadersEnd 2365 MimeEntityBegin 1897 MimeEntityHeadersEnd 2365 +MimeMessageHeadersEnd 2365 MultipartPreambleBegin 2365 MultipartPreambleEnd 2411 MultipartBoundaryBegin 2411 @@ -151,9 +151,9 @@ MimeMessageEnd 8122 MboxMarkerBegin 8123 MboxMarkerEnd 8130 MimeMessageBegin 8131 -MimeMessageHeadersEnd 8602 MimeEntityBegin 8131 MimeEntityHeadersEnd 8602 +MimeMessageHeadersEnd 8602 MultipartPreambleBegin 8602 MultipartPreambleEnd 8648 MultipartBoundaryBegin 8648 @@ -263,9 +263,9 @@ MimeMessageEnd 14394 MboxMarkerBegin 14395 MboxMarkerEnd 14426 MimeMessageBegin 14427 -MimeMessageHeadersEnd 15930 MimeEntityBegin 14427 MimeEntityHeadersEnd 15930 +MimeMessageHeadersEnd 15930 MultipartPreambleBegin 15930 MultipartPreambleEnd 15931 MultipartBoundaryBegin 15931 @@ -293,9 +293,9 @@ MimeMessageEnd 22485 MboxMarkerBegin 22486 MboxMarkerEnd 22517 MimeMessageBegin 22518 -MimeMessageHeadersEnd 23752 MimeEntityBegin 22518 MimeEntityHeadersEnd 23752 +MimeMessageHeadersEnd 23752 MultipartPreambleBegin 23752 MultipartPreambleEnd 23798 MultipartBoundaryBegin 23798 @@ -371,9 +371,9 @@ MimeMessageEnd 771037 MboxMarkerBegin 771038 MboxMarkerEnd 771069 MimeMessageBegin 771070 -MimeMessageHeadersEnd 772334 MimeEntityBegin 771070 MimeEntityHeadersEnd 772334 +MimeMessageHeadersEnd 772334 MultipartPreambleBegin 772334 MultipartPreambleEnd 772335 MultipartBoundaryBegin 772335 @@ -422,9 +422,9 @@ MimeMessageEnd 818962 MboxMarkerBegin 818963 MboxMarkerEnd 818970 MimeMessageBegin 818971 -MimeMessageHeadersEnd 819882 MimeEntityBegin 818971 MimeEntityHeadersEnd 819882 +MimeMessageHeadersEnd 819882 MultipartPreambleBegin 819882 MultipartPreambleEnd 819883 MultipartBoundaryBegin 819883 @@ -445,9 +445,9 @@ MimeMessageEnd 822461 MboxMarkerBegin 822462 MboxMarkerEnd 822493 MimeMessageBegin 822494 -MimeMessageHeadersEnd 823647 MimeEntityBegin 822494 MimeEntityHeadersEnd 823647 +MimeMessageHeadersEnd 823647 MultipartPreambleBegin 823647 MultipartPreambleEnd 823647 MultipartBoundaryBegin 823647 @@ -475,9 +475,9 @@ MimeMessageEnd 825431 MboxMarkerBegin 825432 MboxMarkerEnd 825463 MimeMessageBegin 825464 -MimeMessageHeadersEnd 826606 MimeEntityBegin 825464 MimeEntityHeadersEnd 826606 +MimeMessageHeadersEnd 826606 MultipartPreambleBegin 826606 MultipartPreambleEnd 826779 MultipartBoundaryBegin 826779 @@ -505,9 +505,9 @@ MimeMessageEnd 830015 MboxMarkerBegin 830016 MboxMarkerEnd 830047 MimeMessageBegin 830048 -MimeMessageHeadersEnd 831185 MimeEntityBegin 830048 MimeEntityHeadersEnd 831185 +MimeMessageHeadersEnd 831185 MultipartPreambleBegin 831185 MultipartPreambleEnd 831358 MultipartBoundaryBegin 831358 @@ -535,9 +535,9 @@ MimeMessageEnd 837039 MboxMarkerBegin 837040 MboxMarkerEnd 837071 MimeMessageBegin 837072 -MimeMessageHeadersEnd 837972 MimeEntityBegin 837072 MimeEntityHeadersEnd 837972 +MimeMessageHeadersEnd 837972 MultipartPreambleBegin 837972 MultipartPreambleEnd 838018 MultipartBoundaryBegin 838018 @@ -565,9 +565,9 @@ MimeMessageEnd 853721 MboxMarkerBegin 853722 MboxMarkerEnd 853753 MimeMessageBegin 853754 -MimeMessageHeadersEnd 855145 MimeEntityBegin 853754 MimeEntityHeadersEnd 855145 +MimeMessageHeadersEnd 855145 Octets 1431 Lines 20 MimeEntityEnd 856576 @@ -575,9 +575,9 @@ MimeMessageEnd 856576 MboxMarkerBegin 856577 MboxMarkerEnd 856608 MimeMessageBegin 856609 -MimeMessageHeadersEnd 857962 MimeEntityBegin 856609 MimeEntityHeadersEnd 857962 +MimeMessageHeadersEnd 857962 MultipartPreambleBegin 857962 MultipartPreambleEnd 857963 MultipartBoundaryBegin 857963 @@ -605,9 +605,9 @@ MimeMessageEnd 862354 MboxMarkerBegin 862355 MboxMarkerEnd 862386 MimeMessageBegin 862387 -MimeMessageHeadersEnd 863597 MimeEntityBegin 862387 MimeEntityHeadersEnd 863597 +MimeMessageHeadersEnd 863597 Octets 3495 Lines 56 MimeEntityEnd 867092 @@ -615,9 +615,9 @@ MimeMessageEnd 867092 MboxMarkerBegin 867093 MboxMarkerEnd 867124 MimeMessageBegin 867125 -MimeMessageHeadersEnd 868202 MimeEntityBegin 867125 MimeEntityHeadersEnd 868202 +MimeMessageHeadersEnd 868202 Octets 661 Lines 10 MimeEntityEnd 868863 @@ -625,9 +625,9 @@ MimeMessageEnd 868863 MboxMarkerBegin 868864 MboxMarkerEnd 868895 MimeMessageBegin 868896 -MimeMessageHeadersEnd 869679 MimeEntityBegin 868896 MimeEntityHeadersEnd 869679 +MimeMessageHeadersEnd 869679 MimeMessageBegin 869679 MimeEntityBegin 869679 MimeEntityHeadersEnd 871059 @@ -643,9 +643,9 @@ MimeMessageEnd 872491 MboxMarkerBegin 872492 MboxMarkerEnd 872523 MimeMessageBegin 872524 -MimeMessageHeadersEnd 873234 MimeEntityBegin 872524 MimeEntityHeadersEnd 873234 +MimeMessageHeadersEnd 873234 MultipartPreambleBegin 873234 MultipartPreambleEnd 873280 MultipartBoundaryBegin 873280 @@ -681,9 +681,9 @@ MimeMessageEnd 876422 MboxMarkerBegin 876423 MboxMarkerEnd 876454 MimeMessageBegin 876455 -MimeMessageHeadersEnd 877120 MimeEntityBegin 876455 MimeEntityHeadersEnd 877120 +MimeMessageHeadersEnd 877120 MultipartPreambleBegin 877120 MultipartPreambleEnd 877180 MultipartBoundaryBegin 877180 @@ -711,9 +711,9 @@ MimeMessageEnd 883131 MboxMarkerBegin 883132 MboxMarkerEnd 883163 MimeMessageBegin 883164 -MimeMessageHeadersEnd 884226 MimeEntityBegin 883164 MimeEntityHeadersEnd 884226 +MimeMessageHeadersEnd 884226 Octets 10236 Lines 141 MimeEntityEnd 894462 @@ -721,9 +721,9 @@ MimeMessageEnd 894462 MboxMarkerBegin 894463 MboxMarkerEnd 894494 MimeMessageBegin 894495 -MimeMessageHeadersEnd 895871 MimeEntityBegin 894495 MimeEntityHeadersEnd 895871 +MimeMessageHeadersEnd 895871 MultipartPreambleBegin 895871 MultipartPreambleEnd 895931 MultipartBoundaryBegin 895931 @@ -751,9 +751,9 @@ MimeMessageEnd 898684 MboxMarkerBegin 898685 MboxMarkerEnd 898716 MimeMessageBegin 898717 -MimeMessageHeadersEnd 899265 MimeEntityBegin 898717 MimeEntityHeadersEnd 899265 +MimeMessageHeadersEnd 899265 Octets 523 Lines 8 MimeEntityEnd 899788 @@ -761,9 +761,9 @@ MimeMessageEnd 899788 MboxMarkerBegin 899789 MboxMarkerEnd 899820 MimeMessageBegin 899821 -MimeMessageHeadersEnd 901036 MimeEntityBegin 899821 MimeEntityHeadersEnd 901036 +MimeMessageHeadersEnd 901036 Octets 2882 Lines 39 MimeEntityEnd 903918 @@ -771,9 +771,9 @@ MimeMessageEnd 903918 MboxMarkerBegin 903919 MboxMarkerEnd 903950 MimeMessageBegin 903951 -MimeMessageHeadersEnd 905109 MimeEntityBegin 903951 MimeEntityHeadersEnd 905109 +MimeMessageHeadersEnd 905109 Octets 2122 Lines 31 MimeEntityEnd 907231 @@ -781,9 +781,9 @@ MimeMessageEnd 907231 MboxMarkerBegin 907232 MboxMarkerEnd 907263 MimeMessageBegin 907264 -MimeMessageHeadersEnd 908342 MimeEntityBegin 907264 MimeEntityHeadersEnd 908342 +MimeMessageHeadersEnd 908342 MultipartPreambleBegin 908342 MultipartPreambleEnd 908343 MultipartBoundaryBegin 908343 @@ -811,9 +811,9 @@ MimeMessageEnd 911299 MboxMarkerBegin 911300 MboxMarkerEnd 911331 MimeMessageBegin 911332 -MimeMessageHeadersEnd 912369 MimeEntityBegin 911332 MimeEntityHeadersEnd 912369 +MimeMessageHeadersEnd 912369 MultipartPreambleBegin 912369 MultipartPreambleEnd 912370 MultipartBoundaryBegin 912370 @@ -848,9 +848,9 @@ MimeMessageEnd 915249 MboxMarkerBegin 915250 MboxMarkerEnd 915281 MimeMessageBegin 915282 -MimeMessageHeadersEnd 916357 MimeEntityBegin 915282 MimeEntityHeadersEnd 916357 +MimeMessageHeadersEnd 916357 MultipartPreambleBegin 916357 MultipartPreambleEnd 916358 MultipartBoundaryBegin 916358 @@ -878,9 +878,9 @@ MimeMessageEnd 920885 MboxMarkerBegin 920886 MboxMarkerEnd 920917 MimeMessageBegin 920918 -MimeMessageHeadersEnd 922020 MimeEntityBegin 920918 MimeEntityHeadersEnd 922020 +MimeMessageHeadersEnd 922020 MultipartPreambleBegin 922020 MultipartPreambleEnd 922021 MultipartBoundaryBegin 922021 @@ -908,9 +908,9 @@ MimeMessageEnd 926071 MboxMarkerBegin 926072 MboxMarkerEnd 926103 MimeMessageBegin 926104 -MimeMessageHeadersEnd 927232 MimeEntityBegin 926104 MimeEntityHeadersEnd 927232 +MimeMessageHeadersEnd 927232 MultipartPreambleBegin 927232 MultipartPreambleEnd 927345 MultipartBoundaryBegin 927345 @@ -946,9 +946,9 @@ MimeMessageEnd 928495 MboxMarkerBegin 928496 MboxMarkerEnd 928527 MimeMessageBegin 928528 -MimeMessageHeadersEnd 930393 MimeEntityBegin 928528 MimeEntityHeadersEnd 930393 +MimeMessageHeadersEnd 930393 MultipartPreambleBegin 930393 MultipartPreambleEnd 930393 MultipartBoundaryBegin 930393 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt index 20e13faf10..e698525534 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -1,9 +1,9 @@ MboxMarkerBegin 0 MboxMarkerEnd 7 MimeMessageBegin 8 -MimeMessageHeadersEnd 517 MimeEntityBegin 8 MimeEntityHeadersEnd 517 +MimeMessageHeadersEnd 517 MultipartPreambleBegin 517 MultipartPreambleEnd 517 MultipartBoundaryBegin 517 @@ -92,9 +92,9 @@ MimeMessageEnd 177075 MboxMarkerBegin 177076 MboxMarkerEnd 177083 MimeMessageBegin 177084 -MimeMessageHeadersEnd 177633 MimeEntityBegin 177084 MimeEntityHeadersEnd 177633 +MimeMessageHeadersEnd 177633 Octets 135270 Lines 1855 MimeEntityEnd 312903 @@ -102,9 +102,9 @@ MimeMessageEnd 312903 MboxMarkerBegin 312904 MboxMarkerEnd 312911 MimeMessageBegin 312912 -MimeMessageHeadersEnd 313291 MimeEntityBegin 312912 MimeEntityHeadersEnd 313291 +MimeMessageHeadersEnd 313291 Octets 201 Lines 4 MimeEntityEnd 313492 @@ -112,9 +112,9 @@ MimeMessageEnd 313492 MboxMarkerBegin 313493 MboxMarkerEnd 313500 MimeMessageBegin 313501 -MimeMessageHeadersEnd 314147 MimeEntityBegin 313501 MimeEntityHeadersEnd 314147 +MimeMessageHeadersEnd 314147 MultipartPreambleBegin 314147 MultipartPreambleEnd 314302 MultipartBoundaryBegin 314302 @@ -169,9 +169,9 @@ MimeMessageEnd 319811 MboxMarkerBegin 319812 MboxMarkerEnd 319819 MimeMessageBegin 319820 -MimeMessageHeadersEnd 320568 MimeEntityBegin 319820 MimeEntityHeadersEnd 320568 +MimeMessageHeadersEnd 320568 MultipartPreambleBegin 320568 MultipartPreambleEnd 320763 MultipartBoundaryBegin 320763 @@ -237,9 +237,9 @@ MimeMessageEnd 343841 MboxMarkerBegin 343842 MboxMarkerEnd 343849 MimeMessageBegin 343850 -MimeMessageHeadersEnd 344568 MimeEntityBegin 343850 MimeEntityHeadersEnd 344568 +MimeMessageHeadersEnd 344568 MultipartPreambleBegin 344568 MultipartPreambleEnd 344723 MultipartBoundaryBegin 344723 @@ -336,9 +336,9 @@ MimeMessageEnd 2108724 MboxMarkerBegin 2108725 MboxMarkerEnd 2108732 MimeMessageBegin 2108733 -MimeMessageHeadersEnd 2109749 MimeEntityBegin 2108733 MimeEntityHeadersEnd 2109749 +MimeMessageHeadersEnd 2109749 Octets 1125 Lines 40 MimeEntityEnd 2110874 @@ -346,9 +346,9 @@ MimeMessageEnd 2110874 MboxMarkerBegin 2110875 MboxMarkerEnd 2110882 MimeMessageBegin 2110883 -MimeMessageHeadersEnd 2111121 MimeEntityBegin 2110883 MimeEntityHeadersEnd 2111121 +MimeMessageHeadersEnd 2111121 MultipartPreambleBegin 2111121 MultipartPreambleEnd 2111121 MultipartBoundaryBegin 2111121 @@ -403,9 +403,9 @@ MimeMessageEnd 2275728 MboxMarkerBegin 2275729 MboxMarkerEnd 2275736 MimeMessageBegin 2275737 -MimeMessageHeadersEnd 2276689 MimeEntityBegin 2275737 MimeEntityHeadersEnd 2276689 +MimeMessageHeadersEnd 2276689 Octets 343060 Lines 4457 MimeEntityEnd 2619749 @@ -413,9 +413,9 @@ MimeMessageEnd 2619749 MboxMarkerBegin 2619750 MboxMarkerEnd 2619757 MimeMessageBegin 2619758 -MimeMessageHeadersEnd 2619892 MimeEntityBegin 2619758 MimeEntityHeadersEnd 2619892 +MimeMessageHeadersEnd 2619892 MultipartPreambleBegin 2619892 MultipartPreambleEnd 2619892 MultipartBoundaryBegin 2619892 @@ -456,9 +456,9 @@ MimeMessageEnd 2651948 MboxMarkerBegin 2651949 MboxMarkerEnd 2651956 MimeMessageBegin 2651957 -MimeMessageHeadersEnd 2652514 MimeEntityBegin 2651957 MimeEntityHeadersEnd 2652514 +MimeMessageHeadersEnd 2652514 Octets 56779 Lines 783 MimeEntityEnd 2709293 @@ -466,9 +466,9 @@ MimeMessageEnd 2709293 MboxMarkerBegin 2709294 MboxMarkerEnd 2709301 MimeMessageBegin 2709302 -MimeMessageHeadersEnd 2710035 MimeEntityBegin 2709302 MimeEntityHeadersEnd 2710035 +MimeMessageHeadersEnd 2710035 MultipartPreambleBegin 2710035 MultipartPreambleEnd 2710561 MultipartBoundaryBegin 2710561 @@ -523,9 +523,9 @@ MimeMessageEnd 2741562 MboxMarkerBegin 2741563 MboxMarkerEnd 2741570 MimeMessageBegin 2741571 -MimeMessageHeadersEnd 2742224 MimeEntityBegin 2741571 MimeEntityHeadersEnd 2742224 +MimeMessageHeadersEnd 2742224 MultipartPreambleBegin 2742224 MultipartPreambleEnd 2742564 MultipartBoundaryBegin 2742564 @@ -594,9 +594,9 @@ MimeMessageEnd 2747107 MboxMarkerBegin 2747108 MboxMarkerEnd 2747115 MimeMessageBegin 2747116 -MimeMessageHeadersEnd 2748092 MimeEntityBegin 2747116 MimeEntityHeadersEnd 2748092 +MimeMessageHeadersEnd 2748092 Octets 1382 Lines 33 MimeEntityEnd 2749474 @@ -604,9 +604,9 @@ MimeMessageEnd 2749474 MboxMarkerBegin 2749475 MboxMarkerEnd 2749482 MimeMessageBegin 2749483 -MimeMessageHeadersEnd 2749739 MimeEntityBegin 2749483 MimeEntityHeadersEnd 2749739 +MimeMessageHeadersEnd 2749739 Octets 256 Lines 6 MimeEntityEnd 2749995 @@ -614,9 +614,9 @@ MimeMessageEnd 2749995 MboxMarkerBegin 2749996 MboxMarkerEnd 2750003 MimeMessageBegin 2750004 -MimeMessageHeadersEnd 2750661 MimeEntityBegin 2750004 MimeEntityHeadersEnd 2750661 +MimeMessageHeadersEnd 2750661 Octets 724 Lines 14 MimeEntityEnd 2751385 @@ -624,9 +624,9 @@ MimeMessageEnd 2751385 MboxMarkerBegin 2751386 MboxMarkerEnd 2751393 MimeMessageBegin 2751394 -MimeMessageHeadersEnd 2752379 MimeEntityBegin 2751394 MimeEntityHeadersEnd 2752379 +MimeMessageHeadersEnd 2752379 MultipartPreambleBegin 2752379 MultipartPreambleEnd 2752381 MultipartBoundaryBegin 2752381 @@ -674,9 +674,9 @@ MimeMessageEnd 3183395 MboxMarkerBegin 3183396 MboxMarkerEnd 3183403 MimeMessageBegin 3183404 -MimeMessageHeadersEnd 3184389 MimeEntityBegin 3183404 MimeEntityHeadersEnd 3184389 +MimeMessageHeadersEnd 3184389 MultipartPreambleBegin 3184389 MultipartPreambleEnd 3184391 MultipartBoundaryBegin 3184391 @@ -724,9 +724,9 @@ MimeMessageEnd 3615404 MboxMarkerBegin 3615405 MboxMarkerEnd 3615412 MimeMessageBegin 3615413 -MimeMessageHeadersEnd 3615971 MimeEntityBegin 3615413 MimeEntityHeadersEnd 3615971 +MimeMessageHeadersEnd 3615971 MimeMessageBegin 3615971 MimeEntityBegin 3615971 MimeEntityHeadersEnd 3616030 @@ -742,9 +742,9 @@ MimeMessageEnd 3616557 MboxMarkerBegin 3616558 MboxMarkerEnd 3616565 MimeMessageBegin 3616566 -MimeMessageHeadersEnd 3617279 MimeEntityBegin 3616566 MimeEntityHeadersEnd 3617279 +MimeMessageHeadersEnd 3617279 MultipartPreambleBegin 3617279 MultipartPreambleEnd 3617280 MultipartBoundaryBegin 3617280 @@ -772,9 +772,9 @@ MimeMessageEnd 3618690 MboxMarkerBegin 3618691 MboxMarkerEnd 3618698 MimeMessageBegin 3618699 -MimeMessageHeadersEnd 3619238 MimeEntityBegin 3618699 MimeEntityHeadersEnd 3619238 +MimeMessageHeadersEnd 3619238 MultipartPreambleBegin 3619238 MultipartPreambleEnd 3619275 MultipartBoundaryBegin 3619275 @@ -810,9 +810,9 @@ MimeMessageEnd 3623959 MboxMarkerBegin 3623960 MboxMarkerEnd 3623967 MimeMessageBegin 3623968 -MimeMessageHeadersEnd 3624617 MimeEntityBegin 3623968 MimeEntityHeadersEnd 3624617 +MimeMessageHeadersEnd 3624617 MultipartPreambleBegin 3624617 MultipartPreambleEnd 3624617 MultipartBoundaryBegin 3624617 @@ -848,9 +848,9 @@ MimeMessageEnd 3625848 MboxMarkerBegin 3625849 MboxMarkerEnd 3625856 MimeMessageBegin 3625857 -MimeMessageHeadersEnd 3626367 MimeEntityBegin 3625857 MimeEntityHeadersEnd 3626367 +MimeMessageHeadersEnd 3626367 Octets 1419 Lines 46 MimeEntityEnd 3627786 @@ -858,9 +858,9 @@ MimeMessageEnd 3627786 MboxMarkerBegin 3627787 MboxMarkerEnd 3627837 MimeMessageBegin 3627838 -MimeMessageHeadersEnd 3628410 MimeEntityBegin 3627838 MimeEntityHeadersEnd 3628410 +MimeMessageHeadersEnd 3628410 Octets 59701 Lines 955 MimeEntityEnd 3688111 @@ -868,9 +868,9 @@ MimeMessageEnd 3688111 MboxMarkerBegin 3688112 MboxMarkerEnd 3688162 MimeMessageBegin 3688163 -MimeMessageHeadersEnd 3688732 MimeEntityBegin 3688163 MimeEntityHeadersEnd 3688732 +MimeMessageHeadersEnd 3688732 Octets 59807 Lines 961 MimeEntityEnd 3748539 @@ -878,9 +878,9 @@ MimeMessageEnd 3748539 MboxMarkerBegin 3748540 MboxMarkerEnd 3748547 MimeMessageBegin 3748548 -MimeMessageHeadersEnd 3749096 MimeEntityBegin 3748548 MimeEntityHeadersEnd 3749096 +MimeMessageHeadersEnd 3749096 MultipartPreambleBegin 3749096 MultipartPreambleEnd 3749097 MultipartBoundaryBegin 3749097 @@ -908,9 +908,9 @@ MimeMessageEnd 3749967 MboxMarkerBegin 3749968 MboxMarkerEnd 3749975 MimeMessageBegin 3749976 -MimeMessageHeadersEnd 3750723 MimeEntityBegin 3749976 MimeEntityHeadersEnd 3750723 +MimeMessageHeadersEnd 3750723 Octets 41530 Lines 571 MimeEntityEnd 3792253 @@ -918,9 +918,9 @@ MimeMessageEnd 3792253 MboxMarkerBegin 3792254 MboxMarkerEnd 3792261 MimeMessageBegin 3792262 -MimeMessageHeadersEnd 3793416 MimeEntityBegin 3792262 MimeEntityHeadersEnd 3793416 +MimeMessageHeadersEnd 3793416 MultipartPreambleBegin 3793416 MultipartPreambleEnd 3793416 MultipartBoundaryBegin 3793416 @@ -948,9 +948,9 @@ MimeMessageEnd 3801685 MboxMarkerBegin 3801686 MboxMarkerEnd 3801693 MimeMessageBegin 3801694 -MimeMessageHeadersEnd 3803142 MimeEntityBegin 3801694 MimeEntityHeadersEnd 3803142 +MimeMessageHeadersEnd 3803142 Octets 106813 Lines 1571 MimeEntityEnd 3909955 @@ -958,9 +958,9 @@ MimeMessageEnd 3909955 MboxMarkerBegin 3909956 MboxMarkerEnd 3909963 MimeMessageBegin 3909964 -MimeMessageHeadersEnd 3910563 MimeEntityBegin 3909964 MimeEntityHeadersEnd 3910563 +MimeMessageHeadersEnd 3910563 MimeMessageBegin 3910563 MimeEntityBegin 3910563 MimeEntityHeadersEnd 3911133 @@ -1040,9 +1040,9 @@ MimeMessageEnd 3913880 MboxMarkerBegin 3913881 MboxMarkerEnd 3913888 MimeMessageBegin 3913889 -MimeMessageHeadersEnd 3914592 MimeEntityBegin 3913889 MimeEntityHeadersEnd 3914592 +MimeMessageHeadersEnd 3914592 MultipartPreambleBegin 3914592 MultipartPreambleEnd 3914592 MultipartBoundaryBegin 3914592 @@ -1105,9 +1105,9 @@ MimeMessageEnd 4176062 MboxMarkerBegin 4176063 MboxMarkerEnd 4176070 MimeMessageBegin 4176071 -MimeMessageHeadersEnd 4176736 MimeEntityBegin 4176071 MimeEntityHeadersEnd 4176736 +MimeMessageHeadersEnd 4176736 Octets 992 Lines 19 MimeEntityEnd 4177728 @@ -1115,9 +1115,9 @@ MimeMessageEnd 4177728 MboxMarkerBegin 4177729 MboxMarkerEnd 4177736 MimeMessageBegin 4177737 -MimeMessageHeadersEnd 4178793 MimeEntityBegin 4177737 MimeEntityHeadersEnd 4178793 +MimeMessageHeadersEnd 4178793 MultipartPreambleBegin 4178793 MultipartPreambleEnd 4178948 MultipartBoundaryBegin 4178948 @@ -1172,9 +1172,9 @@ MimeMessageEnd 4181836 MboxMarkerBegin 4181837 MboxMarkerEnd 4181844 MimeMessageBegin 4181845 -MimeMessageHeadersEnd 4182515 MimeEntityBegin 4181845 MimeEntityHeadersEnd 4182515 +MimeMessageHeadersEnd 4182515 MultipartPreambleBegin 4182515 MultipartPreambleEnd 4182515 MultipartBoundaryBegin 4182515 @@ -1202,9 +1202,9 @@ MimeMessageEnd 4187896 MboxMarkerBegin 4187897 MboxMarkerEnd 4187904 MimeMessageBegin 4187905 -MimeMessageHeadersEnd 4188357 MimeEntityBegin 4187905 MimeEntityHeadersEnd 4188357 +MimeMessageHeadersEnd 4188357 Octets 11414 Lines 186 MimeEntityEnd 4199771 @@ -1212,9 +1212,9 @@ MimeMessageEnd 4199771 MboxMarkerBegin 4199772 MboxMarkerEnd 4199779 MimeMessageBegin 4199780 -MimeMessageHeadersEnd 4200345 MimeEntityBegin 4199780 MimeEntityHeadersEnd 4200345 +MimeMessageHeadersEnd 4200345 MultipartPreambleBegin 4200345 MultipartPreambleEnd 4200345 MultipartBoundaryBegin 4200345 @@ -1323,9 +1323,9 @@ MimeMessageEnd 4201646 MboxMarkerBegin 4201647 MboxMarkerEnd 4201654 MimeMessageBegin 4201655 -MimeMessageHeadersEnd 4202220 MimeEntityBegin 4201655 MimeEntityHeadersEnd 4202220 +MimeMessageHeadersEnd 4202220 MultipartPreambleBegin 4202220 MultipartPreambleEnd 4202220 MultipartBoundaryBegin 4202220 @@ -1389,9 +1389,9 @@ MimeMessageEnd 4206092 MboxMarkerBegin 4206093 MboxMarkerEnd 4206100 MimeMessageBegin 4206101 -MimeMessageHeadersEnd 4206569 MimeEntityBegin 4206101 MimeEntityHeadersEnd 4206569 +MimeMessageHeadersEnd 4206569 MultipartPreambleBegin 4206569 MultipartPreambleEnd 4206615 MultipartBoundaryBegin 4206615 @@ -1501,9 +1501,9 @@ MimeMessageEnd 4212326 MboxMarkerBegin 4212327 MboxMarkerEnd 4212334 MimeMessageBegin 4212335 -MimeMessageHeadersEnd 4212806 MimeEntityBegin 4212335 MimeEntityHeadersEnd 4212806 +MimeMessageHeadersEnd 4212806 MultipartPreambleBegin 4212806 MultipartPreambleEnd 4212852 MultipartBoundaryBegin 4212852 @@ -1613,9 +1613,9 @@ MimeMessageEnd 4218598 MboxMarkerBegin 4218599 MboxMarkerEnd 4218606 MimeMessageBegin 4218607 -MimeMessageHeadersEnd 4219294 MimeEntityBegin 4218607 MimeEntityHeadersEnd 4219294 +MimeMessageHeadersEnd 4219294 MultipartPreambleBegin 4219294 MultipartPreambleEnd 4219335 MultipartBoundaryBegin 4219335 @@ -1808,9 +1808,9 @@ MimeMessageEnd 4239312 MboxMarkerBegin 4239313 MboxMarkerEnd 4239320 MimeMessageBegin 4239321 -MimeMessageHeadersEnd 4239982 MimeEntityBegin 4239321 MimeEntityHeadersEnd 4239982 +MimeMessageHeadersEnd 4239982 MultipartPreambleBegin 4239982 MultipartPreambleEnd 4239982 MultipartBoundaryBegin 4239982 @@ -1845,9 +1845,9 @@ MimeMessageEnd 4312775 MboxMarkerBegin 4312776 MboxMarkerEnd 4312783 MimeMessageBegin 4312784 -MimeMessageHeadersEnd 4313717 MimeEntityBegin 4312784 MimeEntityHeadersEnd 4313717 +MimeMessageHeadersEnd 4313717 Octets 249041 Lines 3431 MimeEntityEnd 4562758 @@ -1855,9 +1855,9 @@ MimeMessageEnd 4562758 MboxMarkerBegin 4562759 MboxMarkerEnd 4562766 MimeMessageBegin 4562767 -MimeMessageHeadersEnd 4563695 MimeEntityBegin 4562767 MimeEntityHeadersEnd 4563695 +MimeMessageHeadersEnd 4563695 MultipartPreambleBegin 4563695 MultipartPreambleEnd 4563890 MultipartBoundaryBegin 4563890 @@ -1920,9 +1920,9 @@ MimeMessageEnd 4618504 MboxMarkerBegin 4618505 MboxMarkerEnd 4618512 MimeMessageBegin 4618513 -MimeMessageHeadersEnd 4619332 MimeEntityBegin 4618513 MimeEntityHeadersEnd 4619332 +MimeMessageHeadersEnd 4619332 MultipartPreambleBegin 4619332 MultipartPreambleEnd 4619332 MultipartBoundaryBegin 4619332 @@ -1950,9 +1950,9 @@ MimeMessageEnd 4666587 MboxMarkerBegin 4666588 MboxMarkerEnd 4666595 MimeMessageBegin 4666596 -MimeMessageHeadersEnd 4667343 MimeEntityBegin 4666596 MimeEntityHeadersEnd 4667343 +MimeMessageHeadersEnd 4667343 MultipartPreambleBegin 4667343 MultipartPreambleEnd 4667777 MultipartBoundaryBegin 4667777 @@ -2045,9 +2045,9 @@ MimeMessageEnd 4702358 MboxMarkerBegin 4702359 MboxMarkerEnd 4702366 MimeMessageBegin 4702367 -MimeMessageHeadersEnd 4702528 MimeEntityBegin 4702367 MimeEntityHeadersEnd 4702528 +MimeMessageHeadersEnd 4702528 MultipartPreambleBegin 4702528 MultipartPreambleEnd 4702528 MultipartBoundaryBegin 4702528 @@ -2075,9 +2075,9 @@ MimeMessageEnd 4779011 MboxMarkerBegin 4779012 MboxMarkerEnd 4779019 MimeMessageBegin 4779020 -MimeMessageHeadersEnd 4780235 MimeEntityBegin 4779020 MimeEntityHeadersEnd 4780235 +MimeMessageHeadersEnd 4780235 MultipartPreambleBegin 4780235 MultipartPreambleEnd 4780235 MultipartBoundaryBegin 4780235 @@ -2105,9 +2105,9 @@ MimeMessageEnd 4908685 MboxMarkerBegin 4908686 MboxMarkerEnd 4908693 MimeMessageBegin 4908694 -MimeMessageHeadersEnd 4909446 MimeEntityBegin 4908694 MimeEntityHeadersEnd 4909446 +MimeMessageHeadersEnd 4909446 MultipartPreambleBegin 4909446 MultipartPreambleEnd 4909785 MultipartBoundaryBegin 4909785 @@ -2190,9 +2190,9 @@ MimeMessageEnd 5083311 MboxMarkerBegin 5083312 MboxMarkerEnd 5083319 MimeMessageBegin 5083320 -MimeMessageHeadersEnd 5084006 MimeEntityBegin 5083320 MimeEntityHeadersEnd 5084006 +MimeMessageHeadersEnd 5084006 MultipartPreambleBegin 5084006 MultipartPreambleEnd 5084161 MultipartBoundaryBegin 5084161 @@ -2331,9 +2331,9 @@ MimeMessageEnd 5299088 MboxMarkerBegin 5299089 MboxMarkerEnd 5299096 MimeMessageBegin 5299097 -MimeMessageHeadersEnd 5299489 MimeEntityBegin 5299097 MimeEntityHeadersEnd 5299489 +MimeMessageHeadersEnd 5299489 MultipartPreambleBegin 5299489 MultipartPreambleEnd 5299684 MultipartBoundaryBegin 5299684 @@ -2368,9 +2368,9 @@ MimeMessageEnd 5388898 MboxMarkerBegin 5388899 MboxMarkerEnd 5388906 MimeMessageBegin 5388907 -MimeMessageHeadersEnd 5389843 MimeEntityBegin 5388907 MimeEntityHeadersEnd 5389843 +MimeMessageHeadersEnd 5389843 Octets 50709 Lines 697 MimeEntityEnd 5440552 @@ -2378,9 +2378,9 @@ MimeMessageEnd 5440552 MboxMarkerBegin 5440553 MboxMarkerEnd 5440560 MimeMessageBegin 5440561 -MimeMessageHeadersEnd 5441173 MimeEntityBegin 5440561 MimeEntityHeadersEnd 5441173 +MimeMessageHeadersEnd 5441173 MultipartPreambleBegin 5441173 MultipartPreambleEnd 5441173 MultipartBoundaryBegin 5441173 @@ -3569,9 +3569,9 @@ MimeMessageEnd 5509954 MboxMarkerBegin 5509955 MboxMarkerEnd 5509962 MimeMessageBegin 5509963 -MimeMessageHeadersEnd 5510771 MimeEntityBegin 5509963 MimeEntityHeadersEnd 5510771 +MimeMessageHeadersEnd 5510771 Octets 1871 Lines 49 MimeEntityEnd 5512642 @@ -3579,9 +3579,9 @@ MimeMessageEnd 5512642 MboxMarkerBegin 5512643 MboxMarkerEnd 5512650 MimeMessageBegin 5512651 -MimeMessageHeadersEnd 5513378 MimeEntityBegin 5512651 MimeEntityHeadersEnd 5513378 +MimeMessageHeadersEnd 5513378 MultipartPreambleBegin 5513378 MultipartPreambleEnd 5513378 MultipartBoundaryBegin 5513378 @@ -3644,9 +3644,9 @@ MimeMessageEnd 5668007 MboxMarkerBegin 5668008 MboxMarkerEnd 5668015 MimeMessageBegin 5668016 -MimeMessageHeadersEnd 5668539 MimeEntityBegin 5668016 MimeEntityHeadersEnd 5668539 +MimeMessageHeadersEnd 5668539 Octets 568 Lines 22 MimeEntityEnd 5669107 @@ -3654,9 +3654,9 @@ MimeMessageEnd 5669107 MboxMarkerBegin 5669108 MboxMarkerEnd 5669115 MimeMessageBegin 5669116 -MimeMessageHeadersEnd 5670302 MimeEntityBegin 5669116 MimeEntityHeadersEnd 5670302 +MimeMessageHeadersEnd 5670302 MultipartPreambleBegin 5670302 MultipartPreambleEnd 5670457 MultipartBoundaryBegin 5670457 @@ -3711,9 +3711,9 @@ MimeMessageEnd 5730566 MboxMarkerBegin 5730567 MboxMarkerEnd 5730574 MimeMessageBegin 5730575 -MimeMessageHeadersEnd 5731315 MimeEntityBegin 5730575 MimeEntityHeadersEnd 5731315 +MimeMessageHeadersEnd 5731315 MultipartPreambleBegin 5731315 MultipartPreambleEnd 5731316 MultipartBoundaryBegin 5731316 @@ -3741,9 +3741,9 @@ MimeMessageEnd 5787038 MboxMarkerBegin 5787039 MboxMarkerEnd 5787070 MimeMessageBegin 5787071 -MimeMessageHeadersEnd 5788538 MimeEntityBegin 5787071 MimeEntityHeadersEnd 5788538 +MimeMessageHeadersEnd 5788538 Octets 1340 Lines 35 MimeEntityEnd 5789878 @@ -3751,9 +3751,9 @@ MimeMessageEnd 5789878 MboxMarkerBegin 5789879 MboxMarkerEnd 5789886 MimeMessageBegin 5789887 -MimeMessageHeadersEnd 5790681 MimeEntityBegin 5789887 MimeEntityHeadersEnd 5790681 +MimeMessageHeadersEnd 5790681 MultipartPreambleBegin 5790681 MultipartPreambleEnd 5790727 MultipartBoundaryBegin 5790727 @@ -3789,9 +3789,9 @@ MimeMessageEnd 5816805 MboxMarkerBegin 5816806 MboxMarkerEnd 5816813 MimeMessageBegin 5816814 -MimeMessageHeadersEnd 5817482 MimeEntityBegin 5816814 MimeEntityHeadersEnd 5817482 +MimeMessageHeadersEnd 5817482 MultipartPreambleBegin 5817482 MultipartPreambleEnd 5817528 MultipartBoundaryBegin 5817528 @@ -3819,9 +3819,9 @@ MimeMessageEnd 5839997 MboxMarkerBegin 5839998 MboxMarkerEnd 5840029 MimeMessageBegin 5840030 -MimeMessageHeadersEnd 5840554 MimeEntityBegin 5840030 MimeEntityHeadersEnd 5840554 +MimeMessageHeadersEnd 5840554 MultipartPreambleBegin 5840554 MultipartPreambleEnd 5840554 MultipartBoundaryBegin 5840554 @@ -3856,9 +3856,9 @@ MimeMessageEnd 5842388 MboxMarkerBegin 5842389 MboxMarkerEnd 5842396 MimeMessageBegin 5842397 -MimeMessageHeadersEnd 5843191 MimeEntityBegin 5842397 MimeEntityHeadersEnd 5843191 +MimeMessageHeadersEnd 5843191 Octets 256778 Lines 3519 MimeEntityEnd 6099969 @@ -3866,9 +3866,9 @@ MimeMessageEnd 6099969 MboxMarkerBegin 6099970 MboxMarkerEnd 6099977 MimeMessageBegin 6099978 -MimeMessageHeadersEnd 6100830 MimeEntityBegin 6099978 MimeEntityHeadersEnd 6100830 +MimeMessageHeadersEnd 6100830 MultipartPreambleBegin 6100830 MultipartPreambleEnd 6100831 MultipartBoundaryBegin 6100831 @@ -3896,9 +3896,9 @@ MimeMessageEnd 6199495 MboxMarkerBegin 6199496 MboxMarkerEnd 6199503 MimeMessageBegin 6199504 -MimeMessageHeadersEnd 6200381 MimeEntityBegin 6199504 MimeEntityHeadersEnd 6200381 +MimeMessageHeadersEnd 6200381 MultipartPreambleBegin 6200381 MultipartPreambleEnd 6200381 MultipartBoundaryBegin 6200381 @@ -4108,9 +4108,9 @@ MimeMessageEnd 6282825 MboxMarkerBegin 6282826 MboxMarkerEnd 6282833 MimeMessageBegin 6282834 -MimeMessageHeadersEnd 6283636 MimeEntityBegin 6282834 MimeEntityHeadersEnd 6283636 +MimeMessageHeadersEnd 6283636 Octets 9199 Lines 227 MimeEntityEnd 6292835 @@ -4118,9 +4118,9 @@ MimeMessageEnd 6292835 MboxMarkerBegin 6292836 MboxMarkerEnd 6292843 MimeMessageBegin 6292844 -MimeMessageHeadersEnd 6293572 MimeEntityBegin 6292844 MimeEntityHeadersEnd 6293572 +MimeMessageHeadersEnd 6293572 MultipartPreambleBegin 6293572 MultipartPreambleEnd 6293727 MultipartBoundaryBegin 6293727 @@ -4203,9 +4203,9 @@ MimeMessageEnd 6385847 MboxMarkerBegin 6385848 MboxMarkerEnd 6385855 MimeMessageBegin 6385856 -MimeMessageHeadersEnd 6386610 MimeEntityBegin 6385856 MimeEntityHeadersEnd 6386610 +MimeMessageHeadersEnd 6386610 MultipartPreambleBegin 6386610 MultipartPreambleEnd 6386805 MultipartBoundaryBegin 6386805 @@ -4240,9 +4240,9 @@ MimeMessageEnd 6421275 MboxMarkerBegin 6421276 MboxMarkerEnd 6421317 MimeMessageBegin 6421318 -MimeMessageHeadersEnd 6421466 MimeEntityBegin 6421318 MimeEntityHeadersEnd 6421466 +MimeMessageHeadersEnd 6421466 Octets 43029 Lines 694 MimeEntityEnd 6464495 @@ -4250,9 +4250,9 @@ MimeMessageEnd 6464495 MboxMarkerBegin 6464496 MboxMarkerEnd 6464527 MimeMessageBegin 6464528 -MimeMessageHeadersEnd 6465111 MimeEntityBegin 6464528 MimeEntityHeadersEnd 6465111 +MimeMessageHeadersEnd 6465111 MultipartPreambleBegin 6465111 MultipartPreambleEnd 6465157 MultipartBoundaryBegin 6465157 @@ -4300,9 +4300,9 @@ MimeMessageEnd 6490367 MboxMarkerBegin 6490368 MboxMarkerEnd 6490399 MimeMessageBegin 6490400 -MimeMessageHeadersEnd 6490806 MimeEntityBegin 6490400 MimeEntityHeadersEnd 6490806 +MimeMessageHeadersEnd 6490806 MultipartPreambleBegin 6490806 MultipartPreambleEnd 6490852 MultipartBoundaryBegin 6490852 @@ -4446,9 +4446,9 @@ MimeMessageEnd 6493572 MboxMarkerBegin 6493573 MboxMarkerEnd 6493604 MimeMessageBegin 6493605 -MimeMessageHeadersEnd 6494009 MimeEntityBegin 6493605 MimeEntityHeadersEnd 6494009 +MimeMessageHeadersEnd 6494009 MultipartPreambleBegin 6494009 MultipartPreambleEnd 6494055 MultipartBoundaryBegin 6494055 @@ -4503,9 +4503,9 @@ MimeMessageEnd 6844507 MboxMarkerBegin 6844508 MboxMarkerEnd 6844515 MimeMessageBegin 6844516 -MimeMessageHeadersEnd 6845120 MimeEntityBegin 6844516 MimeEntityHeadersEnd 6845120 +MimeMessageHeadersEnd 6845120 MultipartPreambleBegin 6845120 MultipartPreambleEnd 6845336 MultipartBoundaryBegin 6845336 @@ -4541,9 +4541,9 @@ MimeMessageEnd 6846556 MboxMarkerBegin 6846557 MboxMarkerEnd 6846564 MimeMessageBegin 6846565 -MimeMessageHeadersEnd 6846861 MimeEntityBegin 6846565 MimeEntityHeadersEnd 6846861 +MimeMessageHeadersEnd 6846861 MultipartPreambleBegin 6846861 MultipartPreambleEnd 6846861 MultipartBoundaryBegin 6846861 @@ -4571,9 +4571,9 @@ MimeMessageEnd 6858989 MboxMarkerBegin 6858990 MboxMarkerEnd 6858997 MimeMessageBegin 6858998 -MimeMessageHeadersEnd 6859294 MimeEntityBegin 6858998 MimeEntityHeadersEnd 6859294 +MimeMessageHeadersEnd 6859294 MultipartPreambleBegin 6859294 MultipartPreambleEnd 6859294 MultipartBoundaryBegin 6859294 @@ -4601,9 +4601,9 @@ MimeMessageEnd 6871390 MboxMarkerBegin 6871391 MboxMarkerEnd 6871422 MimeMessageBegin 6871423 -MimeMessageHeadersEnd 6872926 MimeEntityBegin 6871423 MimeEntityHeadersEnd 6872926 +MimeMessageHeadersEnd 6872926 MultipartPreambleBegin 6872926 MultipartPreambleEnd 6872927 MultipartBoundaryBegin 6872927 @@ -4631,9 +4631,9 @@ MimeMessageEnd 6879481 MboxMarkerBegin 6879482 MboxMarkerEnd 6879513 MimeMessageBegin 6879514 -MimeMessageHeadersEnd 6879961 MimeEntityBegin 6879514 MimeEntityHeadersEnd 6879961 +MimeMessageHeadersEnd 6879961 MultipartPreambleBegin 6879961 MultipartPreambleEnd 6879961 MultipartBoundaryBegin 6879961 @@ -4723,9 +4723,9 @@ MimeMessageEnd 7094537 MboxMarkerBegin 7094538 MboxMarkerEnd 7094545 MimeMessageBegin 7094546 -MimeMessageHeadersEnd 7094841 MimeEntityBegin 7094546 MimeEntityHeadersEnd 7094841 +MimeMessageHeadersEnd 7094841 MultipartPreambleBegin 7094841 MultipartPreambleEnd 7094841 MultipartBoundaryBegin 7094841 @@ -4753,9 +4753,9 @@ MimeMessageEnd 7106504 MboxMarkerBegin 7106505 MboxMarkerEnd 7106512 MimeMessageBegin 7106513 -MimeMessageHeadersEnd 7106808 MimeEntityBegin 7106513 MimeEntityHeadersEnd 7106808 +MimeMessageHeadersEnd 7106808 MultipartPreambleBegin 7106808 MultipartPreambleEnd 7106808 MultipartBoundaryBegin 7106808 @@ -4783,9 +4783,9 @@ MimeMessageEnd 7118734 MboxMarkerBegin 7118735 MboxMarkerEnd 7118742 MimeMessageBegin 7118743 -MimeMessageHeadersEnd 7119038 MimeEntityBegin 7118743 MimeEntityHeadersEnd 7119038 +MimeMessageHeadersEnd 7119038 MultipartPreambleBegin 7119038 MultipartPreambleEnd 7119038 MultipartBoundaryBegin 7119038 @@ -4813,9 +4813,9 @@ MimeMessageEnd 7130873 MboxMarkerBegin 7130874 MboxMarkerEnd 7130881 MimeMessageBegin 7130882 -MimeMessageHeadersEnd 7131177 MimeEntityBegin 7130882 MimeEntityHeadersEnd 7131177 +MimeMessageHeadersEnd 7131177 MultipartPreambleBegin 7131177 MultipartPreambleEnd 7131177 MultipartBoundaryBegin 7131177 @@ -4843,9 +4843,9 @@ MimeMessageEnd 7143201 MboxMarkerBegin 7143202 MboxMarkerEnd 7143209 MimeMessageBegin 7143210 -MimeMessageHeadersEnd 7143505 MimeEntityBegin 7143210 MimeEntityHeadersEnd 7143505 +MimeMessageHeadersEnd 7143505 MultipartPreambleBegin 7143505 MultipartPreambleEnd 7143505 MultipartBoundaryBegin 7143505 @@ -4873,9 +4873,9 @@ MimeMessageEnd 7155384 MboxMarkerBegin 7155385 MboxMarkerEnd 7155392 MimeMessageBegin 7155393 -MimeMessageHeadersEnd 7155688 MimeEntityBegin 7155393 MimeEntityHeadersEnd 7155688 +MimeMessageHeadersEnd 7155688 MultipartPreambleBegin 7155688 MultipartPreambleEnd 7155688 MultipartBoundaryBegin 7155688 @@ -4903,9 +4903,9 @@ MimeMessageEnd 7167782 MboxMarkerBegin 7167783 MboxMarkerEnd 7167814 MimeMessageBegin 7167815 -MimeMessageHeadersEnd 7169049 MimeEntityBegin 7167815 MimeEntityHeadersEnd 7169049 +MimeMessageHeadersEnd 7169049 MultipartPreambleBegin 7169049 MultipartPreambleEnd 7169095 MultipartBoundaryBegin 7169095 @@ -4981,9 +4981,9 @@ MimeMessageEnd 7916334 MboxMarkerBegin 7916335 MboxMarkerEnd 7916366 MimeMessageBegin 7916367 -MimeMessageHeadersEnd 7917631 MimeEntityBegin 7916367 MimeEntityHeadersEnd 7917631 +MimeMessageHeadersEnd 7917631 MultipartPreambleBegin 7917631 MultipartPreambleEnd 7917632 MultipartBoundaryBegin 7917632 @@ -5032,9 +5032,9 @@ MimeMessageEnd 7964259 MboxMarkerBegin 7964260 MboxMarkerEnd 7964267 MimeMessageBegin 7964268 -MimeMessageHeadersEnd 7965009 MimeEntityBegin 7964268 MimeEntityHeadersEnd 7965009 +MimeMessageHeadersEnd 7965009 Octets 544616 Lines 7475 MimeEntityEnd 8509625 @@ -5042,9 +5042,9 @@ MimeMessageEnd 8509625 MboxMarkerBegin 8509626 MboxMarkerEnd 8509633 MimeMessageBegin 8509634 -MimeMessageHeadersEnd 8510545 MimeEntityBegin 8509634 MimeEntityHeadersEnd 8510545 +MimeMessageHeadersEnd 8510545 MultipartPreambleBegin 8510545 MultipartPreambleEnd 8510546 MultipartBoundaryBegin 8510546 @@ -5065,9 +5065,9 @@ MimeMessageEnd 8513124 MboxMarkerBegin 8513125 MboxMarkerEnd 8513156 MimeMessageBegin 8513157 -MimeMessageHeadersEnd 8513751 MimeEntityBegin 8513157 MimeEntityHeadersEnd 8513751 +MimeMessageHeadersEnd 8513751 MultipartPreambleBegin 8513751 MultipartPreambleEnd 8514031 MultipartBoundaryBegin 8514031 @@ -5095,9 +5095,9 @@ MimeMessageEnd 8515537 MboxMarkerBegin 8515538 MboxMarkerEnd 8515545 MimeMessageBegin 8515546 -MimeMessageHeadersEnd 8516708 MimeEntityBegin 8515546 MimeEntityHeadersEnd 8516708 +MimeMessageHeadersEnd 8516708 Octets 1383 Lines 40 MimeEntityEnd 8518091 @@ -5105,9 +5105,9 @@ MimeMessageEnd 8518091 MboxMarkerBegin 8518092 MboxMarkerEnd 8518099 MimeMessageBegin 8518100 -MimeMessageHeadersEnd 8518733 MimeEntityBegin 8518100 MimeEntityHeadersEnd 8518733 +MimeMessageHeadersEnd 8518733 Octets 974 Lines 28 MimeEntityEnd 8519707 @@ -5115,9 +5115,9 @@ MimeMessageEnd 8519707 MboxMarkerBegin 8519708 MboxMarkerEnd 8519715 MimeMessageBegin 8519716 -MimeMessageHeadersEnd 8520478 MimeEntityBegin 8519716 MimeEntityHeadersEnd 8520478 +MimeMessageHeadersEnd 8520478 MultipartPreambleBegin 8520478 MultipartPreambleEnd 8520633 MultipartBoundaryBegin 8520633 @@ -5202,9 +5202,9 @@ MimeMessageEnd 8523391 MboxMarkerBegin 8523392 MboxMarkerEnd 8523399 MimeMessageBegin 8523400 -MimeMessageHeadersEnd 8524214 MimeEntityBegin 8523400 MimeEntityHeadersEnd 8524214 +MimeMessageHeadersEnd 8524214 Octets 1386 Lines 43 MimeEntityEnd 8525600 @@ -5212,9 +5212,9 @@ MimeMessageEnd 8525600 MboxMarkerBegin 8525601 MboxMarkerEnd 8525608 MimeMessageBegin 8525609 -MimeMessageHeadersEnd 8525761 MimeEntityBegin 8525609 MimeEntityHeadersEnd 8525761 +MimeMessageHeadersEnd 8525761 Octets 4671 Lines 64 MimeEntityEnd 8530432 @@ -5222,9 +5222,9 @@ MimeMessageEnd 8530432 MboxMarkerBegin 8530433 MboxMarkerEnd 8530440 MimeMessageBegin 8530441 -MimeMessageHeadersEnd 8532184 MimeEntityBegin 8530441 MimeEntityHeadersEnd 8532184 +MimeMessageHeadersEnd 8532184 MultipartPreambleBegin 8532184 MultipartPreambleEnd 8532339 MultipartBoundaryBegin 8532339 @@ -5377,9 +5377,9 @@ MimeMessageEnd 8543555 MboxMarkerBegin 8543556 MboxMarkerEnd 8543563 MimeMessageBegin 8543564 -MimeMessageHeadersEnd 8544292 MimeEntityBegin 8543564 MimeEntityHeadersEnd 8544292 +MimeMessageHeadersEnd 8544292 MultipartPreambleBegin 8544292 MultipartPreambleEnd 8544447 MultipartBoundaryBegin 8544447 @@ -5434,9 +5434,9 @@ MimeMessageEnd 8554952 MboxMarkerBegin 8554953 MboxMarkerEnd 8554960 MimeMessageBegin 8554961 -MimeMessageHeadersEnd 8555607 MimeEntityBegin 8554961 MimeEntityHeadersEnd 8555607 +MimeMessageHeadersEnd 8555607 MultipartPreambleBegin 8555607 MultipartPreambleEnd 8555608 MultipartBoundaryBegin 8555608 @@ -5464,9 +5464,9 @@ MimeMessageEnd 8634515 MboxMarkerBegin 8634516 MboxMarkerEnd 8634523 MimeMessageBegin 8634524 -MimeMessageHeadersEnd 8635280 MimeEntityBegin 8634524 MimeEntityHeadersEnd 8635280 +MimeMessageHeadersEnd 8635280 MultipartPreambleBegin 8635280 MultipartPreambleEnd 8635435 MultipartBoundaryBegin 8635435 @@ -5535,9 +5535,9 @@ MimeMessageEnd 8820549 MboxMarkerBegin 8820550 MboxMarkerEnd 8820557 MimeMessageBegin 8820558 -MimeMessageHeadersEnd 8821395 MimeEntityBegin 8820558 MimeEntityHeadersEnd 8821395 +MimeMessageHeadersEnd 8821395 Octets 1733 Lines 26 MimeEntityEnd 8823128 @@ -5545,9 +5545,9 @@ MimeMessageEnd 8823128 MboxMarkerBegin 8823129 MboxMarkerEnd 8823136 MimeMessageBegin 8823137 -MimeMessageHeadersEnd 8823767 MimeEntityBegin 8823137 MimeEntityHeadersEnd 8823767 +MimeMessageHeadersEnd 8823767 MimeMessageBegin 8823767 MimeEntityBegin 8823767 MimeEntityHeadersEnd 8824250 @@ -5563,9 +5563,9 @@ MimeMessageEnd 8825125 MboxMarkerBegin 8825126 MboxMarkerEnd 8825133 MimeMessageBegin 8825134 -MimeMessageHeadersEnd 8825579 MimeEntityBegin 8825134 MimeEntityHeadersEnd 8825579 +MimeMessageHeadersEnd 8825579 MultipartPreambleBegin 8825579 MultipartPreambleEnd 8825579 MultipartBoundaryBegin 8825579 @@ -5593,9 +5593,9 @@ MimeMessageEnd 8916963 MboxMarkerBegin 8916964 MboxMarkerEnd 8916971 MimeMessageBegin 8916972 -MimeMessageHeadersEnd 8917462 MimeEntityBegin 8916972 MimeEntityHeadersEnd 8917462 +MimeMessageHeadersEnd 8917462 Octets 1142 Lines 28 MimeEntityEnd 8918604 @@ -5603,9 +5603,9 @@ MimeMessageEnd 8918604 MboxMarkerBegin 8918605 MboxMarkerEnd 8918612 MimeMessageBegin 8918613 -MimeMessageHeadersEnd 8919753 MimeEntityBegin 8918613 MimeEntityHeadersEnd 8919753 +MimeMessageHeadersEnd 8919753 MultipartPreambleBegin 8919753 MultipartPreambleEnd 8919753 MultipartBoundaryBegin 8919753 @@ -5661,9 +5661,9 @@ MimeMessageEnd 9013870 MboxMarkerBegin 9013871 MboxMarkerEnd 9013902 MimeMessageBegin 9013903 -MimeMessageHeadersEnd 9015056 MimeEntityBegin 9013903 MimeEntityHeadersEnd 9015056 +MimeMessageHeadersEnd 9015056 MultipartPreambleBegin 9015056 MultipartPreambleEnd 9015056 MultipartBoundaryBegin 9015056 @@ -5691,9 +5691,9 @@ MimeMessageEnd 9016840 MboxMarkerBegin 9016841 MboxMarkerEnd 9016872 MimeMessageBegin 9016873 -MimeMessageHeadersEnd 9018015 MimeEntityBegin 9016873 MimeEntityHeadersEnd 9018015 +MimeMessageHeadersEnd 9018015 MultipartPreambleBegin 9018015 MultipartPreambleEnd 9018188 MultipartBoundaryBegin 9018188 @@ -5721,9 +5721,9 @@ MimeMessageEnd 9021424 MboxMarkerBegin 9021425 MboxMarkerEnd 9021456 MimeMessageBegin 9021457 -MimeMessageHeadersEnd 9022594 MimeEntityBegin 9021457 MimeEntityHeadersEnd 9022594 +MimeMessageHeadersEnd 9022594 MultipartPreambleBegin 9022594 MultipartPreambleEnd 9022767 MultipartBoundaryBegin 9022767 @@ -5751,9 +5751,9 @@ MimeMessageEnd 9028448 MboxMarkerBegin 9028449 MboxMarkerEnd 9028456 MimeMessageBegin 9028457 -MimeMessageHeadersEnd 9028665 MimeEntityBegin 9028457 MimeEntityHeadersEnd 9028665 +MimeMessageHeadersEnd 9028665 Octets 4193 Lines 58 MimeEntityEnd 9032858 @@ -5761,9 +5761,9 @@ MimeMessageEnd 9032858 MboxMarkerBegin 9032859 MboxMarkerEnd 9032890 MimeMessageBegin 9032891 -MimeMessageHeadersEnd 9033791 MimeEntityBegin 9032891 MimeEntityHeadersEnd 9033791 +MimeMessageHeadersEnd 9033791 MultipartPreambleBegin 9033791 MultipartPreambleEnd 9033837 MultipartBoundaryBegin 9033837 @@ -5791,9 +5791,9 @@ MimeMessageEnd 9049540 MboxMarkerBegin 9049541 MboxMarkerEnd 9049572 MimeMessageBegin 9049573 -MimeMessageHeadersEnd 9050380 MimeEntityBegin 9049573 MimeEntityHeadersEnd 9050380 +MimeMessageHeadersEnd 9050380 Octets 16761 Lines 258 MimeEntityEnd 9067141 @@ -5801,9 +5801,9 @@ MimeMessageEnd 9067141 MboxMarkerBegin 9067142 MboxMarkerEnd 9067173 MimeMessageBegin 9067174 -MimeMessageHeadersEnd 9067986 MimeEntityBegin 9067174 MimeEntityHeadersEnd 9067986 +MimeMessageHeadersEnd 9067986 Octets 24964 Lines 385 MimeEntityEnd 9092950 @@ -5811,9 +5811,9 @@ MimeMessageEnd 9092950 MboxMarkerBegin 9092951 MboxMarkerEnd 9092982 MimeMessageBegin 9092983 -MimeMessageHeadersEnd 9093795 MimeEntityBegin 9092983 MimeEntityHeadersEnd 9093795 +MimeMessageHeadersEnd 9093795 Octets 36131 Lines 556 MimeEntityEnd 9129926 @@ -5821,9 +5821,9 @@ MimeMessageEnd 9129926 MboxMarkerBegin 9129927 MboxMarkerEnd 9129958 MimeMessageBegin 9129959 -MimeMessageHeadersEnd 9130774 MimeEntityBegin 9129959 MimeEntityHeadersEnd 9130774 +MimeMessageHeadersEnd 9130774 Octets 51301 Lines 790 MimeEntityEnd 9182075 @@ -5831,9 +5831,9 @@ MimeMessageEnd 9182075 MboxMarkerBegin 9182076 MboxMarkerEnd 9182107 MimeMessageBegin 9182108 -MimeMessageHeadersEnd 9183499 MimeEntityBegin 9182108 MimeEntityHeadersEnd 9183499 +MimeMessageHeadersEnd 9183499 Octets 1431 Lines 20 MimeEntityEnd 9184930 @@ -5841,9 +5841,9 @@ MimeMessageEnd 9184930 MboxMarkerBegin 9184931 MboxMarkerEnd 9184962 MimeMessageBegin 9184963 -MimeMessageHeadersEnd 9186316 MimeEntityBegin 9184963 MimeEntityHeadersEnd 9186316 +MimeMessageHeadersEnd 9186316 MultipartPreambleBegin 9186316 MultipartPreambleEnd 9186317 MultipartBoundaryBegin 9186317 @@ -5871,9 +5871,9 @@ MimeMessageEnd 9190708 MboxMarkerBegin 9190709 MboxMarkerEnd 9190740 MimeMessageBegin 9190741 -MimeMessageHeadersEnd 9191951 MimeEntityBegin 9190741 MimeEntityHeadersEnd 9191951 +MimeMessageHeadersEnd 9191951 Octets 3495 Lines 56 MimeEntityEnd 9195446 @@ -5881,9 +5881,9 @@ MimeMessageEnd 9195446 MboxMarkerBegin 9195447 MboxMarkerEnd 9195478 MimeMessageBegin 9195479 -MimeMessageHeadersEnd 9196556 MimeEntityBegin 9195479 MimeEntityHeadersEnd 9196556 +MimeMessageHeadersEnd 9196556 Octets 661 Lines 10 MimeEntityEnd 9197217 @@ -5891,9 +5891,9 @@ MimeMessageEnd 9197217 MboxMarkerBegin 9197218 MboxMarkerEnd 9197225 MimeMessageBegin 9197226 -MimeMessageHeadersEnd 9197618 MimeEntityBegin 9197226 MimeEntityHeadersEnd 9197618 +MimeMessageHeadersEnd 9197618 Octets 7620 Lines 105 MimeEntityEnd 9205238 @@ -5901,9 +5901,9 @@ MimeMessageEnd 9205238 MboxMarkerBegin 9205239 MboxMarkerEnd 9205270 MimeMessageBegin 9205271 -MimeMessageHeadersEnd 9206054 MimeEntityBegin 9205271 MimeEntityHeadersEnd 9206054 +MimeMessageHeadersEnd 9206054 MimeMessageBegin 9206054 MimeEntityBegin 9206054 MimeEntityHeadersEnd 9207434 @@ -5919,9 +5919,9 @@ MimeMessageEnd 9208866 MboxMarkerBegin 9208867 MboxMarkerEnd 9208898 MimeMessageBegin 9208899 -MimeMessageHeadersEnd 9209609 MimeEntityBegin 9208899 MimeEntityHeadersEnd 9209609 +MimeMessageHeadersEnd 9209609 MultipartPreambleBegin 9209609 MultipartPreambleEnd 9209655 MultipartBoundaryBegin 9209655 @@ -5957,9 +5957,9 @@ MimeMessageEnd 9212797 MboxMarkerBegin 9212798 MboxMarkerEnd 9212829 MimeMessageBegin 9212830 -MimeMessageHeadersEnd 9213495 MimeEntityBegin 9212830 MimeEntityHeadersEnd 9213495 +MimeMessageHeadersEnd 9213495 MultipartPreambleBegin 9213495 MultipartPreambleEnd 9213555 MultipartBoundaryBegin 9213555 @@ -5987,9 +5987,9 @@ MimeMessageEnd 9219506 MboxMarkerBegin 9219507 MboxMarkerEnd 9219538 MimeMessageBegin 9219539 -MimeMessageHeadersEnd 9220601 MimeEntityBegin 9219539 MimeEntityHeadersEnd 9220601 +MimeMessageHeadersEnd 9220601 Octets 10236 Lines 141 MimeEntityEnd 9230837 @@ -5997,9 +5997,9 @@ MimeMessageEnd 9230837 MboxMarkerBegin 9230838 MboxMarkerEnd 9230869 MimeMessageBegin 9230870 -MimeMessageHeadersEnd 9232246 MimeEntityBegin 9230870 MimeEntityHeadersEnd 9232246 +MimeMessageHeadersEnd 9232246 MultipartPreambleBegin 9232246 MultipartPreambleEnd 9232306 MultipartBoundaryBegin 9232306 @@ -6027,9 +6027,9 @@ MimeMessageEnd 9235059 MboxMarkerBegin 9235060 MboxMarkerEnd 9235091 MimeMessageBegin 9235092 -MimeMessageHeadersEnd 9235640 MimeEntityBegin 9235092 MimeEntityHeadersEnd 9235640 +MimeMessageHeadersEnd 9235640 Octets 523 Lines 8 MimeEntityEnd 9236163 @@ -6037,9 +6037,9 @@ MimeMessageEnd 9236163 MboxMarkerBegin 9236164 MboxMarkerEnd 9236171 MimeMessageBegin 9236172 -MimeMessageHeadersEnd 9237488 MimeEntityBegin 9236172 MimeEntityHeadersEnd 9237488 +MimeMessageHeadersEnd 9237488 MultipartPreambleBegin 9237488 MultipartPreambleEnd 9237704 MultipartBoundaryBegin 9237704 @@ -6060,9 +6060,9 @@ MimeMessageEnd 9238420 MboxMarkerBegin 9238421 MboxMarkerEnd 9238428 MimeMessageBegin 9238429 -MimeMessageHeadersEnd 9239776 MimeEntityBegin 9238429 MimeEntityHeadersEnd 9239776 +MimeMessageHeadersEnd 9239776 MultipartPreambleBegin 9239776 MultipartPreambleEnd 9239992 MultipartBoundaryBegin 9239992 @@ -6132,9 +6132,9 @@ MimeMessageEnd 9248589 MboxMarkerBegin 9248590 MboxMarkerEnd 9248621 MimeMessageBegin 9248622 -MimeMessageHeadersEnd 9249837 MimeEntityBegin 9248622 MimeEntityHeadersEnd 9249837 +MimeMessageHeadersEnd 9249837 Octets 2882 Lines 39 MimeEntityEnd 9252719 @@ -6142,9 +6142,9 @@ MimeMessageEnd 9252719 MboxMarkerBegin 9252720 MboxMarkerEnd 9252751 MimeMessageBegin 9252752 -MimeMessageHeadersEnd 9253910 MimeEntityBegin 9252752 MimeEntityHeadersEnd 9253910 +MimeMessageHeadersEnd 9253910 Octets 2122 Lines 31 MimeEntityEnd 9256032 @@ -6152,9 +6152,9 @@ MimeMessageEnd 9256032 MboxMarkerBegin 9256033 MboxMarkerEnd 9256064 MimeMessageBegin 9256065 -MimeMessageHeadersEnd 9257143 MimeEntityBegin 9256065 MimeEntityHeadersEnd 9257143 +MimeMessageHeadersEnd 9257143 MultipartPreambleBegin 9257143 MultipartPreambleEnd 9257144 MultipartBoundaryBegin 9257144 @@ -6182,9 +6182,9 @@ MimeMessageEnd 9260100 MboxMarkerBegin 9260101 MboxMarkerEnd 9260132 MimeMessageBegin 9260133 -MimeMessageHeadersEnd 9261170 MimeEntityBegin 9260133 MimeEntityHeadersEnd 9261170 +MimeMessageHeadersEnd 9261170 MultipartPreambleBegin 9261170 MultipartPreambleEnd 9261171 MultipartBoundaryBegin 9261171 @@ -6219,9 +6219,9 @@ MimeMessageEnd 9264050 MboxMarkerBegin 9264051 MboxMarkerEnd 9264082 MimeMessageBegin 9264083 -MimeMessageHeadersEnd 9265158 MimeEntityBegin 9264083 MimeEntityHeadersEnd 9265158 +MimeMessageHeadersEnd 9265158 MultipartPreambleBegin 9265158 MultipartPreambleEnd 9265159 MultipartBoundaryBegin 9265159 @@ -6249,9 +6249,9 @@ MimeMessageEnd 9269686 MboxMarkerBegin 9269687 MboxMarkerEnd 9269694 MimeMessageBegin 9269695 -MimeMessageHeadersEnd 9270246 MimeEntityBegin 9269695 MimeEntityHeadersEnd 9270246 +MimeMessageHeadersEnd 9270246 MultipartPreambleBegin 9270246 MultipartPreambleEnd 9270247 MultipartBoundaryBegin 9270247 @@ -6279,9 +6279,9 @@ MimeMessageEnd 9274666 MboxMarkerBegin 9274667 MboxMarkerEnd 9274698 MimeMessageBegin 9274699 -MimeMessageHeadersEnd 9275863 MimeEntityBegin 9274699 MimeEntityHeadersEnd 9275863 +MimeMessageHeadersEnd 9275863 MultipartPreambleBegin 9275863 MultipartPreambleEnd 9276000 MultipartBoundaryBegin 9276000 @@ -6309,9 +6309,9 @@ MimeMessageEnd 9279928 MboxMarkerBegin 9279929 MboxMarkerEnd 9279960 MimeMessageBegin 9279961 -MimeMessageHeadersEnd 9281063 MimeEntityBegin 9279961 MimeEntityHeadersEnd 9281063 +MimeMessageHeadersEnd 9281063 MultipartPreambleBegin 9281063 MultipartPreambleEnd 9281064 MultipartBoundaryBegin 9281064 @@ -6339,9 +6339,9 @@ MimeMessageEnd 9285114 MboxMarkerBegin 9285115 MboxMarkerEnd 9285146 MimeMessageBegin 9285147 -MimeMessageHeadersEnd 9286275 MimeEntityBegin 9285147 MimeEntityHeadersEnd 9286275 +MimeMessageHeadersEnd 9286275 MultipartPreambleBegin 9286275 MultipartPreambleEnd 9286388 MultipartBoundaryBegin 9286388 @@ -6377,9 +6377,9 @@ MimeMessageEnd 9287538 MboxMarkerBegin 9287539 MboxMarkerEnd 9287584 MimeMessageBegin 9287585 -MimeMessageHeadersEnd 9287750 MimeEntityBegin 9287585 MimeEntityHeadersEnd 9287750 +MimeMessageHeadersEnd 9287750 Octets 34494 Lines 593 MimeEntityEnd 9322244 @@ -6387,9 +6387,9 @@ MimeMessageEnd 9322244 MboxMarkerBegin 9322245 MboxMarkerEnd 9322290 MimeMessageBegin 9322291 -MimeMessageHeadersEnd 9322449 MimeEntityBegin 9322291 MimeEntityHeadersEnd 9322449 +MimeMessageHeadersEnd 9322449 Octets 34494 Lines 593 MimeEntityEnd 9356943 @@ -6397,9 +6397,9 @@ MimeMessageEnd 9356943 MboxMarkerBegin 9356944 MboxMarkerEnd 9356951 MimeMessageBegin 9356952 -MimeMessageHeadersEnd 9357549 MimeEntityBegin 9356952 MimeEntityHeadersEnd 9357549 +MimeMessageHeadersEnd 9357549 Octets 1400 Lines 39 MimeEntityEnd 9358949 @@ -6407,9 +6407,9 @@ MimeMessageEnd 9358949 MboxMarkerBegin 9358950 MboxMarkerEnd 9358957 MimeMessageBegin 9358958 -MimeMessageHeadersEnd 9359858 MimeEntityBegin 9358958 MimeEntityHeadersEnd 9359858 +MimeMessageHeadersEnd 9359858 MultipartPreambleBegin 9359858 MultipartPreambleEnd 9359858 MultipartBoundaryBegin 9359858 @@ -6437,9 +6437,9 @@ MimeMessageEnd 9602012 MboxMarkerBegin 9602013 MboxMarkerEnd 9602020 MimeMessageBegin 9602021 -MimeMessageHeadersEnd 9602615 MimeEntityBegin 9602021 MimeEntityHeadersEnd 9602615 +MimeMessageHeadersEnd 9602615 MultipartPreambleBegin 9602615 MultipartPreambleEnd 9602649 MultipartBoundaryBegin 9602649 @@ -6460,9 +6460,9 @@ MimeMessageEnd 9681155 MboxMarkerBegin 9681156 MboxMarkerEnd 9681163 MimeMessageBegin 9681164 -MimeMessageHeadersEnd 9681316 MimeEntityBegin 9681164 MimeEntityHeadersEnd 9681316 +MimeMessageHeadersEnd 9681316 Octets 3560 Lines 49 MimeEntityEnd 9684876 @@ -6470,9 +6470,9 @@ MimeMessageEnd 9684876 MboxMarkerBegin 9684877 MboxMarkerEnd 9684884 MimeMessageBegin 9684885 -MimeMessageHeadersEnd 9685657 MimeEntityBegin 9684885 MimeEntityHeadersEnd 9685657 +MimeMessageHeadersEnd 9685657 MultipartPreambleBegin 9685657 MultipartPreambleEnd 9685812 MultipartBoundaryBegin 9685812 @@ -6555,9 +6555,9 @@ MimeMessageEnd 9715925 MboxMarkerBegin 9715926 MboxMarkerEnd 9715933 MimeMessageBegin 9715934 -MimeMessageHeadersEnd 9715990 MimeEntityBegin 9715934 MimeEntityHeadersEnd 9715990 +MimeMessageHeadersEnd 9715990 Octets 1208 Lines 28 MimeEntityEnd 9717198 @@ -6565,9 +6565,9 @@ MimeMessageEnd 9717198 MboxMarkerBegin 9717199 MboxMarkerEnd 9717230 MimeMessageBegin 9717231 -MimeMessageHeadersEnd 9717382 MimeEntityBegin 9717231 MimeEntityHeadersEnd 9717382 +MimeMessageHeadersEnd 9717382 Octets 3108 Lines 68 MimeEntityEnd 9720490 @@ -6575,9 +6575,9 @@ MimeMessageEnd 9720490 MboxMarkerBegin 9720491 MboxMarkerEnd 9720522 MimeMessageBegin 9720523 -MimeMessageHeadersEnd 9722388 MimeEntityBegin 9720523 MimeEntityHeadersEnd 9722388 +MimeMessageHeadersEnd 9722388 MultipartPreambleBegin 9722388 MultipartPreambleEnd 9722388 MultipartBoundaryBegin 9722388 @@ -6605,9 +6605,9 @@ MimeMessageEnd 9727267 MboxMarkerBegin 9727268 MboxMarkerEnd 9727275 MimeMessageBegin 9727276 -MimeMessageHeadersEnd 9727830 MimeEntityBegin 9727276 MimeEntityHeadersEnd 9727830 +MimeMessageHeadersEnd 9727830 MultipartPreambleBegin 9727830 MultipartPreambleEnd 9727831 MultipartBoundaryBegin 9727831 @@ -6635,9 +6635,9 @@ MimeMessageEnd 9844660 MboxMarkerBegin 9844661 MboxMarkerEnd 9844668 MimeMessageBegin 9844669 -MimeMessageHeadersEnd 9845465 MimeEntityBegin 9844669 MimeEntityHeadersEnd 9845465 +MimeMessageHeadersEnd 9845465 MultipartPreambleBegin 9845465 MultipartPreambleEnd 9845620 MultipartBoundaryBegin 9845620 @@ -6750,9 +6750,9 @@ MimeMessageEnd 9870085 MboxMarkerBegin 9870086 MboxMarkerEnd 9870093 MimeMessageBegin 9870094 -MimeMessageHeadersEnd 9871206 MimeEntityBegin 9870094 MimeEntityHeadersEnd 9871206 +MimeMessageHeadersEnd 9871206 MultipartPreambleBegin 9871206 MultipartPreambleEnd 9871206 MultipartBoundaryBegin 9871206 @@ -6787,9 +6787,9 @@ MimeMessageEnd 9901796 MboxMarkerBegin 9901797 MboxMarkerEnd 9901804 MimeMessageBegin 9901805 -MimeMessageHeadersEnd 9903514 MimeEntityBegin 9901805 MimeEntityHeadersEnd 9903514 +MimeMessageHeadersEnd 9903514 Octets 182799 Lines 2952 MimeEntityEnd 10086313 @@ -6797,9 +6797,9 @@ MimeMessageEnd 10086313 MboxMarkerBegin 10086314 MboxMarkerEnd 10086321 MimeMessageBegin 10086322 -MimeMessageHeadersEnd 10087029 MimeEntityBegin 10086322 MimeEntityHeadersEnd 10087029 +MimeMessageHeadersEnd 10087029 MultipartPreambleBegin 10087029 MultipartPreambleEnd 10087029 MultipartBoundaryBegin 10087029 @@ -6834,9 +6834,9 @@ MimeMessageEnd 10171317 MboxMarkerBegin 10171318 MboxMarkerEnd 10171325 MimeMessageBegin 10171326 -MimeMessageHeadersEnd 10171993 MimeEntityBegin 10171326 MimeEntityHeadersEnd 10171993 +MimeMessageHeadersEnd 10171993 MultipartPreambleBegin 10171993 MultipartPreambleEnd 10171993 MultipartBoundaryBegin 10171993 @@ -6899,9 +6899,9 @@ MimeMessageEnd 10392019 MboxMarkerBegin 10392020 MboxMarkerEnd 10392027 MimeMessageBegin 10392028 -MimeMessageHeadersEnd 10392292 MimeEntityBegin 10392028 MimeEntityHeadersEnd 10392292 +MimeMessageHeadersEnd 10392292 Octets 74658 Lines 1023 MimeEntityEnd 10466950 @@ -6909,9 +6909,9 @@ MimeMessageEnd 10466950 MboxMarkerBegin 10466951 MboxMarkerEnd 10466958 MimeMessageBegin 10466959 -MimeMessageHeadersEnd 10468233 MimeEntityBegin 10466959 MimeEntityHeadersEnd 10468233 +MimeMessageHeadersEnd 10468233 MultipartPreambleBegin 10468233 MultipartPreambleEnd 10468759 MultipartBoundaryBegin 10468759 @@ -6973,9 +6973,9 @@ MimeMessageEnd 10523298 MboxMarkerBegin 10523299 MboxMarkerEnd 10523306 MimeMessageBegin 10523307 -MimeMessageHeadersEnd 10523459 MimeEntityBegin 10523307 MimeEntityHeadersEnd 10523459 +MimeMessageHeadersEnd 10523459 Octets 4803 Lines 68 MimeEntityEnd 10528262 @@ -6983,9 +6983,9 @@ MimeMessageEnd 10528262 MboxMarkerBegin 10528263 MboxMarkerEnd 10528270 MimeMessageBegin 10528271 -MimeMessageHeadersEnd 10529016 MimeEntityBegin 10528271 MimeEntityHeadersEnd 10529016 +MimeMessageHeadersEnd 10529016 MultipartPreambleBegin 10529016 MultipartPreambleEnd 10529355 MultipartBoundaryBegin 10529355 From 10a1d197f3dd37bb5367a3bc1528fad9f099ef7b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 10:31:36 -0400 Subject: [PATCH 647/741] Fixed unit tests on Windows --- .../mbox/content-length.dos-offsets.txt | 58 ++-- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 304 +++++++++--------- 2 files changed, 181 insertions(+), 181 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index b961b351b9..b4b5c94cf9 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -1,9 +1,9 @@ MboxMarkerBegin 0 MboxMarkerEnd 7 MimeMessageBegin 9 -MimeMessageHeadersEnd 675 MimeEntityBegin 9 MimeEntityHeadersEnd 675 +MimeMessageHeadersEnd 675 MultipartPreambleBegin 675 MultipartPreambleEnd 675 MultipartBoundaryBegin 675 @@ -39,9 +39,9 @@ MimeMessageEnd 1939 MboxMarkerBegin 1941 MboxMarkerEnd 1948 MimeMessageBegin 1950 -MimeMessageHeadersEnd 2430 MimeEntityBegin 1950 MimeEntityHeadersEnd 2430 +MimeMessageHeadersEnd 2430 MultipartPreambleBegin 2430 MultipartPreambleEnd 2478 MultipartBoundaryBegin 2478 @@ -151,9 +151,9 @@ MimeMessageEnd 8331 MboxMarkerBegin 8333 MboxMarkerEnd 8340 MimeMessageBegin 8342 -MimeMessageHeadersEnd 8825 MimeEntityBegin 8342 MimeEntityHeadersEnd 8825 +MimeMessageHeadersEnd 8825 MultipartPreambleBegin 8825 MultipartPreambleEnd 8873 MultipartBoundaryBegin 8873 @@ -263,9 +263,9 @@ MimeMessageEnd 14761 MboxMarkerBegin 14763 MboxMarkerEnd 14794 MimeMessageBegin 14796 -MimeMessageHeadersEnd 16325 MimeEntityBegin 14796 MimeEntityHeadersEnd 16325 +MimeMessageHeadersEnd 16325 MultipartPreambleBegin 16325 MultipartPreambleEnd 16327 MultipartBoundaryBegin 16327 @@ -293,9 +293,9 @@ MimeMessageEnd 23019 MboxMarkerBegin 23021 MboxMarkerEnd 23052 MimeMessageBegin 23054 -MimeMessageHeadersEnd 24310 MimeEntityBegin 23054 MimeEntityHeadersEnd 24310 +MimeMessageHeadersEnd 24310 MultipartPreambleBegin 24310 MultipartPreambleEnd 24358 MultipartBoundaryBegin 24358 @@ -371,9 +371,9 @@ MimeMessageEnd 781880 MboxMarkerBegin 781882 MboxMarkerEnd 781913 MimeMessageBegin 781915 -MimeMessageHeadersEnd 783201 MimeEntityBegin 781915 MimeEntityHeadersEnd 783201 +MimeMessageHeadersEnd 783201 MultipartPreambleBegin 783201 MultipartPreambleEnd 783203 MultipartBoundaryBegin 783203 @@ -422,9 +422,9 @@ MimeMessageEnd 830478 MboxMarkerBegin 830480 MboxMarkerEnd 830487 MimeMessageBegin 830489 -MimeMessageHeadersEnd 831421 MimeEntityBegin 830489 MimeEntityHeadersEnd 831421 +MimeMessageHeadersEnd 831421 MultipartPreambleBegin 831421 MultipartPreambleEnd 831423 MultipartBoundaryBegin 831423 @@ -445,9 +445,9 @@ MimeMessageEnd 834102 MboxMarkerBegin 834104 MboxMarkerEnd 834135 MimeMessageBegin 834137 -MimeMessageHeadersEnd 835308 MimeEntityBegin 834137 MimeEntityHeadersEnd 835308 +MimeMessageHeadersEnd 835308 MultipartPreambleBegin 835308 MultipartPreambleEnd 835308 MultipartBoundaryBegin 835308 @@ -475,9 +475,9 @@ MimeMessageEnd 837133 MboxMarkerBegin 837135 MboxMarkerEnd 837166 MimeMessageBegin 837168 -MimeMessageHeadersEnd 838329 MimeEntityBegin 837168 MimeEntityHeadersEnd 838329 +MimeMessageHeadersEnd 838329 MultipartPreambleBegin 838329 MultipartPreambleEnd 838505 MultipartBoundaryBegin 838505 @@ -505,9 +505,9 @@ MimeMessageEnd 841797 MboxMarkerBegin 841799 MboxMarkerEnd 841830 MimeMessageBegin 841832 -MimeMessageHeadersEnd 842992 MimeEntityBegin 841832 MimeEntityHeadersEnd 842992 +MimeMessageHeadersEnd 842992 MultipartPreambleBegin 842992 MultipartPreambleEnd 843168 MultipartBoundaryBegin 843168 @@ -535,9 +535,9 @@ MimeMessageEnd 848942 MboxMarkerBegin 848944 MboxMarkerEnd 848975 MimeMessageBegin 848977 -MimeMessageHeadersEnd 849895 MimeEntityBegin 848977 MimeEntityHeadersEnd 849895 +MimeMessageHeadersEnd 849895 MultipartPreambleBegin 849895 MultipartPreambleEnd 849943 MultipartBoundaryBegin 849943 @@ -565,9 +565,9 @@ MimeMessageEnd 865868 MboxMarkerBegin 865870 MboxMarkerEnd 865901 MimeMessageBegin 865903 -MimeMessageHeadersEnd 867318 MimeEntityBegin 865903 MimeEntityHeadersEnd 867318 +MimeMessageHeadersEnd 867318 Octets 1450 Lines 20 MimeEntityEnd 868768 @@ -575,9 +575,9 @@ MimeMessageEnd 868768 MboxMarkerBegin 868770 MboxMarkerEnd 868801 MimeMessageBegin 868803 -MimeMessageHeadersEnd 870180 MimeEntityBegin 868803 MimeEntityHeadersEnd 870180 +MimeMessageHeadersEnd 870180 MultipartPreambleBegin 870180 MultipartPreambleEnd 870182 MultipartBoundaryBegin 870182 @@ -605,9 +605,9 @@ MimeMessageEnd 874641 MboxMarkerBegin 874643 MboxMarkerEnd 874674 MimeMessageBegin 874676 -MimeMessageHeadersEnd 875907 MimeEntityBegin 874676 MimeEntityHeadersEnd 875907 +MimeMessageHeadersEnd 875907 Octets 3550 Lines 56 MimeEntityEnd 879457 @@ -615,9 +615,9 @@ MimeMessageEnd 879457 MboxMarkerBegin 879459 MboxMarkerEnd 879490 MimeMessageBegin 879492 -MimeMessageHeadersEnd 880590 MimeEntityBegin 879492 MimeEntityHeadersEnd 880590 +MimeMessageHeadersEnd 880590 Octets 670 Lines 10 MimeEntityEnd 881260 @@ -625,9 +625,9 @@ MimeMessageEnd 881260 MboxMarkerBegin 881262 MboxMarkerEnd 881293 MimeMessageBegin 881295 -MimeMessageHeadersEnd 882097 MimeEntityBegin 881295 MimeEntityHeadersEnd 882097 +MimeMessageHeadersEnd 882097 MimeMessageBegin 882097 MimeEntityBegin 882097 MimeEntityHeadersEnd 883500 @@ -643,9 +643,9 @@ MimeMessageEnd 884952 MboxMarkerBegin 884954 MboxMarkerEnd 884985 MimeMessageBegin 884987 -MimeMessageHeadersEnd 885714 MimeEntityBegin 884987 MimeEntityHeadersEnd 885714 +MimeMessageHeadersEnd 885714 MultipartPreambleBegin 885714 MultipartPreambleEnd 885762 MultipartBoundaryBegin 885762 @@ -681,9 +681,9 @@ MimeMessageEnd 888960 MboxMarkerBegin 888962 MboxMarkerEnd 888993 MimeMessageBegin 888995 -MimeMessageHeadersEnd 889676 MimeEntityBegin 888995 MimeEntityHeadersEnd 889676 +MimeMessageHeadersEnd 889676 MultipartPreambleBegin 889676 MultipartPreambleEnd 889738 MultipartBoundaryBegin 889738 @@ -711,9 +711,9 @@ MimeMessageEnd 895778 MboxMarkerBegin 895780 MboxMarkerEnd 895811 MimeMessageBegin 895813 -MimeMessageHeadersEnd 896896 MimeEntityBegin 895813 MimeEntityHeadersEnd 896896 +MimeMessageHeadersEnd 896896 Octets 10376 Lines 141 MimeEntityEnd 907272 @@ -721,9 +721,9 @@ MimeMessageEnd 907272 MboxMarkerBegin 907274 MboxMarkerEnd 907305 MimeMessageBegin 907307 -MimeMessageHeadersEnd 908707 MimeEntityBegin 907307 MimeEntityHeadersEnd 908707 +MimeMessageHeadersEnd 908707 MultipartPreambleBegin 908707 MultipartPreambleEnd 908769 MultipartBoundaryBegin 908769 @@ -751,9 +751,9 @@ MimeMessageEnd 911574 MboxMarkerBegin 911576 MboxMarkerEnd 911607 MimeMessageBegin 911609 -MimeMessageHeadersEnd 912172 MimeEntityBegin 911609 MimeEntityHeadersEnd 912172 +MimeMessageHeadersEnd 912172 Octets 530 Lines 8 MimeEntityEnd 912702 @@ -761,9 +761,9 @@ MimeMessageEnd 912702 MboxMarkerBegin 912704 MboxMarkerEnd 912735 MimeMessageBegin 912737 -MimeMessageHeadersEnd 913972 MimeEntityBegin 912737 MimeEntityHeadersEnd 913972 +MimeMessageHeadersEnd 913972 Octets 2920 Lines 39 MimeEntityEnd 916892 @@ -771,9 +771,9 @@ MimeMessageEnd 916892 MboxMarkerBegin 916894 MboxMarkerEnd 916925 MimeMessageBegin 916927 -MimeMessageHeadersEnd 918106 MimeEntityBegin 916927 MimeEntityHeadersEnd 918106 +MimeMessageHeadersEnd 918106 Octets 2152 Lines 31 MimeEntityEnd 920258 @@ -781,9 +781,9 @@ MimeMessageEnd 920258 MboxMarkerBegin 920260 MboxMarkerEnd 920291 MimeMessageBegin 920293 -MimeMessageHeadersEnd 921392 MimeEntityBegin 920293 MimeEntityHeadersEnd 921392 +MimeMessageHeadersEnd 921392 MultipartPreambleBegin 921392 MultipartPreambleEnd 921394 MultipartBoundaryBegin 921394 @@ -811,9 +811,9 @@ MimeMessageEnd 924402 MboxMarkerBegin 924404 MboxMarkerEnd 924435 MimeMessageBegin 924437 -MimeMessageHeadersEnd 925493 MimeEntityBegin 924437 MimeEntityHeadersEnd 925493 +MimeMessageHeadersEnd 925493 MultipartPreambleBegin 925493 MultipartPreambleEnd 925495 MultipartBoundaryBegin 925495 @@ -848,9 +848,9 @@ MimeMessageEnd 928445 MboxMarkerBegin 928447 MboxMarkerEnd 928478 MimeMessageBegin 928480 -MimeMessageHeadersEnd 929576 MimeEntityBegin 928480 MimeEntityHeadersEnd 929576 +MimeMessageHeadersEnd 929576 MultipartPreambleBegin 929576 MultipartPreambleEnd 929578 MultipartBoundaryBegin 929578 @@ -878,9 +878,9 @@ MimeMessageEnd 934179 MboxMarkerBegin 934181 MboxMarkerEnd 934212 MimeMessageBegin 934214 -MimeMessageHeadersEnd 935337 MimeEntityBegin 934214 MimeEntityHeadersEnd 935337 +MimeMessageHeadersEnd 935337 MultipartPreambleBegin 935337 MultipartPreambleEnd 935339 MultipartBoundaryBegin 935339 @@ -908,9 +908,9 @@ MimeMessageEnd 939460 MboxMarkerBegin 939462 MboxMarkerEnd 939493 MimeMessageBegin 939495 -MimeMessageHeadersEnd 940640 MimeEntityBegin 939495 MimeEntityHeadersEnd 940640 +MimeMessageHeadersEnd 940640 MultipartPreambleBegin 940640 MultipartPreambleEnd 940757 MultipartBoundaryBegin 940757 @@ -946,9 +946,9 @@ MimeMessageEnd 941937 MboxMarkerBegin 941939 MboxMarkerEnd 941970 MimeMessageBegin 941972 -MimeMessageHeadersEnd 943868 MimeEntityBegin 941972 MimeEntityHeadersEnd 943868 +MimeMessageHeadersEnd 943868 MultipartPreambleBegin 943868 MultipartPreambleEnd 943868 MultipartBoundaryBegin 943868 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index fa70ff6eae..02d5d3fd80 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -1,9 +1,9 @@ MboxMarkerBegin 0 MboxMarkerEnd 7 MimeMessageBegin 9 -MimeMessageHeadersEnd 531 MimeEntityBegin 9 MimeEntityHeadersEnd 531 +MimeMessageHeadersEnd 531 MultipartPreambleBegin 531 MultipartPreambleEnd 531 MultipartBoundaryBegin 531 @@ -92,9 +92,9 @@ MimeMessageEnd 181624 MboxMarkerBegin 181626 MboxMarkerEnd 181633 MimeMessageBegin 181635 -MimeMessageHeadersEnd 182198 MimeEntityBegin 181635 MimeEntityHeadersEnd 182198 +MimeMessageHeadersEnd 182198 Octets 137124 Lines 1855 MimeEntityEnd 319322 @@ -102,9 +102,9 @@ MimeMessageEnd 319322 MboxMarkerBegin 319324 MboxMarkerEnd 319331 MimeMessageBegin 319333 -MimeMessageHeadersEnd 319720 MimeEntityBegin 319333 MimeEntityHeadersEnd 319720 +MimeMessageHeadersEnd 319720 Octets 204 Lines 4 MimeEntityEnd 319924 @@ -112,9 +112,9 @@ MimeMessageEnd 319924 MboxMarkerBegin 319926 MboxMarkerEnd 319933 MimeMessageBegin 319935 -MimeMessageHeadersEnd 320596 MimeEntityBegin 319935 MimeEntityHeadersEnd 320596 +MimeMessageHeadersEnd 320596 MultipartPreambleBegin 320596 MultipartPreambleEnd 320754 MultipartBoundaryBegin 320754 @@ -169,9 +169,9 @@ MimeMessageEnd 326365 MboxMarkerBegin 326367 MboxMarkerEnd 326374 MimeMessageBegin 326376 -MimeMessageHeadersEnd 327141 MimeEntityBegin 326376 MimeEntityHeadersEnd 327141 +MimeMessageHeadersEnd 327141 MultipartPreambleBegin 327141 MultipartPreambleEnd 327340 MultipartBoundaryBegin 327340 @@ -237,9 +237,9 @@ MimeMessageEnd 350773 MboxMarkerBegin 350775 MboxMarkerEnd 350782 MimeMessageBegin 350784 -MimeMessageHeadersEnd 351518 MimeEntityBegin 350784 MimeEntityHeadersEnd 351518 +MimeMessageHeadersEnd 351518 MultipartPreambleBegin 351518 MultipartPreambleEnd 351676 MultipartBoundaryBegin 351676 @@ -336,9 +336,9 @@ MimeMessageEnd 2139219 MboxMarkerBegin 2139221 MboxMarkerEnd 2139228 MimeMessageBegin 2139230 -MimeMessageHeadersEnd 2140267 MimeEntityBegin 2139230 MimeEntityHeadersEnd 2140267 +MimeMessageHeadersEnd 2140267 Octets 1164 Lines 40 MimeEntityEnd 2141431 @@ -346,9 +346,9 @@ MimeMessageEnd 2141431 MboxMarkerBegin 2141433 MboxMarkerEnd 2141440 MimeMessageBegin 2141442 -MimeMessageHeadersEnd 2141689 MimeEntityBegin 2141442 MimeEntityHeadersEnd 2141689 +MimeMessageHeadersEnd 2141689 MultipartPreambleBegin 2141689 MultipartPreambleEnd 2141689 MultipartBoundaryBegin 2141689 @@ -403,9 +403,9 @@ MimeMessageEnd 2307345 MboxMarkerBegin 2307347 MboxMarkerEnd 2307354 MimeMessageBegin 2307356 -MimeMessageHeadersEnd 2308328 MimeEntityBegin 2307356 MimeEntityHeadersEnd 2308328 +MimeMessageHeadersEnd 2308328 Octets 347516 Lines 4457 MimeEntityEnd 2655844 @@ -413,9 +413,9 @@ MimeMessageEnd 2655844 MboxMarkerBegin 2655846 MboxMarkerEnd 2655853 MimeMessageBegin 2655855 -MimeMessageHeadersEnd 2655994 MimeEntityBegin 2655855 MimeEntityHeadersEnd 2655994 +MimeMessageHeadersEnd 2655994 MultipartPreambleBegin 2655994 MultipartPreambleEnd 2655994 MultipartBoundaryBegin 2655994 @@ -456,9 +456,9 @@ MimeMessageEnd 2688506 MboxMarkerBegin 2688508 MboxMarkerEnd 2688515 MimeMessageBegin 2688517 -MimeMessageHeadersEnd 2689088 MimeEntityBegin 2688517 MimeEntityHeadersEnd 2689088 +MimeMessageHeadersEnd 2689088 Octets 57561 Lines 783 MimeEntityEnd 2746649 @@ -466,9 +466,9 @@ MimeMessageEnd 2746649 MboxMarkerBegin 2746651 MboxMarkerEnd 2746658 MimeMessageBegin 2746660 -MimeMessageHeadersEnd 2747410 MimeEntityBegin 2746660 MimeEntityHeadersEnd 2747410 +MimeMessageHeadersEnd 2747410 MultipartPreambleBegin 2747410 MultipartPreambleEnd 2747944 MultipartBoundaryBegin 2747944 @@ -523,9 +523,9 @@ MimeMessageEnd 2779395 MboxMarkerBegin 2779397 MboxMarkerEnd 2779404 MimeMessageBegin 2779406 -MimeMessageHeadersEnd 2780075 MimeEntityBegin 2779406 MimeEntityHeadersEnd 2780075 +MimeMessageHeadersEnd 2780075 MultipartPreambleBegin 2780075 MultipartPreambleEnd 2780422 MultipartBoundaryBegin 2780422 @@ -594,9 +594,9 @@ MimeMessageEnd 2785076 MboxMarkerBegin 2785078 MboxMarkerEnd 2785085 MimeMessageBegin 2785087 -MimeMessageHeadersEnd 2786084 MimeEntityBegin 2785087 MimeEntityHeadersEnd 2786084 +MimeMessageHeadersEnd 2786084 Octets 1414 Lines 33 MimeEntityEnd 2787498 @@ -604,9 +604,9 @@ MimeMessageEnd 2787498 MboxMarkerBegin 2787500 MboxMarkerEnd 2787507 MimeMessageBegin 2787509 -MimeMessageHeadersEnd 2787772 MimeEntityBegin 2787509 MimeEntityHeadersEnd 2787772 +MimeMessageHeadersEnd 2787772 Octets 261 Lines 6 MimeEntityEnd 2788033 @@ -614,9 +614,9 @@ MimeMessageEnd 2788033 MboxMarkerBegin 2788035 MboxMarkerEnd 2788042 MimeMessageBegin 2788044 -MimeMessageHeadersEnd 2788716 MimeEntityBegin 2788044 MimeEntityHeadersEnd 2788716 +MimeMessageHeadersEnd 2788716 Octets 737 Lines 14 MimeEntityEnd 2789453 @@ -624,9 +624,9 @@ MimeMessageEnd 2789453 MboxMarkerBegin 2789455 MboxMarkerEnd 2789462 MimeMessageBegin 2789464 -MimeMessageHeadersEnd 2790463 MimeEntityBegin 2789464 MimeEntityHeadersEnd 2790463 +MimeMessageHeadersEnd 2790463 MultipartPreambleBegin 2790463 MultipartPreambleEnd 2790467 MultipartBoundaryBegin 2790467 @@ -674,9 +674,9 @@ MimeMessageEnd 3227750 MboxMarkerBegin 3227752 MboxMarkerEnd 3227759 MimeMessageBegin 3227761 -MimeMessageHeadersEnd 3228760 MimeEntityBegin 3227761 MimeEntityHeadersEnd 3228760 +MimeMessageHeadersEnd 3228760 MultipartPreambleBegin 3228760 MultipartPreambleEnd 3228764 MultipartBoundaryBegin 3228764 @@ -724,9 +724,9 @@ MimeMessageEnd 3666046 MboxMarkerBegin 3666048 MboxMarkerEnd 3666055 MimeMessageBegin 3666057 -MimeMessageHeadersEnd 3666630 MimeEntityBegin 3666057 MimeEntityHeadersEnd 3666630 +MimeMessageHeadersEnd 3666630 MimeMessageBegin 3666630 MimeEntityBegin 3666630 MimeEntityHeadersEnd 3666692 @@ -742,9 +742,9 @@ MimeMessageEnd 3667232 MboxMarkerBegin 3667234 MboxMarkerEnd 3667241 MimeMessageBegin 3667243 -MimeMessageHeadersEnd 3667974 MimeEntityBegin 3667243 MimeEntityHeadersEnd 3667974 +MimeMessageHeadersEnd 3667974 MultipartPreambleBegin 3667974 MultipartPreambleEnd 3667976 MultipartBoundaryBegin 3667976 @@ -772,9 +772,9 @@ MimeMessageEnd 3669418 MboxMarkerBegin 3669420 MboxMarkerEnd 3669427 MimeMessageBegin 3669429 -MimeMessageHeadersEnd 3669982 MimeEntityBegin 3669429 MimeEntityHeadersEnd 3669982 +MimeMessageHeadersEnd 3669982 MultipartPreambleBegin 3669982 MultipartPreambleEnd 3670021 MultipartBoundaryBegin 3670021 @@ -810,9 +810,9 @@ MimeMessageEnd 3674811 MboxMarkerBegin 3674813 MboxMarkerEnd 3674820 MimeMessageBegin 3674822 -MimeMessageHeadersEnd 3675488 MimeEntityBegin 3674822 MimeEntityHeadersEnd 3675488 +MimeMessageHeadersEnd 3675488 MultipartPreambleBegin 3675488 MultipartPreambleEnd 3675488 MultipartBoundaryBegin 3675488 @@ -848,9 +848,9 @@ MimeMessageEnd 3676752 MboxMarkerBegin 3676754 MboxMarkerEnd 3676761 MimeMessageBegin 3676763 -MimeMessageHeadersEnd 3677286 MimeEntityBegin 3676763 MimeEntityHeadersEnd 3677286 +MimeMessageHeadersEnd 3677286 Octets 1464 Lines 46 MimeEntityEnd 3678750 @@ -858,9 +858,9 @@ MimeMessageEnd 3678750 MboxMarkerBegin 3678752 MboxMarkerEnd 3678802 MimeMessageBegin 3678804 -MimeMessageHeadersEnd 3679391 MimeEntityBegin 3678804 MimeEntityHeadersEnd 3679391 +MimeMessageHeadersEnd 3679391 Octets 60655 Lines 955 MimeEntityEnd 3740046 @@ -868,9 +868,9 @@ MimeMessageEnd 3740046 MboxMarkerBegin 3740048 MboxMarkerEnd 3740098 MimeMessageBegin 3740100 -MimeMessageHeadersEnd 3740684 MimeEntityBegin 3740100 MimeEntityHeadersEnd 3740684 +MimeMessageHeadersEnd 3740684 Octets 60767 Lines 961 MimeEntityEnd 3801451 @@ -878,9 +878,9 @@ MimeMessageEnd 3801451 MboxMarkerBegin 3801453 MboxMarkerEnd 3801460 MimeMessageBegin 3801462 -MimeMessageHeadersEnd 3802023 MimeEntityBegin 3801462 MimeEntityHeadersEnd 3802023 +MimeMessageHeadersEnd 3802023 MultipartPreambleBegin 3802023 MultipartPreambleEnd 3802025 MultipartBoundaryBegin 3802025 @@ -908,9 +908,9 @@ MimeMessageEnd 3802919 MboxMarkerBegin 3802921 MboxMarkerEnd 3802928 MimeMessageBegin 3802930 -MimeMessageHeadersEnd 3803695 MimeEntityBegin 3802930 MimeEntityHeadersEnd 3803695 +MimeMessageHeadersEnd 3803695 Octets 42100 Lines 571 MimeEntityEnd 3845795 @@ -918,9 +918,9 @@ MimeMessageEnd 3845795 MboxMarkerBegin 3845797 MboxMarkerEnd 3845804 MimeMessageBegin 3845806 -MimeMessageHeadersEnd 3846985 MimeEntityBegin 3845806 MimeEntityHeadersEnd 3846985 +MimeMessageHeadersEnd 3846985 MultipartPreambleBegin 3846985 MultipartPreambleEnd 3846985 MultipartBoundaryBegin 3846985 @@ -948,9 +948,9 @@ MimeMessageEnd 3855393 MboxMarkerBegin 3855395 MboxMarkerEnd 3855402 MimeMessageBegin 3855404 -MimeMessageHeadersEnd 3856880 MimeEntityBegin 3855404 MimeEntityHeadersEnd 3856880 +MimeMessageHeadersEnd 3856880 Octets 108383 Lines 1571 MimeEntityEnd 3965263 @@ -958,9 +958,9 @@ MimeMessageEnd 3965263 MboxMarkerBegin 3965265 MboxMarkerEnd 3965272 MimeMessageBegin 3965274 -MimeMessageHeadersEnd 3965889 MimeEntityBegin 3965274 MimeEntityHeadersEnd 3965889 +MimeMessageHeadersEnd 3965889 MimeMessageBegin 3965889 MimeEntityBegin 3965889 MimeEntityHeadersEnd 3966475 @@ -1040,9 +1040,9 @@ MimeMessageEnd 3969308 MboxMarkerBegin 3969310 MboxMarkerEnd 3969317 MimeMessageBegin 3969319 -MimeMessageHeadersEnd 3970038 MimeEntityBegin 3969319 MimeEntityHeadersEnd 3970038 +MimeMessageHeadersEnd 3970038 MultipartPreambleBegin 3970038 MultipartPreambleEnd 3970038 MultipartBoundaryBegin 3970038 @@ -1105,9 +1105,9 @@ MimeMessageEnd 4233718 MboxMarkerBegin 4233720 MboxMarkerEnd 4233727 MimeMessageBegin 4233729 -MimeMessageHeadersEnd 4234408 MimeEntityBegin 4233729 MimeEntityHeadersEnd 4234408 +MimeMessageHeadersEnd 4234408 Octets 1010 Lines 19 MimeEntityEnd 4235418 @@ -1115,9 +1115,9 @@ MimeMessageEnd 4235418 MboxMarkerBegin 4235420 MboxMarkerEnd 4235427 MimeMessageBegin 4235429 -MimeMessageHeadersEnd 4236508 MimeEntityBegin 4235429 MimeEntityHeadersEnd 4236508 +MimeMessageHeadersEnd 4236508 MultipartPreambleBegin 4236508 MultipartPreambleEnd 4236666 MultipartBoundaryBegin 4236666 @@ -1172,9 +1172,9 @@ MimeMessageEnd 4239644 MboxMarkerBegin 4239646 MboxMarkerEnd 4239653 MimeMessageBegin 4239655 -MimeMessageHeadersEnd 4240341 MimeEntityBegin 4239655 MimeEntityHeadersEnd 4240341 +MimeMessageHeadersEnd 4240341 MultipartPreambleBegin 4240341 MultipartPreambleEnd 4240341 MultipartBoundaryBegin 4240341 @@ -1202,9 +1202,9 @@ MimeMessageEnd 4245810 MboxMarkerBegin 4245812 MboxMarkerEnd 4245819 MimeMessageBegin 4245821 -MimeMessageHeadersEnd 4246287 MimeEntityBegin 4245821 MimeEntityHeadersEnd 4246287 +MimeMessageHeadersEnd 4246287 Octets 11599 Lines 186 MimeEntityEnd 4257886 @@ -1212,9 +1212,9 @@ MimeMessageEnd 4257886 MboxMarkerBegin 4257888 MboxMarkerEnd 4257895 MimeMessageBegin 4257897 -MimeMessageHeadersEnd 4258477 MimeEntityBegin 4257897 MimeEntityHeadersEnd 4258477 +MimeMessageHeadersEnd 4258477 MultipartPreambleBegin 4258477 MultipartPreambleEnd 4258477 MultipartBoundaryBegin 4258477 @@ -1323,9 +1323,9 @@ MimeMessageEnd 4259836 MboxMarkerBegin 4259838 MboxMarkerEnd 4259845 MimeMessageBegin 4259847 -MimeMessageHeadersEnd 4260427 MimeEntityBegin 4259847 MimeEntityHeadersEnd 4260427 +MimeMessageHeadersEnd 4260427 MultipartPreambleBegin 4260427 MultipartPreambleEnd 4260427 MultipartBoundaryBegin 4260427 @@ -1389,9 +1389,9 @@ MimeMessageEnd 4264394 MboxMarkerBegin 4264396 MboxMarkerEnd 4264403 MimeMessageBegin 4264405 -MimeMessageHeadersEnd 4264885 MimeEntityBegin 4264405 MimeEntityHeadersEnd 4264885 +MimeMessageHeadersEnd 4264885 MultipartPreambleBegin 4264885 MultipartPreambleEnd 4264933 MultipartBoundaryBegin 4264933 @@ -1501,9 +1501,9 @@ MimeMessageEnd 4270786 MboxMarkerBegin 4270788 MboxMarkerEnd 4270795 MimeMessageBegin 4270797 -MimeMessageHeadersEnd 4271280 MimeEntityBegin 4270797 MimeEntityHeadersEnd 4271280 +MimeMessageHeadersEnd 4271280 MultipartPreambleBegin 4271280 MultipartPreambleEnd 4271328 MultipartBoundaryBegin 4271328 @@ -1613,9 +1613,9 @@ MimeMessageEnd 4277216 MboxMarkerBegin 4277218 MboxMarkerEnd 4277225 MimeMessageBegin 4277227 -MimeMessageHeadersEnd 4277931 MimeEntityBegin 4277227 MimeEntityHeadersEnd 4277931 +MimeMessageHeadersEnd 4277931 MultipartPreambleBegin 4277931 MultipartPreambleEnd 4277974 MultipartBoundaryBegin 4277974 @@ -1808,9 +1808,9 @@ MimeMessageEnd 4298376 MboxMarkerBegin 4298378 MboxMarkerEnd 4298385 MimeMessageBegin 4298387 -MimeMessageHeadersEnd 4299063 MimeEntityBegin 4298387 MimeEntityHeadersEnd 4299063 +MimeMessageHeadersEnd 4299063 MultipartPreambleBegin 4299063 MultipartPreambleEnd 4299063 MultipartBoundaryBegin 4299063 @@ -1845,9 +1845,9 @@ MimeMessageEnd 4372265 MboxMarkerBegin 4372267 MboxMarkerEnd 4372274 MimeMessageBegin 4372276 -MimeMessageHeadersEnd 4373229 MimeEntityBegin 4372276 MimeEntityHeadersEnd 4373229 +MimeMessageHeadersEnd 4373229 Octets 252471 Lines 3431 MimeEntityEnd 4625700 @@ -1855,9 +1855,9 @@ MimeMessageEnd 4625700 MboxMarkerBegin 4625702 MboxMarkerEnd 4625709 MimeMessageBegin 4625711 -MimeMessageHeadersEnd 4626660 MimeEntityBegin 4625711 MimeEntityHeadersEnd 4626660 +MimeMessageHeadersEnd 4626660 MultipartPreambleBegin 4626660 MultipartPreambleEnd 4626859 MultipartBoundaryBegin 4626859 @@ -1920,9 +1920,9 @@ MimeMessageEnd 4682261 MboxMarkerBegin 4682263 MboxMarkerEnd 4682270 MimeMessageBegin 4682272 -MimeMessageHeadersEnd 4683107 MimeEntityBegin 4682272 MimeEntityHeadersEnd 4683107 +MimeMessageHeadersEnd 4683107 MultipartPreambleBegin 4683107 MultipartPreambleEnd 4683107 MultipartBoundaryBegin 4683107 @@ -1950,9 +1950,9 @@ MimeMessageEnd 4731150 MboxMarkerBegin 4731152 MboxMarkerEnd 4731159 MimeMessageBegin 4731161 -MimeMessageHeadersEnd 4731922 MimeEntityBegin 4731161 MimeEntityHeadersEnd 4731922 +MimeMessageHeadersEnd 4731922 MultipartPreambleBegin 4731922 MultipartPreambleEnd 4732363 MultipartBoundaryBegin 4732363 @@ -2045,9 +2045,9 @@ MimeMessageEnd 4767575 MboxMarkerBegin 4767577 MboxMarkerEnd 4767584 MimeMessageBegin 4767586 -MimeMessageHeadersEnd 4767753 MimeEntityBegin 4767586 MimeEntityHeadersEnd 4767753 +MimeMessageHeadersEnd 4767753 MultipartPreambleBegin 4767753 MultipartPreambleEnd 4767753 MultipartBoundaryBegin 4767753 @@ -2075,9 +2075,9 @@ MimeMessageEnd 4845389 MboxMarkerBegin 4845391 MboxMarkerEnd 4845398 MimeMessageBegin 4845400 -MimeMessageHeadersEnd 4846638 MimeEntityBegin 4845400 MimeEntityHeadersEnd 4846638 +MimeMessageHeadersEnd 4846638 MultipartPreambleBegin 4846638 MultipartPreambleEnd 4846638 MultipartBoundaryBegin 4846638 @@ -2105,9 +2105,9 @@ MimeMessageEnd 4977202 MboxMarkerBegin 4977204 MboxMarkerEnd 4977211 MimeMessageBegin 4977213 -MimeMessageHeadersEnd 4977982 MimeEntityBegin 4977213 MimeEntityHeadersEnd 4977982 +MimeMessageHeadersEnd 4977982 MultipartPreambleBegin 4977982 MultipartPreambleEnd 4978327 MultipartBoundaryBegin 4978327 @@ -2190,9 +2190,9 @@ MimeMessageEnd 5154286 MboxMarkerBegin 5154288 MboxMarkerEnd 5154295 MimeMessageBegin 5154297 -MimeMessageHeadersEnd 5154999 MimeEntityBegin 5154297 MimeEntityHeadersEnd 5154999 +MimeMessageHeadersEnd 5154999 MultipartPreambleBegin 5154999 MultipartPreambleEnd 5155157 MultipartBoundaryBegin 5155157 @@ -2331,9 +2331,9 @@ MimeMessageEnd 5373282 MboxMarkerBegin 5373284 MboxMarkerEnd 5373291 MimeMessageBegin 5373293 -MimeMessageHeadersEnd 5373698 MimeEntityBegin 5373293 MimeEntityHeadersEnd 5373698 +MimeMessageHeadersEnd 5373698 MultipartPreambleBegin 5373698 MultipartPreambleEnd 5373897 MultipartBoundaryBegin 5373897 @@ -2368,9 +2368,9 @@ MimeMessageEnd 5464350 MboxMarkerBegin 5464352 MboxMarkerEnd 5464359 MimeMessageBegin 5464361 -MimeMessageHeadersEnd 5465317 MimeEntityBegin 5464361 MimeEntityHeadersEnd 5465317 +MimeMessageHeadersEnd 5465317 Octets 51405 Lines 697 MimeEntityEnd 5516722 @@ -2378,9 +2378,9 @@ MimeMessageEnd 5516722 MboxMarkerBegin 5516724 MboxMarkerEnd 5516731 MimeMessageBegin 5516733 -MimeMessageHeadersEnd 5517362 MimeEntityBegin 5516733 MimeEntityHeadersEnd 5517362 +MimeMessageHeadersEnd 5517362 MultipartPreambleBegin 5517362 MultipartPreambleEnd 5517362 MultipartBoundaryBegin 5517362 @@ -3569,9 +3569,9 @@ MimeMessageEnd 5588100 MboxMarkerBegin 5588102 MboxMarkerEnd 5588109 MimeMessageBegin 5588111 -MimeMessageHeadersEnd 5588934 MimeEntityBegin 5588111 MimeEntityHeadersEnd 5588934 +MimeMessageHeadersEnd 5588934 Octets 1919 Lines 49 MimeEntityEnd 5590853 @@ -3579,9 +3579,9 @@ MimeMessageEnd 5590853 MboxMarkerBegin 5590855 MboxMarkerEnd 5590862 MimeMessageBegin 5590864 -MimeMessageHeadersEnd 5591607 MimeEntityBegin 5590864 MimeEntityHeadersEnd 5591607 +MimeMessageHeadersEnd 5591607 MultipartPreambleBegin 5591607 MultipartPreambleEnd 5591607 MultipartBoundaryBegin 5591607 @@ -3644,9 +3644,9 @@ MimeMessageEnd 5748407 MboxMarkerBegin 5748409 MboxMarkerEnd 5748416 MimeMessageBegin 5748418 -MimeMessageHeadersEnd 5748956 MimeEntityBegin 5748418 MimeEntityHeadersEnd 5748956 +MimeMessageHeadersEnd 5748956 Octets 589 Lines 22 MimeEntityEnd 5749545 @@ -3654,9 +3654,9 @@ MimeMessageEnd 5749545 MboxMarkerBegin 5749547 MboxMarkerEnd 5749554 MimeMessageBegin 5749556 -MimeMessageHeadersEnd 5750765 MimeEntityBegin 5749556 MimeEntityHeadersEnd 5750765 +MimeMessageHeadersEnd 5750765 MultipartPreambleBegin 5750765 MultipartPreambleEnd 5750923 MultipartBoundaryBegin 5750923 @@ -3711,9 +3711,9 @@ MimeMessageEnd 5811866 MboxMarkerBegin 5811868 MboxMarkerEnd 5811875 MimeMessageBegin 5811877 -MimeMessageHeadersEnd 5812634 MimeEntityBegin 5811877 MimeEntityHeadersEnd 5812634 +MimeMessageHeadersEnd 5812634 MultipartPreambleBegin 5812634 MultipartPreambleEnd 5812636 MultipartBoundaryBegin 5812636 @@ -3741,9 +3741,9 @@ MimeMessageEnd 5869132 MboxMarkerBegin 5869134 MboxMarkerEnd 5869165 MimeMessageBegin 5869167 -MimeMessageHeadersEnd 5870664 MimeEntityBegin 5869167 MimeEntityHeadersEnd 5870664 +MimeMessageHeadersEnd 5870664 Octets 1374 Lines 35 MimeEntityEnd 5872038 @@ -3751,9 +3751,9 @@ MimeMessageEnd 5872038 MboxMarkerBegin 5872040 MboxMarkerEnd 5872047 MimeMessageBegin 5872049 -MimeMessageHeadersEnd 5872857 MimeEntityBegin 5872049 MimeEntityHeadersEnd 5872857 +MimeMessageHeadersEnd 5872857 MultipartPreambleBegin 5872857 MultipartPreambleEnd 5872905 MultipartBoundaryBegin 5872905 @@ -3789,9 +3789,9 @@ MimeMessageEnd 5899485 MboxMarkerBegin 5899487 MboxMarkerEnd 5899494 MimeMessageBegin 5899496 -MimeMessageHeadersEnd 5900178 MimeEntityBegin 5899496 MimeEntityHeadersEnd 5900178 +MimeMessageHeadersEnd 5900178 MultipartPreambleBegin 5900178 MultipartPreambleEnd 5900226 MultipartBoundaryBegin 5900226 @@ -3819,9 +3819,9 @@ MimeMessageEnd 5923009 MboxMarkerBegin 5923011 MboxMarkerEnd 5923042 MimeMessageBegin 5923044 -MimeMessageHeadersEnd 5923581 MimeEntityBegin 5923044 MimeEntityHeadersEnd 5923581 +MimeMessageHeadersEnd 5923581 MultipartPreambleBegin 5923581 MultipartPreambleEnd 5923581 MultipartBoundaryBegin 5923581 @@ -3856,9 +3856,9 @@ MimeMessageEnd 5925456 MboxMarkerBegin 5925458 MboxMarkerEnd 5925465 MimeMessageBegin 5925467 -MimeMessageHeadersEnd 5926279 MimeEntityBegin 5925467 MimeEntityHeadersEnd 5926279 +MimeMessageHeadersEnd 5926279 Octets 260296 Lines 3519 MimeEntityEnd 6186575 @@ -3866,9 +3866,9 @@ MimeMessageEnd 6186575 MboxMarkerBegin 6186577 MboxMarkerEnd 6186584 MimeMessageBegin 6186586 -MimeMessageHeadersEnd 6187457 MimeEntityBegin 6186586 MimeEntityHeadersEnd 6187457 +MimeMessageHeadersEnd 6187457 MultipartPreambleBegin 6187457 MultipartPreambleEnd 6187459 MultipartBoundaryBegin 6187459 @@ -3896,9 +3896,9 @@ MimeMessageEnd 6287418 MboxMarkerBegin 6287420 MboxMarkerEnd 6287427 MimeMessageBegin 6287429 -MimeMessageHeadersEnd 6288325 MimeEntityBegin 6287429 MimeEntityHeadersEnd 6288325 +MimeMessageHeadersEnd 6288325 MultipartPreambleBegin 6288325 MultipartPreambleEnd 6288325 MultipartBoundaryBegin 6288325 @@ -4108,9 +4108,9 @@ MimeMessageEnd 6373131 MboxMarkerBegin 6373133 MboxMarkerEnd 6373140 MimeMessageBegin 6373142 -MimeMessageHeadersEnd 6373961 MimeEntityBegin 6373142 MimeEntityHeadersEnd 6373961 +MimeMessageHeadersEnd 6373961 Octets 9425 Lines 227 MimeEntityEnd 6383386 @@ -4118,9 +4118,9 @@ MimeMessageEnd 6383386 MboxMarkerBegin 6383388 MboxMarkerEnd 6383395 MimeMessageBegin 6383397 -MimeMessageHeadersEnd 6384141 MimeEntityBegin 6383397 MimeEntityHeadersEnd 6384141 +MimeMessageHeadersEnd 6384141 MultipartPreambleBegin 6384141 MultipartPreambleEnd 6384299 MultipartBoundaryBegin 6384299 @@ -4203,9 +4203,9 @@ MimeMessageEnd 6477811 MboxMarkerBegin 6477813 MboxMarkerEnd 6477820 MimeMessageBegin 6477822 -MimeMessageHeadersEnd 6478593 MimeEntityBegin 6477822 MimeEntityHeadersEnd 6478593 +MimeMessageHeadersEnd 6478593 MultipartPreambleBegin 6478593 MultipartPreambleEnd 6478792 MultipartBoundaryBegin 6478792 @@ -4240,9 +4240,9 @@ MimeMessageEnd 6513758 MboxMarkerBegin 6513760 MboxMarkerEnd 6513801 MimeMessageBegin 6513803 -MimeMessageHeadersEnd 6513957 MimeEntityBegin 6513803 MimeEntityHeadersEnd 6513957 +MimeMessageHeadersEnd 6513957 Octets 43722 Lines 694 MimeEntityEnd 6557679 @@ -4250,9 +4250,9 @@ MimeMessageEnd 6557679 MboxMarkerBegin 6557681 MboxMarkerEnd 6557712 MimeMessageBegin 6557714 -MimeMessageHeadersEnd 6558312 MimeEntityBegin 6557714 MimeEntityHeadersEnd 6558312 +MimeMessageHeadersEnd 6558312 MultipartPreambleBegin 6558312 MultipartPreambleEnd 6558360 MultipartBoundaryBegin 6558360 @@ -4300,9 +4300,9 @@ MimeMessageEnd 6583936 MboxMarkerBegin 6583938 MboxMarkerEnd 6583969 MimeMessageBegin 6583971 -MimeMessageHeadersEnd 6584388 MimeEntityBegin 6583971 MimeEntityHeadersEnd 6584388 +MimeMessageHeadersEnd 6584388 MultipartPreambleBegin 6584388 MultipartPreambleEnd 6584436 MultipartBoundaryBegin 6584436 @@ -4446,9 +4446,9 @@ MimeMessageEnd 6587266 MboxMarkerBegin 6587268 MboxMarkerEnd 6587299 MimeMessageBegin 6587301 -MimeMessageHeadersEnd 6587716 MimeEntityBegin 6587301 MimeEntityHeadersEnd 6587716 +MimeMessageHeadersEnd 6587716 MultipartPreambleBegin 6587716 MultipartPreambleEnd 6587764 MultipartBoundaryBegin 6587764 @@ -4503,9 +4503,9 @@ MimeMessageEnd 6955939 MboxMarkerBegin 6955941 MboxMarkerEnd 6955948 MimeMessageBegin 6955950 -MimeMessageHeadersEnd 6956567 MimeEntityBegin 6955950 MimeEntityHeadersEnd 6956567 +MimeMessageHeadersEnd 6956567 MultipartPreambleBegin 6956567 MultipartPreambleEnd 6956787 MultipartBoundaryBegin 6956787 @@ -4541,9 +4541,9 @@ MimeMessageEnd 6958045 MboxMarkerBegin 6958047 MboxMarkerEnd 6958054 MimeMessageBegin 6958056 -MimeMessageHeadersEnd 6958361 MimeEntityBegin 6958056 MimeEntityHeadersEnd 6958361 +MimeMessageHeadersEnd 6958361 MultipartPreambleBegin 6958361 MultipartPreambleEnd 6958361 MultipartBoundaryBegin 6958361 @@ -4571,9 +4571,9 @@ MimeMessageEnd 6970685 MboxMarkerBegin 6970687 MboxMarkerEnd 6970694 MimeMessageBegin 6970696 -MimeMessageHeadersEnd 6971001 MimeEntityBegin 6970696 MimeEntityHeadersEnd 6971001 +MimeMessageHeadersEnd 6971001 MultipartPreambleBegin 6971001 MultipartPreambleEnd 6971001 MultipartBoundaryBegin 6971001 @@ -4601,9 +4601,9 @@ MimeMessageEnd 6983293 MboxMarkerBegin 6983295 MboxMarkerEnd 6983326 MimeMessageBegin 6983328 -MimeMessageHeadersEnd 6984857 MimeEntityBegin 6983328 MimeEntityHeadersEnd 6984857 +MimeMessageHeadersEnd 6984857 MultipartPreambleBegin 6984857 MultipartPreambleEnd 6984859 MultipartBoundaryBegin 6984859 @@ -4631,9 +4631,9 @@ MimeMessageEnd 6991551 MboxMarkerBegin 6991553 MboxMarkerEnd 6991584 MimeMessageBegin 6991586 -MimeMessageHeadersEnd 6992045 MimeEntityBegin 6991586 MimeEntityHeadersEnd 6992045 +MimeMessageHeadersEnd 6992045 MultipartPreambleBegin 6992045 MultipartPreambleEnd 6992045 MultipartBoundaryBegin 6992045 @@ -4723,9 +4723,9 @@ MimeMessageEnd 7209679 MboxMarkerBegin 7209681 MboxMarkerEnd 7209688 MimeMessageBegin 7209690 -MimeMessageHeadersEnd 7209994 MimeEntityBegin 7209690 MimeEntityHeadersEnd 7209994 +MimeMessageHeadersEnd 7209994 MultipartPreambleBegin 7209994 MultipartPreambleEnd 7209994 MultipartBoundaryBegin 7209994 @@ -4753,9 +4753,9 @@ MimeMessageEnd 7221844 MboxMarkerBegin 7221846 MboxMarkerEnd 7221853 MimeMessageBegin 7221855 -MimeMessageHeadersEnd 7222159 MimeEntityBegin 7221855 MimeEntityHeadersEnd 7222159 +MimeMessageHeadersEnd 7222159 MultipartPreambleBegin 7222159 MultipartPreambleEnd 7222159 MultipartBoundaryBegin 7222159 @@ -4783,9 +4783,9 @@ MimeMessageEnd 7234277 MboxMarkerBegin 7234279 MboxMarkerEnd 7234286 MimeMessageBegin 7234288 -MimeMessageHeadersEnd 7234592 MimeEntityBegin 7234288 MimeEntityHeadersEnd 7234592 +MimeMessageHeadersEnd 7234592 MultipartPreambleBegin 7234592 MultipartPreambleEnd 7234592 MultipartBoundaryBegin 7234592 @@ -4813,9 +4813,9 @@ MimeMessageEnd 7246617 MboxMarkerBegin 7246619 MboxMarkerEnd 7246626 MimeMessageBegin 7246628 -MimeMessageHeadersEnd 7246932 MimeEntityBegin 7246628 MimeEntityHeadersEnd 7246932 +MimeMessageHeadersEnd 7246932 MultipartPreambleBegin 7246932 MultipartPreambleEnd 7246932 MultipartBoundaryBegin 7246932 @@ -4843,9 +4843,9 @@ MimeMessageEnd 7259151 MboxMarkerBegin 7259153 MboxMarkerEnd 7259160 MimeMessageBegin 7259162 -MimeMessageHeadersEnd 7259466 MimeEntityBegin 7259162 MimeEntityHeadersEnd 7259466 +MimeMessageHeadersEnd 7259466 MultipartPreambleBegin 7259466 MultipartPreambleEnd 7259466 MultipartBoundaryBegin 7259466 @@ -4873,9 +4873,9 @@ MimeMessageEnd 7271535 MboxMarkerBegin 7271537 MboxMarkerEnd 7271544 MimeMessageBegin 7271546 -MimeMessageHeadersEnd 7271850 MimeEntityBegin 7271546 MimeEntityHeadersEnd 7271850 +MimeMessageHeadersEnd 7271850 MultipartPreambleBegin 7271850 MultipartPreambleEnd 7271850 MultipartBoundaryBegin 7271850 @@ -4903,9 +4903,9 @@ MimeMessageEnd 7284139 MboxMarkerBegin 7284141 MboxMarkerEnd 7284172 MimeMessageBegin 7284174 -MimeMessageHeadersEnd 7285430 MimeEntityBegin 7284174 MimeEntityHeadersEnd 7285430 +MimeMessageHeadersEnd 7285430 MultipartPreambleBegin 7285430 MultipartPreambleEnd 7285478 MultipartBoundaryBegin 7285478 @@ -4981,9 +4981,9 @@ MimeMessageEnd 8043000 MboxMarkerBegin 8043002 MboxMarkerEnd 8043033 MimeMessageBegin 8043035 -MimeMessageHeadersEnd 8044321 MimeEntityBegin 8043035 MimeEntityHeadersEnd 8044321 +MimeMessageHeadersEnd 8044321 MultipartPreambleBegin 8044321 MultipartPreambleEnd 8044323 MultipartBoundaryBegin 8044323 @@ -5032,9 +5032,9 @@ MimeMessageEnd 8091598 MboxMarkerBegin 8091600 MboxMarkerEnd 8091607 MimeMessageBegin 8091609 -MimeMessageHeadersEnd 8092367 MimeEntityBegin 8091609 MimeEntityHeadersEnd 8092367 +MimeMessageHeadersEnd 8092367 Octets 552090 Lines 7475 MimeEntityEnd 8644457 @@ -5042,9 +5042,9 @@ MimeMessageEnd 8644457 MboxMarkerBegin 8644459 MboxMarkerEnd 8644466 MimeMessageBegin 8644468 -MimeMessageHeadersEnd 8645400 MimeEntityBegin 8644468 MimeEntityHeadersEnd 8645400 +MimeMessageHeadersEnd 8645400 MultipartPreambleBegin 8645400 MultipartPreambleEnd 8645402 MultipartBoundaryBegin 8645402 @@ -5065,9 +5065,9 @@ MimeMessageEnd 8648081 MboxMarkerBegin 8648083 MboxMarkerEnd 8648114 MimeMessageBegin 8648116 -MimeMessageHeadersEnd 8648726 MimeEntityBegin 8648116 MimeEntityHeadersEnd 8648726 +MimeMessageHeadersEnd 8648726 MultipartPreambleBegin 8648726 MultipartPreambleEnd 8649013 MultipartBoundaryBegin 8649013 @@ -5095,9 +5095,9 @@ MimeMessageEnd 8650562 MboxMarkerBegin 8650564 MboxMarkerEnd 8650571 MimeMessageBegin 8650573 -MimeMessageHeadersEnd 8651756 MimeEntityBegin 8650573 MimeEntityHeadersEnd 8651756 +MimeMessageHeadersEnd 8651756 Octets 1422 Lines 40 MimeEntityEnd 8653178 @@ -5105,9 +5105,9 @@ MimeMessageEnd 8653178 MboxMarkerBegin 8653180 MboxMarkerEnd 8653187 MimeMessageBegin 8653189 -MimeMessageHeadersEnd 8653839 MimeEntityBegin 8653189 MimeEntityHeadersEnd 8653839 +MimeMessageHeadersEnd 8653839 Octets 1001 Lines 28 MimeEntityEnd 8654840 @@ -5115,9 +5115,9 @@ MimeMessageEnd 8654840 MboxMarkerBegin 8654842 MboxMarkerEnd 8654849 MimeMessageBegin 8654851 -MimeMessageHeadersEnd 8655631 MimeEntityBegin 8654851 MimeEntityHeadersEnd 8655631 +MimeMessageHeadersEnd 8655631 MultipartPreambleBegin 8655631 MultipartPreambleEnd 8655789 MultipartBoundaryBegin 8655789 @@ -5202,9 +5202,9 @@ MimeMessageEnd 8658633 MboxMarkerBegin 8658635 MboxMarkerEnd 8658642 MimeMessageBegin 8658644 -MimeMessageHeadersEnd 8659476 MimeEntityBegin 8658644 MimeEntityHeadersEnd 8659476 +MimeMessageHeadersEnd 8659476 Octets 1428 Lines 43 MimeEntityEnd 8660904 @@ -5212,9 +5212,9 @@ MimeMessageEnd 8660904 MboxMarkerBegin 8660906 MboxMarkerEnd 8660913 MimeMessageBegin 8660915 -MimeMessageHeadersEnd 8661072 MimeEntityBegin 8660915 MimeEntityHeadersEnd 8661072 +MimeMessageHeadersEnd 8661072 Octets 4734 Lines 64 MimeEntityEnd 8665806 @@ -5222,9 +5222,9 @@ MimeMessageEnd 8665806 MboxMarkerBegin 8665808 MboxMarkerEnd 8665815 MimeMessageBegin 8665817 -MimeMessageHeadersEnd 8667595 MimeEntityBegin 8665817 MimeEntityHeadersEnd 8667595 +MimeMessageHeadersEnd 8667595 MultipartPreambleBegin 8667595 MultipartPreambleEnd 8667753 MultipartBoundaryBegin 8667753 @@ -5377,9 +5377,9 @@ MimeMessageEnd 8679245 MboxMarkerBegin 8679247 MboxMarkerEnd 8679254 MimeMessageBegin 8679256 -MimeMessageHeadersEnd 8680000 MimeEntityBegin 8679256 MimeEntityHeadersEnd 8680000 +MimeMessageHeadersEnd 8680000 MultipartPreambleBegin 8680000 MultipartPreambleEnd 8680158 MultipartBoundaryBegin 8680158 @@ -5434,9 +5434,9 @@ MimeMessageEnd 8690837 MboxMarkerBegin 8690839 MboxMarkerEnd 8690846 MimeMessageBegin 8690848 -MimeMessageHeadersEnd 8691509 MimeEntityBegin 8690848 MimeEntityHeadersEnd 8691509 +MimeMessageHeadersEnd 8691509 MultipartPreambleBegin 8691509 MultipartPreambleEnd 8691511 MultipartBoundaryBegin 8691511 @@ -5464,9 +5464,9 @@ MimeMessageEnd 8771510 MboxMarkerBegin 8771512 MboxMarkerEnd 8771519 MimeMessageBegin 8771521 -MimeMessageHeadersEnd 8772294 MimeEntityBegin 8771521 MimeEntityHeadersEnd 8772294 +MimeMessageHeadersEnd 8772294 MultipartPreambleBegin 8772294 MultipartPreambleEnd 8772452 MultipartBoundaryBegin 8772452 @@ -5535,9 +5535,9 @@ MimeMessageEnd 8960196 MboxMarkerBegin 8960198 MboxMarkerEnd 8960205 MimeMessageBegin 8960207 -MimeMessageHeadersEnd 8961063 MimeEntityBegin 8960207 MimeEntityHeadersEnd 8961063 +MimeMessageHeadersEnd 8961063 Octets 1758 Lines 26 MimeEntityEnd 8962821 @@ -5545,9 +5545,9 @@ MimeMessageEnd 8962821 MboxMarkerBegin 8962823 MboxMarkerEnd 8962830 MimeMessageBegin 8962832 -MimeMessageHeadersEnd 8963476 MimeEntityBegin 8962832 MimeEntityHeadersEnd 8963476 +MimeMessageHeadersEnd 8963476 MimeMessageBegin 8963476 MimeEntityBegin 8963476 MimeEntityHeadersEnd 8963972 @@ -5563,9 +5563,9 @@ MimeMessageEnd 8964871 MboxMarkerBegin 8964873 MboxMarkerEnd 8964880 MimeMessageBegin 8964882 -MimeMessageHeadersEnd 8965340 MimeEntityBegin 8964882 MimeEntityHeadersEnd 8965340 +MimeMessageHeadersEnd 8965340 MultipartPreambleBegin 8965340 MultipartPreambleEnd 8965340 MultipartBoundaryBegin 8965340 @@ -5593,9 +5593,9 @@ MimeMessageEnd 9057985 MboxMarkerBegin 9057987 MboxMarkerEnd 9057994 MimeMessageBegin 9057996 -MimeMessageHeadersEnd 9058498 MimeEntityBegin 9057996 MimeEntityHeadersEnd 9058498 +MimeMessageHeadersEnd 9058498 Octets 1169 Lines 28 MimeEntityEnd 9059667 @@ -5603,9 +5603,9 @@ MimeMessageEnd 9059667 MboxMarkerBegin 9059669 MboxMarkerEnd 9059676 MimeMessageBegin 9059678 -MimeMessageHeadersEnd 9060843 MimeEntityBegin 9059678 MimeEntityHeadersEnd 9060843 +MimeMessageHeadersEnd 9060843 MultipartPreambleBegin 9060843 MultipartPreambleEnd 9060843 MultipartBoundaryBegin 9060843 @@ -5661,9 +5661,9 @@ MimeMessageEnd 9156930 MboxMarkerBegin 9156932 MboxMarkerEnd 9156963 MimeMessageBegin 9156965 -MimeMessageHeadersEnd 9158136 MimeEntityBegin 9156965 MimeEntityHeadersEnd 9158136 +MimeMessageHeadersEnd 9158136 MultipartPreambleBegin 9158136 MultipartPreambleEnd 9158136 MultipartBoundaryBegin 9158136 @@ -5691,9 +5691,9 @@ MimeMessageEnd 9159961 MboxMarkerBegin 9159963 MboxMarkerEnd 9159994 MimeMessageBegin 9159996 -MimeMessageHeadersEnd 9161157 MimeEntityBegin 9159996 MimeEntityHeadersEnd 9161157 +MimeMessageHeadersEnd 9161157 MultipartPreambleBegin 9161157 MultipartPreambleEnd 9161333 MultipartBoundaryBegin 9161333 @@ -5721,9 +5721,9 @@ MimeMessageEnd 9164625 MboxMarkerBegin 9164627 MboxMarkerEnd 9164658 MimeMessageBegin 9164660 -MimeMessageHeadersEnd 9165820 MimeEntityBegin 9164660 MimeEntityHeadersEnd 9165820 +MimeMessageHeadersEnd 9165820 MultipartPreambleBegin 9165820 MultipartPreambleEnd 9165996 MultipartBoundaryBegin 9165996 @@ -5751,9 +5751,9 @@ MimeMessageEnd 9171770 MboxMarkerBegin 9171772 MboxMarkerEnd 9171779 MimeMessageBegin 9171781 -MimeMessageHeadersEnd 9171996 MimeEntityBegin 9171781 MimeEntityHeadersEnd 9171996 +MimeMessageHeadersEnd 9171996 Octets 4250 Lines 58 MimeEntityEnd 9176246 @@ -5761,9 +5761,9 @@ MimeMessageEnd 9176246 MboxMarkerBegin 9176248 MboxMarkerEnd 9176279 MimeMessageBegin 9176281 -MimeMessageHeadersEnd 9177199 MimeEntityBegin 9176281 MimeEntityHeadersEnd 9177199 +MimeMessageHeadersEnd 9177199 MultipartPreambleBegin 9177199 MultipartPreambleEnd 9177247 MultipartBoundaryBegin 9177247 @@ -5791,9 +5791,9 @@ MimeMessageEnd 9193172 MboxMarkerBegin 9193174 MboxMarkerEnd 9193205 MimeMessageBegin 9193207 -MimeMessageHeadersEnd 9194031 MimeEntityBegin 9193207 MimeEntityHeadersEnd 9194031 +MimeMessageHeadersEnd 9194031 Octets 17018 Lines 258 MimeEntityEnd 9211049 @@ -5801,9 +5801,9 @@ MimeMessageEnd 9211049 MboxMarkerBegin 9211051 MboxMarkerEnd 9211082 MimeMessageBegin 9211084 -MimeMessageHeadersEnd 9211913 MimeEntityBegin 9211084 MimeEntityHeadersEnd 9211913 +MimeMessageHeadersEnd 9211913 Octets 25348 Lines 385 MimeEntityEnd 9237261 @@ -5811,9 +5811,9 @@ MimeMessageEnd 9237261 MboxMarkerBegin 9237263 MboxMarkerEnd 9237294 MimeMessageBegin 9237296 -MimeMessageHeadersEnd 9238125 MimeEntityBegin 9237296 MimeEntityHeadersEnd 9238125 +MimeMessageHeadersEnd 9238125 Octets 36686 Lines 556 MimeEntityEnd 9274811 @@ -5821,9 +5821,9 @@ MimeMessageEnd 9274811 MboxMarkerBegin 9274813 MboxMarkerEnd 9274844 MimeMessageBegin 9274846 -MimeMessageHeadersEnd 9275678 MimeEntityBegin 9274846 MimeEntityHeadersEnd 9275678 +MimeMessageHeadersEnd 9275678 Octets 52090 Lines 790 MimeEntityEnd 9327768 @@ -5831,9 +5831,9 @@ MimeMessageEnd 9327768 MboxMarkerBegin 9327770 MboxMarkerEnd 9327801 MimeMessageBegin 9327803 -MimeMessageHeadersEnd 9329218 MimeEntityBegin 9327803 MimeEntityHeadersEnd 9329218 +MimeMessageHeadersEnd 9329218 Octets 1450 Lines 20 MimeEntityEnd 9330668 @@ -5841,9 +5841,9 @@ MimeMessageEnd 9330668 MboxMarkerBegin 9330670 MboxMarkerEnd 9330701 MimeMessageBegin 9330703 -MimeMessageHeadersEnd 9332080 MimeEntityBegin 9330703 MimeEntityHeadersEnd 9332080 +MimeMessageHeadersEnd 9332080 MultipartPreambleBegin 9332080 MultipartPreambleEnd 9332082 MultipartBoundaryBegin 9332082 @@ -5871,9 +5871,9 @@ MimeMessageEnd 9336541 MboxMarkerBegin 9336543 MboxMarkerEnd 9336574 MimeMessageBegin 9336576 -MimeMessageHeadersEnd 9337807 MimeEntityBegin 9336576 MimeEntityHeadersEnd 9337807 +MimeMessageHeadersEnd 9337807 Octets 3550 Lines 56 MimeEntityEnd 9341357 @@ -5881,9 +5881,9 @@ MimeMessageEnd 9341357 MboxMarkerBegin 9341359 MboxMarkerEnd 9341390 MimeMessageBegin 9341392 -MimeMessageHeadersEnd 9342490 MimeEntityBegin 9341392 MimeEntityHeadersEnd 9342490 +MimeMessageHeadersEnd 9342490 Octets 670 Lines 10 MimeEntityEnd 9343160 @@ -5891,9 +5891,9 @@ MimeMessageEnd 9343160 MboxMarkerBegin 9343162 MboxMarkerEnd 9343169 MimeMessageBegin 9343171 -MimeMessageHeadersEnd 9343574 MimeEntityBegin 9343171 MimeEntityHeadersEnd 9343574 +MimeMessageHeadersEnd 9343574 Octets 7724 Lines 105 MimeEntityEnd 9351298 @@ -5901,9 +5901,9 @@ MimeMessageEnd 9351298 MboxMarkerBegin 9351300 MboxMarkerEnd 9351331 MimeMessageBegin 9351333 -MimeMessageHeadersEnd 9352135 MimeEntityBegin 9351333 MimeEntityHeadersEnd 9352135 +MimeMessageHeadersEnd 9352135 MimeMessageBegin 9352135 MimeEntityBegin 9352135 MimeEntityHeadersEnd 9353538 @@ -5919,9 +5919,9 @@ MimeMessageEnd 9354990 MboxMarkerBegin 9354992 MboxMarkerEnd 9355023 MimeMessageBegin 9355025 -MimeMessageHeadersEnd 9355752 MimeEntityBegin 9355025 MimeEntityHeadersEnd 9355752 +MimeMessageHeadersEnd 9355752 MultipartPreambleBegin 9355752 MultipartPreambleEnd 9355800 MultipartBoundaryBegin 9355800 @@ -5957,9 +5957,9 @@ MimeMessageEnd 9358998 MboxMarkerBegin 9359000 MboxMarkerEnd 9359031 MimeMessageBegin 9359033 -MimeMessageHeadersEnd 9359714 MimeEntityBegin 9359033 MimeEntityHeadersEnd 9359714 +MimeMessageHeadersEnd 9359714 MultipartPreambleBegin 9359714 MultipartPreambleEnd 9359776 MultipartBoundaryBegin 9359776 @@ -5987,9 +5987,9 @@ MimeMessageEnd 9365816 MboxMarkerBegin 9365818 MboxMarkerEnd 9365849 MimeMessageBegin 9365851 -MimeMessageHeadersEnd 9366934 MimeEntityBegin 9365851 MimeEntityHeadersEnd 9366934 +MimeMessageHeadersEnd 9366934 Octets 10376 Lines 141 MimeEntityEnd 9377310 @@ -5997,9 +5997,9 @@ MimeMessageEnd 9377310 MboxMarkerBegin 9377312 MboxMarkerEnd 9377343 MimeMessageBegin 9377345 -MimeMessageHeadersEnd 9378745 MimeEntityBegin 9377345 MimeEntityHeadersEnd 9378745 +MimeMessageHeadersEnd 9378745 MultipartPreambleBegin 9378745 MultipartPreambleEnd 9378807 MultipartBoundaryBegin 9378807 @@ -6027,9 +6027,9 @@ MimeMessageEnd 9381612 MboxMarkerBegin 9381614 MboxMarkerEnd 9381645 MimeMessageBegin 9381647 -MimeMessageHeadersEnd 9382210 MimeEntityBegin 9381647 MimeEntityHeadersEnd 9382210 +MimeMessageHeadersEnd 9382210 Octets 530 Lines 8 MimeEntityEnd 9382740 @@ -6037,9 +6037,9 @@ MimeMessageEnd 9382740 MboxMarkerBegin 9382742 MboxMarkerEnd 9382749 MimeMessageBegin 9382751 -MimeMessageHeadersEnd 9384087 MimeEntityBegin 9382751 MimeEntityHeadersEnd 9384087 +MimeMessageHeadersEnd 9384087 MultipartPreambleBegin 9384087 MultipartPreambleEnd 9384307 MultipartBoundaryBegin 9384307 @@ -6060,9 +6060,9 @@ MimeMessageEnd 9385042 MboxMarkerBegin 9385044 MboxMarkerEnd 9385051 MimeMessageBegin 9385053 -MimeMessageHeadersEnd 9386420 MimeEntityBegin 9385053 MimeEntityHeadersEnd 9386420 +MimeMessageHeadersEnd 9386420 MultipartPreambleBegin 9386420 MultipartPreambleEnd 9386640 MultipartBoundaryBegin 9386640 @@ -6132,9 +6132,9 @@ MimeMessageEnd 9395402 MboxMarkerBegin 9395404 MboxMarkerEnd 9395435 MimeMessageBegin 9395437 -MimeMessageHeadersEnd 9396672 MimeEntityBegin 9395437 MimeEntityHeadersEnd 9396672 +MimeMessageHeadersEnd 9396672 Octets 2920 Lines 39 MimeEntityEnd 9399592 @@ -6142,9 +6142,9 @@ MimeMessageEnd 9399592 MboxMarkerBegin 9399594 MboxMarkerEnd 9399625 MimeMessageBegin 9399627 -MimeMessageHeadersEnd 9400806 MimeEntityBegin 9399627 MimeEntityHeadersEnd 9400806 +MimeMessageHeadersEnd 9400806 Octets 2152 Lines 31 MimeEntityEnd 9402958 @@ -6152,9 +6152,9 @@ MimeMessageEnd 9402958 MboxMarkerBegin 9402960 MboxMarkerEnd 9402991 MimeMessageBegin 9402993 -MimeMessageHeadersEnd 9404092 MimeEntityBegin 9402993 MimeEntityHeadersEnd 9404092 +MimeMessageHeadersEnd 9404092 MultipartPreambleBegin 9404092 MultipartPreambleEnd 9404094 MultipartBoundaryBegin 9404094 @@ -6182,9 +6182,9 @@ MimeMessageEnd 9407102 MboxMarkerBegin 9407104 MboxMarkerEnd 9407135 MimeMessageBegin 9407137 -MimeMessageHeadersEnd 9408193 MimeEntityBegin 9407137 MimeEntityHeadersEnd 9408193 +MimeMessageHeadersEnd 9408193 MultipartPreambleBegin 9408193 MultipartPreambleEnd 9408195 MultipartBoundaryBegin 9408195 @@ -6219,9 +6219,9 @@ MimeMessageEnd 9411145 MboxMarkerBegin 9411147 MboxMarkerEnd 9411178 MimeMessageBegin 9411180 -MimeMessageHeadersEnd 9412276 MimeEntityBegin 9411180 MimeEntityHeadersEnd 9412276 +MimeMessageHeadersEnd 9412276 MultipartPreambleBegin 9412276 MultipartPreambleEnd 9412278 MultipartBoundaryBegin 9412278 @@ -6249,9 +6249,9 @@ MimeMessageEnd 9416879 MboxMarkerBegin 9416881 MboxMarkerEnd 9416888 MimeMessageBegin 9416890 -MimeMessageHeadersEnd 9417456 MimeEntityBegin 9416890 MimeEntityHeadersEnd 9417456 +MimeMessageHeadersEnd 9417456 MultipartPreambleBegin 9417456 MultipartPreambleEnd 9417458 MultipartBoundaryBegin 9417458 @@ -6279,9 +6279,9 @@ MimeMessageEnd 9421944 MboxMarkerBegin 9421946 MboxMarkerEnd 9421977 MimeMessageBegin 9421979 -MimeMessageHeadersEnd 9423163 MimeEntityBegin 9421979 MimeEntityHeadersEnd 9423163 +MimeMessageHeadersEnd 9423163 MultipartPreambleBegin 9423163 MultipartPreambleEnd 9423303 MultipartBoundaryBegin 9423303 @@ -6309,9 +6309,9 @@ MimeMessageEnd 9427294 MboxMarkerBegin 9427296 MboxMarkerEnd 9427327 MimeMessageBegin 9427329 -MimeMessageHeadersEnd 9428452 MimeEntityBegin 9427329 MimeEntityHeadersEnd 9428452 +MimeMessageHeadersEnd 9428452 MultipartPreambleBegin 9428452 MultipartPreambleEnd 9428454 MultipartBoundaryBegin 9428454 @@ -6339,9 +6339,9 @@ MimeMessageEnd 9432575 MboxMarkerBegin 9432577 MboxMarkerEnd 9432608 MimeMessageBegin 9432610 -MimeMessageHeadersEnd 9433755 MimeEntityBegin 9432610 MimeEntityHeadersEnd 9433755 +MimeMessageHeadersEnd 9433755 MultipartPreambleBegin 9433755 MultipartPreambleEnd 9433872 MultipartBoundaryBegin 9433872 @@ -6377,9 +6377,9 @@ MimeMessageEnd 9435052 MboxMarkerBegin 9435054 MboxMarkerEnd 9435099 MimeMessageBegin 9435101 -MimeMessageHeadersEnd 9435272 MimeEntityBegin 9435101 MimeEntityHeadersEnd 9435272 +MimeMessageHeadersEnd 9435272 Octets 35086 Lines 593 MimeEntityEnd 9470358 @@ -6387,9 +6387,9 @@ MimeMessageEnd 9470358 MboxMarkerBegin 9470360 MboxMarkerEnd 9470405 MimeMessageBegin 9470407 -MimeMessageHeadersEnd 9470571 MimeEntityBegin 9470407 MimeEntityHeadersEnd 9470571 +MimeMessageHeadersEnd 9470571 Octets 35086 Lines 593 MimeEntityEnd 9505657 @@ -6397,9 +6397,9 @@ MimeMessageEnd 9505657 MboxMarkerBegin 9505659 MboxMarkerEnd 9505666 MimeMessageBegin 9505668 -MimeMessageHeadersEnd 9506276 MimeEntityBegin 9505668 MimeEntityHeadersEnd 9506276 +MimeMessageHeadersEnd 9506276 Octets 1438 Lines 39 MimeEntityEnd 9507714 @@ -6407,9 +6407,9 @@ MimeMessageEnd 9507714 MboxMarkerBegin 9507716 MboxMarkerEnd 9507723 MimeMessageBegin 9507725 -MimeMessageHeadersEnd 9508642 MimeEntityBegin 9507725 MimeEntityHeadersEnd 9508642 +MimeMessageHeadersEnd 9508642 MultipartPreambleBegin 9508642 MultipartPreambleEnd 9508642 MultipartBoundaryBegin 9508642 @@ -6437,9 +6437,9 @@ MimeMessageEnd 9754778 MboxMarkerBegin 9754780 MboxMarkerEnd 9754787 MimeMessageBegin 9754789 -MimeMessageHeadersEnd 9755397 MimeEntityBegin 9754789 MimeEntityHeadersEnd 9755397 +MimeMessageHeadersEnd 9755397 MultipartPreambleBegin 9755397 MultipartPreambleEnd 9755433 MultipartBoundaryBegin 9755433 @@ -6460,9 +6460,9 @@ MimeMessageEnd 9834353 MboxMarkerBegin 9834355 MboxMarkerEnd 9834362 MimeMessageBegin 9834364 -MimeMessageHeadersEnd 9834521 MimeEntityBegin 9834364 MimeEntityHeadersEnd 9834521 +MimeMessageHeadersEnd 9834521 Octets 3608 Lines 49 MimeEntityEnd 9838129 @@ -6470,9 +6470,9 @@ MimeMessageEnd 9838129 MboxMarkerBegin 9838131 MboxMarkerEnd 9838138 MimeMessageBegin 9838140 -MimeMessageHeadersEnd 9838928 MimeEntityBegin 9838140 MimeEntityHeadersEnd 9838928 +MimeMessageHeadersEnd 9838928 MultipartPreambleBegin 9838928 MultipartPreambleEnd 9839086 MultipartBoundaryBegin 9839086 @@ -6555,9 +6555,9 @@ MimeMessageEnd 9869675 MboxMarkerBegin 9869677 MboxMarkerEnd 9869684 MimeMessageBegin 9869686 -MimeMessageHeadersEnd 9869745 MimeEntityBegin 9869686 MimeEntityHeadersEnd 9869745 +MimeMessageHeadersEnd 9869745 Octets 1235 Lines 28 MimeEntityEnd 9870980 @@ -6565,9 +6565,9 @@ MimeMessageEnd 9870980 MboxMarkerBegin 9870982 MboxMarkerEnd 9871013 MimeMessageBegin 9871015 -MimeMessageHeadersEnd 9871171 MimeEntityBegin 9871015 MimeEntityHeadersEnd 9871171 +MimeMessageHeadersEnd 9871171 Octets 3175 Lines 68 MimeEntityEnd 9874346 @@ -6575,9 +6575,9 @@ MimeMessageEnd 9874346 MboxMarkerBegin 9874348 MboxMarkerEnd 9874379 MimeMessageBegin 9874381 -MimeMessageHeadersEnd 9876277 MimeEntityBegin 9874381 MimeEntityHeadersEnd 9876277 +MimeMessageHeadersEnd 9876277 MultipartPreambleBegin 9876277 MultipartPreambleEnd 9876277 MultipartBoundaryBegin 9876277 @@ -6605,9 +6605,9 @@ MimeMessageEnd 9881248 MboxMarkerBegin 9881250 MboxMarkerEnd 9881257 MimeMessageBegin 9881259 -MimeMessageHeadersEnd 9881826 MimeEntityBegin 9881259 MimeEntityHeadersEnd 9881826 +MimeMessageHeadersEnd 9881826 MultipartPreambleBegin 9881826 MultipartPreambleEnd 9881828 MultipartBoundaryBegin 9881828 @@ -6635,9 +6635,9 @@ MimeMessageEnd 10000273 MboxMarkerBegin 10000275 MboxMarkerEnd 10000282 MimeMessageBegin 10000284 -MimeMessageHeadersEnd 10001099 MimeEntityBegin 10000284 MimeEntityHeadersEnd 10001099 +MimeMessageHeadersEnd 10001099 MultipartPreambleBegin 10001099 MultipartPreambleEnd 10001257 MultipartBoundaryBegin 10001257 @@ -6750,9 +6750,9 @@ MimeMessageEnd 10026556 MboxMarkerBegin 10026558 MboxMarkerEnd 10026565 MimeMessageBegin 10026567 -MimeMessageHeadersEnd 10027702 MimeEntityBegin 10026567 MimeEntityHeadersEnd 10027702 +MimeMessageHeadersEnd 10027702 MultipartPreambleBegin 10027702 MultipartPreambleEnd 10027702 MultipartBoundaryBegin 10027702 @@ -6787,9 +6787,9 @@ MimeMessageEnd 10058732 MboxMarkerBegin 10058734 MboxMarkerEnd 10058741 MimeMessageBegin 10058743 -MimeMessageHeadersEnd 10060481 MimeEntityBegin 10058743 MimeEntityHeadersEnd 10060481 +MimeMessageHeadersEnd 10060481 Octets 185750 Lines 2952 MimeEntityEnd 10246231 @@ -6797,9 +6797,9 @@ MimeMessageEnd 10246231 MboxMarkerBegin 10246233 MboxMarkerEnd 10246240 MimeMessageBegin 10246242 -MimeMessageHeadersEnd 10246965 MimeEntityBegin 10246242 MimeEntityHeadersEnd 10246965 +MimeMessageHeadersEnd 10246965 MultipartPreambleBegin 10246965 MultipartPreambleEnd 10246965 MultipartBoundaryBegin 10246965 @@ -6834,9 +6834,9 @@ MimeMessageEnd 10331708 MboxMarkerBegin 10331710 MboxMarkerEnd 10331717 MimeMessageBegin 10331719 -MimeMessageHeadersEnd 10332401 MimeEntityBegin 10331719 MimeEntityHeadersEnd 10332401 +MimeMessageHeadersEnd 10332401 MultipartPreambleBegin 10332401 MultipartPreambleEnd 10332401 MultipartBoundaryBegin 10332401 @@ -6899,9 +6899,9 @@ MimeMessageEnd 10554623 MboxMarkerBegin 10554625 MboxMarkerEnd 10554632 MimeMessageBegin 10554634 -MimeMessageHeadersEnd 10554906 MimeEntityBegin 10554634 MimeEntityHeadersEnd 10554906 +MimeMessageHeadersEnd 10554906 Octets 75680 Lines 1023 MimeEntityEnd 10630586 @@ -6909,9 +6909,9 @@ MimeMessageEnd 10630586 MboxMarkerBegin 10630588 MboxMarkerEnd 10630595 MimeMessageBegin 10630597 -MimeMessageHeadersEnd 10631896 MimeEntityBegin 10630597 MimeEntityHeadersEnd 10631896 +MimeMessageHeadersEnd 10631896 MultipartPreambleBegin 10631896 MultipartPreambleEnd 10632430 MultipartBoundaryBegin 10632430 @@ -6973,9 +6973,9 @@ MimeMessageEnd 10687748 MboxMarkerBegin 10687750 MboxMarkerEnd 10687757 MimeMessageBegin 10687759 -MimeMessageHeadersEnd 10687916 MimeEntityBegin 10687759 MimeEntityHeadersEnd 10687916 +MimeMessageHeadersEnd 10687916 Octets 4870 Lines 68 MimeEntityEnd 10692786 @@ -6983,9 +6983,9 @@ MimeMessageEnd 10692786 MboxMarkerBegin 10692788 MboxMarkerEnd 10692795 MimeMessageBegin 10692797 -MimeMessageHeadersEnd 10693559 MimeEntityBegin 10692797 MimeEntityHeadersEnd 10693559 +MimeMessageHeadersEnd 10693559 MultipartPreambleBegin 10693559 MultipartPreambleEnd 10693904 MultipartBoundaryBegin 10693904 From b1b7090176b6e5dd4587487e010f13f254f61240 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 22:50:30 -0400 Subject: [PATCH 648/741] Improved line-count reporting in the MimeParser Also fixed the MimeMessageENd and MimeEntityEnd offsets for the last message/entity in the file (it should include the trailing CRLF). --- MimeKit/AsyncMimeParser.cs | 17 ++- MimeKit/MimeParser.cs | 57 +++++---- UnitTests/MimeParserTests.cs | 111 ++++++++++++++++++ .../mbox/content-length.dos-offsets.txt | 6 +- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 6 +- 5 files changed, 161 insertions(+), 36 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 5a77b6f9db..9f73f8f4bb 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -80,8 +80,7 @@ async Task StepByteOrderMarkAsync (CancellationToken cancellationToken) async Task StepMboxMarkerAsync (CancellationToken cancellationToken) { - bool complete = false; - bool needInput; + bool complete; int left = 0; mboxMarkerLength = 0; @@ -96,11 +95,9 @@ async Task StepMboxMarkerAsync (CancellationToken cancellationToken) return; } - needInput = false; - unsafe { fixed (byte* inbuf = input) { - StepMboxMarker (inbuf, ref needInput, ref complete, ref left); + complete = StepMboxMarker (inbuf, ref left); } } } while (!complete); @@ -272,7 +269,7 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation } OnMimeContentOctets (part, endOffset - beginOffset); - OnMimeContentLines (part, lineNumber - beginLineNumber); + OnMimeContentLines (part, GetLineCount (beginLineNumber)); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -366,7 +363,7 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentOctets (rfc822, endOffset - beginOffset); - OnMimeContentLines (rfc822, lineNumber - beginLineNumber); + OnMimeContentLines (rfc822, GetLineCount (beginLineNumber)); } async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) @@ -470,7 +467,7 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, lineNumber - beginLineNumber); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); return; } @@ -494,14 +491,14 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, lineNumber - beginLineNumber); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); return; } endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, lineNumber - beginLineNumber); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); multipart.WriteEndBoundary = false; diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index b2ce5dd45f..c594d7613f 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -143,6 +143,7 @@ public partial class MimeParser : IEnumerable long headerBlockBegin; long headerBlockEnd; long contentEnd; + long lineBeginOffset; int lineNumber; Stream stream; long position; @@ -335,6 +336,7 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, contentEnd = 0; position = stream.CanSeek ? stream.Position : 0; + lineBeginOffset = position; preHeaderLength = 0; headers.Clear (); headerOffset = 0; @@ -733,7 +735,7 @@ long GetOffset (int index) long GetEndOffset (int index) { - if (index > 1 && input[index - 1] == (byte) '\n') { + if (boundary != BoundaryType.Eos && index > 1 && input[index - 1] == (byte) '\n') { index--; if (index > 1 && input[index - 1] == (byte) '\r') @@ -743,6 +745,20 @@ long GetEndOffset (int index) return GetOffset (index); } + int GetLineCount (int beginLineNumber) + { + var lines = lineNumber - beginLineNumber; + + if (boundary == BoundaryType.Eos) { + var offset = GetOffset (inputIndex); + + if (offset > lineBeginOffset) + lines++; + } + + return lines; + } + static unsafe bool CStringsEqual (byte* str1, byte* str2, int length) { byte* se = str1 + length; @@ -807,7 +823,7 @@ static unsafe bool IsMboxMarker (byte* text, bool allowMunged = false) #endif } - unsafe void StepMboxMarker (byte *inbuf, ref bool needInput, ref bool complete, ref int left) + unsafe bool StepMboxMarker (byte *inbuf, ref int left) { byte* inptr = inbuf + inputIndex; byte* inend = inbuf + inputEnd; @@ -833,10 +849,11 @@ unsafe void StepMboxMarker (byte *inbuf, ref bool needInput, ref bool complete, // we don't have enough input data inputIndex = (int) (start - inbuf); left = (int) (inptr - start); - needInput = true; - break; + return false; } + inputIndex = (int) (inptr - inbuf); + lineBeginOffset = GetOffset (inputIndex); lineNumber++; if (length >= 5 && IsMboxMarker (start)) { @@ -852,21 +869,19 @@ unsafe void StepMboxMarker (byte *inbuf, ref bool needInput, ref bool complete, Array.Resize (ref mboxMarkerBuffer, mboxMarkerLength); Buffer.BlockCopy (input, startIndex, mboxMarkerBuffer, 0, (int) length); - complete = true; - break; + + return true; } } - if (!needInput) { - inputIndex = (int) (inptr - inbuf); - left = 0; - } + left = 0; + + return false; } unsafe void StepMboxMarker (byte* inbuf, CancellationToken cancellationToken) { - bool complete = false; - bool needInput; + bool complete; int left = 0; mboxMarkerLength = 0; @@ -881,9 +896,7 @@ unsafe void StepMboxMarker (byte* inbuf, CancellationToken cancellationToken) return; } - needInput = false; - - StepMboxMarker (inbuf, ref needInput, ref complete, ref left); + complete = StepMboxMarker (inbuf, ref left); } while (!complete); state = MimeParserState.MessageHeaders; @@ -1056,6 +1069,7 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check break; } + lineBeginOffset = GetOffset ((int) (inptr - inbuf) + 1); lineNumber++; // check to see if we've reached the end of the headers @@ -1182,6 +1196,7 @@ unsafe bool SkipLine (byte* inbuf, bool consumeNewLine) if (consumeNewLine) { inputIndex++; lineNumber++; + lineBeginOffset = GetOffset (inputIndex); } else if (*(inptr - 1) == (byte) '\r') { inputIndex--; } @@ -1413,6 +1428,8 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b lineNumber++; length++; inptr++; + + lineBeginOffset = GetOffset ((int) (inptr - inbuf)); } else { // didn't find the end of the line... midline = true; @@ -1513,7 +1530,7 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can } OnMimeContentOctets (part, endOffset - beginOffset); - OnMimeContentLines (part, lineNumber - beginLineNumber); + OnMimeContentLines (part, GetLineCount (beginLineNumber)); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -1603,7 +1620,7 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentOctets (rfc822, endOffset - beginOffset); - OnMimeContentLines (rfc822, lineNumber - beginLineNumber); + OnMimeContentLines (rfc822, GetLineCount (beginLineNumber)); } unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) @@ -1720,7 +1737,7 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, lineNumber - beginLineNumber); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); return; } @@ -1744,14 +1761,14 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, lineNumber - beginLineNumber); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); return; } endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, lineNumber - beginLineNumber); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); multipart.WriteEndBoundary = false; diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index c604bbfd3d..0f6f8eb446 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -38,6 +38,7 @@ using MimeKit.IO; using MimeKit.Utils; using MimeKit.IO.Filters; +using System.Linq; namespace UnitTests { [TestFixture] @@ -1173,5 +1174,115 @@ public void TestIssue358 () } } } + + [Test] + public void TestLineCountSingleLine () + { + const string text = @"From: mimekit@example.org +To: mimekit@example.org +Subject: This is a message with a single line of text +Message-Id: <123@example.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii + +This is a single line of text"; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var parser = new CustomMimeParser (stream, MimeFormat.Entity); + var message = parser.ParseMessage (); + + var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + + Assert.AreEqual (1, lines, "Line count"); + } + } + + [Test] + public void TestLineCountSingleLineCRLF () + { + const string text = @"From: mimekit@example.org +To: mimekit@example.org +Subject: This is a message with a single line of text +Message-Id: <123@example.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii + +This is a single line of text +"; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var parser = new CustomMimeParser (stream, MimeFormat.Entity); + var message = parser.ParseMessage (); + + var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + + Assert.AreEqual (1, lines, "Line count"); + } + } + + [Test] + public void TestLineCountSingleLineInMultipart () + { + const string text = @"From: mimekit@example.org +To: mimekit@example.org +Subject: This is a message with a single line of text +Message-Id: <123@example.org> +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary=""boundary-marker"" + +--boundary-marker +Content-Type: text/plain; charset=us-ascii + +This is a single line of text +--boundary-marker +Content-Type: application/octet-stream; name=""attachment.dat"" +Content-DIsposition: attachment; filename=""attachment.dat"" + +ABC +--boundary-marker-- +"; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var parser = new CustomMimeParser (stream, MimeFormat.Entity); + var message = parser.ParseMessage (); + + var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + + Assert.AreEqual (1, lines, "Line count"); + } + } + + [Test] + public void TestLineCountOneLineOfTextFollowedByBlankLineInMultipart () + { + const string text = @"From: mimekit@example.org +To: mimekit@example.org +Subject: This is a message with a single line of text +Message-Id: <123@example.org> +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary=""boundary-marker"" + +--boundary-marker +Content-Type: text/plain; charset=us-ascii + +This is a single line of text followed by a blank line + +--boundary-marker +Content-Type: application/octet-stream; name=""attachment.dat"" +Content-DIsposition: attachment; filename=""attachment.dat"" + +ABC +--boundary-marker-- +"; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var parser = new CustomMimeParser (stream, MimeFormat.Entity); + var message = parser.ParseMessage (); + + var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + + Assert.AreEqual (2, lines, "Line count"); + } + } } } diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index b4b5c94cf9..638dc9f274 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -969,7 +969,7 @@ MultipartEndBoundaryBegin 948790 MultipartEndBoundaryEnd 948837 MultipartEpilogueBegin 948837 MultipartEpilogueEnd 948839 -Octets 4969 +Octets 4971 Lines 92 -MimeEntityEnd 948837 -MimeMessageEnd 948837 +MimeEntityEnd 948839 +MimeMessageEnd 948839 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index 02d5d3fd80..451ab3b74d 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -7033,7 +7033,7 @@ MultipartEndBoundaryBegin 10700946 MultipartEndBoundaryEnd 10700989 MultipartEpilogueBegin 10700989 MultipartEpilogueEnd 10700991 -Octets 7430 +Octets 7432 Lines 133 -MimeEntityEnd 10700989 -MimeMessageEnd 10700989 +MimeEntityEnd 10700991 +MimeMessageEnd 10700991 From 93eed4d08d9dca96b4a94d461fcf2e95dd7ed8dd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 18 Jun 2020 22:53:15 -0400 Subject: [PATCH 649/741] Updated unit offsets for mbox parser tests --- UnitTests/TestData/mbox/content-length.unix-offsets.txt | 6 +++--- UnitTests/TestData/mbox/jwz.unix-offsets.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt index 079629238d..827cf9d7ec 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -969,7 +969,7 @@ MultipartEndBoundaryBegin 935225 MultipartEndBoundaryEnd 935271 MultipartEpilogueBegin 935271 MultipartEpilogueEnd 935272 -Octets 4878 +Octets 4879 Lines 92 -MimeEntityEnd 935271 -MimeMessageEnd 935271 +MimeEntityEnd 935272 +MimeMessageEnd 935272 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt index e698525534..48935a027f 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -7033,7 +7033,7 @@ MultipartEndBoundaryBegin 10536272 MultipartEndBoundaryEnd 10536314 MultipartEpilogueBegin 10536314 MultipartEpilogueEnd 10536315 -Octets 7298 +Octets 7299 Lines 133 -MimeEntityEnd 10536314 -MimeMessageEnd 10536314 +MimeEntityEnd 10536315 +MimeMessageEnd 10536315 From f196f1f171814724fdcdf1a868d1312b7e58f972 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 19 Jun 2020 09:10:37 -0400 Subject: [PATCH 650/741] Improved MimeParser LineCount tracking Fixed a corner case discovered in issue #582 --- MimeKit/MimeParser.cs | 8 ++------ UnitTests/MimeParserTests.cs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index c594d7613f..b546867aa5 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -749,12 +749,8 @@ int GetLineCount (int beginLineNumber) { var lines = lineNumber - beginLineNumber; - if (boundary == BoundaryType.Eos) { - var offset = GetOffset (inputIndex); - - if (offset > lineBeginOffset) - lines++; - } + if (boundary == BoundaryType.Eos && lineBeginOffset >= headerBlockEnd && position > lineBeginOffset) + lines++; return lines; } diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 0f6f8eb446..03fd4399c4 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -1284,5 +1284,35 @@ This is a single line of text followed by a blank line Assert.AreEqual (2, lines, "Line count"); } } + + [Test] + public void TestLineCountNonTerminatedSingleHeader () + { + const string text = "From: mimekit@example.org"; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var parser = new CustomMimeParser (stream, MimeFormat.Entity); + var message = parser.ParseMessage (); + + var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + + Assert.AreEqual (0, lines, "Line count"); + } + } + + [Test] + public void TestLineCountProperlyTerminatedSingleHeader () + { + const string text = "From: mimekit@example.org\r\n"; + + using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (text), false)) { + var parser = new CustomMimeParser (stream, MimeFormat.Entity); + var message = parser.ParseMessage (); + + var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + + Assert.AreEqual (0, lines, "Line count"); + } + } } } From 8725552aca022d9735ab935c8a258278c2e9aa7a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 19 Jun 2020 09:42:06 -0400 Subject: [PATCH 651/741] Updated MimeParser.OnMboxMarkerEnd() to include the CRLF Another update to issue #582 --- MimeKit/MimeParser.cs | 22 +- UnitTests/MimeParserTests.cs | 2 +- .../mbox/content-length.dos-offsets.txt | 58 ++-- .../mbox/content-length.unix-offsets.txt | 58 ++-- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 304 +++++++++--------- UnitTests/TestData/mbox/jwz.unix-offsets.txt | 304 +++++++++--------- 6 files changed, 374 insertions(+), 374 deletions(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index b546867aa5..4b6a79f2c4 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -827,44 +827,44 @@ unsafe bool StepMboxMarker (byte *inbuf, ref int left) *inend = (byte) '\n'; while (inptr < inend) { + int startIndex = inputIndex; byte* start = inptr; // scan for the end of the line while (*inptr != (byte) '\n') inptr++; - long length = inptr - start; + var markerLength = (int) (inptr - start); if (inptr > start && *(inptr - 1) == (byte) '\r') - length--; + markerLength--; // consume the '\n' inptr++; + var lineLength = (int) (inptr - start); + if (inptr >= inend) { // we don't have enough input data - inputIndex = (int) (start - inbuf); - left = (int) (inptr - start); + left = lineLength; return false; } - inputIndex = (int) (inptr - inbuf); + inputIndex += lineLength; lineBeginOffset = GetOffset (inputIndex); lineNumber++; - if (length >= 5 && IsMboxMarker (start)) { - int startIndex = (int) (start - inbuf); - + if (markerLength >= 5 && IsMboxMarker (start)) { mboxMarkerOffset = GetOffset (startIndex); - mboxMarkerLength = (int) length; + mboxMarkerLength = markerLength; OnMboxMarkerBegin (mboxMarkerOffset); - OnMboxMarkerEnd (mboxMarkerOffset + length); + OnMboxMarkerEnd (mboxMarkerOffset + lineLength); if (mboxMarkerBuffer.Length < mboxMarkerLength) Array.Resize (ref mboxMarkerBuffer, mboxMarkerLength); - Buffer.BlockCopy (input, startIndex, mboxMarkerBuffer, 0, (int) length); + Buffer.BlockCopy (input, startIndex, mboxMarkerBuffer, 0, markerLength); return true; } diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 03fd4399c4..9fa78c82e8 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Globalization; @@ -38,7 +39,6 @@ using MimeKit.IO; using MimeKit.Utils; using MimeKit.IO.Filters; -using System.Linq; namespace UnitTests { [TestFixture] diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index 638dc9f274..c4d1e2824f 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -1,5 +1,5 @@ MboxMarkerBegin 0 -MboxMarkerEnd 7 +MboxMarkerEnd 9 MimeMessageBegin 9 MimeEntityBegin 9 MimeEntityHeadersEnd 675 @@ -37,7 +37,7 @@ Lines 34 MimeEntityEnd 1939 MimeMessageEnd 1939 MboxMarkerBegin 1941 -MboxMarkerEnd 1948 +MboxMarkerEnd 1950 MimeMessageBegin 1950 MimeEntityBegin 1950 MimeEntityHeadersEnd 2430 @@ -149,7 +149,7 @@ Lines 145 MimeEntityEnd 8331 MimeMessageEnd 8331 MboxMarkerBegin 8333 -MboxMarkerEnd 8340 +MboxMarkerEnd 8342 MimeMessageBegin 8342 MimeEntityBegin 8342 MimeEntityHeadersEnd 8825 @@ -261,7 +261,7 @@ Lines 145 MimeEntityEnd 14761 MimeMessageEnd 14761 MboxMarkerBegin 14763 -MboxMarkerEnd 14794 +MboxMarkerEnd 14796 MimeMessageBegin 14796 MimeEntityBegin 14796 MimeEntityHeadersEnd 16325 @@ -291,7 +291,7 @@ Lines 140 MimeEntityEnd 23019 MimeMessageEnd 23019 MboxMarkerBegin 23021 -MboxMarkerEnd 23052 +MboxMarkerEnd 23054 MimeMessageBegin 23054 MimeEntityBegin 23054 MimeEntityHeadersEnd 24310 @@ -369,7 +369,7 @@ Lines 10286 MimeEntityEnd 781880 MimeMessageEnd 781880 MboxMarkerBegin 781882 -MboxMarkerEnd 781913 +MboxMarkerEnd 781915 MimeMessageBegin 781915 MimeEntityBegin 781915 MimeEntityHeadersEnd 783201 @@ -420,7 +420,7 @@ Lines 650 MimeEntityEnd 830478 MimeMessageEnd 830478 MboxMarkerBegin 830480 -MboxMarkerEnd 830487 +MboxMarkerEnd 830489 MimeMessageBegin 830489 MimeEntityBegin 830489 MimeEntityHeadersEnd 831421 @@ -443,7 +443,7 @@ Lines 103 MimeEntityEnd 834102 MimeMessageEnd 834102 MboxMarkerBegin 834104 -MboxMarkerEnd 834135 +MboxMarkerEnd 834137 MimeMessageBegin 834137 MimeEntityBegin 834137 MimeEntityHeadersEnd 835308 @@ -473,7 +473,7 @@ Lines 42 MimeEntityEnd 837133 MimeMessageEnd 837133 MboxMarkerBegin 837135 -MboxMarkerEnd 837166 +MboxMarkerEnd 837168 MimeMessageBegin 837168 MimeEntityBegin 837168 MimeEntityHeadersEnd 838329 @@ -503,7 +503,7 @@ Lines 60 MimeEntityEnd 841797 MimeMessageEnd 841797 MboxMarkerBegin 841799 -MboxMarkerEnd 841830 +MboxMarkerEnd 841832 MimeMessageBegin 841832 MimeEntityBegin 841832 MimeEntityHeadersEnd 842992 @@ -533,7 +533,7 @@ Lines 97 MimeEntityEnd 848942 MimeMessageEnd 848942 MboxMarkerBegin 848944 -MboxMarkerEnd 848975 +MboxMarkerEnd 848977 MimeMessageBegin 848977 MimeEntityBegin 848977 MimeEntityHeadersEnd 849895 @@ -563,7 +563,7 @@ Lines 225 MimeEntityEnd 865868 MimeMessageEnd 865868 MboxMarkerBegin 865870 -MboxMarkerEnd 865901 +MboxMarkerEnd 865903 MimeMessageBegin 865903 MimeEntityBegin 865903 MimeEntityHeadersEnd 867318 @@ -573,7 +573,7 @@ Lines 20 MimeEntityEnd 868768 MimeMessageEnd 868768 MboxMarkerBegin 868770 -MboxMarkerEnd 868801 +MboxMarkerEnd 868803 MimeMessageBegin 868803 MimeEntityBegin 868803 MimeEntityHeadersEnd 870180 @@ -603,7 +603,7 @@ Lines 70 MimeEntityEnd 874641 MimeMessageEnd 874641 MboxMarkerBegin 874643 -MboxMarkerEnd 874674 +MboxMarkerEnd 874676 MimeMessageBegin 874676 MimeEntityBegin 874676 MimeEntityHeadersEnd 875907 @@ -613,7 +613,7 @@ Lines 56 MimeEntityEnd 879457 MimeMessageEnd 879457 MboxMarkerBegin 879459 -MboxMarkerEnd 879490 +MboxMarkerEnd 879492 MimeMessageBegin 879492 MimeEntityBegin 879492 MimeEntityHeadersEnd 880590 @@ -623,7 +623,7 @@ Lines 10 MimeEntityEnd 881260 MimeMessageEnd 881260 MboxMarkerBegin 881262 -MboxMarkerEnd 881293 +MboxMarkerEnd 881295 MimeMessageBegin 881295 MimeEntityBegin 881295 MimeEntityHeadersEnd 882097 @@ -641,7 +641,7 @@ Lines 44 MimeEntityEnd 884952 MimeMessageEnd 884952 MboxMarkerBegin 884954 -MboxMarkerEnd 884985 +MboxMarkerEnd 884987 MimeMessageBegin 884987 MimeEntityBegin 884987 MimeEntityHeadersEnd 885714 @@ -679,7 +679,7 @@ Lines 59 MimeEntityEnd 888960 MimeMessageEnd 888960 MboxMarkerBegin 888962 -MboxMarkerEnd 888993 +MboxMarkerEnd 888995 MimeMessageBegin 888995 MimeEntityBegin 888995 MimeEntityHeadersEnd 889676 @@ -709,7 +709,7 @@ Lines 92 MimeEntityEnd 895778 MimeMessageEnd 895778 MboxMarkerBegin 895780 -MboxMarkerEnd 895811 +MboxMarkerEnd 895813 MimeMessageBegin 895813 MimeEntityBegin 895813 MimeEntityHeadersEnd 896896 @@ -719,7 +719,7 @@ Lines 141 MimeEntityEnd 907272 MimeMessageEnd 907272 MboxMarkerBegin 907274 -MboxMarkerEnd 907305 +MboxMarkerEnd 907307 MimeMessageBegin 907307 MimeEntityBegin 907307 MimeEntityHeadersEnd 908707 @@ -749,7 +749,7 @@ Lines 55 MimeEntityEnd 911574 MimeMessageEnd 911574 MboxMarkerBegin 911576 -MboxMarkerEnd 911607 +MboxMarkerEnd 911609 MimeMessageBegin 911609 MimeEntityBegin 911609 MimeEntityHeadersEnd 912172 @@ -759,7 +759,7 @@ Lines 8 MimeEntityEnd 912702 MimeMessageEnd 912702 MboxMarkerBegin 912704 -MboxMarkerEnd 912735 +MboxMarkerEnd 912737 MimeMessageBegin 912737 MimeEntityBegin 912737 MimeEntityHeadersEnd 913972 @@ -769,7 +769,7 @@ Lines 39 MimeEntityEnd 916892 MimeMessageEnd 916892 MboxMarkerBegin 916894 -MboxMarkerEnd 916925 +MboxMarkerEnd 916927 MimeMessageBegin 916927 MimeEntityBegin 916927 MimeEntityHeadersEnd 918106 @@ -779,7 +779,7 @@ Lines 31 MimeEntityEnd 920258 MimeMessageEnd 920258 MboxMarkerBegin 920260 -MboxMarkerEnd 920291 +MboxMarkerEnd 920293 MimeMessageBegin 920293 MimeEntityBegin 920293 MimeEntityHeadersEnd 921392 @@ -809,7 +809,7 @@ Lines 54 MimeEntityEnd 924402 MimeMessageEnd 924402 MboxMarkerBegin 924404 -MboxMarkerEnd 924435 +MboxMarkerEnd 924437 MimeMessageBegin 924437 MimeEntityBegin 924437 MimeEntityHeadersEnd 925493 @@ -846,7 +846,7 @@ Lines 73 MimeEntityEnd 928445 MimeMessageEnd 928445 MboxMarkerBegin 928447 -MboxMarkerEnd 928478 +MboxMarkerEnd 928480 MimeMessageBegin 928480 MimeEntityBegin 928480 MimeEntityHeadersEnd 929576 @@ -876,7 +876,7 @@ Lines 76 MimeEntityEnd 934179 MimeMessageEnd 934179 MboxMarkerBegin 934181 -MboxMarkerEnd 934212 +MboxMarkerEnd 934214 MimeMessageBegin 934214 MimeEntityBegin 934214 MimeEntityHeadersEnd 935337 @@ -906,7 +906,7 @@ Lines 73 MimeEntityEnd 939460 MimeMessageEnd 939460 MboxMarkerBegin 939462 -MboxMarkerEnd 939493 +MboxMarkerEnd 939495 MimeMessageBegin 939495 MimeEntityBegin 939495 MimeEntityHeadersEnd 940640 @@ -944,7 +944,7 @@ Lines 35 MimeEntityEnd 941937 MimeMessageEnd 941937 MboxMarkerBegin 941939 -MboxMarkerEnd 941970 +MboxMarkerEnd 941972 MimeMessageBegin 941972 MimeEntityBegin 941972 MimeEntityHeadersEnd 943868 diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt index 827cf9d7ec..1a6118a883 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -1,5 +1,5 @@ MboxMarkerBegin 0 -MboxMarkerEnd 7 +MboxMarkerEnd 8 MimeMessageBegin 8 MimeEntityBegin 8 MimeEntityHeadersEnd 657 @@ -37,7 +37,7 @@ Lines 34 MimeEntityEnd 1888 MimeMessageEnd 1888 MboxMarkerBegin 1889 -MboxMarkerEnd 1896 +MboxMarkerEnd 1897 MimeMessageBegin 1897 MimeEntityBegin 1897 MimeEntityHeadersEnd 2365 @@ -149,7 +149,7 @@ Lines 145 MimeEntityEnd 8122 MimeMessageEnd 8122 MboxMarkerBegin 8123 -MboxMarkerEnd 8130 +MboxMarkerEnd 8131 MimeMessageBegin 8131 MimeEntityBegin 8131 MimeEntityHeadersEnd 8602 @@ -261,7 +261,7 @@ Lines 145 MimeEntityEnd 14394 MimeMessageEnd 14394 MboxMarkerBegin 14395 -MboxMarkerEnd 14426 +MboxMarkerEnd 14427 MimeMessageBegin 14427 MimeEntityBegin 14427 MimeEntityHeadersEnd 15930 @@ -291,7 +291,7 @@ Lines 140 MimeEntityEnd 22485 MimeMessageEnd 22485 MboxMarkerBegin 22486 -MboxMarkerEnd 22517 +MboxMarkerEnd 22518 MimeMessageBegin 22518 MimeEntityBegin 22518 MimeEntityHeadersEnd 23752 @@ -369,7 +369,7 @@ Lines 10286 MimeEntityEnd 771037 MimeMessageEnd 771037 MboxMarkerBegin 771038 -MboxMarkerEnd 771069 +MboxMarkerEnd 771070 MimeMessageBegin 771070 MimeEntityBegin 771070 MimeEntityHeadersEnd 772334 @@ -420,7 +420,7 @@ Lines 650 MimeEntityEnd 818962 MimeMessageEnd 818962 MboxMarkerBegin 818963 -MboxMarkerEnd 818970 +MboxMarkerEnd 818971 MimeMessageBegin 818971 MimeEntityBegin 818971 MimeEntityHeadersEnd 819882 @@ -443,7 +443,7 @@ Lines 103 MimeEntityEnd 822461 MimeMessageEnd 822461 MboxMarkerBegin 822462 -MboxMarkerEnd 822493 +MboxMarkerEnd 822494 MimeMessageBegin 822494 MimeEntityBegin 822494 MimeEntityHeadersEnd 823647 @@ -473,7 +473,7 @@ Lines 42 MimeEntityEnd 825431 MimeMessageEnd 825431 MboxMarkerBegin 825432 -MboxMarkerEnd 825463 +MboxMarkerEnd 825464 MimeMessageBegin 825464 MimeEntityBegin 825464 MimeEntityHeadersEnd 826606 @@ -503,7 +503,7 @@ Lines 60 MimeEntityEnd 830015 MimeMessageEnd 830015 MboxMarkerBegin 830016 -MboxMarkerEnd 830047 +MboxMarkerEnd 830048 MimeMessageBegin 830048 MimeEntityBegin 830048 MimeEntityHeadersEnd 831185 @@ -533,7 +533,7 @@ Lines 97 MimeEntityEnd 837039 MimeMessageEnd 837039 MboxMarkerBegin 837040 -MboxMarkerEnd 837071 +MboxMarkerEnd 837072 MimeMessageBegin 837072 MimeEntityBegin 837072 MimeEntityHeadersEnd 837972 @@ -563,7 +563,7 @@ Lines 225 MimeEntityEnd 853721 MimeMessageEnd 853721 MboxMarkerBegin 853722 -MboxMarkerEnd 853753 +MboxMarkerEnd 853754 MimeMessageBegin 853754 MimeEntityBegin 853754 MimeEntityHeadersEnd 855145 @@ -573,7 +573,7 @@ Lines 20 MimeEntityEnd 856576 MimeMessageEnd 856576 MboxMarkerBegin 856577 -MboxMarkerEnd 856608 +MboxMarkerEnd 856609 MimeMessageBegin 856609 MimeEntityBegin 856609 MimeEntityHeadersEnd 857962 @@ -603,7 +603,7 @@ Lines 70 MimeEntityEnd 862354 MimeMessageEnd 862354 MboxMarkerBegin 862355 -MboxMarkerEnd 862386 +MboxMarkerEnd 862387 MimeMessageBegin 862387 MimeEntityBegin 862387 MimeEntityHeadersEnd 863597 @@ -613,7 +613,7 @@ Lines 56 MimeEntityEnd 867092 MimeMessageEnd 867092 MboxMarkerBegin 867093 -MboxMarkerEnd 867124 +MboxMarkerEnd 867125 MimeMessageBegin 867125 MimeEntityBegin 867125 MimeEntityHeadersEnd 868202 @@ -623,7 +623,7 @@ Lines 10 MimeEntityEnd 868863 MimeMessageEnd 868863 MboxMarkerBegin 868864 -MboxMarkerEnd 868895 +MboxMarkerEnd 868896 MimeMessageBegin 868896 MimeEntityBegin 868896 MimeEntityHeadersEnd 869679 @@ -641,7 +641,7 @@ Lines 44 MimeEntityEnd 872491 MimeMessageEnd 872491 MboxMarkerBegin 872492 -MboxMarkerEnd 872523 +MboxMarkerEnd 872524 MimeMessageBegin 872524 MimeEntityBegin 872524 MimeEntityHeadersEnd 873234 @@ -679,7 +679,7 @@ Lines 59 MimeEntityEnd 876422 MimeMessageEnd 876422 MboxMarkerBegin 876423 -MboxMarkerEnd 876454 +MboxMarkerEnd 876455 MimeMessageBegin 876455 MimeEntityBegin 876455 MimeEntityHeadersEnd 877120 @@ -709,7 +709,7 @@ Lines 92 MimeEntityEnd 883131 MimeMessageEnd 883131 MboxMarkerBegin 883132 -MboxMarkerEnd 883163 +MboxMarkerEnd 883164 MimeMessageBegin 883164 MimeEntityBegin 883164 MimeEntityHeadersEnd 884226 @@ -719,7 +719,7 @@ Lines 141 MimeEntityEnd 894462 MimeMessageEnd 894462 MboxMarkerBegin 894463 -MboxMarkerEnd 894494 +MboxMarkerEnd 894495 MimeMessageBegin 894495 MimeEntityBegin 894495 MimeEntityHeadersEnd 895871 @@ -749,7 +749,7 @@ Lines 55 MimeEntityEnd 898684 MimeMessageEnd 898684 MboxMarkerBegin 898685 -MboxMarkerEnd 898716 +MboxMarkerEnd 898717 MimeMessageBegin 898717 MimeEntityBegin 898717 MimeEntityHeadersEnd 899265 @@ -759,7 +759,7 @@ Lines 8 MimeEntityEnd 899788 MimeMessageEnd 899788 MboxMarkerBegin 899789 -MboxMarkerEnd 899820 +MboxMarkerEnd 899821 MimeMessageBegin 899821 MimeEntityBegin 899821 MimeEntityHeadersEnd 901036 @@ -769,7 +769,7 @@ Lines 39 MimeEntityEnd 903918 MimeMessageEnd 903918 MboxMarkerBegin 903919 -MboxMarkerEnd 903950 +MboxMarkerEnd 903951 MimeMessageBegin 903951 MimeEntityBegin 903951 MimeEntityHeadersEnd 905109 @@ -779,7 +779,7 @@ Lines 31 MimeEntityEnd 907231 MimeMessageEnd 907231 MboxMarkerBegin 907232 -MboxMarkerEnd 907263 +MboxMarkerEnd 907264 MimeMessageBegin 907264 MimeEntityBegin 907264 MimeEntityHeadersEnd 908342 @@ -809,7 +809,7 @@ Lines 54 MimeEntityEnd 911299 MimeMessageEnd 911299 MboxMarkerBegin 911300 -MboxMarkerEnd 911331 +MboxMarkerEnd 911332 MimeMessageBegin 911332 MimeEntityBegin 911332 MimeEntityHeadersEnd 912369 @@ -846,7 +846,7 @@ Lines 73 MimeEntityEnd 915249 MimeMessageEnd 915249 MboxMarkerBegin 915250 -MboxMarkerEnd 915281 +MboxMarkerEnd 915282 MimeMessageBegin 915282 MimeEntityBegin 915282 MimeEntityHeadersEnd 916357 @@ -876,7 +876,7 @@ Lines 76 MimeEntityEnd 920885 MimeMessageEnd 920885 MboxMarkerBegin 920886 -MboxMarkerEnd 920917 +MboxMarkerEnd 920918 MimeMessageBegin 920918 MimeEntityBegin 920918 MimeEntityHeadersEnd 922020 @@ -906,7 +906,7 @@ Lines 73 MimeEntityEnd 926071 MimeMessageEnd 926071 MboxMarkerBegin 926072 -MboxMarkerEnd 926103 +MboxMarkerEnd 926104 MimeMessageBegin 926104 MimeEntityBegin 926104 MimeEntityHeadersEnd 927232 @@ -944,7 +944,7 @@ Lines 35 MimeEntityEnd 928495 MimeMessageEnd 928495 MboxMarkerBegin 928496 -MboxMarkerEnd 928527 +MboxMarkerEnd 928528 MimeMessageBegin 928528 MimeEntityBegin 928528 MimeEntityHeadersEnd 930393 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index 451ab3b74d..b6787f26f4 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -1,5 +1,5 @@ MboxMarkerBegin 0 -MboxMarkerEnd 7 +MboxMarkerEnd 9 MimeMessageBegin 9 MimeEntityBegin 9 MimeEntityHeadersEnd 531 @@ -90,7 +90,7 @@ Lines 4536 MimeEntityEnd 181624 MimeMessageEnd 181624 MboxMarkerBegin 181626 -MboxMarkerEnd 181633 +MboxMarkerEnd 181635 MimeMessageBegin 181635 MimeEntityBegin 181635 MimeEntityHeadersEnd 182198 @@ -100,7 +100,7 @@ Lines 1855 MimeEntityEnd 319322 MimeMessageEnd 319322 MboxMarkerBegin 319324 -MboxMarkerEnd 319331 +MboxMarkerEnd 319333 MimeMessageBegin 319333 MimeEntityBegin 319333 MimeEntityHeadersEnd 319720 @@ -110,7 +110,7 @@ Lines 4 MimeEntityEnd 319924 MimeMessageEnd 319924 MboxMarkerBegin 319926 -MboxMarkerEnd 319933 +MboxMarkerEnd 319935 MimeMessageBegin 319935 MimeEntityBegin 319935 MimeEntityHeadersEnd 320596 @@ -167,7 +167,7 @@ Lines 106 MimeEntityEnd 326365 MimeMessageEnd 326365 MboxMarkerBegin 326367 -MboxMarkerEnd 326374 +MboxMarkerEnd 326376 MimeMessageBegin 326376 MimeEntityBegin 326376 MimeEntityHeadersEnd 327141 @@ -235,7 +235,7 @@ Lines 360 MimeEntityEnd 350773 MimeMessageEnd 350773 MboxMarkerBegin 350775 -MboxMarkerEnd 350782 +MboxMarkerEnd 350784 MimeMessageBegin 350784 MimeEntityBegin 350784 MimeEntityHeadersEnd 351518 @@ -334,7 +334,7 @@ Lines 23546 MimeEntityEnd 2139219 MimeMessageEnd 2139219 MboxMarkerBegin 2139221 -MboxMarkerEnd 2139228 +MboxMarkerEnd 2139230 MimeMessageBegin 2139230 MimeEntityBegin 2139230 MimeEntityHeadersEnd 2140267 @@ -344,7 +344,7 @@ Lines 40 MimeEntityEnd 2141431 MimeMessageEnd 2141431 MboxMarkerBegin 2141433 -MboxMarkerEnd 2141440 +MboxMarkerEnd 2141442 MimeMessageBegin 2141442 MimeEntityBegin 2141442 MimeEntityHeadersEnd 2141689 @@ -401,7 +401,7 @@ Lines 1050 MimeEntityEnd 2307345 MimeMessageEnd 2307345 MboxMarkerBegin 2307347 -MboxMarkerEnd 2307354 +MboxMarkerEnd 2307356 MimeMessageBegin 2307356 MimeEntityBegin 2307356 MimeEntityHeadersEnd 2308328 @@ -411,7 +411,7 @@ Lines 4457 MimeEntityEnd 2655844 MimeMessageEnd 2655844 MboxMarkerBegin 2655846 -MboxMarkerEnd 2655853 +MboxMarkerEnd 2655855 MimeMessageBegin 2655855 MimeEntityBegin 2655855 MimeEntityHeadersEnd 2655994 @@ -454,7 +454,7 @@ Lines 457 MimeEntityEnd 2688506 MimeMessageEnd 2688506 MboxMarkerBegin 2688508 -MboxMarkerEnd 2688515 +MboxMarkerEnd 2688517 MimeMessageBegin 2688517 MimeEntityBegin 2688517 MimeEntityHeadersEnd 2689088 @@ -464,7 +464,7 @@ Lines 783 MimeEntityEnd 2746649 MimeMessageEnd 2746649 MboxMarkerBegin 2746651 -MboxMarkerEnd 2746658 +MboxMarkerEnd 2746660 MimeMessageBegin 2746660 MimeEntityBegin 2746660 MimeEntityHeadersEnd 2747410 @@ -521,7 +521,7 @@ Lines 459 MimeEntityEnd 2779395 MimeMessageEnd 2779395 MboxMarkerBegin 2779397 -MboxMarkerEnd 2779404 +MboxMarkerEnd 2779406 MimeMessageBegin 2779406 MimeEntityBegin 2779406 MimeEntityHeadersEnd 2780075 @@ -592,7 +592,7 @@ Lines 119 MimeEntityEnd 2785076 MimeMessageEnd 2785076 MboxMarkerBegin 2785078 -MboxMarkerEnd 2785085 +MboxMarkerEnd 2785087 MimeMessageBegin 2785087 MimeEntityBegin 2785087 MimeEntityHeadersEnd 2786084 @@ -602,7 +602,7 @@ Lines 33 MimeEntityEnd 2787498 MimeMessageEnd 2787498 MboxMarkerBegin 2787500 -MboxMarkerEnd 2787507 +MboxMarkerEnd 2787509 MimeMessageBegin 2787509 MimeEntityBegin 2787509 MimeEntityHeadersEnd 2787772 @@ -612,7 +612,7 @@ Lines 6 MimeEntityEnd 2788033 MimeMessageEnd 2788033 MboxMarkerBegin 2788035 -MboxMarkerEnd 2788042 +MboxMarkerEnd 2788044 MimeMessageBegin 2788044 MimeEntityBegin 2788044 MimeEntityHeadersEnd 2788716 @@ -622,7 +622,7 @@ Lines 14 MimeEntityEnd 2789453 MimeMessageEnd 2789453 MboxMarkerBegin 2789455 -MboxMarkerEnd 2789462 +MboxMarkerEnd 2789464 MimeMessageBegin 2789464 MimeEntityBegin 2789464 MimeEntityHeadersEnd 2790463 @@ -672,7 +672,7 @@ Lines 6272 MimeEntityEnd 3227750 MimeMessageEnd 3227750 MboxMarkerBegin 3227752 -MboxMarkerEnd 3227759 +MboxMarkerEnd 3227761 MimeMessageBegin 3227761 MimeEntityBegin 3227761 MimeEntityHeadersEnd 3228760 @@ -722,7 +722,7 @@ Lines 6272 MimeEntityEnd 3666046 MimeMessageEnd 3666046 MboxMarkerBegin 3666048 -MboxMarkerEnd 3666055 +MboxMarkerEnd 3666057 MimeMessageBegin 3666057 MimeEntityBegin 3666057 MimeEntityHeadersEnd 3666630 @@ -740,7 +740,7 @@ Lines 17 MimeEntityEnd 3667232 MimeMessageEnd 3667232 MboxMarkerBegin 3667234 -MboxMarkerEnd 3667241 +MboxMarkerEnd 3667243 MimeMessageBegin 3667243 MimeEntityBegin 3667243 MimeEntityHeadersEnd 3667974 @@ -770,7 +770,7 @@ Lines 34 MimeEntityEnd 3669418 MimeMessageEnd 3669418 MboxMarkerBegin 3669420 -MboxMarkerEnd 3669427 +MboxMarkerEnd 3669429 MimeMessageBegin 3669429 MimeEntityBegin 3669429 MimeEntityHeadersEnd 3669982 @@ -808,7 +808,7 @@ Lines 109 MimeEntityEnd 3674811 MimeMessageEnd 3674811 MboxMarkerBegin 3674813 -MboxMarkerEnd 3674820 +MboxMarkerEnd 3674822 MimeMessageBegin 3674822 MimeEntityBegin 3674822 MimeEntityHeadersEnd 3675488 @@ -846,7 +846,7 @@ Lines 34 MimeEntityEnd 3676752 MimeMessageEnd 3676752 MboxMarkerBegin 3676754 -MboxMarkerEnd 3676761 +MboxMarkerEnd 3676763 MimeMessageBegin 3676763 MimeEntityBegin 3676763 MimeEntityHeadersEnd 3677286 @@ -856,7 +856,7 @@ Lines 46 MimeEntityEnd 3678750 MimeMessageEnd 3678750 MboxMarkerBegin 3678752 -MboxMarkerEnd 3678802 +MboxMarkerEnd 3678804 MimeMessageBegin 3678804 MimeEntityBegin 3678804 MimeEntityHeadersEnd 3679391 @@ -866,7 +866,7 @@ Lines 955 MimeEntityEnd 3740046 MimeMessageEnd 3740046 MboxMarkerBegin 3740048 -MboxMarkerEnd 3740098 +MboxMarkerEnd 3740100 MimeMessageBegin 3740100 MimeEntityBegin 3740100 MimeEntityHeadersEnd 3740684 @@ -876,7 +876,7 @@ Lines 961 MimeEntityEnd 3801451 MimeMessageEnd 3801451 MboxMarkerBegin 3801453 -MboxMarkerEnd 3801460 +MboxMarkerEnd 3801462 MimeMessageBegin 3801462 MimeEntityBegin 3801462 MimeEntityHeadersEnd 3802023 @@ -906,7 +906,7 @@ Lines 26 MimeEntityEnd 3802919 MimeMessageEnd 3802919 MboxMarkerBegin 3802921 -MboxMarkerEnd 3802928 +MboxMarkerEnd 3802930 MimeMessageBegin 3802930 MimeEntityBegin 3802930 MimeEntityHeadersEnd 3803695 @@ -916,7 +916,7 @@ Lines 571 MimeEntityEnd 3845795 MimeMessageEnd 3845795 MboxMarkerBegin 3845797 -MboxMarkerEnd 3845804 +MboxMarkerEnd 3845806 MimeMessageBegin 3845806 MimeEntityBegin 3845806 MimeEntityHeadersEnd 3846985 @@ -946,7 +946,7 @@ Lines 140 MimeEntityEnd 3855393 MimeMessageEnd 3855393 MboxMarkerBegin 3855395 -MboxMarkerEnd 3855402 +MboxMarkerEnd 3855404 MimeMessageBegin 3855404 MimeEntityBegin 3855404 MimeEntityHeadersEnd 3856880 @@ -956,7 +956,7 @@ Lines 1571 MimeEntityEnd 3965263 MimeMessageEnd 3965263 MboxMarkerBegin 3965265 -MboxMarkerEnd 3965272 +MboxMarkerEnd 3965274 MimeMessageBegin 3965274 MimeEntityBegin 3965274 MimeEntityHeadersEnd 3965889 @@ -1038,7 +1038,7 @@ Lines 103 MimeEntityEnd 3969308 MimeMessageEnd 3969308 MboxMarkerBegin 3969310 -MboxMarkerEnd 3969317 +MboxMarkerEnd 3969319 MimeMessageBegin 3969319 MimeEntityBegin 3969319 MimeEntityHeadersEnd 3970038 @@ -1103,7 +1103,7 @@ Lines 2211 MimeEntityEnd 4233718 MimeMessageEnd 4233718 MboxMarkerBegin 4233720 -MboxMarkerEnd 4233727 +MboxMarkerEnd 4233729 MimeMessageBegin 4233729 MimeEntityBegin 4233729 MimeEntityHeadersEnd 4234408 @@ -1113,7 +1113,7 @@ Lines 19 MimeEntityEnd 4235418 MimeMessageEnd 4235418 MboxMarkerBegin 4235420 -MboxMarkerEnd 4235427 +MboxMarkerEnd 4235429 MimeMessageBegin 4235429 MimeEntityBegin 4235429 MimeEntityHeadersEnd 4236508 @@ -1170,7 +1170,7 @@ Lines 94 MimeEntityEnd 4239644 MimeMessageEnd 4239644 MboxMarkerBegin 4239646 -MboxMarkerEnd 4239653 +MboxMarkerEnd 4239655 MimeMessageBegin 4239655 MimeEntityBegin 4239655 MimeEntityHeadersEnd 4240341 @@ -1200,7 +1200,7 @@ Lines 89 MimeEntityEnd 4245810 MimeMessageEnd 4245810 MboxMarkerBegin 4245812 -MboxMarkerEnd 4245819 +MboxMarkerEnd 4245821 MimeMessageBegin 4245821 MimeEntityBegin 4245821 MimeEntityHeadersEnd 4246287 @@ -1210,7 +1210,7 @@ Lines 186 MimeEntityEnd 4257886 MimeMessageEnd 4257886 MboxMarkerBegin 4257888 -MboxMarkerEnd 4257895 +MboxMarkerEnd 4257897 MimeMessageBegin 4257897 MimeEntityBegin 4257897 MimeEntityHeadersEnd 4258477 @@ -1321,7 +1321,7 @@ Lines 59 MimeEntityEnd 4259836 MimeMessageEnd 4259836 MboxMarkerBegin 4259838 -MboxMarkerEnd 4259845 +MboxMarkerEnd 4259847 MimeMessageBegin 4259847 MimeEntityBegin 4259847 MimeEntityHeadersEnd 4260427 @@ -1387,7 +1387,7 @@ Lines 96 MimeEntityEnd 4264394 MimeMessageEnd 4264394 MboxMarkerBegin 4264396 -MboxMarkerEnd 4264403 +MboxMarkerEnd 4264405 MimeMessageBegin 4264405 MimeEntityBegin 4264405 MimeEntityHeadersEnd 4264885 @@ -1499,7 +1499,7 @@ Lines 145 MimeEntityEnd 4270786 MimeMessageEnd 4270786 MboxMarkerBegin 4270788 -MboxMarkerEnd 4270795 +MboxMarkerEnd 4270797 MimeMessageBegin 4270797 MimeEntityBegin 4270797 MimeEntityHeadersEnd 4271280 @@ -1611,7 +1611,7 @@ Lines 145 MimeEntityEnd 4277216 MimeMessageEnd 4277216 MboxMarkerBegin 4277218 -MboxMarkerEnd 4277225 +MboxMarkerEnd 4277227 MimeMessageBegin 4277227 MimeEntityBegin 4277227 MimeEntityHeadersEnd 4277931 @@ -1806,7 +1806,7 @@ Lines 428 MimeEntityEnd 4298376 MimeMessageEnd 4298376 MboxMarkerBegin 4298378 -MboxMarkerEnd 4298385 +MboxMarkerEnd 4298387 MimeMessageBegin 4298387 MimeEntityBegin 4298387 MimeEntityHeadersEnd 4299063 @@ -1843,7 +1843,7 @@ Lines 410 MimeEntityEnd 4372265 MimeMessageEnd 4372265 MboxMarkerBegin 4372267 -MboxMarkerEnd 4372274 +MboxMarkerEnd 4372276 MimeMessageBegin 4372276 MimeEntityBegin 4372276 MimeEntityHeadersEnd 4373229 @@ -1853,7 +1853,7 @@ Lines 3431 MimeEntityEnd 4625700 MimeMessageEnd 4625700 MboxMarkerBegin 4625702 -MboxMarkerEnd 4625709 +MboxMarkerEnd 4625711 MimeMessageBegin 4625711 MimeEntityBegin 4625711 MimeEntityHeadersEnd 4626660 @@ -1918,7 +1918,7 @@ Lines 793 MimeEntityEnd 4682261 MimeMessageEnd 4682261 MboxMarkerBegin 4682263 -MboxMarkerEnd 4682270 +MboxMarkerEnd 4682272 MimeMessageBegin 4682272 MimeEntityBegin 4682272 MimeEntityHeadersEnd 4683107 @@ -1948,7 +1948,7 @@ Lines 789 MimeEntityEnd 4731150 MimeMessageEnd 4731150 MboxMarkerBegin 4731152 -MboxMarkerEnd 4731159 +MboxMarkerEnd 4731161 MimeMessageBegin 4731161 MimeEntityBegin 4731161 MimeEntityHeadersEnd 4731922 @@ -2043,7 +2043,7 @@ Lines 639 MimeEntityEnd 4767575 MimeMessageEnd 4767575 MboxMarkerBegin 4767577 -MboxMarkerEnd 4767584 +MboxMarkerEnd 4767586 MimeMessageBegin 4767586 MimeEntityBegin 4767586 MimeEntityHeadersEnd 4767753 @@ -2073,7 +2073,7 @@ Lines 1154 MimeEntityEnd 4845389 MimeMessageEnd 4845389 MboxMarkerBegin 4845391 -MboxMarkerEnd 4845398 +MboxMarkerEnd 4845400 MimeMessageBegin 4845400 MimeEntityBegin 4845400 MimeEntityHeadersEnd 4846638 @@ -2103,7 +2103,7 @@ Lines 2115 MimeEntityEnd 4977202 MimeMessageEnd 4977202 MboxMarkerBegin 4977204 -MboxMarkerEnd 4977211 +MboxMarkerEnd 4977213 MimeMessageBegin 4977213 MimeEntityBegin 4977213 MimeEntityHeadersEnd 4977982 @@ -2188,7 +2188,7 @@ Lines 2440 MimeEntityEnd 5154286 MimeMessageEnd 5154286 MboxMarkerBegin 5154288 -MboxMarkerEnd 5154295 +MboxMarkerEnd 5154297 MimeMessageBegin 5154297 MimeEntityBegin 5154297 MimeEntityHeadersEnd 5154999 @@ -2329,7 +2329,7 @@ Lines 3202 MimeEntityEnd 5373282 MimeMessageEnd 5373282 MboxMarkerBegin 5373284 -MboxMarkerEnd 5373291 +MboxMarkerEnd 5373293 MimeMessageBegin 5373293 MimeEntityBegin 5373293 MimeEntityHeadersEnd 5373698 @@ -2366,7 +2366,7 @@ Lines 1244 MimeEntityEnd 5464350 MimeMessageEnd 5464350 MboxMarkerBegin 5464352 -MboxMarkerEnd 5464359 +MboxMarkerEnd 5464361 MimeMessageBegin 5464361 MimeEntityBegin 5464361 MimeEntityHeadersEnd 5465317 @@ -2376,7 +2376,7 @@ Lines 697 MimeEntityEnd 5516722 MimeMessageEnd 5516722 MboxMarkerBegin 5516724 -MboxMarkerEnd 5516731 +MboxMarkerEnd 5516733 MimeMessageBegin 5516733 MimeEntityBegin 5516733 MimeEntityHeadersEnd 5517362 @@ -3567,7 +3567,7 @@ Lines 1958 MimeEntityEnd 5588100 MimeMessageEnd 5588100 MboxMarkerBegin 5588102 -MboxMarkerEnd 5588109 +MboxMarkerEnd 5588111 MimeMessageBegin 5588111 MimeEntityBegin 5588111 MimeEntityHeadersEnd 5588934 @@ -3577,7 +3577,7 @@ Lines 49 MimeEntityEnd 5590853 MimeMessageEnd 5590853 MboxMarkerBegin 5590855 -MboxMarkerEnd 5590862 +MboxMarkerEnd 5590864 MimeMessageBegin 5590864 MimeEntityBegin 5590864 MimeEntityHeadersEnd 5591607 @@ -3642,7 +3642,7 @@ Lines 2172 MimeEntityEnd 5748407 MimeMessageEnd 5748407 MboxMarkerBegin 5748409 -MboxMarkerEnd 5748416 +MboxMarkerEnd 5748418 MimeMessageBegin 5748418 MimeEntityBegin 5748418 MimeEntityHeadersEnd 5748956 @@ -3652,7 +3652,7 @@ Lines 22 MimeEntityEnd 5749545 MimeMessageEnd 5749545 MboxMarkerBegin 5749547 -MboxMarkerEnd 5749554 +MboxMarkerEnd 5749556 MimeMessageBegin 5749556 MimeEntityBegin 5749556 MimeEntityHeadersEnd 5750765 @@ -3709,7 +3709,7 @@ Lines 838 MimeEntityEnd 5811866 MimeMessageEnd 5811866 MboxMarkerBegin 5811868 -MboxMarkerEnd 5811875 +MboxMarkerEnd 5811877 MimeMessageBegin 5811877 MimeEntityBegin 5811877 MimeEntityHeadersEnd 5812634 @@ -3739,7 +3739,7 @@ Lines 776 MimeEntityEnd 5869132 MimeMessageEnd 5869132 MboxMarkerBegin 5869134 -MboxMarkerEnd 5869165 +MboxMarkerEnd 5869167 MimeMessageBegin 5869167 MimeEntityBegin 5869167 MimeEntityHeadersEnd 5870664 @@ -3749,7 +3749,7 @@ Lines 35 MimeEntityEnd 5872038 MimeMessageEnd 5872038 MboxMarkerBegin 5872040 -MboxMarkerEnd 5872047 +MboxMarkerEnd 5872049 MimeMessageBegin 5872049 MimeEntityBegin 5872049 MimeEntityHeadersEnd 5872857 @@ -3787,7 +3787,7 @@ Lines 505 MimeEntityEnd 5899485 MimeMessageEnd 5899485 MboxMarkerBegin 5899487 -MboxMarkerEnd 5899494 +MboxMarkerEnd 5899496 MimeMessageBegin 5899496 MimeEntityBegin 5899496 MimeEntityHeadersEnd 5900178 @@ -3817,7 +3817,7 @@ Lines 317 MimeEntityEnd 5923009 MimeMessageEnd 5923009 MboxMarkerBegin 5923011 -MboxMarkerEnd 5923042 +MboxMarkerEnd 5923044 MimeMessageBegin 5923044 MimeEntityBegin 5923044 MimeEntityHeadersEnd 5923581 @@ -3854,7 +3854,7 @@ Lines 42 MimeEntityEnd 5925456 MimeMessageEnd 5925456 MboxMarkerBegin 5925458 -MboxMarkerEnd 5925465 +MboxMarkerEnd 5925467 MimeMessageBegin 5925467 MimeEntityBegin 5925467 MimeEntityHeadersEnd 5926279 @@ -3864,7 +3864,7 @@ Lines 3519 MimeEntityEnd 6186575 MimeMessageEnd 6186575 MboxMarkerBegin 6186577 -MboxMarkerEnd 6186584 +MboxMarkerEnd 6186586 MimeMessageBegin 6186586 MimeEntityBegin 6186586 MimeEntityHeadersEnd 6187457 @@ -3894,7 +3894,7 @@ Lines 1297 MimeEntityEnd 6287418 MimeMessageEnd 6287418 MboxMarkerBegin 6287420 -MboxMarkerEnd 6287427 +MboxMarkerEnd 6287429 MimeMessageBegin 6287429 MimeEntityBegin 6287429 MimeEntityHeadersEnd 6288325 @@ -4106,7 +4106,7 @@ Lines 2363 MimeEntityEnd 6373131 MimeMessageEnd 6373131 MboxMarkerBegin 6373133 -MboxMarkerEnd 6373140 +MboxMarkerEnd 6373142 MimeMessageBegin 6373142 MimeEntityBegin 6373142 MimeEntityHeadersEnd 6373961 @@ -4116,7 +4116,7 @@ Lines 227 MimeEntityEnd 6383386 MimeMessageEnd 6383386 MboxMarkerBegin 6383388 -MboxMarkerEnd 6383395 +MboxMarkerEnd 6383397 MimeMessageBegin 6383397 MimeEntityBegin 6383397 MimeEntityHeadersEnd 6384141 @@ -4201,7 +4201,7 @@ Lines 1396 MimeEntityEnd 6477811 MimeMessageEnd 6477811 MboxMarkerBegin 6477813 -MboxMarkerEnd 6477820 +MboxMarkerEnd 6477822 MimeMessageBegin 6477822 MimeEntityBegin 6477822 MimeEntityHeadersEnd 6478593 @@ -4238,7 +4238,7 @@ Lines 501 MimeEntityEnd 6513758 MimeMessageEnd 6513758 MboxMarkerBegin 6513760 -MboxMarkerEnd 6513801 +MboxMarkerEnd 6513803 MimeMessageBegin 6513803 MimeEntityBegin 6513803 MimeEntityHeadersEnd 6513957 @@ -4248,7 +4248,7 @@ Lines 694 MimeEntityEnd 6557679 MimeMessageEnd 6557679 MboxMarkerBegin 6557681 -MboxMarkerEnd 6557712 +MboxMarkerEnd 6557714 MimeMessageBegin 6557714 MimeEntityBegin 6557714 MimeEntityHeadersEnd 6558312 @@ -4298,7 +4298,7 @@ Lines 369 MimeEntityEnd 6583936 MimeMessageEnd 6583936 MboxMarkerBegin 6583938 -MboxMarkerEnd 6583969 +MboxMarkerEnd 6583971 MimeMessageBegin 6583971 MimeEntityBegin 6583971 MimeEntityHeadersEnd 6584388 @@ -4444,7 +4444,7 @@ Lines 113 MimeEntityEnd 6587266 MimeMessageEnd 6587266 MboxMarkerBegin 6587268 -MboxMarkerEnd 6587299 +MboxMarkerEnd 6587301 MimeMessageBegin 6587301 MimeEntityBegin 6587301 MimeEntityHeadersEnd 6587716 @@ -4501,7 +4501,7 @@ Lines 17726 MimeEntityEnd 6955939 MimeMessageEnd 6955939 MboxMarkerBegin 6955941 -MboxMarkerEnd 6955948 +MboxMarkerEnd 6955950 MimeMessageBegin 6955950 MimeEntityBegin 6955950 MimeEntityHeadersEnd 6956567 @@ -4539,7 +4539,7 @@ Lines 43 MimeEntityEnd 6958045 MimeMessageEnd 6958045 MboxMarkerBegin 6958047 -MboxMarkerEnd 6958054 +MboxMarkerEnd 6958056 MimeMessageBegin 6958056 MimeEntityBegin 6958056 MimeEntityHeadersEnd 6958361 @@ -4569,7 +4569,7 @@ Lines 197 MimeEntityEnd 6970685 MimeMessageEnd 6970685 MboxMarkerBegin 6970687 -MboxMarkerEnd 6970694 +MboxMarkerEnd 6970696 MimeMessageBegin 6970696 MimeEntityBegin 6970696 MimeEntityHeadersEnd 6971001 @@ -4599,7 +4599,7 @@ Lines 197 MimeEntityEnd 6983293 MimeMessageEnd 6983293 MboxMarkerBegin 6983295 -MboxMarkerEnd 6983326 +MboxMarkerEnd 6983328 MimeMessageBegin 6983328 MimeEntityBegin 6983328 MimeEntityHeadersEnd 6984857 @@ -4629,7 +4629,7 @@ Lines 140 MimeEntityEnd 6991551 MimeMessageEnd 6991551 MboxMarkerBegin 6991553 -MboxMarkerEnd 6991584 +MboxMarkerEnd 6991586 MimeMessageBegin 6991586 MimeEntityBegin 6991586 MimeEntityHeadersEnd 6992045 @@ -4721,7 +4721,7 @@ Lines 3059 MimeEntityEnd 7209679 MimeMessageEnd 7209679 MboxMarkerBegin 7209681 -MboxMarkerEnd 7209688 +MboxMarkerEnd 7209690 MimeMessageBegin 7209690 MimeEntityBegin 7209690 MimeEntityHeadersEnd 7209994 @@ -4751,7 +4751,7 @@ Lines 188 MimeEntityEnd 7221844 MimeMessageEnd 7221844 MboxMarkerBegin 7221846 -MboxMarkerEnd 7221853 +MboxMarkerEnd 7221855 MimeMessageBegin 7221855 MimeEntityBegin 7221855 MimeEntityHeadersEnd 7222159 @@ -4781,7 +4781,7 @@ Lines 193 MimeEntityEnd 7234277 MimeMessageEnd 7234277 MboxMarkerBegin 7234279 -MboxMarkerEnd 7234286 +MboxMarkerEnd 7234288 MimeMessageBegin 7234288 MimeEntityBegin 7234288 MimeEntityHeadersEnd 7234592 @@ -4811,7 +4811,7 @@ Lines 191 MimeEntityEnd 7246617 MimeMessageEnd 7246617 MboxMarkerBegin 7246619 -MboxMarkerEnd 7246626 +MboxMarkerEnd 7246628 MimeMessageBegin 7246628 MimeEntityBegin 7246628 MimeEntityHeadersEnd 7246932 @@ -4841,7 +4841,7 @@ Lines 196 MimeEntityEnd 7259151 MimeMessageEnd 7259151 MboxMarkerBegin 7259153 -MboxMarkerEnd 7259160 +MboxMarkerEnd 7259162 MimeMessageBegin 7259162 MimeEntityBegin 7259162 MimeEntityHeadersEnd 7259466 @@ -4871,7 +4871,7 @@ Lines 191 MimeEntityEnd 7271535 MimeMessageEnd 7271535 MboxMarkerBegin 7271537 -MboxMarkerEnd 7271544 +MboxMarkerEnd 7271546 MimeMessageBegin 7271546 MimeEntityBegin 7271546 MimeEntityHeadersEnd 7271850 @@ -4901,7 +4901,7 @@ Lines 196 MimeEntityEnd 7284139 MimeMessageEnd 7284139 MboxMarkerBegin 7284141 -MboxMarkerEnd 7284172 +MboxMarkerEnd 7284174 MimeMessageBegin 7284174 MimeEntityBegin 7284174 MimeEntityHeadersEnd 7285430 @@ -4979,7 +4979,7 @@ Lines 10286 MimeEntityEnd 8043000 MimeMessageEnd 8043000 MboxMarkerBegin 8043002 -MboxMarkerEnd 8043033 +MboxMarkerEnd 8043035 MimeMessageBegin 8043035 MimeEntityBegin 8043035 MimeEntityHeadersEnd 8044321 @@ -5030,7 +5030,7 @@ Lines 650 MimeEntityEnd 8091598 MimeMessageEnd 8091598 MboxMarkerBegin 8091600 -MboxMarkerEnd 8091607 +MboxMarkerEnd 8091609 MimeMessageBegin 8091609 MimeEntityBegin 8091609 MimeEntityHeadersEnd 8092367 @@ -5040,7 +5040,7 @@ Lines 7475 MimeEntityEnd 8644457 MimeMessageEnd 8644457 MboxMarkerBegin 8644459 -MboxMarkerEnd 8644466 +MboxMarkerEnd 8644468 MimeMessageBegin 8644468 MimeEntityBegin 8644468 MimeEntityHeadersEnd 8645400 @@ -5063,7 +5063,7 @@ Lines 103 MimeEntityEnd 8648081 MimeMessageEnd 8648081 MboxMarkerBegin 8648083 -MboxMarkerEnd 8648114 +MboxMarkerEnd 8648116 MimeMessageBegin 8648116 MimeEntityBegin 8648116 MimeEntityHeadersEnd 8648726 @@ -5093,7 +5093,7 @@ Lines 51 MimeEntityEnd 8650562 MimeMessageEnd 8650562 MboxMarkerBegin 8650564 -MboxMarkerEnd 8650571 +MboxMarkerEnd 8650573 MimeMessageBegin 8650573 MimeEntityBegin 8650573 MimeEntityHeadersEnd 8651756 @@ -5103,7 +5103,7 @@ Lines 40 MimeEntityEnd 8653178 MimeMessageEnd 8653178 MboxMarkerBegin 8653180 -MboxMarkerEnd 8653187 +MboxMarkerEnd 8653189 MimeMessageBegin 8653189 MimeEntityBegin 8653189 MimeEntityHeadersEnd 8653839 @@ -5113,7 +5113,7 @@ Lines 28 MimeEntityEnd 8654840 MimeMessageEnd 8654840 MboxMarkerBegin 8654842 -MboxMarkerEnd 8654849 +MboxMarkerEnd 8654851 MimeMessageBegin 8654851 MimeEntityBegin 8654851 MimeEntityHeadersEnd 8655631 @@ -5200,7 +5200,7 @@ Lines 90 MimeEntityEnd 8658633 MimeMessageEnd 8658633 MboxMarkerBegin 8658635 -MboxMarkerEnd 8658642 +MboxMarkerEnd 8658644 MimeMessageBegin 8658644 MimeEntityBegin 8658644 MimeEntityHeadersEnd 8659476 @@ -5210,7 +5210,7 @@ Lines 43 MimeEntityEnd 8660904 MimeMessageEnd 8660904 MboxMarkerBegin 8660906 -MboxMarkerEnd 8660913 +MboxMarkerEnd 8660915 MimeMessageBegin 8660915 MimeEntityBegin 8660915 MimeEntityHeadersEnd 8661072 @@ -5220,7 +5220,7 @@ Lines 64 MimeEntityEnd 8665806 MimeMessageEnd 8665806 MboxMarkerBegin 8665808 -MboxMarkerEnd 8665815 +MboxMarkerEnd 8665817 MimeMessageBegin 8665817 MimeEntityBegin 8665817 MimeEntityHeadersEnd 8667595 @@ -5375,7 +5375,7 @@ Lines 280 MimeEntityEnd 8679245 MimeMessageEnd 8679245 MboxMarkerBegin 8679247 -MboxMarkerEnd 8679254 +MboxMarkerEnd 8679256 MimeMessageBegin 8679256 MimeEntityBegin 8679256 MimeEntityHeadersEnd 8680000 @@ -5432,7 +5432,7 @@ Lines 178 MimeEntityEnd 8690837 MimeMessageEnd 8690837 MboxMarkerBegin 8690839 -MboxMarkerEnd 8690846 +MboxMarkerEnd 8690848 MimeMessageBegin 8690848 MimeEntityBegin 8690848 MimeEntityHeadersEnd 8691509 @@ -5462,7 +5462,7 @@ Lines 1094 MimeEntityEnd 8771510 MimeMessageEnd 8771510 MboxMarkerBegin 8771512 -MboxMarkerEnd 8771519 +MboxMarkerEnd 8771521 MimeMessageBegin 8771521 MimeEntityBegin 8771521 MimeEntityHeadersEnd 8772294 @@ -5533,7 +5533,7 @@ Lines 2634 MimeEntityEnd 8960196 MimeMessageEnd 8960196 MboxMarkerBegin 8960198 -MboxMarkerEnd 8960205 +MboxMarkerEnd 8960207 MimeMessageBegin 8960207 MimeEntityBegin 8960207 MimeEntityHeadersEnd 8961063 @@ -5543,7 +5543,7 @@ Lines 26 MimeEntityEnd 8962821 MimeMessageEnd 8962821 MboxMarkerBegin 8962823 -MboxMarkerEnd 8962830 +MboxMarkerEnd 8962832 MimeMessageBegin 8962832 MimeEntityBegin 8962832 MimeEntityHeadersEnd 8963476 @@ -5561,7 +5561,7 @@ Lines 38 MimeEntityEnd 8964871 MimeMessageEnd 8964871 MboxMarkerBegin 8964873 -MboxMarkerEnd 8964880 +MboxMarkerEnd 8964882 MimeMessageBegin 8964882 MimeEntityBegin 8964882 MimeEntityHeadersEnd 8965340 @@ -5591,7 +5591,7 @@ Lines 1262 MimeEntityEnd 9057985 MimeMessageEnd 9057985 MboxMarkerBegin 9057987 -MboxMarkerEnd 9057994 +MboxMarkerEnd 9057996 MimeMessageBegin 9057996 MimeEntityBegin 9057996 MimeEntityHeadersEnd 9058498 @@ -5601,7 +5601,7 @@ Lines 28 MimeEntityEnd 9059667 MimeMessageEnd 9059667 MboxMarkerBegin 9059669 -MboxMarkerEnd 9059676 +MboxMarkerEnd 9059678 MimeMessageBegin 9059678 MimeEntityBegin 9059678 MimeEntityHeadersEnd 9060843 @@ -5659,7 +5659,7 @@ Lines 1971 MimeEntityEnd 9156930 MimeMessageEnd 9156930 MboxMarkerBegin 9156932 -MboxMarkerEnd 9156963 +MboxMarkerEnd 9156965 MimeMessageBegin 9156965 MimeEntityBegin 9156965 MimeEntityHeadersEnd 9158136 @@ -5689,7 +5689,7 @@ Lines 42 MimeEntityEnd 9159961 MimeMessageEnd 9159961 MboxMarkerBegin 9159963 -MboxMarkerEnd 9159994 +MboxMarkerEnd 9159996 MimeMessageBegin 9159996 MimeEntityBegin 9159996 MimeEntityHeadersEnd 9161157 @@ -5719,7 +5719,7 @@ Lines 60 MimeEntityEnd 9164625 MimeMessageEnd 9164625 MboxMarkerBegin 9164627 -MboxMarkerEnd 9164658 +MboxMarkerEnd 9164660 MimeMessageBegin 9164660 MimeEntityBegin 9164660 MimeEntityHeadersEnd 9165820 @@ -5749,7 +5749,7 @@ Lines 97 MimeEntityEnd 9171770 MimeMessageEnd 9171770 MboxMarkerBegin 9171772 -MboxMarkerEnd 9171779 +MboxMarkerEnd 9171781 MimeMessageBegin 9171781 MimeEntityBegin 9171781 MimeEntityHeadersEnd 9171996 @@ -5759,7 +5759,7 @@ Lines 58 MimeEntityEnd 9176246 MimeMessageEnd 9176246 MboxMarkerBegin 9176248 -MboxMarkerEnd 9176279 +MboxMarkerEnd 9176281 MimeMessageBegin 9176281 MimeEntityBegin 9176281 MimeEntityHeadersEnd 9177199 @@ -5789,7 +5789,7 @@ Lines 225 MimeEntityEnd 9193172 MimeMessageEnd 9193172 MboxMarkerBegin 9193174 -MboxMarkerEnd 9193205 +MboxMarkerEnd 9193207 MimeMessageBegin 9193207 MimeEntityBegin 9193207 MimeEntityHeadersEnd 9194031 @@ -5799,7 +5799,7 @@ Lines 258 MimeEntityEnd 9211049 MimeMessageEnd 9211049 MboxMarkerBegin 9211051 -MboxMarkerEnd 9211082 +MboxMarkerEnd 9211084 MimeMessageBegin 9211084 MimeEntityBegin 9211084 MimeEntityHeadersEnd 9211913 @@ -5809,7 +5809,7 @@ Lines 385 MimeEntityEnd 9237261 MimeMessageEnd 9237261 MboxMarkerBegin 9237263 -MboxMarkerEnd 9237294 +MboxMarkerEnd 9237296 MimeMessageBegin 9237296 MimeEntityBegin 9237296 MimeEntityHeadersEnd 9238125 @@ -5819,7 +5819,7 @@ Lines 556 MimeEntityEnd 9274811 MimeMessageEnd 9274811 MboxMarkerBegin 9274813 -MboxMarkerEnd 9274844 +MboxMarkerEnd 9274846 MimeMessageBegin 9274846 MimeEntityBegin 9274846 MimeEntityHeadersEnd 9275678 @@ -5829,7 +5829,7 @@ Lines 790 MimeEntityEnd 9327768 MimeMessageEnd 9327768 MboxMarkerBegin 9327770 -MboxMarkerEnd 9327801 +MboxMarkerEnd 9327803 MimeMessageBegin 9327803 MimeEntityBegin 9327803 MimeEntityHeadersEnd 9329218 @@ -5839,7 +5839,7 @@ Lines 20 MimeEntityEnd 9330668 MimeMessageEnd 9330668 MboxMarkerBegin 9330670 -MboxMarkerEnd 9330701 +MboxMarkerEnd 9330703 MimeMessageBegin 9330703 MimeEntityBegin 9330703 MimeEntityHeadersEnd 9332080 @@ -5869,7 +5869,7 @@ Lines 70 MimeEntityEnd 9336541 MimeMessageEnd 9336541 MboxMarkerBegin 9336543 -MboxMarkerEnd 9336574 +MboxMarkerEnd 9336576 MimeMessageBegin 9336576 MimeEntityBegin 9336576 MimeEntityHeadersEnd 9337807 @@ -5879,7 +5879,7 @@ Lines 56 MimeEntityEnd 9341357 MimeMessageEnd 9341357 MboxMarkerBegin 9341359 -MboxMarkerEnd 9341390 +MboxMarkerEnd 9341392 MimeMessageBegin 9341392 MimeEntityBegin 9341392 MimeEntityHeadersEnd 9342490 @@ -5889,7 +5889,7 @@ Lines 10 MimeEntityEnd 9343160 MimeMessageEnd 9343160 MboxMarkerBegin 9343162 -MboxMarkerEnd 9343169 +MboxMarkerEnd 9343171 MimeMessageBegin 9343171 MimeEntityBegin 9343171 MimeEntityHeadersEnd 9343574 @@ -5899,7 +5899,7 @@ Lines 105 MimeEntityEnd 9351298 MimeMessageEnd 9351298 MboxMarkerBegin 9351300 -MboxMarkerEnd 9351331 +MboxMarkerEnd 9351333 MimeMessageBegin 9351333 MimeEntityBegin 9351333 MimeEntityHeadersEnd 9352135 @@ -5917,7 +5917,7 @@ Lines 44 MimeEntityEnd 9354990 MimeMessageEnd 9354990 MboxMarkerBegin 9354992 -MboxMarkerEnd 9355023 +MboxMarkerEnd 9355025 MimeMessageBegin 9355025 MimeEntityBegin 9355025 MimeEntityHeadersEnd 9355752 @@ -5955,7 +5955,7 @@ Lines 59 MimeEntityEnd 9358998 MimeMessageEnd 9358998 MboxMarkerBegin 9359000 -MboxMarkerEnd 9359031 +MboxMarkerEnd 9359033 MimeMessageBegin 9359033 MimeEntityBegin 9359033 MimeEntityHeadersEnd 9359714 @@ -5985,7 +5985,7 @@ Lines 92 MimeEntityEnd 9365816 MimeMessageEnd 9365816 MboxMarkerBegin 9365818 -MboxMarkerEnd 9365849 +MboxMarkerEnd 9365851 MimeMessageBegin 9365851 MimeEntityBegin 9365851 MimeEntityHeadersEnd 9366934 @@ -5995,7 +5995,7 @@ Lines 141 MimeEntityEnd 9377310 MimeMessageEnd 9377310 MboxMarkerBegin 9377312 -MboxMarkerEnd 9377343 +MboxMarkerEnd 9377345 MimeMessageBegin 9377345 MimeEntityBegin 9377345 MimeEntityHeadersEnd 9378745 @@ -6025,7 +6025,7 @@ Lines 55 MimeEntityEnd 9381612 MimeMessageEnd 9381612 MboxMarkerBegin 9381614 -MboxMarkerEnd 9381645 +MboxMarkerEnd 9381647 MimeMessageBegin 9381647 MimeEntityBegin 9381647 MimeEntityHeadersEnd 9382210 @@ -6035,7 +6035,7 @@ Lines 8 MimeEntityEnd 9382740 MimeMessageEnd 9382740 MboxMarkerBegin 9382742 -MboxMarkerEnd 9382749 +MboxMarkerEnd 9382751 MimeMessageBegin 9382751 MimeEntityBegin 9382751 MimeEntityHeadersEnd 9384087 @@ -6058,7 +6058,7 @@ Lines 24 MimeEntityEnd 9385042 MimeMessageEnd 9385042 MboxMarkerBegin 9385044 -MboxMarkerEnd 9385051 +MboxMarkerEnd 9385053 MimeMessageBegin 9385053 MimeEntityBegin 9385053 MimeEntityHeadersEnd 9386420 @@ -6130,7 +6130,7 @@ Lines 170 MimeEntityEnd 9395402 MimeMessageEnd 9395402 MboxMarkerBegin 9395404 -MboxMarkerEnd 9395435 +MboxMarkerEnd 9395437 MimeMessageBegin 9395437 MimeEntityBegin 9395437 MimeEntityHeadersEnd 9396672 @@ -6140,7 +6140,7 @@ Lines 39 MimeEntityEnd 9399592 MimeMessageEnd 9399592 MboxMarkerBegin 9399594 -MboxMarkerEnd 9399625 +MboxMarkerEnd 9399627 MimeMessageBegin 9399627 MimeEntityBegin 9399627 MimeEntityHeadersEnd 9400806 @@ -6150,7 +6150,7 @@ Lines 31 MimeEntityEnd 9402958 MimeMessageEnd 9402958 MboxMarkerBegin 9402960 -MboxMarkerEnd 9402991 +MboxMarkerEnd 9402993 MimeMessageBegin 9402993 MimeEntityBegin 9402993 MimeEntityHeadersEnd 9404092 @@ -6180,7 +6180,7 @@ Lines 54 MimeEntityEnd 9407102 MimeMessageEnd 9407102 MboxMarkerBegin 9407104 -MboxMarkerEnd 9407135 +MboxMarkerEnd 9407137 MimeMessageBegin 9407137 MimeEntityBegin 9407137 MimeEntityHeadersEnd 9408193 @@ -6217,7 +6217,7 @@ Lines 73 MimeEntityEnd 9411145 MimeMessageEnd 9411145 MboxMarkerBegin 9411147 -MboxMarkerEnd 9411178 +MboxMarkerEnd 9411180 MimeMessageBegin 9411180 MimeEntityBegin 9411180 MimeEntityHeadersEnd 9412276 @@ -6247,7 +6247,7 @@ Lines 76 MimeEntityEnd 9416879 MimeMessageEnd 9416879 MboxMarkerBegin 9416881 -MboxMarkerEnd 9416888 +MboxMarkerEnd 9416890 MimeMessageBegin 9416890 MimeEntityBegin 9416890 MimeEntityHeadersEnd 9417456 @@ -6277,7 +6277,7 @@ Lines 69 MimeEntityEnd 9421944 MimeMessageEnd 9421944 MboxMarkerBegin 9421946 -MboxMarkerEnd 9421977 +MboxMarkerEnd 9421979 MimeMessageBegin 9421979 MimeEntityBegin 9421979 MimeEntityHeadersEnd 9423163 @@ -6307,7 +6307,7 @@ Lines 67 MimeEntityEnd 9427294 MimeMessageEnd 9427294 MboxMarkerBegin 9427296 -MboxMarkerEnd 9427327 +MboxMarkerEnd 9427329 MimeMessageBegin 9427329 MimeEntityBegin 9427329 MimeEntityHeadersEnd 9428452 @@ -6337,7 +6337,7 @@ Lines 73 MimeEntityEnd 9432575 MimeMessageEnd 9432575 MboxMarkerBegin 9432577 -MboxMarkerEnd 9432608 +MboxMarkerEnd 9432610 MimeMessageBegin 9432610 MimeEntityBegin 9432610 MimeEntityHeadersEnd 9433755 @@ -6375,7 +6375,7 @@ Lines 35 MimeEntityEnd 9435052 MimeMessageEnd 9435052 MboxMarkerBegin 9435054 -MboxMarkerEnd 9435099 +MboxMarkerEnd 9435101 MimeMessageBegin 9435101 MimeEntityBegin 9435101 MimeEntityHeadersEnd 9435272 @@ -6385,7 +6385,7 @@ Lines 593 MimeEntityEnd 9470358 MimeMessageEnd 9470358 MboxMarkerBegin 9470360 -MboxMarkerEnd 9470405 +MboxMarkerEnd 9470407 MimeMessageBegin 9470407 MimeEntityBegin 9470407 MimeEntityHeadersEnd 9470571 @@ -6395,7 +6395,7 @@ Lines 593 MimeEntityEnd 9505657 MimeMessageEnd 9505657 MboxMarkerBegin 9505659 -MboxMarkerEnd 9505666 +MboxMarkerEnd 9505668 MimeMessageBegin 9505668 MimeEntityBegin 9505668 MimeEntityHeadersEnd 9506276 @@ -6405,7 +6405,7 @@ Lines 39 MimeEntityEnd 9507714 MimeMessageEnd 9507714 MboxMarkerBegin 9507716 -MboxMarkerEnd 9507723 +MboxMarkerEnd 9507725 MimeMessageBegin 9507725 MimeEntityBegin 9507725 MimeEntityHeadersEnd 9508642 @@ -6435,7 +6435,7 @@ Lines 3983 MimeEntityEnd 9754778 MimeMessageEnd 9754778 MboxMarkerBegin 9754780 -MboxMarkerEnd 9754787 +MboxMarkerEnd 9754789 MimeMessageBegin 9754789 MimeEntityBegin 9754789 MimeEntityHeadersEnd 9755397 @@ -6458,7 +6458,7 @@ Lines 417 MimeEntityEnd 9834353 MimeMessageEnd 9834353 MboxMarkerBegin 9834355 -MboxMarkerEnd 9834362 +MboxMarkerEnd 9834364 MimeMessageBegin 9834364 MimeEntityBegin 9834364 MimeEntityHeadersEnd 9834521 @@ -6468,7 +6468,7 @@ Lines 49 MimeEntityEnd 9838129 MimeMessageEnd 9838129 MboxMarkerBegin 9838131 -MboxMarkerEnd 9838138 +MboxMarkerEnd 9838140 MimeMessageBegin 9838140 MimeEntityBegin 9838140 MimeEntityHeadersEnd 9838928 @@ -6553,7 +6553,7 @@ Lines 480 MimeEntityEnd 9869675 MimeMessageEnd 9869675 MboxMarkerBegin 9869677 -MboxMarkerEnd 9869684 +MboxMarkerEnd 9869686 MimeMessageBegin 9869686 MimeEntityBegin 9869686 MimeEntityHeadersEnd 9869745 @@ -6563,7 +6563,7 @@ Lines 28 MimeEntityEnd 9870980 MimeMessageEnd 9870980 MboxMarkerBegin 9870982 -MboxMarkerEnd 9871013 +MboxMarkerEnd 9871015 MimeMessageBegin 9871015 MimeEntityBegin 9871015 MimeEntityHeadersEnd 9871171 @@ -6573,7 +6573,7 @@ Lines 68 MimeEntityEnd 9874346 MimeMessageEnd 9874346 MboxMarkerBegin 9874348 -MboxMarkerEnd 9874379 +MboxMarkerEnd 9874381 MimeMessageBegin 9874381 MimeEntityBegin 9874381 MimeEntityHeadersEnd 9876277 @@ -6603,7 +6603,7 @@ Lines 93 MimeEntityEnd 9881248 MimeMessageEnd 9881248 MboxMarkerBegin 9881250 -MboxMarkerEnd 9881257 +MboxMarkerEnd 9881259 MimeMessageBegin 9881259 MimeEntityBegin 9881259 MimeEntityHeadersEnd 9881826 @@ -6633,7 +6633,7 @@ Lines 1618 MimeEntityEnd 10000273 MimeMessageEnd 10000273 MboxMarkerBegin 10000275 -MboxMarkerEnd 10000282 +MboxMarkerEnd 10000284 MimeMessageBegin 10000284 MimeEntityBegin 10000284 MimeEntityHeadersEnd 10001099 @@ -6748,7 +6748,7 @@ Lines 838 MimeEntityEnd 10026556 MimeMessageEnd 10026556 MboxMarkerBegin 10026558 -MboxMarkerEnd 10026565 +MboxMarkerEnd 10026567 MimeMessageBegin 10026567 MimeEntityBegin 10026567 MimeEntityHeadersEnd 10027702 @@ -6785,7 +6785,7 @@ Lines 441 MimeEntityEnd 10058732 MimeMessageEnd 10058732 MboxMarkerBegin 10058734 -MboxMarkerEnd 10058741 +MboxMarkerEnd 10058743 MimeMessageBegin 10058743 MimeEntityBegin 10058743 MimeEntityHeadersEnd 10060481 @@ -6795,7 +6795,7 @@ Lines 2952 MimeEntityEnd 10246231 MimeMessageEnd 10246231 MboxMarkerBegin 10246233 -MboxMarkerEnd 10246240 +MboxMarkerEnd 10246242 MimeMessageBegin 10246242 MimeEntityBegin 10246242 MimeEntityHeadersEnd 10246965 @@ -6832,7 +6832,7 @@ Lines 456 MimeEntityEnd 10331708 MimeMessageEnd 10331708 MboxMarkerBegin 10331710 -MboxMarkerEnd 10331717 +MboxMarkerEnd 10331719 MimeMessageBegin 10331719 MimeEntityBegin 10331719 MimeEntityHeadersEnd 10332401 @@ -6897,7 +6897,7 @@ Lines 2197 MimeEntityEnd 10554623 MimeMessageEnd 10554623 MboxMarkerBegin 10554625 -MboxMarkerEnd 10554632 +MboxMarkerEnd 10554634 MimeMessageBegin 10554634 MimeEntityBegin 10554634 MimeEntityHeadersEnd 10554906 @@ -6907,7 +6907,7 @@ Lines 1023 MimeEntityEnd 10630586 MimeMessageEnd 10630586 MboxMarkerBegin 10630588 -MboxMarkerEnd 10630595 +MboxMarkerEnd 10630597 MimeMessageBegin 10630597 MimeEntityBegin 10630597 MimeEntityHeadersEnd 10631896 @@ -6971,7 +6971,7 @@ Lines 788 MimeEntityEnd 10687748 MimeMessageEnd 10687748 MboxMarkerBegin 10687750 -MboxMarkerEnd 10687757 +MboxMarkerEnd 10687759 MimeMessageBegin 10687759 MimeEntityBegin 10687759 MimeEntityHeadersEnd 10687916 @@ -6981,7 +6981,7 @@ Lines 68 MimeEntityEnd 10692786 MimeMessageEnd 10692786 MboxMarkerBegin 10692788 -MboxMarkerEnd 10692795 +MboxMarkerEnd 10692797 MimeMessageBegin 10692797 MimeEntityBegin 10692797 MimeEntityHeadersEnd 10693559 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt index 48935a027f..2efb52995d 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -1,5 +1,5 @@ MboxMarkerBegin 0 -MboxMarkerEnd 7 +MboxMarkerEnd 8 MimeMessageBegin 8 MimeEntityBegin 8 MimeEntityHeadersEnd 517 @@ -90,7 +90,7 @@ Lines 4536 MimeEntityEnd 177075 MimeMessageEnd 177075 MboxMarkerBegin 177076 -MboxMarkerEnd 177083 +MboxMarkerEnd 177084 MimeMessageBegin 177084 MimeEntityBegin 177084 MimeEntityHeadersEnd 177633 @@ -100,7 +100,7 @@ Lines 1855 MimeEntityEnd 312903 MimeMessageEnd 312903 MboxMarkerBegin 312904 -MboxMarkerEnd 312911 +MboxMarkerEnd 312912 MimeMessageBegin 312912 MimeEntityBegin 312912 MimeEntityHeadersEnd 313291 @@ -110,7 +110,7 @@ Lines 4 MimeEntityEnd 313492 MimeMessageEnd 313492 MboxMarkerBegin 313493 -MboxMarkerEnd 313500 +MboxMarkerEnd 313501 MimeMessageBegin 313501 MimeEntityBegin 313501 MimeEntityHeadersEnd 314147 @@ -167,7 +167,7 @@ Lines 106 MimeEntityEnd 319811 MimeMessageEnd 319811 MboxMarkerBegin 319812 -MboxMarkerEnd 319819 +MboxMarkerEnd 319820 MimeMessageBegin 319820 MimeEntityBegin 319820 MimeEntityHeadersEnd 320568 @@ -235,7 +235,7 @@ Lines 360 MimeEntityEnd 343841 MimeMessageEnd 343841 MboxMarkerBegin 343842 -MboxMarkerEnd 343849 +MboxMarkerEnd 343850 MimeMessageBegin 343850 MimeEntityBegin 343850 MimeEntityHeadersEnd 344568 @@ -334,7 +334,7 @@ Lines 23546 MimeEntityEnd 2108724 MimeMessageEnd 2108724 MboxMarkerBegin 2108725 -MboxMarkerEnd 2108732 +MboxMarkerEnd 2108733 MimeMessageBegin 2108733 MimeEntityBegin 2108733 MimeEntityHeadersEnd 2109749 @@ -344,7 +344,7 @@ Lines 40 MimeEntityEnd 2110874 MimeMessageEnd 2110874 MboxMarkerBegin 2110875 -MboxMarkerEnd 2110882 +MboxMarkerEnd 2110883 MimeMessageBegin 2110883 MimeEntityBegin 2110883 MimeEntityHeadersEnd 2111121 @@ -401,7 +401,7 @@ Lines 1050 MimeEntityEnd 2275728 MimeMessageEnd 2275728 MboxMarkerBegin 2275729 -MboxMarkerEnd 2275736 +MboxMarkerEnd 2275737 MimeMessageBegin 2275737 MimeEntityBegin 2275737 MimeEntityHeadersEnd 2276689 @@ -411,7 +411,7 @@ Lines 4457 MimeEntityEnd 2619749 MimeMessageEnd 2619749 MboxMarkerBegin 2619750 -MboxMarkerEnd 2619757 +MboxMarkerEnd 2619758 MimeMessageBegin 2619758 MimeEntityBegin 2619758 MimeEntityHeadersEnd 2619892 @@ -454,7 +454,7 @@ Lines 457 MimeEntityEnd 2651948 MimeMessageEnd 2651948 MboxMarkerBegin 2651949 -MboxMarkerEnd 2651956 +MboxMarkerEnd 2651957 MimeMessageBegin 2651957 MimeEntityBegin 2651957 MimeEntityHeadersEnd 2652514 @@ -464,7 +464,7 @@ Lines 783 MimeEntityEnd 2709293 MimeMessageEnd 2709293 MboxMarkerBegin 2709294 -MboxMarkerEnd 2709301 +MboxMarkerEnd 2709302 MimeMessageBegin 2709302 MimeEntityBegin 2709302 MimeEntityHeadersEnd 2710035 @@ -521,7 +521,7 @@ Lines 459 MimeEntityEnd 2741562 MimeMessageEnd 2741562 MboxMarkerBegin 2741563 -MboxMarkerEnd 2741570 +MboxMarkerEnd 2741571 MimeMessageBegin 2741571 MimeEntityBegin 2741571 MimeEntityHeadersEnd 2742224 @@ -592,7 +592,7 @@ Lines 119 MimeEntityEnd 2747107 MimeMessageEnd 2747107 MboxMarkerBegin 2747108 -MboxMarkerEnd 2747115 +MboxMarkerEnd 2747116 MimeMessageBegin 2747116 MimeEntityBegin 2747116 MimeEntityHeadersEnd 2748092 @@ -602,7 +602,7 @@ Lines 33 MimeEntityEnd 2749474 MimeMessageEnd 2749474 MboxMarkerBegin 2749475 -MboxMarkerEnd 2749482 +MboxMarkerEnd 2749483 MimeMessageBegin 2749483 MimeEntityBegin 2749483 MimeEntityHeadersEnd 2749739 @@ -612,7 +612,7 @@ Lines 6 MimeEntityEnd 2749995 MimeMessageEnd 2749995 MboxMarkerBegin 2749996 -MboxMarkerEnd 2750003 +MboxMarkerEnd 2750004 MimeMessageBegin 2750004 MimeEntityBegin 2750004 MimeEntityHeadersEnd 2750661 @@ -622,7 +622,7 @@ Lines 14 MimeEntityEnd 2751385 MimeMessageEnd 2751385 MboxMarkerBegin 2751386 -MboxMarkerEnd 2751393 +MboxMarkerEnd 2751394 MimeMessageBegin 2751394 MimeEntityBegin 2751394 MimeEntityHeadersEnd 2752379 @@ -672,7 +672,7 @@ Lines 6272 MimeEntityEnd 3183395 MimeMessageEnd 3183395 MboxMarkerBegin 3183396 -MboxMarkerEnd 3183403 +MboxMarkerEnd 3183404 MimeMessageBegin 3183404 MimeEntityBegin 3183404 MimeEntityHeadersEnd 3184389 @@ -722,7 +722,7 @@ Lines 6272 MimeEntityEnd 3615404 MimeMessageEnd 3615404 MboxMarkerBegin 3615405 -MboxMarkerEnd 3615412 +MboxMarkerEnd 3615413 MimeMessageBegin 3615413 MimeEntityBegin 3615413 MimeEntityHeadersEnd 3615971 @@ -740,7 +740,7 @@ Lines 17 MimeEntityEnd 3616557 MimeMessageEnd 3616557 MboxMarkerBegin 3616558 -MboxMarkerEnd 3616565 +MboxMarkerEnd 3616566 MimeMessageBegin 3616566 MimeEntityBegin 3616566 MimeEntityHeadersEnd 3617279 @@ -770,7 +770,7 @@ Lines 34 MimeEntityEnd 3618690 MimeMessageEnd 3618690 MboxMarkerBegin 3618691 -MboxMarkerEnd 3618698 +MboxMarkerEnd 3618699 MimeMessageBegin 3618699 MimeEntityBegin 3618699 MimeEntityHeadersEnd 3619238 @@ -808,7 +808,7 @@ Lines 109 MimeEntityEnd 3623959 MimeMessageEnd 3623959 MboxMarkerBegin 3623960 -MboxMarkerEnd 3623967 +MboxMarkerEnd 3623968 MimeMessageBegin 3623968 MimeEntityBegin 3623968 MimeEntityHeadersEnd 3624617 @@ -846,7 +846,7 @@ Lines 34 MimeEntityEnd 3625848 MimeMessageEnd 3625848 MboxMarkerBegin 3625849 -MboxMarkerEnd 3625856 +MboxMarkerEnd 3625857 MimeMessageBegin 3625857 MimeEntityBegin 3625857 MimeEntityHeadersEnd 3626367 @@ -856,7 +856,7 @@ Lines 46 MimeEntityEnd 3627786 MimeMessageEnd 3627786 MboxMarkerBegin 3627787 -MboxMarkerEnd 3627837 +MboxMarkerEnd 3627838 MimeMessageBegin 3627838 MimeEntityBegin 3627838 MimeEntityHeadersEnd 3628410 @@ -866,7 +866,7 @@ Lines 955 MimeEntityEnd 3688111 MimeMessageEnd 3688111 MboxMarkerBegin 3688112 -MboxMarkerEnd 3688162 +MboxMarkerEnd 3688163 MimeMessageBegin 3688163 MimeEntityBegin 3688163 MimeEntityHeadersEnd 3688732 @@ -876,7 +876,7 @@ Lines 961 MimeEntityEnd 3748539 MimeMessageEnd 3748539 MboxMarkerBegin 3748540 -MboxMarkerEnd 3748547 +MboxMarkerEnd 3748548 MimeMessageBegin 3748548 MimeEntityBegin 3748548 MimeEntityHeadersEnd 3749096 @@ -906,7 +906,7 @@ Lines 26 MimeEntityEnd 3749967 MimeMessageEnd 3749967 MboxMarkerBegin 3749968 -MboxMarkerEnd 3749975 +MboxMarkerEnd 3749976 MimeMessageBegin 3749976 MimeEntityBegin 3749976 MimeEntityHeadersEnd 3750723 @@ -916,7 +916,7 @@ Lines 571 MimeEntityEnd 3792253 MimeMessageEnd 3792253 MboxMarkerBegin 3792254 -MboxMarkerEnd 3792261 +MboxMarkerEnd 3792262 MimeMessageBegin 3792262 MimeEntityBegin 3792262 MimeEntityHeadersEnd 3793416 @@ -946,7 +946,7 @@ Lines 140 MimeEntityEnd 3801685 MimeMessageEnd 3801685 MboxMarkerBegin 3801686 -MboxMarkerEnd 3801693 +MboxMarkerEnd 3801694 MimeMessageBegin 3801694 MimeEntityBegin 3801694 MimeEntityHeadersEnd 3803142 @@ -956,7 +956,7 @@ Lines 1571 MimeEntityEnd 3909955 MimeMessageEnd 3909955 MboxMarkerBegin 3909956 -MboxMarkerEnd 3909963 +MboxMarkerEnd 3909964 MimeMessageBegin 3909964 MimeEntityBegin 3909964 MimeEntityHeadersEnd 3910563 @@ -1038,7 +1038,7 @@ Lines 103 MimeEntityEnd 3913880 MimeMessageEnd 3913880 MboxMarkerBegin 3913881 -MboxMarkerEnd 3913888 +MboxMarkerEnd 3913889 MimeMessageBegin 3913889 MimeEntityBegin 3913889 MimeEntityHeadersEnd 3914592 @@ -1103,7 +1103,7 @@ Lines 2211 MimeEntityEnd 4176062 MimeMessageEnd 4176062 MboxMarkerBegin 4176063 -MboxMarkerEnd 4176070 +MboxMarkerEnd 4176071 MimeMessageBegin 4176071 MimeEntityBegin 4176071 MimeEntityHeadersEnd 4176736 @@ -1113,7 +1113,7 @@ Lines 19 MimeEntityEnd 4177728 MimeMessageEnd 4177728 MboxMarkerBegin 4177729 -MboxMarkerEnd 4177736 +MboxMarkerEnd 4177737 MimeMessageBegin 4177737 MimeEntityBegin 4177737 MimeEntityHeadersEnd 4178793 @@ -1170,7 +1170,7 @@ Lines 94 MimeEntityEnd 4181836 MimeMessageEnd 4181836 MboxMarkerBegin 4181837 -MboxMarkerEnd 4181844 +MboxMarkerEnd 4181845 MimeMessageBegin 4181845 MimeEntityBegin 4181845 MimeEntityHeadersEnd 4182515 @@ -1200,7 +1200,7 @@ Lines 89 MimeEntityEnd 4187896 MimeMessageEnd 4187896 MboxMarkerBegin 4187897 -MboxMarkerEnd 4187904 +MboxMarkerEnd 4187905 MimeMessageBegin 4187905 MimeEntityBegin 4187905 MimeEntityHeadersEnd 4188357 @@ -1210,7 +1210,7 @@ Lines 186 MimeEntityEnd 4199771 MimeMessageEnd 4199771 MboxMarkerBegin 4199772 -MboxMarkerEnd 4199779 +MboxMarkerEnd 4199780 MimeMessageBegin 4199780 MimeEntityBegin 4199780 MimeEntityHeadersEnd 4200345 @@ -1321,7 +1321,7 @@ Lines 59 MimeEntityEnd 4201646 MimeMessageEnd 4201646 MboxMarkerBegin 4201647 -MboxMarkerEnd 4201654 +MboxMarkerEnd 4201655 MimeMessageBegin 4201655 MimeEntityBegin 4201655 MimeEntityHeadersEnd 4202220 @@ -1387,7 +1387,7 @@ Lines 96 MimeEntityEnd 4206092 MimeMessageEnd 4206092 MboxMarkerBegin 4206093 -MboxMarkerEnd 4206100 +MboxMarkerEnd 4206101 MimeMessageBegin 4206101 MimeEntityBegin 4206101 MimeEntityHeadersEnd 4206569 @@ -1499,7 +1499,7 @@ Lines 145 MimeEntityEnd 4212326 MimeMessageEnd 4212326 MboxMarkerBegin 4212327 -MboxMarkerEnd 4212334 +MboxMarkerEnd 4212335 MimeMessageBegin 4212335 MimeEntityBegin 4212335 MimeEntityHeadersEnd 4212806 @@ -1611,7 +1611,7 @@ Lines 145 MimeEntityEnd 4218598 MimeMessageEnd 4218598 MboxMarkerBegin 4218599 -MboxMarkerEnd 4218606 +MboxMarkerEnd 4218607 MimeMessageBegin 4218607 MimeEntityBegin 4218607 MimeEntityHeadersEnd 4219294 @@ -1806,7 +1806,7 @@ Lines 428 MimeEntityEnd 4239312 MimeMessageEnd 4239312 MboxMarkerBegin 4239313 -MboxMarkerEnd 4239320 +MboxMarkerEnd 4239321 MimeMessageBegin 4239321 MimeEntityBegin 4239321 MimeEntityHeadersEnd 4239982 @@ -1843,7 +1843,7 @@ Lines 410 MimeEntityEnd 4312775 MimeMessageEnd 4312775 MboxMarkerBegin 4312776 -MboxMarkerEnd 4312783 +MboxMarkerEnd 4312784 MimeMessageBegin 4312784 MimeEntityBegin 4312784 MimeEntityHeadersEnd 4313717 @@ -1853,7 +1853,7 @@ Lines 3431 MimeEntityEnd 4562758 MimeMessageEnd 4562758 MboxMarkerBegin 4562759 -MboxMarkerEnd 4562766 +MboxMarkerEnd 4562767 MimeMessageBegin 4562767 MimeEntityBegin 4562767 MimeEntityHeadersEnd 4563695 @@ -1918,7 +1918,7 @@ Lines 793 MimeEntityEnd 4618504 MimeMessageEnd 4618504 MboxMarkerBegin 4618505 -MboxMarkerEnd 4618512 +MboxMarkerEnd 4618513 MimeMessageBegin 4618513 MimeEntityBegin 4618513 MimeEntityHeadersEnd 4619332 @@ -1948,7 +1948,7 @@ Lines 789 MimeEntityEnd 4666587 MimeMessageEnd 4666587 MboxMarkerBegin 4666588 -MboxMarkerEnd 4666595 +MboxMarkerEnd 4666596 MimeMessageBegin 4666596 MimeEntityBegin 4666596 MimeEntityHeadersEnd 4667343 @@ -2043,7 +2043,7 @@ Lines 639 MimeEntityEnd 4702358 MimeMessageEnd 4702358 MboxMarkerBegin 4702359 -MboxMarkerEnd 4702366 +MboxMarkerEnd 4702367 MimeMessageBegin 4702367 MimeEntityBegin 4702367 MimeEntityHeadersEnd 4702528 @@ -2073,7 +2073,7 @@ Lines 1154 MimeEntityEnd 4779011 MimeMessageEnd 4779011 MboxMarkerBegin 4779012 -MboxMarkerEnd 4779019 +MboxMarkerEnd 4779020 MimeMessageBegin 4779020 MimeEntityBegin 4779020 MimeEntityHeadersEnd 4780235 @@ -2103,7 +2103,7 @@ Lines 2115 MimeEntityEnd 4908685 MimeMessageEnd 4908685 MboxMarkerBegin 4908686 -MboxMarkerEnd 4908693 +MboxMarkerEnd 4908694 MimeMessageBegin 4908694 MimeEntityBegin 4908694 MimeEntityHeadersEnd 4909446 @@ -2188,7 +2188,7 @@ Lines 2440 MimeEntityEnd 5083311 MimeMessageEnd 5083311 MboxMarkerBegin 5083312 -MboxMarkerEnd 5083319 +MboxMarkerEnd 5083320 MimeMessageBegin 5083320 MimeEntityBegin 5083320 MimeEntityHeadersEnd 5084006 @@ -2329,7 +2329,7 @@ Lines 3202 MimeEntityEnd 5299088 MimeMessageEnd 5299088 MboxMarkerBegin 5299089 -MboxMarkerEnd 5299096 +MboxMarkerEnd 5299097 MimeMessageBegin 5299097 MimeEntityBegin 5299097 MimeEntityHeadersEnd 5299489 @@ -2366,7 +2366,7 @@ Lines 1244 MimeEntityEnd 5388898 MimeMessageEnd 5388898 MboxMarkerBegin 5388899 -MboxMarkerEnd 5388906 +MboxMarkerEnd 5388907 MimeMessageBegin 5388907 MimeEntityBegin 5388907 MimeEntityHeadersEnd 5389843 @@ -2376,7 +2376,7 @@ Lines 697 MimeEntityEnd 5440552 MimeMessageEnd 5440552 MboxMarkerBegin 5440553 -MboxMarkerEnd 5440560 +MboxMarkerEnd 5440561 MimeMessageBegin 5440561 MimeEntityBegin 5440561 MimeEntityHeadersEnd 5441173 @@ -3567,7 +3567,7 @@ Lines 1958 MimeEntityEnd 5509954 MimeMessageEnd 5509954 MboxMarkerBegin 5509955 -MboxMarkerEnd 5509962 +MboxMarkerEnd 5509963 MimeMessageBegin 5509963 MimeEntityBegin 5509963 MimeEntityHeadersEnd 5510771 @@ -3577,7 +3577,7 @@ Lines 49 MimeEntityEnd 5512642 MimeMessageEnd 5512642 MboxMarkerBegin 5512643 -MboxMarkerEnd 5512650 +MboxMarkerEnd 5512651 MimeMessageBegin 5512651 MimeEntityBegin 5512651 MimeEntityHeadersEnd 5513378 @@ -3642,7 +3642,7 @@ Lines 2172 MimeEntityEnd 5668007 MimeMessageEnd 5668007 MboxMarkerBegin 5668008 -MboxMarkerEnd 5668015 +MboxMarkerEnd 5668016 MimeMessageBegin 5668016 MimeEntityBegin 5668016 MimeEntityHeadersEnd 5668539 @@ -3652,7 +3652,7 @@ Lines 22 MimeEntityEnd 5669107 MimeMessageEnd 5669107 MboxMarkerBegin 5669108 -MboxMarkerEnd 5669115 +MboxMarkerEnd 5669116 MimeMessageBegin 5669116 MimeEntityBegin 5669116 MimeEntityHeadersEnd 5670302 @@ -3709,7 +3709,7 @@ Lines 838 MimeEntityEnd 5730566 MimeMessageEnd 5730566 MboxMarkerBegin 5730567 -MboxMarkerEnd 5730574 +MboxMarkerEnd 5730575 MimeMessageBegin 5730575 MimeEntityBegin 5730575 MimeEntityHeadersEnd 5731315 @@ -3739,7 +3739,7 @@ Lines 776 MimeEntityEnd 5787038 MimeMessageEnd 5787038 MboxMarkerBegin 5787039 -MboxMarkerEnd 5787070 +MboxMarkerEnd 5787071 MimeMessageBegin 5787071 MimeEntityBegin 5787071 MimeEntityHeadersEnd 5788538 @@ -3749,7 +3749,7 @@ Lines 35 MimeEntityEnd 5789878 MimeMessageEnd 5789878 MboxMarkerBegin 5789879 -MboxMarkerEnd 5789886 +MboxMarkerEnd 5789887 MimeMessageBegin 5789887 MimeEntityBegin 5789887 MimeEntityHeadersEnd 5790681 @@ -3787,7 +3787,7 @@ Lines 505 MimeEntityEnd 5816805 MimeMessageEnd 5816805 MboxMarkerBegin 5816806 -MboxMarkerEnd 5816813 +MboxMarkerEnd 5816814 MimeMessageBegin 5816814 MimeEntityBegin 5816814 MimeEntityHeadersEnd 5817482 @@ -3817,7 +3817,7 @@ Lines 317 MimeEntityEnd 5839997 MimeMessageEnd 5839997 MboxMarkerBegin 5839998 -MboxMarkerEnd 5840029 +MboxMarkerEnd 5840030 MimeMessageBegin 5840030 MimeEntityBegin 5840030 MimeEntityHeadersEnd 5840554 @@ -3854,7 +3854,7 @@ Lines 42 MimeEntityEnd 5842388 MimeMessageEnd 5842388 MboxMarkerBegin 5842389 -MboxMarkerEnd 5842396 +MboxMarkerEnd 5842397 MimeMessageBegin 5842397 MimeEntityBegin 5842397 MimeEntityHeadersEnd 5843191 @@ -3864,7 +3864,7 @@ Lines 3519 MimeEntityEnd 6099969 MimeMessageEnd 6099969 MboxMarkerBegin 6099970 -MboxMarkerEnd 6099977 +MboxMarkerEnd 6099978 MimeMessageBegin 6099978 MimeEntityBegin 6099978 MimeEntityHeadersEnd 6100830 @@ -3894,7 +3894,7 @@ Lines 1297 MimeEntityEnd 6199495 MimeMessageEnd 6199495 MboxMarkerBegin 6199496 -MboxMarkerEnd 6199503 +MboxMarkerEnd 6199504 MimeMessageBegin 6199504 MimeEntityBegin 6199504 MimeEntityHeadersEnd 6200381 @@ -4106,7 +4106,7 @@ Lines 2363 MimeEntityEnd 6282825 MimeMessageEnd 6282825 MboxMarkerBegin 6282826 -MboxMarkerEnd 6282833 +MboxMarkerEnd 6282834 MimeMessageBegin 6282834 MimeEntityBegin 6282834 MimeEntityHeadersEnd 6283636 @@ -4116,7 +4116,7 @@ Lines 227 MimeEntityEnd 6292835 MimeMessageEnd 6292835 MboxMarkerBegin 6292836 -MboxMarkerEnd 6292843 +MboxMarkerEnd 6292844 MimeMessageBegin 6292844 MimeEntityBegin 6292844 MimeEntityHeadersEnd 6293572 @@ -4201,7 +4201,7 @@ Lines 1396 MimeEntityEnd 6385847 MimeMessageEnd 6385847 MboxMarkerBegin 6385848 -MboxMarkerEnd 6385855 +MboxMarkerEnd 6385856 MimeMessageBegin 6385856 MimeEntityBegin 6385856 MimeEntityHeadersEnd 6386610 @@ -4238,7 +4238,7 @@ Lines 501 MimeEntityEnd 6421275 MimeMessageEnd 6421275 MboxMarkerBegin 6421276 -MboxMarkerEnd 6421317 +MboxMarkerEnd 6421318 MimeMessageBegin 6421318 MimeEntityBegin 6421318 MimeEntityHeadersEnd 6421466 @@ -4248,7 +4248,7 @@ Lines 694 MimeEntityEnd 6464495 MimeMessageEnd 6464495 MboxMarkerBegin 6464496 -MboxMarkerEnd 6464527 +MboxMarkerEnd 6464528 MimeMessageBegin 6464528 MimeEntityBegin 6464528 MimeEntityHeadersEnd 6465111 @@ -4298,7 +4298,7 @@ Lines 369 MimeEntityEnd 6490367 MimeMessageEnd 6490367 MboxMarkerBegin 6490368 -MboxMarkerEnd 6490399 +MboxMarkerEnd 6490400 MimeMessageBegin 6490400 MimeEntityBegin 6490400 MimeEntityHeadersEnd 6490806 @@ -4444,7 +4444,7 @@ Lines 113 MimeEntityEnd 6493572 MimeMessageEnd 6493572 MboxMarkerBegin 6493573 -MboxMarkerEnd 6493604 +MboxMarkerEnd 6493605 MimeMessageBegin 6493605 MimeEntityBegin 6493605 MimeEntityHeadersEnd 6494009 @@ -4501,7 +4501,7 @@ Lines 17726 MimeEntityEnd 6844507 MimeMessageEnd 6844507 MboxMarkerBegin 6844508 -MboxMarkerEnd 6844515 +MboxMarkerEnd 6844516 MimeMessageBegin 6844516 MimeEntityBegin 6844516 MimeEntityHeadersEnd 6845120 @@ -4539,7 +4539,7 @@ Lines 43 MimeEntityEnd 6846556 MimeMessageEnd 6846556 MboxMarkerBegin 6846557 -MboxMarkerEnd 6846564 +MboxMarkerEnd 6846565 MimeMessageBegin 6846565 MimeEntityBegin 6846565 MimeEntityHeadersEnd 6846861 @@ -4569,7 +4569,7 @@ Lines 197 MimeEntityEnd 6858989 MimeMessageEnd 6858989 MboxMarkerBegin 6858990 -MboxMarkerEnd 6858997 +MboxMarkerEnd 6858998 MimeMessageBegin 6858998 MimeEntityBegin 6858998 MimeEntityHeadersEnd 6859294 @@ -4599,7 +4599,7 @@ Lines 197 MimeEntityEnd 6871390 MimeMessageEnd 6871390 MboxMarkerBegin 6871391 -MboxMarkerEnd 6871422 +MboxMarkerEnd 6871423 MimeMessageBegin 6871423 MimeEntityBegin 6871423 MimeEntityHeadersEnd 6872926 @@ -4629,7 +4629,7 @@ Lines 140 MimeEntityEnd 6879481 MimeMessageEnd 6879481 MboxMarkerBegin 6879482 -MboxMarkerEnd 6879513 +MboxMarkerEnd 6879514 MimeMessageBegin 6879514 MimeEntityBegin 6879514 MimeEntityHeadersEnd 6879961 @@ -4721,7 +4721,7 @@ Lines 3059 MimeEntityEnd 7094537 MimeMessageEnd 7094537 MboxMarkerBegin 7094538 -MboxMarkerEnd 7094545 +MboxMarkerEnd 7094546 MimeMessageBegin 7094546 MimeEntityBegin 7094546 MimeEntityHeadersEnd 7094841 @@ -4751,7 +4751,7 @@ Lines 188 MimeEntityEnd 7106504 MimeMessageEnd 7106504 MboxMarkerBegin 7106505 -MboxMarkerEnd 7106512 +MboxMarkerEnd 7106513 MimeMessageBegin 7106513 MimeEntityBegin 7106513 MimeEntityHeadersEnd 7106808 @@ -4781,7 +4781,7 @@ Lines 193 MimeEntityEnd 7118734 MimeMessageEnd 7118734 MboxMarkerBegin 7118735 -MboxMarkerEnd 7118742 +MboxMarkerEnd 7118743 MimeMessageBegin 7118743 MimeEntityBegin 7118743 MimeEntityHeadersEnd 7119038 @@ -4811,7 +4811,7 @@ Lines 191 MimeEntityEnd 7130873 MimeMessageEnd 7130873 MboxMarkerBegin 7130874 -MboxMarkerEnd 7130881 +MboxMarkerEnd 7130882 MimeMessageBegin 7130882 MimeEntityBegin 7130882 MimeEntityHeadersEnd 7131177 @@ -4841,7 +4841,7 @@ Lines 196 MimeEntityEnd 7143201 MimeMessageEnd 7143201 MboxMarkerBegin 7143202 -MboxMarkerEnd 7143209 +MboxMarkerEnd 7143210 MimeMessageBegin 7143210 MimeEntityBegin 7143210 MimeEntityHeadersEnd 7143505 @@ -4871,7 +4871,7 @@ Lines 191 MimeEntityEnd 7155384 MimeMessageEnd 7155384 MboxMarkerBegin 7155385 -MboxMarkerEnd 7155392 +MboxMarkerEnd 7155393 MimeMessageBegin 7155393 MimeEntityBegin 7155393 MimeEntityHeadersEnd 7155688 @@ -4901,7 +4901,7 @@ Lines 196 MimeEntityEnd 7167782 MimeMessageEnd 7167782 MboxMarkerBegin 7167783 -MboxMarkerEnd 7167814 +MboxMarkerEnd 7167815 MimeMessageBegin 7167815 MimeEntityBegin 7167815 MimeEntityHeadersEnd 7169049 @@ -4979,7 +4979,7 @@ Lines 10286 MimeEntityEnd 7916334 MimeMessageEnd 7916334 MboxMarkerBegin 7916335 -MboxMarkerEnd 7916366 +MboxMarkerEnd 7916367 MimeMessageBegin 7916367 MimeEntityBegin 7916367 MimeEntityHeadersEnd 7917631 @@ -5030,7 +5030,7 @@ Lines 650 MimeEntityEnd 7964259 MimeMessageEnd 7964259 MboxMarkerBegin 7964260 -MboxMarkerEnd 7964267 +MboxMarkerEnd 7964268 MimeMessageBegin 7964268 MimeEntityBegin 7964268 MimeEntityHeadersEnd 7965009 @@ -5040,7 +5040,7 @@ Lines 7475 MimeEntityEnd 8509625 MimeMessageEnd 8509625 MboxMarkerBegin 8509626 -MboxMarkerEnd 8509633 +MboxMarkerEnd 8509634 MimeMessageBegin 8509634 MimeEntityBegin 8509634 MimeEntityHeadersEnd 8510545 @@ -5063,7 +5063,7 @@ Lines 103 MimeEntityEnd 8513124 MimeMessageEnd 8513124 MboxMarkerBegin 8513125 -MboxMarkerEnd 8513156 +MboxMarkerEnd 8513157 MimeMessageBegin 8513157 MimeEntityBegin 8513157 MimeEntityHeadersEnd 8513751 @@ -5093,7 +5093,7 @@ Lines 51 MimeEntityEnd 8515537 MimeMessageEnd 8515537 MboxMarkerBegin 8515538 -MboxMarkerEnd 8515545 +MboxMarkerEnd 8515546 MimeMessageBegin 8515546 MimeEntityBegin 8515546 MimeEntityHeadersEnd 8516708 @@ -5103,7 +5103,7 @@ Lines 40 MimeEntityEnd 8518091 MimeMessageEnd 8518091 MboxMarkerBegin 8518092 -MboxMarkerEnd 8518099 +MboxMarkerEnd 8518100 MimeMessageBegin 8518100 MimeEntityBegin 8518100 MimeEntityHeadersEnd 8518733 @@ -5113,7 +5113,7 @@ Lines 28 MimeEntityEnd 8519707 MimeMessageEnd 8519707 MboxMarkerBegin 8519708 -MboxMarkerEnd 8519715 +MboxMarkerEnd 8519716 MimeMessageBegin 8519716 MimeEntityBegin 8519716 MimeEntityHeadersEnd 8520478 @@ -5200,7 +5200,7 @@ Lines 90 MimeEntityEnd 8523391 MimeMessageEnd 8523391 MboxMarkerBegin 8523392 -MboxMarkerEnd 8523399 +MboxMarkerEnd 8523400 MimeMessageBegin 8523400 MimeEntityBegin 8523400 MimeEntityHeadersEnd 8524214 @@ -5210,7 +5210,7 @@ Lines 43 MimeEntityEnd 8525600 MimeMessageEnd 8525600 MboxMarkerBegin 8525601 -MboxMarkerEnd 8525608 +MboxMarkerEnd 8525609 MimeMessageBegin 8525609 MimeEntityBegin 8525609 MimeEntityHeadersEnd 8525761 @@ -5220,7 +5220,7 @@ Lines 64 MimeEntityEnd 8530432 MimeMessageEnd 8530432 MboxMarkerBegin 8530433 -MboxMarkerEnd 8530440 +MboxMarkerEnd 8530441 MimeMessageBegin 8530441 MimeEntityBegin 8530441 MimeEntityHeadersEnd 8532184 @@ -5375,7 +5375,7 @@ Lines 280 MimeEntityEnd 8543555 MimeMessageEnd 8543555 MboxMarkerBegin 8543556 -MboxMarkerEnd 8543563 +MboxMarkerEnd 8543564 MimeMessageBegin 8543564 MimeEntityBegin 8543564 MimeEntityHeadersEnd 8544292 @@ -5432,7 +5432,7 @@ Lines 178 MimeEntityEnd 8554952 MimeMessageEnd 8554952 MboxMarkerBegin 8554953 -MboxMarkerEnd 8554960 +MboxMarkerEnd 8554961 MimeMessageBegin 8554961 MimeEntityBegin 8554961 MimeEntityHeadersEnd 8555607 @@ -5462,7 +5462,7 @@ Lines 1094 MimeEntityEnd 8634515 MimeMessageEnd 8634515 MboxMarkerBegin 8634516 -MboxMarkerEnd 8634523 +MboxMarkerEnd 8634524 MimeMessageBegin 8634524 MimeEntityBegin 8634524 MimeEntityHeadersEnd 8635280 @@ -5533,7 +5533,7 @@ Lines 2634 MimeEntityEnd 8820549 MimeMessageEnd 8820549 MboxMarkerBegin 8820550 -MboxMarkerEnd 8820557 +MboxMarkerEnd 8820558 MimeMessageBegin 8820558 MimeEntityBegin 8820558 MimeEntityHeadersEnd 8821395 @@ -5543,7 +5543,7 @@ Lines 26 MimeEntityEnd 8823128 MimeMessageEnd 8823128 MboxMarkerBegin 8823129 -MboxMarkerEnd 8823136 +MboxMarkerEnd 8823137 MimeMessageBegin 8823137 MimeEntityBegin 8823137 MimeEntityHeadersEnd 8823767 @@ -5561,7 +5561,7 @@ Lines 38 MimeEntityEnd 8825125 MimeMessageEnd 8825125 MboxMarkerBegin 8825126 -MboxMarkerEnd 8825133 +MboxMarkerEnd 8825134 MimeMessageBegin 8825134 MimeEntityBegin 8825134 MimeEntityHeadersEnd 8825579 @@ -5591,7 +5591,7 @@ Lines 1262 MimeEntityEnd 8916963 MimeMessageEnd 8916963 MboxMarkerBegin 8916964 -MboxMarkerEnd 8916971 +MboxMarkerEnd 8916972 MimeMessageBegin 8916972 MimeEntityBegin 8916972 MimeEntityHeadersEnd 8917462 @@ -5601,7 +5601,7 @@ Lines 28 MimeEntityEnd 8918604 MimeMessageEnd 8918604 MboxMarkerBegin 8918605 -MboxMarkerEnd 8918612 +MboxMarkerEnd 8918613 MimeMessageBegin 8918613 MimeEntityBegin 8918613 MimeEntityHeadersEnd 8919753 @@ -5659,7 +5659,7 @@ Lines 1971 MimeEntityEnd 9013870 MimeMessageEnd 9013870 MboxMarkerBegin 9013871 -MboxMarkerEnd 9013902 +MboxMarkerEnd 9013903 MimeMessageBegin 9013903 MimeEntityBegin 9013903 MimeEntityHeadersEnd 9015056 @@ -5689,7 +5689,7 @@ Lines 42 MimeEntityEnd 9016840 MimeMessageEnd 9016840 MboxMarkerBegin 9016841 -MboxMarkerEnd 9016872 +MboxMarkerEnd 9016873 MimeMessageBegin 9016873 MimeEntityBegin 9016873 MimeEntityHeadersEnd 9018015 @@ -5719,7 +5719,7 @@ Lines 60 MimeEntityEnd 9021424 MimeMessageEnd 9021424 MboxMarkerBegin 9021425 -MboxMarkerEnd 9021456 +MboxMarkerEnd 9021457 MimeMessageBegin 9021457 MimeEntityBegin 9021457 MimeEntityHeadersEnd 9022594 @@ -5749,7 +5749,7 @@ Lines 97 MimeEntityEnd 9028448 MimeMessageEnd 9028448 MboxMarkerBegin 9028449 -MboxMarkerEnd 9028456 +MboxMarkerEnd 9028457 MimeMessageBegin 9028457 MimeEntityBegin 9028457 MimeEntityHeadersEnd 9028665 @@ -5759,7 +5759,7 @@ Lines 58 MimeEntityEnd 9032858 MimeMessageEnd 9032858 MboxMarkerBegin 9032859 -MboxMarkerEnd 9032890 +MboxMarkerEnd 9032891 MimeMessageBegin 9032891 MimeEntityBegin 9032891 MimeEntityHeadersEnd 9033791 @@ -5789,7 +5789,7 @@ Lines 225 MimeEntityEnd 9049540 MimeMessageEnd 9049540 MboxMarkerBegin 9049541 -MboxMarkerEnd 9049572 +MboxMarkerEnd 9049573 MimeMessageBegin 9049573 MimeEntityBegin 9049573 MimeEntityHeadersEnd 9050380 @@ -5799,7 +5799,7 @@ Lines 258 MimeEntityEnd 9067141 MimeMessageEnd 9067141 MboxMarkerBegin 9067142 -MboxMarkerEnd 9067173 +MboxMarkerEnd 9067174 MimeMessageBegin 9067174 MimeEntityBegin 9067174 MimeEntityHeadersEnd 9067986 @@ -5809,7 +5809,7 @@ Lines 385 MimeEntityEnd 9092950 MimeMessageEnd 9092950 MboxMarkerBegin 9092951 -MboxMarkerEnd 9092982 +MboxMarkerEnd 9092983 MimeMessageBegin 9092983 MimeEntityBegin 9092983 MimeEntityHeadersEnd 9093795 @@ -5819,7 +5819,7 @@ Lines 556 MimeEntityEnd 9129926 MimeMessageEnd 9129926 MboxMarkerBegin 9129927 -MboxMarkerEnd 9129958 +MboxMarkerEnd 9129959 MimeMessageBegin 9129959 MimeEntityBegin 9129959 MimeEntityHeadersEnd 9130774 @@ -5829,7 +5829,7 @@ Lines 790 MimeEntityEnd 9182075 MimeMessageEnd 9182075 MboxMarkerBegin 9182076 -MboxMarkerEnd 9182107 +MboxMarkerEnd 9182108 MimeMessageBegin 9182108 MimeEntityBegin 9182108 MimeEntityHeadersEnd 9183499 @@ -5839,7 +5839,7 @@ Lines 20 MimeEntityEnd 9184930 MimeMessageEnd 9184930 MboxMarkerBegin 9184931 -MboxMarkerEnd 9184962 +MboxMarkerEnd 9184963 MimeMessageBegin 9184963 MimeEntityBegin 9184963 MimeEntityHeadersEnd 9186316 @@ -5869,7 +5869,7 @@ Lines 70 MimeEntityEnd 9190708 MimeMessageEnd 9190708 MboxMarkerBegin 9190709 -MboxMarkerEnd 9190740 +MboxMarkerEnd 9190741 MimeMessageBegin 9190741 MimeEntityBegin 9190741 MimeEntityHeadersEnd 9191951 @@ -5879,7 +5879,7 @@ Lines 56 MimeEntityEnd 9195446 MimeMessageEnd 9195446 MboxMarkerBegin 9195447 -MboxMarkerEnd 9195478 +MboxMarkerEnd 9195479 MimeMessageBegin 9195479 MimeEntityBegin 9195479 MimeEntityHeadersEnd 9196556 @@ -5889,7 +5889,7 @@ Lines 10 MimeEntityEnd 9197217 MimeMessageEnd 9197217 MboxMarkerBegin 9197218 -MboxMarkerEnd 9197225 +MboxMarkerEnd 9197226 MimeMessageBegin 9197226 MimeEntityBegin 9197226 MimeEntityHeadersEnd 9197618 @@ -5899,7 +5899,7 @@ Lines 105 MimeEntityEnd 9205238 MimeMessageEnd 9205238 MboxMarkerBegin 9205239 -MboxMarkerEnd 9205270 +MboxMarkerEnd 9205271 MimeMessageBegin 9205271 MimeEntityBegin 9205271 MimeEntityHeadersEnd 9206054 @@ -5917,7 +5917,7 @@ Lines 44 MimeEntityEnd 9208866 MimeMessageEnd 9208866 MboxMarkerBegin 9208867 -MboxMarkerEnd 9208898 +MboxMarkerEnd 9208899 MimeMessageBegin 9208899 MimeEntityBegin 9208899 MimeEntityHeadersEnd 9209609 @@ -5955,7 +5955,7 @@ Lines 59 MimeEntityEnd 9212797 MimeMessageEnd 9212797 MboxMarkerBegin 9212798 -MboxMarkerEnd 9212829 +MboxMarkerEnd 9212830 MimeMessageBegin 9212830 MimeEntityBegin 9212830 MimeEntityHeadersEnd 9213495 @@ -5985,7 +5985,7 @@ Lines 92 MimeEntityEnd 9219506 MimeMessageEnd 9219506 MboxMarkerBegin 9219507 -MboxMarkerEnd 9219538 +MboxMarkerEnd 9219539 MimeMessageBegin 9219539 MimeEntityBegin 9219539 MimeEntityHeadersEnd 9220601 @@ -5995,7 +5995,7 @@ Lines 141 MimeEntityEnd 9230837 MimeMessageEnd 9230837 MboxMarkerBegin 9230838 -MboxMarkerEnd 9230869 +MboxMarkerEnd 9230870 MimeMessageBegin 9230870 MimeEntityBegin 9230870 MimeEntityHeadersEnd 9232246 @@ -6025,7 +6025,7 @@ Lines 55 MimeEntityEnd 9235059 MimeMessageEnd 9235059 MboxMarkerBegin 9235060 -MboxMarkerEnd 9235091 +MboxMarkerEnd 9235092 MimeMessageBegin 9235092 MimeEntityBegin 9235092 MimeEntityHeadersEnd 9235640 @@ -6035,7 +6035,7 @@ Lines 8 MimeEntityEnd 9236163 MimeMessageEnd 9236163 MboxMarkerBegin 9236164 -MboxMarkerEnd 9236171 +MboxMarkerEnd 9236172 MimeMessageBegin 9236172 MimeEntityBegin 9236172 MimeEntityHeadersEnd 9237488 @@ -6058,7 +6058,7 @@ Lines 24 MimeEntityEnd 9238420 MimeMessageEnd 9238420 MboxMarkerBegin 9238421 -MboxMarkerEnd 9238428 +MboxMarkerEnd 9238429 MimeMessageBegin 9238429 MimeEntityBegin 9238429 MimeEntityHeadersEnd 9239776 @@ -6130,7 +6130,7 @@ Lines 170 MimeEntityEnd 9248589 MimeMessageEnd 9248589 MboxMarkerBegin 9248590 -MboxMarkerEnd 9248621 +MboxMarkerEnd 9248622 MimeMessageBegin 9248622 MimeEntityBegin 9248622 MimeEntityHeadersEnd 9249837 @@ -6140,7 +6140,7 @@ Lines 39 MimeEntityEnd 9252719 MimeMessageEnd 9252719 MboxMarkerBegin 9252720 -MboxMarkerEnd 9252751 +MboxMarkerEnd 9252752 MimeMessageBegin 9252752 MimeEntityBegin 9252752 MimeEntityHeadersEnd 9253910 @@ -6150,7 +6150,7 @@ Lines 31 MimeEntityEnd 9256032 MimeMessageEnd 9256032 MboxMarkerBegin 9256033 -MboxMarkerEnd 9256064 +MboxMarkerEnd 9256065 MimeMessageBegin 9256065 MimeEntityBegin 9256065 MimeEntityHeadersEnd 9257143 @@ -6180,7 +6180,7 @@ Lines 54 MimeEntityEnd 9260100 MimeMessageEnd 9260100 MboxMarkerBegin 9260101 -MboxMarkerEnd 9260132 +MboxMarkerEnd 9260133 MimeMessageBegin 9260133 MimeEntityBegin 9260133 MimeEntityHeadersEnd 9261170 @@ -6217,7 +6217,7 @@ Lines 73 MimeEntityEnd 9264050 MimeMessageEnd 9264050 MboxMarkerBegin 9264051 -MboxMarkerEnd 9264082 +MboxMarkerEnd 9264083 MimeMessageBegin 9264083 MimeEntityBegin 9264083 MimeEntityHeadersEnd 9265158 @@ -6247,7 +6247,7 @@ Lines 76 MimeEntityEnd 9269686 MimeMessageEnd 9269686 MboxMarkerBegin 9269687 -MboxMarkerEnd 9269694 +MboxMarkerEnd 9269695 MimeMessageBegin 9269695 MimeEntityBegin 9269695 MimeEntityHeadersEnd 9270246 @@ -6277,7 +6277,7 @@ Lines 69 MimeEntityEnd 9274666 MimeMessageEnd 9274666 MboxMarkerBegin 9274667 -MboxMarkerEnd 9274698 +MboxMarkerEnd 9274699 MimeMessageBegin 9274699 MimeEntityBegin 9274699 MimeEntityHeadersEnd 9275863 @@ -6307,7 +6307,7 @@ Lines 67 MimeEntityEnd 9279928 MimeMessageEnd 9279928 MboxMarkerBegin 9279929 -MboxMarkerEnd 9279960 +MboxMarkerEnd 9279961 MimeMessageBegin 9279961 MimeEntityBegin 9279961 MimeEntityHeadersEnd 9281063 @@ -6337,7 +6337,7 @@ Lines 73 MimeEntityEnd 9285114 MimeMessageEnd 9285114 MboxMarkerBegin 9285115 -MboxMarkerEnd 9285146 +MboxMarkerEnd 9285147 MimeMessageBegin 9285147 MimeEntityBegin 9285147 MimeEntityHeadersEnd 9286275 @@ -6375,7 +6375,7 @@ Lines 35 MimeEntityEnd 9287538 MimeMessageEnd 9287538 MboxMarkerBegin 9287539 -MboxMarkerEnd 9287584 +MboxMarkerEnd 9287585 MimeMessageBegin 9287585 MimeEntityBegin 9287585 MimeEntityHeadersEnd 9287750 @@ -6385,7 +6385,7 @@ Lines 593 MimeEntityEnd 9322244 MimeMessageEnd 9322244 MboxMarkerBegin 9322245 -MboxMarkerEnd 9322290 +MboxMarkerEnd 9322291 MimeMessageBegin 9322291 MimeEntityBegin 9322291 MimeEntityHeadersEnd 9322449 @@ -6395,7 +6395,7 @@ Lines 593 MimeEntityEnd 9356943 MimeMessageEnd 9356943 MboxMarkerBegin 9356944 -MboxMarkerEnd 9356951 +MboxMarkerEnd 9356952 MimeMessageBegin 9356952 MimeEntityBegin 9356952 MimeEntityHeadersEnd 9357549 @@ -6405,7 +6405,7 @@ Lines 39 MimeEntityEnd 9358949 MimeMessageEnd 9358949 MboxMarkerBegin 9358950 -MboxMarkerEnd 9358957 +MboxMarkerEnd 9358958 MimeMessageBegin 9358958 MimeEntityBegin 9358958 MimeEntityHeadersEnd 9359858 @@ -6435,7 +6435,7 @@ Lines 3983 MimeEntityEnd 9602012 MimeMessageEnd 9602012 MboxMarkerBegin 9602013 -MboxMarkerEnd 9602020 +MboxMarkerEnd 9602021 MimeMessageBegin 9602021 MimeEntityBegin 9602021 MimeEntityHeadersEnd 9602615 @@ -6458,7 +6458,7 @@ Lines 417 MimeEntityEnd 9681155 MimeMessageEnd 9681155 MboxMarkerBegin 9681156 -MboxMarkerEnd 9681163 +MboxMarkerEnd 9681164 MimeMessageBegin 9681164 MimeEntityBegin 9681164 MimeEntityHeadersEnd 9681316 @@ -6468,7 +6468,7 @@ Lines 49 MimeEntityEnd 9684876 MimeMessageEnd 9684876 MboxMarkerBegin 9684877 -MboxMarkerEnd 9684884 +MboxMarkerEnd 9684885 MimeMessageBegin 9684885 MimeEntityBegin 9684885 MimeEntityHeadersEnd 9685657 @@ -6553,7 +6553,7 @@ Lines 480 MimeEntityEnd 9715925 MimeMessageEnd 9715925 MboxMarkerBegin 9715926 -MboxMarkerEnd 9715933 +MboxMarkerEnd 9715934 MimeMessageBegin 9715934 MimeEntityBegin 9715934 MimeEntityHeadersEnd 9715990 @@ -6563,7 +6563,7 @@ Lines 28 MimeEntityEnd 9717198 MimeMessageEnd 9717198 MboxMarkerBegin 9717199 -MboxMarkerEnd 9717230 +MboxMarkerEnd 9717231 MimeMessageBegin 9717231 MimeEntityBegin 9717231 MimeEntityHeadersEnd 9717382 @@ -6573,7 +6573,7 @@ Lines 68 MimeEntityEnd 9720490 MimeMessageEnd 9720490 MboxMarkerBegin 9720491 -MboxMarkerEnd 9720522 +MboxMarkerEnd 9720523 MimeMessageBegin 9720523 MimeEntityBegin 9720523 MimeEntityHeadersEnd 9722388 @@ -6603,7 +6603,7 @@ Lines 93 MimeEntityEnd 9727267 MimeMessageEnd 9727267 MboxMarkerBegin 9727268 -MboxMarkerEnd 9727275 +MboxMarkerEnd 9727276 MimeMessageBegin 9727276 MimeEntityBegin 9727276 MimeEntityHeadersEnd 9727830 @@ -6633,7 +6633,7 @@ Lines 1618 MimeEntityEnd 9844660 MimeMessageEnd 9844660 MboxMarkerBegin 9844661 -MboxMarkerEnd 9844668 +MboxMarkerEnd 9844669 MimeMessageBegin 9844669 MimeEntityBegin 9844669 MimeEntityHeadersEnd 9845465 @@ -6748,7 +6748,7 @@ Lines 838 MimeEntityEnd 9870085 MimeMessageEnd 9870085 MboxMarkerBegin 9870086 -MboxMarkerEnd 9870093 +MboxMarkerEnd 9870094 MimeMessageBegin 9870094 MimeEntityBegin 9870094 MimeEntityHeadersEnd 9871206 @@ -6785,7 +6785,7 @@ Lines 441 MimeEntityEnd 9901796 MimeMessageEnd 9901796 MboxMarkerBegin 9901797 -MboxMarkerEnd 9901804 +MboxMarkerEnd 9901805 MimeMessageBegin 9901805 MimeEntityBegin 9901805 MimeEntityHeadersEnd 9903514 @@ -6795,7 +6795,7 @@ Lines 2952 MimeEntityEnd 10086313 MimeMessageEnd 10086313 MboxMarkerBegin 10086314 -MboxMarkerEnd 10086321 +MboxMarkerEnd 10086322 MimeMessageBegin 10086322 MimeEntityBegin 10086322 MimeEntityHeadersEnd 10087029 @@ -6832,7 +6832,7 @@ Lines 456 MimeEntityEnd 10171317 MimeMessageEnd 10171317 MboxMarkerBegin 10171318 -MboxMarkerEnd 10171325 +MboxMarkerEnd 10171326 MimeMessageBegin 10171326 MimeEntityBegin 10171326 MimeEntityHeadersEnd 10171993 @@ -6897,7 +6897,7 @@ Lines 2197 MimeEntityEnd 10392019 MimeMessageEnd 10392019 MboxMarkerBegin 10392020 -MboxMarkerEnd 10392027 +MboxMarkerEnd 10392028 MimeMessageBegin 10392028 MimeEntityBegin 10392028 MimeEntityHeadersEnd 10392292 @@ -6907,7 +6907,7 @@ Lines 1023 MimeEntityEnd 10466950 MimeMessageEnd 10466950 MboxMarkerBegin 10466951 -MboxMarkerEnd 10466958 +MboxMarkerEnd 10466959 MimeMessageBegin 10466959 MimeEntityBegin 10466959 MimeEntityHeadersEnd 10468233 @@ -6971,7 +6971,7 @@ Lines 788 MimeEntityEnd 10523298 MimeMessageEnd 10523298 MboxMarkerBegin 10523299 -MboxMarkerEnd 10523306 +MboxMarkerEnd 10523307 MimeMessageBegin 10523307 MimeEntityBegin 10523307 MimeEntityHeadersEnd 10523459 @@ -6981,7 +6981,7 @@ Lines 68 MimeEntityEnd 10528262 MimeMessageEnd 10528262 MboxMarkerBegin 10528263 -MboxMarkerEnd 10528270 +MboxMarkerEnd 10528271 MimeMessageBegin 10528271 MimeEntityBegin 10528271 MimeEntityHeadersEnd 10529016 From fafae90d62915db05b32667d19eab05902fc1591 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 24 Jun 2020 21:18:44 -0400 Subject: [PATCH 652/741] Allow AUthentication-Results method result values to contain '_' Fixes issue #584 --- MimeKit/Cryptography/AuthenticationResults.cs | 2 +- .../AuthenticationResultsTests.cs | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index 5a5c78f31e..a1f16c162c 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -223,7 +223,7 @@ static bool IsKeyword (byte c) return (c >= (byte) 'A' && c <= (byte) 'Z') || (c >= (byte) 'a' && c <= (byte) 'z') || (c >= (byte) '0' && c <= (byte) '9') || - c == (byte) '-'; + c == (byte) '-' || c == (byte) '_'; } static bool SkipKeyword (byte[] text, ref int index, int endIndex) diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 5d1761d6b5..19beaded83 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -953,6 +953,56 @@ public void TestParseOffice365RandomDomainTokensAndEmptyPropertyValue () Assert.AreEqual (expected, encoded.ToString ()); } + // Tests work-around for https://github.com/jstedfast/MimeKit/issues/584 + [Test] + public void TestParseMethodResultWithUnderscore () + { + const string input = " atlas122.free.mail.gq1.yahoo.com; dkim=dkim_pass header.i=@news.aegeanair.com header.s=@aegeanair2; spf=pass smtp.mailfrom=news.aegeanair.com; dmarc=success(p=REJECT) header.from=news.aegeanair.com;"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual ("atlas122.free.mail.gq1.yahoo.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("dkim", authres.Results[0].Method); + Assert.AreEqual ("dkim_pass", authres.Results[0].Result); + Assert.AreEqual (null, authres.Results[0].ResultComment); + Assert.AreEqual (2, authres.Results[0].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("i", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("@news.aegeanair.com", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("header", authres.Results[0].Properties[1].PropertyType); + Assert.AreEqual ("s", authres.Results[0].Properties[1].Property); + Assert.AreEqual ("@aegeanair2", authres.Results[0].Properties[1].Value); + + Assert.AreEqual ("spf", authres.Results[1].Method); + Assert.AreEqual ("pass", authres.Results[1].Result); + Assert.AreEqual (null, authres.Results[1].ResultComment); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "spf properties"); + Assert.AreEqual ("smtp", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("news.aegeanair.com", authres.Results[1].Properties[0].Value); + + Assert.AreEqual ("dmarc", authres.Results[2].Method); + Assert.AreEqual ("success", authres.Results[2].Result); + Assert.AreEqual ("p=REJECT", authres.Results[2].ResultComment); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "dmarc properties"); + Assert.AreEqual ("header", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("news.aegeanair.com", authres.Results[2].Properties[0].Value); + + Assert.AreEqual ("atlas122.free.mail.gq1.yahoo.com; dkim=dkim_pass header.i=@news.aegeanair.com header.s=@aegeanair2; spf=pass smtp.mailfrom=news.aegeanair.com; dmarc=success (p=REJECT) header.from=news.aegeanair.com", authres.ToString ()); + + const string expected = " atlas122.free.mail.gq1.yahoo.com;\n\tdkim=dkim_pass header.i=@news.aegeanair.com header.s=@aegeanair2;\n\tspf=pass smtp.mailfrom=news.aegeanair.com;\n\tdmarc=success (p=REJECT) header.from=news.aegeanair.com\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + static void AssertParseFailure (string input, int tokenIndex, int errorIndex) { var buffer = Encoding.ASCII.GetBytes (input); From f5e8d284eba26d1f20d0ae889016dbfb5b30b2c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 28 Jun 2020 12:10:57 -0400 Subject: [PATCH 653/741] Get rid of superfluous GetOffset call --- MimeKit/MimeParser.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 4b6a79f2c4..e60af07cfd 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1166,7 +1166,6 @@ unsafe void StepHeaders (byte* inbuf, CancellationToken cancellationToken) ParseAndAppendHeader (); - headerBlockEnd = GetOffset (inputIndex); state = MimeParserState.Content; } break; From 2da1c3db3248b4d21f276e06d2f6558366ee900c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Jul 2020 10:19:04 -0400 Subject: [PATCH 654/741] Fixed(?) Line Count calculations Fixes issue #582 --- MimeKit/AsyncMimeParser.cs | 15 +- MimeKit/MimeParser.cs | 30 +- UnitTests/MimeParserTests.cs | 2 +- .../mbox/content-length.dos-offsets.txt | 128 +- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 1224 ++++++++--------- 5 files changed, 703 insertions(+), 696 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 9f73f8f4bb..02480652fe 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -269,7 +269,7 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation } OnMimeContentOctets (part, endOffset - beginOffset); - OnMimeContentLines (part, GetLineCount (beginLineNumber)); + OnMimeContentLines (part, GetLineCount (beginLineNumber, beginOffset, endOffset)); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -363,7 +363,7 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentOctets (rfc822, endOffset - beginOffset); - OnMimeContentLines (rfc822, GetLineCount (beginLineNumber)); + OnMimeContentLines (rfc822, GetLineCount (beginLineNumber, beginOffset, endOffset)); } async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) @@ -464,10 +464,10 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: this will scan all content into the preamble... await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); - endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); return; } @@ -488,17 +488,16 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); - endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); return; } endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); multipart.WriteEndBoundary = false; diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index e60af07cfd..0b2fd5067b 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -143,6 +143,7 @@ public partial class MimeParser : IEnumerable long headerBlockBegin; long headerBlockEnd; long contentEnd; + long prevLineBeginOffset; long lineBeginOffset; int lineNumber; Stream stream; @@ -332,10 +333,11 @@ public void SetStream (ParserOptions options, Stream stream, MimeFormat format, mboxMarkerLength = 0; headerBlockBegin = 0; headerBlockEnd = 0; - lineNumber = 0; + lineNumber = 1; contentEnd = 0; position = stream.CanSeek ? stream.Position : 0; + prevLineBeginOffset = position; lineBeginOffset = position; preHeaderLength = 0; headers.Clear (); @@ -745,13 +747,16 @@ long GetEndOffset (int index) return GetOffset (index); } - int GetLineCount (int beginLineNumber) + int GetLineCount (int beginLineNumber, long beginOffset, long endOffset) { var lines = lineNumber - beginLineNumber; - if (boundary == BoundaryType.Eos && lineBeginOffset >= headerBlockEnd && position > lineBeginOffset) + if (lineBeginOffset >= beginOffset && endOffset > lineBeginOffset) lines++; + if (boundary != BoundaryType.Eos && endOffset == prevLineBeginOffset) + lines--; + return lines; } @@ -851,6 +856,7 @@ unsafe bool StepMboxMarker (byte *inbuf, ref int left) } inputIndex += lineLength; + prevLineBeginOffset = lineBeginOffset; lineBeginOffset = GetOffset (inputIndex); lineNumber++; @@ -1065,6 +1071,7 @@ unsafe bool StepHeaders (byte* inbuf, ref bool scanningFieldName, ref bool check break; } + prevLineBeginOffset = lineBeginOffset; lineBeginOffset = GetOffset ((int) (inptr - inbuf) + 1); lineNumber++; @@ -1191,6 +1198,7 @@ unsafe bool SkipLine (byte* inbuf, bool consumeNewLine) if (consumeNewLine) { inputIndex++; lineNumber++; + prevLineBeginOffset = lineBeginOffset; lineBeginOffset = GetOffset (inputIndex); } else if (*(inptr - 1) == (byte) '\r') { inputIndex--; @@ -1424,6 +1432,7 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b length++; inptr++; + prevLineBeginOffset = lineBeginOffset; lineBeginOffset = GetOffset ((int) (inptr - inbuf)); } else { // didn't find the end of the line... @@ -1525,7 +1534,7 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can } OnMimeContentOctets (part, endOffset - beginOffset); - OnMimeContentLines (part, GetLineCount (beginLineNumber)); + OnMimeContentLines (part, GetLineCount (beginLineNumber, beginOffset, endOffset)); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -1615,7 +1624,7 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca OnMimeEntityEnd (entity, endOffset); OnMimeMessageEnd (message, endOffset); OnMimeContentOctets (rfc822, endOffset - beginOffset); - OnMimeContentLines (rfc822, GetLineCount (beginLineNumber)); + OnMimeContentLines (rfc822, GetLineCount (beginLineNumber, beginOffset, endOffset)); } unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) @@ -1729,10 +1738,10 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); - endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); return; } @@ -1753,17 +1762,16 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); MultipartScanEpilogue (multipart, inbuf, cancellationToken); - endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); return; } endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber)); + OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); multipart.WriteEndBoundary = false; diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 9fa78c82e8..ff3363aa44 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -1281,7 +1281,7 @@ This is a single line of text followed by a blank line var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); - Assert.AreEqual (2, lines, "Line count"); + Assert.AreEqual (1, lines, "Line count"); } } diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt index c4d1e2824f..1a553eef86 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.txt @@ -53,11 +53,11 @@ MimeEntityBegin 2655 MimeEntityHeadersEnd 3095 MimeMessageHeadersEnd 3095 Octets 39 -Lines 3 +Lines 2 MimeEntityEnd 3134 MimeMessageEnd 3134 Octets 479 -Lines 14 +Lines 13 MimeEntityEnd 3134 MultipartBoundaryBegin 3134 MultipartBoundaryEnd 3164 @@ -96,11 +96,11 @@ MimeEntityBegin 5941 MimeEntityHeadersEnd 6381 MimeMessageHeadersEnd 6381 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 6419 MimeMessageEnd 6419 Octets 478 -Lines 13 +Lines 12 MimeEntityEnd 6419 MultipartBoundaryBegin 6419 MultipartBoundaryEnd 6449 @@ -119,26 +119,26 @@ MimeEntityBegin 7735 MimeEntityHeadersEnd 8156 MimeMessageHeadersEnd 8156 Octets 6 -Lines 2 +Lines 1 MimeEntityEnd 8162 MimeMessageEnd 8162 Octets 427 -Lines 13 +Lines 12 MimeEntityEnd 8162 MimeMessageEnd 8162 Octets 952 -Lines 27 +Lines 26 MimeEntityEnd 8162 MimeMessageEnd 8162 Octets 1537 -Lines 42 +Lines 41 MimeEntityEnd 8162 MultipartBoundaryBegin 8162 MultipartBoundaryEnd 8192 MimeEntityBegin 8192 MimeEntityHeadersEnd 8248 Octets 53 -Lines 2 +Lines 1 MimeEntityEnd 8301 MultipartEndBoundaryBegin 8301 MultipartEndBoundaryEnd 8331 @@ -165,11 +165,11 @@ MimeEntityBegin 9054 MimeEntityHeadersEnd 9493 MimeMessageHeadersEnd 9493 Octets 39 -Lines 3 +Lines 2 MimeEntityEnd 9532 MimeMessageEnd 9532 Octets 478 -Lines 14 +Lines 13 MimeEntityEnd 9532 MultipartBoundaryBegin 9532 MultipartBoundaryEnd 9562 @@ -208,11 +208,11 @@ MimeEntityBegin 12359 MimeEntityHeadersEnd 12798 MimeMessageHeadersEnd 12798 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 12836 MimeMessageEnd 12836 Octets 477 -Lines 13 +Lines 12 MimeEntityEnd 12836 MultipartBoundaryBegin 12836 MultipartBoundaryEnd 12866 @@ -231,26 +231,26 @@ MimeEntityBegin 14162 MimeEntityHeadersEnd 14582 MimeMessageHeadersEnd 14582 Octets 6 -Lines 2 +Lines 1 MimeEntityEnd 14588 MimeMessageEnd 14588 Octets 426 -Lines 13 +Lines 12 MimeEntityEnd 14588 MimeMessageEnd 14588 Octets 954 -Lines 27 +Lines 26 MimeEntityEnd 14588 MimeMessageEnd 14588 Octets 1542 -Lines 42 +Lines 41 MimeEntityEnd 14588 MultipartBoundaryBegin 14588 MultipartBoundaryEnd 14618 MimeEntityBegin 14618 MimeEntityHeadersEnd 14678 Octets 53 -Lines 2 +Lines 1 MimeEntityEnd 14731 MultipartEndBoundaryBegin 14731 MultipartEndBoundaryEnd 14761 @@ -273,21 +273,21 @@ MultipartBoundaryEnd 16372 MimeEntityBegin 16372 MimeEntityHeadersEnd 16466 Octets 5310 -Lines 112 +Lines 111 MimeEntityEnd 21776 MultipartBoundaryBegin 21776 MultipartBoundaryEnd 21823 MimeEntityBegin 21823 MimeEntityHeadersEnd 22028 Octets 942 -Lines 14 +Lines 13 MimeEntityEnd 22970 MultipartEndBoundaryBegin 22970 MultipartEndBoundaryEnd 23017 MultipartEpilogueBegin 23017 MultipartEpilogueEnd 23019 Octets 6694 -Lines 140 +Lines 139 MimeEntityEnd 23019 MimeMessageEnd 23019 MboxMarkerBegin 23021 @@ -303,7 +303,7 @@ MultipartBoundaryEnd 24397 MimeEntityBegin 24397 MimeEntityHeadersEnd 24476 Octets 30 -Lines 4 +Lines 3 MimeEntityEnd 24506 MultipartBoundaryBegin 24506 MultipartBoundaryEnd 24547 @@ -320,7 +320,7 @@ MultipartBoundaryEnd 25520 MimeEntityBegin 25520 MimeEntityHeadersEnd 25599 Octets 643 -Lines 17 +Lines 16 MimeEntityEnd 26242 MultipartBoundaryBegin 26242 MultipartBoundaryEnd 26284 @@ -333,7 +333,7 @@ MultipartBoundaryEnd 26410 MimeEntityBegin 26410 MimeEntityHeadersEnd 26488 Octets 868 -Lines 19 +Lines 18 MimeEntityEnd 27356 MultipartBoundaryBegin 27356 MultipartBoundaryEnd 27398 @@ -347,25 +347,25 @@ MultipartEndBoundaryEnd 781787 MultipartEpilogueBegin 781787 MultipartEpilogueEnd 781789 Octets 755421 -Lines 10224 +Lines 10223 MimeEntityEnd 781789 MultipartEndBoundaryBegin 781789 MultipartEndBoundaryEnd 781831 MultipartEpilogueBegin 781831 MultipartEpilogueEnd 781837 Octets 756359 -Lines 10253 +Lines 10252 MimeEntityEnd 781837 MimeMessageEnd 781837 Octets 757196 -Lines 10269 +Lines 10268 MimeEntityEnd 781837 MultipartEndBoundaryBegin 781837 MultipartEndBoundaryEnd 781878 MultipartEpilogueBegin 781878 MultipartEpilogueEnd 781880 Octets 757570 -Lines 10286 +Lines 10285 MimeEntityEnd 781880 MimeMessageEnd 781880 MboxMarkerBegin 781882 @@ -381,42 +381,42 @@ MultipartBoundaryEnd 783248 MimeEntityBegin 783248 MimeEntityHeadersEnd 783342 Octets 2432 -Lines 51 +Lines 50 MimeEntityEnd 785774 MultipartBoundaryBegin 785774 MultipartBoundaryEnd 785821 MimeEntityBegin 785821 MimeEntityHeadersEnd 785985 Octets 6102 -Lines 80 +Lines 79 MimeEntityEnd 792087 MultipartBoundaryBegin 792087 MultipartBoundaryEnd 792134 MimeEntityBegin 792134 MimeEntityHeadersEnd 792297 Octets 12230 -Lines 158 +Lines 157 MimeEntityEnd 804527 MultipartBoundaryBegin 804527 MultipartBoundaryEnd 804574 MimeEntityBegin 804574 MimeEntityHeadersEnd 804739 Octets 21996 -Lines 283 +Lines 282 MimeEntityEnd 826735 MultipartBoundaryBegin 826735 MultipartBoundaryEnd 826782 MimeEntityBegin 826782 MimeEntityHeadersEnd 826991 Octets 3438 -Lines 46 +Lines 45 MimeEntityEnd 830429 MultipartEndBoundaryBegin 830429 MultipartEndBoundaryEnd 830476 MultipartEpilogueBegin 830476 MultipartEpilogueEnd 830478 Octets 47277 -Lines 650 +Lines 649 MimeEntityEnd 830478 MimeMessageEnd 830478 MboxMarkerBegin 830480 @@ -432,14 +432,14 @@ MultipartBoundaryEnd 831432 MimeEntityBegin 831432 MimeEntityHeadersEnd 831463 Octets 2626 -Lines 97 +Lines 96 MimeEntityEnd 834089 MultipartEndBoundaryBegin 834089 MultipartEndBoundaryEnd 834100 MultipartEpilogueBegin 834100 MultipartEpilogueEnd 834102 Octets 2681 -Lines 103 +Lines 102 MimeEntityEnd 834102 MimeMessageEnd 834102 MboxMarkerBegin 834104 @@ -455,21 +455,21 @@ MultipartBoundaryEnd 835326 MimeEntityBegin 835326 MimeEntityHeadersEnd 835328 Octets 921 -Lines 21 +Lines 20 MimeEntityEnd 836249 MultipartBoundaryBegin 836249 MultipartBoundaryEnd 836269 MimeEntityBegin 836269 MimeEntityHeadersEnd 836351 Octets 760 -Lines 13 +Lines 12 MimeEntityEnd 837111 MultipartEndBoundaryBegin 837111 MultipartEndBoundaryEnd 837131 MultipartEpilogueBegin 837131 MultipartEpilogueEnd 837133 Octets 1825 -Lines 42 +Lines 41 MimeEntityEnd 837133 MimeMessageEnd 837133 MboxMarkerBegin 837135 @@ -492,7 +492,7 @@ MultipartBoundaryEnd 839358 MimeEntityBegin 839358 MimeEntityHeadersEnd 839541 Octets 2246 -Lines 32 +Lines 31 MimeEntityEnd 841787 MultipartEndBoundaryBegin 841787 MultipartEndBoundaryEnd 841797 @@ -522,7 +522,7 @@ MultipartBoundaryEnd 846153 MimeEntityBegin 846153 MimeEntityHeadersEnd 846336 Octets 2582 -Lines 36 +Lines 35 MimeEntityEnd 848918 MultipartEndBoundaryBegin 848918 MultipartEndBoundaryEnd 848942 @@ -559,7 +559,7 @@ MultipartEndBoundaryEnd 865866 MultipartEpilogueBegin 865866 MultipartEpilogueEnd 865868 Octets 15973 -Lines 225 +Lines 224 MimeEntityEnd 865868 MimeMessageEnd 865868 MboxMarkerBegin 865870 @@ -599,7 +599,7 @@ MultipartEndBoundaryEnd 874639 MultipartEpilogueBegin 874639 MultipartEpilogueEnd 874641 Octets 4461 -Lines 70 +Lines 69 MimeEntityEnd 874641 MimeMessageEnd 874641 MboxMarkerBegin 874643 @@ -609,7 +609,7 @@ MimeEntityBegin 874676 MimeEntityHeadersEnd 875907 MimeMessageHeadersEnd 875907 Octets 3550 -Lines 56 +Lines 55 MimeEntityEnd 879457 MimeMessageEnd 879457 MboxMarkerBegin 879459 @@ -633,11 +633,11 @@ MimeEntityBegin 882097 MimeEntityHeadersEnd 883500 MimeMessageHeadersEnd 883500 Octets 1452 -Lines 21 +Lines 20 MimeEntityEnd 884952 MimeMessageEnd 884952 Octets 2855 -Lines 44 +Lines 43 MimeEntityEnd 884952 MimeMessageEnd 884952 MboxMarkerBegin 884954 @@ -653,7 +653,7 @@ MultipartBoundaryEnd 885790 MimeEntityBegin 885790 MimeEntityHeadersEnd 885869 Octets 16 -Lines 2 +Lines 1 MimeEntityEnd 885885 MultipartBoundaryBegin 885885 MultipartBoundaryEnd 885915 @@ -664,18 +664,18 @@ MimeEntityBegin 886073 MimeEntityHeadersEnd 887476 MimeMessageHeadersEnd 887476 Octets 1452 -Lines 21 +Lines 20 MimeEntityEnd 888928 MimeMessageEnd 888928 Octets 2855 -Lines 44 +Lines 43 MimeEntityEnd 888928 MultipartEndBoundaryBegin 888928 MultipartEndBoundaryEnd 888958 MultipartEpilogueBegin 888958 MultipartEpilogueEnd 888960 Octets 3246 -Lines 59 +Lines 58 MimeEntityEnd 888960 MimeMessageEnd 888960 MboxMarkerBegin 888962 @@ -705,7 +705,7 @@ MultipartEndBoundaryEnd 895776 MultipartEpilogueBegin 895776 MultipartEpilogueEnd 895778 Octets 6102 -Lines 92 +Lines 91 MimeEntityEnd 895778 MimeMessageEnd 895778 MboxMarkerBegin 895780 @@ -745,7 +745,7 @@ MultipartEndBoundaryEnd 911572 MultipartEpilogueBegin 911572 MultipartEpilogueEnd 911574 Octets 2867 -Lines 55 +Lines 54 MimeEntityEnd 911574 MimeMessageEnd 911574 MboxMarkerBegin 911576 @@ -765,7 +765,7 @@ MimeEntityBegin 912737 MimeEntityHeadersEnd 913972 MimeMessageHeadersEnd 913972 Octets 2920 -Lines 39 +Lines 38 MimeEntityEnd 916892 MimeMessageEnd 916892 MboxMarkerBegin 916894 @@ -775,7 +775,7 @@ MimeEntityBegin 916927 MimeEntityHeadersEnd 918106 MimeMessageHeadersEnd 918106 Octets 2152 -Lines 31 +Lines 30 MimeEntityEnd 920258 MimeMessageEnd 920258 MboxMarkerBegin 920260 @@ -791,7 +791,7 @@ MultipartBoundaryEnd 921427 MimeEntityBegin 921427 MimeEntityHeadersEnd 921494 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 921494 MultipartBoundaryBegin 921494 MultipartBoundaryEnd 921529 @@ -805,7 +805,7 @@ MultipartEndBoundaryEnd 924400 MultipartEpilogueBegin 924400 MultipartEpilogueEnd 924402 Octets 3010 -Lines 54 +Lines 53 MimeEntityEnd 924402 MimeMessageEnd 924402 MboxMarkerBegin 924404 @@ -835,14 +835,14 @@ MultipartBoundaryEnd 927084 MimeEntityBegin 927084 MimeEntityHeadersEnd 927184 Octets 1216 -Lines 17 +Lines 16 MimeEntityEnd 928400 MultipartEndBoundaryBegin 928400 MultipartEndBoundaryEnd 928443 MultipartEpilogueBegin 928443 MultipartEpilogueEnd 928445 Octets 2952 -Lines 73 +Lines 72 MimeEntityEnd 928445 MimeMessageEnd 928445 MboxMarkerBegin 928447 @@ -858,7 +858,7 @@ MultipartBoundaryEnd 929621 MimeEntityBegin 929621 MimeEntityHeadersEnd 929694 Octets 159 -Lines 8 +Lines 7 MimeEntityEnd 929853 MultipartBoundaryBegin 929853 MultipartBoundaryEnd 929898 @@ -872,7 +872,7 @@ MultipartEndBoundaryEnd 934177 MultipartEpilogueBegin 934177 MultipartEpilogueEnd 934179 Octets 4603 -Lines 76 +Lines 75 MimeEntityEnd 934179 MimeMessageEnd 934179 MboxMarkerBegin 934181 @@ -918,7 +918,7 @@ MultipartBoundaryEnd 940782 MimeEntityBegin 940782 MimeEntityHeadersEnd 940823 Octets 194 -Lines 7 +Lines 6 MimeEntityEnd 941017 MultipartBoundaryBegin 941017 MultipartBoundaryEnd 941044 @@ -940,7 +940,7 @@ MultipartEndBoundaryEnd 941935 MultipartEpilogueBegin 941935 MultipartEpilogueEnd 941937 Octets 1297 -Lines 35 +Lines 34 MimeEntityEnd 941937 MimeMessageEnd 941937 MboxMarkerBegin 941939 @@ -956,14 +956,14 @@ MultipartBoundaryEnd 943913 MimeEntityBegin 943913 MimeEntityHeadersEnd 943994 Octets 881 -Lines 19 +Lines 18 MimeEntityEnd 944875 MultipartBoundaryBegin 944875 MultipartBoundaryEnd 944922 MimeEntityBegin 944922 MimeEntityHeadersEnd 945088 Octets 3702 -Lines 62 +Lines 61 MimeEntityEnd 948790 MultipartEndBoundaryBegin 948790 MultipartEndBoundaryEnd 948837 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt index b6787f26f4..f7728c55c2 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.txt @@ -24,7 +24,7 @@ MultipartBoundaryEnd 1447 MimeEntityBegin 1447 MimeEntityHeadersEnd 1535 Octets 31472 -Lines 427 +Lines 426 MimeEntityEnd 33007 MultipartEndBoundaryBegin 33007 MultipartEndBoundaryEnd 33041 @@ -44,14 +44,14 @@ MultipartBoundaryEnd 33189 MimeEntityBegin 33189 MimeEntityHeadersEnd 33275 Octets 26000 -Lines 353 +Lines 352 MimeEntityEnd 59275 MultipartBoundaryBegin 59275 MultipartBoundaryEnd 59309 MimeEntityBegin 59309 MimeEntityHeadersEnd 59395 Octets 18666 -Lines 254 +Lines 253 MimeEntityEnd 78061 MultipartBoundaryBegin 78061 MultipartBoundaryEnd 78095 @@ -65,7 +65,7 @@ MultipartBoundaryEnd 124371 MimeEntityBegin 124371 MimeEntityHeadersEnd 124435 Octets 9203 -Lines 358 +Lines 357 MimeEntityEnd 133638 MultipartEndBoundaryBegin 133638 MultipartEndBoundaryEnd 133672 @@ -79,14 +79,14 @@ MultipartBoundaryEnd 133692 MimeEntityBegin 133692 MimeEntityHeadersEnd 133780 Octets 47822 -Lines 648 +Lines 647 MimeEntityEnd 181602 MultipartEndBoundaryBegin 181602 MultipartEndBoundaryEnd 181622 MultipartEpilogueBegin 181622 MultipartEpilogueEnd 181624 Octets 181093 -Lines 4536 +Lines 4535 MimeEntityEnd 181624 MimeMessageEnd 181624 MboxMarkerBegin 181626 @@ -96,7 +96,7 @@ MimeEntityBegin 181635 MimeEntityHeadersEnd 182198 MimeMessageHeadersEnd 182198 Octets 137124 -Lines 1855 +Lines 1854 MimeEntityEnd 319322 MimeMessageEnd 319322 MboxMarkerBegin 319324 @@ -122,7 +122,7 @@ MultipartBoundaryEnd 320795 MimeEntityBegin 320795 MimeEntityHeadersEnd 320841 Octets 239 -Lines 7 +Lines 6 MimeEntityEnd 321080 MultipartBoundaryBegin 321080 MultipartBoundaryEnd 321123 @@ -135,28 +135,28 @@ MultipartBoundaryEnd 321254 MimeEntityBegin 321254 MimeEntityHeadersEnd 321348 Octets 149 -Lines 4 +Lines 3 MimeEntityEnd 321497 MultipartBoundaryBegin 321497 MultipartBoundaryEnd 321542 MimeEntityBegin 321542 MimeEntityHeadersEnd 321656 Octets 4432 -Lines 65 +Lines 64 MimeEntityEnd 326088 MultipartBoundaryBegin 326088 MultipartBoundaryEnd 326133 MimeEntityBegin 326133 MimeEntityHeadersEnd 326227 Octets 48 -Lines 4 +Lines 3 MimeEntityEnd 326275 MultipartEndBoundaryBegin 326275 MultipartEndBoundaryEnd 326320 MultipartEpilogueBegin 326320 MultipartEpilogueEnd 326322 Octets 5111 -Lines 88 +Lines 87 MimeEntityEnd 326322 MultipartEndBoundaryBegin 326322 MultipartEndBoundaryEnd 326365 @@ -179,7 +179,7 @@ MultipartBoundaryEnd 327403 MimeEntityBegin 327403 MimeEntityHeadersEnd 327479 Octets 436 -Lines 13 +Lines 12 MimeEntityEnd 327915 MultipartBoundaryBegin 327915 MultipartBoundaryEnd 327980 @@ -196,14 +196,14 @@ MultipartBoundaryEnd 329179 MimeEntityBegin 329179 MimeEntityHeadersEnd 329276 Octets 110 -Lines 7 +Lines 6 MimeEntityEnd 329386 MultipartBoundaryBegin 329386 MultipartBoundaryEnd 329419 MimeEntityBegin 329419 MimeEntityHeadersEnd 329511 Octets 20910 -Lines 284 +Lines 283 MimeEntityEnd 350421 MultipartBoundaryBegin 350421 MultipartBoundaryEnd 350454 @@ -213,25 +213,25 @@ Octets 0 Lines 0 MimeEntityEnd 350454 Octets 21590 -Lines 309 +Lines 308 MimeEntityEnd 350454 MimeMessageEnd 350454 Octets 22442 -Lines 325 +Lines 324 MimeEntityEnd 350454 MultipartBoundaryBegin 350454 MultipartBoundaryEnd 350519 MimeEntityBegin 350519 MimeEntityHeadersEnd 350595 Octets 111 -Lines 5 +Lines 4 MimeEntityEnd 350706 MultipartEndBoundaryBegin 350706 MultipartEndBoundaryEnd 350771 MultipartEpilogueBegin 350771 MultipartEpilogueEnd 350773 Octets 23632 -Lines 360 +Lines 359 MimeEntityEnd 350773 MimeMessageEnd 350773 MboxMarkerBegin 350775 @@ -247,7 +247,7 @@ MultipartBoundaryEnd 351717 MimeEntityBegin 351717 MimeEntityHeadersEnd 351763 Octets 778 -Lines 19 +Lines 18 MimeEntityEnd 352541 MultipartBoundaryBegin 352541 MultipartBoundaryEnd 352584 @@ -260,70 +260,70 @@ MultipartBoundaryEnd 352715 MimeEntityBegin 352715 MimeEntityHeadersEnd 352809 Octets 229 -Lines 5 +Lines 4 MimeEntityEnd 353038 MultipartBoundaryBegin 353038 MultipartBoundaryEnd 353083 MimeEntityBegin 353083 MimeEntityHeadersEnd 353195 Octets 684046 -Lines 8983 +Lines 8982 MimeEntityEnd 1037241 MultipartBoundaryBegin 1037241 MultipartBoundaryEnd 1037286 MimeEntityBegin 1037286 MimeEntityHeadersEnd 1037380 Octets 121 -Lines 6 +Lines 5 MimeEntityEnd 1037501 MultipartBoundaryBegin 1037501 MultipartBoundaryEnd 1037546 MimeEntityBegin 1037546 MimeEntityHeadersEnd 1037676 Octets 690196 -Lines 9061 +Lines 9060 MimeEntityEnd 1727872 MultipartBoundaryBegin 1727872 MultipartBoundaryEnd 1727917 MimeEntityBegin 1727917 MimeEntityHeadersEnd 1728011 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 1728023 MultipartBoundaryBegin 1728023 MultipartBoundaryEnd 1728068 MimeEntityBegin 1728068 MimeEntityHeadersEnd 1728189 Octets 69112 -Lines 935 +Lines 934 MimeEntityEnd 1797301 MultipartBoundaryBegin 1797301 MultipartBoundaryEnd 1797346 MimeEntityBegin 1797346 MimeEntityHeadersEnd 1797440 Octets 143 -Lines 6 +Lines 5 MimeEntityEnd 1797583 MultipartBoundaryBegin 1797583 MultipartBoundaryEnd 1797628 MimeEntityBegin 1797628 MimeEntityHeadersEnd 1797750 Octets 341234 -Lines 4473 +Lines 4472 MimeEntityEnd 2138984 MultipartBoundaryBegin 2138984 MultipartBoundaryEnd 2139029 MimeEntityBegin 2139029 MimeEntityHeadersEnd 2139123 Octets 6 -Lines 2 +Lines 1 MimeEntityEnd 2139129 MultipartEndBoundaryBegin 2139129 MultipartEndBoundaryEnd 2139174 MultipartEpilogueBegin 2139174 MultipartEpilogueEnd 2139176 Octets 1786504 -Lines 23516 +Lines 23515 MimeEntityEnd 2139176 MultipartEndBoundaryBegin 2139176 MultipartEndBoundaryEnd 2139219 @@ -340,7 +340,7 @@ MimeEntityBegin 2139230 MimeEntityHeadersEnd 2140267 MimeMessageHeadersEnd 2140267 Octets 1164 -Lines 40 +Lines 39 MimeEntityEnd 2141431 MimeMessageEnd 2141431 MboxMarkerBegin 2141433 @@ -390,7 +390,7 @@ MultipartBoundaryEnd 2302353 MimeEntityBegin 2302353 MimeEntityHeadersEnd 2302412 Octets 4915 -Lines 196 +Lines 195 MimeEntityEnd 2307327 MultipartEndBoundaryBegin 2307327 MultipartEndBoundaryEnd 2307345 @@ -407,7 +407,7 @@ MimeEntityBegin 2307356 MimeEntityHeadersEnd 2308328 MimeMessageHeadersEnd 2308328 Octets 347516 -Lines 4457 +Lines 4456 MimeEntityEnd 2655844 MimeMessageEnd 2655844 MboxMarkerBegin 2655846 @@ -436,7 +436,7 @@ MultipartBoundaryEnd 2656879 MimeEntityBegin 2656879 MimeEntityHeadersEnd 2656980 Octets 31472 -Lines 427 +Lines 426 MimeEntityEnd 2688452 MultipartEndBoundaryBegin 2688452 MultipartEndBoundaryEnd 2688486 @@ -460,7 +460,7 @@ MimeEntityBegin 2688517 MimeEntityHeadersEnd 2689088 MimeMessageHeadersEnd 2689088 Octets 57561 -Lines 783 +Lines 782 MimeEntityEnd 2746649 MimeMessageEnd 2746649 MboxMarkerBegin 2746651 @@ -476,7 +476,7 @@ MultipartBoundaryEnd 2748003 MimeEntityBegin 2748003 MimeEntityHeadersEnd 2748005 Octets 566 -Lines 15 +Lines 14 MimeEntityEnd 2748571 MultipartBoundaryBegin 2748571 MultipartBoundaryEnd 2748632 @@ -489,28 +489,28 @@ MultipartBoundaryEnd 2748799 MimeEntityBegin 2748799 MimeEntityHeadersEnd 2748875 Octets 426 -Lines 8 +Lines 7 MimeEntityEnd 2749301 MultipartBoundaryBegin 2749301 MultipartBoundaryEnd 2749364 MimeEntityBegin 2749364 MimeEntityHeadersEnd 2749426 Octets 29662 -Lines 402 +Lines 401 MimeEntityEnd 2779088 MultipartBoundaryBegin 2779088 MultipartBoundaryEnd 2779151 MimeEntityBegin 2779151 MimeEntityHeadersEnd 2779224 Octets 45 -Lines 5 +Lines 4 MimeEntityEnd 2779269 MultipartEndBoundaryBegin 2779269 MultipartEndBoundaryEnd 2779332 MultipartEpilogueBegin 2779332 MultipartEpilogueEnd 2779334 Octets 30596 -Lines 429 +Lines 428 MimeEntityEnd 2779334 MultipartEndBoundaryBegin 2779334 MultipartEndBoundaryEnd 2779395 @@ -533,7 +533,7 @@ MultipartBoundaryEnd 2780452 MimeEntityBegin 2780452 MimeEntityHeadersEnd 2780454 Octets 848 -Lines 28 +Lines 27 MimeEntityEnd 2781302 MultipartBoundaryBegin 2781302 MultipartBoundaryEnd 2781334 @@ -553,7 +553,7 @@ MultipartBoundaryEnd 2781646 MimeEntityBegin 2781646 MimeEntityHeadersEnd 2781714 Octets 1214 -Lines 18 +Lines 17 MimeEntityEnd 2782928 MultipartBoundaryBegin 2782928 MultipartBoundaryEnd 2782962 @@ -567,7 +567,7 @@ MultipartBoundaryEnd 2783092 MimeEntityBegin 2783092 MimeEntityHeadersEnd 2783160 Octets 1222 -Lines 18 +Lines 17 MimeEntityEnd 2784382 MultipartBoundaryBegin 2784382 MultipartBoundaryEnd 2784416 @@ -581,14 +581,14 @@ MultipartEndBoundaryEnd 2785040 MultipartEpilogueBegin 2785040 MultipartEpilogueEnd 2785042 Octets 3632 -Lines 76 +Lines 75 MimeEntityEnd 2785042 MultipartEndBoundaryBegin 2785042 MultipartEndBoundaryEnd 2785074 MultipartEpilogueBegin 2785074 MultipartEpilogueEnd 2785076 Octets 5001 -Lines 119 +Lines 118 MimeEntityEnd 2785076 MimeMessageEnd 2785076 MboxMarkerBegin 2785078 @@ -598,7 +598,7 @@ MimeEntityBegin 2785087 MimeEntityHeadersEnd 2786084 MimeMessageHeadersEnd 2786084 Octets 1414 -Lines 33 +Lines 32 MimeEntityEnd 2787498 MimeMessageEnd 2787498 MboxMarkerBegin 2787500 @@ -634,7 +634,7 @@ MultipartBoundaryEnd 2790507 MimeEntityBegin 2790507 MimeEntityHeadersEnd 2790555 Octets 77 -Lines 6 +Lines 5 MimeEntityEnd 2790632 MultipartBoundaryBegin 2790632 MultipartBoundaryEnd 2790674 @@ -647,21 +647,21 @@ MultipartBoundaryEnd 2790808 MimeEntityBegin 2790808 MimeEntityHeadersEnd 2790967 Octets 66874 -Lines 958 +Lines 957 MimeEntityEnd 2857841 MultipartBoundaryBegin 2857841 MultipartBoundaryEnd 2857884 MimeEntityBegin 2857884 MimeEntityHeadersEnd 2858099 Octets 369562 -Lines 5282 +Lines 5281 MimeEntityEnd 3227661 MultipartEndBoundaryBegin 3227661 MultipartEndBoundaryEnd 3227704 MultipartEpilogueBegin 3227704 MultipartEpilogueEnd 3227708 Octets 436945 -Lines 6257 +Lines 6256 MimeEntityEnd 3227708 MultipartEndBoundaryBegin 3227708 MultipartEndBoundaryEnd 3227750 @@ -684,7 +684,7 @@ MultipartBoundaryEnd 3228804 MimeEntityBegin 3228804 MimeEntityHeadersEnd 3228852 Octets 77 -Lines 6 +Lines 5 MimeEntityEnd 3228929 MultipartBoundaryBegin 3228929 MultipartBoundaryEnd 3228971 @@ -697,21 +697,21 @@ MultipartBoundaryEnd 3229104 MimeEntityBegin 3229104 MimeEntityHeadersEnd 3229263 Octets 66874 -Lines 958 +Lines 957 MimeEntityEnd 3296137 MultipartBoundaryBegin 3296137 MultipartBoundaryEnd 3296180 MimeEntityBegin 3296180 MimeEntityHeadersEnd 3296395 Octets 369562 -Lines 5282 +Lines 5281 MimeEntityEnd 3665957 MultipartEndBoundaryBegin 3665957 MultipartEndBoundaryEnd 3666000 MultipartEpilogueBegin 3666000 MultipartEpilogueEnd 3666004 Octets 436945 -Lines 6257 +Lines 6256 MimeEntityEnd 3666004 MultipartEndBoundaryBegin 3666004 MultipartEndBoundaryEnd 3666046 @@ -752,21 +752,21 @@ MultipartBoundaryEnd 3668020 MimeEntityBegin 3668020 MimeEntityHeadersEnd 3668048 Octets 186 -Lines 7 +Lines 6 MimeEntityEnd 3668234 MultipartBoundaryBegin 3668234 MultipartBoundaryEnd 3668280 MimeEntityBegin 3668280 MimeEntityHeadersEnd 3668355 Octets 904 -Lines 13 +Lines 12 MimeEntityEnd 3669259 MultipartEndBoundaryBegin 3669259 MultipartEndBoundaryEnd 3669305 MultipartEpilogueBegin 3669305 MultipartEpilogueEnd 3669418 Octets 1444 -Lines 34 +Lines 33 MimeEntityEnd 3669418 MimeMessageEnd 3669418 MboxMarkerBegin 3669420 @@ -782,7 +782,7 @@ MultipartBoundaryEnd 3670061 MimeEntityBegin 3670061 MimeEntityHeadersEnd 3670063 Octets 402 -Lines 11 +Lines 10 MimeEntityEnd 3670465 MultipartBoundaryBegin 3670465 MultipartBoundaryEnd 3670507 @@ -793,18 +793,18 @@ MimeEntityBegin 3670539 MimeEntityHeadersEnd 3671342 MimeMessageHeadersEnd 3671342 Octets 3425 -Lines 73 +Lines 72 MimeEntityEnd 3674767 MimeMessageEnd 3674767 Octets 4228 -Lines 89 +Lines 88 MimeEntityEnd 3674767 MultipartEndBoundaryBegin 3674767 MultipartEndBoundaryEnd 3674809 MultipartEpilogueBegin 3674809 MultipartEpilogueEnd 3674811 Octets 4829 -Lines 109 +Lines 108 MimeEntityEnd 3674811 MimeMessageEnd 3674811 MboxMarkerBegin 3674813 @@ -852,7 +852,7 @@ MimeEntityBegin 3676763 MimeEntityHeadersEnd 3677286 MimeMessageHeadersEnd 3677286 Octets 1464 -Lines 46 +Lines 45 MimeEntityEnd 3678750 MimeMessageEnd 3678750 MboxMarkerBegin 3678752 @@ -862,7 +862,7 @@ MimeEntityBegin 3678804 MimeEntityHeadersEnd 3679391 MimeMessageHeadersEnd 3679391 Octets 60655 -Lines 955 +Lines 954 MimeEntityEnd 3740046 MimeMessageEnd 3740046 MboxMarkerBegin 3740048 @@ -872,7 +872,7 @@ MimeEntityBegin 3740100 MimeEntityHeadersEnd 3740684 MimeMessageHeadersEnd 3740684 Octets 60767 -Lines 961 +Lines 960 MimeEntityEnd 3801451 MimeMessageEnd 3801451 MboxMarkerBegin 3801453 @@ -888,21 +888,21 @@ MultipartBoundaryEnd 3802041 MimeEntityBegin 3802041 MimeEntityHeadersEnd 3802070 Octets 75 -Lines 5 +Lines 4 MimeEntityEnd 3802145 MultipartBoundaryBegin 3802145 MultipartBoundaryEnd 3802163 MimeEntityBegin 3802163 MimeEntityHeadersEnd 3802247 Octets 650 -Lines 10 +Lines 9 MimeEntityEnd 3802897 MultipartEndBoundaryBegin 3802897 MultipartEndBoundaryEnd 3802915 MultipartEpilogueBegin 3802915 MultipartEpilogueEnd 3802919 Octets 896 -Lines 26 +Lines 25 MimeEntityEnd 3802919 MimeMessageEnd 3802919 MboxMarkerBegin 3802921 @@ -912,7 +912,7 @@ MimeEntityBegin 3802930 MimeEntityHeadersEnd 3803695 MimeMessageHeadersEnd 3803695 Octets 42100 -Lines 571 +Lines 570 MimeEntityEnd 3845795 MimeMessageEnd 3845795 MboxMarkerBegin 3845797 @@ -928,21 +928,21 @@ MultipartBoundaryEnd 3846991 MimeEntityBegin 3846991 MimeEntityHeadersEnd 3846993 Octets 1965 -Lines 44 +Lines 43 MimeEntityEnd 3848958 MultipartBoundaryBegin 3848958 MultipartBoundaryEnd 3848966 MimeEntityBegin 3848966 MimeEntityHeadersEnd 3849075 Octets 6308 -Lines 87 +Lines 86 MimeEntityEnd 3855383 MultipartEndBoundaryBegin 3855383 MultipartEndBoundaryEnd 3855391 MultipartEpilogueBegin 3855391 MultipartEpilogueEnd 3855393 Octets 8408 -Lines 140 +Lines 139 MimeEntityEnd 3855393 MimeMessageEnd 3855393 MboxMarkerBegin 3855395 @@ -952,7 +952,7 @@ MimeEntityBegin 3855404 MimeEntityHeadersEnd 3856880 MimeMessageHeadersEnd 3856880 Octets 108383 -Lines 1571 +Lines 1570 MimeEntityEnd 3965263 MimeMessageEnd 3965263 MboxMarkerBegin 3965265 @@ -980,7 +980,7 @@ MultipartBoundaryEnd 3967704 MimeEntityBegin 3967704 MimeEntityHeadersEnd 3967783 Octets 50 -Lines 2 +Lines 1 MimeEntityEnd 3967833 MultipartBoundaryBegin 3967833 MultipartBoundaryEnd 3967894 @@ -997,7 +997,7 @@ MultipartBoundaryEnd 3968572 MimeEntityBegin 3968572 MimeEntityHeadersEnd 3968651 Octets 127 -Lines 6 +Lines 5 MimeEntityEnd 3968778 MultipartBoundaryBegin 3968778 MultipartBoundaryEnd 3968829 @@ -1011,30 +1011,30 @@ MultipartEndBoundaryEnd 3969239 MultipartEpilogueBegin 3969239 MultipartEpilogueEnd 3969241 Octets 766 -Lines 23 +Lines 22 MimeEntityEnd 3969241 MimeMessageEnd 3969241 Octets 1282 -Lines 39 +Lines 38 MimeEntityEnd 3969241 MultipartEndBoundaryBegin 3969241 MultipartEndBoundaryEnd 3969302 MultipartEpilogueBegin 3969302 MultipartEpilogueEnd 3969308 Octets 1711 -Lines 55 +Lines 54 MimeEntityEnd 3969308 MimeMessageEnd 3969308 Octets 2275 -Lines 71 +Lines 70 MimeEntityEnd 3969308 MimeMessageEnd 3969308 Octets 2833 -Lines 87 +Lines 86 MimeEntityEnd 3969308 MimeMessageEnd 3969308 Octets 3419 -Lines 103 +Lines 102 MimeEntityEnd 3969308 MimeMessageEnd 3969308 MboxMarkerBegin 3969310 @@ -1064,7 +1064,7 @@ MultipartBoundaryEnd 4047936 MimeEntityBegin 4047936 MimeEntityHeadersEnd 4047938 Octets 34 -Lines 4 +Lines 3 MimeEntityEnd 4047972 MultipartBoundaryBegin 4047972 MultipartBoundaryEnd 4048002 @@ -1099,7 +1099,7 @@ MultipartEndBoundaryEnd 4233716 MultipartEpilogueBegin 4233716 MultipartEpilogueEnd 4233718 Octets 263680 -Lines 2211 +Lines 2210 MimeEntityEnd 4233718 MimeMessageEnd 4233718 MboxMarkerBegin 4233720 @@ -1109,7 +1109,7 @@ MimeEntityBegin 4233729 MimeEntityHeadersEnd 4234408 MimeMessageHeadersEnd 4234408 Octets 1010 -Lines 19 +Lines 18 MimeEntityEnd 4235418 MimeMessageEnd 4235418 MboxMarkerBegin 4235420 @@ -1125,7 +1125,7 @@ MultipartBoundaryEnd 4236707 MimeEntityBegin 4236707 MimeEntityHeadersEnd 4236753 Octets 417 -Lines 14 +Lines 13 MimeEntityEnd 4237170 MultipartBoundaryBegin 4237170 MultipartBoundaryEnd 4237213 @@ -1138,35 +1138,35 @@ MultipartBoundaryEnd 4237344 MimeEntityBegin 4237344 MimeEntityHeadersEnd 4237438 Octets 229 -Lines 5 +Lines 4 MimeEntityEnd 4237667 MultipartBoundaryBegin 4237667 MultipartBoundaryEnd 4237712 MimeEntityBegin 4237712 MimeEntityHeadersEnd 4237835 Octets 1421 -Lines 38 +Lines 37 MimeEntityEnd 4239256 MultipartBoundaryBegin 4239256 MultipartBoundaryEnd 4239301 MimeEntityBegin 4239301 MimeEntityHeadersEnd 4239395 Octets 157 -Lines 10 +Lines 9 MimeEntityEnd 4239552 MultipartEndBoundaryBegin 4239552 MultipartEndBoundaryEnd 4239597 MultipartEpilogueBegin 4239597 MultipartEpilogueEnd 4239599 Octets 2298 -Lines 68 +Lines 67 MimeEntityEnd 4239599 MultipartEndBoundaryBegin 4239599 MultipartEndBoundaryEnd 4239642 MultipartEpilogueBegin 4239642 MultipartEpilogueEnd 4239644 Octets 3136 -Lines 94 +Lines 93 MimeEntityEnd 4239644 MimeMessageEnd 4239644 MboxMarkerBegin 4239646 @@ -1182,21 +1182,21 @@ MultipartBoundaryEnd 4240358 MimeEntityBegin 4240358 MimeEntityHeadersEnd 4240387 Octets 84 -Lines 7 +Lines 6 MimeEntityEnd 4240471 MultipartBoundaryBegin 4240471 MultipartBoundaryEnd 4240490 MimeEntityBegin 4240490 MimeEntityHeadersEnd 4240553 Octets 5234 -Lines 72 +Lines 71 MimeEntityEnd 4245787 MultipartEndBoundaryBegin 4245787 MultipartEndBoundaryEnd 4245806 MultipartEpilogueBegin 4245806 MultipartEpilogueEnd 4245810 Octets 5469 -Lines 89 +Lines 88 MimeEntityEnd 4245810 MimeMessageEnd 4245810 MboxMarkerBegin 4245812 @@ -1206,7 +1206,7 @@ MimeEntityBegin 4245821 MimeEntityHeadersEnd 4246287 MimeMessageHeadersEnd 4246287 Octets 11599 -Lines 186 +Lines 185 MimeEntityEnd 4257886 MimeMessageEnd 4257886 MboxMarkerBegin 4257888 @@ -1222,7 +1222,7 @@ MultipartBoundaryEnd 4258489 MimeEntityBegin 4258489 MimeEntityHeadersEnd 4258491 Octets 39 -Lines 2 +Lines 1 MimeEntityEnd 4258530 MultipartBoundaryBegin 4258530 MultipartBoundaryEnd 4258544 @@ -1239,11 +1239,11 @@ MimeEntityBegin 4258736 MimeEntityHeadersEnd 4258816 MimeMessageHeadersEnd 4258816 Octets 69 -Lines 3 +Lines 2 MimeEntityEnd 4258885 MimeMessageEnd 4258885 Octets 149 -Lines 6 +Lines 5 MimeEntityEnd 4258885 MultipartBoundaryBegin 4258885 MultipartBoundaryEnd 4258902 @@ -1258,7 +1258,7 @@ Lines 0 MimeEntityEnd 4259173 MimeMessageEnd 4259173 Octets 78 -Lines 3 +Lines 2 MimeEntityEnd 4259173 MultipartBoundaryBegin 4259173 MultipartBoundaryEnd 4259190 @@ -1273,7 +1273,7 @@ Lines 0 MimeEntityEnd 4259401 MimeMessageEnd 4259401 Octets 69 -Lines 3 +Lines 2 MimeEntityEnd 4259401 MultipartBoundaryBegin 4259401 MultipartBoundaryEnd 4259418 @@ -1288,7 +1288,7 @@ Lines 0 MimeEntityEnd 4259605 MimeMessageEnd 4259605 Octets 70 -Lines 3 +Lines 2 MimeEntityEnd 4259605 MultipartBoundaryBegin 4259605 MultipartBoundaryEnd 4259622 @@ -1303,21 +1303,21 @@ Lines 0 MimeEntityEnd 4259801 MimeMessageEnd 4259801 Octets 70 -Lines 3 +Lines 2 MimeEntityEnd 4259801 MultipartEndBoundaryBegin 4259801 MultipartEndBoundaryEnd 4259818 MultipartEpilogueBegin 4259818 MultipartEpilogueEnd 4259820 Octets 1219 -Lines 50 +Lines 49 MimeEntityEnd 4259820 MultipartEndBoundaryBegin 4259820 MultipartEndBoundaryEnd 4259834 MultipartEpilogueBegin 4259834 MultipartEpilogueEnd 4259836 Octets 1359 -Lines 59 +Lines 58 MimeEntityEnd 4259836 MimeMessageEnd 4259836 MboxMarkerBegin 4259838 @@ -1333,7 +1333,7 @@ MultipartBoundaryEnd 4260439 MimeEntityBegin 4260439 MimeEntityHeadersEnd 4260441 Octets 3269 -Lines 66 +Lines 65 MimeEntityEnd 4263710 MultipartBoundaryBegin 4263710 MultipartBoundaryEnd 4263724 @@ -1350,11 +1350,11 @@ MimeEntityBegin 4263922 MimeEntityHeadersEnd 4264002 MimeMessageHeadersEnd 4264002 Octets 69 -Lines 3 +Lines 2 MimeEntityEnd 4264071 MimeMessageEnd 4264071 Octets 149 -Lines 6 +Lines 5 MimeEntityEnd 4264071 MultipartBoundaryBegin 4264071 MultipartBoundaryEnd 4264088 @@ -1369,21 +1369,21 @@ Lines 0 MimeEntityEnd 4264359 MimeMessageEnd 4264359 Octets 78 -Lines 3 +Lines 2 MimeEntityEnd 4264359 MultipartEndBoundaryBegin 4264359 MultipartEndBoundaryEnd 4264376 MultipartEpilogueBegin 4264376 MultipartEpilogueEnd 4264378 Octets 591 -Lines 23 +Lines 22 MimeEntityEnd 4264378 MultipartEndBoundaryBegin 4264378 MultipartEndBoundaryEnd 4264392 MultipartEpilogueBegin 4264392 MultipartEpilogueEnd 4264394 Octets 3967 -Lines 96 +Lines 95 MimeEntityEnd 4264394 MimeMessageEnd 4264394 MboxMarkerBegin 4264396 @@ -1403,11 +1403,11 @@ MimeEntityBegin 4265110 MimeEntityHeadersEnd 4265550 MimeMessageHeadersEnd 4265550 Octets 39 -Lines 3 +Lines 2 MimeEntityEnd 4265589 MimeMessageEnd 4265589 Octets 479 -Lines 14 +Lines 13 MimeEntityEnd 4265589 MultipartBoundaryBegin 4265589 MultipartBoundaryEnd 4265619 @@ -1446,11 +1446,11 @@ MimeEntityBegin 4268396 MimeEntityHeadersEnd 4268836 MimeMessageHeadersEnd 4268836 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 4268874 MimeMessageEnd 4268874 Octets 478 -Lines 13 +Lines 12 MimeEntityEnd 4268874 MultipartBoundaryBegin 4268874 MultipartBoundaryEnd 4268904 @@ -1469,26 +1469,26 @@ MimeEntityBegin 4270190 MimeEntityHeadersEnd 4270611 MimeMessageHeadersEnd 4270611 Octets 6 -Lines 2 +Lines 1 MimeEntityEnd 4270617 MimeMessageEnd 4270617 Octets 427 -Lines 13 +Lines 12 MimeEntityEnd 4270617 MimeMessageEnd 4270617 Octets 952 -Lines 27 +Lines 26 MimeEntityEnd 4270617 MimeMessageEnd 4270617 Octets 1537 -Lines 42 +Lines 41 MimeEntityEnd 4270617 MultipartBoundaryBegin 4270617 MultipartBoundaryEnd 4270647 MimeEntityBegin 4270647 MimeEntityHeadersEnd 4270703 Octets 53 -Lines 2 +Lines 1 MimeEntityEnd 4270756 MultipartEndBoundaryBegin 4270756 MultipartEndBoundaryEnd 4270786 @@ -1515,11 +1515,11 @@ MimeEntityBegin 4271509 MimeEntityHeadersEnd 4271948 MimeMessageHeadersEnd 4271948 Octets 39 -Lines 3 +Lines 2 MimeEntityEnd 4271987 MimeMessageEnd 4271987 Octets 478 -Lines 14 +Lines 13 MimeEntityEnd 4271987 MultipartBoundaryBegin 4271987 MultipartBoundaryEnd 4272017 @@ -1558,11 +1558,11 @@ MimeEntityBegin 4274814 MimeEntityHeadersEnd 4275253 MimeMessageHeadersEnd 4275253 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 4275291 MimeMessageEnd 4275291 Octets 477 -Lines 13 +Lines 12 MimeEntityEnd 4275291 MultipartBoundaryBegin 4275291 MultipartBoundaryEnd 4275321 @@ -1581,26 +1581,26 @@ MimeEntityBegin 4276617 MimeEntityHeadersEnd 4277037 MimeMessageHeadersEnd 4277037 Octets 6 -Lines 2 +Lines 1 MimeEntityEnd 4277043 MimeMessageEnd 4277043 Octets 426 -Lines 13 +Lines 12 MimeEntityEnd 4277043 MimeMessageEnd 4277043 Octets 954 -Lines 27 +Lines 26 MimeEntityEnd 4277043 MimeMessageEnd 4277043 Octets 1542 -Lines 42 +Lines 41 MimeEntityEnd 4277043 MultipartBoundaryBegin 4277043 MultipartBoundaryEnd 4277073 MimeEntityBegin 4277073 MimeEntityHeadersEnd 4277133 Octets 53 -Lines 2 +Lines 1 MimeEntityEnd 4277186 MultipartEndBoundaryBegin 4277186 MultipartEndBoundaryEnd 4277216 @@ -1623,14 +1623,14 @@ MultipartBoundaryEnd 4277981 MimeEntityBegin 4277981 MimeEntityHeadersEnd 4278012 Octets 446 -Lines 31 +Lines 30 MimeEntityEnd 4278458 MultipartBoundaryBegin 4278458 MultipartBoundaryEnd 4278467 MimeEntityBegin 4278467 MimeEntityHeadersEnd 4278543 Octets 673 -Lines 43 +Lines 42 MimeEntityEnd 4279216 MultipartBoundaryBegin 4279216 MultipartBoundaryEnd 4279225 @@ -1668,7 +1668,7 @@ MultipartBoundaryEnd 4279596 MimeEntityBegin 4279596 MimeEntityHeadersEnd 4279776 Octets 39 -Lines 2 +Lines 1 MimeEntityEnd 4279815 MultipartEndBoundaryBegin 4279815 MultipartEndBoundaryEnd 4279824 @@ -1693,7 +1693,7 @@ MultipartBoundaryEnd 4289481 MimeEntityBegin 4289481 MimeEntityHeadersEnd 4289661 Octets 39 -Lines 2 +Lines 1 MimeEntityEnd 4289700 MultipartBoundaryBegin 4289700 MultipartBoundaryEnd 4289709 @@ -1832,14 +1832,14 @@ MultipartBoundaryEnd 4372232 MimeEntityBegin 4372232 MimeEntityHeadersEnd 4372234 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 4372234 MultipartEndBoundaryBegin 4372234 MultipartEndBoundaryEnd 4372263 MultipartEpilogueBegin 4372263 MultipartEpilogueEnd 4372265 Octets 73202 -Lines 410 +Lines 409 MimeEntityEnd 4372265 MimeMessageEnd 4372265 MboxMarkerBegin 4372267 @@ -1849,7 +1849,7 @@ MimeEntityBegin 4372276 MimeEntityHeadersEnd 4373229 MimeMessageHeadersEnd 4373229 Octets 252471 -Lines 3431 +Lines 3430 MimeEntityEnd 4625700 MimeMessageEnd 4625700 MboxMarkerBegin 4625702 @@ -1865,56 +1865,56 @@ MultipartBoundaryEnd 4626905 MimeEntityBegin 4626905 MimeEntityHeadersEnd 4626981 Octets 473 -Lines 10 +Lines 9 MimeEntityEnd 4627454 MultipartBoundaryBegin 4627454 MultipartBoundaryEnd 4627502 MimeEntityBegin 4627502 MimeEntityHeadersEnd 4627564 Octets 24568 -Lines 333 +Lines 332 MimeEntityEnd 4652132 MultipartBoundaryBegin 4652132 MultipartBoundaryEnd 4652180 MimeEntityBegin 4652180 MimeEntityHeadersEnd 4652256 Octets 458 -Lines 11 +Lines 10 MimeEntityEnd 4652714 MultipartBoundaryBegin 4652714 MultipartBoundaryEnd 4652762 MimeEntityBegin 4652762 MimeEntityHeadersEnd 4652824 Octets 11368 -Lines 155 +Lines 154 MimeEntityEnd 4664192 MultipartBoundaryBegin 4664192 MultipartBoundaryEnd 4664240 MimeEntityBegin 4664240 MimeEntityHeadersEnd 4664316 Octets 310 -Lines 7 +Lines 6 MimeEntityEnd 4664626 MultipartBoundaryBegin 4664626 MultipartBoundaryEnd 4664674 MimeEntityBegin 4664674 MimeEntityHeadersEnd 4664736 Octets 16676 -Lines 227 +Lines 226 MimeEntityEnd 4681412 MultipartBoundaryBegin 4681412 MultipartBoundaryEnd 4681460 MimeEntityBegin 4681460 MimeEntityHeadersEnd 4681536 Octets 675 -Lines 16 +Lines 15 MimeEntityEnd 4682211 MultipartEndBoundaryBegin 4682211 MultipartEndBoundaryEnd 4682259 MultipartEpilogueBegin 4682259 MultipartEpilogueEnd 4682261 Octets 55601 -Lines 793 +Lines 792 MimeEntityEnd 4682261 MimeMessageEnd 4682261 MboxMarkerBegin 4682263 @@ -1930,7 +1930,7 @@ MultipartBoundaryEnd 4683137 MimeEntityBegin 4683137 MimeEntityHeadersEnd 4683139 Octets 668 -Lines 19 +Lines 18 MimeEntityEnd 4683807 MultipartBoundaryBegin 4683807 MultipartBoundaryEnd 4683839 @@ -1944,7 +1944,7 @@ MultipartEndBoundaryEnd 4731148 MultipartEpilogueBegin 4731148 MultipartEpilogueEnd 4731150 Octets 48043 -Lines 789 +Lines 788 MimeEntityEnd 4731150 MimeMessageEnd 4731150 MboxMarkerBegin 4731152 @@ -1960,35 +1960,35 @@ MultipartBoundaryEnd 4732387 MimeEntityBegin 4732387 MimeEntityHeadersEnd 4732463 Octets 5475 -Lines 161 +Lines 160 MimeEntityEnd 4737938 MultipartBoundaryBegin 4737938 MultipartBoundaryEnd 4737964 MimeEntityBegin 4737964 MimeEntityHeadersEnd 4738065 Octets 2616 -Lines 37 +Lines 36 MimeEntityEnd 4740681 MultipartBoundaryBegin 4740681 MultipartBoundaryEnd 4740707 MimeEntityBegin 4740707 MimeEntityHeadersEnd 4740783 Octets 528 -Lines 11 +Lines 10 MimeEntityEnd 4741311 MultipartBoundaryBegin 4741311 MultipartBoundaryEnd 4741337 MimeEntityBegin 4741337 MimeEntityHeadersEnd 4741455 Octets 23376 -Lines 317 +Lines 316 MimeEntityEnd 4764831 MultipartBoundaryBegin 4764831 MultipartBoundaryEnd 4764857 MimeEntityBegin 4764857 MimeEntityHeadersEnd 4764933 Octets 592 -Lines 15 +Lines 14 MimeEntityEnd 4765525 MultipartBoundaryBegin 4765525 MultipartBoundaryEnd 4765551 @@ -2003,14 +2003,14 @@ Lines 0 MimeEntityEnd 4765711 MimeMessageEnd 4765711 Octets 71 -Lines 3 +Lines 2 MimeEntityEnd 4765711 MultipartBoundaryBegin 4765711 MultipartBoundaryEnd 4765737 MimeEntityBegin 4765737 MimeEntityHeadersEnd 4765813 Octets 281 -Lines 6 +Lines 5 MimeEntityEnd 4766094 MultipartBoundaryBegin 4766094 MultipartBoundaryEnd 4766120 @@ -2025,14 +2025,14 @@ Lines 0 MimeEntityEnd 4766344 MimeMessageEnd 4766344 Octets 71 -Lines 3 +Lines 2 MimeEntityEnd 4766344 MultipartBoundaryBegin 4766344 MultipartBoundaryEnd 4766370 MimeEntityBegin 4766370 MimeEntityHeadersEnd 4766446 Octets 1103 -Lines 35 +Lines 34 MimeEntityEnd 4767549 MultipartEndBoundaryBegin 4767549 MultipartEndBoundaryEnd 4767575 @@ -2055,7 +2055,7 @@ MultipartBoundaryEnd 4767766 MimeEntityBegin 4767766 MimeEntityHeadersEnd 4767838 Octets 77489 -Lines 1146 +Lines 1145 MimeEntityEnd 4845327 MultipartBoundaryBegin 4845327 MultipartBoundaryEnd 4845342 @@ -2085,21 +2085,21 @@ MultipartBoundaryEnd 4846677 MimeEntityBegin 4846677 MimeEntityHeadersEnd 4846723 Octets 460 -Lines 9 +Lines 8 MimeEntityEnd 4847183 MultipartBoundaryBegin 4847183 MultipartBoundaryEnd 4847224 MimeEntityBegin 4847224 MimeEntityHeadersEnd 4847321 Octets 129838 -Lines 2096 +Lines 2095 MimeEntityEnd 4977159 MultipartEndBoundaryBegin 4977159 MultipartEndBoundaryEnd 4977200 MultipartEpilogueBegin 4977200 MultipartEpilogueEnd 4977202 Octets 130564 -Lines 2115 +Lines 2114 MimeEntityEnd 4977202 MimeMessageEnd 4977202 MboxMarkerBegin 4977204 @@ -2115,7 +2115,7 @@ MultipartBoundaryEnd 4978386 MimeEntityBegin 4978386 MimeEntityHeadersEnd 4978388 Octets 813 -Lines 19 +Lines 18 MimeEntityEnd 4979201 MultipartBoundaryBegin 4979201 MultipartBoundaryEnd 4979262 @@ -2128,56 +2128,56 @@ MultipartBoundaryEnd 4979429 MimeEntityBegin 4979429 MimeEntityHeadersEnd 4979505 Octets 496 -Lines 8 +Lines 7 MimeEntityEnd 4980001 MultipartBoundaryBegin 4980001 MultipartBoundaryEnd 4980064 MimeEntityBegin 4980064 MimeEntityHeadersEnd 4980164 Octets 13180 -Lines 191 +Lines 190 MimeEntityEnd 4993344 MultipartBoundaryBegin 4993344 MultipartBoundaryEnd 4993407 MimeEntityBegin 4993407 MimeEntityHeadersEnd 4993480 Octets 21 -Lines 2 +Lines 1 MimeEntityEnd 4993501 MultipartBoundaryBegin 4993501 MultipartBoundaryEnd 4993564 MimeEntityBegin 4993564 MimeEntityHeadersEnd 4993664 Octets 56484 -Lines 765 +Lines 764 MimeEntityEnd 5050148 MultipartBoundaryBegin 5050148 MultipartBoundaryEnd 5050211 MimeEntityBegin 5050211 MimeEntityHeadersEnd 5050284 Octets 57 -Lines 6 +Lines 5 MimeEntityEnd 5050341 MultipartBoundaryBegin 5050341 MultipartBoundaryEnd 5050404 MimeEntityBegin 5050404 MimeEntityHeadersEnd 5050468 Octets 103552 -Lines 1401 +Lines 1400 MimeEntityEnd 5154020 MultipartBoundaryBegin 5154020 MultipartBoundaryEnd 5154083 MimeEntityBegin 5154083 MimeEntityHeadersEnd 5154156 Octets 4 -Lines 3 +Lines 2 MimeEntityEnd 5154160 MultipartEndBoundaryBegin 5154160 MultipartEndBoundaryEnd 5154223 MultipartEpilogueBegin 5154223 MultipartEpilogueEnd 5154225 Octets 174857 -Lines 2408 +Lines 2407 MimeEntityEnd 5154225 MultipartEndBoundaryBegin 5154225 MultipartEndBoundaryEnd 5154286 @@ -2200,7 +2200,7 @@ MultipartBoundaryEnd 5155198 MimeEntityBegin 5155198 MimeEntityHeadersEnd 5155244 Octets 1544 -Lines 30 +Lines 29 MimeEntityEnd 5156788 MultipartBoundaryBegin 5156788 MultipartBoundaryEnd 5156831 @@ -2213,112 +2213,112 @@ MultipartBoundaryEnd 5156962 MimeEntityBegin 5156962 MimeEntityHeadersEnd 5157056 Octets 920 -Lines 14 +Lines 13 MimeEntityEnd 5157976 MultipartBoundaryBegin 5157976 MultipartBoundaryEnd 5158021 MimeEntityBegin 5158021 MimeEntityHeadersEnd 5158116 Octets 35364 -Lines 507 +Lines 506 MimeEntityEnd 5193480 MultipartBoundaryBegin 5193480 MultipartBoundaryEnd 5193525 MimeEntityBegin 5193525 MimeEntityHeadersEnd 5193619 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 5193631 MultipartBoundaryBegin 5193631 MultipartBoundaryEnd 5193676 MimeEntityBegin 5193676 MimeEntityHeadersEnd 5193771 Octets 21644 -Lines 311 +Lines 310 MimeEntityEnd 5215415 MultipartBoundaryBegin 5215415 MultipartBoundaryEnd 5215460 MimeEntityBegin 5215460 MimeEntityHeadersEnd 5215554 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 5215566 MultipartBoundaryBegin 5215566 MultipartBoundaryEnd 5215611 MimeEntityBegin 5215611 MimeEntityHeadersEnd 5215706 Octets 32914 -Lines 472 +Lines 471 MimeEntityEnd 5248620 MultipartBoundaryBegin 5248620 MultipartBoundaryEnd 5248665 MimeEntityBegin 5248665 MimeEntityHeadersEnd 5248759 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 5248771 MultipartBoundaryBegin 5248771 MultipartBoundaryEnd 5248816 MimeEntityBegin 5248816 MimeEntityHeadersEnd 5248911 Octets 33926 -Lines 486 +Lines 485 MimeEntityEnd 5282837 MultipartBoundaryBegin 5282837 MultipartBoundaryEnd 5282882 MimeEntityBegin 5282882 MimeEntityHeadersEnd 5282976 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 5282988 MultipartBoundaryBegin 5282988 MultipartBoundaryEnd 5283033 MimeEntityBegin 5283033 MimeEntityHeadersEnd 5283128 Octets 28240 -Lines 405 +Lines 404 MimeEntityEnd 5311368 MultipartBoundaryBegin 5311368 MultipartBoundaryEnd 5311413 MimeEntityBegin 5311413 MimeEntityHeadersEnd 5311507 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 5311519 MultipartBoundaryBegin 5311519 MultipartBoundaryEnd 5311564 MimeEntityBegin 5311564 MimeEntityHeadersEnd 5311659 Octets 33980 -Lines 487 +Lines 486 MimeEntityEnd 5345639 MultipartBoundaryBegin 5345639 MultipartBoundaryEnd 5345684 MimeEntityBegin 5345684 MimeEntityHeadersEnd 5345778 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 5345790 MultipartBoundaryBegin 5345790 MultipartBoundaryEnd 5345835 MimeEntityBegin 5345835 MimeEntityHeadersEnd 5345930 Octets 27046 -Lines 388 +Lines 387 MimeEntityEnd 5372976 MultipartBoundaryBegin 5372976 MultipartBoundaryEnd 5373021 MimeEntityBegin 5373021 MimeEntityHeadersEnd 5373115 Octets 77 -Lines 4 +Lines 3 MimeEntityEnd 5373192 MultipartEndBoundaryBegin 5373192 MultipartEndBoundaryEnd 5373237 MultipartEpilogueBegin 5373237 MultipartEpilogueEnd 5373239 Octets 216320 -Lines 3161 +Lines 3160 MimeEntityEnd 5373239 MultipartEndBoundaryBegin 5373239 MultipartEndBoundaryEnd 5373282 @@ -2341,28 +2341,28 @@ MultipartBoundaryEnd 5373947 MimeEntityBegin 5373947 MimeEntityHeadersEnd 5374045 Octets 212 -Lines 10 +Lines 9 MimeEntityEnd 5374257 MultipartBoundaryBegin 5374257 MultipartBoundaryEnd 5374309 MimeEntityBegin 5374309 MimeEntityHeadersEnd 5374373 Octets 89812 -Lines 1215 +Lines 1214 MimeEntityEnd 5464185 MultipartBoundaryBegin 5464185 MultipartBoundaryEnd 5464237 MimeEntityBegin 5464237 MimeEntityHeadersEnd 5464265 Octets 31 -Lines 2 +Lines 1 MimeEntityEnd 5464296 MultipartEndBoundaryBegin 5464296 MultipartEndBoundaryEnd 5464348 MultipartEpilogueBegin 5464348 MultipartEpilogueEnd 5464350 Octets 90652 -Lines 1244 +Lines 1243 MimeEntityEnd 5464350 MimeMessageEnd 5464350 MboxMarkerBegin 5464352 @@ -2372,7 +2372,7 @@ MimeEntityBegin 5464361 MimeEntityHeadersEnd 5465317 MimeMessageHeadersEnd 5465317 Octets 51405 -Lines 697 +Lines 696 MimeEntityEnd 5516722 MimeMessageEnd 5516722 MboxMarkerBegin 5516724 @@ -2388,7 +2388,7 @@ MultipartBoundaryEnd 5517381 MimeEntityBegin 5517381 MimeEntityHeadersEnd 5517383 Octets 4418 -Lines 102 +Lines 101 MimeEntityEnd 5521801 MultipartBoundaryBegin 5521801 MultipartBoundaryEnd 5521822 @@ -2405,11 +2405,11 @@ MimeEntityBegin 5522000 MimeEntityHeadersEnd 5522109 MimeMessageHeadersEnd 5522109 Octets 639 -Lines 19 +Lines 18 MimeEntityEnd 5522748 MimeMessageEnd 5522748 Octets 748 -Lines 23 +Lines 22 MimeEntityEnd 5522748 MultipartBoundaryBegin 5522748 MultipartBoundaryEnd 5522782 @@ -2420,11 +2420,11 @@ MimeEntityBegin 5522784 MimeEntityHeadersEnd 5522909 MimeMessageHeadersEnd 5522909 Octets 753 -Lines 21 +Lines 20 MimeEntityEnd 5523662 MimeMessageEnd 5523662 Octets 878 -Lines 25 +Lines 24 MimeEntityEnd 5523662 MultipartBoundaryBegin 5523662 MultipartBoundaryEnd 5523696 @@ -2435,11 +2435,11 @@ MimeEntityBegin 5523698 MimeEntityHeadersEnd 5523821 MimeMessageHeadersEnd 5523821 Octets 660 -Lines 15 +Lines 14 MimeEntityEnd 5524481 MimeMessageEnd 5524481 Octets 783 -Lines 19 +Lines 18 MimeEntityEnd 5524481 MultipartBoundaryBegin 5524481 MultipartBoundaryEnd 5524515 @@ -2450,11 +2450,11 @@ MimeEntityBegin 5524517 MimeEntityHeadersEnd 5524677 MimeMessageHeadersEnd 5524677 Octets 493 -Lines 11 +Lines 10 MimeEntityEnd 5525170 MimeMessageEnd 5525170 Octets 653 -Lines 15 +Lines 14 MimeEntityEnd 5525170 MultipartBoundaryBegin 5525170 MultipartBoundaryEnd 5525204 @@ -2465,11 +2465,11 @@ MimeEntityBegin 5525206 MimeEntityHeadersEnd 5525364 MimeMessageHeadersEnd 5525364 Octets 587 -Lines 16 +Lines 15 MimeEntityEnd 5525951 MimeMessageEnd 5525951 Octets 745 -Lines 20 +Lines 19 MimeEntityEnd 5525951 MultipartBoundaryBegin 5525951 MultipartBoundaryEnd 5525985 @@ -2480,11 +2480,11 @@ MimeEntityBegin 5525987 MimeEntityHeadersEnd 5526148 MimeMessageHeadersEnd 5526148 Octets 1301 -Lines 27 +Lines 26 MimeEntityEnd 5527449 MimeMessageEnd 5527449 Octets 1462 -Lines 31 +Lines 30 MimeEntityEnd 5527449 MultipartBoundaryBegin 5527449 MultipartBoundaryEnd 5527483 @@ -2495,11 +2495,11 @@ MimeEntityBegin 5527485 MimeEntityHeadersEnd 5527642 MimeMessageHeadersEnd 5527642 Octets 410 -Lines 10 +Lines 9 MimeEntityEnd 5528052 MimeMessageEnd 5528052 Octets 567 -Lines 14 +Lines 13 MimeEntityEnd 5528052 MultipartBoundaryBegin 5528052 MultipartBoundaryEnd 5528086 @@ -2510,11 +2510,11 @@ MimeEntityBegin 5528088 MimeEntityHeadersEnd 5528239 MimeMessageHeadersEnd 5528239 Octets 403 -Lines 8 +Lines 7 MimeEntityEnd 5528642 MimeMessageEnd 5528642 Octets 554 -Lines 12 +Lines 11 MimeEntityEnd 5528642 MultipartBoundaryBegin 5528642 MultipartBoundaryEnd 5528676 @@ -2525,11 +2525,11 @@ MimeEntityBegin 5528678 MimeEntityHeadersEnd 5528825 MimeMessageHeadersEnd 5528825 Octets 651 -Lines 12 +Lines 11 MimeEntityEnd 5529476 MimeMessageEnd 5529476 Octets 798 -Lines 16 +Lines 15 MimeEntityEnd 5529476 MultipartBoundaryBegin 5529476 MultipartBoundaryEnd 5529510 @@ -2540,11 +2540,11 @@ MimeEntityBegin 5529512 MimeEntityHeadersEnd 5529653 MimeMessageHeadersEnd 5529653 Octets 996 -Lines 20 +Lines 19 MimeEntityEnd 5530649 MimeMessageEnd 5530649 Octets 1137 -Lines 24 +Lines 23 MimeEntityEnd 5530649 MultipartBoundaryBegin 5530649 MultipartBoundaryEnd 5530683 @@ -2555,11 +2555,11 @@ MimeEntityBegin 5530685 MimeEntityHeadersEnd 5530836 MimeMessageHeadersEnd 5530836 Octets 917 -Lines 28 +Lines 27 MimeEntityEnd 5531753 MimeMessageEnd 5531753 Octets 1068 -Lines 32 +Lines 31 MimeEntityEnd 5531753 MultipartBoundaryBegin 5531753 MultipartBoundaryEnd 5531787 @@ -2570,11 +2570,11 @@ MimeEntityBegin 5531789 MimeEntityHeadersEnd 5531924 MimeMessageHeadersEnd 5531924 Octets 570 -Lines 12 +Lines 11 MimeEntityEnd 5532494 MimeMessageEnd 5532494 Octets 705 -Lines 16 +Lines 15 MimeEntityEnd 5532494 MultipartBoundaryBegin 5532494 MultipartBoundaryEnd 5532528 @@ -2585,11 +2585,11 @@ MimeEntityBegin 5532530 MimeEntityHeadersEnd 5532666 MimeMessageHeadersEnd 5532666 Octets 447 -Lines 11 +Lines 10 MimeEntityEnd 5533113 MimeMessageEnd 5533113 Octets 583 -Lines 15 +Lines 14 MimeEntityEnd 5533113 MultipartBoundaryBegin 5533113 MultipartBoundaryEnd 5533147 @@ -2600,11 +2600,11 @@ MimeEntityBegin 5533149 MimeEntityHeadersEnd 5533270 MimeMessageHeadersEnd 5533270 Octets 567 -Lines 16 +Lines 15 MimeEntityEnd 5533837 MimeMessageEnd 5533837 Octets 688 -Lines 20 +Lines 19 MimeEntityEnd 5533837 MultipartBoundaryBegin 5533837 MultipartBoundaryEnd 5533871 @@ -2615,11 +2615,11 @@ MimeEntityBegin 5533873 MimeEntityHeadersEnd 5533992 MimeMessageHeadersEnd 5533992 Octets 193 -Lines 9 +Lines 8 MimeEntityEnd 5534185 MimeMessageEnd 5534185 Octets 312 -Lines 13 +Lines 12 MimeEntityEnd 5534185 MultipartBoundaryBegin 5534185 MultipartBoundaryEnd 5534219 @@ -2630,11 +2630,11 @@ MimeEntityBegin 5534221 MimeEntityHeadersEnd 5534342 MimeMessageHeadersEnd 5534342 Octets 335 -Lines 8 +Lines 7 MimeEntityEnd 5534677 MimeMessageEnd 5534677 Octets 456 -Lines 12 +Lines 11 MimeEntityEnd 5534677 MultipartBoundaryBegin 5534677 MultipartBoundaryEnd 5534711 @@ -2645,11 +2645,11 @@ MimeEntityBegin 5534713 MimeEntityHeadersEnd 5534840 MimeMessageHeadersEnd 5534840 Octets 688 -Lines 22 +Lines 21 MimeEntityEnd 5535528 MimeMessageEnd 5535528 Octets 815 -Lines 26 +Lines 25 MimeEntityEnd 5535528 MultipartBoundaryBegin 5535528 MultipartBoundaryEnd 5535562 @@ -2660,11 +2660,11 @@ MimeEntityBegin 5535564 MimeEntityHeadersEnd 5535692 MimeMessageHeadersEnd 5535692 Octets 107 -Lines 6 +Lines 5 MimeEntityEnd 5535799 MimeMessageEnd 5535799 Octets 235 -Lines 10 +Lines 9 MimeEntityEnd 5535799 MultipartBoundaryBegin 5535799 MultipartBoundaryEnd 5535833 @@ -2675,11 +2675,11 @@ MimeEntityBegin 5535835 MimeEntityHeadersEnd 5535981 MimeMessageHeadersEnd 5535981 Octets 857 -Lines 22 +Lines 21 MimeEntityEnd 5536838 MimeMessageEnd 5536838 Octets 1003 -Lines 26 +Lines 25 MimeEntityEnd 5536838 MultipartBoundaryBegin 5536838 MultipartBoundaryEnd 5536872 @@ -2690,11 +2690,11 @@ MimeEntityBegin 5536874 MimeEntityHeadersEnd 5536988 MimeMessageHeadersEnd 5536988 Octets 428 -Lines 10 +Lines 9 MimeEntityEnd 5537416 MimeMessageEnd 5537416 Octets 542 -Lines 14 +Lines 13 MimeEntityEnd 5537416 MultipartBoundaryBegin 5537416 MultipartBoundaryEnd 5537450 @@ -2705,11 +2705,11 @@ MimeEntityBegin 5537452 MimeEntityHeadersEnd 5537628 MimeMessageHeadersEnd 5537628 Octets 239 -Lines 10 +Lines 9 MimeEntityEnd 5537867 MimeMessageEnd 5537867 Octets 415 -Lines 14 +Lines 13 MimeEntityEnd 5537867 MultipartBoundaryBegin 5537867 MultipartBoundaryEnd 5537901 @@ -2720,11 +2720,11 @@ MimeEntityBegin 5537903 MimeEntityHeadersEnd 5538033 MimeMessageHeadersEnd 5538033 Octets 411 -Lines 13 +Lines 12 MimeEntityEnd 5538444 MimeMessageEnd 5538444 Octets 541 -Lines 17 +Lines 16 MimeEntityEnd 5538444 MultipartBoundaryBegin 5538444 MultipartBoundaryEnd 5538478 @@ -2735,11 +2735,11 @@ MimeEntityBegin 5538480 MimeEntityHeadersEnd 5538601 MimeMessageHeadersEnd 5538601 Octets 932 -Lines 29 +Lines 28 MimeEntityEnd 5539533 MimeMessageEnd 5539533 Octets 1053 -Lines 33 +Lines 32 MimeEntityEnd 5539533 MultipartBoundaryBegin 5539533 MultipartBoundaryEnd 5539567 @@ -2750,11 +2750,11 @@ MimeEntityBegin 5539569 MimeEntityHeadersEnd 5539701 MimeMessageHeadersEnd 5539701 Octets 300 -Lines 10 +Lines 9 MimeEntityEnd 5540001 MimeMessageEnd 5540001 Octets 432 -Lines 14 +Lines 13 MimeEntityEnd 5540001 MultipartBoundaryBegin 5540001 MultipartBoundaryEnd 5540035 @@ -2765,11 +2765,11 @@ MimeEntityBegin 5540037 MimeEntityHeadersEnd 5540170 MimeMessageHeadersEnd 5540170 Octets 424 -Lines 15 +Lines 14 MimeEntityEnd 5540594 MimeMessageEnd 5540594 Octets 557 -Lines 19 +Lines 18 MimeEntityEnd 5540594 MultipartBoundaryBegin 5540594 MultipartBoundaryEnd 5540628 @@ -2780,11 +2780,11 @@ MimeEntityBegin 5540630 MimeEntityHeadersEnd 5540749 MimeMessageHeadersEnd 5540749 Octets 149 -Lines 5 +Lines 4 MimeEntityEnd 5540898 MimeMessageEnd 5540898 Octets 268 -Lines 9 +Lines 8 MimeEntityEnd 5540898 MultipartBoundaryBegin 5540898 MultipartBoundaryEnd 5540932 @@ -2795,11 +2795,11 @@ MimeEntityBegin 5540934 MimeEntityHeadersEnd 5541063 MimeMessageHeadersEnd 5541063 Octets 186 -Lines 8 +Lines 7 MimeEntityEnd 5541249 MimeMessageEnd 5541249 Octets 315 -Lines 12 +Lines 11 MimeEntityEnd 5541249 MultipartBoundaryBegin 5541249 MultipartBoundaryEnd 5541283 @@ -2810,11 +2810,11 @@ MimeEntityBegin 5541285 MimeEntityHeadersEnd 5541419 MimeMessageHeadersEnd 5541419 Octets 730 -Lines 15 +Lines 14 MimeEntityEnd 5542149 MimeMessageEnd 5542149 Octets 864 -Lines 19 +Lines 18 MimeEntityEnd 5542149 MultipartBoundaryBegin 5542149 MultipartBoundaryEnd 5542183 @@ -2825,11 +2825,11 @@ MimeEntityBegin 5542185 MimeEntityHeadersEnd 5542335 MimeMessageHeadersEnd 5542335 Octets 983 -Lines 27 +Lines 26 MimeEntityEnd 5543318 MimeMessageEnd 5543318 Octets 1133 -Lines 31 +Lines 30 MimeEntityEnd 5543318 MultipartBoundaryBegin 5543318 MultipartBoundaryEnd 5543352 @@ -2840,11 +2840,11 @@ MimeEntityBegin 5543354 MimeEntityHeadersEnd 5543492 MimeMessageHeadersEnd 5543492 Octets 254 -Lines 8 +Lines 7 MimeEntityEnd 5543746 MimeMessageEnd 5543746 Octets 392 -Lines 12 +Lines 11 MimeEntityEnd 5543746 MultipartBoundaryBegin 5543746 MultipartBoundaryEnd 5543780 @@ -2855,11 +2855,11 @@ MimeEntityBegin 5543782 MimeEntityHeadersEnd 5543908 MimeMessageHeadersEnd 5543908 Octets 133 -Lines 7 +Lines 6 MimeEntityEnd 5544041 MimeMessageEnd 5544041 Octets 259 -Lines 11 +Lines 10 MimeEntityEnd 5544041 MultipartBoundaryBegin 5544041 MultipartBoundaryEnd 5544075 @@ -2870,11 +2870,11 @@ MimeEntityBegin 5544077 MimeEntityHeadersEnd 5544257 MimeMessageHeadersEnd 5544257 Octets 761 -Lines 17 +Lines 16 MimeEntityEnd 5545018 MimeMessageEnd 5545018 Octets 941 -Lines 22 +Lines 21 MimeEntityEnd 5545018 MultipartBoundaryBegin 5545018 MultipartBoundaryEnd 5545052 @@ -2885,11 +2885,11 @@ MimeEntityBegin 5545054 MimeEntityHeadersEnd 5545218 MimeMessageHeadersEnd 5545218 Octets 415 -Lines 17 +Lines 16 MimeEntityEnd 5545633 MimeMessageEnd 5545633 Octets 579 -Lines 21 +Lines 20 MimeEntityEnd 5545633 MultipartBoundaryBegin 5545633 MultipartBoundaryEnd 5545667 @@ -2900,11 +2900,11 @@ MimeEntityBegin 5545669 MimeEntityHeadersEnd 5545805 MimeMessageHeadersEnd 5545805 Octets 1308 -Lines 22 +Lines 21 MimeEntityEnd 5547113 MimeMessageEnd 5547113 Octets 1444 -Lines 26 +Lines 25 MimeEntityEnd 5547113 MultipartBoundaryBegin 5547113 MultipartBoundaryEnd 5547147 @@ -2915,11 +2915,11 @@ MimeEntityBegin 5547149 MimeEntityHeadersEnd 5547259 MimeMessageHeadersEnd 5547259 Octets 149 -Lines 7 +Lines 6 MimeEntityEnd 5547408 MimeMessageEnd 5547408 Octets 259 -Lines 11 +Lines 10 MimeEntityEnd 5547408 MultipartBoundaryBegin 5547408 MultipartBoundaryEnd 5547442 @@ -2930,11 +2930,11 @@ MimeEntityBegin 5547444 MimeEntityHeadersEnd 5547585 MimeMessageHeadersEnd 5547585 Octets 310 -Lines 12 +Lines 11 MimeEntityEnd 5547895 MimeMessageEnd 5547895 Octets 451 -Lines 16 +Lines 15 MimeEntityEnd 5547895 MultipartBoundaryBegin 5547895 MultipartBoundaryEnd 5547929 @@ -2945,11 +2945,11 @@ MimeEntityBegin 5547931 MimeEntityHeadersEnd 5548061 MimeMessageHeadersEnd 5548061 Octets 193 -Lines 7 +Lines 6 MimeEntityEnd 5548254 MimeMessageEnd 5548254 Octets 323 -Lines 11 +Lines 10 MimeEntityEnd 5548254 MultipartBoundaryBegin 5548254 MultipartBoundaryEnd 5548288 @@ -2960,11 +2960,11 @@ MimeEntityBegin 5548290 MimeEntityHeadersEnd 5548399 MimeMessageHeadersEnd 5548399 Octets 410 -Lines 13 +Lines 12 MimeEntityEnd 5548809 MimeMessageEnd 5548809 Octets 519 -Lines 17 +Lines 16 MimeEntityEnd 5548809 MultipartBoundaryBegin 5548809 MultipartBoundaryEnd 5548843 @@ -2975,11 +2975,11 @@ MimeEntityBegin 5548845 MimeEntityHeadersEnd 5548983 MimeMessageHeadersEnd 5548983 Octets 310 -Lines 9 +Lines 8 MimeEntityEnd 5549293 MimeMessageEnd 5549293 Octets 448 -Lines 13 +Lines 12 MimeEntityEnd 5549293 MultipartBoundaryBegin 5549293 MultipartBoundaryEnd 5549327 @@ -2990,11 +2990,11 @@ MimeEntityBegin 5549329 MimeEntityHeadersEnd 5549476 MimeMessageHeadersEnd 5549476 Octets 635 -Lines 18 +Lines 17 MimeEntityEnd 5550111 MimeMessageEnd 5550111 Octets 782 -Lines 22 +Lines 21 MimeEntityEnd 5550111 MultipartBoundaryBegin 5550111 MultipartBoundaryEnd 5550145 @@ -3005,11 +3005,11 @@ MimeEntityBegin 5550147 MimeEntityHeadersEnd 5550304 MimeMessageHeadersEnd 5550304 Octets 485 -Lines 11 +Lines 10 MimeEntityEnd 5550789 MimeMessageEnd 5550789 Octets 642 -Lines 15 +Lines 14 MimeEntityEnd 5550789 MultipartBoundaryBegin 5550789 MultipartBoundaryEnd 5550823 @@ -3020,11 +3020,11 @@ MimeEntityBegin 5550825 MimeEntityHeadersEnd 5550962 MimeMessageHeadersEnd 5550962 Octets 1199 -Lines 28 +Lines 27 MimeEntityEnd 5552161 MimeMessageEnd 5552161 Octets 1336 -Lines 32 +Lines 31 MimeEntityEnd 5552161 MultipartBoundaryBegin 5552161 MultipartBoundaryEnd 5552195 @@ -3035,11 +3035,11 @@ MimeEntityBegin 5552197 MimeEntityHeadersEnd 5552377 MimeMessageHeadersEnd 5552377 Octets 267 -Lines 9 +Lines 8 MimeEntityEnd 5552644 MimeMessageEnd 5552644 Octets 447 -Lines 13 +Lines 12 MimeEntityEnd 5552644 MultipartBoundaryBegin 5552644 MultipartBoundaryEnd 5552678 @@ -3050,11 +3050,11 @@ MimeEntityBegin 5552680 MimeEntityHeadersEnd 5552799 MimeMessageHeadersEnd 5552799 Octets 197 -Lines 5 +Lines 4 MimeEntityEnd 5552996 MimeMessageEnd 5552996 Octets 316 -Lines 9 +Lines 8 MimeEntityEnd 5552996 MultipartBoundaryBegin 5552996 MultipartBoundaryEnd 5553030 @@ -3065,11 +3065,11 @@ MimeEntityBegin 5553032 MimeEntityHeadersEnd 5553176 MimeMessageHeadersEnd 5553176 Octets 889 -Lines 25 +Lines 24 MimeEntityEnd 5554065 MimeMessageEnd 5554065 Octets 1033 -Lines 29 +Lines 28 MimeEntityEnd 5554065 MultipartBoundaryBegin 5554065 MultipartBoundaryEnd 5554099 @@ -3080,11 +3080,11 @@ MimeEntityBegin 5554101 MimeEntityHeadersEnd 5554230 MimeMessageHeadersEnd 5554230 Octets 725 -Lines 12 +Lines 11 MimeEntityEnd 5554955 MimeMessageEnd 5554955 Octets 854 -Lines 16 +Lines 15 MimeEntityEnd 5554955 MultipartBoundaryBegin 5554955 MultipartBoundaryEnd 5554989 @@ -3095,11 +3095,11 @@ MimeEntityBegin 5554991 MimeEntityHeadersEnd 5555107 MimeMessageHeadersEnd 5555107 Octets 720 -Lines 18 +Lines 17 MimeEntityEnd 5555827 MimeMessageEnd 5555827 Octets 836 -Lines 22 +Lines 21 MimeEntityEnd 5555827 MultipartBoundaryBegin 5555827 MultipartBoundaryEnd 5555861 @@ -3110,11 +3110,11 @@ MimeEntityBegin 5555863 MimeEntityHeadersEnd 5555999 MimeMessageHeadersEnd 5555999 Octets 391 -Lines 12 +Lines 11 MimeEntityEnd 5556390 MimeMessageEnd 5556390 Octets 527 -Lines 16 +Lines 15 MimeEntityEnd 5556390 MultipartBoundaryBegin 5556390 MultipartBoundaryEnd 5556424 @@ -3125,11 +3125,11 @@ MimeEntityBegin 5556426 MimeEntityHeadersEnd 5556566 MimeMessageHeadersEnd 5556566 Octets 1001 -Lines 25 +Lines 24 MimeEntityEnd 5557567 MimeMessageEnd 5557567 Octets 1141 -Lines 29 +Lines 28 MimeEntityEnd 5557567 MultipartBoundaryBegin 5557567 MultipartBoundaryEnd 5557601 @@ -3140,11 +3140,11 @@ MimeEntityBegin 5557603 MimeEntityHeadersEnd 5557752 MimeMessageHeadersEnd 5557752 Octets 477 -Lines 11 +Lines 10 MimeEntityEnd 5558229 MimeMessageEnd 5558229 Octets 626 -Lines 15 +Lines 14 MimeEntityEnd 5558229 MultipartBoundaryBegin 5558229 MultipartBoundaryEnd 5558263 @@ -3155,11 +3155,11 @@ MimeEntityBegin 5558265 MimeEntityHeadersEnd 5558402 MimeMessageHeadersEnd 5558402 Octets 289 -Lines 11 +Lines 10 MimeEntityEnd 5558691 MimeMessageEnd 5558691 Octets 426 -Lines 15 +Lines 14 MimeEntityEnd 5558691 MultipartBoundaryBegin 5558691 MultipartBoundaryEnd 5558725 @@ -3170,11 +3170,11 @@ MimeEntityBegin 5558727 MimeEntityHeadersEnd 5558856 MimeMessageHeadersEnd 5558856 Octets 286 -Lines 5 +Lines 4 MimeEntityEnd 5559142 MimeMessageEnd 5559142 Octets 415 -Lines 9 +Lines 8 MimeEntityEnd 5559142 MultipartBoundaryBegin 5559142 MultipartBoundaryEnd 5559176 @@ -3185,11 +3185,11 @@ MimeEntityBegin 5559178 MimeEntityHeadersEnd 5559303 MimeMessageHeadersEnd 5559303 Octets 670 -Lines 28 +Lines 27 MimeEntityEnd 5559973 MimeMessageEnd 5559973 Octets 795 -Lines 32 +Lines 31 MimeEntityEnd 5559973 MultipartBoundaryBegin 5559973 MultipartBoundaryEnd 5560007 @@ -3200,11 +3200,11 @@ MimeEntityBegin 5560009 MimeEntityHeadersEnd 5560157 MimeMessageHeadersEnd 5560157 Octets 2304 -Lines 47 +Lines 46 MimeEntityEnd 5562461 MimeMessageEnd 5562461 Octets 2452 -Lines 51 +Lines 50 MimeEntityEnd 5562461 MultipartBoundaryBegin 5562461 MultipartBoundaryEnd 5562495 @@ -3215,11 +3215,11 @@ MimeEntityBegin 5562497 MimeEntityHeadersEnd 5562623 MimeMessageHeadersEnd 5562623 Octets 809 -Lines 18 +Lines 17 MimeEntityEnd 5563432 MimeMessageEnd 5563432 Octets 935 -Lines 22 +Lines 21 MimeEntityEnd 5563432 MultipartBoundaryBegin 5563432 MultipartBoundaryEnd 5563466 @@ -3230,11 +3230,11 @@ MimeEntityBegin 5563468 MimeEntityHeadersEnd 5563566 MimeMessageHeadersEnd 5563566 Octets 236 -Lines 11 +Lines 10 MimeEntityEnd 5563802 MimeMessageEnd 5563802 Octets 334 -Lines 15 +Lines 14 MimeEntityEnd 5563802 MultipartBoundaryBegin 5563802 MultipartBoundaryEnd 5563836 @@ -3245,11 +3245,11 @@ MimeEntityBegin 5563838 MimeEntityHeadersEnd 5563963 MimeMessageHeadersEnd 5563963 Octets 688 -Lines 21 +Lines 20 MimeEntityEnd 5564651 MimeMessageEnd 5564651 Octets 813 -Lines 25 +Lines 24 MimeEntityEnd 5564651 MultipartBoundaryBegin 5564651 MultipartBoundaryEnd 5564685 @@ -3260,11 +3260,11 @@ MimeEntityBegin 5564687 MimeEntityHeadersEnd 5564801 MimeMessageHeadersEnd 5564801 Octets 2615 -Lines 69 +Lines 68 MimeEntityEnd 5567416 MimeMessageEnd 5567416 Octets 2729 -Lines 73 +Lines 72 MimeEntityEnd 5567416 MultipartBoundaryBegin 5567416 MultipartBoundaryEnd 5567450 @@ -3275,11 +3275,11 @@ MimeEntityBegin 5567452 MimeEntityHeadersEnd 5567562 MimeMessageHeadersEnd 5567562 Octets 1243 -Lines 35 +Lines 34 MimeEntityEnd 5568805 MimeMessageEnd 5568805 Octets 1353 -Lines 39 +Lines 38 MimeEntityEnd 5568805 MultipartBoundaryBegin 5568805 MultipartBoundaryEnd 5568839 @@ -3290,11 +3290,11 @@ MimeEntityBegin 5568841 MimeEntityHeadersEnd 5568951 MimeMessageHeadersEnd 5568951 Octets 1840 -Lines 44 +Lines 43 MimeEntityEnd 5570791 MimeMessageEnd 5570791 Octets 1950 -Lines 48 +Lines 47 MimeEntityEnd 5570791 MultipartBoundaryBegin 5570791 MultipartBoundaryEnd 5570825 @@ -3305,11 +3305,11 @@ MimeEntityBegin 5570827 MimeEntityHeadersEnd 5570960 MimeMessageHeadersEnd 5570960 Octets 582 -Lines 13 +Lines 12 MimeEntityEnd 5571542 MimeMessageEnd 5571542 Octets 715 -Lines 17 +Lines 16 MimeEntityEnd 5571542 MultipartBoundaryBegin 5571542 MultipartBoundaryEnd 5571576 @@ -3320,11 +3320,11 @@ MimeEntityBegin 5571578 MimeEntityHeadersEnd 5571670 MimeMessageHeadersEnd 5571670 Octets 1354 -Lines 21 +Lines 20 MimeEntityEnd 5573024 MimeMessageEnd 5573024 Octets 1446 -Lines 25 +Lines 24 MimeEntityEnd 5573024 MultipartBoundaryBegin 5573024 MultipartBoundaryEnd 5573058 @@ -3335,11 +3335,11 @@ MimeEntityBegin 5573060 MimeEntityHeadersEnd 5573180 MimeMessageHeadersEnd 5573180 Octets 2176 -Lines 50 +Lines 49 MimeEntityEnd 5575356 MimeMessageEnd 5575356 Octets 2296 -Lines 54 +Lines 53 MimeEntityEnd 5575356 MultipartBoundaryBegin 5575356 MultipartBoundaryEnd 5575390 @@ -3350,11 +3350,11 @@ MimeEntityBegin 5575392 MimeEntityHeadersEnd 5575517 MimeMessageHeadersEnd 5575517 Octets 2063 -Lines 43 +Lines 42 MimeEntityEnd 5577580 MimeMessageEnd 5577580 Octets 2188 -Lines 47 +Lines 46 MimeEntityEnd 5577580 MultipartBoundaryBegin 5577580 MultipartBoundaryEnd 5577614 @@ -3365,11 +3365,11 @@ MimeEntityBegin 5577616 MimeEntityHeadersEnd 5577741 MimeMessageHeadersEnd 5577741 Octets 696 -Lines 20 +Lines 19 MimeEntityEnd 5578437 MimeMessageEnd 5578437 Octets 821 -Lines 24 +Lines 23 MimeEntityEnd 5578437 MultipartBoundaryBegin 5578437 MultipartBoundaryEnd 5578471 @@ -3380,11 +3380,11 @@ MimeEntityBegin 5578473 MimeEntityHeadersEnd 5578614 MimeMessageHeadersEnd 5578614 Octets 836 -Lines 17 +Lines 16 MimeEntityEnd 5579450 MimeMessageEnd 5579450 Octets 977 -Lines 21 +Lines 20 MimeEntityEnd 5579450 MultipartBoundaryBegin 5579450 MultipartBoundaryEnd 5579484 @@ -3395,11 +3395,11 @@ MimeEntityBegin 5579486 MimeEntityHeadersEnd 5579614 MimeMessageHeadersEnd 5579614 Octets 745 -Lines 22 +Lines 21 MimeEntityEnd 5580359 MimeMessageEnd 5580359 Octets 873 -Lines 26 +Lines 25 MimeEntityEnd 5580359 MultipartBoundaryBegin 5580359 MultipartBoundaryEnd 5580393 @@ -3410,11 +3410,11 @@ MimeEntityBegin 5580395 MimeEntityHeadersEnd 5580501 MimeMessageHeadersEnd 5580501 Octets 756 -Lines 17 +Lines 16 MimeEntityEnd 5581257 MimeMessageEnd 5581257 Octets 862 -Lines 21 +Lines 20 MimeEntityEnd 5581257 MultipartBoundaryBegin 5581257 MultipartBoundaryEnd 5581291 @@ -3425,11 +3425,11 @@ MimeEntityBegin 5581293 MimeEntityHeadersEnd 5581454 MimeMessageHeadersEnd 5581454 Octets 366 -Lines 8 +Lines 7 MimeEntityEnd 5581820 MimeMessageEnd 5581820 Octets 527 -Lines 13 +Lines 12 MimeEntityEnd 5581820 MultipartBoundaryBegin 5581820 MultipartBoundaryEnd 5581854 @@ -3440,11 +3440,11 @@ MimeEntityBegin 5581856 MimeEntityHeadersEnd 5581947 MimeMessageHeadersEnd 5581947 Octets 650 -Lines 16 +Lines 15 MimeEntityEnd 5582597 MimeMessageEnd 5582597 Octets 741 -Lines 20 +Lines 19 MimeEntityEnd 5582597 MultipartBoundaryBegin 5582597 MultipartBoundaryEnd 5582631 @@ -3455,11 +3455,11 @@ MimeEntityBegin 5582633 MimeEntityHeadersEnd 5582786 MimeMessageHeadersEnd 5582786 Octets 383 -Lines 18 +Lines 17 MimeEntityEnd 5583169 MimeMessageEnd 5583169 Octets 536 -Lines 22 +Lines 21 MimeEntityEnd 5583169 MultipartBoundaryBegin 5583169 MultipartBoundaryEnd 5583203 @@ -3470,11 +3470,11 @@ MimeEntityBegin 5583205 MimeEntityHeadersEnd 5583310 MimeMessageHeadersEnd 5583310 Octets 294 -Lines 7 +Lines 6 MimeEntityEnd 5583604 MimeMessageEnd 5583604 Octets 399 -Lines 11 +Lines 10 MimeEntityEnd 5583604 MultipartBoundaryBegin 5583604 MultipartBoundaryEnd 5583638 @@ -3485,11 +3485,11 @@ MimeEntityBegin 5583640 MimeEntityHeadersEnd 5583772 MimeMessageHeadersEnd 5583772 Octets 495 -Lines 17 +Lines 16 MimeEntityEnd 5584267 MimeMessageEnd 5584267 Octets 627 -Lines 21 +Lines 20 MimeEntityEnd 5584267 MultipartBoundaryBegin 5584267 MultipartBoundaryEnd 5584301 @@ -3500,11 +3500,11 @@ MimeEntityBegin 5584303 MimeEntityHeadersEnd 5584404 MimeMessageHeadersEnd 5584404 Octets 399 -Lines 20 +Lines 19 MimeEntityEnd 5584803 MimeMessageEnd 5584803 Octets 500 -Lines 24 +Lines 23 MimeEntityEnd 5584803 MultipartBoundaryBegin 5584803 MultipartBoundaryEnd 5584837 @@ -3515,11 +3515,11 @@ MimeEntityBegin 5584839 MimeEntityHeadersEnd 5584958 MimeMessageHeadersEnd 5584958 Octets 1345 -Lines 27 +Lines 26 MimeEntityEnd 5586303 MimeMessageEnd 5586303 Octets 1464 -Lines 31 +Lines 30 MimeEntityEnd 5586303 MultipartBoundaryBegin 5586303 MultipartBoundaryEnd 5586337 @@ -3530,11 +3530,11 @@ MimeEntityBegin 5586339 MimeEntityHeadersEnd 5586443 MimeMessageHeadersEnd 5586443 Octets 304 -Lines 10 +Lines 9 MimeEntityEnd 5586747 MimeMessageEnd 5586747 Octets 408 -Lines 14 +Lines 13 MimeEntityEnd 5586747 MultipartBoundaryBegin 5586747 MultipartBoundaryEnd 5586781 @@ -3545,18 +3545,18 @@ MimeEntityBegin 5586783 MimeEntityHeadersEnd 5586930 MimeMessageHeadersEnd 5586930 Octets 1055 -Lines 37 +Lines 36 MimeEntityEnd 5587985 MimeMessageEnd 5587985 Octets 1202 -Lines 41 +Lines 40 MimeEntityEnd 5587985 MultipartEndBoundaryBegin 5587985 MultipartEndBoundaryEnd 5588019 MultipartEpilogueBegin 5588019 MultipartEpilogueEnd 5588021 Octets 66055 -Lines 1846 +Lines 1845 MimeEntityEnd 5588021 MultipartEndBoundaryBegin 5588021 MultipartEndBoundaryEnd 5588042 @@ -3638,7 +3638,7 @@ MultipartEndBoundaryEnd 5748405 MultipartEpilogueBegin 5748405 MultipartEpilogueEnd 5748407 Octets 156800 -Lines 2172 +Lines 2171 MimeEntityEnd 5748407 MimeMessageEnd 5748407 MboxMarkerBegin 5748409 @@ -3648,7 +3648,7 @@ MimeEntityBegin 5748418 MimeEntityHeadersEnd 5748956 MimeMessageHeadersEnd 5748956 Octets 589 -Lines 22 +Lines 21 MimeEntityEnd 5749545 MimeMessageEnd 5749545 MboxMarkerBegin 5749547 @@ -3664,7 +3664,7 @@ MultipartBoundaryEnd 5750964 MimeEntityBegin 5750964 MimeEntityHeadersEnd 5751010 Octets 756 -Lines 27 +Lines 26 MimeEntityEnd 5751766 MultipartBoundaryBegin 5751766 MultipartBoundaryEnd 5751809 @@ -3677,35 +3677,35 @@ MultipartBoundaryEnd 5751940 MimeEntityBegin 5751940 MimeEntityHeadersEnd 5752034 Octets 827 -Lines 26 +Lines 25 MimeEntityEnd 5752861 MultipartBoundaryBegin 5752861 MultipartBoundaryEnd 5752906 MimeEntityBegin 5752906 MimeEntityHeadersEnd 5753003 Octets 58626 -Lines 756 +Lines 755 MimeEntityEnd 5811629 MultipartBoundaryBegin 5811629 MultipartBoundaryEnd 5811674 MimeEntityBegin 5811674 MimeEntityHeadersEnd 5811768 Octets 6 -Lines 2 +Lines 1 MimeEntityEnd 5811774 MultipartEndBoundaryBegin 5811774 MultipartEndBoundaryEnd 5811819 MultipartEpilogueBegin 5811819 MultipartEpilogueEnd 5811821 Octets 59924 -Lines 799 +Lines 798 MimeEntityEnd 5811821 MultipartEndBoundaryBegin 5811821 MultipartEndBoundaryEnd 5811864 MultipartEpilogueBegin 5811864 MultipartEpilogueEnd 5811866 Octets 61101 -Lines 838 +Lines 837 MimeEntityEnd 5811866 MimeMessageEnd 5811866 MboxMarkerBegin 5811868 @@ -3721,7 +3721,7 @@ MultipartBoundaryEnd 5812686 MimeEntityBegin 5812686 MimeEntityHeadersEnd 5812779 Octets 181 -Lines 8 +Lines 7 MimeEntityEnd 5812960 MultipartBoundaryBegin 5812960 MultipartBoundaryEnd 5813012 @@ -3735,7 +3735,7 @@ MultipartEndBoundaryEnd 5869130 MultipartEpilogueBegin 5869130 MultipartEpilogueEnd 5869132 Octets 56498 -Lines 776 +Lines 775 MimeEntityEnd 5869132 MimeMessageEnd 5869132 MboxMarkerBegin 5869134 @@ -3745,7 +3745,7 @@ MimeEntityBegin 5869167 MimeEntityHeadersEnd 5870664 MimeMessageHeadersEnd 5870664 Octets 1374 -Lines 35 +Lines 34 MimeEntityEnd 5872038 MimeMessageEnd 5872038 MboxMarkerBegin 5872040 @@ -3761,7 +3761,7 @@ MultipartBoundaryEnd 5872931 MimeEntityBegin 5872931 MimeEntityHeadersEnd 5873010 Octets 383 -Lines 14 +Lines 13 MimeEntityEnd 5873393 MultipartBoundaryBegin 5873393 MultipartBoundaryEnd 5873421 @@ -3772,18 +3772,18 @@ MimeEntityBegin 5873515 MimeEntityHeadersEnd 5874597 MimeMessageHeadersEnd 5874597 Octets 24858 -Lines 464 +Lines 463 MimeEntityEnd 5899455 MimeMessageEnd 5899455 Octets 25940 -Lines 478 +Lines 477 MimeEntityEnd 5899455 MultipartEndBoundaryBegin 5899455 MultipartEndBoundaryEnd 5899483 MultipartEpilogueBegin 5899483 MultipartEpilogueEnd 5899485 Octets 26628 -Lines 505 +Lines 504 MimeEntityEnd 5899485 MimeMessageEnd 5899485 MboxMarkerBegin 5899487 @@ -3799,7 +3799,7 @@ MultipartBoundaryEnd 5900275 MimeEntityBegin 5900275 MimeEntityHeadersEnd 5900356 Octets 35 -Lines 2 +Lines 1 MimeEntityEnd 5900391 MultipartBoundaryBegin 5900391 MultipartBoundaryEnd 5900442 @@ -3829,7 +3829,7 @@ MultipartBoundaryEnd 5923590 MimeEntityBegin 5923590 MimeEntityHeadersEnd 5923636 Octets 1193 -Lines 22 +Lines 21 MimeEntityEnd 5924829 MultipartBoundaryBegin 5924829 MultipartBoundaryEnd 5924840 @@ -3860,7 +3860,7 @@ MimeEntityBegin 5925467 MimeEntityHeadersEnd 5926279 MimeMessageHeadersEnd 5926279 Octets 260296 -Lines 3519 +Lines 3518 MimeEntityEnd 6186575 MimeMessageEnd 6186575 MboxMarkerBegin 6186577 @@ -3890,7 +3890,7 @@ MultipartEndBoundaryEnd 6287416 MultipartEpilogueBegin 6287416 MultipartEpilogueEnd 6287418 Octets 99961 -Lines 1297 +Lines 1296 MimeEntityEnd 6287418 MimeMessageEnd 6287418 MboxMarkerBegin 6287420 @@ -3906,7 +3906,7 @@ MultipartBoundaryEnd 6288335 MimeEntityBegin 6288335 MimeEntityHeadersEnd 6288383 Octets 964 -Lines 22 +Lines 21 MimeEntityEnd 6289347 MultipartBoundaryBegin 6289347 MultipartBoundaryEnd 6289359 @@ -3931,28 +3931,28 @@ MultipartBoundaryEnd 6289969 MimeEntityBegin 6289969 MimeEntityHeadersEnd 6290096 Octets 374 -Lines 9 +Lines 8 MimeEntityEnd 6290470 MultipartBoundaryBegin 6290470 MultipartBoundaryEnd 6290495 MimeEntityBegin 6290495 MimeEntityHeadersEnd 6290621 Octets 402 -Lines 11 +Lines 10 MimeEntityEnd 6291023 MultipartBoundaryBegin 6291023 MultipartBoundaryEnd 6291048 MimeEntityBegin 6291048 MimeEntityHeadersEnd 6291177 Octets 726 -Lines 19 +Lines 18 MimeEntityEnd 6291903 MultipartEndBoundaryBegin 6291903 MultipartEndBoundaryEnd 6291928 MultipartEpilogueBegin 6291928 MultipartEpilogueEnd 6291930 Octets 1984 -Lines 56 +Lines 55 MimeEntityEnd 6291930 MultipartBoundaryBegin 6291930 MultipartBoundaryEnd 6291955 @@ -3965,14 +3965,14 @@ MultipartBoundaryEnd 6292080 MimeEntityBegin 6292080 MimeEntityHeadersEnd 6292216 Octets 16885 -Lines 471 +Lines 470 MimeEntityEnd 6309101 MultipartBoundaryBegin 6309101 MultipartBoundaryEnd 6309126 MimeEntityBegin 6309126 MimeEntityHeadersEnd 6309261 Octets 14649 -Lines 396 +Lines 395 MimeEntityEnd 6323910 MultipartBoundaryBegin 6323910 MultipartBoundaryEnd 6323935 @@ -3985,42 +3985,42 @@ MultipartBoundaryEnd 6324062 MimeEntityBegin 6324062 MimeEntityHeadersEnd 6324208 Octets 6316 -Lines 165 +Lines 164 MimeEntityEnd 6330524 MultipartBoundaryBegin 6330524 MultipartBoundaryEnd 6330549 MimeEntityBegin 6330549 MimeEntityHeadersEnd 6330680 Octets 5415 -Lines 161 +Lines 160 MimeEntityEnd 6336095 MultipartBoundaryBegin 6336095 MultipartBoundaryEnd 6336120 MimeEntityBegin 6336120 MimeEntityHeadersEnd 6336261 Octets 7495 -Lines 198 +Lines 197 MimeEntityEnd 6343756 MultipartBoundaryBegin 6343756 MultipartBoundaryEnd 6343781 MimeEntityBegin 6343781 MimeEntityHeadersEnd 6343909 Octets 6660 -Lines 185 +Lines 184 MimeEntityEnd 6350569 MultipartBoundaryBegin 6350569 MultipartBoundaryEnd 6350594 MimeEntityBegin 6350594 MimeEntityHeadersEnd 6350735 Octets 17660 -Lines 493 +Lines 492 MimeEntityEnd 6368395 MultipartEndBoundaryBegin 6368395 MultipartEndBoundaryEnd 6368420 MultipartEpilogueBegin 6368420 MultipartEpilogueEnd 6368422 Octets 44383 -Lines 1229 +Lines 1228 MimeEntityEnd 6368422 MultipartBoundaryBegin 6368422 MultipartBoundaryEnd 6368447 @@ -4033,21 +4033,21 @@ MultipartBoundaryEnd 6368568 MimeEntityBegin 6368568 MimeEntityHeadersEnd 6368706 Octets 516 -Lines 22 +Lines 21 MimeEntityEnd 6369222 MultipartEndBoundaryBegin 6369222 MultipartEndBoundaryEnd 6369247 MultipartEpilogueBegin 6369247 MultipartEpilogueEnd 6369249 Octets 704 -Lines 29 +Lines 28 MimeEntityEnd 6369249 MultipartEndBoundaryBegin 6369249 MultipartEndBoundaryEnd 6369274 MultipartEpilogueBegin 6369274 MultipartEpilogueEnd 6369276 Octets 77219 -Lines 2145 +Lines 2144 MimeEntityEnd 6369276 MultipartBoundaryBegin 6369276 MultipartBoundaryEnd 6369301 @@ -4060,49 +4060,49 @@ MultipartBoundaryEnd 6369438 MimeEntityBegin 6369438 MimeEntityHeadersEnd 6369580 Octets 1178 -Lines 30 +Lines 29 MimeEntityEnd 6370758 MultipartBoundaryBegin 6370758 MultipartBoundaryEnd 6370783 MimeEntityBegin 6370783 MimeEntityHeadersEnd 6370913 Octets 1255 -Lines 36 +Lines 35 MimeEntityEnd 6372168 MultipartBoundaryBegin 6372168 MultipartBoundaryEnd 6372193 MimeEntityBegin 6372193 MimeEntityHeadersEnd 6372337 Octets 699 -Lines 23 +Lines 22 MimeEntityEnd 6373036 MultipartEndBoundaryBegin 6373036 MultipartEndBoundaryEnd 6373061 MultipartEpilogueBegin 6373061 MultipartEpilogueEnd 6373063 Octets 3648 -Lines 106 +Lines 105 MimeEntityEnd 6373063 MultipartEndBoundaryBegin 6373063 MultipartEndBoundaryEnd 6373088 MultipartEpilogueBegin 6373088 MultipartEpilogueEnd 6373090 Octets 83272 -Lines 2321 +Lines 2320 MimeEntityEnd 6373090 MultipartEndBoundaryBegin 6373090 MultipartEndBoundaryEnd 6373115 MultipartEpilogueBegin 6373115 MultipartEpilogueEnd 6373117 Octets 83693 -Lines 2333 +Lines 2332 MimeEntityEnd 6373117 MultipartEndBoundaryBegin 6373117 MultipartEndBoundaryEnd 6373129 MultipartEpilogueBegin 6373129 MultipartEpilogueEnd 6373131 Octets 84806 -Lines 2363 +Lines 2362 MimeEntityEnd 6373131 MimeMessageEnd 6373131 MboxMarkerBegin 6373133 @@ -4112,7 +4112,7 @@ MimeEntityBegin 6373142 MimeEntityHeadersEnd 6373961 MimeMessageHeadersEnd 6373961 Octets 9425 -Lines 227 +Lines 226 MimeEntityEnd 6383386 MimeMessageEnd 6383386 MboxMarkerBegin 6383388 @@ -4128,7 +4128,7 @@ MultipartBoundaryEnd 6384340 MimeEntityBegin 6384340 MimeEntityHeadersEnd 6384386 Octets 779 -Lines 24 +Lines 23 MimeEntityEnd 6385165 MultipartBoundaryBegin 6385165 MultipartBoundaryEnd 6385208 @@ -4141,56 +4141,56 @@ MultipartBoundaryEnd 6385339 MimeEntityBegin 6385339 MimeEntityHeadersEnd 6385433 Octets 334 -Lines 8 +Lines 7 MimeEntityEnd 6385767 MultipartBoundaryBegin 6385767 MultipartBoundaryEnd 6385812 MimeEntityBegin 6385812 MimeEntityHeadersEnd 6385910 Octets 22344 -Lines 321 +Lines 320 MimeEntityEnd 6408254 MultipartBoundaryBegin 6408254 MultipartBoundaryEnd 6408299 MimeEntityBegin 6408299 MimeEntityHeadersEnd 6408393 Octets 171 -Lines 6 +Lines 5 MimeEntityEnd 6408564 MultipartBoundaryBegin 6408564 MultipartBoundaryEnd 6408609 MimeEntityBegin 6408609 MimeEntityHeadersEnd 6408710 Octets 47898 -Lines 686 +Lines 685 MimeEntityEnd 6456608 MultipartBoundaryBegin 6456608 MultipartBoundaryEnd 6456653 MimeEntityBegin 6456653 MimeEntityHeadersEnd 6456747 Octets 72 -Lines 3 +Lines 2 MimeEntityEnd 6456819 MultipartBoundaryBegin 6456819 MultipartBoundaryEnd 6456864 MimeEntityBegin 6456864 MimeEntityHeadersEnd 6456958 Octets 20512 -Lines 295 +Lines 294 MimeEntityEnd 6477470 MultipartBoundaryBegin 6477470 MultipartBoundaryEnd 6477515 MimeEntityBegin 6477515 MimeEntityHeadersEnd 6477609 Octets 112 -Lines 9 +Lines 8 MimeEntityEnd 6477721 MultipartEndBoundaryBegin 6477721 MultipartEndBoundaryEnd 6477766 MultipartEpilogueBegin 6477766 MultipartEpilogueEnd 6477768 Octets 92472 -Lines 1361 +Lines 1360 MimeEntityEnd 6477768 MultipartEndBoundaryBegin 6477768 MultipartEndBoundaryEnd 6477811 @@ -4213,28 +4213,28 @@ MultipartBoundaryEnd 6478838 MimeEntityBegin 6478838 MimeEntityHeadersEnd 6478914 Octets 433 -Lines 14 +Lines 13 MimeEntityEnd 6479347 MultipartBoundaryBegin 6479347 MultipartBoundaryEnd 6479395 MimeEntityBegin 6479395 MimeEntityHeadersEnd 6479459 Octets 34024 -Lines 461 +Lines 460 MimeEntityEnd 6513483 MultipartBoundaryBegin 6513483 MultipartBoundaryEnd 6513531 MimeEntityBegin 6513531 MimeEntityHeadersEnd 6513607 Octets 101 -Lines 8 +Lines 7 MimeEntityEnd 6513708 MultipartEndBoundaryBegin 6513708 MultipartEndBoundaryEnd 6513756 MultipartEpilogueBegin 6513756 MultipartEpilogueEnd 6513758 Octets 35165 -Lines 501 +Lines 500 MimeEntityEnd 6513758 MimeMessageEnd 6513758 MboxMarkerBegin 6513760 @@ -4244,7 +4244,7 @@ MimeEntityBegin 6513803 MimeEntityHeadersEnd 6513957 MimeMessageHeadersEnd 6513957 Octets 43722 -Lines 694 +Lines 693 MimeEntityEnd 6557679 MimeMessageEnd 6557679 MboxMarkerBegin 6557681 @@ -4266,35 +4266,35 @@ MultipartBoundaryEnd 6558563 MimeEntityBegin 6558563 MimeEntityHeadersEnd 6558644 Octets 1310 -Lines 39 +Lines 38 MimeEntityEnd 6559954 MultipartBoundaryBegin 6559954 MultipartBoundaryEnd 6559996 MimeEntityBegin 6559996 MimeEntityHeadersEnd 6560078 Octets 2496 -Lines 33 +Lines 32 MimeEntityEnd 6562574 MultipartEndBoundaryBegin 6562574 MultipartEndBoundaryEnd 6562616 MultipartEpilogueBegin 6562616 MultipartEpilogueEnd 6562620 Octets 4099 -Lines 84 +Lines 83 MimeEntityEnd 6562620 MultipartBoundaryBegin 6562620 MultipartBoundaryEnd 6562662 MimeEntityBegin 6562662 MimeEntityHeadersEnd 6562872 Octets 21020 -Lines 271 +Lines 270 MimeEntityEnd 6583892 MultipartEndBoundaryBegin 6583892 MultipartEndBoundaryEnd 6583934 MultipartEpilogueBegin 6583934 MultipartEpilogueEnd 6583936 Octets 25624 -Lines 369 +Lines 368 MimeEntityEnd 6583936 MimeMessageEnd 6583936 MboxMarkerBegin 6583938 @@ -4310,7 +4310,7 @@ MultipartBoundaryEnd 6584457 MimeEntityBegin 6584457 MimeEntityHeadersEnd 6584459 Octets 64 -Lines 2 +Lines 1 MimeEntityEnd 6584523 MultipartBoundaryBegin 6584523 MultipartBoundaryEnd 6584546 @@ -4323,35 +4323,35 @@ MultipartBoundaryEnd 6584650 MimeEntityBegin 6584650 MimeEntityHeadersEnd 6584760 Octets 83 -Lines 4 +Lines 3 MimeEntityEnd 6584843 MultipartBoundaryBegin 6584843 MultipartBoundaryEnd 6584873 MimeEntityBegin 6584873 MimeEntityHeadersEnd 6584986 Octets 162 -Lines 5 +Lines 4 MimeEntityEnd 6585148 MultipartBoundaryBegin 6585148 MultipartBoundaryEnd 6585178 MimeEntityBegin 6585178 MimeEntityHeadersEnd 6585291 Octets 173 -Lines 11 +Lines 10 MimeEntityEnd 6585464 MultipartBoundaryBegin 6585464 MultipartBoundaryEnd 6585494 MimeEntityBegin 6585494 MimeEntityHeadersEnd 6585603 Octets 164 -Lines 4 +Lines 3 MimeEntityEnd 6585767 MultipartBoundaryBegin 6585767 MultipartBoundaryEnd 6585797 MimeEntityBegin 6585797 MimeEntityHeadersEnd 6585925 Octets 433 -Lines 7 +Lines 6 MimeEntityEnd 6586358 MultipartEndBoundaryBegin 6586358 MultipartEndBoundaryEnd 6586388 @@ -4365,7 +4365,7 @@ MultipartBoundaryEnd 6586411 MimeEntityBegin 6586411 MimeEntityHeadersEnd 6586413 Octets 169 -Lines 5 +Lines 4 MimeEntityEnd 6586582 MultipartBoundaryBegin 6586582 MultipartBoundaryEnd 6586605 @@ -4378,7 +4378,7 @@ MultipartBoundaryEnd 6586663 MimeEntityBegin 6586663 MimeEntityHeadersEnd 6586691 Octets 54 -Lines 2 +Lines 1 MimeEntityEnd 6586745 MultipartBoundaryBegin 6586745 MultipartBoundaryEnd 6586753 @@ -4391,35 +4391,35 @@ MultipartBoundaryEnd 6586811 MimeEntityBegin 6586811 MimeEntityHeadersEnd 6586839 Octets 54 -Lines 2 +Lines 1 MimeEntityEnd 6586893 MultipartBoundaryBegin 6586893 MultipartBoundaryEnd 6586901 MimeEntityBegin 6586901 MimeEntityHeadersEnd 6586928 Octets 51 -Lines 2 +Lines 1 MimeEntityEnd 6586979 MultipartBoundaryBegin 6586979 MultipartBoundaryEnd 6586987 MimeEntityBegin 6586987 MimeEntityHeadersEnd 6587016 Octets 55 -Lines 2 +Lines 1 MimeEntityEnd 6587071 MultipartEndBoundaryBegin 6587071 MultipartEndBoundaryEnd 6587079 MultipartEpilogueBegin 6587079 MultipartEpilogueEnd 6587081 Octets 276 -Lines 17 +Lines 16 MimeEntityEnd 6587081 MultipartBoundaryBegin 6587081 MultipartBoundaryEnd 6587089 MimeEntityBegin 6587089 MimeEntityHeadersEnd 6587184 Octets 16 -Lines 2 +Lines 1 MimeEntityEnd 6587200 MultipartEndBoundaryBegin 6587200 MultipartEndBoundaryEnd 6587208 @@ -4433,7 +4433,7 @@ MultipartBoundaryEnd 6587231 MimeEntityBegin 6587231 MimeEntityHeadersEnd 6587233 Octets 10 -Lines 2 +Lines 1 MimeEntityEnd 6587243 MultipartEndBoundaryBegin 6587243 MultipartEndBoundaryEnd 6587266 @@ -4456,7 +4456,7 @@ MultipartBoundaryEnd 6587785 MimeEntityBegin 6587785 MimeEntityHeadersEnd 6587787 Octets 68 -Lines 2 +Lines 1 MimeEntityEnd 6587855 MultipartBoundaryBegin 6587855 MultipartBoundaryEnd 6587878 @@ -4469,28 +4469,28 @@ MultipartBoundaryEnd 6587982 MimeEntityBegin 6587982 MimeEntityHeadersEnd 6588142 Octets 56866 -Lines 1604 +Lines 1603 MimeEntityEnd 6645008 MultipartBoundaryBegin 6645008 MultipartBoundaryEnd 6645038 MimeEntityBegin 6645038 MimeEntityHeadersEnd 6645197 Octets 109031 -Lines 2983 +Lines 2982 MimeEntityEnd 6754228 MultipartBoundaryBegin 6754228 MultipartBoundaryEnd 6754258 MimeEntityBegin 6754258 MimeEntityHeadersEnd 6754408 Octets 201468 -Lines 13110 +Lines 13109 MimeEntityEnd 6955876 MultipartEndBoundaryBegin 6955876 MultipartEndBoundaryEnd 6955906 MultipartEpilogueBegin 6955906 MultipartEpilogueEnd 6955908 Octets 367954 -Lines 17714 +Lines 17713 MimeEntityEnd 6955908 MultipartEndBoundaryBegin 6955908 MultipartEndBoundaryEnd 6955931 @@ -4513,7 +4513,7 @@ MultipartBoundaryEnd 6956828 MimeEntityBegin 6956828 MimeEntityHeadersEnd 6956943 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 6956943 MultipartBoundaryBegin 6956943 MultipartBoundaryEnd 6956986 @@ -4524,11 +4524,11 @@ MimeEntityBegin 6957087 MimeEntityHeadersEnd 6957640 MimeMessageHeadersEnd 6957640 Octets 362 -Lines 17 +Lines 16 MimeEntityEnd 6958002 MimeMessageEnd 6958002 Octets 915 -Lines 29 +Lines 28 MimeEntityEnd 6958002 MultipartEndBoundaryBegin 6958002 MultipartEndBoundaryEnd 6958045 @@ -4551,14 +4551,14 @@ MultipartBoundaryEnd 6958401 MimeEntityBegin 6958401 MimeEntityHeadersEnd 6958654 Octets 749 -Lines 31 +Lines 30 MimeEntityEnd 6959403 MultipartBoundaryBegin 6959403 MultipartBoundaryEnd 6959445 MimeEntityBegin 6959445 MimeEntityHeadersEnd 6959773 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 6970643 MultipartEndBoundaryBegin 6970643 MultipartEndBoundaryEnd 6970685 @@ -4581,14 +4581,14 @@ MultipartBoundaryEnd 6971041 MimeEntityBegin 6971041 MimeEntityHeadersEnd 6971294 Octets 748 -Lines 31 +Lines 30 MimeEntityEnd 6972042 MultipartBoundaryBegin 6972042 MultipartBoundaryEnd 6972084 MimeEntityBegin 6972084 MimeEntityHeadersEnd 6972381 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 6983251 MultipartEndBoundaryBegin 6983251 MultipartEndBoundaryEnd 6983293 @@ -4611,21 +4611,21 @@ MultipartBoundaryEnd 6984904 MimeEntityBegin 6984904 MimeEntityHeadersEnd 6984998 Octets 5310 -Lines 112 +Lines 111 MimeEntityEnd 6990308 MultipartBoundaryBegin 6990308 MultipartBoundaryEnd 6990355 MimeEntityBegin 6990355 MimeEntityHeadersEnd 6990560 Octets 942 -Lines 14 +Lines 13 MimeEntityEnd 6991502 MultipartEndBoundaryBegin 6991502 MultipartEndBoundaryEnd 6991549 MultipartEpilogueBegin 6991549 MultipartEpilogueEnd 6991551 Octets 6694 -Lines 140 +Lines 139 MimeEntityEnd 6991551 MimeMessageEnd 6991551 MboxMarkerBegin 6991553 @@ -4641,7 +4641,7 @@ MultipartBoundaryEnd 6992085 MimeEntityBegin 6992085 MimeEntityHeadersEnd 6992113 Octets 253 -Lines 7 +Lines 6 MimeEntityEnd 6992366 MultipartBoundaryBegin 6992366 MultipartBoundaryEnd 6992408 @@ -4654,7 +4654,7 @@ MultipartBoundaryEnd 6992537 MimeEntityBegin 6992537 MimeEntityHeadersEnd 6992736 Octets 7327 -Lines 180 +Lines 179 MimeEntityEnd 7000063 MultipartBoundaryBegin 7000063 MultipartBoundaryEnd 7000105 @@ -4733,14 +4733,14 @@ MultipartBoundaryEnd 7210034 MimeEntityBegin 7210034 MimeEntityHeadersEnd 7210195 Octets 578 -Lines 28 +Lines 27 MimeEntityEnd 7210773 MultipartBoundaryBegin 7210773 MultipartBoundaryEnd 7210815 MimeEntityBegin 7210815 MimeEntityHeadersEnd 7210932 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 7221802 MultipartEndBoundaryBegin 7221802 MultipartEndBoundaryEnd 7221844 @@ -4763,14 +4763,14 @@ MultipartBoundaryEnd 7222199 MimeEntityBegin 7222199 MimeEntityHeadersEnd 7222417 Octets 625 -Lines 29 +Lines 28 MimeEntityEnd 7223042 MultipartBoundaryBegin 7223042 MultipartBoundaryEnd 7223084 MimeEntityBegin 7223084 MimeEntityHeadersEnd 7223365 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 7234235 MultipartEndBoundaryBegin 7234235 MultipartEndBoundaryEnd 7234277 @@ -4793,14 +4793,14 @@ MultipartBoundaryEnd 7234632 MimeEntityBegin 7234632 MimeEntityHeadersEnd 7234854 Octets 629 -Lines 29 +Lines 28 MimeEntityEnd 7235483 MultipartBoundaryBegin 7235483 MultipartBoundaryEnd 7235525 MimeEntityBegin 7235525 MimeEntityHeadersEnd 7235705 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 7246575 MultipartEndBoundaryBegin 7246575 MultipartEndBoundaryEnd 7246617 @@ -4823,14 +4823,14 @@ MultipartBoundaryEnd 7246972 MimeEntityBegin 7246972 MimeEntityHeadersEnd 7247224 Octets 660 -Lines 30 +Lines 29 MimeEntityEnd 7247884 MultipartBoundaryBegin 7247884 MultipartBoundaryEnd 7247926 MimeEntityBegin 7247926 MimeEntityHeadersEnd 7248239 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 7259109 MultipartEndBoundaryBegin 7259109 MultipartEndBoundaryEnd 7259151 @@ -4853,14 +4853,14 @@ MultipartBoundaryEnd 7259506 MimeEntityBegin 7259506 MimeEntityHeadersEnd 7259728 Octets 673 -Lines 29 +Lines 28 MimeEntityEnd 7260401 MultipartBoundaryBegin 7260401 MultipartBoundaryEnd 7260443 MimeEntityBegin 7260443 MimeEntityHeadersEnd 7260623 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 7271493 MultipartEndBoundaryBegin 7271493 MultipartEndBoundaryEnd 7271535 @@ -4883,14 +4883,14 @@ MultipartBoundaryEnd 7271890 MimeEntityBegin 7271890 MimeEntityHeadersEnd 7272142 Octets 699 -Lines 30 +Lines 29 MimeEntityEnd 7272841 MultipartBoundaryBegin 7272841 MultipartBoundaryEnd 7272883 MimeEntityBegin 7272883 MimeEntityHeadersEnd 7273227 Octets 10870 -Lines 148 +Lines 147 MimeEntityEnd 7284097 MultipartEndBoundaryBegin 7284097 MultipartEndBoundaryEnd 7284139 @@ -4913,7 +4913,7 @@ MultipartBoundaryEnd 7285517 MimeEntityBegin 7285517 MimeEntityHeadersEnd 7285596 Octets 30 -Lines 4 +Lines 3 MimeEntityEnd 7285626 MultipartBoundaryBegin 7285626 MultipartBoundaryEnd 7285667 @@ -4930,7 +4930,7 @@ MultipartBoundaryEnd 7286640 MimeEntityBegin 7286640 MimeEntityHeadersEnd 7286719 Octets 643 -Lines 17 +Lines 16 MimeEntityEnd 7287362 MultipartBoundaryBegin 7287362 MultipartBoundaryEnd 7287404 @@ -4943,7 +4943,7 @@ MultipartBoundaryEnd 7287530 MimeEntityBegin 7287530 MimeEntityHeadersEnd 7287608 Octets 868 -Lines 19 +Lines 18 MimeEntityEnd 7288476 MultipartBoundaryBegin 7288476 MultipartBoundaryEnd 7288518 @@ -4957,25 +4957,25 @@ MultipartEndBoundaryEnd 8042907 MultipartEpilogueBegin 8042907 MultipartEpilogueEnd 8042909 Octets 755421 -Lines 10224 +Lines 10223 MimeEntityEnd 8042909 MultipartEndBoundaryBegin 8042909 MultipartEndBoundaryEnd 8042951 MultipartEpilogueBegin 8042951 MultipartEpilogueEnd 8042957 Octets 756359 -Lines 10253 +Lines 10252 MimeEntityEnd 8042957 MimeMessageEnd 8042957 Octets 757196 -Lines 10269 +Lines 10268 MimeEntityEnd 8042957 MultipartEndBoundaryBegin 8042957 MultipartEndBoundaryEnd 8042998 MultipartEpilogueBegin 8042998 MultipartEpilogueEnd 8043000 Octets 757570 -Lines 10286 +Lines 10285 MimeEntityEnd 8043000 MimeMessageEnd 8043000 MboxMarkerBegin 8043002 @@ -4991,42 +4991,42 @@ MultipartBoundaryEnd 8044368 MimeEntityBegin 8044368 MimeEntityHeadersEnd 8044462 Octets 2432 -Lines 51 +Lines 50 MimeEntityEnd 8046894 MultipartBoundaryBegin 8046894 MultipartBoundaryEnd 8046941 MimeEntityBegin 8046941 MimeEntityHeadersEnd 8047105 Octets 6102 -Lines 80 +Lines 79 MimeEntityEnd 8053207 MultipartBoundaryBegin 8053207 MultipartBoundaryEnd 8053254 MimeEntityBegin 8053254 MimeEntityHeadersEnd 8053417 Octets 12230 -Lines 158 +Lines 157 MimeEntityEnd 8065647 MultipartBoundaryBegin 8065647 MultipartBoundaryEnd 8065694 MimeEntityBegin 8065694 MimeEntityHeadersEnd 8065859 Octets 21996 -Lines 283 +Lines 282 MimeEntityEnd 8087855 MultipartBoundaryBegin 8087855 MultipartBoundaryEnd 8087902 MimeEntityBegin 8087902 MimeEntityHeadersEnd 8088111 Octets 3438 -Lines 46 +Lines 45 MimeEntityEnd 8091549 MultipartEndBoundaryBegin 8091549 MultipartEndBoundaryEnd 8091596 MultipartEpilogueBegin 8091596 MultipartEpilogueEnd 8091598 Octets 47277 -Lines 650 +Lines 649 MimeEntityEnd 8091598 MimeMessageEnd 8091598 MboxMarkerBegin 8091600 @@ -5036,7 +5036,7 @@ MimeEntityBegin 8091609 MimeEntityHeadersEnd 8092367 MimeMessageHeadersEnd 8092367 Octets 552090 -Lines 7475 +Lines 7474 MimeEntityEnd 8644457 MimeMessageEnd 8644457 MboxMarkerBegin 8644459 @@ -5052,14 +5052,14 @@ MultipartBoundaryEnd 8645411 MimeEntityBegin 8645411 MimeEntityHeadersEnd 8645442 Octets 2626 -Lines 97 +Lines 96 MimeEntityEnd 8648068 MultipartEndBoundaryBegin 8648068 MultipartEndBoundaryEnd 8648079 MultipartEpilogueBegin 8648079 MultipartEpilogueEnd 8648081 Octets 2681 -Lines 103 +Lines 102 MimeEntityEnd 8648081 MimeMessageEnd 8648081 MboxMarkerBegin 8648083 @@ -5075,14 +5075,14 @@ MultipartBoundaryEnd 8649031 MimeEntityBegin 8649031 MimeEntityHeadersEnd 8649078 Octets 1108 -Lines 27 +Lines 26 MimeEntityEnd 8650186 MultipartBoundaryBegin 8650186 MultipartBoundaryEnd 8650206 MimeEntityBegin 8650206 MimeEntityHeadersEnd 8650249 Octets 293 -Lines 10 +Lines 9 MimeEntityEnd 8650542 MultipartEndBoundaryBegin 8650542 MultipartEndBoundaryEnd 8650562 @@ -5109,7 +5109,7 @@ MimeEntityBegin 8653189 MimeEntityHeadersEnd 8653839 MimeMessageHeadersEnd 8653839 Octets 1001 -Lines 28 +Lines 27 MimeEntityEnd 8654840 MimeMessageEnd 8654840 MboxMarkerBegin 8654842 @@ -5125,7 +5125,7 @@ MultipartBoundaryEnd 8655830 MimeEntityBegin 8655830 MimeEntityHeadersEnd 8655876 Octets 832 -Lines 16 +Lines 15 MimeEntityEnd 8656708 MultipartBoundaryBegin 8656708 MultipartBoundaryEnd 8656751 @@ -5138,7 +5138,7 @@ MultipartBoundaryEnd 8656882 MimeEntityBegin 8656882 MimeEntityHeadersEnd 8656976 Octets 501 -Lines 11 +Lines 10 MimeEntityEnd 8657477 MultipartBoundaryBegin 8657477 MultipartBoundaryEnd 8657522 @@ -5149,18 +5149,18 @@ MimeEntityBegin 8657715 MimeEntityHeadersEnd 8657744 MimeMessageHeadersEnd 8657744 Octets 4 -Lines 3 +Lines 2 MimeEntityEnd 8657748 MimeMessageEnd 8657748 Octets 33 -Lines 5 +Lines 4 MimeEntityEnd 8657748 MultipartBoundaryBegin 8657748 MultipartBoundaryEnd 8657793 MimeEntityBegin 8657793 MimeEntityHeadersEnd 8657884 Octets 5 -Lines 3 +Lines 2 MimeEntityEnd 8657889 MultipartBoundaryBegin 8657889 MultipartBoundaryEnd 8657934 @@ -5171,32 +5171,32 @@ MimeEntityBegin 8658142 MimeEntityHeadersEnd 8658169 MimeMessageHeadersEnd 8658169 Octets 4 -Lines 3 +Lines 2 MimeEntityEnd 8658173 MimeMessageEnd 8658173 Octets 31 -Lines 5 +Lines 4 MimeEntityEnd 8658173 MultipartBoundaryBegin 8658173 MultipartBoundaryEnd 8658218 MimeEntityBegin 8658218 MimeEntityHeadersEnd 8658312 Octets 229 -Lines 8 +Lines 7 MimeEntityEnd 8658541 MultipartEndBoundaryBegin 8658541 MultipartEndBoundaryEnd 8658586 MultipartEpilogueBegin 8658586 MultipartEpilogueEnd 8658588 Octets 1749 -Lines 62 +Lines 61 MimeEntityEnd 8658588 MultipartEndBoundaryBegin 8658588 MultipartEndBoundaryEnd 8658631 MultipartEpilogueBegin 8658631 MultipartEpilogueEnd 8658633 Octets 3002 -Lines 90 +Lines 89 MimeEntityEnd 8658633 MimeMessageEnd 8658633 MboxMarkerBegin 8658635 @@ -5206,7 +5206,7 @@ MimeEntityBegin 8658644 MimeEntityHeadersEnd 8659476 MimeMessageHeadersEnd 8659476 Octets 1428 -Lines 43 +Lines 42 MimeEntityEnd 8660904 MimeMessageEnd 8660904 MboxMarkerBegin 8660906 @@ -5232,7 +5232,7 @@ MultipartBoundaryEnd 8667794 MimeEntityBegin 8667794 MimeEntityHeadersEnd 8667840 Octets 1705 -Lines 39 +Lines 38 MimeEntityEnd 8669545 MultipartBoundaryBegin 8669545 MultipartBoundaryEnd 8669588 @@ -5245,133 +5245,133 @@ MultipartBoundaryEnd 8669719 MimeEntityBegin 8669719 MimeEntityHeadersEnd 8669813 Octets 571 -Lines 15 +Lines 14 MimeEntityEnd 8670384 MultipartBoundaryBegin 8670384 MultipartBoundaryEnd 8670429 MimeEntityBegin 8670429 MimeEntityHeadersEnd 8670493 Octets 884 -Lines 13 +Lines 12 MimeEntityEnd 8671377 MultipartBoundaryBegin 8671377 MultipartBoundaryEnd 8671422 MimeEntityBegin 8671422 MimeEntityHeadersEnd 8671516 Octets 51 -Lines 6 +Lines 5 MimeEntityEnd 8671567 MultipartBoundaryBegin 8671567 MultipartBoundaryEnd 8671612 MimeEntityBegin 8671612 MimeEntityHeadersEnd 8671676 Octets 884 -Lines 13 +Lines 12 MimeEntityEnd 8672560 MultipartBoundaryBegin 8672560 MultipartBoundaryEnd 8672605 MimeEntityBegin 8672605 MimeEntityHeadersEnd 8672699 Octets 51 -Lines 6 +Lines 5 MimeEntityEnd 8672750 MultipartBoundaryBegin 8672750 MultipartBoundaryEnd 8672795 MimeEntityBegin 8672795 MimeEntityHeadersEnd 8672859 Octets 884 -Lines 13 +Lines 12 MimeEntityEnd 8673743 MultipartBoundaryBegin 8673743 MultipartBoundaryEnd 8673788 MimeEntityBegin 8673788 MimeEntityHeadersEnd 8673882 Octets 45 -Lines 6 +Lines 5 MimeEntityEnd 8673927 MultipartBoundaryBegin 8673927 MultipartBoundaryEnd 8673972 MimeEntityBegin 8673972 MimeEntityHeadersEnd 8674036 Octets 228 -Lines 5 +Lines 4 MimeEntityEnd 8674264 MultipartBoundaryBegin 8674264 MultipartBoundaryEnd 8674309 MimeEntityBegin 8674309 MimeEntityHeadersEnd 8674403 Octets 69 -Lines 6 +Lines 5 MimeEntityEnd 8674472 MultipartBoundaryBegin 8674472 MultipartBoundaryEnd 8674517 MimeEntityBegin 8674517 MimeEntityHeadersEnd 8674581 Octets 228 -Lines 5 +Lines 4 MimeEntityEnd 8674809 MultipartBoundaryBegin 8674809 MultipartBoundaryEnd 8674854 MimeEntityBegin 8674854 MimeEntityHeadersEnd 8674948 Octets 49 -Lines 6 +Lines 5 MimeEntityEnd 8674997 MultipartBoundaryBegin 8674997 MultipartBoundaryEnd 8675042 MimeEntityBegin 8675042 MimeEntityHeadersEnd 8675106 Octets 228 -Lines 5 +Lines 4 MimeEntityEnd 8675334 MultipartBoundaryBegin 8675334 MultipartBoundaryEnd 8675379 MimeEntityBegin 8675379 MimeEntityHeadersEnd 8675473 Octets 303 -Lines 12 +Lines 11 MimeEntityEnd 8675776 MultipartBoundaryBegin 8675776 MultipartBoundaryEnd 8675821 MimeEntityBegin 8675821 MimeEntityHeadersEnd 8675885 Octets 884 -Lines 13 +Lines 12 MimeEntityEnd 8676769 MultipartBoundaryBegin 8676769 MultipartBoundaryEnd 8676814 MimeEntityBegin 8676814 MimeEntityHeadersEnd 8676908 Octets 44 -Lines 5 +Lines 4 MimeEntityEnd 8676952 MultipartBoundaryBegin 8676952 MultipartBoundaryEnd 8676997 MimeEntityBegin 8676997 MimeEntityHeadersEnd 8677061 Octets 1942 -Lines 28 +Lines 27 MimeEntityEnd 8679003 MultipartBoundaryBegin 8679003 MultipartBoundaryEnd 8679048 MimeEntityBegin 8679048 MimeEntityHeadersEnd 8679142 Octets 11 -Lines 2 +Lines 1 MimeEntityEnd 8679153 MultipartEndBoundaryBegin 8679153 MultipartEndBoundaryEnd 8679198 MultipartEpilogueBegin 8679198 MultipartEpilogueEnd 8679200 Octets 9524 -Lines 229 +Lines 228 MimeEntityEnd 8679200 MultipartEndBoundaryBegin 8679200 MultipartEndBoundaryEnd 8679243 MultipartEpilogueBegin 8679243 MultipartEpilogueEnd 8679245 Octets 11650 -Lines 280 +Lines 279 MimeEntityEnd 8679245 MimeMessageEnd 8679245 MboxMarkerBegin 8679247 @@ -5387,7 +5387,7 @@ MultipartBoundaryEnd 8680199 MimeEntityBegin 8680199 MimeEntityHeadersEnd 8680245 Octets 639 -Lines 13 +Lines 12 MimeEntityEnd 8680884 MultipartBoundaryBegin 8680884 MultipartBoundaryEnd 8680927 @@ -5400,28 +5400,28 @@ MultipartBoundaryEnd 8681058 MimeEntityBegin 8681058 MimeEntityHeadersEnd 8681152 Octets 541 -Lines 9 +Lines 8 MimeEntityEnd 8681693 MultipartBoundaryBegin 8681693 MultipartBoundaryEnd 8681738 MimeEntityBegin 8681738 MimeEntityHeadersEnd 8681850 Octets 8710 -Lines 126 +Lines 125 MimeEntityEnd 8690560 MultipartBoundaryBegin 8690560 MultipartBoundaryEnd 8690605 MimeEntityBegin 8690605 MimeEntityHeadersEnd 8690699 Octets 48 -Lines 4 +Lines 3 MimeEntityEnd 8690747 MultipartEndBoundaryBegin 8690747 MultipartEndBoundaryEnd 8690792 MultipartEpilogueBegin 8690792 MultipartEpilogueEnd 8690794 Octets 9779 -Lines 154 +Lines 153 MimeEntityEnd 8690794 MultipartEndBoundaryBegin 8690794 MultipartEndBoundaryEnd 8690837 @@ -5444,7 +5444,7 @@ MultipartBoundaryEnd 8691561 MimeEntityBegin 8691561 MimeEntityHeadersEnd 8691654 Octets 103 -Lines 7 +Lines 6 MimeEntityEnd 8691757 MultipartBoundaryBegin 8691757 MultipartBoundaryEnd 8691809 @@ -5458,7 +5458,7 @@ MultipartEndBoundaryEnd 8771508 MultipartEpilogueBegin 8771508 MultipartEpilogueEnd 8771510 Octets 80001 -Lines 1094 +Lines 1093 MimeEntityEnd 8771510 MimeMessageEnd 8771510 MboxMarkerBegin 8771512 @@ -5474,7 +5474,7 @@ MultipartBoundaryEnd 8772493 MimeEntityBegin 8772493 MimeEntityHeadersEnd 8772539 Octets 1378 -Lines 29 +Lines 28 MimeEntityEnd 8773917 MultipartBoundaryBegin 8773917 MultipartBoundaryEnd 8773960 @@ -5487,42 +5487,42 @@ MultipartBoundaryEnd 8774091 MimeEntityBegin 8774091 MimeEntityHeadersEnd 8774185 Octets 1161 -Lines 23 +Lines 22 MimeEntityEnd 8775346 MultipartBoundaryBegin 8775346 MultipartBoundaryEnd 8775391 MimeEntityBegin 8775391 MimeEntityHeadersEnd 8775493 Octets 116822 -Lines 1580 +Lines 1579 MimeEntityEnd 8892315 MultipartBoundaryBegin 8892315 MultipartBoundaryEnd 8892360 MimeEntityBegin 8892360 MimeEntityHeadersEnd 8892454 Octets 126 -Lines 4 +Lines 3 MimeEntityEnd 8892580 MultipartBoundaryBegin 8892580 MultipartBoundaryEnd 8892625 MimeEntityBegin 8892625 MimeEntityHeadersEnd 8892728 Octets 67242 -Lines 962 +Lines 961 MimeEntityEnd 8959970 MultipartBoundaryBegin 8959970 MultipartBoundaryEnd 8960015 MimeEntityBegin 8960015 MimeEntityHeadersEnd 8960106 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 8960106 MultipartEndBoundaryBegin 8960106 MultipartEndBoundaryEnd 8960151 MultipartEpilogueBegin 8960151 MultipartEpilogueEnd 8960153 Octets 186105 -Lines 2594 +Lines 2593 MimeEntityEnd 8960153 MultipartEndBoundaryBegin 8960153 MultipartEndBoundaryEnd 8960196 @@ -5539,7 +5539,7 @@ MimeEntityBegin 8960207 MimeEntityHeadersEnd 8961063 MimeMessageHeadersEnd 8961063 Octets 1758 -Lines 26 +Lines 25 MimeEntityEnd 8962821 MimeMessageEnd 8962821 MboxMarkerBegin 8962823 @@ -5573,7 +5573,7 @@ MultipartBoundaryEnd 8965350 MimeEntityBegin 8965350 MimeEntityHeadersEnd 8965352 Octets 41 -Lines 2 +Lines 1 MimeEntityEnd 8965393 MultipartBoundaryBegin 8965393 MultipartBoundaryEnd 8965405 @@ -5587,7 +5587,7 @@ MultipartEndBoundaryEnd 9057979 MultipartEpilogueBegin 9057979 MultipartEpilogueEnd 9057985 Octets 92645 -Lines 1262 +Lines 1261 MimeEntityEnd 9057985 MimeMessageEnd 9057985 MboxMarkerBegin 9057987 @@ -5597,7 +5597,7 @@ MimeEntityBegin 9057996 MimeEntityHeadersEnd 9058498 MimeMessageHeadersEnd 9058498 Octets 1169 -Lines 28 +Lines 27 MimeEntityEnd 9059667 MimeMessageEnd 9059667 MboxMarkerBegin 9059669 @@ -5613,7 +5613,7 @@ MultipartBoundaryEnd 9060849 MimeEntityBegin 9060849 MimeEntityHeadersEnd 9060851 Octets 552 -Lines 13 +Lines 12 MimeEntityEnd 9061403 MultipartBoundaryBegin 9061403 MultipartBoundaryEnd 9061411 @@ -5627,7 +5627,7 @@ MultipartBoundaryEnd 9119969 MimeEntityBegin 9119969 MimeEntityHeadersEnd 9119971 Octets 3866 -Lines 84 +Lines 83 MimeEntityEnd 9123837 MultipartBoundaryBegin 9123837 MultipartBoundaryEnd 9123845 @@ -5641,7 +5641,7 @@ MultipartBoundaryEnd 9154655 MimeEntityBegin 9154655 MimeEntityHeadersEnd 9154764 Octets 740 -Lines 25 +Lines 24 MimeEntityEnd 9155504 MultipartBoundaryBegin 9155504 MultipartBoundaryEnd 9155512 @@ -5655,7 +5655,7 @@ MultipartEndBoundaryEnd 9156928 MultipartEpilogueBegin 9156928 MultipartEpilogueEnd 9156930 Octets 96087 -Lines 1971 +Lines 1970 MimeEntityEnd 9156930 MimeMessageEnd 9156930 MboxMarkerBegin 9156932 @@ -5671,21 +5671,21 @@ MultipartBoundaryEnd 9158154 MimeEntityBegin 9158154 MimeEntityHeadersEnd 9158156 Octets 921 -Lines 21 +Lines 20 MimeEntityEnd 9159077 MultipartBoundaryBegin 9159077 MultipartBoundaryEnd 9159097 MimeEntityBegin 9159097 MimeEntityHeadersEnd 9159179 Octets 760 -Lines 13 +Lines 12 MimeEntityEnd 9159939 MultipartEndBoundaryBegin 9159939 MultipartEndBoundaryEnd 9159959 MultipartEpilogueBegin 9159959 MultipartEpilogueEnd 9159961 Octets 1825 -Lines 42 +Lines 41 MimeEntityEnd 9159961 MimeMessageEnd 9159961 MboxMarkerBegin 9159963 @@ -5708,7 +5708,7 @@ MultipartBoundaryEnd 9162186 MimeEntityBegin 9162186 MimeEntityHeadersEnd 9162369 Octets 2246 -Lines 32 +Lines 31 MimeEntityEnd 9164615 MultipartEndBoundaryBegin 9164615 MultipartEndBoundaryEnd 9164625 @@ -5738,7 +5738,7 @@ MultipartBoundaryEnd 9168981 MimeEntityBegin 9168981 MimeEntityHeadersEnd 9169164 Octets 2582 -Lines 36 +Lines 35 MimeEntityEnd 9171746 MultipartEndBoundaryBegin 9171746 MultipartEndBoundaryEnd 9171770 @@ -5785,7 +5785,7 @@ MultipartEndBoundaryEnd 9193170 MultipartEpilogueBegin 9193170 MultipartEpilogueEnd 9193172 Octets 15973 -Lines 225 +Lines 224 MimeEntityEnd 9193172 MimeMessageEnd 9193172 MboxMarkerBegin 9193174 @@ -5865,7 +5865,7 @@ MultipartEndBoundaryEnd 9336539 MultipartEpilogueBegin 9336539 MultipartEpilogueEnd 9336541 Octets 4461 -Lines 70 +Lines 69 MimeEntityEnd 9336541 MimeMessageEnd 9336541 MboxMarkerBegin 9336543 @@ -5875,7 +5875,7 @@ MimeEntityBegin 9336576 MimeEntityHeadersEnd 9337807 MimeMessageHeadersEnd 9337807 Octets 3550 -Lines 56 +Lines 55 MimeEntityEnd 9341357 MimeMessageEnd 9341357 MboxMarkerBegin 9341359 @@ -5909,11 +5909,11 @@ MimeEntityBegin 9352135 MimeEntityHeadersEnd 9353538 MimeMessageHeadersEnd 9353538 Octets 1452 -Lines 21 +Lines 20 MimeEntityEnd 9354990 MimeMessageEnd 9354990 Octets 2855 -Lines 44 +Lines 43 MimeEntityEnd 9354990 MimeMessageEnd 9354990 MboxMarkerBegin 9354992 @@ -5929,7 +5929,7 @@ MultipartBoundaryEnd 9355828 MimeEntityBegin 9355828 MimeEntityHeadersEnd 9355907 Octets 16 -Lines 2 +Lines 1 MimeEntityEnd 9355923 MultipartBoundaryBegin 9355923 MultipartBoundaryEnd 9355953 @@ -5940,18 +5940,18 @@ MimeEntityBegin 9356111 MimeEntityHeadersEnd 9357514 MimeMessageHeadersEnd 9357514 Octets 1452 -Lines 21 +Lines 20 MimeEntityEnd 9358966 MimeMessageEnd 9358966 Octets 2855 -Lines 44 +Lines 43 MimeEntityEnd 9358966 MultipartEndBoundaryBegin 9358966 MultipartEndBoundaryEnd 9358996 MultipartEpilogueBegin 9358996 MultipartEpilogueEnd 9358998 Octets 3246 -Lines 59 +Lines 58 MimeEntityEnd 9358998 MimeMessageEnd 9358998 MboxMarkerBegin 9359000 @@ -5981,7 +5981,7 @@ MultipartEndBoundaryEnd 9365814 MultipartEpilogueBegin 9365814 MultipartEpilogueEnd 9365816 Octets 6102 -Lines 92 +Lines 91 MimeEntityEnd 9365816 MimeMessageEnd 9365816 MboxMarkerBegin 9365818 @@ -6021,7 +6021,7 @@ MultipartEndBoundaryEnd 9381610 MultipartEpilogueBegin 9381610 MultipartEpilogueEnd 9381612 Octets 2867 -Lines 55 +Lines 54 MimeEntityEnd 9381612 MimeMessageEnd 9381612 MboxMarkerBegin 9381614 @@ -6047,7 +6047,7 @@ MultipartBoundaryEnd 9384349 MimeEntityBegin 9384349 MimeEntityHeadersEnd 9384395 Octets 603 -Lines 16 +Lines 15 MimeEntityEnd 9384998 MultipartEndBoundaryBegin 9384998 MultipartEndBoundaryEnd 9385042 @@ -6070,7 +6070,7 @@ MultipartBoundaryEnd 9386682 MimeEntityBegin 9386682 MimeEntityHeadersEnd 9386728 Octets 107 -Lines 7 +Lines 6 MimeEntityEnd 9386835 MultipartBoundaryBegin 9386835 MultipartBoundaryEnd 9386879 @@ -6083,7 +6083,7 @@ MultipartBoundaryEnd 9387306 MimeEntityBegin 9387306 MimeEntityHeadersEnd 9387416 Octets 95 -Lines 5 +Lines 4 MimeEntityEnd 9387511 MultipartBoundaryBegin 9387511 MultipartBoundaryEnd 9387553 @@ -6094,18 +6094,18 @@ MimeEntityBegin 9387649 MimeEntityHeadersEnd 9388845 MimeMessageHeadersEnd 9388845 Octets 210 -Lines 6 +Lines 5 MimeEntityEnd 9389055 MimeMessageEnd 9389055 Octets 1406 -Lines 35 +Lines 34 MimeEntityEnd 9389055 MultipartBoundaryBegin 9389055 MultipartBoundaryEnd 9389097 MimeEntityBegin 9389097 MimeEntityHeadersEnd 9389267 Octets 490 -Lines 12 +Lines 11 MimeEntityEnd 9389757 MultipartEndBoundaryBegin 9389757 MultipartEndBoundaryEnd 9389799 @@ -6126,7 +6126,7 @@ MultipartEndBoundaryEnd 9395398 MultipartEpilogueBegin 9395398 MultipartEpilogueEnd 9395402 Octets 8982 -Lines 170 +Lines 169 MimeEntityEnd 9395402 MimeMessageEnd 9395402 MboxMarkerBegin 9395404 @@ -6136,7 +6136,7 @@ MimeEntityBegin 9395437 MimeEntityHeadersEnd 9396672 MimeMessageHeadersEnd 9396672 Octets 2920 -Lines 39 +Lines 38 MimeEntityEnd 9399592 MimeMessageEnd 9399592 MboxMarkerBegin 9399594 @@ -6146,7 +6146,7 @@ MimeEntityBegin 9399627 MimeEntityHeadersEnd 9400806 MimeMessageHeadersEnd 9400806 Octets 2152 -Lines 31 +Lines 30 MimeEntityEnd 9402958 MimeMessageEnd 9402958 MboxMarkerBegin 9402960 @@ -6162,7 +6162,7 @@ MultipartBoundaryEnd 9404127 MimeEntityBegin 9404127 MimeEntityHeadersEnd 9404194 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 9404194 MultipartBoundaryBegin 9404194 MultipartBoundaryEnd 9404229 @@ -6176,7 +6176,7 @@ MultipartEndBoundaryEnd 9407100 MultipartEpilogueBegin 9407100 MultipartEpilogueEnd 9407102 Octets 3010 -Lines 54 +Lines 53 MimeEntityEnd 9407102 MimeMessageEnd 9407102 MboxMarkerBegin 9407104 @@ -6206,14 +6206,14 @@ MultipartBoundaryEnd 9409784 MimeEntityBegin 9409784 MimeEntityHeadersEnd 9409884 Octets 1216 -Lines 17 +Lines 16 MimeEntityEnd 9411100 MultipartEndBoundaryBegin 9411100 MultipartEndBoundaryEnd 9411143 MultipartEpilogueBegin 9411143 MultipartEpilogueEnd 9411145 Octets 2952 -Lines 73 +Lines 72 MimeEntityEnd 9411145 MimeMessageEnd 9411145 MboxMarkerBegin 9411147 @@ -6229,7 +6229,7 @@ MultipartBoundaryEnd 9412321 MimeEntityBegin 9412321 MimeEntityHeadersEnd 9412394 Octets 159 -Lines 8 +Lines 7 MimeEntityEnd 9412553 MultipartBoundaryBegin 9412553 MultipartBoundaryEnd 9412598 @@ -6243,7 +6243,7 @@ MultipartEndBoundaryEnd 9416877 MultipartEpilogueBegin 9416877 MultipartEpilogueEnd 9416879 Octets 4603 -Lines 76 +Lines 75 MimeEntityEnd 9416879 MimeMessageEnd 9416879 MboxMarkerBegin 9416881 @@ -6289,21 +6289,21 @@ MultipartBoundaryEnd 9423344 MimeEntityBegin 9423344 MimeEntityHeadersEnd 9423425 Octets 77 -Lines 6 +Lines 5 MimeEntityEnd 9423502 MultipartBoundaryBegin 9423502 MultipartBoundaryEnd 9423545 MimeEntityBegin 9423545 MimeEntityHeadersEnd 9423643 Octets 3606 -Lines 48 +Lines 47 MimeEntityEnd 9427249 MultipartEndBoundaryBegin 9427249 MultipartEndBoundaryEnd 9427292 MultipartEpilogueBegin 9427292 MultipartEpilogueEnd 9427294 Octets 4131 -Lines 67 +Lines 66 MimeEntityEnd 9427294 MimeMessageEnd 9427294 MboxMarkerBegin 9427296 @@ -6349,7 +6349,7 @@ MultipartBoundaryEnd 9433897 MimeEntityBegin 9433897 MimeEntityHeadersEnd 9433938 Octets 194 -Lines 7 +Lines 6 MimeEntityEnd 9434132 MultipartBoundaryBegin 9434132 MultipartBoundaryEnd 9434159 @@ -6371,7 +6371,7 @@ MultipartEndBoundaryEnd 9435050 MultipartEpilogueBegin 9435050 MultipartEpilogueEnd 9435052 Octets 1297 -Lines 35 +Lines 34 MimeEntityEnd 9435052 MimeMessageEnd 9435052 MboxMarkerBegin 9435054 @@ -6381,7 +6381,7 @@ MimeEntityBegin 9435101 MimeEntityHeadersEnd 9435272 MimeMessageHeadersEnd 9435272 Octets 35086 -Lines 593 +Lines 592 MimeEntityEnd 9470358 MimeMessageEnd 9470358 MboxMarkerBegin 9470360 @@ -6391,7 +6391,7 @@ MimeEntityBegin 9470407 MimeEntityHeadersEnd 9470571 MimeMessageHeadersEnd 9470571 Octets 35086 -Lines 593 +Lines 592 MimeEntityEnd 9505657 MimeMessageEnd 9505657 MboxMarkerBegin 9505659 @@ -6417,21 +6417,21 @@ MultipartBoundaryEnd 9508682 MimeEntityBegin 9508682 MimeEntityHeadersEnd 9508710 Octets 355 -Lines 11 +Lines 10 MimeEntityEnd 9509065 MultipartBoundaryBegin 9509065 MultipartBoundaryEnd 9509107 MimeEntityBegin 9509107 MimeEntityHeadersEnd 9509204 Octets 245530 -Lines 3962 +Lines 3961 MimeEntityEnd 9754734 MultipartEndBoundaryBegin 9754734 MultipartEndBoundaryEnd 9754776 MultipartEpilogueBegin 9754776 MultipartEpilogueEnd 9754778 Octets 246136 -Lines 3983 +Lines 3982 MimeEntityEnd 9754778 MimeMessageEnd 9754778 MboxMarkerBegin 9754780 @@ -6454,7 +6454,7 @@ MultipartEndBoundaryEnd 9834349 MultipartEpilogueBegin 9834349 MultipartEpilogueEnd 9834353 Octets 78956 -Lines 417 +Lines 416 MimeEntityEnd 9834353 MimeMessageEnd 9834353 MboxMarkerBegin 9834355 @@ -6480,7 +6480,7 @@ MultipartBoundaryEnd 9839127 MimeEntityBegin 9839127 MimeEntityHeadersEnd 9839173 Octets 421 -Lines 8 +Lines 7 MimeEntityEnd 9839594 MultipartBoundaryBegin 9839594 MultipartBoundaryEnd 9839637 @@ -6493,56 +6493,56 @@ MultipartBoundaryEnd 9839768 MimeEntityBegin 9839768 MimeEntityHeadersEnd 9839862 Octets 72 -Lines 2 +Lines 1 MimeEntityEnd 9839934 MultipartBoundaryBegin 9839934 MultipartBoundaryEnd 9839979 MimeEntityBegin 9839979 MimeEntityHeadersEnd 9840082 Octets 10854 -Lines 158 +Lines 157 MimeEntityEnd 9850936 MultipartBoundaryBegin 9850936 MultipartBoundaryEnd 9850981 MimeEntityBegin 9850981 MimeEntityHeadersEnd 9851075 Octets 66 -Lines 3 +Lines 2 MimeEntityEnd 9851141 MultipartBoundaryBegin 9851141 MultipartBoundaryEnd 9851186 MimeEntityBegin 9851186 MimeEntityHeadersEnd 9851283 Octets 5990 -Lines 88 +Lines 87 MimeEntityEnd 9857273 MultipartBoundaryBegin 9857273 MultipartBoundaryEnd 9857318 MimeEntityBegin 9857318 MimeEntityHeadersEnd 9857412 Octets 35 -Lines 3 +Lines 2 MimeEntityEnd 9857447 MultipartBoundaryBegin 9857447 MultipartBoundaryEnd 9857492 MimeEntityBegin 9857492 MimeEntityHeadersEnd 9857597 Octets 11816 -Lines 171 +Lines 170 MimeEntityEnd 9869413 MultipartBoundaryBegin 9869413 MultipartBoundaryEnd 9869458 MimeEntityBegin 9869458 MimeEntityHeadersEnd 9869552 Octets 33 -Lines 3 +Lines 2 MimeEntityEnd 9869585 MultipartEndBoundaryBegin 9869585 MultipartEndBoundaryEnd 9869630 MultipartEpilogueBegin 9869630 MultipartEpilogueEnd 9869632 Octets 29907 -Lines 461 +Lines 460 MimeEntityEnd 9869632 MultipartEndBoundaryBegin 9869632 MultipartEndBoundaryEnd 9869675 @@ -6585,21 +6585,21 @@ MultipartBoundaryEnd 9876322 MimeEntityBegin 9876322 MimeEntityHeadersEnd 9876403 Octets 881 -Lines 19 +Lines 18 MimeEntityEnd 9877284 MultipartBoundaryBegin 9877284 MultipartBoundaryEnd 9877331 MimeEntityBegin 9877331 MimeEntityHeadersEnd 9877497 Octets 3702 -Lines 62 +Lines 61 MimeEntityEnd 9881199 MultipartEndBoundaryBegin 9881199 MultipartEndBoundaryEnd 9881246 MultipartEpilogueBegin 9881246 MultipartEpilogueEnd 9881248 Octets 4971 -Lines 93 +Lines 92 MimeEntityEnd 9881248 MimeMessageEnd 9881248 MboxMarkerBegin 9881250 @@ -6615,21 +6615,21 @@ MultipartBoundaryEnd 9881845 MimeEntityBegin 9881845 MimeEntityHeadersEnd 9881874 Octets 982 -Lines 20 +Lines 19 MimeEntityEnd 9882856 MultipartBoundaryBegin 9882856 MultipartBoundaryEnd 9882875 MimeEntityBegin 9882875 MimeEntityHeadersEnd 9882938 Octets 117312 -Lines 1587 +Lines 1586 MimeEntityEnd 10000250 MultipartEndBoundaryBegin 10000250 MultipartEndBoundaryEnd 10000269 MultipartEpilogueBegin 10000269 MultipartEpilogueEnd 10000273 Octets 118447 -Lines 1618 +Lines 1617 MimeEntityEnd 10000273 MimeMessageEnd 10000273 MboxMarkerBegin 10000275 @@ -6645,7 +6645,7 @@ MultipartBoundaryEnd 10001298 MimeEntityBegin 10001298 MimeEntityHeadersEnd 10001344 Octets 9312 -Lines 350 +Lines 349 MimeEntityEnd 10010656 MultipartBoundaryBegin 10010656 MultipartBoundaryEnd 10010699 @@ -6658,7 +6658,7 @@ MultipartBoundaryEnd 10010830 MimeEntityBegin 10010830 MimeEntityHeadersEnd 10010924 Octets 2844 -Lines 70 +Lines 69 MimeEntityEnd 10013768 MultipartBoundaryBegin 10013768 MultipartBoundaryEnd 10013813 @@ -6669,32 +6669,32 @@ MimeEntityBegin 10014016 MimeEntityHeadersEnd 10014045 MimeMessageHeadersEnd 10014045 Octets 4 -Lines 3 +Lines 2 MimeEntityEnd 10014049 MimeMessageEnd 10014049 Octets 33 -Lines 5 +Lines 4 MimeEntityEnd 10014049 MultipartBoundaryBegin 10014049 MultipartBoundaryEnd 10014094 MimeEntityBegin 10014094 MimeEntityHeadersEnd 10014188 Octets 996 -Lines 23 +Lines 22 MimeEntityEnd 10015184 MultipartBoundaryBegin 10015184 MultipartBoundaryEnd 10015229 MimeEntityBegin 10015229 MimeEntityHeadersEnd 10015349 Octets 374 -Lines 16 +Lines 15 MimeEntityEnd 10015723 MultipartBoundaryBegin 10015723 MultipartBoundaryEnd 10015768 MimeEntityBegin 10015768 MimeEntityHeadersEnd 10015862 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 10015874 MultipartBoundaryBegin 10015874 MultipartBoundaryEnd 10015919 @@ -6705,46 +6705,46 @@ MimeEntityBegin 10016110 MimeEntityHeadersEnd 10016139 MimeMessageHeadersEnd 10016139 Octets 2 -Lines 2 +Lines 1 MimeEntityEnd 10016141 MimeMessageEnd 10016141 Octets 31 -Lines 4 +Lines 3 MimeEntityEnd 10016141 MultipartBoundaryBegin 10016141 MultipartBoundaryEnd 10016186 MimeEntityBegin 10016186 MimeEntityHeadersEnd 10016280 Octets 12 -Lines 3 +Lines 2 MimeEntityEnd 10016292 MultipartBoundaryBegin 10016292 MultipartBoundaryEnd 10016337 MimeEntityBegin 10016337 MimeEntityHeadersEnd 10016447 Octets 3026 -Lines 44 +Lines 43 MimeEntityEnd 10019473 MultipartBoundaryBegin 10019473 MultipartBoundaryEnd 10019518 MimeEntityBegin 10019518 MimeEntityHeadersEnd 10019612 Octets 6852 -Lines 261 +Lines 260 MimeEntityEnd 10026464 MultipartEndBoundaryBegin 10026464 MultipartEndBoundaryEnd 10026509 MultipartEpilogueBegin 10026509 MultipartEpilogueEnd 10026511 Octets 15724 -Lines 476 +Lines 475 MimeEntityEnd 10026511 MultipartEndBoundaryBegin 10026511 MultipartEndBoundaryEnd 10026554 MultipartEpilogueBegin 10026554 MultipartEpilogueEnd 10026556 Octets 25457 -Lines 838 +Lines 837 MimeEntityEnd 10026556 MimeMessageEnd 10026556 MboxMarkerBegin 10026558 @@ -6760,28 +6760,28 @@ MultipartBoundaryEnd 10027713 MimeEntityBegin 10027713 MimeEntityHeadersEnd 10027715 Octets 341 -Lines 9 +Lines 8 MimeEntityEnd 10028056 MultipartBoundaryBegin 10028056 MultipartBoundaryEnd 10028069 MimeEntityBegin 10028069 MimeEntityHeadersEnd 10028131 Octets 30390 -Lines 412 +Lines 411 MimeEntityEnd 10058521 MultipartBoundaryBegin 10058521 MultipartBoundaryEnd 10058534 MimeEntityBegin 10058534 MimeEntityHeadersEnd 10058536 Octets 181 -Lines 10 +Lines 9 MimeEntityEnd 10058717 MultipartEndBoundaryBegin 10058717 MultipartEndBoundaryEnd 10058730 MultipartEpilogueBegin 10058730 MultipartEpilogueEnd 10058732 Octets 31030 -Lines 441 +Lines 440 MimeEntityEnd 10058732 MimeMessageEnd 10058732 MboxMarkerBegin 10058734 @@ -6791,7 +6791,7 @@ MimeEntityBegin 10058743 MimeEntityHeadersEnd 10060481 MimeMessageHeadersEnd 10060481 Octets 185750 -Lines 2952 +Lines 2951 MimeEntityEnd 10246231 MimeMessageEnd 10246231 MboxMarkerBegin 10246233 @@ -6828,7 +6828,7 @@ MultipartEndBoundaryEnd 10331706 MultipartEpilogueBegin 10331706 MultipartEpilogueEnd 10331708 Octets 84743 -Lines 456 +Lines 455 MimeEntityEnd 10331708 MimeMessageEnd 10331708 MboxMarkerBegin 10331710 @@ -6872,14 +6872,14 @@ MultipartBoundaryEnd 10366389 MimeEntityBegin 10366389 MimeEntityHeadersEnd 10366391 Octets 32 -Lines 3 +Lines 2 MimeEntityEnd 10366423 MultipartBoundaryBegin 10366423 MultipartBoundaryEnd 10366453 MimeEntityBegin 10366453 MimeEntityHeadersEnd 10366524 Octets 188027 -Lines 1991 +Lines 1990 MimeEntityEnd 10554551 MultipartBoundaryBegin 10554551 MultipartBoundaryEnd 10554581 @@ -6893,7 +6893,7 @@ MultipartEndBoundaryEnd 10554621 MultipartEpilogueBegin 10554621 MultipartEpilogueEnd 10554623 Octets 222222 -Lines 2197 +Lines 2196 MimeEntityEnd 10554623 MimeMessageEnd 10554623 MboxMarkerBegin 10554625 @@ -6919,7 +6919,7 @@ MultipartBoundaryEnd 10632489 MimeEntityBegin 10632489 MimeEntityHeadersEnd 10632491 Octets 1881 -Lines 35 +Lines 34 MimeEntityEnd 10634372 MultipartBoundaryBegin 10634372 MultipartBoundaryEnd 10634433 @@ -6932,42 +6932,42 @@ MultipartBoundaryEnd 10634600 MimeEntityBegin 10634600 MimeEntityHeadersEnd 10634676 Octets 2028 -Lines 30 +Lines 29 MimeEntityEnd 10636704 MultipartBoundaryBegin 10636704 MultipartBoundaryEnd 10636767 MimeEntityBegin 10636767 MimeEntityHeadersEnd 10636829 Octets 8038 -Lines 110 +Lines 109 MimeEntityEnd 10644867 MultipartBoundaryBegin 10644867 MultipartBoundaryEnd 10644930 MimeEntityBegin 10644930 MimeEntityHeadersEnd 10645003 Octets 5 -Lines 3 +Lines 2 MimeEntityEnd 10645008 MultipartBoundaryBegin 10645008 MultipartBoundaryEnd 10645071 MimeEntityBegin 10645071 MimeEntityHeadersEnd 10645168 Octets 42452 -Lines 575 +Lines 574 MimeEntityEnd 10687620 MultipartEndBoundaryBegin 10687620 MultipartEndBoundaryEnd 10687683 MultipartEpilogueBegin 10687683 MultipartEpilogueEnd 10687685 Octets 53146 -Lines 737 +Lines 736 MimeEntityEnd 10687685 MultipartEndBoundaryBegin 10687685 MultipartEndBoundaryEnd 10687746 MultipartEpilogueBegin 10687746 MultipartEpilogueEnd 10687748 Octets 55852 -Lines 788 +Lines 787 MimeEntityEnd 10687748 MimeMessageEnd 10687748 MboxMarkerBegin 10687750 @@ -6993,7 +6993,7 @@ MultipartBoundaryEnd 10693945 MimeEntityBegin 10693945 MimeEntityHeadersEnd 10693947 Octets 376 -Lines 9 +Lines 8 MimeEntityEnd 10694323 MultipartBoundaryBegin 10694323 MultipartBoundaryEnd 10694366 @@ -7006,28 +7006,28 @@ MultipartBoundaryEnd 10694497 MimeEntityBegin 10694497 MimeEntityHeadersEnd 10694570 Octets 93 -Lines 5 +Lines 4 MimeEntityEnd 10694663 MultipartBoundaryBegin 10694663 MultipartBoundaryEnd 10694708 MimeEntityBegin 10694708 MimeEntityHeadersEnd 10694826 Octets 5746 -Lines 84 +Lines 83 MimeEntityEnd 10700572 MultipartBoundaryBegin 10700572 MultipartBoundaryEnd 10700617 MimeEntityBegin 10700617 MimeEntityHeadersEnd 10700690 Octets 209 -Lines 7 +Lines 6 MimeEntityEnd 10700899 MultipartEndBoundaryBegin 10700899 MultipartEndBoundaryEnd 10700944 MultipartEpilogueBegin 10700944 MultipartEpilogueEnd 10700946 Octets 6492 -Lines 111 +Lines 110 MimeEntityEnd 10700946 MultipartEndBoundaryBegin 10700946 MultipartEndBoundaryEnd 10700989 From c4a0ba325275481ce6e4ec4132057ad426da199b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 3 Jul 2020 10:26:08 -0400 Subject: [PATCH 655/741] Updated unix offsets for the unit tests --- .../mbox/content-length.unix-offsets.txt | 128 +- UnitTests/TestData/mbox/jwz.unix-offsets.txt | 1224 ++++++++--------- 2 files changed, 676 insertions(+), 676 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt index 1a6118a883..99db8cfc6a 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.txt @@ -53,11 +53,11 @@ MimeEntityBegin 2582 MimeEntityHeadersEnd 3011 MimeMessageHeadersEnd 3011 Octets 37 -Lines 3 +Lines 2 MimeEntityEnd 3048 MimeMessageEnd 3048 Octets 466 -Lines 14 +Lines 13 MimeEntityEnd 3048 MultipartBoundaryBegin 3048 MultipartBoundaryEnd 3076 @@ -96,11 +96,11 @@ MimeEntityBegin 5799 MimeEntityHeadersEnd 6228 MimeMessageHeadersEnd 6228 Octets 37 -Lines 2 +Lines 1 MimeEntityEnd 6265 MimeMessageEnd 6265 Octets 466 -Lines 13 +Lines 12 MimeEntityEnd 6265 MultipartBoundaryBegin 6265 MultipartBoundaryEnd 6293 @@ -119,26 +119,26 @@ MimeEntityBegin 7545 MimeEntityHeadersEnd 7955 MimeMessageHeadersEnd 7955 Octets 5 -Lines 2 +Lines 1 MimeEntityEnd 7960 MimeMessageEnd 7960 Octets 415 -Lines 13 +Lines 12 MimeEntityEnd 7960 MimeMessageEnd 7960 Octets 926 -Lines 27 +Lines 26 MimeEntityEnd 7960 MimeMessageEnd 7960 Octets 1496 -Lines 42 +Lines 41 MimeEntityEnd 7960 MultipartBoundaryBegin 7960 MultipartBoundaryEnd 7988 MimeEntityBegin 7988 MimeEntityHeadersEnd 8041 Octets 52 -Lines 2 +Lines 1 MimeEntityEnd 8093 MultipartEndBoundaryBegin 8093 MultipartEndBoundaryEnd 8122 @@ -165,11 +165,11 @@ MimeEntityBegin 8823 MimeEntityHeadersEnd 9251 MimeMessageHeadersEnd 9251 Octets 37 -Lines 3 +Lines 2 MimeEntityEnd 9288 MimeMessageEnd 9288 Octets 465 -Lines 14 +Lines 13 MimeEntityEnd 9288 MultipartBoundaryBegin 9288 MultipartBoundaryEnd 9316 @@ -208,11 +208,11 @@ MimeEntityBegin 12059 MimeEntityHeadersEnd 12487 MimeMessageHeadersEnd 12487 Octets 37 -Lines 2 +Lines 1 MimeEntityEnd 12524 MimeMessageEnd 12524 Octets 465 -Lines 13 +Lines 12 MimeEntityEnd 12524 MultipartBoundaryBegin 12524 MultipartBoundaryEnd 12552 @@ -231,26 +231,26 @@ MimeEntityBegin 13814 MimeEntityHeadersEnd 14223 MimeMessageHeadersEnd 14223 Octets 5 -Lines 2 +Lines 1 MimeEntityEnd 14228 MimeMessageEnd 14228 Octets 414 -Lines 13 +Lines 12 MimeEntityEnd 14228 MimeMessageEnd 14228 Octets 928 -Lines 27 +Lines 26 MimeEntityEnd 14228 MimeMessageEnd 14228 Octets 1501 -Lines 42 +Lines 41 MimeEntityEnd 14228 MultipartBoundaryBegin 14228 MultipartBoundaryEnd 14256 MimeEntityBegin 14256 MimeEntityHeadersEnd 14313 Octets 52 -Lines 2 +Lines 1 MimeEntityEnd 14365 MultipartEndBoundaryBegin 14365 MultipartEndBoundaryEnd 14394 @@ -273,21 +273,21 @@ MultipartBoundaryEnd 15975 MimeEntityBegin 15975 MimeEntityHeadersEnd 16066 Octets 5199 -Lines 112 +Lines 111 MimeEntityEnd 21265 MultipartBoundaryBegin 21265 MultipartBoundaryEnd 21310 MimeEntityBegin 21310 MimeEntityHeadersEnd 21509 Octets 929 -Lines 14 +Lines 13 MimeEntityEnd 22438 MultipartEndBoundaryBegin 22438 MultipartEndBoundaryEnd 22484 MultipartEpilogueBegin 22484 MultipartEpilogueEnd 22485 Octets 6555 -Lines 140 +Lines 139 MimeEntityEnd 22485 MimeMessageEnd 22485 MboxMarkerBegin 22486 @@ -303,7 +303,7 @@ MultipartBoundaryEnd 23836 MimeEntityBegin 23836 MimeEntityHeadersEnd 23912 Octets 27 -Lines 4 +Lines 3 MimeEntityEnd 23939 MultipartBoundaryBegin 23939 MultipartBoundaryEnd 23978 @@ -320,7 +320,7 @@ MultipartBoundaryEnd 24929 MimeEntityBegin 24929 MimeEntityHeadersEnd 25005 Octets 627 -Lines 17 +Lines 16 MimeEntityEnd 25632 MultipartBoundaryBegin 25632 MultipartBoundaryEnd 25672 @@ -333,7 +333,7 @@ MultipartBoundaryEnd 25794 MimeEntityBegin 25794 MimeEntityHeadersEnd 25869 Octets 850 -Lines 19 +Lines 18 MimeEntityEnd 26719 MultipartBoundaryBegin 26719 MultipartBoundaryEnd 26759 @@ -347,25 +347,25 @@ MultipartEndBoundaryEnd 770951 MultipartEpilogueBegin 770951 MultipartEpilogueEnd 770952 Octets 745198 -Lines 10224 +Lines 10223 MimeEntityEnd 770952 MultipartEndBoundaryBegin 770952 MultipartEndBoundaryEnd 770993 MultipartEpilogueBegin 770993 MultipartEpilogueEnd 770996 Octets 746107 -Lines 10253 +Lines 10252 MimeEntityEnd 770996 MimeMessageEnd 770996 Octets 746928 -Lines 10269 +Lines 10268 MimeEntityEnd 770996 MultipartEndBoundaryBegin 770996 MultipartEndBoundaryEnd 771036 MultipartEpilogueBegin 771036 MultipartEpilogueEnd 771037 Octets 747285 -Lines 10286 +Lines 10285 MimeEntityEnd 771037 MimeMessageEnd 771037 MboxMarkerBegin 771038 @@ -381,42 +381,42 @@ MultipartBoundaryEnd 772379 MimeEntityBegin 772379 MimeEntityHeadersEnd 772470 Octets 2382 -Lines 51 +Lines 50 MimeEntityEnd 774852 MultipartBoundaryBegin 774852 MultipartBoundaryEnd 774897 MimeEntityBegin 774897 MimeEntityHeadersEnd 775056 Octets 6023 -Lines 80 +Lines 79 MimeEntityEnd 781079 MultipartBoundaryBegin 781079 MultipartBoundaryEnd 781124 MimeEntityBegin 781124 MimeEntityHeadersEnd 781282 Octets 12073 -Lines 158 +Lines 157 MimeEntityEnd 793355 MultipartBoundaryBegin 793355 MultipartBoundaryEnd 793400 MimeEntityBegin 793400 MimeEntityHeadersEnd 793560 Octets 21714 -Lines 283 +Lines 282 MimeEntityEnd 815274 MultipartBoundaryBegin 815274 MultipartBoundaryEnd 815319 MimeEntityBegin 815319 MimeEntityHeadersEnd 815522 Octets 3393 -Lines 46 +Lines 45 MimeEntityEnd 818915 MultipartEndBoundaryBegin 818915 MultipartEndBoundaryEnd 818961 MultipartEpilogueBegin 818961 MultipartEpilogueEnd 818962 Octets 46628 -Lines 650 +Lines 649 MimeEntityEnd 818962 MimeMessageEnd 818962 MboxMarkerBegin 818963 @@ -432,14 +432,14 @@ MultipartBoundaryEnd 819891 MimeEntityBegin 819891 MimeEntityHeadersEnd 819920 Octets 2530 -Lines 97 +Lines 96 MimeEntityEnd 822450 MultipartEndBoundaryBegin 822450 MultipartEndBoundaryEnd 822460 MultipartEpilogueBegin 822460 MultipartEpilogueEnd 822461 Octets 2579 -Lines 103 +Lines 102 MimeEntityEnd 822461 MimeMessageEnd 822461 MboxMarkerBegin 822462 @@ -455,21 +455,21 @@ MultipartBoundaryEnd 823664 MimeEntityBegin 823664 MimeEntityHeadersEnd 823665 Octets 901 -Lines 21 +Lines 20 MimeEntityEnd 824566 MultipartBoundaryBegin 824566 MultipartBoundaryEnd 824584 MimeEntityBegin 824584 MimeEntityHeadersEnd 824663 Octets 748 -Lines 13 +Lines 12 MimeEntityEnd 825411 MultipartEndBoundaryBegin 825411 MultipartEndBoundaryEnd 825430 MultipartEpilogueBegin 825430 MultipartEpilogueEnd 825431 Octets 1784 -Lines 42 +Lines 41 MimeEntityEnd 825431 MimeMessageEnd 825431 MboxMarkerBegin 825432 @@ -492,7 +492,7 @@ MultipartBoundaryEnd 827613 MimeEntityBegin 827613 MimeEntityHeadersEnd 827791 Octets 2215 -Lines 32 +Lines 31 MimeEntityEnd 830006 MultipartEndBoundaryBegin 830006 MultipartEndBoundaryEnd 830015 @@ -522,7 +522,7 @@ MultipartBoundaryEnd 834291 MimeEntityBegin 834291 MimeEntityHeadersEnd 834469 Octets 2547 -Lines 36 +Lines 35 MimeEntityEnd 837016 MultipartEndBoundaryBegin 837016 MultipartEndBoundaryEnd 837039 @@ -559,7 +559,7 @@ MultipartEndBoundaryEnd 853720 MultipartEpilogueBegin 853720 MultipartEpilogueEnd 853721 Octets 15749 -Lines 225 +Lines 224 MimeEntityEnd 853721 MimeMessageEnd 853721 MboxMarkerBegin 853722 @@ -599,7 +599,7 @@ MultipartEndBoundaryEnd 862353 MultipartEpilogueBegin 862353 MultipartEpilogueEnd 862354 Octets 4392 -Lines 70 +Lines 69 MimeEntityEnd 862354 MimeMessageEnd 862354 MboxMarkerBegin 862355 @@ -609,7 +609,7 @@ MimeEntityBegin 862387 MimeEntityHeadersEnd 863597 MimeMessageHeadersEnd 863597 Octets 3495 -Lines 56 +Lines 55 MimeEntityEnd 867092 MimeMessageEnd 867092 MboxMarkerBegin 867093 @@ -633,11 +633,11 @@ MimeEntityBegin 869679 MimeEntityHeadersEnd 871059 MimeMessageHeadersEnd 871059 Octets 1432 -Lines 21 +Lines 20 MimeEntityEnd 872491 MimeMessageEnd 872491 Octets 2812 -Lines 44 +Lines 43 MimeEntityEnd 872491 MimeMessageEnd 872491 MboxMarkerBegin 872492 @@ -653,7 +653,7 @@ MultipartBoundaryEnd 873307 MimeEntityBegin 873307 MimeEntityHeadersEnd 873383 Octets 15 -Lines 2 +Lines 1 MimeEntityEnd 873398 MultipartBoundaryBegin 873398 MultipartBoundaryEnd 873426 @@ -664,18 +664,18 @@ MimeEntityBegin 873580 MimeEntityHeadersEnd 874960 MimeMessageHeadersEnd 874960 Octets 1432 -Lines 21 +Lines 20 MimeEntityEnd 876392 MimeMessageEnd 876392 Octets 2812 -Lines 44 +Lines 43 MimeEntityEnd 876392 MultipartEndBoundaryBegin 876392 MultipartEndBoundaryEnd 876421 MultipartEpilogueBegin 876421 MultipartEpilogueEnd 876422 Octets 3188 -Lines 59 +Lines 58 MimeEntityEnd 876422 MimeMessageEnd 876422 MboxMarkerBegin 876423 @@ -705,7 +705,7 @@ MultipartEndBoundaryEnd 883130 MultipartEpilogueBegin 883130 MultipartEpilogueEnd 883131 Octets 6011 -Lines 92 +Lines 91 MimeEntityEnd 883131 MimeMessageEnd 883131 MboxMarkerBegin 883132 @@ -745,7 +745,7 @@ MultipartEndBoundaryEnd 898683 MultipartEpilogueBegin 898683 MultipartEpilogueEnd 898684 Octets 2813 -Lines 55 +Lines 54 MimeEntityEnd 898684 MimeMessageEnd 898684 MboxMarkerBegin 898685 @@ -765,7 +765,7 @@ MimeEntityBegin 899821 MimeEntityHeadersEnd 901036 MimeMessageHeadersEnd 901036 Octets 2882 -Lines 39 +Lines 38 MimeEntityEnd 903918 MimeMessageEnd 903918 MboxMarkerBegin 903919 @@ -775,7 +775,7 @@ MimeEntityBegin 903951 MimeEntityHeadersEnd 905109 MimeMessageHeadersEnd 905109 Octets 2122 -Lines 31 +Lines 30 MimeEntityEnd 907231 MimeMessageEnd 907231 MboxMarkerBegin 907232 @@ -791,7 +791,7 @@ MultipartBoundaryEnd 908375 MimeEntityBegin 908375 MimeEntityHeadersEnd 908439 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 908439 MultipartBoundaryBegin 908439 MultipartBoundaryEnd 908472 @@ -805,7 +805,7 @@ MultipartEndBoundaryEnd 911298 MultipartEpilogueBegin 911298 MultipartEpilogueEnd 911299 Octets 2957 -Lines 54 +Lines 53 MimeEntityEnd 911299 MimeMessageEnd 911299 MboxMarkerBegin 911300 @@ -835,14 +835,14 @@ MultipartBoundaryEnd 913909 MimeEntityBegin 913909 MimeEntityHeadersEnd 914006 Octets 1200 -Lines 17 +Lines 16 MimeEntityEnd 915206 MultipartEndBoundaryBegin 915206 MultipartEndBoundaryEnd 915248 MultipartEpilogueBegin 915248 MultipartEpilogueEnd 915249 Octets 2880 -Lines 73 +Lines 72 MimeEntityEnd 915249 MimeMessageEnd 915249 MboxMarkerBegin 915250 @@ -858,7 +858,7 @@ MultipartBoundaryEnd 916400 MimeEntityBegin 916400 MimeEntityHeadersEnd 916470 Octets 152 -Lines 8 +Lines 7 MimeEntityEnd 916622 MultipartBoundaryBegin 916622 MultipartBoundaryEnd 916665 @@ -872,7 +872,7 @@ MultipartEndBoundaryEnd 920884 MultipartEpilogueBegin 920884 MultipartEpilogueEnd 920885 Octets 4528 -Lines 76 +Lines 75 MimeEntityEnd 920885 MimeMessageEnd 920885 MboxMarkerBegin 920886 @@ -918,7 +918,7 @@ MultipartBoundaryEnd 927369 MimeEntityBegin 927369 MimeEntityHeadersEnd 927408 Octets 188 -Lines 7 +Lines 6 MimeEntityEnd 927596 MultipartBoundaryBegin 927596 MultipartBoundaryEnd 927621 @@ -940,7 +940,7 @@ MultipartEndBoundaryEnd 928494 MultipartEpilogueBegin 928494 MultipartEpilogueEnd 928495 Octets 1263 -Lines 35 +Lines 34 MimeEntityEnd 928495 MimeMessageEnd 928495 MboxMarkerBegin 928496 @@ -956,14 +956,14 @@ MultipartBoundaryEnd 930437 MimeEntityBegin 930437 MimeEntityHeadersEnd 930515 Octets 863 -Lines 19 +Lines 18 MimeEntityEnd 931378 MultipartBoundaryBegin 931378 MultipartBoundaryEnd 931423 MimeEntityBegin 931423 MimeEntityHeadersEnd 931584 Octets 3641 -Lines 62 +Lines 61 MimeEntityEnd 935225 MultipartEndBoundaryBegin 935225 MultipartEndBoundaryEnd 935271 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt index 2efb52995d..6ce00d6065 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.txt @@ -24,7 +24,7 @@ MultipartBoundaryEnd 1409 MimeEntityBegin 1409 MimeEntityHeadersEnd 1493 Octets 31046 -Lines 427 +Lines 426 MimeEntityEnd 32539 MultipartEndBoundaryBegin 32539 MultipartEndBoundaryEnd 32572 @@ -44,14 +44,14 @@ MultipartBoundaryEnd 32714 MimeEntityBegin 32714 MimeEntityHeadersEnd 32796 Octets 25648 -Lines 353 +Lines 352 MimeEntityEnd 58444 MultipartBoundaryBegin 58444 MultipartBoundaryEnd 58476 MimeEntityBegin 58476 MimeEntityHeadersEnd 58558 Octets 18413 -Lines 254 +Lines 253 MimeEntityEnd 76971 MultipartBoundaryBegin 76971 MultipartBoundaryEnd 77003 @@ -65,7 +65,7 @@ MultipartBoundaryEnd 120838 MimeEntityBegin 120838 MimeEntityHeadersEnd 120899 Octets 8846 -Lines 358 +Lines 357 MimeEntityEnd 129745 MultipartEndBoundaryBegin 129745 MultipartEndBoundaryEnd 129778 @@ -79,14 +79,14 @@ MultipartBoundaryEnd 129796 MimeEntityBegin 129796 MimeEntityHeadersEnd 129880 Octets 47175 -Lines 648 +Lines 647 MimeEntityEnd 177055 MultipartEndBoundaryBegin 177055 MultipartEndBoundaryEnd 177074 MultipartEpilogueBegin 177074 MultipartEpilogueEnd 177075 Octets 176558 -Lines 4536 +Lines 4535 MimeEntityEnd 177075 MimeMessageEnd 177075 MboxMarkerBegin 177076 @@ -96,7 +96,7 @@ MimeEntityBegin 177084 MimeEntityHeadersEnd 177633 MimeMessageHeadersEnd 177633 Octets 135270 -Lines 1855 +Lines 1854 MimeEntityEnd 312903 MimeMessageEnd 312903 MboxMarkerBegin 312904 @@ -122,7 +122,7 @@ MultipartBoundaryEnd 314342 MimeEntityBegin 314342 MimeEntityHeadersEnd 314386 Octets 233 -Lines 7 +Lines 6 MimeEntityEnd 314619 MultipartBoundaryBegin 314619 MultipartBoundaryEnd 314660 @@ -135,28 +135,28 @@ MultipartBoundaryEnd 314787 MimeEntityBegin 314787 MimeEntityHeadersEnd 314878 Octets 146 -Lines 4 +Lines 3 MimeEntityEnd 315024 MultipartBoundaryBegin 315024 MultipartBoundaryEnd 315067 MimeEntityBegin 315067 MimeEntityHeadersEnd 315177 Octets 4368 -Lines 65 +Lines 64 MimeEntityEnd 319545 MultipartBoundaryBegin 319545 MultipartBoundaryEnd 319588 MimeEntityBegin 319588 MimeEntityHeadersEnd 319679 Octets 45 -Lines 4 +Lines 3 MimeEntityEnd 319724 MultipartEndBoundaryBegin 319724 MultipartEndBoundaryEnd 319768 MultipartEpilogueBegin 319768 MultipartEpilogueEnd 319769 Octets 5024 -Lines 88 +Lines 87 MimeEntityEnd 319769 MultipartEndBoundaryBegin 319769 MultipartEndBoundaryEnd 319811 @@ -179,7 +179,7 @@ MultipartBoundaryEnd 320825 MimeEntityBegin 320825 MimeEntityHeadersEnd 320898 Octets 424 -Lines 13 +Lines 12 MimeEntityEnd 321322 MultipartBoundaryBegin 321322 MultipartBoundaryEnd 321385 @@ -196,14 +196,14 @@ MultipartBoundaryEnd 322557 MimeEntityBegin 322557 MimeEntityHeadersEnd 322651 Octets 104 -Lines 7 +Lines 6 MimeEntityEnd 322755 MultipartBoundaryBegin 322755 MultipartBoundaryEnd 322786 MimeEntityBegin 322786 MimeEntityHeadersEnd 322875 Octets 20627 -Lines 284 +Lines 283 MimeEntityEnd 343502 MultipartBoundaryBegin 343502 MultipartBoundaryEnd 343533 @@ -213,25 +213,25 @@ Octets 0 Lines 0 MimeEntityEnd 343533 Octets 21282 -Lines 309 +Lines 308 MimeEntityEnd 343533 MimeMessageEnd 343533 Octets 22118 -Lines 325 +Lines 324 MimeEntityEnd 343533 MultipartBoundaryBegin 343533 MultipartBoundaryEnd 343596 MimeEntityBegin 343596 MimeEntityHeadersEnd 343669 Octets 107 -Lines 5 +Lines 4 MimeEntityEnd 343776 MultipartEndBoundaryBegin 343776 MultipartEndBoundaryEnd 343840 MultipartEpilogueBegin 343840 MultipartEpilogueEnd 343841 Octets 23273 -Lines 360 +Lines 359 MimeEntityEnd 343841 MimeMessageEnd 343841 MboxMarkerBegin 343842 @@ -247,7 +247,7 @@ MultipartBoundaryEnd 344763 MimeEntityBegin 344763 MimeEntityHeadersEnd 344807 Octets 760 -Lines 19 +Lines 18 MimeEntityEnd 345567 MultipartBoundaryBegin 345567 MultipartBoundaryEnd 345608 @@ -260,70 +260,70 @@ MultipartBoundaryEnd 345735 MimeEntityBegin 345735 MimeEntityHeadersEnd 345826 Octets 225 -Lines 5 +Lines 4 MimeEntityEnd 346051 MultipartBoundaryBegin 346051 MultipartBoundaryEnd 346094 MimeEntityBegin 346094 MimeEntityHeadersEnd 346202 Octets 675064 -Lines 8983 +Lines 8982 MimeEntityEnd 1021266 MultipartBoundaryBegin 1021266 MultipartBoundaryEnd 1021309 MimeEntityBegin 1021309 MimeEntityHeadersEnd 1021400 Octets 116 -Lines 6 +Lines 5 MimeEntityEnd 1021516 MultipartBoundaryBegin 1021516 MultipartBoundaryEnd 1021559 MimeEntityBegin 1021559 MimeEntityHeadersEnd 1021685 Octets 681136 -Lines 9061 +Lines 9060 MimeEntityEnd 1702821 MultipartBoundaryBegin 1702821 MultipartBoundaryEnd 1702864 MimeEntityBegin 1702864 MimeEntityHeadersEnd 1702955 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 1702965 MultipartBoundaryBegin 1702965 MultipartBoundaryEnd 1703008 MimeEntityBegin 1703008 MimeEntityHeadersEnd 1703125 Octets 68178 -Lines 935 +Lines 934 MimeEntityEnd 1771303 MultipartBoundaryBegin 1771303 MultipartBoundaryEnd 1771346 MimeEntityBegin 1771346 MimeEntityHeadersEnd 1771437 Octets 138 -Lines 6 +Lines 5 MimeEntityEnd 1771575 MultipartBoundaryBegin 1771575 MultipartBoundaryEnd 1771618 MimeEntityBegin 1771618 MimeEntityHeadersEnd 1771736 Octets 336762 -Lines 4473 +Lines 4472 MimeEntityEnd 2108498 MultipartBoundaryBegin 2108498 MultipartBoundaryEnd 2108541 MimeEntityBegin 2108541 MimeEntityHeadersEnd 2108632 Octets 5 -Lines 2 +Lines 1 MimeEntityEnd 2108637 MultipartEndBoundaryBegin 2108637 MultipartEndBoundaryEnd 2108681 MultipartEpilogueBegin 2108681 MultipartEpilogueEnd 2108682 Octets 1762989 -Lines 23516 +Lines 23515 MimeEntityEnd 2108682 MultipartEndBoundaryBegin 2108682 MultipartEndBoundaryEnd 2108724 @@ -340,7 +340,7 @@ MimeEntityBegin 2108733 MimeEntityHeadersEnd 2109749 MimeMessageHeadersEnd 2109749 Octets 1125 -Lines 40 +Lines 39 MimeEntityEnd 2110874 MimeMessageEnd 2110874 MboxMarkerBegin 2110875 @@ -390,7 +390,7 @@ MultipartBoundaryEnd 2270935 MimeEntityBegin 2270935 MimeEntityHeadersEnd 2270991 Octets 4720 -Lines 196 +Lines 195 MimeEntityEnd 2275711 MultipartEndBoundaryBegin 2275711 MultipartEndBoundaryEnd 2275728 @@ -407,7 +407,7 @@ MimeEntityBegin 2275737 MimeEntityHeadersEnd 2276689 MimeMessageHeadersEnd 2276689 Octets 343060 -Lines 4457 +Lines 4456 MimeEntityEnd 2619749 MimeMessageEnd 2619749 MboxMarkerBegin 2619750 @@ -436,7 +436,7 @@ MultipartBoundaryEnd 2620753 MimeEntityBegin 2620753 MimeEntityHeadersEnd 2620850 Octets 31046 -Lines 427 +Lines 426 MimeEntityEnd 2651896 MultipartEndBoundaryBegin 2651896 MultipartEndBoundaryEnd 2651929 @@ -460,7 +460,7 @@ MimeEntityBegin 2651957 MimeEntityHeadersEnd 2652514 MimeMessageHeadersEnd 2652514 Octets 56779 -Lines 783 +Lines 782 MimeEntityEnd 2709293 MimeMessageEnd 2709293 MboxMarkerBegin 2709294 @@ -476,7 +476,7 @@ MultipartBoundaryEnd 2710619 MimeEntityBegin 2710619 MimeEntityHeadersEnd 2710620 Octets 552 -Lines 15 +Lines 14 MimeEntityEnd 2711172 MultipartBoundaryBegin 2711172 MultipartBoundaryEnd 2711231 @@ -489,28 +489,28 @@ MultipartBoundaryEnd 2711394 MimeEntityBegin 2711394 MimeEntityHeadersEnd 2711467 Octets 419 -Lines 8 +Lines 7 MimeEntityEnd 2711886 MultipartBoundaryBegin 2711886 MultipartBoundaryEnd 2711947 MimeEntityBegin 2711947 MimeEntityHeadersEnd 2712006 Octets 29261 -Lines 402 +Lines 401 MimeEntityEnd 2741267 MultipartBoundaryBegin 2741267 MultipartBoundaryEnd 2741328 MimeEntityBegin 2741328 MimeEntityHeadersEnd 2741398 Octets 41 -Lines 5 +Lines 4 MimeEntityEnd 2741439 MultipartEndBoundaryBegin 2741439 MultipartEndBoundaryEnd 2741501 MultipartEpilogueBegin 2741501 MultipartEpilogueEnd 2741502 Octets 30168 -Lines 429 +Lines 428 MimeEntityEnd 2741502 MultipartEndBoundaryBegin 2741502 MultipartEndBoundaryEnd 2741562 @@ -533,7 +533,7 @@ MultipartBoundaryEnd 2742593 MimeEntityBegin 2742593 MimeEntityHeadersEnd 2742594 Octets 821 -Lines 28 +Lines 27 MimeEntityEnd 2743415 MultipartBoundaryBegin 2743415 MultipartBoundaryEnd 2743445 @@ -553,7 +553,7 @@ MultipartBoundaryEnd 2743744 MimeEntityBegin 2743744 MimeEntityHeadersEnd 2743809 Octets 1197 -Lines 18 +Lines 17 MimeEntityEnd 2745006 MultipartBoundaryBegin 2745006 MultipartBoundaryEnd 2745038 @@ -567,7 +567,7 @@ MultipartBoundaryEnd 2745164 MimeEntityBegin 2745164 MimeEntityHeadersEnd 2745229 Octets 1205 -Lines 18 +Lines 17 MimeEntityEnd 2746434 MultipartBoundaryBegin 2746434 MultipartBoundaryEnd 2746466 @@ -581,14 +581,14 @@ MultipartEndBoundaryEnd 2747074 MultipartEpilogueBegin 2747074 MultipartEpilogueEnd 2747075 Octets 3557 -Lines 76 +Lines 75 MimeEntityEnd 2747075 MultipartEndBoundaryBegin 2747075 MultipartEndBoundaryEnd 2747106 MultipartEpilogueBegin 2747106 MultipartEpilogueEnd 2747107 Octets 4883 -Lines 119 +Lines 118 MimeEntityEnd 2747107 MimeMessageEnd 2747107 MboxMarkerBegin 2747108 @@ -598,7 +598,7 @@ MimeEntityBegin 2747116 MimeEntityHeadersEnd 2748092 MimeMessageHeadersEnd 2748092 Octets 1382 -Lines 33 +Lines 32 MimeEntityEnd 2749474 MimeMessageEnd 2749474 MboxMarkerBegin 2749475 @@ -634,7 +634,7 @@ MultipartBoundaryEnd 2752420 MimeEntityBegin 2752420 MimeEntityHeadersEnd 2752466 Octets 72 -Lines 6 +Lines 5 MimeEntityEnd 2752538 MultipartBoundaryBegin 2752538 MultipartBoundaryEnd 2752578 @@ -647,21 +647,21 @@ MultipartBoundaryEnd 2752707 MimeEntityBegin 2752707 MimeEntityHeadersEnd 2752862 Octets 65917 -Lines 958 +Lines 957 MimeEntityEnd 2818779 MultipartBoundaryBegin 2818779 MultipartBoundaryEnd 2818820 MimeEntityBegin 2818820 MimeEntityHeadersEnd 2819029 Octets 364281 -Lines 5282 +Lines 5281 MimeEntityEnd 3183310 MultipartEndBoundaryBegin 3183310 MultipartEndBoundaryEnd 3183352 MultipartEpilogueBegin 3183352 MultipartEpilogueEnd 3183354 Octets 430689 -Lines 6257 +Lines 6256 MimeEntityEnd 3183354 MultipartEndBoundaryBegin 3183354 MultipartEndBoundaryEnd 3183395 @@ -684,7 +684,7 @@ MultipartBoundaryEnd 3184430 MimeEntityBegin 3184430 MimeEntityHeadersEnd 3184476 Octets 72 -Lines 6 +Lines 5 MimeEntityEnd 3184548 MultipartBoundaryBegin 3184548 MultipartBoundaryEnd 3184588 @@ -697,21 +697,21 @@ MultipartBoundaryEnd 3184716 MimeEntityBegin 3184716 MimeEntityHeadersEnd 3184871 Octets 65917 -Lines 958 +Lines 957 MimeEntityEnd 3250788 MultipartBoundaryBegin 3250788 MultipartBoundaryEnd 3250829 MimeEntityBegin 3250829 MimeEntityHeadersEnd 3251038 Octets 364281 -Lines 5282 +Lines 5281 MimeEntityEnd 3615319 MultipartEndBoundaryBegin 3615319 MultipartEndBoundaryEnd 3615361 MultipartEpilogueBegin 3615361 MultipartEpilogueEnd 3615363 Octets 430689 -Lines 6257 +Lines 6256 MimeEntityEnd 3615363 MultipartEndBoundaryBegin 3615363 MultipartEndBoundaryEnd 3615404 @@ -752,21 +752,21 @@ MultipartBoundaryEnd 3617323 MimeEntityBegin 3617323 MimeEntityHeadersEnd 3617349 Octets 180 -Lines 7 +Lines 6 MimeEntityEnd 3617529 MultipartBoundaryBegin 3617529 MultipartBoundaryEnd 3617573 MimeEntityBegin 3617573 MimeEntityHeadersEnd 3617645 Octets 892 -Lines 13 +Lines 12 MimeEntityEnd 3618537 MultipartEndBoundaryBegin 3618537 MultipartEndBoundaryEnd 3618582 MultipartEpilogueBegin 3618582 MultipartEpilogueEnd 3618690 Octets 1411 -Lines 34 +Lines 33 MimeEntityEnd 3618690 MimeMessageEnd 3618690 MboxMarkerBegin 3618691 @@ -782,7 +782,7 @@ MultipartBoundaryEnd 3619314 MimeEntityBegin 3619314 MimeEntityHeadersEnd 3619315 Octets 392 -Lines 11 +Lines 10 MimeEntityEnd 3619707 MultipartBoundaryBegin 3619707 MultipartBoundaryEnd 3619747 @@ -793,18 +793,18 @@ MimeEntityBegin 3619777 MimeEntityHeadersEnd 3620564 MimeMessageHeadersEnd 3620564 Octets 3353 -Lines 73 +Lines 72 MimeEntityEnd 3623917 MimeMessageEnd 3623917 Octets 4140 -Lines 89 +Lines 88 MimeEntityEnd 3623917 MultipartEndBoundaryBegin 3623917 MultipartEndBoundaryEnd 3623958 MultipartEpilogueBegin 3623958 MultipartEpilogueEnd 3623959 Octets 4721 -Lines 109 +Lines 108 MimeEntityEnd 3623959 MimeMessageEnd 3623959 MboxMarkerBegin 3623960 @@ -852,7 +852,7 @@ MimeEntityBegin 3625857 MimeEntityHeadersEnd 3626367 MimeMessageHeadersEnd 3626367 Octets 1419 -Lines 46 +Lines 45 MimeEntityEnd 3627786 MimeMessageEnd 3627786 MboxMarkerBegin 3627787 @@ -862,7 +862,7 @@ MimeEntityBegin 3627838 MimeEntityHeadersEnd 3628410 MimeMessageHeadersEnd 3628410 Octets 59701 -Lines 955 +Lines 954 MimeEntityEnd 3688111 MimeMessageEnd 3688111 MboxMarkerBegin 3688112 @@ -872,7 +872,7 @@ MimeEntityBegin 3688163 MimeEntityHeadersEnd 3688732 MimeMessageHeadersEnd 3688732 Octets 59807 -Lines 961 +Lines 960 MimeEntityEnd 3748539 MimeMessageEnd 3748539 MboxMarkerBegin 3748540 @@ -888,21 +888,21 @@ MultipartBoundaryEnd 3749112 MimeEntityBegin 3749112 MimeEntityHeadersEnd 3749139 Octets 71 -Lines 5 +Lines 4 MimeEntityEnd 3749210 MultipartBoundaryBegin 3749210 MultipartBoundaryEnd 3749226 MimeEntityBegin 3749226 MimeEntityHeadersEnd 3749307 Octets 641 -Lines 10 +Lines 9 MimeEntityEnd 3749948 MultipartEndBoundaryBegin 3749948 MultipartEndBoundaryEnd 3749965 MultipartEpilogueBegin 3749965 MultipartEpilogueEnd 3749967 Octets 871 -Lines 26 +Lines 25 MimeEntityEnd 3749967 MimeMessageEnd 3749967 MboxMarkerBegin 3749968 @@ -912,7 +912,7 @@ MimeEntityBegin 3749976 MimeEntityHeadersEnd 3750723 MimeMessageHeadersEnd 3750723 Octets 41530 -Lines 571 +Lines 570 MimeEntityEnd 3792253 MimeMessageEnd 3792253 MboxMarkerBegin 3792254 @@ -928,21 +928,21 @@ MultipartBoundaryEnd 3793421 MimeEntityBegin 3793421 MimeEntityHeadersEnd 3793422 Octets 1922 -Lines 44 +Lines 43 MimeEntityEnd 3795344 MultipartBoundaryBegin 3795344 MultipartBoundaryEnd 3795350 MimeEntityBegin 3795350 MimeEntityHeadersEnd 3795455 Octets 6222 -Lines 87 +Lines 86 MimeEntityEnd 3801677 MultipartEndBoundaryBegin 3801677 MultipartEndBoundaryEnd 3801684 MultipartEpilogueBegin 3801684 MultipartEpilogueEnd 3801685 Octets 8269 -Lines 140 +Lines 139 MimeEntityEnd 3801685 MimeMessageEnd 3801685 MboxMarkerBegin 3801686 @@ -952,7 +952,7 @@ MimeEntityBegin 3801694 MimeEntityHeadersEnd 3803142 MimeMessageHeadersEnd 3803142 Octets 106813 -Lines 1571 +Lines 1570 MimeEntityEnd 3909955 MimeMessageEnd 3909955 MboxMarkerBegin 3909956 @@ -980,7 +980,7 @@ MultipartBoundaryEnd 3912327 MimeEntityBegin 3912327 MimeEntityHeadersEnd 3912403 Octets 49 -Lines 2 +Lines 1 MimeEntityEnd 3912452 MultipartBoundaryBegin 3912452 MultipartBoundaryEnd 3912511 @@ -997,7 +997,7 @@ MultipartBoundaryEnd 3913167 MimeEntityBegin 3913167 MimeEntityHeadersEnd 3913243 Octets 122 -Lines 6 +Lines 5 MimeEntityEnd 3913365 MultipartBoundaryBegin 3913365 MultipartBoundaryEnd 3913414 @@ -1011,30 +1011,30 @@ MultipartEndBoundaryEnd 3913816 MultipartEpilogueBegin 3913816 MultipartEpilogueEnd 3913817 Octets 744 -Lines 23 +Lines 22 MimeEntityEnd 3913817 MimeMessageEnd 3913817 Octets 1244 -Lines 39 +Lines 38 MimeEntityEnd 3913817 MultipartEndBoundaryBegin 3913817 MultipartEndBoundaryEnd 3913877 MultipartEpilogueBegin 3913877 MultipartEpilogueEnd 3913880 Octets 1657 -Lines 55 +Lines 54 MimeEntityEnd 3913880 MimeMessageEnd 3913880 Octets 2205 -Lines 71 +Lines 70 MimeEntityEnd 3913880 MimeMessageEnd 3913880 Octets 2747 -Lines 87 +Lines 86 MimeEntityEnd 3913880 MimeMessageEnd 3913880 Octets 3317 -Lines 103 +Lines 102 MimeEntityEnd 3913880 MimeMessageEnd 3913880 MboxMarkerBegin 3913881 @@ -1064,7 +1064,7 @@ MultipartBoundaryEnd 3992078 MimeEntityBegin 3992078 MimeEntityHeadersEnd 3992079 Octets 31 -Lines 4 +Lines 3 MimeEntityEnd 3992110 MultipartBoundaryBegin 3992110 MultipartBoundaryEnd 3992138 @@ -1099,7 +1099,7 @@ MultipartEndBoundaryEnd 4176061 MultipartEpilogueBegin 4176061 MultipartEpilogueEnd 4176062 Octets 261470 -Lines 2211 +Lines 2210 MimeEntityEnd 4176062 MimeMessageEnd 4176062 MboxMarkerBegin 4176063 @@ -1109,7 +1109,7 @@ MimeEntityBegin 4176071 MimeEntityHeadersEnd 4176736 MimeMessageHeadersEnd 4176736 Octets 992 -Lines 19 +Lines 18 MimeEntityEnd 4177728 MimeMessageEnd 4177728 MboxMarkerBegin 4177729 @@ -1125,7 +1125,7 @@ MultipartBoundaryEnd 4178988 MimeEntityBegin 4178988 MimeEntityHeadersEnd 4179032 Octets 404 -Lines 14 +Lines 13 MimeEntityEnd 4179436 MultipartBoundaryBegin 4179436 MultipartBoundaryEnd 4179477 @@ -1138,35 +1138,35 @@ MultipartBoundaryEnd 4179604 MimeEntityBegin 4179604 MimeEntityHeadersEnd 4179695 Octets 225 -Lines 5 +Lines 4 MimeEntityEnd 4179920 MultipartBoundaryBegin 4179920 MultipartBoundaryEnd 4179963 MimeEntityBegin 4179963 MimeEntityHeadersEnd 4180082 Octets 1384 -Lines 38 +Lines 37 MimeEntityEnd 4181466 MultipartBoundaryBegin 4181466 MultipartBoundaryEnd 4181509 MimeEntityBegin 4181509 MimeEntityHeadersEnd 4181600 Octets 148 -Lines 10 +Lines 9 MimeEntityEnd 4181748 MultipartEndBoundaryBegin 4181748 MultipartEndBoundaryEnd 4181792 MultipartEpilogueBegin 4181792 MultipartEpilogueEnd 4181793 Octets 2231 -Lines 68 +Lines 67 MimeEntityEnd 4181793 MultipartEndBoundaryBegin 4181793 MultipartEndBoundaryEnd 4181835 MultipartEpilogueBegin 4181835 MultipartEpilogueEnd 4181836 Octets 3043 -Lines 94 +Lines 93 MimeEntityEnd 4181836 MimeMessageEnd 4181836 MboxMarkerBegin 4181837 @@ -1182,21 +1182,21 @@ MultipartBoundaryEnd 4182531 MimeEntityBegin 4182531 MimeEntityHeadersEnd 4182558 Octets 78 -Lines 7 +Lines 6 MimeEntityEnd 4182636 MultipartBoundaryBegin 4182636 MultipartBoundaryEnd 4182653 MimeEntityBegin 4182653 MimeEntityHeadersEnd 4182713 Octets 5163 -Lines 72 +Lines 71 MimeEntityEnd 4187876 MultipartEndBoundaryBegin 4187876 MultipartEndBoundaryEnd 4187894 MultipartEpilogueBegin 4187894 MultipartEpilogueEnd 4187896 Octets 5381 -Lines 89 +Lines 88 MimeEntityEnd 4187896 MimeMessageEnd 4187896 MboxMarkerBegin 4187897 @@ -1206,7 +1206,7 @@ MimeEntityBegin 4187905 MimeEntityHeadersEnd 4188357 MimeMessageHeadersEnd 4188357 Octets 11414 -Lines 186 +Lines 185 MimeEntityEnd 4199771 MimeMessageEnd 4199771 MboxMarkerBegin 4199772 @@ -1222,7 +1222,7 @@ MultipartBoundaryEnd 4200356 MimeEntityBegin 4200356 MimeEntityHeadersEnd 4200357 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 4200395 MultipartBoundaryBegin 4200395 MultipartBoundaryEnd 4200407 @@ -1239,11 +1239,11 @@ MimeEntityBegin 4200592 MimeEntityHeadersEnd 4200669 MimeMessageHeadersEnd 4200669 Octets 67 -Lines 3 +Lines 2 MimeEntityEnd 4200736 MimeMessageEnd 4200736 Octets 144 -Lines 6 +Lines 5 MimeEntityEnd 4200736 MultipartBoundaryBegin 4200736 MultipartBoundaryEnd 4200751 @@ -1258,7 +1258,7 @@ Lines 0 MimeEntityEnd 4201014 MimeMessageEnd 4201014 Octets 76 -Lines 3 +Lines 2 MimeEntityEnd 4201014 MultipartBoundaryBegin 4201014 MultipartBoundaryEnd 4201029 @@ -1273,7 +1273,7 @@ Lines 0 MimeEntityEnd 4201231 MimeMessageEnd 4201231 Octets 67 -Lines 3 +Lines 2 MimeEntityEnd 4201231 MultipartBoundaryBegin 4201231 MultipartBoundaryEnd 4201246 @@ -1288,7 +1288,7 @@ Lines 0 MimeEntityEnd 4201427 MimeMessageEnd 4201427 Octets 68 -Lines 3 +Lines 2 MimeEntityEnd 4201427 MultipartBoundaryBegin 4201427 MultipartBoundaryEnd 4201442 @@ -1303,21 +1303,21 @@ Lines 0 MimeEntityEnd 4201615 MimeMessageEnd 4201615 Octets 68 -Lines 3 +Lines 2 MimeEntityEnd 4201615 MultipartEndBoundaryBegin 4201615 MultipartEndBoundaryEnd 4201631 MultipartEpilogueBegin 4201631 MultipartEpilogueEnd 4201632 Octets 1170 -Lines 50 +Lines 49 MimeEntityEnd 4201632 MultipartEndBoundaryBegin 4201632 MultipartEndBoundaryEnd 4201645 MultipartEpilogueBegin 4201645 MultipartEpilogueEnd 4201646 Octets 1301 -Lines 59 +Lines 58 MimeEntityEnd 4201646 MimeMessageEnd 4201646 MboxMarkerBegin 4201647 @@ -1333,7 +1333,7 @@ MultipartBoundaryEnd 4202231 MimeEntityBegin 4202231 MimeEntityHeadersEnd 4202232 Octets 3204 -Lines 66 +Lines 65 MimeEntityEnd 4205436 MultipartBoundaryBegin 4205436 MultipartBoundaryEnd 4205448 @@ -1350,11 +1350,11 @@ MimeEntityBegin 4205639 MimeEntityHeadersEnd 4205716 MimeMessageHeadersEnd 4205716 Octets 67 -Lines 3 +Lines 2 MimeEntityEnd 4205783 MimeMessageEnd 4205783 Octets 144 -Lines 6 +Lines 5 MimeEntityEnd 4205783 MultipartBoundaryBegin 4205783 MultipartBoundaryEnd 4205798 @@ -1369,21 +1369,21 @@ Lines 0 MimeEntityEnd 4206061 MimeMessageEnd 4206061 Octets 76 -Lines 3 +Lines 2 MimeEntityEnd 4206061 MultipartEndBoundaryBegin 4206061 MultipartEndBoundaryEnd 4206077 MultipartEpilogueBegin 4206077 MultipartEpilogueEnd 4206078 Octets 569 -Lines 23 +Lines 22 MimeEntityEnd 4206078 MultipartEndBoundaryBegin 4206078 MultipartEndBoundaryEnd 4206091 MultipartEpilogueBegin 4206091 MultipartEpilogueEnd 4206092 Octets 3872 -Lines 96 +Lines 95 MimeEntityEnd 4206092 MimeMessageEnd 4206092 MboxMarkerBegin 4206093 @@ -1403,11 +1403,11 @@ MimeEntityBegin 4206786 MimeEntityHeadersEnd 4207215 MimeMessageHeadersEnd 4207215 Octets 37 -Lines 3 +Lines 2 MimeEntityEnd 4207252 MimeMessageEnd 4207252 Octets 466 -Lines 14 +Lines 13 MimeEntityEnd 4207252 MultipartBoundaryBegin 4207252 MultipartBoundaryEnd 4207280 @@ -1446,11 +1446,11 @@ MimeEntityBegin 4210003 MimeEntityHeadersEnd 4210432 MimeMessageHeadersEnd 4210432 Octets 37 -Lines 2 +Lines 1 MimeEntityEnd 4210469 MimeMessageEnd 4210469 Octets 466 -Lines 13 +Lines 12 MimeEntityEnd 4210469 MultipartBoundaryBegin 4210469 MultipartBoundaryEnd 4210497 @@ -1469,26 +1469,26 @@ MimeEntityBegin 4211749 MimeEntityHeadersEnd 4212159 MimeMessageHeadersEnd 4212159 Octets 5 -Lines 2 +Lines 1 MimeEntityEnd 4212164 MimeMessageEnd 4212164 Octets 415 -Lines 13 +Lines 12 MimeEntityEnd 4212164 MimeMessageEnd 4212164 Octets 926 -Lines 27 +Lines 26 MimeEntityEnd 4212164 MimeMessageEnd 4212164 Octets 1496 -Lines 42 +Lines 41 MimeEntityEnd 4212164 MultipartBoundaryBegin 4212164 MultipartBoundaryEnd 4212192 MimeEntityBegin 4212192 MimeEntityHeadersEnd 4212245 Octets 52 -Lines 2 +Lines 1 MimeEntityEnd 4212297 MultipartEndBoundaryBegin 4212297 MultipartEndBoundaryEnd 4212326 @@ -1515,11 +1515,11 @@ MimeEntityBegin 4213027 MimeEntityHeadersEnd 4213455 MimeMessageHeadersEnd 4213455 Octets 37 -Lines 3 +Lines 2 MimeEntityEnd 4213492 MimeMessageEnd 4213492 Octets 465 -Lines 14 +Lines 13 MimeEntityEnd 4213492 MultipartBoundaryBegin 4213492 MultipartBoundaryEnd 4213520 @@ -1558,11 +1558,11 @@ MimeEntityBegin 4216263 MimeEntityHeadersEnd 4216691 MimeMessageHeadersEnd 4216691 Octets 37 -Lines 2 +Lines 1 MimeEntityEnd 4216728 MimeMessageEnd 4216728 Octets 465 -Lines 13 +Lines 12 MimeEntityEnd 4216728 MultipartBoundaryBegin 4216728 MultipartBoundaryEnd 4216756 @@ -1581,26 +1581,26 @@ MimeEntityBegin 4218018 MimeEntityHeadersEnd 4218427 MimeMessageHeadersEnd 4218427 Octets 5 -Lines 2 +Lines 1 MimeEntityEnd 4218432 MimeMessageEnd 4218432 Octets 414 -Lines 13 +Lines 12 MimeEntityEnd 4218432 MimeMessageEnd 4218432 Octets 928 -Lines 27 +Lines 26 MimeEntityEnd 4218432 MimeMessageEnd 4218432 Octets 1501 -Lines 42 +Lines 41 MimeEntityEnd 4218432 MultipartBoundaryBegin 4218432 MultipartBoundaryEnd 4218460 MimeEntityBegin 4218460 MimeEntityHeadersEnd 4218517 Octets 52 -Lines 2 +Lines 1 MimeEntityEnd 4218569 MultipartEndBoundaryBegin 4218569 MultipartEndBoundaryEnd 4218598 @@ -1623,14 +1623,14 @@ MultipartBoundaryEnd 4219341 MimeEntityBegin 4219341 MimeEntityHeadersEnd 4219370 Octets 416 -Lines 31 +Lines 30 MimeEntityEnd 4219786 MultipartBoundaryBegin 4219786 MultipartBoundaryEnd 4219793 MimeEntityBegin 4219793 MimeEntityHeadersEnd 4219866 Octets 631 -Lines 43 +Lines 42 MimeEntityEnd 4220497 MultipartBoundaryBegin 4220497 MultipartBoundaryEnd 4220504 @@ -1668,7 +1668,7 @@ MultipartBoundaryEnd 4220855 MimeEntityBegin 4220855 MimeEntityHeadersEnd 4221030 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 4221068 MultipartEndBoundaryBegin 4221068 MultipartEndBoundaryEnd 4221076 @@ -1693,7 +1693,7 @@ MultipartBoundaryEnd 4230599 MimeEntityBegin 4230599 MimeEntityHeadersEnd 4230774 Octets 38 -Lines 2 +Lines 1 MimeEntityEnd 4230812 MultipartBoundaryBegin 4230812 MultipartBoundaryEnd 4230819 @@ -1832,14 +1832,14 @@ MultipartBoundaryEnd 4312745 MimeEntityBegin 4312745 MimeEntityHeadersEnd 4312746 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 4312746 MultipartEndBoundaryBegin 4312746 MultipartEndBoundaryEnd 4312774 MultipartEpilogueBegin 4312774 MultipartEpilogueEnd 4312775 Octets 72793 -Lines 410 +Lines 409 MimeEntityEnd 4312775 MimeMessageEnd 4312775 MboxMarkerBegin 4312776 @@ -1849,7 +1849,7 @@ MimeEntityBegin 4312784 MimeEntityHeadersEnd 4313717 MimeMessageHeadersEnd 4313717 Octets 249041 -Lines 3431 +Lines 3430 MimeEntityEnd 4562758 MimeMessageEnd 4562758 MboxMarkerBegin 4562759 @@ -1865,56 +1865,56 @@ MultipartBoundaryEnd 4563935 MimeEntityBegin 4563935 MimeEntityHeadersEnd 4564008 Octets 464 -Lines 10 +Lines 9 MimeEntityEnd 4564472 MultipartBoundaryBegin 4564472 MultipartBoundaryEnd 4564518 MimeEntityBegin 4564518 MimeEntityHeadersEnd 4564577 Octets 24236 -Lines 333 +Lines 332 MimeEntityEnd 4588813 MultipartBoundaryBegin 4588813 MultipartBoundaryEnd 4588859 MimeEntityBegin 4588859 MimeEntityHeadersEnd 4588932 Octets 448 -Lines 11 +Lines 10 MimeEntityEnd 4589380 MultipartBoundaryBegin 4589380 MultipartBoundaryEnd 4589426 MimeEntityBegin 4589426 MimeEntityHeadersEnd 4589485 Octets 11214 -Lines 155 +Lines 154 MimeEntityEnd 4600699 MultipartBoundaryBegin 4600699 MultipartBoundaryEnd 4600745 MimeEntityBegin 4600745 MimeEntityHeadersEnd 4600818 Octets 304 -Lines 7 +Lines 6 MimeEntityEnd 4601122 MultipartBoundaryBegin 4601122 MultipartBoundaryEnd 4601168 MimeEntityBegin 4601168 MimeEntityHeadersEnd 4601227 Octets 16450 -Lines 227 +Lines 226 MimeEntityEnd 4617677 MultipartBoundaryBegin 4617677 MultipartBoundaryEnd 4617723 MimeEntityBegin 4617723 MimeEntityHeadersEnd 4617796 Octets 660 -Lines 16 +Lines 15 MimeEntityEnd 4618456 MultipartEndBoundaryBegin 4618456 MultipartEndBoundaryEnd 4618503 MultipartEpilogueBegin 4618503 MultipartEpilogueEnd 4618504 Octets 54809 -Lines 793 +Lines 792 MimeEntityEnd 4618504 MimeMessageEnd 4618504 MboxMarkerBegin 4618505 @@ -1930,7 +1930,7 @@ MultipartBoundaryEnd 4619361 MimeEntityBegin 4619361 MimeEntityHeadersEnd 4619362 Octets 650 -Lines 19 +Lines 18 MimeEntityEnd 4620012 MultipartBoundaryBegin 4620012 MultipartBoundaryEnd 4620042 @@ -1944,7 +1944,7 @@ MultipartEndBoundaryEnd 4666586 MultipartEpilogueBegin 4666586 MultipartEpilogueEnd 4666587 Octets 47255 -Lines 789 +Lines 788 MimeEntityEnd 4666587 MimeMessageEnd 4666587 MboxMarkerBegin 4666588 @@ -1960,35 +1960,35 @@ MultipartBoundaryEnd 4667800 MimeEntityBegin 4667800 MimeEntityHeadersEnd 4667873 Octets 5315 -Lines 161 +Lines 160 MimeEntityEnd 4673188 MultipartBoundaryBegin 4673188 MultipartBoundaryEnd 4673212 MimeEntityBegin 4673212 MimeEntityHeadersEnd 4673309 Octets 2580 -Lines 37 +Lines 36 MimeEntityEnd 4675889 MultipartBoundaryBegin 4675889 MultipartBoundaryEnd 4675913 MimeEntityBegin 4675913 MimeEntityHeadersEnd 4675986 Octets 518 -Lines 11 +Lines 10 MimeEntityEnd 4676504 MultipartBoundaryBegin 4676504 MultipartBoundaryEnd 4676528 MimeEntityBegin 4676528 MimeEntityHeadersEnd 4676642 Octets 23060 -Lines 317 +Lines 316 MimeEntityEnd 4699702 MultipartBoundaryBegin 4699702 MultipartBoundaryEnd 4699726 MimeEntityBegin 4699726 MimeEntityHeadersEnd 4699799 Octets 578 -Lines 15 +Lines 14 MimeEntityEnd 4700377 MultipartBoundaryBegin 4700377 MultipartBoundaryEnd 4700401 @@ -2003,14 +2003,14 @@ Lines 0 MimeEntityEnd 4700555 MimeMessageEnd 4700555 Octets 69 -Lines 3 +Lines 2 MimeEntityEnd 4700555 MultipartBoundaryBegin 4700555 MultipartBoundaryEnd 4700579 MimeEntityBegin 4700579 MimeEntityHeadersEnd 4700652 Octets 276 -Lines 6 +Lines 5 MimeEntityEnd 4700928 MultipartBoundaryBegin 4700928 MultipartBoundaryEnd 4700952 @@ -2025,14 +2025,14 @@ Lines 0 MimeEntityEnd 4701167 MimeMessageEnd 4701167 Octets 69 -Lines 3 +Lines 2 MimeEntityEnd 4701167 MultipartBoundaryBegin 4701167 MultipartBoundaryEnd 4701191 MimeEntityBegin 4701191 MimeEntityHeadersEnd 4701264 Octets 1069 -Lines 35 +Lines 34 MimeEntityEnd 4702333 MultipartEndBoundaryBegin 4702333 MultipartEndBoundaryEnd 4702358 @@ -2055,7 +2055,7 @@ MultipartBoundaryEnd 4702540 MimeEntityBegin 4702540 MimeEntityHeadersEnd 4702609 Octets 76344 -Lines 1146 +Lines 1145 MimeEntityEnd 4778953 MultipartBoundaryBegin 4778953 MultipartBoundaryEnd 4778966 @@ -2085,21 +2085,21 @@ MultipartBoundaryEnd 4780273 MimeEntityBegin 4780273 MimeEntityHeadersEnd 4780317 Octets 452 -Lines 9 +Lines 8 MimeEntityEnd 4780769 MultipartBoundaryBegin 4780769 MultipartBoundaryEnd 4780808 MimeEntityBegin 4780808 MimeEntityHeadersEnd 4780901 Octets 127743 -Lines 2096 +Lines 2095 MimeEntityEnd 4908644 MultipartEndBoundaryBegin 4908644 MultipartEndBoundaryEnd 4908684 MultipartEpilogueBegin 4908684 MultipartEpilogueEnd 4908685 Octets 128450 -Lines 2115 +Lines 2114 MimeEntityEnd 4908685 MimeMessageEnd 4908685 MboxMarkerBegin 4908686 @@ -2115,7 +2115,7 @@ MultipartBoundaryEnd 4909843 MimeEntityBegin 4909843 MimeEntityHeadersEnd 4909844 Octets 795 -Lines 19 +Lines 18 MimeEntityEnd 4910639 MultipartBoundaryBegin 4910639 MultipartBoundaryEnd 4910698 @@ -2128,56 +2128,56 @@ MultipartBoundaryEnd 4910861 MimeEntityBegin 4910861 MimeEntityHeadersEnd 4910934 Octets 489 -Lines 8 +Lines 7 MimeEntityEnd 4911423 MultipartBoundaryBegin 4911423 MultipartBoundaryEnd 4911484 MimeEntityBegin 4911484 MimeEntityHeadersEnd 4911580 Octets 12990 -Lines 191 +Lines 190 MimeEntityEnd 4924570 MultipartBoundaryBegin 4924570 MultipartBoundaryEnd 4924631 MimeEntityBegin 4924631 MimeEntityHeadersEnd 4924701 Octets 20 -Lines 2 +Lines 1 MimeEntityEnd 4924721 MultipartBoundaryBegin 4924721 MultipartBoundaryEnd 4924782 MimeEntityBegin 4924782 MimeEntityHeadersEnd 4924878 Octets 55720 -Lines 765 +Lines 764 MimeEntityEnd 4980598 MultipartBoundaryBegin 4980598 MultipartBoundaryEnd 4980659 MimeEntityBegin 4980659 MimeEntityHeadersEnd 4980729 Octets 52 -Lines 6 +Lines 5 MimeEntityEnd 4980781 MultipartBoundaryBegin 4980781 MultipartBoundaryEnd 4980842 MimeEntityBegin 4980842 MimeEntityHeadersEnd 4980903 Octets 102152 -Lines 1401 +Lines 1400 MimeEntityEnd 5083055 MultipartBoundaryBegin 5083055 MultipartBoundaryEnd 5083116 MimeEntityBegin 5083116 MimeEntityHeadersEnd 5083186 Octets 2 -Lines 3 +Lines 2 MimeEntityEnd 5083188 MultipartEndBoundaryBegin 5083188 MultipartEndBoundaryEnd 5083250 MultipartEpilogueBegin 5083250 MultipartEpilogueEnd 5083251 Octets 172450 -Lines 2408 +Lines 2407 MimeEntityEnd 5083251 MultipartEndBoundaryBegin 5083251 MultipartEndBoundaryEnd 5083311 @@ -2200,7 +2200,7 @@ MultipartBoundaryEnd 5084201 MimeEntityBegin 5084201 MimeEntityHeadersEnd 5084245 Octets 1515 -Lines 30 +Lines 29 MimeEntityEnd 5085760 MultipartBoundaryBegin 5085760 MultipartBoundaryEnd 5085801 @@ -2213,112 +2213,112 @@ MultipartBoundaryEnd 5085928 MimeEntityBegin 5085928 MimeEntityHeadersEnd 5086019 Octets 907 -Lines 14 +Lines 13 MimeEntityEnd 5086926 MultipartBoundaryBegin 5086926 MultipartBoundaryEnd 5086969 MimeEntityBegin 5086969 MimeEntityHeadersEnd 5087060 Octets 34858 -Lines 507 +Lines 506 MimeEntityEnd 5121918 MultipartBoundaryBegin 5121918 MultipartBoundaryEnd 5121961 MimeEntityBegin 5121961 MimeEntityHeadersEnd 5122052 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 5122062 MultipartBoundaryBegin 5122062 MultipartBoundaryEnd 5122105 MimeEntityBegin 5122105 MimeEntityHeadersEnd 5122196 Octets 21334 -Lines 311 +Lines 310 MimeEntityEnd 5143530 MultipartBoundaryBegin 5143530 MultipartBoundaryEnd 5143573 MimeEntityBegin 5143573 MimeEntityHeadersEnd 5143664 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 5143674 MultipartBoundaryBegin 5143674 MultipartBoundaryEnd 5143717 MimeEntityBegin 5143717 MimeEntityHeadersEnd 5143808 Octets 32443 -Lines 472 +Lines 471 MimeEntityEnd 5176251 MultipartBoundaryBegin 5176251 MultipartBoundaryEnd 5176294 MimeEntityBegin 5176294 MimeEntityHeadersEnd 5176385 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 5176395 MultipartBoundaryBegin 5176395 MultipartBoundaryEnd 5176438 MimeEntityBegin 5176438 MimeEntityHeadersEnd 5176529 Octets 33441 -Lines 486 +Lines 485 MimeEntityEnd 5209970 MultipartBoundaryBegin 5209970 MultipartBoundaryEnd 5210013 MimeEntityBegin 5210013 MimeEntityHeadersEnd 5210104 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 5210114 MultipartBoundaryBegin 5210114 MultipartBoundaryEnd 5210157 MimeEntityBegin 5210157 MimeEntityHeadersEnd 5210248 Octets 27836 -Lines 405 +Lines 404 MimeEntityEnd 5238084 MultipartBoundaryBegin 5238084 MultipartBoundaryEnd 5238127 MimeEntityBegin 5238127 MimeEntityHeadersEnd 5238218 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 5238228 MultipartBoundaryBegin 5238228 MultipartBoundaryEnd 5238271 MimeEntityBegin 5238271 MimeEntityHeadersEnd 5238362 Octets 33494 -Lines 487 +Lines 486 MimeEntityEnd 5271856 MultipartBoundaryBegin 5271856 MultipartBoundaryEnd 5271899 MimeEntityBegin 5271899 MimeEntityHeadersEnd 5271990 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 5272000 MultipartBoundaryBegin 5272000 MultipartBoundaryEnd 5272043 MimeEntityBegin 5272043 MimeEntityHeadersEnd 5272134 Octets 26659 -Lines 388 +Lines 387 MimeEntityEnd 5298793 MultipartBoundaryBegin 5298793 MultipartBoundaryEnd 5298836 MimeEntityBegin 5298836 MimeEntityHeadersEnd 5298927 Octets 74 -Lines 4 +Lines 3 MimeEntityEnd 5299001 MultipartEndBoundaryBegin 5299001 MultipartEndBoundaryEnd 5299045 MultipartEpilogueBegin 5299045 MultipartEpilogueEnd 5299046 Octets 213160 -Lines 3161 +Lines 3160 MimeEntityEnd 5299046 MultipartEndBoundaryBegin 5299046 MultipartEndBoundaryEnd 5299088 @@ -2341,28 +2341,28 @@ MultipartBoundaryEnd 5299733 MimeEntityBegin 5299733 MimeEntityHeadersEnd 5299828 Octets 203 -Lines 10 +Lines 9 MimeEntityEnd 5300031 MultipartBoundaryBegin 5300031 MultipartBoundaryEnd 5300081 MimeEntityBegin 5300081 MimeEntityHeadersEnd 5300142 Octets 88598 -Lines 1215 +Lines 1214 MimeEntityEnd 5388740 MultipartBoundaryBegin 5388740 MultipartBoundaryEnd 5388790 MimeEntityBegin 5388790 MimeEntityHeadersEnd 5388816 Octets 30 -Lines 2 +Lines 1 MimeEntityEnd 5388846 MultipartEndBoundaryBegin 5388846 MultipartEndBoundaryEnd 5388897 MultipartEpilogueBegin 5388897 MultipartEpilogueEnd 5388898 Octets 89409 -Lines 1244 +Lines 1243 MimeEntityEnd 5388898 MimeMessageEnd 5388898 MboxMarkerBegin 5388899 @@ -2372,7 +2372,7 @@ MimeEntityBegin 5388907 MimeEntityHeadersEnd 5389843 MimeMessageHeadersEnd 5389843 Octets 50709 -Lines 697 +Lines 696 MimeEntityEnd 5440552 MimeMessageEnd 5440552 MboxMarkerBegin 5440553 @@ -2388,7 +2388,7 @@ MultipartBoundaryEnd 5441191 MimeEntityBegin 5441191 MimeEntityHeadersEnd 5441192 Octets 4317 -Lines 102 +Lines 101 MimeEntityEnd 5445509 MultipartBoundaryBegin 5445509 MultipartBoundaryEnd 5445528 @@ -2405,11 +2405,11 @@ MimeEntityBegin 5445701 MimeEntityHeadersEnd 5445806 MimeMessageHeadersEnd 5445806 Octets 621 -Lines 19 +Lines 18 MimeEntityEnd 5446427 MimeMessageEnd 5446427 Octets 726 -Lines 23 +Lines 22 MimeEntityEnd 5446427 MultipartBoundaryBegin 5446427 MultipartBoundaryEnd 5446459 @@ -2420,11 +2420,11 @@ MimeEntityBegin 5446460 MimeEntityHeadersEnd 5446581 MimeMessageHeadersEnd 5446581 Octets 733 -Lines 21 +Lines 20 MimeEntityEnd 5447314 MimeMessageEnd 5447314 Octets 854 -Lines 25 +Lines 24 MimeEntityEnd 5447314 MultipartBoundaryBegin 5447314 MultipartBoundaryEnd 5447346 @@ -2435,11 +2435,11 @@ MimeEntityBegin 5447347 MimeEntityHeadersEnd 5447466 MimeMessageHeadersEnd 5447466 Octets 646 -Lines 15 +Lines 14 MimeEntityEnd 5448112 MimeMessageEnd 5448112 Octets 765 -Lines 19 +Lines 18 MimeEntityEnd 5448112 MultipartBoundaryBegin 5448112 MultipartBoundaryEnd 5448144 @@ -2450,11 +2450,11 @@ MimeEntityBegin 5448145 MimeEntityHeadersEnd 5448301 MimeMessageHeadersEnd 5448301 Octets 483 -Lines 11 +Lines 10 MimeEntityEnd 5448784 MimeMessageEnd 5448784 Octets 639 -Lines 15 +Lines 14 MimeEntityEnd 5448784 MultipartBoundaryBegin 5448784 MultipartBoundaryEnd 5448816 @@ -2465,11 +2465,11 @@ MimeEntityBegin 5448817 MimeEntityHeadersEnd 5448971 MimeMessageHeadersEnd 5448971 Octets 572 -Lines 16 +Lines 15 MimeEntityEnd 5449543 MimeMessageEnd 5449543 Octets 726 -Lines 20 +Lines 19 MimeEntityEnd 5449543 MultipartBoundaryBegin 5449543 MultipartBoundaryEnd 5449575 @@ -2480,11 +2480,11 @@ MimeEntityBegin 5449576 MimeEntityHeadersEnd 5449733 MimeMessageHeadersEnd 5449733 Octets 1275 -Lines 27 +Lines 26 MimeEntityEnd 5451008 MimeMessageEnd 5451008 Octets 1432 -Lines 31 +Lines 30 MimeEntityEnd 5451008 MultipartBoundaryBegin 5451008 MultipartBoundaryEnd 5451040 @@ -2495,11 +2495,11 @@ MimeEntityBegin 5451041 MimeEntityHeadersEnd 5451194 MimeMessageHeadersEnd 5451194 Octets 401 -Lines 10 +Lines 9 MimeEntityEnd 5451595 MimeMessageEnd 5451595 Octets 554 -Lines 14 +Lines 13 MimeEntityEnd 5451595 MultipartBoundaryBegin 5451595 MultipartBoundaryEnd 5451627 @@ -2510,11 +2510,11 @@ MimeEntityBegin 5451628 MimeEntityHeadersEnd 5451775 MimeMessageHeadersEnd 5451775 Octets 396 -Lines 8 +Lines 7 MimeEntityEnd 5452171 MimeMessageEnd 5452171 Octets 543 -Lines 12 +Lines 11 MimeEntityEnd 5452171 MultipartBoundaryBegin 5452171 MultipartBoundaryEnd 5452203 @@ -2525,11 +2525,11 @@ MimeEntityBegin 5452204 MimeEntityHeadersEnd 5452347 MimeMessageHeadersEnd 5452347 Octets 640 -Lines 12 +Lines 11 MimeEntityEnd 5452987 MimeMessageEnd 5452987 Octets 783 -Lines 16 +Lines 15 MimeEntityEnd 5452987 MultipartBoundaryBegin 5452987 MultipartBoundaryEnd 5453019 @@ -2540,11 +2540,11 @@ MimeEntityBegin 5453020 MimeEntityHeadersEnd 5453157 MimeMessageHeadersEnd 5453157 Octets 977 -Lines 20 +Lines 19 MimeEntityEnd 5454134 MimeMessageEnd 5454134 Octets 1114 -Lines 24 +Lines 23 MimeEntityEnd 5454134 MultipartBoundaryBegin 5454134 MultipartBoundaryEnd 5454166 @@ -2555,11 +2555,11 @@ MimeEntityBegin 5454167 MimeEntityHeadersEnd 5454314 MimeMessageHeadersEnd 5454314 Octets 890 -Lines 28 +Lines 27 MimeEntityEnd 5455204 MimeMessageEnd 5455204 Octets 1037 -Lines 32 +Lines 31 MimeEntityEnd 5455204 MultipartBoundaryBegin 5455204 MultipartBoundaryEnd 5455236 @@ -2570,11 +2570,11 @@ MimeEntityBegin 5455237 MimeEntityHeadersEnd 5455368 MimeMessageHeadersEnd 5455368 Octets 559 -Lines 12 +Lines 11 MimeEntityEnd 5455927 MimeMessageEnd 5455927 Octets 690 -Lines 16 +Lines 15 MimeEntityEnd 5455927 MultipartBoundaryBegin 5455927 MultipartBoundaryEnd 5455959 @@ -2585,11 +2585,11 @@ MimeEntityBegin 5455960 MimeEntityHeadersEnd 5456092 MimeMessageHeadersEnd 5456092 Octets 437 -Lines 11 +Lines 10 MimeEntityEnd 5456529 MimeMessageEnd 5456529 Octets 569 -Lines 15 +Lines 14 MimeEntityEnd 5456529 MultipartBoundaryBegin 5456529 MultipartBoundaryEnd 5456561 @@ -2600,11 +2600,11 @@ MimeEntityBegin 5456562 MimeEntityHeadersEnd 5456679 MimeMessageHeadersEnd 5456679 Octets 552 -Lines 16 +Lines 15 MimeEntityEnd 5457231 MimeMessageEnd 5457231 Octets 669 -Lines 20 +Lines 19 MimeEntityEnd 5457231 MultipartBoundaryBegin 5457231 MultipartBoundaryEnd 5457263 @@ -2615,11 +2615,11 @@ MimeEntityBegin 5457264 MimeEntityHeadersEnd 5457379 MimeMessageHeadersEnd 5457379 Octets 185 -Lines 9 +Lines 8 MimeEntityEnd 5457564 MimeMessageEnd 5457564 Octets 300 -Lines 13 +Lines 12 MimeEntityEnd 5457564 MultipartBoundaryBegin 5457564 MultipartBoundaryEnd 5457596 @@ -2630,11 +2630,11 @@ MimeEntityBegin 5457597 MimeEntityHeadersEnd 5457714 MimeMessageHeadersEnd 5457714 Octets 328 -Lines 8 +Lines 7 MimeEntityEnd 5458042 MimeMessageEnd 5458042 Octets 445 -Lines 12 +Lines 11 MimeEntityEnd 5458042 MultipartBoundaryBegin 5458042 MultipartBoundaryEnd 5458074 @@ -2645,11 +2645,11 @@ MimeEntityBegin 5458075 MimeEntityHeadersEnd 5458198 MimeMessageHeadersEnd 5458198 Octets 667 -Lines 22 +Lines 21 MimeEntityEnd 5458865 MimeMessageEnd 5458865 Octets 790 -Lines 26 +Lines 25 MimeEntityEnd 5458865 MultipartBoundaryBegin 5458865 MultipartBoundaryEnd 5458897 @@ -2660,11 +2660,11 @@ MimeEntityBegin 5458898 MimeEntityHeadersEnd 5459022 MimeMessageHeadersEnd 5459022 Octets 102 -Lines 6 +Lines 5 MimeEntityEnd 5459124 MimeMessageEnd 5459124 Octets 226 -Lines 10 +Lines 9 MimeEntityEnd 5459124 MultipartBoundaryBegin 5459124 MultipartBoundaryEnd 5459156 @@ -2675,11 +2675,11 @@ MimeEntityBegin 5459157 MimeEntityHeadersEnd 5459299 MimeMessageHeadersEnd 5459299 Octets 836 -Lines 22 +Lines 21 MimeEntityEnd 5460135 MimeMessageEnd 5460135 Octets 978 -Lines 26 +Lines 25 MimeEntityEnd 5460135 MultipartBoundaryBegin 5460135 MultipartBoundaryEnd 5460167 @@ -2690,11 +2690,11 @@ MimeEntityBegin 5460168 MimeEntityHeadersEnd 5460278 MimeMessageHeadersEnd 5460278 Octets 419 -Lines 10 +Lines 9 MimeEntityEnd 5460697 MimeMessageEnd 5460697 Octets 529 -Lines 14 +Lines 13 MimeEntityEnd 5460697 MultipartBoundaryBegin 5460697 MultipartBoundaryEnd 5460729 @@ -2705,11 +2705,11 @@ MimeEntityBegin 5460730 MimeEntityHeadersEnd 5460902 MimeMessageHeadersEnd 5460902 Octets 230 -Lines 10 +Lines 9 MimeEntityEnd 5461132 MimeMessageEnd 5461132 Octets 402 -Lines 14 +Lines 13 MimeEntityEnd 5461132 MultipartBoundaryBegin 5461132 MultipartBoundaryEnd 5461164 @@ -2720,11 +2720,11 @@ MimeEntityBegin 5461165 MimeEntityHeadersEnd 5461291 MimeMessageHeadersEnd 5461291 Octets 399 -Lines 13 +Lines 12 MimeEntityEnd 5461690 MimeMessageEnd 5461690 Octets 525 -Lines 17 +Lines 16 MimeEntityEnd 5461690 MultipartBoundaryBegin 5461690 MultipartBoundaryEnd 5461722 @@ -2735,11 +2735,11 @@ MimeEntityBegin 5461723 MimeEntityHeadersEnd 5461840 MimeMessageHeadersEnd 5461840 Octets 904 -Lines 29 +Lines 28 MimeEntityEnd 5462744 MimeMessageEnd 5462744 Octets 1021 -Lines 33 +Lines 32 MimeEntityEnd 5462744 MultipartBoundaryBegin 5462744 MultipartBoundaryEnd 5462776 @@ -2750,11 +2750,11 @@ MimeEntityBegin 5462777 MimeEntityHeadersEnd 5462905 MimeMessageHeadersEnd 5462905 Octets 291 -Lines 10 +Lines 9 MimeEntityEnd 5463196 MimeMessageEnd 5463196 Octets 419 -Lines 14 +Lines 13 MimeEntityEnd 5463196 MultipartBoundaryBegin 5463196 MultipartBoundaryEnd 5463228 @@ -2765,11 +2765,11 @@ MimeEntityBegin 5463229 MimeEntityHeadersEnd 5463358 MimeMessageHeadersEnd 5463358 Octets 410 -Lines 15 +Lines 14 MimeEntityEnd 5463768 MimeMessageEnd 5463768 Octets 539 -Lines 19 +Lines 18 MimeEntityEnd 5463768 MultipartBoundaryBegin 5463768 MultipartBoundaryEnd 5463800 @@ -2780,11 +2780,11 @@ MimeEntityBegin 5463801 MimeEntityHeadersEnd 5463916 MimeMessageHeadersEnd 5463916 Octets 145 -Lines 5 +Lines 4 MimeEntityEnd 5464061 MimeMessageEnd 5464061 Octets 260 -Lines 9 +Lines 8 MimeEntityEnd 5464061 MultipartBoundaryBegin 5464061 MultipartBoundaryEnd 5464093 @@ -2795,11 +2795,11 @@ MimeEntityBegin 5464094 MimeEntityHeadersEnd 5464219 MimeMessageHeadersEnd 5464219 Octets 179 -Lines 8 +Lines 7 MimeEntityEnd 5464398 MimeMessageEnd 5464398 Octets 304 -Lines 12 +Lines 11 MimeEntityEnd 5464398 MultipartBoundaryBegin 5464398 MultipartBoundaryEnd 5464430 @@ -2810,11 +2810,11 @@ MimeEntityBegin 5464431 MimeEntityHeadersEnd 5464561 MimeMessageHeadersEnd 5464561 Octets 716 -Lines 15 +Lines 14 MimeEntityEnd 5465277 MimeMessageEnd 5465277 Octets 846 -Lines 19 +Lines 18 MimeEntityEnd 5465277 MultipartBoundaryBegin 5465277 MultipartBoundaryEnd 5465309 @@ -2825,11 +2825,11 @@ MimeEntityBegin 5465310 MimeEntityHeadersEnd 5465456 MimeMessageHeadersEnd 5465456 Octets 957 -Lines 27 +Lines 26 MimeEntityEnd 5466413 MimeMessageEnd 5466413 Octets 1103 -Lines 31 +Lines 30 MimeEntityEnd 5466413 MultipartBoundaryBegin 5466413 MultipartBoundaryEnd 5466445 @@ -2840,11 +2840,11 @@ MimeEntityBegin 5466446 MimeEntityHeadersEnd 5466580 MimeMessageHeadersEnd 5466580 Octets 247 -Lines 8 +Lines 7 MimeEntityEnd 5466827 MimeMessageEnd 5466827 Octets 381 -Lines 12 +Lines 11 MimeEntityEnd 5466827 MultipartBoundaryBegin 5466827 MultipartBoundaryEnd 5466859 @@ -2855,11 +2855,11 @@ MimeEntityBegin 5466860 MimeEntityHeadersEnd 5466982 MimeMessageHeadersEnd 5466982 Octets 127 -Lines 7 +Lines 6 MimeEntityEnd 5467109 MimeMessageEnd 5467109 Octets 249 -Lines 11 +Lines 10 MimeEntityEnd 5467109 MultipartBoundaryBegin 5467109 MultipartBoundaryEnd 5467141 @@ -2870,11 +2870,11 @@ MimeEntityBegin 5467142 MimeEntityHeadersEnd 5467317 MimeMessageHeadersEnd 5467317 Octets 745 -Lines 17 +Lines 16 MimeEntityEnd 5468062 MimeMessageEnd 5468062 Octets 920 -Lines 22 +Lines 21 MimeEntityEnd 5468062 MultipartBoundaryBegin 5468062 MultipartBoundaryEnd 5468094 @@ -2885,11 +2885,11 @@ MimeEntityBegin 5468095 MimeEntityHeadersEnd 5468255 MimeMessageHeadersEnd 5468255 Octets 399 -Lines 17 +Lines 16 MimeEntityEnd 5468654 MimeMessageEnd 5468654 Octets 559 -Lines 21 +Lines 20 MimeEntityEnd 5468654 MultipartBoundaryBegin 5468654 MultipartBoundaryEnd 5468686 @@ -2900,11 +2900,11 @@ MimeEntityBegin 5468687 MimeEntityHeadersEnd 5468819 MimeMessageHeadersEnd 5468819 Octets 1287 -Lines 22 +Lines 21 MimeEntityEnd 5470106 MimeMessageEnd 5470106 Octets 1419 -Lines 26 +Lines 25 MimeEntityEnd 5470106 MultipartBoundaryBegin 5470106 MultipartBoundaryEnd 5470138 @@ -2915,11 +2915,11 @@ MimeEntityBegin 5470139 MimeEntityHeadersEnd 5470245 MimeMessageHeadersEnd 5470245 Octets 143 -Lines 7 +Lines 6 MimeEntityEnd 5470388 MimeMessageEnd 5470388 Octets 249 -Lines 11 +Lines 10 MimeEntityEnd 5470388 MultipartBoundaryBegin 5470388 MultipartBoundaryEnd 5470420 @@ -2930,11 +2930,11 @@ MimeEntityBegin 5470421 MimeEntityHeadersEnd 5470558 MimeMessageHeadersEnd 5470558 Octets 299 -Lines 12 +Lines 11 MimeEntityEnd 5470857 MimeMessageEnd 5470857 Octets 436 -Lines 16 +Lines 15 MimeEntityEnd 5470857 MultipartBoundaryBegin 5470857 MultipartBoundaryEnd 5470889 @@ -2945,11 +2945,11 @@ MimeEntityBegin 5470890 MimeEntityHeadersEnd 5471016 MimeMessageHeadersEnd 5471016 Octets 187 -Lines 7 +Lines 6 MimeEntityEnd 5471203 MimeMessageEnd 5471203 Octets 313 -Lines 11 +Lines 10 MimeEntityEnd 5471203 MultipartBoundaryBegin 5471203 MultipartBoundaryEnd 5471235 @@ -2960,11 +2960,11 @@ MimeEntityBegin 5471236 MimeEntityHeadersEnd 5471341 MimeMessageHeadersEnd 5471341 Octets 398 -Lines 13 +Lines 12 MimeEntityEnd 5471739 MimeMessageEnd 5471739 Octets 503 -Lines 17 +Lines 16 MimeEntityEnd 5471739 MultipartBoundaryBegin 5471739 MultipartBoundaryEnd 5471771 @@ -2975,11 +2975,11 @@ MimeEntityBegin 5471772 MimeEntityHeadersEnd 5471906 MimeMessageHeadersEnd 5471906 Octets 302 -Lines 9 +Lines 8 MimeEntityEnd 5472208 MimeMessageEnd 5472208 Octets 436 -Lines 13 +Lines 12 MimeEntityEnd 5472208 MultipartBoundaryBegin 5472208 MultipartBoundaryEnd 5472240 @@ -2990,11 +2990,11 @@ MimeEntityBegin 5472241 MimeEntityHeadersEnd 5472384 MimeMessageHeadersEnd 5472384 Octets 618 -Lines 18 +Lines 17 MimeEntityEnd 5473002 MimeMessageEnd 5473002 Octets 761 -Lines 22 +Lines 21 MimeEntityEnd 5473002 MultipartBoundaryBegin 5473002 MultipartBoundaryEnd 5473034 @@ -3005,11 +3005,11 @@ MimeEntityBegin 5473035 MimeEntityHeadersEnd 5473188 MimeMessageHeadersEnd 5473188 Octets 475 -Lines 11 +Lines 10 MimeEntityEnd 5473663 MimeMessageEnd 5473663 Octets 628 -Lines 15 +Lines 14 MimeEntityEnd 5473663 MultipartBoundaryBegin 5473663 MultipartBoundaryEnd 5473695 @@ -3020,11 +3020,11 @@ MimeEntityBegin 5473696 MimeEntityHeadersEnd 5473829 MimeMessageHeadersEnd 5473829 Octets 1172 -Lines 28 +Lines 27 MimeEntityEnd 5475001 MimeMessageEnd 5475001 Octets 1305 -Lines 32 +Lines 31 MimeEntityEnd 5475001 MultipartBoundaryBegin 5475001 MultipartBoundaryEnd 5475033 @@ -3035,11 +3035,11 @@ MimeEntityBegin 5475034 MimeEntityHeadersEnd 5475210 MimeMessageHeadersEnd 5475210 Octets 259 -Lines 9 +Lines 8 MimeEntityEnd 5475469 MimeMessageEnd 5475469 Octets 435 -Lines 13 +Lines 12 MimeEntityEnd 5475469 MultipartBoundaryBegin 5475469 MultipartBoundaryEnd 5475501 @@ -3050,11 +3050,11 @@ MimeEntityBegin 5475502 MimeEntityHeadersEnd 5475617 MimeMessageHeadersEnd 5475617 Octets 193 -Lines 5 +Lines 4 MimeEntityEnd 5475810 MimeMessageEnd 5475810 Octets 308 -Lines 9 +Lines 8 MimeEntityEnd 5475810 MultipartBoundaryBegin 5475810 MultipartBoundaryEnd 5475842 @@ -3065,11 +3065,11 @@ MimeEntityBegin 5475843 MimeEntityHeadersEnd 5475983 MimeMessageHeadersEnd 5475983 Octets 865 -Lines 25 +Lines 24 MimeEntityEnd 5476848 MimeMessageEnd 5476848 Octets 1005 -Lines 29 +Lines 28 MimeEntityEnd 5476848 MultipartBoundaryBegin 5476848 MultipartBoundaryEnd 5476880 @@ -3080,11 +3080,11 @@ MimeEntityBegin 5476881 MimeEntityHeadersEnd 5477006 MimeMessageHeadersEnd 5477006 Octets 714 -Lines 12 +Lines 11 MimeEntityEnd 5477720 MimeMessageEnd 5477720 Octets 839 -Lines 16 +Lines 15 MimeEntityEnd 5477720 MultipartBoundaryBegin 5477720 MultipartBoundaryEnd 5477752 @@ -3095,11 +3095,11 @@ MimeEntityBegin 5477753 MimeEntityHeadersEnd 5477865 MimeMessageHeadersEnd 5477865 Octets 703 -Lines 18 +Lines 17 MimeEntityEnd 5478568 MimeMessageEnd 5478568 Octets 815 -Lines 22 +Lines 21 MimeEntityEnd 5478568 MultipartBoundaryBegin 5478568 MultipartBoundaryEnd 5478600 @@ -3110,11 +3110,11 @@ MimeEntityBegin 5478601 MimeEntityHeadersEnd 5478733 MimeMessageHeadersEnd 5478733 Octets 380 -Lines 12 +Lines 11 MimeEntityEnd 5479113 MimeMessageEnd 5479113 Octets 512 -Lines 16 +Lines 15 MimeEntityEnd 5479113 MultipartBoundaryBegin 5479113 MultipartBoundaryEnd 5479145 @@ -3125,11 +3125,11 @@ MimeEntityBegin 5479146 MimeEntityHeadersEnd 5479282 MimeMessageHeadersEnd 5479282 Octets 977 -Lines 25 +Lines 24 MimeEntityEnd 5480259 MimeMessageEnd 5480259 Octets 1113 -Lines 29 +Lines 28 MimeEntityEnd 5480259 MultipartBoundaryBegin 5480259 MultipartBoundaryEnd 5480291 @@ -3140,11 +3140,11 @@ MimeEntityBegin 5480292 MimeEntityHeadersEnd 5480437 MimeMessageHeadersEnd 5480437 Octets 467 -Lines 11 +Lines 10 MimeEntityEnd 5480904 MimeMessageEnd 5480904 Octets 612 -Lines 15 +Lines 14 MimeEntityEnd 5480904 MultipartBoundaryBegin 5480904 MultipartBoundaryEnd 5480936 @@ -3155,11 +3155,11 @@ MimeEntityBegin 5480937 MimeEntityHeadersEnd 5481070 MimeMessageHeadersEnd 5481070 Octets 279 -Lines 11 +Lines 10 MimeEntityEnd 5481349 MimeMessageEnd 5481349 Octets 412 -Lines 15 +Lines 14 MimeEntityEnd 5481349 MultipartBoundaryBegin 5481349 MultipartBoundaryEnd 5481381 @@ -3170,11 +3170,11 @@ MimeEntityBegin 5481382 MimeEntityHeadersEnd 5481507 MimeMessageHeadersEnd 5481507 Octets 282 -Lines 5 +Lines 4 MimeEntityEnd 5481789 MimeMessageEnd 5481789 Octets 407 -Lines 9 +Lines 8 MimeEntityEnd 5481789 MultipartBoundaryBegin 5481789 MultipartBoundaryEnd 5481821 @@ -3185,11 +3185,11 @@ MimeEntityBegin 5481822 MimeEntityHeadersEnd 5481943 MimeMessageHeadersEnd 5481943 Octets 643 -Lines 28 +Lines 27 MimeEntityEnd 5482586 MimeMessageEnd 5482586 Octets 764 -Lines 32 +Lines 31 MimeEntityEnd 5482586 MultipartBoundaryBegin 5482586 MultipartBoundaryEnd 5482618 @@ -3200,11 +3200,11 @@ MimeEntityBegin 5482619 MimeEntityHeadersEnd 5482763 MimeMessageHeadersEnd 5482763 Octets 2258 -Lines 47 +Lines 46 MimeEntityEnd 5485021 MimeMessageEnd 5485021 Octets 2402 -Lines 51 +Lines 50 MimeEntityEnd 5485021 MultipartBoundaryBegin 5485021 MultipartBoundaryEnd 5485053 @@ -3215,11 +3215,11 @@ MimeEntityBegin 5485054 MimeEntityHeadersEnd 5485176 MimeMessageHeadersEnd 5485176 Octets 792 -Lines 18 +Lines 17 MimeEntityEnd 5485968 MimeMessageEnd 5485968 Octets 914 -Lines 22 +Lines 21 MimeEntityEnd 5485968 MultipartBoundaryBegin 5485968 MultipartBoundaryEnd 5486000 @@ -3230,11 +3230,11 @@ MimeEntityBegin 5486001 MimeEntityHeadersEnd 5486095 MimeMessageHeadersEnd 5486095 Octets 226 -Lines 11 +Lines 10 MimeEntityEnd 5486321 MimeMessageEnd 5486321 Octets 320 -Lines 15 +Lines 14 MimeEntityEnd 5486321 MultipartBoundaryBegin 5486321 MultipartBoundaryEnd 5486353 @@ -3245,11 +3245,11 @@ MimeEntityBegin 5486354 MimeEntityHeadersEnd 5486475 MimeMessageHeadersEnd 5486475 Octets 668 -Lines 21 +Lines 20 MimeEntityEnd 5487143 MimeMessageEnd 5487143 Octets 789 -Lines 25 +Lines 24 MimeEntityEnd 5487143 MultipartBoundaryBegin 5487143 MultipartBoundaryEnd 5487175 @@ -3260,11 +3260,11 @@ MimeEntityBegin 5487176 MimeEntityHeadersEnd 5487286 MimeMessageHeadersEnd 5487286 Octets 2547 -Lines 69 +Lines 68 MimeEntityEnd 5489833 MimeMessageEnd 5489833 Octets 2657 -Lines 73 +Lines 72 MimeEntityEnd 5489833 MultipartBoundaryBegin 5489833 MultipartBoundaryEnd 5489865 @@ -3275,11 +3275,11 @@ MimeEntityBegin 5489866 MimeEntityHeadersEnd 5489972 MimeMessageHeadersEnd 5489972 Octets 1209 -Lines 35 +Lines 34 MimeEntityEnd 5491181 MimeMessageEnd 5491181 Octets 1315 -Lines 39 +Lines 38 MimeEntityEnd 5491181 MultipartBoundaryBegin 5491181 MultipartBoundaryEnd 5491213 @@ -3290,11 +3290,11 @@ MimeEntityBegin 5491214 MimeEntityHeadersEnd 5491320 MimeMessageHeadersEnd 5491320 Octets 1797 -Lines 44 +Lines 43 MimeEntityEnd 5493117 MimeMessageEnd 5493117 Octets 1903 -Lines 48 +Lines 47 MimeEntityEnd 5493117 MultipartBoundaryBegin 5493117 MultipartBoundaryEnd 5493149 @@ -3305,11 +3305,11 @@ MimeEntityBegin 5493150 MimeEntityHeadersEnd 5493279 MimeMessageHeadersEnd 5493279 Octets 570 -Lines 13 +Lines 12 MimeEntityEnd 5493849 MimeMessageEnd 5493849 Octets 699 -Lines 17 +Lines 16 MimeEntityEnd 5493849 MultipartBoundaryBegin 5493849 MultipartBoundaryEnd 5493881 @@ -3320,11 +3320,11 @@ MimeEntityBegin 5493882 MimeEntityHeadersEnd 5493970 MimeMessageHeadersEnd 5493970 Octets 1334 -Lines 21 +Lines 20 MimeEntityEnd 5495304 MimeMessageEnd 5495304 Octets 1422 -Lines 25 +Lines 24 MimeEntityEnd 5495304 MultipartBoundaryBegin 5495304 MultipartBoundaryEnd 5495336 @@ -3335,11 +3335,11 @@ MimeEntityBegin 5495337 MimeEntityHeadersEnd 5495453 MimeMessageHeadersEnd 5495453 Octets 2127 -Lines 50 +Lines 49 MimeEntityEnd 5497580 MimeMessageEnd 5497580 Octets 2243 -Lines 54 +Lines 53 MimeEntityEnd 5497580 MultipartBoundaryBegin 5497580 MultipartBoundaryEnd 5497612 @@ -3350,11 +3350,11 @@ MimeEntityBegin 5497613 MimeEntityHeadersEnd 5497734 MimeMessageHeadersEnd 5497734 Octets 2021 -Lines 43 +Lines 42 MimeEntityEnd 5499755 MimeMessageEnd 5499755 Octets 2142 -Lines 47 +Lines 46 MimeEntityEnd 5499755 MultipartBoundaryBegin 5499755 MultipartBoundaryEnd 5499787 @@ -3365,11 +3365,11 @@ MimeEntityBegin 5499788 MimeEntityHeadersEnd 5499909 MimeMessageHeadersEnd 5499909 Octets 677 -Lines 20 +Lines 19 MimeEntityEnd 5500586 MimeMessageEnd 5500586 Octets 798 -Lines 24 +Lines 23 MimeEntityEnd 5500586 MultipartBoundaryBegin 5500586 MultipartBoundaryEnd 5500618 @@ -3380,11 +3380,11 @@ MimeEntityBegin 5500619 MimeEntityHeadersEnd 5500756 MimeMessageHeadersEnd 5500756 Octets 820 -Lines 17 +Lines 16 MimeEntityEnd 5501576 MimeMessageEnd 5501576 Octets 957 -Lines 21 +Lines 20 MimeEntityEnd 5501576 MultipartBoundaryBegin 5501576 MultipartBoundaryEnd 5501608 @@ -3395,11 +3395,11 @@ MimeEntityBegin 5501609 MimeEntityHeadersEnd 5501733 MimeMessageHeadersEnd 5501733 Octets 724 -Lines 22 +Lines 21 MimeEntityEnd 5502457 MimeMessageEnd 5502457 Octets 848 -Lines 26 +Lines 25 MimeEntityEnd 5502457 MultipartBoundaryBegin 5502457 MultipartBoundaryEnd 5502489 @@ -3410,11 +3410,11 @@ MimeEntityBegin 5502490 MimeEntityHeadersEnd 5502592 MimeMessageHeadersEnd 5502592 Octets 740 -Lines 17 +Lines 16 MimeEntityEnd 5503332 MimeMessageEnd 5503332 Octets 842 -Lines 21 +Lines 20 MimeEntityEnd 5503332 MultipartBoundaryBegin 5503332 MultipartBoundaryEnd 5503364 @@ -3425,11 +3425,11 @@ MimeEntityBegin 5503365 MimeEntityHeadersEnd 5503521 MimeMessageHeadersEnd 5503521 Octets 359 -Lines 8 +Lines 7 MimeEntityEnd 5503880 MimeMessageEnd 5503880 Octets 515 -Lines 13 +Lines 12 MimeEntityEnd 5503880 MultipartBoundaryBegin 5503880 MultipartBoundaryEnd 5503912 @@ -3440,11 +3440,11 @@ MimeEntityBegin 5503913 MimeEntityHeadersEnd 5504000 MimeMessageHeadersEnd 5504000 Octets 635 -Lines 16 +Lines 15 MimeEntityEnd 5504635 MimeMessageEnd 5504635 Octets 722 -Lines 20 +Lines 19 MimeEntityEnd 5504635 MultipartBoundaryBegin 5504635 MultipartBoundaryEnd 5504667 @@ -3455,11 +3455,11 @@ MimeEntityBegin 5504668 MimeEntityHeadersEnd 5504817 MimeMessageHeadersEnd 5504817 Octets 366 -Lines 18 +Lines 17 MimeEntityEnd 5505183 MimeMessageEnd 5505183 Octets 515 -Lines 22 +Lines 21 MimeEntityEnd 5505183 MultipartBoundaryBegin 5505183 MultipartBoundaryEnd 5505215 @@ -3470,11 +3470,11 @@ MimeEntityBegin 5505216 MimeEntityHeadersEnd 5505317 MimeMessageHeadersEnd 5505317 Octets 288 -Lines 7 +Lines 6 MimeEntityEnd 5505605 MimeMessageEnd 5505605 Octets 389 -Lines 11 +Lines 10 MimeEntityEnd 5505605 MultipartBoundaryBegin 5505605 MultipartBoundaryEnd 5505637 @@ -3485,11 +3485,11 @@ MimeEntityBegin 5505638 MimeEntityHeadersEnd 5505766 MimeMessageHeadersEnd 5505766 Octets 479 -Lines 17 +Lines 16 MimeEntityEnd 5506245 MimeMessageEnd 5506245 Octets 607 -Lines 21 +Lines 20 MimeEntityEnd 5506245 MultipartBoundaryBegin 5506245 MultipartBoundaryEnd 5506277 @@ -3500,11 +3500,11 @@ MimeEntityBegin 5506278 MimeEntityHeadersEnd 5506375 MimeMessageHeadersEnd 5506375 Octets 380 -Lines 20 +Lines 19 MimeEntityEnd 5506755 MimeMessageEnd 5506755 Octets 477 -Lines 24 +Lines 23 MimeEntityEnd 5506755 MultipartBoundaryBegin 5506755 MultipartBoundaryEnd 5506787 @@ -3515,11 +3515,11 @@ MimeEntityBegin 5506788 MimeEntityHeadersEnd 5506903 MimeMessageHeadersEnd 5506903 Octets 1319 -Lines 27 +Lines 26 MimeEntityEnd 5508222 MimeMessageEnd 5508222 Octets 1434 -Lines 31 +Lines 30 MimeEntityEnd 5508222 MultipartBoundaryBegin 5508222 MultipartBoundaryEnd 5508254 @@ -3530,11 +3530,11 @@ MimeEntityBegin 5508255 MimeEntityHeadersEnd 5508355 MimeMessageHeadersEnd 5508355 Octets 295 -Lines 10 +Lines 9 MimeEntityEnd 5508650 MimeMessageEnd 5508650 Octets 395 -Lines 14 +Lines 13 MimeEntityEnd 5508650 MultipartBoundaryBegin 5508650 MultipartBoundaryEnd 5508682 @@ -3545,18 +3545,18 @@ MimeEntityBegin 5508683 MimeEntityHeadersEnd 5508826 MimeMessageHeadersEnd 5508826 Octets 1019 -Lines 37 +Lines 36 MimeEntityEnd 5509845 MimeMessageEnd 5509845 Octets 1162 -Lines 41 +Lines 40 MimeEntityEnd 5509845 MultipartEndBoundaryBegin 5509845 MultipartEndBoundaryEnd 5509878 MultipartEpilogueBegin 5509878 MultipartEpilogueEnd 5509879 Octets 64210 -Lines 1846 +Lines 1845 MimeEntityEnd 5509879 MultipartEndBoundaryBegin 5509879 MultipartEndBoundaryEnd 5509899 @@ -3638,7 +3638,7 @@ MultipartEndBoundaryEnd 5668006 MultipartEpilogueBegin 5668006 MultipartEpilogueEnd 5668007 Octets 154629 -Lines 2172 +Lines 2171 MimeEntityEnd 5668007 MimeMessageEnd 5668007 MboxMarkerBegin 5668008 @@ -3648,7 +3648,7 @@ MimeEntityBegin 5668016 MimeEntityHeadersEnd 5668539 MimeMessageHeadersEnd 5668539 Octets 568 -Lines 22 +Lines 21 MimeEntityEnd 5669107 MimeMessageEnd 5669107 MboxMarkerBegin 5669108 @@ -3664,7 +3664,7 @@ MultipartBoundaryEnd 5670497 MimeEntityBegin 5670497 MimeEntityHeadersEnd 5670541 Octets 730 -Lines 27 +Lines 26 MimeEntityEnd 5671271 MultipartBoundaryBegin 5671271 MultipartBoundaryEnd 5671312 @@ -3677,35 +3677,35 @@ MultipartBoundaryEnd 5671439 MimeEntityBegin 5671439 MimeEntityHeadersEnd 5671530 Octets 802 -Lines 26 +Lines 25 MimeEntityEnd 5672332 MultipartBoundaryBegin 5672332 MultipartBoundaryEnd 5672375 MimeEntityBegin 5672375 MimeEntityHeadersEnd 5672468 Octets 57871 -Lines 756 +Lines 755 MimeEntityEnd 5730339 MultipartBoundaryBegin 5730339 MultipartBoundaryEnd 5730382 MimeEntityBegin 5730382 MimeEntityHeadersEnd 5730473 Octets 5 -Lines 2 +Lines 1 MimeEntityEnd 5730478 MultipartEndBoundaryBegin 5730478 MultipartEndBoundaryEnd 5730522 MultipartEpilogueBegin 5730522 MultipartEpilogueEnd 5730523 Octets 59126 -Lines 799 +Lines 798 MimeEntityEnd 5730523 MultipartEndBoundaryBegin 5730523 MultipartEndBoundaryEnd 5730565 MultipartEpilogueBegin 5730565 MultipartEpilogueEnd 5730566 Octets 60264 -Lines 838 +Lines 837 MimeEntityEnd 5730566 MimeMessageEnd 5730566 MboxMarkerBegin 5730567 @@ -3721,7 +3721,7 @@ MultipartBoundaryEnd 5731365 MimeEntityBegin 5731365 MimeEntityHeadersEnd 5731455 Octets 174 -Lines 8 +Lines 7 MimeEntityEnd 5731629 MultipartBoundaryBegin 5731629 MultipartBoundaryEnd 5731679 @@ -3735,7 +3735,7 @@ MultipartEndBoundaryEnd 5787037 MultipartEpilogueBegin 5787037 MultipartEpilogueEnd 5787038 Octets 55723 -Lines 776 +Lines 775 MimeEntityEnd 5787038 MimeMessageEnd 5787038 MboxMarkerBegin 5787039 @@ -3745,7 +3745,7 @@ MimeEntityBegin 5787071 MimeEntityHeadersEnd 5788538 MimeMessageHeadersEnd 5788538 Octets 1340 -Lines 35 +Lines 34 MimeEntityEnd 5789878 MimeMessageEnd 5789878 MboxMarkerBegin 5789879 @@ -3761,7 +3761,7 @@ MultipartBoundaryEnd 5790752 MimeEntityBegin 5790752 MimeEntityHeadersEnd 5790828 Octets 370 -Lines 14 +Lines 13 MimeEntityEnd 5791198 MultipartBoundaryBegin 5791198 MultipartBoundaryEnd 5791224 @@ -3772,18 +3772,18 @@ MimeEntityBegin 5791314 MimeEntityHeadersEnd 5792382 MimeMessageHeadersEnd 5792382 Octets 24395 -Lines 464 +Lines 463 MimeEntityEnd 5816777 MimeMessageEnd 5816777 Octets 25463 -Lines 478 +Lines 477 MimeEntityEnd 5816777 MultipartEndBoundaryBegin 5816777 MultipartEndBoundaryEnd 5816804 MultipartEpilogueBegin 5816804 MultipartEpilogueEnd 5816805 Octets 26124 -Lines 505 +Lines 504 MimeEntityEnd 5816805 MimeMessageEnd 5816805 MboxMarkerBegin 5816806 @@ -3799,7 +3799,7 @@ MultipartBoundaryEnd 5817576 MimeEntityBegin 5817576 MimeEntityHeadersEnd 5817654 Octets 34 -Lines 2 +Lines 1 MimeEntityEnd 5817688 MultipartBoundaryBegin 5817688 MultipartBoundaryEnd 5817737 @@ -3829,7 +3829,7 @@ MultipartBoundaryEnd 5840562 MimeEntityBegin 5840562 MimeEntityHeadersEnd 5840606 Octets 1172 -Lines 22 +Lines 21 MimeEntityEnd 5841778 MultipartBoundaryBegin 5841778 MultipartBoundaryEnd 5841787 @@ -3860,7 +3860,7 @@ MimeEntityBegin 5842397 MimeEntityHeadersEnd 5843191 MimeMessageHeadersEnd 5843191 Octets 256778 -Lines 3519 +Lines 3518 MimeEntityEnd 6099969 MimeMessageEnd 6099969 MboxMarkerBegin 6099970 @@ -3890,7 +3890,7 @@ MultipartEndBoundaryEnd 6199494 MultipartEpilogueBegin 6199494 MultipartEpilogueEnd 6199495 Octets 98665 -Lines 1297 +Lines 1296 MimeEntityEnd 6199495 MimeMessageEnd 6199495 MboxMarkerBegin 6199496 @@ -3906,7 +3906,7 @@ MultipartBoundaryEnd 6200390 MimeEntityBegin 6200390 MimeEntityHeadersEnd 6200436 Octets 943 -Lines 22 +Lines 21 MimeEntityEnd 6201379 MultipartBoundaryBegin 6201379 MultipartBoundaryEnd 6201389 @@ -3931,28 +3931,28 @@ MultipartBoundaryEnd 6201982 MimeEntityBegin 6201982 MimeEntityHeadersEnd 6202105 Octets 366 -Lines 9 +Lines 8 MimeEntityEnd 6202471 MultipartBoundaryBegin 6202471 MultipartBoundaryEnd 6202494 MimeEntityBegin 6202494 MimeEntityHeadersEnd 6202616 Octets 392 -Lines 11 +Lines 10 MimeEntityEnd 6203008 MultipartBoundaryBegin 6203008 MultipartBoundaryEnd 6203031 MimeEntityBegin 6203031 MimeEntityHeadersEnd 6203156 Octets 708 -Lines 19 +Lines 18 MimeEntityEnd 6203864 MultipartEndBoundaryBegin 6203864 MultipartEndBoundaryEnd 6203888 MultipartEpilogueBegin 6203888 MultipartEpilogueEnd 6203889 Octets 1929 -Lines 56 +Lines 55 MimeEntityEnd 6203889 MultipartBoundaryBegin 6203889 MultipartBoundaryEnd 6203912 @@ -3965,14 +3965,14 @@ MultipartBoundaryEnd 6204033 MimeEntityBegin 6204033 MimeEntityHeadersEnd 6204165 Octets 16415 -Lines 471 +Lines 470 MimeEntityEnd 6220580 MultipartBoundaryBegin 6220580 MultipartBoundaryEnd 6220603 MimeEntityBegin 6220603 MimeEntityHeadersEnd 6220734 Octets 14254 -Lines 396 +Lines 395 MimeEntityEnd 6234988 MultipartBoundaryBegin 6234988 MultipartBoundaryEnd 6235011 @@ -3985,42 +3985,42 @@ MultipartBoundaryEnd 6235134 MimeEntityBegin 6235134 MimeEntityHeadersEnd 6235276 Octets 6152 -Lines 165 +Lines 164 MimeEntityEnd 6241428 MultipartBoundaryBegin 6241428 MultipartBoundaryEnd 6241451 MimeEntityBegin 6241451 MimeEntityHeadersEnd 6241578 Octets 5255 -Lines 161 +Lines 160 MimeEntityEnd 6246833 MultipartBoundaryBegin 6246833 MultipartBoundaryEnd 6246856 MimeEntityBegin 6246856 MimeEntityHeadersEnd 6246993 Octets 7298 -Lines 198 +Lines 197 MimeEntityEnd 6254291 MultipartBoundaryBegin 6254291 MultipartBoundaryEnd 6254314 MimeEntityBegin 6254314 MimeEntityHeadersEnd 6254438 Octets 6476 -Lines 185 +Lines 184 MimeEntityEnd 6260914 MultipartBoundaryBegin 6260914 MultipartBoundaryEnd 6260937 MimeEntityBegin 6260937 MimeEntityHeadersEnd 6261074 Octets 17168 -Lines 493 +Lines 492 MimeEntityEnd 6278242 MultipartEndBoundaryBegin 6278242 MultipartEndBoundaryEnd 6278266 MultipartEpilogueBegin 6278266 MultipartEpilogueEnd 6278267 Octets 43155 -Lines 1229 +Lines 1228 MimeEntityEnd 6278267 MultipartBoundaryBegin 6278267 MultipartBoundaryEnd 6278290 @@ -4033,21 +4033,21 @@ MultipartBoundaryEnd 6278407 MimeEntityBegin 6278407 MimeEntityHeadersEnd 6278541 Octets 495 -Lines 22 +Lines 21 MimeEntityEnd 6279036 MultipartEndBoundaryBegin 6279036 MultipartEndBoundaryEnd 6279060 MultipartEpilogueBegin 6279060 MultipartEpilogueEnd 6279061 Octets 676 -Lines 29 +Lines 28 MimeEntityEnd 6279061 MultipartEndBoundaryBegin 6279061 MultipartEndBoundaryEnd 6279085 MultipartEpilogueBegin 6279085 MultipartEpilogueEnd 6279086 Octets 75075 -Lines 2145 +Lines 2144 MimeEntityEnd 6279086 MultipartBoundaryBegin 6279086 MultipartBoundaryEnd 6279109 @@ -4060,49 +4060,49 @@ MultipartBoundaryEnd 6279242 MimeEntityBegin 6279242 MimeEntityHeadersEnd 6279380 Octets 1149 -Lines 30 +Lines 29 MimeEntityEnd 6280529 MultipartBoundaryBegin 6280529 MultipartBoundaryEnd 6280552 MimeEntityBegin 6280552 MimeEntityHeadersEnd 6280678 Octets 1220 -Lines 36 +Lines 35 MimeEntityEnd 6281898 MultipartBoundaryBegin 6281898 MultipartBoundaryEnd 6281921 MimeEntityBegin 6281921 MimeEntityHeadersEnd 6282061 Octets 677 -Lines 23 +Lines 22 MimeEntityEnd 6282738 MultipartEndBoundaryBegin 6282738 MultipartEndBoundaryEnd 6282762 MultipartEpilogueBegin 6282762 MultipartEpilogueEnd 6282763 Octets 3543 -Lines 106 +Lines 105 MimeEntityEnd 6282763 MultipartEndBoundaryBegin 6282763 MultipartEndBoundaryEnd 6282787 MultipartEpilogueBegin 6282787 MultipartEpilogueEnd 6282788 Octets 80952 -Lines 2321 +Lines 2320 MimeEntityEnd 6282788 MultipartEndBoundaryBegin 6282788 MultipartEndBoundaryEnd 6282812 MultipartEpilogueBegin 6282812 MultipartEpilogueEnd 6282813 Octets 81361 -Lines 2333 +Lines 2332 MimeEntityEnd 6282813 MultipartEndBoundaryBegin 6282813 MultipartEndBoundaryEnd 6282824 MultipartEpilogueBegin 6282824 MultipartEpilogueEnd 6282825 Octets 82444 -Lines 2363 +Lines 2362 MimeEntityEnd 6282825 MimeMessageEnd 6282825 MboxMarkerBegin 6282826 @@ -4112,7 +4112,7 @@ MimeEntityBegin 6282834 MimeEntityHeadersEnd 6283636 MimeMessageHeadersEnd 6283636 Octets 9199 -Lines 227 +Lines 226 MimeEntityEnd 6292835 MimeMessageEnd 6292835 MboxMarkerBegin 6292836 @@ -4128,7 +4128,7 @@ MultipartBoundaryEnd 6293767 MimeEntityBegin 6293767 MimeEntityHeadersEnd 6293811 Octets 756 -Lines 24 +Lines 23 MimeEntityEnd 6294567 MultipartBoundaryBegin 6294567 MultipartBoundaryEnd 6294608 @@ -4141,56 +4141,56 @@ MultipartBoundaryEnd 6294735 MimeEntityBegin 6294735 MimeEntityHeadersEnd 6294826 Octets 327 -Lines 8 +Lines 7 MimeEntityEnd 6295153 MultipartBoundaryBegin 6295153 MultipartBoundaryEnd 6295196 MimeEntityBegin 6295196 MimeEntityHeadersEnd 6295290 Octets 22024 -Lines 321 +Lines 320 MimeEntityEnd 6317314 MultipartBoundaryBegin 6317314 MultipartBoundaryEnd 6317357 MimeEntityBegin 6317357 MimeEntityHeadersEnd 6317448 Octets 166 -Lines 6 +Lines 5 MimeEntityEnd 6317614 MultipartBoundaryBegin 6317614 MultipartBoundaryEnd 6317657 MimeEntityBegin 6317657 MimeEntityHeadersEnd 6317754 Octets 47213 -Lines 686 +Lines 685 MimeEntityEnd 6364967 MultipartBoundaryBegin 6364967 MultipartBoundaryEnd 6365010 MimeEntityBegin 6365010 MimeEntityHeadersEnd 6365101 Octets 70 -Lines 3 +Lines 2 MimeEntityEnd 6365171 MultipartBoundaryBegin 6365171 MultipartBoundaryEnd 6365214 MimeEntityBegin 6365214 MimeEntityHeadersEnd 6365304 Octets 20218 -Lines 295 +Lines 294 MimeEntityEnd 6385522 MultipartBoundaryBegin 6385522 MultipartBoundaryEnd 6385565 MimeEntityBegin 6385565 MimeEntityHeadersEnd 6385656 Octets 104 -Lines 9 +Lines 8 MimeEntityEnd 6385760 MultipartEndBoundaryBegin 6385760 MultipartEndBoundaryEnd 6385804 MultipartEpilogueBegin 6385804 MultipartEpilogueEnd 6385805 Octets 91112 -Lines 1361 +Lines 1360 MimeEntityEnd 6385805 MultipartEndBoundaryBegin 6385805 MultipartEndBoundaryEnd 6385847 @@ -4213,28 +4213,28 @@ MultipartBoundaryEnd 6386850 MimeEntityBegin 6386850 MimeEntityHeadersEnd 6386923 Octets 420 -Lines 14 +Lines 13 MimeEntityEnd 6387343 MultipartBoundaryBegin 6387343 MultipartBoundaryEnd 6387389 MimeEntityBegin 6387389 MimeEntityHeadersEnd 6387450 Octets 33564 -Lines 461 +Lines 460 MimeEntityEnd 6421014 MultipartBoundaryBegin 6421014 MultipartBoundaryEnd 6421060 MimeEntityBegin 6421060 MimeEntityHeadersEnd 6421133 Octets 94 -Lines 8 +Lines 7 MimeEntityEnd 6421227 MultipartEndBoundaryBegin 6421227 MultipartEndBoundaryEnd 6421274 MultipartEpilogueBegin 6421274 MultipartEpilogueEnd 6421275 Octets 34665 -Lines 501 +Lines 500 MimeEntityEnd 6421275 MimeMessageEnd 6421275 MboxMarkerBegin 6421276 @@ -4244,7 +4244,7 @@ MimeEntityBegin 6421318 MimeEntityHeadersEnd 6421466 MimeMessageHeadersEnd 6421466 Octets 43029 -Lines 694 +Lines 693 MimeEntityEnd 6464495 MimeMessageEnd 6464495 MboxMarkerBegin 6464496 @@ -4266,35 +4266,35 @@ MultipartBoundaryEnd 6465354 MimeEntityBegin 6465354 MimeEntityHeadersEnd 6465432 Octets 1272 -Lines 39 +Lines 38 MimeEntityEnd 6466704 MultipartBoundaryBegin 6466704 MultipartBoundaryEnd 6466744 MimeEntityBegin 6466744 MimeEntityHeadersEnd 6466823 Octets 2464 -Lines 33 +Lines 32 MimeEntityEnd 6469287 MultipartEndBoundaryBegin 6469287 MultipartEndBoundaryEnd 6469328 MultipartEpilogueBegin 6469328 MultipartEpilogueEnd 6469330 Octets 4016 -Lines 84 +Lines 83 MimeEntityEnd 6469330 MultipartBoundaryBegin 6469330 MultipartBoundaryEnd 6469370 MimeEntityBegin 6469370 MimeEntityHeadersEnd 6469575 Octets 20750 -Lines 271 +Lines 270 MimeEntityEnd 6490325 MultipartEndBoundaryBegin 6490325 MultipartEndBoundaryEnd 6490366 MultipartEpilogueBegin 6490366 MultipartEpilogueEnd 6490367 Octets 25256 -Lines 369 +Lines 368 MimeEntityEnd 6490367 MimeMessageEnd 6490367 MboxMarkerBegin 6490368 @@ -4310,7 +4310,7 @@ MultipartBoundaryEnd 6490872 MimeEntityBegin 6490872 MimeEntityHeadersEnd 6490873 Octets 63 -Lines 2 +Lines 1 MimeEntityEnd 6490936 MultipartBoundaryBegin 6490936 MultipartBoundaryEnd 6490957 @@ -4323,35 +4323,35 @@ MultipartBoundaryEnd 6491058 MimeEntityBegin 6491058 MimeEntityHeadersEnd 6491164 Octets 80 -Lines 4 +Lines 3 MimeEntityEnd 6491244 MultipartBoundaryBegin 6491244 MultipartBoundaryEnd 6491272 MimeEntityBegin 6491272 MimeEntityHeadersEnd 6491381 Octets 158 -Lines 5 +Lines 4 MimeEntityEnd 6491539 MultipartBoundaryBegin 6491539 MultipartBoundaryEnd 6491567 MimeEntityBegin 6491567 MimeEntityHeadersEnd 6491676 Octets 163 -Lines 11 +Lines 10 MimeEntityEnd 6491839 MultipartBoundaryBegin 6491839 MultipartBoundaryEnd 6491867 MimeEntityBegin 6491867 MimeEntityHeadersEnd 6491972 Octets 161 -Lines 4 +Lines 3 MimeEntityEnd 6492133 MultipartBoundaryBegin 6492133 MultipartBoundaryEnd 6492161 MimeEntityBegin 6492161 MimeEntityHeadersEnd 6492285 Octets 427 -Lines 7 +Lines 6 MimeEntityEnd 6492712 MultipartEndBoundaryBegin 6492712 MultipartEndBoundaryEnd 6492741 @@ -4365,7 +4365,7 @@ MultipartBoundaryEnd 6492762 MimeEntityBegin 6492762 MimeEntityHeadersEnd 6492763 Octets 165 -Lines 5 +Lines 4 MimeEntityEnd 6492928 MultipartBoundaryBegin 6492928 MultipartBoundaryEnd 6492949 @@ -4378,7 +4378,7 @@ MultipartBoundaryEnd 6493004 MimeEntityBegin 6493004 MimeEntityHeadersEnd 6493030 Octets 53 -Lines 2 +Lines 1 MimeEntityEnd 6493083 MultipartBoundaryBegin 6493083 MultipartBoundaryEnd 6493089 @@ -4391,35 +4391,35 @@ MultipartBoundaryEnd 6493144 MimeEntityBegin 6493144 MimeEntityHeadersEnd 6493170 Octets 53 -Lines 2 +Lines 1 MimeEntityEnd 6493223 MultipartBoundaryBegin 6493223 MultipartBoundaryEnd 6493229 MimeEntityBegin 6493229 MimeEntityHeadersEnd 6493254 Octets 50 -Lines 2 +Lines 1 MimeEntityEnd 6493304 MultipartBoundaryBegin 6493304 MultipartBoundaryEnd 6493310 MimeEntityBegin 6493310 MimeEntityHeadersEnd 6493337 Octets 54 -Lines 2 +Lines 1 MimeEntityEnd 6493391 MultipartEndBoundaryBegin 6493391 MultipartEndBoundaryEnd 6493398 MultipartEpilogueBegin 6493398 MultipartEpilogueEnd 6493399 Octets 260 -Lines 17 +Lines 16 MimeEntityEnd 6493399 MultipartBoundaryBegin 6493399 MultipartBoundaryEnd 6493405 MimeEntityBegin 6493405 MimeEntityHeadersEnd 6493497 Octets 15 -Lines 2 +Lines 1 MimeEntityEnd 6493512 MultipartEndBoundaryBegin 6493512 MultipartEndBoundaryEnd 6493519 @@ -4433,7 +4433,7 @@ MultipartBoundaryEnd 6493540 MimeEntityBegin 6493540 MimeEntityHeadersEnd 6493541 Octets 9 -Lines 2 +Lines 1 MimeEntityEnd 6493550 MultipartEndBoundaryBegin 6493550 MultipartEndBoundaryEnd 6493572 @@ -4456,7 +4456,7 @@ MultipartBoundaryEnd 6494075 MimeEntityBegin 6494075 MimeEntityHeadersEnd 6494076 Octets 67 -Lines 2 +Lines 1 MimeEntityEnd 6494143 MultipartBoundaryBegin 6494143 MultipartBoundaryEnd 6494164 @@ -4469,28 +4469,28 @@ MultipartBoundaryEnd 6494265 MimeEntityBegin 6494265 MimeEntityHeadersEnd 6494421 Octets 55263 -Lines 1604 +Lines 1603 MimeEntityEnd 6549684 MultipartBoundaryBegin 6549684 MultipartBoundaryEnd 6549712 MimeEntityBegin 6549712 MimeEntityHeadersEnd 6549867 Octets 106049 -Lines 2983 +Lines 2982 MimeEntityEnd 6655916 MultipartBoundaryBegin 6655916 MultipartBoundaryEnd 6655944 MimeEntityBegin 6655944 MimeEntityHeadersEnd 6656090 Octets 188359 -Lines 13110 +Lines 13109 MimeEntityEnd 6844449 MultipartEndBoundaryBegin 6844449 MultipartEndBoundaryEnd 6844478 MultipartEpilogueBegin 6844478 MultipartEpilogueEnd 6844479 Octets 350241 -Lines 17714 +Lines 17713 MimeEntityEnd 6844479 MultipartEndBoundaryBegin 6844479 MultipartEndBoundaryEnd 6844501 @@ -4513,7 +4513,7 @@ MultipartBoundaryEnd 6845376 MimeEntityBegin 6845376 MimeEntityHeadersEnd 6845488 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 6845488 MultipartBoundaryBegin 6845488 MultipartBoundaryEnd 6845529 @@ -4524,11 +4524,11 @@ MimeEntityBegin 6845627 MimeEntityHeadersEnd 6846168 MimeMessageHeadersEnd 6846168 Octets 346 -Lines 17 +Lines 16 MimeEntityEnd 6846514 MimeMessageEnd 6846514 Octets 887 -Lines 29 +Lines 28 MimeEntityEnd 6846514 MultipartEndBoundaryBegin 6846514 MultipartEndBoundaryEnd 6846556 @@ -4551,14 +4551,14 @@ MultipartBoundaryEnd 6846900 MimeEntityBegin 6846900 MimeEntityHeadersEnd 6847146 Octets 719 -Lines 31 +Lines 30 MimeEntityEnd 6847865 MultipartBoundaryBegin 6847865 MultipartBoundaryEnd 6847905 MimeEntityBegin 6847905 MimeEntityHeadersEnd 6848225 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 6858948 MultipartEndBoundaryBegin 6858948 MultipartEndBoundaryEnd 6858989 @@ -4581,14 +4581,14 @@ MultipartBoundaryEnd 6859333 MimeEntityBegin 6859333 MimeEntityHeadersEnd 6859579 Octets 718 -Lines 31 +Lines 30 MimeEntityEnd 6860297 MultipartBoundaryBegin 6860297 MultipartBoundaryEnd 6860337 MimeEntityBegin 6860337 MimeEntityHeadersEnd 6860626 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 6871349 MultipartEndBoundaryBegin 6871349 MultipartEndBoundaryEnd 6871390 @@ -4611,21 +4611,21 @@ MultipartBoundaryEnd 6872971 MimeEntityBegin 6872971 MimeEntityHeadersEnd 6873062 Octets 5199 -Lines 112 +Lines 111 MimeEntityEnd 6878261 MultipartBoundaryBegin 6878261 MultipartBoundaryEnd 6878306 MimeEntityBegin 6878306 MimeEntityHeadersEnd 6878505 Octets 929 -Lines 14 +Lines 13 MimeEntityEnd 6879434 MultipartEndBoundaryBegin 6879434 MultipartEndBoundaryEnd 6879480 MultipartEpilogueBegin 6879480 MultipartEpilogueEnd 6879481 Octets 6555 -Lines 140 +Lines 139 MimeEntityEnd 6879481 MimeMessageEnd 6879481 MboxMarkerBegin 6879482 @@ -4641,7 +4641,7 @@ MultipartBoundaryEnd 6880000 MimeEntityBegin 6880000 MimeEntityHeadersEnd 6880026 Octets 247 -Lines 7 +Lines 6 MimeEntityEnd 6880273 MultipartBoundaryBegin 6880273 MultipartBoundaryEnd 6880313 @@ -4654,7 +4654,7 @@ MultipartBoundaryEnd 6880438 MimeEntityBegin 6880438 MimeEntityHeadersEnd 6880632 Octets 7148 -Lines 180 +Lines 179 MimeEntityEnd 6887780 MultipartBoundaryBegin 6887780 MultipartBoundaryEnd 6887820 @@ -4733,14 +4733,14 @@ MultipartBoundaryEnd 7094880 MimeEntityBegin 7094880 MimeEntityHeadersEnd 7095036 Octets 551 -Lines 28 +Lines 27 MimeEntityEnd 7095587 MultipartBoundaryBegin 7095587 MultipartBoundaryEnd 7095627 MimeEntityBegin 7095627 MimeEntityHeadersEnd 7095740 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 7106463 MultipartEndBoundaryBegin 7106463 MultipartEndBoundaryEnd 7106504 @@ -4763,14 +4763,14 @@ MultipartBoundaryEnd 7106847 MimeEntityBegin 7106847 MimeEntityHeadersEnd 7107059 Octets 597 -Lines 29 +Lines 28 MimeEntityEnd 7107656 MultipartBoundaryBegin 7107656 MultipartBoundaryEnd 7107696 MimeEntityBegin 7107696 MimeEntityHeadersEnd 7107970 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 7118693 MultipartEndBoundaryBegin 7118693 MultipartEndBoundaryEnd 7118734 @@ -4793,14 +4793,14 @@ MultipartBoundaryEnd 7119077 MimeEntityBegin 7119077 MimeEntityHeadersEnd 7119293 Octets 601 -Lines 29 +Lines 28 MimeEntityEnd 7119894 MultipartBoundaryBegin 7119894 MultipartBoundaryEnd 7119934 MimeEntityBegin 7119934 MimeEntityHeadersEnd 7120109 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 7130832 MultipartEndBoundaryBegin 7130832 MultipartEndBoundaryEnd 7130873 @@ -4823,14 +4823,14 @@ MultipartBoundaryEnd 7131216 MimeEntityBegin 7131216 MimeEntityHeadersEnd 7131461 Octets 631 -Lines 30 +Lines 29 MimeEntityEnd 7132092 MultipartBoundaryBegin 7132092 MultipartBoundaryEnd 7132132 MimeEntityBegin 7132132 MimeEntityHeadersEnd 7132437 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 7143160 MultipartEndBoundaryBegin 7143160 MultipartEndBoundaryEnd 7143201 @@ -4853,14 +4853,14 @@ MultipartBoundaryEnd 7143544 MimeEntityBegin 7143544 MimeEntityHeadersEnd 7143760 Octets 645 -Lines 29 +Lines 28 MimeEntityEnd 7144405 MultipartBoundaryBegin 7144405 MultipartBoundaryEnd 7144445 MimeEntityBegin 7144445 MimeEntityHeadersEnd 7144620 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 7155343 MultipartEndBoundaryBegin 7155343 MultipartEndBoundaryEnd 7155384 @@ -4883,14 +4883,14 @@ MultipartBoundaryEnd 7155727 MimeEntityBegin 7155727 MimeEntityHeadersEnd 7155972 Octets 670 -Lines 30 +Lines 29 MimeEntityEnd 7156642 MultipartBoundaryBegin 7156642 MultipartBoundaryEnd 7156682 MimeEntityBegin 7156682 MimeEntityHeadersEnd 7157018 Octets 10723 -Lines 148 +Lines 147 MimeEntityEnd 7167741 MultipartEndBoundaryBegin 7167741 MultipartEndBoundaryEnd 7167782 @@ -4913,7 +4913,7 @@ MultipartBoundaryEnd 7169133 MimeEntityBegin 7169133 MimeEntityHeadersEnd 7169209 Octets 27 -Lines 4 +Lines 3 MimeEntityEnd 7169236 MultipartBoundaryBegin 7169236 MultipartBoundaryEnd 7169275 @@ -4930,7 +4930,7 @@ MultipartBoundaryEnd 7170226 MimeEntityBegin 7170226 MimeEntityHeadersEnd 7170302 Octets 627 -Lines 17 +Lines 16 MimeEntityEnd 7170929 MultipartBoundaryBegin 7170929 MultipartBoundaryEnd 7170969 @@ -4943,7 +4943,7 @@ MultipartBoundaryEnd 7171091 MimeEntityBegin 7171091 MimeEntityHeadersEnd 7171166 Octets 850 -Lines 19 +Lines 18 MimeEntityEnd 7172016 MultipartBoundaryBegin 7172016 MultipartBoundaryEnd 7172056 @@ -4957,25 +4957,25 @@ MultipartEndBoundaryEnd 7916248 MultipartEpilogueBegin 7916248 MultipartEpilogueEnd 7916249 Octets 745198 -Lines 10224 +Lines 10223 MimeEntityEnd 7916249 MultipartEndBoundaryBegin 7916249 MultipartEndBoundaryEnd 7916290 MultipartEpilogueBegin 7916290 MultipartEpilogueEnd 7916293 Octets 746107 -Lines 10253 +Lines 10252 MimeEntityEnd 7916293 MimeMessageEnd 7916293 Octets 746928 -Lines 10269 +Lines 10268 MimeEntityEnd 7916293 MultipartEndBoundaryBegin 7916293 MultipartEndBoundaryEnd 7916333 MultipartEpilogueBegin 7916333 MultipartEpilogueEnd 7916334 Octets 747285 -Lines 10286 +Lines 10285 MimeEntityEnd 7916334 MimeMessageEnd 7916334 MboxMarkerBegin 7916335 @@ -4991,42 +4991,42 @@ MultipartBoundaryEnd 7917676 MimeEntityBegin 7917676 MimeEntityHeadersEnd 7917767 Octets 2382 -Lines 51 +Lines 50 MimeEntityEnd 7920149 MultipartBoundaryBegin 7920149 MultipartBoundaryEnd 7920194 MimeEntityBegin 7920194 MimeEntityHeadersEnd 7920353 Octets 6023 -Lines 80 +Lines 79 MimeEntityEnd 7926376 MultipartBoundaryBegin 7926376 MultipartBoundaryEnd 7926421 MimeEntityBegin 7926421 MimeEntityHeadersEnd 7926579 Octets 12073 -Lines 158 +Lines 157 MimeEntityEnd 7938652 MultipartBoundaryBegin 7938652 MultipartBoundaryEnd 7938697 MimeEntityBegin 7938697 MimeEntityHeadersEnd 7938857 Octets 21714 -Lines 283 +Lines 282 MimeEntityEnd 7960571 MultipartBoundaryBegin 7960571 MultipartBoundaryEnd 7960616 MimeEntityBegin 7960616 MimeEntityHeadersEnd 7960819 Octets 3393 -Lines 46 +Lines 45 MimeEntityEnd 7964212 MultipartEndBoundaryBegin 7964212 MultipartEndBoundaryEnd 7964258 MultipartEpilogueBegin 7964258 MultipartEpilogueEnd 7964259 Octets 46628 -Lines 650 +Lines 649 MimeEntityEnd 7964259 MimeMessageEnd 7964259 MboxMarkerBegin 7964260 @@ -5036,7 +5036,7 @@ MimeEntityBegin 7964268 MimeEntityHeadersEnd 7965009 MimeMessageHeadersEnd 7965009 Octets 544616 -Lines 7475 +Lines 7474 MimeEntityEnd 8509625 MimeMessageEnd 8509625 MboxMarkerBegin 8509626 @@ -5052,14 +5052,14 @@ MultipartBoundaryEnd 8510554 MimeEntityBegin 8510554 MimeEntityHeadersEnd 8510583 Octets 2530 -Lines 97 +Lines 96 MimeEntityEnd 8513113 MultipartEndBoundaryBegin 8513113 MultipartEndBoundaryEnd 8513123 MultipartEpilogueBegin 8513123 MultipartEpilogueEnd 8513124 Octets 2579 -Lines 103 +Lines 102 MimeEntityEnd 8513124 MimeMessageEnd 8513124 MboxMarkerBegin 8513125 @@ -5075,14 +5075,14 @@ MultipartBoundaryEnd 8514048 MimeEntityBegin 8514048 MimeEntityHeadersEnd 8514093 Octets 1082 -Lines 27 +Lines 26 MimeEntityEnd 8515175 MultipartBoundaryBegin 8515175 MultipartBoundaryEnd 8515193 MimeEntityBegin 8515193 MimeEntityHeadersEnd 8515234 Octets 284 -Lines 10 +Lines 9 MimeEntityEnd 8515518 MultipartEndBoundaryBegin 8515518 MultipartEndBoundaryEnd 8515537 @@ -5109,7 +5109,7 @@ MimeEntityBegin 8518100 MimeEntityHeadersEnd 8518733 MimeMessageHeadersEnd 8518733 Octets 974 -Lines 28 +Lines 27 MimeEntityEnd 8519707 MimeMessageEnd 8519707 MboxMarkerBegin 8519708 @@ -5125,7 +5125,7 @@ MultipartBoundaryEnd 8520673 MimeEntityBegin 8520673 MimeEntityHeadersEnd 8520717 Octets 817 -Lines 16 +Lines 15 MimeEntityEnd 8521534 MultipartBoundaryBegin 8521534 MultipartBoundaryEnd 8521575 @@ -5138,7 +5138,7 @@ MultipartBoundaryEnd 8521702 MimeEntityBegin 8521702 MimeEntityHeadersEnd 8521793 Octets 491 -Lines 11 +Lines 10 MimeEntityEnd 8522284 MultipartBoundaryBegin 8522284 MultipartBoundaryEnd 8522327 @@ -5149,18 +5149,18 @@ MimeEntityBegin 8522513 MimeEntityHeadersEnd 8522540 MimeMessageHeadersEnd 8522540 Octets 2 -Lines 3 +Lines 2 MimeEntityEnd 8522542 MimeMessageEnd 8522542 Octets 29 -Lines 5 +Lines 4 MimeEntityEnd 8522542 MultipartBoundaryBegin 8522542 MultipartBoundaryEnd 8522585 MimeEntityBegin 8522585 MimeEntityHeadersEnd 8522673 Octets 3 -Lines 3 +Lines 2 MimeEntityEnd 8522676 MultipartBoundaryBegin 8522676 MultipartBoundaryEnd 8522719 @@ -5171,32 +5171,32 @@ MimeEntityBegin 8522920 MimeEntityHeadersEnd 8522945 MimeMessageHeadersEnd 8522945 Octets 2 -Lines 3 +Lines 2 MimeEntityEnd 8522947 MimeMessageEnd 8522947 Octets 27 -Lines 5 +Lines 4 MimeEntityEnd 8522947 MultipartBoundaryBegin 8522947 MultipartBoundaryEnd 8522990 MimeEntityBegin 8522990 MimeEntityHeadersEnd 8523081 Octets 222 -Lines 8 +Lines 7 MimeEntityEnd 8523303 MultipartEndBoundaryBegin 8523303 MultipartEndBoundaryEnd 8523347 MultipartEpilogueBegin 8523347 MultipartEpilogueEnd 8523348 Octets 1688 -Lines 62 +Lines 61 MimeEntityEnd 8523348 MultipartEndBoundaryBegin 8523348 MultipartEndBoundaryEnd 8523390 MultipartEpilogueBegin 8523390 MultipartEpilogueEnd 8523391 Octets 2913 -Lines 90 +Lines 89 MimeEntityEnd 8523391 MimeMessageEnd 8523391 MboxMarkerBegin 8523392 @@ -5206,7 +5206,7 @@ MimeEntityBegin 8523400 MimeEntityHeadersEnd 8524214 MimeMessageHeadersEnd 8524214 Octets 1386 -Lines 43 +Lines 42 MimeEntityEnd 8525600 MimeMessageEnd 8525600 MboxMarkerBegin 8525601 @@ -5232,7 +5232,7 @@ MultipartBoundaryEnd 8532379 MimeEntityBegin 8532379 MimeEntityHeadersEnd 8532423 Octets 1667 -Lines 39 +Lines 38 MimeEntityEnd 8534090 MultipartBoundaryBegin 8534090 MultipartBoundaryEnd 8534131 @@ -5245,133 +5245,133 @@ MultipartBoundaryEnd 8534258 MimeEntityBegin 8534258 MimeEntityHeadersEnd 8534349 Octets 557 -Lines 15 +Lines 14 MimeEntityEnd 8534906 MultipartBoundaryBegin 8534906 MultipartBoundaryEnd 8534949 MimeEntityBegin 8534949 MimeEntityHeadersEnd 8535010 Octets 872 -Lines 13 +Lines 12 MimeEntityEnd 8535882 MultipartBoundaryBegin 8535882 MultipartBoundaryEnd 8535925 MimeEntityBegin 8535925 MimeEntityHeadersEnd 8536016 Octets 46 -Lines 6 +Lines 5 MimeEntityEnd 8536062 MultipartBoundaryBegin 8536062 MultipartBoundaryEnd 8536105 MimeEntityBegin 8536105 MimeEntityHeadersEnd 8536166 Octets 872 -Lines 13 +Lines 12 MimeEntityEnd 8537038 MultipartBoundaryBegin 8537038 MultipartBoundaryEnd 8537081 MimeEntityBegin 8537081 MimeEntityHeadersEnd 8537172 Octets 46 -Lines 6 +Lines 5 MimeEntityEnd 8537218 MultipartBoundaryBegin 8537218 MultipartBoundaryEnd 8537261 MimeEntityBegin 8537261 MimeEntityHeadersEnd 8537322 Octets 872 -Lines 13 +Lines 12 MimeEntityEnd 8538194 MultipartBoundaryBegin 8538194 MultipartBoundaryEnd 8538237 MimeEntityBegin 8538237 MimeEntityHeadersEnd 8538328 Octets 40 -Lines 6 +Lines 5 MimeEntityEnd 8538368 MultipartBoundaryBegin 8538368 MultipartBoundaryEnd 8538411 MimeEntityBegin 8538411 MimeEntityHeadersEnd 8538472 Octets 224 -Lines 5 +Lines 4 MimeEntityEnd 8538696 MultipartBoundaryBegin 8538696 MultipartBoundaryEnd 8538739 MimeEntityBegin 8538739 MimeEntityHeadersEnd 8538830 Octets 64 -Lines 6 +Lines 5 MimeEntityEnd 8538894 MultipartBoundaryBegin 8538894 MultipartBoundaryEnd 8538937 MimeEntityBegin 8538937 MimeEntityHeadersEnd 8538998 Octets 224 -Lines 5 +Lines 4 MimeEntityEnd 8539222 MultipartBoundaryBegin 8539222 MultipartBoundaryEnd 8539265 MimeEntityBegin 8539265 MimeEntityHeadersEnd 8539356 Octets 44 -Lines 6 +Lines 5 MimeEntityEnd 8539400 MultipartBoundaryBegin 8539400 MultipartBoundaryEnd 8539443 MimeEntityBegin 8539443 MimeEntityHeadersEnd 8539504 Octets 224 -Lines 5 +Lines 4 MimeEntityEnd 8539728 MultipartBoundaryBegin 8539728 MultipartBoundaryEnd 8539771 MimeEntityBegin 8539771 MimeEntityHeadersEnd 8539862 Octets 292 -Lines 12 +Lines 11 MimeEntityEnd 8540154 MultipartBoundaryBegin 8540154 MultipartBoundaryEnd 8540197 MimeEntityBegin 8540197 MimeEntityHeadersEnd 8540258 Octets 872 -Lines 13 +Lines 12 MimeEntityEnd 8541130 MultipartBoundaryBegin 8541130 MultipartBoundaryEnd 8541173 MimeEntityBegin 8541173 MimeEntityHeadersEnd 8541264 Octets 40 -Lines 5 +Lines 4 MimeEntityEnd 8541304 MultipartBoundaryBegin 8541304 MultipartBoundaryEnd 8541347 MimeEntityBegin 8541347 MimeEntityHeadersEnd 8541408 Octets 1915 -Lines 28 +Lines 27 MimeEntityEnd 8543323 MultipartBoundaryBegin 8543323 MultipartBoundaryEnd 8543366 MimeEntityBegin 8543366 MimeEntityHeadersEnd 8543457 Octets 10 -Lines 2 +Lines 1 MimeEntityEnd 8543467 MultipartEndBoundaryBegin 8543467 MultipartEndBoundaryEnd 8543511 MultipartEpilogueBegin 8543511 MultipartEpilogueEnd 8543512 Octets 9296 -Lines 229 +Lines 228 MimeEntityEnd 8543512 MultipartEndBoundaryBegin 8543512 MultipartEndBoundaryEnd 8543554 MultipartEpilogueBegin 8543554 MultipartEpilogueEnd 8543555 Octets 11371 -Lines 280 +Lines 279 MimeEntityEnd 8543555 MimeMessageEnd 8543555 MboxMarkerBegin 8543556 @@ -5387,7 +5387,7 @@ MultipartBoundaryEnd 8544487 MimeEntityBegin 8544487 MimeEntityHeadersEnd 8544531 Octets 627 -Lines 13 +Lines 12 MimeEntityEnd 8545158 MultipartBoundaryBegin 8545158 MultipartBoundaryEnd 8545199 @@ -5400,28 +5400,28 @@ MultipartBoundaryEnd 8545326 MimeEntityBegin 8545326 MimeEntityHeadersEnd 8545417 Octets 533 -Lines 9 +Lines 8 MimeEntityEnd 8545950 MultipartBoundaryBegin 8545950 MultipartBoundaryEnd 8545993 MimeEntityBegin 8545993 MimeEntityHeadersEnd 8546101 Octets 8585 -Lines 126 +Lines 125 MimeEntityEnd 8554686 MultipartBoundaryBegin 8554686 MultipartBoundaryEnd 8554729 MimeEntityBegin 8554729 MimeEntityHeadersEnd 8554820 Octets 45 -Lines 4 +Lines 3 MimeEntityEnd 8554865 MultipartEndBoundaryBegin 8554865 MultipartEndBoundaryEnd 8554909 MultipartEpilogueBegin 8554909 MultipartEpilogueEnd 8554910 Octets 9626 -Lines 154 +Lines 153 MimeEntityEnd 8554910 MultipartEndBoundaryBegin 8554910 MultipartEndBoundaryEnd 8554952 @@ -5444,7 +5444,7 @@ MultipartBoundaryEnd 8555657 MimeEntityBegin 8555657 MimeEntityHeadersEnd 8555747 Octets 97 -Lines 7 +Lines 6 MimeEntityEnd 8555844 MultipartBoundaryBegin 8555844 MultipartBoundaryEnd 8555894 @@ -5458,7 +5458,7 @@ MultipartEndBoundaryEnd 8634514 MultipartEpilogueBegin 8634514 MultipartEpilogueEnd 8634515 Octets 78908 -Lines 1094 +Lines 1093 MimeEntityEnd 8634515 MimeMessageEnd 8634515 MboxMarkerBegin 8634516 @@ -5474,7 +5474,7 @@ MultipartBoundaryEnd 8635475 MimeEntityBegin 8635475 MimeEntityHeadersEnd 8635519 Octets 1350 -Lines 29 +Lines 28 MimeEntityEnd 8636869 MultipartBoundaryBegin 8636869 MultipartBoundaryEnd 8636910 @@ -5487,42 +5487,42 @@ MultipartBoundaryEnd 8637037 MimeEntityBegin 8637037 MimeEntityHeadersEnd 8637128 Octets 1139 -Lines 23 +Lines 22 MimeEntityEnd 8638267 MultipartBoundaryBegin 8638267 MultipartBoundaryEnd 8638310 MimeEntityBegin 8638310 MimeEntityHeadersEnd 8638408 Octets 115243 -Lines 1580 +Lines 1579 MimeEntityEnd 8753651 MultipartBoundaryBegin 8753651 MultipartBoundaryEnd 8753694 MimeEntityBegin 8753694 MimeEntityHeadersEnd 8753785 Octets 123 -Lines 4 +Lines 3 MimeEntityEnd 8753908 MultipartBoundaryBegin 8753908 MultipartBoundaryEnd 8753951 MimeEntityBegin 8753951 MimeEntityHeadersEnd 8754050 Octets 66281 -Lines 962 +Lines 961 MimeEntityEnd 8820331 MultipartBoundaryBegin 8820331 MultipartBoundaryEnd 8820374 MimeEntityBegin 8820374 MimeEntityHeadersEnd 8820462 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 8820462 MultipartEndBoundaryBegin 8820462 MultipartEndBoundaryEnd 8820506 MultipartEpilogueBegin 8820506 MultipartEpilogueEnd 8820507 Octets 183512 -Lines 2594 +Lines 2593 MimeEntityEnd 8820507 MultipartEndBoundaryBegin 8820507 MultipartEndBoundaryEnd 8820549 @@ -5539,7 +5539,7 @@ MimeEntityBegin 8820558 MimeEntityHeadersEnd 8821395 MimeMessageHeadersEnd 8821395 Octets 1733 -Lines 26 +Lines 25 MimeEntityEnd 8823128 MimeMessageEnd 8823128 MboxMarkerBegin 8823129 @@ -5573,7 +5573,7 @@ MultipartBoundaryEnd 8825588 MimeEntityBegin 8825588 MimeEntityHeadersEnd 8825589 Octets 40 -Lines 2 +Lines 1 MimeEntityEnd 8825629 MultipartBoundaryBegin 8825629 MultipartBoundaryEnd 8825639 @@ -5587,7 +5587,7 @@ MultipartEndBoundaryEnd 8916960 MultipartEpilogueBegin 8916960 MultipartEpilogueEnd 8916963 Octets 91384 -Lines 1262 +Lines 1261 MimeEntityEnd 8916963 MimeMessageEnd 8916963 MboxMarkerBegin 8916964 @@ -5597,7 +5597,7 @@ MimeEntityBegin 8916972 MimeEntityHeadersEnd 8917462 MimeMessageHeadersEnd 8917462 Octets 1142 -Lines 28 +Lines 27 MimeEntityEnd 8918604 MimeMessageEnd 8918604 MboxMarkerBegin 8918605 @@ -5613,7 +5613,7 @@ MultipartBoundaryEnd 8919758 MimeEntityBegin 8919758 MimeEntityHeadersEnd 8919759 Octets 540 -Lines 13 +Lines 12 MimeEntityEnd 8920299 MultipartBoundaryBegin 8920299 MultipartBoundaryEnd 8920305 @@ -5627,7 +5627,7 @@ MultipartBoundaryEnd 8978068 MimeEntityBegin 8978068 MimeEntityHeadersEnd 8978069 Octets 3783 -Lines 84 +Lines 83 MimeEntityEnd 8981852 MultipartBoundaryBegin 8981852 MultipartBoundaryEnd 8981858 @@ -5641,7 +5641,7 @@ MultipartBoundaryEnd 9011653 MimeEntityBegin 9011653 MimeEntityHeadersEnd 9011759 Octets 716 -Lines 25 +Lines 24 MimeEntityEnd 9012475 MultipartBoundaryBegin 9012475 MultipartBoundaryEnd 9012481 @@ -5655,7 +5655,7 @@ MultipartEndBoundaryEnd 9013869 MultipartEpilogueBegin 9013869 MultipartEpilogueEnd 9013870 Octets 94117 -Lines 1971 +Lines 1970 MimeEntityEnd 9013870 MimeMessageEnd 9013870 MboxMarkerBegin 9013871 @@ -5671,21 +5671,21 @@ MultipartBoundaryEnd 9015073 MimeEntityBegin 9015073 MimeEntityHeadersEnd 9015074 Octets 901 -Lines 21 +Lines 20 MimeEntityEnd 9015975 MultipartBoundaryBegin 9015975 MultipartBoundaryEnd 9015993 MimeEntityBegin 9015993 MimeEntityHeadersEnd 9016072 Octets 748 -Lines 13 +Lines 12 MimeEntityEnd 9016820 MultipartEndBoundaryBegin 9016820 MultipartEndBoundaryEnd 9016839 MultipartEpilogueBegin 9016839 MultipartEpilogueEnd 9016840 Octets 1784 -Lines 42 +Lines 41 MimeEntityEnd 9016840 MimeMessageEnd 9016840 MboxMarkerBegin 9016841 @@ -5708,7 +5708,7 @@ MultipartBoundaryEnd 9019022 MimeEntityBegin 9019022 MimeEntityHeadersEnd 9019200 Octets 2215 -Lines 32 +Lines 31 MimeEntityEnd 9021415 MultipartEndBoundaryBegin 9021415 MultipartEndBoundaryEnd 9021424 @@ -5738,7 +5738,7 @@ MultipartBoundaryEnd 9025700 MimeEntityBegin 9025700 MimeEntityHeadersEnd 9025878 Octets 2547 -Lines 36 +Lines 35 MimeEntityEnd 9028425 MultipartEndBoundaryBegin 9028425 MultipartEndBoundaryEnd 9028448 @@ -5785,7 +5785,7 @@ MultipartEndBoundaryEnd 9049539 MultipartEpilogueBegin 9049539 MultipartEpilogueEnd 9049540 Octets 15749 -Lines 225 +Lines 224 MimeEntityEnd 9049540 MimeMessageEnd 9049540 MboxMarkerBegin 9049541 @@ -5865,7 +5865,7 @@ MultipartEndBoundaryEnd 9190707 MultipartEpilogueBegin 9190707 MultipartEpilogueEnd 9190708 Octets 4392 -Lines 70 +Lines 69 MimeEntityEnd 9190708 MimeMessageEnd 9190708 MboxMarkerBegin 9190709 @@ -5875,7 +5875,7 @@ MimeEntityBegin 9190741 MimeEntityHeadersEnd 9191951 MimeMessageHeadersEnd 9191951 Octets 3495 -Lines 56 +Lines 55 MimeEntityEnd 9195446 MimeMessageEnd 9195446 MboxMarkerBegin 9195447 @@ -5909,11 +5909,11 @@ MimeEntityBegin 9206054 MimeEntityHeadersEnd 9207434 MimeMessageHeadersEnd 9207434 Octets 1432 -Lines 21 +Lines 20 MimeEntityEnd 9208866 MimeMessageEnd 9208866 Octets 2812 -Lines 44 +Lines 43 MimeEntityEnd 9208866 MimeMessageEnd 9208866 MboxMarkerBegin 9208867 @@ -5929,7 +5929,7 @@ MultipartBoundaryEnd 9209682 MimeEntityBegin 9209682 MimeEntityHeadersEnd 9209758 Octets 15 -Lines 2 +Lines 1 MimeEntityEnd 9209773 MultipartBoundaryBegin 9209773 MultipartBoundaryEnd 9209801 @@ -5940,18 +5940,18 @@ MimeEntityBegin 9209955 MimeEntityHeadersEnd 9211335 MimeMessageHeadersEnd 9211335 Octets 1432 -Lines 21 +Lines 20 MimeEntityEnd 9212767 MimeMessageEnd 9212767 Octets 2812 -Lines 44 +Lines 43 MimeEntityEnd 9212767 MultipartEndBoundaryBegin 9212767 MultipartEndBoundaryEnd 9212796 MultipartEpilogueBegin 9212796 MultipartEpilogueEnd 9212797 Octets 3188 -Lines 59 +Lines 58 MimeEntityEnd 9212797 MimeMessageEnd 9212797 MboxMarkerBegin 9212798 @@ -5981,7 +5981,7 @@ MultipartEndBoundaryEnd 9219505 MultipartEpilogueBegin 9219505 MultipartEpilogueEnd 9219506 Octets 6011 -Lines 92 +Lines 91 MimeEntityEnd 9219506 MimeMessageEnd 9219506 MboxMarkerBegin 9219507 @@ -6021,7 +6021,7 @@ MultipartEndBoundaryEnd 9235058 MultipartEpilogueBegin 9235058 MultipartEpilogueEnd 9235059 Octets 2813 -Lines 55 +Lines 54 MimeEntityEnd 9235059 MimeMessageEnd 9235059 MboxMarkerBegin 9235060 @@ -6047,7 +6047,7 @@ MultipartBoundaryEnd 9237745 MimeEntityBegin 9237745 MimeEntityHeadersEnd 9237789 Octets 588 -Lines 16 +Lines 15 MimeEntityEnd 9238377 MultipartEndBoundaryBegin 9238377 MultipartEndBoundaryEnd 9238420 @@ -6070,7 +6070,7 @@ MultipartBoundaryEnd 9240033 MimeEntityBegin 9240033 MimeEntityHeadersEnd 9240077 Octets 101 -Lines 7 +Lines 6 MimeEntityEnd 9240178 MultipartBoundaryBegin 9240178 MultipartBoundaryEnd 9240220 @@ -6083,7 +6083,7 @@ MultipartBoundaryEnd 9240638 MimeEntityBegin 9240638 MimeEntityHeadersEnd 9240745 Octets 91 -Lines 5 +Lines 4 MimeEntityEnd 9240836 MultipartBoundaryBegin 9240836 MultipartBoundaryEnd 9240876 @@ -6094,18 +6094,18 @@ MimeEntityBegin 9240969 MimeEntityHeadersEnd 9242136 MimeMessageHeadersEnd 9242136 Octets 205 -Lines 6 +Lines 5 MimeEntityEnd 9242341 MimeMessageEnd 9242341 Octets 1372 -Lines 35 +Lines 34 MimeEntityEnd 9242341 MultipartBoundaryBegin 9242341 MultipartBoundaryEnd 9242381 MimeEntityBegin 9242381 MimeEntityHeadersEnd 9242547 Octets 479 -Lines 12 +Lines 11 MimeEntityEnd 9243026 MultipartEndBoundaryBegin 9243026 MultipartEndBoundaryEnd 9243067 @@ -6126,7 +6126,7 @@ MultipartEndBoundaryEnd 9248587 MultipartEpilogueBegin 9248587 MultipartEpilogueEnd 9248589 Octets 8813 -Lines 170 +Lines 169 MimeEntityEnd 9248589 MimeMessageEnd 9248589 MboxMarkerBegin 9248590 @@ -6136,7 +6136,7 @@ MimeEntityBegin 9248622 MimeEntityHeadersEnd 9249837 MimeMessageHeadersEnd 9249837 Octets 2882 -Lines 39 +Lines 38 MimeEntityEnd 9252719 MimeMessageEnd 9252719 MboxMarkerBegin 9252720 @@ -6146,7 +6146,7 @@ MimeEntityBegin 9252752 MimeEntityHeadersEnd 9253910 MimeMessageHeadersEnd 9253910 Octets 2122 -Lines 31 +Lines 30 MimeEntityEnd 9256032 MimeMessageEnd 9256032 MboxMarkerBegin 9256033 @@ -6162,7 +6162,7 @@ MultipartBoundaryEnd 9257176 MimeEntityBegin 9257176 MimeEntityHeadersEnd 9257240 Octets 0 -Lines 1 +Lines 0 MimeEntityEnd 9257240 MultipartBoundaryBegin 9257240 MultipartBoundaryEnd 9257273 @@ -6176,7 +6176,7 @@ MultipartEndBoundaryEnd 9260099 MultipartEpilogueBegin 9260099 MultipartEpilogueEnd 9260100 Octets 2957 -Lines 54 +Lines 53 MimeEntityEnd 9260100 MimeMessageEnd 9260100 MboxMarkerBegin 9260101 @@ -6206,14 +6206,14 @@ MultipartBoundaryEnd 9262710 MimeEntityBegin 9262710 MimeEntityHeadersEnd 9262807 Octets 1200 -Lines 17 +Lines 16 MimeEntityEnd 9264007 MultipartEndBoundaryBegin 9264007 MultipartEndBoundaryEnd 9264049 MultipartEpilogueBegin 9264049 MultipartEpilogueEnd 9264050 Octets 2880 -Lines 73 +Lines 72 MimeEntityEnd 9264050 MimeMessageEnd 9264050 MboxMarkerBegin 9264051 @@ -6229,7 +6229,7 @@ MultipartBoundaryEnd 9265201 MimeEntityBegin 9265201 MimeEntityHeadersEnd 9265271 Octets 152 -Lines 8 +Lines 7 MimeEntityEnd 9265423 MultipartBoundaryBegin 9265423 MultipartBoundaryEnd 9265466 @@ -6243,7 +6243,7 @@ MultipartEndBoundaryEnd 9269685 MultipartEpilogueBegin 9269685 MultipartEpilogueEnd 9269686 Octets 4528 -Lines 76 +Lines 75 MimeEntityEnd 9269686 MimeMessageEnd 9269686 MboxMarkerBegin 9269687 @@ -6289,21 +6289,21 @@ MultipartBoundaryEnd 9276040 MimeEntityBegin 9276040 MimeEntityHeadersEnd 9276118 Octets 72 -Lines 6 +Lines 5 MimeEntityEnd 9276190 MultipartBoundaryBegin 9276190 MultipartBoundaryEnd 9276231 MimeEntityBegin 9276231 MimeEntityHeadersEnd 9276326 Octets 3559 -Lines 48 +Lines 47 MimeEntityEnd 9279885 MultipartEndBoundaryBegin 9279885 MultipartEndBoundaryEnd 9279927 MultipartEpilogueBegin 9279927 MultipartEpilogueEnd 9279928 Octets 4065 -Lines 67 +Lines 66 MimeEntityEnd 9279928 MimeMessageEnd 9279928 MboxMarkerBegin 9279929 @@ -6349,7 +6349,7 @@ MultipartBoundaryEnd 9286412 MimeEntityBegin 9286412 MimeEntityHeadersEnd 9286451 Octets 188 -Lines 7 +Lines 6 MimeEntityEnd 9286639 MultipartBoundaryBegin 9286639 MultipartBoundaryEnd 9286664 @@ -6371,7 +6371,7 @@ MultipartEndBoundaryEnd 9287537 MultipartEpilogueBegin 9287537 MultipartEpilogueEnd 9287538 Octets 1263 -Lines 35 +Lines 34 MimeEntityEnd 9287538 MimeMessageEnd 9287538 MboxMarkerBegin 9287539 @@ -6381,7 +6381,7 @@ MimeEntityBegin 9287585 MimeEntityHeadersEnd 9287750 MimeMessageHeadersEnd 9287750 Octets 34494 -Lines 593 +Lines 592 MimeEntityEnd 9322244 MimeMessageEnd 9322244 MboxMarkerBegin 9322245 @@ -6391,7 +6391,7 @@ MimeEntityBegin 9322291 MimeEntityHeadersEnd 9322449 MimeMessageHeadersEnd 9322449 Octets 34494 -Lines 593 +Lines 592 MimeEntityEnd 9356943 MimeMessageEnd 9356943 MboxMarkerBegin 9356944 @@ -6417,21 +6417,21 @@ MultipartBoundaryEnd 9359897 MimeEntityBegin 9359897 MimeEntityHeadersEnd 9359923 Octets 345 -Lines 11 +Lines 10 MimeEntityEnd 9360268 MultipartBoundaryBegin 9360268 MultipartBoundaryEnd 9360308 MimeEntityBegin 9360308 MimeEntityHeadersEnd 9360401 Octets 241569 -Lines 3962 +Lines 3961 MimeEntityEnd 9601970 MultipartEndBoundaryBegin 9601970 MultipartEndBoundaryEnd 9602011 MultipartEpilogueBegin 9602011 MultipartEpilogueEnd 9602012 Octets 242154 -Lines 3983 +Lines 3982 MimeEntityEnd 9602012 MimeMessageEnd 9602012 MboxMarkerBegin 9602013 @@ -6454,7 +6454,7 @@ MultipartEndBoundaryEnd 9681153 MultipartEpilogueBegin 9681153 MultipartEpilogueEnd 9681155 Octets 78540 -Lines 417 +Lines 416 MimeEntityEnd 9681155 MimeMessageEnd 9681155 MboxMarkerBegin 9681156 @@ -6480,7 +6480,7 @@ MultipartBoundaryEnd 9685852 MimeEntityBegin 9685852 MimeEntityHeadersEnd 9685896 Octets 414 -Lines 8 +Lines 7 MimeEntityEnd 9686310 MultipartBoundaryBegin 9686310 MultipartBoundaryEnd 9686351 @@ -6493,56 +6493,56 @@ MultipartBoundaryEnd 9686478 MimeEntityBegin 9686478 MimeEntityHeadersEnd 9686569 Octets 71 -Lines 2 +Lines 1 MimeEntityEnd 9686640 MultipartBoundaryBegin 9686640 MultipartBoundaryEnd 9686683 MimeEntityBegin 9686683 MimeEntityHeadersEnd 9686782 Octets 10697 -Lines 158 +Lines 157 MimeEntityEnd 9697479 MultipartBoundaryBegin 9697479 MultipartBoundaryEnd 9697522 MimeEntityBegin 9697522 MimeEntityHeadersEnd 9697613 Octets 64 -Lines 3 +Lines 2 MimeEntityEnd 9697677 MultipartBoundaryBegin 9697677 MultipartBoundaryEnd 9697720 MimeEntityBegin 9697720 MimeEntityHeadersEnd 9697813 Octets 5903 -Lines 88 +Lines 87 MimeEntityEnd 9703716 MultipartBoundaryBegin 9703716 MultipartBoundaryEnd 9703759 MimeEntityBegin 9703759 MimeEntityHeadersEnd 9703850 Octets 33 -Lines 3 +Lines 2 MimeEntityEnd 9703883 MultipartBoundaryBegin 9703883 MultipartBoundaryEnd 9703926 MimeEntityBegin 9703926 MimeEntityHeadersEnd 9704027 Octets 11646 -Lines 171 +Lines 170 MimeEntityEnd 9715673 MultipartBoundaryBegin 9715673 MultipartBoundaryEnd 9715716 MimeEntityBegin 9715716 MimeEntityHeadersEnd 9715807 Octets 31 -Lines 3 +Lines 2 MimeEntityEnd 9715838 MultipartEndBoundaryBegin 9715838 MultipartEndBoundaryEnd 9715882 MultipartEpilogueBegin 9715882 MultipartEpilogueEnd 9715883 Octets 29447 -Lines 461 +Lines 460 MimeEntityEnd 9715883 MultipartEndBoundaryBegin 9715883 MultipartEndBoundaryEnd 9715925 @@ -6585,21 +6585,21 @@ MultipartBoundaryEnd 9722432 MimeEntityBegin 9722432 MimeEntityHeadersEnd 9722510 Octets 863 -Lines 19 +Lines 18 MimeEntityEnd 9723373 MultipartBoundaryBegin 9723373 MultipartBoundaryEnd 9723418 MimeEntityBegin 9723418 MimeEntityHeadersEnd 9723579 Octets 3641 -Lines 62 +Lines 61 MimeEntityEnd 9727220 MultipartEndBoundaryBegin 9727220 MultipartEndBoundaryEnd 9727266 MultipartEpilogueBegin 9727266 MultipartEpilogueEnd 9727267 Octets 4879 -Lines 93 +Lines 92 MimeEntityEnd 9727267 MimeMessageEnd 9727267 MboxMarkerBegin 9727268 @@ -6615,21 +6615,21 @@ MultipartBoundaryEnd 9727847 MimeEntityBegin 9727847 MimeEntityHeadersEnd 9727874 Octets 963 -Lines 20 +Lines 19 MimeEntityEnd 9728837 MultipartBoundaryBegin 9728837 MultipartBoundaryEnd 9728854 MimeEntityBegin 9728854 MimeEntityHeadersEnd 9728914 Octets 115726 -Lines 1587 +Lines 1586 MimeEntityEnd 9844640 MultipartEndBoundaryBegin 9844640 MultipartEndBoundaryEnd 9844658 MultipartEpilogueBegin 9844658 MultipartEpilogueEnd 9844660 Octets 116830 -Lines 1618 +Lines 1617 MimeEntityEnd 9844660 MimeMessageEnd 9844660 MboxMarkerBegin 9844661 @@ -6645,7 +6645,7 @@ MultipartBoundaryEnd 9845660 MimeEntityBegin 9845660 MimeEntityHeadersEnd 9845704 Octets 8963 -Lines 350 +Lines 349 MimeEntityEnd 9854667 MultipartBoundaryBegin 9854667 MultipartBoundaryEnd 9854708 @@ -6658,7 +6658,7 @@ MultipartBoundaryEnd 9854835 MimeEntityBegin 9854835 MimeEntityHeadersEnd 9854926 Octets 2775 -Lines 70 +Lines 69 MimeEntityEnd 9857701 MultipartBoundaryBegin 9857701 MultipartBoundaryEnd 9857744 @@ -6669,32 +6669,32 @@ MimeEntityBegin 9857940 MimeEntityHeadersEnd 9857967 MimeMessageHeadersEnd 9857967 Octets 2 -Lines 3 +Lines 2 MimeEntityEnd 9857969 MimeMessageEnd 9857969 Octets 29 -Lines 5 +Lines 4 MimeEntityEnd 9857969 MultipartBoundaryBegin 9857969 MultipartBoundaryEnd 9858012 MimeEntityBegin 9858012 MimeEntityHeadersEnd 9858103 Octets 974 -Lines 23 +Lines 22 MimeEntityEnd 9859077 MultipartBoundaryBegin 9859077 MultipartBoundaryEnd 9859120 MimeEntityBegin 9859120 MimeEntityHeadersEnd 9859236 Octets 359 -Lines 16 +Lines 15 MimeEntityEnd 9859595 MultipartBoundaryBegin 9859595 MultipartBoundaryEnd 9859638 MimeEntityBegin 9859638 MimeEntityHeadersEnd 9859729 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 9859739 MultipartBoundaryBegin 9859739 MultipartBoundaryEnd 9859782 @@ -6705,46 +6705,46 @@ MimeEntityBegin 9859967 MimeEntityHeadersEnd 9859994 MimeMessageHeadersEnd 9859994 Octets 1 -Lines 2 +Lines 1 MimeEntityEnd 9859995 MimeMessageEnd 9859995 Octets 28 -Lines 4 +Lines 3 MimeEntityEnd 9859995 MultipartBoundaryBegin 9859995 MultipartBoundaryEnd 9860038 MimeEntityBegin 9860038 MimeEntityHeadersEnd 9860129 Octets 10 -Lines 3 +Lines 2 MimeEntityEnd 9860139 MultipartBoundaryBegin 9860139 MultipartBoundaryEnd 9860182 MimeEntityBegin 9860182 MimeEntityHeadersEnd 9860288 Octets 2983 -Lines 44 +Lines 43 MimeEntityEnd 9863271 MultipartBoundaryBegin 9863271 MultipartBoundaryEnd 9863314 MimeEntityBegin 9863314 MimeEntityHeadersEnd 9863405 Octets 6592 -Lines 261 +Lines 260 MimeEntityEnd 9869997 MultipartEndBoundaryBegin 9869997 MultipartEndBoundaryEnd 9870041 MultipartEpilogueBegin 9870041 MultipartEpilogueEnd 9870042 Octets 15249 -Lines 476 +Lines 475 MimeEntityEnd 9870042 MultipartEndBoundaryBegin 9870042 MultipartEndBoundaryEnd 9870084 MultipartEpilogueBegin 9870084 MultipartEpilogueEnd 9870085 Octets 24620 -Lines 838 +Lines 837 MimeEntityEnd 9870085 MimeMessageEnd 9870085 MboxMarkerBegin 9870086 @@ -6760,28 +6760,28 @@ MultipartBoundaryEnd 9871216 MimeEntityBegin 9871216 MimeEntityHeadersEnd 9871217 Octets 333 -Lines 9 +Lines 8 MimeEntityEnd 9871550 MultipartBoundaryBegin 9871550 MultipartBoundaryEnd 9871561 MimeEntityBegin 9871561 MimeEntityHeadersEnd 9871620 Octets 29979 -Lines 412 +Lines 411 MimeEntityEnd 9901599 MultipartBoundaryBegin 9901599 MultipartBoundaryEnd 9901610 MimeEntityBegin 9901610 MimeEntityHeadersEnd 9901611 Octets 172 -Lines 10 +Lines 9 MimeEntityEnd 9901783 MultipartEndBoundaryBegin 9901783 MultipartEndBoundaryEnd 9901795 MultipartEpilogueBegin 9901795 MultipartEpilogueEnd 9901796 Octets 30590 -Lines 441 +Lines 440 MimeEntityEnd 9901796 MimeMessageEnd 9901796 MboxMarkerBegin 9901797 @@ -6791,7 +6791,7 @@ MimeEntityBegin 9901805 MimeEntityHeadersEnd 9903514 MimeMessageHeadersEnd 9903514 Octets 182799 -Lines 2952 +Lines 2951 MimeEntityEnd 10086313 MimeMessageEnd 10086313 MboxMarkerBegin 10086314 @@ -6828,7 +6828,7 @@ MultipartEndBoundaryEnd 10171316 MultipartEpilogueBegin 10171316 MultipartEpilogueEnd 10171317 Octets 84288 -Lines 456 +Lines 455 MimeEntityEnd 10171317 MimeMessageEnd 10171317 MboxMarkerBegin 10171318 @@ -6872,14 +6872,14 @@ MultipartBoundaryEnd 10205788 MimeEntityBegin 10205788 MimeEntityHeadersEnd 10205789 Octets 30 -Lines 3 +Lines 2 MimeEntityEnd 10205819 MultipartBoundaryBegin 10205819 MultipartBoundaryEnd 10205847 MimeEntityBegin 10205847 MimeEntityHeadersEnd 10205915 Octets 186037 -Lines 1991 +Lines 1990 MimeEntityEnd 10391952 MultipartBoundaryBegin 10391952 MultipartBoundaryEnd 10391980 @@ -6893,7 +6893,7 @@ MultipartEndBoundaryEnd 10392018 MultipartEpilogueBegin 10392018 MultipartEpilogueEnd 10392019 Octets 220026 -Lines 2197 +Lines 2196 MimeEntityEnd 10392019 MimeMessageEnd 10392019 MboxMarkerBegin 10392020 @@ -6919,7 +6919,7 @@ MultipartBoundaryEnd 10468817 MimeEntityBegin 10468817 MimeEntityHeadersEnd 10468818 Octets 1847 -Lines 35 +Lines 34 MimeEntityEnd 10470665 MultipartBoundaryBegin 10470665 MultipartBoundaryEnd 10470724 @@ -6932,42 +6932,42 @@ MultipartBoundaryEnd 10470887 MimeEntityBegin 10470887 MimeEntityHeadersEnd 10470960 Octets 1999 -Lines 30 +Lines 29 MimeEntityEnd 10472959 MultipartBoundaryBegin 10472959 MultipartBoundaryEnd 10473020 MimeEntityBegin 10473020 MimeEntityHeadersEnd 10473079 Octets 7929 -Lines 110 +Lines 109 MimeEntityEnd 10481008 MultipartBoundaryBegin 10481008 MultipartBoundaryEnd 10481069 MimeEntityBegin 10481069 MimeEntityHeadersEnd 10481139 Octets 3 -Lines 3 +Lines 2 MimeEntityEnd 10481142 MultipartBoundaryBegin 10481142 MultipartBoundaryEnd 10481203 MimeEntityBegin 10481203 MimeEntityHeadersEnd 10481296 Octets 41878 -Lines 575 +Lines 574 MimeEntityEnd 10523174 MultipartEndBoundaryBegin 10523174 MultipartEndBoundaryEnd 10523236 MultipartEpilogueBegin 10523236 MultipartEpilogueEnd 10523237 Octets 52410 -Lines 737 +Lines 736 MimeEntityEnd 10523237 MultipartEndBoundaryBegin 10523237 MultipartEndBoundaryEnd 10523297 MultipartEpilogueBegin 10523297 MultipartEpilogueEnd 10523298 Octets 55065 -Lines 788 +Lines 787 MimeEntityEnd 10523298 MimeMessageEnd 10523298 MboxMarkerBegin 10523299 @@ -6993,7 +6993,7 @@ MultipartBoundaryEnd 10529395 MimeEntityBegin 10529395 MimeEntityHeadersEnd 10529396 Octets 368 -Lines 9 +Lines 8 MimeEntityEnd 10529764 MultipartBoundaryBegin 10529764 MultipartBoundaryEnd 10529805 @@ -7006,28 +7006,28 @@ MultipartBoundaryEnd 10529932 MimeEntityBegin 10529932 MimeEntityHeadersEnd 10530002 Octets 89 -Lines 5 +Lines 4 MimeEntityEnd 10530091 MultipartBoundaryBegin 10530091 MultipartBoundaryEnd 10530134 MimeEntityBegin 10530134 MimeEntityHeadersEnd 10530248 Octets 5663 -Lines 84 +Lines 83 MimeEntityEnd 10535911 MultipartBoundaryBegin 10535911 MultipartBoundaryEnd 10535954 MimeEntityBegin 10535954 MimeEntityHeadersEnd 10536024 Octets 203 -Lines 7 +Lines 6 MimeEntityEnd 10536227 MultipartEndBoundaryBegin 10536227 MultipartEndBoundaryEnd 10536271 MultipartEpilogueBegin 10536271 MultipartEpilogueEnd 10536272 Octets 6382 -Lines 111 +Lines 110 MimeEntityEnd 10536272 MultipartEndBoundaryBegin 10536272 MultipartEndBoundaryEnd 10536314 From 6b8b8a86a3acbcf49d855789e6cc616e2d1440dd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 7 Jul 2020 07:51:28 -0400 Subject: [PATCH 656/741] Fixed HeaderListChangedEventArgs comment --- MimeKit/HeaderListChangedEventArgs.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/HeaderListChangedEventArgs.cs b/MimeKit/HeaderListChangedEventArgs.cs index 7da76af394..f0da1ea1f8 100644 --- a/MimeKit/HeaderListChangedEventArgs.cs +++ b/MimeKit/HeaderListChangedEventArgs.cs @@ -1,5 +1,5 @@ // -// HeaderChangedEventArgs.cs +// HeaderListChangedEventArgs.cs // // Author: Jeffrey Stedfast // From ffe4caccb463b12ef7283d2241716a2e2ea8ea2c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 7 Jul 2020 10:42:40 -0400 Subject: [PATCH 657/741] Implemented new approach for reporting stream offsets for mime parts and messages Fix for issue #582 --- MimeKit/AsyncMimeParser.cs | 179 +- MimeKit/MimeEntityBeginEventArgs.cs | 117 + MimeKit/MimeEntityEndEventArgs.cs | 96 + MimeKit/MimeKit.csproj | 4 + MimeKit/MimeKitLite.csproj | 4 + MimeKit/MimeMessageBeginEventArgs.cs | 133 + MimeKit/MimeMessageEndEventArgs.cs | 96 + MimeKit/MimeParser.cs | 392 +- UnitTests/ArgumentExceptionTests.cs | 32 + UnitTests/MimeParserTests.cs | 266 +- .../mbox/content-length.dos-offsets.json | 1254 +++ UnitTests/TestData/mbox/jwz.dos-offsets.json | 8918 +++++++++++++++++ 12 files changed, 11015 insertions(+), 476 deletions(-) create mode 100644 MimeKit/MimeEntityBeginEventArgs.cs create mode 100644 MimeKit/MimeEntityEndEventArgs.cs create mode 100644 MimeKit/MimeMessageBeginEventArgs.cs create mode 100644 MimeKit/MimeMessageEndEventArgs.cs create mode 100644 UnitTests/TestData/mbox/content-length.dos-offsets.json create mode 100644 UnitTests/TestData/mbox/jwz.dos-offsets.json diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 02480652fe..23d0e532c9 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -247,7 +247,7 @@ async Task ScanContentAsync (Stream content, bool trimNewLine return new ScanContentResult (formats, isEmpty); } - async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellationToken) + async Task ConstructMimePartAsync (MimePart part, MimeEntityEndEventArgs args, CancellationToken cancellationToken) { long endOffset, beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; @@ -268,8 +268,9 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation endOffset = beginOffset + content.Length; } - OnMimeContentOctets (part, endOffset - beginOffset); - OnMimeContentLines (part, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset; + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -277,7 +278,7 @@ async Task ConstructMimePartAsync (MimePart part, CancellationToken cancellation content.Dispose (); } - async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, CancellationToken cancellationToken) + async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs args, int depth, CancellationToken cancellationToken) { var beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; @@ -286,8 +287,7 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (await ReadAheadAsync (atleast, 0, cancellationToken).ConfigureAwait (false) <= 0) { - OnMimeContentOctets (rfc822, 0); - OnMimeContentLines (rfc822, 0); + args.EndOffset = beginOffset; boundary = BoundaryType.Eos; return; } @@ -313,8 +313,7 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) { - OnMimeContentOctets (rfc822, 0); - OnMimeContentLines (rfc822, 0); + args.EndOffset = beginOffset; return; } break; @@ -329,41 +328,58 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, int depth, Cancellatio // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, // which likely means that this is not a valid MIME stream? + args.EndOffset = GetOffset (inputIndex); boundary = BoundaryType.Eos; return; } var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); - var type = GetContentType (null); + var messageArgs = new MimeMessageEndEventArgs (message, rfc822) { + MboxMarkerOffset = mboxMarkerOffset, + MboxMarkerLength = mboxMarkerLength, + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; + + OnMimeMessageBegin (messageArgs); if (preHeaderBuffer.Length > 0) { message.MboxMarker = new byte[preHeaderLength]; Buffer.BlockCopy (preHeaderBuffer, 0, message.MboxMarker, 0, preHeaderLength); } + var type = GetContentType (null); var entity = options.CreateEntity (type, headers, true, depth); - message.Body = entity; + var entityArgs = new MimeEntityEndEventArgs (entity) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeMessageBegin (message, headerBlockBegin); - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); - OnMimeMessageHeadersEnd (message, headerBlockEnd); + OnMimeEntityBegin (entityArgs); + + message.Body = entity; if (entity is Multipart) - await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, entityArgs, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, entityArgs, depth + 1, cancellationToken).ConfigureAwait (false); else - await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); rfc822.Message = message; - var endOffset = GetEndOffset (inputIndex); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; + messageArgs.EndOffset = entityArgs.EndOffset; + messageArgs.Octets = entityArgs.Octets; + messageArgs.Lines = entityArgs.Lines; - OnMimeEntityEnd (entity, endOffset); - OnMimeMessageEnd (message, endOffset); - OnMimeContentOctets (rfc822, endOffset - beginOffset); - OnMimeContentLines (rfc822, GetLineCount (beginLineNumber, beginOffset, endOffset)); + OnMimeEntityEnd (entityArgs); + OnMimeMessageEnd (messageArgs); + + var endOffset = GetEndOffset (inputIndex); + args.EndOffset = endOffset; + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); } async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken cancellationToken) @@ -371,10 +387,10 @@ async Task MultipartScanPreambleAsync (Multipart multipart, CancellationToken ca using (var memory = new MemoryStream ()) { long offset = GetOffset (inputIndex); - OnMultipartPreambleBegin (multipart, offset); + //OnMultipartPreambleBegin (multipart, offset); await ScanContentAsync (memory, false, cancellationToken).ConfigureAwait (false); multipart.RawPreamble = memory.ToArray (); - OnMultipartPreambleEnd (multipart, offset + memory.Length); + //OnMultipartPreambleEnd (multipart, offset + memory.Length); } } @@ -383,28 +399,28 @@ async Task MultipartScanEpilogueAsync (Multipart multipart, CancellationToken ca using (var memory = new MemoryStream ()) { long offset = GetOffset (inputIndex); - OnMultipartEpilogueBegin (multipart, offset); + //OnMultipartEpilogueBegin (multipart, offset); var result = await ScanContentAsync (memory, true, cancellationToken).ConfigureAwait (false); multipart.RawEpilogue = result.IsEmpty ? null : memory.ToArray (); - OnMultipartEpilogueEnd (multipart, offset + memory.Length); + //OnMultipartEpilogueEnd (multipart, offset + memory.Length); } } async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, CancellationToken cancellationToken) { - var beginOffset = GetOffset (inputIndex); + //var beginOffset = GetOffset (inputIndex); do { - OnMultipartBoundaryBegin (multipart, beginOffset); + //OnMultipartBoundaryBegin (multipart, beginOffset); // skip over the boundary marker if (!await SkipLineAsync (true, cancellationToken).ConfigureAwait (false)) { - OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + //OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); boundary = BoundaryType.Eos; return; } - OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + //OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); // parse the headers state = MimeParserState.Headers; @@ -416,10 +432,10 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat if (state == MimeParserState.Boundary) { if (headers.Count == 0) { if (boundary == BoundaryType.ImmediateBoundary) { - beginOffset = GetOffset (inputIndex); + //beginOffset = GetOffset (inputIndex); continue; } - break; + return; } // This part has no content, but that will be handled in ConstructMultipartAsync() @@ -431,26 +447,28 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat var type = GetContentType (multipart.ContentType); var entity = options.CreateEntity (type, headers, false, depth); + var entityArgs = new MimeEntityEndEventArgs (entity, multipart) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeEntityBegin (entityArgs); if (entity is Multipart) - await ConstructMultipartAsync ((Multipart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, entityArgs, depth + 1, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - await ConstructMessagePartAsync ((MessagePart) entity, depth + 1, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, entityArgs, depth + 1, cancellationToken).ConfigureAwait (false); else - await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); - var endOffset = GetEndOffset (inputIndex); - OnMimeEntityEnd (entity, endOffset); - beginOffset = endOffset; + OnMimeEntityEnd (entityArgs); + //beginOffset = GetEndOffset (inputIndex); multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); } - async Task ConstructMultipartAsync (Multipart multipart, int depth, CancellationToken cancellationToken) + async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs args, int depth, CancellationToken cancellationToken) { var beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; @@ -465,9 +483,9 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: this will scan all content into the preamble... await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); - endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset = GetEndOffset (inputIndex); + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } @@ -478,26 +496,26 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation await MultipartScanSubpartsAsync (multipart, depth, cancellationToken).ConfigureAwait (false); if (boundary == BoundaryType.ImmediateEndBoundary) { - OnMultipartEndBoundaryBegin (multipart, GetEndOffset (inputIndex)); + //OnMultipartEndBoundaryBegin (multipart, GetEndOffset (inputIndex)); // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; await SkipLineAsync (false, cancellationToken).ConfigureAwait (false); PopBoundary (); - OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); + //OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); - endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset = GetEndOffset (inputIndex); + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } - endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset = GetEndOffset (inputIndex); + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); multipart.WriteEndBoundary = false; @@ -582,24 +600,27 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. var entity = options.CreateEntity (type, headers, false, 0); + var entityArgs = new MimeEntityEndEventArgs (entity) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeEntityBegin (entityArgs); if (entity is Multipart) - await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, entityArgs, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, entityArgs, 0, cancellationToken).ConfigureAwait (false); else - await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); - - OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); + await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else state = MimeParserState.Eos; + OnMimeEntityEnd (entityArgs); + return entity; } @@ -645,6 +666,14 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation throw new FormatException ("Failed to parse message headers."); var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); + var messageArgs = new MimeMessageEndEventArgs (message) { + MboxMarkerOffset = mboxMarkerOffset, + MboxMarkerLength = mboxMarkerLength, + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; + + OnMimeMessageBegin (messageArgs); if (format == MimeFormat.Mbox && options.RespectContentLength) { contentEnd = 0; @@ -654,12 +683,12 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation continue; var value = headers[i].RawValue; - int length, index = 0; + int index = 0; if (!ParseUtils.SkipWhiteSpace (value, ref index, value.Length)) continue; - if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out length)) + if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out int length)) continue; contentEnd = GetOffset (inputIndex) + length; @@ -669,23 +698,26 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation var type = GetContentType (null); var entity = options.CreateEntity (type, headers, true, 0); - message.Body = entity; + var entityArgs = new MimeEntityEndEventArgs (entity) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeMessageBegin (message, headerBlockBegin); - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); - OnMimeMessageHeadersEnd (message, headerBlockEnd); + OnMimeEntityBegin (entityArgs); + + message.Body = entity; if (entity is Multipart) - await ConstructMultipartAsync ((Multipart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMultipartAsync ((Multipart) entity, entityArgs, 0, cancellationToken).ConfigureAwait (false); else if (entity is MessagePart) - await ConstructMessagePartAsync ((MessagePart) entity, 0, cancellationToken).ConfigureAwait (false); + await ConstructMessagePartAsync ((MessagePart) entity, entityArgs, 0, cancellationToken).ConfigureAwait (false); else - await ConstructMimePartAsync ((MimePart) entity, cancellationToken).ConfigureAwait (false); + await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); - var endOffset = GetEndOffset (inputIndex); - OnMimeEntityEnd (entity, endOffset); - OnMimeMessageEnd (message, endOffset); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; + messageArgs.EndOffset = entityArgs.EndOffset; + messageArgs.Octets = entityArgs.Octets; + messageArgs.Lines = entityArgs.Lines; if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) @@ -696,6 +728,9 @@ async Task ConstructMultipartAsync (Multipart multipart, int depth, Cancellation state = MimeParserState.Eos; } + OnMimeEntityEnd (entityArgs); + OnMimeMessageEnd (messageArgs); + return message; } } diff --git a/MimeKit/MimeEntityBeginEventArgs.cs b/MimeKit/MimeEntityBeginEventArgs.cs new file mode 100644 index 0000000000..e8dbc0c4cb --- /dev/null +++ b/MimeKit/MimeEntityBeginEventArgs.cs @@ -0,0 +1,117 @@ +// +// MimeEntityBeginEventArgs.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +namespace MimeKit { + /// + /// Event args emitted by the when it begins parsing a . + /// + /// + /// Event args emitted by the when it begins parsing a . + /// + public class MimeEntityBeginEventArgs : EventArgs + { + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The entity that is being parsed. + /// + /// is null. + /// + public MimeEntityBeginEventArgs (MimeEntity entity) + { + if (entity == null) + throw new ArgumentNullException (nameof (entity)); + + Entity = entity; + } + + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The entity that is being parsed. + /// The parent multipart. + /// + /// is null. + /// -or- + /// is null. + /// + public MimeEntityBeginEventArgs (MimeEntity entity, Multipart parent) + { + if (entity == null) + throw new ArgumentNullException (nameof (entity)); + + if (parent == null) + throw new ArgumentNullException (nameof (parent)); + + Entity = entity; + Parent = parent; + } + + /// + /// Get the MIME entity. + /// + /// + /// Gets the MIME entity. + /// + /// The MIME entity. + public MimeEntity Entity { get; } + + /// + /// Get the parent if this entity is a child. + /// + /// + /// Gets the parent if this entity is a child. + /// + /// The parent . + public Multipart Parent { get; } + + /// + /// Get or set the stream offset that marks the beginning of the entity. + /// + /// + /// Gets or sets the stream offset that marks the beginning of the entity. + /// + /// The stream offset. + public long BeginOffset { get; set; } + + /// + /// Get or set the stream offset that marks the end of the entity's headers. + /// + /// + /// Gets or sets the stream offset that marks the end of the entity's headers. + /// + /// The stream offset. + public long HeadersEndOffset { get; set; } + } +} diff --git a/MimeKit/MimeEntityEndEventArgs.cs b/MimeKit/MimeEntityEndEventArgs.cs new file mode 100644 index 0000000000..ca12705732 --- /dev/null +++ b/MimeKit/MimeEntityEndEventArgs.cs @@ -0,0 +1,96 @@ +// +// MimeEntityEndEventArgs.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +namespace MimeKit { + /// + /// Event args emitted by the when a is parsed. + /// + /// + /// Event args emitted by the when a is parsed. + /// + public class MimeEntityEndEventArgs : MimeEntityBeginEventArgs + { + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The entity that was parsed. + /// + /// is null. + /// + public MimeEntityEndEventArgs (MimeEntity entity) : base (entity) + { + } + + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The entity that was parsed. + /// The parent multipart. + /// + /// is null. + /// -or- + /// is null. + /// + public MimeEntityEndEventArgs (MimeEntity entity, Multipart parent) : base (entity, parent) + { + } + + /// + /// Get or set the stream offset that marks the end of the entity. + /// + /// + /// Gets or sets the stream offset that marks the end of the entity. + /// + /// The stream offset. + public long EndOffset { get; set; } + + /// + /// Get or set the content length of the entity as measured in octets. + /// + /// + /// Gets or sets the content length of the entity as measured in octets. + /// + /// The length of the content in bytes. + public long Octets { get; set; } + + /// + /// Get or set the content length of the entity as measured in lines. + /// + /// + /// Get or set the content length of the entity as measured in lines. + /// + /// The length of the content in lines. + public int Lines { get; set; } + } +} diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index c7488f599e..dd2a4dd25b 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -267,10 +267,14 @@ + + + + diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index a5b2ec21e9..cfc938ae83 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -183,10 +183,14 @@ + + + + diff --git a/MimeKit/MimeMessageBeginEventArgs.cs b/MimeKit/MimeMessageBeginEventArgs.cs new file mode 100644 index 0000000000..5577b36424 --- /dev/null +++ b/MimeKit/MimeMessageBeginEventArgs.cs @@ -0,0 +1,133 @@ +// +// MimeMessageBeginEventArgs.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +namespace MimeKit { + /// + /// Event args emitted by the when it begins parsing a . + /// + /// + /// Event args emitted by the when it begins parsing a . + /// + public class MimeMessageBeginEventArgs : EventArgs + { + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The message that was parsed. + /// + /// is null. + /// + public MimeMessageBeginEventArgs (MimeMessage message) + { + if (message == null) + throw new ArgumentNullException (nameof (message)); + + Message = message; + } + + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The message that was parsed. + /// The parent message part. + /// + /// is null. + /// -or- + /// is null. + /// + public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) + { + if (message == null) + throw new ArgumentNullException (nameof (message)); + + if (parent == null) + throw new ArgumentNullException (nameof (parent)); + + Message = message; + Parent = parent; + } + + /// + /// Get the message that was parsed. + /// + /// + /// Gets the message that was parsed. + /// + /// The message. + public MimeMessage Message { get; } + + /// + /// Get the parent if this message is an attachment. + /// + /// + /// Gets the parent if this message is an attachment. + /// + /// The parent . + public MessagePart Parent { get; set; } + + /// + /// Get or set the stream offset that marks beginning of the mbox marker. + /// + /// + /// Gets or sets the stream offset that marks the beginning of the mbox marker. + /// + public long MboxMarkerOffset { get; set; } + + /// + /// Get or set the stream offset that marks beginning of the mbox marker. + /// + /// + /// Gets or sets the stream offset that marks the beginning of the mbox marker. + /// + public long MboxMarkerLength { get; set; } + + /// + /// Get or set the stream offset that marks the beginning of the message. + /// + /// + /// Gets or sets the stream offset that marks the beginning of the message. + /// + /// The stream offset. + public long BeginOffset { get; set; } + + /// + /// Get or set the stream offset that marks the end of the message headers. + /// + /// + /// Gets or sets the stream offset that marks the end of the message headers. + /// + /// The stream offset. + public long HeadersEndOffset { get; set; } + } +} diff --git a/MimeKit/MimeMessageEndEventArgs.cs b/MimeKit/MimeMessageEndEventArgs.cs new file mode 100644 index 0000000000..af27ffa49f --- /dev/null +++ b/MimeKit/MimeMessageEndEventArgs.cs @@ -0,0 +1,96 @@ +// +// MimeMessageEndEventArgs.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; + +namespace MimeKit { + /// + /// Event args emitted by the when a is parsed. + /// + /// + /// Event args emitted by the when a is parsed. + /// + public class MimeMessageEndEventArgs : MimeMessageBeginEventArgs + { + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The message that was parsed. + /// + /// is null. + /// + public MimeMessageEndEventArgs (MimeMessage message) : base (message) + { + } + + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new . + /// + /// The message that was parsed. + /// The parent message part. + /// + /// is null. + /// -or- + /// is null. + /// + public MimeMessageEndEventArgs (MimeMessage message, MessagePart parent) : base (message, parent) + { + } + + /// + /// Get or set the stream offset that marks the end of the entity. + /// + /// + /// Gets or sets the stream offset that marks the end of the entity. + /// + /// The stream offset. + public long EndOffset { get; set; } + + /// + /// Get or set the content length of the entity as measured in octets. + /// + /// + /// Gets or sets the content length of the entity as measured in octets. + /// + /// The length of the content in bytes. + public long Octets { get; set; } + + /// + /// Get or set the content length of the entity as measured in lines. + /// + /// + /// Get or set the content length of the entity as measured in lines. + /// + /// The length of the content in lines. + public int Lines { get; set; } + } +} diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 0b2fd5067b..21b7661648 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -432,216 +432,46 @@ public void SetStream (Stream stream, bool persistent = false) } /// - /// Invoked when an mbox marker is found. + /// Invoked when the parser begins parsing a . /// /// - /// Invoked when an mbox marker is found, providing subclasses with the ability to track stream offsets. + /// Invoked when the parser begins parsing a . /// - /// The stream offset at which the mbox marker begins. - protected virtual void OnMboxMarkerBegin (long offset) + /// The parsed state. + protected virtual void OnMimeMessageBegin (MimeMessageBeginEventArgs args) { } /// - /// Invoked when the end of an mbox marker is found. + /// Invoked when the parser has completed parsing a . /// /// - /// Invoked when the end of an mbox marker is found, providing subclasses with the ability to track stream offsets. + /// Invoked when the parser has completed parsing a . /// - /// The stream offset at which the mbox marker ends. - protected virtual void OnMboxMarkerEnd (long offset) + /// The parsed state. + protected virtual void OnMimeMessageEnd (MimeMessageEndEventArgs args) { } /// - /// Invoked when the beginning of a MIME message is found. + /// Invoked when the parser begins parsing a . /// /// - /// Invoked when the beginning of a MIME message is found, providing subclasses with the ability to track stream offsets. + /// Invoked when the parser begins parsing a . /// - /// The MIME message. - /// The stream offset at which the MIME message begins. - protected virtual void OnMimeMessageBegin (MimeMessage message, long offset) + /// The parsed state. + protected virtual void OnMimeEntityBegin (MimeEntityBeginEventArgs args) { } /// - /// Invoked when the end of a MIME message is found. + /// Invoked when the parser has completed parsing a . /// /// - /// Invoked when the end of a MIME message is found, providing subclasses with the ability to track stream offsets. + /// Invoked when the parser has completed parsing a . /// - /// The MIME message. - /// The stream offset at which the MIME message ends. - protected virtual void OnMimeMessageEnd (MimeMessage message, long offset) - { - } - - /// - /// Invoked when the end of the message headers is found. - /// - /// - /// Invoked when the end of the message headers is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME message. - /// The stream offset at which the MIME message headers end. - protected virtual void OnMimeMessageHeadersEnd (MimeMessage message, long offset) - { - } - - /// - /// Invoked when the beginning of a MIME entity is found. - /// - /// - /// Invoked when the beginning of a MIME entity is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME entity. - /// The stream offset at which the MIME entity begins. - protected virtual void OnMimeEntityBegin (MimeEntity entity, long offset) - { - } - - /// - /// Invoked when the end of a MIME entity is found. - /// - /// - /// Invoked when the end of a MIME entity is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME entity. - /// The stream offset at which the MIME entity ends. - protected virtual void OnMimeEntityEnd (MimeEntity entity, long offset) - { - } - - /// - /// Invoked when the end of MIME entity headers is found. - /// - /// - /// Invoked when the end of MIME entity headers is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME entity. - /// The stream offset at which the MIME entity ends. - protected virtual void OnMimeEntityHeadersEnd (MimeEntity entity, long offset) - { - } - - /// - /// Invoked when a multipart boundary is found. - /// - /// - /// Invoked when a multipart boundary is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the multipart boundary begins. - protected virtual void OnMultipartBoundaryBegin (Multipart multipart, long offset) - { - } - - /// - /// Invoked when the end of a multipart boundary is found. - /// - /// - /// Invoked when the end of a multipart boundary is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the multipart boundary ends. - protected virtual void OnMultipartBoundaryEnd (Multipart multipart, long offset) - { - } - - /// - /// Invoked when a multipart end-boundary is found. - /// - /// - /// Invoked when a multipart end-boundary is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the multipart end-boundary begins. - protected virtual void OnMultipartEndBoundaryBegin (Multipart multipart, long offset) - { - } - - /// - /// Invoked when the end of a multipart end-boundary is found. - /// - /// - /// Invoked when the end of a multipart end-boundary is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the multipart end-boundary ends. - protected virtual void OnMultipartEndBoundaryEnd (Multipart multipart, long offset) - { - } - - /// - /// Invoked when a multipart preamble is found. - /// - /// - /// Invoked when a multipart preamble is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the preamble begins. - protected virtual void OnMultipartPreambleBegin (Multipart multipart, long offset) - { - } - - /// - /// Invoked when the end of a multipart preamble is found. - /// - /// - /// Invoked when the end of a multipart preamble is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the preamble ends. - protected virtual void OnMultipartPreambleEnd (Multipart multipart, long offset) - { - } - - /// - /// Invoked when a multipart epilogue is found. - /// - /// - /// Invoked when a multipart epilogue is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the epilogue begins. - protected virtual void OnMultipartEpilogueBegin (Multipart multipart, long offset) - { - } - - /// - /// Invoked when the end of a multipart epilogue is found. - /// - /// - /// Invoked when the end of a multipart epilogue is found, providing subclasses with the ability to track stream offsets. - /// - /// The MIME multipart. - /// The stream offset at which the epilogue ends. - protected virtual void OnMultipartEpilogueEnd (Multipart multipart, long offset) - { - } - - /// - /// Invoked for all MIME entities once the octet count for the content has been calculated. - /// - /// - /// Invoked for all MIME entities once the octet count for the content has been calculated. - /// - /// The MIME entity. - /// The number of octets contained in the content of the entity. - protected virtual void OnMimeContentOctets (MimeEntity entity, long octets) - { - } - - /// - /// Invoked for all MIME entities once the line count for the content has been calculated. - /// - /// - /// Invoked for all MIME entities once the line count for the content has been calculated. - /// - /// The MIME entity. - /// The number of lines contained in the content of the entity. - protected virtual void OnMimeContentLines (MimeEntity entity, int lines) + /// The parsed state. + protected virtual void OnMimeEntityEnd (MimeEntityEndEventArgs args) { } @@ -864,9 +694,6 @@ unsafe bool StepMboxMarker (byte *inbuf, ref int left) mboxMarkerOffset = GetOffset (startIndex); mboxMarkerLength = markerLength; - OnMboxMarkerBegin (mboxMarkerOffset); - OnMboxMarkerEnd (mboxMarkerOffset + lineLength); - if (mboxMarkerBuffer.Length < mboxMarkerLength) Array.Resize (ref mboxMarkerBuffer, mboxMarkerLength); @@ -1512,7 +1339,7 @@ unsafe ScanContentResult ScanContent (byte* inbuf, Stream content, bool trimNewL return new ScanContentResult (formats, isEmpty); } - unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken cancellationToken) + unsafe void ConstructMimePart (MimePart part, MimeEntityEndEventArgs args, byte* inbuf, CancellationToken cancellationToken) { long endOffset, beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; @@ -1533,8 +1360,9 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can endOffset = beginOffset + content.Length; } - OnMimeContentOctets (part, endOffset - beginOffset); - OnMimeContentLines (part, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset; + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); if (!result.IsEmpty) part.Content = new MimeContent (content, part.ContentTransferEncoding) { NewLineFormat = result.Format }; @@ -1542,7 +1370,7 @@ unsafe void ConstructMimePart (MimePart part, byte* inbuf, CancellationToken can content.Dispose (); } - unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, CancellationToken cancellationToken) + unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs args, byte* inbuf, int depth, CancellationToken cancellationToken) { var beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; @@ -1551,8 +1379,7 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (ReadAhead (atleast, 0, cancellationToken) <= 0) { - OnMimeContentOctets (rfc822, 0); - OnMimeContentLines (rfc822, 0); + args.EndOffset = beginOffset; boundary = BoundaryType.Eos; return; } @@ -1576,8 +1403,7 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) { - OnMimeContentOctets (rfc822, 0); - OnMimeContentLines (rfc822, 0); + args.EndOffset = beginOffset; return; } break; @@ -1590,41 +1416,58 @@ unsafe void ConstructMessagePart (MessagePart rfc822, byte* inbuf, int depth, Ca // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, // which likely means that this is not a valid MIME stream? + args.EndOffset = GetOffset (inputIndex); boundary = BoundaryType.Eos; return; } var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); - var type = GetContentType (null); + var messageArgs = new MimeMessageEndEventArgs (message, rfc822) { + MboxMarkerOffset = mboxMarkerOffset, + MboxMarkerLength = mboxMarkerLength, + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; + + OnMimeMessageBegin (messageArgs); if (preHeaderBuffer.Length > 0) { message.MboxMarker = new byte[preHeaderLength]; Buffer.BlockCopy (preHeaderBuffer, 0, message.MboxMarker, 0, preHeaderLength); } + var type = GetContentType (null); var entity = options.CreateEntity (type, headers, true, depth); - message.Body = entity; + var entityArgs = new MimeEntityEndEventArgs (entity) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; + + OnMimeEntityBegin (entityArgs); - OnMimeMessageBegin (message, headerBlockBegin); - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); - OnMimeMessageHeadersEnd (message, headerBlockEnd); + message.Body = entity; if (entity is Multipart) - ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); + ConstructMultipart ((Multipart) entity, entityArgs, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) - ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); + ConstructMessagePart ((MessagePart) entity, entityArgs, inbuf, depth + 1, cancellationToken); else - ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); rfc822.Message = message; - var endOffset = GetEndOffset (inputIndex); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; + messageArgs.EndOffset = entityArgs.EndOffset; + messageArgs.Octets = entityArgs.Octets; + messageArgs.Lines = entityArgs.Lines; - OnMimeEntityEnd (entity, endOffset); - OnMimeMessageEnd (message, endOffset); - OnMimeContentOctets (rfc822, endOffset - beginOffset); - OnMimeContentLines (rfc822, GetLineCount (beginLineNumber, beginOffset, endOffset)); + OnMimeEntityEnd (entityArgs); + OnMimeMessageEnd (messageArgs); + + var endOffset = GetEndOffset (inputIndex); + args.EndOffset = endOffset; + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); } unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, CancellationToken cancellationToken) @@ -1632,10 +1475,10 @@ unsafe void MultipartScanPreamble (Multipart multipart, byte* inbuf, Cancellatio using (var memory = new MemoryStream ()) { long offset = GetOffset (inputIndex); - OnMultipartPreambleBegin (multipart, offset); + //OnMultipartPreambleBegin (multipart, offset); ScanContent (inbuf, memory, false, cancellationToken); multipart.RawPreamble = memory.ToArray (); - OnMultipartPreambleEnd (multipart, offset + memory.Length); + //OnMultipartPreambleEnd (multipart, offset + memory.Length); } } @@ -1644,43 +1487,43 @@ unsafe void MultipartScanEpilogue (Multipart multipart, byte* inbuf, Cancellatio using (var memory = new MemoryStream ()) { long offset = GetOffset (inputIndex); - OnMultipartEpilogueBegin (multipart, offset); + //OnMultipartEpilogueBegin (multipart, offset); var result = ScanContent (inbuf, memory, true, cancellationToken); multipart.RawEpilogue = result.IsEmpty ? null : memory.ToArray (); - OnMultipartEpilogueEnd (multipart, offset + memory.Length); + //OnMultipartEpilogueEnd (multipart, offset + memory.Length); } } unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) { - var beginOffset = GetOffset (inputIndex); + //var beginOffset = GetOffset (inputIndex); do { - OnMultipartBoundaryBegin (multipart, beginOffset); + //OnMultipartBoundaryBegin (multipart, beginOffset); // skip over the boundary marker if (!SkipLine (inbuf, true, cancellationToken)) { - OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + //OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); boundary = BoundaryType.Eos; - break; + return; } - OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + //OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); // parse the headers state = MimeParserState.Headers; if (Step (inbuf, cancellationToken) == MimeParserState.Error) { boundary = BoundaryType.Eos; - break; + return; } if (state == MimeParserState.Boundary) { if (headers.Count == 0) { if (boundary == BoundaryType.ImmediateBoundary) { - beginOffset = GetOffset (inputIndex); + //beginOffset = GetOffset (inputIndex); continue; } - break; + return; } // This part has no content, but that will be handled in ConstructMultipart() @@ -1692,21 +1535,23 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, var type = GetContentType (multipart.ContentType); var entity = options.CreateEntity (type, headers, false, depth); + var entityArgs = new MimeEntityEndEventArgs (entity, multipart) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeEntityBegin (entityArgs); if (entity is Multipart) - ConstructMultipart ((Multipart) entity, inbuf, depth + 1, cancellationToken); + ConstructMultipart ((Multipart) entity, entityArgs, inbuf, depth + 1, cancellationToken); else if (entity is MessagePart) - ConstructMessagePart ((MessagePart) entity, inbuf, depth + 1, cancellationToken); + ConstructMessagePart ((MessagePart) entity, entityArgs, inbuf, depth + 1, cancellationToken); else - ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); - var endOffset = GetEndOffset (inputIndex); - OnMimeEntityEnd (entity, endOffset); - beginOffset = endOffset; + OnMimeEntityEnd (entityArgs); + //beginOffset = GetEndOffset (inputIndex); multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); } @@ -1724,7 +1569,7 @@ void PopBoundary () bounds.RemoveAt (0); } - unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, CancellationToken cancellationToken) + unsafe void ConstructMultipart (Multipart multipart, MimeEntityEndEventArgs args, byte* inbuf, int depth, CancellationToken cancellationToken) { var beginOffset = GetOffset (inputIndex); var beginLineNumber = lineNumber; @@ -1739,9 +1584,9 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); - endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset = GetEndOffset (inputIndex); + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } @@ -1752,26 +1597,26 @@ unsafe void ConstructMultipart (Multipart multipart, byte* inbuf, int depth, Can MultipartScanSubparts (multipart, inbuf, depth, cancellationToken); if (boundary == BoundaryType.ImmediateEndBoundary) { - OnMultipartEndBoundaryBegin (multipart, GetEndOffset (inputIndex)); + //OnMultipartEndBoundaryBegin (multipart, GetEndOffset (inputIndex)); // consume the end boundary and read the epilogue (if there is one) multipart.WriteEndBoundary = true; SkipLine (inbuf, false, cancellationToken); PopBoundary (); - OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); + //OnMultipartEndBoundaryEnd (multipart, GetOffset (inputIndex)); MultipartScanEpilogue (multipart, inbuf, cancellationToken); - endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset = GetEndOffset (inputIndex); + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } - endOffset = GetEndOffset (inputIndex); - OnMimeContentOctets (multipart, endOffset - beginOffset); - OnMimeContentLines (multipart, GetLineCount (beginLineNumber, beginOffset, endOffset)); + args.EndOffset = endOffset = GetEndOffset (inputIndex); + args.Octets = endOffset - beginOffset; + args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); multipart.WriteEndBoundary = false; @@ -1844,24 +1689,27 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) // Note: we pass 'false' as the 'toplevel' argument here because // we want the entity to consume all of the headers. var entity = options.CreateEntity (type, headers, false, 0); + var entityArgs = new MimeEntityEndEventArgs (entity) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); + OnMimeEntityBegin (entityArgs); if (entity is Multipart) - ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); + ConstructMultipart ((Multipart) entity, entityArgs, inbuf, 0, cancellationToken); else if (entity is MessagePart) - ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); + ConstructMessagePart ((MessagePart) entity, entityArgs, inbuf, 0, cancellationToken); else - ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); - - OnMimeEntityEnd (entity, GetEndOffset (inputIndex)); + ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else state = MimeParserState.Eos; + OnMimeEntityEnd (entityArgs); + return entity; } @@ -1916,6 +1764,14 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke throw new FormatException ("Failed to parse message headers."); var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); + var messageArgs = new MimeMessageEndEventArgs (message) { + MboxMarkerOffset = mboxMarkerOffset, + MboxMarkerLength = mboxMarkerLength, + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; + + OnMimeMessageBegin (messageArgs); contentEnd = 0; if (format == MimeFormat.Mbox && options.RespectContentLength) { @@ -1924,12 +1780,12 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke continue; var value = headers[i].RawValue; - int length, index = 0; + int index = 0; if (!ParseUtils.SkipWhiteSpace (value, ref index, value.Length)) continue; - if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out length)) + if (!ParseUtils.TryParseInt32 (value, ref index, value.Length, out int length)) continue; contentEnd = GetOffset (inputIndex) + length; @@ -1939,23 +1795,26 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var type = GetContentType (null); var entity = options.CreateEntity (type, headers, true, 0); - message.Body = entity; + var entityArgs = new MimeEntityEndEventArgs (entity) { + HeadersEndOffset = headerBlockEnd, + BeginOffset = headerBlockBegin + }; - OnMimeMessageBegin (message, headerBlockBegin); - OnMimeEntityBegin (entity, headerBlockBegin); - OnMimeEntityHeadersEnd (entity, headerBlockEnd); - OnMimeMessageHeadersEnd (message, headerBlockEnd); + OnMimeEntityBegin (entityArgs); - if (entity is Multipart) - ConstructMultipart ((Multipart) entity, inbuf, 0, cancellationToken); - else if (entity is MessagePart) - ConstructMessagePart ((MessagePart) entity, inbuf, 0, cancellationToken); + message.Body = entity; + + if (entity is Multipart multipart) + ConstructMultipart (multipart, entityArgs, inbuf, 0, cancellationToken); + else if (entity is MessagePart rfc822) + ConstructMessagePart (rfc822, entityArgs, inbuf, 0, cancellationToken); else - ConstructMimePart ((MimePart) entity, inbuf, cancellationToken); + ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); - var endOffset = GetEndOffset (inputIndex); - OnMimeEntityEnd (entity, endOffset); - OnMimeMessageEnd (message, endOffset); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; + messageArgs.EndOffset = entityArgs.EndOffset; + messageArgs.Octets = entityArgs.Octets; + messageArgs.Lines = entityArgs.Lines; if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) @@ -1966,6 +1825,9 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke state = MimeParserState.Eos; } + OnMimeEntityEnd (entityArgs); + OnMimeMessageEnd (messageArgs); + return message; } diff --git a/UnitTests/ArgumentExceptionTests.cs b/UnitTests/ArgumentExceptionTests.cs index 849e55ef5c..a09ae6b269 100644 --- a/UnitTests/ArgumentExceptionTests.cs +++ b/UnitTests/ArgumentExceptionTests.cs @@ -426,5 +426,37 @@ public void TestHeaderListCollectionArguments () Assert.Throws (() => collection[0] = null); Assert.DoesNotThrow (() => collection[0] = new HeaderList ()); } + + [Test] + public void TestMimeMessageBeginEventArgs () + { + Assert.Throws (() => new MimeMessageBeginEventArgs (null)); + Assert.Throws (() => new MimeMessageBeginEventArgs (null, new MessagePart ())); + Assert.Throws (() => new MimeMessageBeginEventArgs (new MimeMessage (), null)); + } + + [Test] + public void TestMimeMessageEndEventArgs () + { + Assert.Throws (() => new MimeMessageEndEventArgs (null)); + Assert.Throws (() => new MimeMessageEndEventArgs (null, new MessagePart ())); + Assert.Throws (() => new MimeMessageEndEventArgs (new MimeMessage (), null)); + } + + [Test] + public void TestMimeEntityBeginEventArgs () + { + Assert.Throws (() => new MimeEntityBeginEventArgs (null)); + Assert.Throws (() => new MimeEntityBeginEventArgs (null, new Multipart ())); + Assert.Throws (() => new MimeEntityBeginEventArgs (new MimePart (), null)); + } + + [Test] + public void TestMimeEntityEndEventArgs () + { + Assert.Throws (() => new MimeEntityEndEventArgs (null)); + Assert.Throws (() => new MimeEntityEndEventArgs (null, new Multipart ())); + Assert.Throws (() => new MimeEntityEndEventArgs (new MimePart (), null)); + } } } diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index ff3363aa44..ecefebda26 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -35,6 +35,8 @@ using NUnit.Framework; +using Newtonsoft.Json; + using MimeKit; using MimeKit.IO; using MimeKit.Utils; @@ -591,65 +593,72 @@ static NewLineFormat DetectNewLineFormat (string fileName) return NewLineFormat.Dos; } - enum MimeParserOffsetLocation + class MimeOffsets { - MboxMarkerBegin, - MboxMarkerEnd, - MimeMessageBegin, - MimeMessageHeadersEnd, - MimeMessageEnd, - MimeEntityBegin, - MimeEntityHeadersEnd, - MimeEntityEnd, - MultipartBoundaryBegin, - MultipartBoundaryEnd, - MultipartEndBoundaryBegin, - MultipartEndBoundaryEnd, - MultipartPreambleBegin, - MultipartPreambleEnd, - MultipartEpilogueBegin, - MultipartEpilogueEnd, - - // These last 2 aren't really offsets, but we're recording them anyway to test them. - Octets, - Lines - } + [JsonProperty ("mimeType", NullValueHandling = NullValueHandling.Ignore)] + public string MimeType { get; set; } - class MimeParserOffset - { - public readonly MimeParserOffsetLocation Location; - public readonly long Offset; + [JsonProperty ("mboxMarkerBegin", NullValueHandling = NullValueHandling.Ignore)] + public long? MboxMarkerBegin { get; set; } - public MimeParserOffset (MimeParserOffsetLocation location, long offset) - { - Location = location; - Offset = offset; - } - } + [JsonProperty ("mboxMarkerLength", NullValueHandling = NullValueHandling.Ignore)] + public long? MboxMarkerLength { get; set; } - static readonly char[] Space = new char[] { ' ' }; + [JsonProperty ("begin")] + public long Begin { get; set; } - static IEnumerable EnumerateMimeParserOffsets (string fileName) - { - using (var reader = File.OpenText (fileName)) { - string line; + [JsonProperty ("headersEnd")] + public long HeadersEnd { get; set; } - while ((line = reader.ReadLine ()) != null) { - var values = line.Split (Space, 2, StringSplitOptions.RemoveEmptyEntries); - MimeParserOffsetLocation location; - long offset; + [JsonProperty ("message", NullValueHandling = NullValueHandling.Ignore)] + public MimeOffsets Message { get; set; } - if (!Enum.TryParse (values[0], out location) || !long.TryParse (values[1], NumberStyles.None, CultureInfo.InvariantCulture, out offset)) - continue; + [JsonProperty ("body", NullValueHandling = NullValueHandling.Ignore)] + public MimeOffsets Body { get; set; } - yield return new MimeParserOffset (location, offset); - } + [JsonProperty ("children", NullValueHandling = NullValueHandling.Ignore)] + public List Children { get; set; } + + [JsonProperty ("end")] + public long End { get; set; } + + [JsonProperty ("octets")] + public long Octets { get; set; } + + [JsonProperty ("lines")] + public int Lines { get; set; } + } + + static void AssertMimeOffsets (MimeOffsets expected, MimeOffsets actual, int message, string partSpecifier) + { + Assert.AreEqual (expected.MimeType, actual.MimeType, $"mime-type differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.MboxMarkerBegin, actual.MboxMarkerBegin, $"mbox marker begin offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.MboxMarkerLength, actual.MboxMarkerLength, $"mbox marker length differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.Begin, actual.Begin, $"begin offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.HeadersEnd, actual.HeadersEnd, $"headers end offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.End, actual.End, $"end offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.Octets, actual.Octets, $"octets differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.Lines, actual.Lines, $"lines differs for message #{message}{partSpecifier}"); + + if (expected.Message != null) { + Assert.NotNull (actual.Message, $"message content is null for message #{message}{partSpecifier}"); + AssertMimeOffsets (expected.Message, actual.Message, message, partSpecifier + "/message"); + } else if (expected.Body != null) { + Assert.NotNull (actual.Body, $"body content is null for message #{message}{partSpecifier}"); + AssertMimeOffsets (expected.Body, actual.Body, message, partSpecifier + "/0"); + } else if (expected.Children != null) { + Assert.AreEqual (expected.Children.Count, actual.Children.Count, $"children count differs for message #{message}{partSpecifier}"); + for (int i = 0; i < expected.Children.Count; i++) + AssertMimeOffsets (expected.Children[i], actual.Children[i], message, partSpecifier + $".{i}"); } } class CustomMimeParser : MimeParser { - public readonly List Offsets = new List (); + readonly Dictionary messages = new Dictionary (); + readonly Dictionary entities = new Dictionary (); + public readonly List Offsets = new List (); + MimeOffsets body; public CustomMimeParser (ParserOptions options, Stream stream, MimeFormat format) : base (options, stream, format) { @@ -659,100 +668,75 @@ public CustomMimeParser (Stream stream, MimeFormat format) : base (stream, forma { } - protected override void OnMboxMarkerBegin (long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MboxMarkerBegin, offset)); - } - - protected override void OnMboxMarkerEnd (long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MboxMarkerEnd, offset)); - } - - protected override void OnMimeMessageBegin (MimeMessage message, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeMessageBegin, offset)); - } - - protected override void OnMimeMessageEnd (MimeMessage message, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeMessageEnd, offset)); - } - - protected override void OnMimeMessageHeadersEnd (MimeMessage message, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeMessageHeadersEnd, offset)); - } - - protected override void OnMimeEntityBegin (MimeEntity entity, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityBegin, offset)); - } - - protected override void OnMimeEntityEnd (MimeEntity entity, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityEnd, offset)); - } - - protected override void OnMimeEntityHeadersEnd (MimeEntity entity, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MimeEntityHeadersEnd, offset)); - } - - protected override void OnMultipartBoundaryBegin (Multipart multipart, long offset) + protected override void OnMimeMessageBegin (MimeMessageBeginEventArgs args) { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartBoundaryBegin, offset)); - } + var offsets = new MimeOffsets { + Begin = args.BeginOffset, + }; + + if (args.Parent != null) { + if (entities.TryGetValue (args.Parent, out var parentOffsets)) + parentOffsets.Message = offsets; + else + Console.WriteLine ("oops?"); + } else { + offsets.MboxMarkerBegin = args.MboxMarkerOffset; + offsets.MboxMarkerLength = args.MboxMarkerLength; + Offsets.Add (offsets); + } - protected override void OnMultipartBoundaryEnd (Multipart multipart, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartBoundaryEnd, offset)); + messages.Add (args.Message, offsets); } - protected override void OnMultipartEndBoundaryBegin (Multipart multipart, long offset) + protected override void OnMimeMessageEnd (MimeMessageEndEventArgs args) { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEndBoundaryBegin, offset)); - } + if (messages.TryGetValue (args.Message, out var offsets)) { + offsets.HeadersEnd = args.HeadersEndOffset; + offsets.End = args.EndOffset; + offsets.Octets = args.Octets; + offsets.Lines = args.Lines; + offsets.Body = body; + } else { + Console.WriteLine ("oops?"); + } - protected override void OnMultipartEndBoundaryEnd (Multipart multipart, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEndBoundaryEnd, offset)); + messages.Remove (args.Message); } - protected override void OnMultipartPreambleBegin (Multipart multipart, long offset) + protected override void OnMimeEntityBegin (MimeEntityBeginEventArgs args) { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartPreambleBegin, offset)); - } + var offsets = new MimeOffsets { + MimeType = args.Entity.ContentType.MimeType, + Begin = args.BeginOffset, + }; - protected override void OnMultipartPreambleEnd (Multipart multipart, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartPreambleEnd, offset)); - } + if (args.Parent != null && entities.TryGetValue (args.Parent, out var parentOffsets)) { + if (parentOffsets.Children == null) + parentOffsets.Children = new List (); - protected override void OnMultipartEpilogueBegin (Multipart multipart, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEpilogueBegin, offset)); - } + parentOffsets.Children.Add (offsets); + } - protected override void OnMultipartEpilogueEnd (Multipart multipart, long offset) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.MultipartEpilogueEnd, offset)); + entities.Add (args.Entity, offsets); } - // These last 2 aren't really offsets, but we're recording them anyway to test them. - - protected override void OnMimeContentOctets (MimeEntity entity, long octets) + protected override void OnMimeEntityEnd (MimeEntityEndEventArgs args) { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.Octets, octets)); - } + if (entities.TryGetValue (args.Entity, out var offsets)) { + offsets.HeadersEnd = args.HeadersEndOffset; + offsets.End = args.EndOffset; + offsets.Octets = args.Octets; + offsets.Lines = args.Lines; + body = offsets; + } else { + Console.WriteLine ("oops?"); + } - protected override void OnMimeContentLines (MimeEntity entity, int lines) - { - Offsets.Add (new MimeParserOffset (MimeParserOffsetLocation.Lines, lines)); + entities.Remove (args.Entity); } } - static void AssertMboxResults (string baseName, string actual, Stream output, List offsets, NewLineFormat newLineFormat) + static void AssertMboxResults (string baseName, string actual, Stream output, List offsets, NewLineFormat newLineFormat) { // WORKAROUND: Mono's iso-2022-jp decoder breaks on this input in versions <= 3.2.3 but is fixed in 3.2.4+ string iso2022jp = Encoding.GetEncoding ("iso-2022-jp").GetString (Convert.FromBase64String ("GyRAOjRGI0stGyhK")); @@ -796,19 +780,23 @@ static void AssertMboxResults (string baseName, string actual, Stream output, Li } while (true); } - path = Path.Combine (MboxDataDir, baseName + "." + newLineFormat.ToString ().ToLowerInvariant () + "-offsets.txt"); + var jsonSerializer = JsonSerializer.CreateDefault (); + + path = Path.Combine (MboxDataDir, baseName + "." + newLineFormat.ToString ().ToLowerInvariant () + "-offsets.json"); if (!File.Exists (path)) { - using (var writer = new StreamWriter (path)) { - foreach (var offset in offsets) - writer.WriteLine ($"{offset.Location} {offset.Offset}"); - } + jsonSerializer.Formatting = Formatting.Indented; + + using (var writer = new StreamWriter (path)) + jsonSerializer.Serialize (writer, offsets); } - n = 0; - foreach (var offset in EnumerateMimeParserOffsets (path)) { - Assert.AreEqual (offset.Location, offsets[n].Location, $"Offset Location #{n}"); - Assert.AreEqual (offset.Offset, offsets[n].Offset, $"Stream Offset #{n} ({offset.Location})"); - n++; + using (var reader = new StreamReader (path)) { + var expectedOffsets = (List) jsonSerializer.Deserialize (reader, typeof (List)); + + Assert.AreEqual (expectedOffsets.Count, offsets.Count, "message count"); + + for (int i = 0; i < expectedOffsets.Count; i++) + AssertMimeOffsets (expectedOffsets[i], offsets[i], i, string.Empty); } } @@ -817,8 +805,8 @@ void TestMbox (ParserOptions options, string baseName) var mbox = Path.Combine (MboxDataDir, baseName + ".mbox.txt"); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - List offsets; NewLineFormat newLineFormat; + List offsets; using (var stream = File.OpenRead (mbox)) { var parser = options != null ? new CustomMimeParser (options, stream, MimeFormat.Mbox) : new CustomMimeParser (stream, MimeFormat.Mbox); @@ -857,8 +845,8 @@ async Task TestMboxAsync (ParserOptions options, string baseName) var mbox = Path.Combine (MboxDataDir, baseName + ".mbox.txt"); var output = new MemoryBlockStream (); var builder = new StringBuilder (); - List offsets; NewLineFormat newLineFormat; + List offsets; using (var stream = File.OpenRead (mbox)) { var parser = options != null ? new CustomMimeParser (options, stream, MimeFormat.Mbox) : new CustomMimeParser (stream, MimeFormat.Mbox); @@ -1191,7 +1179,7 @@ public void TestLineCountSingleLine () var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + var lines = parser.Offsets[0].Body.Lines; Assert.AreEqual (1, lines, "Line count"); } @@ -1214,7 +1202,7 @@ This is a single line of text var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + var lines = parser.Offsets[0].Body.Lines; Assert.AreEqual (1, lines, "Line count"); } @@ -1246,7 +1234,7 @@ This is a single line of text var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + var lines = parser.Offsets[0].Body.Children[0].Lines; Assert.AreEqual (1, lines, "Line count"); } @@ -1279,7 +1267,7 @@ This is a single line of text followed by a blank line var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + var lines = parser.Offsets[0].Body.Children[0].Lines; Assert.AreEqual (1, lines, "Line count"); } @@ -1294,7 +1282,7 @@ public void TestLineCountNonTerminatedSingleHeader () var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + var lines = parser.Offsets[0].Lines; Assert.AreEqual (0, lines, "Line count"); } @@ -1309,7 +1297,7 @@ public void TestLineCountProperlyTerminatedSingleHeader () var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets.Where (x => x.Location == MimeParserOffsetLocation.Lines).Select (x => x.Offset).FirstOrDefault (); + var lines = parser.Offsets[0].Lines; Assert.AreEqual (0, lines, "Line count"); } diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.json b/UnitTests/TestData/mbox/content-length.dos-offsets.json new file mode 100644 index 0000000000..2a35cc6012 --- /dev/null +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.json @@ -0,0 +1,1254 @@ +[ + { + "mboxMarkerBegin": 0, + "mboxMarkerLength": 7, + "begin": 9, + "headersEnd": 675, + "body": { + "mimeType": "multipart/mixed", + "begin": 9, + "headersEnd": 675, + "children": [ + { + "mimeType": "text/plain", + "begin": 725, + "headersEnd": 753, + "end": 831, + "octets": 78, + "lines": 5 + }, + { + "mimeType": "message/rfc822", + "begin": 883, + "headersEnd": 948, + "message": { + "begin": 948, + "headersEnd": 1747, + "body": { + "mimeType": "text/plain", + "begin": 948, + "headersEnd": 1747, + "end": 1887, + "octets": 140, + "lines": 4 + }, + "end": 1887, + "octets": 140, + "lines": 4 + }, + "end": 1887, + "octets": 939, + "lines": 21 + } + ], + "end": 1939, + "octets": 1264, + "lines": 34 + }, + "end": 1939, + "octets": 1264, + "lines": 34 + }, + { + "mboxMarkerBegin": 1941, + "mboxMarkerLength": 7, + "begin": 1950, + "headersEnd": 2430, + "body": { + "mimeType": "multipart/mixed", + "begin": 1950, + "headersEnd": 2430, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 2506, + "headersEnd": 2655, + "message": { + "begin": 2655, + "headersEnd": 3095, + "body": { + "mimeType": "text/plain", + "begin": 2655, + "headersEnd": 3095, + "end": 3134, + "octets": 39, + "lines": 2 + }, + "end": 3134, + "octets": 39, + "lines": 2 + }, + "end": 3134, + "octets": 479, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 3164, + "headersEnd": 3291, + "end": 3755, + "octets": 464, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 3785, + "headersEnd": 3912, + "end": 4404, + "octets": 492, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4434, + "headersEnd": 4565, + "end": 5099, + "octets": 534, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 5129, + "headersEnd": 5258, + "end": 5762, + "octets": 504, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 5792, + "headersEnd": 5941, + "message": { + "begin": 5941, + "headersEnd": 6381, + "body": { + "mimeType": "text/plain", + "begin": 5941, + "headersEnd": 6381, + "end": 6419, + "octets": 38, + "lines": 1 + }, + "end": 6419, + "octets": 38, + "lines": 1 + }, + "end": 6419, + "octets": 478, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 6449, + "headersEnd": 6625, + "message": { + "begin": 6625, + "headersEnd": 7210, + "body": { + "mimeType": "message/rfc822", + "begin": 6625, + "headersEnd": 7210, + "message": { + "begin": 7210, + "headersEnd": 7735, + "body": { + "mimeType": "message/rfc822", + "begin": 7210, + "headersEnd": 7735, + "message": { + "begin": 7735, + "headersEnd": 8156, + "body": { + "mimeType": "text/plain", + "begin": 7735, + "headersEnd": 8156, + "end": 8162, + "octets": 6, + "lines": 1 + }, + "end": 8162, + "octets": 6, + "lines": 1 + }, + "end": 8162, + "octets": 427, + "lines": 12 + }, + "end": 8162, + "octets": 427, + "lines": 12 + }, + "end": 8162, + "octets": 952, + "lines": 26 + }, + "end": 8162, + "octets": 952, + "lines": 26 + }, + "end": 8162, + "octets": 1537, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 8192, + "headersEnd": 8248, + "end": 8301, + "octets": 53, + "lines": 1 + } + ], + "end": 8331, + "octets": 5901, + "lines": 145 + }, + "end": 8331, + "octets": 5901, + "lines": 145 + }, + { + "mboxMarkerBegin": 8333, + "mboxMarkerLength": 7, + "begin": 8342, + "headersEnd": 8825, + "body": { + "mimeType": "multipart/mixed", + "begin": 8342, + "headersEnd": 8825, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 8901, + "headersEnd": 9054, + "message": { + "begin": 9054, + "headersEnd": 9493, + "body": { + "mimeType": "text/plain", + "begin": 9054, + "headersEnd": 9493, + "end": 9532, + "octets": 39, + "lines": 2 + }, + "end": 9532, + "octets": 39, + "lines": 2 + }, + "end": 9532, + "octets": 478, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 9562, + "headersEnd": 9693, + "end": 10157, + "octets": 464, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 10187, + "headersEnd": 10318, + "end": 10810, + "octets": 492, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 10840, + "headersEnd": 10975, + "end": 11509, + "octets": 534, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 11539, + "headersEnd": 11672, + "end": 12176, + "octets": 504, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 12206, + "headersEnd": 12359, + "message": { + "begin": 12359, + "headersEnd": 12798, + "body": { + "mimeType": "text/plain", + "begin": 12359, + "headersEnd": 12798, + "end": 12836, + "octets": 38, + "lines": 1 + }, + "end": 12836, + "octets": 38, + "lines": 1 + }, + "end": 12836, + "octets": 477, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 12866, + "headersEnd": 13046, + "message": { + "begin": 13046, + "headersEnd": 13634, + "body": { + "mimeType": "message/rfc822", + "begin": 13046, + "headersEnd": 13634, + "message": { + "begin": 13634, + "headersEnd": 14162, + "body": { + "mimeType": "message/rfc822", + "begin": 13634, + "headersEnd": 14162, + "message": { + "begin": 14162, + "headersEnd": 14582, + "body": { + "mimeType": "text/plain", + "begin": 14162, + "headersEnd": 14582, + "end": 14588, + "octets": 6, + "lines": 1 + }, + "end": 14588, + "octets": 6, + "lines": 1 + }, + "end": 14588, + "octets": 426, + "lines": 12 + }, + "end": 14588, + "octets": 426, + "lines": 12 + }, + "end": 14588, + "octets": 954, + "lines": 26 + }, + "end": 14588, + "octets": 954, + "lines": 26 + }, + "end": 14588, + "octets": 1542, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 14618, + "headersEnd": 14678, + "end": 14731, + "octets": 53, + "lines": 1 + } + ], + "end": 14761, + "octets": 5936, + "lines": 145 + }, + "end": 14761, + "octets": 5936, + "lines": 145 + }, + { + "mboxMarkerBegin": 14763, + "mboxMarkerLength": 31, + "begin": 14796, + "headersEnd": 16325, + "body": { + "mimeType": "multipart/related", + "begin": 14796, + "headersEnd": 16325, + "children": [ + { + "mimeType": "text/html", + "begin": 16372, + "headersEnd": 16466, + "end": 21776, + "octets": 5310, + "lines": 111 + }, + { + "mimeType": "image/gif", + "begin": 21823, + "headersEnd": 22028, + "end": 22970, + "octets": 942, + "lines": 13 + } + ], + "end": 23019, + "octets": 6694, + "lines": 139 + }, + "end": 23019, + "octets": 6694, + "lines": 139 + }, + { + "mboxMarkerBegin": 23021, + "mboxMarkerLength": 31, + "begin": 23054, + "headersEnd": 24310, + "body": { + "mimeType": "multipart/mixed", + "begin": 23054, + "headersEnd": 24310, + "children": [ + { + "mimeType": "text/plain", + "begin": 24397, + "headersEnd": 24476, + "end": 24506, + "octets": 30, + "lines": 3 + }, + { + "mimeType": "message/rfc822", + "begin": 24547, + "headersEnd": 24641, + "message": { + "begin": 24641, + "headersEnd": 25478, + "body": { + "mimeType": "multipart/alternative", + "begin": 24641, + "headersEnd": 25478, + "children": [ + { + "mimeType": "text/plain", + "begin": 25520, + "headersEnd": 25599, + "end": 26242, + "octets": 643, + "lines": 16 + }, + { + "mimeType": "multipart/related", + "begin": 26284, + "headersEnd": 26368, + "children": [ + { + "mimeType": "text/html", + "begin": 26410, + "headersEnd": 26488, + "end": 27356, + "octets": 868, + "lines": 18 + }, + { + "mimeType": "image/tiff", + "begin": 27398, + "headersEnd": 27587, + "end": 781745, + "octets": 754158, + "lines": 10192 + } + ], + "end": 781789, + "octets": 755421, + "lines": 10223 + } + ], + "end": 781837, + "octets": 756359, + "lines": 10252 + }, + "end": 781837, + "octets": 756359, + "lines": 10252 + }, + "end": 781837, + "octets": 757196, + "lines": 10268 + } + ], + "end": 781880, + "octets": 757570, + "lines": 10285 + }, + "end": 781880, + "octets": 757570, + "lines": 10285 + }, + { + "mboxMarkerBegin": 781882, + "mboxMarkerLength": 31, + "begin": 781915, + "headersEnd": 783201, + "body": { + "mimeType": "multipart/related", + "begin": 781915, + "headersEnd": 783201, + "children": [ + { + "mimeType": "text/html", + "begin": 783248, + "headersEnd": 783342, + "end": 785774, + "octets": 2432, + "lines": 50 + }, + { + "mimeType": "image/gif", + "begin": 785821, + "headersEnd": 785985, + "end": 792087, + "octets": 6102, + "lines": 79 + }, + { + "mimeType": "image/gif", + "begin": 792134, + "headersEnd": 792297, + "end": 804527, + "octets": 12230, + "lines": 157 + }, + { + "mimeType": "image/gif", + "begin": 804574, + "headersEnd": 804739, + "end": 826735, + "octets": 21996, + "lines": 282 + }, + { + "mimeType": "image/gif", + "begin": 826782, + "headersEnd": 826991, + "end": 830429, + "octets": 3438, + "lines": 45 + } + ], + "end": 830478, + "octets": 47277, + "lines": 649 + }, + "end": 830478, + "octets": 47277, + "lines": 649 + }, + { + "mboxMarkerBegin": 830480, + "mboxMarkerLength": 7, + "begin": 830489, + "headersEnd": 831421, + "body": { + "mimeType": "multipart/mixed", + "begin": 830489, + "headersEnd": 831421, + "children": [ + { + "mimeType": "text/richtext", + "begin": 831432, + "headersEnd": 831463, + "end": 834089, + "octets": 2626, + "lines": 96 + } + ], + "end": 834102, + "octets": 2681, + "lines": 102 + }, + "end": 834102, + "octets": 2681, + "lines": 102 + }, + { + "mboxMarkerBegin": 834104, + "mboxMarkerLength": 31, + "begin": 834137, + "headersEnd": 835308, + "body": { + "mimeType": "multipart/signed", + "begin": 834137, + "headersEnd": 835308, + "children": [ + { + "mimeType": "text/plain", + "begin": 835326, + "headersEnd": 835328, + "end": 836249, + "octets": 921, + "lines": 20 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 836269, + "headersEnd": 836351, + "end": 837111, + "octets": 760, + "lines": 12 + } + ], + "end": 837133, + "octets": 1825, + "lines": 41 + }, + "end": 837133, + "octets": 1825, + "lines": 41 + }, + { + "mboxMarkerBegin": 837135, + "mboxMarkerLength": 31, + "begin": 837168, + "headersEnd": 838329, + "body": { + "mimeType": "multipart/mixed", + "begin": 837168, + "headersEnd": 838329, + "children": [ + { + "mimeType": "text/plain", + "begin": 838513, + "headersEnd": 838594, + "end": 839348, + "octets": 754, + "lines": 14 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 839358, + "headersEnd": 839541, + "end": 841787, + "octets": 2246, + "lines": 31 + } + ], + "end": 841797, + "octets": 3468, + "lines": 60 + }, + "end": 841797, + "octets": 3468, + "lines": 60 + }, + { + "mboxMarkerBegin": 841799, + "mboxMarkerLength": 31, + "begin": 841832, + "headersEnd": 842992, + "body": { + "mimeType": "multipart/mixed", + "begin": 841832, + "headersEnd": 842992, + "children": [ + { + "mimeType": "text/plain", + "begin": 843190, + "headersEnd": 843271, + "end": 846129, + "octets": 2858, + "lines": 47 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 846153, + "headersEnd": 846336, + "end": 848918, + "octets": 2582, + "lines": 35 + } + ], + "end": 848942, + "octets": 5950, + "lines": 97 + }, + "end": 848942, + "octets": 5950, + "lines": 97 + }, + { + "mboxMarkerBegin": 848944, + "mboxMarkerLength": 31, + "begin": 848977, + "headersEnd": 849895, + "body": { + "mimeType": "multipart/signed", + "begin": 848977, + "headersEnd": 849895, + "children": [ + { + "mimeType": "image/jpeg", + "begin": 849971, + "headersEnd": 850109, + "end": 860977, + "octets": 10868, + "lines": 147 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 861007, + "headersEnd": 861162, + "end": 865836, + "octets": 4674, + "lines": 64 + } + ], + "end": 865868, + "octets": 15973, + "lines": 224 + }, + "end": 865868, + "octets": 15973, + "lines": 224 + }, + { + "mboxMarkerBegin": 865870, + "mboxMarkerLength": 31, + "begin": 865903, + "headersEnd": 867318, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 865903, + "headersEnd": 867318, + "end": 868768, + "octets": 1450, + "lines": 20 + }, + "end": 868768, + "octets": 1450, + "lines": 20 + }, + { + "mboxMarkerBegin": 868770, + "mboxMarkerLength": 31, + "begin": 868803, + "headersEnd": 870180, + "body": { + "mimeType": "multipart/signed", + "begin": 868803, + "headersEnd": 870180, + "children": [ + { + "mimeType": "text/plain", + "begin": 870227, + "headersEnd": 870294, + "end": 870404, + "octets": 110, + "lines": 4 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 870451, + "headersEnd": 870606, + "end": 874592, + "octets": 3986, + "lines": 54 + } + ], + "end": 874641, + "octets": 4461, + "lines": 69 + }, + "end": 874641, + "octets": 4461, + "lines": 69 + }, + { + "mboxMarkerBegin": 874643, + "mboxMarkerLength": 31, + "begin": 874676, + "headersEnd": 875907, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 874676, + "headersEnd": 875907, + "end": 879457, + "octets": 3550, + "lines": 55 + }, + "end": 879457, + "octets": 3550, + "lines": 55 + }, + { + "mboxMarkerBegin": 879459, + "mboxMarkerLength": 31, + "begin": 879492, + "headersEnd": 880590, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 879492, + "headersEnd": 880590, + "end": 881260, + "octets": 670, + "lines": 10 + }, + "end": 881260, + "octets": 670, + "lines": 10 + }, + { + "mboxMarkerBegin": 881262, + "mboxMarkerLength": 31, + "begin": 881295, + "headersEnd": 882097, + "body": { + "mimeType": "message/rfc822", + "begin": 881295, + "headersEnd": 882097, + "message": { + "begin": 882097, + "headersEnd": 883500, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 882097, + "headersEnd": 883500, + "end": 884952, + "octets": 1452, + "lines": 20 + }, + "end": 884952, + "octets": 1452, + "lines": 20 + }, + "end": 884952, + "octets": 2855, + "lines": 43 + }, + "end": 884952, + "octets": 2855, + "lines": 43 + }, + { + "mboxMarkerBegin": 884954, + "mboxMarkerLength": 31, + "begin": 884987, + "headersEnd": 885714, + "body": { + "mimeType": "multipart/mixed", + "begin": 884987, + "headersEnd": 885714, + "children": [ + { + "mimeType": "text/plain", + "begin": 885790, + "headersEnd": 885869, + "end": 885885, + "octets": 16, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 885915, + "headersEnd": 886073, + "message": { + "begin": 886073, + "headersEnd": 887476, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 886073, + "headersEnd": 887476, + "end": 888928, + "octets": 1452, + "lines": 20 + }, + "end": 888928, + "octets": 1452, + "lines": 20 + }, + "end": 888928, + "octets": 2855, + "lines": 43 + } + ], + "end": 888960, + "octets": 3246, + "lines": 58 + }, + "end": 888960, + "octets": 3246, + "lines": 58 + }, + { + "mboxMarkerBegin": 888962, + "mboxMarkerLength": 31, + "begin": 888995, + "headersEnd": 889676, + "body": { + "mimeType": "multipart/signed", + "begin": 888995, + "headersEnd": 889676, + "children": [ + { + "mimeType": "text/plain", + "begin": 889780, + "headersEnd": 889859, + "end": 889901, + "octets": 42, + "lines": 2 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 889945, + "headersEnd": 890100, + "end": 895732, + "octets": 5632, + "lines": 77 + } + ], + "end": 895778, + "octets": 6102, + "lines": 91 + }, + "end": 895778, + "octets": 6102, + "lines": 91 + }, + { + "mboxMarkerBegin": 895780, + "mboxMarkerLength": 31, + "begin": 895813, + "headersEnd": 896896, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 895813, + "headersEnd": 896896, + "end": 907272, + "octets": 10376, + "lines": 141 + }, + "end": 907272, + "octets": 10376, + "lines": 141 + }, + { + "mboxMarkerBegin": 907274, + "mboxMarkerLength": 31, + "begin": 907307, + "headersEnd": 908707, + "body": { + "mimeType": "multipart/signed", + "begin": 907307, + "headersEnd": 908707, + "children": [ + { + "mimeType": "text/plain", + "begin": 908811, + "headersEnd": 908890, + "end": 909517, + "octets": 627, + "lines": 17 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 909561, + "headersEnd": 909716, + "end": 911528, + "octets": 1812, + "lines": 25 + } + ], + "end": 911574, + "octets": 2867, + "lines": 54 + }, + "end": 911574, + "octets": 2867, + "lines": 54 + }, + { + "mboxMarkerBegin": 911576, + "mboxMarkerLength": 31, + "begin": 911609, + "headersEnd": 912172, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 911609, + "headersEnd": 912172, + "end": 912702, + "octets": 530, + "lines": 8 + }, + "end": 912702, + "octets": 530, + "lines": 8 + }, + { + "mboxMarkerBegin": 912704, + "mboxMarkerLength": 31, + "begin": 912737, + "headersEnd": 913972, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 912737, + "headersEnd": 913972, + "end": 916892, + "octets": 2920, + "lines": 38 + }, + "end": 916892, + "octets": 2920, + "lines": 38 + }, + { + "mboxMarkerBegin": 916894, + "mboxMarkerLength": 31, + "begin": 916927, + "headersEnd": 918106, + "body": { + "mimeType": "Application/x-pkcs7-mime", + "begin": 916927, + "headersEnd": 918106, + "end": 920258, + "octets": 2152, + "lines": 30 + }, + "end": 920258, + "octets": 2152, + "lines": 30 + }, + { + "mboxMarkerBegin": 920260, + "mboxMarkerLength": 31, + "begin": 920293, + "headersEnd": 921392, + "body": { + "mimeType": "multipart/signed", + "begin": 920293, + "headersEnd": 921392, + "children": [ + { + "mimeType": "text/plain", + "begin": 921427, + "headersEnd": 921494, + "end": 921494, + "octets": 0, + "lines": 0 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 921529, + "headersEnd": 921611, + "end": 924365, + "octets": 2754, + "lines": 42 + } + ], + "end": 924402, + "octets": 3010, + "lines": 53 + }, + "end": 924402, + "octets": 3010, + "lines": 53 + }, + { + "mboxMarkerBegin": 924404, + "mboxMarkerLength": 31, + "begin": 924437, + "headersEnd": 925493, + "body": { + "mimeType": "multipart/mixed", + "begin": 924437, + "headersEnd": 925493, + "children": [ + { + "mimeType": "text/plain", + "begin": 925536, + "headersEnd": 925617, + "end": 926083, + "octets": 466, + "lines": 14 + }, + { + "mimeType": "text/html", + "begin": 926126, + "headersEnd": 926204, + "end": 927041, + "octets": 837, + "lines": 27 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 927084, + "headersEnd": 927184, + "end": 928400, + "octets": 1216, + "lines": 16 + } + ], + "end": 928445, + "octets": 2952, + "lines": 72 + }, + "end": 928445, + "octets": 2952, + "lines": 72 + }, + { + "mboxMarkerBegin": 928447, + "mboxMarkerLength": 31, + "begin": 928480, + "headersEnd": 929576, + "body": { + "mimeType": "multipart/signed", + "begin": 928480, + "headersEnd": 929576, + "children": [ + { + "mimeType": "text/plain", + "begin": 929621, + "headersEnd": 929694, + "end": 929853, + "octets": 159, + "lines": 7 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 929898, + "headersEnd": 929980, + "end": 934132, + "octets": 4152, + "lines": 57 + } + ], + "end": 934179, + "octets": 4603, + "lines": 75 + }, + "end": 934179, + "octets": 4603, + "lines": 75 + }, + { + "mboxMarkerBegin": 934181, + "mboxMarkerLength": 31, + "begin": 934214, + "headersEnd": 935337, + "body": { + "mimeType": "multipart/signed", + "begin": 934214, + "headersEnd": 935337, + "children": [ + { + "mimeType": "text/plain", + "begin": 935373, + "headersEnd": 935454, + "end": 935532, + "octets": 78, + "lines": 5 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 935568, + "headersEnd": 935650, + "end": 939424, + "octets": 3774, + "lines": 58 + } + ], + "end": 939460, + "octets": 4123, + "lines": 73 + }, + "end": 939460, + "octets": 4123, + "lines": 73 + }, + { + "mboxMarkerBegin": 939462, + "mboxMarkerLength": 31, + "begin": 939495, + "headersEnd": 940640, + "body": { + "mimeType": "multipart/report", + "begin": 939495, + "headersEnd": 940640, + "children": [ + { + "mimeType": "message/delivery-status", + "begin": 940782, + "headersEnd": 940823, + "end": 941017, + "octets": 194, + "lines": 6 + }, + { + "mimeType": "message/rfc822", + "begin": 941044, + "headersEnd": 941076, + "message": { + "begin": 941076, + "headersEnd": 941897, + "body": { + "mimeType": "text/plain", + "begin": 941076, + "headersEnd": 941897, + "end": 941908, + "octets": 11, + "lines": 1 + }, + "end": 941908, + "octets": 11, + "lines": 1 + }, + "end": 941908, + "octets": 832, + "lines": 16 + } + ], + "end": 941937, + "octets": 1297, + "lines": 34 + }, + "end": 941937, + "octets": 1297, + "lines": 34 + }, + { + "mboxMarkerBegin": 941939, + "mboxMarkerLength": 31, + "begin": 941972, + "headersEnd": 943868, + "body": { + "mimeType": "multipart/mixed", + "begin": 941972, + "headersEnd": 943868, + "children": [ + { + "mimeType": "text/plain", + "begin": 943913, + "headersEnd": 943994, + "end": 944875, + "octets": 881, + "lines": 18 + }, + { + "mimeType": "application/vcard", + "begin": 944922, + "headersEnd": 945088, + "end": 948790, + "octets": 3702, + "lines": 61 + } + ], + "end": 948839, + "octets": 4971, + "lines": 92 + }, + "end": 948839, + "octets": 4971, + "lines": 92 + } +] \ No newline at end of file diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.json b/UnitTests/TestData/mbox/jwz.dos-offsets.json new file mode 100644 index 0000000000..cb9ea984f2 --- /dev/null +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.json @@ -0,0 +1,8918 @@ +[ + { + "mboxMarkerBegin": 0, + "mboxMarkerLength": 7, + "begin": 9, + "headersEnd": 531, + "body": { + "mimeType": "multipart/mixed", + "begin": 9, + "headersEnd": 531, + "children": [ + { + "mimeType": "multipart/parallel", + "begin": 549, + "headersEnd": 648, + "children": [ + { + "mimeType": "text/plain", + "begin": 680, + "headersEnd": 682, + "end": 1413, + "octets": 731, + "lines": 17 + }, + { + "mimeType": "audio/basic", + "begin": 1447, + "headersEnd": 1535, + "end": 33007, + "octets": 31472, + "lines": 426 + } + ], + "end": 33041, + "octets": 32393, + "lines": 452 + }, + { + "mimeType": "multipart/mixed", + "begin": 33061, + "headersEnd": 33157, + "children": [ + { + "mimeType": "image/gif", + "begin": 33189, + "headersEnd": 33275, + "end": 59275, + "octets": 26000, + "lines": 352 + }, + { + "mimeType": "image/gif", + "begin": 59309, + "headersEnd": 59395, + "end": 78061, + "octets": 18666, + "lines": 253 + }, + { + "mimeType": "application/octet-stream", + "begin": 78095, + "headersEnd": 78212, + "end": 124337, + "octets": 46125, + "lines": 2437 + }, + { + "mimeType": "application/atomicmail", + "begin": 124371, + "headersEnd": 124435, + "end": 133638, + "octets": 9203, + "lines": 357 + } + ], + "end": 133672, + "octets": 100515, + "lines": 3421 + }, + { + "mimeType": "audio/basic", + "begin": 133692, + "headersEnd": 133780, + "end": 181602, + "octets": 47822, + "lines": 647 + } + ], + "end": 181624, + "octets": 181093, + "lines": 4535 + }, + "end": 181624, + "octets": 181093, + "lines": 4535 + }, + { + "mboxMarkerBegin": 181626, + "mboxMarkerLength": 7, + "begin": 181635, + "headersEnd": 182198, + "body": { + "mimeType": "audio/basic", + "begin": 181635, + "headersEnd": 182198, + "end": 319322, + "octets": 137124, + "lines": 1854 + }, + "end": 319322, + "octets": 137124, + "lines": 1854 + }, + { + "mboxMarkerBegin": 319324, + "mboxMarkerLength": 7, + "begin": 319333, + "headersEnd": 319720, + "body": { + "mimeType": "text/plain", + "begin": 319333, + "headersEnd": 319720, + "end": 319924, + "octets": 204, + "lines": 4 + }, + "end": 319924, + "octets": 204, + "lines": 4 + }, + { + "mboxMarkerBegin": 319926, + "mboxMarkerLength": 7, + "begin": 319935, + "headersEnd": 320596, + "body": { + "mimeType": "multipart/alternative", + "begin": 319935, + "headersEnd": 320596, + "children": [ + { + "mimeType": "text/plain", + "begin": 320795, + "headersEnd": 320841, + "end": 321080, + "octets": 239, + "lines": 6 + }, + { + "mimeType": "multipart/mixed", + "begin": 321123, + "headersEnd": 321211, + "children": [ + { + "mimeType": "text/richtext", + "begin": 321254, + "headersEnd": 321348, + "end": 321497, + "octets": 149, + "lines": 3 + }, + { + "mimeType": "image/gif", + "begin": 321542, + "headersEnd": 321656, + "end": 326088, + "octets": 4432, + "lines": 64 + }, + { + "mimeType": "text/richtext", + "begin": 326133, + "headersEnd": 326227, + "end": 326275, + "octets": 48, + "lines": 3 + } + ], + "end": 326322, + "octets": 5111, + "lines": 87 + } + ], + "end": 326365, + "octets": 5769, + "lines": 106 + }, + "end": 326365, + "octets": 5769, + "lines": 106 + }, + { + "mboxMarkerBegin": 326367, + "mboxMarkerLength": 7, + "begin": 326376, + "headersEnd": 327141, + "body": { + "mimeType": "multipart/mixed", + "begin": 326376, + "headersEnd": 327141, + "children": [ + { + "mimeType": "text/richtext", + "begin": 327403, + "headersEnd": 327479, + "end": 327915, + "octets": 436, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 327980, + "headersEnd": 328012, + "message": { + "begin": 328012, + "headersEnd": 328864, + "body": { + "mimeType": "multipart/mixed", + "begin": 328012, + "headersEnd": 328864, + "children": [ + { + "mimeType": "text/plain", + "begin": 329179, + "headersEnd": 329276, + "end": 329386, + "octets": 110, + "lines": 6 + }, + { + "mimeType": "audio/basic", + "begin": 329419, + "headersEnd": 329511, + "end": 350421, + "octets": 20910, + "lines": 283 + }, + { + "mimeType": "text/plain", + "begin": 350454, + "headersEnd": 350456, + "end": 350456, + "octets": 0, + "lines": 0 + } + ], + "end": 350454, + "octets": 21590, + "lines": 308 + }, + "end": 350454, + "octets": 21590, + "lines": 308 + }, + "end": 350454, + "octets": 22442, + "lines": 324 + }, + { + "mimeType": "text/richtext", + "begin": 350519, + "headersEnd": 350595, + "end": 350706, + "octets": 111, + "lines": 4 + } + ], + "end": 350773, + "octets": 23632, + "lines": 359 + }, + "end": 350773, + "octets": 23632, + "lines": 359 + }, + { + "mboxMarkerBegin": 350775, + "mboxMarkerLength": 7, + "begin": 350784, + "headersEnd": 351518, + "body": { + "mimeType": "multipart/alternative", + "begin": 350784, + "headersEnd": 351518, + "children": [ + { + "mimeType": "text/plain", + "begin": 351717, + "headersEnd": 351763, + "end": 352541, + "octets": 778, + "lines": 18 + }, + { + "mimeType": "multipart/mixed", + "begin": 352584, + "headersEnd": 352672, + "children": [ + { + "mimeType": "text/richtext", + "begin": 352715, + "headersEnd": 352809, + "end": 353038, + "octets": 229, + "lines": 4 + }, + { + "mimeType": "image/x-xwd", + "begin": 353083, + "headersEnd": 353195, + "end": 1037241, + "octets": 684046, + "lines": 8982 + }, + { + "mimeType": "text/richtext", + "begin": 1037286, + "headersEnd": 1037380, + "end": 1037501, + "octets": 121, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 1037546, + "headersEnd": 1037676, + "end": 1727872, + "octets": 690196, + "lines": 9060 + }, + { + "mimeType": "text/richtext", + "begin": 1727917, + "headersEnd": 1728011, + "end": 1728023, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 1728068, + "headersEnd": 1728189, + "end": 1797301, + "octets": 69112, + "lines": 934 + }, + { + "mimeType": "text/richtext", + "begin": 1797346, + "headersEnd": 1797440, + "end": 1797583, + "octets": 143, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 1797628, + "headersEnd": 1797750, + "end": 2138984, + "octets": 341234, + "lines": 4472 + }, + { + "mimeType": "text/richtext", + "begin": 2139029, + "headersEnd": 2139123, + "end": 2139129, + "octets": 6, + "lines": 1 + } + ], + "end": 2139176, + "octets": 1786504, + "lines": 23515 + } + ], + "end": 2139219, + "octets": 1787701, + "lines": 23546 + }, + "end": 2139219, + "octets": 1787701, + "lines": 23546 + }, + { + "mboxMarkerBegin": 2139221, + "mboxMarkerLength": 7, + "begin": 2139230, + "headersEnd": 2140267, + "body": { + "mimeType": "text/plain", + "begin": 2139230, + "headersEnd": 2140267, + "end": 2141431, + "octets": 1164, + "lines": 39 + }, + "end": 2141431, + "octets": 1164, + "lines": 39 + }, + { + "mboxMarkerBegin": 2141433, + "mboxMarkerLength": 7, + "begin": 2141442, + "headersEnd": 2141689, + "body": { + "mimeType": "multipart/mixed", + "begin": 2141442, + "headersEnd": 2141689, + "children": [ + { + "mimeType": "text/plain", + "begin": 2141705, + "headersEnd": 2141707, + "end": 2142012, + "octets": 305, + "lines": 6 + }, + { + "mimeType": "multipart/parallel", + "begin": 2142030, + "headersEnd": 2142109, + "children": [ + { + "mimeType": "image/gif", + "begin": 2142126, + "headersEnd": 2142207, + "end": 2145483, + "octets": 3276, + "lines": 17 + }, + { + "mimeType": "audio/basic", + "begin": 2145502, + "headersEnd": 2145610, + "end": 2302316, + "octets": 156706, + "lines": 808 + } + ], + "end": 2302335, + "octets": 160226, + "lines": 837 + }, + { + "mimeType": "application/atomicmail", + "begin": 2302353, + "headersEnd": 2302412, + "end": 2307327, + "octets": 4915, + "lines": 195 + } + ], + "end": 2307345, + "octets": 165656, + "lines": 1050 + }, + "end": 2307345, + "octets": 165656, + "lines": 1050 + }, + { + "mboxMarkerBegin": 2307347, + "mboxMarkerLength": 7, + "begin": 2307356, + "headersEnd": 2308328, + "body": { + "mimeType": "audio/basic", + "begin": 2307356, + "headersEnd": 2308328, + "end": 2655844, + "octets": 347516, + "lines": 4456 + }, + "end": 2655844, + "octets": 347516, + "lines": 4456 + }, + { + "mboxMarkerBegin": 2655846, + "mboxMarkerLength": 7, + "begin": 2655855, + "headersEnd": 2655994, + "body": { + "mimeType": "multipart/mixed", + "begin": 2655855, + "headersEnd": 2655994, + "children": [ + { + "mimeType": "multipart/parallel", + "begin": 2656012, + "headersEnd": 2656087, + "children": [ + { + "mimeType": "text/plain", + "begin": 2656119, + "headersEnd": 2656121, + "end": 2656845, + "octets": 724, + "lines": 18 + }, + { + "mimeType": "audio/basic", + "begin": 2656879, + "headersEnd": 2656980, + "end": 2688452, + "octets": 31472, + "lines": 426 + } + ], + "end": 2688486, + "octets": 32399, + "lines": 453 + } + ], + "end": 2688506, + "octets": 32512, + "lines": 457 + }, + "end": 2688506, + "octets": 32512, + "lines": 457 + }, + { + "mboxMarkerBegin": 2688508, + "mboxMarkerLength": 7, + "begin": 2688517, + "headersEnd": 2689088, + "body": { + "mimeType": "image/pbm", + "begin": 2688517, + "headersEnd": 2689088, + "end": 2746649, + "octets": 57561, + "lines": 782 + }, + "end": 2746649, + "octets": 57561, + "lines": 782 + }, + { + "mboxMarkerBegin": 2746651, + "mboxMarkerLength": 7, + "begin": 2746660, + "headersEnd": 2747410, + "body": { + "mimeType": "multipart/alternative", + "begin": 2746660, + "headersEnd": 2747410, + "children": [ + { + "mimeType": "text/plain", + "begin": 2748003, + "headersEnd": 2748005, + "end": 2748571, + "octets": 566, + "lines": 14 + }, + { + "mimeType": "multipart/mixed", + "begin": 2748632, + "headersEnd": 2748738, + "children": [ + { + "mimeType": "text/richtext", + "begin": 2748799, + "headersEnd": 2748875, + "end": 2749301, + "octets": 426, + "lines": 7 + }, + { + "mimeType": "image/xwd", + "begin": 2749364, + "headersEnd": 2749426, + "end": 2779088, + "octets": 29662, + "lines": 401 + }, + { + "mimeType": "text/plain", + "begin": 2779151, + "headersEnd": 2779224, + "end": 2779269, + "octets": 45, + "lines": 4 + } + ], + "end": 2779334, + "octets": 30596, + "lines": 428 + } + ], + "end": 2779395, + "octets": 31985, + "lines": 459 + }, + "end": 2779395, + "octets": 31985, + "lines": 459 + }, + { + "mboxMarkerBegin": 2779397, + "mboxMarkerLength": 7, + "begin": 2779406, + "headersEnd": 2780075, + "body": { + "mimeType": "multipart/alternative", + "begin": 2779406, + "headersEnd": 2780075, + "children": [ + { + "mimeType": "text/plain", + "begin": 2780452, + "headersEnd": 2780454, + "end": 2781302, + "octets": 848, + "lines": 27 + }, + { + "mimeType": "multipart/mixed", + "begin": 2781334, + "headersEnd": 2781410, + "children": [ + { + "mimeType": "text/plain", + "begin": 2781442, + "headersEnd": 2781470, + "end": 2781612, + "octets": 142, + "lines": 6 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 2781646, + "headersEnd": 2781714, + "end": 2782928, + "octets": 1214, + "lines": 17 + }, + { + "mimeType": "text/plain", + "begin": 2782962, + "headersEnd": 2782990, + "end": 2783058, + "octets": 68, + "lines": 1 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 2783092, + "headersEnd": 2783160, + "end": 2784382, + "octets": 1222, + "lines": 17 + }, + { + "mimeType": "text/richtext", + "begin": 2784416, + "headersEnd": 2784447, + "end": 2785006, + "octets": 559, + "lines": 14 + } + ], + "end": 2785042, + "octets": 3632, + "lines": 75 + } + ], + "end": 2785076, + "octets": 5001, + "lines": 118 + }, + "end": 2785076, + "octets": 5001, + "lines": 118 + }, + { + "mboxMarkerBegin": 2785078, + "mboxMarkerLength": 7, + "begin": 2785087, + "headersEnd": 2786084, + "body": { + "mimeType": "text/plain", + "begin": 2785087, + "headersEnd": 2786084, + "end": 2787498, + "octets": 1414, + "lines": 32 + }, + "end": 2787498, + "octets": 1414, + "lines": 32 + }, + { + "mboxMarkerBegin": 2787500, + "mboxMarkerLength": 7, + "begin": 2787509, + "headersEnd": 2787772, + "body": { + "mimeType": "text/plain", + "begin": 2787509, + "headersEnd": 2787772, + "end": 2788033, + "octets": 261, + "lines": 6 + }, + "end": 2788033, + "octets": 261, + "lines": 6 + }, + { + "mboxMarkerBegin": 2788035, + "mboxMarkerLength": 7, + "begin": 2788044, + "headersEnd": 2788716, + "body": { + "mimeType": "text/plain", + "begin": 2788044, + "headersEnd": 2788716, + "end": 2789453, + "octets": 737, + "lines": 14 + }, + "end": 2789453, + "octets": 737, + "lines": 14 + }, + { + "mboxMarkerBegin": 2789455, + "mboxMarkerLength": 7, + "begin": 2789464, + "headersEnd": 2790463, + "body": { + "mimeType": "multipart/mixed", + "begin": 2789464, + "headersEnd": 2790463, + "children": [ + { + "mimeType": "text/plain", + "begin": 2790507, + "headersEnd": 2790555, + "end": 2790632, + "octets": 77, + "lines": 5 + }, + { + "mimeType": "multipart/appledouble", + "begin": 2790674, + "headersEnd": 2790763, + "children": [ + { + "mimeType": "application/applefile", + "begin": 2790808, + "headersEnd": 2790967, + "end": 2857841, + "octets": 66874, + "lines": 957 + }, + { + "mimeType": "application/octet-stream", + "begin": 2857884, + "headersEnd": 2858099, + "end": 3227661, + "octets": 369562, + "lines": 5281 + } + ], + "end": 3227708, + "octets": 436945, + "lines": 6256 + } + ], + "end": 3227750, + "octets": 437287, + "lines": 6272 + }, + "end": 3227750, + "octets": 437287, + "lines": 6272 + }, + { + "mboxMarkerBegin": 3227752, + "mboxMarkerLength": 7, + "begin": 3227761, + "headersEnd": 3228760, + "body": { + "mimeType": "multipart/mixed", + "begin": 3227761, + "headersEnd": 3228760, + "children": [ + { + "mimeType": "text/plain", + "begin": 3228804, + "headersEnd": 3228852, + "end": 3228929, + "octets": 77, + "lines": 5 + }, + { + "mimeType": "multipart/header-set", + "begin": 3228971, + "headersEnd": 3229059, + "children": [ + { + "mimeType": "application/applefile", + "begin": 3229104, + "headersEnd": 3229263, + "end": 3296137, + "octets": 66874, + "lines": 957 + }, + { + "mimeType": "application/octet-stream", + "begin": 3296180, + "headersEnd": 3296395, + "end": 3665957, + "octets": 369562, + "lines": 5281 + } + ], + "end": 3666004, + "octets": 436945, + "lines": 6256 + } + ], + "end": 3666046, + "octets": 437286, + "lines": 6272 + }, + "end": 3666046, + "octets": 437286, + "lines": 6272 + }, + { + "mboxMarkerBegin": 3666048, + "mboxMarkerLength": 7, + "begin": 3666057, + "headersEnd": 3666630, + "body": { + "mimeType": "Message/rfc822", + "begin": 3666057, + "headersEnd": 3666630, + "message": { + "begin": 3666630, + "headersEnd": 3666692, + "body": { + "mimeType": "text/plain", + "begin": 3666630, + "headersEnd": 3666692, + "end": 3667232, + "octets": 540, + "lines": 14 + }, + "end": 3667232, + "octets": 540, + "lines": 14 + }, + "end": 3667232, + "octets": 602, + "lines": 17 + }, + "end": 3667232, + "octets": 602, + "lines": 17 + }, + { + "mboxMarkerBegin": 3667234, + "mboxMarkerLength": 7, + "begin": 3667243, + "headersEnd": 3667974, + "body": { + "mimeType": "multipart/mixed", + "begin": 3667243, + "headersEnd": 3667974, + "children": [ + { + "mimeType": "text/plain", + "begin": 3668020, + "headersEnd": 3668048, + "end": 3668234, + "octets": 186, + "lines": 6 + }, + { + "mimeType": "application/postscript", + "begin": 3668280, + "headersEnd": 3668355, + "end": 3669259, + "octets": 904, + "lines": 12 + } + ], + "end": 3669418, + "octets": 1444, + "lines": 33 + }, + "end": 3669418, + "octets": 1444, + "lines": 33 + }, + { + "mboxMarkerBegin": 3669420, + "mboxMarkerLength": 7, + "begin": 3669429, + "headersEnd": 3669982, + "body": { + "mimeType": "multipart/mixed", + "begin": 3669429, + "headersEnd": 3669982, + "children": [ + { + "mimeType": "text/plain", + "begin": 3670061, + "headersEnd": 3670063, + "end": 3670465, + "octets": 402, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 3670507, + "headersEnd": 3670539, + "message": { + "begin": 3670539, + "headersEnd": 3671342, + "body": { + "mimeType": "text/plain", + "begin": 3670539, + "headersEnd": 3671342, + "end": 3674767, + "octets": 3425, + "lines": 72 + }, + "end": 3674767, + "octets": 3425, + "lines": 72 + }, + "end": 3674767, + "octets": 4228, + "lines": 88 + } + ], + "end": 3674811, + "octets": 4829, + "lines": 108 + }, + "end": 3674811, + "octets": 4829, + "lines": 108 + }, + { + "mboxMarkerBegin": 3674813, + "mboxMarkerLength": 7, + "begin": 3674822, + "headersEnd": 3675488, + "body": { + "mimeType": "multipart/mixed", + "begin": 3674822, + "headersEnd": 3675488, + "children": [ + { + "mimeType": "text/plain", + "begin": 3675538, + "headersEnd": 3675566, + "end": 3675644, + "octets": 78, + "lines": 5 + }, + { + "mimeType": "message/rfc822", + "begin": 3675696, + "headersEnd": 3675761, + "message": { + "begin": 3675761, + "headersEnd": 3676560, + "body": { + "mimeType": "text/plain", + "begin": 3675761, + "headersEnd": 3676560, + "end": 3676700, + "octets": 140, + "lines": 4 + }, + "end": 3676700, + "octets": 140, + "lines": 4 + }, + "end": 3676700, + "octets": 939, + "lines": 21 + } + ], + "end": 3676752, + "octets": 1264, + "lines": 34 + }, + "end": 3676752, + "octets": 1264, + "lines": 34 + }, + { + "mboxMarkerBegin": 3676754, + "mboxMarkerLength": 7, + "begin": 3676763, + "headersEnd": 3677286, + "body": { + "mimeType": "Application/octet-stream", + "begin": 3676763, + "headersEnd": 3677286, + "end": 3678750, + "octets": 1464, + "lines": 45 + }, + "end": 3678750, + "octets": 1464, + "lines": 45 + }, + { + "mboxMarkerBegin": 3678752, + "mboxMarkerLength": 50, + "begin": 3678804, + "headersEnd": 3679391, + "body": { + "mimeType": "message/partial", + "begin": 3678804, + "headersEnd": 3679391, + "end": 3740046, + "octets": 60655, + "lines": 954 + }, + "end": 3740046, + "octets": 60655, + "lines": 954 + }, + { + "mboxMarkerBegin": 3740048, + "mboxMarkerLength": 50, + "begin": 3740100, + "headersEnd": 3740684, + "body": { + "mimeType": "message/partial", + "begin": 3740100, + "headersEnd": 3740684, + "end": 3801451, + "octets": 60767, + "lines": 960 + }, + "end": 3801451, + "octets": 60767, + "lines": 960 + }, + { + "mboxMarkerBegin": 3801453, + "mboxMarkerLength": 7, + "begin": 3801462, + "headersEnd": 3802023, + "body": { + "mimeType": "multipart/mixed", + "begin": 3801462, + "headersEnd": 3802023, + "children": [ + { + "mimeType": "text/plain", + "begin": 3802041, + "headersEnd": 3802070, + "end": 3802145, + "octets": 75, + "lines": 4 + }, + { + "mimeType": "text/plain", + "begin": 3802163, + "headersEnd": 3802247, + "end": 3802897, + "octets": 650, + "lines": 9 + } + ], + "end": 3802919, + "octets": 896, + "lines": 25 + }, + "end": 3802919, + "octets": 896, + "lines": 25 + }, + { + "mboxMarkerBegin": 3802921, + "mboxMarkerLength": 7, + "begin": 3802930, + "headersEnd": 3803695, + "body": { + "mimeType": "image/gif", + "begin": 3802930, + "headersEnd": 3803695, + "end": 3845795, + "octets": 42100, + "lines": 570 + }, + "end": 3845795, + "octets": 42100, + "lines": 570 + }, + { + "mboxMarkerBegin": 3845797, + "mboxMarkerLength": 7, + "begin": 3845806, + "headersEnd": 3846985, + "body": { + "mimeType": "multipart/mixed", + "begin": 3845806, + "headersEnd": 3846985, + "children": [ + { + "mimeType": "text/plain", + "begin": 3846991, + "headersEnd": 3846993, + "end": 3848958, + "octets": 1965, + "lines": 43 + }, + { + "mimeType": "image/gif", + "begin": 3848966, + "headersEnd": 3849075, + "end": 3855383, + "octets": 6308, + "lines": 86 + } + ], + "end": 3855393, + "octets": 8408, + "lines": 139 + }, + "end": 3855393, + "octets": 8408, + "lines": 139 + }, + { + "mboxMarkerBegin": 3855395, + "mboxMarkerLength": 7, + "begin": 3855404, + "headersEnd": 3856880, + "body": { + "mimeType": "application/octet-stream", + "begin": 3855404, + "headersEnd": 3856880, + "end": 3965263, + "octets": 108383, + "lines": 1570 + }, + "end": 3965263, + "octets": 108383, + "lines": 1570 + }, + { + "mboxMarkerBegin": 3965265, + "mboxMarkerLength": 7, + "begin": 3965274, + "headersEnd": 3965889, + "body": { + "mimeType": "message/rfc822", + "begin": 3965274, + "headersEnd": 3965889, + "message": { + "begin": 3965889, + "headersEnd": 3966475, + "body": { + "mimeType": "message/rfc822", + "begin": 3965889, + "headersEnd": 3966475, + "message": { + "begin": 3966475, + "headersEnd": 3967033, + "body": { + "mimeType": "message/rfc822", + "begin": 3966475, + "headersEnd": 3967033, + "message": { + "begin": 3967033, + "headersEnd": 3967597, + "body": { + "mimeType": "multipart/mixed", + "begin": 3967033, + "headersEnd": 3967597, + "children": [ + { + "mimeType": "text/plain", + "begin": 3967704, + "headersEnd": 3967783, + "end": 3967833, + "octets": 50, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 3967894, + "headersEnd": 3967959, + "message": { + "begin": 3967959, + "headersEnd": 3968475, + "body": { + "mimeType": "multipart/mixed", + "begin": 3967959, + "headersEnd": 3968475, + "children": [ + { + "mimeType": "text/plain", + "begin": 3968572, + "headersEnd": 3968651, + "end": 3968778, + "octets": 127, + "lines": 5 + }, + { + "mimeType": "text/html", + "begin": 3968829, + "headersEnd": 3968901, + "end": 3969188, + "octets": 287, + "lines": 5 + } + ], + "end": 3969241, + "octets": 766, + "lines": 22 + }, + "end": 3969241, + "octets": 766, + "lines": 22 + }, + "end": 3969241, + "octets": 1282, + "lines": 38 + } + ], + "end": 3969308, + "octets": 1711, + "lines": 54 + }, + "end": 3969308, + "octets": 1711, + "lines": 54 + }, + "end": 3969308, + "octets": 2275, + "lines": 70 + }, + "end": 3969308, + "octets": 2275, + "lines": 70 + }, + "end": 3969308, + "octets": 2833, + "lines": 86 + }, + "end": 3969308, + "octets": 2833, + "lines": 86 + }, + "end": 3969308, + "octets": 3419, + "lines": 102 + }, + "end": 3969308, + "octets": 3419, + "lines": 102 + }, + { + "mboxMarkerBegin": 3969310, + "mboxMarkerLength": 7, + "begin": 3969319, + "headersEnd": 3970038, + "body": { + "mimeType": "multipart/mixed", + "begin": 3969319, + "headersEnd": 3970038, + "children": [ + { + "mimeType": "text/plain", + "begin": 3970066, + "headersEnd": 3970068, + "end": 3970110, + "octets": 42, + "lines": 2 + }, + { + "mimeType": "image/pbm", + "begin": 3970140, + "headersEnd": 3970290, + "end": 4047906, + "octets": 77616, + "lines": 401 + }, + { + "mimeType": "text/plain", + "begin": 4047936, + "headersEnd": 4047938, + "end": 4047972, + "octets": 34, + "lines": 3 + }, + { + "mimeType": "audio/basic", + "begin": 4048002, + "headersEnd": 4048154, + "end": 4151890, + "octets": 103736, + "lines": 535 + }, + { + "mimeType": "text/plain", + "begin": 4151920, + "headersEnd": 4151922, + "end": 4152086, + "octets": 164, + "lines": 5 + }, + { + "mimeType": "application/x-annotate", + "begin": 4152116, + "headersEnd": 4152208, + "end": 4233632, + "octets": 81424, + "lines": 1235 + }, + { + "mimeType": "text/plain", + "begin": 4233662, + "headersEnd": 4233664, + "end": 4233686, + "octets": 22, + "lines": 3 + } + ], + "end": 4233718, + "octets": 263680, + "lines": 2210 + }, + "end": 4233718, + "octets": 263680, + "lines": 2210 + }, + { + "mboxMarkerBegin": 4233720, + "mboxMarkerLength": 7, + "begin": 4233729, + "headersEnd": 4234408, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 4233729, + "headersEnd": 4234408, + "end": 4235418, + "octets": 1010, + "lines": 18 + }, + "end": 4235418, + "octets": 1010, + "lines": 18 + }, + { + "mboxMarkerBegin": 4235420, + "mboxMarkerLength": 7, + "begin": 4235429, + "headersEnd": 4236508, + "body": { + "mimeType": "multipart/alternative", + "begin": 4235429, + "headersEnd": 4236508, + "children": [ + { + "mimeType": "text/plain", + "begin": 4236707, + "headersEnd": 4236753, + "end": 4237170, + "octets": 417, + "lines": 13 + }, + { + "mimeType": "multipart/mixed", + "begin": 4237213, + "headersEnd": 4237301, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4237344, + "headersEnd": 4237438, + "end": 4237667, + "octets": 229, + "lines": 4 + }, + { + "mimeType": "image/x-xbm", + "begin": 4237712, + "headersEnd": 4237835, + "end": 4239256, + "octets": 1421, + "lines": 37 + }, + { + "mimeType": "text/richtext", + "begin": 4239301, + "headersEnd": 4239395, + "end": 4239552, + "octets": 157, + "lines": 9 + } + ], + "end": 4239599, + "octets": 2298, + "lines": 67 + } + ], + "end": 4239644, + "octets": 3136, + "lines": 93 + }, + "end": 4239644, + "octets": 3136, + "lines": 93 + }, + { + "mboxMarkerBegin": 4239646, + "mboxMarkerLength": 7, + "begin": 4239655, + "headersEnd": 4240341, + "body": { + "mimeType": "multipart/mixed", + "begin": 4239655, + "headersEnd": 4240341, + "children": [ + { + "mimeType": "text/plain", + "begin": 4240358, + "headersEnd": 4240387, + "end": 4240471, + "octets": 84, + "lines": 6 + }, + { + "mimeType": "image/gif", + "begin": 4240490, + "headersEnd": 4240553, + "end": 4245787, + "octets": 5234, + "lines": 71 + } + ], + "end": 4245810, + "octets": 5469, + "lines": 88 + }, + "end": 4245810, + "octets": 5469, + "lines": 88 + }, + { + "mboxMarkerBegin": 4245812, + "mboxMarkerLength": 7, + "begin": 4245821, + "headersEnd": 4246287, + "body": { + "mimeType": "Image/JPEG", + "begin": 4245821, + "headersEnd": 4246287, + "end": 4257886, + "octets": 11599, + "lines": 185 + }, + "end": 4257886, + "octets": 11599, + "lines": 185 + }, + { + "mboxMarkerBegin": 4257888, + "mboxMarkerLength": 7, + "begin": 4257897, + "headersEnd": 4258477, + "body": { + "mimeType": "Multipart/Mixed", + "begin": 4257897, + "headersEnd": 4258477, + "children": [ + { + "mimeType": "text/plain", + "begin": 4258489, + "headersEnd": 4258491, + "end": 4258530, + "octets": 39, + "lines": 1 + }, + { + "mimeType": "Multipart/MIXED", + "begin": 4258544, + "headersEnd": 4258601, + "children": [ + { + "mimeType": "Message/External-body", + "begin": 4258616, + "headersEnd": 4258736, + "message": { + "begin": 4258736, + "headersEnd": 4258816, + "body": { + "mimeType": "text/plain", + "begin": 4258736, + "headersEnd": 4258816, + "end": 4258885, + "octets": 69, + "lines": 2 + }, + "end": 4258885, + "octets": 69, + "lines": 2 + }, + "end": 4258885, + "octets": 149, + "lines": 5 + }, + { + "mimeType": "Message/External-body", + "begin": 4258902, + "headersEnd": 4259095, + "message": { + "begin": 4259095, + "headersEnd": 4259175, + "body": { + "mimeType": "text/plain", + "begin": 4259095, + "headersEnd": 4259175, + "end": 4259175, + "octets": 0, + "lines": 0 + }, + "end": 4259175, + "octets": 0, + "lines": 0 + }, + "end": 4259173, + "octets": 78, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 4259190, + "headersEnd": 4259332, + "message": { + "begin": 4259332, + "headersEnd": 4259403, + "body": { + "mimeType": "TEXT/HTML", + "begin": 4259332, + "headersEnd": 4259403, + "end": 4259403, + "octets": 0, + "lines": 0 + }, + "end": 4259403, + "octets": 0, + "lines": 0 + }, + "end": 4259401, + "octets": 69, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 4259418, + "headersEnd": 4259535, + "message": { + "begin": 4259535, + "headersEnd": 4259607, + "body": { + "mimeType": "image/gif", + "begin": 4259535, + "headersEnd": 4259607, + "end": 4259607, + "octets": 0, + "lines": 0 + }, + "end": 4259607, + "octets": 0, + "lines": 0 + }, + "end": 4259605, + "octets": 70, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 4259622, + "headersEnd": 4259731, + "message": { + "begin": 4259731, + "headersEnd": 4259803, + "body": { + "mimeType": "image/gif", + "begin": 4259731, + "headersEnd": 4259803, + "end": 4259803, + "octets": 0, + "lines": 0 + }, + "end": 4259803, + "octets": 0, + "lines": 0 + }, + "end": 4259801, + "octets": 70, + "lines": 2 + } + ], + "end": 4259820, + "octets": 1219, + "lines": 49 + } + ], + "end": 4259836, + "octets": 1359, + "lines": 58 + }, + "end": 4259836, + "octets": 1359, + "lines": 58 + }, + { + "mboxMarkerBegin": 4259838, + "mboxMarkerLength": 7, + "begin": 4259847, + "headersEnd": 4260427, + "body": { + "mimeType": "Multipart/Mixed", + "begin": 4259847, + "headersEnd": 4260427, + "children": [ + { + "mimeType": "text/plain", + "begin": 4260439, + "headersEnd": 4260441, + "end": 4263710, + "octets": 3269, + "lines": 65 + }, + { + "mimeType": "Multipart/Alternative", + "begin": 4263724, + "headersEnd": 4263787, + "children": [ + { + "mimeType": "Message/External-body", + "begin": 4263802, + "headersEnd": 4263922, + "message": { + "begin": 4263922, + "headersEnd": 4264002, + "body": { + "mimeType": "text/plain", + "begin": 4263922, + "headersEnd": 4264002, + "end": 4264071, + "octets": 69, + "lines": 2 + }, + "end": 4264071, + "octets": 69, + "lines": 2 + }, + "end": 4264071, + "octets": 149, + "lines": 5 + }, + { + "mimeType": "Message/External-body", + "begin": 4264088, + "headersEnd": 4264281, + "message": { + "begin": 4264281, + "headersEnd": 4264361, + "body": { + "mimeType": "text/plain", + "begin": 4264281, + "headersEnd": 4264361, + "end": 4264361, + "octets": 0, + "lines": 0 + }, + "end": 4264361, + "octets": 0, + "lines": 0 + }, + "end": 4264359, + "octets": 78, + "lines": 2 + } + ], + "end": 4264378, + "octets": 591, + "lines": 22 + } + ], + "end": 4264394, + "octets": 3967, + "lines": 95 + }, + "end": 4264394, + "octets": 3967, + "lines": 95 + }, + { + "mboxMarkerBegin": 4264396, + "mboxMarkerLength": 7, + "begin": 4264405, + "headersEnd": 4264885, + "body": { + "mimeType": "multipart/mixed", + "begin": 4264405, + "headersEnd": 4264885, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 4264961, + "headersEnd": 4265110, + "message": { + "begin": 4265110, + "headersEnd": 4265550, + "body": { + "mimeType": "text/plain", + "begin": 4265110, + "headersEnd": 4265550, + "end": 4265589, + "octets": 39, + "lines": 2 + }, + "end": 4265589, + "octets": 39, + "lines": 2 + }, + "end": 4265589, + "octets": 479, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 4265619, + "headersEnd": 4265746, + "end": 4266210, + "octets": 464, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4266240, + "headersEnd": 4266367, + "end": 4266859, + "octets": 492, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4266889, + "headersEnd": 4267020, + "end": 4267554, + "octets": 534, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 4267584, + "headersEnd": 4267713, + "end": 4268217, + "octets": 504, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 4268247, + "headersEnd": 4268396, + "message": { + "begin": 4268396, + "headersEnd": 4268836, + "body": { + "mimeType": "text/plain", + "begin": 4268396, + "headersEnd": 4268836, + "end": 4268874, + "octets": 38, + "lines": 1 + }, + "end": 4268874, + "octets": 38, + "lines": 1 + }, + "end": 4268874, + "octets": 478, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 4268904, + "headersEnd": 4269080, + "message": { + "begin": 4269080, + "headersEnd": 4269665, + "body": { + "mimeType": "message/rfc822", + "begin": 4269080, + "headersEnd": 4269665, + "message": { + "begin": 4269665, + "headersEnd": 4270190, + "body": { + "mimeType": "message/rfc822", + "begin": 4269665, + "headersEnd": 4270190, + "message": { + "begin": 4270190, + "headersEnd": 4270611, + "body": { + "mimeType": "text/plain", + "begin": 4270190, + "headersEnd": 4270611, + "end": 4270617, + "octets": 6, + "lines": 1 + }, + "end": 4270617, + "octets": 6, + "lines": 1 + }, + "end": 4270617, + "octets": 427, + "lines": 12 + }, + "end": 4270617, + "octets": 427, + "lines": 12 + }, + "end": 4270617, + "octets": 952, + "lines": 26 + }, + "end": 4270617, + "octets": 952, + "lines": 26 + }, + "end": 4270617, + "octets": 1537, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 4270647, + "headersEnd": 4270703, + "end": 4270756, + "octets": 53, + "lines": 1 + } + ], + "end": 4270786, + "octets": 5901, + "lines": 145 + }, + "end": 4270786, + "octets": 5901, + "lines": 145 + }, + { + "mboxMarkerBegin": 4270788, + "mboxMarkerLength": 7, + "begin": 4270797, + "headersEnd": 4271280, + "body": { + "mimeType": "multipart/mixed", + "begin": 4270797, + "headersEnd": 4271280, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 4271356, + "headersEnd": 4271509, + "message": { + "begin": 4271509, + "headersEnd": 4271948, + "body": { + "mimeType": "text/plain", + "begin": 4271509, + "headersEnd": 4271948, + "end": 4271987, + "octets": 39, + "lines": 2 + }, + "end": 4271987, + "octets": 39, + "lines": 2 + }, + "end": 4271987, + "octets": 478, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 4272017, + "headersEnd": 4272148, + "end": 4272612, + "octets": 464, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4272642, + "headersEnd": 4272773, + "end": 4273265, + "octets": 492, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4273295, + "headersEnd": 4273430, + "end": 4273964, + "octets": 534, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 4273994, + "headersEnd": 4274127, + "end": 4274631, + "octets": 504, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 4274661, + "headersEnd": 4274814, + "message": { + "begin": 4274814, + "headersEnd": 4275253, + "body": { + "mimeType": "text/plain", + "begin": 4274814, + "headersEnd": 4275253, + "end": 4275291, + "octets": 38, + "lines": 1 + }, + "end": 4275291, + "octets": 38, + "lines": 1 + }, + "end": 4275291, + "octets": 477, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 4275321, + "headersEnd": 4275501, + "message": { + "begin": 4275501, + "headersEnd": 4276089, + "body": { + "mimeType": "message/rfc822", + "begin": 4275501, + "headersEnd": 4276089, + "message": { + "begin": 4276089, + "headersEnd": 4276617, + "body": { + "mimeType": "message/rfc822", + "begin": 4276089, + "headersEnd": 4276617, + "message": { + "begin": 4276617, + "headersEnd": 4277037, + "body": { + "mimeType": "text/plain", + "begin": 4276617, + "headersEnd": 4277037, + "end": 4277043, + "octets": 6, + "lines": 1 + }, + "end": 4277043, + "octets": 6, + "lines": 1 + }, + "end": 4277043, + "octets": 426, + "lines": 12 + }, + "end": 4277043, + "octets": 426, + "lines": 12 + }, + "end": 4277043, + "octets": 954, + "lines": 26 + }, + "end": 4277043, + "octets": 954, + "lines": 26 + }, + "end": 4277043, + "octets": 1542, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 4277073, + "headersEnd": 4277133, + "end": 4277186, + "octets": 53, + "lines": 1 + } + ], + "end": 4277216, + "octets": 5936, + "lines": 145 + }, + "end": 4277216, + "octets": 5936, + "lines": 145 + }, + { + "mboxMarkerBegin": 4277218, + "mboxMarkerLength": 7, + "begin": 4277227, + "headersEnd": 4277931, + "body": { + "mimeType": "multipart/mixed", + "begin": 4277227, + "headersEnd": 4277931, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4277981, + "headersEnd": 4278012, + "end": 4278458, + "octets": 446, + "lines": 30 + }, + { + "mimeType": "text/enriched", + "begin": 4278467, + "headersEnd": 4278543, + "end": 4279216, + "octets": 673, + "lines": 42 + }, + { + "mimeType": "text/plain", + "begin": 4279225, + "headersEnd": 4279227, + "end": 4279245, + "octets": 18, + "lines": 1 + }, + { + "mimeType": "text/plain", + "begin": 4279254, + "headersEnd": 4279256, + "end": 4279267, + "octets": 11, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 4279276, + "headersEnd": 4279308, + "message": { + "begin": 4279308, + "headersEnd": 4279530, + "body": { + "mimeType": "multipart/mixed", + "begin": 4279308, + "headersEnd": 4279530, + "children": [ + { + "mimeType": "text/html", + "begin": 4279537, + "headersEnd": 4279564, + "end": 4279587, + "octets": 23, + "lines": 1 + }, + { + "mimeType": "image/unknown", + "begin": 4279596, + "headersEnd": 4279776, + "end": 4279815, + "octets": 39, + "lines": 1 + } + ], + "end": 4279824, + "octets": 294, + "lines": 13 + }, + "end": 4279824, + "octets": 294, + "lines": 13 + }, + "end": 4279824, + "octets": 516, + "lines": 20 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 4279833, + "headersEnd": 4279914, + "end": 4289472, + "octets": 9558, + "lines": 128 + }, + { + "mimeType": "image/unknown", + "begin": 4289481, + "headersEnd": 4289661, + "end": 4289700, + "octets": 39, + "lines": 1 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 4289709, + "headersEnd": 4289861, + "end": 4297809, + "octets": 7948, + "lines": 128 + }, + { + "mimeType": "multipart/digest", + "begin": 4297818, + "headersEnd": 4297872, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 4297883, + "headersEnd": 4297885, + "message": { + "begin": 4297885, + "headersEnd": 4297914, + "body": { + "mimeType": "text/plain", + "begin": 4297885, + "headersEnd": 4297914, + "end": 4297919, + "octets": 5, + "lines": 1 + }, + "end": 4297919, + "octets": 5, + "lines": 1 + }, + "end": 4297919, + "octets": 34, + "lines": 4 + }, + { + "mimeType": "message/rfc822", + "begin": 4297932, + "headersEnd": 4297934, + "message": { + "begin": 4297934, + "headersEnd": 4297963, + "body": { + "mimeType": "text/plain", + "begin": 4297934, + "headersEnd": 4297963, + "end": 4297968, + "octets": 5, + "lines": 1 + }, + "end": 4297968, + "octets": 5, + "lines": 1 + }, + "end": 4297968, + "octets": 34, + "lines": 4 + }, + { + "mimeType": "message/rfc822", + "begin": 4297981, + "headersEnd": 4297983, + "message": { + "begin": 4297983, + "headersEnd": 4298012, + "body": { + "mimeType": "text/plain", + "begin": 4297983, + "headersEnd": 4298012, + "end": 4298017, + "octets": 5, + "lines": 1 + }, + "end": 4298017, + "octets": 5, + "lines": 1 + }, + "end": 4298017, + "octets": 34, + "lines": 4 + }, + { + "mimeType": "text/html", + "begin": 4298030, + "headersEnd": 4298057, + "end": 4298140, + "octets": 83, + "lines": 2 + }, + { + "mimeType": "message/rfc822", + "begin": 4298153, + "headersEnd": 4298155, + "message": { + "begin": 4298155, + "headersEnd": 4298213, + "body": { + "mimeType": "text/richtext", + "begin": 4298155, + "headersEnd": 4298213, + "end": 4298262, + "octets": 49, + "lines": 1 + }, + "end": 4298262, + "octets": 49, + "lines": 1 + }, + "end": 4298262, + "octets": 107, + "lines": 5 + }, + { + "mimeType": "message/rfc822", + "begin": 4298275, + "headersEnd": 4298277, + "message": { + "begin": 4298277, + "headersEnd": 4298306, + "body": { + "mimeType": "text/plain", + "begin": 4298277, + "headersEnd": 4298306, + "end": 4298311, + "octets": 5, + "lines": 1 + }, + "end": 4298311, + "octets": 5, + "lines": 1 + }, + "end": 4298311, + "octets": 34, + "lines": 4 + } + ], + "end": 4298324, + "octets": 452, + "lines": 37 + } + ], + "end": 4298376, + "octets": 20445, + "lines": 428 + }, + "end": 4298376, + "octets": 20445, + "lines": 428 + }, + { + "mboxMarkerBegin": 4298378, + "mboxMarkerLength": 7, + "begin": 4298387, + "headersEnd": 4299063, + "body": { + "mimeType": "multipart/mixed", + "begin": 4298387, + "headersEnd": 4299063, + "children": [ + { + "mimeType": "text/plain", + "begin": 4299090, + "headersEnd": 4299092, + "end": 4300338, + "octets": 1246, + "lines": 27 + }, + { + "mimeType": "image/pbm", + "begin": 4300367, + "headersEnd": 4300517, + "end": 4372203, + "octets": 71686, + "lines": 370 + }, + { + "mimeType": "text/plain", + "begin": 4372232, + "headersEnd": 4372234, + "end": 4372234, + "octets": 0, + "lines": 0 + } + ], + "end": 4372265, + "octets": 73202, + "lines": 409 + }, + "end": 4372265, + "octets": 73202, + "lines": 409 + }, + { + "mboxMarkerBegin": 4372267, + "mboxMarkerLength": 7, + "begin": 4372276, + "headersEnd": 4373229, + "body": { + "mimeType": "message/partial", + "begin": 4372276, + "headersEnd": 4373229, + "end": 4625700, + "octets": 252471, + "lines": 3430 + }, + "end": 4625700, + "octets": 252471, + "lines": 3430 + }, + { + "mboxMarkerBegin": 4625702, + "mboxMarkerLength": 7, + "begin": 4625711, + "headersEnd": 4626660, + "body": { + "mimeType": "multipart/mixed", + "begin": 4625711, + "headersEnd": 4626660, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4626905, + "headersEnd": 4626981, + "end": 4627454, + "octets": 473, + "lines": 9 + }, + { + "mimeType": "image/gif", + "begin": 4627502, + "headersEnd": 4627564, + "end": 4652132, + "octets": 24568, + "lines": 332 + }, + { + "mimeType": "text/richtext", + "begin": 4652180, + "headersEnd": 4652256, + "end": 4652714, + "octets": 458, + "lines": 10 + }, + { + "mimeType": "image/gif", + "begin": 4652762, + "headersEnd": 4652824, + "end": 4664192, + "octets": 11368, + "lines": 154 + }, + { + "mimeType": "text/richtext", + "begin": 4664240, + "headersEnd": 4664316, + "end": 4664626, + "octets": 310, + "lines": 6 + }, + { + "mimeType": "image/gif", + "begin": 4664674, + "headersEnd": 4664736, + "end": 4681412, + "octets": 16676, + "lines": 226 + }, + { + "mimeType": "text/richtext", + "begin": 4681460, + "headersEnd": 4681536, + "end": 4682211, + "octets": 675, + "lines": 15 + } + ], + "end": 4682261, + "octets": 55601, + "lines": 792 + }, + "end": 4682261, + "octets": 55601, + "lines": 792 + }, + { + "mboxMarkerBegin": 4682263, + "mboxMarkerLength": 7, + "begin": 4682272, + "headersEnd": 4683107, + "body": { + "mimeType": "multipart/mixed", + "begin": 4682272, + "headersEnd": 4683107, + "children": [ + { + "mimeType": "text/plain", + "begin": 4683137, + "headersEnd": 4683139, + "end": 4683807, + "octets": 668, + "lines": 18 + }, + { + "mimeType": "Image/JPEG", + "begin": 4683839, + "headersEnd": 4683902, + "end": 4731116, + "octets": 47214, + "lines": 762 + } + ], + "end": 4731150, + "octets": 48043, + "lines": 788 + }, + "end": 4731150, + "octets": 48043, + "lines": 788 + }, + { + "mboxMarkerBegin": 4731152, + "mboxMarkerLength": 7, + "begin": 4731161, + "headersEnd": 4731922, + "body": { + "mimeType": "multipart/mixed", + "begin": 4731161, + "headersEnd": 4731922, + "children": [ + { + "mimeType": "text/enriched", + "begin": 4732387, + "headersEnd": 4732463, + "end": 4737938, + "octets": 5475, + "lines": 160 + }, + { + "mimeType": "image/gif", + "begin": 4737964, + "headersEnd": 4738065, + "end": 4740681, + "octets": 2616, + "lines": 36 + }, + { + "mimeType": "text/enriched", + "begin": 4740707, + "headersEnd": 4740783, + "end": 4741311, + "octets": 528, + "lines": 10 + }, + { + "mimeType": "audio/basic", + "begin": 4741337, + "headersEnd": 4741455, + "end": 4764831, + "octets": 23376, + "lines": 316 + }, + { + "mimeType": "text/enriched", + "begin": 4764857, + "headersEnd": 4764933, + "end": 4765525, + "octets": 592, + "lines": 14 + }, + { + "mimeType": "message/external-body", + "begin": 4765551, + "headersEnd": 4765640, + "message": { + "begin": 4765640, + "headersEnd": 4765713, + "body": { + "mimeType": "text/plain", + "begin": 4765640, + "headersEnd": 4765713, + "end": 4765713, + "octets": 0, + "lines": 0 + }, + "end": 4765713, + "octets": 0, + "lines": 0 + }, + "end": 4765711, + "octets": 71, + "lines": 2 + }, + { + "mimeType": "text/enriched", + "begin": 4765737, + "headersEnd": 4765813, + "end": 4766094, + "octets": 281, + "lines": 5 + }, + { + "mimeType": "message/external-body", + "begin": 4766120, + "headersEnd": 4766273, + "message": { + "begin": 4766273, + "headersEnd": 4766346, + "body": { + "mimeType": "text/plain", + "begin": 4766273, + "headersEnd": 4766346, + "end": 4766346, + "octets": 0, + "lines": 0 + }, + "end": 4766346, + "octets": 0, + "lines": 0 + }, + "end": 4766344, + "octets": 71, + "lines": 2 + }, + { + "mimeType": "text/enriched", + "begin": 4766370, + "headersEnd": 4766446, + "end": 4767549, + "octets": 1103, + "lines": 34 + } + ], + "end": 4767575, + "octets": 35653, + "lines": 639 + }, + "end": 4767575, + "octets": 35653, + "lines": 639 + }, + { + "mboxMarkerBegin": 4767577, + "mboxMarkerLength": 7, + "begin": 4767586, + "headersEnd": 4767753, + "body": { + "mimeType": "Multipart/mixed", + "begin": 4767586, + "headersEnd": 4767753, + "children": [ + { + "mimeType": "image/gif", + "begin": 4767766, + "headersEnd": 4767838, + "end": 4845327, + "octets": 77489, + "lines": 1145 + }, + { + "mimeType": "text/plain", + "begin": 4845342, + "headersEnd": 4845344, + "end": 4845374, + "octets": 30, + "lines": 1 + } + ], + "end": 4845389, + "octets": 77636, + "lines": 1154 + }, + "end": 4845389, + "octets": 77636, + "lines": 1154 + }, + { + "mboxMarkerBegin": 4845391, + "mboxMarkerLength": 7, + "begin": 4845400, + "headersEnd": 4846638, + "body": { + "mimeType": "MULTIPART/MIXED", + "begin": 4845400, + "headersEnd": 4846638, + "children": [ + { + "mimeType": "TEXT/plain", + "begin": 4846677, + "headersEnd": 4846723, + "end": 4847183, + "octets": 460, + "lines": 8 + }, + { + "mimeType": "AUDIO/basic", + "begin": 4847224, + "headersEnd": 4847321, + "end": 4977159, + "octets": 129838, + "lines": 2095 + } + ], + "end": 4977202, + "octets": 130564, + "lines": 2114 + }, + "end": 4977202, + "octets": 130564, + "lines": 2114 + }, + { + "mboxMarkerBegin": 4977204, + "mboxMarkerLength": 7, + "begin": 4977213, + "headersEnd": 4977982, + "body": { + "mimeType": "multipart/alternative", + "begin": 4977213, + "headersEnd": 4977982, + "children": [ + { + "mimeType": "text/plain", + "begin": 4978386, + "headersEnd": 4978388, + "end": 4979201, + "octets": 813, + "lines": 18 + }, + { + "mimeType": "multipart/mixed", + "begin": 4979262, + "headersEnd": 4979368, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4979429, + "headersEnd": 4979505, + "end": 4980001, + "octets": 496, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4980064, + "headersEnd": 4980164, + "end": 4993344, + "octets": 13180, + "lines": 190 + }, + { + "mimeType": "text/plain", + "begin": 4993407, + "headersEnd": 4993480, + "end": 4993501, + "octets": 21, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 4993564, + "headersEnd": 4993664, + "end": 5050148, + "octets": 56484, + "lines": 764 + }, + { + "mimeType": "text/plain", + "begin": 5050211, + "headersEnd": 5050284, + "end": 5050341, + "octets": 57, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 5050404, + "headersEnd": 5050468, + "end": 5154020, + "octets": 103552, + "lines": 1400 + }, + { + "mimeType": "text/plain", + "begin": 5154083, + "headersEnd": 5154156, + "end": 5154160, + "octets": 4, + "lines": 2 + } + ], + "end": 5154225, + "octets": 174857, + "lines": 2407 + } + ], + "end": 5154286, + "octets": 176304, + "lines": 2440 + }, + "end": 5154286, + "octets": 176304, + "lines": 2440 + }, + { + "mboxMarkerBegin": 5154288, + "mboxMarkerLength": 7, + "begin": 5154297, + "headersEnd": 5154999, + "body": { + "mimeType": "multipart/alternative", + "begin": 5154297, + "headersEnd": 5154999, + "children": [ + { + "mimeType": "text/plain", + "begin": 5155198, + "headersEnd": 5155244, + "end": 5156788, + "octets": 1544, + "lines": 29 + }, + { + "mimeType": "multipart/mixed", + "begin": 5156831, + "headersEnd": 5156919, + "children": [ + { + "mimeType": "text/richtext", + "begin": 5156962, + "headersEnd": 5157056, + "end": 5157976, + "octets": 920, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 5158021, + "headersEnd": 5158116, + "end": 5193480, + "octets": 35364, + "lines": 506 + }, + { + "mimeType": "text/richtext", + "begin": 5193525, + "headersEnd": 5193619, + "end": 5193631, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5193676, + "headersEnd": 5193771, + "end": 5215415, + "octets": 21644, + "lines": 310 + }, + { + "mimeType": "text/richtext", + "begin": 5215460, + "headersEnd": 5215554, + "end": 5215566, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5215611, + "headersEnd": 5215706, + "end": 5248620, + "octets": 32914, + "lines": 471 + }, + { + "mimeType": "text/richtext", + "begin": 5248665, + "headersEnd": 5248759, + "end": 5248771, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5248816, + "headersEnd": 5248911, + "end": 5282837, + "octets": 33926, + "lines": 485 + }, + { + "mimeType": "text/richtext", + "begin": 5282882, + "headersEnd": 5282976, + "end": 5282988, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5283033, + "headersEnd": 5283128, + "end": 5311368, + "octets": 28240, + "lines": 404 + }, + { + "mimeType": "text/richtext", + "begin": 5311413, + "headersEnd": 5311507, + "end": 5311519, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5311564, + "headersEnd": 5311659, + "end": 5345639, + "octets": 33980, + "lines": 486 + }, + { + "mimeType": "text/richtext", + "begin": 5345684, + "headersEnd": 5345778, + "end": 5345790, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5345835, + "headersEnd": 5345930, + "end": 5372976, + "octets": 27046, + "lines": 387 + }, + { + "mimeType": "text/richtext", + "begin": 5373021, + "headersEnd": 5373115, + "end": 5373192, + "octets": 77, + "lines": 3 + } + ], + "end": 5373239, + "octets": 216320, + "lines": 3160 + } + ], + "end": 5373282, + "octets": 218283, + "lines": 3202 + }, + "end": 5373282, + "octets": 218283, + "lines": 3202 + }, + { + "mboxMarkerBegin": 5373284, + "mboxMarkerLength": 7, + "begin": 5373293, + "headersEnd": 5373698, + "body": { + "mimeType": "multipart/mixed", + "begin": 5373293, + "headersEnd": 5373698, + "children": [ + { + "mimeType": "text/richtext", + "begin": 5373947, + "headersEnd": 5374045, + "end": 5374257, + "octets": 212, + "lines": 9 + }, + { + "mimeType": "audio/basic", + "begin": 5374309, + "headersEnd": 5374373, + "end": 5464185, + "octets": 89812, + "lines": 1214 + }, + { + "mimeType": "text/plain", + "begin": 5464237, + "headersEnd": 5464265, + "end": 5464296, + "octets": 31, + "lines": 1 + } + ], + "end": 5464350, + "octets": 90652, + "lines": 1243 + }, + "end": 5464350, + "octets": 90652, + "lines": 1243 + }, + { + "mboxMarkerBegin": 5464352, + "mboxMarkerLength": 7, + "begin": 5464361, + "headersEnd": 5465317, + "body": { + "mimeType": "message/partial", + "begin": 5464361, + "headersEnd": 5465317, + "end": 5516722, + "octets": 51405, + "lines": 696 + }, + "end": 5516722, + "octets": 51405, + "lines": 696 + }, + { + "mboxMarkerBegin": 5516724, + "mboxMarkerLength": 7, + "begin": 5516733, + "headersEnd": 5517362, + "body": { + "mimeType": "multipart/mixed", + "begin": 5516733, + "headersEnd": 5517362, + "children": [ + { + "mimeType": "text/plain", + "begin": 5517381, + "headersEnd": 5517383, + "end": 5521801, + "octets": 4418, + "lines": 101 + }, + { + "mimeType": "multipart/digest", + "begin": 5521822, + "headersEnd": 5521966, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 5521998, + "headersEnd": 5522000, + "message": { + "begin": 5522000, + "headersEnd": 5522109, + "body": { + "mimeType": "text/plain", + "begin": 5522000, + "headersEnd": 5522109, + "end": 5522748, + "octets": 639, + "lines": 18 + }, + "end": 5522748, + "octets": 639, + "lines": 18 + }, + "end": 5522748, + "octets": 748, + "lines": 22 + }, + { + "mimeType": "message/rfc822", + "begin": 5522782, + "headersEnd": 5522784, + "message": { + "begin": 5522784, + "headersEnd": 5522909, + "body": { + "mimeType": "text/plain", + "begin": 5522784, + "headersEnd": 5522909, + "end": 5523662, + "octets": 753, + "lines": 20 + }, + "end": 5523662, + "octets": 753, + "lines": 20 + }, + "end": 5523662, + "octets": 878, + "lines": 24 + }, + { + "mimeType": "message/rfc822", + "begin": 5523696, + "headersEnd": 5523698, + "message": { + "begin": 5523698, + "headersEnd": 5523821, + "body": { + "mimeType": "text/plain", + "begin": 5523698, + "headersEnd": 5523821, + "end": 5524481, + "octets": 660, + "lines": 14 + }, + "end": 5524481, + "octets": 660, + "lines": 14 + }, + "end": 5524481, + "octets": 783, + "lines": 18 + }, + { + "mimeType": "message/rfc822", + "begin": 5524515, + "headersEnd": 5524517, + "message": { + "begin": 5524517, + "headersEnd": 5524677, + "body": { + "mimeType": "text/plain", + "begin": 5524517, + "headersEnd": 5524677, + "end": 5525170, + "octets": 493, + "lines": 10 + }, + "end": 5525170, + "octets": 493, + "lines": 10 + }, + "end": 5525170, + "octets": 653, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5525204, + "headersEnd": 5525206, + "message": { + "begin": 5525206, + "headersEnd": 5525364, + "body": { + "mimeType": "text/plain", + "begin": 5525206, + "headersEnd": 5525364, + "end": 5525951, + "octets": 587, + "lines": 15 + }, + "end": 5525951, + "octets": 587, + "lines": 15 + }, + "end": 5525951, + "octets": 745, + "lines": 19 + }, + { + "mimeType": "message/rfc822", + "begin": 5525985, + "headersEnd": 5525987, + "message": { + "begin": 5525987, + "headersEnd": 5526148, + "body": { + "mimeType": "text/plain", + "begin": 5525987, + "headersEnd": 5526148, + "end": 5527449, + "octets": 1301, + "lines": 26 + }, + "end": 5527449, + "octets": 1301, + "lines": 26 + }, + "end": 5527449, + "octets": 1462, + "lines": 30 + }, + { + "mimeType": "message/rfc822", + "begin": 5527483, + "headersEnd": 5527485, + "message": { + "begin": 5527485, + "headersEnd": 5527642, + "body": { + "mimeType": "text/plain", + "begin": 5527485, + "headersEnd": 5527642, + "end": 5528052, + "octets": 410, + "lines": 9 + }, + "end": 5528052, + "octets": 410, + "lines": 9 + }, + "end": 5528052, + "octets": 567, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5528086, + "headersEnd": 5528088, + "message": { + "begin": 5528088, + "headersEnd": 5528239, + "body": { + "mimeType": "text/plain", + "begin": 5528088, + "headersEnd": 5528239, + "end": 5528642, + "octets": 403, + "lines": 7 + }, + "end": 5528642, + "octets": 403, + "lines": 7 + }, + "end": 5528642, + "octets": 554, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5528676, + "headersEnd": 5528678, + "message": { + "begin": 5528678, + "headersEnd": 5528825, + "body": { + "mimeType": "text/plain", + "begin": 5528678, + "headersEnd": 5528825, + "end": 5529476, + "octets": 651, + "lines": 11 + }, + "end": 5529476, + "octets": 651, + "lines": 11 + }, + "end": 5529476, + "octets": 798, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5529510, + "headersEnd": 5529512, + "message": { + "begin": 5529512, + "headersEnd": 5529653, + "body": { + "mimeType": "text/plain", + "begin": 5529512, + "headersEnd": 5529653, + "end": 5530649, + "octets": 996, + "lines": 19 + }, + "end": 5530649, + "octets": 996, + "lines": 19 + }, + "end": 5530649, + "octets": 1137, + "lines": 23 + }, + { + "mimeType": "message/rfc822", + "begin": 5530683, + "headersEnd": 5530685, + "message": { + "begin": 5530685, + "headersEnd": 5530836, + "body": { + "mimeType": "text/plain", + "begin": 5530685, + "headersEnd": 5530836, + "end": 5531753, + "octets": 917, + "lines": 27 + }, + "end": 5531753, + "octets": 917, + "lines": 27 + }, + "end": 5531753, + "octets": 1068, + "lines": 31 + }, + { + "mimeType": "message/rfc822", + "begin": 5531787, + "headersEnd": 5531789, + "message": { + "begin": 5531789, + "headersEnd": 5531924, + "body": { + "mimeType": "text/plain", + "begin": 5531789, + "headersEnd": 5531924, + "end": 5532494, + "octets": 570, + "lines": 11 + }, + "end": 5532494, + "octets": 570, + "lines": 11 + }, + "end": 5532494, + "octets": 705, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5532528, + "headersEnd": 5532530, + "message": { + "begin": 5532530, + "headersEnd": 5532666, + "body": { + "mimeType": "text/plain", + "begin": 5532530, + "headersEnd": 5532666, + "end": 5533113, + "octets": 447, + "lines": 10 + }, + "end": 5533113, + "octets": 447, + "lines": 10 + }, + "end": 5533113, + "octets": 583, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5533147, + "headersEnd": 5533149, + "message": { + "begin": 5533149, + "headersEnd": 5533270, + "body": { + "mimeType": "text/plain", + "begin": 5533149, + "headersEnd": 5533270, + "end": 5533837, + "octets": 567, + "lines": 15 + }, + "end": 5533837, + "octets": 567, + "lines": 15 + }, + "end": 5533837, + "octets": 688, + "lines": 19 + }, + { + "mimeType": "message/rfc822", + "begin": 5533871, + "headersEnd": 5533873, + "message": { + "begin": 5533873, + "headersEnd": 5533992, + "body": { + "mimeType": "text/plain", + "begin": 5533873, + "headersEnd": 5533992, + "end": 5534185, + "octets": 193, + "lines": 8 + }, + "end": 5534185, + "octets": 193, + "lines": 8 + }, + "end": 5534185, + "octets": 312, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5534219, + "headersEnd": 5534221, + "message": { + "begin": 5534221, + "headersEnd": 5534342, + "body": { + "mimeType": "text/plain", + "begin": 5534221, + "headersEnd": 5534342, + "end": 5534677, + "octets": 335, + "lines": 7 + }, + "end": 5534677, + "octets": 335, + "lines": 7 + }, + "end": 5534677, + "octets": 456, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5534711, + "headersEnd": 5534713, + "message": { + "begin": 5534713, + "headersEnd": 5534840, + "body": { + "mimeType": "text/plain", + "begin": 5534713, + "headersEnd": 5534840, + "end": 5535528, + "octets": 688, + "lines": 21 + }, + "end": 5535528, + "octets": 688, + "lines": 21 + }, + "end": 5535528, + "octets": 815, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5535562, + "headersEnd": 5535564, + "message": { + "begin": 5535564, + "headersEnd": 5535692, + "body": { + "mimeType": "text/plain", + "begin": 5535564, + "headersEnd": 5535692, + "end": 5535799, + "octets": 107, + "lines": 5 + }, + "end": 5535799, + "octets": 107, + "lines": 5 + }, + "end": 5535799, + "octets": 235, + "lines": 9 + }, + { + "mimeType": "message/rfc822", + "begin": 5535833, + "headersEnd": 5535835, + "message": { + "begin": 5535835, + "headersEnd": 5535981, + "body": { + "mimeType": "text/plain", + "begin": 5535835, + "headersEnd": 5535981, + "end": 5536838, + "octets": 857, + "lines": 21 + }, + "end": 5536838, + "octets": 857, + "lines": 21 + }, + "end": 5536838, + "octets": 1003, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5536872, + "headersEnd": 5536874, + "message": { + "begin": 5536874, + "headersEnd": 5536988, + "body": { + "mimeType": "text/plain", + "begin": 5536874, + "headersEnd": 5536988, + "end": 5537416, + "octets": 428, + "lines": 9 + }, + "end": 5537416, + "octets": 428, + "lines": 9 + }, + "end": 5537416, + "octets": 542, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5537450, + "headersEnd": 5537452, + "message": { + "begin": 5537452, + "headersEnd": 5537628, + "body": { + "mimeType": "text/plain", + "begin": 5537452, + "headersEnd": 5537628, + "end": 5537867, + "octets": 239, + "lines": 9 + }, + "end": 5537867, + "octets": 239, + "lines": 9 + }, + "end": 5537867, + "octets": 415, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5537901, + "headersEnd": 5537903, + "message": { + "begin": 5537903, + "headersEnd": 5538033, + "body": { + "mimeType": "text/plain", + "begin": 5537903, + "headersEnd": 5538033, + "end": 5538444, + "octets": 411, + "lines": 12 + }, + "end": 5538444, + "octets": 411, + "lines": 12 + }, + "end": 5538444, + "octets": 541, + "lines": 16 + }, + { + "mimeType": "message/rfc822", + "begin": 5538478, + "headersEnd": 5538480, + "message": { + "begin": 5538480, + "headersEnd": 5538601, + "body": { + "mimeType": "text/plain", + "begin": 5538480, + "headersEnd": 5538601, + "end": 5539533, + "octets": 932, + "lines": 28 + }, + "end": 5539533, + "octets": 932, + "lines": 28 + }, + "end": 5539533, + "octets": 1053, + "lines": 32 + }, + { + "mimeType": "message/rfc822", + "begin": 5539567, + "headersEnd": 5539569, + "message": { + "begin": 5539569, + "headersEnd": 5539701, + "body": { + "mimeType": "text/plain", + "begin": 5539569, + "headersEnd": 5539701, + "end": 5540001, + "octets": 300, + "lines": 9 + }, + "end": 5540001, + "octets": 300, + "lines": 9 + }, + "end": 5540001, + "octets": 432, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5540035, + "headersEnd": 5540037, + "message": { + "begin": 5540037, + "headersEnd": 5540170, + "body": { + "mimeType": "text/plain", + "begin": 5540037, + "headersEnd": 5540170, + "end": 5540594, + "octets": 424, + "lines": 14 + }, + "end": 5540594, + "octets": 424, + "lines": 14 + }, + "end": 5540594, + "octets": 557, + "lines": 18 + }, + { + "mimeType": "message/rfc822", + "begin": 5540628, + "headersEnd": 5540630, + "message": { + "begin": 5540630, + "headersEnd": 5540749, + "body": { + "mimeType": "text/plain", + "begin": 5540630, + "headersEnd": 5540749, + "end": 5540898, + "octets": 149, + "lines": 4 + }, + "end": 5540898, + "octets": 149, + "lines": 4 + }, + "end": 5540898, + "octets": 268, + "lines": 8 + }, + { + "mimeType": "message/rfc822", + "begin": 5540932, + "headersEnd": 5540934, + "message": { + "begin": 5540934, + "headersEnd": 5541063, + "body": { + "mimeType": "text/plain", + "begin": 5540934, + "headersEnd": 5541063, + "end": 5541249, + "octets": 186, + "lines": 7 + }, + "end": 5541249, + "octets": 186, + "lines": 7 + }, + "end": 5541249, + "octets": 315, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5541283, + "headersEnd": 5541285, + "message": { + "begin": 5541285, + "headersEnd": 5541419, + "body": { + "mimeType": "text/plain", + "begin": 5541285, + "headersEnd": 5541419, + "end": 5542149, + "octets": 730, + "lines": 14 + }, + "end": 5542149, + "octets": 730, + "lines": 14 + }, + "end": 5542149, + "octets": 864, + "lines": 18 + }, + { + "mimeType": "message/rfc822", + "begin": 5542183, + "headersEnd": 5542185, + "message": { + "begin": 5542185, + "headersEnd": 5542335, + "body": { + "mimeType": "text/plain", + "begin": 5542185, + "headersEnd": 5542335, + "end": 5543318, + "octets": 983, + "lines": 26 + }, + "end": 5543318, + "octets": 983, + "lines": 26 + }, + "end": 5543318, + "octets": 1133, + "lines": 30 + }, + { + "mimeType": "message/rfc822", + "begin": 5543352, + "headersEnd": 5543354, + "message": { + "begin": 5543354, + "headersEnd": 5543492, + "body": { + "mimeType": "text/plain", + "begin": 5543354, + "headersEnd": 5543492, + "end": 5543746, + "octets": 254, + "lines": 7 + }, + "end": 5543746, + "octets": 254, + "lines": 7 + }, + "end": 5543746, + "octets": 392, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5543780, + "headersEnd": 5543782, + "message": { + "begin": 5543782, + "headersEnd": 5543908, + "body": { + "mimeType": "text/plain", + "begin": 5543782, + "headersEnd": 5543908, + "end": 5544041, + "octets": 133, + "lines": 6 + }, + "end": 5544041, + "octets": 133, + "lines": 6 + }, + "end": 5544041, + "octets": 259, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5544075, + "headersEnd": 5544077, + "message": { + "begin": 5544077, + "headersEnd": 5544257, + "body": { + "mimeType": "text/plain", + "begin": 5544077, + "headersEnd": 5544257, + "end": 5545018, + "octets": 761, + "lines": 16 + }, + "end": 5545018, + "octets": 761, + "lines": 16 + }, + "end": 5545018, + "octets": 941, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5545052, + "headersEnd": 5545054, + "message": { + "begin": 5545054, + "headersEnd": 5545218, + "body": { + "mimeType": "text/plain", + "begin": 5545054, + "headersEnd": 5545218, + "end": 5545633, + "octets": 415, + "lines": 16 + }, + "end": 5545633, + "octets": 415, + "lines": 16 + }, + "end": 5545633, + "octets": 579, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5545667, + "headersEnd": 5545669, + "message": { + "begin": 5545669, + "headersEnd": 5545805, + "body": { + "mimeType": "text/plain", + "begin": 5545669, + "headersEnd": 5545805, + "end": 5547113, + "octets": 1308, + "lines": 21 + }, + "end": 5547113, + "octets": 1308, + "lines": 21 + }, + "end": 5547113, + "octets": 1444, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5547147, + "headersEnd": 5547149, + "message": { + "begin": 5547149, + "headersEnd": 5547259, + "body": { + "mimeType": "text/plain", + "begin": 5547149, + "headersEnd": 5547259, + "end": 5547408, + "octets": 149, + "lines": 6 + }, + "end": 5547408, + "octets": 149, + "lines": 6 + }, + "end": 5547408, + "octets": 259, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5547442, + "headersEnd": 5547444, + "message": { + "begin": 5547444, + "headersEnd": 5547585, + "body": { + "mimeType": "text/plain", + "begin": 5547444, + "headersEnd": 5547585, + "end": 5547895, + "octets": 310, + "lines": 11 + }, + "end": 5547895, + "octets": 310, + "lines": 11 + }, + "end": 5547895, + "octets": 451, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5547929, + "headersEnd": 5547931, + "message": { + "begin": 5547931, + "headersEnd": 5548061, + "body": { + "mimeType": "text/plain", + "begin": 5547931, + "headersEnd": 5548061, + "end": 5548254, + "octets": 193, + "lines": 6 + }, + "end": 5548254, + "octets": 193, + "lines": 6 + }, + "end": 5548254, + "octets": 323, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5548288, + "headersEnd": 5548290, + "message": { + "begin": 5548290, + "headersEnd": 5548399, + "body": { + "mimeType": "text/plain", + "begin": 5548290, + "headersEnd": 5548399, + "end": 5548809, + "octets": 410, + "lines": 12 + }, + "end": 5548809, + "octets": 410, + "lines": 12 + }, + "end": 5548809, + "octets": 519, + "lines": 16 + }, + { + "mimeType": "message/rfc822", + "begin": 5548843, + "headersEnd": 5548845, + "message": { + "begin": 5548845, + "headersEnd": 5548983, + "body": { + "mimeType": "text/plain", + "begin": 5548845, + "headersEnd": 5548983, + "end": 5549293, + "octets": 310, + "lines": 8 + }, + "end": 5549293, + "octets": 310, + "lines": 8 + }, + "end": 5549293, + "octets": 448, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5549327, + "headersEnd": 5549329, + "message": { + "begin": 5549329, + "headersEnd": 5549476, + "body": { + "mimeType": "text/plain", + "begin": 5549329, + "headersEnd": 5549476, + "end": 5550111, + "octets": 635, + "lines": 17 + }, + "end": 5550111, + "octets": 635, + "lines": 17 + }, + "end": 5550111, + "octets": 782, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5550145, + "headersEnd": 5550147, + "message": { + "begin": 5550147, + "headersEnd": 5550304, + "body": { + "mimeType": "text/plain", + "begin": 5550147, + "headersEnd": 5550304, + "end": 5550789, + "octets": 485, + "lines": 10 + }, + "end": 5550789, + "octets": 485, + "lines": 10 + }, + "end": 5550789, + "octets": 642, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5550823, + "headersEnd": 5550825, + "message": { + "begin": 5550825, + "headersEnd": 5550962, + "body": { + "mimeType": "text/plain", + "begin": 5550825, + "headersEnd": 5550962, + "end": 5552161, + "octets": 1199, + "lines": 27 + }, + "end": 5552161, + "octets": 1199, + "lines": 27 + }, + "end": 5552161, + "octets": 1336, + "lines": 31 + }, + { + "mimeType": "message/rfc822", + "begin": 5552195, + "headersEnd": 5552197, + "message": { + "begin": 5552197, + "headersEnd": 5552377, + "body": { + "mimeType": "text/plain", + "begin": 5552197, + "headersEnd": 5552377, + "end": 5552644, + "octets": 267, + "lines": 8 + }, + "end": 5552644, + "octets": 267, + "lines": 8 + }, + "end": 5552644, + "octets": 447, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5552678, + "headersEnd": 5552680, + "message": { + "begin": 5552680, + "headersEnd": 5552799, + "body": { + "mimeType": "text/plain", + "begin": 5552680, + "headersEnd": 5552799, + "end": 5552996, + "octets": 197, + "lines": 4 + }, + "end": 5552996, + "octets": 197, + "lines": 4 + }, + "end": 5552996, + "octets": 316, + "lines": 8 + }, + { + "mimeType": "message/rfc822", + "begin": 5553030, + "headersEnd": 5553032, + "message": { + "begin": 5553032, + "headersEnd": 5553176, + "body": { + "mimeType": "text/plain", + "begin": 5553032, + "headersEnd": 5553176, + "end": 5554065, + "octets": 889, + "lines": 24 + }, + "end": 5554065, + "octets": 889, + "lines": 24 + }, + "end": 5554065, + "octets": 1033, + "lines": 28 + }, + { + "mimeType": "message/rfc822", + "begin": 5554099, + "headersEnd": 5554101, + "message": { + "begin": 5554101, + "headersEnd": 5554230, + "body": { + "mimeType": "text/plain", + "begin": 5554101, + "headersEnd": 5554230, + "end": 5554955, + "octets": 725, + "lines": 11 + }, + "end": 5554955, + "octets": 725, + "lines": 11 + }, + "end": 5554955, + "octets": 854, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5554989, + "headersEnd": 5554991, + "message": { + "begin": 5554991, + "headersEnd": 5555107, + "body": { + "mimeType": "text/plain", + "begin": 5554991, + "headersEnd": 5555107, + "end": 5555827, + "octets": 720, + "lines": 17 + }, + "end": 5555827, + "octets": 720, + "lines": 17 + }, + "end": 5555827, + "octets": 836, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5555861, + "headersEnd": 5555863, + "message": { + "begin": 5555863, + "headersEnd": 5555999, + "body": { + "mimeType": "text/plain", + "begin": 5555863, + "headersEnd": 5555999, + "end": 5556390, + "octets": 391, + "lines": 11 + }, + "end": 5556390, + "octets": 391, + "lines": 11 + }, + "end": 5556390, + "octets": 527, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5556424, + "headersEnd": 5556426, + "message": { + "begin": 5556426, + "headersEnd": 5556566, + "body": { + "mimeType": "text/plain", + "begin": 5556426, + "headersEnd": 5556566, + "end": 5557567, + "octets": 1001, + "lines": 24 + }, + "end": 5557567, + "octets": 1001, + "lines": 24 + }, + "end": 5557567, + "octets": 1141, + "lines": 28 + }, + { + "mimeType": "message/rfc822", + "begin": 5557601, + "headersEnd": 5557603, + "message": { + "begin": 5557603, + "headersEnd": 5557752, + "body": { + "mimeType": "text/plain", + "begin": 5557603, + "headersEnd": 5557752, + "end": 5558229, + "octets": 477, + "lines": 10 + }, + "end": 5558229, + "octets": 477, + "lines": 10 + }, + "end": 5558229, + "octets": 626, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5558263, + "headersEnd": 5558265, + "message": { + "begin": 5558265, + "headersEnd": 5558402, + "body": { + "mimeType": "text/plain", + "begin": 5558265, + "headersEnd": 5558402, + "end": 5558691, + "octets": 289, + "lines": 10 + }, + "end": 5558691, + "octets": 289, + "lines": 10 + }, + "end": 5558691, + "octets": 426, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5558725, + "headersEnd": 5558727, + "message": { + "begin": 5558727, + "headersEnd": 5558856, + "body": { + "mimeType": "text/plain", + "begin": 5558727, + "headersEnd": 5558856, + "end": 5559142, + "octets": 286, + "lines": 4 + }, + "end": 5559142, + "octets": 286, + "lines": 4 + }, + "end": 5559142, + "octets": 415, + "lines": 8 + }, + { + "mimeType": "message/rfc822", + "begin": 5559176, + "headersEnd": 5559178, + "message": { + "begin": 5559178, + "headersEnd": 5559303, + "body": { + "mimeType": "text/plain", + "begin": 5559178, + "headersEnd": 5559303, + "end": 5559973, + "octets": 670, + "lines": 27 + }, + "end": 5559973, + "octets": 670, + "lines": 27 + }, + "end": 5559973, + "octets": 795, + "lines": 31 + }, + { + "mimeType": "message/rfc822", + "begin": 5560007, + "headersEnd": 5560009, + "message": { + "begin": 5560009, + "headersEnd": 5560157, + "body": { + "mimeType": "text/plain", + "begin": 5560009, + "headersEnd": 5560157, + "end": 5562461, + "octets": 2304, + "lines": 46 + }, + "end": 5562461, + "octets": 2304, + "lines": 46 + }, + "end": 5562461, + "octets": 2452, + "lines": 50 + }, + { + "mimeType": "message/rfc822", + "begin": 5562495, + "headersEnd": 5562497, + "message": { + "begin": 5562497, + "headersEnd": 5562623, + "body": { + "mimeType": "text/plain", + "begin": 5562497, + "headersEnd": 5562623, + "end": 5563432, + "octets": 809, + "lines": 17 + }, + "end": 5563432, + "octets": 809, + "lines": 17 + }, + "end": 5563432, + "octets": 935, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5563466, + "headersEnd": 5563468, + "message": { + "begin": 5563468, + "headersEnd": 5563566, + "body": { + "mimeType": "text/plain", + "begin": 5563468, + "headersEnd": 5563566, + "end": 5563802, + "octets": 236, + "lines": 10 + }, + "end": 5563802, + "octets": 236, + "lines": 10 + }, + "end": 5563802, + "octets": 334, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5563836, + "headersEnd": 5563838, + "message": { + "begin": 5563838, + "headersEnd": 5563963, + "body": { + "mimeType": "text/plain", + "begin": 5563838, + "headersEnd": 5563963, + "end": 5564651, + "octets": 688, + "lines": 20 + }, + "end": 5564651, + "octets": 688, + "lines": 20 + }, + "end": 5564651, + "octets": 813, + "lines": 24 + }, + { + "mimeType": "message/rfc822", + "begin": 5564685, + "headersEnd": 5564687, + "message": { + "begin": 5564687, + "headersEnd": 5564801, + "body": { + "mimeType": "text/plain", + "begin": 5564687, + "headersEnd": 5564801, + "end": 5567416, + "octets": 2615, + "lines": 68 + }, + "end": 5567416, + "octets": 2615, + "lines": 68 + }, + "end": 5567416, + "octets": 2729, + "lines": 72 + }, + { + "mimeType": "message/rfc822", + "begin": 5567450, + "headersEnd": 5567452, + "message": { + "begin": 5567452, + "headersEnd": 5567562, + "body": { + "mimeType": "text/plain", + "begin": 5567452, + "headersEnd": 5567562, + "end": 5568805, + "octets": 1243, + "lines": 34 + }, + "end": 5568805, + "octets": 1243, + "lines": 34 + }, + "end": 5568805, + "octets": 1353, + "lines": 38 + }, + { + "mimeType": "message/rfc822", + "begin": 5568839, + "headersEnd": 5568841, + "message": { + "begin": 5568841, + "headersEnd": 5568951, + "body": { + "mimeType": "text/plain", + "begin": 5568841, + "headersEnd": 5568951, + "end": 5570791, + "octets": 1840, + "lines": 43 + }, + "end": 5570791, + "octets": 1840, + "lines": 43 + }, + "end": 5570791, + "octets": 1950, + "lines": 47 + }, + { + "mimeType": "message/rfc822", + "begin": 5570825, + "headersEnd": 5570827, + "message": { + "begin": 5570827, + "headersEnd": 5570960, + "body": { + "mimeType": "text/plain", + "begin": 5570827, + "headersEnd": 5570960, + "end": 5571542, + "octets": 582, + "lines": 12 + }, + "end": 5571542, + "octets": 582, + "lines": 12 + }, + "end": 5571542, + "octets": 715, + "lines": 16 + }, + { + "mimeType": "message/rfc822", + "begin": 5571576, + "headersEnd": 5571578, + "message": { + "begin": 5571578, + "headersEnd": 5571670, + "body": { + "mimeType": "text/plain", + "begin": 5571578, + "headersEnd": 5571670, + "end": 5573024, + "octets": 1354, + "lines": 20 + }, + "end": 5573024, + "octets": 1354, + "lines": 20 + }, + "end": 5573024, + "octets": 1446, + "lines": 24 + }, + { + "mimeType": "message/rfc822", + "begin": 5573058, + "headersEnd": 5573060, + "message": { + "begin": 5573060, + "headersEnd": 5573180, + "body": { + "mimeType": "text/plain", + "begin": 5573060, + "headersEnd": 5573180, + "end": 5575356, + "octets": 2176, + "lines": 49 + }, + "end": 5575356, + "octets": 2176, + "lines": 49 + }, + "end": 5575356, + "octets": 2296, + "lines": 53 + }, + { + "mimeType": "message/rfc822", + "begin": 5575390, + "headersEnd": 5575392, + "message": { + "begin": 5575392, + "headersEnd": 5575517, + "body": { + "mimeType": "text/plain", + "begin": 5575392, + "headersEnd": 5575517, + "end": 5577580, + "octets": 2063, + "lines": 42 + }, + "end": 5577580, + "octets": 2063, + "lines": 42 + }, + "end": 5577580, + "octets": 2188, + "lines": 46 + }, + { + "mimeType": "message/rfc822", + "begin": 5577614, + "headersEnd": 5577616, + "message": { + "begin": 5577616, + "headersEnd": 5577741, + "body": { + "mimeType": "text/plain", + "begin": 5577616, + "headersEnd": 5577741, + "end": 5578437, + "octets": 696, + "lines": 19 + }, + "end": 5578437, + "octets": 696, + "lines": 19 + }, + "end": 5578437, + "octets": 821, + "lines": 23 + }, + { + "mimeType": "message/rfc822", + "begin": 5578471, + "headersEnd": 5578473, + "message": { + "begin": 5578473, + "headersEnd": 5578614, + "body": { + "mimeType": "text/plain", + "begin": 5578473, + "headersEnd": 5578614, + "end": 5579450, + "octets": 836, + "lines": 16 + }, + "end": 5579450, + "octets": 836, + "lines": 16 + }, + "end": 5579450, + "octets": 977, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5579484, + "headersEnd": 5579486, + "message": { + "begin": 5579486, + "headersEnd": 5579614, + "body": { + "mimeType": "text/plain", + "begin": 5579486, + "headersEnd": 5579614, + "end": 5580359, + "octets": 745, + "lines": 21 + }, + "end": 5580359, + "octets": 745, + "lines": 21 + }, + "end": 5580359, + "octets": 873, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5580393, + "headersEnd": 5580395, + "message": { + "begin": 5580395, + "headersEnd": 5580501, + "body": { + "mimeType": "text/plain", + "begin": 5580395, + "headersEnd": 5580501, + "end": 5581257, + "octets": 756, + "lines": 16 + }, + "end": 5581257, + "octets": 756, + "lines": 16 + }, + "end": 5581257, + "octets": 862, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5581291, + "headersEnd": 5581293, + "message": { + "begin": 5581293, + "headersEnd": 5581454, + "body": { + "mimeType": "text/plain", + "begin": 5581293, + "headersEnd": 5581454, + "end": 5581820, + "octets": 366, + "lines": 7 + }, + "end": 5581820, + "octets": 366, + "lines": 7 + }, + "end": 5581820, + "octets": 527, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5581854, + "headersEnd": 5581856, + "message": { + "begin": 5581856, + "headersEnd": 5581947, + "body": { + "mimeType": "text/plain", + "begin": 5581856, + "headersEnd": 5581947, + "end": 5582597, + "octets": 650, + "lines": 15 + }, + "end": 5582597, + "octets": 650, + "lines": 15 + }, + "end": 5582597, + "octets": 741, + "lines": 19 + }, + { + "mimeType": "message/rfc822", + "begin": 5582631, + "headersEnd": 5582633, + "message": { + "begin": 5582633, + "headersEnd": 5582786, + "body": { + "mimeType": "text/plain", + "begin": 5582633, + "headersEnd": 5582786, + "end": 5583169, + "octets": 383, + "lines": 17 + }, + "end": 5583169, + "octets": 383, + "lines": 17 + }, + "end": 5583169, + "octets": 536, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5583203, + "headersEnd": 5583205, + "message": { + "begin": 5583205, + "headersEnd": 5583310, + "body": { + "mimeType": "text/plain", + "begin": 5583205, + "headersEnd": 5583310, + "end": 5583604, + "octets": 294, + "lines": 6 + }, + "end": 5583604, + "octets": 294, + "lines": 6 + }, + "end": 5583604, + "octets": 399, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5583638, + "headersEnd": 5583640, + "message": { + "begin": 5583640, + "headersEnd": 5583772, + "body": { + "mimeType": "text/plain", + "begin": 5583640, + "headersEnd": 5583772, + "end": 5584267, + "octets": 495, + "lines": 16 + }, + "end": 5584267, + "octets": 495, + "lines": 16 + }, + "end": 5584267, + "octets": 627, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5584301, + "headersEnd": 5584303, + "message": { + "begin": 5584303, + "headersEnd": 5584404, + "body": { + "mimeType": "text/plain", + "begin": 5584303, + "headersEnd": 5584404, + "end": 5584803, + "octets": 399, + "lines": 19 + }, + "end": 5584803, + "octets": 399, + "lines": 19 + }, + "end": 5584803, + "octets": 500, + "lines": 23 + }, + { + "mimeType": "message/rfc822", + "begin": 5584837, + "headersEnd": 5584839, + "message": { + "begin": 5584839, + "headersEnd": 5584958, + "body": { + "mimeType": "text/plain", + "begin": 5584839, + "headersEnd": 5584958, + "end": 5586303, + "octets": 1345, + "lines": 26 + }, + "end": 5586303, + "octets": 1345, + "lines": 26 + }, + "end": 5586303, + "octets": 1464, + "lines": 30 + }, + { + "mimeType": "message/rfc822", + "begin": 5586337, + "headersEnd": 5586339, + "message": { + "begin": 5586339, + "headersEnd": 5586443, + "body": { + "mimeType": "text/plain", + "begin": 5586339, + "headersEnd": 5586443, + "end": 5586747, + "octets": 304, + "lines": 9 + }, + "end": 5586747, + "octets": 304, + "lines": 9 + }, + "end": 5586747, + "octets": 408, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5586781, + "headersEnd": 5586783, + "message": { + "begin": 5586783, + "headersEnd": 5586930, + "body": { + "mimeType": "text/plain", + "begin": 5586783, + "headersEnd": 5586930, + "end": 5587985, + "octets": 1055, + "lines": 36 + }, + "end": 5587985, + "octets": 1055, + "lines": 36 + }, + "end": 5587985, + "octets": 1202, + "lines": 40 + } + ], + "end": 5588021, + "octets": 66055, + "lines": 1845 + } + ], + "end": 5588100, + "octets": 70738, + "lines": 1958 + }, + "end": 5588100, + "octets": 70738, + "lines": 1958 + }, + { + "mboxMarkerBegin": 5588102, + "mboxMarkerLength": 7, + "begin": 5588111, + "headersEnd": 5588934, + "body": { + "mimeType": "text/plain", + "begin": 5588111, + "headersEnd": 5588934, + "end": 5590853, + "octets": 1919, + "lines": 49 + }, + "end": 5590853, + "octets": 1919, + "lines": 49 + }, + { + "mboxMarkerBegin": 5590855, + "mboxMarkerLength": 7, + "begin": 5590864, + "headersEnd": 5591607, + "body": { + "mimeType": "multipart/mixed", + "begin": 5590864, + "headersEnd": 5591607, + "children": [ + { + "mimeType": "text/plain", + "begin": 5591635, + "headersEnd": 5591637, + "end": 5591750, + "octets": 113, + "lines": 2 + }, + { + "mimeType": "application/x-annotate", + "begin": 5591780, + "headersEnd": 5591872, + "end": 5724575, + "octets": 132703, + "lines": 2012 + }, + { + "mimeType": "text/plain", + "begin": 5724605, + "headersEnd": 5724607, + "end": 5724663, + "octets": 56, + "lines": 2 + }, + { + "mimeType": "image/pbm", + "begin": 5724693, + "headersEnd": 5724843, + "end": 5739817, + "octets": 14974, + "lines": 78 + }, + { + "mimeType": "text/plain", + "begin": 5739847, + "headersEnd": 5739849, + "end": 5739944, + "octets": 95, + "lines": 6 + }, + { + "mimeType": "image/pbm", + "begin": 5739974, + "headersEnd": 5740124, + "end": 5748266, + "octets": 8142, + "lines": 42 + }, + { + "mimeType": "text/plain", + "begin": 5748296, + "headersEnd": 5748298, + "end": 5748375, + "octets": 77, + "lines": 4 + } + ], + "end": 5748407, + "octets": 156800, + "lines": 2171 + }, + "end": 5748407, + "octets": 156800, + "lines": 2171 + }, + { + "mboxMarkerBegin": 5748409, + "mboxMarkerLength": 7, + "begin": 5748418, + "headersEnd": 5748956, + "body": { + "mimeType": "text/richtext", + "begin": 5748418, + "headersEnd": 5748956, + "end": 5749545, + "octets": 589, + "lines": 21 + }, + "end": 5749545, + "octets": 589, + "lines": 21 + }, + { + "mboxMarkerBegin": 5749547, + "mboxMarkerLength": 7, + "begin": 5749556, + "headersEnd": 5750765, + "body": { + "mimeType": "multipart/alternative", + "begin": 5749556, + "headersEnd": 5750765, + "children": [ + { + "mimeType": "text/plain", + "begin": 5750964, + "headersEnd": 5751010, + "end": 5751766, + "octets": 756, + "lines": 26 + }, + { + "mimeType": "multipart/mixed", + "begin": 5751809, + "headersEnd": 5751897, + "children": [ + { + "mimeType": "text/richtext", + "begin": 5751940, + "headersEnd": 5752034, + "end": 5752861, + "octets": 827, + "lines": 25 + }, + { + "mimeType": "image/gif", + "begin": 5752906, + "headersEnd": 5753003, + "end": 5811629, + "octets": 58626, + "lines": 755 + }, + { + "mimeType": "text/richtext", + "begin": 5811674, + "headersEnd": 5811768, + "end": 5811774, + "octets": 6, + "lines": 1 + } + ], + "end": 5811821, + "octets": 59924, + "lines": 798 + } + ], + "end": 5811866, + "octets": 61101, + "lines": 837 + }, + "end": 5811866, + "octets": 61101, + "lines": 837 + }, + { + "mboxMarkerBegin": 5811868, + "mboxMarkerLength": 7, + "begin": 5811877, + "headersEnd": 5812634, + "body": { + "mimeType": "multipart/mixed", + "begin": 5811877, + "headersEnd": 5812634, + "children": [ + { + "mimeType": "text/plain", + "begin": 5812686, + "headersEnd": 5812779, + "end": 5812960, + "octets": 181, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 5813012, + "headersEnd": 5813074, + "end": 5869078, + "octets": 56004, + "lines": 757 + } + ], + "end": 5869132, + "octets": 56498, + "lines": 775 + }, + "end": 5869132, + "octets": 56498, + "lines": 775 + }, + { + "mboxMarkerBegin": 5869134, + "mboxMarkerLength": 31, + "begin": 5869167, + "headersEnd": 5870664, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 5869167, + "headersEnd": 5870664, + "end": 5872038, + "octets": 1374, + "lines": 34 + }, + "end": 5872038, + "octets": 1374, + "lines": 34 + }, + { + "mboxMarkerBegin": 5872040, + "mboxMarkerLength": 7, + "begin": 5872049, + "headersEnd": 5872857, + "body": { + "mimeType": "multipart/mixed", + "begin": 5872049, + "headersEnd": 5872857, + "children": [ + { + "mimeType": "text/plain", + "begin": 5872931, + "headersEnd": 5873010, + "end": 5873393, + "octets": 383, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5873421, + "headersEnd": 5873515, + "message": { + "begin": 5873515, + "headersEnd": 5874597, + "body": { + "mimeType": "text/html", + "begin": 5873515, + "headersEnd": 5874597, + "end": 5899455, + "octets": 24858, + "lines": 463 + }, + "end": 5899455, + "octets": 24858, + "lines": 463 + }, + "end": 5899455, + "octets": 25940, + "lines": 477 + } + ], + "end": 5899485, + "octets": 26628, + "lines": 504 + }, + "end": 5899485, + "octets": 26628, + "lines": 504 + }, + { + "mboxMarkerBegin": 5899487, + "mboxMarkerLength": 7, + "begin": 5899496, + "headersEnd": 5900178, + "body": { + "mimeType": "multipart/mixed", + "begin": 5899496, + "headersEnd": 5900178, + "children": [ + { + "mimeType": "text/plain", + "begin": 5900275, + "headersEnd": 5900356, + "end": 5900391, + "octets": 35, + "lines": 1 + }, + { + "mimeType": "image/gif", + "begin": 5900442, + "headersEnd": 5900504, + "end": 5922958, + "octets": 22454, + "lines": 304 + } + ], + "end": 5923009, + "octets": 22831, + "lines": 317 + }, + "end": 5923009, + "octets": 22831, + "lines": 317 + }, + { + "mboxMarkerBegin": 5923011, + "mboxMarkerLength": 31, + "begin": 5923044, + "headersEnd": 5923581, + "body": { + "mimeType": "multipart/mixed", + "begin": 5923044, + "headersEnd": 5923581, + "children": [ + { + "mimeType": "text/plain", + "begin": 5923590, + "headersEnd": 5923636, + "end": 5924829, + "octets": 1193, + "lines": 21 + }, + { + "mimeType": "text/plain", + "begin": 5924840, + "headersEnd": 5924970, + "end": 5925118, + "octets": 148, + "lines": 3 + }, + { + "mimeType": "text/plain", + "begin": 5925129, + "headersEnd": 5925249, + "end": 5925445, + "octets": 196, + "lines": 3 + } + ], + "end": 5925456, + "octets": 1875, + "lines": 42 + }, + "end": 5925456, + "octets": 1875, + "lines": 42 + }, + { + "mboxMarkerBegin": 5925458, + "mboxMarkerLength": 7, + "begin": 5925467, + "headersEnd": 5926279, + "body": { + "mimeType": "audio/basic", + "begin": 5925467, + "headersEnd": 5926279, + "end": 6186575, + "octets": 260296, + "lines": 3518 + }, + "end": 6186575, + "octets": 260296, + "lines": 3518 + }, + { + "mboxMarkerBegin": 6186577, + "mboxMarkerLength": 7, + "begin": 6186586, + "headersEnd": 6187457, + "body": { + "mimeType": "multipart/mixed", + "begin": 6186586, + "headersEnd": 6187457, + "children": [ + { + "mimeType": "text/plain", + "begin": 6187474, + "headersEnd": 6187554, + "end": 6187752, + "octets": 198, + "lines": 9 + }, + { + "mimeType": "image/pbm", + "begin": 6187769, + "headersEnd": 6187877, + "end": 6287399, + "octets": 99522, + "lines": 1276 + } + ], + "end": 6287418, + "octets": 99961, + "lines": 1296 + }, + "end": 6287418, + "octets": 99961, + "lines": 1296 + }, + { + "mboxMarkerBegin": 6287420, + "mboxMarkerLength": 7, + "begin": 6287429, + "headersEnd": 6288325, + "body": { + "mimeType": "multipart/mixed", + "begin": 6287429, + "headersEnd": 6288325, + "children": [ + { + "mimeType": "text/plain", + "begin": 6288335, + "headersEnd": 6288383, + "end": 6289347, + "octets": 964, + "lines": 21 + }, + { + "mimeType": "multipart/mixed", + "begin": 6289359, + "headersEnd": 6289424, + "children": [ + { + "mimeType": "multipart/mixed", + "begin": 6289449, + "headersEnd": 6289818, + "children": [ + { + "mimeType": "multipart/mixed", + "begin": 6289841, + "headersEnd": 6289946, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6289969, + "headersEnd": 6290096, + "end": 6290470, + "octets": 374, + "lines": 8 + }, + { + "mimeType": "text/richtext", + "begin": 6290495, + "headersEnd": 6290621, + "end": 6291023, + "octets": 402, + "lines": 10 + }, + { + "mimeType": "text/richtext", + "begin": 6291048, + "headersEnd": 6291177, + "end": 6291903, + "octets": 726, + "lines": 18 + } + ], + "end": 6291930, + "octets": 1984, + "lines": 55 + }, + { + "mimeType": "multipart/mixed", + "begin": 6291955, + "headersEnd": 6292057, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6292080, + "headersEnd": 6292216, + "end": 6309101, + "octets": 16885, + "lines": 470 + }, + { + "mimeType": "text/richtext", + "begin": 6309126, + "headersEnd": 6309261, + "end": 6323910, + "octets": 14649, + "lines": 395 + }, + { + "mimeType": "multipart/mixed", + "begin": 6323935, + "headersEnd": 6324039, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6324062, + "headersEnd": 6324208, + "end": 6330524, + "octets": 6316, + "lines": 164 + }, + { + "mimeType": "text/richtext", + "begin": 6330549, + "headersEnd": 6330680, + "end": 6336095, + "octets": 5415, + "lines": 160 + }, + { + "mimeType": "text/richtext", + "begin": 6336120, + "headersEnd": 6336261, + "end": 6343756, + "octets": 7495, + "lines": 197 + }, + { + "mimeType": "text/richtext", + "begin": 6343781, + "headersEnd": 6343909, + "end": 6350569, + "octets": 6660, + "lines": 184 + }, + { + "mimeType": "text/richtext", + "begin": 6350594, + "headersEnd": 6350735, + "end": 6368395, + "octets": 17660, + "lines": 492 + } + ], + "end": 6368422, + "octets": 44383, + "lines": 1228 + }, + { + "mimeType": "multipart/mixed", + "begin": 6368447, + "headersEnd": 6368545, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6368568, + "headersEnd": 6368706, + "end": 6369222, + "octets": 516, + "lines": 21 + } + ], + "end": 6369249, + "octets": 704, + "lines": 28 + } + ], + "end": 6369276, + "octets": 77219, + "lines": 2144 + }, + { + "mimeType": "multipart/mixed", + "begin": 6369301, + "headersEnd": 6369415, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6369438, + "headersEnd": 6369580, + "end": 6370758, + "octets": 1178, + "lines": 29 + }, + { + "mimeType": "text/richtext", + "begin": 6370783, + "headersEnd": 6370913, + "end": 6372168, + "octets": 1255, + "lines": 35 + }, + { + "mimeType": "text/richtext", + "begin": 6372193, + "headersEnd": 6372337, + "end": 6373036, + "octets": 699, + "lines": 22 + } + ], + "end": 6373063, + "octets": 3648, + "lines": 105 + } + ], + "end": 6373090, + "octets": 83272, + "lines": 2320 + } + ], + "end": 6373117, + "octets": 83693, + "lines": 2332 + } + ], + "end": 6373131, + "octets": 84806, + "lines": 2362 + }, + "end": 6373131, + "octets": 84806, + "lines": 2362 + }, + { + "mboxMarkerBegin": 6373133, + "mboxMarkerLength": 7, + "begin": 6373142, + "headersEnd": 6373961, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 6373142, + "headersEnd": 6373961, + "end": 6383386, + "octets": 9425, + "lines": 226 + }, + "end": 6383386, + "octets": 9425, + "lines": 226 + }, + { + "mboxMarkerBegin": 6383388, + "mboxMarkerLength": 7, + "begin": 6383397, + "headersEnd": 6384141, + "body": { + "mimeType": "multipart/alternative", + "begin": 6383397, + "headersEnd": 6384141, + "children": [ + { + "mimeType": "text/plain", + "begin": 6384340, + "headersEnd": 6384386, + "end": 6385165, + "octets": 779, + "lines": 23 + }, + { + "mimeType": "multipart/mixed", + "begin": 6385208, + "headersEnd": 6385296, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6385339, + "headersEnd": 6385433, + "end": 6385767, + "octets": 334, + "lines": 7 + }, + { + "mimeType": "audio/basic", + "begin": 6385812, + "headersEnd": 6385910, + "end": 6408254, + "octets": 22344, + "lines": 320 + }, + { + "mimeType": "text/richtext", + "begin": 6408299, + "headersEnd": 6408393, + "end": 6408564, + "octets": 171, + "lines": 5 + }, + { + "mimeType": "audio/basic", + "begin": 6408609, + "headersEnd": 6408710, + "end": 6456608, + "octets": 47898, + "lines": 685 + }, + { + "mimeType": "text/richtext", + "begin": 6456653, + "headersEnd": 6456747, + "end": 6456819, + "octets": 72, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 6456864, + "headersEnd": 6456958, + "end": 6477470, + "octets": 20512, + "lines": 294 + }, + { + "mimeType": "text/richtext", + "begin": 6477515, + "headersEnd": 6477609, + "end": 6477721, + "octets": 112, + "lines": 8 + } + ], + "end": 6477768, + "octets": 92472, + "lines": 1360 + } + ], + "end": 6477811, + "octets": 93670, + "lines": 1396 + }, + "end": 6477811, + "octets": 93670, + "lines": 1396 + }, + { + "mboxMarkerBegin": 6477813, + "mboxMarkerLength": 7, + "begin": 6477822, + "headersEnd": 6478593, + "body": { + "mimeType": "multipart/mixed", + "begin": 6477822, + "headersEnd": 6478593, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6478838, + "headersEnd": 6478914, + "end": 6479347, + "octets": 433, + "lines": 13 + }, + { + "mimeType": "image/x-xwd", + "begin": 6479395, + "headersEnd": 6479459, + "end": 6513483, + "octets": 34024, + "lines": 460 + }, + { + "mimeType": "text/richtext", + "begin": 6513531, + "headersEnd": 6513607, + "end": 6513708, + "octets": 101, + "lines": 7 + } + ], + "end": 6513758, + "octets": 35165, + "lines": 500 + }, + "end": 6513758, + "octets": 35165, + "lines": 500 + }, + { + "mboxMarkerBegin": 6513760, + "mboxMarkerLength": 41, + "begin": 6513803, + "headersEnd": 6513957, + "body": { + "mimeType": "text/plain", + "begin": 6513803, + "headersEnd": 6513957, + "end": 6557679, + "octets": 43722, + "lines": 693 + }, + "end": 6557679, + "octets": 43722, + "lines": 693 + }, + { + "mboxMarkerBegin": 6557681, + "mboxMarkerLength": 31, + "begin": 6557714, + "headersEnd": 6558312, + "body": { + "mimeType": "multipart/mixed", + "begin": 6557714, + "headersEnd": 6558312, + "children": [ + { + "mimeType": "multipart/alternative", + "begin": 6558400, + "headersEnd": 6558521, + "children": [ + { + "mimeType": "text/plain", + "begin": 6558563, + "headersEnd": 6558644, + "end": 6559954, + "octets": 1310, + "lines": 38 + }, + { + "mimeType": "text/html", + "begin": 6559996, + "headersEnd": 6560078, + "end": 6562574, + "octets": 2496, + "lines": 32 + } + ], + "end": 6562620, + "octets": 4099, + "lines": 83 + }, + { + "mimeType": "application/octet-stream", + "begin": 6562662, + "headersEnd": 6562872, + "end": 6583892, + "octets": 21020, + "lines": 270 + } + ], + "end": 6583936, + "octets": 25624, + "lines": 368 + }, + "end": 6583936, + "octets": 25624, + "lines": 368 + }, + { + "mboxMarkerBegin": 6583938, + "mboxMarkerLength": 31, + "begin": 6583971, + "headersEnd": 6584388, + "body": { + "mimeType": "multipart/mixed", + "begin": 6583971, + "headersEnd": 6584388, + "children": [ + { + "mimeType": "text/plain", + "begin": 6584457, + "headersEnd": 6584459, + "end": 6584523, + "octets": 64, + "lines": 1 + }, + { + "mimeType": "multipart/alternative", + "begin": 6584546, + "headersEnd": 6584622, + "children": [ + { + "mimeType": "text/plain", + "begin": 6584650, + "headersEnd": 6584760, + "end": 6584843, + "octets": 83, + "lines": 3 + }, + { + "mimeType": "text/richtext", + "begin": 6584873, + "headersEnd": 6584986, + "end": 6585148, + "octets": 162, + "lines": 4 + }, + { + "mimeType": "text/enriched", + "begin": 6585178, + "headersEnd": 6585291, + "end": 6585464, + "octets": 173, + "lines": 10 + }, + { + "mimeType": "text/html", + "begin": 6585494, + "headersEnd": 6585603, + "end": 6585767, + "octets": 164, + "lines": 3 + }, + { + "mimeType": "text/something-you-dont-know", + "begin": 6585797, + "headersEnd": 6585925, + "end": 6586358, + "octets": 433, + "lines": 6 + } + ], + "end": 6586388, + "octets": 1766, + "lines": 57 + }, + { + "mimeType": "text/plain", + "begin": 6586411, + "headersEnd": 6586413, + "end": 6586582, + "octets": 169, + "lines": 4 + }, + { + "mimeType": "multipart/alternative", + "begin": 6586605, + "headersEnd": 6586657, + "children": [ + { + "mimeType": "text/plain", + "begin": 6586663, + "headersEnd": 6586691, + "end": 6586745, + "octets": 54, + "lines": 1 + }, + { + "mimeType": "multipart/alternative", + "begin": 6586753, + "headersEnd": 6586805, + "children": [ + { + "mimeType": "text/plain", + "begin": 6586811, + "headersEnd": 6586839, + "end": 6586893, + "octets": 54, + "lines": 1 + }, + { + "mimeType": "text/html", + "begin": 6586901, + "headersEnd": 6586928, + "end": 6586979, + "octets": 51, + "lines": 1 + }, + { + "mimeType": "text/x-barf", + "begin": 6586987, + "headersEnd": 6587016, + "end": 6587071, + "octets": 55, + "lines": 1 + } + ], + "end": 6587081, + "octets": 276, + "lines": 16 + }, + { + "mimeType": "application/spankme", + "begin": 6587089, + "headersEnd": 6587184, + "end": 6587200, + "octets": 16, + "lines": 1 + } + ], + "end": 6587208, + "octets": 551, + "lines": 32 + }, + { + "mimeType": "text/plain", + "begin": 6587231, + "headersEnd": 6587233, + "end": 6587243, + "octets": 10, + "lines": 1 + } + ], + "end": 6587266, + "octets": 2878, + "lines": 113 + }, + "end": 6587266, + "octets": 2878, + "lines": 113 + }, + { + "mboxMarkerBegin": 6587268, + "mboxMarkerLength": 31, + "begin": 6587301, + "headersEnd": 6587716, + "body": { + "mimeType": "multipart/mixed", + "begin": 6587301, + "headersEnd": 6587716, + "children": [ + { + "mimeType": "text/plain", + "begin": 6587785, + "headersEnd": 6587787, + "end": 6587855, + "octets": 68, + "lines": 1 + }, + { + "mimeType": "multipart/alternative", + "begin": 6587878, + "headersEnd": 6587954, + "children": [ + { + "mimeType": "text/plain", + "begin": 6587982, + "headersEnd": 6588142, + "end": 6645008, + "octets": 56866, + "lines": 1603 + }, + { + "mimeType": "text/html", + "begin": 6645038, + "headersEnd": 6645197, + "end": 6754228, + "octets": 109031, + "lines": 2982 + }, + { + "mimeType": "application/postscript", + "begin": 6754258, + "headersEnd": 6754408, + "end": 6955876, + "octets": 201468, + "lines": 13109 + } + ], + "end": 6955908, + "octets": 367954, + "lines": 17713 + } + ], + "end": 6955939, + "octets": 368223, + "lines": 17726 + }, + "end": 6955939, + "octets": 368223, + "lines": 17726 + }, + { + "mboxMarkerBegin": 6955941, + "mboxMarkerLength": 7, + "begin": 6955950, + "headersEnd": 6956567, + "body": { + "mimeType": "MULTIPART/MIXED", + "begin": 6955950, + "headersEnd": 6956567, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 6956828, + "headersEnd": 6956943, + "end": 6956943, + "octets": 0, + "lines": 0 + }, + { + "mimeType": "MESSAGE/RFC822", + "begin": 6956986, + "headersEnd": 6957087, + "message": { + "begin": 6957087, + "headersEnd": 6957640, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 6957087, + "headersEnd": 6957640, + "end": 6958002, + "octets": 362, + "lines": 16 + }, + "end": 6958002, + "octets": 362, + "lines": 16 + }, + "end": 6958002, + "octets": 915, + "lines": 28 + } + ], + "end": 6958045, + "octets": 1478, + "lines": 43 + }, + "end": 6958045, + "octets": 1478, + "lines": 43 + }, + { + "mboxMarkerBegin": 6958047, + "mboxMarkerLength": 7, + "begin": 6958056, + "headersEnd": 6958361, + "body": { + "mimeType": "multipart/related", + "begin": 6958056, + "headersEnd": 6958361, + "children": [ + { + "mimeType": "text/html", + "begin": 6958401, + "headersEnd": 6958654, + "end": 6959403, + "octets": 749, + "lines": 30 + }, + { + "mimeType": "image/jpeg", + "begin": 6959445, + "headersEnd": 6959773, + "end": 6970643, + "octets": 10870, + "lines": 147 + } + ], + "end": 6970685, + "octets": 12324, + "lines": 197 + }, + "end": 6970685, + "octets": 12324, + "lines": 197 + }, + { + "mboxMarkerBegin": 6970687, + "mboxMarkerLength": 7, + "begin": 6970696, + "headersEnd": 6971001, + "body": { + "mimeType": "multipart/related", + "begin": 6970696, + "headersEnd": 6971001, + "children": [ + { + "mimeType": "text/html", + "begin": 6971041, + "headersEnd": 6971294, + "end": 6972042, + "octets": 748, + "lines": 30 + }, + { + "mimeType": "image/jpeg", + "begin": 6972084, + "headersEnd": 6972381, + "end": 6983251, + "octets": 10870, + "lines": 147 + } + ], + "end": 6983293, + "octets": 12292, + "lines": 197 + }, + "end": 6983293, + "octets": 12292, + "lines": 197 + }, + { + "mboxMarkerBegin": 6983295, + "mboxMarkerLength": 31, + "begin": 6983328, + "headersEnd": 6984857, + "body": { + "mimeType": "multipart/related", + "begin": 6983328, + "headersEnd": 6984857, + "children": [ + { + "mimeType": "text/html", + "begin": 6984904, + "headersEnd": 6984998, + "end": 6990308, + "octets": 5310, + "lines": 111 + }, + { + "mimeType": "image/gif", + "begin": 6990355, + "headersEnd": 6990560, + "end": 6991502, + "octets": 942, + "lines": 13 + } + ], + "end": 6991551, + "octets": 6694, + "lines": 139 + }, + "end": 6991551, + "octets": 6694, + "lines": 139 + }, + { + "mboxMarkerBegin": 6991553, + "mboxMarkerLength": 31, + "begin": 6991586, + "headersEnd": 6992045, + "body": { + "mimeType": "multipart/mixed", + "begin": 6991586, + "headersEnd": 6992045, + "children": [ + { + "mimeType": "text/plain", + "begin": 6992085, + "headersEnd": 6992113, + "end": 6992366, + "octets": 253, + "lines": 6 + }, + { + "mimeType": "multipart/related", + "begin": 6992408, + "headersEnd": 6992497, + "children": [ + { + "mimeType": "text/html", + "begin": 6992537, + "headersEnd": 6992736, + "end": 7000063, + "octets": 7327, + "lines": 179 + }, + { + "mimeType": "image/gif", + "begin": 7000105, + "headersEnd": 7000286, + "end": 7008376, + "octets": 8090, + "lines": 110 + }, + { + "mimeType": "image/gif", + "begin": 7008418, + "headersEnd": 7008582, + "end": 7016138, + "octets": 7556, + "lines": 103 + }, + { + "mimeType": "image/gif", + "begin": 7016180, + "headersEnd": 7016343, + "end": 7019721, + "octets": 3378, + "lines": 46 + }, + { + "mimeType": "image/gif", + "begin": 7019763, + "headersEnd": 7019927, + "end": 7028493, + "octets": 8566, + "lines": 116 + }, + { + "mimeType": "image/gif", + "begin": 7028535, + "headersEnd": 7028696, + "end": 7134494, + "octets": 105798, + "lines": 1430 + }, + { + "mimeType": "image/jpeg", + "begin": 7134536, + "headersEnd": 7134700, + "end": 7173586, + "octets": 38886, + "lines": 526 + }, + { + "mimeType": "image/jpeg", + "begin": 7173628, + "headersEnd": 7173797, + "end": 7209595, + "octets": 35798, + "lines": 484 + } + ], + "end": 7209637, + "octets": 217140, + "lines": 3044 + } + ], + "end": 7209679, + "octets": 217634, + "lines": 3059 + }, + "end": 7209679, + "octets": 217634, + "lines": 3059 + }, + { + "mboxMarkerBegin": 7209681, + "mboxMarkerLength": 7, + "begin": 7209690, + "headersEnd": 7209994, + "body": { + "mimeType": "multipart/related", + "begin": 7209690, + "headersEnd": 7209994, + "children": [ + { + "mimeType": "text/html", + "begin": 7210034, + "headersEnd": 7210195, + "end": 7210773, + "octets": 578, + "lines": 27 + }, + { + "mimeType": "image/jpeg", + "begin": 7210815, + "headersEnd": 7210932, + "end": 7221802, + "octets": 10870, + "lines": 147 + } + ], + "end": 7221844, + "octets": 11850, + "lines": 188 + }, + "end": 7221844, + "octets": 11850, + "lines": 188 + }, + { + "mboxMarkerBegin": 7221846, + "mboxMarkerLength": 7, + "begin": 7221855, + "headersEnd": 7222159, + "body": { + "mimeType": "multipart/related", + "begin": 7221855, + "headersEnd": 7222159, + "children": [ + { + "mimeType": "text/html", + "begin": 7222199, + "headersEnd": 7222417, + "end": 7223042, + "octets": 625, + "lines": 28 + }, + { + "mimeType": "image/jpeg", + "begin": 7223084, + "headersEnd": 7223365, + "end": 7234235, + "octets": 10870, + "lines": 147 + } + ], + "end": 7234277, + "octets": 12118, + "lines": 193 + }, + "end": 7234277, + "octets": 12118, + "lines": 193 + }, + { + "mboxMarkerBegin": 7234279, + "mboxMarkerLength": 7, + "begin": 7234288, + "headersEnd": 7234592, + "body": { + "mimeType": "multipart/related", + "begin": 7234288, + "headersEnd": 7234592, + "children": [ + { + "mimeType": "text/html", + "begin": 7234632, + "headersEnd": 7234854, + "end": 7235483, + "octets": 629, + "lines": 28 + }, + { + "mimeType": "image/jpeg", + "begin": 7235525, + "headersEnd": 7235705, + "end": 7246575, + "octets": 10870, + "lines": 147 + } + ], + "end": 7246617, + "octets": 12025, + "lines": 191 + }, + "end": 7246617, + "octets": 12025, + "lines": 191 + }, + { + "mboxMarkerBegin": 7246619, + "mboxMarkerLength": 7, + "begin": 7246628, + "headersEnd": 7246932, + "body": { + "mimeType": "multipart/related", + "begin": 7246628, + "headersEnd": 7246932, + "children": [ + { + "mimeType": "text/html", + "begin": 7246972, + "headersEnd": 7247224, + "end": 7247884, + "octets": 660, + "lines": 29 + }, + { + "mimeType": "image/jpeg", + "begin": 7247926, + "headersEnd": 7248239, + "end": 7259109, + "octets": 10870, + "lines": 147 + } + ], + "end": 7259151, + "octets": 12219, + "lines": 196 + }, + "end": 7259151, + "octets": 12219, + "lines": 196 + }, + { + "mboxMarkerBegin": 7259153, + "mboxMarkerLength": 7, + "begin": 7259162, + "headersEnd": 7259466, + "body": { + "mimeType": "multipart/related", + "begin": 7259162, + "headersEnd": 7259466, + "children": [ + { + "mimeType": "text/html", + "begin": 7259506, + "headersEnd": 7259728, + "end": 7260401, + "octets": 673, + "lines": 28 + }, + { + "mimeType": "image/jpeg", + "begin": 7260443, + "headersEnd": 7260623, + "end": 7271493, + "octets": 10870, + "lines": 147 + } + ], + "end": 7271535, + "octets": 12069, + "lines": 191 + }, + "end": 7271535, + "octets": 12069, + "lines": 191 + }, + { + "mboxMarkerBegin": 7271537, + "mboxMarkerLength": 7, + "begin": 7271546, + "headersEnd": 7271850, + "body": { + "mimeType": "multipart/related", + "begin": 7271546, + "headersEnd": 7271850, + "children": [ + { + "mimeType": "text/html", + "begin": 7271890, + "headersEnd": 7272142, + "end": 7272841, + "octets": 699, + "lines": 29 + }, + { + "mimeType": "image/jpeg", + "begin": 7272883, + "headersEnd": 7273227, + "end": 7284097, + "octets": 10870, + "lines": 147 + } + ], + "end": 7284139, + "octets": 12289, + "lines": 196 + }, + "end": 7284139, + "octets": 12289, + "lines": 196 + }, + { + "mboxMarkerBegin": 7284141, + "mboxMarkerLength": 31, + "begin": 7284174, + "headersEnd": 7285430, + "body": { + "mimeType": "multipart/mixed", + "begin": 7284174, + "headersEnd": 7285430, + "children": [ + { + "mimeType": "text/plain", + "begin": 7285517, + "headersEnd": 7285596, + "end": 7285626, + "octets": 30, + "lines": 3 + }, + { + "mimeType": "message/rfc822", + "begin": 7285667, + "headersEnd": 7285761, + "message": { + "begin": 7285761, + "headersEnd": 7286598, + "body": { + "mimeType": "multipart/alternative", + "begin": 7285761, + "headersEnd": 7286598, + "children": [ + { + "mimeType": "text/plain", + "begin": 7286640, + "headersEnd": 7286719, + "end": 7287362, + "octets": 643, + "lines": 16 + }, + { + "mimeType": "multipart/related", + "begin": 7287404, + "headersEnd": 7287488, + "children": [ + { + "mimeType": "text/html", + "begin": 7287530, + "headersEnd": 7287608, + "end": 7288476, + "octets": 868, + "lines": 18 + }, + { + "mimeType": "image/tiff", + "begin": 7288518, + "headersEnd": 7288707, + "end": 8042865, + "octets": 754158, + "lines": 10192 + } + ], + "end": 8042909, + "octets": 755421, + "lines": 10223 + } + ], + "end": 8042957, + "octets": 756359, + "lines": 10252 + }, + "end": 8042957, + "octets": 756359, + "lines": 10252 + }, + "end": 8042957, + "octets": 757196, + "lines": 10268 + } + ], + "end": 8043000, + "octets": 757570, + "lines": 10285 + }, + "end": 8043000, + "octets": 757570, + "lines": 10285 + }, + { + "mboxMarkerBegin": 8043002, + "mboxMarkerLength": 31, + "begin": 8043035, + "headersEnd": 8044321, + "body": { + "mimeType": "multipart/related", + "begin": 8043035, + "headersEnd": 8044321, + "children": [ + { + "mimeType": "text/html", + "begin": 8044368, + "headersEnd": 8044462, + "end": 8046894, + "octets": 2432, + "lines": 50 + }, + { + "mimeType": "image/gif", + "begin": 8046941, + "headersEnd": 8047105, + "end": 8053207, + "octets": 6102, + "lines": 79 + }, + { + "mimeType": "image/gif", + "begin": 8053254, + "headersEnd": 8053417, + "end": 8065647, + "octets": 12230, + "lines": 157 + }, + { + "mimeType": "image/gif", + "begin": 8065694, + "headersEnd": 8065859, + "end": 8087855, + "octets": 21996, + "lines": 282 + }, + { + "mimeType": "image/gif", + "begin": 8087902, + "headersEnd": 8088111, + "end": 8091549, + "octets": 3438, + "lines": 45 + } + ], + "end": 8091598, + "octets": 47277, + "lines": 649 + }, + "end": 8091598, + "octets": 47277, + "lines": 649 + }, + { + "mboxMarkerBegin": 8091600, + "mboxMarkerLength": 7, + "begin": 8091609, + "headersEnd": 8092367, + "body": { + "mimeType": "audio/basic", + "begin": 8091609, + "headersEnd": 8092367, + "end": 8644457, + "octets": 552090, + "lines": 7474 + }, + "end": 8644457, + "octets": 552090, + "lines": 7474 + }, + { + "mboxMarkerBegin": 8644459, + "mboxMarkerLength": 7, + "begin": 8644468, + "headersEnd": 8645400, + "body": { + "mimeType": "multipart/mixed", + "begin": 8644468, + "headersEnd": 8645400, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8645411, + "headersEnd": 8645442, + "end": 8648068, + "octets": 2626, + "lines": 96 + } + ], + "end": 8648081, + "octets": 2681, + "lines": 102 + }, + "end": 8648081, + "octets": 2681, + "lines": 102 + }, + { + "mboxMarkerBegin": 8648083, + "mboxMarkerLength": 31, + "begin": 8648116, + "headersEnd": 8648726, + "body": { + "mimeType": "multipart/signed", + "begin": 8648116, + "headersEnd": 8648726, + "children": [ + { + "mimeType": "text/plain", + "begin": 8649031, + "headersEnd": 8649078, + "end": 8650186, + "octets": 1108, + "lines": 26 + }, + { + "mimeType": "application/pgp-signature", + "begin": 8650206, + "headersEnd": 8650249, + "end": 8650542, + "octets": 293, + "lines": 9 + } + ], + "end": 8650562, + "octets": 1836, + "lines": 51 + }, + "end": 8650562, + "octets": 1836, + "lines": 51 + }, + { + "mboxMarkerBegin": 8650564, + "mboxMarkerLength": 7, + "begin": 8650573, + "headersEnd": 8651756, + "body": { + "mimeType": "application/pgp", + "begin": 8650573, + "headersEnd": 8651756, + "end": 8653178, + "octets": 1422, + "lines": 40 + }, + "end": 8653178, + "octets": 1422, + "lines": 40 + }, + { + "mboxMarkerBegin": 8653180, + "mboxMarkerLength": 7, + "begin": 8653189, + "headersEnd": 8653839, + "body": { + "mimeType": "text/plain", + "begin": 8653189, + "headersEnd": 8653839, + "end": 8654840, + "octets": 1001, + "lines": 27 + }, + "end": 8654840, + "octets": 1001, + "lines": 27 + }, + { + "mboxMarkerBegin": 8654842, + "mboxMarkerLength": 7, + "begin": 8654851, + "headersEnd": 8655631, + "body": { + "mimeType": "multipart/alternative", + "begin": 8654851, + "headersEnd": 8655631, + "children": [ + { + "mimeType": "text/plain", + "begin": 8655830, + "headersEnd": 8655876, + "end": 8656708, + "octets": 832, + "lines": 15 + }, + { + "mimeType": "multipart/mixed", + "begin": 8656751, + "headersEnd": 8656839, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8656882, + "headersEnd": 8656976, + "end": 8657477, + "octets": 501, + "lines": 10 + }, + { + "mimeType": "message/external-body", + "begin": 8657522, + "headersEnd": 8657715, + "message": { + "begin": 8657715, + "headersEnd": 8657744, + "body": { + "mimeType": "audio/basic", + "begin": 8657715, + "headersEnd": 8657744, + "end": 8657748, + "octets": 4, + "lines": 2 + }, + "end": 8657748, + "octets": 4, + "lines": 2 + }, + "end": 8657748, + "octets": 33, + "lines": 4 + }, + { + "mimeType": "text/plain", + "begin": 8657793, + "headersEnd": 8657884, + "end": 8657889, + "octets": 5, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 8657934, + "headersEnd": 8658142, + "message": { + "begin": 8658142, + "headersEnd": 8658169, + "body": { + "mimeType": "image/gif", + "begin": 8658142, + "headersEnd": 8658169, + "end": 8658173, + "octets": 4, + "lines": 2 + }, + "end": 8658173, + "octets": 4, + "lines": 2 + }, + "end": 8658173, + "octets": 31, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8658218, + "headersEnd": 8658312, + "end": 8658541, + "octets": 229, + "lines": 7 + } + ], + "end": 8658588, + "octets": 1749, + "lines": 61 + } + ], + "end": 8658633, + "octets": 3002, + "lines": 89 + }, + "end": 8658633, + "octets": 3002, + "lines": 89 + }, + { + "mboxMarkerBegin": 8658635, + "mboxMarkerLength": 7, + "begin": 8658644, + "headersEnd": 8659476, + "body": { + "mimeType": "text/richtext", + "begin": 8658644, + "headersEnd": 8659476, + "end": 8660904, + "octets": 1428, + "lines": 42 + }, + "end": 8660904, + "octets": 1428, + "lines": 42 + }, + { + "mboxMarkerBegin": 8660906, + "mboxMarkerLength": 7, + "begin": 8660915, + "headersEnd": 8661072, + "body": { + "mimeType": "message/partial", + "begin": 8660915, + "headersEnd": 8661072, + "end": 8665806, + "octets": 4734, + "lines": 64 + }, + "end": 8665806, + "octets": 4734, + "lines": 64 + }, + { + "mboxMarkerBegin": 8665808, + "mboxMarkerLength": 7, + "begin": 8665817, + "headersEnd": 8667595, + "body": { + "mimeType": "multipart/alternative", + "begin": 8665817, + "headersEnd": 8667595, + "children": [ + { + "mimeType": "text/plain", + "begin": 8667794, + "headersEnd": 8667840, + "end": 8669545, + "octets": 1705, + "lines": 38 + }, + { + "mimeType": "multipart/mixed", + "begin": 8669588, + "headersEnd": 8669676, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8669719, + "headersEnd": 8669813, + "end": 8670384, + "octets": 571, + "lines": 14 + }, + { + "mimeType": "image/x-xwd", + "begin": 8670429, + "headersEnd": 8670493, + "end": 8671377, + "octets": 884, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8671422, + "headersEnd": 8671516, + "end": 8671567, + "octets": 51, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8671612, + "headersEnd": 8671676, + "end": 8672560, + "octets": 884, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8672605, + "headersEnd": 8672699, + "end": 8672750, + "octets": 51, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8672795, + "headersEnd": 8672859, + "end": 8673743, + "octets": 884, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8673788, + "headersEnd": 8673882, + "end": 8673927, + "octets": 45, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8673972, + "headersEnd": 8674036, + "end": 8674264, + "octets": 228, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8674309, + "headersEnd": 8674403, + "end": 8674472, + "octets": 69, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8674517, + "headersEnd": 8674581, + "end": 8674809, + "octets": 228, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8674854, + "headersEnd": 8674948, + "end": 8674997, + "octets": 49, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8675042, + "headersEnd": 8675106, + "end": 8675334, + "octets": 228, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8675379, + "headersEnd": 8675473, + "end": 8675776, + "octets": 303, + "lines": 11 + }, + { + "mimeType": "image/x-xwd", + "begin": 8675821, + "headersEnd": 8675885, + "end": 8676769, + "octets": 884, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8676814, + "headersEnd": 8676908, + "end": 8676952, + "octets": 44, + "lines": 4 + }, + { + "mimeType": "image/x-xwd", + "begin": 8676997, + "headersEnd": 8677061, + "end": 8679003, + "octets": 1942, + "lines": 27 + }, + { + "mimeType": "text/richtext", + "begin": 8679048, + "headersEnd": 8679142, + "end": 8679153, + "octets": 11, + "lines": 1 + } + ], + "end": 8679200, + "octets": 9524, + "lines": 228 + } + ], + "end": 8679245, + "octets": 11650, + "lines": 279 + }, + "end": 8679245, + "octets": 11650, + "lines": 279 + }, + { + "mboxMarkerBegin": 8679247, + "mboxMarkerLength": 7, + "begin": 8679256, + "headersEnd": 8680000, + "body": { + "mimeType": "multipart/alternative", + "begin": 8679256, + "headersEnd": 8680000, + "children": [ + { + "mimeType": "text/plain", + "begin": 8680199, + "headersEnd": 8680245, + "end": 8680884, + "octets": 639, + "lines": 12 + }, + { + "mimeType": "multipart/mixed", + "begin": 8680927, + "headersEnd": 8681015, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8681058, + "headersEnd": 8681152, + "end": 8681693, + "octets": 541, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 8681738, + "headersEnd": 8681850, + "end": 8690560, + "octets": 8710, + "lines": 125 + }, + { + "mimeType": "text/richtext", + "begin": 8690605, + "headersEnd": 8690699, + "end": 8690747, + "octets": 48, + "lines": 3 + } + ], + "end": 8690794, + "octets": 9779, + "lines": 153 + } + ], + "end": 8690837, + "octets": 10837, + "lines": 178 + }, + "end": 8690837, + "octets": 10837, + "lines": 178 + }, + { + "mboxMarkerBegin": 8690839, + "mboxMarkerLength": 7, + "begin": 8690848, + "headersEnd": 8691509, + "body": { + "mimeType": "multipart/mixed", + "begin": 8690848, + "headersEnd": 8691509, + "children": [ + { + "mimeType": "text/plain", + "begin": 8691561, + "headersEnd": 8691654, + "end": 8691757, + "octets": 103, + "lines": 6 + }, + { + "mimeType": "audio/basic", + "begin": 8691809, + "headersEnd": 8691940, + "end": 8771456, + "octets": 79516, + "lines": 1075 + } + ], + "end": 8771510, + "octets": 80001, + "lines": 1093 + }, + "end": 8771510, + "octets": 80001, + "lines": 1093 + }, + { + "mboxMarkerBegin": 8771512, + "mboxMarkerLength": 7, + "begin": 8771521, + "headersEnd": 8772294, + "body": { + "mimeType": "multipart/alternative", + "begin": 8771521, + "headersEnd": 8772294, + "children": [ + { + "mimeType": "text/plain", + "begin": 8772493, + "headersEnd": 8772539, + "end": 8773917, + "octets": 1378, + "lines": 28 + }, + { + "mimeType": "multipart/mixed", + "begin": 8773960, + "headersEnd": 8774048, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8774091, + "headersEnd": 8774185, + "end": 8775346, + "octets": 1161, + "lines": 22 + }, + { + "mimeType": "audio/basic", + "begin": 8775391, + "headersEnd": 8775493, + "end": 8892315, + "octets": 116822, + "lines": 1579 + }, + { + "mimeType": "text/richtext", + "begin": 8892360, + "headersEnd": 8892454, + "end": 8892580, + "octets": 126, + "lines": 3 + }, + { + "mimeType": "image/gif", + "begin": 8892625, + "headersEnd": 8892728, + "end": 8959970, + "octets": 67242, + "lines": 961 + }, + { + "mimeType": "text/plain", + "begin": 8960015, + "headersEnd": 8960106, + "end": 8960106, + "octets": 0, + "lines": 0 + } + ], + "end": 8960153, + "octets": 186105, + "lines": 2593 + } + ], + "end": 8960196, + "octets": 187902, + "lines": 2634 + }, + "end": 8960196, + "octets": 187902, + "lines": 2634 + }, + { + "mboxMarkerBegin": 8960198, + "mboxMarkerLength": 7, + "begin": 8960207, + "headersEnd": 8961063, + "body": { + "mimeType": "application/x-pkcs", + "begin": 8960207, + "headersEnd": 8961063, + "end": 8962821, + "octets": 1758, + "lines": 25 + }, + "end": 8962821, + "octets": 1758, + "lines": 25 + }, + { + "mboxMarkerBegin": 8962823, + "mboxMarkerLength": 7, + "begin": 8962832, + "headersEnd": 8963476, + "body": { + "mimeType": "MESSAGE/RFC822", + "begin": 8962832, + "headersEnd": 8963476, + "message": { + "begin": 8963476, + "headersEnd": 8963972, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 8963476, + "headersEnd": 8963972, + "end": 8964871, + "octets": 899, + "lines": 25 + }, + "end": 8964871, + "octets": 899, + "lines": 25 + }, + "end": 8964871, + "octets": 1395, + "lines": 38 + }, + "end": 8964871, + "octets": 1395, + "lines": 38 + }, + { + "mboxMarkerBegin": 8964873, + "mboxMarkerLength": 7, + "begin": 8964882, + "headersEnd": 8965340, + "body": { + "mimeType": "multipart/mixed", + "begin": 8964882, + "headersEnd": 8965340, + "children": [ + { + "mimeType": "text/plain", + "begin": 8965350, + "headersEnd": 8965352, + "end": 8965393, + "octets": 41, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 8965405, + "headersEnd": 8965469, + "end": 9057967, + "octets": 92498, + "lines": 1250 + } + ], + "end": 9057985, + "octets": 92645, + "lines": 1261 + }, + "end": 9057985, + "octets": 92645, + "lines": 1261 + }, + { + "mboxMarkerBegin": 9057987, + "mboxMarkerLength": 7, + "begin": 9057996, + "headersEnd": 9058498, + "body": { + "mimeType": "text/plain", + "begin": 9057996, + "headersEnd": 9058498, + "end": 9059667, + "octets": 1169, + "lines": 27 + }, + "end": 9059667, + "octets": 1169, + "lines": 27 + }, + { + "mboxMarkerBegin": 9059669, + "mboxMarkerLength": 7, + "begin": 9059678, + "headersEnd": 9060843, + "body": { + "mimeType": "multipart/mixed", + "begin": 9059678, + "headersEnd": 9060843, + "children": [ + { + "mimeType": "text/plain", + "begin": 9060849, + "headersEnd": 9060851, + "end": 9061403, + "octets": 552, + "lines": 12 + }, + { + "mimeType": "image/gif", + "begin": 9061411, + "headersEnd": 9061531, + "end": 9119961, + "octets": 58430, + "lines": 790 + }, + { + "mimeType": "text/plain", + "begin": 9119969, + "headersEnd": 9119971, + "end": 9123837, + "octets": 3866, + "lines": 83 + }, + { + "mimeType": "application/octet-stream", + "begin": 9123845, + "headersEnd": 9124003, + "end": 9154647, + "octets": 30644, + "lines": 1010 + }, + { + "mimeType": "application/octet-stream", + "begin": 9154655, + "headersEnd": 9154764, + "end": 9155504, + "octets": 740, + "lines": 24 + }, + { + "mimeType": "application/octet-stream", + "begin": 9155512, + "headersEnd": 9155632, + "end": 9156920, + "octets": 1288, + "lines": 25 + } + ], + "end": 9156930, + "octets": 96087, + "lines": 1970 + }, + "end": 9156930, + "octets": 96087, + "lines": 1970 + }, + { + "mboxMarkerBegin": 9156932, + "mboxMarkerLength": 31, + "begin": 9156965, + "headersEnd": 9158136, + "body": { + "mimeType": "multipart/signed", + "begin": 9156965, + "headersEnd": 9158136, + "children": [ + { + "mimeType": "text/plain", + "begin": 9158154, + "headersEnd": 9158156, + "end": 9159077, + "octets": 921, + "lines": 20 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9159097, + "headersEnd": 9159179, + "end": 9159939, + "octets": 760, + "lines": 12 + } + ], + "end": 9159961, + "octets": 1825, + "lines": 41 + }, + "end": 9159961, + "octets": 1825, + "lines": 41 + }, + { + "mboxMarkerBegin": 9159963, + "mboxMarkerLength": 31, + "begin": 9159996, + "headersEnd": 9161157, + "body": { + "mimeType": "multipart/mixed", + "begin": 9159996, + "headersEnd": 9161157, + "children": [ + { + "mimeType": "text/plain", + "begin": 9161341, + "headersEnd": 9161422, + "end": 9162176, + "octets": 754, + "lines": 14 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 9162186, + "headersEnd": 9162369, + "end": 9164615, + "octets": 2246, + "lines": 31 + } + ], + "end": 9164625, + "octets": 3468, + "lines": 60 + }, + "end": 9164625, + "octets": 3468, + "lines": 60 + }, + { + "mboxMarkerBegin": 9164627, + "mboxMarkerLength": 31, + "begin": 9164660, + "headersEnd": 9165820, + "body": { + "mimeType": "multipart/mixed", + "begin": 9164660, + "headersEnd": 9165820, + "children": [ + { + "mimeType": "text/plain", + "begin": 9166018, + "headersEnd": 9166099, + "end": 9168957, + "octets": 2858, + "lines": 47 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 9168981, + "headersEnd": 9169164, + "end": 9171746, + "octets": 2582, + "lines": 35 + } + ], + "end": 9171770, + "octets": 5950, + "lines": 97 + }, + "end": 9171770, + "octets": 5950, + "lines": 97 + }, + { + "mboxMarkerBegin": 9171772, + "mboxMarkerLength": 7, + "begin": 9171781, + "headersEnd": 9171996, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9171781, + "headersEnd": 9171996, + "end": 9176246, + "octets": 4250, + "lines": 58 + }, + "end": 9176246, + "octets": 4250, + "lines": 58 + }, + { + "mboxMarkerBegin": 9176248, + "mboxMarkerLength": 31, + "begin": 9176281, + "headersEnd": 9177199, + "body": { + "mimeType": "multipart/signed", + "begin": 9176281, + "headersEnd": 9177199, + "children": [ + { + "mimeType": "image/jpeg", + "begin": 9177275, + "headersEnd": 9177413, + "end": 9188281, + "octets": 10868, + "lines": 147 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9188311, + "headersEnd": 9188466, + "end": 9193140, + "octets": 4674, + "lines": 64 + } + ], + "end": 9193172, + "octets": 15973, + "lines": 224 + }, + "end": 9193172, + "octets": 15973, + "lines": 224 + }, + { + "mboxMarkerBegin": 9193174, + "mboxMarkerLength": 31, + "begin": 9193207, + "headersEnd": 9194031, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9193207, + "headersEnd": 9194031, + "end": 9211049, + "octets": 17018, + "lines": 258 + }, + "end": 9211049, + "octets": 17018, + "lines": 258 + }, + { + "mboxMarkerBegin": 9211051, + "mboxMarkerLength": 31, + "begin": 9211084, + "headersEnd": 9211913, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9211084, + "headersEnd": 9211913, + "end": 9237261, + "octets": 25348, + "lines": 385 + }, + "end": 9237261, + "octets": 25348, + "lines": 385 + }, + { + "mboxMarkerBegin": 9237263, + "mboxMarkerLength": 31, + "begin": 9237296, + "headersEnd": 9238125, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9237296, + "headersEnd": 9238125, + "end": 9274811, + "octets": 36686, + "lines": 556 + }, + "end": 9274811, + "octets": 36686, + "lines": 556 + }, + { + "mboxMarkerBegin": 9274813, + "mboxMarkerLength": 31, + "begin": 9274846, + "headersEnd": 9275678, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9274846, + "headersEnd": 9275678, + "end": 9327768, + "octets": 52090, + "lines": 790 + }, + "end": 9327768, + "octets": 52090, + "lines": 790 + }, + { + "mboxMarkerBegin": 9327770, + "mboxMarkerLength": 31, + "begin": 9327803, + "headersEnd": 9329218, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9327803, + "headersEnd": 9329218, + "end": 9330668, + "octets": 1450, + "lines": 20 + }, + "end": 9330668, + "octets": 1450, + "lines": 20 + }, + { + "mboxMarkerBegin": 9330670, + "mboxMarkerLength": 31, + "begin": 9330703, + "headersEnd": 9332080, + "body": { + "mimeType": "multipart/signed", + "begin": 9330703, + "headersEnd": 9332080, + "children": [ + { + "mimeType": "text/plain", + "begin": 9332127, + "headersEnd": 9332194, + "end": 9332304, + "octets": 110, + "lines": 4 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9332351, + "headersEnd": 9332506, + "end": 9336492, + "octets": 3986, + "lines": 54 + } + ], + "end": 9336541, + "octets": 4461, + "lines": 69 + }, + "end": 9336541, + "octets": 4461, + "lines": 69 + }, + { + "mboxMarkerBegin": 9336543, + "mboxMarkerLength": 31, + "begin": 9336576, + "headersEnd": 9337807, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9336576, + "headersEnd": 9337807, + "end": 9341357, + "octets": 3550, + "lines": 55 + }, + "end": 9341357, + "octets": 3550, + "lines": 55 + }, + { + "mboxMarkerBegin": 9341359, + "mboxMarkerLength": 31, + "begin": 9341392, + "headersEnd": 9342490, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9341392, + "headersEnd": 9342490, + "end": 9343160, + "octets": 670, + "lines": 10 + }, + "end": 9343160, + "octets": 670, + "lines": 10 + }, + { + "mboxMarkerBegin": 9343162, + "mboxMarkerLength": 7, + "begin": 9343171, + "headersEnd": 9343574, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9343171, + "headersEnd": 9343574, + "end": 9351298, + "octets": 7724, + "lines": 105 + }, + "end": 9351298, + "octets": 7724, + "lines": 105 + }, + { + "mboxMarkerBegin": 9351300, + "mboxMarkerLength": 31, + "begin": 9351333, + "headersEnd": 9352135, + "body": { + "mimeType": "message/rfc822", + "begin": 9351333, + "headersEnd": 9352135, + "message": { + "begin": 9352135, + "headersEnd": 9353538, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9352135, + "headersEnd": 9353538, + "end": 9354990, + "octets": 1452, + "lines": 20 + }, + "end": 9354990, + "octets": 1452, + "lines": 20 + }, + "end": 9354990, + "octets": 2855, + "lines": 43 + }, + "end": 9354990, + "octets": 2855, + "lines": 43 + }, + { + "mboxMarkerBegin": 9354992, + "mboxMarkerLength": 31, + "begin": 9355025, + "headersEnd": 9355752, + "body": { + "mimeType": "multipart/mixed", + "begin": 9355025, + "headersEnd": 9355752, + "children": [ + { + "mimeType": "text/plain", + "begin": 9355828, + "headersEnd": 9355907, + "end": 9355923, + "octets": 16, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 9355953, + "headersEnd": 9356111, + "message": { + "begin": 9356111, + "headersEnd": 9357514, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9356111, + "headersEnd": 9357514, + "end": 9358966, + "octets": 1452, + "lines": 20 + }, + "end": 9358966, + "octets": 1452, + "lines": 20 + }, + "end": 9358966, + "octets": 2855, + "lines": 43 + } + ], + "end": 9358998, + "octets": 3246, + "lines": 58 + }, + "end": 9358998, + "octets": 3246, + "lines": 58 + }, + { + "mboxMarkerBegin": 9359000, + "mboxMarkerLength": 31, + "begin": 9359033, + "headersEnd": 9359714, + "body": { + "mimeType": "multipart/signed", + "begin": 9359033, + "headersEnd": 9359714, + "children": [ + { + "mimeType": "text/plain", + "begin": 9359818, + "headersEnd": 9359897, + "end": 9359939, + "octets": 42, + "lines": 2 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9359983, + "headersEnd": 9360138, + "end": 9365770, + "octets": 5632, + "lines": 77 + } + ], + "end": 9365816, + "octets": 6102, + "lines": 91 + }, + "end": 9365816, + "octets": 6102, + "lines": 91 + }, + { + "mboxMarkerBegin": 9365818, + "mboxMarkerLength": 31, + "begin": 9365851, + "headersEnd": 9366934, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9365851, + "headersEnd": 9366934, + "end": 9377310, + "octets": 10376, + "lines": 141 + }, + "end": 9377310, + "octets": 10376, + "lines": 141 + }, + { + "mboxMarkerBegin": 9377312, + "mboxMarkerLength": 31, + "begin": 9377345, + "headersEnd": 9378745, + "body": { + "mimeType": "multipart/signed", + "begin": 9377345, + "headersEnd": 9378745, + "children": [ + { + "mimeType": "text/plain", + "begin": 9378849, + "headersEnd": 9378928, + "end": 9379555, + "octets": 627, + "lines": 17 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9379599, + "headersEnd": 9379754, + "end": 9381566, + "octets": 1812, + "lines": 25 + } + ], + "end": 9381612, + "octets": 2867, + "lines": 54 + }, + "end": 9381612, + "octets": 2867, + "lines": 54 + }, + { + "mboxMarkerBegin": 9381614, + "mboxMarkerLength": 31, + "begin": 9381647, + "headersEnd": 9382210, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9381647, + "headersEnd": 9382210, + "end": 9382740, + "octets": 530, + "lines": 8 + }, + "end": 9382740, + "octets": 530, + "lines": 8 + }, + { + "mboxMarkerBegin": 9382742, + "mboxMarkerLength": 7, + "begin": 9382751, + "headersEnd": 9384087, + "body": { + "mimeType": "MULTIPART/SIGNED", + "begin": 9382751, + "headersEnd": 9384087, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 9384349, + "headersEnd": 9384395, + "end": 9384998, + "octets": 603, + "lines": 15 + } + ], + "end": 9385042, + "octets": 955, + "lines": 24 + }, + "end": 9385042, + "octets": 955, + "lines": 24 + }, + { + "mboxMarkerBegin": 9385044, + "mboxMarkerLength": 7, + "begin": 9385053, + "headersEnd": 9386420, + "body": { + "mimeType": "MULTIPART/SIGNED", + "begin": 9385053, + "headersEnd": 9386420, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 9386682, + "headersEnd": 9386728, + "end": 9386835, + "octets": 107, + "lines": 6 + }, + { + "mimeType": "MULTIPART/MIXED", + "begin": 9386879, + "headersEnd": 9387046, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 9387306, + "headersEnd": 9387416, + "end": 9387511, + "octets": 95, + "lines": 4 + }, + { + "mimeType": "MESSAGE/RFC822", + "begin": 9387553, + "headersEnd": 9387649, + "message": { + "begin": 9387649, + "headersEnd": 9388845, + "body": { + "mimeType": "text/plain", + "begin": 9387649, + "headersEnd": 9388845, + "end": 9389055, + "octets": 210, + "lines": 5 + }, + "end": 9389055, + "octets": 210, + "lines": 5 + }, + "end": 9389055, + "octets": 1406, + "lines": 34 + }, + { + "mimeType": "TEXT/X-VCARD", + "begin": 9389097, + "headersEnd": 9389267, + "end": 9389757, + "octets": 490, + "lines": 11 + } + ], + "end": 9389799, + "octets": 2753, + "lines": 70 + }, + { + "mimeType": "APPLICATION/X-PKCS7-SIGNATURE", + "begin": 9389843, + "headersEnd": 9390060, + "end": 9395354, + "octets": 5294, + "lines": 72 + } + ], + "end": 9395402, + "octets": 8982, + "lines": 169 + }, + "end": 9395402, + "octets": 8982, + "lines": 169 + }, + { + "mboxMarkerBegin": 9395404, + "mboxMarkerLength": 31, + "begin": 9395437, + "headersEnd": 9396672, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9395437, + "headersEnd": 9396672, + "end": 9399592, + "octets": 2920, + "lines": 38 + }, + "end": 9399592, + "octets": 2920, + "lines": 38 + }, + { + "mboxMarkerBegin": 9399594, + "mboxMarkerLength": 31, + "begin": 9399627, + "headersEnd": 9400806, + "body": { + "mimeType": "Application/x-pkcs7-mime", + "begin": 9399627, + "headersEnd": 9400806, + "end": 9402958, + "octets": 2152, + "lines": 30 + }, + "end": 9402958, + "octets": 2152, + "lines": 30 + }, + { + "mboxMarkerBegin": 9402960, + "mboxMarkerLength": 31, + "begin": 9402993, + "headersEnd": 9404092, + "body": { + "mimeType": "multipart/signed", + "begin": 9402993, + "headersEnd": 9404092, + "children": [ + { + "mimeType": "text/plain", + "begin": 9404127, + "headersEnd": 9404194, + "end": 9404194, + "octets": 0, + "lines": 0 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9404229, + "headersEnd": 9404311, + "end": 9407065, + "octets": 2754, + "lines": 42 + } + ], + "end": 9407102, + "octets": 3010, + "lines": 53 + }, + "end": 9407102, + "octets": 3010, + "lines": 53 + }, + { + "mboxMarkerBegin": 9407104, + "mboxMarkerLength": 31, + "begin": 9407137, + "headersEnd": 9408193, + "body": { + "mimeType": "multipart/mixed", + "begin": 9407137, + "headersEnd": 9408193, + "children": [ + { + "mimeType": "text/plain", + "begin": 9408236, + "headersEnd": 9408317, + "end": 9408783, + "octets": 466, + "lines": 14 + }, + { + "mimeType": "text/html", + "begin": 9408826, + "headersEnd": 9408904, + "end": 9409741, + "octets": 837, + "lines": 27 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9409784, + "headersEnd": 9409884, + "end": 9411100, + "octets": 1216, + "lines": 16 + } + ], + "end": 9411145, + "octets": 2952, + "lines": 72 + }, + "end": 9411145, + "octets": 2952, + "lines": 72 + }, + { + "mboxMarkerBegin": 9411147, + "mboxMarkerLength": 31, + "begin": 9411180, + "headersEnd": 9412276, + "body": { + "mimeType": "multipart/signed", + "begin": 9411180, + "headersEnd": 9412276, + "children": [ + { + "mimeType": "text/plain", + "begin": 9412321, + "headersEnd": 9412394, + "end": 9412553, + "octets": 159, + "lines": 7 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9412598, + "headersEnd": 9412680, + "end": 9416832, + "octets": 4152, + "lines": 57 + } + ], + "end": 9416879, + "octets": 4603, + "lines": 75 + }, + "end": 9416879, + "octets": 4603, + "lines": 75 + }, + { + "mboxMarkerBegin": 9416881, + "mboxMarkerLength": 7, + "begin": 9416890, + "headersEnd": 9417456, + "body": { + "mimeType": "multipart/signed", + "begin": 9416890, + "headersEnd": 9417456, + "children": [ + { + "mimeType": "text/plain", + "begin": 9417502, + "headersEnd": 9417569, + "end": 9417727, + "octets": 158, + "lines": 4 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9417773, + "headersEnd": 9417928, + "end": 9421898, + "octets": 3970, + "lines": 54 + } + ], + "end": 9421944, + "octets": 4488, + "lines": 69 + }, + "end": 9421944, + "octets": 4488, + "lines": 69 + }, + { + "mboxMarkerBegin": 9421946, + "mboxMarkerLength": 31, + "begin": 9421979, + "headersEnd": 9423163, + "body": { + "mimeType": "multipart/mixed", + "begin": 9421979, + "headersEnd": 9423163, + "children": [ + { + "mimeType": "text/plain", + "begin": 9423344, + "headersEnd": 9423425, + "end": 9423502, + "octets": 77, + "lines": 5 + }, + { + "mimeType": "application/octet-stream", + "begin": 9423545, + "headersEnd": 9423643, + "end": 9427249, + "octets": 3606, + "lines": 47 + } + ], + "end": 9427294, + "octets": 4131, + "lines": 66 + }, + "end": 9427294, + "octets": 4131, + "lines": 66 + }, + { + "mboxMarkerBegin": 9427296, + "mboxMarkerLength": 31, + "begin": 9427329, + "headersEnd": 9428452, + "body": { + "mimeType": "multipart/signed", + "begin": 9427329, + "headersEnd": 9428452, + "children": [ + { + "mimeType": "text/plain", + "begin": 9428488, + "headersEnd": 9428569, + "end": 9428647, + "octets": 78, + "lines": 5 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9428683, + "headersEnd": 9428765, + "end": 9432539, + "octets": 3774, + "lines": 58 + } + ], + "end": 9432575, + "octets": 4123, + "lines": 73 + }, + "end": 9432575, + "octets": 4123, + "lines": 73 + }, + { + "mboxMarkerBegin": 9432577, + "mboxMarkerLength": 31, + "begin": 9432610, + "headersEnd": 9433755, + "body": { + "mimeType": "multipart/report", + "begin": 9432610, + "headersEnd": 9433755, + "children": [ + { + "mimeType": "message/delivery-status", + "begin": 9433897, + "headersEnd": 9433938, + "end": 9434132, + "octets": 194, + "lines": 6 + }, + { + "mimeType": "message/rfc822", + "begin": 9434159, + "headersEnd": 9434191, + "message": { + "begin": 9434191, + "headersEnd": 9435012, + "body": { + "mimeType": "text/plain", + "begin": 9434191, + "headersEnd": 9435012, + "end": 9435023, + "octets": 11, + "lines": 1 + }, + "end": 9435023, + "octets": 11, + "lines": 1 + }, + "end": 9435023, + "octets": 832, + "lines": 16 + } + ], + "end": 9435052, + "octets": 1297, + "lines": 34 + }, + "end": 9435052, + "octets": 1297, + "lines": 34 + }, + { + "mboxMarkerBegin": 9435054, + "mboxMarkerLength": 45, + "begin": 9435101, + "headersEnd": 9435272, + "body": { + "mimeType": "text/plain", + "begin": 9435101, + "headersEnd": 9435272, + "end": 9470358, + "octets": 35086, + "lines": 592 + }, + "end": 9470358, + "octets": 35086, + "lines": 592 + }, + { + "mboxMarkerBegin": 9470360, + "mboxMarkerLength": 45, + "begin": 9470407, + "headersEnd": 9470571, + "body": { + "mimeType": "application/octet-stream", + "begin": 9470407, + "headersEnd": 9470571, + "end": 9505657, + "octets": 35086, + "lines": 592 + }, + "end": 9505657, + "octets": 35086, + "lines": 592 + }, + { + "mboxMarkerBegin": 9505659, + "mboxMarkerLength": 7, + "begin": 9505668, + "headersEnd": 9506276, + "body": { + "mimeType": "application/octet-stream", + "begin": 9505668, + "headersEnd": 9506276, + "end": 9507714, + "octets": 1438, + "lines": 39 + }, + "end": 9507714, + "octets": 1438, + "lines": 39 + }, + { + "mboxMarkerBegin": 9507716, + "mboxMarkerLength": 7, + "begin": 9507725, + "headersEnd": 9508642, + "body": { + "mimeType": "MULTIPART/mixed", + "begin": 9507725, + "headersEnd": 9508642, + "children": [ + { + "mimeType": "TEXT/plain", + "begin": 9508682, + "headersEnd": 9508710, + "end": 9509065, + "octets": 355, + "lines": 10 + }, + { + "mimeType": "AUDIO/basic", + "begin": 9509107, + "headersEnd": 9509204, + "end": 9754734, + "octets": 245530, + "lines": 3961 + } + ], + "end": 9754778, + "octets": 246136, + "lines": 3982 + }, + "end": 9754778, + "octets": 246136, + "lines": 3982 + }, + { + "mboxMarkerBegin": 9754780, + "mboxMarkerLength": 7, + "begin": 9754789, + "headersEnd": 9755397, + "body": { + "mimeType": "multipart/mixed", + "begin": 9754789, + "headersEnd": 9755397, + "children": [ + { + "mimeType": "image/pbm", + "begin": 9755461, + "headersEnd": 9755625, + "end": 9834319, + "octets": 78694, + "lines": 406 + } + ], + "end": 9834353, + "octets": 78956, + "lines": 416 + }, + "end": 9834353, + "octets": 78956, + "lines": 416 + }, + { + "mboxMarkerBegin": 9834355, + "mboxMarkerLength": 7, + "begin": 9834364, + "headersEnd": 9834521, + "body": { + "mimeType": "message/partial", + "begin": 9834364, + "headersEnd": 9834521, + "end": 9838129, + "octets": 3608, + "lines": 49 + }, + "end": 9838129, + "octets": 3608, + "lines": 49 + }, + { + "mboxMarkerBegin": 9838131, + "mboxMarkerLength": 7, + "begin": 9838140, + "headersEnd": 9838928, + "body": { + "mimeType": "multipart/alternative", + "begin": 9838140, + "headersEnd": 9838928, + "children": [ + { + "mimeType": "text/plain", + "begin": 9839127, + "headersEnd": 9839173, + "end": 9839594, + "octets": 421, + "lines": 7 + }, + { + "mimeType": "multipart/mixed", + "begin": 9839637, + "headersEnd": 9839725, + "children": [ + { + "mimeType": "text/richtext", + "begin": 9839768, + "headersEnd": 9839862, + "end": 9839934, + "octets": 72, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 9839979, + "headersEnd": 9840082, + "end": 9850936, + "octets": 10854, + "lines": 157 + }, + { + "mimeType": "text/richtext", + "begin": 9850981, + "headersEnd": 9851075, + "end": 9851141, + "octets": 66, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 9851186, + "headersEnd": 9851283, + "end": 9857273, + "octets": 5990, + "lines": 87 + }, + { + "mimeType": "text/richtext", + "begin": 9857318, + "headersEnd": 9857412, + "end": 9857447, + "octets": 35, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 9857492, + "headersEnd": 9857597, + "end": 9869413, + "octets": 11816, + "lines": 170 + }, + { + "mimeType": "text/richtext", + "begin": 9869458, + "headersEnd": 9869552, + "end": 9869585, + "octets": 33, + "lines": 2 + } + ], + "end": 9869632, + "octets": 29907, + "lines": 460 + } + ], + "end": 9869675, + "octets": 30747, + "lines": 480 + }, + "end": 9869675, + "octets": 30747, + "lines": 480 + }, + { + "mboxMarkerBegin": 9869677, + "mboxMarkerLength": 7, + "begin": 9869686, + "headersEnd": 9869745, + "body": { + "mimeType": "text/plain", + "begin": 9869686, + "headersEnd": 9869745, + "end": 9870980, + "octets": 1235, + "lines": 28 + }, + "end": 9870980, + "octets": 1235, + "lines": 28 + }, + { + "mboxMarkerBegin": 9870982, + "mboxMarkerLength": 31, + "begin": 9871015, + "headersEnd": 9871171, + "body": { + "mimeType": "text/plain", + "begin": 9871015, + "headersEnd": 9871171, + "end": 9874346, + "octets": 3175, + "lines": 68 + }, + "end": 9874346, + "octets": 3175, + "lines": 68 + }, + { + "mboxMarkerBegin": 9874348, + "mboxMarkerLength": 31, + "begin": 9874381, + "headersEnd": 9876277, + "body": { + "mimeType": "multipart/mixed", + "begin": 9874381, + "headersEnd": 9876277, + "children": [ + { + "mimeType": "text/plain", + "begin": 9876322, + "headersEnd": 9876403, + "end": 9877284, + "octets": 881, + "lines": 18 + }, + { + "mimeType": "application/vcard", + "begin": 9877331, + "headersEnd": 9877497, + "end": 9881199, + "octets": 3702, + "lines": 61 + } + ], + "end": 9881248, + "octets": 4971, + "lines": 92 + }, + "end": 9881248, + "octets": 4971, + "lines": 92 + }, + { + "mboxMarkerBegin": 9881250, + "mboxMarkerLength": 7, + "begin": 9881259, + "headersEnd": 9881826, + "body": { + "mimeType": "multipart/mixed", + "begin": 9881259, + "headersEnd": 9881826, + "children": [ + { + "mimeType": "text/plain", + "begin": 9881845, + "headersEnd": 9881874, + "end": 9882856, + "octets": 982, + "lines": 19 + }, + { + "mimeType": "image/pgm", + "begin": 9882875, + "headersEnd": 9882938, + "end": 10000250, + "octets": 117312, + "lines": 1586 + } + ], + "end": 10000273, + "octets": 118447, + "lines": 1617 + }, + "end": 10000273, + "octets": 118447, + "lines": 1617 + }, + { + "mboxMarkerBegin": 10000275, + "mboxMarkerLength": 7, + "begin": 10000284, + "headersEnd": 10001099, + "body": { + "mimeType": "multipart/alternative", + "begin": 10000284, + "headersEnd": 10001099, + "children": [ + { + "mimeType": "text/plain", + "begin": 10001298, + "headersEnd": 10001344, + "end": 10010656, + "octets": 9312, + "lines": 349 + }, + { + "mimeType": "multipart/mixed", + "begin": 10010699, + "headersEnd": 10010787, + "children": [ + { + "mimeType": "text/richtext", + "begin": 10010830, + "headersEnd": 10010924, + "end": 10013768, + "octets": 2844, + "lines": 69 + }, + { + "mimeType": "message/external-body", + "begin": 10013813, + "headersEnd": 10014016, + "message": { + "begin": 10014016, + "headersEnd": 10014045, + "body": { + "mimeType": "text/X-HTML", + "begin": 10014016, + "headersEnd": 10014045, + "end": 10014049, + "octets": 4, + "lines": 2 + }, + "end": 10014049, + "octets": 4, + "lines": 2 + }, + "end": 10014049, + "octets": 33, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 10014094, + "headersEnd": 10014188, + "end": 10015184, + "octets": 996, + "lines": 22 + }, + { + "mimeType": "text/SGML", + "begin": 10015229, + "headersEnd": 10015349, + "end": 10015723, + "octets": 374, + "lines": 15 + }, + { + "mimeType": "text/richtext", + "begin": 10015768, + "headersEnd": 10015862, + "end": 10015874, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 10015919, + "headersEnd": 10016110, + "message": { + "begin": 10016110, + "headersEnd": 10016139, + "body": { + "mimeType": "text/X-HTML", + "begin": 10016110, + "headersEnd": 10016139, + "end": 10016141, + "octets": 2, + "lines": 1 + }, + "end": 10016141, + "octets": 2, + "lines": 1 + }, + "end": 10016141, + "octets": 31, + "lines": 3 + }, + { + "mimeType": "text/richtext", + "begin": 10016186, + "headersEnd": 10016280, + "end": 10016292, + "octets": 12, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 10016337, + "headersEnd": 10016447, + "end": 10019473, + "octets": 3026, + "lines": 43 + }, + { + "mimeType": "text/richtext", + "begin": 10019518, + "headersEnd": 10019612, + "end": 10026464, + "octets": 6852, + "lines": 260 + } + ], + "end": 10026511, + "octets": 15724, + "lines": 475 + } + ], + "end": 10026556, + "octets": 25457, + "lines": 837 + }, + "end": 10026556, + "octets": 25457, + "lines": 837 + }, + { + "mboxMarkerBegin": 10026558, + "mboxMarkerLength": 7, + "begin": 10026567, + "headersEnd": 10027702, + "body": { + "mimeType": "multipart/mixed", + "begin": 10026567, + "headersEnd": 10027702, + "children": [ + { + "mimeType": "text/plain", + "begin": 10027713, + "headersEnd": 10027715, + "end": 10028056, + "octets": 341, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 10028069, + "headersEnd": 10028131, + "end": 10058521, + "octets": 30390, + "lines": 411 + }, + { + "mimeType": "text/plain", + "begin": 10058534, + "headersEnd": 10058536, + "end": 10058717, + "octets": 181, + "lines": 9 + } + ], + "end": 10058732, + "octets": 31030, + "lines": 440 + }, + "end": 10058732, + "octets": 31030, + "lines": 440 + }, + { + "mboxMarkerBegin": 10058734, + "mboxMarkerLength": 7, + "begin": 10058743, + "headersEnd": 10060481, + "body": { + "mimeType": "text/plain", + "begin": 10058743, + "headersEnd": 10060481, + "end": 10246231, + "octets": 185750, + "lines": 2951 + }, + "end": 10246231, + "octets": 185750, + "lines": 2951 + }, + { + "mboxMarkerBegin": 10246233, + "mboxMarkerLength": 7, + "begin": 10246242, + "headersEnd": 10246965, + "body": { + "mimeType": "multipart/mixed", + "begin": 10246242, + "headersEnd": 10246965, + "children": [ + { + "mimeType": "text/plain", + "begin": 10246993, + "headersEnd": 10246995, + "end": 10247016, + "octets": 21, + "lines": 1 + }, + { + "mimeType": "image/pgm", + "begin": 10247046, + "headersEnd": 10247203, + "end": 10331377, + "octets": 84174, + "lines": 434 + }, + { + "mimeType": "text/plain", + "begin": 10331407, + "headersEnd": 10331409, + "end": 10331676, + "octets": 267, + "lines": 9 + } + ], + "end": 10331708, + "octets": 84743, + "lines": 455 + }, + "end": 10331708, + "octets": 84743, + "lines": 455 + }, + { + "mboxMarkerBegin": 10331710, + "mboxMarkerLength": 7, + "begin": 10331719, + "headersEnd": 10332401, + "body": { + "mimeType": "multipart/mixed", + "begin": 10331719, + "headersEnd": 10332401, + "children": [ + { + "mimeType": "text/plain", + "begin": 10332429, + "headersEnd": 10332431, + "end": 10332497, + "octets": 66, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 10332527, + "headersEnd": 10332693, + "end": 10365025, + "octets": 32332, + "lines": 167 + }, + { + "mimeType": "text/plain", + "begin": 10365055, + "headersEnd": 10365057, + "end": 10365075, + "octets": 18, + "lines": 2 + }, + { + "mimeType": "image/pbm", + "begin": 10365105, + "headersEnd": 10365269, + "end": 10366359, + "octets": 1090, + "lines": 6 + }, + { + "mimeType": "text/plain", + "begin": 10366389, + "headersEnd": 10366391, + "end": 10366423, + "octets": 32, + "lines": 2 + }, + { + "mimeType": "application/x-annotate-2", + "begin": 10366453, + "headersEnd": 10366524, + "end": 10554551, + "octets": 188027, + "lines": 1990 + }, + { + "mimeType": "text/plain", + "begin": 10554581, + "headersEnd": 10554583, + "end": 10554591, + "octets": 8, + "lines": 1 + } + ], + "end": 10554623, + "octets": 222222, + "lines": 2196 + }, + "end": 10554623, + "octets": 222222, + "lines": 2196 + }, + { + "mboxMarkerBegin": 10554625, + "mboxMarkerLength": 7, + "begin": 10554634, + "headersEnd": 10554906, + "body": { + "mimeType": "application/octet-stream", + "begin": 10554634, + "headersEnd": 10554906, + "end": 10630586, + "octets": 75680, + "lines": 1023 + }, + "end": 10630586, + "octets": 75680, + "lines": 1023 + }, + { + "mboxMarkerBegin": 10630588, + "mboxMarkerLength": 7, + "begin": 10630597, + "headersEnd": 10631896, + "body": { + "mimeType": "multipart/alternative", + "begin": 10630597, + "headersEnd": 10631896, + "children": [ + { + "mimeType": "text/plain", + "begin": 10632489, + "headersEnd": 10632491, + "end": 10634372, + "octets": 1881, + "lines": 34 + }, + { + "mimeType": "multipart/mixed", + "begin": 10634433, + "headersEnd": 10634539, + "children": [ + { + "mimeType": "text/richtext", + "begin": 10634600, + "headersEnd": 10634676, + "end": 10636704, + "octets": 2028, + "lines": 29 + }, + { + "mimeType": "image/xwd", + "begin": 10636767, + "headersEnd": 10636829, + "end": 10644867, + "octets": 8038, + "lines": 109 + }, + { + "mimeType": "text/plain", + "begin": 10644930, + "headersEnd": 10645003, + "end": 10645008, + "octets": 5, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 10645071, + "headersEnd": 10645168, + "end": 10687620, + "octets": 42452, + "lines": 574 + } + ], + "end": 10687685, + "octets": 53146, + "lines": 736 + } + ], + "end": 10687748, + "octets": 55852, + "lines": 787 + }, + "end": 10687748, + "octets": 55852, + "lines": 787 + }, + { + "mboxMarkerBegin": 10687750, + "mboxMarkerLength": 7, + "begin": 10687759, + "headersEnd": 10687916, + "body": { + "mimeType": "message/partial", + "begin": 10687759, + "headersEnd": 10687916, + "end": 10692786, + "octets": 4870, + "lines": 68 + }, + "end": 10692786, + "octets": 4870, + "lines": 68 + }, + { + "mboxMarkerBegin": 10692788, + "mboxMarkerLength": 7, + "begin": 10692797, + "headersEnd": 10693559, + "body": { + "mimeType": "multipart/alternative", + "begin": 10692797, + "headersEnd": 10693559, + "children": [ + { + "mimeType": "text/plain", + "begin": 10693945, + "headersEnd": 10693947, + "end": 10694323, + "octets": 376, + "lines": 8 + }, + { + "mimeType": "multipart/mixed", + "begin": 10694366, + "headersEnd": 10694454, + "children": [ + { + "mimeType": "text/plain", + "begin": 10694497, + "headersEnd": 10694570, + "end": 10694663, + "octets": 93, + "lines": 4 + }, + { + "mimeType": "image/gif", + "begin": 10694708, + "headersEnd": 10694826, + "end": 10700572, + "octets": 5746, + "lines": 83 + }, + { + "mimeType": "text/plain", + "begin": 10700617, + "headersEnd": 10700690, + "end": 10700899, + "octets": 209, + "lines": 6 + } + ], + "end": 10700946, + "octets": 6492, + "lines": 110 + } + ], + "end": 10700991, + "octets": 7432, + "lines": 133 + }, + "end": 10700991, + "octets": 7432, + "lines": 133 + } +] \ No newline at end of file From 0599f755cc99c422862bdebc06c3be33b0f98e34 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 7 Jul 2020 10:52:05 -0400 Subject: [PATCH 658/741] Added unix mbox offsets for the unit tests --- .../mbox/content-length.unix-offsets.json | 1254 +++ UnitTests/TestData/mbox/jwz.unix-offsets.json | 8918 +++++++++++++++++ 2 files changed, 10172 insertions(+) create mode 100644 UnitTests/TestData/mbox/content-length.unix-offsets.json create mode 100644 UnitTests/TestData/mbox/jwz.unix-offsets.json diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.json b/UnitTests/TestData/mbox/content-length.unix-offsets.json new file mode 100644 index 0000000000..71b5fefae9 --- /dev/null +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.json @@ -0,0 +1,1254 @@ +[ + { + "mboxMarkerBegin": 0, + "mboxMarkerLength": 7, + "begin": 8, + "headersEnd": 657, + "body": { + "mimeType": "multipart/mixed", + "begin": 8, + "headersEnd": 657, + "children": [ + { + "mimeType": "text/plain", + "begin": 706, + "headersEnd": 732, + "end": 806, + "octets": 74, + "lines": 5 + }, + { + "mimeType": "message/rfc822", + "begin": 856, + "headersEnd": 918, + "message": { + "begin": 918, + "headersEnd": 1700, + "body": { + "mimeType": "text/plain", + "begin": 918, + "headersEnd": 1700, + "end": 1837, + "octets": 137, + "lines": 4 + }, + "end": 1837, + "octets": 137, + "lines": 4 + }, + "end": 1837, + "octets": 919, + "lines": 21 + } + ], + "end": 1888, + "octets": 1231, + "lines": 34 + }, + "end": 1888, + "octets": 1231, + "lines": 34 + }, + { + "mboxMarkerBegin": 1889, + "mboxMarkerLength": 7, + "begin": 1897, + "headersEnd": 2365, + "body": { + "mimeType": "multipart/mixed", + "begin": 1897, + "headersEnd": 2365, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 2438, + "headersEnd": 2582, + "message": { + "begin": 2582, + "headersEnd": 3011, + "body": { + "mimeType": "text/plain", + "begin": 2582, + "headersEnd": 3011, + "end": 3048, + "octets": 37, + "lines": 2 + }, + "end": 3048, + "octets": 37, + "lines": 2 + }, + "end": 3048, + "octets": 466, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 3076, + "headersEnd": 3199, + "end": 3657, + "octets": 458, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 3685, + "headersEnd": 3808, + "end": 4294, + "octets": 486, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4322, + "headersEnd": 4449, + "end": 4976, + "octets": 527, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 5004, + "headersEnd": 5129, + "end": 5627, + "octets": 498, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 5655, + "headersEnd": 5799, + "message": { + "begin": 5799, + "headersEnd": 6228, + "body": { + "mimeType": "text/plain", + "begin": 5799, + "headersEnd": 6228, + "end": 6265, + "octets": 37, + "lines": 1 + }, + "end": 6265, + "octets": 37, + "lines": 1 + }, + "end": 6265, + "octets": 466, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 6293, + "headersEnd": 6464, + "message": { + "begin": 6464, + "headersEnd": 7034, + "body": { + "mimeType": "message/rfc822", + "begin": 6464, + "headersEnd": 7034, + "message": { + "begin": 7034, + "headersEnd": 7545, + "body": { + "mimeType": "message/rfc822", + "begin": 7034, + "headersEnd": 7545, + "message": { + "begin": 7545, + "headersEnd": 7955, + "body": { + "mimeType": "text/plain", + "begin": 7545, + "headersEnd": 7955, + "end": 7960, + "octets": 5, + "lines": 1 + }, + "end": 7960, + "octets": 5, + "lines": 1 + }, + "end": 7960, + "octets": 415, + "lines": 12 + }, + "end": 7960, + "octets": 415, + "lines": 12 + }, + "end": 7960, + "octets": 926, + "lines": 26 + }, + "end": 7960, + "octets": 926, + "lines": 26 + }, + "end": 7960, + "octets": 1496, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 7988, + "headersEnd": 8041, + "end": 8093, + "octets": 52, + "lines": 1 + } + ], + "end": 8122, + "octets": 5757, + "lines": 145 + }, + "end": 8122, + "octets": 5757, + "lines": 145 + }, + { + "mboxMarkerBegin": 8123, + "mboxMarkerLength": 7, + "begin": 8131, + "headersEnd": 8602, + "body": { + "mimeType": "multipart/mixed", + "begin": 8131, + "headersEnd": 8602, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 8675, + "headersEnd": 8823, + "message": { + "begin": 8823, + "headersEnd": 9251, + "body": { + "mimeType": "text/plain", + "begin": 8823, + "headersEnd": 9251, + "end": 9288, + "octets": 37, + "lines": 2 + }, + "end": 9288, + "octets": 37, + "lines": 2 + }, + "end": 9288, + "octets": 465, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 9316, + "headersEnd": 9443, + "end": 9901, + "octets": 458, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 9929, + "headersEnd": 10056, + "end": 10542, + "octets": 486, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 10570, + "headersEnd": 10701, + "end": 11228, + "octets": 527, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 11256, + "headersEnd": 11385, + "end": 11883, + "octets": 498, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 11911, + "headersEnd": 12059, + "message": { + "begin": 12059, + "headersEnd": 12487, + "body": { + "mimeType": "text/plain", + "begin": 12059, + "headersEnd": 12487, + "end": 12524, + "octets": 37, + "lines": 1 + }, + "end": 12524, + "octets": 37, + "lines": 1 + }, + "end": 12524, + "octets": 465, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 12552, + "headersEnd": 12727, + "message": { + "begin": 12727, + "headersEnd": 13300, + "body": { + "mimeType": "message/rfc822", + "begin": 12727, + "headersEnd": 13300, + "message": { + "begin": 13300, + "headersEnd": 13814, + "body": { + "mimeType": "message/rfc822", + "begin": 13300, + "headersEnd": 13814, + "message": { + "begin": 13814, + "headersEnd": 14223, + "body": { + "mimeType": "text/plain", + "begin": 13814, + "headersEnd": 14223, + "end": 14228, + "octets": 5, + "lines": 1 + }, + "end": 14228, + "octets": 5, + "lines": 1 + }, + "end": 14228, + "octets": 414, + "lines": 12 + }, + "end": 14228, + "octets": 414, + "lines": 12 + }, + "end": 14228, + "octets": 928, + "lines": 26 + }, + "end": 14228, + "octets": 928, + "lines": 26 + }, + "end": 14228, + "octets": 1501, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 14256, + "headersEnd": 14313, + "end": 14365, + "octets": 52, + "lines": 1 + } + ], + "end": 14394, + "octets": 5792, + "lines": 145 + }, + "end": 14394, + "octets": 5792, + "lines": 145 + }, + { + "mboxMarkerBegin": 14395, + "mboxMarkerLength": 31, + "begin": 14427, + "headersEnd": 15930, + "body": { + "mimeType": "multipart/related", + "begin": 14427, + "headersEnd": 15930, + "children": [ + { + "mimeType": "text/html", + "begin": 15975, + "headersEnd": 16066, + "end": 21265, + "octets": 5199, + "lines": 111 + }, + { + "mimeType": "image/gif", + "begin": 21310, + "headersEnd": 21509, + "end": 22438, + "octets": 929, + "lines": 13 + } + ], + "end": 22485, + "octets": 6555, + "lines": 139 + }, + "end": 22485, + "octets": 6555, + "lines": 139 + }, + { + "mboxMarkerBegin": 22486, + "mboxMarkerLength": 31, + "begin": 22518, + "headersEnd": 23752, + "body": { + "mimeType": "multipart/mixed", + "begin": 22518, + "headersEnd": 23752, + "children": [ + { + "mimeType": "text/plain", + "begin": 23836, + "headersEnd": 23912, + "end": 23939, + "octets": 27, + "lines": 3 + }, + { + "mimeType": "message/rfc822", + "begin": 23978, + "headersEnd": 24068, + "message": { + "begin": 24068, + "headersEnd": 24889, + "body": { + "mimeType": "multipart/alternative", + "begin": 24068, + "headersEnd": 24889, + "children": [ + { + "mimeType": "text/plain", + "begin": 24929, + "headersEnd": 25005, + "end": 25632, + "octets": 627, + "lines": 16 + }, + { + "mimeType": "multipart/related", + "begin": 25672, + "headersEnd": 25754, + "children": [ + { + "mimeType": "text/html", + "begin": 25794, + "headersEnd": 25869, + "end": 26719, + "octets": 850, + "lines": 18 + }, + { + "mimeType": "image/tiff", + "begin": 26759, + "headersEnd": 26943, + "end": 770910, + "octets": 743967, + "lines": 10192 + } + ], + "end": 770952, + "octets": 745198, + "lines": 10223 + } + ], + "end": 770996, + "octets": 746107, + "lines": 10252 + }, + "end": 770996, + "octets": 746107, + "lines": 10252 + }, + "end": 770996, + "octets": 746928, + "lines": 10268 + } + ], + "end": 771037, + "octets": 747285, + "lines": 10285 + }, + "end": 771037, + "octets": 747285, + "lines": 10285 + }, + { + "mboxMarkerBegin": 771038, + "mboxMarkerLength": 31, + "begin": 771070, + "headersEnd": 772334, + "body": { + "mimeType": "multipart/related", + "begin": 771070, + "headersEnd": 772334, + "children": [ + { + "mimeType": "text/html", + "begin": 772379, + "headersEnd": 772470, + "end": 774852, + "octets": 2382, + "lines": 50 + }, + { + "mimeType": "image/gif", + "begin": 774897, + "headersEnd": 775056, + "end": 781079, + "octets": 6023, + "lines": 79 + }, + { + "mimeType": "image/gif", + "begin": 781124, + "headersEnd": 781282, + "end": 793355, + "octets": 12073, + "lines": 157 + }, + { + "mimeType": "image/gif", + "begin": 793400, + "headersEnd": 793560, + "end": 815274, + "octets": 21714, + "lines": 282 + }, + { + "mimeType": "image/gif", + "begin": 815319, + "headersEnd": 815522, + "end": 818915, + "octets": 3393, + "lines": 45 + } + ], + "end": 818962, + "octets": 46628, + "lines": 649 + }, + "end": 818962, + "octets": 46628, + "lines": 649 + }, + { + "mboxMarkerBegin": 818963, + "mboxMarkerLength": 7, + "begin": 818971, + "headersEnd": 819882, + "body": { + "mimeType": "multipart/mixed", + "begin": 818971, + "headersEnd": 819882, + "children": [ + { + "mimeType": "text/richtext", + "begin": 819891, + "headersEnd": 819920, + "end": 822450, + "octets": 2530, + "lines": 96 + } + ], + "end": 822461, + "octets": 2579, + "lines": 102 + }, + "end": 822461, + "octets": 2579, + "lines": 102 + }, + { + "mboxMarkerBegin": 822462, + "mboxMarkerLength": 31, + "begin": 822494, + "headersEnd": 823647, + "body": { + "mimeType": "multipart/signed", + "begin": 822494, + "headersEnd": 823647, + "children": [ + { + "mimeType": "text/plain", + "begin": 823664, + "headersEnd": 823665, + "end": 824566, + "octets": 901, + "lines": 20 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 824584, + "headersEnd": 824663, + "end": 825411, + "octets": 748, + "lines": 12 + } + ], + "end": 825431, + "octets": 1784, + "lines": 41 + }, + "end": 825431, + "octets": 1784, + "lines": 41 + }, + { + "mboxMarkerBegin": 825432, + "mboxMarkerLength": 31, + "begin": 825464, + "headersEnd": 826606, + "body": { + "mimeType": "multipart/mixed", + "begin": 825464, + "headersEnd": 826606, + "children": [ + { + "mimeType": "text/plain", + "begin": 826786, + "headersEnd": 826864, + "end": 827605, + "octets": 741, + "lines": 14 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 827613, + "headersEnd": 827791, + "end": 830006, + "octets": 2215, + "lines": 31 + } + ], + "end": 830015, + "octets": 3409, + "lines": 60 + }, + "end": 830015, + "octets": 3409, + "lines": 60 + }, + { + "mboxMarkerBegin": 830016, + "mboxMarkerLength": 31, + "begin": 830048, + "headersEnd": 831185, + "body": { + "mimeType": "multipart/mixed", + "begin": 830048, + "headersEnd": 831185, + "children": [ + { + "mimeType": "text/plain", + "begin": 831379, + "headersEnd": 831457, + "end": 834269, + "octets": 2812, + "lines": 47 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 834291, + "headersEnd": 834469, + "end": 837016, + "octets": 2547, + "lines": 35 + } + ], + "end": 837039, + "octets": 5854, + "lines": 97 + }, + "end": 837039, + "octets": 5854, + "lines": 97 + }, + { + "mboxMarkerBegin": 837040, + "mboxMarkerLength": 31, + "begin": 837072, + "headersEnd": 837972, + "body": { + "mimeType": "multipart/signed", + "begin": 837072, + "headersEnd": 837972, + "children": [ + { + "mimeType": "image/jpeg", + "begin": 838045, + "headersEnd": 838179, + "end": 848901, + "octets": 10722, + "lines": 147 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 848929, + "headersEnd": 849080, + "end": 853691, + "octets": 4611, + "lines": 64 + } + ], + "end": 853721, + "octets": 15749, + "lines": 224 + }, + "end": 853721, + "octets": 15749, + "lines": 224 + }, + { + "mboxMarkerBegin": 853722, + "mboxMarkerLength": 31, + "begin": 853754, + "headersEnd": 855145, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 853754, + "headersEnd": 855145, + "end": 856576, + "octets": 1431, + "lines": 20 + }, + "end": 856576, + "octets": 1431, + "lines": 20 + }, + { + "mboxMarkerBegin": 856577, + "mboxMarkerLength": 31, + "begin": 856609, + "headersEnd": 857962, + "body": { + "mimeType": "multipart/signed", + "begin": 856609, + "headersEnd": 857962, + "children": [ + { + "mimeType": "text/plain", + "begin": 858007, + "headersEnd": 858071, + "end": 858178, + "octets": 107, + "lines": 4 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 858223, + "headersEnd": 858374, + "end": 862307, + "octets": 3933, + "lines": 54 + } + ], + "end": 862354, + "octets": 4392, + "lines": 69 + }, + "end": 862354, + "octets": 4392, + "lines": 69 + }, + { + "mboxMarkerBegin": 862355, + "mboxMarkerLength": 31, + "begin": 862387, + "headersEnd": 863597, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 862387, + "headersEnd": 863597, + "end": 867092, + "octets": 3495, + "lines": 55 + }, + "end": 867092, + "octets": 3495, + "lines": 55 + }, + { + "mboxMarkerBegin": 867093, + "mboxMarkerLength": 31, + "begin": 867125, + "headersEnd": 868202, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 867125, + "headersEnd": 868202, + "end": 868863, + "octets": 661, + "lines": 10 + }, + "end": 868863, + "octets": 661, + "lines": 10 + }, + { + "mboxMarkerBegin": 868864, + "mboxMarkerLength": 31, + "begin": 868896, + "headersEnd": 869679, + "body": { + "mimeType": "message/rfc822", + "begin": 868896, + "headersEnd": 869679, + "message": { + "begin": 869679, + "headersEnd": 871059, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 869679, + "headersEnd": 871059, + "end": 872491, + "octets": 1432, + "lines": 20 + }, + "end": 872491, + "octets": 1432, + "lines": 20 + }, + "end": 872491, + "octets": 2812, + "lines": 43 + }, + "end": 872491, + "octets": 2812, + "lines": 43 + }, + { + "mboxMarkerBegin": 872492, + "mboxMarkerLength": 31, + "begin": 872524, + "headersEnd": 873234, + "body": { + "mimeType": "multipart/mixed", + "begin": 872524, + "headersEnd": 873234, + "children": [ + { + "mimeType": "text/plain", + "begin": 873307, + "headersEnd": 873383, + "end": 873398, + "octets": 15, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 873426, + "headersEnd": 873580, + "message": { + "begin": 873580, + "headersEnd": 874960, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 873580, + "headersEnd": 874960, + "end": 876392, + "octets": 1432, + "lines": 20 + }, + "end": 876392, + "octets": 1432, + "lines": 20 + }, + "end": 876392, + "octets": 2812, + "lines": 43 + } + ], + "end": 876422, + "octets": 3188, + "lines": 58 + }, + "end": 876422, + "octets": 3188, + "lines": 58 + }, + { + "mboxMarkerBegin": 876423, + "mboxMarkerLength": 31, + "begin": 876455, + "headersEnd": 877120, + "body": { + "mimeType": "multipart/signed", + "begin": 876455, + "headersEnd": 877120, + "children": [ + { + "mimeType": "text/plain", + "begin": 877221, + "headersEnd": 877297, + "end": 877338, + "octets": 41, + "lines": 2 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 877380, + "headersEnd": 877531, + "end": 883087, + "octets": 5556, + "lines": 77 + } + ], + "end": 883131, + "octets": 6011, + "lines": 91 + }, + "end": 883131, + "octets": 6011, + "lines": 91 + }, + { + "mboxMarkerBegin": 883132, + "mboxMarkerLength": 31, + "begin": 883164, + "headersEnd": 884226, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 883164, + "headersEnd": 884226, + "end": 894462, + "octets": 10236, + "lines": 141 + }, + "end": 894462, + "octets": 10236, + "lines": 141 + }, + { + "mboxMarkerBegin": 894463, + "mboxMarkerLength": 31, + "begin": 894495, + "headersEnd": 895871, + "body": { + "mimeType": "multipart/signed", + "begin": 894495, + "headersEnd": 895871, + "children": [ + { + "mimeType": "text/plain", + "begin": 895972, + "headersEnd": 896048, + "end": 896659, + "octets": 611, + "lines": 17 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 896701, + "headersEnd": 896852, + "end": 898640, + "octets": 1788, + "lines": 25 + } + ], + "end": 898684, + "octets": 2813, + "lines": 54 + }, + "end": 898684, + "octets": 2813, + "lines": 54 + }, + { + "mboxMarkerBegin": 898685, + "mboxMarkerLength": 31, + "begin": 898717, + "headersEnd": 899265, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 898717, + "headersEnd": 899265, + "end": 899788, + "octets": 523, + "lines": 8 + }, + "end": 899788, + "octets": 523, + "lines": 8 + }, + { + "mboxMarkerBegin": 899789, + "mboxMarkerLength": 31, + "begin": 899821, + "headersEnd": 901036, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 899821, + "headersEnd": 901036, + "end": 903918, + "octets": 2882, + "lines": 38 + }, + "end": 903918, + "octets": 2882, + "lines": 38 + }, + { + "mboxMarkerBegin": 903919, + "mboxMarkerLength": 31, + "begin": 903951, + "headersEnd": 905109, + "body": { + "mimeType": "Application/x-pkcs7-mime", + "begin": 903951, + "headersEnd": 905109, + "end": 907231, + "octets": 2122, + "lines": 30 + }, + "end": 907231, + "octets": 2122, + "lines": 30 + }, + { + "mboxMarkerBegin": 907232, + "mboxMarkerLength": 31, + "begin": 907264, + "headersEnd": 908342, + "body": { + "mimeType": "multipart/signed", + "begin": 907264, + "headersEnd": 908342, + "children": [ + { + "mimeType": "text/plain", + "begin": 908375, + "headersEnd": 908439, + "end": 908439, + "octets": 0, + "lines": 0 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 908472, + "headersEnd": 908551, + "end": 911264, + "octets": 2713, + "lines": 42 + } + ], + "end": 911299, + "octets": 2957, + "lines": 53 + }, + "end": 911299, + "octets": 2957, + "lines": 53 + }, + { + "mboxMarkerBegin": 911300, + "mboxMarkerLength": 31, + "begin": 911332, + "headersEnd": 912369, + "body": { + "mimeType": "multipart/mixed", + "begin": 911332, + "headersEnd": 912369, + "children": [ + { + "mimeType": "text/plain", + "begin": 912410, + "headersEnd": 912488, + "end": 912941, + "octets": 453, + "lines": 14 + }, + { + "mimeType": "text/html", + "begin": 912982, + "headersEnd": 913057, + "end": 913868, + "octets": 811, + "lines": 27 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 913909, + "headersEnd": 914006, + "end": 915206, + "octets": 1200, + "lines": 16 + } + ], + "end": 915249, + "octets": 2880, + "lines": 72 + }, + "end": 915249, + "octets": 2880, + "lines": 72 + }, + { + "mboxMarkerBegin": 915250, + "mboxMarkerLength": 31, + "begin": 915282, + "headersEnd": 916357, + "body": { + "mimeType": "multipart/signed", + "begin": 915282, + "headersEnd": 916357, + "children": [ + { + "mimeType": "text/plain", + "begin": 916400, + "headersEnd": 916470, + "end": 916622, + "octets": 152, + "lines": 7 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 916665, + "headersEnd": 916744, + "end": 920840, + "octets": 4096, + "lines": 57 + } + ], + "end": 920885, + "octets": 4528, + "lines": 75 + }, + "end": 920885, + "octets": 4528, + "lines": 75 + }, + { + "mboxMarkerBegin": 920886, + "mboxMarkerLength": 31, + "begin": 920918, + "headersEnd": 922020, + "body": { + "mimeType": "multipart/signed", + "begin": 920918, + "headersEnd": 922020, + "children": [ + { + "mimeType": "text/plain", + "begin": 922054, + "headersEnd": 922132, + "end": 922206, + "octets": 74, + "lines": 5 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 922240, + "headersEnd": 922319, + "end": 926036, + "octets": 3717, + "lines": 58 + } + ], + "end": 926071, + "octets": 4051, + "lines": 73 + }, + "end": 926071, + "octets": 4051, + "lines": 73 + }, + { + "mboxMarkerBegin": 926072, + "mboxMarkerLength": 31, + "begin": 926104, + "headersEnd": 927232, + "body": { + "mimeType": "multipart/report", + "begin": 926104, + "headersEnd": 927232, + "children": [ + { + "mimeType": "message/delivery-status", + "begin": 927369, + "headersEnd": 927408, + "end": 927596, + "octets": 188, + "lines": 6 + }, + { + "mimeType": "message/rfc822", + "begin": 927621, + "headersEnd": 927651, + "message": { + "begin": 927651, + "headersEnd": 928457, + "body": { + "mimeType": "text/plain", + "begin": 927651, + "headersEnd": 928457, + "end": 928468, + "octets": 11, + "lines": 1 + }, + "end": 928468, + "octets": 11, + "lines": 1 + }, + "end": 928468, + "octets": 817, + "lines": 16 + } + ], + "end": 928495, + "octets": 1263, + "lines": 34 + }, + "end": 928495, + "octets": 1263, + "lines": 34 + }, + { + "mboxMarkerBegin": 928496, + "mboxMarkerLength": 31, + "begin": 928528, + "headersEnd": 930393, + "body": { + "mimeType": "multipart/mixed", + "begin": 928528, + "headersEnd": 930393, + "children": [ + { + "mimeType": "text/plain", + "begin": 930437, + "headersEnd": 930515, + "end": 931378, + "octets": 863, + "lines": 18 + }, + { + "mimeType": "application/vcard", + "begin": 931423, + "headersEnd": 931584, + "end": 935225, + "octets": 3641, + "lines": 61 + } + ], + "end": 935272, + "octets": 4879, + "lines": 92 + }, + "end": 935272, + "octets": 4879, + "lines": 92 + } +] \ No newline at end of file diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.json b/UnitTests/TestData/mbox/jwz.unix-offsets.json new file mode 100644 index 0000000000..af7dcb6491 --- /dev/null +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.json @@ -0,0 +1,8918 @@ +[ + { + "mboxMarkerBegin": 0, + "mboxMarkerLength": 7, + "begin": 8, + "headersEnd": 517, + "body": { + "mimeType": "multipart/mixed", + "begin": 8, + "headersEnd": 517, + "children": [ + { + "mimeType": "multipart/parallel", + "begin": 534, + "headersEnd": 630, + "children": [ + { + "mimeType": "text/plain", + "begin": 661, + "headersEnd": 662, + "end": 1377, + "octets": 715, + "lines": 17 + }, + { + "mimeType": "audio/basic", + "begin": 1409, + "headersEnd": 1493, + "end": 32539, + "octets": 31046, + "lines": 426 + } + ], + "end": 32572, + "octets": 31942, + "lines": 452 + }, + { + "mimeType": "multipart/mixed", + "begin": 32590, + "headersEnd": 32683, + "children": [ + { + "mimeType": "image/gif", + "begin": 32714, + "headersEnd": 32796, + "end": 58444, + "octets": 25648, + "lines": 352 + }, + { + "mimeType": "image/gif", + "begin": 58476, + "headersEnd": 58558, + "end": 76971, + "octets": 18413, + "lines": 253 + }, + { + "mimeType": "application/octet-stream", + "begin": 77003, + "headersEnd": 77117, + "end": 120806, + "octets": 43689, + "lines": 2437 + }, + { + "mimeType": "application/atomicmail", + "begin": 120838, + "headersEnd": 120899, + "end": 129745, + "octets": 8846, + "lines": 357 + } + ], + "end": 129778, + "octets": 97095, + "lines": 3421 + }, + { + "mimeType": "audio/basic", + "begin": 129796, + "headersEnd": 129880, + "end": 177055, + "octets": 47175, + "lines": 647 + } + ], + "end": 177075, + "octets": 176558, + "lines": 4535 + }, + "end": 177075, + "octets": 176558, + "lines": 4535 + }, + { + "mboxMarkerBegin": 177076, + "mboxMarkerLength": 7, + "begin": 177084, + "headersEnd": 177633, + "body": { + "mimeType": "audio/basic", + "begin": 177084, + "headersEnd": 177633, + "end": 312903, + "octets": 135270, + "lines": 1854 + }, + "end": 312903, + "octets": 135270, + "lines": 1854 + }, + { + "mboxMarkerBegin": 312904, + "mboxMarkerLength": 7, + "begin": 312912, + "headersEnd": 313291, + "body": { + "mimeType": "text/plain", + "begin": 312912, + "headersEnd": 313291, + "end": 313492, + "octets": 201, + "lines": 4 + }, + "end": 313492, + "octets": 201, + "lines": 4 + }, + { + "mboxMarkerBegin": 313493, + "mboxMarkerLength": 7, + "begin": 313501, + "headersEnd": 314147, + "body": { + "mimeType": "multipart/alternative", + "begin": 313501, + "headersEnd": 314147, + "children": [ + { + "mimeType": "text/plain", + "begin": 314342, + "headersEnd": 314386, + "end": 314619, + "octets": 233, + "lines": 6 + }, + { + "mimeType": "multipart/mixed", + "begin": 314660, + "headersEnd": 314745, + "children": [ + { + "mimeType": "text/richtext", + "begin": 314787, + "headersEnd": 314878, + "end": 315024, + "octets": 146, + "lines": 3 + }, + { + "mimeType": "image/gif", + "begin": 315067, + "headersEnd": 315177, + "end": 319545, + "octets": 4368, + "lines": 64 + }, + { + "mimeType": "text/richtext", + "begin": 319588, + "headersEnd": 319679, + "end": 319724, + "octets": 45, + "lines": 3 + } + ], + "end": 319769, + "octets": 5024, + "lines": 87 + } + ], + "end": 319811, + "octets": 5664, + "lines": 106 + }, + "end": 319811, + "octets": 5664, + "lines": 106 + }, + { + "mboxMarkerBegin": 319812, + "mboxMarkerLength": 7, + "begin": 319820, + "headersEnd": 320568, + "body": { + "mimeType": "multipart/mixed", + "begin": 319820, + "headersEnd": 320568, + "children": [ + { + "mimeType": "text/richtext", + "begin": 320825, + "headersEnd": 320898, + "end": 321322, + "octets": 424, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 321385, + "headersEnd": 321415, + "message": { + "begin": 321415, + "headersEnd": 322251, + "body": { + "mimeType": "multipart/mixed", + "begin": 321415, + "headersEnd": 322251, + "children": [ + { + "mimeType": "text/plain", + "begin": 322557, + "headersEnd": 322651, + "end": 322755, + "octets": 104, + "lines": 6 + }, + { + "mimeType": "audio/basic", + "begin": 322786, + "headersEnd": 322875, + "end": 343502, + "octets": 20627, + "lines": 283 + }, + { + "mimeType": "text/plain", + "begin": 343533, + "headersEnd": 343534, + "end": 343534, + "octets": 0, + "lines": 0 + } + ], + "end": 343533, + "octets": 21282, + "lines": 308 + }, + "end": 343533, + "octets": 21282, + "lines": 308 + }, + "end": 343533, + "octets": 22118, + "lines": 324 + }, + { + "mimeType": "text/richtext", + "begin": 343596, + "headersEnd": 343669, + "end": 343776, + "octets": 107, + "lines": 4 + } + ], + "end": 343841, + "octets": 23273, + "lines": 359 + }, + "end": 343841, + "octets": 23273, + "lines": 359 + }, + { + "mboxMarkerBegin": 343842, + "mboxMarkerLength": 7, + "begin": 343850, + "headersEnd": 344568, + "body": { + "mimeType": "multipart/alternative", + "begin": 343850, + "headersEnd": 344568, + "children": [ + { + "mimeType": "text/plain", + "begin": 344763, + "headersEnd": 344807, + "end": 345567, + "octets": 760, + "lines": 18 + }, + { + "mimeType": "multipart/mixed", + "begin": 345608, + "headersEnd": 345693, + "children": [ + { + "mimeType": "text/richtext", + "begin": 345735, + "headersEnd": 345826, + "end": 346051, + "octets": 225, + "lines": 4 + }, + { + "mimeType": "image/x-xwd", + "begin": 346094, + "headersEnd": 346202, + "end": 1021266, + "octets": 675064, + "lines": 8982 + }, + { + "mimeType": "text/richtext", + "begin": 1021309, + "headersEnd": 1021400, + "end": 1021516, + "octets": 116, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 1021559, + "headersEnd": 1021685, + "end": 1702821, + "octets": 681136, + "lines": 9060 + }, + { + "mimeType": "text/richtext", + "begin": 1702864, + "headersEnd": 1702955, + "end": 1702965, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 1703008, + "headersEnd": 1703125, + "end": 1771303, + "octets": 68178, + "lines": 934 + }, + { + "mimeType": "text/richtext", + "begin": 1771346, + "headersEnd": 1771437, + "end": 1771575, + "octets": 138, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 1771618, + "headersEnd": 1771736, + "end": 2108498, + "octets": 336762, + "lines": 4472 + }, + { + "mimeType": "text/richtext", + "begin": 2108541, + "headersEnd": 2108632, + "end": 2108637, + "octets": 5, + "lines": 1 + } + ], + "end": 2108682, + "octets": 1762989, + "lines": 23515 + } + ], + "end": 2108724, + "octets": 1764156, + "lines": 23546 + }, + "end": 2108724, + "octets": 1764156, + "lines": 23546 + }, + { + "mboxMarkerBegin": 2108725, + "mboxMarkerLength": 7, + "begin": 2108733, + "headersEnd": 2109749, + "body": { + "mimeType": "text/plain", + "begin": 2108733, + "headersEnd": 2109749, + "end": 2110874, + "octets": 1125, + "lines": 39 + }, + "end": 2110874, + "octets": 1125, + "lines": 39 + }, + { + "mboxMarkerBegin": 2110875, + "mboxMarkerLength": 7, + "begin": 2110883, + "headersEnd": 2111121, + "body": { + "mimeType": "multipart/mixed", + "begin": 2110883, + "headersEnd": 2111121, + "children": [ + { + "mimeType": "text/plain", + "begin": 2111136, + "headersEnd": 2111137, + "end": 2111437, + "octets": 300, + "lines": 6 + }, + { + "mimeType": "multipart/parallel", + "begin": 2111453, + "headersEnd": 2111529, + "children": [ + { + "mimeType": "image/gif", + "begin": 2111545, + "headersEnd": 2111622, + "end": 2114882, + "octets": 3260, + "lines": 17 + }, + { + "mimeType": "audio/basic", + "begin": 2114899, + "headersEnd": 2115002, + "end": 2270901, + "octets": 155899, + "lines": 808 + } + ], + "end": 2270919, + "octets": 159390, + "lines": 837 + }, + { + "mimeType": "application/atomicmail", + "begin": 2270935, + "headersEnd": 2270991, + "end": 2275711, + "octets": 4720, + "lines": 195 + } + ], + "end": 2275728, + "octets": 164607, + "lines": 1050 + }, + "end": 2275728, + "octets": 164607, + "lines": 1050 + }, + { + "mboxMarkerBegin": 2275729, + "mboxMarkerLength": 7, + "begin": 2275737, + "headersEnd": 2276689, + "body": { + "mimeType": "audio/basic", + "begin": 2275737, + "headersEnd": 2276689, + "end": 2619749, + "octets": 343060, + "lines": 4456 + }, + "end": 2619749, + "octets": 343060, + "lines": 4456 + }, + { + "mboxMarkerBegin": 2619750, + "mboxMarkerLength": 7, + "begin": 2619758, + "headersEnd": 2619892, + "body": { + "mimeType": "multipart/mixed", + "begin": 2619758, + "headersEnd": 2619892, + "children": [ + { + "mimeType": "multipart/parallel", + "begin": 2619909, + "headersEnd": 2619982, + "children": [ + { + "mimeType": "text/plain", + "begin": 2620013, + "headersEnd": 2620014, + "end": 2620721, + "octets": 707, + "lines": 18 + }, + { + "mimeType": "audio/basic", + "begin": 2620753, + "headersEnd": 2620850, + "end": 2651896, + "octets": 31046, + "lines": 426 + } + ], + "end": 2651929, + "octets": 31947, + "lines": 453 + } + ], + "end": 2651948, + "octets": 32056, + "lines": 457 + }, + "end": 2651948, + "octets": 32056, + "lines": 457 + }, + { + "mboxMarkerBegin": 2651949, + "mboxMarkerLength": 7, + "begin": 2651957, + "headersEnd": 2652514, + "body": { + "mimeType": "image/pbm", + "begin": 2651957, + "headersEnd": 2652514, + "end": 2709293, + "octets": 56779, + "lines": 782 + }, + "end": 2709293, + "octets": 56779, + "lines": 782 + }, + { + "mboxMarkerBegin": 2709294, + "mboxMarkerLength": 7, + "begin": 2709302, + "headersEnd": 2710035, + "body": { + "mimeType": "multipart/alternative", + "begin": 2709302, + "headersEnd": 2710035, + "children": [ + { + "mimeType": "text/plain", + "begin": 2710619, + "headersEnd": 2710620, + "end": 2711172, + "octets": 552, + "lines": 14 + }, + { + "mimeType": "multipart/mixed", + "begin": 2711231, + "headersEnd": 2711334, + "children": [ + { + "mimeType": "text/richtext", + "begin": 2711394, + "headersEnd": 2711467, + "end": 2711886, + "octets": 419, + "lines": 7 + }, + { + "mimeType": "image/xwd", + "begin": 2711947, + "headersEnd": 2712006, + "end": 2741267, + "octets": 29261, + "lines": 401 + }, + { + "mimeType": "text/plain", + "begin": 2741328, + "headersEnd": 2741398, + "end": 2741439, + "octets": 41, + "lines": 4 + } + ], + "end": 2741502, + "octets": 30168, + "lines": 428 + } + ], + "end": 2741562, + "octets": 31527, + "lines": 459 + }, + "end": 2741562, + "octets": 31527, + "lines": 459 + }, + { + "mboxMarkerBegin": 2741563, + "mboxMarkerLength": 7, + "begin": 2741571, + "headersEnd": 2742224, + "body": { + "mimeType": "multipart/alternative", + "begin": 2741571, + "headersEnd": 2742224, + "children": [ + { + "mimeType": "text/plain", + "begin": 2742593, + "headersEnd": 2742594, + "end": 2743415, + "octets": 821, + "lines": 27 + }, + { + "mimeType": "multipart/mixed", + "begin": 2743445, + "headersEnd": 2743518, + "children": [ + { + "mimeType": "text/plain", + "begin": 2743549, + "headersEnd": 2743575, + "end": 2743712, + "octets": 137, + "lines": 6 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 2743744, + "headersEnd": 2743809, + "end": 2745006, + "octets": 1197, + "lines": 17 + }, + { + "mimeType": "text/plain", + "begin": 2745038, + "headersEnd": 2745064, + "end": 2745132, + "octets": 68, + "lines": 1 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 2745164, + "headersEnd": 2745229, + "end": 2746434, + "octets": 1205, + "lines": 17 + }, + { + "mimeType": "text/richtext", + "begin": 2746466, + "headersEnd": 2746495, + "end": 2747041, + "octets": 546, + "lines": 14 + } + ], + "end": 2747075, + "octets": 3557, + "lines": 75 + } + ], + "end": 2747107, + "octets": 4883, + "lines": 118 + }, + "end": 2747107, + "octets": 4883, + "lines": 118 + }, + { + "mboxMarkerBegin": 2747108, + "mboxMarkerLength": 7, + "begin": 2747116, + "headersEnd": 2748092, + "body": { + "mimeType": "text/plain", + "begin": 2747116, + "headersEnd": 2748092, + "end": 2749474, + "octets": 1382, + "lines": 32 + }, + "end": 2749474, + "octets": 1382, + "lines": 32 + }, + { + "mboxMarkerBegin": 2749475, + "mboxMarkerLength": 7, + "begin": 2749483, + "headersEnd": 2749739, + "body": { + "mimeType": "text/plain", + "begin": 2749483, + "headersEnd": 2749739, + "end": 2749995, + "octets": 256, + "lines": 6 + }, + "end": 2749995, + "octets": 256, + "lines": 6 + }, + { + "mboxMarkerBegin": 2749996, + "mboxMarkerLength": 7, + "begin": 2750004, + "headersEnd": 2750661, + "body": { + "mimeType": "text/plain", + "begin": 2750004, + "headersEnd": 2750661, + "end": 2751385, + "octets": 724, + "lines": 14 + }, + "end": 2751385, + "octets": 724, + "lines": 14 + }, + { + "mboxMarkerBegin": 2751386, + "mboxMarkerLength": 7, + "begin": 2751394, + "headersEnd": 2752379, + "body": { + "mimeType": "multipart/mixed", + "begin": 2751394, + "headersEnd": 2752379, + "children": [ + { + "mimeType": "text/plain", + "begin": 2752420, + "headersEnd": 2752466, + "end": 2752538, + "octets": 72, + "lines": 5 + }, + { + "mimeType": "multipart/appledouble", + "begin": 2752578, + "headersEnd": 2752665, + "children": [ + { + "mimeType": "application/applefile", + "begin": 2752707, + "headersEnd": 2752862, + "end": 2818779, + "octets": 65917, + "lines": 957 + }, + { + "mimeType": "application/octet-stream", + "begin": 2818820, + "headersEnd": 2819029, + "end": 3183310, + "octets": 364281, + "lines": 5281 + } + ], + "end": 3183354, + "octets": 430689, + "lines": 6256 + } + ], + "end": 3183395, + "octets": 431016, + "lines": 6272 + }, + "end": 3183395, + "octets": 431016, + "lines": 6272 + }, + { + "mboxMarkerBegin": 3183396, + "mboxMarkerLength": 7, + "begin": 3183404, + "headersEnd": 3184389, + "body": { + "mimeType": "multipart/mixed", + "begin": 3183404, + "headersEnd": 3184389, + "children": [ + { + "mimeType": "text/plain", + "begin": 3184430, + "headersEnd": 3184476, + "end": 3184548, + "octets": 72, + "lines": 5 + }, + { + "mimeType": "multipart/header-set", + "begin": 3184588, + "headersEnd": 3184674, + "children": [ + { + "mimeType": "application/applefile", + "begin": 3184716, + "headersEnd": 3184871, + "end": 3250788, + "octets": 65917, + "lines": 957 + }, + { + "mimeType": "application/octet-stream", + "begin": 3250829, + "headersEnd": 3251038, + "end": 3615319, + "octets": 364281, + "lines": 5281 + } + ], + "end": 3615363, + "octets": 430689, + "lines": 6256 + } + ], + "end": 3615404, + "octets": 431015, + "lines": 6272 + }, + "end": 3615404, + "octets": 431015, + "lines": 6272 + }, + { + "mboxMarkerBegin": 3615405, + "mboxMarkerLength": 7, + "begin": 3615413, + "headersEnd": 3615971, + "body": { + "mimeType": "Message/rfc822", + "begin": 3615413, + "headersEnd": 3615971, + "message": { + "begin": 3615971, + "headersEnd": 3616030, + "body": { + "mimeType": "text/plain", + "begin": 3615971, + "headersEnd": 3616030, + "end": 3616557, + "octets": 527, + "lines": 14 + }, + "end": 3616557, + "octets": 527, + "lines": 14 + }, + "end": 3616557, + "octets": 586, + "lines": 17 + }, + "end": 3616557, + "octets": 586, + "lines": 17 + }, + { + "mboxMarkerBegin": 3616558, + "mboxMarkerLength": 7, + "begin": 3616566, + "headersEnd": 3617279, + "body": { + "mimeType": "multipart/mixed", + "begin": 3616566, + "headersEnd": 3617279, + "children": [ + { + "mimeType": "text/plain", + "begin": 3617323, + "headersEnd": 3617349, + "end": 3617529, + "octets": 180, + "lines": 6 + }, + { + "mimeType": "application/postscript", + "begin": 3617573, + "headersEnd": 3617645, + "end": 3618537, + "octets": 892, + "lines": 12 + } + ], + "end": 3618690, + "octets": 1411, + "lines": 33 + }, + "end": 3618690, + "octets": 1411, + "lines": 33 + }, + { + "mboxMarkerBegin": 3618691, + "mboxMarkerLength": 7, + "begin": 3618699, + "headersEnd": 3619238, + "body": { + "mimeType": "multipart/mixed", + "begin": 3618699, + "headersEnd": 3619238, + "children": [ + { + "mimeType": "text/plain", + "begin": 3619314, + "headersEnd": 3619315, + "end": 3619707, + "octets": 392, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 3619747, + "headersEnd": 3619777, + "message": { + "begin": 3619777, + "headersEnd": 3620564, + "body": { + "mimeType": "text/plain", + "begin": 3619777, + "headersEnd": 3620564, + "end": 3623917, + "octets": 3353, + "lines": 72 + }, + "end": 3623917, + "octets": 3353, + "lines": 72 + }, + "end": 3623917, + "octets": 4140, + "lines": 88 + } + ], + "end": 3623959, + "octets": 4721, + "lines": 108 + }, + "end": 3623959, + "octets": 4721, + "lines": 108 + }, + { + "mboxMarkerBegin": 3623960, + "mboxMarkerLength": 7, + "begin": 3623968, + "headersEnd": 3624617, + "body": { + "mimeType": "multipart/mixed", + "begin": 3623968, + "headersEnd": 3624617, + "children": [ + { + "mimeType": "text/plain", + "begin": 3624666, + "headersEnd": 3624692, + "end": 3624766, + "octets": 74, + "lines": 5 + }, + { + "mimeType": "message/rfc822", + "begin": 3624816, + "headersEnd": 3624878, + "message": { + "begin": 3624878, + "headersEnd": 3625660, + "body": { + "mimeType": "text/plain", + "begin": 3624878, + "headersEnd": 3625660, + "end": 3625797, + "octets": 137, + "lines": 4 + }, + "end": 3625797, + "octets": 137, + "lines": 4 + }, + "end": 3625797, + "octets": 919, + "lines": 21 + } + ], + "end": 3625848, + "octets": 1231, + "lines": 34 + }, + "end": 3625848, + "octets": 1231, + "lines": 34 + }, + { + "mboxMarkerBegin": 3625849, + "mboxMarkerLength": 7, + "begin": 3625857, + "headersEnd": 3626367, + "body": { + "mimeType": "Application/octet-stream", + "begin": 3625857, + "headersEnd": 3626367, + "end": 3627786, + "octets": 1419, + "lines": 45 + }, + "end": 3627786, + "octets": 1419, + "lines": 45 + }, + { + "mboxMarkerBegin": 3627787, + "mboxMarkerLength": 50, + "begin": 3627838, + "headersEnd": 3628410, + "body": { + "mimeType": "message/partial", + "begin": 3627838, + "headersEnd": 3628410, + "end": 3688111, + "octets": 59701, + "lines": 954 + }, + "end": 3688111, + "octets": 59701, + "lines": 954 + }, + { + "mboxMarkerBegin": 3688112, + "mboxMarkerLength": 50, + "begin": 3688163, + "headersEnd": 3688732, + "body": { + "mimeType": "message/partial", + "begin": 3688163, + "headersEnd": 3688732, + "end": 3748539, + "octets": 59807, + "lines": 960 + }, + "end": 3748539, + "octets": 59807, + "lines": 960 + }, + { + "mboxMarkerBegin": 3748540, + "mboxMarkerLength": 7, + "begin": 3748548, + "headersEnd": 3749096, + "body": { + "mimeType": "multipart/mixed", + "begin": 3748548, + "headersEnd": 3749096, + "children": [ + { + "mimeType": "text/plain", + "begin": 3749112, + "headersEnd": 3749139, + "end": 3749210, + "octets": 71, + "lines": 4 + }, + { + "mimeType": "text/plain", + "begin": 3749226, + "headersEnd": 3749307, + "end": 3749948, + "octets": 641, + "lines": 9 + } + ], + "end": 3749967, + "octets": 871, + "lines": 25 + }, + "end": 3749967, + "octets": 871, + "lines": 25 + }, + { + "mboxMarkerBegin": 3749968, + "mboxMarkerLength": 7, + "begin": 3749976, + "headersEnd": 3750723, + "body": { + "mimeType": "image/gif", + "begin": 3749976, + "headersEnd": 3750723, + "end": 3792253, + "octets": 41530, + "lines": 570 + }, + "end": 3792253, + "octets": 41530, + "lines": 570 + }, + { + "mboxMarkerBegin": 3792254, + "mboxMarkerLength": 7, + "begin": 3792262, + "headersEnd": 3793416, + "body": { + "mimeType": "multipart/mixed", + "begin": 3792262, + "headersEnd": 3793416, + "children": [ + { + "mimeType": "text/plain", + "begin": 3793421, + "headersEnd": 3793422, + "end": 3795344, + "octets": 1922, + "lines": 43 + }, + { + "mimeType": "image/gif", + "begin": 3795350, + "headersEnd": 3795455, + "end": 3801677, + "octets": 6222, + "lines": 86 + } + ], + "end": 3801685, + "octets": 8269, + "lines": 139 + }, + "end": 3801685, + "octets": 8269, + "lines": 139 + }, + { + "mboxMarkerBegin": 3801686, + "mboxMarkerLength": 7, + "begin": 3801694, + "headersEnd": 3803142, + "body": { + "mimeType": "application/octet-stream", + "begin": 3801694, + "headersEnd": 3803142, + "end": 3909955, + "octets": 106813, + "lines": 1570 + }, + "end": 3909955, + "octets": 106813, + "lines": 1570 + }, + { + "mboxMarkerBegin": 3909956, + "mboxMarkerLength": 7, + "begin": 3909964, + "headersEnd": 3910563, + "body": { + "mimeType": "message/rfc822", + "begin": 3909964, + "headersEnd": 3910563, + "message": { + "begin": 3910563, + "headersEnd": 3911133, + "body": { + "mimeType": "message/rfc822", + "begin": 3910563, + "headersEnd": 3911133, + "message": { + "begin": 3911133, + "headersEnd": 3911675, + "body": { + "mimeType": "message/rfc822", + "begin": 3911133, + "headersEnd": 3911675, + "message": { + "begin": 3911675, + "headersEnd": 3912223, + "body": { + "mimeType": "multipart/mixed", + "begin": 3911675, + "headersEnd": 3912223, + "children": [ + { + "mimeType": "text/plain", + "begin": 3912327, + "headersEnd": 3912403, + "end": 3912452, + "octets": 49, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 3912511, + "headersEnd": 3912573, + "message": { + "begin": 3912573, + "headersEnd": 3913073, + "body": { + "mimeType": "multipart/mixed", + "begin": 3912573, + "headersEnd": 3913073, + "children": [ + { + "mimeType": "text/plain", + "begin": 3913167, + "headersEnd": 3913243, + "end": 3913365, + "octets": 122, + "lines": 5 + }, + { + "mimeType": "text/html", + "begin": 3913414, + "headersEnd": 3913483, + "end": 3913766, + "octets": 283, + "lines": 5 + } + ], + "end": 3913817, + "octets": 744, + "lines": 22 + }, + "end": 3913817, + "octets": 744, + "lines": 22 + }, + "end": 3913817, + "octets": 1244, + "lines": 38 + } + ], + "end": 3913880, + "octets": 1657, + "lines": 54 + }, + "end": 3913880, + "octets": 1657, + "lines": 54 + }, + "end": 3913880, + "octets": 2205, + "lines": 70 + }, + "end": 3913880, + "octets": 2205, + "lines": 70 + }, + "end": 3913880, + "octets": 2747, + "lines": 86 + }, + "end": 3913880, + "octets": 2747, + "lines": 86 + }, + "end": 3913880, + "octets": 3317, + "lines": 102 + }, + "end": 3913880, + "octets": 3317, + "lines": 102 + }, + { + "mboxMarkerBegin": 3913881, + "mboxMarkerLength": 7, + "begin": 3913889, + "headersEnd": 3914592, + "body": { + "mimeType": "multipart/mixed", + "begin": 3913889, + "headersEnd": 3914592, + "children": [ + { + "mimeType": "text/plain", + "begin": 3914619, + "headersEnd": 3914620, + "end": 3914661, + "octets": 41, + "lines": 2 + }, + { + "mimeType": "image/pbm", + "begin": 3914689, + "headersEnd": 3914834, + "end": 3992050, + "octets": 77216, + "lines": 401 + }, + { + "mimeType": "text/plain", + "begin": 3992078, + "headersEnd": 3992079, + "end": 3992110, + "octets": 31, + "lines": 3 + }, + { + "mimeType": "audio/basic", + "begin": 3992138, + "headersEnd": 3992285, + "end": 4095487, + "octets": 103202, + "lines": 535 + }, + { + "mimeType": "text/plain", + "begin": 4095515, + "headersEnd": 4095516, + "end": 4095676, + "octets": 160, + "lines": 5 + }, + { + "mimeType": "application/x-annotate", + "begin": 4095704, + "headersEnd": 4095793, + "end": 4175983, + "octets": 80190, + "lines": 1235 + }, + { + "mimeType": "text/plain", + "begin": 4176011, + "headersEnd": 4176012, + "end": 4176032, + "octets": 20, + "lines": 3 + } + ], + "end": 4176062, + "octets": 261470, + "lines": 2210 + }, + "end": 4176062, + "octets": 261470, + "lines": 2210 + }, + { + "mboxMarkerBegin": 4176063, + "mboxMarkerLength": 7, + "begin": 4176071, + "headersEnd": 4176736, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 4176071, + "headersEnd": 4176736, + "end": 4177728, + "octets": 992, + "lines": 18 + }, + "end": 4177728, + "octets": 992, + "lines": 18 + }, + { + "mboxMarkerBegin": 4177729, + "mboxMarkerLength": 7, + "begin": 4177737, + "headersEnd": 4178793, + "body": { + "mimeType": "multipart/alternative", + "begin": 4177737, + "headersEnd": 4178793, + "children": [ + { + "mimeType": "text/plain", + "begin": 4178988, + "headersEnd": 4179032, + "end": 4179436, + "octets": 404, + "lines": 13 + }, + { + "mimeType": "multipart/mixed", + "begin": 4179477, + "headersEnd": 4179562, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4179604, + "headersEnd": 4179695, + "end": 4179920, + "octets": 225, + "lines": 4 + }, + { + "mimeType": "image/x-xbm", + "begin": 4179963, + "headersEnd": 4180082, + "end": 4181466, + "octets": 1384, + "lines": 37 + }, + { + "mimeType": "text/richtext", + "begin": 4181509, + "headersEnd": 4181600, + "end": 4181748, + "octets": 148, + "lines": 9 + } + ], + "end": 4181793, + "octets": 2231, + "lines": 67 + } + ], + "end": 4181836, + "octets": 3043, + "lines": 93 + }, + "end": 4181836, + "octets": 3043, + "lines": 93 + }, + { + "mboxMarkerBegin": 4181837, + "mboxMarkerLength": 7, + "begin": 4181845, + "headersEnd": 4182515, + "body": { + "mimeType": "multipart/mixed", + "begin": 4181845, + "headersEnd": 4182515, + "children": [ + { + "mimeType": "text/plain", + "begin": 4182531, + "headersEnd": 4182558, + "end": 4182636, + "octets": 78, + "lines": 6 + }, + { + "mimeType": "image/gif", + "begin": 4182653, + "headersEnd": 4182713, + "end": 4187876, + "octets": 5163, + "lines": 71 + } + ], + "end": 4187896, + "octets": 5381, + "lines": 88 + }, + "end": 4187896, + "octets": 5381, + "lines": 88 + }, + { + "mboxMarkerBegin": 4187897, + "mboxMarkerLength": 7, + "begin": 4187905, + "headersEnd": 4188357, + "body": { + "mimeType": "Image/JPEG", + "begin": 4187905, + "headersEnd": 4188357, + "end": 4199771, + "octets": 11414, + "lines": 185 + }, + "end": 4199771, + "octets": 11414, + "lines": 185 + }, + { + "mboxMarkerBegin": 4199772, + "mboxMarkerLength": 7, + "begin": 4199780, + "headersEnd": 4200345, + "body": { + "mimeType": "Multipart/Mixed", + "begin": 4199780, + "headersEnd": 4200345, + "children": [ + { + "mimeType": "text/plain", + "begin": 4200356, + "headersEnd": 4200357, + "end": 4200395, + "octets": 38, + "lines": 1 + }, + { + "mimeType": "Multipart/MIXED", + "begin": 4200407, + "headersEnd": 4200462, + "children": [ + { + "mimeType": "Message/External-body", + "begin": 4200476, + "headersEnd": 4200592, + "message": { + "begin": 4200592, + "headersEnd": 4200669, + "body": { + "mimeType": "text/plain", + "begin": 4200592, + "headersEnd": 4200669, + "end": 4200736, + "octets": 67, + "lines": 2 + }, + "end": 4200736, + "octets": 67, + "lines": 2 + }, + "end": 4200736, + "octets": 144, + "lines": 5 + }, + { + "mimeType": "Message/External-body", + "begin": 4200751, + "headersEnd": 4200938, + "message": { + "begin": 4200938, + "headersEnd": 4201015, + "body": { + "mimeType": "text/plain", + "begin": 4200938, + "headersEnd": 4201015, + "end": 4201015, + "octets": 0, + "lines": 0 + }, + "end": 4201015, + "octets": 0, + "lines": 0 + }, + "end": 4201014, + "octets": 76, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 4201029, + "headersEnd": 4201164, + "message": { + "begin": 4201164, + "headersEnd": 4201232, + "body": { + "mimeType": "TEXT/HTML", + "begin": 4201164, + "headersEnd": 4201232, + "end": 4201232, + "octets": 0, + "lines": 0 + }, + "end": 4201232, + "octets": 0, + "lines": 0 + }, + "end": 4201231, + "octets": 67, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 4201246, + "headersEnd": 4201359, + "message": { + "begin": 4201359, + "headersEnd": 4201428, + "body": { + "mimeType": "image/gif", + "begin": 4201359, + "headersEnd": 4201428, + "end": 4201428, + "octets": 0, + "lines": 0 + }, + "end": 4201428, + "octets": 0, + "lines": 0 + }, + "end": 4201427, + "octets": 68, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 4201442, + "headersEnd": 4201547, + "message": { + "begin": 4201547, + "headersEnd": 4201616, + "body": { + "mimeType": "image/gif", + "begin": 4201547, + "headersEnd": 4201616, + "end": 4201616, + "octets": 0, + "lines": 0 + }, + "end": 4201616, + "octets": 0, + "lines": 0 + }, + "end": 4201615, + "octets": 68, + "lines": 2 + } + ], + "end": 4201632, + "octets": 1170, + "lines": 49 + } + ], + "end": 4201646, + "octets": 1301, + "lines": 58 + }, + "end": 4201646, + "octets": 1301, + "lines": 58 + }, + { + "mboxMarkerBegin": 4201647, + "mboxMarkerLength": 7, + "begin": 4201655, + "headersEnd": 4202220, + "body": { + "mimeType": "Multipart/Mixed", + "begin": 4201655, + "headersEnd": 4202220, + "children": [ + { + "mimeType": "text/plain", + "begin": 4202231, + "headersEnd": 4202232, + "end": 4205436, + "octets": 3204, + "lines": 65 + }, + { + "mimeType": "Multipart/Alternative", + "begin": 4205448, + "headersEnd": 4205509, + "children": [ + { + "mimeType": "Message/External-body", + "begin": 4205523, + "headersEnd": 4205639, + "message": { + "begin": 4205639, + "headersEnd": 4205716, + "body": { + "mimeType": "text/plain", + "begin": 4205639, + "headersEnd": 4205716, + "end": 4205783, + "octets": 67, + "lines": 2 + }, + "end": 4205783, + "octets": 67, + "lines": 2 + }, + "end": 4205783, + "octets": 144, + "lines": 5 + }, + { + "mimeType": "Message/External-body", + "begin": 4205798, + "headersEnd": 4205985, + "message": { + "begin": 4205985, + "headersEnd": 4206062, + "body": { + "mimeType": "text/plain", + "begin": 4205985, + "headersEnd": 4206062, + "end": 4206062, + "octets": 0, + "lines": 0 + }, + "end": 4206062, + "octets": 0, + "lines": 0 + }, + "end": 4206061, + "octets": 76, + "lines": 2 + } + ], + "end": 4206078, + "octets": 569, + "lines": 22 + } + ], + "end": 4206092, + "octets": 3872, + "lines": 95 + }, + "end": 4206092, + "octets": 3872, + "lines": 95 + }, + { + "mboxMarkerBegin": 4206093, + "mboxMarkerLength": 7, + "begin": 4206101, + "headersEnd": 4206569, + "body": { + "mimeType": "multipart/mixed", + "begin": 4206101, + "headersEnd": 4206569, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 4206642, + "headersEnd": 4206786, + "message": { + "begin": 4206786, + "headersEnd": 4207215, + "body": { + "mimeType": "text/plain", + "begin": 4206786, + "headersEnd": 4207215, + "end": 4207252, + "octets": 37, + "lines": 2 + }, + "end": 4207252, + "octets": 37, + "lines": 2 + }, + "end": 4207252, + "octets": 466, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 4207280, + "headersEnd": 4207403, + "end": 4207861, + "octets": 458, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4207889, + "headersEnd": 4208012, + "end": 4208498, + "octets": 486, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4208526, + "headersEnd": 4208653, + "end": 4209180, + "octets": 527, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 4209208, + "headersEnd": 4209333, + "end": 4209831, + "octets": 498, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 4209859, + "headersEnd": 4210003, + "message": { + "begin": 4210003, + "headersEnd": 4210432, + "body": { + "mimeType": "text/plain", + "begin": 4210003, + "headersEnd": 4210432, + "end": 4210469, + "octets": 37, + "lines": 1 + }, + "end": 4210469, + "octets": 37, + "lines": 1 + }, + "end": 4210469, + "octets": 466, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 4210497, + "headersEnd": 4210668, + "message": { + "begin": 4210668, + "headersEnd": 4211238, + "body": { + "mimeType": "message/rfc822", + "begin": 4210668, + "headersEnd": 4211238, + "message": { + "begin": 4211238, + "headersEnd": 4211749, + "body": { + "mimeType": "message/rfc822", + "begin": 4211238, + "headersEnd": 4211749, + "message": { + "begin": 4211749, + "headersEnd": 4212159, + "body": { + "mimeType": "text/plain", + "begin": 4211749, + "headersEnd": 4212159, + "end": 4212164, + "octets": 5, + "lines": 1 + }, + "end": 4212164, + "octets": 5, + "lines": 1 + }, + "end": 4212164, + "octets": 415, + "lines": 12 + }, + "end": 4212164, + "octets": 415, + "lines": 12 + }, + "end": 4212164, + "octets": 926, + "lines": 26 + }, + "end": 4212164, + "octets": 926, + "lines": 26 + }, + "end": 4212164, + "octets": 1496, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 4212192, + "headersEnd": 4212245, + "end": 4212297, + "octets": 52, + "lines": 1 + } + ], + "end": 4212326, + "octets": 5757, + "lines": 145 + }, + "end": 4212326, + "octets": 5757, + "lines": 145 + }, + { + "mboxMarkerBegin": 4212327, + "mboxMarkerLength": 7, + "begin": 4212335, + "headersEnd": 4212806, + "body": { + "mimeType": "multipart/mixed", + "begin": 4212335, + "headersEnd": 4212806, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 4212879, + "headersEnd": 4213027, + "message": { + "begin": 4213027, + "headersEnd": 4213455, + "body": { + "mimeType": "text/plain", + "begin": 4213027, + "headersEnd": 4213455, + "end": 4213492, + "octets": 37, + "lines": 2 + }, + "end": 4213492, + "octets": 37, + "lines": 2 + }, + "end": 4213492, + "octets": 465, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 4213520, + "headersEnd": 4213647, + "end": 4214105, + "octets": 458, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4214133, + "headersEnd": 4214260, + "end": 4214746, + "octets": 486, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4214774, + "headersEnd": 4214905, + "end": 4215432, + "octets": 527, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 4215460, + "headersEnd": 4215589, + "end": 4216087, + "octets": 498, + "lines": 7 + }, + { + "mimeType": "message/rfc822", + "begin": 4216115, + "headersEnd": 4216263, + "message": { + "begin": 4216263, + "headersEnd": 4216691, + "body": { + "mimeType": "text/plain", + "begin": 4216263, + "headersEnd": 4216691, + "end": 4216728, + "octets": 37, + "lines": 1 + }, + "end": 4216728, + "octets": 37, + "lines": 1 + }, + "end": 4216728, + "octets": 465, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 4216756, + "headersEnd": 4216931, + "message": { + "begin": 4216931, + "headersEnd": 4217504, + "body": { + "mimeType": "message/rfc822", + "begin": 4216931, + "headersEnd": 4217504, + "message": { + "begin": 4217504, + "headersEnd": 4218018, + "body": { + "mimeType": "message/rfc822", + "begin": 4217504, + "headersEnd": 4218018, + "message": { + "begin": 4218018, + "headersEnd": 4218427, + "body": { + "mimeType": "text/plain", + "begin": 4218018, + "headersEnd": 4218427, + "end": 4218432, + "octets": 5, + "lines": 1 + }, + "end": 4218432, + "octets": 5, + "lines": 1 + }, + "end": 4218432, + "octets": 414, + "lines": 12 + }, + "end": 4218432, + "octets": 414, + "lines": 12 + }, + "end": 4218432, + "octets": 928, + "lines": 26 + }, + "end": 4218432, + "octets": 928, + "lines": 26 + }, + "end": 4218432, + "octets": 1501, + "lines": 41 + }, + { + "mimeType": "text/html", + "begin": 4218460, + "headersEnd": 4218517, + "end": 4218569, + "octets": 52, + "lines": 1 + } + ], + "end": 4218598, + "octets": 5792, + "lines": 145 + }, + "end": 4218598, + "octets": 5792, + "lines": 145 + }, + { + "mboxMarkerBegin": 4218599, + "mboxMarkerLength": 7, + "begin": 4218607, + "headersEnd": 4219294, + "body": { + "mimeType": "multipart/mixed", + "begin": 4218607, + "headersEnd": 4219294, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4219341, + "headersEnd": 4219370, + "end": 4219786, + "octets": 416, + "lines": 30 + }, + { + "mimeType": "text/enriched", + "begin": 4219793, + "headersEnd": 4219866, + "end": 4220497, + "octets": 631, + "lines": 42 + }, + { + "mimeType": "text/plain", + "begin": 4220504, + "headersEnd": 4220505, + "end": 4220523, + "octets": 18, + "lines": 1 + }, + { + "mimeType": "text/plain", + "begin": 4220530, + "headersEnd": 4220531, + "end": 4220542, + "octets": 11, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 4220549, + "headersEnd": 4220579, + "message": { + "begin": 4220579, + "headersEnd": 4220794, + "body": { + "mimeType": "multipart/mixed", + "begin": 4220579, + "headersEnd": 4220794, + "children": [ + { + "mimeType": "text/html", + "begin": 4220800, + "headersEnd": 4220825, + "end": 4220848, + "octets": 23, + "lines": 1 + }, + { + "mimeType": "image/unknown", + "begin": 4220855, + "headersEnd": 4221030, + "end": 4221068, + "octets": 38, + "lines": 1 + } + ], + "end": 4221076, + "octets": 282, + "lines": 13 + }, + "end": 4221076, + "octets": 282, + "lines": 13 + }, + "end": 4221076, + "octets": 497, + "lines": 20 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 4221083, + "headersEnd": 4221161, + "end": 4230592, + "octets": 9431, + "lines": 128 + }, + { + "mimeType": "image/unknown", + "begin": 4230599, + "headersEnd": 4230774, + "end": 4230812, + "octets": 38, + "lines": 1 + }, + { + "mimeType": "image/x-xbitmap", + "begin": 4230819, + "headersEnd": 4230967, + "end": 4238788, + "octets": 7821, + "lines": 128 + }, + { + "mimeType": "multipart/digest", + "begin": 4238795, + "headersEnd": 4238847, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 4238857, + "headersEnd": 4238858, + "message": { + "begin": 4238858, + "headersEnd": 4238884, + "body": { + "mimeType": "text/plain", + "begin": 4238858, + "headersEnd": 4238884, + "end": 4238889, + "octets": 5, + "lines": 1 + }, + "end": 4238889, + "octets": 5, + "lines": 1 + }, + "end": 4238889, + "octets": 31, + "lines": 4 + }, + { + "mimeType": "message/rfc822", + "begin": 4238900, + "headersEnd": 4238901, + "message": { + "begin": 4238901, + "headersEnd": 4238927, + "body": { + "mimeType": "text/plain", + "begin": 4238901, + "headersEnd": 4238927, + "end": 4238932, + "octets": 5, + "lines": 1 + }, + "end": 4238932, + "octets": 5, + "lines": 1 + }, + "end": 4238932, + "octets": 31, + "lines": 4 + }, + { + "mimeType": "message/rfc822", + "begin": 4238943, + "headersEnd": 4238944, + "message": { + "begin": 4238944, + "headersEnd": 4238970, + "body": { + "mimeType": "text/plain", + "begin": 4238944, + "headersEnd": 4238970, + "end": 4238975, + "octets": 5, + "lines": 1 + }, + "end": 4238975, + "octets": 5, + "lines": 1 + }, + "end": 4238975, + "octets": 31, + "lines": 4 + }, + { + "mimeType": "text/html", + "begin": 4238986, + "headersEnd": 4239011, + "end": 4239093, + "octets": 82, + "lines": 2 + }, + { + "mimeType": "message/rfc822", + "begin": 4239104, + "headersEnd": 4239105, + "message": { + "begin": 4239105, + "headersEnd": 4239159, + "body": { + "mimeType": "text/richtext", + "begin": 4239105, + "headersEnd": 4239159, + "end": 4239208, + "octets": 49, + "lines": 1 + }, + "end": 4239208, + "octets": 49, + "lines": 1 + }, + "end": 4239208, + "octets": 103, + "lines": 5 + }, + { + "mimeType": "message/rfc822", + "begin": 4239219, + "headersEnd": 4239220, + "message": { + "begin": 4239220, + "headersEnd": 4239246, + "body": { + "mimeType": "text/plain", + "begin": 4239220, + "headersEnd": 4239246, + "end": 4239251, + "octets": 5, + "lines": 1 + }, + "end": 4239251, + "octets": 5, + "lines": 1 + }, + "end": 4239251, + "octets": 31, + "lines": 4 + } + ], + "end": 4239263, + "octets": 416, + "lines": 37 + } + ], + "end": 4239312, + "octets": 20018, + "lines": 428 + }, + "end": 4239312, + "octets": 20018, + "lines": 428 + }, + { + "mboxMarkerBegin": 4239313, + "mboxMarkerLength": 7, + "begin": 4239321, + "headersEnd": 4239982, + "body": { + "mimeType": "multipart/mixed", + "begin": 4239321, + "headersEnd": 4239982, + "children": [ + { + "mimeType": "text/plain", + "begin": 4240008, + "headersEnd": 4240009, + "end": 4241229, + "octets": 1220, + "lines": 27 + }, + { + "mimeType": "image/pbm", + "begin": 4241256, + "headersEnd": 4241401, + "end": 4312718, + "octets": 71317, + "lines": 370 + }, + { + "mimeType": "text/plain", + "begin": 4312745, + "headersEnd": 4312746, + "end": 4312746, + "octets": 0, + "lines": 0 + } + ], + "end": 4312775, + "octets": 72793, + "lines": 409 + }, + "end": 4312775, + "octets": 72793, + "lines": 409 + }, + { + "mboxMarkerBegin": 4312776, + "mboxMarkerLength": 7, + "begin": 4312784, + "headersEnd": 4313717, + "body": { + "mimeType": "message/partial", + "begin": 4312784, + "headersEnd": 4313717, + "end": 4562758, + "octets": 249041, + "lines": 3430 + }, + "end": 4562758, + "octets": 249041, + "lines": 3430 + }, + { + "mboxMarkerBegin": 4562759, + "mboxMarkerLength": 7, + "begin": 4562767, + "headersEnd": 4563695, + "body": { + "mimeType": "multipart/mixed", + "begin": 4562767, + "headersEnd": 4563695, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4563935, + "headersEnd": 4564008, + "end": 4564472, + "octets": 464, + "lines": 9 + }, + { + "mimeType": "image/gif", + "begin": 4564518, + "headersEnd": 4564577, + "end": 4588813, + "octets": 24236, + "lines": 332 + }, + { + "mimeType": "text/richtext", + "begin": 4588859, + "headersEnd": 4588932, + "end": 4589380, + "octets": 448, + "lines": 10 + }, + { + "mimeType": "image/gif", + "begin": 4589426, + "headersEnd": 4589485, + "end": 4600699, + "octets": 11214, + "lines": 154 + }, + { + "mimeType": "text/richtext", + "begin": 4600745, + "headersEnd": 4600818, + "end": 4601122, + "octets": 304, + "lines": 6 + }, + { + "mimeType": "image/gif", + "begin": 4601168, + "headersEnd": 4601227, + "end": 4617677, + "octets": 16450, + "lines": 226 + }, + { + "mimeType": "text/richtext", + "begin": 4617723, + "headersEnd": 4617796, + "end": 4618456, + "octets": 660, + "lines": 15 + } + ], + "end": 4618504, + "octets": 54809, + "lines": 792 + }, + "end": 4618504, + "octets": 54809, + "lines": 792 + }, + { + "mboxMarkerBegin": 4618505, + "mboxMarkerLength": 7, + "begin": 4618513, + "headersEnd": 4619332, + "body": { + "mimeType": "multipart/mixed", + "begin": 4618513, + "headersEnd": 4619332, + "children": [ + { + "mimeType": "text/plain", + "begin": 4619361, + "headersEnd": 4619362, + "end": 4620012, + "octets": 650, + "lines": 18 + }, + { + "mimeType": "Image/JPEG", + "begin": 4620042, + "headersEnd": 4620102, + "end": 4666555, + "octets": 46453, + "lines": 762 + } + ], + "end": 4666587, + "octets": 47255, + "lines": 788 + }, + "end": 4666587, + "octets": 47255, + "lines": 788 + }, + { + "mboxMarkerBegin": 4666588, + "mboxMarkerLength": 7, + "begin": 4666596, + "headersEnd": 4667343, + "body": { + "mimeType": "multipart/mixed", + "begin": 4666596, + "headersEnd": 4667343, + "children": [ + { + "mimeType": "text/enriched", + "begin": 4667800, + "headersEnd": 4667873, + "end": 4673188, + "octets": 5315, + "lines": 160 + }, + { + "mimeType": "image/gif", + "begin": 4673212, + "headersEnd": 4673309, + "end": 4675889, + "octets": 2580, + "lines": 36 + }, + { + "mimeType": "text/enriched", + "begin": 4675913, + "headersEnd": 4675986, + "end": 4676504, + "octets": 518, + "lines": 10 + }, + { + "mimeType": "audio/basic", + "begin": 4676528, + "headersEnd": 4676642, + "end": 4699702, + "octets": 23060, + "lines": 316 + }, + { + "mimeType": "text/enriched", + "begin": 4699726, + "headersEnd": 4699799, + "end": 4700377, + "octets": 578, + "lines": 14 + }, + { + "mimeType": "message/external-body", + "begin": 4700401, + "headersEnd": 4700486, + "message": { + "begin": 4700486, + "headersEnd": 4700556, + "body": { + "mimeType": "text/plain", + "begin": 4700486, + "headersEnd": 4700556, + "end": 4700556, + "octets": 0, + "lines": 0 + }, + "end": 4700556, + "octets": 0, + "lines": 0 + }, + "end": 4700555, + "octets": 69, + "lines": 2 + }, + { + "mimeType": "text/enriched", + "begin": 4700579, + "headersEnd": 4700652, + "end": 4700928, + "octets": 276, + "lines": 5 + }, + { + "mimeType": "message/external-body", + "begin": 4700952, + "headersEnd": 4701098, + "message": { + "begin": 4701098, + "headersEnd": 4701168, + "body": { + "mimeType": "text/plain", + "begin": 4701098, + "headersEnd": 4701168, + "end": 4701168, + "octets": 0, + "lines": 0 + }, + "end": 4701168, + "octets": 0, + "lines": 0 + }, + "end": 4701167, + "octets": 69, + "lines": 2 + }, + { + "mimeType": "text/enriched", + "begin": 4701191, + "headersEnd": 4701264, + "end": 4702333, + "octets": 1069, + "lines": 34 + } + ], + "end": 4702358, + "octets": 35015, + "lines": 639 + }, + "end": 4702358, + "octets": 35015, + "lines": 639 + }, + { + "mboxMarkerBegin": 4702359, + "mboxMarkerLength": 7, + "begin": 4702367, + "headersEnd": 4702528, + "body": { + "mimeType": "Multipart/mixed", + "begin": 4702367, + "headersEnd": 4702528, + "children": [ + { + "mimeType": "image/gif", + "begin": 4702540, + "headersEnd": 4702609, + "end": 4778953, + "octets": 76344, + "lines": 1145 + }, + { + "mimeType": "text/plain", + "begin": 4778966, + "headersEnd": 4778967, + "end": 4778997, + "octets": 30, + "lines": 1 + } + ], + "end": 4779011, + "octets": 76483, + "lines": 1154 + }, + "end": 4779011, + "octets": 76483, + "lines": 1154 + }, + { + "mboxMarkerBegin": 4779012, + "mboxMarkerLength": 7, + "begin": 4779020, + "headersEnd": 4780235, + "body": { + "mimeType": "MULTIPART/MIXED", + "begin": 4779020, + "headersEnd": 4780235, + "children": [ + { + "mimeType": "TEXT/plain", + "begin": 4780273, + "headersEnd": 4780317, + "end": 4780769, + "octets": 452, + "lines": 8 + }, + { + "mimeType": "AUDIO/basic", + "begin": 4780808, + "headersEnd": 4780901, + "end": 4908644, + "octets": 127743, + "lines": 2095 + } + ], + "end": 4908685, + "octets": 128450, + "lines": 2114 + }, + "end": 4908685, + "octets": 128450, + "lines": 2114 + }, + { + "mboxMarkerBegin": 4908686, + "mboxMarkerLength": 7, + "begin": 4908694, + "headersEnd": 4909446, + "body": { + "mimeType": "multipart/alternative", + "begin": 4908694, + "headersEnd": 4909446, + "children": [ + { + "mimeType": "text/plain", + "begin": 4909843, + "headersEnd": 4909844, + "end": 4910639, + "octets": 795, + "lines": 18 + }, + { + "mimeType": "multipart/mixed", + "begin": 4910698, + "headersEnd": 4910801, + "children": [ + { + "mimeType": "text/richtext", + "begin": 4910861, + "headersEnd": 4910934, + "end": 4911423, + "octets": 489, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 4911484, + "headersEnd": 4911580, + "end": 4924570, + "octets": 12990, + "lines": 190 + }, + { + "mimeType": "text/plain", + "begin": 4924631, + "headersEnd": 4924701, + "end": 4924721, + "octets": 20, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 4924782, + "headersEnd": 4924878, + "end": 4980598, + "octets": 55720, + "lines": 764 + }, + { + "mimeType": "text/plain", + "begin": 4980659, + "headersEnd": 4980729, + "end": 4980781, + "octets": 52, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 4980842, + "headersEnd": 4980903, + "end": 5083055, + "octets": 102152, + "lines": 1400 + }, + { + "mimeType": "text/plain", + "begin": 5083116, + "headersEnd": 5083186, + "end": 5083188, + "octets": 2, + "lines": 2 + } + ], + "end": 5083251, + "octets": 172450, + "lines": 2407 + } + ], + "end": 5083311, + "octets": 173865, + "lines": 2440 + }, + "end": 5083311, + "octets": 173865, + "lines": 2440 + }, + { + "mboxMarkerBegin": 5083312, + "mboxMarkerLength": 7, + "begin": 5083320, + "headersEnd": 5084006, + "body": { + "mimeType": "multipart/alternative", + "begin": 5083320, + "headersEnd": 5084006, + "children": [ + { + "mimeType": "text/plain", + "begin": 5084201, + "headersEnd": 5084245, + "end": 5085760, + "octets": 1515, + "lines": 29 + }, + { + "mimeType": "multipart/mixed", + "begin": 5085801, + "headersEnd": 5085886, + "children": [ + { + "mimeType": "text/richtext", + "begin": 5085928, + "headersEnd": 5086019, + "end": 5086926, + "octets": 907, + "lines": 13 + }, + { + "mimeType": "image/gif", + "begin": 5086969, + "headersEnd": 5087060, + "end": 5121918, + "octets": 34858, + "lines": 506 + }, + { + "mimeType": "text/richtext", + "begin": 5121961, + "headersEnd": 5122052, + "end": 5122062, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5122105, + "headersEnd": 5122196, + "end": 5143530, + "octets": 21334, + "lines": 310 + }, + { + "mimeType": "text/richtext", + "begin": 5143573, + "headersEnd": 5143664, + "end": 5143674, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5143717, + "headersEnd": 5143808, + "end": 5176251, + "octets": 32443, + "lines": 471 + }, + { + "mimeType": "text/richtext", + "begin": 5176294, + "headersEnd": 5176385, + "end": 5176395, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5176438, + "headersEnd": 5176529, + "end": 5209970, + "octets": 33441, + "lines": 485 + }, + { + "mimeType": "text/richtext", + "begin": 5210013, + "headersEnd": 5210104, + "end": 5210114, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5210157, + "headersEnd": 5210248, + "end": 5238084, + "octets": 27836, + "lines": 404 + }, + { + "mimeType": "text/richtext", + "begin": 5238127, + "headersEnd": 5238218, + "end": 5238228, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5238271, + "headersEnd": 5238362, + "end": 5271856, + "octets": 33494, + "lines": 486 + }, + { + "mimeType": "text/richtext", + "begin": 5271899, + "headersEnd": 5271990, + "end": 5272000, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 5272043, + "headersEnd": 5272134, + "end": 5298793, + "octets": 26659, + "lines": 387 + }, + { + "mimeType": "text/richtext", + "begin": 5298836, + "headersEnd": 5298927, + "end": 5299001, + "octets": 74, + "lines": 3 + } + ], + "end": 5299046, + "octets": 213160, + "lines": 3160 + } + ], + "end": 5299088, + "octets": 215082, + "lines": 3202 + }, + "end": 5299088, + "octets": 215082, + "lines": 3202 + }, + { + "mboxMarkerBegin": 5299089, + "mboxMarkerLength": 7, + "begin": 5299097, + "headersEnd": 5299489, + "body": { + "mimeType": "multipart/mixed", + "begin": 5299097, + "headersEnd": 5299489, + "children": [ + { + "mimeType": "text/richtext", + "begin": 5299733, + "headersEnd": 5299828, + "end": 5300031, + "octets": 203, + "lines": 9 + }, + { + "mimeType": "audio/basic", + "begin": 5300081, + "headersEnd": 5300142, + "end": 5388740, + "octets": 88598, + "lines": 1214 + }, + { + "mimeType": "text/plain", + "begin": 5388790, + "headersEnd": 5388816, + "end": 5388846, + "octets": 30, + "lines": 1 + } + ], + "end": 5388898, + "octets": 89409, + "lines": 1243 + }, + "end": 5388898, + "octets": 89409, + "lines": 1243 + }, + { + "mboxMarkerBegin": 5388899, + "mboxMarkerLength": 7, + "begin": 5388907, + "headersEnd": 5389843, + "body": { + "mimeType": "message/partial", + "begin": 5388907, + "headersEnd": 5389843, + "end": 5440552, + "octets": 50709, + "lines": 696 + }, + "end": 5440552, + "octets": 50709, + "lines": 696 + }, + { + "mboxMarkerBegin": 5440553, + "mboxMarkerLength": 7, + "begin": 5440561, + "headersEnd": 5441173, + "body": { + "mimeType": "multipart/mixed", + "begin": 5440561, + "headersEnd": 5441173, + "children": [ + { + "mimeType": "text/plain", + "begin": 5441191, + "headersEnd": 5441192, + "end": 5445509, + "octets": 4317, + "lines": 101 + }, + { + "mimeType": "multipart/digest", + "begin": 5445528, + "headersEnd": 5445669, + "children": [ + { + "mimeType": "message/rfc822", + "begin": 5445700, + "headersEnd": 5445701, + "message": { + "begin": 5445701, + "headersEnd": 5445806, + "body": { + "mimeType": "text/plain", + "begin": 5445701, + "headersEnd": 5445806, + "end": 5446427, + "octets": 621, + "lines": 18 + }, + "end": 5446427, + "octets": 621, + "lines": 18 + }, + "end": 5446427, + "octets": 726, + "lines": 22 + }, + { + "mimeType": "message/rfc822", + "begin": 5446459, + "headersEnd": 5446460, + "message": { + "begin": 5446460, + "headersEnd": 5446581, + "body": { + "mimeType": "text/plain", + "begin": 5446460, + "headersEnd": 5446581, + "end": 5447314, + "octets": 733, + "lines": 20 + }, + "end": 5447314, + "octets": 733, + "lines": 20 + }, + "end": 5447314, + "octets": 854, + "lines": 24 + }, + { + "mimeType": "message/rfc822", + "begin": 5447346, + "headersEnd": 5447347, + "message": { + "begin": 5447347, + "headersEnd": 5447466, + "body": { + "mimeType": "text/plain", + "begin": 5447347, + "headersEnd": 5447466, + "end": 5448112, + "octets": 646, + "lines": 14 + }, + "end": 5448112, + "octets": 646, + "lines": 14 + }, + "end": 5448112, + "octets": 765, + "lines": 18 + }, + { + "mimeType": "message/rfc822", + "begin": 5448144, + "headersEnd": 5448145, + "message": { + "begin": 5448145, + "headersEnd": 5448301, + "body": { + "mimeType": "text/plain", + "begin": 5448145, + "headersEnd": 5448301, + "end": 5448784, + "octets": 483, + "lines": 10 + }, + "end": 5448784, + "octets": 483, + "lines": 10 + }, + "end": 5448784, + "octets": 639, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5448816, + "headersEnd": 5448817, + "message": { + "begin": 5448817, + "headersEnd": 5448971, + "body": { + "mimeType": "text/plain", + "begin": 5448817, + "headersEnd": 5448971, + "end": 5449543, + "octets": 572, + "lines": 15 + }, + "end": 5449543, + "octets": 572, + "lines": 15 + }, + "end": 5449543, + "octets": 726, + "lines": 19 + }, + { + "mimeType": "message/rfc822", + "begin": 5449575, + "headersEnd": 5449576, + "message": { + "begin": 5449576, + "headersEnd": 5449733, + "body": { + "mimeType": "text/plain", + "begin": 5449576, + "headersEnd": 5449733, + "end": 5451008, + "octets": 1275, + "lines": 26 + }, + "end": 5451008, + "octets": 1275, + "lines": 26 + }, + "end": 5451008, + "octets": 1432, + "lines": 30 + }, + { + "mimeType": "message/rfc822", + "begin": 5451040, + "headersEnd": 5451041, + "message": { + "begin": 5451041, + "headersEnd": 5451194, + "body": { + "mimeType": "text/plain", + "begin": 5451041, + "headersEnd": 5451194, + "end": 5451595, + "octets": 401, + "lines": 9 + }, + "end": 5451595, + "octets": 401, + "lines": 9 + }, + "end": 5451595, + "octets": 554, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5451627, + "headersEnd": 5451628, + "message": { + "begin": 5451628, + "headersEnd": 5451775, + "body": { + "mimeType": "text/plain", + "begin": 5451628, + "headersEnd": 5451775, + "end": 5452171, + "octets": 396, + "lines": 7 + }, + "end": 5452171, + "octets": 396, + "lines": 7 + }, + "end": 5452171, + "octets": 543, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5452203, + "headersEnd": 5452204, + "message": { + "begin": 5452204, + "headersEnd": 5452347, + "body": { + "mimeType": "text/plain", + "begin": 5452204, + "headersEnd": 5452347, + "end": 5452987, + "octets": 640, + "lines": 11 + }, + "end": 5452987, + "octets": 640, + "lines": 11 + }, + "end": 5452987, + "octets": 783, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5453019, + "headersEnd": 5453020, + "message": { + "begin": 5453020, + "headersEnd": 5453157, + "body": { + "mimeType": "text/plain", + "begin": 5453020, + "headersEnd": 5453157, + "end": 5454134, + "octets": 977, + "lines": 19 + }, + "end": 5454134, + "octets": 977, + "lines": 19 + }, + "end": 5454134, + "octets": 1114, + "lines": 23 + }, + { + "mimeType": "message/rfc822", + "begin": 5454166, + "headersEnd": 5454167, + "message": { + "begin": 5454167, + "headersEnd": 5454314, + "body": { + "mimeType": "text/plain", + "begin": 5454167, + "headersEnd": 5454314, + "end": 5455204, + "octets": 890, + "lines": 27 + }, + "end": 5455204, + "octets": 890, + "lines": 27 + }, + "end": 5455204, + "octets": 1037, + "lines": 31 + }, + { + "mimeType": "message/rfc822", + "begin": 5455236, + "headersEnd": 5455237, + "message": { + "begin": 5455237, + "headersEnd": 5455368, + "body": { + "mimeType": "text/plain", + "begin": 5455237, + "headersEnd": 5455368, + "end": 5455927, + "octets": 559, + "lines": 11 + }, + "end": 5455927, + "octets": 559, + "lines": 11 + }, + "end": 5455927, + "octets": 690, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5455959, + "headersEnd": 5455960, + "message": { + "begin": 5455960, + "headersEnd": 5456092, + "body": { + "mimeType": "text/plain", + "begin": 5455960, + "headersEnd": 5456092, + "end": 5456529, + "octets": 437, + "lines": 10 + }, + "end": 5456529, + "octets": 437, + "lines": 10 + }, + "end": 5456529, + "octets": 569, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5456561, + "headersEnd": 5456562, + "message": { + "begin": 5456562, + "headersEnd": 5456679, + "body": { + "mimeType": "text/plain", + "begin": 5456562, + "headersEnd": 5456679, + "end": 5457231, + "octets": 552, + "lines": 15 + }, + "end": 5457231, + "octets": 552, + "lines": 15 + }, + "end": 5457231, + "octets": 669, + "lines": 19 + }, + { + "mimeType": "message/rfc822", + "begin": 5457263, + "headersEnd": 5457264, + "message": { + "begin": 5457264, + "headersEnd": 5457379, + "body": { + "mimeType": "text/plain", + "begin": 5457264, + "headersEnd": 5457379, + "end": 5457564, + "octets": 185, + "lines": 8 + }, + "end": 5457564, + "octets": 185, + "lines": 8 + }, + "end": 5457564, + "octets": 300, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5457596, + "headersEnd": 5457597, + "message": { + "begin": 5457597, + "headersEnd": 5457714, + "body": { + "mimeType": "text/plain", + "begin": 5457597, + "headersEnd": 5457714, + "end": 5458042, + "octets": 328, + "lines": 7 + }, + "end": 5458042, + "octets": 328, + "lines": 7 + }, + "end": 5458042, + "octets": 445, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5458074, + "headersEnd": 5458075, + "message": { + "begin": 5458075, + "headersEnd": 5458198, + "body": { + "mimeType": "text/plain", + "begin": 5458075, + "headersEnd": 5458198, + "end": 5458865, + "octets": 667, + "lines": 21 + }, + "end": 5458865, + "octets": 667, + "lines": 21 + }, + "end": 5458865, + "octets": 790, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5458897, + "headersEnd": 5458898, + "message": { + "begin": 5458898, + "headersEnd": 5459022, + "body": { + "mimeType": "text/plain", + "begin": 5458898, + "headersEnd": 5459022, + "end": 5459124, + "octets": 102, + "lines": 5 + }, + "end": 5459124, + "octets": 102, + "lines": 5 + }, + "end": 5459124, + "octets": 226, + "lines": 9 + }, + { + "mimeType": "message/rfc822", + "begin": 5459156, + "headersEnd": 5459157, + "message": { + "begin": 5459157, + "headersEnd": 5459299, + "body": { + "mimeType": "text/plain", + "begin": 5459157, + "headersEnd": 5459299, + "end": 5460135, + "octets": 836, + "lines": 21 + }, + "end": 5460135, + "octets": 836, + "lines": 21 + }, + "end": 5460135, + "octets": 978, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5460167, + "headersEnd": 5460168, + "message": { + "begin": 5460168, + "headersEnd": 5460278, + "body": { + "mimeType": "text/plain", + "begin": 5460168, + "headersEnd": 5460278, + "end": 5460697, + "octets": 419, + "lines": 9 + }, + "end": 5460697, + "octets": 419, + "lines": 9 + }, + "end": 5460697, + "octets": 529, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5460729, + "headersEnd": 5460730, + "message": { + "begin": 5460730, + "headersEnd": 5460902, + "body": { + "mimeType": "text/plain", + "begin": 5460730, + "headersEnd": 5460902, + "end": 5461132, + "octets": 230, + "lines": 9 + }, + "end": 5461132, + "octets": 230, + "lines": 9 + }, + "end": 5461132, + "octets": 402, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5461164, + "headersEnd": 5461165, + "message": { + "begin": 5461165, + "headersEnd": 5461291, + "body": { + "mimeType": "text/plain", + "begin": 5461165, + "headersEnd": 5461291, + "end": 5461690, + "octets": 399, + "lines": 12 + }, + "end": 5461690, + "octets": 399, + "lines": 12 + }, + "end": 5461690, + "octets": 525, + "lines": 16 + }, + { + "mimeType": "message/rfc822", + "begin": 5461722, + "headersEnd": 5461723, + "message": { + "begin": 5461723, + "headersEnd": 5461840, + "body": { + "mimeType": "text/plain", + "begin": 5461723, + "headersEnd": 5461840, + "end": 5462744, + "octets": 904, + "lines": 28 + }, + "end": 5462744, + "octets": 904, + "lines": 28 + }, + "end": 5462744, + "octets": 1021, + "lines": 32 + }, + { + "mimeType": "message/rfc822", + "begin": 5462776, + "headersEnd": 5462777, + "message": { + "begin": 5462777, + "headersEnd": 5462905, + "body": { + "mimeType": "text/plain", + "begin": 5462777, + "headersEnd": 5462905, + "end": 5463196, + "octets": 291, + "lines": 9 + }, + "end": 5463196, + "octets": 291, + "lines": 9 + }, + "end": 5463196, + "octets": 419, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5463228, + "headersEnd": 5463229, + "message": { + "begin": 5463229, + "headersEnd": 5463358, + "body": { + "mimeType": "text/plain", + "begin": 5463229, + "headersEnd": 5463358, + "end": 5463768, + "octets": 410, + "lines": 14 + }, + "end": 5463768, + "octets": 410, + "lines": 14 + }, + "end": 5463768, + "octets": 539, + "lines": 18 + }, + { + "mimeType": "message/rfc822", + "begin": 5463800, + "headersEnd": 5463801, + "message": { + "begin": 5463801, + "headersEnd": 5463916, + "body": { + "mimeType": "text/plain", + "begin": 5463801, + "headersEnd": 5463916, + "end": 5464061, + "octets": 145, + "lines": 4 + }, + "end": 5464061, + "octets": 145, + "lines": 4 + }, + "end": 5464061, + "octets": 260, + "lines": 8 + }, + { + "mimeType": "message/rfc822", + "begin": 5464093, + "headersEnd": 5464094, + "message": { + "begin": 5464094, + "headersEnd": 5464219, + "body": { + "mimeType": "text/plain", + "begin": 5464094, + "headersEnd": 5464219, + "end": 5464398, + "octets": 179, + "lines": 7 + }, + "end": 5464398, + "octets": 179, + "lines": 7 + }, + "end": 5464398, + "octets": 304, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5464430, + "headersEnd": 5464431, + "message": { + "begin": 5464431, + "headersEnd": 5464561, + "body": { + "mimeType": "text/plain", + "begin": 5464431, + "headersEnd": 5464561, + "end": 5465277, + "octets": 716, + "lines": 14 + }, + "end": 5465277, + "octets": 716, + "lines": 14 + }, + "end": 5465277, + "octets": 846, + "lines": 18 + }, + { + "mimeType": "message/rfc822", + "begin": 5465309, + "headersEnd": 5465310, + "message": { + "begin": 5465310, + "headersEnd": 5465456, + "body": { + "mimeType": "text/plain", + "begin": 5465310, + "headersEnd": 5465456, + "end": 5466413, + "octets": 957, + "lines": 26 + }, + "end": 5466413, + "octets": 957, + "lines": 26 + }, + "end": 5466413, + "octets": 1103, + "lines": 30 + }, + { + "mimeType": "message/rfc822", + "begin": 5466445, + "headersEnd": 5466446, + "message": { + "begin": 5466446, + "headersEnd": 5466580, + "body": { + "mimeType": "text/plain", + "begin": 5466446, + "headersEnd": 5466580, + "end": 5466827, + "octets": 247, + "lines": 7 + }, + "end": 5466827, + "octets": 247, + "lines": 7 + }, + "end": 5466827, + "octets": 381, + "lines": 11 + }, + { + "mimeType": "message/rfc822", + "begin": 5466859, + "headersEnd": 5466860, + "message": { + "begin": 5466860, + "headersEnd": 5466982, + "body": { + "mimeType": "text/plain", + "begin": 5466860, + "headersEnd": 5466982, + "end": 5467109, + "octets": 127, + "lines": 6 + }, + "end": 5467109, + "octets": 127, + "lines": 6 + }, + "end": 5467109, + "octets": 249, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5467141, + "headersEnd": 5467142, + "message": { + "begin": 5467142, + "headersEnd": 5467317, + "body": { + "mimeType": "text/plain", + "begin": 5467142, + "headersEnd": 5467317, + "end": 5468062, + "octets": 745, + "lines": 16 + }, + "end": 5468062, + "octets": 745, + "lines": 16 + }, + "end": 5468062, + "octets": 920, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5468094, + "headersEnd": 5468095, + "message": { + "begin": 5468095, + "headersEnd": 5468255, + "body": { + "mimeType": "text/plain", + "begin": 5468095, + "headersEnd": 5468255, + "end": 5468654, + "octets": 399, + "lines": 16 + }, + "end": 5468654, + "octets": 399, + "lines": 16 + }, + "end": 5468654, + "octets": 559, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5468686, + "headersEnd": 5468687, + "message": { + "begin": 5468687, + "headersEnd": 5468819, + "body": { + "mimeType": "text/plain", + "begin": 5468687, + "headersEnd": 5468819, + "end": 5470106, + "octets": 1287, + "lines": 21 + }, + "end": 5470106, + "octets": 1287, + "lines": 21 + }, + "end": 5470106, + "octets": 1419, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5470138, + "headersEnd": 5470139, + "message": { + "begin": 5470139, + "headersEnd": 5470245, + "body": { + "mimeType": "text/plain", + "begin": 5470139, + "headersEnd": 5470245, + "end": 5470388, + "octets": 143, + "lines": 6 + }, + "end": 5470388, + "octets": 143, + "lines": 6 + }, + "end": 5470388, + "octets": 249, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5470420, + "headersEnd": 5470421, + "message": { + "begin": 5470421, + "headersEnd": 5470558, + "body": { + "mimeType": "text/plain", + "begin": 5470421, + "headersEnd": 5470558, + "end": 5470857, + "octets": 299, + "lines": 11 + }, + "end": 5470857, + "octets": 299, + "lines": 11 + }, + "end": 5470857, + "octets": 436, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5470889, + "headersEnd": 5470890, + "message": { + "begin": 5470890, + "headersEnd": 5471016, + "body": { + "mimeType": "text/plain", + "begin": 5470890, + "headersEnd": 5471016, + "end": 5471203, + "octets": 187, + "lines": 6 + }, + "end": 5471203, + "octets": 187, + "lines": 6 + }, + "end": 5471203, + "octets": 313, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5471235, + "headersEnd": 5471236, + "message": { + "begin": 5471236, + "headersEnd": 5471341, + "body": { + "mimeType": "text/plain", + "begin": 5471236, + "headersEnd": 5471341, + "end": 5471739, + "octets": 398, + "lines": 12 + }, + "end": 5471739, + "octets": 398, + "lines": 12 + }, + "end": 5471739, + "octets": 503, + "lines": 16 + }, + { + "mimeType": "message/rfc822", + "begin": 5471771, + "headersEnd": 5471772, + "message": { + "begin": 5471772, + "headersEnd": 5471906, + "body": { + "mimeType": "text/plain", + "begin": 5471772, + "headersEnd": 5471906, + "end": 5472208, + "octets": 302, + "lines": 8 + }, + "end": 5472208, + "octets": 302, + "lines": 8 + }, + "end": 5472208, + "octets": 436, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5472240, + "headersEnd": 5472241, + "message": { + "begin": 5472241, + "headersEnd": 5472384, + "body": { + "mimeType": "text/plain", + "begin": 5472241, + "headersEnd": 5472384, + "end": 5473002, + "octets": 618, + "lines": 17 + }, + "end": 5473002, + "octets": 618, + "lines": 17 + }, + "end": 5473002, + "octets": 761, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5473034, + "headersEnd": 5473035, + "message": { + "begin": 5473035, + "headersEnd": 5473188, + "body": { + "mimeType": "text/plain", + "begin": 5473035, + "headersEnd": 5473188, + "end": 5473663, + "octets": 475, + "lines": 10 + }, + "end": 5473663, + "octets": 475, + "lines": 10 + }, + "end": 5473663, + "octets": 628, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5473695, + "headersEnd": 5473696, + "message": { + "begin": 5473696, + "headersEnd": 5473829, + "body": { + "mimeType": "text/plain", + "begin": 5473696, + "headersEnd": 5473829, + "end": 5475001, + "octets": 1172, + "lines": 27 + }, + "end": 5475001, + "octets": 1172, + "lines": 27 + }, + "end": 5475001, + "octets": 1305, + "lines": 31 + }, + { + "mimeType": "message/rfc822", + "begin": 5475033, + "headersEnd": 5475034, + "message": { + "begin": 5475034, + "headersEnd": 5475210, + "body": { + "mimeType": "text/plain", + "begin": 5475034, + "headersEnd": 5475210, + "end": 5475469, + "octets": 259, + "lines": 8 + }, + "end": 5475469, + "octets": 259, + "lines": 8 + }, + "end": 5475469, + "octets": 435, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5475501, + "headersEnd": 5475502, + "message": { + "begin": 5475502, + "headersEnd": 5475617, + "body": { + "mimeType": "text/plain", + "begin": 5475502, + "headersEnd": 5475617, + "end": 5475810, + "octets": 193, + "lines": 4 + }, + "end": 5475810, + "octets": 193, + "lines": 4 + }, + "end": 5475810, + "octets": 308, + "lines": 8 + }, + { + "mimeType": "message/rfc822", + "begin": 5475842, + "headersEnd": 5475843, + "message": { + "begin": 5475843, + "headersEnd": 5475983, + "body": { + "mimeType": "text/plain", + "begin": 5475843, + "headersEnd": 5475983, + "end": 5476848, + "octets": 865, + "lines": 24 + }, + "end": 5476848, + "octets": 865, + "lines": 24 + }, + "end": 5476848, + "octets": 1005, + "lines": 28 + }, + { + "mimeType": "message/rfc822", + "begin": 5476880, + "headersEnd": 5476881, + "message": { + "begin": 5476881, + "headersEnd": 5477006, + "body": { + "mimeType": "text/plain", + "begin": 5476881, + "headersEnd": 5477006, + "end": 5477720, + "octets": 714, + "lines": 11 + }, + "end": 5477720, + "octets": 714, + "lines": 11 + }, + "end": 5477720, + "octets": 839, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5477752, + "headersEnd": 5477753, + "message": { + "begin": 5477753, + "headersEnd": 5477865, + "body": { + "mimeType": "text/plain", + "begin": 5477753, + "headersEnd": 5477865, + "end": 5478568, + "octets": 703, + "lines": 17 + }, + "end": 5478568, + "octets": 703, + "lines": 17 + }, + "end": 5478568, + "octets": 815, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5478600, + "headersEnd": 5478601, + "message": { + "begin": 5478601, + "headersEnd": 5478733, + "body": { + "mimeType": "text/plain", + "begin": 5478601, + "headersEnd": 5478733, + "end": 5479113, + "octets": 380, + "lines": 11 + }, + "end": 5479113, + "octets": 380, + "lines": 11 + }, + "end": 5479113, + "octets": 512, + "lines": 15 + }, + { + "mimeType": "message/rfc822", + "begin": 5479145, + "headersEnd": 5479146, + "message": { + "begin": 5479146, + "headersEnd": 5479282, + "body": { + "mimeType": "text/plain", + "begin": 5479146, + "headersEnd": 5479282, + "end": 5480259, + "octets": 977, + "lines": 24 + }, + "end": 5480259, + "octets": 977, + "lines": 24 + }, + "end": 5480259, + "octets": 1113, + "lines": 28 + }, + { + "mimeType": "message/rfc822", + "begin": 5480291, + "headersEnd": 5480292, + "message": { + "begin": 5480292, + "headersEnd": 5480437, + "body": { + "mimeType": "text/plain", + "begin": 5480292, + "headersEnd": 5480437, + "end": 5480904, + "octets": 467, + "lines": 10 + }, + "end": 5480904, + "octets": 467, + "lines": 10 + }, + "end": 5480904, + "octets": 612, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5480936, + "headersEnd": 5480937, + "message": { + "begin": 5480937, + "headersEnd": 5481070, + "body": { + "mimeType": "text/plain", + "begin": 5480937, + "headersEnd": 5481070, + "end": 5481349, + "octets": 279, + "lines": 10 + }, + "end": 5481349, + "octets": 279, + "lines": 10 + }, + "end": 5481349, + "octets": 412, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5481381, + "headersEnd": 5481382, + "message": { + "begin": 5481382, + "headersEnd": 5481507, + "body": { + "mimeType": "text/plain", + "begin": 5481382, + "headersEnd": 5481507, + "end": 5481789, + "octets": 282, + "lines": 4 + }, + "end": 5481789, + "octets": 282, + "lines": 4 + }, + "end": 5481789, + "octets": 407, + "lines": 8 + }, + { + "mimeType": "message/rfc822", + "begin": 5481821, + "headersEnd": 5481822, + "message": { + "begin": 5481822, + "headersEnd": 5481943, + "body": { + "mimeType": "text/plain", + "begin": 5481822, + "headersEnd": 5481943, + "end": 5482586, + "octets": 643, + "lines": 27 + }, + "end": 5482586, + "octets": 643, + "lines": 27 + }, + "end": 5482586, + "octets": 764, + "lines": 31 + }, + { + "mimeType": "message/rfc822", + "begin": 5482618, + "headersEnd": 5482619, + "message": { + "begin": 5482619, + "headersEnd": 5482763, + "body": { + "mimeType": "text/plain", + "begin": 5482619, + "headersEnd": 5482763, + "end": 5485021, + "octets": 2258, + "lines": 46 + }, + "end": 5485021, + "octets": 2258, + "lines": 46 + }, + "end": 5485021, + "octets": 2402, + "lines": 50 + }, + { + "mimeType": "message/rfc822", + "begin": 5485053, + "headersEnd": 5485054, + "message": { + "begin": 5485054, + "headersEnd": 5485176, + "body": { + "mimeType": "text/plain", + "begin": 5485054, + "headersEnd": 5485176, + "end": 5485968, + "octets": 792, + "lines": 17 + }, + "end": 5485968, + "octets": 792, + "lines": 17 + }, + "end": 5485968, + "octets": 914, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5486000, + "headersEnd": 5486001, + "message": { + "begin": 5486001, + "headersEnd": 5486095, + "body": { + "mimeType": "text/plain", + "begin": 5486001, + "headersEnd": 5486095, + "end": 5486321, + "octets": 226, + "lines": 10 + }, + "end": 5486321, + "octets": 226, + "lines": 10 + }, + "end": 5486321, + "octets": 320, + "lines": 14 + }, + { + "mimeType": "message/rfc822", + "begin": 5486353, + "headersEnd": 5486354, + "message": { + "begin": 5486354, + "headersEnd": 5486475, + "body": { + "mimeType": "text/plain", + "begin": 5486354, + "headersEnd": 5486475, + "end": 5487143, + "octets": 668, + "lines": 20 + }, + "end": 5487143, + "octets": 668, + "lines": 20 + }, + "end": 5487143, + "octets": 789, + "lines": 24 + }, + { + "mimeType": "message/rfc822", + "begin": 5487175, + "headersEnd": 5487176, + "message": { + "begin": 5487176, + "headersEnd": 5487286, + "body": { + "mimeType": "text/plain", + "begin": 5487176, + "headersEnd": 5487286, + "end": 5489833, + "octets": 2547, + "lines": 68 + }, + "end": 5489833, + "octets": 2547, + "lines": 68 + }, + "end": 5489833, + "octets": 2657, + "lines": 72 + }, + { + "mimeType": "message/rfc822", + "begin": 5489865, + "headersEnd": 5489866, + "message": { + "begin": 5489866, + "headersEnd": 5489972, + "body": { + "mimeType": "text/plain", + "begin": 5489866, + "headersEnd": 5489972, + "end": 5491181, + "octets": 1209, + "lines": 34 + }, + "end": 5491181, + "octets": 1209, + "lines": 34 + }, + "end": 5491181, + "octets": 1315, + "lines": 38 + }, + { + "mimeType": "message/rfc822", + "begin": 5491213, + "headersEnd": 5491214, + "message": { + "begin": 5491214, + "headersEnd": 5491320, + "body": { + "mimeType": "text/plain", + "begin": 5491214, + "headersEnd": 5491320, + "end": 5493117, + "octets": 1797, + "lines": 43 + }, + "end": 5493117, + "octets": 1797, + "lines": 43 + }, + "end": 5493117, + "octets": 1903, + "lines": 47 + }, + { + "mimeType": "message/rfc822", + "begin": 5493149, + "headersEnd": 5493150, + "message": { + "begin": 5493150, + "headersEnd": 5493279, + "body": { + "mimeType": "text/plain", + "begin": 5493150, + "headersEnd": 5493279, + "end": 5493849, + "octets": 570, + "lines": 12 + }, + "end": 5493849, + "octets": 570, + "lines": 12 + }, + "end": 5493849, + "octets": 699, + "lines": 16 + }, + { + "mimeType": "message/rfc822", + "begin": 5493881, + "headersEnd": 5493882, + "message": { + "begin": 5493882, + "headersEnd": 5493970, + "body": { + "mimeType": "text/plain", + "begin": 5493882, + "headersEnd": 5493970, + "end": 5495304, + "octets": 1334, + "lines": 20 + }, + "end": 5495304, + "octets": 1334, + "lines": 20 + }, + "end": 5495304, + "octets": 1422, + "lines": 24 + }, + { + "mimeType": "message/rfc822", + "begin": 5495336, + "headersEnd": 5495337, + "message": { + "begin": 5495337, + "headersEnd": 5495453, + "body": { + "mimeType": "text/plain", + "begin": 5495337, + "headersEnd": 5495453, + "end": 5497580, + "octets": 2127, + "lines": 49 + }, + "end": 5497580, + "octets": 2127, + "lines": 49 + }, + "end": 5497580, + "octets": 2243, + "lines": 53 + }, + { + "mimeType": "message/rfc822", + "begin": 5497612, + "headersEnd": 5497613, + "message": { + "begin": 5497613, + "headersEnd": 5497734, + "body": { + "mimeType": "text/plain", + "begin": 5497613, + "headersEnd": 5497734, + "end": 5499755, + "octets": 2021, + "lines": 42 + }, + "end": 5499755, + "octets": 2021, + "lines": 42 + }, + "end": 5499755, + "octets": 2142, + "lines": 46 + }, + { + "mimeType": "message/rfc822", + "begin": 5499787, + "headersEnd": 5499788, + "message": { + "begin": 5499788, + "headersEnd": 5499909, + "body": { + "mimeType": "text/plain", + "begin": 5499788, + "headersEnd": 5499909, + "end": 5500586, + "octets": 677, + "lines": 19 + }, + "end": 5500586, + "octets": 677, + "lines": 19 + }, + "end": 5500586, + "octets": 798, + "lines": 23 + }, + { + "mimeType": "message/rfc822", + "begin": 5500618, + "headersEnd": 5500619, + "message": { + "begin": 5500619, + "headersEnd": 5500756, + "body": { + "mimeType": "text/plain", + "begin": 5500619, + "headersEnd": 5500756, + "end": 5501576, + "octets": 820, + "lines": 16 + }, + "end": 5501576, + "octets": 820, + "lines": 16 + }, + "end": 5501576, + "octets": 957, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5501608, + "headersEnd": 5501609, + "message": { + "begin": 5501609, + "headersEnd": 5501733, + "body": { + "mimeType": "text/plain", + "begin": 5501609, + "headersEnd": 5501733, + "end": 5502457, + "octets": 724, + "lines": 21 + }, + "end": 5502457, + "octets": 724, + "lines": 21 + }, + "end": 5502457, + "octets": 848, + "lines": 25 + }, + { + "mimeType": "message/rfc822", + "begin": 5502489, + "headersEnd": 5502490, + "message": { + "begin": 5502490, + "headersEnd": 5502592, + "body": { + "mimeType": "text/plain", + "begin": 5502490, + "headersEnd": 5502592, + "end": 5503332, + "octets": 740, + "lines": 16 + }, + "end": 5503332, + "octets": 740, + "lines": 16 + }, + "end": 5503332, + "octets": 842, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5503364, + "headersEnd": 5503365, + "message": { + "begin": 5503365, + "headersEnd": 5503521, + "body": { + "mimeType": "text/plain", + "begin": 5503365, + "headersEnd": 5503521, + "end": 5503880, + "octets": 359, + "lines": 7 + }, + "end": 5503880, + "octets": 359, + "lines": 7 + }, + "end": 5503880, + "octets": 515, + "lines": 12 + }, + { + "mimeType": "message/rfc822", + "begin": 5503912, + "headersEnd": 5503913, + "message": { + "begin": 5503913, + "headersEnd": 5504000, + "body": { + "mimeType": "text/plain", + "begin": 5503913, + "headersEnd": 5504000, + "end": 5504635, + "octets": 635, + "lines": 15 + }, + "end": 5504635, + "octets": 635, + "lines": 15 + }, + "end": 5504635, + "octets": 722, + "lines": 19 + }, + { + "mimeType": "message/rfc822", + "begin": 5504667, + "headersEnd": 5504668, + "message": { + "begin": 5504668, + "headersEnd": 5504817, + "body": { + "mimeType": "text/plain", + "begin": 5504668, + "headersEnd": 5504817, + "end": 5505183, + "octets": 366, + "lines": 17 + }, + "end": 5505183, + "octets": 366, + "lines": 17 + }, + "end": 5505183, + "octets": 515, + "lines": 21 + }, + { + "mimeType": "message/rfc822", + "begin": 5505215, + "headersEnd": 5505216, + "message": { + "begin": 5505216, + "headersEnd": 5505317, + "body": { + "mimeType": "text/plain", + "begin": 5505216, + "headersEnd": 5505317, + "end": 5505605, + "octets": 288, + "lines": 6 + }, + "end": 5505605, + "octets": 288, + "lines": 6 + }, + "end": 5505605, + "octets": 389, + "lines": 10 + }, + { + "mimeType": "message/rfc822", + "begin": 5505637, + "headersEnd": 5505638, + "message": { + "begin": 5505638, + "headersEnd": 5505766, + "body": { + "mimeType": "text/plain", + "begin": 5505638, + "headersEnd": 5505766, + "end": 5506245, + "octets": 479, + "lines": 16 + }, + "end": 5506245, + "octets": 479, + "lines": 16 + }, + "end": 5506245, + "octets": 607, + "lines": 20 + }, + { + "mimeType": "message/rfc822", + "begin": 5506277, + "headersEnd": 5506278, + "message": { + "begin": 5506278, + "headersEnd": 5506375, + "body": { + "mimeType": "text/plain", + "begin": 5506278, + "headersEnd": 5506375, + "end": 5506755, + "octets": 380, + "lines": 19 + }, + "end": 5506755, + "octets": 380, + "lines": 19 + }, + "end": 5506755, + "octets": 477, + "lines": 23 + }, + { + "mimeType": "message/rfc822", + "begin": 5506787, + "headersEnd": 5506788, + "message": { + "begin": 5506788, + "headersEnd": 5506903, + "body": { + "mimeType": "text/plain", + "begin": 5506788, + "headersEnd": 5506903, + "end": 5508222, + "octets": 1319, + "lines": 26 + }, + "end": 5508222, + "octets": 1319, + "lines": 26 + }, + "end": 5508222, + "octets": 1434, + "lines": 30 + }, + { + "mimeType": "message/rfc822", + "begin": 5508254, + "headersEnd": 5508255, + "message": { + "begin": 5508255, + "headersEnd": 5508355, + "body": { + "mimeType": "text/plain", + "begin": 5508255, + "headersEnd": 5508355, + "end": 5508650, + "octets": 295, + "lines": 9 + }, + "end": 5508650, + "octets": 295, + "lines": 9 + }, + "end": 5508650, + "octets": 395, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5508682, + "headersEnd": 5508683, + "message": { + "begin": 5508683, + "headersEnd": 5508826, + "body": { + "mimeType": "text/plain", + "begin": 5508683, + "headersEnd": 5508826, + "end": 5509845, + "octets": 1019, + "lines": 36 + }, + "end": 5509845, + "octets": 1019, + "lines": 36 + }, + "end": 5509845, + "octets": 1162, + "lines": 40 + } + ], + "end": 5509879, + "octets": 64210, + "lines": 1845 + } + ], + "end": 5509954, + "octets": 68781, + "lines": 1958 + }, + "end": 5509954, + "octets": 68781, + "lines": 1958 + }, + { + "mboxMarkerBegin": 5509955, + "mboxMarkerLength": 7, + "begin": 5509963, + "headersEnd": 5510771, + "body": { + "mimeType": "text/plain", + "begin": 5509963, + "headersEnd": 5510771, + "end": 5512642, + "octets": 1871, + "lines": 49 + }, + "end": 5512642, + "octets": 1871, + "lines": 49 + }, + { + "mboxMarkerBegin": 5512643, + "mboxMarkerLength": 7, + "begin": 5512651, + "headersEnd": 5513378, + "body": { + "mimeType": "multipart/mixed", + "begin": 5512651, + "headersEnd": 5513378, + "children": [ + { + "mimeType": "text/plain", + "begin": 5513405, + "headersEnd": 5513406, + "end": 5513518, + "octets": 112, + "lines": 2 + }, + { + "mimeType": "application/x-annotate", + "begin": 5513546, + "headersEnd": 5513635, + "end": 5644327, + "octets": 130692, + "lines": 2012 + }, + { + "mimeType": "text/plain", + "begin": 5644355, + "headersEnd": 5644356, + "end": 5644411, + "octets": 55, + "lines": 2 + }, + { + "mimeType": "image/pbm", + "begin": 5644439, + "headersEnd": 5644584, + "end": 5659481, + "octets": 14897, + "lines": 78 + }, + { + "mimeType": "text/plain", + "begin": 5659509, + "headersEnd": 5659510, + "end": 5659600, + "octets": 90, + "lines": 6 + }, + { + "mimeType": "image/pbm", + "begin": 5659628, + "headersEnd": 5659773, + "end": 5667874, + "octets": 8101, + "lines": 42 + }, + { + "mimeType": "text/plain", + "begin": 5667902, + "headersEnd": 5667903, + "end": 5667977, + "octets": 74, + "lines": 4 + } + ], + "end": 5668007, + "octets": 154629, + "lines": 2171 + }, + "end": 5668007, + "octets": 154629, + "lines": 2171 + }, + { + "mboxMarkerBegin": 5668008, + "mboxMarkerLength": 7, + "begin": 5668016, + "headersEnd": 5668539, + "body": { + "mimeType": "text/richtext", + "begin": 5668016, + "headersEnd": 5668539, + "end": 5669107, + "octets": 568, + "lines": 21 + }, + "end": 5669107, + "octets": 568, + "lines": 21 + }, + { + "mboxMarkerBegin": 5669108, + "mboxMarkerLength": 7, + "begin": 5669116, + "headersEnd": 5670302, + "body": { + "mimeType": "multipart/alternative", + "begin": 5669116, + "headersEnd": 5670302, + "children": [ + { + "mimeType": "text/plain", + "begin": 5670497, + "headersEnd": 5670541, + "end": 5671271, + "octets": 730, + "lines": 26 + }, + { + "mimeType": "multipart/mixed", + "begin": 5671312, + "headersEnd": 5671397, + "children": [ + { + "mimeType": "text/richtext", + "begin": 5671439, + "headersEnd": 5671530, + "end": 5672332, + "octets": 802, + "lines": 25 + }, + { + "mimeType": "image/gif", + "begin": 5672375, + "headersEnd": 5672468, + "end": 5730339, + "octets": 57871, + "lines": 755 + }, + { + "mimeType": "text/richtext", + "begin": 5730382, + "headersEnd": 5730473, + "end": 5730478, + "octets": 5, + "lines": 1 + } + ], + "end": 5730523, + "octets": 59126, + "lines": 798 + } + ], + "end": 5730566, + "octets": 60264, + "lines": 837 + }, + "end": 5730566, + "octets": 60264, + "lines": 837 + }, + { + "mboxMarkerBegin": 5730567, + "mboxMarkerLength": 7, + "begin": 5730575, + "headersEnd": 5731315, + "body": { + "mimeType": "multipart/mixed", + "begin": 5730575, + "headersEnd": 5731315, + "children": [ + { + "mimeType": "text/plain", + "begin": 5731365, + "headersEnd": 5731455, + "end": 5731629, + "octets": 174, + "lines": 7 + }, + { + "mimeType": "image/gif", + "begin": 5731679, + "headersEnd": 5731738, + "end": 5786986, + "octets": 55248, + "lines": 757 + } + ], + "end": 5787038, + "octets": 55723, + "lines": 775 + }, + "end": 5787038, + "octets": 55723, + "lines": 775 + }, + { + "mboxMarkerBegin": 5787039, + "mboxMarkerLength": 31, + "begin": 5787071, + "headersEnd": 5788538, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 5787071, + "headersEnd": 5788538, + "end": 5789878, + "octets": 1340, + "lines": 34 + }, + "end": 5789878, + "octets": 1340, + "lines": 34 + }, + { + "mboxMarkerBegin": 5789879, + "mboxMarkerLength": 7, + "begin": 5789887, + "headersEnd": 5790681, + "body": { + "mimeType": "multipart/mixed", + "begin": 5789887, + "headersEnd": 5790681, + "children": [ + { + "mimeType": "text/plain", + "begin": 5790752, + "headersEnd": 5790828, + "end": 5791198, + "octets": 370, + "lines": 13 + }, + { + "mimeType": "message/rfc822", + "begin": 5791224, + "headersEnd": 5791314, + "message": { + "begin": 5791314, + "headersEnd": 5792382, + "body": { + "mimeType": "text/html", + "begin": 5791314, + "headersEnd": 5792382, + "end": 5816777, + "octets": 24395, + "lines": 463 + }, + "end": 5816777, + "octets": 24395, + "lines": 463 + }, + "end": 5816777, + "octets": 25463, + "lines": 477 + } + ], + "end": 5816805, + "octets": 26124, + "lines": 504 + }, + "end": 5816805, + "octets": 26124, + "lines": 504 + }, + { + "mboxMarkerBegin": 5816806, + "mboxMarkerLength": 7, + "begin": 5816814, + "headersEnd": 5817482, + "body": { + "mimeType": "multipart/mixed", + "begin": 5816814, + "headersEnd": 5817482, + "children": [ + { + "mimeType": "text/plain", + "begin": 5817576, + "headersEnd": 5817654, + "end": 5817688, + "octets": 34, + "lines": 1 + }, + { + "mimeType": "image/gif", + "begin": 5817737, + "headersEnd": 5817796, + "end": 5839947, + "octets": 22151, + "lines": 304 + } + ], + "end": 5839997, + "octets": 22515, + "lines": 317 + }, + "end": 5839997, + "octets": 22515, + "lines": 317 + }, + { + "mboxMarkerBegin": 5839998, + "mboxMarkerLength": 31, + "begin": 5840030, + "headersEnd": 5840554, + "body": { + "mimeType": "multipart/mixed", + "begin": 5840030, + "headersEnd": 5840554, + "children": [ + { + "mimeType": "text/plain", + "begin": 5840562, + "headersEnd": 5840606, + "end": 5841778, + "octets": 1172, + "lines": 21 + }, + { + "mimeType": "text/plain", + "begin": 5841787, + "headersEnd": 5841913, + "end": 5842059, + "octets": 146, + "lines": 3 + }, + { + "mimeType": "text/plain", + "begin": 5842068, + "headersEnd": 5842184, + "end": 5842378, + "octets": 194, + "lines": 3 + } + ], + "end": 5842388, + "octets": 1834, + "lines": 42 + }, + "end": 5842388, + "octets": 1834, + "lines": 42 + }, + { + "mboxMarkerBegin": 5842389, + "mboxMarkerLength": 7, + "begin": 5842397, + "headersEnd": 5843191, + "body": { + "mimeType": "audio/basic", + "begin": 5842397, + "headersEnd": 5843191, + "end": 6099969, + "octets": 256778, + "lines": 3518 + }, + "end": 6099969, + "octets": 256778, + "lines": 3518 + }, + { + "mboxMarkerBegin": 6099970, + "mboxMarkerLength": 7, + "begin": 6099978, + "headersEnd": 6100830, + "body": { + "mimeType": "multipart/mixed", + "begin": 6099978, + "headersEnd": 6100830, + "children": [ + { + "mimeType": "text/plain", + "begin": 6100845, + "headersEnd": 6100922, + "end": 6101112, + "octets": 190, + "lines": 9 + }, + { + "mimeType": "image/pbm", + "begin": 6101127, + "headersEnd": 6101231, + "end": 6199478, + "octets": 98247, + "lines": 1276 + } + ], + "end": 6199495, + "octets": 98665, + "lines": 1296 + }, + "end": 6199495, + "octets": 98665, + "lines": 1296 + }, + { + "mboxMarkerBegin": 6199496, + "mboxMarkerLength": 7, + "begin": 6199504, + "headersEnd": 6200381, + "body": { + "mimeType": "multipart/mixed", + "begin": 6199504, + "headersEnd": 6200381, + "children": [ + { + "mimeType": "text/plain", + "begin": 6200390, + "headersEnd": 6200436, + "end": 6201379, + "octets": 943, + "lines": 21 + }, + { + "mimeType": "multipart/mixed", + "begin": 6201389, + "headersEnd": 6201452, + "children": [ + { + "mimeType": "multipart/mixed", + "begin": 6201475, + "headersEnd": 6201836, + "children": [ + { + "mimeType": "multipart/mixed", + "begin": 6201858, + "headersEnd": 6201960, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6201982, + "headersEnd": 6202105, + "end": 6202471, + "octets": 366, + "lines": 8 + }, + { + "mimeType": "text/richtext", + "begin": 6202494, + "headersEnd": 6202616, + "end": 6203008, + "octets": 392, + "lines": 10 + }, + { + "mimeType": "text/richtext", + "begin": 6203031, + "headersEnd": 6203156, + "end": 6203864, + "octets": 708, + "lines": 18 + } + ], + "end": 6203889, + "octets": 1929, + "lines": 55 + }, + { + "mimeType": "multipart/mixed", + "begin": 6203912, + "headersEnd": 6204011, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6204033, + "headersEnd": 6204165, + "end": 6220580, + "octets": 16415, + "lines": 470 + }, + { + "mimeType": "text/richtext", + "begin": 6220603, + "headersEnd": 6220734, + "end": 6234988, + "octets": 14254, + "lines": 395 + }, + { + "mimeType": "multipart/mixed", + "begin": 6235011, + "headersEnd": 6235112, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6235134, + "headersEnd": 6235276, + "end": 6241428, + "octets": 6152, + "lines": 164 + }, + { + "mimeType": "text/richtext", + "begin": 6241451, + "headersEnd": 6241578, + "end": 6246833, + "octets": 5255, + "lines": 160 + }, + { + "mimeType": "text/richtext", + "begin": 6246856, + "headersEnd": 6246993, + "end": 6254291, + "octets": 7298, + "lines": 197 + }, + { + "mimeType": "text/richtext", + "begin": 6254314, + "headersEnd": 6254438, + "end": 6260914, + "octets": 6476, + "lines": 184 + }, + { + "mimeType": "text/richtext", + "begin": 6260937, + "headersEnd": 6261074, + "end": 6278242, + "octets": 17168, + "lines": 492 + } + ], + "end": 6278267, + "octets": 43155, + "lines": 1228 + }, + { + "mimeType": "multipart/mixed", + "begin": 6278290, + "headersEnd": 6278385, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6278407, + "headersEnd": 6278541, + "end": 6279036, + "octets": 495, + "lines": 21 + } + ], + "end": 6279061, + "octets": 676, + "lines": 28 + } + ], + "end": 6279086, + "octets": 75075, + "lines": 2144 + }, + { + "mimeType": "multipart/mixed", + "begin": 6279109, + "headersEnd": 6279220, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6279242, + "headersEnd": 6279380, + "end": 6280529, + "octets": 1149, + "lines": 29 + }, + { + "mimeType": "text/richtext", + "begin": 6280552, + "headersEnd": 6280678, + "end": 6281898, + "octets": 1220, + "lines": 35 + }, + { + "mimeType": "text/richtext", + "begin": 6281921, + "headersEnd": 6282061, + "end": 6282738, + "octets": 677, + "lines": 22 + } + ], + "end": 6282763, + "octets": 3543, + "lines": 105 + } + ], + "end": 6282788, + "octets": 80952, + "lines": 2320 + } + ], + "end": 6282813, + "octets": 81361, + "lines": 2332 + } + ], + "end": 6282825, + "octets": 82444, + "lines": 2362 + }, + "end": 6282825, + "octets": 82444, + "lines": 2362 + }, + { + "mboxMarkerBegin": 6282826, + "mboxMarkerLength": 7, + "begin": 6282834, + "headersEnd": 6283636, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 6282834, + "headersEnd": 6283636, + "end": 6292835, + "octets": 9199, + "lines": 226 + }, + "end": 6292835, + "octets": 9199, + "lines": 226 + }, + { + "mboxMarkerBegin": 6292836, + "mboxMarkerLength": 7, + "begin": 6292844, + "headersEnd": 6293572, + "body": { + "mimeType": "multipart/alternative", + "begin": 6292844, + "headersEnd": 6293572, + "children": [ + { + "mimeType": "text/plain", + "begin": 6293767, + "headersEnd": 6293811, + "end": 6294567, + "octets": 756, + "lines": 23 + }, + { + "mimeType": "multipart/mixed", + "begin": 6294608, + "headersEnd": 6294693, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6294735, + "headersEnd": 6294826, + "end": 6295153, + "octets": 327, + "lines": 7 + }, + { + "mimeType": "audio/basic", + "begin": 6295196, + "headersEnd": 6295290, + "end": 6317314, + "octets": 22024, + "lines": 320 + }, + { + "mimeType": "text/richtext", + "begin": 6317357, + "headersEnd": 6317448, + "end": 6317614, + "octets": 166, + "lines": 5 + }, + { + "mimeType": "audio/basic", + "begin": 6317657, + "headersEnd": 6317754, + "end": 6364967, + "octets": 47213, + "lines": 685 + }, + { + "mimeType": "text/richtext", + "begin": 6365010, + "headersEnd": 6365101, + "end": 6365171, + "octets": 70, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 6365214, + "headersEnd": 6365304, + "end": 6385522, + "octets": 20218, + "lines": 294 + }, + { + "mimeType": "text/richtext", + "begin": 6385565, + "headersEnd": 6385656, + "end": 6385760, + "octets": 104, + "lines": 8 + } + ], + "end": 6385805, + "octets": 91112, + "lines": 1360 + } + ], + "end": 6385847, + "octets": 92275, + "lines": 1396 + }, + "end": 6385847, + "octets": 92275, + "lines": 1396 + }, + { + "mboxMarkerBegin": 6385848, + "mboxMarkerLength": 7, + "begin": 6385856, + "headersEnd": 6386610, + "body": { + "mimeType": "multipart/mixed", + "begin": 6385856, + "headersEnd": 6386610, + "children": [ + { + "mimeType": "text/richtext", + "begin": 6386850, + "headersEnd": 6386923, + "end": 6387343, + "octets": 420, + "lines": 13 + }, + { + "mimeType": "image/x-xwd", + "begin": 6387389, + "headersEnd": 6387450, + "end": 6421014, + "octets": 33564, + "lines": 460 + }, + { + "mimeType": "text/richtext", + "begin": 6421060, + "headersEnd": 6421133, + "end": 6421227, + "octets": 94, + "lines": 7 + } + ], + "end": 6421275, + "octets": 34665, + "lines": 500 + }, + "end": 6421275, + "octets": 34665, + "lines": 500 + }, + { + "mboxMarkerBegin": 6421276, + "mboxMarkerLength": 41, + "begin": 6421318, + "headersEnd": 6421466, + "body": { + "mimeType": "text/plain", + "begin": 6421318, + "headersEnd": 6421466, + "end": 6464495, + "octets": 43029, + "lines": 693 + }, + "end": 6464495, + "octets": 43029, + "lines": 693 + }, + { + "mboxMarkerBegin": 6464496, + "mboxMarkerLength": 31, + "begin": 6464528, + "headersEnd": 6465111, + "body": { + "mimeType": "multipart/mixed", + "begin": 6464528, + "headersEnd": 6465111, + "children": [ + { + "mimeType": "multipart/alternative", + "begin": 6465196, + "headersEnd": 6465314, + "children": [ + { + "mimeType": "text/plain", + "begin": 6465354, + "headersEnd": 6465432, + "end": 6466704, + "octets": 1272, + "lines": 38 + }, + { + "mimeType": "text/html", + "begin": 6466744, + "headersEnd": 6466823, + "end": 6469287, + "octets": 2464, + "lines": 32 + } + ], + "end": 6469330, + "octets": 4016, + "lines": 83 + }, + { + "mimeType": "application/octet-stream", + "begin": 6469370, + "headersEnd": 6469575, + "end": 6490325, + "octets": 20750, + "lines": 270 + } + ], + "end": 6490367, + "octets": 25256, + "lines": 368 + }, + "end": 6490367, + "octets": 25256, + "lines": 368 + }, + { + "mboxMarkerBegin": 6490368, + "mboxMarkerLength": 31, + "begin": 6490400, + "headersEnd": 6490806, + "body": { + "mimeType": "multipart/mixed", + "begin": 6490400, + "headersEnd": 6490806, + "children": [ + { + "mimeType": "text/plain", + "begin": 6490872, + "headersEnd": 6490873, + "end": 6490936, + "octets": 63, + "lines": 1 + }, + { + "mimeType": "multipart/alternative", + "begin": 6490957, + "headersEnd": 6491031, + "children": [ + { + "mimeType": "text/plain", + "begin": 6491058, + "headersEnd": 6491164, + "end": 6491244, + "octets": 80, + "lines": 3 + }, + { + "mimeType": "text/richtext", + "begin": 6491272, + "headersEnd": 6491381, + "end": 6491539, + "octets": 158, + "lines": 4 + }, + { + "mimeType": "text/enriched", + "begin": 6491567, + "headersEnd": 6491676, + "end": 6491839, + "octets": 163, + "lines": 10 + }, + { + "mimeType": "text/html", + "begin": 6491867, + "headersEnd": 6491972, + "end": 6492133, + "octets": 161, + "lines": 3 + }, + { + "mimeType": "text/something-you-dont-know", + "begin": 6492161, + "headersEnd": 6492285, + "end": 6492712, + "octets": 427, + "lines": 6 + } + ], + "end": 6492741, + "octets": 1710, + "lines": 57 + }, + { + "mimeType": "text/plain", + "begin": 6492762, + "headersEnd": 6492763, + "end": 6492928, + "octets": 165, + "lines": 4 + }, + { + "mimeType": "multipart/alternative", + "begin": 6492949, + "headersEnd": 6492999, + "children": [ + { + "mimeType": "text/plain", + "begin": 6493004, + "headersEnd": 6493030, + "end": 6493083, + "octets": 53, + "lines": 1 + }, + { + "mimeType": "multipart/alternative", + "begin": 6493089, + "headersEnd": 6493139, + "children": [ + { + "mimeType": "text/plain", + "begin": 6493144, + "headersEnd": 6493170, + "end": 6493223, + "octets": 53, + "lines": 1 + }, + { + "mimeType": "text/html", + "begin": 6493229, + "headersEnd": 6493254, + "end": 6493304, + "octets": 50, + "lines": 1 + }, + { + "mimeType": "text/x-barf", + "begin": 6493310, + "headersEnd": 6493337, + "end": 6493391, + "octets": 54, + "lines": 1 + } + ], + "end": 6493399, + "octets": 260, + "lines": 16 + }, + { + "mimeType": "application/spankme", + "begin": 6493405, + "headersEnd": 6493497, + "end": 6493512, + "octets": 15, + "lines": 1 + } + ], + "end": 6493519, + "octets": 520, + "lines": 32 + }, + { + "mimeType": "text/plain", + "begin": 6493540, + "headersEnd": 6493541, + "end": 6493550, + "octets": 9, + "lines": 1 + } + ], + "end": 6493572, + "octets": 2766, + "lines": 113 + }, + "end": 6493572, + "octets": 2766, + "lines": 113 + }, + { + "mboxMarkerBegin": 6493573, + "mboxMarkerLength": 31, + "begin": 6493605, + "headersEnd": 6494009, + "body": { + "mimeType": "multipart/mixed", + "begin": 6493605, + "headersEnd": 6494009, + "children": [ + { + "mimeType": "text/plain", + "begin": 6494075, + "headersEnd": 6494076, + "end": 6494143, + "octets": 67, + "lines": 1 + }, + { + "mimeType": "multipart/alternative", + "begin": 6494164, + "headersEnd": 6494238, + "children": [ + { + "mimeType": "text/plain", + "begin": 6494265, + "headersEnd": 6494421, + "end": 6549684, + "octets": 55263, + "lines": 1603 + }, + { + "mimeType": "text/html", + "begin": 6549712, + "headersEnd": 6549867, + "end": 6655916, + "octets": 106049, + "lines": 2982 + }, + { + "mimeType": "application/postscript", + "begin": 6655944, + "headersEnd": 6656090, + "end": 6844449, + "octets": 188359, + "lines": 13109 + } + ], + "end": 6844479, + "octets": 350241, + "lines": 17713 + } + ], + "end": 6844507, + "octets": 350498, + "lines": 17726 + }, + "end": 6844507, + "octets": 350498, + "lines": 17726 + }, + { + "mboxMarkerBegin": 6844508, + "mboxMarkerLength": 7, + "begin": 6844516, + "headersEnd": 6845120, + "body": { + "mimeType": "MULTIPART/MIXED", + "begin": 6844516, + "headersEnd": 6845120, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 6845376, + "headersEnd": 6845488, + "end": 6845488, + "octets": 0, + "lines": 0 + }, + { + "mimeType": "MESSAGE/RFC822", + "begin": 6845529, + "headersEnd": 6845627, + "message": { + "begin": 6845627, + "headersEnd": 6846168, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 6845627, + "headersEnd": 6846168, + "end": 6846514, + "octets": 346, + "lines": 16 + }, + "end": 6846514, + "octets": 346, + "lines": 16 + }, + "end": 6846514, + "octets": 887, + "lines": 28 + } + ], + "end": 6846556, + "octets": 1436, + "lines": 43 + }, + "end": 6846556, + "octets": 1436, + "lines": 43 + }, + { + "mboxMarkerBegin": 6846557, + "mboxMarkerLength": 7, + "begin": 6846565, + "headersEnd": 6846861, + "body": { + "mimeType": "multipart/related", + "begin": 6846565, + "headersEnd": 6846861, + "children": [ + { + "mimeType": "text/html", + "begin": 6846900, + "headersEnd": 6847146, + "end": 6847865, + "octets": 719, + "lines": 30 + }, + { + "mimeType": "image/jpeg", + "begin": 6847905, + "headersEnd": 6848225, + "end": 6858948, + "octets": 10723, + "lines": 147 + } + ], + "end": 6858989, + "octets": 12128, + "lines": 197 + }, + "end": 6858989, + "octets": 12128, + "lines": 197 + }, + { + "mboxMarkerBegin": 6858990, + "mboxMarkerLength": 7, + "begin": 6858998, + "headersEnd": 6859294, + "body": { + "mimeType": "multipart/related", + "begin": 6858998, + "headersEnd": 6859294, + "children": [ + { + "mimeType": "text/html", + "begin": 6859333, + "headersEnd": 6859579, + "end": 6860297, + "octets": 718, + "lines": 30 + }, + { + "mimeType": "image/jpeg", + "begin": 6860337, + "headersEnd": 6860626, + "end": 6871349, + "octets": 10723, + "lines": 147 + } + ], + "end": 6871390, + "octets": 12096, + "lines": 197 + }, + "end": 6871390, + "octets": 12096, + "lines": 197 + }, + { + "mboxMarkerBegin": 6871391, + "mboxMarkerLength": 31, + "begin": 6871423, + "headersEnd": 6872926, + "body": { + "mimeType": "multipart/related", + "begin": 6871423, + "headersEnd": 6872926, + "children": [ + { + "mimeType": "text/html", + "begin": 6872971, + "headersEnd": 6873062, + "end": 6878261, + "octets": 5199, + "lines": 111 + }, + { + "mimeType": "image/gif", + "begin": 6878306, + "headersEnd": 6878505, + "end": 6879434, + "octets": 929, + "lines": 13 + } + ], + "end": 6879481, + "octets": 6555, + "lines": 139 + }, + "end": 6879481, + "octets": 6555, + "lines": 139 + }, + { + "mboxMarkerBegin": 6879482, + "mboxMarkerLength": 31, + "begin": 6879514, + "headersEnd": 6879961, + "body": { + "mimeType": "multipart/mixed", + "begin": 6879514, + "headersEnd": 6879961, + "children": [ + { + "mimeType": "text/plain", + "begin": 6880000, + "headersEnd": 6880026, + "end": 6880273, + "octets": 247, + "lines": 6 + }, + { + "mimeType": "multipart/related", + "begin": 6880313, + "headersEnd": 6880399, + "children": [ + { + "mimeType": "text/html", + "begin": 6880438, + "headersEnd": 6880632, + "end": 6887780, + "octets": 7148, + "lines": 179 + }, + { + "mimeType": "image/gif", + "begin": 6887820, + "headersEnd": 6887996, + "end": 6895977, + "octets": 7981, + "lines": 110 + }, + { + "mimeType": "image/gif", + "begin": 6896017, + "headersEnd": 6896176, + "end": 6903630, + "octets": 7454, + "lines": 103 + }, + { + "mimeType": "image/gif", + "begin": 6903670, + "headersEnd": 6903828, + "end": 6907161, + "octets": 3333, + "lines": 46 + }, + { + "mimeType": "image/gif", + "begin": 6907201, + "headersEnd": 6907360, + "end": 6915811, + "octets": 8451, + "lines": 116 + }, + { + "mimeType": "image/gif", + "begin": 6915851, + "headersEnd": 6916007, + "end": 7020376, + "octets": 104369, + "lines": 1430 + }, + { + "mimeType": "image/jpeg", + "begin": 7020416, + "headersEnd": 7020575, + "end": 7058936, + "octets": 38361, + "lines": 526 + }, + { + "mimeType": "image/jpeg", + "begin": 7058976, + "headersEnd": 7059140, + "end": 7094455, + "octets": 35315, + "lines": 484 + } + ], + "end": 7094496, + "octets": 214097, + "lines": 3044 + } + ], + "end": 7094537, + "octets": 214576, + "lines": 3059 + }, + "end": 7094537, + "octets": 214576, + "lines": 3059 + }, + { + "mboxMarkerBegin": 7094538, + "mboxMarkerLength": 7, + "begin": 7094546, + "headersEnd": 7094841, + "body": { + "mimeType": "multipart/related", + "begin": 7094546, + "headersEnd": 7094841, + "children": [ + { + "mimeType": "text/html", + "begin": 7094880, + "headersEnd": 7095036, + "end": 7095587, + "octets": 551, + "lines": 27 + }, + { + "mimeType": "image/jpeg", + "begin": 7095627, + "headersEnd": 7095740, + "end": 7106463, + "octets": 10723, + "lines": 147 + } + ], + "end": 7106504, + "octets": 11663, + "lines": 188 + }, + "end": 7106504, + "octets": 11663, + "lines": 188 + }, + { + "mboxMarkerBegin": 7106505, + "mboxMarkerLength": 7, + "begin": 7106513, + "headersEnd": 7106808, + "body": { + "mimeType": "multipart/related", + "begin": 7106513, + "headersEnd": 7106808, + "children": [ + { + "mimeType": "text/html", + "begin": 7106847, + "headersEnd": 7107059, + "end": 7107656, + "octets": 597, + "lines": 28 + }, + { + "mimeType": "image/jpeg", + "begin": 7107696, + "headersEnd": 7107970, + "end": 7118693, + "octets": 10723, + "lines": 147 + } + ], + "end": 7118734, + "octets": 11926, + "lines": 193 + }, + "end": 7118734, + "octets": 11926, + "lines": 193 + }, + { + "mboxMarkerBegin": 7118735, + "mboxMarkerLength": 7, + "begin": 7118743, + "headersEnd": 7119038, + "body": { + "mimeType": "multipart/related", + "begin": 7118743, + "headersEnd": 7119038, + "children": [ + { + "mimeType": "text/html", + "begin": 7119077, + "headersEnd": 7119293, + "end": 7119894, + "octets": 601, + "lines": 28 + }, + { + "mimeType": "image/jpeg", + "begin": 7119934, + "headersEnd": 7120109, + "end": 7130832, + "octets": 10723, + "lines": 147 + } + ], + "end": 7130873, + "octets": 11835, + "lines": 191 + }, + "end": 7130873, + "octets": 11835, + "lines": 191 + }, + { + "mboxMarkerBegin": 7130874, + "mboxMarkerLength": 7, + "begin": 7130882, + "headersEnd": 7131177, + "body": { + "mimeType": "multipart/related", + "begin": 7130882, + "headersEnd": 7131177, + "children": [ + { + "mimeType": "text/html", + "begin": 7131216, + "headersEnd": 7131461, + "end": 7132092, + "octets": 631, + "lines": 29 + }, + { + "mimeType": "image/jpeg", + "begin": 7132132, + "headersEnd": 7132437, + "end": 7143160, + "octets": 10723, + "lines": 147 + } + ], + "end": 7143201, + "octets": 12024, + "lines": 196 + }, + "end": 7143201, + "octets": 12024, + "lines": 196 + }, + { + "mboxMarkerBegin": 7143202, + "mboxMarkerLength": 7, + "begin": 7143210, + "headersEnd": 7143505, + "body": { + "mimeType": "multipart/related", + "begin": 7143210, + "headersEnd": 7143505, + "children": [ + { + "mimeType": "text/html", + "begin": 7143544, + "headersEnd": 7143760, + "end": 7144405, + "octets": 645, + "lines": 28 + }, + { + "mimeType": "image/jpeg", + "begin": 7144445, + "headersEnd": 7144620, + "end": 7155343, + "octets": 10723, + "lines": 147 + } + ], + "end": 7155384, + "octets": 11879, + "lines": 191 + }, + "end": 7155384, + "octets": 11879, + "lines": 191 + }, + { + "mboxMarkerBegin": 7155385, + "mboxMarkerLength": 7, + "begin": 7155393, + "headersEnd": 7155688, + "body": { + "mimeType": "multipart/related", + "begin": 7155393, + "headersEnd": 7155688, + "children": [ + { + "mimeType": "text/html", + "begin": 7155727, + "headersEnd": 7155972, + "end": 7156642, + "octets": 670, + "lines": 29 + }, + { + "mimeType": "image/jpeg", + "begin": 7156682, + "headersEnd": 7157018, + "end": 7167741, + "octets": 10723, + "lines": 147 + } + ], + "end": 7167782, + "octets": 12094, + "lines": 196 + }, + "end": 7167782, + "octets": 12094, + "lines": 196 + }, + { + "mboxMarkerBegin": 7167783, + "mboxMarkerLength": 31, + "begin": 7167815, + "headersEnd": 7169049, + "body": { + "mimeType": "multipart/mixed", + "begin": 7167815, + "headersEnd": 7169049, + "children": [ + { + "mimeType": "text/plain", + "begin": 7169133, + "headersEnd": 7169209, + "end": 7169236, + "octets": 27, + "lines": 3 + }, + { + "mimeType": "message/rfc822", + "begin": 7169275, + "headersEnd": 7169365, + "message": { + "begin": 7169365, + "headersEnd": 7170186, + "body": { + "mimeType": "multipart/alternative", + "begin": 7169365, + "headersEnd": 7170186, + "children": [ + { + "mimeType": "text/plain", + "begin": 7170226, + "headersEnd": 7170302, + "end": 7170929, + "octets": 627, + "lines": 16 + }, + { + "mimeType": "multipart/related", + "begin": 7170969, + "headersEnd": 7171051, + "children": [ + { + "mimeType": "text/html", + "begin": 7171091, + "headersEnd": 7171166, + "end": 7172016, + "octets": 850, + "lines": 18 + }, + { + "mimeType": "image/tiff", + "begin": 7172056, + "headersEnd": 7172240, + "end": 7916207, + "octets": 743967, + "lines": 10192 + } + ], + "end": 7916249, + "octets": 745198, + "lines": 10223 + } + ], + "end": 7916293, + "octets": 746107, + "lines": 10252 + }, + "end": 7916293, + "octets": 746107, + "lines": 10252 + }, + "end": 7916293, + "octets": 746928, + "lines": 10268 + } + ], + "end": 7916334, + "octets": 747285, + "lines": 10285 + }, + "end": 7916334, + "octets": 747285, + "lines": 10285 + }, + { + "mboxMarkerBegin": 7916335, + "mboxMarkerLength": 31, + "begin": 7916367, + "headersEnd": 7917631, + "body": { + "mimeType": "multipart/related", + "begin": 7916367, + "headersEnd": 7917631, + "children": [ + { + "mimeType": "text/html", + "begin": 7917676, + "headersEnd": 7917767, + "end": 7920149, + "octets": 2382, + "lines": 50 + }, + { + "mimeType": "image/gif", + "begin": 7920194, + "headersEnd": 7920353, + "end": 7926376, + "octets": 6023, + "lines": 79 + }, + { + "mimeType": "image/gif", + "begin": 7926421, + "headersEnd": 7926579, + "end": 7938652, + "octets": 12073, + "lines": 157 + }, + { + "mimeType": "image/gif", + "begin": 7938697, + "headersEnd": 7938857, + "end": 7960571, + "octets": 21714, + "lines": 282 + }, + { + "mimeType": "image/gif", + "begin": 7960616, + "headersEnd": 7960819, + "end": 7964212, + "octets": 3393, + "lines": 45 + } + ], + "end": 7964259, + "octets": 46628, + "lines": 649 + }, + "end": 7964259, + "octets": 46628, + "lines": 649 + }, + { + "mboxMarkerBegin": 7964260, + "mboxMarkerLength": 7, + "begin": 7964268, + "headersEnd": 7965009, + "body": { + "mimeType": "audio/basic", + "begin": 7964268, + "headersEnd": 7965009, + "end": 8509625, + "octets": 544616, + "lines": 7474 + }, + "end": 8509625, + "octets": 544616, + "lines": 7474 + }, + { + "mboxMarkerBegin": 8509626, + "mboxMarkerLength": 7, + "begin": 8509634, + "headersEnd": 8510545, + "body": { + "mimeType": "multipart/mixed", + "begin": 8509634, + "headersEnd": 8510545, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8510554, + "headersEnd": 8510583, + "end": 8513113, + "octets": 2530, + "lines": 96 + } + ], + "end": 8513124, + "octets": 2579, + "lines": 102 + }, + "end": 8513124, + "octets": 2579, + "lines": 102 + }, + { + "mboxMarkerBegin": 8513125, + "mboxMarkerLength": 31, + "begin": 8513157, + "headersEnd": 8513751, + "body": { + "mimeType": "multipart/signed", + "begin": 8513157, + "headersEnd": 8513751, + "children": [ + { + "mimeType": "text/plain", + "begin": 8514048, + "headersEnd": 8514093, + "end": 8515175, + "octets": 1082, + "lines": 26 + }, + { + "mimeType": "application/pgp-signature", + "begin": 8515193, + "headersEnd": 8515234, + "end": 8515518, + "octets": 284, + "lines": 9 + } + ], + "end": 8515537, + "octets": 1786, + "lines": 51 + }, + "end": 8515537, + "octets": 1786, + "lines": 51 + }, + { + "mboxMarkerBegin": 8515538, + "mboxMarkerLength": 7, + "begin": 8515546, + "headersEnd": 8516708, + "body": { + "mimeType": "application/pgp", + "begin": 8515546, + "headersEnd": 8516708, + "end": 8518091, + "octets": 1383, + "lines": 40 + }, + "end": 8518091, + "octets": 1383, + "lines": 40 + }, + { + "mboxMarkerBegin": 8518092, + "mboxMarkerLength": 7, + "begin": 8518100, + "headersEnd": 8518733, + "body": { + "mimeType": "text/plain", + "begin": 8518100, + "headersEnd": 8518733, + "end": 8519707, + "octets": 974, + "lines": 27 + }, + "end": 8519707, + "octets": 974, + "lines": 27 + }, + { + "mboxMarkerBegin": 8519708, + "mboxMarkerLength": 7, + "begin": 8519716, + "headersEnd": 8520478, + "body": { + "mimeType": "multipart/alternative", + "begin": 8519716, + "headersEnd": 8520478, + "children": [ + { + "mimeType": "text/plain", + "begin": 8520673, + "headersEnd": 8520717, + "end": 8521534, + "octets": 817, + "lines": 15 + }, + { + "mimeType": "multipart/mixed", + "begin": 8521575, + "headersEnd": 8521660, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8521702, + "headersEnd": 8521793, + "end": 8522284, + "octets": 491, + "lines": 10 + }, + { + "mimeType": "message/external-body", + "begin": 8522327, + "headersEnd": 8522513, + "message": { + "begin": 8522513, + "headersEnd": 8522540, + "body": { + "mimeType": "audio/basic", + "begin": 8522513, + "headersEnd": 8522540, + "end": 8522542, + "octets": 2, + "lines": 2 + }, + "end": 8522542, + "octets": 2, + "lines": 2 + }, + "end": 8522542, + "octets": 29, + "lines": 4 + }, + { + "mimeType": "text/plain", + "begin": 8522585, + "headersEnd": 8522673, + "end": 8522676, + "octets": 3, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 8522719, + "headersEnd": 8522920, + "message": { + "begin": 8522920, + "headersEnd": 8522945, + "body": { + "mimeType": "image/gif", + "begin": 8522920, + "headersEnd": 8522945, + "end": 8522947, + "octets": 2, + "lines": 2 + }, + "end": 8522947, + "octets": 2, + "lines": 2 + }, + "end": 8522947, + "octets": 27, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8522990, + "headersEnd": 8523081, + "end": 8523303, + "octets": 222, + "lines": 7 + } + ], + "end": 8523348, + "octets": 1688, + "lines": 61 + } + ], + "end": 8523391, + "octets": 2913, + "lines": 89 + }, + "end": 8523391, + "octets": 2913, + "lines": 89 + }, + { + "mboxMarkerBegin": 8523392, + "mboxMarkerLength": 7, + "begin": 8523400, + "headersEnd": 8524214, + "body": { + "mimeType": "text/richtext", + "begin": 8523400, + "headersEnd": 8524214, + "end": 8525600, + "octets": 1386, + "lines": 42 + }, + "end": 8525600, + "octets": 1386, + "lines": 42 + }, + { + "mboxMarkerBegin": 8525601, + "mboxMarkerLength": 7, + "begin": 8525609, + "headersEnd": 8525761, + "body": { + "mimeType": "message/partial", + "begin": 8525609, + "headersEnd": 8525761, + "end": 8530432, + "octets": 4671, + "lines": 64 + }, + "end": 8530432, + "octets": 4671, + "lines": 64 + }, + { + "mboxMarkerBegin": 8530433, + "mboxMarkerLength": 7, + "begin": 8530441, + "headersEnd": 8532184, + "body": { + "mimeType": "multipart/alternative", + "begin": 8530441, + "headersEnd": 8532184, + "children": [ + { + "mimeType": "text/plain", + "begin": 8532379, + "headersEnd": 8532423, + "end": 8534090, + "octets": 1667, + "lines": 38 + }, + { + "mimeType": "multipart/mixed", + "begin": 8534131, + "headersEnd": 8534216, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8534258, + "headersEnd": 8534349, + "end": 8534906, + "octets": 557, + "lines": 14 + }, + { + "mimeType": "image/x-xwd", + "begin": 8534949, + "headersEnd": 8535010, + "end": 8535882, + "octets": 872, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8535925, + "headersEnd": 8536016, + "end": 8536062, + "octets": 46, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8536105, + "headersEnd": 8536166, + "end": 8537038, + "octets": 872, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8537081, + "headersEnd": 8537172, + "end": 8537218, + "octets": 46, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8537261, + "headersEnd": 8537322, + "end": 8538194, + "octets": 872, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8538237, + "headersEnd": 8538328, + "end": 8538368, + "octets": 40, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8538411, + "headersEnd": 8538472, + "end": 8538696, + "octets": 224, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8538739, + "headersEnd": 8538830, + "end": 8538894, + "octets": 64, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8538937, + "headersEnd": 8538998, + "end": 8539222, + "octets": 224, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8539265, + "headersEnd": 8539356, + "end": 8539400, + "octets": 44, + "lines": 5 + }, + { + "mimeType": "image/x-xwd", + "begin": 8539443, + "headersEnd": 8539504, + "end": 8539728, + "octets": 224, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 8539771, + "headersEnd": 8539862, + "end": 8540154, + "octets": 292, + "lines": 11 + }, + { + "mimeType": "image/x-xwd", + "begin": 8540197, + "headersEnd": 8540258, + "end": 8541130, + "octets": 872, + "lines": 12 + }, + { + "mimeType": "text/richtext", + "begin": 8541173, + "headersEnd": 8541264, + "end": 8541304, + "octets": 40, + "lines": 4 + }, + { + "mimeType": "image/x-xwd", + "begin": 8541347, + "headersEnd": 8541408, + "end": 8543323, + "octets": 1915, + "lines": 27 + }, + { + "mimeType": "text/richtext", + "begin": 8543366, + "headersEnd": 8543457, + "end": 8543467, + "octets": 10, + "lines": 1 + } + ], + "end": 8543512, + "octets": 9296, + "lines": 228 + } + ], + "end": 8543555, + "octets": 11371, + "lines": 279 + }, + "end": 8543555, + "octets": 11371, + "lines": 279 + }, + { + "mboxMarkerBegin": 8543556, + "mboxMarkerLength": 7, + "begin": 8543564, + "headersEnd": 8544292, + "body": { + "mimeType": "multipart/alternative", + "begin": 8543564, + "headersEnd": 8544292, + "children": [ + { + "mimeType": "text/plain", + "begin": 8544487, + "headersEnd": 8544531, + "end": 8545158, + "octets": 627, + "lines": 12 + }, + { + "mimeType": "multipart/mixed", + "begin": 8545199, + "headersEnd": 8545284, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8545326, + "headersEnd": 8545417, + "end": 8545950, + "octets": 533, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 8545993, + "headersEnd": 8546101, + "end": 8554686, + "octets": 8585, + "lines": 125 + }, + { + "mimeType": "text/richtext", + "begin": 8554729, + "headersEnd": 8554820, + "end": 8554865, + "octets": 45, + "lines": 3 + } + ], + "end": 8554910, + "octets": 9626, + "lines": 153 + } + ], + "end": 8554952, + "octets": 10660, + "lines": 178 + }, + "end": 8554952, + "octets": 10660, + "lines": 178 + }, + { + "mboxMarkerBegin": 8554953, + "mboxMarkerLength": 7, + "begin": 8554961, + "headersEnd": 8555607, + "body": { + "mimeType": "multipart/mixed", + "begin": 8554961, + "headersEnd": 8555607, + "children": [ + { + "mimeType": "text/plain", + "begin": 8555657, + "headersEnd": 8555747, + "end": 8555844, + "octets": 97, + "lines": 6 + }, + { + "mimeType": "audio/basic", + "begin": 8555894, + "headersEnd": 8556021, + "end": 8634463, + "octets": 78442, + "lines": 1075 + } + ], + "end": 8634515, + "octets": 78908, + "lines": 1093 + }, + "end": 8634515, + "octets": 78908, + "lines": 1093 + }, + { + "mboxMarkerBegin": 8634516, + "mboxMarkerLength": 7, + "begin": 8634524, + "headersEnd": 8635280, + "body": { + "mimeType": "multipart/alternative", + "begin": 8634524, + "headersEnd": 8635280, + "children": [ + { + "mimeType": "text/plain", + "begin": 8635475, + "headersEnd": 8635519, + "end": 8636869, + "octets": 1350, + "lines": 28 + }, + { + "mimeType": "multipart/mixed", + "begin": 8636910, + "headersEnd": 8636995, + "children": [ + { + "mimeType": "text/richtext", + "begin": 8637037, + "headersEnd": 8637128, + "end": 8638267, + "octets": 1139, + "lines": 22 + }, + { + "mimeType": "audio/basic", + "begin": 8638310, + "headersEnd": 8638408, + "end": 8753651, + "octets": 115243, + "lines": 1579 + }, + { + "mimeType": "text/richtext", + "begin": 8753694, + "headersEnd": 8753785, + "end": 8753908, + "octets": 123, + "lines": 3 + }, + { + "mimeType": "image/gif", + "begin": 8753951, + "headersEnd": 8754050, + "end": 8820331, + "octets": 66281, + "lines": 961 + }, + { + "mimeType": "text/plain", + "begin": 8820374, + "headersEnd": 8820462, + "end": 8820462, + "octets": 0, + "lines": 0 + } + ], + "end": 8820507, + "octets": 183512, + "lines": 2593 + } + ], + "end": 8820549, + "octets": 185269, + "lines": 2634 + }, + "end": 8820549, + "octets": 185269, + "lines": 2634 + }, + { + "mboxMarkerBegin": 8820550, + "mboxMarkerLength": 7, + "begin": 8820558, + "headersEnd": 8821395, + "body": { + "mimeType": "application/x-pkcs", + "begin": 8820558, + "headersEnd": 8821395, + "end": 8823128, + "octets": 1733, + "lines": 25 + }, + "end": 8823128, + "octets": 1733, + "lines": 25 + }, + { + "mboxMarkerBegin": 8823129, + "mboxMarkerLength": 7, + "begin": 8823137, + "headersEnd": 8823767, + "body": { + "mimeType": "MESSAGE/RFC822", + "begin": 8823137, + "headersEnd": 8823767, + "message": { + "begin": 8823767, + "headersEnd": 8824250, + "body": { + "mimeType": "TEXT/PLAIN", + "begin": 8823767, + "headersEnd": 8824250, + "end": 8825125, + "octets": 875, + "lines": 25 + }, + "end": 8825125, + "octets": 875, + "lines": 25 + }, + "end": 8825125, + "octets": 1358, + "lines": 38 + }, + "end": 8825125, + "octets": 1358, + "lines": 38 + }, + { + "mboxMarkerBegin": 8825126, + "mboxMarkerLength": 7, + "begin": 8825134, + "headersEnd": 8825579, + "body": { + "mimeType": "multipart/mixed", + "begin": 8825134, + "headersEnd": 8825579, + "children": [ + { + "mimeType": "text/plain", + "begin": 8825588, + "headersEnd": 8825589, + "end": 8825629, + "octets": 40, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 8825639, + "headersEnd": 8825700, + "end": 8916949, + "octets": 91249, + "lines": 1250 + } + ], + "end": 8916963, + "octets": 91384, + "lines": 1261 + }, + "end": 8916963, + "octets": 91384, + "lines": 1261 + }, + { + "mboxMarkerBegin": 8916964, + "mboxMarkerLength": 7, + "begin": 8916972, + "headersEnd": 8917462, + "body": { + "mimeType": "text/plain", + "begin": 8916972, + "headersEnd": 8917462, + "end": 8918604, + "octets": 1142, + "lines": 27 + }, + "end": 8918604, + "octets": 1142, + "lines": 27 + }, + { + "mboxMarkerBegin": 8918605, + "mboxMarkerLength": 7, + "begin": 8918613, + "headersEnd": 8919753, + "body": { + "mimeType": "multipart/mixed", + "begin": 8918613, + "headersEnd": 8919753, + "children": [ + { + "mimeType": "text/plain", + "begin": 8919758, + "headersEnd": 8919759, + "end": 8920299, + "octets": 540, + "lines": 12 + }, + { + "mimeType": "image/gif", + "begin": 8920305, + "headersEnd": 8920421, + "end": 8978062, + "octets": 57641, + "lines": 790 + }, + { + "mimeType": "text/plain", + "begin": 8978068, + "headersEnd": 8978069, + "end": 8981852, + "octets": 3783, + "lines": 83 + }, + { + "mimeType": "application/octet-stream", + "begin": 8981858, + "headersEnd": 8982012, + "end": 9011647, + "octets": 29635, + "lines": 1010 + }, + { + "mimeType": "application/octet-stream", + "begin": 9011653, + "headersEnd": 9011759, + "end": 9012475, + "octets": 716, + "lines": 24 + }, + { + "mimeType": "application/octet-stream", + "begin": 9012481, + "headersEnd": 9012598, + "end": 9013862, + "octets": 1264, + "lines": 25 + } + ], + "end": 9013870, + "octets": 94117, + "lines": 1970 + }, + "end": 9013870, + "octets": 94117, + "lines": 1970 + }, + { + "mboxMarkerBegin": 9013871, + "mboxMarkerLength": 31, + "begin": 9013903, + "headersEnd": 9015056, + "body": { + "mimeType": "multipart/signed", + "begin": 9013903, + "headersEnd": 9015056, + "children": [ + { + "mimeType": "text/plain", + "begin": 9015073, + "headersEnd": 9015074, + "end": 9015975, + "octets": 901, + "lines": 20 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9015993, + "headersEnd": 9016072, + "end": 9016820, + "octets": 748, + "lines": 12 + } + ], + "end": 9016840, + "octets": 1784, + "lines": 41 + }, + "end": 9016840, + "octets": 1784, + "lines": 41 + }, + { + "mboxMarkerBegin": 9016841, + "mboxMarkerLength": 31, + "begin": 9016873, + "headersEnd": 9018015, + "body": { + "mimeType": "multipart/mixed", + "begin": 9016873, + "headersEnd": 9018015, + "children": [ + { + "mimeType": "text/plain", + "begin": 9018195, + "headersEnd": 9018273, + "end": 9019014, + "octets": 741, + "lines": 14 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 9019022, + "headersEnd": 9019200, + "end": 9021415, + "octets": 2215, + "lines": 31 + } + ], + "end": 9021424, + "octets": 3409, + "lines": 60 + }, + "end": 9021424, + "octets": 3409, + "lines": 60 + }, + { + "mboxMarkerBegin": 9021425, + "mboxMarkerLength": 31, + "begin": 9021457, + "headersEnd": 9022594, + "body": { + "mimeType": "multipart/mixed", + "begin": 9021457, + "headersEnd": 9022594, + "children": [ + { + "mimeType": "text/plain", + "begin": 9022788, + "headersEnd": 9022866, + "end": 9025678, + "octets": 2812, + "lines": 47 + }, + { + "mimeType": "application/x-pkcs7-mime", + "begin": 9025700, + "headersEnd": 9025878, + "end": 9028425, + "octets": 2547, + "lines": 35 + } + ], + "end": 9028448, + "octets": 5854, + "lines": 97 + }, + "end": 9028448, + "octets": 5854, + "lines": 97 + }, + { + "mboxMarkerBegin": 9028449, + "mboxMarkerLength": 7, + "begin": 9028457, + "headersEnd": 9028665, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9028457, + "headersEnd": 9028665, + "end": 9032858, + "octets": 4193, + "lines": 58 + }, + "end": 9032858, + "octets": 4193, + "lines": 58 + }, + { + "mboxMarkerBegin": 9032859, + "mboxMarkerLength": 31, + "begin": 9032891, + "headersEnd": 9033791, + "body": { + "mimeType": "multipart/signed", + "begin": 9032891, + "headersEnd": 9033791, + "children": [ + { + "mimeType": "image/jpeg", + "begin": 9033864, + "headersEnd": 9033998, + "end": 9044720, + "octets": 10722, + "lines": 147 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9044748, + "headersEnd": 9044899, + "end": 9049510, + "octets": 4611, + "lines": 64 + } + ], + "end": 9049540, + "octets": 15749, + "lines": 224 + }, + "end": 9049540, + "octets": 15749, + "lines": 224 + }, + { + "mboxMarkerBegin": 9049541, + "mboxMarkerLength": 31, + "begin": 9049573, + "headersEnd": 9050380, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9049573, + "headersEnd": 9050380, + "end": 9067141, + "octets": 16761, + "lines": 258 + }, + "end": 9067141, + "octets": 16761, + "lines": 258 + }, + { + "mboxMarkerBegin": 9067142, + "mboxMarkerLength": 31, + "begin": 9067174, + "headersEnd": 9067986, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9067174, + "headersEnd": 9067986, + "end": 9092950, + "octets": 24964, + "lines": 385 + }, + "end": 9092950, + "octets": 24964, + "lines": 385 + }, + { + "mboxMarkerBegin": 9092951, + "mboxMarkerLength": 31, + "begin": 9092983, + "headersEnd": 9093795, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9092983, + "headersEnd": 9093795, + "end": 9129926, + "octets": 36131, + "lines": 556 + }, + "end": 9129926, + "octets": 36131, + "lines": 556 + }, + { + "mboxMarkerBegin": 9129927, + "mboxMarkerLength": 31, + "begin": 9129959, + "headersEnd": 9130774, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9129959, + "headersEnd": 9130774, + "end": 9182075, + "octets": 51301, + "lines": 790 + }, + "end": 9182075, + "octets": 51301, + "lines": 790 + }, + { + "mboxMarkerBegin": 9182076, + "mboxMarkerLength": 31, + "begin": 9182108, + "headersEnd": 9183499, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9182108, + "headersEnd": 9183499, + "end": 9184930, + "octets": 1431, + "lines": 20 + }, + "end": 9184930, + "octets": 1431, + "lines": 20 + }, + { + "mboxMarkerBegin": 9184931, + "mboxMarkerLength": 31, + "begin": 9184963, + "headersEnd": 9186316, + "body": { + "mimeType": "multipart/signed", + "begin": 9184963, + "headersEnd": 9186316, + "children": [ + { + "mimeType": "text/plain", + "begin": 9186361, + "headersEnd": 9186425, + "end": 9186532, + "octets": 107, + "lines": 4 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9186577, + "headersEnd": 9186728, + "end": 9190661, + "octets": 3933, + "lines": 54 + } + ], + "end": 9190708, + "octets": 4392, + "lines": 69 + }, + "end": 9190708, + "octets": 4392, + "lines": 69 + }, + { + "mboxMarkerBegin": 9190709, + "mboxMarkerLength": 31, + "begin": 9190741, + "headersEnd": 9191951, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9190741, + "headersEnd": 9191951, + "end": 9195446, + "octets": 3495, + "lines": 55 + }, + "end": 9195446, + "octets": 3495, + "lines": 55 + }, + { + "mboxMarkerBegin": 9195447, + "mboxMarkerLength": 31, + "begin": 9195479, + "headersEnd": 9196556, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9195479, + "headersEnd": 9196556, + "end": 9197217, + "octets": 661, + "lines": 10 + }, + "end": 9197217, + "octets": 661, + "lines": 10 + }, + { + "mboxMarkerBegin": 9197218, + "mboxMarkerLength": 7, + "begin": 9197226, + "headersEnd": 9197618, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9197226, + "headersEnd": 9197618, + "end": 9205238, + "octets": 7620, + "lines": 105 + }, + "end": 9205238, + "octets": 7620, + "lines": 105 + }, + { + "mboxMarkerBegin": 9205239, + "mboxMarkerLength": 31, + "begin": 9205271, + "headersEnd": 9206054, + "body": { + "mimeType": "message/rfc822", + "begin": 9205271, + "headersEnd": 9206054, + "message": { + "begin": 9206054, + "headersEnd": 9207434, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9206054, + "headersEnd": 9207434, + "end": 9208866, + "octets": 1432, + "lines": 20 + }, + "end": 9208866, + "octets": 1432, + "lines": 20 + }, + "end": 9208866, + "octets": 2812, + "lines": 43 + }, + "end": 9208866, + "octets": 2812, + "lines": 43 + }, + { + "mboxMarkerBegin": 9208867, + "mboxMarkerLength": 31, + "begin": 9208899, + "headersEnd": 9209609, + "body": { + "mimeType": "multipart/mixed", + "begin": 9208899, + "headersEnd": 9209609, + "children": [ + { + "mimeType": "text/plain", + "begin": 9209682, + "headersEnd": 9209758, + "end": 9209773, + "octets": 15, + "lines": 1 + }, + { + "mimeType": "message/rfc822", + "begin": 9209801, + "headersEnd": 9209955, + "message": { + "begin": 9209955, + "headersEnd": 9211335, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9209955, + "headersEnd": 9211335, + "end": 9212767, + "octets": 1432, + "lines": 20 + }, + "end": 9212767, + "octets": 1432, + "lines": 20 + }, + "end": 9212767, + "octets": 2812, + "lines": 43 + } + ], + "end": 9212797, + "octets": 3188, + "lines": 58 + }, + "end": 9212797, + "octets": 3188, + "lines": 58 + }, + { + "mboxMarkerBegin": 9212798, + "mboxMarkerLength": 31, + "begin": 9212830, + "headersEnd": 9213495, + "body": { + "mimeType": "multipart/signed", + "begin": 9212830, + "headersEnd": 9213495, + "children": [ + { + "mimeType": "text/plain", + "begin": 9213596, + "headersEnd": 9213672, + "end": 9213713, + "octets": 41, + "lines": 2 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9213755, + "headersEnd": 9213906, + "end": 9219462, + "octets": 5556, + "lines": 77 + } + ], + "end": 9219506, + "octets": 6011, + "lines": 91 + }, + "end": 9219506, + "octets": 6011, + "lines": 91 + }, + { + "mboxMarkerBegin": 9219507, + "mboxMarkerLength": 31, + "begin": 9219539, + "headersEnd": 9220601, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9219539, + "headersEnd": 9220601, + "end": 9230837, + "octets": 10236, + "lines": 141 + }, + "end": 9230837, + "octets": 10236, + "lines": 141 + }, + { + "mboxMarkerBegin": 9230838, + "mboxMarkerLength": 31, + "begin": 9230870, + "headersEnd": 9232246, + "body": { + "mimeType": "multipart/signed", + "begin": 9230870, + "headersEnd": 9232246, + "children": [ + { + "mimeType": "text/plain", + "begin": 9232347, + "headersEnd": 9232423, + "end": 9233034, + "octets": 611, + "lines": 17 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9233076, + "headersEnd": 9233227, + "end": 9235015, + "octets": 1788, + "lines": 25 + } + ], + "end": 9235059, + "octets": 2813, + "lines": 54 + }, + "end": 9235059, + "octets": 2813, + "lines": 54 + }, + { + "mboxMarkerBegin": 9235060, + "mboxMarkerLength": 31, + "begin": 9235092, + "headersEnd": 9235640, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9235092, + "headersEnd": 9235640, + "end": 9236163, + "octets": 523, + "lines": 8 + }, + "end": 9236163, + "octets": 523, + "lines": 8 + }, + { + "mboxMarkerBegin": 9236164, + "mboxMarkerLength": 7, + "begin": 9236172, + "headersEnd": 9237488, + "body": { + "mimeType": "MULTIPART/SIGNED", + "begin": 9236172, + "headersEnd": 9237488, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 9237745, + "headersEnd": 9237789, + "end": 9238377, + "octets": 588, + "lines": 15 + } + ], + "end": 9238420, + "octets": 932, + "lines": 24 + }, + "end": 9238420, + "octets": 932, + "lines": 24 + }, + { + "mboxMarkerBegin": 9238421, + "mboxMarkerLength": 7, + "begin": 9238429, + "headersEnd": 9239776, + "body": { + "mimeType": "MULTIPART/SIGNED", + "begin": 9238429, + "headersEnd": 9239776, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 9240033, + "headersEnd": 9240077, + "end": 9240178, + "octets": 101, + "lines": 6 + }, + { + "mimeType": "MULTIPART/MIXED", + "begin": 9240220, + "headersEnd": 9240383, + "children": [ + { + "mimeType": "TEXT/PLAIN", + "begin": 9240638, + "headersEnd": 9240745, + "end": 9240836, + "octets": 91, + "lines": 4 + }, + { + "mimeType": "MESSAGE/RFC822", + "begin": 9240876, + "headersEnd": 9240969, + "message": { + "begin": 9240969, + "headersEnd": 9242136, + "body": { + "mimeType": "text/plain", + "begin": 9240969, + "headersEnd": 9242136, + "end": 9242341, + "octets": 205, + "lines": 5 + }, + "end": 9242341, + "octets": 205, + "lines": 5 + }, + "end": 9242341, + "octets": 1372, + "lines": 34 + }, + { + "mimeType": "TEXT/X-VCARD", + "begin": 9242381, + "headersEnd": 9242547, + "end": 9243026, + "octets": 479, + "lines": 11 + } + ], + "end": 9243067, + "octets": 2684, + "lines": 70 + }, + { + "mimeType": "APPLICATION/X-PKCS7-SIGNATURE", + "begin": 9243109, + "headersEnd": 9243321, + "end": 9248544, + "octets": 5223, + "lines": 72 + } + ], + "end": 9248589, + "octets": 8813, + "lines": 169 + }, + "end": 9248589, + "octets": 8813, + "lines": 169 + }, + { + "mboxMarkerBegin": 9248590, + "mboxMarkerLength": 31, + "begin": 9248622, + "headersEnd": 9249837, + "body": { + "mimeType": "application/x-pkcs7-mime", + "begin": 9248622, + "headersEnd": 9249837, + "end": 9252719, + "octets": 2882, + "lines": 38 + }, + "end": 9252719, + "octets": 2882, + "lines": 38 + }, + { + "mboxMarkerBegin": 9252720, + "mboxMarkerLength": 31, + "begin": 9252752, + "headersEnd": 9253910, + "body": { + "mimeType": "Application/x-pkcs7-mime", + "begin": 9252752, + "headersEnd": 9253910, + "end": 9256032, + "octets": 2122, + "lines": 30 + }, + "end": 9256032, + "octets": 2122, + "lines": 30 + }, + { + "mboxMarkerBegin": 9256033, + "mboxMarkerLength": 31, + "begin": 9256065, + "headersEnd": 9257143, + "body": { + "mimeType": "multipart/signed", + "begin": 9256065, + "headersEnd": 9257143, + "children": [ + { + "mimeType": "text/plain", + "begin": 9257176, + "headersEnd": 9257240, + "end": 9257240, + "octets": 0, + "lines": 0 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9257273, + "headersEnd": 9257352, + "end": 9260065, + "octets": 2713, + "lines": 42 + } + ], + "end": 9260100, + "octets": 2957, + "lines": 53 + }, + "end": 9260100, + "octets": 2957, + "lines": 53 + }, + { + "mboxMarkerBegin": 9260101, + "mboxMarkerLength": 31, + "begin": 9260133, + "headersEnd": 9261170, + "body": { + "mimeType": "multipart/mixed", + "begin": 9260133, + "headersEnd": 9261170, + "children": [ + { + "mimeType": "text/plain", + "begin": 9261211, + "headersEnd": 9261289, + "end": 9261742, + "octets": 453, + "lines": 14 + }, + { + "mimeType": "text/html", + "begin": 9261783, + "headersEnd": 9261858, + "end": 9262669, + "octets": 811, + "lines": 27 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9262710, + "headersEnd": 9262807, + "end": 9264007, + "octets": 1200, + "lines": 16 + } + ], + "end": 9264050, + "octets": 2880, + "lines": 72 + }, + "end": 9264050, + "octets": 2880, + "lines": 72 + }, + { + "mboxMarkerBegin": 9264051, + "mboxMarkerLength": 31, + "begin": 9264083, + "headersEnd": 9265158, + "body": { + "mimeType": "multipart/signed", + "begin": 9264083, + "headersEnd": 9265158, + "children": [ + { + "mimeType": "text/plain", + "begin": 9265201, + "headersEnd": 9265271, + "end": 9265423, + "octets": 152, + "lines": 7 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9265466, + "headersEnd": 9265545, + "end": 9269641, + "octets": 4096, + "lines": 57 + } + ], + "end": 9269686, + "octets": 4528, + "lines": 75 + }, + "end": 9269686, + "octets": 4528, + "lines": 75 + }, + { + "mboxMarkerBegin": 9269687, + "mboxMarkerLength": 7, + "begin": 9269695, + "headersEnd": 9270246, + "body": { + "mimeType": "multipart/signed", + "begin": 9269695, + "headersEnd": 9270246, + "children": [ + { + "mimeType": "text/plain", + "begin": 9270290, + "headersEnd": 9270354, + "end": 9270509, + "octets": 155, + "lines": 4 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9270553, + "headersEnd": 9270704, + "end": 9274621, + "octets": 3917, + "lines": 54 + } + ], + "end": 9274666, + "octets": 4420, + "lines": 69 + }, + "end": 9274666, + "octets": 4420, + "lines": 69 + }, + { + "mboxMarkerBegin": 9274667, + "mboxMarkerLength": 31, + "begin": 9274699, + "headersEnd": 9275863, + "body": { + "mimeType": "multipart/mixed", + "begin": 9274699, + "headersEnd": 9275863, + "children": [ + { + "mimeType": "text/plain", + "begin": 9276040, + "headersEnd": 9276118, + "end": 9276190, + "octets": 72, + "lines": 5 + }, + { + "mimeType": "application/octet-stream", + "begin": 9276231, + "headersEnd": 9276326, + "end": 9279885, + "octets": 3559, + "lines": 47 + } + ], + "end": 9279928, + "octets": 4065, + "lines": 66 + }, + "end": 9279928, + "octets": 4065, + "lines": 66 + }, + { + "mboxMarkerBegin": 9279929, + "mboxMarkerLength": 31, + "begin": 9279961, + "headersEnd": 9281063, + "body": { + "mimeType": "multipart/signed", + "begin": 9279961, + "headersEnd": 9281063, + "children": [ + { + "mimeType": "text/plain", + "begin": 9281097, + "headersEnd": 9281175, + "end": 9281249, + "octets": 74, + "lines": 5 + }, + { + "mimeType": "application/x-pkcs7-signature", + "begin": 9281283, + "headersEnd": 9281362, + "end": 9285079, + "octets": 3717, + "lines": 58 + } + ], + "end": 9285114, + "octets": 4051, + "lines": 73 + }, + "end": 9285114, + "octets": 4051, + "lines": 73 + }, + { + "mboxMarkerBegin": 9285115, + "mboxMarkerLength": 31, + "begin": 9285147, + "headersEnd": 9286275, + "body": { + "mimeType": "multipart/report", + "begin": 9285147, + "headersEnd": 9286275, + "children": [ + { + "mimeType": "message/delivery-status", + "begin": 9286412, + "headersEnd": 9286451, + "end": 9286639, + "octets": 188, + "lines": 6 + }, + { + "mimeType": "message/rfc822", + "begin": 9286664, + "headersEnd": 9286694, + "message": { + "begin": 9286694, + "headersEnd": 9287500, + "body": { + "mimeType": "text/plain", + "begin": 9286694, + "headersEnd": 9287500, + "end": 9287511, + "octets": 11, + "lines": 1 + }, + "end": 9287511, + "octets": 11, + "lines": 1 + }, + "end": 9287511, + "octets": 817, + "lines": 16 + } + ], + "end": 9287538, + "octets": 1263, + "lines": 34 + }, + "end": 9287538, + "octets": 1263, + "lines": 34 + }, + { + "mboxMarkerBegin": 9287539, + "mboxMarkerLength": 45, + "begin": 9287585, + "headersEnd": 9287750, + "body": { + "mimeType": "text/plain", + "begin": 9287585, + "headersEnd": 9287750, + "end": 9322244, + "octets": 34494, + "lines": 592 + }, + "end": 9322244, + "octets": 34494, + "lines": 592 + }, + { + "mboxMarkerBegin": 9322245, + "mboxMarkerLength": 45, + "begin": 9322291, + "headersEnd": 9322449, + "body": { + "mimeType": "application/octet-stream", + "begin": 9322291, + "headersEnd": 9322449, + "end": 9356943, + "octets": 34494, + "lines": 592 + }, + "end": 9356943, + "octets": 34494, + "lines": 592 + }, + { + "mboxMarkerBegin": 9356944, + "mboxMarkerLength": 7, + "begin": 9356952, + "headersEnd": 9357549, + "body": { + "mimeType": "application/octet-stream", + "begin": 9356952, + "headersEnd": 9357549, + "end": 9358949, + "octets": 1400, + "lines": 39 + }, + "end": 9358949, + "octets": 1400, + "lines": 39 + }, + { + "mboxMarkerBegin": 9358950, + "mboxMarkerLength": 7, + "begin": 9358958, + "headersEnd": 9359858, + "body": { + "mimeType": "MULTIPART/mixed", + "begin": 9358958, + "headersEnd": 9359858, + "children": [ + { + "mimeType": "TEXT/plain", + "begin": 9359897, + "headersEnd": 9359923, + "end": 9360268, + "octets": 345, + "lines": 10 + }, + { + "mimeType": "AUDIO/basic", + "begin": 9360308, + "headersEnd": 9360401, + "end": 9601970, + "octets": 241569, + "lines": 3961 + } + ], + "end": 9602012, + "octets": 242154, + "lines": 3982 + }, + "end": 9602012, + "octets": 242154, + "lines": 3982 + }, + { + "mboxMarkerBegin": 9602013, + "mboxMarkerLength": 7, + "begin": 9602021, + "headersEnd": 9602615, + "body": { + "mimeType": "multipart/mixed", + "begin": 9602021, + "headersEnd": 9602615, + "children": [ + { + "mimeType": "image/pbm", + "begin": 9602676, + "headersEnd": 9602835, + "end": 9681124, + "octets": 78289, + "lines": 406 + } + ], + "end": 9681155, + "octets": 78540, + "lines": 416 + }, + "end": 9681155, + "octets": 78540, + "lines": 416 + }, + { + "mboxMarkerBegin": 9681156, + "mboxMarkerLength": 7, + "begin": 9681164, + "headersEnd": 9681316, + "body": { + "mimeType": "message/partial", + "begin": 9681164, + "headersEnd": 9681316, + "end": 9684876, + "octets": 3560, + "lines": 49 + }, + "end": 9684876, + "octets": 3560, + "lines": 49 + }, + { + "mboxMarkerBegin": 9684877, + "mboxMarkerLength": 7, + "begin": 9684885, + "headersEnd": 9685657, + "body": { + "mimeType": "multipart/alternative", + "begin": 9684885, + "headersEnd": 9685657, + "children": [ + { + "mimeType": "text/plain", + "begin": 9685852, + "headersEnd": 9685896, + "end": 9686310, + "octets": 414, + "lines": 7 + }, + { + "mimeType": "multipart/mixed", + "begin": 9686351, + "headersEnd": 9686436, + "children": [ + { + "mimeType": "text/richtext", + "begin": 9686478, + "headersEnd": 9686569, + "end": 9686640, + "octets": 71, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 9686683, + "headersEnd": 9686782, + "end": 9697479, + "octets": 10697, + "lines": 157 + }, + { + "mimeType": "text/richtext", + "begin": 9697522, + "headersEnd": 9697613, + "end": 9697677, + "octets": 64, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 9697720, + "headersEnd": 9697813, + "end": 9703716, + "octets": 5903, + "lines": 87 + }, + { + "mimeType": "text/richtext", + "begin": 9703759, + "headersEnd": 9703850, + "end": 9703883, + "octets": 33, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 9703926, + "headersEnd": 9704027, + "end": 9715673, + "octets": 11646, + "lines": 170 + }, + { + "mimeType": "text/richtext", + "begin": 9715716, + "headersEnd": 9715807, + "end": 9715838, + "octets": 31, + "lines": 2 + } + ], + "end": 9715883, + "octets": 29447, + "lines": 460 + } + ], + "end": 9715925, + "octets": 30268, + "lines": 480 + }, + "end": 9715925, + "octets": 30268, + "lines": 480 + }, + { + "mboxMarkerBegin": 9715926, + "mboxMarkerLength": 7, + "begin": 9715934, + "headersEnd": 9715990, + "body": { + "mimeType": "text/plain", + "begin": 9715934, + "headersEnd": 9715990, + "end": 9717198, + "octets": 1208, + "lines": 28 + }, + "end": 9717198, + "octets": 1208, + "lines": 28 + }, + { + "mboxMarkerBegin": 9717199, + "mboxMarkerLength": 31, + "begin": 9717231, + "headersEnd": 9717382, + "body": { + "mimeType": "text/plain", + "begin": 9717231, + "headersEnd": 9717382, + "end": 9720490, + "octets": 3108, + "lines": 68 + }, + "end": 9720490, + "octets": 3108, + "lines": 68 + }, + { + "mboxMarkerBegin": 9720491, + "mboxMarkerLength": 31, + "begin": 9720523, + "headersEnd": 9722388, + "body": { + "mimeType": "multipart/mixed", + "begin": 9720523, + "headersEnd": 9722388, + "children": [ + { + "mimeType": "text/plain", + "begin": 9722432, + "headersEnd": 9722510, + "end": 9723373, + "octets": 863, + "lines": 18 + }, + { + "mimeType": "application/vcard", + "begin": 9723418, + "headersEnd": 9723579, + "end": 9727220, + "octets": 3641, + "lines": 61 + } + ], + "end": 9727267, + "octets": 4879, + "lines": 92 + }, + "end": 9727267, + "octets": 4879, + "lines": 92 + }, + { + "mboxMarkerBegin": 9727268, + "mboxMarkerLength": 7, + "begin": 9727276, + "headersEnd": 9727830, + "body": { + "mimeType": "multipart/mixed", + "begin": 9727276, + "headersEnd": 9727830, + "children": [ + { + "mimeType": "text/plain", + "begin": 9727847, + "headersEnd": 9727874, + "end": 9728837, + "octets": 963, + "lines": 19 + }, + { + "mimeType": "image/pgm", + "begin": 9728854, + "headersEnd": 9728914, + "end": 9844640, + "octets": 115726, + "lines": 1586 + } + ], + "end": 9844660, + "octets": 116830, + "lines": 1617 + }, + "end": 9844660, + "octets": 116830, + "lines": 1617 + }, + { + "mboxMarkerBegin": 9844661, + "mboxMarkerLength": 7, + "begin": 9844669, + "headersEnd": 9845465, + "body": { + "mimeType": "multipart/alternative", + "begin": 9844669, + "headersEnd": 9845465, + "children": [ + { + "mimeType": "text/plain", + "begin": 9845660, + "headersEnd": 9845704, + "end": 9854667, + "octets": 8963, + "lines": 349 + }, + { + "mimeType": "multipart/mixed", + "begin": 9854708, + "headersEnd": 9854793, + "children": [ + { + "mimeType": "text/richtext", + "begin": 9854835, + "headersEnd": 9854926, + "end": 9857701, + "octets": 2775, + "lines": 69 + }, + { + "mimeType": "message/external-body", + "begin": 9857744, + "headersEnd": 9857940, + "message": { + "begin": 9857940, + "headersEnd": 9857967, + "body": { + "mimeType": "text/X-HTML", + "begin": 9857940, + "headersEnd": 9857967, + "end": 9857969, + "octets": 2, + "lines": 2 + }, + "end": 9857969, + "octets": 2, + "lines": 2 + }, + "end": 9857969, + "octets": 29, + "lines": 4 + }, + { + "mimeType": "text/richtext", + "begin": 9858012, + "headersEnd": 9858103, + "end": 9859077, + "octets": 974, + "lines": 22 + }, + { + "mimeType": "text/SGML", + "begin": 9859120, + "headersEnd": 9859236, + "end": 9859595, + "octets": 359, + "lines": 15 + }, + { + "mimeType": "text/richtext", + "begin": 9859638, + "headersEnd": 9859729, + "end": 9859739, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "message/external-body", + "begin": 9859782, + "headersEnd": 9859967, + "message": { + "begin": 9859967, + "headersEnd": 9859994, + "body": { + "mimeType": "text/X-HTML", + "begin": 9859967, + "headersEnd": 9859994, + "end": 9859995, + "octets": 1, + "lines": 1 + }, + "end": 9859995, + "octets": 1, + "lines": 1 + }, + "end": 9859995, + "octets": 28, + "lines": 3 + }, + { + "mimeType": "text/richtext", + "begin": 9860038, + "headersEnd": 9860129, + "end": 9860139, + "octets": 10, + "lines": 2 + }, + { + "mimeType": "image/gif", + "begin": 9860182, + "headersEnd": 9860288, + "end": 9863271, + "octets": 2983, + "lines": 43 + }, + { + "mimeType": "text/richtext", + "begin": 9863314, + "headersEnd": 9863405, + "end": 9869997, + "octets": 6592, + "lines": 260 + } + ], + "end": 9870042, + "octets": 15249, + "lines": 475 + } + ], + "end": 9870085, + "octets": 24620, + "lines": 837 + }, + "end": 9870085, + "octets": 24620, + "lines": 837 + }, + { + "mboxMarkerBegin": 9870086, + "mboxMarkerLength": 7, + "begin": 9870094, + "headersEnd": 9871206, + "body": { + "mimeType": "multipart/mixed", + "begin": 9870094, + "headersEnd": 9871206, + "children": [ + { + "mimeType": "text/plain", + "begin": 9871216, + "headersEnd": 9871217, + "end": 9871550, + "octets": 333, + "lines": 8 + }, + { + "mimeType": "image/gif", + "begin": 9871561, + "headersEnd": 9871620, + "end": 9901599, + "octets": 29979, + "lines": 411 + }, + { + "mimeType": "text/plain", + "begin": 9901610, + "headersEnd": 9901611, + "end": 9901783, + "octets": 172, + "lines": 9 + } + ], + "end": 9901796, + "octets": 30590, + "lines": 440 + }, + "end": 9901796, + "octets": 30590, + "lines": 440 + }, + { + "mboxMarkerBegin": 9901797, + "mboxMarkerLength": 7, + "begin": 9901805, + "headersEnd": 9903514, + "body": { + "mimeType": "text/plain", + "begin": 9901805, + "headersEnd": 9903514, + "end": 10086313, + "octets": 182799, + "lines": 2951 + }, + "end": 10086313, + "octets": 182799, + "lines": 2951 + }, + { + "mboxMarkerBegin": 10086314, + "mboxMarkerLength": 7, + "begin": 10086322, + "headersEnd": 10087029, + "body": { + "mimeType": "multipart/mixed", + "begin": 10086322, + "headersEnd": 10087029, + "children": [ + { + "mimeType": "text/plain", + "begin": 10087056, + "headersEnd": 10087057, + "end": 10087078, + "octets": 21, + "lines": 1 + }, + { + "mimeType": "image/pgm", + "begin": 10087106, + "headersEnd": 10087258, + "end": 10170999, + "octets": 83741, + "lines": 434 + }, + { + "mimeType": "text/plain", + "begin": 10171027, + "headersEnd": 10171028, + "end": 10171287, + "octets": 259, + "lines": 9 + } + ], + "end": 10171317, + "octets": 84288, + "lines": 455 + }, + "end": 10171317, + "octets": 84288, + "lines": 455 + }, + { + "mboxMarkerBegin": 10171318, + "mboxMarkerLength": 7, + "begin": 10171326, + "headersEnd": 10171993, + "body": { + "mimeType": "multipart/mixed", + "begin": 10171326, + "headersEnd": 10171993, + "children": [ + { + "mimeType": "text/plain", + "begin": 10172020, + "headersEnd": 10172021, + "end": 10172087, + "octets": 66, + "lines": 1 + }, + { + "mimeType": "audio/basic", + "begin": 10172115, + "headersEnd": 10172276, + "end": 10204442, + "octets": 32166, + "lines": 167 + }, + { + "mimeType": "text/plain", + "begin": 10204470, + "headersEnd": 10204471, + "end": 10204488, + "octets": 17, + "lines": 2 + }, + { + "mimeType": "image/pbm", + "begin": 10204516, + "headersEnd": 10204675, + "end": 10205760, + "octets": 1085, + "lines": 6 + }, + { + "mimeType": "text/plain", + "begin": 10205788, + "headersEnd": 10205789, + "end": 10205819, + "octets": 30, + "lines": 2 + }, + { + "mimeType": "application/x-annotate-2", + "begin": 10205847, + "headersEnd": 10205915, + "end": 10391952, + "octets": 186037, + "lines": 1990 + }, + { + "mimeType": "text/plain", + "begin": 10391980, + "headersEnd": 10391981, + "end": 10391989, + "octets": 8, + "lines": 1 + } + ], + "end": 10392019, + "octets": 220026, + "lines": 2196 + }, + "end": 10392019, + "octets": 220026, + "lines": 2196 + }, + { + "mboxMarkerBegin": 10392020, + "mboxMarkerLength": 7, + "begin": 10392028, + "headersEnd": 10392292, + "body": { + "mimeType": "application/octet-stream", + "begin": 10392028, + "headersEnd": 10392292, + "end": 10466950, + "octets": 74658, + "lines": 1023 + }, + "end": 10466950, + "octets": 74658, + "lines": 1023 + }, + { + "mboxMarkerBegin": 10466951, + "mboxMarkerLength": 7, + "begin": 10466959, + "headersEnd": 10468233, + "body": { + "mimeType": "multipart/alternative", + "begin": 10466959, + "headersEnd": 10468233, + "children": [ + { + "mimeType": "text/plain", + "begin": 10468817, + "headersEnd": 10468818, + "end": 10470665, + "octets": 1847, + "lines": 34 + }, + { + "mimeType": "multipart/mixed", + "begin": 10470724, + "headersEnd": 10470827, + "children": [ + { + "mimeType": "text/richtext", + "begin": 10470887, + "headersEnd": 10470960, + "end": 10472959, + "octets": 1999, + "lines": 29 + }, + { + "mimeType": "image/xwd", + "begin": 10473020, + "headersEnd": 10473079, + "end": 10481008, + "octets": 7929, + "lines": 109 + }, + { + "mimeType": "text/plain", + "begin": 10481069, + "headersEnd": 10481139, + "end": 10481142, + "octets": 3, + "lines": 2 + }, + { + "mimeType": "audio/basic", + "begin": 10481203, + "headersEnd": 10481296, + "end": 10523174, + "octets": 41878, + "lines": 574 + } + ], + "end": 10523237, + "octets": 52410, + "lines": 736 + } + ], + "end": 10523298, + "octets": 55065, + "lines": 787 + }, + "end": 10523298, + "octets": 55065, + "lines": 787 + }, + { + "mboxMarkerBegin": 10523299, + "mboxMarkerLength": 7, + "begin": 10523307, + "headersEnd": 10523459, + "body": { + "mimeType": "message/partial", + "begin": 10523307, + "headersEnd": 10523459, + "end": 10528262, + "octets": 4803, + "lines": 68 + }, + "end": 10528262, + "octets": 4803, + "lines": 68 + }, + { + "mboxMarkerBegin": 10528263, + "mboxMarkerLength": 7, + "begin": 10528271, + "headersEnd": 10529016, + "body": { + "mimeType": "multipart/alternative", + "begin": 10528271, + "headersEnd": 10529016, + "children": [ + { + "mimeType": "text/plain", + "begin": 10529395, + "headersEnd": 10529396, + "end": 10529764, + "octets": 368, + "lines": 8 + }, + { + "mimeType": "multipart/mixed", + "begin": 10529805, + "headersEnd": 10529890, + "children": [ + { + "mimeType": "text/plain", + "begin": 10529932, + "headersEnd": 10530002, + "end": 10530091, + "octets": 89, + "lines": 4 + }, + { + "mimeType": "image/gif", + "begin": 10530134, + "headersEnd": 10530248, + "end": 10535911, + "octets": 5663, + "lines": 83 + }, + { + "mimeType": "text/plain", + "begin": 10535954, + "headersEnd": 10536024, + "end": 10536227, + "octets": 203, + "lines": 6 + } + ], + "end": 10536272, + "octets": 6382, + "lines": 110 + } + ], + "end": 10536315, + "octets": 7299, + "lines": 133 + }, + "end": 10536315, + "octets": 7299, + "lines": 133 + } +] \ No newline at end of file From 0edbf8d71ec0f7b1bd67689a8ecc074f58c411ca Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 8 Jul 2020 10:57:04 -0400 Subject: [PATCH 659/741] Removed old dos and unix offset files --- .../mbox/content-length.dos-offsets.txt | 975 --- .../mbox/content-length.unix-offsets.txt | 975 --- UnitTests/TestData/mbox/jwz.dos-offsets.txt | 7039 ----------------- UnitTests/TestData/mbox/jwz.unix-offsets.txt | 7039 ----------------- 4 files changed, 16028 deletions(-) delete mode 100644 UnitTests/TestData/mbox/content-length.dos-offsets.txt delete mode 100644 UnitTests/TestData/mbox/content-length.unix-offsets.txt delete mode 100644 UnitTests/TestData/mbox/jwz.dos-offsets.txt delete mode 100644 UnitTests/TestData/mbox/jwz.unix-offsets.txt diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.txt b/UnitTests/TestData/mbox/content-length.dos-offsets.txt deleted file mode 100644 index 1a553eef86..0000000000 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.txt +++ /dev/null @@ -1,975 +0,0 @@ -MboxMarkerBegin 0 -MboxMarkerEnd 9 -MimeMessageBegin 9 -MimeEntityBegin 9 -MimeEntityHeadersEnd 675 -MimeMessageHeadersEnd 675 -MultipartPreambleBegin 675 -MultipartPreambleEnd 675 -MultipartBoundaryBegin 675 -MultipartBoundaryEnd 725 -MimeEntityBegin 725 -MimeEntityHeadersEnd 753 -Octets 78 -Lines 5 -MimeEntityEnd 831 -MultipartBoundaryBegin 831 -MultipartBoundaryEnd 883 -MimeEntityBegin 883 -MimeEntityHeadersEnd 948 -MimeMessageBegin 948 -MimeEntityBegin 948 -MimeEntityHeadersEnd 1747 -MimeMessageHeadersEnd 1747 -Octets 140 -Lines 4 -MimeEntityEnd 1887 -MimeMessageEnd 1887 -Octets 939 -Lines 21 -MimeEntityEnd 1887 -MultipartEndBoundaryBegin 1887 -MultipartEndBoundaryEnd 1939 -MultipartEpilogueBegin 1939 -MultipartEpilogueEnd 1939 -Octets 1264 -Lines 34 -MimeEntityEnd 1939 -MimeMessageEnd 1939 -MboxMarkerBegin 1941 -MboxMarkerEnd 1950 -MimeMessageBegin 1950 -MimeEntityBegin 1950 -MimeEntityHeadersEnd 2430 -MimeMessageHeadersEnd 2430 -MultipartPreambleBegin 2430 -MultipartPreambleEnd 2478 -MultipartBoundaryBegin 2478 -MultipartBoundaryEnd 2506 -MimeEntityBegin 2506 -MimeEntityHeadersEnd 2655 -MimeMessageBegin 2655 -MimeEntityBegin 2655 -MimeEntityHeadersEnd 3095 -MimeMessageHeadersEnd 3095 -Octets 39 -Lines 2 -MimeEntityEnd 3134 -MimeMessageEnd 3134 -Octets 479 -Lines 13 -MimeEntityEnd 3134 -MultipartBoundaryBegin 3134 -MultipartBoundaryEnd 3164 -MimeEntityBegin 3164 -MimeEntityHeadersEnd 3291 -Octets 464 -Lines 7 -MimeEntityEnd 3755 -MultipartBoundaryBegin 3755 -MultipartBoundaryEnd 3785 -MimeEntityBegin 3785 -MimeEntityHeadersEnd 3912 -Octets 492 -Lines 7 -MimeEntityEnd 4404 -MultipartBoundaryBegin 4404 -MultipartBoundaryEnd 4434 -MimeEntityBegin 4434 -MimeEntityHeadersEnd 4565 -Octets 534 -Lines 8 -MimeEntityEnd 5099 -MultipartBoundaryBegin 5099 -MultipartBoundaryEnd 5129 -MimeEntityBegin 5129 -MimeEntityHeadersEnd 5258 -Octets 504 -Lines 7 -MimeEntityEnd 5762 -MultipartBoundaryBegin 5762 -MultipartBoundaryEnd 5792 -MimeEntityBegin 5792 -MimeEntityHeadersEnd 5941 -MimeMessageBegin 5941 -MimeEntityBegin 5941 -MimeEntityHeadersEnd 6381 -MimeMessageHeadersEnd 6381 -Octets 38 -Lines 1 -MimeEntityEnd 6419 -MimeMessageEnd 6419 -Octets 478 -Lines 12 -MimeEntityEnd 6419 -MultipartBoundaryBegin 6419 -MultipartBoundaryEnd 6449 -MimeEntityBegin 6449 -MimeEntityHeadersEnd 6625 -MimeMessageBegin 6625 -MimeEntityBegin 6625 -MimeEntityHeadersEnd 7210 -MimeMessageHeadersEnd 7210 -MimeMessageBegin 7210 -MimeEntityBegin 7210 -MimeEntityHeadersEnd 7735 -MimeMessageHeadersEnd 7735 -MimeMessageBegin 7735 -MimeEntityBegin 7735 -MimeEntityHeadersEnd 8156 -MimeMessageHeadersEnd 8156 -Octets 6 -Lines 1 -MimeEntityEnd 8162 -MimeMessageEnd 8162 -Octets 427 -Lines 12 -MimeEntityEnd 8162 -MimeMessageEnd 8162 -Octets 952 -Lines 26 -MimeEntityEnd 8162 -MimeMessageEnd 8162 -Octets 1537 -Lines 41 -MimeEntityEnd 8162 -MultipartBoundaryBegin 8162 -MultipartBoundaryEnd 8192 -MimeEntityBegin 8192 -MimeEntityHeadersEnd 8248 -Octets 53 -Lines 1 -MimeEntityEnd 8301 -MultipartEndBoundaryBegin 8301 -MultipartEndBoundaryEnd 8331 -MultipartEpilogueBegin 8331 -MultipartEpilogueEnd 8331 -Octets 5901 -Lines 145 -MimeEntityEnd 8331 -MimeMessageEnd 8331 -MboxMarkerBegin 8333 -MboxMarkerEnd 8342 -MimeMessageBegin 8342 -MimeEntityBegin 8342 -MimeEntityHeadersEnd 8825 -MimeMessageHeadersEnd 8825 -MultipartPreambleBegin 8825 -MultipartPreambleEnd 8873 -MultipartBoundaryBegin 8873 -MultipartBoundaryEnd 8901 -MimeEntityBegin 8901 -MimeEntityHeadersEnd 9054 -MimeMessageBegin 9054 -MimeEntityBegin 9054 -MimeEntityHeadersEnd 9493 -MimeMessageHeadersEnd 9493 -Octets 39 -Lines 2 -MimeEntityEnd 9532 -MimeMessageEnd 9532 -Octets 478 -Lines 13 -MimeEntityEnd 9532 -MultipartBoundaryBegin 9532 -MultipartBoundaryEnd 9562 -MimeEntityBegin 9562 -MimeEntityHeadersEnd 9693 -Octets 464 -Lines 7 -MimeEntityEnd 10157 -MultipartBoundaryBegin 10157 -MultipartBoundaryEnd 10187 -MimeEntityBegin 10187 -MimeEntityHeadersEnd 10318 -Octets 492 -Lines 7 -MimeEntityEnd 10810 -MultipartBoundaryBegin 10810 -MultipartBoundaryEnd 10840 -MimeEntityBegin 10840 -MimeEntityHeadersEnd 10975 -Octets 534 -Lines 8 -MimeEntityEnd 11509 -MultipartBoundaryBegin 11509 -MultipartBoundaryEnd 11539 -MimeEntityBegin 11539 -MimeEntityHeadersEnd 11672 -Octets 504 -Lines 7 -MimeEntityEnd 12176 -MultipartBoundaryBegin 12176 -MultipartBoundaryEnd 12206 -MimeEntityBegin 12206 -MimeEntityHeadersEnd 12359 -MimeMessageBegin 12359 -MimeEntityBegin 12359 -MimeEntityHeadersEnd 12798 -MimeMessageHeadersEnd 12798 -Octets 38 -Lines 1 -MimeEntityEnd 12836 -MimeMessageEnd 12836 -Octets 477 -Lines 12 -MimeEntityEnd 12836 -MultipartBoundaryBegin 12836 -MultipartBoundaryEnd 12866 -MimeEntityBegin 12866 -MimeEntityHeadersEnd 13046 -MimeMessageBegin 13046 -MimeEntityBegin 13046 -MimeEntityHeadersEnd 13634 -MimeMessageHeadersEnd 13634 -MimeMessageBegin 13634 -MimeEntityBegin 13634 -MimeEntityHeadersEnd 14162 -MimeMessageHeadersEnd 14162 -MimeMessageBegin 14162 -MimeEntityBegin 14162 -MimeEntityHeadersEnd 14582 -MimeMessageHeadersEnd 14582 -Octets 6 -Lines 1 -MimeEntityEnd 14588 -MimeMessageEnd 14588 -Octets 426 -Lines 12 -MimeEntityEnd 14588 -MimeMessageEnd 14588 -Octets 954 -Lines 26 -MimeEntityEnd 14588 -MimeMessageEnd 14588 -Octets 1542 -Lines 41 -MimeEntityEnd 14588 -MultipartBoundaryBegin 14588 -MultipartBoundaryEnd 14618 -MimeEntityBegin 14618 -MimeEntityHeadersEnd 14678 -Octets 53 -Lines 1 -MimeEntityEnd 14731 -MultipartEndBoundaryBegin 14731 -MultipartEndBoundaryEnd 14761 -MultipartEpilogueBegin 14761 -MultipartEpilogueEnd 14761 -Octets 5936 -Lines 145 -MimeEntityEnd 14761 -MimeMessageEnd 14761 -MboxMarkerBegin 14763 -MboxMarkerEnd 14796 -MimeMessageBegin 14796 -MimeEntityBegin 14796 -MimeEntityHeadersEnd 16325 -MimeMessageHeadersEnd 16325 -MultipartPreambleBegin 16325 -MultipartPreambleEnd 16327 -MultipartBoundaryBegin 16327 -MultipartBoundaryEnd 16372 -MimeEntityBegin 16372 -MimeEntityHeadersEnd 16466 -Octets 5310 -Lines 111 -MimeEntityEnd 21776 -MultipartBoundaryBegin 21776 -MultipartBoundaryEnd 21823 -MimeEntityBegin 21823 -MimeEntityHeadersEnd 22028 -Octets 942 -Lines 13 -MimeEntityEnd 22970 -MultipartEndBoundaryBegin 22970 -MultipartEndBoundaryEnd 23017 -MultipartEpilogueBegin 23017 -MultipartEpilogueEnd 23019 -Octets 6694 -Lines 139 -MimeEntityEnd 23019 -MimeMessageEnd 23019 -MboxMarkerBegin 23021 -MboxMarkerEnd 23054 -MimeMessageBegin 23054 -MimeEntityBegin 23054 -MimeEntityHeadersEnd 24310 -MimeMessageHeadersEnd 24310 -MultipartPreambleBegin 24310 -MultipartPreambleEnd 24358 -MultipartBoundaryBegin 24358 -MultipartBoundaryEnd 24397 -MimeEntityBegin 24397 -MimeEntityHeadersEnd 24476 -Octets 30 -Lines 3 -MimeEntityEnd 24506 -MultipartBoundaryBegin 24506 -MultipartBoundaryEnd 24547 -MimeEntityBegin 24547 -MimeEntityHeadersEnd 24641 -MimeMessageBegin 24641 -MimeEntityBegin 24641 -MimeEntityHeadersEnd 25478 -MimeMessageHeadersEnd 25478 -MultipartPreambleBegin 25478 -MultipartPreambleEnd 25480 -MultipartBoundaryBegin 25480 -MultipartBoundaryEnd 25520 -MimeEntityBegin 25520 -MimeEntityHeadersEnd 25599 -Octets 643 -Lines 16 -MimeEntityEnd 26242 -MultipartBoundaryBegin 26242 -MultipartBoundaryEnd 26284 -MimeEntityBegin 26284 -MimeEntityHeadersEnd 26368 -MultipartPreambleBegin 26368 -MultipartPreambleEnd 26370 -MultipartBoundaryBegin 26370 -MultipartBoundaryEnd 26410 -MimeEntityBegin 26410 -MimeEntityHeadersEnd 26488 -Octets 868 -Lines 18 -MimeEntityEnd 27356 -MultipartBoundaryBegin 27356 -MultipartBoundaryEnd 27398 -MimeEntityBegin 27398 -MimeEntityHeadersEnd 27587 -Octets 754158 -Lines 10192 -MimeEntityEnd 781745 -MultipartEndBoundaryBegin 781745 -MultipartEndBoundaryEnd 781787 -MultipartEpilogueBegin 781787 -MultipartEpilogueEnd 781789 -Octets 755421 -Lines 10223 -MimeEntityEnd 781789 -MultipartEndBoundaryBegin 781789 -MultipartEndBoundaryEnd 781831 -MultipartEpilogueBegin 781831 -MultipartEpilogueEnd 781837 -Octets 756359 -Lines 10252 -MimeEntityEnd 781837 -MimeMessageEnd 781837 -Octets 757196 -Lines 10268 -MimeEntityEnd 781837 -MultipartEndBoundaryBegin 781837 -MultipartEndBoundaryEnd 781878 -MultipartEpilogueBegin 781878 -MultipartEpilogueEnd 781880 -Octets 757570 -Lines 10285 -MimeEntityEnd 781880 -MimeMessageEnd 781880 -MboxMarkerBegin 781882 -MboxMarkerEnd 781915 -MimeMessageBegin 781915 -MimeEntityBegin 781915 -MimeEntityHeadersEnd 783201 -MimeMessageHeadersEnd 783201 -MultipartPreambleBegin 783201 -MultipartPreambleEnd 783203 -MultipartBoundaryBegin 783203 -MultipartBoundaryEnd 783248 -MimeEntityBegin 783248 -MimeEntityHeadersEnd 783342 -Octets 2432 -Lines 50 -MimeEntityEnd 785774 -MultipartBoundaryBegin 785774 -MultipartBoundaryEnd 785821 -MimeEntityBegin 785821 -MimeEntityHeadersEnd 785985 -Octets 6102 -Lines 79 -MimeEntityEnd 792087 -MultipartBoundaryBegin 792087 -MultipartBoundaryEnd 792134 -MimeEntityBegin 792134 -MimeEntityHeadersEnd 792297 -Octets 12230 -Lines 157 -MimeEntityEnd 804527 -MultipartBoundaryBegin 804527 -MultipartBoundaryEnd 804574 -MimeEntityBegin 804574 -MimeEntityHeadersEnd 804739 -Octets 21996 -Lines 282 -MimeEntityEnd 826735 -MultipartBoundaryBegin 826735 -MultipartBoundaryEnd 826782 -MimeEntityBegin 826782 -MimeEntityHeadersEnd 826991 -Octets 3438 -Lines 45 -MimeEntityEnd 830429 -MultipartEndBoundaryBegin 830429 -MultipartEndBoundaryEnd 830476 -MultipartEpilogueBegin 830476 -MultipartEpilogueEnd 830478 -Octets 47277 -Lines 649 -MimeEntityEnd 830478 -MimeMessageEnd 830478 -MboxMarkerBegin 830480 -MboxMarkerEnd 830489 -MimeMessageBegin 830489 -MimeEntityBegin 830489 -MimeEntityHeadersEnd 831421 -MimeMessageHeadersEnd 831421 -MultipartPreambleBegin 831421 -MultipartPreambleEnd 831423 -MultipartBoundaryBegin 831423 -MultipartBoundaryEnd 831432 -MimeEntityBegin 831432 -MimeEntityHeadersEnd 831463 -Octets 2626 -Lines 96 -MimeEntityEnd 834089 -MultipartEndBoundaryBegin 834089 -MultipartEndBoundaryEnd 834100 -MultipartEpilogueBegin 834100 -MultipartEpilogueEnd 834102 -Octets 2681 -Lines 102 -MimeEntityEnd 834102 -MimeMessageEnd 834102 -MboxMarkerBegin 834104 -MboxMarkerEnd 834137 -MimeMessageBegin 834137 -MimeEntityBegin 834137 -MimeEntityHeadersEnd 835308 -MimeMessageHeadersEnd 835308 -MultipartPreambleBegin 835308 -MultipartPreambleEnd 835308 -MultipartBoundaryBegin 835308 -MultipartBoundaryEnd 835326 -MimeEntityBegin 835326 -MimeEntityHeadersEnd 835328 -Octets 921 -Lines 20 -MimeEntityEnd 836249 -MultipartBoundaryBegin 836249 -MultipartBoundaryEnd 836269 -MimeEntityBegin 836269 -MimeEntityHeadersEnd 836351 -Octets 760 -Lines 12 -MimeEntityEnd 837111 -MultipartEndBoundaryBegin 837111 -MultipartEndBoundaryEnd 837131 -MultipartEpilogueBegin 837131 -MultipartEpilogueEnd 837133 -Octets 1825 -Lines 41 -MimeEntityEnd 837133 -MimeMessageEnd 837133 -MboxMarkerBegin 837135 -MboxMarkerEnd 837168 -MimeMessageBegin 837168 -MimeEntityBegin 837168 -MimeEntityHeadersEnd 838329 -MimeMessageHeadersEnd 838329 -MultipartPreambleBegin 838329 -MultipartPreambleEnd 838505 -MultipartBoundaryBegin 838505 -MultipartBoundaryEnd 838513 -MimeEntityBegin 838513 -MimeEntityHeadersEnd 838594 -Octets 754 -Lines 14 -MimeEntityEnd 839348 -MultipartBoundaryBegin 839348 -MultipartBoundaryEnd 839358 -MimeEntityBegin 839358 -MimeEntityHeadersEnd 839541 -Octets 2246 -Lines 31 -MimeEntityEnd 841787 -MultipartEndBoundaryBegin 841787 -MultipartEndBoundaryEnd 841797 -MultipartEpilogueBegin 841797 -MultipartEpilogueEnd 841797 -Octets 3468 -Lines 60 -MimeEntityEnd 841797 -MimeMessageEnd 841797 -MboxMarkerBegin 841799 -MboxMarkerEnd 841832 -MimeMessageBegin 841832 -MimeEntityBegin 841832 -MimeEntityHeadersEnd 842992 -MimeMessageHeadersEnd 842992 -MultipartPreambleBegin 842992 -MultipartPreambleEnd 843168 -MultipartBoundaryBegin 843168 -MultipartBoundaryEnd 843190 -MimeEntityBegin 843190 -MimeEntityHeadersEnd 843271 -Octets 2858 -Lines 47 -MimeEntityEnd 846129 -MultipartBoundaryBegin 846129 -MultipartBoundaryEnd 846153 -MimeEntityBegin 846153 -MimeEntityHeadersEnd 846336 -Octets 2582 -Lines 35 -MimeEntityEnd 848918 -MultipartEndBoundaryBegin 848918 -MultipartEndBoundaryEnd 848942 -MultipartEpilogueBegin 848942 -MultipartEpilogueEnd 848942 -Octets 5950 -Lines 97 -MimeEntityEnd 848942 -MimeMessageEnd 848942 -MboxMarkerBegin 848944 -MboxMarkerEnd 848977 -MimeMessageBegin 848977 -MimeEntityBegin 848977 -MimeEntityHeadersEnd 849895 -MimeMessageHeadersEnd 849895 -MultipartPreambleBegin 849895 -MultipartPreambleEnd 849943 -MultipartBoundaryBegin 849943 -MultipartBoundaryEnd 849971 -MimeEntityBegin 849971 -MimeEntityHeadersEnd 850109 -Octets 10868 -Lines 147 -MimeEntityEnd 860977 -MultipartBoundaryBegin 860977 -MultipartBoundaryEnd 861007 -MimeEntityBegin 861007 -MimeEntityHeadersEnd 861162 -Octets 4674 -Lines 64 -MimeEntityEnd 865836 -MultipartEndBoundaryBegin 865836 -MultipartEndBoundaryEnd 865866 -MultipartEpilogueBegin 865866 -MultipartEpilogueEnd 865868 -Octets 15973 -Lines 224 -MimeEntityEnd 865868 -MimeMessageEnd 865868 -MboxMarkerBegin 865870 -MboxMarkerEnd 865903 -MimeMessageBegin 865903 -MimeEntityBegin 865903 -MimeEntityHeadersEnd 867318 -MimeMessageHeadersEnd 867318 -Octets 1450 -Lines 20 -MimeEntityEnd 868768 -MimeMessageEnd 868768 -MboxMarkerBegin 868770 -MboxMarkerEnd 868803 -MimeMessageBegin 868803 -MimeEntityBegin 868803 -MimeEntityHeadersEnd 870180 -MimeMessageHeadersEnd 870180 -MultipartPreambleBegin 870180 -MultipartPreambleEnd 870182 -MultipartBoundaryBegin 870182 -MultipartBoundaryEnd 870227 -MimeEntityBegin 870227 -MimeEntityHeadersEnd 870294 -Octets 110 -Lines 4 -MimeEntityEnd 870404 -MultipartBoundaryBegin 870404 -MultipartBoundaryEnd 870451 -MimeEntityBegin 870451 -MimeEntityHeadersEnd 870606 -Octets 3986 -Lines 54 -MimeEntityEnd 874592 -MultipartEndBoundaryBegin 874592 -MultipartEndBoundaryEnd 874639 -MultipartEpilogueBegin 874639 -MultipartEpilogueEnd 874641 -Octets 4461 -Lines 69 -MimeEntityEnd 874641 -MimeMessageEnd 874641 -MboxMarkerBegin 874643 -MboxMarkerEnd 874676 -MimeMessageBegin 874676 -MimeEntityBegin 874676 -MimeEntityHeadersEnd 875907 -MimeMessageHeadersEnd 875907 -Octets 3550 -Lines 55 -MimeEntityEnd 879457 -MimeMessageEnd 879457 -MboxMarkerBegin 879459 -MboxMarkerEnd 879492 -MimeMessageBegin 879492 -MimeEntityBegin 879492 -MimeEntityHeadersEnd 880590 -MimeMessageHeadersEnd 880590 -Octets 670 -Lines 10 -MimeEntityEnd 881260 -MimeMessageEnd 881260 -MboxMarkerBegin 881262 -MboxMarkerEnd 881295 -MimeMessageBegin 881295 -MimeEntityBegin 881295 -MimeEntityHeadersEnd 882097 -MimeMessageHeadersEnd 882097 -MimeMessageBegin 882097 -MimeEntityBegin 882097 -MimeEntityHeadersEnd 883500 -MimeMessageHeadersEnd 883500 -Octets 1452 -Lines 20 -MimeEntityEnd 884952 -MimeMessageEnd 884952 -Octets 2855 -Lines 43 -MimeEntityEnd 884952 -MimeMessageEnd 884952 -MboxMarkerBegin 884954 -MboxMarkerEnd 884987 -MimeMessageBegin 884987 -MimeEntityBegin 884987 -MimeEntityHeadersEnd 885714 -MimeMessageHeadersEnd 885714 -MultipartPreambleBegin 885714 -MultipartPreambleEnd 885762 -MultipartBoundaryBegin 885762 -MultipartBoundaryEnd 885790 -MimeEntityBegin 885790 -MimeEntityHeadersEnd 885869 -Octets 16 -Lines 1 -MimeEntityEnd 885885 -MultipartBoundaryBegin 885885 -MultipartBoundaryEnd 885915 -MimeEntityBegin 885915 -MimeEntityHeadersEnd 886073 -MimeMessageBegin 886073 -MimeEntityBegin 886073 -MimeEntityHeadersEnd 887476 -MimeMessageHeadersEnd 887476 -Octets 1452 -Lines 20 -MimeEntityEnd 888928 -MimeMessageEnd 888928 -Octets 2855 -Lines 43 -MimeEntityEnd 888928 -MultipartEndBoundaryBegin 888928 -MultipartEndBoundaryEnd 888958 -MultipartEpilogueBegin 888958 -MultipartEpilogueEnd 888960 -Octets 3246 -Lines 58 -MimeEntityEnd 888960 -MimeMessageEnd 888960 -MboxMarkerBegin 888962 -MboxMarkerEnd 888995 -MimeMessageBegin 888995 -MimeEntityBegin 888995 -MimeEntityHeadersEnd 889676 -MimeMessageHeadersEnd 889676 -MultipartPreambleBegin 889676 -MultipartPreambleEnd 889738 -MultipartBoundaryBegin 889738 -MultipartBoundaryEnd 889780 -MimeEntityBegin 889780 -MimeEntityHeadersEnd 889859 -Octets 42 -Lines 2 -MimeEntityEnd 889901 -MultipartBoundaryBegin 889901 -MultipartBoundaryEnd 889945 -MimeEntityBegin 889945 -MimeEntityHeadersEnd 890100 -Octets 5632 -Lines 77 -MimeEntityEnd 895732 -MultipartEndBoundaryBegin 895732 -MultipartEndBoundaryEnd 895776 -MultipartEpilogueBegin 895776 -MultipartEpilogueEnd 895778 -Octets 6102 -Lines 91 -MimeEntityEnd 895778 -MimeMessageEnd 895778 -MboxMarkerBegin 895780 -MboxMarkerEnd 895813 -MimeMessageBegin 895813 -MimeEntityBegin 895813 -MimeEntityHeadersEnd 896896 -MimeMessageHeadersEnd 896896 -Octets 10376 -Lines 141 -MimeEntityEnd 907272 -MimeMessageEnd 907272 -MboxMarkerBegin 907274 -MboxMarkerEnd 907307 -MimeMessageBegin 907307 -MimeEntityBegin 907307 -MimeEntityHeadersEnd 908707 -MimeMessageHeadersEnd 908707 -MultipartPreambleBegin 908707 -MultipartPreambleEnd 908769 -MultipartBoundaryBegin 908769 -MultipartBoundaryEnd 908811 -MimeEntityBegin 908811 -MimeEntityHeadersEnd 908890 -Octets 627 -Lines 17 -MimeEntityEnd 909517 -MultipartBoundaryBegin 909517 -MultipartBoundaryEnd 909561 -MimeEntityBegin 909561 -MimeEntityHeadersEnd 909716 -Octets 1812 -Lines 25 -MimeEntityEnd 911528 -MultipartEndBoundaryBegin 911528 -MultipartEndBoundaryEnd 911572 -MultipartEpilogueBegin 911572 -MultipartEpilogueEnd 911574 -Octets 2867 -Lines 54 -MimeEntityEnd 911574 -MimeMessageEnd 911574 -MboxMarkerBegin 911576 -MboxMarkerEnd 911609 -MimeMessageBegin 911609 -MimeEntityBegin 911609 -MimeEntityHeadersEnd 912172 -MimeMessageHeadersEnd 912172 -Octets 530 -Lines 8 -MimeEntityEnd 912702 -MimeMessageEnd 912702 -MboxMarkerBegin 912704 -MboxMarkerEnd 912737 -MimeMessageBegin 912737 -MimeEntityBegin 912737 -MimeEntityHeadersEnd 913972 -MimeMessageHeadersEnd 913972 -Octets 2920 -Lines 38 -MimeEntityEnd 916892 -MimeMessageEnd 916892 -MboxMarkerBegin 916894 -MboxMarkerEnd 916927 -MimeMessageBegin 916927 -MimeEntityBegin 916927 -MimeEntityHeadersEnd 918106 -MimeMessageHeadersEnd 918106 -Octets 2152 -Lines 30 -MimeEntityEnd 920258 -MimeMessageEnd 920258 -MboxMarkerBegin 920260 -MboxMarkerEnd 920293 -MimeMessageBegin 920293 -MimeEntityBegin 920293 -MimeEntityHeadersEnd 921392 -MimeMessageHeadersEnd 921392 -MultipartPreambleBegin 921392 -MultipartPreambleEnd 921394 -MultipartBoundaryBegin 921394 -MultipartBoundaryEnd 921427 -MimeEntityBegin 921427 -MimeEntityHeadersEnd 921494 -Octets 0 -Lines 0 -MimeEntityEnd 921494 -MultipartBoundaryBegin 921494 -MultipartBoundaryEnd 921529 -MimeEntityBegin 921529 -MimeEntityHeadersEnd 921611 -Octets 2754 -Lines 42 -MimeEntityEnd 924365 -MultipartEndBoundaryBegin 924365 -MultipartEndBoundaryEnd 924400 -MultipartEpilogueBegin 924400 -MultipartEpilogueEnd 924402 -Octets 3010 -Lines 53 -MimeEntityEnd 924402 -MimeMessageEnd 924402 -MboxMarkerBegin 924404 -MboxMarkerEnd 924437 -MimeMessageBegin 924437 -MimeEntityBegin 924437 -MimeEntityHeadersEnd 925493 -MimeMessageHeadersEnd 925493 -MultipartPreambleBegin 925493 -MultipartPreambleEnd 925495 -MultipartBoundaryBegin 925495 -MultipartBoundaryEnd 925536 -MimeEntityBegin 925536 -MimeEntityHeadersEnd 925617 -Octets 466 -Lines 14 -MimeEntityEnd 926083 -MultipartBoundaryBegin 926083 -MultipartBoundaryEnd 926126 -MimeEntityBegin 926126 -MimeEntityHeadersEnd 926204 -Octets 837 -Lines 27 -MimeEntityEnd 927041 -MultipartBoundaryBegin 927041 -MultipartBoundaryEnd 927084 -MimeEntityBegin 927084 -MimeEntityHeadersEnd 927184 -Octets 1216 -Lines 16 -MimeEntityEnd 928400 -MultipartEndBoundaryBegin 928400 -MultipartEndBoundaryEnd 928443 -MultipartEpilogueBegin 928443 -MultipartEpilogueEnd 928445 -Octets 2952 -Lines 72 -MimeEntityEnd 928445 -MimeMessageEnd 928445 -MboxMarkerBegin 928447 -MboxMarkerEnd 928480 -MimeMessageBegin 928480 -MimeEntityBegin 928480 -MimeEntityHeadersEnd 929576 -MimeMessageHeadersEnd 929576 -MultipartPreambleBegin 929576 -MultipartPreambleEnd 929578 -MultipartBoundaryBegin 929578 -MultipartBoundaryEnd 929621 -MimeEntityBegin 929621 -MimeEntityHeadersEnd 929694 -Octets 159 -Lines 7 -MimeEntityEnd 929853 -MultipartBoundaryBegin 929853 -MultipartBoundaryEnd 929898 -MimeEntityBegin 929898 -MimeEntityHeadersEnd 929980 -Octets 4152 -Lines 57 -MimeEntityEnd 934132 -MultipartEndBoundaryBegin 934132 -MultipartEndBoundaryEnd 934177 -MultipartEpilogueBegin 934177 -MultipartEpilogueEnd 934179 -Octets 4603 -Lines 75 -MimeEntityEnd 934179 -MimeMessageEnd 934179 -MboxMarkerBegin 934181 -MboxMarkerEnd 934214 -MimeMessageBegin 934214 -MimeEntityBegin 934214 -MimeEntityHeadersEnd 935337 -MimeMessageHeadersEnd 935337 -MultipartPreambleBegin 935337 -MultipartPreambleEnd 935339 -MultipartBoundaryBegin 935339 -MultipartBoundaryEnd 935373 -MimeEntityBegin 935373 -MimeEntityHeadersEnd 935454 -Octets 78 -Lines 5 -MimeEntityEnd 935532 -MultipartBoundaryBegin 935532 -MultipartBoundaryEnd 935568 -MimeEntityBegin 935568 -MimeEntityHeadersEnd 935650 -Octets 3774 -Lines 58 -MimeEntityEnd 939424 -MultipartEndBoundaryBegin 939424 -MultipartEndBoundaryEnd 939460 -MultipartEpilogueBegin 939460 -MultipartEpilogueEnd 939460 -Octets 4123 -Lines 73 -MimeEntityEnd 939460 -MimeMessageEnd 939460 -MboxMarkerBegin 939462 -MboxMarkerEnd 939495 -MimeMessageBegin 939495 -MimeEntityBegin 939495 -MimeEntityHeadersEnd 940640 -MimeMessageHeadersEnd 940640 -MultipartPreambleBegin 940640 -MultipartPreambleEnd 940757 -MultipartBoundaryBegin 940757 -MultipartBoundaryEnd 940782 -MimeEntityBegin 940782 -MimeEntityHeadersEnd 940823 -Octets 194 -Lines 6 -MimeEntityEnd 941017 -MultipartBoundaryBegin 941017 -MultipartBoundaryEnd 941044 -MimeEntityBegin 941044 -MimeEntityHeadersEnd 941076 -MimeMessageBegin 941076 -MimeEntityBegin 941076 -MimeEntityHeadersEnd 941897 -MimeMessageHeadersEnd 941897 -Octets 11 -Lines 1 -MimeEntityEnd 941908 -MimeMessageEnd 941908 -Octets 832 -Lines 16 -MimeEntityEnd 941908 -MultipartEndBoundaryBegin 941908 -MultipartEndBoundaryEnd 941935 -MultipartEpilogueBegin 941935 -MultipartEpilogueEnd 941937 -Octets 1297 -Lines 34 -MimeEntityEnd 941937 -MimeMessageEnd 941937 -MboxMarkerBegin 941939 -MboxMarkerEnd 941972 -MimeMessageBegin 941972 -MimeEntityBegin 941972 -MimeEntityHeadersEnd 943868 -MimeMessageHeadersEnd 943868 -MultipartPreambleBegin 943868 -MultipartPreambleEnd 943868 -MultipartBoundaryBegin 943868 -MultipartBoundaryEnd 943913 -MimeEntityBegin 943913 -MimeEntityHeadersEnd 943994 -Octets 881 -Lines 18 -MimeEntityEnd 944875 -MultipartBoundaryBegin 944875 -MultipartBoundaryEnd 944922 -MimeEntityBegin 944922 -MimeEntityHeadersEnd 945088 -Octets 3702 -Lines 61 -MimeEntityEnd 948790 -MultipartEndBoundaryBegin 948790 -MultipartEndBoundaryEnd 948837 -MultipartEpilogueBegin 948837 -MultipartEpilogueEnd 948839 -Octets 4971 -Lines 92 -MimeEntityEnd 948839 -MimeMessageEnd 948839 diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.txt b/UnitTests/TestData/mbox/content-length.unix-offsets.txt deleted file mode 100644 index 99db8cfc6a..0000000000 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.txt +++ /dev/null @@ -1,975 +0,0 @@ -MboxMarkerBegin 0 -MboxMarkerEnd 8 -MimeMessageBegin 8 -MimeEntityBegin 8 -MimeEntityHeadersEnd 657 -MimeMessageHeadersEnd 657 -MultipartPreambleBegin 657 -MultipartPreambleEnd 657 -MultipartBoundaryBegin 657 -MultipartBoundaryEnd 706 -MimeEntityBegin 706 -MimeEntityHeadersEnd 732 -Octets 74 -Lines 5 -MimeEntityEnd 806 -MultipartBoundaryBegin 806 -MultipartBoundaryEnd 856 -MimeEntityBegin 856 -MimeEntityHeadersEnd 918 -MimeMessageBegin 918 -MimeEntityBegin 918 -MimeEntityHeadersEnd 1700 -MimeMessageHeadersEnd 1700 -Octets 137 -Lines 4 -MimeEntityEnd 1837 -MimeMessageEnd 1837 -Octets 919 -Lines 21 -MimeEntityEnd 1837 -MultipartEndBoundaryBegin 1837 -MultipartEndBoundaryEnd 1888 -MultipartEpilogueBegin 1888 -MultipartEpilogueEnd 1888 -Octets 1231 -Lines 34 -MimeEntityEnd 1888 -MimeMessageEnd 1888 -MboxMarkerBegin 1889 -MboxMarkerEnd 1897 -MimeMessageBegin 1897 -MimeEntityBegin 1897 -MimeEntityHeadersEnd 2365 -MimeMessageHeadersEnd 2365 -MultipartPreambleBegin 2365 -MultipartPreambleEnd 2411 -MultipartBoundaryBegin 2411 -MultipartBoundaryEnd 2438 -MimeEntityBegin 2438 -MimeEntityHeadersEnd 2582 -MimeMessageBegin 2582 -MimeEntityBegin 2582 -MimeEntityHeadersEnd 3011 -MimeMessageHeadersEnd 3011 -Octets 37 -Lines 2 -MimeEntityEnd 3048 -MimeMessageEnd 3048 -Octets 466 -Lines 13 -MimeEntityEnd 3048 -MultipartBoundaryBegin 3048 -MultipartBoundaryEnd 3076 -MimeEntityBegin 3076 -MimeEntityHeadersEnd 3199 -Octets 458 -Lines 7 -MimeEntityEnd 3657 -MultipartBoundaryBegin 3657 -MultipartBoundaryEnd 3685 -MimeEntityBegin 3685 -MimeEntityHeadersEnd 3808 -Octets 486 -Lines 7 -MimeEntityEnd 4294 -MultipartBoundaryBegin 4294 -MultipartBoundaryEnd 4322 -MimeEntityBegin 4322 -MimeEntityHeadersEnd 4449 -Octets 527 -Lines 8 -MimeEntityEnd 4976 -MultipartBoundaryBegin 4976 -MultipartBoundaryEnd 5004 -MimeEntityBegin 5004 -MimeEntityHeadersEnd 5129 -Octets 498 -Lines 7 -MimeEntityEnd 5627 -MultipartBoundaryBegin 5627 -MultipartBoundaryEnd 5655 -MimeEntityBegin 5655 -MimeEntityHeadersEnd 5799 -MimeMessageBegin 5799 -MimeEntityBegin 5799 -MimeEntityHeadersEnd 6228 -MimeMessageHeadersEnd 6228 -Octets 37 -Lines 1 -MimeEntityEnd 6265 -MimeMessageEnd 6265 -Octets 466 -Lines 12 -MimeEntityEnd 6265 -MultipartBoundaryBegin 6265 -MultipartBoundaryEnd 6293 -MimeEntityBegin 6293 -MimeEntityHeadersEnd 6464 -MimeMessageBegin 6464 -MimeEntityBegin 6464 -MimeEntityHeadersEnd 7034 -MimeMessageHeadersEnd 7034 -MimeMessageBegin 7034 -MimeEntityBegin 7034 -MimeEntityHeadersEnd 7545 -MimeMessageHeadersEnd 7545 -MimeMessageBegin 7545 -MimeEntityBegin 7545 -MimeEntityHeadersEnd 7955 -MimeMessageHeadersEnd 7955 -Octets 5 -Lines 1 -MimeEntityEnd 7960 -MimeMessageEnd 7960 -Octets 415 -Lines 12 -MimeEntityEnd 7960 -MimeMessageEnd 7960 -Octets 926 -Lines 26 -MimeEntityEnd 7960 -MimeMessageEnd 7960 -Octets 1496 -Lines 41 -MimeEntityEnd 7960 -MultipartBoundaryBegin 7960 -MultipartBoundaryEnd 7988 -MimeEntityBegin 7988 -MimeEntityHeadersEnd 8041 -Octets 52 -Lines 1 -MimeEntityEnd 8093 -MultipartEndBoundaryBegin 8093 -MultipartEndBoundaryEnd 8122 -MultipartEpilogueBegin 8122 -MultipartEpilogueEnd 8122 -Octets 5757 -Lines 145 -MimeEntityEnd 8122 -MimeMessageEnd 8122 -MboxMarkerBegin 8123 -MboxMarkerEnd 8131 -MimeMessageBegin 8131 -MimeEntityBegin 8131 -MimeEntityHeadersEnd 8602 -MimeMessageHeadersEnd 8602 -MultipartPreambleBegin 8602 -MultipartPreambleEnd 8648 -MultipartBoundaryBegin 8648 -MultipartBoundaryEnd 8675 -MimeEntityBegin 8675 -MimeEntityHeadersEnd 8823 -MimeMessageBegin 8823 -MimeEntityBegin 8823 -MimeEntityHeadersEnd 9251 -MimeMessageHeadersEnd 9251 -Octets 37 -Lines 2 -MimeEntityEnd 9288 -MimeMessageEnd 9288 -Octets 465 -Lines 13 -MimeEntityEnd 9288 -MultipartBoundaryBegin 9288 -MultipartBoundaryEnd 9316 -MimeEntityBegin 9316 -MimeEntityHeadersEnd 9443 -Octets 458 -Lines 7 -MimeEntityEnd 9901 -MultipartBoundaryBegin 9901 -MultipartBoundaryEnd 9929 -MimeEntityBegin 9929 -MimeEntityHeadersEnd 10056 -Octets 486 -Lines 7 -MimeEntityEnd 10542 -MultipartBoundaryBegin 10542 -MultipartBoundaryEnd 10570 -MimeEntityBegin 10570 -MimeEntityHeadersEnd 10701 -Octets 527 -Lines 8 -MimeEntityEnd 11228 -MultipartBoundaryBegin 11228 -MultipartBoundaryEnd 11256 -MimeEntityBegin 11256 -MimeEntityHeadersEnd 11385 -Octets 498 -Lines 7 -MimeEntityEnd 11883 -MultipartBoundaryBegin 11883 -MultipartBoundaryEnd 11911 -MimeEntityBegin 11911 -MimeEntityHeadersEnd 12059 -MimeMessageBegin 12059 -MimeEntityBegin 12059 -MimeEntityHeadersEnd 12487 -MimeMessageHeadersEnd 12487 -Octets 37 -Lines 1 -MimeEntityEnd 12524 -MimeMessageEnd 12524 -Octets 465 -Lines 12 -MimeEntityEnd 12524 -MultipartBoundaryBegin 12524 -MultipartBoundaryEnd 12552 -MimeEntityBegin 12552 -MimeEntityHeadersEnd 12727 -MimeMessageBegin 12727 -MimeEntityBegin 12727 -MimeEntityHeadersEnd 13300 -MimeMessageHeadersEnd 13300 -MimeMessageBegin 13300 -MimeEntityBegin 13300 -MimeEntityHeadersEnd 13814 -MimeMessageHeadersEnd 13814 -MimeMessageBegin 13814 -MimeEntityBegin 13814 -MimeEntityHeadersEnd 14223 -MimeMessageHeadersEnd 14223 -Octets 5 -Lines 1 -MimeEntityEnd 14228 -MimeMessageEnd 14228 -Octets 414 -Lines 12 -MimeEntityEnd 14228 -MimeMessageEnd 14228 -Octets 928 -Lines 26 -MimeEntityEnd 14228 -MimeMessageEnd 14228 -Octets 1501 -Lines 41 -MimeEntityEnd 14228 -MultipartBoundaryBegin 14228 -MultipartBoundaryEnd 14256 -MimeEntityBegin 14256 -MimeEntityHeadersEnd 14313 -Octets 52 -Lines 1 -MimeEntityEnd 14365 -MultipartEndBoundaryBegin 14365 -MultipartEndBoundaryEnd 14394 -MultipartEpilogueBegin 14394 -MultipartEpilogueEnd 14394 -Octets 5792 -Lines 145 -MimeEntityEnd 14394 -MimeMessageEnd 14394 -MboxMarkerBegin 14395 -MboxMarkerEnd 14427 -MimeMessageBegin 14427 -MimeEntityBegin 14427 -MimeEntityHeadersEnd 15930 -MimeMessageHeadersEnd 15930 -MultipartPreambleBegin 15930 -MultipartPreambleEnd 15931 -MultipartBoundaryBegin 15931 -MultipartBoundaryEnd 15975 -MimeEntityBegin 15975 -MimeEntityHeadersEnd 16066 -Octets 5199 -Lines 111 -MimeEntityEnd 21265 -MultipartBoundaryBegin 21265 -MultipartBoundaryEnd 21310 -MimeEntityBegin 21310 -MimeEntityHeadersEnd 21509 -Octets 929 -Lines 13 -MimeEntityEnd 22438 -MultipartEndBoundaryBegin 22438 -MultipartEndBoundaryEnd 22484 -MultipartEpilogueBegin 22484 -MultipartEpilogueEnd 22485 -Octets 6555 -Lines 139 -MimeEntityEnd 22485 -MimeMessageEnd 22485 -MboxMarkerBegin 22486 -MboxMarkerEnd 22518 -MimeMessageBegin 22518 -MimeEntityBegin 22518 -MimeEntityHeadersEnd 23752 -MimeMessageHeadersEnd 23752 -MultipartPreambleBegin 23752 -MultipartPreambleEnd 23798 -MultipartBoundaryBegin 23798 -MultipartBoundaryEnd 23836 -MimeEntityBegin 23836 -MimeEntityHeadersEnd 23912 -Octets 27 -Lines 3 -MimeEntityEnd 23939 -MultipartBoundaryBegin 23939 -MultipartBoundaryEnd 23978 -MimeEntityBegin 23978 -MimeEntityHeadersEnd 24068 -MimeMessageBegin 24068 -MimeEntityBegin 24068 -MimeEntityHeadersEnd 24889 -MimeMessageHeadersEnd 24889 -MultipartPreambleBegin 24889 -MultipartPreambleEnd 24890 -MultipartBoundaryBegin 24890 -MultipartBoundaryEnd 24929 -MimeEntityBegin 24929 -MimeEntityHeadersEnd 25005 -Octets 627 -Lines 16 -MimeEntityEnd 25632 -MultipartBoundaryBegin 25632 -MultipartBoundaryEnd 25672 -MimeEntityBegin 25672 -MimeEntityHeadersEnd 25754 -MultipartPreambleBegin 25754 -MultipartPreambleEnd 25755 -MultipartBoundaryBegin 25755 -MultipartBoundaryEnd 25794 -MimeEntityBegin 25794 -MimeEntityHeadersEnd 25869 -Octets 850 -Lines 18 -MimeEntityEnd 26719 -MultipartBoundaryBegin 26719 -MultipartBoundaryEnd 26759 -MimeEntityBegin 26759 -MimeEntityHeadersEnd 26943 -Octets 743967 -Lines 10192 -MimeEntityEnd 770910 -MultipartEndBoundaryBegin 770910 -MultipartEndBoundaryEnd 770951 -MultipartEpilogueBegin 770951 -MultipartEpilogueEnd 770952 -Octets 745198 -Lines 10223 -MimeEntityEnd 770952 -MultipartEndBoundaryBegin 770952 -MultipartEndBoundaryEnd 770993 -MultipartEpilogueBegin 770993 -MultipartEpilogueEnd 770996 -Octets 746107 -Lines 10252 -MimeEntityEnd 770996 -MimeMessageEnd 770996 -Octets 746928 -Lines 10268 -MimeEntityEnd 770996 -MultipartEndBoundaryBegin 770996 -MultipartEndBoundaryEnd 771036 -MultipartEpilogueBegin 771036 -MultipartEpilogueEnd 771037 -Octets 747285 -Lines 10285 -MimeEntityEnd 771037 -MimeMessageEnd 771037 -MboxMarkerBegin 771038 -MboxMarkerEnd 771070 -MimeMessageBegin 771070 -MimeEntityBegin 771070 -MimeEntityHeadersEnd 772334 -MimeMessageHeadersEnd 772334 -MultipartPreambleBegin 772334 -MultipartPreambleEnd 772335 -MultipartBoundaryBegin 772335 -MultipartBoundaryEnd 772379 -MimeEntityBegin 772379 -MimeEntityHeadersEnd 772470 -Octets 2382 -Lines 50 -MimeEntityEnd 774852 -MultipartBoundaryBegin 774852 -MultipartBoundaryEnd 774897 -MimeEntityBegin 774897 -MimeEntityHeadersEnd 775056 -Octets 6023 -Lines 79 -MimeEntityEnd 781079 -MultipartBoundaryBegin 781079 -MultipartBoundaryEnd 781124 -MimeEntityBegin 781124 -MimeEntityHeadersEnd 781282 -Octets 12073 -Lines 157 -MimeEntityEnd 793355 -MultipartBoundaryBegin 793355 -MultipartBoundaryEnd 793400 -MimeEntityBegin 793400 -MimeEntityHeadersEnd 793560 -Octets 21714 -Lines 282 -MimeEntityEnd 815274 -MultipartBoundaryBegin 815274 -MultipartBoundaryEnd 815319 -MimeEntityBegin 815319 -MimeEntityHeadersEnd 815522 -Octets 3393 -Lines 45 -MimeEntityEnd 818915 -MultipartEndBoundaryBegin 818915 -MultipartEndBoundaryEnd 818961 -MultipartEpilogueBegin 818961 -MultipartEpilogueEnd 818962 -Octets 46628 -Lines 649 -MimeEntityEnd 818962 -MimeMessageEnd 818962 -MboxMarkerBegin 818963 -MboxMarkerEnd 818971 -MimeMessageBegin 818971 -MimeEntityBegin 818971 -MimeEntityHeadersEnd 819882 -MimeMessageHeadersEnd 819882 -MultipartPreambleBegin 819882 -MultipartPreambleEnd 819883 -MultipartBoundaryBegin 819883 -MultipartBoundaryEnd 819891 -MimeEntityBegin 819891 -MimeEntityHeadersEnd 819920 -Octets 2530 -Lines 96 -MimeEntityEnd 822450 -MultipartEndBoundaryBegin 822450 -MultipartEndBoundaryEnd 822460 -MultipartEpilogueBegin 822460 -MultipartEpilogueEnd 822461 -Octets 2579 -Lines 102 -MimeEntityEnd 822461 -MimeMessageEnd 822461 -MboxMarkerBegin 822462 -MboxMarkerEnd 822494 -MimeMessageBegin 822494 -MimeEntityBegin 822494 -MimeEntityHeadersEnd 823647 -MimeMessageHeadersEnd 823647 -MultipartPreambleBegin 823647 -MultipartPreambleEnd 823647 -MultipartBoundaryBegin 823647 -MultipartBoundaryEnd 823664 -MimeEntityBegin 823664 -MimeEntityHeadersEnd 823665 -Octets 901 -Lines 20 -MimeEntityEnd 824566 -MultipartBoundaryBegin 824566 -MultipartBoundaryEnd 824584 -MimeEntityBegin 824584 -MimeEntityHeadersEnd 824663 -Octets 748 -Lines 12 -MimeEntityEnd 825411 -MultipartEndBoundaryBegin 825411 -MultipartEndBoundaryEnd 825430 -MultipartEpilogueBegin 825430 -MultipartEpilogueEnd 825431 -Octets 1784 -Lines 41 -MimeEntityEnd 825431 -MimeMessageEnd 825431 -MboxMarkerBegin 825432 -MboxMarkerEnd 825464 -MimeMessageBegin 825464 -MimeEntityBegin 825464 -MimeEntityHeadersEnd 826606 -MimeMessageHeadersEnd 826606 -MultipartPreambleBegin 826606 -MultipartPreambleEnd 826779 -MultipartBoundaryBegin 826779 -MultipartBoundaryEnd 826786 -MimeEntityBegin 826786 -MimeEntityHeadersEnd 826864 -Octets 741 -Lines 14 -MimeEntityEnd 827605 -MultipartBoundaryBegin 827605 -MultipartBoundaryEnd 827613 -MimeEntityBegin 827613 -MimeEntityHeadersEnd 827791 -Octets 2215 -Lines 31 -MimeEntityEnd 830006 -MultipartEndBoundaryBegin 830006 -MultipartEndBoundaryEnd 830015 -MultipartEpilogueBegin 830015 -MultipartEpilogueEnd 830015 -Octets 3409 -Lines 60 -MimeEntityEnd 830015 -MimeMessageEnd 830015 -MboxMarkerBegin 830016 -MboxMarkerEnd 830048 -MimeMessageBegin 830048 -MimeEntityBegin 830048 -MimeEntityHeadersEnd 831185 -MimeMessageHeadersEnd 831185 -MultipartPreambleBegin 831185 -MultipartPreambleEnd 831358 -MultipartBoundaryBegin 831358 -MultipartBoundaryEnd 831379 -MimeEntityBegin 831379 -MimeEntityHeadersEnd 831457 -Octets 2812 -Lines 47 -MimeEntityEnd 834269 -MultipartBoundaryBegin 834269 -MultipartBoundaryEnd 834291 -MimeEntityBegin 834291 -MimeEntityHeadersEnd 834469 -Octets 2547 -Lines 35 -MimeEntityEnd 837016 -MultipartEndBoundaryBegin 837016 -MultipartEndBoundaryEnd 837039 -MultipartEpilogueBegin 837039 -MultipartEpilogueEnd 837039 -Octets 5854 -Lines 97 -MimeEntityEnd 837039 -MimeMessageEnd 837039 -MboxMarkerBegin 837040 -MboxMarkerEnd 837072 -MimeMessageBegin 837072 -MimeEntityBegin 837072 -MimeEntityHeadersEnd 837972 -MimeMessageHeadersEnd 837972 -MultipartPreambleBegin 837972 -MultipartPreambleEnd 838018 -MultipartBoundaryBegin 838018 -MultipartBoundaryEnd 838045 -MimeEntityBegin 838045 -MimeEntityHeadersEnd 838179 -Octets 10722 -Lines 147 -MimeEntityEnd 848901 -MultipartBoundaryBegin 848901 -MultipartBoundaryEnd 848929 -MimeEntityBegin 848929 -MimeEntityHeadersEnd 849080 -Octets 4611 -Lines 64 -MimeEntityEnd 853691 -MultipartEndBoundaryBegin 853691 -MultipartEndBoundaryEnd 853720 -MultipartEpilogueBegin 853720 -MultipartEpilogueEnd 853721 -Octets 15749 -Lines 224 -MimeEntityEnd 853721 -MimeMessageEnd 853721 -MboxMarkerBegin 853722 -MboxMarkerEnd 853754 -MimeMessageBegin 853754 -MimeEntityBegin 853754 -MimeEntityHeadersEnd 855145 -MimeMessageHeadersEnd 855145 -Octets 1431 -Lines 20 -MimeEntityEnd 856576 -MimeMessageEnd 856576 -MboxMarkerBegin 856577 -MboxMarkerEnd 856609 -MimeMessageBegin 856609 -MimeEntityBegin 856609 -MimeEntityHeadersEnd 857962 -MimeMessageHeadersEnd 857962 -MultipartPreambleBegin 857962 -MultipartPreambleEnd 857963 -MultipartBoundaryBegin 857963 -MultipartBoundaryEnd 858007 -MimeEntityBegin 858007 -MimeEntityHeadersEnd 858071 -Octets 107 -Lines 4 -MimeEntityEnd 858178 -MultipartBoundaryBegin 858178 -MultipartBoundaryEnd 858223 -MimeEntityBegin 858223 -MimeEntityHeadersEnd 858374 -Octets 3933 -Lines 54 -MimeEntityEnd 862307 -MultipartEndBoundaryBegin 862307 -MultipartEndBoundaryEnd 862353 -MultipartEpilogueBegin 862353 -MultipartEpilogueEnd 862354 -Octets 4392 -Lines 69 -MimeEntityEnd 862354 -MimeMessageEnd 862354 -MboxMarkerBegin 862355 -MboxMarkerEnd 862387 -MimeMessageBegin 862387 -MimeEntityBegin 862387 -MimeEntityHeadersEnd 863597 -MimeMessageHeadersEnd 863597 -Octets 3495 -Lines 55 -MimeEntityEnd 867092 -MimeMessageEnd 867092 -MboxMarkerBegin 867093 -MboxMarkerEnd 867125 -MimeMessageBegin 867125 -MimeEntityBegin 867125 -MimeEntityHeadersEnd 868202 -MimeMessageHeadersEnd 868202 -Octets 661 -Lines 10 -MimeEntityEnd 868863 -MimeMessageEnd 868863 -MboxMarkerBegin 868864 -MboxMarkerEnd 868896 -MimeMessageBegin 868896 -MimeEntityBegin 868896 -MimeEntityHeadersEnd 869679 -MimeMessageHeadersEnd 869679 -MimeMessageBegin 869679 -MimeEntityBegin 869679 -MimeEntityHeadersEnd 871059 -MimeMessageHeadersEnd 871059 -Octets 1432 -Lines 20 -MimeEntityEnd 872491 -MimeMessageEnd 872491 -Octets 2812 -Lines 43 -MimeEntityEnd 872491 -MimeMessageEnd 872491 -MboxMarkerBegin 872492 -MboxMarkerEnd 872524 -MimeMessageBegin 872524 -MimeEntityBegin 872524 -MimeEntityHeadersEnd 873234 -MimeMessageHeadersEnd 873234 -MultipartPreambleBegin 873234 -MultipartPreambleEnd 873280 -MultipartBoundaryBegin 873280 -MultipartBoundaryEnd 873307 -MimeEntityBegin 873307 -MimeEntityHeadersEnd 873383 -Octets 15 -Lines 1 -MimeEntityEnd 873398 -MultipartBoundaryBegin 873398 -MultipartBoundaryEnd 873426 -MimeEntityBegin 873426 -MimeEntityHeadersEnd 873580 -MimeMessageBegin 873580 -MimeEntityBegin 873580 -MimeEntityHeadersEnd 874960 -MimeMessageHeadersEnd 874960 -Octets 1432 -Lines 20 -MimeEntityEnd 876392 -MimeMessageEnd 876392 -Octets 2812 -Lines 43 -MimeEntityEnd 876392 -MultipartEndBoundaryBegin 876392 -MultipartEndBoundaryEnd 876421 -MultipartEpilogueBegin 876421 -MultipartEpilogueEnd 876422 -Octets 3188 -Lines 58 -MimeEntityEnd 876422 -MimeMessageEnd 876422 -MboxMarkerBegin 876423 -MboxMarkerEnd 876455 -MimeMessageBegin 876455 -MimeEntityBegin 876455 -MimeEntityHeadersEnd 877120 -MimeMessageHeadersEnd 877120 -MultipartPreambleBegin 877120 -MultipartPreambleEnd 877180 -MultipartBoundaryBegin 877180 -MultipartBoundaryEnd 877221 -MimeEntityBegin 877221 -MimeEntityHeadersEnd 877297 -Octets 41 -Lines 2 -MimeEntityEnd 877338 -MultipartBoundaryBegin 877338 -MultipartBoundaryEnd 877380 -MimeEntityBegin 877380 -MimeEntityHeadersEnd 877531 -Octets 5556 -Lines 77 -MimeEntityEnd 883087 -MultipartEndBoundaryBegin 883087 -MultipartEndBoundaryEnd 883130 -MultipartEpilogueBegin 883130 -MultipartEpilogueEnd 883131 -Octets 6011 -Lines 91 -MimeEntityEnd 883131 -MimeMessageEnd 883131 -MboxMarkerBegin 883132 -MboxMarkerEnd 883164 -MimeMessageBegin 883164 -MimeEntityBegin 883164 -MimeEntityHeadersEnd 884226 -MimeMessageHeadersEnd 884226 -Octets 10236 -Lines 141 -MimeEntityEnd 894462 -MimeMessageEnd 894462 -MboxMarkerBegin 894463 -MboxMarkerEnd 894495 -MimeMessageBegin 894495 -MimeEntityBegin 894495 -MimeEntityHeadersEnd 895871 -MimeMessageHeadersEnd 895871 -MultipartPreambleBegin 895871 -MultipartPreambleEnd 895931 -MultipartBoundaryBegin 895931 -MultipartBoundaryEnd 895972 -MimeEntityBegin 895972 -MimeEntityHeadersEnd 896048 -Octets 611 -Lines 17 -MimeEntityEnd 896659 -MultipartBoundaryBegin 896659 -MultipartBoundaryEnd 896701 -MimeEntityBegin 896701 -MimeEntityHeadersEnd 896852 -Octets 1788 -Lines 25 -MimeEntityEnd 898640 -MultipartEndBoundaryBegin 898640 -MultipartEndBoundaryEnd 898683 -MultipartEpilogueBegin 898683 -MultipartEpilogueEnd 898684 -Octets 2813 -Lines 54 -MimeEntityEnd 898684 -MimeMessageEnd 898684 -MboxMarkerBegin 898685 -MboxMarkerEnd 898717 -MimeMessageBegin 898717 -MimeEntityBegin 898717 -MimeEntityHeadersEnd 899265 -MimeMessageHeadersEnd 899265 -Octets 523 -Lines 8 -MimeEntityEnd 899788 -MimeMessageEnd 899788 -MboxMarkerBegin 899789 -MboxMarkerEnd 899821 -MimeMessageBegin 899821 -MimeEntityBegin 899821 -MimeEntityHeadersEnd 901036 -MimeMessageHeadersEnd 901036 -Octets 2882 -Lines 38 -MimeEntityEnd 903918 -MimeMessageEnd 903918 -MboxMarkerBegin 903919 -MboxMarkerEnd 903951 -MimeMessageBegin 903951 -MimeEntityBegin 903951 -MimeEntityHeadersEnd 905109 -MimeMessageHeadersEnd 905109 -Octets 2122 -Lines 30 -MimeEntityEnd 907231 -MimeMessageEnd 907231 -MboxMarkerBegin 907232 -MboxMarkerEnd 907264 -MimeMessageBegin 907264 -MimeEntityBegin 907264 -MimeEntityHeadersEnd 908342 -MimeMessageHeadersEnd 908342 -MultipartPreambleBegin 908342 -MultipartPreambleEnd 908343 -MultipartBoundaryBegin 908343 -MultipartBoundaryEnd 908375 -MimeEntityBegin 908375 -MimeEntityHeadersEnd 908439 -Octets 0 -Lines 0 -MimeEntityEnd 908439 -MultipartBoundaryBegin 908439 -MultipartBoundaryEnd 908472 -MimeEntityBegin 908472 -MimeEntityHeadersEnd 908551 -Octets 2713 -Lines 42 -MimeEntityEnd 911264 -MultipartEndBoundaryBegin 911264 -MultipartEndBoundaryEnd 911298 -MultipartEpilogueBegin 911298 -MultipartEpilogueEnd 911299 -Octets 2957 -Lines 53 -MimeEntityEnd 911299 -MimeMessageEnd 911299 -MboxMarkerBegin 911300 -MboxMarkerEnd 911332 -MimeMessageBegin 911332 -MimeEntityBegin 911332 -MimeEntityHeadersEnd 912369 -MimeMessageHeadersEnd 912369 -MultipartPreambleBegin 912369 -MultipartPreambleEnd 912370 -MultipartBoundaryBegin 912370 -MultipartBoundaryEnd 912410 -MimeEntityBegin 912410 -MimeEntityHeadersEnd 912488 -Octets 453 -Lines 14 -MimeEntityEnd 912941 -MultipartBoundaryBegin 912941 -MultipartBoundaryEnd 912982 -MimeEntityBegin 912982 -MimeEntityHeadersEnd 913057 -Octets 811 -Lines 27 -MimeEntityEnd 913868 -MultipartBoundaryBegin 913868 -MultipartBoundaryEnd 913909 -MimeEntityBegin 913909 -MimeEntityHeadersEnd 914006 -Octets 1200 -Lines 16 -MimeEntityEnd 915206 -MultipartEndBoundaryBegin 915206 -MultipartEndBoundaryEnd 915248 -MultipartEpilogueBegin 915248 -MultipartEpilogueEnd 915249 -Octets 2880 -Lines 72 -MimeEntityEnd 915249 -MimeMessageEnd 915249 -MboxMarkerBegin 915250 -MboxMarkerEnd 915282 -MimeMessageBegin 915282 -MimeEntityBegin 915282 -MimeEntityHeadersEnd 916357 -MimeMessageHeadersEnd 916357 -MultipartPreambleBegin 916357 -MultipartPreambleEnd 916358 -MultipartBoundaryBegin 916358 -MultipartBoundaryEnd 916400 -MimeEntityBegin 916400 -MimeEntityHeadersEnd 916470 -Octets 152 -Lines 7 -MimeEntityEnd 916622 -MultipartBoundaryBegin 916622 -MultipartBoundaryEnd 916665 -MimeEntityBegin 916665 -MimeEntityHeadersEnd 916744 -Octets 4096 -Lines 57 -MimeEntityEnd 920840 -MultipartEndBoundaryBegin 920840 -MultipartEndBoundaryEnd 920884 -MultipartEpilogueBegin 920884 -MultipartEpilogueEnd 920885 -Octets 4528 -Lines 75 -MimeEntityEnd 920885 -MimeMessageEnd 920885 -MboxMarkerBegin 920886 -MboxMarkerEnd 920918 -MimeMessageBegin 920918 -MimeEntityBegin 920918 -MimeEntityHeadersEnd 922020 -MimeMessageHeadersEnd 922020 -MultipartPreambleBegin 922020 -MultipartPreambleEnd 922021 -MultipartBoundaryBegin 922021 -MultipartBoundaryEnd 922054 -MimeEntityBegin 922054 -MimeEntityHeadersEnd 922132 -Octets 74 -Lines 5 -MimeEntityEnd 922206 -MultipartBoundaryBegin 922206 -MultipartBoundaryEnd 922240 -MimeEntityBegin 922240 -MimeEntityHeadersEnd 922319 -Octets 3717 -Lines 58 -MimeEntityEnd 926036 -MultipartEndBoundaryBegin 926036 -MultipartEndBoundaryEnd 926071 -MultipartEpilogueBegin 926071 -MultipartEpilogueEnd 926071 -Octets 4051 -Lines 73 -MimeEntityEnd 926071 -MimeMessageEnd 926071 -MboxMarkerBegin 926072 -MboxMarkerEnd 926104 -MimeMessageBegin 926104 -MimeEntityBegin 926104 -MimeEntityHeadersEnd 927232 -MimeMessageHeadersEnd 927232 -MultipartPreambleBegin 927232 -MultipartPreambleEnd 927345 -MultipartBoundaryBegin 927345 -MultipartBoundaryEnd 927369 -MimeEntityBegin 927369 -MimeEntityHeadersEnd 927408 -Octets 188 -Lines 6 -MimeEntityEnd 927596 -MultipartBoundaryBegin 927596 -MultipartBoundaryEnd 927621 -MimeEntityBegin 927621 -MimeEntityHeadersEnd 927651 -MimeMessageBegin 927651 -MimeEntityBegin 927651 -MimeEntityHeadersEnd 928457 -MimeMessageHeadersEnd 928457 -Octets 11 -Lines 1 -MimeEntityEnd 928468 -MimeMessageEnd 928468 -Octets 817 -Lines 16 -MimeEntityEnd 928468 -MultipartEndBoundaryBegin 928468 -MultipartEndBoundaryEnd 928494 -MultipartEpilogueBegin 928494 -MultipartEpilogueEnd 928495 -Octets 1263 -Lines 34 -MimeEntityEnd 928495 -MimeMessageEnd 928495 -MboxMarkerBegin 928496 -MboxMarkerEnd 928528 -MimeMessageBegin 928528 -MimeEntityBegin 928528 -MimeEntityHeadersEnd 930393 -MimeMessageHeadersEnd 930393 -MultipartPreambleBegin 930393 -MultipartPreambleEnd 930393 -MultipartBoundaryBegin 930393 -MultipartBoundaryEnd 930437 -MimeEntityBegin 930437 -MimeEntityHeadersEnd 930515 -Octets 863 -Lines 18 -MimeEntityEnd 931378 -MultipartBoundaryBegin 931378 -MultipartBoundaryEnd 931423 -MimeEntityBegin 931423 -MimeEntityHeadersEnd 931584 -Octets 3641 -Lines 61 -MimeEntityEnd 935225 -MultipartEndBoundaryBegin 935225 -MultipartEndBoundaryEnd 935271 -MultipartEpilogueBegin 935271 -MultipartEpilogueEnd 935272 -Octets 4879 -Lines 92 -MimeEntityEnd 935272 -MimeMessageEnd 935272 diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.txt b/UnitTests/TestData/mbox/jwz.dos-offsets.txt deleted file mode 100644 index f7728c55c2..0000000000 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.txt +++ /dev/null @@ -1,7039 +0,0 @@ -MboxMarkerBegin 0 -MboxMarkerEnd 9 -MimeMessageBegin 9 -MimeEntityBegin 9 -MimeEntityHeadersEnd 531 -MimeMessageHeadersEnd 531 -MultipartPreambleBegin 531 -MultipartPreambleEnd 531 -MultipartBoundaryBegin 531 -MultipartBoundaryEnd 549 -MimeEntityBegin 549 -MimeEntityHeadersEnd 648 -MultipartPreambleBegin 648 -MultipartPreambleEnd 648 -MultipartBoundaryBegin 648 -MultipartBoundaryEnd 680 -MimeEntityBegin 680 -MimeEntityHeadersEnd 682 -Octets 731 -Lines 17 -MimeEntityEnd 1413 -MultipartBoundaryBegin 1413 -MultipartBoundaryEnd 1447 -MimeEntityBegin 1447 -MimeEntityHeadersEnd 1535 -Octets 31472 -Lines 426 -MimeEntityEnd 33007 -MultipartEndBoundaryBegin 33007 -MultipartEndBoundaryEnd 33041 -MultipartEpilogueBegin 33041 -MultipartEpilogueEnd 33041 -Octets 32393 -Lines 452 -MimeEntityEnd 33041 -MultipartBoundaryBegin 33041 -MultipartBoundaryEnd 33061 -MimeEntityBegin 33061 -MimeEntityHeadersEnd 33157 -MultipartPreambleBegin 33157 -MultipartPreambleEnd 33157 -MultipartBoundaryBegin 33157 -MultipartBoundaryEnd 33189 -MimeEntityBegin 33189 -MimeEntityHeadersEnd 33275 -Octets 26000 -Lines 352 -MimeEntityEnd 59275 -MultipartBoundaryBegin 59275 -MultipartBoundaryEnd 59309 -MimeEntityBegin 59309 -MimeEntityHeadersEnd 59395 -Octets 18666 -Lines 253 -MimeEntityEnd 78061 -MultipartBoundaryBegin 78061 -MultipartBoundaryEnd 78095 -MimeEntityBegin 78095 -MimeEntityHeadersEnd 78212 -Octets 46125 -Lines 2437 -MimeEntityEnd 124337 -MultipartBoundaryBegin 124337 -MultipartBoundaryEnd 124371 -MimeEntityBegin 124371 -MimeEntityHeadersEnd 124435 -Octets 9203 -Lines 357 -MimeEntityEnd 133638 -MultipartEndBoundaryBegin 133638 -MultipartEndBoundaryEnd 133672 -MultipartEpilogueBegin 133672 -MultipartEpilogueEnd 133672 -Octets 100515 -Lines 3421 -MimeEntityEnd 133672 -MultipartBoundaryBegin 133672 -MultipartBoundaryEnd 133692 -MimeEntityBegin 133692 -MimeEntityHeadersEnd 133780 -Octets 47822 -Lines 647 -MimeEntityEnd 181602 -MultipartEndBoundaryBegin 181602 -MultipartEndBoundaryEnd 181622 -MultipartEpilogueBegin 181622 -MultipartEpilogueEnd 181624 -Octets 181093 -Lines 4535 -MimeEntityEnd 181624 -MimeMessageEnd 181624 -MboxMarkerBegin 181626 -MboxMarkerEnd 181635 -MimeMessageBegin 181635 -MimeEntityBegin 181635 -MimeEntityHeadersEnd 182198 -MimeMessageHeadersEnd 182198 -Octets 137124 -Lines 1854 -MimeEntityEnd 319322 -MimeMessageEnd 319322 -MboxMarkerBegin 319324 -MboxMarkerEnd 319333 -MimeMessageBegin 319333 -MimeEntityBegin 319333 -MimeEntityHeadersEnd 319720 -MimeMessageHeadersEnd 319720 -Octets 204 -Lines 4 -MimeEntityEnd 319924 -MimeMessageEnd 319924 -MboxMarkerBegin 319926 -MboxMarkerEnd 319935 -MimeMessageBegin 319935 -MimeEntityBegin 319935 -MimeEntityHeadersEnd 320596 -MimeMessageHeadersEnd 320596 -MultipartPreambleBegin 320596 -MultipartPreambleEnd 320754 -MultipartBoundaryBegin 320754 -MultipartBoundaryEnd 320795 -MimeEntityBegin 320795 -MimeEntityHeadersEnd 320841 -Octets 239 -Lines 6 -MimeEntityEnd 321080 -MultipartBoundaryBegin 321080 -MultipartBoundaryEnd 321123 -MimeEntityBegin 321123 -MimeEntityHeadersEnd 321211 -MultipartPreambleBegin 321211 -MultipartPreambleEnd 321211 -MultipartBoundaryBegin 321211 -MultipartBoundaryEnd 321254 -MimeEntityBegin 321254 -MimeEntityHeadersEnd 321348 -Octets 149 -Lines 3 -MimeEntityEnd 321497 -MultipartBoundaryBegin 321497 -MultipartBoundaryEnd 321542 -MimeEntityBegin 321542 -MimeEntityHeadersEnd 321656 -Octets 4432 -Lines 64 -MimeEntityEnd 326088 -MultipartBoundaryBegin 326088 -MultipartBoundaryEnd 326133 -MimeEntityBegin 326133 -MimeEntityHeadersEnd 326227 -Octets 48 -Lines 3 -MimeEntityEnd 326275 -MultipartEndBoundaryBegin 326275 -MultipartEndBoundaryEnd 326320 -MultipartEpilogueBegin 326320 -MultipartEpilogueEnd 326322 -Octets 5111 -Lines 87 -MimeEntityEnd 326322 -MultipartEndBoundaryBegin 326322 -MultipartEndBoundaryEnd 326365 -MultipartEpilogueBegin 326365 -MultipartEpilogueEnd 326365 -Octets 5769 -Lines 106 -MimeEntityEnd 326365 -MimeMessageEnd 326365 -MboxMarkerBegin 326367 -MboxMarkerEnd 326376 -MimeMessageBegin 326376 -MimeEntityBegin 326376 -MimeEntityHeadersEnd 327141 -MimeMessageHeadersEnd 327141 -MultipartPreambleBegin 327141 -MultipartPreambleEnd 327340 -MultipartBoundaryBegin 327340 -MultipartBoundaryEnd 327403 -MimeEntityBegin 327403 -MimeEntityHeadersEnd 327479 -Octets 436 -Lines 12 -MimeEntityEnd 327915 -MultipartBoundaryBegin 327915 -MultipartBoundaryEnd 327980 -MimeEntityBegin 327980 -MimeEntityHeadersEnd 328012 -MimeMessageBegin 328012 -MimeEntityBegin 328012 -MimeEntityHeadersEnd 328864 -MimeMessageHeadersEnd 328864 -MultipartPreambleBegin 328864 -MultipartPreambleEnd 329148 -MultipartBoundaryBegin 329148 -MultipartBoundaryEnd 329179 -MimeEntityBegin 329179 -MimeEntityHeadersEnd 329276 -Octets 110 -Lines 6 -MimeEntityEnd 329386 -MultipartBoundaryBegin 329386 -MultipartBoundaryEnd 329419 -MimeEntityBegin 329419 -MimeEntityHeadersEnd 329511 -Octets 20910 -Lines 283 -MimeEntityEnd 350421 -MultipartBoundaryBegin 350421 -MultipartBoundaryEnd 350454 -MimeEntityBegin 350454 -MimeEntityHeadersEnd 350456 -Octets 0 -Lines 0 -MimeEntityEnd 350454 -Octets 21590 -Lines 308 -MimeEntityEnd 350454 -MimeMessageEnd 350454 -Octets 22442 -Lines 324 -MimeEntityEnd 350454 -MultipartBoundaryBegin 350454 -MultipartBoundaryEnd 350519 -MimeEntityBegin 350519 -MimeEntityHeadersEnd 350595 -Octets 111 -Lines 4 -MimeEntityEnd 350706 -MultipartEndBoundaryBegin 350706 -MultipartEndBoundaryEnd 350771 -MultipartEpilogueBegin 350771 -MultipartEpilogueEnd 350773 -Octets 23632 -Lines 359 -MimeEntityEnd 350773 -MimeMessageEnd 350773 -MboxMarkerBegin 350775 -MboxMarkerEnd 350784 -MimeMessageBegin 350784 -MimeEntityBegin 350784 -MimeEntityHeadersEnd 351518 -MimeMessageHeadersEnd 351518 -MultipartPreambleBegin 351518 -MultipartPreambleEnd 351676 -MultipartBoundaryBegin 351676 -MultipartBoundaryEnd 351717 -MimeEntityBegin 351717 -MimeEntityHeadersEnd 351763 -Octets 778 -Lines 18 -MimeEntityEnd 352541 -MultipartBoundaryBegin 352541 -MultipartBoundaryEnd 352584 -MimeEntityBegin 352584 -MimeEntityHeadersEnd 352672 -MultipartPreambleBegin 352672 -MultipartPreambleEnd 352672 -MultipartBoundaryBegin 352672 -MultipartBoundaryEnd 352715 -MimeEntityBegin 352715 -MimeEntityHeadersEnd 352809 -Octets 229 -Lines 4 -MimeEntityEnd 353038 -MultipartBoundaryBegin 353038 -MultipartBoundaryEnd 353083 -MimeEntityBegin 353083 -MimeEntityHeadersEnd 353195 -Octets 684046 -Lines 8982 -MimeEntityEnd 1037241 -MultipartBoundaryBegin 1037241 -MultipartBoundaryEnd 1037286 -MimeEntityBegin 1037286 -MimeEntityHeadersEnd 1037380 -Octets 121 -Lines 5 -MimeEntityEnd 1037501 -MultipartBoundaryBegin 1037501 -MultipartBoundaryEnd 1037546 -MimeEntityBegin 1037546 -MimeEntityHeadersEnd 1037676 -Octets 690196 -Lines 9060 -MimeEntityEnd 1727872 -MultipartBoundaryBegin 1727872 -MultipartBoundaryEnd 1727917 -MimeEntityBegin 1727917 -MimeEntityHeadersEnd 1728011 -Octets 12 -Lines 2 -MimeEntityEnd 1728023 -MultipartBoundaryBegin 1728023 -MultipartBoundaryEnd 1728068 -MimeEntityBegin 1728068 -MimeEntityHeadersEnd 1728189 -Octets 69112 -Lines 934 -MimeEntityEnd 1797301 -MultipartBoundaryBegin 1797301 -MultipartBoundaryEnd 1797346 -MimeEntityBegin 1797346 -MimeEntityHeadersEnd 1797440 -Octets 143 -Lines 5 -MimeEntityEnd 1797583 -MultipartBoundaryBegin 1797583 -MultipartBoundaryEnd 1797628 -MimeEntityBegin 1797628 -MimeEntityHeadersEnd 1797750 -Octets 341234 -Lines 4472 -MimeEntityEnd 2138984 -MultipartBoundaryBegin 2138984 -MultipartBoundaryEnd 2139029 -MimeEntityBegin 2139029 -MimeEntityHeadersEnd 2139123 -Octets 6 -Lines 1 -MimeEntityEnd 2139129 -MultipartEndBoundaryBegin 2139129 -MultipartEndBoundaryEnd 2139174 -MultipartEpilogueBegin 2139174 -MultipartEpilogueEnd 2139176 -Octets 1786504 -Lines 23515 -MimeEntityEnd 2139176 -MultipartEndBoundaryBegin 2139176 -MultipartEndBoundaryEnd 2139219 -MultipartEpilogueBegin 2139219 -MultipartEpilogueEnd 2139219 -Octets 1787701 -Lines 23546 -MimeEntityEnd 2139219 -MimeMessageEnd 2139219 -MboxMarkerBegin 2139221 -MboxMarkerEnd 2139230 -MimeMessageBegin 2139230 -MimeEntityBegin 2139230 -MimeEntityHeadersEnd 2140267 -MimeMessageHeadersEnd 2140267 -Octets 1164 -Lines 39 -MimeEntityEnd 2141431 -MimeMessageEnd 2141431 -MboxMarkerBegin 2141433 -MboxMarkerEnd 2141442 -MimeMessageBegin 2141442 -MimeEntityBegin 2141442 -MimeEntityHeadersEnd 2141689 -MimeMessageHeadersEnd 2141689 -MultipartPreambleBegin 2141689 -MultipartPreambleEnd 2141689 -MultipartBoundaryBegin 2141689 -MultipartBoundaryEnd 2141705 -MimeEntityBegin 2141705 -MimeEntityHeadersEnd 2141707 -Octets 305 -Lines 6 -MimeEntityEnd 2142012 -MultipartBoundaryBegin 2142012 -MultipartBoundaryEnd 2142030 -MimeEntityBegin 2142030 -MimeEntityHeadersEnd 2142109 -MultipartPreambleBegin 2142109 -MultipartPreambleEnd 2142109 -MultipartBoundaryBegin 2142109 -MultipartBoundaryEnd 2142126 -MimeEntityBegin 2142126 -MimeEntityHeadersEnd 2142207 -Octets 3276 -Lines 17 -MimeEntityEnd 2145483 -MultipartBoundaryBegin 2145483 -MultipartBoundaryEnd 2145502 -MimeEntityBegin 2145502 -MimeEntityHeadersEnd 2145610 -Octets 156706 -Lines 808 -MimeEntityEnd 2302316 -MultipartEndBoundaryBegin 2302316 -MultipartEndBoundaryEnd 2302335 -MultipartEpilogueBegin 2302335 -MultipartEpilogueEnd 2302335 -Octets 160226 -Lines 837 -MimeEntityEnd 2302335 -MultipartBoundaryBegin 2302335 -MultipartBoundaryEnd 2302353 -MimeEntityBegin 2302353 -MimeEntityHeadersEnd 2302412 -Octets 4915 -Lines 195 -MimeEntityEnd 2307327 -MultipartEndBoundaryBegin 2307327 -MultipartEndBoundaryEnd 2307345 -MultipartEpilogueBegin 2307345 -MultipartEpilogueEnd 2307345 -Octets 165656 -Lines 1050 -MimeEntityEnd 2307345 -MimeMessageEnd 2307345 -MboxMarkerBegin 2307347 -MboxMarkerEnd 2307356 -MimeMessageBegin 2307356 -MimeEntityBegin 2307356 -MimeEntityHeadersEnd 2308328 -MimeMessageHeadersEnd 2308328 -Octets 347516 -Lines 4456 -MimeEntityEnd 2655844 -MimeMessageEnd 2655844 -MboxMarkerBegin 2655846 -MboxMarkerEnd 2655855 -MimeMessageBegin 2655855 -MimeEntityBegin 2655855 -MimeEntityHeadersEnd 2655994 -MimeMessageHeadersEnd 2655994 -MultipartPreambleBegin 2655994 -MultipartPreambleEnd 2655994 -MultipartBoundaryBegin 2655994 -MultipartBoundaryEnd 2656012 -MimeEntityBegin 2656012 -MimeEntityHeadersEnd 2656087 -MultipartPreambleBegin 2656087 -MultipartPreambleEnd 2656087 -MultipartBoundaryBegin 2656087 -MultipartBoundaryEnd 2656119 -MimeEntityBegin 2656119 -MimeEntityHeadersEnd 2656121 -Octets 724 -Lines 18 -MimeEntityEnd 2656845 -MultipartBoundaryBegin 2656845 -MultipartBoundaryEnd 2656879 -MimeEntityBegin 2656879 -MimeEntityHeadersEnd 2656980 -Octets 31472 -Lines 426 -MimeEntityEnd 2688452 -MultipartEndBoundaryBegin 2688452 -MultipartEndBoundaryEnd 2688486 -MultipartEpilogueBegin 2688486 -MultipartEpilogueEnd 2688486 -Octets 32399 -Lines 453 -MimeEntityEnd 2688486 -MultipartEndBoundaryBegin 2688486 -MultipartEndBoundaryEnd 2688506 -MultipartEpilogueBegin 2688506 -MultipartEpilogueEnd 2688506 -Octets 32512 -Lines 457 -MimeEntityEnd 2688506 -MimeMessageEnd 2688506 -MboxMarkerBegin 2688508 -MboxMarkerEnd 2688517 -MimeMessageBegin 2688517 -MimeEntityBegin 2688517 -MimeEntityHeadersEnd 2689088 -MimeMessageHeadersEnd 2689088 -Octets 57561 -Lines 782 -MimeEntityEnd 2746649 -MimeMessageEnd 2746649 -MboxMarkerBegin 2746651 -MboxMarkerEnd 2746660 -MimeMessageBegin 2746660 -MimeEntityBegin 2746660 -MimeEntityHeadersEnd 2747410 -MimeMessageHeadersEnd 2747410 -MultipartPreambleBegin 2747410 -MultipartPreambleEnd 2747944 -MultipartBoundaryBegin 2747944 -MultipartBoundaryEnd 2748003 -MimeEntityBegin 2748003 -MimeEntityHeadersEnd 2748005 -Octets 566 -Lines 14 -MimeEntityEnd 2748571 -MultipartBoundaryBegin 2748571 -MultipartBoundaryEnd 2748632 -MimeEntityBegin 2748632 -MimeEntityHeadersEnd 2748738 -MultipartPreambleBegin 2748738 -MultipartPreambleEnd 2748738 -MultipartBoundaryBegin 2748738 -MultipartBoundaryEnd 2748799 -MimeEntityBegin 2748799 -MimeEntityHeadersEnd 2748875 -Octets 426 -Lines 7 -MimeEntityEnd 2749301 -MultipartBoundaryBegin 2749301 -MultipartBoundaryEnd 2749364 -MimeEntityBegin 2749364 -MimeEntityHeadersEnd 2749426 -Octets 29662 -Lines 401 -MimeEntityEnd 2779088 -MultipartBoundaryBegin 2779088 -MultipartBoundaryEnd 2779151 -MimeEntityBegin 2779151 -MimeEntityHeadersEnd 2779224 -Octets 45 -Lines 4 -MimeEntityEnd 2779269 -MultipartEndBoundaryBegin 2779269 -MultipartEndBoundaryEnd 2779332 -MultipartEpilogueBegin 2779332 -MultipartEpilogueEnd 2779334 -Octets 30596 -Lines 428 -MimeEntityEnd 2779334 -MultipartEndBoundaryBegin 2779334 -MultipartEndBoundaryEnd 2779395 -MultipartEpilogueBegin 2779395 -MultipartEpilogueEnd 2779395 -Octets 31985 -Lines 459 -MimeEntityEnd 2779395 -MimeMessageEnd 2779395 -MboxMarkerBegin 2779397 -MboxMarkerEnd 2779406 -MimeMessageBegin 2779406 -MimeEntityBegin 2779406 -MimeEntityHeadersEnd 2780075 -MimeMessageHeadersEnd 2780075 -MultipartPreambleBegin 2780075 -MultipartPreambleEnd 2780422 -MultipartBoundaryBegin 2780422 -MultipartBoundaryEnd 2780452 -MimeEntityBegin 2780452 -MimeEntityHeadersEnd 2780454 -Octets 848 -Lines 27 -MimeEntityEnd 2781302 -MultipartBoundaryBegin 2781302 -MultipartBoundaryEnd 2781334 -MimeEntityBegin 2781334 -MimeEntityHeadersEnd 2781410 -MultipartPreambleBegin 2781410 -MultipartPreambleEnd 2781410 -MultipartBoundaryBegin 2781410 -MultipartBoundaryEnd 2781442 -MimeEntityBegin 2781442 -MimeEntityHeadersEnd 2781470 -Octets 142 -Lines 6 -MimeEntityEnd 2781612 -MultipartBoundaryBegin 2781612 -MultipartBoundaryEnd 2781646 -MimeEntityBegin 2781646 -MimeEntityHeadersEnd 2781714 -Octets 1214 -Lines 17 -MimeEntityEnd 2782928 -MultipartBoundaryBegin 2782928 -MultipartBoundaryEnd 2782962 -MimeEntityBegin 2782962 -MimeEntityHeadersEnd 2782990 -Octets 68 -Lines 1 -MimeEntityEnd 2783058 -MultipartBoundaryBegin 2783058 -MultipartBoundaryEnd 2783092 -MimeEntityBegin 2783092 -MimeEntityHeadersEnd 2783160 -Octets 1222 -Lines 17 -MimeEntityEnd 2784382 -MultipartBoundaryBegin 2784382 -MultipartBoundaryEnd 2784416 -MimeEntityBegin 2784416 -MimeEntityHeadersEnd 2784447 -Octets 559 -Lines 14 -MimeEntityEnd 2785006 -MultipartEndBoundaryBegin 2785006 -MultipartEndBoundaryEnd 2785040 -MultipartEpilogueBegin 2785040 -MultipartEpilogueEnd 2785042 -Octets 3632 -Lines 75 -MimeEntityEnd 2785042 -MultipartEndBoundaryBegin 2785042 -MultipartEndBoundaryEnd 2785074 -MultipartEpilogueBegin 2785074 -MultipartEpilogueEnd 2785076 -Octets 5001 -Lines 118 -MimeEntityEnd 2785076 -MimeMessageEnd 2785076 -MboxMarkerBegin 2785078 -MboxMarkerEnd 2785087 -MimeMessageBegin 2785087 -MimeEntityBegin 2785087 -MimeEntityHeadersEnd 2786084 -MimeMessageHeadersEnd 2786084 -Octets 1414 -Lines 32 -MimeEntityEnd 2787498 -MimeMessageEnd 2787498 -MboxMarkerBegin 2787500 -MboxMarkerEnd 2787509 -MimeMessageBegin 2787509 -MimeEntityBegin 2787509 -MimeEntityHeadersEnd 2787772 -MimeMessageHeadersEnd 2787772 -Octets 261 -Lines 6 -MimeEntityEnd 2788033 -MimeMessageEnd 2788033 -MboxMarkerBegin 2788035 -MboxMarkerEnd 2788044 -MimeMessageBegin 2788044 -MimeEntityBegin 2788044 -MimeEntityHeadersEnd 2788716 -MimeMessageHeadersEnd 2788716 -Octets 737 -Lines 14 -MimeEntityEnd 2789453 -MimeMessageEnd 2789453 -MboxMarkerBegin 2789455 -MboxMarkerEnd 2789464 -MimeMessageBegin 2789464 -MimeEntityBegin 2789464 -MimeEntityHeadersEnd 2790463 -MimeMessageHeadersEnd 2790463 -MultipartPreambleBegin 2790463 -MultipartPreambleEnd 2790467 -MultipartBoundaryBegin 2790467 -MultipartBoundaryEnd 2790507 -MimeEntityBegin 2790507 -MimeEntityHeadersEnd 2790555 -Octets 77 -Lines 5 -MimeEntityEnd 2790632 -MultipartBoundaryBegin 2790632 -MultipartBoundaryEnd 2790674 -MimeEntityBegin 2790674 -MimeEntityHeadersEnd 2790763 -MultipartPreambleBegin 2790763 -MultipartPreambleEnd 2790767 -MultipartBoundaryBegin 2790767 -MultipartBoundaryEnd 2790808 -MimeEntityBegin 2790808 -MimeEntityHeadersEnd 2790967 -Octets 66874 -Lines 957 -MimeEntityEnd 2857841 -MultipartBoundaryBegin 2857841 -MultipartBoundaryEnd 2857884 -MimeEntityBegin 2857884 -MimeEntityHeadersEnd 2858099 -Octets 369562 -Lines 5281 -MimeEntityEnd 3227661 -MultipartEndBoundaryBegin 3227661 -MultipartEndBoundaryEnd 3227704 -MultipartEpilogueBegin 3227704 -MultipartEpilogueEnd 3227708 -Octets 436945 -Lines 6256 -MimeEntityEnd 3227708 -MultipartEndBoundaryBegin 3227708 -MultipartEndBoundaryEnd 3227750 -MultipartEpilogueBegin 3227750 -MultipartEpilogueEnd 3227750 -Octets 437287 -Lines 6272 -MimeEntityEnd 3227750 -MimeMessageEnd 3227750 -MboxMarkerBegin 3227752 -MboxMarkerEnd 3227761 -MimeMessageBegin 3227761 -MimeEntityBegin 3227761 -MimeEntityHeadersEnd 3228760 -MimeMessageHeadersEnd 3228760 -MultipartPreambleBegin 3228760 -MultipartPreambleEnd 3228764 -MultipartBoundaryBegin 3228764 -MultipartBoundaryEnd 3228804 -MimeEntityBegin 3228804 -MimeEntityHeadersEnd 3228852 -Octets 77 -Lines 5 -MimeEntityEnd 3228929 -MultipartBoundaryBegin 3228929 -MultipartBoundaryEnd 3228971 -MimeEntityBegin 3228971 -MimeEntityHeadersEnd 3229059 -MultipartPreambleBegin 3229059 -MultipartPreambleEnd 3229063 -MultipartBoundaryBegin 3229063 -MultipartBoundaryEnd 3229104 -MimeEntityBegin 3229104 -MimeEntityHeadersEnd 3229263 -Octets 66874 -Lines 957 -MimeEntityEnd 3296137 -MultipartBoundaryBegin 3296137 -MultipartBoundaryEnd 3296180 -MimeEntityBegin 3296180 -MimeEntityHeadersEnd 3296395 -Octets 369562 -Lines 5281 -MimeEntityEnd 3665957 -MultipartEndBoundaryBegin 3665957 -MultipartEndBoundaryEnd 3666000 -MultipartEpilogueBegin 3666000 -MultipartEpilogueEnd 3666004 -Octets 436945 -Lines 6256 -MimeEntityEnd 3666004 -MultipartEndBoundaryBegin 3666004 -MultipartEndBoundaryEnd 3666046 -MultipartEpilogueBegin 3666046 -MultipartEpilogueEnd 3666046 -Octets 437286 -Lines 6272 -MimeEntityEnd 3666046 -MimeMessageEnd 3666046 -MboxMarkerBegin 3666048 -MboxMarkerEnd 3666057 -MimeMessageBegin 3666057 -MimeEntityBegin 3666057 -MimeEntityHeadersEnd 3666630 -MimeMessageHeadersEnd 3666630 -MimeMessageBegin 3666630 -MimeEntityBegin 3666630 -MimeEntityHeadersEnd 3666692 -MimeMessageHeadersEnd 3666692 -Octets 540 -Lines 14 -MimeEntityEnd 3667232 -MimeMessageEnd 3667232 -Octets 602 -Lines 17 -MimeEntityEnd 3667232 -MimeMessageEnd 3667232 -MboxMarkerBegin 3667234 -MboxMarkerEnd 3667243 -MimeMessageBegin 3667243 -MimeEntityBegin 3667243 -MimeEntityHeadersEnd 3667974 -MimeMessageHeadersEnd 3667974 -MultipartPreambleBegin 3667974 -MultipartPreambleEnd 3667976 -MultipartBoundaryBegin 3667976 -MultipartBoundaryEnd 3668020 -MimeEntityBegin 3668020 -MimeEntityHeadersEnd 3668048 -Octets 186 -Lines 6 -MimeEntityEnd 3668234 -MultipartBoundaryBegin 3668234 -MultipartBoundaryEnd 3668280 -MimeEntityBegin 3668280 -MimeEntityHeadersEnd 3668355 -Octets 904 -Lines 12 -MimeEntityEnd 3669259 -MultipartEndBoundaryBegin 3669259 -MultipartEndBoundaryEnd 3669305 -MultipartEpilogueBegin 3669305 -MultipartEpilogueEnd 3669418 -Octets 1444 -Lines 33 -MimeEntityEnd 3669418 -MimeMessageEnd 3669418 -MboxMarkerBegin 3669420 -MboxMarkerEnd 3669429 -MimeMessageBegin 3669429 -MimeEntityBegin 3669429 -MimeEntityHeadersEnd 3669982 -MimeMessageHeadersEnd 3669982 -MultipartPreambleBegin 3669982 -MultipartPreambleEnd 3670021 -MultipartBoundaryBegin 3670021 -MultipartBoundaryEnd 3670061 -MimeEntityBegin 3670061 -MimeEntityHeadersEnd 3670063 -Octets 402 -Lines 10 -MimeEntityEnd 3670465 -MultipartBoundaryBegin 3670465 -MultipartBoundaryEnd 3670507 -MimeEntityBegin 3670507 -MimeEntityHeadersEnd 3670539 -MimeMessageBegin 3670539 -MimeEntityBegin 3670539 -MimeEntityHeadersEnd 3671342 -MimeMessageHeadersEnd 3671342 -Octets 3425 -Lines 72 -MimeEntityEnd 3674767 -MimeMessageEnd 3674767 -Octets 4228 -Lines 88 -MimeEntityEnd 3674767 -MultipartEndBoundaryBegin 3674767 -MultipartEndBoundaryEnd 3674809 -MultipartEpilogueBegin 3674809 -MultipartEpilogueEnd 3674811 -Octets 4829 -Lines 108 -MimeEntityEnd 3674811 -MimeMessageEnd 3674811 -MboxMarkerBegin 3674813 -MboxMarkerEnd 3674822 -MimeMessageBegin 3674822 -MimeEntityBegin 3674822 -MimeEntityHeadersEnd 3675488 -MimeMessageHeadersEnd 3675488 -MultipartPreambleBegin 3675488 -MultipartPreambleEnd 3675488 -MultipartBoundaryBegin 3675488 -MultipartBoundaryEnd 3675538 -MimeEntityBegin 3675538 -MimeEntityHeadersEnd 3675566 -Octets 78 -Lines 5 -MimeEntityEnd 3675644 -MultipartBoundaryBegin 3675644 -MultipartBoundaryEnd 3675696 -MimeEntityBegin 3675696 -MimeEntityHeadersEnd 3675761 -MimeMessageBegin 3675761 -MimeEntityBegin 3675761 -MimeEntityHeadersEnd 3676560 -MimeMessageHeadersEnd 3676560 -Octets 140 -Lines 4 -MimeEntityEnd 3676700 -MimeMessageEnd 3676700 -Octets 939 -Lines 21 -MimeEntityEnd 3676700 -MultipartEndBoundaryBegin 3676700 -MultipartEndBoundaryEnd 3676752 -MultipartEpilogueBegin 3676752 -MultipartEpilogueEnd 3676752 -Octets 1264 -Lines 34 -MimeEntityEnd 3676752 -MimeMessageEnd 3676752 -MboxMarkerBegin 3676754 -MboxMarkerEnd 3676763 -MimeMessageBegin 3676763 -MimeEntityBegin 3676763 -MimeEntityHeadersEnd 3677286 -MimeMessageHeadersEnd 3677286 -Octets 1464 -Lines 45 -MimeEntityEnd 3678750 -MimeMessageEnd 3678750 -MboxMarkerBegin 3678752 -MboxMarkerEnd 3678804 -MimeMessageBegin 3678804 -MimeEntityBegin 3678804 -MimeEntityHeadersEnd 3679391 -MimeMessageHeadersEnd 3679391 -Octets 60655 -Lines 954 -MimeEntityEnd 3740046 -MimeMessageEnd 3740046 -MboxMarkerBegin 3740048 -MboxMarkerEnd 3740100 -MimeMessageBegin 3740100 -MimeEntityBegin 3740100 -MimeEntityHeadersEnd 3740684 -MimeMessageHeadersEnd 3740684 -Octets 60767 -Lines 960 -MimeEntityEnd 3801451 -MimeMessageEnd 3801451 -MboxMarkerBegin 3801453 -MboxMarkerEnd 3801462 -MimeMessageBegin 3801462 -MimeEntityBegin 3801462 -MimeEntityHeadersEnd 3802023 -MimeMessageHeadersEnd 3802023 -MultipartPreambleBegin 3802023 -MultipartPreambleEnd 3802025 -MultipartBoundaryBegin 3802025 -MultipartBoundaryEnd 3802041 -MimeEntityBegin 3802041 -MimeEntityHeadersEnd 3802070 -Octets 75 -Lines 4 -MimeEntityEnd 3802145 -MultipartBoundaryBegin 3802145 -MultipartBoundaryEnd 3802163 -MimeEntityBegin 3802163 -MimeEntityHeadersEnd 3802247 -Octets 650 -Lines 9 -MimeEntityEnd 3802897 -MultipartEndBoundaryBegin 3802897 -MultipartEndBoundaryEnd 3802915 -MultipartEpilogueBegin 3802915 -MultipartEpilogueEnd 3802919 -Octets 896 -Lines 25 -MimeEntityEnd 3802919 -MimeMessageEnd 3802919 -MboxMarkerBegin 3802921 -MboxMarkerEnd 3802930 -MimeMessageBegin 3802930 -MimeEntityBegin 3802930 -MimeEntityHeadersEnd 3803695 -MimeMessageHeadersEnd 3803695 -Octets 42100 -Lines 570 -MimeEntityEnd 3845795 -MimeMessageEnd 3845795 -MboxMarkerBegin 3845797 -MboxMarkerEnd 3845806 -MimeMessageBegin 3845806 -MimeEntityBegin 3845806 -MimeEntityHeadersEnd 3846985 -MimeMessageHeadersEnd 3846985 -MultipartPreambleBegin 3846985 -MultipartPreambleEnd 3846985 -MultipartBoundaryBegin 3846985 -MultipartBoundaryEnd 3846991 -MimeEntityBegin 3846991 -MimeEntityHeadersEnd 3846993 -Octets 1965 -Lines 43 -MimeEntityEnd 3848958 -MultipartBoundaryBegin 3848958 -MultipartBoundaryEnd 3848966 -MimeEntityBegin 3848966 -MimeEntityHeadersEnd 3849075 -Octets 6308 -Lines 86 -MimeEntityEnd 3855383 -MultipartEndBoundaryBegin 3855383 -MultipartEndBoundaryEnd 3855391 -MultipartEpilogueBegin 3855391 -MultipartEpilogueEnd 3855393 -Octets 8408 -Lines 139 -MimeEntityEnd 3855393 -MimeMessageEnd 3855393 -MboxMarkerBegin 3855395 -MboxMarkerEnd 3855404 -MimeMessageBegin 3855404 -MimeEntityBegin 3855404 -MimeEntityHeadersEnd 3856880 -MimeMessageHeadersEnd 3856880 -Octets 108383 -Lines 1570 -MimeEntityEnd 3965263 -MimeMessageEnd 3965263 -MboxMarkerBegin 3965265 -MboxMarkerEnd 3965274 -MimeMessageBegin 3965274 -MimeEntityBegin 3965274 -MimeEntityHeadersEnd 3965889 -MimeMessageHeadersEnd 3965889 -MimeMessageBegin 3965889 -MimeEntityBegin 3965889 -MimeEntityHeadersEnd 3966475 -MimeMessageHeadersEnd 3966475 -MimeMessageBegin 3966475 -MimeEntityBegin 3966475 -MimeEntityHeadersEnd 3967033 -MimeMessageHeadersEnd 3967033 -MimeMessageBegin 3967033 -MimeEntityBegin 3967033 -MimeEntityHeadersEnd 3967597 -MimeMessageHeadersEnd 3967597 -MultipartPreambleBegin 3967597 -MultipartPreambleEnd 3967645 -MultipartBoundaryBegin 3967645 -MultipartBoundaryEnd 3967704 -MimeEntityBegin 3967704 -MimeEntityHeadersEnd 3967783 -Octets 50 -Lines 1 -MimeEntityEnd 3967833 -MultipartBoundaryBegin 3967833 -MultipartBoundaryEnd 3967894 -MimeEntityBegin 3967894 -MimeEntityHeadersEnd 3967959 -MimeMessageBegin 3967959 -MimeEntityBegin 3967959 -MimeEntityHeadersEnd 3968475 -MimeMessageHeadersEnd 3968475 -MultipartPreambleBegin 3968475 -MultipartPreambleEnd 3968523 -MultipartBoundaryBegin 3968523 -MultipartBoundaryEnd 3968572 -MimeEntityBegin 3968572 -MimeEntityHeadersEnd 3968651 -Octets 127 -Lines 5 -MimeEntityEnd 3968778 -MultipartBoundaryBegin 3968778 -MultipartBoundaryEnd 3968829 -MimeEntityBegin 3968829 -MimeEntityHeadersEnd 3968901 -Octets 287 -Lines 5 -MimeEntityEnd 3969188 -MultipartEndBoundaryBegin 3969188 -MultipartEndBoundaryEnd 3969239 -MultipartEpilogueBegin 3969239 -MultipartEpilogueEnd 3969241 -Octets 766 -Lines 22 -MimeEntityEnd 3969241 -MimeMessageEnd 3969241 -Octets 1282 -Lines 38 -MimeEntityEnd 3969241 -MultipartEndBoundaryBegin 3969241 -MultipartEndBoundaryEnd 3969302 -MultipartEpilogueBegin 3969302 -MultipartEpilogueEnd 3969308 -Octets 1711 -Lines 54 -MimeEntityEnd 3969308 -MimeMessageEnd 3969308 -Octets 2275 -Lines 70 -MimeEntityEnd 3969308 -MimeMessageEnd 3969308 -Octets 2833 -Lines 86 -MimeEntityEnd 3969308 -MimeMessageEnd 3969308 -Octets 3419 -Lines 102 -MimeEntityEnd 3969308 -MimeMessageEnd 3969308 -MboxMarkerBegin 3969310 -MboxMarkerEnd 3969319 -MimeMessageBegin 3969319 -MimeEntityBegin 3969319 -MimeEntityHeadersEnd 3970038 -MimeMessageHeadersEnd 3970038 -MultipartPreambleBegin 3970038 -MultipartPreambleEnd 3970038 -MultipartBoundaryBegin 3970038 -MultipartBoundaryEnd 3970066 -MimeEntityBegin 3970066 -MimeEntityHeadersEnd 3970068 -Octets 42 -Lines 2 -MimeEntityEnd 3970110 -MultipartBoundaryBegin 3970110 -MultipartBoundaryEnd 3970140 -MimeEntityBegin 3970140 -MimeEntityHeadersEnd 3970290 -Octets 77616 -Lines 401 -MimeEntityEnd 4047906 -MultipartBoundaryBegin 4047906 -MultipartBoundaryEnd 4047936 -MimeEntityBegin 4047936 -MimeEntityHeadersEnd 4047938 -Octets 34 -Lines 3 -MimeEntityEnd 4047972 -MultipartBoundaryBegin 4047972 -MultipartBoundaryEnd 4048002 -MimeEntityBegin 4048002 -MimeEntityHeadersEnd 4048154 -Octets 103736 -Lines 535 -MimeEntityEnd 4151890 -MultipartBoundaryBegin 4151890 -MultipartBoundaryEnd 4151920 -MimeEntityBegin 4151920 -MimeEntityHeadersEnd 4151922 -Octets 164 -Lines 5 -MimeEntityEnd 4152086 -MultipartBoundaryBegin 4152086 -MultipartBoundaryEnd 4152116 -MimeEntityBegin 4152116 -MimeEntityHeadersEnd 4152208 -Octets 81424 -Lines 1235 -MimeEntityEnd 4233632 -MultipartBoundaryBegin 4233632 -MultipartBoundaryEnd 4233662 -MimeEntityBegin 4233662 -MimeEntityHeadersEnd 4233664 -Octets 22 -Lines 3 -MimeEntityEnd 4233686 -MultipartEndBoundaryBegin 4233686 -MultipartEndBoundaryEnd 4233716 -MultipartEpilogueBegin 4233716 -MultipartEpilogueEnd 4233718 -Octets 263680 -Lines 2210 -MimeEntityEnd 4233718 -MimeMessageEnd 4233718 -MboxMarkerBegin 4233720 -MboxMarkerEnd 4233729 -MimeMessageBegin 4233729 -MimeEntityBegin 4233729 -MimeEntityHeadersEnd 4234408 -MimeMessageHeadersEnd 4234408 -Octets 1010 -Lines 18 -MimeEntityEnd 4235418 -MimeMessageEnd 4235418 -MboxMarkerBegin 4235420 -MboxMarkerEnd 4235429 -MimeMessageBegin 4235429 -MimeEntityBegin 4235429 -MimeEntityHeadersEnd 4236508 -MimeMessageHeadersEnd 4236508 -MultipartPreambleBegin 4236508 -MultipartPreambleEnd 4236666 -MultipartBoundaryBegin 4236666 -MultipartBoundaryEnd 4236707 -MimeEntityBegin 4236707 -MimeEntityHeadersEnd 4236753 -Octets 417 -Lines 13 -MimeEntityEnd 4237170 -MultipartBoundaryBegin 4237170 -MultipartBoundaryEnd 4237213 -MimeEntityBegin 4237213 -MimeEntityHeadersEnd 4237301 -MultipartPreambleBegin 4237301 -MultipartPreambleEnd 4237301 -MultipartBoundaryBegin 4237301 -MultipartBoundaryEnd 4237344 -MimeEntityBegin 4237344 -MimeEntityHeadersEnd 4237438 -Octets 229 -Lines 4 -MimeEntityEnd 4237667 -MultipartBoundaryBegin 4237667 -MultipartBoundaryEnd 4237712 -MimeEntityBegin 4237712 -MimeEntityHeadersEnd 4237835 -Octets 1421 -Lines 37 -MimeEntityEnd 4239256 -MultipartBoundaryBegin 4239256 -MultipartBoundaryEnd 4239301 -MimeEntityBegin 4239301 -MimeEntityHeadersEnd 4239395 -Octets 157 -Lines 9 -MimeEntityEnd 4239552 -MultipartEndBoundaryBegin 4239552 -MultipartEndBoundaryEnd 4239597 -MultipartEpilogueBegin 4239597 -MultipartEpilogueEnd 4239599 -Octets 2298 -Lines 67 -MimeEntityEnd 4239599 -MultipartEndBoundaryBegin 4239599 -MultipartEndBoundaryEnd 4239642 -MultipartEpilogueBegin 4239642 -MultipartEpilogueEnd 4239644 -Octets 3136 -Lines 93 -MimeEntityEnd 4239644 -MimeMessageEnd 4239644 -MboxMarkerBegin 4239646 -MboxMarkerEnd 4239655 -MimeMessageBegin 4239655 -MimeEntityBegin 4239655 -MimeEntityHeadersEnd 4240341 -MimeMessageHeadersEnd 4240341 -MultipartPreambleBegin 4240341 -MultipartPreambleEnd 4240341 -MultipartBoundaryBegin 4240341 -MultipartBoundaryEnd 4240358 -MimeEntityBegin 4240358 -MimeEntityHeadersEnd 4240387 -Octets 84 -Lines 6 -MimeEntityEnd 4240471 -MultipartBoundaryBegin 4240471 -MultipartBoundaryEnd 4240490 -MimeEntityBegin 4240490 -MimeEntityHeadersEnd 4240553 -Octets 5234 -Lines 71 -MimeEntityEnd 4245787 -MultipartEndBoundaryBegin 4245787 -MultipartEndBoundaryEnd 4245806 -MultipartEpilogueBegin 4245806 -MultipartEpilogueEnd 4245810 -Octets 5469 -Lines 88 -MimeEntityEnd 4245810 -MimeMessageEnd 4245810 -MboxMarkerBegin 4245812 -MboxMarkerEnd 4245821 -MimeMessageBegin 4245821 -MimeEntityBegin 4245821 -MimeEntityHeadersEnd 4246287 -MimeMessageHeadersEnd 4246287 -Octets 11599 -Lines 185 -MimeEntityEnd 4257886 -MimeMessageEnd 4257886 -MboxMarkerBegin 4257888 -MboxMarkerEnd 4257897 -MimeMessageBegin 4257897 -MimeEntityBegin 4257897 -MimeEntityHeadersEnd 4258477 -MimeMessageHeadersEnd 4258477 -MultipartPreambleBegin 4258477 -MultipartPreambleEnd 4258477 -MultipartBoundaryBegin 4258477 -MultipartBoundaryEnd 4258489 -MimeEntityBegin 4258489 -MimeEntityHeadersEnd 4258491 -Octets 39 -Lines 1 -MimeEntityEnd 4258530 -MultipartBoundaryBegin 4258530 -MultipartBoundaryEnd 4258544 -MimeEntityBegin 4258544 -MimeEntityHeadersEnd 4258601 -MultipartPreambleBegin 4258601 -MultipartPreambleEnd 4258601 -MultipartBoundaryBegin 4258601 -MultipartBoundaryEnd 4258616 -MimeEntityBegin 4258616 -MimeEntityHeadersEnd 4258736 -MimeMessageBegin 4258736 -MimeEntityBegin 4258736 -MimeEntityHeadersEnd 4258816 -MimeMessageHeadersEnd 4258816 -Octets 69 -Lines 2 -MimeEntityEnd 4258885 -MimeMessageEnd 4258885 -Octets 149 -Lines 5 -MimeEntityEnd 4258885 -MultipartBoundaryBegin 4258885 -MultipartBoundaryEnd 4258902 -MimeEntityBegin 4258902 -MimeEntityHeadersEnd 4259095 -MimeMessageBegin 4259095 -MimeEntityBegin 4259095 -MimeEntityHeadersEnd 4259175 -MimeMessageHeadersEnd 4259175 -Octets 0 -Lines 0 -MimeEntityEnd 4259173 -MimeMessageEnd 4259173 -Octets 78 -Lines 2 -MimeEntityEnd 4259173 -MultipartBoundaryBegin 4259173 -MultipartBoundaryEnd 4259190 -MimeEntityBegin 4259190 -MimeEntityHeadersEnd 4259332 -MimeMessageBegin 4259332 -MimeEntityBegin 4259332 -MimeEntityHeadersEnd 4259403 -MimeMessageHeadersEnd 4259403 -Octets 0 -Lines 0 -MimeEntityEnd 4259401 -MimeMessageEnd 4259401 -Octets 69 -Lines 2 -MimeEntityEnd 4259401 -MultipartBoundaryBegin 4259401 -MultipartBoundaryEnd 4259418 -MimeEntityBegin 4259418 -MimeEntityHeadersEnd 4259535 -MimeMessageBegin 4259535 -MimeEntityBegin 4259535 -MimeEntityHeadersEnd 4259607 -MimeMessageHeadersEnd 4259607 -Octets 0 -Lines 0 -MimeEntityEnd 4259605 -MimeMessageEnd 4259605 -Octets 70 -Lines 2 -MimeEntityEnd 4259605 -MultipartBoundaryBegin 4259605 -MultipartBoundaryEnd 4259622 -MimeEntityBegin 4259622 -MimeEntityHeadersEnd 4259731 -MimeMessageBegin 4259731 -MimeEntityBegin 4259731 -MimeEntityHeadersEnd 4259803 -MimeMessageHeadersEnd 4259803 -Octets 0 -Lines 0 -MimeEntityEnd 4259801 -MimeMessageEnd 4259801 -Octets 70 -Lines 2 -MimeEntityEnd 4259801 -MultipartEndBoundaryBegin 4259801 -MultipartEndBoundaryEnd 4259818 -MultipartEpilogueBegin 4259818 -MultipartEpilogueEnd 4259820 -Octets 1219 -Lines 49 -MimeEntityEnd 4259820 -MultipartEndBoundaryBegin 4259820 -MultipartEndBoundaryEnd 4259834 -MultipartEpilogueBegin 4259834 -MultipartEpilogueEnd 4259836 -Octets 1359 -Lines 58 -MimeEntityEnd 4259836 -MimeMessageEnd 4259836 -MboxMarkerBegin 4259838 -MboxMarkerEnd 4259847 -MimeMessageBegin 4259847 -MimeEntityBegin 4259847 -MimeEntityHeadersEnd 4260427 -MimeMessageHeadersEnd 4260427 -MultipartPreambleBegin 4260427 -MultipartPreambleEnd 4260427 -MultipartBoundaryBegin 4260427 -MultipartBoundaryEnd 4260439 -MimeEntityBegin 4260439 -MimeEntityHeadersEnd 4260441 -Octets 3269 -Lines 65 -MimeEntityEnd 4263710 -MultipartBoundaryBegin 4263710 -MultipartBoundaryEnd 4263724 -MimeEntityBegin 4263724 -MimeEntityHeadersEnd 4263787 -MultipartPreambleBegin 4263787 -MultipartPreambleEnd 4263787 -MultipartBoundaryBegin 4263787 -MultipartBoundaryEnd 4263802 -MimeEntityBegin 4263802 -MimeEntityHeadersEnd 4263922 -MimeMessageBegin 4263922 -MimeEntityBegin 4263922 -MimeEntityHeadersEnd 4264002 -MimeMessageHeadersEnd 4264002 -Octets 69 -Lines 2 -MimeEntityEnd 4264071 -MimeMessageEnd 4264071 -Octets 149 -Lines 5 -MimeEntityEnd 4264071 -MultipartBoundaryBegin 4264071 -MultipartBoundaryEnd 4264088 -MimeEntityBegin 4264088 -MimeEntityHeadersEnd 4264281 -MimeMessageBegin 4264281 -MimeEntityBegin 4264281 -MimeEntityHeadersEnd 4264361 -MimeMessageHeadersEnd 4264361 -Octets 0 -Lines 0 -MimeEntityEnd 4264359 -MimeMessageEnd 4264359 -Octets 78 -Lines 2 -MimeEntityEnd 4264359 -MultipartEndBoundaryBegin 4264359 -MultipartEndBoundaryEnd 4264376 -MultipartEpilogueBegin 4264376 -MultipartEpilogueEnd 4264378 -Octets 591 -Lines 22 -MimeEntityEnd 4264378 -MultipartEndBoundaryBegin 4264378 -MultipartEndBoundaryEnd 4264392 -MultipartEpilogueBegin 4264392 -MultipartEpilogueEnd 4264394 -Octets 3967 -Lines 95 -MimeEntityEnd 4264394 -MimeMessageEnd 4264394 -MboxMarkerBegin 4264396 -MboxMarkerEnd 4264405 -MimeMessageBegin 4264405 -MimeEntityBegin 4264405 -MimeEntityHeadersEnd 4264885 -MimeMessageHeadersEnd 4264885 -MultipartPreambleBegin 4264885 -MultipartPreambleEnd 4264933 -MultipartBoundaryBegin 4264933 -MultipartBoundaryEnd 4264961 -MimeEntityBegin 4264961 -MimeEntityHeadersEnd 4265110 -MimeMessageBegin 4265110 -MimeEntityBegin 4265110 -MimeEntityHeadersEnd 4265550 -MimeMessageHeadersEnd 4265550 -Octets 39 -Lines 2 -MimeEntityEnd 4265589 -MimeMessageEnd 4265589 -Octets 479 -Lines 13 -MimeEntityEnd 4265589 -MultipartBoundaryBegin 4265589 -MultipartBoundaryEnd 4265619 -MimeEntityBegin 4265619 -MimeEntityHeadersEnd 4265746 -Octets 464 -Lines 7 -MimeEntityEnd 4266210 -MultipartBoundaryBegin 4266210 -MultipartBoundaryEnd 4266240 -MimeEntityBegin 4266240 -MimeEntityHeadersEnd 4266367 -Octets 492 -Lines 7 -MimeEntityEnd 4266859 -MultipartBoundaryBegin 4266859 -MultipartBoundaryEnd 4266889 -MimeEntityBegin 4266889 -MimeEntityHeadersEnd 4267020 -Octets 534 -Lines 8 -MimeEntityEnd 4267554 -MultipartBoundaryBegin 4267554 -MultipartBoundaryEnd 4267584 -MimeEntityBegin 4267584 -MimeEntityHeadersEnd 4267713 -Octets 504 -Lines 7 -MimeEntityEnd 4268217 -MultipartBoundaryBegin 4268217 -MultipartBoundaryEnd 4268247 -MimeEntityBegin 4268247 -MimeEntityHeadersEnd 4268396 -MimeMessageBegin 4268396 -MimeEntityBegin 4268396 -MimeEntityHeadersEnd 4268836 -MimeMessageHeadersEnd 4268836 -Octets 38 -Lines 1 -MimeEntityEnd 4268874 -MimeMessageEnd 4268874 -Octets 478 -Lines 12 -MimeEntityEnd 4268874 -MultipartBoundaryBegin 4268874 -MultipartBoundaryEnd 4268904 -MimeEntityBegin 4268904 -MimeEntityHeadersEnd 4269080 -MimeMessageBegin 4269080 -MimeEntityBegin 4269080 -MimeEntityHeadersEnd 4269665 -MimeMessageHeadersEnd 4269665 -MimeMessageBegin 4269665 -MimeEntityBegin 4269665 -MimeEntityHeadersEnd 4270190 -MimeMessageHeadersEnd 4270190 -MimeMessageBegin 4270190 -MimeEntityBegin 4270190 -MimeEntityHeadersEnd 4270611 -MimeMessageHeadersEnd 4270611 -Octets 6 -Lines 1 -MimeEntityEnd 4270617 -MimeMessageEnd 4270617 -Octets 427 -Lines 12 -MimeEntityEnd 4270617 -MimeMessageEnd 4270617 -Octets 952 -Lines 26 -MimeEntityEnd 4270617 -MimeMessageEnd 4270617 -Octets 1537 -Lines 41 -MimeEntityEnd 4270617 -MultipartBoundaryBegin 4270617 -MultipartBoundaryEnd 4270647 -MimeEntityBegin 4270647 -MimeEntityHeadersEnd 4270703 -Octets 53 -Lines 1 -MimeEntityEnd 4270756 -MultipartEndBoundaryBegin 4270756 -MultipartEndBoundaryEnd 4270786 -MultipartEpilogueBegin 4270786 -MultipartEpilogueEnd 4270786 -Octets 5901 -Lines 145 -MimeEntityEnd 4270786 -MimeMessageEnd 4270786 -MboxMarkerBegin 4270788 -MboxMarkerEnd 4270797 -MimeMessageBegin 4270797 -MimeEntityBegin 4270797 -MimeEntityHeadersEnd 4271280 -MimeMessageHeadersEnd 4271280 -MultipartPreambleBegin 4271280 -MultipartPreambleEnd 4271328 -MultipartBoundaryBegin 4271328 -MultipartBoundaryEnd 4271356 -MimeEntityBegin 4271356 -MimeEntityHeadersEnd 4271509 -MimeMessageBegin 4271509 -MimeEntityBegin 4271509 -MimeEntityHeadersEnd 4271948 -MimeMessageHeadersEnd 4271948 -Octets 39 -Lines 2 -MimeEntityEnd 4271987 -MimeMessageEnd 4271987 -Octets 478 -Lines 13 -MimeEntityEnd 4271987 -MultipartBoundaryBegin 4271987 -MultipartBoundaryEnd 4272017 -MimeEntityBegin 4272017 -MimeEntityHeadersEnd 4272148 -Octets 464 -Lines 7 -MimeEntityEnd 4272612 -MultipartBoundaryBegin 4272612 -MultipartBoundaryEnd 4272642 -MimeEntityBegin 4272642 -MimeEntityHeadersEnd 4272773 -Octets 492 -Lines 7 -MimeEntityEnd 4273265 -MultipartBoundaryBegin 4273265 -MultipartBoundaryEnd 4273295 -MimeEntityBegin 4273295 -MimeEntityHeadersEnd 4273430 -Octets 534 -Lines 8 -MimeEntityEnd 4273964 -MultipartBoundaryBegin 4273964 -MultipartBoundaryEnd 4273994 -MimeEntityBegin 4273994 -MimeEntityHeadersEnd 4274127 -Octets 504 -Lines 7 -MimeEntityEnd 4274631 -MultipartBoundaryBegin 4274631 -MultipartBoundaryEnd 4274661 -MimeEntityBegin 4274661 -MimeEntityHeadersEnd 4274814 -MimeMessageBegin 4274814 -MimeEntityBegin 4274814 -MimeEntityHeadersEnd 4275253 -MimeMessageHeadersEnd 4275253 -Octets 38 -Lines 1 -MimeEntityEnd 4275291 -MimeMessageEnd 4275291 -Octets 477 -Lines 12 -MimeEntityEnd 4275291 -MultipartBoundaryBegin 4275291 -MultipartBoundaryEnd 4275321 -MimeEntityBegin 4275321 -MimeEntityHeadersEnd 4275501 -MimeMessageBegin 4275501 -MimeEntityBegin 4275501 -MimeEntityHeadersEnd 4276089 -MimeMessageHeadersEnd 4276089 -MimeMessageBegin 4276089 -MimeEntityBegin 4276089 -MimeEntityHeadersEnd 4276617 -MimeMessageHeadersEnd 4276617 -MimeMessageBegin 4276617 -MimeEntityBegin 4276617 -MimeEntityHeadersEnd 4277037 -MimeMessageHeadersEnd 4277037 -Octets 6 -Lines 1 -MimeEntityEnd 4277043 -MimeMessageEnd 4277043 -Octets 426 -Lines 12 -MimeEntityEnd 4277043 -MimeMessageEnd 4277043 -Octets 954 -Lines 26 -MimeEntityEnd 4277043 -MimeMessageEnd 4277043 -Octets 1542 -Lines 41 -MimeEntityEnd 4277043 -MultipartBoundaryBegin 4277043 -MultipartBoundaryEnd 4277073 -MimeEntityBegin 4277073 -MimeEntityHeadersEnd 4277133 -Octets 53 -Lines 1 -MimeEntityEnd 4277186 -MultipartEndBoundaryBegin 4277186 -MultipartEndBoundaryEnd 4277216 -MultipartEpilogueBegin 4277216 -MultipartEpilogueEnd 4277216 -Octets 5936 -Lines 145 -MimeEntityEnd 4277216 -MimeMessageEnd 4277216 -MboxMarkerBegin 4277218 -MboxMarkerEnd 4277227 -MimeMessageBegin 4277227 -MimeEntityBegin 4277227 -MimeEntityHeadersEnd 4277931 -MimeMessageHeadersEnd 4277931 -MultipartPreambleBegin 4277931 -MultipartPreambleEnd 4277974 -MultipartBoundaryBegin 4277974 -MultipartBoundaryEnd 4277981 -MimeEntityBegin 4277981 -MimeEntityHeadersEnd 4278012 -Octets 446 -Lines 30 -MimeEntityEnd 4278458 -MultipartBoundaryBegin 4278458 -MultipartBoundaryEnd 4278467 -MimeEntityBegin 4278467 -MimeEntityHeadersEnd 4278543 -Octets 673 -Lines 42 -MimeEntityEnd 4279216 -MultipartBoundaryBegin 4279216 -MultipartBoundaryEnd 4279225 -MimeEntityBegin 4279225 -MimeEntityHeadersEnd 4279227 -Octets 18 -Lines 1 -MimeEntityEnd 4279245 -MultipartBoundaryBegin 4279245 -MultipartBoundaryEnd 4279254 -MimeEntityBegin 4279254 -MimeEntityHeadersEnd 4279256 -Octets 11 -Lines 1 -MimeEntityEnd 4279267 -MultipartBoundaryBegin 4279267 -MultipartBoundaryEnd 4279276 -MimeEntityBegin 4279276 -MimeEntityHeadersEnd 4279308 -MimeMessageBegin 4279308 -MimeEntityBegin 4279308 -MimeEntityHeadersEnd 4279530 -MimeMessageHeadersEnd 4279530 -MultipartPreambleBegin 4279530 -MultipartPreambleEnd 4279530 -MultipartBoundaryBegin 4279530 -MultipartBoundaryEnd 4279537 -MimeEntityBegin 4279537 -MimeEntityHeadersEnd 4279564 -Octets 23 -Lines 1 -MimeEntityEnd 4279587 -MultipartBoundaryBegin 4279587 -MultipartBoundaryEnd 4279596 -MimeEntityBegin 4279596 -MimeEntityHeadersEnd 4279776 -Octets 39 -Lines 1 -MimeEntityEnd 4279815 -MultipartEndBoundaryBegin 4279815 -MultipartEndBoundaryEnd 4279824 -MultipartEpilogueBegin 4279824 -MultipartEpilogueEnd 4279824 -Octets 294 -Lines 13 -MimeEntityEnd 4279824 -MimeMessageEnd 4279824 -Octets 516 -Lines 20 -MimeEntityEnd 4279824 -MultipartBoundaryBegin 4279824 -MultipartBoundaryEnd 4279833 -MimeEntityBegin 4279833 -MimeEntityHeadersEnd 4279914 -Octets 9558 -Lines 128 -MimeEntityEnd 4289472 -MultipartBoundaryBegin 4289472 -MultipartBoundaryEnd 4289481 -MimeEntityBegin 4289481 -MimeEntityHeadersEnd 4289661 -Octets 39 -Lines 1 -MimeEntityEnd 4289700 -MultipartBoundaryBegin 4289700 -MultipartBoundaryEnd 4289709 -MimeEntityBegin 4289709 -MimeEntityHeadersEnd 4289861 -Octets 7948 -Lines 128 -MimeEntityEnd 4297809 -MultipartBoundaryBegin 4297809 -MultipartBoundaryEnd 4297818 -MimeEntityBegin 4297818 -MimeEntityHeadersEnd 4297872 -MultipartPreambleBegin 4297872 -MultipartPreambleEnd 4297872 -MultipartBoundaryBegin 4297872 -MultipartBoundaryEnd 4297883 -MimeEntityBegin 4297883 -MimeEntityHeadersEnd 4297885 -MimeMessageBegin 4297885 -MimeEntityBegin 4297885 -MimeEntityHeadersEnd 4297914 -MimeMessageHeadersEnd 4297914 -Octets 5 -Lines 1 -MimeEntityEnd 4297919 -MimeMessageEnd 4297919 -Octets 34 -Lines 4 -MimeEntityEnd 4297919 -MultipartBoundaryBegin 4297919 -MultipartBoundaryEnd 4297932 -MimeEntityBegin 4297932 -MimeEntityHeadersEnd 4297934 -MimeMessageBegin 4297934 -MimeEntityBegin 4297934 -MimeEntityHeadersEnd 4297963 -MimeMessageHeadersEnd 4297963 -Octets 5 -Lines 1 -MimeEntityEnd 4297968 -MimeMessageEnd 4297968 -Octets 34 -Lines 4 -MimeEntityEnd 4297968 -MultipartBoundaryBegin 4297968 -MultipartBoundaryEnd 4297981 -MimeEntityBegin 4297981 -MimeEntityHeadersEnd 4297983 -MimeMessageBegin 4297983 -MimeEntityBegin 4297983 -MimeEntityHeadersEnd 4298012 -MimeMessageHeadersEnd 4298012 -Octets 5 -Lines 1 -MimeEntityEnd 4298017 -MimeMessageEnd 4298017 -Octets 34 -Lines 4 -MimeEntityEnd 4298017 -MultipartBoundaryBegin 4298017 -MultipartBoundaryEnd 4298030 -MimeEntityBegin 4298030 -MimeEntityHeadersEnd 4298057 -Octets 83 -Lines 2 -MimeEntityEnd 4298140 -MultipartBoundaryBegin 4298140 -MultipartBoundaryEnd 4298153 -MimeEntityBegin 4298153 -MimeEntityHeadersEnd 4298155 -MimeMessageBegin 4298155 -MimeEntityBegin 4298155 -MimeEntityHeadersEnd 4298213 -MimeMessageHeadersEnd 4298213 -Octets 49 -Lines 1 -MimeEntityEnd 4298262 -MimeMessageEnd 4298262 -Octets 107 -Lines 5 -MimeEntityEnd 4298262 -MultipartBoundaryBegin 4298262 -MultipartBoundaryEnd 4298275 -MimeEntityBegin 4298275 -MimeEntityHeadersEnd 4298277 -MimeMessageBegin 4298277 -MimeEntityBegin 4298277 -MimeEntityHeadersEnd 4298306 -MimeMessageHeadersEnd 4298306 -Octets 5 -Lines 1 -MimeEntityEnd 4298311 -MimeMessageEnd 4298311 -Octets 34 -Lines 4 -MimeEntityEnd 4298311 -MultipartEndBoundaryBegin 4298311 -MultipartEndBoundaryEnd 4298324 -MultipartEpilogueBegin 4298324 -MultipartEpilogueEnd 4298324 -Octets 452 -Lines 37 -MimeEntityEnd 4298324 -MultipartEndBoundaryBegin 4298324 -MultipartEndBoundaryEnd 4298333 -MultipartEpilogueBegin 4298333 -MultipartEpilogueEnd 4298376 -Octets 20445 -Lines 428 -MimeEntityEnd 4298376 -MimeMessageEnd 4298376 -MboxMarkerBegin 4298378 -MboxMarkerEnd 4298387 -MimeMessageBegin 4298387 -MimeEntityBegin 4298387 -MimeEntityHeadersEnd 4299063 -MimeMessageHeadersEnd 4299063 -MultipartPreambleBegin 4299063 -MultipartPreambleEnd 4299063 -MultipartBoundaryBegin 4299063 -MultipartBoundaryEnd 4299090 -MimeEntityBegin 4299090 -MimeEntityHeadersEnd 4299092 -Octets 1246 -Lines 27 -MimeEntityEnd 4300338 -MultipartBoundaryBegin 4300338 -MultipartBoundaryEnd 4300367 -MimeEntityBegin 4300367 -MimeEntityHeadersEnd 4300517 -Octets 71686 -Lines 370 -MimeEntityEnd 4372203 -MultipartBoundaryBegin 4372203 -MultipartBoundaryEnd 4372232 -MimeEntityBegin 4372232 -MimeEntityHeadersEnd 4372234 -Octets 0 -Lines 0 -MimeEntityEnd 4372234 -MultipartEndBoundaryBegin 4372234 -MultipartEndBoundaryEnd 4372263 -MultipartEpilogueBegin 4372263 -MultipartEpilogueEnd 4372265 -Octets 73202 -Lines 409 -MimeEntityEnd 4372265 -MimeMessageEnd 4372265 -MboxMarkerBegin 4372267 -MboxMarkerEnd 4372276 -MimeMessageBegin 4372276 -MimeEntityBegin 4372276 -MimeEntityHeadersEnd 4373229 -MimeMessageHeadersEnd 4373229 -Octets 252471 -Lines 3430 -MimeEntityEnd 4625700 -MimeMessageEnd 4625700 -MboxMarkerBegin 4625702 -MboxMarkerEnd 4625711 -MimeMessageBegin 4625711 -MimeEntityBegin 4625711 -MimeEntityHeadersEnd 4626660 -MimeMessageHeadersEnd 4626660 -MultipartPreambleBegin 4626660 -MultipartPreambleEnd 4626859 -MultipartBoundaryBegin 4626859 -MultipartBoundaryEnd 4626905 -MimeEntityBegin 4626905 -MimeEntityHeadersEnd 4626981 -Octets 473 -Lines 9 -MimeEntityEnd 4627454 -MultipartBoundaryBegin 4627454 -MultipartBoundaryEnd 4627502 -MimeEntityBegin 4627502 -MimeEntityHeadersEnd 4627564 -Octets 24568 -Lines 332 -MimeEntityEnd 4652132 -MultipartBoundaryBegin 4652132 -MultipartBoundaryEnd 4652180 -MimeEntityBegin 4652180 -MimeEntityHeadersEnd 4652256 -Octets 458 -Lines 10 -MimeEntityEnd 4652714 -MultipartBoundaryBegin 4652714 -MultipartBoundaryEnd 4652762 -MimeEntityBegin 4652762 -MimeEntityHeadersEnd 4652824 -Octets 11368 -Lines 154 -MimeEntityEnd 4664192 -MultipartBoundaryBegin 4664192 -MultipartBoundaryEnd 4664240 -MimeEntityBegin 4664240 -MimeEntityHeadersEnd 4664316 -Octets 310 -Lines 6 -MimeEntityEnd 4664626 -MultipartBoundaryBegin 4664626 -MultipartBoundaryEnd 4664674 -MimeEntityBegin 4664674 -MimeEntityHeadersEnd 4664736 -Octets 16676 -Lines 226 -MimeEntityEnd 4681412 -MultipartBoundaryBegin 4681412 -MultipartBoundaryEnd 4681460 -MimeEntityBegin 4681460 -MimeEntityHeadersEnd 4681536 -Octets 675 -Lines 15 -MimeEntityEnd 4682211 -MultipartEndBoundaryBegin 4682211 -MultipartEndBoundaryEnd 4682259 -MultipartEpilogueBegin 4682259 -MultipartEpilogueEnd 4682261 -Octets 55601 -Lines 792 -MimeEntityEnd 4682261 -MimeMessageEnd 4682261 -MboxMarkerBegin 4682263 -MboxMarkerEnd 4682272 -MimeMessageBegin 4682272 -MimeEntityBegin 4682272 -MimeEntityHeadersEnd 4683107 -MimeMessageHeadersEnd 4683107 -MultipartPreambleBegin 4683107 -MultipartPreambleEnd 4683107 -MultipartBoundaryBegin 4683107 -MultipartBoundaryEnd 4683137 -MimeEntityBegin 4683137 -MimeEntityHeadersEnd 4683139 -Octets 668 -Lines 18 -MimeEntityEnd 4683807 -MultipartBoundaryBegin 4683807 -MultipartBoundaryEnd 4683839 -MimeEntityBegin 4683839 -MimeEntityHeadersEnd 4683902 -Octets 47214 -Lines 762 -MimeEntityEnd 4731116 -MultipartEndBoundaryBegin 4731116 -MultipartEndBoundaryEnd 4731148 -MultipartEpilogueBegin 4731148 -MultipartEpilogueEnd 4731150 -Octets 48043 -Lines 788 -MimeEntityEnd 4731150 -MimeMessageEnd 4731150 -MboxMarkerBegin 4731152 -MboxMarkerEnd 4731161 -MimeMessageBegin 4731161 -MimeEntityBegin 4731161 -MimeEntityHeadersEnd 4731922 -MimeMessageHeadersEnd 4731922 -MultipartPreambleBegin 4731922 -MultipartPreambleEnd 4732363 -MultipartBoundaryBegin 4732363 -MultipartBoundaryEnd 4732387 -MimeEntityBegin 4732387 -MimeEntityHeadersEnd 4732463 -Octets 5475 -Lines 160 -MimeEntityEnd 4737938 -MultipartBoundaryBegin 4737938 -MultipartBoundaryEnd 4737964 -MimeEntityBegin 4737964 -MimeEntityHeadersEnd 4738065 -Octets 2616 -Lines 36 -MimeEntityEnd 4740681 -MultipartBoundaryBegin 4740681 -MultipartBoundaryEnd 4740707 -MimeEntityBegin 4740707 -MimeEntityHeadersEnd 4740783 -Octets 528 -Lines 10 -MimeEntityEnd 4741311 -MultipartBoundaryBegin 4741311 -MultipartBoundaryEnd 4741337 -MimeEntityBegin 4741337 -MimeEntityHeadersEnd 4741455 -Octets 23376 -Lines 316 -MimeEntityEnd 4764831 -MultipartBoundaryBegin 4764831 -MultipartBoundaryEnd 4764857 -MimeEntityBegin 4764857 -MimeEntityHeadersEnd 4764933 -Octets 592 -Lines 14 -MimeEntityEnd 4765525 -MultipartBoundaryBegin 4765525 -MultipartBoundaryEnd 4765551 -MimeEntityBegin 4765551 -MimeEntityHeadersEnd 4765640 -MimeMessageBegin 4765640 -MimeEntityBegin 4765640 -MimeEntityHeadersEnd 4765713 -MimeMessageHeadersEnd 4765713 -Octets 0 -Lines 0 -MimeEntityEnd 4765711 -MimeMessageEnd 4765711 -Octets 71 -Lines 2 -MimeEntityEnd 4765711 -MultipartBoundaryBegin 4765711 -MultipartBoundaryEnd 4765737 -MimeEntityBegin 4765737 -MimeEntityHeadersEnd 4765813 -Octets 281 -Lines 5 -MimeEntityEnd 4766094 -MultipartBoundaryBegin 4766094 -MultipartBoundaryEnd 4766120 -MimeEntityBegin 4766120 -MimeEntityHeadersEnd 4766273 -MimeMessageBegin 4766273 -MimeEntityBegin 4766273 -MimeEntityHeadersEnd 4766346 -MimeMessageHeadersEnd 4766346 -Octets 0 -Lines 0 -MimeEntityEnd 4766344 -MimeMessageEnd 4766344 -Octets 71 -Lines 2 -MimeEntityEnd 4766344 -MultipartBoundaryBegin 4766344 -MultipartBoundaryEnd 4766370 -MimeEntityBegin 4766370 -MimeEntityHeadersEnd 4766446 -Octets 1103 -Lines 34 -MimeEntityEnd 4767549 -MultipartEndBoundaryBegin 4767549 -MultipartEndBoundaryEnd 4767575 -MultipartEpilogueBegin 4767575 -MultipartEpilogueEnd 4767575 -Octets 35653 -Lines 639 -MimeEntityEnd 4767575 -MimeMessageEnd 4767575 -MboxMarkerBegin 4767577 -MboxMarkerEnd 4767586 -MimeMessageBegin 4767586 -MimeEntityBegin 4767586 -MimeEntityHeadersEnd 4767753 -MimeMessageHeadersEnd 4767753 -MultipartPreambleBegin 4767753 -MultipartPreambleEnd 4767753 -MultipartBoundaryBegin 4767753 -MultipartBoundaryEnd 4767766 -MimeEntityBegin 4767766 -MimeEntityHeadersEnd 4767838 -Octets 77489 -Lines 1145 -MimeEntityEnd 4845327 -MultipartBoundaryBegin 4845327 -MultipartBoundaryEnd 4845342 -MimeEntityBegin 4845342 -MimeEntityHeadersEnd 4845344 -Octets 30 -Lines 1 -MimeEntityEnd 4845374 -MultipartEndBoundaryBegin 4845374 -MultipartEndBoundaryEnd 4845389 -MultipartEpilogueBegin 4845389 -MultipartEpilogueEnd 4845389 -Octets 77636 -Lines 1154 -MimeEntityEnd 4845389 -MimeMessageEnd 4845389 -MboxMarkerBegin 4845391 -MboxMarkerEnd 4845400 -MimeMessageBegin 4845400 -MimeEntityBegin 4845400 -MimeEntityHeadersEnd 4846638 -MimeMessageHeadersEnd 4846638 -MultipartPreambleBegin 4846638 -MultipartPreambleEnd 4846638 -MultipartBoundaryBegin 4846638 -MultipartBoundaryEnd 4846677 -MimeEntityBegin 4846677 -MimeEntityHeadersEnd 4846723 -Octets 460 -Lines 8 -MimeEntityEnd 4847183 -MultipartBoundaryBegin 4847183 -MultipartBoundaryEnd 4847224 -MimeEntityBegin 4847224 -MimeEntityHeadersEnd 4847321 -Octets 129838 -Lines 2095 -MimeEntityEnd 4977159 -MultipartEndBoundaryBegin 4977159 -MultipartEndBoundaryEnd 4977200 -MultipartEpilogueBegin 4977200 -MultipartEpilogueEnd 4977202 -Octets 130564 -Lines 2114 -MimeEntityEnd 4977202 -MimeMessageEnd 4977202 -MboxMarkerBegin 4977204 -MboxMarkerEnd 4977213 -MimeMessageBegin 4977213 -MimeEntityBegin 4977213 -MimeEntityHeadersEnd 4977982 -MimeMessageHeadersEnd 4977982 -MultipartPreambleBegin 4977982 -MultipartPreambleEnd 4978327 -MultipartBoundaryBegin 4978327 -MultipartBoundaryEnd 4978386 -MimeEntityBegin 4978386 -MimeEntityHeadersEnd 4978388 -Octets 813 -Lines 18 -MimeEntityEnd 4979201 -MultipartBoundaryBegin 4979201 -MultipartBoundaryEnd 4979262 -MimeEntityBegin 4979262 -MimeEntityHeadersEnd 4979368 -MultipartPreambleBegin 4979368 -MultipartPreambleEnd 4979368 -MultipartBoundaryBegin 4979368 -MultipartBoundaryEnd 4979429 -MimeEntityBegin 4979429 -MimeEntityHeadersEnd 4979505 -Octets 496 -Lines 7 -MimeEntityEnd 4980001 -MultipartBoundaryBegin 4980001 -MultipartBoundaryEnd 4980064 -MimeEntityBegin 4980064 -MimeEntityHeadersEnd 4980164 -Octets 13180 -Lines 190 -MimeEntityEnd 4993344 -MultipartBoundaryBegin 4993344 -MultipartBoundaryEnd 4993407 -MimeEntityBegin 4993407 -MimeEntityHeadersEnd 4993480 -Octets 21 -Lines 1 -MimeEntityEnd 4993501 -MultipartBoundaryBegin 4993501 -MultipartBoundaryEnd 4993564 -MimeEntityBegin 4993564 -MimeEntityHeadersEnd 4993664 -Octets 56484 -Lines 764 -MimeEntityEnd 5050148 -MultipartBoundaryBegin 5050148 -MultipartBoundaryEnd 5050211 -MimeEntityBegin 5050211 -MimeEntityHeadersEnd 5050284 -Octets 57 -Lines 5 -MimeEntityEnd 5050341 -MultipartBoundaryBegin 5050341 -MultipartBoundaryEnd 5050404 -MimeEntityBegin 5050404 -MimeEntityHeadersEnd 5050468 -Octets 103552 -Lines 1400 -MimeEntityEnd 5154020 -MultipartBoundaryBegin 5154020 -MultipartBoundaryEnd 5154083 -MimeEntityBegin 5154083 -MimeEntityHeadersEnd 5154156 -Octets 4 -Lines 2 -MimeEntityEnd 5154160 -MultipartEndBoundaryBegin 5154160 -MultipartEndBoundaryEnd 5154223 -MultipartEpilogueBegin 5154223 -MultipartEpilogueEnd 5154225 -Octets 174857 -Lines 2407 -MimeEntityEnd 5154225 -MultipartEndBoundaryBegin 5154225 -MultipartEndBoundaryEnd 5154286 -MultipartEpilogueBegin 5154286 -MultipartEpilogueEnd 5154286 -Octets 176304 -Lines 2440 -MimeEntityEnd 5154286 -MimeMessageEnd 5154286 -MboxMarkerBegin 5154288 -MboxMarkerEnd 5154297 -MimeMessageBegin 5154297 -MimeEntityBegin 5154297 -MimeEntityHeadersEnd 5154999 -MimeMessageHeadersEnd 5154999 -MultipartPreambleBegin 5154999 -MultipartPreambleEnd 5155157 -MultipartBoundaryBegin 5155157 -MultipartBoundaryEnd 5155198 -MimeEntityBegin 5155198 -MimeEntityHeadersEnd 5155244 -Octets 1544 -Lines 29 -MimeEntityEnd 5156788 -MultipartBoundaryBegin 5156788 -MultipartBoundaryEnd 5156831 -MimeEntityBegin 5156831 -MimeEntityHeadersEnd 5156919 -MultipartPreambleBegin 5156919 -MultipartPreambleEnd 5156919 -MultipartBoundaryBegin 5156919 -MultipartBoundaryEnd 5156962 -MimeEntityBegin 5156962 -MimeEntityHeadersEnd 5157056 -Octets 920 -Lines 13 -MimeEntityEnd 5157976 -MultipartBoundaryBegin 5157976 -MultipartBoundaryEnd 5158021 -MimeEntityBegin 5158021 -MimeEntityHeadersEnd 5158116 -Octets 35364 -Lines 506 -MimeEntityEnd 5193480 -MultipartBoundaryBegin 5193480 -MultipartBoundaryEnd 5193525 -MimeEntityBegin 5193525 -MimeEntityHeadersEnd 5193619 -Octets 12 -Lines 2 -MimeEntityEnd 5193631 -MultipartBoundaryBegin 5193631 -MultipartBoundaryEnd 5193676 -MimeEntityBegin 5193676 -MimeEntityHeadersEnd 5193771 -Octets 21644 -Lines 310 -MimeEntityEnd 5215415 -MultipartBoundaryBegin 5215415 -MultipartBoundaryEnd 5215460 -MimeEntityBegin 5215460 -MimeEntityHeadersEnd 5215554 -Octets 12 -Lines 2 -MimeEntityEnd 5215566 -MultipartBoundaryBegin 5215566 -MultipartBoundaryEnd 5215611 -MimeEntityBegin 5215611 -MimeEntityHeadersEnd 5215706 -Octets 32914 -Lines 471 -MimeEntityEnd 5248620 -MultipartBoundaryBegin 5248620 -MultipartBoundaryEnd 5248665 -MimeEntityBegin 5248665 -MimeEntityHeadersEnd 5248759 -Octets 12 -Lines 2 -MimeEntityEnd 5248771 -MultipartBoundaryBegin 5248771 -MultipartBoundaryEnd 5248816 -MimeEntityBegin 5248816 -MimeEntityHeadersEnd 5248911 -Octets 33926 -Lines 485 -MimeEntityEnd 5282837 -MultipartBoundaryBegin 5282837 -MultipartBoundaryEnd 5282882 -MimeEntityBegin 5282882 -MimeEntityHeadersEnd 5282976 -Octets 12 -Lines 2 -MimeEntityEnd 5282988 -MultipartBoundaryBegin 5282988 -MultipartBoundaryEnd 5283033 -MimeEntityBegin 5283033 -MimeEntityHeadersEnd 5283128 -Octets 28240 -Lines 404 -MimeEntityEnd 5311368 -MultipartBoundaryBegin 5311368 -MultipartBoundaryEnd 5311413 -MimeEntityBegin 5311413 -MimeEntityHeadersEnd 5311507 -Octets 12 -Lines 2 -MimeEntityEnd 5311519 -MultipartBoundaryBegin 5311519 -MultipartBoundaryEnd 5311564 -MimeEntityBegin 5311564 -MimeEntityHeadersEnd 5311659 -Octets 33980 -Lines 486 -MimeEntityEnd 5345639 -MultipartBoundaryBegin 5345639 -MultipartBoundaryEnd 5345684 -MimeEntityBegin 5345684 -MimeEntityHeadersEnd 5345778 -Octets 12 -Lines 2 -MimeEntityEnd 5345790 -MultipartBoundaryBegin 5345790 -MultipartBoundaryEnd 5345835 -MimeEntityBegin 5345835 -MimeEntityHeadersEnd 5345930 -Octets 27046 -Lines 387 -MimeEntityEnd 5372976 -MultipartBoundaryBegin 5372976 -MultipartBoundaryEnd 5373021 -MimeEntityBegin 5373021 -MimeEntityHeadersEnd 5373115 -Octets 77 -Lines 3 -MimeEntityEnd 5373192 -MultipartEndBoundaryBegin 5373192 -MultipartEndBoundaryEnd 5373237 -MultipartEpilogueBegin 5373237 -MultipartEpilogueEnd 5373239 -Octets 216320 -Lines 3160 -MimeEntityEnd 5373239 -MultipartEndBoundaryBegin 5373239 -MultipartEndBoundaryEnd 5373282 -MultipartEpilogueBegin 5373282 -MultipartEpilogueEnd 5373282 -Octets 218283 -Lines 3202 -MimeEntityEnd 5373282 -MimeMessageEnd 5373282 -MboxMarkerBegin 5373284 -MboxMarkerEnd 5373293 -MimeMessageBegin 5373293 -MimeEntityBegin 5373293 -MimeEntityHeadersEnd 5373698 -MimeMessageHeadersEnd 5373698 -MultipartPreambleBegin 5373698 -MultipartPreambleEnd 5373897 -MultipartBoundaryBegin 5373897 -MultipartBoundaryEnd 5373947 -MimeEntityBegin 5373947 -MimeEntityHeadersEnd 5374045 -Octets 212 -Lines 9 -MimeEntityEnd 5374257 -MultipartBoundaryBegin 5374257 -MultipartBoundaryEnd 5374309 -MimeEntityBegin 5374309 -MimeEntityHeadersEnd 5374373 -Octets 89812 -Lines 1214 -MimeEntityEnd 5464185 -MultipartBoundaryBegin 5464185 -MultipartBoundaryEnd 5464237 -MimeEntityBegin 5464237 -MimeEntityHeadersEnd 5464265 -Octets 31 -Lines 1 -MimeEntityEnd 5464296 -MultipartEndBoundaryBegin 5464296 -MultipartEndBoundaryEnd 5464348 -MultipartEpilogueBegin 5464348 -MultipartEpilogueEnd 5464350 -Octets 90652 -Lines 1243 -MimeEntityEnd 5464350 -MimeMessageEnd 5464350 -MboxMarkerBegin 5464352 -MboxMarkerEnd 5464361 -MimeMessageBegin 5464361 -MimeEntityBegin 5464361 -MimeEntityHeadersEnd 5465317 -MimeMessageHeadersEnd 5465317 -Octets 51405 -Lines 696 -MimeEntityEnd 5516722 -MimeMessageEnd 5516722 -MboxMarkerBegin 5516724 -MboxMarkerEnd 5516733 -MimeMessageBegin 5516733 -MimeEntityBegin 5516733 -MimeEntityHeadersEnd 5517362 -MimeMessageHeadersEnd 5517362 -MultipartPreambleBegin 5517362 -MultipartPreambleEnd 5517362 -MultipartBoundaryBegin 5517362 -MultipartBoundaryEnd 5517381 -MimeEntityBegin 5517381 -MimeEntityHeadersEnd 5517383 -Octets 4418 -Lines 101 -MimeEntityEnd 5521801 -MultipartBoundaryBegin 5521801 -MultipartBoundaryEnd 5521822 -MimeEntityBegin 5521822 -MimeEntityHeadersEnd 5521966 -MultipartPreambleBegin 5521966 -MultipartPreambleEnd 5521966 -MultipartBoundaryBegin 5521966 -MultipartBoundaryEnd 5521998 -MimeEntityBegin 5521998 -MimeEntityHeadersEnd 5522000 -MimeMessageBegin 5522000 -MimeEntityBegin 5522000 -MimeEntityHeadersEnd 5522109 -MimeMessageHeadersEnd 5522109 -Octets 639 -Lines 18 -MimeEntityEnd 5522748 -MimeMessageEnd 5522748 -Octets 748 -Lines 22 -MimeEntityEnd 5522748 -MultipartBoundaryBegin 5522748 -MultipartBoundaryEnd 5522782 -MimeEntityBegin 5522782 -MimeEntityHeadersEnd 5522784 -MimeMessageBegin 5522784 -MimeEntityBegin 5522784 -MimeEntityHeadersEnd 5522909 -MimeMessageHeadersEnd 5522909 -Octets 753 -Lines 20 -MimeEntityEnd 5523662 -MimeMessageEnd 5523662 -Octets 878 -Lines 24 -MimeEntityEnd 5523662 -MultipartBoundaryBegin 5523662 -MultipartBoundaryEnd 5523696 -MimeEntityBegin 5523696 -MimeEntityHeadersEnd 5523698 -MimeMessageBegin 5523698 -MimeEntityBegin 5523698 -MimeEntityHeadersEnd 5523821 -MimeMessageHeadersEnd 5523821 -Octets 660 -Lines 14 -MimeEntityEnd 5524481 -MimeMessageEnd 5524481 -Octets 783 -Lines 18 -MimeEntityEnd 5524481 -MultipartBoundaryBegin 5524481 -MultipartBoundaryEnd 5524515 -MimeEntityBegin 5524515 -MimeEntityHeadersEnd 5524517 -MimeMessageBegin 5524517 -MimeEntityBegin 5524517 -MimeEntityHeadersEnd 5524677 -MimeMessageHeadersEnd 5524677 -Octets 493 -Lines 10 -MimeEntityEnd 5525170 -MimeMessageEnd 5525170 -Octets 653 -Lines 14 -MimeEntityEnd 5525170 -MultipartBoundaryBegin 5525170 -MultipartBoundaryEnd 5525204 -MimeEntityBegin 5525204 -MimeEntityHeadersEnd 5525206 -MimeMessageBegin 5525206 -MimeEntityBegin 5525206 -MimeEntityHeadersEnd 5525364 -MimeMessageHeadersEnd 5525364 -Octets 587 -Lines 15 -MimeEntityEnd 5525951 -MimeMessageEnd 5525951 -Octets 745 -Lines 19 -MimeEntityEnd 5525951 -MultipartBoundaryBegin 5525951 -MultipartBoundaryEnd 5525985 -MimeEntityBegin 5525985 -MimeEntityHeadersEnd 5525987 -MimeMessageBegin 5525987 -MimeEntityBegin 5525987 -MimeEntityHeadersEnd 5526148 -MimeMessageHeadersEnd 5526148 -Octets 1301 -Lines 26 -MimeEntityEnd 5527449 -MimeMessageEnd 5527449 -Octets 1462 -Lines 30 -MimeEntityEnd 5527449 -MultipartBoundaryBegin 5527449 -MultipartBoundaryEnd 5527483 -MimeEntityBegin 5527483 -MimeEntityHeadersEnd 5527485 -MimeMessageBegin 5527485 -MimeEntityBegin 5527485 -MimeEntityHeadersEnd 5527642 -MimeMessageHeadersEnd 5527642 -Octets 410 -Lines 9 -MimeEntityEnd 5528052 -MimeMessageEnd 5528052 -Octets 567 -Lines 13 -MimeEntityEnd 5528052 -MultipartBoundaryBegin 5528052 -MultipartBoundaryEnd 5528086 -MimeEntityBegin 5528086 -MimeEntityHeadersEnd 5528088 -MimeMessageBegin 5528088 -MimeEntityBegin 5528088 -MimeEntityHeadersEnd 5528239 -MimeMessageHeadersEnd 5528239 -Octets 403 -Lines 7 -MimeEntityEnd 5528642 -MimeMessageEnd 5528642 -Octets 554 -Lines 11 -MimeEntityEnd 5528642 -MultipartBoundaryBegin 5528642 -MultipartBoundaryEnd 5528676 -MimeEntityBegin 5528676 -MimeEntityHeadersEnd 5528678 -MimeMessageBegin 5528678 -MimeEntityBegin 5528678 -MimeEntityHeadersEnd 5528825 -MimeMessageHeadersEnd 5528825 -Octets 651 -Lines 11 -MimeEntityEnd 5529476 -MimeMessageEnd 5529476 -Octets 798 -Lines 15 -MimeEntityEnd 5529476 -MultipartBoundaryBegin 5529476 -MultipartBoundaryEnd 5529510 -MimeEntityBegin 5529510 -MimeEntityHeadersEnd 5529512 -MimeMessageBegin 5529512 -MimeEntityBegin 5529512 -MimeEntityHeadersEnd 5529653 -MimeMessageHeadersEnd 5529653 -Octets 996 -Lines 19 -MimeEntityEnd 5530649 -MimeMessageEnd 5530649 -Octets 1137 -Lines 23 -MimeEntityEnd 5530649 -MultipartBoundaryBegin 5530649 -MultipartBoundaryEnd 5530683 -MimeEntityBegin 5530683 -MimeEntityHeadersEnd 5530685 -MimeMessageBegin 5530685 -MimeEntityBegin 5530685 -MimeEntityHeadersEnd 5530836 -MimeMessageHeadersEnd 5530836 -Octets 917 -Lines 27 -MimeEntityEnd 5531753 -MimeMessageEnd 5531753 -Octets 1068 -Lines 31 -MimeEntityEnd 5531753 -MultipartBoundaryBegin 5531753 -MultipartBoundaryEnd 5531787 -MimeEntityBegin 5531787 -MimeEntityHeadersEnd 5531789 -MimeMessageBegin 5531789 -MimeEntityBegin 5531789 -MimeEntityHeadersEnd 5531924 -MimeMessageHeadersEnd 5531924 -Octets 570 -Lines 11 -MimeEntityEnd 5532494 -MimeMessageEnd 5532494 -Octets 705 -Lines 15 -MimeEntityEnd 5532494 -MultipartBoundaryBegin 5532494 -MultipartBoundaryEnd 5532528 -MimeEntityBegin 5532528 -MimeEntityHeadersEnd 5532530 -MimeMessageBegin 5532530 -MimeEntityBegin 5532530 -MimeEntityHeadersEnd 5532666 -MimeMessageHeadersEnd 5532666 -Octets 447 -Lines 10 -MimeEntityEnd 5533113 -MimeMessageEnd 5533113 -Octets 583 -Lines 14 -MimeEntityEnd 5533113 -MultipartBoundaryBegin 5533113 -MultipartBoundaryEnd 5533147 -MimeEntityBegin 5533147 -MimeEntityHeadersEnd 5533149 -MimeMessageBegin 5533149 -MimeEntityBegin 5533149 -MimeEntityHeadersEnd 5533270 -MimeMessageHeadersEnd 5533270 -Octets 567 -Lines 15 -MimeEntityEnd 5533837 -MimeMessageEnd 5533837 -Octets 688 -Lines 19 -MimeEntityEnd 5533837 -MultipartBoundaryBegin 5533837 -MultipartBoundaryEnd 5533871 -MimeEntityBegin 5533871 -MimeEntityHeadersEnd 5533873 -MimeMessageBegin 5533873 -MimeEntityBegin 5533873 -MimeEntityHeadersEnd 5533992 -MimeMessageHeadersEnd 5533992 -Octets 193 -Lines 8 -MimeEntityEnd 5534185 -MimeMessageEnd 5534185 -Octets 312 -Lines 12 -MimeEntityEnd 5534185 -MultipartBoundaryBegin 5534185 -MultipartBoundaryEnd 5534219 -MimeEntityBegin 5534219 -MimeEntityHeadersEnd 5534221 -MimeMessageBegin 5534221 -MimeEntityBegin 5534221 -MimeEntityHeadersEnd 5534342 -MimeMessageHeadersEnd 5534342 -Octets 335 -Lines 7 -MimeEntityEnd 5534677 -MimeMessageEnd 5534677 -Octets 456 -Lines 11 -MimeEntityEnd 5534677 -MultipartBoundaryBegin 5534677 -MultipartBoundaryEnd 5534711 -MimeEntityBegin 5534711 -MimeEntityHeadersEnd 5534713 -MimeMessageBegin 5534713 -MimeEntityBegin 5534713 -MimeEntityHeadersEnd 5534840 -MimeMessageHeadersEnd 5534840 -Octets 688 -Lines 21 -MimeEntityEnd 5535528 -MimeMessageEnd 5535528 -Octets 815 -Lines 25 -MimeEntityEnd 5535528 -MultipartBoundaryBegin 5535528 -MultipartBoundaryEnd 5535562 -MimeEntityBegin 5535562 -MimeEntityHeadersEnd 5535564 -MimeMessageBegin 5535564 -MimeEntityBegin 5535564 -MimeEntityHeadersEnd 5535692 -MimeMessageHeadersEnd 5535692 -Octets 107 -Lines 5 -MimeEntityEnd 5535799 -MimeMessageEnd 5535799 -Octets 235 -Lines 9 -MimeEntityEnd 5535799 -MultipartBoundaryBegin 5535799 -MultipartBoundaryEnd 5535833 -MimeEntityBegin 5535833 -MimeEntityHeadersEnd 5535835 -MimeMessageBegin 5535835 -MimeEntityBegin 5535835 -MimeEntityHeadersEnd 5535981 -MimeMessageHeadersEnd 5535981 -Octets 857 -Lines 21 -MimeEntityEnd 5536838 -MimeMessageEnd 5536838 -Octets 1003 -Lines 25 -MimeEntityEnd 5536838 -MultipartBoundaryBegin 5536838 -MultipartBoundaryEnd 5536872 -MimeEntityBegin 5536872 -MimeEntityHeadersEnd 5536874 -MimeMessageBegin 5536874 -MimeEntityBegin 5536874 -MimeEntityHeadersEnd 5536988 -MimeMessageHeadersEnd 5536988 -Octets 428 -Lines 9 -MimeEntityEnd 5537416 -MimeMessageEnd 5537416 -Octets 542 -Lines 13 -MimeEntityEnd 5537416 -MultipartBoundaryBegin 5537416 -MultipartBoundaryEnd 5537450 -MimeEntityBegin 5537450 -MimeEntityHeadersEnd 5537452 -MimeMessageBegin 5537452 -MimeEntityBegin 5537452 -MimeEntityHeadersEnd 5537628 -MimeMessageHeadersEnd 5537628 -Octets 239 -Lines 9 -MimeEntityEnd 5537867 -MimeMessageEnd 5537867 -Octets 415 -Lines 13 -MimeEntityEnd 5537867 -MultipartBoundaryBegin 5537867 -MultipartBoundaryEnd 5537901 -MimeEntityBegin 5537901 -MimeEntityHeadersEnd 5537903 -MimeMessageBegin 5537903 -MimeEntityBegin 5537903 -MimeEntityHeadersEnd 5538033 -MimeMessageHeadersEnd 5538033 -Octets 411 -Lines 12 -MimeEntityEnd 5538444 -MimeMessageEnd 5538444 -Octets 541 -Lines 16 -MimeEntityEnd 5538444 -MultipartBoundaryBegin 5538444 -MultipartBoundaryEnd 5538478 -MimeEntityBegin 5538478 -MimeEntityHeadersEnd 5538480 -MimeMessageBegin 5538480 -MimeEntityBegin 5538480 -MimeEntityHeadersEnd 5538601 -MimeMessageHeadersEnd 5538601 -Octets 932 -Lines 28 -MimeEntityEnd 5539533 -MimeMessageEnd 5539533 -Octets 1053 -Lines 32 -MimeEntityEnd 5539533 -MultipartBoundaryBegin 5539533 -MultipartBoundaryEnd 5539567 -MimeEntityBegin 5539567 -MimeEntityHeadersEnd 5539569 -MimeMessageBegin 5539569 -MimeEntityBegin 5539569 -MimeEntityHeadersEnd 5539701 -MimeMessageHeadersEnd 5539701 -Octets 300 -Lines 9 -MimeEntityEnd 5540001 -MimeMessageEnd 5540001 -Octets 432 -Lines 13 -MimeEntityEnd 5540001 -MultipartBoundaryBegin 5540001 -MultipartBoundaryEnd 5540035 -MimeEntityBegin 5540035 -MimeEntityHeadersEnd 5540037 -MimeMessageBegin 5540037 -MimeEntityBegin 5540037 -MimeEntityHeadersEnd 5540170 -MimeMessageHeadersEnd 5540170 -Octets 424 -Lines 14 -MimeEntityEnd 5540594 -MimeMessageEnd 5540594 -Octets 557 -Lines 18 -MimeEntityEnd 5540594 -MultipartBoundaryBegin 5540594 -MultipartBoundaryEnd 5540628 -MimeEntityBegin 5540628 -MimeEntityHeadersEnd 5540630 -MimeMessageBegin 5540630 -MimeEntityBegin 5540630 -MimeEntityHeadersEnd 5540749 -MimeMessageHeadersEnd 5540749 -Octets 149 -Lines 4 -MimeEntityEnd 5540898 -MimeMessageEnd 5540898 -Octets 268 -Lines 8 -MimeEntityEnd 5540898 -MultipartBoundaryBegin 5540898 -MultipartBoundaryEnd 5540932 -MimeEntityBegin 5540932 -MimeEntityHeadersEnd 5540934 -MimeMessageBegin 5540934 -MimeEntityBegin 5540934 -MimeEntityHeadersEnd 5541063 -MimeMessageHeadersEnd 5541063 -Octets 186 -Lines 7 -MimeEntityEnd 5541249 -MimeMessageEnd 5541249 -Octets 315 -Lines 11 -MimeEntityEnd 5541249 -MultipartBoundaryBegin 5541249 -MultipartBoundaryEnd 5541283 -MimeEntityBegin 5541283 -MimeEntityHeadersEnd 5541285 -MimeMessageBegin 5541285 -MimeEntityBegin 5541285 -MimeEntityHeadersEnd 5541419 -MimeMessageHeadersEnd 5541419 -Octets 730 -Lines 14 -MimeEntityEnd 5542149 -MimeMessageEnd 5542149 -Octets 864 -Lines 18 -MimeEntityEnd 5542149 -MultipartBoundaryBegin 5542149 -MultipartBoundaryEnd 5542183 -MimeEntityBegin 5542183 -MimeEntityHeadersEnd 5542185 -MimeMessageBegin 5542185 -MimeEntityBegin 5542185 -MimeEntityHeadersEnd 5542335 -MimeMessageHeadersEnd 5542335 -Octets 983 -Lines 26 -MimeEntityEnd 5543318 -MimeMessageEnd 5543318 -Octets 1133 -Lines 30 -MimeEntityEnd 5543318 -MultipartBoundaryBegin 5543318 -MultipartBoundaryEnd 5543352 -MimeEntityBegin 5543352 -MimeEntityHeadersEnd 5543354 -MimeMessageBegin 5543354 -MimeEntityBegin 5543354 -MimeEntityHeadersEnd 5543492 -MimeMessageHeadersEnd 5543492 -Octets 254 -Lines 7 -MimeEntityEnd 5543746 -MimeMessageEnd 5543746 -Octets 392 -Lines 11 -MimeEntityEnd 5543746 -MultipartBoundaryBegin 5543746 -MultipartBoundaryEnd 5543780 -MimeEntityBegin 5543780 -MimeEntityHeadersEnd 5543782 -MimeMessageBegin 5543782 -MimeEntityBegin 5543782 -MimeEntityHeadersEnd 5543908 -MimeMessageHeadersEnd 5543908 -Octets 133 -Lines 6 -MimeEntityEnd 5544041 -MimeMessageEnd 5544041 -Octets 259 -Lines 10 -MimeEntityEnd 5544041 -MultipartBoundaryBegin 5544041 -MultipartBoundaryEnd 5544075 -MimeEntityBegin 5544075 -MimeEntityHeadersEnd 5544077 -MimeMessageBegin 5544077 -MimeEntityBegin 5544077 -MimeEntityHeadersEnd 5544257 -MimeMessageHeadersEnd 5544257 -Octets 761 -Lines 16 -MimeEntityEnd 5545018 -MimeMessageEnd 5545018 -Octets 941 -Lines 21 -MimeEntityEnd 5545018 -MultipartBoundaryBegin 5545018 -MultipartBoundaryEnd 5545052 -MimeEntityBegin 5545052 -MimeEntityHeadersEnd 5545054 -MimeMessageBegin 5545054 -MimeEntityBegin 5545054 -MimeEntityHeadersEnd 5545218 -MimeMessageHeadersEnd 5545218 -Octets 415 -Lines 16 -MimeEntityEnd 5545633 -MimeMessageEnd 5545633 -Octets 579 -Lines 20 -MimeEntityEnd 5545633 -MultipartBoundaryBegin 5545633 -MultipartBoundaryEnd 5545667 -MimeEntityBegin 5545667 -MimeEntityHeadersEnd 5545669 -MimeMessageBegin 5545669 -MimeEntityBegin 5545669 -MimeEntityHeadersEnd 5545805 -MimeMessageHeadersEnd 5545805 -Octets 1308 -Lines 21 -MimeEntityEnd 5547113 -MimeMessageEnd 5547113 -Octets 1444 -Lines 25 -MimeEntityEnd 5547113 -MultipartBoundaryBegin 5547113 -MultipartBoundaryEnd 5547147 -MimeEntityBegin 5547147 -MimeEntityHeadersEnd 5547149 -MimeMessageBegin 5547149 -MimeEntityBegin 5547149 -MimeEntityHeadersEnd 5547259 -MimeMessageHeadersEnd 5547259 -Octets 149 -Lines 6 -MimeEntityEnd 5547408 -MimeMessageEnd 5547408 -Octets 259 -Lines 10 -MimeEntityEnd 5547408 -MultipartBoundaryBegin 5547408 -MultipartBoundaryEnd 5547442 -MimeEntityBegin 5547442 -MimeEntityHeadersEnd 5547444 -MimeMessageBegin 5547444 -MimeEntityBegin 5547444 -MimeEntityHeadersEnd 5547585 -MimeMessageHeadersEnd 5547585 -Octets 310 -Lines 11 -MimeEntityEnd 5547895 -MimeMessageEnd 5547895 -Octets 451 -Lines 15 -MimeEntityEnd 5547895 -MultipartBoundaryBegin 5547895 -MultipartBoundaryEnd 5547929 -MimeEntityBegin 5547929 -MimeEntityHeadersEnd 5547931 -MimeMessageBegin 5547931 -MimeEntityBegin 5547931 -MimeEntityHeadersEnd 5548061 -MimeMessageHeadersEnd 5548061 -Octets 193 -Lines 6 -MimeEntityEnd 5548254 -MimeMessageEnd 5548254 -Octets 323 -Lines 10 -MimeEntityEnd 5548254 -MultipartBoundaryBegin 5548254 -MultipartBoundaryEnd 5548288 -MimeEntityBegin 5548288 -MimeEntityHeadersEnd 5548290 -MimeMessageBegin 5548290 -MimeEntityBegin 5548290 -MimeEntityHeadersEnd 5548399 -MimeMessageHeadersEnd 5548399 -Octets 410 -Lines 12 -MimeEntityEnd 5548809 -MimeMessageEnd 5548809 -Octets 519 -Lines 16 -MimeEntityEnd 5548809 -MultipartBoundaryBegin 5548809 -MultipartBoundaryEnd 5548843 -MimeEntityBegin 5548843 -MimeEntityHeadersEnd 5548845 -MimeMessageBegin 5548845 -MimeEntityBegin 5548845 -MimeEntityHeadersEnd 5548983 -MimeMessageHeadersEnd 5548983 -Octets 310 -Lines 8 -MimeEntityEnd 5549293 -MimeMessageEnd 5549293 -Octets 448 -Lines 12 -MimeEntityEnd 5549293 -MultipartBoundaryBegin 5549293 -MultipartBoundaryEnd 5549327 -MimeEntityBegin 5549327 -MimeEntityHeadersEnd 5549329 -MimeMessageBegin 5549329 -MimeEntityBegin 5549329 -MimeEntityHeadersEnd 5549476 -MimeMessageHeadersEnd 5549476 -Octets 635 -Lines 17 -MimeEntityEnd 5550111 -MimeMessageEnd 5550111 -Octets 782 -Lines 21 -MimeEntityEnd 5550111 -MultipartBoundaryBegin 5550111 -MultipartBoundaryEnd 5550145 -MimeEntityBegin 5550145 -MimeEntityHeadersEnd 5550147 -MimeMessageBegin 5550147 -MimeEntityBegin 5550147 -MimeEntityHeadersEnd 5550304 -MimeMessageHeadersEnd 5550304 -Octets 485 -Lines 10 -MimeEntityEnd 5550789 -MimeMessageEnd 5550789 -Octets 642 -Lines 14 -MimeEntityEnd 5550789 -MultipartBoundaryBegin 5550789 -MultipartBoundaryEnd 5550823 -MimeEntityBegin 5550823 -MimeEntityHeadersEnd 5550825 -MimeMessageBegin 5550825 -MimeEntityBegin 5550825 -MimeEntityHeadersEnd 5550962 -MimeMessageHeadersEnd 5550962 -Octets 1199 -Lines 27 -MimeEntityEnd 5552161 -MimeMessageEnd 5552161 -Octets 1336 -Lines 31 -MimeEntityEnd 5552161 -MultipartBoundaryBegin 5552161 -MultipartBoundaryEnd 5552195 -MimeEntityBegin 5552195 -MimeEntityHeadersEnd 5552197 -MimeMessageBegin 5552197 -MimeEntityBegin 5552197 -MimeEntityHeadersEnd 5552377 -MimeMessageHeadersEnd 5552377 -Octets 267 -Lines 8 -MimeEntityEnd 5552644 -MimeMessageEnd 5552644 -Octets 447 -Lines 12 -MimeEntityEnd 5552644 -MultipartBoundaryBegin 5552644 -MultipartBoundaryEnd 5552678 -MimeEntityBegin 5552678 -MimeEntityHeadersEnd 5552680 -MimeMessageBegin 5552680 -MimeEntityBegin 5552680 -MimeEntityHeadersEnd 5552799 -MimeMessageHeadersEnd 5552799 -Octets 197 -Lines 4 -MimeEntityEnd 5552996 -MimeMessageEnd 5552996 -Octets 316 -Lines 8 -MimeEntityEnd 5552996 -MultipartBoundaryBegin 5552996 -MultipartBoundaryEnd 5553030 -MimeEntityBegin 5553030 -MimeEntityHeadersEnd 5553032 -MimeMessageBegin 5553032 -MimeEntityBegin 5553032 -MimeEntityHeadersEnd 5553176 -MimeMessageHeadersEnd 5553176 -Octets 889 -Lines 24 -MimeEntityEnd 5554065 -MimeMessageEnd 5554065 -Octets 1033 -Lines 28 -MimeEntityEnd 5554065 -MultipartBoundaryBegin 5554065 -MultipartBoundaryEnd 5554099 -MimeEntityBegin 5554099 -MimeEntityHeadersEnd 5554101 -MimeMessageBegin 5554101 -MimeEntityBegin 5554101 -MimeEntityHeadersEnd 5554230 -MimeMessageHeadersEnd 5554230 -Octets 725 -Lines 11 -MimeEntityEnd 5554955 -MimeMessageEnd 5554955 -Octets 854 -Lines 15 -MimeEntityEnd 5554955 -MultipartBoundaryBegin 5554955 -MultipartBoundaryEnd 5554989 -MimeEntityBegin 5554989 -MimeEntityHeadersEnd 5554991 -MimeMessageBegin 5554991 -MimeEntityBegin 5554991 -MimeEntityHeadersEnd 5555107 -MimeMessageHeadersEnd 5555107 -Octets 720 -Lines 17 -MimeEntityEnd 5555827 -MimeMessageEnd 5555827 -Octets 836 -Lines 21 -MimeEntityEnd 5555827 -MultipartBoundaryBegin 5555827 -MultipartBoundaryEnd 5555861 -MimeEntityBegin 5555861 -MimeEntityHeadersEnd 5555863 -MimeMessageBegin 5555863 -MimeEntityBegin 5555863 -MimeEntityHeadersEnd 5555999 -MimeMessageHeadersEnd 5555999 -Octets 391 -Lines 11 -MimeEntityEnd 5556390 -MimeMessageEnd 5556390 -Octets 527 -Lines 15 -MimeEntityEnd 5556390 -MultipartBoundaryBegin 5556390 -MultipartBoundaryEnd 5556424 -MimeEntityBegin 5556424 -MimeEntityHeadersEnd 5556426 -MimeMessageBegin 5556426 -MimeEntityBegin 5556426 -MimeEntityHeadersEnd 5556566 -MimeMessageHeadersEnd 5556566 -Octets 1001 -Lines 24 -MimeEntityEnd 5557567 -MimeMessageEnd 5557567 -Octets 1141 -Lines 28 -MimeEntityEnd 5557567 -MultipartBoundaryBegin 5557567 -MultipartBoundaryEnd 5557601 -MimeEntityBegin 5557601 -MimeEntityHeadersEnd 5557603 -MimeMessageBegin 5557603 -MimeEntityBegin 5557603 -MimeEntityHeadersEnd 5557752 -MimeMessageHeadersEnd 5557752 -Octets 477 -Lines 10 -MimeEntityEnd 5558229 -MimeMessageEnd 5558229 -Octets 626 -Lines 14 -MimeEntityEnd 5558229 -MultipartBoundaryBegin 5558229 -MultipartBoundaryEnd 5558263 -MimeEntityBegin 5558263 -MimeEntityHeadersEnd 5558265 -MimeMessageBegin 5558265 -MimeEntityBegin 5558265 -MimeEntityHeadersEnd 5558402 -MimeMessageHeadersEnd 5558402 -Octets 289 -Lines 10 -MimeEntityEnd 5558691 -MimeMessageEnd 5558691 -Octets 426 -Lines 14 -MimeEntityEnd 5558691 -MultipartBoundaryBegin 5558691 -MultipartBoundaryEnd 5558725 -MimeEntityBegin 5558725 -MimeEntityHeadersEnd 5558727 -MimeMessageBegin 5558727 -MimeEntityBegin 5558727 -MimeEntityHeadersEnd 5558856 -MimeMessageHeadersEnd 5558856 -Octets 286 -Lines 4 -MimeEntityEnd 5559142 -MimeMessageEnd 5559142 -Octets 415 -Lines 8 -MimeEntityEnd 5559142 -MultipartBoundaryBegin 5559142 -MultipartBoundaryEnd 5559176 -MimeEntityBegin 5559176 -MimeEntityHeadersEnd 5559178 -MimeMessageBegin 5559178 -MimeEntityBegin 5559178 -MimeEntityHeadersEnd 5559303 -MimeMessageHeadersEnd 5559303 -Octets 670 -Lines 27 -MimeEntityEnd 5559973 -MimeMessageEnd 5559973 -Octets 795 -Lines 31 -MimeEntityEnd 5559973 -MultipartBoundaryBegin 5559973 -MultipartBoundaryEnd 5560007 -MimeEntityBegin 5560007 -MimeEntityHeadersEnd 5560009 -MimeMessageBegin 5560009 -MimeEntityBegin 5560009 -MimeEntityHeadersEnd 5560157 -MimeMessageHeadersEnd 5560157 -Octets 2304 -Lines 46 -MimeEntityEnd 5562461 -MimeMessageEnd 5562461 -Octets 2452 -Lines 50 -MimeEntityEnd 5562461 -MultipartBoundaryBegin 5562461 -MultipartBoundaryEnd 5562495 -MimeEntityBegin 5562495 -MimeEntityHeadersEnd 5562497 -MimeMessageBegin 5562497 -MimeEntityBegin 5562497 -MimeEntityHeadersEnd 5562623 -MimeMessageHeadersEnd 5562623 -Octets 809 -Lines 17 -MimeEntityEnd 5563432 -MimeMessageEnd 5563432 -Octets 935 -Lines 21 -MimeEntityEnd 5563432 -MultipartBoundaryBegin 5563432 -MultipartBoundaryEnd 5563466 -MimeEntityBegin 5563466 -MimeEntityHeadersEnd 5563468 -MimeMessageBegin 5563468 -MimeEntityBegin 5563468 -MimeEntityHeadersEnd 5563566 -MimeMessageHeadersEnd 5563566 -Octets 236 -Lines 10 -MimeEntityEnd 5563802 -MimeMessageEnd 5563802 -Octets 334 -Lines 14 -MimeEntityEnd 5563802 -MultipartBoundaryBegin 5563802 -MultipartBoundaryEnd 5563836 -MimeEntityBegin 5563836 -MimeEntityHeadersEnd 5563838 -MimeMessageBegin 5563838 -MimeEntityBegin 5563838 -MimeEntityHeadersEnd 5563963 -MimeMessageHeadersEnd 5563963 -Octets 688 -Lines 20 -MimeEntityEnd 5564651 -MimeMessageEnd 5564651 -Octets 813 -Lines 24 -MimeEntityEnd 5564651 -MultipartBoundaryBegin 5564651 -MultipartBoundaryEnd 5564685 -MimeEntityBegin 5564685 -MimeEntityHeadersEnd 5564687 -MimeMessageBegin 5564687 -MimeEntityBegin 5564687 -MimeEntityHeadersEnd 5564801 -MimeMessageHeadersEnd 5564801 -Octets 2615 -Lines 68 -MimeEntityEnd 5567416 -MimeMessageEnd 5567416 -Octets 2729 -Lines 72 -MimeEntityEnd 5567416 -MultipartBoundaryBegin 5567416 -MultipartBoundaryEnd 5567450 -MimeEntityBegin 5567450 -MimeEntityHeadersEnd 5567452 -MimeMessageBegin 5567452 -MimeEntityBegin 5567452 -MimeEntityHeadersEnd 5567562 -MimeMessageHeadersEnd 5567562 -Octets 1243 -Lines 34 -MimeEntityEnd 5568805 -MimeMessageEnd 5568805 -Octets 1353 -Lines 38 -MimeEntityEnd 5568805 -MultipartBoundaryBegin 5568805 -MultipartBoundaryEnd 5568839 -MimeEntityBegin 5568839 -MimeEntityHeadersEnd 5568841 -MimeMessageBegin 5568841 -MimeEntityBegin 5568841 -MimeEntityHeadersEnd 5568951 -MimeMessageHeadersEnd 5568951 -Octets 1840 -Lines 43 -MimeEntityEnd 5570791 -MimeMessageEnd 5570791 -Octets 1950 -Lines 47 -MimeEntityEnd 5570791 -MultipartBoundaryBegin 5570791 -MultipartBoundaryEnd 5570825 -MimeEntityBegin 5570825 -MimeEntityHeadersEnd 5570827 -MimeMessageBegin 5570827 -MimeEntityBegin 5570827 -MimeEntityHeadersEnd 5570960 -MimeMessageHeadersEnd 5570960 -Octets 582 -Lines 12 -MimeEntityEnd 5571542 -MimeMessageEnd 5571542 -Octets 715 -Lines 16 -MimeEntityEnd 5571542 -MultipartBoundaryBegin 5571542 -MultipartBoundaryEnd 5571576 -MimeEntityBegin 5571576 -MimeEntityHeadersEnd 5571578 -MimeMessageBegin 5571578 -MimeEntityBegin 5571578 -MimeEntityHeadersEnd 5571670 -MimeMessageHeadersEnd 5571670 -Octets 1354 -Lines 20 -MimeEntityEnd 5573024 -MimeMessageEnd 5573024 -Octets 1446 -Lines 24 -MimeEntityEnd 5573024 -MultipartBoundaryBegin 5573024 -MultipartBoundaryEnd 5573058 -MimeEntityBegin 5573058 -MimeEntityHeadersEnd 5573060 -MimeMessageBegin 5573060 -MimeEntityBegin 5573060 -MimeEntityHeadersEnd 5573180 -MimeMessageHeadersEnd 5573180 -Octets 2176 -Lines 49 -MimeEntityEnd 5575356 -MimeMessageEnd 5575356 -Octets 2296 -Lines 53 -MimeEntityEnd 5575356 -MultipartBoundaryBegin 5575356 -MultipartBoundaryEnd 5575390 -MimeEntityBegin 5575390 -MimeEntityHeadersEnd 5575392 -MimeMessageBegin 5575392 -MimeEntityBegin 5575392 -MimeEntityHeadersEnd 5575517 -MimeMessageHeadersEnd 5575517 -Octets 2063 -Lines 42 -MimeEntityEnd 5577580 -MimeMessageEnd 5577580 -Octets 2188 -Lines 46 -MimeEntityEnd 5577580 -MultipartBoundaryBegin 5577580 -MultipartBoundaryEnd 5577614 -MimeEntityBegin 5577614 -MimeEntityHeadersEnd 5577616 -MimeMessageBegin 5577616 -MimeEntityBegin 5577616 -MimeEntityHeadersEnd 5577741 -MimeMessageHeadersEnd 5577741 -Octets 696 -Lines 19 -MimeEntityEnd 5578437 -MimeMessageEnd 5578437 -Octets 821 -Lines 23 -MimeEntityEnd 5578437 -MultipartBoundaryBegin 5578437 -MultipartBoundaryEnd 5578471 -MimeEntityBegin 5578471 -MimeEntityHeadersEnd 5578473 -MimeMessageBegin 5578473 -MimeEntityBegin 5578473 -MimeEntityHeadersEnd 5578614 -MimeMessageHeadersEnd 5578614 -Octets 836 -Lines 16 -MimeEntityEnd 5579450 -MimeMessageEnd 5579450 -Octets 977 -Lines 20 -MimeEntityEnd 5579450 -MultipartBoundaryBegin 5579450 -MultipartBoundaryEnd 5579484 -MimeEntityBegin 5579484 -MimeEntityHeadersEnd 5579486 -MimeMessageBegin 5579486 -MimeEntityBegin 5579486 -MimeEntityHeadersEnd 5579614 -MimeMessageHeadersEnd 5579614 -Octets 745 -Lines 21 -MimeEntityEnd 5580359 -MimeMessageEnd 5580359 -Octets 873 -Lines 25 -MimeEntityEnd 5580359 -MultipartBoundaryBegin 5580359 -MultipartBoundaryEnd 5580393 -MimeEntityBegin 5580393 -MimeEntityHeadersEnd 5580395 -MimeMessageBegin 5580395 -MimeEntityBegin 5580395 -MimeEntityHeadersEnd 5580501 -MimeMessageHeadersEnd 5580501 -Octets 756 -Lines 16 -MimeEntityEnd 5581257 -MimeMessageEnd 5581257 -Octets 862 -Lines 20 -MimeEntityEnd 5581257 -MultipartBoundaryBegin 5581257 -MultipartBoundaryEnd 5581291 -MimeEntityBegin 5581291 -MimeEntityHeadersEnd 5581293 -MimeMessageBegin 5581293 -MimeEntityBegin 5581293 -MimeEntityHeadersEnd 5581454 -MimeMessageHeadersEnd 5581454 -Octets 366 -Lines 7 -MimeEntityEnd 5581820 -MimeMessageEnd 5581820 -Octets 527 -Lines 12 -MimeEntityEnd 5581820 -MultipartBoundaryBegin 5581820 -MultipartBoundaryEnd 5581854 -MimeEntityBegin 5581854 -MimeEntityHeadersEnd 5581856 -MimeMessageBegin 5581856 -MimeEntityBegin 5581856 -MimeEntityHeadersEnd 5581947 -MimeMessageHeadersEnd 5581947 -Octets 650 -Lines 15 -MimeEntityEnd 5582597 -MimeMessageEnd 5582597 -Octets 741 -Lines 19 -MimeEntityEnd 5582597 -MultipartBoundaryBegin 5582597 -MultipartBoundaryEnd 5582631 -MimeEntityBegin 5582631 -MimeEntityHeadersEnd 5582633 -MimeMessageBegin 5582633 -MimeEntityBegin 5582633 -MimeEntityHeadersEnd 5582786 -MimeMessageHeadersEnd 5582786 -Octets 383 -Lines 17 -MimeEntityEnd 5583169 -MimeMessageEnd 5583169 -Octets 536 -Lines 21 -MimeEntityEnd 5583169 -MultipartBoundaryBegin 5583169 -MultipartBoundaryEnd 5583203 -MimeEntityBegin 5583203 -MimeEntityHeadersEnd 5583205 -MimeMessageBegin 5583205 -MimeEntityBegin 5583205 -MimeEntityHeadersEnd 5583310 -MimeMessageHeadersEnd 5583310 -Octets 294 -Lines 6 -MimeEntityEnd 5583604 -MimeMessageEnd 5583604 -Octets 399 -Lines 10 -MimeEntityEnd 5583604 -MultipartBoundaryBegin 5583604 -MultipartBoundaryEnd 5583638 -MimeEntityBegin 5583638 -MimeEntityHeadersEnd 5583640 -MimeMessageBegin 5583640 -MimeEntityBegin 5583640 -MimeEntityHeadersEnd 5583772 -MimeMessageHeadersEnd 5583772 -Octets 495 -Lines 16 -MimeEntityEnd 5584267 -MimeMessageEnd 5584267 -Octets 627 -Lines 20 -MimeEntityEnd 5584267 -MultipartBoundaryBegin 5584267 -MultipartBoundaryEnd 5584301 -MimeEntityBegin 5584301 -MimeEntityHeadersEnd 5584303 -MimeMessageBegin 5584303 -MimeEntityBegin 5584303 -MimeEntityHeadersEnd 5584404 -MimeMessageHeadersEnd 5584404 -Octets 399 -Lines 19 -MimeEntityEnd 5584803 -MimeMessageEnd 5584803 -Octets 500 -Lines 23 -MimeEntityEnd 5584803 -MultipartBoundaryBegin 5584803 -MultipartBoundaryEnd 5584837 -MimeEntityBegin 5584837 -MimeEntityHeadersEnd 5584839 -MimeMessageBegin 5584839 -MimeEntityBegin 5584839 -MimeEntityHeadersEnd 5584958 -MimeMessageHeadersEnd 5584958 -Octets 1345 -Lines 26 -MimeEntityEnd 5586303 -MimeMessageEnd 5586303 -Octets 1464 -Lines 30 -MimeEntityEnd 5586303 -MultipartBoundaryBegin 5586303 -MultipartBoundaryEnd 5586337 -MimeEntityBegin 5586337 -MimeEntityHeadersEnd 5586339 -MimeMessageBegin 5586339 -MimeEntityBegin 5586339 -MimeEntityHeadersEnd 5586443 -MimeMessageHeadersEnd 5586443 -Octets 304 -Lines 9 -MimeEntityEnd 5586747 -MimeMessageEnd 5586747 -Octets 408 -Lines 13 -MimeEntityEnd 5586747 -MultipartBoundaryBegin 5586747 -MultipartBoundaryEnd 5586781 -MimeEntityBegin 5586781 -MimeEntityHeadersEnd 5586783 -MimeMessageBegin 5586783 -MimeEntityBegin 5586783 -MimeEntityHeadersEnd 5586930 -MimeMessageHeadersEnd 5586930 -Octets 1055 -Lines 36 -MimeEntityEnd 5587985 -MimeMessageEnd 5587985 -Octets 1202 -Lines 40 -MimeEntityEnd 5587985 -MultipartEndBoundaryBegin 5587985 -MultipartEndBoundaryEnd 5588019 -MultipartEpilogueBegin 5588019 -MultipartEpilogueEnd 5588021 -Octets 66055 -Lines 1845 -MimeEntityEnd 5588021 -MultipartEndBoundaryBegin 5588021 -MultipartEndBoundaryEnd 5588042 -MultipartEpilogueBegin 5588042 -MultipartEpilogueEnd 5588100 -Octets 70738 -Lines 1958 -MimeEntityEnd 5588100 -MimeMessageEnd 5588100 -MboxMarkerBegin 5588102 -MboxMarkerEnd 5588111 -MimeMessageBegin 5588111 -MimeEntityBegin 5588111 -MimeEntityHeadersEnd 5588934 -MimeMessageHeadersEnd 5588934 -Octets 1919 -Lines 49 -MimeEntityEnd 5590853 -MimeMessageEnd 5590853 -MboxMarkerBegin 5590855 -MboxMarkerEnd 5590864 -MimeMessageBegin 5590864 -MimeEntityBegin 5590864 -MimeEntityHeadersEnd 5591607 -MimeMessageHeadersEnd 5591607 -MultipartPreambleBegin 5591607 -MultipartPreambleEnd 5591607 -MultipartBoundaryBegin 5591607 -MultipartBoundaryEnd 5591635 -MimeEntityBegin 5591635 -MimeEntityHeadersEnd 5591637 -Octets 113 -Lines 2 -MimeEntityEnd 5591750 -MultipartBoundaryBegin 5591750 -MultipartBoundaryEnd 5591780 -MimeEntityBegin 5591780 -MimeEntityHeadersEnd 5591872 -Octets 132703 -Lines 2012 -MimeEntityEnd 5724575 -MultipartBoundaryBegin 5724575 -MultipartBoundaryEnd 5724605 -MimeEntityBegin 5724605 -MimeEntityHeadersEnd 5724607 -Octets 56 -Lines 2 -MimeEntityEnd 5724663 -MultipartBoundaryBegin 5724663 -MultipartBoundaryEnd 5724693 -MimeEntityBegin 5724693 -MimeEntityHeadersEnd 5724843 -Octets 14974 -Lines 78 -MimeEntityEnd 5739817 -MultipartBoundaryBegin 5739817 -MultipartBoundaryEnd 5739847 -MimeEntityBegin 5739847 -MimeEntityHeadersEnd 5739849 -Octets 95 -Lines 6 -MimeEntityEnd 5739944 -MultipartBoundaryBegin 5739944 -MultipartBoundaryEnd 5739974 -MimeEntityBegin 5739974 -MimeEntityHeadersEnd 5740124 -Octets 8142 -Lines 42 -MimeEntityEnd 5748266 -MultipartBoundaryBegin 5748266 -MultipartBoundaryEnd 5748296 -MimeEntityBegin 5748296 -MimeEntityHeadersEnd 5748298 -Octets 77 -Lines 4 -MimeEntityEnd 5748375 -MultipartEndBoundaryBegin 5748375 -MultipartEndBoundaryEnd 5748405 -MultipartEpilogueBegin 5748405 -MultipartEpilogueEnd 5748407 -Octets 156800 -Lines 2171 -MimeEntityEnd 5748407 -MimeMessageEnd 5748407 -MboxMarkerBegin 5748409 -MboxMarkerEnd 5748418 -MimeMessageBegin 5748418 -MimeEntityBegin 5748418 -MimeEntityHeadersEnd 5748956 -MimeMessageHeadersEnd 5748956 -Octets 589 -Lines 21 -MimeEntityEnd 5749545 -MimeMessageEnd 5749545 -MboxMarkerBegin 5749547 -MboxMarkerEnd 5749556 -MimeMessageBegin 5749556 -MimeEntityBegin 5749556 -MimeEntityHeadersEnd 5750765 -MimeMessageHeadersEnd 5750765 -MultipartPreambleBegin 5750765 -MultipartPreambleEnd 5750923 -MultipartBoundaryBegin 5750923 -MultipartBoundaryEnd 5750964 -MimeEntityBegin 5750964 -MimeEntityHeadersEnd 5751010 -Octets 756 -Lines 26 -MimeEntityEnd 5751766 -MultipartBoundaryBegin 5751766 -MultipartBoundaryEnd 5751809 -MimeEntityBegin 5751809 -MimeEntityHeadersEnd 5751897 -MultipartPreambleBegin 5751897 -MultipartPreambleEnd 5751897 -MultipartBoundaryBegin 5751897 -MultipartBoundaryEnd 5751940 -MimeEntityBegin 5751940 -MimeEntityHeadersEnd 5752034 -Octets 827 -Lines 25 -MimeEntityEnd 5752861 -MultipartBoundaryBegin 5752861 -MultipartBoundaryEnd 5752906 -MimeEntityBegin 5752906 -MimeEntityHeadersEnd 5753003 -Octets 58626 -Lines 755 -MimeEntityEnd 5811629 -MultipartBoundaryBegin 5811629 -MultipartBoundaryEnd 5811674 -MimeEntityBegin 5811674 -MimeEntityHeadersEnd 5811768 -Octets 6 -Lines 1 -MimeEntityEnd 5811774 -MultipartEndBoundaryBegin 5811774 -MultipartEndBoundaryEnd 5811819 -MultipartEpilogueBegin 5811819 -MultipartEpilogueEnd 5811821 -Octets 59924 -Lines 798 -MimeEntityEnd 5811821 -MultipartEndBoundaryBegin 5811821 -MultipartEndBoundaryEnd 5811864 -MultipartEpilogueBegin 5811864 -MultipartEpilogueEnd 5811866 -Octets 61101 -Lines 837 -MimeEntityEnd 5811866 -MimeMessageEnd 5811866 -MboxMarkerBegin 5811868 -MboxMarkerEnd 5811877 -MimeMessageBegin 5811877 -MimeEntityBegin 5811877 -MimeEntityHeadersEnd 5812634 -MimeMessageHeadersEnd 5812634 -MultipartPreambleBegin 5812634 -MultipartPreambleEnd 5812636 -MultipartBoundaryBegin 5812636 -MultipartBoundaryEnd 5812686 -MimeEntityBegin 5812686 -MimeEntityHeadersEnd 5812779 -Octets 181 -Lines 7 -MimeEntityEnd 5812960 -MultipartBoundaryBegin 5812960 -MultipartBoundaryEnd 5813012 -MimeEntityBegin 5813012 -MimeEntityHeadersEnd 5813074 -Octets 56004 -Lines 757 -MimeEntityEnd 5869078 -MultipartEndBoundaryBegin 5869078 -MultipartEndBoundaryEnd 5869130 -MultipartEpilogueBegin 5869130 -MultipartEpilogueEnd 5869132 -Octets 56498 -Lines 775 -MimeEntityEnd 5869132 -MimeMessageEnd 5869132 -MboxMarkerBegin 5869134 -MboxMarkerEnd 5869167 -MimeMessageBegin 5869167 -MimeEntityBegin 5869167 -MimeEntityHeadersEnd 5870664 -MimeMessageHeadersEnd 5870664 -Octets 1374 -Lines 34 -MimeEntityEnd 5872038 -MimeMessageEnd 5872038 -MboxMarkerBegin 5872040 -MboxMarkerEnd 5872049 -MimeMessageBegin 5872049 -MimeEntityBegin 5872049 -MimeEntityHeadersEnd 5872857 -MimeMessageHeadersEnd 5872857 -MultipartPreambleBegin 5872857 -MultipartPreambleEnd 5872905 -MultipartBoundaryBegin 5872905 -MultipartBoundaryEnd 5872931 -MimeEntityBegin 5872931 -MimeEntityHeadersEnd 5873010 -Octets 383 -Lines 13 -MimeEntityEnd 5873393 -MultipartBoundaryBegin 5873393 -MultipartBoundaryEnd 5873421 -MimeEntityBegin 5873421 -MimeEntityHeadersEnd 5873515 -MimeMessageBegin 5873515 -MimeEntityBegin 5873515 -MimeEntityHeadersEnd 5874597 -MimeMessageHeadersEnd 5874597 -Octets 24858 -Lines 463 -MimeEntityEnd 5899455 -MimeMessageEnd 5899455 -Octets 25940 -Lines 477 -MimeEntityEnd 5899455 -MultipartEndBoundaryBegin 5899455 -MultipartEndBoundaryEnd 5899483 -MultipartEpilogueBegin 5899483 -MultipartEpilogueEnd 5899485 -Octets 26628 -Lines 504 -MimeEntityEnd 5899485 -MimeMessageEnd 5899485 -MboxMarkerBegin 5899487 -MboxMarkerEnd 5899496 -MimeMessageBegin 5899496 -MimeEntityBegin 5899496 -MimeEntityHeadersEnd 5900178 -MimeMessageHeadersEnd 5900178 -MultipartPreambleBegin 5900178 -MultipartPreambleEnd 5900226 -MultipartBoundaryBegin 5900226 -MultipartBoundaryEnd 5900275 -MimeEntityBegin 5900275 -MimeEntityHeadersEnd 5900356 -Octets 35 -Lines 1 -MimeEntityEnd 5900391 -MultipartBoundaryBegin 5900391 -MultipartBoundaryEnd 5900442 -MimeEntityBegin 5900442 -MimeEntityHeadersEnd 5900504 -Octets 22454 -Lines 304 -MimeEntityEnd 5922958 -MultipartEndBoundaryBegin 5922958 -MultipartEndBoundaryEnd 5923009 -MultipartEpilogueBegin 5923009 -MultipartEpilogueEnd 5923009 -Octets 22831 -Lines 317 -MimeEntityEnd 5923009 -MimeMessageEnd 5923009 -MboxMarkerBegin 5923011 -MboxMarkerEnd 5923044 -MimeMessageBegin 5923044 -MimeEntityBegin 5923044 -MimeEntityHeadersEnd 5923581 -MimeMessageHeadersEnd 5923581 -MultipartPreambleBegin 5923581 -MultipartPreambleEnd 5923581 -MultipartBoundaryBegin 5923581 -MultipartBoundaryEnd 5923590 -MimeEntityBegin 5923590 -MimeEntityHeadersEnd 5923636 -Octets 1193 -Lines 21 -MimeEntityEnd 5924829 -MultipartBoundaryBegin 5924829 -MultipartBoundaryEnd 5924840 -MimeEntityBegin 5924840 -MimeEntityHeadersEnd 5924970 -Octets 148 -Lines 3 -MimeEntityEnd 5925118 -MultipartBoundaryBegin 5925118 -MultipartBoundaryEnd 5925129 -MimeEntityBegin 5925129 -MimeEntityHeadersEnd 5925249 -Octets 196 -Lines 3 -MimeEntityEnd 5925445 -MultipartEndBoundaryBegin 5925445 -MultipartEndBoundaryEnd 5925456 -MultipartEpilogueBegin 5925456 -MultipartEpilogueEnd 5925456 -Octets 1875 -Lines 42 -MimeEntityEnd 5925456 -MimeMessageEnd 5925456 -MboxMarkerBegin 5925458 -MboxMarkerEnd 5925467 -MimeMessageBegin 5925467 -MimeEntityBegin 5925467 -MimeEntityHeadersEnd 5926279 -MimeMessageHeadersEnd 5926279 -Octets 260296 -Lines 3518 -MimeEntityEnd 6186575 -MimeMessageEnd 6186575 -MboxMarkerBegin 6186577 -MboxMarkerEnd 6186586 -MimeMessageBegin 6186586 -MimeEntityBegin 6186586 -MimeEntityHeadersEnd 6187457 -MimeMessageHeadersEnd 6187457 -MultipartPreambleBegin 6187457 -MultipartPreambleEnd 6187459 -MultipartBoundaryBegin 6187459 -MultipartBoundaryEnd 6187474 -MimeEntityBegin 6187474 -MimeEntityHeadersEnd 6187554 -Octets 198 -Lines 9 -MimeEntityEnd 6187752 -MultipartBoundaryBegin 6187752 -MultipartBoundaryEnd 6187769 -MimeEntityBegin 6187769 -MimeEntityHeadersEnd 6187877 -Octets 99522 -Lines 1276 -MimeEntityEnd 6287399 -MultipartEndBoundaryBegin 6287399 -MultipartEndBoundaryEnd 6287416 -MultipartEpilogueBegin 6287416 -MultipartEpilogueEnd 6287418 -Octets 99961 -Lines 1296 -MimeEntityEnd 6287418 -MimeMessageEnd 6287418 -MboxMarkerBegin 6287420 -MboxMarkerEnd 6287429 -MimeMessageBegin 6287429 -MimeEntityBegin 6287429 -MimeEntityHeadersEnd 6288325 -MimeMessageHeadersEnd 6288325 -MultipartPreambleBegin 6288325 -MultipartPreambleEnd 6288325 -MultipartBoundaryBegin 6288325 -MultipartBoundaryEnd 6288335 -MimeEntityBegin 6288335 -MimeEntityHeadersEnd 6288383 -Octets 964 -Lines 21 -MimeEntityEnd 6289347 -MultipartBoundaryBegin 6289347 -MultipartBoundaryEnd 6289359 -MimeEntityBegin 6289359 -MimeEntityHeadersEnd 6289424 -MultipartPreambleBegin 6289424 -MultipartPreambleEnd 6289426 -MultipartBoundaryBegin 6289426 -MultipartBoundaryEnd 6289449 -MimeEntityBegin 6289449 -MimeEntityHeadersEnd 6289818 -MultipartPreambleBegin 6289818 -MultipartPreambleEnd 6289818 -MultipartBoundaryBegin 6289818 -MultipartBoundaryEnd 6289841 -MimeEntityBegin 6289841 -MimeEntityHeadersEnd 6289946 -MultipartPreambleBegin 6289946 -MultipartPreambleEnd 6289946 -MultipartBoundaryBegin 6289946 -MultipartBoundaryEnd 6289969 -MimeEntityBegin 6289969 -MimeEntityHeadersEnd 6290096 -Octets 374 -Lines 8 -MimeEntityEnd 6290470 -MultipartBoundaryBegin 6290470 -MultipartBoundaryEnd 6290495 -MimeEntityBegin 6290495 -MimeEntityHeadersEnd 6290621 -Octets 402 -Lines 10 -MimeEntityEnd 6291023 -MultipartBoundaryBegin 6291023 -MultipartBoundaryEnd 6291048 -MimeEntityBegin 6291048 -MimeEntityHeadersEnd 6291177 -Octets 726 -Lines 18 -MimeEntityEnd 6291903 -MultipartEndBoundaryBegin 6291903 -MultipartEndBoundaryEnd 6291928 -MultipartEpilogueBegin 6291928 -MultipartEpilogueEnd 6291930 -Octets 1984 -Lines 55 -MimeEntityEnd 6291930 -MultipartBoundaryBegin 6291930 -MultipartBoundaryEnd 6291955 -MimeEntityBegin 6291955 -MimeEntityHeadersEnd 6292057 -MultipartPreambleBegin 6292057 -MultipartPreambleEnd 6292057 -MultipartBoundaryBegin 6292057 -MultipartBoundaryEnd 6292080 -MimeEntityBegin 6292080 -MimeEntityHeadersEnd 6292216 -Octets 16885 -Lines 470 -MimeEntityEnd 6309101 -MultipartBoundaryBegin 6309101 -MultipartBoundaryEnd 6309126 -MimeEntityBegin 6309126 -MimeEntityHeadersEnd 6309261 -Octets 14649 -Lines 395 -MimeEntityEnd 6323910 -MultipartBoundaryBegin 6323910 -MultipartBoundaryEnd 6323935 -MimeEntityBegin 6323935 -MimeEntityHeadersEnd 6324039 -MultipartPreambleBegin 6324039 -MultipartPreambleEnd 6324039 -MultipartBoundaryBegin 6324039 -MultipartBoundaryEnd 6324062 -MimeEntityBegin 6324062 -MimeEntityHeadersEnd 6324208 -Octets 6316 -Lines 164 -MimeEntityEnd 6330524 -MultipartBoundaryBegin 6330524 -MultipartBoundaryEnd 6330549 -MimeEntityBegin 6330549 -MimeEntityHeadersEnd 6330680 -Octets 5415 -Lines 160 -MimeEntityEnd 6336095 -MultipartBoundaryBegin 6336095 -MultipartBoundaryEnd 6336120 -MimeEntityBegin 6336120 -MimeEntityHeadersEnd 6336261 -Octets 7495 -Lines 197 -MimeEntityEnd 6343756 -MultipartBoundaryBegin 6343756 -MultipartBoundaryEnd 6343781 -MimeEntityBegin 6343781 -MimeEntityHeadersEnd 6343909 -Octets 6660 -Lines 184 -MimeEntityEnd 6350569 -MultipartBoundaryBegin 6350569 -MultipartBoundaryEnd 6350594 -MimeEntityBegin 6350594 -MimeEntityHeadersEnd 6350735 -Octets 17660 -Lines 492 -MimeEntityEnd 6368395 -MultipartEndBoundaryBegin 6368395 -MultipartEndBoundaryEnd 6368420 -MultipartEpilogueBegin 6368420 -MultipartEpilogueEnd 6368422 -Octets 44383 -Lines 1228 -MimeEntityEnd 6368422 -MultipartBoundaryBegin 6368422 -MultipartBoundaryEnd 6368447 -MimeEntityBegin 6368447 -MimeEntityHeadersEnd 6368545 -MultipartPreambleBegin 6368545 -MultipartPreambleEnd 6368545 -MultipartBoundaryBegin 6368545 -MultipartBoundaryEnd 6368568 -MimeEntityBegin 6368568 -MimeEntityHeadersEnd 6368706 -Octets 516 -Lines 21 -MimeEntityEnd 6369222 -MultipartEndBoundaryBegin 6369222 -MultipartEndBoundaryEnd 6369247 -MultipartEpilogueBegin 6369247 -MultipartEpilogueEnd 6369249 -Octets 704 -Lines 28 -MimeEntityEnd 6369249 -MultipartEndBoundaryBegin 6369249 -MultipartEndBoundaryEnd 6369274 -MultipartEpilogueBegin 6369274 -MultipartEpilogueEnd 6369276 -Octets 77219 -Lines 2144 -MimeEntityEnd 6369276 -MultipartBoundaryBegin 6369276 -MultipartBoundaryEnd 6369301 -MimeEntityBegin 6369301 -MimeEntityHeadersEnd 6369415 -MultipartPreambleBegin 6369415 -MultipartPreambleEnd 6369415 -MultipartBoundaryBegin 6369415 -MultipartBoundaryEnd 6369438 -MimeEntityBegin 6369438 -MimeEntityHeadersEnd 6369580 -Octets 1178 -Lines 29 -MimeEntityEnd 6370758 -MultipartBoundaryBegin 6370758 -MultipartBoundaryEnd 6370783 -MimeEntityBegin 6370783 -MimeEntityHeadersEnd 6370913 -Octets 1255 -Lines 35 -MimeEntityEnd 6372168 -MultipartBoundaryBegin 6372168 -MultipartBoundaryEnd 6372193 -MimeEntityBegin 6372193 -MimeEntityHeadersEnd 6372337 -Octets 699 -Lines 22 -MimeEntityEnd 6373036 -MultipartEndBoundaryBegin 6373036 -MultipartEndBoundaryEnd 6373061 -MultipartEpilogueBegin 6373061 -MultipartEpilogueEnd 6373063 -Octets 3648 -Lines 105 -MimeEntityEnd 6373063 -MultipartEndBoundaryBegin 6373063 -MultipartEndBoundaryEnd 6373088 -MultipartEpilogueBegin 6373088 -MultipartEpilogueEnd 6373090 -Octets 83272 -Lines 2320 -MimeEntityEnd 6373090 -MultipartEndBoundaryBegin 6373090 -MultipartEndBoundaryEnd 6373115 -MultipartEpilogueBegin 6373115 -MultipartEpilogueEnd 6373117 -Octets 83693 -Lines 2332 -MimeEntityEnd 6373117 -MultipartEndBoundaryBegin 6373117 -MultipartEndBoundaryEnd 6373129 -MultipartEpilogueBegin 6373129 -MultipartEpilogueEnd 6373131 -Octets 84806 -Lines 2362 -MimeEntityEnd 6373131 -MimeMessageEnd 6373131 -MboxMarkerBegin 6373133 -MboxMarkerEnd 6373142 -MimeMessageBegin 6373142 -MimeEntityBegin 6373142 -MimeEntityHeadersEnd 6373961 -MimeMessageHeadersEnd 6373961 -Octets 9425 -Lines 226 -MimeEntityEnd 6383386 -MimeMessageEnd 6383386 -MboxMarkerBegin 6383388 -MboxMarkerEnd 6383397 -MimeMessageBegin 6383397 -MimeEntityBegin 6383397 -MimeEntityHeadersEnd 6384141 -MimeMessageHeadersEnd 6384141 -MultipartPreambleBegin 6384141 -MultipartPreambleEnd 6384299 -MultipartBoundaryBegin 6384299 -MultipartBoundaryEnd 6384340 -MimeEntityBegin 6384340 -MimeEntityHeadersEnd 6384386 -Octets 779 -Lines 23 -MimeEntityEnd 6385165 -MultipartBoundaryBegin 6385165 -MultipartBoundaryEnd 6385208 -MimeEntityBegin 6385208 -MimeEntityHeadersEnd 6385296 -MultipartPreambleBegin 6385296 -MultipartPreambleEnd 6385296 -MultipartBoundaryBegin 6385296 -MultipartBoundaryEnd 6385339 -MimeEntityBegin 6385339 -MimeEntityHeadersEnd 6385433 -Octets 334 -Lines 7 -MimeEntityEnd 6385767 -MultipartBoundaryBegin 6385767 -MultipartBoundaryEnd 6385812 -MimeEntityBegin 6385812 -MimeEntityHeadersEnd 6385910 -Octets 22344 -Lines 320 -MimeEntityEnd 6408254 -MultipartBoundaryBegin 6408254 -MultipartBoundaryEnd 6408299 -MimeEntityBegin 6408299 -MimeEntityHeadersEnd 6408393 -Octets 171 -Lines 5 -MimeEntityEnd 6408564 -MultipartBoundaryBegin 6408564 -MultipartBoundaryEnd 6408609 -MimeEntityBegin 6408609 -MimeEntityHeadersEnd 6408710 -Octets 47898 -Lines 685 -MimeEntityEnd 6456608 -MultipartBoundaryBegin 6456608 -MultipartBoundaryEnd 6456653 -MimeEntityBegin 6456653 -MimeEntityHeadersEnd 6456747 -Octets 72 -Lines 2 -MimeEntityEnd 6456819 -MultipartBoundaryBegin 6456819 -MultipartBoundaryEnd 6456864 -MimeEntityBegin 6456864 -MimeEntityHeadersEnd 6456958 -Octets 20512 -Lines 294 -MimeEntityEnd 6477470 -MultipartBoundaryBegin 6477470 -MultipartBoundaryEnd 6477515 -MimeEntityBegin 6477515 -MimeEntityHeadersEnd 6477609 -Octets 112 -Lines 8 -MimeEntityEnd 6477721 -MultipartEndBoundaryBegin 6477721 -MultipartEndBoundaryEnd 6477766 -MultipartEpilogueBegin 6477766 -MultipartEpilogueEnd 6477768 -Octets 92472 -Lines 1360 -MimeEntityEnd 6477768 -MultipartEndBoundaryBegin 6477768 -MultipartEndBoundaryEnd 6477811 -MultipartEpilogueBegin 6477811 -MultipartEpilogueEnd 6477811 -Octets 93670 -Lines 1396 -MimeEntityEnd 6477811 -MimeMessageEnd 6477811 -MboxMarkerBegin 6477813 -MboxMarkerEnd 6477822 -MimeMessageBegin 6477822 -MimeEntityBegin 6477822 -MimeEntityHeadersEnd 6478593 -MimeMessageHeadersEnd 6478593 -MultipartPreambleBegin 6478593 -MultipartPreambleEnd 6478792 -MultipartBoundaryBegin 6478792 -MultipartBoundaryEnd 6478838 -MimeEntityBegin 6478838 -MimeEntityHeadersEnd 6478914 -Octets 433 -Lines 13 -MimeEntityEnd 6479347 -MultipartBoundaryBegin 6479347 -MultipartBoundaryEnd 6479395 -MimeEntityBegin 6479395 -MimeEntityHeadersEnd 6479459 -Octets 34024 -Lines 460 -MimeEntityEnd 6513483 -MultipartBoundaryBegin 6513483 -MultipartBoundaryEnd 6513531 -MimeEntityBegin 6513531 -MimeEntityHeadersEnd 6513607 -Octets 101 -Lines 7 -MimeEntityEnd 6513708 -MultipartEndBoundaryBegin 6513708 -MultipartEndBoundaryEnd 6513756 -MultipartEpilogueBegin 6513756 -MultipartEpilogueEnd 6513758 -Octets 35165 -Lines 500 -MimeEntityEnd 6513758 -MimeMessageEnd 6513758 -MboxMarkerBegin 6513760 -MboxMarkerEnd 6513803 -MimeMessageBegin 6513803 -MimeEntityBegin 6513803 -MimeEntityHeadersEnd 6513957 -MimeMessageHeadersEnd 6513957 -Octets 43722 -Lines 693 -MimeEntityEnd 6557679 -MimeMessageEnd 6557679 -MboxMarkerBegin 6557681 -MboxMarkerEnd 6557714 -MimeMessageBegin 6557714 -MimeEntityBegin 6557714 -MimeEntityHeadersEnd 6558312 -MimeMessageHeadersEnd 6558312 -MultipartPreambleBegin 6558312 -MultipartPreambleEnd 6558360 -MultipartBoundaryBegin 6558360 -MultipartBoundaryEnd 6558400 -MimeEntityBegin 6558400 -MimeEntityHeadersEnd 6558521 -MultipartPreambleBegin 6558521 -MultipartPreambleEnd 6558523 -MultipartBoundaryBegin 6558523 -MultipartBoundaryEnd 6558563 -MimeEntityBegin 6558563 -MimeEntityHeadersEnd 6558644 -Octets 1310 -Lines 38 -MimeEntityEnd 6559954 -MultipartBoundaryBegin 6559954 -MultipartBoundaryEnd 6559996 -MimeEntityBegin 6559996 -MimeEntityHeadersEnd 6560078 -Octets 2496 -Lines 32 -MimeEntityEnd 6562574 -MultipartEndBoundaryBegin 6562574 -MultipartEndBoundaryEnd 6562616 -MultipartEpilogueBegin 6562616 -MultipartEpilogueEnd 6562620 -Octets 4099 -Lines 83 -MimeEntityEnd 6562620 -MultipartBoundaryBegin 6562620 -MultipartBoundaryEnd 6562662 -MimeEntityBegin 6562662 -MimeEntityHeadersEnd 6562872 -Octets 21020 -Lines 270 -MimeEntityEnd 6583892 -MultipartEndBoundaryBegin 6583892 -MultipartEndBoundaryEnd 6583934 -MultipartEpilogueBegin 6583934 -MultipartEpilogueEnd 6583936 -Octets 25624 -Lines 368 -MimeEntityEnd 6583936 -MimeMessageEnd 6583936 -MboxMarkerBegin 6583938 -MboxMarkerEnd 6583971 -MimeMessageBegin 6583971 -MimeEntityBegin 6583971 -MimeEntityHeadersEnd 6584388 -MimeMessageHeadersEnd 6584388 -MultipartPreambleBegin 6584388 -MultipartPreambleEnd 6584436 -MultipartBoundaryBegin 6584436 -MultipartBoundaryEnd 6584457 -MimeEntityBegin 6584457 -MimeEntityHeadersEnd 6584459 -Octets 64 -Lines 1 -MimeEntityEnd 6584523 -MultipartBoundaryBegin 6584523 -MultipartBoundaryEnd 6584546 -MimeEntityBegin 6584546 -MimeEntityHeadersEnd 6584622 -MultipartPreambleBegin 6584622 -MultipartPreambleEnd 6584622 -MultipartBoundaryBegin 6584622 -MultipartBoundaryEnd 6584650 -MimeEntityBegin 6584650 -MimeEntityHeadersEnd 6584760 -Octets 83 -Lines 3 -MimeEntityEnd 6584843 -MultipartBoundaryBegin 6584843 -MultipartBoundaryEnd 6584873 -MimeEntityBegin 6584873 -MimeEntityHeadersEnd 6584986 -Octets 162 -Lines 4 -MimeEntityEnd 6585148 -MultipartBoundaryBegin 6585148 -MultipartBoundaryEnd 6585178 -MimeEntityBegin 6585178 -MimeEntityHeadersEnd 6585291 -Octets 173 -Lines 10 -MimeEntityEnd 6585464 -MultipartBoundaryBegin 6585464 -MultipartBoundaryEnd 6585494 -MimeEntityBegin 6585494 -MimeEntityHeadersEnd 6585603 -Octets 164 -Lines 3 -MimeEntityEnd 6585767 -MultipartBoundaryBegin 6585767 -MultipartBoundaryEnd 6585797 -MimeEntityBegin 6585797 -MimeEntityHeadersEnd 6585925 -Octets 433 -Lines 6 -MimeEntityEnd 6586358 -MultipartEndBoundaryBegin 6586358 -MultipartEndBoundaryEnd 6586388 -MultipartEpilogueBegin 6586388 -MultipartEpilogueEnd 6586388 -Octets 1766 -Lines 57 -MimeEntityEnd 6586388 -MultipartBoundaryBegin 6586388 -MultipartBoundaryEnd 6586411 -MimeEntityBegin 6586411 -MimeEntityHeadersEnd 6586413 -Octets 169 -Lines 4 -MimeEntityEnd 6586582 -MultipartBoundaryBegin 6586582 -MultipartBoundaryEnd 6586605 -MimeEntityBegin 6586605 -MimeEntityHeadersEnd 6586657 -MultipartPreambleBegin 6586657 -MultipartPreambleEnd 6586657 -MultipartBoundaryBegin 6586657 -MultipartBoundaryEnd 6586663 -MimeEntityBegin 6586663 -MimeEntityHeadersEnd 6586691 -Octets 54 -Lines 1 -MimeEntityEnd 6586745 -MultipartBoundaryBegin 6586745 -MultipartBoundaryEnd 6586753 -MimeEntityBegin 6586753 -MimeEntityHeadersEnd 6586805 -MultipartPreambleBegin 6586805 -MultipartPreambleEnd 6586805 -MultipartBoundaryBegin 6586805 -MultipartBoundaryEnd 6586811 -MimeEntityBegin 6586811 -MimeEntityHeadersEnd 6586839 -Octets 54 -Lines 1 -MimeEntityEnd 6586893 -MultipartBoundaryBegin 6586893 -MultipartBoundaryEnd 6586901 -MimeEntityBegin 6586901 -MimeEntityHeadersEnd 6586928 -Octets 51 -Lines 1 -MimeEntityEnd 6586979 -MultipartBoundaryBegin 6586979 -MultipartBoundaryEnd 6586987 -MimeEntityBegin 6586987 -MimeEntityHeadersEnd 6587016 -Octets 55 -Lines 1 -MimeEntityEnd 6587071 -MultipartEndBoundaryBegin 6587071 -MultipartEndBoundaryEnd 6587079 -MultipartEpilogueBegin 6587079 -MultipartEpilogueEnd 6587081 -Octets 276 -Lines 16 -MimeEntityEnd 6587081 -MultipartBoundaryBegin 6587081 -MultipartBoundaryEnd 6587089 -MimeEntityBegin 6587089 -MimeEntityHeadersEnd 6587184 -Octets 16 -Lines 1 -MimeEntityEnd 6587200 -MultipartEndBoundaryBegin 6587200 -MultipartEndBoundaryEnd 6587208 -MultipartEpilogueBegin 6587208 -MultipartEpilogueEnd 6587208 -Octets 551 -Lines 32 -MimeEntityEnd 6587208 -MultipartBoundaryBegin 6587208 -MultipartBoundaryEnd 6587231 -MimeEntityBegin 6587231 -MimeEntityHeadersEnd 6587233 -Octets 10 -Lines 1 -MimeEntityEnd 6587243 -MultipartEndBoundaryBegin 6587243 -MultipartEndBoundaryEnd 6587266 -MultipartEpilogueBegin 6587266 -MultipartEpilogueEnd 6587266 -Octets 2878 -Lines 113 -MimeEntityEnd 6587266 -MimeMessageEnd 6587266 -MboxMarkerBegin 6587268 -MboxMarkerEnd 6587301 -MimeMessageBegin 6587301 -MimeEntityBegin 6587301 -MimeEntityHeadersEnd 6587716 -MimeMessageHeadersEnd 6587716 -MultipartPreambleBegin 6587716 -MultipartPreambleEnd 6587764 -MultipartBoundaryBegin 6587764 -MultipartBoundaryEnd 6587785 -MimeEntityBegin 6587785 -MimeEntityHeadersEnd 6587787 -Octets 68 -Lines 1 -MimeEntityEnd 6587855 -MultipartBoundaryBegin 6587855 -MultipartBoundaryEnd 6587878 -MimeEntityBegin 6587878 -MimeEntityHeadersEnd 6587954 -MultipartPreambleBegin 6587954 -MultipartPreambleEnd 6587954 -MultipartBoundaryBegin 6587954 -MultipartBoundaryEnd 6587982 -MimeEntityBegin 6587982 -MimeEntityHeadersEnd 6588142 -Octets 56866 -Lines 1603 -MimeEntityEnd 6645008 -MultipartBoundaryBegin 6645008 -MultipartBoundaryEnd 6645038 -MimeEntityBegin 6645038 -MimeEntityHeadersEnd 6645197 -Octets 109031 -Lines 2982 -MimeEntityEnd 6754228 -MultipartBoundaryBegin 6754228 -MultipartBoundaryEnd 6754258 -MimeEntityBegin 6754258 -MimeEntityHeadersEnd 6754408 -Octets 201468 -Lines 13109 -MimeEntityEnd 6955876 -MultipartEndBoundaryBegin 6955876 -MultipartEndBoundaryEnd 6955906 -MultipartEpilogueBegin 6955906 -MultipartEpilogueEnd 6955908 -Octets 367954 -Lines 17713 -MimeEntityEnd 6955908 -MultipartEndBoundaryBegin 6955908 -MultipartEndBoundaryEnd 6955931 -MultipartEpilogueBegin 6955931 -MultipartEpilogueEnd 6955939 -Octets 368223 -Lines 17726 -MimeEntityEnd 6955939 -MimeMessageEnd 6955939 -MboxMarkerBegin 6955941 -MboxMarkerEnd 6955950 -MimeMessageBegin 6955950 -MimeEntityBegin 6955950 -MimeEntityHeadersEnd 6956567 -MimeMessageHeadersEnd 6956567 -MultipartPreambleBegin 6956567 -MultipartPreambleEnd 6956787 -MultipartBoundaryBegin 6956787 -MultipartBoundaryEnd 6956828 -MimeEntityBegin 6956828 -MimeEntityHeadersEnd 6956943 -Octets 0 -Lines 0 -MimeEntityEnd 6956943 -MultipartBoundaryBegin 6956943 -MultipartBoundaryEnd 6956986 -MimeEntityBegin 6956986 -MimeEntityHeadersEnd 6957087 -MimeMessageBegin 6957087 -MimeEntityBegin 6957087 -MimeEntityHeadersEnd 6957640 -MimeMessageHeadersEnd 6957640 -Octets 362 -Lines 16 -MimeEntityEnd 6958002 -MimeMessageEnd 6958002 -Octets 915 -Lines 28 -MimeEntityEnd 6958002 -MultipartEndBoundaryBegin 6958002 -MultipartEndBoundaryEnd 6958045 -MultipartEpilogueBegin 6958045 -MultipartEpilogueEnd 6958045 -Octets 1478 -Lines 43 -MimeEntityEnd 6958045 -MimeMessageEnd 6958045 -MboxMarkerBegin 6958047 -MboxMarkerEnd 6958056 -MimeMessageBegin 6958056 -MimeEntityBegin 6958056 -MimeEntityHeadersEnd 6958361 -MimeMessageHeadersEnd 6958361 -MultipartPreambleBegin 6958361 -MultipartPreambleEnd 6958361 -MultipartBoundaryBegin 6958361 -MultipartBoundaryEnd 6958401 -MimeEntityBegin 6958401 -MimeEntityHeadersEnd 6958654 -Octets 749 -Lines 30 -MimeEntityEnd 6959403 -MultipartBoundaryBegin 6959403 -MultipartBoundaryEnd 6959445 -MimeEntityBegin 6959445 -MimeEntityHeadersEnd 6959773 -Octets 10870 -Lines 147 -MimeEntityEnd 6970643 -MultipartEndBoundaryBegin 6970643 -MultipartEndBoundaryEnd 6970685 -MultipartEpilogueBegin 6970685 -MultipartEpilogueEnd 6970685 -Octets 12324 -Lines 197 -MimeEntityEnd 6970685 -MimeMessageEnd 6970685 -MboxMarkerBegin 6970687 -MboxMarkerEnd 6970696 -MimeMessageBegin 6970696 -MimeEntityBegin 6970696 -MimeEntityHeadersEnd 6971001 -MimeMessageHeadersEnd 6971001 -MultipartPreambleBegin 6971001 -MultipartPreambleEnd 6971001 -MultipartBoundaryBegin 6971001 -MultipartBoundaryEnd 6971041 -MimeEntityBegin 6971041 -MimeEntityHeadersEnd 6971294 -Octets 748 -Lines 30 -MimeEntityEnd 6972042 -MultipartBoundaryBegin 6972042 -MultipartBoundaryEnd 6972084 -MimeEntityBegin 6972084 -MimeEntityHeadersEnd 6972381 -Octets 10870 -Lines 147 -MimeEntityEnd 6983251 -MultipartEndBoundaryBegin 6983251 -MultipartEndBoundaryEnd 6983293 -MultipartEpilogueBegin 6983293 -MultipartEpilogueEnd 6983293 -Octets 12292 -Lines 197 -MimeEntityEnd 6983293 -MimeMessageEnd 6983293 -MboxMarkerBegin 6983295 -MboxMarkerEnd 6983328 -MimeMessageBegin 6983328 -MimeEntityBegin 6983328 -MimeEntityHeadersEnd 6984857 -MimeMessageHeadersEnd 6984857 -MultipartPreambleBegin 6984857 -MultipartPreambleEnd 6984859 -MultipartBoundaryBegin 6984859 -MultipartBoundaryEnd 6984904 -MimeEntityBegin 6984904 -MimeEntityHeadersEnd 6984998 -Octets 5310 -Lines 111 -MimeEntityEnd 6990308 -MultipartBoundaryBegin 6990308 -MultipartBoundaryEnd 6990355 -MimeEntityBegin 6990355 -MimeEntityHeadersEnd 6990560 -Octets 942 -Lines 13 -MimeEntityEnd 6991502 -MultipartEndBoundaryBegin 6991502 -MultipartEndBoundaryEnd 6991549 -MultipartEpilogueBegin 6991549 -MultipartEpilogueEnd 6991551 -Octets 6694 -Lines 139 -MimeEntityEnd 6991551 -MimeMessageEnd 6991551 -MboxMarkerBegin 6991553 -MboxMarkerEnd 6991586 -MimeMessageBegin 6991586 -MimeEntityBegin 6991586 -MimeEntityHeadersEnd 6992045 -MimeMessageHeadersEnd 6992045 -MultipartPreambleBegin 6992045 -MultipartPreambleEnd 6992045 -MultipartBoundaryBegin 6992045 -MultipartBoundaryEnd 6992085 -MimeEntityBegin 6992085 -MimeEntityHeadersEnd 6992113 -Octets 253 -Lines 6 -MimeEntityEnd 6992366 -MultipartBoundaryBegin 6992366 -MultipartBoundaryEnd 6992408 -MimeEntityBegin 6992408 -MimeEntityHeadersEnd 6992497 -MultipartPreambleBegin 6992497 -MultipartPreambleEnd 6992497 -MultipartBoundaryBegin 6992497 -MultipartBoundaryEnd 6992537 -MimeEntityBegin 6992537 -MimeEntityHeadersEnd 6992736 -Octets 7327 -Lines 179 -MimeEntityEnd 7000063 -MultipartBoundaryBegin 7000063 -MultipartBoundaryEnd 7000105 -MimeEntityBegin 7000105 -MimeEntityHeadersEnd 7000286 -Octets 8090 -Lines 110 -MimeEntityEnd 7008376 -MultipartBoundaryBegin 7008376 -MultipartBoundaryEnd 7008418 -MimeEntityBegin 7008418 -MimeEntityHeadersEnd 7008582 -Octets 7556 -Lines 103 -MimeEntityEnd 7016138 -MultipartBoundaryBegin 7016138 -MultipartBoundaryEnd 7016180 -MimeEntityBegin 7016180 -MimeEntityHeadersEnd 7016343 -Octets 3378 -Lines 46 -MimeEntityEnd 7019721 -MultipartBoundaryBegin 7019721 -MultipartBoundaryEnd 7019763 -MimeEntityBegin 7019763 -MimeEntityHeadersEnd 7019927 -Octets 8566 -Lines 116 -MimeEntityEnd 7028493 -MultipartBoundaryBegin 7028493 -MultipartBoundaryEnd 7028535 -MimeEntityBegin 7028535 -MimeEntityHeadersEnd 7028696 -Octets 105798 -Lines 1430 -MimeEntityEnd 7134494 -MultipartBoundaryBegin 7134494 -MultipartBoundaryEnd 7134536 -MimeEntityBegin 7134536 -MimeEntityHeadersEnd 7134700 -Octets 38886 -Lines 526 -MimeEntityEnd 7173586 -MultipartBoundaryBegin 7173586 -MultipartBoundaryEnd 7173628 -MimeEntityBegin 7173628 -MimeEntityHeadersEnd 7173797 -Octets 35798 -Lines 484 -MimeEntityEnd 7209595 -MultipartEndBoundaryBegin 7209595 -MultipartEndBoundaryEnd 7209637 -MultipartEpilogueBegin 7209637 -MultipartEpilogueEnd 7209637 -Octets 217140 -Lines 3044 -MimeEntityEnd 7209637 -MultipartEndBoundaryBegin 7209637 -MultipartEndBoundaryEnd 7209679 -MultipartEpilogueBegin 7209679 -MultipartEpilogueEnd 7209679 -Octets 217634 -Lines 3059 -MimeEntityEnd 7209679 -MimeMessageEnd 7209679 -MboxMarkerBegin 7209681 -MboxMarkerEnd 7209690 -MimeMessageBegin 7209690 -MimeEntityBegin 7209690 -MimeEntityHeadersEnd 7209994 -MimeMessageHeadersEnd 7209994 -MultipartPreambleBegin 7209994 -MultipartPreambleEnd 7209994 -MultipartBoundaryBegin 7209994 -MultipartBoundaryEnd 7210034 -MimeEntityBegin 7210034 -MimeEntityHeadersEnd 7210195 -Octets 578 -Lines 27 -MimeEntityEnd 7210773 -MultipartBoundaryBegin 7210773 -MultipartBoundaryEnd 7210815 -MimeEntityBegin 7210815 -MimeEntityHeadersEnd 7210932 -Octets 10870 -Lines 147 -MimeEntityEnd 7221802 -MultipartEndBoundaryBegin 7221802 -MultipartEndBoundaryEnd 7221844 -MultipartEpilogueBegin 7221844 -MultipartEpilogueEnd 7221844 -Octets 11850 -Lines 188 -MimeEntityEnd 7221844 -MimeMessageEnd 7221844 -MboxMarkerBegin 7221846 -MboxMarkerEnd 7221855 -MimeMessageBegin 7221855 -MimeEntityBegin 7221855 -MimeEntityHeadersEnd 7222159 -MimeMessageHeadersEnd 7222159 -MultipartPreambleBegin 7222159 -MultipartPreambleEnd 7222159 -MultipartBoundaryBegin 7222159 -MultipartBoundaryEnd 7222199 -MimeEntityBegin 7222199 -MimeEntityHeadersEnd 7222417 -Octets 625 -Lines 28 -MimeEntityEnd 7223042 -MultipartBoundaryBegin 7223042 -MultipartBoundaryEnd 7223084 -MimeEntityBegin 7223084 -MimeEntityHeadersEnd 7223365 -Octets 10870 -Lines 147 -MimeEntityEnd 7234235 -MultipartEndBoundaryBegin 7234235 -MultipartEndBoundaryEnd 7234277 -MultipartEpilogueBegin 7234277 -MultipartEpilogueEnd 7234277 -Octets 12118 -Lines 193 -MimeEntityEnd 7234277 -MimeMessageEnd 7234277 -MboxMarkerBegin 7234279 -MboxMarkerEnd 7234288 -MimeMessageBegin 7234288 -MimeEntityBegin 7234288 -MimeEntityHeadersEnd 7234592 -MimeMessageHeadersEnd 7234592 -MultipartPreambleBegin 7234592 -MultipartPreambleEnd 7234592 -MultipartBoundaryBegin 7234592 -MultipartBoundaryEnd 7234632 -MimeEntityBegin 7234632 -MimeEntityHeadersEnd 7234854 -Octets 629 -Lines 28 -MimeEntityEnd 7235483 -MultipartBoundaryBegin 7235483 -MultipartBoundaryEnd 7235525 -MimeEntityBegin 7235525 -MimeEntityHeadersEnd 7235705 -Octets 10870 -Lines 147 -MimeEntityEnd 7246575 -MultipartEndBoundaryBegin 7246575 -MultipartEndBoundaryEnd 7246617 -MultipartEpilogueBegin 7246617 -MultipartEpilogueEnd 7246617 -Octets 12025 -Lines 191 -MimeEntityEnd 7246617 -MimeMessageEnd 7246617 -MboxMarkerBegin 7246619 -MboxMarkerEnd 7246628 -MimeMessageBegin 7246628 -MimeEntityBegin 7246628 -MimeEntityHeadersEnd 7246932 -MimeMessageHeadersEnd 7246932 -MultipartPreambleBegin 7246932 -MultipartPreambleEnd 7246932 -MultipartBoundaryBegin 7246932 -MultipartBoundaryEnd 7246972 -MimeEntityBegin 7246972 -MimeEntityHeadersEnd 7247224 -Octets 660 -Lines 29 -MimeEntityEnd 7247884 -MultipartBoundaryBegin 7247884 -MultipartBoundaryEnd 7247926 -MimeEntityBegin 7247926 -MimeEntityHeadersEnd 7248239 -Octets 10870 -Lines 147 -MimeEntityEnd 7259109 -MultipartEndBoundaryBegin 7259109 -MultipartEndBoundaryEnd 7259151 -MultipartEpilogueBegin 7259151 -MultipartEpilogueEnd 7259151 -Octets 12219 -Lines 196 -MimeEntityEnd 7259151 -MimeMessageEnd 7259151 -MboxMarkerBegin 7259153 -MboxMarkerEnd 7259162 -MimeMessageBegin 7259162 -MimeEntityBegin 7259162 -MimeEntityHeadersEnd 7259466 -MimeMessageHeadersEnd 7259466 -MultipartPreambleBegin 7259466 -MultipartPreambleEnd 7259466 -MultipartBoundaryBegin 7259466 -MultipartBoundaryEnd 7259506 -MimeEntityBegin 7259506 -MimeEntityHeadersEnd 7259728 -Octets 673 -Lines 28 -MimeEntityEnd 7260401 -MultipartBoundaryBegin 7260401 -MultipartBoundaryEnd 7260443 -MimeEntityBegin 7260443 -MimeEntityHeadersEnd 7260623 -Octets 10870 -Lines 147 -MimeEntityEnd 7271493 -MultipartEndBoundaryBegin 7271493 -MultipartEndBoundaryEnd 7271535 -MultipartEpilogueBegin 7271535 -MultipartEpilogueEnd 7271535 -Octets 12069 -Lines 191 -MimeEntityEnd 7271535 -MimeMessageEnd 7271535 -MboxMarkerBegin 7271537 -MboxMarkerEnd 7271546 -MimeMessageBegin 7271546 -MimeEntityBegin 7271546 -MimeEntityHeadersEnd 7271850 -MimeMessageHeadersEnd 7271850 -MultipartPreambleBegin 7271850 -MultipartPreambleEnd 7271850 -MultipartBoundaryBegin 7271850 -MultipartBoundaryEnd 7271890 -MimeEntityBegin 7271890 -MimeEntityHeadersEnd 7272142 -Octets 699 -Lines 29 -MimeEntityEnd 7272841 -MultipartBoundaryBegin 7272841 -MultipartBoundaryEnd 7272883 -MimeEntityBegin 7272883 -MimeEntityHeadersEnd 7273227 -Octets 10870 -Lines 147 -MimeEntityEnd 7284097 -MultipartEndBoundaryBegin 7284097 -MultipartEndBoundaryEnd 7284139 -MultipartEpilogueBegin 7284139 -MultipartEpilogueEnd 7284139 -Octets 12289 -Lines 196 -MimeEntityEnd 7284139 -MimeMessageEnd 7284139 -MboxMarkerBegin 7284141 -MboxMarkerEnd 7284174 -MimeMessageBegin 7284174 -MimeEntityBegin 7284174 -MimeEntityHeadersEnd 7285430 -MimeMessageHeadersEnd 7285430 -MultipartPreambleBegin 7285430 -MultipartPreambleEnd 7285478 -MultipartBoundaryBegin 7285478 -MultipartBoundaryEnd 7285517 -MimeEntityBegin 7285517 -MimeEntityHeadersEnd 7285596 -Octets 30 -Lines 3 -MimeEntityEnd 7285626 -MultipartBoundaryBegin 7285626 -MultipartBoundaryEnd 7285667 -MimeEntityBegin 7285667 -MimeEntityHeadersEnd 7285761 -MimeMessageBegin 7285761 -MimeEntityBegin 7285761 -MimeEntityHeadersEnd 7286598 -MimeMessageHeadersEnd 7286598 -MultipartPreambleBegin 7286598 -MultipartPreambleEnd 7286600 -MultipartBoundaryBegin 7286600 -MultipartBoundaryEnd 7286640 -MimeEntityBegin 7286640 -MimeEntityHeadersEnd 7286719 -Octets 643 -Lines 16 -MimeEntityEnd 7287362 -MultipartBoundaryBegin 7287362 -MultipartBoundaryEnd 7287404 -MimeEntityBegin 7287404 -MimeEntityHeadersEnd 7287488 -MultipartPreambleBegin 7287488 -MultipartPreambleEnd 7287490 -MultipartBoundaryBegin 7287490 -MultipartBoundaryEnd 7287530 -MimeEntityBegin 7287530 -MimeEntityHeadersEnd 7287608 -Octets 868 -Lines 18 -MimeEntityEnd 7288476 -MultipartBoundaryBegin 7288476 -MultipartBoundaryEnd 7288518 -MimeEntityBegin 7288518 -MimeEntityHeadersEnd 7288707 -Octets 754158 -Lines 10192 -MimeEntityEnd 8042865 -MultipartEndBoundaryBegin 8042865 -MultipartEndBoundaryEnd 8042907 -MultipartEpilogueBegin 8042907 -MultipartEpilogueEnd 8042909 -Octets 755421 -Lines 10223 -MimeEntityEnd 8042909 -MultipartEndBoundaryBegin 8042909 -MultipartEndBoundaryEnd 8042951 -MultipartEpilogueBegin 8042951 -MultipartEpilogueEnd 8042957 -Octets 756359 -Lines 10252 -MimeEntityEnd 8042957 -MimeMessageEnd 8042957 -Octets 757196 -Lines 10268 -MimeEntityEnd 8042957 -MultipartEndBoundaryBegin 8042957 -MultipartEndBoundaryEnd 8042998 -MultipartEpilogueBegin 8042998 -MultipartEpilogueEnd 8043000 -Octets 757570 -Lines 10285 -MimeEntityEnd 8043000 -MimeMessageEnd 8043000 -MboxMarkerBegin 8043002 -MboxMarkerEnd 8043035 -MimeMessageBegin 8043035 -MimeEntityBegin 8043035 -MimeEntityHeadersEnd 8044321 -MimeMessageHeadersEnd 8044321 -MultipartPreambleBegin 8044321 -MultipartPreambleEnd 8044323 -MultipartBoundaryBegin 8044323 -MultipartBoundaryEnd 8044368 -MimeEntityBegin 8044368 -MimeEntityHeadersEnd 8044462 -Octets 2432 -Lines 50 -MimeEntityEnd 8046894 -MultipartBoundaryBegin 8046894 -MultipartBoundaryEnd 8046941 -MimeEntityBegin 8046941 -MimeEntityHeadersEnd 8047105 -Octets 6102 -Lines 79 -MimeEntityEnd 8053207 -MultipartBoundaryBegin 8053207 -MultipartBoundaryEnd 8053254 -MimeEntityBegin 8053254 -MimeEntityHeadersEnd 8053417 -Octets 12230 -Lines 157 -MimeEntityEnd 8065647 -MultipartBoundaryBegin 8065647 -MultipartBoundaryEnd 8065694 -MimeEntityBegin 8065694 -MimeEntityHeadersEnd 8065859 -Octets 21996 -Lines 282 -MimeEntityEnd 8087855 -MultipartBoundaryBegin 8087855 -MultipartBoundaryEnd 8087902 -MimeEntityBegin 8087902 -MimeEntityHeadersEnd 8088111 -Octets 3438 -Lines 45 -MimeEntityEnd 8091549 -MultipartEndBoundaryBegin 8091549 -MultipartEndBoundaryEnd 8091596 -MultipartEpilogueBegin 8091596 -MultipartEpilogueEnd 8091598 -Octets 47277 -Lines 649 -MimeEntityEnd 8091598 -MimeMessageEnd 8091598 -MboxMarkerBegin 8091600 -MboxMarkerEnd 8091609 -MimeMessageBegin 8091609 -MimeEntityBegin 8091609 -MimeEntityHeadersEnd 8092367 -MimeMessageHeadersEnd 8092367 -Octets 552090 -Lines 7474 -MimeEntityEnd 8644457 -MimeMessageEnd 8644457 -MboxMarkerBegin 8644459 -MboxMarkerEnd 8644468 -MimeMessageBegin 8644468 -MimeEntityBegin 8644468 -MimeEntityHeadersEnd 8645400 -MimeMessageHeadersEnd 8645400 -MultipartPreambleBegin 8645400 -MultipartPreambleEnd 8645402 -MultipartBoundaryBegin 8645402 -MultipartBoundaryEnd 8645411 -MimeEntityBegin 8645411 -MimeEntityHeadersEnd 8645442 -Octets 2626 -Lines 96 -MimeEntityEnd 8648068 -MultipartEndBoundaryBegin 8648068 -MultipartEndBoundaryEnd 8648079 -MultipartEpilogueBegin 8648079 -MultipartEpilogueEnd 8648081 -Octets 2681 -Lines 102 -MimeEntityEnd 8648081 -MimeMessageEnd 8648081 -MboxMarkerBegin 8648083 -MboxMarkerEnd 8648116 -MimeMessageBegin 8648116 -MimeEntityBegin 8648116 -MimeEntityHeadersEnd 8648726 -MimeMessageHeadersEnd 8648726 -MultipartPreambleBegin 8648726 -MultipartPreambleEnd 8649013 -MultipartBoundaryBegin 8649013 -MultipartBoundaryEnd 8649031 -MimeEntityBegin 8649031 -MimeEntityHeadersEnd 8649078 -Octets 1108 -Lines 26 -MimeEntityEnd 8650186 -MultipartBoundaryBegin 8650186 -MultipartBoundaryEnd 8650206 -MimeEntityBegin 8650206 -MimeEntityHeadersEnd 8650249 -Octets 293 -Lines 9 -MimeEntityEnd 8650542 -MultipartEndBoundaryBegin 8650542 -MultipartEndBoundaryEnd 8650562 -MultipartEpilogueBegin 8650562 -MultipartEpilogueEnd 8650562 -Octets 1836 -Lines 51 -MimeEntityEnd 8650562 -MimeMessageEnd 8650562 -MboxMarkerBegin 8650564 -MboxMarkerEnd 8650573 -MimeMessageBegin 8650573 -MimeEntityBegin 8650573 -MimeEntityHeadersEnd 8651756 -MimeMessageHeadersEnd 8651756 -Octets 1422 -Lines 40 -MimeEntityEnd 8653178 -MimeMessageEnd 8653178 -MboxMarkerBegin 8653180 -MboxMarkerEnd 8653189 -MimeMessageBegin 8653189 -MimeEntityBegin 8653189 -MimeEntityHeadersEnd 8653839 -MimeMessageHeadersEnd 8653839 -Octets 1001 -Lines 27 -MimeEntityEnd 8654840 -MimeMessageEnd 8654840 -MboxMarkerBegin 8654842 -MboxMarkerEnd 8654851 -MimeMessageBegin 8654851 -MimeEntityBegin 8654851 -MimeEntityHeadersEnd 8655631 -MimeMessageHeadersEnd 8655631 -MultipartPreambleBegin 8655631 -MultipartPreambleEnd 8655789 -MultipartBoundaryBegin 8655789 -MultipartBoundaryEnd 8655830 -MimeEntityBegin 8655830 -MimeEntityHeadersEnd 8655876 -Octets 832 -Lines 15 -MimeEntityEnd 8656708 -MultipartBoundaryBegin 8656708 -MultipartBoundaryEnd 8656751 -MimeEntityBegin 8656751 -MimeEntityHeadersEnd 8656839 -MultipartPreambleBegin 8656839 -MultipartPreambleEnd 8656839 -MultipartBoundaryBegin 8656839 -MultipartBoundaryEnd 8656882 -MimeEntityBegin 8656882 -MimeEntityHeadersEnd 8656976 -Octets 501 -Lines 10 -MimeEntityEnd 8657477 -MultipartBoundaryBegin 8657477 -MultipartBoundaryEnd 8657522 -MimeEntityBegin 8657522 -MimeEntityHeadersEnd 8657715 -MimeMessageBegin 8657715 -MimeEntityBegin 8657715 -MimeEntityHeadersEnd 8657744 -MimeMessageHeadersEnd 8657744 -Octets 4 -Lines 2 -MimeEntityEnd 8657748 -MimeMessageEnd 8657748 -Octets 33 -Lines 4 -MimeEntityEnd 8657748 -MultipartBoundaryBegin 8657748 -MultipartBoundaryEnd 8657793 -MimeEntityBegin 8657793 -MimeEntityHeadersEnd 8657884 -Octets 5 -Lines 2 -MimeEntityEnd 8657889 -MultipartBoundaryBegin 8657889 -MultipartBoundaryEnd 8657934 -MimeEntityBegin 8657934 -MimeEntityHeadersEnd 8658142 -MimeMessageBegin 8658142 -MimeEntityBegin 8658142 -MimeEntityHeadersEnd 8658169 -MimeMessageHeadersEnd 8658169 -Octets 4 -Lines 2 -MimeEntityEnd 8658173 -MimeMessageEnd 8658173 -Octets 31 -Lines 4 -MimeEntityEnd 8658173 -MultipartBoundaryBegin 8658173 -MultipartBoundaryEnd 8658218 -MimeEntityBegin 8658218 -MimeEntityHeadersEnd 8658312 -Octets 229 -Lines 7 -MimeEntityEnd 8658541 -MultipartEndBoundaryBegin 8658541 -MultipartEndBoundaryEnd 8658586 -MultipartEpilogueBegin 8658586 -MultipartEpilogueEnd 8658588 -Octets 1749 -Lines 61 -MimeEntityEnd 8658588 -MultipartEndBoundaryBegin 8658588 -MultipartEndBoundaryEnd 8658631 -MultipartEpilogueBegin 8658631 -MultipartEpilogueEnd 8658633 -Octets 3002 -Lines 89 -MimeEntityEnd 8658633 -MimeMessageEnd 8658633 -MboxMarkerBegin 8658635 -MboxMarkerEnd 8658644 -MimeMessageBegin 8658644 -MimeEntityBegin 8658644 -MimeEntityHeadersEnd 8659476 -MimeMessageHeadersEnd 8659476 -Octets 1428 -Lines 42 -MimeEntityEnd 8660904 -MimeMessageEnd 8660904 -MboxMarkerBegin 8660906 -MboxMarkerEnd 8660915 -MimeMessageBegin 8660915 -MimeEntityBegin 8660915 -MimeEntityHeadersEnd 8661072 -MimeMessageHeadersEnd 8661072 -Octets 4734 -Lines 64 -MimeEntityEnd 8665806 -MimeMessageEnd 8665806 -MboxMarkerBegin 8665808 -MboxMarkerEnd 8665817 -MimeMessageBegin 8665817 -MimeEntityBegin 8665817 -MimeEntityHeadersEnd 8667595 -MimeMessageHeadersEnd 8667595 -MultipartPreambleBegin 8667595 -MultipartPreambleEnd 8667753 -MultipartBoundaryBegin 8667753 -MultipartBoundaryEnd 8667794 -MimeEntityBegin 8667794 -MimeEntityHeadersEnd 8667840 -Octets 1705 -Lines 38 -MimeEntityEnd 8669545 -MultipartBoundaryBegin 8669545 -MultipartBoundaryEnd 8669588 -MimeEntityBegin 8669588 -MimeEntityHeadersEnd 8669676 -MultipartPreambleBegin 8669676 -MultipartPreambleEnd 8669676 -MultipartBoundaryBegin 8669676 -MultipartBoundaryEnd 8669719 -MimeEntityBegin 8669719 -MimeEntityHeadersEnd 8669813 -Octets 571 -Lines 14 -MimeEntityEnd 8670384 -MultipartBoundaryBegin 8670384 -MultipartBoundaryEnd 8670429 -MimeEntityBegin 8670429 -MimeEntityHeadersEnd 8670493 -Octets 884 -Lines 12 -MimeEntityEnd 8671377 -MultipartBoundaryBegin 8671377 -MultipartBoundaryEnd 8671422 -MimeEntityBegin 8671422 -MimeEntityHeadersEnd 8671516 -Octets 51 -Lines 5 -MimeEntityEnd 8671567 -MultipartBoundaryBegin 8671567 -MultipartBoundaryEnd 8671612 -MimeEntityBegin 8671612 -MimeEntityHeadersEnd 8671676 -Octets 884 -Lines 12 -MimeEntityEnd 8672560 -MultipartBoundaryBegin 8672560 -MultipartBoundaryEnd 8672605 -MimeEntityBegin 8672605 -MimeEntityHeadersEnd 8672699 -Octets 51 -Lines 5 -MimeEntityEnd 8672750 -MultipartBoundaryBegin 8672750 -MultipartBoundaryEnd 8672795 -MimeEntityBegin 8672795 -MimeEntityHeadersEnd 8672859 -Octets 884 -Lines 12 -MimeEntityEnd 8673743 -MultipartBoundaryBegin 8673743 -MultipartBoundaryEnd 8673788 -MimeEntityBegin 8673788 -MimeEntityHeadersEnd 8673882 -Octets 45 -Lines 5 -MimeEntityEnd 8673927 -MultipartBoundaryBegin 8673927 -MultipartBoundaryEnd 8673972 -MimeEntityBegin 8673972 -MimeEntityHeadersEnd 8674036 -Octets 228 -Lines 4 -MimeEntityEnd 8674264 -MultipartBoundaryBegin 8674264 -MultipartBoundaryEnd 8674309 -MimeEntityBegin 8674309 -MimeEntityHeadersEnd 8674403 -Octets 69 -Lines 5 -MimeEntityEnd 8674472 -MultipartBoundaryBegin 8674472 -MultipartBoundaryEnd 8674517 -MimeEntityBegin 8674517 -MimeEntityHeadersEnd 8674581 -Octets 228 -Lines 4 -MimeEntityEnd 8674809 -MultipartBoundaryBegin 8674809 -MultipartBoundaryEnd 8674854 -MimeEntityBegin 8674854 -MimeEntityHeadersEnd 8674948 -Octets 49 -Lines 5 -MimeEntityEnd 8674997 -MultipartBoundaryBegin 8674997 -MultipartBoundaryEnd 8675042 -MimeEntityBegin 8675042 -MimeEntityHeadersEnd 8675106 -Octets 228 -Lines 4 -MimeEntityEnd 8675334 -MultipartBoundaryBegin 8675334 -MultipartBoundaryEnd 8675379 -MimeEntityBegin 8675379 -MimeEntityHeadersEnd 8675473 -Octets 303 -Lines 11 -MimeEntityEnd 8675776 -MultipartBoundaryBegin 8675776 -MultipartBoundaryEnd 8675821 -MimeEntityBegin 8675821 -MimeEntityHeadersEnd 8675885 -Octets 884 -Lines 12 -MimeEntityEnd 8676769 -MultipartBoundaryBegin 8676769 -MultipartBoundaryEnd 8676814 -MimeEntityBegin 8676814 -MimeEntityHeadersEnd 8676908 -Octets 44 -Lines 4 -MimeEntityEnd 8676952 -MultipartBoundaryBegin 8676952 -MultipartBoundaryEnd 8676997 -MimeEntityBegin 8676997 -MimeEntityHeadersEnd 8677061 -Octets 1942 -Lines 27 -MimeEntityEnd 8679003 -MultipartBoundaryBegin 8679003 -MultipartBoundaryEnd 8679048 -MimeEntityBegin 8679048 -MimeEntityHeadersEnd 8679142 -Octets 11 -Lines 1 -MimeEntityEnd 8679153 -MultipartEndBoundaryBegin 8679153 -MultipartEndBoundaryEnd 8679198 -MultipartEpilogueBegin 8679198 -MultipartEpilogueEnd 8679200 -Octets 9524 -Lines 228 -MimeEntityEnd 8679200 -MultipartEndBoundaryBegin 8679200 -MultipartEndBoundaryEnd 8679243 -MultipartEpilogueBegin 8679243 -MultipartEpilogueEnd 8679245 -Octets 11650 -Lines 279 -MimeEntityEnd 8679245 -MimeMessageEnd 8679245 -MboxMarkerBegin 8679247 -MboxMarkerEnd 8679256 -MimeMessageBegin 8679256 -MimeEntityBegin 8679256 -MimeEntityHeadersEnd 8680000 -MimeMessageHeadersEnd 8680000 -MultipartPreambleBegin 8680000 -MultipartPreambleEnd 8680158 -MultipartBoundaryBegin 8680158 -MultipartBoundaryEnd 8680199 -MimeEntityBegin 8680199 -MimeEntityHeadersEnd 8680245 -Octets 639 -Lines 12 -MimeEntityEnd 8680884 -MultipartBoundaryBegin 8680884 -MultipartBoundaryEnd 8680927 -MimeEntityBegin 8680927 -MimeEntityHeadersEnd 8681015 -MultipartPreambleBegin 8681015 -MultipartPreambleEnd 8681015 -MultipartBoundaryBegin 8681015 -MultipartBoundaryEnd 8681058 -MimeEntityBegin 8681058 -MimeEntityHeadersEnd 8681152 -Octets 541 -Lines 8 -MimeEntityEnd 8681693 -MultipartBoundaryBegin 8681693 -MultipartBoundaryEnd 8681738 -MimeEntityBegin 8681738 -MimeEntityHeadersEnd 8681850 -Octets 8710 -Lines 125 -MimeEntityEnd 8690560 -MultipartBoundaryBegin 8690560 -MultipartBoundaryEnd 8690605 -MimeEntityBegin 8690605 -MimeEntityHeadersEnd 8690699 -Octets 48 -Lines 3 -MimeEntityEnd 8690747 -MultipartEndBoundaryBegin 8690747 -MultipartEndBoundaryEnd 8690792 -MultipartEpilogueBegin 8690792 -MultipartEpilogueEnd 8690794 -Octets 9779 -Lines 153 -MimeEntityEnd 8690794 -MultipartEndBoundaryBegin 8690794 -MultipartEndBoundaryEnd 8690837 -MultipartEpilogueBegin 8690837 -MultipartEpilogueEnd 8690837 -Octets 10837 -Lines 178 -MimeEntityEnd 8690837 -MimeMessageEnd 8690837 -MboxMarkerBegin 8690839 -MboxMarkerEnd 8690848 -MimeMessageBegin 8690848 -MimeEntityBegin 8690848 -MimeEntityHeadersEnd 8691509 -MimeMessageHeadersEnd 8691509 -MultipartPreambleBegin 8691509 -MultipartPreambleEnd 8691511 -MultipartBoundaryBegin 8691511 -MultipartBoundaryEnd 8691561 -MimeEntityBegin 8691561 -MimeEntityHeadersEnd 8691654 -Octets 103 -Lines 6 -MimeEntityEnd 8691757 -MultipartBoundaryBegin 8691757 -MultipartBoundaryEnd 8691809 -MimeEntityBegin 8691809 -MimeEntityHeadersEnd 8691940 -Octets 79516 -Lines 1075 -MimeEntityEnd 8771456 -MultipartEndBoundaryBegin 8771456 -MultipartEndBoundaryEnd 8771508 -MultipartEpilogueBegin 8771508 -MultipartEpilogueEnd 8771510 -Octets 80001 -Lines 1093 -MimeEntityEnd 8771510 -MimeMessageEnd 8771510 -MboxMarkerBegin 8771512 -MboxMarkerEnd 8771521 -MimeMessageBegin 8771521 -MimeEntityBegin 8771521 -MimeEntityHeadersEnd 8772294 -MimeMessageHeadersEnd 8772294 -MultipartPreambleBegin 8772294 -MultipartPreambleEnd 8772452 -MultipartBoundaryBegin 8772452 -MultipartBoundaryEnd 8772493 -MimeEntityBegin 8772493 -MimeEntityHeadersEnd 8772539 -Octets 1378 -Lines 28 -MimeEntityEnd 8773917 -MultipartBoundaryBegin 8773917 -MultipartBoundaryEnd 8773960 -MimeEntityBegin 8773960 -MimeEntityHeadersEnd 8774048 -MultipartPreambleBegin 8774048 -MultipartPreambleEnd 8774048 -MultipartBoundaryBegin 8774048 -MultipartBoundaryEnd 8774091 -MimeEntityBegin 8774091 -MimeEntityHeadersEnd 8774185 -Octets 1161 -Lines 22 -MimeEntityEnd 8775346 -MultipartBoundaryBegin 8775346 -MultipartBoundaryEnd 8775391 -MimeEntityBegin 8775391 -MimeEntityHeadersEnd 8775493 -Octets 116822 -Lines 1579 -MimeEntityEnd 8892315 -MultipartBoundaryBegin 8892315 -MultipartBoundaryEnd 8892360 -MimeEntityBegin 8892360 -MimeEntityHeadersEnd 8892454 -Octets 126 -Lines 3 -MimeEntityEnd 8892580 -MultipartBoundaryBegin 8892580 -MultipartBoundaryEnd 8892625 -MimeEntityBegin 8892625 -MimeEntityHeadersEnd 8892728 -Octets 67242 -Lines 961 -MimeEntityEnd 8959970 -MultipartBoundaryBegin 8959970 -MultipartBoundaryEnd 8960015 -MimeEntityBegin 8960015 -MimeEntityHeadersEnd 8960106 -Octets 0 -Lines 0 -MimeEntityEnd 8960106 -MultipartEndBoundaryBegin 8960106 -MultipartEndBoundaryEnd 8960151 -MultipartEpilogueBegin 8960151 -MultipartEpilogueEnd 8960153 -Octets 186105 -Lines 2593 -MimeEntityEnd 8960153 -MultipartEndBoundaryBegin 8960153 -MultipartEndBoundaryEnd 8960196 -MultipartEpilogueBegin 8960196 -MultipartEpilogueEnd 8960196 -Octets 187902 -Lines 2634 -MimeEntityEnd 8960196 -MimeMessageEnd 8960196 -MboxMarkerBegin 8960198 -MboxMarkerEnd 8960207 -MimeMessageBegin 8960207 -MimeEntityBegin 8960207 -MimeEntityHeadersEnd 8961063 -MimeMessageHeadersEnd 8961063 -Octets 1758 -Lines 25 -MimeEntityEnd 8962821 -MimeMessageEnd 8962821 -MboxMarkerBegin 8962823 -MboxMarkerEnd 8962832 -MimeMessageBegin 8962832 -MimeEntityBegin 8962832 -MimeEntityHeadersEnd 8963476 -MimeMessageHeadersEnd 8963476 -MimeMessageBegin 8963476 -MimeEntityBegin 8963476 -MimeEntityHeadersEnd 8963972 -MimeMessageHeadersEnd 8963972 -Octets 899 -Lines 25 -MimeEntityEnd 8964871 -MimeMessageEnd 8964871 -Octets 1395 -Lines 38 -MimeEntityEnd 8964871 -MimeMessageEnd 8964871 -MboxMarkerBegin 8964873 -MboxMarkerEnd 8964882 -MimeMessageBegin 8964882 -MimeEntityBegin 8964882 -MimeEntityHeadersEnd 8965340 -MimeMessageHeadersEnd 8965340 -MultipartPreambleBegin 8965340 -MultipartPreambleEnd 8965340 -MultipartBoundaryBegin 8965340 -MultipartBoundaryEnd 8965350 -MimeEntityBegin 8965350 -MimeEntityHeadersEnd 8965352 -Octets 41 -Lines 1 -MimeEntityEnd 8965393 -MultipartBoundaryBegin 8965393 -MultipartBoundaryEnd 8965405 -MimeEntityBegin 8965405 -MimeEntityHeadersEnd 8965469 -Octets 92498 -Lines 1250 -MimeEntityEnd 9057967 -MultipartEndBoundaryBegin 9057967 -MultipartEndBoundaryEnd 9057979 -MultipartEpilogueBegin 9057979 -MultipartEpilogueEnd 9057985 -Octets 92645 -Lines 1261 -MimeEntityEnd 9057985 -MimeMessageEnd 9057985 -MboxMarkerBegin 9057987 -MboxMarkerEnd 9057996 -MimeMessageBegin 9057996 -MimeEntityBegin 9057996 -MimeEntityHeadersEnd 9058498 -MimeMessageHeadersEnd 9058498 -Octets 1169 -Lines 27 -MimeEntityEnd 9059667 -MimeMessageEnd 9059667 -MboxMarkerBegin 9059669 -MboxMarkerEnd 9059678 -MimeMessageBegin 9059678 -MimeEntityBegin 9059678 -MimeEntityHeadersEnd 9060843 -MimeMessageHeadersEnd 9060843 -MultipartPreambleBegin 9060843 -MultipartPreambleEnd 9060843 -MultipartBoundaryBegin 9060843 -MultipartBoundaryEnd 9060849 -MimeEntityBegin 9060849 -MimeEntityHeadersEnd 9060851 -Octets 552 -Lines 12 -MimeEntityEnd 9061403 -MultipartBoundaryBegin 9061403 -MultipartBoundaryEnd 9061411 -MimeEntityBegin 9061411 -MimeEntityHeadersEnd 9061531 -Octets 58430 -Lines 790 -MimeEntityEnd 9119961 -MultipartBoundaryBegin 9119961 -MultipartBoundaryEnd 9119969 -MimeEntityBegin 9119969 -MimeEntityHeadersEnd 9119971 -Octets 3866 -Lines 83 -MimeEntityEnd 9123837 -MultipartBoundaryBegin 9123837 -MultipartBoundaryEnd 9123845 -MimeEntityBegin 9123845 -MimeEntityHeadersEnd 9124003 -Octets 30644 -Lines 1010 -MimeEntityEnd 9154647 -MultipartBoundaryBegin 9154647 -MultipartBoundaryEnd 9154655 -MimeEntityBegin 9154655 -MimeEntityHeadersEnd 9154764 -Octets 740 -Lines 24 -MimeEntityEnd 9155504 -MultipartBoundaryBegin 9155504 -MultipartBoundaryEnd 9155512 -MimeEntityBegin 9155512 -MimeEntityHeadersEnd 9155632 -Octets 1288 -Lines 25 -MimeEntityEnd 9156920 -MultipartEndBoundaryBegin 9156920 -MultipartEndBoundaryEnd 9156928 -MultipartEpilogueBegin 9156928 -MultipartEpilogueEnd 9156930 -Octets 96087 -Lines 1970 -MimeEntityEnd 9156930 -MimeMessageEnd 9156930 -MboxMarkerBegin 9156932 -MboxMarkerEnd 9156965 -MimeMessageBegin 9156965 -MimeEntityBegin 9156965 -MimeEntityHeadersEnd 9158136 -MimeMessageHeadersEnd 9158136 -MultipartPreambleBegin 9158136 -MultipartPreambleEnd 9158136 -MultipartBoundaryBegin 9158136 -MultipartBoundaryEnd 9158154 -MimeEntityBegin 9158154 -MimeEntityHeadersEnd 9158156 -Octets 921 -Lines 20 -MimeEntityEnd 9159077 -MultipartBoundaryBegin 9159077 -MultipartBoundaryEnd 9159097 -MimeEntityBegin 9159097 -MimeEntityHeadersEnd 9159179 -Octets 760 -Lines 12 -MimeEntityEnd 9159939 -MultipartEndBoundaryBegin 9159939 -MultipartEndBoundaryEnd 9159959 -MultipartEpilogueBegin 9159959 -MultipartEpilogueEnd 9159961 -Octets 1825 -Lines 41 -MimeEntityEnd 9159961 -MimeMessageEnd 9159961 -MboxMarkerBegin 9159963 -MboxMarkerEnd 9159996 -MimeMessageBegin 9159996 -MimeEntityBegin 9159996 -MimeEntityHeadersEnd 9161157 -MimeMessageHeadersEnd 9161157 -MultipartPreambleBegin 9161157 -MultipartPreambleEnd 9161333 -MultipartBoundaryBegin 9161333 -MultipartBoundaryEnd 9161341 -MimeEntityBegin 9161341 -MimeEntityHeadersEnd 9161422 -Octets 754 -Lines 14 -MimeEntityEnd 9162176 -MultipartBoundaryBegin 9162176 -MultipartBoundaryEnd 9162186 -MimeEntityBegin 9162186 -MimeEntityHeadersEnd 9162369 -Octets 2246 -Lines 31 -MimeEntityEnd 9164615 -MultipartEndBoundaryBegin 9164615 -MultipartEndBoundaryEnd 9164625 -MultipartEpilogueBegin 9164625 -MultipartEpilogueEnd 9164625 -Octets 3468 -Lines 60 -MimeEntityEnd 9164625 -MimeMessageEnd 9164625 -MboxMarkerBegin 9164627 -MboxMarkerEnd 9164660 -MimeMessageBegin 9164660 -MimeEntityBegin 9164660 -MimeEntityHeadersEnd 9165820 -MimeMessageHeadersEnd 9165820 -MultipartPreambleBegin 9165820 -MultipartPreambleEnd 9165996 -MultipartBoundaryBegin 9165996 -MultipartBoundaryEnd 9166018 -MimeEntityBegin 9166018 -MimeEntityHeadersEnd 9166099 -Octets 2858 -Lines 47 -MimeEntityEnd 9168957 -MultipartBoundaryBegin 9168957 -MultipartBoundaryEnd 9168981 -MimeEntityBegin 9168981 -MimeEntityHeadersEnd 9169164 -Octets 2582 -Lines 35 -MimeEntityEnd 9171746 -MultipartEndBoundaryBegin 9171746 -MultipartEndBoundaryEnd 9171770 -MultipartEpilogueBegin 9171770 -MultipartEpilogueEnd 9171770 -Octets 5950 -Lines 97 -MimeEntityEnd 9171770 -MimeMessageEnd 9171770 -MboxMarkerBegin 9171772 -MboxMarkerEnd 9171781 -MimeMessageBegin 9171781 -MimeEntityBegin 9171781 -MimeEntityHeadersEnd 9171996 -MimeMessageHeadersEnd 9171996 -Octets 4250 -Lines 58 -MimeEntityEnd 9176246 -MimeMessageEnd 9176246 -MboxMarkerBegin 9176248 -MboxMarkerEnd 9176281 -MimeMessageBegin 9176281 -MimeEntityBegin 9176281 -MimeEntityHeadersEnd 9177199 -MimeMessageHeadersEnd 9177199 -MultipartPreambleBegin 9177199 -MultipartPreambleEnd 9177247 -MultipartBoundaryBegin 9177247 -MultipartBoundaryEnd 9177275 -MimeEntityBegin 9177275 -MimeEntityHeadersEnd 9177413 -Octets 10868 -Lines 147 -MimeEntityEnd 9188281 -MultipartBoundaryBegin 9188281 -MultipartBoundaryEnd 9188311 -MimeEntityBegin 9188311 -MimeEntityHeadersEnd 9188466 -Octets 4674 -Lines 64 -MimeEntityEnd 9193140 -MultipartEndBoundaryBegin 9193140 -MultipartEndBoundaryEnd 9193170 -MultipartEpilogueBegin 9193170 -MultipartEpilogueEnd 9193172 -Octets 15973 -Lines 224 -MimeEntityEnd 9193172 -MimeMessageEnd 9193172 -MboxMarkerBegin 9193174 -MboxMarkerEnd 9193207 -MimeMessageBegin 9193207 -MimeEntityBegin 9193207 -MimeEntityHeadersEnd 9194031 -MimeMessageHeadersEnd 9194031 -Octets 17018 -Lines 258 -MimeEntityEnd 9211049 -MimeMessageEnd 9211049 -MboxMarkerBegin 9211051 -MboxMarkerEnd 9211084 -MimeMessageBegin 9211084 -MimeEntityBegin 9211084 -MimeEntityHeadersEnd 9211913 -MimeMessageHeadersEnd 9211913 -Octets 25348 -Lines 385 -MimeEntityEnd 9237261 -MimeMessageEnd 9237261 -MboxMarkerBegin 9237263 -MboxMarkerEnd 9237296 -MimeMessageBegin 9237296 -MimeEntityBegin 9237296 -MimeEntityHeadersEnd 9238125 -MimeMessageHeadersEnd 9238125 -Octets 36686 -Lines 556 -MimeEntityEnd 9274811 -MimeMessageEnd 9274811 -MboxMarkerBegin 9274813 -MboxMarkerEnd 9274846 -MimeMessageBegin 9274846 -MimeEntityBegin 9274846 -MimeEntityHeadersEnd 9275678 -MimeMessageHeadersEnd 9275678 -Octets 52090 -Lines 790 -MimeEntityEnd 9327768 -MimeMessageEnd 9327768 -MboxMarkerBegin 9327770 -MboxMarkerEnd 9327803 -MimeMessageBegin 9327803 -MimeEntityBegin 9327803 -MimeEntityHeadersEnd 9329218 -MimeMessageHeadersEnd 9329218 -Octets 1450 -Lines 20 -MimeEntityEnd 9330668 -MimeMessageEnd 9330668 -MboxMarkerBegin 9330670 -MboxMarkerEnd 9330703 -MimeMessageBegin 9330703 -MimeEntityBegin 9330703 -MimeEntityHeadersEnd 9332080 -MimeMessageHeadersEnd 9332080 -MultipartPreambleBegin 9332080 -MultipartPreambleEnd 9332082 -MultipartBoundaryBegin 9332082 -MultipartBoundaryEnd 9332127 -MimeEntityBegin 9332127 -MimeEntityHeadersEnd 9332194 -Octets 110 -Lines 4 -MimeEntityEnd 9332304 -MultipartBoundaryBegin 9332304 -MultipartBoundaryEnd 9332351 -MimeEntityBegin 9332351 -MimeEntityHeadersEnd 9332506 -Octets 3986 -Lines 54 -MimeEntityEnd 9336492 -MultipartEndBoundaryBegin 9336492 -MultipartEndBoundaryEnd 9336539 -MultipartEpilogueBegin 9336539 -MultipartEpilogueEnd 9336541 -Octets 4461 -Lines 69 -MimeEntityEnd 9336541 -MimeMessageEnd 9336541 -MboxMarkerBegin 9336543 -MboxMarkerEnd 9336576 -MimeMessageBegin 9336576 -MimeEntityBegin 9336576 -MimeEntityHeadersEnd 9337807 -MimeMessageHeadersEnd 9337807 -Octets 3550 -Lines 55 -MimeEntityEnd 9341357 -MimeMessageEnd 9341357 -MboxMarkerBegin 9341359 -MboxMarkerEnd 9341392 -MimeMessageBegin 9341392 -MimeEntityBegin 9341392 -MimeEntityHeadersEnd 9342490 -MimeMessageHeadersEnd 9342490 -Octets 670 -Lines 10 -MimeEntityEnd 9343160 -MimeMessageEnd 9343160 -MboxMarkerBegin 9343162 -MboxMarkerEnd 9343171 -MimeMessageBegin 9343171 -MimeEntityBegin 9343171 -MimeEntityHeadersEnd 9343574 -MimeMessageHeadersEnd 9343574 -Octets 7724 -Lines 105 -MimeEntityEnd 9351298 -MimeMessageEnd 9351298 -MboxMarkerBegin 9351300 -MboxMarkerEnd 9351333 -MimeMessageBegin 9351333 -MimeEntityBegin 9351333 -MimeEntityHeadersEnd 9352135 -MimeMessageHeadersEnd 9352135 -MimeMessageBegin 9352135 -MimeEntityBegin 9352135 -MimeEntityHeadersEnd 9353538 -MimeMessageHeadersEnd 9353538 -Octets 1452 -Lines 20 -MimeEntityEnd 9354990 -MimeMessageEnd 9354990 -Octets 2855 -Lines 43 -MimeEntityEnd 9354990 -MimeMessageEnd 9354990 -MboxMarkerBegin 9354992 -MboxMarkerEnd 9355025 -MimeMessageBegin 9355025 -MimeEntityBegin 9355025 -MimeEntityHeadersEnd 9355752 -MimeMessageHeadersEnd 9355752 -MultipartPreambleBegin 9355752 -MultipartPreambleEnd 9355800 -MultipartBoundaryBegin 9355800 -MultipartBoundaryEnd 9355828 -MimeEntityBegin 9355828 -MimeEntityHeadersEnd 9355907 -Octets 16 -Lines 1 -MimeEntityEnd 9355923 -MultipartBoundaryBegin 9355923 -MultipartBoundaryEnd 9355953 -MimeEntityBegin 9355953 -MimeEntityHeadersEnd 9356111 -MimeMessageBegin 9356111 -MimeEntityBegin 9356111 -MimeEntityHeadersEnd 9357514 -MimeMessageHeadersEnd 9357514 -Octets 1452 -Lines 20 -MimeEntityEnd 9358966 -MimeMessageEnd 9358966 -Octets 2855 -Lines 43 -MimeEntityEnd 9358966 -MultipartEndBoundaryBegin 9358966 -MultipartEndBoundaryEnd 9358996 -MultipartEpilogueBegin 9358996 -MultipartEpilogueEnd 9358998 -Octets 3246 -Lines 58 -MimeEntityEnd 9358998 -MimeMessageEnd 9358998 -MboxMarkerBegin 9359000 -MboxMarkerEnd 9359033 -MimeMessageBegin 9359033 -MimeEntityBegin 9359033 -MimeEntityHeadersEnd 9359714 -MimeMessageHeadersEnd 9359714 -MultipartPreambleBegin 9359714 -MultipartPreambleEnd 9359776 -MultipartBoundaryBegin 9359776 -MultipartBoundaryEnd 9359818 -MimeEntityBegin 9359818 -MimeEntityHeadersEnd 9359897 -Octets 42 -Lines 2 -MimeEntityEnd 9359939 -MultipartBoundaryBegin 9359939 -MultipartBoundaryEnd 9359983 -MimeEntityBegin 9359983 -MimeEntityHeadersEnd 9360138 -Octets 5632 -Lines 77 -MimeEntityEnd 9365770 -MultipartEndBoundaryBegin 9365770 -MultipartEndBoundaryEnd 9365814 -MultipartEpilogueBegin 9365814 -MultipartEpilogueEnd 9365816 -Octets 6102 -Lines 91 -MimeEntityEnd 9365816 -MimeMessageEnd 9365816 -MboxMarkerBegin 9365818 -MboxMarkerEnd 9365851 -MimeMessageBegin 9365851 -MimeEntityBegin 9365851 -MimeEntityHeadersEnd 9366934 -MimeMessageHeadersEnd 9366934 -Octets 10376 -Lines 141 -MimeEntityEnd 9377310 -MimeMessageEnd 9377310 -MboxMarkerBegin 9377312 -MboxMarkerEnd 9377345 -MimeMessageBegin 9377345 -MimeEntityBegin 9377345 -MimeEntityHeadersEnd 9378745 -MimeMessageHeadersEnd 9378745 -MultipartPreambleBegin 9378745 -MultipartPreambleEnd 9378807 -MultipartBoundaryBegin 9378807 -MultipartBoundaryEnd 9378849 -MimeEntityBegin 9378849 -MimeEntityHeadersEnd 9378928 -Octets 627 -Lines 17 -MimeEntityEnd 9379555 -MultipartBoundaryBegin 9379555 -MultipartBoundaryEnd 9379599 -MimeEntityBegin 9379599 -MimeEntityHeadersEnd 9379754 -Octets 1812 -Lines 25 -MimeEntityEnd 9381566 -MultipartEndBoundaryBegin 9381566 -MultipartEndBoundaryEnd 9381610 -MultipartEpilogueBegin 9381610 -MultipartEpilogueEnd 9381612 -Octets 2867 -Lines 54 -MimeEntityEnd 9381612 -MimeMessageEnd 9381612 -MboxMarkerBegin 9381614 -MboxMarkerEnd 9381647 -MimeMessageBegin 9381647 -MimeEntityBegin 9381647 -MimeEntityHeadersEnd 9382210 -MimeMessageHeadersEnd 9382210 -Octets 530 -Lines 8 -MimeEntityEnd 9382740 -MimeMessageEnd 9382740 -MboxMarkerBegin 9382742 -MboxMarkerEnd 9382751 -MimeMessageBegin 9382751 -MimeEntityBegin 9382751 -MimeEntityHeadersEnd 9384087 -MimeMessageHeadersEnd 9384087 -MultipartPreambleBegin 9384087 -MultipartPreambleEnd 9384307 -MultipartBoundaryBegin 9384307 -MultipartBoundaryEnd 9384349 -MimeEntityBegin 9384349 -MimeEntityHeadersEnd 9384395 -Octets 603 -Lines 15 -MimeEntityEnd 9384998 -MultipartEndBoundaryBegin 9384998 -MultipartEndBoundaryEnd 9385042 -MultipartEpilogueBegin 9385042 -MultipartEpilogueEnd 9385042 -Octets 955 -Lines 24 -MimeEntityEnd 9385042 -MimeMessageEnd 9385042 -MboxMarkerBegin 9385044 -MboxMarkerEnd 9385053 -MimeMessageBegin 9385053 -MimeEntityBegin 9385053 -MimeEntityHeadersEnd 9386420 -MimeMessageHeadersEnd 9386420 -MultipartPreambleBegin 9386420 -MultipartPreambleEnd 9386640 -MultipartBoundaryBegin 9386640 -MultipartBoundaryEnd 9386682 -MimeEntityBegin 9386682 -MimeEntityHeadersEnd 9386728 -Octets 107 -Lines 6 -MimeEntityEnd 9386835 -MultipartBoundaryBegin 9386835 -MultipartBoundaryEnd 9386879 -MimeEntityBegin 9386879 -MimeEntityHeadersEnd 9387046 -MultipartPreambleBegin 9387046 -MultipartPreambleEnd 9387266 -MultipartBoundaryBegin 9387266 -MultipartBoundaryEnd 9387306 -MimeEntityBegin 9387306 -MimeEntityHeadersEnd 9387416 -Octets 95 -Lines 4 -MimeEntityEnd 9387511 -MultipartBoundaryBegin 9387511 -MultipartBoundaryEnd 9387553 -MimeEntityBegin 9387553 -MimeEntityHeadersEnd 9387649 -MimeMessageBegin 9387649 -MimeEntityBegin 9387649 -MimeEntityHeadersEnd 9388845 -MimeMessageHeadersEnd 9388845 -Octets 210 -Lines 5 -MimeEntityEnd 9389055 -MimeMessageEnd 9389055 -Octets 1406 -Lines 34 -MimeEntityEnd 9389055 -MultipartBoundaryBegin 9389055 -MultipartBoundaryEnd 9389097 -MimeEntityBegin 9389097 -MimeEntityHeadersEnd 9389267 -Octets 490 -Lines 11 -MimeEntityEnd 9389757 -MultipartEndBoundaryBegin 9389757 -MultipartEndBoundaryEnd 9389799 -MultipartEpilogueBegin 9389799 -MultipartEpilogueEnd 9389799 -Octets 2753 -Lines 70 -MimeEntityEnd 9389799 -MultipartBoundaryBegin 9389799 -MultipartBoundaryEnd 9389843 -MimeEntityBegin 9389843 -MimeEntityHeadersEnd 9390060 -Octets 5294 -Lines 72 -MimeEntityEnd 9395354 -MultipartEndBoundaryBegin 9395354 -MultipartEndBoundaryEnd 9395398 -MultipartEpilogueBegin 9395398 -MultipartEpilogueEnd 9395402 -Octets 8982 -Lines 169 -MimeEntityEnd 9395402 -MimeMessageEnd 9395402 -MboxMarkerBegin 9395404 -MboxMarkerEnd 9395437 -MimeMessageBegin 9395437 -MimeEntityBegin 9395437 -MimeEntityHeadersEnd 9396672 -MimeMessageHeadersEnd 9396672 -Octets 2920 -Lines 38 -MimeEntityEnd 9399592 -MimeMessageEnd 9399592 -MboxMarkerBegin 9399594 -MboxMarkerEnd 9399627 -MimeMessageBegin 9399627 -MimeEntityBegin 9399627 -MimeEntityHeadersEnd 9400806 -MimeMessageHeadersEnd 9400806 -Octets 2152 -Lines 30 -MimeEntityEnd 9402958 -MimeMessageEnd 9402958 -MboxMarkerBegin 9402960 -MboxMarkerEnd 9402993 -MimeMessageBegin 9402993 -MimeEntityBegin 9402993 -MimeEntityHeadersEnd 9404092 -MimeMessageHeadersEnd 9404092 -MultipartPreambleBegin 9404092 -MultipartPreambleEnd 9404094 -MultipartBoundaryBegin 9404094 -MultipartBoundaryEnd 9404127 -MimeEntityBegin 9404127 -MimeEntityHeadersEnd 9404194 -Octets 0 -Lines 0 -MimeEntityEnd 9404194 -MultipartBoundaryBegin 9404194 -MultipartBoundaryEnd 9404229 -MimeEntityBegin 9404229 -MimeEntityHeadersEnd 9404311 -Octets 2754 -Lines 42 -MimeEntityEnd 9407065 -MultipartEndBoundaryBegin 9407065 -MultipartEndBoundaryEnd 9407100 -MultipartEpilogueBegin 9407100 -MultipartEpilogueEnd 9407102 -Octets 3010 -Lines 53 -MimeEntityEnd 9407102 -MimeMessageEnd 9407102 -MboxMarkerBegin 9407104 -MboxMarkerEnd 9407137 -MimeMessageBegin 9407137 -MimeEntityBegin 9407137 -MimeEntityHeadersEnd 9408193 -MimeMessageHeadersEnd 9408193 -MultipartPreambleBegin 9408193 -MultipartPreambleEnd 9408195 -MultipartBoundaryBegin 9408195 -MultipartBoundaryEnd 9408236 -MimeEntityBegin 9408236 -MimeEntityHeadersEnd 9408317 -Octets 466 -Lines 14 -MimeEntityEnd 9408783 -MultipartBoundaryBegin 9408783 -MultipartBoundaryEnd 9408826 -MimeEntityBegin 9408826 -MimeEntityHeadersEnd 9408904 -Octets 837 -Lines 27 -MimeEntityEnd 9409741 -MultipartBoundaryBegin 9409741 -MultipartBoundaryEnd 9409784 -MimeEntityBegin 9409784 -MimeEntityHeadersEnd 9409884 -Octets 1216 -Lines 16 -MimeEntityEnd 9411100 -MultipartEndBoundaryBegin 9411100 -MultipartEndBoundaryEnd 9411143 -MultipartEpilogueBegin 9411143 -MultipartEpilogueEnd 9411145 -Octets 2952 -Lines 72 -MimeEntityEnd 9411145 -MimeMessageEnd 9411145 -MboxMarkerBegin 9411147 -MboxMarkerEnd 9411180 -MimeMessageBegin 9411180 -MimeEntityBegin 9411180 -MimeEntityHeadersEnd 9412276 -MimeMessageHeadersEnd 9412276 -MultipartPreambleBegin 9412276 -MultipartPreambleEnd 9412278 -MultipartBoundaryBegin 9412278 -MultipartBoundaryEnd 9412321 -MimeEntityBegin 9412321 -MimeEntityHeadersEnd 9412394 -Octets 159 -Lines 7 -MimeEntityEnd 9412553 -MultipartBoundaryBegin 9412553 -MultipartBoundaryEnd 9412598 -MimeEntityBegin 9412598 -MimeEntityHeadersEnd 9412680 -Octets 4152 -Lines 57 -MimeEntityEnd 9416832 -MultipartEndBoundaryBegin 9416832 -MultipartEndBoundaryEnd 9416877 -MultipartEpilogueBegin 9416877 -MultipartEpilogueEnd 9416879 -Octets 4603 -Lines 75 -MimeEntityEnd 9416879 -MimeMessageEnd 9416879 -MboxMarkerBegin 9416881 -MboxMarkerEnd 9416890 -MimeMessageBegin 9416890 -MimeEntityBegin 9416890 -MimeEntityHeadersEnd 9417456 -MimeMessageHeadersEnd 9417456 -MultipartPreambleBegin 9417456 -MultipartPreambleEnd 9417458 -MultipartBoundaryBegin 9417458 -MultipartBoundaryEnd 9417502 -MimeEntityBegin 9417502 -MimeEntityHeadersEnd 9417569 -Octets 158 -Lines 4 -MimeEntityEnd 9417727 -MultipartBoundaryBegin 9417727 -MultipartBoundaryEnd 9417773 -MimeEntityBegin 9417773 -MimeEntityHeadersEnd 9417928 -Octets 3970 -Lines 54 -MimeEntityEnd 9421898 -MultipartEndBoundaryBegin 9421898 -MultipartEndBoundaryEnd 9421944 -MultipartEpilogueBegin 9421944 -MultipartEpilogueEnd 9421944 -Octets 4488 -Lines 69 -MimeEntityEnd 9421944 -MimeMessageEnd 9421944 -MboxMarkerBegin 9421946 -MboxMarkerEnd 9421979 -MimeMessageBegin 9421979 -MimeEntityBegin 9421979 -MimeEntityHeadersEnd 9423163 -MimeMessageHeadersEnd 9423163 -MultipartPreambleBegin 9423163 -MultipartPreambleEnd 9423303 -MultipartBoundaryBegin 9423303 -MultipartBoundaryEnd 9423344 -MimeEntityBegin 9423344 -MimeEntityHeadersEnd 9423425 -Octets 77 -Lines 5 -MimeEntityEnd 9423502 -MultipartBoundaryBegin 9423502 -MultipartBoundaryEnd 9423545 -MimeEntityBegin 9423545 -MimeEntityHeadersEnd 9423643 -Octets 3606 -Lines 47 -MimeEntityEnd 9427249 -MultipartEndBoundaryBegin 9427249 -MultipartEndBoundaryEnd 9427292 -MultipartEpilogueBegin 9427292 -MultipartEpilogueEnd 9427294 -Octets 4131 -Lines 66 -MimeEntityEnd 9427294 -MimeMessageEnd 9427294 -MboxMarkerBegin 9427296 -MboxMarkerEnd 9427329 -MimeMessageBegin 9427329 -MimeEntityBegin 9427329 -MimeEntityHeadersEnd 9428452 -MimeMessageHeadersEnd 9428452 -MultipartPreambleBegin 9428452 -MultipartPreambleEnd 9428454 -MultipartBoundaryBegin 9428454 -MultipartBoundaryEnd 9428488 -MimeEntityBegin 9428488 -MimeEntityHeadersEnd 9428569 -Octets 78 -Lines 5 -MimeEntityEnd 9428647 -MultipartBoundaryBegin 9428647 -MultipartBoundaryEnd 9428683 -MimeEntityBegin 9428683 -MimeEntityHeadersEnd 9428765 -Octets 3774 -Lines 58 -MimeEntityEnd 9432539 -MultipartEndBoundaryBegin 9432539 -MultipartEndBoundaryEnd 9432575 -MultipartEpilogueBegin 9432575 -MultipartEpilogueEnd 9432575 -Octets 4123 -Lines 73 -MimeEntityEnd 9432575 -MimeMessageEnd 9432575 -MboxMarkerBegin 9432577 -MboxMarkerEnd 9432610 -MimeMessageBegin 9432610 -MimeEntityBegin 9432610 -MimeEntityHeadersEnd 9433755 -MimeMessageHeadersEnd 9433755 -MultipartPreambleBegin 9433755 -MultipartPreambleEnd 9433872 -MultipartBoundaryBegin 9433872 -MultipartBoundaryEnd 9433897 -MimeEntityBegin 9433897 -MimeEntityHeadersEnd 9433938 -Octets 194 -Lines 6 -MimeEntityEnd 9434132 -MultipartBoundaryBegin 9434132 -MultipartBoundaryEnd 9434159 -MimeEntityBegin 9434159 -MimeEntityHeadersEnd 9434191 -MimeMessageBegin 9434191 -MimeEntityBegin 9434191 -MimeEntityHeadersEnd 9435012 -MimeMessageHeadersEnd 9435012 -Octets 11 -Lines 1 -MimeEntityEnd 9435023 -MimeMessageEnd 9435023 -Octets 832 -Lines 16 -MimeEntityEnd 9435023 -MultipartEndBoundaryBegin 9435023 -MultipartEndBoundaryEnd 9435050 -MultipartEpilogueBegin 9435050 -MultipartEpilogueEnd 9435052 -Octets 1297 -Lines 34 -MimeEntityEnd 9435052 -MimeMessageEnd 9435052 -MboxMarkerBegin 9435054 -MboxMarkerEnd 9435101 -MimeMessageBegin 9435101 -MimeEntityBegin 9435101 -MimeEntityHeadersEnd 9435272 -MimeMessageHeadersEnd 9435272 -Octets 35086 -Lines 592 -MimeEntityEnd 9470358 -MimeMessageEnd 9470358 -MboxMarkerBegin 9470360 -MboxMarkerEnd 9470407 -MimeMessageBegin 9470407 -MimeEntityBegin 9470407 -MimeEntityHeadersEnd 9470571 -MimeMessageHeadersEnd 9470571 -Octets 35086 -Lines 592 -MimeEntityEnd 9505657 -MimeMessageEnd 9505657 -MboxMarkerBegin 9505659 -MboxMarkerEnd 9505668 -MimeMessageBegin 9505668 -MimeEntityBegin 9505668 -MimeEntityHeadersEnd 9506276 -MimeMessageHeadersEnd 9506276 -Octets 1438 -Lines 39 -MimeEntityEnd 9507714 -MimeMessageEnd 9507714 -MboxMarkerBegin 9507716 -MboxMarkerEnd 9507725 -MimeMessageBegin 9507725 -MimeEntityBegin 9507725 -MimeEntityHeadersEnd 9508642 -MimeMessageHeadersEnd 9508642 -MultipartPreambleBegin 9508642 -MultipartPreambleEnd 9508642 -MultipartBoundaryBegin 9508642 -MultipartBoundaryEnd 9508682 -MimeEntityBegin 9508682 -MimeEntityHeadersEnd 9508710 -Octets 355 -Lines 10 -MimeEntityEnd 9509065 -MultipartBoundaryBegin 9509065 -MultipartBoundaryEnd 9509107 -MimeEntityBegin 9509107 -MimeEntityHeadersEnd 9509204 -Octets 245530 -Lines 3961 -MimeEntityEnd 9754734 -MultipartEndBoundaryBegin 9754734 -MultipartEndBoundaryEnd 9754776 -MultipartEpilogueBegin 9754776 -MultipartEpilogueEnd 9754778 -Octets 246136 -Lines 3982 -MimeEntityEnd 9754778 -MimeMessageEnd 9754778 -MboxMarkerBegin 9754780 -MboxMarkerEnd 9754789 -MimeMessageBegin 9754789 -MimeEntityBegin 9754789 -MimeEntityHeadersEnd 9755397 -MimeMessageHeadersEnd 9755397 -MultipartPreambleBegin 9755397 -MultipartPreambleEnd 9755433 -MultipartBoundaryBegin 9755433 -MultipartBoundaryEnd 9755461 -MimeEntityBegin 9755461 -MimeEntityHeadersEnd 9755625 -Octets 78694 -Lines 406 -MimeEntityEnd 9834319 -MultipartEndBoundaryBegin 9834319 -MultipartEndBoundaryEnd 9834349 -MultipartEpilogueBegin 9834349 -MultipartEpilogueEnd 9834353 -Octets 78956 -Lines 416 -MimeEntityEnd 9834353 -MimeMessageEnd 9834353 -MboxMarkerBegin 9834355 -MboxMarkerEnd 9834364 -MimeMessageBegin 9834364 -MimeEntityBegin 9834364 -MimeEntityHeadersEnd 9834521 -MimeMessageHeadersEnd 9834521 -Octets 3608 -Lines 49 -MimeEntityEnd 9838129 -MimeMessageEnd 9838129 -MboxMarkerBegin 9838131 -MboxMarkerEnd 9838140 -MimeMessageBegin 9838140 -MimeEntityBegin 9838140 -MimeEntityHeadersEnd 9838928 -MimeMessageHeadersEnd 9838928 -MultipartPreambleBegin 9838928 -MultipartPreambleEnd 9839086 -MultipartBoundaryBegin 9839086 -MultipartBoundaryEnd 9839127 -MimeEntityBegin 9839127 -MimeEntityHeadersEnd 9839173 -Octets 421 -Lines 7 -MimeEntityEnd 9839594 -MultipartBoundaryBegin 9839594 -MultipartBoundaryEnd 9839637 -MimeEntityBegin 9839637 -MimeEntityHeadersEnd 9839725 -MultipartPreambleBegin 9839725 -MultipartPreambleEnd 9839725 -MultipartBoundaryBegin 9839725 -MultipartBoundaryEnd 9839768 -MimeEntityBegin 9839768 -MimeEntityHeadersEnd 9839862 -Octets 72 -Lines 1 -MimeEntityEnd 9839934 -MultipartBoundaryBegin 9839934 -MultipartBoundaryEnd 9839979 -MimeEntityBegin 9839979 -MimeEntityHeadersEnd 9840082 -Octets 10854 -Lines 157 -MimeEntityEnd 9850936 -MultipartBoundaryBegin 9850936 -MultipartBoundaryEnd 9850981 -MimeEntityBegin 9850981 -MimeEntityHeadersEnd 9851075 -Octets 66 -Lines 2 -MimeEntityEnd 9851141 -MultipartBoundaryBegin 9851141 -MultipartBoundaryEnd 9851186 -MimeEntityBegin 9851186 -MimeEntityHeadersEnd 9851283 -Octets 5990 -Lines 87 -MimeEntityEnd 9857273 -MultipartBoundaryBegin 9857273 -MultipartBoundaryEnd 9857318 -MimeEntityBegin 9857318 -MimeEntityHeadersEnd 9857412 -Octets 35 -Lines 2 -MimeEntityEnd 9857447 -MultipartBoundaryBegin 9857447 -MultipartBoundaryEnd 9857492 -MimeEntityBegin 9857492 -MimeEntityHeadersEnd 9857597 -Octets 11816 -Lines 170 -MimeEntityEnd 9869413 -MultipartBoundaryBegin 9869413 -MultipartBoundaryEnd 9869458 -MimeEntityBegin 9869458 -MimeEntityHeadersEnd 9869552 -Octets 33 -Lines 2 -MimeEntityEnd 9869585 -MultipartEndBoundaryBegin 9869585 -MultipartEndBoundaryEnd 9869630 -MultipartEpilogueBegin 9869630 -MultipartEpilogueEnd 9869632 -Octets 29907 -Lines 460 -MimeEntityEnd 9869632 -MultipartEndBoundaryBegin 9869632 -MultipartEndBoundaryEnd 9869675 -MultipartEpilogueBegin 9869675 -MultipartEpilogueEnd 9869675 -Octets 30747 -Lines 480 -MimeEntityEnd 9869675 -MimeMessageEnd 9869675 -MboxMarkerBegin 9869677 -MboxMarkerEnd 9869686 -MimeMessageBegin 9869686 -MimeEntityBegin 9869686 -MimeEntityHeadersEnd 9869745 -MimeMessageHeadersEnd 9869745 -Octets 1235 -Lines 28 -MimeEntityEnd 9870980 -MimeMessageEnd 9870980 -MboxMarkerBegin 9870982 -MboxMarkerEnd 9871015 -MimeMessageBegin 9871015 -MimeEntityBegin 9871015 -MimeEntityHeadersEnd 9871171 -MimeMessageHeadersEnd 9871171 -Octets 3175 -Lines 68 -MimeEntityEnd 9874346 -MimeMessageEnd 9874346 -MboxMarkerBegin 9874348 -MboxMarkerEnd 9874381 -MimeMessageBegin 9874381 -MimeEntityBegin 9874381 -MimeEntityHeadersEnd 9876277 -MimeMessageHeadersEnd 9876277 -MultipartPreambleBegin 9876277 -MultipartPreambleEnd 9876277 -MultipartBoundaryBegin 9876277 -MultipartBoundaryEnd 9876322 -MimeEntityBegin 9876322 -MimeEntityHeadersEnd 9876403 -Octets 881 -Lines 18 -MimeEntityEnd 9877284 -MultipartBoundaryBegin 9877284 -MultipartBoundaryEnd 9877331 -MimeEntityBegin 9877331 -MimeEntityHeadersEnd 9877497 -Octets 3702 -Lines 61 -MimeEntityEnd 9881199 -MultipartEndBoundaryBegin 9881199 -MultipartEndBoundaryEnd 9881246 -MultipartEpilogueBegin 9881246 -MultipartEpilogueEnd 9881248 -Octets 4971 -Lines 92 -MimeEntityEnd 9881248 -MimeMessageEnd 9881248 -MboxMarkerBegin 9881250 -MboxMarkerEnd 9881259 -MimeMessageBegin 9881259 -MimeEntityBegin 9881259 -MimeEntityHeadersEnd 9881826 -MimeMessageHeadersEnd 9881826 -MultipartPreambleBegin 9881826 -MultipartPreambleEnd 9881828 -MultipartBoundaryBegin 9881828 -MultipartBoundaryEnd 9881845 -MimeEntityBegin 9881845 -MimeEntityHeadersEnd 9881874 -Octets 982 -Lines 19 -MimeEntityEnd 9882856 -MultipartBoundaryBegin 9882856 -MultipartBoundaryEnd 9882875 -MimeEntityBegin 9882875 -MimeEntityHeadersEnd 9882938 -Octets 117312 -Lines 1586 -MimeEntityEnd 10000250 -MultipartEndBoundaryBegin 10000250 -MultipartEndBoundaryEnd 10000269 -MultipartEpilogueBegin 10000269 -MultipartEpilogueEnd 10000273 -Octets 118447 -Lines 1617 -MimeEntityEnd 10000273 -MimeMessageEnd 10000273 -MboxMarkerBegin 10000275 -MboxMarkerEnd 10000284 -MimeMessageBegin 10000284 -MimeEntityBegin 10000284 -MimeEntityHeadersEnd 10001099 -MimeMessageHeadersEnd 10001099 -MultipartPreambleBegin 10001099 -MultipartPreambleEnd 10001257 -MultipartBoundaryBegin 10001257 -MultipartBoundaryEnd 10001298 -MimeEntityBegin 10001298 -MimeEntityHeadersEnd 10001344 -Octets 9312 -Lines 349 -MimeEntityEnd 10010656 -MultipartBoundaryBegin 10010656 -MultipartBoundaryEnd 10010699 -MimeEntityBegin 10010699 -MimeEntityHeadersEnd 10010787 -MultipartPreambleBegin 10010787 -MultipartPreambleEnd 10010787 -MultipartBoundaryBegin 10010787 -MultipartBoundaryEnd 10010830 -MimeEntityBegin 10010830 -MimeEntityHeadersEnd 10010924 -Octets 2844 -Lines 69 -MimeEntityEnd 10013768 -MultipartBoundaryBegin 10013768 -MultipartBoundaryEnd 10013813 -MimeEntityBegin 10013813 -MimeEntityHeadersEnd 10014016 -MimeMessageBegin 10014016 -MimeEntityBegin 10014016 -MimeEntityHeadersEnd 10014045 -MimeMessageHeadersEnd 10014045 -Octets 4 -Lines 2 -MimeEntityEnd 10014049 -MimeMessageEnd 10014049 -Octets 33 -Lines 4 -MimeEntityEnd 10014049 -MultipartBoundaryBegin 10014049 -MultipartBoundaryEnd 10014094 -MimeEntityBegin 10014094 -MimeEntityHeadersEnd 10014188 -Octets 996 -Lines 22 -MimeEntityEnd 10015184 -MultipartBoundaryBegin 10015184 -MultipartBoundaryEnd 10015229 -MimeEntityBegin 10015229 -MimeEntityHeadersEnd 10015349 -Octets 374 -Lines 15 -MimeEntityEnd 10015723 -MultipartBoundaryBegin 10015723 -MultipartBoundaryEnd 10015768 -MimeEntityBegin 10015768 -MimeEntityHeadersEnd 10015862 -Octets 12 -Lines 2 -MimeEntityEnd 10015874 -MultipartBoundaryBegin 10015874 -MultipartBoundaryEnd 10015919 -MimeEntityBegin 10015919 -MimeEntityHeadersEnd 10016110 -MimeMessageBegin 10016110 -MimeEntityBegin 10016110 -MimeEntityHeadersEnd 10016139 -MimeMessageHeadersEnd 10016139 -Octets 2 -Lines 1 -MimeEntityEnd 10016141 -MimeMessageEnd 10016141 -Octets 31 -Lines 3 -MimeEntityEnd 10016141 -MultipartBoundaryBegin 10016141 -MultipartBoundaryEnd 10016186 -MimeEntityBegin 10016186 -MimeEntityHeadersEnd 10016280 -Octets 12 -Lines 2 -MimeEntityEnd 10016292 -MultipartBoundaryBegin 10016292 -MultipartBoundaryEnd 10016337 -MimeEntityBegin 10016337 -MimeEntityHeadersEnd 10016447 -Octets 3026 -Lines 43 -MimeEntityEnd 10019473 -MultipartBoundaryBegin 10019473 -MultipartBoundaryEnd 10019518 -MimeEntityBegin 10019518 -MimeEntityHeadersEnd 10019612 -Octets 6852 -Lines 260 -MimeEntityEnd 10026464 -MultipartEndBoundaryBegin 10026464 -MultipartEndBoundaryEnd 10026509 -MultipartEpilogueBegin 10026509 -MultipartEpilogueEnd 10026511 -Octets 15724 -Lines 475 -MimeEntityEnd 10026511 -MultipartEndBoundaryBegin 10026511 -MultipartEndBoundaryEnd 10026554 -MultipartEpilogueBegin 10026554 -MultipartEpilogueEnd 10026556 -Octets 25457 -Lines 837 -MimeEntityEnd 10026556 -MimeMessageEnd 10026556 -MboxMarkerBegin 10026558 -MboxMarkerEnd 10026567 -MimeMessageBegin 10026567 -MimeEntityBegin 10026567 -MimeEntityHeadersEnd 10027702 -MimeMessageHeadersEnd 10027702 -MultipartPreambleBegin 10027702 -MultipartPreambleEnd 10027702 -MultipartBoundaryBegin 10027702 -MultipartBoundaryEnd 10027713 -MimeEntityBegin 10027713 -MimeEntityHeadersEnd 10027715 -Octets 341 -Lines 8 -MimeEntityEnd 10028056 -MultipartBoundaryBegin 10028056 -MultipartBoundaryEnd 10028069 -MimeEntityBegin 10028069 -MimeEntityHeadersEnd 10028131 -Octets 30390 -Lines 411 -MimeEntityEnd 10058521 -MultipartBoundaryBegin 10058521 -MultipartBoundaryEnd 10058534 -MimeEntityBegin 10058534 -MimeEntityHeadersEnd 10058536 -Octets 181 -Lines 9 -MimeEntityEnd 10058717 -MultipartEndBoundaryBegin 10058717 -MultipartEndBoundaryEnd 10058730 -MultipartEpilogueBegin 10058730 -MultipartEpilogueEnd 10058732 -Octets 31030 -Lines 440 -MimeEntityEnd 10058732 -MimeMessageEnd 10058732 -MboxMarkerBegin 10058734 -MboxMarkerEnd 10058743 -MimeMessageBegin 10058743 -MimeEntityBegin 10058743 -MimeEntityHeadersEnd 10060481 -MimeMessageHeadersEnd 10060481 -Octets 185750 -Lines 2951 -MimeEntityEnd 10246231 -MimeMessageEnd 10246231 -MboxMarkerBegin 10246233 -MboxMarkerEnd 10246242 -MimeMessageBegin 10246242 -MimeEntityBegin 10246242 -MimeEntityHeadersEnd 10246965 -MimeMessageHeadersEnd 10246965 -MultipartPreambleBegin 10246965 -MultipartPreambleEnd 10246965 -MultipartBoundaryBegin 10246965 -MultipartBoundaryEnd 10246993 -MimeEntityBegin 10246993 -MimeEntityHeadersEnd 10246995 -Octets 21 -Lines 1 -MimeEntityEnd 10247016 -MultipartBoundaryBegin 10247016 -MultipartBoundaryEnd 10247046 -MimeEntityBegin 10247046 -MimeEntityHeadersEnd 10247203 -Octets 84174 -Lines 434 -MimeEntityEnd 10331377 -MultipartBoundaryBegin 10331377 -MultipartBoundaryEnd 10331407 -MimeEntityBegin 10331407 -MimeEntityHeadersEnd 10331409 -Octets 267 -Lines 9 -MimeEntityEnd 10331676 -MultipartEndBoundaryBegin 10331676 -MultipartEndBoundaryEnd 10331706 -MultipartEpilogueBegin 10331706 -MultipartEpilogueEnd 10331708 -Octets 84743 -Lines 455 -MimeEntityEnd 10331708 -MimeMessageEnd 10331708 -MboxMarkerBegin 10331710 -MboxMarkerEnd 10331719 -MimeMessageBegin 10331719 -MimeEntityBegin 10331719 -MimeEntityHeadersEnd 10332401 -MimeMessageHeadersEnd 10332401 -MultipartPreambleBegin 10332401 -MultipartPreambleEnd 10332401 -MultipartBoundaryBegin 10332401 -MultipartBoundaryEnd 10332429 -MimeEntityBegin 10332429 -MimeEntityHeadersEnd 10332431 -Octets 66 -Lines 1 -MimeEntityEnd 10332497 -MultipartBoundaryBegin 10332497 -MultipartBoundaryEnd 10332527 -MimeEntityBegin 10332527 -MimeEntityHeadersEnd 10332693 -Octets 32332 -Lines 167 -MimeEntityEnd 10365025 -MultipartBoundaryBegin 10365025 -MultipartBoundaryEnd 10365055 -MimeEntityBegin 10365055 -MimeEntityHeadersEnd 10365057 -Octets 18 -Lines 2 -MimeEntityEnd 10365075 -MultipartBoundaryBegin 10365075 -MultipartBoundaryEnd 10365105 -MimeEntityBegin 10365105 -MimeEntityHeadersEnd 10365269 -Octets 1090 -Lines 6 -MimeEntityEnd 10366359 -MultipartBoundaryBegin 10366359 -MultipartBoundaryEnd 10366389 -MimeEntityBegin 10366389 -MimeEntityHeadersEnd 10366391 -Octets 32 -Lines 2 -MimeEntityEnd 10366423 -MultipartBoundaryBegin 10366423 -MultipartBoundaryEnd 10366453 -MimeEntityBegin 10366453 -MimeEntityHeadersEnd 10366524 -Octets 188027 -Lines 1990 -MimeEntityEnd 10554551 -MultipartBoundaryBegin 10554551 -MultipartBoundaryEnd 10554581 -MimeEntityBegin 10554581 -MimeEntityHeadersEnd 10554583 -Octets 8 -Lines 1 -MimeEntityEnd 10554591 -MultipartEndBoundaryBegin 10554591 -MultipartEndBoundaryEnd 10554621 -MultipartEpilogueBegin 10554621 -MultipartEpilogueEnd 10554623 -Octets 222222 -Lines 2196 -MimeEntityEnd 10554623 -MimeMessageEnd 10554623 -MboxMarkerBegin 10554625 -MboxMarkerEnd 10554634 -MimeMessageBegin 10554634 -MimeEntityBegin 10554634 -MimeEntityHeadersEnd 10554906 -MimeMessageHeadersEnd 10554906 -Octets 75680 -Lines 1023 -MimeEntityEnd 10630586 -MimeMessageEnd 10630586 -MboxMarkerBegin 10630588 -MboxMarkerEnd 10630597 -MimeMessageBegin 10630597 -MimeEntityBegin 10630597 -MimeEntityHeadersEnd 10631896 -MimeMessageHeadersEnd 10631896 -MultipartPreambleBegin 10631896 -MultipartPreambleEnd 10632430 -MultipartBoundaryBegin 10632430 -MultipartBoundaryEnd 10632489 -MimeEntityBegin 10632489 -MimeEntityHeadersEnd 10632491 -Octets 1881 -Lines 34 -MimeEntityEnd 10634372 -MultipartBoundaryBegin 10634372 -MultipartBoundaryEnd 10634433 -MimeEntityBegin 10634433 -MimeEntityHeadersEnd 10634539 -MultipartPreambleBegin 10634539 -MultipartPreambleEnd 10634539 -MultipartBoundaryBegin 10634539 -MultipartBoundaryEnd 10634600 -MimeEntityBegin 10634600 -MimeEntityHeadersEnd 10634676 -Octets 2028 -Lines 29 -MimeEntityEnd 10636704 -MultipartBoundaryBegin 10636704 -MultipartBoundaryEnd 10636767 -MimeEntityBegin 10636767 -MimeEntityHeadersEnd 10636829 -Octets 8038 -Lines 109 -MimeEntityEnd 10644867 -MultipartBoundaryBegin 10644867 -MultipartBoundaryEnd 10644930 -MimeEntityBegin 10644930 -MimeEntityHeadersEnd 10645003 -Octets 5 -Lines 2 -MimeEntityEnd 10645008 -MultipartBoundaryBegin 10645008 -MultipartBoundaryEnd 10645071 -MimeEntityBegin 10645071 -MimeEntityHeadersEnd 10645168 -Octets 42452 -Lines 574 -MimeEntityEnd 10687620 -MultipartEndBoundaryBegin 10687620 -MultipartEndBoundaryEnd 10687683 -MultipartEpilogueBegin 10687683 -MultipartEpilogueEnd 10687685 -Octets 53146 -Lines 736 -MimeEntityEnd 10687685 -MultipartEndBoundaryBegin 10687685 -MultipartEndBoundaryEnd 10687746 -MultipartEpilogueBegin 10687746 -MultipartEpilogueEnd 10687748 -Octets 55852 -Lines 787 -MimeEntityEnd 10687748 -MimeMessageEnd 10687748 -MboxMarkerBegin 10687750 -MboxMarkerEnd 10687759 -MimeMessageBegin 10687759 -MimeEntityBegin 10687759 -MimeEntityHeadersEnd 10687916 -MimeMessageHeadersEnd 10687916 -Octets 4870 -Lines 68 -MimeEntityEnd 10692786 -MimeMessageEnd 10692786 -MboxMarkerBegin 10692788 -MboxMarkerEnd 10692797 -MimeMessageBegin 10692797 -MimeEntityBegin 10692797 -MimeEntityHeadersEnd 10693559 -MimeMessageHeadersEnd 10693559 -MultipartPreambleBegin 10693559 -MultipartPreambleEnd 10693904 -MultipartBoundaryBegin 10693904 -MultipartBoundaryEnd 10693945 -MimeEntityBegin 10693945 -MimeEntityHeadersEnd 10693947 -Octets 376 -Lines 8 -MimeEntityEnd 10694323 -MultipartBoundaryBegin 10694323 -MultipartBoundaryEnd 10694366 -MimeEntityBegin 10694366 -MimeEntityHeadersEnd 10694454 -MultipartPreambleBegin 10694454 -MultipartPreambleEnd 10694454 -MultipartBoundaryBegin 10694454 -MultipartBoundaryEnd 10694497 -MimeEntityBegin 10694497 -MimeEntityHeadersEnd 10694570 -Octets 93 -Lines 4 -MimeEntityEnd 10694663 -MultipartBoundaryBegin 10694663 -MultipartBoundaryEnd 10694708 -MimeEntityBegin 10694708 -MimeEntityHeadersEnd 10694826 -Octets 5746 -Lines 83 -MimeEntityEnd 10700572 -MultipartBoundaryBegin 10700572 -MultipartBoundaryEnd 10700617 -MimeEntityBegin 10700617 -MimeEntityHeadersEnd 10700690 -Octets 209 -Lines 6 -MimeEntityEnd 10700899 -MultipartEndBoundaryBegin 10700899 -MultipartEndBoundaryEnd 10700944 -MultipartEpilogueBegin 10700944 -MultipartEpilogueEnd 10700946 -Octets 6492 -Lines 110 -MimeEntityEnd 10700946 -MultipartEndBoundaryBegin 10700946 -MultipartEndBoundaryEnd 10700989 -MultipartEpilogueBegin 10700989 -MultipartEpilogueEnd 10700991 -Octets 7432 -Lines 133 -MimeEntityEnd 10700991 -MimeMessageEnd 10700991 diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.txt b/UnitTests/TestData/mbox/jwz.unix-offsets.txt deleted file mode 100644 index 6ce00d6065..0000000000 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.txt +++ /dev/null @@ -1,7039 +0,0 @@ -MboxMarkerBegin 0 -MboxMarkerEnd 8 -MimeMessageBegin 8 -MimeEntityBegin 8 -MimeEntityHeadersEnd 517 -MimeMessageHeadersEnd 517 -MultipartPreambleBegin 517 -MultipartPreambleEnd 517 -MultipartBoundaryBegin 517 -MultipartBoundaryEnd 534 -MimeEntityBegin 534 -MimeEntityHeadersEnd 630 -MultipartPreambleBegin 630 -MultipartPreambleEnd 630 -MultipartBoundaryBegin 630 -MultipartBoundaryEnd 661 -MimeEntityBegin 661 -MimeEntityHeadersEnd 662 -Octets 715 -Lines 17 -MimeEntityEnd 1377 -MultipartBoundaryBegin 1377 -MultipartBoundaryEnd 1409 -MimeEntityBegin 1409 -MimeEntityHeadersEnd 1493 -Octets 31046 -Lines 426 -MimeEntityEnd 32539 -MultipartEndBoundaryBegin 32539 -MultipartEndBoundaryEnd 32572 -MultipartEpilogueBegin 32572 -MultipartEpilogueEnd 32572 -Octets 31942 -Lines 452 -MimeEntityEnd 32572 -MultipartBoundaryBegin 32572 -MultipartBoundaryEnd 32590 -MimeEntityBegin 32590 -MimeEntityHeadersEnd 32683 -MultipartPreambleBegin 32683 -MultipartPreambleEnd 32683 -MultipartBoundaryBegin 32683 -MultipartBoundaryEnd 32714 -MimeEntityBegin 32714 -MimeEntityHeadersEnd 32796 -Octets 25648 -Lines 352 -MimeEntityEnd 58444 -MultipartBoundaryBegin 58444 -MultipartBoundaryEnd 58476 -MimeEntityBegin 58476 -MimeEntityHeadersEnd 58558 -Octets 18413 -Lines 253 -MimeEntityEnd 76971 -MultipartBoundaryBegin 76971 -MultipartBoundaryEnd 77003 -MimeEntityBegin 77003 -MimeEntityHeadersEnd 77117 -Octets 43689 -Lines 2437 -MimeEntityEnd 120806 -MultipartBoundaryBegin 120806 -MultipartBoundaryEnd 120838 -MimeEntityBegin 120838 -MimeEntityHeadersEnd 120899 -Octets 8846 -Lines 357 -MimeEntityEnd 129745 -MultipartEndBoundaryBegin 129745 -MultipartEndBoundaryEnd 129778 -MultipartEpilogueBegin 129778 -MultipartEpilogueEnd 129778 -Octets 97095 -Lines 3421 -MimeEntityEnd 129778 -MultipartBoundaryBegin 129778 -MultipartBoundaryEnd 129796 -MimeEntityBegin 129796 -MimeEntityHeadersEnd 129880 -Octets 47175 -Lines 647 -MimeEntityEnd 177055 -MultipartEndBoundaryBegin 177055 -MultipartEndBoundaryEnd 177074 -MultipartEpilogueBegin 177074 -MultipartEpilogueEnd 177075 -Octets 176558 -Lines 4535 -MimeEntityEnd 177075 -MimeMessageEnd 177075 -MboxMarkerBegin 177076 -MboxMarkerEnd 177084 -MimeMessageBegin 177084 -MimeEntityBegin 177084 -MimeEntityHeadersEnd 177633 -MimeMessageHeadersEnd 177633 -Octets 135270 -Lines 1854 -MimeEntityEnd 312903 -MimeMessageEnd 312903 -MboxMarkerBegin 312904 -MboxMarkerEnd 312912 -MimeMessageBegin 312912 -MimeEntityBegin 312912 -MimeEntityHeadersEnd 313291 -MimeMessageHeadersEnd 313291 -Octets 201 -Lines 4 -MimeEntityEnd 313492 -MimeMessageEnd 313492 -MboxMarkerBegin 313493 -MboxMarkerEnd 313501 -MimeMessageBegin 313501 -MimeEntityBegin 313501 -MimeEntityHeadersEnd 314147 -MimeMessageHeadersEnd 314147 -MultipartPreambleBegin 314147 -MultipartPreambleEnd 314302 -MultipartBoundaryBegin 314302 -MultipartBoundaryEnd 314342 -MimeEntityBegin 314342 -MimeEntityHeadersEnd 314386 -Octets 233 -Lines 6 -MimeEntityEnd 314619 -MultipartBoundaryBegin 314619 -MultipartBoundaryEnd 314660 -MimeEntityBegin 314660 -MimeEntityHeadersEnd 314745 -MultipartPreambleBegin 314745 -MultipartPreambleEnd 314745 -MultipartBoundaryBegin 314745 -MultipartBoundaryEnd 314787 -MimeEntityBegin 314787 -MimeEntityHeadersEnd 314878 -Octets 146 -Lines 3 -MimeEntityEnd 315024 -MultipartBoundaryBegin 315024 -MultipartBoundaryEnd 315067 -MimeEntityBegin 315067 -MimeEntityHeadersEnd 315177 -Octets 4368 -Lines 64 -MimeEntityEnd 319545 -MultipartBoundaryBegin 319545 -MultipartBoundaryEnd 319588 -MimeEntityBegin 319588 -MimeEntityHeadersEnd 319679 -Octets 45 -Lines 3 -MimeEntityEnd 319724 -MultipartEndBoundaryBegin 319724 -MultipartEndBoundaryEnd 319768 -MultipartEpilogueBegin 319768 -MultipartEpilogueEnd 319769 -Octets 5024 -Lines 87 -MimeEntityEnd 319769 -MultipartEndBoundaryBegin 319769 -MultipartEndBoundaryEnd 319811 -MultipartEpilogueBegin 319811 -MultipartEpilogueEnd 319811 -Octets 5664 -Lines 106 -MimeEntityEnd 319811 -MimeMessageEnd 319811 -MboxMarkerBegin 319812 -MboxMarkerEnd 319820 -MimeMessageBegin 319820 -MimeEntityBegin 319820 -MimeEntityHeadersEnd 320568 -MimeMessageHeadersEnd 320568 -MultipartPreambleBegin 320568 -MultipartPreambleEnd 320763 -MultipartBoundaryBegin 320763 -MultipartBoundaryEnd 320825 -MimeEntityBegin 320825 -MimeEntityHeadersEnd 320898 -Octets 424 -Lines 12 -MimeEntityEnd 321322 -MultipartBoundaryBegin 321322 -MultipartBoundaryEnd 321385 -MimeEntityBegin 321385 -MimeEntityHeadersEnd 321415 -MimeMessageBegin 321415 -MimeEntityBegin 321415 -MimeEntityHeadersEnd 322251 -MimeMessageHeadersEnd 322251 -MultipartPreambleBegin 322251 -MultipartPreambleEnd 322527 -MultipartBoundaryBegin 322527 -MultipartBoundaryEnd 322557 -MimeEntityBegin 322557 -MimeEntityHeadersEnd 322651 -Octets 104 -Lines 6 -MimeEntityEnd 322755 -MultipartBoundaryBegin 322755 -MultipartBoundaryEnd 322786 -MimeEntityBegin 322786 -MimeEntityHeadersEnd 322875 -Octets 20627 -Lines 283 -MimeEntityEnd 343502 -MultipartBoundaryBegin 343502 -MultipartBoundaryEnd 343533 -MimeEntityBegin 343533 -MimeEntityHeadersEnd 343534 -Octets 0 -Lines 0 -MimeEntityEnd 343533 -Octets 21282 -Lines 308 -MimeEntityEnd 343533 -MimeMessageEnd 343533 -Octets 22118 -Lines 324 -MimeEntityEnd 343533 -MultipartBoundaryBegin 343533 -MultipartBoundaryEnd 343596 -MimeEntityBegin 343596 -MimeEntityHeadersEnd 343669 -Octets 107 -Lines 4 -MimeEntityEnd 343776 -MultipartEndBoundaryBegin 343776 -MultipartEndBoundaryEnd 343840 -MultipartEpilogueBegin 343840 -MultipartEpilogueEnd 343841 -Octets 23273 -Lines 359 -MimeEntityEnd 343841 -MimeMessageEnd 343841 -MboxMarkerBegin 343842 -MboxMarkerEnd 343850 -MimeMessageBegin 343850 -MimeEntityBegin 343850 -MimeEntityHeadersEnd 344568 -MimeMessageHeadersEnd 344568 -MultipartPreambleBegin 344568 -MultipartPreambleEnd 344723 -MultipartBoundaryBegin 344723 -MultipartBoundaryEnd 344763 -MimeEntityBegin 344763 -MimeEntityHeadersEnd 344807 -Octets 760 -Lines 18 -MimeEntityEnd 345567 -MultipartBoundaryBegin 345567 -MultipartBoundaryEnd 345608 -MimeEntityBegin 345608 -MimeEntityHeadersEnd 345693 -MultipartPreambleBegin 345693 -MultipartPreambleEnd 345693 -MultipartBoundaryBegin 345693 -MultipartBoundaryEnd 345735 -MimeEntityBegin 345735 -MimeEntityHeadersEnd 345826 -Octets 225 -Lines 4 -MimeEntityEnd 346051 -MultipartBoundaryBegin 346051 -MultipartBoundaryEnd 346094 -MimeEntityBegin 346094 -MimeEntityHeadersEnd 346202 -Octets 675064 -Lines 8982 -MimeEntityEnd 1021266 -MultipartBoundaryBegin 1021266 -MultipartBoundaryEnd 1021309 -MimeEntityBegin 1021309 -MimeEntityHeadersEnd 1021400 -Octets 116 -Lines 5 -MimeEntityEnd 1021516 -MultipartBoundaryBegin 1021516 -MultipartBoundaryEnd 1021559 -MimeEntityBegin 1021559 -MimeEntityHeadersEnd 1021685 -Octets 681136 -Lines 9060 -MimeEntityEnd 1702821 -MultipartBoundaryBegin 1702821 -MultipartBoundaryEnd 1702864 -MimeEntityBegin 1702864 -MimeEntityHeadersEnd 1702955 -Octets 10 -Lines 2 -MimeEntityEnd 1702965 -MultipartBoundaryBegin 1702965 -MultipartBoundaryEnd 1703008 -MimeEntityBegin 1703008 -MimeEntityHeadersEnd 1703125 -Octets 68178 -Lines 934 -MimeEntityEnd 1771303 -MultipartBoundaryBegin 1771303 -MultipartBoundaryEnd 1771346 -MimeEntityBegin 1771346 -MimeEntityHeadersEnd 1771437 -Octets 138 -Lines 5 -MimeEntityEnd 1771575 -MultipartBoundaryBegin 1771575 -MultipartBoundaryEnd 1771618 -MimeEntityBegin 1771618 -MimeEntityHeadersEnd 1771736 -Octets 336762 -Lines 4472 -MimeEntityEnd 2108498 -MultipartBoundaryBegin 2108498 -MultipartBoundaryEnd 2108541 -MimeEntityBegin 2108541 -MimeEntityHeadersEnd 2108632 -Octets 5 -Lines 1 -MimeEntityEnd 2108637 -MultipartEndBoundaryBegin 2108637 -MultipartEndBoundaryEnd 2108681 -MultipartEpilogueBegin 2108681 -MultipartEpilogueEnd 2108682 -Octets 1762989 -Lines 23515 -MimeEntityEnd 2108682 -MultipartEndBoundaryBegin 2108682 -MultipartEndBoundaryEnd 2108724 -MultipartEpilogueBegin 2108724 -MultipartEpilogueEnd 2108724 -Octets 1764156 -Lines 23546 -MimeEntityEnd 2108724 -MimeMessageEnd 2108724 -MboxMarkerBegin 2108725 -MboxMarkerEnd 2108733 -MimeMessageBegin 2108733 -MimeEntityBegin 2108733 -MimeEntityHeadersEnd 2109749 -MimeMessageHeadersEnd 2109749 -Octets 1125 -Lines 39 -MimeEntityEnd 2110874 -MimeMessageEnd 2110874 -MboxMarkerBegin 2110875 -MboxMarkerEnd 2110883 -MimeMessageBegin 2110883 -MimeEntityBegin 2110883 -MimeEntityHeadersEnd 2111121 -MimeMessageHeadersEnd 2111121 -MultipartPreambleBegin 2111121 -MultipartPreambleEnd 2111121 -MultipartBoundaryBegin 2111121 -MultipartBoundaryEnd 2111136 -MimeEntityBegin 2111136 -MimeEntityHeadersEnd 2111137 -Octets 300 -Lines 6 -MimeEntityEnd 2111437 -MultipartBoundaryBegin 2111437 -MultipartBoundaryEnd 2111453 -MimeEntityBegin 2111453 -MimeEntityHeadersEnd 2111529 -MultipartPreambleBegin 2111529 -MultipartPreambleEnd 2111529 -MultipartBoundaryBegin 2111529 -MultipartBoundaryEnd 2111545 -MimeEntityBegin 2111545 -MimeEntityHeadersEnd 2111622 -Octets 3260 -Lines 17 -MimeEntityEnd 2114882 -MultipartBoundaryBegin 2114882 -MultipartBoundaryEnd 2114899 -MimeEntityBegin 2114899 -MimeEntityHeadersEnd 2115002 -Octets 155899 -Lines 808 -MimeEntityEnd 2270901 -MultipartEndBoundaryBegin 2270901 -MultipartEndBoundaryEnd 2270919 -MultipartEpilogueBegin 2270919 -MultipartEpilogueEnd 2270919 -Octets 159390 -Lines 837 -MimeEntityEnd 2270919 -MultipartBoundaryBegin 2270919 -MultipartBoundaryEnd 2270935 -MimeEntityBegin 2270935 -MimeEntityHeadersEnd 2270991 -Octets 4720 -Lines 195 -MimeEntityEnd 2275711 -MultipartEndBoundaryBegin 2275711 -MultipartEndBoundaryEnd 2275728 -MultipartEpilogueBegin 2275728 -MultipartEpilogueEnd 2275728 -Octets 164607 -Lines 1050 -MimeEntityEnd 2275728 -MimeMessageEnd 2275728 -MboxMarkerBegin 2275729 -MboxMarkerEnd 2275737 -MimeMessageBegin 2275737 -MimeEntityBegin 2275737 -MimeEntityHeadersEnd 2276689 -MimeMessageHeadersEnd 2276689 -Octets 343060 -Lines 4456 -MimeEntityEnd 2619749 -MimeMessageEnd 2619749 -MboxMarkerBegin 2619750 -MboxMarkerEnd 2619758 -MimeMessageBegin 2619758 -MimeEntityBegin 2619758 -MimeEntityHeadersEnd 2619892 -MimeMessageHeadersEnd 2619892 -MultipartPreambleBegin 2619892 -MultipartPreambleEnd 2619892 -MultipartBoundaryBegin 2619892 -MultipartBoundaryEnd 2619909 -MimeEntityBegin 2619909 -MimeEntityHeadersEnd 2619982 -MultipartPreambleBegin 2619982 -MultipartPreambleEnd 2619982 -MultipartBoundaryBegin 2619982 -MultipartBoundaryEnd 2620013 -MimeEntityBegin 2620013 -MimeEntityHeadersEnd 2620014 -Octets 707 -Lines 18 -MimeEntityEnd 2620721 -MultipartBoundaryBegin 2620721 -MultipartBoundaryEnd 2620753 -MimeEntityBegin 2620753 -MimeEntityHeadersEnd 2620850 -Octets 31046 -Lines 426 -MimeEntityEnd 2651896 -MultipartEndBoundaryBegin 2651896 -MultipartEndBoundaryEnd 2651929 -MultipartEpilogueBegin 2651929 -MultipartEpilogueEnd 2651929 -Octets 31947 -Lines 453 -MimeEntityEnd 2651929 -MultipartEndBoundaryBegin 2651929 -MultipartEndBoundaryEnd 2651948 -MultipartEpilogueBegin 2651948 -MultipartEpilogueEnd 2651948 -Octets 32056 -Lines 457 -MimeEntityEnd 2651948 -MimeMessageEnd 2651948 -MboxMarkerBegin 2651949 -MboxMarkerEnd 2651957 -MimeMessageBegin 2651957 -MimeEntityBegin 2651957 -MimeEntityHeadersEnd 2652514 -MimeMessageHeadersEnd 2652514 -Octets 56779 -Lines 782 -MimeEntityEnd 2709293 -MimeMessageEnd 2709293 -MboxMarkerBegin 2709294 -MboxMarkerEnd 2709302 -MimeMessageBegin 2709302 -MimeEntityBegin 2709302 -MimeEntityHeadersEnd 2710035 -MimeMessageHeadersEnd 2710035 -MultipartPreambleBegin 2710035 -MultipartPreambleEnd 2710561 -MultipartBoundaryBegin 2710561 -MultipartBoundaryEnd 2710619 -MimeEntityBegin 2710619 -MimeEntityHeadersEnd 2710620 -Octets 552 -Lines 14 -MimeEntityEnd 2711172 -MultipartBoundaryBegin 2711172 -MultipartBoundaryEnd 2711231 -MimeEntityBegin 2711231 -MimeEntityHeadersEnd 2711334 -MultipartPreambleBegin 2711334 -MultipartPreambleEnd 2711334 -MultipartBoundaryBegin 2711334 -MultipartBoundaryEnd 2711394 -MimeEntityBegin 2711394 -MimeEntityHeadersEnd 2711467 -Octets 419 -Lines 7 -MimeEntityEnd 2711886 -MultipartBoundaryBegin 2711886 -MultipartBoundaryEnd 2711947 -MimeEntityBegin 2711947 -MimeEntityHeadersEnd 2712006 -Octets 29261 -Lines 401 -MimeEntityEnd 2741267 -MultipartBoundaryBegin 2741267 -MultipartBoundaryEnd 2741328 -MimeEntityBegin 2741328 -MimeEntityHeadersEnd 2741398 -Octets 41 -Lines 4 -MimeEntityEnd 2741439 -MultipartEndBoundaryBegin 2741439 -MultipartEndBoundaryEnd 2741501 -MultipartEpilogueBegin 2741501 -MultipartEpilogueEnd 2741502 -Octets 30168 -Lines 428 -MimeEntityEnd 2741502 -MultipartEndBoundaryBegin 2741502 -MultipartEndBoundaryEnd 2741562 -MultipartEpilogueBegin 2741562 -MultipartEpilogueEnd 2741562 -Octets 31527 -Lines 459 -MimeEntityEnd 2741562 -MimeMessageEnd 2741562 -MboxMarkerBegin 2741563 -MboxMarkerEnd 2741571 -MimeMessageBegin 2741571 -MimeEntityBegin 2741571 -MimeEntityHeadersEnd 2742224 -MimeMessageHeadersEnd 2742224 -MultipartPreambleBegin 2742224 -MultipartPreambleEnd 2742564 -MultipartBoundaryBegin 2742564 -MultipartBoundaryEnd 2742593 -MimeEntityBegin 2742593 -MimeEntityHeadersEnd 2742594 -Octets 821 -Lines 27 -MimeEntityEnd 2743415 -MultipartBoundaryBegin 2743415 -MultipartBoundaryEnd 2743445 -MimeEntityBegin 2743445 -MimeEntityHeadersEnd 2743518 -MultipartPreambleBegin 2743518 -MultipartPreambleEnd 2743518 -MultipartBoundaryBegin 2743518 -MultipartBoundaryEnd 2743549 -MimeEntityBegin 2743549 -MimeEntityHeadersEnd 2743575 -Octets 137 -Lines 6 -MimeEntityEnd 2743712 -MultipartBoundaryBegin 2743712 -MultipartBoundaryEnd 2743744 -MimeEntityBegin 2743744 -MimeEntityHeadersEnd 2743809 -Octets 1197 -Lines 17 -MimeEntityEnd 2745006 -MultipartBoundaryBegin 2745006 -MultipartBoundaryEnd 2745038 -MimeEntityBegin 2745038 -MimeEntityHeadersEnd 2745064 -Octets 68 -Lines 1 -MimeEntityEnd 2745132 -MultipartBoundaryBegin 2745132 -MultipartBoundaryEnd 2745164 -MimeEntityBegin 2745164 -MimeEntityHeadersEnd 2745229 -Octets 1205 -Lines 17 -MimeEntityEnd 2746434 -MultipartBoundaryBegin 2746434 -MultipartBoundaryEnd 2746466 -MimeEntityBegin 2746466 -MimeEntityHeadersEnd 2746495 -Octets 546 -Lines 14 -MimeEntityEnd 2747041 -MultipartEndBoundaryBegin 2747041 -MultipartEndBoundaryEnd 2747074 -MultipartEpilogueBegin 2747074 -MultipartEpilogueEnd 2747075 -Octets 3557 -Lines 75 -MimeEntityEnd 2747075 -MultipartEndBoundaryBegin 2747075 -MultipartEndBoundaryEnd 2747106 -MultipartEpilogueBegin 2747106 -MultipartEpilogueEnd 2747107 -Octets 4883 -Lines 118 -MimeEntityEnd 2747107 -MimeMessageEnd 2747107 -MboxMarkerBegin 2747108 -MboxMarkerEnd 2747116 -MimeMessageBegin 2747116 -MimeEntityBegin 2747116 -MimeEntityHeadersEnd 2748092 -MimeMessageHeadersEnd 2748092 -Octets 1382 -Lines 32 -MimeEntityEnd 2749474 -MimeMessageEnd 2749474 -MboxMarkerBegin 2749475 -MboxMarkerEnd 2749483 -MimeMessageBegin 2749483 -MimeEntityBegin 2749483 -MimeEntityHeadersEnd 2749739 -MimeMessageHeadersEnd 2749739 -Octets 256 -Lines 6 -MimeEntityEnd 2749995 -MimeMessageEnd 2749995 -MboxMarkerBegin 2749996 -MboxMarkerEnd 2750004 -MimeMessageBegin 2750004 -MimeEntityBegin 2750004 -MimeEntityHeadersEnd 2750661 -MimeMessageHeadersEnd 2750661 -Octets 724 -Lines 14 -MimeEntityEnd 2751385 -MimeMessageEnd 2751385 -MboxMarkerBegin 2751386 -MboxMarkerEnd 2751394 -MimeMessageBegin 2751394 -MimeEntityBegin 2751394 -MimeEntityHeadersEnd 2752379 -MimeMessageHeadersEnd 2752379 -MultipartPreambleBegin 2752379 -MultipartPreambleEnd 2752381 -MultipartBoundaryBegin 2752381 -MultipartBoundaryEnd 2752420 -MimeEntityBegin 2752420 -MimeEntityHeadersEnd 2752466 -Octets 72 -Lines 5 -MimeEntityEnd 2752538 -MultipartBoundaryBegin 2752538 -MultipartBoundaryEnd 2752578 -MimeEntityBegin 2752578 -MimeEntityHeadersEnd 2752665 -MultipartPreambleBegin 2752665 -MultipartPreambleEnd 2752667 -MultipartBoundaryBegin 2752667 -MultipartBoundaryEnd 2752707 -MimeEntityBegin 2752707 -MimeEntityHeadersEnd 2752862 -Octets 65917 -Lines 957 -MimeEntityEnd 2818779 -MultipartBoundaryBegin 2818779 -MultipartBoundaryEnd 2818820 -MimeEntityBegin 2818820 -MimeEntityHeadersEnd 2819029 -Octets 364281 -Lines 5281 -MimeEntityEnd 3183310 -MultipartEndBoundaryBegin 3183310 -MultipartEndBoundaryEnd 3183352 -MultipartEpilogueBegin 3183352 -MultipartEpilogueEnd 3183354 -Octets 430689 -Lines 6256 -MimeEntityEnd 3183354 -MultipartEndBoundaryBegin 3183354 -MultipartEndBoundaryEnd 3183395 -MultipartEpilogueBegin 3183395 -MultipartEpilogueEnd 3183395 -Octets 431016 -Lines 6272 -MimeEntityEnd 3183395 -MimeMessageEnd 3183395 -MboxMarkerBegin 3183396 -MboxMarkerEnd 3183404 -MimeMessageBegin 3183404 -MimeEntityBegin 3183404 -MimeEntityHeadersEnd 3184389 -MimeMessageHeadersEnd 3184389 -MultipartPreambleBegin 3184389 -MultipartPreambleEnd 3184391 -MultipartBoundaryBegin 3184391 -MultipartBoundaryEnd 3184430 -MimeEntityBegin 3184430 -MimeEntityHeadersEnd 3184476 -Octets 72 -Lines 5 -MimeEntityEnd 3184548 -MultipartBoundaryBegin 3184548 -MultipartBoundaryEnd 3184588 -MimeEntityBegin 3184588 -MimeEntityHeadersEnd 3184674 -MultipartPreambleBegin 3184674 -MultipartPreambleEnd 3184676 -MultipartBoundaryBegin 3184676 -MultipartBoundaryEnd 3184716 -MimeEntityBegin 3184716 -MimeEntityHeadersEnd 3184871 -Octets 65917 -Lines 957 -MimeEntityEnd 3250788 -MultipartBoundaryBegin 3250788 -MultipartBoundaryEnd 3250829 -MimeEntityBegin 3250829 -MimeEntityHeadersEnd 3251038 -Octets 364281 -Lines 5281 -MimeEntityEnd 3615319 -MultipartEndBoundaryBegin 3615319 -MultipartEndBoundaryEnd 3615361 -MultipartEpilogueBegin 3615361 -MultipartEpilogueEnd 3615363 -Octets 430689 -Lines 6256 -MimeEntityEnd 3615363 -MultipartEndBoundaryBegin 3615363 -MultipartEndBoundaryEnd 3615404 -MultipartEpilogueBegin 3615404 -MultipartEpilogueEnd 3615404 -Octets 431015 -Lines 6272 -MimeEntityEnd 3615404 -MimeMessageEnd 3615404 -MboxMarkerBegin 3615405 -MboxMarkerEnd 3615413 -MimeMessageBegin 3615413 -MimeEntityBegin 3615413 -MimeEntityHeadersEnd 3615971 -MimeMessageHeadersEnd 3615971 -MimeMessageBegin 3615971 -MimeEntityBegin 3615971 -MimeEntityHeadersEnd 3616030 -MimeMessageHeadersEnd 3616030 -Octets 527 -Lines 14 -MimeEntityEnd 3616557 -MimeMessageEnd 3616557 -Octets 586 -Lines 17 -MimeEntityEnd 3616557 -MimeMessageEnd 3616557 -MboxMarkerBegin 3616558 -MboxMarkerEnd 3616566 -MimeMessageBegin 3616566 -MimeEntityBegin 3616566 -MimeEntityHeadersEnd 3617279 -MimeMessageHeadersEnd 3617279 -MultipartPreambleBegin 3617279 -MultipartPreambleEnd 3617280 -MultipartBoundaryBegin 3617280 -MultipartBoundaryEnd 3617323 -MimeEntityBegin 3617323 -MimeEntityHeadersEnd 3617349 -Octets 180 -Lines 6 -MimeEntityEnd 3617529 -MultipartBoundaryBegin 3617529 -MultipartBoundaryEnd 3617573 -MimeEntityBegin 3617573 -MimeEntityHeadersEnd 3617645 -Octets 892 -Lines 12 -MimeEntityEnd 3618537 -MultipartEndBoundaryBegin 3618537 -MultipartEndBoundaryEnd 3618582 -MultipartEpilogueBegin 3618582 -MultipartEpilogueEnd 3618690 -Octets 1411 -Lines 33 -MimeEntityEnd 3618690 -MimeMessageEnd 3618690 -MboxMarkerBegin 3618691 -MboxMarkerEnd 3618699 -MimeMessageBegin 3618699 -MimeEntityBegin 3618699 -MimeEntityHeadersEnd 3619238 -MimeMessageHeadersEnd 3619238 -MultipartPreambleBegin 3619238 -MultipartPreambleEnd 3619275 -MultipartBoundaryBegin 3619275 -MultipartBoundaryEnd 3619314 -MimeEntityBegin 3619314 -MimeEntityHeadersEnd 3619315 -Octets 392 -Lines 10 -MimeEntityEnd 3619707 -MultipartBoundaryBegin 3619707 -MultipartBoundaryEnd 3619747 -MimeEntityBegin 3619747 -MimeEntityHeadersEnd 3619777 -MimeMessageBegin 3619777 -MimeEntityBegin 3619777 -MimeEntityHeadersEnd 3620564 -MimeMessageHeadersEnd 3620564 -Octets 3353 -Lines 72 -MimeEntityEnd 3623917 -MimeMessageEnd 3623917 -Octets 4140 -Lines 88 -MimeEntityEnd 3623917 -MultipartEndBoundaryBegin 3623917 -MultipartEndBoundaryEnd 3623958 -MultipartEpilogueBegin 3623958 -MultipartEpilogueEnd 3623959 -Octets 4721 -Lines 108 -MimeEntityEnd 3623959 -MimeMessageEnd 3623959 -MboxMarkerBegin 3623960 -MboxMarkerEnd 3623968 -MimeMessageBegin 3623968 -MimeEntityBegin 3623968 -MimeEntityHeadersEnd 3624617 -MimeMessageHeadersEnd 3624617 -MultipartPreambleBegin 3624617 -MultipartPreambleEnd 3624617 -MultipartBoundaryBegin 3624617 -MultipartBoundaryEnd 3624666 -MimeEntityBegin 3624666 -MimeEntityHeadersEnd 3624692 -Octets 74 -Lines 5 -MimeEntityEnd 3624766 -MultipartBoundaryBegin 3624766 -MultipartBoundaryEnd 3624816 -MimeEntityBegin 3624816 -MimeEntityHeadersEnd 3624878 -MimeMessageBegin 3624878 -MimeEntityBegin 3624878 -MimeEntityHeadersEnd 3625660 -MimeMessageHeadersEnd 3625660 -Octets 137 -Lines 4 -MimeEntityEnd 3625797 -MimeMessageEnd 3625797 -Octets 919 -Lines 21 -MimeEntityEnd 3625797 -MultipartEndBoundaryBegin 3625797 -MultipartEndBoundaryEnd 3625848 -MultipartEpilogueBegin 3625848 -MultipartEpilogueEnd 3625848 -Octets 1231 -Lines 34 -MimeEntityEnd 3625848 -MimeMessageEnd 3625848 -MboxMarkerBegin 3625849 -MboxMarkerEnd 3625857 -MimeMessageBegin 3625857 -MimeEntityBegin 3625857 -MimeEntityHeadersEnd 3626367 -MimeMessageHeadersEnd 3626367 -Octets 1419 -Lines 45 -MimeEntityEnd 3627786 -MimeMessageEnd 3627786 -MboxMarkerBegin 3627787 -MboxMarkerEnd 3627838 -MimeMessageBegin 3627838 -MimeEntityBegin 3627838 -MimeEntityHeadersEnd 3628410 -MimeMessageHeadersEnd 3628410 -Octets 59701 -Lines 954 -MimeEntityEnd 3688111 -MimeMessageEnd 3688111 -MboxMarkerBegin 3688112 -MboxMarkerEnd 3688163 -MimeMessageBegin 3688163 -MimeEntityBegin 3688163 -MimeEntityHeadersEnd 3688732 -MimeMessageHeadersEnd 3688732 -Octets 59807 -Lines 960 -MimeEntityEnd 3748539 -MimeMessageEnd 3748539 -MboxMarkerBegin 3748540 -MboxMarkerEnd 3748548 -MimeMessageBegin 3748548 -MimeEntityBegin 3748548 -MimeEntityHeadersEnd 3749096 -MimeMessageHeadersEnd 3749096 -MultipartPreambleBegin 3749096 -MultipartPreambleEnd 3749097 -MultipartBoundaryBegin 3749097 -MultipartBoundaryEnd 3749112 -MimeEntityBegin 3749112 -MimeEntityHeadersEnd 3749139 -Octets 71 -Lines 4 -MimeEntityEnd 3749210 -MultipartBoundaryBegin 3749210 -MultipartBoundaryEnd 3749226 -MimeEntityBegin 3749226 -MimeEntityHeadersEnd 3749307 -Octets 641 -Lines 9 -MimeEntityEnd 3749948 -MultipartEndBoundaryBegin 3749948 -MultipartEndBoundaryEnd 3749965 -MultipartEpilogueBegin 3749965 -MultipartEpilogueEnd 3749967 -Octets 871 -Lines 25 -MimeEntityEnd 3749967 -MimeMessageEnd 3749967 -MboxMarkerBegin 3749968 -MboxMarkerEnd 3749976 -MimeMessageBegin 3749976 -MimeEntityBegin 3749976 -MimeEntityHeadersEnd 3750723 -MimeMessageHeadersEnd 3750723 -Octets 41530 -Lines 570 -MimeEntityEnd 3792253 -MimeMessageEnd 3792253 -MboxMarkerBegin 3792254 -MboxMarkerEnd 3792262 -MimeMessageBegin 3792262 -MimeEntityBegin 3792262 -MimeEntityHeadersEnd 3793416 -MimeMessageHeadersEnd 3793416 -MultipartPreambleBegin 3793416 -MultipartPreambleEnd 3793416 -MultipartBoundaryBegin 3793416 -MultipartBoundaryEnd 3793421 -MimeEntityBegin 3793421 -MimeEntityHeadersEnd 3793422 -Octets 1922 -Lines 43 -MimeEntityEnd 3795344 -MultipartBoundaryBegin 3795344 -MultipartBoundaryEnd 3795350 -MimeEntityBegin 3795350 -MimeEntityHeadersEnd 3795455 -Octets 6222 -Lines 86 -MimeEntityEnd 3801677 -MultipartEndBoundaryBegin 3801677 -MultipartEndBoundaryEnd 3801684 -MultipartEpilogueBegin 3801684 -MultipartEpilogueEnd 3801685 -Octets 8269 -Lines 139 -MimeEntityEnd 3801685 -MimeMessageEnd 3801685 -MboxMarkerBegin 3801686 -MboxMarkerEnd 3801694 -MimeMessageBegin 3801694 -MimeEntityBegin 3801694 -MimeEntityHeadersEnd 3803142 -MimeMessageHeadersEnd 3803142 -Octets 106813 -Lines 1570 -MimeEntityEnd 3909955 -MimeMessageEnd 3909955 -MboxMarkerBegin 3909956 -MboxMarkerEnd 3909964 -MimeMessageBegin 3909964 -MimeEntityBegin 3909964 -MimeEntityHeadersEnd 3910563 -MimeMessageHeadersEnd 3910563 -MimeMessageBegin 3910563 -MimeEntityBegin 3910563 -MimeEntityHeadersEnd 3911133 -MimeMessageHeadersEnd 3911133 -MimeMessageBegin 3911133 -MimeEntityBegin 3911133 -MimeEntityHeadersEnd 3911675 -MimeMessageHeadersEnd 3911675 -MimeMessageBegin 3911675 -MimeEntityBegin 3911675 -MimeEntityHeadersEnd 3912223 -MimeMessageHeadersEnd 3912223 -MultipartPreambleBegin 3912223 -MultipartPreambleEnd 3912269 -MultipartBoundaryBegin 3912269 -MultipartBoundaryEnd 3912327 -MimeEntityBegin 3912327 -MimeEntityHeadersEnd 3912403 -Octets 49 -Lines 1 -MimeEntityEnd 3912452 -MultipartBoundaryBegin 3912452 -MultipartBoundaryEnd 3912511 -MimeEntityBegin 3912511 -MimeEntityHeadersEnd 3912573 -MimeMessageBegin 3912573 -MimeEntityBegin 3912573 -MimeEntityHeadersEnd 3913073 -MimeMessageHeadersEnd 3913073 -MultipartPreambleBegin 3913073 -MultipartPreambleEnd 3913119 -MultipartBoundaryBegin 3913119 -MultipartBoundaryEnd 3913167 -MimeEntityBegin 3913167 -MimeEntityHeadersEnd 3913243 -Octets 122 -Lines 5 -MimeEntityEnd 3913365 -MultipartBoundaryBegin 3913365 -MultipartBoundaryEnd 3913414 -MimeEntityBegin 3913414 -MimeEntityHeadersEnd 3913483 -Octets 283 -Lines 5 -MimeEntityEnd 3913766 -MultipartEndBoundaryBegin 3913766 -MultipartEndBoundaryEnd 3913816 -MultipartEpilogueBegin 3913816 -MultipartEpilogueEnd 3913817 -Octets 744 -Lines 22 -MimeEntityEnd 3913817 -MimeMessageEnd 3913817 -Octets 1244 -Lines 38 -MimeEntityEnd 3913817 -MultipartEndBoundaryBegin 3913817 -MultipartEndBoundaryEnd 3913877 -MultipartEpilogueBegin 3913877 -MultipartEpilogueEnd 3913880 -Octets 1657 -Lines 54 -MimeEntityEnd 3913880 -MimeMessageEnd 3913880 -Octets 2205 -Lines 70 -MimeEntityEnd 3913880 -MimeMessageEnd 3913880 -Octets 2747 -Lines 86 -MimeEntityEnd 3913880 -MimeMessageEnd 3913880 -Octets 3317 -Lines 102 -MimeEntityEnd 3913880 -MimeMessageEnd 3913880 -MboxMarkerBegin 3913881 -MboxMarkerEnd 3913889 -MimeMessageBegin 3913889 -MimeEntityBegin 3913889 -MimeEntityHeadersEnd 3914592 -MimeMessageHeadersEnd 3914592 -MultipartPreambleBegin 3914592 -MultipartPreambleEnd 3914592 -MultipartBoundaryBegin 3914592 -MultipartBoundaryEnd 3914619 -MimeEntityBegin 3914619 -MimeEntityHeadersEnd 3914620 -Octets 41 -Lines 2 -MimeEntityEnd 3914661 -MultipartBoundaryBegin 3914661 -MultipartBoundaryEnd 3914689 -MimeEntityBegin 3914689 -MimeEntityHeadersEnd 3914834 -Octets 77216 -Lines 401 -MimeEntityEnd 3992050 -MultipartBoundaryBegin 3992050 -MultipartBoundaryEnd 3992078 -MimeEntityBegin 3992078 -MimeEntityHeadersEnd 3992079 -Octets 31 -Lines 3 -MimeEntityEnd 3992110 -MultipartBoundaryBegin 3992110 -MultipartBoundaryEnd 3992138 -MimeEntityBegin 3992138 -MimeEntityHeadersEnd 3992285 -Octets 103202 -Lines 535 -MimeEntityEnd 4095487 -MultipartBoundaryBegin 4095487 -MultipartBoundaryEnd 4095515 -MimeEntityBegin 4095515 -MimeEntityHeadersEnd 4095516 -Octets 160 -Lines 5 -MimeEntityEnd 4095676 -MultipartBoundaryBegin 4095676 -MultipartBoundaryEnd 4095704 -MimeEntityBegin 4095704 -MimeEntityHeadersEnd 4095793 -Octets 80190 -Lines 1235 -MimeEntityEnd 4175983 -MultipartBoundaryBegin 4175983 -MultipartBoundaryEnd 4176011 -MimeEntityBegin 4176011 -MimeEntityHeadersEnd 4176012 -Octets 20 -Lines 3 -MimeEntityEnd 4176032 -MultipartEndBoundaryBegin 4176032 -MultipartEndBoundaryEnd 4176061 -MultipartEpilogueBegin 4176061 -MultipartEpilogueEnd 4176062 -Octets 261470 -Lines 2210 -MimeEntityEnd 4176062 -MimeMessageEnd 4176062 -MboxMarkerBegin 4176063 -MboxMarkerEnd 4176071 -MimeMessageBegin 4176071 -MimeEntityBegin 4176071 -MimeEntityHeadersEnd 4176736 -MimeMessageHeadersEnd 4176736 -Octets 992 -Lines 18 -MimeEntityEnd 4177728 -MimeMessageEnd 4177728 -MboxMarkerBegin 4177729 -MboxMarkerEnd 4177737 -MimeMessageBegin 4177737 -MimeEntityBegin 4177737 -MimeEntityHeadersEnd 4178793 -MimeMessageHeadersEnd 4178793 -MultipartPreambleBegin 4178793 -MultipartPreambleEnd 4178948 -MultipartBoundaryBegin 4178948 -MultipartBoundaryEnd 4178988 -MimeEntityBegin 4178988 -MimeEntityHeadersEnd 4179032 -Octets 404 -Lines 13 -MimeEntityEnd 4179436 -MultipartBoundaryBegin 4179436 -MultipartBoundaryEnd 4179477 -MimeEntityBegin 4179477 -MimeEntityHeadersEnd 4179562 -MultipartPreambleBegin 4179562 -MultipartPreambleEnd 4179562 -MultipartBoundaryBegin 4179562 -MultipartBoundaryEnd 4179604 -MimeEntityBegin 4179604 -MimeEntityHeadersEnd 4179695 -Octets 225 -Lines 4 -MimeEntityEnd 4179920 -MultipartBoundaryBegin 4179920 -MultipartBoundaryEnd 4179963 -MimeEntityBegin 4179963 -MimeEntityHeadersEnd 4180082 -Octets 1384 -Lines 37 -MimeEntityEnd 4181466 -MultipartBoundaryBegin 4181466 -MultipartBoundaryEnd 4181509 -MimeEntityBegin 4181509 -MimeEntityHeadersEnd 4181600 -Octets 148 -Lines 9 -MimeEntityEnd 4181748 -MultipartEndBoundaryBegin 4181748 -MultipartEndBoundaryEnd 4181792 -MultipartEpilogueBegin 4181792 -MultipartEpilogueEnd 4181793 -Octets 2231 -Lines 67 -MimeEntityEnd 4181793 -MultipartEndBoundaryBegin 4181793 -MultipartEndBoundaryEnd 4181835 -MultipartEpilogueBegin 4181835 -MultipartEpilogueEnd 4181836 -Octets 3043 -Lines 93 -MimeEntityEnd 4181836 -MimeMessageEnd 4181836 -MboxMarkerBegin 4181837 -MboxMarkerEnd 4181845 -MimeMessageBegin 4181845 -MimeEntityBegin 4181845 -MimeEntityHeadersEnd 4182515 -MimeMessageHeadersEnd 4182515 -MultipartPreambleBegin 4182515 -MultipartPreambleEnd 4182515 -MultipartBoundaryBegin 4182515 -MultipartBoundaryEnd 4182531 -MimeEntityBegin 4182531 -MimeEntityHeadersEnd 4182558 -Octets 78 -Lines 6 -MimeEntityEnd 4182636 -MultipartBoundaryBegin 4182636 -MultipartBoundaryEnd 4182653 -MimeEntityBegin 4182653 -MimeEntityHeadersEnd 4182713 -Octets 5163 -Lines 71 -MimeEntityEnd 4187876 -MultipartEndBoundaryBegin 4187876 -MultipartEndBoundaryEnd 4187894 -MultipartEpilogueBegin 4187894 -MultipartEpilogueEnd 4187896 -Octets 5381 -Lines 88 -MimeEntityEnd 4187896 -MimeMessageEnd 4187896 -MboxMarkerBegin 4187897 -MboxMarkerEnd 4187905 -MimeMessageBegin 4187905 -MimeEntityBegin 4187905 -MimeEntityHeadersEnd 4188357 -MimeMessageHeadersEnd 4188357 -Octets 11414 -Lines 185 -MimeEntityEnd 4199771 -MimeMessageEnd 4199771 -MboxMarkerBegin 4199772 -MboxMarkerEnd 4199780 -MimeMessageBegin 4199780 -MimeEntityBegin 4199780 -MimeEntityHeadersEnd 4200345 -MimeMessageHeadersEnd 4200345 -MultipartPreambleBegin 4200345 -MultipartPreambleEnd 4200345 -MultipartBoundaryBegin 4200345 -MultipartBoundaryEnd 4200356 -MimeEntityBegin 4200356 -MimeEntityHeadersEnd 4200357 -Octets 38 -Lines 1 -MimeEntityEnd 4200395 -MultipartBoundaryBegin 4200395 -MultipartBoundaryEnd 4200407 -MimeEntityBegin 4200407 -MimeEntityHeadersEnd 4200462 -MultipartPreambleBegin 4200462 -MultipartPreambleEnd 4200462 -MultipartBoundaryBegin 4200462 -MultipartBoundaryEnd 4200476 -MimeEntityBegin 4200476 -MimeEntityHeadersEnd 4200592 -MimeMessageBegin 4200592 -MimeEntityBegin 4200592 -MimeEntityHeadersEnd 4200669 -MimeMessageHeadersEnd 4200669 -Octets 67 -Lines 2 -MimeEntityEnd 4200736 -MimeMessageEnd 4200736 -Octets 144 -Lines 5 -MimeEntityEnd 4200736 -MultipartBoundaryBegin 4200736 -MultipartBoundaryEnd 4200751 -MimeEntityBegin 4200751 -MimeEntityHeadersEnd 4200938 -MimeMessageBegin 4200938 -MimeEntityBegin 4200938 -MimeEntityHeadersEnd 4201015 -MimeMessageHeadersEnd 4201015 -Octets 0 -Lines 0 -MimeEntityEnd 4201014 -MimeMessageEnd 4201014 -Octets 76 -Lines 2 -MimeEntityEnd 4201014 -MultipartBoundaryBegin 4201014 -MultipartBoundaryEnd 4201029 -MimeEntityBegin 4201029 -MimeEntityHeadersEnd 4201164 -MimeMessageBegin 4201164 -MimeEntityBegin 4201164 -MimeEntityHeadersEnd 4201232 -MimeMessageHeadersEnd 4201232 -Octets 0 -Lines 0 -MimeEntityEnd 4201231 -MimeMessageEnd 4201231 -Octets 67 -Lines 2 -MimeEntityEnd 4201231 -MultipartBoundaryBegin 4201231 -MultipartBoundaryEnd 4201246 -MimeEntityBegin 4201246 -MimeEntityHeadersEnd 4201359 -MimeMessageBegin 4201359 -MimeEntityBegin 4201359 -MimeEntityHeadersEnd 4201428 -MimeMessageHeadersEnd 4201428 -Octets 0 -Lines 0 -MimeEntityEnd 4201427 -MimeMessageEnd 4201427 -Octets 68 -Lines 2 -MimeEntityEnd 4201427 -MultipartBoundaryBegin 4201427 -MultipartBoundaryEnd 4201442 -MimeEntityBegin 4201442 -MimeEntityHeadersEnd 4201547 -MimeMessageBegin 4201547 -MimeEntityBegin 4201547 -MimeEntityHeadersEnd 4201616 -MimeMessageHeadersEnd 4201616 -Octets 0 -Lines 0 -MimeEntityEnd 4201615 -MimeMessageEnd 4201615 -Octets 68 -Lines 2 -MimeEntityEnd 4201615 -MultipartEndBoundaryBegin 4201615 -MultipartEndBoundaryEnd 4201631 -MultipartEpilogueBegin 4201631 -MultipartEpilogueEnd 4201632 -Octets 1170 -Lines 49 -MimeEntityEnd 4201632 -MultipartEndBoundaryBegin 4201632 -MultipartEndBoundaryEnd 4201645 -MultipartEpilogueBegin 4201645 -MultipartEpilogueEnd 4201646 -Octets 1301 -Lines 58 -MimeEntityEnd 4201646 -MimeMessageEnd 4201646 -MboxMarkerBegin 4201647 -MboxMarkerEnd 4201655 -MimeMessageBegin 4201655 -MimeEntityBegin 4201655 -MimeEntityHeadersEnd 4202220 -MimeMessageHeadersEnd 4202220 -MultipartPreambleBegin 4202220 -MultipartPreambleEnd 4202220 -MultipartBoundaryBegin 4202220 -MultipartBoundaryEnd 4202231 -MimeEntityBegin 4202231 -MimeEntityHeadersEnd 4202232 -Octets 3204 -Lines 65 -MimeEntityEnd 4205436 -MultipartBoundaryBegin 4205436 -MultipartBoundaryEnd 4205448 -MimeEntityBegin 4205448 -MimeEntityHeadersEnd 4205509 -MultipartPreambleBegin 4205509 -MultipartPreambleEnd 4205509 -MultipartBoundaryBegin 4205509 -MultipartBoundaryEnd 4205523 -MimeEntityBegin 4205523 -MimeEntityHeadersEnd 4205639 -MimeMessageBegin 4205639 -MimeEntityBegin 4205639 -MimeEntityHeadersEnd 4205716 -MimeMessageHeadersEnd 4205716 -Octets 67 -Lines 2 -MimeEntityEnd 4205783 -MimeMessageEnd 4205783 -Octets 144 -Lines 5 -MimeEntityEnd 4205783 -MultipartBoundaryBegin 4205783 -MultipartBoundaryEnd 4205798 -MimeEntityBegin 4205798 -MimeEntityHeadersEnd 4205985 -MimeMessageBegin 4205985 -MimeEntityBegin 4205985 -MimeEntityHeadersEnd 4206062 -MimeMessageHeadersEnd 4206062 -Octets 0 -Lines 0 -MimeEntityEnd 4206061 -MimeMessageEnd 4206061 -Octets 76 -Lines 2 -MimeEntityEnd 4206061 -MultipartEndBoundaryBegin 4206061 -MultipartEndBoundaryEnd 4206077 -MultipartEpilogueBegin 4206077 -MultipartEpilogueEnd 4206078 -Octets 569 -Lines 22 -MimeEntityEnd 4206078 -MultipartEndBoundaryBegin 4206078 -MultipartEndBoundaryEnd 4206091 -MultipartEpilogueBegin 4206091 -MultipartEpilogueEnd 4206092 -Octets 3872 -Lines 95 -MimeEntityEnd 4206092 -MimeMessageEnd 4206092 -MboxMarkerBegin 4206093 -MboxMarkerEnd 4206101 -MimeMessageBegin 4206101 -MimeEntityBegin 4206101 -MimeEntityHeadersEnd 4206569 -MimeMessageHeadersEnd 4206569 -MultipartPreambleBegin 4206569 -MultipartPreambleEnd 4206615 -MultipartBoundaryBegin 4206615 -MultipartBoundaryEnd 4206642 -MimeEntityBegin 4206642 -MimeEntityHeadersEnd 4206786 -MimeMessageBegin 4206786 -MimeEntityBegin 4206786 -MimeEntityHeadersEnd 4207215 -MimeMessageHeadersEnd 4207215 -Octets 37 -Lines 2 -MimeEntityEnd 4207252 -MimeMessageEnd 4207252 -Octets 466 -Lines 13 -MimeEntityEnd 4207252 -MultipartBoundaryBegin 4207252 -MultipartBoundaryEnd 4207280 -MimeEntityBegin 4207280 -MimeEntityHeadersEnd 4207403 -Octets 458 -Lines 7 -MimeEntityEnd 4207861 -MultipartBoundaryBegin 4207861 -MultipartBoundaryEnd 4207889 -MimeEntityBegin 4207889 -MimeEntityHeadersEnd 4208012 -Octets 486 -Lines 7 -MimeEntityEnd 4208498 -MultipartBoundaryBegin 4208498 -MultipartBoundaryEnd 4208526 -MimeEntityBegin 4208526 -MimeEntityHeadersEnd 4208653 -Octets 527 -Lines 8 -MimeEntityEnd 4209180 -MultipartBoundaryBegin 4209180 -MultipartBoundaryEnd 4209208 -MimeEntityBegin 4209208 -MimeEntityHeadersEnd 4209333 -Octets 498 -Lines 7 -MimeEntityEnd 4209831 -MultipartBoundaryBegin 4209831 -MultipartBoundaryEnd 4209859 -MimeEntityBegin 4209859 -MimeEntityHeadersEnd 4210003 -MimeMessageBegin 4210003 -MimeEntityBegin 4210003 -MimeEntityHeadersEnd 4210432 -MimeMessageHeadersEnd 4210432 -Octets 37 -Lines 1 -MimeEntityEnd 4210469 -MimeMessageEnd 4210469 -Octets 466 -Lines 12 -MimeEntityEnd 4210469 -MultipartBoundaryBegin 4210469 -MultipartBoundaryEnd 4210497 -MimeEntityBegin 4210497 -MimeEntityHeadersEnd 4210668 -MimeMessageBegin 4210668 -MimeEntityBegin 4210668 -MimeEntityHeadersEnd 4211238 -MimeMessageHeadersEnd 4211238 -MimeMessageBegin 4211238 -MimeEntityBegin 4211238 -MimeEntityHeadersEnd 4211749 -MimeMessageHeadersEnd 4211749 -MimeMessageBegin 4211749 -MimeEntityBegin 4211749 -MimeEntityHeadersEnd 4212159 -MimeMessageHeadersEnd 4212159 -Octets 5 -Lines 1 -MimeEntityEnd 4212164 -MimeMessageEnd 4212164 -Octets 415 -Lines 12 -MimeEntityEnd 4212164 -MimeMessageEnd 4212164 -Octets 926 -Lines 26 -MimeEntityEnd 4212164 -MimeMessageEnd 4212164 -Octets 1496 -Lines 41 -MimeEntityEnd 4212164 -MultipartBoundaryBegin 4212164 -MultipartBoundaryEnd 4212192 -MimeEntityBegin 4212192 -MimeEntityHeadersEnd 4212245 -Octets 52 -Lines 1 -MimeEntityEnd 4212297 -MultipartEndBoundaryBegin 4212297 -MultipartEndBoundaryEnd 4212326 -MultipartEpilogueBegin 4212326 -MultipartEpilogueEnd 4212326 -Octets 5757 -Lines 145 -MimeEntityEnd 4212326 -MimeMessageEnd 4212326 -MboxMarkerBegin 4212327 -MboxMarkerEnd 4212335 -MimeMessageBegin 4212335 -MimeEntityBegin 4212335 -MimeEntityHeadersEnd 4212806 -MimeMessageHeadersEnd 4212806 -MultipartPreambleBegin 4212806 -MultipartPreambleEnd 4212852 -MultipartBoundaryBegin 4212852 -MultipartBoundaryEnd 4212879 -MimeEntityBegin 4212879 -MimeEntityHeadersEnd 4213027 -MimeMessageBegin 4213027 -MimeEntityBegin 4213027 -MimeEntityHeadersEnd 4213455 -MimeMessageHeadersEnd 4213455 -Octets 37 -Lines 2 -MimeEntityEnd 4213492 -MimeMessageEnd 4213492 -Octets 465 -Lines 13 -MimeEntityEnd 4213492 -MultipartBoundaryBegin 4213492 -MultipartBoundaryEnd 4213520 -MimeEntityBegin 4213520 -MimeEntityHeadersEnd 4213647 -Octets 458 -Lines 7 -MimeEntityEnd 4214105 -MultipartBoundaryBegin 4214105 -MultipartBoundaryEnd 4214133 -MimeEntityBegin 4214133 -MimeEntityHeadersEnd 4214260 -Octets 486 -Lines 7 -MimeEntityEnd 4214746 -MultipartBoundaryBegin 4214746 -MultipartBoundaryEnd 4214774 -MimeEntityBegin 4214774 -MimeEntityHeadersEnd 4214905 -Octets 527 -Lines 8 -MimeEntityEnd 4215432 -MultipartBoundaryBegin 4215432 -MultipartBoundaryEnd 4215460 -MimeEntityBegin 4215460 -MimeEntityHeadersEnd 4215589 -Octets 498 -Lines 7 -MimeEntityEnd 4216087 -MultipartBoundaryBegin 4216087 -MultipartBoundaryEnd 4216115 -MimeEntityBegin 4216115 -MimeEntityHeadersEnd 4216263 -MimeMessageBegin 4216263 -MimeEntityBegin 4216263 -MimeEntityHeadersEnd 4216691 -MimeMessageHeadersEnd 4216691 -Octets 37 -Lines 1 -MimeEntityEnd 4216728 -MimeMessageEnd 4216728 -Octets 465 -Lines 12 -MimeEntityEnd 4216728 -MultipartBoundaryBegin 4216728 -MultipartBoundaryEnd 4216756 -MimeEntityBegin 4216756 -MimeEntityHeadersEnd 4216931 -MimeMessageBegin 4216931 -MimeEntityBegin 4216931 -MimeEntityHeadersEnd 4217504 -MimeMessageHeadersEnd 4217504 -MimeMessageBegin 4217504 -MimeEntityBegin 4217504 -MimeEntityHeadersEnd 4218018 -MimeMessageHeadersEnd 4218018 -MimeMessageBegin 4218018 -MimeEntityBegin 4218018 -MimeEntityHeadersEnd 4218427 -MimeMessageHeadersEnd 4218427 -Octets 5 -Lines 1 -MimeEntityEnd 4218432 -MimeMessageEnd 4218432 -Octets 414 -Lines 12 -MimeEntityEnd 4218432 -MimeMessageEnd 4218432 -Octets 928 -Lines 26 -MimeEntityEnd 4218432 -MimeMessageEnd 4218432 -Octets 1501 -Lines 41 -MimeEntityEnd 4218432 -MultipartBoundaryBegin 4218432 -MultipartBoundaryEnd 4218460 -MimeEntityBegin 4218460 -MimeEntityHeadersEnd 4218517 -Octets 52 -Lines 1 -MimeEntityEnd 4218569 -MultipartEndBoundaryBegin 4218569 -MultipartEndBoundaryEnd 4218598 -MultipartEpilogueBegin 4218598 -MultipartEpilogueEnd 4218598 -Octets 5792 -Lines 145 -MimeEntityEnd 4218598 -MimeMessageEnd 4218598 -MboxMarkerBegin 4218599 -MboxMarkerEnd 4218607 -MimeMessageBegin 4218607 -MimeEntityBegin 4218607 -MimeEntityHeadersEnd 4219294 -MimeMessageHeadersEnd 4219294 -MultipartPreambleBegin 4219294 -MultipartPreambleEnd 4219335 -MultipartBoundaryBegin 4219335 -MultipartBoundaryEnd 4219341 -MimeEntityBegin 4219341 -MimeEntityHeadersEnd 4219370 -Octets 416 -Lines 30 -MimeEntityEnd 4219786 -MultipartBoundaryBegin 4219786 -MultipartBoundaryEnd 4219793 -MimeEntityBegin 4219793 -MimeEntityHeadersEnd 4219866 -Octets 631 -Lines 42 -MimeEntityEnd 4220497 -MultipartBoundaryBegin 4220497 -MultipartBoundaryEnd 4220504 -MimeEntityBegin 4220504 -MimeEntityHeadersEnd 4220505 -Octets 18 -Lines 1 -MimeEntityEnd 4220523 -MultipartBoundaryBegin 4220523 -MultipartBoundaryEnd 4220530 -MimeEntityBegin 4220530 -MimeEntityHeadersEnd 4220531 -Octets 11 -Lines 1 -MimeEntityEnd 4220542 -MultipartBoundaryBegin 4220542 -MultipartBoundaryEnd 4220549 -MimeEntityBegin 4220549 -MimeEntityHeadersEnd 4220579 -MimeMessageBegin 4220579 -MimeEntityBegin 4220579 -MimeEntityHeadersEnd 4220794 -MimeMessageHeadersEnd 4220794 -MultipartPreambleBegin 4220794 -MultipartPreambleEnd 4220794 -MultipartBoundaryBegin 4220794 -MultipartBoundaryEnd 4220800 -MimeEntityBegin 4220800 -MimeEntityHeadersEnd 4220825 -Octets 23 -Lines 1 -MimeEntityEnd 4220848 -MultipartBoundaryBegin 4220848 -MultipartBoundaryEnd 4220855 -MimeEntityBegin 4220855 -MimeEntityHeadersEnd 4221030 -Octets 38 -Lines 1 -MimeEntityEnd 4221068 -MultipartEndBoundaryBegin 4221068 -MultipartEndBoundaryEnd 4221076 -MultipartEpilogueBegin 4221076 -MultipartEpilogueEnd 4221076 -Octets 282 -Lines 13 -MimeEntityEnd 4221076 -MimeMessageEnd 4221076 -Octets 497 -Lines 20 -MimeEntityEnd 4221076 -MultipartBoundaryBegin 4221076 -MultipartBoundaryEnd 4221083 -MimeEntityBegin 4221083 -MimeEntityHeadersEnd 4221161 -Octets 9431 -Lines 128 -MimeEntityEnd 4230592 -MultipartBoundaryBegin 4230592 -MultipartBoundaryEnd 4230599 -MimeEntityBegin 4230599 -MimeEntityHeadersEnd 4230774 -Octets 38 -Lines 1 -MimeEntityEnd 4230812 -MultipartBoundaryBegin 4230812 -MultipartBoundaryEnd 4230819 -MimeEntityBegin 4230819 -MimeEntityHeadersEnd 4230967 -Octets 7821 -Lines 128 -MimeEntityEnd 4238788 -MultipartBoundaryBegin 4238788 -MultipartBoundaryEnd 4238795 -MimeEntityBegin 4238795 -MimeEntityHeadersEnd 4238847 -MultipartPreambleBegin 4238847 -MultipartPreambleEnd 4238847 -MultipartBoundaryBegin 4238847 -MultipartBoundaryEnd 4238857 -MimeEntityBegin 4238857 -MimeEntityHeadersEnd 4238858 -MimeMessageBegin 4238858 -MimeEntityBegin 4238858 -MimeEntityHeadersEnd 4238884 -MimeMessageHeadersEnd 4238884 -Octets 5 -Lines 1 -MimeEntityEnd 4238889 -MimeMessageEnd 4238889 -Octets 31 -Lines 4 -MimeEntityEnd 4238889 -MultipartBoundaryBegin 4238889 -MultipartBoundaryEnd 4238900 -MimeEntityBegin 4238900 -MimeEntityHeadersEnd 4238901 -MimeMessageBegin 4238901 -MimeEntityBegin 4238901 -MimeEntityHeadersEnd 4238927 -MimeMessageHeadersEnd 4238927 -Octets 5 -Lines 1 -MimeEntityEnd 4238932 -MimeMessageEnd 4238932 -Octets 31 -Lines 4 -MimeEntityEnd 4238932 -MultipartBoundaryBegin 4238932 -MultipartBoundaryEnd 4238943 -MimeEntityBegin 4238943 -MimeEntityHeadersEnd 4238944 -MimeMessageBegin 4238944 -MimeEntityBegin 4238944 -MimeEntityHeadersEnd 4238970 -MimeMessageHeadersEnd 4238970 -Octets 5 -Lines 1 -MimeEntityEnd 4238975 -MimeMessageEnd 4238975 -Octets 31 -Lines 4 -MimeEntityEnd 4238975 -MultipartBoundaryBegin 4238975 -MultipartBoundaryEnd 4238986 -MimeEntityBegin 4238986 -MimeEntityHeadersEnd 4239011 -Octets 82 -Lines 2 -MimeEntityEnd 4239093 -MultipartBoundaryBegin 4239093 -MultipartBoundaryEnd 4239104 -MimeEntityBegin 4239104 -MimeEntityHeadersEnd 4239105 -MimeMessageBegin 4239105 -MimeEntityBegin 4239105 -MimeEntityHeadersEnd 4239159 -MimeMessageHeadersEnd 4239159 -Octets 49 -Lines 1 -MimeEntityEnd 4239208 -MimeMessageEnd 4239208 -Octets 103 -Lines 5 -MimeEntityEnd 4239208 -MultipartBoundaryBegin 4239208 -MultipartBoundaryEnd 4239219 -MimeEntityBegin 4239219 -MimeEntityHeadersEnd 4239220 -MimeMessageBegin 4239220 -MimeEntityBegin 4239220 -MimeEntityHeadersEnd 4239246 -MimeMessageHeadersEnd 4239246 -Octets 5 -Lines 1 -MimeEntityEnd 4239251 -MimeMessageEnd 4239251 -Octets 31 -Lines 4 -MimeEntityEnd 4239251 -MultipartEndBoundaryBegin 4239251 -MultipartEndBoundaryEnd 4239263 -MultipartEpilogueBegin 4239263 -MultipartEpilogueEnd 4239263 -Octets 416 -Lines 37 -MimeEntityEnd 4239263 -MultipartEndBoundaryBegin 4239263 -MultipartEndBoundaryEnd 4239271 -MultipartEpilogueBegin 4239271 -MultipartEpilogueEnd 4239312 -Octets 20018 -Lines 428 -MimeEntityEnd 4239312 -MimeMessageEnd 4239312 -MboxMarkerBegin 4239313 -MboxMarkerEnd 4239321 -MimeMessageBegin 4239321 -MimeEntityBegin 4239321 -MimeEntityHeadersEnd 4239982 -MimeMessageHeadersEnd 4239982 -MultipartPreambleBegin 4239982 -MultipartPreambleEnd 4239982 -MultipartBoundaryBegin 4239982 -MultipartBoundaryEnd 4240008 -MimeEntityBegin 4240008 -MimeEntityHeadersEnd 4240009 -Octets 1220 -Lines 27 -MimeEntityEnd 4241229 -MultipartBoundaryBegin 4241229 -MultipartBoundaryEnd 4241256 -MimeEntityBegin 4241256 -MimeEntityHeadersEnd 4241401 -Octets 71317 -Lines 370 -MimeEntityEnd 4312718 -MultipartBoundaryBegin 4312718 -MultipartBoundaryEnd 4312745 -MimeEntityBegin 4312745 -MimeEntityHeadersEnd 4312746 -Octets 0 -Lines 0 -MimeEntityEnd 4312746 -MultipartEndBoundaryBegin 4312746 -MultipartEndBoundaryEnd 4312774 -MultipartEpilogueBegin 4312774 -MultipartEpilogueEnd 4312775 -Octets 72793 -Lines 409 -MimeEntityEnd 4312775 -MimeMessageEnd 4312775 -MboxMarkerBegin 4312776 -MboxMarkerEnd 4312784 -MimeMessageBegin 4312784 -MimeEntityBegin 4312784 -MimeEntityHeadersEnd 4313717 -MimeMessageHeadersEnd 4313717 -Octets 249041 -Lines 3430 -MimeEntityEnd 4562758 -MimeMessageEnd 4562758 -MboxMarkerBegin 4562759 -MboxMarkerEnd 4562767 -MimeMessageBegin 4562767 -MimeEntityBegin 4562767 -MimeEntityHeadersEnd 4563695 -MimeMessageHeadersEnd 4563695 -MultipartPreambleBegin 4563695 -MultipartPreambleEnd 4563890 -MultipartBoundaryBegin 4563890 -MultipartBoundaryEnd 4563935 -MimeEntityBegin 4563935 -MimeEntityHeadersEnd 4564008 -Octets 464 -Lines 9 -MimeEntityEnd 4564472 -MultipartBoundaryBegin 4564472 -MultipartBoundaryEnd 4564518 -MimeEntityBegin 4564518 -MimeEntityHeadersEnd 4564577 -Octets 24236 -Lines 332 -MimeEntityEnd 4588813 -MultipartBoundaryBegin 4588813 -MultipartBoundaryEnd 4588859 -MimeEntityBegin 4588859 -MimeEntityHeadersEnd 4588932 -Octets 448 -Lines 10 -MimeEntityEnd 4589380 -MultipartBoundaryBegin 4589380 -MultipartBoundaryEnd 4589426 -MimeEntityBegin 4589426 -MimeEntityHeadersEnd 4589485 -Octets 11214 -Lines 154 -MimeEntityEnd 4600699 -MultipartBoundaryBegin 4600699 -MultipartBoundaryEnd 4600745 -MimeEntityBegin 4600745 -MimeEntityHeadersEnd 4600818 -Octets 304 -Lines 6 -MimeEntityEnd 4601122 -MultipartBoundaryBegin 4601122 -MultipartBoundaryEnd 4601168 -MimeEntityBegin 4601168 -MimeEntityHeadersEnd 4601227 -Octets 16450 -Lines 226 -MimeEntityEnd 4617677 -MultipartBoundaryBegin 4617677 -MultipartBoundaryEnd 4617723 -MimeEntityBegin 4617723 -MimeEntityHeadersEnd 4617796 -Octets 660 -Lines 15 -MimeEntityEnd 4618456 -MultipartEndBoundaryBegin 4618456 -MultipartEndBoundaryEnd 4618503 -MultipartEpilogueBegin 4618503 -MultipartEpilogueEnd 4618504 -Octets 54809 -Lines 792 -MimeEntityEnd 4618504 -MimeMessageEnd 4618504 -MboxMarkerBegin 4618505 -MboxMarkerEnd 4618513 -MimeMessageBegin 4618513 -MimeEntityBegin 4618513 -MimeEntityHeadersEnd 4619332 -MimeMessageHeadersEnd 4619332 -MultipartPreambleBegin 4619332 -MultipartPreambleEnd 4619332 -MultipartBoundaryBegin 4619332 -MultipartBoundaryEnd 4619361 -MimeEntityBegin 4619361 -MimeEntityHeadersEnd 4619362 -Octets 650 -Lines 18 -MimeEntityEnd 4620012 -MultipartBoundaryBegin 4620012 -MultipartBoundaryEnd 4620042 -MimeEntityBegin 4620042 -MimeEntityHeadersEnd 4620102 -Octets 46453 -Lines 762 -MimeEntityEnd 4666555 -MultipartEndBoundaryBegin 4666555 -MultipartEndBoundaryEnd 4666586 -MultipartEpilogueBegin 4666586 -MultipartEpilogueEnd 4666587 -Octets 47255 -Lines 788 -MimeEntityEnd 4666587 -MimeMessageEnd 4666587 -MboxMarkerBegin 4666588 -MboxMarkerEnd 4666596 -MimeMessageBegin 4666596 -MimeEntityBegin 4666596 -MimeEntityHeadersEnd 4667343 -MimeMessageHeadersEnd 4667343 -MultipartPreambleBegin 4667343 -MultipartPreambleEnd 4667777 -MultipartBoundaryBegin 4667777 -MultipartBoundaryEnd 4667800 -MimeEntityBegin 4667800 -MimeEntityHeadersEnd 4667873 -Octets 5315 -Lines 160 -MimeEntityEnd 4673188 -MultipartBoundaryBegin 4673188 -MultipartBoundaryEnd 4673212 -MimeEntityBegin 4673212 -MimeEntityHeadersEnd 4673309 -Octets 2580 -Lines 36 -MimeEntityEnd 4675889 -MultipartBoundaryBegin 4675889 -MultipartBoundaryEnd 4675913 -MimeEntityBegin 4675913 -MimeEntityHeadersEnd 4675986 -Octets 518 -Lines 10 -MimeEntityEnd 4676504 -MultipartBoundaryBegin 4676504 -MultipartBoundaryEnd 4676528 -MimeEntityBegin 4676528 -MimeEntityHeadersEnd 4676642 -Octets 23060 -Lines 316 -MimeEntityEnd 4699702 -MultipartBoundaryBegin 4699702 -MultipartBoundaryEnd 4699726 -MimeEntityBegin 4699726 -MimeEntityHeadersEnd 4699799 -Octets 578 -Lines 14 -MimeEntityEnd 4700377 -MultipartBoundaryBegin 4700377 -MultipartBoundaryEnd 4700401 -MimeEntityBegin 4700401 -MimeEntityHeadersEnd 4700486 -MimeMessageBegin 4700486 -MimeEntityBegin 4700486 -MimeEntityHeadersEnd 4700556 -MimeMessageHeadersEnd 4700556 -Octets 0 -Lines 0 -MimeEntityEnd 4700555 -MimeMessageEnd 4700555 -Octets 69 -Lines 2 -MimeEntityEnd 4700555 -MultipartBoundaryBegin 4700555 -MultipartBoundaryEnd 4700579 -MimeEntityBegin 4700579 -MimeEntityHeadersEnd 4700652 -Octets 276 -Lines 5 -MimeEntityEnd 4700928 -MultipartBoundaryBegin 4700928 -MultipartBoundaryEnd 4700952 -MimeEntityBegin 4700952 -MimeEntityHeadersEnd 4701098 -MimeMessageBegin 4701098 -MimeEntityBegin 4701098 -MimeEntityHeadersEnd 4701168 -MimeMessageHeadersEnd 4701168 -Octets 0 -Lines 0 -MimeEntityEnd 4701167 -MimeMessageEnd 4701167 -Octets 69 -Lines 2 -MimeEntityEnd 4701167 -MultipartBoundaryBegin 4701167 -MultipartBoundaryEnd 4701191 -MimeEntityBegin 4701191 -MimeEntityHeadersEnd 4701264 -Octets 1069 -Lines 34 -MimeEntityEnd 4702333 -MultipartEndBoundaryBegin 4702333 -MultipartEndBoundaryEnd 4702358 -MultipartEpilogueBegin 4702358 -MultipartEpilogueEnd 4702358 -Octets 35015 -Lines 639 -MimeEntityEnd 4702358 -MimeMessageEnd 4702358 -MboxMarkerBegin 4702359 -MboxMarkerEnd 4702367 -MimeMessageBegin 4702367 -MimeEntityBegin 4702367 -MimeEntityHeadersEnd 4702528 -MimeMessageHeadersEnd 4702528 -MultipartPreambleBegin 4702528 -MultipartPreambleEnd 4702528 -MultipartBoundaryBegin 4702528 -MultipartBoundaryEnd 4702540 -MimeEntityBegin 4702540 -MimeEntityHeadersEnd 4702609 -Octets 76344 -Lines 1145 -MimeEntityEnd 4778953 -MultipartBoundaryBegin 4778953 -MultipartBoundaryEnd 4778966 -MimeEntityBegin 4778966 -MimeEntityHeadersEnd 4778967 -Octets 30 -Lines 1 -MimeEntityEnd 4778997 -MultipartEndBoundaryBegin 4778997 -MultipartEndBoundaryEnd 4779011 -MultipartEpilogueBegin 4779011 -MultipartEpilogueEnd 4779011 -Octets 76483 -Lines 1154 -MimeEntityEnd 4779011 -MimeMessageEnd 4779011 -MboxMarkerBegin 4779012 -MboxMarkerEnd 4779020 -MimeMessageBegin 4779020 -MimeEntityBegin 4779020 -MimeEntityHeadersEnd 4780235 -MimeMessageHeadersEnd 4780235 -MultipartPreambleBegin 4780235 -MultipartPreambleEnd 4780235 -MultipartBoundaryBegin 4780235 -MultipartBoundaryEnd 4780273 -MimeEntityBegin 4780273 -MimeEntityHeadersEnd 4780317 -Octets 452 -Lines 8 -MimeEntityEnd 4780769 -MultipartBoundaryBegin 4780769 -MultipartBoundaryEnd 4780808 -MimeEntityBegin 4780808 -MimeEntityHeadersEnd 4780901 -Octets 127743 -Lines 2095 -MimeEntityEnd 4908644 -MultipartEndBoundaryBegin 4908644 -MultipartEndBoundaryEnd 4908684 -MultipartEpilogueBegin 4908684 -MultipartEpilogueEnd 4908685 -Octets 128450 -Lines 2114 -MimeEntityEnd 4908685 -MimeMessageEnd 4908685 -MboxMarkerBegin 4908686 -MboxMarkerEnd 4908694 -MimeMessageBegin 4908694 -MimeEntityBegin 4908694 -MimeEntityHeadersEnd 4909446 -MimeMessageHeadersEnd 4909446 -MultipartPreambleBegin 4909446 -MultipartPreambleEnd 4909785 -MultipartBoundaryBegin 4909785 -MultipartBoundaryEnd 4909843 -MimeEntityBegin 4909843 -MimeEntityHeadersEnd 4909844 -Octets 795 -Lines 18 -MimeEntityEnd 4910639 -MultipartBoundaryBegin 4910639 -MultipartBoundaryEnd 4910698 -MimeEntityBegin 4910698 -MimeEntityHeadersEnd 4910801 -MultipartPreambleBegin 4910801 -MultipartPreambleEnd 4910801 -MultipartBoundaryBegin 4910801 -MultipartBoundaryEnd 4910861 -MimeEntityBegin 4910861 -MimeEntityHeadersEnd 4910934 -Octets 489 -Lines 7 -MimeEntityEnd 4911423 -MultipartBoundaryBegin 4911423 -MultipartBoundaryEnd 4911484 -MimeEntityBegin 4911484 -MimeEntityHeadersEnd 4911580 -Octets 12990 -Lines 190 -MimeEntityEnd 4924570 -MultipartBoundaryBegin 4924570 -MultipartBoundaryEnd 4924631 -MimeEntityBegin 4924631 -MimeEntityHeadersEnd 4924701 -Octets 20 -Lines 1 -MimeEntityEnd 4924721 -MultipartBoundaryBegin 4924721 -MultipartBoundaryEnd 4924782 -MimeEntityBegin 4924782 -MimeEntityHeadersEnd 4924878 -Octets 55720 -Lines 764 -MimeEntityEnd 4980598 -MultipartBoundaryBegin 4980598 -MultipartBoundaryEnd 4980659 -MimeEntityBegin 4980659 -MimeEntityHeadersEnd 4980729 -Octets 52 -Lines 5 -MimeEntityEnd 4980781 -MultipartBoundaryBegin 4980781 -MultipartBoundaryEnd 4980842 -MimeEntityBegin 4980842 -MimeEntityHeadersEnd 4980903 -Octets 102152 -Lines 1400 -MimeEntityEnd 5083055 -MultipartBoundaryBegin 5083055 -MultipartBoundaryEnd 5083116 -MimeEntityBegin 5083116 -MimeEntityHeadersEnd 5083186 -Octets 2 -Lines 2 -MimeEntityEnd 5083188 -MultipartEndBoundaryBegin 5083188 -MultipartEndBoundaryEnd 5083250 -MultipartEpilogueBegin 5083250 -MultipartEpilogueEnd 5083251 -Octets 172450 -Lines 2407 -MimeEntityEnd 5083251 -MultipartEndBoundaryBegin 5083251 -MultipartEndBoundaryEnd 5083311 -MultipartEpilogueBegin 5083311 -MultipartEpilogueEnd 5083311 -Octets 173865 -Lines 2440 -MimeEntityEnd 5083311 -MimeMessageEnd 5083311 -MboxMarkerBegin 5083312 -MboxMarkerEnd 5083320 -MimeMessageBegin 5083320 -MimeEntityBegin 5083320 -MimeEntityHeadersEnd 5084006 -MimeMessageHeadersEnd 5084006 -MultipartPreambleBegin 5084006 -MultipartPreambleEnd 5084161 -MultipartBoundaryBegin 5084161 -MultipartBoundaryEnd 5084201 -MimeEntityBegin 5084201 -MimeEntityHeadersEnd 5084245 -Octets 1515 -Lines 29 -MimeEntityEnd 5085760 -MultipartBoundaryBegin 5085760 -MultipartBoundaryEnd 5085801 -MimeEntityBegin 5085801 -MimeEntityHeadersEnd 5085886 -MultipartPreambleBegin 5085886 -MultipartPreambleEnd 5085886 -MultipartBoundaryBegin 5085886 -MultipartBoundaryEnd 5085928 -MimeEntityBegin 5085928 -MimeEntityHeadersEnd 5086019 -Octets 907 -Lines 13 -MimeEntityEnd 5086926 -MultipartBoundaryBegin 5086926 -MultipartBoundaryEnd 5086969 -MimeEntityBegin 5086969 -MimeEntityHeadersEnd 5087060 -Octets 34858 -Lines 506 -MimeEntityEnd 5121918 -MultipartBoundaryBegin 5121918 -MultipartBoundaryEnd 5121961 -MimeEntityBegin 5121961 -MimeEntityHeadersEnd 5122052 -Octets 10 -Lines 2 -MimeEntityEnd 5122062 -MultipartBoundaryBegin 5122062 -MultipartBoundaryEnd 5122105 -MimeEntityBegin 5122105 -MimeEntityHeadersEnd 5122196 -Octets 21334 -Lines 310 -MimeEntityEnd 5143530 -MultipartBoundaryBegin 5143530 -MultipartBoundaryEnd 5143573 -MimeEntityBegin 5143573 -MimeEntityHeadersEnd 5143664 -Octets 10 -Lines 2 -MimeEntityEnd 5143674 -MultipartBoundaryBegin 5143674 -MultipartBoundaryEnd 5143717 -MimeEntityBegin 5143717 -MimeEntityHeadersEnd 5143808 -Octets 32443 -Lines 471 -MimeEntityEnd 5176251 -MultipartBoundaryBegin 5176251 -MultipartBoundaryEnd 5176294 -MimeEntityBegin 5176294 -MimeEntityHeadersEnd 5176385 -Octets 10 -Lines 2 -MimeEntityEnd 5176395 -MultipartBoundaryBegin 5176395 -MultipartBoundaryEnd 5176438 -MimeEntityBegin 5176438 -MimeEntityHeadersEnd 5176529 -Octets 33441 -Lines 485 -MimeEntityEnd 5209970 -MultipartBoundaryBegin 5209970 -MultipartBoundaryEnd 5210013 -MimeEntityBegin 5210013 -MimeEntityHeadersEnd 5210104 -Octets 10 -Lines 2 -MimeEntityEnd 5210114 -MultipartBoundaryBegin 5210114 -MultipartBoundaryEnd 5210157 -MimeEntityBegin 5210157 -MimeEntityHeadersEnd 5210248 -Octets 27836 -Lines 404 -MimeEntityEnd 5238084 -MultipartBoundaryBegin 5238084 -MultipartBoundaryEnd 5238127 -MimeEntityBegin 5238127 -MimeEntityHeadersEnd 5238218 -Octets 10 -Lines 2 -MimeEntityEnd 5238228 -MultipartBoundaryBegin 5238228 -MultipartBoundaryEnd 5238271 -MimeEntityBegin 5238271 -MimeEntityHeadersEnd 5238362 -Octets 33494 -Lines 486 -MimeEntityEnd 5271856 -MultipartBoundaryBegin 5271856 -MultipartBoundaryEnd 5271899 -MimeEntityBegin 5271899 -MimeEntityHeadersEnd 5271990 -Octets 10 -Lines 2 -MimeEntityEnd 5272000 -MultipartBoundaryBegin 5272000 -MultipartBoundaryEnd 5272043 -MimeEntityBegin 5272043 -MimeEntityHeadersEnd 5272134 -Octets 26659 -Lines 387 -MimeEntityEnd 5298793 -MultipartBoundaryBegin 5298793 -MultipartBoundaryEnd 5298836 -MimeEntityBegin 5298836 -MimeEntityHeadersEnd 5298927 -Octets 74 -Lines 3 -MimeEntityEnd 5299001 -MultipartEndBoundaryBegin 5299001 -MultipartEndBoundaryEnd 5299045 -MultipartEpilogueBegin 5299045 -MultipartEpilogueEnd 5299046 -Octets 213160 -Lines 3160 -MimeEntityEnd 5299046 -MultipartEndBoundaryBegin 5299046 -MultipartEndBoundaryEnd 5299088 -MultipartEpilogueBegin 5299088 -MultipartEpilogueEnd 5299088 -Octets 215082 -Lines 3202 -MimeEntityEnd 5299088 -MimeMessageEnd 5299088 -MboxMarkerBegin 5299089 -MboxMarkerEnd 5299097 -MimeMessageBegin 5299097 -MimeEntityBegin 5299097 -MimeEntityHeadersEnd 5299489 -MimeMessageHeadersEnd 5299489 -MultipartPreambleBegin 5299489 -MultipartPreambleEnd 5299684 -MultipartBoundaryBegin 5299684 -MultipartBoundaryEnd 5299733 -MimeEntityBegin 5299733 -MimeEntityHeadersEnd 5299828 -Octets 203 -Lines 9 -MimeEntityEnd 5300031 -MultipartBoundaryBegin 5300031 -MultipartBoundaryEnd 5300081 -MimeEntityBegin 5300081 -MimeEntityHeadersEnd 5300142 -Octets 88598 -Lines 1214 -MimeEntityEnd 5388740 -MultipartBoundaryBegin 5388740 -MultipartBoundaryEnd 5388790 -MimeEntityBegin 5388790 -MimeEntityHeadersEnd 5388816 -Octets 30 -Lines 1 -MimeEntityEnd 5388846 -MultipartEndBoundaryBegin 5388846 -MultipartEndBoundaryEnd 5388897 -MultipartEpilogueBegin 5388897 -MultipartEpilogueEnd 5388898 -Octets 89409 -Lines 1243 -MimeEntityEnd 5388898 -MimeMessageEnd 5388898 -MboxMarkerBegin 5388899 -MboxMarkerEnd 5388907 -MimeMessageBegin 5388907 -MimeEntityBegin 5388907 -MimeEntityHeadersEnd 5389843 -MimeMessageHeadersEnd 5389843 -Octets 50709 -Lines 696 -MimeEntityEnd 5440552 -MimeMessageEnd 5440552 -MboxMarkerBegin 5440553 -MboxMarkerEnd 5440561 -MimeMessageBegin 5440561 -MimeEntityBegin 5440561 -MimeEntityHeadersEnd 5441173 -MimeMessageHeadersEnd 5441173 -MultipartPreambleBegin 5441173 -MultipartPreambleEnd 5441173 -MultipartBoundaryBegin 5441173 -MultipartBoundaryEnd 5441191 -MimeEntityBegin 5441191 -MimeEntityHeadersEnd 5441192 -Octets 4317 -Lines 101 -MimeEntityEnd 5445509 -MultipartBoundaryBegin 5445509 -MultipartBoundaryEnd 5445528 -MimeEntityBegin 5445528 -MimeEntityHeadersEnd 5445669 -MultipartPreambleBegin 5445669 -MultipartPreambleEnd 5445669 -MultipartBoundaryBegin 5445669 -MultipartBoundaryEnd 5445700 -MimeEntityBegin 5445700 -MimeEntityHeadersEnd 5445701 -MimeMessageBegin 5445701 -MimeEntityBegin 5445701 -MimeEntityHeadersEnd 5445806 -MimeMessageHeadersEnd 5445806 -Octets 621 -Lines 18 -MimeEntityEnd 5446427 -MimeMessageEnd 5446427 -Octets 726 -Lines 22 -MimeEntityEnd 5446427 -MultipartBoundaryBegin 5446427 -MultipartBoundaryEnd 5446459 -MimeEntityBegin 5446459 -MimeEntityHeadersEnd 5446460 -MimeMessageBegin 5446460 -MimeEntityBegin 5446460 -MimeEntityHeadersEnd 5446581 -MimeMessageHeadersEnd 5446581 -Octets 733 -Lines 20 -MimeEntityEnd 5447314 -MimeMessageEnd 5447314 -Octets 854 -Lines 24 -MimeEntityEnd 5447314 -MultipartBoundaryBegin 5447314 -MultipartBoundaryEnd 5447346 -MimeEntityBegin 5447346 -MimeEntityHeadersEnd 5447347 -MimeMessageBegin 5447347 -MimeEntityBegin 5447347 -MimeEntityHeadersEnd 5447466 -MimeMessageHeadersEnd 5447466 -Octets 646 -Lines 14 -MimeEntityEnd 5448112 -MimeMessageEnd 5448112 -Octets 765 -Lines 18 -MimeEntityEnd 5448112 -MultipartBoundaryBegin 5448112 -MultipartBoundaryEnd 5448144 -MimeEntityBegin 5448144 -MimeEntityHeadersEnd 5448145 -MimeMessageBegin 5448145 -MimeEntityBegin 5448145 -MimeEntityHeadersEnd 5448301 -MimeMessageHeadersEnd 5448301 -Octets 483 -Lines 10 -MimeEntityEnd 5448784 -MimeMessageEnd 5448784 -Octets 639 -Lines 14 -MimeEntityEnd 5448784 -MultipartBoundaryBegin 5448784 -MultipartBoundaryEnd 5448816 -MimeEntityBegin 5448816 -MimeEntityHeadersEnd 5448817 -MimeMessageBegin 5448817 -MimeEntityBegin 5448817 -MimeEntityHeadersEnd 5448971 -MimeMessageHeadersEnd 5448971 -Octets 572 -Lines 15 -MimeEntityEnd 5449543 -MimeMessageEnd 5449543 -Octets 726 -Lines 19 -MimeEntityEnd 5449543 -MultipartBoundaryBegin 5449543 -MultipartBoundaryEnd 5449575 -MimeEntityBegin 5449575 -MimeEntityHeadersEnd 5449576 -MimeMessageBegin 5449576 -MimeEntityBegin 5449576 -MimeEntityHeadersEnd 5449733 -MimeMessageHeadersEnd 5449733 -Octets 1275 -Lines 26 -MimeEntityEnd 5451008 -MimeMessageEnd 5451008 -Octets 1432 -Lines 30 -MimeEntityEnd 5451008 -MultipartBoundaryBegin 5451008 -MultipartBoundaryEnd 5451040 -MimeEntityBegin 5451040 -MimeEntityHeadersEnd 5451041 -MimeMessageBegin 5451041 -MimeEntityBegin 5451041 -MimeEntityHeadersEnd 5451194 -MimeMessageHeadersEnd 5451194 -Octets 401 -Lines 9 -MimeEntityEnd 5451595 -MimeMessageEnd 5451595 -Octets 554 -Lines 13 -MimeEntityEnd 5451595 -MultipartBoundaryBegin 5451595 -MultipartBoundaryEnd 5451627 -MimeEntityBegin 5451627 -MimeEntityHeadersEnd 5451628 -MimeMessageBegin 5451628 -MimeEntityBegin 5451628 -MimeEntityHeadersEnd 5451775 -MimeMessageHeadersEnd 5451775 -Octets 396 -Lines 7 -MimeEntityEnd 5452171 -MimeMessageEnd 5452171 -Octets 543 -Lines 11 -MimeEntityEnd 5452171 -MultipartBoundaryBegin 5452171 -MultipartBoundaryEnd 5452203 -MimeEntityBegin 5452203 -MimeEntityHeadersEnd 5452204 -MimeMessageBegin 5452204 -MimeEntityBegin 5452204 -MimeEntityHeadersEnd 5452347 -MimeMessageHeadersEnd 5452347 -Octets 640 -Lines 11 -MimeEntityEnd 5452987 -MimeMessageEnd 5452987 -Octets 783 -Lines 15 -MimeEntityEnd 5452987 -MultipartBoundaryBegin 5452987 -MultipartBoundaryEnd 5453019 -MimeEntityBegin 5453019 -MimeEntityHeadersEnd 5453020 -MimeMessageBegin 5453020 -MimeEntityBegin 5453020 -MimeEntityHeadersEnd 5453157 -MimeMessageHeadersEnd 5453157 -Octets 977 -Lines 19 -MimeEntityEnd 5454134 -MimeMessageEnd 5454134 -Octets 1114 -Lines 23 -MimeEntityEnd 5454134 -MultipartBoundaryBegin 5454134 -MultipartBoundaryEnd 5454166 -MimeEntityBegin 5454166 -MimeEntityHeadersEnd 5454167 -MimeMessageBegin 5454167 -MimeEntityBegin 5454167 -MimeEntityHeadersEnd 5454314 -MimeMessageHeadersEnd 5454314 -Octets 890 -Lines 27 -MimeEntityEnd 5455204 -MimeMessageEnd 5455204 -Octets 1037 -Lines 31 -MimeEntityEnd 5455204 -MultipartBoundaryBegin 5455204 -MultipartBoundaryEnd 5455236 -MimeEntityBegin 5455236 -MimeEntityHeadersEnd 5455237 -MimeMessageBegin 5455237 -MimeEntityBegin 5455237 -MimeEntityHeadersEnd 5455368 -MimeMessageHeadersEnd 5455368 -Octets 559 -Lines 11 -MimeEntityEnd 5455927 -MimeMessageEnd 5455927 -Octets 690 -Lines 15 -MimeEntityEnd 5455927 -MultipartBoundaryBegin 5455927 -MultipartBoundaryEnd 5455959 -MimeEntityBegin 5455959 -MimeEntityHeadersEnd 5455960 -MimeMessageBegin 5455960 -MimeEntityBegin 5455960 -MimeEntityHeadersEnd 5456092 -MimeMessageHeadersEnd 5456092 -Octets 437 -Lines 10 -MimeEntityEnd 5456529 -MimeMessageEnd 5456529 -Octets 569 -Lines 14 -MimeEntityEnd 5456529 -MultipartBoundaryBegin 5456529 -MultipartBoundaryEnd 5456561 -MimeEntityBegin 5456561 -MimeEntityHeadersEnd 5456562 -MimeMessageBegin 5456562 -MimeEntityBegin 5456562 -MimeEntityHeadersEnd 5456679 -MimeMessageHeadersEnd 5456679 -Octets 552 -Lines 15 -MimeEntityEnd 5457231 -MimeMessageEnd 5457231 -Octets 669 -Lines 19 -MimeEntityEnd 5457231 -MultipartBoundaryBegin 5457231 -MultipartBoundaryEnd 5457263 -MimeEntityBegin 5457263 -MimeEntityHeadersEnd 5457264 -MimeMessageBegin 5457264 -MimeEntityBegin 5457264 -MimeEntityHeadersEnd 5457379 -MimeMessageHeadersEnd 5457379 -Octets 185 -Lines 8 -MimeEntityEnd 5457564 -MimeMessageEnd 5457564 -Octets 300 -Lines 12 -MimeEntityEnd 5457564 -MultipartBoundaryBegin 5457564 -MultipartBoundaryEnd 5457596 -MimeEntityBegin 5457596 -MimeEntityHeadersEnd 5457597 -MimeMessageBegin 5457597 -MimeEntityBegin 5457597 -MimeEntityHeadersEnd 5457714 -MimeMessageHeadersEnd 5457714 -Octets 328 -Lines 7 -MimeEntityEnd 5458042 -MimeMessageEnd 5458042 -Octets 445 -Lines 11 -MimeEntityEnd 5458042 -MultipartBoundaryBegin 5458042 -MultipartBoundaryEnd 5458074 -MimeEntityBegin 5458074 -MimeEntityHeadersEnd 5458075 -MimeMessageBegin 5458075 -MimeEntityBegin 5458075 -MimeEntityHeadersEnd 5458198 -MimeMessageHeadersEnd 5458198 -Octets 667 -Lines 21 -MimeEntityEnd 5458865 -MimeMessageEnd 5458865 -Octets 790 -Lines 25 -MimeEntityEnd 5458865 -MultipartBoundaryBegin 5458865 -MultipartBoundaryEnd 5458897 -MimeEntityBegin 5458897 -MimeEntityHeadersEnd 5458898 -MimeMessageBegin 5458898 -MimeEntityBegin 5458898 -MimeEntityHeadersEnd 5459022 -MimeMessageHeadersEnd 5459022 -Octets 102 -Lines 5 -MimeEntityEnd 5459124 -MimeMessageEnd 5459124 -Octets 226 -Lines 9 -MimeEntityEnd 5459124 -MultipartBoundaryBegin 5459124 -MultipartBoundaryEnd 5459156 -MimeEntityBegin 5459156 -MimeEntityHeadersEnd 5459157 -MimeMessageBegin 5459157 -MimeEntityBegin 5459157 -MimeEntityHeadersEnd 5459299 -MimeMessageHeadersEnd 5459299 -Octets 836 -Lines 21 -MimeEntityEnd 5460135 -MimeMessageEnd 5460135 -Octets 978 -Lines 25 -MimeEntityEnd 5460135 -MultipartBoundaryBegin 5460135 -MultipartBoundaryEnd 5460167 -MimeEntityBegin 5460167 -MimeEntityHeadersEnd 5460168 -MimeMessageBegin 5460168 -MimeEntityBegin 5460168 -MimeEntityHeadersEnd 5460278 -MimeMessageHeadersEnd 5460278 -Octets 419 -Lines 9 -MimeEntityEnd 5460697 -MimeMessageEnd 5460697 -Octets 529 -Lines 13 -MimeEntityEnd 5460697 -MultipartBoundaryBegin 5460697 -MultipartBoundaryEnd 5460729 -MimeEntityBegin 5460729 -MimeEntityHeadersEnd 5460730 -MimeMessageBegin 5460730 -MimeEntityBegin 5460730 -MimeEntityHeadersEnd 5460902 -MimeMessageHeadersEnd 5460902 -Octets 230 -Lines 9 -MimeEntityEnd 5461132 -MimeMessageEnd 5461132 -Octets 402 -Lines 13 -MimeEntityEnd 5461132 -MultipartBoundaryBegin 5461132 -MultipartBoundaryEnd 5461164 -MimeEntityBegin 5461164 -MimeEntityHeadersEnd 5461165 -MimeMessageBegin 5461165 -MimeEntityBegin 5461165 -MimeEntityHeadersEnd 5461291 -MimeMessageHeadersEnd 5461291 -Octets 399 -Lines 12 -MimeEntityEnd 5461690 -MimeMessageEnd 5461690 -Octets 525 -Lines 16 -MimeEntityEnd 5461690 -MultipartBoundaryBegin 5461690 -MultipartBoundaryEnd 5461722 -MimeEntityBegin 5461722 -MimeEntityHeadersEnd 5461723 -MimeMessageBegin 5461723 -MimeEntityBegin 5461723 -MimeEntityHeadersEnd 5461840 -MimeMessageHeadersEnd 5461840 -Octets 904 -Lines 28 -MimeEntityEnd 5462744 -MimeMessageEnd 5462744 -Octets 1021 -Lines 32 -MimeEntityEnd 5462744 -MultipartBoundaryBegin 5462744 -MultipartBoundaryEnd 5462776 -MimeEntityBegin 5462776 -MimeEntityHeadersEnd 5462777 -MimeMessageBegin 5462777 -MimeEntityBegin 5462777 -MimeEntityHeadersEnd 5462905 -MimeMessageHeadersEnd 5462905 -Octets 291 -Lines 9 -MimeEntityEnd 5463196 -MimeMessageEnd 5463196 -Octets 419 -Lines 13 -MimeEntityEnd 5463196 -MultipartBoundaryBegin 5463196 -MultipartBoundaryEnd 5463228 -MimeEntityBegin 5463228 -MimeEntityHeadersEnd 5463229 -MimeMessageBegin 5463229 -MimeEntityBegin 5463229 -MimeEntityHeadersEnd 5463358 -MimeMessageHeadersEnd 5463358 -Octets 410 -Lines 14 -MimeEntityEnd 5463768 -MimeMessageEnd 5463768 -Octets 539 -Lines 18 -MimeEntityEnd 5463768 -MultipartBoundaryBegin 5463768 -MultipartBoundaryEnd 5463800 -MimeEntityBegin 5463800 -MimeEntityHeadersEnd 5463801 -MimeMessageBegin 5463801 -MimeEntityBegin 5463801 -MimeEntityHeadersEnd 5463916 -MimeMessageHeadersEnd 5463916 -Octets 145 -Lines 4 -MimeEntityEnd 5464061 -MimeMessageEnd 5464061 -Octets 260 -Lines 8 -MimeEntityEnd 5464061 -MultipartBoundaryBegin 5464061 -MultipartBoundaryEnd 5464093 -MimeEntityBegin 5464093 -MimeEntityHeadersEnd 5464094 -MimeMessageBegin 5464094 -MimeEntityBegin 5464094 -MimeEntityHeadersEnd 5464219 -MimeMessageHeadersEnd 5464219 -Octets 179 -Lines 7 -MimeEntityEnd 5464398 -MimeMessageEnd 5464398 -Octets 304 -Lines 11 -MimeEntityEnd 5464398 -MultipartBoundaryBegin 5464398 -MultipartBoundaryEnd 5464430 -MimeEntityBegin 5464430 -MimeEntityHeadersEnd 5464431 -MimeMessageBegin 5464431 -MimeEntityBegin 5464431 -MimeEntityHeadersEnd 5464561 -MimeMessageHeadersEnd 5464561 -Octets 716 -Lines 14 -MimeEntityEnd 5465277 -MimeMessageEnd 5465277 -Octets 846 -Lines 18 -MimeEntityEnd 5465277 -MultipartBoundaryBegin 5465277 -MultipartBoundaryEnd 5465309 -MimeEntityBegin 5465309 -MimeEntityHeadersEnd 5465310 -MimeMessageBegin 5465310 -MimeEntityBegin 5465310 -MimeEntityHeadersEnd 5465456 -MimeMessageHeadersEnd 5465456 -Octets 957 -Lines 26 -MimeEntityEnd 5466413 -MimeMessageEnd 5466413 -Octets 1103 -Lines 30 -MimeEntityEnd 5466413 -MultipartBoundaryBegin 5466413 -MultipartBoundaryEnd 5466445 -MimeEntityBegin 5466445 -MimeEntityHeadersEnd 5466446 -MimeMessageBegin 5466446 -MimeEntityBegin 5466446 -MimeEntityHeadersEnd 5466580 -MimeMessageHeadersEnd 5466580 -Octets 247 -Lines 7 -MimeEntityEnd 5466827 -MimeMessageEnd 5466827 -Octets 381 -Lines 11 -MimeEntityEnd 5466827 -MultipartBoundaryBegin 5466827 -MultipartBoundaryEnd 5466859 -MimeEntityBegin 5466859 -MimeEntityHeadersEnd 5466860 -MimeMessageBegin 5466860 -MimeEntityBegin 5466860 -MimeEntityHeadersEnd 5466982 -MimeMessageHeadersEnd 5466982 -Octets 127 -Lines 6 -MimeEntityEnd 5467109 -MimeMessageEnd 5467109 -Octets 249 -Lines 10 -MimeEntityEnd 5467109 -MultipartBoundaryBegin 5467109 -MultipartBoundaryEnd 5467141 -MimeEntityBegin 5467141 -MimeEntityHeadersEnd 5467142 -MimeMessageBegin 5467142 -MimeEntityBegin 5467142 -MimeEntityHeadersEnd 5467317 -MimeMessageHeadersEnd 5467317 -Octets 745 -Lines 16 -MimeEntityEnd 5468062 -MimeMessageEnd 5468062 -Octets 920 -Lines 21 -MimeEntityEnd 5468062 -MultipartBoundaryBegin 5468062 -MultipartBoundaryEnd 5468094 -MimeEntityBegin 5468094 -MimeEntityHeadersEnd 5468095 -MimeMessageBegin 5468095 -MimeEntityBegin 5468095 -MimeEntityHeadersEnd 5468255 -MimeMessageHeadersEnd 5468255 -Octets 399 -Lines 16 -MimeEntityEnd 5468654 -MimeMessageEnd 5468654 -Octets 559 -Lines 20 -MimeEntityEnd 5468654 -MultipartBoundaryBegin 5468654 -MultipartBoundaryEnd 5468686 -MimeEntityBegin 5468686 -MimeEntityHeadersEnd 5468687 -MimeMessageBegin 5468687 -MimeEntityBegin 5468687 -MimeEntityHeadersEnd 5468819 -MimeMessageHeadersEnd 5468819 -Octets 1287 -Lines 21 -MimeEntityEnd 5470106 -MimeMessageEnd 5470106 -Octets 1419 -Lines 25 -MimeEntityEnd 5470106 -MultipartBoundaryBegin 5470106 -MultipartBoundaryEnd 5470138 -MimeEntityBegin 5470138 -MimeEntityHeadersEnd 5470139 -MimeMessageBegin 5470139 -MimeEntityBegin 5470139 -MimeEntityHeadersEnd 5470245 -MimeMessageHeadersEnd 5470245 -Octets 143 -Lines 6 -MimeEntityEnd 5470388 -MimeMessageEnd 5470388 -Octets 249 -Lines 10 -MimeEntityEnd 5470388 -MultipartBoundaryBegin 5470388 -MultipartBoundaryEnd 5470420 -MimeEntityBegin 5470420 -MimeEntityHeadersEnd 5470421 -MimeMessageBegin 5470421 -MimeEntityBegin 5470421 -MimeEntityHeadersEnd 5470558 -MimeMessageHeadersEnd 5470558 -Octets 299 -Lines 11 -MimeEntityEnd 5470857 -MimeMessageEnd 5470857 -Octets 436 -Lines 15 -MimeEntityEnd 5470857 -MultipartBoundaryBegin 5470857 -MultipartBoundaryEnd 5470889 -MimeEntityBegin 5470889 -MimeEntityHeadersEnd 5470890 -MimeMessageBegin 5470890 -MimeEntityBegin 5470890 -MimeEntityHeadersEnd 5471016 -MimeMessageHeadersEnd 5471016 -Octets 187 -Lines 6 -MimeEntityEnd 5471203 -MimeMessageEnd 5471203 -Octets 313 -Lines 10 -MimeEntityEnd 5471203 -MultipartBoundaryBegin 5471203 -MultipartBoundaryEnd 5471235 -MimeEntityBegin 5471235 -MimeEntityHeadersEnd 5471236 -MimeMessageBegin 5471236 -MimeEntityBegin 5471236 -MimeEntityHeadersEnd 5471341 -MimeMessageHeadersEnd 5471341 -Octets 398 -Lines 12 -MimeEntityEnd 5471739 -MimeMessageEnd 5471739 -Octets 503 -Lines 16 -MimeEntityEnd 5471739 -MultipartBoundaryBegin 5471739 -MultipartBoundaryEnd 5471771 -MimeEntityBegin 5471771 -MimeEntityHeadersEnd 5471772 -MimeMessageBegin 5471772 -MimeEntityBegin 5471772 -MimeEntityHeadersEnd 5471906 -MimeMessageHeadersEnd 5471906 -Octets 302 -Lines 8 -MimeEntityEnd 5472208 -MimeMessageEnd 5472208 -Octets 436 -Lines 12 -MimeEntityEnd 5472208 -MultipartBoundaryBegin 5472208 -MultipartBoundaryEnd 5472240 -MimeEntityBegin 5472240 -MimeEntityHeadersEnd 5472241 -MimeMessageBegin 5472241 -MimeEntityBegin 5472241 -MimeEntityHeadersEnd 5472384 -MimeMessageHeadersEnd 5472384 -Octets 618 -Lines 17 -MimeEntityEnd 5473002 -MimeMessageEnd 5473002 -Octets 761 -Lines 21 -MimeEntityEnd 5473002 -MultipartBoundaryBegin 5473002 -MultipartBoundaryEnd 5473034 -MimeEntityBegin 5473034 -MimeEntityHeadersEnd 5473035 -MimeMessageBegin 5473035 -MimeEntityBegin 5473035 -MimeEntityHeadersEnd 5473188 -MimeMessageHeadersEnd 5473188 -Octets 475 -Lines 10 -MimeEntityEnd 5473663 -MimeMessageEnd 5473663 -Octets 628 -Lines 14 -MimeEntityEnd 5473663 -MultipartBoundaryBegin 5473663 -MultipartBoundaryEnd 5473695 -MimeEntityBegin 5473695 -MimeEntityHeadersEnd 5473696 -MimeMessageBegin 5473696 -MimeEntityBegin 5473696 -MimeEntityHeadersEnd 5473829 -MimeMessageHeadersEnd 5473829 -Octets 1172 -Lines 27 -MimeEntityEnd 5475001 -MimeMessageEnd 5475001 -Octets 1305 -Lines 31 -MimeEntityEnd 5475001 -MultipartBoundaryBegin 5475001 -MultipartBoundaryEnd 5475033 -MimeEntityBegin 5475033 -MimeEntityHeadersEnd 5475034 -MimeMessageBegin 5475034 -MimeEntityBegin 5475034 -MimeEntityHeadersEnd 5475210 -MimeMessageHeadersEnd 5475210 -Octets 259 -Lines 8 -MimeEntityEnd 5475469 -MimeMessageEnd 5475469 -Octets 435 -Lines 12 -MimeEntityEnd 5475469 -MultipartBoundaryBegin 5475469 -MultipartBoundaryEnd 5475501 -MimeEntityBegin 5475501 -MimeEntityHeadersEnd 5475502 -MimeMessageBegin 5475502 -MimeEntityBegin 5475502 -MimeEntityHeadersEnd 5475617 -MimeMessageHeadersEnd 5475617 -Octets 193 -Lines 4 -MimeEntityEnd 5475810 -MimeMessageEnd 5475810 -Octets 308 -Lines 8 -MimeEntityEnd 5475810 -MultipartBoundaryBegin 5475810 -MultipartBoundaryEnd 5475842 -MimeEntityBegin 5475842 -MimeEntityHeadersEnd 5475843 -MimeMessageBegin 5475843 -MimeEntityBegin 5475843 -MimeEntityHeadersEnd 5475983 -MimeMessageHeadersEnd 5475983 -Octets 865 -Lines 24 -MimeEntityEnd 5476848 -MimeMessageEnd 5476848 -Octets 1005 -Lines 28 -MimeEntityEnd 5476848 -MultipartBoundaryBegin 5476848 -MultipartBoundaryEnd 5476880 -MimeEntityBegin 5476880 -MimeEntityHeadersEnd 5476881 -MimeMessageBegin 5476881 -MimeEntityBegin 5476881 -MimeEntityHeadersEnd 5477006 -MimeMessageHeadersEnd 5477006 -Octets 714 -Lines 11 -MimeEntityEnd 5477720 -MimeMessageEnd 5477720 -Octets 839 -Lines 15 -MimeEntityEnd 5477720 -MultipartBoundaryBegin 5477720 -MultipartBoundaryEnd 5477752 -MimeEntityBegin 5477752 -MimeEntityHeadersEnd 5477753 -MimeMessageBegin 5477753 -MimeEntityBegin 5477753 -MimeEntityHeadersEnd 5477865 -MimeMessageHeadersEnd 5477865 -Octets 703 -Lines 17 -MimeEntityEnd 5478568 -MimeMessageEnd 5478568 -Octets 815 -Lines 21 -MimeEntityEnd 5478568 -MultipartBoundaryBegin 5478568 -MultipartBoundaryEnd 5478600 -MimeEntityBegin 5478600 -MimeEntityHeadersEnd 5478601 -MimeMessageBegin 5478601 -MimeEntityBegin 5478601 -MimeEntityHeadersEnd 5478733 -MimeMessageHeadersEnd 5478733 -Octets 380 -Lines 11 -MimeEntityEnd 5479113 -MimeMessageEnd 5479113 -Octets 512 -Lines 15 -MimeEntityEnd 5479113 -MultipartBoundaryBegin 5479113 -MultipartBoundaryEnd 5479145 -MimeEntityBegin 5479145 -MimeEntityHeadersEnd 5479146 -MimeMessageBegin 5479146 -MimeEntityBegin 5479146 -MimeEntityHeadersEnd 5479282 -MimeMessageHeadersEnd 5479282 -Octets 977 -Lines 24 -MimeEntityEnd 5480259 -MimeMessageEnd 5480259 -Octets 1113 -Lines 28 -MimeEntityEnd 5480259 -MultipartBoundaryBegin 5480259 -MultipartBoundaryEnd 5480291 -MimeEntityBegin 5480291 -MimeEntityHeadersEnd 5480292 -MimeMessageBegin 5480292 -MimeEntityBegin 5480292 -MimeEntityHeadersEnd 5480437 -MimeMessageHeadersEnd 5480437 -Octets 467 -Lines 10 -MimeEntityEnd 5480904 -MimeMessageEnd 5480904 -Octets 612 -Lines 14 -MimeEntityEnd 5480904 -MultipartBoundaryBegin 5480904 -MultipartBoundaryEnd 5480936 -MimeEntityBegin 5480936 -MimeEntityHeadersEnd 5480937 -MimeMessageBegin 5480937 -MimeEntityBegin 5480937 -MimeEntityHeadersEnd 5481070 -MimeMessageHeadersEnd 5481070 -Octets 279 -Lines 10 -MimeEntityEnd 5481349 -MimeMessageEnd 5481349 -Octets 412 -Lines 14 -MimeEntityEnd 5481349 -MultipartBoundaryBegin 5481349 -MultipartBoundaryEnd 5481381 -MimeEntityBegin 5481381 -MimeEntityHeadersEnd 5481382 -MimeMessageBegin 5481382 -MimeEntityBegin 5481382 -MimeEntityHeadersEnd 5481507 -MimeMessageHeadersEnd 5481507 -Octets 282 -Lines 4 -MimeEntityEnd 5481789 -MimeMessageEnd 5481789 -Octets 407 -Lines 8 -MimeEntityEnd 5481789 -MultipartBoundaryBegin 5481789 -MultipartBoundaryEnd 5481821 -MimeEntityBegin 5481821 -MimeEntityHeadersEnd 5481822 -MimeMessageBegin 5481822 -MimeEntityBegin 5481822 -MimeEntityHeadersEnd 5481943 -MimeMessageHeadersEnd 5481943 -Octets 643 -Lines 27 -MimeEntityEnd 5482586 -MimeMessageEnd 5482586 -Octets 764 -Lines 31 -MimeEntityEnd 5482586 -MultipartBoundaryBegin 5482586 -MultipartBoundaryEnd 5482618 -MimeEntityBegin 5482618 -MimeEntityHeadersEnd 5482619 -MimeMessageBegin 5482619 -MimeEntityBegin 5482619 -MimeEntityHeadersEnd 5482763 -MimeMessageHeadersEnd 5482763 -Octets 2258 -Lines 46 -MimeEntityEnd 5485021 -MimeMessageEnd 5485021 -Octets 2402 -Lines 50 -MimeEntityEnd 5485021 -MultipartBoundaryBegin 5485021 -MultipartBoundaryEnd 5485053 -MimeEntityBegin 5485053 -MimeEntityHeadersEnd 5485054 -MimeMessageBegin 5485054 -MimeEntityBegin 5485054 -MimeEntityHeadersEnd 5485176 -MimeMessageHeadersEnd 5485176 -Octets 792 -Lines 17 -MimeEntityEnd 5485968 -MimeMessageEnd 5485968 -Octets 914 -Lines 21 -MimeEntityEnd 5485968 -MultipartBoundaryBegin 5485968 -MultipartBoundaryEnd 5486000 -MimeEntityBegin 5486000 -MimeEntityHeadersEnd 5486001 -MimeMessageBegin 5486001 -MimeEntityBegin 5486001 -MimeEntityHeadersEnd 5486095 -MimeMessageHeadersEnd 5486095 -Octets 226 -Lines 10 -MimeEntityEnd 5486321 -MimeMessageEnd 5486321 -Octets 320 -Lines 14 -MimeEntityEnd 5486321 -MultipartBoundaryBegin 5486321 -MultipartBoundaryEnd 5486353 -MimeEntityBegin 5486353 -MimeEntityHeadersEnd 5486354 -MimeMessageBegin 5486354 -MimeEntityBegin 5486354 -MimeEntityHeadersEnd 5486475 -MimeMessageHeadersEnd 5486475 -Octets 668 -Lines 20 -MimeEntityEnd 5487143 -MimeMessageEnd 5487143 -Octets 789 -Lines 24 -MimeEntityEnd 5487143 -MultipartBoundaryBegin 5487143 -MultipartBoundaryEnd 5487175 -MimeEntityBegin 5487175 -MimeEntityHeadersEnd 5487176 -MimeMessageBegin 5487176 -MimeEntityBegin 5487176 -MimeEntityHeadersEnd 5487286 -MimeMessageHeadersEnd 5487286 -Octets 2547 -Lines 68 -MimeEntityEnd 5489833 -MimeMessageEnd 5489833 -Octets 2657 -Lines 72 -MimeEntityEnd 5489833 -MultipartBoundaryBegin 5489833 -MultipartBoundaryEnd 5489865 -MimeEntityBegin 5489865 -MimeEntityHeadersEnd 5489866 -MimeMessageBegin 5489866 -MimeEntityBegin 5489866 -MimeEntityHeadersEnd 5489972 -MimeMessageHeadersEnd 5489972 -Octets 1209 -Lines 34 -MimeEntityEnd 5491181 -MimeMessageEnd 5491181 -Octets 1315 -Lines 38 -MimeEntityEnd 5491181 -MultipartBoundaryBegin 5491181 -MultipartBoundaryEnd 5491213 -MimeEntityBegin 5491213 -MimeEntityHeadersEnd 5491214 -MimeMessageBegin 5491214 -MimeEntityBegin 5491214 -MimeEntityHeadersEnd 5491320 -MimeMessageHeadersEnd 5491320 -Octets 1797 -Lines 43 -MimeEntityEnd 5493117 -MimeMessageEnd 5493117 -Octets 1903 -Lines 47 -MimeEntityEnd 5493117 -MultipartBoundaryBegin 5493117 -MultipartBoundaryEnd 5493149 -MimeEntityBegin 5493149 -MimeEntityHeadersEnd 5493150 -MimeMessageBegin 5493150 -MimeEntityBegin 5493150 -MimeEntityHeadersEnd 5493279 -MimeMessageHeadersEnd 5493279 -Octets 570 -Lines 12 -MimeEntityEnd 5493849 -MimeMessageEnd 5493849 -Octets 699 -Lines 16 -MimeEntityEnd 5493849 -MultipartBoundaryBegin 5493849 -MultipartBoundaryEnd 5493881 -MimeEntityBegin 5493881 -MimeEntityHeadersEnd 5493882 -MimeMessageBegin 5493882 -MimeEntityBegin 5493882 -MimeEntityHeadersEnd 5493970 -MimeMessageHeadersEnd 5493970 -Octets 1334 -Lines 20 -MimeEntityEnd 5495304 -MimeMessageEnd 5495304 -Octets 1422 -Lines 24 -MimeEntityEnd 5495304 -MultipartBoundaryBegin 5495304 -MultipartBoundaryEnd 5495336 -MimeEntityBegin 5495336 -MimeEntityHeadersEnd 5495337 -MimeMessageBegin 5495337 -MimeEntityBegin 5495337 -MimeEntityHeadersEnd 5495453 -MimeMessageHeadersEnd 5495453 -Octets 2127 -Lines 49 -MimeEntityEnd 5497580 -MimeMessageEnd 5497580 -Octets 2243 -Lines 53 -MimeEntityEnd 5497580 -MultipartBoundaryBegin 5497580 -MultipartBoundaryEnd 5497612 -MimeEntityBegin 5497612 -MimeEntityHeadersEnd 5497613 -MimeMessageBegin 5497613 -MimeEntityBegin 5497613 -MimeEntityHeadersEnd 5497734 -MimeMessageHeadersEnd 5497734 -Octets 2021 -Lines 42 -MimeEntityEnd 5499755 -MimeMessageEnd 5499755 -Octets 2142 -Lines 46 -MimeEntityEnd 5499755 -MultipartBoundaryBegin 5499755 -MultipartBoundaryEnd 5499787 -MimeEntityBegin 5499787 -MimeEntityHeadersEnd 5499788 -MimeMessageBegin 5499788 -MimeEntityBegin 5499788 -MimeEntityHeadersEnd 5499909 -MimeMessageHeadersEnd 5499909 -Octets 677 -Lines 19 -MimeEntityEnd 5500586 -MimeMessageEnd 5500586 -Octets 798 -Lines 23 -MimeEntityEnd 5500586 -MultipartBoundaryBegin 5500586 -MultipartBoundaryEnd 5500618 -MimeEntityBegin 5500618 -MimeEntityHeadersEnd 5500619 -MimeMessageBegin 5500619 -MimeEntityBegin 5500619 -MimeEntityHeadersEnd 5500756 -MimeMessageHeadersEnd 5500756 -Octets 820 -Lines 16 -MimeEntityEnd 5501576 -MimeMessageEnd 5501576 -Octets 957 -Lines 20 -MimeEntityEnd 5501576 -MultipartBoundaryBegin 5501576 -MultipartBoundaryEnd 5501608 -MimeEntityBegin 5501608 -MimeEntityHeadersEnd 5501609 -MimeMessageBegin 5501609 -MimeEntityBegin 5501609 -MimeEntityHeadersEnd 5501733 -MimeMessageHeadersEnd 5501733 -Octets 724 -Lines 21 -MimeEntityEnd 5502457 -MimeMessageEnd 5502457 -Octets 848 -Lines 25 -MimeEntityEnd 5502457 -MultipartBoundaryBegin 5502457 -MultipartBoundaryEnd 5502489 -MimeEntityBegin 5502489 -MimeEntityHeadersEnd 5502490 -MimeMessageBegin 5502490 -MimeEntityBegin 5502490 -MimeEntityHeadersEnd 5502592 -MimeMessageHeadersEnd 5502592 -Octets 740 -Lines 16 -MimeEntityEnd 5503332 -MimeMessageEnd 5503332 -Octets 842 -Lines 20 -MimeEntityEnd 5503332 -MultipartBoundaryBegin 5503332 -MultipartBoundaryEnd 5503364 -MimeEntityBegin 5503364 -MimeEntityHeadersEnd 5503365 -MimeMessageBegin 5503365 -MimeEntityBegin 5503365 -MimeEntityHeadersEnd 5503521 -MimeMessageHeadersEnd 5503521 -Octets 359 -Lines 7 -MimeEntityEnd 5503880 -MimeMessageEnd 5503880 -Octets 515 -Lines 12 -MimeEntityEnd 5503880 -MultipartBoundaryBegin 5503880 -MultipartBoundaryEnd 5503912 -MimeEntityBegin 5503912 -MimeEntityHeadersEnd 5503913 -MimeMessageBegin 5503913 -MimeEntityBegin 5503913 -MimeEntityHeadersEnd 5504000 -MimeMessageHeadersEnd 5504000 -Octets 635 -Lines 15 -MimeEntityEnd 5504635 -MimeMessageEnd 5504635 -Octets 722 -Lines 19 -MimeEntityEnd 5504635 -MultipartBoundaryBegin 5504635 -MultipartBoundaryEnd 5504667 -MimeEntityBegin 5504667 -MimeEntityHeadersEnd 5504668 -MimeMessageBegin 5504668 -MimeEntityBegin 5504668 -MimeEntityHeadersEnd 5504817 -MimeMessageHeadersEnd 5504817 -Octets 366 -Lines 17 -MimeEntityEnd 5505183 -MimeMessageEnd 5505183 -Octets 515 -Lines 21 -MimeEntityEnd 5505183 -MultipartBoundaryBegin 5505183 -MultipartBoundaryEnd 5505215 -MimeEntityBegin 5505215 -MimeEntityHeadersEnd 5505216 -MimeMessageBegin 5505216 -MimeEntityBegin 5505216 -MimeEntityHeadersEnd 5505317 -MimeMessageHeadersEnd 5505317 -Octets 288 -Lines 6 -MimeEntityEnd 5505605 -MimeMessageEnd 5505605 -Octets 389 -Lines 10 -MimeEntityEnd 5505605 -MultipartBoundaryBegin 5505605 -MultipartBoundaryEnd 5505637 -MimeEntityBegin 5505637 -MimeEntityHeadersEnd 5505638 -MimeMessageBegin 5505638 -MimeEntityBegin 5505638 -MimeEntityHeadersEnd 5505766 -MimeMessageHeadersEnd 5505766 -Octets 479 -Lines 16 -MimeEntityEnd 5506245 -MimeMessageEnd 5506245 -Octets 607 -Lines 20 -MimeEntityEnd 5506245 -MultipartBoundaryBegin 5506245 -MultipartBoundaryEnd 5506277 -MimeEntityBegin 5506277 -MimeEntityHeadersEnd 5506278 -MimeMessageBegin 5506278 -MimeEntityBegin 5506278 -MimeEntityHeadersEnd 5506375 -MimeMessageHeadersEnd 5506375 -Octets 380 -Lines 19 -MimeEntityEnd 5506755 -MimeMessageEnd 5506755 -Octets 477 -Lines 23 -MimeEntityEnd 5506755 -MultipartBoundaryBegin 5506755 -MultipartBoundaryEnd 5506787 -MimeEntityBegin 5506787 -MimeEntityHeadersEnd 5506788 -MimeMessageBegin 5506788 -MimeEntityBegin 5506788 -MimeEntityHeadersEnd 5506903 -MimeMessageHeadersEnd 5506903 -Octets 1319 -Lines 26 -MimeEntityEnd 5508222 -MimeMessageEnd 5508222 -Octets 1434 -Lines 30 -MimeEntityEnd 5508222 -MultipartBoundaryBegin 5508222 -MultipartBoundaryEnd 5508254 -MimeEntityBegin 5508254 -MimeEntityHeadersEnd 5508255 -MimeMessageBegin 5508255 -MimeEntityBegin 5508255 -MimeEntityHeadersEnd 5508355 -MimeMessageHeadersEnd 5508355 -Octets 295 -Lines 9 -MimeEntityEnd 5508650 -MimeMessageEnd 5508650 -Octets 395 -Lines 13 -MimeEntityEnd 5508650 -MultipartBoundaryBegin 5508650 -MultipartBoundaryEnd 5508682 -MimeEntityBegin 5508682 -MimeEntityHeadersEnd 5508683 -MimeMessageBegin 5508683 -MimeEntityBegin 5508683 -MimeEntityHeadersEnd 5508826 -MimeMessageHeadersEnd 5508826 -Octets 1019 -Lines 36 -MimeEntityEnd 5509845 -MimeMessageEnd 5509845 -Octets 1162 -Lines 40 -MimeEntityEnd 5509845 -MultipartEndBoundaryBegin 5509845 -MultipartEndBoundaryEnd 5509878 -MultipartEpilogueBegin 5509878 -MultipartEpilogueEnd 5509879 -Octets 64210 -Lines 1845 -MimeEntityEnd 5509879 -MultipartEndBoundaryBegin 5509879 -MultipartEndBoundaryEnd 5509899 -MultipartEpilogueBegin 5509899 -MultipartEpilogueEnd 5509954 -Octets 68781 -Lines 1958 -MimeEntityEnd 5509954 -MimeMessageEnd 5509954 -MboxMarkerBegin 5509955 -MboxMarkerEnd 5509963 -MimeMessageBegin 5509963 -MimeEntityBegin 5509963 -MimeEntityHeadersEnd 5510771 -MimeMessageHeadersEnd 5510771 -Octets 1871 -Lines 49 -MimeEntityEnd 5512642 -MimeMessageEnd 5512642 -MboxMarkerBegin 5512643 -MboxMarkerEnd 5512651 -MimeMessageBegin 5512651 -MimeEntityBegin 5512651 -MimeEntityHeadersEnd 5513378 -MimeMessageHeadersEnd 5513378 -MultipartPreambleBegin 5513378 -MultipartPreambleEnd 5513378 -MultipartBoundaryBegin 5513378 -MultipartBoundaryEnd 5513405 -MimeEntityBegin 5513405 -MimeEntityHeadersEnd 5513406 -Octets 112 -Lines 2 -MimeEntityEnd 5513518 -MultipartBoundaryBegin 5513518 -MultipartBoundaryEnd 5513546 -MimeEntityBegin 5513546 -MimeEntityHeadersEnd 5513635 -Octets 130692 -Lines 2012 -MimeEntityEnd 5644327 -MultipartBoundaryBegin 5644327 -MultipartBoundaryEnd 5644355 -MimeEntityBegin 5644355 -MimeEntityHeadersEnd 5644356 -Octets 55 -Lines 2 -MimeEntityEnd 5644411 -MultipartBoundaryBegin 5644411 -MultipartBoundaryEnd 5644439 -MimeEntityBegin 5644439 -MimeEntityHeadersEnd 5644584 -Octets 14897 -Lines 78 -MimeEntityEnd 5659481 -MultipartBoundaryBegin 5659481 -MultipartBoundaryEnd 5659509 -MimeEntityBegin 5659509 -MimeEntityHeadersEnd 5659510 -Octets 90 -Lines 6 -MimeEntityEnd 5659600 -MultipartBoundaryBegin 5659600 -MultipartBoundaryEnd 5659628 -MimeEntityBegin 5659628 -MimeEntityHeadersEnd 5659773 -Octets 8101 -Lines 42 -MimeEntityEnd 5667874 -MultipartBoundaryBegin 5667874 -MultipartBoundaryEnd 5667902 -MimeEntityBegin 5667902 -MimeEntityHeadersEnd 5667903 -Octets 74 -Lines 4 -MimeEntityEnd 5667977 -MultipartEndBoundaryBegin 5667977 -MultipartEndBoundaryEnd 5668006 -MultipartEpilogueBegin 5668006 -MultipartEpilogueEnd 5668007 -Octets 154629 -Lines 2171 -MimeEntityEnd 5668007 -MimeMessageEnd 5668007 -MboxMarkerBegin 5668008 -MboxMarkerEnd 5668016 -MimeMessageBegin 5668016 -MimeEntityBegin 5668016 -MimeEntityHeadersEnd 5668539 -MimeMessageHeadersEnd 5668539 -Octets 568 -Lines 21 -MimeEntityEnd 5669107 -MimeMessageEnd 5669107 -MboxMarkerBegin 5669108 -MboxMarkerEnd 5669116 -MimeMessageBegin 5669116 -MimeEntityBegin 5669116 -MimeEntityHeadersEnd 5670302 -MimeMessageHeadersEnd 5670302 -MultipartPreambleBegin 5670302 -MultipartPreambleEnd 5670457 -MultipartBoundaryBegin 5670457 -MultipartBoundaryEnd 5670497 -MimeEntityBegin 5670497 -MimeEntityHeadersEnd 5670541 -Octets 730 -Lines 26 -MimeEntityEnd 5671271 -MultipartBoundaryBegin 5671271 -MultipartBoundaryEnd 5671312 -MimeEntityBegin 5671312 -MimeEntityHeadersEnd 5671397 -MultipartPreambleBegin 5671397 -MultipartPreambleEnd 5671397 -MultipartBoundaryBegin 5671397 -MultipartBoundaryEnd 5671439 -MimeEntityBegin 5671439 -MimeEntityHeadersEnd 5671530 -Octets 802 -Lines 25 -MimeEntityEnd 5672332 -MultipartBoundaryBegin 5672332 -MultipartBoundaryEnd 5672375 -MimeEntityBegin 5672375 -MimeEntityHeadersEnd 5672468 -Octets 57871 -Lines 755 -MimeEntityEnd 5730339 -MultipartBoundaryBegin 5730339 -MultipartBoundaryEnd 5730382 -MimeEntityBegin 5730382 -MimeEntityHeadersEnd 5730473 -Octets 5 -Lines 1 -MimeEntityEnd 5730478 -MultipartEndBoundaryBegin 5730478 -MultipartEndBoundaryEnd 5730522 -MultipartEpilogueBegin 5730522 -MultipartEpilogueEnd 5730523 -Octets 59126 -Lines 798 -MimeEntityEnd 5730523 -MultipartEndBoundaryBegin 5730523 -MultipartEndBoundaryEnd 5730565 -MultipartEpilogueBegin 5730565 -MultipartEpilogueEnd 5730566 -Octets 60264 -Lines 837 -MimeEntityEnd 5730566 -MimeMessageEnd 5730566 -MboxMarkerBegin 5730567 -MboxMarkerEnd 5730575 -MimeMessageBegin 5730575 -MimeEntityBegin 5730575 -MimeEntityHeadersEnd 5731315 -MimeMessageHeadersEnd 5731315 -MultipartPreambleBegin 5731315 -MultipartPreambleEnd 5731316 -MultipartBoundaryBegin 5731316 -MultipartBoundaryEnd 5731365 -MimeEntityBegin 5731365 -MimeEntityHeadersEnd 5731455 -Octets 174 -Lines 7 -MimeEntityEnd 5731629 -MultipartBoundaryBegin 5731629 -MultipartBoundaryEnd 5731679 -MimeEntityBegin 5731679 -MimeEntityHeadersEnd 5731738 -Octets 55248 -Lines 757 -MimeEntityEnd 5786986 -MultipartEndBoundaryBegin 5786986 -MultipartEndBoundaryEnd 5787037 -MultipartEpilogueBegin 5787037 -MultipartEpilogueEnd 5787038 -Octets 55723 -Lines 775 -MimeEntityEnd 5787038 -MimeMessageEnd 5787038 -MboxMarkerBegin 5787039 -MboxMarkerEnd 5787071 -MimeMessageBegin 5787071 -MimeEntityBegin 5787071 -MimeEntityHeadersEnd 5788538 -MimeMessageHeadersEnd 5788538 -Octets 1340 -Lines 34 -MimeEntityEnd 5789878 -MimeMessageEnd 5789878 -MboxMarkerBegin 5789879 -MboxMarkerEnd 5789887 -MimeMessageBegin 5789887 -MimeEntityBegin 5789887 -MimeEntityHeadersEnd 5790681 -MimeMessageHeadersEnd 5790681 -MultipartPreambleBegin 5790681 -MultipartPreambleEnd 5790727 -MultipartBoundaryBegin 5790727 -MultipartBoundaryEnd 5790752 -MimeEntityBegin 5790752 -MimeEntityHeadersEnd 5790828 -Octets 370 -Lines 13 -MimeEntityEnd 5791198 -MultipartBoundaryBegin 5791198 -MultipartBoundaryEnd 5791224 -MimeEntityBegin 5791224 -MimeEntityHeadersEnd 5791314 -MimeMessageBegin 5791314 -MimeEntityBegin 5791314 -MimeEntityHeadersEnd 5792382 -MimeMessageHeadersEnd 5792382 -Octets 24395 -Lines 463 -MimeEntityEnd 5816777 -MimeMessageEnd 5816777 -Octets 25463 -Lines 477 -MimeEntityEnd 5816777 -MultipartEndBoundaryBegin 5816777 -MultipartEndBoundaryEnd 5816804 -MultipartEpilogueBegin 5816804 -MultipartEpilogueEnd 5816805 -Octets 26124 -Lines 504 -MimeEntityEnd 5816805 -MimeMessageEnd 5816805 -MboxMarkerBegin 5816806 -MboxMarkerEnd 5816814 -MimeMessageBegin 5816814 -MimeEntityBegin 5816814 -MimeEntityHeadersEnd 5817482 -MimeMessageHeadersEnd 5817482 -MultipartPreambleBegin 5817482 -MultipartPreambleEnd 5817528 -MultipartBoundaryBegin 5817528 -MultipartBoundaryEnd 5817576 -MimeEntityBegin 5817576 -MimeEntityHeadersEnd 5817654 -Octets 34 -Lines 1 -MimeEntityEnd 5817688 -MultipartBoundaryBegin 5817688 -MultipartBoundaryEnd 5817737 -MimeEntityBegin 5817737 -MimeEntityHeadersEnd 5817796 -Octets 22151 -Lines 304 -MimeEntityEnd 5839947 -MultipartEndBoundaryBegin 5839947 -MultipartEndBoundaryEnd 5839997 -MultipartEpilogueBegin 5839997 -MultipartEpilogueEnd 5839997 -Octets 22515 -Lines 317 -MimeEntityEnd 5839997 -MimeMessageEnd 5839997 -MboxMarkerBegin 5839998 -MboxMarkerEnd 5840030 -MimeMessageBegin 5840030 -MimeEntityBegin 5840030 -MimeEntityHeadersEnd 5840554 -MimeMessageHeadersEnd 5840554 -MultipartPreambleBegin 5840554 -MultipartPreambleEnd 5840554 -MultipartBoundaryBegin 5840554 -MultipartBoundaryEnd 5840562 -MimeEntityBegin 5840562 -MimeEntityHeadersEnd 5840606 -Octets 1172 -Lines 21 -MimeEntityEnd 5841778 -MultipartBoundaryBegin 5841778 -MultipartBoundaryEnd 5841787 -MimeEntityBegin 5841787 -MimeEntityHeadersEnd 5841913 -Octets 146 -Lines 3 -MimeEntityEnd 5842059 -MultipartBoundaryBegin 5842059 -MultipartBoundaryEnd 5842068 -MimeEntityBegin 5842068 -MimeEntityHeadersEnd 5842184 -Octets 194 -Lines 3 -MimeEntityEnd 5842378 -MultipartEndBoundaryBegin 5842378 -MultipartEndBoundaryEnd 5842388 -MultipartEpilogueBegin 5842388 -MultipartEpilogueEnd 5842388 -Octets 1834 -Lines 42 -MimeEntityEnd 5842388 -MimeMessageEnd 5842388 -MboxMarkerBegin 5842389 -MboxMarkerEnd 5842397 -MimeMessageBegin 5842397 -MimeEntityBegin 5842397 -MimeEntityHeadersEnd 5843191 -MimeMessageHeadersEnd 5843191 -Octets 256778 -Lines 3518 -MimeEntityEnd 6099969 -MimeMessageEnd 6099969 -MboxMarkerBegin 6099970 -MboxMarkerEnd 6099978 -MimeMessageBegin 6099978 -MimeEntityBegin 6099978 -MimeEntityHeadersEnd 6100830 -MimeMessageHeadersEnd 6100830 -MultipartPreambleBegin 6100830 -MultipartPreambleEnd 6100831 -MultipartBoundaryBegin 6100831 -MultipartBoundaryEnd 6100845 -MimeEntityBegin 6100845 -MimeEntityHeadersEnd 6100922 -Octets 190 -Lines 9 -MimeEntityEnd 6101112 -MultipartBoundaryBegin 6101112 -MultipartBoundaryEnd 6101127 -MimeEntityBegin 6101127 -MimeEntityHeadersEnd 6101231 -Octets 98247 -Lines 1276 -MimeEntityEnd 6199478 -MultipartEndBoundaryBegin 6199478 -MultipartEndBoundaryEnd 6199494 -MultipartEpilogueBegin 6199494 -MultipartEpilogueEnd 6199495 -Octets 98665 -Lines 1296 -MimeEntityEnd 6199495 -MimeMessageEnd 6199495 -MboxMarkerBegin 6199496 -MboxMarkerEnd 6199504 -MimeMessageBegin 6199504 -MimeEntityBegin 6199504 -MimeEntityHeadersEnd 6200381 -MimeMessageHeadersEnd 6200381 -MultipartPreambleBegin 6200381 -MultipartPreambleEnd 6200381 -MultipartBoundaryBegin 6200381 -MultipartBoundaryEnd 6200390 -MimeEntityBegin 6200390 -MimeEntityHeadersEnd 6200436 -Octets 943 -Lines 21 -MimeEntityEnd 6201379 -MultipartBoundaryBegin 6201379 -MultipartBoundaryEnd 6201389 -MimeEntityBegin 6201389 -MimeEntityHeadersEnd 6201452 -MultipartPreambleBegin 6201452 -MultipartPreambleEnd 6201453 -MultipartBoundaryBegin 6201453 -MultipartBoundaryEnd 6201475 -MimeEntityBegin 6201475 -MimeEntityHeadersEnd 6201836 -MultipartPreambleBegin 6201836 -MultipartPreambleEnd 6201836 -MultipartBoundaryBegin 6201836 -MultipartBoundaryEnd 6201858 -MimeEntityBegin 6201858 -MimeEntityHeadersEnd 6201960 -MultipartPreambleBegin 6201960 -MultipartPreambleEnd 6201960 -MultipartBoundaryBegin 6201960 -MultipartBoundaryEnd 6201982 -MimeEntityBegin 6201982 -MimeEntityHeadersEnd 6202105 -Octets 366 -Lines 8 -MimeEntityEnd 6202471 -MultipartBoundaryBegin 6202471 -MultipartBoundaryEnd 6202494 -MimeEntityBegin 6202494 -MimeEntityHeadersEnd 6202616 -Octets 392 -Lines 10 -MimeEntityEnd 6203008 -MultipartBoundaryBegin 6203008 -MultipartBoundaryEnd 6203031 -MimeEntityBegin 6203031 -MimeEntityHeadersEnd 6203156 -Octets 708 -Lines 18 -MimeEntityEnd 6203864 -MultipartEndBoundaryBegin 6203864 -MultipartEndBoundaryEnd 6203888 -MultipartEpilogueBegin 6203888 -MultipartEpilogueEnd 6203889 -Octets 1929 -Lines 55 -MimeEntityEnd 6203889 -MultipartBoundaryBegin 6203889 -MultipartBoundaryEnd 6203912 -MimeEntityBegin 6203912 -MimeEntityHeadersEnd 6204011 -MultipartPreambleBegin 6204011 -MultipartPreambleEnd 6204011 -MultipartBoundaryBegin 6204011 -MultipartBoundaryEnd 6204033 -MimeEntityBegin 6204033 -MimeEntityHeadersEnd 6204165 -Octets 16415 -Lines 470 -MimeEntityEnd 6220580 -MultipartBoundaryBegin 6220580 -MultipartBoundaryEnd 6220603 -MimeEntityBegin 6220603 -MimeEntityHeadersEnd 6220734 -Octets 14254 -Lines 395 -MimeEntityEnd 6234988 -MultipartBoundaryBegin 6234988 -MultipartBoundaryEnd 6235011 -MimeEntityBegin 6235011 -MimeEntityHeadersEnd 6235112 -MultipartPreambleBegin 6235112 -MultipartPreambleEnd 6235112 -MultipartBoundaryBegin 6235112 -MultipartBoundaryEnd 6235134 -MimeEntityBegin 6235134 -MimeEntityHeadersEnd 6235276 -Octets 6152 -Lines 164 -MimeEntityEnd 6241428 -MultipartBoundaryBegin 6241428 -MultipartBoundaryEnd 6241451 -MimeEntityBegin 6241451 -MimeEntityHeadersEnd 6241578 -Octets 5255 -Lines 160 -MimeEntityEnd 6246833 -MultipartBoundaryBegin 6246833 -MultipartBoundaryEnd 6246856 -MimeEntityBegin 6246856 -MimeEntityHeadersEnd 6246993 -Octets 7298 -Lines 197 -MimeEntityEnd 6254291 -MultipartBoundaryBegin 6254291 -MultipartBoundaryEnd 6254314 -MimeEntityBegin 6254314 -MimeEntityHeadersEnd 6254438 -Octets 6476 -Lines 184 -MimeEntityEnd 6260914 -MultipartBoundaryBegin 6260914 -MultipartBoundaryEnd 6260937 -MimeEntityBegin 6260937 -MimeEntityHeadersEnd 6261074 -Octets 17168 -Lines 492 -MimeEntityEnd 6278242 -MultipartEndBoundaryBegin 6278242 -MultipartEndBoundaryEnd 6278266 -MultipartEpilogueBegin 6278266 -MultipartEpilogueEnd 6278267 -Octets 43155 -Lines 1228 -MimeEntityEnd 6278267 -MultipartBoundaryBegin 6278267 -MultipartBoundaryEnd 6278290 -MimeEntityBegin 6278290 -MimeEntityHeadersEnd 6278385 -MultipartPreambleBegin 6278385 -MultipartPreambleEnd 6278385 -MultipartBoundaryBegin 6278385 -MultipartBoundaryEnd 6278407 -MimeEntityBegin 6278407 -MimeEntityHeadersEnd 6278541 -Octets 495 -Lines 21 -MimeEntityEnd 6279036 -MultipartEndBoundaryBegin 6279036 -MultipartEndBoundaryEnd 6279060 -MultipartEpilogueBegin 6279060 -MultipartEpilogueEnd 6279061 -Octets 676 -Lines 28 -MimeEntityEnd 6279061 -MultipartEndBoundaryBegin 6279061 -MultipartEndBoundaryEnd 6279085 -MultipartEpilogueBegin 6279085 -MultipartEpilogueEnd 6279086 -Octets 75075 -Lines 2144 -MimeEntityEnd 6279086 -MultipartBoundaryBegin 6279086 -MultipartBoundaryEnd 6279109 -MimeEntityBegin 6279109 -MimeEntityHeadersEnd 6279220 -MultipartPreambleBegin 6279220 -MultipartPreambleEnd 6279220 -MultipartBoundaryBegin 6279220 -MultipartBoundaryEnd 6279242 -MimeEntityBegin 6279242 -MimeEntityHeadersEnd 6279380 -Octets 1149 -Lines 29 -MimeEntityEnd 6280529 -MultipartBoundaryBegin 6280529 -MultipartBoundaryEnd 6280552 -MimeEntityBegin 6280552 -MimeEntityHeadersEnd 6280678 -Octets 1220 -Lines 35 -MimeEntityEnd 6281898 -MultipartBoundaryBegin 6281898 -MultipartBoundaryEnd 6281921 -MimeEntityBegin 6281921 -MimeEntityHeadersEnd 6282061 -Octets 677 -Lines 22 -MimeEntityEnd 6282738 -MultipartEndBoundaryBegin 6282738 -MultipartEndBoundaryEnd 6282762 -MultipartEpilogueBegin 6282762 -MultipartEpilogueEnd 6282763 -Octets 3543 -Lines 105 -MimeEntityEnd 6282763 -MultipartEndBoundaryBegin 6282763 -MultipartEndBoundaryEnd 6282787 -MultipartEpilogueBegin 6282787 -MultipartEpilogueEnd 6282788 -Octets 80952 -Lines 2320 -MimeEntityEnd 6282788 -MultipartEndBoundaryBegin 6282788 -MultipartEndBoundaryEnd 6282812 -MultipartEpilogueBegin 6282812 -MultipartEpilogueEnd 6282813 -Octets 81361 -Lines 2332 -MimeEntityEnd 6282813 -MultipartEndBoundaryBegin 6282813 -MultipartEndBoundaryEnd 6282824 -MultipartEpilogueBegin 6282824 -MultipartEpilogueEnd 6282825 -Octets 82444 -Lines 2362 -MimeEntityEnd 6282825 -MimeMessageEnd 6282825 -MboxMarkerBegin 6282826 -MboxMarkerEnd 6282834 -MimeMessageBegin 6282834 -MimeEntityBegin 6282834 -MimeEntityHeadersEnd 6283636 -MimeMessageHeadersEnd 6283636 -Octets 9199 -Lines 226 -MimeEntityEnd 6292835 -MimeMessageEnd 6292835 -MboxMarkerBegin 6292836 -MboxMarkerEnd 6292844 -MimeMessageBegin 6292844 -MimeEntityBegin 6292844 -MimeEntityHeadersEnd 6293572 -MimeMessageHeadersEnd 6293572 -MultipartPreambleBegin 6293572 -MultipartPreambleEnd 6293727 -MultipartBoundaryBegin 6293727 -MultipartBoundaryEnd 6293767 -MimeEntityBegin 6293767 -MimeEntityHeadersEnd 6293811 -Octets 756 -Lines 23 -MimeEntityEnd 6294567 -MultipartBoundaryBegin 6294567 -MultipartBoundaryEnd 6294608 -MimeEntityBegin 6294608 -MimeEntityHeadersEnd 6294693 -MultipartPreambleBegin 6294693 -MultipartPreambleEnd 6294693 -MultipartBoundaryBegin 6294693 -MultipartBoundaryEnd 6294735 -MimeEntityBegin 6294735 -MimeEntityHeadersEnd 6294826 -Octets 327 -Lines 7 -MimeEntityEnd 6295153 -MultipartBoundaryBegin 6295153 -MultipartBoundaryEnd 6295196 -MimeEntityBegin 6295196 -MimeEntityHeadersEnd 6295290 -Octets 22024 -Lines 320 -MimeEntityEnd 6317314 -MultipartBoundaryBegin 6317314 -MultipartBoundaryEnd 6317357 -MimeEntityBegin 6317357 -MimeEntityHeadersEnd 6317448 -Octets 166 -Lines 5 -MimeEntityEnd 6317614 -MultipartBoundaryBegin 6317614 -MultipartBoundaryEnd 6317657 -MimeEntityBegin 6317657 -MimeEntityHeadersEnd 6317754 -Octets 47213 -Lines 685 -MimeEntityEnd 6364967 -MultipartBoundaryBegin 6364967 -MultipartBoundaryEnd 6365010 -MimeEntityBegin 6365010 -MimeEntityHeadersEnd 6365101 -Octets 70 -Lines 2 -MimeEntityEnd 6365171 -MultipartBoundaryBegin 6365171 -MultipartBoundaryEnd 6365214 -MimeEntityBegin 6365214 -MimeEntityHeadersEnd 6365304 -Octets 20218 -Lines 294 -MimeEntityEnd 6385522 -MultipartBoundaryBegin 6385522 -MultipartBoundaryEnd 6385565 -MimeEntityBegin 6385565 -MimeEntityHeadersEnd 6385656 -Octets 104 -Lines 8 -MimeEntityEnd 6385760 -MultipartEndBoundaryBegin 6385760 -MultipartEndBoundaryEnd 6385804 -MultipartEpilogueBegin 6385804 -MultipartEpilogueEnd 6385805 -Octets 91112 -Lines 1360 -MimeEntityEnd 6385805 -MultipartEndBoundaryBegin 6385805 -MultipartEndBoundaryEnd 6385847 -MultipartEpilogueBegin 6385847 -MultipartEpilogueEnd 6385847 -Octets 92275 -Lines 1396 -MimeEntityEnd 6385847 -MimeMessageEnd 6385847 -MboxMarkerBegin 6385848 -MboxMarkerEnd 6385856 -MimeMessageBegin 6385856 -MimeEntityBegin 6385856 -MimeEntityHeadersEnd 6386610 -MimeMessageHeadersEnd 6386610 -MultipartPreambleBegin 6386610 -MultipartPreambleEnd 6386805 -MultipartBoundaryBegin 6386805 -MultipartBoundaryEnd 6386850 -MimeEntityBegin 6386850 -MimeEntityHeadersEnd 6386923 -Octets 420 -Lines 13 -MimeEntityEnd 6387343 -MultipartBoundaryBegin 6387343 -MultipartBoundaryEnd 6387389 -MimeEntityBegin 6387389 -MimeEntityHeadersEnd 6387450 -Octets 33564 -Lines 460 -MimeEntityEnd 6421014 -MultipartBoundaryBegin 6421014 -MultipartBoundaryEnd 6421060 -MimeEntityBegin 6421060 -MimeEntityHeadersEnd 6421133 -Octets 94 -Lines 7 -MimeEntityEnd 6421227 -MultipartEndBoundaryBegin 6421227 -MultipartEndBoundaryEnd 6421274 -MultipartEpilogueBegin 6421274 -MultipartEpilogueEnd 6421275 -Octets 34665 -Lines 500 -MimeEntityEnd 6421275 -MimeMessageEnd 6421275 -MboxMarkerBegin 6421276 -MboxMarkerEnd 6421318 -MimeMessageBegin 6421318 -MimeEntityBegin 6421318 -MimeEntityHeadersEnd 6421466 -MimeMessageHeadersEnd 6421466 -Octets 43029 -Lines 693 -MimeEntityEnd 6464495 -MimeMessageEnd 6464495 -MboxMarkerBegin 6464496 -MboxMarkerEnd 6464528 -MimeMessageBegin 6464528 -MimeEntityBegin 6464528 -MimeEntityHeadersEnd 6465111 -MimeMessageHeadersEnd 6465111 -MultipartPreambleBegin 6465111 -MultipartPreambleEnd 6465157 -MultipartBoundaryBegin 6465157 -MultipartBoundaryEnd 6465196 -MimeEntityBegin 6465196 -MimeEntityHeadersEnd 6465314 -MultipartPreambleBegin 6465314 -MultipartPreambleEnd 6465315 -MultipartBoundaryBegin 6465315 -MultipartBoundaryEnd 6465354 -MimeEntityBegin 6465354 -MimeEntityHeadersEnd 6465432 -Octets 1272 -Lines 38 -MimeEntityEnd 6466704 -MultipartBoundaryBegin 6466704 -MultipartBoundaryEnd 6466744 -MimeEntityBegin 6466744 -MimeEntityHeadersEnd 6466823 -Octets 2464 -Lines 32 -MimeEntityEnd 6469287 -MultipartEndBoundaryBegin 6469287 -MultipartEndBoundaryEnd 6469328 -MultipartEpilogueBegin 6469328 -MultipartEpilogueEnd 6469330 -Octets 4016 -Lines 83 -MimeEntityEnd 6469330 -MultipartBoundaryBegin 6469330 -MultipartBoundaryEnd 6469370 -MimeEntityBegin 6469370 -MimeEntityHeadersEnd 6469575 -Octets 20750 -Lines 270 -MimeEntityEnd 6490325 -MultipartEndBoundaryBegin 6490325 -MultipartEndBoundaryEnd 6490366 -MultipartEpilogueBegin 6490366 -MultipartEpilogueEnd 6490367 -Octets 25256 -Lines 368 -MimeEntityEnd 6490367 -MimeMessageEnd 6490367 -MboxMarkerBegin 6490368 -MboxMarkerEnd 6490400 -MimeMessageBegin 6490400 -MimeEntityBegin 6490400 -MimeEntityHeadersEnd 6490806 -MimeMessageHeadersEnd 6490806 -MultipartPreambleBegin 6490806 -MultipartPreambleEnd 6490852 -MultipartBoundaryBegin 6490852 -MultipartBoundaryEnd 6490872 -MimeEntityBegin 6490872 -MimeEntityHeadersEnd 6490873 -Octets 63 -Lines 1 -MimeEntityEnd 6490936 -MultipartBoundaryBegin 6490936 -MultipartBoundaryEnd 6490957 -MimeEntityBegin 6490957 -MimeEntityHeadersEnd 6491031 -MultipartPreambleBegin 6491031 -MultipartPreambleEnd 6491031 -MultipartBoundaryBegin 6491031 -MultipartBoundaryEnd 6491058 -MimeEntityBegin 6491058 -MimeEntityHeadersEnd 6491164 -Octets 80 -Lines 3 -MimeEntityEnd 6491244 -MultipartBoundaryBegin 6491244 -MultipartBoundaryEnd 6491272 -MimeEntityBegin 6491272 -MimeEntityHeadersEnd 6491381 -Octets 158 -Lines 4 -MimeEntityEnd 6491539 -MultipartBoundaryBegin 6491539 -MultipartBoundaryEnd 6491567 -MimeEntityBegin 6491567 -MimeEntityHeadersEnd 6491676 -Octets 163 -Lines 10 -MimeEntityEnd 6491839 -MultipartBoundaryBegin 6491839 -MultipartBoundaryEnd 6491867 -MimeEntityBegin 6491867 -MimeEntityHeadersEnd 6491972 -Octets 161 -Lines 3 -MimeEntityEnd 6492133 -MultipartBoundaryBegin 6492133 -MultipartBoundaryEnd 6492161 -MimeEntityBegin 6492161 -MimeEntityHeadersEnd 6492285 -Octets 427 -Lines 6 -MimeEntityEnd 6492712 -MultipartEndBoundaryBegin 6492712 -MultipartEndBoundaryEnd 6492741 -MultipartEpilogueBegin 6492741 -MultipartEpilogueEnd 6492741 -Octets 1710 -Lines 57 -MimeEntityEnd 6492741 -MultipartBoundaryBegin 6492741 -MultipartBoundaryEnd 6492762 -MimeEntityBegin 6492762 -MimeEntityHeadersEnd 6492763 -Octets 165 -Lines 4 -MimeEntityEnd 6492928 -MultipartBoundaryBegin 6492928 -MultipartBoundaryEnd 6492949 -MimeEntityBegin 6492949 -MimeEntityHeadersEnd 6492999 -MultipartPreambleBegin 6492999 -MultipartPreambleEnd 6492999 -MultipartBoundaryBegin 6492999 -MultipartBoundaryEnd 6493004 -MimeEntityBegin 6493004 -MimeEntityHeadersEnd 6493030 -Octets 53 -Lines 1 -MimeEntityEnd 6493083 -MultipartBoundaryBegin 6493083 -MultipartBoundaryEnd 6493089 -MimeEntityBegin 6493089 -MimeEntityHeadersEnd 6493139 -MultipartPreambleBegin 6493139 -MultipartPreambleEnd 6493139 -MultipartBoundaryBegin 6493139 -MultipartBoundaryEnd 6493144 -MimeEntityBegin 6493144 -MimeEntityHeadersEnd 6493170 -Octets 53 -Lines 1 -MimeEntityEnd 6493223 -MultipartBoundaryBegin 6493223 -MultipartBoundaryEnd 6493229 -MimeEntityBegin 6493229 -MimeEntityHeadersEnd 6493254 -Octets 50 -Lines 1 -MimeEntityEnd 6493304 -MultipartBoundaryBegin 6493304 -MultipartBoundaryEnd 6493310 -MimeEntityBegin 6493310 -MimeEntityHeadersEnd 6493337 -Octets 54 -Lines 1 -MimeEntityEnd 6493391 -MultipartEndBoundaryBegin 6493391 -MultipartEndBoundaryEnd 6493398 -MultipartEpilogueBegin 6493398 -MultipartEpilogueEnd 6493399 -Octets 260 -Lines 16 -MimeEntityEnd 6493399 -MultipartBoundaryBegin 6493399 -MultipartBoundaryEnd 6493405 -MimeEntityBegin 6493405 -MimeEntityHeadersEnd 6493497 -Octets 15 -Lines 1 -MimeEntityEnd 6493512 -MultipartEndBoundaryBegin 6493512 -MultipartEndBoundaryEnd 6493519 -MultipartEpilogueBegin 6493519 -MultipartEpilogueEnd 6493519 -Octets 520 -Lines 32 -MimeEntityEnd 6493519 -MultipartBoundaryBegin 6493519 -MultipartBoundaryEnd 6493540 -MimeEntityBegin 6493540 -MimeEntityHeadersEnd 6493541 -Octets 9 -Lines 1 -MimeEntityEnd 6493550 -MultipartEndBoundaryBegin 6493550 -MultipartEndBoundaryEnd 6493572 -MultipartEpilogueBegin 6493572 -MultipartEpilogueEnd 6493572 -Octets 2766 -Lines 113 -MimeEntityEnd 6493572 -MimeMessageEnd 6493572 -MboxMarkerBegin 6493573 -MboxMarkerEnd 6493605 -MimeMessageBegin 6493605 -MimeEntityBegin 6493605 -MimeEntityHeadersEnd 6494009 -MimeMessageHeadersEnd 6494009 -MultipartPreambleBegin 6494009 -MultipartPreambleEnd 6494055 -MultipartBoundaryBegin 6494055 -MultipartBoundaryEnd 6494075 -MimeEntityBegin 6494075 -MimeEntityHeadersEnd 6494076 -Octets 67 -Lines 1 -MimeEntityEnd 6494143 -MultipartBoundaryBegin 6494143 -MultipartBoundaryEnd 6494164 -MimeEntityBegin 6494164 -MimeEntityHeadersEnd 6494238 -MultipartPreambleBegin 6494238 -MultipartPreambleEnd 6494238 -MultipartBoundaryBegin 6494238 -MultipartBoundaryEnd 6494265 -MimeEntityBegin 6494265 -MimeEntityHeadersEnd 6494421 -Octets 55263 -Lines 1603 -MimeEntityEnd 6549684 -MultipartBoundaryBegin 6549684 -MultipartBoundaryEnd 6549712 -MimeEntityBegin 6549712 -MimeEntityHeadersEnd 6549867 -Octets 106049 -Lines 2982 -MimeEntityEnd 6655916 -MultipartBoundaryBegin 6655916 -MultipartBoundaryEnd 6655944 -MimeEntityBegin 6655944 -MimeEntityHeadersEnd 6656090 -Octets 188359 -Lines 13109 -MimeEntityEnd 6844449 -MultipartEndBoundaryBegin 6844449 -MultipartEndBoundaryEnd 6844478 -MultipartEpilogueBegin 6844478 -MultipartEpilogueEnd 6844479 -Octets 350241 -Lines 17713 -MimeEntityEnd 6844479 -MultipartEndBoundaryBegin 6844479 -MultipartEndBoundaryEnd 6844501 -MultipartEpilogueBegin 6844501 -MultipartEpilogueEnd 6844507 -Octets 350498 -Lines 17726 -MimeEntityEnd 6844507 -MimeMessageEnd 6844507 -MboxMarkerBegin 6844508 -MboxMarkerEnd 6844516 -MimeMessageBegin 6844516 -MimeEntityBegin 6844516 -MimeEntityHeadersEnd 6845120 -MimeMessageHeadersEnd 6845120 -MultipartPreambleBegin 6845120 -MultipartPreambleEnd 6845336 -MultipartBoundaryBegin 6845336 -MultipartBoundaryEnd 6845376 -MimeEntityBegin 6845376 -MimeEntityHeadersEnd 6845488 -Octets 0 -Lines 0 -MimeEntityEnd 6845488 -MultipartBoundaryBegin 6845488 -MultipartBoundaryEnd 6845529 -MimeEntityBegin 6845529 -MimeEntityHeadersEnd 6845627 -MimeMessageBegin 6845627 -MimeEntityBegin 6845627 -MimeEntityHeadersEnd 6846168 -MimeMessageHeadersEnd 6846168 -Octets 346 -Lines 16 -MimeEntityEnd 6846514 -MimeMessageEnd 6846514 -Octets 887 -Lines 28 -MimeEntityEnd 6846514 -MultipartEndBoundaryBegin 6846514 -MultipartEndBoundaryEnd 6846556 -MultipartEpilogueBegin 6846556 -MultipartEpilogueEnd 6846556 -Octets 1436 -Lines 43 -MimeEntityEnd 6846556 -MimeMessageEnd 6846556 -MboxMarkerBegin 6846557 -MboxMarkerEnd 6846565 -MimeMessageBegin 6846565 -MimeEntityBegin 6846565 -MimeEntityHeadersEnd 6846861 -MimeMessageHeadersEnd 6846861 -MultipartPreambleBegin 6846861 -MultipartPreambleEnd 6846861 -MultipartBoundaryBegin 6846861 -MultipartBoundaryEnd 6846900 -MimeEntityBegin 6846900 -MimeEntityHeadersEnd 6847146 -Octets 719 -Lines 30 -MimeEntityEnd 6847865 -MultipartBoundaryBegin 6847865 -MultipartBoundaryEnd 6847905 -MimeEntityBegin 6847905 -MimeEntityHeadersEnd 6848225 -Octets 10723 -Lines 147 -MimeEntityEnd 6858948 -MultipartEndBoundaryBegin 6858948 -MultipartEndBoundaryEnd 6858989 -MultipartEpilogueBegin 6858989 -MultipartEpilogueEnd 6858989 -Octets 12128 -Lines 197 -MimeEntityEnd 6858989 -MimeMessageEnd 6858989 -MboxMarkerBegin 6858990 -MboxMarkerEnd 6858998 -MimeMessageBegin 6858998 -MimeEntityBegin 6858998 -MimeEntityHeadersEnd 6859294 -MimeMessageHeadersEnd 6859294 -MultipartPreambleBegin 6859294 -MultipartPreambleEnd 6859294 -MultipartBoundaryBegin 6859294 -MultipartBoundaryEnd 6859333 -MimeEntityBegin 6859333 -MimeEntityHeadersEnd 6859579 -Octets 718 -Lines 30 -MimeEntityEnd 6860297 -MultipartBoundaryBegin 6860297 -MultipartBoundaryEnd 6860337 -MimeEntityBegin 6860337 -MimeEntityHeadersEnd 6860626 -Octets 10723 -Lines 147 -MimeEntityEnd 6871349 -MultipartEndBoundaryBegin 6871349 -MultipartEndBoundaryEnd 6871390 -MultipartEpilogueBegin 6871390 -MultipartEpilogueEnd 6871390 -Octets 12096 -Lines 197 -MimeEntityEnd 6871390 -MimeMessageEnd 6871390 -MboxMarkerBegin 6871391 -MboxMarkerEnd 6871423 -MimeMessageBegin 6871423 -MimeEntityBegin 6871423 -MimeEntityHeadersEnd 6872926 -MimeMessageHeadersEnd 6872926 -MultipartPreambleBegin 6872926 -MultipartPreambleEnd 6872927 -MultipartBoundaryBegin 6872927 -MultipartBoundaryEnd 6872971 -MimeEntityBegin 6872971 -MimeEntityHeadersEnd 6873062 -Octets 5199 -Lines 111 -MimeEntityEnd 6878261 -MultipartBoundaryBegin 6878261 -MultipartBoundaryEnd 6878306 -MimeEntityBegin 6878306 -MimeEntityHeadersEnd 6878505 -Octets 929 -Lines 13 -MimeEntityEnd 6879434 -MultipartEndBoundaryBegin 6879434 -MultipartEndBoundaryEnd 6879480 -MultipartEpilogueBegin 6879480 -MultipartEpilogueEnd 6879481 -Octets 6555 -Lines 139 -MimeEntityEnd 6879481 -MimeMessageEnd 6879481 -MboxMarkerBegin 6879482 -MboxMarkerEnd 6879514 -MimeMessageBegin 6879514 -MimeEntityBegin 6879514 -MimeEntityHeadersEnd 6879961 -MimeMessageHeadersEnd 6879961 -MultipartPreambleBegin 6879961 -MultipartPreambleEnd 6879961 -MultipartBoundaryBegin 6879961 -MultipartBoundaryEnd 6880000 -MimeEntityBegin 6880000 -MimeEntityHeadersEnd 6880026 -Octets 247 -Lines 6 -MimeEntityEnd 6880273 -MultipartBoundaryBegin 6880273 -MultipartBoundaryEnd 6880313 -MimeEntityBegin 6880313 -MimeEntityHeadersEnd 6880399 -MultipartPreambleBegin 6880399 -MultipartPreambleEnd 6880399 -MultipartBoundaryBegin 6880399 -MultipartBoundaryEnd 6880438 -MimeEntityBegin 6880438 -MimeEntityHeadersEnd 6880632 -Octets 7148 -Lines 179 -MimeEntityEnd 6887780 -MultipartBoundaryBegin 6887780 -MultipartBoundaryEnd 6887820 -MimeEntityBegin 6887820 -MimeEntityHeadersEnd 6887996 -Octets 7981 -Lines 110 -MimeEntityEnd 6895977 -MultipartBoundaryBegin 6895977 -MultipartBoundaryEnd 6896017 -MimeEntityBegin 6896017 -MimeEntityHeadersEnd 6896176 -Octets 7454 -Lines 103 -MimeEntityEnd 6903630 -MultipartBoundaryBegin 6903630 -MultipartBoundaryEnd 6903670 -MimeEntityBegin 6903670 -MimeEntityHeadersEnd 6903828 -Octets 3333 -Lines 46 -MimeEntityEnd 6907161 -MultipartBoundaryBegin 6907161 -MultipartBoundaryEnd 6907201 -MimeEntityBegin 6907201 -MimeEntityHeadersEnd 6907360 -Octets 8451 -Lines 116 -MimeEntityEnd 6915811 -MultipartBoundaryBegin 6915811 -MultipartBoundaryEnd 6915851 -MimeEntityBegin 6915851 -MimeEntityHeadersEnd 6916007 -Octets 104369 -Lines 1430 -MimeEntityEnd 7020376 -MultipartBoundaryBegin 7020376 -MultipartBoundaryEnd 7020416 -MimeEntityBegin 7020416 -MimeEntityHeadersEnd 7020575 -Octets 38361 -Lines 526 -MimeEntityEnd 7058936 -MultipartBoundaryBegin 7058936 -MultipartBoundaryEnd 7058976 -MimeEntityBegin 7058976 -MimeEntityHeadersEnd 7059140 -Octets 35315 -Lines 484 -MimeEntityEnd 7094455 -MultipartEndBoundaryBegin 7094455 -MultipartEndBoundaryEnd 7094496 -MultipartEpilogueBegin 7094496 -MultipartEpilogueEnd 7094496 -Octets 214097 -Lines 3044 -MimeEntityEnd 7094496 -MultipartEndBoundaryBegin 7094496 -MultipartEndBoundaryEnd 7094537 -MultipartEpilogueBegin 7094537 -MultipartEpilogueEnd 7094537 -Octets 214576 -Lines 3059 -MimeEntityEnd 7094537 -MimeMessageEnd 7094537 -MboxMarkerBegin 7094538 -MboxMarkerEnd 7094546 -MimeMessageBegin 7094546 -MimeEntityBegin 7094546 -MimeEntityHeadersEnd 7094841 -MimeMessageHeadersEnd 7094841 -MultipartPreambleBegin 7094841 -MultipartPreambleEnd 7094841 -MultipartBoundaryBegin 7094841 -MultipartBoundaryEnd 7094880 -MimeEntityBegin 7094880 -MimeEntityHeadersEnd 7095036 -Octets 551 -Lines 27 -MimeEntityEnd 7095587 -MultipartBoundaryBegin 7095587 -MultipartBoundaryEnd 7095627 -MimeEntityBegin 7095627 -MimeEntityHeadersEnd 7095740 -Octets 10723 -Lines 147 -MimeEntityEnd 7106463 -MultipartEndBoundaryBegin 7106463 -MultipartEndBoundaryEnd 7106504 -MultipartEpilogueBegin 7106504 -MultipartEpilogueEnd 7106504 -Octets 11663 -Lines 188 -MimeEntityEnd 7106504 -MimeMessageEnd 7106504 -MboxMarkerBegin 7106505 -MboxMarkerEnd 7106513 -MimeMessageBegin 7106513 -MimeEntityBegin 7106513 -MimeEntityHeadersEnd 7106808 -MimeMessageHeadersEnd 7106808 -MultipartPreambleBegin 7106808 -MultipartPreambleEnd 7106808 -MultipartBoundaryBegin 7106808 -MultipartBoundaryEnd 7106847 -MimeEntityBegin 7106847 -MimeEntityHeadersEnd 7107059 -Octets 597 -Lines 28 -MimeEntityEnd 7107656 -MultipartBoundaryBegin 7107656 -MultipartBoundaryEnd 7107696 -MimeEntityBegin 7107696 -MimeEntityHeadersEnd 7107970 -Octets 10723 -Lines 147 -MimeEntityEnd 7118693 -MultipartEndBoundaryBegin 7118693 -MultipartEndBoundaryEnd 7118734 -MultipartEpilogueBegin 7118734 -MultipartEpilogueEnd 7118734 -Octets 11926 -Lines 193 -MimeEntityEnd 7118734 -MimeMessageEnd 7118734 -MboxMarkerBegin 7118735 -MboxMarkerEnd 7118743 -MimeMessageBegin 7118743 -MimeEntityBegin 7118743 -MimeEntityHeadersEnd 7119038 -MimeMessageHeadersEnd 7119038 -MultipartPreambleBegin 7119038 -MultipartPreambleEnd 7119038 -MultipartBoundaryBegin 7119038 -MultipartBoundaryEnd 7119077 -MimeEntityBegin 7119077 -MimeEntityHeadersEnd 7119293 -Octets 601 -Lines 28 -MimeEntityEnd 7119894 -MultipartBoundaryBegin 7119894 -MultipartBoundaryEnd 7119934 -MimeEntityBegin 7119934 -MimeEntityHeadersEnd 7120109 -Octets 10723 -Lines 147 -MimeEntityEnd 7130832 -MultipartEndBoundaryBegin 7130832 -MultipartEndBoundaryEnd 7130873 -MultipartEpilogueBegin 7130873 -MultipartEpilogueEnd 7130873 -Octets 11835 -Lines 191 -MimeEntityEnd 7130873 -MimeMessageEnd 7130873 -MboxMarkerBegin 7130874 -MboxMarkerEnd 7130882 -MimeMessageBegin 7130882 -MimeEntityBegin 7130882 -MimeEntityHeadersEnd 7131177 -MimeMessageHeadersEnd 7131177 -MultipartPreambleBegin 7131177 -MultipartPreambleEnd 7131177 -MultipartBoundaryBegin 7131177 -MultipartBoundaryEnd 7131216 -MimeEntityBegin 7131216 -MimeEntityHeadersEnd 7131461 -Octets 631 -Lines 29 -MimeEntityEnd 7132092 -MultipartBoundaryBegin 7132092 -MultipartBoundaryEnd 7132132 -MimeEntityBegin 7132132 -MimeEntityHeadersEnd 7132437 -Octets 10723 -Lines 147 -MimeEntityEnd 7143160 -MultipartEndBoundaryBegin 7143160 -MultipartEndBoundaryEnd 7143201 -MultipartEpilogueBegin 7143201 -MultipartEpilogueEnd 7143201 -Octets 12024 -Lines 196 -MimeEntityEnd 7143201 -MimeMessageEnd 7143201 -MboxMarkerBegin 7143202 -MboxMarkerEnd 7143210 -MimeMessageBegin 7143210 -MimeEntityBegin 7143210 -MimeEntityHeadersEnd 7143505 -MimeMessageHeadersEnd 7143505 -MultipartPreambleBegin 7143505 -MultipartPreambleEnd 7143505 -MultipartBoundaryBegin 7143505 -MultipartBoundaryEnd 7143544 -MimeEntityBegin 7143544 -MimeEntityHeadersEnd 7143760 -Octets 645 -Lines 28 -MimeEntityEnd 7144405 -MultipartBoundaryBegin 7144405 -MultipartBoundaryEnd 7144445 -MimeEntityBegin 7144445 -MimeEntityHeadersEnd 7144620 -Octets 10723 -Lines 147 -MimeEntityEnd 7155343 -MultipartEndBoundaryBegin 7155343 -MultipartEndBoundaryEnd 7155384 -MultipartEpilogueBegin 7155384 -MultipartEpilogueEnd 7155384 -Octets 11879 -Lines 191 -MimeEntityEnd 7155384 -MimeMessageEnd 7155384 -MboxMarkerBegin 7155385 -MboxMarkerEnd 7155393 -MimeMessageBegin 7155393 -MimeEntityBegin 7155393 -MimeEntityHeadersEnd 7155688 -MimeMessageHeadersEnd 7155688 -MultipartPreambleBegin 7155688 -MultipartPreambleEnd 7155688 -MultipartBoundaryBegin 7155688 -MultipartBoundaryEnd 7155727 -MimeEntityBegin 7155727 -MimeEntityHeadersEnd 7155972 -Octets 670 -Lines 29 -MimeEntityEnd 7156642 -MultipartBoundaryBegin 7156642 -MultipartBoundaryEnd 7156682 -MimeEntityBegin 7156682 -MimeEntityHeadersEnd 7157018 -Octets 10723 -Lines 147 -MimeEntityEnd 7167741 -MultipartEndBoundaryBegin 7167741 -MultipartEndBoundaryEnd 7167782 -MultipartEpilogueBegin 7167782 -MultipartEpilogueEnd 7167782 -Octets 12094 -Lines 196 -MimeEntityEnd 7167782 -MimeMessageEnd 7167782 -MboxMarkerBegin 7167783 -MboxMarkerEnd 7167815 -MimeMessageBegin 7167815 -MimeEntityBegin 7167815 -MimeEntityHeadersEnd 7169049 -MimeMessageHeadersEnd 7169049 -MultipartPreambleBegin 7169049 -MultipartPreambleEnd 7169095 -MultipartBoundaryBegin 7169095 -MultipartBoundaryEnd 7169133 -MimeEntityBegin 7169133 -MimeEntityHeadersEnd 7169209 -Octets 27 -Lines 3 -MimeEntityEnd 7169236 -MultipartBoundaryBegin 7169236 -MultipartBoundaryEnd 7169275 -MimeEntityBegin 7169275 -MimeEntityHeadersEnd 7169365 -MimeMessageBegin 7169365 -MimeEntityBegin 7169365 -MimeEntityHeadersEnd 7170186 -MimeMessageHeadersEnd 7170186 -MultipartPreambleBegin 7170186 -MultipartPreambleEnd 7170187 -MultipartBoundaryBegin 7170187 -MultipartBoundaryEnd 7170226 -MimeEntityBegin 7170226 -MimeEntityHeadersEnd 7170302 -Octets 627 -Lines 16 -MimeEntityEnd 7170929 -MultipartBoundaryBegin 7170929 -MultipartBoundaryEnd 7170969 -MimeEntityBegin 7170969 -MimeEntityHeadersEnd 7171051 -MultipartPreambleBegin 7171051 -MultipartPreambleEnd 7171052 -MultipartBoundaryBegin 7171052 -MultipartBoundaryEnd 7171091 -MimeEntityBegin 7171091 -MimeEntityHeadersEnd 7171166 -Octets 850 -Lines 18 -MimeEntityEnd 7172016 -MultipartBoundaryBegin 7172016 -MultipartBoundaryEnd 7172056 -MimeEntityBegin 7172056 -MimeEntityHeadersEnd 7172240 -Octets 743967 -Lines 10192 -MimeEntityEnd 7916207 -MultipartEndBoundaryBegin 7916207 -MultipartEndBoundaryEnd 7916248 -MultipartEpilogueBegin 7916248 -MultipartEpilogueEnd 7916249 -Octets 745198 -Lines 10223 -MimeEntityEnd 7916249 -MultipartEndBoundaryBegin 7916249 -MultipartEndBoundaryEnd 7916290 -MultipartEpilogueBegin 7916290 -MultipartEpilogueEnd 7916293 -Octets 746107 -Lines 10252 -MimeEntityEnd 7916293 -MimeMessageEnd 7916293 -Octets 746928 -Lines 10268 -MimeEntityEnd 7916293 -MultipartEndBoundaryBegin 7916293 -MultipartEndBoundaryEnd 7916333 -MultipartEpilogueBegin 7916333 -MultipartEpilogueEnd 7916334 -Octets 747285 -Lines 10285 -MimeEntityEnd 7916334 -MimeMessageEnd 7916334 -MboxMarkerBegin 7916335 -MboxMarkerEnd 7916367 -MimeMessageBegin 7916367 -MimeEntityBegin 7916367 -MimeEntityHeadersEnd 7917631 -MimeMessageHeadersEnd 7917631 -MultipartPreambleBegin 7917631 -MultipartPreambleEnd 7917632 -MultipartBoundaryBegin 7917632 -MultipartBoundaryEnd 7917676 -MimeEntityBegin 7917676 -MimeEntityHeadersEnd 7917767 -Octets 2382 -Lines 50 -MimeEntityEnd 7920149 -MultipartBoundaryBegin 7920149 -MultipartBoundaryEnd 7920194 -MimeEntityBegin 7920194 -MimeEntityHeadersEnd 7920353 -Octets 6023 -Lines 79 -MimeEntityEnd 7926376 -MultipartBoundaryBegin 7926376 -MultipartBoundaryEnd 7926421 -MimeEntityBegin 7926421 -MimeEntityHeadersEnd 7926579 -Octets 12073 -Lines 157 -MimeEntityEnd 7938652 -MultipartBoundaryBegin 7938652 -MultipartBoundaryEnd 7938697 -MimeEntityBegin 7938697 -MimeEntityHeadersEnd 7938857 -Octets 21714 -Lines 282 -MimeEntityEnd 7960571 -MultipartBoundaryBegin 7960571 -MultipartBoundaryEnd 7960616 -MimeEntityBegin 7960616 -MimeEntityHeadersEnd 7960819 -Octets 3393 -Lines 45 -MimeEntityEnd 7964212 -MultipartEndBoundaryBegin 7964212 -MultipartEndBoundaryEnd 7964258 -MultipartEpilogueBegin 7964258 -MultipartEpilogueEnd 7964259 -Octets 46628 -Lines 649 -MimeEntityEnd 7964259 -MimeMessageEnd 7964259 -MboxMarkerBegin 7964260 -MboxMarkerEnd 7964268 -MimeMessageBegin 7964268 -MimeEntityBegin 7964268 -MimeEntityHeadersEnd 7965009 -MimeMessageHeadersEnd 7965009 -Octets 544616 -Lines 7474 -MimeEntityEnd 8509625 -MimeMessageEnd 8509625 -MboxMarkerBegin 8509626 -MboxMarkerEnd 8509634 -MimeMessageBegin 8509634 -MimeEntityBegin 8509634 -MimeEntityHeadersEnd 8510545 -MimeMessageHeadersEnd 8510545 -MultipartPreambleBegin 8510545 -MultipartPreambleEnd 8510546 -MultipartBoundaryBegin 8510546 -MultipartBoundaryEnd 8510554 -MimeEntityBegin 8510554 -MimeEntityHeadersEnd 8510583 -Octets 2530 -Lines 96 -MimeEntityEnd 8513113 -MultipartEndBoundaryBegin 8513113 -MultipartEndBoundaryEnd 8513123 -MultipartEpilogueBegin 8513123 -MultipartEpilogueEnd 8513124 -Octets 2579 -Lines 102 -MimeEntityEnd 8513124 -MimeMessageEnd 8513124 -MboxMarkerBegin 8513125 -MboxMarkerEnd 8513157 -MimeMessageBegin 8513157 -MimeEntityBegin 8513157 -MimeEntityHeadersEnd 8513751 -MimeMessageHeadersEnd 8513751 -MultipartPreambleBegin 8513751 -MultipartPreambleEnd 8514031 -MultipartBoundaryBegin 8514031 -MultipartBoundaryEnd 8514048 -MimeEntityBegin 8514048 -MimeEntityHeadersEnd 8514093 -Octets 1082 -Lines 26 -MimeEntityEnd 8515175 -MultipartBoundaryBegin 8515175 -MultipartBoundaryEnd 8515193 -MimeEntityBegin 8515193 -MimeEntityHeadersEnd 8515234 -Octets 284 -Lines 9 -MimeEntityEnd 8515518 -MultipartEndBoundaryBegin 8515518 -MultipartEndBoundaryEnd 8515537 -MultipartEpilogueBegin 8515537 -MultipartEpilogueEnd 8515537 -Octets 1786 -Lines 51 -MimeEntityEnd 8515537 -MimeMessageEnd 8515537 -MboxMarkerBegin 8515538 -MboxMarkerEnd 8515546 -MimeMessageBegin 8515546 -MimeEntityBegin 8515546 -MimeEntityHeadersEnd 8516708 -MimeMessageHeadersEnd 8516708 -Octets 1383 -Lines 40 -MimeEntityEnd 8518091 -MimeMessageEnd 8518091 -MboxMarkerBegin 8518092 -MboxMarkerEnd 8518100 -MimeMessageBegin 8518100 -MimeEntityBegin 8518100 -MimeEntityHeadersEnd 8518733 -MimeMessageHeadersEnd 8518733 -Octets 974 -Lines 27 -MimeEntityEnd 8519707 -MimeMessageEnd 8519707 -MboxMarkerBegin 8519708 -MboxMarkerEnd 8519716 -MimeMessageBegin 8519716 -MimeEntityBegin 8519716 -MimeEntityHeadersEnd 8520478 -MimeMessageHeadersEnd 8520478 -MultipartPreambleBegin 8520478 -MultipartPreambleEnd 8520633 -MultipartBoundaryBegin 8520633 -MultipartBoundaryEnd 8520673 -MimeEntityBegin 8520673 -MimeEntityHeadersEnd 8520717 -Octets 817 -Lines 15 -MimeEntityEnd 8521534 -MultipartBoundaryBegin 8521534 -MultipartBoundaryEnd 8521575 -MimeEntityBegin 8521575 -MimeEntityHeadersEnd 8521660 -MultipartPreambleBegin 8521660 -MultipartPreambleEnd 8521660 -MultipartBoundaryBegin 8521660 -MultipartBoundaryEnd 8521702 -MimeEntityBegin 8521702 -MimeEntityHeadersEnd 8521793 -Octets 491 -Lines 10 -MimeEntityEnd 8522284 -MultipartBoundaryBegin 8522284 -MultipartBoundaryEnd 8522327 -MimeEntityBegin 8522327 -MimeEntityHeadersEnd 8522513 -MimeMessageBegin 8522513 -MimeEntityBegin 8522513 -MimeEntityHeadersEnd 8522540 -MimeMessageHeadersEnd 8522540 -Octets 2 -Lines 2 -MimeEntityEnd 8522542 -MimeMessageEnd 8522542 -Octets 29 -Lines 4 -MimeEntityEnd 8522542 -MultipartBoundaryBegin 8522542 -MultipartBoundaryEnd 8522585 -MimeEntityBegin 8522585 -MimeEntityHeadersEnd 8522673 -Octets 3 -Lines 2 -MimeEntityEnd 8522676 -MultipartBoundaryBegin 8522676 -MultipartBoundaryEnd 8522719 -MimeEntityBegin 8522719 -MimeEntityHeadersEnd 8522920 -MimeMessageBegin 8522920 -MimeEntityBegin 8522920 -MimeEntityHeadersEnd 8522945 -MimeMessageHeadersEnd 8522945 -Octets 2 -Lines 2 -MimeEntityEnd 8522947 -MimeMessageEnd 8522947 -Octets 27 -Lines 4 -MimeEntityEnd 8522947 -MultipartBoundaryBegin 8522947 -MultipartBoundaryEnd 8522990 -MimeEntityBegin 8522990 -MimeEntityHeadersEnd 8523081 -Octets 222 -Lines 7 -MimeEntityEnd 8523303 -MultipartEndBoundaryBegin 8523303 -MultipartEndBoundaryEnd 8523347 -MultipartEpilogueBegin 8523347 -MultipartEpilogueEnd 8523348 -Octets 1688 -Lines 61 -MimeEntityEnd 8523348 -MultipartEndBoundaryBegin 8523348 -MultipartEndBoundaryEnd 8523390 -MultipartEpilogueBegin 8523390 -MultipartEpilogueEnd 8523391 -Octets 2913 -Lines 89 -MimeEntityEnd 8523391 -MimeMessageEnd 8523391 -MboxMarkerBegin 8523392 -MboxMarkerEnd 8523400 -MimeMessageBegin 8523400 -MimeEntityBegin 8523400 -MimeEntityHeadersEnd 8524214 -MimeMessageHeadersEnd 8524214 -Octets 1386 -Lines 42 -MimeEntityEnd 8525600 -MimeMessageEnd 8525600 -MboxMarkerBegin 8525601 -MboxMarkerEnd 8525609 -MimeMessageBegin 8525609 -MimeEntityBegin 8525609 -MimeEntityHeadersEnd 8525761 -MimeMessageHeadersEnd 8525761 -Octets 4671 -Lines 64 -MimeEntityEnd 8530432 -MimeMessageEnd 8530432 -MboxMarkerBegin 8530433 -MboxMarkerEnd 8530441 -MimeMessageBegin 8530441 -MimeEntityBegin 8530441 -MimeEntityHeadersEnd 8532184 -MimeMessageHeadersEnd 8532184 -MultipartPreambleBegin 8532184 -MultipartPreambleEnd 8532339 -MultipartBoundaryBegin 8532339 -MultipartBoundaryEnd 8532379 -MimeEntityBegin 8532379 -MimeEntityHeadersEnd 8532423 -Octets 1667 -Lines 38 -MimeEntityEnd 8534090 -MultipartBoundaryBegin 8534090 -MultipartBoundaryEnd 8534131 -MimeEntityBegin 8534131 -MimeEntityHeadersEnd 8534216 -MultipartPreambleBegin 8534216 -MultipartPreambleEnd 8534216 -MultipartBoundaryBegin 8534216 -MultipartBoundaryEnd 8534258 -MimeEntityBegin 8534258 -MimeEntityHeadersEnd 8534349 -Octets 557 -Lines 14 -MimeEntityEnd 8534906 -MultipartBoundaryBegin 8534906 -MultipartBoundaryEnd 8534949 -MimeEntityBegin 8534949 -MimeEntityHeadersEnd 8535010 -Octets 872 -Lines 12 -MimeEntityEnd 8535882 -MultipartBoundaryBegin 8535882 -MultipartBoundaryEnd 8535925 -MimeEntityBegin 8535925 -MimeEntityHeadersEnd 8536016 -Octets 46 -Lines 5 -MimeEntityEnd 8536062 -MultipartBoundaryBegin 8536062 -MultipartBoundaryEnd 8536105 -MimeEntityBegin 8536105 -MimeEntityHeadersEnd 8536166 -Octets 872 -Lines 12 -MimeEntityEnd 8537038 -MultipartBoundaryBegin 8537038 -MultipartBoundaryEnd 8537081 -MimeEntityBegin 8537081 -MimeEntityHeadersEnd 8537172 -Octets 46 -Lines 5 -MimeEntityEnd 8537218 -MultipartBoundaryBegin 8537218 -MultipartBoundaryEnd 8537261 -MimeEntityBegin 8537261 -MimeEntityHeadersEnd 8537322 -Octets 872 -Lines 12 -MimeEntityEnd 8538194 -MultipartBoundaryBegin 8538194 -MultipartBoundaryEnd 8538237 -MimeEntityBegin 8538237 -MimeEntityHeadersEnd 8538328 -Octets 40 -Lines 5 -MimeEntityEnd 8538368 -MultipartBoundaryBegin 8538368 -MultipartBoundaryEnd 8538411 -MimeEntityBegin 8538411 -MimeEntityHeadersEnd 8538472 -Octets 224 -Lines 4 -MimeEntityEnd 8538696 -MultipartBoundaryBegin 8538696 -MultipartBoundaryEnd 8538739 -MimeEntityBegin 8538739 -MimeEntityHeadersEnd 8538830 -Octets 64 -Lines 5 -MimeEntityEnd 8538894 -MultipartBoundaryBegin 8538894 -MultipartBoundaryEnd 8538937 -MimeEntityBegin 8538937 -MimeEntityHeadersEnd 8538998 -Octets 224 -Lines 4 -MimeEntityEnd 8539222 -MultipartBoundaryBegin 8539222 -MultipartBoundaryEnd 8539265 -MimeEntityBegin 8539265 -MimeEntityHeadersEnd 8539356 -Octets 44 -Lines 5 -MimeEntityEnd 8539400 -MultipartBoundaryBegin 8539400 -MultipartBoundaryEnd 8539443 -MimeEntityBegin 8539443 -MimeEntityHeadersEnd 8539504 -Octets 224 -Lines 4 -MimeEntityEnd 8539728 -MultipartBoundaryBegin 8539728 -MultipartBoundaryEnd 8539771 -MimeEntityBegin 8539771 -MimeEntityHeadersEnd 8539862 -Octets 292 -Lines 11 -MimeEntityEnd 8540154 -MultipartBoundaryBegin 8540154 -MultipartBoundaryEnd 8540197 -MimeEntityBegin 8540197 -MimeEntityHeadersEnd 8540258 -Octets 872 -Lines 12 -MimeEntityEnd 8541130 -MultipartBoundaryBegin 8541130 -MultipartBoundaryEnd 8541173 -MimeEntityBegin 8541173 -MimeEntityHeadersEnd 8541264 -Octets 40 -Lines 4 -MimeEntityEnd 8541304 -MultipartBoundaryBegin 8541304 -MultipartBoundaryEnd 8541347 -MimeEntityBegin 8541347 -MimeEntityHeadersEnd 8541408 -Octets 1915 -Lines 27 -MimeEntityEnd 8543323 -MultipartBoundaryBegin 8543323 -MultipartBoundaryEnd 8543366 -MimeEntityBegin 8543366 -MimeEntityHeadersEnd 8543457 -Octets 10 -Lines 1 -MimeEntityEnd 8543467 -MultipartEndBoundaryBegin 8543467 -MultipartEndBoundaryEnd 8543511 -MultipartEpilogueBegin 8543511 -MultipartEpilogueEnd 8543512 -Octets 9296 -Lines 228 -MimeEntityEnd 8543512 -MultipartEndBoundaryBegin 8543512 -MultipartEndBoundaryEnd 8543554 -MultipartEpilogueBegin 8543554 -MultipartEpilogueEnd 8543555 -Octets 11371 -Lines 279 -MimeEntityEnd 8543555 -MimeMessageEnd 8543555 -MboxMarkerBegin 8543556 -MboxMarkerEnd 8543564 -MimeMessageBegin 8543564 -MimeEntityBegin 8543564 -MimeEntityHeadersEnd 8544292 -MimeMessageHeadersEnd 8544292 -MultipartPreambleBegin 8544292 -MultipartPreambleEnd 8544447 -MultipartBoundaryBegin 8544447 -MultipartBoundaryEnd 8544487 -MimeEntityBegin 8544487 -MimeEntityHeadersEnd 8544531 -Octets 627 -Lines 12 -MimeEntityEnd 8545158 -MultipartBoundaryBegin 8545158 -MultipartBoundaryEnd 8545199 -MimeEntityBegin 8545199 -MimeEntityHeadersEnd 8545284 -MultipartPreambleBegin 8545284 -MultipartPreambleEnd 8545284 -MultipartBoundaryBegin 8545284 -MultipartBoundaryEnd 8545326 -MimeEntityBegin 8545326 -MimeEntityHeadersEnd 8545417 -Octets 533 -Lines 8 -MimeEntityEnd 8545950 -MultipartBoundaryBegin 8545950 -MultipartBoundaryEnd 8545993 -MimeEntityBegin 8545993 -MimeEntityHeadersEnd 8546101 -Octets 8585 -Lines 125 -MimeEntityEnd 8554686 -MultipartBoundaryBegin 8554686 -MultipartBoundaryEnd 8554729 -MimeEntityBegin 8554729 -MimeEntityHeadersEnd 8554820 -Octets 45 -Lines 3 -MimeEntityEnd 8554865 -MultipartEndBoundaryBegin 8554865 -MultipartEndBoundaryEnd 8554909 -MultipartEpilogueBegin 8554909 -MultipartEpilogueEnd 8554910 -Octets 9626 -Lines 153 -MimeEntityEnd 8554910 -MultipartEndBoundaryBegin 8554910 -MultipartEndBoundaryEnd 8554952 -MultipartEpilogueBegin 8554952 -MultipartEpilogueEnd 8554952 -Octets 10660 -Lines 178 -MimeEntityEnd 8554952 -MimeMessageEnd 8554952 -MboxMarkerBegin 8554953 -MboxMarkerEnd 8554961 -MimeMessageBegin 8554961 -MimeEntityBegin 8554961 -MimeEntityHeadersEnd 8555607 -MimeMessageHeadersEnd 8555607 -MultipartPreambleBegin 8555607 -MultipartPreambleEnd 8555608 -MultipartBoundaryBegin 8555608 -MultipartBoundaryEnd 8555657 -MimeEntityBegin 8555657 -MimeEntityHeadersEnd 8555747 -Octets 97 -Lines 6 -MimeEntityEnd 8555844 -MultipartBoundaryBegin 8555844 -MultipartBoundaryEnd 8555894 -MimeEntityBegin 8555894 -MimeEntityHeadersEnd 8556021 -Octets 78442 -Lines 1075 -MimeEntityEnd 8634463 -MultipartEndBoundaryBegin 8634463 -MultipartEndBoundaryEnd 8634514 -MultipartEpilogueBegin 8634514 -MultipartEpilogueEnd 8634515 -Octets 78908 -Lines 1093 -MimeEntityEnd 8634515 -MimeMessageEnd 8634515 -MboxMarkerBegin 8634516 -MboxMarkerEnd 8634524 -MimeMessageBegin 8634524 -MimeEntityBegin 8634524 -MimeEntityHeadersEnd 8635280 -MimeMessageHeadersEnd 8635280 -MultipartPreambleBegin 8635280 -MultipartPreambleEnd 8635435 -MultipartBoundaryBegin 8635435 -MultipartBoundaryEnd 8635475 -MimeEntityBegin 8635475 -MimeEntityHeadersEnd 8635519 -Octets 1350 -Lines 28 -MimeEntityEnd 8636869 -MultipartBoundaryBegin 8636869 -MultipartBoundaryEnd 8636910 -MimeEntityBegin 8636910 -MimeEntityHeadersEnd 8636995 -MultipartPreambleBegin 8636995 -MultipartPreambleEnd 8636995 -MultipartBoundaryBegin 8636995 -MultipartBoundaryEnd 8637037 -MimeEntityBegin 8637037 -MimeEntityHeadersEnd 8637128 -Octets 1139 -Lines 22 -MimeEntityEnd 8638267 -MultipartBoundaryBegin 8638267 -MultipartBoundaryEnd 8638310 -MimeEntityBegin 8638310 -MimeEntityHeadersEnd 8638408 -Octets 115243 -Lines 1579 -MimeEntityEnd 8753651 -MultipartBoundaryBegin 8753651 -MultipartBoundaryEnd 8753694 -MimeEntityBegin 8753694 -MimeEntityHeadersEnd 8753785 -Octets 123 -Lines 3 -MimeEntityEnd 8753908 -MultipartBoundaryBegin 8753908 -MultipartBoundaryEnd 8753951 -MimeEntityBegin 8753951 -MimeEntityHeadersEnd 8754050 -Octets 66281 -Lines 961 -MimeEntityEnd 8820331 -MultipartBoundaryBegin 8820331 -MultipartBoundaryEnd 8820374 -MimeEntityBegin 8820374 -MimeEntityHeadersEnd 8820462 -Octets 0 -Lines 0 -MimeEntityEnd 8820462 -MultipartEndBoundaryBegin 8820462 -MultipartEndBoundaryEnd 8820506 -MultipartEpilogueBegin 8820506 -MultipartEpilogueEnd 8820507 -Octets 183512 -Lines 2593 -MimeEntityEnd 8820507 -MultipartEndBoundaryBegin 8820507 -MultipartEndBoundaryEnd 8820549 -MultipartEpilogueBegin 8820549 -MultipartEpilogueEnd 8820549 -Octets 185269 -Lines 2634 -MimeEntityEnd 8820549 -MimeMessageEnd 8820549 -MboxMarkerBegin 8820550 -MboxMarkerEnd 8820558 -MimeMessageBegin 8820558 -MimeEntityBegin 8820558 -MimeEntityHeadersEnd 8821395 -MimeMessageHeadersEnd 8821395 -Octets 1733 -Lines 25 -MimeEntityEnd 8823128 -MimeMessageEnd 8823128 -MboxMarkerBegin 8823129 -MboxMarkerEnd 8823137 -MimeMessageBegin 8823137 -MimeEntityBegin 8823137 -MimeEntityHeadersEnd 8823767 -MimeMessageHeadersEnd 8823767 -MimeMessageBegin 8823767 -MimeEntityBegin 8823767 -MimeEntityHeadersEnd 8824250 -MimeMessageHeadersEnd 8824250 -Octets 875 -Lines 25 -MimeEntityEnd 8825125 -MimeMessageEnd 8825125 -Octets 1358 -Lines 38 -MimeEntityEnd 8825125 -MimeMessageEnd 8825125 -MboxMarkerBegin 8825126 -MboxMarkerEnd 8825134 -MimeMessageBegin 8825134 -MimeEntityBegin 8825134 -MimeEntityHeadersEnd 8825579 -MimeMessageHeadersEnd 8825579 -MultipartPreambleBegin 8825579 -MultipartPreambleEnd 8825579 -MultipartBoundaryBegin 8825579 -MultipartBoundaryEnd 8825588 -MimeEntityBegin 8825588 -MimeEntityHeadersEnd 8825589 -Octets 40 -Lines 1 -MimeEntityEnd 8825629 -MultipartBoundaryBegin 8825629 -MultipartBoundaryEnd 8825639 -MimeEntityBegin 8825639 -MimeEntityHeadersEnd 8825700 -Octets 91249 -Lines 1250 -MimeEntityEnd 8916949 -MultipartEndBoundaryBegin 8916949 -MultipartEndBoundaryEnd 8916960 -MultipartEpilogueBegin 8916960 -MultipartEpilogueEnd 8916963 -Octets 91384 -Lines 1261 -MimeEntityEnd 8916963 -MimeMessageEnd 8916963 -MboxMarkerBegin 8916964 -MboxMarkerEnd 8916972 -MimeMessageBegin 8916972 -MimeEntityBegin 8916972 -MimeEntityHeadersEnd 8917462 -MimeMessageHeadersEnd 8917462 -Octets 1142 -Lines 27 -MimeEntityEnd 8918604 -MimeMessageEnd 8918604 -MboxMarkerBegin 8918605 -MboxMarkerEnd 8918613 -MimeMessageBegin 8918613 -MimeEntityBegin 8918613 -MimeEntityHeadersEnd 8919753 -MimeMessageHeadersEnd 8919753 -MultipartPreambleBegin 8919753 -MultipartPreambleEnd 8919753 -MultipartBoundaryBegin 8919753 -MultipartBoundaryEnd 8919758 -MimeEntityBegin 8919758 -MimeEntityHeadersEnd 8919759 -Octets 540 -Lines 12 -MimeEntityEnd 8920299 -MultipartBoundaryBegin 8920299 -MultipartBoundaryEnd 8920305 -MimeEntityBegin 8920305 -MimeEntityHeadersEnd 8920421 -Octets 57641 -Lines 790 -MimeEntityEnd 8978062 -MultipartBoundaryBegin 8978062 -MultipartBoundaryEnd 8978068 -MimeEntityBegin 8978068 -MimeEntityHeadersEnd 8978069 -Octets 3783 -Lines 83 -MimeEntityEnd 8981852 -MultipartBoundaryBegin 8981852 -MultipartBoundaryEnd 8981858 -MimeEntityBegin 8981858 -MimeEntityHeadersEnd 8982012 -Octets 29635 -Lines 1010 -MimeEntityEnd 9011647 -MultipartBoundaryBegin 9011647 -MultipartBoundaryEnd 9011653 -MimeEntityBegin 9011653 -MimeEntityHeadersEnd 9011759 -Octets 716 -Lines 24 -MimeEntityEnd 9012475 -MultipartBoundaryBegin 9012475 -MultipartBoundaryEnd 9012481 -MimeEntityBegin 9012481 -MimeEntityHeadersEnd 9012598 -Octets 1264 -Lines 25 -MimeEntityEnd 9013862 -MultipartEndBoundaryBegin 9013862 -MultipartEndBoundaryEnd 9013869 -MultipartEpilogueBegin 9013869 -MultipartEpilogueEnd 9013870 -Octets 94117 -Lines 1970 -MimeEntityEnd 9013870 -MimeMessageEnd 9013870 -MboxMarkerBegin 9013871 -MboxMarkerEnd 9013903 -MimeMessageBegin 9013903 -MimeEntityBegin 9013903 -MimeEntityHeadersEnd 9015056 -MimeMessageHeadersEnd 9015056 -MultipartPreambleBegin 9015056 -MultipartPreambleEnd 9015056 -MultipartBoundaryBegin 9015056 -MultipartBoundaryEnd 9015073 -MimeEntityBegin 9015073 -MimeEntityHeadersEnd 9015074 -Octets 901 -Lines 20 -MimeEntityEnd 9015975 -MultipartBoundaryBegin 9015975 -MultipartBoundaryEnd 9015993 -MimeEntityBegin 9015993 -MimeEntityHeadersEnd 9016072 -Octets 748 -Lines 12 -MimeEntityEnd 9016820 -MultipartEndBoundaryBegin 9016820 -MultipartEndBoundaryEnd 9016839 -MultipartEpilogueBegin 9016839 -MultipartEpilogueEnd 9016840 -Octets 1784 -Lines 41 -MimeEntityEnd 9016840 -MimeMessageEnd 9016840 -MboxMarkerBegin 9016841 -MboxMarkerEnd 9016873 -MimeMessageBegin 9016873 -MimeEntityBegin 9016873 -MimeEntityHeadersEnd 9018015 -MimeMessageHeadersEnd 9018015 -MultipartPreambleBegin 9018015 -MultipartPreambleEnd 9018188 -MultipartBoundaryBegin 9018188 -MultipartBoundaryEnd 9018195 -MimeEntityBegin 9018195 -MimeEntityHeadersEnd 9018273 -Octets 741 -Lines 14 -MimeEntityEnd 9019014 -MultipartBoundaryBegin 9019014 -MultipartBoundaryEnd 9019022 -MimeEntityBegin 9019022 -MimeEntityHeadersEnd 9019200 -Octets 2215 -Lines 31 -MimeEntityEnd 9021415 -MultipartEndBoundaryBegin 9021415 -MultipartEndBoundaryEnd 9021424 -MultipartEpilogueBegin 9021424 -MultipartEpilogueEnd 9021424 -Octets 3409 -Lines 60 -MimeEntityEnd 9021424 -MimeMessageEnd 9021424 -MboxMarkerBegin 9021425 -MboxMarkerEnd 9021457 -MimeMessageBegin 9021457 -MimeEntityBegin 9021457 -MimeEntityHeadersEnd 9022594 -MimeMessageHeadersEnd 9022594 -MultipartPreambleBegin 9022594 -MultipartPreambleEnd 9022767 -MultipartBoundaryBegin 9022767 -MultipartBoundaryEnd 9022788 -MimeEntityBegin 9022788 -MimeEntityHeadersEnd 9022866 -Octets 2812 -Lines 47 -MimeEntityEnd 9025678 -MultipartBoundaryBegin 9025678 -MultipartBoundaryEnd 9025700 -MimeEntityBegin 9025700 -MimeEntityHeadersEnd 9025878 -Octets 2547 -Lines 35 -MimeEntityEnd 9028425 -MultipartEndBoundaryBegin 9028425 -MultipartEndBoundaryEnd 9028448 -MultipartEpilogueBegin 9028448 -MultipartEpilogueEnd 9028448 -Octets 5854 -Lines 97 -MimeEntityEnd 9028448 -MimeMessageEnd 9028448 -MboxMarkerBegin 9028449 -MboxMarkerEnd 9028457 -MimeMessageBegin 9028457 -MimeEntityBegin 9028457 -MimeEntityHeadersEnd 9028665 -MimeMessageHeadersEnd 9028665 -Octets 4193 -Lines 58 -MimeEntityEnd 9032858 -MimeMessageEnd 9032858 -MboxMarkerBegin 9032859 -MboxMarkerEnd 9032891 -MimeMessageBegin 9032891 -MimeEntityBegin 9032891 -MimeEntityHeadersEnd 9033791 -MimeMessageHeadersEnd 9033791 -MultipartPreambleBegin 9033791 -MultipartPreambleEnd 9033837 -MultipartBoundaryBegin 9033837 -MultipartBoundaryEnd 9033864 -MimeEntityBegin 9033864 -MimeEntityHeadersEnd 9033998 -Octets 10722 -Lines 147 -MimeEntityEnd 9044720 -MultipartBoundaryBegin 9044720 -MultipartBoundaryEnd 9044748 -MimeEntityBegin 9044748 -MimeEntityHeadersEnd 9044899 -Octets 4611 -Lines 64 -MimeEntityEnd 9049510 -MultipartEndBoundaryBegin 9049510 -MultipartEndBoundaryEnd 9049539 -MultipartEpilogueBegin 9049539 -MultipartEpilogueEnd 9049540 -Octets 15749 -Lines 224 -MimeEntityEnd 9049540 -MimeMessageEnd 9049540 -MboxMarkerBegin 9049541 -MboxMarkerEnd 9049573 -MimeMessageBegin 9049573 -MimeEntityBegin 9049573 -MimeEntityHeadersEnd 9050380 -MimeMessageHeadersEnd 9050380 -Octets 16761 -Lines 258 -MimeEntityEnd 9067141 -MimeMessageEnd 9067141 -MboxMarkerBegin 9067142 -MboxMarkerEnd 9067174 -MimeMessageBegin 9067174 -MimeEntityBegin 9067174 -MimeEntityHeadersEnd 9067986 -MimeMessageHeadersEnd 9067986 -Octets 24964 -Lines 385 -MimeEntityEnd 9092950 -MimeMessageEnd 9092950 -MboxMarkerBegin 9092951 -MboxMarkerEnd 9092983 -MimeMessageBegin 9092983 -MimeEntityBegin 9092983 -MimeEntityHeadersEnd 9093795 -MimeMessageHeadersEnd 9093795 -Octets 36131 -Lines 556 -MimeEntityEnd 9129926 -MimeMessageEnd 9129926 -MboxMarkerBegin 9129927 -MboxMarkerEnd 9129959 -MimeMessageBegin 9129959 -MimeEntityBegin 9129959 -MimeEntityHeadersEnd 9130774 -MimeMessageHeadersEnd 9130774 -Octets 51301 -Lines 790 -MimeEntityEnd 9182075 -MimeMessageEnd 9182075 -MboxMarkerBegin 9182076 -MboxMarkerEnd 9182108 -MimeMessageBegin 9182108 -MimeEntityBegin 9182108 -MimeEntityHeadersEnd 9183499 -MimeMessageHeadersEnd 9183499 -Octets 1431 -Lines 20 -MimeEntityEnd 9184930 -MimeMessageEnd 9184930 -MboxMarkerBegin 9184931 -MboxMarkerEnd 9184963 -MimeMessageBegin 9184963 -MimeEntityBegin 9184963 -MimeEntityHeadersEnd 9186316 -MimeMessageHeadersEnd 9186316 -MultipartPreambleBegin 9186316 -MultipartPreambleEnd 9186317 -MultipartBoundaryBegin 9186317 -MultipartBoundaryEnd 9186361 -MimeEntityBegin 9186361 -MimeEntityHeadersEnd 9186425 -Octets 107 -Lines 4 -MimeEntityEnd 9186532 -MultipartBoundaryBegin 9186532 -MultipartBoundaryEnd 9186577 -MimeEntityBegin 9186577 -MimeEntityHeadersEnd 9186728 -Octets 3933 -Lines 54 -MimeEntityEnd 9190661 -MultipartEndBoundaryBegin 9190661 -MultipartEndBoundaryEnd 9190707 -MultipartEpilogueBegin 9190707 -MultipartEpilogueEnd 9190708 -Octets 4392 -Lines 69 -MimeEntityEnd 9190708 -MimeMessageEnd 9190708 -MboxMarkerBegin 9190709 -MboxMarkerEnd 9190741 -MimeMessageBegin 9190741 -MimeEntityBegin 9190741 -MimeEntityHeadersEnd 9191951 -MimeMessageHeadersEnd 9191951 -Octets 3495 -Lines 55 -MimeEntityEnd 9195446 -MimeMessageEnd 9195446 -MboxMarkerBegin 9195447 -MboxMarkerEnd 9195479 -MimeMessageBegin 9195479 -MimeEntityBegin 9195479 -MimeEntityHeadersEnd 9196556 -MimeMessageHeadersEnd 9196556 -Octets 661 -Lines 10 -MimeEntityEnd 9197217 -MimeMessageEnd 9197217 -MboxMarkerBegin 9197218 -MboxMarkerEnd 9197226 -MimeMessageBegin 9197226 -MimeEntityBegin 9197226 -MimeEntityHeadersEnd 9197618 -MimeMessageHeadersEnd 9197618 -Octets 7620 -Lines 105 -MimeEntityEnd 9205238 -MimeMessageEnd 9205238 -MboxMarkerBegin 9205239 -MboxMarkerEnd 9205271 -MimeMessageBegin 9205271 -MimeEntityBegin 9205271 -MimeEntityHeadersEnd 9206054 -MimeMessageHeadersEnd 9206054 -MimeMessageBegin 9206054 -MimeEntityBegin 9206054 -MimeEntityHeadersEnd 9207434 -MimeMessageHeadersEnd 9207434 -Octets 1432 -Lines 20 -MimeEntityEnd 9208866 -MimeMessageEnd 9208866 -Octets 2812 -Lines 43 -MimeEntityEnd 9208866 -MimeMessageEnd 9208866 -MboxMarkerBegin 9208867 -MboxMarkerEnd 9208899 -MimeMessageBegin 9208899 -MimeEntityBegin 9208899 -MimeEntityHeadersEnd 9209609 -MimeMessageHeadersEnd 9209609 -MultipartPreambleBegin 9209609 -MultipartPreambleEnd 9209655 -MultipartBoundaryBegin 9209655 -MultipartBoundaryEnd 9209682 -MimeEntityBegin 9209682 -MimeEntityHeadersEnd 9209758 -Octets 15 -Lines 1 -MimeEntityEnd 9209773 -MultipartBoundaryBegin 9209773 -MultipartBoundaryEnd 9209801 -MimeEntityBegin 9209801 -MimeEntityHeadersEnd 9209955 -MimeMessageBegin 9209955 -MimeEntityBegin 9209955 -MimeEntityHeadersEnd 9211335 -MimeMessageHeadersEnd 9211335 -Octets 1432 -Lines 20 -MimeEntityEnd 9212767 -MimeMessageEnd 9212767 -Octets 2812 -Lines 43 -MimeEntityEnd 9212767 -MultipartEndBoundaryBegin 9212767 -MultipartEndBoundaryEnd 9212796 -MultipartEpilogueBegin 9212796 -MultipartEpilogueEnd 9212797 -Octets 3188 -Lines 58 -MimeEntityEnd 9212797 -MimeMessageEnd 9212797 -MboxMarkerBegin 9212798 -MboxMarkerEnd 9212830 -MimeMessageBegin 9212830 -MimeEntityBegin 9212830 -MimeEntityHeadersEnd 9213495 -MimeMessageHeadersEnd 9213495 -MultipartPreambleBegin 9213495 -MultipartPreambleEnd 9213555 -MultipartBoundaryBegin 9213555 -MultipartBoundaryEnd 9213596 -MimeEntityBegin 9213596 -MimeEntityHeadersEnd 9213672 -Octets 41 -Lines 2 -MimeEntityEnd 9213713 -MultipartBoundaryBegin 9213713 -MultipartBoundaryEnd 9213755 -MimeEntityBegin 9213755 -MimeEntityHeadersEnd 9213906 -Octets 5556 -Lines 77 -MimeEntityEnd 9219462 -MultipartEndBoundaryBegin 9219462 -MultipartEndBoundaryEnd 9219505 -MultipartEpilogueBegin 9219505 -MultipartEpilogueEnd 9219506 -Octets 6011 -Lines 91 -MimeEntityEnd 9219506 -MimeMessageEnd 9219506 -MboxMarkerBegin 9219507 -MboxMarkerEnd 9219539 -MimeMessageBegin 9219539 -MimeEntityBegin 9219539 -MimeEntityHeadersEnd 9220601 -MimeMessageHeadersEnd 9220601 -Octets 10236 -Lines 141 -MimeEntityEnd 9230837 -MimeMessageEnd 9230837 -MboxMarkerBegin 9230838 -MboxMarkerEnd 9230870 -MimeMessageBegin 9230870 -MimeEntityBegin 9230870 -MimeEntityHeadersEnd 9232246 -MimeMessageHeadersEnd 9232246 -MultipartPreambleBegin 9232246 -MultipartPreambleEnd 9232306 -MultipartBoundaryBegin 9232306 -MultipartBoundaryEnd 9232347 -MimeEntityBegin 9232347 -MimeEntityHeadersEnd 9232423 -Octets 611 -Lines 17 -MimeEntityEnd 9233034 -MultipartBoundaryBegin 9233034 -MultipartBoundaryEnd 9233076 -MimeEntityBegin 9233076 -MimeEntityHeadersEnd 9233227 -Octets 1788 -Lines 25 -MimeEntityEnd 9235015 -MultipartEndBoundaryBegin 9235015 -MultipartEndBoundaryEnd 9235058 -MultipartEpilogueBegin 9235058 -MultipartEpilogueEnd 9235059 -Octets 2813 -Lines 54 -MimeEntityEnd 9235059 -MimeMessageEnd 9235059 -MboxMarkerBegin 9235060 -MboxMarkerEnd 9235092 -MimeMessageBegin 9235092 -MimeEntityBegin 9235092 -MimeEntityHeadersEnd 9235640 -MimeMessageHeadersEnd 9235640 -Octets 523 -Lines 8 -MimeEntityEnd 9236163 -MimeMessageEnd 9236163 -MboxMarkerBegin 9236164 -MboxMarkerEnd 9236172 -MimeMessageBegin 9236172 -MimeEntityBegin 9236172 -MimeEntityHeadersEnd 9237488 -MimeMessageHeadersEnd 9237488 -MultipartPreambleBegin 9237488 -MultipartPreambleEnd 9237704 -MultipartBoundaryBegin 9237704 -MultipartBoundaryEnd 9237745 -MimeEntityBegin 9237745 -MimeEntityHeadersEnd 9237789 -Octets 588 -Lines 15 -MimeEntityEnd 9238377 -MultipartEndBoundaryBegin 9238377 -MultipartEndBoundaryEnd 9238420 -MultipartEpilogueBegin 9238420 -MultipartEpilogueEnd 9238420 -Octets 932 -Lines 24 -MimeEntityEnd 9238420 -MimeMessageEnd 9238420 -MboxMarkerBegin 9238421 -MboxMarkerEnd 9238429 -MimeMessageBegin 9238429 -MimeEntityBegin 9238429 -MimeEntityHeadersEnd 9239776 -MimeMessageHeadersEnd 9239776 -MultipartPreambleBegin 9239776 -MultipartPreambleEnd 9239992 -MultipartBoundaryBegin 9239992 -MultipartBoundaryEnd 9240033 -MimeEntityBegin 9240033 -MimeEntityHeadersEnd 9240077 -Octets 101 -Lines 6 -MimeEntityEnd 9240178 -MultipartBoundaryBegin 9240178 -MultipartBoundaryEnd 9240220 -MimeEntityBegin 9240220 -MimeEntityHeadersEnd 9240383 -MultipartPreambleBegin 9240383 -MultipartPreambleEnd 9240599 -MultipartBoundaryBegin 9240599 -MultipartBoundaryEnd 9240638 -MimeEntityBegin 9240638 -MimeEntityHeadersEnd 9240745 -Octets 91 -Lines 4 -MimeEntityEnd 9240836 -MultipartBoundaryBegin 9240836 -MultipartBoundaryEnd 9240876 -MimeEntityBegin 9240876 -MimeEntityHeadersEnd 9240969 -MimeMessageBegin 9240969 -MimeEntityBegin 9240969 -MimeEntityHeadersEnd 9242136 -MimeMessageHeadersEnd 9242136 -Octets 205 -Lines 5 -MimeEntityEnd 9242341 -MimeMessageEnd 9242341 -Octets 1372 -Lines 34 -MimeEntityEnd 9242341 -MultipartBoundaryBegin 9242341 -MultipartBoundaryEnd 9242381 -MimeEntityBegin 9242381 -MimeEntityHeadersEnd 9242547 -Octets 479 -Lines 11 -MimeEntityEnd 9243026 -MultipartEndBoundaryBegin 9243026 -MultipartEndBoundaryEnd 9243067 -MultipartEpilogueBegin 9243067 -MultipartEpilogueEnd 9243067 -Octets 2684 -Lines 70 -MimeEntityEnd 9243067 -MultipartBoundaryBegin 9243067 -MultipartBoundaryEnd 9243109 -MimeEntityBegin 9243109 -MimeEntityHeadersEnd 9243321 -Octets 5223 -Lines 72 -MimeEntityEnd 9248544 -MultipartEndBoundaryBegin 9248544 -MultipartEndBoundaryEnd 9248587 -MultipartEpilogueBegin 9248587 -MultipartEpilogueEnd 9248589 -Octets 8813 -Lines 169 -MimeEntityEnd 9248589 -MimeMessageEnd 9248589 -MboxMarkerBegin 9248590 -MboxMarkerEnd 9248622 -MimeMessageBegin 9248622 -MimeEntityBegin 9248622 -MimeEntityHeadersEnd 9249837 -MimeMessageHeadersEnd 9249837 -Octets 2882 -Lines 38 -MimeEntityEnd 9252719 -MimeMessageEnd 9252719 -MboxMarkerBegin 9252720 -MboxMarkerEnd 9252752 -MimeMessageBegin 9252752 -MimeEntityBegin 9252752 -MimeEntityHeadersEnd 9253910 -MimeMessageHeadersEnd 9253910 -Octets 2122 -Lines 30 -MimeEntityEnd 9256032 -MimeMessageEnd 9256032 -MboxMarkerBegin 9256033 -MboxMarkerEnd 9256065 -MimeMessageBegin 9256065 -MimeEntityBegin 9256065 -MimeEntityHeadersEnd 9257143 -MimeMessageHeadersEnd 9257143 -MultipartPreambleBegin 9257143 -MultipartPreambleEnd 9257144 -MultipartBoundaryBegin 9257144 -MultipartBoundaryEnd 9257176 -MimeEntityBegin 9257176 -MimeEntityHeadersEnd 9257240 -Octets 0 -Lines 0 -MimeEntityEnd 9257240 -MultipartBoundaryBegin 9257240 -MultipartBoundaryEnd 9257273 -MimeEntityBegin 9257273 -MimeEntityHeadersEnd 9257352 -Octets 2713 -Lines 42 -MimeEntityEnd 9260065 -MultipartEndBoundaryBegin 9260065 -MultipartEndBoundaryEnd 9260099 -MultipartEpilogueBegin 9260099 -MultipartEpilogueEnd 9260100 -Octets 2957 -Lines 53 -MimeEntityEnd 9260100 -MimeMessageEnd 9260100 -MboxMarkerBegin 9260101 -MboxMarkerEnd 9260133 -MimeMessageBegin 9260133 -MimeEntityBegin 9260133 -MimeEntityHeadersEnd 9261170 -MimeMessageHeadersEnd 9261170 -MultipartPreambleBegin 9261170 -MultipartPreambleEnd 9261171 -MultipartBoundaryBegin 9261171 -MultipartBoundaryEnd 9261211 -MimeEntityBegin 9261211 -MimeEntityHeadersEnd 9261289 -Octets 453 -Lines 14 -MimeEntityEnd 9261742 -MultipartBoundaryBegin 9261742 -MultipartBoundaryEnd 9261783 -MimeEntityBegin 9261783 -MimeEntityHeadersEnd 9261858 -Octets 811 -Lines 27 -MimeEntityEnd 9262669 -MultipartBoundaryBegin 9262669 -MultipartBoundaryEnd 9262710 -MimeEntityBegin 9262710 -MimeEntityHeadersEnd 9262807 -Octets 1200 -Lines 16 -MimeEntityEnd 9264007 -MultipartEndBoundaryBegin 9264007 -MultipartEndBoundaryEnd 9264049 -MultipartEpilogueBegin 9264049 -MultipartEpilogueEnd 9264050 -Octets 2880 -Lines 72 -MimeEntityEnd 9264050 -MimeMessageEnd 9264050 -MboxMarkerBegin 9264051 -MboxMarkerEnd 9264083 -MimeMessageBegin 9264083 -MimeEntityBegin 9264083 -MimeEntityHeadersEnd 9265158 -MimeMessageHeadersEnd 9265158 -MultipartPreambleBegin 9265158 -MultipartPreambleEnd 9265159 -MultipartBoundaryBegin 9265159 -MultipartBoundaryEnd 9265201 -MimeEntityBegin 9265201 -MimeEntityHeadersEnd 9265271 -Octets 152 -Lines 7 -MimeEntityEnd 9265423 -MultipartBoundaryBegin 9265423 -MultipartBoundaryEnd 9265466 -MimeEntityBegin 9265466 -MimeEntityHeadersEnd 9265545 -Octets 4096 -Lines 57 -MimeEntityEnd 9269641 -MultipartEndBoundaryBegin 9269641 -MultipartEndBoundaryEnd 9269685 -MultipartEpilogueBegin 9269685 -MultipartEpilogueEnd 9269686 -Octets 4528 -Lines 75 -MimeEntityEnd 9269686 -MimeMessageEnd 9269686 -MboxMarkerBegin 9269687 -MboxMarkerEnd 9269695 -MimeMessageBegin 9269695 -MimeEntityBegin 9269695 -MimeEntityHeadersEnd 9270246 -MimeMessageHeadersEnd 9270246 -MultipartPreambleBegin 9270246 -MultipartPreambleEnd 9270247 -MultipartBoundaryBegin 9270247 -MultipartBoundaryEnd 9270290 -MimeEntityBegin 9270290 -MimeEntityHeadersEnd 9270354 -Octets 155 -Lines 4 -MimeEntityEnd 9270509 -MultipartBoundaryBegin 9270509 -MultipartBoundaryEnd 9270553 -MimeEntityBegin 9270553 -MimeEntityHeadersEnd 9270704 -Octets 3917 -Lines 54 -MimeEntityEnd 9274621 -MultipartEndBoundaryBegin 9274621 -MultipartEndBoundaryEnd 9274666 -MultipartEpilogueBegin 9274666 -MultipartEpilogueEnd 9274666 -Octets 4420 -Lines 69 -MimeEntityEnd 9274666 -MimeMessageEnd 9274666 -MboxMarkerBegin 9274667 -MboxMarkerEnd 9274699 -MimeMessageBegin 9274699 -MimeEntityBegin 9274699 -MimeEntityHeadersEnd 9275863 -MimeMessageHeadersEnd 9275863 -MultipartPreambleBegin 9275863 -MultipartPreambleEnd 9276000 -MultipartBoundaryBegin 9276000 -MultipartBoundaryEnd 9276040 -MimeEntityBegin 9276040 -MimeEntityHeadersEnd 9276118 -Octets 72 -Lines 5 -MimeEntityEnd 9276190 -MultipartBoundaryBegin 9276190 -MultipartBoundaryEnd 9276231 -MimeEntityBegin 9276231 -MimeEntityHeadersEnd 9276326 -Octets 3559 -Lines 47 -MimeEntityEnd 9279885 -MultipartEndBoundaryBegin 9279885 -MultipartEndBoundaryEnd 9279927 -MultipartEpilogueBegin 9279927 -MultipartEpilogueEnd 9279928 -Octets 4065 -Lines 66 -MimeEntityEnd 9279928 -MimeMessageEnd 9279928 -MboxMarkerBegin 9279929 -MboxMarkerEnd 9279961 -MimeMessageBegin 9279961 -MimeEntityBegin 9279961 -MimeEntityHeadersEnd 9281063 -MimeMessageHeadersEnd 9281063 -MultipartPreambleBegin 9281063 -MultipartPreambleEnd 9281064 -MultipartBoundaryBegin 9281064 -MultipartBoundaryEnd 9281097 -MimeEntityBegin 9281097 -MimeEntityHeadersEnd 9281175 -Octets 74 -Lines 5 -MimeEntityEnd 9281249 -MultipartBoundaryBegin 9281249 -MultipartBoundaryEnd 9281283 -MimeEntityBegin 9281283 -MimeEntityHeadersEnd 9281362 -Octets 3717 -Lines 58 -MimeEntityEnd 9285079 -MultipartEndBoundaryBegin 9285079 -MultipartEndBoundaryEnd 9285114 -MultipartEpilogueBegin 9285114 -MultipartEpilogueEnd 9285114 -Octets 4051 -Lines 73 -MimeEntityEnd 9285114 -MimeMessageEnd 9285114 -MboxMarkerBegin 9285115 -MboxMarkerEnd 9285147 -MimeMessageBegin 9285147 -MimeEntityBegin 9285147 -MimeEntityHeadersEnd 9286275 -MimeMessageHeadersEnd 9286275 -MultipartPreambleBegin 9286275 -MultipartPreambleEnd 9286388 -MultipartBoundaryBegin 9286388 -MultipartBoundaryEnd 9286412 -MimeEntityBegin 9286412 -MimeEntityHeadersEnd 9286451 -Octets 188 -Lines 6 -MimeEntityEnd 9286639 -MultipartBoundaryBegin 9286639 -MultipartBoundaryEnd 9286664 -MimeEntityBegin 9286664 -MimeEntityHeadersEnd 9286694 -MimeMessageBegin 9286694 -MimeEntityBegin 9286694 -MimeEntityHeadersEnd 9287500 -MimeMessageHeadersEnd 9287500 -Octets 11 -Lines 1 -MimeEntityEnd 9287511 -MimeMessageEnd 9287511 -Octets 817 -Lines 16 -MimeEntityEnd 9287511 -MultipartEndBoundaryBegin 9287511 -MultipartEndBoundaryEnd 9287537 -MultipartEpilogueBegin 9287537 -MultipartEpilogueEnd 9287538 -Octets 1263 -Lines 34 -MimeEntityEnd 9287538 -MimeMessageEnd 9287538 -MboxMarkerBegin 9287539 -MboxMarkerEnd 9287585 -MimeMessageBegin 9287585 -MimeEntityBegin 9287585 -MimeEntityHeadersEnd 9287750 -MimeMessageHeadersEnd 9287750 -Octets 34494 -Lines 592 -MimeEntityEnd 9322244 -MimeMessageEnd 9322244 -MboxMarkerBegin 9322245 -MboxMarkerEnd 9322291 -MimeMessageBegin 9322291 -MimeEntityBegin 9322291 -MimeEntityHeadersEnd 9322449 -MimeMessageHeadersEnd 9322449 -Octets 34494 -Lines 592 -MimeEntityEnd 9356943 -MimeMessageEnd 9356943 -MboxMarkerBegin 9356944 -MboxMarkerEnd 9356952 -MimeMessageBegin 9356952 -MimeEntityBegin 9356952 -MimeEntityHeadersEnd 9357549 -MimeMessageHeadersEnd 9357549 -Octets 1400 -Lines 39 -MimeEntityEnd 9358949 -MimeMessageEnd 9358949 -MboxMarkerBegin 9358950 -MboxMarkerEnd 9358958 -MimeMessageBegin 9358958 -MimeEntityBegin 9358958 -MimeEntityHeadersEnd 9359858 -MimeMessageHeadersEnd 9359858 -MultipartPreambleBegin 9359858 -MultipartPreambleEnd 9359858 -MultipartBoundaryBegin 9359858 -MultipartBoundaryEnd 9359897 -MimeEntityBegin 9359897 -MimeEntityHeadersEnd 9359923 -Octets 345 -Lines 10 -MimeEntityEnd 9360268 -MultipartBoundaryBegin 9360268 -MultipartBoundaryEnd 9360308 -MimeEntityBegin 9360308 -MimeEntityHeadersEnd 9360401 -Octets 241569 -Lines 3961 -MimeEntityEnd 9601970 -MultipartEndBoundaryBegin 9601970 -MultipartEndBoundaryEnd 9602011 -MultipartEpilogueBegin 9602011 -MultipartEpilogueEnd 9602012 -Octets 242154 -Lines 3982 -MimeEntityEnd 9602012 -MimeMessageEnd 9602012 -MboxMarkerBegin 9602013 -MboxMarkerEnd 9602021 -MimeMessageBegin 9602021 -MimeEntityBegin 9602021 -MimeEntityHeadersEnd 9602615 -MimeMessageHeadersEnd 9602615 -MultipartPreambleBegin 9602615 -MultipartPreambleEnd 9602649 -MultipartBoundaryBegin 9602649 -MultipartBoundaryEnd 9602676 -MimeEntityBegin 9602676 -MimeEntityHeadersEnd 9602835 -Octets 78289 -Lines 406 -MimeEntityEnd 9681124 -MultipartEndBoundaryBegin 9681124 -MultipartEndBoundaryEnd 9681153 -MultipartEpilogueBegin 9681153 -MultipartEpilogueEnd 9681155 -Octets 78540 -Lines 416 -MimeEntityEnd 9681155 -MimeMessageEnd 9681155 -MboxMarkerBegin 9681156 -MboxMarkerEnd 9681164 -MimeMessageBegin 9681164 -MimeEntityBegin 9681164 -MimeEntityHeadersEnd 9681316 -MimeMessageHeadersEnd 9681316 -Octets 3560 -Lines 49 -MimeEntityEnd 9684876 -MimeMessageEnd 9684876 -MboxMarkerBegin 9684877 -MboxMarkerEnd 9684885 -MimeMessageBegin 9684885 -MimeEntityBegin 9684885 -MimeEntityHeadersEnd 9685657 -MimeMessageHeadersEnd 9685657 -MultipartPreambleBegin 9685657 -MultipartPreambleEnd 9685812 -MultipartBoundaryBegin 9685812 -MultipartBoundaryEnd 9685852 -MimeEntityBegin 9685852 -MimeEntityHeadersEnd 9685896 -Octets 414 -Lines 7 -MimeEntityEnd 9686310 -MultipartBoundaryBegin 9686310 -MultipartBoundaryEnd 9686351 -MimeEntityBegin 9686351 -MimeEntityHeadersEnd 9686436 -MultipartPreambleBegin 9686436 -MultipartPreambleEnd 9686436 -MultipartBoundaryBegin 9686436 -MultipartBoundaryEnd 9686478 -MimeEntityBegin 9686478 -MimeEntityHeadersEnd 9686569 -Octets 71 -Lines 1 -MimeEntityEnd 9686640 -MultipartBoundaryBegin 9686640 -MultipartBoundaryEnd 9686683 -MimeEntityBegin 9686683 -MimeEntityHeadersEnd 9686782 -Octets 10697 -Lines 157 -MimeEntityEnd 9697479 -MultipartBoundaryBegin 9697479 -MultipartBoundaryEnd 9697522 -MimeEntityBegin 9697522 -MimeEntityHeadersEnd 9697613 -Octets 64 -Lines 2 -MimeEntityEnd 9697677 -MultipartBoundaryBegin 9697677 -MultipartBoundaryEnd 9697720 -MimeEntityBegin 9697720 -MimeEntityHeadersEnd 9697813 -Octets 5903 -Lines 87 -MimeEntityEnd 9703716 -MultipartBoundaryBegin 9703716 -MultipartBoundaryEnd 9703759 -MimeEntityBegin 9703759 -MimeEntityHeadersEnd 9703850 -Octets 33 -Lines 2 -MimeEntityEnd 9703883 -MultipartBoundaryBegin 9703883 -MultipartBoundaryEnd 9703926 -MimeEntityBegin 9703926 -MimeEntityHeadersEnd 9704027 -Octets 11646 -Lines 170 -MimeEntityEnd 9715673 -MultipartBoundaryBegin 9715673 -MultipartBoundaryEnd 9715716 -MimeEntityBegin 9715716 -MimeEntityHeadersEnd 9715807 -Octets 31 -Lines 2 -MimeEntityEnd 9715838 -MultipartEndBoundaryBegin 9715838 -MultipartEndBoundaryEnd 9715882 -MultipartEpilogueBegin 9715882 -MultipartEpilogueEnd 9715883 -Octets 29447 -Lines 460 -MimeEntityEnd 9715883 -MultipartEndBoundaryBegin 9715883 -MultipartEndBoundaryEnd 9715925 -MultipartEpilogueBegin 9715925 -MultipartEpilogueEnd 9715925 -Octets 30268 -Lines 480 -MimeEntityEnd 9715925 -MimeMessageEnd 9715925 -MboxMarkerBegin 9715926 -MboxMarkerEnd 9715934 -MimeMessageBegin 9715934 -MimeEntityBegin 9715934 -MimeEntityHeadersEnd 9715990 -MimeMessageHeadersEnd 9715990 -Octets 1208 -Lines 28 -MimeEntityEnd 9717198 -MimeMessageEnd 9717198 -MboxMarkerBegin 9717199 -MboxMarkerEnd 9717231 -MimeMessageBegin 9717231 -MimeEntityBegin 9717231 -MimeEntityHeadersEnd 9717382 -MimeMessageHeadersEnd 9717382 -Octets 3108 -Lines 68 -MimeEntityEnd 9720490 -MimeMessageEnd 9720490 -MboxMarkerBegin 9720491 -MboxMarkerEnd 9720523 -MimeMessageBegin 9720523 -MimeEntityBegin 9720523 -MimeEntityHeadersEnd 9722388 -MimeMessageHeadersEnd 9722388 -MultipartPreambleBegin 9722388 -MultipartPreambleEnd 9722388 -MultipartBoundaryBegin 9722388 -MultipartBoundaryEnd 9722432 -MimeEntityBegin 9722432 -MimeEntityHeadersEnd 9722510 -Octets 863 -Lines 18 -MimeEntityEnd 9723373 -MultipartBoundaryBegin 9723373 -MultipartBoundaryEnd 9723418 -MimeEntityBegin 9723418 -MimeEntityHeadersEnd 9723579 -Octets 3641 -Lines 61 -MimeEntityEnd 9727220 -MultipartEndBoundaryBegin 9727220 -MultipartEndBoundaryEnd 9727266 -MultipartEpilogueBegin 9727266 -MultipartEpilogueEnd 9727267 -Octets 4879 -Lines 92 -MimeEntityEnd 9727267 -MimeMessageEnd 9727267 -MboxMarkerBegin 9727268 -MboxMarkerEnd 9727276 -MimeMessageBegin 9727276 -MimeEntityBegin 9727276 -MimeEntityHeadersEnd 9727830 -MimeMessageHeadersEnd 9727830 -MultipartPreambleBegin 9727830 -MultipartPreambleEnd 9727831 -MultipartBoundaryBegin 9727831 -MultipartBoundaryEnd 9727847 -MimeEntityBegin 9727847 -MimeEntityHeadersEnd 9727874 -Octets 963 -Lines 19 -MimeEntityEnd 9728837 -MultipartBoundaryBegin 9728837 -MultipartBoundaryEnd 9728854 -MimeEntityBegin 9728854 -MimeEntityHeadersEnd 9728914 -Octets 115726 -Lines 1586 -MimeEntityEnd 9844640 -MultipartEndBoundaryBegin 9844640 -MultipartEndBoundaryEnd 9844658 -MultipartEpilogueBegin 9844658 -MultipartEpilogueEnd 9844660 -Octets 116830 -Lines 1617 -MimeEntityEnd 9844660 -MimeMessageEnd 9844660 -MboxMarkerBegin 9844661 -MboxMarkerEnd 9844669 -MimeMessageBegin 9844669 -MimeEntityBegin 9844669 -MimeEntityHeadersEnd 9845465 -MimeMessageHeadersEnd 9845465 -MultipartPreambleBegin 9845465 -MultipartPreambleEnd 9845620 -MultipartBoundaryBegin 9845620 -MultipartBoundaryEnd 9845660 -MimeEntityBegin 9845660 -MimeEntityHeadersEnd 9845704 -Octets 8963 -Lines 349 -MimeEntityEnd 9854667 -MultipartBoundaryBegin 9854667 -MultipartBoundaryEnd 9854708 -MimeEntityBegin 9854708 -MimeEntityHeadersEnd 9854793 -MultipartPreambleBegin 9854793 -MultipartPreambleEnd 9854793 -MultipartBoundaryBegin 9854793 -MultipartBoundaryEnd 9854835 -MimeEntityBegin 9854835 -MimeEntityHeadersEnd 9854926 -Octets 2775 -Lines 69 -MimeEntityEnd 9857701 -MultipartBoundaryBegin 9857701 -MultipartBoundaryEnd 9857744 -MimeEntityBegin 9857744 -MimeEntityHeadersEnd 9857940 -MimeMessageBegin 9857940 -MimeEntityBegin 9857940 -MimeEntityHeadersEnd 9857967 -MimeMessageHeadersEnd 9857967 -Octets 2 -Lines 2 -MimeEntityEnd 9857969 -MimeMessageEnd 9857969 -Octets 29 -Lines 4 -MimeEntityEnd 9857969 -MultipartBoundaryBegin 9857969 -MultipartBoundaryEnd 9858012 -MimeEntityBegin 9858012 -MimeEntityHeadersEnd 9858103 -Octets 974 -Lines 22 -MimeEntityEnd 9859077 -MultipartBoundaryBegin 9859077 -MultipartBoundaryEnd 9859120 -MimeEntityBegin 9859120 -MimeEntityHeadersEnd 9859236 -Octets 359 -Lines 15 -MimeEntityEnd 9859595 -MultipartBoundaryBegin 9859595 -MultipartBoundaryEnd 9859638 -MimeEntityBegin 9859638 -MimeEntityHeadersEnd 9859729 -Octets 10 -Lines 2 -MimeEntityEnd 9859739 -MultipartBoundaryBegin 9859739 -MultipartBoundaryEnd 9859782 -MimeEntityBegin 9859782 -MimeEntityHeadersEnd 9859967 -MimeMessageBegin 9859967 -MimeEntityBegin 9859967 -MimeEntityHeadersEnd 9859994 -MimeMessageHeadersEnd 9859994 -Octets 1 -Lines 1 -MimeEntityEnd 9859995 -MimeMessageEnd 9859995 -Octets 28 -Lines 3 -MimeEntityEnd 9859995 -MultipartBoundaryBegin 9859995 -MultipartBoundaryEnd 9860038 -MimeEntityBegin 9860038 -MimeEntityHeadersEnd 9860129 -Octets 10 -Lines 2 -MimeEntityEnd 9860139 -MultipartBoundaryBegin 9860139 -MultipartBoundaryEnd 9860182 -MimeEntityBegin 9860182 -MimeEntityHeadersEnd 9860288 -Octets 2983 -Lines 43 -MimeEntityEnd 9863271 -MultipartBoundaryBegin 9863271 -MultipartBoundaryEnd 9863314 -MimeEntityBegin 9863314 -MimeEntityHeadersEnd 9863405 -Octets 6592 -Lines 260 -MimeEntityEnd 9869997 -MultipartEndBoundaryBegin 9869997 -MultipartEndBoundaryEnd 9870041 -MultipartEpilogueBegin 9870041 -MultipartEpilogueEnd 9870042 -Octets 15249 -Lines 475 -MimeEntityEnd 9870042 -MultipartEndBoundaryBegin 9870042 -MultipartEndBoundaryEnd 9870084 -MultipartEpilogueBegin 9870084 -MultipartEpilogueEnd 9870085 -Octets 24620 -Lines 837 -MimeEntityEnd 9870085 -MimeMessageEnd 9870085 -MboxMarkerBegin 9870086 -MboxMarkerEnd 9870094 -MimeMessageBegin 9870094 -MimeEntityBegin 9870094 -MimeEntityHeadersEnd 9871206 -MimeMessageHeadersEnd 9871206 -MultipartPreambleBegin 9871206 -MultipartPreambleEnd 9871206 -MultipartBoundaryBegin 9871206 -MultipartBoundaryEnd 9871216 -MimeEntityBegin 9871216 -MimeEntityHeadersEnd 9871217 -Octets 333 -Lines 8 -MimeEntityEnd 9871550 -MultipartBoundaryBegin 9871550 -MultipartBoundaryEnd 9871561 -MimeEntityBegin 9871561 -MimeEntityHeadersEnd 9871620 -Octets 29979 -Lines 411 -MimeEntityEnd 9901599 -MultipartBoundaryBegin 9901599 -MultipartBoundaryEnd 9901610 -MimeEntityBegin 9901610 -MimeEntityHeadersEnd 9901611 -Octets 172 -Lines 9 -MimeEntityEnd 9901783 -MultipartEndBoundaryBegin 9901783 -MultipartEndBoundaryEnd 9901795 -MultipartEpilogueBegin 9901795 -MultipartEpilogueEnd 9901796 -Octets 30590 -Lines 440 -MimeEntityEnd 9901796 -MimeMessageEnd 9901796 -MboxMarkerBegin 9901797 -MboxMarkerEnd 9901805 -MimeMessageBegin 9901805 -MimeEntityBegin 9901805 -MimeEntityHeadersEnd 9903514 -MimeMessageHeadersEnd 9903514 -Octets 182799 -Lines 2951 -MimeEntityEnd 10086313 -MimeMessageEnd 10086313 -MboxMarkerBegin 10086314 -MboxMarkerEnd 10086322 -MimeMessageBegin 10086322 -MimeEntityBegin 10086322 -MimeEntityHeadersEnd 10087029 -MimeMessageHeadersEnd 10087029 -MultipartPreambleBegin 10087029 -MultipartPreambleEnd 10087029 -MultipartBoundaryBegin 10087029 -MultipartBoundaryEnd 10087056 -MimeEntityBegin 10087056 -MimeEntityHeadersEnd 10087057 -Octets 21 -Lines 1 -MimeEntityEnd 10087078 -MultipartBoundaryBegin 10087078 -MultipartBoundaryEnd 10087106 -MimeEntityBegin 10087106 -MimeEntityHeadersEnd 10087258 -Octets 83741 -Lines 434 -MimeEntityEnd 10170999 -MultipartBoundaryBegin 10170999 -MultipartBoundaryEnd 10171027 -MimeEntityBegin 10171027 -MimeEntityHeadersEnd 10171028 -Octets 259 -Lines 9 -MimeEntityEnd 10171287 -MultipartEndBoundaryBegin 10171287 -MultipartEndBoundaryEnd 10171316 -MultipartEpilogueBegin 10171316 -MultipartEpilogueEnd 10171317 -Octets 84288 -Lines 455 -MimeEntityEnd 10171317 -MimeMessageEnd 10171317 -MboxMarkerBegin 10171318 -MboxMarkerEnd 10171326 -MimeMessageBegin 10171326 -MimeEntityBegin 10171326 -MimeEntityHeadersEnd 10171993 -MimeMessageHeadersEnd 10171993 -MultipartPreambleBegin 10171993 -MultipartPreambleEnd 10171993 -MultipartBoundaryBegin 10171993 -MultipartBoundaryEnd 10172020 -MimeEntityBegin 10172020 -MimeEntityHeadersEnd 10172021 -Octets 66 -Lines 1 -MimeEntityEnd 10172087 -MultipartBoundaryBegin 10172087 -MultipartBoundaryEnd 10172115 -MimeEntityBegin 10172115 -MimeEntityHeadersEnd 10172276 -Octets 32166 -Lines 167 -MimeEntityEnd 10204442 -MultipartBoundaryBegin 10204442 -MultipartBoundaryEnd 10204470 -MimeEntityBegin 10204470 -MimeEntityHeadersEnd 10204471 -Octets 17 -Lines 2 -MimeEntityEnd 10204488 -MultipartBoundaryBegin 10204488 -MultipartBoundaryEnd 10204516 -MimeEntityBegin 10204516 -MimeEntityHeadersEnd 10204675 -Octets 1085 -Lines 6 -MimeEntityEnd 10205760 -MultipartBoundaryBegin 10205760 -MultipartBoundaryEnd 10205788 -MimeEntityBegin 10205788 -MimeEntityHeadersEnd 10205789 -Octets 30 -Lines 2 -MimeEntityEnd 10205819 -MultipartBoundaryBegin 10205819 -MultipartBoundaryEnd 10205847 -MimeEntityBegin 10205847 -MimeEntityHeadersEnd 10205915 -Octets 186037 -Lines 1990 -MimeEntityEnd 10391952 -MultipartBoundaryBegin 10391952 -MultipartBoundaryEnd 10391980 -MimeEntityBegin 10391980 -MimeEntityHeadersEnd 10391981 -Octets 8 -Lines 1 -MimeEntityEnd 10391989 -MultipartEndBoundaryBegin 10391989 -MultipartEndBoundaryEnd 10392018 -MultipartEpilogueBegin 10392018 -MultipartEpilogueEnd 10392019 -Octets 220026 -Lines 2196 -MimeEntityEnd 10392019 -MimeMessageEnd 10392019 -MboxMarkerBegin 10392020 -MboxMarkerEnd 10392028 -MimeMessageBegin 10392028 -MimeEntityBegin 10392028 -MimeEntityHeadersEnd 10392292 -MimeMessageHeadersEnd 10392292 -Octets 74658 -Lines 1023 -MimeEntityEnd 10466950 -MimeMessageEnd 10466950 -MboxMarkerBegin 10466951 -MboxMarkerEnd 10466959 -MimeMessageBegin 10466959 -MimeEntityBegin 10466959 -MimeEntityHeadersEnd 10468233 -MimeMessageHeadersEnd 10468233 -MultipartPreambleBegin 10468233 -MultipartPreambleEnd 10468759 -MultipartBoundaryBegin 10468759 -MultipartBoundaryEnd 10468817 -MimeEntityBegin 10468817 -MimeEntityHeadersEnd 10468818 -Octets 1847 -Lines 34 -MimeEntityEnd 10470665 -MultipartBoundaryBegin 10470665 -MultipartBoundaryEnd 10470724 -MimeEntityBegin 10470724 -MimeEntityHeadersEnd 10470827 -MultipartPreambleBegin 10470827 -MultipartPreambleEnd 10470827 -MultipartBoundaryBegin 10470827 -MultipartBoundaryEnd 10470887 -MimeEntityBegin 10470887 -MimeEntityHeadersEnd 10470960 -Octets 1999 -Lines 29 -MimeEntityEnd 10472959 -MultipartBoundaryBegin 10472959 -MultipartBoundaryEnd 10473020 -MimeEntityBegin 10473020 -MimeEntityHeadersEnd 10473079 -Octets 7929 -Lines 109 -MimeEntityEnd 10481008 -MultipartBoundaryBegin 10481008 -MultipartBoundaryEnd 10481069 -MimeEntityBegin 10481069 -MimeEntityHeadersEnd 10481139 -Octets 3 -Lines 2 -MimeEntityEnd 10481142 -MultipartBoundaryBegin 10481142 -MultipartBoundaryEnd 10481203 -MimeEntityBegin 10481203 -MimeEntityHeadersEnd 10481296 -Octets 41878 -Lines 574 -MimeEntityEnd 10523174 -MultipartEndBoundaryBegin 10523174 -MultipartEndBoundaryEnd 10523236 -MultipartEpilogueBegin 10523236 -MultipartEpilogueEnd 10523237 -Octets 52410 -Lines 736 -MimeEntityEnd 10523237 -MultipartEndBoundaryBegin 10523237 -MultipartEndBoundaryEnd 10523297 -MultipartEpilogueBegin 10523297 -MultipartEpilogueEnd 10523298 -Octets 55065 -Lines 787 -MimeEntityEnd 10523298 -MimeMessageEnd 10523298 -MboxMarkerBegin 10523299 -MboxMarkerEnd 10523307 -MimeMessageBegin 10523307 -MimeEntityBegin 10523307 -MimeEntityHeadersEnd 10523459 -MimeMessageHeadersEnd 10523459 -Octets 4803 -Lines 68 -MimeEntityEnd 10528262 -MimeMessageEnd 10528262 -MboxMarkerBegin 10528263 -MboxMarkerEnd 10528271 -MimeMessageBegin 10528271 -MimeEntityBegin 10528271 -MimeEntityHeadersEnd 10529016 -MimeMessageHeadersEnd 10529016 -MultipartPreambleBegin 10529016 -MultipartPreambleEnd 10529355 -MultipartBoundaryBegin 10529355 -MultipartBoundaryEnd 10529395 -MimeEntityBegin 10529395 -MimeEntityHeadersEnd 10529396 -Octets 368 -Lines 8 -MimeEntityEnd 10529764 -MultipartBoundaryBegin 10529764 -MultipartBoundaryEnd 10529805 -MimeEntityBegin 10529805 -MimeEntityHeadersEnd 10529890 -MultipartPreambleBegin 10529890 -MultipartPreambleEnd 10529890 -MultipartBoundaryBegin 10529890 -MultipartBoundaryEnd 10529932 -MimeEntityBegin 10529932 -MimeEntityHeadersEnd 10530002 -Octets 89 -Lines 4 -MimeEntityEnd 10530091 -MultipartBoundaryBegin 10530091 -MultipartBoundaryEnd 10530134 -MimeEntityBegin 10530134 -MimeEntityHeadersEnd 10530248 -Octets 5663 -Lines 83 -MimeEntityEnd 10535911 -MultipartBoundaryBegin 10535911 -MultipartBoundaryEnd 10535954 -MimeEntityBegin 10535954 -MimeEntityHeadersEnd 10536024 -Octets 203 -Lines 6 -MimeEntityEnd 10536227 -MultipartEndBoundaryBegin 10536227 -MultipartEndBoundaryEnd 10536271 -MultipartEpilogueBegin 10536271 -MultipartEpilogueEnd 10536272 -Octets 6382 -Lines 110 -MimeEntityEnd 10536272 -MultipartEndBoundaryBegin 10536272 -MultipartEndBoundaryEnd 10536314 -MultipartEpilogueBegin 10536314 -MultipartEpilogueEnd 10536315 -Octets 7299 -Lines 133 -MimeEntityEnd 10536315 -MimeMessageEnd 10536315 From 36fec5483c81d51d83da8d1aaa7c6d2441a0f106 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 9 Jul 2020 08:51:08 -0400 Subject: [PATCH 660/741] Fixed end and headerEnd offsets emitted by the parser More fixes for issue #582 --- MimeKit/AsyncMimeParser.cs | 32 ++++++----- MimeKit/MimeParser.cs | 32 ++++++----- UnitTests/TestData/mbox/jwz.dos-offsets.json | 60 ++++++++++---------- 3 files changed, 66 insertions(+), 58 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 23d0e532c9..431d6221fe 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -268,7 +268,6 @@ async Task ConstructMimePartAsync (MimePart part, MimeEntityEndEventArgs args, C endOffset = beginOffset + content.Length; } - args.EndOffset = endOffset; args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); @@ -287,7 +286,6 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (await ReadAheadAsync (atleast, 0, cancellationToken).ConfigureAwait (false) <= 0) { - args.EndOffset = beginOffset; boundary = BoundaryType.Eos; return; } @@ -313,7 +311,6 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) { - args.EndOffset = beginOffset; return; } break; @@ -328,7 +325,6 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, // which likely means that this is not a valid MIME stream? - args.EndOffset = GetOffset (inputIndex); boundary = BoundaryType.Eos; return; } @@ -368,16 +364,15 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs rfc822.Message = message; - messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; - messageArgs.EndOffset = entityArgs.EndOffset; + var endOffset = GetEndOffset (inputIndex); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + messageArgs.EndOffset = entityArgs.EndOffset = endOffset; messageArgs.Octets = entityArgs.Octets; messageArgs.Lines = entityArgs.Lines; OnMimeEntityEnd (entityArgs); OnMimeMessageEnd (messageArgs); - var endOffset = GetEndOffset (inputIndex); - args.EndOffset = endOffset; args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); } @@ -461,9 +456,13 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat else await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); + var endOffset = GetEndOffset (inputIndex); + entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + entityArgs.EndOffset = endOffset; + OnMimeEntityEnd (entityArgs); - //beginOffset = GetEndOffset (inputIndex); + //beginOffset = endOffset; multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); } @@ -483,7 +482,7 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs // Note: this will scan all content into the preamble... await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); - args.EndOffset = endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; @@ -507,13 +506,13 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); - args.EndOffset = endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } - args.EndOffset = endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); @@ -614,6 +613,10 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs else await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); + var endOffset = GetEndOffset (inputIndex); + entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + entityArgs.EndOffset = endOffset; + if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else @@ -714,8 +717,9 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs else await ConstructMimePartAsync ((MimePart) entity, entityArgs, cancellationToken).ConfigureAwait (false); - messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; - messageArgs.EndOffset = entityArgs.EndOffset; + var endOffset = GetEndOffset (inputIndex); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + messageArgs.EndOffset = entityArgs.EndOffset = endOffset; messageArgs.Octets = entityArgs.Octets; messageArgs.Lines = entityArgs.Lines; diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 21b7661648..ccd1adc37a 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1360,7 +1360,6 @@ unsafe void ConstructMimePart (MimePart part, MimeEntityEndEventArgs args, byte* endOffset = beginOffset + content.Length; } - args.EndOffset = endOffset; args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); @@ -1379,7 +1378,6 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg int atleast = Math.Max (ReadAheadSize, GetMaxBoundaryLength ()); if (ReadAhead (atleast, 0, cancellationToken) <= 0) { - args.EndOffset = beginOffset; boundary = BoundaryType.Eos; return; } @@ -1403,7 +1401,6 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg case BoundaryType.ParentEndBoundary: // ignore "From " boundaries, broken mailers tend to include these... if (!IsMboxMarker (start)) { - args.EndOffset = beginOffset; return; } break; @@ -1416,7 +1413,6 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg // Note: this either means that StepHeaders() found the end of the stream // or an invalid header field name at the start of the message headers, // which likely means that this is not a valid MIME stream? - args.EndOffset = GetOffset (inputIndex); boundary = BoundaryType.Eos; return; } @@ -1456,16 +1452,15 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg rfc822.Message = message; - messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; - messageArgs.EndOffset = entityArgs.EndOffset; + var endOffset = GetEndOffset (inputIndex); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min(entityArgs.HeadersEndOffset, endOffset); + messageArgs.EndOffset = entityArgs.EndOffset = endOffset; messageArgs.Octets = entityArgs.Octets; messageArgs.Lines = entityArgs.Lines; OnMimeEntityEnd (entityArgs); OnMimeMessageEnd (messageArgs); - var endOffset = GetEndOffset (inputIndex); - args.EndOffset = endOffset; args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); } @@ -1549,9 +1544,13 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, else ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); + var endOffset = GetEndOffset (inputIndex); + entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + entityArgs.EndOffset = endOffset; + OnMimeEntityEnd (entityArgs); - //beginOffset = GetEndOffset (inputIndex); + //beginOffset = endOffset; multipart.Add (entity); } while (boundary == BoundaryType.ImmediateBoundary); } @@ -1584,7 +1583,7 @@ unsafe void ConstructMultipart (Multipart multipart, MimeEntityEndEventArgs args // Note: this will scan all content into the preamble... MultipartScanPreamble (multipart, inbuf, cancellationToken); - args.EndOffset = endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; @@ -1608,13 +1607,13 @@ unsafe void ConstructMultipart (Multipart multipart, MimeEntityEndEventArgs args MultipartScanEpilogue (multipart, inbuf, cancellationToken); - args.EndOffset = endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } - args.EndOffset = endOffset = GetEndOffset (inputIndex); + endOffset = GetEndOffset (inputIndex); args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); @@ -1703,6 +1702,10 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) else ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); + var endOffset = GetEndOffset (inputIndex); + entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + entityArgs.EndOffset = endOffset; + if (boundary != BoundaryType.Eos) state = MimeParserState.Complete; else @@ -1811,8 +1814,9 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke else ConstructMimePart ((MimePart) entity, entityArgs, inbuf, cancellationToken); - messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset; - messageArgs.EndOffset = entityArgs.EndOffset; + var endOffset = GetEndOffset (inputIndex); + messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); + messageArgs.EndOffset = entityArgs.EndOffset = endOffset; messageArgs.Octets = entityArgs.Octets; messageArgs.Lines = entityArgs.Lines; diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.json b/UnitTests/TestData/mbox/jwz.dos-offsets.json index cb9ea984f2..ccdbf9e3e5 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.json +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.json @@ -238,8 +238,8 @@ { "mimeType": "text/plain", "begin": 350454, - "headersEnd": 350456, - "end": 350456, + "headersEnd": 350454, + "end": 350454, "octets": 0, "lines": 0 } @@ -1526,16 +1526,16 @@ "headersEnd": 4259095, "message": { "begin": 4259095, - "headersEnd": 4259175, + "headersEnd": 4259173, "body": { "mimeType": "text/plain", "begin": 4259095, - "headersEnd": 4259175, - "end": 4259175, + "headersEnd": 4259173, + "end": 4259173, "octets": 0, "lines": 0 }, - "end": 4259175, + "end": 4259173, "octets": 0, "lines": 0 }, @@ -1549,16 +1549,16 @@ "headersEnd": 4259332, "message": { "begin": 4259332, - "headersEnd": 4259403, + "headersEnd": 4259401, "body": { "mimeType": "TEXT/HTML", "begin": 4259332, - "headersEnd": 4259403, - "end": 4259403, + "headersEnd": 4259401, + "end": 4259401, "octets": 0, "lines": 0 }, - "end": 4259403, + "end": 4259401, "octets": 0, "lines": 0 }, @@ -1572,16 +1572,16 @@ "headersEnd": 4259535, "message": { "begin": 4259535, - "headersEnd": 4259607, + "headersEnd": 4259605, "body": { "mimeType": "image/gif", "begin": 4259535, - "headersEnd": 4259607, - "end": 4259607, + "headersEnd": 4259605, + "end": 4259605, "octets": 0, "lines": 0 }, - "end": 4259607, + "end": 4259605, "octets": 0, "lines": 0 }, @@ -1595,16 +1595,16 @@ "headersEnd": 4259731, "message": { "begin": 4259731, - "headersEnd": 4259803, + "headersEnd": 4259801, "body": { "mimeType": "image/gif", "begin": 4259731, - "headersEnd": 4259803, - "end": 4259803, + "headersEnd": 4259801, + "end": 4259801, "octets": 0, "lines": 0 }, - "end": 4259803, + "end": 4259801, "octets": 0, "lines": 0 }, @@ -1678,16 +1678,16 @@ "headersEnd": 4264281, "message": { "begin": 4264281, - "headersEnd": 4264361, + "headersEnd": 4264359, "body": { "mimeType": "text/plain", "begin": 4264281, - "headersEnd": 4264361, - "end": 4264361, + "headersEnd": 4264359, + "end": 4264359, "octets": 0, "lines": 0 }, - "end": 4264361, + "end": 4264359, "octets": 0, "lines": 0 }, @@ -2500,16 +2500,16 @@ "headersEnd": 4765640, "message": { "begin": 4765640, - "headersEnd": 4765713, + "headersEnd": 4765711, "body": { "mimeType": "text/plain", "begin": 4765640, - "headersEnd": 4765713, - "end": 4765713, + "headersEnd": 4765711, + "end": 4765711, "octets": 0, "lines": 0 }, - "end": 4765713, + "end": 4765711, "octets": 0, "lines": 0 }, @@ -2531,16 +2531,16 @@ "headersEnd": 4766273, "message": { "begin": 4766273, - "headersEnd": 4766346, + "headersEnd": 4766344, "body": { "mimeType": "text/plain", "begin": 4766273, - "headersEnd": 4766346, - "end": 4766346, + "headersEnd": 4766344, + "end": 4766344, "octets": 0, "lines": 0 }, - "end": 4766346, + "end": 4766344, "octets": 0, "lines": 0 }, From 1940c7efdba9e99aeec410c532486fc3b52f9c62 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 9 Jul 2020 08:55:35 -0400 Subject: [PATCH 661/741] Updated unix offsets --- UnitTests/TestData/mbox/jwz.unix-offsets.json | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.json b/UnitTests/TestData/mbox/jwz.unix-offsets.json index af7dcb6491..d6de9bf806 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.json +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.json @@ -238,8 +238,8 @@ { "mimeType": "text/plain", "begin": 343533, - "headersEnd": 343534, - "end": 343534, + "headersEnd": 343533, + "end": 343533, "octets": 0, "lines": 0 } @@ -1526,16 +1526,16 @@ "headersEnd": 4200938, "message": { "begin": 4200938, - "headersEnd": 4201015, + "headersEnd": 4201014, "body": { "mimeType": "text/plain", "begin": 4200938, - "headersEnd": 4201015, - "end": 4201015, + "headersEnd": 4201014, + "end": 4201014, "octets": 0, "lines": 0 }, - "end": 4201015, + "end": 4201014, "octets": 0, "lines": 0 }, @@ -1549,16 +1549,16 @@ "headersEnd": 4201164, "message": { "begin": 4201164, - "headersEnd": 4201232, + "headersEnd": 4201231, "body": { "mimeType": "TEXT/HTML", "begin": 4201164, - "headersEnd": 4201232, - "end": 4201232, + "headersEnd": 4201231, + "end": 4201231, "octets": 0, "lines": 0 }, - "end": 4201232, + "end": 4201231, "octets": 0, "lines": 0 }, @@ -1572,16 +1572,16 @@ "headersEnd": 4201359, "message": { "begin": 4201359, - "headersEnd": 4201428, + "headersEnd": 4201427, "body": { "mimeType": "image/gif", "begin": 4201359, - "headersEnd": 4201428, - "end": 4201428, + "headersEnd": 4201427, + "end": 4201427, "octets": 0, "lines": 0 }, - "end": 4201428, + "end": 4201427, "octets": 0, "lines": 0 }, @@ -1595,16 +1595,16 @@ "headersEnd": 4201547, "message": { "begin": 4201547, - "headersEnd": 4201616, + "headersEnd": 4201615, "body": { "mimeType": "image/gif", "begin": 4201547, - "headersEnd": 4201616, - "end": 4201616, + "headersEnd": 4201615, + "end": 4201615, "octets": 0, "lines": 0 }, - "end": 4201616, + "end": 4201615, "octets": 0, "lines": 0 }, @@ -1678,16 +1678,16 @@ "headersEnd": 4205985, "message": { "begin": 4205985, - "headersEnd": 4206062, + "headersEnd": 4206061, "body": { "mimeType": "text/plain", "begin": 4205985, - "headersEnd": 4206062, - "end": 4206062, + "headersEnd": 4206061, + "end": 4206061, "octets": 0, "lines": 0 }, - "end": 4206062, + "end": 4206061, "octets": 0, "lines": 0 }, @@ -2500,16 +2500,16 @@ "headersEnd": 4700486, "message": { "begin": 4700486, - "headersEnd": 4700556, + "headersEnd": 4700555, "body": { "mimeType": "text/plain", "begin": 4700486, - "headersEnd": 4700556, - "end": 4700556, + "headersEnd": 4700555, + "end": 4700555, "octets": 0, "lines": 0 }, - "end": 4700556, + "end": 4700555, "octets": 0, "lines": 0 }, @@ -2531,16 +2531,16 @@ "headersEnd": 4701098, "message": { "begin": 4701098, - "headersEnd": 4701168, + "headersEnd": 4701167, "body": { "mimeType": "text/plain", "begin": 4701098, - "headersEnd": 4701168, - "end": 4701168, + "headersEnd": 4701167, + "end": 4701167, "octets": 0, "lines": 0 }, - "end": 4701168, + "end": 4701167, "octets": 0, "lines": 0 }, From e59521b4911ae129ce7a5bf18874866b0ac34428 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 10 Jul 2020 09:11:04 -0400 Subject: [PATCH 662/741] Moved HeadersEndOffset properties into the EndEventArgs Also added an internal LineNumber property for my own personal use as an aid in debugging the parser. I might make this public at some point, but I'm not sure how valuable that would be. --- MimeKit/AsyncMimeParser.cs | 35 +- MimeKit/MimeEntityBeginEventArgs.cs | 8 +- MimeKit/MimeEntityEndEventArgs.cs | 9 + MimeKit/MimeMessageBeginEventArgs.cs | 14 +- MimeKit/MimeMessageEndEventArgs.cs | 22 +- MimeKit/MimeParser.cs | 35 +- UnitTests/MimeParserTests.cs | 19 +- .../mbox/content-length.dos-offsets.json | 281 ++- UnitTests/TestData/mbox/jwz.dos-offsets.json | 1897 ++++++++++++----- 9 files changed, 1627 insertions(+), 693 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 431d6221fe..608cf9f2ec 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -331,10 +331,9 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); var messageArgs = new MimeMessageEndEventArgs (message, rfc822) { - MboxMarkerOffset = mboxMarkerOffset, - MboxMarkerLength = mboxMarkerLength, HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeMessageBegin (messageArgs); @@ -348,7 +347,8 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs var entity = options.CreateEntity (type, headers, true, depth); var entityArgs = new MimeEntityEndEventArgs (entity) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -367,8 +367,7 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.Octets = entityArgs.Octets; - messageArgs.Lines = entityArgs.Lines; + messageArgs.BodyOctets = entityArgs.Octets; OnMimeEntityEnd (entityArgs); OnMimeMessageEnd (messageArgs); @@ -417,6 +416,8 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat //OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + var beginLineNumber = lineNumber; + // parse the headers state = MimeParserState.Headers; if (await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) { @@ -444,7 +445,8 @@ async Task MultipartScanSubpartsAsync (Multipart multipart, int depth, Cancellat var entity = options.CreateEntity (type, headers, false, depth); var entityArgs = new MimeEntityEndEventArgs (entity, multipart) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -588,6 +590,8 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs if (persistent && stream.Position != position) stream.Seek (position, SeekOrigin.Begin); + var beginLineNumber = lineNumber; + state = MimeParserState.Headers; toplevel = true; @@ -601,7 +605,8 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs var entity = options.CreateEntity (type, headers, false, 0); var entityArgs = new MimeEntityEndEventArgs (entity) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -665,15 +670,17 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs toplevel = true; // parse the headers + var beginLineNumber = lineNumber; if (state < MimeParserState.Content && await StepAsync (cancellationToken).ConfigureAwait (false) == MimeParserState.Error) throw new FormatException ("Failed to parse message headers."); var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); var messageArgs = new MimeMessageEndEventArgs (message) { - MboxMarkerOffset = mboxMarkerOffset, - MboxMarkerLength = mboxMarkerLength, + MboxMarkerOffset = format == MimeFormat.Mbox ? (long?) mboxMarkerOffset : null, + MboxMarkerLength = format == MimeFormat.Mbox ? (int?) mboxMarkerLength : null, HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeMessageBegin (messageArgs); @@ -703,7 +710,8 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs var entity = options.CreateEntity (type, headers, true, 0); var entityArgs = new MimeEntityEndEventArgs (entity) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -720,8 +728,7 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.Octets = entityArgs.Octets; - messageArgs.Lines = entityArgs.Lines; + messageArgs.BodyOctets = entityArgs.Octets; if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) diff --git a/MimeKit/MimeEntityBeginEventArgs.cs b/MimeKit/MimeEntityBeginEventArgs.cs index e8dbc0c4cb..f2ef4ee5b6 100644 --- a/MimeKit/MimeEntityBeginEventArgs.cs +++ b/MimeKit/MimeEntityBeginEventArgs.cs @@ -106,12 +106,12 @@ public MimeEntityBeginEventArgs (MimeEntity entity, Multipart parent) public long BeginOffset { get; set; } /// - /// Get or set the stream offset that marks the end of the entity's headers. + /// Get or set the line number of the beginning of the entity. /// /// - /// Gets or sets the stream offset that marks the end of the entity's headers. + /// Gets or sets the line number of the beginning of the entity. /// - /// The stream offset. - public long HeadersEndOffset { get; set; } + /// The line number. + internal int LineNumber { get; set; } } } diff --git a/MimeKit/MimeEntityEndEventArgs.cs b/MimeKit/MimeEntityEndEventArgs.cs index ca12705732..2b9d95d0f4 100644 --- a/MimeKit/MimeEntityEndEventArgs.cs +++ b/MimeKit/MimeEntityEndEventArgs.cs @@ -66,6 +66,15 @@ public MimeEntityEndEventArgs (MimeEntity entity, Multipart parent) : base (enti { } + /// + /// Get or set the stream offset that marks the end of the entity's headers. + /// + /// + /// Gets or sets the stream offset that marks the end of the entity's headers. + /// + /// The stream offset. + public long HeadersEndOffset { get; set; } + /// /// Get or set the stream offset that marks the end of the entity. /// diff --git a/MimeKit/MimeMessageBeginEventArgs.cs b/MimeKit/MimeMessageBeginEventArgs.cs index 5577b36424..b237d4e411 100644 --- a/MimeKit/MimeMessageBeginEventArgs.cs +++ b/MimeKit/MimeMessageBeginEventArgs.cs @@ -94,7 +94,7 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) /// Gets the parent if this message is an attachment. /// /// The parent . - public MessagePart Parent { get; set; } + public MessagePart Parent { get; } /// /// Get or set the stream offset that marks beginning of the mbox marker. @@ -102,7 +102,7 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) /// /// Gets or sets the stream offset that marks the beginning of the mbox marker. /// - public long MboxMarkerOffset { get; set; } + public long? MboxMarkerOffset { get; set; } /// /// Get or set the stream offset that marks beginning of the mbox marker. @@ -110,7 +110,7 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) /// /// Gets or sets the stream offset that marks the beginning of the mbox marker. /// - public long MboxMarkerLength { get; set; } + public int? MboxMarkerLength { get; set; } /// /// Get or set the stream offset that marks the beginning of the message. @@ -122,12 +122,12 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) public long BeginOffset { get; set; } /// - /// Get or set the stream offset that marks the end of the message headers. + /// Get or set the line number of the beginning of the message. /// /// - /// Gets or sets the stream offset that marks the end of the message headers. + /// Gets or sets the line number of the beginning of the message. /// - /// The stream offset. - public long HeadersEndOffset { get; set; } + /// The line number. + internal int LineNumber { get; set; } } } diff --git a/MimeKit/MimeMessageEndEventArgs.cs b/MimeKit/MimeMessageEndEventArgs.cs index af27ffa49f..ddff809ad5 100644 --- a/MimeKit/MimeMessageEndEventArgs.cs +++ b/MimeKit/MimeMessageEndEventArgs.cs @@ -67,30 +67,30 @@ public MimeMessageEndEventArgs (MimeMessage message, MessagePart parent) : base } /// - /// Get or set the stream offset that marks the end of the entity. + /// Get or set the stream offset that marks the end of the message headers. /// /// - /// Gets or sets the stream offset that marks the end of the entity. + /// Gets or sets the stream offset that marks the end of the message headers. /// /// The stream offset. - public long EndOffset { get; set; } + public long HeadersEndOffset { get; set; } /// - /// Get or set the content length of the entity as measured in octets. + /// Get or set the stream offset that marks the end of the message. /// /// - /// Gets or sets the content length of the entity as measured in octets. + /// Gets or sets the stream offset that marks the end of the message. /// - /// The length of the content in bytes. - public long Octets { get; set; } + /// The stream offset. + public long EndOffset { get; set; } /// - /// Get or set the content length of the entity as measured in lines. + /// Get or set the length of the message body as measured in octets. /// /// - /// Get or set the content length of the entity as measured in lines. + /// Gets or sets the length of the message body as measured in octets. /// - /// The length of the content in lines. - public int Lines { get; set; } + /// The length of the message body in bytes. + public long BodyOctets { get; set; } } } diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index ccd1adc37a..296460d27a 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1419,10 +1419,9 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); var messageArgs = new MimeMessageEndEventArgs (message, rfc822) { - MboxMarkerOffset = mboxMarkerOffset, - MboxMarkerLength = mboxMarkerLength, HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeMessageBegin (messageArgs); @@ -1436,7 +1435,8 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg var entity = options.CreateEntity (type, headers, true, depth); var entityArgs = new MimeEntityEndEventArgs (entity) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -1455,8 +1455,7 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min(entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.Octets = entityArgs.Octets; - messageArgs.Lines = entityArgs.Lines; + messageArgs.BodyOctets = entityArgs.Octets; OnMimeEntityEnd (entityArgs); OnMimeMessageEnd (messageArgs); @@ -1505,6 +1504,8 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, //OnMultipartBoundaryEnd (multipart, GetOffset (inputIndex)); + var beginLineNumber = lineNumber; + // parse the headers state = MimeParserState.Headers; if (Step (inbuf, cancellationToken) == MimeParserState.Error) { @@ -1532,7 +1533,8 @@ unsafe void MultipartScanSubparts (Multipart multipart, byte* inbuf, int depth, var entity = options.CreateEntity (type, headers, false, depth); var entityArgs = new MimeEntityEndEventArgs (entity, multipart) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -1677,6 +1679,8 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) if (persistent && stream.Position != position) stream.Seek (position, SeekOrigin.Begin); + var beginLineNumber = lineNumber; + state = MimeParserState.Headers; toplevel = true; @@ -1690,7 +1694,8 @@ unsafe MimeEntity ParseEntity (byte* inbuf, CancellationToken cancellationToken) var entity = options.CreateEntity (type, headers, false, 0); var entityArgs = new MimeEntityEndEventArgs (entity) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -1763,15 +1768,17 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke toplevel = true; // parse the headers + var beginLineNumber = lineNumber; if (state < MimeParserState.Content && Step (inbuf, cancellationToken) == MimeParserState.Error) throw new FormatException ("Failed to parse message headers."); var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); var messageArgs = new MimeMessageEndEventArgs (message) { - MboxMarkerOffset = mboxMarkerOffset, - MboxMarkerLength = mboxMarkerLength, + MboxMarkerOffset = format == MimeFormat.Mbox ? (long?) mboxMarkerOffset : null, + MboxMarkerLength = format == MimeFormat.Mbox ? (int?) mboxMarkerLength : null, HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeMessageBegin (messageArgs); @@ -1800,7 +1807,8 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var entity = options.CreateEntity (type, headers, true, 0); var entityArgs = new MimeEntityEndEventArgs (entity) { HeadersEndOffset = headerBlockEnd, - BeginOffset = headerBlockBegin + BeginOffset = headerBlockBegin, + LineNumber = beginLineNumber }; OnMimeEntityBegin (entityArgs); @@ -1817,8 +1825,7 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.Octets = entityArgs.Octets; - messageArgs.Lines = entityArgs.Lines; + messageArgs.BodyOctets = entityArgs.Octets; if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index ecefebda26..0b6190bd04 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -602,7 +602,10 @@ class MimeOffsets public long? MboxMarkerBegin { get; set; } [JsonProperty ("mboxMarkerLength", NullValueHandling = NullValueHandling.Ignore)] - public long? MboxMarkerLength { get; set; } + public int? MboxMarkerLength { get; set; } + + [JsonProperty ("lineNumber")] + public int LineNumber { get; set; } [JsonProperty ("begin")] public long Begin { get; set; } @@ -625,8 +628,8 @@ class MimeOffsets [JsonProperty ("octets")] public long Octets { get; set; } - [JsonProperty ("lines")] - public int Lines { get; set; } + [JsonProperty ("lines", NullValueHandling = NullValueHandling.Ignore)] + public int? Lines { get; set; } } static void AssertMimeOffsets (MimeOffsets expected, MimeOffsets actual, int message, string partSpecifier) @@ -635,6 +638,7 @@ static void AssertMimeOffsets (MimeOffsets expected, MimeOffsets actual, int mes Assert.AreEqual (expected.MboxMarkerBegin, actual.MboxMarkerBegin, $"mbox marker begin offset differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.MboxMarkerLength, actual.MboxMarkerLength, $"mbox marker length differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.Begin, actual.Begin, $"begin offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.LineNumber, actual.LineNumber, $"begin line differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.HeadersEnd, actual.HeadersEnd, $"headers end offset differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.End, actual.End, $"end offset differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.Octets, actual.Octets, $"octets differs for message #{message}{partSpecifier}"); @@ -672,6 +676,7 @@ protected override void OnMimeMessageBegin (MimeMessageBeginEventArgs args) { var offsets = new MimeOffsets { Begin = args.BeginOffset, + LineNumber = args.LineNumber }; if (args.Parent != null) { @@ -693,8 +698,7 @@ protected override void OnMimeMessageEnd (MimeMessageEndEventArgs args) if (messages.TryGetValue (args.Message, out var offsets)) { offsets.HeadersEnd = args.HeadersEndOffset; offsets.End = args.EndOffset; - offsets.Octets = args.Octets; - offsets.Lines = args.Lines; + offsets.Octets = args.BodyOctets; offsets.Body = body; } else { Console.WriteLine ("oops?"); @@ -708,6 +712,7 @@ protected override void OnMimeEntityBegin (MimeEntityBeginEventArgs args) var offsets = new MimeOffsets { MimeType = args.Entity.ContentType.MimeType, Begin = args.BeginOffset, + LineNumber = args.LineNumber }; if (args.Parent != null && entities.TryGetValue (args.Parent, out var parentOffsets)) { @@ -1282,7 +1287,7 @@ public void TestLineCountNonTerminatedSingleHeader () var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets[0].Lines; + var lines = parser.Offsets[0].Body.Lines; Assert.AreEqual (0, lines, "Line count"); } @@ -1297,7 +1302,7 @@ public void TestLineCountProperlyTerminatedSingleHeader () var parser = new CustomMimeParser (stream, MimeFormat.Entity); var message = parser.ParseMessage (); - var lines = parser.Offsets[0].Lines; + var lines = parser.Offsets[0].Body.Lines; Assert.AreEqual (0, lines, "Line count"); } diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.json b/UnitTests/TestData/mbox/content-length.dos-offsets.json index 2a35cc6012..4733576d98 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.json +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.json @@ -2,15 +2,18 @@ { "mboxMarkerBegin": 0, "mboxMarkerLength": 7, + "lineNumber": 2, "begin": 9, "headersEnd": 675, "body": { "mimeType": "multipart/mixed", + "lineNumber": 2, "begin": 9, "headersEnd": 675, "children": [ { "mimeType": "text/plain", + "lineNumber": 20, "begin": 725, "headersEnd": 753, "end": 831, @@ -19,13 +22,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 28, "begin": 883, "headersEnd": 948, "message": { + "lineNumber": 31, "begin": 948, "headersEnd": 1747, "body": { "mimeType": "text/plain", + "lineNumber": 31, "begin": 948, "headersEnd": 1747, "end": 1887, @@ -33,8 +39,7 @@ "lines": 4 }, "end": 1887, - "octets": 140, - "lines": 4 + "octets": 140 }, "end": 1887, "octets": 939, @@ -46,28 +51,32 @@ "lines": 34 }, "end": 1939, - "octets": 1264, - "lines": 34 + "octets": 1264 }, { "mboxMarkerBegin": 1941, "mboxMarkerLength": 7, + "lineNumber": 54, "begin": 1950, "headersEnd": 2430, "body": { "mimeType": "multipart/mixed", + "lineNumber": 54, "begin": 1950, "headersEnd": 2430, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 69, "begin": 2506, "headersEnd": 2655, "message": { + "lineNumber": 74, "begin": 2655, "headersEnd": 3095, "body": { "mimeType": "text/plain", + "lineNumber": 74, "begin": 2655, "headersEnd": 3095, "end": 3134, @@ -75,8 +84,7 @@ "lines": 2 }, "end": 3134, - "octets": 39, - "lines": 2 + "octets": 39 }, "end": 3134, "octets": 479, @@ -84,6 +92,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 89, "begin": 3164, "headersEnd": 3291, "end": 3755, @@ -92,6 +101,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 101, "begin": 3785, "headersEnd": 3912, "end": 4404, @@ -100,6 +110,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 113, "begin": 4434, "headersEnd": 4565, "end": 5099, @@ -108,6 +119,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126, "begin": 5129, "headersEnd": 5258, "end": 5762, @@ -116,13 +128,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 138, "begin": 5792, "headersEnd": 5941, "message": { + "lineNumber": 143, "begin": 5941, "headersEnd": 6381, "body": { "mimeType": "text/plain", + "lineNumber": 143, "begin": 5941, "headersEnd": 6381, "end": 6419, @@ -130,8 +145,7 @@ "lines": 1 }, "end": 6419, - "octets": 38, - "lines": 1 + "octets": 38 }, "end": 6419, "octets": 478, @@ -139,27 +153,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 157, "begin": 6449, "headersEnd": 6625, "message": { + "lineNumber": 162, "begin": 6625, "headersEnd": 7210, "body": { "mimeType": "message/rfc822", + "lineNumber": 162, "begin": 6625, "headersEnd": 7210, "message": { + "lineNumber": 177, "begin": 7210, "headersEnd": 7735, "body": { "mimeType": "message/rfc822", + "lineNumber": 177, "begin": 7210, "headersEnd": 7735, "message": { + "lineNumber": 191, "begin": 7735, "headersEnd": 8156, "body": { "mimeType": "text/plain", + "lineNumber": 191, "begin": 7735, "headersEnd": 8156, "end": 8162, @@ -167,24 +188,21 @@ "lines": 1 }, "end": 8162, - "octets": 6, - "lines": 1 + "octets": 6 }, "end": 8162, "octets": 427, "lines": 12 }, "end": 8162, - "octets": 427, - "lines": 12 + "octets": 427 }, "end": 8162, "octets": 952, "lines": 26 }, "end": 8162, - "octets": 952, - "lines": 26 + "octets": 952 }, "end": 8162, "octets": 1537, @@ -192,6 +210,7 @@ }, { "mimeType": "text/html", + "lineNumber": 205, "begin": 8192, "headersEnd": 8248, "end": 8301, @@ -204,28 +223,32 @@ "lines": 145 }, "end": 8331, - "octets": 5901, - "lines": 145 + "octets": 5901 }, { "mboxMarkerBegin": 8333, "mboxMarkerLength": 7, + "lineNumber": 212, "begin": 8342, "headersEnd": 8825, "body": { "mimeType": "multipart/mixed", + "lineNumber": 212, "begin": 8342, "headersEnd": 8825, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 227, "begin": 8901, "headersEnd": 9054, "message": { + "lineNumber": 232, "begin": 9054, "headersEnd": 9493, "body": { "mimeType": "text/plain", + "lineNumber": 232, "begin": 9054, "headersEnd": 9493, "end": 9532, @@ -233,8 +256,7 @@ "lines": 2 }, "end": 9532, - "octets": 39, - "lines": 2 + "octets": 39 }, "end": 9532, "octets": 478, @@ -242,6 +264,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 247, "begin": 9562, "headersEnd": 9693, "end": 10157, @@ -250,6 +273,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 259, "begin": 10187, "headersEnd": 10318, "end": 10810, @@ -258,6 +282,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 271, "begin": 10840, "headersEnd": 10975, "end": 11509, @@ -266,6 +291,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 284, "begin": 11539, "headersEnd": 11672, "end": 12176, @@ -274,13 +300,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 296, "begin": 12206, "headersEnd": 12359, "message": { + "lineNumber": 301, "begin": 12359, "headersEnd": 12798, "body": { "mimeType": "text/plain", + "lineNumber": 301, "begin": 12359, "headersEnd": 12798, "end": 12836, @@ -288,8 +317,7 @@ "lines": 1 }, "end": 12836, - "octets": 38, - "lines": 1 + "octets": 38 }, "end": 12836, "octets": 477, @@ -297,27 +325,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 315, "begin": 12866, "headersEnd": 13046, "message": { + "lineNumber": 320, "begin": 13046, "headersEnd": 13634, "body": { "mimeType": "message/rfc822", + "lineNumber": 320, "begin": 13046, "headersEnd": 13634, "message": { + "lineNumber": 335, "begin": 13634, "headersEnd": 14162, "body": { "mimeType": "message/rfc822", + "lineNumber": 335, "begin": 13634, "headersEnd": 14162, "message": { + "lineNumber": 349, "begin": 14162, "headersEnd": 14582, "body": { "mimeType": "text/plain", + "lineNumber": 349, "begin": 14162, "headersEnd": 14582, "end": 14588, @@ -325,24 +360,21 @@ "lines": 1 }, "end": 14588, - "octets": 6, - "lines": 1 + "octets": 6 }, "end": 14588, "octets": 426, "lines": 12 }, "end": 14588, - "octets": 426, - "lines": 12 + "octets": 426 }, "end": 14588, "octets": 954, "lines": 26 }, "end": 14588, - "octets": 954, - "lines": 26 + "octets": 954 }, "end": 14588, "octets": 1542, @@ -350,6 +382,7 @@ }, { "mimeType": "text/html", + "lineNumber": 363, "begin": 14618, "headersEnd": 14678, "end": 14731, @@ -362,21 +395,23 @@ "lines": 145 }, "end": 14761, - "octets": 5936, - "lines": 145 + "octets": 5936 }, { "mboxMarkerBegin": 14763, "mboxMarkerLength": 31, + "lineNumber": 370, "begin": 14796, "headersEnd": 16325, "body": { "mimeType": "multipart/related", + "lineNumber": 370, "begin": 14796, "headersEnd": 16325, "children": [ { "mimeType": "text/html", + "lineNumber": 398, "begin": 16372, "headersEnd": 16466, "end": 21776, @@ -385,6 +420,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 514, "begin": 21823, "headersEnd": 22028, "end": 22970, @@ -397,21 +433,23 @@ "lines": 139 }, "end": 23019, - "octets": 6694, - "lines": 139 + "octets": 6694 }, { "mboxMarkerBegin": 23021, "mboxMarkerLength": 31, + "lineNumber": 537, "begin": 23054, "headersEnd": 24310, "body": { "mimeType": "multipart/mixed", + "lineNumber": 537, "begin": 23054, "headersEnd": 24310, "children": [ { "mimeType": "text/plain", + "lineNumber": 562, "begin": 24397, "headersEnd": 24476, "end": 24506, @@ -420,18 +458,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 570, "begin": 24547, "headersEnd": 24641, "message": { + "lineNumber": 574, "begin": 24641, "headersEnd": 25478, "body": { "mimeType": "multipart/alternative", + "lineNumber": 574, "begin": 24641, "headersEnd": 25478, "children": [ { "mimeType": "text/plain", + "lineNumber": 592, "begin": 25520, "headersEnd": 25599, "end": 26242, @@ -440,11 +482,13 @@ }, { "mimeType": "multipart/related", + "lineNumber": 613, "begin": 26284, "headersEnd": 26368, "children": [ { "mimeType": "text/html", + "lineNumber": 617, "begin": 26410, "headersEnd": 26488, "end": 27356, @@ -453,6 +497,7 @@ }, { "mimeType": "image/tiff", + "lineNumber": 640, "begin": 27398, "headersEnd": 27587, "end": 781745, @@ -470,8 +515,7 @@ "lines": 10252 }, "end": 781837, - "octets": 756359, - "lines": 10252 + "octets": 756359 }, "end": 781837, "octets": 757196, @@ -483,21 +527,23 @@ "lines": 10285 }, "end": 781880, - "octets": 757570, - "lines": 10285 + "octets": 757570 }, { "mboxMarkerBegin": 781882, "mboxMarkerLength": 31, + "lineNumber": 10846, "begin": 781915, "headersEnd": 783201, "body": { "mimeType": "multipart/related", + "lineNumber": 10846, "begin": 781915, "headersEnd": 783201, "children": [ { "mimeType": "text/html", + "lineNumber": 10870, "begin": 783248, "headersEnd": 783342, "end": 785774, @@ -506,6 +552,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 10925, "begin": 785821, "headersEnd": 785985, "end": 792087, @@ -514,6 +561,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 11011, "begin": 792134, "headersEnd": 792297, "end": 804527, @@ -522,6 +570,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 11175, "begin": 804574, "headersEnd": 804739, "end": 826735, @@ -530,6 +579,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 11464, "begin": 826782, "headersEnd": 826991, "end": 830429, @@ -542,21 +592,23 @@ "lines": 649 }, "end": 830478, - "octets": 47277, - "lines": 649 + "octets": 47277 }, { "mboxMarkerBegin": 830480, "mboxMarkerLength": 7, + "lineNumber": 11519, "begin": 830489, "headersEnd": 831421, "body": { "mimeType": "multipart/mixed", + "lineNumber": 11519, "begin": 830489, "headersEnd": 831421, "children": [ { "mimeType": "text/richtext", + "lineNumber": 11542, "begin": 831432, "headersEnd": 831463, "end": 834089, @@ -569,21 +621,23 @@ "lines": 102 }, "end": 834102, - "octets": 2681, - "lines": 102 + "octets": 2681 }, { "mboxMarkerBegin": 834104, "mboxMarkerLength": 31, + "lineNumber": 11644, "begin": 834137, "headersEnd": 835308, "body": { "mimeType": "multipart/signed", + "lineNumber": 11644, "begin": 834137, "headersEnd": 835308, "children": [ { "mimeType": "text/plain", + "lineNumber": 11663, "begin": 835326, "headersEnd": 835328, "end": 836249, @@ -592,6 +646,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 11686, "begin": 836269, "headersEnd": 836351, "end": 837111, @@ -604,21 +659,23 @@ "lines": 41 }, "end": 837133, - "octets": 1825, - "lines": 41 + "octets": 1825 }, { "mboxMarkerBegin": 837135, "mboxMarkerLength": 31, + "lineNumber": 11705, "begin": 837168, "headersEnd": 838329, "body": { "mimeType": "multipart/mixed", + "lineNumber": 11705, "begin": 837168, "headersEnd": 838329, "children": [ { "mimeType": "text/plain", + "lineNumber": 11728, "begin": 838513, "headersEnd": 838594, "end": 839348, @@ -627,6 +684,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 11746, "begin": 839358, "headersEnd": 839541, "end": 841787, @@ -639,21 +697,23 @@ "lines": 60 }, "end": 841797, - "octets": 3468, - "lines": 60 + "octets": 3468 }, { "mboxMarkerBegin": 841799, "mboxMarkerLength": 31, + "lineNumber": 11785, "begin": 841832, "headersEnd": 842992, "body": { "mimeType": "multipart/mixed", + "lineNumber": 11785, "begin": 841832, "headersEnd": 842992, "children": [ { "mimeType": "text/plain", + "lineNumber": 11812, "begin": 843190, "headersEnd": 843271, "end": 846129, @@ -662,6 +722,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 11863, "begin": 846153, "headersEnd": 846336, "end": 848918, @@ -674,21 +735,23 @@ "lines": 97 }, "end": 848942, - "octets": 5950, - "lines": 97 + "octets": 5950 }, { "mboxMarkerBegin": 848944, "mboxMarkerLength": 31, + "lineNumber": 11906, "begin": 848977, "headersEnd": 849895, "body": { "mimeType": "multipart/signed", + "lineNumber": 11906, "begin": 848977, "headersEnd": 849895, "children": [ { "mimeType": "image/jpeg", + "lineNumber": 11927, "begin": 849971, "headersEnd": 850109, "end": 860977, @@ -697,6 +760,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12079, "begin": 861007, "headersEnd": 861162, "end": 865836, @@ -709,16 +773,17 @@ "lines": 224 }, "end": 865868, - "octets": 15973, - "lines": 224 + "octets": 15973 }, { "mboxMarkerBegin": 865870, "mboxMarkerLength": 31, + "lineNumber": 12150, "begin": 865903, "headersEnd": 867318, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12150, "begin": 865903, "headersEnd": 867318, "end": 868768, @@ -726,21 +791,23 @@ "lines": 20 }, "end": 868768, - "octets": 1450, - "lines": 20 + "octets": 1450 }, { "mboxMarkerBegin": 868770, "mboxMarkerLength": 31, + "lineNumber": 12195, "begin": 868803, "headersEnd": 870180, "body": { "mimeType": "multipart/signed", + "lineNumber": 12195, "begin": 868803, "headersEnd": 870180, "children": [ { "mimeType": "text/plain", + "lineNumber": 12221, "begin": 870227, "headersEnd": 870294, "end": 870404, @@ -749,6 +816,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12229, "begin": 870451, "headersEnd": 870606, "end": 874592, @@ -761,16 +829,17 @@ "lines": 69 }, "end": 874641, - "octets": 4461, - "lines": 69 + "octets": 4461 }, { "mboxMarkerBegin": 874643, "mboxMarkerLength": 31, + "lineNumber": 12290, "begin": 874676, "headersEnd": 875907, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12290, "begin": 874676, "headersEnd": 875907, "end": 879457, @@ -778,16 +847,17 @@ "lines": 55 }, "end": 879457, - "octets": 3550, - "lines": 55 + "octets": 3550 }, { "mboxMarkerBegin": 879459, "mboxMarkerLength": 31, + "lineNumber": 12368, "begin": 879492, "headersEnd": 880590, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12368, "begin": 879492, "headersEnd": 880590, "end": 881260, @@ -795,23 +865,26 @@ "lines": 10 }, "end": 881260, - "octets": 670, - "lines": 10 + "octets": 670 }, { "mboxMarkerBegin": 881262, "mboxMarkerLength": 31, + "lineNumber": 12400, "begin": 881295, "headersEnd": 882097, "body": { "mimeType": "message/rfc822", + "lineNumber": 12400, "begin": 881295, "headersEnd": 882097, "message": { + "lineNumber": 12419, "begin": 882097, "headersEnd": 883500, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12419, "begin": 882097, "headersEnd": 883500, "end": 884952, @@ -819,29 +892,30 @@ "lines": 20 }, "end": 884952, - "octets": 1452, - "lines": 20 + "octets": 1452 }, "end": 884952, "octets": 2855, "lines": 43 }, "end": 884952, - "octets": 2855, - "lines": 43 + "octets": 2855 }, { "mboxMarkerBegin": 884954, "mboxMarkerLength": 31, + "lineNumber": 12464, "begin": 884987, "headersEnd": 885714, "body": { "mimeType": "multipart/mixed", + "lineNumber": 12464, "begin": 884987, "headersEnd": 885714, "children": [ { "mimeType": "text/plain", + "lineNumber": 12484, "begin": 885790, "headersEnd": 885869, "end": 885885, @@ -850,13 +924,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 12490, "begin": 885915, "headersEnd": 886073, "message": { + "lineNumber": 12494, "begin": 886073, "headersEnd": 887476, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12494, "begin": 886073, "headersEnd": 887476, "end": 888928, @@ -864,8 +941,7 @@ "lines": 20 }, "end": 888928, - "octets": 1452, - "lines": 20 + "octets": 1452 }, "end": 888928, "octets": 2855, @@ -877,21 +953,23 @@ "lines": 58 }, "end": 888960, - "octets": 3246, - "lines": 58 + "octets": 3246 }, { "mboxMarkerBegin": 888962, "mboxMarkerLength": 31, + "lineNumber": 12541, "begin": 888995, "headersEnd": 889676, "body": { "mimeType": "multipart/signed", + "lineNumber": 12541, "begin": 888995, "headersEnd": 889676, "children": [ { "mimeType": "text/plain", + "lineNumber": 12560, "begin": 889780, "headersEnd": 889859, "end": 889901, @@ -900,6 +978,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12566, "begin": 889945, "headersEnd": 890100, "end": 895732, @@ -912,16 +991,17 @@ "lines": 91 }, "end": 895778, - "octets": 6102, - "lines": 91 + "octets": 6102 }, { "mboxMarkerBegin": 895780, "mboxMarkerLength": 31, + "lineNumber": 12650, "begin": 895813, "headersEnd": 896896, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12650, "begin": 895813, "headersEnd": 896896, "end": 907272, @@ -929,21 +1009,23 @@ "lines": 141 }, "end": 907272, - "octets": 10376, - "lines": 141 + "octets": 10376 }, { "mboxMarkerBegin": 907274, "mboxMarkerLength": 31, + "lineNumber": 12813, "begin": 907307, "headersEnd": 908707, "body": { "mimeType": "multipart/signed", + "lineNumber": 12813, "begin": 907307, "headersEnd": 908707, "children": [ { "mimeType": "text/plain", + "lineNumber": 12840, "begin": 908811, "headersEnd": 908890, "end": 909517, @@ -952,6 +1034,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12861, "begin": 909561, "headersEnd": 909716, "end": 911528, @@ -964,16 +1047,17 @@ "lines": 54 }, "end": 911574, - "octets": 2867, - "lines": 54 + "octets": 2867 }, { "mboxMarkerBegin": 911576, "mboxMarkerLength": 31, + "lineNumber": 12893, "begin": 911609, "headersEnd": 912172, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12893, "begin": 911609, "headersEnd": 912172, "end": 912702, @@ -981,16 +1065,17 @@ "lines": 8 }, "end": 912702, - "octets": 530, - "lines": 8 + "octets": 530 }, { "mboxMarkerBegin": 912704, "mboxMarkerLength": 31, + "lineNumber": 12917, "begin": 912737, "headersEnd": 913972, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12917, "begin": 912737, "headersEnd": 913972, "end": 916892, @@ -998,16 +1083,17 @@ "lines": 38 }, "end": 916892, - "octets": 2920, - "lines": 38 + "octets": 2920 }, { "mboxMarkerBegin": 916894, "mboxMarkerLength": 31, + "lineNumber": 12977, "begin": 916927, "headersEnd": 918106, "body": { "mimeType": "Application/x-pkcs7-mime", + "lineNumber": 12977, "begin": 916927, "headersEnd": 918106, "end": 920258, @@ -1015,21 +1101,23 @@ "lines": 30 }, "end": 920258, - "octets": 2152, - "lines": 30 + "octets": 2152 }, { "mboxMarkerBegin": 920260, "mboxMarkerLength": 31, + "lineNumber": 13030, "begin": 920293, "headersEnd": 921392, "body": { "mimeType": "multipart/signed", + "lineNumber": 13030, "begin": 920293, "headersEnd": 921392, "children": [ { "mimeType": "text/plain", + "lineNumber": 13053, "begin": 921427, "headersEnd": 921494, "end": 921494, @@ -1038,6 +1126,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13058, "begin": 921529, "headersEnd": 921611, "end": 924365, @@ -1050,21 +1139,23 @@ "lines": 53 }, "end": 924402, - "octets": 3010, - "lines": 53 + "octets": 3010 }, { "mboxMarkerBegin": 924404, "mboxMarkerLength": 31, + "lineNumber": 13106, "begin": 924437, "headersEnd": 925493, "body": { "mimeType": "multipart/mixed", + "lineNumber": 13106, "begin": 924437, "headersEnd": 925493, "children": [ { "mimeType": "text/plain", + "lineNumber": 13127, "begin": 925536, "headersEnd": 925617, "end": 926083, @@ -1073,6 +1164,7 @@ }, { "mimeType": "text/html", + "lineNumber": 13145, "begin": 926126, "headersEnd": 926204, "end": 927041, @@ -1081,6 +1173,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13176, "begin": 927084, "headersEnd": 927184, "end": 928400, @@ -1093,21 +1186,23 @@ "lines": 72 }, "end": 928445, - "octets": 2952, - "lines": 72 + "octets": 2952 }, { "mboxMarkerBegin": 928447, "mboxMarkerLength": 31, + "lineNumber": 13199, "begin": 928480, "headersEnd": 929576, "body": { "mimeType": "multipart/signed", + "lineNumber": 13199, "begin": 928480, "headersEnd": 929576, "children": [ { "mimeType": "text/plain", + "lineNumber": 13222, "begin": 929621, "headersEnd": 929694, "end": 929853, @@ -1116,6 +1211,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13234, "begin": 929898, "headersEnd": 929980, "end": 934132, @@ -1128,21 +1224,23 @@ "lines": 75 }, "end": 934179, - "octets": 4603, - "lines": 75 + "octets": 4603 }, { "mboxMarkerBegin": 934181, "mboxMarkerLength": 31, + "lineNumber": 13297, "begin": 934214, "headersEnd": 935337, "body": { "mimeType": "multipart/signed", + "lineNumber": 13297, "begin": 934214, "headersEnd": 935337, "children": [ { "mimeType": "text/plain", + "lineNumber": 13320, "begin": 935373, "headersEnd": 935454, "end": 935532, @@ -1151,6 +1249,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13329, "begin": 935568, "headersEnd": 935650, "end": 939424, @@ -1163,21 +1262,23 @@ "lines": 73 }, "end": 939460, - "octets": 4123, - "lines": 73 + "octets": 4123 }, { "mboxMarkerBegin": 939462, "mboxMarkerLength": 31, + "lineNumber": 13392, "begin": 939495, "headersEnd": 940640, "body": { "mimeType": "multipart/report", + "lineNumber": 13392, "begin": 939495, "headersEnd": 940640, "children": [ { "mimeType": "message/delivery-status", + "lineNumber": 13414, "begin": 940782, "headersEnd": 940823, "end": 941017, @@ -1186,13 +1287,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 13424, "begin": 941044, "headersEnd": 941076, "message": { + "lineNumber": 13426, "begin": 941076, "headersEnd": 941897, "body": { "mimeType": "text/plain", + "lineNumber": 13426, "begin": 941076, "headersEnd": 941897, "end": 941908, @@ -1200,8 +1304,7 @@ "lines": 1 }, "end": 941908, - "octets": 11, - "lines": 1 + "octets": 11 }, "end": 941908, "octets": 832, @@ -1213,21 +1316,23 @@ "lines": 34 }, "end": 941937, - "octets": 1297, - "lines": 34 + "octets": 1297 }, { "mboxMarkerBegin": 941939, "mboxMarkerLength": 31, + "lineNumber": 13445, "begin": 941972, "headersEnd": 943868, "body": { "mimeType": "multipart/mixed", + "lineNumber": 13445, "begin": 941972, "headersEnd": 943868, "children": [ { "mimeType": "text/plain", + "lineNumber": 13477, "begin": 943913, "headersEnd": 943994, "end": 944875, @@ -1236,6 +1341,7 @@ }, { "mimeType": "application/vcard", + "lineNumber": 13500, "begin": 944922, "headersEnd": 945088, "end": 948790, @@ -1248,7 +1354,6 @@ "lines": 92 }, "end": 948839, - "octets": 4971, - "lines": 92 + "octets": 4971 } ] \ No newline at end of file diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.json b/UnitTests/TestData/mbox/jwz.dos-offsets.json index ccdbf9e3e5..0cc7f4609b 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.json +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.json @@ -2,20 +2,24 @@ { "mboxMarkerBegin": 0, "mboxMarkerLength": 7, + "lineNumber": 2, "begin": 9, "headersEnd": 531, "body": { "mimeType": "multipart/mixed", + "lineNumber": 2, "begin": 9, "headersEnd": 531, "children": [ { "mimeType": "multipart/parallel", + "lineNumber": 16, "begin": 549, "headersEnd": 648, "children": [ { "mimeType": "text/plain", + "lineNumber": 20, "begin": 680, "headersEnd": 682, "end": 1413, @@ -24,6 +28,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 39, "begin": 1447, "headersEnd": 1535, "end": 33007, @@ -37,11 +42,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 472, "begin": 33061, "headersEnd": 33157, "children": [ { "mimeType": "image/gif", + "lineNumber": 476, "begin": 33189, "headersEnd": 33275, "end": 59275, @@ -50,6 +57,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 834, "begin": 59309, "headersEnd": 59395, "end": 78061, @@ -58,6 +66,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 1093, "begin": 78095, "headersEnd": 78212, "end": 124337, @@ -66,6 +75,7 @@ }, { "mimeType": "application/atomicmail", + "lineNumber": 3534, "begin": 124371, "headersEnd": 124435, "end": 133638, @@ -79,6 +89,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 3897, "begin": 133692, "headersEnd": 133780, "end": 181602, @@ -91,16 +102,17 @@ "lines": 4535 }, "end": 181624, - "octets": 181093, - "lines": 4535 + "octets": 181093 }, { "mboxMarkerBegin": 181626, "mboxMarkerLength": 7, + "lineNumber": 4552, "begin": 181635, "headersEnd": 182198, "body": { "mimeType": "audio/basic", + "lineNumber": 4552, "begin": 181635, "headersEnd": 182198, "end": 319322, @@ -108,16 +120,17 @@ "lines": 1854 }, "end": 319322, - "octets": 137124, - "lines": 1854 + "octets": 137124 }, { "mboxMarkerBegin": 319324, "mboxMarkerLength": 7, + "lineNumber": 6422, "begin": 319333, "headersEnd": 319720, "body": { "mimeType": "text/plain", + "lineNumber": 6422, "begin": 319333, "headersEnd": 319720, "end": 319924, @@ -125,21 +138,23 @@ "lines": 4 }, "end": 319924, - "octets": 204, - "lines": 4 + "octets": 204 }, { "mboxMarkerBegin": 319926, "mboxMarkerLength": 7, + "lineNumber": 6435, "begin": 319935, "headersEnd": 320596, "body": { "mimeType": "multipart/alternative", + "lineNumber": 6435, "begin": 319935, "headersEnd": 320596, "children": [ { "mimeType": "text/plain", + "lineNumber": 6454, "begin": 320795, "headersEnd": 320841, "end": 321080, @@ -148,11 +163,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 6464, "begin": 321123, "headersEnd": 321211, "children": [ { "mimeType": "text/richtext", + "lineNumber": 6468, "begin": 321254, "headersEnd": 321348, "end": 321497, @@ -161,6 +178,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 6476, "begin": 321542, "headersEnd": 321656, "end": 326088, @@ -169,6 +187,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 6546, "begin": 326133, "headersEnd": 326227, "end": 326275, @@ -186,21 +205,23 @@ "lines": 106 }, "end": 326365, - "octets": 5769, - "lines": 106 + "octets": 5769 }, { "mboxMarkerBegin": 326367, "mboxMarkerLength": 7, + "lineNumber": 6557, "begin": 326376, "headersEnd": 327141, "body": { "mimeType": "multipart/mixed", + "lineNumber": 6557, "begin": 326376, "headersEnd": 327141, "children": [ { "mimeType": "text/richtext", + "lineNumber": 6579, "begin": 327403, "headersEnd": 327479, "end": 327915, @@ -209,18 +230,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 6596, "begin": 327980, "headersEnd": 328012, "message": { + "lineNumber": 6598, "begin": 328012, "headersEnd": 328864, "body": { "mimeType": "multipart/mixed", + "lineNumber": 6598, "begin": 328012, "headersEnd": 328864, "children": [ { "mimeType": "text/plain", + "lineNumber": 6623, "begin": 329179, "headersEnd": 329276, "end": 329386, @@ -229,6 +254,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 6634, "begin": 329419, "headersEnd": 329511, "end": 350421, @@ -237,6 +263,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 6922, "begin": 350454, "headersEnd": 350454, "end": 350454, @@ -249,8 +276,7 @@ "lines": 308 }, "end": 350454, - "octets": 21590, - "lines": 308 + "octets": 21590 }, "end": 350454, "octets": 22442, @@ -258,6 +284,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 6924, "begin": 350519, "headersEnd": 350595, "end": 350706, @@ -270,21 +297,23 @@ "lines": 359 }, "end": 350773, - "octets": 23632, - "lines": 359 + "octets": 23632 }, { "mboxMarkerBegin": 350775, "mboxMarkerLength": 7, + "lineNumber": 6935, "begin": 350784, "headersEnd": 351518, "body": { "mimeType": "multipart/alternative", + "lineNumber": 6935, "begin": 350784, "headersEnd": 351518, "children": [ { "mimeType": "text/plain", + "lineNumber": 6955, "begin": 351717, "headersEnd": 351763, "end": 352541, @@ -293,11 +322,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 6977, "begin": 352584, "headersEnd": 352672, "children": [ { "mimeType": "text/richtext", + "lineNumber": 6981, "begin": 352715, "headersEnd": 352809, "end": 353038, @@ -306,6 +337,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 6990, "begin": 353083, "headersEnd": 353195, "end": 1037241, @@ -314,6 +346,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 15978, "begin": 1037286, "headersEnd": 1037380, "end": 1037501, @@ -322,6 +355,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 15988, "begin": 1037546, "headersEnd": 1037676, "end": 1727872, @@ -330,6 +364,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 25054, "begin": 1727917, "headersEnd": 1728011, "end": 1728023, @@ -338,6 +373,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 25061, "begin": 1728068, "headersEnd": 1728189, "end": 1797301, @@ -346,6 +382,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 26001, "begin": 1797346, "headersEnd": 1797440, "end": 1797583, @@ -354,6 +391,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 26011, "begin": 1797628, "headersEnd": 1797750, "end": 2138984, @@ -362,6 +400,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 30489, "begin": 2139029, "headersEnd": 2139123, "end": 2139129, @@ -379,16 +418,17 @@ "lines": 23546 }, "end": 2139219, - "octets": 1787701, - "lines": 23546 + "octets": 1787701 }, { "mboxMarkerBegin": 2139221, "mboxMarkerLength": 7, + "lineNumber": 30498, "begin": 2139230, "headersEnd": 2140267, "body": { "mimeType": "text/plain", + "lineNumber": 30498, "begin": 2139230, "headersEnd": 2140267, "end": 2141431, @@ -396,21 +436,23 @@ "lines": 39 }, "end": 2141431, - "octets": 1164, - "lines": 39 + "octets": 1164 }, { "mboxMarkerBegin": 2141433, "mboxMarkerLength": 7, + "lineNumber": 30560, "begin": 2141442, "headersEnd": 2141689, "body": { "mimeType": "multipart/mixed", + "lineNumber": 30560, "begin": 2141442, "headersEnd": 2141689, "children": [ { "mimeType": "text/plain", + "lineNumber": 30570, "begin": 2141705, "headersEnd": 2141707, "end": 2142012, @@ -419,11 +461,13 @@ }, { "mimeType": "multipart/parallel", + "lineNumber": 30578, "begin": 2142030, "headersEnd": 2142109, "children": [ { "mimeType": "image/gif", + "lineNumber": 30582, "begin": 2142126, "headersEnd": 2142207, "end": 2145483, @@ -432,6 +476,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 30604, "begin": 2145502, "headersEnd": 2145610, "end": 2302316, @@ -445,6 +490,7 @@ }, { "mimeType": "application/atomicmail", + "lineNumber": 31419, "begin": 2302353, "headersEnd": 2302412, "end": 2307327, @@ -457,16 +503,17 @@ "lines": 1050 }, "end": 2307345, - "octets": 165656, - "lines": 1050 + "octets": 165656 }, { "mboxMarkerBegin": 2307347, "mboxMarkerLength": 7, + "lineNumber": 31620, "begin": 2307356, "headersEnd": 2308328, "body": { "mimeType": "audio/basic", + "lineNumber": 31620, "begin": 2307356, "headersEnd": 2308328, "end": 2655844, @@ -474,26 +521,29 @@ "lines": 4456 }, "end": 2655844, - "octets": 347516, - "lines": 4456 + "octets": 347516 }, { "mboxMarkerBegin": 2655846, "mboxMarkerLength": 7, + "lineNumber": 36098, "begin": 2655855, "headersEnd": 2655994, "body": { "mimeType": "multipart/mixed", + "lineNumber": 36098, "begin": 2655855, "headersEnd": 2655994, "children": [ { "mimeType": "multipart/parallel", + "lineNumber": 36104, "begin": 2656012, "headersEnd": 2656087, "children": [ { "mimeType": "text/plain", + "lineNumber": 36107, "begin": 2656119, "headersEnd": 2656121, "end": 2656845, @@ -502,6 +552,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 36127, "begin": 2656879, "headersEnd": 2656980, "end": 2688452, @@ -519,16 +570,17 @@ "lines": 457 }, "end": 2688506, - "octets": 32512, - "lines": 457 + "octets": 32512 }, { "mboxMarkerBegin": 2688508, "mboxMarkerLength": 7, + "lineNumber": 36561, "begin": 2688517, "headersEnd": 2689088, "body": { "mimeType": "image/pbm", + "lineNumber": 36561, "begin": 2688517, "headersEnd": 2689088, "end": 2746649, @@ -536,21 +588,23 @@ "lines": 782 }, "end": 2746649, - "octets": 57561, - "lines": 782 + "octets": 57561 }, { "mboxMarkerBegin": 2746651, "mboxMarkerLength": 7, + "lineNumber": 37359, "begin": 2746660, "headersEnd": 2747410, "body": { "mimeType": "multipart/alternative", + "lineNumber": 37359, "begin": 2746660, "headersEnd": 2747410, "children": [ { "mimeType": "text/plain", + "lineNumber": 37385, "begin": 2748003, "headersEnd": 2748005, "end": 2748571, @@ -559,11 +613,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 37402, "begin": 2748632, "headersEnd": 2748738, "children": [ { "mimeType": "text/richtext", + "lineNumber": 37406, "begin": 2748799, "headersEnd": 2748875, "end": 2749301, @@ -572,6 +628,7 @@ }, { "mimeType": "image/xwd", + "lineNumber": 37418, "begin": 2749364, "headersEnd": 2749426, "end": 2779088, @@ -580,6 +637,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 37824, "begin": 2779151, "headersEnd": 2779224, "end": 2779269, @@ -597,21 +655,23 @@ "lines": 459 }, "end": 2779395, - "octets": 31985, - "lines": 459 + "octets": 31985 }, { "mboxMarkerBegin": 2779397, "mboxMarkerLength": 7, + "lineNumber": 37836, "begin": 2779406, "headersEnd": 2780075, "body": { "mimeType": "multipart/alternative", + "lineNumber": 37836, "begin": 2779406, "headersEnd": 2780075, "children": [ { "mimeType": "text/plain", + "lineNumber": 37860, "begin": 2780452, "headersEnd": 2780454, "end": 2781302, @@ -620,11 +680,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 37890, "begin": 2781334, "headersEnd": 2781410, "children": [ { "mimeType": "text/plain", + "lineNumber": 37894, "begin": 2781442, "headersEnd": 2781470, "end": 2781612, @@ -633,6 +695,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 37903, "begin": 2781646, "headersEnd": 2781714, "end": 2782928, @@ -641,6 +704,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 37925, "begin": 2782962, "headersEnd": 2782990, "end": 2783058, @@ -649,6 +713,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 37929, "begin": 2783092, "headersEnd": 2783160, "end": 2784382, @@ -657,6 +722,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 37951, "begin": 2784416, "headersEnd": 2784447, "end": 2785006, @@ -674,16 +740,17 @@ "lines": 118 }, "end": 2785076, - "octets": 5001, - "lines": 118 + "octets": 5001 }, { "mboxMarkerBegin": 2785078, "mboxMarkerLength": 7, + "lineNumber": 37972, "begin": 2785087, "headersEnd": 2786084, "body": { "mimeType": "text/plain", + "lineNumber": 37972, "begin": 2785087, "headersEnd": 2786084, "end": 2787498, @@ -691,16 +758,17 @@ "lines": 32 }, "end": 2787498, - "octets": 1414, - "lines": 32 + "octets": 1414 }, { "mboxMarkerBegin": 2787500, "mboxMarkerLength": 7, + "lineNumber": 38027, "begin": 2787509, "headersEnd": 2787772, "body": { "mimeType": "text/plain", + "lineNumber": 38027, "begin": 2787509, "headersEnd": 2787772, "end": 2788033, @@ -708,16 +776,17 @@ "lines": 6 }, "end": 2788033, - "octets": 261, - "lines": 6 + "octets": 261 }, { "mboxMarkerBegin": 2788035, "mboxMarkerLength": 7, + "lineNumber": 38041, "begin": 2788044, "headersEnd": 2788716, "body": { "mimeType": "text/plain", + "lineNumber": 38041, "begin": 2788044, "headersEnd": 2788716, "end": 2789453, @@ -725,21 +794,23 @@ "lines": 14 }, "end": 2789453, - "octets": 737, - "lines": 14 + "octets": 737 }, { "mboxMarkerBegin": 2789455, "mboxMarkerLength": 7, + "lineNumber": 38071, "begin": 2789464, "headersEnd": 2790463, "body": { "mimeType": "multipart/mixed", + "lineNumber": 38071, "begin": 2789464, "headersEnd": 2790463, "children": [ { "mimeType": "text/plain", + "lineNumber": 38088, "begin": 2790507, "headersEnd": 2790555, "end": 2790632, @@ -748,11 +819,13 @@ }, { "mimeType": "multipart/appledouble", + "lineNumber": 38097, "begin": 2790674, "headersEnd": 2790763, "children": [ { "mimeType": "application/applefile", + "lineNumber": 38102, "begin": 2790808, "headersEnd": 2790967, "end": 2857841, @@ -761,6 +834,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 39065, "begin": 2857884, "headersEnd": 2858099, "end": 3227661, @@ -778,21 +852,23 @@ "lines": 6272 }, "end": 3227750, - "octets": 437287, - "lines": 6272 + "octets": 437287 }, { "mboxMarkerBegin": 3227752, "mboxMarkerLength": 7, + "lineNumber": 44358, "begin": 3227761, "headersEnd": 3228760, "body": { "mimeType": "multipart/mixed", + "lineNumber": 44358, "begin": 3227761, "headersEnd": 3228760, "children": [ { "mimeType": "text/plain", + "lineNumber": 44375, "begin": 3228804, "headersEnd": 3228852, "end": 3228929, @@ -801,11 +877,13 @@ }, { "mimeType": "multipart/header-set", + "lineNumber": 44384, "begin": 3228971, "headersEnd": 3229059, "children": [ { "mimeType": "application/applefile", + "lineNumber": 44389, "begin": 3229104, "headersEnd": 3229263, "end": 3296137, @@ -814,6 +892,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 45352, "begin": 3296180, "headersEnd": 3296395, "end": 3665957, @@ -831,23 +910,26 @@ "lines": 6272 }, "end": 3666046, - "octets": 437286, - "lines": 6272 + "octets": 437286 }, { "mboxMarkerBegin": 3666048, "mboxMarkerLength": 7, + "lineNumber": 50645, "begin": 3666057, "headersEnd": 3666630, "body": { "mimeType": "Message/rfc822", + "lineNumber": 50645, "begin": 3666057, "headersEnd": 3666630, "message": { + "lineNumber": 50660, "begin": 3666630, "headersEnd": 3666692, "body": { "mimeType": "text/plain", + "lineNumber": 50660, "begin": 3666630, "headersEnd": 3666692, "end": 3667232, @@ -855,29 +937,30 @@ "lines": 14 }, "end": 3667232, - "octets": 540, - "lines": 14 + "octets": 540 }, "end": 3667232, "octets": 602, "lines": 17 }, "end": 3667232, - "octets": 602, - "lines": 17 + "octets": 602 }, { "mboxMarkerBegin": 3667234, "mboxMarkerLength": 7, + "lineNumber": 50678, "begin": 3667243, "headersEnd": 3667974, "body": { "mimeType": "multipart/mixed", + "lineNumber": 50678, "begin": 3667243, "headersEnd": 3667974, "children": [ { "mimeType": "text/plain", + "lineNumber": 50698, "begin": 3668020, "headersEnd": 3668048, "end": 3668234, @@ -886,6 +969,7 @@ }, { "mimeType": "application/postscript", + "lineNumber": 50708, "begin": 3668280, "headersEnd": 3668355, "end": 3669259, @@ -898,21 +982,23 @@ "lines": 33 }, "end": 3669418, - "octets": 1444, - "lines": 33 + "octets": 1444 }, { "mboxMarkerBegin": 3669420, "mboxMarkerLength": 7, + "lineNumber": 50731, "begin": 3669429, "headersEnd": 3669982, "body": { "mimeType": "multipart/mixed", + "lineNumber": 50731, "begin": 3669429, "headersEnd": 3669982, "children": [ { "mimeType": "text/plain", + "lineNumber": 50748, "begin": 3670061, "headersEnd": 3670063, "end": 3670465, @@ -921,13 +1007,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 50761, "begin": 3670507, "headersEnd": 3670539, "message": { + "lineNumber": 50763, "begin": 3670539, "headersEnd": 3671342, "body": { "mimeType": "text/plain", + "lineNumber": 50763, "begin": 3670539, "headersEnd": 3671342, "end": 3674767, @@ -935,8 +1024,7 @@ "lines": 72 }, "end": 3674767, - "octets": 3425, - "lines": 72 + "octets": 3425 }, "end": 3674767, "octets": 4228, @@ -948,21 +1036,23 @@ "lines": 108 }, "end": 3674811, - "octets": 4829, - "lines": 108 + "octets": 4829 }, { "mboxMarkerBegin": 3674813, "mboxMarkerLength": 7, + "lineNumber": 50855, "begin": 3674822, "headersEnd": 3675488, "body": { "mimeType": "multipart/mixed", + "lineNumber": 50855, "begin": 3674822, "headersEnd": 3675488, "children": [ { "mimeType": "text/plain", + "lineNumber": 50873, "begin": 3675538, "headersEnd": 3675566, "end": 3675644, @@ -971,13 +1061,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 50881, "begin": 3675696, "headersEnd": 3675761, "message": { + "lineNumber": 50884, "begin": 3675761, "headersEnd": 3676560, "body": { "mimeType": "text/plain", + "lineNumber": 50884, "begin": 3675761, "headersEnd": 3676560, "end": 3676700, @@ -985,8 +1078,7 @@ "lines": 4 }, "end": 3676700, - "octets": 140, - "lines": 4 + "octets": 140 }, "end": 3676700, "octets": 939, @@ -998,16 +1090,17 @@ "lines": 34 }, "end": 3676752, - "octets": 1264, - "lines": 34 + "octets": 1264 }, { "mboxMarkerBegin": 3676754, "mboxMarkerLength": 7, + "lineNumber": 50907, "begin": 3676763, "headersEnd": 3677286, "body": { "mimeType": "Application/octet-stream", + "lineNumber": 50907, "begin": 3676763, "headersEnd": 3677286, "end": 3678750, @@ -1015,16 +1108,17 @@ "lines": 45 }, "end": 3678750, - "octets": 1464, - "lines": 45 + "octets": 1464 }, { "mboxMarkerBegin": 3678752, "mboxMarkerLength": 50, + "lineNumber": 50967, "begin": 3678804, "headersEnd": 3679391, "body": { "mimeType": "message/partial", + "lineNumber": 50967, "begin": 3678804, "headersEnd": 3679391, "end": 3740046, @@ -1032,16 +1126,17 @@ "lines": 954 }, "end": 3740046, - "octets": 60655, - "lines": 954 + "octets": 60655 }, { "mboxMarkerBegin": 3740048, "mboxMarkerLength": 50, + "lineNumber": 51938, "begin": 3740100, "headersEnd": 3740684, "body": { "mimeType": "message/partial", + "lineNumber": 51938, "begin": 3740100, "headersEnd": 3740684, "end": 3801451, @@ -1049,21 +1144,23 @@ "lines": 960 }, "end": 3801451, - "octets": 60767, - "lines": 960 + "octets": 60767 }, { "mboxMarkerBegin": 3801453, "mboxMarkerLength": 7, + "lineNumber": 52915, "begin": 3801462, "headersEnd": 3802023, "body": { "mimeType": "multipart/mixed", + "lineNumber": 52915, "begin": 3801462, "headersEnd": 3802023, "children": [ { "mimeType": "text/plain", + "lineNumber": 52930, "begin": 3802041, "headersEnd": 3802070, "end": 3802145, @@ -1072,6 +1169,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 52938, "begin": 3802163, "headersEnd": 3802247, "end": 3802897, @@ -1084,16 +1182,17 @@ "lines": 25 }, "end": 3802919, - "octets": 896, - "lines": 25 + "octets": 896 }, { "mboxMarkerBegin": 3802921, "mboxMarkerLength": 7, + "lineNumber": 52955, "begin": 3802930, "headersEnd": 3803695, "body": { "mimeType": "image/gif", + "lineNumber": 52955, "begin": 3802930, "headersEnd": 3803695, "end": 3845795, @@ -1101,21 +1200,23 @@ "lines": 570 }, "end": 3845795, - "octets": 42100, - "lines": 570 + "octets": 42100 }, { "mboxMarkerBegin": 3845797, "mboxMarkerLength": 7, + "lineNumber": 53545, "begin": 3845806, "headersEnd": 3846985, "body": { "mimeType": "multipart/mixed", + "lineNumber": 53545, "begin": 3845806, "headersEnd": 3846985, "children": [ { "mimeType": "text/plain", + "lineNumber": 53571, "begin": 3846991, "headersEnd": 3846993, "end": 3848958, @@ -1124,6 +1225,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 53617, "begin": 3848966, "headersEnd": 3849075, "end": 3855383, @@ -1136,16 +1238,17 @@ "lines": 139 }, "end": 3855393, - "octets": 8408, - "lines": 139 + "octets": 8408 }, { "mboxMarkerBegin": 3855395, "mboxMarkerLength": 7, + "lineNumber": 53711, "begin": 3855404, "headersEnd": 3856880, "body": { "mimeType": "application/octet-stream", + "lineNumber": 53711, "begin": 3855404, "headersEnd": 3856880, "end": 3965263, @@ -1153,42 +1256,50 @@ "lines": 1570 }, "end": 3965263, - "octets": 108383, - "lines": 1570 + "octets": 108383 }, { "mboxMarkerBegin": 3965265, "mboxMarkerLength": 7, + "lineNumber": 55311, "begin": 3965274, "headersEnd": 3965889, "body": { "mimeType": "message/rfc822", + "lineNumber": 55311, "begin": 3965274, "headersEnd": 3965889, "message": { + "lineNumber": 55327, "begin": 3965889, "headersEnd": 3966475, "body": { "mimeType": "message/rfc822", + "lineNumber": 55327, "begin": 3965889, "headersEnd": 3966475, "message": { + "lineNumber": 55343, "begin": 3966475, "headersEnd": 3967033, "body": { "mimeType": "message/rfc822", + "lineNumber": 55343, "begin": 3966475, "headersEnd": 3967033, "message": { + "lineNumber": 55359, "begin": 3967033, "headersEnd": 3967597, "body": { "mimeType": "multipart/mixed", + "lineNumber": 55359, "begin": 3967033, "headersEnd": 3967597, "children": [ { "mimeType": "text/plain", + "lineNumber": 55378, "begin": 3967704, "headersEnd": 3967783, "end": 3967833, @@ -1197,18 +1308,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 55384, "begin": 3967894, "headersEnd": 3967959, "message": { + "lineNumber": 55387, "begin": 3967959, "headersEnd": 3968475, "body": { "mimeType": "multipart/mixed", + "lineNumber": 55387, "begin": 3967959, "headersEnd": 3968475, "children": [ { "mimeType": "text/plain", + "lineNumber": 55406, "begin": 3968572, "headersEnd": 3968651, "end": 3968778, @@ -1217,6 +1332,7 @@ }, { "mimeType": "text/html", + "lineNumber": 55416, "begin": 3968829, "headersEnd": 3968901, "end": 3969188, @@ -1229,8 +1345,7 @@ "lines": 22 }, "end": 3969241, - "octets": 766, - "lines": 22 + "octets": 766 }, "end": 3969241, "octets": 1282, @@ -1242,45 +1357,44 @@ "lines": 54 }, "end": 3969308, - "octets": 1711, - "lines": 54 + "octets": 1711 }, "end": 3969308, "octets": 2275, "lines": 70 }, "end": 3969308, - "octets": 2275, - "lines": 70 + "octets": 2275 }, "end": 3969308, "octets": 2833, "lines": 86 }, "end": 3969308, - "octets": 2833, - "lines": 86 + "octets": 2833 }, "end": 3969308, "octets": 3419, "lines": 102 }, "end": 3969308, - "octets": 3419, - "lines": 102 + "octets": 3419 }, { "mboxMarkerBegin": 3969310, "mboxMarkerLength": 7, + "lineNumber": 55431, "begin": 3969319, "headersEnd": 3970038, "body": { "mimeType": "multipart/mixed", + "lineNumber": 55431, "begin": 3969319, "headersEnd": 3970038, "children": [ { "mimeType": "text/plain", + "lineNumber": 55448, "begin": 3970066, "headersEnd": 3970068, "end": 3970110, @@ -1289,6 +1403,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 55452, "begin": 3970140, "headersEnd": 3970290, "end": 4047906, @@ -1297,6 +1412,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 55859, "begin": 4047936, "headersEnd": 4047938, "end": 4047972, @@ -1305,6 +1421,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 55865, "begin": 4048002, "headersEnd": 4048154, "end": 4151890, @@ -1313,6 +1430,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 56406, "begin": 4151920, "headersEnd": 4151922, "end": 4152086, @@ -1321,6 +1439,7 @@ }, { "mimeType": "application/x-annotate", + "lineNumber": 56413, "begin": 4152116, "headersEnd": 4152208, "end": 4233632, @@ -1329,6 +1448,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 57652, "begin": 4233662, "headersEnd": 4233664, "end": 4233686, @@ -1341,16 +1461,17 @@ "lines": 2210 }, "end": 4233718, - "octets": 263680, - "lines": 2210 + "octets": 263680 }, { "mboxMarkerBegin": 4233720, "mboxMarkerLength": 7, + "lineNumber": 57659, "begin": 4233729, "headersEnd": 4234408, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 57659, "begin": 4233729, "headersEnd": 4234408, "end": 4235418, @@ -1358,21 +1479,23 @@ "lines": 18 }, "end": 4235418, - "octets": 1010, - "lines": 18 + "octets": 1010 }, { "mboxMarkerBegin": 4235420, "mboxMarkerLength": 7, + "lineNumber": 57693, "begin": 4235429, "headersEnd": 4236508, "body": { "mimeType": "multipart/alternative", + "lineNumber": 57693, "begin": 4235429, "headersEnd": 4236508, "children": [ { "mimeType": "text/plain", + "lineNumber": 57720, "begin": 4236707, "headersEnd": 4236753, "end": 4237170, @@ -1381,11 +1504,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 57737, "begin": 4237213, "headersEnd": 4237301, "children": [ { "mimeType": "text/richtext", + "lineNumber": 57741, "begin": 4237344, "headersEnd": 4237438, "end": 4237667, @@ -1394,6 +1519,7 @@ }, { "mimeType": "image/x-xbm", + "lineNumber": 57750, "begin": 4237712, "headersEnd": 4237835, "end": 4239256, @@ -1402,6 +1528,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 57793, "begin": 4239301, "headersEnd": 4239395, "end": 4239552, @@ -1419,21 +1546,23 @@ "lines": 93 }, "end": 4239644, - "octets": 3136, - "lines": 93 + "octets": 3136 }, { "mboxMarkerBegin": 4239646, "mboxMarkerLength": 7, + "lineNumber": 57811, "begin": 4239655, "headersEnd": 4240341, "body": { "mimeType": "multipart/mixed", + "lineNumber": 57811, "begin": 4239655, "headersEnd": 4240341, "children": [ { "mimeType": "text/plain", + "lineNumber": 57828, "begin": 4240358, "headersEnd": 4240387, "end": 4240471, @@ -1442,6 +1571,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 57838, "begin": 4240490, "headersEnd": 4240553, "end": 4245787, @@ -1454,16 +1584,17 @@ "lines": 88 }, "end": 4245810, - "octets": 5469, - "lines": 88 + "octets": 5469 }, { "mboxMarkerBegin": 4245812, "mboxMarkerLength": 7, + "lineNumber": 57917, "begin": 4245821, "headersEnd": 4246287, "body": { "mimeType": "Image/JPEG", + "lineNumber": 57917, "begin": 4245821, "headersEnd": 4246287, "end": 4257886, @@ -1471,21 +1602,23 @@ "lines": 185 }, "end": 4257886, - "octets": 11599, - "lines": 185 + "octets": 11599 }, { "mboxMarkerBegin": 4257888, "mboxMarkerLength": 7, + "lineNumber": 58118, "begin": 4257897, "headersEnd": 4258477, "body": { "mimeType": "Multipart/Mixed", + "lineNumber": 58118, "begin": 4257897, "headersEnd": 4258477, "children": [ { "mimeType": "text/plain", + "lineNumber": 58134, "begin": 4258489, "headersEnd": 4258491, "end": 4258530, @@ -1494,18 +1627,22 @@ }, { "mimeType": "Multipart/MIXED", + "lineNumber": 58138, "begin": 4258544, "headersEnd": 4258601, "children": [ { "mimeType": "Message/External-body", + "lineNumber": 58141, "begin": 4258616, "headersEnd": 4258736, "message": { + "lineNumber": 58145, "begin": 4258736, "headersEnd": 4258816, "body": { "mimeType": "text/plain", + "lineNumber": 58145, "begin": 4258736, "headersEnd": 4258816, "end": 4258885, @@ -1513,8 +1650,7 @@ "lines": 2 }, "end": 4258885, - "octets": 69, - "lines": 2 + "octets": 69 }, "end": 4258885, "octets": 149, @@ -1522,13 +1658,16 @@ }, { "mimeType": "Message/External-body", + "lineNumber": 58152, "begin": 4258902, "headersEnd": 4259095, "message": { + "lineNumber": 58158, "begin": 4259095, "headersEnd": 4259173, "body": { "mimeType": "text/plain", + "lineNumber": 58158, "begin": 4259095, "headersEnd": 4259173, "end": 4259173, @@ -1536,8 +1675,7 @@ "lines": 0 }, "end": 4259173, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4259173, "octets": 78, @@ -1545,13 +1683,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 58162, "begin": 4259190, "headersEnd": 4259332, "message": { + "lineNumber": 58169, "begin": 4259332, "headersEnd": 4259401, "body": { "mimeType": "TEXT/HTML", + "lineNumber": 58169, "begin": 4259332, "headersEnd": 4259401, "end": 4259401, @@ -1559,8 +1700,7 @@ "lines": 0 }, "end": 4259401, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4259401, "octets": 69, @@ -1568,13 +1708,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 58173, "begin": 4259418, "headersEnd": 4259535, "message": { + "lineNumber": 58177, "begin": 4259535, "headersEnd": 4259605, "body": { "mimeType": "image/gif", + "lineNumber": 58177, "begin": 4259535, "headersEnd": 4259605, "end": 4259605, @@ -1582,8 +1725,7 @@ "lines": 0 }, "end": 4259605, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4259605, "octets": 70, @@ -1591,13 +1733,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 58181, "begin": 4259622, "headersEnd": 4259731, "message": { + "lineNumber": 58185, "begin": 4259731, "headersEnd": 4259801, "body": { "mimeType": "image/gif", + "lineNumber": 58185, "begin": 4259731, "headersEnd": 4259801, "end": 4259801, @@ -1605,8 +1750,7 @@ "lines": 0 }, "end": 4259801, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4259801, "octets": 70, @@ -1623,21 +1767,23 @@ "lines": 58 }, "end": 4259836, - "octets": 1359, - "lines": 58 + "octets": 1359 }, { "mboxMarkerBegin": 4259838, "mboxMarkerLength": 7, + "lineNumber": 58193, "begin": 4259847, "headersEnd": 4260427, "body": { "mimeType": "Multipart/Mixed", + "lineNumber": 58193, "begin": 4259847, "headersEnd": 4260427, "children": [ { "mimeType": "text/plain", + "lineNumber": 58209, "begin": 4260439, "headersEnd": 4260441, "end": 4263710, @@ -1646,18 +1792,22 @@ }, { "mimeType": "Multipart/Alternative", + "lineNumber": 58277, "begin": 4263724, "headersEnd": 4263787, "children": [ { "mimeType": "Message/External-body", + "lineNumber": 58280, "begin": 4263802, "headersEnd": 4263922, "message": { + "lineNumber": 58284, "begin": 4263922, "headersEnd": 4264002, "body": { "mimeType": "text/plain", + "lineNumber": 58284, "begin": 4263922, "headersEnd": 4264002, "end": 4264071, @@ -1665,8 +1815,7 @@ "lines": 2 }, "end": 4264071, - "octets": 69, - "lines": 2 + "octets": 69 }, "end": 4264071, "octets": 149, @@ -1674,13 +1823,16 @@ }, { "mimeType": "Message/External-body", + "lineNumber": 58291, "begin": 4264088, "headersEnd": 4264281, "message": { + "lineNumber": 58297, "begin": 4264281, "headersEnd": 4264359, "body": { "mimeType": "text/plain", + "lineNumber": 58297, "begin": 4264281, "headersEnd": 4264359, "end": 4264359, @@ -1688,8 +1840,7 @@ "lines": 0 }, "end": 4264359, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4264359, "octets": 78, @@ -1706,28 +1857,32 @@ "lines": 95 }, "end": 4264394, - "octets": 3967, - "lines": 95 + "octets": 3967 }, { "mboxMarkerBegin": 4264396, "mboxMarkerLength": 7, + "lineNumber": 58305, "begin": 4264405, "headersEnd": 4264885, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58305, "begin": 4264405, "headersEnd": 4264885, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 58320, "begin": 4264961, "headersEnd": 4265110, "message": { + "lineNumber": 58325, "begin": 4265110, "headersEnd": 4265550, "body": { "mimeType": "text/plain", + "lineNumber": 58325, "begin": 4265110, "headersEnd": 4265550, "end": 4265589, @@ -1735,8 +1890,7 @@ "lines": 2 }, "end": 4265589, - "octets": 39, - "lines": 2 + "octets": 39 }, "end": 4265589, "octets": 479, @@ -1744,6 +1898,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58340, "begin": 4265619, "headersEnd": 4265746, "end": 4266210, @@ -1752,6 +1907,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58352, "begin": 4266240, "headersEnd": 4266367, "end": 4266859, @@ -1760,6 +1916,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58364, "begin": 4266889, "headersEnd": 4267020, "end": 4267554, @@ -1768,6 +1925,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58377, "begin": 4267584, "headersEnd": 4267713, "end": 4268217, @@ -1776,13 +1934,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58389, "begin": 4268247, "headersEnd": 4268396, "message": { + "lineNumber": 58394, "begin": 4268396, "headersEnd": 4268836, "body": { "mimeType": "text/plain", + "lineNumber": 58394, "begin": 4268396, "headersEnd": 4268836, "end": 4268874, @@ -1790,8 +1951,7 @@ "lines": 1 }, "end": 4268874, - "octets": 38, - "lines": 1 + "octets": 38 }, "end": 4268874, "octets": 478, @@ -1799,27 +1959,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58408, "begin": 4268904, "headersEnd": 4269080, "message": { + "lineNumber": 58413, "begin": 4269080, "headersEnd": 4269665, "body": { "mimeType": "message/rfc822", + "lineNumber": 58413, "begin": 4269080, "headersEnd": 4269665, "message": { + "lineNumber": 58428, "begin": 4269665, "headersEnd": 4270190, "body": { "mimeType": "message/rfc822", + "lineNumber": 58428, "begin": 4269665, "headersEnd": 4270190, "message": { + "lineNumber": 58442, "begin": 4270190, "headersEnd": 4270611, "body": { "mimeType": "text/plain", + "lineNumber": 58442, "begin": 4270190, "headersEnd": 4270611, "end": 4270617, @@ -1827,24 +1994,21 @@ "lines": 1 }, "end": 4270617, - "octets": 6, - "lines": 1 + "octets": 6 }, "end": 4270617, "octets": 427, "lines": 12 }, "end": 4270617, - "octets": 427, - "lines": 12 + "octets": 427 }, "end": 4270617, "octets": 952, "lines": 26 }, "end": 4270617, - "octets": 952, - "lines": 26 + "octets": 952 }, "end": 4270617, "octets": 1537, @@ -1852,6 +2016,7 @@ }, { "mimeType": "text/html", + "lineNumber": 58456, "begin": 4270647, "headersEnd": 4270703, "end": 4270756, @@ -1864,28 +2029,32 @@ "lines": 145 }, "end": 4270786, - "octets": 5901, - "lines": 145 + "octets": 5901 }, { "mboxMarkerBegin": 4270788, "mboxMarkerLength": 7, + "lineNumber": 58463, "begin": 4270797, "headersEnd": 4271280, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58463, "begin": 4270797, "headersEnd": 4271280, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 58478, "begin": 4271356, "headersEnd": 4271509, "message": { + "lineNumber": 58483, "begin": 4271509, "headersEnd": 4271948, "body": { "mimeType": "text/plain", + "lineNumber": 58483, "begin": 4271509, "headersEnd": 4271948, "end": 4271987, @@ -1893,8 +2062,7 @@ "lines": 2 }, "end": 4271987, - "octets": 39, - "lines": 2 + "octets": 39 }, "end": 4271987, "octets": 478, @@ -1902,6 +2070,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58498, "begin": 4272017, "headersEnd": 4272148, "end": 4272612, @@ -1910,6 +2079,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58510, "begin": 4272642, "headersEnd": 4272773, "end": 4273265, @@ -1918,6 +2088,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58522, "begin": 4273295, "headersEnd": 4273430, "end": 4273964, @@ -1926,6 +2097,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58535, "begin": 4273994, "headersEnd": 4274127, "end": 4274631, @@ -1934,13 +2106,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58547, "begin": 4274661, "headersEnd": 4274814, "message": { + "lineNumber": 58552, "begin": 4274814, "headersEnd": 4275253, "body": { "mimeType": "text/plain", + "lineNumber": 58552, "begin": 4274814, "headersEnd": 4275253, "end": 4275291, @@ -1948,8 +2123,7 @@ "lines": 1 }, "end": 4275291, - "octets": 38, - "lines": 1 + "octets": 38 }, "end": 4275291, "octets": 477, @@ -1957,27 +2131,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58566, "begin": 4275321, "headersEnd": 4275501, "message": { + "lineNumber": 58571, "begin": 4275501, "headersEnd": 4276089, "body": { "mimeType": "message/rfc822", + "lineNumber": 58571, "begin": 4275501, "headersEnd": 4276089, "message": { + "lineNumber": 58586, "begin": 4276089, "headersEnd": 4276617, "body": { "mimeType": "message/rfc822", + "lineNumber": 58586, "begin": 4276089, "headersEnd": 4276617, "message": { + "lineNumber": 58600, "begin": 4276617, "headersEnd": 4277037, "body": { "mimeType": "text/plain", + "lineNumber": 58600, "begin": 4276617, "headersEnd": 4277037, "end": 4277043, @@ -1985,24 +2166,21 @@ "lines": 1 }, "end": 4277043, - "octets": 6, - "lines": 1 + "octets": 6 }, "end": 4277043, "octets": 426, "lines": 12 }, "end": 4277043, - "octets": 426, - "lines": 12 + "octets": 426 }, "end": 4277043, "octets": 954, "lines": 26 }, "end": 4277043, - "octets": 954, - "lines": 26 + "octets": 954 }, "end": 4277043, "octets": 1542, @@ -2010,6 +2188,7 @@ }, { "mimeType": "text/html", + "lineNumber": 58614, "begin": 4277073, "headersEnd": 4277133, "end": 4277186, @@ -2022,21 +2201,23 @@ "lines": 145 }, "end": 4277216, - "octets": 5936, - "lines": 145 + "octets": 5936 }, { "mboxMarkerBegin": 4277218, "mboxMarkerLength": 7, + "lineNumber": 58621, "begin": 4277227, "headersEnd": 4277931, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58621, "begin": 4277227, "headersEnd": 4277931, "children": [ { "mimeType": "text/richtext", + "lineNumber": 58641, "begin": 4277981, "headersEnd": 4278012, "end": 4278458, @@ -2045,6 +2226,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 58675, "begin": 4278467, "headersEnd": 4278543, "end": 4279216, @@ -2053,6 +2235,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 58722, "begin": 4279225, "headersEnd": 4279227, "end": 4279245, @@ -2061,6 +2244,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 58725, "begin": 4279254, "headersEnd": 4279256, "end": 4279267, @@ -2069,18 +2253,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58728, "begin": 4279276, "headersEnd": 4279308, "message": { + "lineNumber": 58730, "begin": 4279308, "headersEnd": 4279530, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58730, "begin": 4279308, "headersEnd": 4279530, "children": [ { "mimeType": "text/html", + "lineNumber": 58738, "begin": 4279537, "headersEnd": 4279564, "end": 4279587, @@ -2089,6 +2277,7 @@ }, { "mimeType": "image/unknown", + "lineNumber": 58742, "begin": 4279596, "headersEnd": 4279776, "end": 4279815, @@ -2101,8 +2290,7 @@ "lines": 13 }, "end": 4279824, - "octets": 294, - "lines": 13 + "octets": 294 }, "end": 4279824, "octets": 516, @@ -2110,6 +2298,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 58751, "begin": 4279833, "headersEnd": 4279914, "end": 4289472, @@ -2118,6 +2307,7 @@ }, { "mimeType": "image/unknown", + "lineNumber": 58883, "begin": 4289481, "headersEnd": 4289661, "end": 4289700, @@ -2126,6 +2316,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 58891, "begin": 4289709, "headersEnd": 4289861, "end": 4297809, @@ -2134,18 +2325,22 @@ }, { "mimeType": "multipart/digest", + "lineNumber": 59024, "begin": 4297818, "headersEnd": 4297872, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 59027, "begin": 4297883, "headersEnd": 4297885, "message": { + "lineNumber": 59028, "begin": 4297885, "headersEnd": 4297914, "body": { "mimeType": "text/plain", + "lineNumber": 59028, "begin": 4297885, "headersEnd": 4297914, "end": 4297919, @@ -2153,8 +2348,7 @@ "lines": 1 }, "end": 4297919, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4297919, "octets": 34, @@ -2162,13 +2356,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59033, "begin": 4297932, "headersEnd": 4297934, "message": { + "lineNumber": 59034, "begin": 4297934, "headersEnd": 4297963, "body": { "mimeType": "text/plain", + "lineNumber": 59034, "begin": 4297934, "headersEnd": 4297963, "end": 4297968, @@ -2176,8 +2373,7 @@ "lines": 1 }, "end": 4297968, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4297968, "octets": 34, @@ -2185,13 +2381,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59039, "begin": 4297981, "headersEnd": 4297983, "message": { + "lineNumber": 59040, "begin": 4297983, "headersEnd": 4298012, "body": { "mimeType": "text/plain", + "lineNumber": 59040, "begin": 4297983, "headersEnd": 4298012, "end": 4298017, @@ -2199,8 +2398,7 @@ "lines": 1 }, "end": 4298017, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4298017, "octets": 34, @@ -2208,6 +2406,7 @@ }, { "mimeType": "text/html", + "lineNumber": 59045, "begin": 4298030, "headersEnd": 4298057, "end": 4298140, @@ -2216,13 +2415,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59050, "begin": 4298153, "headersEnd": 4298155, "message": { + "lineNumber": 59051, "begin": 4298155, "headersEnd": 4298213, "body": { "mimeType": "text/richtext", + "lineNumber": 59051, "begin": 4298155, "headersEnd": 4298213, "end": 4298262, @@ -2230,8 +2432,7 @@ "lines": 1 }, "end": 4298262, - "octets": 49, - "lines": 1 + "octets": 49 }, "end": 4298262, "octets": 107, @@ -2239,13 +2440,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59057, "begin": 4298275, "headersEnd": 4298277, "message": { + "lineNumber": 59058, "begin": 4298277, "headersEnd": 4298306, "body": { "mimeType": "text/plain", + "lineNumber": 59058, "begin": 4298277, "headersEnd": 4298306, "end": 4298311, @@ -2253,8 +2457,7 @@ "lines": 1 }, "end": 4298311, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4298311, "octets": 34, @@ -2271,21 +2474,23 @@ "lines": 428 }, "end": 4298376, - "octets": 20445, - "lines": 428 + "octets": 20445 }, { "mboxMarkerBegin": 4298378, "mboxMarkerLength": 7, + "lineNumber": 59067, "begin": 4298387, "headersEnd": 4299063, "body": { "mimeType": "multipart/mixed", + "lineNumber": 59067, "begin": 4298387, "headersEnd": 4299063, "children": [ { "mimeType": "text/plain", + "lineNumber": 59083, "begin": 4299090, "headersEnd": 4299092, "end": 4300338, @@ -2294,6 +2499,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 59112, "begin": 4300367, "headersEnd": 4300517, "end": 4372203, @@ -2302,6 +2508,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 59488, "begin": 4372232, "headersEnd": 4372234, "end": 4372234, @@ -2314,16 +2521,17 @@ "lines": 409 }, "end": 4372265, - "octets": 73202, - "lines": 409 + "octets": 73202 }, { "mboxMarkerBegin": 4372267, "mboxMarkerLength": 7, + "lineNumber": 59493, "begin": 4372276, "headersEnd": 4373229, "body": { "mimeType": "message/partial", + "lineNumber": 59493, "begin": 4372276, "headersEnd": 4373229, "end": 4625700, @@ -2331,21 +2539,23 @@ "lines": 3430 }, "end": 4625700, - "octets": 252471, - "lines": 3430 + "octets": 252471 }, { "mboxMarkerBegin": 4625702, "mboxMarkerLength": 7, + "lineNumber": 62945, "begin": 4625711, "headersEnd": 4626660, "body": { "mimeType": "multipart/mixed", + "lineNumber": 62945, "begin": 4625711, "headersEnd": 4626660, "children": [ { "mimeType": "text/richtext", + "lineNumber": 62971, "begin": 4626905, "headersEnd": 4626981, "end": 4627454, @@ -2354,6 +2564,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 62985, "begin": 4627502, "headersEnd": 4627564, "end": 4652132, @@ -2362,6 +2573,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 63322, "begin": 4652180, "headersEnd": 4652256, "end": 4652714, @@ -2370,6 +2582,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 63337, "begin": 4652762, "headersEnd": 4652824, "end": 4664192, @@ -2378,6 +2591,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 63496, "begin": 4664240, "headersEnd": 4664316, "end": 4664626, @@ -2386,6 +2600,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 63507, "begin": 4664674, "headersEnd": 4664736, "end": 4681412, @@ -2394,6 +2609,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 63738, "begin": 4681460, "headersEnd": 4681536, "end": 4682211, @@ -2406,21 +2622,23 @@ "lines": 792 }, "end": 4682261, - "octets": 55601, - "lines": 792 + "octets": 55601 }, { "mboxMarkerBegin": 4682263, "mboxMarkerLength": 7, + "lineNumber": 63760, "begin": 4682272, "headersEnd": 4683107, "body": { "mimeType": "multipart/mixed", + "lineNumber": 63760, "begin": 4682272, "headersEnd": 4683107, "children": [ { "mimeType": "text/plain", + "lineNumber": 63777, "begin": 4683137, "headersEnd": 4683139, "end": 4683807, @@ -2429,6 +2647,7 @@ }, { "mimeType": "Image/JPEG", + "lineNumber": 63798, "begin": 4683839, "headersEnd": 4683902, "end": 4731116, @@ -2441,21 +2660,23 @@ "lines": 788 }, "end": 4731150, - "octets": 48043, - "lines": 788 + "octets": 48043 }, { "mboxMarkerBegin": 4731152, "mboxMarkerLength": 7, + "lineNumber": 64566, "begin": 4731161, "headersEnd": 4731922, "body": { "mimeType": "multipart/mixed", + "lineNumber": 64566, "begin": 4731161, "headersEnd": 4731922, "children": [ { "mimeType": "text/enriched", + "lineNumber": 64588, "begin": 4732387, "headersEnd": 4732463, "end": 4737938, @@ -2464,6 +2685,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 64753, "begin": 4737964, "headersEnd": 4738065, "end": 4740681, @@ -2472,6 +2694,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 64795, "begin": 4740707, "headersEnd": 4740783, "end": 4741311, @@ -2480,6 +2703,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 64810, "begin": 4741337, "headersEnd": 4741455, "end": 4764831, @@ -2488,6 +2712,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 65132, "begin": 4764857, "headersEnd": 4764933, "end": 4765525, @@ -2496,13 +2721,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 65151, "begin": 4765551, "headersEnd": 4765640, "message": { + "lineNumber": 65155, "begin": 4765640, "headersEnd": 4765711, "body": { "mimeType": "text/plain", + "lineNumber": 65155, "begin": 4765640, "headersEnd": 4765711, "end": 4765711, @@ -2510,8 +2738,7 @@ "lines": 0 }, "end": 4765711, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4765711, "octets": 71, @@ -2519,6 +2746,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 65159, "begin": 4765737, "headersEnd": 4765813, "end": 4766094, @@ -2527,13 +2755,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 65169, "begin": 4766120, "headersEnd": 4766273, "message": { + "lineNumber": 65176, "begin": 4766273, "headersEnd": 4766344, "body": { "mimeType": "text/plain", + "lineNumber": 65176, "begin": 4766273, "headersEnd": 4766344, "end": 4766344, @@ -2541,8 +2772,7 @@ "lines": 0 }, "end": 4766344, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4766344, "octets": 71, @@ -2550,6 +2780,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 65180, "begin": 4766370, "headersEnd": 4766446, "end": 4767549, @@ -2562,21 +2793,23 @@ "lines": 639 }, "end": 4767575, - "octets": 35653, - "lines": 639 + "octets": 35653 }, { "mboxMarkerBegin": 4767577, "mboxMarkerLength": 7, + "lineNumber": 65220, "begin": 4767586, "headersEnd": 4767753, "body": { "mimeType": "Multipart/mixed", + "lineNumber": 65220, "begin": 4767586, "headersEnd": 4767753, "children": [ { "mimeType": "image/gif", + "lineNumber": 65227, "begin": 4767766, "headersEnd": 4767838, "end": 4845327, @@ -2585,6 +2818,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 66377, "begin": 4845342, "headersEnd": 4845344, "end": 4845374, @@ -2597,21 +2831,23 @@ "lines": 1154 }, "end": 4845389, - "octets": 77636, - "lines": 1154 + "octets": 77636 }, { "mboxMarkerBegin": 4845391, "mboxMarkerLength": 7, + "lineNumber": 66381, "begin": 4845400, "headersEnd": 4846638, "body": { "mimeType": "MULTIPART/MIXED", + "lineNumber": 66381, "begin": 4845400, "headersEnd": 4846638, "children": [ { "mimeType": "TEXT/plain", + "lineNumber": 66405, "begin": 4846677, "headersEnd": 4846723, "end": 4847183, @@ -2620,6 +2856,7 @@ }, { "mimeType": "AUDIO/basic", + "lineNumber": 66417, "begin": 4847224, "headersEnd": 4847321, "end": 4977159, @@ -2632,21 +2869,23 @@ "lines": 2114 }, "end": 4977202, - "octets": 130564, - "lines": 2114 + "octets": 130564 }, { "mboxMarkerBegin": 4977204, "mboxMarkerLength": 7, + "lineNumber": 68520, "begin": 4977213, "headersEnd": 4977982, "body": { "mimeType": "multipart/alternative", + "lineNumber": 68520, "begin": 4977213, "headersEnd": 4977982, "children": [ { "mimeType": "text/plain", + "lineNumber": 68544, "begin": 4978386, "headersEnd": 4978388, "end": 4979201, @@ -2655,11 +2894,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 68565, "begin": 4979262, "headersEnd": 4979368, "children": [ { "mimeType": "text/richtext", + "lineNumber": 68569, "begin": 4979429, "headersEnd": 4979505, "end": 4980001, @@ -2668,6 +2909,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 68581, "begin": 4980064, "headersEnd": 4980164, "end": 4993344, @@ -2676,6 +2918,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 68777, "begin": 4993407, "headersEnd": 4993480, "end": 4993501, @@ -2684,6 +2927,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 68783, "begin": 4993564, "headersEnd": 4993664, "end": 5050148, @@ -2692,6 +2936,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 69553, "begin": 5050211, "headersEnd": 5050284, "end": 5050341, @@ -2700,6 +2945,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 69563, "begin": 5050404, "headersEnd": 5050468, "end": 5154020, @@ -2708,6 +2954,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 70968, "begin": 5154083, "headersEnd": 5154156, "end": 5154160, @@ -2725,21 +2972,23 @@ "lines": 2440 }, "end": 5154286, - "octets": 176304, - "lines": 2440 + "octets": 176304 }, { "mboxMarkerBegin": 5154288, "mboxMarkerLength": 7, + "lineNumber": 70978, "begin": 5154297, "headersEnd": 5154999, "body": { "mimeType": "multipart/alternative", + "lineNumber": 70978, "begin": 5154297, "headersEnd": 5154999, "children": [ { "mimeType": "text/plain", + "lineNumber": 70998, "begin": 5155198, "headersEnd": 5155244, "end": 5156788, @@ -2748,11 +2997,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 71031, "begin": 5156831, "headersEnd": 5156919, "children": [ { "mimeType": "text/richtext", + "lineNumber": 71035, "begin": 5156962, "headersEnd": 5157056, "end": 5157976, @@ -2761,6 +3012,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 71053, "begin": 5158021, "headersEnd": 5158116, "end": 5193480, @@ -2769,6 +3021,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 71565, "begin": 5193525, "headersEnd": 5193619, "end": 5193631, @@ -2777,6 +3030,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 71572, "begin": 5193676, "headersEnd": 5193771, "end": 5215415, @@ -2785,6 +3039,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 71888, "begin": 5215460, "headersEnd": 5215554, "end": 5215566, @@ -2793,6 +3048,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 71895, "begin": 5215611, "headersEnd": 5215706, "end": 5248620, @@ -2801,6 +3057,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 72372, "begin": 5248665, "headersEnd": 5248759, "end": 5248771, @@ -2809,6 +3066,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 72379, "begin": 5248816, "headersEnd": 5248911, "end": 5282837, @@ -2817,6 +3075,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 72870, "begin": 5282882, "headersEnd": 5282976, "end": 5282988, @@ -2825,6 +3084,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 72877, "begin": 5283033, "headersEnd": 5283128, "end": 5311368, @@ -2833,6 +3093,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 73287, "begin": 5311413, "headersEnd": 5311507, "end": 5311519, @@ -2841,6 +3102,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 73294, "begin": 5311564, "headersEnd": 5311659, "end": 5345639, @@ -2849,6 +3111,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 73786, "begin": 5345684, "headersEnd": 5345778, "end": 5345790, @@ -2857,6 +3120,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 73793, "begin": 5345835, "headersEnd": 5345930, "end": 5372976, @@ -2865,6 +3129,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 74186, "begin": 5373021, "headersEnd": 5373115, "end": 5373192, @@ -2882,21 +3147,23 @@ "lines": 3202 }, "end": 5373282, - "octets": 218283, - "lines": 3202 + "octets": 218283 }, { "mboxMarkerBegin": 5373284, "mboxMarkerLength": 7, + "lineNumber": 74197, "begin": 5373293, "headersEnd": 5373698, "body": { "mimeType": "multipart/mixed", + "lineNumber": 74197, "begin": 5373293, "headersEnd": 5373698, "children": [ { "mimeType": "text/richtext", + "lineNumber": 74215, "begin": 5373947, "headersEnd": 5374045, "end": 5374257, @@ -2905,6 +3172,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 74229, "begin": 5374309, "headersEnd": 5374373, "end": 5464185, @@ -2913,6 +3181,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 75448, "begin": 5464237, "headersEnd": 5464265, "end": 5464296, @@ -2925,16 +3194,17 @@ "lines": 1243 }, "end": 5464350, - "octets": 90652, - "lines": 1243 + "octets": 90652 }, { "mboxMarkerBegin": 5464352, "mboxMarkerLength": 7, + "lineNumber": 75455, "begin": 5464361, "headersEnd": 5465317, "body": { "mimeType": "message/partial", + "lineNumber": 75455, "begin": 5464361, "headersEnd": 5465317, "end": 5516722, @@ -2942,21 +3212,23 @@ "lines": 696 }, "end": 5516722, - "octets": 51405, - "lines": 696 + "octets": 51405 }, { "mboxMarkerBegin": 5516724, "mboxMarkerLength": 7, + "lineNumber": 76173, "begin": 5516733, "headersEnd": 5517362, "body": { "mimeType": "multipart/mixed", + "lineNumber": 76173, "begin": 5516733, "headersEnd": 5517362, "children": [ { "mimeType": "text/plain", + "lineNumber": 76191, "begin": 5517381, "headersEnd": 5517383, "end": 5521801, @@ -2965,18 +3237,22 @@ }, { "mimeType": "multipart/digest", + "lineNumber": 76295, "begin": 5521822, "headersEnd": 5521966, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 76299, "begin": 5521998, "headersEnd": 5522000, "message": { + "lineNumber": 76300, "begin": 5522000, "headersEnd": 5522109, "body": { "mimeType": "text/plain", + "lineNumber": 76300, "begin": 5522000, "headersEnd": 5522109, "end": 5522748, @@ -2984,8 +3260,7 @@ "lines": 18 }, "end": 5522748, - "octets": 639, - "lines": 18 + "octets": 639 }, "end": 5522748, "octets": 748, @@ -2993,13 +3268,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76324, "begin": 5522782, "headersEnd": 5522784, "message": { + "lineNumber": 76325, "begin": 5522784, "headersEnd": 5522909, "body": { "mimeType": "text/plain", + "lineNumber": 76325, "begin": 5522784, "headersEnd": 5522909, "end": 5523662, @@ -3007,8 +3285,7 @@ "lines": 20 }, "end": 5523662, - "octets": 753, - "lines": 20 + "octets": 753 }, "end": 5523662, "octets": 878, @@ -3016,13 +3293,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76351, "begin": 5523696, "headersEnd": 5523698, "message": { + "lineNumber": 76352, "begin": 5523698, "headersEnd": 5523821, "body": { "mimeType": "text/plain", + "lineNumber": 76352, "begin": 5523698, "headersEnd": 5523821, "end": 5524481, @@ -3030,8 +3310,7 @@ "lines": 14 }, "end": 5524481, - "octets": 660, - "lines": 14 + "octets": 660 }, "end": 5524481, "octets": 783, @@ -3039,13 +3318,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76372, "begin": 5524515, "headersEnd": 5524517, "message": { + "lineNumber": 76373, "begin": 5524517, "headersEnd": 5524677, "body": { "mimeType": "text/plain", + "lineNumber": 76373, "begin": 5524517, "headersEnd": 5524677, "end": 5525170, @@ -3053,8 +3335,7 @@ "lines": 10 }, "end": 5525170, - "octets": 493, - "lines": 10 + "octets": 493 }, "end": 5525170, "octets": 653, @@ -3062,13 +3343,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76389, "begin": 5525204, "headersEnd": 5525206, "message": { + "lineNumber": 76390, "begin": 5525206, "headersEnd": 5525364, "body": { "mimeType": "text/plain", + "lineNumber": 76390, "begin": 5525206, "headersEnd": 5525364, "end": 5525951, @@ -3076,8 +3360,7 @@ "lines": 15 }, "end": 5525951, - "octets": 587, - "lines": 15 + "octets": 587 }, "end": 5525951, "octets": 745, @@ -3085,13 +3368,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76411, "begin": 5525985, "headersEnd": 5525987, "message": { + "lineNumber": 76412, "begin": 5525987, "headersEnd": 5526148, "body": { "mimeType": "text/plain", + "lineNumber": 76412, "begin": 5525987, "headersEnd": 5526148, "end": 5527449, @@ -3099,8 +3385,7 @@ "lines": 26 }, "end": 5527449, - "octets": 1301, - "lines": 26 + "octets": 1301 }, "end": 5527449, "octets": 1462, @@ -3108,13 +3393,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76444, "begin": 5527483, "headersEnd": 5527485, "message": { + "lineNumber": 76445, "begin": 5527485, "headersEnd": 5527642, "body": { "mimeType": "text/plain", + "lineNumber": 76445, "begin": 5527485, "headersEnd": 5527642, "end": 5528052, @@ -3122,8 +3410,7 @@ "lines": 9 }, "end": 5528052, - "octets": 410, - "lines": 9 + "octets": 410 }, "end": 5528052, "octets": 567, @@ -3131,13 +3418,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76460, "begin": 5528086, "headersEnd": 5528088, "message": { + "lineNumber": 76461, "begin": 5528088, "headersEnd": 5528239, "body": { "mimeType": "text/plain", + "lineNumber": 76461, "begin": 5528088, "headersEnd": 5528239, "end": 5528642, @@ -3145,8 +3435,7 @@ "lines": 7 }, "end": 5528642, - "octets": 403, - "lines": 7 + "octets": 403 }, "end": 5528642, "octets": 554, @@ -3154,13 +3443,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76474, "begin": 5528676, "headersEnd": 5528678, "message": { + "lineNumber": 76475, "begin": 5528678, "headersEnd": 5528825, "body": { "mimeType": "text/plain", + "lineNumber": 76475, "begin": 5528678, "headersEnd": 5528825, "end": 5529476, @@ -3168,8 +3460,7 @@ "lines": 11 }, "end": 5529476, - "octets": 651, - "lines": 11 + "octets": 651 }, "end": 5529476, "octets": 798, @@ -3177,13 +3468,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76492, "begin": 5529510, "headersEnd": 5529512, "message": { + "lineNumber": 76493, "begin": 5529512, "headersEnd": 5529653, "body": { "mimeType": "text/plain", + "lineNumber": 76493, "begin": 5529512, "headersEnd": 5529653, "end": 5530649, @@ -3191,8 +3485,7 @@ "lines": 19 }, "end": 5530649, - "octets": 996, - "lines": 19 + "octets": 996 }, "end": 5530649, "octets": 1137, @@ -3200,13 +3493,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76518, "begin": 5530683, "headersEnd": 5530685, "message": { + "lineNumber": 76519, "begin": 5530685, "headersEnd": 5530836, "body": { "mimeType": "text/plain", + "lineNumber": 76519, "begin": 5530685, "headersEnd": 5530836, "end": 5531753, @@ -3214,8 +3510,7 @@ "lines": 27 }, "end": 5531753, - "octets": 917, - "lines": 27 + "octets": 917 }, "end": 5531753, "octets": 1068, @@ -3223,13 +3518,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76552, "begin": 5531787, "headersEnd": 5531789, "message": { + "lineNumber": 76553, "begin": 5531789, "headersEnd": 5531924, "body": { "mimeType": "text/plain", + "lineNumber": 76553, "begin": 5531789, "headersEnd": 5531924, "end": 5532494, @@ -3237,8 +3535,7 @@ "lines": 11 }, "end": 5532494, - "octets": 570, - "lines": 11 + "octets": 570 }, "end": 5532494, "octets": 705, @@ -3246,13 +3543,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76570, "begin": 5532528, "headersEnd": 5532530, "message": { + "lineNumber": 76571, "begin": 5532530, "headersEnd": 5532666, "body": { "mimeType": "text/plain", + "lineNumber": 76571, "begin": 5532530, "headersEnd": 5532666, "end": 5533113, @@ -3260,8 +3560,7 @@ "lines": 10 }, "end": 5533113, - "octets": 447, - "lines": 10 + "octets": 447 }, "end": 5533113, "octets": 583, @@ -3269,13 +3568,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76587, "begin": 5533147, "headersEnd": 5533149, "message": { + "lineNumber": 76588, "begin": 5533149, "headersEnd": 5533270, "body": { "mimeType": "text/plain", + "lineNumber": 76588, "begin": 5533149, "headersEnd": 5533270, "end": 5533837, @@ -3283,8 +3585,7 @@ "lines": 15 }, "end": 5533837, - "octets": 567, - "lines": 15 + "octets": 567 }, "end": 5533837, "octets": 688, @@ -3292,13 +3593,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76609, "begin": 5533871, "headersEnd": 5533873, "message": { + "lineNumber": 76610, "begin": 5533873, "headersEnd": 5533992, "body": { "mimeType": "text/plain", + "lineNumber": 76610, "begin": 5533873, "headersEnd": 5533992, "end": 5534185, @@ -3306,8 +3610,7 @@ "lines": 8 }, "end": 5534185, - "octets": 193, - "lines": 8 + "octets": 193 }, "end": 5534185, "octets": 312, @@ -3315,13 +3618,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76624, "begin": 5534219, "headersEnd": 5534221, "message": { + "lineNumber": 76625, "begin": 5534221, "headersEnd": 5534342, "body": { "mimeType": "text/plain", + "lineNumber": 76625, "begin": 5534221, "headersEnd": 5534342, "end": 5534677, @@ -3329,8 +3635,7 @@ "lines": 7 }, "end": 5534677, - "octets": 335, - "lines": 7 + "octets": 335 }, "end": 5534677, "octets": 456, @@ -3338,13 +3643,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76638, "begin": 5534711, "headersEnd": 5534713, "message": { + "lineNumber": 76639, "begin": 5534713, "headersEnd": 5534840, "body": { "mimeType": "text/plain", + "lineNumber": 76639, "begin": 5534713, "headersEnd": 5534840, "end": 5535528, @@ -3352,8 +3660,7 @@ "lines": 21 }, "end": 5535528, - "octets": 688, - "lines": 21 + "octets": 688 }, "end": 5535528, "octets": 815, @@ -3361,13 +3668,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76666, "begin": 5535562, "headersEnd": 5535564, "message": { + "lineNumber": 76667, "begin": 5535564, "headersEnd": 5535692, "body": { "mimeType": "text/plain", + "lineNumber": 76667, "begin": 5535564, "headersEnd": 5535692, "end": 5535799, @@ -3375,8 +3685,7 @@ "lines": 5 }, "end": 5535799, - "octets": 107, - "lines": 5 + "octets": 107 }, "end": 5535799, "octets": 235, @@ -3384,13 +3693,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76678, "begin": 5535833, "headersEnd": 5535835, "message": { + "lineNumber": 76679, "begin": 5535835, "headersEnd": 5535981, "body": { "mimeType": "text/plain", + "lineNumber": 76679, "begin": 5535835, "headersEnd": 5535981, "end": 5536838, @@ -3398,8 +3710,7 @@ "lines": 21 }, "end": 5536838, - "octets": 857, - "lines": 21 + "octets": 857 }, "end": 5536838, "octets": 1003, @@ -3407,13 +3718,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76706, "begin": 5536872, "headersEnd": 5536874, "message": { + "lineNumber": 76707, "begin": 5536874, "headersEnd": 5536988, "body": { "mimeType": "text/plain", + "lineNumber": 76707, "begin": 5536874, "headersEnd": 5536988, "end": 5537416, @@ -3421,8 +3735,7 @@ "lines": 9 }, "end": 5537416, - "octets": 428, - "lines": 9 + "octets": 428 }, "end": 5537416, "octets": 542, @@ -3430,13 +3743,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76722, "begin": 5537450, "headersEnd": 5537452, "message": { + "lineNumber": 76723, "begin": 5537452, "headersEnd": 5537628, "body": { "mimeType": "text/plain", + "lineNumber": 76723, "begin": 5537452, "headersEnd": 5537628, "end": 5537867, @@ -3444,8 +3760,7 @@ "lines": 9 }, "end": 5537867, - "octets": 239, - "lines": 9 + "octets": 239 }, "end": 5537867, "octets": 415, @@ -3453,13 +3768,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76738, "begin": 5537901, "headersEnd": 5537903, "message": { + "lineNumber": 76739, "begin": 5537903, "headersEnd": 5538033, "body": { "mimeType": "text/plain", + "lineNumber": 76739, "begin": 5537903, "headersEnd": 5538033, "end": 5538444, @@ -3467,8 +3785,7 @@ "lines": 12 }, "end": 5538444, - "octets": 411, - "lines": 12 + "octets": 411 }, "end": 5538444, "octets": 541, @@ -3476,13 +3793,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76757, "begin": 5538478, "headersEnd": 5538480, "message": { + "lineNumber": 76758, "begin": 5538480, "headersEnd": 5538601, "body": { "mimeType": "text/plain", + "lineNumber": 76758, "begin": 5538480, "headersEnd": 5538601, "end": 5539533, @@ -3490,8 +3810,7 @@ "lines": 28 }, "end": 5539533, - "octets": 932, - "lines": 28 + "octets": 932 }, "end": 5539533, "octets": 1053, @@ -3499,13 +3818,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76792, "begin": 5539567, "headersEnd": 5539569, "message": { + "lineNumber": 76793, "begin": 5539569, "headersEnd": 5539701, "body": { "mimeType": "text/plain", + "lineNumber": 76793, "begin": 5539569, "headersEnd": 5539701, "end": 5540001, @@ -3513,8 +3835,7 @@ "lines": 9 }, "end": 5540001, - "octets": 300, - "lines": 9 + "octets": 300 }, "end": 5540001, "octets": 432, @@ -3522,13 +3843,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76808, "begin": 5540035, "headersEnd": 5540037, "message": { + "lineNumber": 76809, "begin": 5540037, "headersEnd": 5540170, "body": { "mimeType": "text/plain", + "lineNumber": 76809, "begin": 5540037, "headersEnd": 5540170, "end": 5540594, @@ -3536,8 +3860,7 @@ "lines": 14 }, "end": 5540594, - "octets": 424, - "lines": 14 + "octets": 424 }, "end": 5540594, "octets": 557, @@ -3545,13 +3868,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76829, "begin": 5540628, "headersEnd": 5540630, "message": { + "lineNumber": 76830, "begin": 5540630, "headersEnd": 5540749, "body": { "mimeType": "text/plain", + "lineNumber": 76830, "begin": 5540630, "headersEnd": 5540749, "end": 5540898, @@ -3559,8 +3885,7 @@ "lines": 4 }, "end": 5540898, - "octets": 149, - "lines": 4 + "octets": 149 }, "end": 5540898, "octets": 268, @@ -3568,13 +3893,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76840, "begin": 5540932, "headersEnd": 5540934, "message": { + "lineNumber": 76841, "begin": 5540934, "headersEnd": 5541063, "body": { "mimeType": "text/plain", + "lineNumber": 76841, "begin": 5540934, "headersEnd": 5541063, "end": 5541249, @@ -3582,8 +3910,7 @@ "lines": 7 }, "end": 5541249, - "octets": 186, - "lines": 7 + "octets": 186 }, "end": 5541249, "octets": 315, @@ -3591,13 +3918,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76854, "begin": 5541283, "headersEnd": 5541285, "message": { + "lineNumber": 76855, "begin": 5541285, "headersEnd": 5541419, "body": { "mimeType": "text/plain", + "lineNumber": 76855, "begin": 5541285, "headersEnd": 5541419, "end": 5542149, @@ -3605,8 +3935,7 @@ "lines": 14 }, "end": 5542149, - "octets": 730, - "lines": 14 + "octets": 730 }, "end": 5542149, "octets": 864, @@ -3614,13 +3943,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76875, "begin": 5542183, "headersEnd": 5542185, "message": { + "lineNumber": 76876, "begin": 5542185, "headersEnd": 5542335, "body": { "mimeType": "text/plain", + "lineNumber": 76876, "begin": 5542185, "headersEnd": 5542335, "end": 5543318, @@ -3628,8 +3960,7 @@ "lines": 26 }, "end": 5543318, - "octets": 983, - "lines": 26 + "octets": 983 }, "end": 5543318, "octets": 1133, @@ -3637,13 +3968,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76908, "begin": 5543352, "headersEnd": 5543354, "message": { + "lineNumber": 76909, "begin": 5543354, "headersEnd": 5543492, "body": { "mimeType": "text/plain", + "lineNumber": 76909, "begin": 5543354, "headersEnd": 5543492, "end": 5543746, @@ -3651,8 +3985,7 @@ "lines": 7 }, "end": 5543746, - "octets": 254, - "lines": 7 + "octets": 254 }, "end": 5543746, "octets": 392, @@ -3660,13 +3993,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76922, "begin": 5543780, "headersEnd": 5543782, "message": { + "lineNumber": 76923, "begin": 5543782, "headersEnd": 5543908, "body": { "mimeType": "text/plain", + "lineNumber": 76923, "begin": 5543782, "headersEnd": 5543908, "end": 5544041, @@ -3674,8 +4010,7 @@ "lines": 6 }, "end": 5544041, - "octets": 133, - "lines": 6 + "octets": 133 }, "end": 5544041, "octets": 259, @@ -3683,13 +4018,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76935, "begin": 5544075, "headersEnd": 5544077, "message": { + "lineNumber": 76936, "begin": 5544077, "headersEnd": 5544257, "body": { "mimeType": "text/plain", + "lineNumber": 76936, "begin": 5544077, "headersEnd": 5544257, "end": 5545018, @@ -3697,8 +4035,7 @@ "lines": 16 }, "end": 5545018, - "octets": 761, - "lines": 16 + "octets": 761 }, "end": 5545018, "octets": 941, @@ -3706,13 +4043,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76959, "begin": 5545052, "headersEnd": 5545054, "message": { + "lineNumber": 76960, "begin": 5545054, "headersEnd": 5545218, "body": { "mimeType": "text/plain", + "lineNumber": 76960, "begin": 5545054, "headersEnd": 5545218, "end": 5545633, @@ -3720,8 +4060,7 @@ "lines": 16 }, "end": 5545633, - "octets": 415, - "lines": 16 + "octets": 415 }, "end": 5545633, "octets": 579, @@ -3729,13 +4068,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76982, "begin": 5545667, "headersEnd": 5545669, "message": { + "lineNumber": 76983, "begin": 5545669, "headersEnd": 5545805, "body": { "mimeType": "text/plain", + "lineNumber": 76983, "begin": 5545669, "headersEnd": 5545805, "end": 5547113, @@ -3743,8 +4085,7 @@ "lines": 21 }, "end": 5547113, - "octets": 1308, - "lines": 21 + "octets": 1308 }, "end": 5547113, "octets": 1444, @@ -3752,13 +4093,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77010, "begin": 5547147, "headersEnd": 5547149, "message": { + "lineNumber": 77011, "begin": 5547149, "headersEnd": 5547259, "body": { "mimeType": "text/plain", + "lineNumber": 77011, "begin": 5547149, "headersEnd": 5547259, "end": 5547408, @@ -3766,8 +4110,7 @@ "lines": 6 }, "end": 5547408, - "octets": 149, - "lines": 6 + "octets": 149 }, "end": 5547408, "octets": 259, @@ -3775,13 +4118,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77023, "begin": 5547442, "headersEnd": 5547444, "message": { + "lineNumber": 77024, "begin": 5547444, "headersEnd": 5547585, "body": { "mimeType": "text/plain", + "lineNumber": 77024, "begin": 5547444, "headersEnd": 5547585, "end": 5547895, @@ -3789,8 +4135,7 @@ "lines": 11 }, "end": 5547895, - "octets": 310, - "lines": 11 + "octets": 310 }, "end": 5547895, "octets": 451, @@ -3798,13 +4143,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77041, "begin": 5547929, "headersEnd": 5547931, "message": { + "lineNumber": 77042, "begin": 5547931, "headersEnd": 5548061, "body": { "mimeType": "text/plain", + "lineNumber": 77042, "begin": 5547931, "headersEnd": 5548061, "end": 5548254, @@ -3812,8 +4160,7 @@ "lines": 6 }, "end": 5548254, - "octets": 193, - "lines": 6 + "octets": 193 }, "end": 5548254, "octets": 323, @@ -3821,13 +4168,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77054, "begin": 5548288, "headersEnd": 5548290, "message": { + "lineNumber": 77055, "begin": 5548290, "headersEnd": 5548399, "body": { "mimeType": "text/plain", + "lineNumber": 77055, "begin": 5548290, "headersEnd": 5548399, "end": 5548809, @@ -3835,8 +4185,7 @@ "lines": 12 }, "end": 5548809, - "octets": 410, - "lines": 12 + "octets": 410 }, "end": 5548809, "octets": 519, @@ -3844,13 +4193,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77073, "begin": 5548843, "headersEnd": 5548845, "message": { + "lineNumber": 77074, "begin": 5548845, "headersEnd": 5548983, "body": { "mimeType": "text/plain", + "lineNumber": 77074, "begin": 5548845, "headersEnd": 5548983, "end": 5549293, @@ -3858,8 +4210,7 @@ "lines": 8 }, "end": 5549293, - "octets": 310, - "lines": 8 + "octets": 310 }, "end": 5549293, "octets": 448, @@ -3867,13 +4218,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77088, "begin": 5549327, "headersEnd": 5549329, "message": { + "lineNumber": 77089, "begin": 5549329, "headersEnd": 5549476, "body": { "mimeType": "text/plain", + "lineNumber": 77089, "begin": 5549329, "headersEnd": 5549476, "end": 5550111, @@ -3881,8 +4235,7 @@ "lines": 17 }, "end": 5550111, - "octets": 635, - "lines": 17 + "octets": 635 }, "end": 5550111, "octets": 782, @@ -3890,13 +4243,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77112, "begin": 5550145, "headersEnd": 5550147, "message": { + "lineNumber": 77113, "begin": 5550147, "headersEnd": 5550304, "body": { "mimeType": "text/plain", + "lineNumber": 77113, "begin": 5550147, "headersEnd": 5550304, "end": 5550789, @@ -3904,8 +4260,7 @@ "lines": 10 }, "end": 5550789, - "octets": 485, - "lines": 10 + "octets": 485 }, "end": 5550789, "octets": 642, @@ -3913,13 +4268,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77129, "begin": 5550823, "headersEnd": 5550825, "message": { + "lineNumber": 77130, "begin": 5550825, "headersEnd": 5550962, "body": { "mimeType": "text/plain", + "lineNumber": 77130, "begin": 5550825, "headersEnd": 5550962, "end": 5552161, @@ -3927,8 +4285,7 @@ "lines": 27 }, "end": 5552161, - "octets": 1199, - "lines": 27 + "octets": 1199 }, "end": 5552161, "octets": 1336, @@ -3936,13 +4293,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77163, "begin": 5552195, "headersEnd": 5552197, "message": { + "lineNumber": 77164, "begin": 5552197, "headersEnd": 5552377, "body": { "mimeType": "text/plain", + "lineNumber": 77164, "begin": 5552197, "headersEnd": 5552377, "end": 5552644, @@ -3950,8 +4310,7 @@ "lines": 8 }, "end": 5552644, - "octets": 267, - "lines": 8 + "octets": 267 }, "end": 5552644, "octets": 447, @@ -3959,13 +4318,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77178, "begin": 5552678, "headersEnd": 5552680, "message": { + "lineNumber": 77179, "begin": 5552680, "headersEnd": 5552799, "body": { "mimeType": "text/plain", + "lineNumber": 77179, "begin": 5552680, "headersEnd": 5552799, "end": 5552996, @@ -3973,8 +4335,7 @@ "lines": 4 }, "end": 5552996, - "octets": 197, - "lines": 4 + "octets": 197 }, "end": 5552996, "octets": 316, @@ -3982,13 +4343,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77189, "begin": 5553030, "headersEnd": 5553032, "message": { + "lineNumber": 77190, "begin": 5553032, "headersEnd": 5553176, "body": { "mimeType": "text/plain", + "lineNumber": 77190, "begin": 5553032, "headersEnd": 5553176, "end": 5554065, @@ -3996,8 +4360,7 @@ "lines": 24 }, "end": 5554065, - "octets": 889, - "lines": 24 + "octets": 889 }, "end": 5554065, "octets": 1033, @@ -4005,13 +4368,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77220, "begin": 5554099, "headersEnd": 5554101, "message": { + "lineNumber": 77221, "begin": 5554101, "headersEnd": 5554230, "body": { "mimeType": "text/plain", + "lineNumber": 77221, "begin": 5554101, "headersEnd": 5554230, "end": 5554955, @@ -4019,8 +4385,7 @@ "lines": 11 }, "end": 5554955, - "octets": 725, - "lines": 11 + "octets": 725 }, "end": 5554955, "octets": 854, @@ -4028,13 +4393,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77238, "begin": 5554989, "headersEnd": 5554991, "message": { + "lineNumber": 77239, "begin": 5554991, "headersEnd": 5555107, "body": { "mimeType": "text/plain", + "lineNumber": 77239, "begin": 5554991, "headersEnd": 5555107, "end": 5555827, @@ -4042,8 +4410,7 @@ "lines": 17 }, "end": 5555827, - "octets": 720, - "lines": 17 + "octets": 720 }, "end": 5555827, "octets": 836, @@ -4051,13 +4418,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77262, "begin": 5555861, "headersEnd": 5555863, "message": { + "lineNumber": 77263, "begin": 5555863, "headersEnd": 5555999, "body": { "mimeType": "text/plain", + "lineNumber": 77263, "begin": 5555863, "headersEnd": 5555999, "end": 5556390, @@ -4065,8 +4435,7 @@ "lines": 11 }, "end": 5556390, - "octets": 391, - "lines": 11 + "octets": 391 }, "end": 5556390, "octets": 527, @@ -4074,13 +4443,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77280, "begin": 5556424, "headersEnd": 5556426, "message": { + "lineNumber": 77281, "begin": 5556426, "headersEnd": 5556566, "body": { "mimeType": "text/plain", + "lineNumber": 77281, "begin": 5556426, "headersEnd": 5556566, "end": 5557567, @@ -4088,8 +4460,7 @@ "lines": 24 }, "end": 5557567, - "octets": 1001, - "lines": 24 + "octets": 1001 }, "end": 5557567, "octets": 1141, @@ -4097,13 +4468,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77311, "begin": 5557601, "headersEnd": 5557603, "message": { + "lineNumber": 77312, "begin": 5557603, "headersEnd": 5557752, "body": { "mimeType": "text/plain", + "lineNumber": 77312, "begin": 5557603, "headersEnd": 5557752, "end": 5558229, @@ -4111,8 +4485,7 @@ "lines": 10 }, "end": 5558229, - "octets": 477, - "lines": 10 + "octets": 477 }, "end": 5558229, "octets": 626, @@ -4120,13 +4493,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77328, "begin": 5558263, "headersEnd": 5558265, "message": { + "lineNumber": 77329, "begin": 5558265, "headersEnd": 5558402, "body": { "mimeType": "text/plain", + "lineNumber": 77329, "begin": 5558265, "headersEnd": 5558402, "end": 5558691, @@ -4134,8 +4510,7 @@ "lines": 10 }, "end": 5558691, - "octets": 289, - "lines": 10 + "octets": 289 }, "end": 5558691, "octets": 426, @@ -4143,13 +4518,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77345, "begin": 5558725, "headersEnd": 5558727, "message": { + "lineNumber": 77346, "begin": 5558727, "headersEnd": 5558856, "body": { "mimeType": "text/plain", + "lineNumber": 77346, "begin": 5558727, "headersEnd": 5558856, "end": 5559142, @@ -4157,8 +4535,7 @@ "lines": 4 }, "end": 5559142, - "octets": 286, - "lines": 4 + "octets": 286 }, "end": 5559142, "octets": 415, @@ -4166,13 +4543,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77356, "begin": 5559176, "headersEnd": 5559178, "message": { + "lineNumber": 77357, "begin": 5559178, "headersEnd": 5559303, "body": { "mimeType": "text/plain", + "lineNumber": 77357, "begin": 5559178, "headersEnd": 5559303, "end": 5559973, @@ -4180,8 +4560,7 @@ "lines": 27 }, "end": 5559973, - "octets": 670, - "lines": 27 + "octets": 670 }, "end": 5559973, "octets": 795, @@ -4189,13 +4568,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77390, "begin": 5560007, "headersEnd": 5560009, "message": { + "lineNumber": 77391, "begin": 5560009, "headersEnd": 5560157, "body": { "mimeType": "text/plain", + "lineNumber": 77391, "begin": 5560009, "headersEnd": 5560157, "end": 5562461, @@ -4203,8 +4585,7 @@ "lines": 46 }, "end": 5562461, - "octets": 2304, - "lines": 46 + "octets": 2304 }, "end": 5562461, "octets": 2452, @@ -4212,13 +4593,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77443, "begin": 5562495, "headersEnd": 5562497, "message": { + "lineNumber": 77444, "begin": 5562497, "headersEnd": 5562623, "body": { "mimeType": "text/plain", + "lineNumber": 77444, "begin": 5562497, "headersEnd": 5562623, "end": 5563432, @@ -4226,8 +4610,7 @@ "lines": 17 }, "end": 5563432, - "octets": 809, - "lines": 17 + "octets": 809 }, "end": 5563432, "octets": 935, @@ -4235,13 +4618,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77467, "begin": 5563466, "headersEnd": 5563468, "message": { + "lineNumber": 77468, "begin": 5563468, "headersEnd": 5563566, "body": { "mimeType": "text/plain", + "lineNumber": 77468, "begin": 5563468, "headersEnd": 5563566, "end": 5563802, @@ -4249,8 +4635,7 @@ "lines": 10 }, "end": 5563802, - "octets": 236, - "lines": 10 + "octets": 236 }, "end": 5563802, "octets": 334, @@ -4258,13 +4643,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77484, "begin": 5563836, "headersEnd": 5563838, "message": { + "lineNumber": 77485, "begin": 5563838, "headersEnd": 5563963, "body": { "mimeType": "text/plain", + "lineNumber": 77485, "begin": 5563838, "headersEnd": 5563963, "end": 5564651, @@ -4272,8 +4660,7 @@ "lines": 20 }, "end": 5564651, - "octets": 688, - "lines": 20 + "octets": 688 }, "end": 5564651, "octets": 813, @@ -4281,13 +4668,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77511, "begin": 5564685, "headersEnd": 5564687, "message": { + "lineNumber": 77512, "begin": 5564687, "headersEnd": 5564801, "body": { "mimeType": "text/plain", + "lineNumber": 77512, "begin": 5564687, "headersEnd": 5564801, "end": 5567416, @@ -4295,8 +4685,7 @@ "lines": 68 }, "end": 5567416, - "octets": 2615, - "lines": 68 + "octets": 2615 }, "end": 5567416, "octets": 2729, @@ -4304,13 +4693,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77586, "begin": 5567450, "headersEnd": 5567452, "message": { + "lineNumber": 77587, "begin": 5567452, "headersEnd": 5567562, "body": { "mimeType": "text/plain", + "lineNumber": 77587, "begin": 5567452, "headersEnd": 5567562, "end": 5568805, @@ -4318,8 +4710,7 @@ "lines": 34 }, "end": 5568805, - "octets": 1243, - "lines": 34 + "octets": 1243 }, "end": 5568805, "octets": 1353, @@ -4327,13 +4718,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77627, "begin": 5568839, "headersEnd": 5568841, "message": { + "lineNumber": 77628, "begin": 5568841, "headersEnd": 5568951, "body": { "mimeType": "text/plain", + "lineNumber": 77628, "begin": 5568841, "headersEnd": 5568951, "end": 5570791, @@ -4341,8 +4735,7 @@ "lines": 43 }, "end": 5570791, - "octets": 1840, - "lines": 43 + "octets": 1840 }, "end": 5570791, "octets": 1950, @@ -4350,13 +4743,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77677, "begin": 5570825, "headersEnd": 5570827, "message": { + "lineNumber": 77678, "begin": 5570827, "headersEnd": 5570960, "body": { "mimeType": "text/plain", + "lineNumber": 77678, "begin": 5570827, "headersEnd": 5570960, "end": 5571542, @@ -4364,8 +4760,7 @@ "lines": 12 }, "end": 5571542, - "octets": 582, - "lines": 12 + "octets": 582 }, "end": 5571542, "octets": 715, @@ -4373,13 +4768,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77696, "begin": 5571576, "headersEnd": 5571578, "message": { + "lineNumber": 77697, "begin": 5571578, "headersEnd": 5571670, "body": { "mimeType": "text/plain", + "lineNumber": 77697, "begin": 5571578, "headersEnd": 5571670, "end": 5573024, @@ -4387,8 +4785,7 @@ "lines": 20 }, "end": 5573024, - "octets": 1354, - "lines": 20 + "octets": 1354 }, "end": 5573024, "octets": 1446, @@ -4396,13 +4793,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77723, "begin": 5573058, "headersEnd": 5573060, "message": { + "lineNumber": 77724, "begin": 5573060, "headersEnd": 5573180, "body": { "mimeType": "text/plain", + "lineNumber": 77724, "begin": 5573060, "headersEnd": 5573180, "end": 5575356, @@ -4410,8 +4810,7 @@ "lines": 49 }, "end": 5575356, - "octets": 2176, - "lines": 49 + "octets": 2176 }, "end": 5575356, "octets": 2296, @@ -4419,13 +4818,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77779, "begin": 5575390, "headersEnd": 5575392, "message": { + "lineNumber": 77780, "begin": 5575392, "headersEnd": 5575517, "body": { "mimeType": "text/plain", + "lineNumber": 77780, "begin": 5575392, "headersEnd": 5575517, "end": 5577580, @@ -4433,8 +4835,7 @@ "lines": 42 }, "end": 5577580, - "octets": 2063, - "lines": 42 + "octets": 2063 }, "end": 5577580, "octets": 2188, @@ -4442,13 +4843,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77828, "begin": 5577614, "headersEnd": 5577616, "message": { + "lineNumber": 77829, "begin": 5577616, "headersEnd": 5577741, "body": { "mimeType": "text/plain", + "lineNumber": 77829, "begin": 5577616, "headersEnd": 5577741, "end": 5578437, @@ -4456,8 +4860,7 @@ "lines": 19 }, "end": 5578437, - "octets": 696, - "lines": 19 + "octets": 696 }, "end": 5578437, "octets": 821, @@ -4465,13 +4868,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77854, "begin": 5578471, "headersEnd": 5578473, "message": { + "lineNumber": 77855, "begin": 5578473, "headersEnd": 5578614, "body": { "mimeType": "text/plain", + "lineNumber": 77855, "begin": 5578473, "headersEnd": 5578614, "end": 5579450, @@ -4479,8 +4885,7 @@ "lines": 16 }, "end": 5579450, - "octets": 836, - "lines": 16 + "octets": 836 }, "end": 5579450, "octets": 977, @@ -4488,13 +4893,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77877, "begin": 5579484, "headersEnd": 5579486, "message": { + "lineNumber": 77878, "begin": 5579486, "headersEnd": 5579614, "body": { "mimeType": "text/plain", + "lineNumber": 77878, "begin": 5579486, "headersEnd": 5579614, "end": 5580359, @@ -4502,8 +4910,7 @@ "lines": 21 }, "end": 5580359, - "octets": 745, - "lines": 21 + "octets": 745 }, "end": 5580359, "octets": 873, @@ -4511,13 +4918,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77905, "begin": 5580393, "headersEnd": 5580395, "message": { + "lineNumber": 77906, "begin": 5580395, "headersEnd": 5580501, "body": { "mimeType": "text/plain", + "lineNumber": 77906, "begin": 5580395, "headersEnd": 5580501, "end": 5581257, @@ -4525,8 +4935,7 @@ "lines": 16 }, "end": 5581257, - "octets": 756, - "lines": 16 + "octets": 756 }, "end": 5581257, "octets": 862, @@ -4534,13 +4943,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77928, "begin": 5581291, "headersEnd": 5581293, "message": { + "lineNumber": 77929, "begin": 5581293, "headersEnd": 5581454, "body": { "mimeType": "text/plain", + "lineNumber": 77929, "begin": 5581293, "headersEnd": 5581454, "end": 5581820, @@ -4548,8 +4960,7 @@ "lines": 7 }, "end": 5581820, - "octets": 366, - "lines": 7 + "octets": 366 }, "end": 5581820, "octets": 527, @@ -4557,13 +4968,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77943, "begin": 5581854, "headersEnd": 5581856, "message": { + "lineNumber": 77944, "begin": 5581856, "headersEnd": 5581947, "body": { "mimeType": "text/plain", + "lineNumber": 77944, "begin": 5581856, "headersEnd": 5581947, "end": 5582597, @@ -4571,8 +4985,7 @@ "lines": 15 }, "end": 5582597, - "octets": 650, - "lines": 15 + "octets": 650 }, "end": 5582597, "octets": 741, @@ -4580,13 +4993,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77965, "begin": 5582631, "headersEnd": 5582633, "message": { + "lineNumber": 77966, "begin": 5582633, "headersEnd": 5582786, "body": { "mimeType": "text/plain", + "lineNumber": 77966, "begin": 5582633, "headersEnd": 5582786, "end": 5583169, @@ -4594,8 +5010,7 @@ "lines": 17 }, "end": 5583169, - "octets": 383, - "lines": 17 + "octets": 383 }, "end": 5583169, "octets": 536, @@ -4603,13 +5018,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77989, "begin": 5583203, "headersEnd": 5583205, "message": { + "lineNumber": 77990, "begin": 5583205, "headersEnd": 5583310, "body": { "mimeType": "text/plain", + "lineNumber": 77990, "begin": 5583205, "headersEnd": 5583310, "end": 5583604, @@ -4617,8 +5035,7 @@ "lines": 6 }, "end": 5583604, - "octets": 294, - "lines": 6 + "octets": 294 }, "end": 5583604, "octets": 399, @@ -4626,13 +5043,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78002, "begin": 5583638, "headersEnd": 5583640, "message": { + "lineNumber": 78003, "begin": 5583640, "headersEnd": 5583772, "body": { "mimeType": "text/plain", + "lineNumber": 78003, "begin": 5583640, "headersEnd": 5583772, "end": 5584267, @@ -4640,8 +5060,7 @@ "lines": 16 }, "end": 5584267, - "octets": 495, - "lines": 16 + "octets": 495 }, "end": 5584267, "octets": 627, @@ -4649,13 +5068,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78025, "begin": 5584301, "headersEnd": 5584303, "message": { + "lineNumber": 78026, "begin": 5584303, "headersEnd": 5584404, "body": { "mimeType": "text/plain", + "lineNumber": 78026, "begin": 5584303, "headersEnd": 5584404, "end": 5584803, @@ -4663,8 +5085,7 @@ "lines": 19 }, "end": 5584803, - "octets": 399, - "lines": 19 + "octets": 399 }, "end": 5584803, "octets": 500, @@ -4672,13 +5093,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78051, "begin": 5584837, "headersEnd": 5584839, "message": { + "lineNumber": 78052, "begin": 5584839, "headersEnd": 5584958, "body": { "mimeType": "text/plain", + "lineNumber": 78052, "begin": 5584839, "headersEnd": 5584958, "end": 5586303, @@ -4686,8 +5110,7 @@ "lines": 26 }, "end": 5586303, - "octets": 1345, - "lines": 26 + "octets": 1345 }, "end": 5586303, "octets": 1464, @@ -4695,13 +5118,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78084, "begin": 5586337, "headersEnd": 5586339, "message": { + "lineNumber": 78085, "begin": 5586339, "headersEnd": 5586443, "body": { "mimeType": "text/plain", + "lineNumber": 78085, "begin": 5586339, "headersEnd": 5586443, "end": 5586747, @@ -4709,8 +5135,7 @@ "lines": 9 }, "end": 5586747, - "octets": 304, - "lines": 9 + "octets": 304 }, "end": 5586747, "octets": 408, @@ -4718,13 +5143,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78100, "begin": 5586781, "headersEnd": 5586783, "message": { + "lineNumber": 78101, "begin": 5586783, "headersEnd": 5586930, "body": { "mimeType": "text/plain", + "lineNumber": 78101, "begin": 5586783, "headersEnd": 5586930, "end": 5587985, @@ -4732,8 +5160,7 @@ "lines": 36 }, "end": 5587985, - "octets": 1055, - "lines": 36 + "octets": 1055 }, "end": 5587985, "octets": 1202, @@ -4750,16 +5177,17 @@ "lines": 1958 }, "end": 5588100, - "octets": 70738, - "lines": 1958 + "octets": 70738 }, { "mboxMarkerBegin": 5588102, "mboxMarkerLength": 7, + "lineNumber": 78149, "begin": 5588111, "headersEnd": 5588934, "body": { "mimeType": "text/plain", + "lineNumber": 78149, "begin": 5588111, "headersEnd": 5588934, "end": 5590853, @@ -4767,21 +5195,23 @@ "lines": 49 }, "end": 5590853, - "octets": 1919, - "lines": 49 + "octets": 1919 }, { "mboxMarkerBegin": 5590855, "mboxMarkerLength": 7, + "lineNumber": 78214, "begin": 5590864, "headersEnd": 5591607, "body": { "mimeType": "multipart/mixed", + "lineNumber": 78214, "begin": 5590864, "headersEnd": 5591607, "children": [ { "mimeType": "text/plain", + "lineNumber": 78231, "begin": 5591635, "headersEnd": 5591637, "end": 5591750, @@ -4790,6 +5220,7 @@ }, { "mimeType": "application/x-annotate", + "lineNumber": 78235, "begin": 5591780, "headersEnd": 5591872, "end": 5724575, @@ -4798,6 +5229,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 80251, "begin": 5724605, "headersEnd": 5724607, "end": 5724663, @@ -4806,6 +5238,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 80255, "begin": 5724693, "headersEnd": 5724843, "end": 5739817, @@ -4814,6 +5247,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 80339, "begin": 5739847, "headersEnd": 5739849, "end": 5739944, @@ -4822,6 +5256,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 80347, "begin": 5739974, "headersEnd": 5740124, "end": 5748266, @@ -4830,6 +5265,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 80395, "begin": 5748296, "headersEnd": 5748298, "end": 5748375, @@ -4842,16 +5278,17 @@ "lines": 2171 }, "end": 5748407, - "octets": 156800, - "lines": 2171 + "octets": 156800 }, { "mboxMarkerBegin": 5748409, "mboxMarkerLength": 7, + "lineNumber": 80403, "begin": 5748418, "headersEnd": 5748956, "body": { "mimeType": "text/richtext", + "lineNumber": 80403, "begin": 5748418, "headersEnd": 5748956, "end": 5749545, @@ -4859,21 +5296,23 @@ "lines": 21 }, "end": 5749545, - "octets": 589, - "lines": 21 + "octets": 589 }, { "mboxMarkerBegin": 5749547, "mboxMarkerLength": 7, + "lineNumber": 80441, "begin": 5749556, "headersEnd": 5750765, "body": { "mimeType": "multipart/alternative", + "lineNumber": 80441, "begin": 5749556, "headersEnd": 5750765, "children": [ { "mimeType": "text/plain", + "lineNumber": 80468, "begin": 5750964, "headersEnd": 5751010, "end": 5751766, @@ -4882,11 +5321,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 80498, "begin": 5751809, "headersEnd": 5751897, "children": [ { "mimeType": "text/richtext", + "lineNumber": 80502, "begin": 5751940, "headersEnd": 5752034, "end": 5752861, @@ -4895,6 +5336,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 80532, "begin": 5752906, "headersEnd": 5753003, "end": 5811629, @@ -4903,6 +5345,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 81293, "begin": 5811674, "headersEnd": 5811768, "end": 5811774, @@ -4920,21 +5363,23 @@ "lines": 837 }, "end": 5811866, - "octets": 61101, - "lines": 837 + "octets": 61101 }, { "mboxMarkerBegin": 5811868, "mboxMarkerLength": 7, + "lineNumber": 81303, "begin": 5811877, "headersEnd": 5812634, "body": { "mimeType": "multipart/mixed", + "lineNumber": 81303, "begin": 5811877, "headersEnd": 5812634, "children": [ { "mimeType": "text/plain", + "lineNumber": 81322, "begin": 5812686, "headersEnd": 5812779, "end": 5812960, @@ -4943,6 +5388,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 81334, "begin": 5813012, "headersEnd": 5813074, "end": 5869078, @@ -4955,16 +5401,17 @@ "lines": 775 }, "end": 5869132, - "octets": 56498, - "lines": 775 + "octets": 56498 }, { "mboxMarkerBegin": 5869134, "mboxMarkerLength": 31, + "lineNumber": 82097, "begin": 5869167, "headersEnd": 5870664, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 82097, "begin": 5869167, "headersEnd": 5870664, "end": 5872038, @@ -4972,21 +5419,23 @@ "lines": 34 }, "end": 5872038, - "octets": 1374, - "lines": 34 + "octets": 1374 }, { "mboxMarkerBegin": 5872040, "mboxMarkerLength": 7, + "lineNumber": 82163, "begin": 5872049, "headersEnd": 5872857, "body": { "mimeType": "multipart/mixed", + "lineNumber": 82163, "begin": 5872049, "headersEnd": 5872857, "children": [ { "mimeType": "text/plain", + "lineNumber": 82180, "begin": 5872931, "headersEnd": 5873010, "end": 5873393, @@ -4995,13 +5444,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 82198, "begin": 5873421, "headersEnd": 5873515, "message": { + "lineNumber": 82202, "begin": 5873515, "headersEnd": 5874597, "body": { "mimeType": "text/html", + "lineNumber": 82202, "begin": 5873515, "headersEnd": 5874597, "end": 5899455, @@ -5009,8 +5461,7 @@ "lines": 463 }, "end": 5899455, - "octets": 24858, - "lines": 463 + "octets": 24858 }, "end": 5899455, "octets": 25940, @@ -5022,21 +5473,23 @@ "lines": 504 }, "end": 5899485, - "octets": 26628, - "lines": 504 + "octets": 26628 }, { "mboxMarkerBegin": 5899487, "mboxMarkerLength": 7, + "lineNumber": 82683, "begin": 5899496, "headersEnd": 5900178, "body": { "mimeType": "multipart/mixed", + "lineNumber": 82683, "begin": 5899496, "headersEnd": 5900178, "children": [ { "mimeType": "text/plain", + "lineNumber": 82700, "begin": 5900275, "headersEnd": 5900356, "end": 5900391, @@ -5045,6 +5498,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 82706, "begin": 5900442, "headersEnd": 5900504, "end": 5922958, @@ -5057,21 +5511,23 @@ "lines": 317 }, "end": 5923009, - "octets": 22831, - "lines": 317 + "octets": 22831 }, { "mboxMarkerBegin": 5923011, "mboxMarkerLength": 31, + "lineNumber": 83015, "begin": 5923044, "headersEnd": 5923581, "body": { "mimeType": "multipart/mixed", + "lineNumber": 83015, "begin": 5923044, "headersEnd": 5923581, "children": [ { "mimeType": "text/plain", + "lineNumber": 83029, "begin": 5923590, "headersEnd": 5923636, "end": 5924829, @@ -5080,6 +5536,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 83054, "begin": 5924840, "headersEnd": 5924970, "end": 5925118, @@ -5088,6 +5545,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 83062, "begin": 5925129, "headersEnd": 5925249, "end": 5925445, @@ -5100,16 +5558,17 @@ "lines": 42 }, "end": 5925456, - "octets": 1875, - "lines": 42 + "octets": 1875 }, { "mboxMarkerBegin": 5925458, "mboxMarkerLength": 7, + "lineNumber": 83071, "begin": 5925467, "headersEnd": 5926279, "body": { "mimeType": "audio/basic", + "lineNumber": 83071, "begin": 5925467, "headersEnd": 5926279, "end": 6186575, @@ -5117,21 +5576,23 @@ "lines": 3518 }, "end": 6186575, - "octets": 260296, - "lines": 3518 + "octets": 260296 }, { "mboxMarkerBegin": 6186577, "mboxMarkerLength": 7, + "lineNumber": 86609, "begin": 6186586, "headersEnd": 6187457, "body": { "mimeType": "multipart/mixed", + "lineNumber": 86609, "begin": 6186586, "headersEnd": 6187457, "children": [ { "mimeType": "text/plain", + "lineNumber": 86630, "begin": 6187474, "headersEnd": 6187554, "end": 6187752, @@ -5140,6 +5601,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 86643, "begin": 6187769, "headersEnd": 6187877, "end": 6287399, @@ -5152,21 +5614,23 @@ "lines": 1296 }, "end": 6287418, - "octets": 99961, - "lines": 1296 + "octets": 99961 }, { "mboxMarkerBegin": 6287420, "mboxMarkerLength": 7, + "lineNumber": 87926, "begin": 6287429, "headersEnd": 6288325, "body": { "mimeType": "multipart/mixed", + "lineNumber": 87926, "begin": 6287429, "headersEnd": 6288325, "children": [ { "mimeType": "text/plain", + "lineNumber": 87946, "begin": 6288335, "headersEnd": 6288383, "end": 6289347, @@ -5175,21 +5639,25 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 87971, "begin": 6289359, "headersEnd": 6289424, "children": [ { "mimeType": "multipart/mixed", + "lineNumber": 87975, "begin": 6289449, "headersEnd": 6289818, "children": [ { "mimeType": "multipart/mixed", + "lineNumber": 87984, "begin": 6289841, "headersEnd": 6289946, "children": [ { "mimeType": "text/richtext", + "lineNumber": 87988, "begin": 6289969, "headersEnd": 6290096, "end": 6290470, @@ -5198,6 +5666,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 88002, "begin": 6290495, "headersEnd": 6290621, "end": 6291023, @@ -5206,6 +5675,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 88018, "begin": 6291048, "headersEnd": 6291177, "end": 6291903, @@ -5219,11 +5689,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 88044, "begin": 6291955, "headersEnd": 6292057, "children": [ { "mimeType": "text/richtext", + "lineNumber": 88048, "begin": 6292080, "headersEnd": 6292216, "end": 6309101, @@ -5232,6 +5704,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 88524, "begin": 6309126, "headersEnd": 6309261, "end": 6323910, @@ -5240,11 +5713,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 88925, "begin": 6323935, "headersEnd": 6324039, "children": [ { "mimeType": "text/richtext", + "lineNumber": 88929, "begin": 6324062, "headersEnd": 6324208, "end": 6330524, @@ -5253,6 +5728,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89099, "begin": 6330549, "headersEnd": 6330680, "end": 6336095, @@ -5261,6 +5737,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89265, "begin": 6336120, "headersEnd": 6336261, "end": 6343756, @@ -5269,6 +5746,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89468, "begin": 6343781, "headersEnd": 6343909, "end": 6350569, @@ -5277,6 +5755,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89658, "begin": 6350594, "headersEnd": 6350735, "end": 6368395, @@ -5290,11 +5769,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 90158, "begin": 6368447, "headersEnd": 6368545, "children": [ { "mimeType": "text/richtext", + "lineNumber": 90162, "begin": 6368568, "headersEnd": 6368706, "end": 6369222, @@ -5313,11 +5794,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 90193, "begin": 6369301, "headersEnd": 6369415, "children": [ { "mimeType": "text/richtext", + "lineNumber": 90197, "begin": 6369438, "headersEnd": 6369580, "end": 6370758, @@ -5326,6 +5809,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 90232, "begin": 6370783, "headersEnd": 6370913, "end": 6372168, @@ -5334,6 +5818,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 90273, "begin": 6372193, "headersEnd": 6372337, "end": 6373036, @@ -5361,16 +5846,17 @@ "lines": 2362 }, "end": 6373131, - "octets": 84806, - "lines": 2362 + "octets": 84806 }, { "mboxMarkerBegin": 6373133, "mboxMarkerLength": 7, + "lineNumber": 90309, "begin": 6373142, "headersEnd": 6373961, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 90309, "begin": 6373142, "headersEnd": 6373961, "end": 6383386, @@ -5378,21 +5864,23 @@ "lines": 226 }, "end": 6383386, - "octets": 9425, - "lines": 226 + "octets": 9425 }, { "mboxMarkerBegin": 6383388, "mboxMarkerLength": 7, + "lineNumber": 90554, "begin": 6383397, "headersEnd": 6384141, "body": { "mimeType": "multipart/alternative", + "lineNumber": 90554, "begin": 6383397, "headersEnd": 6384141, "children": [ { "mimeType": "text/plain", + "lineNumber": 90574, "begin": 6384340, "headersEnd": 6384386, "end": 6385165, @@ -5401,11 +5889,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 90601, "begin": 6385208, "headersEnd": 6385296, "children": [ { "mimeType": "text/richtext", + "lineNumber": 90605, "begin": 6385339, "headersEnd": 6385433, "end": 6385767, @@ -5414,6 +5904,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 90617, "begin": 6385812, "headersEnd": 6385910, "end": 6408254, @@ -5422,6 +5913,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 90943, "begin": 6408299, "headersEnd": 6408393, "end": 6408564, @@ -5430,6 +5922,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 90953, "begin": 6408609, "headersEnd": 6408710, "end": 6456608, @@ -5438,6 +5931,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 91644, "begin": 6456653, "headersEnd": 6456747, "end": 6456819, @@ -5446,6 +5940,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 91651, "begin": 6456864, "headersEnd": 6456958, "end": 6477470, @@ -5454,6 +5949,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 91951, "begin": 6477515, "headersEnd": 6477609, "end": 6477721, @@ -5471,21 +5967,23 @@ "lines": 1396 }, "end": 6477811, - "octets": 93670, - "lines": 1396 + "octets": 93670 }, { "mboxMarkerBegin": 6477813, "mboxMarkerLength": 7, + "lineNumber": 91967, "begin": 6477822, "headersEnd": 6478593, "body": { "mimeType": "multipart/mixed", + "lineNumber": 91967, "begin": 6477822, "headersEnd": 6478593, "children": [ { "mimeType": "text/richtext", + "lineNumber": 91989, "begin": 6478838, "headersEnd": 6478914, "end": 6479347, @@ -5494,6 +5992,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 92007, "begin": 6479395, "headersEnd": 6479459, "end": 6513483, @@ -5502,6 +6001,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 92472, "begin": 6513531, "headersEnd": 6513607, "end": 6513708, @@ -5514,16 +6014,17 @@ "lines": 500 }, "end": 6513758, - "octets": 35165, - "lines": 500 + "octets": 35165 }, { "mboxMarkerBegin": 6513760, "mboxMarkerLength": 41, + "lineNumber": 92486, "begin": 6513803, "headersEnd": 6513957, "body": { "mimeType": "text/plain", + "lineNumber": 92486, "begin": 6513803, "headersEnd": 6513957, "end": 6557679, @@ -5531,26 +6032,29 @@ "lines": 693 }, "end": 6557679, - "octets": 43722, - "lines": 693 + "octets": 43722 }, { "mboxMarkerBegin": 6557681, "mboxMarkerLength": 31, + "lineNumber": 93187, "begin": 6557714, "headersEnd": 6558312, "body": { "mimeType": "multipart/mixed", + "lineNumber": 93187, "begin": 6557714, "headersEnd": 6558312, "children": [ { "mimeType": "multipart/alternative", + "lineNumber": 93205, "begin": 6558400, "headersEnd": 6558521, "children": [ { "mimeType": "text/plain", + "lineNumber": 93210, "begin": 6558563, "headersEnd": 6558644, "end": 6559954, @@ -5559,6 +6063,7 @@ }, { "mimeType": "text/html", + "lineNumber": 93253, "begin": 6559996, "headersEnd": 6560078, "end": 6562574, @@ -5572,6 +6077,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 93293, "begin": 6562662, "headersEnd": 6562872, "end": 6583892, @@ -5584,21 +6090,23 @@ "lines": 368 }, "end": 6583936, - "octets": 25624, - "lines": 368 + "octets": 25624 }, { "mboxMarkerBegin": 6583938, "mboxMarkerLength": 31, + "lineNumber": 93572, "begin": 6583971, "headersEnd": 6584388, "body": { "mimeType": "multipart/mixed", + "lineNumber": 93572, "begin": 6583971, "headersEnd": 6584388, "children": [ { "mimeType": "text/plain", + "lineNumber": 93586, "begin": 6584457, "headersEnd": 6584459, "end": 6584523, @@ -5607,11 +6115,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93590, "begin": 6584546, "headersEnd": 6584622, "children": [ { "mimeType": "text/plain", + "lineNumber": 93593, "begin": 6584650, "headersEnd": 6584760, "end": 6584843, @@ -5620,6 +6130,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 93602, "begin": 6584873, "headersEnd": 6584986, "end": 6585148, @@ -5628,6 +6139,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 93612, "begin": 6585178, "headersEnd": 6585291, "end": 6585464, @@ -5636,6 +6148,7 @@ }, { "mimeType": "text/html", + "lineNumber": 93628, "begin": 6585494, "headersEnd": 6585603, "end": 6585767, @@ -5644,6 +6157,7 @@ }, { "mimeType": "text/something-you-dont-know", + "lineNumber": 93637, "begin": 6585797, "headersEnd": 6585925, "end": 6586358, @@ -5657,6 +6171,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 93650, "begin": 6586411, "headersEnd": 6586413, "end": 6586582, @@ -5665,11 +6180,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93657, "begin": 6586605, "headersEnd": 6586657, "children": [ { "mimeType": "text/plain", + "lineNumber": 93660, "begin": 6586663, "headersEnd": 6586691, "end": 6586745, @@ -5678,11 +6195,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93665, "begin": 6586753, "headersEnd": 6586805, "children": [ { "mimeType": "text/plain", + "lineNumber": 93668, "begin": 6586811, "headersEnd": 6586839, "end": 6586893, @@ -5691,6 +6210,7 @@ }, { "mimeType": "text/html", + "lineNumber": 93673, "begin": 6586901, "headersEnd": 6586928, "end": 6586979, @@ -5699,6 +6219,7 @@ }, { "mimeType": "text/x-barf", + "lineNumber": 93678, "begin": 6586987, "headersEnd": 6587016, "end": 6587071, @@ -5712,6 +6233,7 @@ }, { "mimeType": "application/spankme", + "lineNumber": 93685, "begin": 6587089, "headersEnd": 6587184, "end": 6587200, @@ -5725,6 +6247,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 93692, "begin": 6587231, "headersEnd": 6587233, "end": 6587243, @@ -5737,21 +6260,23 @@ "lines": 113 }, "end": 6587266, - "octets": 2878, - "lines": 113 + "octets": 2878 }, { "mboxMarkerBegin": 6587268, "mboxMarkerLength": 31, + "lineNumber": 93697, "begin": 6587301, "headersEnd": 6587716, "body": { "mimeType": "multipart/mixed", + "lineNumber": 93697, "begin": 6587301, "headersEnd": 6587716, "children": [ { "mimeType": "text/plain", + "lineNumber": 93711, "begin": 6587785, "headersEnd": 6587787, "end": 6587855, @@ -5760,11 +6285,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93715, "begin": 6587878, "headersEnd": 6587954, "children": [ { "mimeType": "text/plain", + "lineNumber": 93718, "begin": 6587982, "headersEnd": 6588142, "end": 6645008, @@ -5773,6 +6300,7 @@ }, { "mimeType": "text/html", + "lineNumber": 95327, "begin": 6645038, "headersEnd": 6645197, "end": 6754228, @@ -5781,6 +6309,7 @@ }, { "mimeType": "application/postscript", + "lineNumber": 98315, "begin": 6754258, "headersEnd": 6754408, "end": 6955876, @@ -5798,21 +6327,23 @@ "lines": 17726 }, "end": 6955939, - "octets": 368223, - "lines": 17726 + "octets": 368223 }, { "mboxMarkerBegin": 6955941, "mboxMarkerLength": 7, + "lineNumber": 111435, "begin": 6955950, "headersEnd": 6956567, "body": { "mimeType": "MULTIPART/MIXED", + "lineNumber": 111435, "begin": 6955950, "headersEnd": 6956567, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 111453, "begin": 6956828, "headersEnd": 6956943, "end": 6956943, @@ -5821,13 +6352,16 @@ }, { "mimeType": "MESSAGE/RFC822", + "lineNumber": 111458, "begin": 6956986, "headersEnd": 6957087, "message": { + "lineNumber": 111461, "begin": 6957087, "headersEnd": 6957640, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 111461, "begin": 6957087, "headersEnd": 6957640, "end": 6958002, @@ -5835,8 +6369,7 @@ "lines": 16 }, "end": 6958002, - "octets": 362, - "lines": 16 + "octets": 362 }, "end": 6958002, "octets": 915, @@ -5848,21 +6381,23 @@ "lines": 43 }, "end": 6958045, - "octets": 1478, - "lines": 43 + "octets": 1478 }, { "mboxMarkerBegin": 6958047, "mboxMarkerLength": 7, + "lineNumber": 111492, "begin": 6958056, "headersEnd": 6958361, "body": { "mimeType": "multipart/related", + "lineNumber": 111492, "begin": 6958056, "headersEnd": 6958361, "children": [ { "mimeType": "text/html", + "lineNumber": 111502, "begin": 6958401, "headersEnd": 6958654, "end": 6959403, @@ -5871,6 +6406,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 111541, "begin": 6959445, "headersEnd": 6959773, "end": 6970643, @@ -5883,21 +6419,23 @@ "lines": 197 }, "end": 6970685, - "octets": 12324, - "lines": 197 + "octets": 12324 }, { "mboxMarkerBegin": 6970687, "mboxMarkerLength": 7, + "lineNumber": 111699, "begin": 6970696, "headersEnd": 6971001, "body": { "mimeType": "multipart/related", + "lineNumber": 111699, "begin": 6970696, "headersEnd": 6971001, "children": [ { "mimeType": "text/html", + "lineNumber": 111709, "begin": 6971041, "headersEnd": 6971294, "end": 6972042, @@ -5906,6 +6444,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 111748, "begin": 6972084, "headersEnd": 6972381, "end": 6983251, @@ -5918,21 +6457,23 @@ "lines": 197 }, "end": 6983293, - "octets": 12292, - "lines": 197 + "octets": 12292 }, { "mboxMarkerBegin": 6983295, "mboxMarkerLength": 31, + "lineNumber": 111906, "begin": 6983328, "headersEnd": 6984857, "body": { "mimeType": "multipart/related", + "lineNumber": 111906, "begin": 6983328, "headersEnd": 6984857, "children": [ { "mimeType": "text/html", + "lineNumber": 111934, "begin": 6984904, "headersEnd": 6984998, "end": 6990308, @@ -5941,6 +6482,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112050, "begin": 6990355, "headersEnd": 6990560, "end": 6991502, @@ -5953,21 +6495,23 @@ "lines": 139 }, "end": 6991551, - "octets": 6694, - "lines": 139 + "octets": 6694 }, { "mboxMarkerBegin": 6991553, "mboxMarkerLength": 31, + "lineNumber": 112073, "begin": 6991586, "headersEnd": 6992045, "body": { "mimeType": "multipart/mixed", + "lineNumber": 112073, "begin": 6991586, "headersEnd": 6992045, "children": [ { "mimeType": "text/plain", + "lineNumber": 112086, "begin": 6992085, "headersEnd": 6992113, "end": 6992366, @@ -5976,11 +6520,13 @@ }, { "mimeType": "multipart/related", + "lineNumber": 112096, "begin": 6992408, "headersEnd": 6992497, "children": [ { "mimeType": "text/html", + "lineNumber": 112100, "begin": 6992537, "headersEnd": 6992736, "end": 7000063, @@ -5989,6 +6535,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112286, "begin": 7000105, "headersEnd": 7000286, "end": 7008376, @@ -5997,6 +6544,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112402, "begin": 7008418, "headersEnd": 7008582, "end": 7016138, @@ -6005,6 +6553,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112511, "begin": 7016180, "headersEnd": 7016343, "end": 7019721, @@ -6013,6 +6562,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112563, "begin": 7019763, "headersEnd": 7019927, "end": 7028493, @@ -6021,6 +6571,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112685, "begin": 7028535, "headersEnd": 7028696, "end": 7134494, @@ -6029,6 +6580,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 114121, "begin": 7134536, "headersEnd": 7134700, "end": 7173586, @@ -6037,6 +6589,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 114653, "begin": 7173628, "headersEnd": 7173797, "end": 7209595, @@ -6054,21 +6607,23 @@ "lines": 3059 }, "end": 7209679, - "octets": 217634, - "lines": 3059 + "octets": 217634 }, { "mboxMarkerBegin": 7209681, "mboxMarkerLength": 7, + "lineNumber": 115145, "begin": 7209690, "headersEnd": 7209994, "body": { "mimeType": "multipart/related", + "lineNumber": 115145, "begin": 7209690, "headersEnd": 7209994, "children": [ { "mimeType": "text/html", + "lineNumber": 115155, "begin": 7210034, "headersEnd": 7210195, "end": 7210773, @@ -6077,6 +6632,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115189, "begin": 7210815, "headersEnd": 7210932, "end": 7221802, @@ -6089,21 +6645,23 @@ "lines": 188 }, "end": 7221844, - "octets": 11850, - "lines": 188 + "octets": 11850 }, { "mboxMarkerBegin": 7221846, "mboxMarkerLength": 7, + "lineNumber": 115343, "begin": 7221855, "headersEnd": 7222159, "body": { "mimeType": "multipart/related", + "lineNumber": 115343, "begin": 7221855, "headersEnd": 7222159, "children": [ { "mimeType": "text/html", + "lineNumber": 115353, "begin": 7222199, "headersEnd": 7222417, "end": 7223042, @@ -6112,6 +6670,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115389, "begin": 7223084, "headersEnd": 7223365, "end": 7234235, @@ -6124,21 +6683,23 @@ "lines": 193 }, "end": 7234277, - "octets": 12118, - "lines": 193 + "octets": 12118 }, { "mboxMarkerBegin": 7234279, "mboxMarkerLength": 7, + "lineNumber": 115546, "begin": 7234288, "headersEnd": 7234592, "body": { "mimeType": "multipart/related", + "lineNumber": 115546, "begin": 7234288, "headersEnd": 7234592, "children": [ { "mimeType": "text/html", + "lineNumber": 115556, "begin": 7234632, "headersEnd": 7234854, "end": 7235483, @@ -6147,6 +6708,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115592, "begin": 7235525, "headersEnd": 7235705, "end": 7246575, @@ -6159,21 +6721,23 @@ "lines": 191 }, "end": 7246617, - "octets": 12025, - "lines": 191 + "octets": 12025 }, { "mboxMarkerBegin": 7246619, "mboxMarkerLength": 7, + "lineNumber": 115747, "begin": 7246628, "headersEnd": 7246932, "body": { "mimeType": "multipart/related", + "lineNumber": 115747, "begin": 7246628, "headersEnd": 7246932, "children": [ { "mimeType": "text/html", + "lineNumber": 115757, "begin": 7246972, "headersEnd": 7247224, "end": 7247884, @@ -6182,6 +6746,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115795, "begin": 7247926, "headersEnd": 7248239, "end": 7259109, @@ -6194,21 +6759,23 @@ "lines": 196 }, "end": 7259151, - "octets": 12219, - "lines": 196 + "octets": 12219 }, { "mboxMarkerBegin": 7259153, "mboxMarkerLength": 7, + "lineNumber": 115953, "begin": 7259162, "headersEnd": 7259466, "body": { "mimeType": "multipart/related", + "lineNumber": 115953, "begin": 7259162, "headersEnd": 7259466, "children": [ { "mimeType": "text/html", + "lineNumber": 115963, "begin": 7259506, "headersEnd": 7259728, "end": 7260401, @@ -6217,6 +6784,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115999, "begin": 7260443, "headersEnd": 7260623, "end": 7271493, @@ -6229,21 +6797,23 @@ "lines": 191 }, "end": 7271535, - "octets": 12069, - "lines": 191 + "octets": 12069 }, { "mboxMarkerBegin": 7271537, "mboxMarkerLength": 7, + "lineNumber": 116154, "begin": 7271546, "headersEnd": 7271850, "body": { "mimeType": "multipart/related", + "lineNumber": 116154, "begin": 7271546, "headersEnd": 7271850, "children": [ { "mimeType": "text/html", + "lineNumber": 116164, "begin": 7271890, "headersEnd": 7272142, "end": 7272841, @@ -6252,6 +6822,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 116202, "begin": 7272883, "headersEnd": 7273227, "end": 7284097, @@ -6264,21 +6835,23 @@ "lines": 196 }, "end": 7284139, - "octets": 12289, - "lines": 196 + "octets": 12289 }, { "mboxMarkerBegin": 7284141, "mboxMarkerLength": 31, + "lineNumber": 116360, "begin": 7284174, "headersEnd": 7285430, "body": { "mimeType": "multipart/mixed", + "lineNumber": 116360, "begin": 7284174, "headersEnd": 7285430, "children": [ { "mimeType": "text/plain", + "lineNumber": 116385, "begin": 7285517, "headersEnd": 7285596, "end": 7285626, @@ -6287,18 +6860,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 116393, "begin": 7285667, "headersEnd": 7285761, "message": { + "lineNumber": 116397, "begin": 7285761, "headersEnd": 7286598, "body": { "mimeType": "multipart/alternative", + "lineNumber": 116397, "begin": 7285761, "headersEnd": 7286598, "children": [ { "mimeType": "text/plain", + "lineNumber": 116415, "begin": 7286640, "headersEnd": 7286719, "end": 7287362, @@ -6307,11 +6884,13 @@ }, { "mimeType": "multipart/related", + "lineNumber": 116436, "begin": 7287404, "headersEnd": 7287488, "children": [ { "mimeType": "text/html", + "lineNumber": 116440, "begin": 7287530, "headersEnd": 7287608, "end": 7288476, @@ -6320,6 +6899,7 @@ }, { "mimeType": "image/tiff", + "lineNumber": 116463, "begin": 7288518, "headersEnd": 7288707, "end": 8042865, @@ -6337,8 +6917,7 @@ "lines": 10252 }, "end": 8042957, - "octets": 756359, - "lines": 10252 + "octets": 756359 }, "end": 8042957, "octets": 757196, @@ -6350,21 +6929,23 @@ "lines": 10285 }, "end": 8043000, - "octets": 757570, - "lines": 10285 + "octets": 757570 }, { "mboxMarkerBegin": 8043002, "mboxMarkerLength": 31, + "lineNumber": 126669, "begin": 8043035, "headersEnd": 8044321, "body": { "mimeType": "multipart/related", + "lineNumber": 126669, "begin": 8043035, "headersEnd": 8044321, "children": [ { "mimeType": "text/html", + "lineNumber": 126693, "begin": 8044368, "headersEnd": 8044462, "end": 8046894, @@ -6373,6 +6954,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126748, "begin": 8046941, "headersEnd": 8047105, "end": 8053207, @@ -6381,6 +6963,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126834, "begin": 8053254, "headersEnd": 8053417, "end": 8065647, @@ -6389,6 +6972,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126998, "begin": 8065694, "headersEnd": 8065859, "end": 8087855, @@ -6397,6 +6981,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 127287, "begin": 8087902, "headersEnd": 8088111, "end": 8091549, @@ -6409,16 +6994,17 @@ "lines": 649 }, "end": 8091598, - "octets": 47277, - "lines": 649 + "octets": 47277 }, { "mboxMarkerBegin": 8091600, "mboxMarkerLength": 7, + "lineNumber": 127342, "begin": 8091609, "headersEnd": 8092367, "body": { "mimeType": "audio/basic", + "lineNumber": 127342, "begin": 8091609, "headersEnd": 8092367, "end": 8644457, @@ -6426,21 +7012,23 @@ "lines": 7474 }, "end": 8644457, - "octets": 552090, - "lines": 7474 + "octets": 552090 }, { "mboxMarkerBegin": 8644459, "mboxMarkerLength": 7, + "lineNumber": 134835, "begin": 8644468, "headersEnd": 8645400, "body": { "mimeType": "multipart/mixed", + "lineNumber": 134835, "begin": 8644468, "headersEnd": 8645400, "children": [ { "mimeType": "text/richtext", + "lineNumber": 134858, "begin": 8645411, "headersEnd": 8645442, "end": 8648068, @@ -6453,21 +7041,23 @@ "lines": 102 }, "end": 8648081, - "octets": 2681, - "lines": 102 + "octets": 2681 }, { "mboxMarkerBegin": 8648083, "mboxMarkerLength": 31, + "lineNumber": 134960, "begin": 8648116, "headersEnd": 8648726, "body": { "mimeType": "multipart/signed", + "lineNumber": 134960, "begin": 8648116, "headersEnd": 8648726, "children": [ { "mimeType": "text/plain", + "lineNumber": 134984, "begin": 8649031, "headersEnd": 8649078, "end": 8650186, @@ -6476,6 +7066,7 @@ }, { "mimeType": "application/pgp-signature", + "lineNumber": 135014, "begin": 8650206, "headersEnd": 8650249, "end": 8650542, @@ -6488,16 +7079,17 @@ "lines": 51 }, "end": 8650562, - "octets": 1836, - "lines": 51 + "octets": 1836 }, { "mboxMarkerBegin": 8650564, "mboxMarkerLength": 7, + "lineNumber": 135028, "begin": 8650573, "headersEnd": 8651756, "body": { "mimeType": "application/pgp", + "lineNumber": 135028, "begin": 8650573, "headersEnd": 8651756, "end": 8653178, @@ -6505,16 +7097,17 @@ "lines": 40 }, "end": 8653178, - "octets": 1422, - "lines": 40 + "octets": 1422 }, { "mboxMarkerBegin": 8653180, "mboxMarkerLength": 7, + "lineNumber": 135090, "begin": 8653189, "headersEnd": 8653839, "body": { "mimeType": "text/plain", + "lineNumber": 135090, "begin": 8653189, "headersEnd": 8653839, "end": 8654840, @@ -6522,21 +7115,23 @@ "lines": 27 }, "end": 8654840, - "octets": 1001, - "lines": 27 + "octets": 1001 }, { "mboxMarkerBegin": 8654842, "mboxMarkerLength": 7, + "lineNumber": 135136, "begin": 8654851, "headersEnd": 8655631, "body": { "mimeType": "multipart/alternative", + "lineNumber": 135136, "begin": 8654851, "headersEnd": 8655631, "children": [ { "mimeType": "text/plain", + "lineNumber": 135158, "begin": 8655830, "headersEnd": 8655876, "end": 8656708, @@ -6545,11 +7140,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 135177, "begin": 8656751, "headersEnd": 8656839, "children": [ { "mimeType": "text/richtext", + "lineNumber": 135181, "begin": 8656882, "headersEnd": 8656976, "end": 8657477, @@ -6558,13 +7155,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 135196, "begin": 8657522, "headersEnd": 8657715, "message": { + "lineNumber": 135203, "begin": 8657715, "headersEnd": 8657744, "body": { "mimeType": "audio/basic", + "lineNumber": 135203, "begin": 8657715, "headersEnd": 8657744, "end": 8657748, @@ -6572,8 +7172,7 @@ "lines": 2 }, "end": 8657748, - "octets": 4, - "lines": 2 + "octets": 4 }, "end": 8657748, "octets": 33, @@ -6581,6 +7180,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 135209, "begin": 8657793, "headersEnd": 8657884, "end": 8657889, @@ -6589,13 +7189,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 135216, "begin": 8657934, "headersEnd": 8658142, "message": { + "lineNumber": 135223, "begin": 8658142, "headersEnd": 8658169, "body": { "mimeType": "image/gif", + "lineNumber": 135223, "begin": 8658142, "headersEnd": 8658169, "end": 8658173, @@ -6603,8 +7206,7 @@ "lines": 2 }, "end": 8658173, - "octets": 4, - "lines": 2 + "octets": 4 }, "end": 8658173, "octets": 31, @@ -6612,6 +7214,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135229, "begin": 8658218, "headersEnd": 8658312, "end": 8658541, @@ -6629,16 +7232,17 @@ "lines": 89 }, "end": 8658633, - "octets": 3002, - "lines": 89 + "octets": 3002 }, { "mboxMarkerBegin": 8658635, "mboxMarkerLength": 7, + "lineNumber": 135245, "begin": 8658644, "headersEnd": 8659476, "body": { "mimeType": "text/richtext", + "lineNumber": 135245, "begin": 8658644, "headersEnd": 8659476, "end": 8660904, @@ -6646,16 +7250,17 @@ "lines": 42 }, "end": 8660904, - "octets": 1428, - "lines": 42 + "octets": 1428 }, { "mboxMarkerBegin": 8660906, "mboxMarkerLength": 7, + "lineNumber": 135307, "begin": 8660915, "headersEnd": 8661072, "body": { "mimeType": "message/partial", + "lineNumber": 135307, "begin": 8660915, "headersEnd": 8661072, "end": 8665806, @@ -6663,21 +7268,23 @@ "lines": 64 }, "end": 8665806, - "octets": 4734, - "lines": 64 + "octets": 4734 }, { "mboxMarkerBegin": 8665808, "mboxMarkerLength": 7, + "lineNumber": 135377, "begin": 8665817, "headersEnd": 8667595, "body": { "mimeType": "multipart/alternative", + "lineNumber": 135377, "begin": 8665817, "headersEnd": 8667595, "children": [ { "mimeType": "text/plain", + "lineNumber": 135416, "begin": 8667794, "headersEnd": 8667840, "end": 8669545, @@ -6686,11 +7293,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 135458, "begin": 8669588, "headersEnd": 8669676, "children": [ { "mimeType": "text/richtext", + "lineNumber": 135462, "begin": 8669719, "headersEnd": 8669813, "end": 8670384, @@ -6699,6 +7308,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135481, "begin": 8670429, "headersEnd": 8670493, "end": 8671377, @@ -6707,6 +7317,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135498, "begin": 8671422, "headersEnd": 8671516, "end": 8671567, @@ -6715,6 +7326,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135508, "begin": 8671612, "headersEnd": 8671676, "end": 8672560, @@ -6723,6 +7335,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135525, "begin": 8672605, "headersEnd": 8672699, "end": 8672750, @@ -6731,6 +7344,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135535, "begin": 8672795, "headersEnd": 8672859, "end": 8673743, @@ -6739,6 +7353,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135552, "begin": 8673788, "headersEnd": 8673882, "end": 8673927, @@ -6747,6 +7362,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135562, "begin": 8673972, "headersEnd": 8674036, "end": 8674264, @@ -6755,6 +7371,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135571, "begin": 8674309, "headersEnd": 8674403, "end": 8674472, @@ -6763,6 +7380,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135581, "begin": 8674517, "headersEnd": 8674581, "end": 8674809, @@ -6771,6 +7389,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135590, "begin": 8674854, "headersEnd": 8674948, "end": 8674997, @@ -6779,6 +7398,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135600, "begin": 8675042, "headersEnd": 8675106, "end": 8675334, @@ -6787,6 +7407,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135609, "begin": 8675379, "headersEnd": 8675473, "end": 8675776, @@ -6795,6 +7416,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135625, "begin": 8675821, "headersEnd": 8675885, "end": 8676769, @@ -6803,6 +7425,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135642, "begin": 8676814, "headersEnd": 8676908, "end": 8676952, @@ -6811,6 +7434,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135651, "begin": 8676997, "headersEnd": 8677061, "end": 8679003, @@ -6819,6 +7443,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135683, "begin": 8679048, "headersEnd": 8679142, "end": 8679153, @@ -6836,21 +7461,23 @@ "lines": 279 }, "end": 8679245, - "octets": 11650, - "lines": 279 + "octets": 11650 }, { "mboxMarkerBegin": 8679247, "mboxMarkerLength": 7, + "lineNumber": 135693, "begin": 8679256, "headersEnd": 8680000, "body": { "mimeType": "multipart/alternative", + "lineNumber": 135693, "begin": 8679256, "headersEnd": 8680000, "children": [ { "mimeType": "text/plain", + "lineNumber": 135713, "begin": 8680199, "headersEnd": 8680245, "end": 8680884, @@ -6859,11 +7486,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 135729, "begin": 8680927, "headersEnd": 8681015, "children": [ { "mimeType": "text/richtext", + "lineNumber": 135733, "begin": 8681058, "headersEnd": 8681152, "end": 8681693, @@ -6872,6 +7501,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 135746, "begin": 8681738, "headersEnd": 8681850, "end": 8690560, @@ -6880,6 +7510,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135877, "begin": 8690605, "headersEnd": 8690699, "end": 8690747, @@ -6897,21 +7528,23 @@ "lines": 178 }, "end": 8690837, - "octets": 10837, - "lines": 178 + "octets": 10837 }, { "mboxMarkerBegin": 8690839, "mboxMarkerLength": 7, + "lineNumber": 135888, "begin": 8690848, "headersEnd": 8691509, "body": { "mimeType": "multipart/mixed", + "lineNumber": 135888, "begin": 8690848, "headersEnd": 8691509, "children": [ { "mimeType": "text/plain", + "lineNumber": 135905, "begin": 8691561, "headersEnd": 8691654, "end": 8691757, @@ -6920,6 +7553,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 135916, "begin": 8691809, "headersEnd": 8691940, "end": 8771456, @@ -6932,21 +7566,23 @@ "lines": 1093 }, "end": 8771510, - "octets": 80001, - "lines": 1093 + "octets": 80001 }, { "mboxMarkerBegin": 8771512, "mboxMarkerLength": 7, + "lineNumber": 136998, "begin": 8771521, "headersEnd": 8772294, "body": { "mimeType": "multipart/alternative", + "lineNumber": 136998, "begin": 8771521, "headersEnd": 8772294, "children": [ { "mimeType": "text/plain", + "lineNumber": 137019, "begin": 8772493, "headersEnd": 8772539, "end": 8773917, @@ -6955,11 +7591,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 137051, "begin": 8773960, "headersEnd": 8774048, "children": [ { "mimeType": "text/richtext", + "lineNumber": 137055, "begin": 8774091, "headersEnd": 8774185, "end": 8775346, @@ -6968,6 +7606,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 137082, "begin": 8775391, "headersEnd": 8775493, "end": 8892315, @@ -6976,6 +7615,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 138667, "begin": 8892360, "headersEnd": 8892454, "end": 8892580, @@ -6984,6 +7624,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 138675, "begin": 8892625, "headersEnd": 8892728, "end": 8959970, @@ -6992,6 +7633,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 139642, "begin": 8960015, "headersEnd": 8960106, "end": 8960106, @@ -7009,16 +7651,17 @@ "lines": 2634 }, "end": 8960196, - "octets": 187902, - "lines": 2634 + "octets": 187902 }, { "mboxMarkerBegin": 8960198, "mboxMarkerLength": 7, + "lineNumber": 139650, "begin": 8960207, "headersEnd": 8961063, "body": { "mimeType": "application/x-pkcs", + "lineNumber": 139650, "begin": 8960207, "headersEnd": 8961063, "end": 8962821, @@ -7026,23 +7669,26 @@ "lines": 25 }, "end": 8962821, - "octets": 1758, - "lines": 25 + "octets": 1758 }, { "mboxMarkerBegin": 8962823, "mboxMarkerLength": 7, + "lineNumber": 139696, "begin": 8962832, "headersEnd": 8963476, "body": { "mimeType": "MESSAGE/RFC822", + "lineNumber": 139696, "begin": 8962832, "headersEnd": 8963476, "message": { + "lineNumber": 139710, "begin": 8963476, "headersEnd": 8963972, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 139710, "begin": 8963476, "headersEnd": 8963972, "end": 8964871, @@ -7050,29 +7696,30 @@ "lines": 25 }, "end": 8964871, - "octets": 899, - "lines": 25 + "octets": 899 }, "end": 8964871, "octets": 1395, "lines": 38 }, "end": 8964871, - "octets": 1395, - "lines": 38 + "octets": 1395 }, { "mboxMarkerBegin": 8964873, "mboxMarkerLength": 7, + "lineNumber": 139749, "begin": 8964882, "headersEnd": 8965340, "body": { "mimeType": "multipart/mixed", + "lineNumber": 139749, "begin": 8964882, "headersEnd": 8965340, "children": [ { "mimeType": "text/plain", + "lineNumber": 139763, "begin": 8965350, "headersEnd": 8965352, "end": 8965393, @@ -7081,6 +7728,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 139767, "begin": 8965405, "headersEnd": 8965469, "end": 9057967, @@ -7093,16 +7741,17 @@ "lines": 1261 }, "end": 9057985, - "octets": 92645, - "lines": 1261 + "octets": 92645 }, { "mboxMarkerBegin": 9057987, "mboxMarkerLength": 7, + "lineNumber": 141025, "begin": 9057996, "headersEnd": 9058498, "body": { "mimeType": "text/plain", + "lineNumber": 141025, "begin": 9057996, "headersEnd": 9058498, "end": 9059667, @@ -7110,21 +7759,23 @@ "lines": 27 }, "end": 9059667, - "octets": 1169, - "lines": 27 + "octets": 1169 }, { "mboxMarkerBegin": 9059669, "mboxMarkerLength": 7, + "lineNumber": 141066, "begin": 9059678, "headersEnd": 9060843, "body": { "mimeType": "multipart/mixed", + "lineNumber": 141066, "begin": 9059678, "headersEnd": 9060843, "children": [ { "mimeType": "text/plain", + "lineNumber": 141092, "begin": 9060849, "headersEnd": 9060851, "end": 9061403, @@ -7133,6 +7784,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 141107, "begin": 9061411, "headersEnd": 9061531, "end": 9119961, @@ -7141,6 +7793,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 141902, "begin": 9119969, "headersEnd": 9119971, "end": 9123837, @@ -7149,6 +7802,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 141988, "begin": 9123845, "headersEnd": 9124003, "end": 9154647, @@ -7157,6 +7811,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 143003, "begin": 9154655, "headersEnd": 9154764, "end": 9155504, @@ -7165,6 +7820,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 143032, "begin": 9155512, "headersEnd": 9155632, "end": 9156920, @@ -7177,21 +7833,23 @@ "lines": 1970 }, "end": 9156930, - "octets": 96087, - "lines": 1970 + "octets": 96087 }, { "mboxMarkerBegin": 9156932, "mboxMarkerLength": 31, + "lineNumber": 143063, "begin": 9156965, "headersEnd": 9158136, "body": { "mimeType": "multipart/signed", + "lineNumber": 143063, "begin": 9156965, "headersEnd": 9158136, "children": [ { "mimeType": "text/plain", + "lineNumber": 143082, "begin": 9158154, "headersEnd": 9158156, "end": 9159077, @@ -7200,6 +7858,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 143105, "begin": 9159097, "headersEnd": 9159179, "end": 9159939, @@ -7212,21 +7871,23 @@ "lines": 41 }, "end": 9159961, - "octets": 1825, - "lines": 41 + "octets": 1825 }, { "mboxMarkerBegin": 9159963, "mboxMarkerLength": 31, + "lineNumber": 143124, "begin": 9159996, "headersEnd": 9161157, "body": { "mimeType": "multipart/mixed", + "lineNumber": 143124, "begin": 9159996, "headersEnd": 9161157, "children": [ { "mimeType": "text/plain", + "lineNumber": 143147, "begin": 9161341, "headersEnd": 9161422, "end": 9162176, @@ -7235,6 +7896,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143165, "begin": 9162186, "headersEnd": 9162369, "end": 9164615, @@ -7247,21 +7909,23 @@ "lines": 60 }, "end": 9164625, - "octets": 3468, - "lines": 60 + "octets": 3468 }, { "mboxMarkerBegin": 9164627, "mboxMarkerLength": 31, + "lineNumber": 143204, "begin": 9164660, "headersEnd": 9165820, "body": { "mimeType": "multipart/mixed", + "lineNumber": 143204, "begin": 9164660, "headersEnd": 9165820, "children": [ { "mimeType": "text/plain", + "lineNumber": 143231, "begin": 9166018, "headersEnd": 9166099, "end": 9168957, @@ -7270,6 +7934,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143282, "begin": 9168981, "headersEnd": 9169164, "end": 9171746, @@ -7282,16 +7947,17 @@ "lines": 97 }, "end": 9171770, - "octets": 5950, - "lines": 97 + "octets": 5950 }, { "mboxMarkerBegin": 9171772, "mboxMarkerLength": 7, + "lineNumber": 143325, "begin": 9171781, "headersEnd": 9171996, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143325, "begin": 9171781, "headersEnd": 9171996, "end": 9176246, @@ -7299,21 +7965,23 @@ "lines": 58 }, "end": 9176246, - "octets": 4250, - "lines": 58 + "octets": 4250 }, { "mboxMarkerBegin": 9176248, "mboxMarkerLength": 31, + "lineNumber": 143391, "begin": 9176281, "headersEnd": 9177199, "body": { "mimeType": "multipart/signed", + "lineNumber": 143391, "begin": 9176281, "headersEnd": 9177199, "children": [ { "mimeType": "image/jpeg", + "lineNumber": 143412, "begin": 9177275, "headersEnd": 9177413, "end": 9188281, @@ -7322,6 +7990,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 143564, "begin": 9188311, "headersEnd": 9188466, "end": 9193140, @@ -7334,16 +8003,17 @@ "lines": 224 }, "end": 9193172, - "octets": 15973, - "lines": 224 + "octets": 15973 }, { "mboxMarkerBegin": 9193174, "mboxMarkerLength": 31, + "lineNumber": 143635, "begin": 9193207, "headersEnd": 9194031, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143635, "begin": 9193207, "headersEnd": 9194031, "end": 9211049, @@ -7351,16 +8021,17 @@ "lines": 258 }, "end": 9211049, - "octets": 17018, - "lines": 258 + "octets": 17018 }, { "mboxMarkerBegin": 9211051, "mboxMarkerLength": 31, + "lineNumber": 143911, "begin": 9211084, "headersEnd": 9211913, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143911, "begin": 9211084, "headersEnd": 9211913, "end": 9237261, @@ -7368,16 +8039,17 @@ "lines": 385 }, "end": 9237261, - "octets": 25348, - "lines": 385 + "octets": 25348 }, { "mboxMarkerBegin": 9237263, "mboxMarkerLength": 31, + "lineNumber": 144314, "begin": 9237296, "headersEnd": 9238125, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 144314, "begin": 9237296, "headersEnd": 9238125, "end": 9274811, @@ -7385,16 +8057,17 @@ "lines": 556 }, "end": 9274811, - "octets": 36686, - "lines": 556 + "octets": 36686 }, { "mboxMarkerBegin": 9274813, "mboxMarkerLength": 31, + "lineNumber": 144888, "begin": 9274846, "headersEnd": 9275678, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 144888, "begin": 9274846, "headersEnd": 9275678, "end": 9327768, @@ -7402,16 +8075,17 @@ "lines": 790 }, "end": 9327768, - "octets": 52090, - "lines": 790 + "octets": 52090 }, { "mboxMarkerBegin": 9327770, "mboxMarkerLength": 31, + "lineNumber": 145696, "begin": 9327803, "headersEnd": 9329218, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145696, "begin": 9327803, "headersEnd": 9329218, "end": 9330668, @@ -7419,21 +8093,23 @@ "lines": 20 }, "end": 9330668, - "octets": 1450, - "lines": 20 + "octets": 1450 }, { "mboxMarkerBegin": 9330670, "mboxMarkerLength": 31, + "lineNumber": 145741, "begin": 9330703, "headersEnd": 9332080, "body": { "mimeType": "multipart/signed", + "lineNumber": 145741, "begin": 9330703, "headersEnd": 9332080, "children": [ { "mimeType": "text/plain", + "lineNumber": 145767, "begin": 9332127, "headersEnd": 9332194, "end": 9332304, @@ -7442,6 +8118,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 145775, "begin": 9332351, "headersEnd": 9332506, "end": 9336492, @@ -7454,16 +8131,17 @@ "lines": 69 }, "end": 9336541, - "octets": 4461, - "lines": 69 + "octets": 4461 }, { "mboxMarkerBegin": 9336543, "mboxMarkerLength": 31, + "lineNumber": 145836, "begin": 9336576, "headersEnd": 9337807, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145836, "begin": 9336576, "headersEnd": 9337807, "end": 9341357, @@ -7471,16 +8149,17 @@ "lines": 55 }, "end": 9341357, - "octets": 3550, - "lines": 55 + "octets": 3550 }, { "mboxMarkerBegin": 9341359, "mboxMarkerLength": 31, + "lineNumber": 145914, "begin": 9341392, "headersEnd": 9342490, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145914, "begin": 9341392, "headersEnd": 9342490, "end": 9343160, @@ -7488,16 +8167,17 @@ "lines": 10 }, "end": 9343160, - "octets": 670, - "lines": 10 + "octets": 670 }, { "mboxMarkerBegin": 9343162, "mboxMarkerLength": 7, + "lineNumber": 145946, "begin": 9343171, "headersEnd": 9343574, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145946, "begin": 9343171, "headersEnd": 9343574, "end": 9351298, @@ -7505,23 +8185,26 @@ "lines": 105 }, "end": 9351298, - "octets": 7724, - "lines": 105 + "octets": 7724 }, { "mboxMarkerBegin": 9351300, "mboxMarkerLength": 31, + "lineNumber": 146063, "begin": 9351333, "headersEnd": 9352135, "body": { "mimeType": "message/rfc822", + "lineNumber": 146063, "begin": 9351333, "headersEnd": 9352135, "message": { + "lineNumber": 146082, "begin": 9352135, "headersEnd": 9353538, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146082, "begin": 9352135, "headersEnd": 9353538, "end": 9354990, @@ -7529,29 +8212,30 @@ "lines": 20 }, "end": 9354990, - "octets": 1452, - "lines": 20 + "octets": 1452 }, "end": 9354990, "octets": 2855, "lines": 43 }, "end": 9354990, - "octets": 2855, - "lines": 43 + "octets": 2855 }, { "mboxMarkerBegin": 9354992, "mboxMarkerLength": 31, + "lineNumber": 146127, "begin": 9355025, "headersEnd": 9355752, "body": { "mimeType": "multipart/mixed", + "lineNumber": 146127, "begin": 9355025, "headersEnd": 9355752, "children": [ { "mimeType": "text/plain", + "lineNumber": 146147, "begin": 9355828, "headersEnd": 9355907, "end": 9355923, @@ -7560,13 +8244,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 146153, "begin": 9355953, "headersEnd": 9356111, "message": { + "lineNumber": 146157, "begin": 9356111, "headersEnd": 9357514, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146157, "begin": 9356111, "headersEnd": 9357514, "end": 9358966, @@ -7574,8 +8261,7 @@ "lines": 20 }, "end": 9358966, - "octets": 1452, - "lines": 20 + "octets": 1452 }, "end": 9358966, "octets": 2855, @@ -7587,21 +8273,23 @@ "lines": 58 }, "end": 9358998, - "octets": 3246, - "lines": 58 + "octets": 3246 }, { "mboxMarkerBegin": 9359000, "mboxMarkerLength": 31, + "lineNumber": 146204, "begin": 9359033, "headersEnd": 9359714, "body": { "mimeType": "multipart/signed", + "lineNumber": 146204, "begin": 9359033, "headersEnd": 9359714, "children": [ { "mimeType": "text/plain", + "lineNumber": 146223, "begin": 9359818, "headersEnd": 9359897, "end": 9359939, @@ -7610,6 +8298,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 146229, "begin": 9359983, "headersEnd": 9360138, "end": 9365770, @@ -7622,16 +8311,17 @@ "lines": 91 }, "end": 9365816, - "octets": 6102, - "lines": 91 + "octets": 6102 }, { "mboxMarkerBegin": 9365818, "mboxMarkerLength": 31, + "lineNumber": 146313, "begin": 9365851, "headersEnd": 9366934, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146313, "begin": 9365851, "headersEnd": 9366934, "end": 9377310, @@ -7639,21 +8329,23 @@ "lines": 141 }, "end": 9377310, - "octets": 10376, - "lines": 141 + "octets": 10376 }, { "mboxMarkerBegin": 9377312, "mboxMarkerLength": 31, + "lineNumber": 146476, "begin": 9377345, "headersEnd": 9378745, "body": { "mimeType": "multipart/signed", + "lineNumber": 146476, "begin": 9377345, "headersEnd": 9378745, "children": [ { "mimeType": "text/plain", + "lineNumber": 146503, "begin": 9378849, "headersEnd": 9378928, "end": 9379555, @@ -7662,6 +8354,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 146524, "begin": 9379599, "headersEnd": 9379754, "end": 9381566, @@ -7674,16 +8367,17 @@ "lines": 54 }, "end": 9381612, - "octets": 2867, - "lines": 54 + "octets": 2867 }, { "mboxMarkerBegin": 9381614, "mboxMarkerLength": 31, + "lineNumber": 146556, "begin": 9381647, "headersEnd": 9382210, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146556, "begin": 9381647, "headersEnd": 9382210, "end": 9382740, @@ -7691,21 +8385,23 @@ "lines": 8 }, "end": 9382740, - "octets": 530, - "lines": 8 + "octets": 530 }, { "mboxMarkerBegin": 9382742, "mboxMarkerLength": 7, + "lineNumber": 146580, "begin": 9382751, "headersEnd": 9384087, "body": { "mimeType": "MULTIPART/SIGNED", + "lineNumber": 146580, "begin": 9382751, "headersEnd": 9384087, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 146605, "begin": 9384349, "headersEnd": 9384395, "end": 9384998, @@ -7718,21 +8414,23 @@ "lines": 24 }, "end": 9385042, - "octets": 955, - "lines": 24 + "octets": 955 }, { "mboxMarkerBegin": 9385044, "mboxMarkerLength": 7, + "lineNumber": 146625, "begin": 9385053, "headersEnd": 9386420, "body": { "mimeType": "MULTIPART/SIGNED", + "lineNumber": 146625, "begin": 9385053, "headersEnd": 9386420, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 146650, "begin": 9386682, "headersEnd": 9386728, "end": 9386835, @@ -7741,11 +8439,13 @@ }, { "mimeType": "MULTIPART/MIXED", + "lineNumber": 146660, "begin": 9386879, "headersEnd": 9387046, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 146669, "begin": 9387306, "headersEnd": 9387416, "end": 9387511, @@ -7754,13 +8454,16 @@ }, { "mimeType": "MESSAGE/RFC822", + "lineNumber": 146678, "begin": 9387553, "headersEnd": 9387649, "message": { + "lineNumber": 146681, "begin": 9387649, "headersEnd": 9388845, "body": { "mimeType": "text/plain", + "lineNumber": 146681, "begin": 9387649, "headersEnd": 9388845, "end": 9389055, @@ -7768,8 +8471,7 @@ "lines": 5 }, "end": 9389055, - "octets": 210, - "lines": 5 + "octets": 210 }, "end": 9389055, "octets": 1406, @@ -7777,6 +8479,7 @@ }, { "mimeType": "TEXT/X-VCARD", + "lineNumber": 146717, "begin": 9389097, "headersEnd": 9389267, "end": 9389757, @@ -7790,6 +8493,7 @@ }, { "mimeType": "APPLICATION/X-PKCS7-SIGNATURE", + "lineNumber": 146735, "begin": 9389843, "headersEnd": 9390060, "end": 9395354, @@ -7802,16 +8506,17 @@ "lines": 169 }, "end": 9395402, - "octets": 8982, - "lines": 169 + "octets": 8982 }, { "mboxMarkerBegin": 9395404, "mboxMarkerLength": 31, + "lineNumber": 146816, "begin": 9395437, "headersEnd": 9396672, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146816, "begin": 9395437, "headersEnd": 9396672, "end": 9399592, @@ -7819,16 +8524,17 @@ "lines": 38 }, "end": 9399592, - "octets": 2920, - "lines": 38 + "octets": 2920 }, { "mboxMarkerBegin": 9399594, "mboxMarkerLength": 31, + "lineNumber": 146876, "begin": 9399627, "headersEnd": 9400806, "body": { "mimeType": "Application/x-pkcs7-mime", + "lineNumber": 146876, "begin": 9399627, "headersEnd": 9400806, "end": 9402958, @@ -7836,21 +8542,23 @@ "lines": 30 }, "end": 9402958, - "octets": 2152, - "lines": 30 + "octets": 2152 }, { "mboxMarkerBegin": 9402960, "mboxMarkerLength": 31, + "lineNumber": 146929, "begin": 9402993, "headersEnd": 9404092, "body": { "mimeType": "multipart/signed", + "lineNumber": 146929, "begin": 9402993, "headersEnd": 9404092, "children": [ { "mimeType": "text/plain", + "lineNumber": 146952, "begin": 9404127, "headersEnd": 9404194, "end": 9404194, @@ -7859,6 +8567,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 146957, "begin": 9404229, "headersEnd": 9404311, "end": 9407065, @@ -7871,21 +8580,23 @@ "lines": 53 }, "end": 9407102, - "octets": 3010, - "lines": 53 + "octets": 3010 }, { "mboxMarkerBegin": 9407104, "mboxMarkerLength": 31, + "lineNumber": 147005, "begin": 9407137, "headersEnd": 9408193, "body": { "mimeType": "multipart/mixed", + "lineNumber": 147005, "begin": 9407137, "headersEnd": 9408193, "children": [ { "mimeType": "text/plain", + "lineNumber": 147026, "begin": 9408236, "headersEnd": 9408317, "end": 9408783, @@ -7894,6 +8605,7 @@ }, { "mimeType": "text/html", + "lineNumber": 147044, "begin": 9408826, "headersEnd": 9408904, "end": 9409741, @@ -7902,6 +8614,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147075, "begin": 9409784, "headersEnd": 9409884, "end": 9411100, @@ -7914,21 +8627,23 @@ "lines": 72 }, "end": 9411145, - "octets": 2952, - "lines": 72 + "octets": 2952 }, { "mboxMarkerBegin": 9411147, "mboxMarkerLength": 31, + "lineNumber": 147098, "begin": 9411180, "headersEnd": 9412276, "body": { "mimeType": "multipart/signed", + "lineNumber": 147098, "begin": 9411180, "headersEnd": 9412276, "children": [ { "mimeType": "text/plain", + "lineNumber": 147121, "begin": 9412321, "headersEnd": 9412394, "end": 9412553, @@ -7937,6 +8652,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147133, "begin": 9412598, "headersEnd": 9412680, "end": 9416832, @@ -7949,21 +8665,23 @@ "lines": 75 }, "end": 9416879, - "octets": 4603, - "lines": 75 + "octets": 4603 }, { "mboxMarkerBegin": 9416881, "mboxMarkerLength": 7, + "lineNumber": 147196, "begin": 9416890, "headersEnd": 9417456, "body": { "mimeType": "multipart/signed", + "lineNumber": 147196, "begin": 9416890, "headersEnd": 9417456, "children": [ { "mimeType": "text/plain", + "lineNumber": 147213, "begin": 9417502, "headersEnd": 9417569, "end": 9417727, @@ -7972,6 +8690,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147221, "begin": 9417773, "headersEnd": 9417928, "end": 9421898, @@ -7984,21 +8703,23 @@ "lines": 69 }, "end": 9421944, - "octets": 4488, - "lines": 69 + "octets": 4488 }, { "mboxMarkerBegin": 9421946, "mboxMarkerLength": 31, + "lineNumber": 147281, "begin": 9421979, "headersEnd": 9423163, "body": { "mimeType": "multipart/mixed", + "lineNumber": 147281, "begin": 9421979, "headersEnd": 9423163, "children": [ { "mimeType": "text/plain", + "lineNumber": 147305, "begin": 9423344, "headersEnd": 9423425, "end": 9423502, @@ -8007,6 +8728,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 147315, "begin": 9423545, "headersEnd": 9423643, "end": 9427249, @@ -8019,21 +8741,23 @@ "lines": 66 }, "end": 9427294, - "octets": 4131, - "lines": 66 + "octets": 4131 }, { "mboxMarkerBegin": 9427296, "mboxMarkerLength": 31, + "lineNumber": 147369, "begin": 9427329, "headersEnd": 9428452, "body": { "mimeType": "multipart/signed", + "lineNumber": 147369, "begin": 9427329, "headersEnd": 9428452, "children": [ { "mimeType": "text/plain", + "lineNumber": 147392, "begin": 9428488, "headersEnd": 9428569, "end": 9428647, @@ -8042,6 +8766,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147401, "begin": 9428683, "headersEnd": 9428765, "end": 9432539, @@ -8054,21 +8779,23 @@ "lines": 73 }, "end": 9432575, - "octets": 4123, - "lines": 73 + "octets": 4123 }, { "mboxMarkerBegin": 9432577, "mboxMarkerLength": 31, + "lineNumber": 147464, "begin": 9432610, "headersEnd": 9433755, "body": { "mimeType": "multipart/report", + "lineNumber": 147464, "begin": 9432610, "headersEnd": 9433755, "children": [ { "mimeType": "message/delivery-status", + "lineNumber": 147486, "begin": 9433897, "headersEnd": 9433938, "end": 9434132, @@ -8077,13 +8804,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 147496, "begin": 9434159, "headersEnd": 9434191, "message": { + "lineNumber": 147498, "begin": 9434191, "headersEnd": 9435012, "body": { "mimeType": "text/plain", + "lineNumber": 147498, "begin": 9434191, "headersEnd": 9435012, "end": 9435023, @@ -8091,8 +8821,7 @@ "lines": 1 }, "end": 9435023, - "octets": 11, - "lines": 1 + "octets": 11 }, "end": 9435023, "octets": 832, @@ -8104,16 +8833,17 @@ "lines": 34 }, "end": 9435052, - "octets": 1297, - "lines": 34 + "octets": 1297 }, { "mboxMarkerBegin": 9435054, "mboxMarkerLength": 45, + "lineNumber": 147517, "begin": 9435101, "headersEnd": 9435272, "body": { "mimeType": "text/plain", + "lineNumber": 147517, "begin": 9435101, "headersEnd": 9435272, "end": 9470358, @@ -8121,16 +8851,17 @@ "lines": 592 }, "end": 9470358, - "octets": 35086, - "lines": 592 + "octets": 35086 }, { "mboxMarkerBegin": 9470360, "mboxMarkerLength": 45, + "lineNumber": 148117, "begin": 9470407, "headersEnd": 9470571, "body": { "mimeType": "application/octet-stream", + "lineNumber": 148117, "begin": 9470407, "headersEnd": 9470571, "end": 9505657, @@ -8138,16 +8869,17 @@ "lines": 592 }, "end": 9505657, - "octets": 35086, - "lines": 592 + "octets": 35086 }, { "mboxMarkerBegin": 9505659, "mboxMarkerLength": 7, + "lineNumber": 148717, "begin": 9505668, "headersEnd": 9506276, "body": { "mimeType": "application/octet-stream", + "lineNumber": 148717, "begin": 9505668, "headersEnd": 9506276, "end": 9507714, @@ -8155,21 +8887,23 @@ "lines": 39 }, "end": 9507714, - "octets": 1438, - "lines": 39 + "octets": 1438 }, { "mboxMarkerBegin": 9507716, "mboxMarkerLength": 7, + "lineNumber": 148768, "begin": 9507725, "headersEnd": 9508642, "body": { "mimeType": "MULTIPART/mixed", + "lineNumber": 148768, "begin": 9507725, "headersEnd": 9508642, "children": [ { "mimeType": "TEXT/plain", + "lineNumber": 148786, "begin": 9508682, "headersEnd": 9508710, "end": 9509065, @@ -8178,6 +8912,7 @@ }, { "mimeType": "AUDIO/basic", + "lineNumber": 148800, "begin": 9509107, "headersEnd": 9509204, "end": 9754734, @@ -8190,21 +8925,23 @@ "lines": 3982 }, "end": 9754778, - "octets": 246136, - "lines": 3982 + "octets": 246136 }, { "mboxMarkerBegin": 9754780, "mboxMarkerLength": 7, + "lineNumber": 152769, "begin": 9754789, "headersEnd": 9755397, "body": { "mimeType": "multipart/mixed", + "lineNumber": 152769, "begin": 9754789, "headersEnd": 9755397, "children": [ { "mimeType": "image/pbm", + "lineNumber": 152786, "begin": 9755461, "headersEnd": 9755625, "end": 9834319, @@ -8217,16 +8954,17 @@ "lines": 416 }, "end": 9834353, - "octets": 78956, - "lines": 416 + "octets": 78956 }, { "mboxMarkerBegin": 9834355, "mboxMarkerLength": 7, + "lineNumber": 153201, "begin": 9834364, "headersEnd": 9834521, "body": { "mimeType": "message/partial", + "lineNumber": 153201, "begin": 9834364, "headersEnd": 9834521, "end": 9838129, @@ -8234,21 +8972,23 @@ "lines": 49 }, "end": 9838129, - "octets": 3608, - "lines": 49 + "octets": 3608 }, { "mboxMarkerBegin": 9838131, "mboxMarkerLength": 7, + "lineNumber": 153256, "begin": 9838140, "headersEnd": 9838928, "body": { "mimeType": "multipart/alternative", + "lineNumber": 153256, "begin": 9838140, "headersEnd": 9838928, "children": [ { "mimeType": "text/plain", + "lineNumber": 153276, "begin": 9839127, "headersEnd": 9839173, "end": 9839594, @@ -8257,11 +8997,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 153287, "begin": 9839637, "headersEnd": 9839725, "children": [ { "mimeType": "text/richtext", + "lineNumber": 153291, "begin": 9839768, "headersEnd": 9839862, "end": 9839934, @@ -8270,6 +9012,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 153297, "begin": 9839979, "headersEnd": 9840082, "end": 9850936, @@ -8278,6 +9021,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 153460, "begin": 9850981, "headersEnd": 9851075, "end": 9851141, @@ -8286,6 +9030,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 153467, "begin": 9851186, "headersEnd": 9851283, "end": 9857273, @@ -8294,6 +9039,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 153560, "begin": 9857318, "headersEnd": 9857412, "end": 9857447, @@ -8302,6 +9048,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 153567, "begin": 9857492, "headersEnd": 9857597, "end": 9869413, @@ -8310,6 +9057,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 153743, "begin": 9869458, "headersEnd": 9869552, "end": 9869585, @@ -8327,16 +9075,17 @@ "lines": 480 }, "end": 9869675, - "octets": 30747, - "lines": 480 + "octets": 30747 }, { "mboxMarkerBegin": 9869677, "mboxMarkerLength": 7, + "lineNumber": 153753, "begin": 9869686, "headersEnd": 9869745, "body": { "mimeType": "text/plain", + "lineNumber": 153753, "begin": 9869686, "headersEnd": 9869745, "end": 9870980, @@ -8344,16 +9093,17 @@ "lines": 28 }, "end": 9870980, - "octets": 1235, - "lines": 28 + "octets": 1235 }, { "mboxMarkerBegin": 9870982, "mboxMarkerLength": 31, + "lineNumber": 153785, "begin": 9871015, "headersEnd": 9871171, "body": { "mimeType": "text/plain", + "lineNumber": 153785, "begin": 9871015, "headersEnd": 9871171, "end": 9874346, @@ -8361,21 +9111,23 @@ "lines": 68 }, "end": 9874346, - "octets": 3175, - "lines": 68 + "octets": 3175 }, { "mboxMarkerBegin": 9874348, "mboxMarkerLength": 31, + "lineNumber": 153859, "begin": 9874381, "headersEnd": 9876277, "body": { "mimeType": "multipart/mixed", + "lineNumber": 153859, "begin": 9874381, "headersEnd": 9876277, "children": [ { "mimeType": "text/plain", + "lineNumber": 153891, "begin": 9876322, "headersEnd": 9876403, "end": 9877284, @@ -8384,6 +9136,7 @@ }, { "mimeType": "application/vcard", + "lineNumber": 153914, "begin": 9877331, "headersEnd": 9877497, "end": 9881199, @@ -8396,21 +9149,23 @@ "lines": 92 }, "end": 9881248, - "octets": 4971, - "lines": 92 + "octets": 4971 }, { "mboxMarkerBegin": 9881250, "mboxMarkerLength": 7, + "lineNumber": 153984, "begin": 9881259, "headersEnd": 9881826, "body": { "mimeType": "multipart/mixed", + "lineNumber": 153984, "begin": 9881259, "headersEnd": 9881826, "children": [ { "mimeType": "text/plain", + "lineNumber": 153999, "begin": 9881845, "headersEnd": 9881874, "end": 9882856, @@ -8419,6 +9174,7 @@ }, { "mimeType": "image/pgm", + "lineNumber": 154022, "begin": 9882875, "headersEnd": 9882938, "end": 10000250, @@ -8431,21 +9187,23 @@ "lines": 1617 }, "end": 10000273, - "octets": 118447, - "lines": 1617 + "octets": 118447 }, { "mboxMarkerBegin": 10000275, "mboxMarkerLength": 7, + "lineNumber": 155616, "begin": 10000284, "headersEnd": 10001099, "body": { "mimeType": "multipart/alternative", + "lineNumber": 155616, "begin": 10000284, "headersEnd": 10001099, "children": [ { "mimeType": "text/plain", + "lineNumber": 155639, "begin": 10001298, "headersEnd": 10001344, "end": 10010656, @@ -8454,11 +9212,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 155992, "begin": 10010699, "headersEnd": 10010787, "children": [ { "mimeType": "text/richtext", + "lineNumber": 155996, "begin": 10010830, "headersEnd": 10010924, "end": 10013768, @@ -8467,13 +9227,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 156070, "begin": 10013813, "headersEnd": 10014016, "message": { + "lineNumber": 156077, "begin": 10014016, "headersEnd": 10014045, "body": { "mimeType": "text/X-HTML", + "lineNumber": 156077, "begin": 10014016, "headersEnd": 10014045, "end": 10014049, @@ -8481,8 +9244,7 @@ "lines": 2 }, "end": 10014049, - "octets": 4, - "lines": 2 + "octets": 4 }, "end": 10014049, "octets": 33, @@ -8490,6 +9252,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156083, "begin": 10014094, "headersEnd": 10014188, "end": 10015184, @@ -8498,6 +9261,7 @@ }, { "mimeType": "text/SGML", + "lineNumber": 156110, "begin": 10015229, "headersEnd": 10015349, "end": 10015723, @@ -8506,6 +9270,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156131, "begin": 10015768, "headersEnd": 10015862, "end": 10015874, @@ -8514,13 +9279,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 156138, "begin": 10015919, "headersEnd": 10016110, "message": { + "lineNumber": 156144, "begin": 10016110, "headersEnd": 10016139, "body": { "mimeType": "text/X-HTML", + "lineNumber": 156144, "begin": 10016110, "headersEnd": 10016139, "end": 10016141, @@ -8528,8 +9296,7 @@ "lines": 1 }, "end": 10016141, - "octets": 2, - "lines": 1 + "octets": 2 }, "end": 10016141, "octets": 31, @@ -8537,6 +9304,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156149, "begin": 10016186, "headersEnd": 10016280, "end": 10016292, @@ -8545,6 +9313,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 156156, "begin": 10016337, "headersEnd": 10016447, "end": 10019473, @@ -8553,6 +9322,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156205, "begin": 10019518, "headersEnd": 10019612, "end": 10026464, @@ -8570,21 +9340,23 @@ "lines": 837 }, "end": 10026556, - "octets": 25457, - "lines": 837 + "octets": 25457 }, { "mboxMarkerBegin": 10026558, "mboxMarkerLength": 7, + "lineNumber": 156474, "begin": 10026567, "headersEnd": 10027702, "body": { "mimeType": "multipart/mixed", + "lineNumber": 156474, "begin": 10026567, "headersEnd": 10027702, "children": [ { "mimeType": "text/plain", + "lineNumber": 156498, "begin": 10027713, "headersEnd": 10027715, "end": 10028056, @@ -8593,6 +9365,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 156509, "begin": 10028069, "headersEnd": 10028131, "end": 10058521, @@ -8601,6 +9374,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 156925, "begin": 10058534, "headersEnd": 10058536, "end": 10058717, @@ -8613,16 +9387,17 @@ "lines": 440 }, "end": 10058732, - "octets": 31030, - "lines": 440 + "octets": 31030 }, { "mboxMarkerBegin": 10058734, "mboxMarkerLength": 7, + "lineNumber": 156939, "begin": 10058743, "headersEnd": 10060481, "body": { "mimeType": "text/plain", + "lineNumber": 156939, "begin": 10058743, "headersEnd": 10060481, "end": 10246231, @@ -8630,21 +9405,23 @@ "lines": 2951 }, "end": 10246231, - "octets": 185750, - "lines": 2951 + "octets": 185750 }, { "mboxMarkerBegin": 10246233, "mboxMarkerLength": 7, + "lineNumber": 159921, "begin": 10246242, "headersEnd": 10246965, "body": { "mimeType": "multipart/mixed", + "lineNumber": 159921, "begin": 10246242, "headersEnd": 10246965, "children": [ { "mimeType": "text/plain", + "lineNumber": 159938, "begin": 10246993, "headersEnd": 10246995, "end": 10247016, @@ -8653,6 +9430,7 @@ }, { "mimeType": "image/pgm", + "lineNumber": 159941, "begin": 10247046, "headersEnd": 10247203, "end": 10331377, @@ -8661,6 +9439,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 160381, "begin": 10331407, "headersEnd": 10331409, "end": 10331676, @@ -8673,21 +9452,23 @@ "lines": 455 }, "end": 10331708, - "octets": 84743, - "lines": 455 + "octets": 84743 }, { "mboxMarkerBegin": 10331710, "mboxMarkerLength": 7, + "lineNumber": 160394, "begin": 10331719, "headersEnd": 10332401, "body": { "mimeType": "multipart/mixed", + "lineNumber": 160394, "begin": 10331719, "headersEnd": 10332401, "children": [ { "mimeType": "text/plain", + "lineNumber": 160410, "begin": 10332429, "headersEnd": 10332431, "end": 10332497, @@ -8696,6 +9477,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 160413, "begin": 10332527, "headersEnd": 10332693, "end": 10365025, @@ -8704,6 +9486,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 160586, "begin": 10365055, "headersEnd": 10365057, "end": 10365075, @@ -8712,6 +9495,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 160590, "begin": 10365105, "headersEnd": 10365269, "end": 10366359, @@ -8720,6 +9504,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 160602, "begin": 10366389, "headersEnd": 10366391, "end": 10366423, @@ -8728,6 +9513,7 @@ }, { "mimeType": "application/x-annotate-2", + "lineNumber": 160607, "begin": 10366453, "headersEnd": 10366524, "end": 10554551, @@ -8736,6 +9522,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 162602, "begin": 10554581, "headersEnd": 10554583, "end": 10554591, @@ -8748,16 +9535,17 @@ "lines": 2196 }, "end": 10554623, - "octets": 222222, - "lines": 2196 + "octets": 222222 }, { "mboxMarkerBegin": 10554625, "mboxMarkerLength": 7, + "lineNumber": 162607, "begin": 10554634, "headersEnd": 10554906, "body": { "mimeType": "application/octet-stream", + "lineNumber": 162607, "begin": 10554634, "headersEnd": 10554906, "end": 10630586, @@ -8765,21 +9553,23 @@ "lines": 1023 }, "end": 10630586, - "octets": 75680, - "lines": 1023 + "octets": 75680 }, { "mboxMarkerBegin": 10630588, "mboxMarkerLength": 7, + "lineNumber": 163639, "begin": 10630597, "headersEnd": 10631896, "body": { "mimeType": "multipart/alternative", + "lineNumber": 163639, "begin": 10630597, "headersEnd": 10631896, "children": [ { "mimeType": "text/plain", + "lineNumber": 163673, "begin": 10632489, "headersEnd": 10632491, "end": 10634372, @@ -8788,11 +9578,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 163710, "begin": 10634433, "headersEnd": 10634539, "children": [ { "mimeType": "text/richtext", + "lineNumber": 163714, "begin": 10634600, "headersEnd": 10634676, "end": 10636704, @@ -8801,6 +9593,7 @@ }, { "mimeType": "image/xwd", + "lineNumber": 163748, "begin": 10636767, "headersEnd": 10636829, "end": 10644867, @@ -8809,6 +9602,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 163862, "begin": 10644930, "headersEnd": 10645003, "end": 10645008, @@ -8817,6 +9611,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 163869, "begin": 10645071, "headersEnd": 10645168, "end": 10687620, @@ -8834,16 +9629,17 @@ "lines": 787 }, "end": 10687748, - "octets": 55852, - "lines": 787 + "octets": 55852 }, { "mboxMarkerBegin": 10687750, "mboxMarkerLength": 7, + "lineNumber": 164453, "begin": 10687759, "headersEnd": 10687916, "body": { "mimeType": "message/partial", + "lineNumber": 164453, "begin": 10687759, "headersEnd": 10687916, "end": 10692786, @@ -8851,21 +9647,23 @@ "lines": 68 }, "end": 10692786, - "octets": 4870, - "lines": 68 + "octets": 4870 }, { "mboxMarkerBegin": 10692788, "mboxMarkerLength": 7, + "lineNumber": 164527, "begin": 10692797, "headersEnd": 10693559, "body": { "mimeType": "multipart/alternative", + "lineNumber": 164527, "begin": 10692797, "headersEnd": 10693559, "children": [ { "mimeType": "text/plain", + "lineNumber": 164551, "begin": 10693945, "headersEnd": 10693947, "end": 10694323, @@ -8874,11 +9672,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 164562, "begin": 10694366, "headersEnd": 10694454, "children": [ { "mimeType": "text/plain", + "lineNumber": 164566, "begin": 10694497, "headersEnd": 10694570, "end": 10694663, @@ -8887,6 +9687,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 164575, "begin": 10694708, "headersEnd": 10694826, "end": 10700572, @@ -8895,6 +9696,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 164664, "begin": 10700617, "headersEnd": 10700690, "end": 10700899, @@ -8912,7 +9714,6 @@ "lines": 133 }, "end": 10700991, - "octets": 7432, - "lines": 133 + "octets": 7432 } ] \ No newline at end of file From b487c27926766019dfcb8e722bd732bb2f20be27 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 10 Jul 2020 10:20:50 -0400 Subject: [PATCH 663/741] updated unix offsets --- .../mbox/content-length.unix-offsets.json | 281 ++- UnitTests/TestData/mbox/jwz.unix-offsets.json | 1897 ++++++++++++----- 2 files changed, 1542 insertions(+), 636 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.json b/UnitTests/TestData/mbox/content-length.unix-offsets.json index 71b5fefae9..8b88150bd6 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.json +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.json @@ -2,15 +2,18 @@ { "mboxMarkerBegin": 0, "mboxMarkerLength": 7, + "lineNumber": 2, "begin": 8, "headersEnd": 657, "body": { "mimeType": "multipart/mixed", + "lineNumber": 2, "begin": 8, "headersEnd": 657, "children": [ { "mimeType": "text/plain", + "lineNumber": 20, "begin": 706, "headersEnd": 732, "end": 806, @@ -19,13 +22,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 28, "begin": 856, "headersEnd": 918, "message": { + "lineNumber": 31, "begin": 918, "headersEnd": 1700, "body": { "mimeType": "text/plain", + "lineNumber": 31, "begin": 918, "headersEnd": 1700, "end": 1837, @@ -33,8 +39,7 @@ "lines": 4 }, "end": 1837, - "octets": 137, - "lines": 4 + "octets": 137 }, "end": 1837, "octets": 919, @@ -46,28 +51,32 @@ "lines": 34 }, "end": 1888, - "octets": 1231, - "lines": 34 + "octets": 1231 }, { "mboxMarkerBegin": 1889, "mboxMarkerLength": 7, + "lineNumber": 54, "begin": 1897, "headersEnd": 2365, "body": { "mimeType": "multipart/mixed", + "lineNumber": 54, "begin": 1897, "headersEnd": 2365, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 69, "begin": 2438, "headersEnd": 2582, "message": { + "lineNumber": 74, "begin": 2582, "headersEnd": 3011, "body": { "mimeType": "text/plain", + "lineNumber": 74, "begin": 2582, "headersEnd": 3011, "end": 3048, @@ -75,8 +84,7 @@ "lines": 2 }, "end": 3048, - "octets": 37, - "lines": 2 + "octets": 37 }, "end": 3048, "octets": 466, @@ -84,6 +92,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 89, "begin": 3076, "headersEnd": 3199, "end": 3657, @@ -92,6 +101,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 101, "begin": 3685, "headersEnd": 3808, "end": 4294, @@ -100,6 +110,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 113, "begin": 4322, "headersEnd": 4449, "end": 4976, @@ -108,6 +119,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126, "begin": 5004, "headersEnd": 5129, "end": 5627, @@ -116,13 +128,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 138, "begin": 5655, "headersEnd": 5799, "message": { + "lineNumber": 143, "begin": 5799, "headersEnd": 6228, "body": { "mimeType": "text/plain", + "lineNumber": 143, "begin": 5799, "headersEnd": 6228, "end": 6265, @@ -130,8 +145,7 @@ "lines": 1 }, "end": 6265, - "octets": 37, - "lines": 1 + "octets": 37 }, "end": 6265, "octets": 466, @@ -139,27 +153,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 157, "begin": 6293, "headersEnd": 6464, "message": { + "lineNumber": 162, "begin": 6464, "headersEnd": 7034, "body": { "mimeType": "message/rfc822", + "lineNumber": 162, "begin": 6464, "headersEnd": 7034, "message": { + "lineNumber": 177, "begin": 7034, "headersEnd": 7545, "body": { "mimeType": "message/rfc822", + "lineNumber": 177, "begin": 7034, "headersEnd": 7545, "message": { + "lineNumber": 191, "begin": 7545, "headersEnd": 7955, "body": { "mimeType": "text/plain", + "lineNumber": 191, "begin": 7545, "headersEnd": 7955, "end": 7960, @@ -167,24 +188,21 @@ "lines": 1 }, "end": 7960, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 7960, "octets": 415, "lines": 12 }, "end": 7960, - "octets": 415, - "lines": 12 + "octets": 415 }, "end": 7960, "octets": 926, "lines": 26 }, "end": 7960, - "octets": 926, - "lines": 26 + "octets": 926 }, "end": 7960, "octets": 1496, @@ -192,6 +210,7 @@ }, { "mimeType": "text/html", + "lineNumber": 205, "begin": 7988, "headersEnd": 8041, "end": 8093, @@ -204,28 +223,32 @@ "lines": 145 }, "end": 8122, - "octets": 5757, - "lines": 145 + "octets": 5757 }, { "mboxMarkerBegin": 8123, "mboxMarkerLength": 7, + "lineNumber": 212, "begin": 8131, "headersEnd": 8602, "body": { "mimeType": "multipart/mixed", + "lineNumber": 212, "begin": 8131, "headersEnd": 8602, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 227, "begin": 8675, "headersEnd": 8823, "message": { + "lineNumber": 232, "begin": 8823, "headersEnd": 9251, "body": { "mimeType": "text/plain", + "lineNumber": 232, "begin": 8823, "headersEnd": 9251, "end": 9288, @@ -233,8 +256,7 @@ "lines": 2 }, "end": 9288, - "octets": 37, - "lines": 2 + "octets": 37 }, "end": 9288, "octets": 465, @@ -242,6 +264,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 247, "begin": 9316, "headersEnd": 9443, "end": 9901, @@ -250,6 +273,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 259, "begin": 9929, "headersEnd": 10056, "end": 10542, @@ -258,6 +282,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 271, "begin": 10570, "headersEnd": 10701, "end": 11228, @@ -266,6 +291,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 284, "begin": 11256, "headersEnd": 11385, "end": 11883, @@ -274,13 +300,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 296, "begin": 11911, "headersEnd": 12059, "message": { + "lineNumber": 301, "begin": 12059, "headersEnd": 12487, "body": { "mimeType": "text/plain", + "lineNumber": 301, "begin": 12059, "headersEnd": 12487, "end": 12524, @@ -288,8 +317,7 @@ "lines": 1 }, "end": 12524, - "octets": 37, - "lines": 1 + "octets": 37 }, "end": 12524, "octets": 465, @@ -297,27 +325,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 315, "begin": 12552, "headersEnd": 12727, "message": { + "lineNumber": 320, "begin": 12727, "headersEnd": 13300, "body": { "mimeType": "message/rfc822", + "lineNumber": 320, "begin": 12727, "headersEnd": 13300, "message": { + "lineNumber": 335, "begin": 13300, "headersEnd": 13814, "body": { "mimeType": "message/rfc822", + "lineNumber": 335, "begin": 13300, "headersEnd": 13814, "message": { + "lineNumber": 349, "begin": 13814, "headersEnd": 14223, "body": { "mimeType": "text/plain", + "lineNumber": 349, "begin": 13814, "headersEnd": 14223, "end": 14228, @@ -325,24 +360,21 @@ "lines": 1 }, "end": 14228, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 14228, "octets": 414, "lines": 12 }, "end": 14228, - "octets": 414, - "lines": 12 + "octets": 414 }, "end": 14228, "octets": 928, "lines": 26 }, "end": 14228, - "octets": 928, - "lines": 26 + "octets": 928 }, "end": 14228, "octets": 1501, @@ -350,6 +382,7 @@ }, { "mimeType": "text/html", + "lineNumber": 363, "begin": 14256, "headersEnd": 14313, "end": 14365, @@ -362,21 +395,23 @@ "lines": 145 }, "end": 14394, - "octets": 5792, - "lines": 145 + "octets": 5792 }, { "mboxMarkerBegin": 14395, "mboxMarkerLength": 31, + "lineNumber": 370, "begin": 14427, "headersEnd": 15930, "body": { "mimeType": "multipart/related", + "lineNumber": 370, "begin": 14427, "headersEnd": 15930, "children": [ { "mimeType": "text/html", + "lineNumber": 398, "begin": 15975, "headersEnd": 16066, "end": 21265, @@ -385,6 +420,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 514, "begin": 21310, "headersEnd": 21509, "end": 22438, @@ -397,21 +433,23 @@ "lines": 139 }, "end": 22485, - "octets": 6555, - "lines": 139 + "octets": 6555 }, { "mboxMarkerBegin": 22486, "mboxMarkerLength": 31, + "lineNumber": 537, "begin": 22518, "headersEnd": 23752, "body": { "mimeType": "multipart/mixed", + "lineNumber": 537, "begin": 22518, "headersEnd": 23752, "children": [ { "mimeType": "text/plain", + "lineNumber": 562, "begin": 23836, "headersEnd": 23912, "end": 23939, @@ -420,18 +458,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 570, "begin": 23978, "headersEnd": 24068, "message": { + "lineNumber": 574, "begin": 24068, "headersEnd": 24889, "body": { "mimeType": "multipart/alternative", + "lineNumber": 574, "begin": 24068, "headersEnd": 24889, "children": [ { "mimeType": "text/plain", + "lineNumber": 592, "begin": 24929, "headersEnd": 25005, "end": 25632, @@ -440,11 +482,13 @@ }, { "mimeType": "multipart/related", + "lineNumber": 613, "begin": 25672, "headersEnd": 25754, "children": [ { "mimeType": "text/html", + "lineNumber": 617, "begin": 25794, "headersEnd": 25869, "end": 26719, @@ -453,6 +497,7 @@ }, { "mimeType": "image/tiff", + "lineNumber": 640, "begin": 26759, "headersEnd": 26943, "end": 770910, @@ -470,8 +515,7 @@ "lines": 10252 }, "end": 770996, - "octets": 746107, - "lines": 10252 + "octets": 746107 }, "end": 770996, "octets": 746928, @@ -483,21 +527,23 @@ "lines": 10285 }, "end": 771037, - "octets": 747285, - "lines": 10285 + "octets": 747285 }, { "mboxMarkerBegin": 771038, "mboxMarkerLength": 31, + "lineNumber": 10846, "begin": 771070, "headersEnd": 772334, "body": { "mimeType": "multipart/related", + "lineNumber": 10846, "begin": 771070, "headersEnd": 772334, "children": [ { "mimeType": "text/html", + "lineNumber": 10870, "begin": 772379, "headersEnd": 772470, "end": 774852, @@ -506,6 +552,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 10925, "begin": 774897, "headersEnd": 775056, "end": 781079, @@ -514,6 +561,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 11011, "begin": 781124, "headersEnd": 781282, "end": 793355, @@ -522,6 +570,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 11175, "begin": 793400, "headersEnd": 793560, "end": 815274, @@ -530,6 +579,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 11464, "begin": 815319, "headersEnd": 815522, "end": 818915, @@ -542,21 +592,23 @@ "lines": 649 }, "end": 818962, - "octets": 46628, - "lines": 649 + "octets": 46628 }, { "mboxMarkerBegin": 818963, "mboxMarkerLength": 7, + "lineNumber": 11519, "begin": 818971, "headersEnd": 819882, "body": { "mimeType": "multipart/mixed", + "lineNumber": 11519, "begin": 818971, "headersEnd": 819882, "children": [ { "mimeType": "text/richtext", + "lineNumber": 11542, "begin": 819891, "headersEnd": 819920, "end": 822450, @@ -569,21 +621,23 @@ "lines": 102 }, "end": 822461, - "octets": 2579, - "lines": 102 + "octets": 2579 }, { "mboxMarkerBegin": 822462, "mboxMarkerLength": 31, + "lineNumber": 11644, "begin": 822494, "headersEnd": 823647, "body": { "mimeType": "multipart/signed", + "lineNumber": 11644, "begin": 822494, "headersEnd": 823647, "children": [ { "mimeType": "text/plain", + "lineNumber": 11663, "begin": 823664, "headersEnd": 823665, "end": 824566, @@ -592,6 +646,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 11686, "begin": 824584, "headersEnd": 824663, "end": 825411, @@ -604,21 +659,23 @@ "lines": 41 }, "end": 825431, - "octets": 1784, - "lines": 41 + "octets": 1784 }, { "mboxMarkerBegin": 825432, "mboxMarkerLength": 31, + "lineNumber": 11705, "begin": 825464, "headersEnd": 826606, "body": { "mimeType": "multipart/mixed", + "lineNumber": 11705, "begin": 825464, "headersEnd": 826606, "children": [ { "mimeType": "text/plain", + "lineNumber": 11728, "begin": 826786, "headersEnd": 826864, "end": 827605, @@ -627,6 +684,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 11746, "begin": 827613, "headersEnd": 827791, "end": 830006, @@ -639,21 +697,23 @@ "lines": 60 }, "end": 830015, - "octets": 3409, - "lines": 60 + "octets": 3409 }, { "mboxMarkerBegin": 830016, "mboxMarkerLength": 31, + "lineNumber": 11785, "begin": 830048, "headersEnd": 831185, "body": { "mimeType": "multipart/mixed", + "lineNumber": 11785, "begin": 830048, "headersEnd": 831185, "children": [ { "mimeType": "text/plain", + "lineNumber": 11812, "begin": 831379, "headersEnd": 831457, "end": 834269, @@ -662,6 +722,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 11863, "begin": 834291, "headersEnd": 834469, "end": 837016, @@ -674,21 +735,23 @@ "lines": 97 }, "end": 837039, - "octets": 5854, - "lines": 97 + "octets": 5854 }, { "mboxMarkerBegin": 837040, "mboxMarkerLength": 31, + "lineNumber": 11906, "begin": 837072, "headersEnd": 837972, "body": { "mimeType": "multipart/signed", + "lineNumber": 11906, "begin": 837072, "headersEnd": 837972, "children": [ { "mimeType": "image/jpeg", + "lineNumber": 11927, "begin": 838045, "headersEnd": 838179, "end": 848901, @@ -697,6 +760,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12079, "begin": 848929, "headersEnd": 849080, "end": 853691, @@ -709,16 +773,17 @@ "lines": 224 }, "end": 853721, - "octets": 15749, - "lines": 224 + "octets": 15749 }, { "mboxMarkerBegin": 853722, "mboxMarkerLength": 31, + "lineNumber": 12150, "begin": 853754, "headersEnd": 855145, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12150, "begin": 853754, "headersEnd": 855145, "end": 856576, @@ -726,21 +791,23 @@ "lines": 20 }, "end": 856576, - "octets": 1431, - "lines": 20 + "octets": 1431 }, { "mboxMarkerBegin": 856577, "mboxMarkerLength": 31, + "lineNumber": 12195, "begin": 856609, "headersEnd": 857962, "body": { "mimeType": "multipart/signed", + "lineNumber": 12195, "begin": 856609, "headersEnd": 857962, "children": [ { "mimeType": "text/plain", + "lineNumber": 12221, "begin": 858007, "headersEnd": 858071, "end": 858178, @@ -749,6 +816,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12229, "begin": 858223, "headersEnd": 858374, "end": 862307, @@ -761,16 +829,17 @@ "lines": 69 }, "end": 862354, - "octets": 4392, - "lines": 69 + "octets": 4392 }, { "mboxMarkerBegin": 862355, "mboxMarkerLength": 31, + "lineNumber": 12290, "begin": 862387, "headersEnd": 863597, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12290, "begin": 862387, "headersEnd": 863597, "end": 867092, @@ -778,16 +847,17 @@ "lines": 55 }, "end": 867092, - "octets": 3495, - "lines": 55 + "octets": 3495 }, { "mboxMarkerBegin": 867093, "mboxMarkerLength": 31, + "lineNumber": 12368, "begin": 867125, "headersEnd": 868202, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12368, "begin": 867125, "headersEnd": 868202, "end": 868863, @@ -795,23 +865,26 @@ "lines": 10 }, "end": 868863, - "octets": 661, - "lines": 10 + "octets": 661 }, { "mboxMarkerBegin": 868864, "mboxMarkerLength": 31, + "lineNumber": 12400, "begin": 868896, "headersEnd": 869679, "body": { "mimeType": "message/rfc822", + "lineNumber": 12400, "begin": 868896, "headersEnd": 869679, "message": { + "lineNumber": 12419, "begin": 869679, "headersEnd": 871059, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12419, "begin": 869679, "headersEnd": 871059, "end": 872491, @@ -819,29 +892,30 @@ "lines": 20 }, "end": 872491, - "octets": 1432, - "lines": 20 + "octets": 1432 }, "end": 872491, "octets": 2812, "lines": 43 }, "end": 872491, - "octets": 2812, - "lines": 43 + "octets": 2812 }, { "mboxMarkerBegin": 872492, "mboxMarkerLength": 31, + "lineNumber": 12464, "begin": 872524, "headersEnd": 873234, "body": { "mimeType": "multipart/mixed", + "lineNumber": 12464, "begin": 872524, "headersEnd": 873234, "children": [ { "mimeType": "text/plain", + "lineNumber": 12484, "begin": 873307, "headersEnd": 873383, "end": 873398, @@ -850,13 +924,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 12490, "begin": 873426, "headersEnd": 873580, "message": { + "lineNumber": 12494, "begin": 873580, "headersEnd": 874960, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12494, "begin": 873580, "headersEnd": 874960, "end": 876392, @@ -864,8 +941,7 @@ "lines": 20 }, "end": 876392, - "octets": 1432, - "lines": 20 + "octets": 1432 }, "end": 876392, "octets": 2812, @@ -877,21 +953,23 @@ "lines": 58 }, "end": 876422, - "octets": 3188, - "lines": 58 + "octets": 3188 }, { "mboxMarkerBegin": 876423, "mboxMarkerLength": 31, + "lineNumber": 12541, "begin": 876455, "headersEnd": 877120, "body": { "mimeType": "multipart/signed", + "lineNumber": 12541, "begin": 876455, "headersEnd": 877120, "children": [ { "mimeType": "text/plain", + "lineNumber": 12560, "begin": 877221, "headersEnd": 877297, "end": 877338, @@ -900,6 +978,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12566, "begin": 877380, "headersEnd": 877531, "end": 883087, @@ -912,16 +991,17 @@ "lines": 91 }, "end": 883131, - "octets": 6011, - "lines": 91 + "octets": 6011 }, { "mboxMarkerBegin": 883132, "mboxMarkerLength": 31, + "lineNumber": 12650, "begin": 883164, "headersEnd": 884226, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12650, "begin": 883164, "headersEnd": 884226, "end": 894462, @@ -929,21 +1009,23 @@ "lines": 141 }, "end": 894462, - "octets": 10236, - "lines": 141 + "octets": 10236 }, { "mboxMarkerBegin": 894463, "mboxMarkerLength": 31, + "lineNumber": 12813, "begin": 894495, "headersEnd": 895871, "body": { "mimeType": "multipart/signed", + "lineNumber": 12813, "begin": 894495, "headersEnd": 895871, "children": [ { "mimeType": "text/plain", + "lineNumber": 12840, "begin": 895972, "headersEnd": 896048, "end": 896659, @@ -952,6 +1034,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 12861, "begin": 896701, "headersEnd": 896852, "end": 898640, @@ -964,16 +1047,17 @@ "lines": 54 }, "end": 898684, - "octets": 2813, - "lines": 54 + "octets": 2813 }, { "mboxMarkerBegin": 898685, "mboxMarkerLength": 31, + "lineNumber": 12893, "begin": 898717, "headersEnd": 899265, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12893, "begin": 898717, "headersEnd": 899265, "end": 899788, @@ -981,16 +1065,17 @@ "lines": 8 }, "end": 899788, - "octets": 523, - "lines": 8 + "octets": 523 }, { "mboxMarkerBegin": 899789, "mboxMarkerLength": 31, + "lineNumber": 12917, "begin": 899821, "headersEnd": 901036, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 12917, "begin": 899821, "headersEnd": 901036, "end": 903918, @@ -998,16 +1083,17 @@ "lines": 38 }, "end": 903918, - "octets": 2882, - "lines": 38 + "octets": 2882 }, { "mboxMarkerBegin": 903919, "mboxMarkerLength": 31, + "lineNumber": 12977, "begin": 903951, "headersEnd": 905109, "body": { "mimeType": "Application/x-pkcs7-mime", + "lineNumber": 12977, "begin": 903951, "headersEnd": 905109, "end": 907231, @@ -1015,21 +1101,23 @@ "lines": 30 }, "end": 907231, - "octets": 2122, - "lines": 30 + "octets": 2122 }, { "mboxMarkerBegin": 907232, "mboxMarkerLength": 31, + "lineNumber": 13030, "begin": 907264, "headersEnd": 908342, "body": { "mimeType": "multipart/signed", + "lineNumber": 13030, "begin": 907264, "headersEnd": 908342, "children": [ { "mimeType": "text/plain", + "lineNumber": 13053, "begin": 908375, "headersEnd": 908439, "end": 908439, @@ -1038,6 +1126,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13058, "begin": 908472, "headersEnd": 908551, "end": 911264, @@ -1050,21 +1139,23 @@ "lines": 53 }, "end": 911299, - "octets": 2957, - "lines": 53 + "octets": 2957 }, { "mboxMarkerBegin": 911300, "mboxMarkerLength": 31, + "lineNumber": 13106, "begin": 911332, "headersEnd": 912369, "body": { "mimeType": "multipart/mixed", + "lineNumber": 13106, "begin": 911332, "headersEnd": 912369, "children": [ { "mimeType": "text/plain", + "lineNumber": 13127, "begin": 912410, "headersEnd": 912488, "end": 912941, @@ -1073,6 +1164,7 @@ }, { "mimeType": "text/html", + "lineNumber": 13145, "begin": 912982, "headersEnd": 913057, "end": 913868, @@ -1081,6 +1173,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13176, "begin": 913909, "headersEnd": 914006, "end": 915206, @@ -1093,21 +1186,23 @@ "lines": 72 }, "end": 915249, - "octets": 2880, - "lines": 72 + "octets": 2880 }, { "mboxMarkerBegin": 915250, "mboxMarkerLength": 31, + "lineNumber": 13199, "begin": 915282, "headersEnd": 916357, "body": { "mimeType": "multipart/signed", + "lineNumber": 13199, "begin": 915282, "headersEnd": 916357, "children": [ { "mimeType": "text/plain", + "lineNumber": 13222, "begin": 916400, "headersEnd": 916470, "end": 916622, @@ -1116,6 +1211,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13234, "begin": 916665, "headersEnd": 916744, "end": 920840, @@ -1128,21 +1224,23 @@ "lines": 75 }, "end": 920885, - "octets": 4528, - "lines": 75 + "octets": 4528 }, { "mboxMarkerBegin": 920886, "mboxMarkerLength": 31, + "lineNumber": 13297, "begin": 920918, "headersEnd": 922020, "body": { "mimeType": "multipart/signed", + "lineNumber": 13297, "begin": 920918, "headersEnd": 922020, "children": [ { "mimeType": "text/plain", + "lineNumber": 13320, "begin": 922054, "headersEnd": 922132, "end": 922206, @@ -1151,6 +1249,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 13329, "begin": 922240, "headersEnd": 922319, "end": 926036, @@ -1163,21 +1262,23 @@ "lines": 73 }, "end": 926071, - "octets": 4051, - "lines": 73 + "octets": 4051 }, { "mboxMarkerBegin": 926072, "mboxMarkerLength": 31, + "lineNumber": 13392, "begin": 926104, "headersEnd": 927232, "body": { "mimeType": "multipart/report", + "lineNumber": 13392, "begin": 926104, "headersEnd": 927232, "children": [ { "mimeType": "message/delivery-status", + "lineNumber": 13414, "begin": 927369, "headersEnd": 927408, "end": 927596, @@ -1186,13 +1287,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 13424, "begin": 927621, "headersEnd": 927651, "message": { + "lineNumber": 13426, "begin": 927651, "headersEnd": 928457, "body": { "mimeType": "text/plain", + "lineNumber": 13426, "begin": 927651, "headersEnd": 928457, "end": 928468, @@ -1200,8 +1304,7 @@ "lines": 1 }, "end": 928468, - "octets": 11, - "lines": 1 + "octets": 11 }, "end": 928468, "octets": 817, @@ -1213,21 +1316,23 @@ "lines": 34 }, "end": 928495, - "octets": 1263, - "lines": 34 + "octets": 1263 }, { "mboxMarkerBegin": 928496, "mboxMarkerLength": 31, + "lineNumber": 13445, "begin": 928528, "headersEnd": 930393, "body": { "mimeType": "multipart/mixed", + "lineNumber": 13445, "begin": 928528, "headersEnd": 930393, "children": [ { "mimeType": "text/plain", + "lineNumber": 13477, "begin": 930437, "headersEnd": 930515, "end": 931378, @@ -1236,6 +1341,7 @@ }, { "mimeType": "application/vcard", + "lineNumber": 13500, "begin": 931423, "headersEnd": 931584, "end": 935225, @@ -1248,7 +1354,6 @@ "lines": 92 }, "end": 935272, - "octets": 4879, - "lines": 92 + "octets": 4879 } ] \ No newline at end of file diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.json b/UnitTests/TestData/mbox/jwz.unix-offsets.json index d6de9bf806..bec56d175a 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.json +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.json @@ -2,20 +2,24 @@ { "mboxMarkerBegin": 0, "mboxMarkerLength": 7, + "lineNumber": 2, "begin": 8, "headersEnd": 517, "body": { "mimeType": "multipart/mixed", + "lineNumber": 2, "begin": 8, "headersEnd": 517, "children": [ { "mimeType": "multipart/parallel", + "lineNumber": 16, "begin": 534, "headersEnd": 630, "children": [ { "mimeType": "text/plain", + "lineNumber": 20, "begin": 661, "headersEnd": 662, "end": 1377, @@ -24,6 +28,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 39, "begin": 1409, "headersEnd": 1493, "end": 32539, @@ -37,11 +42,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 472, "begin": 32590, "headersEnd": 32683, "children": [ { "mimeType": "image/gif", + "lineNumber": 476, "begin": 32714, "headersEnd": 32796, "end": 58444, @@ -50,6 +57,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 834, "begin": 58476, "headersEnd": 58558, "end": 76971, @@ -58,6 +66,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 1093, "begin": 77003, "headersEnd": 77117, "end": 120806, @@ -66,6 +75,7 @@ }, { "mimeType": "application/atomicmail", + "lineNumber": 3534, "begin": 120838, "headersEnd": 120899, "end": 129745, @@ -79,6 +89,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 3897, "begin": 129796, "headersEnd": 129880, "end": 177055, @@ -91,16 +102,17 @@ "lines": 4535 }, "end": 177075, - "octets": 176558, - "lines": 4535 + "octets": 176558 }, { "mboxMarkerBegin": 177076, "mboxMarkerLength": 7, + "lineNumber": 4552, "begin": 177084, "headersEnd": 177633, "body": { "mimeType": "audio/basic", + "lineNumber": 4552, "begin": 177084, "headersEnd": 177633, "end": 312903, @@ -108,16 +120,17 @@ "lines": 1854 }, "end": 312903, - "octets": 135270, - "lines": 1854 + "octets": 135270 }, { "mboxMarkerBegin": 312904, "mboxMarkerLength": 7, + "lineNumber": 6422, "begin": 312912, "headersEnd": 313291, "body": { "mimeType": "text/plain", + "lineNumber": 6422, "begin": 312912, "headersEnd": 313291, "end": 313492, @@ -125,21 +138,23 @@ "lines": 4 }, "end": 313492, - "octets": 201, - "lines": 4 + "octets": 201 }, { "mboxMarkerBegin": 313493, "mboxMarkerLength": 7, + "lineNumber": 6435, "begin": 313501, "headersEnd": 314147, "body": { "mimeType": "multipart/alternative", + "lineNumber": 6435, "begin": 313501, "headersEnd": 314147, "children": [ { "mimeType": "text/plain", + "lineNumber": 6454, "begin": 314342, "headersEnd": 314386, "end": 314619, @@ -148,11 +163,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 6464, "begin": 314660, "headersEnd": 314745, "children": [ { "mimeType": "text/richtext", + "lineNumber": 6468, "begin": 314787, "headersEnd": 314878, "end": 315024, @@ -161,6 +178,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 6476, "begin": 315067, "headersEnd": 315177, "end": 319545, @@ -169,6 +187,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 6546, "begin": 319588, "headersEnd": 319679, "end": 319724, @@ -186,21 +205,23 @@ "lines": 106 }, "end": 319811, - "octets": 5664, - "lines": 106 + "octets": 5664 }, { "mboxMarkerBegin": 319812, "mboxMarkerLength": 7, + "lineNumber": 6557, "begin": 319820, "headersEnd": 320568, "body": { "mimeType": "multipart/mixed", + "lineNumber": 6557, "begin": 319820, "headersEnd": 320568, "children": [ { "mimeType": "text/richtext", + "lineNumber": 6579, "begin": 320825, "headersEnd": 320898, "end": 321322, @@ -209,18 +230,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 6596, "begin": 321385, "headersEnd": 321415, "message": { + "lineNumber": 6598, "begin": 321415, "headersEnd": 322251, "body": { "mimeType": "multipart/mixed", + "lineNumber": 6598, "begin": 321415, "headersEnd": 322251, "children": [ { "mimeType": "text/plain", + "lineNumber": 6623, "begin": 322557, "headersEnd": 322651, "end": 322755, @@ -229,6 +254,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 6634, "begin": 322786, "headersEnd": 322875, "end": 343502, @@ -237,6 +263,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 6922, "begin": 343533, "headersEnd": 343533, "end": 343533, @@ -249,8 +276,7 @@ "lines": 308 }, "end": 343533, - "octets": 21282, - "lines": 308 + "octets": 21282 }, "end": 343533, "octets": 22118, @@ -258,6 +284,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 6924, "begin": 343596, "headersEnd": 343669, "end": 343776, @@ -270,21 +297,23 @@ "lines": 359 }, "end": 343841, - "octets": 23273, - "lines": 359 + "octets": 23273 }, { "mboxMarkerBegin": 343842, "mboxMarkerLength": 7, + "lineNumber": 6935, "begin": 343850, "headersEnd": 344568, "body": { "mimeType": "multipart/alternative", + "lineNumber": 6935, "begin": 343850, "headersEnd": 344568, "children": [ { "mimeType": "text/plain", + "lineNumber": 6955, "begin": 344763, "headersEnd": 344807, "end": 345567, @@ -293,11 +322,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 6977, "begin": 345608, "headersEnd": 345693, "children": [ { "mimeType": "text/richtext", + "lineNumber": 6981, "begin": 345735, "headersEnd": 345826, "end": 346051, @@ -306,6 +337,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 6990, "begin": 346094, "headersEnd": 346202, "end": 1021266, @@ -314,6 +346,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 15978, "begin": 1021309, "headersEnd": 1021400, "end": 1021516, @@ -322,6 +355,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 15988, "begin": 1021559, "headersEnd": 1021685, "end": 1702821, @@ -330,6 +364,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 25054, "begin": 1702864, "headersEnd": 1702955, "end": 1702965, @@ -338,6 +373,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 25061, "begin": 1703008, "headersEnd": 1703125, "end": 1771303, @@ -346,6 +382,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 26001, "begin": 1771346, "headersEnd": 1771437, "end": 1771575, @@ -354,6 +391,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 26011, "begin": 1771618, "headersEnd": 1771736, "end": 2108498, @@ -362,6 +400,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 30489, "begin": 2108541, "headersEnd": 2108632, "end": 2108637, @@ -379,16 +418,17 @@ "lines": 23546 }, "end": 2108724, - "octets": 1764156, - "lines": 23546 + "octets": 1764156 }, { "mboxMarkerBegin": 2108725, "mboxMarkerLength": 7, + "lineNumber": 30498, "begin": 2108733, "headersEnd": 2109749, "body": { "mimeType": "text/plain", + "lineNumber": 30498, "begin": 2108733, "headersEnd": 2109749, "end": 2110874, @@ -396,21 +436,23 @@ "lines": 39 }, "end": 2110874, - "octets": 1125, - "lines": 39 + "octets": 1125 }, { "mboxMarkerBegin": 2110875, "mboxMarkerLength": 7, + "lineNumber": 30560, "begin": 2110883, "headersEnd": 2111121, "body": { "mimeType": "multipart/mixed", + "lineNumber": 30560, "begin": 2110883, "headersEnd": 2111121, "children": [ { "mimeType": "text/plain", + "lineNumber": 30570, "begin": 2111136, "headersEnd": 2111137, "end": 2111437, @@ -419,11 +461,13 @@ }, { "mimeType": "multipart/parallel", + "lineNumber": 30578, "begin": 2111453, "headersEnd": 2111529, "children": [ { "mimeType": "image/gif", + "lineNumber": 30582, "begin": 2111545, "headersEnd": 2111622, "end": 2114882, @@ -432,6 +476,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 30604, "begin": 2114899, "headersEnd": 2115002, "end": 2270901, @@ -445,6 +490,7 @@ }, { "mimeType": "application/atomicmail", + "lineNumber": 31419, "begin": 2270935, "headersEnd": 2270991, "end": 2275711, @@ -457,16 +503,17 @@ "lines": 1050 }, "end": 2275728, - "octets": 164607, - "lines": 1050 + "octets": 164607 }, { "mboxMarkerBegin": 2275729, "mboxMarkerLength": 7, + "lineNumber": 31620, "begin": 2275737, "headersEnd": 2276689, "body": { "mimeType": "audio/basic", + "lineNumber": 31620, "begin": 2275737, "headersEnd": 2276689, "end": 2619749, @@ -474,26 +521,29 @@ "lines": 4456 }, "end": 2619749, - "octets": 343060, - "lines": 4456 + "octets": 343060 }, { "mboxMarkerBegin": 2619750, "mboxMarkerLength": 7, + "lineNumber": 36098, "begin": 2619758, "headersEnd": 2619892, "body": { "mimeType": "multipart/mixed", + "lineNumber": 36098, "begin": 2619758, "headersEnd": 2619892, "children": [ { "mimeType": "multipart/parallel", + "lineNumber": 36104, "begin": 2619909, "headersEnd": 2619982, "children": [ { "mimeType": "text/plain", + "lineNumber": 36107, "begin": 2620013, "headersEnd": 2620014, "end": 2620721, @@ -502,6 +552,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 36127, "begin": 2620753, "headersEnd": 2620850, "end": 2651896, @@ -519,16 +570,17 @@ "lines": 457 }, "end": 2651948, - "octets": 32056, - "lines": 457 + "octets": 32056 }, { "mboxMarkerBegin": 2651949, "mboxMarkerLength": 7, + "lineNumber": 36561, "begin": 2651957, "headersEnd": 2652514, "body": { "mimeType": "image/pbm", + "lineNumber": 36561, "begin": 2651957, "headersEnd": 2652514, "end": 2709293, @@ -536,21 +588,23 @@ "lines": 782 }, "end": 2709293, - "octets": 56779, - "lines": 782 + "octets": 56779 }, { "mboxMarkerBegin": 2709294, "mboxMarkerLength": 7, + "lineNumber": 37359, "begin": 2709302, "headersEnd": 2710035, "body": { "mimeType": "multipart/alternative", + "lineNumber": 37359, "begin": 2709302, "headersEnd": 2710035, "children": [ { "mimeType": "text/plain", + "lineNumber": 37385, "begin": 2710619, "headersEnd": 2710620, "end": 2711172, @@ -559,11 +613,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 37402, "begin": 2711231, "headersEnd": 2711334, "children": [ { "mimeType": "text/richtext", + "lineNumber": 37406, "begin": 2711394, "headersEnd": 2711467, "end": 2711886, @@ -572,6 +628,7 @@ }, { "mimeType": "image/xwd", + "lineNumber": 37418, "begin": 2711947, "headersEnd": 2712006, "end": 2741267, @@ -580,6 +637,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 37824, "begin": 2741328, "headersEnd": 2741398, "end": 2741439, @@ -597,21 +655,23 @@ "lines": 459 }, "end": 2741562, - "octets": 31527, - "lines": 459 + "octets": 31527 }, { "mboxMarkerBegin": 2741563, "mboxMarkerLength": 7, + "lineNumber": 37836, "begin": 2741571, "headersEnd": 2742224, "body": { "mimeType": "multipart/alternative", + "lineNumber": 37836, "begin": 2741571, "headersEnd": 2742224, "children": [ { "mimeType": "text/plain", + "lineNumber": 37860, "begin": 2742593, "headersEnd": 2742594, "end": 2743415, @@ -620,11 +680,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 37890, "begin": 2743445, "headersEnd": 2743518, "children": [ { "mimeType": "text/plain", + "lineNumber": 37894, "begin": 2743549, "headersEnd": 2743575, "end": 2743712, @@ -633,6 +695,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 37903, "begin": 2743744, "headersEnd": 2743809, "end": 2745006, @@ -641,6 +704,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 37925, "begin": 2745038, "headersEnd": 2745064, "end": 2745132, @@ -649,6 +713,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 37929, "begin": 2745164, "headersEnd": 2745229, "end": 2746434, @@ -657,6 +722,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 37951, "begin": 2746466, "headersEnd": 2746495, "end": 2747041, @@ -674,16 +740,17 @@ "lines": 118 }, "end": 2747107, - "octets": 4883, - "lines": 118 + "octets": 4883 }, { "mboxMarkerBegin": 2747108, "mboxMarkerLength": 7, + "lineNumber": 37972, "begin": 2747116, "headersEnd": 2748092, "body": { "mimeType": "text/plain", + "lineNumber": 37972, "begin": 2747116, "headersEnd": 2748092, "end": 2749474, @@ -691,16 +758,17 @@ "lines": 32 }, "end": 2749474, - "octets": 1382, - "lines": 32 + "octets": 1382 }, { "mboxMarkerBegin": 2749475, "mboxMarkerLength": 7, + "lineNumber": 38027, "begin": 2749483, "headersEnd": 2749739, "body": { "mimeType": "text/plain", + "lineNumber": 38027, "begin": 2749483, "headersEnd": 2749739, "end": 2749995, @@ -708,16 +776,17 @@ "lines": 6 }, "end": 2749995, - "octets": 256, - "lines": 6 + "octets": 256 }, { "mboxMarkerBegin": 2749996, "mboxMarkerLength": 7, + "lineNumber": 38041, "begin": 2750004, "headersEnd": 2750661, "body": { "mimeType": "text/plain", + "lineNumber": 38041, "begin": 2750004, "headersEnd": 2750661, "end": 2751385, @@ -725,21 +794,23 @@ "lines": 14 }, "end": 2751385, - "octets": 724, - "lines": 14 + "octets": 724 }, { "mboxMarkerBegin": 2751386, "mboxMarkerLength": 7, + "lineNumber": 38071, "begin": 2751394, "headersEnd": 2752379, "body": { "mimeType": "multipart/mixed", + "lineNumber": 38071, "begin": 2751394, "headersEnd": 2752379, "children": [ { "mimeType": "text/plain", + "lineNumber": 38088, "begin": 2752420, "headersEnd": 2752466, "end": 2752538, @@ -748,11 +819,13 @@ }, { "mimeType": "multipart/appledouble", + "lineNumber": 38097, "begin": 2752578, "headersEnd": 2752665, "children": [ { "mimeType": "application/applefile", + "lineNumber": 38102, "begin": 2752707, "headersEnd": 2752862, "end": 2818779, @@ -761,6 +834,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 39065, "begin": 2818820, "headersEnd": 2819029, "end": 3183310, @@ -778,21 +852,23 @@ "lines": 6272 }, "end": 3183395, - "octets": 431016, - "lines": 6272 + "octets": 431016 }, { "mboxMarkerBegin": 3183396, "mboxMarkerLength": 7, + "lineNumber": 44358, "begin": 3183404, "headersEnd": 3184389, "body": { "mimeType": "multipart/mixed", + "lineNumber": 44358, "begin": 3183404, "headersEnd": 3184389, "children": [ { "mimeType": "text/plain", + "lineNumber": 44375, "begin": 3184430, "headersEnd": 3184476, "end": 3184548, @@ -801,11 +877,13 @@ }, { "mimeType": "multipart/header-set", + "lineNumber": 44384, "begin": 3184588, "headersEnd": 3184674, "children": [ { "mimeType": "application/applefile", + "lineNumber": 44389, "begin": 3184716, "headersEnd": 3184871, "end": 3250788, @@ -814,6 +892,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 45352, "begin": 3250829, "headersEnd": 3251038, "end": 3615319, @@ -831,23 +910,26 @@ "lines": 6272 }, "end": 3615404, - "octets": 431015, - "lines": 6272 + "octets": 431015 }, { "mboxMarkerBegin": 3615405, "mboxMarkerLength": 7, + "lineNumber": 50645, "begin": 3615413, "headersEnd": 3615971, "body": { "mimeType": "Message/rfc822", + "lineNumber": 50645, "begin": 3615413, "headersEnd": 3615971, "message": { + "lineNumber": 50660, "begin": 3615971, "headersEnd": 3616030, "body": { "mimeType": "text/plain", + "lineNumber": 50660, "begin": 3615971, "headersEnd": 3616030, "end": 3616557, @@ -855,29 +937,30 @@ "lines": 14 }, "end": 3616557, - "octets": 527, - "lines": 14 + "octets": 527 }, "end": 3616557, "octets": 586, "lines": 17 }, "end": 3616557, - "octets": 586, - "lines": 17 + "octets": 586 }, { "mboxMarkerBegin": 3616558, "mboxMarkerLength": 7, + "lineNumber": 50678, "begin": 3616566, "headersEnd": 3617279, "body": { "mimeType": "multipart/mixed", + "lineNumber": 50678, "begin": 3616566, "headersEnd": 3617279, "children": [ { "mimeType": "text/plain", + "lineNumber": 50698, "begin": 3617323, "headersEnd": 3617349, "end": 3617529, @@ -886,6 +969,7 @@ }, { "mimeType": "application/postscript", + "lineNumber": 50708, "begin": 3617573, "headersEnd": 3617645, "end": 3618537, @@ -898,21 +982,23 @@ "lines": 33 }, "end": 3618690, - "octets": 1411, - "lines": 33 + "octets": 1411 }, { "mboxMarkerBegin": 3618691, "mboxMarkerLength": 7, + "lineNumber": 50731, "begin": 3618699, "headersEnd": 3619238, "body": { "mimeType": "multipart/mixed", + "lineNumber": 50731, "begin": 3618699, "headersEnd": 3619238, "children": [ { "mimeType": "text/plain", + "lineNumber": 50748, "begin": 3619314, "headersEnd": 3619315, "end": 3619707, @@ -921,13 +1007,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 50761, "begin": 3619747, "headersEnd": 3619777, "message": { + "lineNumber": 50763, "begin": 3619777, "headersEnd": 3620564, "body": { "mimeType": "text/plain", + "lineNumber": 50763, "begin": 3619777, "headersEnd": 3620564, "end": 3623917, @@ -935,8 +1024,7 @@ "lines": 72 }, "end": 3623917, - "octets": 3353, - "lines": 72 + "octets": 3353 }, "end": 3623917, "octets": 4140, @@ -948,21 +1036,23 @@ "lines": 108 }, "end": 3623959, - "octets": 4721, - "lines": 108 + "octets": 4721 }, { "mboxMarkerBegin": 3623960, "mboxMarkerLength": 7, + "lineNumber": 50855, "begin": 3623968, "headersEnd": 3624617, "body": { "mimeType": "multipart/mixed", + "lineNumber": 50855, "begin": 3623968, "headersEnd": 3624617, "children": [ { "mimeType": "text/plain", + "lineNumber": 50873, "begin": 3624666, "headersEnd": 3624692, "end": 3624766, @@ -971,13 +1061,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 50881, "begin": 3624816, "headersEnd": 3624878, "message": { + "lineNumber": 50884, "begin": 3624878, "headersEnd": 3625660, "body": { "mimeType": "text/plain", + "lineNumber": 50884, "begin": 3624878, "headersEnd": 3625660, "end": 3625797, @@ -985,8 +1078,7 @@ "lines": 4 }, "end": 3625797, - "octets": 137, - "lines": 4 + "octets": 137 }, "end": 3625797, "octets": 919, @@ -998,16 +1090,17 @@ "lines": 34 }, "end": 3625848, - "octets": 1231, - "lines": 34 + "octets": 1231 }, { "mboxMarkerBegin": 3625849, "mboxMarkerLength": 7, + "lineNumber": 50907, "begin": 3625857, "headersEnd": 3626367, "body": { "mimeType": "Application/octet-stream", + "lineNumber": 50907, "begin": 3625857, "headersEnd": 3626367, "end": 3627786, @@ -1015,16 +1108,17 @@ "lines": 45 }, "end": 3627786, - "octets": 1419, - "lines": 45 + "octets": 1419 }, { "mboxMarkerBegin": 3627787, "mboxMarkerLength": 50, + "lineNumber": 50967, "begin": 3627838, "headersEnd": 3628410, "body": { "mimeType": "message/partial", + "lineNumber": 50967, "begin": 3627838, "headersEnd": 3628410, "end": 3688111, @@ -1032,16 +1126,17 @@ "lines": 954 }, "end": 3688111, - "octets": 59701, - "lines": 954 + "octets": 59701 }, { "mboxMarkerBegin": 3688112, "mboxMarkerLength": 50, + "lineNumber": 51938, "begin": 3688163, "headersEnd": 3688732, "body": { "mimeType": "message/partial", + "lineNumber": 51938, "begin": 3688163, "headersEnd": 3688732, "end": 3748539, @@ -1049,21 +1144,23 @@ "lines": 960 }, "end": 3748539, - "octets": 59807, - "lines": 960 + "octets": 59807 }, { "mboxMarkerBegin": 3748540, "mboxMarkerLength": 7, + "lineNumber": 52915, "begin": 3748548, "headersEnd": 3749096, "body": { "mimeType": "multipart/mixed", + "lineNumber": 52915, "begin": 3748548, "headersEnd": 3749096, "children": [ { "mimeType": "text/plain", + "lineNumber": 52930, "begin": 3749112, "headersEnd": 3749139, "end": 3749210, @@ -1072,6 +1169,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 52938, "begin": 3749226, "headersEnd": 3749307, "end": 3749948, @@ -1084,16 +1182,17 @@ "lines": 25 }, "end": 3749967, - "octets": 871, - "lines": 25 + "octets": 871 }, { "mboxMarkerBegin": 3749968, "mboxMarkerLength": 7, + "lineNumber": 52955, "begin": 3749976, "headersEnd": 3750723, "body": { "mimeType": "image/gif", + "lineNumber": 52955, "begin": 3749976, "headersEnd": 3750723, "end": 3792253, @@ -1101,21 +1200,23 @@ "lines": 570 }, "end": 3792253, - "octets": 41530, - "lines": 570 + "octets": 41530 }, { "mboxMarkerBegin": 3792254, "mboxMarkerLength": 7, + "lineNumber": 53545, "begin": 3792262, "headersEnd": 3793416, "body": { "mimeType": "multipart/mixed", + "lineNumber": 53545, "begin": 3792262, "headersEnd": 3793416, "children": [ { "mimeType": "text/plain", + "lineNumber": 53571, "begin": 3793421, "headersEnd": 3793422, "end": 3795344, @@ -1124,6 +1225,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 53617, "begin": 3795350, "headersEnd": 3795455, "end": 3801677, @@ -1136,16 +1238,17 @@ "lines": 139 }, "end": 3801685, - "octets": 8269, - "lines": 139 + "octets": 8269 }, { "mboxMarkerBegin": 3801686, "mboxMarkerLength": 7, + "lineNumber": 53711, "begin": 3801694, "headersEnd": 3803142, "body": { "mimeType": "application/octet-stream", + "lineNumber": 53711, "begin": 3801694, "headersEnd": 3803142, "end": 3909955, @@ -1153,42 +1256,50 @@ "lines": 1570 }, "end": 3909955, - "octets": 106813, - "lines": 1570 + "octets": 106813 }, { "mboxMarkerBegin": 3909956, "mboxMarkerLength": 7, + "lineNumber": 55311, "begin": 3909964, "headersEnd": 3910563, "body": { "mimeType": "message/rfc822", + "lineNumber": 55311, "begin": 3909964, "headersEnd": 3910563, "message": { + "lineNumber": 55327, "begin": 3910563, "headersEnd": 3911133, "body": { "mimeType": "message/rfc822", + "lineNumber": 55327, "begin": 3910563, "headersEnd": 3911133, "message": { + "lineNumber": 55343, "begin": 3911133, "headersEnd": 3911675, "body": { "mimeType": "message/rfc822", + "lineNumber": 55343, "begin": 3911133, "headersEnd": 3911675, "message": { + "lineNumber": 55359, "begin": 3911675, "headersEnd": 3912223, "body": { "mimeType": "multipart/mixed", + "lineNumber": 55359, "begin": 3911675, "headersEnd": 3912223, "children": [ { "mimeType": "text/plain", + "lineNumber": 55378, "begin": 3912327, "headersEnd": 3912403, "end": 3912452, @@ -1197,18 +1308,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 55384, "begin": 3912511, "headersEnd": 3912573, "message": { + "lineNumber": 55387, "begin": 3912573, "headersEnd": 3913073, "body": { "mimeType": "multipart/mixed", + "lineNumber": 55387, "begin": 3912573, "headersEnd": 3913073, "children": [ { "mimeType": "text/plain", + "lineNumber": 55406, "begin": 3913167, "headersEnd": 3913243, "end": 3913365, @@ -1217,6 +1332,7 @@ }, { "mimeType": "text/html", + "lineNumber": 55416, "begin": 3913414, "headersEnd": 3913483, "end": 3913766, @@ -1229,8 +1345,7 @@ "lines": 22 }, "end": 3913817, - "octets": 744, - "lines": 22 + "octets": 744 }, "end": 3913817, "octets": 1244, @@ -1242,45 +1357,44 @@ "lines": 54 }, "end": 3913880, - "octets": 1657, - "lines": 54 + "octets": 1657 }, "end": 3913880, "octets": 2205, "lines": 70 }, "end": 3913880, - "octets": 2205, - "lines": 70 + "octets": 2205 }, "end": 3913880, "octets": 2747, "lines": 86 }, "end": 3913880, - "octets": 2747, - "lines": 86 + "octets": 2747 }, "end": 3913880, "octets": 3317, "lines": 102 }, "end": 3913880, - "octets": 3317, - "lines": 102 + "octets": 3317 }, { "mboxMarkerBegin": 3913881, "mboxMarkerLength": 7, + "lineNumber": 55431, "begin": 3913889, "headersEnd": 3914592, "body": { "mimeType": "multipart/mixed", + "lineNumber": 55431, "begin": 3913889, "headersEnd": 3914592, "children": [ { "mimeType": "text/plain", + "lineNumber": 55448, "begin": 3914619, "headersEnd": 3914620, "end": 3914661, @@ -1289,6 +1403,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 55452, "begin": 3914689, "headersEnd": 3914834, "end": 3992050, @@ -1297,6 +1412,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 55859, "begin": 3992078, "headersEnd": 3992079, "end": 3992110, @@ -1305,6 +1421,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 55865, "begin": 3992138, "headersEnd": 3992285, "end": 4095487, @@ -1313,6 +1430,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 56406, "begin": 4095515, "headersEnd": 4095516, "end": 4095676, @@ -1321,6 +1439,7 @@ }, { "mimeType": "application/x-annotate", + "lineNumber": 56413, "begin": 4095704, "headersEnd": 4095793, "end": 4175983, @@ -1329,6 +1448,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 57652, "begin": 4176011, "headersEnd": 4176012, "end": 4176032, @@ -1341,16 +1461,17 @@ "lines": 2210 }, "end": 4176062, - "octets": 261470, - "lines": 2210 + "octets": 261470 }, { "mboxMarkerBegin": 4176063, "mboxMarkerLength": 7, + "lineNumber": 57659, "begin": 4176071, "headersEnd": 4176736, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 57659, "begin": 4176071, "headersEnd": 4176736, "end": 4177728, @@ -1358,21 +1479,23 @@ "lines": 18 }, "end": 4177728, - "octets": 992, - "lines": 18 + "octets": 992 }, { "mboxMarkerBegin": 4177729, "mboxMarkerLength": 7, + "lineNumber": 57693, "begin": 4177737, "headersEnd": 4178793, "body": { "mimeType": "multipart/alternative", + "lineNumber": 57693, "begin": 4177737, "headersEnd": 4178793, "children": [ { "mimeType": "text/plain", + "lineNumber": 57720, "begin": 4178988, "headersEnd": 4179032, "end": 4179436, @@ -1381,11 +1504,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 57737, "begin": 4179477, "headersEnd": 4179562, "children": [ { "mimeType": "text/richtext", + "lineNumber": 57741, "begin": 4179604, "headersEnd": 4179695, "end": 4179920, @@ -1394,6 +1519,7 @@ }, { "mimeType": "image/x-xbm", + "lineNumber": 57750, "begin": 4179963, "headersEnd": 4180082, "end": 4181466, @@ -1402,6 +1528,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 57793, "begin": 4181509, "headersEnd": 4181600, "end": 4181748, @@ -1419,21 +1546,23 @@ "lines": 93 }, "end": 4181836, - "octets": 3043, - "lines": 93 + "octets": 3043 }, { "mboxMarkerBegin": 4181837, "mboxMarkerLength": 7, + "lineNumber": 57811, "begin": 4181845, "headersEnd": 4182515, "body": { "mimeType": "multipart/mixed", + "lineNumber": 57811, "begin": 4181845, "headersEnd": 4182515, "children": [ { "mimeType": "text/plain", + "lineNumber": 57828, "begin": 4182531, "headersEnd": 4182558, "end": 4182636, @@ -1442,6 +1571,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 57838, "begin": 4182653, "headersEnd": 4182713, "end": 4187876, @@ -1454,16 +1584,17 @@ "lines": 88 }, "end": 4187896, - "octets": 5381, - "lines": 88 + "octets": 5381 }, { "mboxMarkerBegin": 4187897, "mboxMarkerLength": 7, + "lineNumber": 57917, "begin": 4187905, "headersEnd": 4188357, "body": { "mimeType": "Image/JPEG", + "lineNumber": 57917, "begin": 4187905, "headersEnd": 4188357, "end": 4199771, @@ -1471,21 +1602,23 @@ "lines": 185 }, "end": 4199771, - "octets": 11414, - "lines": 185 + "octets": 11414 }, { "mboxMarkerBegin": 4199772, "mboxMarkerLength": 7, + "lineNumber": 58118, "begin": 4199780, "headersEnd": 4200345, "body": { "mimeType": "Multipart/Mixed", + "lineNumber": 58118, "begin": 4199780, "headersEnd": 4200345, "children": [ { "mimeType": "text/plain", + "lineNumber": 58134, "begin": 4200356, "headersEnd": 4200357, "end": 4200395, @@ -1494,18 +1627,22 @@ }, { "mimeType": "Multipart/MIXED", + "lineNumber": 58138, "begin": 4200407, "headersEnd": 4200462, "children": [ { "mimeType": "Message/External-body", + "lineNumber": 58141, "begin": 4200476, "headersEnd": 4200592, "message": { + "lineNumber": 58145, "begin": 4200592, "headersEnd": 4200669, "body": { "mimeType": "text/plain", + "lineNumber": 58145, "begin": 4200592, "headersEnd": 4200669, "end": 4200736, @@ -1513,8 +1650,7 @@ "lines": 2 }, "end": 4200736, - "octets": 67, - "lines": 2 + "octets": 67 }, "end": 4200736, "octets": 144, @@ -1522,13 +1658,16 @@ }, { "mimeType": "Message/External-body", + "lineNumber": 58152, "begin": 4200751, "headersEnd": 4200938, "message": { + "lineNumber": 58158, "begin": 4200938, "headersEnd": 4201014, "body": { "mimeType": "text/plain", + "lineNumber": 58158, "begin": 4200938, "headersEnd": 4201014, "end": 4201014, @@ -1536,8 +1675,7 @@ "lines": 0 }, "end": 4201014, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4201014, "octets": 76, @@ -1545,13 +1683,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 58162, "begin": 4201029, "headersEnd": 4201164, "message": { + "lineNumber": 58169, "begin": 4201164, "headersEnd": 4201231, "body": { "mimeType": "TEXT/HTML", + "lineNumber": 58169, "begin": 4201164, "headersEnd": 4201231, "end": 4201231, @@ -1559,8 +1700,7 @@ "lines": 0 }, "end": 4201231, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4201231, "octets": 67, @@ -1568,13 +1708,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 58173, "begin": 4201246, "headersEnd": 4201359, "message": { + "lineNumber": 58177, "begin": 4201359, "headersEnd": 4201427, "body": { "mimeType": "image/gif", + "lineNumber": 58177, "begin": 4201359, "headersEnd": 4201427, "end": 4201427, @@ -1582,8 +1725,7 @@ "lines": 0 }, "end": 4201427, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4201427, "octets": 68, @@ -1591,13 +1733,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 58181, "begin": 4201442, "headersEnd": 4201547, "message": { + "lineNumber": 58185, "begin": 4201547, "headersEnd": 4201615, "body": { "mimeType": "image/gif", + "lineNumber": 58185, "begin": 4201547, "headersEnd": 4201615, "end": 4201615, @@ -1605,8 +1750,7 @@ "lines": 0 }, "end": 4201615, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4201615, "octets": 68, @@ -1623,21 +1767,23 @@ "lines": 58 }, "end": 4201646, - "octets": 1301, - "lines": 58 + "octets": 1301 }, { "mboxMarkerBegin": 4201647, "mboxMarkerLength": 7, + "lineNumber": 58193, "begin": 4201655, "headersEnd": 4202220, "body": { "mimeType": "Multipart/Mixed", + "lineNumber": 58193, "begin": 4201655, "headersEnd": 4202220, "children": [ { "mimeType": "text/plain", + "lineNumber": 58209, "begin": 4202231, "headersEnd": 4202232, "end": 4205436, @@ -1646,18 +1792,22 @@ }, { "mimeType": "Multipart/Alternative", + "lineNumber": 58277, "begin": 4205448, "headersEnd": 4205509, "children": [ { "mimeType": "Message/External-body", + "lineNumber": 58280, "begin": 4205523, "headersEnd": 4205639, "message": { + "lineNumber": 58284, "begin": 4205639, "headersEnd": 4205716, "body": { "mimeType": "text/plain", + "lineNumber": 58284, "begin": 4205639, "headersEnd": 4205716, "end": 4205783, @@ -1665,8 +1815,7 @@ "lines": 2 }, "end": 4205783, - "octets": 67, - "lines": 2 + "octets": 67 }, "end": 4205783, "octets": 144, @@ -1674,13 +1823,16 @@ }, { "mimeType": "Message/External-body", + "lineNumber": 58291, "begin": 4205798, "headersEnd": 4205985, "message": { + "lineNumber": 58297, "begin": 4205985, "headersEnd": 4206061, "body": { "mimeType": "text/plain", + "lineNumber": 58297, "begin": 4205985, "headersEnd": 4206061, "end": 4206061, @@ -1688,8 +1840,7 @@ "lines": 0 }, "end": 4206061, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4206061, "octets": 76, @@ -1706,28 +1857,32 @@ "lines": 95 }, "end": 4206092, - "octets": 3872, - "lines": 95 + "octets": 3872 }, { "mboxMarkerBegin": 4206093, "mboxMarkerLength": 7, + "lineNumber": 58305, "begin": 4206101, "headersEnd": 4206569, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58305, "begin": 4206101, "headersEnd": 4206569, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 58320, "begin": 4206642, "headersEnd": 4206786, "message": { + "lineNumber": 58325, "begin": 4206786, "headersEnd": 4207215, "body": { "mimeType": "text/plain", + "lineNumber": 58325, "begin": 4206786, "headersEnd": 4207215, "end": 4207252, @@ -1735,8 +1890,7 @@ "lines": 2 }, "end": 4207252, - "octets": 37, - "lines": 2 + "octets": 37 }, "end": 4207252, "octets": 466, @@ -1744,6 +1898,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58340, "begin": 4207280, "headersEnd": 4207403, "end": 4207861, @@ -1752,6 +1907,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58352, "begin": 4207889, "headersEnd": 4208012, "end": 4208498, @@ -1760,6 +1916,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58364, "begin": 4208526, "headersEnd": 4208653, "end": 4209180, @@ -1768,6 +1925,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58377, "begin": 4209208, "headersEnd": 4209333, "end": 4209831, @@ -1776,13 +1934,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58389, "begin": 4209859, "headersEnd": 4210003, "message": { + "lineNumber": 58394, "begin": 4210003, "headersEnd": 4210432, "body": { "mimeType": "text/plain", + "lineNumber": 58394, "begin": 4210003, "headersEnd": 4210432, "end": 4210469, @@ -1790,8 +1951,7 @@ "lines": 1 }, "end": 4210469, - "octets": 37, - "lines": 1 + "octets": 37 }, "end": 4210469, "octets": 466, @@ -1799,27 +1959,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58408, "begin": 4210497, "headersEnd": 4210668, "message": { + "lineNumber": 58413, "begin": 4210668, "headersEnd": 4211238, "body": { "mimeType": "message/rfc822", + "lineNumber": 58413, "begin": 4210668, "headersEnd": 4211238, "message": { + "lineNumber": 58428, "begin": 4211238, "headersEnd": 4211749, "body": { "mimeType": "message/rfc822", + "lineNumber": 58428, "begin": 4211238, "headersEnd": 4211749, "message": { + "lineNumber": 58442, "begin": 4211749, "headersEnd": 4212159, "body": { "mimeType": "text/plain", + "lineNumber": 58442, "begin": 4211749, "headersEnd": 4212159, "end": 4212164, @@ -1827,24 +1994,21 @@ "lines": 1 }, "end": 4212164, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4212164, "octets": 415, "lines": 12 }, "end": 4212164, - "octets": 415, - "lines": 12 + "octets": 415 }, "end": 4212164, "octets": 926, "lines": 26 }, "end": 4212164, - "octets": 926, - "lines": 26 + "octets": 926 }, "end": 4212164, "octets": 1496, @@ -1852,6 +2016,7 @@ }, { "mimeType": "text/html", + "lineNumber": 58456, "begin": 4212192, "headersEnd": 4212245, "end": 4212297, @@ -1864,28 +2029,32 @@ "lines": 145 }, "end": 4212326, - "octets": 5757, - "lines": 145 + "octets": 5757 }, { "mboxMarkerBegin": 4212327, "mboxMarkerLength": 7, + "lineNumber": 58463, "begin": 4212335, "headersEnd": 4212806, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58463, "begin": 4212335, "headersEnd": 4212806, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 58478, "begin": 4212879, "headersEnd": 4213027, "message": { + "lineNumber": 58483, "begin": 4213027, "headersEnd": 4213455, "body": { "mimeType": "text/plain", + "lineNumber": 58483, "begin": 4213027, "headersEnd": 4213455, "end": 4213492, @@ -1893,8 +2062,7 @@ "lines": 2 }, "end": 4213492, - "octets": 37, - "lines": 2 + "octets": 37 }, "end": 4213492, "octets": 465, @@ -1902,6 +2070,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58498, "begin": 4213520, "headersEnd": 4213647, "end": 4214105, @@ -1910,6 +2079,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58510, "begin": 4214133, "headersEnd": 4214260, "end": 4214746, @@ -1918,6 +2088,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58522, "begin": 4214774, "headersEnd": 4214905, "end": 4215432, @@ -1926,6 +2097,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 58535, "begin": 4215460, "headersEnd": 4215589, "end": 4216087, @@ -1934,13 +2106,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58547, "begin": 4216115, "headersEnd": 4216263, "message": { + "lineNumber": 58552, "begin": 4216263, "headersEnd": 4216691, "body": { "mimeType": "text/plain", + "lineNumber": 58552, "begin": 4216263, "headersEnd": 4216691, "end": 4216728, @@ -1948,8 +2123,7 @@ "lines": 1 }, "end": 4216728, - "octets": 37, - "lines": 1 + "octets": 37 }, "end": 4216728, "octets": 465, @@ -1957,27 +2131,34 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58566, "begin": 4216756, "headersEnd": 4216931, "message": { + "lineNumber": 58571, "begin": 4216931, "headersEnd": 4217504, "body": { "mimeType": "message/rfc822", + "lineNumber": 58571, "begin": 4216931, "headersEnd": 4217504, "message": { + "lineNumber": 58586, "begin": 4217504, "headersEnd": 4218018, "body": { "mimeType": "message/rfc822", + "lineNumber": 58586, "begin": 4217504, "headersEnd": 4218018, "message": { + "lineNumber": 58600, "begin": 4218018, "headersEnd": 4218427, "body": { "mimeType": "text/plain", + "lineNumber": 58600, "begin": 4218018, "headersEnd": 4218427, "end": 4218432, @@ -1985,24 +2166,21 @@ "lines": 1 }, "end": 4218432, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4218432, "octets": 414, "lines": 12 }, "end": 4218432, - "octets": 414, - "lines": 12 + "octets": 414 }, "end": 4218432, "octets": 928, "lines": 26 }, "end": 4218432, - "octets": 928, - "lines": 26 + "octets": 928 }, "end": 4218432, "octets": 1501, @@ -2010,6 +2188,7 @@ }, { "mimeType": "text/html", + "lineNumber": 58614, "begin": 4218460, "headersEnd": 4218517, "end": 4218569, @@ -2022,21 +2201,23 @@ "lines": 145 }, "end": 4218598, - "octets": 5792, - "lines": 145 + "octets": 5792 }, { "mboxMarkerBegin": 4218599, "mboxMarkerLength": 7, + "lineNumber": 58621, "begin": 4218607, "headersEnd": 4219294, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58621, "begin": 4218607, "headersEnd": 4219294, "children": [ { "mimeType": "text/richtext", + "lineNumber": 58641, "begin": 4219341, "headersEnd": 4219370, "end": 4219786, @@ -2045,6 +2226,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 58675, "begin": 4219793, "headersEnd": 4219866, "end": 4220497, @@ -2053,6 +2235,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 58722, "begin": 4220504, "headersEnd": 4220505, "end": 4220523, @@ -2061,6 +2244,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 58725, "begin": 4220530, "headersEnd": 4220531, "end": 4220542, @@ -2069,18 +2253,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 58728, "begin": 4220549, "headersEnd": 4220579, "message": { + "lineNumber": 58730, "begin": 4220579, "headersEnd": 4220794, "body": { "mimeType": "multipart/mixed", + "lineNumber": 58730, "begin": 4220579, "headersEnd": 4220794, "children": [ { "mimeType": "text/html", + "lineNumber": 58738, "begin": 4220800, "headersEnd": 4220825, "end": 4220848, @@ -2089,6 +2277,7 @@ }, { "mimeType": "image/unknown", + "lineNumber": 58742, "begin": 4220855, "headersEnd": 4221030, "end": 4221068, @@ -2101,8 +2290,7 @@ "lines": 13 }, "end": 4221076, - "octets": 282, - "lines": 13 + "octets": 282 }, "end": 4221076, "octets": 497, @@ -2110,6 +2298,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 58751, "begin": 4221083, "headersEnd": 4221161, "end": 4230592, @@ -2118,6 +2307,7 @@ }, { "mimeType": "image/unknown", + "lineNumber": 58883, "begin": 4230599, "headersEnd": 4230774, "end": 4230812, @@ -2126,6 +2316,7 @@ }, { "mimeType": "image/x-xbitmap", + "lineNumber": 58891, "begin": 4230819, "headersEnd": 4230967, "end": 4238788, @@ -2134,18 +2325,22 @@ }, { "mimeType": "multipart/digest", + "lineNumber": 59024, "begin": 4238795, "headersEnd": 4238847, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 59027, "begin": 4238857, "headersEnd": 4238858, "message": { + "lineNumber": 59028, "begin": 4238858, "headersEnd": 4238884, "body": { "mimeType": "text/plain", + "lineNumber": 59028, "begin": 4238858, "headersEnd": 4238884, "end": 4238889, @@ -2153,8 +2348,7 @@ "lines": 1 }, "end": 4238889, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4238889, "octets": 31, @@ -2162,13 +2356,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59033, "begin": 4238900, "headersEnd": 4238901, "message": { + "lineNumber": 59034, "begin": 4238901, "headersEnd": 4238927, "body": { "mimeType": "text/plain", + "lineNumber": 59034, "begin": 4238901, "headersEnd": 4238927, "end": 4238932, @@ -2176,8 +2373,7 @@ "lines": 1 }, "end": 4238932, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4238932, "octets": 31, @@ -2185,13 +2381,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59039, "begin": 4238943, "headersEnd": 4238944, "message": { + "lineNumber": 59040, "begin": 4238944, "headersEnd": 4238970, "body": { "mimeType": "text/plain", + "lineNumber": 59040, "begin": 4238944, "headersEnd": 4238970, "end": 4238975, @@ -2199,8 +2398,7 @@ "lines": 1 }, "end": 4238975, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4238975, "octets": 31, @@ -2208,6 +2406,7 @@ }, { "mimeType": "text/html", + "lineNumber": 59045, "begin": 4238986, "headersEnd": 4239011, "end": 4239093, @@ -2216,13 +2415,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59050, "begin": 4239104, "headersEnd": 4239105, "message": { + "lineNumber": 59051, "begin": 4239105, "headersEnd": 4239159, "body": { "mimeType": "text/richtext", + "lineNumber": 59051, "begin": 4239105, "headersEnd": 4239159, "end": 4239208, @@ -2230,8 +2432,7 @@ "lines": 1 }, "end": 4239208, - "octets": 49, - "lines": 1 + "octets": 49 }, "end": 4239208, "octets": 103, @@ -2239,13 +2440,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 59057, "begin": 4239219, "headersEnd": 4239220, "message": { + "lineNumber": 59058, "begin": 4239220, "headersEnd": 4239246, "body": { "mimeType": "text/plain", + "lineNumber": 59058, "begin": 4239220, "headersEnd": 4239246, "end": 4239251, @@ -2253,8 +2457,7 @@ "lines": 1 }, "end": 4239251, - "octets": 5, - "lines": 1 + "octets": 5 }, "end": 4239251, "octets": 31, @@ -2271,21 +2474,23 @@ "lines": 428 }, "end": 4239312, - "octets": 20018, - "lines": 428 + "octets": 20018 }, { "mboxMarkerBegin": 4239313, "mboxMarkerLength": 7, + "lineNumber": 59067, "begin": 4239321, "headersEnd": 4239982, "body": { "mimeType": "multipart/mixed", + "lineNumber": 59067, "begin": 4239321, "headersEnd": 4239982, "children": [ { "mimeType": "text/plain", + "lineNumber": 59083, "begin": 4240008, "headersEnd": 4240009, "end": 4241229, @@ -2294,6 +2499,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 59112, "begin": 4241256, "headersEnd": 4241401, "end": 4312718, @@ -2302,6 +2508,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 59488, "begin": 4312745, "headersEnd": 4312746, "end": 4312746, @@ -2314,16 +2521,17 @@ "lines": 409 }, "end": 4312775, - "octets": 72793, - "lines": 409 + "octets": 72793 }, { "mboxMarkerBegin": 4312776, "mboxMarkerLength": 7, + "lineNumber": 59493, "begin": 4312784, "headersEnd": 4313717, "body": { "mimeType": "message/partial", + "lineNumber": 59493, "begin": 4312784, "headersEnd": 4313717, "end": 4562758, @@ -2331,21 +2539,23 @@ "lines": 3430 }, "end": 4562758, - "octets": 249041, - "lines": 3430 + "octets": 249041 }, { "mboxMarkerBegin": 4562759, "mboxMarkerLength": 7, + "lineNumber": 62945, "begin": 4562767, "headersEnd": 4563695, "body": { "mimeType": "multipart/mixed", + "lineNumber": 62945, "begin": 4562767, "headersEnd": 4563695, "children": [ { "mimeType": "text/richtext", + "lineNumber": 62971, "begin": 4563935, "headersEnd": 4564008, "end": 4564472, @@ -2354,6 +2564,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 62985, "begin": 4564518, "headersEnd": 4564577, "end": 4588813, @@ -2362,6 +2573,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 63322, "begin": 4588859, "headersEnd": 4588932, "end": 4589380, @@ -2370,6 +2582,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 63337, "begin": 4589426, "headersEnd": 4589485, "end": 4600699, @@ -2378,6 +2591,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 63496, "begin": 4600745, "headersEnd": 4600818, "end": 4601122, @@ -2386,6 +2600,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 63507, "begin": 4601168, "headersEnd": 4601227, "end": 4617677, @@ -2394,6 +2609,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 63738, "begin": 4617723, "headersEnd": 4617796, "end": 4618456, @@ -2406,21 +2622,23 @@ "lines": 792 }, "end": 4618504, - "octets": 54809, - "lines": 792 + "octets": 54809 }, { "mboxMarkerBegin": 4618505, "mboxMarkerLength": 7, + "lineNumber": 63760, "begin": 4618513, "headersEnd": 4619332, "body": { "mimeType": "multipart/mixed", + "lineNumber": 63760, "begin": 4618513, "headersEnd": 4619332, "children": [ { "mimeType": "text/plain", + "lineNumber": 63777, "begin": 4619361, "headersEnd": 4619362, "end": 4620012, @@ -2429,6 +2647,7 @@ }, { "mimeType": "Image/JPEG", + "lineNumber": 63798, "begin": 4620042, "headersEnd": 4620102, "end": 4666555, @@ -2441,21 +2660,23 @@ "lines": 788 }, "end": 4666587, - "octets": 47255, - "lines": 788 + "octets": 47255 }, { "mboxMarkerBegin": 4666588, "mboxMarkerLength": 7, + "lineNumber": 64566, "begin": 4666596, "headersEnd": 4667343, "body": { "mimeType": "multipart/mixed", + "lineNumber": 64566, "begin": 4666596, "headersEnd": 4667343, "children": [ { "mimeType": "text/enriched", + "lineNumber": 64588, "begin": 4667800, "headersEnd": 4667873, "end": 4673188, @@ -2464,6 +2685,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 64753, "begin": 4673212, "headersEnd": 4673309, "end": 4675889, @@ -2472,6 +2694,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 64795, "begin": 4675913, "headersEnd": 4675986, "end": 4676504, @@ -2480,6 +2703,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 64810, "begin": 4676528, "headersEnd": 4676642, "end": 4699702, @@ -2488,6 +2712,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 65132, "begin": 4699726, "headersEnd": 4699799, "end": 4700377, @@ -2496,13 +2721,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 65151, "begin": 4700401, "headersEnd": 4700486, "message": { + "lineNumber": 65155, "begin": 4700486, "headersEnd": 4700555, "body": { "mimeType": "text/plain", + "lineNumber": 65155, "begin": 4700486, "headersEnd": 4700555, "end": 4700555, @@ -2510,8 +2738,7 @@ "lines": 0 }, "end": 4700555, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4700555, "octets": 69, @@ -2519,6 +2746,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 65159, "begin": 4700579, "headersEnd": 4700652, "end": 4700928, @@ -2527,13 +2755,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 65169, "begin": 4700952, "headersEnd": 4701098, "message": { + "lineNumber": 65176, "begin": 4701098, "headersEnd": 4701167, "body": { "mimeType": "text/plain", + "lineNumber": 65176, "begin": 4701098, "headersEnd": 4701167, "end": 4701167, @@ -2541,8 +2772,7 @@ "lines": 0 }, "end": 4701167, - "octets": 0, - "lines": 0 + "octets": 0 }, "end": 4701167, "octets": 69, @@ -2550,6 +2780,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 65180, "begin": 4701191, "headersEnd": 4701264, "end": 4702333, @@ -2562,21 +2793,23 @@ "lines": 639 }, "end": 4702358, - "octets": 35015, - "lines": 639 + "octets": 35015 }, { "mboxMarkerBegin": 4702359, "mboxMarkerLength": 7, + "lineNumber": 65220, "begin": 4702367, "headersEnd": 4702528, "body": { "mimeType": "Multipart/mixed", + "lineNumber": 65220, "begin": 4702367, "headersEnd": 4702528, "children": [ { "mimeType": "image/gif", + "lineNumber": 65227, "begin": 4702540, "headersEnd": 4702609, "end": 4778953, @@ -2585,6 +2818,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 66377, "begin": 4778966, "headersEnd": 4778967, "end": 4778997, @@ -2597,21 +2831,23 @@ "lines": 1154 }, "end": 4779011, - "octets": 76483, - "lines": 1154 + "octets": 76483 }, { "mboxMarkerBegin": 4779012, "mboxMarkerLength": 7, + "lineNumber": 66381, "begin": 4779020, "headersEnd": 4780235, "body": { "mimeType": "MULTIPART/MIXED", + "lineNumber": 66381, "begin": 4779020, "headersEnd": 4780235, "children": [ { "mimeType": "TEXT/plain", + "lineNumber": 66405, "begin": 4780273, "headersEnd": 4780317, "end": 4780769, @@ -2620,6 +2856,7 @@ }, { "mimeType": "AUDIO/basic", + "lineNumber": 66417, "begin": 4780808, "headersEnd": 4780901, "end": 4908644, @@ -2632,21 +2869,23 @@ "lines": 2114 }, "end": 4908685, - "octets": 128450, - "lines": 2114 + "octets": 128450 }, { "mboxMarkerBegin": 4908686, "mboxMarkerLength": 7, + "lineNumber": 68520, "begin": 4908694, "headersEnd": 4909446, "body": { "mimeType": "multipart/alternative", + "lineNumber": 68520, "begin": 4908694, "headersEnd": 4909446, "children": [ { "mimeType": "text/plain", + "lineNumber": 68544, "begin": 4909843, "headersEnd": 4909844, "end": 4910639, @@ -2655,11 +2894,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 68565, "begin": 4910698, "headersEnd": 4910801, "children": [ { "mimeType": "text/richtext", + "lineNumber": 68569, "begin": 4910861, "headersEnd": 4910934, "end": 4911423, @@ -2668,6 +2909,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 68581, "begin": 4911484, "headersEnd": 4911580, "end": 4924570, @@ -2676,6 +2918,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 68777, "begin": 4924631, "headersEnd": 4924701, "end": 4924721, @@ -2684,6 +2927,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 68783, "begin": 4924782, "headersEnd": 4924878, "end": 4980598, @@ -2692,6 +2936,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 69553, "begin": 4980659, "headersEnd": 4980729, "end": 4980781, @@ -2700,6 +2945,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 69563, "begin": 4980842, "headersEnd": 4980903, "end": 5083055, @@ -2708,6 +2954,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 70968, "begin": 5083116, "headersEnd": 5083186, "end": 5083188, @@ -2725,21 +2972,23 @@ "lines": 2440 }, "end": 5083311, - "octets": 173865, - "lines": 2440 + "octets": 173865 }, { "mboxMarkerBegin": 5083312, "mboxMarkerLength": 7, + "lineNumber": 70978, "begin": 5083320, "headersEnd": 5084006, "body": { "mimeType": "multipart/alternative", + "lineNumber": 70978, "begin": 5083320, "headersEnd": 5084006, "children": [ { "mimeType": "text/plain", + "lineNumber": 70998, "begin": 5084201, "headersEnd": 5084245, "end": 5085760, @@ -2748,11 +2997,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 71031, "begin": 5085801, "headersEnd": 5085886, "children": [ { "mimeType": "text/richtext", + "lineNumber": 71035, "begin": 5085928, "headersEnd": 5086019, "end": 5086926, @@ -2761,6 +3012,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 71053, "begin": 5086969, "headersEnd": 5087060, "end": 5121918, @@ -2769,6 +3021,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 71565, "begin": 5121961, "headersEnd": 5122052, "end": 5122062, @@ -2777,6 +3030,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 71572, "begin": 5122105, "headersEnd": 5122196, "end": 5143530, @@ -2785,6 +3039,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 71888, "begin": 5143573, "headersEnd": 5143664, "end": 5143674, @@ -2793,6 +3048,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 71895, "begin": 5143717, "headersEnd": 5143808, "end": 5176251, @@ -2801,6 +3057,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 72372, "begin": 5176294, "headersEnd": 5176385, "end": 5176395, @@ -2809,6 +3066,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 72379, "begin": 5176438, "headersEnd": 5176529, "end": 5209970, @@ -2817,6 +3075,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 72870, "begin": 5210013, "headersEnd": 5210104, "end": 5210114, @@ -2825,6 +3084,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 72877, "begin": 5210157, "headersEnd": 5210248, "end": 5238084, @@ -2833,6 +3093,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 73287, "begin": 5238127, "headersEnd": 5238218, "end": 5238228, @@ -2841,6 +3102,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 73294, "begin": 5238271, "headersEnd": 5238362, "end": 5271856, @@ -2849,6 +3111,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 73786, "begin": 5271899, "headersEnd": 5271990, "end": 5272000, @@ -2857,6 +3120,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 73793, "begin": 5272043, "headersEnd": 5272134, "end": 5298793, @@ -2865,6 +3129,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 74186, "begin": 5298836, "headersEnd": 5298927, "end": 5299001, @@ -2882,21 +3147,23 @@ "lines": 3202 }, "end": 5299088, - "octets": 215082, - "lines": 3202 + "octets": 215082 }, { "mboxMarkerBegin": 5299089, "mboxMarkerLength": 7, + "lineNumber": 74197, "begin": 5299097, "headersEnd": 5299489, "body": { "mimeType": "multipart/mixed", + "lineNumber": 74197, "begin": 5299097, "headersEnd": 5299489, "children": [ { "mimeType": "text/richtext", + "lineNumber": 74215, "begin": 5299733, "headersEnd": 5299828, "end": 5300031, @@ -2905,6 +3172,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 74229, "begin": 5300081, "headersEnd": 5300142, "end": 5388740, @@ -2913,6 +3181,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 75448, "begin": 5388790, "headersEnd": 5388816, "end": 5388846, @@ -2925,16 +3194,17 @@ "lines": 1243 }, "end": 5388898, - "octets": 89409, - "lines": 1243 + "octets": 89409 }, { "mboxMarkerBegin": 5388899, "mboxMarkerLength": 7, + "lineNumber": 75455, "begin": 5388907, "headersEnd": 5389843, "body": { "mimeType": "message/partial", + "lineNumber": 75455, "begin": 5388907, "headersEnd": 5389843, "end": 5440552, @@ -2942,21 +3212,23 @@ "lines": 696 }, "end": 5440552, - "octets": 50709, - "lines": 696 + "octets": 50709 }, { "mboxMarkerBegin": 5440553, "mboxMarkerLength": 7, + "lineNumber": 76173, "begin": 5440561, "headersEnd": 5441173, "body": { "mimeType": "multipart/mixed", + "lineNumber": 76173, "begin": 5440561, "headersEnd": 5441173, "children": [ { "mimeType": "text/plain", + "lineNumber": 76191, "begin": 5441191, "headersEnd": 5441192, "end": 5445509, @@ -2965,18 +3237,22 @@ }, { "mimeType": "multipart/digest", + "lineNumber": 76295, "begin": 5445528, "headersEnd": 5445669, "children": [ { "mimeType": "message/rfc822", + "lineNumber": 76299, "begin": 5445700, "headersEnd": 5445701, "message": { + "lineNumber": 76300, "begin": 5445701, "headersEnd": 5445806, "body": { "mimeType": "text/plain", + "lineNumber": 76300, "begin": 5445701, "headersEnd": 5445806, "end": 5446427, @@ -2984,8 +3260,7 @@ "lines": 18 }, "end": 5446427, - "octets": 621, - "lines": 18 + "octets": 621 }, "end": 5446427, "octets": 726, @@ -2993,13 +3268,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76324, "begin": 5446459, "headersEnd": 5446460, "message": { + "lineNumber": 76325, "begin": 5446460, "headersEnd": 5446581, "body": { "mimeType": "text/plain", + "lineNumber": 76325, "begin": 5446460, "headersEnd": 5446581, "end": 5447314, @@ -3007,8 +3285,7 @@ "lines": 20 }, "end": 5447314, - "octets": 733, - "lines": 20 + "octets": 733 }, "end": 5447314, "octets": 854, @@ -3016,13 +3293,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76351, "begin": 5447346, "headersEnd": 5447347, "message": { + "lineNumber": 76352, "begin": 5447347, "headersEnd": 5447466, "body": { "mimeType": "text/plain", + "lineNumber": 76352, "begin": 5447347, "headersEnd": 5447466, "end": 5448112, @@ -3030,8 +3310,7 @@ "lines": 14 }, "end": 5448112, - "octets": 646, - "lines": 14 + "octets": 646 }, "end": 5448112, "octets": 765, @@ -3039,13 +3318,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76372, "begin": 5448144, "headersEnd": 5448145, "message": { + "lineNumber": 76373, "begin": 5448145, "headersEnd": 5448301, "body": { "mimeType": "text/plain", + "lineNumber": 76373, "begin": 5448145, "headersEnd": 5448301, "end": 5448784, @@ -3053,8 +3335,7 @@ "lines": 10 }, "end": 5448784, - "octets": 483, - "lines": 10 + "octets": 483 }, "end": 5448784, "octets": 639, @@ -3062,13 +3343,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76389, "begin": 5448816, "headersEnd": 5448817, "message": { + "lineNumber": 76390, "begin": 5448817, "headersEnd": 5448971, "body": { "mimeType": "text/plain", + "lineNumber": 76390, "begin": 5448817, "headersEnd": 5448971, "end": 5449543, @@ -3076,8 +3360,7 @@ "lines": 15 }, "end": 5449543, - "octets": 572, - "lines": 15 + "octets": 572 }, "end": 5449543, "octets": 726, @@ -3085,13 +3368,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76411, "begin": 5449575, "headersEnd": 5449576, "message": { + "lineNumber": 76412, "begin": 5449576, "headersEnd": 5449733, "body": { "mimeType": "text/plain", + "lineNumber": 76412, "begin": 5449576, "headersEnd": 5449733, "end": 5451008, @@ -3099,8 +3385,7 @@ "lines": 26 }, "end": 5451008, - "octets": 1275, - "lines": 26 + "octets": 1275 }, "end": 5451008, "octets": 1432, @@ -3108,13 +3393,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76444, "begin": 5451040, "headersEnd": 5451041, "message": { + "lineNumber": 76445, "begin": 5451041, "headersEnd": 5451194, "body": { "mimeType": "text/plain", + "lineNumber": 76445, "begin": 5451041, "headersEnd": 5451194, "end": 5451595, @@ -3122,8 +3410,7 @@ "lines": 9 }, "end": 5451595, - "octets": 401, - "lines": 9 + "octets": 401 }, "end": 5451595, "octets": 554, @@ -3131,13 +3418,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76460, "begin": 5451627, "headersEnd": 5451628, "message": { + "lineNumber": 76461, "begin": 5451628, "headersEnd": 5451775, "body": { "mimeType": "text/plain", + "lineNumber": 76461, "begin": 5451628, "headersEnd": 5451775, "end": 5452171, @@ -3145,8 +3435,7 @@ "lines": 7 }, "end": 5452171, - "octets": 396, - "lines": 7 + "octets": 396 }, "end": 5452171, "octets": 543, @@ -3154,13 +3443,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76474, "begin": 5452203, "headersEnd": 5452204, "message": { + "lineNumber": 76475, "begin": 5452204, "headersEnd": 5452347, "body": { "mimeType": "text/plain", + "lineNumber": 76475, "begin": 5452204, "headersEnd": 5452347, "end": 5452987, @@ -3168,8 +3460,7 @@ "lines": 11 }, "end": 5452987, - "octets": 640, - "lines": 11 + "octets": 640 }, "end": 5452987, "octets": 783, @@ -3177,13 +3468,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76492, "begin": 5453019, "headersEnd": 5453020, "message": { + "lineNumber": 76493, "begin": 5453020, "headersEnd": 5453157, "body": { "mimeType": "text/plain", + "lineNumber": 76493, "begin": 5453020, "headersEnd": 5453157, "end": 5454134, @@ -3191,8 +3485,7 @@ "lines": 19 }, "end": 5454134, - "octets": 977, - "lines": 19 + "octets": 977 }, "end": 5454134, "octets": 1114, @@ -3200,13 +3493,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76518, "begin": 5454166, "headersEnd": 5454167, "message": { + "lineNumber": 76519, "begin": 5454167, "headersEnd": 5454314, "body": { "mimeType": "text/plain", + "lineNumber": 76519, "begin": 5454167, "headersEnd": 5454314, "end": 5455204, @@ -3214,8 +3510,7 @@ "lines": 27 }, "end": 5455204, - "octets": 890, - "lines": 27 + "octets": 890 }, "end": 5455204, "octets": 1037, @@ -3223,13 +3518,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76552, "begin": 5455236, "headersEnd": 5455237, "message": { + "lineNumber": 76553, "begin": 5455237, "headersEnd": 5455368, "body": { "mimeType": "text/plain", + "lineNumber": 76553, "begin": 5455237, "headersEnd": 5455368, "end": 5455927, @@ -3237,8 +3535,7 @@ "lines": 11 }, "end": 5455927, - "octets": 559, - "lines": 11 + "octets": 559 }, "end": 5455927, "octets": 690, @@ -3246,13 +3543,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76570, "begin": 5455959, "headersEnd": 5455960, "message": { + "lineNumber": 76571, "begin": 5455960, "headersEnd": 5456092, "body": { "mimeType": "text/plain", + "lineNumber": 76571, "begin": 5455960, "headersEnd": 5456092, "end": 5456529, @@ -3260,8 +3560,7 @@ "lines": 10 }, "end": 5456529, - "octets": 437, - "lines": 10 + "octets": 437 }, "end": 5456529, "octets": 569, @@ -3269,13 +3568,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76587, "begin": 5456561, "headersEnd": 5456562, "message": { + "lineNumber": 76588, "begin": 5456562, "headersEnd": 5456679, "body": { "mimeType": "text/plain", + "lineNumber": 76588, "begin": 5456562, "headersEnd": 5456679, "end": 5457231, @@ -3283,8 +3585,7 @@ "lines": 15 }, "end": 5457231, - "octets": 552, - "lines": 15 + "octets": 552 }, "end": 5457231, "octets": 669, @@ -3292,13 +3593,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76609, "begin": 5457263, "headersEnd": 5457264, "message": { + "lineNumber": 76610, "begin": 5457264, "headersEnd": 5457379, "body": { "mimeType": "text/plain", + "lineNumber": 76610, "begin": 5457264, "headersEnd": 5457379, "end": 5457564, @@ -3306,8 +3610,7 @@ "lines": 8 }, "end": 5457564, - "octets": 185, - "lines": 8 + "octets": 185 }, "end": 5457564, "octets": 300, @@ -3315,13 +3618,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76624, "begin": 5457596, "headersEnd": 5457597, "message": { + "lineNumber": 76625, "begin": 5457597, "headersEnd": 5457714, "body": { "mimeType": "text/plain", + "lineNumber": 76625, "begin": 5457597, "headersEnd": 5457714, "end": 5458042, @@ -3329,8 +3635,7 @@ "lines": 7 }, "end": 5458042, - "octets": 328, - "lines": 7 + "octets": 328 }, "end": 5458042, "octets": 445, @@ -3338,13 +3643,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76638, "begin": 5458074, "headersEnd": 5458075, "message": { + "lineNumber": 76639, "begin": 5458075, "headersEnd": 5458198, "body": { "mimeType": "text/plain", + "lineNumber": 76639, "begin": 5458075, "headersEnd": 5458198, "end": 5458865, @@ -3352,8 +3660,7 @@ "lines": 21 }, "end": 5458865, - "octets": 667, - "lines": 21 + "octets": 667 }, "end": 5458865, "octets": 790, @@ -3361,13 +3668,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76666, "begin": 5458897, "headersEnd": 5458898, "message": { + "lineNumber": 76667, "begin": 5458898, "headersEnd": 5459022, "body": { "mimeType": "text/plain", + "lineNumber": 76667, "begin": 5458898, "headersEnd": 5459022, "end": 5459124, @@ -3375,8 +3685,7 @@ "lines": 5 }, "end": 5459124, - "octets": 102, - "lines": 5 + "octets": 102 }, "end": 5459124, "octets": 226, @@ -3384,13 +3693,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76678, "begin": 5459156, "headersEnd": 5459157, "message": { + "lineNumber": 76679, "begin": 5459157, "headersEnd": 5459299, "body": { "mimeType": "text/plain", + "lineNumber": 76679, "begin": 5459157, "headersEnd": 5459299, "end": 5460135, @@ -3398,8 +3710,7 @@ "lines": 21 }, "end": 5460135, - "octets": 836, - "lines": 21 + "octets": 836 }, "end": 5460135, "octets": 978, @@ -3407,13 +3718,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76706, "begin": 5460167, "headersEnd": 5460168, "message": { + "lineNumber": 76707, "begin": 5460168, "headersEnd": 5460278, "body": { "mimeType": "text/plain", + "lineNumber": 76707, "begin": 5460168, "headersEnd": 5460278, "end": 5460697, @@ -3421,8 +3735,7 @@ "lines": 9 }, "end": 5460697, - "octets": 419, - "lines": 9 + "octets": 419 }, "end": 5460697, "octets": 529, @@ -3430,13 +3743,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76722, "begin": 5460729, "headersEnd": 5460730, "message": { + "lineNumber": 76723, "begin": 5460730, "headersEnd": 5460902, "body": { "mimeType": "text/plain", + "lineNumber": 76723, "begin": 5460730, "headersEnd": 5460902, "end": 5461132, @@ -3444,8 +3760,7 @@ "lines": 9 }, "end": 5461132, - "octets": 230, - "lines": 9 + "octets": 230 }, "end": 5461132, "octets": 402, @@ -3453,13 +3768,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76738, "begin": 5461164, "headersEnd": 5461165, "message": { + "lineNumber": 76739, "begin": 5461165, "headersEnd": 5461291, "body": { "mimeType": "text/plain", + "lineNumber": 76739, "begin": 5461165, "headersEnd": 5461291, "end": 5461690, @@ -3467,8 +3785,7 @@ "lines": 12 }, "end": 5461690, - "octets": 399, - "lines": 12 + "octets": 399 }, "end": 5461690, "octets": 525, @@ -3476,13 +3793,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76757, "begin": 5461722, "headersEnd": 5461723, "message": { + "lineNumber": 76758, "begin": 5461723, "headersEnd": 5461840, "body": { "mimeType": "text/plain", + "lineNumber": 76758, "begin": 5461723, "headersEnd": 5461840, "end": 5462744, @@ -3490,8 +3810,7 @@ "lines": 28 }, "end": 5462744, - "octets": 904, - "lines": 28 + "octets": 904 }, "end": 5462744, "octets": 1021, @@ -3499,13 +3818,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76792, "begin": 5462776, "headersEnd": 5462777, "message": { + "lineNumber": 76793, "begin": 5462777, "headersEnd": 5462905, "body": { "mimeType": "text/plain", + "lineNumber": 76793, "begin": 5462777, "headersEnd": 5462905, "end": 5463196, @@ -3513,8 +3835,7 @@ "lines": 9 }, "end": 5463196, - "octets": 291, - "lines": 9 + "octets": 291 }, "end": 5463196, "octets": 419, @@ -3522,13 +3843,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76808, "begin": 5463228, "headersEnd": 5463229, "message": { + "lineNumber": 76809, "begin": 5463229, "headersEnd": 5463358, "body": { "mimeType": "text/plain", + "lineNumber": 76809, "begin": 5463229, "headersEnd": 5463358, "end": 5463768, @@ -3536,8 +3860,7 @@ "lines": 14 }, "end": 5463768, - "octets": 410, - "lines": 14 + "octets": 410 }, "end": 5463768, "octets": 539, @@ -3545,13 +3868,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76829, "begin": 5463800, "headersEnd": 5463801, "message": { + "lineNumber": 76830, "begin": 5463801, "headersEnd": 5463916, "body": { "mimeType": "text/plain", + "lineNumber": 76830, "begin": 5463801, "headersEnd": 5463916, "end": 5464061, @@ -3559,8 +3885,7 @@ "lines": 4 }, "end": 5464061, - "octets": 145, - "lines": 4 + "octets": 145 }, "end": 5464061, "octets": 260, @@ -3568,13 +3893,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76840, "begin": 5464093, "headersEnd": 5464094, "message": { + "lineNumber": 76841, "begin": 5464094, "headersEnd": 5464219, "body": { "mimeType": "text/plain", + "lineNumber": 76841, "begin": 5464094, "headersEnd": 5464219, "end": 5464398, @@ -3582,8 +3910,7 @@ "lines": 7 }, "end": 5464398, - "octets": 179, - "lines": 7 + "octets": 179 }, "end": 5464398, "octets": 304, @@ -3591,13 +3918,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76854, "begin": 5464430, "headersEnd": 5464431, "message": { + "lineNumber": 76855, "begin": 5464431, "headersEnd": 5464561, "body": { "mimeType": "text/plain", + "lineNumber": 76855, "begin": 5464431, "headersEnd": 5464561, "end": 5465277, @@ -3605,8 +3935,7 @@ "lines": 14 }, "end": 5465277, - "octets": 716, - "lines": 14 + "octets": 716 }, "end": 5465277, "octets": 846, @@ -3614,13 +3943,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76875, "begin": 5465309, "headersEnd": 5465310, "message": { + "lineNumber": 76876, "begin": 5465310, "headersEnd": 5465456, "body": { "mimeType": "text/plain", + "lineNumber": 76876, "begin": 5465310, "headersEnd": 5465456, "end": 5466413, @@ -3628,8 +3960,7 @@ "lines": 26 }, "end": 5466413, - "octets": 957, - "lines": 26 + "octets": 957 }, "end": 5466413, "octets": 1103, @@ -3637,13 +3968,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76908, "begin": 5466445, "headersEnd": 5466446, "message": { + "lineNumber": 76909, "begin": 5466446, "headersEnd": 5466580, "body": { "mimeType": "text/plain", + "lineNumber": 76909, "begin": 5466446, "headersEnd": 5466580, "end": 5466827, @@ -3651,8 +3985,7 @@ "lines": 7 }, "end": 5466827, - "octets": 247, - "lines": 7 + "octets": 247 }, "end": 5466827, "octets": 381, @@ -3660,13 +3993,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76922, "begin": 5466859, "headersEnd": 5466860, "message": { + "lineNumber": 76923, "begin": 5466860, "headersEnd": 5466982, "body": { "mimeType": "text/plain", + "lineNumber": 76923, "begin": 5466860, "headersEnd": 5466982, "end": 5467109, @@ -3674,8 +4010,7 @@ "lines": 6 }, "end": 5467109, - "octets": 127, - "lines": 6 + "octets": 127 }, "end": 5467109, "octets": 249, @@ -3683,13 +4018,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76935, "begin": 5467141, "headersEnd": 5467142, "message": { + "lineNumber": 76936, "begin": 5467142, "headersEnd": 5467317, "body": { "mimeType": "text/plain", + "lineNumber": 76936, "begin": 5467142, "headersEnd": 5467317, "end": 5468062, @@ -3697,8 +4035,7 @@ "lines": 16 }, "end": 5468062, - "octets": 745, - "lines": 16 + "octets": 745 }, "end": 5468062, "octets": 920, @@ -3706,13 +4043,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76959, "begin": 5468094, "headersEnd": 5468095, "message": { + "lineNumber": 76960, "begin": 5468095, "headersEnd": 5468255, "body": { "mimeType": "text/plain", + "lineNumber": 76960, "begin": 5468095, "headersEnd": 5468255, "end": 5468654, @@ -3720,8 +4060,7 @@ "lines": 16 }, "end": 5468654, - "octets": 399, - "lines": 16 + "octets": 399 }, "end": 5468654, "octets": 559, @@ -3729,13 +4068,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 76982, "begin": 5468686, "headersEnd": 5468687, "message": { + "lineNumber": 76983, "begin": 5468687, "headersEnd": 5468819, "body": { "mimeType": "text/plain", + "lineNumber": 76983, "begin": 5468687, "headersEnd": 5468819, "end": 5470106, @@ -3743,8 +4085,7 @@ "lines": 21 }, "end": 5470106, - "octets": 1287, - "lines": 21 + "octets": 1287 }, "end": 5470106, "octets": 1419, @@ -3752,13 +4093,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77010, "begin": 5470138, "headersEnd": 5470139, "message": { + "lineNumber": 77011, "begin": 5470139, "headersEnd": 5470245, "body": { "mimeType": "text/plain", + "lineNumber": 77011, "begin": 5470139, "headersEnd": 5470245, "end": 5470388, @@ -3766,8 +4110,7 @@ "lines": 6 }, "end": 5470388, - "octets": 143, - "lines": 6 + "octets": 143 }, "end": 5470388, "octets": 249, @@ -3775,13 +4118,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77023, "begin": 5470420, "headersEnd": 5470421, "message": { + "lineNumber": 77024, "begin": 5470421, "headersEnd": 5470558, "body": { "mimeType": "text/plain", + "lineNumber": 77024, "begin": 5470421, "headersEnd": 5470558, "end": 5470857, @@ -3789,8 +4135,7 @@ "lines": 11 }, "end": 5470857, - "octets": 299, - "lines": 11 + "octets": 299 }, "end": 5470857, "octets": 436, @@ -3798,13 +4143,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77041, "begin": 5470889, "headersEnd": 5470890, "message": { + "lineNumber": 77042, "begin": 5470890, "headersEnd": 5471016, "body": { "mimeType": "text/plain", + "lineNumber": 77042, "begin": 5470890, "headersEnd": 5471016, "end": 5471203, @@ -3812,8 +4160,7 @@ "lines": 6 }, "end": 5471203, - "octets": 187, - "lines": 6 + "octets": 187 }, "end": 5471203, "octets": 313, @@ -3821,13 +4168,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77054, "begin": 5471235, "headersEnd": 5471236, "message": { + "lineNumber": 77055, "begin": 5471236, "headersEnd": 5471341, "body": { "mimeType": "text/plain", + "lineNumber": 77055, "begin": 5471236, "headersEnd": 5471341, "end": 5471739, @@ -3835,8 +4185,7 @@ "lines": 12 }, "end": 5471739, - "octets": 398, - "lines": 12 + "octets": 398 }, "end": 5471739, "octets": 503, @@ -3844,13 +4193,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77073, "begin": 5471771, "headersEnd": 5471772, "message": { + "lineNumber": 77074, "begin": 5471772, "headersEnd": 5471906, "body": { "mimeType": "text/plain", + "lineNumber": 77074, "begin": 5471772, "headersEnd": 5471906, "end": 5472208, @@ -3858,8 +4210,7 @@ "lines": 8 }, "end": 5472208, - "octets": 302, - "lines": 8 + "octets": 302 }, "end": 5472208, "octets": 436, @@ -3867,13 +4218,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77088, "begin": 5472240, "headersEnd": 5472241, "message": { + "lineNumber": 77089, "begin": 5472241, "headersEnd": 5472384, "body": { "mimeType": "text/plain", + "lineNumber": 77089, "begin": 5472241, "headersEnd": 5472384, "end": 5473002, @@ -3881,8 +4235,7 @@ "lines": 17 }, "end": 5473002, - "octets": 618, - "lines": 17 + "octets": 618 }, "end": 5473002, "octets": 761, @@ -3890,13 +4243,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77112, "begin": 5473034, "headersEnd": 5473035, "message": { + "lineNumber": 77113, "begin": 5473035, "headersEnd": 5473188, "body": { "mimeType": "text/plain", + "lineNumber": 77113, "begin": 5473035, "headersEnd": 5473188, "end": 5473663, @@ -3904,8 +4260,7 @@ "lines": 10 }, "end": 5473663, - "octets": 475, - "lines": 10 + "octets": 475 }, "end": 5473663, "octets": 628, @@ -3913,13 +4268,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77129, "begin": 5473695, "headersEnd": 5473696, "message": { + "lineNumber": 77130, "begin": 5473696, "headersEnd": 5473829, "body": { "mimeType": "text/plain", + "lineNumber": 77130, "begin": 5473696, "headersEnd": 5473829, "end": 5475001, @@ -3927,8 +4285,7 @@ "lines": 27 }, "end": 5475001, - "octets": 1172, - "lines": 27 + "octets": 1172 }, "end": 5475001, "octets": 1305, @@ -3936,13 +4293,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77163, "begin": 5475033, "headersEnd": 5475034, "message": { + "lineNumber": 77164, "begin": 5475034, "headersEnd": 5475210, "body": { "mimeType": "text/plain", + "lineNumber": 77164, "begin": 5475034, "headersEnd": 5475210, "end": 5475469, @@ -3950,8 +4310,7 @@ "lines": 8 }, "end": 5475469, - "octets": 259, - "lines": 8 + "octets": 259 }, "end": 5475469, "octets": 435, @@ -3959,13 +4318,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77178, "begin": 5475501, "headersEnd": 5475502, "message": { + "lineNumber": 77179, "begin": 5475502, "headersEnd": 5475617, "body": { "mimeType": "text/plain", + "lineNumber": 77179, "begin": 5475502, "headersEnd": 5475617, "end": 5475810, @@ -3973,8 +4335,7 @@ "lines": 4 }, "end": 5475810, - "octets": 193, - "lines": 4 + "octets": 193 }, "end": 5475810, "octets": 308, @@ -3982,13 +4343,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77189, "begin": 5475842, "headersEnd": 5475843, "message": { + "lineNumber": 77190, "begin": 5475843, "headersEnd": 5475983, "body": { "mimeType": "text/plain", + "lineNumber": 77190, "begin": 5475843, "headersEnd": 5475983, "end": 5476848, @@ -3996,8 +4360,7 @@ "lines": 24 }, "end": 5476848, - "octets": 865, - "lines": 24 + "octets": 865 }, "end": 5476848, "octets": 1005, @@ -4005,13 +4368,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77220, "begin": 5476880, "headersEnd": 5476881, "message": { + "lineNumber": 77221, "begin": 5476881, "headersEnd": 5477006, "body": { "mimeType": "text/plain", + "lineNumber": 77221, "begin": 5476881, "headersEnd": 5477006, "end": 5477720, @@ -4019,8 +4385,7 @@ "lines": 11 }, "end": 5477720, - "octets": 714, - "lines": 11 + "octets": 714 }, "end": 5477720, "octets": 839, @@ -4028,13 +4393,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77238, "begin": 5477752, "headersEnd": 5477753, "message": { + "lineNumber": 77239, "begin": 5477753, "headersEnd": 5477865, "body": { "mimeType": "text/plain", + "lineNumber": 77239, "begin": 5477753, "headersEnd": 5477865, "end": 5478568, @@ -4042,8 +4410,7 @@ "lines": 17 }, "end": 5478568, - "octets": 703, - "lines": 17 + "octets": 703 }, "end": 5478568, "octets": 815, @@ -4051,13 +4418,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77262, "begin": 5478600, "headersEnd": 5478601, "message": { + "lineNumber": 77263, "begin": 5478601, "headersEnd": 5478733, "body": { "mimeType": "text/plain", + "lineNumber": 77263, "begin": 5478601, "headersEnd": 5478733, "end": 5479113, @@ -4065,8 +4435,7 @@ "lines": 11 }, "end": 5479113, - "octets": 380, - "lines": 11 + "octets": 380 }, "end": 5479113, "octets": 512, @@ -4074,13 +4443,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77280, "begin": 5479145, "headersEnd": 5479146, "message": { + "lineNumber": 77281, "begin": 5479146, "headersEnd": 5479282, "body": { "mimeType": "text/plain", + "lineNumber": 77281, "begin": 5479146, "headersEnd": 5479282, "end": 5480259, @@ -4088,8 +4460,7 @@ "lines": 24 }, "end": 5480259, - "octets": 977, - "lines": 24 + "octets": 977 }, "end": 5480259, "octets": 1113, @@ -4097,13 +4468,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77311, "begin": 5480291, "headersEnd": 5480292, "message": { + "lineNumber": 77312, "begin": 5480292, "headersEnd": 5480437, "body": { "mimeType": "text/plain", + "lineNumber": 77312, "begin": 5480292, "headersEnd": 5480437, "end": 5480904, @@ -4111,8 +4485,7 @@ "lines": 10 }, "end": 5480904, - "octets": 467, - "lines": 10 + "octets": 467 }, "end": 5480904, "octets": 612, @@ -4120,13 +4493,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77328, "begin": 5480936, "headersEnd": 5480937, "message": { + "lineNumber": 77329, "begin": 5480937, "headersEnd": 5481070, "body": { "mimeType": "text/plain", + "lineNumber": 77329, "begin": 5480937, "headersEnd": 5481070, "end": 5481349, @@ -4134,8 +4510,7 @@ "lines": 10 }, "end": 5481349, - "octets": 279, - "lines": 10 + "octets": 279 }, "end": 5481349, "octets": 412, @@ -4143,13 +4518,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77345, "begin": 5481381, "headersEnd": 5481382, "message": { + "lineNumber": 77346, "begin": 5481382, "headersEnd": 5481507, "body": { "mimeType": "text/plain", + "lineNumber": 77346, "begin": 5481382, "headersEnd": 5481507, "end": 5481789, @@ -4157,8 +4535,7 @@ "lines": 4 }, "end": 5481789, - "octets": 282, - "lines": 4 + "octets": 282 }, "end": 5481789, "octets": 407, @@ -4166,13 +4543,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77356, "begin": 5481821, "headersEnd": 5481822, "message": { + "lineNumber": 77357, "begin": 5481822, "headersEnd": 5481943, "body": { "mimeType": "text/plain", + "lineNumber": 77357, "begin": 5481822, "headersEnd": 5481943, "end": 5482586, @@ -4180,8 +4560,7 @@ "lines": 27 }, "end": 5482586, - "octets": 643, - "lines": 27 + "octets": 643 }, "end": 5482586, "octets": 764, @@ -4189,13 +4568,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77390, "begin": 5482618, "headersEnd": 5482619, "message": { + "lineNumber": 77391, "begin": 5482619, "headersEnd": 5482763, "body": { "mimeType": "text/plain", + "lineNumber": 77391, "begin": 5482619, "headersEnd": 5482763, "end": 5485021, @@ -4203,8 +4585,7 @@ "lines": 46 }, "end": 5485021, - "octets": 2258, - "lines": 46 + "octets": 2258 }, "end": 5485021, "octets": 2402, @@ -4212,13 +4593,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77443, "begin": 5485053, "headersEnd": 5485054, "message": { + "lineNumber": 77444, "begin": 5485054, "headersEnd": 5485176, "body": { "mimeType": "text/plain", + "lineNumber": 77444, "begin": 5485054, "headersEnd": 5485176, "end": 5485968, @@ -4226,8 +4610,7 @@ "lines": 17 }, "end": 5485968, - "octets": 792, - "lines": 17 + "octets": 792 }, "end": 5485968, "octets": 914, @@ -4235,13 +4618,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77467, "begin": 5486000, "headersEnd": 5486001, "message": { + "lineNumber": 77468, "begin": 5486001, "headersEnd": 5486095, "body": { "mimeType": "text/plain", + "lineNumber": 77468, "begin": 5486001, "headersEnd": 5486095, "end": 5486321, @@ -4249,8 +4635,7 @@ "lines": 10 }, "end": 5486321, - "octets": 226, - "lines": 10 + "octets": 226 }, "end": 5486321, "octets": 320, @@ -4258,13 +4643,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77484, "begin": 5486353, "headersEnd": 5486354, "message": { + "lineNumber": 77485, "begin": 5486354, "headersEnd": 5486475, "body": { "mimeType": "text/plain", + "lineNumber": 77485, "begin": 5486354, "headersEnd": 5486475, "end": 5487143, @@ -4272,8 +4660,7 @@ "lines": 20 }, "end": 5487143, - "octets": 668, - "lines": 20 + "octets": 668 }, "end": 5487143, "octets": 789, @@ -4281,13 +4668,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77511, "begin": 5487175, "headersEnd": 5487176, "message": { + "lineNumber": 77512, "begin": 5487176, "headersEnd": 5487286, "body": { "mimeType": "text/plain", + "lineNumber": 77512, "begin": 5487176, "headersEnd": 5487286, "end": 5489833, @@ -4295,8 +4685,7 @@ "lines": 68 }, "end": 5489833, - "octets": 2547, - "lines": 68 + "octets": 2547 }, "end": 5489833, "octets": 2657, @@ -4304,13 +4693,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77586, "begin": 5489865, "headersEnd": 5489866, "message": { + "lineNumber": 77587, "begin": 5489866, "headersEnd": 5489972, "body": { "mimeType": "text/plain", + "lineNumber": 77587, "begin": 5489866, "headersEnd": 5489972, "end": 5491181, @@ -4318,8 +4710,7 @@ "lines": 34 }, "end": 5491181, - "octets": 1209, - "lines": 34 + "octets": 1209 }, "end": 5491181, "octets": 1315, @@ -4327,13 +4718,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77627, "begin": 5491213, "headersEnd": 5491214, "message": { + "lineNumber": 77628, "begin": 5491214, "headersEnd": 5491320, "body": { "mimeType": "text/plain", + "lineNumber": 77628, "begin": 5491214, "headersEnd": 5491320, "end": 5493117, @@ -4341,8 +4735,7 @@ "lines": 43 }, "end": 5493117, - "octets": 1797, - "lines": 43 + "octets": 1797 }, "end": 5493117, "octets": 1903, @@ -4350,13 +4743,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77677, "begin": 5493149, "headersEnd": 5493150, "message": { + "lineNumber": 77678, "begin": 5493150, "headersEnd": 5493279, "body": { "mimeType": "text/plain", + "lineNumber": 77678, "begin": 5493150, "headersEnd": 5493279, "end": 5493849, @@ -4364,8 +4760,7 @@ "lines": 12 }, "end": 5493849, - "octets": 570, - "lines": 12 + "octets": 570 }, "end": 5493849, "octets": 699, @@ -4373,13 +4768,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77696, "begin": 5493881, "headersEnd": 5493882, "message": { + "lineNumber": 77697, "begin": 5493882, "headersEnd": 5493970, "body": { "mimeType": "text/plain", + "lineNumber": 77697, "begin": 5493882, "headersEnd": 5493970, "end": 5495304, @@ -4387,8 +4785,7 @@ "lines": 20 }, "end": 5495304, - "octets": 1334, - "lines": 20 + "octets": 1334 }, "end": 5495304, "octets": 1422, @@ -4396,13 +4793,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77723, "begin": 5495336, "headersEnd": 5495337, "message": { + "lineNumber": 77724, "begin": 5495337, "headersEnd": 5495453, "body": { "mimeType": "text/plain", + "lineNumber": 77724, "begin": 5495337, "headersEnd": 5495453, "end": 5497580, @@ -4410,8 +4810,7 @@ "lines": 49 }, "end": 5497580, - "octets": 2127, - "lines": 49 + "octets": 2127 }, "end": 5497580, "octets": 2243, @@ -4419,13 +4818,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77779, "begin": 5497612, "headersEnd": 5497613, "message": { + "lineNumber": 77780, "begin": 5497613, "headersEnd": 5497734, "body": { "mimeType": "text/plain", + "lineNumber": 77780, "begin": 5497613, "headersEnd": 5497734, "end": 5499755, @@ -4433,8 +4835,7 @@ "lines": 42 }, "end": 5499755, - "octets": 2021, - "lines": 42 + "octets": 2021 }, "end": 5499755, "octets": 2142, @@ -4442,13 +4843,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77828, "begin": 5499787, "headersEnd": 5499788, "message": { + "lineNumber": 77829, "begin": 5499788, "headersEnd": 5499909, "body": { "mimeType": "text/plain", + "lineNumber": 77829, "begin": 5499788, "headersEnd": 5499909, "end": 5500586, @@ -4456,8 +4860,7 @@ "lines": 19 }, "end": 5500586, - "octets": 677, - "lines": 19 + "octets": 677 }, "end": 5500586, "octets": 798, @@ -4465,13 +4868,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77854, "begin": 5500618, "headersEnd": 5500619, "message": { + "lineNumber": 77855, "begin": 5500619, "headersEnd": 5500756, "body": { "mimeType": "text/plain", + "lineNumber": 77855, "begin": 5500619, "headersEnd": 5500756, "end": 5501576, @@ -4479,8 +4885,7 @@ "lines": 16 }, "end": 5501576, - "octets": 820, - "lines": 16 + "octets": 820 }, "end": 5501576, "octets": 957, @@ -4488,13 +4893,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77877, "begin": 5501608, "headersEnd": 5501609, "message": { + "lineNumber": 77878, "begin": 5501609, "headersEnd": 5501733, "body": { "mimeType": "text/plain", + "lineNumber": 77878, "begin": 5501609, "headersEnd": 5501733, "end": 5502457, @@ -4502,8 +4910,7 @@ "lines": 21 }, "end": 5502457, - "octets": 724, - "lines": 21 + "octets": 724 }, "end": 5502457, "octets": 848, @@ -4511,13 +4918,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77905, "begin": 5502489, "headersEnd": 5502490, "message": { + "lineNumber": 77906, "begin": 5502490, "headersEnd": 5502592, "body": { "mimeType": "text/plain", + "lineNumber": 77906, "begin": 5502490, "headersEnd": 5502592, "end": 5503332, @@ -4525,8 +4935,7 @@ "lines": 16 }, "end": 5503332, - "octets": 740, - "lines": 16 + "octets": 740 }, "end": 5503332, "octets": 842, @@ -4534,13 +4943,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77928, "begin": 5503364, "headersEnd": 5503365, "message": { + "lineNumber": 77929, "begin": 5503365, "headersEnd": 5503521, "body": { "mimeType": "text/plain", + "lineNumber": 77929, "begin": 5503365, "headersEnd": 5503521, "end": 5503880, @@ -4548,8 +4960,7 @@ "lines": 7 }, "end": 5503880, - "octets": 359, - "lines": 7 + "octets": 359 }, "end": 5503880, "octets": 515, @@ -4557,13 +4968,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77943, "begin": 5503912, "headersEnd": 5503913, "message": { + "lineNumber": 77944, "begin": 5503913, "headersEnd": 5504000, "body": { "mimeType": "text/plain", + "lineNumber": 77944, "begin": 5503913, "headersEnd": 5504000, "end": 5504635, @@ -4571,8 +4985,7 @@ "lines": 15 }, "end": 5504635, - "octets": 635, - "lines": 15 + "octets": 635 }, "end": 5504635, "octets": 722, @@ -4580,13 +4993,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77965, "begin": 5504667, "headersEnd": 5504668, "message": { + "lineNumber": 77966, "begin": 5504668, "headersEnd": 5504817, "body": { "mimeType": "text/plain", + "lineNumber": 77966, "begin": 5504668, "headersEnd": 5504817, "end": 5505183, @@ -4594,8 +5010,7 @@ "lines": 17 }, "end": 5505183, - "octets": 366, - "lines": 17 + "octets": 366 }, "end": 5505183, "octets": 515, @@ -4603,13 +5018,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 77989, "begin": 5505215, "headersEnd": 5505216, "message": { + "lineNumber": 77990, "begin": 5505216, "headersEnd": 5505317, "body": { "mimeType": "text/plain", + "lineNumber": 77990, "begin": 5505216, "headersEnd": 5505317, "end": 5505605, @@ -4617,8 +5035,7 @@ "lines": 6 }, "end": 5505605, - "octets": 288, - "lines": 6 + "octets": 288 }, "end": 5505605, "octets": 389, @@ -4626,13 +5043,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78002, "begin": 5505637, "headersEnd": 5505638, "message": { + "lineNumber": 78003, "begin": 5505638, "headersEnd": 5505766, "body": { "mimeType": "text/plain", + "lineNumber": 78003, "begin": 5505638, "headersEnd": 5505766, "end": 5506245, @@ -4640,8 +5060,7 @@ "lines": 16 }, "end": 5506245, - "octets": 479, - "lines": 16 + "octets": 479 }, "end": 5506245, "octets": 607, @@ -4649,13 +5068,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78025, "begin": 5506277, "headersEnd": 5506278, "message": { + "lineNumber": 78026, "begin": 5506278, "headersEnd": 5506375, "body": { "mimeType": "text/plain", + "lineNumber": 78026, "begin": 5506278, "headersEnd": 5506375, "end": 5506755, @@ -4663,8 +5085,7 @@ "lines": 19 }, "end": 5506755, - "octets": 380, - "lines": 19 + "octets": 380 }, "end": 5506755, "octets": 477, @@ -4672,13 +5093,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78051, "begin": 5506787, "headersEnd": 5506788, "message": { + "lineNumber": 78052, "begin": 5506788, "headersEnd": 5506903, "body": { "mimeType": "text/plain", + "lineNumber": 78052, "begin": 5506788, "headersEnd": 5506903, "end": 5508222, @@ -4686,8 +5110,7 @@ "lines": 26 }, "end": 5508222, - "octets": 1319, - "lines": 26 + "octets": 1319 }, "end": 5508222, "octets": 1434, @@ -4695,13 +5118,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78084, "begin": 5508254, "headersEnd": 5508255, "message": { + "lineNumber": 78085, "begin": 5508255, "headersEnd": 5508355, "body": { "mimeType": "text/plain", + "lineNumber": 78085, "begin": 5508255, "headersEnd": 5508355, "end": 5508650, @@ -4709,8 +5135,7 @@ "lines": 9 }, "end": 5508650, - "octets": 295, - "lines": 9 + "octets": 295 }, "end": 5508650, "octets": 395, @@ -4718,13 +5143,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 78100, "begin": 5508682, "headersEnd": 5508683, "message": { + "lineNumber": 78101, "begin": 5508683, "headersEnd": 5508826, "body": { "mimeType": "text/plain", + "lineNumber": 78101, "begin": 5508683, "headersEnd": 5508826, "end": 5509845, @@ -4732,8 +5160,7 @@ "lines": 36 }, "end": 5509845, - "octets": 1019, - "lines": 36 + "octets": 1019 }, "end": 5509845, "octets": 1162, @@ -4750,16 +5177,17 @@ "lines": 1958 }, "end": 5509954, - "octets": 68781, - "lines": 1958 + "octets": 68781 }, { "mboxMarkerBegin": 5509955, "mboxMarkerLength": 7, + "lineNumber": 78149, "begin": 5509963, "headersEnd": 5510771, "body": { "mimeType": "text/plain", + "lineNumber": 78149, "begin": 5509963, "headersEnd": 5510771, "end": 5512642, @@ -4767,21 +5195,23 @@ "lines": 49 }, "end": 5512642, - "octets": 1871, - "lines": 49 + "octets": 1871 }, { "mboxMarkerBegin": 5512643, "mboxMarkerLength": 7, + "lineNumber": 78214, "begin": 5512651, "headersEnd": 5513378, "body": { "mimeType": "multipart/mixed", + "lineNumber": 78214, "begin": 5512651, "headersEnd": 5513378, "children": [ { "mimeType": "text/plain", + "lineNumber": 78231, "begin": 5513405, "headersEnd": 5513406, "end": 5513518, @@ -4790,6 +5220,7 @@ }, { "mimeType": "application/x-annotate", + "lineNumber": 78235, "begin": 5513546, "headersEnd": 5513635, "end": 5644327, @@ -4798,6 +5229,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 80251, "begin": 5644355, "headersEnd": 5644356, "end": 5644411, @@ -4806,6 +5238,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 80255, "begin": 5644439, "headersEnd": 5644584, "end": 5659481, @@ -4814,6 +5247,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 80339, "begin": 5659509, "headersEnd": 5659510, "end": 5659600, @@ -4822,6 +5256,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 80347, "begin": 5659628, "headersEnd": 5659773, "end": 5667874, @@ -4830,6 +5265,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 80395, "begin": 5667902, "headersEnd": 5667903, "end": 5667977, @@ -4842,16 +5278,17 @@ "lines": 2171 }, "end": 5668007, - "octets": 154629, - "lines": 2171 + "octets": 154629 }, { "mboxMarkerBegin": 5668008, "mboxMarkerLength": 7, + "lineNumber": 80403, "begin": 5668016, "headersEnd": 5668539, "body": { "mimeType": "text/richtext", + "lineNumber": 80403, "begin": 5668016, "headersEnd": 5668539, "end": 5669107, @@ -4859,21 +5296,23 @@ "lines": 21 }, "end": 5669107, - "octets": 568, - "lines": 21 + "octets": 568 }, { "mboxMarkerBegin": 5669108, "mboxMarkerLength": 7, + "lineNumber": 80441, "begin": 5669116, "headersEnd": 5670302, "body": { "mimeType": "multipart/alternative", + "lineNumber": 80441, "begin": 5669116, "headersEnd": 5670302, "children": [ { "mimeType": "text/plain", + "lineNumber": 80468, "begin": 5670497, "headersEnd": 5670541, "end": 5671271, @@ -4882,11 +5321,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 80498, "begin": 5671312, "headersEnd": 5671397, "children": [ { "mimeType": "text/richtext", + "lineNumber": 80502, "begin": 5671439, "headersEnd": 5671530, "end": 5672332, @@ -4895,6 +5336,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 80532, "begin": 5672375, "headersEnd": 5672468, "end": 5730339, @@ -4903,6 +5345,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 81293, "begin": 5730382, "headersEnd": 5730473, "end": 5730478, @@ -4920,21 +5363,23 @@ "lines": 837 }, "end": 5730566, - "octets": 60264, - "lines": 837 + "octets": 60264 }, { "mboxMarkerBegin": 5730567, "mboxMarkerLength": 7, + "lineNumber": 81303, "begin": 5730575, "headersEnd": 5731315, "body": { "mimeType": "multipart/mixed", + "lineNumber": 81303, "begin": 5730575, "headersEnd": 5731315, "children": [ { "mimeType": "text/plain", + "lineNumber": 81322, "begin": 5731365, "headersEnd": 5731455, "end": 5731629, @@ -4943,6 +5388,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 81334, "begin": 5731679, "headersEnd": 5731738, "end": 5786986, @@ -4955,16 +5401,17 @@ "lines": 775 }, "end": 5787038, - "octets": 55723, - "lines": 775 + "octets": 55723 }, { "mboxMarkerBegin": 5787039, "mboxMarkerLength": 31, + "lineNumber": 82097, "begin": 5787071, "headersEnd": 5788538, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 82097, "begin": 5787071, "headersEnd": 5788538, "end": 5789878, @@ -4972,21 +5419,23 @@ "lines": 34 }, "end": 5789878, - "octets": 1340, - "lines": 34 + "octets": 1340 }, { "mboxMarkerBegin": 5789879, "mboxMarkerLength": 7, + "lineNumber": 82163, "begin": 5789887, "headersEnd": 5790681, "body": { "mimeType": "multipart/mixed", + "lineNumber": 82163, "begin": 5789887, "headersEnd": 5790681, "children": [ { "mimeType": "text/plain", + "lineNumber": 82180, "begin": 5790752, "headersEnd": 5790828, "end": 5791198, @@ -4995,13 +5444,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 82198, "begin": 5791224, "headersEnd": 5791314, "message": { + "lineNumber": 82202, "begin": 5791314, "headersEnd": 5792382, "body": { "mimeType": "text/html", + "lineNumber": 82202, "begin": 5791314, "headersEnd": 5792382, "end": 5816777, @@ -5009,8 +5461,7 @@ "lines": 463 }, "end": 5816777, - "octets": 24395, - "lines": 463 + "octets": 24395 }, "end": 5816777, "octets": 25463, @@ -5022,21 +5473,23 @@ "lines": 504 }, "end": 5816805, - "octets": 26124, - "lines": 504 + "octets": 26124 }, { "mboxMarkerBegin": 5816806, "mboxMarkerLength": 7, + "lineNumber": 82683, "begin": 5816814, "headersEnd": 5817482, "body": { "mimeType": "multipart/mixed", + "lineNumber": 82683, "begin": 5816814, "headersEnd": 5817482, "children": [ { "mimeType": "text/plain", + "lineNumber": 82700, "begin": 5817576, "headersEnd": 5817654, "end": 5817688, @@ -5045,6 +5498,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 82706, "begin": 5817737, "headersEnd": 5817796, "end": 5839947, @@ -5057,21 +5511,23 @@ "lines": 317 }, "end": 5839997, - "octets": 22515, - "lines": 317 + "octets": 22515 }, { "mboxMarkerBegin": 5839998, "mboxMarkerLength": 31, + "lineNumber": 83015, "begin": 5840030, "headersEnd": 5840554, "body": { "mimeType": "multipart/mixed", + "lineNumber": 83015, "begin": 5840030, "headersEnd": 5840554, "children": [ { "mimeType": "text/plain", + "lineNumber": 83029, "begin": 5840562, "headersEnd": 5840606, "end": 5841778, @@ -5080,6 +5536,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 83054, "begin": 5841787, "headersEnd": 5841913, "end": 5842059, @@ -5088,6 +5545,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 83062, "begin": 5842068, "headersEnd": 5842184, "end": 5842378, @@ -5100,16 +5558,17 @@ "lines": 42 }, "end": 5842388, - "octets": 1834, - "lines": 42 + "octets": 1834 }, { "mboxMarkerBegin": 5842389, "mboxMarkerLength": 7, + "lineNumber": 83071, "begin": 5842397, "headersEnd": 5843191, "body": { "mimeType": "audio/basic", + "lineNumber": 83071, "begin": 5842397, "headersEnd": 5843191, "end": 6099969, @@ -5117,21 +5576,23 @@ "lines": 3518 }, "end": 6099969, - "octets": 256778, - "lines": 3518 + "octets": 256778 }, { "mboxMarkerBegin": 6099970, "mboxMarkerLength": 7, + "lineNumber": 86609, "begin": 6099978, "headersEnd": 6100830, "body": { "mimeType": "multipart/mixed", + "lineNumber": 86609, "begin": 6099978, "headersEnd": 6100830, "children": [ { "mimeType": "text/plain", + "lineNumber": 86630, "begin": 6100845, "headersEnd": 6100922, "end": 6101112, @@ -5140,6 +5601,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 86643, "begin": 6101127, "headersEnd": 6101231, "end": 6199478, @@ -5152,21 +5614,23 @@ "lines": 1296 }, "end": 6199495, - "octets": 98665, - "lines": 1296 + "octets": 98665 }, { "mboxMarkerBegin": 6199496, "mboxMarkerLength": 7, + "lineNumber": 87926, "begin": 6199504, "headersEnd": 6200381, "body": { "mimeType": "multipart/mixed", + "lineNumber": 87926, "begin": 6199504, "headersEnd": 6200381, "children": [ { "mimeType": "text/plain", + "lineNumber": 87946, "begin": 6200390, "headersEnd": 6200436, "end": 6201379, @@ -5175,21 +5639,25 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 87971, "begin": 6201389, "headersEnd": 6201452, "children": [ { "mimeType": "multipart/mixed", + "lineNumber": 87975, "begin": 6201475, "headersEnd": 6201836, "children": [ { "mimeType": "multipart/mixed", + "lineNumber": 87984, "begin": 6201858, "headersEnd": 6201960, "children": [ { "mimeType": "text/richtext", + "lineNumber": 87988, "begin": 6201982, "headersEnd": 6202105, "end": 6202471, @@ -5198,6 +5666,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 88002, "begin": 6202494, "headersEnd": 6202616, "end": 6203008, @@ -5206,6 +5675,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 88018, "begin": 6203031, "headersEnd": 6203156, "end": 6203864, @@ -5219,11 +5689,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 88044, "begin": 6203912, "headersEnd": 6204011, "children": [ { "mimeType": "text/richtext", + "lineNumber": 88048, "begin": 6204033, "headersEnd": 6204165, "end": 6220580, @@ -5232,6 +5704,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 88524, "begin": 6220603, "headersEnd": 6220734, "end": 6234988, @@ -5240,11 +5713,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 88925, "begin": 6235011, "headersEnd": 6235112, "children": [ { "mimeType": "text/richtext", + "lineNumber": 88929, "begin": 6235134, "headersEnd": 6235276, "end": 6241428, @@ -5253,6 +5728,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89099, "begin": 6241451, "headersEnd": 6241578, "end": 6246833, @@ -5261,6 +5737,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89265, "begin": 6246856, "headersEnd": 6246993, "end": 6254291, @@ -5269,6 +5746,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89468, "begin": 6254314, "headersEnd": 6254438, "end": 6260914, @@ -5277,6 +5755,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 89658, "begin": 6260937, "headersEnd": 6261074, "end": 6278242, @@ -5290,11 +5769,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 90158, "begin": 6278290, "headersEnd": 6278385, "children": [ { "mimeType": "text/richtext", + "lineNumber": 90162, "begin": 6278407, "headersEnd": 6278541, "end": 6279036, @@ -5313,11 +5794,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 90193, "begin": 6279109, "headersEnd": 6279220, "children": [ { "mimeType": "text/richtext", + "lineNumber": 90197, "begin": 6279242, "headersEnd": 6279380, "end": 6280529, @@ -5326,6 +5809,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 90232, "begin": 6280552, "headersEnd": 6280678, "end": 6281898, @@ -5334,6 +5818,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 90273, "begin": 6281921, "headersEnd": 6282061, "end": 6282738, @@ -5361,16 +5846,17 @@ "lines": 2362 }, "end": 6282825, - "octets": 82444, - "lines": 2362 + "octets": 82444 }, { "mboxMarkerBegin": 6282826, "mboxMarkerLength": 7, + "lineNumber": 90309, "begin": 6282834, "headersEnd": 6283636, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 90309, "begin": 6282834, "headersEnd": 6283636, "end": 6292835, @@ -5378,21 +5864,23 @@ "lines": 226 }, "end": 6292835, - "octets": 9199, - "lines": 226 + "octets": 9199 }, { "mboxMarkerBegin": 6292836, "mboxMarkerLength": 7, + "lineNumber": 90554, "begin": 6292844, "headersEnd": 6293572, "body": { "mimeType": "multipart/alternative", + "lineNumber": 90554, "begin": 6292844, "headersEnd": 6293572, "children": [ { "mimeType": "text/plain", + "lineNumber": 90574, "begin": 6293767, "headersEnd": 6293811, "end": 6294567, @@ -5401,11 +5889,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 90601, "begin": 6294608, "headersEnd": 6294693, "children": [ { "mimeType": "text/richtext", + "lineNumber": 90605, "begin": 6294735, "headersEnd": 6294826, "end": 6295153, @@ -5414,6 +5904,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 90617, "begin": 6295196, "headersEnd": 6295290, "end": 6317314, @@ -5422,6 +5913,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 90943, "begin": 6317357, "headersEnd": 6317448, "end": 6317614, @@ -5430,6 +5922,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 90953, "begin": 6317657, "headersEnd": 6317754, "end": 6364967, @@ -5438,6 +5931,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 91644, "begin": 6365010, "headersEnd": 6365101, "end": 6365171, @@ -5446,6 +5940,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 91651, "begin": 6365214, "headersEnd": 6365304, "end": 6385522, @@ -5454,6 +5949,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 91951, "begin": 6385565, "headersEnd": 6385656, "end": 6385760, @@ -5471,21 +5967,23 @@ "lines": 1396 }, "end": 6385847, - "octets": 92275, - "lines": 1396 + "octets": 92275 }, { "mboxMarkerBegin": 6385848, "mboxMarkerLength": 7, + "lineNumber": 91967, "begin": 6385856, "headersEnd": 6386610, "body": { "mimeType": "multipart/mixed", + "lineNumber": 91967, "begin": 6385856, "headersEnd": 6386610, "children": [ { "mimeType": "text/richtext", + "lineNumber": 91989, "begin": 6386850, "headersEnd": 6386923, "end": 6387343, @@ -5494,6 +5992,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 92007, "begin": 6387389, "headersEnd": 6387450, "end": 6421014, @@ -5502,6 +6001,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 92472, "begin": 6421060, "headersEnd": 6421133, "end": 6421227, @@ -5514,16 +6014,17 @@ "lines": 500 }, "end": 6421275, - "octets": 34665, - "lines": 500 + "octets": 34665 }, { "mboxMarkerBegin": 6421276, "mboxMarkerLength": 41, + "lineNumber": 92486, "begin": 6421318, "headersEnd": 6421466, "body": { "mimeType": "text/plain", + "lineNumber": 92486, "begin": 6421318, "headersEnd": 6421466, "end": 6464495, @@ -5531,26 +6032,29 @@ "lines": 693 }, "end": 6464495, - "octets": 43029, - "lines": 693 + "octets": 43029 }, { "mboxMarkerBegin": 6464496, "mboxMarkerLength": 31, + "lineNumber": 93187, "begin": 6464528, "headersEnd": 6465111, "body": { "mimeType": "multipart/mixed", + "lineNumber": 93187, "begin": 6464528, "headersEnd": 6465111, "children": [ { "mimeType": "multipart/alternative", + "lineNumber": 93205, "begin": 6465196, "headersEnd": 6465314, "children": [ { "mimeType": "text/plain", + "lineNumber": 93210, "begin": 6465354, "headersEnd": 6465432, "end": 6466704, @@ -5559,6 +6063,7 @@ }, { "mimeType": "text/html", + "lineNumber": 93253, "begin": 6466744, "headersEnd": 6466823, "end": 6469287, @@ -5572,6 +6077,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 93293, "begin": 6469370, "headersEnd": 6469575, "end": 6490325, @@ -5584,21 +6090,23 @@ "lines": 368 }, "end": 6490367, - "octets": 25256, - "lines": 368 + "octets": 25256 }, { "mboxMarkerBegin": 6490368, "mboxMarkerLength": 31, + "lineNumber": 93572, "begin": 6490400, "headersEnd": 6490806, "body": { "mimeType": "multipart/mixed", + "lineNumber": 93572, "begin": 6490400, "headersEnd": 6490806, "children": [ { "mimeType": "text/plain", + "lineNumber": 93586, "begin": 6490872, "headersEnd": 6490873, "end": 6490936, @@ -5607,11 +6115,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93590, "begin": 6490957, "headersEnd": 6491031, "children": [ { "mimeType": "text/plain", + "lineNumber": 93593, "begin": 6491058, "headersEnd": 6491164, "end": 6491244, @@ -5620,6 +6130,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 93602, "begin": 6491272, "headersEnd": 6491381, "end": 6491539, @@ -5628,6 +6139,7 @@ }, { "mimeType": "text/enriched", + "lineNumber": 93612, "begin": 6491567, "headersEnd": 6491676, "end": 6491839, @@ -5636,6 +6148,7 @@ }, { "mimeType": "text/html", + "lineNumber": 93628, "begin": 6491867, "headersEnd": 6491972, "end": 6492133, @@ -5644,6 +6157,7 @@ }, { "mimeType": "text/something-you-dont-know", + "lineNumber": 93637, "begin": 6492161, "headersEnd": 6492285, "end": 6492712, @@ -5657,6 +6171,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 93650, "begin": 6492762, "headersEnd": 6492763, "end": 6492928, @@ -5665,11 +6180,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93657, "begin": 6492949, "headersEnd": 6492999, "children": [ { "mimeType": "text/plain", + "lineNumber": 93660, "begin": 6493004, "headersEnd": 6493030, "end": 6493083, @@ -5678,11 +6195,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93665, "begin": 6493089, "headersEnd": 6493139, "children": [ { "mimeType": "text/plain", + "lineNumber": 93668, "begin": 6493144, "headersEnd": 6493170, "end": 6493223, @@ -5691,6 +6210,7 @@ }, { "mimeType": "text/html", + "lineNumber": 93673, "begin": 6493229, "headersEnd": 6493254, "end": 6493304, @@ -5699,6 +6219,7 @@ }, { "mimeType": "text/x-barf", + "lineNumber": 93678, "begin": 6493310, "headersEnd": 6493337, "end": 6493391, @@ -5712,6 +6233,7 @@ }, { "mimeType": "application/spankme", + "lineNumber": 93685, "begin": 6493405, "headersEnd": 6493497, "end": 6493512, @@ -5725,6 +6247,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 93692, "begin": 6493540, "headersEnd": 6493541, "end": 6493550, @@ -5737,21 +6260,23 @@ "lines": 113 }, "end": 6493572, - "octets": 2766, - "lines": 113 + "octets": 2766 }, { "mboxMarkerBegin": 6493573, "mboxMarkerLength": 31, + "lineNumber": 93697, "begin": 6493605, "headersEnd": 6494009, "body": { "mimeType": "multipart/mixed", + "lineNumber": 93697, "begin": 6493605, "headersEnd": 6494009, "children": [ { "mimeType": "text/plain", + "lineNumber": 93711, "begin": 6494075, "headersEnd": 6494076, "end": 6494143, @@ -5760,11 +6285,13 @@ }, { "mimeType": "multipart/alternative", + "lineNumber": 93715, "begin": 6494164, "headersEnd": 6494238, "children": [ { "mimeType": "text/plain", + "lineNumber": 93718, "begin": 6494265, "headersEnd": 6494421, "end": 6549684, @@ -5773,6 +6300,7 @@ }, { "mimeType": "text/html", + "lineNumber": 95327, "begin": 6549712, "headersEnd": 6549867, "end": 6655916, @@ -5781,6 +6309,7 @@ }, { "mimeType": "application/postscript", + "lineNumber": 98315, "begin": 6655944, "headersEnd": 6656090, "end": 6844449, @@ -5798,21 +6327,23 @@ "lines": 17726 }, "end": 6844507, - "octets": 350498, - "lines": 17726 + "octets": 350498 }, { "mboxMarkerBegin": 6844508, "mboxMarkerLength": 7, + "lineNumber": 111435, "begin": 6844516, "headersEnd": 6845120, "body": { "mimeType": "MULTIPART/MIXED", + "lineNumber": 111435, "begin": 6844516, "headersEnd": 6845120, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 111453, "begin": 6845376, "headersEnd": 6845488, "end": 6845488, @@ -5821,13 +6352,16 @@ }, { "mimeType": "MESSAGE/RFC822", + "lineNumber": 111458, "begin": 6845529, "headersEnd": 6845627, "message": { + "lineNumber": 111461, "begin": 6845627, "headersEnd": 6846168, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 111461, "begin": 6845627, "headersEnd": 6846168, "end": 6846514, @@ -5835,8 +6369,7 @@ "lines": 16 }, "end": 6846514, - "octets": 346, - "lines": 16 + "octets": 346 }, "end": 6846514, "octets": 887, @@ -5848,21 +6381,23 @@ "lines": 43 }, "end": 6846556, - "octets": 1436, - "lines": 43 + "octets": 1436 }, { "mboxMarkerBegin": 6846557, "mboxMarkerLength": 7, + "lineNumber": 111492, "begin": 6846565, "headersEnd": 6846861, "body": { "mimeType": "multipart/related", + "lineNumber": 111492, "begin": 6846565, "headersEnd": 6846861, "children": [ { "mimeType": "text/html", + "lineNumber": 111502, "begin": 6846900, "headersEnd": 6847146, "end": 6847865, @@ -5871,6 +6406,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 111541, "begin": 6847905, "headersEnd": 6848225, "end": 6858948, @@ -5883,21 +6419,23 @@ "lines": 197 }, "end": 6858989, - "octets": 12128, - "lines": 197 + "octets": 12128 }, { "mboxMarkerBegin": 6858990, "mboxMarkerLength": 7, + "lineNumber": 111699, "begin": 6858998, "headersEnd": 6859294, "body": { "mimeType": "multipart/related", + "lineNumber": 111699, "begin": 6858998, "headersEnd": 6859294, "children": [ { "mimeType": "text/html", + "lineNumber": 111709, "begin": 6859333, "headersEnd": 6859579, "end": 6860297, @@ -5906,6 +6444,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 111748, "begin": 6860337, "headersEnd": 6860626, "end": 6871349, @@ -5918,21 +6457,23 @@ "lines": 197 }, "end": 6871390, - "octets": 12096, - "lines": 197 + "octets": 12096 }, { "mboxMarkerBegin": 6871391, "mboxMarkerLength": 31, + "lineNumber": 111906, "begin": 6871423, "headersEnd": 6872926, "body": { "mimeType": "multipart/related", + "lineNumber": 111906, "begin": 6871423, "headersEnd": 6872926, "children": [ { "mimeType": "text/html", + "lineNumber": 111934, "begin": 6872971, "headersEnd": 6873062, "end": 6878261, @@ -5941,6 +6482,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112050, "begin": 6878306, "headersEnd": 6878505, "end": 6879434, @@ -5953,21 +6495,23 @@ "lines": 139 }, "end": 6879481, - "octets": 6555, - "lines": 139 + "octets": 6555 }, { "mboxMarkerBegin": 6879482, "mboxMarkerLength": 31, + "lineNumber": 112073, "begin": 6879514, "headersEnd": 6879961, "body": { "mimeType": "multipart/mixed", + "lineNumber": 112073, "begin": 6879514, "headersEnd": 6879961, "children": [ { "mimeType": "text/plain", + "lineNumber": 112086, "begin": 6880000, "headersEnd": 6880026, "end": 6880273, @@ -5976,11 +6520,13 @@ }, { "mimeType": "multipart/related", + "lineNumber": 112096, "begin": 6880313, "headersEnd": 6880399, "children": [ { "mimeType": "text/html", + "lineNumber": 112100, "begin": 6880438, "headersEnd": 6880632, "end": 6887780, @@ -5989,6 +6535,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112286, "begin": 6887820, "headersEnd": 6887996, "end": 6895977, @@ -5997,6 +6544,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112402, "begin": 6896017, "headersEnd": 6896176, "end": 6903630, @@ -6005,6 +6553,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112511, "begin": 6903670, "headersEnd": 6903828, "end": 6907161, @@ -6013,6 +6562,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112563, "begin": 6907201, "headersEnd": 6907360, "end": 6915811, @@ -6021,6 +6571,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 112685, "begin": 6915851, "headersEnd": 6916007, "end": 7020376, @@ -6029,6 +6580,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 114121, "begin": 7020416, "headersEnd": 7020575, "end": 7058936, @@ -6037,6 +6589,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 114653, "begin": 7058976, "headersEnd": 7059140, "end": 7094455, @@ -6054,21 +6607,23 @@ "lines": 3059 }, "end": 7094537, - "octets": 214576, - "lines": 3059 + "octets": 214576 }, { "mboxMarkerBegin": 7094538, "mboxMarkerLength": 7, + "lineNumber": 115145, "begin": 7094546, "headersEnd": 7094841, "body": { "mimeType": "multipart/related", + "lineNumber": 115145, "begin": 7094546, "headersEnd": 7094841, "children": [ { "mimeType": "text/html", + "lineNumber": 115155, "begin": 7094880, "headersEnd": 7095036, "end": 7095587, @@ -6077,6 +6632,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115189, "begin": 7095627, "headersEnd": 7095740, "end": 7106463, @@ -6089,21 +6645,23 @@ "lines": 188 }, "end": 7106504, - "octets": 11663, - "lines": 188 + "octets": 11663 }, { "mboxMarkerBegin": 7106505, "mboxMarkerLength": 7, + "lineNumber": 115343, "begin": 7106513, "headersEnd": 7106808, "body": { "mimeType": "multipart/related", + "lineNumber": 115343, "begin": 7106513, "headersEnd": 7106808, "children": [ { "mimeType": "text/html", + "lineNumber": 115353, "begin": 7106847, "headersEnd": 7107059, "end": 7107656, @@ -6112,6 +6670,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115389, "begin": 7107696, "headersEnd": 7107970, "end": 7118693, @@ -6124,21 +6683,23 @@ "lines": 193 }, "end": 7118734, - "octets": 11926, - "lines": 193 + "octets": 11926 }, { "mboxMarkerBegin": 7118735, "mboxMarkerLength": 7, + "lineNumber": 115546, "begin": 7118743, "headersEnd": 7119038, "body": { "mimeType": "multipart/related", + "lineNumber": 115546, "begin": 7118743, "headersEnd": 7119038, "children": [ { "mimeType": "text/html", + "lineNumber": 115556, "begin": 7119077, "headersEnd": 7119293, "end": 7119894, @@ -6147,6 +6708,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115592, "begin": 7119934, "headersEnd": 7120109, "end": 7130832, @@ -6159,21 +6721,23 @@ "lines": 191 }, "end": 7130873, - "octets": 11835, - "lines": 191 + "octets": 11835 }, { "mboxMarkerBegin": 7130874, "mboxMarkerLength": 7, + "lineNumber": 115747, "begin": 7130882, "headersEnd": 7131177, "body": { "mimeType": "multipart/related", + "lineNumber": 115747, "begin": 7130882, "headersEnd": 7131177, "children": [ { "mimeType": "text/html", + "lineNumber": 115757, "begin": 7131216, "headersEnd": 7131461, "end": 7132092, @@ -6182,6 +6746,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115795, "begin": 7132132, "headersEnd": 7132437, "end": 7143160, @@ -6194,21 +6759,23 @@ "lines": 196 }, "end": 7143201, - "octets": 12024, - "lines": 196 + "octets": 12024 }, { "mboxMarkerBegin": 7143202, "mboxMarkerLength": 7, + "lineNumber": 115953, "begin": 7143210, "headersEnd": 7143505, "body": { "mimeType": "multipart/related", + "lineNumber": 115953, "begin": 7143210, "headersEnd": 7143505, "children": [ { "mimeType": "text/html", + "lineNumber": 115963, "begin": 7143544, "headersEnd": 7143760, "end": 7144405, @@ -6217,6 +6784,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 115999, "begin": 7144445, "headersEnd": 7144620, "end": 7155343, @@ -6229,21 +6797,23 @@ "lines": 191 }, "end": 7155384, - "octets": 11879, - "lines": 191 + "octets": 11879 }, { "mboxMarkerBegin": 7155385, "mboxMarkerLength": 7, + "lineNumber": 116154, "begin": 7155393, "headersEnd": 7155688, "body": { "mimeType": "multipart/related", + "lineNumber": 116154, "begin": 7155393, "headersEnd": 7155688, "children": [ { "mimeType": "text/html", + "lineNumber": 116164, "begin": 7155727, "headersEnd": 7155972, "end": 7156642, @@ -6252,6 +6822,7 @@ }, { "mimeType": "image/jpeg", + "lineNumber": 116202, "begin": 7156682, "headersEnd": 7157018, "end": 7167741, @@ -6264,21 +6835,23 @@ "lines": 196 }, "end": 7167782, - "octets": 12094, - "lines": 196 + "octets": 12094 }, { "mboxMarkerBegin": 7167783, "mboxMarkerLength": 31, + "lineNumber": 116360, "begin": 7167815, "headersEnd": 7169049, "body": { "mimeType": "multipart/mixed", + "lineNumber": 116360, "begin": 7167815, "headersEnd": 7169049, "children": [ { "mimeType": "text/plain", + "lineNumber": 116385, "begin": 7169133, "headersEnd": 7169209, "end": 7169236, @@ -6287,18 +6860,22 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 116393, "begin": 7169275, "headersEnd": 7169365, "message": { + "lineNumber": 116397, "begin": 7169365, "headersEnd": 7170186, "body": { "mimeType": "multipart/alternative", + "lineNumber": 116397, "begin": 7169365, "headersEnd": 7170186, "children": [ { "mimeType": "text/plain", + "lineNumber": 116415, "begin": 7170226, "headersEnd": 7170302, "end": 7170929, @@ -6307,11 +6884,13 @@ }, { "mimeType": "multipart/related", + "lineNumber": 116436, "begin": 7170969, "headersEnd": 7171051, "children": [ { "mimeType": "text/html", + "lineNumber": 116440, "begin": 7171091, "headersEnd": 7171166, "end": 7172016, @@ -6320,6 +6899,7 @@ }, { "mimeType": "image/tiff", + "lineNumber": 116463, "begin": 7172056, "headersEnd": 7172240, "end": 7916207, @@ -6337,8 +6917,7 @@ "lines": 10252 }, "end": 7916293, - "octets": 746107, - "lines": 10252 + "octets": 746107 }, "end": 7916293, "octets": 746928, @@ -6350,21 +6929,23 @@ "lines": 10285 }, "end": 7916334, - "octets": 747285, - "lines": 10285 + "octets": 747285 }, { "mboxMarkerBegin": 7916335, "mboxMarkerLength": 31, + "lineNumber": 126669, "begin": 7916367, "headersEnd": 7917631, "body": { "mimeType": "multipart/related", + "lineNumber": 126669, "begin": 7916367, "headersEnd": 7917631, "children": [ { "mimeType": "text/html", + "lineNumber": 126693, "begin": 7917676, "headersEnd": 7917767, "end": 7920149, @@ -6373,6 +6954,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126748, "begin": 7920194, "headersEnd": 7920353, "end": 7926376, @@ -6381,6 +6963,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126834, "begin": 7926421, "headersEnd": 7926579, "end": 7938652, @@ -6389,6 +6972,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 126998, "begin": 7938697, "headersEnd": 7938857, "end": 7960571, @@ -6397,6 +6981,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 127287, "begin": 7960616, "headersEnd": 7960819, "end": 7964212, @@ -6409,16 +6994,17 @@ "lines": 649 }, "end": 7964259, - "octets": 46628, - "lines": 649 + "octets": 46628 }, { "mboxMarkerBegin": 7964260, "mboxMarkerLength": 7, + "lineNumber": 127342, "begin": 7964268, "headersEnd": 7965009, "body": { "mimeType": "audio/basic", + "lineNumber": 127342, "begin": 7964268, "headersEnd": 7965009, "end": 8509625, @@ -6426,21 +7012,23 @@ "lines": 7474 }, "end": 8509625, - "octets": 544616, - "lines": 7474 + "octets": 544616 }, { "mboxMarkerBegin": 8509626, "mboxMarkerLength": 7, + "lineNumber": 134835, "begin": 8509634, "headersEnd": 8510545, "body": { "mimeType": "multipart/mixed", + "lineNumber": 134835, "begin": 8509634, "headersEnd": 8510545, "children": [ { "mimeType": "text/richtext", + "lineNumber": 134858, "begin": 8510554, "headersEnd": 8510583, "end": 8513113, @@ -6453,21 +7041,23 @@ "lines": 102 }, "end": 8513124, - "octets": 2579, - "lines": 102 + "octets": 2579 }, { "mboxMarkerBegin": 8513125, "mboxMarkerLength": 31, + "lineNumber": 134960, "begin": 8513157, "headersEnd": 8513751, "body": { "mimeType": "multipart/signed", + "lineNumber": 134960, "begin": 8513157, "headersEnd": 8513751, "children": [ { "mimeType": "text/plain", + "lineNumber": 134984, "begin": 8514048, "headersEnd": 8514093, "end": 8515175, @@ -6476,6 +7066,7 @@ }, { "mimeType": "application/pgp-signature", + "lineNumber": 135014, "begin": 8515193, "headersEnd": 8515234, "end": 8515518, @@ -6488,16 +7079,17 @@ "lines": 51 }, "end": 8515537, - "octets": 1786, - "lines": 51 + "octets": 1786 }, { "mboxMarkerBegin": 8515538, "mboxMarkerLength": 7, + "lineNumber": 135028, "begin": 8515546, "headersEnd": 8516708, "body": { "mimeType": "application/pgp", + "lineNumber": 135028, "begin": 8515546, "headersEnd": 8516708, "end": 8518091, @@ -6505,16 +7097,17 @@ "lines": 40 }, "end": 8518091, - "octets": 1383, - "lines": 40 + "octets": 1383 }, { "mboxMarkerBegin": 8518092, "mboxMarkerLength": 7, + "lineNumber": 135090, "begin": 8518100, "headersEnd": 8518733, "body": { "mimeType": "text/plain", + "lineNumber": 135090, "begin": 8518100, "headersEnd": 8518733, "end": 8519707, @@ -6522,21 +7115,23 @@ "lines": 27 }, "end": 8519707, - "octets": 974, - "lines": 27 + "octets": 974 }, { "mboxMarkerBegin": 8519708, "mboxMarkerLength": 7, + "lineNumber": 135136, "begin": 8519716, "headersEnd": 8520478, "body": { "mimeType": "multipart/alternative", + "lineNumber": 135136, "begin": 8519716, "headersEnd": 8520478, "children": [ { "mimeType": "text/plain", + "lineNumber": 135158, "begin": 8520673, "headersEnd": 8520717, "end": 8521534, @@ -6545,11 +7140,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 135177, "begin": 8521575, "headersEnd": 8521660, "children": [ { "mimeType": "text/richtext", + "lineNumber": 135181, "begin": 8521702, "headersEnd": 8521793, "end": 8522284, @@ -6558,13 +7155,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 135196, "begin": 8522327, "headersEnd": 8522513, "message": { + "lineNumber": 135203, "begin": 8522513, "headersEnd": 8522540, "body": { "mimeType": "audio/basic", + "lineNumber": 135203, "begin": 8522513, "headersEnd": 8522540, "end": 8522542, @@ -6572,8 +7172,7 @@ "lines": 2 }, "end": 8522542, - "octets": 2, - "lines": 2 + "octets": 2 }, "end": 8522542, "octets": 29, @@ -6581,6 +7180,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 135209, "begin": 8522585, "headersEnd": 8522673, "end": 8522676, @@ -6589,13 +7189,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 135216, "begin": 8522719, "headersEnd": 8522920, "message": { + "lineNumber": 135223, "begin": 8522920, "headersEnd": 8522945, "body": { "mimeType": "image/gif", + "lineNumber": 135223, "begin": 8522920, "headersEnd": 8522945, "end": 8522947, @@ -6603,8 +7206,7 @@ "lines": 2 }, "end": 8522947, - "octets": 2, - "lines": 2 + "octets": 2 }, "end": 8522947, "octets": 27, @@ -6612,6 +7214,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135229, "begin": 8522990, "headersEnd": 8523081, "end": 8523303, @@ -6629,16 +7232,17 @@ "lines": 89 }, "end": 8523391, - "octets": 2913, - "lines": 89 + "octets": 2913 }, { "mboxMarkerBegin": 8523392, "mboxMarkerLength": 7, + "lineNumber": 135245, "begin": 8523400, "headersEnd": 8524214, "body": { "mimeType": "text/richtext", + "lineNumber": 135245, "begin": 8523400, "headersEnd": 8524214, "end": 8525600, @@ -6646,16 +7250,17 @@ "lines": 42 }, "end": 8525600, - "octets": 1386, - "lines": 42 + "octets": 1386 }, { "mboxMarkerBegin": 8525601, "mboxMarkerLength": 7, + "lineNumber": 135307, "begin": 8525609, "headersEnd": 8525761, "body": { "mimeType": "message/partial", + "lineNumber": 135307, "begin": 8525609, "headersEnd": 8525761, "end": 8530432, @@ -6663,21 +7268,23 @@ "lines": 64 }, "end": 8530432, - "octets": 4671, - "lines": 64 + "octets": 4671 }, { "mboxMarkerBegin": 8530433, "mboxMarkerLength": 7, + "lineNumber": 135377, "begin": 8530441, "headersEnd": 8532184, "body": { "mimeType": "multipart/alternative", + "lineNumber": 135377, "begin": 8530441, "headersEnd": 8532184, "children": [ { "mimeType": "text/plain", + "lineNumber": 135416, "begin": 8532379, "headersEnd": 8532423, "end": 8534090, @@ -6686,11 +7293,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 135458, "begin": 8534131, "headersEnd": 8534216, "children": [ { "mimeType": "text/richtext", + "lineNumber": 135462, "begin": 8534258, "headersEnd": 8534349, "end": 8534906, @@ -6699,6 +7308,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135481, "begin": 8534949, "headersEnd": 8535010, "end": 8535882, @@ -6707,6 +7317,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135498, "begin": 8535925, "headersEnd": 8536016, "end": 8536062, @@ -6715,6 +7326,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135508, "begin": 8536105, "headersEnd": 8536166, "end": 8537038, @@ -6723,6 +7335,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135525, "begin": 8537081, "headersEnd": 8537172, "end": 8537218, @@ -6731,6 +7344,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135535, "begin": 8537261, "headersEnd": 8537322, "end": 8538194, @@ -6739,6 +7353,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135552, "begin": 8538237, "headersEnd": 8538328, "end": 8538368, @@ -6747,6 +7362,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135562, "begin": 8538411, "headersEnd": 8538472, "end": 8538696, @@ -6755,6 +7371,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135571, "begin": 8538739, "headersEnd": 8538830, "end": 8538894, @@ -6763,6 +7380,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135581, "begin": 8538937, "headersEnd": 8538998, "end": 8539222, @@ -6771,6 +7389,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135590, "begin": 8539265, "headersEnd": 8539356, "end": 8539400, @@ -6779,6 +7398,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135600, "begin": 8539443, "headersEnd": 8539504, "end": 8539728, @@ -6787,6 +7407,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135609, "begin": 8539771, "headersEnd": 8539862, "end": 8540154, @@ -6795,6 +7416,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135625, "begin": 8540197, "headersEnd": 8540258, "end": 8541130, @@ -6803,6 +7425,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135642, "begin": 8541173, "headersEnd": 8541264, "end": 8541304, @@ -6811,6 +7434,7 @@ }, { "mimeType": "image/x-xwd", + "lineNumber": 135651, "begin": 8541347, "headersEnd": 8541408, "end": 8543323, @@ -6819,6 +7443,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135683, "begin": 8543366, "headersEnd": 8543457, "end": 8543467, @@ -6836,21 +7461,23 @@ "lines": 279 }, "end": 8543555, - "octets": 11371, - "lines": 279 + "octets": 11371 }, { "mboxMarkerBegin": 8543556, "mboxMarkerLength": 7, + "lineNumber": 135693, "begin": 8543564, "headersEnd": 8544292, "body": { "mimeType": "multipart/alternative", + "lineNumber": 135693, "begin": 8543564, "headersEnd": 8544292, "children": [ { "mimeType": "text/plain", + "lineNumber": 135713, "begin": 8544487, "headersEnd": 8544531, "end": 8545158, @@ -6859,11 +7486,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 135729, "begin": 8545199, "headersEnd": 8545284, "children": [ { "mimeType": "text/richtext", + "lineNumber": 135733, "begin": 8545326, "headersEnd": 8545417, "end": 8545950, @@ -6872,6 +7501,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 135746, "begin": 8545993, "headersEnd": 8546101, "end": 8554686, @@ -6880,6 +7510,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 135877, "begin": 8554729, "headersEnd": 8554820, "end": 8554865, @@ -6897,21 +7528,23 @@ "lines": 178 }, "end": 8554952, - "octets": 10660, - "lines": 178 + "octets": 10660 }, { "mboxMarkerBegin": 8554953, "mboxMarkerLength": 7, + "lineNumber": 135888, "begin": 8554961, "headersEnd": 8555607, "body": { "mimeType": "multipart/mixed", + "lineNumber": 135888, "begin": 8554961, "headersEnd": 8555607, "children": [ { "mimeType": "text/plain", + "lineNumber": 135905, "begin": 8555657, "headersEnd": 8555747, "end": 8555844, @@ -6920,6 +7553,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 135916, "begin": 8555894, "headersEnd": 8556021, "end": 8634463, @@ -6932,21 +7566,23 @@ "lines": 1093 }, "end": 8634515, - "octets": 78908, - "lines": 1093 + "octets": 78908 }, { "mboxMarkerBegin": 8634516, "mboxMarkerLength": 7, + "lineNumber": 136998, "begin": 8634524, "headersEnd": 8635280, "body": { "mimeType": "multipart/alternative", + "lineNumber": 136998, "begin": 8634524, "headersEnd": 8635280, "children": [ { "mimeType": "text/plain", + "lineNumber": 137019, "begin": 8635475, "headersEnd": 8635519, "end": 8636869, @@ -6955,11 +7591,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 137051, "begin": 8636910, "headersEnd": 8636995, "children": [ { "mimeType": "text/richtext", + "lineNumber": 137055, "begin": 8637037, "headersEnd": 8637128, "end": 8638267, @@ -6968,6 +7606,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 137082, "begin": 8638310, "headersEnd": 8638408, "end": 8753651, @@ -6976,6 +7615,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 138667, "begin": 8753694, "headersEnd": 8753785, "end": 8753908, @@ -6984,6 +7624,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 138675, "begin": 8753951, "headersEnd": 8754050, "end": 8820331, @@ -6992,6 +7633,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 139642, "begin": 8820374, "headersEnd": 8820462, "end": 8820462, @@ -7009,16 +7651,17 @@ "lines": 2634 }, "end": 8820549, - "octets": 185269, - "lines": 2634 + "octets": 185269 }, { "mboxMarkerBegin": 8820550, "mboxMarkerLength": 7, + "lineNumber": 139650, "begin": 8820558, "headersEnd": 8821395, "body": { "mimeType": "application/x-pkcs", + "lineNumber": 139650, "begin": 8820558, "headersEnd": 8821395, "end": 8823128, @@ -7026,23 +7669,26 @@ "lines": 25 }, "end": 8823128, - "octets": 1733, - "lines": 25 + "octets": 1733 }, { "mboxMarkerBegin": 8823129, "mboxMarkerLength": 7, + "lineNumber": 139696, "begin": 8823137, "headersEnd": 8823767, "body": { "mimeType": "MESSAGE/RFC822", + "lineNumber": 139696, "begin": 8823137, "headersEnd": 8823767, "message": { + "lineNumber": 139710, "begin": 8823767, "headersEnd": 8824250, "body": { "mimeType": "TEXT/PLAIN", + "lineNumber": 139710, "begin": 8823767, "headersEnd": 8824250, "end": 8825125, @@ -7050,29 +7696,30 @@ "lines": 25 }, "end": 8825125, - "octets": 875, - "lines": 25 + "octets": 875 }, "end": 8825125, "octets": 1358, "lines": 38 }, "end": 8825125, - "octets": 1358, - "lines": 38 + "octets": 1358 }, { "mboxMarkerBegin": 8825126, "mboxMarkerLength": 7, + "lineNumber": 139749, "begin": 8825134, "headersEnd": 8825579, "body": { "mimeType": "multipart/mixed", + "lineNumber": 139749, "begin": 8825134, "headersEnd": 8825579, "children": [ { "mimeType": "text/plain", + "lineNumber": 139763, "begin": 8825588, "headersEnd": 8825589, "end": 8825629, @@ -7081,6 +7728,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 139767, "begin": 8825639, "headersEnd": 8825700, "end": 8916949, @@ -7093,16 +7741,17 @@ "lines": 1261 }, "end": 8916963, - "octets": 91384, - "lines": 1261 + "octets": 91384 }, { "mboxMarkerBegin": 8916964, "mboxMarkerLength": 7, + "lineNumber": 141025, "begin": 8916972, "headersEnd": 8917462, "body": { "mimeType": "text/plain", + "lineNumber": 141025, "begin": 8916972, "headersEnd": 8917462, "end": 8918604, @@ -7110,21 +7759,23 @@ "lines": 27 }, "end": 8918604, - "octets": 1142, - "lines": 27 + "octets": 1142 }, { "mboxMarkerBegin": 8918605, "mboxMarkerLength": 7, + "lineNumber": 141066, "begin": 8918613, "headersEnd": 8919753, "body": { "mimeType": "multipart/mixed", + "lineNumber": 141066, "begin": 8918613, "headersEnd": 8919753, "children": [ { "mimeType": "text/plain", + "lineNumber": 141092, "begin": 8919758, "headersEnd": 8919759, "end": 8920299, @@ -7133,6 +7784,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 141107, "begin": 8920305, "headersEnd": 8920421, "end": 8978062, @@ -7141,6 +7793,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 141902, "begin": 8978068, "headersEnd": 8978069, "end": 8981852, @@ -7149,6 +7802,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 141988, "begin": 8981858, "headersEnd": 8982012, "end": 9011647, @@ -7157,6 +7811,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 143003, "begin": 9011653, "headersEnd": 9011759, "end": 9012475, @@ -7165,6 +7820,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 143032, "begin": 9012481, "headersEnd": 9012598, "end": 9013862, @@ -7177,21 +7833,23 @@ "lines": 1970 }, "end": 9013870, - "octets": 94117, - "lines": 1970 + "octets": 94117 }, { "mboxMarkerBegin": 9013871, "mboxMarkerLength": 31, + "lineNumber": 143063, "begin": 9013903, "headersEnd": 9015056, "body": { "mimeType": "multipart/signed", + "lineNumber": 143063, "begin": 9013903, "headersEnd": 9015056, "children": [ { "mimeType": "text/plain", + "lineNumber": 143082, "begin": 9015073, "headersEnd": 9015074, "end": 9015975, @@ -7200,6 +7858,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 143105, "begin": 9015993, "headersEnd": 9016072, "end": 9016820, @@ -7212,21 +7871,23 @@ "lines": 41 }, "end": 9016840, - "octets": 1784, - "lines": 41 + "octets": 1784 }, { "mboxMarkerBegin": 9016841, "mboxMarkerLength": 31, + "lineNumber": 143124, "begin": 9016873, "headersEnd": 9018015, "body": { "mimeType": "multipart/mixed", + "lineNumber": 143124, "begin": 9016873, "headersEnd": 9018015, "children": [ { "mimeType": "text/plain", + "lineNumber": 143147, "begin": 9018195, "headersEnd": 9018273, "end": 9019014, @@ -7235,6 +7896,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143165, "begin": 9019022, "headersEnd": 9019200, "end": 9021415, @@ -7247,21 +7909,23 @@ "lines": 60 }, "end": 9021424, - "octets": 3409, - "lines": 60 + "octets": 3409 }, { "mboxMarkerBegin": 9021425, "mboxMarkerLength": 31, + "lineNumber": 143204, "begin": 9021457, "headersEnd": 9022594, "body": { "mimeType": "multipart/mixed", + "lineNumber": 143204, "begin": 9021457, "headersEnd": 9022594, "children": [ { "mimeType": "text/plain", + "lineNumber": 143231, "begin": 9022788, "headersEnd": 9022866, "end": 9025678, @@ -7270,6 +7934,7 @@ }, { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143282, "begin": 9025700, "headersEnd": 9025878, "end": 9028425, @@ -7282,16 +7947,17 @@ "lines": 97 }, "end": 9028448, - "octets": 5854, - "lines": 97 + "octets": 5854 }, { "mboxMarkerBegin": 9028449, "mboxMarkerLength": 7, + "lineNumber": 143325, "begin": 9028457, "headersEnd": 9028665, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143325, "begin": 9028457, "headersEnd": 9028665, "end": 9032858, @@ -7299,21 +7965,23 @@ "lines": 58 }, "end": 9032858, - "octets": 4193, - "lines": 58 + "octets": 4193 }, { "mboxMarkerBegin": 9032859, "mboxMarkerLength": 31, + "lineNumber": 143391, "begin": 9032891, "headersEnd": 9033791, "body": { "mimeType": "multipart/signed", + "lineNumber": 143391, "begin": 9032891, "headersEnd": 9033791, "children": [ { "mimeType": "image/jpeg", + "lineNumber": 143412, "begin": 9033864, "headersEnd": 9033998, "end": 9044720, @@ -7322,6 +7990,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 143564, "begin": 9044748, "headersEnd": 9044899, "end": 9049510, @@ -7334,16 +8003,17 @@ "lines": 224 }, "end": 9049540, - "octets": 15749, - "lines": 224 + "octets": 15749 }, { "mboxMarkerBegin": 9049541, "mboxMarkerLength": 31, + "lineNumber": 143635, "begin": 9049573, "headersEnd": 9050380, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143635, "begin": 9049573, "headersEnd": 9050380, "end": 9067141, @@ -7351,16 +8021,17 @@ "lines": 258 }, "end": 9067141, - "octets": 16761, - "lines": 258 + "octets": 16761 }, { "mboxMarkerBegin": 9067142, "mboxMarkerLength": 31, + "lineNumber": 143911, "begin": 9067174, "headersEnd": 9067986, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 143911, "begin": 9067174, "headersEnd": 9067986, "end": 9092950, @@ -7368,16 +8039,17 @@ "lines": 385 }, "end": 9092950, - "octets": 24964, - "lines": 385 + "octets": 24964 }, { "mboxMarkerBegin": 9092951, "mboxMarkerLength": 31, + "lineNumber": 144314, "begin": 9092983, "headersEnd": 9093795, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 144314, "begin": 9092983, "headersEnd": 9093795, "end": 9129926, @@ -7385,16 +8057,17 @@ "lines": 556 }, "end": 9129926, - "octets": 36131, - "lines": 556 + "octets": 36131 }, { "mboxMarkerBegin": 9129927, "mboxMarkerLength": 31, + "lineNumber": 144888, "begin": 9129959, "headersEnd": 9130774, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 144888, "begin": 9129959, "headersEnd": 9130774, "end": 9182075, @@ -7402,16 +8075,17 @@ "lines": 790 }, "end": 9182075, - "octets": 51301, - "lines": 790 + "octets": 51301 }, { "mboxMarkerBegin": 9182076, "mboxMarkerLength": 31, + "lineNumber": 145696, "begin": 9182108, "headersEnd": 9183499, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145696, "begin": 9182108, "headersEnd": 9183499, "end": 9184930, @@ -7419,21 +8093,23 @@ "lines": 20 }, "end": 9184930, - "octets": 1431, - "lines": 20 + "octets": 1431 }, { "mboxMarkerBegin": 9184931, "mboxMarkerLength": 31, + "lineNumber": 145741, "begin": 9184963, "headersEnd": 9186316, "body": { "mimeType": "multipart/signed", + "lineNumber": 145741, "begin": 9184963, "headersEnd": 9186316, "children": [ { "mimeType": "text/plain", + "lineNumber": 145767, "begin": 9186361, "headersEnd": 9186425, "end": 9186532, @@ -7442,6 +8118,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 145775, "begin": 9186577, "headersEnd": 9186728, "end": 9190661, @@ -7454,16 +8131,17 @@ "lines": 69 }, "end": 9190708, - "octets": 4392, - "lines": 69 + "octets": 4392 }, { "mboxMarkerBegin": 9190709, "mboxMarkerLength": 31, + "lineNumber": 145836, "begin": 9190741, "headersEnd": 9191951, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145836, "begin": 9190741, "headersEnd": 9191951, "end": 9195446, @@ -7471,16 +8149,17 @@ "lines": 55 }, "end": 9195446, - "octets": 3495, - "lines": 55 + "octets": 3495 }, { "mboxMarkerBegin": 9195447, "mboxMarkerLength": 31, + "lineNumber": 145914, "begin": 9195479, "headersEnd": 9196556, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145914, "begin": 9195479, "headersEnd": 9196556, "end": 9197217, @@ -7488,16 +8167,17 @@ "lines": 10 }, "end": 9197217, - "octets": 661, - "lines": 10 + "octets": 661 }, { "mboxMarkerBegin": 9197218, "mboxMarkerLength": 7, + "lineNumber": 145946, "begin": 9197226, "headersEnd": 9197618, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 145946, "begin": 9197226, "headersEnd": 9197618, "end": 9205238, @@ -7505,23 +8185,26 @@ "lines": 105 }, "end": 9205238, - "octets": 7620, - "lines": 105 + "octets": 7620 }, { "mboxMarkerBegin": 9205239, "mboxMarkerLength": 31, + "lineNumber": 146063, "begin": 9205271, "headersEnd": 9206054, "body": { "mimeType": "message/rfc822", + "lineNumber": 146063, "begin": 9205271, "headersEnd": 9206054, "message": { + "lineNumber": 146082, "begin": 9206054, "headersEnd": 9207434, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146082, "begin": 9206054, "headersEnd": 9207434, "end": 9208866, @@ -7529,29 +8212,30 @@ "lines": 20 }, "end": 9208866, - "octets": 1432, - "lines": 20 + "octets": 1432 }, "end": 9208866, "octets": 2812, "lines": 43 }, "end": 9208866, - "octets": 2812, - "lines": 43 + "octets": 2812 }, { "mboxMarkerBegin": 9208867, "mboxMarkerLength": 31, + "lineNumber": 146127, "begin": 9208899, "headersEnd": 9209609, "body": { "mimeType": "multipart/mixed", + "lineNumber": 146127, "begin": 9208899, "headersEnd": 9209609, "children": [ { "mimeType": "text/plain", + "lineNumber": 146147, "begin": 9209682, "headersEnd": 9209758, "end": 9209773, @@ -7560,13 +8244,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 146153, "begin": 9209801, "headersEnd": 9209955, "message": { + "lineNumber": 146157, "begin": 9209955, "headersEnd": 9211335, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146157, "begin": 9209955, "headersEnd": 9211335, "end": 9212767, @@ -7574,8 +8261,7 @@ "lines": 20 }, "end": 9212767, - "octets": 1432, - "lines": 20 + "octets": 1432 }, "end": 9212767, "octets": 2812, @@ -7587,21 +8273,23 @@ "lines": 58 }, "end": 9212797, - "octets": 3188, - "lines": 58 + "octets": 3188 }, { "mboxMarkerBegin": 9212798, "mboxMarkerLength": 31, + "lineNumber": 146204, "begin": 9212830, "headersEnd": 9213495, "body": { "mimeType": "multipart/signed", + "lineNumber": 146204, "begin": 9212830, "headersEnd": 9213495, "children": [ { "mimeType": "text/plain", + "lineNumber": 146223, "begin": 9213596, "headersEnd": 9213672, "end": 9213713, @@ -7610,6 +8298,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 146229, "begin": 9213755, "headersEnd": 9213906, "end": 9219462, @@ -7622,16 +8311,17 @@ "lines": 91 }, "end": 9219506, - "octets": 6011, - "lines": 91 + "octets": 6011 }, { "mboxMarkerBegin": 9219507, "mboxMarkerLength": 31, + "lineNumber": 146313, "begin": 9219539, "headersEnd": 9220601, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146313, "begin": 9219539, "headersEnd": 9220601, "end": 9230837, @@ -7639,21 +8329,23 @@ "lines": 141 }, "end": 9230837, - "octets": 10236, - "lines": 141 + "octets": 10236 }, { "mboxMarkerBegin": 9230838, "mboxMarkerLength": 31, + "lineNumber": 146476, "begin": 9230870, "headersEnd": 9232246, "body": { "mimeType": "multipart/signed", + "lineNumber": 146476, "begin": 9230870, "headersEnd": 9232246, "children": [ { "mimeType": "text/plain", + "lineNumber": 146503, "begin": 9232347, "headersEnd": 9232423, "end": 9233034, @@ -7662,6 +8354,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 146524, "begin": 9233076, "headersEnd": 9233227, "end": 9235015, @@ -7674,16 +8367,17 @@ "lines": 54 }, "end": 9235059, - "octets": 2813, - "lines": 54 + "octets": 2813 }, { "mboxMarkerBegin": 9235060, "mboxMarkerLength": 31, + "lineNumber": 146556, "begin": 9235092, "headersEnd": 9235640, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146556, "begin": 9235092, "headersEnd": 9235640, "end": 9236163, @@ -7691,21 +8385,23 @@ "lines": 8 }, "end": 9236163, - "octets": 523, - "lines": 8 + "octets": 523 }, { "mboxMarkerBegin": 9236164, "mboxMarkerLength": 7, + "lineNumber": 146580, "begin": 9236172, "headersEnd": 9237488, "body": { "mimeType": "MULTIPART/SIGNED", + "lineNumber": 146580, "begin": 9236172, "headersEnd": 9237488, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 146605, "begin": 9237745, "headersEnd": 9237789, "end": 9238377, @@ -7718,21 +8414,23 @@ "lines": 24 }, "end": 9238420, - "octets": 932, - "lines": 24 + "octets": 932 }, { "mboxMarkerBegin": 9238421, "mboxMarkerLength": 7, + "lineNumber": 146625, "begin": 9238429, "headersEnd": 9239776, "body": { "mimeType": "MULTIPART/SIGNED", + "lineNumber": 146625, "begin": 9238429, "headersEnd": 9239776, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 146650, "begin": 9240033, "headersEnd": 9240077, "end": 9240178, @@ -7741,11 +8439,13 @@ }, { "mimeType": "MULTIPART/MIXED", + "lineNumber": 146660, "begin": 9240220, "headersEnd": 9240383, "children": [ { "mimeType": "TEXT/PLAIN", + "lineNumber": 146669, "begin": 9240638, "headersEnd": 9240745, "end": 9240836, @@ -7754,13 +8454,16 @@ }, { "mimeType": "MESSAGE/RFC822", + "lineNumber": 146678, "begin": 9240876, "headersEnd": 9240969, "message": { + "lineNumber": 146681, "begin": 9240969, "headersEnd": 9242136, "body": { "mimeType": "text/plain", + "lineNumber": 146681, "begin": 9240969, "headersEnd": 9242136, "end": 9242341, @@ -7768,8 +8471,7 @@ "lines": 5 }, "end": 9242341, - "octets": 205, - "lines": 5 + "octets": 205 }, "end": 9242341, "octets": 1372, @@ -7777,6 +8479,7 @@ }, { "mimeType": "TEXT/X-VCARD", + "lineNumber": 146717, "begin": 9242381, "headersEnd": 9242547, "end": 9243026, @@ -7790,6 +8493,7 @@ }, { "mimeType": "APPLICATION/X-PKCS7-SIGNATURE", + "lineNumber": 146735, "begin": 9243109, "headersEnd": 9243321, "end": 9248544, @@ -7802,16 +8506,17 @@ "lines": 169 }, "end": 9248589, - "octets": 8813, - "lines": 169 + "octets": 8813 }, { "mboxMarkerBegin": 9248590, "mboxMarkerLength": 31, + "lineNumber": 146816, "begin": 9248622, "headersEnd": 9249837, "body": { "mimeType": "application/x-pkcs7-mime", + "lineNumber": 146816, "begin": 9248622, "headersEnd": 9249837, "end": 9252719, @@ -7819,16 +8524,17 @@ "lines": 38 }, "end": 9252719, - "octets": 2882, - "lines": 38 + "octets": 2882 }, { "mboxMarkerBegin": 9252720, "mboxMarkerLength": 31, + "lineNumber": 146876, "begin": 9252752, "headersEnd": 9253910, "body": { "mimeType": "Application/x-pkcs7-mime", + "lineNumber": 146876, "begin": 9252752, "headersEnd": 9253910, "end": 9256032, @@ -7836,21 +8542,23 @@ "lines": 30 }, "end": 9256032, - "octets": 2122, - "lines": 30 + "octets": 2122 }, { "mboxMarkerBegin": 9256033, "mboxMarkerLength": 31, + "lineNumber": 146929, "begin": 9256065, "headersEnd": 9257143, "body": { "mimeType": "multipart/signed", + "lineNumber": 146929, "begin": 9256065, "headersEnd": 9257143, "children": [ { "mimeType": "text/plain", + "lineNumber": 146952, "begin": 9257176, "headersEnd": 9257240, "end": 9257240, @@ -7859,6 +8567,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 146957, "begin": 9257273, "headersEnd": 9257352, "end": 9260065, @@ -7871,21 +8580,23 @@ "lines": 53 }, "end": 9260100, - "octets": 2957, - "lines": 53 + "octets": 2957 }, { "mboxMarkerBegin": 9260101, "mboxMarkerLength": 31, + "lineNumber": 147005, "begin": 9260133, "headersEnd": 9261170, "body": { "mimeType": "multipart/mixed", + "lineNumber": 147005, "begin": 9260133, "headersEnd": 9261170, "children": [ { "mimeType": "text/plain", + "lineNumber": 147026, "begin": 9261211, "headersEnd": 9261289, "end": 9261742, @@ -7894,6 +8605,7 @@ }, { "mimeType": "text/html", + "lineNumber": 147044, "begin": 9261783, "headersEnd": 9261858, "end": 9262669, @@ -7902,6 +8614,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147075, "begin": 9262710, "headersEnd": 9262807, "end": 9264007, @@ -7914,21 +8627,23 @@ "lines": 72 }, "end": 9264050, - "octets": 2880, - "lines": 72 + "octets": 2880 }, { "mboxMarkerBegin": 9264051, "mboxMarkerLength": 31, + "lineNumber": 147098, "begin": 9264083, "headersEnd": 9265158, "body": { "mimeType": "multipart/signed", + "lineNumber": 147098, "begin": 9264083, "headersEnd": 9265158, "children": [ { "mimeType": "text/plain", + "lineNumber": 147121, "begin": 9265201, "headersEnd": 9265271, "end": 9265423, @@ -7937,6 +8652,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147133, "begin": 9265466, "headersEnd": 9265545, "end": 9269641, @@ -7949,21 +8665,23 @@ "lines": 75 }, "end": 9269686, - "octets": 4528, - "lines": 75 + "octets": 4528 }, { "mboxMarkerBegin": 9269687, "mboxMarkerLength": 7, + "lineNumber": 147196, "begin": 9269695, "headersEnd": 9270246, "body": { "mimeType": "multipart/signed", + "lineNumber": 147196, "begin": 9269695, "headersEnd": 9270246, "children": [ { "mimeType": "text/plain", + "lineNumber": 147213, "begin": 9270290, "headersEnd": 9270354, "end": 9270509, @@ -7972,6 +8690,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147221, "begin": 9270553, "headersEnd": 9270704, "end": 9274621, @@ -7984,21 +8703,23 @@ "lines": 69 }, "end": 9274666, - "octets": 4420, - "lines": 69 + "octets": 4420 }, { "mboxMarkerBegin": 9274667, "mboxMarkerLength": 31, + "lineNumber": 147281, "begin": 9274699, "headersEnd": 9275863, "body": { "mimeType": "multipart/mixed", + "lineNumber": 147281, "begin": 9274699, "headersEnd": 9275863, "children": [ { "mimeType": "text/plain", + "lineNumber": 147305, "begin": 9276040, "headersEnd": 9276118, "end": 9276190, @@ -8007,6 +8728,7 @@ }, { "mimeType": "application/octet-stream", + "lineNumber": 147315, "begin": 9276231, "headersEnd": 9276326, "end": 9279885, @@ -8019,21 +8741,23 @@ "lines": 66 }, "end": 9279928, - "octets": 4065, - "lines": 66 + "octets": 4065 }, { "mboxMarkerBegin": 9279929, "mboxMarkerLength": 31, + "lineNumber": 147369, "begin": 9279961, "headersEnd": 9281063, "body": { "mimeType": "multipart/signed", + "lineNumber": 147369, "begin": 9279961, "headersEnd": 9281063, "children": [ { "mimeType": "text/plain", + "lineNumber": 147392, "begin": 9281097, "headersEnd": 9281175, "end": 9281249, @@ -8042,6 +8766,7 @@ }, { "mimeType": "application/x-pkcs7-signature", + "lineNumber": 147401, "begin": 9281283, "headersEnd": 9281362, "end": 9285079, @@ -8054,21 +8779,23 @@ "lines": 73 }, "end": 9285114, - "octets": 4051, - "lines": 73 + "octets": 4051 }, { "mboxMarkerBegin": 9285115, "mboxMarkerLength": 31, + "lineNumber": 147464, "begin": 9285147, "headersEnd": 9286275, "body": { "mimeType": "multipart/report", + "lineNumber": 147464, "begin": 9285147, "headersEnd": 9286275, "children": [ { "mimeType": "message/delivery-status", + "lineNumber": 147486, "begin": 9286412, "headersEnd": 9286451, "end": 9286639, @@ -8077,13 +8804,16 @@ }, { "mimeType": "message/rfc822", + "lineNumber": 147496, "begin": 9286664, "headersEnd": 9286694, "message": { + "lineNumber": 147498, "begin": 9286694, "headersEnd": 9287500, "body": { "mimeType": "text/plain", + "lineNumber": 147498, "begin": 9286694, "headersEnd": 9287500, "end": 9287511, @@ -8091,8 +8821,7 @@ "lines": 1 }, "end": 9287511, - "octets": 11, - "lines": 1 + "octets": 11 }, "end": 9287511, "octets": 817, @@ -8104,16 +8833,17 @@ "lines": 34 }, "end": 9287538, - "octets": 1263, - "lines": 34 + "octets": 1263 }, { "mboxMarkerBegin": 9287539, "mboxMarkerLength": 45, + "lineNumber": 147517, "begin": 9287585, "headersEnd": 9287750, "body": { "mimeType": "text/plain", + "lineNumber": 147517, "begin": 9287585, "headersEnd": 9287750, "end": 9322244, @@ -8121,16 +8851,17 @@ "lines": 592 }, "end": 9322244, - "octets": 34494, - "lines": 592 + "octets": 34494 }, { "mboxMarkerBegin": 9322245, "mboxMarkerLength": 45, + "lineNumber": 148117, "begin": 9322291, "headersEnd": 9322449, "body": { "mimeType": "application/octet-stream", + "lineNumber": 148117, "begin": 9322291, "headersEnd": 9322449, "end": 9356943, @@ -8138,16 +8869,17 @@ "lines": 592 }, "end": 9356943, - "octets": 34494, - "lines": 592 + "octets": 34494 }, { "mboxMarkerBegin": 9356944, "mboxMarkerLength": 7, + "lineNumber": 148717, "begin": 9356952, "headersEnd": 9357549, "body": { "mimeType": "application/octet-stream", + "lineNumber": 148717, "begin": 9356952, "headersEnd": 9357549, "end": 9358949, @@ -8155,21 +8887,23 @@ "lines": 39 }, "end": 9358949, - "octets": 1400, - "lines": 39 + "octets": 1400 }, { "mboxMarkerBegin": 9358950, "mboxMarkerLength": 7, + "lineNumber": 148768, "begin": 9358958, "headersEnd": 9359858, "body": { "mimeType": "MULTIPART/mixed", + "lineNumber": 148768, "begin": 9358958, "headersEnd": 9359858, "children": [ { "mimeType": "TEXT/plain", + "lineNumber": 148786, "begin": 9359897, "headersEnd": 9359923, "end": 9360268, @@ -8178,6 +8912,7 @@ }, { "mimeType": "AUDIO/basic", + "lineNumber": 148800, "begin": 9360308, "headersEnd": 9360401, "end": 9601970, @@ -8190,21 +8925,23 @@ "lines": 3982 }, "end": 9602012, - "octets": 242154, - "lines": 3982 + "octets": 242154 }, { "mboxMarkerBegin": 9602013, "mboxMarkerLength": 7, + "lineNumber": 152769, "begin": 9602021, "headersEnd": 9602615, "body": { "mimeType": "multipart/mixed", + "lineNumber": 152769, "begin": 9602021, "headersEnd": 9602615, "children": [ { "mimeType": "image/pbm", + "lineNumber": 152786, "begin": 9602676, "headersEnd": 9602835, "end": 9681124, @@ -8217,16 +8954,17 @@ "lines": 416 }, "end": 9681155, - "octets": 78540, - "lines": 416 + "octets": 78540 }, { "mboxMarkerBegin": 9681156, "mboxMarkerLength": 7, + "lineNumber": 153201, "begin": 9681164, "headersEnd": 9681316, "body": { "mimeType": "message/partial", + "lineNumber": 153201, "begin": 9681164, "headersEnd": 9681316, "end": 9684876, @@ -8234,21 +8972,23 @@ "lines": 49 }, "end": 9684876, - "octets": 3560, - "lines": 49 + "octets": 3560 }, { "mboxMarkerBegin": 9684877, "mboxMarkerLength": 7, + "lineNumber": 153256, "begin": 9684885, "headersEnd": 9685657, "body": { "mimeType": "multipart/alternative", + "lineNumber": 153256, "begin": 9684885, "headersEnd": 9685657, "children": [ { "mimeType": "text/plain", + "lineNumber": 153276, "begin": 9685852, "headersEnd": 9685896, "end": 9686310, @@ -8257,11 +8997,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 153287, "begin": 9686351, "headersEnd": 9686436, "children": [ { "mimeType": "text/richtext", + "lineNumber": 153291, "begin": 9686478, "headersEnd": 9686569, "end": 9686640, @@ -8270,6 +9012,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 153297, "begin": 9686683, "headersEnd": 9686782, "end": 9697479, @@ -8278,6 +9021,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 153460, "begin": 9697522, "headersEnd": 9697613, "end": 9697677, @@ -8286,6 +9030,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 153467, "begin": 9697720, "headersEnd": 9697813, "end": 9703716, @@ -8294,6 +9039,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 153560, "begin": 9703759, "headersEnd": 9703850, "end": 9703883, @@ -8302,6 +9048,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 153567, "begin": 9703926, "headersEnd": 9704027, "end": 9715673, @@ -8310,6 +9057,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 153743, "begin": 9715716, "headersEnd": 9715807, "end": 9715838, @@ -8327,16 +9075,17 @@ "lines": 480 }, "end": 9715925, - "octets": 30268, - "lines": 480 + "octets": 30268 }, { "mboxMarkerBegin": 9715926, "mboxMarkerLength": 7, + "lineNumber": 153753, "begin": 9715934, "headersEnd": 9715990, "body": { "mimeType": "text/plain", + "lineNumber": 153753, "begin": 9715934, "headersEnd": 9715990, "end": 9717198, @@ -8344,16 +9093,17 @@ "lines": 28 }, "end": 9717198, - "octets": 1208, - "lines": 28 + "octets": 1208 }, { "mboxMarkerBegin": 9717199, "mboxMarkerLength": 31, + "lineNumber": 153785, "begin": 9717231, "headersEnd": 9717382, "body": { "mimeType": "text/plain", + "lineNumber": 153785, "begin": 9717231, "headersEnd": 9717382, "end": 9720490, @@ -8361,21 +9111,23 @@ "lines": 68 }, "end": 9720490, - "octets": 3108, - "lines": 68 + "octets": 3108 }, { "mboxMarkerBegin": 9720491, "mboxMarkerLength": 31, + "lineNumber": 153859, "begin": 9720523, "headersEnd": 9722388, "body": { "mimeType": "multipart/mixed", + "lineNumber": 153859, "begin": 9720523, "headersEnd": 9722388, "children": [ { "mimeType": "text/plain", + "lineNumber": 153891, "begin": 9722432, "headersEnd": 9722510, "end": 9723373, @@ -8384,6 +9136,7 @@ }, { "mimeType": "application/vcard", + "lineNumber": 153914, "begin": 9723418, "headersEnd": 9723579, "end": 9727220, @@ -8396,21 +9149,23 @@ "lines": 92 }, "end": 9727267, - "octets": 4879, - "lines": 92 + "octets": 4879 }, { "mboxMarkerBegin": 9727268, "mboxMarkerLength": 7, + "lineNumber": 153984, "begin": 9727276, "headersEnd": 9727830, "body": { "mimeType": "multipart/mixed", + "lineNumber": 153984, "begin": 9727276, "headersEnd": 9727830, "children": [ { "mimeType": "text/plain", + "lineNumber": 153999, "begin": 9727847, "headersEnd": 9727874, "end": 9728837, @@ -8419,6 +9174,7 @@ }, { "mimeType": "image/pgm", + "lineNumber": 154022, "begin": 9728854, "headersEnd": 9728914, "end": 9844640, @@ -8431,21 +9187,23 @@ "lines": 1617 }, "end": 9844660, - "octets": 116830, - "lines": 1617 + "octets": 116830 }, { "mboxMarkerBegin": 9844661, "mboxMarkerLength": 7, + "lineNumber": 155616, "begin": 9844669, "headersEnd": 9845465, "body": { "mimeType": "multipart/alternative", + "lineNumber": 155616, "begin": 9844669, "headersEnd": 9845465, "children": [ { "mimeType": "text/plain", + "lineNumber": 155639, "begin": 9845660, "headersEnd": 9845704, "end": 9854667, @@ -8454,11 +9212,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 155992, "begin": 9854708, "headersEnd": 9854793, "children": [ { "mimeType": "text/richtext", + "lineNumber": 155996, "begin": 9854835, "headersEnd": 9854926, "end": 9857701, @@ -8467,13 +9227,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 156070, "begin": 9857744, "headersEnd": 9857940, "message": { + "lineNumber": 156077, "begin": 9857940, "headersEnd": 9857967, "body": { "mimeType": "text/X-HTML", + "lineNumber": 156077, "begin": 9857940, "headersEnd": 9857967, "end": 9857969, @@ -8481,8 +9244,7 @@ "lines": 2 }, "end": 9857969, - "octets": 2, - "lines": 2 + "octets": 2 }, "end": 9857969, "octets": 29, @@ -8490,6 +9252,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156083, "begin": 9858012, "headersEnd": 9858103, "end": 9859077, @@ -8498,6 +9261,7 @@ }, { "mimeType": "text/SGML", + "lineNumber": 156110, "begin": 9859120, "headersEnd": 9859236, "end": 9859595, @@ -8506,6 +9270,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156131, "begin": 9859638, "headersEnd": 9859729, "end": 9859739, @@ -8514,13 +9279,16 @@ }, { "mimeType": "message/external-body", + "lineNumber": 156138, "begin": 9859782, "headersEnd": 9859967, "message": { + "lineNumber": 156144, "begin": 9859967, "headersEnd": 9859994, "body": { "mimeType": "text/X-HTML", + "lineNumber": 156144, "begin": 9859967, "headersEnd": 9859994, "end": 9859995, @@ -8528,8 +9296,7 @@ "lines": 1 }, "end": 9859995, - "octets": 1, - "lines": 1 + "octets": 1 }, "end": 9859995, "octets": 28, @@ -8537,6 +9304,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156149, "begin": 9860038, "headersEnd": 9860129, "end": 9860139, @@ -8545,6 +9313,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 156156, "begin": 9860182, "headersEnd": 9860288, "end": 9863271, @@ -8553,6 +9322,7 @@ }, { "mimeType": "text/richtext", + "lineNumber": 156205, "begin": 9863314, "headersEnd": 9863405, "end": 9869997, @@ -8570,21 +9340,23 @@ "lines": 837 }, "end": 9870085, - "octets": 24620, - "lines": 837 + "octets": 24620 }, { "mboxMarkerBegin": 9870086, "mboxMarkerLength": 7, + "lineNumber": 156474, "begin": 9870094, "headersEnd": 9871206, "body": { "mimeType": "multipart/mixed", + "lineNumber": 156474, "begin": 9870094, "headersEnd": 9871206, "children": [ { "mimeType": "text/plain", + "lineNumber": 156498, "begin": 9871216, "headersEnd": 9871217, "end": 9871550, @@ -8593,6 +9365,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 156509, "begin": 9871561, "headersEnd": 9871620, "end": 9901599, @@ -8601,6 +9374,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 156925, "begin": 9901610, "headersEnd": 9901611, "end": 9901783, @@ -8613,16 +9387,17 @@ "lines": 440 }, "end": 9901796, - "octets": 30590, - "lines": 440 + "octets": 30590 }, { "mboxMarkerBegin": 9901797, "mboxMarkerLength": 7, + "lineNumber": 156939, "begin": 9901805, "headersEnd": 9903514, "body": { "mimeType": "text/plain", + "lineNumber": 156939, "begin": 9901805, "headersEnd": 9903514, "end": 10086313, @@ -8630,21 +9405,23 @@ "lines": 2951 }, "end": 10086313, - "octets": 182799, - "lines": 2951 + "octets": 182799 }, { "mboxMarkerBegin": 10086314, "mboxMarkerLength": 7, + "lineNumber": 159921, "begin": 10086322, "headersEnd": 10087029, "body": { "mimeType": "multipart/mixed", + "lineNumber": 159921, "begin": 10086322, "headersEnd": 10087029, "children": [ { "mimeType": "text/plain", + "lineNumber": 159938, "begin": 10087056, "headersEnd": 10087057, "end": 10087078, @@ -8653,6 +9430,7 @@ }, { "mimeType": "image/pgm", + "lineNumber": 159941, "begin": 10087106, "headersEnd": 10087258, "end": 10170999, @@ -8661,6 +9439,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 160381, "begin": 10171027, "headersEnd": 10171028, "end": 10171287, @@ -8673,21 +9452,23 @@ "lines": 455 }, "end": 10171317, - "octets": 84288, - "lines": 455 + "octets": 84288 }, { "mboxMarkerBegin": 10171318, "mboxMarkerLength": 7, + "lineNumber": 160394, "begin": 10171326, "headersEnd": 10171993, "body": { "mimeType": "multipart/mixed", + "lineNumber": 160394, "begin": 10171326, "headersEnd": 10171993, "children": [ { "mimeType": "text/plain", + "lineNumber": 160410, "begin": 10172020, "headersEnd": 10172021, "end": 10172087, @@ -8696,6 +9477,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 160413, "begin": 10172115, "headersEnd": 10172276, "end": 10204442, @@ -8704,6 +9486,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 160586, "begin": 10204470, "headersEnd": 10204471, "end": 10204488, @@ -8712,6 +9495,7 @@ }, { "mimeType": "image/pbm", + "lineNumber": 160590, "begin": 10204516, "headersEnd": 10204675, "end": 10205760, @@ -8720,6 +9504,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 160602, "begin": 10205788, "headersEnd": 10205789, "end": 10205819, @@ -8728,6 +9513,7 @@ }, { "mimeType": "application/x-annotate-2", + "lineNumber": 160607, "begin": 10205847, "headersEnd": 10205915, "end": 10391952, @@ -8736,6 +9522,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 162602, "begin": 10391980, "headersEnd": 10391981, "end": 10391989, @@ -8748,16 +9535,17 @@ "lines": 2196 }, "end": 10392019, - "octets": 220026, - "lines": 2196 + "octets": 220026 }, { "mboxMarkerBegin": 10392020, "mboxMarkerLength": 7, + "lineNumber": 162607, "begin": 10392028, "headersEnd": 10392292, "body": { "mimeType": "application/octet-stream", + "lineNumber": 162607, "begin": 10392028, "headersEnd": 10392292, "end": 10466950, @@ -8765,21 +9553,23 @@ "lines": 1023 }, "end": 10466950, - "octets": 74658, - "lines": 1023 + "octets": 74658 }, { "mboxMarkerBegin": 10466951, "mboxMarkerLength": 7, + "lineNumber": 163639, "begin": 10466959, "headersEnd": 10468233, "body": { "mimeType": "multipart/alternative", + "lineNumber": 163639, "begin": 10466959, "headersEnd": 10468233, "children": [ { "mimeType": "text/plain", + "lineNumber": 163673, "begin": 10468817, "headersEnd": 10468818, "end": 10470665, @@ -8788,11 +9578,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 163710, "begin": 10470724, "headersEnd": 10470827, "children": [ { "mimeType": "text/richtext", + "lineNumber": 163714, "begin": 10470887, "headersEnd": 10470960, "end": 10472959, @@ -8801,6 +9593,7 @@ }, { "mimeType": "image/xwd", + "lineNumber": 163748, "begin": 10473020, "headersEnd": 10473079, "end": 10481008, @@ -8809,6 +9602,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 163862, "begin": 10481069, "headersEnd": 10481139, "end": 10481142, @@ -8817,6 +9611,7 @@ }, { "mimeType": "audio/basic", + "lineNumber": 163869, "begin": 10481203, "headersEnd": 10481296, "end": 10523174, @@ -8834,16 +9629,17 @@ "lines": 787 }, "end": 10523298, - "octets": 55065, - "lines": 787 + "octets": 55065 }, { "mboxMarkerBegin": 10523299, "mboxMarkerLength": 7, + "lineNumber": 164453, "begin": 10523307, "headersEnd": 10523459, "body": { "mimeType": "message/partial", + "lineNumber": 164453, "begin": 10523307, "headersEnd": 10523459, "end": 10528262, @@ -8851,21 +9647,23 @@ "lines": 68 }, "end": 10528262, - "octets": 4803, - "lines": 68 + "octets": 4803 }, { "mboxMarkerBegin": 10528263, "mboxMarkerLength": 7, + "lineNumber": 164527, "begin": 10528271, "headersEnd": 10529016, "body": { "mimeType": "multipart/alternative", + "lineNumber": 164527, "begin": 10528271, "headersEnd": 10529016, "children": [ { "mimeType": "text/plain", + "lineNumber": 164551, "begin": 10529395, "headersEnd": 10529396, "end": 10529764, @@ -8874,11 +9672,13 @@ }, { "mimeType": "multipart/mixed", + "lineNumber": 164562, "begin": 10529805, "headersEnd": 10529890, "children": [ { "mimeType": "text/plain", + "lineNumber": 164566, "begin": 10529932, "headersEnd": 10530002, "end": 10530091, @@ -8887,6 +9687,7 @@ }, { "mimeType": "image/gif", + "lineNumber": 164575, "begin": 10530134, "headersEnd": 10530248, "end": 10535911, @@ -8895,6 +9696,7 @@ }, { "mimeType": "text/plain", + "lineNumber": 164664, "begin": 10535954, "headersEnd": 10536024, "end": 10536227, @@ -8912,7 +9714,6 @@ "lines": 133 }, "end": 10536315, - "octets": 7299, - "lines": 133 + "octets": 7299 } ] \ No newline at end of file From e9ed3fcd6a6a6a328b13ef6ed54049aaac31fd24 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jul 2020 10:26:40 -0400 Subject: [PATCH 664/741] Added MimeParser events and removed Octets property from EventArgs Octets is trivial to calculate based on existing properties: BodyOctets = EndOffset - HeadersEndOffset TotalOctets = EndOffset - BeginOffset --- MimeKit/AsyncMimeParser.cs | 7 ----- MimeKit/MimeEntityEndEventArgs.cs | 9 ------ MimeKit/MimeMessageBeginEventArgs.cs | 6 ++-- MimeKit/MimeMessageEndEventArgs.cs | 9 ------ MimeKit/MimeParser.cs | 43 +++++++++++++++++++++++----- UnitTests/MimeParserTests.cs | 12 ++++++-- 6 files changed, 50 insertions(+), 36 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 608cf9f2ec..a43239dd8c 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -268,7 +268,6 @@ async Task ConstructMimePartAsync (MimePart part, MimeEntityEndEventArgs args, C endOffset = beginOffset + content.Length; } - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); if (!result.IsEmpty) @@ -367,12 +366,10 @@ async Task ConstructMessagePartAsync (MessagePart rfc822, MimeEntityEndEventArgs var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.BodyOctets = entityArgs.Octets; OnMimeEntityEnd (entityArgs); OnMimeMessageEnd (messageArgs); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); } @@ -485,7 +482,6 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs await MultipartScanPreambleAsync (multipart, cancellationToken).ConfigureAwait (false); endOffset = GetEndOffset (inputIndex); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } @@ -509,13 +505,11 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs await MultipartScanEpilogueAsync (multipart, cancellationToken).ConfigureAwait (false); endOffset = GetEndOffset (inputIndex); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } endOffset = GetEndOffset (inputIndex); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); multipart.WriteEndBoundary = false; @@ -728,7 +722,6 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.BodyOctets = entityArgs.Octets; if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) diff --git a/MimeKit/MimeEntityEndEventArgs.cs b/MimeKit/MimeEntityEndEventArgs.cs index 2b9d95d0f4..368e41bfc7 100644 --- a/MimeKit/MimeEntityEndEventArgs.cs +++ b/MimeKit/MimeEntityEndEventArgs.cs @@ -84,15 +84,6 @@ public MimeEntityEndEventArgs (MimeEntity entity, Multipart parent) : base (enti /// The stream offset. public long EndOffset { get; set; } - /// - /// Get or set the content length of the entity as measured in octets. - /// - /// - /// Gets or sets the content length of the entity as measured in octets. - /// - /// The length of the content in bytes. - public long Octets { get; set; } - /// /// Get or set the content length of the entity as measured in lines. /// diff --git a/MimeKit/MimeMessageBeginEventArgs.cs b/MimeKit/MimeMessageBeginEventArgs.cs index b237d4e411..75d30dc026 100644 --- a/MimeKit/MimeMessageBeginEventArgs.cs +++ b/MimeKit/MimeMessageBeginEventArgs.cs @@ -100,7 +100,8 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) /// Get or set the stream offset that marks beginning of the mbox marker. /// /// - /// Gets or sets the stream offset that marks the beginning of the mbox marker. + /// Gets or sets the stream offset that marks the beginning of the mbox marker. + /// This property is only ever set for top-level messages in an Mbox file or stream. /// public long? MboxMarkerOffset { get; set; } @@ -108,7 +109,8 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) /// Get or set the stream offset that marks beginning of the mbox marker. /// /// - /// Gets or sets the stream offset that marks the beginning of the mbox marker. + /// Gets or sets the stream offset that marks the beginning of the mbox marker. + /// This property is only ever set for top-level messages in an Mbox file or stream. /// public int? MboxMarkerLength { get; set; } diff --git a/MimeKit/MimeMessageEndEventArgs.cs b/MimeKit/MimeMessageEndEventArgs.cs index ddff809ad5..dfceaaa7b2 100644 --- a/MimeKit/MimeMessageEndEventArgs.cs +++ b/MimeKit/MimeMessageEndEventArgs.cs @@ -83,14 +83,5 @@ public MimeMessageEndEventArgs (MimeMessage message, MessagePart parent) : base /// /// The stream offset. public long EndOffset { get; set; } - - /// - /// Get or set the length of the message body as measured in octets. - /// - /// - /// Gets or sets the length of the message body as measured in octets. - /// - /// The length of the message body in bytes. - public long BodyOctets { get; set; } } } diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 296460d27a..acbba6197d 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -431,6 +431,14 @@ public void SetStream (Stream stream, bool persistent = false) SetStream (ParserOptions.Default, stream, MimeFormat.Default, persistent); } + /// + /// An event signifying the beginning of a new has been encountered. + /// + /// + /// An event signifying the beginning of a new has been encountered. + /// + public event EventHandler MimeMessageBegin; + /// /// Invoked when the parser begins parsing a . /// @@ -440,8 +448,17 @@ public void SetStream (Stream stream, bool persistent = false) /// The parsed state. protected virtual void OnMimeMessageBegin (MimeMessageBeginEventArgs args) { + MimeMessageBegin?.Invoke (this, args); } + /// + /// An event signifying the end of a has been encountered. + /// + /// + /// An event signifying the end of a has been encountered. + /// + public event EventHandler MimeMessageEnd; + /// /// Invoked when the parser has completed parsing a . /// @@ -451,8 +468,17 @@ protected virtual void OnMimeMessageBegin (MimeMessageBeginEventArgs args) /// The parsed state. protected virtual void OnMimeMessageEnd (MimeMessageEndEventArgs args) { + MimeMessageEnd?.Invoke (this, args); } + /// + /// An event signifying the beginning of a new has been encountered. + /// + /// + /// An event signifying the beginning of a new has been encountered. + /// + public event EventHandler MimeEntityBegin; + /// /// Invoked when the parser begins parsing a . /// @@ -462,8 +488,17 @@ protected virtual void OnMimeMessageEnd (MimeMessageEndEventArgs args) /// The parsed state. protected virtual void OnMimeEntityBegin (MimeEntityBeginEventArgs args) { + MimeEntityBegin?.Invoke (this, args); } + /// + /// An event signifying the end of a has been encountered. + /// + /// + /// An event signifying the end of a has been encountered. + /// + public event EventHandler MimeEntityEnd; + /// /// Invoked when the parser has completed parsing a . /// @@ -473,6 +508,7 @@ protected virtual void OnMimeEntityBegin (MimeEntityBeginEventArgs args) /// The parsed state. protected virtual void OnMimeEntityEnd (MimeEntityEndEventArgs args) { + MimeEntityEnd?.Invoke (this, args); } #if DEBUG @@ -1360,7 +1396,6 @@ unsafe void ConstructMimePart (MimePart part, MimeEntityEndEventArgs args, byte* endOffset = beginOffset + content.Length; } - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); if (!result.IsEmpty) @@ -1455,12 +1490,10 @@ unsafe void ConstructMessagePart (MessagePart rfc822, MimeEntityEndEventArgs arg var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min(entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.BodyOctets = entityArgs.Octets; OnMimeEntityEnd (entityArgs); OnMimeMessageEnd (messageArgs); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); } @@ -1586,7 +1619,6 @@ unsafe void ConstructMultipart (Multipart multipart, MimeEntityEndEventArgs args MultipartScanPreamble (multipart, inbuf, cancellationToken); endOffset = GetEndOffset (inputIndex); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } @@ -1610,13 +1642,11 @@ unsafe void ConstructMultipart (Multipart multipart, MimeEntityEndEventArgs args MultipartScanEpilogue (multipart, inbuf, cancellationToken); endOffset = GetEndOffset (inputIndex); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); return; } endOffset = GetEndOffset (inputIndex); - args.Octets = endOffset - beginOffset; args.Lines = GetLineCount (beginLineNumber, beginOffset, endOffset); multipart.WriteEndBoundary = false; @@ -1825,7 +1855,6 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var endOffset = GetEndOffset (inputIndex); messageArgs.HeadersEndOffset = entityArgs.HeadersEndOffset = Math.Min (entityArgs.HeadersEndOffset, endOffset); messageArgs.EndOffset = entityArgs.EndOffset = endOffset; - messageArgs.BodyOctets = entityArgs.Octets; if (boundary != BoundaryType.Eos) { if (format == MimeFormat.Mbox) diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index 0b6190bd04..cea093c9ae 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -691,20 +691,24 @@ protected override void OnMimeMessageBegin (MimeMessageBeginEventArgs args) } messages.Add (args.Message, offsets); + + base.OnMimeMessageBegin (args); } protected override void OnMimeMessageEnd (MimeMessageEndEventArgs args) { if (messages.TryGetValue (args.Message, out var offsets)) { + offsets.Octets = args.EndOffset - args.HeadersEndOffset; offsets.HeadersEnd = args.HeadersEndOffset; offsets.End = args.EndOffset; - offsets.Octets = args.BodyOctets; offsets.Body = body; } else { Console.WriteLine ("oops?"); } messages.Remove (args.Message); + + base.OnMimeMessageEnd (args); } protected override void OnMimeEntityBegin (MimeEntityBeginEventArgs args) @@ -723,14 +727,16 @@ protected override void OnMimeEntityBegin (MimeEntityBeginEventArgs args) } entities.Add (args.Entity, offsets); + + base.OnMimeEntityBegin (args); } protected override void OnMimeEntityEnd (MimeEntityEndEventArgs args) { if (entities.TryGetValue (args.Entity, out var offsets)) { + offsets.Octets = args.EndOffset - args.HeadersEndOffset; offsets.HeadersEnd = args.HeadersEndOffset; offsets.End = args.EndOffset; - offsets.Octets = args.Octets; offsets.Lines = args.Lines; body = offsets; } else { @@ -738,6 +744,8 @@ protected override void OnMimeEntityEnd (MimeEntityEndEventArgs args) } entities.Remove (args.Entity); + + base.OnMimeEntityEnd (args); } } From db541cc5be04210bdef94354f1ad1acc0f412b87 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jul 2020 10:44:23 -0400 Subject: [PATCH 665/741] Added a FIXME comment for future API consideration --- MimeKit/MimeParser.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index acbba6197d..78c14ee96d 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -139,13 +139,15 @@ public partial class MimeParser : IEnumerable bool toplevel; bool eos; - ParserOptions options; + ParserOptions options; // FIXME: might be better if devs passed ParserOptions into the Parse*() methods rather than .ctor and/or SetStream() long headerBlockBegin; long headerBlockEnd; long contentEnd; + long prevLineBeginOffset; long lineBeginOffset; int lineNumber; + Stream stream; long position; From 270fce8400d92941770cbf5d7f21943657e70033 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jul 2020 10:53:06 -0400 Subject: [PATCH 666/741] Update MimeEntityEndEventArgs.cs Improved docs for MimeEntityEndEventArgs.Lines --- MimeKit/MimeEntityEndEventArgs.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeEntityEndEventArgs.cs b/MimeKit/MimeEntityEndEventArgs.cs index 368e41bfc7..b0d9810d6b 100644 --- a/MimeKit/MimeEntityEndEventArgs.cs +++ b/MimeKit/MimeEntityEndEventArgs.cs @@ -88,7 +88,9 @@ public MimeEntityEndEventArgs (MimeEntity entity, Multipart parent) : base (enti /// Get or set the content length of the entity as measured in lines. /// /// - /// Get or set the content length of the entity as measured in lines. + /// Get or set the content length of the entity as measured in lines. + /// The line count reported by this property is the number of lines in its + /// content transfer encoding and not the resulting line count after any decoding. /// /// The length of the content in lines. public int Lines { get; set; } From 1a284b96f0deb895398cfc301c30aaf6f20ea8dd Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jul 2020 11:13:18 -0400 Subject: [PATCH 667/741] Dropped MboxMarker properties from MimeMessageBeginEventArgs Developers can just use MimeParser.MboxMarkerOffset for this. --- MimeKit/AsyncMimeParser.cs | 2 - MimeKit/MimeMessageBeginEventArgs.cs | 18 - MimeKit/MimeParser.cs | 2 - UnitTests/MimeParserTests.cs | 45 +- .../mbox/content-length.dos-offsets.json | 981 ++- UnitTests/TestData/mbox/jwz.dos-offsets.json | 6906 ++++++++--------- 6 files changed, 3873 insertions(+), 4081 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index a43239dd8c..668cb09666 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -670,8 +670,6 @@ async Task ConstructMultipartAsync (Multipart multipart, MimeEntityEndEventArgs var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); var messageArgs = new MimeMessageEndEventArgs (message) { - MboxMarkerOffset = format == MimeFormat.Mbox ? (long?) mboxMarkerOffset : null, - MboxMarkerLength = format == MimeFormat.Mbox ? (int?) mboxMarkerLength : null, HeadersEndOffset = headerBlockEnd, BeginOffset = headerBlockBegin, LineNumber = beginLineNumber diff --git a/MimeKit/MimeMessageBeginEventArgs.cs b/MimeKit/MimeMessageBeginEventArgs.cs index 75d30dc026..ce3c283b7f 100644 --- a/MimeKit/MimeMessageBeginEventArgs.cs +++ b/MimeKit/MimeMessageBeginEventArgs.cs @@ -96,24 +96,6 @@ public MimeMessageBeginEventArgs (MimeMessage message, MessagePart parent) /// The parent . public MessagePart Parent { get; } - /// - /// Get or set the stream offset that marks beginning of the mbox marker. - /// - /// - /// Gets or sets the stream offset that marks the beginning of the mbox marker. - /// This property is only ever set for top-level messages in an Mbox file or stream. - /// - public long? MboxMarkerOffset { get; set; } - - /// - /// Get or set the stream offset that marks beginning of the mbox marker. - /// - /// - /// Gets or sets the stream offset that marks the beginning of the mbox marker. - /// This property is only ever set for top-level messages in an Mbox file or stream. - /// - public int? MboxMarkerLength { get; set; } - /// /// Get or set the stream offset that marks the beginning of the message. /// diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 78c14ee96d..27bc73a8f8 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1806,8 +1806,6 @@ unsafe MimeMessage ParseMessage (byte* inbuf, CancellationToken cancellationToke var message = new MimeMessage (options, headers, RfcComplianceMode.Loose); var messageArgs = new MimeMessageEndEventArgs (message) { - MboxMarkerOffset = format == MimeFormat.Mbox ? (long?) mboxMarkerOffset : null, - MboxMarkerLength = format == MimeFormat.Mbox ? (int?) mboxMarkerLength : null, HeadersEndOffset = headerBlockEnd, BeginOffset = headerBlockBegin, LineNumber = beginLineNumber diff --git a/UnitTests/MimeParserTests.cs b/UnitTests/MimeParserTests.cs index cea093c9ae..698c41ad8d 100644 --- a/UnitTests/MimeParserTests.cs +++ b/UnitTests/MimeParserTests.cs @@ -598,20 +598,20 @@ class MimeOffsets [JsonProperty ("mimeType", NullValueHandling = NullValueHandling.Ignore)] public string MimeType { get; set; } - [JsonProperty ("mboxMarkerBegin", NullValueHandling = NullValueHandling.Ignore)] - public long? MboxMarkerBegin { get; set; } - - [JsonProperty ("mboxMarkerLength", NullValueHandling = NullValueHandling.Ignore)] - public int? MboxMarkerLength { get; set; } + [JsonProperty ("mboxMarkerOffset", NullValueHandling = NullValueHandling.Ignore)] + public long? MboxMarkerOffset { get; set; } [JsonProperty ("lineNumber")] public int LineNumber { get; set; } - [JsonProperty ("begin")] - public long Begin { get; set; } + [JsonProperty ("beginOffset")] + public long BeginOffset { get; set; } + + [JsonProperty ("headersEndOffset")] + public long HeadersEndOffset { get; set; } - [JsonProperty ("headersEnd")] - public long HeadersEnd { get; set; } + [JsonProperty ("endOffset")] + public long EndOffset { get; set; } [JsonProperty ("message", NullValueHandling = NullValueHandling.Ignore)] public MimeOffsets Message { get; set; } @@ -622,9 +622,6 @@ class MimeOffsets [JsonProperty ("children", NullValueHandling = NullValueHandling.Ignore)] public List Children { get; set; } - [JsonProperty ("end")] - public long End { get; set; } - [JsonProperty ("octets")] public long Octets { get; set; } @@ -635,12 +632,11 @@ class MimeOffsets static void AssertMimeOffsets (MimeOffsets expected, MimeOffsets actual, int message, string partSpecifier) { Assert.AreEqual (expected.MimeType, actual.MimeType, $"mime-type differs for message #{message}{partSpecifier}"); - Assert.AreEqual (expected.MboxMarkerBegin, actual.MboxMarkerBegin, $"mbox marker begin offset differs for message #{message}{partSpecifier}"); - Assert.AreEqual (expected.MboxMarkerLength, actual.MboxMarkerLength, $"mbox marker length differs for message #{message}{partSpecifier}"); - Assert.AreEqual (expected.Begin, actual.Begin, $"begin offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.MboxMarkerOffset, actual.MboxMarkerOffset, $"mbox marker begin offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.BeginOffset, actual.BeginOffset, $"begin offset differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.LineNumber, actual.LineNumber, $"begin line differs for message #{message}{partSpecifier}"); - Assert.AreEqual (expected.HeadersEnd, actual.HeadersEnd, $"headers end offset differs for message #{message}{partSpecifier}"); - Assert.AreEqual (expected.End, actual.End, $"end offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.HeadersEndOffset, actual.HeadersEndOffset, $"headers end offset differs for message #{message}{partSpecifier}"); + Assert.AreEqual (expected.EndOffset, actual.EndOffset, $"end offset differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.Octets, actual.Octets, $"octets differs for message #{message}{partSpecifier}"); Assert.AreEqual (expected.Lines, actual.Lines, $"lines differs for message #{message}{partSpecifier}"); @@ -675,7 +671,7 @@ public CustomMimeParser (Stream stream, MimeFormat format) : base (stream, forma protected override void OnMimeMessageBegin (MimeMessageBeginEventArgs args) { var offsets = new MimeOffsets { - Begin = args.BeginOffset, + BeginOffset = args.BeginOffset, LineNumber = args.LineNumber }; @@ -685,8 +681,7 @@ protected override void OnMimeMessageBegin (MimeMessageBeginEventArgs args) else Console.WriteLine ("oops?"); } else { - offsets.MboxMarkerBegin = args.MboxMarkerOffset; - offsets.MboxMarkerLength = args.MboxMarkerLength; + offsets.MboxMarkerOffset = MboxMarkerOffset; Offsets.Add (offsets); } @@ -699,8 +694,8 @@ protected override void OnMimeMessageEnd (MimeMessageEndEventArgs args) { if (messages.TryGetValue (args.Message, out var offsets)) { offsets.Octets = args.EndOffset - args.HeadersEndOffset; - offsets.HeadersEnd = args.HeadersEndOffset; - offsets.End = args.EndOffset; + offsets.HeadersEndOffset = args.HeadersEndOffset; + offsets.EndOffset = args.EndOffset; offsets.Body = body; } else { Console.WriteLine ("oops?"); @@ -715,7 +710,7 @@ protected override void OnMimeEntityBegin (MimeEntityBeginEventArgs args) { var offsets = new MimeOffsets { MimeType = args.Entity.ContentType.MimeType, - Begin = args.BeginOffset, + BeginOffset = args.BeginOffset, LineNumber = args.LineNumber }; @@ -735,8 +730,8 @@ protected override void OnMimeEntityEnd (MimeEntityEndEventArgs args) { if (entities.TryGetValue (args.Entity, out var offsets)) { offsets.Octets = args.EndOffset - args.HeadersEndOffset; - offsets.HeadersEnd = args.HeadersEndOffset; - offsets.End = args.EndOffset; + offsets.HeadersEndOffset = args.HeadersEndOffset; + offsets.EndOffset = args.EndOffset; offsets.Lines = args.Lines; body = offsets; } else { diff --git a/UnitTests/TestData/mbox/content-length.dos-offsets.json b/UnitTests/TestData/mbox/content-length.dos-offsets.json index 4733576d98..d1b8840ff0 100644 --- a/UnitTests/TestData/mbox/content-length.dos-offsets.json +++ b/UnitTests/TestData/mbox/content-length.dos-offsets.json @@ -1,1359 +1,1330 @@ [ { - "mboxMarkerBegin": 0, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 0, "lineNumber": 2, - "begin": 9, - "headersEnd": 675, + "beginOffset": 9, + "headersEndOffset": 675, + "endOffset": 1939, "body": { "mimeType": "multipart/mixed", "lineNumber": 2, - "begin": 9, - "headersEnd": 675, + "beginOffset": 9, + "headersEndOffset": 675, + "endOffset": 1939, "children": [ { "mimeType": "text/plain", "lineNumber": 20, - "begin": 725, - "headersEnd": 753, - "end": 831, + "beginOffset": 725, + "headersEndOffset": 753, + "endOffset": 831, "octets": 78, "lines": 5 }, { "mimeType": "message/rfc822", "lineNumber": 28, - "begin": 883, - "headersEnd": 948, + "beginOffset": 883, + "headersEndOffset": 948, + "endOffset": 1887, "message": { "lineNumber": 31, - "begin": 948, - "headersEnd": 1747, + "beginOffset": 948, + "headersEndOffset": 1747, + "endOffset": 1887, "body": { "mimeType": "text/plain", "lineNumber": 31, - "begin": 948, - "headersEnd": 1747, - "end": 1887, + "beginOffset": 948, + "headersEndOffset": 1747, + "endOffset": 1887, "octets": 140, "lines": 4 }, - "end": 1887, "octets": 140 }, - "end": 1887, "octets": 939, "lines": 21 } ], - "end": 1939, "octets": 1264, "lines": 34 }, - "end": 1939, "octets": 1264 }, { - "mboxMarkerBegin": 1941, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 1941, "lineNumber": 54, - "begin": 1950, - "headersEnd": 2430, + "beginOffset": 1950, + "headersEndOffset": 2430, + "endOffset": 8331, "body": { "mimeType": "multipart/mixed", "lineNumber": 54, - "begin": 1950, - "headersEnd": 2430, + "beginOffset": 1950, + "headersEndOffset": 2430, + "endOffset": 8331, "children": [ { "mimeType": "message/rfc822", "lineNumber": 69, - "begin": 2506, - "headersEnd": 2655, + "beginOffset": 2506, + "headersEndOffset": 2655, + "endOffset": 3134, "message": { "lineNumber": 74, - "begin": 2655, - "headersEnd": 3095, + "beginOffset": 2655, + "headersEndOffset": 3095, + "endOffset": 3134, "body": { "mimeType": "text/plain", "lineNumber": 74, - "begin": 2655, - "headersEnd": 3095, - "end": 3134, + "beginOffset": 2655, + "headersEndOffset": 3095, + "endOffset": 3134, "octets": 39, "lines": 2 }, - "end": 3134, "octets": 39 }, - "end": 3134, "octets": 479, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 89, - "begin": 3164, - "headersEnd": 3291, - "end": 3755, + "beginOffset": 3164, + "headersEndOffset": 3291, + "endOffset": 3755, "octets": 464, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 101, - "begin": 3785, - "headersEnd": 3912, - "end": 4404, + "beginOffset": 3785, + "headersEndOffset": 3912, + "endOffset": 4404, "octets": 492, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 113, - "begin": 4434, - "headersEnd": 4565, - "end": 5099, + "beginOffset": 4434, + "headersEndOffset": 4565, + "endOffset": 5099, "octets": 534, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 126, - "begin": 5129, - "headersEnd": 5258, - "end": 5762, + "beginOffset": 5129, + "headersEndOffset": 5258, + "endOffset": 5762, "octets": 504, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 138, - "begin": 5792, - "headersEnd": 5941, + "beginOffset": 5792, + "headersEndOffset": 5941, + "endOffset": 6419, "message": { "lineNumber": 143, - "begin": 5941, - "headersEnd": 6381, + "beginOffset": 5941, + "headersEndOffset": 6381, + "endOffset": 6419, "body": { "mimeType": "text/plain", "lineNumber": 143, - "begin": 5941, - "headersEnd": 6381, - "end": 6419, + "beginOffset": 5941, + "headersEndOffset": 6381, + "endOffset": 6419, "octets": 38, "lines": 1 }, - "end": 6419, "octets": 38 }, - "end": 6419, "octets": 478, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 157, - "begin": 6449, - "headersEnd": 6625, + "beginOffset": 6449, + "headersEndOffset": 6625, + "endOffset": 8162, "message": { "lineNumber": 162, - "begin": 6625, - "headersEnd": 7210, + "beginOffset": 6625, + "headersEndOffset": 7210, + "endOffset": 8162, "body": { "mimeType": "message/rfc822", "lineNumber": 162, - "begin": 6625, - "headersEnd": 7210, + "beginOffset": 6625, + "headersEndOffset": 7210, + "endOffset": 8162, "message": { "lineNumber": 177, - "begin": 7210, - "headersEnd": 7735, + "beginOffset": 7210, + "headersEndOffset": 7735, + "endOffset": 8162, "body": { "mimeType": "message/rfc822", "lineNumber": 177, - "begin": 7210, - "headersEnd": 7735, + "beginOffset": 7210, + "headersEndOffset": 7735, + "endOffset": 8162, "message": { "lineNumber": 191, - "begin": 7735, - "headersEnd": 8156, + "beginOffset": 7735, + "headersEndOffset": 8156, + "endOffset": 8162, "body": { "mimeType": "text/plain", "lineNumber": 191, - "begin": 7735, - "headersEnd": 8156, - "end": 8162, + "beginOffset": 7735, + "headersEndOffset": 8156, + "endOffset": 8162, "octets": 6, "lines": 1 }, - "end": 8162, "octets": 6 }, - "end": 8162, "octets": 427, "lines": 12 }, - "end": 8162, "octets": 427 }, - "end": 8162, "octets": 952, "lines": 26 }, - "end": 8162, "octets": 952 }, - "end": 8162, "octets": 1537, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 205, - "begin": 8192, - "headersEnd": 8248, - "end": 8301, + "beginOffset": 8192, + "headersEndOffset": 8248, + "endOffset": 8301, "octets": 53, "lines": 1 } ], - "end": 8331, "octets": 5901, "lines": 145 }, - "end": 8331, "octets": 5901 }, { - "mboxMarkerBegin": 8333, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8333, "lineNumber": 212, - "begin": 8342, - "headersEnd": 8825, + "beginOffset": 8342, + "headersEndOffset": 8825, + "endOffset": 14761, "body": { "mimeType": "multipart/mixed", "lineNumber": 212, - "begin": 8342, - "headersEnd": 8825, + "beginOffset": 8342, + "headersEndOffset": 8825, + "endOffset": 14761, "children": [ { "mimeType": "message/rfc822", "lineNumber": 227, - "begin": 8901, - "headersEnd": 9054, + "beginOffset": 8901, + "headersEndOffset": 9054, + "endOffset": 9532, "message": { "lineNumber": 232, - "begin": 9054, - "headersEnd": 9493, + "beginOffset": 9054, + "headersEndOffset": 9493, + "endOffset": 9532, "body": { "mimeType": "text/plain", "lineNumber": 232, - "begin": 9054, - "headersEnd": 9493, - "end": 9532, + "beginOffset": 9054, + "headersEndOffset": 9493, + "endOffset": 9532, "octets": 39, "lines": 2 }, - "end": 9532, "octets": 39 }, - "end": 9532, "octets": 478, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 247, - "begin": 9562, - "headersEnd": 9693, - "end": 10157, + "beginOffset": 9562, + "headersEndOffset": 9693, + "endOffset": 10157, "octets": 464, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 259, - "begin": 10187, - "headersEnd": 10318, - "end": 10810, + "beginOffset": 10187, + "headersEndOffset": 10318, + "endOffset": 10810, "octets": 492, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 271, - "begin": 10840, - "headersEnd": 10975, - "end": 11509, + "beginOffset": 10840, + "headersEndOffset": 10975, + "endOffset": 11509, "octets": 534, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 284, - "begin": 11539, - "headersEnd": 11672, - "end": 12176, + "beginOffset": 11539, + "headersEndOffset": 11672, + "endOffset": 12176, "octets": 504, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 296, - "begin": 12206, - "headersEnd": 12359, + "beginOffset": 12206, + "headersEndOffset": 12359, + "endOffset": 12836, "message": { "lineNumber": 301, - "begin": 12359, - "headersEnd": 12798, + "beginOffset": 12359, + "headersEndOffset": 12798, + "endOffset": 12836, "body": { "mimeType": "text/plain", "lineNumber": 301, - "begin": 12359, - "headersEnd": 12798, - "end": 12836, + "beginOffset": 12359, + "headersEndOffset": 12798, + "endOffset": 12836, "octets": 38, "lines": 1 }, - "end": 12836, "octets": 38 }, - "end": 12836, "octets": 477, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 315, - "begin": 12866, - "headersEnd": 13046, + "beginOffset": 12866, + "headersEndOffset": 13046, + "endOffset": 14588, "message": { "lineNumber": 320, - "begin": 13046, - "headersEnd": 13634, + "beginOffset": 13046, + "headersEndOffset": 13634, + "endOffset": 14588, "body": { "mimeType": "message/rfc822", "lineNumber": 320, - "begin": 13046, - "headersEnd": 13634, + "beginOffset": 13046, + "headersEndOffset": 13634, + "endOffset": 14588, "message": { "lineNumber": 335, - "begin": 13634, - "headersEnd": 14162, + "beginOffset": 13634, + "headersEndOffset": 14162, + "endOffset": 14588, "body": { "mimeType": "message/rfc822", "lineNumber": 335, - "begin": 13634, - "headersEnd": 14162, + "beginOffset": 13634, + "headersEndOffset": 14162, + "endOffset": 14588, "message": { "lineNumber": 349, - "begin": 14162, - "headersEnd": 14582, + "beginOffset": 14162, + "headersEndOffset": 14582, + "endOffset": 14588, "body": { "mimeType": "text/plain", "lineNumber": 349, - "begin": 14162, - "headersEnd": 14582, - "end": 14588, + "beginOffset": 14162, + "headersEndOffset": 14582, + "endOffset": 14588, "octets": 6, "lines": 1 }, - "end": 14588, "octets": 6 }, - "end": 14588, "octets": 426, "lines": 12 }, - "end": 14588, "octets": 426 }, - "end": 14588, "octets": 954, "lines": 26 }, - "end": 14588, "octets": 954 }, - "end": 14588, "octets": 1542, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 363, - "begin": 14618, - "headersEnd": 14678, - "end": 14731, + "beginOffset": 14618, + "headersEndOffset": 14678, + "endOffset": 14731, "octets": 53, "lines": 1 } ], - "end": 14761, "octets": 5936, "lines": 145 }, - "end": 14761, "octets": 5936 }, { - "mboxMarkerBegin": 14763, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 14763, "lineNumber": 370, - "begin": 14796, - "headersEnd": 16325, + "beginOffset": 14796, + "headersEndOffset": 16325, + "endOffset": 23019, "body": { "mimeType": "multipart/related", "lineNumber": 370, - "begin": 14796, - "headersEnd": 16325, + "beginOffset": 14796, + "headersEndOffset": 16325, + "endOffset": 23019, "children": [ { "mimeType": "text/html", "lineNumber": 398, - "begin": 16372, - "headersEnd": 16466, - "end": 21776, + "beginOffset": 16372, + "headersEndOffset": 16466, + "endOffset": 21776, "octets": 5310, "lines": 111 }, { "mimeType": "image/gif", "lineNumber": 514, - "begin": 21823, - "headersEnd": 22028, - "end": 22970, + "beginOffset": 21823, + "headersEndOffset": 22028, + "endOffset": 22970, "octets": 942, "lines": 13 } ], - "end": 23019, "octets": 6694, "lines": 139 }, - "end": 23019, "octets": 6694 }, { - "mboxMarkerBegin": 23021, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 23021, "lineNumber": 537, - "begin": 23054, - "headersEnd": 24310, + "beginOffset": 23054, + "headersEndOffset": 24310, + "endOffset": 781880, "body": { "mimeType": "multipart/mixed", "lineNumber": 537, - "begin": 23054, - "headersEnd": 24310, + "beginOffset": 23054, + "headersEndOffset": 24310, + "endOffset": 781880, "children": [ { "mimeType": "text/plain", "lineNumber": 562, - "begin": 24397, - "headersEnd": 24476, - "end": 24506, + "beginOffset": 24397, + "headersEndOffset": 24476, + "endOffset": 24506, "octets": 30, "lines": 3 }, { "mimeType": "message/rfc822", "lineNumber": 570, - "begin": 24547, - "headersEnd": 24641, + "beginOffset": 24547, + "headersEndOffset": 24641, + "endOffset": 781837, "message": { "lineNumber": 574, - "begin": 24641, - "headersEnd": 25478, + "beginOffset": 24641, + "headersEndOffset": 25478, + "endOffset": 781837, "body": { "mimeType": "multipart/alternative", "lineNumber": 574, - "begin": 24641, - "headersEnd": 25478, + "beginOffset": 24641, + "headersEndOffset": 25478, + "endOffset": 781837, "children": [ { "mimeType": "text/plain", "lineNumber": 592, - "begin": 25520, - "headersEnd": 25599, - "end": 26242, + "beginOffset": 25520, + "headersEndOffset": 25599, + "endOffset": 26242, "octets": 643, "lines": 16 }, { "mimeType": "multipart/related", "lineNumber": 613, - "begin": 26284, - "headersEnd": 26368, + "beginOffset": 26284, + "headersEndOffset": 26368, + "endOffset": 781789, "children": [ { "mimeType": "text/html", "lineNumber": 617, - "begin": 26410, - "headersEnd": 26488, - "end": 27356, + "beginOffset": 26410, + "headersEndOffset": 26488, + "endOffset": 27356, "octets": 868, "lines": 18 }, { "mimeType": "image/tiff", "lineNumber": 640, - "begin": 27398, - "headersEnd": 27587, - "end": 781745, + "beginOffset": 27398, + "headersEndOffset": 27587, + "endOffset": 781745, "octets": 754158, "lines": 10192 } ], - "end": 781789, "octets": 755421, "lines": 10223 } ], - "end": 781837, "octets": 756359, "lines": 10252 }, - "end": 781837, "octets": 756359 }, - "end": 781837, "octets": 757196, "lines": 10268 } ], - "end": 781880, "octets": 757570, "lines": 10285 }, - "end": 781880, "octets": 757570 }, { - "mboxMarkerBegin": 781882, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 781882, "lineNumber": 10846, - "begin": 781915, - "headersEnd": 783201, + "beginOffset": 781915, + "headersEndOffset": 783201, + "endOffset": 830478, "body": { "mimeType": "multipart/related", "lineNumber": 10846, - "begin": 781915, - "headersEnd": 783201, + "beginOffset": 781915, + "headersEndOffset": 783201, + "endOffset": 830478, "children": [ { "mimeType": "text/html", "lineNumber": 10870, - "begin": 783248, - "headersEnd": 783342, - "end": 785774, + "beginOffset": 783248, + "headersEndOffset": 783342, + "endOffset": 785774, "octets": 2432, "lines": 50 }, { "mimeType": "image/gif", "lineNumber": 10925, - "begin": 785821, - "headersEnd": 785985, - "end": 792087, + "beginOffset": 785821, + "headersEndOffset": 785985, + "endOffset": 792087, "octets": 6102, "lines": 79 }, { "mimeType": "image/gif", "lineNumber": 11011, - "begin": 792134, - "headersEnd": 792297, - "end": 804527, + "beginOffset": 792134, + "headersEndOffset": 792297, + "endOffset": 804527, "octets": 12230, "lines": 157 }, { "mimeType": "image/gif", "lineNumber": 11175, - "begin": 804574, - "headersEnd": 804739, - "end": 826735, + "beginOffset": 804574, + "headersEndOffset": 804739, + "endOffset": 826735, "octets": 21996, "lines": 282 }, { "mimeType": "image/gif", "lineNumber": 11464, - "begin": 826782, - "headersEnd": 826991, - "end": 830429, + "beginOffset": 826782, + "headersEndOffset": 826991, + "endOffset": 830429, "octets": 3438, "lines": 45 } ], - "end": 830478, "octets": 47277, "lines": 649 }, - "end": 830478, "octets": 47277 }, { - "mboxMarkerBegin": 830480, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 830480, "lineNumber": 11519, - "begin": 830489, - "headersEnd": 831421, + "beginOffset": 830489, + "headersEndOffset": 831421, + "endOffset": 834102, "body": { "mimeType": "multipart/mixed", "lineNumber": 11519, - "begin": 830489, - "headersEnd": 831421, + "beginOffset": 830489, + "headersEndOffset": 831421, + "endOffset": 834102, "children": [ { "mimeType": "text/richtext", "lineNumber": 11542, - "begin": 831432, - "headersEnd": 831463, - "end": 834089, + "beginOffset": 831432, + "headersEndOffset": 831463, + "endOffset": 834089, "octets": 2626, "lines": 96 } ], - "end": 834102, "octets": 2681, "lines": 102 }, - "end": 834102, "octets": 2681 }, { - "mboxMarkerBegin": 834104, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 834104, "lineNumber": 11644, - "begin": 834137, - "headersEnd": 835308, + "beginOffset": 834137, + "headersEndOffset": 835308, + "endOffset": 837133, "body": { "mimeType": "multipart/signed", "lineNumber": 11644, - "begin": 834137, - "headersEnd": 835308, + "beginOffset": 834137, + "headersEndOffset": 835308, + "endOffset": 837133, "children": [ { "mimeType": "text/plain", "lineNumber": 11663, - "begin": 835326, - "headersEnd": 835328, - "end": 836249, + "beginOffset": 835326, + "headersEndOffset": 835328, + "endOffset": 836249, "octets": 921, "lines": 20 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 11686, - "begin": 836269, - "headersEnd": 836351, - "end": 837111, + "beginOffset": 836269, + "headersEndOffset": 836351, + "endOffset": 837111, "octets": 760, "lines": 12 } ], - "end": 837133, "octets": 1825, "lines": 41 }, - "end": 837133, "octets": 1825 }, { - "mboxMarkerBegin": 837135, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 837135, "lineNumber": 11705, - "begin": 837168, - "headersEnd": 838329, + "beginOffset": 837168, + "headersEndOffset": 838329, + "endOffset": 841797, "body": { "mimeType": "multipart/mixed", "lineNumber": 11705, - "begin": 837168, - "headersEnd": 838329, + "beginOffset": 837168, + "headersEndOffset": 838329, + "endOffset": 841797, "children": [ { "mimeType": "text/plain", "lineNumber": 11728, - "begin": 838513, - "headersEnd": 838594, - "end": 839348, + "beginOffset": 838513, + "headersEndOffset": 838594, + "endOffset": 839348, "octets": 754, "lines": 14 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 11746, - "begin": 839358, - "headersEnd": 839541, - "end": 841787, + "beginOffset": 839358, + "headersEndOffset": 839541, + "endOffset": 841787, "octets": 2246, "lines": 31 } ], - "end": 841797, "octets": 3468, "lines": 60 }, - "end": 841797, "octets": 3468 }, { - "mboxMarkerBegin": 841799, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 841799, "lineNumber": 11785, - "begin": 841832, - "headersEnd": 842992, + "beginOffset": 841832, + "headersEndOffset": 842992, + "endOffset": 848942, "body": { "mimeType": "multipart/mixed", "lineNumber": 11785, - "begin": 841832, - "headersEnd": 842992, + "beginOffset": 841832, + "headersEndOffset": 842992, + "endOffset": 848942, "children": [ { "mimeType": "text/plain", "lineNumber": 11812, - "begin": 843190, - "headersEnd": 843271, - "end": 846129, + "beginOffset": 843190, + "headersEndOffset": 843271, + "endOffset": 846129, "octets": 2858, "lines": 47 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 11863, - "begin": 846153, - "headersEnd": 846336, - "end": 848918, + "beginOffset": 846153, + "headersEndOffset": 846336, + "endOffset": 848918, "octets": 2582, "lines": 35 } ], - "end": 848942, "octets": 5950, "lines": 97 }, - "end": 848942, "octets": 5950 }, { - "mboxMarkerBegin": 848944, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 848944, "lineNumber": 11906, - "begin": 848977, - "headersEnd": 849895, + "beginOffset": 848977, + "headersEndOffset": 849895, + "endOffset": 865868, "body": { "mimeType": "multipart/signed", "lineNumber": 11906, - "begin": 848977, - "headersEnd": 849895, + "beginOffset": 848977, + "headersEndOffset": 849895, + "endOffset": 865868, "children": [ { "mimeType": "image/jpeg", "lineNumber": 11927, - "begin": 849971, - "headersEnd": 850109, - "end": 860977, + "beginOffset": 849971, + "headersEndOffset": 850109, + "endOffset": 860977, "octets": 10868, "lines": 147 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12079, - "begin": 861007, - "headersEnd": 861162, - "end": 865836, + "beginOffset": 861007, + "headersEndOffset": 861162, + "endOffset": 865836, "octets": 4674, "lines": 64 } ], - "end": 865868, "octets": 15973, "lines": 224 }, - "end": 865868, "octets": 15973 }, { - "mboxMarkerBegin": 865870, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 865870, "lineNumber": 12150, - "begin": 865903, - "headersEnd": 867318, + "beginOffset": 865903, + "headersEndOffset": 867318, + "endOffset": 868768, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12150, - "begin": 865903, - "headersEnd": 867318, - "end": 868768, + "beginOffset": 865903, + "headersEndOffset": 867318, + "endOffset": 868768, "octets": 1450, "lines": 20 }, - "end": 868768, "octets": 1450 }, { - "mboxMarkerBegin": 868770, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 868770, "lineNumber": 12195, - "begin": 868803, - "headersEnd": 870180, + "beginOffset": 868803, + "headersEndOffset": 870180, + "endOffset": 874641, "body": { "mimeType": "multipart/signed", "lineNumber": 12195, - "begin": 868803, - "headersEnd": 870180, + "beginOffset": 868803, + "headersEndOffset": 870180, + "endOffset": 874641, "children": [ { "mimeType": "text/plain", "lineNumber": 12221, - "begin": 870227, - "headersEnd": 870294, - "end": 870404, + "beginOffset": 870227, + "headersEndOffset": 870294, + "endOffset": 870404, "octets": 110, "lines": 4 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12229, - "begin": 870451, - "headersEnd": 870606, - "end": 874592, + "beginOffset": 870451, + "headersEndOffset": 870606, + "endOffset": 874592, "octets": 3986, "lines": 54 } ], - "end": 874641, "octets": 4461, "lines": 69 }, - "end": 874641, "octets": 4461 }, { - "mboxMarkerBegin": 874643, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 874643, "lineNumber": 12290, - "begin": 874676, - "headersEnd": 875907, + "beginOffset": 874676, + "headersEndOffset": 875907, + "endOffset": 879457, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12290, - "begin": 874676, - "headersEnd": 875907, - "end": 879457, + "beginOffset": 874676, + "headersEndOffset": 875907, + "endOffset": 879457, "octets": 3550, "lines": 55 }, - "end": 879457, "octets": 3550 }, { - "mboxMarkerBegin": 879459, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 879459, "lineNumber": 12368, - "begin": 879492, - "headersEnd": 880590, + "beginOffset": 879492, + "headersEndOffset": 880590, + "endOffset": 881260, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12368, - "begin": 879492, - "headersEnd": 880590, - "end": 881260, + "beginOffset": 879492, + "headersEndOffset": 880590, + "endOffset": 881260, "octets": 670, "lines": 10 }, - "end": 881260, "octets": 670 }, { - "mboxMarkerBegin": 881262, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 881262, "lineNumber": 12400, - "begin": 881295, - "headersEnd": 882097, + "beginOffset": 881295, + "headersEndOffset": 882097, + "endOffset": 884952, "body": { "mimeType": "message/rfc822", "lineNumber": 12400, - "begin": 881295, - "headersEnd": 882097, + "beginOffset": 881295, + "headersEndOffset": 882097, + "endOffset": 884952, "message": { "lineNumber": 12419, - "begin": 882097, - "headersEnd": 883500, + "beginOffset": 882097, + "headersEndOffset": 883500, + "endOffset": 884952, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12419, - "begin": 882097, - "headersEnd": 883500, - "end": 884952, + "beginOffset": 882097, + "headersEndOffset": 883500, + "endOffset": 884952, "octets": 1452, "lines": 20 }, - "end": 884952, "octets": 1452 }, - "end": 884952, "octets": 2855, "lines": 43 }, - "end": 884952, "octets": 2855 }, { - "mboxMarkerBegin": 884954, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 884954, "lineNumber": 12464, - "begin": 884987, - "headersEnd": 885714, + "beginOffset": 884987, + "headersEndOffset": 885714, + "endOffset": 888960, "body": { "mimeType": "multipart/mixed", "lineNumber": 12464, - "begin": 884987, - "headersEnd": 885714, + "beginOffset": 884987, + "headersEndOffset": 885714, + "endOffset": 888960, "children": [ { "mimeType": "text/plain", "lineNumber": 12484, - "begin": 885790, - "headersEnd": 885869, - "end": 885885, + "beginOffset": 885790, + "headersEndOffset": 885869, + "endOffset": 885885, "octets": 16, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 12490, - "begin": 885915, - "headersEnd": 886073, + "beginOffset": 885915, + "headersEndOffset": 886073, + "endOffset": 888928, "message": { "lineNumber": 12494, - "begin": 886073, - "headersEnd": 887476, + "beginOffset": 886073, + "headersEndOffset": 887476, + "endOffset": 888928, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12494, - "begin": 886073, - "headersEnd": 887476, - "end": 888928, + "beginOffset": 886073, + "headersEndOffset": 887476, + "endOffset": 888928, "octets": 1452, "lines": 20 }, - "end": 888928, "octets": 1452 }, - "end": 888928, "octets": 2855, "lines": 43 } ], - "end": 888960, "octets": 3246, "lines": 58 }, - "end": 888960, "octets": 3246 }, { - "mboxMarkerBegin": 888962, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 888962, "lineNumber": 12541, - "begin": 888995, - "headersEnd": 889676, + "beginOffset": 888995, + "headersEndOffset": 889676, + "endOffset": 895778, "body": { "mimeType": "multipart/signed", "lineNumber": 12541, - "begin": 888995, - "headersEnd": 889676, + "beginOffset": 888995, + "headersEndOffset": 889676, + "endOffset": 895778, "children": [ { "mimeType": "text/plain", "lineNumber": 12560, - "begin": 889780, - "headersEnd": 889859, - "end": 889901, + "beginOffset": 889780, + "headersEndOffset": 889859, + "endOffset": 889901, "octets": 42, "lines": 2 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12566, - "begin": 889945, - "headersEnd": 890100, - "end": 895732, + "beginOffset": 889945, + "headersEndOffset": 890100, + "endOffset": 895732, "octets": 5632, "lines": 77 } ], - "end": 895778, "octets": 6102, "lines": 91 }, - "end": 895778, "octets": 6102 }, { - "mboxMarkerBegin": 895780, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 895780, "lineNumber": 12650, - "begin": 895813, - "headersEnd": 896896, + "beginOffset": 895813, + "headersEndOffset": 896896, + "endOffset": 907272, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12650, - "begin": 895813, - "headersEnd": 896896, - "end": 907272, + "beginOffset": 895813, + "headersEndOffset": 896896, + "endOffset": 907272, "octets": 10376, "lines": 141 }, - "end": 907272, "octets": 10376 }, { - "mboxMarkerBegin": 907274, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 907274, "lineNumber": 12813, - "begin": 907307, - "headersEnd": 908707, + "beginOffset": 907307, + "headersEndOffset": 908707, + "endOffset": 911574, "body": { "mimeType": "multipart/signed", "lineNumber": 12813, - "begin": 907307, - "headersEnd": 908707, + "beginOffset": 907307, + "headersEndOffset": 908707, + "endOffset": 911574, "children": [ { "mimeType": "text/plain", "lineNumber": 12840, - "begin": 908811, - "headersEnd": 908890, - "end": 909517, + "beginOffset": 908811, + "headersEndOffset": 908890, + "endOffset": 909517, "octets": 627, "lines": 17 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12861, - "begin": 909561, - "headersEnd": 909716, - "end": 911528, + "beginOffset": 909561, + "headersEndOffset": 909716, + "endOffset": 911528, "octets": 1812, "lines": 25 } ], - "end": 911574, "octets": 2867, "lines": 54 }, - "end": 911574, "octets": 2867 }, { - "mboxMarkerBegin": 911576, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 911576, "lineNumber": 12893, - "begin": 911609, - "headersEnd": 912172, + "beginOffset": 911609, + "headersEndOffset": 912172, + "endOffset": 912702, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12893, - "begin": 911609, - "headersEnd": 912172, - "end": 912702, + "beginOffset": 911609, + "headersEndOffset": 912172, + "endOffset": 912702, "octets": 530, "lines": 8 }, - "end": 912702, "octets": 530 }, { - "mboxMarkerBegin": 912704, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 912704, "lineNumber": 12917, - "begin": 912737, - "headersEnd": 913972, + "beginOffset": 912737, + "headersEndOffset": 913972, + "endOffset": 916892, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12917, - "begin": 912737, - "headersEnd": 913972, - "end": 916892, + "beginOffset": 912737, + "headersEndOffset": 913972, + "endOffset": 916892, "octets": 2920, "lines": 38 }, - "end": 916892, "octets": 2920 }, { - "mboxMarkerBegin": 916894, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 916894, "lineNumber": 12977, - "begin": 916927, - "headersEnd": 918106, + "beginOffset": 916927, + "headersEndOffset": 918106, + "endOffset": 920258, "body": { "mimeType": "Application/x-pkcs7-mime", "lineNumber": 12977, - "begin": 916927, - "headersEnd": 918106, - "end": 920258, + "beginOffset": 916927, + "headersEndOffset": 918106, + "endOffset": 920258, "octets": 2152, "lines": 30 }, - "end": 920258, "octets": 2152 }, { - "mboxMarkerBegin": 920260, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 920260, "lineNumber": 13030, - "begin": 920293, - "headersEnd": 921392, + "beginOffset": 920293, + "headersEndOffset": 921392, + "endOffset": 924402, "body": { "mimeType": "multipart/signed", "lineNumber": 13030, - "begin": 920293, - "headersEnd": 921392, + "beginOffset": 920293, + "headersEndOffset": 921392, + "endOffset": 924402, "children": [ { "mimeType": "text/plain", "lineNumber": 13053, - "begin": 921427, - "headersEnd": 921494, - "end": 921494, + "beginOffset": 921427, + "headersEndOffset": 921494, + "endOffset": 921494, "octets": 0, "lines": 0 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13058, - "begin": 921529, - "headersEnd": 921611, - "end": 924365, + "beginOffset": 921529, + "headersEndOffset": 921611, + "endOffset": 924365, "octets": 2754, "lines": 42 } ], - "end": 924402, "octets": 3010, "lines": 53 }, - "end": 924402, "octets": 3010 }, { - "mboxMarkerBegin": 924404, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 924404, "lineNumber": 13106, - "begin": 924437, - "headersEnd": 925493, + "beginOffset": 924437, + "headersEndOffset": 925493, + "endOffset": 928445, "body": { "mimeType": "multipart/mixed", "lineNumber": 13106, - "begin": 924437, - "headersEnd": 925493, + "beginOffset": 924437, + "headersEndOffset": 925493, + "endOffset": 928445, "children": [ { "mimeType": "text/plain", "lineNumber": 13127, - "begin": 925536, - "headersEnd": 925617, - "end": 926083, + "beginOffset": 925536, + "headersEndOffset": 925617, + "endOffset": 926083, "octets": 466, "lines": 14 }, { "mimeType": "text/html", "lineNumber": 13145, - "begin": 926126, - "headersEnd": 926204, - "end": 927041, + "beginOffset": 926126, + "headersEndOffset": 926204, + "endOffset": 927041, "octets": 837, "lines": 27 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13176, - "begin": 927084, - "headersEnd": 927184, - "end": 928400, + "beginOffset": 927084, + "headersEndOffset": 927184, + "endOffset": 928400, "octets": 1216, "lines": 16 } ], - "end": 928445, "octets": 2952, "lines": 72 }, - "end": 928445, "octets": 2952 }, { - "mboxMarkerBegin": 928447, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 928447, "lineNumber": 13199, - "begin": 928480, - "headersEnd": 929576, + "beginOffset": 928480, + "headersEndOffset": 929576, + "endOffset": 934179, "body": { "mimeType": "multipart/signed", "lineNumber": 13199, - "begin": 928480, - "headersEnd": 929576, + "beginOffset": 928480, + "headersEndOffset": 929576, + "endOffset": 934179, "children": [ { "mimeType": "text/plain", "lineNumber": 13222, - "begin": 929621, - "headersEnd": 929694, - "end": 929853, + "beginOffset": 929621, + "headersEndOffset": 929694, + "endOffset": 929853, "octets": 159, "lines": 7 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13234, - "begin": 929898, - "headersEnd": 929980, - "end": 934132, + "beginOffset": 929898, + "headersEndOffset": 929980, + "endOffset": 934132, "octets": 4152, "lines": 57 } ], - "end": 934179, "octets": 4603, "lines": 75 }, - "end": 934179, "octets": 4603 }, { - "mboxMarkerBegin": 934181, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 934181, "lineNumber": 13297, - "begin": 934214, - "headersEnd": 935337, + "beginOffset": 934214, + "headersEndOffset": 935337, + "endOffset": 939460, "body": { "mimeType": "multipart/signed", "lineNumber": 13297, - "begin": 934214, - "headersEnd": 935337, + "beginOffset": 934214, + "headersEndOffset": 935337, + "endOffset": 939460, "children": [ { "mimeType": "text/plain", "lineNumber": 13320, - "begin": 935373, - "headersEnd": 935454, - "end": 935532, + "beginOffset": 935373, + "headersEndOffset": 935454, + "endOffset": 935532, "octets": 78, "lines": 5 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13329, - "begin": 935568, - "headersEnd": 935650, - "end": 939424, + "beginOffset": 935568, + "headersEndOffset": 935650, + "endOffset": 939424, "octets": 3774, "lines": 58 } ], - "end": 939460, "octets": 4123, "lines": 73 }, - "end": 939460, "octets": 4123 }, { - "mboxMarkerBegin": 939462, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 939462, "lineNumber": 13392, - "begin": 939495, - "headersEnd": 940640, + "beginOffset": 939495, + "headersEndOffset": 940640, + "endOffset": 941937, "body": { "mimeType": "multipart/report", "lineNumber": 13392, - "begin": 939495, - "headersEnd": 940640, + "beginOffset": 939495, + "headersEndOffset": 940640, + "endOffset": 941937, "children": [ { "mimeType": "message/delivery-status", "lineNumber": 13414, - "begin": 940782, - "headersEnd": 940823, - "end": 941017, + "beginOffset": 940782, + "headersEndOffset": 940823, + "endOffset": 941017, "octets": 194, "lines": 6 }, { "mimeType": "message/rfc822", "lineNumber": 13424, - "begin": 941044, - "headersEnd": 941076, + "beginOffset": 941044, + "headersEndOffset": 941076, + "endOffset": 941908, "message": { "lineNumber": 13426, - "begin": 941076, - "headersEnd": 941897, + "beginOffset": 941076, + "headersEndOffset": 941897, + "endOffset": 941908, "body": { "mimeType": "text/plain", "lineNumber": 13426, - "begin": 941076, - "headersEnd": 941897, - "end": 941908, + "beginOffset": 941076, + "headersEndOffset": 941897, + "endOffset": 941908, "octets": 11, "lines": 1 }, - "end": 941908, "octets": 11 }, - "end": 941908, "octets": 832, "lines": 16 } ], - "end": 941937, "octets": 1297, "lines": 34 }, - "end": 941937, "octets": 1297 }, { - "mboxMarkerBegin": 941939, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 941939, "lineNumber": 13445, - "begin": 941972, - "headersEnd": 943868, + "beginOffset": 941972, + "headersEndOffset": 943868, + "endOffset": 948839, "body": { "mimeType": "multipart/mixed", "lineNumber": 13445, - "begin": 941972, - "headersEnd": 943868, + "beginOffset": 941972, + "headersEndOffset": 943868, + "endOffset": 948839, "children": [ { "mimeType": "text/plain", "lineNumber": 13477, - "begin": 943913, - "headersEnd": 943994, - "end": 944875, + "beginOffset": 943913, + "headersEndOffset": 943994, + "endOffset": 944875, "octets": 881, "lines": 18 }, { "mimeType": "application/vcard", "lineNumber": 13500, - "begin": 944922, - "headersEnd": 945088, - "end": 948790, + "beginOffset": 944922, + "headersEndOffset": 945088, + "endOffset": 948790, "octets": 3702, "lines": 61 } ], - "end": 948839, "octets": 4971, "lines": 92 }, - "end": 948839, "octets": 4971 } ] \ No newline at end of file diff --git a/UnitTests/TestData/mbox/jwz.dos-offsets.json b/UnitTests/TestData/mbox/jwz.dos-offsets.json index 0cc7f4609b..cfbdf12a11 100644 --- a/UnitTests/TestData/mbox/jwz.dos-offsets.json +++ b/UnitTests/TestData/mbox/jwz.dos-offsets.json @@ -1,9719 +1,9567 @@ [ { - "mboxMarkerBegin": 0, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 0, "lineNumber": 2, - "begin": 9, - "headersEnd": 531, + "beginOffset": 9, + "headersEndOffset": 531, + "endOffset": 181624, "body": { "mimeType": "multipart/mixed", "lineNumber": 2, - "begin": 9, - "headersEnd": 531, + "beginOffset": 9, + "headersEndOffset": 531, + "endOffset": 181624, "children": [ { "mimeType": "multipart/parallel", "lineNumber": 16, - "begin": 549, - "headersEnd": 648, + "beginOffset": 549, + "headersEndOffset": 648, + "endOffset": 33041, "children": [ { "mimeType": "text/plain", "lineNumber": 20, - "begin": 680, - "headersEnd": 682, - "end": 1413, + "beginOffset": 680, + "headersEndOffset": 682, + "endOffset": 1413, "octets": 731, "lines": 17 }, { "mimeType": "audio/basic", "lineNumber": 39, - "begin": 1447, - "headersEnd": 1535, - "end": 33007, + "beginOffset": 1447, + "headersEndOffset": 1535, + "endOffset": 33007, "octets": 31472, "lines": 426 } ], - "end": 33041, "octets": 32393, "lines": 452 }, { "mimeType": "multipart/mixed", "lineNumber": 472, - "begin": 33061, - "headersEnd": 33157, + "beginOffset": 33061, + "headersEndOffset": 33157, + "endOffset": 133672, "children": [ { "mimeType": "image/gif", "lineNumber": 476, - "begin": 33189, - "headersEnd": 33275, - "end": 59275, + "beginOffset": 33189, + "headersEndOffset": 33275, + "endOffset": 59275, "octets": 26000, "lines": 352 }, { "mimeType": "image/gif", "lineNumber": 834, - "begin": 59309, - "headersEnd": 59395, - "end": 78061, + "beginOffset": 59309, + "headersEndOffset": 59395, + "endOffset": 78061, "octets": 18666, "lines": 253 }, { "mimeType": "application/octet-stream", "lineNumber": 1093, - "begin": 78095, - "headersEnd": 78212, - "end": 124337, + "beginOffset": 78095, + "headersEndOffset": 78212, + "endOffset": 124337, "octets": 46125, "lines": 2437 }, { "mimeType": "application/atomicmail", "lineNumber": 3534, - "begin": 124371, - "headersEnd": 124435, - "end": 133638, + "beginOffset": 124371, + "headersEndOffset": 124435, + "endOffset": 133638, "octets": 9203, "lines": 357 } ], - "end": 133672, "octets": 100515, "lines": 3421 }, { "mimeType": "audio/basic", "lineNumber": 3897, - "begin": 133692, - "headersEnd": 133780, - "end": 181602, + "beginOffset": 133692, + "headersEndOffset": 133780, + "endOffset": 181602, "octets": 47822, "lines": 647 } ], - "end": 181624, "octets": 181093, "lines": 4535 }, - "end": 181624, "octets": 181093 }, { - "mboxMarkerBegin": 181626, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 181626, "lineNumber": 4552, - "begin": 181635, - "headersEnd": 182198, + "beginOffset": 181635, + "headersEndOffset": 182198, + "endOffset": 319322, "body": { "mimeType": "audio/basic", "lineNumber": 4552, - "begin": 181635, - "headersEnd": 182198, - "end": 319322, + "beginOffset": 181635, + "headersEndOffset": 182198, + "endOffset": 319322, "octets": 137124, "lines": 1854 }, - "end": 319322, "octets": 137124 }, { - "mboxMarkerBegin": 319324, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 319324, "lineNumber": 6422, - "begin": 319333, - "headersEnd": 319720, + "beginOffset": 319333, + "headersEndOffset": 319720, + "endOffset": 319924, "body": { "mimeType": "text/plain", "lineNumber": 6422, - "begin": 319333, - "headersEnd": 319720, - "end": 319924, + "beginOffset": 319333, + "headersEndOffset": 319720, + "endOffset": 319924, "octets": 204, "lines": 4 }, - "end": 319924, "octets": 204 }, { - "mboxMarkerBegin": 319926, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 319926, "lineNumber": 6435, - "begin": 319935, - "headersEnd": 320596, + "beginOffset": 319935, + "headersEndOffset": 320596, + "endOffset": 326365, "body": { "mimeType": "multipart/alternative", "lineNumber": 6435, - "begin": 319935, - "headersEnd": 320596, + "beginOffset": 319935, + "headersEndOffset": 320596, + "endOffset": 326365, "children": [ { "mimeType": "text/plain", "lineNumber": 6454, - "begin": 320795, - "headersEnd": 320841, - "end": 321080, + "beginOffset": 320795, + "headersEndOffset": 320841, + "endOffset": 321080, "octets": 239, "lines": 6 }, { "mimeType": "multipart/mixed", "lineNumber": 6464, - "begin": 321123, - "headersEnd": 321211, + "beginOffset": 321123, + "headersEndOffset": 321211, + "endOffset": 326322, "children": [ { "mimeType": "text/richtext", "lineNumber": 6468, - "begin": 321254, - "headersEnd": 321348, - "end": 321497, + "beginOffset": 321254, + "headersEndOffset": 321348, + "endOffset": 321497, "octets": 149, "lines": 3 }, { "mimeType": "image/gif", "lineNumber": 6476, - "begin": 321542, - "headersEnd": 321656, - "end": 326088, + "beginOffset": 321542, + "headersEndOffset": 321656, + "endOffset": 326088, "octets": 4432, "lines": 64 }, { "mimeType": "text/richtext", "lineNumber": 6546, - "begin": 326133, - "headersEnd": 326227, - "end": 326275, + "beginOffset": 326133, + "headersEndOffset": 326227, + "endOffset": 326275, "octets": 48, "lines": 3 } ], - "end": 326322, "octets": 5111, "lines": 87 } ], - "end": 326365, "octets": 5769, "lines": 106 }, - "end": 326365, "octets": 5769 }, { - "mboxMarkerBegin": 326367, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 326367, "lineNumber": 6557, - "begin": 326376, - "headersEnd": 327141, + "beginOffset": 326376, + "headersEndOffset": 327141, + "endOffset": 350773, "body": { "mimeType": "multipart/mixed", "lineNumber": 6557, - "begin": 326376, - "headersEnd": 327141, + "beginOffset": 326376, + "headersEndOffset": 327141, + "endOffset": 350773, "children": [ { "mimeType": "text/richtext", "lineNumber": 6579, - "begin": 327403, - "headersEnd": 327479, - "end": 327915, + "beginOffset": 327403, + "headersEndOffset": 327479, + "endOffset": 327915, "octets": 436, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 6596, - "begin": 327980, - "headersEnd": 328012, + "beginOffset": 327980, + "headersEndOffset": 328012, + "endOffset": 350454, "message": { "lineNumber": 6598, - "begin": 328012, - "headersEnd": 328864, + "beginOffset": 328012, + "headersEndOffset": 328864, + "endOffset": 350454, "body": { "mimeType": "multipart/mixed", "lineNumber": 6598, - "begin": 328012, - "headersEnd": 328864, + "beginOffset": 328012, + "headersEndOffset": 328864, + "endOffset": 350454, "children": [ { "mimeType": "text/plain", "lineNumber": 6623, - "begin": 329179, - "headersEnd": 329276, - "end": 329386, + "beginOffset": 329179, + "headersEndOffset": 329276, + "endOffset": 329386, "octets": 110, "lines": 6 }, { "mimeType": "audio/basic", "lineNumber": 6634, - "begin": 329419, - "headersEnd": 329511, - "end": 350421, + "beginOffset": 329419, + "headersEndOffset": 329511, + "endOffset": 350421, "octets": 20910, "lines": 283 }, { "mimeType": "text/plain", "lineNumber": 6922, - "begin": 350454, - "headersEnd": 350454, - "end": 350454, + "beginOffset": 350454, + "headersEndOffset": 350454, + "endOffset": 350454, "octets": 0, "lines": 0 } ], - "end": 350454, "octets": 21590, "lines": 308 }, - "end": 350454, "octets": 21590 }, - "end": 350454, "octets": 22442, "lines": 324 }, { "mimeType": "text/richtext", "lineNumber": 6924, - "begin": 350519, - "headersEnd": 350595, - "end": 350706, + "beginOffset": 350519, + "headersEndOffset": 350595, + "endOffset": 350706, "octets": 111, "lines": 4 } ], - "end": 350773, "octets": 23632, "lines": 359 }, - "end": 350773, "octets": 23632 }, { - "mboxMarkerBegin": 350775, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 350775, "lineNumber": 6935, - "begin": 350784, - "headersEnd": 351518, + "beginOffset": 350784, + "headersEndOffset": 351518, + "endOffset": 2139219, "body": { "mimeType": "multipart/alternative", "lineNumber": 6935, - "begin": 350784, - "headersEnd": 351518, + "beginOffset": 350784, + "headersEndOffset": 351518, + "endOffset": 2139219, "children": [ { "mimeType": "text/plain", "lineNumber": 6955, - "begin": 351717, - "headersEnd": 351763, - "end": 352541, + "beginOffset": 351717, + "headersEndOffset": 351763, + "endOffset": 352541, "octets": 778, "lines": 18 }, { "mimeType": "multipart/mixed", "lineNumber": 6977, - "begin": 352584, - "headersEnd": 352672, + "beginOffset": 352584, + "headersEndOffset": 352672, + "endOffset": 2139176, "children": [ { "mimeType": "text/richtext", "lineNumber": 6981, - "begin": 352715, - "headersEnd": 352809, - "end": 353038, + "beginOffset": 352715, + "headersEndOffset": 352809, + "endOffset": 353038, "octets": 229, "lines": 4 }, { "mimeType": "image/x-xwd", "lineNumber": 6990, - "begin": 353083, - "headersEnd": 353195, - "end": 1037241, + "beginOffset": 353083, + "headersEndOffset": 353195, + "endOffset": 1037241, "octets": 684046, "lines": 8982 }, { "mimeType": "text/richtext", "lineNumber": 15978, - "begin": 1037286, - "headersEnd": 1037380, - "end": 1037501, + "beginOffset": 1037286, + "headersEndOffset": 1037380, + "endOffset": 1037501, "octets": 121, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 15988, - "begin": 1037546, - "headersEnd": 1037676, - "end": 1727872, + "beginOffset": 1037546, + "headersEndOffset": 1037676, + "endOffset": 1727872, "octets": 690196, "lines": 9060 }, { "mimeType": "text/richtext", "lineNumber": 25054, - "begin": 1727917, - "headersEnd": 1728011, - "end": 1728023, + "beginOffset": 1727917, + "headersEndOffset": 1728011, + "endOffset": 1728023, "octets": 12, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 25061, - "begin": 1728068, - "headersEnd": 1728189, - "end": 1797301, + "beginOffset": 1728068, + "headersEndOffset": 1728189, + "endOffset": 1797301, "octets": 69112, "lines": 934 }, { "mimeType": "text/richtext", "lineNumber": 26001, - "begin": 1797346, - "headersEnd": 1797440, - "end": 1797583, + "beginOffset": 1797346, + "headersEndOffset": 1797440, + "endOffset": 1797583, "octets": 143, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 26011, - "begin": 1797628, - "headersEnd": 1797750, - "end": 2138984, + "beginOffset": 1797628, + "headersEndOffset": 1797750, + "endOffset": 2138984, "octets": 341234, "lines": 4472 }, { "mimeType": "text/richtext", "lineNumber": 30489, - "begin": 2139029, - "headersEnd": 2139123, - "end": 2139129, + "beginOffset": 2139029, + "headersEndOffset": 2139123, + "endOffset": 2139129, "octets": 6, "lines": 1 } ], - "end": 2139176, "octets": 1786504, "lines": 23515 } ], - "end": 2139219, "octets": 1787701, "lines": 23546 }, - "end": 2139219, "octets": 1787701 }, { - "mboxMarkerBegin": 2139221, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2139221, "lineNumber": 30498, - "begin": 2139230, - "headersEnd": 2140267, + "beginOffset": 2139230, + "headersEndOffset": 2140267, + "endOffset": 2141431, "body": { "mimeType": "text/plain", "lineNumber": 30498, - "begin": 2139230, - "headersEnd": 2140267, - "end": 2141431, + "beginOffset": 2139230, + "headersEndOffset": 2140267, + "endOffset": 2141431, "octets": 1164, "lines": 39 }, - "end": 2141431, "octets": 1164 }, { - "mboxMarkerBegin": 2141433, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2141433, "lineNumber": 30560, - "begin": 2141442, - "headersEnd": 2141689, + "beginOffset": 2141442, + "headersEndOffset": 2141689, + "endOffset": 2307345, "body": { "mimeType": "multipart/mixed", "lineNumber": 30560, - "begin": 2141442, - "headersEnd": 2141689, + "beginOffset": 2141442, + "headersEndOffset": 2141689, + "endOffset": 2307345, "children": [ { "mimeType": "text/plain", "lineNumber": 30570, - "begin": 2141705, - "headersEnd": 2141707, - "end": 2142012, + "beginOffset": 2141705, + "headersEndOffset": 2141707, + "endOffset": 2142012, "octets": 305, "lines": 6 }, { "mimeType": "multipart/parallel", "lineNumber": 30578, - "begin": 2142030, - "headersEnd": 2142109, + "beginOffset": 2142030, + "headersEndOffset": 2142109, + "endOffset": 2302335, "children": [ { "mimeType": "image/gif", "lineNumber": 30582, - "begin": 2142126, - "headersEnd": 2142207, - "end": 2145483, + "beginOffset": 2142126, + "headersEndOffset": 2142207, + "endOffset": 2145483, "octets": 3276, "lines": 17 }, { "mimeType": "audio/basic", "lineNumber": 30604, - "begin": 2145502, - "headersEnd": 2145610, - "end": 2302316, + "beginOffset": 2145502, + "headersEndOffset": 2145610, + "endOffset": 2302316, "octets": 156706, "lines": 808 } ], - "end": 2302335, "octets": 160226, "lines": 837 }, { "mimeType": "application/atomicmail", "lineNumber": 31419, - "begin": 2302353, - "headersEnd": 2302412, - "end": 2307327, + "beginOffset": 2302353, + "headersEndOffset": 2302412, + "endOffset": 2307327, "octets": 4915, "lines": 195 } ], - "end": 2307345, "octets": 165656, "lines": 1050 }, - "end": 2307345, "octets": 165656 }, { - "mboxMarkerBegin": 2307347, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2307347, "lineNumber": 31620, - "begin": 2307356, - "headersEnd": 2308328, + "beginOffset": 2307356, + "headersEndOffset": 2308328, + "endOffset": 2655844, "body": { "mimeType": "audio/basic", "lineNumber": 31620, - "begin": 2307356, - "headersEnd": 2308328, - "end": 2655844, + "beginOffset": 2307356, + "headersEndOffset": 2308328, + "endOffset": 2655844, "octets": 347516, "lines": 4456 }, - "end": 2655844, "octets": 347516 }, { - "mboxMarkerBegin": 2655846, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2655846, "lineNumber": 36098, - "begin": 2655855, - "headersEnd": 2655994, + "beginOffset": 2655855, + "headersEndOffset": 2655994, + "endOffset": 2688506, "body": { "mimeType": "multipart/mixed", "lineNumber": 36098, - "begin": 2655855, - "headersEnd": 2655994, + "beginOffset": 2655855, + "headersEndOffset": 2655994, + "endOffset": 2688506, "children": [ { "mimeType": "multipart/parallel", "lineNumber": 36104, - "begin": 2656012, - "headersEnd": 2656087, + "beginOffset": 2656012, + "headersEndOffset": 2656087, + "endOffset": 2688486, "children": [ { "mimeType": "text/plain", "lineNumber": 36107, - "begin": 2656119, - "headersEnd": 2656121, - "end": 2656845, + "beginOffset": 2656119, + "headersEndOffset": 2656121, + "endOffset": 2656845, "octets": 724, "lines": 18 }, { "mimeType": "audio/basic", "lineNumber": 36127, - "begin": 2656879, - "headersEnd": 2656980, - "end": 2688452, + "beginOffset": 2656879, + "headersEndOffset": 2656980, + "endOffset": 2688452, "octets": 31472, "lines": 426 } ], - "end": 2688486, "octets": 32399, "lines": 453 } ], - "end": 2688506, "octets": 32512, "lines": 457 }, - "end": 2688506, "octets": 32512 }, { - "mboxMarkerBegin": 2688508, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2688508, "lineNumber": 36561, - "begin": 2688517, - "headersEnd": 2689088, + "beginOffset": 2688517, + "headersEndOffset": 2689088, + "endOffset": 2746649, "body": { "mimeType": "image/pbm", "lineNumber": 36561, - "begin": 2688517, - "headersEnd": 2689088, - "end": 2746649, + "beginOffset": 2688517, + "headersEndOffset": 2689088, + "endOffset": 2746649, "octets": 57561, "lines": 782 }, - "end": 2746649, "octets": 57561 }, { - "mboxMarkerBegin": 2746651, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2746651, "lineNumber": 37359, - "begin": 2746660, - "headersEnd": 2747410, + "beginOffset": 2746660, + "headersEndOffset": 2747410, + "endOffset": 2779395, "body": { "mimeType": "multipart/alternative", "lineNumber": 37359, - "begin": 2746660, - "headersEnd": 2747410, + "beginOffset": 2746660, + "headersEndOffset": 2747410, + "endOffset": 2779395, "children": [ { "mimeType": "text/plain", "lineNumber": 37385, - "begin": 2748003, - "headersEnd": 2748005, - "end": 2748571, + "beginOffset": 2748003, + "headersEndOffset": 2748005, + "endOffset": 2748571, "octets": 566, "lines": 14 }, { "mimeType": "multipart/mixed", "lineNumber": 37402, - "begin": 2748632, - "headersEnd": 2748738, + "beginOffset": 2748632, + "headersEndOffset": 2748738, + "endOffset": 2779334, "children": [ { "mimeType": "text/richtext", "lineNumber": 37406, - "begin": 2748799, - "headersEnd": 2748875, - "end": 2749301, + "beginOffset": 2748799, + "headersEndOffset": 2748875, + "endOffset": 2749301, "octets": 426, "lines": 7 }, { "mimeType": "image/xwd", "lineNumber": 37418, - "begin": 2749364, - "headersEnd": 2749426, - "end": 2779088, + "beginOffset": 2749364, + "headersEndOffset": 2749426, + "endOffset": 2779088, "octets": 29662, "lines": 401 }, { "mimeType": "text/plain", "lineNumber": 37824, - "begin": 2779151, - "headersEnd": 2779224, - "end": 2779269, + "beginOffset": 2779151, + "headersEndOffset": 2779224, + "endOffset": 2779269, "octets": 45, "lines": 4 } ], - "end": 2779334, "octets": 30596, "lines": 428 } ], - "end": 2779395, "octets": 31985, "lines": 459 }, - "end": 2779395, "octets": 31985 }, { - "mboxMarkerBegin": 2779397, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2779397, "lineNumber": 37836, - "begin": 2779406, - "headersEnd": 2780075, + "beginOffset": 2779406, + "headersEndOffset": 2780075, + "endOffset": 2785076, "body": { "mimeType": "multipart/alternative", "lineNumber": 37836, - "begin": 2779406, - "headersEnd": 2780075, + "beginOffset": 2779406, + "headersEndOffset": 2780075, + "endOffset": 2785076, "children": [ { "mimeType": "text/plain", "lineNumber": 37860, - "begin": 2780452, - "headersEnd": 2780454, - "end": 2781302, + "beginOffset": 2780452, + "headersEndOffset": 2780454, + "endOffset": 2781302, "octets": 848, "lines": 27 }, { "mimeType": "multipart/mixed", "lineNumber": 37890, - "begin": 2781334, - "headersEnd": 2781410, + "beginOffset": 2781334, + "headersEndOffset": 2781410, + "endOffset": 2785042, "children": [ { "mimeType": "text/plain", "lineNumber": 37894, - "begin": 2781442, - "headersEnd": 2781470, - "end": 2781612, + "beginOffset": 2781442, + "headersEndOffset": 2781470, + "endOffset": 2781612, "octets": 142, "lines": 6 }, { "mimeType": "image/x-xbitmap", "lineNumber": 37903, - "begin": 2781646, - "headersEnd": 2781714, - "end": 2782928, + "beginOffset": 2781646, + "headersEndOffset": 2781714, + "endOffset": 2782928, "octets": 1214, "lines": 17 }, { "mimeType": "text/plain", "lineNumber": 37925, - "begin": 2782962, - "headersEnd": 2782990, - "end": 2783058, + "beginOffset": 2782962, + "headersEndOffset": 2782990, + "endOffset": 2783058, "octets": 68, "lines": 1 }, { "mimeType": "image/x-xbitmap", "lineNumber": 37929, - "begin": 2783092, - "headersEnd": 2783160, - "end": 2784382, + "beginOffset": 2783092, + "headersEndOffset": 2783160, + "endOffset": 2784382, "octets": 1222, "lines": 17 }, { "mimeType": "text/richtext", "lineNumber": 37951, - "begin": 2784416, - "headersEnd": 2784447, - "end": 2785006, + "beginOffset": 2784416, + "headersEndOffset": 2784447, + "endOffset": 2785006, "octets": 559, "lines": 14 } ], - "end": 2785042, "octets": 3632, "lines": 75 } ], - "end": 2785076, "octets": 5001, "lines": 118 }, - "end": 2785076, "octets": 5001 }, { - "mboxMarkerBegin": 2785078, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2785078, "lineNumber": 37972, - "begin": 2785087, - "headersEnd": 2786084, + "beginOffset": 2785087, + "headersEndOffset": 2786084, + "endOffset": 2787498, "body": { "mimeType": "text/plain", "lineNumber": 37972, - "begin": 2785087, - "headersEnd": 2786084, - "end": 2787498, + "beginOffset": 2785087, + "headersEndOffset": 2786084, + "endOffset": 2787498, "octets": 1414, "lines": 32 }, - "end": 2787498, "octets": 1414 }, { - "mboxMarkerBegin": 2787500, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2787500, "lineNumber": 38027, - "begin": 2787509, - "headersEnd": 2787772, + "beginOffset": 2787509, + "headersEndOffset": 2787772, + "endOffset": 2788033, "body": { "mimeType": "text/plain", "lineNumber": 38027, - "begin": 2787509, - "headersEnd": 2787772, - "end": 2788033, + "beginOffset": 2787509, + "headersEndOffset": 2787772, + "endOffset": 2788033, "octets": 261, "lines": 6 }, - "end": 2788033, "octets": 261 }, { - "mboxMarkerBegin": 2788035, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2788035, "lineNumber": 38041, - "begin": 2788044, - "headersEnd": 2788716, + "beginOffset": 2788044, + "headersEndOffset": 2788716, + "endOffset": 2789453, "body": { "mimeType": "text/plain", "lineNumber": 38041, - "begin": 2788044, - "headersEnd": 2788716, - "end": 2789453, + "beginOffset": 2788044, + "headersEndOffset": 2788716, + "endOffset": 2789453, "octets": 737, "lines": 14 }, - "end": 2789453, "octets": 737 }, { - "mboxMarkerBegin": 2789455, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2789455, "lineNumber": 38071, - "begin": 2789464, - "headersEnd": 2790463, + "beginOffset": 2789464, + "headersEndOffset": 2790463, + "endOffset": 3227750, "body": { "mimeType": "multipart/mixed", "lineNumber": 38071, - "begin": 2789464, - "headersEnd": 2790463, + "beginOffset": 2789464, + "headersEndOffset": 2790463, + "endOffset": 3227750, "children": [ { "mimeType": "text/plain", "lineNumber": 38088, - "begin": 2790507, - "headersEnd": 2790555, - "end": 2790632, + "beginOffset": 2790507, + "headersEndOffset": 2790555, + "endOffset": 2790632, "octets": 77, "lines": 5 }, { "mimeType": "multipart/appledouble", "lineNumber": 38097, - "begin": 2790674, - "headersEnd": 2790763, + "beginOffset": 2790674, + "headersEndOffset": 2790763, + "endOffset": 3227708, "children": [ { "mimeType": "application/applefile", "lineNumber": 38102, - "begin": 2790808, - "headersEnd": 2790967, - "end": 2857841, + "beginOffset": 2790808, + "headersEndOffset": 2790967, + "endOffset": 2857841, "octets": 66874, "lines": 957 }, { "mimeType": "application/octet-stream", "lineNumber": 39065, - "begin": 2857884, - "headersEnd": 2858099, - "end": 3227661, + "beginOffset": 2857884, + "headersEndOffset": 2858099, + "endOffset": 3227661, "octets": 369562, "lines": 5281 } ], - "end": 3227708, "octets": 436945, "lines": 6256 } ], - "end": 3227750, "octets": 437287, "lines": 6272 }, - "end": 3227750, "octets": 437287 }, { - "mboxMarkerBegin": 3227752, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3227752, "lineNumber": 44358, - "begin": 3227761, - "headersEnd": 3228760, + "beginOffset": 3227761, + "headersEndOffset": 3228760, + "endOffset": 3666046, "body": { "mimeType": "multipart/mixed", "lineNumber": 44358, - "begin": 3227761, - "headersEnd": 3228760, + "beginOffset": 3227761, + "headersEndOffset": 3228760, + "endOffset": 3666046, "children": [ { "mimeType": "text/plain", "lineNumber": 44375, - "begin": 3228804, - "headersEnd": 3228852, - "end": 3228929, + "beginOffset": 3228804, + "headersEndOffset": 3228852, + "endOffset": 3228929, "octets": 77, "lines": 5 }, { "mimeType": "multipart/header-set", "lineNumber": 44384, - "begin": 3228971, - "headersEnd": 3229059, + "beginOffset": 3228971, + "headersEndOffset": 3229059, + "endOffset": 3666004, "children": [ { "mimeType": "application/applefile", "lineNumber": 44389, - "begin": 3229104, - "headersEnd": 3229263, - "end": 3296137, + "beginOffset": 3229104, + "headersEndOffset": 3229263, + "endOffset": 3296137, "octets": 66874, "lines": 957 }, { "mimeType": "application/octet-stream", "lineNumber": 45352, - "begin": 3296180, - "headersEnd": 3296395, - "end": 3665957, + "beginOffset": 3296180, + "headersEndOffset": 3296395, + "endOffset": 3665957, "octets": 369562, "lines": 5281 } ], - "end": 3666004, "octets": 436945, "lines": 6256 } ], - "end": 3666046, "octets": 437286, "lines": 6272 }, - "end": 3666046, "octets": 437286 }, { - "mboxMarkerBegin": 3666048, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3666048, "lineNumber": 50645, - "begin": 3666057, - "headersEnd": 3666630, + "beginOffset": 3666057, + "headersEndOffset": 3666630, + "endOffset": 3667232, "body": { "mimeType": "Message/rfc822", "lineNumber": 50645, - "begin": 3666057, - "headersEnd": 3666630, + "beginOffset": 3666057, + "headersEndOffset": 3666630, + "endOffset": 3667232, "message": { "lineNumber": 50660, - "begin": 3666630, - "headersEnd": 3666692, + "beginOffset": 3666630, + "headersEndOffset": 3666692, + "endOffset": 3667232, "body": { "mimeType": "text/plain", "lineNumber": 50660, - "begin": 3666630, - "headersEnd": 3666692, - "end": 3667232, + "beginOffset": 3666630, + "headersEndOffset": 3666692, + "endOffset": 3667232, "octets": 540, "lines": 14 }, - "end": 3667232, "octets": 540 }, - "end": 3667232, "octets": 602, "lines": 17 }, - "end": 3667232, "octets": 602 }, { - "mboxMarkerBegin": 3667234, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3667234, "lineNumber": 50678, - "begin": 3667243, - "headersEnd": 3667974, + "beginOffset": 3667243, + "headersEndOffset": 3667974, + "endOffset": 3669418, "body": { "mimeType": "multipart/mixed", "lineNumber": 50678, - "begin": 3667243, - "headersEnd": 3667974, + "beginOffset": 3667243, + "headersEndOffset": 3667974, + "endOffset": 3669418, "children": [ { "mimeType": "text/plain", "lineNumber": 50698, - "begin": 3668020, - "headersEnd": 3668048, - "end": 3668234, + "beginOffset": 3668020, + "headersEndOffset": 3668048, + "endOffset": 3668234, "octets": 186, "lines": 6 }, { "mimeType": "application/postscript", "lineNumber": 50708, - "begin": 3668280, - "headersEnd": 3668355, - "end": 3669259, + "beginOffset": 3668280, + "headersEndOffset": 3668355, + "endOffset": 3669259, "octets": 904, "lines": 12 } ], - "end": 3669418, "octets": 1444, "lines": 33 }, - "end": 3669418, "octets": 1444 }, { - "mboxMarkerBegin": 3669420, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3669420, "lineNumber": 50731, - "begin": 3669429, - "headersEnd": 3669982, + "beginOffset": 3669429, + "headersEndOffset": 3669982, + "endOffset": 3674811, "body": { "mimeType": "multipart/mixed", "lineNumber": 50731, - "begin": 3669429, - "headersEnd": 3669982, + "beginOffset": 3669429, + "headersEndOffset": 3669982, + "endOffset": 3674811, "children": [ { "mimeType": "text/plain", "lineNumber": 50748, - "begin": 3670061, - "headersEnd": 3670063, - "end": 3670465, + "beginOffset": 3670061, + "headersEndOffset": 3670063, + "endOffset": 3670465, "octets": 402, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 50761, - "begin": 3670507, - "headersEnd": 3670539, + "beginOffset": 3670507, + "headersEndOffset": 3670539, + "endOffset": 3674767, "message": { "lineNumber": 50763, - "begin": 3670539, - "headersEnd": 3671342, + "beginOffset": 3670539, + "headersEndOffset": 3671342, + "endOffset": 3674767, "body": { "mimeType": "text/plain", "lineNumber": 50763, - "begin": 3670539, - "headersEnd": 3671342, - "end": 3674767, + "beginOffset": 3670539, + "headersEndOffset": 3671342, + "endOffset": 3674767, "octets": 3425, "lines": 72 }, - "end": 3674767, "octets": 3425 }, - "end": 3674767, "octets": 4228, "lines": 88 } ], - "end": 3674811, "octets": 4829, "lines": 108 }, - "end": 3674811, "octets": 4829 }, { - "mboxMarkerBegin": 3674813, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3674813, "lineNumber": 50855, - "begin": 3674822, - "headersEnd": 3675488, + "beginOffset": 3674822, + "headersEndOffset": 3675488, + "endOffset": 3676752, "body": { "mimeType": "multipart/mixed", "lineNumber": 50855, - "begin": 3674822, - "headersEnd": 3675488, + "beginOffset": 3674822, + "headersEndOffset": 3675488, + "endOffset": 3676752, "children": [ { "mimeType": "text/plain", "lineNumber": 50873, - "begin": 3675538, - "headersEnd": 3675566, - "end": 3675644, + "beginOffset": 3675538, + "headersEndOffset": 3675566, + "endOffset": 3675644, "octets": 78, "lines": 5 }, { "mimeType": "message/rfc822", "lineNumber": 50881, - "begin": 3675696, - "headersEnd": 3675761, + "beginOffset": 3675696, + "headersEndOffset": 3675761, + "endOffset": 3676700, "message": { "lineNumber": 50884, - "begin": 3675761, - "headersEnd": 3676560, + "beginOffset": 3675761, + "headersEndOffset": 3676560, + "endOffset": 3676700, "body": { "mimeType": "text/plain", "lineNumber": 50884, - "begin": 3675761, - "headersEnd": 3676560, - "end": 3676700, + "beginOffset": 3675761, + "headersEndOffset": 3676560, + "endOffset": 3676700, "octets": 140, "lines": 4 }, - "end": 3676700, "octets": 140 }, - "end": 3676700, "octets": 939, "lines": 21 } ], - "end": 3676752, "octets": 1264, "lines": 34 }, - "end": 3676752, "octets": 1264 }, { - "mboxMarkerBegin": 3676754, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3676754, "lineNumber": 50907, - "begin": 3676763, - "headersEnd": 3677286, + "beginOffset": 3676763, + "headersEndOffset": 3677286, + "endOffset": 3678750, "body": { "mimeType": "Application/octet-stream", "lineNumber": 50907, - "begin": 3676763, - "headersEnd": 3677286, - "end": 3678750, + "beginOffset": 3676763, + "headersEndOffset": 3677286, + "endOffset": 3678750, "octets": 1464, "lines": 45 }, - "end": 3678750, "octets": 1464 }, { - "mboxMarkerBegin": 3678752, - "mboxMarkerLength": 50, + "mboxMarkerOffset": 3678752, "lineNumber": 50967, - "begin": 3678804, - "headersEnd": 3679391, + "beginOffset": 3678804, + "headersEndOffset": 3679391, + "endOffset": 3740046, "body": { "mimeType": "message/partial", "lineNumber": 50967, - "begin": 3678804, - "headersEnd": 3679391, - "end": 3740046, + "beginOffset": 3678804, + "headersEndOffset": 3679391, + "endOffset": 3740046, "octets": 60655, "lines": 954 }, - "end": 3740046, "octets": 60655 }, { - "mboxMarkerBegin": 3740048, - "mboxMarkerLength": 50, + "mboxMarkerOffset": 3740048, "lineNumber": 51938, - "begin": 3740100, - "headersEnd": 3740684, + "beginOffset": 3740100, + "headersEndOffset": 3740684, + "endOffset": 3801451, "body": { "mimeType": "message/partial", "lineNumber": 51938, - "begin": 3740100, - "headersEnd": 3740684, - "end": 3801451, + "beginOffset": 3740100, + "headersEndOffset": 3740684, + "endOffset": 3801451, "octets": 60767, "lines": 960 }, - "end": 3801451, "octets": 60767 }, { - "mboxMarkerBegin": 3801453, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3801453, "lineNumber": 52915, - "begin": 3801462, - "headersEnd": 3802023, + "beginOffset": 3801462, + "headersEndOffset": 3802023, + "endOffset": 3802919, "body": { "mimeType": "multipart/mixed", "lineNumber": 52915, - "begin": 3801462, - "headersEnd": 3802023, + "beginOffset": 3801462, + "headersEndOffset": 3802023, + "endOffset": 3802919, "children": [ { "mimeType": "text/plain", "lineNumber": 52930, - "begin": 3802041, - "headersEnd": 3802070, - "end": 3802145, + "beginOffset": 3802041, + "headersEndOffset": 3802070, + "endOffset": 3802145, "octets": 75, "lines": 4 }, { "mimeType": "text/plain", "lineNumber": 52938, - "begin": 3802163, - "headersEnd": 3802247, - "end": 3802897, + "beginOffset": 3802163, + "headersEndOffset": 3802247, + "endOffset": 3802897, "octets": 650, "lines": 9 } ], - "end": 3802919, "octets": 896, "lines": 25 }, - "end": 3802919, "octets": 896 }, { - "mboxMarkerBegin": 3802921, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3802921, "lineNumber": 52955, - "begin": 3802930, - "headersEnd": 3803695, + "beginOffset": 3802930, + "headersEndOffset": 3803695, + "endOffset": 3845795, "body": { "mimeType": "image/gif", "lineNumber": 52955, - "begin": 3802930, - "headersEnd": 3803695, - "end": 3845795, + "beginOffset": 3802930, + "headersEndOffset": 3803695, + "endOffset": 3845795, "octets": 42100, "lines": 570 }, - "end": 3845795, "octets": 42100 }, { - "mboxMarkerBegin": 3845797, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3845797, "lineNumber": 53545, - "begin": 3845806, - "headersEnd": 3846985, + "beginOffset": 3845806, + "headersEndOffset": 3846985, + "endOffset": 3855393, "body": { "mimeType": "multipart/mixed", "lineNumber": 53545, - "begin": 3845806, - "headersEnd": 3846985, + "beginOffset": 3845806, + "headersEndOffset": 3846985, + "endOffset": 3855393, "children": [ { "mimeType": "text/plain", "lineNumber": 53571, - "begin": 3846991, - "headersEnd": 3846993, - "end": 3848958, + "beginOffset": 3846991, + "headersEndOffset": 3846993, + "endOffset": 3848958, "octets": 1965, "lines": 43 }, { "mimeType": "image/gif", "lineNumber": 53617, - "begin": 3848966, - "headersEnd": 3849075, - "end": 3855383, + "beginOffset": 3848966, + "headersEndOffset": 3849075, + "endOffset": 3855383, "octets": 6308, "lines": 86 } ], - "end": 3855393, "octets": 8408, "lines": 139 }, - "end": 3855393, "octets": 8408 }, { - "mboxMarkerBegin": 3855395, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3855395, "lineNumber": 53711, - "begin": 3855404, - "headersEnd": 3856880, + "beginOffset": 3855404, + "headersEndOffset": 3856880, + "endOffset": 3965263, "body": { "mimeType": "application/octet-stream", "lineNumber": 53711, - "begin": 3855404, - "headersEnd": 3856880, - "end": 3965263, + "beginOffset": 3855404, + "headersEndOffset": 3856880, + "endOffset": 3965263, "octets": 108383, "lines": 1570 }, - "end": 3965263, "octets": 108383 }, { - "mboxMarkerBegin": 3965265, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3965265, "lineNumber": 55311, - "begin": 3965274, - "headersEnd": 3965889, + "beginOffset": 3965274, + "headersEndOffset": 3965889, + "endOffset": 3969308, "body": { "mimeType": "message/rfc822", "lineNumber": 55311, - "begin": 3965274, - "headersEnd": 3965889, + "beginOffset": 3965274, + "headersEndOffset": 3965889, + "endOffset": 3969308, "message": { "lineNumber": 55327, - "begin": 3965889, - "headersEnd": 3966475, + "beginOffset": 3965889, + "headersEndOffset": 3966475, + "endOffset": 3969308, "body": { "mimeType": "message/rfc822", "lineNumber": 55327, - "begin": 3965889, - "headersEnd": 3966475, + "beginOffset": 3965889, + "headersEndOffset": 3966475, + "endOffset": 3969308, "message": { "lineNumber": 55343, - "begin": 3966475, - "headersEnd": 3967033, + "beginOffset": 3966475, + "headersEndOffset": 3967033, + "endOffset": 3969308, "body": { "mimeType": "message/rfc822", "lineNumber": 55343, - "begin": 3966475, - "headersEnd": 3967033, + "beginOffset": 3966475, + "headersEndOffset": 3967033, + "endOffset": 3969308, "message": { "lineNumber": 55359, - "begin": 3967033, - "headersEnd": 3967597, + "beginOffset": 3967033, + "headersEndOffset": 3967597, + "endOffset": 3969308, "body": { "mimeType": "multipart/mixed", "lineNumber": 55359, - "begin": 3967033, - "headersEnd": 3967597, + "beginOffset": 3967033, + "headersEndOffset": 3967597, + "endOffset": 3969308, "children": [ { "mimeType": "text/plain", "lineNumber": 55378, - "begin": 3967704, - "headersEnd": 3967783, - "end": 3967833, + "beginOffset": 3967704, + "headersEndOffset": 3967783, + "endOffset": 3967833, "octets": 50, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 55384, - "begin": 3967894, - "headersEnd": 3967959, + "beginOffset": 3967894, + "headersEndOffset": 3967959, + "endOffset": 3969241, "message": { "lineNumber": 55387, - "begin": 3967959, - "headersEnd": 3968475, + "beginOffset": 3967959, + "headersEndOffset": 3968475, + "endOffset": 3969241, "body": { "mimeType": "multipart/mixed", "lineNumber": 55387, - "begin": 3967959, - "headersEnd": 3968475, + "beginOffset": 3967959, + "headersEndOffset": 3968475, + "endOffset": 3969241, "children": [ { "mimeType": "text/plain", "lineNumber": 55406, - "begin": 3968572, - "headersEnd": 3968651, - "end": 3968778, + "beginOffset": 3968572, + "headersEndOffset": 3968651, + "endOffset": 3968778, "octets": 127, "lines": 5 }, { "mimeType": "text/html", "lineNumber": 55416, - "begin": 3968829, - "headersEnd": 3968901, - "end": 3969188, + "beginOffset": 3968829, + "headersEndOffset": 3968901, + "endOffset": 3969188, "octets": 287, "lines": 5 } ], - "end": 3969241, "octets": 766, "lines": 22 }, - "end": 3969241, "octets": 766 }, - "end": 3969241, "octets": 1282, "lines": 38 } ], - "end": 3969308, "octets": 1711, "lines": 54 }, - "end": 3969308, "octets": 1711 }, - "end": 3969308, "octets": 2275, "lines": 70 }, - "end": 3969308, "octets": 2275 }, - "end": 3969308, "octets": 2833, "lines": 86 }, - "end": 3969308, "octets": 2833 }, - "end": 3969308, "octets": 3419, "lines": 102 }, - "end": 3969308, "octets": 3419 }, { - "mboxMarkerBegin": 3969310, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3969310, "lineNumber": 55431, - "begin": 3969319, - "headersEnd": 3970038, + "beginOffset": 3969319, + "headersEndOffset": 3970038, + "endOffset": 4233718, "body": { "mimeType": "multipart/mixed", "lineNumber": 55431, - "begin": 3969319, - "headersEnd": 3970038, + "beginOffset": 3969319, + "headersEndOffset": 3970038, + "endOffset": 4233718, "children": [ { "mimeType": "text/plain", "lineNumber": 55448, - "begin": 3970066, - "headersEnd": 3970068, - "end": 3970110, + "beginOffset": 3970066, + "headersEndOffset": 3970068, + "endOffset": 3970110, "octets": 42, "lines": 2 }, { "mimeType": "image/pbm", "lineNumber": 55452, - "begin": 3970140, - "headersEnd": 3970290, - "end": 4047906, + "beginOffset": 3970140, + "headersEndOffset": 3970290, + "endOffset": 4047906, "octets": 77616, "lines": 401 }, { "mimeType": "text/plain", "lineNumber": 55859, - "begin": 4047936, - "headersEnd": 4047938, - "end": 4047972, + "beginOffset": 4047936, + "headersEndOffset": 4047938, + "endOffset": 4047972, "octets": 34, "lines": 3 }, { "mimeType": "audio/basic", "lineNumber": 55865, - "begin": 4048002, - "headersEnd": 4048154, - "end": 4151890, + "beginOffset": 4048002, + "headersEndOffset": 4048154, + "endOffset": 4151890, "octets": 103736, "lines": 535 }, { "mimeType": "text/plain", "lineNumber": 56406, - "begin": 4151920, - "headersEnd": 4151922, - "end": 4152086, + "beginOffset": 4151920, + "headersEndOffset": 4151922, + "endOffset": 4152086, "octets": 164, "lines": 5 }, { "mimeType": "application/x-annotate", "lineNumber": 56413, - "begin": 4152116, - "headersEnd": 4152208, - "end": 4233632, + "beginOffset": 4152116, + "headersEndOffset": 4152208, + "endOffset": 4233632, "octets": 81424, "lines": 1235 }, { "mimeType": "text/plain", "lineNumber": 57652, - "begin": 4233662, - "headersEnd": 4233664, - "end": 4233686, + "beginOffset": 4233662, + "headersEndOffset": 4233664, + "endOffset": 4233686, "octets": 22, "lines": 3 } ], - "end": 4233718, "octets": 263680, "lines": 2210 }, - "end": 4233718, "octets": 263680 }, { - "mboxMarkerBegin": 4233720, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4233720, "lineNumber": 57659, - "begin": 4233729, - "headersEnd": 4234408, + "beginOffset": 4233729, + "headersEndOffset": 4234408, + "endOffset": 4235418, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 57659, - "begin": 4233729, - "headersEnd": 4234408, - "end": 4235418, + "beginOffset": 4233729, + "headersEndOffset": 4234408, + "endOffset": 4235418, "octets": 1010, "lines": 18 }, - "end": 4235418, "octets": 1010 }, { - "mboxMarkerBegin": 4235420, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4235420, "lineNumber": 57693, - "begin": 4235429, - "headersEnd": 4236508, + "beginOffset": 4235429, + "headersEndOffset": 4236508, + "endOffset": 4239644, "body": { "mimeType": "multipart/alternative", "lineNumber": 57693, - "begin": 4235429, - "headersEnd": 4236508, + "beginOffset": 4235429, + "headersEndOffset": 4236508, + "endOffset": 4239644, "children": [ { "mimeType": "text/plain", "lineNumber": 57720, - "begin": 4236707, - "headersEnd": 4236753, - "end": 4237170, + "beginOffset": 4236707, + "headersEndOffset": 4236753, + "endOffset": 4237170, "octets": 417, "lines": 13 }, { "mimeType": "multipart/mixed", "lineNumber": 57737, - "begin": 4237213, - "headersEnd": 4237301, + "beginOffset": 4237213, + "headersEndOffset": 4237301, + "endOffset": 4239599, "children": [ { "mimeType": "text/richtext", "lineNumber": 57741, - "begin": 4237344, - "headersEnd": 4237438, - "end": 4237667, + "beginOffset": 4237344, + "headersEndOffset": 4237438, + "endOffset": 4237667, "octets": 229, "lines": 4 }, { "mimeType": "image/x-xbm", "lineNumber": 57750, - "begin": 4237712, - "headersEnd": 4237835, - "end": 4239256, + "beginOffset": 4237712, + "headersEndOffset": 4237835, + "endOffset": 4239256, "octets": 1421, "lines": 37 }, { "mimeType": "text/richtext", "lineNumber": 57793, - "begin": 4239301, - "headersEnd": 4239395, - "end": 4239552, + "beginOffset": 4239301, + "headersEndOffset": 4239395, + "endOffset": 4239552, "octets": 157, "lines": 9 } ], - "end": 4239599, "octets": 2298, "lines": 67 } ], - "end": 4239644, "octets": 3136, "lines": 93 }, - "end": 4239644, "octets": 3136 }, { - "mboxMarkerBegin": 4239646, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4239646, "lineNumber": 57811, - "begin": 4239655, - "headersEnd": 4240341, + "beginOffset": 4239655, + "headersEndOffset": 4240341, + "endOffset": 4245810, "body": { "mimeType": "multipart/mixed", "lineNumber": 57811, - "begin": 4239655, - "headersEnd": 4240341, + "beginOffset": 4239655, + "headersEndOffset": 4240341, + "endOffset": 4245810, "children": [ { "mimeType": "text/plain", "lineNumber": 57828, - "begin": 4240358, - "headersEnd": 4240387, - "end": 4240471, + "beginOffset": 4240358, + "headersEndOffset": 4240387, + "endOffset": 4240471, "octets": 84, "lines": 6 }, { "mimeType": "image/gif", "lineNumber": 57838, - "begin": 4240490, - "headersEnd": 4240553, - "end": 4245787, + "beginOffset": 4240490, + "headersEndOffset": 4240553, + "endOffset": 4245787, "octets": 5234, "lines": 71 } ], - "end": 4245810, "octets": 5469, "lines": 88 }, - "end": 4245810, "octets": 5469 }, { - "mboxMarkerBegin": 4245812, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4245812, "lineNumber": 57917, - "begin": 4245821, - "headersEnd": 4246287, + "beginOffset": 4245821, + "headersEndOffset": 4246287, + "endOffset": 4257886, "body": { "mimeType": "Image/JPEG", "lineNumber": 57917, - "begin": 4245821, - "headersEnd": 4246287, - "end": 4257886, + "beginOffset": 4245821, + "headersEndOffset": 4246287, + "endOffset": 4257886, "octets": 11599, "lines": 185 }, - "end": 4257886, "octets": 11599 }, { - "mboxMarkerBegin": 4257888, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4257888, "lineNumber": 58118, - "begin": 4257897, - "headersEnd": 4258477, + "beginOffset": 4257897, + "headersEndOffset": 4258477, + "endOffset": 4259836, "body": { "mimeType": "Multipart/Mixed", "lineNumber": 58118, - "begin": 4257897, - "headersEnd": 4258477, + "beginOffset": 4257897, + "headersEndOffset": 4258477, + "endOffset": 4259836, "children": [ { "mimeType": "text/plain", "lineNumber": 58134, - "begin": 4258489, - "headersEnd": 4258491, - "end": 4258530, + "beginOffset": 4258489, + "headersEndOffset": 4258491, + "endOffset": 4258530, "octets": 39, "lines": 1 }, { "mimeType": "Multipart/MIXED", "lineNumber": 58138, - "begin": 4258544, - "headersEnd": 4258601, + "beginOffset": 4258544, + "headersEndOffset": 4258601, + "endOffset": 4259820, "children": [ { "mimeType": "Message/External-body", "lineNumber": 58141, - "begin": 4258616, - "headersEnd": 4258736, + "beginOffset": 4258616, + "headersEndOffset": 4258736, + "endOffset": 4258885, "message": { "lineNumber": 58145, - "begin": 4258736, - "headersEnd": 4258816, + "beginOffset": 4258736, + "headersEndOffset": 4258816, + "endOffset": 4258885, "body": { "mimeType": "text/plain", "lineNumber": 58145, - "begin": 4258736, - "headersEnd": 4258816, - "end": 4258885, + "beginOffset": 4258736, + "headersEndOffset": 4258816, + "endOffset": 4258885, "octets": 69, "lines": 2 }, - "end": 4258885, "octets": 69 }, - "end": 4258885, "octets": 149, "lines": 5 }, { "mimeType": "Message/External-body", "lineNumber": 58152, - "begin": 4258902, - "headersEnd": 4259095, + "beginOffset": 4258902, + "headersEndOffset": 4259095, + "endOffset": 4259173, "message": { "lineNumber": 58158, - "begin": 4259095, - "headersEnd": 4259173, + "beginOffset": 4259095, + "headersEndOffset": 4259173, + "endOffset": 4259173, "body": { "mimeType": "text/plain", "lineNumber": 58158, - "begin": 4259095, - "headersEnd": 4259173, - "end": 4259173, + "beginOffset": 4259095, + "headersEndOffset": 4259173, + "endOffset": 4259173, "octets": 0, "lines": 0 }, - "end": 4259173, "octets": 0 }, - "end": 4259173, "octets": 78, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 58162, - "begin": 4259190, - "headersEnd": 4259332, + "beginOffset": 4259190, + "headersEndOffset": 4259332, + "endOffset": 4259401, "message": { "lineNumber": 58169, - "begin": 4259332, - "headersEnd": 4259401, + "beginOffset": 4259332, + "headersEndOffset": 4259401, + "endOffset": 4259401, "body": { "mimeType": "TEXT/HTML", "lineNumber": 58169, - "begin": 4259332, - "headersEnd": 4259401, - "end": 4259401, + "beginOffset": 4259332, + "headersEndOffset": 4259401, + "endOffset": 4259401, "octets": 0, "lines": 0 }, - "end": 4259401, "octets": 0 }, - "end": 4259401, "octets": 69, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 58173, - "begin": 4259418, - "headersEnd": 4259535, + "beginOffset": 4259418, + "headersEndOffset": 4259535, + "endOffset": 4259605, "message": { "lineNumber": 58177, - "begin": 4259535, - "headersEnd": 4259605, + "beginOffset": 4259535, + "headersEndOffset": 4259605, + "endOffset": 4259605, "body": { "mimeType": "image/gif", "lineNumber": 58177, - "begin": 4259535, - "headersEnd": 4259605, - "end": 4259605, + "beginOffset": 4259535, + "headersEndOffset": 4259605, + "endOffset": 4259605, "octets": 0, "lines": 0 }, - "end": 4259605, "octets": 0 }, - "end": 4259605, "octets": 70, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 58181, - "begin": 4259622, - "headersEnd": 4259731, + "beginOffset": 4259622, + "headersEndOffset": 4259731, + "endOffset": 4259801, "message": { "lineNumber": 58185, - "begin": 4259731, - "headersEnd": 4259801, + "beginOffset": 4259731, + "headersEndOffset": 4259801, + "endOffset": 4259801, "body": { "mimeType": "image/gif", "lineNumber": 58185, - "begin": 4259731, - "headersEnd": 4259801, - "end": 4259801, + "beginOffset": 4259731, + "headersEndOffset": 4259801, + "endOffset": 4259801, "octets": 0, "lines": 0 }, - "end": 4259801, "octets": 0 }, - "end": 4259801, "octets": 70, "lines": 2 } ], - "end": 4259820, "octets": 1219, "lines": 49 } ], - "end": 4259836, "octets": 1359, "lines": 58 }, - "end": 4259836, "octets": 1359 }, { - "mboxMarkerBegin": 4259838, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4259838, "lineNumber": 58193, - "begin": 4259847, - "headersEnd": 4260427, + "beginOffset": 4259847, + "headersEndOffset": 4260427, + "endOffset": 4264394, "body": { "mimeType": "Multipart/Mixed", "lineNumber": 58193, - "begin": 4259847, - "headersEnd": 4260427, + "beginOffset": 4259847, + "headersEndOffset": 4260427, + "endOffset": 4264394, "children": [ { "mimeType": "text/plain", "lineNumber": 58209, - "begin": 4260439, - "headersEnd": 4260441, - "end": 4263710, + "beginOffset": 4260439, + "headersEndOffset": 4260441, + "endOffset": 4263710, "octets": 3269, "lines": 65 }, { "mimeType": "Multipart/Alternative", "lineNumber": 58277, - "begin": 4263724, - "headersEnd": 4263787, + "beginOffset": 4263724, + "headersEndOffset": 4263787, + "endOffset": 4264378, "children": [ { "mimeType": "Message/External-body", "lineNumber": 58280, - "begin": 4263802, - "headersEnd": 4263922, + "beginOffset": 4263802, + "headersEndOffset": 4263922, + "endOffset": 4264071, "message": { "lineNumber": 58284, - "begin": 4263922, - "headersEnd": 4264002, + "beginOffset": 4263922, + "headersEndOffset": 4264002, + "endOffset": 4264071, "body": { "mimeType": "text/plain", "lineNumber": 58284, - "begin": 4263922, - "headersEnd": 4264002, - "end": 4264071, + "beginOffset": 4263922, + "headersEndOffset": 4264002, + "endOffset": 4264071, "octets": 69, "lines": 2 }, - "end": 4264071, "octets": 69 }, - "end": 4264071, "octets": 149, "lines": 5 }, { "mimeType": "Message/External-body", "lineNumber": 58291, - "begin": 4264088, - "headersEnd": 4264281, + "beginOffset": 4264088, + "headersEndOffset": 4264281, + "endOffset": 4264359, "message": { "lineNumber": 58297, - "begin": 4264281, - "headersEnd": 4264359, + "beginOffset": 4264281, + "headersEndOffset": 4264359, + "endOffset": 4264359, "body": { "mimeType": "text/plain", "lineNumber": 58297, - "begin": 4264281, - "headersEnd": 4264359, - "end": 4264359, + "beginOffset": 4264281, + "headersEndOffset": 4264359, + "endOffset": 4264359, "octets": 0, "lines": 0 }, - "end": 4264359, "octets": 0 }, - "end": 4264359, "octets": 78, "lines": 2 } ], - "end": 4264378, "octets": 591, "lines": 22 } ], - "end": 4264394, "octets": 3967, "lines": 95 }, - "end": 4264394, "octets": 3967 }, { - "mboxMarkerBegin": 4264396, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4264396, "lineNumber": 58305, - "begin": 4264405, - "headersEnd": 4264885, + "beginOffset": 4264405, + "headersEndOffset": 4264885, + "endOffset": 4270786, "body": { "mimeType": "multipart/mixed", "lineNumber": 58305, - "begin": 4264405, - "headersEnd": 4264885, + "beginOffset": 4264405, + "headersEndOffset": 4264885, + "endOffset": 4270786, "children": [ { "mimeType": "message/rfc822", "lineNumber": 58320, - "begin": 4264961, - "headersEnd": 4265110, + "beginOffset": 4264961, + "headersEndOffset": 4265110, + "endOffset": 4265589, "message": { "lineNumber": 58325, - "begin": 4265110, - "headersEnd": 4265550, + "beginOffset": 4265110, + "headersEndOffset": 4265550, + "endOffset": 4265589, "body": { "mimeType": "text/plain", "lineNumber": 58325, - "begin": 4265110, - "headersEnd": 4265550, - "end": 4265589, + "beginOffset": 4265110, + "headersEndOffset": 4265550, + "endOffset": 4265589, "octets": 39, "lines": 2 }, - "end": 4265589, "octets": 39 }, - "end": 4265589, "octets": 479, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 58340, - "begin": 4265619, - "headersEnd": 4265746, - "end": 4266210, + "beginOffset": 4265619, + "headersEndOffset": 4265746, + "endOffset": 4266210, "octets": 464, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58352, - "begin": 4266240, - "headersEnd": 4266367, - "end": 4266859, + "beginOffset": 4266240, + "headersEndOffset": 4266367, + "endOffset": 4266859, "octets": 492, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58364, - "begin": 4266889, - "headersEnd": 4267020, - "end": 4267554, + "beginOffset": 4266889, + "headersEndOffset": 4267020, + "endOffset": 4267554, "octets": 534, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 58377, - "begin": 4267584, - "headersEnd": 4267713, - "end": 4268217, + "beginOffset": 4267584, + "headersEndOffset": 4267713, + "endOffset": 4268217, "octets": 504, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 58389, - "begin": 4268247, - "headersEnd": 4268396, + "beginOffset": 4268247, + "headersEndOffset": 4268396, + "endOffset": 4268874, "message": { "lineNumber": 58394, - "begin": 4268396, - "headersEnd": 4268836, + "beginOffset": 4268396, + "headersEndOffset": 4268836, + "endOffset": 4268874, "body": { "mimeType": "text/plain", "lineNumber": 58394, - "begin": 4268396, - "headersEnd": 4268836, - "end": 4268874, + "beginOffset": 4268396, + "headersEndOffset": 4268836, + "endOffset": 4268874, "octets": 38, "lines": 1 }, - "end": 4268874, "octets": 38 }, - "end": 4268874, "octets": 478, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 58408, - "begin": 4268904, - "headersEnd": 4269080, + "beginOffset": 4268904, + "headersEndOffset": 4269080, + "endOffset": 4270617, "message": { "lineNumber": 58413, - "begin": 4269080, - "headersEnd": 4269665, + "beginOffset": 4269080, + "headersEndOffset": 4269665, + "endOffset": 4270617, "body": { "mimeType": "message/rfc822", "lineNumber": 58413, - "begin": 4269080, - "headersEnd": 4269665, + "beginOffset": 4269080, + "headersEndOffset": 4269665, + "endOffset": 4270617, "message": { "lineNumber": 58428, - "begin": 4269665, - "headersEnd": 4270190, + "beginOffset": 4269665, + "headersEndOffset": 4270190, + "endOffset": 4270617, "body": { "mimeType": "message/rfc822", "lineNumber": 58428, - "begin": 4269665, - "headersEnd": 4270190, + "beginOffset": 4269665, + "headersEndOffset": 4270190, + "endOffset": 4270617, "message": { "lineNumber": 58442, - "begin": 4270190, - "headersEnd": 4270611, + "beginOffset": 4270190, + "headersEndOffset": 4270611, + "endOffset": 4270617, "body": { "mimeType": "text/plain", "lineNumber": 58442, - "begin": 4270190, - "headersEnd": 4270611, - "end": 4270617, + "beginOffset": 4270190, + "headersEndOffset": 4270611, + "endOffset": 4270617, "octets": 6, "lines": 1 }, - "end": 4270617, "octets": 6 }, - "end": 4270617, "octets": 427, "lines": 12 }, - "end": 4270617, "octets": 427 }, - "end": 4270617, "octets": 952, "lines": 26 }, - "end": 4270617, "octets": 952 }, - "end": 4270617, "octets": 1537, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 58456, - "begin": 4270647, - "headersEnd": 4270703, - "end": 4270756, + "beginOffset": 4270647, + "headersEndOffset": 4270703, + "endOffset": 4270756, "octets": 53, "lines": 1 } ], - "end": 4270786, "octets": 5901, "lines": 145 }, - "end": 4270786, "octets": 5901 }, { - "mboxMarkerBegin": 4270788, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4270788, "lineNumber": 58463, - "begin": 4270797, - "headersEnd": 4271280, + "beginOffset": 4270797, + "headersEndOffset": 4271280, + "endOffset": 4277216, "body": { "mimeType": "multipart/mixed", "lineNumber": 58463, - "begin": 4270797, - "headersEnd": 4271280, + "beginOffset": 4270797, + "headersEndOffset": 4271280, + "endOffset": 4277216, "children": [ { "mimeType": "message/rfc822", "lineNumber": 58478, - "begin": 4271356, - "headersEnd": 4271509, + "beginOffset": 4271356, + "headersEndOffset": 4271509, + "endOffset": 4271987, "message": { "lineNumber": 58483, - "begin": 4271509, - "headersEnd": 4271948, + "beginOffset": 4271509, + "headersEndOffset": 4271948, + "endOffset": 4271987, "body": { "mimeType": "text/plain", "lineNumber": 58483, - "begin": 4271509, - "headersEnd": 4271948, - "end": 4271987, + "beginOffset": 4271509, + "headersEndOffset": 4271948, + "endOffset": 4271987, "octets": 39, "lines": 2 }, - "end": 4271987, "octets": 39 }, - "end": 4271987, "octets": 478, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 58498, - "begin": 4272017, - "headersEnd": 4272148, - "end": 4272612, + "beginOffset": 4272017, + "headersEndOffset": 4272148, + "endOffset": 4272612, "octets": 464, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58510, - "begin": 4272642, - "headersEnd": 4272773, - "end": 4273265, + "beginOffset": 4272642, + "headersEndOffset": 4272773, + "endOffset": 4273265, "octets": 492, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58522, - "begin": 4273295, - "headersEnd": 4273430, - "end": 4273964, + "beginOffset": 4273295, + "headersEndOffset": 4273430, + "endOffset": 4273964, "octets": 534, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 58535, - "begin": 4273994, - "headersEnd": 4274127, - "end": 4274631, + "beginOffset": 4273994, + "headersEndOffset": 4274127, + "endOffset": 4274631, "octets": 504, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 58547, - "begin": 4274661, - "headersEnd": 4274814, + "beginOffset": 4274661, + "headersEndOffset": 4274814, + "endOffset": 4275291, "message": { "lineNumber": 58552, - "begin": 4274814, - "headersEnd": 4275253, + "beginOffset": 4274814, + "headersEndOffset": 4275253, + "endOffset": 4275291, "body": { "mimeType": "text/plain", "lineNumber": 58552, - "begin": 4274814, - "headersEnd": 4275253, - "end": 4275291, + "beginOffset": 4274814, + "headersEndOffset": 4275253, + "endOffset": 4275291, "octets": 38, "lines": 1 }, - "end": 4275291, "octets": 38 }, - "end": 4275291, "octets": 477, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 58566, - "begin": 4275321, - "headersEnd": 4275501, + "beginOffset": 4275321, + "headersEndOffset": 4275501, + "endOffset": 4277043, "message": { "lineNumber": 58571, - "begin": 4275501, - "headersEnd": 4276089, + "beginOffset": 4275501, + "headersEndOffset": 4276089, + "endOffset": 4277043, "body": { "mimeType": "message/rfc822", "lineNumber": 58571, - "begin": 4275501, - "headersEnd": 4276089, + "beginOffset": 4275501, + "headersEndOffset": 4276089, + "endOffset": 4277043, "message": { "lineNumber": 58586, - "begin": 4276089, - "headersEnd": 4276617, + "beginOffset": 4276089, + "headersEndOffset": 4276617, + "endOffset": 4277043, "body": { "mimeType": "message/rfc822", "lineNumber": 58586, - "begin": 4276089, - "headersEnd": 4276617, + "beginOffset": 4276089, + "headersEndOffset": 4276617, + "endOffset": 4277043, "message": { "lineNumber": 58600, - "begin": 4276617, - "headersEnd": 4277037, + "beginOffset": 4276617, + "headersEndOffset": 4277037, + "endOffset": 4277043, "body": { "mimeType": "text/plain", "lineNumber": 58600, - "begin": 4276617, - "headersEnd": 4277037, - "end": 4277043, + "beginOffset": 4276617, + "headersEndOffset": 4277037, + "endOffset": 4277043, "octets": 6, "lines": 1 }, - "end": 4277043, "octets": 6 }, - "end": 4277043, "octets": 426, "lines": 12 }, - "end": 4277043, "octets": 426 }, - "end": 4277043, "octets": 954, "lines": 26 }, - "end": 4277043, "octets": 954 }, - "end": 4277043, "octets": 1542, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 58614, - "begin": 4277073, - "headersEnd": 4277133, - "end": 4277186, + "beginOffset": 4277073, + "headersEndOffset": 4277133, + "endOffset": 4277186, "octets": 53, "lines": 1 } ], - "end": 4277216, "octets": 5936, "lines": 145 }, - "end": 4277216, "octets": 5936 }, { - "mboxMarkerBegin": 4277218, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4277218, "lineNumber": 58621, - "begin": 4277227, - "headersEnd": 4277931, + "beginOffset": 4277227, + "headersEndOffset": 4277931, + "endOffset": 4298376, "body": { "mimeType": "multipart/mixed", "lineNumber": 58621, - "begin": 4277227, - "headersEnd": 4277931, + "beginOffset": 4277227, + "headersEndOffset": 4277931, + "endOffset": 4298376, "children": [ { "mimeType": "text/richtext", "lineNumber": 58641, - "begin": 4277981, - "headersEnd": 4278012, - "end": 4278458, + "beginOffset": 4277981, + "headersEndOffset": 4278012, + "endOffset": 4278458, "octets": 446, "lines": 30 }, { "mimeType": "text/enriched", "lineNumber": 58675, - "begin": 4278467, - "headersEnd": 4278543, - "end": 4279216, + "beginOffset": 4278467, + "headersEndOffset": 4278543, + "endOffset": 4279216, "octets": 673, "lines": 42 }, { "mimeType": "text/plain", "lineNumber": 58722, - "begin": 4279225, - "headersEnd": 4279227, - "end": 4279245, + "beginOffset": 4279225, + "headersEndOffset": 4279227, + "endOffset": 4279245, "octets": 18, "lines": 1 }, { "mimeType": "text/plain", "lineNumber": 58725, - "begin": 4279254, - "headersEnd": 4279256, - "end": 4279267, + "beginOffset": 4279254, + "headersEndOffset": 4279256, + "endOffset": 4279267, "octets": 11, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 58728, - "begin": 4279276, - "headersEnd": 4279308, + "beginOffset": 4279276, + "headersEndOffset": 4279308, + "endOffset": 4279824, "message": { "lineNumber": 58730, - "begin": 4279308, - "headersEnd": 4279530, + "beginOffset": 4279308, + "headersEndOffset": 4279530, + "endOffset": 4279824, "body": { "mimeType": "multipart/mixed", "lineNumber": 58730, - "begin": 4279308, - "headersEnd": 4279530, + "beginOffset": 4279308, + "headersEndOffset": 4279530, + "endOffset": 4279824, "children": [ { "mimeType": "text/html", "lineNumber": 58738, - "begin": 4279537, - "headersEnd": 4279564, - "end": 4279587, + "beginOffset": 4279537, + "headersEndOffset": 4279564, + "endOffset": 4279587, "octets": 23, "lines": 1 }, { "mimeType": "image/unknown", "lineNumber": 58742, - "begin": 4279596, - "headersEnd": 4279776, - "end": 4279815, + "beginOffset": 4279596, + "headersEndOffset": 4279776, + "endOffset": 4279815, "octets": 39, "lines": 1 } ], - "end": 4279824, "octets": 294, "lines": 13 }, - "end": 4279824, "octets": 294 }, - "end": 4279824, "octets": 516, "lines": 20 }, { "mimeType": "image/x-xbitmap", "lineNumber": 58751, - "begin": 4279833, - "headersEnd": 4279914, - "end": 4289472, + "beginOffset": 4279833, + "headersEndOffset": 4279914, + "endOffset": 4289472, "octets": 9558, "lines": 128 }, { "mimeType": "image/unknown", "lineNumber": 58883, - "begin": 4289481, - "headersEnd": 4289661, - "end": 4289700, + "beginOffset": 4289481, + "headersEndOffset": 4289661, + "endOffset": 4289700, "octets": 39, "lines": 1 }, { "mimeType": "image/x-xbitmap", "lineNumber": 58891, - "begin": 4289709, - "headersEnd": 4289861, - "end": 4297809, + "beginOffset": 4289709, + "headersEndOffset": 4289861, + "endOffset": 4297809, "octets": 7948, "lines": 128 }, { "mimeType": "multipart/digest", "lineNumber": 59024, - "begin": 4297818, - "headersEnd": 4297872, + "beginOffset": 4297818, + "headersEndOffset": 4297872, + "endOffset": 4298324, "children": [ { "mimeType": "message/rfc822", "lineNumber": 59027, - "begin": 4297883, - "headersEnd": 4297885, + "beginOffset": 4297883, + "headersEndOffset": 4297885, + "endOffset": 4297919, "message": { "lineNumber": 59028, - "begin": 4297885, - "headersEnd": 4297914, + "beginOffset": 4297885, + "headersEndOffset": 4297914, + "endOffset": 4297919, "body": { "mimeType": "text/plain", "lineNumber": 59028, - "begin": 4297885, - "headersEnd": 4297914, - "end": 4297919, + "beginOffset": 4297885, + "headersEndOffset": 4297914, + "endOffset": 4297919, "octets": 5, "lines": 1 }, - "end": 4297919, "octets": 5 }, - "end": 4297919, "octets": 34, "lines": 4 }, { "mimeType": "message/rfc822", "lineNumber": 59033, - "begin": 4297932, - "headersEnd": 4297934, + "beginOffset": 4297932, + "headersEndOffset": 4297934, + "endOffset": 4297968, "message": { "lineNumber": 59034, - "begin": 4297934, - "headersEnd": 4297963, + "beginOffset": 4297934, + "headersEndOffset": 4297963, + "endOffset": 4297968, "body": { "mimeType": "text/plain", "lineNumber": 59034, - "begin": 4297934, - "headersEnd": 4297963, - "end": 4297968, + "beginOffset": 4297934, + "headersEndOffset": 4297963, + "endOffset": 4297968, "octets": 5, "lines": 1 }, - "end": 4297968, "octets": 5 }, - "end": 4297968, "octets": 34, "lines": 4 }, { "mimeType": "message/rfc822", "lineNumber": 59039, - "begin": 4297981, - "headersEnd": 4297983, + "beginOffset": 4297981, + "headersEndOffset": 4297983, + "endOffset": 4298017, "message": { "lineNumber": 59040, - "begin": 4297983, - "headersEnd": 4298012, + "beginOffset": 4297983, + "headersEndOffset": 4298012, + "endOffset": 4298017, "body": { "mimeType": "text/plain", "lineNumber": 59040, - "begin": 4297983, - "headersEnd": 4298012, - "end": 4298017, + "beginOffset": 4297983, + "headersEndOffset": 4298012, + "endOffset": 4298017, "octets": 5, "lines": 1 }, - "end": 4298017, "octets": 5 }, - "end": 4298017, "octets": 34, "lines": 4 }, { "mimeType": "text/html", "lineNumber": 59045, - "begin": 4298030, - "headersEnd": 4298057, - "end": 4298140, + "beginOffset": 4298030, + "headersEndOffset": 4298057, + "endOffset": 4298140, "octets": 83, "lines": 2 }, { "mimeType": "message/rfc822", "lineNumber": 59050, - "begin": 4298153, - "headersEnd": 4298155, + "beginOffset": 4298153, + "headersEndOffset": 4298155, + "endOffset": 4298262, "message": { "lineNumber": 59051, - "begin": 4298155, - "headersEnd": 4298213, + "beginOffset": 4298155, + "headersEndOffset": 4298213, + "endOffset": 4298262, "body": { "mimeType": "text/richtext", "lineNumber": 59051, - "begin": 4298155, - "headersEnd": 4298213, - "end": 4298262, + "beginOffset": 4298155, + "headersEndOffset": 4298213, + "endOffset": 4298262, "octets": 49, "lines": 1 }, - "end": 4298262, "octets": 49 }, - "end": 4298262, "octets": 107, "lines": 5 }, { "mimeType": "message/rfc822", "lineNumber": 59057, - "begin": 4298275, - "headersEnd": 4298277, + "beginOffset": 4298275, + "headersEndOffset": 4298277, + "endOffset": 4298311, "message": { "lineNumber": 59058, - "begin": 4298277, - "headersEnd": 4298306, + "beginOffset": 4298277, + "headersEndOffset": 4298306, + "endOffset": 4298311, "body": { "mimeType": "text/plain", "lineNumber": 59058, - "begin": 4298277, - "headersEnd": 4298306, - "end": 4298311, + "beginOffset": 4298277, + "headersEndOffset": 4298306, + "endOffset": 4298311, "octets": 5, "lines": 1 }, - "end": 4298311, "octets": 5 }, - "end": 4298311, "octets": 34, "lines": 4 } ], - "end": 4298324, "octets": 452, "lines": 37 } ], - "end": 4298376, "octets": 20445, "lines": 428 }, - "end": 4298376, "octets": 20445 }, { - "mboxMarkerBegin": 4298378, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4298378, "lineNumber": 59067, - "begin": 4298387, - "headersEnd": 4299063, + "beginOffset": 4298387, + "headersEndOffset": 4299063, + "endOffset": 4372265, "body": { "mimeType": "multipart/mixed", "lineNumber": 59067, - "begin": 4298387, - "headersEnd": 4299063, + "beginOffset": 4298387, + "headersEndOffset": 4299063, + "endOffset": 4372265, "children": [ { "mimeType": "text/plain", "lineNumber": 59083, - "begin": 4299090, - "headersEnd": 4299092, - "end": 4300338, + "beginOffset": 4299090, + "headersEndOffset": 4299092, + "endOffset": 4300338, "octets": 1246, "lines": 27 }, { "mimeType": "image/pbm", "lineNumber": 59112, - "begin": 4300367, - "headersEnd": 4300517, - "end": 4372203, + "beginOffset": 4300367, + "headersEndOffset": 4300517, + "endOffset": 4372203, "octets": 71686, "lines": 370 }, { "mimeType": "text/plain", "lineNumber": 59488, - "begin": 4372232, - "headersEnd": 4372234, - "end": 4372234, + "beginOffset": 4372232, + "headersEndOffset": 4372234, + "endOffset": 4372234, "octets": 0, "lines": 0 } ], - "end": 4372265, "octets": 73202, "lines": 409 }, - "end": 4372265, "octets": 73202 }, { - "mboxMarkerBegin": 4372267, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4372267, "lineNumber": 59493, - "begin": 4372276, - "headersEnd": 4373229, + "beginOffset": 4372276, + "headersEndOffset": 4373229, + "endOffset": 4625700, "body": { "mimeType": "message/partial", "lineNumber": 59493, - "begin": 4372276, - "headersEnd": 4373229, - "end": 4625700, + "beginOffset": 4372276, + "headersEndOffset": 4373229, + "endOffset": 4625700, "octets": 252471, "lines": 3430 }, - "end": 4625700, "octets": 252471 }, { - "mboxMarkerBegin": 4625702, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4625702, "lineNumber": 62945, - "begin": 4625711, - "headersEnd": 4626660, + "beginOffset": 4625711, + "headersEndOffset": 4626660, + "endOffset": 4682261, "body": { "mimeType": "multipart/mixed", "lineNumber": 62945, - "begin": 4625711, - "headersEnd": 4626660, + "beginOffset": 4625711, + "headersEndOffset": 4626660, + "endOffset": 4682261, "children": [ { "mimeType": "text/richtext", "lineNumber": 62971, - "begin": 4626905, - "headersEnd": 4626981, - "end": 4627454, + "beginOffset": 4626905, + "headersEndOffset": 4626981, + "endOffset": 4627454, "octets": 473, "lines": 9 }, { "mimeType": "image/gif", "lineNumber": 62985, - "begin": 4627502, - "headersEnd": 4627564, - "end": 4652132, + "beginOffset": 4627502, + "headersEndOffset": 4627564, + "endOffset": 4652132, "octets": 24568, "lines": 332 }, { "mimeType": "text/richtext", "lineNumber": 63322, - "begin": 4652180, - "headersEnd": 4652256, - "end": 4652714, + "beginOffset": 4652180, + "headersEndOffset": 4652256, + "endOffset": 4652714, "octets": 458, "lines": 10 }, { "mimeType": "image/gif", "lineNumber": 63337, - "begin": 4652762, - "headersEnd": 4652824, - "end": 4664192, + "beginOffset": 4652762, + "headersEndOffset": 4652824, + "endOffset": 4664192, "octets": 11368, "lines": 154 }, { "mimeType": "text/richtext", "lineNumber": 63496, - "begin": 4664240, - "headersEnd": 4664316, - "end": 4664626, + "beginOffset": 4664240, + "headersEndOffset": 4664316, + "endOffset": 4664626, "octets": 310, "lines": 6 }, { "mimeType": "image/gif", "lineNumber": 63507, - "begin": 4664674, - "headersEnd": 4664736, - "end": 4681412, + "beginOffset": 4664674, + "headersEndOffset": 4664736, + "endOffset": 4681412, "octets": 16676, "lines": 226 }, { "mimeType": "text/richtext", "lineNumber": 63738, - "begin": 4681460, - "headersEnd": 4681536, - "end": 4682211, + "beginOffset": 4681460, + "headersEndOffset": 4681536, + "endOffset": 4682211, "octets": 675, "lines": 15 } ], - "end": 4682261, "octets": 55601, "lines": 792 }, - "end": 4682261, "octets": 55601 }, { - "mboxMarkerBegin": 4682263, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4682263, "lineNumber": 63760, - "begin": 4682272, - "headersEnd": 4683107, + "beginOffset": 4682272, + "headersEndOffset": 4683107, + "endOffset": 4731150, "body": { "mimeType": "multipart/mixed", "lineNumber": 63760, - "begin": 4682272, - "headersEnd": 4683107, + "beginOffset": 4682272, + "headersEndOffset": 4683107, + "endOffset": 4731150, "children": [ { "mimeType": "text/plain", "lineNumber": 63777, - "begin": 4683137, - "headersEnd": 4683139, - "end": 4683807, + "beginOffset": 4683137, + "headersEndOffset": 4683139, + "endOffset": 4683807, "octets": 668, "lines": 18 }, { "mimeType": "Image/JPEG", "lineNumber": 63798, - "begin": 4683839, - "headersEnd": 4683902, - "end": 4731116, + "beginOffset": 4683839, + "headersEndOffset": 4683902, + "endOffset": 4731116, "octets": 47214, "lines": 762 } ], - "end": 4731150, "octets": 48043, "lines": 788 }, - "end": 4731150, "octets": 48043 }, { - "mboxMarkerBegin": 4731152, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4731152, "lineNumber": 64566, - "begin": 4731161, - "headersEnd": 4731922, + "beginOffset": 4731161, + "headersEndOffset": 4731922, + "endOffset": 4767575, "body": { "mimeType": "multipart/mixed", "lineNumber": 64566, - "begin": 4731161, - "headersEnd": 4731922, + "beginOffset": 4731161, + "headersEndOffset": 4731922, + "endOffset": 4767575, "children": [ { "mimeType": "text/enriched", "lineNumber": 64588, - "begin": 4732387, - "headersEnd": 4732463, - "end": 4737938, + "beginOffset": 4732387, + "headersEndOffset": 4732463, + "endOffset": 4737938, "octets": 5475, "lines": 160 }, { "mimeType": "image/gif", "lineNumber": 64753, - "begin": 4737964, - "headersEnd": 4738065, - "end": 4740681, + "beginOffset": 4737964, + "headersEndOffset": 4738065, + "endOffset": 4740681, "octets": 2616, "lines": 36 }, { "mimeType": "text/enriched", "lineNumber": 64795, - "begin": 4740707, - "headersEnd": 4740783, - "end": 4741311, + "beginOffset": 4740707, + "headersEndOffset": 4740783, + "endOffset": 4741311, "octets": 528, "lines": 10 }, { "mimeType": "audio/basic", "lineNumber": 64810, - "begin": 4741337, - "headersEnd": 4741455, - "end": 4764831, + "beginOffset": 4741337, + "headersEndOffset": 4741455, + "endOffset": 4764831, "octets": 23376, "lines": 316 }, { "mimeType": "text/enriched", "lineNumber": 65132, - "begin": 4764857, - "headersEnd": 4764933, - "end": 4765525, + "beginOffset": 4764857, + "headersEndOffset": 4764933, + "endOffset": 4765525, "octets": 592, "lines": 14 }, { "mimeType": "message/external-body", "lineNumber": 65151, - "begin": 4765551, - "headersEnd": 4765640, + "beginOffset": 4765551, + "headersEndOffset": 4765640, + "endOffset": 4765711, "message": { "lineNumber": 65155, - "begin": 4765640, - "headersEnd": 4765711, + "beginOffset": 4765640, + "headersEndOffset": 4765711, + "endOffset": 4765711, "body": { "mimeType": "text/plain", "lineNumber": 65155, - "begin": 4765640, - "headersEnd": 4765711, - "end": 4765711, + "beginOffset": 4765640, + "headersEndOffset": 4765711, + "endOffset": 4765711, "octets": 0, "lines": 0 }, - "end": 4765711, "octets": 0 }, - "end": 4765711, "octets": 71, "lines": 2 }, { "mimeType": "text/enriched", "lineNumber": 65159, - "begin": 4765737, - "headersEnd": 4765813, - "end": 4766094, + "beginOffset": 4765737, + "headersEndOffset": 4765813, + "endOffset": 4766094, "octets": 281, "lines": 5 }, { "mimeType": "message/external-body", "lineNumber": 65169, - "begin": 4766120, - "headersEnd": 4766273, + "beginOffset": 4766120, + "headersEndOffset": 4766273, + "endOffset": 4766344, "message": { "lineNumber": 65176, - "begin": 4766273, - "headersEnd": 4766344, + "beginOffset": 4766273, + "headersEndOffset": 4766344, + "endOffset": 4766344, "body": { "mimeType": "text/plain", "lineNumber": 65176, - "begin": 4766273, - "headersEnd": 4766344, - "end": 4766344, + "beginOffset": 4766273, + "headersEndOffset": 4766344, + "endOffset": 4766344, "octets": 0, "lines": 0 }, - "end": 4766344, "octets": 0 }, - "end": 4766344, "octets": 71, "lines": 2 }, { "mimeType": "text/enriched", "lineNumber": 65180, - "begin": 4766370, - "headersEnd": 4766446, - "end": 4767549, + "beginOffset": 4766370, + "headersEndOffset": 4766446, + "endOffset": 4767549, "octets": 1103, "lines": 34 } ], - "end": 4767575, "octets": 35653, "lines": 639 }, - "end": 4767575, "octets": 35653 }, { - "mboxMarkerBegin": 4767577, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4767577, "lineNumber": 65220, - "begin": 4767586, - "headersEnd": 4767753, + "beginOffset": 4767586, + "headersEndOffset": 4767753, + "endOffset": 4845389, "body": { "mimeType": "Multipart/mixed", "lineNumber": 65220, - "begin": 4767586, - "headersEnd": 4767753, + "beginOffset": 4767586, + "headersEndOffset": 4767753, + "endOffset": 4845389, "children": [ { "mimeType": "image/gif", "lineNumber": 65227, - "begin": 4767766, - "headersEnd": 4767838, - "end": 4845327, + "beginOffset": 4767766, + "headersEndOffset": 4767838, + "endOffset": 4845327, "octets": 77489, "lines": 1145 }, { "mimeType": "text/plain", "lineNumber": 66377, - "begin": 4845342, - "headersEnd": 4845344, - "end": 4845374, + "beginOffset": 4845342, + "headersEndOffset": 4845344, + "endOffset": 4845374, "octets": 30, "lines": 1 } ], - "end": 4845389, "octets": 77636, "lines": 1154 }, - "end": 4845389, "octets": 77636 }, { - "mboxMarkerBegin": 4845391, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4845391, "lineNumber": 66381, - "begin": 4845400, - "headersEnd": 4846638, + "beginOffset": 4845400, + "headersEndOffset": 4846638, + "endOffset": 4977202, "body": { "mimeType": "MULTIPART/MIXED", "lineNumber": 66381, - "begin": 4845400, - "headersEnd": 4846638, + "beginOffset": 4845400, + "headersEndOffset": 4846638, + "endOffset": 4977202, "children": [ { "mimeType": "TEXT/plain", "lineNumber": 66405, - "begin": 4846677, - "headersEnd": 4846723, - "end": 4847183, + "beginOffset": 4846677, + "headersEndOffset": 4846723, + "endOffset": 4847183, "octets": 460, "lines": 8 }, { "mimeType": "AUDIO/basic", "lineNumber": 66417, - "begin": 4847224, - "headersEnd": 4847321, - "end": 4977159, + "beginOffset": 4847224, + "headersEndOffset": 4847321, + "endOffset": 4977159, "octets": 129838, "lines": 2095 } ], - "end": 4977202, "octets": 130564, "lines": 2114 }, - "end": 4977202, "octets": 130564 }, { - "mboxMarkerBegin": 4977204, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4977204, "lineNumber": 68520, - "begin": 4977213, - "headersEnd": 4977982, + "beginOffset": 4977213, + "headersEndOffset": 4977982, + "endOffset": 5154286, "body": { "mimeType": "multipart/alternative", "lineNumber": 68520, - "begin": 4977213, - "headersEnd": 4977982, + "beginOffset": 4977213, + "headersEndOffset": 4977982, + "endOffset": 5154286, "children": [ { "mimeType": "text/plain", "lineNumber": 68544, - "begin": 4978386, - "headersEnd": 4978388, - "end": 4979201, + "beginOffset": 4978386, + "headersEndOffset": 4978388, + "endOffset": 4979201, "octets": 813, "lines": 18 }, { "mimeType": "multipart/mixed", "lineNumber": 68565, - "begin": 4979262, - "headersEnd": 4979368, + "beginOffset": 4979262, + "headersEndOffset": 4979368, + "endOffset": 5154225, "children": [ { "mimeType": "text/richtext", "lineNumber": 68569, - "begin": 4979429, - "headersEnd": 4979505, - "end": 4980001, + "beginOffset": 4979429, + "headersEndOffset": 4979505, + "endOffset": 4980001, "octets": 496, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 68581, - "begin": 4980064, - "headersEnd": 4980164, - "end": 4993344, + "beginOffset": 4980064, + "headersEndOffset": 4980164, + "endOffset": 4993344, "octets": 13180, "lines": 190 }, { "mimeType": "text/plain", "lineNumber": 68777, - "begin": 4993407, - "headersEnd": 4993480, - "end": 4993501, + "beginOffset": 4993407, + "headersEndOffset": 4993480, + "endOffset": 4993501, "octets": 21, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 68783, - "begin": 4993564, - "headersEnd": 4993664, - "end": 5050148, + "beginOffset": 4993564, + "headersEndOffset": 4993664, + "endOffset": 5050148, "octets": 56484, "lines": 764 }, { "mimeType": "text/plain", "lineNumber": 69553, - "begin": 5050211, - "headersEnd": 5050284, - "end": 5050341, + "beginOffset": 5050211, + "headersEndOffset": 5050284, + "endOffset": 5050341, "octets": 57, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 69563, - "begin": 5050404, - "headersEnd": 5050468, - "end": 5154020, + "beginOffset": 5050404, + "headersEndOffset": 5050468, + "endOffset": 5154020, "octets": 103552, "lines": 1400 }, { "mimeType": "text/plain", "lineNumber": 70968, - "begin": 5154083, - "headersEnd": 5154156, - "end": 5154160, + "beginOffset": 5154083, + "headersEndOffset": 5154156, + "endOffset": 5154160, "octets": 4, "lines": 2 } ], - "end": 5154225, "octets": 174857, "lines": 2407 } ], - "end": 5154286, "octets": 176304, "lines": 2440 }, - "end": 5154286, "octets": 176304 }, { - "mboxMarkerBegin": 5154288, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5154288, "lineNumber": 70978, - "begin": 5154297, - "headersEnd": 5154999, + "beginOffset": 5154297, + "headersEndOffset": 5154999, + "endOffset": 5373282, "body": { "mimeType": "multipart/alternative", "lineNumber": 70978, - "begin": 5154297, - "headersEnd": 5154999, + "beginOffset": 5154297, + "headersEndOffset": 5154999, + "endOffset": 5373282, "children": [ { "mimeType": "text/plain", "lineNumber": 70998, - "begin": 5155198, - "headersEnd": 5155244, - "end": 5156788, + "beginOffset": 5155198, + "headersEndOffset": 5155244, + "endOffset": 5156788, "octets": 1544, "lines": 29 }, { "mimeType": "multipart/mixed", "lineNumber": 71031, - "begin": 5156831, - "headersEnd": 5156919, + "beginOffset": 5156831, + "headersEndOffset": 5156919, + "endOffset": 5373239, "children": [ { "mimeType": "text/richtext", "lineNumber": 71035, - "begin": 5156962, - "headersEnd": 5157056, - "end": 5157976, + "beginOffset": 5156962, + "headersEndOffset": 5157056, + "endOffset": 5157976, "octets": 920, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 71053, - "begin": 5158021, - "headersEnd": 5158116, - "end": 5193480, + "beginOffset": 5158021, + "headersEndOffset": 5158116, + "endOffset": 5193480, "octets": 35364, "lines": 506 }, { "mimeType": "text/richtext", "lineNumber": 71565, - "begin": 5193525, - "headersEnd": 5193619, - "end": 5193631, + "beginOffset": 5193525, + "headersEndOffset": 5193619, + "endOffset": 5193631, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 71572, - "begin": 5193676, - "headersEnd": 5193771, - "end": 5215415, + "beginOffset": 5193676, + "headersEndOffset": 5193771, + "endOffset": 5215415, "octets": 21644, "lines": 310 }, { "mimeType": "text/richtext", "lineNumber": 71888, - "begin": 5215460, - "headersEnd": 5215554, - "end": 5215566, + "beginOffset": 5215460, + "headersEndOffset": 5215554, + "endOffset": 5215566, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 71895, - "begin": 5215611, - "headersEnd": 5215706, - "end": 5248620, + "beginOffset": 5215611, + "headersEndOffset": 5215706, + "endOffset": 5248620, "octets": 32914, "lines": 471 }, { "mimeType": "text/richtext", "lineNumber": 72372, - "begin": 5248665, - "headersEnd": 5248759, - "end": 5248771, + "beginOffset": 5248665, + "headersEndOffset": 5248759, + "endOffset": 5248771, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 72379, - "begin": 5248816, - "headersEnd": 5248911, - "end": 5282837, + "beginOffset": 5248816, + "headersEndOffset": 5248911, + "endOffset": 5282837, "octets": 33926, "lines": 485 }, { "mimeType": "text/richtext", "lineNumber": 72870, - "begin": 5282882, - "headersEnd": 5282976, - "end": 5282988, + "beginOffset": 5282882, + "headersEndOffset": 5282976, + "endOffset": 5282988, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 72877, - "begin": 5283033, - "headersEnd": 5283128, - "end": 5311368, + "beginOffset": 5283033, + "headersEndOffset": 5283128, + "endOffset": 5311368, "octets": 28240, "lines": 404 }, { "mimeType": "text/richtext", "lineNumber": 73287, - "begin": 5311413, - "headersEnd": 5311507, - "end": 5311519, + "beginOffset": 5311413, + "headersEndOffset": 5311507, + "endOffset": 5311519, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 73294, - "begin": 5311564, - "headersEnd": 5311659, - "end": 5345639, + "beginOffset": 5311564, + "headersEndOffset": 5311659, + "endOffset": 5345639, "octets": 33980, "lines": 486 }, { "mimeType": "text/richtext", "lineNumber": 73786, - "begin": 5345684, - "headersEnd": 5345778, - "end": 5345790, + "beginOffset": 5345684, + "headersEndOffset": 5345778, + "endOffset": 5345790, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 73793, - "begin": 5345835, - "headersEnd": 5345930, - "end": 5372976, + "beginOffset": 5345835, + "headersEndOffset": 5345930, + "endOffset": 5372976, "octets": 27046, "lines": 387 }, { "mimeType": "text/richtext", "lineNumber": 74186, - "begin": 5373021, - "headersEnd": 5373115, - "end": 5373192, + "beginOffset": 5373021, + "headersEndOffset": 5373115, + "endOffset": 5373192, "octets": 77, "lines": 3 } ], - "end": 5373239, "octets": 216320, "lines": 3160 } ], - "end": 5373282, "octets": 218283, "lines": 3202 }, - "end": 5373282, "octets": 218283 }, { - "mboxMarkerBegin": 5373284, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5373284, "lineNumber": 74197, - "begin": 5373293, - "headersEnd": 5373698, + "beginOffset": 5373293, + "headersEndOffset": 5373698, + "endOffset": 5464350, "body": { "mimeType": "multipart/mixed", "lineNumber": 74197, - "begin": 5373293, - "headersEnd": 5373698, + "beginOffset": 5373293, + "headersEndOffset": 5373698, + "endOffset": 5464350, "children": [ { "mimeType": "text/richtext", "lineNumber": 74215, - "begin": 5373947, - "headersEnd": 5374045, - "end": 5374257, + "beginOffset": 5373947, + "headersEndOffset": 5374045, + "endOffset": 5374257, "octets": 212, "lines": 9 }, { "mimeType": "audio/basic", "lineNumber": 74229, - "begin": 5374309, - "headersEnd": 5374373, - "end": 5464185, + "beginOffset": 5374309, + "headersEndOffset": 5374373, + "endOffset": 5464185, "octets": 89812, "lines": 1214 }, { "mimeType": "text/plain", "lineNumber": 75448, - "begin": 5464237, - "headersEnd": 5464265, - "end": 5464296, + "beginOffset": 5464237, + "headersEndOffset": 5464265, + "endOffset": 5464296, "octets": 31, "lines": 1 } ], - "end": 5464350, "octets": 90652, "lines": 1243 }, - "end": 5464350, "octets": 90652 }, { - "mboxMarkerBegin": 5464352, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5464352, "lineNumber": 75455, - "begin": 5464361, - "headersEnd": 5465317, + "beginOffset": 5464361, + "headersEndOffset": 5465317, + "endOffset": 5516722, "body": { "mimeType": "message/partial", "lineNumber": 75455, - "begin": 5464361, - "headersEnd": 5465317, - "end": 5516722, + "beginOffset": 5464361, + "headersEndOffset": 5465317, + "endOffset": 5516722, "octets": 51405, "lines": 696 }, - "end": 5516722, "octets": 51405 }, { - "mboxMarkerBegin": 5516724, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5516724, "lineNumber": 76173, - "begin": 5516733, - "headersEnd": 5517362, + "beginOffset": 5516733, + "headersEndOffset": 5517362, + "endOffset": 5588100, "body": { "mimeType": "multipart/mixed", "lineNumber": 76173, - "begin": 5516733, - "headersEnd": 5517362, + "beginOffset": 5516733, + "headersEndOffset": 5517362, + "endOffset": 5588100, "children": [ { "mimeType": "text/plain", "lineNumber": 76191, - "begin": 5517381, - "headersEnd": 5517383, - "end": 5521801, + "beginOffset": 5517381, + "headersEndOffset": 5517383, + "endOffset": 5521801, "octets": 4418, "lines": 101 }, { "mimeType": "multipart/digest", "lineNumber": 76295, - "begin": 5521822, - "headersEnd": 5521966, + "beginOffset": 5521822, + "headersEndOffset": 5521966, + "endOffset": 5588021, "children": [ { "mimeType": "message/rfc822", "lineNumber": 76299, - "begin": 5521998, - "headersEnd": 5522000, + "beginOffset": 5521998, + "headersEndOffset": 5522000, + "endOffset": 5522748, "message": { "lineNumber": 76300, - "begin": 5522000, - "headersEnd": 5522109, + "beginOffset": 5522000, + "headersEndOffset": 5522109, + "endOffset": 5522748, "body": { "mimeType": "text/plain", "lineNumber": 76300, - "begin": 5522000, - "headersEnd": 5522109, - "end": 5522748, + "beginOffset": 5522000, + "headersEndOffset": 5522109, + "endOffset": 5522748, "octets": 639, "lines": 18 }, - "end": 5522748, "octets": 639 }, - "end": 5522748, "octets": 748, "lines": 22 }, { "mimeType": "message/rfc822", "lineNumber": 76324, - "begin": 5522782, - "headersEnd": 5522784, + "beginOffset": 5522782, + "headersEndOffset": 5522784, + "endOffset": 5523662, "message": { "lineNumber": 76325, - "begin": 5522784, - "headersEnd": 5522909, + "beginOffset": 5522784, + "headersEndOffset": 5522909, + "endOffset": 5523662, "body": { "mimeType": "text/plain", "lineNumber": 76325, - "begin": 5522784, - "headersEnd": 5522909, - "end": 5523662, + "beginOffset": 5522784, + "headersEndOffset": 5522909, + "endOffset": 5523662, "octets": 753, "lines": 20 }, - "end": 5523662, "octets": 753 }, - "end": 5523662, "octets": 878, "lines": 24 }, { "mimeType": "message/rfc822", "lineNumber": 76351, - "begin": 5523696, - "headersEnd": 5523698, + "beginOffset": 5523696, + "headersEndOffset": 5523698, + "endOffset": 5524481, "message": { "lineNumber": 76352, - "begin": 5523698, - "headersEnd": 5523821, + "beginOffset": 5523698, + "headersEndOffset": 5523821, + "endOffset": 5524481, "body": { "mimeType": "text/plain", "lineNumber": 76352, - "begin": 5523698, - "headersEnd": 5523821, - "end": 5524481, + "beginOffset": 5523698, + "headersEndOffset": 5523821, + "endOffset": 5524481, "octets": 660, "lines": 14 }, - "end": 5524481, "octets": 660 }, - "end": 5524481, "octets": 783, "lines": 18 }, { "mimeType": "message/rfc822", "lineNumber": 76372, - "begin": 5524515, - "headersEnd": 5524517, + "beginOffset": 5524515, + "headersEndOffset": 5524517, + "endOffset": 5525170, "message": { "lineNumber": 76373, - "begin": 5524517, - "headersEnd": 5524677, + "beginOffset": 5524517, + "headersEndOffset": 5524677, + "endOffset": 5525170, "body": { "mimeType": "text/plain", "lineNumber": 76373, - "begin": 5524517, - "headersEnd": 5524677, - "end": 5525170, + "beginOffset": 5524517, + "headersEndOffset": 5524677, + "endOffset": 5525170, "octets": 493, "lines": 10 }, - "end": 5525170, "octets": 493 }, - "end": 5525170, "octets": 653, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 76389, - "begin": 5525204, - "headersEnd": 5525206, + "beginOffset": 5525204, + "headersEndOffset": 5525206, + "endOffset": 5525951, "message": { "lineNumber": 76390, - "begin": 5525206, - "headersEnd": 5525364, + "beginOffset": 5525206, + "headersEndOffset": 5525364, + "endOffset": 5525951, "body": { "mimeType": "text/plain", "lineNumber": 76390, - "begin": 5525206, - "headersEnd": 5525364, - "end": 5525951, + "beginOffset": 5525206, + "headersEndOffset": 5525364, + "endOffset": 5525951, "octets": 587, "lines": 15 }, - "end": 5525951, "octets": 587 }, - "end": 5525951, "octets": 745, "lines": 19 }, { "mimeType": "message/rfc822", "lineNumber": 76411, - "begin": 5525985, - "headersEnd": 5525987, + "beginOffset": 5525985, + "headersEndOffset": 5525987, + "endOffset": 5527449, "message": { "lineNumber": 76412, - "begin": 5525987, - "headersEnd": 5526148, + "beginOffset": 5525987, + "headersEndOffset": 5526148, + "endOffset": 5527449, "body": { "mimeType": "text/plain", "lineNumber": 76412, - "begin": 5525987, - "headersEnd": 5526148, - "end": 5527449, + "beginOffset": 5525987, + "headersEndOffset": 5526148, + "endOffset": 5527449, "octets": 1301, "lines": 26 }, - "end": 5527449, "octets": 1301 }, - "end": 5527449, "octets": 1462, "lines": 30 }, { "mimeType": "message/rfc822", "lineNumber": 76444, - "begin": 5527483, - "headersEnd": 5527485, + "beginOffset": 5527483, + "headersEndOffset": 5527485, + "endOffset": 5528052, "message": { "lineNumber": 76445, - "begin": 5527485, - "headersEnd": 5527642, + "beginOffset": 5527485, + "headersEndOffset": 5527642, + "endOffset": 5528052, "body": { "mimeType": "text/plain", "lineNumber": 76445, - "begin": 5527485, - "headersEnd": 5527642, - "end": 5528052, + "beginOffset": 5527485, + "headersEndOffset": 5527642, + "endOffset": 5528052, "octets": 410, "lines": 9 }, - "end": 5528052, "octets": 410 }, - "end": 5528052, "octets": 567, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76460, - "begin": 5528086, - "headersEnd": 5528088, + "beginOffset": 5528086, + "headersEndOffset": 5528088, + "endOffset": 5528642, "message": { "lineNumber": 76461, - "begin": 5528088, - "headersEnd": 5528239, + "beginOffset": 5528088, + "headersEndOffset": 5528239, + "endOffset": 5528642, "body": { "mimeType": "text/plain", "lineNumber": 76461, - "begin": 5528088, - "headersEnd": 5528239, - "end": 5528642, + "beginOffset": 5528088, + "headersEndOffset": 5528239, + "endOffset": 5528642, "octets": 403, "lines": 7 }, - "end": 5528642, "octets": 403 }, - "end": 5528642, "octets": 554, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76474, - "begin": 5528676, - "headersEnd": 5528678, + "beginOffset": 5528676, + "headersEndOffset": 5528678, + "endOffset": 5529476, "message": { "lineNumber": 76475, - "begin": 5528678, - "headersEnd": 5528825, + "beginOffset": 5528678, + "headersEndOffset": 5528825, + "endOffset": 5529476, "body": { "mimeType": "text/plain", "lineNumber": 76475, - "begin": 5528678, - "headersEnd": 5528825, - "end": 5529476, + "beginOffset": 5528678, + "headersEndOffset": 5528825, + "endOffset": 5529476, "octets": 651, "lines": 11 }, - "end": 5529476, "octets": 651 }, - "end": 5529476, "octets": 798, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 76492, - "begin": 5529510, - "headersEnd": 5529512, + "beginOffset": 5529510, + "headersEndOffset": 5529512, + "endOffset": 5530649, "message": { "lineNumber": 76493, - "begin": 5529512, - "headersEnd": 5529653, + "beginOffset": 5529512, + "headersEndOffset": 5529653, + "endOffset": 5530649, "body": { "mimeType": "text/plain", "lineNumber": 76493, - "begin": 5529512, - "headersEnd": 5529653, - "end": 5530649, + "beginOffset": 5529512, + "headersEndOffset": 5529653, + "endOffset": 5530649, "octets": 996, "lines": 19 }, - "end": 5530649, "octets": 996 }, - "end": 5530649, "octets": 1137, "lines": 23 }, { "mimeType": "message/rfc822", "lineNumber": 76518, - "begin": 5530683, - "headersEnd": 5530685, + "beginOffset": 5530683, + "headersEndOffset": 5530685, + "endOffset": 5531753, "message": { "lineNumber": 76519, - "begin": 5530685, - "headersEnd": 5530836, + "beginOffset": 5530685, + "headersEndOffset": 5530836, + "endOffset": 5531753, "body": { "mimeType": "text/plain", "lineNumber": 76519, - "begin": 5530685, - "headersEnd": 5530836, - "end": 5531753, + "beginOffset": 5530685, + "headersEndOffset": 5530836, + "endOffset": 5531753, "octets": 917, "lines": 27 }, - "end": 5531753, "octets": 917 }, - "end": 5531753, "octets": 1068, "lines": 31 }, { "mimeType": "message/rfc822", "lineNumber": 76552, - "begin": 5531787, - "headersEnd": 5531789, + "beginOffset": 5531787, + "headersEndOffset": 5531789, + "endOffset": 5532494, "message": { "lineNumber": 76553, - "begin": 5531789, - "headersEnd": 5531924, + "beginOffset": 5531789, + "headersEndOffset": 5531924, + "endOffset": 5532494, "body": { "mimeType": "text/plain", "lineNumber": 76553, - "begin": 5531789, - "headersEnd": 5531924, - "end": 5532494, + "beginOffset": 5531789, + "headersEndOffset": 5531924, + "endOffset": 5532494, "octets": 570, "lines": 11 }, - "end": 5532494, "octets": 570 }, - "end": 5532494, "octets": 705, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 76570, - "begin": 5532528, - "headersEnd": 5532530, + "beginOffset": 5532528, + "headersEndOffset": 5532530, + "endOffset": 5533113, "message": { "lineNumber": 76571, - "begin": 5532530, - "headersEnd": 5532666, + "beginOffset": 5532530, + "headersEndOffset": 5532666, + "endOffset": 5533113, "body": { "mimeType": "text/plain", "lineNumber": 76571, - "begin": 5532530, - "headersEnd": 5532666, - "end": 5533113, + "beginOffset": 5532530, + "headersEndOffset": 5532666, + "endOffset": 5533113, "octets": 447, "lines": 10 }, - "end": 5533113, "octets": 447 }, - "end": 5533113, "octets": 583, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 76587, - "begin": 5533147, - "headersEnd": 5533149, + "beginOffset": 5533147, + "headersEndOffset": 5533149, + "endOffset": 5533837, "message": { "lineNumber": 76588, - "begin": 5533149, - "headersEnd": 5533270, + "beginOffset": 5533149, + "headersEndOffset": 5533270, + "endOffset": 5533837, "body": { "mimeType": "text/plain", "lineNumber": 76588, - "begin": 5533149, - "headersEnd": 5533270, - "end": 5533837, + "beginOffset": 5533149, + "headersEndOffset": 5533270, + "endOffset": 5533837, "octets": 567, "lines": 15 }, - "end": 5533837, "octets": 567 }, - "end": 5533837, "octets": 688, "lines": 19 }, { "mimeType": "message/rfc822", "lineNumber": 76609, - "begin": 5533871, - "headersEnd": 5533873, + "beginOffset": 5533871, + "headersEndOffset": 5533873, + "endOffset": 5534185, "message": { "lineNumber": 76610, - "begin": 5533873, - "headersEnd": 5533992, + "beginOffset": 5533873, + "headersEndOffset": 5533992, + "endOffset": 5534185, "body": { "mimeType": "text/plain", "lineNumber": 76610, - "begin": 5533873, - "headersEnd": 5533992, - "end": 5534185, + "beginOffset": 5533873, + "headersEndOffset": 5533992, + "endOffset": 5534185, "octets": 193, "lines": 8 }, - "end": 5534185, "octets": 193 }, - "end": 5534185, "octets": 312, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 76624, - "begin": 5534219, - "headersEnd": 5534221, + "beginOffset": 5534219, + "headersEndOffset": 5534221, + "endOffset": 5534677, "message": { "lineNumber": 76625, - "begin": 5534221, - "headersEnd": 5534342, + "beginOffset": 5534221, + "headersEndOffset": 5534342, + "endOffset": 5534677, "body": { "mimeType": "text/plain", "lineNumber": 76625, - "begin": 5534221, - "headersEnd": 5534342, - "end": 5534677, + "beginOffset": 5534221, + "headersEndOffset": 5534342, + "endOffset": 5534677, "octets": 335, "lines": 7 }, - "end": 5534677, "octets": 335 }, - "end": 5534677, "octets": 456, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76638, - "begin": 5534711, - "headersEnd": 5534713, + "beginOffset": 5534711, + "headersEndOffset": 5534713, + "endOffset": 5535528, "message": { "lineNumber": 76639, - "begin": 5534713, - "headersEnd": 5534840, + "beginOffset": 5534713, + "headersEndOffset": 5534840, + "endOffset": 5535528, "body": { "mimeType": "text/plain", "lineNumber": 76639, - "begin": 5534713, - "headersEnd": 5534840, - "end": 5535528, + "beginOffset": 5534713, + "headersEndOffset": 5534840, + "endOffset": 5535528, "octets": 688, "lines": 21 }, - "end": 5535528, "octets": 688 }, - "end": 5535528, "octets": 815, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 76666, - "begin": 5535562, - "headersEnd": 5535564, + "beginOffset": 5535562, + "headersEndOffset": 5535564, + "endOffset": 5535799, "message": { "lineNumber": 76667, - "begin": 5535564, - "headersEnd": 5535692, + "beginOffset": 5535564, + "headersEndOffset": 5535692, + "endOffset": 5535799, "body": { "mimeType": "text/plain", "lineNumber": 76667, - "begin": 5535564, - "headersEnd": 5535692, - "end": 5535799, + "beginOffset": 5535564, + "headersEndOffset": 5535692, + "endOffset": 5535799, "octets": 107, "lines": 5 }, - "end": 5535799, "octets": 107 }, - "end": 5535799, "octets": 235, "lines": 9 }, { "mimeType": "message/rfc822", "lineNumber": 76678, - "begin": 5535833, - "headersEnd": 5535835, + "beginOffset": 5535833, + "headersEndOffset": 5535835, + "endOffset": 5536838, "message": { "lineNumber": 76679, - "begin": 5535835, - "headersEnd": 5535981, + "beginOffset": 5535835, + "headersEndOffset": 5535981, + "endOffset": 5536838, "body": { "mimeType": "text/plain", "lineNumber": 76679, - "begin": 5535835, - "headersEnd": 5535981, - "end": 5536838, + "beginOffset": 5535835, + "headersEndOffset": 5535981, + "endOffset": 5536838, "octets": 857, "lines": 21 }, - "end": 5536838, "octets": 857 }, - "end": 5536838, "octets": 1003, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 76706, - "begin": 5536872, - "headersEnd": 5536874, + "beginOffset": 5536872, + "headersEndOffset": 5536874, + "endOffset": 5537416, "message": { "lineNumber": 76707, - "begin": 5536874, - "headersEnd": 5536988, + "beginOffset": 5536874, + "headersEndOffset": 5536988, + "endOffset": 5537416, "body": { "mimeType": "text/plain", "lineNumber": 76707, - "begin": 5536874, - "headersEnd": 5536988, - "end": 5537416, + "beginOffset": 5536874, + "headersEndOffset": 5536988, + "endOffset": 5537416, "octets": 428, "lines": 9 }, - "end": 5537416, "octets": 428 }, - "end": 5537416, "octets": 542, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76722, - "begin": 5537450, - "headersEnd": 5537452, + "beginOffset": 5537450, + "headersEndOffset": 5537452, + "endOffset": 5537867, "message": { "lineNumber": 76723, - "begin": 5537452, - "headersEnd": 5537628, + "beginOffset": 5537452, + "headersEndOffset": 5537628, + "endOffset": 5537867, "body": { "mimeType": "text/plain", "lineNumber": 76723, - "begin": 5537452, - "headersEnd": 5537628, - "end": 5537867, + "beginOffset": 5537452, + "headersEndOffset": 5537628, + "endOffset": 5537867, "octets": 239, "lines": 9 }, - "end": 5537867, "octets": 239 }, - "end": 5537867, "octets": 415, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76738, - "begin": 5537901, - "headersEnd": 5537903, + "beginOffset": 5537901, + "headersEndOffset": 5537903, + "endOffset": 5538444, "message": { "lineNumber": 76739, - "begin": 5537903, - "headersEnd": 5538033, + "beginOffset": 5537903, + "headersEndOffset": 5538033, + "endOffset": 5538444, "body": { "mimeType": "text/plain", "lineNumber": 76739, - "begin": 5537903, - "headersEnd": 5538033, - "end": 5538444, + "beginOffset": 5537903, + "headersEndOffset": 5538033, + "endOffset": 5538444, "octets": 411, "lines": 12 }, - "end": 5538444, "octets": 411 }, - "end": 5538444, "octets": 541, "lines": 16 }, { "mimeType": "message/rfc822", "lineNumber": 76757, - "begin": 5538478, - "headersEnd": 5538480, + "beginOffset": 5538478, + "headersEndOffset": 5538480, + "endOffset": 5539533, "message": { "lineNumber": 76758, - "begin": 5538480, - "headersEnd": 5538601, + "beginOffset": 5538480, + "headersEndOffset": 5538601, + "endOffset": 5539533, "body": { "mimeType": "text/plain", "lineNumber": 76758, - "begin": 5538480, - "headersEnd": 5538601, - "end": 5539533, + "beginOffset": 5538480, + "headersEndOffset": 5538601, + "endOffset": 5539533, "octets": 932, "lines": 28 }, - "end": 5539533, "octets": 932 }, - "end": 5539533, "octets": 1053, "lines": 32 }, { "mimeType": "message/rfc822", "lineNumber": 76792, - "begin": 5539567, - "headersEnd": 5539569, + "beginOffset": 5539567, + "headersEndOffset": 5539569, + "endOffset": 5540001, "message": { "lineNumber": 76793, - "begin": 5539569, - "headersEnd": 5539701, + "beginOffset": 5539569, + "headersEndOffset": 5539701, + "endOffset": 5540001, "body": { "mimeType": "text/plain", "lineNumber": 76793, - "begin": 5539569, - "headersEnd": 5539701, - "end": 5540001, + "beginOffset": 5539569, + "headersEndOffset": 5539701, + "endOffset": 5540001, "octets": 300, "lines": 9 }, - "end": 5540001, "octets": 300 }, - "end": 5540001, "octets": 432, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76808, - "begin": 5540035, - "headersEnd": 5540037, + "beginOffset": 5540035, + "headersEndOffset": 5540037, + "endOffset": 5540594, "message": { "lineNumber": 76809, - "begin": 5540037, - "headersEnd": 5540170, + "beginOffset": 5540037, + "headersEndOffset": 5540170, + "endOffset": 5540594, "body": { "mimeType": "text/plain", "lineNumber": 76809, - "begin": 5540037, - "headersEnd": 5540170, - "end": 5540594, + "beginOffset": 5540037, + "headersEndOffset": 5540170, + "endOffset": 5540594, "octets": 424, "lines": 14 }, - "end": 5540594, "octets": 424 }, - "end": 5540594, "octets": 557, "lines": 18 }, { "mimeType": "message/rfc822", "lineNumber": 76829, - "begin": 5540628, - "headersEnd": 5540630, + "beginOffset": 5540628, + "headersEndOffset": 5540630, + "endOffset": 5540898, "message": { "lineNumber": 76830, - "begin": 5540630, - "headersEnd": 5540749, + "beginOffset": 5540630, + "headersEndOffset": 5540749, + "endOffset": 5540898, "body": { "mimeType": "text/plain", "lineNumber": 76830, - "begin": 5540630, - "headersEnd": 5540749, - "end": 5540898, + "beginOffset": 5540630, + "headersEndOffset": 5540749, + "endOffset": 5540898, "octets": 149, "lines": 4 }, - "end": 5540898, "octets": 149 }, - "end": 5540898, "octets": 268, "lines": 8 }, { "mimeType": "message/rfc822", "lineNumber": 76840, - "begin": 5540932, - "headersEnd": 5540934, + "beginOffset": 5540932, + "headersEndOffset": 5540934, + "endOffset": 5541249, "message": { "lineNumber": 76841, - "begin": 5540934, - "headersEnd": 5541063, + "beginOffset": 5540934, + "headersEndOffset": 5541063, + "endOffset": 5541249, "body": { "mimeType": "text/plain", "lineNumber": 76841, - "begin": 5540934, - "headersEnd": 5541063, - "end": 5541249, + "beginOffset": 5540934, + "headersEndOffset": 5541063, + "endOffset": 5541249, "octets": 186, "lines": 7 }, - "end": 5541249, "octets": 186 }, - "end": 5541249, "octets": 315, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76854, - "begin": 5541283, - "headersEnd": 5541285, + "beginOffset": 5541283, + "headersEndOffset": 5541285, + "endOffset": 5542149, "message": { "lineNumber": 76855, - "begin": 5541285, - "headersEnd": 5541419, + "beginOffset": 5541285, + "headersEndOffset": 5541419, + "endOffset": 5542149, "body": { "mimeType": "text/plain", "lineNumber": 76855, - "begin": 5541285, - "headersEnd": 5541419, - "end": 5542149, + "beginOffset": 5541285, + "headersEndOffset": 5541419, + "endOffset": 5542149, "octets": 730, "lines": 14 }, - "end": 5542149, "octets": 730 }, - "end": 5542149, "octets": 864, "lines": 18 }, { "mimeType": "message/rfc822", "lineNumber": 76875, - "begin": 5542183, - "headersEnd": 5542185, + "beginOffset": 5542183, + "headersEndOffset": 5542185, + "endOffset": 5543318, "message": { "lineNumber": 76876, - "begin": 5542185, - "headersEnd": 5542335, + "beginOffset": 5542185, + "headersEndOffset": 5542335, + "endOffset": 5543318, "body": { "mimeType": "text/plain", "lineNumber": 76876, - "begin": 5542185, - "headersEnd": 5542335, - "end": 5543318, + "beginOffset": 5542185, + "headersEndOffset": 5542335, + "endOffset": 5543318, "octets": 983, "lines": 26 }, - "end": 5543318, "octets": 983 }, - "end": 5543318, "octets": 1133, "lines": 30 }, { "mimeType": "message/rfc822", "lineNumber": 76908, - "begin": 5543352, - "headersEnd": 5543354, + "beginOffset": 5543352, + "headersEndOffset": 5543354, + "endOffset": 5543746, "message": { "lineNumber": 76909, - "begin": 5543354, - "headersEnd": 5543492, + "beginOffset": 5543354, + "headersEndOffset": 5543492, + "endOffset": 5543746, "body": { "mimeType": "text/plain", "lineNumber": 76909, - "begin": 5543354, - "headersEnd": 5543492, - "end": 5543746, + "beginOffset": 5543354, + "headersEndOffset": 5543492, + "endOffset": 5543746, "octets": 254, "lines": 7 }, - "end": 5543746, "octets": 254 }, - "end": 5543746, "octets": 392, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76922, - "begin": 5543780, - "headersEnd": 5543782, + "beginOffset": 5543780, + "headersEndOffset": 5543782, + "endOffset": 5544041, "message": { "lineNumber": 76923, - "begin": 5543782, - "headersEnd": 5543908, + "beginOffset": 5543782, + "headersEndOffset": 5543908, + "endOffset": 5544041, "body": { "mimeType": "text/plain", "lineNumber": 76923, - "begin": 5543782, - "headersEnd": 5543908, - "end": 5544041, + "beginOffset": 5543782, + "headersEndOffset": 5543908, + "endOffset": 5544041, "octets": 133, "lines": 6 }, - "end": 5544041, "octets": 133 }, - "end": 5544041, "octets": 259, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 76935, - "begin": 5544075, - "headersEnd": 5544077, + "beginOffset": 5544075, + "headersEndOffset": 5544077, + "endOffset": 5545018, "message": { "lineNumber": 76936, - "begin": 5544077, - "headersEnd": 5544257, + "beginOffset": 5544077, + "headersEndOffset": 5544257, + "endOffset": 5545018, "body": { "mimeType": "text/plain", "lineNumber": 76936, - "begin": 5544077, - "headersEnd": 5544257, - "end": 5545018, + "beginOffset": 5544077, + "headersEndOffset": 5544257, + "endOffset": 5545018, "octets": 761, "lines": 16 }, - "end": 5545018, "octets": 761 }, - "end": 5545018, "octets": 941, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 76959, - "begin": 5545052, - "headersEnd": 5545054, + "beginOffset": 5545052, + "headersEndOffset": 5545054, + "endOffset": 5545633, "message": { "lineNumber": 76960, - "begin": 5545054, - "headersEnd": 5545218, + "beginOffset": 5545054, + "headersEndOffset": 5545218, + "endOffset": 5545633, "body": { "mimeType": "text/plain", "lineNumber": 76960, - "begin": 5545054, - "headersEnd": 5545218, - "end": 5545633, + "beginOffset": 5545054, + "headersEndOffset": 5545218, + "endOffset": 5545633, "octets": 415, "lines": 16 }, - "end": 5545633, "octets": 415 }, - "end": 5545633, "octets": 579, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 76982, - "begin": 5545667, - "headersEnd": 5545669, + "beginOffset": 5545667, + "headersEndOffset": 5545669, + "endOffset": 5547113, "message": { "lineNumber": 76983, - "begin": 5545669, - "headersEnd": 5545805, + "beginOffset": 5545669, + "headersEndOffset": 5545805, + "endOffset": 5547113, "body": { "mimeType": "text/plain", "lineNumber": 76983, - "begin": 5545669, - "headersEnd": 5545805, - "end": 5547113, + "beginOffset": 5545669, + "headersEndOffset": 5545805, + "endOffset": 5547113, "octets": 1308, "lines": 21 }, - "end": 5547113, "octets": 1308 }, - "end": 5547113, "octets": 1444, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 77010, - "begin": 5547147, - "headersEnd": 5547149, + "beginOffset": 5547147, + "headersEndOffset": 5547149, + "endOffset": 5547408, "message": { "lineNumber": 77011, - "begin": 5547149, - "headersEnd": 5547259, + "beginOffset": 5547149, + "headersEndOffset": 5547259, + "endOffset": 5547408, "body": { "mimeType": "text/plain", "lineNumber": 77011, - "begin": 5547149, - "headersEnd": 5547259, - "end": 5547408, + "beginOffset": 5547149, + "headersEndOffset": 5547259, + "endOffset": 5547408, "octets": 149, "lines": 6 }, - "end": 5547408, "octets": 149 }, - "end": 5547408, "octets": 259, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 77023, - "begin": 5547442, - "headersEnd": 5547444, + "beginOffset": 5547442, + "headersEndOffset": 5547444, + "endOffset": 5547895, "message": { "lineNumber": 77024, - "begin": 5547444, - "headersEnd": 5547585, + "beginOffset": 5547444, + "headersEndOffset": 5547585, + "endOffset": 5547895, "body": { "mimeType": "text/plain", "lineNumber": 77024, - "begin": 5547444, - "headersEnd": 5547585, - "end": 5547895, + "beginOffset": 5547444, + "headersEndOffset": 5547585, + "endOffset": 5547895, "octets": 310, "lines": 11 }, - "end": 5547895, "octets": 310 }, - "end": 5547895, "octets": 451, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 77041, - "begin": 5547929, - "headersEnd": 5547931, + "beginOffset": 5547929, + "headersEndOffset": 5547931, + "endOffset": 5548254, "message": { "lineNumber": 77042, - "begin": 5547931, - "headersEnd": 5548061, + "beginOffset": 5547931, + "headersEndOffset": 5548061, + "endOffset": 5548254, "body": { "mimeType": "text/plain", "lineNumber": 77042, - "begin": 5547931, - "headersEnd": 5548061, - "end": 5548254, + "beginOffset": 5547931, + "headersEndOffset": 5548061, + "endOffset": 5548254, "octets": 193, "lines": 6 }, - "end": 5548254, "octets": 193 }, - "end": 5548254, "octets": 323, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 77054, - "begin": 5548288, - "headersEnd": 5548290, + "beginOffset": 5548288, + "headersEndOffset": 5548290, + "endOffset": 5548809, "message": { "lineNumber": 77055, - "begin": 5548290, - "headersEnd": 5548399, + "beginOffset": 5548290, + "headersEndOffset": 5548399, + "endOffset": 5548809, "body": { "mimeType": "text/plain", "lineNumber": 77055, - "begin": 5548290, - "headersEnd": 5548399, - "end": 5548809, + "beginOffset": 5548290, + "headersEndOffset": 5548399, + "endOffset": 5548809, "octets": 410, "lines": 12 }, - "end": 5548809, "octets": 410 }, - "end": 5548809, "octets": 519, "lines": 16 }, { "mimeType": "message/rfc822", "lineNumber": 77073, - "begin": 5548843, - "headersEnd": 5548845, + "beginOffset": 5548843, + "headersEndOffset": 5548845, + "endOffset": 5549293, "message": { "lineNumber": 77074, - "begin": 5548845, - "headersEnd": 5548983, + "beginOffset": 5548845, + "headersEndOffset": 5548983, + "endOffset": 5549293, "body": { "mimeType": "text/plain", "lineNumber": 77074, - "begin": 5548845, - "headersEnd": 5548983, - "end": 5549293, + "beginOffset": 5548845, + "headersEndOffset": 5548983, + "endOffset": 5549293, "octets": 310, "lines": 8 }, - "end": 5549293, "octets": 310 }, - "end": 5549293, "octets": 448, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 77088, - "begin": 5549327, - "headersEnd": 5549329, + "beginOffset": 5549327, + "headersEndOffset": 5549329, + "endOffset": 5550111, "message": { "lineNumber": 77089, - "begin": 5549329, - "headersEnd": 5549476, + "beginOffset": 5549329, + "headersEndOffset": 5549476, + "endOffset": 5550111, "body": { "mimeType": "text/plain", "lineNumber": 77089, - "begin": 5549329, - "headersEnd": 5549476, - "end": 5550111, + "beginOffset": 5549329, + "headersEndOffset": 5549476, + "endOffset": 5550111, "octets": 635, "lines": 17 }, - "end": 5550111, "octets": 635 }, - "end": 5550111, "octets": 782, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77112, - "begin": 5550145, - "headersEnd": 5550147, + "beginOffset": 5550145, + "headersEndOffset": 5550147, + "endOffset": 5550789, "message": { "lineNumber": 77113, - "begin": 5550147, - "headersEnd": 5550304, + "beginOffset": 5550147, + "headersEndOffset": 5550304, + "endOffset": 5550789, "body": { "mimeType": "text/plain", "lineNumber": 77113, - "begin": 5550147, - "headersEnd": 5550304, - "end": 5550789, + "beginOffset": 5550147, + "headersEndOffset": 5550304, + "endOffset": 5550789, "octets": 485, "lines": 10 }, - "end": 5550789, "octets": 485 }, - "end": 5550789, "octets": 642, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77129, - "begin": 5550823, - "headersEnd": 5550825, + "beginOffset": 5550823, + "headersEndOffset": 5550825, + "endOffset": 5552161, "message": { "lineNumber": 77130, - "begin": 5550825, - "headersEnd": 5550962, + "beginOffset": 5550825, + "headersEndOffset": 5550962, + "endOffset": 5552161, "body": { "mimeType": "text/plain", "lineNumber": 77130, - "begin": 5550825, - "headersEnd": 5550962, - "end": 5552161, + "beginOffset": 5550825, + "headersEndOffset": 5550962, + "endOffset": 5552161, "octets": 1199, "lines": 27 }, - "end": 5552161, "octets": 1199 }, - "end": 5552161, "octets": 1336, "lines": 31 }, { "mimeType": "message/rfc822", "lineNumber": 77163, - "begin": 5552195, - "headersEnd": 5552197, + "beginOffset": 5552195, + "headersEndOffset": 5552197, + "endOffset": 5552644, "message": { "lineNumber": 77164, - "begin": 5552197, - "headersEnd": 5552377, + "beginOffset": 5552197, + "headersEndOffset": 5552377, + "endOffset": 5552644, "body": { "mimeType": "text/plain", "lineNumber": 77164, - "begin": 5552197, - "headersEnd": 5552377, - "end": 5552644, + "beginOffset": 5552197, + "headersEndOffset": 5552377, + "endOffset": 5552644, "octets": 267, "lines": 8 }, - "end": 5552644, "octets": 267 }, - "end": 5552644, "octets": 447, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 77178, - "begin": 5552678, - "headersEnd": 5552680, + "beginOffset": 5552678, + "headersEndOffset": 5552680, + "endOffset": 5552996, "message": { "lineNumber": 77179, - "begin": 5552680, - "headersEnd": 5552799, + "beginOffset": 5552680, + "headersEndOffset": 5552799, + "endOffset": 5552996, "body": { "mimeType": "text/plain", "lineNumber": 77179, - "begin": 5552680, - "headersEnd": 5552799, - "end": 5552996, + "beginOffset": 5552680, + "headersEndOffset": 5552799, + "endOffset": 5552996, "octets": 197, "lines": 4 }, - "end": 5552996, "octets": 197 }, - "end": 5552996, "octets": 316, "lines": 8 }, { "mimeType": "message/rfc822", "lineNumber": 77189, - "begin": 5553030, - "headersEnd": 5553032, + "beginOffset": 5553030, + "headersEndOffset": 5553032, + "endOffset": 5554065, "message": { "lineNumber": 77190, - "begin": 5553032, - "headersEnd": 5553176, + "beginOffset": 5553032, + "headersEndOffset": 5553176, + "endOffset": 5554065, "body": { "mimeType": "text/plain", "lineNumber": 77190, - "begin": 5553032, - "headersEnd": 5553176, - "end": 5554065, + "beginOffset": 5553032, + "headersEndOffset": 5553176, + "endOffset": 5554065, "octets": 889, "lines": 24 }, - "end": 5554065, "octets": 889 }, - "end": 5554065, "octets": 1033, "lines": 28 }, { "mimeType": "message/rfc822", "lineNumber": 77220, - "begin": 5554099, - "headersEnd": 5554101, + "beginOffset": 5554099, + "headersEndOffset": 5554101, + "endOffset": 5554955, "message": { "lineNumber": 77221, - "begin": 5554101, - "headersEnd": 5554230, + "beginOffset": 5554101, + "headersEndOffset": 5554230, + "endOffset": 5554955, "body": { "mimeType": "text/plain", "lineNumber": 77221, - "begin": 5554101, - "headersEnd": 5554230, - "end": 5554955, + "beginOffset": 5554101, + "headersEndOffset": 5554230, + "endOffset": 5554955, "octets": 725, "lines": 11 }, - "end": 5554955, "octets": 725 }, - "end": 5554955, "octets": 854, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 77238, - "begin": 5554989, - "headersEnd": 5554991, + "beginOffset": 5554989, + "headersEndOffset": 5554991, + "endOffset": 5555827, "message": { "lineNumber": 77239, - "begin": 5554991, - "headersEnd": 5555107, + "beginOffset": 5554991, + "headersEndOffset": 5555107, + "endOffset": 5555827, "body": { "mimeType": "text/plain", "lineNumber": 77239, - "begin": 5554991, - "headersEnd": 5555107, - "end": 5555827, + "beginOffset": 5554991, + "headersEndOffset": 5555107, + "endOffset": 5555827, "octets": 720, "lines": 17 }, - "end": 5555827, "octets": 720 }, - "end": 5555827, "octets": 836, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77262, - "begin": 5555861, - "headersEnd": 5555863, + "beginOffset": 5555861, + "headersEndOffset": 5555863, + "endOffset": 5556390, "message": { "lineNumber": 77263, - "begin": 5555863, - "headersEnd": 5555999, + "beginOffset": 5555863, + "headersEndOffset": 5555999, + "endOffset": 5556390, "body": { "mimeType": "text/plain", "lineNumber": 77263, - "begin": 5555863, - "headersEnd": 5555999, - "end": 5556390, + "beginOffset": 5555863, + "headersEndOffset": 5555999, + "endOffset": 5556390, "octets": 391, "lines": 11 }, - "end": 5556390, "octets": 391 }, - "end": 5556390, "octets": 527, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 77280, - "begin": 5556424, - "headersEnd": 5556426, + "beginOffset": 5556424, + "headersEndOffset": 5556426, + "endOffset": 5557567, "message": { "lineNumber": 77281, - "begin": 5556426, - "headersEnd": 5556566, + "beginOffset": 5556426, + "headersEndOffset": 5556566, + "endOffset": 5557567, "body": { "mimeType": "text/plain", "lineNumber": 77281, - "begin": 5556426, - "headersEnd": 5556566, - "end": 5557567, + "beginOffset": 5556426, + "headersEndOffset": 5556566, + "endOffset": 5557567, "octets": 1001, "lines": 24 }, - "end": 5557567, "octets": 1001 }, - "end": 5557567, "octets": 1141, "lines": 28 }, { "mimeType": "message/rfc822", "lineNumber": 77311, - "begin": 5557601, - "headersEnd": 5557603, + "beginOffset": 5557601, + "headersEndOffset": 5557603, + "endOffset": 5558229, "message": { "lineNumber": 77312, - "begin": 5557603, - "headersEnd": 5557752, + "beginOffset": 5557603, + "headersEndOffset": 5557752, + "endOffset": 5558229, "body": { "mimeType": "text/plain", "lineNumber": 77312, - "begin": 5557603, - "headersEnd": 5557752, - "end": 5558229, + "beginOffset": 5557603, + "headersEndOffset": 5557752, + "endOffset": 5558229, "octets": 477, "lines": 10 }, - "end": 5558229, "octets": 477 }, - "end": 5558229, "octets": 626, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77328, - "begin": 5558263, - "headersEnd": 5558265, + "beginOffset": 5558263, + "headersEndOffset": 5558265, + "endOffset": 5558691, "message": { "lineNumber": 77329, - "begin": 5558265, - "headersEnd": 5558402, + "beginOffset": 5558265, + "headersEndOffset": 5558402, + "endOffset": 5558691, "body": { "mimeType": "text/plain", "lineNumber": 77329, - "begin": 5558265, - "headersEnd": 5558402, - "end": 5558691, + "beginOffset": 5558265, + "headersEndOffset": 5558402, + "endOffset": 5558691, "octets": 289, "lines": 10 }, - "end": 5558691, "octets": 289 }, - "end": 5558691, "octets": 426, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77345, - "begin": 5558725, - "headersEnd": 5558727, + "beginOffset": 5558725, + "headersEndOffset": 5558727, + "endOffset": 5559142, "message": { "lineNumber": 77346, - "begin": 5558727, - "headersEnd": 5558856, + "beginOffset": 5558727, + "headersEndOffset": 5558856, + "endOffset": 5559142, "body": { "mimeType": "text/plain", "lineNumber": 77346, - "begin": 5558727, - "headersEnd": 5558856, - "end": 5559142, + "beginOffset": 5558727, + "headersEndOffset": 5558856, + "endOffset": 5559142, "octets": 286, "lines": 4 }, - "end": 5559142, "octets": 286 }, - "end": 5559142, "octets": 415, "lines": 8 }, { "mimeType": "message/rfc822", "lineNumber": 77356, - "begin": 5559176, - "headersEnd": 5559178, + "beginOffset": 5559176, + "headersEndOffset": 5559178, + "endOffset": 5559973, "message": { "lineNumber": 77357, - "begin": 5559178, - "headersEnd": 5559303, + "beginOffset": 5559178, + "headersEndOffset": 5559303, + "endOffset": 5559973, "body": { "mimeType": "text/plain", "lineNumber": 77357, - "begin": 5559178, - "headersEnd": 5559303, - "end": 5559973, + "beginOffset": 5559178, + "headersEndOffset": 5559303, + "endOffset": 5559973, "octets": 670, "lines": 27 }, - "end": 5559973, "octets": 670 }, - "end": 5559973, "octets": 795, "lines": 31 }, { "mimeType": "message/rfc822", "lineNumber": 77390, - "begin": 5560007, - "headersEnd": 5560009, + "beginOffset": 5560007, + "headersEndOffset": 5560009, + "endOffset": 5562461, "message": { "lineNumber": 77391, - "begin": 5560009, - "headersEnd": 5560157, + "beginOffset": 5560009, + "headersEndOffset": 5560157, + "endOffset": 5562461, "body": { "mimeType": "text/plain", "lineNumber": 77391, - "begin": 5560009, - "headersEnd": 5560157, - "end": 5562461, + "beginOffset": 5560009, + "headersEndOffset": 5560157, + "endOffset": 5562461, "octets": 2304, "lines": 46 }, - "end": 5562461, "octets": 2304 }, - "end": 5562461, "octets": 2452, "lines": 50 }, { "mimeType": "message/rfc822", "lineNumber": 77443, - "begin": 5562495, - "headersEnd": 5562497, + "beginOffset": 5562495, + "headersEndOffset": 5562497, + "endOffset": 5563432, "message": { "lineNumber": 77444, - "begin": 5562497, - "headersEnd": 5562623, + "beginOffset": 5562497, + "headersEndOffset": 5562623, + "endOffset": 5563432, "body": { "mimeType": "text/plain", "lineNumber": 77444, - "begin": 5562497, - "headersEnd": 5562623, - "end": 5563432, + "beginOffset": 5562497, + "headersEndOffset": 5562623, + "endOffset": 5563432, "octets": 809, "lines": 17 }, - "end": 5563432, "octets": 809 }, - "end": 5563432, "octets": 935, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77467, - "begin": 5563466, - "headersEnd": 5563468, + "beginOffset": 5563466, + "headersEndOffset": 5563468, + "endOffset": 5563802, "message": { "lineNumber": 77468, - "begin": 5563468, - "headersEnd": 5563566, + "beginOffset": 5563468, + "headersEndOffset": 5563566, + "endOffset": 5563802, "body": { "mimeType": "text/plain", "lineNumber": 77468, - "begin": 5563468, - "headersEnd": 5563566, - "end": 5563802, + "beginOffset": 5563468, + "headersEndOffset": 5563566, + "endOffset": 5563802, "octets": 236, "lines": 10 }, - "end": 5563802, "octets": 236 }, - "end": 5563802, "octets": 334, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77484, - "begin": 5563836, - "headersEnd": 5563838, + "beginOffset": 5563836, + "headersEndOffset": 5563838, + "endOffset": 5564651, "message": { "lineNumber": 77485, - "begin": 5563838, - "headersEnd": 5563963, + "beginOffset": 5563838, + "headersEndOffset": 5563963, + "endOffset": 5564651, "body": { "mimeType": "text/plain", "lineNumber": 77485, - "begin": 5563838, - "headersEnd": 5563963, - "end": 5564651, + "beginOffset": 5563838, + "headersEndOffset": 5563963, + "endOffset": 5564651, "octets": 688, "lines": 20 }, - "end": 5564651, "octets": 688 }, - "end": 5564651, "octets": 813, "lines": 24 }, { "mimeType": "message/rfc822", "lineNumber": 77511, - "begin": 5564685, - "headersEnd": 5564687, + "beginOffset": 5564685, + "headersEndOffset": 5564687, + "endOffset": 5567416, "message": { "lineNumber": 77512, - "begin": 5564687, - "headersEnd": 5564801, + "beginOffset": 5564687, + "headersEndOffset": 5564801, + "endOffset": 5567416, "body": { "mimeType": "text/plain", "lineNumber": 77512, - "begin": 5564687, - "headersEnd": 5564801, - "end": 5567416, + "beginOffset": 5564687, + "headersEndOffset": 5564801, + "endOffset": 5567416, "octets": 2615, "lines": 68 }, - "end": 5567416, "octets": 2615 }, - "end": 5567416, "octets": 2729, "lines": 72 }, { "mimeType": "message/rfc822", "lineNumber": 77586, - "begin": 5567450, - "headersEnd": 5567452, + "beginOffset": 5567450, + "headersEndOffset": 5567452, + "endOffset": 5568805, "message": { "lineNumber": 77587, - "begin": 5567452, - "headersEnd": 5567562, + "beginOffset": 5567452, + "headersEndOffset": 5567562, + "endOffset": 5568805, "body": { "mimeType": "text/plain", "lineNumber": 77587, - "begin": 5567452, - "headersEnd": 5567562, - "end": 5568805, + "beginOffset": 5567452, + "headersEndOffset": 5567562, + "endOffset": 5568805, "octets": 1243, "lines": 34 }, - "end": 5568805, "octets": 1243 }, - "end": 5568805, "octets": 1353, "lines": 38 }, { "mimeType": "message/rfc822", "lineNumber": 77627, - "begin": 5568839, - "headersEnd": 5568841, + "beginOffset": 5568839, + "headersEndOffset": 5568841, + "endOffset": 5570791, "message": { "lineNumber": 77628, - "begin": 5568841, - "headersEnd": 5568951, + "beginOffset": 5568841, + "headersEndOffset": 5568951, + "endOffset": 5570791, "body": { "mimeType": "text/plain", "lineNumber": 77628, - "begin": 5568841, - "headersEnd": 5568951, - "end": 5570791, + "beginOffset": 5568841, + "headersEndOffset": 5568951, + "endOffset": 5570791, "octets": 1840, "lines": 43 }, - "end": 5570791, "octets": 1840 }, - "end": 5570791, "octets": 1950, "lines": 47 }, { "mimeType": "message/rfc822", "lineNumber": 77677, - "begin": 5570825, - "headersEnd": 5570827, + "beginOffset": 5570825, + "headersEndOffset": 5570827, + "endOffset": 5571542, "message": { "lineNumber": 77678, - "begin": 5570827, - "headersEnd": 5570960, + "beginOffset": 5570827, + "headersEndOffset": 5570960, + "endOffset": 5571542, "body": { "mimeType": "text/plain", "lineNumber": 77678, - "begin": 5570827, - "headersEnd": 5570960, - "end": 5571542, + "beginOffset": 5570827, + "headersEndOffset": 5570960, + "endOffset": 5571542, "octets": 582, "lines": 12 }, - "end": 5571542, "octets": 582 }, - "end": 5571542, "octets": 715, "lines": 16 }, { "mimeType": "message/rfc822", "lineNumber": 77696, - "begin": 5571576, - "headersEnd": 5571578, + "beginOffset": 5571576, + "headersEndOffset": 5571578, + "endOffset": 5573024, "message": { "lineNumber": 77697, - "begin": 5571578, - "headersEnd": 5571670, + "beginOffset": 5571578, + "headersEndOffset": 5571670, + "endOffset": 5573024, "body": { "mimeType": "text/plain", "lineNumber": 77697, - "begin": 5571578, - "headersEnd": 5571670, - "end": 5573024, + "beginOffset": 5571578, + "headersEndOffset": 5571670, + "endOffset": 5573024, "octets": 1354, "lines": 20 }, - "end": 5573024, "octets": 1354 }, - "end": 5573024, "octets": 1446, "lines": 24 }, { "mimeType": "message/rfc822", "lineNumber": 77723, - "begin": 5573058, - "headersEnd": 5573060, + "beginOffset": 5573058, + "headersEndOffset": 5573060, + "endOffset": 5575356, "message": { "lineNumber": 77724, - "begin": 5573060, - "headersEnd": 5573180, + "beginOffset": 5573060, + "headersEndOffset": 5573180, + "endOffset": 5575356, "body": { "mimeType": "text/plain", "lineNumber": 77724, - "begin": 5573060, - "headersEnd": 5573180, - "end": 5575356, + "beginOffset": 5573060, + "headersEndOffset": 5573180, + "endOffset": 5575356, "octets": 2176, "lines": 49 }, - "end": 5575356, "octets": 2176 }, - "end": 5575356, "octets": 2296, "lines": 53 }, { "mimeType": "message/rfc822", "lineNumber": 77779, - "begin": 5575390, - "headersEnd": 5575392, + "beginOffset": 5575390, + "headersEndOffset": 5575392, + "endOffset": 5577580, "message": { "lineNumber": 77780, - "begin": 5575392, - "headersEnd": 5575517, + "beginOffset": 5575392, + "headersEndOffset": 5575517, + "endOffset": 5577580, "body": { "mimeType": "text/plain", "lineNumber": 77780, - "begin": 5575392, - "headersEnd": 5575517, - "end": 5577580, + "beginOffset": 5575392, + "headersEndOffset": 5575517, + "endOffset": 5577580, "octets": 2063, "lines": 42 }, - "end": 5577580, "octets": 2063 }, - "end": 5577580, "octets": 2188, "lines": 46 }, { "mimeType": "message/rfc822", "lineNumber": 77828, - "begin": 5577614, - "headersEnd": 5577616, + "beginOffset": 5577614, + "headersEndOffset": 5577616, + "endOffset": 5578437, "message": { "lineNumber": 77829, - "begin": 5577616, - "headersEnd": 5577741, + "beginOffset": 5577616, + "headersEndOffset": 5577741, + "endOffset": 5578437, "body": { "mimeType": "text/plain", "lineNumber": 77829, - "begin": 5577616, - "headersEnd": 5577741, - "end": 5578437, + "beginOffset": 5577616, + "headersEndOffset": 5577741, + "endOffset": 5578437, "octets": 696, "lines": 19 }, - "end": 5578437, "octets": 696 }, - "end": 5578437, "octets": 821, "lines": 23 }, { "mimeType": "message/rfc822", "lineNumber": 77854, - "begin": 5578471, - "headersEnd": 5578473, + "beginOffset": 5578471, + "headersEndOffset": 5578473, + "endOffset": 5579450, "message": { "lineNumber": 77855, - "begin": 5578473, - "headersEnd": 5578614, + "beginOffset": 5578473, + "headersEndOffset": 5578614, + "endOffset": 5579450, "body": { "mimeType": "text/plain", "lineNumber": 77855, - "begin": 5578473, - "headersEnd": 5578614, - "end": 5579450, + "beginOffset": 5578473, + "headersEndOffset": 5578614, + "endOffset": 5579450, "octets": 836, "lines": 16 }, - "end": 5579450, "octets": 836 }, - "end": 5579450, "octets": 977, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 77877, - "begin": 5579484, - "headersEnd": 5579486, + "beginOffset": 5579484, + "headersEndOffset": 5579486, + "endOffset": 5580359, "message": { "lineNumber": 77878, - "begin": 5579486, - "headersEnd": 5579614, + "beginOffset": 5579486, + "headersEndOffset": 5579614, + "endOffset": 5580359, "body": { "mimeType": "text/plain", "lineNumber": 77878, - "begin": 5579486, - "headersEnd": 5579614, - "end": 5580359, + "beginOffset": 5579486, + "headersEndOffset": 5579614, + "endOffset": 5580359, "octets": 745, "lines": 21 }, - "end": 5580359, "octets": 745 }, - "end": 5580359, "octets": 873, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 77905, - "begin": 5580393, - "headersEnd": 5580395, + "beginOffset": 5580393, + "headersEndOffset": 5580395, + "endOffset": 5581257, "message": { "lineNumber": 77906, - "begin": 5580395, - "headersEnd": 5580501, + "beginOffset": 5580395, + "headersEndOffset": 5580501, + "endOffset": 5581257, "body": { "mimeType": "text/plain", "lineNumber": 77906, - "begin": 5580395, - "headersEnd": 5580501, - "end": 5581257, + "beginOffset": 5580395, + "headersEndOffset": 5580501, + "endOffset": 5581257, "octets": 756, "lines": 16 }, - "end": 5581257, "octets": 756 }, - "end": 5581257, "octets": 862, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 77928, - "begin": 5581291, - "headersEnd": 5581293, + "beginOffset": 5581291, + "headersEndOffset": 5581293, + "endOffset": 5581820, "message": { "lineNumber": 77929, - "begin": 5581293, - "headersEnd": 5581454, + "beginOffset": 5581293, + "headersEndOffset": 5581454, + "endOffset": 5581820, "body": { "mimeType": "text/plain", "lineNumber": 77929, - "begin": 5581293, - "headersEnd": 5581454, - "end": 5581820, + "beginOffset": 5581293, + "headersEndOffset": 5581454, + "endOffset": 5581820, "octets": 366, "lines": 7 }, - "end": 5581820, "octets": 366 }, - "end": 5581820, "octets": 527, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 77943, - "begin": 5581854, - "headersEnd": 5581856, + "beginOffset": 5581854, + "headersEndOffset": 5581856, + "endOffset": 5582597, "message": { "lineNumber": 77944, - "begin": 5581856, - "headersEnd": 5581947, + "beginOffset": 5581856, + "headersEndOffset": 5581947, + "endOffset": 5582597, "body": { "mimeType": "text/plain", "lineNumber": 77944, - "begin": 5581856, - "headersEnd": 5581947, - "end": 5582597, + "beginOffset": 5581856, + "headersEndOffset": 5581947, + "endOffset": 5582597, "octets": 650, "lines": 15 }, - "end": 5582597, "octets": 650 }, - "end": 5582597, "octets": 741, "lines": 19 }, { "mimeType": "message/rfc822", "lineNumber": 77965, - "begin": 5582631, - "headersEnd": 5582633, + "beginOffset": 5582631, + "headersEndOffset": 5582633, + "endOffset": 5583169, "message": { "lineNumber": 77966, - "begin": 5582633, - "headersEnd": 5582786, + "beginOffset": 5582633, + "headersEndOffset": 5582786, + "endOffset": 5583169, "body": { "mimeType": "text/plain", "lineNumber": 77966, - "begin": 5582633, - "headersEnd": 5582786, - "end": 5583169, + "beginOffset": 5582633, + "headersEndOffset": 5582786, + "endOffset": 5583169, "octets": 383, "lines": 17 }, - "end": 5583169, "octets": 383 }, - "end": 5583169, "octets": 536, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77989, - "begin": 5583203, - "headersEnd": 5583205, + "beginOffset": 5583203, + "headersEndOffset": 5583205, + "endOffset": 5583604, "message": { "lineNumber": 77990, - "begin": 5583205, - "headersEnd": 5583310, + "beginOffset": 5583205, + "headersEndOffset": 5583310, + "endOffset": 5583604, "body": { "mimeType": "text/plain", "lineNumber": 77990, - "begin": 5583205, - "headersEnd": 5583310, - "end": 5583604, + "beginOffset": 5583205, + "headersEndOffset": 5583310, + "endOffset": 5583604, "octets": 294, "lines": 6 }, - "end": 5583604, "octets": 294 }, - "end": 5583604, "octets": 399, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 78002, - "begin": 5583638, - "headersEnd": 5583640, + "beginOffset": 5583638, + "headersEndOffset": 5583640, + "endOffset": 5584267, "message": { "lineNumber": 78003, - "begin": 5583640, - "headersEnd": 5583772, + "beginOffset": 5583640, + "headersEndOffset": 5583772, + "endOffset": 5584267, "body": { "mimeType": "text/plain", "lineNumber": 78003, - "begin": 5583640, - "headersEnd": 5583772, - "end": 5584267, + "beginOffset": 5583640, + "headersEndOffset": 5583772, + "endOffset": 5584267, "octets": 495, "lines": 16 }, - "end": 5584267, "octets": 495 }, - "end": 5584267, "octets": 627, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 78025, - "begin": 5584301, - "headersEnd": 5584303, + "beginOffset": 5584301, + "headersEndOffset": 5584303, + "endOffset": 5584803, "message": { "lineNumber": 78026, - "begin": 5584303, - "headersEnd": 5584404, + "beginOffset": 5584303, + "headersEndOffset": 5584404, + "endOffset": 5584803, "body": { "mimeType": "text/plain", "lineNumber": 78026, - "begin": 5584303, - "headersEnd": 5584404, - "end": 5584803, + "beginOffset": 5584303, + "headersEndOffset": 5584404, + "endOffset": 5584803, "octets": 399, "lines": 19 }, - "end": 5584803, "octets": 399 }, - "end": 5584803, "octets": 500, "lines": 23 }, { "mimeType": "message/rfc822", "lineNumber": 78051, - "begin": 5584837, - "headersEnd": 5584839, + "beginOffset": 5584837, + "headersEndOffset": 5584839, + "endOffset": 5586303, "message": { "lineNumber": 78052, - "begin": 5584839, - "headersEnd": 5584958, + "beginOffset": 5584839, + "headersEndOffset": 5584958, + "endOffset": 5586303, "body": { "mimeType": "text/plain", "lineNumber": 78052, - "begin": 5584839, - "headersEnd": 5584958, - "end": 5586303, + "beginOffset": 5584839, + "headersEndOffset": 5584958, + "endOffset": 5586303, "octets": 1345, "lines": 26 }, - "end": 5586303, "octets": 1345 }, - "end": 5586303, "octets": 1464, "lines": 30 }, { "mimeType": "message/rfc822", "lineNumber": 78084, - "begin": 5586337, - "headersEnd": 5586339, + "beginOffset": 5586337, + "headersEndOffset": 5586339, + "endOffset": 5586747, "message": { "lineNumber": 78085, - "begin": 5586339, - "headersEnd": 5586443, + "beginOffset": 5586339, + "headersEndOffset": 5586443, + "endOffset": 5586747, "body": { "mimeType": "text/plain", "lineNumber": 78085, - "begin": 5586339, - "headersEnd": 5586443, - "end": 5586747, + "beginOffset": 5586339, + "headersEndOffset": 5586443, + "endOffset": 5586747, "octets": 304, "lines": 9 }, - "end": 5586747, "octets": 304 }, - "end": 5586747, "octets": 408, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 78100, - "begin": 5586781, - "headersEnd": 5586783, + "beginOffset": 5586781, + "headersEndOffset": 5586783, + "endOffset": 5587985, "message": { "lineNumber": 78101, - "begin": 5586783, - "headersEnd": 5586930, + "beginOffset": 5586783, + "headersEndOffset": 5586930, + "endOffset": 5587985, "body": { "mimeType": "text/plain", "lineNumber": 78101, - "begin": 5586783, - "headersEnd": 5586930, - "end": 5587985, + "beginOffset": 5586783, + "headersEndOffset": 5586930, + "endOffset": 5587985, "octets": 1055, "lines": 36 }, - "end": 5587985, "octets": 1055 }, - "end": 5587985, "octets": 1202, "lines": 40 } ], - "end": 5588021, "octets": 66055, "lines": 1845 } ], - "end": 5588100, "octets": 70738, "lines": 1958 }, - "end": 5588100, "octets": 70738 }, { - "mboxMarkerBegin": 5588102, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5588102, "lineNumber": 78149, - "begin": 5588111, - "headersEnd": 5588934, + "beginOffset": 5588111, + "headersEndOffset": 5588934, + "endOffset": 5590853, "body": { "mimeType": "text/plain", "lineNumber": 78149, - "begin": 5588111, - "headersEnd": 5588934, - "end": 5590853, + "beginOffset": 5588111, + "headersEndOffset": 5588934, + "endOffset": 5590853, "octets": 1919, "lines": 49 }, - "end": 5590853, "octets": 1919 }, { - "mboxMarkerBegin": 5590855, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5590855, "lineNumber": 78214, - "begin": 5590864, - "headersEnd": 5591607, + "beginOffset": 5590864, + "headersEndOffset": 5591607, + "endOffset": 5748407, "body": { "mimeType": "multipart/mixed", "lineNumber": 78214, - "begin": 5590864, - "headersEnd": 5591607, + "beginOffset": 5590864, + "headersEndOffset": 5591607, + "endOffset": 5748407, "children": [ { "mimeType": "text/plain", "lineNumber": 78231, - "begin": 5591635, - "headersEnd": 5591637, - "end": 5591750, + "beginOffset": 5591635, + "headersEndOffset": 5591637, + "endOffset": 5591750, "octets": 113, "lines": 2 }, { "mimeType": "application/x-annotate", "lineNumber": 78235, - "begin": 5591780, - "headersEnd": 5591872, - "end": 5724575, + "beginOffset": 5591780, + "headersEndOffset": 5591872, + "endOffset": 5724575, "octets": 132703, "lines": 2012 }, { "mimeType": "text/plain", "lineNumber": 80251, - "begin": 5724605, - "headersEnd": 5724607, - "end": 5724663, + "beginOffset": 5724605, + "headersEndOffset": 5724607, + "endOffset": 5724663, "octets": 56, "lines": 2 }, { "mimeType": "image/pbm", "lineNumber": 80255, - "begin": 5724693, - "headersEnd": 5724843, - "end": 5739817, + "beginOffset": 5724693, + "headersEndOffset": 5724843, + "endOffset": 5739817, "octets": 14974, "lines": 78 }, { "mimeType": "text/plain", "lineNumber": 80339, - "begin": 5739847, - "headersEnd": 5739849, - "end": 5739944, + "beginOffset": 5739847, + "headersEndOffset": 5739849, + "endOffset": 5739944, "octets": 95, "lines": 6 }, { "mimeType": "image/pbm", "lineNumber": 80347, - "begin": 5739974, - "headersEnd": 5740124, - "end": 5748266, + "beginOffset": 5739974, + "headersEndOffset": 5740124, + "endOffset": 5748266, "octets": 8142, "lines": 42 }, { "mimeType": "text/plain", "lineNumber": 80395, - "begin": 5748296, - "headersEnd": 5748298, - "end": 5748375, + "beginOffset": 5748296, + "headersEndOffset": 5748298, + "endOffset": 5748375, "octets": 77, "lines": 4 } ], - "end": 5748407, "octets": 156800, "lines": 2171 }, - "end": 5748407, "octets": 156800 }, { - "mboxMarkerBegin": 5748409, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5748409, "lineNumber": 80403, - "begin": 5748418, - "headersEnd": 5748956, + "beginOffset": 5748418, + "headersEndOffset": 5748956, + "endOffset": 5749545, "body": { "mimeType": "text/richtext", "lineNumber": 80403, - "begin": 5748418, - "headersEnd": 5748956, - "end": 5749545, + "beginOffset": 5748418, + "headersEndOffset": 5748956, + "endOffset": 5749545, "octets": 589, "lines": 21 }, - "end": 5749545, "octets": 589 }, { - "mboxMarkerBegin": 5749547, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5749547, "lineNumber": 80441, - "begin": 5749556, - "headersEnd": 5750765, + "beginOffset": 5749556, + "headersEndOffset": 5750765, + "endOffset": 5811866, "body": { "mimeType": "multipart/alternative", "lineNumber": 80441, - "begin": 5749556, - "headersEnd": 5750765, + "beginOffset": 5749556, + "headersEndOffset": 5750765, + "endOffset": 5811866, "children": [ { "mimeType": "text/plain", "lineNumber": 80468, - "begin": 5750964, - "headersEnd": 5751010, - "end": 5751766, + "beginOffset": 5750964, + "headersEndOffset": 5751010, + "endOffset": 5751766, "octets": 756, "lines": 26 }, { "mimeType": "multipart/mixed", "lineNumber": 80498, - "begin": 5751809, - "headersEnd": 5751897, + "beginOffset": 5751809, + "headersEndOffset": 5751897, + "endOffset": 5811821, "children": [ { "mimeType": "text/richtext", "lineNumber": 80502, - "begin": 5751940, - "headersEnd": 5752034, - "end": 5752861, + "beginOffset": 5751940, + "headersEndOffset": 5752034, + "endOffset": 5752861, "octets": 827, "lines": 25 }, { "mimeType": "image/gif", "lineNumber": 80532, - "begin": 5752906, - "headersEnd": 5753003, - "end": 5811629, + "beginOffset": 5752906, + "headersEndOffset": 5753003, + "endOffset": 5811629, "octets": 58626, "lines": 755 }, { "mimeType": "text/richtext", "lineNumber": 81293, - "begin": 5811674, - "headersEnd": 5811768, - "end": 5811774, + "beginOffset": 5811674, + "headersEndOffset": 5811768, + "endOffset": 5811774, "octets": 6, "lines": 1 } ], - "end": 5811821, "octets": 59924, "lines": 798 } ], - "end": 5811866, "octets": 61101, "lines": 837 }, - "end": 5811866, "octets": 61101 }, { - "mboxMarkerBegin": 5811868, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5811868, "lineNumber": 81303, - "begin": 5811877, - "headersEnd": 5812634, + "beginOffset": 5811877, + "headersEndOffset": 5812634, + "endOffset": 5869132, "body": { "mimeType": "multipart/mixed", "lineNumber": 81303, - "begin": 5811877, - "headersEnd": 5812634, + "beginOffset": 5811877, + "headersEndOffset": 5812634, + "endOffset": 5869132, "children": [ { "mimeType": "text/plain", "lineNumber": 81322, - "begin": 5812686, - "headersEnd": 5812779, - "end": 5812960, + "beginOffset": 5812686, + "headersEndOffset": 5812779, + "endOffset": 5812960, "octets": 181, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 81334, - "begin": 5813012, - "headersEnd": 5813074, - "end": 5869078, + "beginOffset": 5813012, + "headersEndOffset": 5813074, + "endOffset": 5869078, "octets": 56004, "lines": 757 } ], - "end": 5869132, "octets": 56498, "lines": 775 }, - "end": 5869132, "octets": 56498 }, { - "mboxMarkerBegin": 5869134, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 5869134, "lineNumber": 82097, - "begin": 5869167, - "headersEnd": 5870664, + "beginOffset": 5869167, + "headersEndOffset": 5870664, + "endOffset": 5872038, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 82097, - "begin": 5869167, - "headersEnd": 5870664, - "end": 5872038, + "beginOffset": 5869167, + "headersEndOffset": 5870664, + "endOffset": 5872038, "octets": 1374, "lines": 34 }, - "end": 5872038, "octets": 1374 }, { - "mboxMarkerBegin": 5872040, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5872040, "lineNumber": 82163, - "begin": 5872049, - "headersEnd": 5872857, + "beginOffset": 5872049, + "headersEndOffset": 5872857, + "endOffset": 5899485, "body": { "mimeType": "multipart/mixed", "lineNumber": 82163, - "begin": 5872049, - "headersEnd": 5872857, + "beginOffset": 5872049, + "headersEndOffset": 5872857, + "endOffset": 5899485, "children": [ { "mimeType": "text/plain", "lineNumber": 82180, - "begin": 5872931, - "headersEnd": 5873010, - "end": 5873393, + "beginOffset": 5872931, + "headersEndOffset": 5873010, + "endOffset": 5873393, "octets": 383, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 82198, - "begin": 5873421, - "headersEnd": 5873515, + "beginOffset": 5873421, + "headersEndOffset": 5873515, + "endOffset": 5899455, "message": { "lineNumber": 82202, - "begin": 5873515, - "headersEnd": 5874597, + "beginOffset": 5873515, + "headersEndOffset": 5874597, + "endOffset": 5899455, "body": { "mimeType": "text/html", "lineNumber": 82202, - "begin": 5873515, - "headersEnd": 5874597, - "end": 5899455, + "beginOffset": 5873515, + "headersEndOffset": 5874597, + "endOffset": 5899455, "octets": 24858, "lines": 463 }, - "end": 5899455, "octets": 24858 }, - "end": 5899455, "octets": 25940, "lines": 477 } ], - "end": 5899485, "octets": 26628, "lines": 504 }, - "end": 5899485, "octets": 26628 }, { - "mboxMarkerBegin": 5899487, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5899487, "lineNumber": 82683, - "begin": 5899496, - "headersEnd": 5900178, + "beginOffset": 5899496, + "headersEndOffset": 5900178, + "endOffset": 5923009, "body": { "mimeType": "multipart/mixed", "lineNumber": 82683, - "begin": 5899496, - "headersEnd": 5900178, + "beginOffset": 5899496, + "headersEndOffset": 5900178, + "endOffset": 5923009, "children": [ { "mimeType": "text/plain", "lineNumber": 82700, - "begin": 5900275, - "headersEnd": 5900356, - "end": 5900391, + "beginOffset": 5900275, + "headersEndOffset": 5900356, + "endOffset": 5900391, "octets": 35, "lines": 1 }, { "mimeType": "image/gif", "lineNumber": 82706, - "begin": 5900442, - "headersEnd": 5900504, - "end": 5922958, + "beginOffset": 5900442, + "headersEndOffset": 5900504, + "endOffset": 5922958, "octets": 22454, "lines": 304 } ], - "end": 5923009, "octets": 22831, "lines": 317 }, - "end": 5923009, "octets": 22831 }, { - "mboxMarkerBegin": 5923011, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 5923011, "lineNumber": 83015, - "begin": 5923044, - "headersEnd": 5923581, + "beginOffset": 5923044, + "headersEndOffset": 5923581, + "endOffset": 5925456, "body": { "mimeType": "multipart/mixed", "lineNumber": 83015, - "begin": 5923044, - "headersEnd": 5923581, + "beginOffset": 5923044, + "headersEndOffset": 5923581, + "endOffset": 5925456, "children": [ { "mimeType": "text/plain", "lineNumber": 83029, - "begin": 5923590, - "headersEnd": 5923636, - "end": 5924829, + "beginOffset": 5923590, + "headersEndOffset": 5923636, + "endOffset": 5924829, "octets": 1193, "lines": 21 }, { "mimeType": "text/plain", "lineNumber": 83054, - "begin": 5924840, - "headersEnd": 5924970, - "end": 5925118, + "beginOffset": 5924840, + "headersEndOffset": 5924970, + "endOffset": 5925118, "octets": 148, "lines": 3 }, { "mimeType": "text/plain", "lineNumber": 83062, - "begin": 5925129, - "headersEnd": 5925249, - "end": 5925445, + "beginOffset": 5925129, + "headersEndOffset": 5925249, + "endOffset": 5925445, "octets": 196, "lines": 3 } ], - "end": 5925456, "octets": 1875, "lines": 42 }, - "end": 5925456, "octets": 1875 }, { - "mboxMarkerBegin": 5925458, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5925458, "lineNumber": 83071, - "begin": 5925467, - "headersEnd": 5926279, + "beginOffset": 5925467, + "headersEndOffset": 5926279, + "endOffset": 6186575, "body": { "mimeType": "audio/basic", "lineNumber": 83071, - "begin": 5925467, - "headersEnd": 5926279, - "end": 6186575, + "beginOffset": 5925467, + "headersEndOffset": 5926279, + "endOffset": 6186575, "octets": 260296, "lines": 3518 }, - "end": 6186575, "octets": 260296 }, { - "mboxMarkerBegin": 6186577, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6186577, "lineNumber": 86609, - "begin": 6186586, - "headersEnd": 6187457, + "beginOffset": 6186586, + "headersEndOffset": 6187457, + "endOffset": 6287418, "body": { "mimeType": "multipart/mixed", "lineNumber": 86609, - "begin": 6186586, - "headersEnd": 6187457, + "beginOffset": 6186586, + "headersEndOffset": 6187457, + "endOffset": 6287418, "children": [ { "mimeType": "text/plain", "lineNumber": 86630, - "begin": 6187474, - "headersEnd": 6187554, - "end": 6187752, + "beginOffset": 6187474, + "headersEndOffset": 6187554, + "endOffset": 6187752, "octets": 198, "lines": 9 }, { "mimeType": "image/pbm", "lineNumber": 86643, - "begin": 6187769, - "headersEnd": 6187877, - "end": 6287399, + "beginOffset": 6187769, + "headersEndOffset": 6187877, + "endOffset": 6287399, "octets": 99522, "lines": 1276 } ], - "end": 6287418, "octets": 99961, "lines": 1296 }, - "end": 6287418, "octets": 99961 }, { - "mboxMarkerBegin": 6287420, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6287420, "lineNumber": 87926, - "begin": 6287429, - "headersEnd": 6288325, + "beginOffset": 6287429, + "headersEndOffset": 6288325, + "endOffset": 6373131, "body": { "mimeType": "multipart/mixed", "lineNumber": 87926, - "begin": 6287429, - "headersEnd": 6288325, + "beginOffset": 6287429, + "headersEndOffset": 6288325, + "endOffset": 6373131, "children": [ { "mimeType": "text/plain", "lineNumber": 87946, - "begin": 6288335, - "headersEnd": 6288383, - "end": 6289347, + "beginOffset": 6288335, + "headersEndOffset": 6288383, + "endOffset": 6289347, "octets": 964, "lines": 21 }, { "mimeType": "multipart/mixed", "lineNumber": 87971, - "begin": 6289359, - "headersEnd": 6289424, + "beginOffset": 6289359, + "headersEndOffset": 6289424, + "endOffset": 6373117, "children": [ { "mimeType": "multipart/mixed", "lineNumber": 87975, - "begin": 6289449, - "headersEnd": 6289818, + "beginOffset": 6289449, + "headersEndOffset": 6289818, + "endOffset": 6373090, "children": [ { "mimeType": "multipart/mixed", "lineNumber": 87984, - "begin": 6289841, - "headersEnd": 6289946, + "beginOffset": 6289841, + "headersEndOffset": 6289946, + "endOffset": 6291930, "children": [ { "mimeType": "text/richtext", "lineNumber": 87988, - "begin": 6289969, - "headersEnd": 6290096, - "end": 6290470, + "beginOffset": 6289969, + "headersEndOffset": 6290096, + "endOffset": 6290470, "octets": 374, "lines": 8 }, { "mimeType": "text/richtext", "lineNumber": 88002, - "begin": 6290495, - "headersEnd": 6290621, - "end": 6291023, + "beginOffset": 6290495, + "headersEndOffset": 6290621, + "endOffset": 6291023, "octets": 402, "lines": 10 }, { "mimeType": "text/richtext", "lineNumber": 88018, - "begin": 6291048, - "headersEnd": 6291177, - "end": 6291903, + "beginOffset": 6291048, + "headersEndOffset": 6291177, + "endOffset": 6291903, "octets": 726, "lines": 18 } ], - "end": 6291930, "octets": 1984, "lines": 55 }, { "mimeType": "multipart/mixed", "lineNumber": 88044, - "begin": 6291955, - "headersEnd": 6292057, + "beginOffset": 6291955, + "headersEndOffset": 6292057, + "endOffset": 6369276, "children": [ { "mimeType": "text/richtext", "lineNumber": 88048, - "begin": 6292080, - "headersEnd": 6292216, - "end": 6309101, + "beginOffset": 6292080, + "headersEndOffset": 6292216, + "endOffset": 6309101, "octets": 16885, "lines": 470 }, { "mimeType": "text/richtext", "lineNumber": 88524, - "begin": 6309126, - "headersEnd": 6309261, - "end": 6323910, + "beginOffset": 6309126, + "headersEndOffset": 6309261, + "endOffset": 6323910, "octets": 14649, "lines": 395 }, { "mimeType": "multipart/mixed", "lineNumber": 88925, - "begin": 6323935, - "headersEnd": 6324039, + "beginOffset": 6323935, + "headersEndOffset": 6324039, + "endOffset": 6368422, "children": [ { "mimeType": "text/richtext", "lineNumber": 88929, - "begin": 6324062, - "headersEnd": 6324208, - "end": 6330524, + "beginOffset": 6324062, + "headersEndOffset": 6324208, + "endOffset": 6330524, "octets": 6316, "lines": 164 }, { "mimeType": "text/richtext", "lineNumber": 89099, - "begin": 6330549, - "headersEnd": 6330680, - "end": 6336095, + "beginOffset": 6330549, + "headersEndOffset": 6330680, + "endOffset": 6336095, "octets": 5415, "lines": 160 }, { "mimeType": "text/richtext", "lineNumber": 89265, - "begin": 6336120, - "headersEnd": 6336261, - "end": 6343756, + "beginOffset": 6336120, + "headersEndOffset": 6336261, + "endOffset": 6343756, "octets": 7495, "lines": 197 }, { "mimeType": "text/richtext", "lineNumber": 89468, - "begin": 6343781, - "headersEnd": 6343909, - "end": 6350569, + "beginOffset": 6343781, + "headersEndOffset": 6343909, + "endOffset": 6350569, "octets": 6660, "lines": 184 }, { "mimeType": "text/richtext", "lineNumber": 89658, - "begin": 6350594, - "headersEnd": 6350735, - "end": 6368395, + "beginOffset": 6350594, + "headersEndOffset": 6350735, + "endOffset": 6368395, "octets": 17660, "lines": 492 } ], - "end": 6368422, "octets": 44383, "lines": 1228 }, { "mimeType": "multipart/mixed", "lineNumber": 90158, - "begin": 6368447, - "headersEnd": 6368545, + "beginOffset": 6368447, + "headersEndOffset": 6368545, + "endOffset": 6369249, "children": [ { "mimeType": "text/richtext", "lineNumber": 90162, - "begin": 6368568, - "headersEnd": 6368706, - "end": 6369222, + "beginOffset": 6368568, + "headersEndOffset": 6368706, + "endOffset": 6369222, "octets": 516, "lines": 21 } ], - "end": 6369249, "octets": 704, "lines": 28 } ], - "end": 6369276, "octets": 77219, "lines": 2144 }, { "mimeType": "multipart/mixed", "lineNumber": 90193, - "begin": 6369301, - "headersEnd": 6369415, + "beginOffset": 6369301, + "headersEndOffset": 6369415, + "endOffset": 6373063, "children": [ { "mimeType": "text/richtext", "lineNumber": 90197, - "begin": 6369438, - "headersEnd": 6369580, - "end": 6370758, + "beginOffset": 6369438, + "headersEndOffset": 6369580, + "endOffset": 6370758, "octets": 1178, "lines": 29 }, { "mimeType": "text/richtext", "lineNumber": 90232, - "begin": 6370783, - "headersEnd": 6370913, - "end": 6372168, + "beginOffset": 6370783, + "headersEndOffset": 6370913, + "endOffset": 6372168, "octets": 1255, "lines": 35 }, { "mimeType": "text/richtext", "lineNumber": 90273, - "begin": 6372193, - "headersEnd": 6372337, - "end": 6373036, + "beginOffset": 6372193, + "headersEndOffset": 6372337, + "endOffset": 6373036, "octets": 699, "lines": 22 } ], - "end": 6373063, "octets": 3648, "lines": 105 } ], - "end": 6373090, "octets": 83272, "lines": 2320 } ], - "end": 6373117, "octets": 83693, "lines": 2332 } ], - "end": 6373131, "octets": 84806, "lines": 2362 }, - "end": 6373131, "octets": 84806 }, { - "mboxMarkerBegin": 6373133, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6373133, "lineNumber": 90309, - "begin": 6373142, - "headersEnd": 6373961, + "beginOffset": 6373142, + "headersEndOffset": 6373961, + "endOffset": 6383386, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 90309, - "begin": 6373142, - "headersEnd": 6373961, - "end": 6383386, + "beginOffset": 6373142, + "headersEndOffset": 6373961, + "endOffset": 6383386, "octets": 9425, "lines": 226 }, - "end": 6383386, "octets": 9425 }, { - "mboxMarkerBegin": 6383388, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6383388, "lineNumber": 90554, - "begin": 6383397, - "headersEnd": 6384141, + "beginOffset": 6383397, + "headersEndOffset": 6384141, + "endOffset": 6477811, "body": { "mimeType": "multipart/alternative", "lineNumber": 90554, - "begin": 6383397, - "headersEnd": 6384141, + "beginOffset": 6383397, + "headersEndOffset": 6384141, + "endOffset": 6477811, "children": [ { "mimeType": "text/plain", "lineNumber": 90574, - "begin": 6384340, - "headersEnd": 6384386, - "end": 6385165, + "beginOffset": 6384340, + "headersEndOffset": 6384386, + "endOffset": 6385165, "octets": 779, "lines": 23 }, { "mimeType": "multipart/mixed", "lineNumber": 90601, - "begin": 6385208, - "headersEnd": 6385296, + "beginOffset": 6385208, + "headersEndOffset": 6385296, + "endOffset": 6477768, "children": [ { "mimeType": "text/richtext", "lineNumber": 90605, - "begin": 6385339, - "headersEnd": 6385433, - "end": 6385767, + "beginOffset": 6385339, + "headersEndOffset": 6385433, + "endOffset": 6385767, "octets": 334, "lines": 7 }, { "mimeType": "audio/basic", "lineNumber": 90617, - "begin": 6385812, - "headersEnd": 6385910, - "end": 6408254, + "beginOffset": 6385812, + "headersEndOffset": 6385910, + "endOffset": 6408254, "octets": 22344, "lines": 320 }, { "mimeType": "text/richtext", "lineNumber": 90943, - "begin": 6408299, - "headersEnd": 6408393, - "end": 6408564, + "beginOffset": 6408299, + "headersEndOffset": 6408393, + "endOffset": 6408564, "octets": 171, "lines": 5 }, { "mimeType": "audio/basic", "lineNumber": 90953, - "begin": 6408609, - "headersEnd": 6408710, - "end": 6456608, + "beginOffset": 6408609, + "headersEndOffset": 6408710, + "endOffset": 6456608, "octets": 47898, "lines": 685 }, { "mimeType": "text/richtext", "lineNumber": 91644, - "begin": 6456653, - "headersEnd": 6456747, - "end": 6456819, + "beginOffset": 6456653, + "headersEndOffset": 6456747, + "endOffset": 6456819, "octets": 72, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 91651, - "begin": 6456864, - "headersEnd": 6456958, - "end": 6477470, + "beginOffset": 6456864, + "headersEndOffset": 6456958, + "endOffset": 6477470, "octets": 20512, "lines": 294 }, { "mimeType": "text/richtext", "lineNumber": 91951, - "begin": 6477515, - "headersEnd": 6477609, - "end": 6477721, + "beginOffset": 6477515, + "headersEndOffset": 6477609, + "endOffset": 6477721, "octets": 112, "lines": 8 } ], - "end": 6477768, "octets": 92472, "lines": 1360 } ], - "end": 6477811, "octets": 93670, "lines": 1396 }, - "end": 6477811, "octets": 93670 }, { - "mboxMarkerBegin": 6477813, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6477813, "lineNumber": 91967, - "begin": 6477822, - "headersEnd": 6478593, + "beginOffset": 6477822, + "headersEndOffset": 6478593, + "endOffset": 6513758, "body": { "mimeType": "multipart/mixed", "lineNumber": 91967, - "begin": 6477822, - "headersEnd": 6478593, + "beginOffset": 6477822, + "headersEndOffset": 6478593, + "endOffset": 6513758, "children": [ { "mimeType": "text/richtext", "lineNumber": 91989, - "begin": 6478838, - "headersEnd": 6478914, - "end": 6479347, + "beginOffset": 6478838, + "headersEndOffset": 6478914, + "endOffset": 6479347, "octets": 433, "lines": 13 }, { "mimeType": "image/x-xwd", "lineNumber": 92007, - "begin": 6479395, - "headersEnd": 6479459, - "end": 6513483, + "beginOffset": 6479395, + "headersEndOffset": 6479459, + "endOffset": 6513483, "octets": 34024, "lines": 460 }, { "mimeType": "text/richtext", "lineNumber": 92472, - "begin": 6513531, - "headersEnd": 6513607, - "end": 6513708, + "beginOffset": 6513531, + "headersEndOffset": 6513607, + "endOffset": 6513708, "octets": 101, "lines": 7 } ], - "end": 6513758, "octets": 35165, "lines": 500 }, - "end": 6513758, "octets": 35165 }, { - "mboxMarkerBegin": 6513760, - "mboxMarkerLength": 41, + "mboxMarkerOffset": 6513760, "lineNumber": 92486, - "begin": 6513803, - "headersEnd": 6513957, + "beginOffset": 6513803, + "headersEndOffset": 6513957, + "endOffset": 6557679, "body": { "mimeType": "text/plain", "lineNumber": 92486, - "begin": 6513803, - "headersEnd": 6513957, - "end": 6557679, + "beginOffset": 6513803, + "headersEndOffset": 6513957, + "endOffset": 6557679, "octets": 43722, "lines": 693 }, - "end": 6557679, "octets": 43722 }, { - "mboxMarkerBegin": 6557681, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6557681, "lineNumber": 93187, - "begin": 6557714, - "headersEnd": 6558312, + "beginOffset": 6557714, + "headersEndOffset": 6558312, + "endOffset": 6583936, "body": { "mimeType": "multipart/mixed", "lineNumber": 93187, - "begin": 6557714, - "headersEnd": 6558312, + "beginOffset": 6557714, + "headersEndOffset": 6558312, + "endOffset": 6583936, "children": [ { "mimeType": "multipart/alternative", "lineNumber": 93205, - "begin": 6558400, - "headersEnd": 6558521, + "beginOffset": 6558400, + "headersEndOffset": 6558521, + "endOffset": 6562620, "children": [ { "mimeType": "text/plain", "lineNumber": 93210, - "begin": 6558563, - "headersEnd": 6558644, - "end": 6559954, + "beginOffset": 6558563, + "headersEndOffset": 6558644, + "endOffset": 6559954, "octets": 1310, "lines": 38 }, { "mimeType": "text/html", "lineNumber": 93253, - "begin": 6559996, - "headersEnd": 6560078, - "end": 6562574, + "beginOffset": 6559996, + "headersEndOffset": 6560078, + "endOffset": 6562574, "octets": 2496, "lines": 32 } ], - "end": 6562620, "octets": 4099, "lines": 83 }, { "mimeType": "application/octet-stream", "lineNumber": 93293, - "begin": 6562662, - "headersEnd": 6562872, - "end": 6583892, + "beginOffset": 6562662, + "headersEndOffset": 6562872, + "endOffset": 6583892, "octets": 21020, "lines": 270 } ], - "end": 6583936, "octets": 25624, "lines": 368 }, - "end": 6583936, "octets": 25624 }, { - "mboxMarkerBegin": 6583938, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6583938, "lineNumber": 93572, - "begin": 6583971, - "headersEnd": 6584388, + "beginOffset": 6583971, + "headersEndOffset": 6584388, + "endOffset": 6587266, "body": { "mimeType": "multipart/mixed", "lineNumber": 93572, - "begin": 6583971, - "headersEnd": 6584388, + "beginOffset": 6583971, + "headersEndOffset": 6584388, + "endOffset": 6587266, "children": [ { "mimeType": "text/plain", "lineNumber": 93586, - "begin": 6584457, - "headersEnd": 6584459, - "end": 6584523, + "beginOffset": 6584457, + "headersEndOffset": 6584459, + "endOffset": 6584523, "octets": 64, "lines": 1 }, { "mimeType": "multipart/alternative", "lineNumber": 93590, - "begin": 6584546, - "headersEnd": 6584622, + "beginOffset": 6584546, + "headersEndOffset": 6584622, + "endOffset": 6586388, "children": [ { "mimeType": "text/plain", "lineNumber": 93593, - "begin": 6584650, - "headersEnd": 6584760, - "end": 6584843, + "beginOffset": 6584650, + "headersEndOffset": 6584760, + "endOffset": 6584843, "octets": 83, "lines": 3 }, { "mimeType": "text/richtext", "lineNumber": 93602, - "begin": 6584873, - "headersEnd": 6584986, - "end": 6585148, + "beginOffset": 6584873, + "headersEndOffset": 6584986, + "endOffset": 6585148, "octets": 162, "lines": 4 }, { "mimeType": "text/enriched", "lineNumber": 93612, - "begin": 6585178, - "headersEnd": 6585291, - "end": 6585464, + "beginOffset": 6585178, + "headersEndOffset": 6585291, + "endOffset": 6585464, "octets": 173, "lines": 10 }, { "mimeType": "text/html", "lineNumber": 93628, - "begin": 6585494, - "headersEnd": 6585603, - "end": 6585767, + "beginOffset": 6585494, + "headersEndOffset": 6585603, + "endOffset": 6585767, "octets": 164, "lines": 3 }, { "mimeType": "text/something-you-dont-know", "lineNumber": 93637, - "begin": 6585797, - "headersEnd": 6585925, - "end": 6586358, + "beginOffset": 6585797, + "headersEndOffset": 6585925, + "endOffset": 6586358, "octets": 433, "lines": 6 } ], - "end": 6586388, "octets": 1766, "lines": 57 }, { "mimeType": "text/plain", "lineNumber": 93650, - "begin": 6586411, - "headersEnd": 6586413, - "end": 6586582, + "beginOffset": 6586411, + "headersEndOffset": 6586413, + "endOffset": 6586582, "octets": 169, "lines": 4 }, { "mimeType": "multipart/alternative", "lineNumber": 93657, - "begin": 6586605, - "headersEnd": 6586657, + "beginOffset": 6586605, + "headersEndOffset": 6586657, + "endOffset": 6587208, "children": [ { "mimeType": "text/plain", "lineNumber": 93660, - "begin": 6586663, - "headersEnd": 6586691, - "end": 6586745, + "beginOffset": 6586663, + "headersEndOffset": 6586691, + "endOffset": 6586745, "octets": 54, "lines": 1 }, { "mimeType": "multipart/alternative", "lineNumber": 93665, - "begin": 6586753, - "headersEnd": 6586805, + "beginOffset": 6586753, + "headersEndOffset": 6586805, + "endOffset": 6587081, "children": [ { "mimeType": "text/plain", "lineNumber": 93668, - "begin": 6586811, - "headersEnd": 6586839, - "end": 6586893, + "beginOffset": 6586811, + "headersEndOffset": 6586839, + "endOffset": 6586893, "octets": 54, "lines": 1 }, { "mimeType": "text/html", "lineNumber": 93673, - "begin": 6586901, - "headersEnd": 6586928, - "end": 6586979, + "beginOffset": 6586901, + "headersEndOffset": 6586928, + "endOffset": 6586979, "octets": 51, "lines": 1 }, { "mimeType": "text/x-barf", "lineNumber": 93678, - "begin": 6586987, - "headersEnd": 6587016, - "end": 6587071, + "beginOffset": 6586987, + "headersEndOffset": 6587016, + "endOffset": 6587071, "octets": 55, "lines": 1 } ], - "end": 6587081, "octets": 276, "lines": 16 }, { "mimeType": "application/spankme", "lineNumber": 93685, - "begin": 6587089, - "headersEnd": 6587184, - "end": 6587200, + "beginOffset": 6587089, + "headersEndOffset": 6587184, + "endOffset": 6587200, "octets": 16, "lines": 1 } ], - "end": 6587208, "octets": 551, "lines": 32 }, { "mimeType": "text/plain", "lineNumber": 93692, - "begin": 6587231, - "headersEnd": 6587233, - "end": 6587243, + "beginOffset": 6587231, + "headersEndOffset": 6587233, + "endOffset": 6587243, "octets": 10, "lines": 1 } ], - "end": 6587266, "octets": 2878, "lines": 113 }, - "end": 6587266, "octets": 2878 }, { - "mboxMarkerBegin": 6587268, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6587268, "lineNumber": 93697, - "begin": 6587301, - "headersEnd": 6587716, + "beginOffset": 6587301, + "headersEndOffset": 6587716, + "endOffset": 6955939, "body": { "mimeType": "multipart/mixed", "lineNumber": 93697, - "begin": 6587301, - "headersEnd": 6587716, + "beginOffset": 6587301, + "headersEndOffset": 6587716, + "endOffset": 6955939, "children": [ { "mimeType": "text/plain", "lineNumber": 93711, - "begin": 6587785, - "headersEnd": 6587787, - "end": 6587855, + "beginOffset": 6587785, + "headersEndOffset": 6587787, + "endOffset": 6587855, "octets": 68, "lines": 1 }, { "mimeType": "multipart/alternative", "lineNumber": 93715, - "begin": 6587878, - "headersEnd": 6587954, + "beginOffset": 6587878, + "headersEndOffset": 6587954, + "endOffset": 6955908, "children": [ { "mimeType": "text/plain", "lineNumber": 93718, - "begin": 6587982, - "headersEnd": 6588142, - "end": 6645008, + "beginOffset": 6587982, + "headersEndOffset": 6588142, + "endOffset": 6645008, "octets": 56866, "lines": 1603 }, { "mimeType": "text/html", "lineNumber": 95327, - "begin": 6645038, - "headersEnd": 6645197, - "end": 6754228, + "beginOffset": 6645038, + "headersEndOffset": 6645197, + "endOffset": 6754228, "octets": 109031, "lines": 2982 }, { "mimeType": "application/postscript", "lineNumber": 98315, - "begin": 6754258, - "headersEnd": 6754408, - "end": 6955876, + "beginOffset": 6754258, + "headersEndOffset": 6754408, + "endOffset": 6955876, "octets": 201468, "lines": 13109 } ], - "end": 6955908, "octets": 367954, "lines": 17713 } ], - "end": 6955939, "octets": 368223, "lines": 17726 }, - "end": 6955939, "octets": 368223 }, { - "mboxMarkerBegin": 6955941, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6955941, "lineNumber": 111435, - "begin": 6955950, - "headersEnd": 6956567, + "beginOffset": 6955950, + "headersEndOffset": 6956567, + "endOffset": 6958045, "body": { "mimeType": "MULTIPART/MIXED", "lineNumber": 111435, - "begin": 6955950, - "headersEnd": 6956567, + "beginOffset": 6955950, + "headersEndOffset": 6956567, + "endOffset": 6958045, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 111453, - "begin": 6956828, - "headersEnd": 6956943, - "end": 6956943, + "beginOffset": 6956828, + "headersEndOffset": 6956943, + "endOffset": 6956943, "octets": 0, "lines": 0 }, { "mimeType": "MESSAGE/RFC822", "lineNumber": 111458, - "begin": 6956986, - "headersEnd": 6957087, + "beginOffset": 6956986, + "headersEndOffset": 6957087, + "endOffset": 6958002, "message": { "lineNumber": 111461, - "begin": 6957087, - "headersEnd": 6957640, + "beginOffset": 6957087, + "headersEndOffset": 6957640, + "endOffset": 6958002, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 111461, - "begin": 6957087, - "headersEnd": 6957640, - "end": 6958002, + "beginOffset": 6957087, + "headersEndOffset": 6957640, + "endOffset": 6958002, "octets": 362, "lines": 16 }, - "end": 6958002, "octets": 362 }, - "end": 6958002, "octets": 915, "lines": 28 } ], - "end": 6958045, "octets": 1478, "lines": 43 }, - "end": 6958045, "octets": 1478 }, { - "mboxMarkerBegin": 6958047, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6958047, "lineNumber": 111492, - "begin": 6958056, - "headersEnd": 6958361, + "beginOffset": 6958056, + "headersEndOffset": 6958361, + "endOffset": 6970685, "body": { "mimeType": "multipart/related", "lineNumber": 111492, - "begin": 6958056, - "headersEnd": 6958361, + "beginOffset": 6958056, + "headersEndOffset": 6958361, + "endOffset": 6970685, "children": [ { "mimeType": "text/html", "lineNumber": 111502, - "begin": 6958401, - "headersEnd": 6958654, - "end": 6959403, + "beginOffset": 6958401, + "headersEndOffset": 6958654, + "endOffset": 6959403, "octets": 749, "lines": 30 }, { "mimeType": "image/jpeg", "lineNumber": 111541, - "begin": 6959445, - "headersEnd": 6959773, - "end": 6970643, + "beginOffset": 6959445, + "headersEndOffset": 6959773, + "endOffset": 6970643, "octets": 10870, "lines": 147 } ], - "end": 6970685, "octets": 12324, "lines": 197 }, - "end": 6970685, "octets": 12324 }, { - "mboxMarkerBegin": 6970687, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6970687, "lineNumber": 111699, - "begin": 6970696, - "headersEnd": 6971001, + "beginOffset": 6970696, + "headersEndOffset": 6971001, + "endOffset": 6983293, "body": { "mimeType": "multipart/related", "lineNumber": 111699, - "begin": 6970696, - "headersEnd": 6971001, + "beginOffset": 6970696, + "headersEndOffset": 6971001, + "endOffset": 6983293, "children": [ { "mimeType": "text/html", "lineNumber": 111709, - "begin": 6971041, - "headersEnd": 6971294, - "end": 6972042, + "beginOffset": 6971041, + "headersEndOffset": 6971294, + "endOffset": 6972042, "octets": 748, "lines": 30 }, { "mimeType": "image/jpeg", "lineNumber": 111748, - "begin": 6972084, - "headersEnd": 6972381, - "end": 6983251, + "beginOffset": 6972084, + "headersEndOffset": 6972381, + "endOffset": 6983251, "octets": 10870, "lines": 147 } ], - "end": 6983293, "octets": 12292, "lines": 197 }, - "end": 6983293, "octets": 12292 }, { - "mboxMarkerBegin": 6983295, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6983295, "lineNumber": 111906, - "begin": 6983328, - "headersEnd": 6984857, + "beginOffset": 6983328, + "headersEndOffset": 6984857, + "endOffset": 6991551, "body": { "mimeType": "multipart/related", "lineNumber": 111906, - "begin": 6983328, - "headersEnd": 6984857, + "beginOffset": 6983328, + "headersEndOffset": 6984857, + "endOffset": 6991551, "children": [ { "mimeType": "text/html", "lineNumber": 111934, - "begin": 6984904, - "headersEnd": 6984998, - "end": 6990308, + "beginOffset": 6984904, + "headersEndOffset": 6984998, + "endOffset": 6990308, "octets": 5310, "lines": 111 }, { "mimeType": "image/gif", "lineNumber": 112050, - "begin": 6990355, - "headersEnd": 6990560, - "end": 6991502, + "beginOffset": 6990355, + "headersEndOffset": 6990560, + "endOffset": 6991502, "octets": 942, "lines": 13 } ], - "end": 6991551, "octets": 6694, "lines": 139 }, - "end": 6991551, "octets": 6694 }, { - "mboxMarkerBegin": 6991553, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6991553, "lineNumber": 112073, - "begin": 6991586, - "headersEnd": 6992045, + "beginOffset": 6991586, + "headersEndOffset": 6992045, + "endOffset": 7209679, "body": { "mimeType": "multipart/mixed", "lineNumber": 112073, - "begin": 6991586, - "headersEnd": 6992045, + "beginOffset": 6991586, + "headersEndOffset": 6992045, + "endOffset": 7209679, "children": [ { "mimeType": "text/plain", "lineNumber": 112086, - "begin": 6992085, - "headersEnd": 6992113, - "end": 6992366, + "beginOffset": 6992085, + "headersEndOffset": 6992113, + "endOffset": 6992366, "octets": 253, "lines": 6 }, { "mimeType": "multipart/related", "lineNumber": 112096, - "begin": 6992408, - "headersEnd": 6992497, + "beginOffset": 6992408, + "headersEndOffset": 6992497, + "endOffset": 7209637, "children": [ { "mimeType": "text/html", "lineNumber": 112100, - "begin": 6992537, - "headersEnd": 6992736, - "end": 7000063, + "beginOffset": 6992537, + "headersEndOffset": 6992736, + "endOffset": 7000063, "octets": 7327, "lines": 179 }, { "mimeType": "image/gif", "lineNumber": 112286, - "begin": 7000105, - "headersEnd": 7000286, - "end": 7008376, + "beginOffset": 7000105, + "headersEndOffset": 7000286, + "endOffset": 7008376, "octets": 8090, "lines": 110 }, { "mimeType": "image/gif", "lineNumber": 112402, - "begin": 7008418, - "headersEnd": 7008582, - "end": 7016138, + "beginOffset": 7008418, + "headersEndOffset": 7008582, + "endOffset": 7016138, "octets": 7556, "lines": 103 }, { "mimeType": "image/gif", "lineNumber": 112511, - "begin": 7016180, - "headersEnd": 7016343, - "end": 7019721, + "beginOffset": 7016180, + "headersEndOffset": 7016343, + "endOffset": 7019721, "octets": 3378, "lines": 46 }, { "mimeType": "image/gif", "lineNumber": 112563, - "begin": 7019763, - "headersEnd": 7019927, - "end": 7028493, + "beginOffset": 7019763, + "headersEndOffset": 7019927, + "endOffset": 7028493, "octets": 8566, "lines": 116 }, { "mimeType": "image/gif", "lineNumber": 112685, - "begin": 7028535, - "headersEnd": 7028696, - "end": 7134494, + "beginOffset": 7028535, + "headersEndOffset": 7028696, + "endOffset": 7134494, "octets": 105798, "lines": 1430 }, { "mimeType": "image/jpeg", "lineNumber": 114121, - "begin": 7134536, - "headersEnd": 7134700, - "end": 7173586, + "beginOffset": 7134536, + "headersEndOffset": 7134700, + "endOffset": 7173586, "octets": 38886, "lines": 526 }, { "mimeType": "image/jpeg", "lineNumber": 114653, - "begin": 7173628, - "headersEnd": 7173797, - "end": 7209595, + "beginOffset": 7173628, + "headersEndOffset": 7173797, + "endOffset": 7209595, "octets": 35798, "lines": 484 } ], - "end": 7209637, "octets": 217140, "lines": 3044 } ], - "end": 7209679, "octets": 217634, "lines": 3059 }, - "end": 7209679, "octets": 217634 }, { - "mboxMarkerBegin": 7209681, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7209681, "lineNumber": 115145, - "begin": 7209690, - "headersEnd": 7209994, + "beginOffset": 7209690, + "headersEndOffset": 7209994, + "endOffset": 7221844, "body": { "mimeType": "multipart/related", "lineNumber": 115145, - "begin": 7209690, - "headersEnd": 7209994, + "beginOffset": 7209690, + "headersEndOffset": 7209994, + "endOffset": 7221844, "children": [ { "mimeType": "text/html", "lineNumber": 115155, - "begin": 7210034, - "headersEnd": 7210195, - "end": 7210773, + "beginOffset": 7210034, + "headersEndOffset": 7210195, + "endOffset": 7210773, "octets": 578, "lines": 27 }, { "mimeType": "image/jpeg", "lineNumber": 115189, - "begin": 7210815, - "headersEnd": 7210932, - "end": 7221802, + "beginOffset": 7210815, + "headersEndOffset": 7210932, + "endOffset": 7221802, "octets": 10870, "lines": 147 } ], - "end": 7221844, "octets": 11850, "lines": 188 }, - "end": 7221844, "octets": 11850 }, { - "mboxMarkerBegin": 7221846, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7221846, "lineNumber": 115343, - "begin": 7221855, - "headersEnd": 7222159, + "beginOffset": 7221855, + "headersEndOffset": 7222159, + "endOffset": 7234277, "body": { "mimeType": "multipart/related", "lineNumber": 115343, - "begin": 7221855, - "headersEnd": 7222159, + "beginOffset": 7221855, + "headersEndOffset": 7222159, + "endOffset": 7234277, "children": [ { "mimeType": "text/html", "lineNumber": 115353, - "begin": 7222199, - "headersEnd": 7222417, - "end": 7223042, + "beginOffset": 7222199, + "headersEndOffset": 7222417, + "endOffset": 7223042, "octets": 625, "lines": 28 }, { "mimeType": "image/jpeg", "lineNumber": 115389, - "begin": 7223084, - "headersEnd": 7223365, - "end": 7234235, + "beginOffset": 7223084, + "headersEndOffset": 7223365, + "endOffset": 7234235, "octets": 10870, "lines": 147 } ], - "end": 7234277, "octets": 12118, "lines": 193 }, - "end": 7234277, "octets": 12118 }, { - "mboxMarkerBegin": 7234279, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7234279, "lineNumber": 115546, - "begin": 7234288, - "headersEnd": 7234592, + "beginOffset": 7234288, + "headersEndOffset": 7234592, + "endOffset": 7246617, "body": { "mimeType": "multipart/related", "lineNumber": 115546, - "begin": 7234288, - "headersEnd": 7234592, + "beginOffset": 7234288, + "headersEndOffset": 7234592, + "endOffset": 7246617, "children": [ { "mimeType": "text/html", "lineNumber": 115556, - "begin": 7234632, - "headersEnd": 7234854, - "end": 7235483, + "beginOffset": 7234632, + "headersEndOffset": 7234854, + "endOffset": 7235483, "octets": 629, "lines": 28 }, { "mimeType": "image/jpeg", "lineNumber": 115592, - "begin": 7235525, - "headersEnd": 7235705, - "end": 7246575, + "beginOffset": 7235525, + "headersEndOffset": 7235705, + "endOffset": 7246575, "octets": 10870, "lines": 147 } ], - "end": 7246617, "octets": 12025, "lines": 191 }, - "end": 7246617, "octets": 12025 }, { - "mboxMarkerBegin": 7246619, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7246619, "lineNumber": 115747, - "begin": 7246628, - "headersEnd": 7246932, + "beginOffset": 7246628, + "headersEndOffset": 7246932, + "endOffset": 7259151, "body": { "mimeType": "multipart/related", "lineNumber": 115747, - "begin": 7246628, - "headersEnd": 7246932, + "beginOffset": 7246628, + "headersEndOffset": 7246932, + "endOffset": 7259151, "children": [ { "mimeType": "text/html", "lineNumber": 115757, - "begin": 7246972, - "headersEnd": 7247224, - "end": 7247884, + "beginOffset": 7246972, + "headersEndOffset": 7247224, + "endOffset": 7247884, "octets": 660, "lines": 29 }, { "mimeType": "image/jpeg", "lineNumber": 115795, - "begin": 7247926, - "headersEnd": 7248239, - "end": 7259109, + "beginOffset": 7247926, + "headersEndOffset": 7248239, + "endOffset": 7259109, "octets": 10870, "lines": 147 } ], - "end": 7259151, "octets": 12219, "lines": 196 }, - "end": 7259151, "octets": 12219 }, { - "mboxMarkerBegin": 7259153, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7259153, "lineNumber": 115953, - "begin": 7259162, - "headersEnd": 7259466, + "beginOffset": 7259162, + "headersEndOffset": 7259466, + "endOffset": 7271535, "body": { "mimeType": "multipart/related", "lineNumber": 115953, - "begin": 7259162, - "headersEnd": 7259466, + "beginOffset": 7259162, + "headersEndOffset": 7259466, + "endOffset": 7271535, "children": [ { "mimeType": "text/html", "lineNumber": 115963, - "begin": 7259506, - "headersEnd": 7259728, - "end": 7260401, + "beginOffset": 7259506, + "headersEndOffset": 7259728, + "endOffset": 7260401, "octets": 673, "lines": 28 }, { "mimeType": "image/jpeg", "lineNumber": 115999, - "begin": 7260443, - "headersEnd": 7260623, - "end": 7271493, + "beginOffset": 7260443, + "headersEndOffset": 7260623, + "endOffset": 7271493, "octets": 10870, "lines": 147 } ], - "end": 7271535, "octets": 12069, "lines": 191 }, - "end": 7271535, "octets": 12069 }, { - "mboxMarkerBegin": 7271537, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7271537, "lineNumber": 116154, - "begin": 7271546, - "headersEnd": 7271850, + "beginOffset": 7271546, + "headersEndOffset": 7271850, + "endOffset": 7284139, "body": { "mimeType": "multipart/related", "lineNumber": 116154, - "begin": 7271546, - "headersEnd": 7271850, + "beginOffset": 7271546, + "headersEndOffset": 7271850, + "endOffset": 7284139, "children": [ { "mimeType": "text/html", "lineNumber": 116164, - "begin": 7271890, - "headersEnd": 7272142, - "end": 7272841, + "beginOffset": 7271890, + "headersEndOffset": 7272142, + "endOffset": 7272841, "octets": 699, "lines": 29 }, { "mimeType": "image/jpeg", "lineNumber": 116202, - "begin": 7272883, - "headersEnd": 7273227, - "end": 7284097, + "beginOffset": 7272883, + "headersEndOffset": 7273227, + "endOffset": 7284097, "octets": 10870, "lines": 147 } ], - "end": 7284139, "octets": 12289, "lines": 196 }, - "end": 7284139, "octets": 12289 }, { - "mboxMarkerBegin": 7284141, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 7284141, "lineNumber": 116360, - "begin": 7284174, - "headersEnd": 7285430, + "beginOffset": 7284174, + "headersEndOffset": 7285430, + "endOffset": 8043000, "body": { "mimeType": "multipart/mixed", "lineNumber": 116360, - "begin": 7284174, - "headersEnd": 7285430, + "beginOffset": 7284174, + "headersEndOffset": 7285430, + "endOffset": 8043000, "children": [ { "mimeType": "text/plain", "lineNumber": 116385, - "begin": 7285517, - "headersEnd": 7285596, - "end": 7285626, + "beginOffset": 7285517, + "headersEndOffset": 7285596, + "endOffset": 7285626, "octets": 30, "lines": 3 }, { "mimeType": "message/rfc822", "lineNumber": 116393, - "begin": 7285667, - "headersEnd": 7285761, + "beginOffset": 7285667, + "headersEndOffset": 7285761, + "endOffset": 8042957, "message": { "lineNumber": 116397, - "begin": 7285761, - "headersEnd": 7286598, + "beginOffset": 7285761, + "headersEndOffset": 7286598, + "endOffset": 8042957, "body": { "mimeType": "multipart/alternative", "lineNumber": 116397, - "begin": 7285761, - "headersEnd": 7286598, + "beginOffset": 7285761, + "headersEndOffset": 7286598, + "endOffset": 8042957, "children": [ { "mimeType": "text/plain", "lineNumber": 116415, - "begin": 7286640, - "headersEnd": 7286719, - "end": 7287362, + "beginOffset": 7286640, + "headersEndOffset": 7286719, + "endOffset": 7287362, "octets": 643, "lines": 16 }, { "mimeType": "multipart/related", "lineNumber": 116436, - "begin": 7287404, - "headersEnd": 7287488, + "beginOffset": 7287404, + "headersEndOffset": 7287488, + "endOffset": 8042909, "children": [ { "mimeType": "text/html", "lineNumber": 116440, - "begin": 7287530, - "headersEnd": 7287608, - "end": 7288476, + "beginOffset": 7287530, + "headersEndOffset": 7287608, + "endOffset": 7288476, "octets": 868, "lines": 18 }, { "mimeType": "image/tiff", "lineNumber": 116463, - "begin": 7288518, - "headersEnd": 7288707, - "end": 8042865, + "beginOffset": 7288518, + "headersEndOffset": 7288707, + "endOffset": 8042865, "octets": 754158, "lines": 10192 } ], - "end": 8042909, "octets": 755421, "lines": 10223 } ], - "end": 8042957, "octets": 756359, "lines": 10252 }, - "end": 8042957, "octets": 756359 }, - "end": 8042957, "octets": 757196, "lines": 10268 } ], - "end": 8043000, "octets": 757570, "lines": 10285 }, - "end": 8043000, "octets": 757570 }, { - "mboxMarkerBegin": 8043002, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 8043002, "lineNumber": 126669, - "begin": 8043035, - "headersEnd": 8044321, + "beginOffset": 8043035, + "headersEndOffset": 8044321, + "endOffset": 8091598, "body": { "mimeType": "multipart/related", "lineNumber": 126669, - "begin": 8043035, - "headersEnd": 8044321, + "beginOffset": 8043035, + "headersEndOffset": 8044321, + "endOffset": 8091598, "children": [ { "mimeType": "text/html", "lineNumber": 126693, - "begin": 8044368, - "headersEnd": 8044462, - "end": 8046894, + "beginOffset": 8044368, + "headersEndOffset": 8044462, + "endOffset": 8046894, "octets": 2432, "lines": 50 }, { "mimeType": "image/gif", "lineNumber": 126748, - "begin": 8046941, - "headersEnd": 8047105, - "end": 8053207, + "beginOffset": 8046941, + "headersEndOffset": 8047105, + "endOffset": 8053207, "octets": 6102, "lines": 79 }, { "mimeType": "image/gif", "lineNumber": 126834, - "begin": 8053254, - "headersEnd": 8053417, - "end": 8065647, + "beginOffset": 8053254, + "headersEndOffset": 8053417, + "endOffset": 8065647, "octets": 12230, "lines": 157 }, { "mimeType": "image/gif", "lineNumber": 126998, - "begin": 8065694, - "headersEnd": 8065859, - "end": 8087855, + "beginOffset": 8065694, + "headersEndOffset": 8065859, + "endOffset": 8087855, "octets": 21996, "lines": 282 }, { "mimeType": "image/gif", "lineNumber": 127287, - "begin": 8087902, - "headersEnd": 8088111, - "end": 8091549, + "beginOffset": 8087902, + "headersEndOffset": 8088111, + "endOffset": 8091549, "octets": 3438, "lines": 45 } ], - "end": 8091598, "octets": 47277, "lines": 649 }, - "end": 8091598, "octets": 47277 }, { - "mboxMarkerBegin": 8091600, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8091600, "lineNumber": 127342, - "begin": 8091609, - "headersEnd": 8092367, + "beginOffset": 8091609, + "headersEndOffset": 8092367, + "endOffset": 8644457, "body": { "mimeType": "audio/basic", "lineNumber": 127342, - "begin": 8091609, - "headersEnd": 8092367, - "end": 8644457, + "beginOffset": 8091609, + "headersEndOffset": 8092367, + "endOffset": 8644457, "octets": 552090, "lines": 7474 }, - "end": 8644457, "octets": 552090 }, { - "mboxMarkerBegin": 8644459, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8644459, "lineNumber": 134835, - "begin": 8644468, - "headersEnd": 8645400, + "beginOffset": 8644468, + "headersEndOffset": 8645400, + "endOffset": 8648081, "body": { "mimeType": "multipart/mixed", "lineNumber": 134835, - "begin": 8644468, - "headersEnd": 8645400, + "beginOffset": 8644468, + "headersEndOffset": 8645400, + "endOffset": 8648081, "children": [ { "mimeType": "text/richtext", "lineNumber": 134858, - "begin": 8645411, - "headersEnd": 8645442, - "end": 8648068, + "beginOffset": 8645411, + "headersEndOffset": 8645442, + "endOffset": 8648068, "octets": 2626, "lines": 96 } ], - "end": 8648081, "octets": 2681, "lines": 102 }, - "end": 8648081, "octets": 2681 }, { - "mboxMarkerBegin": 8648083, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 8648083, "lineNumber": 134960, - "begin": 8648116, - "headersEnd": 8648726, + "beginOffset": 8648116, + "headersEndOffset": 8648726, + "endOffset": 8650562, "body": { "mimeType": "multipart/signed", "lineNumber": 134960, - "begin": 8648116, - "headersEnd": 8648726, + "beginOffset": 8648116, + "headersEndOffset": 8648726, + "endOffset": 8650562, "children": [ { "mimeType": "text/plain", "lineNumber": 134984, - "begin": 8649031, - "headersEnd": 8649078, - "end": 8650186, + "beginOffset": 8649031, + "headersEndOffset": 8649078, + "endOffset": 8650186, "octets": 1108, "lines": 26 }, { "mimeType": "application/pgp-signature", "lineNumber": 135014, - "begin": 8650206, - "headersEnd": 8650249, - "end": 8650542, + "beginOffset": 8650206, + "headersEndOffset": 8650249, + "endOffset": 8650542, "octets": 293, "lines": 9 } ], - "end": 8650562, "octets": 1836, "lines": 51 }, - "end": 8650562, "octets": 1836 }, { - "mboxMarkerBegin": 8650564, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8650564, "lineNumber": 135028, - "begin": 8650573, - "headersEnd": 8651756, + "beginOffset": 8650573, + "headersEndOffset": 8651756, + "endOffset": 8653178, "body": { "mimeType": "application/pgp", "lineNumber": 135028, - "begin": 8650573, - "headersEnd": 8651756, - "end": 8653178, + "beginOffset": 8650573, + "headersEndOffset": 8651756, + "endOffset": 8653178, "octets": 1422, "lines": 40 }, - "end": 8653178, "octets": 1422 }, { - "mboxMarkerBegin": 8653180, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8653180, "lineNumber": 135090, - "begin": 8653189, - "headersEnd": 8653839, + "beginOffset": 8653189, + "headersEndOffset": 8653839, + "endOffset": 8654840, "body": { "mimeType": "text/plain", "lineNumber": 135090, - "begin": 8653189, - "headersEnd": 8653839, - "end": 8654840, + "beginOffset": 8653189, + "headersEndOffset": 8653839, + "endOffset": 8654840, "octets": 1001, "lines": 27 }, - "end": 8654840, "octets": 1001 }, { - "mboxMarkerBegin": 8654842, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8654842, "lineNumber": 135136, - "begin": 8654851, - "headersEnd": 8655631, + "beginOffset": 8654851, + "headersEndOffset": 8655631, + "endOffset": 8658633, "body": { "mimeType": "multipart/alternative", "lineNumber": 135136, - "begin": 8654851, - "headersEnd": 8655631, + "beginOffset": 8654851, + "headersEndOffset": 8655631, + "endOffset": 8658633, "children": [ { "mimeType": "text/plain", "lineNumber": 135158, - "begin": 8655830, - "headersEnd": 8655876, - "end": 8656708, + "beginOffset": 8655830, + "headersEndOffset": 8655876, + "endOffset": 8656708, "octets": 832, "lines": 15 }, { "mimeType": "multipart/mixed", "lineNumber": 135177, - "begin": 8656751, - "headersEnd": 8656839, + "beginOffset": 8656751, + "headersEndOffset": 8656839, + "endOffset": 8658588, "children": [ { "mimeType": "text/richtext", "lineNumber": 135181, - "begin": 8656882, - "headersEnd": 8656976, - "end": 8657477, + "beginOffset": 8656882, + "headersEndOffset": 8656976, + "endOffset": 8657477, "octets": 501, "lines": 10 }, { "mimeType": "message/external-body", "lineNumber": 135196, - "begin": 8657522, - "headersEnd": 8657715, + "beginOffset": 8657522, + "headersEndOffset": 8657715, + "endOffset": 8657748, "message": { "lineNumber": 135203, - "begin": 8657715, - "headersEnd": 8657744, + "beginOffset": 8657715, + "headersEndOffset": 8657744, + "endOffset": 8657748, "body": { "mimeType": "audio/basic", "lineNumber": 135203, - "begin": 8657715, - "headersEnd": 8657744, - "end": 8657748, + "beginOffset": 8657715, + "headersEndOffset": 8657744, + "endOffset": 8657748, "octets": 4, "lines": 2 }, - "end": 8657748, "octets": 4 }, - "end": 8657748, "octets": 33, "lines": 4 }, { "mimeType": "text/plain", "lineNumber": 135209, - "begin": 8657793, - "headersEnd": 8657884, - "end": 8657889, + "beginOffset": 8657793, + "headersEndOffset": 8657884, + "endOffset": 8657889, "octets": 5, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 135216, - "begin": 8657934, - "headersEnd": 8658142, + "beginOffset": 8657934, + "headersEndOffset": 8658142, + "endOffset": 8658173, "message": { "lineNumber": 135223, - "begin": 8658142, - "headersEnd": 8658169, + "beginOffset": 8658142, + "headersEndOffset": 8658169, + "endOffset": 8658173, "body": { "mimeType": "image/gif", "lineNumber": 135223, - "begin": 8658142, - "headersEnd": 8658169, - "end": 8658173, + "beginOffset": 8658142, + "headersEndOffset": 8658169, + "endOffset": 8658173, "octets": 4, "lines": 2 }, - "end": 8658173, "octets": 4 }, - "end": 8658173, "octets": 31, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135229, - "begin": 8658218, - "headersEnd": 8658312, - "end": 8658541, + "beginOffset": 8658218, + "headersEndOffset": 8658312, + "endOffset": 8658541, "octets": 229, "lines": 7 } ], - "end": 8658588, "octets": 1749, "lines": 61 } ], - "end": 8658633, "octets": 3002, "lines": 89 }, - "end": 8658633, "octets": 3002 }, { - "mboxMarkerBegin": 8658635, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8658635, "lineNumber": 135245, - "begin": 8658644, - "headersEnd": 8659476, + "beginOffset": 8658644, + "headersEndOffset": 8659476, + "endOffset": 8660904, "body": { "mimeType": "text/richtext", "lineNumber": 135245, - "begin": 8658644, - "headersEnd": 8659476, - "end": 8660904, + "beginOffset": 8658644, + "headersEndOffset": 8659476, + "endOffset": 8660904, "octets": 1428, "lines": 42 }, - "end": 8660904, "octets": 1428 }, { - "mboxMarkerBegin": 8660906, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8660906, "lineNumber": 135307, - "begin": 8660915, - "headersEnd": 8661072, + "beginOffset": 8660915, + "headersEndOffset": 8661072, + "endOffset": 8665806, "body": { "mimeType": "message/partial", "lineNumber": 135307, - "begin": 8660915, - "headersEnd": 8661072, - "end": 8665806, + "beginOffset": 8660915, + "headersEndOffset": 8661072, + "endOffset": 8665806, "octets": 4734, "lines": 64 }, - "end": 8665806, "octets": 4734 }, { - "mboxMarkerBegin": 8665808, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8665808, "lineNumber": 135377, - "begin": 8665817, - "headersEnd": 8667595, + "beginOffset": 8665817, + "headersEndOffset": 8667595, + "endOffset": 8679245, "body": { "mimeType": "multipart/alternative", "lineNumber": 135377, - "begin": 8665817, - "headersEnd": 8667595, + "beginOffset": 8665817, + "headersEndOffset": 8667595, + "endOffset": 8679245, "children": [ { "mimeType": "text/plain", "lineNumber": 135416, - "begin": 8667794, - "headersEnd": 8667840, - "end": 8669545, + "beginOffset": 8667794, + "headersEndOffset": 8667840, + "endOffset": 8669545, "octets": 1705, "lines": 38 }, { "mimeType": "multipart/mixed", "lineNumber": 135458, - "begin": 8669588, - "headersEnd": 8669676, + "beginOffset": 8669588, + "headersEndOffset": 8669676, + "endOffset": 8679200, "children": [ { "mimeType": "text/richtext", "lineNumber": 135462, - "begin": 8669719, - "headersEnd": 8669813, - "end": 8670384, + "beginOffset": 8669719, + "headersEndOffset": 8669813, + "endOffset": 8670384, "octets": 571, "lines": 14 }, { "mimeType": "image/x-xwd", "lineNumber": 135481, - "begin": 8670429, - "headersEnd": 8670493, - "end": 8671377, + "beginOffset": 8670429, + "headersEndOffset": 8670493, + "endOffset": 8671377, "octets": 884, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135498, - "begin": 8671422, - "headersEnd": 8671516, - "end": 8671567, + "beginOffset": 8671422, + "headersEndOffset": 8671516, + "endOffset": 8671567, "octets": 51, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135508, - "begin": 8671612, - "headersEnd": 8671676, - "end": 8672560, + "beginOffset": 8671612, + "headersEndOffset": 8671676, + "endOffset": 8672560, "octets": 884, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135525, - "begin": 8672605, - "headersEnd": 8672699, - "end": 8672750, + "beginOffset": 8672605, + "headersEndOffset": 8672699, + "endOffset": 8672750, "octets": 51, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135535, - "begin": 8672795, - "headersEnd": 8672859, - "end": 8673743, + "beginOffset": 8672795, + "headersEndOffset": 8672859, + "endOffset": 8673743, "octets": 884, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135552, - "begin": 8673788, - "headersEnd": 8673882, - "end": 8673927, + "beginOffset": 8673788, + "headersEndOffset": 8673882, + "endOffset": 8673927, "octets": 45, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135562, - "begin": 8673972, - "headersEnd": 8674036, - "end": 8674264, + "beginOffset": 8673972, + "headersEndOffset": 8674036, + "endOffset": 8674264, "octets": 228, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135571, - "begin": 8674309, - "headersEnd": 8674403, - "end": 8674472, + "beginOffset": 8674309, + "headersEndOffset": 8674403, + "endOffset": 8674472, "octets": 69, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135581, - "begin": 8674517, - "headersEnd": 8674581, - "end": 8674809, + "beginOffset": 8674517, + "headersEndOffset": 8674581, + "endOffset": 8674809, "octets": 228, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135590, - "begin": 8674854, - "headersEnd": 8674948, - "end": 8674997, + "beginOffset": 8674854, + "headersEndOffset": 8674948, + "endOffset": 8674997, "octets": 49, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135600, - "begin": 8675042, - "headersEnd": 8675106, - "end": 8675334, + "beginOffset": 8675042, + "headersEndOffset": 8675106, + "endOffset": 8675334, "octets": 228, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135609, - "begin": 8675379, - "headersEnd": 8675473, - "end": 8675776, + "beginOffset": 8675379, + "headersEndOffset": 8675473, + "endOffset": 8675776, "octets": 303, "lines": 11 }, { "mimeType": "image/x-xwd", "lineNumber": 135625, - "begin": 8675821, - "headersEnd": 8675885, - "end": 8676769, + "beginOffset": 8675821, + "headersEndOffset": 8675885, + "endOffset": 8676769, "octets": 884, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135642, - "begin": 8676814, - "headersEnd": 8676908, - "end": 8676952, + "beginOffset": 8676814, + "headersEndOffset": 8676908, + "endOffset": 8676952, "octets": 44, "lines": 4 }, { "mimeType": "image/x-xwd", "lineNumber": 135651, - "begin": 8676997, - "headersEnd": 8677061, - "end": 8679003, + "beginOffset": 8676997, + "headersEndOffset": 8677061, + "endOffset": 8679003, "octets": 1942, "lines": 27 }, { "mimeType": "text/richtext", "lineNumber": 135683, - "begin": 8679048, - "headersEnd": 8679142, - "end": 8679153, + "beginOffset": 8679048, + "headersEndOffset": 8679142, + "endOffset": 8679153, "octets": 11, "lines": 1 } ], - "end": 8679200, "octets": 9524, "lines": 228 } ], - "end": 8679245, "octets": 11650, "lines": 279 }, - "end": 8679245, "octets": 11650 }, { - "mboxMarkerBegin": 8679247, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8679247, "lineNumber": 135693, - "begin": 8679256, - "headersEnd": 8680000, + "beginOffset": 8679256, + "headersEndOffset": 8680000, + "endOffset": 8690837, "body": { "mimeType": "multipart/alternative", "lineNumber": 135693, - "begin": 8679256, - "headersEnd": 8680000, + "beginOffset": 8679256, + "headersEndOffset": 8680000, + "endOffset": 8690837, "children": [ { "mimeType": "text/plain", "lineNumber": 135713, - "begin": 8680199, - "headersEnd": 8680245, - "end": 8680884, + "beginOffset": 8680199, + "headersEndOffset": 8680245, + "endOffset": 8680884, "octets": 639, "lines": 12 }, { "mimeType": "multipart/mixed", "lineNumber": 135729, - "begin": 8680927, - "headersEnd": 8681015, + "beginOffset": 8680927, + "headersEndOffset": 8681015, + "endOffset": 8690794, "children": [ { "mimeType": "text/richtext", "lineNumber": 135733, - "begin": 8681058, - "headersEnd": 8681152, - "end": 8681693, + "beginOffset": 8681058, + "headersEndOffset": 8681152, + "endOffset": 8681693, "octets": 541, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 135746, - "begin": 8681738, - "headersEnd": 8681850, - "end": 8690560, + "beginOffset": 8681738, + "headersEndOffset": 8681850, + "endOffset": 8690560, "octets": 8710, "lines": 125 }, { "mimeType": "text/richtext", "lineNumber": 135877, - "begin": 8690605, - "headersEnd": 8690699, - "end": 8690747, + "beginOffset": 8690605, + "headersEndOffset": 8690699, + "endOffset": 8690747, "octets": 48, "lines": 3 } ], - "end": 8690794, "octets": 9779, "lines": 153 } ], - "end": 8690837, "octets": 10837, "lines": 178 }, - "end": 8690837, "octets": 10837 }, { - "mboxMarkerBegin": 8690839, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8690839, "lineNumber": 135888, - "begin": 8690848, - "headersEnd": 8691509, + "beginOffset": 8690848, + "headersEndOffset": 8691509, + "endOffset": 8771510, "body": { "mimeType": "multipart/mixed", "lineNumber": 135888, - "begin": 8690848, - "headersEnd": 8691509, + "beginOffset": 8690848, + "headersEndOffset": 8691509, + "endOffset": 8771510, "children": [ { "mimeType": "text/plain", "lineNumber": 135905, - "begin": 8691561, - "headersEnd": 8691654, - "end": 8691757, + "beginOffset": 8691561, + "headersEndOffset": 8691654, + "endOffset": 8691757, "octets": 103, "lines": 6 }, { "mimeType": "audio/basic", "lineNumber": 135916, - "begin": 8691809, - "headersEnd": 8691940, - "end": 8771456, + "beginOffset": 8691809, + "headersEndOffset": 8691940, + "endOffset": 8771456, "octets": 79516, "lines": 1075 } ], - "end": 8771510, "octets": 80001, "lines": 1093 }, - "end": 8771510, "octets": 80001 }, { - "mboxMarkerBegin": 8771512, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8771512, "lineNumber": 136998, - "begin": 8771521, - "headersEnd": 8772294, + "beginOffset": 8771521, + "headersEndOffset": 8772294, + "endOffset": 8960196, "body": { "mimeType": "multipart/alternative", "lineNumber": 136998, - "begin": 8771521, - "headersEnd": 8772294, + "beginOffset": 8771521, + "headersEndOffset": 8772294, + "endOffset": 8960196, "children": [ { "mimeType": "text/plain", "lineNumber": 137019, - "begin": 8772493, - "headersEnd": 8772539, - "end": 8773917, + "beginOffset": 8772493, + "headersEndOffset": 8772539, + "endOffset": 8773917, "octets": 1378, "lines": 28 }, { "mimeType": "multipart/mixed", "lineNumber": 137051, - "begin": 8773960, - "headersEnd": 8774048, + "beginOffset": 8773960, + "headersEndOffset": 8774048, + "endOffset": 8960153, "children": [ { "mimeType": "text/richtext", "lineNumber": 137055, - "begin": 8774091, - "headersEnd": 8774185, - "end": 8775346, + "beginOffset": 8774091, + "headersEndOffset": 8774185, + "endOffset": 8775346, "octets": 1161, "lines": 22 }, { "mimeType": "audio/basic", "lineNumber": 137082, - "begin": 8775391, - "headersEnd": 8775493, - "end": 8892315, + "beginOffset": 8775391, + "headersEndOffset": 8775493, + "endOffset": 8892315, "octets": 116822, "lines": 1579 }, { "mimeType": "text/richtext", "lineNumber": 138667, - "begin": 8892360, - "headersEnd": 8892454, - "end": 8892580, + "beginOffset": 8892360, + "headersEndOffset": 8892454, + "endOffset": 8892580, "octets": 126, "lines": 3 }, { "mimeType": "image/gif", "lineNumber": 138675, - "begin": 8892625, - "headersEnd": 8892728, - "end": 8959970, + "beginOffset": 8892625, + "headersEndOffset": 8892728, + "endOffset": 8959970, "octets": 67242, "lines": 961 }, { "mimeType": "text/plain", "lineNumber": 139642, - "begin": 8960015, - "headersEnd": 8960106, - "end": 8960106, + "beginOffset": 8960015, + "headersEndOffset": 8960106, + "endOffset": 8960106, "octets": 0, "lines": 0 } ], - "end": 8960153, "octets": 186105, "lines": 2593 } ], - "end": 8960196, "octets": 187902, "lines": 2634 }, - "end": 8960196, "octets": 187902 }, { - "mboxMarkerBegin": 8960198, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8960198, "lineNumber": 139650, - "begin": 8960207, - "headersEnd": 8961063, + "beginOffset": 8960207, + "headersEndOffset": 8961063, + "endOffset": 8962821, "body": { "mimeType": "application/x-pkcs", "lineNumber": 139650, - "begin": 8960207, - "headersEnd": 8961063, - "end": 8962821, + "beginOffset": 8960207, + "headersEndOffset": 8961063, + "endOffset": 8962821, "octets": 1758, "lines": 25 }, - "end": 8962821, "octets": 1758 }, { - "mboxMarkerBegin": 8962823, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8962823, "lineNumber": 139696, - "begin": 8962832, - "headersEnd": 8963476, + "beginOffset": 8962832, + "headersEndOffset": 8963476, + "endOffset": 8964871, "body": { "mimeType": "MESSAGE/RFC822", "lineNumber": 139696, - "begin": 8962832, - "headersEnd": 8963476, + "beginOffset": 8962832, + "headersEndOffset": 8963476, + "endOffset": 8964871, "message": { "lineNumber": 139710, - "begin": 8963476, - "headersEnd": 8963972, + "beginOffset": 8963476, + "headersEndOffset": 8963972, + "endOffset": 8964871, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 139710, - "begin": 8963476, - "headersEnd": 8963972, - "end": 8964871, + "beginOffset": 8963476, + "headersEndOffset": 8963972, + "endOffset": 8964871, "octets": 899, "lines": 25 }, - "end": 8964871, "octets": 899 }, - "end": 8964871, "octets": 1395, "lines": 38 }, - "end": 8964871, "octets": 1395 }, { - "mboxMarkerBegin": 8964873, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8964873, "lineNumber": 139749, - "begin": 8964882, - "headersEnd": 8965340, + "beginOffset": 8964882, + "headersEndOffset": 8965340, + "endOffset": 9057985, "body": { "mimeType": "multipart/mixed", "lineNumber": 139749, - "begin": 8964882, - "headersEnd": 8965340, + "beginOffset": 8964882, + "headersEndOffset": 8965340, + "endOffset": 9057985, "children": [ { "mimeType": "text/plain", "lineNumber": 139763, - "begin": 8965350, - "headersEnd": 8965352, - "end": 8965393, + "beginOffset": 8965350, + "headersEndOffset": 8965352, + "endOffset": 8965393, "octets": 41, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 139767, - "begin": 8965405, - "headersEnd": 8965469, - "end": 9057967, + "beginOffset": 8965405, + "headersEndOffset": 8965469, + "endOffset": 9057967, "octets": 92498, "lines": 1250 } ], - "end": 9057985, "octets": 92645, "lines": 1261 }, - "end": 9057985, "octets": 92645 }, { - "mboxMarkerBegin": 9057987, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9057987, "lineNumber": 141025, - "begin": 9057996, - "headersEnd": 9058498, + "beginOffset": 9057996, + "headersEndOffset": 9058498, + "endOffset": 9059667, "body": { "mimeType": "text/plain", "lineNumber": 141025, - "begin": 9057996, - "headersEnd": 9058498, - "end": 9059667, + "beginOffset": 9057996, + "headersEndOffset": 9058498, + "endOffset": 9059667, "octets": 1169, "lines": 27 }, - "end": 9059667, "octets": 1169 }, { - "mboxMarkerBegin": 9059669, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9059669, "lineNumber": 141066, - "begin": 9059678, - "headersEnd": 9060843, + "beginOffset": 9059678, + "headersEndOffset": 9060843, + "endOffset": 9156930, "body": { "mimeType": "multipart/mixed", "lineNumber": 141066, - "begin": 9059678, - "headersEnd": 9060843, + "beginOffset": 9059678, + "headersEndOffset": 9060843, + "endOffset": 9156930, "children": [ { "mimeType": "text/plain", "lineNumber": 141092, - "begin": 9060849, - "headersEnd": 9060851, - "end": 9061403, + "beginOffset": 9060849, + "headersEndOffset": 9060851, + "endOffset": 9061403, "octets": 552, "lines": 12 }, { "mimeType": "image/gif", "lineNumber": 141107, - "begin": 9061411, - "headersEnd": 9061531, - "end": 9119961, + "beginOffset": 9061411, + "headersEndOffset": 9061531, + "endOffset": 9119961, "octets": 58430, "lines": 790 }, { "mimeType": "text/plain", "lineNumber": 141902, - "begin": 9119969, - "headersEnd": 9119971, - "end": 9123837, + "beginOffset": 9119969, + "headersEndOffset": 9119971, + "endOffset": 9123837, "octets": 3866, "lines": 83 }, { "mimeType": "application/octet-stream", "lineNumber": 141988, - "begin": 9123845, - "headersEnd": 9124003, - "end": 9154647, + "beginOffset": 9123845, + "headersEndOffset": 9124003, + "endOffset": 9154647, "octets": 30644, "lines": 1010 }, { "mimeType": "application/octet-stream", "lineNumber": 143003, - "begin": 9154655, - "headersEnd": 9154764, - "end": 9155504, + "beginOffset": 9154655, + "headersEndOffset": 9154764, + "endOffset": 9155504, "octets": 740, "lines": 24 }, { "mimeType": "application/octet-stream", "lineNumber": 143032, - "begin": 9155512, - "headersEnd": 9155632, - "end": 9156920, + "beginOffset": 9155512, + "headersEndOffset": 9155632, + "endOffset": 9156920, "octets": 1288, "lines": 25 } ], - "end": 9156930, "octets": 96087, "lines": 1970 }, - "end": 9156930, "octets": 96087 }, { - "mboxMarkerBegin": 9156932, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9156932, "lineNumber": 143063, - "begin": 9156965, - "headersEnd": 9158136, + "beginOffset": 9156965, + "headersEndOffset": 9158136, + "endOffset": 9159961, "body": { "mimeType": "multipart/signed", "lineNumber": 143063, - "begin": 9156965, - "headersEnd": 9158136, + "beginOffset": 9156965, + "headersEndOffset": 9158136, + "endOffset": 9159961, "children": [ { "mimeType": "text/plain", "lineNumber": 143082, - "begin": 9158154, - "headersEnd": 9158156, - "end": 9159077, + "beginOffset": 9158154, + "headersEndOffset": 9158156, + "endOffset": 9159077, "octets": 921, "lines": 20 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 143105, - "begin": 9159097, - "headersEnd": 9159179, - "end": 9159939, + "beginOffset": 9159097, + "headersEndOffset": 9159179, + "endOffset": 9159939, "octets": 760, "lines": 12 } ], - "end": 9159961, "octets": 1825, "lines": 41 }, - "end": 9159961, "octets": 1825 }, { - "mboxMarkerBegin": 9159963, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9159963, "lineNumber": 143124, - "begin": 9159996, - "headersEnd": 9161157, + "beginOffset": 9159996, + "headersEndOffset": 9161157, + "endOffset": 9164625, "body": { "mimeType": "multipart/mixed", "lineNumber": 143124, - "begin": 9159996, - "headersEnd": 9161157, + "beginOffset": 9159996, + "headersEndOffset": 9161157, + "endOffset": 9164625, "children": [ { "mimeType": "text/plain", "lineNumber": 143147, - "begin": 9161341, - "headersEnd": 9161422, - "end": 9162176, + "beginOffset": 9161341, + "headersEndOffset": 9161422, + "endOffset": 9162176, "octets": 754, "lines": 14 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143165, - "begin": 9162186, - "headersEnd": 9162369, - "end": 9164615, + "beginOffset": 9162186, + "headersEndOffset": 9162369, + "endOffset": 9164615, "octets": 2246, "lines": 31 } ], - "end": 9164625, "octets": 3468, "lines": 60 }, - "end": 9164625, "octets": 3468 }, { - "mboxMarkerBegin": 9164627, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9164627, "lineNumber": 143204, - "begin": 9164660, - "headersEnd": 9165820, + "beginOffset": 9164660, + "headersEndOffset": 9165820, + "endOffset": 9171770, "body": { "mimeType": "multipart/mixed", "lineNumber": 143204, - "begin": 9164660, - "headersEnd": 9165820, + "beginOffset": 9164660, + "headersEndOffset": 9165820, + "endOffset": 9171770, "children": [ { "mimeType": "text/plain", "lineNumber": 143231, - "begin": 9166018, - "headersEnd": 9166099, - "end": 9168957, + "beginOffset": 9166018, + "headersEndOffset": 9166099, + "endOffset": 9168957, "octets": 2858, "lines": 47 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143282, - "begin": 9168981, - "headersEnd": 9169164, - "end": 9171746, + "beginOffset": 9168981, + "headersEndOffset": 9169164, + "endOffset": 9171746, "octets": 2582, "lines": 35 } ], - "end": 9171770, "octets": 5950, "lines": 97 }, - "end": 9171770, "octets": 5950 }, { - "mboxMarkerBegin": 9171772, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9171772, "lineNumber": 143325, - "begin": 9171781, - "headersEnd": 9171996, + "beginOffset": 9171781, + "headersEndOffset": 9171996, + "endOffset": 9176246, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143325, - "begin": 9171781, - "headersEnd": 9171996, - "end": 9176246, + "beginOffset": 9171781, + "headersEndOffset": 9171996, + "endOffset": 9176246, "octets": 4250, "lines": 58 }, - "end": 9176246, "octets": 4250 }, { - "mboxMarkerBegin": 9176248, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9176248, "lineNumber": 143391, - "begin": 9176281, - "headersEnd": 9177199, + "beginOffset": 9176281, + "headersEndOffset": 9177199, + "endOffset": 9193172, "body": { "mimeType": "multipart/signed", "lineNumber": 143391, - "begin": 9176281, - "headersEnd": 9177199, + "beginOffset": 9176281, + "headersEndOffset": 9177199, + "endOffset": 9193172, "children": [ { "mimeType": "image/jpeg", "lineNumber": 143412, - "begin": 9177275, - "headersEnd": 9177413, - "end": 9188281, + "beginOffset": 9177275, + "headersEndOffset": 9177413, + "endOffset": 9188281, "octets": 10868, "lines": 147 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 143564, - "begin": 9188311, - "headersEnd": 9188466, - "end": 9193140, + "beginOffset": 9188311, + "headersEndOffset": 9188466, + "endOffset": 9193140, "octets": 4674, "lines": 64 } ], - "end": 9193172, "octets": 15973, "lines": 224 }, - "end": 9193172, "octets": 15973 }, { - "mboxMarkerBegin": 9193174, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9193174, "lineNumber": 143635, - "begin": 9193207, - "headersEnd": 9194031, + "beginOffset": 9193207, + "headersEndOffset": 9194031, + "endOffset": 9211049, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143635, - "begin": 9193207, - "headersEnd": 9194031, - "end": 9211049, + "beginOffset": 9193207, + "headersEndOffset": 9194031, + "endOffset": 9211049, "octets": 17018, "lines": 258 }, - "end": 9211049, "octets": 17018 }, { - "mboxMarkerBegin": 9211051, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9211051, "lineNumber": 143911, - "begin": 9211084, - "headersEnd": 9211913, + "beginOffset": 9211084, + "headersEndOffset": 9211913, + "endOffset": 9237261, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143911, - "begin": 9211084, - "headersEnd": 9211913, - "end": 9237261, + "beginOffset": 9211084, + "headersEndOffset": 9211913, + "endOffset": 9237261, "octets": 25348, "lines": 385 }, - "end": 9237261, "octets": 25348 }, { - "mboxMarkerBegin": 9237263, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9237263, "lineNumber": 144314, - "begin": 9237296, - "headersEnd": 9238125, + "beginOffset": 9237296, + "headersEndOffset": 9238125, + "endOffset": 9274811, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 144314, - "begin": 9237296, - "headersEnd": 9238125, - "end": 9274811, + "beginOffset": 9237296, + "headersEndOffset": 9238125, + "endOffset": 9274811, "octets": 36686, "lines": 556 }, - "end": 9274811, "octets": 36686 }, { - "mboxMarkerBegin": 9274813, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9274813, "lineNumber": 144888, - "begin": 9274846, - "headersEnd": 9275678, + "beginOffset": 9274846, + "headersEndOffset": 9275678, + "endOffset": 9327768, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 144888, - "begin": 9274846, - "headersEnd": 9275678, - "end": 9327768, + "beginOffset": 9274846, + "headersEndOffset": 9275678, + "endOffset": 9327768, "octets": 52090, "lines": 790 }, - "end": 9327768, "octets": 52090 }, { - "mboxMarkerBegin": 9327770, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9327770, "lineNumber": 145696, - "begin": 9327803, - "headersEnd": 9329218, + "beginOffset": 9327803, + "headersEndOffset": 9329218, + "endOffset": 9330668, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145696, - "begin": 9327803, - "headersEnd": 9329218, - "end": 9330668, + "beginOffset": 9327803, + "headersEndOffset": 9329218, + "endOffset": 9330668, "octets": 1450, "lines": 20 }, - "end": 9330668, "octets": 1450 }, { - "mboxMarkerBegin": 9330670, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9330670, "lineNumber": 145741, - "begin": 9330703, - "headersEnd": 9332080, + "beginOffset": 9330703, + "headersEndOffset": 9332080, + "endOffset": 9336541, "body": { "mimeType": "multipart/signed", "lineNumber": 145741, - "begin": 9330703, - "headersEnd": 9332080, + "beginOffset": 9330703, + "headersEndOffset": 9332080, + "endOffset": 9336541, "children": [ { "mimeType": "text/plain", "lineNumber": 145767, - "begin": 9332127, - "headersEnd": 9332194, - "end": 9332304, + "beginOffset": 9332127, + "headersEndOffset": 9332194, + "endOffset": 9332304, "octets": 110, "lines": 4 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 145775, - "begin": 9332351, - "headersEnd": 9332506, - "end": 9336492, + "beginOffset": 9332351, + "headersEndOffset": 9332506, + "endOffset": 9336492, "octets": 3986, "lines": 54 } ], - "end": 9336541, "octets": 4461, "lines": 69 }, - "end": 9336541, "octets": 4461 }, { - "mboxMarkerBegin": 9336543, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9336543, "lineNumber": 145836, - "begin": 9336576, - "headersEnd": 9337807, + "beginOffset": 9336576, + "headersEndOffset": 9337807, + "endOffset": 9341357, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145836, - "begin": 9336576, - "headersEnd": 9337807, - "end": 9341357, + "beginOffset": 9336576, + "headersEndOffset": 9337807, + "endOffset": 9341357, "octets": 3550, "lines": 55 }, - "end": 9341357, "octets": 3550 }, { - "mboxMarkerBegin": 9341359, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9341359, "lineNumber": 145914, - "begin": 9341392, - "headersEnd": 9342490, + "beginOffset": 9341392, + "headersEndOffset": 9342490, + "endOffset": 9343160, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145914, - "begin": 9341392, - "headersEnd": 9342490, - "end": 9343160, + "beginOffset": 9341392, + "headersEndOffset": 9342490, + "endOffset": 9343160, "octets": 670, "lines": 10 }, - "end": 9343160, "octets": 670 }, { - "mboxMarkerBegin": 9343162, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9343162, "lineNumber": 145946, - "begin": 9343171, - "headersEnd": 9343574, + "beginOffset": 9343171, + "headersEndOffset": 9343574, + "endOffset": 9351298, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145946, - "begin": 9343171, - "headersEnd": 9343574, - "end": 9351298, + "beginOffset": 9343171, + "headersEndOffset": 9343574, + "endOffset": 9351298, "octets": 7724, "lines": 105 }, - "end": 9351298, "octets": 7724 }, { - "mboxMarkerBegin": 9351300, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9351300, "lineNumber": 146063, - "begin": 9351333, - "headersEnd": 9352135, + "beginOffset": 9351333, + "headersEndOffset": 9352135, + "endOffset": 9354990, "body": { "mimeType": "message/rfc822", "lineNumber": 146063, - "begin": 9351333, - "headersEnd": 9352135, + "beginOffset": 9351333, + "headersEndOffset": 9352135, + "endOffset": 9354990, "message": { "lineNumber": 146082, - "begin": 9352135, - "headersEnd": 9353538, + "beginOffset": 9352135, + "headersEndOffset": 9353538, + "endOffset": 9354990, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146082, - "begin": 9352135, - "headersEnd": 9353538, - "end": 9354990, + "beginOffset": 9352135, + "headersEndOffset": 9353538, + "endOffset": 9354990, "octets": 1452, "lines": 20 }, - "end": 9354990, "octets": 1452 }, - "end": 9354990, "octets": 2855, "lines": 43 }, - "end": 9354990, "octets": 2855 }, { - "mboxMarkerBegin": 9354992, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9354992, "lineNumber": 146127, - "begin": 9355025, - "headersEnd": 9355752, + "beginOffset": 9355025, + "headersEndOffset": 9355752, + "endOffset": 9358998, "body": { "mimeType": "multipart/mixed", "lineNumber": 146127, - "begin": 9355025, - "headersEnd": 9355752, + "beginOffset": 9355025, + "headersEndOffset": 9355752, + "endOffset": 9358998, "children": [ { "mimeType": "text/plain", "lineNumber": 146147, - "begin": 9355828, - "headersEnd": 9355907, - "end": 9355923, + "beginOffset": 9355828, + "headersEndOffset": 9355907, + "endOffset": 9355923, "octets": 16, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 146153, - "begin": 9355953, - "headersEnd": 9356111, + "beginOffset": 9355953, + "headersEndOffset": 9356111, + "endOffset": 9358966, "message": { "lineNumber": 146157, - "begin": 9356111, - "headersEnd": 9357514, + "beginOffset": 9356111, + "headersEndOffset": 9357514, + "endOffset": 9358966, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146157, - "begin": 9356111, - "headersEnd": 9357514, - "end": 9358966, + "beginOffset": 9356111, + "headersEndOffset": 9357514, + "endOffset": 9358966, "octets": 1452, "lines": 20 }, - "end": 9358966, "octets": 1452 }, - "end": 9358966, "octets": 2855, "lines": 43 } ], - "end": 9358998, "octets": 3246, "lines": 58 }, - "end": 9358998, "octets": 3246 }, { - "mboxMarkerBegin": 9359000, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9359000, "lineNumber": 146204, - "begin": 9359033, - "headersEnd": 9359714, + "beginOffset": 9359033, + "headersEndOffset": 9359714, + "endOffset": 9365816, "body": { "mimeType": "multipart/signed", "lineNumber": 146204, - "begin": 9359033, - "headersEnd": 9359714, + "beginOffset": 9359033, + "headersEndOffset": 9359714, + "endOffset": 9365816, "children": [ { "mimeType": "text/plain", "lineNumber": 146223, - "begin": 9359818, - "headersEnd": 9359897, - "end": 9359939, + "beginOffset": 9359818, + "headersEndOffset": 9359897, + "endOffset": 9359939, "octets": 42, "lines": 2 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 146229, - "begin": 9359983, - "headersEnd": 9360138, - "end": 9365770, + "beginOffset": 9359983, + "headersEndOffset": 9360138, + "endOffset": 9365770, "octets": 5632, "lines": 77 } ], - "end": 9365816, "octets": 6102, "lines": 91 }, - "end": 9365816, "octets": 6102 }, { - "mboxMarkerBegin": 9365818, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9365818, "lineNumber": 146313, - "begin": 9365851, - "headersEnd": 9366934, + "beginOffset": 9365851, + "headersEndOffset": 9366934, + "endOffset": 9377310, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146313, - "begin": 9365851, - "headersEnd": 9366934, - "end": 9377310, + "beginOffset": 9365851, + "headersEndOffset": 9366934, + "endOffset": 9377310, "octets": 10376, "lines": 141 }, - "end": 9377310, "octets": 10376 }, { - "mboxMarkerBegin": 9377312, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9377312, "lineNumber": 146476, - "begin": 9377345, - "headersEnd": 9378745, + "beginOffset": 9377345, + "headersEndOffset": 9378745, + "endOffset": 9381612, "body": { "mimeType": "multipart/signed", "lineNumber": 146476, - "begin": 9377345, - "headersEnd": 9378745, + "beginOffset": 9377345, + "headersEndOffset": 9378745, + "endOffset": 9381612, "children": [ { "mimeType": "text/plain", "lineNumber": 146503, - "begin": 9378849, - "headersEnd": 9378928, - "end": 9379555, + "beginOffset": 9378849, + "headersEndOffset": 9378928, + "endOffset": 9379555, "octets": 627, "lines": 17 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 146524, - "begin": 9379599, - "headersEnd": 9379754, - "end": 9381566, + "beginOffset": 9379599, + "headersEndOffset": 9379754, + "endOffset": 9381566, "octets": 1812, "lines": 25 } ], - "end": 9381612, "octets": 2867, "lines": 54 }, - "end": 9381612, "octets": 2867 }, { - "mboxMarkerBegin": 9381614, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9381614, "lineNumber": 146556, - "begin": 9381647, - "headersEnd": 9382210, + "beginOffset": 9381647, + "headersEndOffset": 9382210, + "endOffset": 9382740, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146556, - "begin": 9381647, - "headersEnd": 9382210, - "end": 9382740, + "beginOffset": 9381647, + "headersEndOffset": 9382210, + "endOffset": 9382740, "octets": 530, "lines": 8 }, - "end": 9382740, "octets": 530 }, { - "mboxMarkerBegin": 9382742, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9382742, "lineNumber": 146580, - "begin": 9382751, - "headersEnd": 9384087, + "beginOffset": 9382751, + "headersEndOffset": 9384087, + "endOffset": 9385042, "body": { "mimeType": "MULTIPART/SIGNED", "lineNumber": 146580, - "begin": 9382751, - "headersEnd": 9384087, + "beginOffset": 9382751, + "headersEndOffset": 9384087, + "endOffset": 9385042, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 146605, - "begin": 9384349, - "headersEnd": 9384395, - "end": 9384998, + "beginOffset": 9384349, + "headersEndOffset": 9384395, + "endOffset": 9384998, "octets": 603, "lines": 15 } ], - "end": 9385042, "octets": 955, "lines": 24 }, - "end": 9385042, "octets": 955 }, { - "mboxMarkerBegin": 9385044, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9385044, "lineNumber": 146625, - "begin": 9385053, - "headersEnd": 9386420, + "beginOffset": 9385053, + "headersEndOffset": 9386420, + "endOffset": 9395402, "body": { "mimeType": "MULTIPART/SIGNED", "lineNumber": 146625, - "begin": 9385053, - "headersEnd": 9386420, + "beginOffset": 9385053, + "headersEndOffset": 9386420, + "endOffset": 9395402, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 146650, - "begin": 9386682, - "headersEnd": 9386728, - "end": 9386835, + "beginOffset": 9386682, + "headersEndOffset": 9386728, + "endOffset": 9386835, "octets": 107, "lines": 6 }, { "mimeType": "MULTIPART/MIXED", "lineNumber": 146660, - "begin": 9386879, - "headersEnd": 9387046, + "beginOffset": 9386879, + "headersEndOffset": 9387046, + "endOffset": 9389799, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 146669, - "begin": 9387306, - "headersEnd": 9387416, - "end": 9387511, + "beginOffset": 9387306, + "headersEndOffset": 9387416, + "endOffset": 9387511, "octets": 95, "lines": 4 }, { "mimeType": "MESSAGE/RFC822", "lineNumber": 146678, - "begin": 9387553, - "headersEnd": 9387649, + "beginOffset": 9387553, + "headersEndOffset": 9387649, + "endOffset": 9389055, "message": { "lineNumber": 146681, - "begin": 9387649, - "headersEnd": 9388845, + "beginOffset": 9387649, + "headersEndOffset": 9388845, + "endOffset": 9389055, "body": { "mimeType": "text/plain", "lineNumber": 146681, - "begin": 9387649, - "headersEnd": 9388845, - "end": 9389055, + "beginOffset": 9387649, + "headersEndOffset": 9388845, + "endOffset": 9389055, "octets": 210, "lines": 5 }, - "end": 9389055, "octets": 210 }, - "end": 9389055, "octets": 1406, "lines": 34 }, { "mimeType": "TEXT/X-VCARD", "lineNumber": 146717, - "begin": 9389097, - "headersEnd": 9389267, - "end": 9389757, + "beginOffset": 9389097, + "headersEndOffset": 9389267, + "endOffset": 9389757, "octets": 490, "lines": 11 } ], - "end": 9389799, "octets": 2753, "lines": 70 }, { "mimeType": "APPLICATION/X-PKCS7-SIGNATURE", "lineNumber": 146735, - "begin": 9389843, - "headersEnd": 9390060, - "end": 9395354, + "beginOffset": 9389843, + "headersEndOffset": 9390060, + "endOffset": 9395354, "octets": 5294, "lines": 72 } ], - "end": 9395402, "octets": 8982, "lines": 169 }, - "end": 9395402, "octets": 8982 }, { - "mboxMarkerBegin": 9395404, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9395404, "lineNumber": 146816, - "begin": 9395437, - "headersEnd": 9396672, + "beginOffset": 9395437, + "headersEndOffset": 9396672, + "endOffset": 9399592, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146816, - "begin": 9395437, - "headersEnd": 9396672, - "end": 9399592, + "beginOffset": 9395437, + "headersEndOffset": 9396672, + "endOffset": 9399592, "octets": 2920, "lines": 38 }, - "end": 9399592, "octets": 2920 }, { - "mboxMarkerBegin": 9399594, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9399594, "lineNumber": 146876, - "begin": 9399627, - "headersEnd": 9400806, + "beginOffset": 9399627, + "headersEndOffset": 9400806, + "endOffset": 9402958, "body": { "mimeType": "Application/x-pkcs7-mime", "lineNumber": 146876, - "begin": 9399627, - "headersEnd": 9400806, - "end": 9402958, + "beginOffset": 9399627, + "headersEndOffset": 9400806, + "endOffset": 9402958, "octets": 2152, "lines": 30 }, - "end": 9402958, "octets": 2152 }, { - "mboxMarkerBegin": 9402960, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9402960, "lineNumber": 146929, - "begin": 9402993, - "headersEnd": 9404092, + "beginOffset": 9402993, + "headersEndOffset": 9404092, + "endOffset": 9407102, "body": { "mimeType": "multipart/signed", "lineNumber": 146929, - "begin": 9402993, - "headersEnd": 9404092, + "beginOffset": 9402993, + "headersEndOffset": 9404092, + "endOffset": 9407102, "children": [ { "mimeType": "text/plain", "lineNumber": 146952, - "begin": 9404127, - "headersEnd": 9404194, - "end": 9404194, + "beginOffset": 9404127, + "headersEndOffset": 9404194, + "endOffset": 9404194, "octets": 0, "lines": 0 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 146957, - "begin": 9404229, - "headersEnd": 9404311, - "end": 9407065, + "beginOffset": 9404229, + "headersEndOffset": 9404311, + "endOffset": 9407065, "octets": 2754, "lines": 42 } ], - "end": 9407102, "octets": 3010, "lines": 53 }, - "end": 9407102, "octets": 3010 }, { - "mboxMarkerBegin": 9407104, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9407104, "lineNumber": 147005, - "begin": 9407137, - "headersEnd": 9408193, + "beginOffset": 9407137, + "headersEndOffset": 9408193, + "endOffset": 9411145, "body": { "mimeType": "multipart/mixed", "lineNumber": 147005, - "begin": 9407137, - "headersEnd": 9408193, + "beginOffset": 9407137, + "headersEndOffset": 9408193, + "endOffset": 9411145, "children": [ { "mimeType": "text/plain", "lineNumber": 147026, - "begin": 9408236, - "headersEnd": 9408317, - "end": 9408783, + "beginOffset": 9408236, + "headersEndOffset": 9408317, + "endOffset": 9408783, "octets": 466, "lines": 14 }, { "mimeType": "text/html", "lineNumber": 147044, - "begin": 9408826, - "headersEnd": 9408904, - "end": 9409741, + "beginOffset": 9408826, + "headersEndOffset": 9408904, + "endOffset": 9409741, "octets": 837, "lines": 27 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147075, - "begin": 9409784, - "headersEnd": 9409884, - "end": 9411100, + "beginOffset": 9409784, + "headersEndOffset": 9409884, + "endOffset": 9411100, "octets": 1216, "lines": 16 } ], - "end": 9411145, "octets": 2952, "lines": 72 }, - "end": 9411145, "octets": 2952 }, { - "mboxMarkerBegin": 9411147, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9411147, "lineNumber": 147098, - "begin": 9411180, - "headersEnd": 9412276, + "beginOffset": 9411180, + "headersEndOffset": 9412276, + "endOffset": 9416879, "body": { "mimeType": "multipart/signed", "lineNumber": 147098, - "begin": 9411180, - "headersEnd": 9412276, + "beginOffset": 9411180, + "headersEndOffset": 9412276, + "endOffset": 9416879, "children": [ { "mimeType": "text/plain", "lineNumber": 147121, - "begin": 9412321, - "headersEnd": 9412394, - "end": 9412553, + "beginOffset": 9412321, + "headersEndOffset": 9412394, + "endOffset": 9412553, "octets": 159, "lines": 7 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147133, - "begin": 9412598, - "headersEnd": 9412680, - "end": 9416832, + "beginOffset": 9412598, + "headersEndOffset": 9412680, + "endOffset": 9416832, "octets": 4152, "lines": 57 } ], - "end": 9416879, "octets": 4603, "lines": 75 }, - "end": 9416879, "octets": 4603 }, { - "mboxMarkerBegin": 9416881, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9416881, "lineNumber": 147196, - "begin": 9416890, - "headersEnd": 9417456, + "beginOffset": 9416890, + "headersEndOffset": 9417456, + "endOffset": 9421944, "body": { "mimeType": "multipart/signed", "lineNumber": 147196, - "begin": 9416890, - "headersEnd": 9417456, + "beginOffset": 9416890, + "headersEndOffset": 9417456, + "endOffset": 9421944, "children": [ { "mimeType": "text/plain", "lineNumber": 147213, - "begin": 9417502, - "headersEnd": 9417569, - "end": 9417727, + "beginOffset": 9417502, + "headersEndOffset": 9417569, + "endOffset": 9417727, "octets": 158, "lines": 4 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147221, - "begin": 9417773, - "headersEnd": 9417928, - "end": 9421898, + "beginOffset": 9417773, + "headersEndOffset": 9417928, + "endOffset": 9421898, "octets": 3970, "lines": 54 } ], - "end": 9421944, "octets": 4488, "lines": 69 }, - "end": 9421944, "octets": 4488 }, { - "mboxMarkerBegin": 9421946, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9421946, "lineNumber": 147281, - "begin": 9421979, - "headersEnd": 9423163, + "beginOffset": 9421979, + "headersEndOffset": 9423163, + "endOffset": 9427294, "body": { "mimeType": "multipart/mixed", "lineNumber": 147281, - "begin": 9421979, - "headersEnd": 9423163, + "beginOffset": 9421979, + "headersEndOffset": 9423163, + "endOffset": 9427294, "children": [ { "mimeType": "text/plain", "lineNumber": 147305, - "begin": 9423344, - "headersEnd": 9423425, - "end": 9423502, + "beginOffset": 9423344, + "headersEndOffset": 9423425, + "endOffset": 9423502, "octets": 77, "lines": 5 }, { "mimeType": "application/octet-stream", "lineNumber": 147315, - "begin": 9423545, - "headersEnd": 9423643, - "end": 9427249, + "beginOffset": 9423545, + "headersEndOffset": 9423643, + "endOffset": 9427249, "octets": 3606, "lines": 47 } ], - "end": 9427294, "octets": 4131, "lines": 66 }, - "end": 9427294, "octets": 4131 }, { - "mboxMarkerBegin": 9427296, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9427296, "lineNumber": 147369, - "begin": 9427329, - "headersEnd": 9428452, + "beginOffset": 9427329, + "headersEndOffset": 9428452, + "endOffset": 9432575, "body": { "mimeType": "multipart/signed", "lineNumber": 147369, - "begin": 9427329, - "headersEnd": 9428452, + "beginOffset": 9427329, + "headersEndOffset": 9428452, + "endOffset": 9432575, "children": [ { "mimeType": "text/plain", "lineNumber": 147392, - "begin": 9428488, - "headersEnd": 9428569, - "end": 9428647, + "beginOffset": 9428488, + "headersEndOffset": 9428569, + "endOffset": 9428647, "octets": 78, "lines": 5 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147401, - "begin": 9428683, - "headersEnd": 9428765, - "end": 9432539, + "beginOffset": 9428683, + "headersEndOffset": 9428765, + "endOffset": 9432539, "octets": 3774, "lines": 58 } ], - "end": 9432575, "octets": 4123, "lines": 73 }, - "end": 9432575, "octets": 4123 }, { - "mboxMarkerBegin": 9432577, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9432577, "lineNumber": 147464, - "begin": 9432610, - "headersEnd": 9433755, + "beginOffset": 9432610, + "headersEndOffset": 9433755, + "endOffset": 9435052, "body": { "mimeType": "multipart/report", "lineNumber": 147464, - "begin": 9432610, - "headersEnd": 9433755, + "beginOffset": 9432610, + "headersEndOffset": 9433755, + "endOffset": 9435052, "children": [ { "mimeType": "message/delivery-status", "lineNumber": 147486, - "begin": 9433897, - "headersEnd": 9433938, - "end": 9434132, + "beginOffset": 9433897, + "headersEndOffset": 9433938, + "endOffset": 9434132, "octets": 194, "lines": 6 }, { "mimeType": "message/rfc822", "lineNumber": 147496, - "begin": 9434159, - "headersEnd": 9434191, + "beginOffset": 9434159, + "headersEndOffset": 9434191, + "endOffset": 9435023, "message": { "lineNumber": 147498, - "begin": 9434191, - "headersEnd": 9435012, + "beginOffset": 9434191, + "headersEndOffset": 9435012, + "endOffset": 9435023, "body": { "mimeType": "text/plain", "lineNumber": 147498, - "begin": 9434191, - "headersEnd": 9435012, - "end": 9435023, + "beginOffset": 9434191, + "headersEndOffset": 9435012, + "endOffset": 9435023, "octets": 11, "lines": 1 }, - "end": 9435023, "octets": 11 }, - "end": 9435023, "octets": 832, "lines": 16 } ], - "end": 9435052, "octets": 1297, "lines": 34 }, - "end": 9435052, "octets": 1297 }, { - "mboxMarkerBegin": 9435054, - "mboxMarkerLength": 45, + "mboxMarkerOffset": 9435054, "lineNumber": 147517, - "begin": 9435101, - "headersEnd": 9435272, + "beginOffset": 9435101, + "headersEndOffset": 9435272, + "endOffset": 9470358, "body": { "mimeType": "text/plain", "lineNumber": 147517, - "begin": 9435101, - "headersEnd": 9435272, - "end": 9470358, + "beginOffset": 9435101, + "headersEndOffset": 9435272, + "endOffset": 9470358, "octets": 35086, "lines": 592 }, - "end": 9470358, "octets": 35086 }, { - "mboxMarkerBegin": 9470360, - "mboxMarkerLength": 45, + "mboxMarkerOffset": 9470360, "lineNumber": 148117, - "begin": 9470407, - "headersEnd": 9470571, + "beginOffset": 9470407, + "headersEndOffset": 9470571, + "endOffset": 9505657, "body": { "mimeType": "application/octet-stream", "lineNumber": 148117, - "begin": 9470407, - "headersEnd": 9470571, - "end": 9505657, + "beginOffset": 9470407, + "headersEndOffset": 9470571, + "endOffset": 9505657, "octets": 35086, "lines": 592 }, - "end": 9505657, "octets": 35086 }, { - "mboxMarkerBegin": 9505659, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9505659, "lineNumber": 148717, - "begin": 9505668, - "headersEnd": 9506276, + "beginOffset": 9505668, + "headersEndOffset": 9506276, + "endOffset": 9507714, "body": { "mimeType": "application/octet-stream", "lineNumber": 148717, - "begin": 9505668, - "headersEnd": 9506276, - "end": 9507714, + "beginOffset": 9505668, + "headersEndOffset": 9506276, + "endOffset": 9507714, "octets": 1438, "lines": 39 }, - "end": 9507714, "octets": 1438 }, { - "mboxMarkerBegin": 9507716, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9507716, "lineNumber": 148768, - "begin": 9507725, - "headersEnd": 9508642, + "beginOffset": 9507725, + "headersEndOffset": 9508642, + "endOffset": 9754778, "body": { "mimeType": "MULTIPART/mixed", "lineNumber": 148768, - "begin": 9507725, - "headersEnd": 9508642, + "beginOffset": 9507725, + "headersEndOffset": 9508642, + "endOffset": 9754778, "children": [ { "mimeType": "TEXT/plain", "lineNumber": 148786, - "begin": 9508682, - "headersEnd": 9508710, - "end": 9509065, + "beginOffset": 9508682, + "headersEndOffset": 9508710, + "endOffset": 9509065, "octets": 355, "lines": 10 }, { "mimeType": "AUDIO/basic", "lineNumber": 148800, - "begin": 9509107, - "headersEnd": 9509204, - "end": 9754734, + "beginOffset": 9509107, + "headersEndOffset": 9509204, + "endOffset": 9754734, "octets": 245530, "lines": 3961 } ], - "end": 9754778, "octets": 246136, "lines": 3982 }, - "end": 9754778, "octets": 246136 }, { - "mboxMarkerBegin": 9754780, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9754780, "lineNumber": 152769, - "begin": 9754789, - "headersEnd": 9755397, + "beginOffset": 9754789, + "headersEndOffset": 9755397, + "endOffset": 9834353, "body": { "mimeType": "multipart/mixed", "lineNumber": 152769, - "begin": 9754789, - "headersEnd": 9755397, + "beginOffset": 9754789, + "headersEndOffset": 9755397, + "endOffset": 9834353, "children": [ { "mimeType": "image/pbm", "lineNumber": 152786, - "begin": 9755461, - "headersEnd": 9755625, - "end": 9834319, + "beginOffset": 9755461, + "headersEndOffset": 9755625, + "endOffset": 9834319, "octets": 78694, "lines": 406 } ], - "end": 9834353, "octets": 78956, "lines": 416 }, - "end": 9834353, "octets": 78956 }, { - "mboxMarkerBegin": 9834355, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9834355, "lineNumber": 153201, - "begin": 9834364, - "headersEnd": 9834521, + "beginOffset": 9834364, + "headersEndOffset": 9834521, + "endOffset": 9838129, "body": { "mimeType": "message/partial", "lineNumber": 153201, - "begin": 9834364, - "headersEnd": 9834521, - "end": 9838129, + "beginOffset": 9834364, + "headersEndOffset": 9834521, + "endOffset": 9838129, "octets": 3608, "lines": 49 }, - "end": 9838129, "octets": 3608 }, { - "mboxMarkerBegin": 9838131, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9838131, "lineNumber": 153256, - "begin": 9838140, - "headersEnd": 9838928, + "beginOffset": 9838140, + "headersEndOffset": 9838928, + "endOffset": 9869675, "body": { "mimeType": "multipart/alternative", "lineNumber": 153256, - "begin": 9838140, - "headersEnd": 9838928, + "beginOffset": 9838140, + "headersEndOffset": 9838928, + "endOffset": 9869675, "children": [ { "mimeType": "text/plain", "lineNumber": 153276, - "begin": 9839127, - "headersEnd": 9839173, - "end": 9839594, + "beginOffset": 9839127, + "headersEndOffset": 9839173, + "endOffset": 9839594, "octets": 421, "lines": 7 }, { "mimeType": "multipart/mixed", "lineNumber": 153287, - "begin": 9839637, - "headersEnd": 9839725, + "beginOffset": 9839637, + "headersEndOffset": 9839725, + "endOffset": 9869632, "children": [ { "mimeType": "text/richtext", "lineNumber": 153291, - "begin": 9839768, - "headersEnd": 9839862, - "end": 9839934, + "beginOffset": 9839768, + "headersEndOffset": 9839862, + "endOffset": 9839934, "octets": 72, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 153297, - "begin": 9839979, - "headersEnd": 9840082, - "end": 9850936, + "beginOffset": 9839979, + "headersEndOffset": 9840082, + "endOffset": 9850936, "octets": 10854, "lines": 157 }, { "mimeType": "text/richtext", "lineNumber": 153460, - "begin": 9850981, - "headersEnd": 9851075, - "end": 9851141, + "beginOffset": 9850981, + "headersEndOffset": 9851075, + "endOffset": 9851141, "octets": 66, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 153467, - "begin": 9851186, - "headersEnd": 9851283, - "end": 9857273, + "beginOffset": 9851186, + "headersEndOffset": 9851283, + "endOffset": 9857273, "octets": 5990, "lines": 87 }, { "mimeType": "text/richtext", "lineNumber": 153560, - "begin": 9857318, - "headersEnd": 9857412, - "end": 9857447, + "beginOffset": 9857318, + "headersEndOffset": 9857412, + "endOffset": 9857447, "octets": 35, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 153567, - "begin": 9857492, - "headersEnd": 9857597, - "end": 9869413, + "beginOffset": 9857492, + "headersEndOffset": 9857597, + "endOffset": 9869413, "octets": 11816, "lines": 170 }, { "mimeType": "text/richtext", "lineNumber": 153743, - "begin": 9869458, - "headersEnd": 9869552, - "end": 9869585, + "beginOffset": 9869458, + "headersEndOffset": 9869552, + "endOffset": 9869585, "octets": 33, "lines": 2 } ], - "end": 9869632, "octets": 29907, "lines": 460 } ], - "end": 9869675, "octets": 30747, "lines": 480 }, - "end": 9869675, "octets": 30747 }, { - "mboxMarkerBegin": 9869677, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9869677, "lineNumber": 153753, - "begin": 9869686, - "headersEnd": 9869745, + "beginOffset": 9869686, + "headersEndOffset": 9869745, + "endOffset": 9870980, "body": { "mimeType": "text/plain", "lineNumber": 153753, - "begin": 9869686, - "headersEnd": 9869745, - "end": 9870980, + "beginOffset": 9869686, + "headersEndOffset": 9869745, + "endOffset": 9870980, "octets": 1235, "lines": 28 }, - "end": 9870980, "octets": 1235 }, { - "mboxMarkerBegin": 9870982, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9870982, "lineNumber": 153785, - "begin": 9871015, - "headersEnd": 9871171, + "beginOffset": 9871015, + "headersEndOffset": 9871171, + "endOffset": 9874346, "body": { "mimeType": "text/plain", "lineNumber": 153785, - "begin": 9871015, - "headersEnd": 9871171, - "end": 9874346, + "beginOffset": 9871015, + "headersEndOffset": 9871171, + "endOffset": 9874346, "octets": 3175, "lines": 68 }, - "end": 9874346, "octets": 3175 }, { - "mboxMarkerBegin": 9874348, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9874348, "lineNumber": 153859, - "begin": 9874381, - "headersEnd": 9876277, + "beginOffset": 9874381, + "headersEndOffset": 9876277, + "endOffset": 9881248, "body": { "mimeType": "multipart/mixed", "lineNumber": 153859, - "begin": 9874381, - "headersEnd": 9876277, + "beginOffset": 9874381, + "headersEndOffset": 9876277, + "endOffset": 9881248, "children": [ { "mimeType": "text/plain", "lineNumber": 153891, - "begin": 9876322, - "headersEnd": 9876403, - "end": 9877284, + "beginOffset": 9876322, + "headersEndOffset": 9876403, + "endOffset": 9877284, "octets": 881, "lines": 18 }, { "mimeType": "application/vcard", "lineNumber": 153914, - "begin": 9877331, - "headersEnd": 9877497, - "end": 9881199, + "beginOffset": 9877331, + "headersEndOffset": 9877497, + "endOffset": 9881199, "octets": 3702, "lines": 61 } ], - "end": 9881248, "octets": 4971, "lines": 92 }, - "end": 9881248, "octets": 4971 }, { - "mboxMarkerBegin": 9881250, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9881250, "lineNumber": 153984, - "begin": 9881259, - "headersEnd": 9881826, + "beginOffset": 9881259, + "headersEndOffset": 9881826, + "endOffset": 10000273, "body": { "mimeType": "multipart/mixed", "lineNumber": 153984, - "begin": 9881259, - "headersEnd": 9881826, + "beginOffset": 9881259, + "headersEndOffset": 9881826, + "endOffset": 10000273, "children": [ { "mimeType": "text/plain", "lineNumber": 153999, - "begin": 9881845, - "headersEnd": 9881874, - "end": 9882856, + "beginOffset": 9881845, + "headersEndOffset": 9881874, + "endOffset": 9882856, "octets": 982, "lines": 19 }, { "mimeType": "image/pgm", "lineNumber": 154022, - "begin": 9882875, - "headersEnd": 9882938, - "end": 10000250, + "beginOffset": 9882875, + "headersEndOffset": 9882938, + "endOffset": 10000250, "octets": 117312, "lines": 1586 } ], - "end": 10000273, "octets": 118447, "lines": 1617 }, - "end": 10000273, "octets": 118447 }, { - "mboxMarkerBegin": 10000275, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10000275, "lineNumber": 155616, - "begin": 10000284, - "headersEnd": 10001099, + "beginOffset": 10000284, + "headersEndOffset": 10001099, + "endOffset": 10026556, "body": { "mimeType": "multipart/alternative", "lineNumber": 155616, - "begin": 10000284, - "headersEnd": 10001099, + "beginOffset": 10000284, + "headersEndOffset": 10001099, + "endOffset": 10026556, "children": [ { "mimeType": "text/plain", "lineNumber": 155639, - "begin": 10001298, - "headersEnd": 10001344, - "end": 10010656, + "beginOffset": 10001298, + "headersEndOffset": 10001344, + "endOffset": 10010656, "octets": 9312, "lines": 349 }, { "mimeType": "multipart/mixed", "lineNumber": 155992, - "begin": 10010699, - "headersEnd": 10010787, + "beginOffset": 10010699, + "headersEndOffset": 10010787, + "endOffset": 10026511, "children": [ { "mimeType": "text/richtext", "lineNumber": 155996, - "begin": 10010830, - "headersEnd": 10010924, - "end": 10013768, + "beginOffset": 10010830, + "headersEndOffset": 10010924, + "endOffset": 10013768, "octets": 2844, "lines": 69 }, { "mimeType": "message/external-body", "lineNumber": 156070, - "begin": 10013813, - "headersEnd": 10014016, + "beginOffset": 10013813, + "headersEndOffset": 10014016, + "endOffset": 10014049, "message": { "lineNumber": 156077, - "begin": 10014016, - "headersEnd": 10014045, + "beginOffset": 10014016, + "headersEndOffset": 10014045, + "endOffset": 10014049, "body": { "mimeType": "text/X-HTML", "lineNumber": 156077, - "begin": 10014016, - "headersEnd": 10014045, - "end": 10014049, + "beginOffset": 10014016, + "headersEndOffset": 10014045, + "endOffset": 10014049, "octets": 4, "lines": 2 }, - "end": 10014049, "octets": 4 }, - "end": 10014049, "octets": 33, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 156083, - "begin": 10014094, - "headersEnd": 10014188, - "end": 10015184, + "beginOffset": 10014094, + "headersEndOffset": 10014188, + "endOffset": 10015184, "octets": 996, "lines": 22 }, { "mimeType": "text/SGML", "lineNumber": 156110, - "begin": 10015229, - "headersEnd": 10015349, - "end": 10015723, + "beginOffset": 10015229, + "headersEndOffset": 10015349, + "endOffset": 10015723, "octets": 374, "lines": 15 }, { "mimeType": "text/richtext", "lineNumber": 156131, - "begin": 10015768, - "headersEnd": 10015862, - "end": 10015874, + "beginOffset": 10015768, + "headersEndOffset": 10015862, + "endOffset": 10015874, "octets": 12, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 156138, - "begin": 10015919, - "headersEnd": 10016110, + "beginOffset": 10015919, + "headersEndOffset": 10016110, + "endOffset": 10016141, "message": { "lineNumber": 156144, - "begin": 10016110, - "headersEnd": 10016139, + "beginOffset": 10016110, + "headersEndOffset": 10016139, + "endOffset": 10016141, "body": { "mimeType": "text/X-HTML", "lineNumber": 156144, - "begin": 10016110, - "headersEnd": 10016139, - "end": 10016141, + "beginOffset": 10016110, + "headersEndOffset": 10016139, + "endOffset": 10016141, "octets": 2, "lines": 1 }, - "end": 10016141, "octets": 2 }, - "end": 10016141, "octets": 31, "lines": 3 }, { "mimeType": "text/richtext", "lineNumber": 156149, - "begin": 10016186, - "headersEnd": 10016280, - "end": 10016292, + "beginOffset": 10016186, + "headersEndOffset": 10016280, + "endOffset": 10016292, "octets": 12, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 156156, - "begin": 10016337, - "headersEnd": 10016447, - "end": 10019473, + "beginOffset": 10016337, + "headersEndOffset": 10016447, + "endOffset": 10019473, "octets": 3026, "lines": 43 }, { "mimeType": "text/richtext", "lineNumber": 156205, - "begin": 10019518, - "headersEnd": 10019612, - "end": 10026464, + "beginOffset": 10019518, + "headersEndOffset": 10019612, + "endOffset": 10026464, "octets": 6852, "lines": 260 } ], - "end": 10026511, "octets": 15724, "lines": 475 } ], - "end": 10026556, "octets": 25457, "lines": 837 }, - "end": 10026556, "octets": 25457 }, { - "mboxMarkerBegin": 10026558, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10026558, "lineNumber": 156474, - "begin": 10026567, - "headersEnd": 10027702, + "beginOffset": 10026567, + "headersEndOffset": 10027702, + "endOffset": 10058732, "body": { "mimeType": "multipart/mixed", "lineNumber": 156474, - "begin": 10026567, - "headersEnd": 10027702, + "beginOffset": 10026567, + "headersEndOffset": 10027702, + "endOffset": 10058732, "children": [ { "mimeType": "text/plain", "lineNumber": 156498, - "begin": 10027713, - "headersEnd": 10027715, - "end": 10028056, + "beginOffset": 10027713, + "headersEndOffset": 10027715, + "endOffset": 10028056, "octets": 341, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 156509, - "begin": 10028069, - "headersEnd": 10028131, - "end": 10058521, + "beginOffset": 10028069, + "headersEndOffset": 10028131, + "endOffset": 10058521, "octets": 30390, "lines": 411 }, { "mimeType": "text/plain", "lineNumber": 156925, - "begin": 10058534, - "headersEnd": 10058536, - "end": 10058717, + "beginOffset": 10058534, + "headersEndOffset": 10058536, + "endOffset": 10058717, "octets": 181, "lines": 9 } ], - "end": 10058732, "octets": 31030, "lines": 440 }, - "end": 10058732, "octets": 31030 }, { - "mboxMarkerBegin": 10058734, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10058734, "lineNumber": 156939, - "begin": 10058743, - "headersEnd": 10060481, + "beginOffset": 10058743, + "headersEndOffset": 10060481, + "endOffset": 10246231, "body": { "mimeType": "text/plain", "lineNumber": 156939, - "begin": 10058743, - "headersEnd": 10060481, - "end": 10246231, + "beginOffset": 10058743, + "headersEndOffset": 10060481, + "endOffset": 10246231, "octets": 185750, "lines": 2951 }, - "end": 10246231, "octets": 185750 }, { - "mboxMarkerBegin": 10246233, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10246233, "lineNumber": 159921, - "begin": 10246242, - "headersEnd": 10246965, + "beginOffset": 10246242, + "headersEndOffset": 10246965, + "endOffset": 10331708, "body": { "mimeType": "multipart/mixed", "lineNumber": 159921, - "begin": 10246242, - "headersEnd": 10246965, + "beginOffset": 10246242, + "headersEndOffset": 10246965, + "endOffset": 10331708, "children": [ { "mimeType": "text/plain", "lineNumber": 159938, - "begin": 10246993, - "headersEnd": 10246995, - "end": 10247016, + "beginOffset": 10246993, + "headersEndOffset": 10246995, + "endOffset": 10247016, "octets": 21, "lines": 1 }, { "mimeType": "image/pgm", "lineNumber": 159941, - "begin": 10247046, - "headersEnd": 10247203, - "end": 10331377, + "beginOffset": 10247046, + "headersEndOffset": 10247203, + "endOffset": 10331377, "octets": 84174, "lines": 434 }, { "mimeType": "text/plain", "lineNumber": 160381, - "begin": 10331407, - "headersEnd": 10331409, - "end": 10331676, + "beginOffset": 10331407, + "headersEndOffset": 10331409, + "endOffset": 10331676, "octets": 267, "lines": 9 } ], - "end": 10331708, "octets": 84743, "lines": 455 }, - "end": 10331708, "octets": 84743 }, { - "mboxMarkerBegin": 10331710, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10331710, "lineNumber": 160394, - "begin": 10331719, - "headersEnd": 10332401, + "beginOffset": 10331719, + "headersEndOffset": 10332401, + "endOffset": 10554623, "body": { "mimeType": "multipart/mixed", "lineNumber": 160394, - "begin": 10331719, - "headersEnd": 10332401, + "beginOffset": 10331719, + "headersEndOffset": 10332401, + "endOffset": 10554623, "children": [ { "mimeType": "text/plain", "lineNumber": 160410, - "begin": 10332429, - "headersEnd": 10332431, - "end": 10332497, + "beginOffset": 10332429, + "headersEndOffset": 10332431, + "endOffset": 10332497, "octets": 66, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 160413, - "begin": 10332527, - "headersEnd": 10332693, - "end": 10365025, + "beginOffset": 10332527, + "headersEndOffset": 10332693, + "endOffset": 10365025, "octets": 32332, "lines": 167 }, { "mimeType": "text/plain", "lineNumber": 160586, - "begin": 10365055, - "headersEnd": 10365057, - "end": 10365075, + "beginOffset": 10365055, + "headersEndOffset": 10365057, + "endOffset": 10365075, "octets": 18, "lines": 2 }, { "mimeType": "image/pbm", "lineNumber": 160590, - "begin": 10365105, - "headersEnd": 10365269, - "end": 10366359, + "beginOffset": 10365105, + "headersEndOffset": 10365269, + "endOffset": 10366359, "octets": 1090, "lines": 6 }, { "mimeType": "text/plain", "lineNumber": 160602, - "begin": 10366389, - "headersEnd": 10366391, - "end": 10366423, + "beginOffset": 10366389, + "headersEndOffset": 10366391, + "endOffset": 10366423, "octets": 32, "lines": 2 }, { "mimeType": "application/x-annotate-2", "lineNumber": 160607, - "begin": 10366453, - "headersEnd": 10366524, - "end": 10554551, + "beginOffset": 10366453, + "headersEndOffset": 10366524, + "endOffset": 10554551, "octets": 188027, "lines": 1990 }, { "mimeType": "text/plain", "lineNumber": 162602, - "begin": 10554581, - "headersEnd": 10554583, - "end": 10554591, + "beginOffset": 10554581, + "headersEndOffset": 10554583, + "endOffset": 10554591, "octets": 8, "lines": 1 } ], - "end": 10554623, "octets": 222222, "lines": 2196 }, - "end": 10554623, "octets": 222222 }, { - "mboxMarkerBegin": 10554625, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10554625, "lineNumber": 162607, - "begin": 10554634, - "headersEnd": 10554906, + "beginOffset": 10554634, + "headersEndOffset": 10554906, + "endOffset": 10630586, "body": { "mimeType": "application/octet-stream", "lineNumber": 162607, - "begin": 10554634, - "headersEnd": 10554906, - "end": 10630586, + "beginOffset": 10554634, + "headersEndOffset": 10554906, + "endOffset": 10630586, "octets": 75680, "lines": 1023 }, - "end": 10630586, "octets": 75680 }, { - "mboxMarkerBegin": 10630588, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10630588, "lineNumber": 163639, - "begin": 10630597, - "headersEnd": 10631896, + "beginOffset": 10630597, + "headersEndOffset": 10631896, + "endOffset": 10687748, "body": { "mimeType": "multipart/alternative", "lineNumber": 163639, - "begin": 10630597, - "headersEnd": 10631896, + "beginOffset": 10630597, + "headersEndOffset": 10631896, + "endOffset": 10687748, "children": [ { "mimeType": "text/plain", "lineNumber": 163673, - "begin": 10632489, - "headersEnd": 10632491, - "end": 10634372, + "beginOffset": 10632489, + "headersEndOffset": 10632491, + "endOffset": 10634372, "octets": 1881, "lines": 34 }, { "mimeType": "multipart/mixed", "lineNumber": 163710, - "begin": 10634433, - "headersEnd": 10634539, + "beginOffset": 10634433, + "headersEndOffset": 10634539, + "endOffset": 10687685, "children": [ { "mimeType": "text/richtext", "lineNumber": 163714, - "begin": 10634600, - "headersEnd": 10634676, - "end": 10636704, + "beginOffset": 10634600, + "headersEndOffset": 10634676, + "endOffset": 10636704, "octets": 2028, "lines": 29 }, { "mimeType": "image/xwd", "lineNumber": 163748, - "begin": 10636767, - "headersEnd": 10636829, - "end": 10644867, + "beginOffset": 10636767, + "headersEndOffset": 10636829, + "endOffset": 10644867, "octets": 8038, "lines": 109 }, { "mimeType": "text/plain", "lineNumber": 163862, - "begin": 10644930, - "headersEnd": 10645003, - "end": 10645008, + "beginOffset": 10644930, + "headersEndOffset": 10645003, + "endOffset": 10645008, "octets": 5, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 163869, - "begin": 10645071, - "headersEnd": 10645168, - "end": 10687620, + "beginOffset": 10645071, + "headersEndOffset": 10645168, + "endOffset": 10687620, "octets": 42452, "lines": 574 } ], - "end": 10687685, "octets": 53146, "lines": 736 } ], - "end": 10687748, "octets": 55852, "lines": 787 }, - "end": 10687748, "octets": 55852 }, { - "mboxMarkerBegin": 10687750, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10687750, "lineNumber": 164453, - "begin": 10687759, - "headersEnd": 10687916, + "beginOffset": 10687759, + "headersEndOffset": 10687916, + "endOffset": 10692786, "body": { "mimeType": "message/partial", "lineNumber": 164453, - "begin": 10687759, - "headersEnd": 10687916, - "end": 10692786, + "beginOffset": 10687759, + "headersEndOffset": 10687916, + "endOffset": 10692786, "octets": 4870, "lines": 68 }, - "end": 10692786, "octets": 4870 }, { - "mboxMarkerBegin": 10692788, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10692788, "lineNumber": 164527, - "begin": 10692797, - "headersEnd": 10693559, + "beginOffset": 10692797, + "headersEndOffset": 10693559, + "endOffset": 10700991, "body": { "mimeType": "multipart/alternative", "lineNumber": 164527, - "begin": 10692797, - "headersEnd": 10693559, + "beginOffset": 10692797, + "headersEndOffset": 10693559, + "endOffset": 10700991, "children": [ { "mimeType": "text/plain", "lineNumber": 164551, - "begin": 10693945, - "headersEnd": 10693947, - "end": 10694323, + "beginOffset": 10693945, + "headersEndOffset": 10693947, + "endOffset": 10694323, "octets": 376, "lines": 8 }, { "mimeType": "multipart/mixed", "lineNumber": 164562, - "begin": 10694366, - "headersEnd": 10694454, + "beginOffset": 10694366, + "headersEndOffset": 10694454, + "endOffset": 10700946, "children": [ { "mimeType": "text/plain", "lineNumber": 164566, - "begin": 10694497, - "headersEnd": 10694570, - "end": 10694663, + "beginOffset": 10694497, + "headersEndOffset": 10694570, + "endOffset": 10694663, "octets": 93, "lines": 4 }, { "mimeType": "image/gif", "lineNumber": 164575, - "begin": 10694708, - "headersEnd": 10694826, - "end": 10700572, + "beginOffset": 10694708, + "headersEndOffset": 10694826, + "endOffset": 10700572, "octets": 5746, "lines": 83 }, { "mimeType": "text/plain", "lineNumber": 164664, - "begin": 10700617, - "headersEnd": 10700690, - "end": 10700899, + "beginOffset": 10700617, + "headersEndOffset": 10700690, + "endOffset": 10700899, "octets": 209, "lines": 6 } ], - "end": 10700946, "octets": 6492, "lines": 110 } ], - "end": 10700991, "octets": 7432, "lines": 133 }, - "end": 10700991, "octets": 7432 } ] \ No newline at end of file From a954c44f79d14a86d4ab1ded9a8f17b3ecc59fe3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jul 2020 11:15:44 -0400 Subject: [PATCH 668/741] updated unix offsets --- .../mbox/content-length.unix-offsets.json | 981 ++- UnitTests/TestData/mbox/jwz.unix-offsets.json | 6906 ++++++++--------- 2 files changed, 3853 insertions(+), 4034 deletions(-) diff --git a/UnitTests/TestData/mbox/content-length.unix-offsets.json b/UnitTests/TestData/mbox/content-length.unix-offsets.json index 8b88150bd6..f20b4d593b 100644 --- a/UnitTests/TestData/mbox/content-length.unix-offsets.json +++ b/UnitTests/TestData/mbox/content-length.unix-offsets.json @@ -1,1359 +1,1330 @@ [ { - "mboxMarkerBegin": 0, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 0, "lineNumber": 2, - "begin": 8, - "headersEnd": 657, + "beginOffset": 8, + "headersEndOffset": 657, + "endOffset": 1888, "body": { "mimeType": "multipart/mixed", "lineNumber": 2, - "begin": 8, - "headersEnd": 657, + "beginOffset": 8, + "headersEndOffset": 657, + "endOffset": 1888, "children": [ { "mimeType": "text/plain", "lineNumber": 20, - "begin": 706, - "headersEnd": 732, - "end": 806, + "beginOffset": 706, + "headersEndOffset": 732, + "endOffset": 806, "octets": 74, "lines": 5 }, { "mimeType": "message/rfc822", "lineNumber": 28, - "begin": 856, - "headersEnd": 918, + "beginOffset": 856, + "headersEndOffset": 918, + "endOffset": 1837, "message": { "lineNumber": 31, - "begin": 918, - "headersEnd": 1700, + "beginOffset": 918, + "headersEndOffset": 1700, + "endOffset": 1837, "body": { "mimeType": "text/plain", "lineNumber": 31, - "begin": 918, - "headersEnd": 1700, - "end": 1837, + "beginOffset": 918, + "headersEndOffset": 1700, + "endOffset": 1837, "octets": 137, "lines": 4 }, - "end": 1837, "octets": 137 }, - "end": 1837, "octets": 919, "lines": 21 } ], - "end": 1888, "octets": 1231, "lines": 34 }, - "end": 1888, "octets": 1231 }, { - "mboxMarkerBegin": 1889, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 1889, "lineNumber": 54, - "begin": 1897, - "headersEnd": 2365, + "beginOffset": 1897, + "headersEndOffset": 2365, + "endOffset": 8122, "body": { "mimeType": "multipart/mixed", "lineNumber": 54, - "begin": 1897, - "headersEnd": 2365, + "beginOffset": 1897, + "headersEndOffset": 2365, + "endOffset": 8122, "children": [ { "mimeType": "message/rfc822", "lineNumber": 69, - "begin": 2438, - "headersEnd": 2582, + "beginOffset": 2438, + "headersEndOffset": 2582, + "endOffset": 3048, "message": { "lineNumber": 74, - "begin": 2582, - "headersEnd": 3011, + "beginOffset": 2582, + "headersEndOffset": 3011, + "endOffset": 3048, "body": { "mimeType": "text/plain", "lineNumber": 74, - "begin": 2582, - "headersEnd": 3011, - "end": 3048, + "beginOffset": 2582, + "headersEndOffset": 3011, + "endOffset": 3048, "octets": 37, "lines": 2 }, - "end": 3048, "octets": 37 }, - "end": 3048, "octets": 466, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 89, - "begin": 3076, - "headersEnd": 3199, - "end": 3657, + "beginOffset": 3076, + "headersEndOffset": 3199, + "endOffset": 3657, "octets": 458, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 101, - "begin": 3685, - "headersEnd": 3808, - "end": 4294, + "beginOffset": 3685, + "headersEndOffset": 3808, + "endOffset": 4294, "octets": 486, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 113, - "begin": 4322, - "headersEnd": 4449, - "end": 4976, + "beginOffset": 4322, + "headersEndOffset": 4449, + "endOffset": 4976, "octets": 527, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 126, - "begin": 5004, - "headersEnd": 5129, - "end": 5627, + "beginOffset": 5004, + "headersEndOffset": 5129, + "endOffset": 5627, "octets": 498, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 138, - "begin": 5655, - "headersEnd": 5799, + "beginOffset": 5655, + "headersEndOffset": 5799, + "endOffset": 6265, "message": { "lineNumber": 143, - "begin": 5799, - "headersEnd": 6228, + "beginOffset": 5799, + "headersEndOffset": 6228, + "endOffset": 6265, "body": { "mimeType": "text/plain", "lineNumber": 143, - "begin": 5799, - "headersEnd": 6228, - "end": 6265, + "beginOffset": 5799, + "headersEndOffset": 6228, + "endOffset": 6265, "octets": 37, "lines": 1 }, - "end": 6265, "octets": 37 }, - "end": 6265, "octets": 466, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 157, - "begin": 6293, - "headersEnd": 6464, + "beginOffset": 6293, + "headersEndOffset": 6464, + "endOffset": 7960, "message": { "lineNumber": 162, - "begin": 6464, - "headersEnd": 7034, + "beginOffset": 6464, + "headersEndOffset": 7034, + "endOffset": 7960, "body": { "mimeType": "message/rfc822", "lineNumber": 162, - "begin": 6464, - "headersEnd": 7034, + "beginOffset": 6464, + "headersEndOffset": 7034, + "endOffset": 7960, "message": { "lineNumber": 177, - "begin": 7034, - "headersEnd": 7545, + "beginOffset": 7034, + "headersEndOffset": 7545, + "endOffset": 7960, "body": { "mimeType": "message/rfc822", "lineNumber": 177, - "begin": 7034, - "headersEnd": 7545, + "beginOffset": 7034, + "headersEndOffset": 7545, + "endOffset": 7960, "message": { "lineNumber": 191, - "begin": 7545, - "headersEnd": 7955, + "beginOffset": 7545, + "headersEndOffset": 7955, + "endOffset": 7960, "body": { "mimeType": "text/plain", "lineNumber": 191, - "begin": 7545, - "headersEnd": 7955, - "end": 7960, + "beginOffset": 7545, + "headersEndOffset": 7955, + "endOffset": 7960, "octets": 5, "lines": 1 }, - "end": 7960, "octets": 5 }, - "end": 7960, "octets": 415, "lines": 12 }, - "end": 7960, "octets": 415 }, - "end": 7960, "octets": 926, "lines": 26 }, - "end": 7960, "octets": 926 }, - "end": 7960, "octets": 1496, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 205, - "begin": 7988, - "headersEnd": 8041, - "end": 8093, + "beginOffset": 7988, + "headersEndOffset": 8041, + "endOffset": 8093, "octets": 52, "lines": 1 } ], - "end": 8122, "octets": 5757, "lines": 145 }, - "end": 8122, "octets": 5757 }, { - "mboxMarkerBegin": 8123, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8123, "lineNumber": 212, - "begin": 8131, - "headersEnd": 8602, + "beginOffset": 8131, + "headersEndOffset": 8602, + "endOffset": 14394, "body": { "mimeType": "multipart/mixed", "lineNumber": 212, - "begin": 8131, - "headersEnd": 8602, + "beginOffset": 8131, + "headersEndOffset": 8602, + "endOffset": 14394, "children": [ { "mimeType": "message/rfc822", "lineNumber": 227, - "begin": 8675, - "headersEnd": 8823, + "beginOffset": 8675, + "headersEndOffset": 8823, + "endOffset": 9288, "message": { "lineNumber": 232, - "begin": 8823, - "headersEnd": 9251, + "beginOffset": 8823, + "headersEndOffset": 9251, + "endOffset": 9288, "body": { "mimeType": "text/plain", "lineNumber": 232, - "begin": 8823, - "headersEnd": 9251, - "end": 9288, + "beginOffset": 8823, + "headersEndOffset": 9251, + "endOffset": 9288, "octets": 37, "lines": 2 }, - "end": 9288, "octets": 37 }, - "end": 9288, "octets": 465, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 247, - "begin": 9316, - "headersEnd": 9443, - "end": 9901, + "beginOffset": 9316, + "headersEndOffset": 9443, + "endOffset": 9901, "octets": 458, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 259, - "begin": 9929, - "headersEnd": 10056, - "end": 10542, + "beginOffset": 9929, + "headersEndOffset": 10056, + "endOffset": 10542, "octets": 486, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 271, - "begin": 10570, - "headersEnd": 10701, - "end": 11228, + "beginOffset": 10570, + "headersEndOffset": 10701, + "endOffset": 11228, "octets": 527, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 284, - "begin": 11256, - "headersEnd": 11385, - "end": 11883, + "beginOffset": 11256, + "headersEndOffset": 11385, + "endOffset": 11883, "octets": 498, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 296, - "begin": 11911, - "headersEnd": 12059, + "beginOffset": 11911, + "headersEndOffset": 12059, + "endOffset": 12524, "message": { "lineNumber": 301, - "begin": 12059, - "headersEnd": 12487, + "beginOffset": 12059, + "headersEndOffset": 12487, + "endOffset": 12524, "body": { "mimeType": "text/plain", "lineNumber": 301, - "begin": 12059, - "headersEnd": 12487, - "end": 12524, + "beginOffset": 12059, + "headersEndOffset": 12487, + "endOffset": 12524, "octets": 37, "lines": 1 }, - "end": 12524, "octets": 37 }, - "end": 12524, "octets": 465, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 315, - "begin": 12552, - "headersEnd": 12727, + "beginOffset": 12552, + "headersEndOffset": 12727, + "endOffset": 14228, "message": { "lineNumber": 320, - "begin": 12727, - "headersEnd": 13300, + "beginOffset": 12727, + "headersEndOffset": 13300, + "endOffset": 14228, "body": { "mimeType": "message/rfc822", "lineNumber": 320, - "begin": 12727, - "headersEnd": 13300, + "beginOffset": 12727, + "headersEndOffset": 13300, + "endOffset": 14228, "message": { "lineNumber": 335, - "begin": 13300, - "headersEnd": 13814, + "beginOffset": 13300, + "headersEndOffset": 13814, + "endOffset": 14228, "body": { "mimeType": "message/rfc822", "lineNumber": 335, - "begin": 13300, - "headersEnd": 13814, + "beginOffset": 13300, + "headersEndOffset": 13814, + "endOffset": 14228, "message": { "lineNumber": 349, - "begin": 13814, - "headersEnd": 14223, + "beginOffset": 13814, + "headersEndOffset": 14223, + "endOffset": 14228, "body": { "mimeType": "text/plain", "lineNumber": 349, - "begin": 13814, - "headersEnd": 14223, - "end": 14228, + "beginOffset": 13814, + "headersEndOffset": 14223, + "endOffset": 14228, "octets": 5, "lines": 1 }, - "end": 14228, "octets": 5 }, - "end": 14228, "octets": 414, "lines": 12 }, - "end": 14228, "octets": 414 }, - "end": 14228, "octets": 928, "lines": 26 }, - "end": 14228, "octets": 928 }, - "end": 14228, "octets": 1501, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 363, - "begin": 14256, - "headersEnd": 14313, - "end": 14365, + "beginOffset": 14256, + "headersEndOffset": 14313, + "endOffset": 14365, "octets": 52, "lines": 1 } ], - "end": 14394, "octets": 5792, "lines": 145 }, - "end": 14394, "octets": 5792 }, { - "mboxMarkerBegin": 14395, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 14395, "lineNumber": 370, - "begin": 14427, - "headersEnd": 15930, + "beginOffset": 14427, + "headersEndOffset": 15930, + "endOffset": 22485, "body": { "mimeType": "multipart/related", "lineNumber": 370, - "begin": 14427, - "headersEnd": 15930, + "beginOffset": 14427, + "headersEndOffset": 15930, + "endOffset": 22485, "children": [ { "mimeType": "text/html", "lineNumber": 398, - "begin": 15975, - "headersEnd": 16066, - "end": 21265, + "beginOffset": 15975, + "headersEndOffset": 16066, + "endOffset": 21265, "octets": 5199, "lines": 111 }, { "mimeType": "image/gif", "lineNumber": 514, - "begin": 21310, - "headersEnd": 21509, - "end": 22438, + "beginOffset": 21310, + "headersEndOffset": 21509, + "endOffset": 22438, "octets": 929, "lines": 13 } ], - "end": 22485, "octets": 6555, "lines": 139 }, - "end": 22485, "octets": 6555 }, { - "mboxMarkerBegin": 22486, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 22486, "lineNumber": 537, - "begin": 22518, - "headersEnd": 23752, + "beginOffset": 22518, + "headersEndOffset": 23752, + "endOffset": 771037, "body": { "mimeType": "multipart/mixed", "lineNumber": 537, - "begin": 22518, - "headersEnd": 23752, + "beginOffset": 22518, + "headersEndOffset": 23752, + "endOffset": 771037, "children": [ { "mimeType": "text/plain", "lineNumber": 562, - "begin": 23836, - "headersEnd": 23912, - "end": 23939, + "beginOffset": 23836, + "headersEndOffset": 23912, + "endOffset": 23939, "octets": 27, "lines": 3 }, { "mimeType": "message/rfc822", "lineNumber": 570, - "begin": 23978, - "headersEnd": 24068, + "beginOffset": 23978, + "headersEndOffset": 24068, + "endOffset": 770996, "message": { "lineNumber": 574, - "begin": 24068, - "headersEnd": 24889, + "beginOffset": 24068, + "headersEndOffset": 24889, + "endOffset": 770996, "body": { "mimeType": "multipart/alternative", "lineNumber": 574, - "begin": 24068, - "headersEnd": 24889, + "beginOffset": 24068, + "headersEndOffset": 24889, + "endOffset": 770996, "children": [ { "mimeType": "text/plain", "lineNumber": 592, - "begin": 24929, - "headersEnd": 25005, - "end": 25632, + "beginOffset": 24929, + "headersEndOffset": 25005, + "endOffset": 25632, "octets": 627, "lines": 16 }, { "mimeType": "multipart/related", "lineNumber": 613, - "begin": 25672, - "headersEnd": 25754, + "beginOffset": 25672, + "headersEndOffset": 25754, + "endOffset": 770952, "children": [ { "mimeType": "text/html", "lineNumber": 617, - "begin": 25794, - "headersEnd": 25869, - "end": 26719, + "beginOffset": 25794, + "headersEndOffset": 25869, + "endOffset": 26719, "octets": 850, "lines": 18 }, { "mimeType": "image/tiff", "lineNumber": 640, - "begin": 26759, - "headersEnd": 26943, - "end": 770910, + "beginOffset": 26759, + "headersEndOffset": 26943, + "endOffset": 770910, "octets": 743967, "lines": 10192 } ], - "end": 770952, "octets": 745198, "lines": 10223 } ], - "end": 770996, "octets": 746107, "lines": 10252 }, - "end": 770996, "octets": 746107 }, - "end": 770996, "octets": 746928, "lines": 10268 } ], - "end": 771037, "octets": 747285, "lines": 10285 }, - "end": 771037, "octets": 747285 }, { - "mboxMarkerBegin": 771038, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 771038, "lineNumber": 10846, - "begin": 771070, - "headersEnd": 772334, + "beginOffset": 771070, + "headersEndOffset": 772334, + "endOffset": 818962, "body": { "mimeType": "multipart/related", "lineNumber": 10846, - "begin": 771070, - "headersEnd": 772334, + "beginOffset": 771070, + "headersEndOffset": 772334, + "endOffset": 818962, "children": [ { "mimeType": "text/html", "lineNumber": 10870, - "begin": 772379, - "headersEnd": 772470, - "end": 774852, + "beginOffset": 772379, + "headersEndOffset": 772470, + "endOffset": 774852, "octets": 2382, "lines": 50 }, { "mimeType": "image/gif", "lineNumber": 10925, - "begin": 774897, - "headersEnd": 775056, - "end": 781079, + "beginOffset": 774897, + "headersEndOffset": 775056, + "endOffset": 781079, "octets": 6023, "lines": 79 }, { "mimeType": "image/gif", "lineNumber": 11011, - "begin": 781124, - "headersEnd": 781282, - "end": 793355, + "beginOffset": 781124, + "headersEndOffset": 781282, + "endOffset": 793355, "octets": 12073, "lines": 157 }, { "mimeType": "image/gif", "lineNumber": 11175, - "begin": 793400, - "headersEnd": 793560, - "end": 815274, + "beginOffset": 793400, + "headersEndOffset": 793560, + "endOffset": 815274, "octets": 21714, "lines": 282 }, { "mimeType": "image/gif", "lineNumber": 11464, - "begin": 815319, - "headersEnd": 815522, - "end": 818915, + "beginOffset": 815319, + "headersEndOffset": 815522, + "endOffset": 818915, "octets": 3393, "lines": 45 } ], - "end": 818962, "octets": 46628, "lines": 649 }, - "end": 818962, "octets": 46628 }, { - "mboxMarkerBegin": 818963, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 818963, "lineNumber": 11519, - "begin": 818971, - "headersEnd": 819882, + "beginOffset": 818971, + "headersEndOffset": 819882, + "endOffset": 822461, "body": { "mimeType": "multipart/mixed", "lineNumber": 11519, - "begin": 818971, - "headersEnd": 819882, + "beginOffset": 818971, + "headersEndOffset": 819882, + "endOffset": 822461, "children": [ { "mimeType": "text/richtext", "lineNumber": 11542, - "begin": 819891, - "headersEnd": 819920, - "end": 822450, + "beginOffset": 819891, + "headersEndOffset": 819920, + "endOffset": 822450, "octets": 2530, "lines": 96 } ], - "end": 822461, "octets": 2579, "lines": 102 }, - "end": 822461, "octets": 2579 }, { - "mboxMarkerBegin": 822462, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 822462, "lineNumber": 11644, - "begin": 822494, - "headersEnd": 823647, + "beginOffset": 822494, + "headersEndOffset": 823647, + "endOffset": 825431, "body": { "mimeType": "multipart/signed", "lineNumber": 11644, - "begin": 822494, - "headersEnd": 823647, + "beginOffset": 822494, + "headersEndOffset": 823647, + "endOffset": 825431, "children": [ { "mimeType": "text/plain", "lineNumber": 11663, - "begin": 823664, - "headersEnd": 823665, - "end": 824566, + "beginOffset": 823664, + "headersEndOffset": 823665, + "endOffset": 824566, "octets": 901, "lines": 20 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 11686, - "begin": 824584, - "headersEnd": 824663, - "end": 825411, + "beginOffset": 824584, + "headersEndOffset": 824663, + "endOffset": 825411, "octets": 748, "lines": 12 } ], - "end": 825431, "octets": 1784, "lines": 41 }, - "end": 825431, "octets": 1784 }, { - "mboxMarkerBegin": 825432, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 825432, "lineNumber": 11705, - "begin": 825464, - "headersEnd": 826606, + "beginOffset": 825464, + "headersEndOffset": 826606, + "endOffset": 830015, "body": { "mimeType": "multipart/mixed", "lineNumber": 11705, - "begin": 825464, - "headersEnd": 826606, + "beginOffset": 825464, + "headersEndOffset": 826606, + "endOffset": 830015, "children": [ { "mimeType": "text/plain", "lineNumber": 11728, - "begin": 826786, - "headersEnd": 826864, - "end": 827605, + "beginOffset": 826786, + "headersEndOffset": 826864, + "endOffset": 827605, "octets": 741, "lines": 14 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 11746, - "begin": 827613, - "headersEnd": 827791, - "end": 830006, + "beginOffset": 827613, + "headersEndOffset": 827791, + "endOffset": 830006, "octets": 2215, "lines": 31 } ], - "end": 830015, "octets": 3409, "lines": 60 }, - "end": 830015, "octets": 3409 }, { - "mboxMarkerBegin": 830016, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 830016, "lineNumber": 11785, - "begin": 830048, - "headersEnd": 831185, + "beginOffset": 830048, + "headersEndOffset": 831185, + "endOffset": 837039, "body": { "mimeType": "multipart/mixed", "lineNumber": 11785, - "begin": 830048, - "headersEnd": 831185, + "beginOffset": 830048, + "headersEndOffset": 831185, + "endOffset": 837039, "children": [ { "mimeType": "text/plain", "lineNumber": 11812, - "begin": 831379, - "headersEnd": 831457, - "end": 834269, + "beginOffset": 831379, + "headersEndOffset": 831457, + "endOffset": 834269, "octets": 2812, "lines": 47 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 11863, - "begin": 834291, - "headersEnd": 834469, - "end": 837016, + "beginOffset": 834291, + "headersEndOffset": 834469, + "endOffset": 837016, "octets": 2547, "lines": 35 } ], - "end": 837039, "octets": 5854, "lines": 97 }, - "end": 837039, "octets": 5854 }, { - "mboxMarkerBegin": 837040, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 837040, "lineNumber": 11906, - "begin": 837072, - "headersEnd": 837972, + "beginOffset": 837072, + "headersEndOffset": 837972, + "endOffset": 853721, "body": { "mimeType": "multipart/signed", "lineNumber": 11906, - "begin": 837072, - "headersEnd": 837972, + "beginOffset": 837072, + "headersEndOffset": 837972, + "endOffset": 853721, "children": [ { "mimeType": "image/jpeg", "lineNumber": 11927, - "begin": 838045, - "headersEnd": 838179, - "end": 848901, + "beginOffset": 838045, + "headersEndOffset": 838179, + "endOffset": 848901, "octets": 10722, "lines": 147 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12079, - "begin": 848929, - "headersEnd": 849080, - "end": 853691, + "beginOffset": 848929, + "headersEndOffset": 849080, + "endOffset": 853691, "octets": 4611, "lines": 64 } ], - "end": 853721, "octets": 15749, "lines": 224 }, - "end": 853721, "octets": 15749 }, { - "mboxMarkerBegin": 853722, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 853722, "lineNumber": 12150, - "begin": 853754, - "headersEnd": 855145, + "beginOffset": 853754, + "headersEndOffset": 855145, + "endOffset": 856576, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12150, - "begin": 853754, - "headersEnd": 855145, - "end": 856576, + "beginOffset": 853754, + "headersEndOffset": 855145, + "endOffset": 856576, "octets": 1431, "lines": 20 }, - "end": 856576, "octets": 1431 }, { - "mboxMarkerBegin": 856577, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 856577, "lineNumber": 12195, - "begin": 856609, - "headersEnd": 857962, + "beginOffset": 856609, + "headersEndOffset": 857962, + "endOffset": 862354, "body": { "mimeType": "multipart/signed", "lineNumber": 12195, - "begin": 856609, - "headersEnd": 857962, + "beginOffset": 856609, + "headersEndOffset": 857962, + "endOffset": 862354, "children": [ { "mimeType": "text/plain", "lineNumber": 12221, - "begin": 858007, - "headersEnd": 858071, - "end": 858178, + "beginOffset": 858007, + "headersEndOffset": 858071, + "endOffset": 858178, "octets": 107, "lines": 4 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12229, - "begin": 858223, - "headersEnd": 858374, - "end": 862307, + "beginOffset": 858223, + "headersEndOffset": 858374, + "endOffset": 862307, "octets": 3933, "lines": 54 } ], - "end": 862354, "octets": 4392, "lines": 69 }, - "end": 862354, "octets": 4392 }, { - "mboxMarkerBegin": 862355, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 862355, "lineNumber": 12290, - "begin": 862387, - "headersEnd": 863597, + "beginOffset": 862387, + "headersEndOffset": 863597, + "endOffset": 867092, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12290, - "begin": 862387, - "headersEnd": 863597, - "end": 867092, + "beginOffset": 862387, + "headersEndOffset": 863597, + "endOffset": 867092, "octets": 3495, "lines": 55 }, - "end": 867092, "octets": 3495 }, { - "mboxMarkerBegin": 867093, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 867093, "lineNumber": 12368, - "begin": 867125, - "headersEnd": 868202, + "beginOffset": 867125, + "headersEndOffset": 868202, + "endOffset": 868863, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12368, - "begin": 867125, - "headersEnd": 868202, - "end": 868863, + "beginOffset": 867125, + "headersEndOffset": 868202, + "endOffset": 868863, "octets": 661, "lines": 10 }, - "end": 868863, "octets": 661 }, { - "mboxMarkerBegin": 868864, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 868864, "lineNumber": 12400, - "begin": 868896, - "headersEnd": 869679, + "beginOffset": 868896, + "headersEndOffset": 869679, + "endOffset": 872491, "body": { "mimeType": "message/rfc822", "lineNumber": 12400, - "begin": 868896, - "headersEnd": 869679, + "beginOffset": 868896, + "headersEndOffset": 869679, + "endOffset": 872491, "message": { "lineNumber": 12419, - "begin": 869679, - "headersEnd": 871059, + "beginOffset": 869679, + "headersEndOffset": 871059, + "endOffset": 872491, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12419, - "begin": 869679, - "headersEnd": 871059, - "end": 872491, + "beginOffset": 869679, + "headersEndOffset": 871059, + "endOffset": 872491, "octets": 1432, "lines": 20 }, - "end": 872491, "octets": 1432 }, - "end": 872491, "octets": 2812, "lines": 43 }, - "end": 872491, "octets": 2812 }, { - "mboxMarkerBegin": 872492, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 872492, "lineNumber": 12464, - "begin": 872524, - "headersEnd": 873234, + "beginOffset": 872524, + "headersEndOffset": 873234, + "endOffset": 876422, "body": { "mimeType": "multipart/mixed", "lineNumber": 12464, - "begin": 872524, - "headersEnd": 873234, + "beginOffset": 872524, + "headersEndOffset": 873234, + "endOffset": 876422, "children": [ { "mimeType": "text/plain", "lineNumber": 12484, - "begin": 873307, - "headersEnd": 873383, - "end": 873398, + "beginOffset": 873307, + "headersEndOffset": 873383, + "endOffset": 873398, "octets": 15, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 12490, - "begin": 873426, - "headersEnd": 873580, + "beginOffset": 873426, + "headersEndOffset": 873580, + "endOffset": 876392, "message": { "lineNumber": 12494, - "begin": 873580, - "headersEnd": 874960, + "beginOffset": 873580, + "headersEndOffset": 874960, + "endOffset": 876392, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12494, - "begin": 873580, - "headersEnd": 874960, - "end": 876392, + "beginOffset": 873580, + "headersEndOffset": 874960, + "endOffset": 876392, "octets": 1432, "lines": 20 }, - "end": 876392, "octets": 1432 }, - "end": 876392, "octets": 2812, "lines": 43 } ], - "end": 876422, "octets": 3188, "lines": 58 }, - "end": 876422, "octets": 3188 }, { - "mboxMarkerBegin": 876423, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 876423, "lineNumber": 12541, - "begin": 876455, - "headersEnd": 877120, + "beginOffset": 876455, + "headersEndOffset": 877120, + "endOffset": 883131, "body": { "mimeType": "multipart/signed", "lineNumber": 12541, - "begin": 876455, - "headersEnd": 877120, + "beginOffset": 876455, + "headersEndOffset": 877120, + "endOffset": 883131, "children": [ { "mimeType": "text/plain", "lineNumber": 12560, - "begin": 877221, - "headersEnd": 877297, - "end": 877338, + "beginOffset": 877221, + "headersEndOffset": 877297, + "endOffset": 877338, "octets": 41, "lines": 2 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12566, - "begin": 877380, - "headersEnd": 877531, - "end": 883087, + "beginOffset": 877380, + "headersEndOffset": 877531, + "endOffset": 883087, "octets": 5556, "lines": 77 } ], - "end": 883131, "octets": 6011, "lines": 91 }, - "end": 883131, "octets": 6011 }, { - "mboxMarkerBegin": 883132, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 883132, "lineNumber": 12650, - "begin": 883164, - "headersEnd": 884226, + "beginOffset": 883164, + "headersEndOffset": 884226, + "endOffset": 894462, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12650, - "begin": 883164, - "headersEnd": 884226, - "end": 894462, + "beginOffset": 883164, + "headersEndOffset": 884226, + "endOffset": 894462, "octets": 10236, "lines": 141 }, - "end": 894462, "octets": 10236 }, { - "mboxMarkerBegin": 894463, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 894463, "lineNumber": 12813, - "begin": 894495, - "headersEnd": 895871, + "beginOffset": 894495, + "headersEndOffset": 895871, + "endOffset": 898684, "body": { "mimeType": "multipart/signed", "lineNumber": 12813, - "begin": 894495, - "headersEnd": 895871, + "beginOffset": 894495, + "headersEndOffset": 895871, + "endOffset": 898684, "children": [ { "mimeType": "text/plain", "lineNumber": 12840, - "begin": 895972, - "headersEnd": 896048, - "end": 896659, + "beginOffset": 895972, + "headersEndOffset": 896048, + "endOffset": 896659, "octets": 611, "lines": 17 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 12861, - "begin": 896701, - "headersEnd": 896852, - "end": 898640, + "beginOffset": 896701, + "headersEndOffset": 896852, + "endOffset": 898640, "octets": 1788, "lines": 25 } ], - "end": 898684, "octets": 2813, "lines": 54 }, - "end": 898684, "octets": 2813 }, { - "mboxMarkerBegin": 898685, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 898685, "lineNumber": 12893, - "begin": 898717, - "headersEnd": 899265, + "beginOffset": 898717, + "headersEndOffset": 899265, + "endOffset": 899788, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12893, - "begin": 898717, - "headersEnd": 899265, - "end": 899788, + "beginOffset": 898717, + "headersEndOffset": 899265, + "endOffset": 899788, "octets": 523, "lines": 8 }, - "end": 899788, "octets": 523 }, { - "mboxMarkerBegin": 899789, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 899789, "lineNumber": 12917, - "begin": 899821, - "headersEnd": 901036, + "beginOffset": 899821, + "headersEndOffset": 901036, + "endOffset": 903918, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 12917, - "begin": 899821, - "headersEnd": 901036, - "end": 903918, + "beginOffset": 899821, + "headersEndOffset": 901036, + "endOffset": 903918, "octets": 2882, "lines": 38 }, - "end": 903918, "octets": 2882 }, { - "mboxMarkerBegin": 903919, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 903919, "lineNumber": 12977, - "begin": 903951, - "headersEnd": 905109, + "beginOffset": 903951, + "headersEndOffset": 905109, + "endOffset": 907231, "body": { "mimeType": "Application/x-pkcs7-mime", "lineNumber": 12977, - "begin": 903951, - "headersEnd": 905109, - "end": 907231, + "beginOffset": 903951, + "headersEndOffset": 905109, + "endOffset": 907231, "octets": 2122, "lines": 30 }, - "end": 907231, "octets": 2122 }, { - "mboxMarkerBegin": 907232, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 907232, "lineNumber": 13030, - "begin": 907264, - "headersEnd": 908342, + "beginOffset": 907264, + "headersEndOffset": 908342, + "endOffset": 911299, "body": { "mimeType": "multipart/signed", "lineNumber": 13030, - "begin": 907264, - "headersEnd": 908342, + "beginOffset": 907264, + "headersEndOffset": 908342, + "endOffset": 911299, "children": [ { "mimeType": "text/plain", "lineNumber": 13053, - "begin": 908375, - "headersEnd": 908439, - "end": 908439, + "beginOffset": 908375, + "headersEndOffset": 908439, + "endOffset": 908439, "octets": 0, "lines": 0 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13058, - "begin": 908472, - "headersEnd": 908551, - "end": 911264, + "beginOffset": 908472, + "headersEndOffset": 908551, + "endOffset": 911264, "octets": 2713, "lines": 42 } ], - "end": 911299, "octets": 2957, "lines": 53 }, - "end": 911299, "octets": 2957 }, { - "mboxMarkerBegin": 911300, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 911300, "lineNumber": 13106, - "begin": 911332, - "headersEnd": 912369, + "beginOffset": 911332, + "headersEndOffset": 912369, + "endOffset": 915249, "body": { "mimeType": "multipart/mixed", "lineNumber": 13106, - "begin": 911332, - "headersEnd": 912369, + "beginOffset": 911332, + "headersEndOffset": 912369, + "endOffset": 915249, "children": [ { "mimeType": "text/plain", "lineNumber": 13127, - "begin": 912410, - "headersEnd": 912488, - "end": 912941, + "beginOffset": 912410, + "headersEndOffset": 912488, + "endOffset": 912941, "octets": 453, "lines": 14 }, { "mimeType": "text/html", "lineNumber": 13145, - "begin": 912982, - "headersEnd": 913057, - "end": 913868, + "beginOffset": 912982, + "headersEndOffset": 913057, + "endOffset": 913868, "octets": 811, "lines": 27 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13176, - "begin": 913909, - "headersEnd": 914006, - "end": 915206, + "beginOffset": 913909, + "headersEndOffset": 914006, + "endOffset": 915206, "octets": 1200, "lines": 16 } ], - "end": 915249, "octets": 2880, "lines": 72 }, - "end": 915249, "octets": 2880 }, { - "mboxMarkerBegin": 915250, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 915250, "lineNumber": 13199, - "begin": 915282, - "headersEnd": 916357, + "beginOffset": 915282, + "headersEndOffset": 916357, + "endOffset": 920885, "body": { "mimeType": "multipart/signed", "lineNumber": 13199, - "begin": 915282, - "headersEnd": 916357, + "beginOffset": 915282, + "headersEndOffset": 916357, + "endOffset": 920885, "children": [ { "mimeType": "text/plain", "lineNumber": 13222, - "begin": 916400, - "headersEnd": 916470, - "end": 916622, + "beginOffset": 916400, + "headersEndOffset": 916470, + "endOffset": 916622, "octets": 152, "lines": 7 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13234, - "begin": 916665, - "headersEnd": 916744, - "end": 920840, + "beginOffset": 916665, + "headersEndOffset": 916744, + "endOffset": 920840, "octets": 4096, "lines": 57 } ], - "end": 920885, "octets": 4528, "lines": 75 }, - "end": 920885, "octets": 4528 }, { - "mboxMarkerBegin": 920886, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 920886, "lineNumber": 13297, - "begin": 920918, - "headersEnd": 922020, + "beginOffset": 920918, + "headersEndOffset": 922020, + "endOffset": 926071, "body": { "mimeType": "multipart/signed", "lineNumber": 13297, - "begin": 920918, - "headersEnd": 922020, + "beginOffset": 920918, + "headersEndOffset": 922020, + "endOffset": 926071, "children": [ { "mimeType": "text/plain", "lineNumber": 13320, - "begin": 922054, - "headersEnd": 922132, - "end": 922206, + "beginOffset": 922054, + "headersEndOffset": 922132, + "endOffset": 922206, "octets": 74, "lines": 5 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 13329, - "begin": 922240, - "headersEnd": 922319, - "end": 926036, + "beginOffset": 922240, + "headersEndOffset": 922319, + "endOffset": 926036, "octets": 3717, "lines": 58 } ], - "end": 926071, "octets": 4051, "lines": 73 }, - "end": 926071, "octets": 4051 }, { - "mboxMarkerBegin": 926072, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 926072, "lineNumber": 13392, - "begin": 926104, - "headersEnd": 927232, + "beginOffset": 926104, + "headersEndOffset": 927232, + "endOffset": 928495, "body": { "mimeType": "multipart/report", "lineNumber": 13392, - "begin": 926104, - "headersEnd": 927232, + "beginOffset": 926104, + "headersEndOffset": 927232, + "endOffset": 928495, "children": [ { "mimeType": "message/delivery-status", "lineNumber": 13414, - "begin": 927369, - "headersEnd": 927408, - "end": 927596, + "beginOffset": 927369, + "headersEndOffset": 927408, + "endOffset": 927596, "octets": 188, "lines": 6 }, { "mimeType": "message/rfc822", "lineNumber": 13424, - "begin": 927621, - "headersEnd": 927651, + "beginOffset": 927621, + "headersEndOffset": 927651, + "endOffset": 928468, "message": { "lineNumber": 13426, - "begin": 927651, - "headersEnd": 928457, + "beginOffset": 927651, + "headersEndOffset": 928457, + "endOffset": 928468, "body": { "mimeType": "text/plain", "lineNumber": 13426, - "begin": 927651, - "headersEnd": 928457, - "end": 928468, + "beginOffset": 927651, + "headersEndOffset": 928457, + "endOffset": 928468, "octets": 11, "lines": 1 }, - "end": 928468, "octets": 11 }, - "end": 928468, "octets": 817, "lines": 16 } ], - "end": 928495, "octets": 1263, "lines": 34 }, - "end": 928495, "octets": 1263 }, { - "mboxMarkerBegin": 928496, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 928496, "lineNumber": 13445, - "begin": 928528, - "headersEnd": 930393, + "beginOffset": 928528, + "headersEndOffset": 930393, + "endOffset": 935272, "body": { "mimeType": "multipart/mixed", "lineNumber": 13445, - "begin": 928528, - "headersEnd": 930393, + "beginOffset": 928528, + "headersEndOffset": 930393, + "endOffset": 935272, "children": [ { "mimeType": "text/plain", "lineNumber": 13477, - "begin": 930437, - "headersEnd": 930515, - "end": 931378, + "beginOffset": 930437, + "headersEndOffset": 930515, + "endOffset": 931378, "octets": 863, "lines": 18 }, { "mimeType": "application/vcard", "lineNumber": 13500, - "begin": 931423, - "headersEnd": 931584, - "end": 935225, + "beginOffset": 931423, + "headersEndOffset": 931584, + "endOffset": 935225, "octets": 3641, "lines": 61 } ], - "end": 935272, "octets": 4879, "lines": 92 }, - "end": 935272, "octets": 4879 } ] \ No newline at end of file diff --git a/UnitTests/TestData/mbox/jwz.unix-offsets.json b/UnitTests/TestData/mbox/jwz.unix-offsets.json index bec56d175a..b560f4418c 100644 --- a/UnitTests/TestData/mbox/jwz.unix-offsets.json +++ b/UnitTests/TestData/mbox/jwz.unix-offsets.json @@ -1,9719 +1,9567 @@ [ { - "mboxMarkerBegin": 0, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 0, "lineNumber": 2, - "begin": 8, - "headersEnd": 517, + "beginOffset": 8, + "headersEndOffset": 517, + "endOffset": 177075, "body": { "mimeType": "multipart/mixed", "lineNumber": 2, - "begin": 8, - "headersEnd": 517, + "beginOffset": 8, + "headersEndOffset": 517, + "endOffset": 177075, "children": [ { "mimeType": "multipart/parallel", "lineNumber": 16, - "begin": 534, - "headersEnd": 630, + "beginOffset": 534, + "headersEndOffset": 630, + "endOffset": 32572, "children": [ { "mimeType": "text/plain", "lineNumber": 20, - "begin": 661, - "headersEnd": 662, - "end": 1377, + "beginOffset": 661, + "headersEndOffset": 662, + "endOffset": 1377, "octets": 715, "lines": 17 }, { "mimeType": "audio/basic", "lineNumber": 39, - "begin": 1409, - "headersEnd": 1493, - "end": 32539, + "beginOffset": 1409, + "headersEndOffset": 1493, + "endOffset": 32539, "octets": 31046, "lines": 426 } ], - "end": 32572, "octets": 31942, "lines": 452 }, { "mimeType": "multipart/mixed", "lineNumber": 472, - "begin": 32590, - "headersEnd": 32683, + "beginOffset": 32590, + "headersEndOffset": 32683, + "endOffset": 129778, "children": [ { "mimeType": "image/gif", "lineNumber": 476, - "begin": 32714, - "headersEnd": 32796, - "end": 58444, + "beginOffset": 32714, + "headersEndOffset": 32796, + "endOffset": 58444, "octets": 25648, "lines": 352 }, { "mimeType": "image/gif", "lineNumber": 834, - "begin": 58476, - "headersEnd": 58558, - "end": 76971, + "beginOffset": 58476, + "headersEndOffset": 58558, + "endOffset": 76971, "octets": 18413, "lines": 253 }, { "mimeType": "application/octet-stream", "lineNumber": 1093, - "begin": 77003, - "headersEnd": 77117, - "end": 120806, + "beginOffset": 77003, + "headersEndOffset": 77117, + "endOffset": 120806, "octets": 43689, "lines": 2437 }, { "mimeType": "application/atomicmail", "lineNumber": 3534, - "begin": 120838, - "headersEnd": 120899, - "end": 129745, + "beginOffset": 120838, + "headersEndOffset": 120899, + "endOffset": 129745, "octets": 8846, "lines": 357 } ], - "end": 129778, "octets": 97095, "lines": 3421 }, { "mimeType": "audio/basic", "lineNumber": 3897, - "begin": 129796, - "headersEnd": 129880, - "end": 177055, + "beginOffset": 129796, + "headersEndOffset": 129880, + "endOffset": 177055, "octets": 47175, "lines": 647 } ], - "end": 177075, "octets": 176558, "lines": 4535 }, - "end": 177075, "octets": 176558 }, { - "mboxMarkerBegin": 177076, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 177076, "lineNumber": 4552, - "begin": 177084, - "headersEnd": 177633, + "beginOffset": 177084, + "headersEndOffset": 177633, + "endOffset": 312903, "body": { "mimeType": "audio/basic", "lineNumber": 4552, - "begin": 177084, - "headersEnd": 177633, - "end": 312903, + "beginOffset": 177084, + "headersEndOffset": 177633, + "endOffset": 312903, "octets": 135270, "lines": 1854 }, - "end": 312903, "octets": 135270 }, { - "mboxMarkerBegin": 312904, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 312904, "lineNumber": 6422, - "begin": 312912, - "headersEnd": 313291, + "beginOffset": 312912, + "headersEndOffset": 313291, + "endOffset": 313492, "body": { "mimeType": "text/plain", "lineNumber": 6422, - "begin": 312912, - "headersEnd": 313291, - "end": 313492, + "beginOffset": 312912, + "headersEndOffset": 313291, + "endOffset": 313492, "octets": 201, "lines": 4 }, - "end": 313492, "octets": 201 }, { - "mboxMarkerBegin": 313493, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 313493, "lineNumber": 6435, - "begin": 313501, - "headersEnd": 314147, + "beginOffset": 313501, + "headersEndOffset": 314147, + "endOffset": 319811, "body": { "mimeType": "multipart/alternative", "lineNumber": 6435, - "begin": 313501, - "headersEnd": 314147, + "beginOffset": 313501, + "headersEndOffset": 314147, + "endOffset": 319811, "children": [ { "mimeType": "text/plain", "lineNumber": 6454, - "begin": 314342, - "headersEnd": 314386, - "end": 314619, + "beginOffset": 314342, + "headersEndOffset": 314386, + "endOffset": 314619, "octets": 233, "lines": 6 }, { "mimeType": "multipart/mixed", "lineNumber": 6464, - "begin": 314660, - "headersEnd": 314745, + "beginOffset": 314660, + "headersEndOffset": 314745, + "endOffset": 319769, "children": [ { "mimeType": "text/richtext", "lineNumber": 6468, - "begin": 314787, - "headersEnd": 314878, - "end": 315024, + "beginOffset": 314787, + "headersEndOffset": 314878, + "endOffset": 315024, "octets": 146, "lines": 3 }, { "mimeType": "image/gif", "lineNumber": 6476, - "begin": 315067, - "headersEnd": 315177, - "end": 319545, + "beginOffset": 315067, + "headersEndOffset": 315177, + "endOffset": 319545, "octets": 4368, "lines": 64 }, { "mimeType": "text/richtext", "lineNumber": 6546, - "begin": 319588, - "headersEnd": 319679, - "end": 319724, + "beginOffset": 319588, + "headersEndOffset": 319679, + "endOffset": 319724, "octets": 45, "lines": 3 } ], - "end": 319769, "octets": 5024, "lines": 87 } ], - "end": 319811, "octets": 5664, "lines": 106 }, - "end": 319811, "octets": 5664 }, { - "mboxMarkerBegin": 319812, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 319812, "lineNumber": 6557, - "begin": 319820, - "headersEnd": 320568, + "beginOffset": 319820, + "headersEndOffset": 320568, + "endOffset": 343841, "body": { "mimeType": "multipart/mixed", "lineNumber": 6557, - "begin": 319820, - "headersEnd": 320568, + "beginOffset": 319820, + "headersEndOffset": 320568, + "endOffset": 343841, "children": [ { "mimeType": "text/richtext", "lineNumber": 6579, - "begin": 320825, - "headersEnd": 320898, - "end": 321322, + "beginOffset": 320825, + "headersEndOffset": 320898, + "endOffset": 321322, "octets": 424, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 6596, - "begin": 321385, - "headersEnd": 321415, + "beginOffset": 321385, + "headersEndOffset": 321415, + "endOffset": 343533, "message": { "lineNumber": 6598, - "begin": 321415, - "headersEnd": 322251, + "beginOffset": 321415, + "headersEndOffset": 322251, + "endOffset": 343533, "body": { "mimeType": "multipart/mixed", "lineNumber": 6598, - "begin": 321415, - "headersEnd": 322251, + "beginOffset": 321415, + "headersEndOffset": 322251, + "endOffset": 343533, "children": [ { "mimeType": "text/plain", "lineNumber": 6623, - "begin": 322557, - "headersEnd": 322651, - "end": 322755, + "beginOffset": 322557, + "headersEndOffset": 322651, + "endOffset": 322755, "octets": 104, "lines": 6 }, { "mimeType": "audio/basic", "lineNumber": 6634, - "begin": 322786, - "headersEnd": 322875, - "end": 343502, + "beginOffset": 322786, + "headersEndOffset": 322875, + "endOffset": 343502, "octets": 20627, "lines": 283 }, { "mimeType": "text/plain", "lineNumber": 6922, - "begin": 343533, - "headersEnd": 343533, - "end": 343533, + "beginOffset": 343533, + "headersEndOffset": 343533, + "endOffset": 343533, "octets": 0, "lines": 0 } ], - "end": 343533, "octets": 21282, "lines": 308 }, - "end": 343533, "octets": 21282 }, - "end": 343533, "octets": 22118, "lines": 324 }, { "mimeType": "text/richtext", "lineNumber": 6924, - "begin": 343596, - "headersEnd": 343669, - "end": 343776, + "beginOffset": 343596, + "headersEndOffset": 343669, + "endOffset": 343776, "octets": 107, "lines": 4 } ], - "end": 343841, "octets": 23273, "lines": 359 }, - "end": 343841, "octets": 23273 }, { - "mboxMarkerBegin": 343842, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 343842, "lineNumber": 6935, - "begin": 343850, - "headersEnd": 344568, + "beginOffset": 343850, + "headersEndOffset": 344568, + "endOffset": 2108724, "body": { "mimeType": "multipart/alternative", "lineNumber": 6935, - "begin": 343850, - "headersEnd": 344568, + "beginOffset": 343850, + "headersEndOffset": 344568, + "endOffset": 2108724, "children": [ { "mimeType": "text/plain", "lineNumber": 6955, - "begin": 344763, - "headersEnd": 344807, - "end": 345567, + "beginOffset": 344763, + "headersEndOffset": 344807, + "endOffset": 345567, "octets": 760, "lines": 18 }, { "mimeType": "multipart/mixed", "lineNumber": 6977, - "begin": 345608, - "headersEnd": 345693, + "beginOffset": 345608, + "headersEndOffset": 345693, + "endOffset": 2108682, "children": [ { "mimeType": "text/richtext", "lineNumber": 6981, - "begin": 345735, - "headersEnd": 345826, - "end": 346051, + "beginOffset": 345735, + "headersEndOffset": 345826, + "endOffset": 346051, "octets": 225, "lines": 4 }, { "mimeType": "image/x-xwd", "lineNumber": 6990, - "begin": 346094, - "headersEnd": 346202, - "end": 1021266, + "beginOffset": 346094, + "headersEndOffset": 346202, + "endOffset": 1021266, "octets": 675064, "lines": 8982 }, { "mimeType": "text/richtext", "lineNumber": 15978, - "begin": 1021309, - "headersEnd": 1021400, - "end": 1021516, + "beginOffset": 1021309, + "headersEndOffset": 1021400, + "endOffset": 1021516, "octets": 116, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 15988, - "begin": 1021559, - "headersEnd": 1021685, - "end": 1702821, + "beginOffset": 1021559, + "headersEndOffset": 1021685, + "endOffset": 1702821, "octets": 681136, "lines": 9060 }, { "mimeType": "text/richtext", "lineNumber": 25054, - "begin": 1702864, - "headersEnd": 1702955, - "end": 1702965, + "beginOffset": 1702864, + "headersEndOffset": 1702955, + "endOffset": 1702965, "octets": 10, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 25061, - "begin": 1703008, - "headersEnd": 1703125, - "end": 1771303, + "beginOffset": 1703008, + "headersEndOffset": 1703125, + "endOffset": 1771303, "octets": 68178, "lines": 934 }, { "mimeType": "text/richtext", "lineNumber": 26001, - "begin": 1771346, - "headersEnd": 1771437, - "end": 1771575, + "beginOffset": 1771346, + "headersEndOffset": 1771437, + "endOffset": 1771575, "octets": 138, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 26011, - "begin": 1771618, - "headersEnd": 1771736, - "end": 2108498, + "beginOffset": 1771618, + "headersEndOffset": 1771736, + "endOffset": 2108498, "octets": 336762, "lines": 4472 }, { "mimeType": "text/richtext", "lineNumber": 30489, - "begin": 2108541, - "headersEnd": 2108632, - "end": 2108637, + "beginOffset": 2108541, + "headersEndOffset": 2108632, + "endOffset": 2108637, "octets": 5, "lines": 1 } ], - "end": 2108682, "octets": 1762989, "lines": 23515 } ], - "end": 2108724, "octets": 1764156, "lines": 23546 }, - "end": 2108724, "octets": 1764156 }, { - "mboxMarkerBegin": 2108725, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2108725, "lineNumber": 30498, - "begin": 2108733, - "headersEnd": 2109749, + "beginOffset": 2108733, + "headersEndOffset": 2109749, + "endOffset": 2110874, "body": { "mimeType": "text/plain", "lineNumber": 30498, - "begin": 2108733, - "headersEnd": 2109749, - "end": 2110874, + "beginOffset": 2108733, + "headersEndOffset": 2109749, + "endOffset": 2110874, "octets": 1125, "lines": 39 }, - "end": 2110874, "octets": 1125 }, { - "mboxMarkerBegin": 2110875, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2110875, "lineNumber": 30560, - "begin": 2110883, - "headersEnd": 2111121, + "beginOffset": 2110883, + "headersEndOffset": 2111121, + "endOffset": 2275728, "body": { "mimeType": "multipart/mixed", "lineNumber": 30560, - "begin": 2110883, - "headersEnd": 2111121, + "beginOffset": 2110883, + "headersEndOffset": 2111121, + "endOffset": 2275728, "children": [ { "mimeType": "text/plain", "lineNumber": 30570, - "begin": 2111136, - "headersEnd": 2111137, - "end": 2111437, + "beginOffset": 2111136, + "headersEndOffset": 2111137, + "endOffset": 2111437, "octets": 300, "lines": 6 }, { "mimeType": "multipart/parallel", "lineNumber": 30578, - "begin": 2111453, - "headersEnd": 2111529, + "beginOffset": 2111453, + "headersEndOffset": 2111529, + "endOffset": 2270919, "children": [ { "mimeType": "image/gif", "lineNumber": 30582, - "begin": 2111545, - "headersEnd": 2111622, - "end": 2114882, + "beginOffset": 2111545, + "headersEndOffset": 2111622, + "endOffset": 2114882, "octets": 3260, "lines": 17 }, { "mimeType": "audio/basic", "lineNumber": 30604, - "begin": 2114899, - "headersEnd": 2115002, - "end": 2270901, + "beginOffset": 2114899, + "headersEndOffset": 2115002, + "endOffset": 2270901, "octets": 155899, "lines": 808 } ], - "end": 2270919, "octets": 159390, "lines": 837 }, { "mimeType": "application/atomicmail", "lineNumber": 31419, - "begin": 2270935, - "headersEnd": 2270991, - "end": 2275711, + "beginOffset": 2270935, + "headersEndOffset": 2270991, + "endOffset": 2275711, "octets": 4720, "lines": 195 } ], - "end": 2275728, "octets": 164607, "lines": 1050 }, - "end": 2275728, "octets": 164607 }, { - "mboxMarkerBegin": 2275729, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2275729, "lineNumber": 31620, - "begin": 2275737, - "headersEnd": 2276689, + "beginOffset": 2275737, + "headersEndOffset": 2276689, + "endOffset": 2619749, "body": { "mimeType": "audio/basic", "lineNumber": 31620, - "begin": 2275737, - "headersEnd": 2276689, - "end": 2619749, + "beginOffset": 2275737, + "headersEndOffset": 2276689, + "endOffset": 2619749, "octets": 343060, "lines": 4456 }, - "end": 2619749, "octets": 343060 }, { - "mboxMarkerBegin": 2619750, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2619750, "lineNumber": 36098, - "begin": 2619758, - "headersEnd": 2619892, + "beginOffset": 2619758, + "headersEndOffset": 2619892, + "endOffset": 2651948, "body": { "mimeType": "multipart/mixed", "lineNumber": 36098, - "begin": 2619758, - "headersEnd": 2619892, + "beginOffset": 2619758, + "headersEndOffset": 2619892, + "endOffset": 2651948, "children": [ { "mimeType": "multipart/parallel", "lineNumber": 36104, - "begin": 2619909, - "headersEnd": 2619982, + "beginOffset": 2619909, + "headersEndOffset": 2619982, + "endOffset": 2651929, "children": [ { "mimeType": "text/plain", "lineNumber": 36107, - "begin": 2620013, - "headersEnd": 2620014, - "end": 2620721, + "beginOffset": 2620013, + "headersEndOffset": 2620014, + "endOffset": 2620721, "octets": 707, "lines": 18 }, { "mimeType": "audio/basic", "lineNumber": 36127, - "begin": 2620753, - "headersEnd": 2620850, - "end": 2651896, + "beginOffset": 2620753, + "headersEndOffset": 2620850, + "endOffset": 2651896, "octets": 31046, "lines": 426 } ], - "end": 2651929, "octets": 31947, "lines": 453 } ], - "end": 2651948, "octets": 32056, "lines": 457 }, - "end": 2651948, "octets": 32056 }, { - "mboxMarkerBegin": 2651949, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2651949, "lineNumber": 36561, - "begin": 2651957, - "headersEnd": 2652514, + "beginOffset": 2651957, + "headersEndOffset": 2652514, + "endOffset": 2709293, "body": { "mimeType": "image/pbm", "lineNumber": 36561, - "begin": 2651957, - "headersEnd": 2652514, - "end": 2709293, + "beginOffset": 2651957, + "headersEndOffset": 2652514, + "endOffset": 2709293, "octets": 56779, "lines": 782 }, - "end": 2709293, "octets": 56779 }, { - "mboxMarkerBegin": 2709294, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2709294, "lineNumber": 37359, - "begin": 2709302, - "headersEnd": 2710035, + "beginOffset": 2709302, + "headersEndOffset": 2710035, + "endOffset": 2741562, "body": { "mimeType": "multipart/alternative", "lineNumber": 37359, - "begin": 2709302, - "headersEnd": 2710035, + "beginOffset": 2709302, + "headersEndOffset": 2710035, + "endOffset": 2741562, "children": [ { "mimeType": "text/plain", "lineNumber": 37385, - "begin": 2710619, - "headersEnd": 2710620, - "end": 2711172, + "beginOffset": 2710619, + "headersEndOffset": 2710620, + "endOffset": 2711172, "octets": 552, "lines": 14 }, { "mimeType": "multipart/mixed", "lineNumber": 37402, - "begin": 2711231, - "headersEnd": 2711334, + "beginOffset": 2711231, + "headersEndOffset": 2711334, + "endOffset": 2741502, "children": [ { "mimeType": "text/richtext", "lineNumber": 37406, - "begin": 2711394, - "headersEnd": 2711467, - "end": 2711886, + "beginOffset": 2711394, + "headersEndOffset": 2711467, + "endOffset": 2711886, "octets": 419, "lines": 7 }, { "mimeType": "image/xwd", "lineNumber": 37418, - "begin": 2711947, - "headersEnd": 2712006, - "end": 2741267, + "beginOffset": 2711947, + "headersEndOffset": 2712006, + "endOffset": 2741267, "octets": 29261, "lines": 401 }, { "mimeType": "text/plain", "lineNumber": 37824, - "begin": 2741328, - "headersEnd": 2741398, - "end": 2741439, + "beginOffset": 2741328, + "headersEndOffset": 2741398, + "endOffset": 2741439, "octets": 41, "lines": 4 } ], - "end": 2741502, "octets": 30168, "lines": 428 } ], - "end": 2741562, "octets": 31527, "lines": 459 }, - "end": 2741562, "octets": 31527 }, { - "mboxMarkerBegin": 2741563, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2741563, "lineNumber": 37836, - "begin": 2741571, - "headersEnd": 2742224, + "beginOffset": 2741571, + "headersEndOffset": 2742224, + "endOffset": 2747107, "body": { "mimeType": "multipart/alternative", "lineNumber": 37836, - "begin": 2741571, - "headersEnd": 2742224, + "beginOffset": 2741571, + "headersEndOffset": 2742224, + "endOffset": 2747107, "children": [ { "mimeType": "text/plain", "lineNumber": 37860, - "begin": 2742593, - "headersEnd": 2742594, - "end": 2743415, + "beginOffset": 2742593, + "headersEndOffset": 2742594, + "endOffset": 2743415, "octets": 821, "lines": 27 }, { "mimeType": "multipart/mixed", "lineNumber": 37890, - "begin": 2743445, - "headersEnd": 2743518, + "beginOffset": 2743445, + "headersEndOffset": 2743518, + "endOffset": 2747075, "children": [ { "mimeType": "text/plain", "lineNumber": 37894, - "begin": 2743549, - "headersEnd": 2743575, - "end": 2743712, + "beginOffset": 2743549, + "headersEndOffset": 2743575, + "endOffset": 2743712, "octets": 137, "lines": 6 }, { "mimeType": "image/x-xbitmap", "lineNumber": 37903, - "begin": 2743744, - "headersEnd": 2743809, - "end": 2745006, + "beginOffset": 2743744, + "headersEndOffset": 2743809, + "endOffset": 2745006, "octets": 1197, "lines": 17 }, { "mimeType": "text/plain", "lineNumber": 37925, - "begin": 2745038, - "headersEnd": 2745064, - "end": 2745132, + "beginOffset": 2745038, + "headersEndOffset": 2745064, + "endOffset": 2745132, "octets": 68, "lines": 1 }, { "mimeType": "image/x-xbitmap", "lineNumber": 37929, - "begin": 2745164, - "headersEnd": 2745229, - "end": 2746434, + "beginOffset": 2745164, + "headersEndOffset": 2745229, + "endOffset": 2746434, "octets": 1205, "lines": 17 }, { "mimeType": "text/richtext", "lineNumber": 37951, - "begin": 2746466, - "headersEnd": 2746495, - "end": 2747041, + "beginOffset": 2746466, + "headersEndOffset": 2746495, + "endOffset": 2747041, "octets": 546, "lines": 14 } ], - "end": 2747075, "octets": 3557, "lines": 75 } ], - "end": 2747107, "octets": 4883, "lines": 118 }, - "end": 2747107, "octets": 4883 }, { - "mboxMarkerBegin": 2747108, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2747108, "lineNumber": 37972, - "begin": 2747116, - "headersEnd": 2748092, + "beginOffset": 2747116, + "headersEndOffset": 2748092, + "endOffset": 2749474, "body": { "mimeType": "text/plain", "lineNumber": 37972, - "begin": 2747116, - "headersEnd": 2748092, - "end": 2749474, + "beginOffset": 2747116, + "headersEndOffset": 2748092, + "endOffset": 2749474, "octets": 1382, "lines": 32 }, - "end": 2749474, "octets": 1382 }, { - "mboxMarkerBegin": 2749475, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2749475, "lineNumber": 38027, - "begin": 2749483, - "headersEnd": 2749739, + "beginOffset": 2749483, + "headersEndOffset": 2749739, + "endOffset": 2749995, "body": { "mimeType": "text/plain", "lineNumber": 38027, - "begin": 2749483, - "headersEnd": 2749739, - "end": 2749995, + "beginOffset": 2749483, + "headersEndOffset": 2749739, + "endOffset": 2749995, "octets": 256, "lines": 6 }, - "end": 2749995, "octets": 256 }, { - "mboxMarkerBegin": 2749996, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2749996, "lineNumber": 38041, - "begin": 2750004, - "headersEnd": 2750661, + "beginOffset": 2750004, + "headersEndOffset": 2750661, + "endOffset": 2751385, "body": { "mimeType": "text/plain", "lineNumber": 38041, - "begin": 2750004, - "headersEnd": 2750661, - "end": 2751385, + "beginOffset": 2750004, + "headersEndOffset": 2750661, + "endOffset": 2751385, "octets": 724, "lines": 14 }, - "end": 2751385, "octets": 724 }, { - "mboxMarkerBegin": 2751386, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 2751386, "lineNumber": 38071, - "begin": 2751394, - "headersEnd": 2752379, + "beginOffset": 2751394, + "headersEndOffset": 2752379, + "endOffset": 3183395, "body": { "mimeType": "multipart/mixed", "lineNumber": 38071, - "begin": 2751394, - "headersEnd": 2752379, + "beginOffset": 2751394, + "headersEndOffset": 2752379, + "endOffset": 3183395, "children": [ { "mimeType": "text/plain", "lineNumber": 38088, - "begin": 2752420, - "headersEnd": 2752466, - "end": 2752538, + "beginOffset": 2752420, + "headersEndOffset": 2752466, + "endOffset": 2752538, "octets": 72, "lines": 5 }, { "mimeType": "multipart/appledouble", "lineNumber": 38097, - "begin": 2752578, - "headersEnd": 2752665, + "beginOffset": 2752578, + "headersEndOffset": 2752665, + "endOffset": 3183354, "children": [ { "mimeType": "application/applefile", "lineNumber": 38102, - "begin": 2752707, - "headersEnd": 2752862, - "end": 2818779, + "beginOffset": 2752707, + "headersEndOffset": 2752862, + "endOffset": 2818779, "octets": 65917, "lines": 957 }, { "mimeType": "application/octet-stream", "lineNumber": 39065, - "begin": 2818820, - "headersEnd": 2819029, - "end": 3183310, + "beginOffset": 2818820, + "headersEndOffset": 2819029, + "endOffset": 3183310, "octets": 364281, "lines": 5281 } ], - "end": 3183354, "octets": 430689, "lines": 6256 } ], - "end": 3183395, "octets": 431016, "lines": 6272 }, - "end": 3183395, "octets": 431016 }, { - "mboxMarkerBegin": 3183396, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3183396, "lineNumber": 44358, - "begin": 3183404, - "headersEnd": 3184389, + "beginOffset": 3183404, + "headersEndOffset": 3184389, + "endOffset": 3615404, "body": { "mimeType": "multipart/mixed", "lineNumber": 44358, - "begin": 3183404, - "headersEnd": 3184389, + "beginOffset": 3183404, + "headersEndOffset": 3184389, + "endOffset": 3615404, "children": [ { "mimeType": "text/plain", "lineNumber": 44375, - "begin": 3184430, - "headersEnd": 3184476, - "end": 3184548, + "beginOffset": 3184430, + "headersEndOffset": 3184476, + "endOffset": 3184548, "octets": 72, "lines": 5 }, { "mimeType": "multipart/header-set", "lineNumber": 44384, - "begin": 3184588, - "headersEnd": 3184674, + "beginOffset": 3184588, + "headersEndOffset": 3184674, + "endOffset": 3615363, "children": [ { "mimeType": "application/applefile", "lineNumber": 44389, - "begin": 3184716, - "headersEnd": 3184871, - "end": 3250788, + "beginOffset": 3184716, + "headersEndOffset": 3184871, + "endOffset": 3250788, "octets": 65917, "lines": 957 }, { "mimeType": "application/octet-stream", "lineNumber": 45352, - "begin": 3250829, - "headersEnd": 3251038, - "end": 3615319, + "beginOffset": 3250829, + "headersEndOffset": 3251038, + "endOffset": 3615319, "octets": 364281, "lines": 5281 } ], - "end": 3615363, "octets": 430689, "lines": 6256 } ], - "end": 3615404, "octets": 431015, "lines": 6272 }, - "end": 3615404, "octets": 431015 }, { - "mboxMarkerBegin": 3615405, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3615405, "lineNumber": 50645, - "begin": 3615413, - "headersEnd": 3615971, + "beginOffset": 3615413, + "headersEndOffset": 3615971, + "endOffset": 3616557, "body": { "mimeType": "Message/rfc822", "lineNumber": 50645, - "begin": 3615413, - "headersEnd": 3615971, + "beginOffset": 3615413, + "headersEndOffset": 3615971, + "endOffset": 3616557, "message": { "lineNumber": 50660, - "begin": 3615971, - "headersEnd": 3616030, + "beginOffset": 3615971, + "headersEndOffset": 3616030, + "endOffset": 3616557, "body": { "mimeType": "text/plain", "lineNumber": 50660, - "begin": 3615971, - "headersEnd": 3616030, - "end": 3616557, + "beginOffset": 3615971, + "headersEndOffset": 3616030, + "endOffset": 3616557, "octets": 527, "lines": 14 }, - "end": 3616557, "octets": 527 }, - "end": 3616557, "octets": 586, "lines": 17 }, - "end": 3616557, "octets": 586 }, { - "mboxMarkerBegin": 3616558, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3616558, "lineNumber": 50678, - "begin": 3616566, - "headersEnd": 3617279, + "beginOffset": 3616566, + "headersEndOffset": 3617279, + "endOffset": 3618690, "body": { "mimeType": "multipart/mixed", "lineNumber": 50678, - "begin": 3616566, - "headersEnd": 3617279, + "beginOffset": 3616566, + "headersEndOffset": 3617279, + "endOffset": 3618690, "children": [ { "mimeType": "text/plain", "lineNumber": 50698, - "begin": 3617323, - "headersEnd": 3617349, - "end": 3617529, + "beginOffset": 3617323, + "headersEndOffset": 3617349, + "endOffset": 3617529, "octets": 180, "lines": 6 }, { "mimeType": "application/postscript", "lineNumber": 50708, - "begin": 3617573, - "headersEnd": 3617645, - "end": 3618537, + "beginOffset": 3617573, + "headersEndOffset": 3617645, + "endOffset": 3618537, "octets": 892, "lines": 12 } ], - "end": 3618690, "octets": 1411, "lines": 33 }, - "end": 3618690, "octets": 1411 }, { - "mboxMarkerBegin": 3618691, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3618691, "lineNumber": 50731, - "begin": 3618699, - "headersEnd": 3619238, + "beginOffset": 3618699, + "headersEndOffset": 3619238, + "endOffset": 3623959, "body": { "mimeType": "multipart/mixed", "lineNumber": 50731, - "begin": 3618699, - "headersEnd": 3619238, + "beginOffset": 3618699, + "headersEndOffset": 3619238, + "endOffset": 3623959, "children": [ { "mimeType": "text/plain", "lineNumber": 50748, - "begin": 3619314, - "headersEnd": 3619315, - "end": 3619707, + "beginOffset": 3619314, + "headersEndOffset": 3619315, + "endOffset": 3619707, "octets": 392, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 50761, - "begin": 3619747, - "headersEnd": 3619777, + "beginOffset": 3619747, + "headersEndOffset": 3619777, + "endOffset": 3623917, "message": { "lineNumber": 50763, - "begin": 3619777, - "headersEnd": 3620564, + "beginOffset": 3619777, + "headersEndOffset": 3620564, + "endOffset": 3623917, "body": { "mimeType": "text/plain", "lineNumber": 50763, - "begin": 3619777, - "headersEnd": 3620564, - "end": 3623917, + "beginOffset": 3619777, + "headersEndOffset": 3620564, + "endOffset": 3623917, "octets": 3353, "lines": 72 }, - "end": 3623917, "octets": 3353 }, - "end": 3623917, "octets": 4140, "lines": 88 } ], - "end": 3623959, "octets": 4721, "lines": 108 }, - "end": 3623959, "octets": 4721 }, { - "mboxMarkerBegin": 3623960, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3623960, "lineNumber": 50855, - "begin": 3623968, - "headersEnd": 3624617, + "beginOffset": 3623968, + "headersEndOffset": 3624617, + "endOffset": 3625848, "body": { "mimeType": "multipart/mixed", "lineNumber": 50855, - "begin": 3623968, - "headersEnd": 3624617, + "beginOffset": 3623968, + "headersEndOffset": 3624617, + "endOffset": 3625848, "children": [ { "mimeType": "text/plain", "lineNumber": 50873, - "begin": 3624666, - "headersEnd": 3624692, - "end": 3624766, + "beginOffset": 3624666, + "headersEndOffset": 3624692, + "endOffset": 3624766, "octets": 74, "lines": 5 }, { "mimeType": "message/rfc822", "lineNumber": 50881, - "begin": 3624816, - "headersEnd": 3624878, + "beginOffset": 3624816, + "headersEndOffset": 3624878, + "endOffset": 3625797, "message": { "lineNumber": 50884, - "begin": 3624878, - "headersEnd": 3625660, + "beginOffset": 3624878, + "headersEndOffset": 3625660, + "endOffset": 3625797, "body": { "mimeType": "text/plain", "lineNumber": 50884, - "begin": 3624878, - "headersEnd": 3625660, - "end": 3625797, + "beginOffset": 3624878, + "headersEndOffset": 3625660, + "endOffset": 3625797, "octets": 137, "lines": 4 }, - "end": 3625797, "octets": 137 }, - "end": 3625797, "octets": 919, "lines": 21 } ], - "end": 3625848, "octets": 1231, "lines": 34 }, - "end": 3625848, "octets": 1231 }, { - "mboxMarkerBegin": 3625849, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3625849, "lineNumber": 50907, - "begin": 3625857, - "headersEnd": 3626367, + "beginOffset": 3625857, + "headersEndOffset": 3626367, + "endOffset": 3627786, "body": { "mimeType": "Application/octet-stream", "lineNumber": 50907, - "begin": 3625857, - "headersEnd": 3626367, - "end": 3627786, + "beginOffset": 3625857, + "headersEndOffset": 3626367, + "endOffset": 3627786, "octets": 1419, "lines": 45 }, - "end": 3627786, "octets": 1419 }, { - "mboxMarkerBegin": 3627787, - "mboxMarkerLength": 50, + "mboxMarkerOffset": 3627787, "lineNumber": 50967, - "begin": 3627838, - "headersEnd": 3628410, + "beginOffset": 3627838, + "headersEndOffset": 3628410, + "endOffset": 3688111, "body": { "mimeType": "message/partial", "lineNumber": 50967, - "begin": 3627838, - "headersEnd": 3628410, - "end": 3688111, + "beginOffset": 3627838, + "headersEndOffset": 3628410, + "endOffset": 3688111, "octets": 59701, "lines": 954 }, - "end": 3688111, "octets": 59701 }, { - "mboxMarkerBegin": 3688112, - "mboxMarkerLength": 50, + "mboxMarkerOffset": 3688112, "lineNumber": 51938, - "begin": 3688163, - "headersEnd": 3688732, + "beginOffset": 3688163, + "headersEndOffset": 3688732, + "endOffset": 3748539, "body": { "mimeType": "message/partial", "lineNumber": 51938, - "begin": 3688163, - "headersEnd": 3688732, - "end": 3748539, + "beginOffset": 3688163, + "headersEndOffset": 3688732, + "endOffset": 3748539, "octets": 59807, "lines": 960 }, - "end": 3748539, "octets": 59807 }, { - "mboxMarkerBegin": 3748540, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3748540, "lineNumber": 52915, - "begin": 3748548, - "headersEnd": 3749096, + "beginOffset": 3748548, + "headersEndOffset": 3749096, + "endOffset": 3749967, "body": { "mimeType": "multipart/mixed", "lineNumber": 52915, - "begin": 3748548, - "headersEnd": 3749096, + "beginOffset": 3748548, + "headersEndOffset": 3749096, + "endOffset": 3749967, "children": [ { "mimeType": "text/plain", "lineNumber": 52930, - "begin": 3749112, - "headersEnd": 3749139, - "end": 3749210, + "beginOffset": 3749112, + "headersEndOffset": 3749139, + "endOffset": 3749210, "octets": 71, "lines": 4 }, { "mimeType": "text/plain", "lineNumber": 52938, - "begin": 3749226, - "headersEnd": 3749307, - "end": 3749948, + "beginOffset": 3749226, + "headersEndOffset": 3749307, + "endOffset": 3749948, "octets": 641, "lines": 9 } ], - "end": 3749967, "octets": 871, "lines": 25 }, - "end": 3749967, "octets": 871 }, { - "mboxMarkerBegin": 3749968, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3749968, "lineNumber": 52955, - "begin": 3749976, - "headersEnd": 3750723, + "beginOffset": 3749976, + "headersEndOffset": 3750723, + "endOffset": 3792253, "body": { "mimeType": "image/gif", "lineNumber": 52955, - "begin": 3749976, - "headersEnd": 3750723, - "end": 3792253, + "beginOffset": 3749976, + "headersEndOffset": 3750723, + "endOffset": 3792253, "octets": 41530, "lines": 570 }, - "end": 3792253, "octets": 41530 }, { - "mboxMarkerBegin": 3792254, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3792254, "lineNumber": 53545, - "begin": 3792262, - "headersEnd": 3793416, + "beginOffset": 3792262, + "headersEndOffset": 3793416, + "endOffset": 3801685, "body": { "mimeType": "multipart/mixed", "lineNumber": 53545, - "begin": 3792262, - "headersEnd": 3793416, + "beginOffset": 3792262, + "headersEndOffset": 3793416, + "endOffset": 3801685, "children": [ { "mimeType": "text/plain", "lineNumber": 53571, - "begin": 3793421, - "headersEnd": 3793422, - "end": 3795344, + "beginOffset": 3793421, + "headersEndOffset": 3793422, + "endOffset": 3795344, "octets": 1922, "lines": 43 }, { "mimeType": "image/gif", "lineNumber": 53617, - "begin": 3795350, - "headersEnd": 3795455, - "end": 3801677, + "beginOffset": 3795350, + "headersEndOffset": 3795455, + "endOffset": 3801677, "octets": 6222, "lines": 86 } ], - "end": 3801685, "octets": 8269, "lines": 139 }, - "end": 3801685, "octets": 8269 }, { - "mboxMarkerBegin": 3801686, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3801686, "lineNumber": 53711, - "begin": 3801694, - "headersEnd": 3803142, + "beginOffset": 3801694, + "headersEndOffset": 3803142, + "endOffset": 3909955, "body": { "mimeType": "application/octet-stream", "lineNumber": 53711, - "begin": 3801694, - "headersEnd": 3803142, - "end": 3909955, + "beginOffset": 3801694, + "headersEndOffset": 3803142, + "endOffset": 3909955, "octets": 106813, "lines": 1570 }, - "end": 3909955, "octets": 106813 }, { - "mboxMarkerBegin": 3909956, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3909956, "lineNumber": 55311, - "begin": 3909964, - "headersEnd": 3910563, + "beginOffset": 3909964, + "headersEndOffset": 3910563, + "endOffset": 3913880, "body": { "mimeType": "message/rfc822", "lineNumber": 55311, - "begin": 3909964, - "headersEnd": 3910563, + "beginOffset": 3909964, + "headersEndOffset": 3910563, + "endOffset": 3913880, "message": { "lineNumber": 55327, - "begin": 3910563, - "headersEnd": 3911133, + "beginOffset": 3910563, + "headersEndOffset": 3911133, + "endOffset": 3913880, "body": { "mimeType": "message/rfc822", "lineNumber": 55327, - "begin": 3910563, - "headersEnd": 3911133, + "beginOffset": 3910563, + "headersEndOffset": 3911133, + "endOffset": 3913880, "message": { "lineNumber": 55343, - "begin": 3911133, - "headersEnd": 3911675, + "beginOffset": 3911133, + "headersEndOffset": 3911675, + "endOffset": 3913880, "body": { "mimeType": "message/rfc822", "lineNumber": 55343, - "begin": 3911133, - "headersEnd": 3911675, + "beginOffset": 3911133, + "headersEndOffset": 3911675, + "endOffset": 3913880, "message": { "lineNumber": 55359, - "begin": 3911675, - "headersEnd": 3912223, + "beginOffset": 3911675, + "headersEndOffset": 3912223, + "endOffset": 3913880, "body": { "mimeType": "multipart/mixed", "lineNumber": 55359, - "begin": 3911675, - "headersEnd": 3912223, + "beginOffset": 3911675, + "headersEndOffset": 3912223, + "endOffset": 3913880, "children": [ { "mimeType": "text/plain", "lineNumber": 55378, - "begin": 3912327, - "headersEnd": 3912403, - "end": 3912452, + "beginOffset": 3912327, + "headersEndOffset": 3912403, + "endOffset": 3912452, "octets": 49, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 55384, - "begin": 3912511, - "headersEnd": 3912573, + "beginOffset": 3912511, + "headersEndOffset": 3912573, + "endOffset": 3913817, "message": { "lineNumber": 55387, - "begin": 3912573, - "headersEnd": 3913073, + "beginOffset": 3912573, + "headersEndOffset": 3913073, + "endOffset": 3913817, "body": { "mimeType": "multipart/mixed", "lineNumber": 55387, - "begin": 3912573, - "headersEnd": 3913073, + "beginOffset": 3912573, + "headersEndOffset": 3913073, + "endOffset": 3913817, "children": [ { "mimeType": "text/plain", "lineNumber": 55406, - "begin": 3913167, - "headersEnd": 3913243, - "end": 3913365, + "beginOffset": 3913167, + "headersEndOffset": 3913243, + "endOffset": 3913365, "octets": 122, "lines": 5 }, { "mimeType": "text/html", "lineNumber": 55416, - "begin": 3913414, - "headersEnd": 3913483, - "end": 3913766, + "beginOffset": 3913414, + "headersEndOffset": 3913483, + "endOffset": 3913766, "octets": 283, "lines": 5 } ], - "end": 3913817, "octets": 744, "lines": 22 }, - "end": 3913817, "octets": 744 }, - "end": 3913817, "octets": 1244, "lines": 38 } ], - "end": 3913880, "octets": 1657, "lines": 54 }, - "end": 3913880, "octets": 1657 }, - "end": 3913880, "octets": 2205, "lines": 70 }, - "end": 3913880, "octets": 2205 }, - "end": 3913880, "octets": 2747, "lines": 86 }, - "end": 3913880, "octets": 2747 }, - "end": 3913880, "octets": 3317, "lines": 102 }, - "end": 3913880, "octets": 3317 }, { - "mboxMarkerBegin": 3913881, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 3913881, "lineNumber": 55431, - "begin": 3913889, - "headersEnd": 3914592, + "beginOffset": 3913889, + "headersEndOffset": 3914592, + "endOffset": 4176062, "body": { "mimeType": "multipart/mixed", "lineNumber": 55431, - "begin": 3913889, - "headersEnd": 3914592, + "beginOffset": 3913889, + "headersEndOffset": 3914592, + "endOffset": 4176062, "children": [ { "mimeType": "text/plain", "lineNumber": 55448, - "begin": 3914619, - "headersEnd": 3914620, - "end": 3914661, + "beginOffset": 3914619, + "headersEndOffset": 3914620, + "endOffset": 3914661, "octets": 41, "lines": 2 }, { "mimeType": "image/pbm", "lineNumber": 55452, - "begin": 3914689, - "headersEnd": 3914834, - "end": 3992050, + "beginOffset": 3914689, + "headersEndOffset": 3914834, + "endOffset": 3992050, "octets": 77216, "lines": 401 }, { "mimeType": "text/plain", "lineNumber": 55859, - "begin": 3992078, - "headersEnd": 3992079, - "end": 3992110, + "beginOffset": 3992078, + "headersEndOffset": 3992079, + "endOffset": 3992110, "octets": 31, "lines": 3 }, { "mimeType": "audio/basic", "lineNumber": 55865, - "begin": 3992138, - "headersEnd": 3992285, - "end": 4095487, + "beginOffset": 3992138, + "headersEndOffset": 3992285, + "endOffset": 4095487, "octets": 103202, "lines": 535 }, { "mimeType": "text/plain", "lineNumber": 56406, - "begin": 4095515, - "headersEnd": 4095516, - "end": 4095676, + "beginOffset": 4095515, + "headersEndOffset": 4095516, + "endOffset": 4095676, "octets": 160, "lines": 5 }, { "mimeType": "application/x-annotate", "lineNumber": 56413, - "begin": 4095704, - "headersEnd": 4095793, - "end": 4175983, + "beginOffset": 4095704, + "headersEndOffset": 4095793, + "endOffset": 4175983, "octets": 80190, "lines": 1235 }, { "mimeType": "text/plain", "lineNumber": 57652, - "begin": 4176011, - "headersEnd": 4176012, - "end": 4176032, + "beginOffset": 4176011, + "headersEndOffset": 4176012, + "endOffset": 4176032, "octets": 20, "lines": 3 } ], - "end": 4176062, "octets": 261470, "lines": 2210 }, - "end": 4176062, "octets": 261470 }, { - "mboxMarkerBegin": 4176063, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4176063, "lineNumber": 57659, - "begin": 4176071, - "headersEnd": 4176736, + "beginOffset": 4176071, + "headersEndOffset": 4176736, + "endOffset": 4177728, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 57659, - "begin": 4176071, - "headersEnd": 4176736, - "end": 4177728, + "beginOffset": 4176071, + "headersEndOffset": 4176736, + "endOffset": 4177728, "octets": 992, "lines": 18 }, - "end": 4177728, "octets": 992 }, { - "mboxMarkerBegin": 4177729, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4177729, "lineNumber": 57693, - "begin": 4177737, - "headersEnd": 4178793, + "beginOffset": 4177737, + "headersEndOffset": 4178793, + "endOffset": 4181836, "body": { "mimeType": "multipart/alternative", "lineNumber": 57693, - "begin": 4177737, - "headersEnd": 4178793, + "beginOffset": 4177737, + "headersEndOffset": 4178793, + "endOffset": 4181836, "children": [ { "mimeType": "text/plain", "lineNumber": 57720, - "begin": 4178988, - "headersEnd": 4179032, - "end": 4179436, + "beginOffset": 4178988, + "headersEndOffset": 4179032, + "endOffset": 4179436, "octets": 404, "lines": 13 }, { "mimeType": "multipart/mixed", "lineNumber": 57737, - "begin": 4179477, - "headersEnd": 4179562, + "beginOffset": 4179477, + "headersEndOffset": 4179562, + "endOffset": 4181793, "children": [ { "mimeType": "text/richtext", "lineNumber": 57741, - "begin": 4179604, - "headersEnd": 4179695, - "end": 4179920, + "beginOffset": 4179604, + "headersEndOffset": 4179695, + "endOffset": 4179920, "octets": 225, "lines": 4 }, { "mimeType": "image/x-xbm", "lineNumber": 57750, - "begin": 4179963, - "headersEnd": 4180082, - "end": 4181466, + "beginOffset": 4179963, + "headersEndOffset": 4180082, + "endOffset": 4181466, "octets": 1384, "lines": 37 }, { "mimeType": "text/richtext", "lineNumber": 57793, - "begin": 4181509, - "headersEnd": 4181600, - "end": 4181748, + "beginOffset": 4181509, + "headersEndOffset": 4181600, + "endOffset": 4181748, "octets": 148, "lines": 9 } ], - "end": 4181793, "octets": 2231, "lines": 67 } ], - "end": 4181836, "octets": 3043, "lines": 93 }, - "end": 4181836, "octets": 3043 }, { - "mboxMarkerBegin": 4181837, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4181837, "lineNumber": 57811, - "begin": 4181845, - "headersEnd": 4182515, + "beginOffset": 4181845, + "headersEndOffset": 4182515, + "endOffset": 4187896, "body": { "mimeType": "multipart/mixed", "lineNumber": 57811, - "begin": 4181845, - "headersEnd": 4182515, + "beginOffset": 4181845, + "headersEndOffset": 4182515, + "endOffset": 4187896, "children": [ { "mimeType": "text/plain", "lineNumber": 57828, - "begin": 4182531, - "headersEnd": 4182558, - "end": 4182636, + "beginOffset": 4182531, + "headersEndOffset": 4182558, + "endOffset": 4182636, "octets": 78, "lines": 6 }, { "mimeType": "image/gif", "lineNumber": 57838, - "begin": 4182653, - "headersEnd": 4182713, - "end": 4187876, + "beginOffset": 4182653, + "headersEndOffset": 4182713, + "endOffset": 4187876, "octets": 5163, "lines": 71 } ], - "end": 4187896, "octets": 5381, "lines": 88 }, - "end": 4187896, "octets": 5381 }, { - "mboxMarkerBegin": 4187897, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4187897, "lineNumber": 57917, - "begin": 4187905, - "headersEnd": 4188357, + "beginOffset": 4187905, + "headersEndOffset": 4188357, + "endOffset": 4199771, "body": { "mimeType": "Image/JPEG", "lineNumber": 57917, - "begin": 4187905, - "headersEnd": 4188357, - "end": 4199771, + "beginOffset": 4187905, + "headersEndOffset": 4188357, + "endOffset": 4199771, "octets": 11414, "lines": 185 }, - "end": 4199771, "octets": 11414 }, { - "mboxMarkerBegin": 4199772, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4199772, "lineNumber": 58118, - "begin": 4199780, - "headersEnd": 4200345, + "beginOffset": 4199780, + "headersEndOffset": 4200345, + "endOffset": 4201646, "body": { "mimeType": "Multipart/Mixed", "lineNumber": 58118, - "begin": 4199780, - "headersEnd": 4200345, + "beginOffset": 4199780, + "headersEndOffset": 4200345, + "endOffset": 4201646, "children": [ { "mimeType": "text/plain", "lineNumber": 58134, - "begin": 4200356, - "headersEnd": 4200357, - "end": 4200395, + "beginOffset": 4200356, + "headersEndOffset": 4200357, + "endOffset": 4200395, "octets": 38, "lines": 1 }, { "mimeType": "Multipart/MIXED", "lineNumber": 58138, - "begin": 4200407, - "headersEnd": 4200462, + "beginOffset": 4200407, + "headersEndOffset": 4200462, + "endOffset": 4201632, "children": [ { "mimeType": "Message/External-body", "lineNumber": 58141, - "begin": 4200476, - "headersEnd": 4200592, + "beginOffset": 4200476, + "headersEndOffset": 4200592, + "endOffset": 4200736, "message": { "lineNumber": 58145, - "begin": 4200592, - "headersEnd": 4200669, + "beginOffset": 4200592, + "headersEndOffset": 4200669, + "endOffset": 4200736, "body": { "mimeType": "text/plain", "lineNumber": 58145, - "begin": 4200592, - "headersEnd": 4200669, - "end": 4200736, + "beginOffset": 4200592, + "headersEndOffset": 4200669, + "endOffset": 4200736, "octets": 67, "lines": 2 }, - "end": 4200736, "octets": 67 }, - "end": 4200736, "octets": 144, "lines": 5 }, { "mimeType": "Message/External-body", "lineNumber": 58152, - "begin": 4200751, - "headersEnd": 4200938, + "beginOffset": 4200751, + "headersEndOffset": 4200938, + "endOffset": 4201014, "message": { "lineNumber": 58158, - "begin": 4200938, - "headersEnd": 4201014, + "beginOffset": 4200938, + "headersEndOffset": 4201014, + "endOffset": 4201014, "body": { "mimeType": "text/plain", "lineNumber": 58158, - "begin": 4200938, - "headersEnd": 4201014, - "end": 4201014, + "beginOffset": 4200938, + "headersEndOffset": 4201014, + "endOffset": 4201014, "octets": 0, "lines": 0 }, - "end": 4201014, "octets": 0 }, - "end": 4201014, "octets": 76, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 58162, - "begin": 4201029, - "headersEnd": 4201164, + "beginOffset": 4201029, + "headersEndOffset": 4201164, + "endOffset": 4201231, "message": { "lineNumber": 58169, - "begin": 4201164, - "headersEnd": 4201231, + "beginOffset": 4201164, + "headersEndOffset": 4201231, + "endOffset": 4201231, "body": { "mimeType": "TEXT/HTML", "lineNumber": 58169, - "begin": 4201164, - "headersEnd": 4201231, - "end": 4201231, + "beginOffset": 4201164, + "headersEndOffset": 4201231, + "endOffset": 4201231, "octets": 0, "lines": 0 }, - "end": 4201231, "octets": 0 }, - "end": 4201231, "octets": 67, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 58173, - "begin": 4201246, - "headersEnd": 4201359, + "beginOffset": 4201246, + "headersEndOffset": 4201359, + "endOffset": 4201427, "message": { "lineNumber": 58177, - "begin": 4201359, - "headersEnd": 4201427, + "beginOffset": 4201359, + "headersEndOffset": 4201427, + "endOffset": 4201427, "body": { "mimeType": "image/gif", "lineNumber": 58177, - "begin": 4201359, - "headersEnd": 4201427, - "end": 4201427, + "beginOffset": 4201359, + "headersEndOffset": 4201427, + "endOffset": 4201427, "octets": 0, "lines": 0 }, - "end": 4201427, "octets": 0 }, - "end": 4201427, "octets": 68, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 58181, - "begin": 4201442, - "headersEnd": 4201547, + "beginOffset": 4201442, + "headersEndOffset": 4201547, + "endOffset": 4201615, "message": { "lineNumber": 58185, - "begin": 4201547, - "headersEnd": 4201615, + "beginOffset": 4201547, + "headersEndOffset": 4201615, + "endOffset": 4201615, "body": { "mimeType": "image/gif", "lineNumber": 58185, - "begin": 4201547, - "headersEnd": 4201615, - "end": 4201615, + "beginOffset": 4201547, + "headersEndOffset": 4201615, + "endOffset": 4201615, "octets": 0, "lines": 0 }, - "end": 4201615, "octets": 0 }, - "end": 4201615, "octets": 68, "lines": 2 } ], - "end": 4201632, "octets": 1170, "lines": 49 } ], - "end": 4201646, "octets": 1301, "lines": 58 }, - "end": 4201646, "octets": 1301 }, { - "mboxMarkerBegin": 4201647, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4201647, "lineNumber": 58193, - "begin": 4201655, - "headersEnd": 4202220, + "beginOffset": 4201655, + "headersEndOffset": 4202220, + "endOffset": 4206092, "body": { "mimeType": "Multipart/Mixed", "lineNumber": 58193, - "begin": 4201655, - "headersEnd": 4202220, + "beginOffset": 4201655, + "headersEndOffset": 4202220, + "endOffset": 4206092, "children": [ { "mimeType": "text/plain", "lineNumber": 58209, - "begin": 4202231, - "headersEnd": 4202232, - "end": 4205436, + "beginOffset": 4202231, + "headersEndOffset": 4202232, + "endOffset": 4205436, "octets": 3204, "lines": 65 }, { "mimeType": "Multipart/Alternative", "lineNumber": 58277, - "begin": 4205448, - "headersEnd": 4205509, + "beginOffset": 4205448, + "headersEndOffset": 4205509, + "endOffset": 4206078, "children": [ { "mimeType": "Message/External-body", "lineNumber": 58280, - "begin": 4205523, - "headersEnd": 4205639, + "beginOffset": 4205523, + "headersEndOffset": 4205639, + "endOffset": 4205783, "message": { "lineNumber": 58284, - "begin": 4205639, - "headersEnd": 4205716, + "beginOffset": 4205639, + "headersEndOffset": 4205716, + "endOffset": 4205783, "body": { "mimeType": "text/plain", "lineNumber": 58284, - "begin": 4205639, - "headersEnd": 4205716, - "end": 4205783, + "beginOffset": 4205639, + "headersEndOffset": 4205716, + "endOffset": 4205783, "octets": 67, "lines": 2 }, - "end": 4205783, "octets": 67 }, - "end": 4205783, "octets": 144, "lines": 5 }, { "mimeType": "Message/External-body", "lineNumber": 58291, - "begin": 4205798, - "headersEnd": 4205985, + "beginOffset": 4205798, + "headersEndOffset": 4205985, + "endOffset": 4206061, "message": { "lineNumber": 58297, - "begin": 4205985, - "headersEnd": 4206061, + "beginOffset": 4205985, + "headersEndOffset": 4206061, + "endOffset": 4206061, "body": { "mimeType": "text/plain", "lineNumber": 58297, - "begin": 4205985, - "headersEnd": 4206061, - "end": 4206061, + "beginOffset": 4205985, + "headersEndOffset": 4206061, + "endOffset": 4206061, "octets": 0, "lines": 0 }, - "end": 4206061, "octets": 0 }, - "end": 4206061, "octets": 76, "lines": 2 } ], - "end": 4206078, "octets": 569, "lines": 22 } ], - "end": 4206092, "octets": 3872, "lines": 95 }, - "end": 4206092, "octets": 3872 }, { - "mboxMarkerBegin": 4206093, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4206093, "lineNumber": 58305, - "begin": 4206101, - "headersEnd": 4206569, + "beginOffset": 4206101, + "headersEndOffset": 4206569, + "endOffset": 4212326, "body": { "mimeType": "multipart/mixed", "lineNumber": 58305, - "begin": 4206101, - "headersEnd": 4206569, + "beginOffset": 4206101, + "headersEndOffset": 4206569, + "endOffset": 4212326, "children": [ { "mimeType": "message/rfc822", "lineNumber": 58320, - "begin": 4206642, - "headersEnd": 4206786, + "beginOffset": 4206642, + "headersEndOffset": 4206786, + "endOffset": 4207252, "message": { "lineNumber": 58325, - "begin": 4206786, - "headersEnd": 4207215, + "beginOffset": 4206786, + "headersEndOffset": 4207215, + "endOffset": 4207252, "body": { "mimeType": "text/plain", "lineNumber": 58325, - "begin": 4206786, - "headersEnd": 4207215, - "end": 4207252, + "beginOffset": 4206786, + "headersEndOffset": 4207215, + "endOffset": 4207252, "octets": 37, "lines": 2 }, - "end": 4207252, "octets": 37 }, - "end": 4207252, "octets": 466, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 58340, - "begin": 4207280, - "headersEnd": 4207403, - "end": 4207861, + "beginOffset": 4207280, + "headersEndOffset": 4207403, + "endOffset": 4207861, "octets": 458, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58352, - "begin": 4207889, - "headersEnd": 4208012, - "end": 4208498, + "beginOffset": 4207889, + "headersEndOffset": 4208012, + "endOffset": 4208498, "octets": 486, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58364, - "begin": 4208526, - "headersEnd": 4208653, - "end": 4209180, + "beginOffset": 4208526, + "headersEndOffset": 4208653, + "endOffset": 4209180, "octets": 527, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 58377, - "begin": 4209208, - "headersEnd": 4209333, - "end": 4209831, + "beginOffset": 4209208, + "headersEndOffset": 4209333, + "endOffset": 4209831, "octets": 498, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 58389, - "begin": 4209859, - "headersEnd": 4210003, + "beginOffset": 4209859, + "headersEndOffset": 4210003, + "endOffset": 4210469, "message": { "lineNumber": 58394, - "begin": 4210003, - "headersEnd": 4210432, + "beginOffset": 4210003, + "headersEndOffset": 4210432, + "endOffset": 4210469, "body": { "mimeType": "text/plain", "lineNumber": 58394, - "begin": 4210003, - "headersEnd": 4210432, - "end": 4210469, + "beginOffset": 4210003, + "headersEndOffset": 4210432, + "endOffset": 4210469, "octets": 37, "lines": 1 }, - "end": 4210469, "octets": 37 }, - "end": 4210469, "octets": 466, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 58408, - "begin": 4210497, - "headersEnd": 4210668, + "beginOffset": 4210497, + "headersEndOffset": 4210668, + "endOffset": 4212164, "message": { "lineNumber": 58413, - "begin": 4210668, - "headersEnd": 4211238, + "beginOffset": 4210668, + "headersEndOffset": 4211238, + "endOffset": 4212164, "body": { "mimeType": "message/rfc822", "lineNumber": 58413, - "begin": 4210668, - "headersEnd": 4211238, + "beginOffset": 4210668, + "headersEndOffset": 4211238, + "endOffset": 4212164, "message": { "lineNumber": 58428, - "begin": 4211238, - "headersEnd": 4211749, + "beginOffset": 4211238, + "headersEndOffset": 4211749, + "endOffset": 4212164, "body": { "mimeType": "message/rfc822", "lineNumber": 58428, - "begin": 4211238, - "headersEnd": 4211749, + "beginOffset": 4211238, + "headersEndOffset": 4211749, + "endOffset": 4212164, "message": { "lineNumber": 58442, - "begin": 4211749, - "headersEnd": 4212159, + "beginOffset": 4211749, + "headersEndOffset": 4212159, + "endOffset": 4212164, "body": { "mimeType": "text/plain", "lineNumber": 58442, - "begin": 4211749, - "headersEnd": 4212159, - "end": 4212164, + "beginOffset": 4211749, + "headersEndOffset": 4212159, + "endOffset": 4212164, "octets": 5, "lines": 1 }, - "end": 4212164, "octets": 5 }, - "end": 4212164, "octets": 415, "lines": 12 }, - "end": 4212164, "octets": 415 }, - "end": 4212164, "octets": 926, "lines": 26 }, - "end": 4212164, "octets": 926 }, - "end": 4212164, "octets": 1496, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 58456, - "begin": 4212192, - "headersEnd": 4212245, - "end": 4212297, + "beginOffset": 4212192, + "headersEndOffset": 4212245, + "endOffset": 4212297, "octets": 52, "lines": 1 } ], - "end": 4212326, "octets": 5757, "lines": 145 }, - "end": 4212326, "octets": 5757 }, { - "mboxMarkerBegin": 4212327, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4212327, "lineNumber": 58463, - "begin": 4212335, - "headersEnd": 4212806, + "beginOffset": 4212335, + "headersEndOffset": 4212806, + "endOffset": 4218598, "body": { "mimeType": "multipart/mixed", "lineNumber": 58463, - "begin": 4212335, - "headersEnd": 4212806, + "beginOffset": 4212335, + "headersEndOffset": 4212806, + "endOffset": 4218598, "children": [ { "mimeType": "message/rfc822", "lineNumber": 58478, - "begin": 4212879, - "headersEnd": 4213027, + "beginOffset": 4212879, + "headersEndOffset": 4213027, + "endOffset": 4213492, "message": { "lineNumber": 58483, - "begin": 4213027, - "headersEnd": 4213455, + "beginOffset": 4213027, + "headersEndOffset": 4213455, + "endOffset": 4213492, "body": { "mimeType": "text/plain", "lineNumber": 58483, - "begin": 4213027, - "headersEnd": 4213455, - "end": 4213492, + "beginOffset": 4213027, + "headersEndOffset": 4213455, + "endOffset": 4213492, "octets": 37, "lines": 2 }, - "end": 4213492, "octets": 37 }, - "end": 4213492, "octets": 465, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 58498, - "begin": 4213520, - "headersEnd": 4213647, - "end": 4214105, + "beginOffset": 4213520, + "headersEndOffset": 4213647, + "endOffset": 4214105, "octets": 458, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58510, - "begin": 4214133, - "headersEnd": 4214260, - "end": 4214746, + "beginOffset": 4214133, + "headersEndOffset": 4214260, + "endOffset": 4214746, "octets": 486, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 58522, - "begin": 4214774, - "headersEnd": 4214905, - "end": 4215432, + "beginOffset": 4214774, + "headersEndOffset": 4214905, + "endOffset": 4215432, "octets": 527, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 58535, - "begin": 4215460, - "headersEnd": 4215589, - "end": 4216087, + "beginOffset": 4215460, + "headersEndOffset": 4215589, + "endOffset": 4216087, "octets": 498, "lines": 7 }, { "mimeType": "message/rfc822", "lineNumber": 58547, - "begin": 4216115, - "headersEnd": 4216263, + "beginOffset": 4216115, + "headersEndOffset": 4216263, + "endOffset": 4216728, "message": { "lineNumber": 58552, - "begin": 4216263, - "headersEnd": 4216691, + "beginOffset": 4216263, + "headersEndOffset": 4216691, + "endOffset": 4216728, "body": { "mimeType": "text/plain", "lineNumber": 58552, - "begin": 4216263, - "headersEnd": 4216691, - "end": 4216728, + "beginOffset": 4216263, + "headersEndOffset": 4216691, + "endOffset": 4216728, "octets": 37, "lines": 1 }, - "end": 4216728, "octets": 37 }, - "end": 4216728, "octets": 465, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 58566, - "begin": 4216756, - "headersEnd": 4216931, + "beginOffset": 4216756, + "headersEndOffset": 4216931, + "endOffset": 4218432, "message": { "lineNumber": 58571, - "begin": 4216931, - "headersEnd": 4217504, + "beginOffset": 4216931, + "headersEndOffset": 4217504, + "endOffset": 4218432, "body": { "mimeType": "message/rfc822", "lineNumber": 58571, - "begin": 4216931, - "headersEnd": 4217504, + "beginOffset": 4216931, + "headersEndOffset": 4217504, + "endOffset": 4218432, "message": { "lineNumber": 58586, - "begin": 4217504, - "headersEnd": 4218018, + "beginOffset": 4217504, + "headersEndOffset": 4218018, + "endOffset": 4218432, "body": { "mimeType": "message/rfc822", "lineNumber": 58586, - "begin": 4217504, - "headersEnd": 4218018, + "beginOffset": 4217504, + "headersEndOffset": 4218018, + "endOffset": 4218432, "message": { "lineNumber": 58600, - "begin": 4218018, - "headersEnd": 4218427, + "beginOffset": 4218018, + "headersEndOffset": 4218427, + "endOffset": 4218432, "body": { "mimeType": "text/plain", "lineNumber": 58600, - "begin": 4218018, - "headersEnd": 4218427, - "end": 4218432, + "beginOffset": 4218018, + "headersEndOffset": 4218427, + "endOffset": 4218432, "octets": 5, "lines": 1 }, - "end": 4218432, "octets": 5 }, - "end": 4218432, "octets": 414, "lines": 12 }, - "end": 4218432, "octets": 414 }, - "end": 4218432, "octets": 928, "lines": 26 }, - "end": 4218432, "octets": 928 }, - "end": 4218432, "octets": 1501, "lines": 41 }, { "mimeType": "text/html", "lineNumber": 58614, - "begin": 4218460, - "headersEnd": 4218517, - "end": 4218569, + "beginOffset": 4218460, + "headersEndOffset": 4218517, + "endOffset": 4218569, "octets": 52, "lines": 1 } ], - "end": 4218598, "octets": 5792, "lines": 145 }, - "end": 4218598, "octets": 5792 }, { - "mboxMarkerBegin": 4218599, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4218599, "lineNumber": 58621, - "begin": 4218607, - "headersEnd": 4219294, + "beginOffset": 4218607, + "headersEndOffset": 4219294, + "endOffset": 4239312, "body": { "mimeType": "multipart/mixed", "lineNumber": 58621, - "begin": 4218607, - "headersEnd": 4219294, + "beginOffset": 4218607, + "headersEndOffset": 4219294, + "endOffset": 4239312, "children": [ { "mimeType": "text/richtext", "lineNumber": 58641, - "begin": 4219341, - "headersEnd": 4219370, - "end": 4219786, + "beginOffset": 4219341, + "headersEndOffset": 4219370, + "endOffset": 4219786, "octets": 416, "lines": 30 }, { "mimeType": "text/enriched", "lineNumber": 58675, - "begin": 4219793, - "headersEnd": 4219866, - "end": 4220497, + "beginOffset": 4219793, + "headersEndOffset": 4219866, + "endOffset": 4220497, "octets": 631, "lines": 42 }, { "mimeType": "text/plain", "lineNumber": 58722, - "begin": 4220504, - "headersEnd": 4220505, - "end": 4220523, + "beginOffset": 4220504, + "headersEndOffset": 4220505, + "endOffset": 4220523, "octets": 18, "lines": 1 }, { "mimeType": "text/plain", "lineNumber": 58725, - "begin": 4220530, - "headersEnd": 4220531, - "end": 4220542, + "beginOffset": 4220530, + "headersEndOffset": 4220531, + "endOffset": 4220542, "octets": 11, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 58728, - "begin": 4220549, - "headersEnd": 4220579, + "beginOffset": 4220549, + "headersEndOffset": 4220579, + "endOffset": 4221076, "message": { "lineNumber": 58730, - "begin": 4220579, - "headersEnd": 4220794, + "beginOffset": 4220579, + "headersEndOffset": 4220794, + "endOffset": 4221076, "body": { "mimeType": "multipart/mixed", "lineNumber": 58730, - "begin": 4220579, - "headersEnd": 4220794, + "beginOffset": 4220579, + "headersEndOffset": 4220794, + "endOffset": 4221076, "children": [ { "mimeType": "text/html", "lineNumber": 58738, - "begin": 4220800, - "headersEnd": 4220825, - "end": 4220848, + "beginOffset": 4220800, + "headersEndOffset": 4220825, + "endOffset": 4220848, "octets": 23, "lines": 1 }, { "mimeType": "image/unknown", "lineNumber": 58742, - "begin": 4220855, - "headersEnd": 4221030, - "end": 4221068, + "beginOffset": 4220855, + "headersEndOffset": 4221030, + "endOffset": 4221068, "octets": 38, "lines": 1 } ], - "end": 4221076, "octets": 282, "lines": 13 }, - "end": 4221076, "octets": 282 }, - "end": 4221076, "octets": 497, "lines": 20 }, { "mimeType": "image/x-xbitmap", "lineNumber": 58751, - "begin": 4221083, - "headersEnd": 4221161, - "end": 4230592, + "beginOffset": 4221083, + "headersEndOffset": 4221161, + "endOffset": 4230592, "octets": 9431, "lines": 128 }, { "mimeType": "image/unknown", "lineNumber": 58883, - "begin": 4230599, - "headersEnd": 4230774, - "end": 4230812, + "beginOffset": 4230599, + "headersEndOffset": 4230774, + "endOffset": 4230812, "octets": 38, "lines": 1 }, { "mimeType": "image/x-xbitmap", "lineNumber": 58891, - "begin": 4230819, - "headersEnd": 4230967, - "end": 4238788, + "beginOffset": 4230819, + "headersEndOffset": 4230967, + "endOffset": 4238788, "octets": 7821, "lines": 128 }, { "mimeType": "multipart/digest", "lineNumber": 59024, - "begin": 4238795, - "headersEnd": 4238847, + "beginOffset": 4238795, + "headersEndOffset": 4238847, + "endOffset": 4239263, "children": [ { "mimeType": "message/rfc822", "lineNumber": 59027, - "begin": 4238857, - "headersEnd": 4238858, + "beginOffset": 4238857, + "headersEndOffset": 4238858, + "endOffset": 4238889, "message": { "lineNumber": 59028, - "begin": 4238858, - "headersEnd": 4238884, + "beginOffset": 4238858, + "headersEndOffset": 4238884, + "endOffset": 4238889, "body": { "mimeType": "text/plain", "lineNumber": 59028, - "begin": 4238858, - "headersEnd": 4238884, - "end": 4238889, + "beginOffset": 4238858, + "headersEndOffset": 4238884, + "endOffset": 4238889, "octets": 5, "lines": 1 }, - "end": 4238889, "octets": 5 }, - "end": 4238889, "octets": 31, "lines": 4 }, { "mimeType": "message/rfc822", "lineNumber": 59033, - "begin": 4238900, - "headersEnd": 4238901, + "beginOffset": 4238900, + "headersEndOffset": 4238901, + "endOffset": 4238932, "message": { "lineNumber": 59034, - "begin": 4238901, - "headersEnd": 4238927, + "beginOffset": 4238901, + "headersEndOffset": 4238927, + "endOffset": 4238932, "body": { "mimeType": "text/plain", "lineNumber": 59034, - "begin": 4238901, - "headersEnd": 4238927, - "end": 4238932, + "beginOffset": 4238901, + "headersEndOffset": 4238927, + "endOffset": 4238932, "octets": 5, "lines": 1 }, - "end": 4238932, "octets": 5 }, - "end": 4238932, "octets": 31, "lines": 4 }, { "mimeType": "message/rfc822", "lineNumber": 59039, - "begin": 4238943, - "headersEnd": 4238944, + "beginOffset": 4238943, + "headersEndOffset": 4238944, + "endOffset": 4238975, "message": { "lineNumber": 59040, - "begin": 4238944, - "headersEnd": 4238970, + "beginOffset": 4238944, + "headersEndOffset": 4238970, + "endOffset": 4238975, "body": { "mimeType": "text/plain", "lineNumber": 59040, - "begin": 4238944, - "headersEnd": 4238970, - "end": 4238975, + "beginOffset": 4238944, + "headersEndOffset": 4238970, + "endOffset": 4238975, "octets": 5, "lines": 1 }, - "end": 4238975, "octets": 5 }, - "end": 4238975, "octets": 31, "lines": 4 }, { "mimeType": "text/html", "lineNumber": 59045, - "begin": 4238986, - "headersEnd": 4239011, - "end": 4239093, + "beginOffset": 4238986, + "headersEndOffset": 4239011, + "endOffset": 4239093, "octets": 82, "lines": 2 }, { "mimeType": "message/rfc822", "lineNumber": 59050, - "begin": 4239104, - "headersEnd": 4239105, + "beginOffset": 4239104, + "headersEndOffset": 4239105, + "endOffset": 4239208, "message": { "lineNumber": 59051, - "begin": 4239105, - "headersEnd": 4239159, + "beginOffset": 4239105, + "headersEndOffset": 4239159, + "endOffset": 4239208, "body": { "mimeType": "text/richtext", "lineNumber": 59051, - "begin": 4239105, - "headersEnd": 4239159, - "end": 4239208, + "beginOffset": 4239105, + "headersEndOffset": 4239159, + "endOffset": 4239208, "octets": 49, "lines": 1 }, - "end": 4239208, "octets": 49 }, - "end": 4239208, "octets": 103, "lines": 5 }, { "mimeType": "message/rfc822", "lineNumber": 59057, - "begin": 4239219, - "headersEnd": 4239220, + "beginOffset": 4239219, + "headersEndOffset": 4239220, + "endOffset": 4239251, "message": { "lineNumber": 59058, - "begin": 4239220, - "headersEnd": 4239246, + "beginOffset": 4239220, + "headersEndOffset": 4239246, + "endOffset": 4239251, "body": { "mimeType": "text/plain", "lineNumber": 59058, - "begin": 4239220, - "headersEnd": 4239246, - "end": 4239251, + "beginOffset": 4239220, + "headersEndOffset": 4239246, + "endOffset": 4239251, "octets": 5, "lines": 1 }, - "end": 4239251, "octets": 5 }, - "end": 4239251, "octets": 31, "lines": 4 } ], - "end": 4239263, "octets": 416, "lines": 37 } ], - "end": 4239312, "octets": 20018, "lines": 428 }, - "end": 4239312, "octets": 20018 }, { - "mboxMarkerBegin": 4239313, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4239313, "lineNumber": 59067, - "begin": 4239321, - "headersEnd": 4239982, + "beginOffset": 4239321, + "headersEndOffset": 4239982, + "endOffset": 4312775, "body": { "mimeType": "multipart/mixed", "lineNumber": 59067, - "begin": 4239321, - "headersEnd": 4239982, + "beginOffset": 4239321, + "headersEndOffset": 4239982, + "endOffset": 4312775, "children": [ { "mimeType": "text/plain", "lineNumber": 59083, - "begin": 4240008, - "headersEnd": 4240009, - "end": 4241229, + "beginOffset": 4240008, + "headersEndOffset": 4240009, + "endOffset": 4241229, "octets": 1220, "lines": 27 }, { "mimeType": "image/pbm", "lineNumber": 59112, - "begin": 4241256, - "headersEnd": 4241401, - "end": 4312718, + "beginOffset": 4241256, + "headersEndOffset": 4241401, + "endOffset": 4312718, "octets": 71317, "lines": 370 }, { "mimeType": "text/plain", "lineNumber": 59488, - "begin": 4312745, - "headersEnd": 4312746, - "end": 4312746, + "beginOffset": 4312745, + "headersEndOffset": 4312746, + "endOffset": 4312746, "octets": 0, "lines": 0 } ], - "end": 4312775, "octets": 72793, "lines": 409 }, - "end": 4312775, "octets": 72793 }, { - "mboxMarkerBegin": 4312776, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4312776, "lineNumber": 59493, - "begin": 4312784, - "headersEnd": 4313717, + "beginOffset": 4312784, + "headersEndOffset": 4313717, + "endOffset": 4562758, "body": { "mimeType": "message/partial", "lineNumber": 59493, - "begin": 4312784, - "headersEnd": 4313717, - "end": 4562758, + "beginOffset": 4312784, + "headersEndOffset": 4313717, + "endOffset": 4562758, "octets": 249041, "lines": 3430 }, - "end": 4562758, "octets": 249041 }, { - "mboxMarkerBegin": 4562759, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4562759, "lineNumber": 62945, - "begin": 4562767, - "headersEnd": 4563695, + "beginOffset": 4562767, + "headersEndOffset": 4563695, + "endOffset": 4618504, "body": { "mimeType": "multipart/mixed", "lineNumber": 62945, - "begin": 4562767, - "headersEnd": 4563695, + "beginOffset": 4562767, + "headersEndOffset": 4563695, + "endOffset": 4618504, "children": [ { "mimeType": "text/richtext", "lineNumber": 62971, - "begin": 4563935, - "headersEnd": 4564008, - "end": 4564472, + "beginOffset": 4563935, + "headersEndOffset": 4564008, + "endOffset": 4564472, "octets": 464, "lines": 9 }, { "mimeType": "image/gif", "lineNumber": 62985, - "begin": 4564518, - "headersEnd": 4564577, - "end": 4588813, + "beginOffset": 4564518, + "headersEndOffset": 4564577, + "endOffset": 4588813, "octets": 24236, "lines": 332 }, { "mimeType": "text/richtext", "lineNumber": 63322, - "begin": 4588859, - "headersEnd": 4588932, - "end": 4589380, + "beginOffset": 4588859, + "headersEndOffset": 4588932, + "endOffset": 4589380, "octets": 448, "lines": 10 }, { "mimeType": "image/gif", "lineNumber": 63337, - "begin": 4589426, - "headersEnd": 4589485, - "end": 4600699, + "beginOffset": 4589426, + "headersEndOffset": 4589485, + "endOffset": 4600699, "octets": 11214, "lines": 154 }, { "mimeType": "text/richtext", "lineNumber": 63496, - "begin": 4600745, - "headersEnd": 4600818, - "end": 4601122, + "beginOffset": 4600745, + "headersEndOffset": 4600818, + "endOffset": 4601122, "octets": 304, "lines": 6 }, { "mimeType": "image/gif", "lineNumber": 63507, - "begin": 4601168, - "headersEnd": 4601227, - "end": 4617677, + "beginOffset": 4601168, + "headersEndOffset": 4601227, + "endOffset": 4617677, "octets": 16450, "lines": 226 }, { "mimeType": "text/richtext", "lineNumber": 63738, - "begin": 4617723, - "headersEnd": 4617796, - "end": 4618456, + "beginOffset": 4617723, + "headersEndOffset": 4617796, + "endOffset": 4618456, "octets": 660, "lines": 15 } ], - "end": 4618504, "octets": 54809, "lines": 792 }, - "end": 4618504, "octets": 54809 }, { - "mboxMarkerBegin": 4618505, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4618505, "lineNumber": 63760, - "begin": 4618513, - "headersEnd": 4619332, + "beginOffset": 4618513, + "headersEndOffset": 4619332, + "endOffset": 4666587, "body": { "mimeType": "multipart/mixed", "lineNumber": 63760, - "begin": 4618513, - "headersEnd": 4619332, + "beginOffset": 4618513, + "headersEndOffset": 4619332, + "endOffset": 4666587, "children": [ { "mimeType": "text/plain", "lineNumber": 63777, - "begin": 4619361, - "headersEnd": 4619362, - "end": 4620012, + "beginOffset": 4619361, + "headersEndOffset": 4619362, + "endOffset": 4620012, "octets": 650, "lines": 18 }, { "mimeType": "Image/JPEG", "lineNumber": 63798, - "begin": 4620042, - "headersEnd": 4620102, - "end": 4666555, + "beginOffset": 4620042, + "headersEndOffset": 4620102, + "endOffset": 4666555, "octets": 46453, "lines": 762 } ], - "end": 4666587, "octets": 47255, "lines": 788 }, - "end": 4666587, "octets": 47255 }, { - "mboxMarkerBegin": 4666588, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4666588, "lineNumber": 64566, - "begin": 4666596, - "headersEnd": 4667343, + "beginOffset": 4666596, + "headersEndOffset": 4667343, + "endOffset": 4702358, "body": { "mimeType": "multipart/mixed", "lineNumber": 64566, - "begin": 4666596, - "headersEnd": 4667343, + "beginOffset": 4666596, + "headersEndOffset": 4667343, + "endOffset": 4702358, "children": [ { "mimeType": "text/enriched", "lineNumber": 64588, - "begin": 4667800, - "headersEnd": 4667873, - "end": 4673188, + "beginOffset": 4667800, + "headersEndOffset": 4667873, + "endOffset": 4673188, "octets": 5315, "lines": 160 }, { "mimeType": "image/gif", "lineNumber": 64753, - "begin": 4673212, - "headersEnd": 4673309, - "end": 4675889, + "beginOffset": 4673212, + "headersEndOffset": 4673309, + "endOffset": 4675889, "octets": 2580, "lines": 36 }, { "mimeType": "text/enriched", "lineNumber": 64795, - "begin": 4675913, - "headersEnd": 4675986, - "end": 4676504, + "beginOffset": 4675913, + "headersEndOffset": 4675986, + "endOffset": 4676504, "octets": 518, "lines": 10 }, { "mimeType": "audio/basic", "lineNumber": 64810, - "begin": 4676528, - "headersEnd": 4676642, - "end": 4699702, + "beginOffset": 4676528, + "headersEndOffset": 4676642, + "endOffset": 4699702, "octets": 23060, "lines": 316 }, { "mimeType": "text/enriched", "lineNumber": 65132, - "begin": 4699726, - "headersEnd": 4699799, - "end": 4700377, + "beginOffset": 4699726, + "headersEndOffset": 4699799, + "endOffset": 4700377, "octets": 578, "lines": 14 }, { "mimeType": "message/external-body", "lineNumber": 65151, - "begin": 4700401, - "headersEnd": 4700486, + "beginOffset": 4700401, + "headersEndOffset": 4700486, + "endOffset": 4700555, "message": { "lineNumber": 65155, - "begin": 4700486, - "headersEnd": 4700555, + "beginOffset": 4700486, + "headersEndOffset": 4700555, + "endOffset": 4700555, "body": { "mimeType": "text/plain", "lineNumber": 65155, - "begin": 4700486, - "headersEnd": 4700555, - "end": 4700555, + "beginOffset": 4700486, + "headersEndOffset": 4700555, + "endOffset": 4700555, "octets": 0, "lines": 0 }, - "end": 4700555, "octets": 0 }, - "end": 4700555, "octets": 69, "lines": 2 }, { "mimeType": "text/enriched", "lineNumber": 65159, - "begin": 4700579, - "headersEnd": 4700652, - "end": 4700928, + "beginOffset": 4700579, + "headersEndOffset": 4700652, + "endOffset": 4700928, "octets": 276, "lines": 5 }, { "mimeType": "message/external-body", "lineNumber": 65169, - "begin": 4700952, - "headersEnd": 4701098, + "beginOffset": 4700952, + "headersEndOffset": 4701098, + "endOffset": 4701167, "message": { "lineNumber": 65176, - "begin": 4701098, - "headersEnd": 4701167, + "beginOffset": 4701098, + "headersEndOffset": 4701167, + "endOffset": 4701167, "body": { "mimeType": "text/plain", "lineNumber": 65176, - "begin": 4701098, - "headersEnd": 4701167, - "end": 4701167, + "beginOffset": 4701098, + "headersEndOffset": 4701167, + "endOffset": 4701167, "octets": 0, "lines": 0 }, - "end": 4701167, "octets": 0 }, - "end": 4701167, "octets": 69, "lines": 2 }, { "mimeType": "text/enriched", "lineNumber": 65180, - "begin": 4701191, - "headersEnd": 4701264, - "end": 4702333, + "beginOffset": 4701191, + "headersEndOffset": 4701264, + "endOffset": 4702333, "octets": 1069, "lines": 34 } ], - "end": 4702358, "octets": 35015, "lines": 639 }, - "end": 4702358, "octets": 35015 }, { - "mboxMarkerBegin": 4702359, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4702359, "lineNumber": 65220, - "begin": 4702367, - "headersEnd": 4702528, + "beginOffset": 4702367, + "headersEndOffset": 4702528, + "endOffset": 4779011, "body": { "mimeType": "Multipart/mixed", "lineNumber": 65220, - "begin": 4702367, - "headersEnd": 4702528, + "beginOffset": 4702367, + "headersEndOffset": 4702528, + "endOffset": 4779011, "children": [ { "mimeType": "image/gif", "lineNumber": 65227, - "begin": 4702540, - "headersEnd": 4702609, - "end": 4778953, + "beginOffset": 4702540, + "headersEndOffset": 4702609, + "endOffset": 4778953, "octets": 76344, "lines": 1145 }, { "mimeType": "text/plain", "lineNumber": 66377, - "begin": 4778966, - "headersEnd": 4778967, - "end": 4778997, + "beginOffset": 4778966, + "headersEndOffset": 4778967, + "endOffset": 4778997, "octets": 30, "lines": 1 } ], - "end": 4779011, "octets": 76483, "lines": 1154 }, - "end": 4779011, "octets": 76483 }, { - "mboxMarkerBegin": 4779012, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4779012, "lineNumber": 66381, - "begin": 4779020, - "headersEnd": 4780235, + "beginOffset": 4779020, + "headersEndOffset": 4780235, + "endOffset": 4908685, "body": { "mimeType": "MULTIPART/MIXED", "lineNumber": 66381, - "begin": 4779020, - "headersEnd": 4780235, + "beginOffset": 4779020, + "headersEndOffset": 4780235, + "endOffset": 4908685, "children": [ { "mimeType": "TEXT/plain", "lineNumber": 66405, - "begin": 4780273, - "headersEnd": 4780317, - "end": 4780769, + "beginOffset": 4780273, + "headersEndOffset": 4780317, + "endOffset": 4780769, "octets": 452, "lines": 8 }, { "mimeType": "AUDIO/basic", "lineNumber": 66417, - "begin": 4780808, - "headersEnd": 4780901, - "end": 4908644, + "beginOffset": 4780808, + "headersEndOffset": 4780901, + "endOffset": 4908644, "octets": 127743, "lines": 2095 } ], - "end": 4908685, "octets": 128450, "lines": 2114 }, - "end": 4908685, "octets": 128450 }, { - "mboxMarkerBegin": 4908686, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 4908686, "lineNumber": 68520, - "begin": 4908694, - "headersEnd": 4909446, + "beginOffset": 4908694, + "headersEndOffset": 4909446, + "endOffset": 5083311, "body": { "mimeType": "multipart/alternative", "lineNumber": 68520, - "begin": 4908694, - "headersEnd": 4909446, + "beginOffset": 4908694, + "headersEndOffset": 4909446, + "endOffset": 5083311, "children": [ { "mimeType": "text/plain", "lineNumber": 68544, - "begin": 4909843, - "headersEnd": 4909844, - "end": 4910639, + "beginOffset": 4909843, + "headersEndOffset": 4909844, + "endOffset": 4910639, "octets": 795, "lines": 18 }, { "mimeType": "multipart/mixed", "lineNumber": 68565, - "begin": 4910698, - "headersEnd": 4910801, + "beginOffset": 4910698, + "headersEndOffset": 4910801, + "endOffset": 5083251, "children": [ { "mimeType": "text/richtext", "lineNumber": 68569, - "begin": 4910861, - "headersEnd": 4910934, - "end": 4911423, + "beginOffset": 4910861, + "headersEndOffset": 4910934, + "endOffset": 4911423, "octets": 489, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 68581, - "begin": 4911484, - "headersEnd": 4911580, - "end": 4924570, + "beginOffset": 4911484, + "headersEndOffset": 4911580, + "endOffset": 4924570, "octets": 12990, "lines": 190 }, { "mimeType": "text/plain", "lineNumber": 68777, - "begin": 4924631, - "headersEnd": 4924701, - "end": 4924721, + "beginOffset": 4924631, + "headersEndOffset": 4924701, + "endOffset": 4924721, "octets": 20, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 68783, - "begin": 4924782, - "headersEnd": 4924878, - "end": 4980598, + "beginOffset": 4924782, + "headersEndOffset": 4924878, + "endOffset": 4980598, "octets": 55720, "lines": 764 }, { "mimeType": "text/plain", "lineNumber": 69553, - "begin": 4980659, - "headersEnd": 4980729, - "end": 4980781, + "beginOffset": 4980659, + "headersEndOffset": 4980729, + "endOffset": 4980781, "octets": 52, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 69563, - "begin": 4980842, - "headersEnd": 4980903, - "end": 5083055, + "beginOffset": 4980842, + "headersEndOffset": 4980903, + "endOffset": 5083055, "octets": 102152, "lines": 1400 }, { "mimeType": "text/plain", "lineNumber": 70968, - "begin": 5083116, - "headersEnd": 5083186, - "end": 5083188, + "beginOffset": 5083116, + "headersEndOffset": 5083186, + "endOffset": 5083188, "octets": 2, "lines": 2 } ], - "end": 5083251, "octets": 172450, "lines": 2407 } ], - "end": 5083311, "octets": 173865, "lines": 2440 }, - "end": 5083311, "octets": 173865 }, { - "mboxMarkerBegin": 5083312, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5083312, "lineNumber": 70978, - "begin": 5083320, - "headersEnd": 5084006, + "beginOffset": 5083320, + "headersEndOffset": 5084006, + "endOffset": 5299088, "body": { "mimeType": "multipart/alternative", "lineNumber": 70978, - "begin": 5083320, - "headersEnd": 5084006, + "beginOffset": 5083320, + "headersEndOffset": 5084006, + "endOffset": 5299088, "children": [ { "mimeType": "text/plain", "lineNumber": 70998, - "begin": 5084201, - "headersEnd": 5084245, - "end": 5085760, + "beginOffset": 5084201, + "headersEndOffset": 5084245, + "endOffset": 5085760, "octets": 1515, "lines": 29 }, { "mimeType": "multipart/mixed", "lineNumber": 71031, - "begin": 5085801, - "headersEnd": 5085886, + "beginOffset": 5085801, + "headersEndOffset": 5085886, + "endOffset": 5299046, "children": [ { "mimeType": "text/richtext", "lineNumber": 71035, - "begin": 5085928, - "headersEnd": 5086019, - "end": 5086926, + "beginOffset": 5085928, + "headersEndOffset": 5086019, + "endOffset": 5086926, "octets": 907, "lines": 13 }, { "mimeType": "image/gif", "lineNumber": 71053, - "begin": 5086969, - "headersEnd": 5087060, - "end": 5121918, + "beginOffset": 5086969, + "headersEndOffset": 5087060, + "endOffset": 5121918, "octets": 34858, "lines": 506 }, { "mimeType": "text/richtext", "lineNumber": 71565, - "begin": 5121961, - "headersEnd": 5122052, - "end": 5122062, + "beginOffset": 5121961, + "headersEndOffset": 5122052, + "endOffset": 5122062, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 71572, - "begin": 5122105, - "headersEnd": 5122196, - "end": 5143530, + "beginOffset": 5122105, + "headersEndOffset": 5122196, + "endOffset": 5143530, "octets": 21334, "lines": 310 }, { "mimeType": "text/richtext", "lineNumber": 71888, - "begin": 5143573, - "headersEnd": 5143664, - "end": 5143674, + "beginOffset": 5143573, + "headersEndOffset": 5143664, + "endOffset": 5143674, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 71895, - "begin": 5143717, - "headersEnd": 5143808, - "end": 5176251, + "beginOffset": 5143717, + "headersEndOffset": 5143808, + "endOffset": 5176251, "octets": 32443, "lines": 471 }, { "mimeType": "text/richtext", "lineNumber": 72372, - "begin": 5176294, - "headersEnd": 5176385, - "end": 5176395, + "beginOffset": 5176294, + "headersEndOffset": 5176385, + "endOffset": 5176395, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 72379, - "begin": 5176438, - "headersEnd": 5176529, - "end": 5209970, + "beginOffset": 5176438, + "headersEndOffset": 5176529, + "endOffset": 5209970, "octets": 33441, "lines": 485 }, { "mimeType": "text/richtext", "lineNumber": 72870, - "begin": 5210013, - "headersEnd": 5210104, - "end": 5210114, + "beginOffset": 5210013, + "headersEndOffset": 5210104, + "endOffset": 5210114, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 72877, - "begin": 5210157, - "headersEnd": 5210248, - "end": 5238084, + "beginOffset": 5210157, + "headersEndOffset": 5210248, + "endOffset": 5238084, "octets": 27836, "lines": 404 }, { "mimeType": "text/richtext", "lineNumber": 73287, - "begin": 5238127, - "headersEnd": 5238218, - "end": 5238228, + "beginOffset": 5238127, + "headersEndOffset": 5238218, + "endOffset": 5238228, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 73294, - "begin": 5238271, - "headersEnd": 5238362, - "end": 5271856, + "beginOffset": 5238271, + "headersEndOffset": 5238362, + "endOffset": 5271856, "octets": 33494, "lines": 486 }, { "mimeType": "text/richtext", "lineNumber": 73786, - "begin": 5271899, - "headersEnd": 5271990, - "end": 5272000, + "beginOffset": 5271899, + "headersEndOffset": 5271990, + "endOffset": 5272000, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 73793, - "begin": 5272043, - "headersEnd": 5272134, - "end": 5298793, + "beginOffset": 5272043, + "headersEndOffset": 5272134, + "endOffset": 5298793, "octets": 26659, "lines": 387 }, { "mimeType": "text/richtext", "lineNumber": 74186, - "begin": 5298836, - "headersEnd": 5298927, - "end": 5299001, + "beginOffset": 5298836, + "headersEndOffset": 5298927, + "endOffset": 5299001, "octets": 74, "lines": 3 } ], - "end": 5299046, "octets": 213160, "lines": 3160 } ], - "end": 5299088, "octets": 215082, "lines": 3202 }, - "end": 5299088, "octets": 215082 }, { - "mboxMarkerBegin": 5299089, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5299089, "lineNumber": 74197, - "begin": 5299097, - "headersEnd": 5299489, + "beginOffset": 5299097, + "headersEndOffset": 5299489, + "endOffset": 5388898, "body": { "mimeType": "multipart/mixed", "lineNumber": 74197, - "begin": 5299097, - "headersEnd": 5299489, + "beginOffset": 5299097, + "headersEndOffset": 5299489, + "endOffset": 5388898, "children": [ { "mimeType": "text/richtext", "lineNumber": 74215, - "begin": 5299733, - "headersEnd": 5299828, - "end": 5300031, + "beginOffset": 5299733, + "headersEndOffset": 5299828, + "endOffset": 5300031, "octets": 203, "lines": 9 }, { "mimeType": "audio/basic", "lineNumber": 74229, - "begin": 5300081, - "headersEnd": 5300142, - "end": 5388740, + "beginOffset": 5300081, + "headersEndOffset": 5300142, + "endOffset": 5388740, "octets": 88598, "lines": 1214 }, { "mimeType": "text/plain", "lineNumber": 75448, - "begin": 5388790, - "headersEnd": 5388816, - "end": 5388846, + "beginOffset": 5388790, + "headersEndOffset": 5388816, + "endOffset": 5388846, "octets": 30, "lines": 1 } ], - "end": 5388898, "octets": 89409, "lines": 1243 }, - "end": 5388898, "octets": 89409 }, { - "mboxMarkerBegin": 5388899, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5388899, "lineNumber": 75455, - "begin": 5388907, - "headersEnd": 5389843, + "beginOffset": 5388907, + "headersEndOffset": 5389843, + "endOffset": 5440552, "body": { "mimeType": "message/partial", "lineNumber": 75455, - "begin": 5388907, - "headersEnd": 5389843, - "end": 5440552, + "beginOffset": 5388907, + "headersEndOffset": 5389843, + "endOffset": 5440552, "octets": 50709, "lines": 696 }, - "end": 5440552, "octets": 50709 }, { - "mboxMarkerBegin": 5440553, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5440553, "lineNumber": 76173, - "begin": 5440561, - "headersEnd": 5441173, + "beginOffset": 5440561, + "headersEndOffset": 5441173, + "endOffset": 5509954, "body": { "mimeType": "multipart/mixed", "lineNumber": 76173, - "begin": 5440561, - "headersEnd": 5441173, + "beginOffset": 5440561, + "headersEndOffset": 5441173, + "endOffset": 5509954, "children": [ { "mimeType": "text/plain", "lineNumber": 76191, - "begin": 5441191, - "headersEnd": 5441192, - "end": 5445509, + "beginOffset": 5441191, + "headersEndOffset": 5441192, + "endOffset": 5445509, "octets": 4317, "lines": 101 }, { "mimeType": "multipart/digest", "lineNumber": 76295, - "begin": 5445528, - "headersEnd": 5445669, + "beginOffset": 5445528, + "headersEndOffset": 5445669, + "endOffset": 5509879, "children": [ { "mimeType": "message/rfc822", "lineNumber": 76299, - "begin": 5445700, - "headersEnd": 5445701, + "beginOffset": 5445700, + "headersEndOffset": 5445701, + "endOffset": 5446427, "message": { "lineNumber": 76300, - "begin": 5445701, - "headersEnd": 5445806, + "beginOffset": 5445701, + "headersEndOffset": 5445806, + "endOffset": 5446427, "body": { "mimeType": "text/plain", "lineNumber": 76300, - "begin": 5445701, - "headersEnd": 5445806, - "end": 5446427, + "beginOffset": 5445701, + "headersEndOffset": 5445806, + "endOffset": 5446427, "octets": 621, "lines": 18 }, - "end": 5446427, "octets": 621 }, - "end": 5446427, "octets": 726, "lines": 22 }, { "mimeType": "message/rfc822", "lineNumber": 76324, - "begin": 5446459, - "headersEnd": 5446460, + "beginOffset": 5446459, + "headersEndOffset": 5446460, + "endOffset": 5447314, "message": { "lineNumber": 76325, - "begin": 5446460, - "headersEnd": 5446581, + "beginOffset": 5446460, + "headersEndOffset": 5446581, + "endOffset": 5447314, "body": { "mimeType": "text/plain", "lineNumber": 76325, - "begin": 5446460, - "headersEnd": 5446581, - "end": 5447314, + "beginOffset": 5446460, + "headersEndOffset": 5446581, + "endOffset": 5447314, "octets": 733, "lines": 20 }, - "end": 5447314, "octets": 733 }, - "end": 5447314, "octets": 854, "lines": 24 }, { "mimeType": "message/rfc822", "lineNumber": 76351, - "begin": 5447346, - "headersEnd": 5447347, + "beginOffset": 5447346, + "headersEndOffset": 5447347, + "endOffset": 5448112, "message": { "lineNumber": 76352, - "begin": 5447347, - "headersEnd": 5447466, + "beginOffset": 5447347, + "headersEndOffset": 5447466, + "endOffset": 5448112, "body": { "mimeType": "text/plain", "lineNumber": 76352, - "begin": 5447347, - "headersEnd": 5447466, - "end": 5448112, + "beginOffset": 5447347, + "headersEndOffset": 5447466, + "endOffset": 5448112, "octets": 646, "lines": 14 }, - "end": 5448112, "octets": 646 }, - "end": 5448112, "octets": 765, "lines": 18 }, { "mimeType": "message/rfc822", "lineNumber": 76372, - "begin": 5448144, - "headersEnd": 5448145, + "beginOffset": 5448144, + "headersEndOffset": 5448145, + "endOffset": 5448784, "message": { "lineNumber": 76373, - "begin": 5448145, - "headersEnd": 5448301, + "beginOffset": 5448145, + "headersEndOffset": 5448301, + "endOffset": 5448784, "body": { "mimeType": "text/plain", "lineNumber": 76373, - "begin": 5448145, - "headersEnd": 5448301, - "end": 5448784, + "beginOffset": 5448145, + "headersEndOffset": 5448301, + "endOffset": 5448784, "octets": 483, "lines": 10 }, - "end": 5448784, "octets": 483 }, - "end": 5448784, "octets": 639, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 76389, - "begin": 5448816, - "headersEnd": 5448817, + "beginOffset": 5448816, + "headersEndOffset": 5448817, + "endOffset": 5449543, "message": { "lineNumber": 76390, - "begin": 5448817, - "headersEnd": 5448971, + "beginOffset": 5448817, + "headersEndOffset": 5448971, + "endOffset": 5449543, "body": { "mimeType": "text/plain", "lineNumber": 76390, - "begin": 5448817, - "headersEnd": 5448971, - "end": 5449543, + "beginOffset": 5448817, + "headersEndOffset": 5448971, + "endOffset": 5449543, "octets": 572, "lines": 15 }, - "end": 5449543, "octets": 572 }, - "end": 5449543, "octets": 726, "lines": 19 }, { "mimeType": "message/rfc822", "lineNumber": 76411, - "begin": 5449575, - "headersEnd": 5449576, + "beginOffset": 5449575, + "headersEndOffset": 5449576, + "endOffset": 5451008, "message": { "lineNumber": 76412, - "begin": 5449576, - "headersEnd": 5449733, + "beginOffset": 5449576, + "headersEndOffset": 5449733, + "endOffset": 5451008, "body": { "mimeType": "text/plain", "lineNumber": 76412, - "begin": 5449576, - "headersEnd": 5449733, - "end": 5451008, + "beginOffset": 5449576, + "headersEndOffset": 5449733, + "endOffset": 5451008, "octets": 1275, "lines": 26 }, - "end": 5451008, "octets": 1275 }, - "end": 5451008, "octets": 1432, "lines": 30 }, { "mimeType": "message/rfc822", "lineNumber": 76444, - "begin": 5451040, - "headersEnd": 5451041, + "beginOffset": 5451040, + "headersEndOffset": 5451041, + "endOffset": 5451595, "message": { "lineNumber": 76445, - "begin": 5451041, - "headersEnd": 5451194, + "beginOffset": 5451041, + "headersEndOffset": 5451194, + "endOffset": 5451595, "body": { "mimeType": "text/plain", "lineNumber": 76445, - "begin": 5451041, - "headersEnd": 5451194, - "end": 5451595, + "beginOffset": 5451041, + "headersEndOffset": 5451194, + "endOffset": 5451595, "octets": 401, "lines": 9 }, - "end": 5451595, "octets": 401 }, - "end": 5451595, "octets": 554, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76460, - "begin": 5451627, - "headersEnd": 5451628, + "beginOffset": 5451627, + "headersEndOffset": 5451628, + "endOffset": 5452171, "message": { "lineNumber": 76461, - "begin": 5451628, - "headersEnd": 5451775, + "beginOffset": 5451628, + "headersEndOffset": 5451775, + "endOffset": 5452171, "body": { "mimeType": "text/plain", "lineNumber": 76461, - "begin": 5451628, - "headersEnd": 5451775, - "end": 5452171, + "beginOffset": 5451628, + "headersEndOffset": 5451775, + "endOffset": 5452171, "octets": 396, "lines": 7 }, - "end": 5452171, "octets": 396 }, - "end": 5452171, "octets": 543, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76474, - "begin": 5452203, - "headersEnd": 5452204, + "beginOffset": 5452203, + "headersEndOffset": 5452204, + "endOffset": 5452987, "message": { "lineNumber": 76475, - "begin": 5452204, - "headersEnd": 5452347, + "beginOffset": 5452204, + "headersEndOffset": 5452347, + "endOffset": 5452987, "body": { "mimeType": "text/plain", "lineNumber": 76475, - "begin": 5452204, - "headersEnd": 5452347, - "end": 5452987, + "beginOffset": 5452204, + "headersEndOffset": 5452347, + "endOffset": 5452987, "octets": 640, "lines": 11 }, - "end": 5452987, "octets": 640 }, - "end": 5452987, "octets": 783, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 76492, - "begin": 5453019, - "headersEnd": 5453020, + "beginOffset": 5453019, + "headersEndOffset": 5453020, + "endOffset": 5454134, "message": { "lineNumber": 76493, - "begin": 5453020, - "headersEnd": 5453157, + "beginOffset": 5453020, + "headersEndOffset": 5453157, + "endOffset": 5454134, "body": { "mimeType": "text/plain", "lineNumber": 76493, - "begin": 5453020, - "headersEnd": 5453157, - "end": 5454134, + "beginOffset": 5453020, + "headersEndOffset": 5453157, + "endOffset": 5454134, "octets": 977, "lines": 19 }, - "end": 5454134, "octets": 977 }, - "end": 5454134, "octets": 1114, "lines": 23 }, { "mimeType": "message/rfc822", "lineNumber": 76518, - "begin": 5454166, - "headersEnd": 5454167, + "beginOffset": 5454166, + "headersEndOffset": 5454167, + "endOffset": 5455204, "message": { "lineNumber": 76519, - "begin": 5454167, - "headersEnd": 5454314, + "beginOffset": 5454167, + "headersEndOffset": 5454314, + "endOffset": 5455204, "body": { "mimeType": "text/plain", "lineNumber": 76519, - "begin": 5454167, - "headersEnd": 5454314, - "end": 5455204, + "beginOffset": 5454167, + "headersEndOffset": 5454314, + "endOffset": 5455204, "octets": 890, "lines": 27 }, - "end": 5455204, "octets": 890 }, - "end": 5455204, "octets": 1037, "lines": 31 }, { "mimeType": "message/rfc822", "lineNumber": 76552, - "begin": 5455236, - "headersEnd": 5455237, + "beginOffset": 5455236, + "headersEndOffset": 5455237, + "endOffset": 5455927, "message": { "lineNumber": 76553, - "begin": 5455237, - "headersEnd": 5455368, + "beginOffset": 5455237, + "headersEndOffset": 5455368, + "endOffset": 5455927, "body": { "mimeType": "text/plain", "lineNumber": 76553, - "begin": 5455237, - "headersEnd": 5455368, - "end": 5455927, + "beginOffset": 5455237, + "headersEndOffset": 5455368, + "endOffset": 5455927, "octets": 559, "lines": 11 }, - "end": 5455927, "octets": 559 }, - "end": 5455927, "octets": 690, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 76570, - "begin": 5455959, - "headersEnd": 5455960, + "beginOffset": 5455959, + "headersEndOffset": 5455960, + "endOffset": 5456529, "message": { "lineNumber": 76571, - "begin": 5455960, - "headersEnd": 5456092, + "beginOffset": 5455960, + "headersEndOffset": 5456092, + "endOffset": 5456529, "body": { "mimeType": "text/plain", "lineNumber": 76571, - "begin": 5455960, - "headersEnd": 5456092, - "end": 5456529, + "beginOffset": 5455960, + "headersEndOffset": 5456092, + "endOffset": 5456529, "octets": 437, "lines": 10 }, - "end": 5456529, "octets": 437 }, - "end": 5456529, "octets": 569, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 76587, - "begin": 5456561, - "headersEnd": 5456562, + "beginOffset": 5456561, + "headersEndOffset": 5456562, + "endOffset": 5457231, "message": { "lineNumber": 76588, - "begin": 5456562, - "headersEnd": 5456679, + "beginOffset": 5456562, + "headersEndOffset": 5456679, + "endOffset": 5457231, "body": { "mimeType": "text/plain", "lineNumber": 76588, - "begin": 5456562, - "headersEnd": 5456679, - "end": 5457231, + "beginOffset": 5456562, + "headersEndOffset": 5456679, + "endOffset": 5457231, "octets": 552, "lines": 15 }, - "end": 5457231, "octets": 552 }, - "end": 5457231, "octets": 669, "lines": 19 }, { "mimeType": "message/rfc822", "lineNumber": 76609, - "begin": 5457263, - "headersEnd": 5457264, + "beginOffset": 5457263, + "headersEndOffset": 5457264, + "endOffset": 5457564, "message": { "lineNumber": 76610, - "begin": 5457264, - "headersEnd": 5457379, + "beginOffset": 5457264, + "headersEndOffset": 5457379, + "endOffset": 5457564, "body": { "mimeType": "text/plain", "lineNumber": 76610, - "begin": 5457264, - "headersEnd": 5457379, - "end": 5457564, + "beginOffset": 5457264, + "headersEndOffset": 5457379, + "endOffset": 5457564, "octets": 185, "lines": 8 }, - "end": 5457564, "octets": 185 }, - "end": 5457564, "octets": 300, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 76624, - "begin": 5457596, - "headersEnd": 5457597, + "beginOffset": 5457596, + "headersEndOffset": 5457597, + "endOffset": 5458042, "message": { "lineNumber": 76625, - "begin": 5457597, - "headersEnd": 5457714, + "beginOffset": 5457597, + "headersEndOffset": 5457714, + "endOffset": 5458042, "body": { "mimeType": "text/plain", "lineNumber": 76625, - "begin": 5457597, - "headersEnd": 5457714, - "end": 5458042, + "beginOffset": 5457597, + "headersEndOffset": 5457714, + "endOffset": 5458042, "octets": 328, "lines": 7 }, - "end": 5458042, "octets": 328 }, - "end": 5458042, "octets": 445, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76638, - "begin": 5458074, - "headersEnd": 5458075, + "beginOffset": 5458074, + "headersEndOffset": 5458075, + "endOffset": 5458865, "message": { "lineNumber": 76639, - "begin": 5458075, - "headersEnd": 5458198, + "beginOffset": 5458075, + "headersEndOffset": 5458198, + "endOffset": 5458865, "body": { "mimeType": "text/plain", "lineNumber": 76639, - "begin": 5458075, - "headersEnd": 5458198, - "end": 5458865, + "beginOffset": 5458075, + "headersEndOffset": 5458198, + "endOffset": 5458865, "octets": 667, "lines": 21 }, - "end": 5458865, "octets": 667 }, - "end": 5458865, "octets": 790, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 76666, - "begin": 5458897, - "headersEnd": 5458898, + "beginOffset": 5458897, + "headersEndOffset": 5458898, + "endOffset": 5459124, "message": { "lineNumber": 76667, - "begin": 5458898, - "headersEnd": 5459022, + "beginOffset": 5458898, + "headersEndOffset": 5459022, + "endOffset": 5459124, "body": { "mimeType": "text/plain", "lineNumber": 76667, - "begin": 5458898, - "headersEnd": 5459022, - "end": 5459124, + "beginOffset": 5458898, + "headersEndOffset": 5459022, + "endOffset": 5459124, "octets": 102, "lines": 5 }, - "end": 5459124, "octets": 102 }, - "end": 5459124, "octets": 226, "lines": 9 }, { "mimeType": "message/rfc822", "lineNumber": 76678, - "begin": 5459156, - "headersEnd": 5459157, + "beginOffset": 5459156, + "headersEndOffset": 5459157, + "endOffset": 5460135, "message": { "lineNumber": 76679, - "begin": 5459157, - "headersEnd": 5459299, + "beginOffset": 5459157, + "headersEndOffset": 5459299, + "endOffset": 5460135, "body": { "mimeType": "text/plain", "lineNumber": 76679, - "begin": 5459157, - "headersEnd": 5459299, - "end": 5460135, + "beginOffset": 5459157, + "headersEndOffset": 5459299, + "endOffset": 5460135, "octets": 836, "lines": 21 }, - "end": 5460135, "octets": 836 }, - "end": 5460135, "octets": 978, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 76706, - "begin": 5460167, - "headersEnd": 5460168, + "beginOffset": 5460167, + "headersEndOffset": 5460168, + "endOffset": 5460697, "message": { "lineNumber": 76707, - "begin": 5460168, - "headersEnd": 5460278, + "beginOffset": 5460168, + "headersEndOffset": 5460278, + "endOffset": 5460697, "body": { "mimeType": "text/plain", "lineNumber": 76707, - "begin": 5460168, - "headersEnd": 5460278, - "end": 5460697, + "beginOffset": 5460168, + "headersEndOffset": 5460278, + "endOffset": 5460697, "octets": 419, "lines": 9 }, - "end": 5460697, "octets": 419 }, - "end": 5460697, "octets": 529, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76722, - "begin": 5460729, - "headersEnd": 5460730, + "beginOffset": 5460729, + "headersEndOffset": 5460730, + "endOffset": 5461132, "message": { "lineNumber": 76723, - "begin": 5460730, - "headersEnd": 5460902, + "beginOffset": 5460730, + "headersEndOffset": 5460902, + "endOffset": 5461132, "body": { "mimeType": "text/plain", "lineNumber": 76723, - "begin": 5460730, - "headersEnd": 5460902, - "end": 5461132, + "beginOffset": 5460730, + "headersEndOffset": 5460902, + "endOffset": 5461132, "octets": 230, "lines": 9 }, - "end": 5461132, "octets": 230 }, - "end": 5461132, "octets": 402, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76738, - "begin": 5461164, - "headersEnd": 5461165, + "beginOffset": 5461164, + "headersEndOffset": 5461165, + "endOffset": 5461690, "message": { "lineNumber": 76739, - "begin": 5461165, - "headersEnd": 5461291, + "beginOffset": 5461165, + "headersEndOffset": 5461291, + "endOffset": 5461690, "body": { "mimeType": "text/plain", "lineNumber": 76739, - "begin": 5461165, - "headersEnd": 5461291, - "end": 5461690, + "beginOffset": 5461165, + "headersEndOffset": 5461291, + "endOffset": 5461690, "octets": 399, "lines": 12 }, - "end": 5461690, "octets": 399 }, - "end": 5461690, "octets": 525, "lines": 16 }, { "mimeType": "message/rfc822", "lineNumber": 76757, - "begin": 5461722, - "headersEnd": 5461723, + "beginOffset": 5461722, + "headersEndOffset": 5461723, + "endOffset": 5462744, "message": { "lineNumber": 76758, - "begin": 5461723, - "headersEnd": 5461840, + "beginOffset": 5461723, + "headersEndOffset": 5461840, + "endOffset": 5462744, "body": { "mimeType": "text/plain", "lineNumber": 76758, - "begin": 5461723, - "headersEnd": 5461840, - "end": 5462744, + "beginOffset": 5461723, + "headersEndOffset": 5461840, + "endOffset": 5462744, "octets": 904, "lines": 28 }, - "end": 5462744, "octets": 904 }, - "end": 5462744, "octets": 1021, "lines": 32 }, { "mimeType": "message/rfc822", "lineNumber": 76792, - "begin": 5462776, - "headersEnd": 5462777, + "beginOffset": 5462776, + "headersEndOffset": 5462777, + "endOffset": 5463196, "message": { "lineNumber": 76793, - "begin": 5462777, - "headersEnd": 5462905, + "beginOffset": 5462777, + "headersEndOffset": 5462905, + "endOffset": 5463196, "body": { "mimeType": "text/plain", "lineNumber": 76793, - "begin": 5462777, - "headersEnd": 5462905, - "end": 5463196, + "beginOffset": 5462777, + "headersEndOffset": 5462905, + "endOffset": 5463196, "octets": 291, "lines": 9 }, - "end": 5463196, "octets": 291 }, - "end": 5463196, "octets": 419, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 76808, - "begin": 5463228, - "headersEnd": 5463229, + "beginOffset": 5463228, + "headersEndOffset": 5463229, + "endOffset": 5463768, "message": { "lineNumber": 76809, - "begin": 5463229, - "headersEnd": 5463358, + "beginOffset": 5463229, + "headersEndOffset": 5463358, + "endOffset": 5463768, "body": { "mimeType": "text/plain", "lineNumber": 76809, - "begin": 5463229, - "headersEnd": 5463358, - "end": 5463768, + "beginOffset": 5463229, + "headersEndOffset": 5463358, + "endOffset": 5463768, "octets": 410, "lines": 14 }, - "end": 5463768, "octets": 410 }, - "end": 5463768, "octets": 539, "lines": 18 }, { "mimeType": "message/rfc822", "lineNumber": 76829, - "begin": 5463800, - "headersEnd": 5463801, + "beginOffset": 5463800, + "headersEndOffset": 5463801, + "endOffset": 5464061, "message": { "lineNumber": 76830, - "begin": 5463801, - "headersEnd": 5463916, + "beginOffset": 5463801, + "headersEndOffset": 5463916, + "endOffset": 5464061, "body": { "mimeType": "text/plain", "lineNumber": 76830, - "begin": 5463801, - "headersEnd": 5463916, - "end": 5464061, + "beginOffset": 5463801, + "headersEndOffset": 5463916, + "endOffset": 5464061, "octets": 145, "lines": 4 }, - "end": 5464061, "octets": 145 }, - "end": 5464061, "octets": 260, "lines": 8 }, { "mimeType": "message/rfc822", "lineNumber": 76840, - "begin": 5464093, - "headersEnd": 5464094, + "beginOffset": 5464093, + "headersEndOffset": 5464094, + "endOffset": 5464398, "message": { "lineNumber": 76841, - "begin": 5464094, - "headersEnd": 5464219, + "beginOffset": 5464094, + "headersEndOffset": 5464219, + "endOffset": 5464398, "body": { "mimeType": "text/plain", "lineNumber": 76841, - "begin": 5464094, - "headersEnd": 5464219, - "end": 5464398, + "beginOffset": 5464094, + "headersEndOffset": 5464219, + "endOffset": 5464398, "octets": 179, "lines": 7 }, - "end": 5464398, "octets": 179 }, - "end": 5464398, "octets": 304, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76854, - "begin": 5464430, - "headersEnd": 5464431, + "beginOffset": 5464430, + "headersEndOffset": 5464431, + "endOffset": 5465277, "message": { "lineNumber": 76855, - "begin": 5464431, - "headersEnd": 5464561, + "beginOffset": 5464431, + "headersEndOffset": 5464561, + "endOffset": 5465277, "body": { "mimeType": "text/plain", "lineNumber": 76855, - "begin": 5464431, - "headersEnd": 5464561, - "end": 5465277, + "beginOffset": 5464431, + "headersEndOffset": 5464561, + "endOffset": 5465277, "octets": 716, "lines": 14 }, - "end": 5465277, "octets": 716 }, - "end": 5465277, "octets": 846, "lines": 18 }, { "mimeType": "message/rfc822", "lineNumber": 76875, - "begin": 5465309, - "headersEnd": 5465310, + "beginOffset": 5465309, + "headersEndOffset": 5465310, + "endOffset": 5466413, "message": { "lineNumber": 76876, - "begin": 5465310, - "headersEnd": 5465456, + "beginOffset": 5465310, + "headersEndOffset": 5465456, + "endOffset": 5466413, "body": { "mimeType": "text/plain", "lineNumber": 76876, - "begin": 5465310, - "headersEnd": 5465456, - "end": 5466413, + "beginOffset": 5465310, + "headersEndOffset": 5465456, + "endOffset": 5466413, "octets": 957, "lines": 26 }, - "end": 5466413, "octets": 957 }, - "end": 5466413, "octets": 1103, "lines": 30 }, { "mimeType": "message/rfc822", "lineNumber": 76908, - "begin": 5466445, - "headersEnd": 5466446, + "beginOffset": 5466445, + "headersEndOffset": 5466446, + "endOffset": 5466827, "message": { "lineNumber": 76909, - "begin": 5466446, - "headersEnd": 5466580, + "beginOffset": 5466446, + "headersEndOffset": 5466580, + "endOffset": 5466827, "body": { "mimeType": "text/plain", "lineNumber": 76909, - "begin": 5466446, - "headersEnd": 5466580, - "end": 5466827, + "beginOffset": 5466446, + "headersEndOffset": 5466580, + "endOffset": 5466827, "octets": 247, "lines": 7 }, - "end": 5466827, "octets": 247 }, - "end": 5466827, "octets": 381, "lines": 11 }, { "mimeType": "message/rfc822", "lineNumber": 76922, - "begin": 5466859, - "headersEnd": 5466860, + "beginOffset": 5466859, + "headersEndOffset": 5466860, + "endOffset": 5467109, "message": { "lineNumber": 76923, - "begin": 5466860, - "headersEnd": 5466982, + "beginOffset": 5466860, + "headersEndOffset": 5466982, + "endOffset": 5467109, "body": { "mimeType": "text/plain", "lineNumber": 76923, - "begin": 5466860, - "headersEnd": 5466982, - "end": 5467109, + "beginOffset": 5466860, + "headersEndOffset": 5466982, + "endOffset": 5467109, "octets": 127, "lines": 6 }, - "end": 5467109, "octets": 127 }, - "end": 5467109, "octets": 249, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 76935, - "begin": 5467141, - "headersEnd": 5467142, + "beginOffset": 5467141, + "headersEndOffset": 5467142, + "endOffset": 5468062, "message": { "lineNumber": 76936, - "begin": 5467142, - "headersEnd": 5467317, + "beginOffset": 5467142, + "headersEndOffset": 5467317, + "endOffset": 5468062, "body": { "mimeType": "text/plain", "lineNumber": 76936, - "begin": 5467142, - "headersEnd": 5467317, - "end": 5468062, + "beginOffset": 5467142, + "headersEndOffset": 5467317, + "endOffset": 5468062, "octets": 745, "lines": 16 }, - "end": 5468062, "octets": 745 }, - "end": 5468062, "octets": 920, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 76959, - "begin": 5468094, - "headersEnd": 5468095, + "beginOffset": 5468094, + "headersEndOffset": 5468095, + "endOffset": 5468654, "message": { "lineNumber": 76960, - "begin": 5468095, - "headersEnd": 5468255, + "beginOffset": 5468095, + "headersEndOffset": 5468255, + "endOffset": 5468654, "body": { "mimeType": "text/plain", "lineNumber": 76960, - "begin": 5468095, - "headersEnd": 5468255, - "end": 5468654, + "beginOffset": 5468095, + "headersEndOffset": 5468255, + "endOffset": 5468654, "octets": 399, "lines": 16 }, - "end": 5468654, "octets": 399 }, - "end": 5468654, "octets": 559, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 76982, - "begin": 5468686, - "headersEnd": 5468687, + "beginOffset": 5468686, + "headersEndOffset": 5468687, + "endOffset": 5470106, "message": { "lineNumber": 76983, - "begin": 5468687, - "headersEnd": 5468819, + "beginOffset": 5468687, + "headersEndOffset": 5468819, + "endOffset": 5470106, "body": { "mimeType": "text/plain", "lineNumber": 76983, - "begin": 5468687, - "headersEnd": 5468819, - "end": 5470106, + "beginOffset": 5468687, + "headersEndOffset": 5468819, + "endOffset": 5470106, "octets": 1287, "lines": 21 }, - "end": 5470106, "octets": 1287 }, - "end": 5470106, "octets": 1419, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 77010, - "begin": 5470138, - "headersEnd": 5470139, + "beginOffset": 5470138, + "headersEndOffset": 5470139, + "endOffset": 5470388, "message": { "lineNumber": 77011, - "begin": 5470139, - "headersEnd": 5470245, + "beginOffset": 5470139, + "headersEndOffset": 5470245, + "endOffset": 5470388, "body": { "mimeType": "text/plain", "lineNumber": 77011, - "begin": 5470139, - "headersEnd": 5470245, - "end": 5470388, + "beginOffset": 5470139, + "headersEndOffset": 5470245, + "endOffset": 5470388, "octets": 143, "lines": 6 }, - "end": 5470388, "octets": 143 }, - "end": 5470388, "octets": 249, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 77023, - "begin": 5470420, - "headersEnd": 5470421, + "beginOffset": 5470420, + "headersEndOffset": 5470421, + "endOffset": 5470857, "message": { "lineNumber": 77024, - "begin": 5470421, - "headersEnd": 5470558, + "beginOffset": 5470421, + "headersEndOffset": 5470558, + "endOffset": 5470857, "body": { "mimeType": "text/plain", "lineNumber": 77024, - "begin": 5470421, - "headersEnd": 5470558, - "end": 5470857, + "beginOffset": 5470421, + "headersEndOffset": 5470558, + "endOffset": 5470857, "octets": 299, "lines": 11 }, - "end": 5470857, "octets": 299 }, - "end": 5470857, "octets": 436, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 77041, - "begin": 5470889, - "headersEnd": 5470890, + "beginOffset": 5470889, + "headersEndOffset": 5470890, + "endOffset": 5471203, "message": { "lineNumber": 77042, - "begin": 5470890, - "headersEnd": 5471016, + "beginOffset": 5470890, + "headersEndOffset": 5471016, + "endOffset": 5471203, "body": { "mimeType": "text/plain", "lineNumber": 77042, - "begin": 5470890, - "headersEnd": 5471016, - "end": 5471203, + "beginOffset": 5470890, + "headersEndOffset": 5471016, + "endOffset": 5471203, "octets": 187, "lines": 6 }, - "end": 5471203, "octets": 187 }, - "end": 5471203, "octets": 313, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 77054, - "begin": 5471235, - "headersEnd": 5471236, + "beginOffset": 5471235, + "headersEndOffset": 5471236, + "endOffset": 5471739, "message": { "lineNumber": 77055, - "begin": 5471236, - "headersEnd": 5471341, + "beginOffset": 5471236, + "headersEndOffset": 5471341, + "endOffset": 5471739, "body": { "mimeType": "text/plain", "lineNumber": 77055, - "begin": 5471236, - "headersEnd": 5471341, - "end": 5471739, + "beginOffset": 5471236, + "headersEndOffset": 5471341, + "endOffset": 5471739, "octets": 398, "lines": 12 }, - "end": 5471739, "octets": 398 }, - "end": 5471739, "octets": 503, "lines": 16 }, { "mimeType": "message/rfc822", "lineNumber": 77073, - "begin": 5471771, - "headersEnd": 5471772, + "beginOffset": 5471771, + "headersEndOffset": 5471772, + "endOffset": 5472208, "message": { "lineNumber": 77074, - "begin": 5471772, - "headersEnd": 5471906, + "beginOffset": 5471772, + "headersEndOffset": 5471906, + "endOffset": 5472208, "body": { "mimeType": "text/plain", "lineNumber": 77074, - "begin": 5471772, - "headersEnd": 5471906, - "end": 5472208, + "beginOffset": 5471772, + "headersEndOffset": 5471906, + "endOffset": 5472208, "octets": 302, "lines": 8 }, - "end": 5472208, "octets": 302 }, - "end": 5472208, "octets": 436, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 77088, - "begin": 5472240, - "headersEnd": 5472241, + "beginOffset": 5472240, + "headersEndOffset": 5472241, + "endOffset": 5473002, "message": { "lineNumber": 77089, - "begin": 5472241, - "headersEnd": 5472384, + "beginOffset": 5472241, + "headersEndOffset": 5472384, + "endOffset": 5473002, "body": { "mimeType": "text/plain", "lineNumber": 77089, - "begin": 5472241, - "headersEnd": 5472384, - "end": 5473002, + "beginOffset": 5472241, + "headersEndOffset": 5472384, + "endOffset": 5473002, "octets": 618, "lines": 17 }, - "end": 5473002, "octets": 618 }, - "end": 5473002, "octets": 761, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77112, - "begin": 5473034, - "headersEnd": 5473035, + "beginOffset": 5473034, + "headersEndOffset": 5473035, + "endOffset": 5473663, "message": { "lineNumber": 77113, - "begin": 5473035, - "headersEnd": 5473188, + "beginOffset": 5473035, + "headersEndOffset": 5473188, + "endOffset": 5473663, "body": { "mimeType": "text/plain", "lineNumber": 77113, - "begin": 5473035, - "headersEnd": 5473188, - "end": 5473663, + "beginOffset": 5473035, + "headersEndOffset": 5473188, + "endOffset": 5473663, "octets": 475, "lines": 10 }, - "end": 5473663, "octets": 475 }, - "end": 5473663, "octets": 628, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77129, - "begin": 5473695, - "headersEnd": 5473696, + "beginOffset": 5473695, + "headersEndOffset": 5473696, + "endOffset": 5475001, "message": { "lineNumber": 77130, - "begin": 5473696, - "headersEnd": 5473829, + "beginOffset": 5473696, + "headersEndOffset": 5473829, + "endOffset": 5475001, "body": { "mimeType": "text/plain", "lineNumber": 77130, - "begin": 5473696, - "headersEnd": 5473829, - "end": 5475001, + "beginOffset": 5473696, + "headersEndOffset": 5473829, + "endOffset": 5475001, "octets": 1172, "lines": 27 }, - "end": 5475001, "octets": 1172 }, - "end": 5475001, "octets": 1305, "lines": 31 }, { "mimeType": "message/rfc822", "lineNumber": 77163, - "begin": 5475033, - "headersEnd": 5475034, + "beginOffset": 5475033, + "headersEndOffset": 5475034, + "endOffset": 5475469, "message": { "lineNumber": 77164, - "begin": 5475034, - "headersEnd": 5475210, + "beginOffset": 5475034, + "headersEndOffset": 5475210, + "endOffset": 5475469, "body": { "mimeType": "text/plain", "lineNumber": 77164, - "begin": 5475034, - "headersEnd": 5475210, - "end": 5475469, + "beginOffset": 5475034, + "headersEndOffset": 5475210, + "endOffset": 5475469, "octets": 259, "lines": 8 }, - "end": 5475469, "octets": 259 }, - "end": 5475469, "octets": 435, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 77178, - "begin": 5475501, - "headersEnd": 5475502, + "beginOffset": 5475501, + "headersEndOffset": 5475502, + "endOffset": 5475810, "message": { "lineNumber": 77179, - "begin": 5475502, - "headersEnd": 5475617, + "beginOffset": 5475502, + "headersEndOffset": 5475617, + "endOffset": 5475810, "body": { "mimeType": "text/plain", "lineNumber": 77179, - "begin": 5475502, - "headersEnd": 5475617, - "end": 5475810, + "beginOffset": 5475502, + "headersEndOffset": 5475617, + "endOffset": 5475810, "octets": 193, "lines": 4 }, - "end": 5475810, "octets": 193 }, - "end": 5475810, "octets": 308, "lines": 8 }, { "mimeType": "message/rfc822", "lineNumber": 77189, - "begin": 5475842, - "headersEnd": 5475843, + "beginOffset": 5475842, + "headersEndOffset": 5475843, + "endOffset": 5476848, "message": { "lineNumber": 77190, - "begin": 5475843, - "headersEnd": 5475983, + "beginOffset": 5475843, + "headersEndOffset": 5475983, + "endOffset": 5476848, "body": { "mimeType": "text/plain", "lineNumber": 77190, - "begin": 5475843, - "headersEnd": 5475983, - "end": 5476848, + "beginOffset": 5475843, + "headersEndOffset": 5475983, + "endOffset": 5476848, "octets": 865, "lines": 24 }, - "end": 5476848, "octets": 865 }, - "end": 5476848, "octets": 1005, "lines": 28 }, { "mimeType": "message/rfc822", "lineNumber": 77220, - "begin": 5476880, - "headersEnd": 5476881, + "beginOffset": 5476880, + "headersEndOffset": 5476881, + "endOffset": 5477720, "message": { "lineNumber": 77221, - "begin": 5476881, - "headersEnd": 5477006, + "beginOffset": 5476881, + "headersEndOffset": 5477006, + "endOffset": 5477720, "body": { "mimeType": "text/plain", "lineNumber": 77221, - "begin": 5476881, - "headersEnd": 5477006, - "end": 5477720, + "beginOffset": 5476881, + "headersEndOffset": 5477006, + "endOffset": 5477720, "octets": 714, "lines": 11 }, - "end": 5477720, "octets": 714 }, - "end": 5477720, "octets": 839, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 77238, - "begin": 5477752, - "headersEnd": 5477753, + "beginOffset": 5477752, + "headersEndOffset": 5477753, + "endOffset": 5478568, "message": { "lineNumber": 77239, - "begin": 5477753, - "headersEnd": 5477865, + "beginOffset": 5477753, + "headersEndOffset": 5477865, + "endOffset": 5478568, "body": { "mimeType": "text/plain", "lineNumber": 77239, - "begin": 5477753, - "headersEnd": 5477865, - "end": 5478568, + "beginOffset": 5477753, + "headersEndOffset": 5477865, + "endOffset": 5478568, "octets": 703, "lines": 17 }, - "end": 5478568, "octets": 703 }, - "end": 5478568, "octets": 815, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77262, - "begin": 5478600, - "headersEnd": 5478601, + "beginOffset": 5478600, + "headersEndOffset": 5478601, + "endOffset": 5479113, "message": { "lineNumber": 77263, - "begin": 5478601, - "headersEnd": 5478733, + "beginOffset": 5478601, + "headersEndOffset": 5478733, + "endOffset": 5479113, "body": { "mimeType": "text/plain", "lineNumber": 77263, - "begin": 5478601, - "headersEnd": 5478733, - "end": 5479113, + "beginOffset": 5478601, + "headersEndOffset": 5478733, + "endOffset": 5479113, "octets": 380, "lines": 11 }, - "end": 5479113, "octets": 380 }, - "end": 5479113, "octets": 512, "lines": 15 }, { "mimeType": "message/rfc822", "lineNumber": 77280, - "begin": 5479145, - "headersEnd": 5479146, + "beginOffset": 5479145, + "headersEndOffset": 5479146, + "endOffset": 5480259, "message": { "lineNumber": 77281, - "begin": 5479146, - "headersEnd": 5479282, + "beginOffset": 5479146, + "headersEndOffset": 5479282, + "endOffset": 5480259, "body": { "mimeType": "text/plain", "lineNumber": 77281, - "begin": 5479146, - "headersEnd": 5479282, - "end": 5480259, + "beginOffset": 5479146, + "headersEndOffset": 5479282, + "endOffset": 5480259, "octets": 977, "lines": 24 }, - "end": 5480259, "octets": 977 }, - "end": 5480259, "octets": 1113, "lines": 28 }, { "mimeType": "message/rfc822", "lineNumber": 77311, - "begin": 5480291, - "headersEnd": 5480292, + "beginOffset": 5480291, + "headersEndOffset": 5480292, + "endOffset": 5480904, "message": { "lineNumber": 77312, - "begin": 5480292, - "headersEnd": 5480437, + "beginOffset": 5480292, + "headersEndOffset": 5480437, + "endOffset": 5480904, "body": { "mimeType": "text/plain", "lineNumber": 77312, - "begin": 5480292, - "headersEnd": 5480437, - "end": 5480904, + "beginOffset": 5480292, + "headersEndOffset": 5480437, + "endOffset": 5480904, "octets": 467, "lines": 10 }, - "end": 5480904, "octets": 467 }, - "end": 5480904, "octets": 612, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77328, - "begin": 5480936, - "headersEnd": 5480937, + "beginOffset": 5480936, + "headersEndOffset": 5480937, + "endOffset": 5481349, "message": { "lineNumber": 77329, - "begin": 5480937, - "headersEnd": 5481070, + "beginOffset": 5480937, + "headersEndOffset": 5481070, + "endOffset": 5481349, "body": { "mimeType": "text/plain", "lineNumber": 77329, - "begin": 5480937, - "headersEnd": 5481070, - "end": 5481349, + "beginOffset": 5480937, + "headersEndOffset": 5481070, + "endOffset": 5481349, "octets": 279, "lines": 10 }, - "end": 5481349, "octets": 279 }, - "end": 5481349, "octets": 412, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77345, - "begin": 5481381, - "headersEnd": 5481382, + "beginOffset": 5481381, + "headersEndOffset": 5481382, + "endOffset": 5481789, "message": { "lineNumber": 77346, - "begin": 5481382, - "headersEnd": 5481507, + "beginOffset": 5481382, + "headersEndOffset": 5481507, + "endOffset": 5481789, "body": { "mimeType": "text/plain", "lineNumber": 77346, - "begin": 5481382, - "headersEnd": 5481507, - "end": 5481789, + "beginOffset": 5481382, + "headersEndOffset": 5481507, + "endOffset": 5481789, "octets": 282, "lines": 4 }, - "end": 5481789, "octets": 282 }, - "end": 5481789, "octets": 407, "lines": 8 }, { "mimeType": "message/rfc822", "lineNumber": 77356, - "begin": 5481821, - "headersEnd": 5481822, + "beginOffset": 5481821, + "headersEndOffset": 5481822, + "endOffset": 5482586, "message": { "lineNumber": 77357, - "begin": 5481822, - "headersEnd": 5481943, + "beginOffset": 5481822, + "headersEndOffset": 5481943, + "endOffset": 5482586, "body": { "mimeType": "text/plain", "lineNumber": 77357, - "begin": 5481822, - "headersEnd": 5481943, - "end": 5482586, + "beginOffset": 5481822, + "headersEndOffset": 5481943, + "endOffset": 5482586, "octets": 643, "lines": 27 }, - "end": 5482586, "octets": 643 }, - "end": 5482586, "octets": 764, "lines": 31 }, { "mimeType": "message/rfc822", "lineNumber": 77390, - "begin": 5482618, - "headersEnd": 5482619, + "beginOffset": 5482618, + "headersEndOffset": 5482619, + "endOffset": 5485021, "message": { "lineNumber": 77391, - "begin": 5482619, - "headersEnd": 5482763, + "beginOffset": 5482619, + "headersEndOffset": 5482763, + "endOffset": 5485021, "body": { "mimeType": "text/plain", "lineNumber": 77391, - "begin": 5482619, - "headersEnd": 5482763, - "end": 5485021, + "beginOffset": 5482619, + "headersEndOffset": 5482763, + "endOffset": 5485021, "octets": 2258, "lines": 46 }, - "end": 5485021, "octets": 2258 }, - "end": 5485021, "octets": 2402, "lines": 50 }, { "mimeType": "message/rfc822", "lineNumber": 77443, - "begin": 5485053, - "headersEnd": 5485054, + "beginOffset": 5485053, + "headersEndOffset": 5485054, + "endOffset": 5485968, "message": { "lineNumber": 77444, - "begin": 5485054, - "headersEnd": 5485176, + "beginOffset": 5485054, + "headersEndOffset": 5485176, + "endOffset": 5485968, "body": { "mimeType": "text/plain", "lineNumber": 77444, - "begin": 5485054, - "headersEnd": 5485176, - "end": 5485968, + "beginOffset": 5485054, + "headersEndOffset": 5485176, + "endOffset": 5485968, "octets": 792, "lines": 17 }, - "end": 5485968, "octets": 792 }, - "end": 5485968, "octets": 914, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77467, - "begin": 5486000, - "headersEnd": 5486001, + "beginOffset": 5486000, + "headersEndOffset": 5486001, + "endOffset": 5486321, "message": { "lineNumber": 77468, - "begin": 5486001, - "headersEnd": 5486095, + "beginOffset": 5486001, + "headersEndOffset": 5486095, + "endOffset": 5486321, "body": { "mimeType": "text/plain", "lineNumber": 77468, - "begin": 5486001, - "headersEnd": 5486095, - "end": 5486321, + "beginOffset": 5486001, + "headersEndOffset": 5486095, + "endOffset": 5486321, "octets": 226, "lines": 10 }, - "end": 5486321, "octets": 226 }, - "end": 5486321, "octets": 320, "lines": 14 }, { "mimeType": "message/rfc822", "lineNumber": 77484, - "begin": 5486353, - "headersEnd": 5486354, + "beginOffset": 5486353, + "headersEndOffset": 5486354, + "endOffset": 5487143, "message": { "lineNumber": 77485, - "begin": 5486354, - "headersEnd": 5486475, + "beginOffset": 5486354, + "headersEndOffset": 5486475, + "endOffset": 5487143, "body": { "mimeType": "text/plain", "lineNumber": 77485, - "begin": 5486354, - "headersEnd": 5486475, - "end": 5487143, + "beginOffset": 5486354, + "headersEndOffset": 5486475, + "endOffset": 5487143, "octets": 668, "lines": 20 }, - "end": 5487143, "octets": 668 }, - "end": 5487143, "octets": 789, "lines": 24 }, { "mimeType": "message/rfc822", "lineNumber": 77511, - "begin": 5487175, - "headersEnd": 5487176, + "beginOffset": 5487175, + "headersEndOffset": 5487176, + "endOffset": 5489833, "message": { "lineNumber": 77512, - "begin": 5487176, - "headersEnd": 5487286, + "beginOffset": 5487176, + "headersEndOffset": 5487286, + "endOffset": 5489833, "body": { "mimeType": "text/plain", "lineNumber": 77512, - "begin": 5487176, - "headersEnd": 5487286, - "end": 5489833, + "beginOffset": 5487176, + "headersEndOffset": 5487286, + "endOffset": 5489833, "octets": 2547, "lines": 68 }, - "end": 5489833, "octets": 2547 }, - "end": 5489833, "octets": 2657, "lines": 72 }, { "mimeType": "message/rfc822", "lineNumber": 77586, - "begin": 5489865, - "headersEnd": 5489866, + "beginOffset": 5489865, + "headersEndOffset": 5489866, + "endOffset": 5491181, "message": { "lineNumber": 77587, - "begin": 5489866, - "headersEnd": 5489972, + "beginOffset": 5489866, + "headersEndOffset": 5489972, + "endOffset": 5491181, "body": { "mimeType": "text/plain", "lineNumber": 77587, - "begin": 5489866, - "headersEnd": 5489972, - "end": 5491181, + "beginOffset": 5489866, + "headersEndOffset": 5489972, + "endOffset": 5491181, "octets": 1209, "lines": 34 }, - "end": 5491181, "octets": 1209 }, - "end": 5491181, "octets": 1315, "lines": 38 }, { "mimeType": "message/rfc822", "lineNumber": 77627, - "begin": 5491213, - "headersEnd": 5491214, + "beginOffset": 5491213, + "headersEndOffset": 5491214, + "endOffset": 5493117, "message": { "lineNumber": 77628, - "begin": 5491214, - "headersEnd": 5491320, + "beginOffset": 5491214, + "headersEndOffset": 5491320, + "endOffset": 5493117, "body": { "mimeType": "text/plain", "lineNumber": 77628, - "begin": 5491214, - "headersEnd": 5491320, - "end": 5493117, + "beginOffset": 5491214, + "headersEndOffset": 5491320, + "endOffset": 5493117, "octets": 1797, "lines": 43 }, - "end": 5493117, "octets": 1797 }, - "end": 5493117, "octets": 1903, "lines": 47 }, { "mimeType": "message/rfc822", "lineNumber": 77677, - "begin": 5493149, - "headersEnd": 5493150, + "beginOffset": 5493149, + "headersEndOffset": 5493150, + "endOffset": 5493849, "message": { "lineNumber": 77678, - "begin": 5493150, - "headersEnd": 5493279, + "beginOffset": 5493150, + "headersEndOffset": 5493279, + "endOffset": 5493849, "body": { "mimeType": "text/plain", "lineNumber": 77678, - "begin": 5493150, - "headersEnd": 5493279, - "end": 5493849, + "beginOffset": 5493150, + "headersEndOffset": 5493279, + "endOffset": 5493849, "octets": 570, "lines": 12 }, - "end": 5493849, "octets": 570 }, - "end": 5493849, "octets": 699, "lines": 16 }, { "mimeType": "message/rfc822", "lineNumber": 77696, - "begin": 5493881, - "headersEnd": 5493882, + "beginOffset": 5493881, + "headersEndOffset": 5493882, + "endOffset": 5495304, "message": { "lineNumber": 77697, - "begin": 5493882, - "headersEnd": 5493970, + "beginOffset": 5493882, + "headersEndOffset": 5493970, + "endOffset": 5495304, "body": { "mimeType": "text/plain", "lineNumber": 77697, - "begin": 5493882, - "headersEnd": 5493970, - "end": 5495304, + "beginOffset": 5493882, + "headersEndOffset": 5493970, + "endOffset": 5495304, "octets": 1334, "lines": 20 }, - "end": 5495304, "octets": 1334 }, - "end": 5495304, "octets": 1422, "lines": 24 }, { "mimeType": "message/rfc822", "lineNumber": 77723, - "begin": 5495336, - "headersEnd": 5495337, + "beginOffset": 5495336, + "headersEndOffset": 5495337, + "endOffset": 5497580, "message": { "lineNumber": 77724, - "begin": 5495337, - "headersEnd": 5495453, + "beginOffset": 5495337, + "headersEndOffset": 5495453, + "endOffset": 5497580, "body": { "mimeType": "text/plain", "lineNumber": 77724, - "begin": 5495337, - "headersEnd": 5495453, - "end": 5497580, + "beginOffset": 5495337, + "headersEndOffset": 5495453, + "endOffset": 5497580, "octets": 2127, "lines": 49 }, - "end": 5497580, "octets": 2127 }, - "end": 5497580, "octets": 2243, "lines": 53 }, { "mimeType": "message/rfc822", "lineNumber": 77779, - "begin": 5497612, - "headersEnd": 5497613, + "beginOffset": 5497612, + "headersEndOffset": 5497613, + "endOffset": 5499755, "message": { "lineNumber": 77780, - "begin": 5497613, - "headersEnd": 5497734, + "beginOffset": 5497613, + "headersEndOffset": 5497734, + "endOffset": 5499755, "body": { "mimeType": "text/plain", "lineNumber": 77780, - "begin": 5497613, - "headersEnd": 5497734, - "end": 5499755, + "beginOffset": 5497613, + "headersEndOffset": 5497734, + "endOffset": 5499755, "octets": 2021, "lines": 42 }, - "end": 5499755, "octets": 2021 }, - "end": 5499755, "octets": 2142, "lines": 46 }, { "mimeType": "message/rfc822", "lineNumber": 77828, - "begin": 5499787, - "headersEnd": 5499788, + "beginOffset": 5499787, + "headersEndOffset": 5499788, + "endOffset": 5500586, "message": { "lineNumber": 77829, - "begin": 5499788, - "headersEnd": 5499909, + "beginOffset": 5499788, + "headersEndOffset": 5499909, + "endOffset": 5500586, "body": { "mimeType": "text/plain", "lineNumber": 77829, - "begin": 5499788, - "headersEnd": 5499909, - "end": 5500586, + "beginOffset": 5499788, + "headersEndOffset": 5499909, + "endOffset": 5500586, "octets": 677, "lines": 19 }, - "end": 5500586, "octets": 677 }, - "end": 5500586, "octets": 798, "lines": 23 }, { "mimeType": "message/rfc822", "lineNumber": 77854, - "begin": 5500618, - "headersEnd": 5500619, + "beginOffset": 5500618, + "headersEndOffset": 5500619, + "endOffset": 5501576, "message": { "lineNumber": 77855, - "begin": 5500619, - "headersEnd": 5500756, + "beginOffset": 5500619, + "headersEndOffset": 5500756, + "endOffset": 5501576, "body": { "mimeType": "text/plain", "lineNumber": 77855, - "begin": 5500619, - "headersEnd": 5500756, - "end": 5501576, + "beginOffset": 5500619, + "headersEndOffset": 5500756, + "endOffset": 5501576, "octets": 820, "lines": 16 }, - "end": 5501576, "octets": 820 }, - "end": 5501576, "octets": 957, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 77877, - "begin": 5501608, - "headersEnd": 5501609, + "beginOffset": 5501608, + "headersEndOffset": 5501609, + "endOffset": 5502457, "message": { "lineNumber": 77878, - "begin": 5501609, - "headersEnd": 5501733, + "beginOffset": 5501609, + "headersEndOffset": 5501733, + "endOffset": 5502457, "body": { "mimeType": "text/plain", "lineNumber": 77878, - "begin": 5501609, - "headersEnd": 5501733, - "end": 5502457, + "beginOffset": 5501609, + "headersEndOffset": 5501733, + "endOffset": 5502457, "octets": 724, "lines": 21 }, - "end": 5502457, "octets": 724 }, - "end": 5502457, "octets": 848, "lines": 25 }, { "mimeType": "message/rfc822", "lineNumber": 77905, - "begin": 5502489, - "headersEnd": 5502490, + "beginOffset": 5502489, + "headersEndOffset": 5502490, + "endOffset": 5503332, "message": { "lineNumber": 77906, - "begin": 5502490, - "headersEnd": 5502592, + "beginOffset": 5502490, + "headersEndOffset": 5502592, + "endOffset": 5503332, "body": { "mimeType": "text/plain", "lineNumber": 77906, - "begin": 5502490, - "headersEnd": 5502592, - "end": 5503332, + "beginOffset": 5502490, + "headersEndOffset": 5502592, + "endOffset": 5503332, "octets": 740, "lines": 16 }, - "end": 5503332, "octets": 740 }, - "end": 5503332, "octets": 842, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 77928, - "begin": 5503364, - "headersEnd": 5503365, + "beginOffset": 5503364, + "headersEndOffset": 5503365, + "endOffset": 5503880, "message": { "lineNumber": 77929, - "begin": 5503365, - "headersEnd": 5503521, + "beginOffset": 5503365, + "headersEndOffset": 5503521, + "endOffset": 5503880, "body": { "mimeType": "text/plain", "lineNumber": 77929, - "begin": 5503365, - "headersEnd": 5503521, - "end": 5503880, + "beginOffset": 5503365, + "headersEndOffset": 5503521, + "endOffset": 5503880, "octets": 359, "lines": 7 }, - "end": 5503880, "octets": 359 }, - "end": 5503880, "octets": 515, "lines": 12 }, { "mimeType": "message/rfc822", "lineNumber": 77943, - "begin": 5503912, - "headersEnd": 5503913, + "beginOffset": 5503912, + "headersEndOffset": 5503913, + "endOffset": 5504635, "message": { "lineNumber": 77944, - "begin": 5503913, - "headersEnd": 5504000, + "beginOffset": 5503913, + "headersEndOffset": 5504000, + "endOffset": 5504635, "body": { "mimeType": "text/plain", "lineNumber": 77944, - "begin": 5503913, - "headersEnd": 5504000, - "end": 5504635, + "beginOffset": 5503913, + "headersEndOffset": 5504000, + "endOffset": 5504635, "octets": 635, "lines": 15 }, - "end": 5504635, "octets": 635 }, - "end": 5504635, "octets": 722, "lines": 19 }, { "mimeType": "message/rfc822", "lineNumber": 77965, - "begin": 5504667, - "headersEnd": 5504668, + "beginOffset": 5504667, + "headersEndOffset": 5504668, + "endOffset": 5505183, "message": { "lineNumber": 77966, - "begin": 5504668, - "headersEnd": 5504817, + "beginOffset": 5504668, + "headersEndOffset": 5504817, + "endOffset": 5505183, "body": { "mimeType": "text/plain", "lineNumber": 77966, - "begin": 5504668, - "headersEnd": 5504817, - "end": 5505183, + "beginOffset": 5504668, + "headersEndOffset": 5504817, + "endOffset": 5505183, "octets": 366, "lines": 17 }, - "end": 5505183, "octets": 366 }, - "end": 5505183, "octets": 515, "lines": 21 }, { "mimeType": "message/rfc822", "lineNumber": 77989, - "begin": 5505215, - "headersEnd": 5505216, + "beginOffset": 5505215, + "headersEndOffset": 5505216, + "endOffset": 5505605, "message": { "lineNumber": 77990, - "begin": 5505216, - "headersEnd": 5505317, + "beginOffset": 5505216, + "headersEndOffset": 5505317, + "endOffset": 5505605, "body": { "mimeType": "text/plain", "lineNumber": 77990, - "begin": 5505216, - "headersEnd": 5505317, - "end": 5505605, + "beginOffset": 5505216, + "headersEndOffset": 5505317, + "endOffset": 5505605, "octets": 288, "lines": 6 }, - "end": 5505605, "octets": 288 }, - "end": 5505605, "octets": 389, "lines": 10 }, { "mimeType": "message/rfc822", "lineNumber": 78002, - "begin": 5505637, - "headersEnd": 5505638, + "beginOffset": 5505637, + "headersEndOffset": 5505638, + "endOffset": 5506245, "message": { "lineNumber": 78003, - "begin": 5505638, - "headersEnd": 5505766, + "beginOffset": 5505638, + "headersEndOffset": 5505766, + "endOffset": 5506245, "body": { "mimeType": "text/plain", "lineNumber": 78003, - "begin": 5505638, - "headersEnd": 5505766, - "end": 5506245, + "beginOffset": 5505638, + "headersEndOffset": 5505766, + "endOffset": 5506245, "octets": 479, "lines": 16 }, - "end": 5506245, "octets": 479 }, - "end": 5506245, "octets": 607, "lines": 20 }, { "mimeType": "message/rfc822", "lineNumber": 78025, - "begin": 5506277, - "headersEnd": 5506278, + "beginOffset": 5506277, + "headersEndOffset": 5506278, + "endOffset": 5506755, "message": { "lineNumber": 78026, - "begin": 5506278, - "headersEnd": 5506375, + "beginOffset": 5506278, + "headersEndOffset": 5506375, + "endOffset": 5506755, "body": { "mimeType": "text/plain", "lineNumber": 78026, - "begin": 5506278, - "headersEnd": 5506375, - "end": 5506755, + "beginOffset": 5506278, + "headersEndOffset": 5506375, + "endOffset": 5506755, "octets": 380, "lines": 19 }, - "end": 5506755, "octets": 380 }, - "end": 5506755, "octets": 477, "lines": 23 }, { "mimeType": "message/rfc822", "lineNumber": 78051, - "begin": 5506787, - "headersEnd": 5506788, + "beginOffset": 5506787, + "headersEndOffset": 5506788, + "endOffset": 5508222, "message": { "lineNumber": 78052, - "begin": 5506788, - "headersEnd": 5506903, + "beginOffset": 5506788, + "headersEndOffset": 5506903, + "endOffset": 5508222, "body": { "mimeType": "text/plain", "lineNumber": 78052, - "begin": 5506788, - "headersEnd": 5506903, - "end": 5508222, + "beginOffset": 5506788, + "headersEndOffset": 5506903, + "endOffset": 5508222, "octets": 1319, "lines": 26 }, - "end": 5508222, "octets": 1319 }, - "end": 5508222, "octets": 1434, "lines": 30 }, { "mimeType": "message/rfc822", "lineNumber": 78084, - "begin": 5508254, - "headersEnd": 5508255, + "beginOffset": 5508254, + "headersEndOffset": 5508255, + "endOffset": 5508650, "message": { "lineNumber": 78085, - "begin": 5508255, - "headersEnd": 5508355, + "beginOffset": 5508255, + "headersEndOffset": 5508355, + "endOffset": 5508650, "body": { "mimeType": "text/plain", "lineNumber": 78085, - "begin": 5508255, - "headersEnd": 5508355, - "end": 5508650, + "beginOffset": 5508255, + "headersEndOffset": 5508355, + "endOffset": 5508650, "octets": 295, "lines": 9 }, - "end": 5508650, "octets": 295 }, - "end": 5508650, "octets": 395, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 78100, - "begin": 5508682, - "headersEnd": 5508683, + "beginOffset": 5508682, + "headersEndOffset": 5508683, + "endOffset": 5509845, "message": { "lineNumber": 78101, - "begin": 5508683, - "headersEnd": 5508826, + "beginOffset": 5508683, + "headersEndOffset": 5508826, + "endOffset": 5509845, "body": { "mimeType": "text/plain", "lineNumber": 78101, - "begin": 5508683, - "headersEnd": 5508826, - "end": 5509845, + "beginOffset": 5508683, + "headersEndOffset": 5508826, + "endOffset": 5509845, "octets": 1019, "lines": 36 }, - "end": 5509845, "octets": 1019 }, - "end": 5509845, "octets": 1162, "lines": 40 } ], - "end": 5509879, "octets": 64210, "lines": 1845 } ], - "end": 5509954, "octets": 68781, "lines": 1958 }, - "end": 5509954, "octets": 68781 }, { - "mboxMarkerBegin": 5509955, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5509955, "lineNumber": 78149, - "begin": 5509963, - "headersEnd": 5510771, + "beginOffset": 5509963, + "headersEndOffset": 5510771, + "endOffset": 5512642, "body": { "mimeType": "text/plain", "lineNumber": 78149, - "begin": 5509963, - "headersEnd": 5510771, - "end": 5512642, + "beginOffset": 5509963, + "headersEndOffset": 5510771, + "endOffset": 5512642, "octets": 1871, "lines": 49 }, - "end": 5512642, "octets": 1871 }, { - "mboxMarkerBegin": 5512643, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5512643, "lineNumber": 78214, - "begin": 5512651, - "headersEnd": 5513378, + "beginOffset": 5512651, + "headersEndOffset": 5513378, + "endOffset": 5668007, "body": { "mimeType": "multipart/mixed", "lineNumber": 78214, - "begin": 5512651, - "headersEnd": 5513378, + "beginOffset": 5512651, + "headersEndOffset": 5513378, + "endOffset": 5668007, "children": [ { "mimeType": "text/plain", "lineNumber": 78231, - "begin": 5513405, - "headersEnd": 5513406, - "end": 5513518, + "beginOffset": 5513405, + "headersEndOffset": 5513406, + "endOffset": 5513518, "octets": 112, "lines": 2 }, { "mimeType": "application/x-annotate", "lineNumber": 78235, - "begin": 5513546, - "headersEnd": 5513635, - "end": 5644327, + "beginOffset": 5513546, + "headersEndOffset": 5513635, + "endOffset": 5644327, "octets": 130692, "lines": 2012 }, { "mimeType": "text/plain", "lineNumber": 80251, - "begin": 5644355, - "headersEnd": 5644356, - "end": 5644411, + "beginOffset": 5644355, + "headersEndOffset": 5644356, + "endOffset": 5644411, "octets": 55, "lines": 2 }, { "mimeType": "image/pbm", "lineNumber": 80255, - "begin": 5644439, - "headersEnd": 5644584, - "end": 5659481, + "beginOffset": 5644439, + "headersEndOffset": 5644584, + "endOffset": 5659481, "octets": 14897, "lines": 78 }, { "mimeType": "text/plain", "lineNumber": 80339, - "begin": 5659509, - "headersEnd": 5659510, - "end": 5659600, + "beginOffset": 5659509, + "headersEndOffset": 5659510, + "endOffset": 5659600, "octets": 90, "lines": 6 }, { "mimeType": "image/pbm", "lineNumber": 80347, - "begin": 5659628, - "headersEnd": 5659773, - "end": 5667874, + "beginOffset": 5659628, + "headersEndOffset": 5659773, + "endOffset": 5667874, "octets": 8101, "lines": 42 }, { "mimeType": "text/plain", "lineNumber": 80395, - "begin": 5667902, - "headersEnd": 5667903, - "end": 5667977, + "beginOffset": 5667902, + "headersEndOffset": 5667903, + "endOffset": 5667977, "octets": 74, "lines": 4 } ], - "end": 5668007, "octets": 154629, "lines": 2171 }, - "end": 5668007, "octets": 154629 }, { - "mboxMarkerBegin": 5668008, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5668008, "lineNumber": 80403, - "begin": 5668016, - "headersEnd": 5668539, + "beginOffset": 5668016, + "headersEndOffset": 5668539, + "endOffset": 5669107, "body": { "mimeType": "text/richtext", "lineNumber": 80403, - "begin": 5668016, - "headersEnd": 5668539, - "end": 5669107, + "beginOffset": 5668016, + "headersEndOffset": 5668539, + "endOffset": 5669107, "octets": 568, "lines": 21 }, - "end": 5669107, "octets": 568 }, { - "mboxMarkerBegin": 5669108, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5669108, "lineNumber": 80441, - "begin": 5669116, - "headersEnd": 5670302, + "beginOffset": 5669116, + "headersEndOffset": 5670302, + "endOffset": 5730566, "body": { "mimeType": "multipart/alternative", "lineNumber": 80441, - "begin": 5669116, - "headersEnd": 5670302, + "beginOffset": 5669116, + "headersEndOffset": 5670302, + "endOffset": 5730566, "children": [ { "mimeType": "text/plain", "lineNumber": 80468, - "begin": 5670497, - "headersEnd": 5670541, - "end": 5671271, + "beginOffset": 5670497, + "headersEndOffset": 5670541, + "endOffset": 5671271, "octets": 730, "lines": 26 }, { "mimeType": "multipart/mixed", "lineNumber": 80498, - "begin": 5671312, - "headersEnd": 5671397, + "beginOffset": 5671312, + "headersEndOffset": 5671397, + "endOffset": 5730523, "children": [ { "mimeType": "text/richtext", "lineNumber": 80502, - "begin": 5671439, - "headersEnd": 5671530, - "end": 5672332, + "beginOffset": 5671439, + "headersEndOffset": 5671530, + "endOffset": 5672332, "octets": 802, "lines": 25 }, { "mimeType": "image/gif", "lineNumber": 80532, - "begin": 5672375, - "headersEnd": 5672468, - "end": 5730339, + "beginOffset": 5672375, + "headersEndOffset": 5672468, + "endOffset": 5730339, "octets": 57871, "lines": 755 }, { "mimeType": "text/richtext", "lineNumber": 81293, - "begin": 5730382, - "headersEnd": 5730473, - "end": 5730478, + "beginOffset": 5730382, + "headersEndOffset": 5730473, + "endOffset": 5730478, "octets": 5, "lines": 1 } ], - "end": 5730523, "octets": 59126, "lines": 798 } ], - "end": 5730566, "octets": 60264, "lines": 837 }, - "end": 5730566, "octets": 60264 }, { - "mboxMarkerBegin": 5730567, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5730567, "lineNumber": 81303, - "begin": 5730575, - "headersEnd": 5731315, + "beginOffset": 5730575, + "headersEndOffset": 5731315, + "endOffset": 5787038, "body": { "mimeType": "multipart/mixed", "lineNumber": 81303, - "begin": 5730575, - "headersEnd": 5731315, + "beginOffset": 5730575, + "headersEndOffset": 5731315, + "endOffset": 5787038, "children": [ { "mimeType": "text/plain", "lineNumber": 81322, - "begin": 5731365, - "headersEnd": 5731455, - "end": 5731629, + "beginOffset": 5731365, + "headersEndOffset": 5731455, + "endOffset": 5731629, "octets": 174, "lines": 7 }, { "mimeType": "image/gif", "lineNumber": 81334, - "begin": 5731679, - "headersEnd": 5731738, - "end": 5786986, + "beginOffset": 5731679, + "headersEndOffset": 5731738, + "endOffset": 5786986, "octets": 55248, "lines": 757 } ], - "end": 5787038, "octets": 55723, "lines": 775 }, - "end": 5787038, "octets": 55723 }, { - "mboxMarkerBegin": 5787039, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 5787039, "lineNumber": 82097, - "begin": 5787071, - "headersEnd": 5788538, + "beginOffset": 5787071, + "headersEndOffset": 5788538, + "endOffset": 5789878, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 82097, - "begin": 5787071, - "headersEnd": 5788538, - "end": 5789878, + "beginOffset": 5787071, + "headersEndOffset": 5788538, + "endOffset": 5789878, "octets": 1340, "lines": 34 }, - "end": 5789878, "octets": 1340 }, { - "mboxMarkerBegin": 5789879, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5789879, "lineNumber": 82163, - "begin": 5789887, - "headersEnd": 5790681, + "beginOffset": 5789887, + "headersEndOffset": 5790681, + "endOffset": 5816805, "body": { "mimeType": "multipart/mixed", "lineNumber": 82163, - "begin": 5789887, - "headersEnd": 5790681, + "beginOffset": 5789887, + "headersEndOffset": 5790681, + "endOffset": 5816805, "children": [ { "mimeType": "text/plain", "lineNumber": 82180, - "begin": 5790752, - "headersEnd": 5790828, - "end": 5791198, + "beginOffset": 5790752, + "headersEndOffset": 5790828, + "endOffset": 5791198, "octets": 370, "lines": 13 }, { "mimeType": "message/rfc822", "lineNumber": 82198, - "begin": 5791224, - "headersEnd": 5791314, + "beginOffset": 5791224, + "headersEndOffset": 5791314, + "endOffset": 5816777, "message": { "lineNumber": 82202, - "begin": 5791314, - "headersEnd": 5792382, + "beginOffset": 5791314, + "headersEndOffset": 5792382, + "endOffset": 5816777, "body": { "mimeType": "text/html", "lineNumber": 82202, - "begin": 5791314, - "headersEnd": 5792382, - "end": 5816777, + "beginOffset": 5791314, + "headersEndOffset": 5792382, + "endOffset": 5816777, "octets": 24395, "lines": 463 }, - "end": 5816777, "octets": 24395 }, - "end": 5816777, "octets": 25463, "lines": 477 } ], - "end": 5816805, "octets": 26124, "lines": 504 }, - "end": 5816805, "octets": 26124 }, { - "mboxMarkerBegin": 5816806, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5816806, "lineNumber": 82683, - "begin": 5816814, - "headersEnd": 5817482, + "beginOffset": 5816814, + "headersEndOffset": 5817482, + "endOffset": 5839997, "body": { "mimeType": "multipart/mixed", "lineNumber": 82683, - "begin": 5816814, - "headersEnd": 5817482, + "beginOffset": 5816814, + "headersEndOffset": 5817482, + "endOffset": 5839997, "children": [ { "mimeType": "text/plain", "lineNumber": 82700, - "begin": 5817576, - "headersEnd": 5817654, - "end": 5817688, + "beginOffset": 5817576, + "headersEndOffset": 5817654, + "endOffset": 5817688, "octets": 34, "lines": 1 }, { "mimeType": "image/gif", "lineNumber": 82706, - "begin": 5817737, - "headersEnd": 5817796, - "end": 5839947, + "beginOffset": 5817737, + "headersEndOffset": 5817796, + "endOffset": 5839947, "octets": 22151, "lines": 304 } ], - "end": 5839997, "octets": 22515, "lines": 317 }, - "end": 5839997, "octets": 22515 }, { - "mboxMarkerBegin": 5839998, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 5839998, "lineNumber": 83015, - "begin": 5840030, - "headersEnd": 5840554, + "beginOffset": 5840030, + "headersEndOffset": 5840554, + "endOffset": 5842388, "body": { "mimeType": "multipart/mixed", "lineNumber": 83015, - "begin": 5840030, - "headersEnd": 5840554, + "beginOffset": 5840030, + "headersEndOffset": 5840554, + "endOffset": 5842388, "children": [ { "mimeType": "text/plain", "lineNumber": 83029, - "begin": 5840562, - "headersEnd": 5840606, - "end": 5841778, + "beginOffset": 5840562, + "headersEndOffset": 5840606, + "endOffset": 5841778, "octets": 1172, "lines": 21 }, { "mimeType": "text/plain", "lineNumber": 83054, - "begin": 5841787, - "headersEnd": 5841913, - "end": 5842059, + "beginOffset": 5841787, + "headersEndOffset": 5841913, + "endOffset": 5842059, "octets": 146, "lines": 3 }, { "mimeType": "text/plain", "lineNumber": 83062, - "begin": 5842068, - "headersEnd": 5842184, - "end": 5842378, + "beginOffset": 5842068, + "headersEndOffset": 5842184, + "endOffset": 5842378, "octets": 194, "lines": 3 } ], - "end": 5842388, "octets": 1834, "lines": 42 }, - "end": 5842388, "octets": 1834 }, { - "mboxMarkerBegin": 5842389, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 5842389, "lineNumber": 83071, - "begin": 5842397, - "headersEnd": 5843191, + "beginOffset": 5842397, + "headersEndOffset": 5843191, + "endOffset": 6099969, "body": { "mimeType": "audio/basic", "lineNumber": 83071, - "begin": 5842397, - "headersEnd": 5843191, - "end": 6099969, + "beginOffset": 5842397, + "headersEndOffset": 5843191, + "endOffset": 6099969, "octets": 256778, "lines": 3518 }, - "end": 6099969, "octets": 256778 }, { - "mboxMarkerBegin": 6099970, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6099970, "lineNumber": 86609, - "begin": 6099978, - "headersEnd": 6100830, + "beginOffset": 6099978, + "headersEndOffset": 6100830, + "endOffset": 6199495, "body": { "mimeType": "multipart/mixed", "lineNumber": 86609, - "begin": 6099978, - "headersEnd": 6100830, + "beginOffset": 6099978, + "headersEndOffset": 6100830, + "endOffset": 6199495, "children": [ { "mimeType": "text/plain", "lineNumber": 86630, - "begin": 6100845, - "headersEnd": 6100922, - "end": 6101112, + "beginOffset": 6100845, + "headersEndOffset": 6100922, + "endOffset": 6101112, "octets": 190, "lines": 9 }, { "mimeType": "image/pbm", "lineNumber": 86643, - "begin": 6101127, - "headersEnd": 6101231, - "end": 6199478, + "beginOffset": 6101127, + "headersEndOffset": 6101231, + "endOffset": 6199478, "octets": 98247, "lines": 1276 } ], - "end": 6199495, "octets": 98665, "lines": 1296 }, - "end": 6199495, "octets": 98665 }, { - "mboxMarkerBegin": 6199496, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6199496, "lineNumber": 87926, - "begin": 6199504, - "headersEnd": 6200381, + "beginOffset": 6199504, + "headersEndOffset": 6200381, + "endOffset": 6282825, "body": { "mimeType": "multipart/mixed", "lineNumber": 87926, - "begin": 6199504, - "headersEnd": 6200381, + "beginOffset": 6199504, + "headersEndOffset": 6200381, + "endOffset": 6282825, "children": [ { "mimeType": "text/plain", "lineNumber": 87946, - "begin": 6200390, - "headersEnd": 6200436, - "end": 6201379, + "beginOffset": 6200390, + "headersEndOffset": 6200436, + "endOffset": 6201379, "octets": 943, "lines": 21 }, { "mimeType": "multipart/mixed", "lineNumber": 87971, - "begin": 6201389, - "headersEnd": 6201452, + "beginOffset": 6201389, + "headersEndOffset": 6201452, + "endOffset": 6282813, "children": [ { "mimeType": "multipart/mixed", "lineNumber": 87975, - "begin": 6201475, - "headersEnd": 6201836, + "beginOffset": 6201475, + "headersEndOffset": 6201836, + "endOffset": 6282788, "children": [ { "mimeType": "multipart/mixed", "lineNumber": 87984, - "begin": 6201858, - "headersEnd": 6201960, + "beginOffset": 6201858, + "headersEndOffset": 6201960, + "endOffset": 6203889, "children": [ { "mimeType": "text/richtext", "lineNumber": 87988, - "begin": 6201982, - "headersEnd": 6202105, - "end": 6202471, + "beginOffset": 6201982, + "headersEndOffset": 6202105, + "endOffset": 6202471, "octets": 366, "lines": 8 }, { "mimeType": "text/richtext", "lineNumber": 88002, - "begin": 6202494, - "headersEnd": 6202616, - "end": 6203008, + "beginOffset": 6202494, + "headersEndOffset": 6202616, + "endOffset": 6203008, "octets": 392, "lines": 10 }, { "mimeType": "text/richtext", "lineNumber": 88018, - "begin": 6203031, - "headersEnd": 6203156, - "end": 6203864, + "beginOffset": 6203031, + "headersEndOffset": 6203156, + "endOffset": 6203864, "octets": 708, "lines": 18 } ], - "end": 6203889, "octets": 1929, "lines": 55 }, { "mimeType": "multipart/mixed", "lineNumber": 88044, - "begin": 6203912, - "headersEnd": 6204011, + "beginOffset": 6203912, + "headersEndOffset": 6204011, + "endOffset": 6279086, "children": [ { "mimeType": "text/richtext", "lineNumber": 88048, - "begin": 6204033, - "headersEnd": 6204165, - "end": 6220580, + "beginOffset": 6204033, + "headersEndOffset": 6204165, + "endOffset": 6220580, "octets": 16415, "lines": 470 }, { "mimeType": "text/richtext", "lineNumber": 88524, - "begin": 6220603, - "headersEnd": 6220734, - "end": 6234988, + "beginOffset": 6220603, + "headersEndOffset": 6220734, + "endOffset": 6234988, "octets": 14254, "lines": 395 }, { "mimeType": "multipart/mixed", "lineNumber": 88925, - "begin": 6235011, - "headersEnd": 6235112, + "beginOffset": 6235011, + "headersEndOffset": 6235112, + "endOffset": 6278267, "children": [ { "mimeType": "text/richtext", "lineNumber": 88929, - "begin": 6235134, - "headersEnd": 6235276, - "end": 6241428, + "beginOffset": 6235134, + "headersEndOffset": 6235276, + "endOffset": 6241428, "octets": 6152, "lines": 164 }, { "mimeType": "text/richtext", "lineNumber": 89099, - "begin": 6241451, - "headersEnd": 6241578, - "end": 6246833, + "beginOffset": 6241451, + "headersEndOffset": 6241578, + "endOffset": 6246833, "octets": 5255, "lines": 160 }, { "mimeType": "text/richtext", "lineNumber": 89265, - "begin": 6246856, - "headersEnd": 6246993, - "end": 6254291, + "beginOffset": 6246856, + "headersEndOffset": 6246993, + "endOffset": 6254291, "octets": 7298, "lines": 197 }, { "mimeType": "text/richtext", "lineNumber": 89468, - "begin": 6254314, - "headersEnd": 6254438, - "end": 6260914, + "beginOffset": 6254314, + "headersEndOffset": 6254438, + "endOffset": 6260914, "octets": 6476, "lines": 184 }, { "mimeType": "text/richtext", "lineNumber": 89658, - "begin": 6260937, - "headersEnd": 6261074, - "end": 6278242, + "beginOffset": 6260937, + "headersEndOffset": 6261074, + "endOffset": 6278242, "octets": 17168, "lines": 492 } ], - "end": 6278267, "octets": 43155, "lines": 1228 }, { "mimeType": "multipart/mixed", "lineNumber": 90158, - "begin": 6278290, - "headersEnd": 6278385, + "beginOffset": 6278290, + "headersEndOffset": 6278385, + "endOffset": 6279061, "children": [ { "mimeType": "text/richtext", "lineNumber": 90162, - "begin": 6278407, - "headersEnd": 6278541, - "end": 6279036, + "beginOffset": 6278407, + "headersEndOffset": 6278541, + "endOffset": 6279036, "octets": 495, "lines": 21 } ], - "end": 6279061, "octets": 676, "lines": 28 } ], - "end": 6279086, "octets": 75075, "lines": 2144 }, { "mimeType": "multipart/mixed", "lineNumber": 90193, - "begin": 6279109, - "headersEnd": 6279220, + "beginOffset": 6279109, + "headersEndOffset": 6279220, + "endOffset": 6282763, "children": [ { "mimeType": "text/richtext", "lineNumber": 90197, - "begin": 6279242, - "headersEnd": 6279380, - "end": 6280529, + "beginOffset": 6279242, + "headersEndOffset": 6279380, + "endOffset": 6280529, "octets": 1149, "lines": 29 }, { "mimeType": "text/richtext", "lineNumber": 90232, - "begin": 6280552, - "headersEnd": 6280678, - "end": 6281898, + "beginOffset": 6280552, + "headersEndOffset": 6280678, + "endOffset": 6281898, "octets": 1220, "lines": 35 }, { "mimeType": "text/richtext", "lineNumber": 90273, - "begin": 6281921, - "headersEnd": 6282061, - "end": 6282738, + "beginOffset": 6281921, + "headersEndOffset": 6282061, + "endOffset": 6282738, "octets": 677, "lines": 22 } ], - "end": 6282763, "octets": 3543, "lines": 105 } ], - "end": 6282788, "octets": 80952, "lines": 2320 } ], - "end": 6282813, "octets": 81361, "lines": 2332 } ], - "end": 6282825, "octets": 82444, "lines": 2362 }, - "end": 6282825, "octets": 82444 }, { - "mboxMarkerBegin": 6282826, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6282826, "lineNumber": 90309, - "begin": 6282834, - "headersEnd": 6283636, + "beginOffset": 6282834, + "headersEndOffset": 6283636, + "endOffset": 6292835, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 90309, - "begin": 6282834, - "headersEnd": 6283636, - "end": 6292835, + "beginOffset": 6282834, + "headersEndOffset": 6283636, + "endOffset": 6292835, "octets": 9199, "lines": 226 }, - "end": 6292835, "octets": 9199 }, { - "mboxMarkerBegin": 6292836, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6292836, "lineNumber": 90554, - "begin": 6292844, - "headersEnd": 6293572, + "beginOffset": 6292844, + "headersEndOffset": 6293572, + "endOffset": 6385847, "body": { "mimeType": "multipart/alternative", "lineNumber": 90554, - "begin": 6292844, - "headersEnd": 6293572, + "beginOffset": 6292844, + "headersEndOffset": 6293572, + "endOffset": 6385847, "children": [ { "mimeType": "text/plain", "lineNumber": 90574, - "begin": 6293767, - "headersEnd": 6293811, - "end": 6294567, + "beginOffset": 6293767, + "headersEndOffset": 6293811, + "endOffset": 6294567, "octets": 756, "lines": 23 }, { "mimeType": "multipart/mixed", "lineNumber": 90601, - "begin": 6294608, - "headersEnd": 6294693, + "beginOffset": 6294608, + "headersEndOffset": 6294693, + "endOffset": 6385805, "children": [ { "mimeType": "text/richtext", "lineNumber": 90605, - "begin": 6294735, - "headersEnd": 6294826, - "end": 6295153, + "beginOffset": 6294735, + "headersEndOffset": 6294826, + "endOffset": 6295153, "octets": 327, "lines": 7 }, { "mimeType": "audio/basic", "lineNumber": 90617, - "begin": 6295196, - "headersEnd": 6295290, - "end": 6317314, + "beginOffset": 6295196, + "headersEndOffset": 6295290, + "endOffset": 6317314, "octets": 22024, "lines": 320 }, { "mimeType": "text/richtext", "lineNumber": 90943, - "begin": 6317357, - "headersEnd": 6317448, - "end": 6317614, + "beginOffset": 6317357, + "headersEndOffset": 6317448, + "endOffset": 6317614, "octets": 166, "lines": 5 }, { "mimeType": "audio/basic", "lineNumber": 90953, - "begin": 6317657, - "headersEnd": 6317754, - "end": 6364967, + "beginOffset": 6317657, + "headersEndOffset": 6317754, + "endOffset": 6364967, "octets": 47213, "lines": 685 }, { "mimeType": "text/richtext", "lineNumber": 91644, - "begin": 6365010, - "headersEnd": 6365101, - "end": 6365171, + "beginOffset": 6365010, + "headersEndOffset": 6365101, + "endOffset": 6365171, "octets": 70, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 91651, - "begin": 6365214, - "headersEnd": 6365304, - "end": 6385522, + "beginOffset": 6365214, + "headersEndOffset": 6365304, + "endOffset": 6385522, "octets": 20218, "lines": 294 }, { "mimeType": "text/richtext", "lineNumber": 91951, - "begin": 6385565, - "headersEnd": 6385656, - "end": 6385760, + "beginOffset": 6385565, + "headersEndOffset": 6385656, + "endOffset": 6385760, "octets": 104, "lines": 8 } ], - "end": 6385805, "octets": 91112, "lines": 1360 } ], - "end": 6385847, "octets": 92275, "lines": 1396 }, - "end": 6385847, "octets": 92275 }, { - "mboxMarkerBegin": 6385848, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6385848, "lineNumber": 91967, - "begin": 6385856, - "headersEnd": 6386610, + "beginOffset": 6385856, + "headersEndOffset": 6386610, + "endOffset": 6421275, "body": { "mimeType": "multipart/mixed", "lineNumber": 91967, - "begin": 6385856, - "headersEnd": 6386610, + "beginOffset": 6385856, + "headersEndOffset": 6386610, + "endOffset": 6421275, "children": [ { "mimeType": "text/richtext", "lineNumber": 91989, - "begin": 6386850, - "headersEnd": 6386923, - "end": 6387343, + "beginOffset": 6386850, + "headersEndOffset": 6386923, + "endOffset": 6387343, "octets": 420, "lines": 13 }, { "mimeType": "image/x-xwd", "lineNumber": 92007, - "begin": 6387389, - "headersEnd": 6387450, - "end": 6421014, + "beginOffset": 6387389, + "headersEndOffset": 6387450, + "endOffset": 6421014, "octets": 33564, "lines": 460 }, { "mimeType": "text/richtext", "lineNumber": 92472, - "begin": 6421060, - "headersEnd": 6421133, - "end": 6421227, + "beginOffset": 6421060, + "headersEndOffset": 6421133, + "endOffset": 6421227, "octets": 94, "lines": 7 } ], - "end": 6421275, "octets": 34665, "lines": 500 }, - "end": 6421275, "octets": 34665 }, { - "mboxMarkerBegin": 6421276, - "mboxMarkerLength": 41, + "mboxMarkerOffset": 6421276, "lineNumber": 92486, - "begin": 6421318, - "headersEnd": 6421466, + "beginOffset": 6421318, + "headersEndOffset": 6421466, + "endOffset": 6464495, "body": { "mimeType": "text/plain", "lineNumber": 92486, - "begin": 6421318, - "headersEnd": 6421466, - "end": 6464495, + "beginOffset": 6421318, + "headersEndOffset": 6421466, + "endOffset": 6464495, "octets": 43029, "lines": 693 }, - "end": 6464495, "octets": 43029 }, { - "mboxMarkerBegin": 6464496, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6464496, "lineNumber": 93187, - "begin": 6464528, - "headersEnd": 6465111, + "beginOffset": 6464528, + "headersEndOffset": 6465111, + "endOffset": 6490367, "body": { "mimeType": "multipart/mixed", "lineNumber": 93187, - "begin": 6464528, - "headersEnd": 6465111, + "beginOffset": 6464528, + "headersEndOffset": 6465111, + "endOffset": 6490367, "children": [ { "mimeType": "multipart/alternative", "lineNumber": 93205, - "begin": 6465196, - "headersEnd": 6465314, + "beginOffset": 6465196, + "headersEndOffset": 6465314, + "endOffset": 6469330, "children": [ { "mimeType": "text/plain", "lineNumber": 93210, - "begin": 6465354, - "headersEnd": 6465432, - "end": 6466704, + "beginOffset": 6465354, + "headersEndOffset": 6465432, + "endOffset": 6466704, "octets": 1272, "lines": 38 }, { "mimeType": "text/html", "lineNumber": 93253, - "begin": 6466744, - "headersEnd": 6466823, - "end": 6469287, + "beginOffset": 6466744, + "headersEndOffset": 6466823, + "endOffset": 6469287, "octets": 2464, "lines": 32 } ], - "end": 6469330, "octets": 4016, "lines": 83 }, { "mimeType": "application/octet-stream", "lineNumber": 93293, - "begin": 6469370, - "headersEnd": 6469575, - "end": 6490325, + "beginOffset": 6469370, + "headersEndOffset": 6469575, + "endOffset": 6490325, "octets": 20750, "lines": 270 } ], - "end": 6490367, "octets": 25256, "lines": 368 }, - "end": 6490367, "octets": 25256 }, { - "mboxMarkerBegin": 6490368, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6490368, "lineNumber": 93572, - "begin": 6490400, - "headersEnd": 6490806, + "beginOffset": 6490400, + "headersEndOffset": 6490806, + "endOffset": 6493572, "body": { "mimeType": "multipart/mixed", "lineNumber": 93572, - "begin": 6490400, - "headersEnd": 6490806, + "beginOffset": 6490400, + "headersEndOffset": 6490806, + "endOffset": 6493572, "children": [ { "mimeType": "text/plain", "lineNumber": 93586, - "begin": 6490872, - "headersEnd": 6490873, - "end": 6490936, + "beginOffset": 6490872, + "headersEndOffset": 6490873, + "endOffset": 6490936, "octets": 63, "lines": 1 }, { "mimeType": "multipart/alternative", "lineNumber": 93590, - "begin": 6490957, - "headersEnd": 6491031, + "beginOffset": 6490957, + "headersEndOffset": 6491031, + "endOffset": 6492741, "children": [ { "mimeType": "text/plain", "lineNumber": 93593, - "begin": 6491058, - "headersEnd": 6491164, - "end": 6491244, + "beginOffset": 6491058, + "headersEndOffset": 6491164, + "endOffset": 6491244, "octets": 80, "lines": 3 }, { "mimeType": "text/richtext", "lineNumber": 93602, - "begin": 6491272, - "headersEnd": 6491381, - "end": 6491539, + "beginOffset": 6491272, + "headersEndOffset": 6491381, + "endOffset": 6491539, "octets": 158, "lines": 4 }, { "mimeType": "text/enriched", "lineNumber": 93612, - "begin": 6491567, - "headersEnd": 6491676, - "end": 6491839, + "beginOffset": 6491567, + "headersEndOffset": 6491676, + "endOffset": 6491839, "octets": 163, "lines": 10 }, { "mimeType": "text/html", "lineNumber": 93628, - "begin": 6491867, - "headersEnd": 6491972, - "end": 6492133, + "beginOffset": 6491867, + "headersEndOffset": 6491972, + "endOffset": 6492133, "octets": 161, "lines": 3 }, { "mimeType": "text/something-you-dont-know", "lineNumber": 93637, - "begin": 6492161, - "headersEnd": 6492285, - "end": 6492712, + "beginOffset": 6492161, + "headersEndOffset": 6492285, + "endOffset": 6492712, "octets": 427, "lines": 6 } ], - "end": 6492741, "octets": 1710, "lines": 57 }, { "mimeType": "text/plain", "lineNumber": 93650, - "begin": 6492762, - "headersEnd": 6492763, - "end": 6492928, + "beginOffset": 6492762, + "headersEndOffset": 6492763, + "endOffset": 6492928, "octets": 165, "lines": 4 }, { "mimeType": "multipart/alternative", "lineNumber": 93657, - "begin": 6492949, - "headersEnd": 6492999, + "beginOffset": 6492949, + "headersEndOffset": 6492999, + "endOffset": 6493519, "children": [ { "mimeType": "text/plain", "lineNumber": 93660, - "begin": 6493004, - "headersEnd": 6493030, - "end": 6493083, + "beginOffset": 6493004, + "headersEndOffset": 6493030, + "endOffset": 6493083, "octets": 53, "lines": 1 }, { "mimeType": "multipart/alternative", "lineNumber": 93665, - "begin": 6493089, - "headersEnd": 6493139, + "beginOffset": 6493089, + "headersEndOffset": 6493139, + "endOffset": 6493399, "children": [ { "mimeType": "text/plain", "lineNumber": 93668, - "begin": 6493144, - "headersEnd": 6493170, - "end": 6493223, + "beginOffset": 6493144, + "headersEndOffset": 6493170, + "endOffset": 6493223, "octets": 53, "lines": 1 }, { "mimeType": "text/html", "lineNumber": 93673, - "begin": 6493229, - "headersEnd": 6493254, - "end": 6493304, + "beginOffset": 6493229, + "headersEndOffset": 6493254, + "endOffset": 6493304, "octets": 50, "lines": 1 }, { "mimeType": "text/x-barf", "lineNumber": 93678, - "begin": 6493310, - "headersEnd": 6493337, - "end": 6493391, + "beginOffset": 6493310, + "headersEndOffset": 6493337, + "endOffset": 6493391, "octets": 54, "lines": 1 } ], - "end": 6493399, "octets": 260, "lines": 16 }, { "mimeType": "application/spankme", "lineNumber": 93685, - "begin": 6493405, - "headersEnd": 6493497, - "end": 6493512, + "beginOffset": 6493405, + "headersEndOffset": 6493497, + "endOffset": 6493512, "octets": 15, "lines": 1 } ], - "end": 6493519, "octets": 520, "lines": 32 }, { "mimeType": "text/plain", "lineNumber": 93692, - "begin": 6493540, - "headersEnd": 6493541, - "end": 6493550, + "beginOffset": 6493540, + "headersEndOffset": 6493541, + "endOffset": 6493550, "octets": 9, "lines": 1 } ], - "end": 6493572, "octets": 2766, "lines": 113 }, - "end": 6493572, "octets": 2766 }, { - "mboxMarkerBegin": 6493573, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6493573, "lineNumber": 93697, - "begin": 6493605, - "headersEnd": 6494009, + "beginOffset": 6493605, + "headersEndOffset": 6494009, + "endOffset": 6844507, "body": { "mimeType": "multipart/mixed", "lineNumber": 93697, - "begin": 6493605, - "headersEnd": 6494009, + "beginOffset": 6493605, + "headersEndOffset": 6494009, + "endOffset": 6844507, "children": [ { "mimeType": "text/plain", "lineNumber": 93711, - "begin": 6494075, - "headersEnd": 6494076, - "end": 6494143, + "beginOffset": 6494075, + "headersEndOffset": 6494076, + "endOffset": 6494143, "octets": 67, "lines": 1 }, { "mimeType": "multipart/alternative", "lineNumber": 93715, - "begin": 6494164, - "headersEnd": 6494238, + "beginOffset": 6494164, + "headersEndOffset": 6494238, + "endOffset": 6844479, "children": [ { "mimeType": "text/plain", "lineNumber": 93718, - "begin": 6494265, - "headersEnd": 6494421, - "end": 6549684, + "beginOffset": 6494265, + "headersEndOffset": 6494421, + "endOffset": 6549684, "octets": 55263, "lines": 1603 }, { "mimeType": "text/html", "lineNumber": 95327, - "begin": 6549712, - "headersEnd": 6549867, - "end": 6655916, + "beginOffset": 6549712, + "headersEndOffset": 6549867, + "endOffset": 6655916, "octets": 106049, "lines": 2982 }, { "mimeType": "application/postscript", "lineNumber": 98315, - "begin": 6655944, - "headersEnd": 6656090, - "end": 6844449, + "beginOffset": 6655944, + "headersEndOffset": 6656090, + "endOffset": 6844449, "octets": 188359, "lines": 13109 } ], - "end": 6844479, "octets": 350241, "lines": 17713 } ], - "end": 6844507, "octets": 350498, "lines": 17726 }, - "end": 6844507, "octets": 350498 }, { - "mboxMarkerBegin": 6844508, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6844508, "lineNumber": 111435, - "begin": 6844516, - "headersEnd": 6845120, + "beginOffset": 6844516, + "headersEndOffset": 6845120, + "endOffset": 6846556, "body": { "mimeType": "MULTIPART/MIXED", "lineNumber": 111435, - "begin": 6844516, - "headersEnd": 6845120, + "beginOffset": 6844516, + "headersEndOffset": 6845120, + "endOffset": 6846556, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 111453, - "begin": 6845376, - "headersEnd": 6845488, - "end": 6845488, + "beginOffset": 6845376, + "headersEndOffset": 6845488, + "endOffset": 6845488, "octets": 0, "lines": 0 }, { "mimeType": "MESSAGE/RFC822", "lineNumber": 111458, - "begin": 6845529, - "headersEnd": 6845627, + "beginOffset": 6845529, + "headersEndOffset": 6845627, + "endOffset": 6846514, "message": { "lineNumber": 111461, - "begin": 6845627, - "headersEnd": 6846168, + "beginOffset": 6845627, + "headersEndOffset": 6846168, + "endOffset": 6846514, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 111461, - "begin": 6845627, - "headersEnd": 6846168, - "end": 6846514, + "beginOffset": 6845627, + "headersEndOffset": 6846168, + "endOffset": 6846514, "octets": 346, "lines": 16 }, - "end": 6846514, "octets": 346 }, - "end": 6846514, "octets": 887, "lines": 28 } ], - "end": 6846556, "octets": 1436, "lines": 43 }, - "end": 6846556, "octets": 1436 }, { - "mboxMarkerBegin": 6846557, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6846557, "lineNumber": 111492, - "begin": 6846565, - "headersEnd": 6846861, + "beginOffset": 6846565, + "headersEndOffset": 6846861, + "endOffset": 6858989, "body": { "mimeType": "multipart/related", "lineNumber": 111492, - "begin": 6846565, - "headersEnd": 6846861, + "beginOffset": 6846565, + "headersEndOffset": 6846861, + "endOffset": 6858989, "children": [ { "mimeType": "text/html", "lineNumber": 111502, - "begin": 6846900, - "headersEnd": 6847146, - "end": 6847865, + "beginOffset": 6846900, + "headersEndOffset": 6847146, + "endOffset": 6847865, "octets": 719, "lines": 30 }, { "mimeType": "image/jpeg", "lineNumber": 111541, - "begin": 6847905, - "headersEnd": 6848225, - "end": 6858948, + "beginOffset": 6847905, + "headersEndOffset": 6848225, + "endOffset": 6858948, "octets": 10723, "lines": 147 } ], - "end": 6858989, "octets": 12128, "lines": 197 }, - "end": 6858989, "octets": 12128 }, { - "mboxMarkerBegin": 6858990, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 6858990, "lineNumber": 111699, - "begin": 6858998, - "headersEnd": 6859294, + "beginOffset": 6858998, + "headersEndOffset": 6859294, + "endOffset": 6871390, "body": { "mimeType": "multipart/related", "lineNumber": 111699, - "begin": 6858998, - "headersEnd": 6859294, + "beginOffset": 6858998, + "headersEndOffset": 6859294, + "endOffset": 6871390, "children": [ { "mimeType": "text/html", "lineNumber": 111709, - "begin": 6859333, - "headersEnd": 6859579, - "end": 6860297, + "beginOffset": 6859333, + "headersEndOffset": 6859579, + "endOffset": 6860297, "octets": 718, "lines": 30 }, { "mimeType": "image/jpeg", "lineNumber": 111748, - "begin": 6860337, - "headersEnd": 6860626, - "end": 6871349, + "beginOffset": 6860337, + "headersEndOffset": 6860626, + "endOffset": 6871349, "octets": 10723, "lines": 147 } ], - "end": 6871390, "octets": 12096, "lines": 197 }, - "end": 6871390, "octets": 12096 }, { - "mboxMarkerBegin": 6871391, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6871391, "lineNumber": 111906, - "begin": 6871423, - "headersEnd": 6872926, + "beginOffset": 6871423, + "headersEndOffset": 6872926, + "endOffset": 6879481, "body": { "mimeType": "multipart/related", "lineNumber": 111906, - "begin": 6871423, - "headersEnd": 6872926, + "beginOffset": 6871423, + "headersEndOffset": 6872926, + "endOffset": 6879481, "children": [ { "mimeType": "text/html", "lineNumber": 111934, - "begin": 6872971, - "headersEnd": 6873062, - "end": 6878261, + "beginOffset": 6872971, + "headersEndOffset": 6873062, + "endOffset": 6878261, "octets": 5199, "lines": 111 }, { "mimeType": "image/gif", "lineNumber": 112050, - "begin": 6878306, - "headersEnd": 6878505, - "end": 6879434, + "beginOffset": 6878306, + "headersEndOffset": 6878505, + "endOffset": 6879434, "octets": 929, "lines": 13 } ], - "end": 6879481, "octets": 6555, "lines": 139 }, - "end": 6879481, "octets": 6555 }, { - "mboxMarkerBegin": 6879482, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 6879482, "lineNumber": 112073, - "begin": 6879514, - "headersEnd": 6879961, + "beginOffset": 6879514, + "headersEndOffset": 6879961, + "endOffset": 7094537, "body": { "mimeType": "multipart/mixed", "lineNumber": 112073, - "begin": 6879514, - "headersEnd": 6879961, + "beginOffset": 6879514, + "headersEndOffset": 6879961, + "endOffset": 7094537, "children": [ { "mimeType": "text/plain", "lineNumber": 112086, - "begin": 6880000, - "headersEnd": 6880026, - "end": 6880273, + "beginOffset": 6880000, + "headersEndOffset": 6880026, + "endOffset": 6880273, "octets": 247, "lines": 6 }, { "mimeType": "multipart/related", "lineNumber": 112096, - "begin": 6880313, - "headersEnd": 6880399, + "beginOffset": 6880313, + "headersEndOffset": 6880399, + "endOffset": 7094496, "children": [ { "mimeType": "text/html", "lineNumber": 112100, - "begin": 6880438, - "headersEnd": 6880632, - "end": 6887780, + "beginOffset": 6880438, + "headersEndOffset": 6880632, + "endOffset": 6887780, "octets": 7148, "lines": 179 }, { "mimeType": "image/gif", "lineNumber": 112286, - "begin": 6887820, - "headersEnd": 6887996, - "end": 6895977, + "beginOffset": 6887820, + "headersEndOffset": 6887996, + "endOffset": 6895977, "octets": 7981, "lines": 110 }, { "mimeType": "image/gif", "lineNumber": 112402, - "begin": 6896017, - "headersEnd": 6896176, - "end": 6903630, + "beginOffset": 6896017, + "headersEndOffset": 6896176, + "endOffset": 6903630, "octets": 7454, "lines": 103 }, { "mimeType": "image/gif", "lineNumber": 112511, - "begin": 6903670, - "headersEnd": 6903828, - "end": 6907161, + "beginOffset": 6903670, + "headersEndOffset": 6903828, + "endOffset": 6907161, "octets": 3333, "lines": 46 }, { "mimeType": "image/gif", "lineNumber": 112563, - "begin": 6907201, - "headersEnd": 6907360, - "end": 6915811, + "beginOffset": 6907201, + "headersEndOffset": 6907360, + "endOffset": 6915811, "octets": 8451, "lines": 116 }, { "mimeType": "image/gif", "lineNumber": 112685, - "begin": 6915851, - "headersEnd": 6916007, - "end": 7020376, + "beginOffset": 6915851, + "headersEndOffset": 6916007, + "endOffset": 7020376, "octets": 104369, "lines": 1430 }, { "mimeType": "image/jpeg", "lineNumber": 114121, - "begin": 7020416, - "headersEnd": 7020575, - "end": 7058936, + "beginOffset": 7020416, + "headersEndOffset": 7020575, + "endOffset": 7058936, "octets": 38361, "lines": 526 }, { "mimeType": "image/jpeg", "lineNumber": 114653, - "begin": 7058976, - "headersEnd": 7059140, - "end": 7094455, + "beginOffset": 7058976, + "headersEndOffset": 7059140, + "endOffset": 7094455, "octets": 35315, "lines": 484 } ], - "end": 7094496, "octets": 214097, "lines": 3044 } ], - "end": 7094537, "octets": 214576, "lines": 3059 }, - "end": 7094537, "octets": 214576 }, { - "mboxMarkerBegin": 7094538, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7094538, "lineNumber": 115145, - "begin": 7094546, - "headersEnd": 7094841, + "beginOffset": 7094546, + "headersEndOffset": 7094841, + "endOffset": 7106504, "body": { "mimeType": "multipart/related", "lineNumber": 115145, - "begin": 7094546, - "headersEnd": 7094841, + "beginOffset": 7094546, + "headersEndOffset": 7094841, + "endOffset": 7106504, "children": [ { "mimeType": "text/html", "lineNumber": 115155, - "begin": 7094880, - "headersEnd": 7095036, - "end": 7095587, + "beginOffset": 7094880, + "headersEndOffset": 7095036, + "endOffset": 7095587, "octets": 551, "lines": 27 }, { "mimeType": "image/jpeg", "lineNumber": 115189, - "begin": 7095627, - "headersEnd": 7095740, - "end": 7106463, + "beginOffset": 7095627, + "headersEndOffset": 7095740, + "endOffset": 7106463, "octets": 10723, "lines": 147 } ], - "end": 7106504, "octets": 11663, "lines": 188 }, - "end": 7106504, "octets": 11663 }, { - "mboxMarkerBegin": 7106505, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7106505, "lineNumber": 115343, - "begin": 7106513, - "headersEnd": 7106808, + "beginOffset": 7106513, + "headersEndOffset": 7106808, + "endOffset": 7118734, "body": { "mimeType": "multipart/related", "lineNumber": 115343, - "begin": 7106513, - "headersEnd": 7106808, + "beginOffset": 7106513, + "headersEndOffset": 7106808, + "endOffset": 7118734, "children": [ { "mimeType": "text/html", "lineNumber": 115353, - "begin": 7106847, - "headersEnd": 7107059, - "end": 7107656, + "beginOffset": 7106847, + "headersEndOffset": 7107059, + "endOffset": 7107656, "octets": 597, "lines": 28 }, { "mimeType": "image/jpeg", "lineNumber": 115389, - "begin": 7107696, - "headersEnd": 7107970, - "end": 7118693, + "beginOffset": 7107696, + "headersEndOffset": 7107970, + "endOffset": 7118693, "octets": 10723, "lines": 147 } ], - "end": 7118734, "octets": 11926, "lines": 193 }, - "end": 7118734, "octets": 11926 }, { - "mboxMarkerBegin": 7118735, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7118735, "lineNumber": 115546, - "begin": 7118743, - "headersEnd": 7119038, + "beginOffset": 7118743, + "headersEndOffset": 7119038, + "endOffset": 7130873, "body": { "mimeType": "multipart/related", "lineNumber": 115546, - "begin": 7118743, - "headersEnd": 7119038, + "beginOffset": 7118743, + "headersEndOffset": 7119038, + "endOffset": 7130873, "children": [ { "mimeType": "text/html", "lineNumber": 115556, - "begin": 7119077, - "headersEnd": 7119293, - "end": 7119894, + "beginOffset": 7119077, + "headersEndOffset": 7119293, + "endOffset": 7119894, "octets": 601, "lines": 28 }, { "mimeType": "image/jpeg", "lineNumber": 115592, - "begin": 7119934, - "headersEnd": 7120109, - "end": 7130832, + "beginOffset": 7119934, + "headersEndOffset": 7120109, + "endOffset": 7130832, "octets": 10723, "lines": 147 } ], - "end": 7130873, "octets": 11835, "lines": 191 }, - "end": 7130873, "octets": 11835 }, { - "mboxMarkerBegin": 7130874, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7130874, "lineNumber": 115747, - "begin": 7130882, - "headersEnd": 7131177, + "beginOffset": 7130882, + "headersEndOffset": 7131177, + "endOffset": 7143201, "body": { "mimeType": "multipart/related", "lineNumber": 115747, - "begin": 7130882, - "headersEnd": 7131177, + "beginOffset": 7130882, + "headersEndOffset": 7131177, + "endOffset": 7143201, "children": [ { "mimeType": "text/html", "lineNumber": 115757, - "begin": 7131216, - "headersEnd": 7131461, - "end": 7132092, + "beginOffset": 7131216, + "headersEndOffset": 7131461, + "endOffset": 7132092, "octets": 631, "lines": 29 }, { "mimeType": "image/jpeg", "lineNumber": 115795, - "begin": 7132132, - "headersEnd": 7132437, - "end": 7143160, + "beginOffset": 7132132, + "headersEndOffset": 7132437, + "endOffset": 7143160, "octets": 10723, "lines": 147 } ], - "end": 7143201, "octets": 12024, "lines": 196 }, - "end": 7143201, "octets": 12024 }, { - "mboxMarkerBegin": 7143202, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7143202, "lineNumber": 115953, - "begin": 7143210, - "headersEnd": 7143505, + "beginOffset": 7143210, + "headersEndOffset": 7143505, + "endOffset": 7155384, "body": { "mimeType": "multipart/related", "lineNumber": 115953, - "begin": 7143210, - "headersEnd": 7143505, + "beginOffset": 7143210, + "headersEndOffset": 7143505, + "endOffset": 7155384, "children": [ { "mimeType": "text/html", "lineNumber": 115963, - "begin": 7143544, - "headersEnd": 7143760, - "end": 7144405, + "beginOffset": 7143544, + "headersEndOffset": 7143760, + "endOffset": 7144405, "octets": 645, "lines": 28 }, { "mimeType": "image/jpeg", "lineNumber": 115999, - "begin": 7144445, - "headersEnd": 7144620, - "end": 7155343, + "beginOffset": 7144445, + "headersEndOffset": 7144620, + "endOffset": 7155343, "octets": 10723, "lines": 147 } ], - "end": 7155384, "octets": 11879, "lines": 191 }, - "end": 7155384, "octets": 11879 }, { - "mboxMarkerBegin": 7155385, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7155385, "lineNumber": 116154, - "begin": 7155393, - "headersEnd": 7155688, + "beginOffset": 7155393, + "headersEndOffset": 7155688, + "endOffset": 7167782, "body": { "mimeType": "multipart/related", "lineNumber": 116154, - "begin": 7155393, - "headersEnd": 7155688, + "beginOffset": 7155393, + "headersEndOffset": 7155688, + "endOffset": 7167782, "children": [ { "mimeType": "text/html", "lineNumber": 116164, - "begin": 7155727, - "headersEnd": 7155972, - "end": 7156642, + "beginOffset": 7155727, + "headersEndOffset": 7155972, + "endOffset": 7156642, "octets": 670, "lines": 29 }, { "mimeType": "image/jpeg", "lineNumber": 116202, - "begin": 7156682, - "headersEnd": 7157018, - "end": 7167741, + "beginOffset": 7156682, + "headersEndOffset": 7157018, + "endOffset": 7167741, "octets": 10723, "lines": 147 } ], - "end": 7167782, "octets": 12094, "lines": 196 }, - "end": 7167782, "octets": 12094 }, { - "mboxMarkerBegin": 7167783, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 7167783, "lineNumber": 116360, - "begin": 7167815, - "headersEnd": 7169049, + "beginOffset": 7167815, + "headersEndOffset": 7169049, + "endOffset": 7916334, "body": { "mimeType": "multipart/mixed", "lineNumber": 116360, - "begin": 7167815, - "headersEnd": 7169049, + "beginOffset": 7167815, + "headersEndOffset": 7169049, + "endOffset": 7916334, "children": [ { "mimeType": "text/plain", "lineNumber": 116385, - "begin": 7169133, - "headersEnd": 7169209, - "end": 7169236, + "beginOffset": 7169133, + "headersEndOffset": 7169209, + "endOffset": 7169236, "octets": 27, "lines": 3 }, { "mimeType": "message/rfc822", "lineNumber": 116393, - "begin": 7169275, - "headersEnd": 7169365, + "beginOffset": 7169275, + "headersEndOffset": 7169365, + "endOffset": 7916293, "message": { "lineNumber": 116397, - "begin": 7169365, - "headersEnd": 7170186, + "beginOffset": 7169365, + "headersEndOffset": 7170186, + "endOffset": 7916293, "body": { "mimeType": "multipart/alternative", "lineNumber": 116397, - "begin": 7169365, - "headersEnd": 7170186, + "beginOffset": 7169365, + "headersEndOffset": 7170186, + "endOffset": 7916293, "children": [ { "mimeType": "text/plain", "lineNumber": 116415, - "begin": 7170226, - "headersEnd": 7170302, - "end": 7170929, + "beginOffset": 7170226, + "headersEndOffset": 7170302, + "endOffset": 7170929, "octets": 627, "lines": 16 }, { "mimeType": "multipart/related", "lineNumber": 116436, - "begin": 7170969, - "headersEnd": 7171051, + "beginOffset": 7170969, + "headersEndOffset": 7171051, + "endOffset": 7916249, "children": [ { "mimeType": "text/html", "lineNumber": 116440, - "begin": 7171091, - "headersEnd": 7171166, - "end": 7172016, + "beginOffset": 7171091, + "headersEndOffset": 7171166, + "endOffset": 7172016, "octets": 850, "lines": 18 }, { "mimeType": "image/tiff", "lineNumber": 116463, - "begin": 7172056, - "headersEnd": 7172240, - "end": 7916207, + "beginOffset": 7172056, + "headersEndOffset": 7172240, + "endOffset": 7916207, "octets": 743967, "lines": 10192 } ], - "end": 7916249, "octets": 745198, "lines": 10223 } ], - "end": 7916293, "octets": 746107, "lines": 10252 }, - "end": 7916293, "octets": 746107 }, - "end": 7916293, "octets": 746928, "lines": 10268 } ], - "end": 7916334, "octets": 747285, "lines": 10285 }, - "end": 7916334, "octets": 747285 }, { - "mboxMarkerBegin": 7916335, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 7916335, "lineNumber": 126669, - "begin": 7916367, - "headersEnd": 7917631, + "beginOffset": 7916367, + "headersEndOffset": 7917631, + "endOffset": 7964259, "body": { "mimeType": "multipart/related", "lineNumber": 126669, - "begin": 7916367, - "headersEnd": 7917631, + "beginOffset": 7916367, + "headersEndOffset": 7917631, + "endOffset": 7964259, "children": [ { "mimeType": "text/html", "lineNumber": 126693, - "begin": 7917676, - "headersEnd": 7917767, - "end": 7920149, + "beginOffset": 7917676, + "headersEndOffset": 7917767, + "endOffset": 7920149, "octets": 2382, "lines": 50 }, { "mimeType": "image/gif", "lineNumber": 126748, - "begin": 7920194, - "headersEnd": 7920353, - "end": 7926376, + "beginOffset": 7920194, + "headersEndOffset": 7920353, + "endOffset": 7926376, "octets": 6023, "lines": 79 }, { "mimeType": "image/gif", "lineNumber": 126834, - "begin": 7926421, - "headersEnd": 7926579, - "end": 7938652, + "beginOffset": 7926421, + "headersEndOffset": 7926579, + "endOffset": 7938652, "octets": 12073, "lines": 157 }, { "mimeType": "image/gif", "lineNumber": 126998, - "begin": 7938697, - "headersEnd": 7938857, - "end": 7960571, + "beginOffset": 7938697, + "headersEndOffset": 7938857, + "endOffset": 7960571, "octets": 21714, "lines": 282 }, { "mimeType": "image/gif", "lineNumber": 127287, - "begin": 7960616, - "headersEnd": 7960819, - "end": 7964212, + "beginOffset": 7960616, + "headersEndOffset": 7960819, + "endOffset": 7964212, "octets": 3393, "lines": 45 } ], - "end": 7964259, "octets": 46628, "lines": 649 }, - "end": 7964259, "octets": 46628 }, { - "mboxMarkerBegin": 7964260, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 7964260, "lineNumber": 127342, - "begin": 7964268, - "headersEnd": 7965009, + "beginOffset": 7964268, + "headersEndOffset": 7965009, + "endOffset": 8509625, "body": { "mimeType": "audio/basic", "lineNumber": 127342, - "begin": 7964268, - "headersEnd": 7965009, - "end": 8509625, + "beginOffset": 7964268, + "headersEndOffset": 7965009, + "endOffset": 8509625, "octets": 544616, "lines": 7474 }, - "end": 8509625, "octets": 544616 }, { - "mboxMarkerBegin": 8509626, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8509626, "lineNumber": 134835, - "begin": 8509634, - "headersEnd": 8510545, + "beginOffset": 8509634, + "headersEndOffset": 8510545, + "endOffset": 8513124, "body": { "mimeType": "multipart/mixed", "lineNumber": 134835, - "begin": 8509634, - "headersEnd": 8510545, + "beginOffset": 8509634, + "headersEndOffset": 8510545, + "endOffset": 8513124, "children": [ { "mimeType": "text/richtext", "lineNumber": 134858, - "begin": 8510554, - "headersEnd": 8510583, - "end": 8513113, + "beginOffset": 8510554, + "headersEndOffset": 8510583, + "endOffset": 8513113, "octets": 2530, "lines": 96 } ], - "end": 8513124, "octets": 2579, "lines": 102 }, - "end": 8513124, "octets": 2579 }, { - "mboxMarkerBegin": 8513125, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 8513125, "lineNumber": 134960, - "begin": 8513157, - "headersEnd": 8513751, + "beginOffset": 8513157, + "headersEndOffset": 8513751, + "endOffset": 8515537, "body": { "mimeType": "multipart/signed", "lineNumber": 134960, - "begin": 8513157, - "headersEnd": 8513751, + "beginOffset": 8513157, + "headersEndOffset": 8513751, + "endOffset": 8515537, "children": [ { "mimeType": "text/plain", "lineNumber": 134984, - "begin": 8514048, - "headersEnd": 8514093, - "end": 8515175, + "beginOffset": 8514048, + "headersEndOffset": 8514093, + "endOffset": 8515175, "octets": 1082, "lines": 26 }, { "mimeType": "application/pgp-signature", "lineNumber": 135014, - "begin": 8515193, - "headersEnd": 8515234, - "end": 8515518, + "beginOffset": 8515193, + "headersEndOffset": 8515234, + "endOffset": 8515518, "octets": 284, "lines": 9 } ], - "end": 8515537, "octets": 1786, "lines": 51 }, - "end": 8515537, "octets": 1786 }, { - "mboxMarkerBegin": 8515538, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8515538, "lineNumber": 135028, - "begin": 8515546, - "headersEnd": 8516708, + "beginOffset": 8515546, + "headersEndOffset": 8516708, + "endOffset": 8518091, "body": { "mimeType": "application/pgp", "lineNumber": 135028, - "begin": 8515546, - "headersEnd": 8516708, - "end": 8518091, + "beginOffset": 8515546, + "headersEndOffset": 8516708, + "endOffset": 8518091, "octets": 1383, "lines": 40 }, - "end": 8518091, "octets": 1383 }, { - "mboxMarkerBegin": 8518092, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8518092, "lineNumber": 135090, - "begin": 8518100, - "headersEnd": 8518733, + "beginOffset": 8518100, + "headersEndOffset": 8518733, + "endOffset": 8519707, "body": { "mimeType": "text/plain", "lineNumber": 135090, - "begin": 8518100, - "headersEnd": 8518733, - "end": 8519707, + "beginOffset": 8518100, + "headersEndOffset": 8518733, + "endOffset": 8519707, "octets": 974, "lines": 27 }, - "end": 8519707, "octets": 974 }, { - "mboxMarkerBegin": 8519708, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8519708, "lineNumber": 135136, - "begin": 8519716, - "headersEnd": 8520478, + "beginOffset": 8519716, + "headersEndOffset": 8520478, + "endOffset": 8523391, "body": { "mimeType": "multipart/alternative", "lineNumber": 135136, - "begin": 8519716, - "headersEnd": 8520478, + "beginOffset": 8519716, + "headersEndOffset": 8520478, + "endOffset": 8523391, "children": [ { "mimeType": "text/plain", "lineNumber": 135158, - "begin": 8520673, - "headersEnd": 8520717, - "end": 8521534, + "beginOffset": 8520673, + "headersEndOffset": 8520717, + "endOffset": 8521534, "octets": 817, "lines": 15 }, { "mimeType": "multipart/mixed", "lineNumber": 135177, - "begin": 8521575, - "headersEnd": 8521660, + "beginOffset": 8521575, + "headersEndOffset": 8521660, + "endOffset": 8523348, "children": [ { "mimeType": "text/richtext", "lineNumber": 135181, - "begin": 8521702, - "headersEnd": 8521793, - "end": 8522284, + "beginOffset": 8521702, + "headersEndOffset": 8521793, + "endOffset": 8522284, "octets": 491, "lines": 10 }, { "mimeType": "message/external-body", "lineNumber": 135196, - "begin": 8522327, - "headersEnd": 8522513, + "beginOffset": 8522327, + "headersEndOffset": 8522513, + "endOffset": 8522542, "message": { "lineNumber": 135203, - "begin": 8522513, - "headersEnd": 8522540, + "beginOffset": 8522513, + "headersEndOffset": 8522540, + "endOffset": 8522542, "body": { "mimeType": "audio/basic", "lineNumber": 135203, - "begin": 8522513, - "headersEnd": 8522540, - "end": 8522542, + "beginOffset": 8522513, + "headersEndOffset": 8522540, + "endOffset": 8522542, "octets": 2, "lines": 2 }, - "end": 8522542, "octets": 2 }, - "end": 8522542, "octets": 29, "lines": 4 }, { "mimeType": "text/plain", "lineNumber": 135209, - "begin": 8522585, - "headersEnd": 8522673, - "end": 8522676, + "beginOffset": 8522585, + "headersEndOffset": 8522673, + "endOffset": 8522676, "octets": 3, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 135216, - "begin": 8522719, - "headersEnd": 8522920, + "beginOffset": 8522719, + "headersEndOffset": 8522920, + "endOffset": 8522947, "message": { "lineNumber": 135223, - "begin": 8522920, - "headersEnd": 8522945, + "beginOffset": 8522920, + "headersEndOffset": 8522945, + "endOffset": 8522947, "body": { "mimeType": "image/gif", "lineNumber": 135223, - "begin": 8522920, - "headersEnd": 8522945, - "end": 8522947, + "beginOffset": 8522920, + "headersEndOffset": 8522945, + "endOffset": 8522947, "octets": 2, "lines": 2 }, - "end": 8522947, "octets": 2 }, - "end": 8522947, "octets": 27, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135229, - "begin": 8522990, - "headersEnd": 8523081, - "end": 8523303, + "beginOffset": 8522990, + "headersEndOffset": 8523081, + "endOffset": 8523303, "octets": 222, "lines": 7 } ], - "end": 8523348, "octets": 1688, "lines": 61 } ], - "end": 8523391, "octets": 2913, "lines": 89 }, - "end": 8523391, "octets": 2913 }, { - "mboxMarkerBegin": 8523392, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8523392, "lineNumber": 135245, - "begin": 8523400, - "headersEnd": 8524214, + "beginOffset": 8523400, + "headersEndOffset": 8524214, + "endOffset": 8525600, "body": { "mimeType": "text/richtext", "lineNumber": 135245, - "begin": 8523400, - "headersEnd": 8524214, - "end": 8525600, + "beginOffset": 8523400, + "headersEndOffset": 8524214, + "endOffset": 8525600, "octets": 1386, "lines": 42 }, - "end": 8525600, "octets": 1386 }, { - "mboxMarkerBegin": 8525601, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8525601, "lineNumber": 135307, - "begin": 8525609, - "headersEnd": 8525761, + "beginOffset": 8525609, + "headersEndOffset": 8525761, + "endOffset": 8530432, "body": { "mimeType": "message/partial", "lineNumber": 135307, - "begin": 8525609, - "headersEnd": 8525761, - "end": 8530432, + "beginOffset": 8525609, + "headersEndOffset": 8525761, + "endOffset": 8530432, "octets": 4671, "lines": 64 }, - "end": 8530432, "octets": 4671 }, { - "mboxMarkerBegin": 8530433, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8530433, "lineNumber": 135377, - "begin": 8530441, - "headersEnd": 8532184, + "beginOffset": 8530441, + "headersEndOffset": 8532184, + "endOffset": 8543555, "body": { "mimeType": "multipart/alternative", "lineNumber": 135377, - "begin": 8530441, - "headersEnd": 8532184, + "beginOffset": 8530441, + "headersEndOffset": 8532184, + "endOffset": 8543555, "children": [ { "mimeType": "text/plain", "lineNumber": 135416, - "begin": 8532379, - "headersEnd": 8532423, - "end": 8534090, + "beginOffset": 8532379, + "headersEndOffset": 8532423, + "endOffset": 8534090, "octets": 1667, "lines": 38 }, { "mimeType": "multipart/mixed", "lineNumber": 135458, - "begin": 8534131, - "headersEnd": 8534216, + "beginOffset": 8534131, + "headersEndOffset": 8534216, + "endOffset": 8543512, "children": [ { "mimeType": "text/richtext", "lineNumber": 135462, - "begin": 8534258, - "headersEnd": 8534349, - "end": 8534906, + "beginOffset": 8534258, + "headersEndOffset": 8534349, + "endOffset": 8534906, "octets": 557, "lines": 14 }, { "mimeType": "image/x-xwd", "lineNumber": 135481, - "begin": 8534949, - "headersEnd": 8535010, - "end": 8535882, + "beginOffset": 8534949, + "headersEndOffset": 8535010, + "endOffset": 8535882, "octets": 872, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135498, - "begin": 8535925, - "headersEnd": 8536016, - "end": 8536062, + "beginOffset": 8535925, + "headersEndOffset": 8536016, + "endOffset": 8536062, "octets": 46, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135508, - "begin": 8536105, - "headersEnd": 8536166, - "end": 8537038, + "beginOffset": 8536105, + "headersEndOffset": 8536166, + "endOffset": 8537038, "octets": 872, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135525, - "begin": 8537081, - "headersEnd": 8537172, - "end": 8537218, + "beginOffset": 8537081, + "headersEndOffset": 8537172, + "endOffset": 8537218, "octets": 46, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135535, - "begin": 8537261, - "headersEnd": 8537322, - "end": 8538194, + "beginOffset": 8537261, + "headersEndOffset": 8537322, + "endOffset": 8538194, "octets": 872, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135552, - "begin": 8538237, - "headersEnd": 8538328, - "end": 8538368, + "beginOffset": 8538237, + "headersEndOffset": 8538328, + "endOffset": 8538368, "octets": 40, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135562, - "begin": 8538411, - "headersEnd": 8538472, - "end": 8538696, + "beginOffset": 8538411, + "headersEndOffset": 8538472, + "endOffset": 8538696, "octets": 224, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135571, - "begin": 8538739, - "headersEnd": 8538830, - "end": 8538894, + "beginOffset": 8538739, + "headersEndOffset": 8538830, + "endOffset": 8538894, "octets": 64, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135581, - "begin": 8538937, - "headersEnd": 8538998, - "end": 8539222, + "beginOffset": 8538937, + "headersEndOffset": 8538998, + "endOffset": 8539222, "octets": 224, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135590, - "begin": 8539265, - "headersEnd": 8539356, - "end": 8539400, + "beginOffset": 8539265, + "headersEndOffset": 8539356, + "endOffset": 8539400, "octets": 44, "lines": 5 }, { "mimeType": "image/x-xwd", "lineNumber": 135600, - "begin": 8539443, - "headersEnd": 8539504, - "end": 8539728, + "beginOffset": 8539443, + "headersEndOffset": 8539504, + "endOffset": 8539728, "octets": 224, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 135609, - "begin": 8539771, - "headersEnd": 8539862, - "end": 8540154, + "beginOffset": 8539771, + "headersEndOffset": 8539862, + "endOffset": 8540154, "octets": 292, "lines": 11 }, { "mimeType": "image/x-xwd", "lineNumber": 135625, - "begin": 8540197, - "headersEnd": 8540258, - "end": 8541130, + "beginOffset": 8540197, + "headersEndOffset": 8540258, + "endOffset": 8541130, "octets": 872, "lines": 12 }, { "mimeType": "text/richtext", "lineNumber": 135642, - "begin": 8541173, - "headersEnd": 8541264, - "end": 8541304, + "beginOffset": 8541173, + "headersEndOffset": 8541264, + "endOffset": 8541304, "octets": 40, "lines": 4 }, { "mimeType": "image/x-xwd", "lineNumber": 135651, - "begin": 8541347, - "headersEnd": 8541408, - "end": 8543323, + "beginOffset": 8541347, + "headersEndOffset": 8541408, + "endOffset": 8543323, "octets": 1915, "lines": 27 }, { "mimeType": "text/richtext", "lineNumber": 135683, - "begin": 8543366, - "headersEnd": 8543457, - "end": 8543467, + "beginOffset": 8543366, + "headersEndOffset": 8543457, + "endOffset": 8543467, "octets": 10, "lines": 1 } ], - "end": 8543512, "octets": 9296, "lines": 228 } ], - "end": 8543555, "octets": 11371, "lines": 279 }, - "end": 8543555, "octets": 11371 }, { - "mboxMarkerBegin": 8543556, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8543556, "lineNumber": 135693, - "begin": 8543564, - "headersEnd": 8544292, + "beginOffset": 8543564, + "headersEndOffset": 8544292, + "endOffset": 8554952, "body": { "mimeType": "multipart/alternative", "lineNumber": 135693, - "begin": 8543564, - "headersEnd": 8544292, + "beginOffset": 8543564, + "headersEndOffset": 8544292, + "endOffset": 8554952, "children": [ { "mimeType": "text/plain", "lineNumber": 135713, - "begin": 8544487, - "headersEnd": 8544531, - "end": 8545158, + "beginOffset": 8544487, + "headersEndOffset": 8544531, + "endOffset": 8545158, "octets": 627, "lines": 12 }, { "mimeType": "multipart/mixed", "lineNumber": 135729, - "begin": 8545199, - "headersEnd": 8545284, + "beginOffset": 8545199, + "headersEndOffset": 8545284, + "endOffset": 8554910, "children": [ { "mimeType": "text/richtext", "lineNumber": 135733, - "begin": 8545326, - "headersEnd": 8545417, - "end": 8545950, + "beginOffset": 8545326, + "headersEndOffset": 8545417, + "endOffset": 8545950, "octets": 533, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 135746, - "begin": 8545993, - "headersEnd": 8546101, - "end": 8554686, + "beginOffset": 8545993, + "headersEndOffset": 8546101, + "endOffset": 8554686, "octets": 8585, "lines": 125 }, { "mimeType": "text/richtext", "lineNumber": 135877, - "begin": 8554729, - "headersEnd": 8554820, - "end": 8554865, + "beginOffset": 8554729, + "headersEndOffset": 8554820, + "endOffset": 8554865, "octets": 45, "lines": 3 } ], - "end": 8554910, "octets": 9626, "lines": 153 } ], - "end": 8554952, "octets": 10660, "lines": 178 }, - "end": 8554952, "octets": 10660 }, { - "mboxMarkerBegin": 8554953, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8554953, "lineNumber": 135888, - "begin": 8554961, - "headersEnd": 8555607, + "beginOffset": 8554961, + "headersEndOffset": 8555607, + "endOffset": 8634515, "body": { "mimeType": "multipart/mixed", "lineNumber": 135888, - "begin": 8554961, - "headersEnd": 8555607, + "beginOffset": 8554961, + "headersEndOffset": 8555607, + "endOffset": 8634515, "children": [ { "mimeType": "text/plain", "lineNumber": 135905, - "begin": 8555657, - "headersEnd": 8555747, - "end": 8555844, + "beginOffset": 8555657, + "headersEndOffset": 8555747, + "endOffset": 8555844, "octets": 97, "lines": 6 }, { "mimeType": "audio/basic", "lineNumber": 135916, - "begin": 8555894, - "headersEnd": 8556021, - "end": 8634463, + "beginOffset": 8555894, + "headersEndOffset": 8556021, + "endOffset": 8634463, "octets": 78442, "lines": 1075 } ], - "end": 8634515, "octets": 78908, "lines": 1093 }, - "end": 8634515, "octets": 78908 }, { - "mboxMarkerBegin": 8634516, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8634516, "lineNumber": 136998, - "begin": 8634524, - "headersEnd": 8635280, + "beginOffset": 8634524, + "headersEndOffset": 8635280, + "endOffset": 8820549, "body": { "mimeType": "multipart/alternative", "lineNumber": 136998, - "begin": 8634524, - "headersEnd": 8635280, + "beginOffset": 8634524, + "headersEndOffset": 8635280, + "endOffset": 8820549, "children": [ { "mimeType": "text/plain", "lineNumber": 137019, - "begin": 8635475, - "headersEnd": 8635519, - "end": 8636869, + "beginOffset": 8635475, + "headersEndOffset": 8635519, + "endOffset": 8636869, "octets": 1350, "lines": 28 }, { "mimeType": "multipart/mixed", "lineNumber": 137051, - "begin": 8636910, - "headersEnd": 8636995, + "beginOffset": 8636910, + "headersEndOffset": 8636995, + "endOffset": 8820507, "children": [ { "mimeType": "text/richtext", "lineNumber": 137055, - "begin": 8637037, - "headersEnd": 8637128, - "end": 8638267, + "beginOffset": 8637037, + "headersEndOffset": 8637128, + "endOffset": 8638267, "octets": 1139, "lines": 22 }, { "mimeType": "audio/basic", "lineNumber": 137082, - "begin": 8638310, - "headersEnd": 8638408, - "end": 8753651, + "beginOffset": 8638310, + "headersEndOffset": 8638408, + "endOffset": 8753651, "octets": 115243, "lines": 1579 }, { "mimeType": "text/richtext", "lineNumber": 138667, - "begin": 8753694, - "headersEnd": 8753785, - "end": 8753908, + "beginOffset": 8753694, + "headersEndOffset": 8753785, + "endOffset": 8753908, "octets": 123, "lines": 3 }, { "mimeType": "image/gif", "lineNumber": 138675, - "begin": 8753951, - "headersEnd": 8754050, - "end": 8820331, + "beginOffset": 8753951, + "headersEndOffset": 8754050, + "endOffset": 8820331, "octets": 66281, "lines": 961 }, { "mimeType": "text/plain", "lineNumber": 139642, - "begin": 8820374, - "headersEnd": 8820462, - "end": 8820462, + "beginOffset": 8820374, + "headersEndOffset": 8820462, + "endOffset": 8820462, "octets": 0, "lines": 0 } ], - "end": 8820507, "octets": 183512, "lines": 2593 } ], - "end": 8820549, "octets": 185269, "lines": 2634 }, - "end": 8820549, "octets": 185269 }, { - "mboxMarkerBegin": 8820550, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8820550, "lineNumber": 139650, - "begin": 8820558, - "headersEnd": 8821395, + "beginOffset": 8820558, + "headersEndOffset": 8821395, + "endOffset": 8823128, "body": { "mimeType": "application/x-pkcs", "lineNumber": 139650, - "begin": 8820558, - "headersEnd": 8821395, - "end": 8823128, + "beginOffset": 8820558, + "headersEndOffset": 8821395, + "endOffset": 8823128, "octets": 1733, "lines": 25 }, - "end": 8823128, "octets": 1733 }, { - "mboxMarkerBegin": 8823129, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8823129, "lineNumber": 139696, - "begin": 8823137, - "headersEnd": 8823767, + "beginOffset": 8823137, + "headersEndOffset": 8823767, + "endOffset": 8825125, "body": { "mimeType": "MESSAGE/RFC822", "lineNumber": 139696, - "begin": 8823137, - "headersEnd": 8823767, + "beginOffset": 8823137, + "headersEndOffset": 8823767, + "endOffset": 8825125, "message": { "lineNumber": 139710, - "begin": 8823767, - "headersEnd": 8824250, + "beginOffset": 8823767, + "headersEndOffset": 8824250, + "endOffset": 8825125, "body": { "mimeType": "TEXT/PLAIN", "lineNumber": 139710, - "begin": 8823767, - "headersEnd": 8824250, - "end": 8825125, + "beginOffset": 8823767, + "headersEndOffset": 8824250, + "endOffset": 8825125, "octets": 875, "lines": 25 }, - "end": 8825125, "octets": 875 }, - "end": 8825125, "octets": 1358, "lines": 38 }, - "end": 8825125, "octets": 1358 }, { - "mboxMarkerBegin": 8825126, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8825126, "lineNumber": 139749, - "begin": 8825134, - "headersEnd": 8825579, + "beginOffset": 8825134, + "headersEndOffset": 8825579, + "endOffset": 8916963, "body": { "mimeType": "multipart/mixed", "lineNumber": 139749, - "begin": 8825134, - "headersEnd": 8825579, + "beginOffset": 8825134, + "headersEndOffset": 8825579, + "endOffset": 8916963, "children": [ { "mimeType": "text/plain", "lineNumber": 139763, - "begin": 8825588, - "headersEnd": 8825589, - "end": 8825629, + "beginOffset": 8825588, + "headersEndOffset": 8825589, + "endOffset": 8825629, "octets": 40, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 139767, - "begin": 8825639, - "headersEnd": 8825700, - "end": 8916949, + "beginOffset": 8825639, + "headersEndOffset": 8825700, + "endOffset": 8916949, "octets": 91249, "lines": 1250 } ], - "end": 8916963, "octets": 91384, "lines": 1261 }, - "end": 8916963, "octets": 91384 }, { - "mboxMarkerBegin": 8916964, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8916964, "lineNumber": 141025, - "begin": 8916972, - "headersEnd": 8917462, + "beginOffset": 8916972, + "headersEndOffset": 8917462, + "endOffset": 8918604, "body": { "mimeType": "text/plain", "lineNumber": 141025, - "begin": 8916972, - "headersEnd": 8917462, - "end": 8918604, + "beginOffset": 8916972, + "headersEndOffset": 8917462, + "endOffset": 8918604, "octets": 1142, "lines": 27 }, - "end": 8918604, "octets": 1142 }, { - "mboxMarkerBegin": 8918605, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 8918605, "lineNumber": 141066, - "begin": 8918613, - "headersEnd": 8919753, + "beginOffset": 8918613, + "headersEndOffset": 8919753, + "endOffset": 9013870, "body": { "mimeType": "multipart/mixed", "lineNumber": 141066, - "begin": 8918613, - "headersEnd": 8919753, + "beginOffset": 8918613, + "headersEndOffset": 8919753, + "endOffset": 9013870, "children": [ { "mimeType": "text/plain", "lineNumber": 141092, - "begin": 8919758, - "headersEnd": 8919759, - "end": 8920299, + "beginOffset": 8919758, + "headersEndOffset": 8919759, + "endOffset": 8920299, "octets": 540, "lines": 12 }, { "mimeType": "image/gif", "lineNumber": 141107, - "begin": 8920305, - "headersEnd": 8920421, - "end": 8978062, + "beginOffset": 8920305, + "headersEndOffset": 8920421, + "endOffset": 8978062, "octets": 57641, "lines": 790 }, { "mimeType": "text/plain", "lineNumber": 141902, - "begin": 8978068, - "headersEnd": 8978069, - "end": 8981852, + "beginOffset": 8978068, + "headersEndOffset": 8978069, + "endOffset": 8981852, "octets": 3783, "lines": 83 }, { "mimeType": "application/octet-stream", "lineNumber": 141988, - "begin": 8981858, - "headersEnd": 8982012, - "end": 9011647, + "beginOffset": 8981858, + "headersEndOffset": 8982012, + "endOffset": 9011647, "octets": 29635, "lines": 1010 }, { "mimeType": "application/octet-stream", "lineNumber": 143003, - "begin": 9011653, - "headersEnd": 9011759, - "end": 9012475, + "beginOffset": 9011653, + "headersEndOffset": 9011759, + "endOffset": 9012475, "octets": 716, "lines": 24 }, { "mimeType": "application/octet-stream", "lineNumber": 143032, - "begin": 9012481, - "headersEnd": 9012598, - "end": 9013862, + "beginOffset": 9012481, + "headersEndOffset": 9012598, + "endOffset": 9013862, "octets": 1264, "lines": 25 } ], - "end": 9013870, "octets": 94117, "lines": 1970 }, - "end": 9013870, "octets": 94117 }, { - "mboxMarkerBegin": 9013871, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9013871, "lineNumber": 143063, - "begin": 9013903, - "headersEnd": 9015056, + "beginOffset": 9013903, + "headersEndOffset": 9015056, + "endOffset": 9016840, "body": { "mimeType": "multipart/signed", "lineNumber": 143063, - "begin": 9013903, - "headersEnd": 9015056, + "beginOffset": 9013903, + "headersEndOffset": 9015056, + "endOffset": 9016840, "children": [ { "mimeType": "text/plain", "lineNumber": 143082, - "begin": 9015073, - "headersEnd": 9015074, - "end": 9015975, + "beginOffset": 9015073, + "headersEndOffset": 9015074, + "endOffset": 9015975, "octets": 901, "lines": 20 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 143105, - "begin": 9015993, - "headersEnd": 9016072, - "end": 9016820, + "beginOffset": 9015993, + "headersEndOffset": 9016072, + "endOffset": 9016820, "octets": 748, "lines": 12 } ], - "end": 9016840, "octets": 1784, "lines": 41 }, - "end": 9016840, "octets": 1784 }, { - "mboxMarkerBegin": 9016841, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9016841, "lineNumber": 143124, - "begin": 9016873, - "headersEnd": 9018015, + "beginOffset": 9016873, + "headersEndOffset": 9018015, + "endOffset": 9021424, "body": { "mimeType": "multipart/mixed", "lineNumber": 143124, - "begin": 9016873, - "headersEnd": 9018015, + "beginOffset": 9016873, + "headersEndOffset": 9018015, + "endOffset": 9021424, "children": [ { "mimeType": "text/plain", "lineNumber": 143147, - "begin": 9018195, - "headersEnd": 9018273, - "end": 9019014, + "beginOffset": 9018195, + "headersEndOffset": 9018273, + "endOffset": 9019014, "octets": 741, "lines": 14 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143165, - "begin": 9019022, - "headersEnd": 9019200, - "end": 9021415, + "beginOffset": 9019022, + "headersEndOffset": 9019200, + "endOffset": 9021415, "octets": 2215, "lines": 31 } ], - "end": 9021424, "octets": 3409, "lines": 60 }, - "end": 9021424, "octets": 3409 }, { - "mboxMarkerBegin": 9021425, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9021425, "lineNumber": 143204, - "begin": 9021457, - "headersEnd": 9022594, + "beginOffset": 9021457, + "headersEndOffset": 9022594, + "endOffset": 9028448, "body": { "mimeType": "multipart/mixed", "lineNumber": 143204, - "begin": 9021457, - "headersEnd": 9022594, + "beginOffset": 9021457, + "headersEndOffset": 9022594, + "endOffset": 9028448, "children": [ { "mimeType": "text/plain", "lineNumber": 143231, - "begin": 9022788, - "headersEnd": 9022866, - "end": 9025678, + "beginOffset": 9022788, + "headersEndOffset": 9022866, + "endOffset": 9025678, "octets": 2812, "lines": 47 }, { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143282, - "begin": 9025700, - "headersEnd": 9025878, - "end": 9028425, + "beginOffset": 9025700, + "headersEndOffset": 9025878, + "endOffset": 9028425, "octets": 2547, "lines": 35 } ], - "end": 9028448, "octets": 5854, "lines": 97 }, - "end": 9028448, "octets": 5854 }, { - "mboxMarkerBegin": 9028449, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9028449, "lineNumber": 143325, - "begin": 9028457, - "headersEnd": 9028665, + "beginOffset": 9028457, + "headersEndOffset": 9028665, + "endOffset": 9032858, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143325, - "begin": 9028457, - "headersEnd": 9028665, - "end": 9032858, + "beginOffset": 9028457, + "headersEndOffset": 9028665, + "endOffset": 9032858, "octets": 4193, "lines": 58 }, - "end": 9032858, "octets": 4193 }, { - "mboxMarkerBegin": 9032859, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9032859, "lineNumber": 143391, - "begin": 9032891, - "headersEnd": 9033791, + "beginOffset": 9032891, + "headersEndOffset": 9033791, + "endOffset": 9049540, "body": { "mimeType": "multipart/signed", "lineNumber": 143391, - "begin": 9032891, - "headersEnd": 9033791, + "beginOffset": 9032891, + "headersEndOffset": 9033791, + "endOffset": 9049540, "children": [ { "mimeType": "image/jpeg", "lineNumber": 143412, - "begin": 9033864, - "headersEnd": 9033998, - "end": 9044720, + "beginOffset": 9033864, + "headersEndOffset": 9033998, + "endOffset": 9044720, "octets": 10722, "lines": 147 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 143564, - "begin": 9044748, - "headersEnd": 9044899, - "end": 9049510, + "beginOffset": 9044748, + "headersEndOffset": 9044899, + "endOffset": 9049510, "octets": 4611, "lines": 64 } ], - "end": 9049540, "octets": 15749, "lines": 224 }, - "end": 9049540, "octets": 15749 }, { - "mboxMarkerBegin": 9049541, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9049541, "lineNumber": 143635, - "begin": 9049573, - "headersEnd": 9050380, + "beginOffset": 9049573, + "headersEndOffset": 9050380, + "endOffset": 9067141, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143635, - "begin": 9049573, - "headersEnd": 9050380, - "end": 9067141, + "beginOffset": 9049573, + "headersEndOffset": 9050380, + "endOffset": 9067141, "octets": 16761, "lines": 258 }, - "end": 9067141, "octets": 16761 }, { - "mboxMarkerBegin": 9067142, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9067142, "lineNumber": 143911, - "begin": 9067174, - "headersEnd": 9067986, + "beginOffset": 9067174, + "headersEndOffset": 9067986, + "endOffset": 9092950, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 143911, - "begin": 9067174, - "headersEnd": 9067986, - "end": 9092950, + "beginOffset": 9067174, + "headersEndOffset": 9067986, + "endOffset": 9092950, "octets": 24964, "lines": 385 }, - "end": 9092950, "octets": 24964 }, { - "mboxMarkerBegin": 9092951, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9092951, "lineNumber": 144314, - "begin": 9092983, - "headersEnd": 9093795, + "beginOffset": 9092983, + "headersEndOffset": 9093795, + "endOffset": 9129926, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 144314, - "begin": 9092983, - "headersEnd": 9093795, - "end": 9129926, + "beginOffset": 9092983, + "headersEndOffset": 9093795, + "endOffset": 9129926, "octets": 36131, "lines": 556 }, - "end": 9129926, "octets": 36131 }, { - "mboxMarkerBegin": 9129927, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9129927, "lineNumber": 144888, - "begin": 9129959, - "headersEnd": 9130774, + "beginOffset": 9129959, + "headersEndOffset": 9130774, + "endOffset": 9182075, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 144888, - "begin": 9129959, - "headersEnd": 9130774, - "end": 9182075, + "beginOffset": 9129959, + "headersEndOffset": 9130774, + "endOffset": 9182075, "octets": 51301, "lines": 790 }, - "end": 9182075, "octets": 51301 }, { - "mboxMarkerBegin": 9182076, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9182076, "lineNumber": 145696, - "begin": 9182108, - "headersEnd": 9183499, + "beginOffset": 9182108, + "headersEndOffset": 9183499, + "endOffset": 9184930, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145696, - "begin": 9182108, - "headersEnd": 9183499, - "end": 9184930, + "beginOffset": 9182108, + "headersEndOffset": 9183499, + "endOffset": 9184930, "octets": 1431, "lines": 20 }, - "end": 9184930, "octets": 1431 }, { - "mboxMarkerBegin": 9184931, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9184931, "lineNumber": 145741, - "begin": 9184963, - "headersEnd": 9186316, + "beginOffset": 9184963, + "headersEndOffset": 9186316, + "endOffset": 9190708, "body": { "mimeType": "multipart/signed", "lineNumber": 145741, - "begin": 9184963, - "headersEnd": 9186316, + "beginOffset": 9184963, + "headersEndOffset": 9186316, + "endOffset": 9190708, "children": [ { "mimeType": "text/plain", "lineNumber": 145767, - "begin": 9186361, - "headersEnd": 9186425, - "end": 9186532, + "beginOffset": 9186361, + "headersEndOffset": 9186425, + "endOffset": 9186532, "octets": 107, "lines": 4 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 145775, - "begin": 9186577, - "headersEnd": 9186728, - "end": 9190661, + "beginOffset": 9186577, + "headersEndOffset": 9186728, + "endOffset": 9190661, "octets": 3933, "lines": 54 } ], - "end": 9190708, "octets": 4392, "lines": 69 }, - "end": 9190708, "octets": 4392 }, { - "mboxMarkerBegin": 9190709, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9190709, "lineNumber": 145836, - "begin": 9190741, - "headersEnd": 9191951, + "beginOffset": 9190741, + "headersEndOffset": 9191951, + "endOffset": 9195446, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145836, - "begin": 9190741, - "headersEnd": 9191951, - "end": 9195446, + "beginOffset": 9190741, + "headersEndOffset": 9191951, + "endOffset": 9195446, "octets": 3495, "lines": 55 }, - "end": 9195446, "octets": 3495 }, { - "mboxMarkerBegin": 9195447, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9195447, "lineNumber": 145914, - "begin": 9195479, - "headersEnd": 9196556, + "beginOffset": 9195479, + "headersEndOffset": 9196556, + "endOffset": 9197217, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145914, - "begin": 9195479, - "headersEnd": 9196556, - "end": 9197217, + "beginOffset": 9195479, + "headersEndOffset": 9196556, + "endOffset": 9197217, "octets": 661, "lines": 10 }, - "end": 9197217, "octets": 661 }, { - "mboxMarkerBegin": 9197218, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9197218, "lineNumber": 145946, - "begin": 9197226, - "headersEnd": 9197618, + "beginOffset": 9197226, + "headersEndOffset": 9197618, + "endOffset": 9205238, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 145946, - "begin": 9197226, - "headersEnd": 9197618, - "end": 9205238, + "beginOffset": 9197226, + "headersEndOffset": 9197618, + "endOffset": 9205238, "octets": 7620, "lines": 105 }, - "end": 9205238, "octets": 7620 }, { - "mboxMarkerBegin": 9205239, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9205239, "lineNumber": 146063, - "begin": 9205271, - "headersEnd": 9206054, + "beginOffset": 9205271, + "headersEndOffset": 9206054, + "endOffset": 9208866, "body": { "mimeType": "message/rfc822", "lineNumber": 146063, - "begin": 9205271, - "headersEnd": 9206054, + "beginOffset": 9205271, + "headersEndOffset": 9206054, + "endOffset": 9208866, "message": { "lineNumber": 146082, - "begin": 9206054, - "headersEnd": 9207434, + "beginOffset": 9206054, + "headersEndOffset": 9207434, + "endOffset": 9208866, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146082, - "begin": 9206054, - "headersEnd": 9207434, - "end": 9208866, + "beginOffset": 9206054, + "headersEndOffset": 9207434, + "endOffset": 9208866, "octets": 1432, "lines": 20 }, - "end": 9208866, "octets": 1432 }, - "end": 9208866, "octets": 2812, "lines": 43 }, - "end": 9208866, "octets": 2812 }, { - "mboxMarkerBegin": 9208867, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9208867, "lineNumber": 146127, - "begin": 9208899, - "headersEnd": 9209609, + "beginOffset": 9208899, + "headersEndOffset": 9209609, + "endOffset": 9212797, "body": { "mimeType": "multipart/mixed", "lineNumber": 146127, - "begin": 9208899, - "headersEnd": 9209609, + "beginOffset": 9208899, + "headersEndOffset": 9209609, + "endOffset": 9212797, "children": [ { "mimeType": "text/plain", "lineNumber": 146147, - "begin": 9209682, - "headersEnd": 9209758, - "end": 9209773, + "beginOffset": 9209682, + "headersEndOffset": 9209758, + "endOffset": 9209773, "octets": 15, "lines": 1 }, { "mimeType": "message/rfc822", "lineNumber": 146153, - "begin": 9209801, - "headersEnd": 9209955, + "beginOffset": 9209801, + "headersEndOffset": 9209955, + "endOffset": 9212767, "message": { "lineNumber": 146157, - "begin": 9209955, - "headersEnd": 9211335, + "beginOffset": 9209955, + "headersEndOffset": 9211335, + "endOffset": 9212767, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146157, - "begin": 9209955, - "headersEnd": 9211335, - "end": 9212767, + "beginOffset": 9209955, + "headersEndOffset": 9211335, + "endOffset": 9212767, "octets": 1432, "lines": 20 }, - "end": 9212767, "octets": 1432 }, - "end": 9212767, "octets": 2812, "lines": 43 } ], - "end": 9212797, "octets": 3188, "lines": 58 }, - "end": 9212797, "octets": 3188 }, { - "mboxMarkerBegin": 9212798, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9212798, "lineNumber": 146204, - "begin": 9212830, - "headersEnd": 9213495, + "beginOffset": 9212830, + "headersEndOffset": 9213495, + "endOffset": 9219506, "body": { "mimeType": "multipart/signed", "lineNumber": 146204, - "begin": 9212830, - "headersEnd": 9213495, + "beginOffset": 9212830, + "headersEndOffset": 9213495, + "endOffset": 9219506, "children": [ { "mimeType": "text/plain", "lineNumber": 146223, - "begin": 9213596, - "headersEnd": 9213672, - "end": 9213713, + "beginOffset": 9213596, + "headersEndOffset": 9213672, + "endOffset": 9213713, "octets": 41, "lines": 2 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 146229, - "begin": 9213755, - "headersEnd": 9213906, - "end": 9219462, + "beginOffset": 9213755, + "headersEndOffset": 9213906, + "endOffset": 9219462, "octets": 5556, "lines": 77 } ], - "end": 9219506, "octets": 6011, "lines": 91 }, - "end": 9219506, "octets": 6011 }, { - "mboxMarkerBegin": 9219507, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9219507, "lineNumber": 146313, - "begin": 9219539, - "headersEnd": 9220601, + "beginOffset": 9219539, + "headersEndOffset": 9220601, + "endOffset": 9230837, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146313, - "begin": 9219539, - "headersEnd": 9220601, - "end": 9230837, + "beginOffset": 9219539, + "headersEndOffset": 9220601, + "endOffset": 9230837, "octets": 10236, "lines": 141 }, - "end": 9230837, "octets": 10236 }, { - "mboxMarkerBegin": 9230838, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9230838, "lineNumber": 146476, - "begin": 9230870, - "headersEnd": 9232246, + "beginOffset": 9230870, + "headersEndOffset": 9232246, + "endOffset": 9235059, "body": { "mimeType": "multipart/signed", "lineNumber": 146476, - "begin": 9230870, - "headersEnd": 9232246, + "beginOffset": 9230870, + "headersEndOffset": 9232246, + "endOffset": 9235059, "children": [ { "mimeType": "text/plain", "lineNumber": 146503, - "begin": 9232347, - "headersEnd": 9232423, - "end": 9233034, + "beginOffset": 9232347, + "headersEndOffset": 9232423, + "endOffset": 9233034, "octets": 611, "lines": 17 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 146524, - "begin": 9233076, - "headersEnd": 9233227, - "end": 9235015, + "beginOffset": 9233076, + "headersEndOffset": 9233227, + "endOffset": 9235015, "octets": 1788, "lines": 25 } ], - "end": 9235059, "octets": 2813, "lines": 54 }, - "end": 9235059, "octets": 2813 }, { - "mboxMarkerBegin": 9235060, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9235060, "lineNumber": 146556, - "begin": 9235092, - "headersEnd": 9235640, + "beginOffset": 9235092, + "headersEndOffset": 9235640, + "endOffset": 9236163, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146556, - "begin": 9235092, - "headersEnd": 9235640, - "end": 9236163, + "beginOffset": 9235092, + "headersEndOffset": 9235640, + "endOffset": 9236163, "octets": 523, "lines": 8 }, - "end": 9236163, "octets": 523 }, { - "mboxMarkerBegin": 9236164, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9236164, "lineNumber": 146580, - "begin": 9236172, - "headersEnd": 9237488, + "beginOffset": 9236172, + "headersEndOffset": 9237488, + "endOffset": 9238420, "body": { "mimeType": "MULTIPART/SIGNED", "lineNumber": 146580, - "begin": 9236172, - "headersEnd": 9237488, + "beginOffset": 9236172, + "headersEndOffset": 9237488, + "endOffset": 9238420, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 146605, - "begin": 9237745, - "headersEnd": 9237789, - "end": 9238377, + "beginOffset": 9237745, + "headersEndOffset": 9237789, + "endOffset": 9238377, "octets": 588, "lines": 15 } ], - "end": 9238420, "octets": 932, "lines": 24 }, - "end": 9238420, "octets": 932 }, { - "mboxMarkerBegin": 9238421, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9238421, "lineNumber": 146625, - "begin": 9238429, - "headersEnd": 9239776, + "beginOffset": 9238429, + "headersEndOffset": 9239776, + "endOffset": 9248589, "body": { "mimeType": "MULTIPART/SIGNED", "lineNumber": 146625, - "begin": 9238429, - "headersEnd": 9239776, + "beginOffset": 9238429, + "headersEndOffset": 9239776, + "endOffset": 9248589, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 146650, - "begin": 9240033, - "headersEnd": 9240077, - "end": 9240178, + "beginOffset": 9240033, + "headersEndOffset": 9240077, + "endOffset": 9240178, "octets": 101, "lines": 6 }, { "mimeType": "MULTIPART/MIXED", "lineNumber": 146660, - "begin": 9240220, - "headersEnd": 9240383, + "beginOffset": 9240220, + "headersEndOffset": 9240383, + "endOffset": 9243067, "children": [ { "mimeType": "TEXT/PLAIN", "lineNumber": 146669, - "begin": 9240638, - "headersEnd": 9240745, - "end": 9240836, + "beginOffset": 9240638, + "headersEndOffset": 9240745, + "endOffset": 9240836, "octets": 91, "lines": 4 }, { "mimeType": "MESSAGE/RFC822", "lineNumber": 146678, - "begin": 9240876, - "headersEnd": 9240969, + "beginOffset": 9240876, + "headersEndOffset": 9240969, + "endOffset": 9242341, "message": { "lineNumber": 146681, - "begin": 9240969, - "headersEnd": 9242136, + "beginOffset": 9240969, + "headersEndOffset": 9242136, + "endOffset": 9242341, "body": { "mimeType": "text/plain", "lineNumber": 146681, - "begin": 9240969, - "headersEnd": 9242136, - "end": 9242341, + "beginOffset": 9240969, + "headersEndOffset": 9242136, + "endOffset": 9242341, "octets": 205, "lines": 5 }, - "end": 9242341, "octets": 205 }, - "end": 9242341, "octets": 1372, "lines": 34 }, { "mimeType": "TEXT/X-VCARD", "lineNumber": 146717, - "begin": 9242381, - "headersEnd": 9242547, - "end": 9243026, + "beginOffset": 9242381, + "headersEndOffset": 9242547, + "endOffset": 9243026, "octets": 479, "lines": 11 } ], - "end": 9243067, "octets": 2684, "lines": 70 }, { "mimeType": "APPLICATION/X-PKCS7-SIGNATURE", "lineNumber": 146735, - "begin": 9243109, - "headersEnd": 9243321, - "end": 9248544, + "beginOffset": 9243109, + "headersEndOffset": 9243321, + "endOffset": 9248544, "octets": 5223, "lines": 72 } ], - "end": 9248589, "octets": 8813, "lines": 169 }, - "end": 9248589, "octets": 8813 }, { - "mboxMarkerBegin": 9248590, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9248590, "lineNumber": 146816, - "begin": 9248622, - "headersEnd": 9249837, + "beginOffset": 9248622, + "headersEndOffset": 9249837, + "endOffset": 9252719, "body": { "mimeType": "application/x-pkcs7-mime", "lineNumber": 146816, - "begin": 9248622, - "headersEnd": 9249837, - "end": 9252719, + "beginOffset": 9248622, + "headersEndOffset": 9249837, + "endOffset": 9252719, "octets": 2882, "lines": 38 }, - "end": 9252719, "octets": 2882 }, { - "mboxMarkerBegin": 9252720, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9252720, "lineNumber": 146876, - "begin": 9252752, - "headersEnd": 9253910, + "beginOffset": 9252752, + "headersEndOffset": 9253910, + "endOffset": 9256032, "body": { "mimeType": "Application/x-pkcs7-mime", "lineNumber": 146876, - "begin": 9252752, - "headersEnd": 9253910, - "end": 9256032, + "beginOffset": 9252752, + "headersEndOffset": 9253910, + "endOffset": 9256032, "octets": 2122, "lines": 30 }, - "end": 9256032, "octets": 2122 }, { - "mboxMarkerBegin": 9256033, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9256033, "lineNumber": 146929, - "begin": 9256065, - "headersEnd": 9257143, + "beginOffset": 9256065, + "headersEndOffset": 9257143, + "endOffset": 9260100, "body": { "mimeType": "multipart/signed", "lineNumber": 146929, - "begin": 9256065, - "headersEnd": 9257143, + "beginOffset": 9256065, + "headersEndOffset": 9257143, + "endOffset": 9260100, "children": [ { "mimeType": "text/plain", "lineNumber": 146952, - "begin": 9257176, - "headersEnd": 9257240, - "end": 9257240, + "beginOffset": 9257176, + "headersEndOffset": 9257240, + "endOffset": 9257240, "octets": 0, "lines": 0 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 146957, - "begin": 9257273, - "headersEnd": 9257352, - "end": 9260065, + "beginOffset": 9257273, + "headersEndOffset": 9257352, + "endOffset": 9260065, "octets": 2713, "lines": 42 } ], - "end": 9260100, "octets": 2957, "lines": 53 }, - "end": 9260100, "octets": 2957 }, { - "mboxMarkerBegin": 9260101, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9260101, "lineNumber": 147005, - "begin": 9260133, - "headersEnd": 9261170, + "beginOffset": 9260133, + "headersEndOffset": 9261170, + "endOffset": 9264050, "body": { "mimeType": "multipart/mixed", "lineNumber": 147005, - "begin": 9260133, - "headersEnd": 9261170, + "beginOffset": 9260133, + "headersEndOffset": 9261170, + "endOffset": 9264050, "children": [ { "mimeType": "text/plain", "lineNumber": 147026, - "begin": 9261211, - "headersEnd": 9261289, - "end": 9261742, + "beginOffset": 9261211, + "headersEndOffset": 9261289, + "endOffset": 9261742, "octets": 453, "lines": 14 }, { "mimeType": "text/html", "lineNumber": 147044, - "begin": 9261783, - "headersEnd": 9261858, - "end": 9262669, + "beginOffset": 9261783, + "headersEndOffset": 9261858, + "endOffset": 9262669, "octets": 811, "lines": 27 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147075, - "begin": 9262710, - "headersEnd": 9262807, - "end": 9264007, + "beginOffset": 9262710, + "headersEndOffset": 9262807, + "endOffset": 9264007, "octets": 1200, "lines": 16 } ], - "end": 9264050, "octets": 2880, "lines": 72 }, - "end": 9264050, "octets": 2880 }, { - "mboxMarkerBegin": 9264051, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9264051, "lineNumber": 147098, - "begin": 9264083, - "headersEnd": 9265158, + "beginOffset": 9264083, + "headersEndOffset": 9265158, + "endOffset": 9269686, "body": { "mimeType": "multipart/signed", "lineNumber": 147098, - "begin": 9264083, - "headersEnd": 9265158, + "beginOffset": 9264083, + "headersEndOffset": 9265158, + "endOffset": 9269686, "children": [ { "mimeType": "text/plain", "lineNumber": 147121, - "begin": 9265201, - "headersEnd": 9265271, - "end": 9265423, + "beginOffset": 9265201, + "headersEndOffset": 9265271, + "endOffset": 9265423, "octets": 152, "lines": 7 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147133, - "begin": 9265466, - "headersEnd": 9265545, - "end": 9269641, + "beginOffset": 9265466, + "headersEndOffset": 9265545, + "endOffset": 9269641, "octets": 4096, "lines": 57 } ], - "end": 9269686, "octets": 4528, "lines": 75 }, - "end": 9269686, "octets": 4528 }, { - "mboxMarkerBegin": 9269687, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9269687, "lineNumber": 147196, - "begin": 9269695, - "headersEnd": 9270246, + "beginOffset": 9269695, + "headersEndOffset": 9270246, + "endOffset": 9274666, "body": { "mimeType": "multipart/signed", "lineNumber": 147196, - "begin": 9269695, - "headersEnd": 9270246, + "beginOffset": 9269695, + "headersEndOffset": 9270246, + "endOffset": 9274666, "children": [ { "mimeType": "text/plain", "lineNumber": 147213, - "begin": 9270290, - "headersEnd": 9270354, - "end": 9270509, + "beginOffset": 9270290, + "headersEndOffset": 9270354, + "endOffset": 9270509, "octets": 155, "lines": 4 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147221, - "begin": 9270553, - "headersEnd": 9270704, - "end": 9274621, + "beginOffset": 9270553, + "headersEndOffset": 9270704, + "endOffset": 9274621, "octets": 3917, "lines": 54 } ], - "end": 9274666, "octets": 4420, "lines": 69 }, - "end": 9274666, "octets": 4420 }, { - "mboxMarkerBegin": 9274667, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9274667, "lineNumber": 147281, - "begin": 9274699, - "headersEnd": 9275863, + "beginOffset": 9274699, + "headersEndOffset": 9275863, + "endOffset": 9279928, "body": { "mimeType": "multipart/mixed", "lineNumber": 147281, - "begin": 9274699, - "headersEnd": 9275863, + "beginOffset": 9274699, + "headersEndOffset": 9275863, + "endOffset": 9279928, "children": [ { "mimeType": "text/plain", "lineNumber": 147305, - "begin": 9276040, - "headersEnd": 9276118, - "end": 9276190, + "beginOffset": 9276040, + "headersEndOffset": 9276118, + "endOffset": 9276190, "octets": 72, "lines": 5 }, { "mimeType": "application/octet-stream", "lineNumber": 147315, - "begin": 9276231, - "headersEnd": 9276326, - "end": 9279885, + "beginOffset": 9276231, + "headersEndOffset": 9276326, + "endOffset": 9279885, "octets": 3559, "lines": 47 } ], - "end": 9279928, "octets": 4065, "lines": 66 }, - "end": 9279928, "octets": 4065 }, { - "mboxMarkerBegin": 9279929, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9279929, "lineNumber": 147369, - "begin": 9279961, - "headersEnd": 9281063, + "beginOffset": 9279961, + "headersEndOffset": 9281063, + "endOffset": 9285114, "body": { "mimeType": "multipart/signed", "lineNumber": 147369, - "begin": 9279961, - "headersEnd": 9281063, + "beginOffset": 9279961, + "headersEndOffset": 9281063, + "endOffset": 9285114, "children": [ { "mimeType": "text/plain", "lineNumber": 147392, - "begin": 9281097, - "headersEnd": 9281175, - "end": 9281249, + "beginOffset": 9281097, + "headersEndOffset": 9281175, + "endOffset": 9281249, "octets": 74, "lines": 5 }, { "mimeType": "application/x-pkcs7-signature", "lineNumber": 147401, - "begin": 9281283, - "headersEnd": 9281362, - "end": 9285079, + "beginOffset": 9281283, + "headersEndOffset": 9281362, + "endOffset": 9285079, "octets": 3717, "lines": 58 } ], - "end": 9285114, "octets": 4051, "lines": 73 }, - "end": 9285114, "octets": 4051 }, { - "mboxMarkerBegin": 9285115, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9285115, "lineNumber": 147464, - "begin": 9285147, - "headersEnd": 9286275, + "beginOffset": 9285147, + "headersEndOffset": 9286275, + "endOffset": 9287538, "body": { "mimeType": "multipart/report", "lineNumber": 147464, - "begin": 9285147, - "headersEnd": 9286275, + "beginOffset": 9285147, + "headersEndOffset": 9286275, + "endOffset": 9287538, "children": [ { "mimeType": "message/delivery-status", "lineNumber": 147486, - "begin": 9286412, - "headersEnd": 9286451, - "end": 9286639, + "beginOffset": 9286412, + "headersEndOffset": 9286451, + "endOffset": 9286639, "octets": 188, "lines": 6 }, { "mimeType": "message/rfc822", "lineNumber": 147496, - "begin": 9286664, - "headersEnd": 9286694, + "beginOffset": 9286664, + "headersEndOffset": 9286694, + "endOffset": 9287511, "message": { "lineNumber": 147498, - "begin": 9286694, - "headersEnd": 9287500, + "beginOffset": 9286694, + "headersEndOffset": 9287500, + "endOffset": 9287511, "body": { "mimeType": "text/plain", "lineNumber": 147498, - "begin": 9286694, - "headersEnd": 9287500, - "end": 9287511, + "beginOffset": 9286694, + "headersEndOffset": 9287500, + "endOffset": 9287511, "octets": 11, "lines": 1 }, - "end": 9287511, "octets": 11 }, - "end": 9287511, "octets": 817, "lines": 16 } ], - "end": 9287538, "octets": 1263, "lines": 34 }, - "end": 9287538, "octets": 1263 }, { - "mboxMarkerBegin": 9287539, - "mboxMarkerLength": 45, + "mboxMarkerOffset": 9287539, "lineNumber": 147517, - "begin": 9287585, - "headersEnd": 9287750, + "beginOffset": 9287585, + "headersEndOffset": 9287750, + "endOffset": 9322244, "body": { "mimeType": "text/plain", "lineNumber": 147517, - "begin": 9287585, - "headersEnd": 9287750, - "end": 9322244, + "beginOffset": 9287585, + "headersEndOffset": 9287750, + "endOffset": 9322244, "octets": 34494, "lines": 592 }, - "end": 9322244, "octets": 34494 }, { - "mboxMarkerBegin": 9322245, - "mboxMarkerLength": 45, + "mboxMarkerOffset": 9322245, "lineNumber": 148117, - "begin": 9322291, - "headersEnd": 9322449, + "beginOffset": 9322291, + "headersEndOffset": 9322449, + "endOffset": 9356943, "body": { "mimeType": "application/octet-stream", "lineNumber": 148117, - "begin": 9322291, - "headersEnd": 9322449, - "end": 9356943, + "beginOffset": 9322291, + "headersEndOffset": 9322449, + "endOffset": 9356943, "octets": 34494, "lines": 592 }, - "end": 9356943, "octets": 34494 }, { - "mboxMarkerBegin": 9356944, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9356944, "lineNumber": 148717, - "begin": 9356952, - "headersEnd": 9357549, + "beginOffset": 9356952, + "headersEndOffset": 9357549, + "endOffset": 9358949, "body": { "mimeType": "application/octet-stream", "lineNumber": 148717, - "begin": 9356952, - "headersEnd": 9357549, - "end": 9358949, + "beginOffset": 9356952, + "headersEndOffset": 9357549, + "endOffset": 9358949, "octets": 1400, "lines": 39 }, - "end": 9358949, "octets": 1400 }, { - "mboxMarkerBegin": 9358950, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9358950, "lineNumber": 148768, - "begin": 9358958, - "headersEnd": 9359858, + "beginOffset": 9358958, + "headersEndOffset": 9359858, + "endOffset": 9602012, "body": { "mimeType": "MULTIPART/mixed", "lineNumber": 148768, - "begin": 9358958, - "headersEnd": 9359858, + "beginOffset": 9358958, + "headersEndOffset": 9359858, + "endOffset": 9602012, "children": [ { "mimeType": "TEXT/plain", "lineNumber": 148786, - "begin": 9359897, - "headersEnd": 9359923, - "end": 9360268, + "beginOffset": 9359897, + "headersEndOffset": 9359923, + "endOffset": 9360268, "octets": 345, "lines": 10 }, { "mimeType": "AUDIO/basic", "lineNumber": 148800, - "begin": 9360308, - "headersEnd": 9360401, - "end": 9601970, + "beginOffset": 9360308, + "headersEndOffset": 9360401, + "endOffset": 9601970, "octets": 241569, "lines": 3961 } ], - "end": 9602012, "octets": 242154, "lines": 3982 }, - "end": 9602012, "octets": 242154 }, { - "mboxMarkerBegin": 9602013, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9602013, "lineNumber": 152769, - "begin": 9602021, - "headersEnd": 9602615, + "beginOffset": 9602021, + "headersEndOffset": 9602615, + "endOffset": 9681155, "body": { "mimeType": "multipart/mixed", "lineNumber": 152769, - "begin": 9602021, - "headersEnd": 9602615, + "beginOffset": 9602021, + "headersEndOffset": 9602615, + "endOffset": 9681155, "children": [ { "mimeType": "image/pbm", "lineNumber": 152786, - "begin": 9602676, - "headersEnd": 9602835, - "end": 9681124, + "beginOffset": 9602676, + "headersEndOffset": 9602835, + "endOffset": 9681124, "octets": 78289, "lines": 406 } ], - "end": 9681155, "octets": 78540, "lines": 416 }, - "end": 9681155, "octets": 78540 }, { - "mboxMarkerBegin": 9681156, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9681156, "lineNumber": 153201, - "begin": 9681164, - "headersEnd": 9681316, + "beginOffset": 9681164, + "headersEndOffset": 9681316, + "endOffset": 9684876, "body": { "mimeType": "message/partial", "lineNumber": 153201, - "begin": 9681164, - "headersEnd": 9681316, - "end": 9684876, + "beginOffset": 9681164, + "headersEndOffset": 9681316, + "endOffset": 9684876, "octets": 3560, "lines": 49 }, - "end": 9684876, "octets": 3560 }, { - "mboxMarkerBegin": 9684877, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9684877, "lineNumber": 153256, - "begin": 9684885, - "headersEnd": 9685657, + "beginOffset": 9684885, + "headersEndOffset": 9685657, + "endOffset": 9715925, "body": { "mimeType": "multipart/alternative", "lineNumber": 153256, - "begin": 9684885, - "headersEnd": 9685657, + "beginOffset": 9684885, + "headersEndOffset": 9685657, + "endOffset": 9715925, "children": [ { "mimeType": "text/plain", "lineNumber": 153276, - "begin": 9685852, - "headersEnd": 9685896, - "end": 9686310, + "beginOffset": 9685852, + "headersEndOffset": 9685896, + "endOffset": 9686310, "octets": 414, "lines": 7 }, { "mimeType": "multipart/mixed", "lineNumber": 153287, - "begin": 9686351, - "headersEnd": 9686436, + "beginOffset": 9686351, + "headersEndOffset": 9686436, + "endOffset": 9715883, "children": [ { "mimeType": "text/richtext", "lineNumber": 153291, - "begin": 9686478, - "headersEnd": 9686569, - "end": 9686640, + "beginOffset": 9686478, + "headersEndOffset": 9686569, + "endOffset": 9686640, "octets": 71, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 153297, - "begin": 9686683, - "headersEnd": 9686782, - "end": 9697479, + "beginOffset": 9686683, + "headersEndOffset": 9686782, + "endOffset": 9697479, "octets": 10697, "lines": 157 }, { "mimeType": "text/richtext", "lineNumber": 153460, - "begin": 9697522, - "headersEnd": 9697613, - "end": 9697677, + "beginOffset": 9697522, + "headersEndOffset": 9697613, + "endOffset": 9697677, "octets": 64, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 153467, - "begin": 9697720, - "headersEnd": 9697813, - "end": 9703716, + "beginOffset": 9697720, + "headersEndOffset": 9697813, + "endOffset": 9703716, "octets": 5903, "lines": 87 }, { "mimeType": "text/richtext", "lineNumber": 153560, - "begin": 9703759, - "headersEnd": 9703850, - "end": 9703883, + "beginOffset": 9703759, + "headersEndOffset": 9703850, + "endOffset": 9703883, "octets": 33, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 153567, - "begin": 9703926, - "headersEnd": 9704027, - "end": 9715673, + "beginOffset": 9703926, + "headersEndOffset": 9704027, + "endOffset": 9715673, "octets": 11646, "lines": 170 }, { "mimeType": "text/richtext", "lineNumber": 153743, - "begin": 9715716, - "headersEnd": 9715807, - "end": 9715838, + "beginOffset": 9715716, + "headersEndOffset": 9715807, + "endOffset": 9715838, "octets": 31, "lines": 2 } ], - "end": 9715883, "octets": 29447, "lines": 460 } ], - "end": 9715925, "octets": 30268, "lines": 480 }, - "end": 9715925, "octets": 30268 }, { - "mboxMarkerBegin": 9715926, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9715926, "lineNumber": 153753, - "begin": 9715934, - "headersEnd": 9715990, + "beginOffset": 9715934, + "headersEndOffset": 9715990, + "endOffset": 9717198, "body": { "mimeType": "text/plain", "lineNumber": 153753, - "begin": 9715934, - "headersEnd": 9715990, - "end": 9717198, + "beginOffset": 9715934, + "headersEndOffset": 9715990, + "endOffset": 9717198, "octets": 1208, "lines": 28 }, - "end": 9717198, "octets": 1208 }, { - "mboxMarkerBegin": 9717199, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9717199, "lineNumber": 153785, - "begin": 9717231, - "headersEnd": 9717382, + "beginOffset": 9717231, + "headersEndOffset": 9717382, + "endOffset": 9720490, "body": { "mimeType": "text/plain", "lineNumber": 153785, - "begin": 9717231, - "headersEnd": 9717382, - "end": 9720490, + "beginOffset": 9717231, + "headersEndOffset": 9717382, + "endOffset": 9720490, "octets": 3108, "lines": 68 }, - "end": 9720490, "octets": 3108 }, { - "mboxMarkerBegin": 9720491, - "mboxMarkerLength": 31, + "mboxMarkerOffset": 9720491, "lineNumber": 153859, - "begin": 9720523, - "headersEnd": 9722388, + "beginOffset": 9720523, + "headersEndOffset": 9722388, + "endOffset": 9727267, "body": { "mimeType": "multipart/mixed", "lineNumber": 153859, - "begin": 9720523, - "headersEnd": 9722388, + "beginOffset": 9720523, + "headersEndOffset": 9722388, + "endOffset": 9727267, "children": [ { "mimeType": "text/plain", "lineNumber": 153891, - "begin": 9722432, - "headersEnd": 9722510, - "end": 9723373, + "beginOffset": 9722432, + "headersEndOffset": 9722510, + "endOffset": 9723373, "octets": 863, "lines": 18 }, { "mimeType": "application/vcard", "lineNumber": 153914, - "begin": 9723418, - "headersEnd": 9723579, - "end": 9727220, + "beginOffset": 9723418, + "headersEndOffset": 9723579, + "endOffset": 9727220, "octets": 3641, "lines": 61 } ], - "end": 9727267, "octets": 4879, "lines": 92 }, - "end": 9727267, "octets": 4879 }, { - "mboxMarkerBegin": 9727268, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9727268, "lineNumber": 153984, - "begin": 9727276, - "headersEnd": 9727830, + "beginOffset": 9727276, + "headersEndOffset": 9727830, + "endOffset": 9844660, "body": { "mimeType": "multipart/mixed", "lineNumber": 153984, - "begin": 9727276, - "headersEnd": 9727830, + "beginOffset": 9727276, + "headersEndOffset": 9727830, + "endOffset": 9844660, "children": [ { "mimeType": "text/plain", "lineNumber": 153999, - "begin": 9727847, - "headersEnd": 9727874, - "end": 9728837, + "beginOffset": 9727847, + "headersEndOffset": 9727874, + "endOffset": 9728837, "octets": 963, "lines": 19 }, { "mimeType": "image/pgm", "lineNumber": 154022, - "begin": 9728854, - "headersEnd": 9728914, - "end": 9844640, + "beginOffset": 9728854, + "headersEndOffset": 9728914, + "endOffset": 9844640, "octets": 115726, "lines": 1586 } ], - "end": 9844660, "octets": 116830, "lines": 1617 }, - "end": 9844660, "octets": 116830 }, { - "mboxMarkerBegin": 9844661, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9844661, "lineNumber": 155616, - "begin": 9844669, - "headersEnd": 9845465, + "beginOffset": 9844669, + "headersEndOffset": 9845465, + "endOffset": 9870085, "body": { "mimeType": "multipart/alternative", "lineNumber": 155616, - "begin": 9844669, - "headersEnd": 9845465, + "beginOffset": 9844669, + "headersEndOffset": 9845465, + "endOffset": 9870085, "children": [ { "mimeType": "text/plain", "lineNumber": 155639, - "begin": 9845660, - "headersEnd": 9845704, - "end": 9854667, + "beginOffset": 9845660, + "headersEndOffset": 9845704, + "endOffset": 9854667, "octets": 8963, "lines": 349 }, { "mimeType": "multipart/mixed", "lineNumber": 155992, - "begin": 9854708, - "headersEnd": 9854793, + "beginOffset": 9854708, + "headersEndOffset": 9854793, + "endOffset": 9870042, "children": [ { "mimeType": "text/richtext", "lineNumber": 155996, - "begin": 9854835, - "headersEnd": 9854926, - "end": 9857701, + "beginOffset": 9854835, + "headersEndOffset": 9854926, + "endOffset": 9857701, "octets": 2775, "lines": 69 }, { "mimeType": "message/external-body", "lineNumber": 156070, - "begin": 9857744, - "headersEnd": 9857940, + "beginOffset": 9857744, + "headersEndOffset": 9857940, + "endOffset": 9857969, "message": { "lineNumber": 156077, - "begin": 9857940, - "headersEnd": 9857967, + "beginOffset": 9857940, + "headersEndOffset": 9857967, + "endOffset": 9857969, "body": { "mimeType": "text/X-HTML", "lineNumber": 156077, - "begin": 9857940, - "headersEnd": 9857967, - "end": 9857969, + "beginOffset": 9857940, + "headersEndOffset": 9857967, + "endOffset": 9857969, "octets": 2, "lines": 2 }, - "end": 9857969, "octets": 2 }, - "end": 9857969, "octets": 29, "lines": 4 }, { "mimeType": "text/richtext", "lineNumber": 156083, - "begin": 9858012, - "headersEnd": 9858103, - "end": 9859077, + "beginOffset": 9858012, + "headersEndOffset": 9858103, + "endOffset": 9859077, "octets": 974, "lines": 22 }, { "mimeType": "text/SGML", "lineNumber": 156110, - "begin": 9859120, - "headersEnd": 9859236, - "end": 9859595, + "beginOffset": 9859120, + "headersEndOffset": 9859236, + "endOffset": 9859595, "octets": 359, "lines": 15 }, { "mimeType": "text/richtext", "lineNumber": 156131, - "begin": 9859638, - "headersEnd": 9859729, - "end": 9859739, + "beginOffset": 9859638, + "headersEndOffset": 9859729, + "endOffset": 9859739, "octets": 10, "lines": 2 }, { "mimeType": "message/external-body", "lineNumber": 156138, - "begin": 9859782, - "headersEnd": 9859967, + "beginOffset": 9859782, + "headersEndOffset": 9859967, + "endOffset": 9859995, "message": { "lineNumber": 156144, - "begin": 9859967, - "headersEnd": 9859994, + "beginOffset": 9859967, + "headersEndOffset": 9859994, + "endOffset": 9859995, "body": { "mimeType": "text/X-HTML", "lineNumber": 156144, - "begin": 9859967, - "headersEnd": 9859994, - "end": 9859995, + "beginOffset": 9859967, + "headersEndOffset": 9859994, + "endOffset": 9859995, "octets": 1, "lines": 1 }, - "end": 9859995, "octets": 1 }, - "end": 9859995, "octets": 28, "lines": 3 }, { "mimeType": "text/richtext", "lineNumber": 156149, - "begin": 9860038, - "headersEnd": 9860129, - "end": 9860139, + "beginOffset": 9860038, + "headersEndOffset": 9860129, + "endOffset": 9860139, "octets": 10, "lines": 2 }, { "mimeType": "image/gif", "lineNumber": 156156, - "begin": 9860182, - "headersEnd": 9860288, - "end": 9863271, + "beginOffset": 9860182, + "headersEndOffset": 9860288, + "endOffset": 9863271, "octets": 2983, "lines": 43 }, { "mimeType": "text/richtext", "lineNumber": 156205, - "begin": 9863314, - "headersEnd": 9863405, - "end": 9869997, + "beginOffset": 9863314, + "headersEndOffset": 9863405, + "endOffset": 9869997, "octets": 6592, "lines": 260 } ], - "end": 9870042, "octets": 15249, "lines": 475 } ], - "end": 9870085, "octets": 24620, "lines": 837 }, - "end": 9870085, "octets": 24620 }, { - "mboxMarkerBegin": 9870086, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9870086, "lineNumber": 156474, - "begin": 9870094, - "headersEnd": 9871206, + "beginOffset": 9870094, + "headersEndOffset": 9871206, + "endOffset": 9901796, "body": { "mimeType": "multipart/mixed", "lineNumber": 156474, - "begin": 9870094, - "headersEnd": 9871206, + "beginOffset": 9870094, + "headersEndOffset": 9871206, + "endOffset": 9901796, "children": [ { "mimeType": "text/plain", "lineNumber": 156498, - "begin": 9871216, - "headersEnd": 9871217, - "end": 9871550, + "beginOffset": 9871216, + "headersEndOffset": 9871217, + "endOffset": 9871550, "octets": 333, "lines": 8 }, { "mimeType": "image/gif", "lineNumber": 156509, - "begin": 9871561, - "headersEnd": 9871620, - "end": 9901599, + "beginOffset": 9871561, + "headersEndOffset": 9871620, + "endOffset": 9901599, "octets": 29979, "lines": 411 }, { "mimeType": "text/plain", "lineNumber": 156925, - "begin": 9901610, - "headersEnd": 9901611, - "end": 9901783, + "beginOffset": 9901610, + "headersEndOffset": 9901611, + "endOffset": 9901783, "octets": 172, "lines": 9 } ], - "end": 9901796, "octets": 30590, "lines": 440 }, - "end": 9901796, "octets": 30590 }, { - "mboxMarkerBegin": 9901797, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 9901797, "lineNumber": 156939, - "begin": 9901805, - "headersEnd": 9903514, + "beginOffset": 9901805, + "headersEndOffset": 9903514, + "endOffset": 10086313, "body": { "mimeType": "text/plain", "lineNumber": 156939, - "begin": 9901805, - "headersEnd": 9903514, - "end": 10086313, + "beginOffset": 9901805, + "headersEndOffset": 9903514, + "endOffset": 10086313, "octets": 182799, "lines": 2951 }, - "end": 10086313, "octets": 182799 }, { - "mboxMarkerBegin": 10086314, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10086314, "lineNumber": 159921, - "begin": 10086322, - "headersEnd": 10087029, + "beginOffset": 10086322, + "headersEndOffset": 10087029, + "endOffset": 10171317, "body": { "mimeType": "multipart/mixed", "lineNumber": 159921, - "begin": 10086322, - "headersEnd": 10087029, + "beginOffset": 10086322, + "headersEndOffset": 10087029, + "endOffset": 10171317, "children": [ { "mimeType": "text/plain", "lineNumber": 159938, - "begin": 10087056, - "headersEnd": 10087057, - "end": 10087078, + "beginOffset": 10087056, + "headersEndOffset": 10087057, + "endOffset": 10087078, "octets": 21, "lines": 1 }, { "mimeType": "image/pgm", "lineNumber": 159941, - "begin": 10087106, - "headersEnd": 10087258, - "end": 10170999, + "beginOffset": 10087106, + "headersEndOffset": 10087258, + "endOffset": 10170999, "octets": 83741, "lines": 434 }, { "mimeType": "text/plain", "lineNumber": 160381, - "begin": 10171027, - "headersEnd": 10171028, - "end": 10171287, + "beginOffset": 10171027, + "headersEndOffset": 10171028, + "endOffset": 10171287, "octets": 259, "lines": 9 } ], - "end": 10171317, "octets": 84288, "lines": 455 }, - "end": 10171317, "octets": 84288 }, { - "mboxMarkerBegin": 10171318, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10171318, "lineNumber": 160394, - "begin": 10171326, - "headersEnd": 10171993, + "beginOffset": 10171326, + "headersEndOffset": 10171993, + "endOffset": 10392019, "body": { "mimeType": "multipart/mixed", "lineNumber": 160394, - "begin": 10171326, - "headersEnd": 10171993, + "beginOffset": 10171326, + "headersEndOffset": 10171993, + "endOffset": 10392019, "children": [ { "mimeType": "text/plain", "lineNumber": 160410, - "begin": 10172020, - "headersEnd": 10172021, - "end": 10172087, + "beginOffset": 10172020, + "headersEndOffset": 10172021, + "endOffset": 10172087, "octets": 66, "lines": 1 }, { "mimeType": "audio/basic", "lineNumber": 160413, - "begin": 10172115, - "headersEnd": 10172276, - "end": 10204442, + "beginOffset": 10172115, + "headersEndOffset": 10172276, + "endOffset": 10204442, "octets": 32166, "lines": 167 }, { "mimeType": "text/plain", "lineNumber": 160586, - "begin": 10204470, - "headersEnd": 10204471, - "end": 10204488, + "beginOffset": 10204470, + "headersEndOffset": 10204471, + "endOffset": 10204488, "octets": 17, "lines": 2 }, { "mimeType": "image/pbm", "lineNumber": 160590, - "begin": 10204516, - "headersEnd": 10204675, - "end": 10205760, + "beginOffset": 10204516, + "headersEndOffset": 10204675, + "endOffset": 10205760, "octets": 1085, "lines": 6 }, { "mimeType": "text/plain", "lineNumber": 160602, - "begin": 10205788, - "headersEnd": 10205789, - "end": 10205819, + "beginOffset": 10205788, + "headersEndOffset": 10205789, + "endOffset": 10205819, "octets": 30, "lines": 2 }, { "mimeType": "application/x-annotate-2", "lineNumber": 160607, - "begin": 10205847, - "headersEnd": 10205915, - "end": 10391952, + "beginOffset": 10205847, + "headersEndOffset": 10205915, + "endOffset": 10391952, "octets": 186037, "lines": 1990 }, { "mimeType": "text/plain", "lineNumber": 162602, - "begin": 10391980, - "headersEnd": 10391981, - "end": 10391989, + "beginOffset": 10391980, + "headersEndOffset": 10391981, + "endOffset": 10391989, "octets": 8, "lines": 1 } ], - "end": 10392019, "octets": 220026, "lines": 2196 }, - "end": 10392019, "octets": 220026 }, { - "mboxMarkerBegin": 10392020, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10392020, "lineNumber": 162607, - "begin": 10392028, - "headersEnd": 10392292, + "beginOffset": 10392028, + "headersEndOffset": 10392292, + "endOffset": 10466950, "body": { "mimeType": "application/octet-stream", "lineNumber": 162607, - "begin": 10392028, - "headersEnd": 10392292, - "end": 10466950, + "beginOffset": 10392028, + "headersEndOffset": 10392292, + "endOffset": 10466950, "octets": 74658, "lines": 1023 }, - "end": 10466950, "octets": 74658 }, { - "mboxMarkerBegin": 10466951, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10466951, "lineNumber": 163639, - "begin": 10466959, - "headersEnd": 10468233, + "beginOffset": 10466959, + "headersEndOffset": 10468233, + "endOffset": 10523298, "body": { "mimeType": "multipart/alternative", "lineNumber": 163639, - "begin": 10466959, - "headersEnd": 10468233, + "beginOffset": 10466959, + "headersEndOffset": 10468233, + "endOffset": 10523298, "children": [ { "mimeType": "text/plain", "lineNumber": 163673, - "begin": 10468817, - "headersEnd": 10468818, - "end": 10470665, + "beginOffset": 10468817, + "headersEndOffset": 10468818, + "endOffset": 10470665, "octets": 1847, "lines": 34 }, { "mimeType": "multipart/mixed", "lineNumber": 163710, - "begin": 10470724, - "headersEnd": 10470827, + "beginOffset": 10470724, + "headersEndOffset": 10470827, + "endOffset": 10523237, "children": [ { "mimeType": "text/richtext", "lineNumber": 163714, - "begin": 10470887, - "headersEnd": 10470960, - "end": 10472959, + "beginOffset": 10470887, + "headersEndOffset": 10470960, + "endOffset": 10472959, "octets": 1999, "lines": 29 }, { "mimeType": "image/xwd", "lineNumber": 163748, - "begin": 10473020, - "headersEnd": 10473079, - "end": 10481008, + "beginOffset": 10473020, + "headersEndOffset": 10473079, + "endOffset": 10481008, "octets": 7929, "lines": 109 }, { "mimeType": "text/plain", "lineNumber": 163862, - "begin": 10481069, - "headersEnd": 10481139, - "end": 10481142, + "beginOffset": 10481069, + "headersEndOffset": 10481139, + "endOffset": 10481142, "octets": 3, "lines": 2 }, { "mimeType": "audio/basic", "lineNumber": 163869, - "begin": 10481203, - "headersEnd": 10481296, - "end": 10523174, + "beginOffset": 10481203, + "headersEndOffset": 10481296, + "endOffset": 10523174, "octets": 41878, "lines": 574 } ], - "end": 10523237, "octets": 52410, "lines": 736 } ], - "end": 10523298, "octets": 55065, "lines": 787 }, - "end": 10523298, "octets": 55065 }, { - "mboxMarkerBegin": 10523299, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10523299, "lineNumber": 164453, - "begin": 10523307, - "headersEnd": 10523459, + "beginOffset": 10523307, + "headersEndOffset": 10523459, + "endOffset": 10528262, "body": { "mimeType": "message/partial", "lineNumber": 164453, - "begin": 10523307, - "headersEnd": 10523459, - "end": 10528262, + "beginOffset": 10523307, + "headersEndOffset": 10523459, + "endOffset": 10528262, "octets": 4803, "lines": 68 }, - "end": 10528262, "octets": 4803 }, { - "mboxMarkerBegin": 10528263, - "mboxMarkerLength": 7, + "mboxMarkerOffset": 10528263, "lineNumber": 164527, - "begin": 10528271, - "headersEnd": 10529016, + "beginOffset": 10528271, + "headersEndOffset": 10529016, + "endOffset": 10536315, "body": { "mimeType": "multipart/alternative", "lineNumber": 164527, - "begin": 10528271, - "headersEnd": 10529016, + "beginOffset": 10528271, + "headersEndOffset": 10529016, + "endOffset": 10536315, "children": [ { "mimeType": "text/plain", "lineNumber": 164551, - "begin": 10529395, - "headersEnd": 10529396, - "end": 10529764, + "beginOffset": 10529395, + "headersEndOffset": 10529396, + "endOffset": 10529764, "octets": 368, "lines": 8 }, { "mimeType": "multipart/mixed", "lineNumber": 164562, - "begin": 10529805, - "headersEnd": 10529890, + "beginOffset": 10529805, + "headersEndOffset": 10529890, + "endOffset": 10536272, "children": [ { "mimeType": "text/plain", "lineNumber": 164566, - "begin": 10529932, - "headersEnd": 10530002, - "end": 10530091, + "beginOffset": 10529932, + "headersEndOffset": 10530002, + "endOffset": 10530091, "octets": 89, "lines": 4 }, { "mimeType": "image/gif", "lineNumber": 164575, - "begin": 10530134, - "headersEnd": 10530248, - "end": 10535911, + "beginOffset": 10530134, + "headersEndOffset": 10530248, + "endOffset": 10535911, "octets": 5663, "lines": 83 }, { "mimeType": "text/plain", "lineNumber": 164664, - "begin": 10535954, - "headersEnd": 10536024, - "end": 10536227, + "beginOffset": 10535954, + "headersEndOffset": 10536024, + "endOffset": 10536227, "octets": 203, "lines": 6 } ], - "end": 10536272, "octets": 6382, "lines": 110 } ], - "end": 10536315, "octets": 7299, "lines": 133 }, - "end": 10536315, "octets": 7299 } ] \ No newline at end of file From 75b09b3fb1806c5fd35f7b8e3365cf64059588e1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 11 Jul 2020 12:38:17 -0400 Subject: [PATCH 669/741] bumped version to 2.9.1 --- MimeKit/MimeKit.csproj | 2 +- MimeKit/MimeKitLite.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 +++--- ReleaseNotes.md | 20 +++++++++++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 19 ++++++++++-------- nuget/MimeKitLite.nuspec | 11 +++++----- .../DkimVerifier/DkimVerifier.csproj | 2 +- .../MessageReader.Android.csproj | 2 +- .../MessageReader.iOS.csproj | 2 +- .../MessageReader/MessageReader.csproj | 2 +- 12 files changed, 48 insertions(+), 24 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index dd2a4dd25b..9b5d70f5c3 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.8.0 + 2.9.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index cfc938ae83..a7df51bf88 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.8.0 + 2.9.1 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index f559374a67..89198893f8 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.8.0.0")] -[assembly: AssemblyFileVersion ("2.8.0.0")] -[assembly: AssemblyVersion ("2.8.0.0")] +[assembly: AssemblyInformationalVersion ("2.9.1.0")] +[assembly: AssemblyFileVersion ("2.9.1.0")] +[assembly: AssemblyVersion ("2.9.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 1aff49a8af..ae807cbbe7 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,25 @@ # Release Notes +### MimeKit 2.9.0 (2020-07-11) + +* Refactored OpenPgpContext to separate out key storage implementation. + (issue [#576](https://github.com/jstedfast/MimeKit/issues/576)) +* Fixed the TextToFlowed converter. + (issue [#580](https://github.com/jstedfast/MimeKit/issues/580)) +* Protect against ABRs in AuthenticationResults.TryParse(). + (issue [#581](https://github.com/jstedfast/MimeKit/issues/581)) +* The net45 version of MimeKit now depends on Portable.BouncyCastle instead of official + BouncyCastle. +* Added MimeParser events to report stream offsets for MimeMessages and MimeEntities. + (issue [#582](https://github.com/jstedfast/MimeKit/issues/582)) +* Fixed DkimPublicKeyLocatorBase to treat unspecified 'k' values in DKIM DNS records as + "k=rsa". + (issue [#583](https://github.com/jstedfast/MimeKit/issues/583)) +* Fixed date format serializer to use CultureInfo.InvariantCulture. +* Fixed AuthenticationResults parser to allow '_' characters in method results. + (issue [#584](https://github.com/jstedfast/MimeKit/issues/584)) +* Improved RSACng and DSACng support. + ### MimeKit 2.8.0 (2020-05-30) * Improved logic for verifying signatures for MimeParts containing mixed line endings. diff --git a/appveyor.yml b/appveyor.yml index 80fda21c59..410a03e20b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.8.0.{build} +version: 2.9.1.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0743ba2ede..318bf6ca0d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.8.0$(Rev:.r) +name: 2.9.1$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 5a23d79905..c36ea0413a 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.8.0 + 2.9.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,12 +26,15 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Improved logic for verifying signatures for MimeParts containing mixed line endings. (issue #569) -* Fixed MailboxAddress parser to decode IDN-encoded local-parts of email addresses. (MailKit issue #1026) -* Added new MailboxAddress.GetAddress(bool idnEncode) method. -* Improved subclassability of OpenPgpContext by making a number of methods virtual. (issue #571) -* Added support for RSACng and DSACng. (issue #567) -* Dropped Xamarin platforms since they are compatible with netstandard2.0. + * Refactored OpenPgpContext to separate out key storage implementation. (issue #576) + * Fixed the TextToFlowed converter. (issue #580) + * Protect against ABRs in AuthenticationResults.TryParse(). (issue #581) + * The net45 version of MimeKit now depends on Portable.BouncyCastle instead of official BouncyCastle. + * Added MimeParser events to report stream offsets for MimeMessages and MimeEntities. (issue #582) + * Fixed DkimPublicKeyLocatorBase to treat unspecified 'k' values in DKIM DNS records as "k=rsa". (issue #583) + * Fixed date format serializer to use CultureInfo.InvariantCulture. + * Fixed AuthenticationResults parser to allow '_' characters in method results. (issue #584) + * Improved RSACng and DSACng support. .NET Foundation and Contributors en-US @@ -68,7 +71,7 @@ - + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 655b6b9798..160b9919d3 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.8.0 + 2.9.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,10 +26,11 @@ An Open Source library for creating and parsing MIME messages. -* Improved logic for verifying signatures for MimeParts containing mixed line endings. (issue #569) -* Fixed MailboxAddress parser to decode IDN-encoded local-parts of email addresses. (MailKit issue #1026) -* Added new MailboxAddress.GetAddress(bool idnEncode) method. -* Dropped Xamarin platforms since they are compatible with netstandard2.0. + * Fixed the TextToFlowed converter. (issue #580) + * Protect against ABRs in AuthenticationResults.TryParse(). (issue #581) + * Added MimeParser events to report stream offsets for MimeMessages and MimeEntities. (issue #582) + * Fixed date format serializer to use CultureInfo.InvariantCulture. + * Fixed AuthenticationResults parser to allow '_' characters in method results. (issue #584) .NET Foundation and Contributors en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index 725e3c7a1c..c5801ecd01 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -36,7 +36,7 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 3e891a8ab8..1da063762c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -64,7 +64,7 @@ - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index e27644acf0..09442dcffa 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -76,7 +76,7 @@ - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 5b8eff1d5f..738ee2fe6f 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -47,7 +47,7 @@ - + From 3f19964d60bec3da620503a2fc670ff2ddfb0536 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 12 Jul 2020 09:00:06 -0400 Subject: [PATCH 670/741] Added HeaderId.RequireTLS (rfc8689) --- MimeKit/HeaderId.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 33f8a8c16a..9f34ba1cff 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -539,6 +539,12 @@ public enum HeaderId { /// RequireRecipientValidSince, + /// + /// The Require-TLS header field. + /// + [HeaderName ("Require-TLS")] + RequireTLS, + /// /// The Resent-Bcc header field. /// From 26fe51f8d5f031a590b2d055f3c45103c3123bba Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 12 Jul 2020 10:15:19 -0400 Subject: [PATCH 671/741] Oops, that should have been TLS-Required instead of Require-TLS --- MimeKit/HeaderId.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/MimeKit/HeaderId.cs b/MimeKit/HeaderId.cs index 9f34ba1cff..a3ea7f8ca7 100644 --- a/MimeKit/HeaderId.cs +++ b/MimeKit/HeaderId.cs @@ -539,12 +539,6 @@ public enum HeaderId { /// RequireRecipientValidSince, - /// - /// The Require-TLS header field. - /// - [HeaderName ("Require-TLS")] - RequireTLS, - /// /// The Resent-Bcc header field. /// @@ -635,6 +629,12 @@ public enum HeaderId { /// Supersedes, + /// + /// The TLS-Required header field. + /// + [HeaderName ("TLS-Required")] + TLSRequired, + /// /// The To header field. /// From 71cb3c17d11b91006dfc5570572df20bcdbb26e2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 Jul 2020 09:22:24 -0400 Subject: [PATCH 672/741] Improved docs for GroupAddress.Members Explain that members of a GroupAddress SHOULD be of the type MailboxAddress but that due to broken mail software, it's POSSIBLE that group members will include other GroupAddress items. Recommend that GroupAddresses should not be added as members when constructing new messages. Fixes issue #589 --- MimeKit/GroupAddress.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/MimeKit/GroupAddress.cs b/MimeKit/GroupAddress.cs index 745ebad150..deedc742f0 100644 --- a/MimeKit/GroupAddress.cs +++ b/MimeKit/GroupAddress.cs @@ -118,9 +118,13 @@ public override InternetAddress Clone () /// Gets the members of the group. /// /// - /// Represents the member addresses of the group. Typically the member addresses - /// will be of the variety, but it is possible - /// for groups to contain other groups. + /// Represents the member addresses of the group. If the group address properly conforms + /// to the internet standards, every group member should be of the + /// variety. When handling group addresses constructed by third-party software, it is possible + /// for groups to contain members of the variety. + /// When constructing new messages, it is recommended that address groups not contain + /// anything other than members in order to comply with internet + /// standards. /// /// The list of members. public InternetAddressList Members { From f09c83906738727638d33a5fcd236531281e9ce6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 Jul 2020 10:06:58 -0400 Subject: [PATCH 673/741] Add an X-MimeKit-Warning header to messages/entities serialized with ToString() The idea is to get people to stop using ToString() to serialize messages and to push them to start serializing messages correctly using the WriteTo() methods. ToString() can never be fixed to work correctly because it's impossible to represent *all* messages as a string using a single character encoding. --- MimeKit/MimeEntity.cs | 5 +++++ MimeKit/MimeMessage.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/MimeKit/MimeEntity.cs b/MimeKit/MimeEntity.cs index a654c28dff..de1aef614b 100644 --- a/MimeKit/MimeEntity.cs +++ b/MimeKit/MimeEntity.cs @@ -322,6 +322,8 @@ public bool IsAttachment { } } + static readonly byte[] ToStringWarning = Encoding.UTF8.GetBytes ("X-MimeKit-Warning: Do NOT use ToString() to serialize entities! Use one of the WriteTo() methods instead!"); + /// /// Returns a that represents the for debugging purposes. /// @@ -336,6 +338,9 @@ public bool IsAttachment { public override string ToString () { using (var memory = new MemoryStream ()) { + memory.Write (ToStringWarning, 0, ToStringWarning.Length); + memory.Write (FormatOptions.Default.NewLineBytes, 0, FormatOptions.Default.NewLineBytes.Length); + WriteTo (memory); #if !NETSTANDARD1_3 && !NETSTANDARD1_6 diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 35fada6e3e..796ce6b222 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -976,6 +976,8 @@ public IEnumerable Attachments { get { return EnumerateMimeParts (Body).Where (x => x.IsAttachment); } } + static readonly byte[] ToStringWarning = Encoding.UTF8.GetBytes ("X-MimeKit-Warning: Do NOT use ToString() to serialize messages! Use one of the WriteTo() methods instead!"); + /// /// Returns a that represents the for debugging purposes. /// @@ -990,6 +992,9 @@ public IEnumerable Attachments { public override string ToString () { using (var memory = new MemoryStream ()) { + memory.Write (ToStringWarning, 0, ToStringWarning.Length); + memory.Write (FormatOptions.Default.NewLineBytes, 0, FormatOptions.Default.NewLineBytes.Length); + WriteTo (FormatOptions.Default, memory); #if !NETSTANDARD1_3 && !NETSTANDARD1_6 From af0075c983782361431c8366c14b4d18784beff9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 Jul 2020 10:19:50 -0400 Subject: [PATCH 674/741] Disable the build of some code that is only needed for debugging the parser --- MimeKit/MimeParser.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index 27bc73a8f8..eb362bceb7 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -76,10 +76,12 @@ public static Boundary CreateMboxBoundary () return boundary; } +#if DEBUG_PARSER public override string ToString () { return Encoding.UTF8.GetString (Marker, 0, Marker.Length); } +#endif } enum MimeParserState : sbyte @@ -513,7 +515,7 @@ protected virtual void OnMimeEntityEnd (MimeEntityEndEventArgs args) MimeEntityEnd?.Invoke (this, args); } -#if DEBUG +#if DEBUG_PARSER static string ConvertToCString (byte[] buffer, int startIndex, int length) { var cstr = new StringBuilder (); From 51448434f2b045cabe8902bf3b5e6e7ee9199e99 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 13 Jul 2020 10:28:56 -0400 Subject: [PATCH 675/741] Fixed the unit tests --- UnitTests/MimePartTests.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/UnitTests/MimePartTests.cs b/UnitTests/MimePartTests.cs index 2626988c29..8d2def2335 100644 --- a/UnitTests/MimePartTests.cs +++ b/UnitTests/MimePartTests.cs @@ -126,7 +126,16 @@ public void TestParameterizedCtor () Assert.AreEqual ("id@localhost.com", part.ContentId, "Content-Id"); Assert.AreEqual (ContentEncoding.Base64, part.ContentTransferEncoding, "Content-Transfer-Encoding"); - Assert.AreEqual (expected, part.ToString ().Replace ("\r\n", "\n"), "ToString"); + + using (var stream = new MemoryStream ()) { + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + part.WriteTo (options, stream); + + var serialized = Encoding.ASCII.GetString (stream.GetBuffer (), 0, (int) stream.Length); + Assert.AreEqual (expected, serialized, "Serialized"); + } } [Test] From f328407f49c61bcd1e04de65bb6aeaa4cba883f8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 15 Jul 2020 10:30:12 -0400 Subject: [PATCH 676/741] Added another work-around for parsing Authentication-Results headers Fixes issue #590 --- MimeKit/Cryptography/AuthenticationResults.cs | 42 ++------------- .../AuthenticationResultsTests.cs | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/MimeKit/Cryptography/AuthenticationResults.cs b/MimeKit/Cryptography/AuthenticationResults.cs index a1f16c162c..b8e710ebd3 100644 --- a/MimeKit/Cryptography/AuthenticationResults.cs +++ b/MimeKit/Cryptography/AuthenticationResults.cs @@ -266,24 +266,6 @@ static bool SkipDomain (byte[] text, ref int index, int endIndex) return false; } - // pvalue := [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) [CFWS] - // value := token / quoted-string - // token := 1* - // tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> / "/" / "[" / "]" / "?" / "=" - static bool IsPValueToken (byte c) - { - // Note: We're allowing '/' because it is a base64 character - // - // See https://github.com/jstedfast/MimeKit/issues/518 for details. - return c.IsToken () || c == (byte) '/'; - } - - static void SkipPValueToken (byte[] text, ref int index, int endIndex) - { - while (index < endIndex && IsPValueToken (text[index])) - index++; - } - static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out bool quoted) { // pvalue := [CFWS] ( value / [ [ local-part ] "@" ] domain-name ) [CFWS] @@ -302,28 +284,12 @@ static bool SkipPropertyValue (byte[] text, ref int index, int endIndex, out boo quoted = false; - if (text[index] == (byte) '@') { - // "@" domain-name + // Note: we're forced to accept even tspecials in the property value because they are used in the real-world. + // See https://github.com/jstedfast/MimeKit/issues/518 ('/') and https://github.com/jstedfast/MimeKit/issues/590 ('=') + // for details. + while (index < endIndex && !text[index].IsWhitespace() && text[index] != (byte) ';' && text[index] != (byte) '(') index++; - if (!SkipDomain (text, ref index, endIndex)) - return false; - - return true; - } - - SkipPValueToken (text, ref index, endIndex); - - if (index < endIndex) { - if (text[index] == (byte) '@') { - // local-part@domain-name - index++; - - if (!SkipDomain (text, ref index, endIndex)) - return false; - } - } - return true; } diff --git a/UnitTests/Cryptography/AuthenticationResultsTests.cs b/UnitTests/Cryptography/AuthenticationResultsTests.cs index 19beaded83..23e49351c1 100644 --- a/UnitTests/Cryptography/AuthenticationResultsTests.cs +++ b/UnitTests/Cryptography/AuthenticationResultsTests.cs @@ -1003,6 +1003,60 @@ public void TestParseMethodResultWithUnderscore () Assert.AreEqual (expected, encoded.ToString ()); } + // Tests work-around for https://github.com/jstedfast/MimeKit/issues/590 + [Test] + public void TestParsePropertyWithEqualSignInValue () + { + const string input = "i=1; relay.mailrelay.com; dkim=pass header.d=domaina.com header.s=sfdc header.b=abcefg; dmarc=pass (policy=quarantine) header.from=domaina.com; spf=pass (relay.mailrelay.com: domain of support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com designates 1.1.1.1 as permitted sender) smtp.mailfrom=support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com"; + var buffer = Encoding.ASCII.GetBytes (input); + AuthenticationResults authres; + + Assert.IsTrue (AuthenticationResults.TryParse (buffer, 0, buffer.Length, out authres)); + Assert.AreEqual (1, authres.Instance.Value, "i"); + Assert.AreEqual ("relay.mailrelay.com", authres.AuthenticationServiceIdentifier, "authserv-id"); + Assert.AreEqual (3, authres.Results.Count, "methods"); + Assert.AreEqual ("dkim", authres.Results[0].Method); + Assert.AreEqual ("pass", authres.Results[0].Result); + Assert.AreEqual (null, authres.Results[0].ResultComment); + Assert.AreEqual (3, authres.Results[0].Properties.Count, "dkim properties"); + Assert.AreEqual ("header", authres.Results[0].Properties[0].PropertyType); + Assert.AreEqual ("d", authres.Results[0].Properties[0].Property); + Assert.AreEqual ("domaina.com", authres.Results[0].Properties[0].Value); + Assert.AreEqual ("header", authres.Results[0].Properties[1].PropertyType); + Assert.AreEqual ("s", authres.Results[0].Properties[1].Property); + Assert.AreEqual ("sfdc", authres.Results[0].Properties[1].Value); + Assert.AreEqual ("header", authres.Results[0].Properties[2].PropertyType); + Assert.AreEqual ("b", authres.Results[0].Properties[2].Property); + Assert.AreEqual ("abcefg", authres.Results[0].Properties[2].Value); + + Assert.AreEqual ("dmarc", authres.Results[1].Method); + Assert.AreEqual ("pass", authres.Results[1].Result); + Assert.AreEqual ("policy=quarantine", authres.Results[1].ResultComment); + Assert.AreEqual (1, authres.Results[1].Properties.Count, "spf properties"); + Assert.AreEqual ("header", authres.Results[1].Properties[0].PropertyType); + Assert.AreEqual ("from", authres.Results[1].Properties[0].Property); + Assert.AreEqual ("domaina.com", authres.Results[1].Properties[0].Value); + + Assert.AreEqual ("spf", authres.Results[2].Method); + Assert.AreEqual ("pass", authres.Results[2].Result); + Assert.AreEqual ("relay.mailrelay.com: domain of support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com designates 1.1.1.1 as permitted sender", authres.Results[2].ResultComment); + Assert.AreEqual (1, authres.Results[2].Properties.Count, "dmarc properties"); + Assert.AreEqual ("smtp", authres.Results[2].Properties[0].PropertyType); + Assert.AreEqual ("mailfrom", authres.Results[2].Properties[0].Property); + Assert.AreEqual ("support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com", authres.Results[2].Properties[0].Value); + + Assert.AreEqual ("i=1; relay.mailrelay.com; dkim=pass header.d=domaina.com header.s=sfdc header.b=abcefg; dmarc=pass (policy=quarantine) header.from=domaina.com; spf=pass (relay.mailrelay.com: domain of support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com designates 1.1.1.1 as permitted sender) smtp.mailfrom=support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com", authres.ToString ()); + + const string expected = " i=1; relay.mailrelay.com;\n\tdkim=pass header.d=domaina.com header.s=sfdc header.b=abcefg;\n\tdmarc=pass (policy=quarantine) header.from=domaina.com; spf=pass\n\t(relay.mailrelay.com: domain of support=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com designates 1.1.1.1 as permitted sender)\n\tsmtp.mailfrom=\n\tsupport=domaina.com__0-1q6woix34obtbu@823lwd90ky2ahf.mail_sender.com\n"; + var encoded = new StringBuilder (); + var options = FormatOptions.Default.Clone (); + options.NewLineFormat = NewLineFormat.Unix; + + authres.Encode (options, encoded, "Authentication-Results:".Length); + + Assert.AreEqual (expected, encoded.ToString ()); + } + static void AssertParseFailure (string input, int tokenIndex, int errorIndex) { var buffer = Encoding.ASCII.GetBytes (input); From 7368395738fe06930ad2a42198ee2164fa788551 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 25 Jul 2020 19:10:44 -0400 Subject: [PATCH 677/741] Added improved error reporting for ArcVerifier (#593) * Added improved error reporting for ArcVerifier Fixes issue #591 --- MimeKit/Cryptography/ArcSigner.cs | 12 +- MimeKit/Cryptography/ArcVerifier.cs | 192 +++++++++++-- UnitTests/Cryptography/ArcVerifierTests.cs | 307 +++++++++++---------- 3 files changed, 335 insertions(+), 176 deletions(-) diff --git a/MimeKit/Cryptography/ArcSigner.cs b/MimeKit/Cryptography/ArcSigner.cs index 4f6fbb360e..d7c3485dea 100644 --- a/MimeKit/Cryptography/ArcSigner.cs +++ b/MimeKit/Cryptography/ArcSigner.cs @@ -343,18 +343,14 @@ Header GenerateArcSeal (FormatOptions options, int instance, string cv, long t, async Task ArcSignAsync (FormatOptions options, MimeMessage message, IList headers, bool doAsync, CancellationToken cancellationToken) { - ArcVerifier.GetArcHeaderSets (message, true, out ArcHeaderSet[] sets, out int count); + ArcVerifier.GetArcHeaderSets (message, true, out ArcHeaderSet[] sets, out int count, out var errors); AuthenticationResults authres; int instance = count + 1; string cv; - if (count > 0) { - var parameters = sets[count - 1].ArcSealParameters; - - // do not sign if there is already a failed ARC-Seal. - if (!parameters.TryGetValue ("cv", out cv) || cv.Equals ("fail", StringComparison.OrdinalIgnoreCase)) - return; - } + // do not sign if there is already a failed/invalid ARC-Seal. + if (count > 0 && (errors & ArcValidationErrors.InvalidArcSealChainValidationValue) != 0) + return; options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index 22dd0bb500..a2e339ed71 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -63,6 +63,86 @@ public enum ArcSignatureValidationResult Fail } + /// + /// An enumeration of possible ARC validation errors. + /// + /// + /// An enumeration of possible ARC validation errors. + /// + [Flags] + public enum ArcValidationErrors + { + /// + /// No errors. + /// + None = 0, + + /// + /// One or more duplicate ARC-Authentication-Results headers exist. + /// + DuplicateArcAuthenticationResults = 1 << 0, + + /// + /// One or more duplicate ARC-Message-Signature headers exist. + /// + DuplicateArcMessageSignature = 1 << 1, + + /// + /// One or more duplicate ARC-Seal headers exist. + /// + DuplicateArcSeal = 1 << 2, + + /// + /// One or more ARC-Authentication-Results headers are missing. + /// + MissingArcAuthenticationResults = 1 << 3, + + /// + /// One or more ARC-Message-Signature headers are missing. + /// + MissingArcMessageSignature = 1 << 4, + + /// + /// One or more ARC-Seal headers are missing. + /// + MissingArcSeal = 1 << 5, + + /// + /// One or more ARC-Authentication-Results headers could not be parsed. + /// + InvalidArcAuthenticationResults = 1 << 6, + + /// + /// One or more ARC-Message-Signature headers could not be parsed. + /// + InvalidArcMessageSignature = 1 << 7, + + /// + /// One or more ARC-Seal headers could not be parsed. + /// + InvalidArcSeal = 1 << 8, + + /// + /// One or more ARC-Seal headers have an invalid cv value. + /// + InvalidArcSealChainValidationValue = 1 << 9, + + /// + /// One or more ARC-Seal headers are missing a cv value. + /// + MissingArcSealChainValidationValue = 1 << 10, + + /// + /// Validation failed for the most recent ARC-Message-Signature header. + /// + MessageSignatureValidationFailed = 1 << 11, + + /// + /// Validation failed for one or more of the ARC-Seal headers. + /// + SealValidationFailed = 1 << 12 + } + /// /// An ARC header validation result. /// @@ -205,6 +285,17 @@ public ArcHeaderValidationResult[] Seals { public ArcSignatureValidationResult Chain { get; internal set; } + + /// + /// Get the chain validation errors. + /// + /// + /// Gets the chain validation errors. + /// + /// The chain validation errors. + public ArcValidationErrors ChainErrors { + get; internal set; + } } class ArcHeaderSet @@ -396,17 +487,18 @@ async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, } } - internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage message, bool throwOnError, out ArcHeaderSet[] sets, out int count) + internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage message, bool throwOnError, out ArcHeaderSet[] sets, out int count, out ArcValidationErrors errors) { ArcHeaderSet set; + errors = ArcValidationErrors.None; sets = new ArcHeaderSet[50]; count = 0; for (int i = 0; i < message.Headers.Count; i++) { Dictionary parameters = null; var header = message.Headers[i]; - int instance; + int instance = 0; string value; switch (header.Id) { @@ -415,14 +507,16 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (throwOnError) throw new FormatException ("Invalid ARC-Authentication-Results header."); - return ArcSignatureValidationResult.Fail; + errors |= ArcValidationErrors.InvalidArcAuthenticationResults; + break; } if (!authres.Instance.HasValue) { if (throwOnError) throw new FormatException ("Missing instance tag in ARC-Authentication-Results header."); - return ArcSignatureValidationResult.Fail; + errors |= ArcValidationErrors.InvalidArcAuthenticationResults; + break; } instance = authres.Instance.Value; @@ -431,7 +525,9 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Invalid instance tag in ARC-Authentication-Results header: i={0}", instance)); - return ArcSignatureValidationResult.Fail; + errors |= ArcValidationErrors.InvalidArcAuthenticationResults; + instance = 0; + break; } break; case HeaderId.ArcMessageSignature: @@ -442,26 +538,39 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (throwOnError) throw; - return ArcSignatureValidationResult.Fail; + if (header.Id == HeaderId.ArcMessageSignature) + errors |= ArcValidationErrors.InvalidArcMessageSignature; + else + errors |= ArcValidationErrors.InvalidArcSeal; + + break; } if (!parameters.TryGetValue ("i", out value)) { if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing instance tag in {0} header.", header.Id.ToHeaderName ())); - return ArcSignatureValidationResult.Fail; + if (header.Id == HeaderId.ArcMessageSignature) + errors |= ArcValidationErrors.InvalidArcMessageSignature; + else + errors |= ArcValidationErrors.InvalidArcSeal; + + break; } if (!int.TryParse (value, NumberStyles.Integer, CultureInfo.InvariantCulture, out instance) || instance < 1 || instance > 50) { if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Invalid instance tag in {0} header: i={1}", header.Id.ToHeaderName (), value)); - return ArcSignatureValidationResult.Fail; + if (header.Id == HeaderId.ArcMessageSignature) + errors |= ArcValidationErrors.InvalidArcMessageSignature; + else + errors |= ArcValidationErrors.InvalidArcSeal; + + instance = 0; + break; } break; - default: - instance = 0; - break; } if (instance == 0) @@ -471,8 +580,22 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (set == null) sets[instance - 1] = set = new ArcHeaderSet (); - if (!set.Add (header, parameters)) - return ArcSignatureValidationResult.Fail; + if (!set.Add (header, parameters)) { + if (throwOnError) + throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Duplicate {0} header for i={1}", header.Id.ToHeaderName (), instance)); + + switch (header.Id) { + case HeaderId.ArcAuthenticationResults: + errors |= ArcValidationErrors.DuplicateArcAuthenticationResults; + break; + case HeaderId.ArcMessageSignature: + errors |= ArcValidationErrors.DuplicateArcMessageSignature; + break; + case HeaderId.ArcSeal: + errors |= ArcValidationErrors.DuplicateArcSeal; + break; + } + } if (instance > count) count = instance; @@ -491,35 +614,46 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC headers for i={0}", i + 1)); - return ArcSignatureValidationResult.Fail; + if ((errors & ArcValidationErrors.InvalidArcAuthenticationResults) == 0) + errors |= ArcValidationErrors.MissingArcAuthenticationResults; + if ((errors & ArcValidationErrors.InvalidArcMessageSignature) == 0) + errors |= ArcValidationErrors.MissingArcMessageSignature; + if ((errors & ArcValidationErrors.InvalidArcSeal) == 0) + errors |= ArcValidationErrors.MissingArcSeal; + continue; } if (set.ArcAuthenticationResult == null) { if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC-Authentication-Results header for i={0}", i + 1)); - return ArcSignatureValidationResult.Fail; + if ((errors & ArcValidationErrors.InvalidArcAuthenticationResults) == 0) + errors |= ArcValidationErrors.MissingArcAuthenticationResults; } if (set.ArcMessageSignature == null) { if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC-Message-Signature header for i={0}", i + 1)); - return ArcSignatureValidationResult.Fail; + if ((errors & ArcValidationErrors.InvalidArcMessageSignature) == 0) + errors |= ArcValidationErrors.MissingArcMessageSignature; } if (set.ArcSeal == null) { if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing ARC-Seal header for i={0}", i + 1)); - return ArcSignatureValidationResult.Fail; + if ((errors & ArcValidationErrors.InvalidArcSeal) == 0) + errors |= ArcValidationErrors.MissingArcSeal; + continue; } if (!set.ArcSealParameters.TryGetValue ("cv", out string cv)) { if (throwOnError) throw new FormatException (string.Format (CultureInfo.InvariantCulture, "Missing chain validation tag in ARC-Seal header for i={0}.", i + 1)); - return ArcSignatureValidationResult.Fail; + errors |= ArcValidationErrors.MissingArcSealChainValidationValue; + continue; } // The "cv" value for all ARC-Seal header fields MUST NOT be @@ -527,14 +661,16 @@ internal static ArcSignatureValidationResult GetArcHeaderSets (MimeMessage messa // MUST be "pass". For the ARC Set with instance value = 1, the // value MUST be "none". if (!cv.Equals (i == 0 ? "none" : "pass", StringComparison.Ordinal)) - return ArcSignatureValidationResult.Fail; + errors |= ArcValidationErrors.InvalidArcSealChainValidationValue; } - return ArcSignatureValidationResult.Pass; + return errors == ArcValidationErrors.None ? ArcSignatureValidationResult.Pass : ArcSignatureValidationResult.Fail; } async Task VerifyAsync (FormatOptions options, MimeMessage message, bool doAsync, CancellationToken cancellationToken) { + const ArcValidationErrors ArcSealCvParamErrors = ArcValidationErrors.InvalidArcSealChainValidationValue | ArcValidationErrors.MissingArcSealChainValidationValue; + if (options == null) throw new ArgumentNullException (nameof (options)); @@ -543,17 +679,25 @@ async Task VerifyAsync (FormatOptions options, MimeMessage var result = new ArcValidationResult (); - switch (GetArcHeaderSets (message, false, out ArcHeaderSet[] sets, out int count)) { + switch (GetArcHeaderSets (message, false, out ArcHeaderSet[] sets, out int count, out var errors)) { case ArcSignatureValidationResult.None: return result; case ArcSignatureValidationResult.Fail: result.Chain = ArcSignatureValidationResult.Fail; + result.ChainErrors = errors; + + // If the only error(s) are invalid or missing 'cv' values, ignore the errors for now. + if ((errors & ~ArcSealCvParamErrors) == 0) + break; + return result; + default: + result.Chain = ArcSignatureValidationResult.Pass; + break; } int newest = count - 1; result.Seals = new ArcHeaderValidationResult[count]; - result.Chain = ArcSignatureValidationResult.Pass; // validate the most recent Arc-Message-Signature try { @@ -566,10 +710,12 @@ async Task VerifyAsync (FormatOptions options, MimeMessage result.MessageSignature.Signature = ArcSignatureValidationResult.Pass; } else { result.MessageSignature.Signature = ArcSignatureValidationResult.Fail; + result.ChainErrors |= ArcValidationErrors.MessageSignatureValidationFailed; result.Chain = ArcSignatureValidationResult.Fail; } } catch { result.MessageSignature.Signature = ArcSignatureValidationResult.Fail; + result.ChainErrors |= ArcValidationErrors.MessageSignatureValidationFailed; result.Chain = ArcSignatureValidationResult.Fail; } @@ -582,10 +728,12 @@ async Task VerifyAsync (FormatOptions options, MimeMessage result.Seals[i].Signature = ArcSignatureValidationResult.Pass; } else { result.Seals[i].Signature = ArcSignatureValidationResult.Fail; + result.ChainErrors |= ArcValidationErrors.SealValidationFailed; result.Chain = ArcSignatureValidationResult.Fail; } } catch { result.Seals[i].Signature = ArcSignatureValidationResult.Fail; + result.ChainErrors |= ArcValidationErrors.SealValidationFailed; result.Chain = ArcSignatureValidationResult.Fail; } } diff --git a/UnitTests/Cryptography/ArcVerifierTests.cs b/UnitTests/Cryptography/ArcVerifierTests.cs index 8deee7e6a5..469edc010d 100644 --- a/UnitTests/Cryptography/ArcVerifierTests.cs +++ b/UnitTests/Cryptography/ArcVerifierTests.cs @@ -129,10 +129,10 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - MimeMessage message; using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { - message = MimeMessage.Load (stream); + var message = MimeMessage.Load (stream); + ArcValidationErrors errors; ArcHeaderSet[] sets; Header broken, aar; int index, count; @@ -145,10 +145,11 @@ This is a test message. broken = new Header (HeaderId.ArcAuthenticationResults, "this should be unparsable..."); message.Headers[index] = broken; - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Broken AAR"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Broken AAR"); + Assert.AreEqual (ArcValidationErrors.InvalidArcAuthenticationResults, errors, "Errors"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Broken AAR should throwOnError"); } catch (FormatException) { } catch { @@ -158,10 +159,11 @@ This is a test message. // set an AAR that is missing the instance value broken.Value = aar.Value.Replace ("i=1; ", ""); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AAR missing i=1"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "AAR missing i=1"); + Assert.AreEqual (ArcValidationErrors.InvalidArcAuthenticationResults, errors, "Errors missing i=1"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("AAR missing i=1 should throwOnError"); } catch (FormatException) { } catch { @@ -171,10 +173,11 @@ This is a test message. // set an AAR that has an invalid instance value broken.Value = aar.Value.Replace ("i=1; ", "i=0; "); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AAR i=0"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "AAR i=0"); + Assert.AreEqual (ArcValidationErrors.InvalidArcAuthenticationResults, errors, "Errors i=0"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("AAR i=0 should throwOnError"); } catch (FormatException) { } catch { @@ -184,10 +187,11 @@ This is a test message. // remove the AAR completely message.Headers.RemoveAt (index); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing AAR"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Missing AAR"); + Assert.AreEqual (ArcValidationErrors.MissingArcAuthenticationResults, errors, "Errors removed AAR"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Missing AAR should throwOnError"); } catch (FormatException) { } catch { @@ -236,10 +240,10 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - MimeMessage message; using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { - message = MimeMessage.Load (stream); + var message = MimeMessage.Load (stream); + ArcValidationErrors errors; ArcHeaderSet[] sets; Header broken, ams; int index, count; @@ -252,10 +256,11 @@ This is a test message. broken = new Header (HeaderId.ArcMessageSignature, "this should be unparsable..."); message.Headers[index] = broken; - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Broken AMS"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Broken AMS"); + Assert.AreEqual (ArcValidationErrors.InvalidArcMessageSignature, errors, "Errors"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Broken AMS should throwOnError"); } catch (FormatException) { } catch { @@ -265,10 +270,11 @@ This is a test message. // set an AMS that is missing the instance value broken.Value = ams.Value.Replace ("i=1; ", ""); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AMS missing i=1"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "AMS missing i=1"); + Assert.AreEqual (ArcValidationErrors.InvalidArcMessageSignature, errors, "Errors missing i=1"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("AMS missing i=1 should throwOnError"); } catch (FormatException) { } catch { @@ -278,10 +284,11 @@ This is a test message. // set an AMS that has an invalid instance value broken.Value = ams.Value.Replace ("i=1; ", "i=0; "); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AMS i=0"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "AMS i=0"); + Assert.AreEqual (ArcValidationErrors.InvalidArcMessageSignature, errors, "Errors i=0"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("AMS i=0 should throwOnError"); } catch (FormatException) { } catch { @@ -291,10 +298,11 @@ This is a test message. // remove the AMS completely message.Headers.RemoveAt (index); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing AMS"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Missing AMS"); + Assert.AreEqual (ArcValidationErrors.MissingArcMessageSignature, errors, "Errors removed AMS"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Missing AMS should throwOnError"); } catch (FormatException) { } catch { @@ -343,10 +351,10 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - MimeMessage message; using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { - message = MimeMessage.Load (stream); + var message = MimeMessage.Load (stream); + ArcValidationErrors errors; ArcHeaderSet[] sets; Header broken, seal; int index, count; @@ -359,10 +367,11 @@ This is a test message. broken = new Header (HeaderId.ArcSeal, "this should be unparsable..."); message.Headers[index] = broken; - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Broken AS"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Broken AS"); + Assert.AreEqual (ArcValidationErrors.InvalidArcSeal, errors, "Errors"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Broken AS should throwOnError"); } catch (FormatException) { } catch { @@ -372,10 +381,11 @@ This is a test message. // set an AS that is missing the instance value broken.Value = seal.Value.Replace ("i=1; ", ""); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AS missing i=1"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "AS missing i=1"); + Assert.AreEqual (ArcValidationErrors.InvalidArcSeal, errors, "Errors missing i=1"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("AS missing i=1 should throwOnError"); } catch (FormatException) { } catch { @@ -385,10 +395,11 @@ This is a test message. // set an AS that has an invalid instance value broken.Value = seal.Value.Replace ("i=1; ", "i=0; "); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "AS i=0"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "AS i=0"); + Assert.AreEqual (ArcValidationErrors.InvalidArcSeal, errors, "Errors i=0"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("AS i=0 should throwOnError"); } catch (FormatException) { } catch { @@ -398,10 +409,11 @@ This is a test message. // remove the AS completely message.Headers.RemoveAt (index); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing AS"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Missing AS"); + Assert.AreEqual (ArcValidationErrors.MissingArcSeal, errors, "Errors removed AS"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Missing AS should throwOnError"); } catch (FormatException) { } catch { @@ -467,10 +479,10 @@ by lists.example.org (8.14.5/8.14.5) with ESMTP id t0EKaNU9010123 This is a test message. --J. "; - MimeMessage message; using (var stream = new MemoryStream (Encoding.ASCII.GetBytes (input), false)) { - message = MimeMessage.Load (stream); + var message = MimeMessage.Load (stream); + ArcValidationErrors errors; ArcHeaderSet[] sets; int index, count; @@ -484,10 +496,11 @@ This is a test message. index = message.Headers.LastIndexOf (HeaderId.ArcAuthenticationResults); message.Headers.RemoveAt (index); - Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count), "Missing set"); + Assert.AreEqual (ArcSignatureValidationResult.Fail, ArcVerifier.GetArcHeaderSets (message, false, out sets, out count, out errors), "Missing set"); + Assert.AreEqual (ArcValidationErrors.MissingArcAuthenticationResults | ArcValidationErrors.MissingArcMessageSignature | ArcValidationErrors.MissingArcSeal, errors, "Errors"); try { - ArcVerifier.GetArcHeaderSets (message, true, out sets, out count); + ArcVerifier.GetArcHeaderSets (message, true, out sets, out count, out errors); Assert.Fail ("Missing set should throwOnError"); } catch (FormatException) { } catch { @@ -496,7 +509,7 @@ This is a test message. } } - static void Validate (string description, string input, DkimPublicKeyLocator locator, ArcSignatureValidationResult expected) + static void Validate (string description, string input, DkimPublicKeyLocator locator, ArcSignatureValidationResult expected, ArcValidationErrors expectedErrors = ArcValidationErrors.None) { if (string.IsNullOrEmpty (input)) { Assert.AreEqual (expected, ArcSignatureValidationResult.None, description); @@ -513,10 +526,12 @@ static void Validate (string description, string input, DkimPublicKeyLocator loc // Test Verify result = verifier.Verify (message); Assert.AreEqual (expected, result.Chain, description); + Assert.AreEqual (expectedErrors, result.ChainErrors, "chain errors"); // Test VerifyAsync result = verifier.VerifyAsync (message).GetAwaiter ().GetResult (); Assert.AreEqual (expected, result.Chain, description); + Assert.AreEqual (expectedErrors, result.ChainErrors, "async chain errors"); } } @@ -1271,7 +1286,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i no ams", input, locator, ArcSignatureValidationResult.Fail); + Validate ("failing message i=i no ams", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcMessageSignature); } [Test] @@ -1318,7 +1333,7 @@ This is an invalid test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i invalid ams", input, locator, ArcSignatureValidationResult.Fail); + Validate ("failing message i=i invalid ams", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -1360,7 +1375,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i no as", input, locator, ArcSignatureValidationResult.Fail); + Validate ("failing message i=i no as", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcSeal); } [Test] @@ -1407,7 +1422,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i as cv=Pass", input, locator, ArcSignatureValidationResult.Fail); + Validate ("failing message i=i as cv=Pass", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -1454,7 +1469,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i as cv=fail", input, locator, ArcSignatureValidationResult.Fail); + Validate ("failing message i=i as cv=fail", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -1501,7 +1516,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("failing message i=i invalid as b=", input, locator, ArcSignatureValidationResult.Fail); + Validate ("failing message i=i invalid as b=", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -1558,7 +1573,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 missing AMS(2)", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 missing AMS(2)", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcMessageSignature); } [Test] @@ -1622,7 +1637,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 AMS(2) invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 AMS(2) invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -1681,7 +1696,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 AS(1) NA", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 AS(1) NA", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcSeal); } [Test] @@ -1745,7 +1760,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 AS(2) invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 AS(2) invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -1809,7 +1824,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 cv2=none", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 cv2=none", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -1873,7 +1888,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 cv2=fail", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 cv2=fail", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -1932,7 +1947,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 as(1) not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcSeal); } [Test] @@ -1996,7 +2011,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 as(1) invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -2060,7 +2075,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) cv=pass", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 as(1) cv=pass", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -2124,7 +2139,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("i=2 base1 as(1) cv=fail", input, locator, ArcSignatureValidationResult.Fail); + Validate ("i=2 base1 as(1) cv=fail", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } #endregion @@ -2174,7 +2189,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= NA", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AMS i= NA", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } [Test] @@ -2221,7 +2236,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AMS i= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } [Test] @@ -2268,7 +2283,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= zero", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AMS i= zero", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } [Test] @@ -2315,7 +2330,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AMS i= invalid value", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AMS i= invalid value", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } [Test] @@ -2369,7 +2384,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Duplicate AMS i=1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("Duplicate AMS i=1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcMessageSignature); } [Test] @@ -2409,7 +2424,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Missing AMS i=1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("Missing AMS i=1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcMessageSignature); } #endregion @@ -2647,7 +2662,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams format invalid tag key", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams format invalid tag key", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } [Test] @@ -2694,7 +2709,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("tags are not de duplicated", input, locator, ArcSignatureValidationResult.Fail); + Validate ("tags are not de duplicated", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } [Test] @@ -2741,7 +2756,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("tag keys are case sensitive", input, locator, ArcSignatureValidationResult.Fail); + Validate ("tag keys are case sensitive", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -2788,7 +2803,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("tag values are case sensitive", input, locator, ArcSignatureValidationResult.Fail); + Validate ("tag values are case sensitive", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -2835,7 +2850,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams tag values whitespace sensitive", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams tag values whitespace sensitive", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -2882,7 +2897,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("additional semicolons are invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("additional semicolons are invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcMessageSignature); } #endregion @@ -2939,7 +2954,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("duplicate ams i=1 order 1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("duplicate ams i=1 order 1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcMessageSignature); } [Test] @@ -2993,7 +3008,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("duplicate ams i=1 order 2", input, locator, ArcSignatureValidationResult.Fail); + Validate ("duplicate ams i=1 order 2", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcMessageSignature); } [Test] @@ -3040,7 +3055,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= unknown algorithm", input, locator, ArcSignatureValidationResult.Fail); + Validate ("a= unknown algorithm", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); // FIXME: better error reporting? } [Test] @@ -3087,7 +3102,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= not avaliable", input, locator, ArcSignatureValidationResult.Fail); + Validate ("a= not avaliable", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); // FIXME: better error reporting? } [Test] @@ -3134,7 +3149,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("a= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); // FIXME: better error reporting? } [Test] @@ -3181,7 +3196,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("a= unknown algorithm", input, locator, ArcSignatureValidationResult.Fail); + Validate ("a= unknown algorithm", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); // FIXME: better error reporting? } [Test] @@ -3508,7 +3523,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams b= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -3552,7 +3567,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams b= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); // FIXME: better error reporting? } [Test] @@ -3597,7 +3612,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b=", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams b=", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); // FIXME: better error reporting? } [Test] @@ -3644,7 +3659,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= w/ modified value", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams b= w/ modified value", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -3691,7 +3706,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= w/ modified headers 1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams b= w/ modified headers 1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -3738,7 +3753,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams b= w/ modified headers 2", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams b= w/ modified headers 2", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -3926,7 +3941,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= simple canonicalization doesnt reduce wsp", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams bh= simple canonicalization doesnt reduce wsp", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -4161,7 +4176,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams bh= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -4208,7 +4223,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams bh= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -4255,7 +4270,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= not base64", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams bh= not base64", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -4302,7 +4317,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= modified sig", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams bh= modified sig", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -4349,7 +4364,7 @@ This is a modified test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams bh= modified body", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams bh= modified body", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -4445,7 +4460,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams c= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -4662,7 +4677,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams c= invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams c= invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -4709,7 +4724,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams d= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams d= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -4756,7 +4771,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams d= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams d= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -4803,7 +4818,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams d= not valid domain name", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams d= not valid domain name", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -5288,7 +5303,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams h= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -5336,7 +5351,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= with duplicated header not correct order(bottom up)", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams h= with duplicated header not correct order(bottom up)", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -5383,7 +5398,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= mis ordered", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams h= mis ordered", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -5430,7 +5445,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams h= signing non-existant header field is then added(MIME-Version)", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams h= signing non-existant header field is then added(MIME-Version)", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -5542,7 +5557,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams s= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams s= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -5589,7 +5604,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams s= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams s= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed); } [Test] @@ -5683,7 +5698,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams t= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams t= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -5730,7 +5745,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("ams t= invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("ams t= invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } #endregion @@ -5780,7 +5795,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= NA", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AS i= NA", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -5827,7 +5842,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AS i= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -5874,7 +5889,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= 0", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AS i= 0", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -5921,7 +5936,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AS i= invalid value", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AS i= invalid value", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -5973,7 +5988,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Duplicate AS for i=1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("Duplicate AS for i=1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcSeal); } [Test] @@ -6015,7 +6030,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Missing AS for i=1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("Missing AS for i=1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcSeal); } #endregion @@ -6323,7 +6338,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as format invalid tag key", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as format invalid tag key", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -6384,7 +6399,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as dup tag error", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as dup tag error", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -6445,7 +6460,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as tag key case", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as tag key case", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -6506,7 +6521,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as tag value case", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as tag value case", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -6567,7 +6582,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as whitespace sensitive", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as whitespace sensitive", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -6628,7 +6643,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("as random semi colon error", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as random semi colon error", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } #endregion @@ -6701,7 +6716,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("duplicate as", input, locator, ArcSignatureValidationResult.Fail); + Validate ("duplicate as", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcSeal); } [Test] @@ -6774,7 +6789,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("duplicate AS i=2", input, locator, ArcSignatureValidationResult.Fail); + Validate ("duplicate AS i=2", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcSeal); } [Test] @@ -6839,7 +6854,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as fields i= missing", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as fields i= missing", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSeal); } [Test] @@ -6904,7 +6919,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= is sha1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as a= is sha1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -6969,7 +6984,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= not avaliable", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as a= not avaliable", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -7034,7 +7049,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= is empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as a= is empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -7099,7 +7114,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as a= unknown", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as a= unknown", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -7754,7 +7769,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= with 512 bit key", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= with 512 bit key", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -7951,7 +7966,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8014,7 +8029,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8077,7 +8092,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= not base64", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= not base64", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8142,7 +8157,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= with modified signature", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= with modified signature", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8207,7 +8222,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= modified aar1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= modified aar1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -8272,7 +8287,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= modified ams1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= modified ams1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8337,7 +8352,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as b= modified asb1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as b= modified asb1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8402,7 +8417,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as cv= not avaliable", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as cv= not avaliable", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcSealChainValidationValue); } [Test] @@ -8467,7 +8482,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as cv= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as cv= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -8532,7 +8547,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as cv= invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as cv= invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcSealChainValidationValue); } [Test] @@ -8597,7 +8612,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as d= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as d= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8662,7 +8677,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as d= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as d= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8727,7 +8742,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as d= invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as d= invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8769,7 +8784,7 @@ This is a test message. locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as has h= which is invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as has h= which is invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } [Test] @@ -8834,7 +8849,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as s= not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as s= not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -8899,7 +8914,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as s= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as s= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -9028,7 +9043,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as t= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as t= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -9093,7 +9108,7 @@ This is a test message locator.Add ("1024._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyBwu6PiaDN87t3DVZ84zIrE hCoxtFuv7g52oCwAUXTDnXZ+0XHM/rhkm8XSGr1yLsDc1zLGX8IfITY1dL2CzptdgyiX7vgYjzZqG368 C8BtGB5m6nj26NyhSKEdlV7MS9KbASd359ggCeGTT5QjRKEMSauVyVSeapq6ZcpZ9JwQIDAQAB"); locator.Add ("2048._domainkey.example.org", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv+7VkwpTtICeJFM4Hf UZsvv2OaA+QMrW9Af1PpTOzVP0uvUFK20lcaxMvt81ia/sGYW4gHp/WUIk0BIQMPVhUeCIuM1mcOQNFS OflR8pLo916rjEZXpRP/XGo4HwWzdqD2qQeb3+fv1IrzfHiDb9THbamoz05EX7JX+wVSAhdSW/igwhA/ +beuzWR0RDDyGMT1b1Sb/lrGfwSXm7QoZQtj5PRiTX+fsL7WlzL+fBThySwS8ZBZcHcd8iWOSGKZ0gYK zxyuOf8VCX71C4xDhahN+HXWZFn9TZb+uZX9m+WXM3t+P8CdfxsaOdnVg6imgNDlUWX4ClLTZhco0Kmi BU+QIDAQAB"); - Validate ("as t= invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("as t= invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MessageSignatureValidationFailed | ArcValidationErrors.SealValidationFailed); } #endregion @@ -9143,7 +9158,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i= NA", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AAR i= NA", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9190,7 +9205,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i= empty", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AAR i= empty", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9237,7 +9252,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i=0", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AAR i=0", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9284,7 +9299,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("AAR i= invalid value", input, locator, ArcSignatureValidationResult.Fail); + Validate ("AAR i= invalid value", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9335,7 +9350,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Duplicated AAR for i=1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("Duplicated AAR for i=1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.DuplicateArcAuthenticationResults); } [Test] @@ -9378,7 +9393,7 @@ This is a test message. locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("Missing AAR for i=1", input, locator, ArcSignatureValidationResult.Fail); + Validate ("Missing AAR for i=1", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcAuthenticationResults); } #endregion @@ -9438,7 +9453,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("missing arc authentication results", input, locator, ArcSignatureValidationResult.Fail); + Validate ("missing arc authentication results", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcAuthenticationResults); } [Test] @@ -9499,7 +9514,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results no i= tag", input, locator, ArcSignatureValidationResult.Fail); + Validate ("arc authentication results no i= tag", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9560,7 +9575,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results wrong i= tag", input, locator, ArcSignatureValidationResult.Fail); + Validate ("arc authentication results wrong i= tag", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcAuthenticationResults | ArcValidationErrors.MissingArcMessageSignature | ArcValidationErrors.MissingArcSeal); } [Test] @@ -9621,7 +9636,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results i= not prefixed", input, locator, ArcSignatureValidationResult.Fail); + Validate ("arc authentication results i= not prefixed", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9682,7 +9697,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("arc authentication results i= no semicolon", input, locator, ArcSignatureValidationResult.Fail); + Validate ("arc authentication results i= no semicolon", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.InvalidArcAuthenticationResults); } [Test] @@ -9757,7 +9772,7 @@ This is a test message locator.Add ("dummy._domainkey.example.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkHlOQoBTzWRiGs5V6NpP3id Y6Wk08a5qhdR6wy5bdOKb2jLQiY/J16JYi0Qvx/byYzCNb3W91y3FutACDfzwQ/BC/e/8uBsCR+yz1Lx j+PL6lHvqMKrM3rG4hstT5QjvHO9PzoxZyVYLzBfO2EeC3Ip3G+2kryOTIKT+l/K4w3QIDAQAB"); - Validate ("aar missing for i=2", input, locator, ArcSignatureValidationResult.Fail); + Validate ("aar missing for i=2", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.MissingArcAuthenticationResults); } #endregion @@ -9809,7 +9824,7 @@ This is a test message. locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); - Validate ("public key not available", input, locator, ArcSignatureValidationResult.Fail); + Validate ("public key not available", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] @@ -9858,7 +9873,7 @@ This is a test message. locator.Add ("dummy2._domainkey.example2.org", "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR3lRpGZS+xO96Znv/BPNQxi m7ZD0v6yFmZa9Rni5FHCeWuQwcp+PH/XXOyF6JsmB+kS0ybxJnx594ulqH2KvLMNsGAD+yRl2bJSXbBH ea7K9C5WX8Vjx3oPoGgw7QCONptnjUsbIIoxUZBEUe17eG44H/PbDqGwCBiyI20KEC/wIDAQAB"); locator.Add ("invalid._domainkey.example.org", "v=DKIM1; k=rsa; omgwhatsgoingon"); - Validate ("public key invalid", input, locator, ArcSignatureValidationResult.Fail); + Validate ("public key invalid", input, locator, ArcSignatureValidationResult.Fail, ArcValidationErrors.SealValidationFailed); } [Test] From 58506454b4fe6a8fb2400bd5287edcc14946e20a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 30 Jul 2020 11:02:36 -0400 Subject: [PATCH 678/741] Added work-around for mailers that don't use a ';' between Content-Type/Content-Disposition parameters Fixes issue #595 --- MimeKit/ParameterList.cs | 13 ++++++++----- UnitTests/ContentTypeTests.cs | 13 ++++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 97799c0bce..3178b458bb 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -973,13 +973,16 @@ internal static bool TryParse (ParserOptions options, byte[] text, ref int index break; if (text[index] != (byte) ';') { - if (throwOnError) - throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid parameter list token at offset {0}", index), index, index); + if (options.ParameterComplianceMode == RfcComplianceMode.Strict) { + if (throwOnError) + throw new ParseException (string.Format (CultureInfo.InvariantCulture, "Invalid parameter list token at offset {0}", index), index, index); - return false; + return false; + } + } else { + // Skip over ';' + index++; } - - index++; } while (true); paramList = new ParameterList (); diff --git a/UnitTests/ContentTypeTests.cs b/UnitTests/ContentTypeTests.cs index 1d5995832d..ed7654e471 100644 --- a/UnitTests/ContentTypeTests.cs +++ b/UnitTests/ContentTypeTests.cs @@ -252,6 +252,17 @@ public void TestContentTypeWithEmptyParameter () AssertParse (text, expected); } + // Tests the work-around for issue #595 + [Test] + public void TestContentTypeWithoutSemicolonBetweenParameters () + { + const string text = "application/x-pkcs7-mime;\n name=\"smime.p7m\"\n smime-type=enveloped-data"; + var expected = new ContentType ("application", "x-pkcs7-mime") { Name = "smime.p7m" }; + expected.Parameters.Add ("smime-type", "enveloped-data"); + + AssertParse (text, expected, true); + } + [Test] public void TestContentTypeAndContentTrafserEncodingOnOneLine () { @@ -260,7 +271,7 @@ public void TestContentTypeAndContentTrafserEncodingOnOneLine () // TryParse should "fail", but still produce a usable ContentType. // Parse will throw ParseException. - AssertParse (text, expected, false, 35, 35); + AssertParse (text, expected, false, 35, 60); } [Test] From f54a1c65760d63c1b222f5af7b64dfe1a45459c6 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 26 Aug 2020 08:54:53 -0400 Subject: [PATCH 679/741] Don't ever encode non-text content using quoted-printable. Fixes issue #598 --- MimeKit/AttachmentCollection.cs | 28 ++++++++++++++++++---------- MimeKit/MimePart.cs | 22 +++++++++++++--------- MimeKit/Tnef/TnefPart.cs | 17 ++++++++++++----- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index d6cea7f6cf..86d71cf7ac 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -131,20 +131,28 @@ public MimeEntity this [int index] { static void LoadContent (MimePart attachment, Stream stream) { var content = new MemoryBlockStream (); - var filter = new BestEncodingFilter (); - var buf = new byte[4096]; - int index, length; - int nread; - - while ((nread = stream.Read (buf, 0, buf.Length)) > 0) { - filter.Filter (buf, 0, nread, out index, out length); - content.Write (buf, 0, nread); + + if (attachment.ContentType.IsMimeType ("text", "*")) { + var filter = new BestEncodingFilter (); + var buf = new byte[4096]; + int index, length; + int nread; + + while ((nread = stream.Read (buf, 0, buf.Length)) > 0) { + filter.Filter (buf, 0, nread, out index, out length); + content.Write (buf, 0, nread); + } + + filter.Flush (buf, 0, 0, out index, out length); + + attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); + } else { + attachment.ContentTransferEncoding = ContentEncoding.Base64; + stream.CopyTo (content, 4096); } - filter.Flush (buf, 0, 0, out index, out length); content.Position = 0; - attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); attachment.Content = new MimeContent (content); } diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 39838b2fdc..6f3b0b712a 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -416,20 +416,24 @@ public override void Accept (MimeVisitor visitor) /// public ContentEncoding GetBestEncoding (EncodingConstraint constraint, int maxLineLength, CancellationToken cancellationToken = default (CancellationToken)) { - if (Content == null) - return ContentEncoding.SevenBit; + if (ContentType.IsMimeType ("text", "*")) { + if (Content == null) + return ContentEncoding.SevenBit; - using (var measure = new MeasuringStream ()) { - using (var filtered = new FilteredStream (measure)) { - var filter = new BestEncodingFilter (); + using (var measure = new MeasuringStream ()) { + using (var filtered = new FilteredStream (measure)) { + var filter = new BestEncodingFilter (); - filtered.Add (filter); - Content.DecodeTo (filtered, cancellationToken); - filtered.Flush (); + filtered.Add (filter); + Content.DecodeTo (filtered, cancellationToken); + filtered.Flush (); - return filter.GetBestEncoding (constraint, maxLineLength); + return filter.GetBestEncoding (constraint, maxLineLength); + } } } + + return constraint == EncodingConstraint.None ? ContentEncoding.Binary : ContentEncoding.Base64; } /// diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index ad6453651e..3f9e344681 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -506,10 +506,12 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) attachment = PromoteToTnefPart (attachment); count -= 16; index = 16; - } else { + } else if (attachment.ContentType.IsMimeType ("text", "*")) { filter.Flush (attachData, index, count, out outIndex, out outLength); attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); filter.Reset (); + } else { + attachment.ContentTransferEncoding = ContentEncoding.Base64; } attachment.Content = new MimeContent (new MemoryStream (attachData, index, count, false)); @@ -547,11 +549,16 @@ static void ExtractAttachments (TnefReader reader, BodyBuilder builder) break; attachData = prop.ReadValueAsBytes (); - filter.Flush (attachData, 0, attachData.Length, out outIndex, out outLength); - attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); - attachment.Content = new MimeContent (new MemoryStream (attachData, false)); - filter.Reset (); + if (attachment.ContentType.IsMimeType ("text", "*")) { + filter.Flush (attachData, 0, attachData.Length, out outIndex, out outLength); + attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); + filter.Reset (); + } else { + attachment.ContentTransferEncoding = ContentEncoding.Base64; + } + + attachment.Content = new MimeContent (new MemoryStream (attachData, false)); builder.Attachments.Add (attachment); break; } From dff2dfc07e8133116bbed436a9d4dac941923e76 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 10 Sep 2020 14:44:25 +0200 Subject: [PATCH 680/741] Include WindowsSecureMimeContext in .NET Standard 2.x build (#600) Use System.Security.Cryptography.Pkcs in .netstandard2 build --- MimeKit/MimeKit.csproj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 9b5d70f5c3..431a40a553 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -56,6 +56,7 @@ + @@ -133,9 +134,9 @@ - - - + + + From 241f0cb96693251a404d7b27fe533617d6d4662e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 10 Sep 2020 08:49:52 -0400 Subject: [PATCH 681/741] Added System.Security.Cryptography.Pkcs dependency to nuspec --- nuget/MimeKit.nuspec | 1 + 1 file changed, 1 insertion(+) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index c36ea0413a..b6d6afce81 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -97,6 +97,7 @@ + From af6237e802d2d56702b5dc03b62e7fe37c83144e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 12 Sep 2020 10:41:43 -0400 Subject: [PATCH 682/741] Bumped version to 2.9.2 --- MimeKit/MimeKit.csproj | 2 +- MimeKit/MimeKitLite.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 21 ++++++++++++++++++++- appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 18 ++++++++---------- nuget/MimeKitLite.nuspec | 12 ++++++------ 8 files changed, 40 insertions(+), 23 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 431a40a553..7791c80b78 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.9.1 + 2.9.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index a7df51bf88..8322b87730 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.9.1 + 2.9.2 Jeffrey Stedfast netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 89198893f8..5cf2d47d0a 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.9.1.0")] -[assembly: AssemblyFileVersion ("2.9.1.0")] +[assembly: AssemblyInformationalVersion ("2.9.2.0")] +[assembly: AssemblyFileVersion ("2.9.2.0")] [assembly: AssemblyVersion ("2.9.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index ae807cbbe7..5632330759 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,6 +1,25 @@ # Release Notes -### MimeKit 2.9.0 (2020-07-11) +### MimeKit 2.9.2 (2020-09-12) + +* Include WindowsSecureMimeContext in the .NET Standard 2.x build. + (issue [#600](https://github.com/jstedfast/MimeKit/issues/600)) +* Fixed message.Prepare() to never choose the quoted-printable encoding + for non-text based MimeParts. + (issue [#598](https://github.com/jstedfast/MimeKit/issues/598)) +* Added work-around for mailers that don't use a ';' between Content-Type + and Content-Disposition parameters. + (issue [#595](https://github.com/jstedfast/MimeKit/issues/595)) +* Added improved error reporting for ArcVerifier. + (issue [#591](https://github.com/jstedfast/MimeKit/issues/591)) +* Added another work-around for parsing Authentication-Results headers. + (issue [#590](https://github.com/jstedfast/MimeKit/issues/590)) +* MimeMessage.ToString() now adds an X-MimeKit-Warning header to the + beginning of the output string to make it clear to developers doing this + that they are Doing it Wrong(tm). +* Added a TLS-Required HeaderId enum value. + +### MimeKit 2.9.1 (2020-07-11) * Refactored OpenPgpContext to separate out key storage implementation. (issue [#576](https://github.com/jstedfast/MimeKit/issues/576)) diff --git a/appveyor.yml b/appveyor.yml index 410a03e20b..e31e49bba4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.9.1.{build} +version: 2.9.2.{build} os: Visual Studio 2017 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 318bf6ca0d..32b3c3429f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'VS2017-Win2016' -name: 2.9.1$(Rev:.r) +name: 2.9.2$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index b6d6afce81..8cd1544db1 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.9.1 + 2.9.2 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,15 +26,13 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. - * Refactored OpenPgpContext to separate out key storage implementation. (issue #576) - * Fixed the TextToFlowed converter. (issue #580) - * Protect against ABRs in AuthenticationResults.TryParse(). (issue #581) - * The net45 version of MimeKit now depends on Portable.BouncyCastle instead of official BouncyCastle. - * Added MimeParser events to report stream offsets for MimeMessages and MimeEntities. (issue #582) - * Fixed DkimPublicKeyLocatorBase to treat unspecified 'k' values in DKIM DNS records as "k=rsa". (issue #583) - * Fixed date format serializer to use CultureInfo.InvariantCulture. - * Fixed AuthenticationResults parser to allow '_' characters in method results. (issue #584) - * Improved RSACng and DSACng support. +* Include WindowsSecureMimeContext in the .NET Standard 2.x build. (issue #600) +* Fixed message.Prepare() to never choose the quoted-printable encoding for non-text based MimeParts. (issue #598) +* Added work-around for mailers that don't use a ';' between Content-Type and Content-Disposition parameters. (issue #595) +* Added improved error reporting for ArcVerifier. (issue #591) +* Added another work-around for parsing Authentication-Results headers. (issue #590) +* MimeMessage.ToString() now adds an X-MimeKit-Warning header to the beginning of the output string to make it clear to developers doing this that they are Doing it Wrong(tm). +* Added a TLS-Required HeaderId enum value. .NET Foundation and Contributors en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 160b9919d3..ac4dfd4587 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.9.1 + 2.9.2 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,11 +26,11 @@ An Open Source library for creating and parsing MIME messages. - * Fixed the TextToFlowed converter. (issue #580) - * Protect against ABRs in AuthenticationResults.TryParse(). (issue #581) - * Added MimeParser events to report stream offsets for MimeMessages and MimeEntities. (issue #582) - * Fixed date format serializer to use CultureInfo.InvariantCulture. - * Fixed AuthenticationResults parser to allow '_' characters in method results. (issue #584) +* Fixed message.Prepare() to never choose the quoted-printable encoding for non-text based MimeParts. (issue #598) +* Added work-around for mailers that don't use a ';' between Content-Type and Content-Disposition parameters. (issue #595) +* Added another work-around for parsing Authentication-Results headers. (issue #590) +* MimeMessage.ToString() now adds an X-MimeKit-Warning header to the beginning of the output string to make it clear to developers doing this that they are Doing it Wrong(tm). +* Added a TLS-Required HeaderId enum value. .NET Foundation and Contributors en-US From d4ae33ed506a64019958567af366d19d84728590 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 15 Sep 2020 09:57:58 -0400 Subject: [PATCH 683/741] Refactored ArcVerifier and DkimVerifier to share more code Pushed logic to verify the body hash and signature into DkimVerifierBase and made them protected methods to allow access to subclasses. Fixes issue #601 --- MimeKit/Cryptography/ArcVerifier.cs | 41 +++------------ MimeKit/Cryptography/DkimVerifier.cs | 43 +++------------- MimeKit/Cryptography/DkimVerifierBase.cs | 64 ++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 68 deletions(-) diff --git a/MimeKit/Cryptography/ArcVerifier.cs b/MimeKit/Cryptography/ArcVerifier.cs index a2e339ed71..726814916a 100644 --- a/MimeKit/Cryptography/ArcVerifier.cs +++ b/MimeKit/Cryptography/ArcVerifier.cs @@ -396,47 +396,22 @@ async Task VerifyArcMessageSignatureAsync (FormatOptions options, MimeMess if (!IsEnabled (signatureAlgorithm)) return false; - if (doAsync) - key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); - else - key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - - if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) - return false; - options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; // first check the body hash (if that's invalid, then the entire signature is invalid) - var hash = Convert.ToBase64String (message.HashBody (options, signatureAlgorithm, bodyAlgorithm, maxLength)); - - if (hash != bh) + if (!VerifyBodyHash (options, message, signatureAlgorithm, bodyAlgorithm, maxLength, bh)) return false; - using (var stream = new DkimSignatureStream (CreateVerifyContext (signatureAlgorithm, key))) { - using (var filtered = new FilteredStream (stream)) { - filtered.Add (options.CreateNewLineFilter ()); - - WriteHeaders (options, message, headers, headerAlgorithm, filtered); - - // now include the ARC-Message-Signature header that we are verifying, - // but only after removing the "b=" signature value. - var header = GetSignedSignatureHeader (arcSignature); - - switch (headerAlgorithm) { - case DkimCanonicalizationAlgorithm.Relaxed: - WriteHeaderRelaxed (options, filtered, header, true); - break; - default: - WriteHeaderSimple (options, filtered, header, true); - break; - } + if (doAsync) + key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + else + key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - filtered.Flush (); - } + if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) + return false; - return stream.VerifySignature (b); - } + return VerifySignature (options, message, arcSignature, signatureAlgorithm, key, headers, headerAlgorithm, b); } async Task VerifyArcSealAsync (FormatOptions options, ArcHeaderSet[] sets, int i, bool doAsync, CancellationToken cancellationToken) diff --git a/MimeKit/Cryptography/DkimVerifier.cs b/MimeKit/Cryptography/DkimVerifier.cs index f45745ed73..e836101efc 100644 --- a/MimeKit/Cryptography/DkimVerifier.cs +++ b/MimeKit/Cryptography/DkimVerifier.cs @@ -32,8 +32,6 @@ using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; -using MimeKit.IO; - namespace MimeKit.Cryptography { /// /// A DKIM-Signature verifier. @@ -128,47 +126,22 @@ async Task VerifyAsync (FormatOptions options, MimeMessage message, Header if (!IsEnabled (signatureAlgorithm)) return false; - if (doAsync) - key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); - else - key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - - if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) - return false; - options = options.Clone (); options.NewLineFormat = NewLineFormat.Dos; // first check the body hash (if that's invalid, then the entire signature is invalid) - var hash = Convert.ToBase64String (message.HashBody (options, signatureAlgorithm, bodyAlgorithm, maxLength)); - - if (hash != bh) + if (!VerifyBodyHash (options, message, signatureAlgorithm, bodyAlgorithm, maxLength, bh)) return false; - using (var stream = new DkimSignatureStream (CreateVerifyContext (signatureAlgorithm, key))) { - using (var filtered = new FilteredStream (stream)) { - filtered.Add (options.CreateNewLineFilter ()); - - WriteHeaders (options, message, headers, headerAlgorithm, filtered); - - // now include the DKIM-Signature header that we are verifying, - // but only after removing the "b=" signature value. - var header = GetSignedSignatureHeader (dkimSignature); - - switch (headerAlgorithm) { - case DkimCanonicalizationAlgorithm.Relaxed: - WriteHeaderRelaxed (options, filtered, header, true); - break; - default: - WriteHeaderSimple (options, filtered, header, true); - break; - } + if (doAsync) + key = await PublicKeyLocator.LocatePublicKeyAsync (q, d, s, cancellationToken).ConfigureAwait (false); + else + key = PublicKeyLocator.LocatePublicKey (q, d, s, cancellationToken); - filtered.Flush (); - } + if ((key is RsaKeyParameters rsa) && rsa.Modulus.BitLength < MinimumRsaKeyLength) + return false; - return stream.VerifySignature (b); - } + return VerifySignature (options, message, dkimSignature, signatureAlgorithm, key, headers, headerAlgorithm, b); } /// diff --git a/MimeKit/Cryptography/DkimVerifierBase.cs b/MimeKit/Cryptography/DkimVerifierBase.cs index 2528b610a6..fdaca3fa70 100644 --- a/MimeKit/Cryptography/DkimVerifierBase.cs +++ b/MimeKit/Cryptography/DkimVerifierBase.cs @@ -34,6 +34,7 @@ using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Signers; +using MimeKit.IO; using MimeKit.Utils; namespace MimeKit.Cryptography { @@ -491,5 +492,68 @@ internal static Header GetSignedSignatureHeader (Header header) return new Header (header.Options, header.RawField, rawValue, false); } + + /// + /// Verify the hash of the message body. + /// + /// + /// Verifies the hash of the message body. + /// + /// The formatting options. + /// The signed MIME message. + /// The algorithm used to sign the message. + /// The algorithm used to canonicalize the message body. + /// The max length of the message body to hash or -1 to hash the entire message body. + /// The expected message body hash encoded in base64. + /// true if the calculated body hash matches ; otherwise, false. + protected bool VerifyBodyHash (FormatOptions options, MimeMessage message, DkimSignatureAlgorithm signatureAlgorithm, DkimCanonicalizationAlgorithm canonicalizationAlgorithm, int maxLength, string bodyHash) + { + var hash = Convert.ToBase64String (message.HashBody (options, signatureAlgorithm, canonicalizationAlgorithm, maxLength)); + + return hash == bodyHash; + } + + /// + /// Verify the signature of the message headers. + /// + /// + /// Verifies the signature of the message headers. + /// + /// The formatting options. + /// The signed MIME message. + /// The DKIM-Signature or ARC-Message-Signature header. + /// The algorithm used to sign the message headers. + /// The public key used to verify the signature. + /// The list of headers that were signed. + /// The algorithm used to canonicalize the headers. + /// The expected signature of the headers encoded in base64. + /// true if the calculated signature matches ; otherwise, false. + protected bool VerifySignature (FormatOptions options, MimeMessage message, Header dkimSignature, DkimSignatureAlgorithm signatureAlgorithm, AsymmetricKeyParameter key, string[] headers, DkimCanonicalizationAlgorithm canonicalizationAlgorithm, string signature) + { + using (var stream = new DkimSignatureStream (CreateVerifyContext (signatureAlgorithm, key))) { + using (var filtered = new FilteredStream (stream)) { + filtered.Add (options.CreateNewLineFilter ()); + + WriteHeaders (options, message, headers, canonicalizationAlgorithm, filtered); + + // now include the DKIM-Signature header that we are verifying, + // but only after removing the "b=" signature value. + var header = GetSignedSignatureHeader (dkimSignature); + + switch (canonicalizationAlgorithm) { + case DkimCanonicalizationAlgorithm.Relaxed: + WriteHeaderRelaxed (options, filtered, header, true); + break; + default: + WriteHeaderSimple (options, filtered, header, true); + break; + } + + filtered.Flush (); + } + + return stream.VerifySignature (signature); + } + } } } From 94afd8f4575ed1d40f83cd5aaba42358ce3a3814 Mon Sep 17 00:00:00 2001 From: Claire Novotny Date: Wed, 7 Oct 2020 10:07:23 -0400 Subject: [PATCH 684/741] Update to latest BouncyCastle and remove unsupported platforms (NS 1.x) (#610) --- MimeKit/MimeKitLite.csproj | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index 8322b87730..c55bdd8dcc 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -1,16 +1,16 @@ - + An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite 2.9.2 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 + netstandard2.0;net45;net46;net47;net48 true false MimeKitLite MimeKitLite - mime;mbox;mail;email;parser;tnef;net45;netstandard;netstandard1.3;netstandard1.6;netstandard2.0 + mime;mbox;mail;email;parser;tnef;net45;netstandard;netstandard2.0 https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false @@ -43,18 +43,11 @@ $(DefineConstants);ENABLE_SNM;SERIALIZABLE - - - - - - - - + - + From 9163ddfde14a0837ad1c6207182beedcb867f8c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 7 Oct 2020 10:10:14 -0400 Subject: [PATCH 685/741] Bump BouncyCastle to v1.8.8 and drop support for netstandard1.x --- nuget/MimeKit.nuspec | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 8cd1544db1..370a2706bf 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -36,7 +36,7 @@ .NET Foundation and Contributors en-US - mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 + mime encryption arc dkim security smime s/mime openpgp pgp mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard2.0 @@ -69,46 +69,26 @@ - + - + - + - - - - - - - - - - - - - - - + - + - - - - - - From b5a0516754314430b0129747bb145e25ae7ba973 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 16 Oct 2020 18:14:59 -0400 Subject: [PATCH 686/741] Fixed MimeUtils.GenerateMessageId() to cache the local hostname Instead of looking up the local hostname each time the method is called, cache it in the first call and then just reuse the same string for each call after that. Fixes issue #612 --- MimeKit/Utils/MimeUtils.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index 7afea00491..d35dadd45b 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -40,6 +40,9 @@ namespace MimeKit.Utils { public static class MimeUtils { const string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +#if !NETSTANDARD1_3 && !NETSTANDARD1_6 + static string DefaultHostName = null; +#endif /// /// A string comparer that performs a case-insensitive ordinal string comparison. @@ -116,9 +119,13 @@ public static string GenerateMessageId () #if NETSTANDARD1_3 || NETSTANDARD1_6 return GenerateMessageId ("localhost.localdomain"); #else - var properties = IPGlobalProperties.GetIPGlobalProperties (); + if (DefaultHostName == null) { + var properties = IPGlobalProperties.GetIPGlobalProperties (); + + DefaultHostName = properties.HostName; + } - return GenerateMessageId (properties.HostName); + return GenerateMessageId (DefaultHostName); #endif } From f56de72c390498fe375914f8781d7a7d55551253 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 17 Oct 2020 11:01:14 -0400 Subject: [PATCH 687/741] Don't explicitly set the text/html part's Content-Id header in BodyBuilder.ToMessageBody() MultipartRelated.set_Root does this for us already. --- MimeKit/BodyBuilder.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/MimeKit/BodyBuilder.cs b/MimeKit/BodyBuilder.cs index 8aae0ef04e..bcf6730fdf 100644 --- a/MimeKit/BodyBuilder.cs +++ b/MimeKit/BodyBuilder.cs @@ -143,7 +143,6 @@ public MimeEntity ToMessageBody () var text = new TextPart ("html"); MimeEntity html; - text.ContentId = MimeUtils.GenerateMessageId (); text.Text = HtmlBody; if (LinkedResources.Count > 0) { From 13f231e673ab10333a81bfc4d44e9dce09fc6e3c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 19 Oct 2020 08:52:16 -0400 Subject: [PATCH 688/741] Only generate a ContentId for the MultipartRelated Root if it is not the first part --- MimeKit/MultipartRelated.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/MimeKit/MultipartRelated.cs b/MimeKit/MultipartRelated.cs index 7522c166ef..cefed06494 100644 --- a/MimeKit/MultipartRelated.cs +++ b/MimeKit/MultipartRelated.cs @@ -159,17 +159,18 @@ public MimeEntity Root { index = 0; } - if (string.IsNullOrEmpty (value.ContentId)) - value.ContentId = MimeUtils.GenerateMessageId (); - ContentType.Parameters["type"] = value.ContentType.MediaType + "/" + value.ContentType.MediaSubtype; // Note: we only use a "start" parameter if the index of the root entity is not at index 0 in order // to work around the following Thunderbird bug: https://bugzilla.mozilla.org/show_bug.cgi?id=471402 - if (index > 0) + if (index > 0) { + if (string.IsNullOrEmpty (value.ContentId)) + value.ContentId = MimeUtils.GenerateMessageId (); + ContentType.Parameters["start"] = "<" + value.ContentId + ">"; - else + } else { ContentType.Parameters.Remove ("start"); + } } } From dd9503623aba8c5da36956641dcfc43c066aeed1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 23 Oct 2020 12:23:55 -0400 Subject: [PATCH 689/741] Use a custom version of Path.GetFileName() to allow illegal path characters Fixes issue #615 --- MimeKit/AttachmentCollection.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 86d71cf7ac..8e9efa258e 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -163,8 +163,16 @@ static ContentType GetMimeType (string fileName) return ContentType.Parse (mimeType); } - MimeEntity CreateAttachment (ContentType contentType, string fileName, Stream stream) + static string GetFileName (string path) { + int index = path.LastIndexOf (Path.DirectorySeparatorChar); + + return index > 0 ? path.Substring (index + 1) : path; + } + + MimeEntity CreateAttachment (ContentType contentType, string path, Stream stream) + { + var fileName = GetFileName (path); MimeEntity attachment; if (contentType.IsMimeType ("message", "rfc822")) { @@ -172,8 +180,8 @@ MimeEntity CreateAttachment (ContentType contentType, string fileName, Stream st var rfc822 = new MessagePart { Message = message }; rfc822.ContentDisposition = new ContentDisposition (linked ? ContentDisposition.Inline : ContentDisposition.Attachment); - rfc822.ContentDisposition.FileName = Path.GetFileName (fileName); - rfc822.ContentType.Name = Path.GetFileName (fileName); + rfc822.ContentDisposition.FileName = fileName; + rfc822.ContentType.Name = fileName; attachment = rfc822; } else { @@ -186,15 +194,15 @@ MimeEntity CreateAttachment (ContentType contentType, string fileName, Stream st part = new MimePart (contentType); } - part.FileName = Path.GetFileName (fileName); part.IsAttachment = !linked; + part.FileName = fileName; LoadContent (part, stream); attachment = part; } if (linked) - attachment.ContentLocation = new Uri (Path.GetFileName (fileName), UriKind.Relative); + attachment.ContentLocation = new Uri (fileName, UriKind.Relative); return attachment; } From c177d2d150b7074204ed1c219081e1bd21973ac5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 3 Nov 2020 11:58:30 -0500 Subject: [PATCH 690/741] Fixed MultipartRelated unit tests --- UnitTests/MultipartRelatedTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/MultipartRelatedTests.cs b/UnitTests/MultipartRelatedTests.cs index 53c590c120..2c176e17a1 100644 --- a/UnitTests/MultipartRelatedTests.cs +++ b/UnitTests/MultipartRelatedTests.cs @@ -144,7 +144,7 @@ public void TestReferenceByContentId () // Note: MimeKit no longer sets the "start" parameter if the root is the first MIME part due to a bug in Thunderbird. Assert.IsNull (related.ContentType.Parameters["start"], "The start parameter should be null."); - for (int i = 0; i < related.Count; i++) { + for (int i = 1; i < related.Count; i++) { var cid = new Uri (string.Format ("cid:{0}", related[i].ContentId)); string mimeType, charset; From fd604e74f74e7299cf57355edac08cf4d420b6f6 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 4 Nov 2020 15:29:16 +0000 Subject: [PATCH 691/741] Don't allocate when adding attachments. (#616) * Don't allocate when adding attachements. * Update MimeKit/AttachmentCollection.cs Co-authored-by: Anton Firszov * Use try.. finally.. * Update AttachmentCollection.cs minor stylistic changes * Update AttachmentCollection.cs Co-authored-by: Anton Firszov Co-authored-by: Jeffrey Stedfast --- MimeKit/AttachmentCollection.cs | 19 +++++++++++++------ MimeKit/MimeKit.csproj | 4 ++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 8e9efa258e..7b22fee7b6 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Buffers; using System.Collections; using System.Collections.Generic; @@ -44,6 +45,8 @@ namespace MimeKit { /// public class AttachmentCollection : IList { + const int BufferLength = 4096; + readonly List attachments; readonly bool linked; @@ -133,17 +136,21 @@ static void LoadContent (MimePart attachment, Stream stream) var content = new MemoryBlockStream (); if (attachment.ContentType.IsMimeType ("text", "*")) { + var buf = ArrayPool.Shared.Rent (BufferLength); var filter = new BestEncodingFilter (); - var buf = new byte[4096]; int index, length; int nread; - while ((nread = stream.Read (buf, 0, buf.Length)) > 0) { - filter.Filter (buf, 0, nread, out index, out length); - content.Write (buf, 0, nread); - } + try { + while ((nread = stream.Read (buf, 0, BufferLength)) > 0) { + filter.Filter (buf, 0, nread, out index, out length); + content.Write (buf, 0, nread); + } - filter.Flush (buf, 0, 0, out index, out length); + filter.Flush (buf, 0, 0, out index, out length); + } finally { + ArrayPool.Shared.Return (buf); + } attachment.ContentTransferEncoding = filter.GetBestEncoding (EncodingConstraint.SevenBit); } else { diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 7791c80b78..3664b6a65c 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -66,6 +66,10 @@ + + + + From 5a36a0572a676d432887603188fc810aace8c367 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 4 Nov 2020 21:49:49 -0500 Subject: [PATCH 692/741] Make use of ArrayPools in OpenPgpContextBase and MimeContent classes --- MimeKit/AttachmentCollection.cs | 2 +- MimeKit/Cryptography/OpenPgpContextBase.cs | 128 +++++++++++++-------- MimeKit/MimeContent.cs | 23 ++-- nuget/MimeKit.nuspec | 1 + 4 files changed, 99 insertions(+), 55 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 7b22fee7b6..1e90513386 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -46,7 +46,7 @@ namespace MimeKit { public class AttachmentCollection : IList { const int BufferLength = 4096; - + readonly List attachments; readonly bool linked; diff --git a/MimeKit/Cryptography/OpenPgpContextBase.cs b/MimeKit/Cryptography/OpenPgpContextBase.cs index 237c55c4d6..32bd421b74 100644 --- a/MimeKit/Cryptography/OpenPgpContextBase.cs +++ b/MimeKit/Cryptography/OpenPgpContextBase.cs @@ -29,6 +29,7 @@ using System.IO; using System.Net; using System.Text; +using System.Buffers; using System.Net.Http; using System.Threading; using System.Diagnostics; @@ -55,6 +56,7 @@ public abstract class OpenPgpContextBase : CryptographyContext static readonly string[] ProtocolSubtypes = { "pgp-signature", "pgp-encrypted", "pgp-keys", "x-pgp-signature", "x-pgp-encrypted", "x-pgp-keys" }; const string BeginPublicKeyBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; const string EndPublicKeyBlock = "-----END PGP PUBLIC KEY BLOCK-----"; + const int BufferLength = 4096; static readonly EncryptionAlgorithm[] DefaultEncryptionAlgorithmRank = { EncryptionAlgorithm.Idea, @@ -831,13 +833,17 @@ public ApplicationPgpSignature Sign (PgpSecretKey signer, DigestAlgorithm digest var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); using (var compressed = compresser.Open (armored)) { var signatureGenerator = new PgpSignatureGenerator (signer.PublicKey.Algorithm, hashAlgorithm); - var buf = new byte[4096]; + var buf = ArrayPool.Shared.Rent (BufferLength); int nread; - signatureGenerator.InitSign (PgpSignature.CanonicalTextDocument, GetPrivateKey (signer)); + try { + signatureGenerator.InitSign (PgpSignature.CanonicalTextDocument, GetPrivateKey (signer)); - while ((nread = content.Read (buf, 0, buf.Length)) > 0) - signatureGenerator.Update (buf, 0, nread); + while ((nread = content.Read (buf, 0, BufferLength)) > 0) + signatureGenerator.Update (buf, 0, nread); + } finally { + ArrayPool.Shared.Return (buf); + } var signature = signatureGenerator.Generate (); @@ -938,8 +944,6 @@ bool TryGetPublicKey (PgpPublicKeyRing keyring, long keyId, out PgpPublicKey pub async Task GetDigitalSignaturesAsync (PgpSignatureList signatureList, Stream content, bool doAsync, CancellationToken cancellationToken) { var signatures = new List (); - var buf = new byte[4096]; - int nread; for (int i = 0; i < signatureList.Count; i++) { long keyId = signatureList[i].KeyId; @@ -964,13 +968,20 @@ async Task GetDigitalSignaturesAsync (PgpSignatureLi signatures.Add (signature); } - while ((nread = content.Read (buf, 0, buf.Length)) > 0) { - for (int i = 0; i < signatures.Count; i++) { - if (signatures[i].SignerCertificate != null) { - var pgp = (OpenPgpDigitalSignature) signatures[i]; - pgp.Signature.Update (buf, 0, nread); + var buf = ArrayPool.Shared.Rent (BufferLength); + int nread; + + try { + while ((nread = content.Read (buf, 0, BufferLength)) > 0) { + for (int i = 0; i < signatures.Count; i++) { + if (signatures[i].SignerCertificate != null) { + var pgp = (OpenPgpDigitalSignature) signatures[i]; + pgp.Signature.Update (buf, 0, nread); + } } } + } finally { + ArrayPool.Shared.Return (buf); } return new DigitalSignatureCollection (signatures); @@ -1056,7 +1067,7 @@ Task VerifyAsync (Stream content, Stream signatureDa return VerifyAsync (content, signatureData, true, cancellationToken); } - static Stream Compress (Stream content, byte[] buf) + static Stream Compress (Stream content, byte[] buf, int bufferLength) { var compresser = new PgpCompressedDataGenerator (CompressionAlgorithmTag.ZLib); var memory = new MemoryBlockStream (); @@ -1067,7 +1078,7 @@ static Stream Compress (Stream content, byte[] buf) using (var literal = literalGenerator.Open (compressed, 't', "mime.txt", content.Length, DateTime.Now)) { int nread; - while ((nread = content.Read (buf, 0, buf.Length)) > 0) + while ((nread = content.Read (buf, 0, bufferLength)) > 0) literal.Write (buf, 0, nread); literal.Flush (); @@ -1086,22 +1097,30 @@ static Stream Encrypt (PgpEncryptedDataGenerator encrypter, Stream content) var memory = new MemoryBlockStream (); using (var armored = new ArmoredOutputStream (memory)) { - var buf = new byte[4096]; + var buf = ArrayPool.Shared.Rent (BufferLength); - armored.SetHeader ("Version", null); + try { + armored.SetHeader ("Version", null); - using (var compressed = Compress (content, buf)) { - using (var encrypted = encrypter.Open (armored, compressed.Length)) { - int nread; + using (var compressed = Compress (content, buf, BufferLength)) { + using (var encrypted = encrypter.Open (armored, compressed.Length)) { + int nread; - while ((nread = compressed.Read (buf, 0, buf.Length)) > 0) - encrypted.Write (buf, 0, nread); + try { + while ((nread = compressed.Read (buf, 0, BufferLength)) > 0) + encrypted.Write (buf, 0, nread); + } finally { + ArrayPool.Shared.Return (buf); + } - encrypted.Flush (); + encrypted.Flush (); + } } - } - armored.Flush (); + armored.Flush (); + } finally { + ArrayPool.Shared.Return (buf); + } } memory.Position = 0; @@ -1447,8 +1466,7 @@ public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, var encrypter = new PgpEncryptedDataGenerator (GetSymmetricKeyAlgorithm (cipherAlgo), true); var hashAlgorithm = GetHashAlgorithm (digestAlgo); var unique = new HashSet (); - var buf = new byte[4096]; - int nread, count = 0; + int count = 0; foreach (var recipient in recipients) { if (!recipient.IsEncryptionKey) @@ -1483,9 +1501,16 @@ public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, var literalGenerator = new PgpLiteralDataGenerator (); using (var literal = literalGenerator.Open (signed, 't', "mime.txt", content.Length, DateTime.Now)) { - while ((nread = content.Read (buf, 0, buf.Length)) > 0) { - signatureGenerator.Update (buf, 0, nread); - literal.Write (buf, 0, nread); + var buf = ArrayPool.Shared.Rent (BufferLength); + int nread; + + try { + while ((nread = content.Read (buf, 0, BufferLength)) > 0) { + signatureGenerator.Update (buf, 0, nread); + literal.Write (buf, 0, nread); + } + } finally { + ArrayPool.Shared.Return (buf); } literal.Flush (); @@ -1505,8 +1530,15 @@ public MimePart SignAndEncrypt (PgpSecretKey signer, DigestAlgorithm digestAlgo, armored.SetHeader ("Version", null); using (var encrypted = encrypter.Open (armored, compressed.Length)) { - while ((nread = compressed.Read (buf, 0, buf.Length)) > 0) - encrypted.Write (buf, 0, nread); + var buf = ArrayPool.Shared.Rent (BufferLength); + int nread; + + try { + while ((nread = compressed.Read (buf, 0, BufferLength)) > 0) + encrypted.Write (buf, 0, nread); + } finally { + ArrayPool.Shared.Return (buf); + } encrypted.Flush (); } @@ -1661,28 +1693,32 @@ async Task DecryptToAsync (Stream encryptedData, Str var literal = (PgpLiteralData) obj; using (var stream = literal.GetDataStream ()) { - var buffer = new byte[4096]; + var buf = ArrayPool.Shared.Rent (BufferLength); int nread; - while ((nread = stream.Read (buffer, 0, buffer.Length)) > 0) { - if (onepassList != null) { - // update our one-pass signatures... - for (int index = 0; index < nread; index++) { - byte c = buffer[index]; - - for (int i = 0; i < onepassList.Count; i++) { - var pgp = (OpenPgpDigitalSignature) onepassList[i]; - pgp.OnePassSignature.Update (c); + try { + while ((nread = stream.Read (buf, 0, BufferLength)) > 0) { + if (onepassList != null) { + // update our one-pass signatures... + for (int index = 0; index < nread; index++) { + byte c = buf[index]; + + for (int i = 0; i < onepassList.Count; i++) { + var pgp = (OpenPgpDigitalSignature) onepassList[i]; + pgp.OnePassSignature.Update (c); + } } } - } - if (doAsync) - await decryptedData.WriteAsync (buffer, 0, nread, cancellationToken).ConfigureAwait (false); - else - decryptedData.Write (buffer, 0, nread); + if (doAsync) + await decryptedData.WriteAsync (buf, 0, nread, cancellationToken).ConfigureAwait (false); + else + decryptedData.Write (buf, 0, nread); - nwritten += nread; + nwritten += nread; + } + } finally { + ArrayPool.Shared.Return (buf); } } } diff --git a/MimeKit/MimeContent.cs b/MimeKit/MimeContent.cs index 27cffac638..fffb6f8f5c 100644 --- a/MimeKit/MimeContent.cs +++ b/MimeKit/MimeContent.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Buffers; using System.Threading; using System.Threading.Tasks; @@ -77,6 +78,8 @@ public ContentObject (Stream stream, ContentEncoding encoding = ContentEncoding. /// public class MimeContent : IMimeContent { + const int BufferLength = 4096; + /// /// Initialize a new instance of the class. /// @@ -190,21 +193,21 @@ public Stream Open () if (stream == null) throw new ArgumentNullException (nameof (stream)); + Stream.Seek (0, SeekOrigin.Begin); + + var buf = ArrayPool.Shared.Rent (BufferLength); var readable = Stream as ICancellableStream; var writable = stream as ICancellableStream; - var buf = new byte[4096]; int nread; - Stream.Seek (0, SeekOrigin.Begin); - try { do { if (readable != null) { - if ((nread = readable.Read (buf, 0, buf.Length, cancellationToken)) <= 0) + if ((nread = readable.Read (buf, 0, BufferLength, cancellationToken)) <= 0) break; } else { cancellationToken.ThrowIfCancellationRequested (); - if ((nread = Stream.Read (buf, 0, buf.Length)) <= 0) + if ((nread = Stream.Read (buf, 0, BufferLength)) <= 0) break; } @@ -225,6 +228,8 @@ public Stream Open () } throw; + } finally { + ArrayPool.Shared.Return (buf); } } @@ -254,11 +259,11 @@ public Stream Open () if (stream == null) throw new ArgumentNullException (nameof (stream)); - var buf = new byte[4096]; - int nread; - Stream.Seek (0, SeekOrigin.Begin); + var buf = ArrayPool.Shared.Rent (BufferLength); + int nread; + try { do { if ((nread = await Stream.ReadAsync (buf, 0, buf.Length, cancellationToken).ConfigureAwait (false)) <= 0) @@ -276,6 +281,8 @@ public Stream Open () } throw; + } finally { + ArrayPool.Shared.Return (buf); } } diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 370a2706bf..b20a6098df 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -84,6 +84,7 @@ + From 51110a42b6d9100a6ad5ed52802ffd068e694d8d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 5 Nov 2020 08:22:24 -0500 Subject: [PATCH 693/741] Added unit test for adding a text attachment to AttachmentCollection --- UnitTests/AttachmentCollectionTests.cs | 20 +++++++++++++ UnitTests/TestData/text/lorem-ipsum.txt | 40 +++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 UnitTests/TestData/text/lorem-ipsum.txt diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index 0d963f2c2b..e4c350bfd3 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -215,6 +215,26 @@ public void TestAddStreamContentType () attachments.Clear (); } + [Test] + public void TestAddTextFileName () + { + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "text", "lorem-ipsum.txt"); + var attachments = new AttachmentCollection (); + MimePart attachment; + + attachment = (MimePart) attachments.Add (fileName); + Assert.AreEqual ("text/plain", attachment.ContentType.MimeType); + Assert.AreEqual ("lorem-ipsum.txt", attachment.FileName); + Assert.AreEqual (ContentEncoding.SevenBit, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); + Assert.AreEqual (0, attachments.Count); + attachments.Clear (); + } + [Test] public void TestAddEmailMessage () { diff --git a/UnitTests/TestData/text/lorem-ipsum.txt b/UnitTests/TestData/text/lorem-ipsum.txt new file mode 100644 index 0000000000..78b853cff8 --- /dev/null +++ b/UnitTests/TestData/text/lorem-ipsum.txt @@ -0,0 +1,40 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent volutpat, +velit vitae scelerisque sagittis, turpis lorem lobortis est, nec egestas lorem +justo ac libero. Proin sit amet augue mollis, suscipit neque sed, imperdiet +nulla. Ut vitae fermentum mi, a imperdiet augue. Morbi tincidunt nulla nunc, +at sollicitudin tortor viverra et. Mauris sit amet bibendum nibh, ut dapibus +metus. Nunc nec cursus nisi. Donec id porttitor velit. Curabitur pulvinar +augue nec metus finibus euismod. Cras vulputate diam nec mauris aliquam, a +tempus magna porta. Mauris sed risus rhoncus, tempor lacus nec, tristique mi. +Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere +cubilia curae; Phasellus pretium sollicitudin tincidunt. Donec pellentesque +leo nec nisl commodo, et accumsan nunc pharetra. + +Duis aliquam odio enim, sed molestie libero vulputate sed. Praesent eget nisl +varius, tristique odio sed, luctus augue. Pellentesque quis egestas libero, a +molestie augue. Curabitur lacus magna, commodo in facilisis id, tempus et +metus. Pellentesque id mi a magna tincidunt ultricies. Duis tempor vitae arcu +ut mattis. Mauris commodo ligula vitae ante dignissim, sed vehicula urna +ultrices. In vitae accumsan arcu. + +Fusce gravida sem ac velit ullamcorper cursus. Donec tincidunt facilisis diam, +vel molestie massa. Morbi in dictum enim. Vestibulum quis lectus elementum, +finibus magna eget, aliquet lectus. Pellentesque habitant morbi tristique +senectus et netus et malesuada fames ac turpis egestas. Nunc imperdiet eros +ligula, a vestibulum lacus tempus at. Quisque aliquet quam justo, vitae +vehicula tellus aliquam ac. Pellentesque sit amet fermentum leo. Duis aliquam +feugiat sem vel ornare. + +Suspendisse potenti. Aenean pellentesque diam id nunc placerat sagittis. Sed +lacus ipsum, scelerisque sit amet vulputate eu, elementum ut velit. Vivamus +non nibh quis tellus rhoncus ultrices. Suspendisse vel metus quis est +tristique commodo ac vel nisl. Fusce viverra justo vitae felis pellentesque, +ac bibendum sem tincidunt. Ut facilisis luctus facilisis. Fusce non +condimentum ligula. + +Vivamus faucibus elit dui, vitae vehicula turpis mattis sed. Aliquam erat +volutpat. Aliquam a enim nulla. Nullam elementum lacus sem, quis consequat +eros aliquam egestas. Fusce fringilla faucibus sapien, quis dignissim ex +venenatis faucibus. Sed congue nisi mi, id scelerisque eros facilisis vitae. +Ut tortor metus, sodales nec blandit a, molestie eu arcu. Sed dictum congue +tincidunt. Phasellus quis placerat nibh, sed rutrum metus. \ No newline at end of file From 41d33e2e41dffb612c08b5e0824258261af5a411 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 6 Nov 2020 08:21:28 -0500 Subject: [PATCH 694/741] Fixed MimeUtils.GenerateMessageId() to encode international domain names --- MimeKit/Utils/MimeUtils.cs | 2 +- UnitTests/Utils/MimeUtilsTests.cs | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/MimeKit/Utils/MimeUtils.cs b/MimeKit/Utils/MimeUtils.cs index d35dadd45b..f67fe14d47 100644 --- a/MimeKit/Utils/MimeUtils.cs +++ b/MimeKit/Utils/MimeUtils.cs @@ -102,7 +102,7 @@ public static string GenerateMessageId (string domain) value /= 36; } while (value != 0); - id.Append ('@').Append (domain); + id.Append ('@').Append (ParseUtils.IdnEncode (domain)); return id.ToString (); } diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index a2acc4f356..311c1e35b0 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -129,5 +129,17 @@ public void TestTryParseVersion () Assert.IsFalse (MimeUtils.TryParse ("(unterminated comment", out version), "unterminated comment"); Assert.IsFalse (MimeUtils.TryParse ("1 (unterminated comment", out version), "1 + unterminated comment"); } + + [Test] + public void TestGenerateMessageIdWithInternationalDomain () + { + const string domain = "Mjölnir"; + + var msgid = MimeUtils.GenerateMessageId (domain); + int at = msgid.IndexOf ('@'); + var idn = msgid.Substring (at + 1); + + Assert.AreEqual ("xn--mjlnir-4ka37a", idn); + } } } From cadbb67c75398fe4d4412b0e215396114fc19d58 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 6 Nov 2020 08:23:17 -0500 Subject: [PATCH 695/741] fixed test --- UnitTests/Utils/MimeUtilsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTests/Utils/MimeUtilsTests.cs b/UnitTests/Utils/MimeUtilsTests.cs index 311c1e35b0..0001e57700 100644 --- a/UnitTests/Utils/MimeUtilsTests.cs +++ b/UnitTests/Utils/MimeUtilsTests.cs @@ -133,13 +133,13 @@ public void TestTryParseVersion () [Test] public void TestGenerateMessageIdWithInternationalDomain () { - const string domain = "Mjölnir"; + const string domain = "Mjölnir"; var msgid = MimeUtils.GenerateMessageId (domain); int at = msgid.IndexOf ('@'); var idn = msgid.Substring (at + 1); - Assert.AreEqual ("xn--mjlnir-4ka37a", idn); + Assert.AreEqual ("xn--mjlnir-xxa", idn); } } } From a387179a1ccc7e420b3b070daba0c22c4060685d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 7 Nov 2020 11:16:09 -0500 Subject: [PATCH 696/741] Fixed MemoryBlockStream unit test divide-by-zero bug --- UnitTests/IO/MemoryBlockStreamTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/IO/MemoryBlockStreamTests.cs b/UnitTests/IO/MemoryBlockStreamTests.cs index 05704b3d1c..e814cb64e9 100644 --- a/UnitTests/IO/MemoryBlockStreamTests.cs +++ b/UnitTests/IO/MemoryBlockStreamTests.cs @@ -195,7 +195,7 @@ void AssertSeekResults () public void TestSeek () { for (int attempt = 0; attempt < 10; attempt++) { - long offset = random.Next () % master.Length; + long offset = random.Next (1, (int) master.Length); long expected = master.Seek (offset, SeekOrigin.Begin); long actual = blocks.Seek (offset, SeekOrigin.Begin); From 22dd1fdda69e1f6a1bf15f82bbb88632e4cde497 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Nov 2020 21:07:04 -0500 Subject: [PATCH 697/741] Updated nuget package dependencies and project dependencies --- MimeKit/MimeKit.csproj | 6 ++---- MimeKit/MimeKitLite.csproj | 5 ++++- nuget/MimeKitLite.nuspec | 21 +-------------------- 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 3664b6a65c..e29d780a7f 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -5,7 +5,7 @@ MimeKit 2.9.2 Jeffrey Stedfast - netstandard1.3;netstandard1.6;netstandard2.0;net45;net46;net47;net48 + netstandard2.0;net45;net46;net47;net48 true false MimeKit @@ -50,24 +50,22 @@ - - - + diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index c55bdd8dcc..06497baea3 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -47,7 +47,10 @@ - + + + + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index ac4dfd4587..5f9a6c0c56 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -48,39 +48,20 @@ - - - - - - - - - - - - - - + - - - - - - From e4a364515092c963166d0ee7a7583fefa779af36 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Nov 2020 21:23:49 -0500 Subject: [PATCH 698/741] Updated the PGP unit tests to work with BC 1.8.8 --- UnitTests/Cryptography/PgpMimeTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/PgpMimeTests.cs b/UnitTests/Cryptography/PgpMimeTests.cs index a5eae4b2c8..1039bb918e 100644 --- a/UnitTests/Cryptography/PgpMimeTests.cs +++ b/UnitTests/Cryptography/PgpMimeTests.cs @@ -800,7 +800,7 @@ public void TestAutoKeyRetrieve () try { signatures = multipart.Verify (); } catch (IOException ex) { - if (ex.Message == "unknown signature key algorithm: 22") { + if (ex.Message == "unknown signature key algorithm: EdDsa") { Assert.Ignore ("Known issue: {0}", ex.Message); return; } From c6ccb88ce2030223e89201c51f1d217a6463f01f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 13 Nov 2020 17:03:24 -0500 Subject: [PATCH 699/741] code cleanup --- MimeKit/MimeParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index eb362bceb7..d5558cb2ce 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1271,7 +1271,7 @@ unsafe void ScanContent (byte* inbuf, ref int contentIndex, ref int nleft, ref b *aligned = c; if (inptr == aligned && c != (byte) '\n') { - // -funroll-loops, bitches. + // -funroll-loops, yippee ki-yay. uint* dword = (uint*) inptr; do { From 6edc004c4f4307918fffef332302ec10834f3caf Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 13 Nov 2020 17:21:09 -0500 Subject: [PATCH 700/741] Removed some unused files that were used to support older .NET versions --- MimeKit/CancellationToken.cs | 76 ------------------------------------ MimeKit/StreamExtensions.cs | 46 ---------------------- 2 files changed, 122 deletions(-) delete mode 100644 MimeKit/CancellationToken.cs delete mode 100644 MimeKit/StreamExtensions.cs diff --git a/MimeKit/CancellationToken.cs b/MimeKit/CancellationToken.cs deleted file mode 100644 index 9b3d8d6077..0000000000 --- a/MimeKit/CancellationToken.cs +++ /dev/null @@ -1,76 +0,0 @@ -// -// CancellationToken.cs -// -// Author: Jeffrey Stedfast -// -// Copyright (c) 2015 Xamarin Inc. (www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -using System; - -namespace System.Threading { - public struct CancellationToken - { - public static readonly CancellationToken None = new CancellationToken (); - - public bool CanBeCancelled { - get { return false; } - } - - public bool IsCancellationRequested { - get { return false; } - } - - public void ThrowIfCancellationRequested () - { - if (IsCancellationRequested) - throw new OperationCanceledException (); - } - - public bool Equals (CancellationToken other) - { - return true; - } - - public override bool Equals (object obj) - { - if (obj is CancellationToken) - return Equals ((CancellationToken) obj); - - return false; - } - - public override int GetHashCode () - { - return base.GetHashCode (); - } - - public static bool operator == (CancellationToken left, CancellationToken right) - { - return left.Equals (right); - } - - public static bool operator != (CancellationToken left, CancellationToken right) - { - return !left.Equals (right); - } - } -} diff --git a/MimeKit/StreamExtensions.cs b/MimeKit/StreamExtensions.cs deleted file mode 100644 index c8165facce..0000000000 --- a/MimeKit/StreamExtensions.cs +++ /dev/null @@ -1,46 +0,0 @@ -// -// StreamExtensions.cs -// -// Author: Jeffrey Stedfast -// -// Copyright (c) 2015 Xamarin Inc. (www.xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -using System.IO; - -namespace MimeKit { - static class StreamExtensions - { - public static void CopyTo (this Stream source, Stream destination, int bufferSize) - { - var buffer = new byte[bufferSize]; - int nread; - - while ((nread = source.Read (buffer, 0, bufferSize)) > 0) - destination.Write (buffer, 0, nread); - } - - public static void CopyTo (this Stream source, Stream destination) - { - CopyTo (source, destination, 4096); - } - } -} From af0736fc3fc30527dbcf4fe29efdb26a6a665748 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:15:37 -0500 Subject: [PATCH 701/741] Removed release.bat --- release.bat | 2 -- 1 file changed, 2 deletions(-) delete mode 100755 release.bat diff --git a/release.bat b/release.bat deleted file mode 100755 index 8da48cef26..0000000000 --- a/release.bat +++ /dev/null @@ -1,2 +0,0 @@ -"%WinDir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" /p:Configuration=Release /p:Platform="Any CPU" /t:Rebuild MimeKitLite.sln -"%WinDir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" /p:Configuration=Release /p:Platform="Any CPU" /t:Rebuild MimeKit.sln From ab6f225872c31b853aea22cf52656d6face5611e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:16:34 -0500 Subject: [PATCH 702/741] Use ArrayPool to rent temp buffers for calculating fingerprint hashes --- .../BouncyCastleCertificateExtensions.cs | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 292b6d16b8..0955757918 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Buffers; using System.Collections.Generic; using Org.BouncyCastle.Asn1; @@ -190,16 +191,21 @@ public static string GetSubjectEmailAddress (this X509Certificate certificate) return null; } - internal static string AsHex (this byte[] blob) + static string AsHex (this byte[] blob, int length) { - var hex = new StringBuilder (blob.Length * 2); + var hex = new StringBuilder (length * 2); - for (int i = 0; i < blob.Length; i++) + for (int i = 0; i < length; i++) hex.Append (blob[i].ToString ("x2")); return hex.ToString (); } + internal static string AsHex (this byte[] blob) + { + return AsHex (blob, blob.Length); + } + /// /// Gets the fingerprint of the certificate. /// @@ -218,13 +224,19 @@ public static string GetFingerprint (this X509Certificate certificate) throw new ArgumentNullException (nameof (certificate)); var encoded = certificate.GetEncoded (); - var fingerprint = new byte[20]; var sha1 = new Sha1Digest (); sha1.BlockUpdate (encoded, 0, encoded.Length); - sha1.DoFinal (fingerprint, 0); - return fingerprint.AsHex (); + var fingerprint = ArrayPool.Shared.Rent (20); + + try { + sha1.DoFinal (fingerprint, 0); + + return fingerprint.AsHex (20); + } finally { + ArrayPool.Shared.Return (fingerprint); + } } /// From ec342a11e5b3c853d9ac9157e5e6f9bcbd1f1f61 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:17:39 -0500 Subject: [PATCH 703/741] Use ArrayPool to rent temp buffers for generating/verifying signatures --- MimeKit/Cryptography/Ed25519DigestSigner.cs | 37 ++++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/MimeKit/Cryptography/Ed25519DigestSigner.cs b/MimeKit/Cryptography/Ed25519DigestSigner.cs index 5f00ab5639..331f0268b2 100644 --- a/MimeKit/Cryptography/Ed25519DigestSigner.cs +++ b/MimeKit/Cryptography/Ed25519DigestSigner.cs @@ -25,6 +25,7 @@ // using System; +using System.Buffers; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Math.EC.Rfc8032; @@ -74,15 +75,21 @@ public byte[] GenerateSignature () if (privateKey == null) throw new InvalidOperationException ("Ed25519DigestSigner not initialised for signature generation."); - var hash = new byte[digest.GetDigestSize ()]; - digest.DoFinal (hash, 0); + var hashLength = digest.GetDigestSize (); + var hash = ArrayPool.Shared.Rent (hashLength); - var signature = new byte[Ed25519PrivateKeyParameters.SignatureSize]; - privateKey.Sign (Ed25519.Algorithm.Ed25519, publicKey, null, hash, 0, hash.Length, signature, 0); + try { + digest.DoFinal (hash, 0); - Reset (); + var signature = new byte[Ed25519PrivateKeyParameters.SignatureSize]; + privateKey.Sign (Ed25519.Algorithm.Ed25519, publicKey, null, hash, 0, hashLength, signature, 0); + + Reset (); - return signature; + return signature; + } finally { + ArrayPool.Shared.Return (hash); + } } public bool VerifySignature (byte[] signature) @@ -93,15 +100,21 @@ public bool VerifySignature (byte[] signature) if (Ed25519.SignatureSize != signature.Length) return false; - byte[] hash = new byte[digest.GetDigestSize ()]; - digest.DoFinal (hash, 0); + var hashLength = digest.GetDigestSize (); + var hash = ArrayPool.Shared.Rent (hashLength); - var pk = publicKey.GetEncoded (); - var result = Ed25519.Verify (signature, 0, pk, 0, hash, 0, hash.Length); + try { + digest.DoFinal (hash, 0); - Reset (); + var pk = publicKey.GetEncoded (); + var result = Ed25519.Verify (signature, 0, pk, 0, hash, 0, hashLength); + + Reset (); - return result; + return result; + } finally { + ArrayPool.Shared.Return (hash); + } } public void Reset () From 33c2ca122113b48ee8bf65085657a15b0a5e6356 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:18:56 -0500 Subject: [PATCH 704/741] Use ArrayPool to rent a temp BOM buffer --- MimeKit/Utils/CharsetUtils.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index 7d8362bed6..7b540f57c4 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Buffers; using System.Collections.Generic; namespace MimeKit.Utils { @@ -579,12 +580,15 @@ public static bool TryGetBomEncoding (byte[] buffer, int length, out Encoding en public static bool TryGetBomEncoding (Stream stream, out Encoding encoding) { - var bom = new byte[3]; - int n; + var bom = ArrayPool.Shared.Rent (3); - n = stream.Read (bom, 0, bom.Length); + try { + int n = stream.Read (bom, 0, 3); - return TryGetBomEncoding (bom, n, out encoding); + return TryGetBomEncoding (bom, n, out encoding); + } finally { + ArrayPool.Shared.Return (bom); + } } } } From 0caaee5c3a0ef6a707177488a43f43edd86aa754 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:22:12 -0500 Subject: [PATCH 705/741] Use ArrayPool to rent a temp buffer for calculating MD5 checksums --- MimeKit/MimePart.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 6f3b0b712a..b7b53bebba 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -27,15 +27,16 @@ using System; using System.IO; using System.Text; +using System.Buffers; using System.Threading; using System.Threading.Tasks; using MD5 = System.Security.Cryptography.MD5; -using MimeKit.IO.Filters; -using MimeKit.Encodings; -using MimeKit.Utils; using MimeKit.IO; +using MimeKit.Utils; +using MimeKit.Encodings; +using MimeKit.IO.Filters; namespace MimeKit { /// @@ -464,10 +465,15 @@ public string ComputeContentMd5 () } var base64 = new Base64Encoder (true); - var digest = new byte[base64.EstimateOutputLength (checksum.Length)]; - int n = base64.Flush (checksum, 0, checksum.Length, digest); + var digest = ArrayPool.Shared.Rent (base64.EstimateOutputLength (checksum.Length)); - return Encoding.ASCII.GetString (digest, 0, n); + try { + int n = base64.Flush (checksum, 0, checksum.Length, digest); + + return Encoding.ASCII.GetString (digest, 0, n); + } finally { + ArrayPool.Shared.Return (digest); + } } } From 21318036c09d20a071f741f7d27ef8d9a80f4748 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:22:55 -0500 Subject: [PATCH 706/741] Use ArrayPool to rent a temp buffer for generating multipart boundaries --- MimeKit/Multipart.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index 976f1ed008..ae752c4ca2 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -27,14 +27,15 @@ using System; using System.IO; using System.Text; +using System.Buffers; using System.Threading; using System.Collections; using System.Threading.Tasks; using System.Collections.Generic; -using MimeKit.Encodings; -using MimeKit.Utils; using MimeKit.IO; +using MimeKit.Utils; +using MimeKit.Encodings; namespace MimeKit { /// @@ -146,14 +147,19 @@ static string GenerateBoundary () { var base64 = new Base64Encoder (true); var digest = new byte[16]; - var buf = new byte[24]; int length; MimeUtils.GetRandomBytes (digest); - length = base64.Flush (digest, 0, digest.Length, buf); + var buf = ArrayPool.Shared.Rent (24); + + try { + length = base64.Flush (digest, 0, digest.Length, buf); - return "=-" + Encoding.ASCII.GetString (buf, 0, length); + return "=-" + Encoding.ASCII.GetString (buf, 0, length); + } finally { + ArrayPool.Shared.Return (buf); + } } /// From 5db2cd9e61e4b7ba8c6851bb9067afe4c4dd8b0d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:25:43 -0500 Subject: [PATCH 707/741] Use ArrayPool to rent a temp buffer for hex decoding parameter values --- MimeKit/ParameterList.cs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 3178b458bb..474c9e736c 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Buffers; using System.Collections; using System.Globalization; using System.Collections.Generic; @@ -915,17 +916,21 @@ static string DecodeRfc2231 (out Encoding encoding, ref Decoder decoder, HexDeco } int length = endIndex - index; - var decoded = new byte[hex.EstimateOutputLength (length)]; + var decoded = ArrayPool.Shared.Rent (hex.EstimateOutputLength (length)); - // hex decode... - length = hex.Decode (text, index, length, decoded); + try { + // hex decode... + length = hex.Decode (text, index, length, decoded); - int outLength = decoder.GetCharCount (decoded, 0, length, flush); - var output = new char[outLength]; + int outLength = decoder.GetCharCount (decoded, 0, length, flush); + var output = new char[outLength]; - outLength = decoder.GetChars (decoded, 0, length, output, 0, flush); + outLength = decoder.GetChars (decoded, 0, length, output, 0, flush); - return new string (output, 0, outLength); + return new string (output, 0, outLength); + } finally { + ArrayPool.Shared.Return (decoded); + } } internal static bool TryParse (ParserOptions options, byte[] text, ref int index, int endIndex, bool throwOnError, out ParameterList paramList) From 3980b6658510ffecce10adfbc18818eec83462ee Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:26:26 -0500 Subject: [PATCH 708/741] Use ArrayPool to rent temp buffers for throw-away TNEF data --- MimeKit/Tnef/TnefPropertyReader.cs | 21 +++++++++++++++------ MimeKit/Tnef/TnefReaderStream.cs | 9 +++++++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index c1f9e8da5a..82b25d8661 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Text; +using System.Buffers; namespace MimeKit.Tnef { /// @@ -293,9 +294,13 @@ public TnefReader GetEmbeddedMessageReader () throw new InvalidOperationException (); var stream = GetRawValueReadStream (); - var guid = new byte[16]; + var guid = ArrayPool.Shared.Rent (16); - stream.Read (guid, 0, 16); + try { + stream.Read (guid, 0, 16); + } finally { + ArrayPool.Shared.Return (guid); + } return new TnefReader (stream, reader.MessageCodepage, reader.ComplianceMode); } @@ -787,13 +792,17 @@ public int ReadTextValue (char[] buffer, int offset, int count) if (n <= 0) return 0; - var bytes = new byte[n]; + var bytes = ArrayPool.Shared.Rent (n); - n = reader.ReadAttributeRawValue (bytes, 0, bytes.Length); + try { + n = reader.ReadAttributeRawValue (bytes, 0, n); - var flush = reader.StreamOffset >= valueEndOffset; + var flush = reader.StreamOffset >= valueEndOffset; - return decoder.GetChars (bytes, 0, n, buffer, offset, flush); + return decoder.GetChars (bytes, 0, n, buffer, offset, flush); + } finally { + ArrayPool.Shared.Return (bytes); + } } bool TryGetPropertyValueLength (out int length) diff --git a/MimeKit/Tnef/TnefReaderStream.cs b/MimeKit/Tnef/TnefReaderStream.cs index 70d9b35869..59bde09bc7 100644 --- a/MimeKit/Tnef/TnefReaderStream.cs +++ b/MimeKit/Tnef/TnefReaderStream.cs @@ -26,6 +26,7 @@ using System; using System.IO; +using System.Buffers; namespace MimeKit.Tnef { /// @@ -179,9 +180,13 @@ public override int Read (byte[] buffer, int offset, int count) if (dataLeft == 0 && valueEndOffset > reader.StreamOffset) { int valueLeft = valueEndOffset - reader.StreamOffset; - var buf = new byte[valueLeft]; + var buf = ArrayPool.Shared.Rent (valueLeft); - reader.ReadAttributeRawValue (buf, 0, buf.Length); + try { + reader.ReadAttributeRawValue (buf, 0, valueLeft); + } finally { + ArrayPool.Shared.Return (buf); + } } return nread; From 6b3777b60e043eae1a27bdd7a7d3e7d332a4b99a Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 12:30:26 -0500 Subject: [PATCH 709/741] Updated Mono.Data.Sqlite.csproj --- Mono.Data.Sqlite/Mono.Data.Sqlite.csproj | 28 +++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Mono.Data.Sqlite/Mono.Data.Sqlite.csproj b/Mono.Data.Sqlite/Mono.Data.Sqlite.csproj index e1f871b380..a929528ca4 100644 --- a/Mono.Data.Sqlite/Mono.Data.Sqlite.csproj +++ b/Mono.Data.Sqlite/Mono.Data.Sqlite.csproj @@ -1,4 +1,4 @@ - + Debug @@ -45,18 +45,28 @@ - + + Component + - - - + + Component + + + Component + + + Component + - + + Component + @@ -81,9 +91,7 @@ - - - + - + \ No newline at end of file From 28afe0f092a5e0adf0e13cff3ec196239ea50ea5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 19:41:23 -0500 Subject: [PATCH 710/741] Fixed a leak in SqlCertificateDatabase.CreateCertificatesTable() --- MimeKit/Cryptography/SqlCertificateDatabase.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index 4bdaadaa25..482b6466c3 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -286,16 +286,17 @@ void CreateCertificatesTable (DataTable table) foreach (var record in Find (null, false, X509CertificateRecordFields.Id | X509CertificateRecordFields.Certificate)) { var statement = "UPDATE CERTIFICATES SET ANCHOR = @ANCHOR, SUBJECTNAME = @SUBJECTNAME, SUBJECTKEYIDENTIFIER = @SUBJECTKEYIDENTIFIER WHERE ID = @ID"; - var command = connection.CreateCommand (); - command.AddParameterWithValue ("@ID", record.Id); - command.AddParameterWithValue ("@ANCHOR", record.IsAnchor); - command.AddParameterWithValue ("@SUBJECTNAME", record.SubjectName); - command.AddParameterWithValue ("@SUBJECTKEYIDENTIFIER", record.SubjectKeyIdentifier?.AsHex ()); - command.CommandType = CommandType.Text; - command.CommandText = statement; + using (var command = connection.CreateCommand ()) { + command.AddParameterWithValue ("@ID", record.Id); + command.AddParameterWithValue ("@ANCHOR", record.IsAnchor); + command.AddParameterWithValue ("@SUBJECTNAME", record.SubjectName); + command.AddParameterWithValue ("@SUBJECTKEYIDENTIFIER", record.SubjectKeyIdentifier?.AsHex ()); + command.CommandType = CommandType.Text; + command.CommandText = statement; - command.ExecuteNonQuery (); + command.ExecuteNonQuery (); + } } transaction.Commit (); From 2d7335fdb4ed495f2b090a0419b579ec1fa5296e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 19:48:16 -0500 Subject: [PATCH 711/741] Fixed potential leaks in MimeParser when loading MimePart content --- MimeKit/AsyncMimeParser.cs | 11 +++++++++-- MimeKit/MimeParser.cs | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/MimeKit/AsyncMimeParser.cs b/MimeKit/AsyncMimeParser.cs index 668cb09666..763aadffb6 100644 --- a/MimeKit/AsyncMimeParser.cs +++ b/MimeKit/AsyncMimeParser.cs @@ -263,8 +263,15 @@ async Task ConstructMimePartAsync (MimePart part, MimeEntityEndEventArgs args, C content = new BoundStream (stream, beginOffset, endOffset, true); } else { content = new MemoryBlockStream (); - result = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); - content.Seek (0, SeekOrigin.Begin); + + try { + result = await ScanContentAsync (content, true, cancellationToken).ConfigureAwait (false); + content.Seek (0, SeekOrigin.Begin); + } catch { + content.Dispose (); + throw; + } + endOffset = beginOffset + content.Length; } diff --git a/MimeKit/MimeParser.cs b/MimeKit/MimeParser.cs index d5558cb2ce..53374aa77b 100644 --- a/MimeKit/MimeParser.cs +++ b/MimeKit/MimeParser.cs @@ -1395,8 +1395,15 @@ unsafe void ConstructMimePart (MimePart part, MimeEntityEndEventArgs args, byte* content = new BoundStream (stream, beginOffset, endOffset, true); } else { content = new MemoryBlockStream (); - result = ScanContent (inbuf, content, true, cancellationToken); - content.Seek (0, SeekOrigin.Begin); + + try { + result = ScanContent (inbuf, content, true, cancellationToken); + content.Seek (0, SeekOrigin.Begin); + } catch { + content.Dispose (); + throw; + } + endOffset = beginOffset + content.Length; } From 8563f815e425cbdc78a790764ae43ba00399dbed Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 20:01:19 -0500 Subject: [PATCH 712/741] minor fixes --- MimeKit/Cryptography/WindowsSecureMimeContext.cs | 7 ++++++- MimeKit/Cryptography/X509Certificate2Extensions.cs | 4 +++- MimeKit/Tnef/TnefPart.cs | 6 +++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/MimeKit/Cryptography/WindowsSecureMimeContext.cs b/MimeKit/Cryptography/WindowsSecureMimeContext.cs index 6d78974b30..ac3efaced6 100644 --- a/MimeKit/Cryptography/WindowsSecureMimeContext.cs +++ b/MimeKit/Cryptography/WindowsSecureMimeContext.cs @@ -1139,7 +1139,12 @@ public override void Import (X509Crl crl) if (crl == null) throw new ArgumentNullException (nameof (crl)); - foreach (Org.BouncyCastle.X509.X509Certificate certificate in crl.GetRevokedCertificates ()) + var revoked = crl.GetRevokedCertificates (); + + if (revoked == null) + return; + + foreach (Org.BouncyCastle.X509.X509Certificate certificate in revoked) Import (StoreName.Disallowed, certificate); } diff --git a/MimeKit/Cryptography/X509Certificate2Extensions.cs b/MimeKit/Cryptography/X509Certificate2Extensions.cs index d41365c1f7..9184315ab4 100644 --- a/MimeKit/Cryptography/X509Certificate2Extensions.cs +++ b/MimeKit/Cryptography/X509Certificate2Extensions.cs @@ -62,8 +62,10 @@ public static X509Certificate AsBouncyCastleCertificate (this X509Certificate2 c throw new ArgumentNullException (nameof (certificate)); var rawData = certificate.GetRawCertData (); + var parser = new X509CertificateParser (); + var cert = parser.ReadCertificate (rawData); - return new X509CertificateParser ().ReadCertificate (rawData); + return cert; } /// diff --git a/MimeKit/Tnef/TnefPart.cs b/MimeKit/Tnef/TnefPart.cs index 3f9e344681..c43663a200 100644 --- a/MimeKit/Tnef/TnefPart.cs +++ b/MimeKit/Tnef/TnefPart.cs @@ -170,15 +170,15 @@ public bool TryGetMailboxAddress (out MailboxAddress mailbox) { string addr; - mailbox = null; - if (string.IsNullOrEmpty (Addr) && CanUseSearchKey) addr = SearchKey.Substring (AddrType.Length + 1); else addr = Addr; - if (string.IsNullOrEmpty (addr) || !MailboxAddress.TryParse (addr, out mailbox)) + if (string.IsNullOrEmpty (addr) || !MailboxAddress.TryParse (addr, out mailbox)) { + mailbox = null; return false; + } mailbox.Name = Name; From 9e986428e0a48589d81d3094cc62ad627035c4c7 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 14 Nov 2020 20:01:50 -0500 Subject: [PATCH 713/741] Updated MimeKit.Coverity.sln --- MimeKit.Coverity.sln | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/MimeKit.Coverity.sln b/MimeKit.Coverity.sln index 226b4ce9db..891c66a136 100644 --- a/MimeKit.Coverity.sln +++ b/MimeKit.Coverity.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.12 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30711.63 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit.Net45", "MimeKit\MimeKit.Net45.csproj", "{D5F54A4F-D84B-430F-9271-F7861E285B3E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "MimeKit\MimeKit.csproj", "{29F68E0E-0119-45CC-B6B4-A0C70FADA4AD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,14 +11,17 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5F54A4F-D84B-430F-9271-F7861E285B3E}.Release|Any CPU.Build.0 = Release|Any CPU + {29F68E0E-0119-45CC-B6B4-A0C70FADA4AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29F68E0E-0119-45CC-B6B4-A0C70FADA4AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29F68E0E-0119-45CC-B6B4-A0C70FADA4AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29F68E0E-0119-45CC-B6B4-A0C70FADA4AD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FE861017-7B1A-4D73-AAEC-0DEBA21F6C52} + EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0 $0.StandardHeader = $1 From d6857a79b8da2c7802638e23a05f21bf09da4dc4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sun, 15 Nov 2020 15:44:25 -0500 Subject: [PATCH 714/741] Added another mailbox parser test --- UnitTests/MailboxAddressTests.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index bbe9142404..4a15e7fb3b 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -817,6 +817,16 @@ public void TestParseMailboxWithSquareBracketsInDisplayName () AssertParseFailure (text, false, 0, 0, RfcComplianceMode.Strict); } + [Test] + public void TestParseMailboxWithSquareBracketsAnd8BitTextInDisplayName () + { + const string text = "Tom Doe [Cörp Öne] "; + + AssertParse (text); + + AssertParseFailure (text, false, 0, 8, RfcComplianceMode.Strict); + } + [Test] public void TestParseAddrspecWithUnicodeLocalPart () { From f57e326b8590bbda4eff178955ff7781f4c2fe89 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 16 Nov 2020 12:40:20 -0500 Subject: [PATCH 715/741] Updated nuspec files --- nuget/MimeKit.nuspec | 2 +- nuget/MimeKitLite.nuspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index b20a6098df..f83c88a3ce 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -18,7 +18,7 @@ MimeKit's parser also uses a real tokenizer when parsing the headers rather than regex or string.Split() like most other .NET MIME parsers. This means that MimeKit is much more RFC-compliant than any other .NET MIME parser out there, including the commercial implementations. - In addition to having a far superior parser implementation, MimeKit's object tree is not a derivative of System.Net.Mail objects and thus does not suffer from System.Net.Mail's massive limitations or bugs. + In addition to having a far superior parser implementation, MimeKit's object tree is not a derivative of System.Net.Mail objects and thus does not suffer from System.Net.Mail's limitations. API documentation can be found on the web at http://www.mimekit.net/docs diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 5f9a6c0c56..97a41ca68f 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -18,7 +18,7 @@ MimeKit's parser also uses a real tokenizer when parsing the headers rather than regex or string.Split() like most other .NET MIME parsers. This means that MimeKit is much more RFC-compliant than any other .NET MIME parser out there, including the commercial implementations. - In addition to having a far superior parser implementation, MimeKit's object tree is not a derivative of System.Net.Mail objects and thus does not suffer from System.Net.Mail's massive limitations or bugs. + In addition to having a far superior parser implementation, MimeKit's object tree is not a derivative of System.Net.Mail objects and thus does not suffer from System.Net.Mail's limitations. API documentation can be found on the web at http://www.mimekit.net/docs From 5cf40bb263744886db965957a4168a06cddf5926 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 16 Nov 2020 12:41:04 -0500 Subject: [PATCH 716/741] Added benchmarks --- Benchmarks/BenchmarkHelper.cs | 61 + Benchmarks/Benchmarks.csproj | 29 + Benchmarks/MimeParserBenchmarks.cs | 68 + Benchmarks/Program.cs | 39 + Benchmarks/TestData/messages/startrek.eml | 4548 +++++++++++++++++++++ MimeKit.sln | 16 +- UnitTests/UnitTests.csproj | 6 +- 7 files changed, 4759 insertions(+), 8 deletions(-) create mode 100644 Benchmarks/BenchmarkHelper.cs create mode 100644 Benchmarks/Benchmarks.csproj create mode 100644 Benchmarks/MimeParserBenchmarks.cs create mode 100644 Benchmarks/Program.cs create mode 100644 Benchmarks/TestData/messages/startrek.eml diff --git a/Benchmarks/BenchmarkHelper.cs b/Benchmarks/BenchmarkHelper.cs new file mode 100644 index 0000000000..956029ec8d --- /dev/null +++ b/Benchmarks/BenchmarkHelper.cs @@ -0,0 +1,61 @@ +// +// BenchmarkHelper.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; + +namespace Benchmarks { + static class BenchmarkHelper + { + public static readonly string ProjectDir; + public static readonly string UnitTestsDir; + + static BenchmarkHelper () + { + var codeBase = typeof (BenchmarkHelper).Assembly.CodeBase; + if (codeBase.StartsWith ("file://", StringComparison.OrdinalIgnoreCase)) + codeBase = codeBase.Substring ("file://".Length); + + if (Path.DirectorySeparatorChar == '\\') { + if (codeBase[0] == '/') + codeBase = codeBase.Substring (1); + + codeBase = codeBase.Replace ('/', '\\'); + } + + var dir = Path.GetDirectoryName (codeBase); + + while (Path.GetFileName (dir) != "Benchmarks") + dir = Path.GetFullPath (Path.Combine (dir, "..")); + + ProjectDir = Path.GetFullPath (dir); + + dir = Path.Combine (dir, "..", "UnitTests"); + + UnitTestsDir = Path.GetFullPath (dir); + } + } +} diff --git a/Benchmarks/Benchmarks.csproj b/Benchmarks/Benchmarks.csproj new file mode 100644 index 0000000000..a34f5f305a --- /dev/null +++ b/Benchmarks/Benchmarks.csproj @@ -0,0 +1,29 @@ + + + + net48;netcoreapp3.1 + true + $(DefineConstants);MONO + ..\MimeKit\mimekit.snk + false + false + Exe + + + + + + + + + + + + + + + + + + + diff --git a/Benchmarks/MimeParserBenchmarks.cs b/Benchmarks/MimeParserBenchmarks.cs new file mode 100644 index 0000000000..e315b93cf2 --- /dev/null +++ b/Benchmarks/MimeParserBenchmarks.cs @@ -0,0 +1,68 @@ +// +// MimeParserBenchmarks.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.IO; + +using BenchmarkDotNet.Attributes; + +using MimeKit; + +namespace Benchmarks { + public class MimeParserBenchmarks + { + static readonly string MessagesDataDir = Path.Combine (BenchmarkHelper.ProjectDir, "TestData", "messages"); + static readonly string MboxDataDir = Path.Combine (BenchmarkHelper.ProjectDir, "TestData", "mbox"); + + static void BenchmarkMimeParser (string fileName, bool persistent = false) + { + var path = Path.Combine (MessagesDataDir, fileName); + + using (var stream = File.OpenRead (path)) { + var parser = new MimeParser (stream, MimeFormat.Entity, persistent); + + for (int i = 0; i < 1000; i++) { + parser.ParseMessage (); + + stream.Position = 0; + parser.SetStream (stream, MimeFormat.Entity, persistent); + } + } + } + + [Benchmark] + public void BenchmarkStarTrekMessage () + { + BenchmarkMimeParser ("startrek.eml"); + } + + [Benchmark] + public void BenchmarkStarTrekMessagePersistent () + { + BenchmarkMimeParser ("startrek.eml", true); + } + } +} diff --git a/Benchmarks/Program.cs b/Benchmarks/Program.cs new file mode 100644 index 0000000000..c0135ae221 --- /dev/null +++ b/Benchmarks/Program.cs @@ -0,0 +1,39 @@ +// +// Program.cs +// +// Author: Jeffrey Stedfast +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System.Reflection; + +using BenchmarkDotNet.Running; + +namespace Benchmarks { + public class Program + { + public static void Main (string[] args) + { + var summary = BenchmarkRunner.Run (typeof (Program).Assembly); + } + } +} diff --git a/Benchmarks/TestData/messages/startrek.eml b/Benchmarks/TestData/messages/startrek.eml new file mode 100644 index 0000000000..9b9454cdde --- /dev/null +++ b/Benchmarks/TestData/messages/startrek.eml @@ -0,0 +1,4548 @@ +Return-Path: +Received: by greenbush.bellcore.com (4.1/4.7) + id for nsb; Thu, 19 Sep 91 12:41:43 EDT +Date: Thu, 19 Sep 91 12:41:43 EDT +From: nsb (Nathaniel Borenstein) +Message-Id: <9109191641.AA12840@greenbush.bellcore.com> +To: abel, bianchi, braun, cameron, carmen, jfp, jxr, kraut, lamb, lowery, lynn, + mlittman, nancyg, sau, shoshi, slr, stornett@flash, tkl +Cc: nsb, trina@flash +Subject: Star Trek Party! +MIME-Version: RFC-XXXX +Content-type: multipart/mixed; boundary=Outermost_Trek + +--Outermost_Trek +MIME-Version: RFC-XXXX +Content-type: multipart/parallel; boundary=Where_No_One_Has_Gone_Before + +--Where_No_One_Has_Gone_Before + +You are invited to a + +*** STAR TREK 25TH ANNIVERSARY PARTY *** + +When: September 28, 1991, 4:30 PM until whenever +What: For those interested, we'll have a rerun of last year's season-ending + cliffhanger, and then we'll tune in the season opener and the 25th + anniversary TV special. Prior to that, if you bring some food + we'll have a pot-luck meal, and general merriment before and after. +Who: You and your family, including kids of course. +Where: 25 Washington Avenue, Morristown. + (See Nathaniel if you need directions.) +RSVP: 993-8586 + +What follows is some Star Trek related multimedia mail, the last of which will give you a chance to RSVP on line. + +Live Long and Prosper! -- Nathaniel & Trina +--Where_No_One_Has_Gone_Before +MIME-Version: RFC-XXXX +Content-type: audio/basic +Content-transfer-encoding: base64 + +LnNuZAAAACAAAFmUAAAAAQAAH0AAAAABAAAAAAAAAAD////////37+/r7e/z9/f7//93b29z +//////v37evv7+vr7+/z9/97b2NdVU9OT09RWmFr9+Pd3d3e4+vt/29la21ra2lra3vn3dzn +9+//YVtaV1tp9/PjzsjHxsbGy87P2ef3c2dz/+vr59/Z09HR1dLR2d7n/2lXTUU+OzY1NTQ1 +OD5ETmXf2dLP1dfb3O9jYWNhX19pb+/ZzsjIzMzP43dfVU1RX2/bybu6u7q7wcjN0+1ra1VR +Y3fv7+fZzsS/v8LEztXW62FPRj03Mi8sLCwsLTVFVffLwL6+v8XFy9b/W1tdV1RVWVtr2srG +ytXj/09LRT4/SVtd2MC0r66trrG2uL3I0/dOSE5WWVxn99nGvby7vsfR4VdKRT03MCwoJSYn +JyowPURb0cfHz9lrZ2tZRktdd+HazcrGv7iwrrC4usHR5W9VTl1pd8i7tLSztbm/xcrb91dF +Pj9DREhXb+vQv7y7uby/wsr3XUQ7My8pJiYnJiYsOEFK38G9vL7Fzc/R72f/1dXe69/v99/M +w87v919NSUU+PUVMTme8s66urKyvsrO2vcTNb1JVWVNLTmfr2szKx8HLzs3XY0o9ODQtKCYm +KCYoLjpHacnIx8fI1W9dU0A9RU5nZf/Zxru2rKuusrK3xM/cb1pvd2PXu7Ovr7O2vtVlS0M9 +ODM2Oj1ATVfr1cq/vbu6ur7DyutSPzoxKiUjJCUkJS48T+29trSxt7zCyNNYS1FYb+/t2c/H +vrq6x9HbW0E9PDg6QE1dxbGtqaenqayxtbnC3FFNS1NeZ//c18/SzM7Pz/ddTktAOTUvLCgl +JScmKCw3QV3bvru2trzCyMjrT0hTe+fXy767urCsq7G4vcn3WU4/P0NJTs+6tbS1uL3Oa0Y/ +PDcxMjg+SlBb3si8urq4uru+yNnvW0c9OTApJycmIyQpLzdFY8i8uLS2urzC71b/697j2sfC +vLivr7W9xM1bRT88ODxHSnu8rqyqqquvtsDXd1NGRERKUVphX+HTz9LV2t/3b1tNRDs2MC8p +JSUlJSUsND1I2MC3srK1urm7xldHRUtLTF7Vyr61rKutsLa8zmdKPjpDRlHPt6+ur7K7x+FZ +Rj86NzU3Pk9cb+/Nvry9wb6/w8jV/1pFOzgzLSssKygoLTQ9SNrHvbi3uLq8xNtMTE9eZWfn +x8G6r6yttLa9ymdGODQ1PUBHzrWtrauutLrC2VlNPj1BRE1be+/jzMLJzNPjXVtKQDo2NDEu +KygoKignKjA4QGvIv7u4uLq8v83hY2lvc+/Ovrm2r6utr7O7yetURzs5PUdbyrevrq+zusfP +91lEPjs5OT5FTFBd98zIzcvKy93ja1lPQzs6Mi4sLCsqKzRFT9a5s7O3ubm9vcPnY1dMS1NN +XdfMw7y9x8rI0V1VT1M+PUdvz76vq6+vr7zCy9VZTkpKTERhc1lr0d3Sy83azs5rXU5EODMu +KykmJSQkIygyOkTOuLWzrrG/xbu41s7I1+u9ubmyrKytrbS7uuFCOjY0ODlAc8O+tbbAyM3v +X11LRkZERV7f69PPz9vZyszKx8DYy8vrUT83Li8pJioqKCs0Oz13u7W0srXHwsXcUVQ9PEZE +QE/XzsC6uL28xcHhRz9HQD5axbavq6mssbC+z+PTRzI8Ojg700ZFd9dN47nDz7+47cjM7ztD +Qy4qLS0jJygqMDNP38vPu7m8vbq2vsfG19fXzsO1tLOvrbPfu77VO0xFNS9CQEXCzL+3rcvY +4108Qz0wO0jj/93awr7VwLW83bS6wtTDWzowMzMoIyYpIyorLkJd19W6r7K/vLH/zrz3Pc3M +P2O/zky5s9HIr+dMPkIvNkpM0LinpJ+fo6qvvU5LSzYuMjk4SdDP3sO9z8vFTzZHQi49U0Rd +zMnN59zrbzA3PDsuLi0xKTAuKz3rxb6urqWgsbe4n6Sqt6rGLTI2Kibrs8XBq8F7MDIfJCEn +Ljtfr6ain5+foqK1w0IvHyAoIzBByc+trKepq7HGZTErHx8fHx8fHyAnMkLIr6ifn5+fn5+f +o6Cx78HhLzRTPylHMysrOiwmTEU4P7Pew7P33atJSa6nc76sr0i2rMNevbs438hIJVlQLyx3 +OCgtNCslMTwuNOPQyLKtqqerrK7GzVvTNS0uRSwmRdM3T63FrqzM377eOT1fKy5XREjJt7Oq +sLKtqv++wUfXwUss3UYvxNg8c6zLvrLDv75eS2suNy0iLjMfJjsyPa62yq2ipsyrxUq+zT5O +20e5PTK8yz+8sV/VZ7NFS09NMi9UTTxetFzIu96yvt+7r1ezsMXMa1tO0z05KT0rIkAuMEn3 +QLfnabRWSkfJTDo3yk9DLN+qv1/RyUbrU0lFd0W5tr3Bv7xPZ9EwLsbEPFuvvVO+q7Cup7K4 +Y080HyUgHyMmP0BXraOroammta3Jv0tLOygpKT5EL+mst8q7q6zv0cu1UUFZP003LjMzXS00 +RkYq4z0wz0M4QrNFyrNIvsS3T7HG07DDsrasv7m/XbprOzFILS48KD4wRT3XO0TEUEjJy99M +3bPQY925RbbEa3OvQzrJOsTXTOvJ+9e/68FMr21aRMbDQcdCxMy92a9OwNXzX0bYOlVR33dO +rcDjw7V31Uc8d0w/OzxTUz4/VdDz99/Ore3G78xCPjxBNi8/Ly85OTMywT+3b83Gzu3Vx0lD +70nIzFHIt669966wU8RMUelET0DLNWdMa01ttmfBP824Ok9JPeEw6Va/O2e8ULZS07XHU7rK +uljVw1vXa/tfQ088STlLSmPnzGO/W7/Wx//TxDxNXm8x/85D30nP5bJMw+PNN9Y9V1bBUc8/ +7bG94cO+zmvHZ0zLRz9CQjhZSztAc0TOXjhO38FTyM1XzXNH5z1JNFMqT0RfTdeyXa/pwcXI +Y1fS/87bX9nKzGf/vuHHz/e4T8DzuUpX73vFOs/Nzcr/yOf33kC/d9tcYchP671PxNDUSsL3 +uL3VxLXF+8tMS009KjM4LS45OkTjMtBZ3Ei6wtFKb0rBb0zIxcg6u2HP10vM1O8z2M81QzbO +R8ZYtMzPU8vPz1HKU8tFYWvM90PdVMZY607HTkbcP8c9zuVFVDrINcw/QzzzZ0q9yeu0uLnJ +u8NXb9rV+06+Srbf80/Zx8/USctaREndOE04XGFvwsW367fR3L7ezzzeOfdEyEhfw0vBd8xD +xmvOWlNj5+c+Uzk+ODgvQDM+NUE/WVX/yMnAx3fA/7BlvGm+Ub5Rxsq+xdW988XhVmNGVzlL +OFpjRMLTtc68w9PMy9vT7VnY8+//593aXc3Wz8/I28vv4UHHUVlMUDxANUU9OktJa9fFy8jK +w9zM49nKTM5Zd1lR90/cXdTdz9vX3l5jUT5VTW9P2b++vbq/wdJ3Y1dKPkBGPUM+TFlvWs/F +083Hw9HVzu1nRUg+QTU2ODQ2MzpNTGfcw8nLw8nhx9bO3cnVyMrAxrjFwL3Cu9vC92dcQ005 +PD5BS1Prv8TVx87I1Gfe/9NOa3dvT1X3d3NvzM7vz8jI02drXVM8OTk6NDQ2MTw+UljN0MC7 +v77SynfMZ1djUWtOY3PX0+3ry9Xn3ddlWm9LW0pIR/vdyb6+usPB2tTNZUxJUERLSllXa1nv +x9bP2cfHx8rK1/9NVkM+NzM3NzM4PFxl18fFv8DFy8nMzszfxsXHzcTBwcjEyc/b299fR0M/ +PTs/TvfUyb64usHJ1W9hU01VV1JNUE1TVG9l49PcyNHN193r729OQ0Y1NjQyMTA2NUJKY8rE +wsfCxtnZ69Tr39nj7+/OztXdysbP5//vW0NDPT9ARf/OvrivsLK1vsPP0P9eU0peWVFUW2v/ +a9nZzdXO1P93d29IPz0+NTIxMC4tNjtFSf/TvLu+ubu5vb3Nztfez9LT19jLxczb/8f3UkRJ +Qz08QEpV28u/wcS/zdNvVE1fUD9DS0hMW13zzsfCur+3u77Jzd1PSUc/ODk2NTAvNzs/PmXj +z9bJzd7N1MzP29fMydPIxsbAvr7B0cjTy2fnSkJBQ1lRzce+t7u9xMbTd3tXTEdHSU1Tb9nb +6c7SzcjEyc/lWWFKOzk4Ly0uLSsuMkNPVM3Dvr28vL+8u73IzcTFzNDGy83X291rX1FGPDo+ +Ojo5P0Jb28C/vb3Ix9HOzNFzVE1VT1lYXWNn59jNx727vb68ydlfU0s/NDAyNS8vNkVGT2fP +zM3JzN/v1t1nb9/KzNPOzGGryd/Lw06zzMn3XNHb3TfG12dfsfPCVVfvsllvQkfDP8c64+NB +Ub9Ew9xc0+U8OL9K2FoyLjstOi89NOsuSz22ScPOrsixY8K/+04/47/e373FzcNQuMrTa2Vd +Y0AsP0M4z7a7q666y6v3R1XhPdZLNMjHQN3Id9m349m3wTTFRMI80zE+RTNfWVwsWka6UVlG +sk3nv8tR9zYwwq9HONTJa008Zaavus6tu1cxLS8sIjDlvNfJpqemtr61tjYrNiciIB8nPz1Y +q6Kon6GjpajBYfcvIx8iIx8nHys7vbemrZ+rs03rMy03Vc2trK+rr9c8QDo0PeW2tc6zpKW+ +yMXOTyYkJygjKy9GwaijoJ+fpKqryS8/LB8iIh8gKT0+Pb+wraOgpK9r4UY1LjXJwKu1tNVX +KikhHyErN0vIuMasoa6/zME6LyYuM1VDY6ynp6Ofn6WyxunfNR8fKB8fIyYp2zU5ta9GwKOf +xdGtrsZb2rGgpK2sqrc/LSwpHx8jMTQySc64rMfBs7c6PU44M2PZyq+ioqGfp62rtd3dPScu +Kx8jLiQr2z8uY6jRO7Gfw0ZfwMJPS8WiprW1r18tICQiIR8q08x3tKiuqq3S5VsnHyIoHy89 +X66foaSjqL5ZSUQ1MSk3KyknO0w7R8GzoqlvvqilTe+3vltS466hq7SutjkjJyYfHyAtPt9d +rau1r6y43U0sNTctNMjVZ6afq6yrvddKLC1FNjM3PS46RitnscU9rqZra6ejXVGzsr/Z072k +rNDOyDUfHyIfHyAwyb7DtJ+rw7W7dywoKy4rL1C+r6qfoamptNNvTz8/Qi45TCchLln3PDj3 +59/E+2Oon6/rqaHDP9G6p6/KuLdVIyInJiIlSry/ya6tvLnhz1Q1Kjo/LTe5sK6mn6Kps99v +Pi0kOD4vK0cyLEQ34cG+Ta2rrFU3UKeuNe+wxjI2R7atxdjB3SkfICsiISjntsLNqKOuX8Sx +xy4kN1xENc6qqKqmrbbHOTs3Ki93Oj7HUTk8Zy85zKpESK6t5+t7p6CqS6yoyDhPxcW+Tklh +Nh8iKiciLty7tr2vpalLSMPILC9fXE3z27+yq6motVhpYyotLixM5TQ+tOM2O+/7vDQ7vai3 +udA1XbSsVEG31zwzOruvs0/d0zghHyMnKitZq6mpt8GrsTQz7eMtM8/JtM5jwKWjrLOww08x +Mt1nND20uzUvSW05P08+zae8bbmhs8Y/PrGt3yu/r9UyV7atyTdT9zkfISs0KTTBqrG/taev +Rjvrxz0wX8LOb//BuK2ssrXYQTA0LixQ1c7JW+9CNSw7SzswP0Jcy6Owtq6zyz0rWa/nLT26 +ezwzS7GtzTFBUCkfJDFHRMKtn6evra/HPzE1NisuRqzXPGOyrq+2wrS4vtfDSDxNX0tGMi84 +Tj4wOrq30dqmp846wKqtRCc4vksvWq3JL0U3OTkuObGvTzbVUzYlL2vEvbSfn6Sps7zAVywn +Mjw6P0jbwUw7x6/M22dDX0gpKD85Nzw/TmlMOUiyxeO/qqbDWdW5zEzrrVsvNUUzva+v6TpR +MjQ6Q9exvP84MCwpKTN3uqyfn5+fn6KtvD0pKSsfHy42L0e+xrymuP9P8zgwQELv09c1Lyk5 +NS04tqaosbGvrcw9Pau0TCy+v+tALzTcwikqa8YqKTBNQj1Dt5+qurmzYy8oL9O6wa2fn6Os +r7bPLyAqLiIgLC0yTT1DvbHL1VlXXVUyNs/GRlG9urvD47iuwsqvqq+80ruqXzT3wzw5Pv/H +P1tfOSkxQDJBt7nVQEA4W09Uu6irzcvfbzAtQ72/uqafpqyzvVEuIB8fHx8gJCo3QLympbmr +ornLytvK1jo/+/83b763wK2oqa7L78/RRT0/dz4xLTg5N0BZSFH/T2d3b9RLzcbbd2/bSUnr +/1V7wcHEyr22sLm2trC4vcZ3Ri4pLjMrKjdDOz5Nb9B3Qz1ZUUI4TsvK1bmmpaqqpKesr7W1 +tM1f71UvNT89NTc3Ny8uNkU7NDg1LzE3Pmm/ta+yuLGuvr+4vMXMVUnZzVFjylZFQzk1OTQr +MDk4P93Pv73Bxs7zSlVv693EwMbCwr+9u8zR01tJPkNQ28vCu8Lfd15JPT5Oz8nfzr24ymdr +zk8/Pk5PUT5D2dNBP2fX3evPvrrRSklXRTlB/148SnfF0e/jy8pXUt3aZ+O+w1ta52nn72Fv +yc/3/8jB2/fGvcrvZ01GPzs4Oj88Slr/WGvOz9nEvsPlW2tINjU/U17Z083Jz93v3efrzsft +d2tIOj1EU2HZx7u1vMDAurzC2tO/y0lBTkQzLC82SURNz7u4vr+7t73BvbzEzs3O0dLzW/tb +SEpNSUxVZevrTz9KPTI6OTc8R1FOTkxTXV9VXffr187SycXNycnt2cnL0bmzubO3vr/DXD86 +Ozs7PkZEODU0OD5PZ8i6u7q6vt/dysjvadnHyv9U08zZa8jEUWM3PD0uLDU+S0ZMVFdES2HL +tbKzs7Czs7W9z9/Z1mNGS2vf/2Np2Ug5NDw7NDc8Zelnb9fLzM6+vLm9wr7Ed0lN4/9GQkJB +Ozk8RlNNYcbHzMvbWe3W68zEy83MbU1KTz5CTU9AQz9ASVFTY9zT1c/DvLm6v7vAz8vL1Wvp +7//ryNZ3/+lVUVlbb+fd287L2V/e1eNzX0pKRjk0Okhb5c/KytnV3OPzX1ljZ1NGQUNZ59vB +s7W8wMr3b3dfT05MXVtfY8a8xNPRzuNIOjg7PTk4RfdzW3fb3dbS07+8v7+8v8PEzN/n81VG +PTMxNDU1OD5AREtFSFv/3M7CxMXI0tXJxMfKuLi7xOvnztfXzdRPP2NfN3f318jYyMbrU0xV +5/Nf1cC+yMvf6917e+fba09VTUlEP0FVV0hBPzw+PkNES1Nr7czZ39nIwL68vMnJ7Xfv+1v3 +08vT2uv7/11PTldJPTw7Okbr2My/wMjN2VdaWktFWe9hXevjy8G+vru3xM/VaVNXSj9MV05M +91FJSlJX99ZvbWFP89X3V83K0W9zSE1NUf/Bws3LydTjyr3IyMj7UfdPUW/U78i+yuFvT0z/ +a1FOXFVcT0A9R1dQW+/z2+drd8rB09TK2U1LPTQ1NjVHW1tSysXS78bIw7q+0v9PR01PU9/J +xMnD309Y3/db691VR0U/SFvj0cDCy9vtNELKL9xWPcRD1dNZvNdrubjf0dfp18nPzNPY/1BI +PTg6MT7CPGPIxL5HRePFxtvjSt9KP2FZe83Jv9fj7U5PXlHl2XfvY1ZPS1nTyMC+2GV3Xmvd +98Y3vrA9PD88uuPRr3vLzEh33l/n3cXDylFPMzE6LjY9TENVa/fny8G9tLfC1N1zOlc+Y9Pa +uMPNx3Pj42Pr3lNXRj53Szaz6zi+P7m6NsRBQbc+XctXVkvczLfFusXd1VxGymHLZ9Xrad4z +Oj00TCphxy5S1y/PRFm/39bLZ0jZY9+9U7nP1k+/OEPFN8HNSc33Mki/P89N2rnTx99Kx1Xr +Os1fyUk6uz1by0mzc/fE9zx33Efc58Tzx0nlwTjKWzpX0MM199lHW7DptOe/30vPd1ZExtTV +ucA7uz/JwN9lutVDSEtDU9/SU7tBzdRAvE//1z7GRllMO88+uU1ruW+zwUvrb0zEQ8ZLS05W +PD08R91Gb0ha11XRRcJrb7TXVrpLQ8df17xnylPvvUXKukmxPlS7Ob9KQ7hD3NnIwTjA1Vuy +Se++81Tbb0Ln31nhzcfUvEbGPM7Pu1S+tjy4Pjm3O8zIUzbE5yzDTVO9vTu1uz62UD27VU+9 +Z3fMzjm+bze+Osq+RDW+7z68OWG8XF9I2zjRNvdc2U1E2Tu+dz64W+W3UVHKvjXF50S/2TDL +NzfPVTu7SEfITvPn0E292UvKXbhB29W8zle067/3R1awRb/Jzu9t3DhP1zXAW8rYrtA8x7tL +Rq9Xd+9ETdlXQkXAPbzZRNpZv03Ax8tLZzrjey5Ga8Ezw1s30/suz7bdSk7bWN9TPbtMVdFl +2TP/TsvFPLtZQ84z1Ek42s7nSbl7V8V7V8NvxVE/1VxRc2drwW9B2rNKT8y9ytXRw8FUQsTR +PURbVjrJPj5GXLFzTrW4zTvMvlLr90S7e0hDtU1GssnVukfY50s843dEONFTzOfMt2td6dHl +PzTjPys8Z0BMXdm2ulm5u+/nuMdO3N1PNkhVLlVELzJNWzHZxeO5uv9Z1ckyMlHtuzfWpbNd +16++RjFR0TUrPbzvLNuyVDSworJCr6a6RSlCsc0mMb3NMy3Nrq/DrKKnwWnntDYqQ0g4LTy2 +vse5srbeZT03LCcrMy4yPMO5t6ymoaWvsMZWQi8lJS4qLC03S764/7mpvDzrvy1ES7rWRUA/ +rkM0zavDSa6828XBPjE9QzD/bS7jt2/zzz1nuk4rQctBvUMxsq8+K/fKNSguurbPOUarrktG +rKGpvby0rN83Q984JSUuT8LHT66frdwww709JUzSUCsu662xSu+soMMrQK/BLCvvs7Q+L1u+ +ySoqwbIyMMdKSHdKy7CqX8Ct1d3tyMDNxkwxRTAqLO/dOzZdVUgvM1fRw907z7DBMjrPrLZ3 +26up1FHMvus4OExLMi1E49vnwbOusWHMsbBLNsm2Nf9ZLza8MSjfrDouxq3KY+k7Qcc+LNOv +38quvju7p61rLTq8qUclOLRnJyzXpK4zK8qtQSc3q7dKLVa4tFkqPbyqazzn685ZOzXDuj0q +OU0+LkG9r7U6OLGkySkv6aOvMi65o7s8JWmosDMsuKvZKTTDqtErKVOs0yw1rrMvLduotNgy +WKu2LSnAq9U2xbmxxTAytK82N7VrSrz3LsusVjWyyzHerzguxP8oMbG+NkW03TxHWEy3tz06 +ualON83eNkbAQ/Opu109PDU8S93fwL2/Uyouv0Ex26WrTURAPM29OTGzrkUtyaq+ODk7ratR +K0yyOSY76biw1SdErdEuSv9YrK5ML82nYzNH2XfB1TTzralBM2e090EsUautPzHXres2LVOz +sb+7V1e6QicnOGW7q9XjrsApKsvTRW9lyqzLJzi+vT8xN8SnxjQvx9dFNEXNwO/rvttTS0Y2 +PK+2PE/APWWyNzO+sTtcvddvvkMxX8//QUq00tjEucVNLylQwrxOMryo/0W/u+fRby1Lrbkt +U7zN2zw4uqe0Xc7HSigu3aas3F33z1k2K1+qqMo2O0P7bzUyR7S4v9NDTMi/4+OzxEztZ0Zf +WzE6uPM0OfutrcwoLbiq2TnTzsQvKDi02TvfwSopy62qwSgiVapWLDG3oao/Jy1Ctq3NRV62 +1WVLPz13rr1HSFlD0cBMN1nX18tGOcymwk/LsbpHMig2wbLWW8Oup9EsLOmvv0UvwK7KLTLN +sK3IOEXHxzwpK+2svG82c7SuVjlWZ29lzlEtSbrKP8O5QS5vw0/Jsj9IvqzdLiEoxKm0NCw1 +O9y+R1OrqNs2JS/BsbTvWee/w005O0e7rLhISbi8Py0+58vGa1PQyc7XU0BJa//Hs7nd/9XO +zWtCPkvbx8JnQsSzx03nvcXvYUo3M0xb69H398e6y0Q/W9O5v1hC0Md3REY/X8nhXFFbX+ta +TsW6vcfGb07XzUxE5+9PRT4/Ozc228BnPUA5U8hfR2W/zFVRP0fIvszvtsT7W+lb48LB3s7B +RjIvUOtPW9VSO0FvVVzRxe/X0/dG97zLyLjDy72270Y/S1bnymVF/7vC3drJzffdZTQuOV1z +41tAU7e7Z+HDe8u360dOe0k/Ni9Ou8/rXz1G2cXXw7/OwsRdRFF3vMo8NlVvV048Kk7BVztJ +RDvdwVNPycztz8PKv722sLi+02FCSffRWEM5QVdGPmfUX088OkvnvP89PcS9zsa72NPByGO8 +tr3tX1tV61h33VvfTzw+WktJzspJPVNYVV1vybu9yHfv/1Rdzru7vca/YTxnzsfezM5jd1dv +XWPX619j+0NLVDw+TUs/Sz82Nu/rXdLZY07r1OdXTlvbwcPfXFdU68jD1dTW1/vfa09Vz9dR +Rv9WQDdNzrWsvlJO08zR1crEvLvETjk7S93N41tnSjw5RWfMxVw9U/PjXf/v5d3n0dF7d+vL +wL/FTUvXymvvUE//u8FDOTxFUffvTU5hb2VRW/9d+9nGysr3R0nKxMDMVV1Y51Vj6+lMRkZd +829nSU/Kw2dET1Hc3crQ3e33/0pKXPfvysLJ2V0+PDxP0c7ad1dIRWPT08q/u793P0ZKYcDD +Y1vnX0BHTs64uMtj3s27uLu4ucPN70NCSFN370tPTEBBOj1Zys/nTU9XTUZpv77H70lHZ/vO +11/vx7/N90xGPEbjy8heQz5EQU1NSWvVY0c7RVPnwsjJy87nXXfDtri6yGdJa+9Tae3r5cnT +TTk8TNnAw15FW95HUdm/ytRdSV/nT0Rr1c9lPzgyP1H3wbm5ub3DzdTdw8fvVz05Oz09Rk5b +/29rb1rvyr+3s7i+0Vk/PUzMv9FdTEpLU/PLxcHHyvddSEVWe3dTSkpJRDo/78G/xdNrZVdB +TNfnY01FRT04Nj/NvL/O4+tvUlnXxru/yVtFPkJt59HFy9/pa1Nvyrq4vcTra1FNWuvNzMvd +a15PX9LJz8vr/2dPRU9r3tvdb0U8PD9Y187Wd1FNSkpV183Cv7zFaU5c993QXUA7NzY2P1/d +4d3ra29ZV823try/w8fj49fLxsvnTkA9PVHfysfJ111NPzxDX29fU0xJSlRjzsK8ycrjUUZV +XWve2eNTRkRGTd7JysnMYUpGRlnRx8nVd11KSUVLb8nAwczT5djCvri7vs7Zd0dEZ+PR019R +TVFNXtfHzNXn/2NMR0JU993pTEE+Q1Pn92NNT09XTlP/ycPP3F9tR0VJZ9nZ1+NJQUVVXc/F +zVtISUlh68nCwLy/xdPd48y8x9hvU0dEQ0h3zMrU3/9jTlD3ycrnTkVAQ0RI5cbBxc5lRkRc +y7/AyntNQD5CVtXIy9P7Xlv/49/EvsvaTT48QUdZZWNZc2NVe8a5tLW+ydNdSEdLb9jvYVxf +WV9ryr27v8d3SURDTf/zW0tDPD9CTWnPz+Prd0xIS0//09leV0ZAQEvvyMrX3t9v7+fp0cnf +X1lGQExrzL68wMbFy9Lb08G8xe9OQ0JGV//XzfNNTEVET2PZytfvX1dPU2fevri802tZSk5N +Tuvj/1xIRUZZa93Jz+9ZSUlOX+/PzOdPRkE/Rk1f0tHb4e//59XEuLe8y+lZSkZJc8/P+09T +VV37387ExM/hWUlGS1zv4e1bT0xHSU1l499dTUhGVXfXxcDE3Onna/fj2NPX41lTTUtUZ+Xh +33tjX1133tHFvL/EyczIx8nN095zWVZPTlVfc/NjTkhJSkhNUld3d19dXXPp08nAwc/j82FR +TExNWWNZU1NQV2Vt99v3V1RZXWd38+vvY1FQT0tTa/fa3+/p1dfLx8PAwMfZ/11aZXf73d/z +5/NrX2Nfa9vZ921jVFlfaefd52ttb19WTk9TV01MU1Bfd+vTx8jNztXz493l39XfY2lfU0lC +SE5dZ11n7efn3M+/vb6/ws7/Z1dv721TWU5MTlFSWf979+9tU1FOW//nb/Pj7fP3/+/f5WNf +T0FESE1X7+fj2/dfWFVb3dXb1dt3aWNhb+/pd3NhWWFjd8/DxsfGyM7R0c/K0eP7b1RNTVzj +yszn4953YV1d99X3a2taT1FWZ9jQ2+t3a05HSkxf93dfWVNUXWPdz+Xv/15bV1Nj2dLd+2tX +UEtQZ9HS2c7W397Wy7+7wMjVb1VPT1Xz4/drW05LTVRt0+ldV1JHREZT39HT1917Y19v49nf +Y1RTSkZKV+HFyc/T71tRUWfRzdfva1RNSU7/3dxnXF5fVl3fxr29wcXM193f18zO52NVTEtL +XuPM2P93XktFSFPr22tbV1BTUWXVys7vWkxJQT9IY+PpZ2dnY1tn3cvK429ZVVNRV93N0mta +W1lPTunMwsfN0dXX3s/EvsPO3GNWTEtZ18/Xb2FbUU5P5c/L3W9fUk1JUN3Iyc7nb19YUV7b +3/tZTktLSlfPw7/L2/djVU9b18zT61hJRkNFXNPV7WdYUFFd38W7u8LO2+tjc9nDx9l3WkxJ +SU3pzNN3U0dDP0NV69brXlVOTlNf0cPK1ltMRD9AS+3X3W9jU01LXNPJy9n/XlFMTV3azNbj +Y1VKR1bVwL7AxszX5evQwb7I1/tlTk1f28zM329VS0ZFV9fMzttzVUtFVd7Mxcvd711JRE5n +9/9WTEU+PEFrz8nM1/NjTk7ry8XFzm9rTD9HWefa2+9eUUlL98e+vsTXbVVNVtXDv8LXd1dL +SmHn09V3VUc+PUV30c3R5V1dUE/dxsPGzV9TRD5G99rT1d1vVUtMXNnIy873Z0pGTnfX0dj3 +V01ESe/Lv7y+x87X79fMxsPK12dTSUz/0snK2FtLRT5Eb+Pb33ddTUZKX9TFxMbdWkhDSVtj +Z29UST49Qlfr1c7R+15NT+fbycXG0OtOQ0hf697X22NORkvjz8rHx9VvU0dY59XNytLfZ1Zb +383NzM53UEJATO/W083db1lKVdHKxsfOWUs9PEln3NnT22NJQkZz09XV13tOQj9O39TT2P9b +ST1Ia8vGw8XM3W/v0cK9wcbdXklHUtvMy9HhV0g+O0lc6+//XUxBQUrvycTJy9VtTlNp2dnn +Z0xDPTtD+9bLzd1vU0hQ98bCxcnha09LVdrLyM3nXU5DS9/Iw8LJ62tMSFvhysbH1/9bTVLX +xcHCyfddTkdX1c7Ky+1fSUVLb87GydNvSTs6PlNz5+tzU0M/RHvOy8vNe1RCQVXj1M/W6VND +QErvysG+wtJrU1nVxL++xutPRD5K28zIyedYQTw/TfPVztVdRjw+TOvOycbYZ0xLVdjIx8zb +VUc8PUxv0MnO22NLRkrrysTFzW1LQURd0MnJzON3TUZZ08S/wMrZV0ZHVd7NycznWk5JWM/E +wcTWa1FGR2nbz87X/09DQ0vny8bK1V9IPjtGZ+/t61ZGQT5E+9TIytHvWktJT9nJycrnWUpH +Rm3Iw8HF229bVmvKwL/H3WNMREdazcPCxdRnT0hJ/87LzeNVS0JEWdvJxcrnY09OXd/GydX/ +TUE/P0rjzMvaa1FMRk3jx7/E1ftRSUNFc8vL0ndSS0xP98O7vcrfZVVLV9PGyONhU0tITV/M +v8znV0tFRU73zczfZ1VNSlfvw7zC2W9bSkNCSf/dXE5JREFCS+fHyeddVU5NU/PNv813Z1hP +VV3jwbzJ1d/v//ffw7zA221XS0dKYdfAzOfnd1lSVePHx91fU0dCQE3byc7/d19XVFfjzch7 +TElDQkdMa8vP92tnVlRb5cS+ym9bVEpHSFfdzHtRUUxLTl3PwsfZ6/dnX2PlysPVa11cV1t3 +28XE3HtnVlFTXuvW5VtTU1hl68y/vcXf721OSUpRaW9RS0hISUxf3c7Q91pbWVxj3c/Jz/9v +d2/z1czEv8zZ4+Hv49fMycnXX1dRTk9YZd3cZ11dVVll69bP31xRSkhMWm/TzeN773d773N7 +615FQkNESlBd4czV7+vt7+Pf1c3Pa1FOTEtMTlfnbU9NWGfz59nJw83f5+Pe3ePZy8jf8+fr +5d/f08rX/19fV1dPT2n3Z1FXc/fv7dPIzOdlYVVPTUta92FRTlZdW1VZ7+F3XG//d19d99va +b2/p3ePr3cvEy9LPz9XvZ2/d41dOVVVPSlRp2913d+//Y15r599fV1thWU9f18rM3dbR32NT +VlpvVUlKTEtITGPUz9vp3ed3XXPbz9n/e29jUU9d89fj79/n/23318bDytfR6W9de9PKytXU +1ON3Z3fYz+dvZ1BIQkNNXWdbd+t7e//by8fN42lXSkJDS23vc21vY1tPVu/Y3O9vWU1LTmPd +0+X3/21rW//Xw7/JzdPjXVVr2djhd15RUUpJd9zT3f9rXldQb93S3fNzW1lPU+XKxMbN4WtV +SUpdaWtYSkdGQUhezMfN0+13X1hr0MnO2G9WVU9Md8rFydPr3fdd6czBydn/V1FJSVvOxsnW +92VYTVTZzM3bYUxLQkJW6c/U43dhW1NZ2cnL12lNR0I/TOfT0uddVk5FRV/Z0dxjVUxEQkrn +z9PnY1lVVmPIuLW6v8vZXU5d3czK2OtnWExLd8nEydn/W0pHTPPPzuVfV05ETN3JwMPS32dI +PkJc39rhb1VMQkVvzcjI2m9fSkBP28zIzuttV0NFWdPExcrZ51dR98jBxM97T0U9QGXayMfV +62dGQ03bycbR71dHPkBc0cjJ0etfTkhd1MvJ21FJPTg+TO/Pzt1hTj8+TenNzdJrVEVASuvK +xMXQ72tQT9nDubm9w89jTlXdy8jI0/dVSEdrzsfGyutZS0NId+HT0u9XST5DT9/Kw8TU/0lC +Rln/3dx3VExCQ2fby8vS81lDPkpd59nV71RGP0Jj18nGyNXpYVfdwr6+wdhtSD9GX9zNyMnf +W0M/T9/QysnXZ0tFSfPOx8XD1u1RS2PXzMzN2FlDOTpIb93W0XdORD5K+9PPzd9dSz9I79HJ +xsrYY0pLd8a8vL3D2FdGTevZ19Xcb1dGRHfPwcPF2PtKQkln0M7P22dJPj9Y1czM0/9TQjs/ +WPvj3/9fTD9KZ9HLzNF7Uz48RG/b3N93VEQ9QGfSysbL191dW8+/urvAy+lMP0Nn08vKz+Nc +S0NW1cvLzfdVSD9J48zEwMjT51NSb8vGyc3/Tj89QV7Xzs7ZX04+PUlr6+f3V0s+PERb08nF +zetVSkvnw7y7vMjfWktd2c7O1+1fSD5AVc+/wcLPd0pIT93MzM3bX0Q+P1PXzMvPa1A9OTxI +Z+/l+1lKRkzrxr+/wdddR0VL683Nz+NWRz5Fd9PFwcfP/09OX8a7vb/J50tBRm/NyMfN62NI +QU/TysrM32dMQENP1cfGxdHpW1NZ28bEx9VZSz87R1zf2NfdVEM9PUdr5+9vSz86OT9j2dLM +2HdfVmPLvrm5vMHPa1lnz8vR1XtMRT8+T9XJyc/vWVNMV9jLyc3b/1RKTVvRx8rP71VDPjxK +/+Pf71lQSkxf1cK/yuN3VElNX9PJzNlhSkRCSO3Iw8nX92ldZ9PDvcHU61FGQENdz8nN32VT +TU1fzsHE1mtRS0ZM783Gy9z3Y1ZRW9fFy99TR0JARFXVy9NrT0dBP0Zf3+VdS0VBP0RN1sXS +6WdeZ2fZv7S0vMTL0+v/28vCz19OTElNU//Iwdp7W1JOUVnjysxvWlNTWGPdybzF43daTEVD +TtnO71pfVFRXY87Axf9WT0pNTF/bxt9XTklHRkhdzszna2938/fQvLnG52dTTExMb8jG529r +X2Nbb8rC129SSkZHSvfGxNh3Y11jXmvdyeNMRD9BRUdezszvZ1NNTk5P88zVa05LSkpNa93K +0/tpb//r3cW5ub3Fys/V3tnOzN9ZS0lJTVX308vjY11dXF9r49Hhd1VVVV/73czExuFfWUxJ +SExf/29XU1Fca2/h0+VjTEtLTlRb8+fvWU5PU1tp7dHKz9vb18/MycbGx9xfUU9TU1nz2+dh +XV1hb+/hzs3rZ1dXY2//48nI13fv49vj7+vjX0tGSE1bXGHn2f9fYWf/92/t0dNpTlFUXVpb +d9vvXF7/3NXZzMDAxs7V19Xbb+/Z41dRXGtvXV/r3P9bXWd7X1FY/3deUVr/3Xdr2M3VaV1V +UUlDSF/va1tdZ/djX/PX52tVYWdfTExdb1tOU1dfW2fjyMLHyMbBw8rOy8bO811dXU5IS237 +Y1ldZ15XXf/Mzt3r7d/rd2vRxsza39fa/11d9/tVSktOTkdHT//ta2dv/11VUf/j71hTUk9L +TmPj29/Z1NPW19HGwcTK0d7vXVJb8+tvaXdnWlNb693d7/P3d1pMTmX3ZVxdYV1RVuPNzdnh +b19NSVL/3djd5ef/Xl1v2tHd6/9bS0VETWl7Z15fV05V7c6+vb29wMfP09PIyNnpZ1FGSVPv +3N3j/1VMSU5n6dXa529dUVVf28jFys7XbVpVXvf3c11ORkJAR1lz2+Pra1RNTVbf1Nnj/1dL +R0x3187P09jfd/PRxr++xdl3UkdFTnfd3+d3XVBPX9nMzNHfd1xMS1dv5d93Y11VTVHhy8nL +3WtPQUBK/87N0ePzaVVY69HM1e9hTkA8PU138/tnV0tHTHfJv728v8PL09LIwb/J52VMPz9H +c9PW3WtQREJFX+PZ22tTTklDVeXCv8DGz99bU2vY1d9zT0Y/PURX39jfc1dNRUNSe9PV72NV +SEhO787Ex9Hjd2lv1cK8u73O91tOTmvjztd3Y1hOV3fOxcPI1ndUUVt729feY1FOTFjr0cTC +02NRQTxDTF3p63daT0tP98/Hx9BrTUQ9RFVv3Nl7W01FTv/SxL+/ytXr3s/Hv77E2l1HQ0ZY +/9/bb1RKP0Jb/97b42lOQkBFZ9fJxMXO32tz18vKz95fRj89TP/f0s/f+09ER1f34+fzVUc8 +OkJj2M/N1N3/W2/Lvbu7vcnR/2P/1crHzNp3TURKa9PLzM/nX0tGUe3Uzt5fXUhATG3Ry87r +X0o8O0NU9+97WVpJSFrRw8DDz29XQ0FRZ+Pnb1lMRUBH38jAw8jT32Nj28fBwsnrU0g/SHPc +zM/nZ1JFRlPdzsvN32NOSkzny8fFydPna13jzcrN2l9TRT5KX9XOzttfTUREV+3V1elTRz87 +P1n/2NXh92dZa8q+ubm7wtpjVFzbzMnK129QSUdn28/N011PQUFMY9/X3PNZSUFDZ83Gys9z +TUA+Rl/f2dxfT0dBTO/Xy8vZbU1AQEr3z83VZ05BP0nvysK+w87pZW/Rwr6/x+lfR0BJXdnM +zdpfT0ZHZ87Gx8rlXU1JT9nKwsLK3W1OTW/b0Nn/WUo+PkNpzsjIzntPRURO69nd91FJPzxD +UOfc4/9bTklTd8S7urvC12tZXePIxMreW05HSFrpy8fL1WNLRUZb4dHX71dNSUlWzsLAxddX +SkNBW9zL0N/3WU1KTefIyM3rTkQ/PEjfz83XZ1RLR03rwr2+wszl/+3Zwry8w91RSkRCVdnO +zdlbS0VGTvfGwMnWY0tGRU7XxL/G129cVVFrzcvcX0dCPj9IZ83I1OlXSERET+PO1mNNRUNC +R2vWytpdT0pGSWfRwL7L1mdjX13nw73D2WtTU1NfzsK/z+9rVE1OUu/N0fdUTkpLUe/Ev8bd +XUlFREvvzcfa/2dUTlhrzsLM51pKQ0FBTt3M1mdaU0tPXdG/usTO1efr3dTEvMffW0xHSEhV +0857T0dCQUZP/8XE3nNXT1Vde8a8xM3Zd2FdVXfPzmFNRkJESlH3ys9nWUxJS01e1c/lV01H +R09Z3cjM72NbWmP/1cW7v8/b7213b97Ew8zrbV9j7+PNxsfab2teW1he39HnV1FLTldb78/T +6VNKRkhMWeXOyd9rY15nc+vTzuNnVk1NTk9d5+NbTE1KTlb/z8fI1dvd2c3PzsfK91lTTU5R +W//Z1XNOSklLVmf309tjWVtn79nOxL/Iz9//b2tXW+vnV0pLTlFcY2vh61hPSExjX2Xn195b +U1Vj9//v19PrZ3Pz1czLxb6+zd/3/+//a+vW2nddZ2/j92/r1fdbV11jXFNV9+tlWVtv7/9h +b+9vTUlLU2Nj79nL0vd3d+97ZWfn5/9YVVpbUUlPX1xJSVNbXFt328bGzMvGxM3a39ndZ1hb +be/3d+PT1GtjaW9zY2/n1etdY//n83vnzsvZ5f9vYU5JVf/3Y3vv429bWXvf/2VjbWdXUFvp +329pd/tvV1n/29vv7eHR3ePfy8jP2+f/WUxHVe3d7/fj2+9dWW3b3e//e19PSU1z3ePn3en3 +d1xj6/9bUlVPTk1Qa9vc6//vY1dQUXvZ3+vrY09NSVF36+/7d2dlWW/ax8LDw8TJ2/P31tHV +3v9va1lSa9vP3elnW09IUF7f5+vvb19QTlvcx8fN2fdjSkVMXeXj3ud3XVVP/9HT2edeTkhH +S2nf63NZUExDRlnn09HV2+/7d+fHvcDGz/9RR0ln2M7O1+tvVElN59fU1913VUlFT93Ny83Z +82tXWe/R0O9fT0pCP0ph18/T2ftjTUxX18vP1f9hS0dM787Jy9Pn/1ZV886/v8PK0PdXVvfQ +zt1tU05HQU3nzcvV72NVSEz/2s7Z/19URkVO28fExs7nVkc/S2/r4/dtaU9LV9/Ix83j91lD +QUpr+2dXTEc/PUFl1c3V6/9vV1nbxLm5vsbTX0xP3svHydlzXUlFT9zMzNZ3W05AQlnjz87Y +5f9aVWfOxsnQY0o/OzxN3s3K0O//UUdX183HzO9jSz9EVenMzNT3YUxLZc7Cv8PR53dWWdrO +ydFnU0g+QE//0snP42dTSEzlzMjJ02lPRUBL4c7LzudrTUFFTF3v5+tfV0xNb83Bvr/K3ldJ +S1v/7/9tT0pAPUtl2c/N1ftbUVrTwry7vcnhY05l2c7IxtZ3V0hN79fNz9dvU0FASXfc2dnl +b11ST9vEwcXK81hBOj5O59XV3W9SREdX3dvb42FNPz1Ea9fV0tl7W0xT18nCwcXM315VY9TK +y9P/U0Q/QVXr2dned11RTV/b0c/Z72lVS05r1szO0edlTEdOd97d72FTTUhM38W/w8nW51VN +Z9PJy9xvTUA6O0/v19ffX1dLRl/Hv7u+ydPvU1Nz0cfIz9zvVkpZ1cfL03dUSD5BY9zRz+1b +V0lGV+HIx87rUkU7PEr709PeY1RJR07jzs3XY0xGP0Fc5c/R32NUSEpay767vMbN5W9j2sfD +x9dXSD89RHvVytD3XU1CRVLVx8nN71tKRk3Xv7u9xtxzSkdX387R52dPRkNN/8rBwsrvVUhF +U9jJx9D/S0M8PFHv1d1vWE1FRlHNvr7B0XtTTlHjyMTG1G9XUk3vxMDF0WFORD9DV9vKzdxf +TUdFV87Gxs9fRT47O1DhzM3XaVlNS1nbxcXP41VJQ0JXz8TH02VKR0VL28S8vcXN3fdt98y/ +wtdvS0M+P0/Xys3fV0pHRk3ey8XP719RTVNzw7q6vs13U0pFUt/X71NIQENEU9DDwtNvUUhC +Rk7TyNHvU0A9PT5SzsjO91ZPTlr3zbq3wM5nT0pMWM7Cx99jTk9OU9m/vsxvUUxGRk3/x8Pb +d1VPTlf/x73B900/PT1AWMa9x+dpYVtb986+vdllTklJS1rPwMV3TURDSFHpyrvC2etnX2dv +18DB6VlLRkdMX87Dy2dQS0xOVdzHweFRTUtRWWnMvL/R+1VOTUhL79z3SkVCRk1X3cfA111O +S09SUufJ1WdMREZITWfHwMrrb2dn++PPvbzPd1lPT1NZ2cfRd1VLTE9Vb8i/zm9fXF9rd9nA +wNLp/2X39+XJwMlfSEA/QkNR183hW1FPWWN33cbD3GVLSE1NWt3N019OS0xca9bIv8v/Z15n +Y//fzNVvU01PV1/pzsnQb1JRV2Fv0szMe05JSEtVX9/MytdfV1ddVV3/3eVZVFlb8+PQy8XR +b11bY3f/59/nZ0pER0xZbd3Oy93r79vRzsvGw833Z11bb3P/2dfnWlNbY2t33c/X92Fjb/vr +79jK1+tr99vX4evX611HQ0NDRUlXb2VPTlNf+//vzsjcb2Nnd29p99TW91dfb+n/d9PK029c +YXdzV1V361pPU2Xn523dzdNrWmv33f/r287tVVVl7+1z/8/L3Ptvc3dVSlPv811c/9/a/+3W +ydT3Z+fdc1lTd/9dSkpPVE1KWefa7+XTy8vZ1srAyd/j63dSSk5v4/9cZ21fSUhd59737eXb +e1NV68zR2tPQz/Npa9/3VUpHSEY/Q1vv+2Nrb/dhUVPdzdbb293vX1j/0tDb3+Pta1VR3cnI +0dXZ61JHSGHrd29v82tdW+PJyM3R1dv/WWHpz9nj4/NvXFlf1MnZ5+ttTkVASmn/a+/j72db +We/LzNvb3/dcUVPn2ev/Z1NKQkFV3tnf1dvd93fWx7/Hz9f/TkA/TO/b3+N3YVBHTf/n3+f3 +ZVFGSFXTyMbGydb/XF3d0+t3XU5APT1M69PY3ftvU0ZLY9XO0NXrX01MWNXJys/db1NMTenC +vb2/x85rT1Fv3t9nWE1GP0BS08PDy9j/XUxN+9XN3mddVEdJ98zExtLnWUQ8PEv/3+n3bVtR +TV/MwcHJ33dbS0xe2czP22lTRDs+X9na3GtdU1Fb18G9wM73Y0o9QlPb0M3X+3dSUnfQxsTP +61pMSEf3y8jFzc7T82/by8PL42NLPzo6TO3My/NVTEdGW8/H1e9lX1dKTdnNyMXd3+1MTFvZ +v7m7w91jXlvf2dXea05HPj5Lb9rMzdDvTTo6Tffb3f9PRENFZ83CvcHL419OVGdr5WtdW01G +RErdx8TE229JQ0z3z8vI1mtLQ0BN79nU0WtOQ0NZ2crAwL/I3VFHTWvXy8vR51tMXdvJxMnZ +Y05MW2vT0N/O0vdcSEbau8XI1UxOQjhET0tXYUlb7UdabdvDwsbdVzxPY8e/bVnjZUtVPT3N +yr21z9drX2/OzdvJz+9bODc9UePOzVvT1udrRC4qLkqyrK++1uNMZ1tJW0vav6u0t71F3VdC +PzU1OVJrzsZjX+fKurnM39nj42VGZ2NBY0xOSURANLSlo6VPKh8nSq+fn6Gq50YtJCQrLz69 +u7S998+9v797Ni4xKzpvXbWwrq3H32NI1r/D1vdnP0g9KDlCM/tAMTUvOb+vublGOfdOv6+r +qbC+SkUuLT9OvLzd1UZPzysuTbypt0ElHyy/p6Gfrba+OicfISnPtbOvvbm3sLe8xTkzKiIl +KCtFva6qqK+tuGPN28O8yE9jOzlrSfPbR0A4NTp716+tt79vV9rPx7i/0c8yKyslLjUpO6ys +qLkpHyYwtKu+q662sckvPWNXt9nnx8C1qKq0tV09MyMfHyQvO1NFT8zMvbKxr7DId0E0Li43 +Su/XzdLr1c7Fua+vr7zbzse5ra6uq7HLOTAlKjM0Ql1va+M6KjFbycTeOkL397ywuba3vLvK +UUppy7W62Uk4MzpP78XI5VM4LCYmLT9Ye//hy8fHyMS+vcnbb1Bf18q3tbzH61FVSkNZ59r7 +ST49PUNj0cC+ztPVXkxHQWPN09tpRkVPd8q5vO1dT01RPjpV3MG/xc7Myb++vsf/92VOPjo+ +U99nPTk8SePOzsTD0eljXV1b3b21t8vnc3fbz8e7vclrQDQyMzZK38jGyMzTSEy5REVZ3ExH +PkdI3b+4v9VfUl5NPTXD0kRBPUhNd86tvM9lSnvrY8K5zsffUDld7V9GSMldT0hOR1w6OstX +Y1tnVrC5wqy+wb9A20VKzvNDrrr33TlHudDOs0fbTzpBOz9fW9PaO1Tf12XG1XdIXThvQ0JX +v66suEJETeXl0Ve2vmk9Ly8tP1PNusqvu82/1b7C2UNMNjRbSjU6LzPKuLOqrKi12zk/NTg+ +S0vdwjxAQyMyRS3HxDbQybztNTpIvKWkuMq6srVvOiUutKaswCofJSw5u8a2oafGQC8rc9/V +tbCno6WzyT4uLyonJSsqNjhGurW1uMrTy+PDtke+rFPMtEu7vjNfPi7vQS334TTD2tuptl3p +Y7irt8g5MC4kZdH/PiwrQjkpMC/Koaauu1w+TzIvvLCmqNEz2N9JbSooTkg6LjrPprE7QsjG +vuM5uKq+ubbPsco8u1QsJCI4sqtBNzX3u0Et86ygo+vHrcOtr8a96yUlLShZqK21UiEfISk9 +rqmjn7NfUzQ0VVTVpaeur0I6STMqLzs+21kvRdK0smE3PETVu6+sqLRTNSMtPzVjuffpPic9 +Wb3IzL24SiwpNLKqqKCpuEEnID08zq65sMpCQTIjNbfGvjQjNVVDyKupn6pNQDg221M1trK4 +v0I9vb5bTzU7X0MvP1q+uMrCvr7Me2fExj7G2b+460TBsUozJifZRnvN0cFILWs9QLmyd6u6 +SVYuQ+3de9NvRy8jNberr98uMTU7P/exoKS0UT0vLSQzU/+9tL2xu2dKw+97XTM7NTIyPWm4 +va+pxazKzLGtv7lIVT05NztVyPM9LjtZvs2zqcTGTyzX0b+trMm4QycqKDmuvLezZV88KCxC +2bO4xLfDPlQuPnfX2b/X/+NXWNXHxrpcW1Q+PzcyP0pTz8LPwbK2t+/O619IKjEtPDdJN9E+ +wttJ07zLvb3MwtHH3Xfvwm9d4zxLPkXnzs7n48Jady5j0//DT9rN71xXOvdP1uNj2etK48rG +wWfIT1s//9O0ta69w3s9MTA7Y8Xd4c1GRT1Ib8bhzNRfTURFyL64v+NnXUFHZ8nIyndJRTc7 +Vdq6t75vQzU5PkzczcjpRTw8PEhYW9Pd520+PjxJ0cy9vuO1zL67u7a5ws5fTzszOj08Vk9V +Wj9DUsLMw85vzu9ZU+nfzcrTx8Ld17++vL3K0VtKPEdJ4+PX2W1va2XPxsHG0Fc+PC84Rltv +zMvZ0UxKNk4+X07PydnHwbTHw8rt9088QEGws29V/9xZ/+/fzf/f4UlBMTpJTtR7181TST9b +zW/AykvhTUdERj/Dy8Lpykb3Q01C2Gu9XD8+P8d7y8/LuMvtu97Vyr65tblVXEA6aUZv5Vvn +QmtZxWXv0dpGv2vD58u0Z8M93Dj7P7r3usrf00dCRkLPY2nCTUw/Umfv41Hd/81PPldPZ/Pb +S8s7Vjlv78i6wrzr50DnTNTfv9hf60fORlTFUbg/7zxRQP/UT7tpWUdEVzu6293G1sVJ2z7A +wsfTslXWSVPXOsFOtFW5RWVMyEpGvUPISL49ylPO1+NYuFPN6d61xMZnwzfOTU/hvU7fa0Zc +NVLrvt1H93dNWDXbTLBPUss+vkFXR8FJvl9bW0HMSV9Jx0TZQ2tXQ7ZPtD57N1NOMck4u8tJ +WEhnSfdIs1fFT2/fU9w/ulnFv1F3PzrOd1e40XfRLkXfOtfA/8iuTVW6Pce+RLXEV8PrPbrH +97zIPcY2K807Z8Nb7/+8P//fQq/3VcRIU0g3xP/LzVlZ/1VI2M/Gw7pWRdFHTHvdU3dTZ2NZ +PjdRacjr0ffN1kBtRP/VPk09PEVBy8HFusnR401PUs/K18xHSkJKW02+v76/TE7ZUstZzcrJ +ZUhHOEVVZ8e640Vvt7XM2uPJtLXF4ffpz+dcVTo9ODo1Nj/P6dvOb+vF1sy7vca8XfNhSENr +b2XjWVD3UF/Ku7i/yFNLMzQ5NlBDSkJGRUfr1Lu1uLy91sra38Bt49trRDgtPELvuMdfSTlB +OVtJU19Fd0JGPz5Kvrqusq+ytru9r8G63TkzJSYiKiw4S0vZybuzq6ukp7CxyW9QQUhJ005A +ODs/Ql/Kt7CvvN3Ma1U5RsO+a0UtLC41V+vVREQxP0lTR9HNwrq+u83Hu7GqoaSpqa+9y/9L +OykjIR8fHyAiMTxU08m7wrOusauuusnKY1PfTV3vY/9tZ9PJy7+2sbzL6VVJSjtFSThIQko5 +NzIzQOHLY1tAPkjOvLOtrbm4s6+pqaWqrLe72Vk/NDEuMCgoHx8gICcrNFFQzb+zrKekoZ+i +qq66ytlr+0tTPzIuMjE3RG3NztDR2/vnztXNxl/VQT85OTU9Rk0+Ozo4SExvyry5ubq3vre5 +t7GyucPT22tlV0E+NC8rKywpLi42PEdHV9fOvL23sq+ytbu2srS0sri8zOf3b2PcX2f7UUJH +QD5JOT4/Pjw1OzlNTO/ey83LxMG8v7vAuMXdZ0pIS0tLWm9jV1lUX1dvZ97e/1VnWV/Ta8XJ +61lMS01YTE9fd29349/Z3eXb1NNdae/ZzdPHxr3Jz9Hn72NUSFhPRENHSFtZTuvl/2tlY2Nf +S05ZWVhMWenb0dXMytvf+9Xj6effy8fV18/Kz8/XzMzfe/fn49Xz5dHdV1lcUVJISU1vTklO +T2FnWl/33G9hY19eW01Za/dfZ+n382Xd0t3rXf//929z38/V4/vtb1hPSFl3Tk1MT09JR2Pz +3f/3d/NpTWndys3RzcjT1OfVzcrd891391tW5+HtZ+Vv61RMXWNjWFtYb29WY9/b2+Pf2WtL +SVB36eXX3ON3d2vSzMzP2dvnX1Jd29vn9/dnXldf4dvc6d/l329v68/V43tdWUhGS1rr42tr +a1dIR1Fp6+//42NJR01319TX0s7be13t0tXb6+vzX1Ra2c7K09LX7V9VXefZe2dVUUk/QlP/ +9+93b2dPTlnTxr/Cv8HV71nt3dPa3/d7WVhd59DT3+HvWk1JTv/7b2ttXV1SV+nZz93/ZVRB +P0lV/+vf2d1zb+vMwMLGzNfnXVRj2dHj81lOSURLY29tb1lXWU5Z79PN1etVS0NBPdtzR7Zd +SsxUxd9KubHv91gw105H1ufQxs9lb+P/z8TU19tXSEDj5dG8d72+XMPrTP9hW8/fO1ZCPthL +X9VNXGdOSv/3c8a/Z7rAz7nAvthV50lIPUI5P1FG1mdVPUpP77vR3co741Jdurm9wrHnM08q +MMI3vLs7tzAu60tPOq6/tLAzRD02z3exoq28OiwlK0A0v7dLtt5EvVPEws9pZ9c6zEQ1yELj +t9+wVFa4SLq4TrnN/y7KtLqsVy0sJTytpqCgyTsqIjXF47i57bS/QkIvNNm1rLjVMSw5Pr6z +ycvzV0lWV2+9s7KzUylbt7mvSywlHylZr6mpvywqHy1D17yqqrOtPDEvJ1e6sq3OPVM8XcZU +uuFzx2lNQm9fsK+9Wiv/ubW0MykiJtyto6jDMigiOXu9rdXM3ry93s4+RcjDzcTtPNJBSesy +YUhnuLPUzr93qqtJPr3Jq8YuKh8o0a6kqksrJyBE48S061NPxMzfZzNPxsK9VDdBPUp3S09K +R1XazsfFuLy6wkKuvrWuQTwjJtOspqtfJSQjO7+/t1w1QNPKyvcuREpzwONfY07pyczlVVtM +48rBvbqs0zi5wqmv3dcpO821oK/TMicvP8u7bTw+aePNazpEPmPB381ZQlNAT1djy9dOSjbW +uLZQu620p287KSrNq6OmzjMkI0f3vb9K6b3EvDwqKDjKsb5OLSg1T7e0xt9IO0RpzrFz/7HC +qPc1SyzKtq6fuO8yKDZfu7rDS1NnzL3L30dHVU9HOC8yP9vCyrxIODgv07q+w6mzpbw0Lizr +rKWfs0IoIytItKqxtldN5z/XzrSrtXcvJh8qNme6wLlMMyooUU7RrKSoskMpLT20rKu0NzUt +LFrItL3NOV5N78Jrv77JyE00MC0wU0/CtPdWKyg+NkPbv6+ouzwmKE6tn5+r0zEsL1S3q6jT +zUtLyWe2t6620Fc1Mi85RHe9vsE8KjEtPF/Gy6nJv0ErQzDCp62q3UEuK0S+sry467uxwLpv +z8PNSz8uKi4rP2POustMOy8yOT/Hta7KPCgqLNy4prK50TNbWtumta2247C/v7rJzNlKRjor +LykpOkHfykVILyxfPEzTOLew37RPO1g+r62ssU1NP++tv7y/17a/wsfJuMfZXT03MC4pNDJF +3mfeRzI2NGPI2bzTvbS0uFNMQE24sauyzG85b8K4ucxeVcK2r8xIOTNBOzM7LTEvN+Pd91M0 +ODk6RUzr1+PIzq2qrb89PzjBqqqor8jlZ0lJQzrMz8HDZVFAPEpLQWc0R89IzGsvM2s381Y7 +777VzK5luLDTqefHs8nHu7G1uMdGXHtX3chDOF00azo090FQa026O09MYc08TznERUfLSLJT +sLZetEnzssSrZ6++vbZVuGO8VN86OdssSTYwQDIrSzlVPm0v4Uk6zDjaaz/Qv7G+vtq2Q7pG +3dDK4fu2V7J7xFW9QL9nZ1Q9wD3GNOc1a0JrRFVfQ8VX0EB720xvvtDHvM7O7enr0mfK07/I +a8Xe48bV1XNtPd84zj/ZRVb3T2tvS+dPXE3pPctHX0xB/+PV40q3SbZKzEPIyT/LN8tU92Nd +yG1La+FPwVW23Ne4XcNZwTrHP9BdRlRETUPvWm0740e/b0HjXMxbzMBKuN/FSMJvxMZKy/PV +UsFDe9HtOXfZa99KsljEzO2/493r0NnATbdD0jbzPt3jPuVEtlq6P70/uTxT60zaQL1PxErn +OOXlMtM0zlB3R0pZPnc32kvlTNFFxvdVxVddV10z3k3v69NjWsJP88lQxDjBO81X6/vnv1LR +5c02xDPPXnfJ77blvj67Qs89yfv3Wul3Yds6z+vYe+NXVdNYytzMP89MwMtBvsvKxMg3xzVb +TXdLXVxpY0nEMME/xsZV6dm8T7dIv03AXUjRP85CwVK8y1LXVGn/XMftS8s9zd86Ous8vknb +Ot4z7XM6wzPBTNtOO7pGs07SyEvOX+FOve/vSk/ZQWdjYbZvwkfnzVzMXc7Mukm+U0jbbT7r +1N3lQbVNvNPFb7mwQLvIWLlE0bs4yjRt3DbJO0fANs3LL9dGPb9TXE7jc3e8RrrOQq86ybU6 +s01OtTy6SjxNX0tvbW/P20tLvzO+b0W/Qla+L0q/S17ASl3FVP+63cK9Sc7zOdQzPN49c2NF +RldCXMdRWu9BY8ZFzVpZwdbVx03n2sXVvm+/xGvUSUvlzd3YysjfxUNC7We+usbjyj1XSEpS +Rk9F607/0eu21b/Azc7rS+NlZdlFT0VMyHfF1eG728tMTUBXZ+v3QUU4Pz9TR19Nzr7Lv0M8 +OmHEsa+94TQ2MkVOT1VFSOv7w7+5v77T1PNKPjU+Tnfze2dv7829sK+urrrIa0pvQ0VOQUM9 +OD42VWtdys/N0ddXzsC/uL7L31NLb0rMa1/PU+NcTlVV23PRXktRQUZdzrvDwO9QSU3lwb29 +xVM9MTdAU9fZzslcb1VZx8zH09XvTE9ITFrf385rX0E/P0nn1c/OX0tPPlpp3dzO1VdJRElL +42/f/1tJVUta1dvPxc/KzWfrd9O8v7+/3ttMTv/c2ettSFVDSu3nu72zvb7JY9N31evcW0RC +Mz88a2H/505GPD40Tl931tnv70v737y4trbAxu1XXF3nzOfEZU9BP05h1VvRTV1HPz9AZ1zP +a/NEPj4/U9nMzcne72/71b7DwMHZ/0pFQVnv88x371NFV0fp08rL2VpRQU//z8rIzuNcTk9Y +3czL3edbRkBLV+vGyMjR72dbb83Hxb3L2W9NR2ff38/vV0hBPkr/zsLGw9PfWVXj1cvO03tN +Qz1FV//K3+9RRT47Q2fv39NZa0nfd8i/w8DnaUJERFPj18/e911KSVxzwcHJd0pHUvPT0V9L +TEn/y7/Fzv9YS05dU1dN2cS3sri/50w+RFXl6+dJOz4+RlbMx8TGyNLP7e/fy8HIzfdpRUVH +T3dv61BMQz86SG/ZzMrM3M9z59XHz97Wa1pRTV3PzcrVTUk8OVfjw7u/1+9vT1ffxcDD305D +Qj9AU9labT85OTs7W8i/vc9jRUI/Ud++sbW4wM9aT09czNX/d1xET1ddxLy8zsnOT11OTM7P +Y18/OTg/RtjHzNDj2tVj08S/urTMz9FrTc7F68BLM089MUJH4bvKT2dXSkhtU9fR21/HVVVn +5dfOVkc+ST9S6+PK00hV3Ur/1e3DytpO+2k/U0xjwMvpytte71nhu8C93VxDQU09aczj3mdX +VW9N29PS11RKT0c+Rk7vbef//1vP7XfAxsbKTc7tUdH/zL7Oz9Fve2NTb8rz81tHQTxKU8m9 +7+N3RU5BWdXNwcnJyu/jTE7NycjOWXdAO0dT18FvVFVDRjxSWO/VTUfzPHdbP7zP0MJFXc9E +3vff2j9VTl9v69u86+ndREJNQ/fAxczvRl9RW3fz389n3/vRVctjxbjAwMZRVUxO2MnBv+dh +Y0lrTvNd7/NVZ01fTEpS51tr7+PczOPL29DOTkM+REhIbd3M2FdpUFfX98fAxMnj729T32vJ +2uPZVltWU+fRv87ca1JTVV3V2d9RPj89Q0JPTsvz5V9zQmdMY97Vy+9RWU7f3ci5zs1YVETZ +///A1+XdPVhARdFvv8/dXEBDRUfr3rzO2fdYTlRfVcfJysv/ymtvzcS6wdHvS05Qd93RzGtM +TEhIS1dnY1dJT1dHV0hn5+Nf2W1n2fvZw9TOSk5dS1tr0s3Fd1PjTOlpRtJGY15D1f9rym/N +2FNX62fY3WnOVeFVR+NPb2Vf729JR0tS62/nxefH0+nOb1nnSN3vVtvr2tFPb2vR29v3zFVN +VT7Rb1DP98nNXl1d///nZ8Npd+dNzNPNy83B3dRK2mNP3D3a52/PX7/KxdHYyEdVSU7LXNnn +R2s8O11N81lMSkI/Q0hd0+XN52/GXNe907vve/9HUURzysTH52tDY0JMW2/K9//dRVlRb8rK +ydx7b1xbb+XT0M5n0/ff3t3Ra8xpT3dMRVd7xtfJ69ldYXdK0NPpXndl2f/zzNfeUUNHd1fv +d3fXUltRSGtTe8DOudnzd2HjU8vjxtlrW1tr8+PYz29UP0lPd+vPzs/KSttLV/890mf31UNj +Xz9HREvcWdhZQWU8aV1j++v/c2d7bdHCvL7M9+ll/13329vJWFFvS2dX0+vS6Wd7UWtU5+PM +ztDbydPr0NXR2tnU3Hfbb//a995lX0g9TUbP1tTXX1dMTEj/3e/PZ9lNZ0VjzdHMzuFOS0Nb +c83O51NEPz1MVdDHx8rd72lPUv/rz8/O1llMRExf43v/b0tPUVvHv8fG+2djXWfZ18Hn71lN +W1NVY9Tj2GNIQkJCVtfpzmNeTWP/58u+xr7b3/9LZ03Tyr6//19HR1d33czM129ITFZNz9Zv +a2tX5U370N/B0f/TW1djd8jF299TWlNJQT9P89vf+0xJP1jhz2dPQlPd19/f2czJymNVSU9c +/+NfW1VZSkxFSczMw83nZUZdd3fGy+POT1tZRmnv2dbO5fdHW2frwrzFwsvVTlNX7+Xpymtn +Q0tP3MXf2Fd7XklHPUZv2e97UUlGS9nLw73O2l1OTmft0czN0Vv3TGdj38nO1ftfUE5TXsrP +119BQE5OWd/SxcXPUUk/XdDHusfXXU8+Pk1SxsrLSkVAO2X3a1/Vd/dTPkRU4cPN33da/15c +/8/M22VTW09ATP/Evcbba2NbW/vQ0cvNZ2NGVG3rwtXV011RX1fby7y+0dhz90pTY9z30d/3 +Szw+RtnPzednW0tHRe3Zy97XT0dDRm/Rv8bPe91LQU5P19vV309KQUNA38nIwtP3UUdO283Q +b+ffV05HRHu/wr/Za1tDY+PAucLJWVtOTk1e59PH5d9IP0Bd2MZp329XTDo8X83Hy+ddY1xT +1MnAw9vZY09DTnfBvcbbb1BFSErXy77Gc0I7SkxYY9XG0dtYU1l717y7vM1rVlpXa/fRy19v +QklCSPvWw9xDQ0lEXWVj3P/ZTEg/Qk3pzdXIxuNVSz9N58zBe0tPPlFPb9HFyMTrVVtr3b/E +w99VWU9KQ2/Xw8jO41db7+fUyL3D209GP0XfztPZ5WtbVkZP48nP505NSD5Md9nZ62VfXVlM +Zcy8vdVeTElh49fBw8bZVEpJS1tvXl/37WtRQUNLY9Tj71lNTV//zMfMvb+/20ld7ce+d09P +V1lFRFTXx9ZVQ0dPUVtt/+f/41tGT2nXw8Pb7+1OTkNEW8/L2HdTSkhf987Mxcn3X1/fycDA +zNvL129ORV/YwsPaZ1FPVd7b5+Xr0NdRPT5N99nW2d3lT0xW/83F1c9fSUBCXHfb1uP380tJ +XVHW19zaW09FT3PZzMzR7+NaTk5DT9vnZ1JMRUNOX9fGzNX/911j/8q8ubrQ2efv7//rzthn +SUZITlFNY9t7XVNJSUVQ39XO71Xv62ldd9zBx93/UldfaW//5+Xt/2FfX2nZx8v/+1FdaV/7 +79XI/09PRuXP0c7P69pvVVFKW2fbzNtbWUth/3Pr69n3a2ddd+9v2vdTUU9PVVdt69/la1tb +UWdjb/Pje2P/Z2/3593S2ePl73tz/2/n53tbUk9TX+ff3uvv6+Pv0dnPysXL13Nne+3n6dvf +7XdpXF1dZ2tvWVlYV2FXY2n/6ef/d2/v39/d3eP3X2NaW2l3/+//b+9v9+dvZ+/p5ettb//n +/3Nrb3d3729nbf/Zzt3r+93naVtYd+ttW11dZ2tv8+/j82drYV9jZ//j/29nd3N37/Pb3/93 +c3NrY2d77+dz93d7///73+H393trc/f/+/f/7f9tY2N77+/j6/fz9/v3997Z3e///29hZWv7 +9/f7d/97d3d3/3d3a2tjX11n++/t9/9zb3dvd/Pv93tvb21v/+/r93f/////d3f37/f3d3t3 +b3t3+/f/9/f3///38/f7/+/z/3t3//v/e3Nvd3d3d/////f7//97d///9///////////+/f3 +/////////////////y8= + +--Where_No_One_Has_Gone_Before-- +--Outermost_Trek +MIME-Version: RFC-XXXX +Content-type: multipart/mixed; boundary=Where_No_Man_Has_Gone_Before + +--Where_No_Man_Has_Gone_Before +MIME-Version: RFC-XXXX +Content-type: image/gif +Content-transfer-encoding: base64 + +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 +l7Vry4B9aM+yKjifMosAADs= + +--Where_No_Man_Has_Gone_Before +MIME-Version: RFC-XXXX +Content-type: image/gif +Content-transfer-encoding: base64 + +R0lGODdhQAHIAKcAACQkJNsAAAAAALZJJP+SbbZtJLYAANuSSZJJANttSf+2bZIkAJIAAEkk +AElJSbZtSZJJJG1JSduSbW0kAElJJLaSbZJtSZJtbdu2krYkAP+2kv/bbdtJJG1tSf9tSf/b +tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAQAHIAEAI/gABCBxIsKDBgwgTKlzIsKHD +hxAjSpxIsaLFixgzCgCw0WDHgh8zchRJsqTJkxYdoCSokmHLgS8hqpzZMCbCkANxrtzJs6dP +mD8HIoAwFABRCBIpQIxQ0CZCm0wNOlWoM2jCBQiwah2AoMCABAXAik1wgGwCAmStqqU4NeLQ +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 +0CK3jI33rIAAADs= + +--Where_No_Man_Has_Gone_Before +Content-type: X-BE2; 12 +COMMENT: This is NOT a MIME-compliant content-type, but your software should be robust. + +\begindata{text, 269602880} +\textdsversion{12} +\template{messages} + +Where no man has gone before... + +Click on the "death star" icon to start the animation: + +\begindata{fad,270222644} +$N icon12 +$C 30 +$T 30 +$L andy12 +$P 0,0,20000,256 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$A 29,24 -1,76 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$S 216,264 +"Fire!" +$V 260,260 417,242 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 321,186 250,158 +$V 319,193 265,172 +$V 316,199 290,187 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 321,186 187,122 +$V 319,193 215,141 +$V 316,199 232,155 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 241,145 179,117 +$V 265,163 179,117 +$V 316,199 180,127 +$V 169,120 163,101 +$V 184,111 188,89 +$V 163,101 172,115 +$V 188,89 190,110 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,108 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,108 +$V 198,108 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 246,158 180,127 +$V 169,120 163,82 +$V 185,109 204,80 +$V 163,82 172,115 +$V 204,80 190,110 +$V 175,133 173,162 +$V 173,162 181,132 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,108 141,158 +$V 141,158 149,161 +$V 141,158 130,154 +$V 130,154 137,171 +$V 137,171 149,161 +$V 130,154 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,108 +$V 198,108 199,118 +$V 199,118 149,161 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 164,61 +$V 185,109 219,66 +$V 164,61 172,115 +$V 219,66 190,110 +$V 177,134 201,167 +$V 173,142 201,167 +$V 188,128 256,143 +$V 256,143 195,120 +$V 175,147 147,192 +$V 147,192 173,142 +$V 168,127 113,103 +$V 113,103 171,136 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 171,109 +$V 171,109 177,130 +$V 171,109 142,135 +$V 142,135 183,120 +$V 183,120 177,130 +$V 142,135 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 132,80 +$V 185,109 195,52 +$V 132,80 175,116 +$V 195,52 190,110 +$V 177,134 192,201 +$V 173,142 192,201 +$V 188,128 241,106 +$V 241,106 195,120 +$V 175,147 234,175 +$V 234,175 173,142 +$V 167,130 113,143 +$V 113,143 171,136 +$V 167,130 160,153 +$V 177,130 210,140 +$V 190,110 208,94 +$V 172,105 172,64 +$V 154,122 120,115 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 171,109 +$V 171,109 177,130 +$V 171,109 142,135 +$V 142,135 183,120 +$V 183,120 177,130 +$V 142,135 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 139,55 +$V 130,154 175,116 +$V 139,55 190,110 +$V 177,134 219,150 +$V 173,142 219,150 +$V 188,128 193,72 +$V 193,72 195,120 +$V 175,147 226,80 +$V 226,80 173,142 +$V 167,130 144,191 +$V 144,191 171,136 +$V 175,147 173,202 +$V 155,138 130,167 +$V 157,128 121,89 +$V 171,109 165,69 +$V 191,115 205,70 +$V 184,116 247,130 +$V 177,130 191,172 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 156,170 +$V 156,170 177,130 +$V 156,170 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 179,200 +$V 130,154 175,116 +$V 179,200 190,110 +$V 177,134 221,72 +$V 173,142 221,72 +$V 188,128 123,82 +$V 123,82 195,120 +$V 175,147 120,89 +$V 120,89 173,142 +$V 167,130 276,111 +$V 276,111 171,136 +$V 172,131 164,203 +$V 153,136 74,143 +$V 152,114 128,56 +$V 179,113 182,44 +$V 199,118 301,141 +$V 194,137 215,183 +$V 151,150 97,225 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 204,106 216,100 +$V 215,110 221,109 +$V 231,98 236,95 +$V 241,102 241,102 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 214,99 214,99 +$V 215,110 221,109 +$V 242,84 236,95 +$V 246,91 246,91 +$V 221,147 221,147 +$V 207,133 207,133 +$V 168,166 168,166 +$V 150,161 150,161 +$V 175,92 175,92 +$V 192,90 192,90 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 220,75 220,75 +$V 215,110 221,109 +$V 242,84 236,95 +$V 278,93 278,93 +$V 248,151 248,151 +$V 211,172 211,172 +$V 176,196 176,196 +$V 137,186 137,186 +$V 178,70 178,70 +$V 198,64 198,64 +$V 169,100 169,100 +$V 192,97 192,97 +$V 204,137 204,137 +$V 151,150 151,150 +$$ +\enddata{fad,270222644} +\view{fadview,270222644,2,0,349} + +... by Curt Galloway +\enddata{text,269602880} +--Where_No_Man_Has_Gone_Before +MIME-Version: RFC-XXXX +Content-type: application/atomicmail + +; +; +; +; +; This message contains a ATOMICMAIL program. If you are reading +; this now, that probably means that your mail reader does not know +; how to handle ATOMICMAIL programs. +; +; If you were reading this with a mailer that had been extended to understand +; the ATOMICMAIL language, this mail message would automatically interact +; with you and take certain actions based on your responses. However, +; the language is designed in such a way that ATOMICMAIL programs can +; NEVER do you serious harm. +; +; If your computer has a ATOMICMAIL interpreter but it has not been linked +; into your mail system, you can run this program by piping the mail +; through the ATOMICMAIL interpreter. (In Berkeley mail, for example, you simply type +; "pipe atomicmail".) Otherwise, you can simply write the mail +; out to a file and then type "atomicmail that-file-name". +; +; If your computer doesn't have any ATOMICMAIL software at all, you +; should probably reply to the sender of this message to tell +; him or her that you were unable to run this program. +; + +(&checkversion 1 12) + +(defun init-ctrs () + (progn + (setq newline " +") + (setq summarizer "mmsurveyor@thumper.bellcore.com") + (setq global-survey-qid-ctr 0) + (setq global-nesting-level nil) + (setq this-level-ctr 0) + (setq total-questions 0)) +) + +(defun nextctr () + (progn + (setq this-level-ctr (plus this-level-ctr 1)) + (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1)))) + +(defun pushnesting (txt) + (progn + (setq global-nesting-level + (cons (list this-level-ctr txt) global-nesting-level)) + (setq this-level-ctr 0))) + +(defun popnesting () + (progn + (setq this-level-ctr (caar global-nesting-level)) + (setq global-nesting-level (cdr global-nesting-level)))) + +(defunq onelevel (i) + (strcat (int-to-str (car i)) (cadr i) ".")) + +(defun apply (f l) + (magiceval (cons f l))) + +(defun getstring-oneline (prompt def) + (newlines-to-spaces (strip-newline (getstring prompt def)))) + +(defun getstring-notrailers (prompt def) + (strip-newline (getstring prompt def))) + +(defun newlines-to-spaces (s) + (let* ((l (strdecompose newline s))) + (cond + ((null l) s) + (t (strcat (car l) " " (newlines-to-spaces (car (cdr (cdr l))))))))) + +(defun strip-newline (s) + (do*((len (strlen s) (- len 1))) + ((or (lessp len 1) + (not (equal newline (substring s (- len 1) 1)))) + (substring s 0 len)))) + +(defun cadr (lis) (car (cdr lis))) + +(defun cadar (lis) (car (cdr (car lis)))) + +(defun caddr (lis) (car (cdr (cdr lis)))) + +(defun cdddr (lis) (cdr (cdr (cdr lis)))) + +(defun cadddr (lis) (car (cdr (cdr (cdr lis))))) + +(defun cddddr (lis) (cdr (cdr (cdr (cdr lis))))) + +(defun caar (lis) (car (car lis))) + +(defun cddr (lis) (cdr (cdr lis))) + +(defun caddar (lis) (car (cdr (cdr (car lis))))) + +(defun > (a b) (and (not (lessp a b)) (not (equal a b)))) + +(defun mapcar (func args) + (cond ((null args) NIL) + (T + (append + (list (magiceval (list func (car args)))) + (mapcar func (cdr args)))))) + +(defun thislabel () + (strcat + (cond + ((null global-nesting-level) "") + (t (apply (quote strcat) (mapcar (quote onelevel) (revlist global-nesting-level))))) + (int-to-str this-level-ctr))) + +(defun revlist (l) ; like common lisp REVERSE + (cond ((null l) nil) + (t (append (revlist (cdr l)) (list (car l)))))) + +(defun informative (p) + (strcat + "#" + (int-to-str global-survey-qid-ctr) + " (of at most " + (int-to-str total-questions) + "): " + p)) + +(defun survey-multiple-choice (prompt choices) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (car + (car + (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) + newline))) + +; USAGE: +;(SURVEY-BRANCH "What is your favorite color?" +; (quote ( +; ("red" "red" (branch-question-set "red" +; (quote ((SURVEY-SHORT-ANSWER "Why do you like red?"))))) +; ("green" "green" (branch-question-set "green" +; (quote ((SURVEY-BOOLEAN-ANSWER "Are you green with envy?")))))))) + +(defun survey-branch (prompt choices) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (let* ((ans + (select (cons (list "" (informative prompt) NIL NIL) + (cons (list "" "" NIL NIL) choices))))) + (strcat + (caar ans) + newline + (cadar ans)))))) + +(defun branch-question-set (branch set) + (progn + (pushnesting (strcat "/" branch)) + (let* ((ans (ask-question-set set))) + (progn + (popnesting) + ans)))) + +; USAGE: (survey-short-answer "How are you? ") + +(defun survey-short-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (getstring (informative prompt) "") + newline))) + +; USAGE: (survey-integer-answer "How old are you? ") + +(defun survey-integer-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (int-to-str (getinteger (informative prompt))) + newline))) + +; USAGE: (survey-boolean-answer "Do you think I am sexy? ") + +(defun survey-boolean-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (cond ((getboolean (informative prompt)) "Yes") + (T "No")) + newline))) + +(defunq surv-pkg2 (q) + (progn + (nextctr) + (list (strcat (thislabel) + " (" + (car q) + "): ") + (informative (car q)) "" (car (cdr q))))) + +(defun formatfillinlist (lis) + (cond + ((null lis) "") + (T (strcat + (car (car lis)) + (cond + ((equal (cadar lis) t) "Yes") + ((equal (cadar lis) nil) "No") + (t (sexp-to-str (car (cdr (car lis)))))) + newline + (formatfillinlist (cdr lis)))))) + +(defun survey-complex-form (preface qlist) + (progn + (setq this-level-ctr (+ 1 this-level-ctr)) + (pushnesting "") + (let* ((ans + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar (quote surv-pkg2) qlist)))))) + (progn + (popnesting) + ans)))) + +(defun ask-question-set (qlist) + (cond + ((null qlist) "") + (T (strcat + (magiceval (car qlist)) + (ask-question-set (cdr qlist)))))) + +(defun qcount (l) + (cond + ((null l) 0) + ((equal (quote survey-branch) (caar l)) + (plus (branchcount (caddar l) 0) + (qcount (cdr l)))) + ((equal (quote survey-complex-form) (car (car l))) + (plus (dcount (magiceval (car (cdr (cdr (car l)))))) + (qcount (cdr l)))) + (T (plus 1 (qcount (cdr l)))))) + +(defun branchcount (l prevmax) + (cond + ((null l) prevmax) + (t (let* ((this (plus 1 (qcount (magiceval (caddr (caddar (magiceval l)))))))) + (cond + ((> this prevmax) this) + (t prevmax)))))) + +(defun dcount (l) + (cond + ((null l) 0) + (T (plus 1 (dcount (cdr l)))))) + +(defun handle-survey (to summarize subject id qlist) + (progn + (init-ctrs) + (setq total-questions (qcount qlist)) + (sendmessage + (cond + (summarize (strcat "\"" to "\" <" summarizer ">")) + (t to)) + nil + subject + (strcat + (cond + (summarize (strcat id newline to newline)) + (t "")) + (ask-question-set qlist)) + NIL + 0 + T))) + +(defun maybe-displaytext (tx) + (cond + ((equal tx NIL) NIL) + ((equal tx "") NIL) + (T (displaytext tx)))) + +; THIS IS THE END OF BOILERPLATE CODE FOR THE RECIPIENTS + +; user-generated part begins here + +(maybe-displaytext + "") +(handle-survey "nsb@greenbush.bellcore.com" T "RSVP NOW!" "nsb.greenbush.bellcore.com.1991.8.17.15.18.4" (quote((SURVEY-BRANCH + "So, can you come to the party?" + (QUOTE + (("Yes, I can come" + "Yes, I can come" + (BRANCH-QUESTION-SET + "Yes, I can come" + (QUOTE + ((SURVEY-INTEGER-ANSWER + "That's great! How many of you do you think will be coming (including yourself)?") + (SURVEY-SHORT-ANSWER + "What kind of *vegetarian* food would you like to bring, if you have any idea?") + ) + ) + ) + ) + ("No, I can't come." + "No, I can't come." + (BRANCH-QUESTION-SET + "No, I can't come." + (QUOTE + ((SURVEY-MULTIPLE-CHOICE + "Aw, that's too bad. Why not?" + (QUOTE + ("I'm busy that day." + "I hate Star Trek." + "I hate you." + "None of the above.") + ) + ) + ) + ) + ) + ) + ("I really don't know." + "I really don't know." + (BRANCH-QUESTION-SET + "I really don't know." + (QUOTE + ((SURVEY-BOOLEAN-ANSWER + "Well, please don't forget to RSVP when you decide, OK?") + ) + ) + ) + ) + ) + ) + ) + ) + )) + + +--Where_No_Man_Has_Gone_Before-- +--Outermost_Trek +MIME-Version: RFC-XXXX +Content-type: audio/basic +Content-transfer-encoding: base64 + +LnNuZAAAACAAAIguAAAAAQAAH0AAAAABAAAAAAAAAAD///////93//////////////////// +//////f/9/////////f39/f37+/37///9/fr6+vr5+/r5+Pn4+fv6+/r6+ff2dnT1dXZ29vd +5+fj6+//9//v///3//dv/2dnXV1dXV1fXVtVVVNVTk5MTU5PTU5XWV1bXV9r//f3/+////f/ +6+///3dfa/93b/d3d/f/5+fr49nZ3d3X3+Pn/29n///3//////f/d2dZUVFPVVVZX1lXWVtX +X11bW1trX2fv49/b19HO0dHNzMzLx8bGwcbDzc3R193X49nf59vn52/r48/T3c/d119jZ9t3 +79/nz99ZT1/jY29X/+tdRm//Z0lLT01PSkNGW0o9SkRrS05FV0A9Q0tVWUlK3/9fV87Zx8/N +2bzd68zBwMv3y8Ldzvf3xsrPyd3HyV3VzF3NTtf3zN/jSt93Tmtf71XrZ11VS+s/b3dLTmfn +91tG3U1N511na+NLym9v19PKwsvZ29P//2PZxs5f78RLQG//TdlTuc9O6//nd13KY1v/2VtC +vUHNO8VKv0dbw0b/SM9T11NIzlvZWb/n1VvK1WNXuv9FvzlPvzrB2UHHXUvEQ/fZRtlPytXO +RWf3P0pZUdvTd8Q9RslGSrg378Q+vb7b91/A1V3/1VvFUUTAW0W+3z+4TU7AzUPPU+93/9s/ +T8K7PEZHRd+4vm/AWUc80znrumvMSWf3vknGvufZtkO5/0fLwj27zz/Asz/C20DV/0FLxS+5 +RkLC20jPwz2//0e8x0LCd0jNzzvT6+vLQUPd1zjjuFc/uD85wU8868A3Y74927s/91ldSFfd +Se9fb3fd1z/f39dI08pHd85AWb3jQcHTT8fOPcnCT0XDz0xj2dFfZ9/F199ryuNfZ0TP/0x3 +PFnr/0lH2/fR0c/I3//jwFfX1ePf0//Z0cbLa8fbvGdjyGtX3+fdd2Pva9ffTufjTu/nY1nn +1Vdr3UvT31Pd/0ld12d391dn61tKb+NPTu9MROtPVUVrQ0lVS0g/b0JI71VbSvdR2U9Z4+/L +22PRyG//3dXfyszM68/Rxu/r293rZ+PLa9tfSOvK12f/Wd3j787bW+9r7//f5/9R60/TydfT +zNfd3crJ2evr387H22Pv2W9X79Vnb2NTZ1dnV91K9+v/513X92drY2d3//9r42P////jb09d +UVdXWVtNTFVMQU5NS0ZRSE5KTUxZV1X373dv39vR1+vf09fP49vf29vvzuNZb2fv2ev3b2ff +5/fR21dn293R63fn59fj619VZ29r487X293Lw9f3Y/dRWXfZ72PKxMPBv8bJxcTLb2d3X1Hr +W1tZ39/d9+ffVWtrU01fY1VP2d/Z1d/v901VSU9XTUk1ODQ8NTxKPDE1QUdCU9/TV2PJ4+tX +V04/StvRz8e3srCvra20uLm731dFPzQ5Oz05PUzjzMXDubq3ubrEyc7rTEdPTzxGS0pD4+9j +P/fTyDVP97hLVf+30W/PrLPO17e4XffP9z9Cb/88SF3I/0zR1dk/T189MTY3LCcrLjIvOE9n +Y8m0rrOura2urq2zsbO2wcK/z993W008Oz04LzU5MjE7QD85VfdfUVPT311r0crj68vG0Xdn +519RQkY8Pjw7ODxJPD9F/99398Syvd22q6y1sqywr6+vsbe1wbvCvdPNy7vJ0ci/v9vLzMXr +21tTS0M8OTcxLC0xLSkqMi4rLTUyMDA5PTY3Pk0/Rkj/X3ffy8TBxL23vLy5t7u+v7y8vr2/ +v73AxL++vLy9vr2/vsO9wcfGxcfIy8jd53dVSkI+PDg3NDg1NjQ4ODw/Q0lPTl9n43fd2dXV +08vV09/j/2tbT0dBRD06OT09PT9ARk1VZ+PZ68vGvr+7uri3tbKwra6tra2ur7O2tr7Fx9Pn +509PTkVAPDw5NzUzOTc3NTg4OTw6PTw8O0I9Pz49Q0Q/P0NLQU5RRP9Xd1XHX87JzcS+vsC/ +uLu9trG0srGvr662rLuytLXLvsPZzyrGrT8zw18zY808X3dVLz9IKD13PjhJPTQ9RzI9SjU4 +PkQ3Rk4/RFFXY1P/93fd58TRv8zExMXBwe+9xb7Iw8nCvMzCucO5vMq7xNu/z+P3a2dFY0tj +Pd82QjpNOlVJQldDTznJP9tBwEjB53fO1TzfvFnVxV9Ny+NVvtFPu8pN379J/0PLTUX3PFN3 +QTzNNE85XUs/Z0k859M+X8lbS8zTScfOv8m1zc68vsC6yr24v/+wU1O00V27XbzVstHO2cw4 +we/n17bP1/drWU5HPjs5LCxBMS01Pzw9Qk1Tzl9jw9VX/9dvQ1k+QFNKQd3M6+O6vMPHv8Vv +2+vP913NWdfP38zVwre9uK6zr62vsre6vHfOPEdHIyY0LyMlRSovPm80QmtOP9HI69HFzffJ +Z0r/RD45Tj5DSudb0dW8vsqusNdIb+M3L0vfQefBsK+wra2tra2tra2tra2yvNPMyF85RM8t +OjM0Ki4qLyg9NSwmO1NfLTnN3TxB09P3TUxIW0Y4MkJANjU/59lryrLvvq2rb0+9zC84X29j +17OvrKysrKysrKysrK23tbiyxGfCw9dDT0o1NDcuLio+KicvNzMtNFc3Ql9LPTxP4zk2UedH +TVNdP0hnWTxB69dNTdPIw8XEub++w2NPV8fO68q0sravra2tra2tra2tra+vtb7Ly9VfPz81 +MjA1Ni4sLi8yMDQ4Nj5DO0JKV2dKTllNWV1OSUdOUVNbb+tnXVFPT0dMTkxZXV3/38jBwry5 +srW1s7G0sbGyt7m5vMK/x8jJ09HT3dXV1ePd09Xj3+P/W1lRT0dFPzs2NzUyMDAzMjA0Nzg4 +Oj4+P05VY/fT083Iwb/AwL2+vsHBw8PBwsDCx8PHy9HT0+f319nT08vLy8bCwL6+u7+/v7/I +zc3T629bV1NKRz9KPkBDPkFHRklVT0xGRT8+PEA9OzhHMj03PTo0RjxGPltbd83nweu+wru8 +ura5u8W7tLzFzLvj09PG/13n/+Ndd19jRUpdX1FO69PbycW3vr+4srq5urW/xsjC1W9nW0dD +PkM5PT07OT09PERGRU1XSExZa01FY01JQkg8Nzk3OTQ8OkM96/d30726vLKtsrWsrrOzsb2+ +wcvbW/dDTUdJPU5BPj5VRU3/5+/ZxrvNvcW8x8rBx9nV3/dPTl9RSl1jb2P3b2dRTkg+Pzs3 +NDI0Mjw6Qj9bU3fj2cnIu8DFvbq6yL++xcXIx9fd2edv53fK11/v481n1cPO1dvTzvf351lX +TWNVU1lbX1dX//9bb2POV2tv70lGR1E/UVNMQE9XZ1VfX2dj1+vT2c/PydO/77/Cv9l3X99f +90pITkE6TVU9Rv/rUW+/uL65scS2trrBzsW4d/9vTmdIS0YvLy83LS8vNTtMTkNCyL3Hyb21 +sryztbSwtrXB08G6xb531edjb0w7RkJJOT9JSFtf50TNd07PUWc67706NddPTzxrTj8vb+dL +Kziw5zA70cHbxbG+w62070jdwDgsQf9DRO++ycC0yf/d/0UxNUs8OFPjwL6zrVWts2M6189E +Lt/ITreusa6trcbGutE9U0hIRUNdb8rjZ1fZZ0k5TVM4P904NcnfMD3FW0xOSE08QzI9UzYt +W0gvOUbOPz/Kz0jrxc5OyLa857u1wdPAt8e8s7S2sK+5vrm3yuPM0U/Xs87Rua/A39XXPjg6 +MTM4NS87QjYvODYuKyoqKy4qKDhIOztvv93Au7eyvrnC18K6w7vItK23ta2trrvFrK5X77a4 +xWvBsb/Cys3C0UE+Nzk3Ki05Oz85StXfWU1ISzouKy0vLCoxPD9FXV3Prb43yrVPRWvfxufJ +us6svbyssd+z0dtfPUM9St1bTbPEz6+7ubXKuszDz9nGz9XOyMXGb9fZ/9s7R2M/MDU1MD0z +NUM+TElFY1NHRkZJRkdX/9fM68bGv8XLv8vIx8nHxMzOwcHJxsHGz8vO99/M33fT/2/fZ1Nb +VVFKR0tDPUU4ODs4MzU7OTlCRUddXWvV2dHKx8K/wry8x768ysfCz9HV2+/v929VU1tIS1dN +SFfvZ3fr/+/d71Vn/29VW93j3c7MysfJyM3O0Wt3b1lOTE5VU11Z/+f/d9nX593b19HTyc7J +vcHKv8bO29V3VV1MUVtXV3dd79fvz87O0cbGy8PHzMrH39H3b2NHSEpAPDs8PDk5OTg4OTU3 +Ojg7PD4+QUNGS0pVW2//49vNz9XO3f/V4//R3dXJxs2/wMjHs+PftrzHxMrFur3Rxr+9xMG8 +y8O5wcXGxcXGxcfdwLpT57lLLbRPLDxdNS42PTAtMjY5LjE7OTQ6SEFASN/3Z9PJzcnIxsbI +xb/Hysi9w8y/v762tbm4ur7Bu8rKyNHbb+/dT09rP0VFOT9MMzpCPj5GQkZNY0BHZ0RHXURA +WUtIT01BU1U9SGNFWU53V07b1ePGvr26ub+3u7y1vbi4vbvBwb/EwL/O68rTz8/jzdHMzt/r +1f/n509ITk89OTo5OTg9Ozw/QkNHQU5VRj5MRkdXa1/nzdnPvtFj28jI7//FzP/Tu85MzLvE +X8LDXcq+x1vBvM9DQEdL39HX08rA011DLy8wLCgqLTVVy7u6sa2xtcs+NDUvLTE3RuO0try2 +s7W1vcfMyclv58nJxLi4sMK+r7vbyt1n1+Nfd0dbTDlVSU1jZ8vN1cb/TONdPzg6VUXfzz0x +SUpPXVtTR1dbOy4uKi42OURTxK6tr7G8x8zvTklPa8zAxc3vwbe8vcDIwr7A3V1PY93vS0/H +v723ubnTX81HKSs0Ly9XRUHdt89LRFVOVU9RR1NNRExLU+fHwl2+v1X/zk5KTm9r2b61vLy5 +1WtbX+v3v73Dv87ZyL3Dxec4LC0817yvsMPRPzIxNDxBW/9ry7S0srfHY1NKOjpEPVnvY19I +PzpERUtANjzZSlFvPDZjR0fL37/HX8HjXbG9vLPVssHTuMjfucnEtruvusjZPiwuLDhJY9HP +U01XvLu7wFEpJCw0za+4vsLDuLXPNCMlMMSsq6u7d0E8QEpd99XJys9dUUk/TlVOU1s4PUpF +R0xVUUxXd8Kzy81Xz05nrK+6u0tLsbu2rMBPPTIuPWdX2Vk5RV1vQTcyLS1N60RLPjA6P0rn +yetZy7q4ra20w626xLm/vrmura2trb1fRT9N2c/P1f9XSUE5MzU4PlVvT1E/Ni8vNjtGRj80 +M0FGSltrQUtLTFdI5+fLwV/v28C1trCzwb6ztb28ur3BubW4srW9z2dfd9Pj28LBv7rH2WNH +1cbbvcNMLCYpKDK4s7vCNiQiIis4Z9FrXUg1OTs4Pz9RUT1JOzxASGdv72NEQ9s8Wb68/7ay +4721vMStrbG3rbi8r7W9sK+yu8DjWcC/xb6/72/Nw9Hv199OSj0/PUJOVf9nM0z/Q0/VTDs4 +QDYsL0lNY9X3Vzs8SDY1OT1Pb+9JNkhjb9drQzc5Sv/369X/X+PDvte+ts7Ps7rEvdXXta+t +s7/I38m0t+NvT0/ny8bO38jLwbrL1+NNV29jV1tFPVH3Tj83Ly44RE7Xt7rTWzYvN1XCvbm0 +xcvXW05GQFFPSl1ZST86PD9LVUlBQVXj2+NnQUBO68DZY11f18rN4+fn3+fF02/Gvr7R/8zP +w7y80cXCyb/HwcPAvc1n/3fnx9XT09fBa0ZBQv++uNFJW8hjPz02Lj1RWz8/a8VfOj0yKC4+ +MyY2yNNCR2/jY2/ra2/Nwr/f28O2tMTHvrCxrrfPtbW+u7O4yMy8vtnEvMTIxMdvR05VRklN +Sjo6PkEzMTs+Ny8vOzYrKiwuLTM2Ny86Sk89PUvRye//ysW/ubq+u7Ovr66xta6tra6wr62v +tby9uLO3vb3By9Pb605fb2ddY1lKS1lfSUdKRU1IST1AOz4/OjYyNDo4Ojk7QEU6QEQ/S0g+ +Q0RJSkxVV09O511NW1dbb1vO2c3Ky7/Dwbq/wcDKwr2/vb62vcC2v7vFwry/vb3Rv8Xnv933 +2f/va/9vT2dZSltITl1CXT9ETD1DQD5OPUJNPkJBNk84QE09QVlLR3dIXXdny2v/y9VvxdXn +wcrHxcbMvsbIt8nDu8XHw8zryt3d79/ZV8tbWWNTU29NX1dOb1v3Z13bX+Pn3e/O18fL2cXj +b8jM/9PPXczVWd/vV2vnUVFXT0FTVUBPWUdNSEVCRD08PDk+PTo9Pzg6Pjs6Pz5ATk5ATFFN +UWdba9vb3dHJx8K/vru3ubWzsbGurq2tra2vr66vr7Cvs7e4u72+w8jM1d3jd1tPS0ZBQT8/ +Pj46NzU0NDIwMDAvLzEuLzEyNTQ4OTk7Pj1AP01TV2Nn99/f19HOy8TFxMfFxsDAwcC9v76+ +v7+/xMC7vLy+vr3DvsbFx8/TzdPd3dn3b2NvXWNTTlFIR0REQ0Q/QUNJS0pdWVtnb+/n///f +d+/r39nn2+vv92dnXVFXWU9XV29dW2dnb+dr99nV29fZ2ePv/29vY//vb//Z793b0dHP1c/T +zdPZ21Xd1SqtrDwjrqwvLa2sNDK4uEkx77rRMWe8VzDTuj4xybtGPN3PY0vn0d93z8jV583H +62fV3VFMS8NdPMjdRtFNz+vrSdm060qxzWutUVWtwziurS6+rHdHsVM/tl9Eb7o+vLsxvb5I +ML3rQD9v7z5H0T8uP7czNEXXPjw5XVEtR10tR+9VPTXv9znZdzeuWzbOu293xe/ZvMHPvky/ +rbxF562t6zStr0i+rsbOta3vzbews+tJurTJyELOtF0409dE71tALU68NShCuzUqMuM9Lz0+ +LTZdQyksRWcyKS/X5ysv004ySt06Q8q2Vz7DrsFD3bmv3cy3t823ssNfwK22Z8W0r9v3vLdr +0bvFW8i8vFd3urnZUb2832PN2Vdbzuc8Qs3jPDVG31kuQu9HOktXNTx3WT49T9NZNFVvTmdv +VffO0+9vzsTL3dHCx8nNwL3GxbrFzr6/083HwMpva8lvV2NNTGNXPj5LV05CTmfvSz5Db0s4 +OktCOjg8Ozg+STc8X99ZR1fCx0nPssvZvLvA472vv/+/ucbrb9nDV+vFzcm8u7i6trK4yMHB +z0s/Tk43O0I3RXdvW2/Kw8jd28/ja1s9OD09PTUuQD80OV9LTkv3yf9nytffy8bGxsu/vs7N +wr/Dxu/f0dlrWdfJ71Nj9/9MR1VFNzxLRTE4TVc8P2/PUWPI0WPvxsf3Y7i51/e/usTVxL/H +xbm7v7+/vMnOwcXj1d3r70xVZ01XUU1ZU0FPSzo8T0k2NUtvQzRATEk+TW9MRVtdTElPV9vP +62v3u77ZybzFzsPDvri5t7S+xbi568e93UVPvtk6SsDrT0TMu01CyE4vNk8/MThjVTo9X9tA +PURPNzRESTo/WWdHP0rXTkFFystMa8fXT83H11/Zsr7XurG5xLe1vt+8tr/BtLrVwbeyv9u6 +tttZxtlTQd13OD1jTTE3SkgtL0k4MThHPj0/21VI3brX/8fAxN3Xw0k4Tu9KSv+4u99OU2NK +My9LTUVd/1n/287d3b28zc7j/9tVP+fFw2fNu79vx7rAwsvFxMzjwc3vyL/C09vNzNPbXWfv +Q0dCPD8/Q0ZRU+9VRGvv51VV9+9FS1dHSVX302NX9z01PEU8PkJZ51lDY1tKTd/b487d6+/N +x77HvLi5vr++v7y9z8nEvMfByb7FzczL111KU2NDV9lKTOfvSE9NTv/nY01Z23dV3+fvxMhn +Z0RG3WNHX1fja0RGV0k6S09XQz7JWz5T/0VJRj9ZSV3RX0pbb3dTSs9348HOY8O/vMVTy7bT +v8PXvrvJ6/fZv8zn09W0tsbNus/GxmdVY+vvQkdvdzs2OTw3Nzs8Nz4/NjZTP0FnSmvnV9Pb +0+tn28ZKW8fna+fPzk//wNfj/9m9vsrKub/Gu7q8vL23uOPIvsfj48bBzN/L1efMTErI1UhT +710/PU1OQVlrTzs4PkQvPFFAPUJBQ0A0QFdB//9rRllv1VFNX9XM1c3Nwc7GxtXZysnv67y5 +yFfO393O009vy/9v5+vn3dNNSdPHTU/300o+Y29NZ8znVc7L61PR22fd49vJt8zj78G9yc25 +vdHIvs1rY89v486/10rn60xJ3e9JTk1MOzlAOjw2PFFbOD1AQk02Nj5CVWddV1lbZ2NP92/G +zePGvbzK1cvK2efHyMXLw8rbyr/Nd+/nyHd323fT2993/3fb1UxZb9tPT1vT3Vdrb1dT9+dr +X2vTTVPT90ZJR0VTR1NMX9fvV1VZSUpvd1//z8PXTOvN79vN0cLA6+//Y29na2vLxMfV09v/ +d/fPzMnV0ePr319KV93P91vb7/dnTGNjd+/f58rG119T705dV0lN30o9SllMRk5ORT1n60Vd +9106S19bSVvV09PT23fPx8rC3c3Ly9fJb+u/29vHxs7My/9Nb9dfa2fd18rZ/2tv3XfXX2/Z +TmfnV1ffV/dvS1lVT05ARW9NZ29NzNlOSlFd301HW1lb/8//WdnVa1tr92d3/99j/8jfb99d +/83P38/Z093/0ef319Pfy8Z368/nWUdNd2f/6+dda/f/909Pd9/ja+Pn19POb+ffa+tXX3ff +a//X61Fjd2tXSktbWU53d1VZ987b49X3/83Za3fVwb7vZ+fd591ja+Pn629dP11dT0n3d0pO +Z2tKb813W+trb9Pf/+Pd12/j31frzNX/z9HbY13r4/dTWfdvTm9ZSFld2/dbXXdbUWdd/1XL +xltX1+9v79fH0d/O/9ffb9X/SnfdXev/28//6+fn2+/rz29f1c13/+9r39Hv2eP/42fnWVNZ +Y2NZW1vr1d3/b99nWf9d99HLysXK1efV31Xj12tX2d3/Z2dXSE5ZTE1FR1FXTU9HTElTY0hG +Ue9bWU5dd193/9nf19Hnb/fv99HZ79PV2dXXb+/j58nL08rV18PH08rG173JzsnO28vCxcvZ +ztfvT2df7+tMSEJHW1NLSUxZVU9JRUtVTU5RX2P/VUdf31tf71tbb29VWVFMd1FKS11bSEtZ +X1djU1Pn/1tr52f309n30e/v0dfryc/VzsnH093P2dnMy87OysHHwb7Cvb6/ysTGzMvd59/d +3dn/X91fa1tVU1dvZ3ddT1dRT0JAP0tPRj9ETVdOTUpISltTSEVET1dbU19XSl9ZSkhFTUlb +WVn36+fTze/XxM7b18rIwr/GwcK/vrvEz8nNy2//W1VjV19ja1tTW1Nfa+//b/f3//9vb19V +Y9vf3//v59nj49Xf28/P4+vX3d/fa/f359nj/1tjX1tbUVf349nr19fV19X///9db2tXVU9H +P0E+RUVKS0lMUU5dTEj3d3fr3etrW2/nXVdd29nja+/n5+vn38932dPXzs7N287f1dvPyNHM +09Xr92dj4+fv4/d39193XVtdX2/f/19v5+drZ/9v599j9+f/z8zOx8rDycvOx8nLyMnHytPr +5+tnVV9jWVNZW09KQT9FRzw+Pj5ERUpOTVlLUV9JQ0pNSUlLTVVbTlln//93Y19ZY+ddZ+/b +y9XV08rH19/b59XKyMLEzsXKy8jNzNfn193R5+vRy8fEw8TDwcbDxNHj393Vzszb/29ZV2Nd +UVlNVU9TVU1NSUtKSkVIRkRHR1dbXVVOR0tfSUhNPkJRU01NU19rd/fv/1dv3dfOyMjLy8vf +293j59XR09vf2d3Z083OyM3PxM3My87Jzs7Nz9nf9+/j0etja2NjZ11ZUVdJT0pVU0pOSERD +P0NHSUZCSUpNSUZLS1drZ+vn783MzdPPzszN0dPJ0+fO3W/r09fV3+fPyM7b2/fV1dVv19PP +zutZV2d3Z2tra2drV1tfW1lTUWNv39ndTln3W1lXSVFjY93Z7//FyM7n9+/V52N3a+vRzMvf +29XV1eN32dXP2dP349/j43dTXV9bQ05GQ0tMV09RT11bR0JMTkxbT05MW/fb2/dv5+fO29/d +zM3PzM/R1+dj39Hj1+dbV3dfWVVn69/r52ddT13X0+Nn59vZztXrX9vR291v3+9v09Hfa1/v +42dV2ePfY/9ZW+PR0+tb3dfn499jV+vvb3dnd+N3b9fZ71VET09da1lOUUtXT0xNSFtbX1lb +Y2f/X//NwcjMz2/fybzI0dXPz8rjVV1r485PR0tVXVtJRU9jZ+t3W+/n411jb+vZ1+NrZ9vO +011MTmfr2c/Tzcvb32/j3+fV0cnFzdlv41dX91tKWWv/409JU1t33+tNT0RGUVtX/+tKSERH +SVtRWV9La89fU8/H1dvX39/rxLm958C6v7W90f/RwsLfW9nNydH352/DzF1nSlXTa0JNSERH +Pjw2O/9XSDtO29NTPEFHV93/V0Nb91NbS0JRXcfCy8Xn38rv577N09fPzc7LZ93Rx8HKvb7L +39nn18bK/+dvd9/N3VdRWUhDUTs4d0xNu1syMjBVzlVJWd/GwNk/MjxOwbxMS0/T07rHb7C/ +69lVPtGuvciwwk6+9z5ESOPIXzRRvv9vSzw+47+/zltFx81bw9lJT79RMT9fRmtTU9VZMdfb +PES5az/F51m7vM7byOvGvVXjv2fXzTj32UfdTUU/Rt9DOV09Y+NMvj882///Oj3HVdfZS01b +wbnjd8RbvbzB00mssuuvT0+us7/bQsy7vF3bz0xNtmMxyL430esy68frWWc9PlVTMVfKK10/ +MEhrNjLvNTjLSzV3wDdXzWdjwlvGMa1bvuM/vt/IzetXvs3HwkC32V3V1z9X177LyddMd99j +ylNrPMnd7/9rZ1XIxUlrY7tbv+c8tcvPY9nJT8a8PUi5U8q9XW//zuPHPkxTvEo4uTk40U9N +P0Q7W7cyM2ddSf9vMzm6z0tOQC21sDxjyUjHusw8Ubi3ur03Nq3DUUhO3bC6ySVA9+vF5z7J +vkz/zT5fW7xVRMNIPcxrOsDE3UxZRk9VV0pb10hKZ2vXQ1PIyLi8PFu3x3exzFe7xL7GycFT +y7Tdzbo3QKzNML3MMj9KZ76vvzNn5yMnQC48trzfvr5NTOf/yr5EO85fz77BXVu0zVFLJz6v +3y7T22vKti8luq1ET7Ur1a33Kz63rTw+RStLvNs3R99fd71FObGuW7/rMretvD08vbdd6+/P +r8ROYzpOYz5RvrisrLO5999fNEzvRMEyR7g7X73bLy1A2yN3rc05P7W2NyoyNrOuv8vZtbLN +Ozg+b9dvPjr/tb/rZ8XKyb7GRU7Nxzorx8ZRQVlCOkjJ4ztX389rSC5RtLfDvb69xOfOx8zF +LjzDubtjTz4qLT9VPV2urbmvu1Pjz++8dz7f0b671W/Mw7rZNzc0NDs3Ki1HZ99jPEVdTEdd +Rl29s73PTV24trrHx7y0sdfVV1PL2UosOuPJzkQrO7RXOTZLuqyuua+4tbfDyLzZ98XNyMvI +41tBOjkzNC4zMCstMjg3OT5DSkI6ODhHwL7C51drzdPIvsW0wri7wLq8zv9fSbq/07ndUXdj +WbO3y7W6ta+str7BXdfXX+fd2//VO09fSVc9LS82Li0uKzA2LiosLzc+S1XrzevAy8e7ybe3 +u766trOxw8PN49nVWV9rUe9ORknf3VfPV0/Pyc+2ub6zwbm/v8e7vtfZUVNHTU8zRTo1Pj47 +N0A1MSswOjQxLjE4QVVn3by2rqysrKysrKysrKyur6++xc/jTF08MTEpKiktLygsMi89P1c/ +19HIvbyxs7mvvb/Husu/zedfUV9ITUVOQkk+Qz85Pj41RUVGREM/TWPdwb+2rq6tra2tra2t +rbKyu73DyF9PQTg5LCwrLCwtKiowLTQ7PkZbW9nFu7itra2trbK0sbjBzP9JPT43Oj0/PDY+ +OUBDRUA6PTQ5NTE+PDw+QUlvwrmtq6ysraysrKysrKyytriysrS/70w/ODYuLSwnJCQmLDE2 +QEDdXfe/uq+trrevsLOvuLC7w8/dTz5CNTIuKiYnKCkrKiovMTM9U2PLxcG6uK6tra2tubm0 +uLOwtLa4vbq3uLW2ur7Fvbe5wru+w8xbY1P3V000MCwrKikoIyMjIyQrMD1NTmfZxLWurK2s +ubm5uLOzv8PO1ePN29PvVzkxLi8xMjIuMjU9Rv/bxry2raysrK2tra2trrG2ur7R51tFPjkv +KCkpKCYnKycqLTY+TN3r07uvuLKtrq2tsLCurbG0ucHDd01KQDYyLiwzLi81NzU6P0JPU0pR +V11d493PxsfGybyxtrq/w8PHzMzO39fEa7+0v1nn1cnNwL3AxcO9td9vd9fPXU9C3W9DNDA0 +KyMjKDI3OFHFwrm7sa++y8a/tr7CvLKusK+ytsfbTDstIyIiIiIiIycvOm/Py9vDtq2trq+t +ra+xubu/tri5zOvN50Y7KigvLCwxODpE58Wxuresq7K8u864xN22s7y3vc+1vPdJPC8sKCQu +PjA6TkVCQ0rrTTMvLjsvOUtnzri1sbbAvLHC513fwN3/ydfBvrq3xru2v7u6tcHfX1dVWUJL +RTZAY/80MkdINS4jKCowLCpCZ7vBrbaurbS3t77rw8O7vrmzra+ttb66ylc9LiojKSclKy0q +Nkb/vK+sq6usrK6wwN/J70VRQe/r/1NrTGc3OSszNikkJC42PTlRwK6svq+svqyuvsy/u7TI +0bTfu8JJTFFLYzguOCwzOCg6SDJAP0bb693FyK24u768s7PE0d3Xz/fFuLjVtLnHrbi/urS6 +28/Ryf/rTEvCzDk3LzM7KSMvYyszSSw/40Qv98pbUTf3WdPKTcKzu7OyvbW9x7/nzUdKPuc4 +MWPrX1m9ucF3wj9M3SlBOydFxVPjZ7z/xq3VvaznS61DzUGxRi6tuzS5X8RZ374o3UEryy8z +xlPARdnFStG0M7XLO8JfQLjvX7o/z7stu0g1vzs33zRBWyu9NbhHT641rkwvrkd3tC6xwePf +sz9vrCesKzmsM7yxNqw2Ub++PMvKNawurj/FSLY0tOc51U02v0I81TXJQ+suvi7B0zPbYy++ +Tz+tONW9QNe6Mm+xL61nN60sb602tK4+tWdBrS+/xi3MySyuNmc/QD3jN7Uqryxf4zW9TTuv +LcrBP607xa4yrev/rz66zkfj2z/EyU3Ru8rT68zKRMPOSc///z/rW0xKOcs6W+s7V9NOZ8Y2 +a9E9b0VPV13JyUy/U/fTxsi5PK09u8PJua1dsNXKvOfCPve/Mbc7/1n3Sdk21180xTczvyxn +1yq/My/ZMdVKM8MyN78tV1szxDJbuS2/VT3dw8ay77TLxa7Hxq13rcC9sLdbrT+t2V2yY7yy +/7xfw9vjPMRZRVHF00PEd1HNS85bTevMOLg4Sc8w9zA6UzlENk88QEkzUz9nNMlH389K20bH +d120R8K7NbfTP67nVbQvTrQvsUDXV7FAtV/PvNVHsDbLy0nFPMRVY9tHxTg/vy3KPD/rxDa2 +MN9ZZ0S4QblGu9fKXVvTSdvj1T65RuPGb0u6OrxPd3fnX/dV5022W9W9QbRPxWOvQLrAwL7O +y8i8PL1LtEPXV7k7xDjCO3fO4zq+PlnRREPXO88vQ0jrNmc9Y009RUkvuTRHdzpLPMY5TVnN +VT21U9XXyGu34768xneyXcLIv0a6P7nV18JXukTvtj/MS89BuFtLv1PZW9tR091CyldDvj3B +O9XPS9vKOsc7xz1jzTjTUePdVc8/skG7Mt3vb9k/uzq0U9/FQ9tB2c80uzu3OrtLzO/XVdlL +PMVE107HSl9r3WM9W2dJyzGwLr7ZRtF360++SuPf40PjX0rD3z26QcNIvz+9Qe+7O8LvVbk0 +tfddyNndb0C9VbtVxW/TX09TVUhJ70VXY009a1lH/0rTTfe/yPfD47tnxb+/z7fA2bLTXbVX +u0m/ScDOY9XOV1fNPms+azTPPTpfOT9FMFs9zzdJQu8+90VfWfc32TjRWW9vV9dv/2u/TblN +yEK+90K6PLhNxM5DuetVvefbTLjvw+O7zve6v0fDVchOtD+/013CM68wska9T8+/QM5HSc1R +711GzULKNboqzjvjTi+5Mt1vX0FK40ZX68pfXbtE28fKTsfdZ1XLVePN0zvX91M6wkxOPbg5 +RMI/zWO9SrnDxNXvvlG02f+tWbhPvd/fs0i80bpGw79Iv0vXQE9nMMs8QDZbPUlGMV9ESjnr +TUVKWzz/70dv28NMzNtFvl/Z49fFXchvWefRa1XFVdlXulXTvc/Rzs3jwc7RyMzIwcTNv8jd +yMm/19Pf6+dnS2/nTGtPQFlFRz9DPjg6PjxCQEJJSmNM30Z3a2dM7+ffR9/X21m81dPLz83I +vVnTxM9O3cpTxV9nUbxvU9PvSXdVX0bfR+vZZ8M/vVPNTb8+698+/1e/POvJ28PEuc23612+ +SGM2TD1L9zPFycK/w6zjrLGu17RBz0dVIy0vLykzMDk/Sjc9Zz48Ok1OZ87NraysrKysrK2t +usNROSYnIiIiIiMpLjVGu6+srK2tra2tr8PXXz0xMS8/SUbfv763vK/Gv8ZGL1NELytBOE9V +38mxr7q6rb3Bzrj/t8bHtbOzu7CzvMDXT0Y0JiIkIyMjIyMjJis5WcK9rKusrKyssrK0wsnn +38bbwevEuN9nusrXwkdTzM45Pci+Qbq7tbi1zsW541lO10ZL5+vDvLq9t7W+y9tRNCwnIyIi +IiIiIiMkKzRLa7Szra2tra2tra+zvv9n31tRTVv/d//n12PXxc/Da8zLv9X31b/G18zByb7K +xMK/w7/Gv8TGzt/O0Wd33VVrSk0/PTsxLSwqKCkpLCosLzEyPVXXyLazr6ysrayusrjBz85T +Qz44OTc2NzdHRFNd3f/PvcTn08C9vcG0r7Cysbi0ubnI519ZOjo1OzxHTVn/b13vRU9FPS8u +Ly4rMDA5QFdb/768tbezrbKvs7Kzt7m8v83Pzd3//1lIR0M/NDIyNCwvMTYzNz1GWU9j1b66 +vbGzrrK1tbq9vdfnY2tOSUlBRklBREFOPEg/TEJMTEljd9XPvbm3t6+1trW5u7zBxsLD1b/J +vsvH5/fnT0lJOjcvKykoJyUnKCsrLzc7OUz3/09v0cnPu7q2trW2tLy1ub3Cw87N/+tv6+vd +59HjysLOyb61ysvAv+/3zMzZx8nHwcnFys7Bwcy9x7/J09Nra04+Pzo1NC8uLSkoKSYjJywp +KTA6OjZT2dV3u7extqysrK6tsbnFvshvZ+/rX+vIzMzEwcTOwc3IzHfdvtXv1c/KZ9e/07+5 +u8DEzNNXV11fS1dn51lTXV88PjwwLSwuKSgpKyskLio0NUZV983Nx825tba8sqystK2vrLO4 +xcPO90xIUUJFV0hn39HTzsXCzdnEU9W/3+drzOtP08DAt7Kys7y9u9l36+vfT2fC0V9r3Ugz +OTwuKjAsJigtKiMsNjA9StPvW8+7xc3Auq+/r66vsrnAxW9RQzo2OTg9PUNZ5+fKyMHF09vj +TT7V31E+U+tPZ8m7t66sraysrLm3r661sK2tsK6vvc3TVzcvNSwlIickIyMqKC47REJLY8xT +0e/AxcPBtbi1wr/dXz88NDQuNDA2OEZVU9HNxtXRzv9R281JQf/XXee3uryysbm6sba2sq2u +rq2tra2vsLzLZ04/NDEvKSYmKCIrLjgqPEFLPVnO3dO/urO9s7u9ys1jRj0/PDg9P0FDTExj +TvdTTU1DRztPPktMUd3jy8W6s720uru4urK0rrGtra2tra2vtL3L3Vs+OzsvLyouKjcsPjlE +PktbRkbv3dvjtLm8ubG7xtv/QDswMi8tLjQ1NkBFTD9LPjw5OzkzO0s/R9fIxL+usrGurbKx +sK+xrK2srKysrKyzt7jMSm9INi80KyosLywwP0M+S9dVR2/v/9fGvLq0tLW7vtPbTUU7PDM1 +NDU0PTpGPkxISz0+PT41QUdFRc3XyL2vt7Wvr7aysra4sLWztK61r7m3zM9OSDUwLiwrKist +LjA3QUBXTtXI0d/Fv8m/t6+zrayttLa82U9JPjMxNTQ3NUU/TUxXR05EPTs7MzpERUlf08zN +ubnAvLS5xrO3u7qvr7GzsbG4wr7NWzU1NTUmJzA1KzI7Ty493/9BRr3rd8qusruura28uLTM +T013RDNEU0g/V91TR0dXOTI5MzAyPjZB3eNNb7rZzbq3vMO2vMW8uLq2rbK1ubG6x9FZSjIz +LDE0LDQ5PDJNRVNOwsDvu7u4xrKsxrfIrMPGtrvDyV9bMzQtMCktLTgwOU/nX8zrzkxXQ0M/ +PTpJREjKtnf3v7nv17Szvr21usK7uMC1rbTIuL7Rd01JMi4tKjEqKj0yOT0u32NB48S+wL+t +u8awr7fKvLPHY73B3V9r7zw2QDgzMTc/PEDr38/DwdVj3e88QUlAPDw0VbxrW86vvdG/rF+u +vbivwa25ra25vMDrxkItyy8pVzw0KS9HNyZEPC8yukPGz7evSrmw289Zvchb27lnudPrdzVJ +NSs0NzJBT/fP57i93dtXRzg3OTw1S19T666sw7Wsrry4tb63srG1rKyysLG2y1dPSDsuLC4w +Ky8+LSg2NzUuOltBRsHT67muu8HBs8LOws7Nyr6+yL6+y29VSjs8PDk8REZn3dvX4+drUUU+ +OTo6Oz1BQUlj19PbwcS/tra4tK+ur7Czub6/yf9nW0A+PjgwMS8uKy8rLTE2Nj5DT+PT08e9 +vb6/vL68tbW0r6+wr661ubi8ydHP3+/bb1tbWU9KTUxDRkhKSEpNS0pNRkFMSkVJTkpJW2/3 +48rHxMDGycbIztfXd1tXSz06OjIuLy8sLi4vLzY7P07v18S7srGwra2tra2tra6ur7O4ur/L +1e9LQkE7NDI0NTQ4OjtBTFdXX/9fX19KVVFCQ0lGRGPd2cm8uLu1sri4tbm+v73Izc7VW1VR +PTo8OzM1MzIuMTU0QUh30cS7s7Cvrq2vsK6vtrW1vsfGz+dnX0w/OjYtKyooKSkpLC41O0BT +Z9fOy77Fvbm9x8fK39fRz9PGv8XFwcvKxcPTycjJzsvK693bZ01ZV0VAQjsvNDMuMT47SVnv +1cy8urWzsa6ura2vtbW3u73Cw9vvXUM5NC8uLC8tLjQ8PUJVY93PzcjRvsLR0+9jTF9bTevR +y9HJy9nLzcvZzcrTycvR5+NvT0pIPz86NjAvLi0sLS41PUhP78e8uLSvr62tra2tra2tr7O3 +vsHLY089NjMsLCwsLS4zOD1ESuv/09PFytPN79lH72/32dXFu7+8vrvCv8a8wMHCvcvV09tP +U3c/PEA6MisuKyorLTE4UVXvzbi8tq+trKysrKysrq+0t7zI4/dbPjUzLysuLi0tODc6Ql1X +WePJz9vT71lrb0gwxb1B2f//tcHbu8+6tcGxvLmvvcnTz8vZZ1E3Pz0uJyQkJi8xKzJHY2/B +zbWtrKysrKurq6ysurO6xGdTPTg9NzEwNTU4Oz00N0BAN2dZRT1KTVPvxtHKtrb/99Vn9+/3 +27Gur62urLC4v9VHyT8vPDxILygpJC9CRiw0U0H/TDhfra2urbmtra2tt7TBx8VnNTpLX1tV +PUJrz0hCPjdDQDzn/0dLY2fd583BvrrfPT1BY+/398ivsK+1trm8tu/v3/dbPkFGPCsvKzXV +PztVN0BOMUqytcG0t7y1r6y8y7z/b2tdQkdf109FY0pnTzM4Nzg6TlVdQ0FE/7/Bxbm6zutv +b+fXtrjIuK+tsrq9vt9fZ0pJW0Y5Ni87My9nOiw9Y1M7PsO7wsm9v761rq26ur9rP0pZT1VV +42/bzspdS0E1ODg6OkZRTEpMZ2fPvrvAy2tb68nDu7Ozs7Ctra6yurzKXV1bVUAxLiooLi8t +MS8wMjM7R0tv0cvCvLi0uLe4wsXI0efTd11NSUdDRUFDU1/3TmPr3ePX029vWd/f0dPT92Nr +XdnPzs7L1dPGwbq4tLW1t7a3ubrB1WNKPUJANzUrLSwrKisyNzs3O03/zMC1s7a3tLS0tbq8 +xtNjV1NOSEY8Ojo6RE1PUVlnWUhGTVtjX1dOV1Pfzce/vbu3t7azr62ws7i7vb7IzutfQDky +LS4uKS4tKTAwNEhFY9nGvLyzra2tra2ur7G5usrbV0U8NC8vLi8tLS8vMzg6R0tT/2dv2+PV +ysfOxcfNwr++urq5t7a1sK+urrC0try9v9XZX0Y9ODAtLCoqKissMDI5Rknr1cC7tLK0r6+x +sbK8vsLZY19HOzoyLy4tLi4xMTc5P0pba9fIw8PHys3Nys7JyNnTysvNv8PBuru6t7a1srS2 +ub2/xMnVa2NLPTg0MTAtLi0uLzI3PUROW9nKvrm1sbK1srS4urrI28NIQD4+NTczMTEwMjM7 +PkVPXe/ZzMS/ur3CvcHMx8bXzcnT1dPV29PGxcXFx8PEv8TBwMPHzdfrX01JPjg3MTAuLi0u +Li8vMzk9Q0xd287Evbm7ubi6urq6vb7D1ed3V0hKR0dJR0ZMV13n1czCv7u5t7e5u7y9w8fX +2/djSktJSz/3JNW4TEkqTLO8/+fPysnRzN/f61lLPD5NPDw/PDs1Ozo4Mjk+RUhd3c/Hv7y4 +tLCsrLG+yce7u7nD11NJQD9IRUE/PTY3SVnZ3dnbycm/wsPPW1dXUUxBOz1AR2fHv7/Bwb++ +vr7GyWtn52ddT0VDSllbR0Q8Oz5AP0JFVWtNW+vEvby7urq4usPJyMrVSz06Sd3Kz+d3a/9j +W1VJQDs8RlN35+//08vAv8jTXUs9S1tPPjk5R9W7s7G0uLe4ur7OX1lOVV9bU1djZ1lbWU9H +RD4+PT1BPT1IW1lVXdPHuri1usn/18jH1Ug8Ru/Dwszr/9/n52dORTo0Nz9TX2Nba82+vL/O +519FQFNnSzsvTN+6s66vrq2srrjCzdv/VUxPRkVZX0w/QkpTTUk9NThATUs6PVN3y9fTxrq3 +ub3Fz9/r0eNLPUld99nIy9vf2e9ZR0Q+ODQ1OkRRX2/Rx8HDxdHfYz9HX1s9OD13wrm0srCt +ra28yMrM3VVHQ0ZKT05APD1LS09IPDdMWUE2O03RzGNZY8+1srrLyMDD5/fJx+9V793NycfH +09vb31lERj88Oj9DSk1b59fn2dlr/1tITW9HP0hfz7y2sLC0sq+3vr6/wc/Z419XW11AODg7 +PDw8OjM0PTw3OkRGR09n59HAt7vAwsHAu8XZ2d3VzMfFwMLMzs/nWVdJQT8+PDs9P1FZXWvb +729nX1lKPUffY0dHXdvOxrq3vbmvr7e4uLzAx8/Z729j71NJSFVMQT1BPTo5PDo8PT9RWVVO +58/T0czN3fdf0cxfU+Pn4+PT193359/3T09RSz8/REZHVWvr79HJxcjNysbN0cvV08TKzdfL +x8rIv76+wL++v8LHzdHd2ddvV0lLR0I/NzY0MzQ1NDY6P0VLUVtfd+/d19PTz8rExsXFw8O/ +xMnHy87Tztff619PTEdKTUxKS05VVVVPVVVZU11rX2/33dnP68rRyMnOz9PX083Jz83T19nO +0dvj929nX2NXUU9LT0xMTUtPUVNPT09NUUlKTUtTT2dd/9nOycvGwb68vL2/wMTByMzR23dn +TkVJRT8/QEA+PkFAQEdLV2v/1czFxb/Cv7/Ew8PFx8TIztXX19vd9+//7293X11nZ2tnW1VV +T0hFRUlDPz8/P0E+PkA/P0ZKV2dv4+vR0c7PzcjBwcC+vr29v77AvsbNztvjd11dT09HTEhM +SEZJTU1LTlFVVWfd19HPzcTCv76+wcTEy8zOzOvf42fjX2NTV1VVT09NTUpMRkxGSE1JT1FV +UVFPVVdOTkpMTUxLTlFbXW9rd3fn59vT0c/RycXBwcHBv77BxcHBx8jOyNHV29vd/29ZVUpK +R0VDREhHS05TXW/n09HOysbIxcjJy8/Tz9XT/2f/V2NXTldXS1dPT05NT01IR0dGRkdLQ0ZD +Q0dJS09bXWN379fPzcbIxcbCv8PCw7+/wcDEwsHIyszP0fdvZ3dfS01KSkVKSERCRkZGSk5T +TlNNT1ldb/fbzszIzMjIxMjFw8fIy83Z2eNjUU9TTU5MSUpHSElCSkpHV2d3d+/n6+fj5+/j +/+//d//j39fb0cvNz8rJx8LCxMfGxcnGys/Ozd3f4+NjWV1RR0dGRj9EPjw+Pzw5PDs8P0RG +TFddU193///n39nRz87OxsfGysfM19nduTQ9rL0lPqw6P63OQcJrRcTnOee6PWe16z+6ukhr +uchK3cpn99VZV9vZV3fD91nKyu/Iz3fX1Wfn13dv0+dX1cxF38dnQWtVPkZXPj9dRzxFRzxM +STk8Q0o9P1tHTs/r78TBwLvCwLi+xsbC32e/yk3CxUe9vUfd1d/b38rTb9m/RVtbxU41Qm9N +NUs4a2M72URGvtdRyNXPvlvfxNf3zuvLzcvN/87I29lb3evbVUpX701GS0dTU0RAQ05PRUxb +a+/X0dXOxr3X473BTcNO28TvRs7GTsHbyL+7utnCv9nVWWdBP04wNTQ+LTo7PNs230fjW1Xv +QWdNz01ZzE7E68G+wrzFvb2/zdPA58nJ113n1UVTRjs7Pjo3PDtFSkpX3cO+xLm5uLS5xbq7 +//9Za+PZzNW+sr68tse7w7/Fd29PU0M6QUZVMURNPDE2TjswRDs9QVM+Ud1TXc7Za8HF09vH +z87O92/j/9NDX09d/0FnPVk/PEY7TjrvXc69z7rByLa51f/PW1/fTU5d67rNRbDFtsC82bjA +N7gyrkU0rS65vz+8ONFCSzs9XzjbPk7vV9VPz8n/uMvCvcLJ48/Rd9NKb1HbT0r/V3dXS1dL +WzpFRUhHXz5n929jX8VvZ7hLY///OtNON79Eb75NvTe1rS+sPUu3Sbw7sV1v2edNW8I1Vc07 +Y01JUzLMMkfRP+9PyVPIS2/VTcBjSb4971u/5zm2SLs8tTeu2d3F3bjV48V3zcLAyNXJa7RO +u1O808nPXbZGu0O7QUe4RDW4L8tHZ18yzUk3Y/85ty+5Ns2/NMvPLbY0zzpMTDvbvjfr5zvj +Z09VWedTTcU8yjWtMrvFP7hLd7/du75dtUTFPNm9S1XDO7itLa0rTbUvrDG7ObzEO79BPLYu +rjbJazu2PlW7Lq850bsurjS00UC8Tj+5OLZIV8I1w0XnTz3AN8LPMK4vRb5Lu9dRyUPPZ9td +RfdJzkhJ43c/uji0OFm0LrAvtzS878tdU8RvUbsvrje3vj+0OK5IxcJCskS3/z2yU83B3U/f +vf9byj23P8rLQspOd0pjP2s5zU5GzT/NP91K30xGzDjr1TTP529G21PnU2NHR+dCvNtHxj6u +McFfW8nVzMz3utlT18pXyMpPxT5vwjmxR0+9P+vDS7/XXbtO/7hfz64urDg2rFnjsTuvb0+u +U3fTRdV3NP9TP7pBVd0860tZ69s4vj0yvi22TU7XTkrLQkK9Ql/EOlu9ObxNR68vXbhM2blI +ulu+1+/Zxv/M2dVZvVPP485dOsF3ObpTV0PPUz7vW0n/Re9Ld+tb/8E/zsJj3993zF9r33dK +51l3/z3ZyTPd10RvTtFbTt9NV1tf59d3d9nKd9XVy83Zv8vTwMDnwc++w2vEzNPj0+vn72vX +a2/nY+fnT89Ma/db/1Nf/0VfX1dbSN9XT1FjVU1vSmtOX1lrW1tZWU1ZTFtOUVtPSlNPV01b +VVtXWXdb71Nr6/f373fdY3fR/9HX18fZzNPR1c7b09fjz9fbytPGz83Pzt/L39fZ59X/zt3V +y9fK08vR08rXz9HV2+Pd6+fva2ddXVtMWUlMSkhJQEtEP0pDSUpFU1VLY0v3Uf9OZ1lRb09b +/1vr/9fv1+fd3+/d5+vZ79vj29nV29nd7+fd99l35+dv5/fr92v/Y+9f/2tn41vn929r713/ +d293W+93d+v34/fZd9v/69nv59X/0fff3dnj39nr3edr33fj9+dvY2tra2//9+fb5+vf3+Pj +293b09nd59/jb/9rb2dX91NfV01PSUhPSk5JUUlOUURXRVNRV11VY29rd+/r6+Pv6//392f/ +393Z2dHZzt/N19HX0dfZ2c/b18/Pzs/O19PZ49tr72db51n3W+9jd2dbXVdfVV9Xa1N3WW9v +d2v/7+tvb/dj62v/b/f/39/d2dHRys/O09PO68/Xa9XM21Fv0dfvZ9/3VVln3VlG511VU01f +U1FRY1NNUV1vQ0xOTUtR/09ZWV9ra/fv52dv783b9/fb19Xn1dnv0dPNb93Dy2tRzu9n4/9v +Sl3d31nv229ra19bTe9vZ9VTSVnf1WPZ79/fzdnI2cnJzdu4tlNN2b7CWevn31u7ykFJyLd3 +SV9Bvb9IOUZXzdfPQzLNs0JHbztbvko4PU3V7+c4OufBVz5L51t3zDlOZ19PzOc0Y8vO6+tf +xMfCb87BwL1rx8Ovul/Zv7iwvUpTvsvE01M3PN/Pazs6O0XGVTMuOG9dOC45R01NRTw6WdFd +WVnr2dHMw9vf38avw//fua2w2Wu7sL13zsnHx79XWdvKz87rd1nZysn/Y+/bz/9ZVUlI79/3 +R0tO59XvU0pXb1NBODtCPzw6PUVOUXdNVWPVW1dMPkVGRjpBQUld11Xfu7y+wte+tLLI69fH +zGNFQ1nX09v/zsvT09dZ2XdbY0c7TM/n59vTua+z2cO9tq+2vrm0v8bC1/9JRkpZSz5H07/D +62tXUzkrJCMjIyMkKTM/W8+/vLmsrMw0MUfIzEo097Kutse7tq+z0Wdb62PnUzhIXdfJWU/V +vbvDTnfVXetbRUn3vrm+xL+/w+9HT+fbY1lLQjo0MTAvKzI3O0v/ybCssba6v81ZOjAyMjI2 +WVtbsKutvLyyrKy+Ttu/vVVfa8u5sLTGxr7CyFUzLzg5MjAwPVNJTj083+9N6zkvQD1KZ05O +w7u1rLq/sbr3zcdJQUhJd8TIzL3AxNtnRjAwLzg7QvfZvry3tsTG609VOikmKjNLy7Wxr7G5 +y2M8Oj9G2c7JuK+0vr3Zz7XTNjw9Sus8WcFfr706PVPj4/85LCxEura5vMKxr8w6LDEsOjIt +Qe+1rKyvsLW4yz0qKSsuMzY6W7K3rL3Ar8HrSj490brPvbG0vMG60c3G09nO0U1rX1NvSi4v +vGMzRDY231MyMkRXPjdFPsy9XdlTza25yc0+Y7q6W0pL08vJy9m0trO5Y0xOOzIvMUV3xbiu +tLezr8FvV0EzOjYtQHdn79VvR/d3PTxNUUVRVS9My1PXzNHI519XTUdLTEhFVTs2TF9Dyb6+ +3a6svK2tvMbEubatrbiurbbBuNEpOU42Qkk3RcbAxcdfR0U+KiIiIiIkKCtE71dXP0xRY1E/ +P2ddu7G0r6ysrKyyt7Kssba1tL/Dwc9vuLGxv2++/8pONElBV8vVK0BNPDQyMiwx7009/zwy +Ny0nLSgoMS43PefTtLy7vs/Oyms+PtW8urSusq2svrq6t62trq2tra2tsrCtvL++v9W972Nb +OkE4PjY2LC8mKTAqOS1ELjs+MC8uLC00MkhKTF/Nyb3Xysn3V9e+X83nwNu4u1m9zr69vv/R +ur+yt7e9u7rOvtHP979fs8W+xd3IQudPQlXvQEc7OT8v/yrRP78/VetEyEvHXbjDtd+zd7W8 +00TRa0//X8swxTlZPl87YzFfPj28V1FVZ2/fyUpJd7pOzcpbyLvRuFevV7p3tj2uvb9vz8JM +zF+9M8VE2z3/O28v1S09M+swRDxNNkJOW01Pd0/jWVG6S8+3L6wvuFe3b1esRqw3rUCvrj+s +M7rfxFdVu1GuNbU3uEW6OcYub0NZNT1KN9sw2Tw8SUw6Ty/OML9NPdFM39lFvTjH0cjMzLrB +wbbEuL3XrUyt67atv7nCvrzbt1e2UbpPwMzZU933SEhKvDfvN0JAQixGI04qPCdCJElMJFkj +Uyw+MjE2RT88XUhHxj+vU7m3v7usa6zMrLutrK2srK6suazLrLmuv66turO1tOO5ys/FU81M +aztKPzdAKUsiOSkrLykqLCorLihHI04oPzI+QDPPOl0+znfnw3fCzLr3rf+zuq69tK23rcet +rrmsw6y+razHrMuzw8y6b71L51V3Tl8+TTfrMGMyNMslXTAvPj42Qjc1QTFGPzrVOOM/V1tZ +02tOv8vTtlW2U69BsUZRt1G2d8lfu8jJV8Bv17xEvdHTxlm4S8nGSrpKtc1nuUK3XcFjRrhj +d87ZyffZzUnGT83jb1lRxmNv2VFnU2tRWU9JYzxrSENJPUo3STc/Qj5MOlE8RERGTU5bW2Nf +d+NV2V3Z/9Xv2dXNy83JxcfGwcq+xL+/xbvJvsnJycjN38rZyt/Ib8/r0+fb3+/jd2/nV+9n +a9332dfv0+f/11PbX1tdR908bz1HTEFRQltAUUhbS1FKSkxHT0RJQkZHPko9ST5ORkpMS1lL +61nb49/P0crbxc/AyMHHv73Dur+4vbe3ubK3sbK2sruzu7m7vbvDwMTIytvb43drT1lGSD47 +PDk1NTIxLy4tLC0rLSwtLS4vMzE1Nzk8PUJHTFFVV19v39PJyL+/urq2tLOysrGvsK+vr6+v +r7Gyr7Wytba2uri7u7+9xcfL0dfvd2dXU0tHQz89PTg3MzQyMDAuLi4tLi4sLi0vLzM0NDk8 +Q0ZOWV3vb+Pf1cnMw7+8uLixs7CysLGzs7W2uLi6ube3urW4ure9xMbX2eP3U1VMSkpHTkRO +RkJFP0E+Pz04NzY8QUNCPDg8NT47Pz8+QkBJTedRTuvDW+9MTP/Ru7S3vsPDvL66s7a3tra3 +tri8vMXIysfX51VTV0lPW11dVVNMSEU/QkZFSkNAP0hGdzFAQFFvTTUrR0m+u0s7191Z02c3 +SOutray5wE/fz7m+uMK90761s7m3srm9wctPQE5TU2drRkhITFc9MDMxLjE2LiwuLzM5ODg+ +OkI+PkQ8QlNvZ+PXy8S5tbO4tbOvra2tra+vsq6zsLa0tre5vL7FzOP/X1dOQE1NVUt3OkVL +RFU+Rjg4OD01OTUzOD9ER0I/OzxFQ01NRmNrX9Hn2d3Oyr+9w8TMwsa/vru/xM/Ryc3Tb2tX +d8zMzF9CPT1K9/9XSj4/P01nZ2dPa013b8zZ59/j0c7KxtHr09HGxL7CztvV09nXzNv/X1dR +R0pKWVVfW0s/QEM+QERNUU9OU2tnz8vM0d/P48rCxMnPy9vDz76/ycXPz+PPZ99bVWNO03fr +b+vjX+PJ42Nv63dTd8pHPkZZT0vV70I+RD44P29BPkU8Oz1KTkZDVz89Y0FrX29b/9nXvMm1 +x8nFxbS8ure4vLXHurW7t8OuZ8W+79fLuP//290yRUI7S1VjSTdCQj5ZSkBROVs/V91R39NT +72t3yte7xu/TTE5v/2PT0dHv68hX49vbd1nKTFFfdz1MzndPX8hCTUfjd0jIwzhdy8vLwr9n +OjI5Ljzd58K62ctryr/AvbxfTEIvNjZFY3fLyGfH4//O3cLDzLvDxba9urvBzmvX51dj61Fr +XV9fRudLRllEPj48ODUySER30e//a01jXc3Fx7TBur/J18fjxcW/v8LGzu/PZ2NfPjYxLy41 +OknfzMPJwsvR31NKODI1MTtOY8m7tbq5ubm6v73Oz+9f2dPHvLvCwutjRz9HOjxLPD9BPUpZ +/+Pr998/TEk//0/fY1dXU2/O/8y+077Gv8a+ybrGxs5Z21VVw8jJusvK1Vf/X0lrU1tHVV1T +/8XIwL3Pyk9MPzY6PTU8Pzg6PEY9SO9TU28+PTo2RkBNye/n505XX+Pnzb/Hy7/Py7y+t7K6 +tbq+u7i5trC4urO70bvNx768wsnBy9PFymfOW1dGOTQpLSoqMC8tOS0pLyUqLS04LjM0LTw5 +RcPIuLS+tsPVwNPbucy8z7q+wa6ut6yvvLW9triyrbG4tMnHyNHDyczEd9vnU05IRUo+Tkk3 +SjtDSUNJPz5DNjJCMTxKOEU+PEk9WWdTXVVIRD0+UUPXzM2/yN3dZ9/R28S9zsLE1+vNwMe7 +s7m3uLm+vsnKz1lrR0T/a9PHu8vXa0Q2MjQuNjg6PkBIX1Vny9P/zttLS+NOT9/ZW2tv53dT +udHvusVn03fPy76tsbCsv8lnQD02Q933wLLBvsrTd0RIRC41NCsvMTc9OllGPEc5MUc7SdHJ +uLi0r7i1ubO6vL7KZ1dPNlNbT7/P0cXf491rWff/3ePLydG9487Ka9vV/3fX/2vvTk1OT0Hr +TlPXTUxvQjlZP0RGUTlFTjZGRFFr787BzO/HU0Rr79/HucC1sLS2tLO8v8PO29nR19vH2d9d +TUY+PkpDRvdHRO9FS048RTc4MzU4O0NFWWdfVev3SXdna+d3zd3NvMfGub7FuLzAw8O9w729 +xM3b2V9r38jFs6+3srnDzt1PRE1BS01LXVNMT0hJR0JKTT5fSExIPkg+QUdLV0//W0xLQDo1 +NS4vMTA0PkX/X1/vVV/3783Xx72+ubK5sLWys7SwtbKztbi/vr+9wc7TxlvLwN3H1dFvV189 +RmtNR01FPlNFSdNK0989Pjk4MEtIW8PFv8fXVUQ2Ly8sLjlFTtXJ1+9KPjo2PExC0bzLtbjF +vL6+vbu4wMHM3dl3373IwbvRXWffTtvOx7/KvVvn519vXf9RSEZMRk5r6+vZ3V9LSz46TjhK +90fKX1P3T1lZ40v331vPycjIyePr10tj3U7ZwdfdyF9fzt/b2+tbTU48TzxNd0/r9/dV60RH +RD9NQt/jy8fByrzXv85vylnNzM3BzL7F68lnUdtMz9lbxd/Gvby7wsrvPFFKOHdja8/X29vv +Z1NEODMvLDA3O2vLy7vB2VM8Ny80NEFdV8vVd+f3Rmt3Quv3Z//J1b2zurCvtbSxuL2wubyv +uri2wMfZz01fV0BTPEI9R0pIVU1DPDoyND42Rk5DZ0FVSkRRS/dVZ1tL/0xr29O+vrm7w8nv +WVHj69vJwtnM52NNS0xIUVdO21vO09XKwsfRwdvj2dNvyef/zNXK/9nZd09jSEVXSetOa3dK +PUBGPlP3d8vMXedJR9V3xcDJvmPVyGfJw8XJusDNxcHJ0dPrT0tZUU9VW2dORF02NUEvMzk7 +PT5KPj49OkdBTc1n38Hr38rj983J2dW+zLy6uLC7sLe9vMHK0cd30/ff4+vVV9Vba2NHa0FJ +Tmf/zc/IyddrWW9jb9Vdb+NRSE8+PD5KOD8+O01ASV9fV91rY8bX0b/Z58LJ47/b17xnzcpT +3/dZZ+Nd2+9X411j/9fZy8L349NLTldKXV1TTVtZPWdKQsj/3evbW9vb38/O38nNd8zrzs/R +0+/PX1HdVW9fU1VXRExrTV3/T1lbTEhKTD9RPkldT1FV/0vd6+/PyMDEw9PLz9PEvry2t7e/ +xs/ZZ2Pn5+Pfz93b3+t3V+t33dfX2WPjTmNFRz9CSzo8Qzk+PTpKSDxIRG9f0cfJusjLw19n +791vxcfJxdfT129jUWdVa+NR0U9V3UxV39NZ/1tPZ1/r3+PR4+fr/87J4727xMXI0dvOV+/X +SmdrVUhjSj1jTU9Vd0Z3d13X28vGztfO1Wfd213R02fMd99fd/9XY0JbSEFPRlFMZ19NUUFI +P0pCRVNJd89db+fPzt/CysHMwr/Gx9PIU/9FXVtP0UfrV11nWVnbz9vIwse9xMPGycrJxc7J +02vn993vyWfT42/nW1lZ30/nTkx3VVFbT0RPX0J3UU3jb3fR/+vP41/vW29ZV1VKVVs/UT9E +Pj5AQj9FY0Y+SENNRXdf0+PAvt3E28/r28LOucW4uLm4vr7Gyetv31f3Y1NnTutfd11bW1N3 +39nZz8bNv8bIvr2+ubzJxsF3zW9b60lrZ0Y9RDwxPTMvPDg5OUU9O0hIY0ZM1+Nn181va+dn +6/ffx8zdwMzjvsjEvsfGvd3TydfJwsx3x2dVy0bn52/Pze/nxO/HyNfIzNPbxmNXX0lXSUZO +O0Y+OjM5OjA+Njo2P0s9TUpTa2/r3dPPyc/fyNnKwMfAv7zFvr7CwMTAwsXDw8PrzMLbytPV +Y9n/WWNrze9T/11VY1t36/9TZ3dPWUZFXT9EP09CP1FITklXTlvnX/fdz8njw+fr191fb/9T +719n719Ga0lMVU9db29da1Hn/2Pjz1dj1/fnzd/Gz8/ExMe9vrm9t7rIu7++wMfGzdnZ593n +W1dJPEM+Pj05PDwvMi41NzY6M0FKOj9PSVdP51v/b9nC08jFvr6/ur2+wc67vdO+xMa5wL3I +xMbEycfK0cjI283L18TE1cvGY9XXZ8tba11TRkhMQ0VAPjo5NjNDNDQ5Mi4xLi1DNTE+OTU9 +PD1dQ13VW9vRxufEvse6vLaytrWvtbuyu766ssK4v727vrrDwc7PzcTH09PL20tvW1lZb1NZ +UUhTQUdKRUdMTj9VS0pKSENCUUlnUf9LRktTSk9rY9tbVU9IW1lvb9/Za9fn2+PR39Hf1dnn +z9/T0crVzc3Ozdfd7+tdY+9v919XUV9OX2dbY+NXTndNY1dXU09PU1tvW2v3TmddV2v/1Wvb +7+/O09++y8m9xsu+0cjE2cPT79Xb/19Xa1fOb2ffX+PT1efvV9NRT/dI3WffU0nVQ2tP91lv +d07vUWNOQddL699Db1tHz0rN2UvLZ9XRS87L3bpjycdfvW/v00vMUdFj4/f/V2fdP2NnQONH +U9U9bzw/Tzo9U0I6RTxEQ0ZTTUrKS8vT3cHb0cnJxsS908C9ybS4wLTEurTGsbfGsr6/u8DN +tcHNusvNw0zDbz3dQ0FnQTJOLzU+LTk0KT8sKz0mPTYzQy87PTlMVU7KZ9PPyd/AxdW5yr+5 +xLm8urfHssTNutO9vne14/e478O7/77dSbdJ0chN41tE70RXSD5nPVVbPllJSFtO7+M80TU7 +3zDn4zbnO0xfQNFPTctJV8VEyF1nzFPGvlvB09e9yrSy16zfvbLXtbnPu99bvlPHzk3LRznE +M9H/NtEw/1843TxDX0BXTkBRPUBdP1VXQe9FRP9GV+tCY0dRWT9jY03PY2/D68XI47rHwba/ +urfBtrrFr+O3w8+/0du5Z8fTWb9f3c8+6007Zz4+XzdIPjNHNjlGPEE+QUdAS09OVWtX12Pb +yufHyf++yr6839HK68fA38/302vIxsDv3VdRz9nja193T2PP/2tNTVVn4+NTTEtLVU9LTkVn +XUzjSV9ZWevf5+f/779d09fv1+fNyeO+42POW9PGy85n3c/rz/9P219Ty1vXZ9VnX19dY11j +U+Pd3efnV1/fV9vfzXdfZ11f20ZO2U3db05ZTV1X/29Na0xRV1lb/3d3Z/fX29PX2/fZ99XL +19HEzsLVz9PX383J1czb3dtXd01j90ZMQkBPREA/P0ZRRUxFTFVBW0tb71Nvb07f29vRX9nb +zcD32c93zevR08zG0ci/zcnT58/Lx8DFxdvV2dXV09fX49fn51ljXVHdZ9vbU/dVZ3djWVNM +UUZMQzpCPj1HQEpJREhCT01ESE9N711VX0dVXXfd293P79vbysbAv7u+vr28v8LIzcHBv8jM +2d/j13ff2///Y+NjZ2dbXW9LT19OV1tNT1VVVU5NSkJORktTSkZMTEhKRUdJR0lRTlNbW2v/ +49/VyMfFw8PAv72+vb+8vr7CxcHFwMHJxs3RzePj//f3a2tRUU5DR0ZCSkNCPT09O0BCRVVI +TVNRd1//193V0czJysvP08/Z1cnn2+Pv1etnX2tvY29ZW2vn//d3a2djW01NTElOWUtMRkxK +TE5LS1Vv6+PXz8jEzMnEyb2/wMHEx77EycPGy8rJ29fb/9f//3ddb2v/X1lZW1VZUVdXd1tb +TFVVTU1bSk1NU1VPX05fd1dOSk5NVV1ba2d34+/r6+PVz8jHx8vHzcnT19vj3evf5/9dV1FT +UVtTTldVTU9LS09PW1dfX1dfZ2/n5+vr3ePb3efX29PT08/b39nn39PbzM3NzMzRyM/XzM7P +29fd09fZ3+Pva1tVTk1MT0pGSUE7Pz1KS09RVV9nV2N379/f49nZ3dPOy87M0dPV19nP2//r +Y11fb//v6+dva/f35+9v4+ff4+fvb2tnXVlTZ1tdb2N3a1tjY19rW1tdZ2tdb+/v32tra2v/ +/2dfXW9b92tjVVdVT1lXY2//3efn59PNy8vLzcnJxcjIxcjOzc7N2+v37+dZVWNfZ2NdWV1b +U0xOVVVZUe//d+vZzdPOz8zM08vNzs/b0dvf62drd+9rV1NbV01JS0xVTUZLTEpMSUdKQD49 +Q0lDR0VIU05OUVtb/+vf19vT19fR0c3Nz8jIysfJx8rV39XXz8/KyMjCx8nJ1c/Nys7Xy8rJ +y87Ry9fR0dvdd2tnY11dV11bVUpEQUdEPzw+QkA9QENGSU1VTldrd9nVys3NyMXDxMXFyM3N +z9vP2d/j9+/vb/9fZ2djV1VZU09XWVFTTk1NTUxOTU5NS0pKTE9ZX//d3ePdztfT29fR0c3X +0+d3693r79/d2+d3/+f379/r9+vv5/f34+N3W2NfV1t369/r6+vj2dnf29nT09nj29PR0dvd +29PR2dvXzM3O2dPX2d3V2+vvd1tXWVlNR0lJTEZBQ0lOTk9OV1tVVVVjZ2t3d9XZ09XZ0d/n +9+v/b1lRS0xLR0pLS0tKSE1VU1NOV2NjY2/r69/Z0cnNz9fRztfd6+v3b//v59nX19PRzdHV +09vX2dHO087O0c/LzMfJx8rKzc/b3dnT19fVz87b29vj629fW1VTW1FfU09RTExLSERAQT5D +QD9DRUBDP0pMTU9NXWtjY1tnX2drb/9vd+Pfz83Kzs3IxsPBwsTGycPJyMvV1d/f62dvXVdZ +VVNOT09PU1tdX2fv7+vf929nY/9nZ2dna19na2936+vd49/r7///7+/f39PT0dXX1c/P2dfj +5///73f3b/d36+fZ0dXP0c/V2dHZ39tra11RUUtLS0lJTUlETEpOT0xPT1VnX2/r6+9r/+vn +Z2dnX2NXW3d3//9v//9nY19jZ05XXV1fU1trWVdXU1dbV1FVVWdTd9/b2+/X0cvOycnKyMvR +zcvFxMG/vL++vL29vry6vr7Ex8vP0dvf5+trX1ldWVNPT0pBRURHSkxLRklLS01MTUxNTU5X +V1dfVVlRV1NRV0xKR0tESEdOUU9TU1tXX11nd3dr7+vb2+fd6+PvZ3ff593V2efvd29nZ3dv +993Z29fX1dfTy8nDxsXHxsTHycXFxMbHyMfGys7P2dvn72/v/+P35/9vWVVVU1dVV1tZX19b +WVNRUUpMS0pOTU5MTElHRkdIS09RT1dZWVlXWV9fX1tfb3fj3dXX0dPV09HLzM3Nzs7Nz8vN +09fb19Pf3efv/2NjX1tZVVdTVVVXVVdPT01OU1ddY2dra2v/9/9r93d36+/f9//na+vj2dHI +y8fJxsTExMbGx8rLz9HV29XX29XV29vjb2dvY2tnXWNfX11fV1FNTExLTUxISkpHSUhJSUVJ +SUpITEpHTU9XY2Njb2vv5//v6/f/7+Pb0dPXztnV1d/j5+vn//9v6+PZ2dPKycfGxcXJxMfJ +yMzKzs7T0dfb39vf69vvd+93Z1NbT09RUVFNSkpLS0tRUU5PTEpMSUpPXWNn9//v///3393d +39vd69/d3efn929v5/f34//db2NnZ+93d93V3dvd4+vj99/32ePZz9HOz9nZ429v///n7+// +//9dWVFVU09VT1VPTFdTU05RW19XT09RXVlrd3f/b//f693n6+fd7+f/9+vvb+Pf3dnf0dXT +1c3T0c3OxtHLzNPb5+vv79/33+fV4+/373dvb2fn7+/rZ+fj/29v52/3Y3dfV1lNX1FRTFNP +T0xJS01LTkpRTElHSEtIR0RISUxMV1lv9+/n18/TzcjFys3RysjMysjCyszLz83Mzs3KyMjK +zMzNy8zJy83TztnZ1+Pn793f/2tnZ1dTT1VPSUpJTU9PVU5LS0hFSENERUNHSklLTExDP0RF +S008SEZMS0dGSUtPTUpMSUhCSVFVT1V3b//3/2/v1dHHyr++v73EzcnKwMXLzMrNz8fJxMbH +xMDDvcfFy9nrX2dnb11TXVtOT2Nf7/dva1/n42NfZ1lZZ09NTkFKS05dXWdfVf9PWVtbUU1G +TkhDTUxITldf/2Nb7/fj49XnzM7MzdPRzdPXy/fO69nXy8/Vy87P1c/L28/Xztf/0e/f1dPN +999rb1tbXV1XX0tTTk5MP1E7Pzo+Qz9LSEhPU09vb1vb39PMzsPEv8O/v768u7vAvsO9x8zV +3WNvWetnWVtVTUxbVVdXVWdX42/XZ1lPSU1LR0ZLR01DSkZEPkdKTldr49/J59fTzdXZz8jX +53fZV19j71Ndd1lvb/d3Y2fd9+PXz8nHyb3BvL+/v7/Av768wb/DyM/b32NFTkE8Pjo6ODM0 +NzY1NTU4PTo6QUpHRl9db3fj59nKzMLGwMDDvsbBxM3Kxb/Izc2/wMrJvr/AybzMwci9wr3A +3cPTyNnv/19fTldNVVtMSU9JRUg9R1c/SDtFPzo8OTo3Nzo3PTo9Pj88Q0pMU1drd+fd39PZ +59fNx8O+v769t7rBu77AvMPGw7/BxMPMzNXf7+/va/dnWU9NV2djX2dbXU5VQ01PU11XUVVR +TD9VVUxbVXfr1czRysTO09XK0czFyc/Z2f93z3fT63dra1tfV+9n9+/j4+vvZ/f/3//r4+dn +Z1dbUVFPVUhDRkNBODtAP0hHRFNVX1tvb2vv283Fxr++vru9vb24v73Av8rM29Xf7/9nU0tK +RkxGS1NKV0pGTUlMSUdCP0dKR11r49Pd0dV31d/ZzMnPxMS7v7zAub+7wsTPxM/n91tbW1Fb +Z19d/3dvZ1NNS0tNU1NZT1NKSkxRTU9NSlNPTldTT1FdV1VOUVVbX2NbXf/359vbz9PrXedb +53d319XO08XJ0dtba2dr/+fPzM3NzMjJzcvTzdvM2dfbzt3N38vF0dHfz8vPz9HVd9dr6+tn +a11bR0hHTlFdWVlNR01LU1dRX1tfR0tKQUI/PTo7Ojg7PD4+SUJBSUBLSFVZ3+vXzsvIyMq8 +vr69vr67tra2srCxr6+xrrKztbm7wMbO12tdX1tVVUhOR0xBSUE/Pj5APEM9QDs/ODY5OTk1 +Ojk+PEA/RT8+QE9jV+Nnx8PEwMO+wMPKxMvL18/Zz9fbz+PZ5+9n6+fv987Ry8XTzMjJwsDL +1dXDwcfJzszHwOdXa2f/d05JSlvnX0pDPk1TUVdNU0VbVUk9PkRXU19Oa//jVVldS1VMX1XL +vrvvUz5dv7rHwrrVzefZ19HK6+fn1cbbPTAuzr2ttNtIQDw0ODhNb8G9vFdnX/9dTl3dwut3 +z8RFTGNvPd/328O9/0bdXUc/WU7/T2dZTzw1NVnZSz41LzRF3dlrW9/Ty7+9vtusrKw9LzT/ +rKysrK+vtO9GOz7Er6640+vba0c+OEHjwWsvQzovLzEqKUDnQuPMXzxNzGfru7/BucDVa8HP +x8bP1VlnWbu4zz85L1ljxVFK213OuCQpr6yyNSMoKKyrrMqwrOffNigpPbeszLzDsLTTST0+ +u7mu32P321U6MiswQfdnb1fIztdTPUNfuruyt7S9uNPZ18HJ1dXvVUlfRTY7N0I6Q0BbXdH3 +Wzk2Oj08Sc3fx2eyrSNPra2vUyo2Ma2ttNOtrchTKykqScvNN9u4rc0+ODnXur3VX9u3vkwx +LDlKY2NHd7uwtt9nY8C4tbu5sq64yklZ59PRV1Nn30s9MDY6QDw6RF3FTkFCTT5LV1tfuLBG +K66srDolLTe/rLrBra2wUSoqNUHfX0TZra3AOzhT429MTNG4s8o7LzhDPTc7Ss2yrbbXz8rG +1cjGta2tts5j2e9nSElr529EOjQyMjQuMTxLRD9jQzkySG/nUdHnwLvnsOs8raysQSvNv66t +rqysrLM0LUxVOTNXya2srMHjw7lRNzlT193vTz9DPS8mJis0PkxjyL282V1LV2PTwLW0t8nj +a1U+NTg+TU9MSkNGQTw5SOvf39fOwsjvb93ZzdPBure9uLW1uVXbvrPOW9+trKxAd8a9Slf/ +s665TDQ4RSgjIy1FS13jwLm84zs5R1E5Nz/ZzNn3W93nXUFD2cfKxbu5tL3My7+5wM3Py9f3 +WUs/Pzw6ODk1NDY+Pzo/T29j38zNzL/IzNPOytPRx7m8w7aztcnMwsrTvclnzK65SzdTUTo0 +Ok7JyVE1PUs2JictNDQ4Qte9u7u7s7bB09nKzONn3cO/ys7Ju7u9vLzFw9Hj393b3d/3X1FM +SDw2MTAwLy4wNjc5QUdJT2/j0cfBw8G9vsLLy8G7vby2t7q6usrLxcvTxsv/29PnU0Zv51k+ +RkpEPjwzNDg5MzdBREFFUVNRb+fr39HLyL+8urq6u7q/wsPIzs7O3f9vd19fWVNOTltbV13/ +b2NZW1lTU01LTVdfW1tf///36+/n087N29PV1c/T3dHPysrO1+Pr72dTU1VbT05FQUJCP0FB +RkxVVVVZY19dWVNMUVFLT1NXb+fd29HIyMXBwb+9vL69vb3CwL28v8LFwL7DztnR3/9ZT09O +Sj89Pj4/PD1AREdJR0VJTUtPXevf2efd49tnV1dfa19dWWNdT0xLU19nb+fb0c/P19PN0c7M +y8rDysfJzM7Pzc3R09PR1d/n6+v3a2NfY1lVT09PU05NTk5VWV1fY2/v72/37+vj9+//5+f3 +92NvXWNXVVVdZ11jVVVXUU9LTktPT01NTE1GSktMU2fd0crGxL+8uru8vLq6vLq/vb7Ayc/O +09vj7/9v7/9nXV9Xa05NTEdTV09OSlFRSE1IUUxZUU5NWV9TU1FXT1dVVU5bVU9OT1FRT09X +W1lna/fn39XL08nKzc/Oz83NyMrHwMHCwMPEycrJy9XT0dPd3+/na19TSEhPSkhPW1VTWVtV +TVFZXWNjd2/d3d3r2dXb6+fj/+/rd19bZ2NdW2NrZ/9jY1FZU0tPTE1TS1lVV1tTVWNjd2Pr +9+fr99/j59/fzs3NzdPVztPj29XO19vMw8vKz8/LztXX387L1dfd2ePb3/d3a+dra2drWVVT +T0pNSkVGSklFREtLTUZBSEdEQ0ZDSk9TTFNnY/9n49nj2dHTztHM1dXTzNPVzdXX1c3X1dHM +ysrGx8XHwL3Fxb6+xcbJzMfJ0d3Z2f9Za2tZWXdjTmtTOmNMODlTRDk+Pj46PUI+PkJFRz1T +90VCVdldP1/LRES77zpZvU1O28XIX9W418a528y8ysrZvbzfQsex1zi8v29HwVnTzNfTxme5 +y0XBtlPvxf+972fMSP/FTUNNX1c3OUdbOFVGQFtOTks4b/83Rk9LU1fr2VfZwNX30dnL91/r +VVfvS1Pj39HT0ca5vb7Dvb3Ezd/TzN/j2d/Z2e/v187d/2djUUpBQUFNVUpLWXdrX19XZ+v3 +d1NV919JWe/vUU/31VFb99VO78vRTd/r/03v3V0+2fdDSV/nZ9X/2z1Z3ddDOlu1zndR9+/M +vcH/07C1xOfXzt1vX0BC2b2+y763tLy+zV1LUUU5MztDTl9nX+fMw8fb72v3Y1dMTW/371tv +Z29rVT89RkRFRUlDQ01MQ0RTSz5NZ1lNd93jycTAwr/DyL21xMG/xdu6xO9nys7RxL5nT09n +b1l33T1300lMSU5vT0hfa0ZT687V/3dOS2fZz9/Jwb7IxN1ZV1lTR0FXY11ra1NNTldnSlFV +UU9Zb/drZ9tXTld3d+ffydnKwL7JxcjM6//f32/d093X18rO293r59fX329ZTldTRltZT0NJ +V+fVzNlLR9HByNtbPTtO00lIUVdf78zNV0hdVztK12NBPzk4O9vCz+/Hxs7MyN0/RGdTSN/L +x720r7G6uMDNd91nTk7n2dvIvcnOy87nX2tbSk9fZ//f1d////dTUU1ITk9XVU9VXVd3b1lV +WV9OS2P372N3W0lOX1lvb2ddY+fv/+dnTFFRU1fvU05rzMLAy1tLV1n/02dn/0RL08zZWet3 +Su+5usXj905fv7rMa9vHyL67ushf/9tv68j3RU7XT07XXT06RPdCTvdKP2fr/2tV72dVxsLn +59nL0c2+v+PZztvj49vvTFnda2fva19bW1lfZ1tr6//jW29fa2NLS13r911b99lnUV9MVdfn +V0ZId3fT38dbLEu1tetTOCkvPbutuLPFUz1O0f8uKjEtQ8asrLK6uMvEvbpRNzQ6P3e8tsLf +187O08bLXURMY83AtbW7xMbI2etjX0M9QU5dd+//Q0JHSEVLS01JT//3Z2PvXVVfb2v338// +Y2v3V1tdW09MX2NTW+vb6+PMzetZZ1tEXdnZ793Z1edf39dd08bX6/9ZUefNwb53SFFOTtPM +y9VrW/fvxsLdU0xbXd3HyN9PW13v5+t3W0pXWWtZa2/v59/n62/31dv36+tbWWvv2/dj0ddj +X83jd03f1d131XdKTnfR6+PV/1NEV/ffy8XZY/9bW1tj6/9TV3dbT1XIzGNHPj08P2PKy9fb +/1NJTD88PD5Gd9fFvsLFwMXGycvnb1dbW//v7/9n7+vb29PV28rb1+Pf2dHOzcrP1dvX09/f +73drW1dTWVdfU1NOUWPn3dvP31Vfxcv//9XrP013/1n/2/9M//dvSe/Hb01EZ2tX58PCyN9r +SEtEPjo6PDs6P9/Czd/j19nV53d3WVlbU1Ff19nb3ePRy8jCzc3Oxsa/vry9vb2+zNvX619P +SkY9PT5APkZHX1lr79nOzs7X3eN3629va3dZ3W/Z79/j9//n3c/dz9XT28/b0dfVd11OXU1M +SU5CQEZVS0dPX0tTZ91379njWWdr72vv5+9ZU2P/a+/n5+vX0crMzs3X72v/W09RTkxGS1tr +X3fb5+/V09fV2c/Z29nTz9fX529nW19TUVlfV0/r29PVxcfOyNHN08zDTMzN72/LZ2NFy2ND +wkhbTUdMOWdZTlH3XWvN5+vT2dfr411fWVtba/f/d9vvX9/j4+fd1+f34+//6//n71tZX01T +TVFRTFtbV1tRW1lf6/fr1dnV0czV29vX/3f3Z+f/529r92v///d3/+fv5+/r7+fd5+/v32P3 +a+f/7+P35+Pf3+Pd52/v393Zzs7Xz9fNytHP0dVr5/dTU0Tf0z9OXz88PmtVTmPXU0t3129f +a2NHR0hdT0NTzFFd2dPGPm/GX+vbyt9L69NbT+vrW/fNytHTzcfKzr/Dzc3T29n379drV1dd +UUxRU0tESk1PVXfr7+fZ19XP08nN1c/Z4//v52t329/j99vv//ff7+vf1+fn7293X2f/W09n +WWNfXWddWWNfVVtTU11TW1dXX1ln/2vn4+vZ1dnO1czPys/M19Pv7/9fV11fZ2dr/2//Y3dn +Y29jV11dY1dnW2NfZ19bV1dVT09MVVFNW1tjZ293a+/n7+/b2d3f39HX19fX19vf0+/n3dXV +2c3PzsfNyMnHxcTIyMfIyc/R09XZ3dvn5+/r92dnWVtdV1VXUUtKS0VFRURES0pJTEtLS01J +T0tOTlVRV1NXT09OWVVXXWN3b/fr2dfZ2dnT59Xf2+fX9+Pf49/T5+Pd39vV19vT3dXV18/O +0c7R1dXO183/3dHZ3+vf73fr3+v/73f3Y3drY2NnX2ddWWNbd1tra2djXVlbWVtZW11jb/f/ +72//d+vr/+9vd2v3X/9n52fv6+vv53dvd29v7/ffY/9v/2dv71/37/fv73fr/13d/3f34//v +//drX1t3WVlvX1dbXV1bXWtnZ2dja/9fb3dn9+t3a3f/b+vv59vd39vb3+vja2Pd/2d3//9r +2+P/387r1dnP0dPZ2dXf793X59nP987Ta83Oz9fr6+9n62NfXV9VV1tOTlNVTE5OSllRWU1n +Z2tr3+9399/v5/fn59Pb3+Pv2+Prd+fv3/9j91lfW1NXX1FfV1lfWVtZU/9dW+db2e/329fZ +3dPT19Pf0dvR19/T3///d9v///9Z93dra2tdU19RV01ZT1VXV2dra1tnd/9369/n2efn1dnV +19nj793jd9Vnb+fj6//fa2//7+d33Xd34/d3Z+9r3d/V0dXr39Xf3dtv69/jX2vn5133d2f/ +b/drd2dnX2NPW1lZV1NnU09RU0xPVU1VXU1XXU5VXU9rWVnv5+Nd3d/n/9Xf593v79l33ePb +3dPTz9PT1dHZ1c/P78/b4/fn711nW11r/1tv62//Wevva93rd+/P29/b39vb39XZ19XT59vn +a3dvW05bV1lRS0pKRklFTk1NTFn/d/drXdNrXefV79nR28rL18hnx9XvxUc/vfdBv8A8wtc9 +U8xdRtXRwi+7PWu7OMa1QUq5zji2OErXYzmwPzy2ON9b50xT389VSsRL42/fSknr71lGVb5K +33fr69nn1VvZydfn28fPytnT293Ozevn2+Pd/1FTUf9vTVNv/+/dV+PZ0ddVVWfKZ2tv78pb +QFVrd1VCP87May9bvsLTd0hRzs3/RE3IwNtfb//T109N29lVRNPG5zs4Pm/ZwcjIv7a9WT4+ +Pzc8Oz1MvrO0vrmvtMlVRD45Ojs+W7/Da01TSzo1O0z/0c7Iure2v9fVuMvOxc9d50vLU9HR +a0DNSVdOvtlL57XBLi+urccpJkE+wsnO262tyTYsNSwkJSguR6+tt7utrcTnTD03SNnvTr+2 +vetbV05Z289v78W7wsXCv7m3vstfR0xGPkBfd/drb1NBR009SE7vY1PVwXc/Nz333z5frqzL +Rcm760pXut/Iuss9tKywMy9Hb++709m+t8kvJy06Kio9Q125rLxN2bbMR0tdX9O+utXRu7nv +U9vVb8jCwd/Mvr/Z59HfX0pBOC4zNzo6Pj9FSD8+Nzk6Pzpd38nbz7y821XLra62zF27rq2+ +W9m2wL6/viv3razDLSlbTsvTzWe0rro0LC01LjEwMTu6rblJT7/E1VtZRG+8uNVT37/FV09f +787AzdXdxclvRUZNS2fv91tdV0g6NzU3Njg7REpNU2NnY03rxsnGwcK9w7+/vlnZtK2vss1j +ObyvrVE4vK13NEe6xc/J2Tk5RVNATOs8KzdLPjVbxl9DT189NU/XSkvOtLu+t7TAvb6818/E +v+PXzsT/U05LRFNv/0tNY2dRVUtBO0zrazs6P1FVb0k+SGtZPj/PyNl3y8VrWcC5ubG3wFdb +yLe5ub7ZO0fMr733T10+NzzZydvRbysszq9nLCYuPe+2t+9jv8Y3LjVIP07O02vCra/Jzr/d +3cu9zc69u91RUVE/SltbPUprd11rW1lVb1tXT3fO01c+TU5nT+PrzMrH0/9f/9fR31/TybjB +Pzhrr7PBRT7rt7LROUHJvj41O++2rsk0JyxTz99ES+/D11szOE1rZ1lPd8XJU0NASufOzm9b +2bq4w8fGxsnK51VR48HIWVFMUVNJRklP6+9b9+vfy8zPzdvX2cvN6+v/Z3fnW9nrzONdSlFZ +xMZbO0zP20NLZ105O85rPUDDTVtR2etX2bo117PBLzBbrsvBwsVVybe7Qk53d0VVV0ZA09dn +PVHba13/UUI+VeNXRk9fVVlv42/v18rT0869wMPJzdXOwsHZ09HXZ2vv419bY0pHU1lDS0xf +b1/v70Zj38nM68zAz8Nra8PHsrlny9fH01XIvlFvS9/jzclJLTnVzGc2Liw5a9dPMjtNPTlD +zkZRXVE2PFvM/9u+vb28usjb073H083L08jCvsvZ1dFfTU5PW1dTW1NAXVlvT0prX2fPWVdf +zbrBd9vPz81RRFnbvLXdU1XV5+NPWV/V72M4S9/nVV1X2T9Fw81TWXfDvk5jxcd3vlVMSsy5 +zOvn2V/jW+/dw+vdRUtvb0rb183jWUpFOz1nUWtVRktVT3d3WV1TV8vNa/9n3+dfTk1K/2v/ +12tnyt1Tb1nvvsjO1+/Z690/48fB1XdEUWNXv80+z9tvxFHj2e+7wz5ITOu4wf9dW8+497vR +/3dd/8F3vb1XzcxXd8e/yD9ARj9K93dnTmdPOjg+ODs4OUBGXc7ZY2d3ysTBys/Pz9HPzcnJ +ycbI59/Mb9Nba+9jW+/Z33f/XU5ZREhTS0VGP05KRFFEO1NnWV3fzN3DvMtJWb++29Oyw0NZ +ycK2vudLTve1XUHOucTnQUNTXcO6w8fE31FDOz4+Ql9X99vd599339njyctRVWNnXUVGU0hN +X0tETnfbV05VW+PVz9vvz8HRWWf/73dM/+tPWeNbQU1nd3dfUevra8e93U7vxL/rRNe5w9fK +//e9xeNnV13Hzl/LPjbTt2tFOjpn42PJ20zV401GPUxXU09KXW/Nv87Pyb/Gy9tn0cLI02f3 +193v6+93a9fT///3d9HT493b39nvVU9nb1tNRkBGWUpDPUdPTENHRkpHX2dVTOPZUVm7ylXV +sdtv97fnz765d//Tz2/P/2//xdlORszF6z/bZz4+T0k/P01LRkNKS1Nfa11399Pd2dfT2c7N +0dPdy8rGxcrMysvMzs7O0cbJ3d/r09/f3/f3b+tjX2djZ29rX1NdZ2tvXW9379nvX13r61tZ +U11RVUxHSUtOSExFSElLTEBKSl9bW2tvY/f/4+9d53fj3evf39fR09vTzM3R09/d1cvd1c3X +1cvZ49vT4+fn49Xj3efR3e/d2ffvd2Pn//fvb29v/11jU1VVV1NdUWv//1n/a+tn/2tf5+PZ +5/ff5/9v9/9dXXddY29rY/93X2vv/2tna/djY1tn63f/d9v/b+9n72//X/fr4//v73fj//f/ +/2vn/+Nf42/d/+P35+ff//93Y+93/2df7//dWV1n6/9rXVvrd+t3593j73fvY2v/X1dv/1VV +X+9jZ/9vb//rb29v2+vf2c/r3c73593j79XVXefA7+PDyt/E41vAdz/b02dT019I22NFztdn +a11r92dPX/dN611T/1fnY2NM10/vTUDBOk9fRlPTPl3nOsrFP1Hda+P3791Jz8FdXd/Kz9X/ +/9PD/1v32ePr9+/TzdHV69nM2ffVy9P/09fb1///3+/j/19j1+9MTdnnVdvjW0ffX01R3dFN +V29JTstRS+vIdzpV0T9Pd91TVcm+S0q9xks+WbzJVUndz9NfSMC9w3fr0c9ROj5J7z09RM/T +XVvby9vI1VFr2fdHVWPvSVvRXU1d2c1v49XN68vI5+fFv9/VxcXT0c/M513Tb19b929RTmNK +QFNGTVlRU05F62tNUWN3XWvbSVPOU09T2c1jS2PXy0fKu79fSsy/d//V0azRSGe8wWNDz8HP +y1nZzdNdR2e/S1Pf70tfV09Cb11BSO9dQERvRj5TTk5KTF9LT13v29/v1ev3VVf3b2/j529Z +z2P3z8pX78TVWdu+3+vf0cDM/92+zv9Pz9HnU8nL61vXx+fdQkvfW0FI3czZ3/fvY11da09n +RXfP30df/9lR4+9vX+//SVljW0//a1Pfxe/vzNHG0dHfzdfb2c/37+N342tv/+NXVetjV1FT +W01GUUljX1lT7/dvTevX21tdzc7j683N09fP1+Pf905bT1lIU//3Tl/Vz01v0e/3VVvIzEhb +93dTXedrWbzTTNvB30j3w8Rnv8fZ1clrb9vG/0nGykpDa0hBT04+X/9NRlfvb2tV62ddSEl3 +Y0tj3dfV1dHbyt/r09PPxN/XyL/L2cu+71PO0eNbz8znd9dd3ddfW+fdV1FfVUZjVUtO/08/ +Ve9HT11VW9XvV2fMxetHUd/VQj9b3UxIR1XTd1Vb49f/Rf/P41Vj2d/jXffP0ev35+t3d1tj +z+v/28rK49nTa8C/7/e/ws7Gxt3Jxl1jxM9V38xVb+9PTOtPR0ljU09XWU5nY0lf711T93dV +XV1OXVljWWPb/2fn2dXn68zN3dvb/+ffZ2vn52tf72tRW3dbW11Vd2tOW/dTWXd3W+Pv7+vP +9+Pj53fj419n4+N3Z+/j9/fr6//nb1vv6+Nv79/TZ//j7//n6+v3z+P/59nrb9fr79/f4+/d +4+vf2+vv5+tnZ3dvZ2tnX19nZ133XVlTVVldZ2NnW113/2tv72f37+d349nn3d/V09vb3/fr +a2Nra1lZa19nX19TU19PT1VLTVVbUVFVWVtZX1dvd3dr3d3V08jPzdnP2dfR19fT09fb2czX +3czX2c3d39nf7/fj5+/d2+t333dvY1NXU11PV19bVVNrV2tbWVlvX3dd6//v63fv9/9f71/f +a+//3eP/92fd399v79nv9+vra2//a19TY09ZV1ddT1FOVVdZX1/vXf9fb/dv2f/d09nf09fX +3dfZ1+PR09PR09ff3dPj1evb19v36+/v4+fZ3e/va/9jZ1VbWVVPW1lXWV1bZ2NfX1VbS1lN +U0lJWVVNXXdfb3f3991r2e/P1dfX2dPj29PV09vT3dPbz9/Kz8/dzs7f1+fj3+PrZ3fj7/93 +Z1tjUV9LVVVPUU1KS01LTUhNVUxTUVlTW2dZd2tvZ2Nf7+dv39vjz83O0cjNztXI2czTx9PK +ytPL1dHbzc/T19fn7/93X2djX19XV1VbT1FXVU1NTldRTFFOU1VZY1NXb2NrW2Nbb2vr/3fn +Z///7/fj59/b4+fr6+fr5//P29XN1cvjz9vZ2+/P2d3d29XR39n/7+vn72P3b29db19RZ2NP +Y19dX1VdZ1lZVWtfd1lbY3fvd+93X/f3Y/9v//9vWd3dd//jb2trXVtfV11fY1n/WU1vWV1b +d2fv493j1dvR1czdzs7PzM7HzMnb3ePv39X/z9nf29/33efjd2fnZ2tfd19fV3drd1dna2dP +VV1dV1lZZ2NrX/9dTedV/2dX51lnX2f3Z+P30/fn9+9f591rb2PvVV33a/9r7+/ra3ffb+f/ +d+P/79nr3czVd83Ry+vT2+Pd39fv5+vn2ff/429n999f/193Z+/rb/dvb+939/9RWV13TEtr +U05NU1NXTENTWU1MSUxdd1NZ9/fr/93V19PN08zP2c3j18/X48jN3czZ0dnR1Xfr7//n5+v3 +62vr53ff4+vj3+dv91lrZ/9nW2trZ0pdTldRd11ZTlNnUWtbZ11nW+//W1dZU/9P93fv33fr +42tf2evPb+fv5+dn42ff39vnzdfj/3e6Vb1r39XZ1dPnzWPHa+dj2ePfSe9Na1v/THdZY2P/ +411rY2dPVevvZ+v/b0vV30TTY3f3/2fbV+Pnd2/rV9FdY1t3Tk93X05b61dnd//nb9/O1dPJ +ysLJycfL383F1dfP1+Pb59X/0//j51vZZ2tjX11ZX1dMU0NJRkdbTVdKd2NjVVFOSVdTY01r +Z0/jY+Pv0+vfyevf79XfVclv41X/W0/vVe/va+fj02vvzkrNy1vf58tR1cJvzcrv38zNzMzK +0b/b6//Xb/fE3cX/08pJwP/b51lbTe87Ttc5/0NExi652y+0Lsn3N8tLVzi9PTXEP2/nQ11b +W81Ld8VB18w2x0TA2U9r0dXT9/fbxE7f72PFWc1Jz8vT79nD3cDDZ8S668P/XbvGTcPdv13/ +x9Pnx+tXy2vRTzr31ztM7z5vWUdTQ0zbPDjOU0HrTlNNz1VdTffvWW9N7+P/R2fd2U/OTV3Z +W0dL31FH68tZ0d/P2cr30f/M/2PGy8rC48i7ycBfu71jy9tjumvXzP/Ld1fZW1XdS0/nUU9X +X01bQ9FTPf9Fb1tCb0lX2T1X0VHbV0jnU81KP75RY8rrZ8LZ7/dZwWtOv/drxv9bu0y5wky6 +TffXPtnf/+PMUW/Z//dCWVnfW1NDUc9v4+dVv9dVZ1Vv2UZN6+/VU2Nf/+t3S1dv72dGXcx3 +a//j2//3Z3fjzlNO61Pb70xr41ffb0/ba2vfd+PK1c3CztnX19nX0cbRz8fVxcPbydfZ083j +3c/jW1vf49/P1ePf1+d372dbS01LSj9MSEVHSkRKTERESEpDXUFLTUlHRk9ZVU1nRU9bVWNb +3/fv2ev349v/0+dr49PTys/RzsvXzdvJx9nH2cjLzc/Rx8vKycvIzMXOyMPIxcjPzdHb2evX +02/jZ3f3VWNrWWtdSE5LS0tCR0dESUpISEhHSUBIRkhJRElMSkpNSFFRTE5KVVFRU2Nv2e/v +zdvO1cnLxcfAxMPCw8jEyNXG2c7ZztvVzdXT0dHPz9PZ19Hj09fb3dnf3+//d29TTldOSkVF +Q0dHR0hCSkhMS0lVTUtOSU1OWUxfU2v3V//Z29HZysnIycHIvb2+v77FwMXJz9PX6/dbb1tX +WVtVV2dnUWtfWfddXWf/6+dn7+fv5+9n32tnWVNZVU9NT09OT0dZTWtZU1tTXVVRWVNTV1FV +XV9jWVl3b///b2d3a+vb2cnXzsvOzMzKzcvFzsXDysTHw8rKxMzK0dHT39Xd59vr3+P32+Pn +32fdb9/r69vv79/v493v7+9db1tjVU5XS0tKSkVJRUQ/QD89QTw/PDs9OzxAPD5BQ0RLS1FR +W2dd79nVyMPCv7y+vby7vLq9ury4vb25vb7AxL/DyM7MytXZ2+vj/1tvV11ZWWNdb29TW09f +SltNTFtjVVNTSlFKRExISkhNSE5JS0xLS05MV1NfV2tfX1VbZ2v3/+fV39Prys/d09Xf39HV +3d3KycjT183f0+fj29fT3ePR4+Pj29/P59vv3+/r59vr1d9r9+//d99Zd1dRVU5dTndnd2Pr +Z+tjY1lTU01rUU5ORktPRUpNS1lPU1lMb1lbVV1vU2tv72fn2evZ0dPNzcnPzcnKxca/xMC+ +vr6/xca/wczIzM7P3dPf/29v92dna1VMU05DSFFRQUtBQT8+PEJAP0E/QURGSUlNU1VdZ1ld +99939+PPd9Pd3/fP38/b1dvXzsvPzNfP48vj1czZxcfIy9PAxcbKxs3Rz8jH2dXT49tf/+db +d3dnY13rTWtRWVlDW09MTUhJQUJIS0ZJSU1ISEtKT1tPXUxfTVdXXV33Y2v33f/X2+v/39t3 +zd/X3eff1d3Z3dPv6+fv3dvZ18jHy8LIx8jHw8jFxsfNzuPf23fZ3fdr/+9fWVdVU0pRS0hP +R0pBS0tEVUtTT1lITE5RT2NTX29nb+v32efTz9HIysvRxsjLzcvJys7Mz9XT1dfd3dnj28/d +3e/f9+tbXVVTW0hPREtIRlFHT0xPSklJQ05GSVFPTl1RW1tfV+tvU3dv1eNr99/r19nZ0dXb +ys7VzMnKysrMzcvR09nX0+Pd1c/T0dvj593Rb+PZ6+fj5//rW2/vZ/9jZ2tjb2Nj73d3a2tr +d2dbb3dnWWdV73dbd1FrUVlMWU9fVV1dW1n/Z/9fa19VWWtbb19V19dd4//XzG/j60fE29nJ +VdXDVczZVdvF/93bW9tOY9dPb2dJV1FOX0RX/29rXW/v5/f3593Z0//XzufRztPnY89n5+tr +3e9v3+Nvd1vfb2/dY2Pf3e9rW3dvWetrVWdvY13rZ2tr2Xfb4+/V791j7/fv3f/rd/fnd9nr +a+td//9Vb1dn429fZ3fra3dnd/djW1XrW/93X293Wffjd2PnVXdnd1f/a11j92ffXXf3791v +5//n32P3a+Nj01fO/93P99fb2+fT2d3n7//d5+fr5+Pf3czZ2dPT19HN3dnX6+v/a//3Y3db +V2ddXWtXd2drb1lRWU5bYz9IW1VXd0j/W1VvVVvbTmtOY1F3WU5XW19vV11fV19bV/9rb9vX +69Pd29fV39HZzs7NzcrM1dfG29PM29PZ38jT68fN38hZ68lN01HRT2vnWdVX91NZZ1N3b1tv +T2NMX1H/UVVbX2tVZ2NPVVdjWV1OWVVjT1VZWV9Zd2Nf7/dv49lrzslnv9fFv9nr38nvyt3f +zmfOXd1d//fX4113V3dZ91f/71ljV1dXZ3drY19nV09XW19ZY1tVWW9bWWNnY29j42vj1+vj +zMrOzGfna8JVvlfZ3+93601vd//Td29jd1FdX+/352Pr//fv7+/Z2f/j6+/v/2v/b3dVWe9f +a2NjX3dvX+N3d9vZY9XXWcdZxshT3WN31ddEyU9O7/9ZX0RZXWt3V1tPVU9bTmtdY3dba3dr +79nf29/d5+P/a2dr62fr53ff6+vr3d33z9nR19Pb2c7bz83P593v2d932/9vY03n12dN70jv +//9O70ffRtlX/01bZ05ZX2NJX0pOX2NVXVdTZ2Nv72P35+fr1dvZ2dPR08vR19PM49XT59// +4+vnb+vn/+fv52/ZW+Pvb/d3a11na+9nb+dnZ+//a29rX2NZa1tZY2Nfb2f/a2/vX2v/91// +//f/4+Pr6+/v4+fj7+vdd/9vb29rd2/3d3dX3dnvX19P49n/0WNr32dv/1nv3etvb/fr29vX +49/d1+/v3efj92tvZ3dvb3d39/fv5+/r7//j6/9db2NRZ09nXV9ZV11rWVljb193Z2tfb2Nv +a2tnX2N3Z+vj79/r3d/Z1c/R087bzdvZ2+Pr28/d3d3v7/f/92Nra1tXXWtXWV1ZZ3dfZ29r +Y2dbW///929rb2/rd1trb29X/1ddXVnvX29j71/ra+fn/2933+9v29HT30+/zdfZ3d/Lzr/f +0c5ra9nV1+Pj3Q== + +--Outermost_Trek-- diff --git a/MimeKit.sln b/MimeKit.sln index 9847b791be..55697cf61d 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -12,30 +12,36 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "MimeKit\MimeKit. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "UnitTests\UnitTests.csproj", "{88EC8D73-8099-4DD6-B78B-C21FCED97EA1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests", "UnitTests\UnitTests.csproj", "{88EC8D73-8099-4DD6-B78B-C21FCED97EA1}" ProjectSection(ProjectDependencies) = postProject {F26434C1-BA3D-41FB-B560-C009CB72B1B6} = {F26434C1-BA3D-41FB-B560-C009CB72B1B6} {E8667DCE-A5BB-4D30-9815-FC8959E447F5} = {E8667DCE-A5BB-4D30-9815-FC8959E447F5} EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Benchmarks\Benchmarks.csproj", "{AA778CE1-53AF-4E28-8282-56EAB3A444FC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.Build.0 = Release|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.Build.0 = Debug|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.ActiveCfg = Release|Any CPU {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.Build.0 = Release|Any CPU + {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.Build.0 = Release|Any CPU {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Debug|Any CPU.Build.0 = Debug|Any CPU {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Release|Any CPU.Build.0 = Release|Any CPU + {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj index 58043d87f0..8c04335117 100644 --- a/UnitTests/UnitTests.csproj +++ b/UnitTests/UnitTests.csproj @@ -24,13 +24,13 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + From 1b0ee160981bf5d8a749a9506f12fa6a2259f913 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 16 Nov 2020 12:43:58 -0500 Subject: [PATCH 717/741] Improved MimeParser performance Modified MimeMessage internals to use a dictionary keyed off of HeaderId instead of strings to reduce overhead of dictionary lookups when headers are added by the parser. --- MimeKit/MimeMessage.cs | 57 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/MimeKit/MimeMessage.cs b/MimeKit/MimeMessage.cs index 796ce6b222..419f8b561c 100644 --- a/MimeKit/MimeMessage.cs +++ b/MimeKit/MimeMessage.cs @@ -63,12 +63,12 @@ namespace MimeKit { /// public class MimeMessage { - static readonly string[] StandardAddressHeaders = { - "Resent-From", "Resent-Reply-To", "Resent-To", "Resent-Cc", "Resent-Bcc", - "From", "Reply-To", "To", "Cc", "Bcc" + static readonly HeaderId[] StandardAddressHeaders = { + HeaderId.ResentFrom, HeaderId.ResentReplyTo, HeaderId.ResentTo, HeaderId.ResentCc, HeaderId.ResentBcc, + HeaderId.From, HeaderId.ReplyTo, HeaderId.To, HeaderId.Cc, HeaderId.Bcc }; - readonly Dictionary addresses; + readonly Dictionary addresses; MessageImportance importance = MessageImportance.Normal; XMessagePriority xpriority = XMessagePriority.Normal; MessagePriority priority = MessagePriority.Normal; @@ -86,16 +86,16 @@ public class MimeMessage // Note: this .ctor is used only by the MimeParser and MimeMessage.CreateFromMailMessage() internal MimeMessage (ParserOptions options, IEnumerable
headers, RfcComplianceMode mode) { - addresses = new Dictionary (MimeUtils.OrdinalIgnoreCase); + addresses = new Dictionary (); Headers = new HeaderList (options); compliance = mode; // initialize our address lists - foreach (var name in StandardAddressHeaders) { + foreach (var id in StandardAddressHeaders) { var list = new InternetAddressList (); list.Changed += InternetAddressListChanged; - addresses.Add (name, list); + addresses.Add (id, list); } references = new MessageIdList (); @@ -115,16 +115,16 @@ internal MimeMessage (ParserOptions options, IEnumerable
headers, RfcCom internal MimeMessage (ParserOptions options) { - addresses = new Dictionary (MimeUtils.OrdinalIgnoreCase); + addresses = new Dictionary (); Headers = new HeaderList (options); compliance = RfcComplianceMode.Strict; // initialize our address lists - foreach (var name in StandardAddressHeaders) { + foreach (var id in StandardAddressHeaders) { var list = new InternetAddressList (); list.Changed += InternetAddressListChanged; - addresses.Add (name, list); + addresses.Add (id, list); } references = new MessageIdList (); @@ -464,7 +464,7 @@ public MailboxAddress ResentSender { /// /// The list of addresses in the From header. public InternetAddressList From { - get { return addresses["From"]; } + get { return addresses[HeaderId.From]; } } /// @@ -480,7 +480,7 @@ public InternetAddressList From { /// /// The list of addresses in the Resent-From header. public InternetAddressList ResentFrom { - get { return addresses["Resent-From"]; } + get { return addresses[HeaderId.ResentFrom]; } } /// @@ -496,7 +496,7 @@ public InternetAddressList ResentFrom { /// /// The list of addresses in the Reply-To header. public InternetAddressList ReplyTo { - get { return addresses["Reply-To"]; } + get { return addresses[HeaderId.ReplyTo]; } } /// @@ -512,7 +512,7 @@ public InternetAddressList ReplyTo { /// /// The list of addresses in the Resent-Reply-To header. public InternetAddressList ResentReplyTo { - get { return addresses["Resent-Reply-To"]; } + get { return addresses[HeaderId.ResentReplyTo]; } } /// @@ -524,7 +524,7 @@ public InternetAddressList ResentReplyTo { /// /// The list of addresses in the To header. public InternetAddressList To { - get { return addresses["To"]; } + get { return addresses[HeaderId.To]; } } /// @@ -536,7 +536,7 @@ public InternetAddressList To { /// /// The list of addresses in the Resent-To header. public InternetAddressList ResentTo { - get { return addresses["Resent-To"]; } + get { return addresses[HeaderId.ResentTo]; } } /// @@ -549,7 +549,7 @@ public InternetAddressList ResentTo { /// /// The list of addresses in the Cc header. public InternetAddressList Cc { - get { return addresses["Cc"]; } + get { return addresses[HeaderId.Cc]; } } /// @@ -562,7 +562,7 @@ public InternetAddressList Cc { /// /// The list of addresses in the Resent-Cc header. public InternetAddressList ResentCc { - get { return addresses["Resent-Cc"]; } + get { return addresses[HeaderId.ResentCc]; } } /// @@ -574,7 +574,7 @@ public InternetAddressList ResentCc { /// /// The list of addresses in the Bcc header. public InternetAddressList Bcc { - get { return addresses["Bcc"]; } + get { return addresses[HeaderId.Bcc]; } } /// @@ -586,7 +586,7 @@ public InternetAddressList Bcc { /// /// The list of addresses in the Resent-Bcc header. public InternetAddressList ResentBcc { - get { return addresses["Resent-Bcc"]; } + get { return addresses[HeaderId.ResentBcc]; } } /// @@ -2215,15 +2215,16 @@ void SetHeader (string name, string value) } } - void SerializeAddressList (string field, InternetAddressList list) + void SerializeAddressList (HeaderId id, InternetAddressList list) { if (list.Count == 0) { - RemoveHeader (field.ToHeaderId ()); + RemoveHeader (id); return; } var builder = new StringBuilder (" "); var options = FormatOptions.Default; + var field = id.ToHeaderName (); int lineLength = field.Length + 2; list.Encode (options, builder, true, ref lineLength); @@ -2231,16 +2232,16 @@ void SerializeAddressList (string field, InternetAddressList list) var raw = Encoding.UTF8.GetBytes (builder.ToString ()); - ReplaceHeader (field.ToHeaderId (), field, raw); + ReplaceHeader (id, field, raw); } void InternetAddressListChanged (object addrlist, EventArgs e) { var list = (InternetAddressList) addrlist; - foreach (var name in StandardAddressHeaders) { - if (addresses[name] == list) { - SerializeAddressList (name, list); + foreach (var id in StandardAddressHeaders) { + if (addresses[id] == list) { + SerializeAddressList (id, list); break; } } @@ -2432,7 +2433,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) switch (e.Action) { case HeaderListChangedAction.Added: - if (addresses.TryGetValue (e.Header.Field, out list)) { + if (addresses.TryGetValue (e.Header.Id, out list)) { AddAddresses (e.Header, list); break; } @@ -2497,7 +2498,7 @@ void HeadersChanged (object o, HeaderListChangedEventArgs e) break; case HeaderListChangedAction.Changed: case HeaderListChangedAction.Removed: - if (addresses.TryGetValue (e.Header.Field, out list)) { + if (addresses.TryGetValue (e.Header.Id, out list)) { ReloadAddressList (e.Header.Id, list); break; } From f366baea055953446a0efab586a04df076f09b76 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 17 Nov 2020 07:26:58 -0500 Subject: [PATCH 718/741] Updated appveyor.yml to require VS2019 --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index e31e49bba4..64ae689c8c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ version: 2.9.2.{build} -os: Visual Studio 2017 +os: Visual Studio 2019 configuration: Debug platform: Any CPU From c71e80ff1bf659affc07412b1e4da35aef7051be Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 17 Nov 2020 07:36:51 -0500 Subject: [PATCH 719/741] Updated .travis.yml to require dotnet 3.1.402 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 65c7047fb1..928ed87bf0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: csharp -dotnet: 2.1.807 +dotnet: 3.1.402 solution: MimeKit.sln install: - dotnet restore MimeKit.sln From 2febbd0c1b149929e7a04c34c4efbc4eed41137e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 17 Nov 2020 07:49:47 -0500 Subject: [PATCH 720/741] Updated azure-pipelines.yml to use the windows-2019 vmImage --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 32b3c3429f..6ab64af0b4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,7 +7,7 @@ trigger: - master pool: - vmImage: 'VS2017-Win2016' + vmImage: 'windows-2019' name: 2.9.2$(Rev:.r) From d94f759d35a1561a644542a3e3e37214d0eeee4c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 17 Nov 2020 08:21:23 -0500 Subject: [PATCH 721/741] Added some debugging CWLs for the DSACng unit test --- .../AsymmetricAlgorithmExtensionTests.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs index cb7b19adeb..fcfd7fda99 100644 --- a/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs +++ b/UnitTests/Cryptography/AsymmetricAlgorithmExtensionTests.cs @@ -31,6 +31,7 @@ using Org.BouncyCastle.Math; using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Parameters; using MimeKit.Cryptography; @@ -70,7 +71,16 @@ static void AssertDSA (DSA dsa) // first, check private key conversion var expected = dsa.ExportParameters (true); var keyParameter = dsa.AsAsymmetricKeyParameter (); - var asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; + DSA asymmetricAlgorithm; + + try { + asymmetricAlgorithm = keyParameter.AsAsymmetricAlgorithm () as DSA; + } catch { + Console.WriteLine ("System.Security DSA X parameter = {0}", expected.X.AsHex ()); + Console.WriteLine ("Bouncy Castle DSA X parameter = {0}", ((DsaPrivateKeyParameters) keyParameter).X.ToByteArrayUnsigned ().AsHex ()); + throw; + } + var actual = asymmetricAlgorithm.ExportParameters (true); Assert.AreEqual (expected.Counter, actual.Counter, "Counter"); From 044ec16fe1e3d3e59d38cd2e5ca3b4bea1d37888 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 17 Nov 2020 08:34:55 -0500 Subject: [PATCH 722/741] Set Benchmark target to net47 (might fix build on Travis-CI) --- Benchmarks/BenchmarkHelper.cs | 2 +- Benchmarks/Benchmarks.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Benchmarks/BenchmarkHelper.cs b/Benchmarks/BenchmarkHelper.cs index 956029ec8d..f0cc328b08 100644 --- a/Benchmarks/BenchmarkHelper.cs +++ b/Benchmarks/BenchmarkHelper.cs @@ -45,7 +45,7 @@ static BenchmarkHelper () codeBase = codeBase.Replace ('/', '\\'); } - + var dir = Path.GetDirectoryName (codeBase); while (Path.GetFileName (dir) != "Benchmarks") diff --git a/Benchmarks/Benchmarks.csproj b/Benchmarks/Benchmarks.csproj index a34f5f305a..d701b284c8 100644 --- a/Benchmarks/Benchmarks.csproj +++ b/Benchmarks/Benchmarks.csproj @@ -1,7 +1,7 @@  - net48;netcoreapp3.1 + net47 true $(DefineConstants);MONO ..\MimeKit\mimekit.snk From 886a8281ae6a86fa6a4f7a92a7b3e7dc0b659ac7 Mon Sep 17 00:00:00 2001 From: rblackin Date: Thu, 19 Nov 2020 20:59:30 -0500 Subject: [PATCH 723/741] Implement Sql server support (#619) Added SQL Server Support. Co-authored-by: Jeffrey Stedfast --- .../SQLServerCertificateDatabase.cs | 223 ++++++++++++++++++ .../Cryptography/SqlCertificateDatabase.cs | 12 +- MimeKit/MimeKit.csproj | 2 + 3 files changed, 231 insertions(+), 6 deletions(-) create mode 100644 MimeKit/Cryptography/SQLServerCertificateDatabase.cs diff --git a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs new file mode 100644 index 0000000000..10f87bb811 --- /dev/null +++ b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs @@ -0,0 +1,223 @@ +// +// SQLServerCertificateDatabase.cs +// +// Author: Rob Blackin +// +// Copyright (c) 2013-2020 .NET Foundation and Contributors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +using System; +using System.Text; +using System.Data; +using System.Data.Common; +using System.Collections.Generic; + +using MimeKit.Utils; + +using Org.BouncyCastle.X509; + +namespace MimeKit.Cryptography { + public class SQLServerCertificateDatabase : SqlCertificateDatabase + { + public SQLServerCertificateDatabase (DbConnection connection, string password) : base (connection, password) + { + } + + protected override void AddTableColumn (DbConnection connection, DataTable table, DataColumn column) + { + var statement = new StringBuilder ("ALTER TABLE "); + int primaryKeys = table.PrimaryKey?.Length ?? 0; + + statement.Append (table.TableName); + statement.Append (" ADD COLUMN "); + Build (statement, table, column, ref primaryKeys); + + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } + } + + protected override void CreateTable (DbConnection connection, DataTable table) + { + var statement = new StringBuilder ($"if not exists (select * from sysobjects where name='{table.TableName}' and xtype='U') "); + int primaryKeys = 0; + + statement.Append ($"Create table {table.TableName} ("); + + foreach (DataColumn column in table.Columns) { + Build (statement, table, column, ref primaryKeys); + statement.Append (", "); + } + + if (table.Columns.Count > 0) + statement.Length -= 2; + + statement.Append (')'); + + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } + } + + static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys) + { + statement.Append (column.ColumnName); + statement.Append (' '); + + if (column.DataType == typeof (long) || column.DataType == typeof (int)) { + if (column.AutoIncrement) + statement.Append ("int identity(1,1)"); + else if (column.DataType == typeof (long)) + statement.Append ("DateTime"); + else + statement.Append ("int"); + } else if (column.DataType == typeof (bool)) { + statement.Append ("bit"); + } else if (column.DataType == typeof (byte[])) { + statement.Append ($"varbinary(4096)"); + } else if (column.DataType == typeof (string)) { + statement.Append ("varchar(256)"); + } else { + throw new NotImplementedException (); + } + + if (table != null && table.PrimaryKey != null && primaryKeys < table.PrimaryKey.Length) { + for (int i = 0; i < table.PrimaryKey.Length; i++) { + if (column == table.PrimaryKey[i]) { + statement.Append (" PRIMARY KEY Clustered"); + primaryKeys++; + break; + } + } + } + + if (!column.AllowDBNull) + statement.Append (" NOT NULL"); + } + + protected override IList GetTableColumns (DbConnection connection, string tableName) + { + using (var command = connection.CreateCommand ()) { + command.CommandText = $"select top 1 * from {tableName}"; + using (var reader = command.ExecuteReader ()) { + var columns = new List (); + var table = reader.GetSchemaTable (); + + foreach (DataRow row in table.Rows) + columns.Add (new DataColumn { ColumnName = row.Field ("ColumnName") }); + + return columns; + } + } + } + + protected override void CreateIndex (DbConnection connection, string tableName, string[] columnNames) + { + var indexName = GetIndexName (tableName, columnNames); + var query = string.Format ("IF NOT EXISTS (Select 8 from sys.indexes where name='{0}' and object_id=OBJECT_ID('{1}')) CREATE INDEX {0} ON {1}({2})", indexName, tableName, string.Join(", ", columnNames)); + + using (var command = connection.CreateCommand ()) { + command.CommandText = query; + command.ExecuteNonQuery (); + } + } + + protected override void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) + { + var indexName = GetIndexName (tableName, columnNames); + var query = string.Format ("IF EXISTS (Select 8 from sys.indexes where name='{0}' and object_id=OBJECT_ID('{1}')) DROP INDEX {0} ON {1}", indexName, tableName); + + using (var command = connection.CreateCommand ()) { + command.CommandText = query; + command.ExecuteNonQuery (); + } + } + + /// + /// Gets the database command to select the record matching the specified certificate. + /// + /// + /// Gets the database command to select the record matching the specified certificate. + /// + /// The database command. + /// The certificate. + /// The fields to return. + protected override DbCommand GetSelectCommand (X509Certificate certificate, X509CertificateRecordFields fields) + { + var fingerprint = certificate.GetFingerprint ().ToLowerInvariant (); + var serialNumber = certificate.SerialNumber.ToString (); + var issuerName = certificate.IssuerDN.ToString (); + var command = connection.CreateCommand (); + var query = CreateSelectQuery (fields).Replace ("SELECT", "SELECT top 1"); + + // FIXME: Is this really the best way to query for an exact match of a certificate? + query = query.Append (" WHERE ISSUERNAME = @ISSUERNAME AND SERIALNUMBER = @SERIALNUMBER AND FINGERPRINT = @FINGERPRINT"); + command.AddParameterWithValue ("@ISSUERNAME", issuerName); + command.AddParameterWithValue ("@SERIALNUMBER", serialNumber); + command.AddParameterWithValue ("@FINGERPRINT", fingerprint); + + command.CommandText = query.ToString (); + command.CommandType = CommandType.Text; + + return command; + } + + protected override DbCommand GetInsertCommand (X509CertificateRecord record) + { + var statement = new StringBuilder ("INSERT INTO CERTIFICATES("); + var variables = new StringBuilder ("VALUES("); + var command = connection.CreateCommand (); + var columns = certificatesTable.Columns; + + for (int i = 1; i < columns.Count; i++) { + if (i > 1) { + statement.Append (", "); + variables.Append (", "); + } + + var value = GetValue (record, columns[i].ColumnName); + if (value.GetType () == typeof (DateTime)) + value = ((DateTime) value < DateUtils.UnixEpoch) ? DateUtils.UnixEpoch : (DateTime) value; + + if (columns[i].ColumnName == "PRIVATEKEY" && value.GetType () == typeof (DBNull)) + value = new byte[0]; + + var variable = "@" + columns[i]; + + command.AddParameterWithValue (variable, value); + statement.Append (columns[i]); + variables.Append (variable); + } + + statement.Append (')'); + variables.Append (')'); + + command.CommandText = statement + " " + variables; + command.CommandType = CommandType.Text; + + return command; + } + } +} diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index 482b6466c3..cd5979ce32 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -53,8 +53,8 @@ namespace MimeKit.Cryptography { /// public abstract class SqlCertificateDatabase : X509CertificateDatabase { - readonly DataTable certificatesTable, crlsTable; - readonly DbConnection connection; + protected readonly DataTable certificatesTable, crlsTable; + protected readonly DbConnection connection; bool disposed; /// @@ -229,12 +229,12 @@ static DataTable CreateCrlsDataTable (string tableName) /// The column to add. protected abstract void AddTableColumn (DbConnection connection, DataTable table, DataColumn column); - static string GetIndexName (string tableName, string[] columnNames) + protected string GetIndexName (string tableName, string[] columnNames) { return string.Format ("{0}_{1}_INDEX", tableName, string.Join ("_", columnNames)); } - static void CreateIndex (DbConnection connection, string tableName, string[] columnNames) + protected virtual void CreateIndex (DbConnection connection, string tableName, string[] columnNames) { var indexName = GetIndexName (tableName, columnNames); var query = string.Format ("CREATE INDEX IF NOT EXISTS {0} ON {1}({2})", indexName, tableName, string.Join (", ", columnNames)); @@ -245,7 +245,7 @@ static void CreateIndex (DbConnection connection, string tableName, string[] col } } - static void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) + protected virtual void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) { var indexName = GetIndexName (tableName, columnNames); var query = string.Format ("DROP INDEX IF EXISTS {0}", indexName); @@ -337,7 +337,7 @@ void CreateCrlsTable (DataTable table) CreateIndex (connection, table.TableName, new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); } - static StringBuilder CreateSelectQuery (X509CertificateRecordFields fields) + protected StringBuilder CreateSelectQuery (X509CertificateRecordFields fields) { var query = new StringBuilder ("SELECT "); var columns = GetColumnNames (fields); diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index e29d780a7f..a72895be6c 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -67,6 +67,7 @@ + @@ -134,6 +135,7 @@ + From cb750f327c71082c4735bddeacbfe89333930843 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Nov 2020 21:28:20 -0500 Subject: [PATCH 724/741] Added docs for the newly exposed APIs --- .../SQLServerCertificateDatabase.cs | 308 +++++++++++------- .../Cryptography/SqlCertificateDatabase.cs | 35 ++ 2 files changed, 226 insertions(+), 117 deletions(-) diff --git a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs index 10f87bb811..7e85b7fc6f 100644 --- a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs +++ b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs @@ -35,125 +35,191 @@ using Org.BouncyCastle.X509; namespace MimeKit.Cryptography { - public class SQLServerCertificateDatabase : SqlCertificateDatabase - { - public SQLServerCertificateDatabase (DbConnection connection, string password) : base (connection, password) - { - } - - protected override void AddTableColumn (DbConnection connection, DataTable table, DataColumn column) - { - var statement = new StringBuilder ("ALTER TABLE "); - int primaryKeys = table.PrimaryKey?.Length ?? 0; - - statement.Append (table.TableName); - statement.Append (" ADD COLUMN "); - Build (statement, table, column, ref primaryKeys); - - using (var command = connection.CreateCommand ()) { - command.CommandText = statement.ToString (); - command.CommandType = CommandType.Text; - command.ExecuteNonQuery (); - } - } - - protected override void CreateTable (DbConnection connection, DataTable table) - { - var statement = new StringBuilder ($"if not exists (select * from sysobjects where name='{table.TableName}' and xtype='U') "); - int primaryKeys = 0; - - statement.Append ($"Create table {table.TableName} ("); - - foreach (DataColumn column in table.Columns) { - Build (statement, table, column, ref primaryKeys); - statement.Append (", "); - } - - if (table.Columns.Count > 0) - statement.Length -= 2; - - statement.Append (')'); - - using (var command = connection.CreateCommand ()) { - command.CommandText = statement.ToString (); - command.CommandType = CommandType.Text; - command.ExecuteNonQuery (); - } - } - - static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys) - { - statement.Append (column.ColumnName); - statement.Append (' '); - - if (column.DataType == typeof (long) || column.DataType == typeof (int)) { - if (column.AutoIncrement) - statement.Append ("int identity(1,1)"); - else if (column.DataType == typeof (long)) + /// + /// An X.509 certificate database built on SQL Server. + /// + /// + /// An X.509 certificate database is used for storing certificates, metdata related to the certificates + /// (such as encryption algorithms supported by the associated client), certificate revocation lists (CRLs), + /// and private keys. + /// This particular database uses SQL Server to store the data. + /// + public class SQLServerCertificateDatabase : SqlCertificateDatabase + { + /// + /// Initialize a new instance of the class. + /// + /// + /// Creates a new using the provided SQL Server database connection. + /// + /// The SQL Server connection. + /// The password used for encrypting and decrypting the private keys. + /// + /// is null. + /// -or- + /// is null. + /// + public SQLServerCertificateDatabase (DbConnection connection, string password) : base (connection, password) + { + } + + /// + /// Adds a column to a table. + /// + /// + /// Adds a column to a table. + /// + /// The . + /// The table. + /// The column to add. + protected override void AddTableColumn (DbConnection connection, DataTable table, DataColumn column) + { + var statement = new StringBuilder ("ALTER TABLE "); + int primaryKeys = table.PrimaryKey?.Length ?? 0; + + statement.Append (table.TableName); + statement.Append (" ADD COLUMN "); + Build (statement, table, column, ref primaryKeys); + + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } + } + + /// + /// Create a table. + /// + /// + /// Creates the specified table. + /// + /// The . + /// The table. + protected override void CreateTable (DbConnection connection, DataTable table) + { + var statement = new StringBuilder ($"if not exists (select * from sysobjects where name='{table.TableName}' and xtype='U') "); + int primaryKeys = 0; + + statement.Append ($"Create table {table.TableName} ("); + + foreach (DataColumn column in table.Columns) { + Build (statement, table, column, ref primaryKeys); + statement.Append (", "); + } + + if (table.Columns.Count > 0) + statement.Length -= 2; + + statement.Append (')'); + + using (var command = connection.CreateCommand ()) { + command.CommandText = statement.ToString (); + command.CommandType = CommandType.Text; + command.ExecuteNonQuery (); + } + } + + static void Build (StringBuilder statement, DataTable table, DataColumn column, ref int primaryKeys) + { + statement.Append (column.ColumnName); + statement.Append (' '); + + if (column.DataType == typeof (long) || column.DataType == typeof (int)) { + if (column.AutoIncrement) + statement.Append ("int identity(1,1)"); + else if (column.DataType == typeof (long)) statement.Append ("DateTime"); else - statement.Append ("int"); - } else if (column.DataType == typeof (bool)) { - statement.Append ("bit"); - } else if (column.DataType == typeof (byte[])) { - statement.Append ($"varbinary(4096)"); - } else if (column.DataType == typeof (string)) { - statement.Append ("varchar(256)"); - } else { - throw new NotImplementedException (); - } - - if (table != null && table.PrimaryKey != null && primaryKeys < table.PrimaryKey.Length) { - for (int i = 0; i < table.PrimaryKey.Length; i++) { - if (column == table.PrimaryKey[i]) { - statement.Append (" PRIMARY KEY Clustered"); - primaryKeys++; - break; - } - } - } - - if (!column.AllowDBNull) - statement.Append (" NOT NULL"); - } - - protected override IList GetTableColumns (DbConnection connection, string tableName) - { - using (var command = connection.CreateCommand ()) { - command.CommandText = $"select top 1 * from {tableName}"; - using (var reader = command.ExecuteReader ()) { - var columns = new List (); - var table = reader.GetSchemaTable (); - - foreach (DataRow row in table.Rows) - columns.Add (new DataColumn { ColumnName = row.Field ("ColumnName") }); - - return columns; - } - } - } - - protected override void CreateIndex (DbConnection connection, string tableName, string[] columnNames) - { - var indexName = GetIndexName (tableName, columnNames); - var query = string.Format ("IF NOT EXISTS (Select 8 from sys.indexes where name='{0}' and object_id=OBJECT_ID('{1}')) CREATE INDEX {0} ON {1}({2})", indexName, tableName, string.Join(", ", columnNames)); - - using (var command = connection.CreateCommand ()) { - command.CommandText = query; - command.ExecuteNonQuery (); - } - } - - protected override void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) - { - var indexName = GetIndexName (tableName, columnNames); - var query = string.Format ("IF EXISTS (Select 8 from sys.indexes where name='{0}' and object_id=OBJECT_ID('{1}')) DROP INDEX {0} ON {1}", indexName, tableName); - - using (var command = connection.CreateCommand ()) { - command.CommandText = query; - command.ExecuteNonQuery (); - } - } + statement.Append ("int"); + } else if (column.DataType == typeof (bool)) { + statement.Append ("bit"); + } else if (column.DataType == typeof (byte[])) { + statement.Append ($"varbinary(4096)"); + } else if (column.DataType == typeof (string)) { + statement.Append ("varchar(256)"); + } else { + throw new NotImplementedException (); + } + + if (table != null && table.PrimaryKey != null && primaryKeys < table.PrimaryKey.Length) { + for (int i = 0; i < table.PrimaryKey.Length; i++) { + if (column == table.PrimaryKey[i]) { + statement.Append (" PRIMARY KEY Clustered"); + primaryKeys++; + break; + } + } + } + + if (!column.AllowDBNull) + statement.Append (" NOT NULL"); + } + + /// + /// Gets the columns for the specified table. + /// + /// + /// Gets the list of columns for the specified table. + /// + /// The . + /// The name of the table. + /// The list of columns. + protected override IList GetTableColumns (DbConnection connection, string tableName) + { + using (var command = connection.CreateCommand ()) { + command.CommandText = $"select top 1 * from {tableName}"; + using (var reader = command.ExecuteReader ()) { + var columns = new List (); + var table = reader.GetSchemaTable (); + + foreach (DataRow row in table.Rows) + columns.Add (new DataColumn { ColumnName = row.Field ("ColumnName") }); + + return columns; + } + } + } + + /// + /// Creates an index for faster table lookups. + /// + /// + /// Creates an index for faster table lookups. + /// + /// The . + /// The name of the table. + /// The names of the columns to index. + protected override void CreateIndex (DbConnection connection, string tableName, string[] columnNames) + { + var indexName = GetIndexName (tableName, columnNames); + var query = string.Format ("IF NOT EXISTS (Select 8 from sys.indexes where name='{0}' and object_id=OBJECT_ID('{1}')) CREATE INDEX {0} ON {1}({2})", indexName, tableName, string.Join (", ", columnNames)); + + using (var command = connection.CreateCommand ()) { + command.CommandText = query; + command.ExecuteNonQuery (); + } + } + + /// + /// Removes an index that is no longer needed. + /// + /// + /// Removes an index that is no longer needed. + /// + /// The . + /// The name of the table. + /// The names of the columns that were indexed. + protected override void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) + { + var indexName = GetIndexName (tableName, columnNames); + var query = string.Format ("IF EXISTS (Select 8 from sys.indexes where name='{0}' and object_id=OBJECT_ID('{1}')) DROP INDEX {0} ON {1}", indexName, tableName); + + using (var command = connection.CreateCommand ()) { + command.CommandText = query; + command.ExecuteNonQuery (); + } + } /// /// Gets the database command to select the record matching the specified certificate. @@ -184,6 +250,14 @@ protected override DbCommand GetSelectCommand (X509Certificate certificate, X509 return command; } + /// + /// Gets the database command to insert the specified certificate record. + /// + /// + /// Gets the database command to insert the specified certificate record. + /// + /// The database command. + /// The certificate record. protected override DbCommand GetInsertCommand (X509CertificateRecord record) { var statement = new StringBuilder ("INSERT INTO CERTIFICATES("); diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index cd5979ce32..1d955bbd34 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -229,11 +229,29 @@ static DataTable CreateCrlsDataTable (string tableName) /// The column to add. protected abstract void AddTableColumn (DbConnection connection, DataTable table, DataColumn column); + /// + /// Gets the name of an index based on the table and columns that it is built against. + /// + /// + /// Gets the name of an index based on the table and columns that it is built against. + /// + /// The name of the table. + /// The names of the columns that are indexed. + /// protected string GetIndexName (string tableName, string[] columnNames) { return string.Format ("{0}_{1}_INDEX", tableName, string.Join ("_", columnNames)); } + /// + /// Creates an index for faster table lookups. + /// + /// + /// Creates an index for faster table lookups. + /// + /// The . + /// The name of the table. + /// The names of the columns to index. protected virtual void CreateIndex (DbConnection connection, string tableName, string[] columnNames) { var indexName = GetIndexName (tableName, columnNames); @@ -245,6 +263,15 @@ protected virtual void CreateIndex (DbConnection connection, string tableName, s } } + /// + /// Removes an index that is no longer needed. + /// + /// + /// Removes an index that is no longer needed. + /// + /// The . + /// The name of the table. + /// The names of the columns that were indexed. protected virtual void RemoveIndex (DbConnection connection, string tableName, string[] columnNames) { var indexName = GetIndexName (tableName, columnNames); @@ -337,6 +364,14 @@ void CreateCrlsTable (DataTable table) CreateIndex (connection, table.TableName, new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); } + /// + /// Creates a SELECT query string builder for the specified fields of an X.509 certificate record. + /// + /// + /// Creates a SELECT query string builder for the specified fields of an X.509 certificate record. + /// + /// THe X.509 certificate fields. + /// A containing a basic SELECT query string. protected StringBuilder CreateSelectQuery (X509CertificateRecordFields fields) { var query = new StringBuilder ("SELECT "); From fe16cfb9de30ae86f1f2cee8b04d94fcc1e12e8d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Nov 2020 21:29:11 -0500 Subject: [PATCH 725/741] Simplified some logic in SQLServerCertificateDatabase --- MimeKit/Cryptography/SQLServerCertificateDatabase.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs index 7e85b7fc6f..2fd7652ac3 100644 --- a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs +++ b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs @@ -272,10 +272,10 @@ protected override DbCommand GetInsertCommand (X509CertificateRecord record) } var value = GetValue (record, columns[i].ColumnName); - if (value.GetType () == typeof (DateTime)) - value = ((DateTime) value < DateUtils.UnixEpoch) ? DateUtils.UnixEpoch : (DateTime) value; + if (value is DateTime dateTime && dateTime < DateUtils.UnixEpoch) + value = DateUtils.UnixEpoch; - if (columns[i].ColumnName == "PRIVATEKEY" && value.GetType () == typeof (DBNull)) + if (columns[i].ColumnName == "PRIVATEKEY" && value is DBNull) value = new byte[0]; var variable = "@" + columns[i]; From e01dac4dea97cd47b8d228bb774f47ca2dad6fe1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Nov 2020 21:45:42 -0500 Subject: [PATCH 726/741] Try using NuGet 5.8.0 (maybe that will fix the Azure builds?) --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6ab64af0b4..fdf3fd3fdb 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -20,9 +20,9 @@ steps: - script: git submodule update --init --recursive - task: NuGetToolInstaller@0 - displayName: 'Install NuGet 5.3.0' + displayName: 'Install NuGet 5.8.0' inputs: - versionSpec: 5.3.0 + versionSpec: 5.8.0 - task: NuGetCommand@2 displayName: 'Restore NuGet Package Dependencies' From 948688ddd4d2921261b69509bacd097a0653e5a3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 19 Nov 2020 22:05:35 -0500 Subject: [PATCH 727/741] Make the DbConnection, certificatesTable and crlsTable into protected properties. --- .../SQLServerCertificateDatabase.cs | 6 +- .../Cryptography/SqlCertificateDatabase.cs | 117 +++++++++++------- 2 files changed, 77 insertions(+), 46 deletions(-) diff --git a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs index 2fd7652ac3..806c94285d 100644 --- a/MimeKit/Cryptography/SQLServerCertificateDatabase.cs +++ b/MimeKit/Cryptography/SQLServerCertificateDatabase.cs @@ -235,7 +235,7 @@ protected override DbCommand GetSelectCommand (X509Certificate certificate, X509 var fingerprint = certificate.GetFingerprint ().ToLowerInvariant (); var serialNumber = certificate.SerialNumber.ToString (); var issuerName = certificate.IssuerDN.ToString (); - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); var query = CreateSelectQuery (fields).Replace ("SELECT", "SELECT top 1"); // FIXME: Is this really the best way to query for an exact match of a certificate? @@ -262,8 +262,8 @@ protected override DbCommand GetInsertCommand (X509CertificateRecord record) { var statement = new StringBuilder ("INSERT INTO CERTIFICATES("); var variables = new StringBuilder ("VALUES("); - var command = connection.CreateCommand (); - var columns = certificatesTable.Columns; + var command = Connection.CreateCommand (); + var columns = CertificatesTable.Columns; for (int i = 1; i < columns.Count; i++) { if (i > 1) { diff --git a/MimeKit/Cryptography/SqlCertificateDatabase.cs b/MimeKit/Cryptography/SqlCertificateDatabase.cs index 1d955bbd34..bffa3863ec 100644 --- a/MimeKit/Cryptography/SqlCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqlCertificateDatabase.cs @@ -53,8 +53,6 @@ namespace MimeKit.Cryptography { /// public abstract class SqlCertificateDatabase : X509CertificateDatabase { - protected readonly DataTable certificatesTable, crlsTable; - protected readonly DbConnection connection; bool disposed; /// @@ -75,16 +73,49 @@ protected SqlCertificateDatabase (DbConnection connection, string password) : ba if (connection == null) throw new ArgumentNullException (nameof (connection)); - this.connection = connection; + Connection = connection; if (connection.State != ConnectionState.Open) connection.Open (); - certificatesTable = CreateCertificatesDataTable ("CERTIFICATES"); - crlsTable = CreateCrlsDataTable ("CRLS"); + CertificatesTable = CreateCertificatesDataTable ("CERTIFICATES"); + CrlsTable = CreateCrlsDataTable ("CRLS"); - CreateCertificatesTable (certificatesTable); - CreateCrlsTable (crlsTable); + CreateCertificatesTable (CertificatesTable); + CreateCrlsTable (CrlsTable); + } + + /// + /// Gets the database connection. + /// + /// + /// Gets the database connection. + /// + /// The database connection. + protected DbConnection Connection { + get; private set; // TODO: push this down into X509CertificateDatabase and fix GetSelectCommand()/GetInsertCommand()/etc to take a DbConnection arg, then this could be private. + } + + /// + /// Gets the X.509 certificate table definition. + /// + /// + /// Gets the X.509 certificate table definition. + /// + /// The X.509 certificates table definition. + protected DataTable CertificatesTable { + get; private set; + } + + /// + /// Gets the X.509 certificate revocation lists (CRLs) table definition. + /// + /// + /// Gets the X.509 certificate revocation lists (CRLs) table definition. + /// + /// The X.509 certificate revocation lists table definition. + protected DataTable CrlsTable { + get; private set; } #if NETSTANDARD1_3 || NETSTANDARD1_6 @@ -285,9 +316,9 @@ protected virtual void RemoveIndex (DbConnection connection, string tableName, s void CreateCertificatesTable (DataTable table) { - CreateTable (connection, table); + CreateTable (Connection, table); - var currentColumns = GetTableColumns (connection, table.TableName); + var currentColumns = GetTableColumns (Connection, table.TableName); bool hasAnchorColumn = false; for (int i = 0; i < currentColumns.Count; i++) { @@ -300,21 +331,21 @@ void CreateCertificatesTable (DataTable table) // Note: The ANCHOR, SUBJECTNAME and SUBJECTKEYIDENTIFIER columns were all added in the same version, // so if the ANCHOR column is missing, they all are. if (!hasAnchorColumn) { - using (var transaction = connection.BeginTransaction ()) { + using (var transaction = Connection.BeginTransaction ()) { try { var column = table.Columns[table.Columns.IndexOf ("ANCHOR")]; - AddTableColumn (connection, table, column); + AddTableColumn (Connection, table, column); column = table.Columns[table.Columns.IndexOf ("SUBJECTNAME")]; - AddTableColumn (connection, table, column); + AddTableColumn (Connection, table, column); column = table.Columns[table.Columns.IndexOf ("SUBJECTKEYIDENTIFIER")]; - AddTableColumn (connection, table, column); + AddTableColumn (Connection, table, column); foreach (var record in Find (null, false, X509CertificateRecordFields.Id | X509CertificateRecordFields.Certificate)) { var statement = "UPDATE CERTIFICATES SET ANCHOR = @ANCHOR, SUBJECTNAME = @SUBJECTNAME, SUBJECTKEYIDENTIFIER = @SUBJECTKEYIDENTIFIER WHERE ID = @ID"; - using (var command = connection.CreateCommand ()) { + using (var command = Connection.CreateCommand ()) { command.AddParameterWithValue ("@ID", record.Id); command.AddParameterWithValue ("@ANCHOR", record.IsAnchor); command.AddParameterWithValue ("@SUBJECTNAME", record.SubjectName); @@ -334,34 +365,34 @@ void CreateCertificatesTable (DataTable table) } // Remove some old indexes - RemoveIndex (connection, table.TableName, new[] { "TRUSTED" }); - RemoveIndex (connection, table.TableName, new[] { "TRUSTED", "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); - RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); - RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "FINGERPRINT" }); - RemoveIndex (connection, table.TableName, new[] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); + RemoveIndex (Connection, table.TableName, new[] { "TRUSTED" }); + RemoveIndex (Connection, table.TableName, new[] { "TRUSTED", "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + RemoveIndex (Connection, table.TableName, new[] { "BASICCONSTRAINTS", "ISSUERNAME", "SERIALNUMBER" }); + RemoveIndex (Connection, table.TableName, new[] { "BASICCONSTRAINTS", "FINGERPRINT" }); + RemoveIndex (Connection, table.TableName, new[] { "BASICCONSTRAINTS", "SUBJECTEMAIL" }); } // Note: Use "EXPLAIN QUERY PLAN SELECT ... FROM CERTIFICATES WHERE ..." to verify that any indexes we create get used as expected. // Index for matching against a specific certificate - CreateIndex (connection, table.TableName, new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); + CreateIndex (Connection, table.TableName, new [] { "ISSUERNAME", "SERIALNUMBER", "FINGERPRINT" }); // Index for searching for a certificate based on a SecureMailboxAddress - CreateIndex (connection, table.TableName, new [] { "BASICCONSTRAINTS", "FINGERPRINT", "NOTBEFORE", "NOTAFTER" }); + CreateIndex (Connection, table.TableName, new [] { "BASICCONSTRAINTS", "FINGERPRINT", "NOTBEFORE", "NOTAFTER" }); // Index for searching for a certificate based on a MailboxAddress - CreateIndex (connection, table.TableName, new [] { "BASICCONSTRAINTS", "SUBJECTEMAIL", "NOTBEFORE", "NOTAFTER" }); + CreateIndex (Connection, table.TableName, new [] { "BASICCONSTRAINTS", "SUBJECTEMAIL", "NOTBEFORE", "NOTAFTER" }); // Index for gathering a list of Trusted Anchors - CreateIndex (connection, table.TableName, new [] { "TRUSTED", "ANCHOR", "KEYUSAGE" }); + CreateIndex (Connection, table.TableName, new [] { "TRUSTED", "ANCHOR", "KEYUSAGE" }); } void CreateCrlsTable (DataTable table) { - CreateTable (connection, table); + CreateTable (Connection, table); - CreateIndex (connection, table.TableName, new [] { "ISSUERNAME" }); - CreateIndex (connection, table.TableName, new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); + CreateIndex (Connection, table.TableName, new [] { "ISSUERNAME" }); + CreateIndex (Connection, table.TableName, new [] { "DELTA", "ISSUERNAME", "THISUPDATE" }); } /// @@ -401,7 +432,7 @@ protected override DbCommand GetSelectCommand (X509Certificate certificate, X509 var fingerprint = certificate.GetFingerprint ().ToLowerInvariant (); var serialNumber = certificate.SerialNumber.ToString (); var issuerName = certificate.IssuerDN.ToString (); - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); var query = CreateSelectQuery (fields); // FIXME: Is this really the best way to query for an exact match of a certificate? @@ -430,7 +461,7 @@ protected override DbCommand GetSelectCommand (X509Certificate certificate, X509 protected override DbCommand GetSelectCommand (MailboxAddress mailbox, DateTime now, bool requirePrivateKey, X509CertificateRecordFields fields) { var secure = mailbox as SecureMailboxAddress; - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); var query = CreateSelectQuery (fields); query = query.Append (" WHERE BASICCONSTRAINTS = @BASICCONSTRAINTS "); @@ -475,7 +506,7 @@ protected override DbCommand GetSelectCommand (MailboxAddress mailbox, DateTime protected override DbCommand GetSelectCommand (IX509Selector selector, bool trustedAnchorsOnly, bool requirePrivateKey, X509CertificateRecordFields fields) { var match = selector as X509CertStoreSelector; - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); var query = CreateSelectQuery (fields); int baseQueryLength = query.Length; @@ -605,7 +636,7 @@ protected override DbCommand GetSelectCommand (IX509Selector selector, bool trus protected override DbCommand GetSelectCommand (X509Name issuer, X509CrlRecordFields fields) { var query = "SELECT " + string.Join (", ", GetColumnNames (fields)) + " FROM CRLS "; - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); command.CommandText = query + "WHERE ISSUERNAME = @ISSUERNAME"; command.AddParameterWithValue ("@ISSUERNAME", issuer.ToString ()); @@ -627,7 +658,7 @@ protected override DbCommand GetSelectCommand (X509Crl crl, X509CrlRecordFields { var query = "SELECT " + string.Join (", ", GetColumnNames (fields)) + " FROM CRLS "; var issuerName = crl.IssuerDN.ToString (); - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); command.CommandText = query + "WHERE DELTA = @DELTA AND ISSUERNAME = @ISSUERNAME AND THISUPDATE = @THISUPDATE LIMIT 1"; command.AddParameterWithValue ("@DELTA", crl.IsDelta ()); @@ -647,7 +678,7 @@ protected override DbCommand GetSelectCommand (X509Crl crl, X509CrlRecordFields /// The database command. protected override DbCommand GetSelectAllCrlsCommand () { - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); command.CommandText = "SELECT ID, CRL FROM CRLS"; command.CommandType = CommandType.Text; @@ -665,7 +696,7 @@ protected override DbCommand GetSelectAllCrlsCommand () /// The certificate record. protected override DbCommand GetDeleteCommand (X509CertificateRecord record) { - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); command.CommandText = "DELETE FROM CERTIFICATES WHERE ID = @ID"; command.AddParameterWithValue ("@ID", record.Id); @@ -684,7 +715,7 @@ protected override DbCommand GetDeleteCommand (X509CertificateRecord record) /// The record. protected override DbCommand GetDeleteCommand (X509CrlRecord record) { - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); command.CommandText = "DELETE FROM CRLS WHERE ID = @ID"; command.AddParameterWithValue ("@ID", record.Id); @@ -705,8 +736,8 @@ protected override DbCommand GetInsertCommand (X509CertificateRecord record) { var statement = new StringBuilder ("INSERT INTO CERTIFICATES("); var variables = new StringBuilder ("VALUES("); - var command = connection.CreateCommand (); - var columns = certificatesTable.Columns; + var command = Connection.CreateCommand (); + var columns = CertificatesTable.Columns; for (int i = 1; i < columns.Count; i++) { if (i > 1) { @@ -743,8 +774,8 @@ protected override DbCommand GetInsertCommand (X509CrlRecord record) { var statement = new StringBuilder ("INSERT INTO CRLS("); var variables = new StringBuilder ("VALUES("); - var command = connection.CreateCommand (); - var columns = crlsTable.Columns; + var command = Connection.CreateCommand (); + var columns = CrlsTable.Columns; for (int i = 1; i < columns.Count; i++) { if (i > 1) { @@ -782,7 +813,7 @@ protected override DbCommand GetUpdateCommand (X509CertificateRecord record, X50 { var statement = new StringBuilder ("UPDATE CERTIFICATES SET "); var columns = GetColumnNames (fields & ~X509CertificateRecordFields.Id); - var command = connection.CreateCommand (); + var command = Connection.CreateCommand (); for (int i = 0; i < columns.Length; i++) { var value = GetValue (record, columns[i]); @@ -818,8 +849,8 @@ protected override DbCommand GetUpdateCommand (X509CertificateRecord record, X50 protected override DbCommand GetUpdateCommand (X509CrlRecord record) { var statement = new StringBuilder ("UPDATE CRLS SET "); - var command = connection.CreateCommand (); - var columns = crlsTable.Columns; + var command = Connection.CreateCommand (); + var columns = CrlsTable.Columns; for (int i = 1; i < columns.Count; i++) { var value = GetValue (record, columns[i].ColumnName); @@ -857,8 +888,8 @@ protected override DbCommand GetUpdateCommand (X509CrlRecord record) protected override void Dispose (bool disposing) { if (disposing && !disposed) { - if (connection != null) - connection.Dispose (); + if (Connection != null) + Connection.Dispose (); disposed = true; } From 683100c5c033f62dcc833342f82b93ca75c5eb49 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 20 Nov 2020 21:09:41 -0500 Subject: [PATCH 728/741] Don't use ArrayPool for small buffers. --- .../BouncyCastleCertificateExtensions.cs | 23 ++++-------- MimeKit/Cryptography/Ed25519DigestSigner.cs | 35 +++++++------------ MimeKit/MimePart.cs | 12 ++----- MimeKit/Multipart.cs | 12 ++----- MimeKit/ParameterList.cs | 19 ++++------ MimeKit/Tnef/TnefPropertyReader.cs | 21 ++++------- MimeKit/Tnef/TnefReaderStream.cs | 9 ++--- MimeKit/Utils/CharsetUtils.cs | 11 ++---- 8 files changed, 42 insertions(+), 100 deletions(-) diff --git a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs index 0955757918..10d2e31394 100644 --- a/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs +++ b/MimeKit/Cryptography/BouncyCastleCertificateExtensions.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Text; -using System.Buffers; using System.Collections.Generic; using Org.BouncyCastle.Asn1; @@ -191,21 +190,16 @@ public static string GetSubjectEmailAddress (this X509Certificate certificate) return null; } - static string AsHex (this byte[] blob, int length) + internal static string AsHex (this byte[] blob) { - var hex = new StringBuilder (length * 2); + var hex = new StringBuilder (blob.Length * 2); - for (int i = 0; i < length; i++) + for (int i = 0; i < blob.Length; i++) hex.Append (blob[i].ToString ("x2")); return hex.ToString (); } - internal static string AsHex (this byte[] blob) - { - return AsHex (blob, blob.Length); - } - /// /// Gets the fingerprint of the certificate. /// @@ -228,15 +222,10 @@ public static string GetFingerprint (this X509Certificate certificate) sha1.BlockUpdate (encoded, 0, encoded.Length); - var fingerprint = ArrayPool.Shared.Rent (20); - - try { - sha1.DoFinal (fingerprint, 0); + var fingerprint = new byte[20]; + sha1.DoFinal (fingerprint, 0); - return fingerprint.AsHex (20); - } finally { - ArrayPool.Shared.Return (fingerprint); - } + return fingerprint.AsHex (); } /// diff --git a/MimeKit/Cryptography/Ed25519DigestSigner.cs b/MimeKit/Cryptography/Ed25519DigestSigner.cs index 331f0268b2..8bd61b2d9c 100644 --- a/MimeKit/Cryptography/Ed25519DigestSigner.cs +++ b/MimeKit/Cryptography/Ed25519DigestSigner.cs @@ -25,7 +25,6 @@ // using System; -using System.Buffers; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Math.EC.Rfc8032; @@ -75,21 +74,16 @@ public byte[] GenerateSignature () if (privateKey == null) throw new InvalidOperationException ("Ed25519DigestSigner not initialised for signature generation."); - var hashLength = digest.GetDigestSize (); - var hash = ArrayPool.Shared.Rent (hashLength); + var hash = new byte[digest.GetDigestSize ()]; - try { - digest.DoFinal (hash, 0); + digest.DoFinal (hash, 0); - var signature = new byte[Ed25519PrivateKeyParameters.SignatureSize]; - privateKey.Sign (Ed25519.Algorithm.Ed25519, publicKey, null, hash, 0, hashLength, signature, 0); + var signature = new byte[Ed25519PrivateKeyParameters.SignatureSize]; + privateKey.Sign (Ed25519.Algorithm.Ed25519, publicKey, null, hash, 0, hash.Length, signature, 0); - Reset (); + Reset (); - return signature; - } finally { - ArrayPool.Shared.Return (hash); - } + return signature; } public bool VerifySignature (byte[] signature) @@ -100,21 +94,16 @@ public bool VerifySignature (byte[] signature) if (Ed25519.SignatureSize != signature.Length) return false; - var hashLength = digest.GetDigestSize (); - var hash = ArrayPool.Shared.Rent (hashLength); + var hash = new byte[digest.GetDigestSize ()]; - try { - digest.DoFinal (hash, 0); + digest.DoFinal (hash, 0); - var pk = publicKey.GetEncoded (); - var result = Ed25519.Verify (signature, 0, pk, 0, hash, 0, hashLength); + var pk = publicKey.GetEncoded (); + var result = Ed25519.Verify (signature, 0, pk, 0, hash, 0, hash.Length); - Reset (); + Reset (); - return result; - } finally { - ArrayPool.Shared.Return (hash); - } + return result; } public void Reset () diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index b7b53bebba..0bac9e8fcb 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Text; -using System.Buffers; using System.Threading; using System.Threading.Tasks; @@ -465,15 +464,10 @@ public string ComputeContentMd5 () } var base64 = new Base64Encoder (true); - var digest = ArrayPool.Shared.Rent (base64.EstimateOutputLength (checksum.Length)); + var digest = new byte[base64.EstimateOutputLength (checksum.Length)]; + int n = base64.Flush (checksum, 0, checksum.Length, digest); - try { - int n = base64.Flush (checksum, 0, checksum.Length, digest); - - return Encoding.ASCII.GetString (digest, 0, n); - } finally { - ArrayPool.Shared.Return (digest); - } + return Encoding.ASCII.GetString (digest, 0, n); } } diff --git a/MimeKit/Multipart.cs b/MimeKit/Multipart.cs index ae752c4ca2..3a8f7db2fa 100644 --- a/MimeKit/Multipart.cs +++ b/MimeKit/Multipart.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Text; -using System.Buffers; using System.Threading; using System.Collections; using System.Threading.Tasks; @@ -147,19 +146,14 @@ static string GenerateBoundary () { var base64 = new Base64Encoder (true); var digest = new byte[16]; + var buf = new byte[24]; int length; MimeUtils.GetRandomBytes (digest); - var buf = ArrayPool.Shared.Rent (24); + length = base64.Flush (digest, 0, digest.Length, buf); - try { - length = base64.Flush (digest, 0, digest.Length, buf); - - return "=-" + Encoding.ASCII.GetString (buf, 0, length); - } finally { - ArrayPool.Shared.Return (buf); - } + return "=-" + Encoding.ASCII.GetString (buf, 0, length); } /// diff --git a/MimeKit/ParameterList.cs b/MimeKit/ParameterList.cs index 474c9e736c..3178b458bb 100644 --- a/MimeKit/ParameterList.cs +++ b/MimeKit/ParameterList.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Text; -using System.Buffers; using System.Collections; using System.Globalization; using System.Collections.Generic; @@ -916,21 +915,17 @@ static string DecodeRfc2231 (out Encoding encoding, ref Decoder decoder, HexDeco } int length = endIndex - index; - var decoded = ArrayPool.Shared.Rent (hex.EstimateOutputLength (length)); + var decoded = new byte[hex.EstimateOutputLength (length)]; - try { - // hex decode... - length = hex.Decode (text, index, length, decoded); + // hex decode... + length = hex.Decode (text, index, length, decoded); - int outLength = decoder.GetCharCount (decoded, 0, length, flush); - var output = new char[outLength]; + int outLength = decoder.GetCharCount (decoded, 0, length, flush); + var output = new char[outLength]; - outLength = decoder.GetChars (decoded, 0, length, output, 0, flush); + outLength = decoder.GetChars (decoded, 0, length, output, 0, flush); - return new string (output, 0, outLength); - } finally { - ArrayPool.Shared.Return (decoded); - } + return new string (output, 0, outLength); } internal static bool TryParse (ParserOptions options, byte[] text, ref int index, int endIndex, bool throwOnError, out ParameterList paramList) diff --git a/MimeKit/Tnef/TnefPropertyReader.cs b/MimeKit/Tnef/TnefPropertyReader.cs index 82b25d8661..ee7d10a428 100644 --- a/MimeKit/Tnef/TnefPropertyReader.cs +++ b/MimeKit/Tnef/TnefPropertyReader.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Text; -using System.Buffers; namespace MimeKit.Tnef { /// @@ -294,13 +293,9 @@ public TnefReader GetEmbeddedMessageReader () throw new InvalidOperationException (); var stream = GetRawValueReadStream (); - var guid = ArrayPool.Shared.Rent (16); + var guid = new byte[16]; - try { - stream.Read (guid, 0, 16); - } finally { - ArrayPool.Shared.Return (guid); - } + stream.Read (guid, 0, 16); return new TnefReader (stream, reader.MessageCodepage, reader.ComplianceMode); } @@ -792,17 +787,13 @@ public int ReadTextValue (char[] buffer, int offset, int count) if (n <= 0) return 0; - var bytes = ArrayPool.Shared.Rent (n); + var bytes = new byte[n]; - try { - n = reader.ReadAttributeRawValue (bytes, 0, n); + n = reader.ReadAttributeRawValue (bytes, 0, n); - var flush = reader.StreamOffset >= valueEndOffset; + var flush = reader.StreamOffset >= valueEndOffset; - return decoder.GetChars (bytes, 0, n, buffer, offset, flush); - } finally { - ArrayPool.Shared.Return (bytes); - } + return decoder.GetChars (bytes, 0, n, buffer, offset, flush); } bool TryGetPropertyValueLength (out int length) diff --git a/MimeKit/Tnef/TnefReaderStream.cs b/MimeKit/Tnef/TnefReaderStream.cs index 59bde09bc7..006f3c4f3b 100644 --- a/MimeKit/Tnef/TnefReaderStream.cs +++ b/MimeKit/Tnef/TnefReaderStream.cs @@ -26,7 +26,6 @@ using System; using System.IO; -using System.Buffers; namespace MimeKit.Tnef { /// @@ -180,13 +179,9 @@ public override int Read (byte[] buffer, int offset, int count) if (dataLeft == 0 && valueEndOffset > reader.StreamOffset) { int valueLeft = valueEndOffset - reader.StreamOffset; - var buf = ArrayPool.Shared.Rent (valueLeft); + var buf = new byte[valueLeft]; - try { - reader.ReadAttributeRawValue (buf, 0, valueLeft); - } finally { - ArrayPool.Shared.Return (buf); - } + reader.ReadAttributeRawValue (buf, 0, valueLeft); } return nread; diff --git a/MimeKit/Utils/CharsetUtils.cs b/MimeKit/Utils/CharsetUtils.cs index 7b540f57c4..3db6445786 100644 --- a/MimeKit/Utils/CharsetUtils.cs +++ b/MimeKit/Utils/CharsetUtils.cs @@ -27,7 +27,6 @@ using System; using System.IO; using System.Text; -using System.Buffers; using System.Collections.Generic; namespace MimeKit.Utils { @@ -580,15 +579,11 @@ public static bool TryGetBomEncoding (byte[] buffer, int length, out Encoding en public static bool TryGetBomEncoding (Stream stream, out Encoding encoding) { - var bom = ArrayPool.Shared.Rent (3); + var bom = new byte[3]; - try { - int n = stream.Read (bom, 0, 3); + int n = stream.Read (bom, 0, bom.Length); - return TryGetBomEncoding (bom, n, out encoding); - } finally { - ArrayPool.Shared.Return (bom); - } + return TryGetBomEncoding (bom, n, out encoding); } } } From 720d1ec722cf7209d569d811101e79e5d54a1d02 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 20 Nov 2020 21:10:53 -0500 Subject: [PATCH 729/741] Updated Ed25519DigestSigner to use newer BC APIs --- MimeKit/Cryptography/Ed25519DigestSigner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/Cryptography/Ed25519DigestSigner.cs b/MimeKit/Cryptography/Ed25519DigestSigner.cs index 8bd61b2d9c..ec100de3da 100644 --- a/MimeKit/Cryptography/Ed25519DigestSigner.cs +++ b/MimeKit/Cryptography/Ed25519DigestSigner.cs @@ -79,7 +79,7 @@ public byte[] GenerateSignature () digest.DoFinal (hash, 0); var signature = new byte[Ed25519PrivateKeyParameters.SignatureSize]; - privateKey.Sign (Ed25519.Algorithm.Ed25519, publicKey, null, hash, 0, hash.Length, signature, 0); + privateKey.Sign (Ed25519.Algorithm.Ed25519, null, hash, 0, hash.Length, signature, 0); Reset (); From 20b0d061c48ec7796f7b23ed39594da67161f2c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 20 Nov 2020 21:21:41 -0500 Subject: [PATCH 730/741] Bumped version to 2.10.0 --- MimeKit/MimeKit.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 6 ++-- ReleaseNotes.md | 18 +++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 29 +++++++++++++----- nuget/MimeKitLite.nuspec | 30 ++++++++++++------- .../DkimVerifier/DkimVerifier.csproj | 3 +- .../MessageReader.Android.csproj | 3 +- .../MessageReader.iOS.csproj | 3 +- .../MessageReader/MessageReader.csproj | 3 +- 11 files changed, 69 insertions(+), 32 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index a72895be6c..5a7f370c68 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.9.2 + 2.10.0 Jeffrey Stedfast netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index 5cf2d47d0a..f09c82bc5b 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.9.2.0")] -[assembly: AssemblyFileVersion ("2.9.2.0")] -[assembly: AssemblyVersion ("2.9.0.0")] +[assembly: AssemblyInformationalVersion ("2.10.0.0")] +[assembly: AssemblyFileVersion ("2.10.0.0")] +[assembly: AssemblyVersion ("2.10.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 5632330759..d29b9e0d83 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,23 @@ # Release Notes +### MimeKit 2.10.0 (2020-11-20) + +* Added SQL Server support. (issue [#619](https://github.com/jstedfast/MimeKit/issues/619)) +* Fixed a leak in SqlCertificateDatabase when creating the certificates database. +* Bumped BouncyCastle dependency to v1.8.8. (issue [#610](https://github.com/jstedfast/MimeKit/issues/610)) +* Exposed some ArcVerifier and DkimVerifier internal methods. + (issue [#601](https://github.com/jstedfast/MimeKit/issues/601)) +* Improved MimeParser performance. +* Fixed potential leaks in MimeParser when loading MimePart content in exception cases. +* Made use of ArrayPools for various buffers which may help performance. + (issue [#616](https://github.com/jstedfast/MimeKit/issues/616)) +* Fixed MimeUtils.GenerateMessageId() to encode international domain names. +* Fixed MimeUtils.GenerateMessageId() to cache the local hostname. + (issue [#612](https://github.com/jstedfast/MimeKit/issues/612)) +* Modified AttachmentCollection to use a custom implementation of Path.GetFileName() + that allows illegal path characters. +* Only generate a ContentId for the MultipartRelated Root if it is not the first part. + ### MimeKit 2.9.2 (2020-09-12) * Include WindowsSecureMimeContext in the .NET Standard 2.x build. diff --git a/appveyor.yml b/appveyor.yml index 64ae689c8c..9a79ec8304 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.9.2.{build} +version: 2.10.0.{build} os: Visual Studio 2019 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fdf3fd3fdb..2a390336de 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'windows-2019' -name: 2.9.2$(Rev:.r) +name: 2.10.2$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index f83c88a3ce..4679cc139d 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.9.2 + 2.10.0 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,13 +26,17 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Include WindowsSecureMimeContext in the .NET Standard 2.x build. (issue #600) -* Fixed message.Prepare() to never choose the quoted-printable encoding for non-text based MimeParts. (issue #598) -* Added work-around for mailers that don't use a ';' between Content-Type and Content-Disposition parameters. (issue #595) -* Added improved error reporting for ArcVerifier. (issue #591) -* Added another work-around for parsing Authentication-Results headers. (issue #590) -* MimeMessage.ToString() now adds an X-MimeKit-Warning header to the beginning of the output string to make it clear to developers doing this that they are Doing it Wrong(tm). -* Added a TLS-Required HeaderId enum value. +* Added SQL Server support. (issue #619) +* Fixed a leak in SqlCertificateDatabase when creating the certificates database. +* Bumped BouncyCastle dependency to v1.8.8. (issue #610) +* Exposed some ArcVerifier and DkimVerifier internal methods. (issue #601) +* Improved MimeParser performance. +* Fixed potential leaks in MimeParser when loading MimePart content in exception cases. +* Made use of ArrayPools for various buffers which may help performance. (issue #616) +* Fixed MimeUtils.GenerateMessageId() to encode international domain names. +* Fixed MimeUtils.GenerateMessageId() to cache the local hostname. (issue #612) +* Modified AttachmentCollection to use a custom implementation of Path.GetFileName() that allows illegal path characters. +* Only generate a ContentId for the MultipartRelated Root if it is not the first part. .NET Foundation and Contributors en-US @@ -69,21 +73,30 @@ + + + + + + + + + diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 97a41ca68f..44e6f20835 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.9.2 + 2.10.0 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,11 +26,13 @@ An Open Source library for creating and parsing MIME messages. -* Fixed message.Prepare() to never choose the quoted-printable encoding for non-text based MimeParts. (issue #598) -* Added work-around for mailers that don't use a ';' between Content-Type and Content-Disposition parameters. (issue #595) -* Added another work-around for parsing Authentication-Results headers. (issue #590) -* MimeMessage.ToString() now adds an X-MimeKit-Warning header to the beginning of the output string to make it clear to developers doing this that they are Doing it Wrong(tm). -* Added a TLS-Required HeaderId enum value. +* Improved MimeParser performance. +* Fixed potential leaks in MimeParser when loading MimePart content in exception cases. +* Made use of ArrayPools for various buffers which may help performance. (issue #616) +* Fixed MimeUtils.GenerateMessageId() to encode international domain names. +* Fixed MimeUtils.GenerateMessageId() to cache the local hostname. (issue #612) +* Modified AttachmentCollection to use a custom implementation of Path.GetFileName() that allows illegal path characters. +* Only generate a ContentId for the MultipartRelated Root if it is not the first part. .NET Foundation and Contributors en-US @@ -50,10 +52,18 @@ - - - - + + + + + + + + + + + + diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index c5801ecd01..fc59bd7a5c 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -34,9 +34,8 @@ - - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 1da063762c..0a80637a3c 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -63,8 +63,7 @@ - - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 09442dcffa..9c4ec81ff2 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -75,8 +75,7 @@ - - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index 738ee2fe6f..ba620dd748 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -46,8 +46,7 @@ - - + From e212c3b1ce76739c859065e1ecf6e0dd20250865 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 20 Nov 2020 21:27:27 -0500 Subject: [PATCH 731/741] Fixed version in MimeKitLite, d'oh. --- MimeKit/MimeKitLite.csproj | 2 +- nuget/MimeKitLite.nuspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index 06497baea3..7a2c76e80d 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.9.2 + 2.10.0 Jeffrey Stedfast netstandard2.0;net45;net46;net47;net48 true diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index 44e6f20835..dddb8bb321 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -36,7 +36,7 @@ .NET Foundation and Contributors en-US - mime mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard1.3 netstandard1.6 netstandard2.0 + mime mbox mail email parser tnef net45 net46 net47 net48 netstandard netstandard2.0 From 57815f09e0ca6ddabfe391a7159c2ebd02483b9d Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 28 Nov 2020 11:16:05 -0500 Subject: [PATCH 732/741] Treat message/disposition-notification and message/delivery-status the same as text/* when preparing for signing Fixes issue #626 --- MimeKit/MimePart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs index 0bac9e8fcb..a8a9450bda 100644 --- a/MimeKit/MimePart.cs +++ b/MimeKit/MimePart.cs @@ -416,7 +416,7 @@ public override void Accept (MimeVisitor visitor) /// public ContentEncoding GetBestEncoding (EncodingConstraint constraint, int maxLineLength, CancellationToken cancellationToken = default (CancellationToken)) { - if (ContentType.IsMimeType ("text", "*")) { + if (ContentType.IsMimeType ("text", "*") || ContentType.IsMimeType ("message", "*")) { if (Content == null) return ContentEncoding.SevenBit; From 333b7a0b803f6318a39601a482c0abca0709dc68 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 30 Nov 2020 21:50:05 -0500 Subject: [PATCH 733/741] Always set Content-Disposition: inline for LinkedResources Accidentally broke this in 2.10.0 due to swapping part.FileName and part.IsAttachment assignments. Fixes issue #627 --- MimeKit/AttachmentCollection.cs | 14 ++--- UnitTests/AttachmentCollectionTests.cs | 82 +++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/MimeKit/AttachmentCollection.cs b/MimeKit/AttachmentCollection.cs index 1e90513386..70a960b461 100644 --- a/MimeKit/AttachmentCollection.cs +++ b/MimeKit/AttachmentCollection.cs @@ -184,13 +184,8 @@ MimeEntity CreateAttachment (ContentType contentType, string path, Stream stream if (contentType.IsMimeType ("message", "rfc822")) { var message = MimeMessage.Load (stream); - var rfc822 = new MessagePart { Message = message }; - rfc822.ContentDisposition = new ContentDisposition (linked ? ContentDisposition.Inline : ContentDisposition.Attachment); - rfc822.ContentDisposition.FileName = fileName; - rfc822.ContentType.Name = fileName; - - attachment = rfc822; + attachment = new MessagePart { Message = message }; } else { MimePart part; @@ -201,13 +196,14 @@ MimeEntity CreateAttachment (ContentType contentType, string path, Stream stream part = new MimePart (contentType); } - part.IsAttachment = !linked; - part.FileName = fileName; - LoadContent (part, stream); attachment = part; } + attachment.ContentDisposition = new ContentDisposition (linked ? ContentDisposition.Inline : ContentDisposition.Attachment); + attachment.ContentDisposition.FileName = fileName; + attachment.ContentType.Name = fileName; + if (linked) attachment.ContentLocation = new Uri (fileName, UriKind.Relative); diff --git a/UnitTests/AttachmentCollectionTests.cs b/UnitTests/AttachmentCollectionTests.cs index e4c350bfd3..bc1df038fb 100644 --- a/UnitTests/AttachmentCollectionTests.cs +++ b/UnitTests/AttachmentCollectionTests.cs @@ -95,8 +95,36 @@ public void TestAddFileName () var attachments = new AttachmentCollection (); MimePart attachment; - attachment =(MimePart) attachments.Add (fileName); + attachment = (MimePart) attachments.Add (fileName); + Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); + Assert.AreEqual ("girl.jpg", attachment.FileName); + Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); + Assert.AreEqual (0, attachments.Count); + attachments.Clear (); + } + + [Test] + public void TestAddInlineFileName () + { + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "images", "girl.jpg"); + var attachments = new AttachmentCollection (true); + MimePart attachment; + + attachment = (MimePart) attachments.Add (fileName); Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("inline", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); Assert.AreEqual ("girl.jpg", attachment.FileName); Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -118,6 +146,10 @@ public void TestAddFileNameContentType () attachment = (MimePart) attachments.Add (fileName, contentType); Assert.AreEqual (contentType.MimeType, attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); Assert.AreEqual ("girl.jpg", attachment.FileName); Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -138,6 +170,10 @@ public void TestAddData () attachment = (MimePart) attachments.Add (fileName, File.ReadAllBytes (fileName)); Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); Assert.AreEqual ("girl.jpg", attachment.FileName); Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -159,6 +195,10 @@ public void TestAddDataContentType () attachment = (MimePart) attachments.Add (fileName, File.ReadAllBytes (fileName), contentType); Assert.AreEqual (contentType.MimeType, attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); Assert.AreEqual ("girl.jpg", attachment.FileName); Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -181,6 +221,10 @@ public void TestAddStream () attachment = (MimePart) attachments.Add (fileName, stream); Assert.AreEqual ("image/jpeg", attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); Assert.AreEqual ("girl.jpg", attachment.FileName); Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -204,6 +248,10 @@ public void TestAddStreamContentType () attachment = (MimePart) attachments.Add (fileName, stream, contentType); Assert.AreEqual (contentType.MimeType, attachment.ContentType.MimeType); + Assert.AreEqual ("girl.jpg", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("girl.jpg", attachment.ContentDisposition.FileName); Assert.AreEqual ("girl.jpg", attachment.FileName); Assert.AreEqual (ContentEncoding.Base64, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -224,6 +272,10 @@ public void TestAddTextFileName () attachment = (MimePart) attachments.Add (fileName); Assert.AreEqual ("text/plain", attachment.ContentType.MimeType); + Assert.AreEqual ("lorem-ipsum.txt", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("lorem-ipsum.txt", attachment.ContentDisposition.FileName); Assert.AreEqual ("lorem-ipsum.txt", attachment.FileName); Assert.AreEqual (ContentEncoding.SevenBit, attachment.ContentTransferEncoding); Assert.AreEqual (1, attachments.Count); @@ -246,6 +298,34 @@ public void TestAddEmailMessage () attachment = attachments.Add ("message.eml", stream); Assert.AreEqual ("message/rfc822", attachment.ContentType.MimeType); + Assert.AreEqual ("message.eml", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("attachment", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("message.eml", attachment.ContentDisposition.FileName); + Assert.AreEqual (1, attachments.Count); + + Assert.IsTrue (attachments.Contains (attachment), "Contains"); + Assert.AreEqual (0, attachments.IndexOf (attachment), "IndexOf"); + Assert.IsTrue (attachments.Remove (attachment), "Remove"); + Assert.AreEqual (0, attachments.Count); + attachments.Clear (); + } + + [Test] + public void TestAddInlineEmailMessage () + { + var fileName = Path.Combine (TestHelper.ProjectDir, "TestData", "messages", "body.1.txt"); + var attachments = new AttachmentCollection (true); + MimeEntity attachment; + + using (var stream = File.OpenRead (fileName)) + attachment = attachments.Add ("message.eml", stream); + + Assert.AreEqual ("message/rfc822", attachment.ContentType.MimeType); + Assert.AreEqual ("message.eml", attachment.ContentType.Name); + Assert.NotNull (attachment.ContentDisposition); + Assert.AreEqual ("inline", attachment.ContentDisposition.Disposition); + Assert.AreEqual ("message.eml", attachment.ContentDisposition.FileName); Assert.AreEqual (1, attachments.Count); Assert.IsTrue (attachments.Contains (attachment), "Contains"); From 6268d4c39feac40adbc2300c26b97abffcfa69a4 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 3 Dec 2020 11:40:41 -0500 Subject: [PATCH 734/741] Fix (package) references to System.Data.DataSetExtensions Fixes issue #629 --- MimeKit/MimeKit.csproj | 6 +++++- nuget/MimeKit.nuspec | 16 ++++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 5a7f370c68..1bce047d45 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -58,8 +58,13 @@ + + + + + @@ -67,7 +72,6 @@ - diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 4679cc139d..4629c6a454 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -45,50 +45,42 @@ + + + + - - - - - - - - - - - - From ec9cdd24263178c515797c0222fc89f740ada7b0 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 4 Dec 2020 10:01:15 -0500 Subject: [PATCH 735/741] Added a netstandard2.1-specific build target A netstandard2.1-specific build is needed so that it can not reference System.Data.DataSetExtensions. Fixes issue #629 --- MimeKit/Cryptography/SqliteCertificateDatabase.cs | 6 +++--- MimeKit/MimeKit.csproj | 2 +- nuget/MimeKit.nuspec | 10 ++++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/MimeKit/Cryptography/SqliteCertificateDatabase.cs b/MimeKit/Cryptography/SqliteCertificateDatabase.cs index c37e68f0a0..50f430da43 100644 --- a/MimeKit/Cryptography/SqliteCertificateDatabase.cs +++ b/MimeKit/Cryptography/SqliteCertificateDatabase.cs @@ -99,11 +99,11 @@ static SqliteCertificateDatabase () #if __MOBILE__ IsAvailable = true; #else // !__MOBILE__ -#if NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP3_0 +#if NETFRAMEWORK || NETSTANDARD2_0 || NETSTANDARD2_1 || NETCOREAPP3_0 var platform = Environment.OSVersion.Platform; #endif -#if NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0 || NETCOREAPP3_0 +#if NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0 || NETSTANDARD2_1 || NETCOREAPP3_0 if ((sqliteAssembly = SQLiteAssembly.Load ("Microsoft.Data.Sqlite")) != null) { // Make sure that the runtime can load the native sqlite library if (VerifySQLiteAssemblyIsUsable ()) { @@ -126,7 +126,7 @@ static SqliteCertificateDatabase () } #endif -#if NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP3_0 +#if NETFRAMEWORK || NETSTANDARD2_0 || NETSTANDARD2_1 || NETCOREAPP3_0 if ((sqliteAssembly = SQLiteAssembly.Load ("System.Data.SQLite")) != null) { // Make sure that the runtime can load the native sqlite3 library if (VerifySQLiteAssemblyIsUsable ()) { diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 1bce047d45..66cecd2af0 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -10,7 +10,7 @@ false MimeKit MimeKit - mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;net46;net47;net48;netstandard;netstandard1.3;netstandard1.6;netstandard2.0 + mime;encryption;dkim;security;smime;s/mime;openpgp;pgp;mbox;email;parser;tnef;net45;net46;net47;net48;netstandard;netstandard1.3;netstandard1.6;netstandard2.0;netstandard2.1 https://github.com/jstedfast/MimeKit https://github.com/jstedfast/MimeKit/blob/master/License.md false diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 4629c6a454..ea28a1d782 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -92,12 +92,22 @@ + + + + + + + + + + From 2acfc0d1c43b7c6227789171d1ff21fdf616fa2b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 4 Dec 2020 10:12:17 -0500 Subject: [PATCH 736/741] Oops, need to add netstandard2.1 to TargetFrameworks --- MimeKit/MimeKit.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index 66cecd2af0..c69e3b850f 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -5,7 +5,7 @@ MimeKit 2.10.0 Jeffrey Stedfast - netstandard2.0;net45;net46;net47;net48 + netstandard2.0;netstandard2.1;net45;net46;net47;net48 true false MimeKit From 841c6024afb65dac2086f4979e1ded6ffb5560dc Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 5 Dec 2020 10:22:48 -0500 Subject: [PATCH 737/741] Oops, versions should have been 2.10.0.x --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2a390336de..bd19459a90 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'windows-2019' -name: 2.10.2$(Rev:.r) +name: 2.10.0$(Rev:.r) variables: solution: 'MimeKit.sln' From 7aa5fad9bf9d0a2e0b9e26652581b2be61a912d2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 5 Dec 2020 10:39:07 -0500 Subject: [PATCH 738/741] Bumped version to 2.10.1 --- MimeKit/MimeKit.csproj | 2 +- MimeKit/MimeKitLite.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- ReleaseNotes.md | 10 ++++++++++ appveyor.yml | 2 +- azure-pipelines.yml | 2 +- nuget/MimeKit.nuspec | 16 ++++------------ nuget/MimeKitLite.nuspec | 11 +++-------- .../DkimVerifier/DkimVerifier.csproj | 2 +- .../MessageReader.Android.csproj | 2 +- .../MessageReader.iOS/MessageReader.iOS.csproj | 2 +- .../MessageReader/MessageReader.csproj | 2 +- 12 files changed, 27 insertions(+), 30 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index c69e3b850f..b3fcc91dc8 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.10.0 + 2.10.1 Jeffrey Stedfast netstandard2.0;netstandard2.1;net45;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index 7a2c76e80d..a9de150cf0 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.10.0 + 2.10.1 Jeffrey Stedfast netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index f09c82bc5b..68dd39e061 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.10.0.0")] -[assembly: AssemblyFileVersion ("2.10.0.0")] +[assembly: AssemblyInformationalVersion ("2.10.1.0")] +[assembly: AssemblyFileVersion ("2.10.1.0")] [assembly: AssemblyVersion ("2.10.0.0")] diff --git a/ReleaseNotes.md b/ReleaseNotes.md index d29b9e0d83..044403a256 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,15 @@ # Release Notes +### MimeKit 2.10.1 (2020-12-05) + +* Treat message/disposition-notification and message/delivery-status the same as text/* + when preparing for signing. (issue [#626](https://github.com/jstedfast/MimeKit/issues/626)) +* Always set Content-Disposition: inline for BodyBuilder.LinkedResources. This fixes a + regression introduced in 2.10.0. + (issue [#627](https://github.com/jstedfast/MimeKit/issues/627)) +* Fixed NuGet package references to System.Data.DataSetExtensions for netstandard2.1 and + net4x. + ### MimeKit 2.10.0 (2020-11-20) * Added SQL Server support. (issue [#619](https://github.com/jstedfast/MimeKit/issues/619)) diff --git a/appveyor.yml b/appveyor.yml index 9a79ec8304..dcec1f4e19 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.10.0.{build} +version: 2.10.1.{build} os: Visual Studio 2019 configuration: Debug platform: Any CPU diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bd19459a90..49b1fa10c3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ trigger: pool: vmImage: 'windows-2019' -name: 2.10.0$(Rev:.r) +name: 2.10.1$(Rev:.r) variables: solution: 'MimeKit.sln' diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index ea28a1d782..14bd9c8258 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.10.0 + 2.10.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast @@ -26,17 +26,9 @@ An Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. -* Added SQL Server support. (issue #619) -* Fixed a leak in SqlCertificateDatabase when creating the certificates database. -* Bumped BouncyCastle dependency to v1.8.8. (issue #610) -* Exposed some ArcVerifier and DkimVerifier internal methods. (issue #601) -* Improved MimeParser performance. -* Fixed potential leaks in MimeParser when loading MimePart content in exception cases. -* Made use of ArrayPools for various buffers which may help performance. (issue #616) -* Fixed MimeUtils.GenerateMessageId() to encode international domain names. -* Fixed MimeUtils.GenerateMessageId() to cache the local hostname. (issue #612) -* Modified AttachmentCollection to use a custom implementation of Path.GetFileName() that allows illegal path characters. -* Only generate a ContentId for the MultipartRelated Root if it is not the first part. +* Treat message/disposition-notification and message/delivery-status the same as text/* when preparing for signing. (issue #626) +* Always set Content-Disposition: inline for BodyBuilder.LinkedResources. This fixes a regression introduced in 2.10.0. (issue #627) +* Fixed NuGet package references to System.Data.DataSetExtensions for netstandard2.1 and net4x. .NET Foundation and Contributors en-US diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index dddb8bb321..f6568a515b 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.10.0 + 2.10.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast @@ -26,13 +26,8 @@ An Open Source library for creating and parsing MIME messages. -* Improved MimeParser performance. -* Fixed potential leaks in MimeParser when loading MimePart content in exception cases. -* Made use of ArrayPools for various buffers which may help performance. (issue #616) -* Fixed MimeUtils.GenerateMessageId() to encode international domain names. -* Fixed MimeUtils.GenerateMessageId() to cache the local hostname. (issue #612) -* Modified AttachmentCollection to use a custom implementation of Path.GetFileName() that allows illegal path characters. -* Only generate a ContentId for the MultipartRelated Root if it is not the first part. +* Treat message/disposition-notification and message/delivery-status the same as text/* when preparing for signing. (issue #626) +* Always set Content-Disposition: inline for BodyBuilder.LinkedResources. This fixes a regression introduced in 2.10.0. (issue #627) .NET Foundation and Contributors en-US diff --git a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj index fc59bd7a5c..ae732ff000 100644 --- a/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj +++ b/samples/DkimVerifier/DkimVerifier/DkimVerifier.csproj @@ -35,7 +35,7 @@ - + diff --git a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj index 0a80637a3c..e81e6499c8 100644 --- a/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj +++ b/samples/MessageReader.Android/MessageReader.Android/MessageReader.Android.csproj @@ -63,7 +63,7 @@ - + diff --git a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj index 9c4ec81ff2..7d54d37ff3 100644 --- a/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj +++ b/samples/MessageReader.iOS/MessageReader.iOS/MessageReader.iOS.csproj @@ -75,7 +75,7 @@ - + diff --git a/samples/MessageReader/MessageReader/MessageReader.csproj b/samples/MessageReader/MessageReader/MessageReader.csproj index ba620dd748..f387472050 100644 --- a/samples/MessageReader/MessageReader/MessageReader.csproj +++ b/samples/MessageReader/MessageReader/MessageReader.csproj @@ -46,7 +46,7 @@ - + From be92e89f62840bb118947261494e6a9a1a5637b5 Mon Sep 17 00:00:00 2001 From: aTakayukiMorita <> Date: Mon, 1 Mar 2021 15:55:42 +0900 Subject: [PATCH 739/741] fix build problem --- MimeKit.sln | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/MimeKit.sln b/MimeKit.sln index 55697cf61d..ea49bc916b 100644 --- a/MimeKit.sln +++ b/MimeKit.sln @@ -8,17 +8,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .editorconfig = .editorconfig EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MimeKit", "MimeKit\MimeKit.csproj", "{E8667DCE-A5BB-4D30-9815-FC8959E447F5}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Data.Sqlite", "Mono.Data.Sqlite\Mono.Data.Sqlite.csproj", "{F26434C1-BA3D-41FB-B560-C009CB72B1B6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests", "UnitTests\UnitTests.csproj", "{88EC8D73-8099-4DD6-B78B-C21FCED97EA1}" ProjectSection(ProjectDependencies) = postProject {F26434C1-BA3D-41FB-B560-C009CB72B1B6} = {F26434C1-BA3D-41FB-B560-C009CB72B1B6} - {E8667DCE-A5BB-4D30-9815-FC8959E447F5} = {E8667DCE-A5BB-4D30-9815-FC8959E447F5} + {559F9C27-70F6-44C5-8F55-7292DBBC8F87} = {559F9C27-70F6-44C5-8F55-7292DBBC8F87} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Benchmarks\Benchmarks.csproj", "{AA778CE1-53AF-4E28-8282-56EAB3A444FC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MimeKit", "MimeKit\MimeKit.csproj", "{559F9C27-70F6-44C5-8F55-7292DBBC8F87}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Benchmarks\Benchmarks.csproj", "{1D6B883A-ABC9-4AC2-9E05-963D1D3F40EB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -26,10 +26,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E8667DCE-A5BB-4D30-9815-FC8959E447F5}.Release|Any CPU.Build.0 = Release|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU {F26434C1-BA3D-41FB-B560-C009CB72B1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -38,10 +34,14 @@ Global {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Debug|Any CPU.Build.0 = Debug|Any CPU {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {88EC8D73-8099-4DD6-B78B-C21FCED97EA1}.Release|Any CPU.Build.0 = Release|Any CPU - {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA778CE1-53AF-4E28-8282-56EAB3A444FC}.Release|Any CPU.Build.0 = Release|Any CPU + {559F9C27-70F6-44C5-8F55-7292DBBC8F87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {559F9C27-70F6-44C5-8F55-7292DBBC8F87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {559F9C27-70F6-44C5-8F55-7292DBBC8F87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {559F9C27-70F6-44C5-8F55-7292DBBC8F87}.Release|Any CPU.Build.0 = Release|Any CPU + {1D6B883A-ABC9-4AC2-9E05-963D1D3F40EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D6B883A-ABC9-4AC2-9E05-963D1D3F40EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D6B883A-ABC9-4AC2-9E05-963D1D3F40EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D6B883A-ABC9-4AC2-9E05-963D1D3F40EB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From e6f8c076c5cb98bcd0e84ba5a73c3d5014b7863d Mon Sep 17 00:00:00 2001 From: aTakayukiMorita <> Date: Mon, 1 Mar 2021 19:37:41 +0900 Subject: [PATCH 740/741] Fix test problem. It does not execute parameterized test. --- UnitTests/InternetAddressTests.cs | 4 ++-- UnitTests/MailboxAddressTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/UnitTests/InternetAddressTests.cs b/UnitTests/InternetAddressTests.cs index f7d5fa2ecb..11cec0048a 100644 --- a/UnitTests/InternetAddressTests.cs +++ b/UnitTests/InternetAddressTests.cs @@ -533,7 +533,7 @@ public void TestParseMailboxWithSquareBracketsInDisplayName () } #region TestLegacyEmailAddress - TestCaseData[] LegacyAddressNotCompliantWithRFC () + static TestCaseData[] LegacyAddressNotCompliantWithRFC() { var addressList = new TestCaseData[] { @@ -652,7 +652,7 @@ TestCaseData[] LegacyAddressNotCompliantWithRFC () return addressList; } - [TestCaseSource ("LegacyAddressNotCompliantWithRFC")] + [TestCaseSource (nameof(LegacyAddressNotCompliantWithRFC))] public void TestLegacyEmailAddress (string address) { string text = address; diff --git a/UnitTests/MailboxAddressTests.cs b/UnitTests/MailboxAddressTests.cs index a37594085a..b3ecda72f4 100644 --- a/UnitTests/MailboxAddressTests.cs +++ b/UnitTests/MailboxAddressTests.cs @@ -844,7 +844,7 @@ public void TestParseAddrspecWitheroWidthSpace () } #region TestLegacyEmailAddress - TestCaseData[] LegacyAddressNotCompliantWithRFC () + static TestCaseData[] LegacyAddressNotCompliantWithRFC () { var addressList = new TestCaseData[] { @@ -963,7 +963,7 @@ TestCaseData[] LegacyAddressNotCompliantWithRFC () return addressList; } - [TestCaseSource ("LegacyAddressNotCompliantWithRFC")] + [TestCaseSource (nameof(LegacyAddressNotCompliantWithRFC))] public void TestLegacyEmailAddress (string address) { string text = address; From 9986c7f43b8e0dae1c441f7f178bcec8616cbdac Mon Sep 17 00:00:00 2001 From: aTakayukiMorita <> Date: Mon, 1 Mar 2021 19:39:29 +0900 Subject: [PATCH 741/741] Bumped version to 2.10.1.1 --- MimeKit/MimeKit.csproj | 2 +- MimeKit/MimeKitLite.csproj | 2 +- MimeKit/Properties/AssemblyInfo.cs | 4 ++-- appveyor.yml | 2 +- nuget/MimeKit.nuspec | 2 +- nuget/MimeKitLite.nuspec | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MimeKit/MimeKit.csproj b/MimeKit/MimeKit.csproj index c52fac586a..0c34d35390 100644 --- a/MimeKit/MimeKit.csproj +++ b/MimeKit/MimeKit.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit - 2.10.1 + 2.10.1.1 Jeffrey Stedfast netstandard2.0;netstandard2.1;net45;net46;net47;net48 true diff --git a/MimeKit/MimeKitLite.csproj b/MimeKit/MimeKitLite.csproj index ffd50937f5..a812b126c2 100644 --- a/MimeKit/MimeKitLite.csproj +++ b/MimeKit/MimeKitLite.csproj @@ -3,7 +3,7 @@ An Open Source library for creating and parsing MIME, S/MIME, PGP messages on desktop and mobile platforms. MimeKit Lite - 2.10.1 + 2.10.1.1 Jeffrey Stedfast netstandard2.0;net45;net46;net47;net48 true diff --git a/MimeKit/Properties/AssemblyInfo.cs b/MimeKit/Properties/AssemblyInfo.cs index dd7ee79af7..873dfdc746 100644 --- a/MimeKit/Properties/AssemblyInfo.cs +++ b/MimeKit/Properties/AssemblyInfo.cs @@ -78,6 +78,6 @@ // // If there have only been bug fixes, bump the Micro Version and/or the Build Number // in the AssemblyFileVersion attribute. -[assembly: AssemblyInformationalVersion ("2.10.1.0")] -[assembly: AssemblyFileVersion ("2.10.1.0")] +[assembly: AssemblyInformationalVersion ("2.10.1.1.0")] +[assembly: AssemblyFileVersion ("2.10.1.1.0")] [assembly: AssemblyVersion ("2.10.0.0")] diff --git a/appveyor.yml b/appveyor.yml index babb8b8e5d..0286bafcbf 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.10.1.{build} +version: 2.10.1.1.{build} os: Visual Studio 2019 configuration: Debug platform: Any CPU diff --git a/nuget/MimeKit.nuspec b/nuget/MimeKit.nuspec index 14bd9c8258..c54adfb3e2 100644 --- a/nuget/MimeKit.nuspec +++ b/nuget/MimeKit.nuspec @@ -2,7 +2,7 @@ MimeKit - 2.10.1 + 2.10.1.1 MimeKit Jeffrey Stedfast Jeffrey Stedfast diff --git a/nuget/MimeKitLite.nuspec b/nuget/MimeKitLite.nuspec index f6568a515b..9e070c9c57 100644 --- a/nuget/MimeKitLite.nuspec +++ b/nuget/MimeKitLite.nuspec @@ -2,7 +2,7 @@ MimeKitLite - 2.10.1 + 2.10.1.1 MimeKit Lite Jeffrey Stedfast Jeffrey Stedfast